memento-mcp-server 1.12.0 → 1.13.0-a

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 (119) hide show
  1. package/dist/algorithms/forgetting-algorithm.d.ts +21 -13
  2. package/dist/algorithms/forgetting-algorithm.d.ts.map +1 -1
  3. package/dist/algorithms/forgetting-algorithm.js +32 -24
  4. package/dist/algorithms/forgetting-algorithm.js.map +1 -1
  5. package/dist/algorithms/hybrid-search-engine.d.ts +11 -9
  6. package/dist/algorithms/hybrid-search-engine.d.ts.map +1 -1
  7. package/dist/algorithms/hybrid-search-engine.js +77 -75
  8. package/dist/algorithms/hybrid-search-engine.js.map +1 -1
  9. package/dist/algorithms/search-engine.d.ts +33 -11
  10. package/dist/algorithms/search-engine.d.ts.map +1 -1
  11. package/dist/algorithms/search-engine.js +157 -62
  12. package/dist/algorithms/search-engine.js.map +1 -1
  13. package/dist/algorithms/search-ranking.d.ts +57 -50
  14. package/dist/algorithms/search-ranking.d.ts.map +1 -1
  15. package/dist/algorithms/search-ranking.js +91 -84
  16. package/dist/algorithms/search-ranking.js.map +1 -1
  17. package/dist/algorithms/spaced-repetition.d.ts +18 -13
  18. package/dist/algorithms/spaced-repetition.d.ts.map +1 -1
  19. package/dist/algorithms/spaced-repetition.js +28 -23
  20. package/dist/algorithms/spaced-repetition.js.map +1 -1
  21. package/dist/algorithms/vector-search-engine-migration.d.ts +8 -6
  22. package/dist/algorithms/vector-search-engine-migration.d.ts.map +1 -1
  23. package/dist/algorithms/vector-search-engine-migration.js +13 -11
  24. package/dist/algorithms/vector-search-engine-migration.js.map +1 -1
  25. package/dist/algorithms/vector-search-engine-refactored.d.ts +7 -7
  26. package/dist/algorithms/vector-search-engine-refactored.d.ts.map +1 -1
  27. package/dist/algorithms/vector-search-engine-refactored.js +7 -7
  28. package/dist/algorithms/vector-search-engine-refactored.js.map +1 -1
  29. package/dist/algorithms/vector-search-engine.d.ts +25 -20
  30. package/dist/algorithms/vector-search-engine.d.ts.map +1 -1
  31. package/dist/algorithms/vector-search-engine.js +47 -43
  32. package/dist/algorithms/vector-search-engine.js.map +1 -1
  33. package/dist/config/index.d.ts.map +1 -1
  34. package/dist/config/index.js +4 -1
  35. package/dist/config/index.js.map +1 -1
  36. package/dist/database/init.d.ts.map +1 -1
  37. package/dist/database/init.js +20 -0
  38. package/dist/database/init.js.map +1 -1
  39. package/dist/database/migration/migrations/006-fts5-reflection-notes-migration-status.sql +30 -0
  40. package/dist/database/migration/migrations/006-fts5-reflection-notes.d.ts +113 -0
  41. package/dist/database/migration/migrations/006-fts5-reflection-notes.d.ts.map +1 -0
  42. package/dist/database/migration/migrations/006-fts5-reflection-notes.js +435 -0
  43. package/dist/database/migration/migrations/006-fts5-reflection-notes.js.map +1 -0
  44. package/dist/database/migration/migrations/006-fts5-reflection-notes.sql +26 -0
  45. package/dist/database/schema.sql +11 -9
  46. package/dist/server/bootstrap.d.ts +4 -0
  47. package/dist/server/bootstrap.d.ts.map +1 -1
  48. package/dist/server/bootstrap.js +11 -1
  49. package/dist/server/bootstrap.js.map +1 -1
  50. package/dist/server/context.d.ts.map +1 -1
  51. package/dist/server/context.js +3 -1
  52. package/dist/server/context.js.map +1 -1
  53. package/dist/server/http-server.d.ts.map +1 -1
  54. package/dist/server/http-server.js +2 -1
  55. package/dist/server/http-server.js.map +1 -1
  56. package/dist/server/index.js +3 -1
  57. package/dist/server/index.js.map +1 -1
  58. package/dist/services/async-optimizer.d.ts +2 -1
  59. package/dist/services/async-optimizer.d.ts.map +1 -1
  60. package/dist/services/async-optimizer.js +28 -1
  61. package/dist/services/async-optimizer.js.map +1 -1
  62. package/dist/services/batch-scheduler.d.ts +5 -1
  63. package/dist/services/batch-scheduler.d.ts.map +1 -1
  64. package/dist/services/batch-scheduler.js +13 -1
  65. package/dist/services/batch-scheduler.js.map +1 -1
  66. package/dist/services/cache-service.js +1 -1
  67. package/dist/services/cache-service.js.map +1 -1
  68. package/dist/services/failure-detector.d.ts +120 -0
  69. package/dist/services/failure-detector.d.ts.map +1 -0
  70. package/dist/services/failure-detector.js +370 -0
  71. package/dist/services/failure-detector.js.map +1 -0
  72. package/dist/services/llm-based-relation-extractor.js +1 -1
  73. package/dist/services/llm-based-relation-extractor.js.map +1 -1
  74. package/dist/services/reflexion-worker.d.ts +170 -0
  75. package/dist/services/reflexion-worker.d.ts.map +1 -0
  76. package/dist/services/reflexion-worker.js +636 -0
  77. package/dist/services/reflexion-worker.js.map +1 -0
  78. package/dist/services/relation-graph.d.ts +2 -2
  79. package/dist/services/relation-graph.js +3 -3
  80. package/dist/services/relation-graph.js.map +1 -1
  81. package/dist/tools/base-tool.d.ts +5 -0
  82. package/dist/tools/base-tool.d.ts.map +1 -1
  83. package/dist/tools/base-tool.js +39 -0
  84. package/dist/tools/base-tool.js.map +1 -1
  85. package/dist/tools/recall-tool.d.ts.map +1 -1
  86. package/dist/tools/recall-tool.js +36 -2
  87. package/dist/tools/recall-tool.js.map +1 -1
  88. package/dist/tools/remember-tool.d.ts +24 -0
  89. package/dist/tools/remember-tool.d.ts.map +1 -1
  90. package/dist/tools/remember-tool.js +445 -273
  91. package/dist/tools/remember-tool.js.map +1 -1
  92. package/dist/tools/types.d.ts +5 -1
  93. package/dist/tools/types.d.ts.map +1 -1
  94. package/dist/tools/types.js +1 -1
  95. package/dist/tools/types.js.map +1 -1
  96. package/dist/types/index.d.ts +2 -0
  97. package/dist/types/index.d.ts.map +1 -1
  98. package/dist/types/index.js.map +1 -1
  99. package/dist/utils/database.d.ts.map +1 -1
  100. package/dist/utils/database.js +34 -10
  101. package/dist/utils/database.js.map +1 -1
  102. package/dist/utils/fts5-migration-status.d.ts +72 -0
  103. package/dist/utils/fts5-migration-status.d.ts.map +1 -0
  104. package/dist/utils/fts5-migration-status.js +304 -0
  105. package/dist/utils/fts5-migration-status.js.map +1 -0
  106. package/dist/utils/reflection-notes-merge.d.ts +58 -0
  107. package/dist/utils/reflection-notes-merge.d.ts.map +1 -0
  108. package/dist/utils/reflection-notes-merge.js +227 -0
  109. package/dist/utils/reflection-notes-merge.js.map +1 -0
  110. package/dist/utils/reflection-notes-normalize.d.ts +43 -0
  111. package/dist/utils/reflection-notes-normalize.d.ts.map +1 -0
  112. package/dist/utils/reflection-notes-normalize.js +164 -0
  113. package/dist/utils/reflection-notes-normalize.js.map +1 -0
  114. package/dist/utils/reflection-notes-schema.d.ts +84 -0
  115. package/dist/utils/reflection-notes-schema.d.ts.map +1 -0
  116. package/dist/utils/reflection-notes-schema.js +215 -0
  117. package/dist/utils/reflection-notes-schema.js.map +1 -0
  118. package/package.json +3 -1
  119. package/src/database/schema.sql +11 -9
@@ -1,6 +1,6 @@
1
1
  /**
2
- * 개선된 검색 엔진 구현
3
- * FTS5 + 랭킹 알고리즘 + 필터링 결합
2
+ * FTS5와 랭킹 알고리즘을 결합하여 검색 정확도와 성능을 동시에 확보합니다.
3
+ * 전문 검색 인덱스(FTS5)로 빠른 검색을 수행하고, 다차원 랭킹 알고리즘으로 관련성 높은 결과를 제공합니다.
4
4
  */
5
5
  import type { MemorySearchFilters, MemorySearchResult } from '../types/index.js';
6
6
  export interface SearchQuery {
@@ -12,7 +12,8 @@ export declare class SearchEngine {
12
12
  private ranking;
13
13
  constructor();
14
14
  /**
15
- * 개선된 검색 구현 - FTS5 최적화
15
+ * 전문 검색 성능을 향상시키고 관련성 높은 결과를 빠르게 반환합니다.
16
+ * FTS5 인덱스를 활용하여 대용량 데이터에서도 빠른 검색이 가능하도록 최적화합니다.
16
17
  */
17
18
  search(db: any, query: SearchQuery): Promise<{
18
19
  items: MemorySearchResult[];
@@ -20,32 +21,53 @@ export declare class SearchEngine {
20
21
  query_time: number;
21
22
  }>;
22
23
  /**
23
- * FTS5 검색 쿼리 구성
24
- * 아키텍처 문서에 따른 쿼리 전처리 구현
24
+ * FTS5 특수 문법과 보안 요구사항을 준수하여 안전하고 효율적인 검색 쿼리를 생성합니다.
25
+ * 아키텍처 문서의 전처리 규칙을 적용하여 검색 정확도를 향상시킵니다.
25
26
  */
26
27
  private buildFTSQuery;
27
28
  /**
28
- * 쿼리 전처리 - 아키텍처 문서의 전처리 과정 구현
29
+ * 검색 품질을 향상시키기 위해 노이즈를 제거하고 핵심 키워드만 추출합니다.
30
+ * 아키텍처 문서의 전처리 규칙을 준수하여 일관된 검색 결과를 제공합니다.
29
31
  */
30
32
  private preprocessQuery;
31
33
  /**
32
- * FTS5 안전 쿼리 생성
34
+ * FTS5 특수문자 처리 규칙을 준수하여 쿼리 오류를 방지하고 안전한 검색을 보장합니다.
33
35
  */
34
36
  private makeFTSSafe;
35
37
  /**
36
- * 데이터베이스 쿼리 실행
38
+ * 준비된 SQL 쿼리를 실행하여 실제 검색 결과를 데이터베이스에서 획득합니다.
37
39
  */
38
40
  private executeQuery;
39
41
  /**
40
- * 랭킹 알고리즘 적용 - FTS5 랭킹 활용
42
+ * FTS5 랭킹과 다차원 점수를 결합하여 사용자에게 가장 관련성 높은 결과를 우선 제공합니다.
43
+ * 관련성, 최근성, 중요도, 사용성 등을 종합적으로 고려하여 검색 품질을 향상시킵니다.
41
44
  */
42
45
  private applyRanking;
43
46
  /**
44
- * FTS5 사용 가능 여부 확인
47
+ * FTS5 인덱스의 존재와 동작 여부를 확인하여 안전한 검색 전략을 선택합니다.
48
+ * 인덱스가 없거나 비정상인 경우 대체 검색 방식을 사용하여 기능 안정성을 보장합니다.
45
49
  */
46
50
  private checkFTS5Availability;
47
51
  /**
48
- * 검색 이유 생성
52
+ * reflection_notes 컬럼이 FTS5에서 사용 가능한지 확인
53
+ * 마이그레이션 상태를 확인하여 Fallback이 필요한지 판단합니다.
54
+ *
55
+ * @param db - 데이터베이스 인스턴스
56
+ * @returns reflection_notes 컬럼 사용 가능 여부
57
+ */
58
+ private checkReflectionNotesAvailability;
59
+ /**
60
+ * reflection_notes 검색 쿼리 빌더
61
+ * 마이그레이션 상태에 따라 FTS5 MATCH 쿼리 또는 LIKE 쿼리를 선택합니다.
62
+ *
63
+ * @param db - 데이터베이스 인스턴스
64
+ * @param searchQuery - 검색 쿼리
65
+ * @returns reflection_notes 검색 조건 (SQL WHERE 절 조건)
66
+ */
67
+ private buildReflectionNotesSearchCondition;
68
+ /**
69
+ * 사용자에게 검색 결과가 선택된 이유를 명확히 전달하여 검색 결과의 신뢰성을 높입니다.
70
+ * 관련성, 최근성, 중요도 등 다양한 요소를 종합하여 투명한 검색 과정을 제공합니다.
49
71
  */
50
72
  private generateRecallReason;
51
73
  }
@@ -1 +1 @@
1
- {"version":3,"file":"search-engine.d.ts","sourceRoot":"","sources":["../../src/algorithms/search-engine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAKjF,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAC1C,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAGD,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAgB;;IAM/B;;OAEG;IACG,MAAM,CACV,EAAE,EAAE,GAAG,EACP,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC;QAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IA4IpF;;;OAGG;IACH,OAAO,CAAC,aAAa;IAwBrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAoBvB;;OAEG;IACH,OAAO,CAAC,WAAW;IAUnB;;OAEG;YACW,YAAY;IAK1B;;OAEG;IACH,OAAO,CAAC,YAAY;IAuGpB;;OAEG;YACW,qBAAqB;IAqCnC;;OAEG;IACH,OAAO,CAAC,oBAAoB;CA2B7B"}
1
+ {"version":3,"file":"search-engine.d.ts","sourceRoot":"","sources":["../../src/algorithms/search-engine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAMjF,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAC1C,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAGD,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAgB;;IAM/B;;;OAGG;IACG,MAAM,CACV,EAAE,EAAE,GAAG,EACP,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC;QAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAwKpF;;;OAGG;IACH,OAAO,CAAC,aAAa;IAwBrB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAoBvB;;OAEG;IACH,OAAO,CAAC,WAAW;IAUnB;;OAEG;YACW,YAAY;IAK1B;;;OAGG;IACH,OAAO,CAAC,YAAY;IAuGpB;;;OAGG;YACW,qBAAqB;IAqCnC;;;;;;OAMG;IACH,OAAO,CAAC,gCAAgC;IAuCxC;;;;;;;OAOG;IACH,OAAO,CAAC,mCAAmC;IAmB3C;;;OAGG;IACH,OAAO,CAAC,oBAAoB;CA2B7B"}
@@ -1,39 +1,43 @@
1
1
  /**
2
- * 개선된 검색 엔진 구현
3
- * FTS5 + 랭킹 알고리즘 + 필터링 결합
2
+ * FTS5와 랭킹 알고리즘을 결합하여 검색 정확도와 성능을 동시에 확보합니다.
3
+ * 전문 검색 인덱스(FTS5)로 빠른 검색을 수행하고, 다차원 랭킹 알고리즘으로 관련성 높은 결과를 제공합니다.
4
4
  */
5
5
  import { SearchRanking } from './search-ranking.js';
6
6
  import Database from 'better-sqlite3';
7
7
  import { getStopWords } from '../utils/stopwords.js';
8
8
  import { mementoConfig } from '../config/index.js';
9
+ import { shouldUseFallback } from '../utils/fts5-migration-status.js';
9
10
  export class SearchEngine {
10
11
  ranking;
11
12
  constructor() {
12
13
  this.ranking = new SearchRanking();
13
14
  }
14
15
  /**
15
- * 개선된 검색 구현 - FTS5 최적화
16
+ * 전문 검색 성능을 향상시키고 관련성 높은 결과를 빠르게 반환합니다.
17
+ * FTS5 인덱스를 활용하여 대용량 데이터에서도 빠른 검색이 가능하도록 최적화합니다.
16
18
  */
17
19
  async search(db, query) {
18
20
  const startTime = process.hrtime.bigint();
19
21
  const { query: searchQuery, filters, limit = 10 } = query;
20
- // 1. ID 필터가 있으면 내용 검색 조건을 건너뛰기
22
+ // ID 직접 조회할 때는 이미 대상이 명확하므로 불필요한 텍스트 검색을 생략하여 성능을 최적화합니다.
21
23
  const hasIdFilter = filters?.id && filters.id.length > 0;
22
24
  let sql;
23
25
  const params = [];
24
- // 2. FTS5 검색 사용 (ID 필터가 없고 검색어가 있을 때)
26
+ // 전문 검색 인덱스를 활용하여 빠르고 정확한 검색 결과를 제공합니다.
25
27
  if (!hasIdFilter && searchQuery.trim().length > 0) {
26
- // FTS5 사용 가능 여부 확인
28
+ // FTS5 인덱스가 없으면 쿼리 오류가 발생할 수 있으므로, 인덱스가 준비되어 있는지 확인하여 안전한 검색을 보장합니다.
27
29
  const ftsAvailable = await this.checkFTS5Availability(db);
28
30
  if (ftsAvailable) {
29
31
  const ftsQuery = this.buildFTSQuery(searchQuery);
30
- // 빈 쿼리인 경우 FTS5 사용하지 않고 일반 SQL 사용
32
+ // 빈 쿼리로 인한 FTS5 오류를 방지하고 모든 결과를 반환합니다.
31
33
  if (ftsQuery === '""' || ftsQuery.length === 0) {
32
34
  sql = `
33
35
  SELECT
34
36
  m.id, m.content, m.type, m.importance, m.created_at,
35
37
  m.last_accessed, m.pinned, m.tags, m.source,
36
38
  m.consolidation_score,
39
+ m.task_goal, m.steps, m.reflection_notes,
40
+ m.privacy_scope, m.origin_source,
37
41
  0 as fts_rank
38
42
  FROM memory_item m
39
43
  `;
@@ -44,6 +48,8 @@ export class SearchEngine {
44
48
  m.id, m.content, m.type, m.importance, m.created_at,
45
49
  m.last_accessed, m.pinned, m.tags, m.source,
46
50
  m.consolidation_score,
51
+ m.task_goal, m.steps, m.reflection_notes,
52
+ m.privacy_scope, m.origin_source,
47
53
  memory_item_fts.rank as fts_rank
48
54
  FROM memory_item_fts
49
55
  JOIN memory_item m ON memory_item_fts.rowid = m.rowid
@@ -53,38 +59,50 @@ export class SearchEngine {
53
59
  }
54
60
  }
55
61
  else {
56
- // FTS5가 없으면 기본 LIKE 검색 사용
62
+ // FTS5가 없는 환경에서도 검색 기능이 동작하도록 호환성을 보장합니다.
57
63
  const likeQuery = `%${searchQuery}%`;
64
+ // reflection_notes 검색 조건 추가 (Fallback)
65
+ const reflectionNotesCondition = this.buildReflectionNotesSearchCondition(db, searchQuery);
66
+ const reflectionNotesLike = reflectionNotesCondition ? ` OR ${reflectionNotesCondition}` : '';
67
+ const reflectionNotesParams = reflectionNotesCondition ? [likeQuery] : [];
58
68
  sql = `
59
69
  SELECT
60
70
  m.id, m.content, m.type, m.importance, m.created_at,
61
71
  m.last_accessed, m.pinned, m.tags, m.source,
62
72
  m.consolidation_score,
73
+ m.task_goal, m.steps, m.reflection_notes,
74
+ m.privacy_scope, m.origin_source,
63
75
  0 as fts_rank
64
76
  FROM memory_item m
65
- WHERE m.content LIKE ? OR m.tags LIKE ? OR m.source LIKE ?
77
+ WHERE m.content LIKE ? OR m.tags LIKE ? OR m.source LIKE ?${reflectionNotesLike}
66
78
  `;
67
- params.push(likeQuery, likeQuery, likeQuery);
79
+ params.push(likeQuery, likeQuery, likeQuery, ...reflectionNotesParams);
68
80
  }
69
81
  }
70
82
  else {
71
- // 3. 기본 SQL 쿼리 구성 (ID 필터가 있거나 검색어가 없을 때)
83
+ // ID 필터나 검색어 상황에서 효율적인 직접 조회를 수행합니다.
72
84
  sql = `
73
85
  SELECT
74
86
  m.id, m.content, m.type, m.importance, m.created_at,
75
87
  m.last_accessed, m.pinned, m.tags, m.source,
76
88
  m.consolidation_score,
89
+ m.task_goal, m.steps, m.reflection_notes,
90
+ m.privacy_scope, m.origin_source,
77
91
  0 as fts_rank
78
92
  FROM memory_item m
79
93
  `;
80
- // 내용 검색 조건 (검색어가 있을 때만)
94
+ // 검색어가 있을 때만 텍스트 매칭을 수행하여 불필요한 연산을 방지합니다.
81
95
  if (!hasIdFilter && searchQuery.trim().length > 0) {
82
96
  const likeQuery = `%${searchQuery}%`;
83
- sql += ` WHERE m.content LIKE ?`;
84
- params.push(likeQuery);
97
+ // reflection_notes 검색 조건 추가 (Fallback)
98
+ const reflectionNotesCondition = this.buildReflectionNotesSearchCondition(db, searchQuery);
99
+ const reflectionNotesLike = reflectionNotesCondition ? ` OR ${reflectionNotesCondition}` : '';
100
+ const reflectionNotesParams = reflectionNotesCondition ? [likeQuery] : [];
101
+ sql += ` WHERE m.content LIKE ?${reflectionNotesLike}`;
102
+ params.push(likeQuery, ...reflectionNotesParams);
85
103
  }
86
104
  }
87
- // 4. 필터 조건 추가
105
+ // 사용자가 요청한 타입, 중요도, 시간 범위 등의 필터를 적용하여 정확한 결과를 제공합니다.
88
106
  const conditions = [];
89
107
  if (filters?.id && filters.id.length > 0) {
90
108
  conditions.push(`m.id IN (${filters.id.map(() => '?').join(',')})`);
@@ -100,7 +118,7 @@ export class SearchEngine {
100
118
  }
101
119
  if (filters?.pinned !== undefined) {
102
120
  conditions.push(`m.pinned = ?`);
103
- params.push(filters.pinned ? 1 : 0); // boolean을 숫자로 변환
121
+ params.push(filters.pinned ? 1 : 0); // SQLite가 boolean을 지원하지 않으므로 숫자로 변환하여 저장합니다.
104
122
  }
105
123
  if (filters?.time_from) {
106
124
  conditions.push(`m.created_at >= ?`);
@@ -110,26 +128,34 @@ export class SearchEngine {
110
128
  conditions.push(`m.created_at <= ?`);
111
129
  params.push(filters.time_to);
112
130
  }
131
+ if (filters?.has_reflection_notes !== undefined) {
132
+ if (filters.has_reflection_notes) {
133
+ conditions.push(`m.reflection_notes IS NOT NULL`);
134
+ }
135
+ else {
136
+ conditions.push(`m.reflection_notes IS NULL`);
137
+ }
138
+ }
113
139
  // WHERE 절 추가
114
140
  if (conditions.length > 0) {
115
141
  const whereClause = sql.includes('WHERE') ? ' AND ' : ' WHERE ';
116
142
  sql += whereClause + conditions.join(' AND ');
117
143
  }
118
- // 5. 결과 제한 정렬 최적화
144
+ // FTS5 랭킹을 고려하여 충분한 후보를 확보한 후 재랭킹하여 최종 결과의 품질을 보장합니다.
119
145
  sql += ` ORDER BY fts_rank DESC, m.created_at DESC LIMIT ?`;
120
- params.push(limit * 3); // FTS5 랭킹을 고려하여 많은 후보 가져오기
121
- // 6. 데이터베이스 쿼리 실행
146
+ params.push(limit * 3); // FTS5 랭킹과 재랭킹 과정에서 일부 결과가 제외될 수 있으므로 충분한 후보를 확보합니다.
147
+ // 구성된 쿼리를 실행하여 실제 검색 결과를 획득합니다.
122
148
  console.log('🔍 검색 쿼리:', sql);
123
149
  console.log('🔍 검색 파라미터:', params);
124
150
  const results = await this.executeQuery(db, sql, params);
125
151
  console.log('🔍 검색 결과 개수:', results.length);
126
- // 7. 랭킹 알고리즘 적용 (FTS5 랭킹 활용)
152
+ // FTS5 랭킹과 다차원 점수를 결합하여 사용자에게 가장 관련성 높은 결과를 우선 제공합니다.
127
153
  const rankedResults = this.applyRanking(results, searchQuery);
128
- // 8. 최종 결과 반환 (limit 적용)
154
+ // 사용자가 요청한 개수만큼만 반환하여 응답 크기와 처리 시간을 최적화합니다.
129
155
  const finalResults = rankedResults.slice(0, limit);
130
- // 9. 쿼리 시간 측정
156
+ // 검색 성능을 모니터링하고 최적화 지점을 파악합니다.
131
157
  const endTime = process.hrtime.bigint();
132
- const queryTime = Number(endTime - startTime) / 1_000_000; // 밀리초로 변환
158
+ const queryTime = Number(endTime - startTime) / 1_000_000; // 나노초 단위 시간을 밀리초로 변환하여 사용자에게 이해하기 쉬운 형태로 제공합니다.
133
159
  return {
134
160
  items: finalResults,
135
161
  total_count: finalResults.length,
@@ -137,105 +163,107 @@ export class SearchEngine {
137
163
  };
138
164
  }
139
165
  /**
140
- * FTS5 검색 쿼리 구성
141
- * 아키텍처 문서에 따른 쿼리 전처리 구현
166
+ * FTS5 특수 문법과 보안 요구사항을 준수하여 안전하고 효율적인 검색 쿼리를 생성합니다.
167
+ * 아키텍처 문서의 전처리 규칙을 적용하여 검색 정확도를 향상시킵니다.
142
168
  */
143
169
  buildFTSQuery(query) {
144
170
  console.log('🔍 원본 쿼리:', `"${query}"`);
145
- // 1. 쿼리 전처리
171
+ // 사용자 입력의 형식이 다양하므로 정규화하여 검색 일관성을 보장합니다.
146
172
  const preprocessedQuery = this.preprocessQuery(query);
147
173
  console.log('🔍 전처리 후:', `"${preprocessedQuery}"`);
148
174
  if (preprocessedQuery.length === 0) {
149
175
  console.log('🔍 빈 쿼리, 모든 문서 검색');
150
- return '""'; // 빈 쿼리인 경우 빈 문자열로 검색 (모든 문서 매치)
176
+ return '""'; // 빈 쿼리인 경우 빈 문자열로 검색하여 모든 문서를 매치하고 사용자에게 전체 결과를 제공합니다.
151
177
  }
152
- // 2. FTS5 안전 쿼리 생성
178
+ // FTS5 특수문자로 인한 쿼리 오류를 방지하고 안전한 검색을 보장합니다.
153
179
  const safeQuery = this.makeFTSSafe(preprocessedQuery);
154
180
  console.log('🔍 FTS5 안전 쿼리:', `"${safeQuery}"`);
155
181
  if (safeQuery.length === 0) {
156
182
  console.log('🔍 안전 쿼리 빈 문자열, 모든 문서 검색');
157
- return '""'; // 빈 쿼리인 경우 빈 문자열로 검색 (모든 문서 매치)
183
+ return '""'; // 빈 쿼리인 경우 빈 문자열로 검색하여 모든 문서를 매치하고 사용자에게 전체 결과를 제공합니다.
158
184
  }
159
185
  return safeQuery;
160
186
  }
161
187
  /**
162
- * 쿼리 전처리 - 아키텍처 문서의 전처리 과정 구현
188
+ * 검색 품질을 향상시키기 위해 노이즈를 제거하고 핵심 키워드만 추출합니다.
189
+ * 아키텍처 문서의 전처리 규칙을 준수하여 일관된 검색 결과를 제공합니다.
163
190
  */
164
191
  preprocessQuery(query) {
165
- // 1. 공백 정규화
192
+ // 다양한 공백 패턴을 통일하여 검색 일관성을 보장합니다.
166
193
  let processed = query.trim().replace(/\s+/g, ' ');
167
- // 2. 한글과 영문, 숫자, 공백만 유지 (특수문자 제거)
194
+ // 검색에 방해되는 특수문자를 제거하여 핵심 키워드만 추출합니다.
168
195
  processed = processed.replace(/[^a-zA-Z0-9가-힣\s]/g, ' ');
169
- // 3. 연속된 공백 제거
196
+ // 정규화 과정에서 생긴 연속 공백을 정리하여 쿼리 품질을 향상시킵니다.
170
197
  processed = processed.replace(/\s+/g, ' ');
171
- // 4. 불용어 제거 (한국어/영어 불용어)
198
+ // 검색 가치가 없는 불용어를 제거하여 검색 정확도를 향상시킵니다.
172
199
  const stopWords = getStopWords();
173
200
  const words = processed.split(' ').filter(word => word.length > 0 && !stopWords.has(word.toLowerCase()));
174
- // 5. FTS5 위한 공백으로 구분된 쿼리 반환
201
+ // FTS5 요구하는 형식으로 쿼리를 구성하여 인덱스 검색이 정상 동작하도록 합니다.
175
202
  return words.join(' ');
176
203
  }
177
204
  /**
178
- * FTS5 안전 쿼리 생성
205
+ * FTS5 특수문자 처리 규칙을 준수하여 쿼리 오류를 방지하고 안전한 검색을 보장합니다.
179
206
  */
180
207
  makeFTSSafe(query) {
181
- // FTS5에서 특수문자 이스케이프
208
+ // FTS5 특수문자를 쿼리 구문으로 해석하지 않도록 이스케이프하여 오류를 방지합니다.
182
209
  return query
183
- .replace(/"/g, '""') // 따옴표 이스케이프
184
- .replace(/'/g, "''") // 작은따옴표 이스케이프
210
+ .replace(/"/g, '""') // FTS5가 따옴표를 특수문자로 해석하지 않도록 이스케이프합니다.
211
+ .replace(/'/g, "''") // FTS5가 작은따옴표를 특수문자로 해석하지 않도록 이스케이프합니다.
185
212
  .replace(/[[\]{}()]/g, ' ') // 대괄호, 중괄호, 소괄호 제거
186
213
  .replace(/\s+/g, ' ') // 연속 공백 정리
187
214
  .trim();
188
215
  }
189
216
  /**
190
- * 데이터베이스 쿼리 실행
217
+ * 준비된 SQL 쿼리를 실행하여 실제 검색 결과를 데이터베이스에서 획득합니다.
191
218
  */
192
219
  async executeQuery(db, sql, params) {
193
- // better-sqlite3 동기적이므로 직접 실행
220
+ // better-sqlite3 동기적 특성을 활용하여 간단하고 효율적인 쿼리 실행을 수행합니다.
194
221
  return db.prepare(sql).all(params);
195
222
  }
196
223
  /**
197
- * 랭킹 알고리즘 적용 - FTS5 랭킹 활용
224
+ * FTS5 랭킹과 다차원 점수를 결합하여 사용자에게 가장 관련성 높은 결과를 우선 제공합니다.
225
+ * 관련성, 최근성, 중요도, 사용성 등을 종합적으로 고려하여 검색 품질을 향상시킵니다.
198
226
  */
199
227
  applyRanking(results, query) {
200
228
  const selectedContents = [];
201
229
  return results
202
230
  .map((row) => {
203
- // FTS5 랭킹이 있으면 활용, 없으면 기본 관련성 계산
231
+ // FTS5 랭킹이 있으면 우선 활용하고, 없으면 텍스트 매칭으로 관련성을 계산하여 일관된 점수 체계를 유지합니다.
204
232
  const ftsRank = row.fts_rank || 0;
205
233
  const relevance = ftsRank > 0 ?
206
- Math.min(ftsRank / 100, 1.0) : // FTS5 랭킹을 0-1 범위로 정규화
234
+ Math.min(ftsRank / 100, 1.0) : // FTS5 랭킹을 0-1 범위로 정규화하여 다른 점수와 일관된 비교가 가능하도록 합니다.
207
235
  this.ranking.calculateRelevance({
208
236
  query,
209
237
  content: row.content,
210
238
  tags: row.tags ? JSON.parse(row.tags) : []
211
239
  });
212
- // 최근성 계산
240
+ // 시간에 따른 기억의 자연스러운 감쇠를 반영하여 최신 정보를 우선 제공합니다.
213
241
  const recency = this.ranking.calculateRecency(new Date(row.created_at), row.type);
214
- // 중요도 계산
242
+ // 사용자가 명시적으로 설정한 중요도와 고정 여부를 반영하여 우선순위를 결정합니다.
215
243
  const importance = this.ranking.calculateImportance(row.importance, row.pinned, row.type);
216
- // 사용성 계산 (기본 메트릭 사용)
244
+ // 실제 사용 빈도를 반영하여 자주 참조되는 기억을 우선 제공합니다.
217
245
  const usage = this.ranking.calculateUsage({
218
- viewCount: 1, // 기본값
246
+ viewCount: 1, // 사용 빈도 데이터가 없는 경우 기본값을 사용하여 안정적인 점수 계산을 보장합니다.
219
247
  citeCount: 0,
220
248
  editCount: 0
221
249
  });
222
- // 중복 패널티 계산
250
+ // 유사한 내용의 중복 결과를 제거하여 검색 결과의 다양성을 확보합니다.
223
251
  const duplicationPenalty = this.ranking.calculateDuplicationPenalty(row.content, selectedContents);
224
- // Consolidation Score 조회
252
+ // 통합 점수 기능이 활성화된 경우 추가적인 관련성 지표를 활용합니다.
225
253
  const consolidationScore = row.consolidation_score !== null && row.consolidation_score !== undefined
226
254
  ? Number(row.consolidation_score)
227
255
  : undefined;
228
256
  // 최종 점수 계산
229
257
  let finalScore;
230
- // Consolidation Score가 활성화되어 있고 값이 있으면 사용
258
+ // 통합 점수 기능을 통해 정교한 관련성 평가를 수행하여 검색 품질을 향상시킵니다.
231
259
  if (mementoConfig.consolidationScoreEnabled && consolidationScore !== undefined) {
232
- // 벡터 유사도는 relevance로 간주
260
+ // 벡터 검색 결과를 텍스트 관련성과 동일한 의미로 해석하여 일관된 점수 계산을 수행합니다.
233
261
  const vectorSimilarity = relevance;
234
- finalScore = this.ranking.calculateFinalScoreWithConsolidation(vectorSimilarity, consolidationScore, 'balanced' // 기본 프로파일, 향후 쿼리 파라미터로 받을 있음
262
+ finalScore = this.ranking.calculateFinalScoreWithConsolidation(vectorSimilarity, consolidationScore, 'balanced' // 기본적으로 균형잡힌 점수 계산을 사용하고, 향후 사용자 요구에 따라 조정 가능하도록 설계했습니다.
235
263
  );
236
264
  }
237
265
  else {
238
- // 기존 점수 계산 방식
266
+ // 통합 점수가 없는 경우 기존의 검증된 점수 계산 방식을 사용하여 안정성을 보장합니다.
239
267
  finalScore = ftsRank > 0 ?
240
268
  ftsRank * 0.7 + this.ranking.calculateFinalScore({
241
269
  relevance: 0.3,
@@ -252,7 +280,7 @@ export class SearchEngine {
252
280
  duplication_penalty: duplicationPenalty
253
281
  });
254
282
  }
255
- // 선택된 콘텐츠에 추가 (다양성 확보)
283
+ // 중복 패널티 계산을 위해 이미 선택된 콘텐츠를 추적하여 결과의 다양성을 확보합니다.
256
284
  selectedContents.push(row.content);
257
285
  const result = {
258
286
  id: row.id,
@@ -266,20 +294,21 @@ export class SearchEngine {
266
294
  score: finalScore,
267
295
  recall_reason: this.generateRecallReason(relevance, recency, importance, finalScore, ftsRank > 0)
268
296
  };
269
- // Consolidation Score 포함 (기능 플래그 활성화 시)
297
+ // 통합 점수 기능이 활성화된 경우 결과에 추가 정보를 포함하여 상세한 분석을 가능하게 합니다.
270
298
  if (mementoConfig.consolidationScoreEnabled && consolidationScore !== undefined) {
271
299
  result.consolidation_score = consolidationScore;
272
300
  }
273
301
  return result;
274
302
  })
275
- .sort((a, b) => b.score - a.score); // 점수 내림차순 정렬
303
+ .sort((a, b) => b.score - a.score); // 최종 점수 기준으로 내림차순 정렬하여 가장 관련성 높은 결과를 우선 제공합니다.
276
304
  }
277
305
  /**
278
- * FTS5 사용 가능 여부 확인
306
+ * FTS5 인덱스의 존재와 동작 여부를 확인하여 안전한 검색 전략을 선택합니다.
307
+ * 인덱스가 없거나 비정상인 경우 대체 검색 방식을 사용하여 기능 안정성을 보장합니다.
279
308
  */
280
309
  async checkFTS5Availability(db) {
281
310
  try {
282
- // FTS5 테이블 존재 여부 확인
311
+ // FTS5 인덱스 테이블이 생성되어 있는지 확인하여 전문 검색 사용 가능 여부를 판단합니다.
283
312
  const result = db.prepare(`
284
313
  SELECT name FROM sqlite_master
285
314
  WHERE type='table' AND name='memory_item_fts'
@@ -288,14 +317,14 @@ export class SearchEngine {
288
317
  console.log('⚠️ FTS5 테이블이 존재하지 않음, 기본 검색으로 전환');
289
318
  return false;
290
319
  }
291
- // FTS5 테이블에 데이터가 있는지 확인
320
+ // 인덱스로 인한 검색 실패를 방지하고 실제 검색 가능 여부를 확인합니다.
292
321
  const count = db.prepare('SELECT COUNT(*) as count FROM memory_item_fts').get();
293
322
  const hasData = count && count.count > 0;
294
323
  if (!hasData) {
295
324
  console.log('⚠️ FTS5 테이블에 데이터가 없음, 기본 검색으로 전환');
296
325
  return false;
297
326
  }
298
- // FTS5 쿼리 테스트
327
+ // FTS5 쿼리가 실제로 동작하는지 테스트하여 런타임 오류를 사전에 방지합니다.
299
328
  try {
300
329
  db.prepare('SELECT * FROM memory_item_fts LIMIT 1').get();
301
330
  console.log('✅ FTS5 사용 가능');
@@ -312,7 +341,73 @@ export class SearchEngine {
312
341
  }
313
342
  }
314
343
  /**
315
- * 검색 이유 생성
344
+ * reflection_notes 컬럼이 FTS5에서 사용 가능한지 확인
345
+ * 마이그레이션 상태를 확인하여 Fallback이 필요한지 판단합니다.
346
+ *
347
+ * @param db - 데이터베이스 인스턴스
348
+ * @returns reflection_notes 컬럼 사용 가능 여부
349
+ */
350
+ checkReflectionNotesAvailability(db) {
351
+ // 환경 변수로 강제 Fallback 활성화 확인
352
+ if (process.env.MEMENTO_FTS5_FALLBACK_ENABLED === 'true') {
353
+ console.log('⚠️ 환경 변수로 인해 reflection_notes Fallback 활성화');
354
+ return false;
355
+ }
356
+ // 마이그레이션 상태 확인
357
+ if (shouldUseFallback(db)) {
358
+ console.log('⚠️ 마이그레이션 상태로 인해 reflection_notes Fallback 사용');
359
+ return false;
360
+ }
361
+ // FTS5 테이블에 reflection_notes 컬럼이 있는지 확인
362
+ try {
363
+ const tableInfo = db.prepare(`
364
+ SELECT sql FROM sqlite_master
365
+ WHERE type='table' AND name='memory_item_fts'
366
+ `).get();
367
+ if (!tableInfo) {
368
+ return false;
369
+ }
370
+ // reflection_notes 컬럼이 포함되어 있는지 확인
371
+ const hasReflectionNotes = tableInfo.sql.includes('reflection_notes');
372
+ if (!hasReflectionNotes) {
373
+ console.log('⚠️ FTS5 테이블에 reflection_notes 컬럼이 없음, Fallback 사용');
374
+ return false;
375
+ }
376
+ return true;
377
+ }
378
+ catch (error) {
379
+ console.log('⚠️ reflection_notes 컬럼 확인 실패, Fallback 사용:', error);
380
+ return false;
381
+ }
382
+ }
383
+ /**
384
+ * reflection_notes 검색 쿼리 빌더
385
+ * 마이그레이션 상태에 따라 FTS5 MATCH 쿼리 또는 LIKE 쿼리를 선택합니다.
386
+ *
387
+ * @param db - 데이터베이스 인스턴스
388
+ * @param searchQuery - 검색 쿼리
389
+ * @returns reflection_notes 검색 조건 (SQL WHERE 절 조건)
390
+ */
391
+ buildReflectionNotesSearchCondition(db, searchQuery) {
392
+ // reflection_notes 검색이 필요한지 확인 (쿼리에 reflection_notes 관련 키워드가 있는지)
393
+ // 간단한 구현: 모든 쿼리에 reflection_notes 검색 포함
394
+ // 향후 개선: 쿼리 분석하여 reflection_notes 검색 필요 여부 판단
395
+ const canUseFTS5 = this.checkReflectionNotesAvailability(db);
396
+ if (canUseFTS5) {
397
+ // FTS5 MATCH 쿼리 사용
398
+ // Note: FTS5 MATCH는 이미 메인 쿼리에서 처리되므로, 별도 조건 불필요
399
+ // reflection_notes는 FTS5 테이블의 컬럼이므로 자동으로 검색됨
400
+ return null; // FTS5 MATCH 쿼리에서는 별도 조건 불필요
401
+ }
402
+ else {
403
+ // LIKE 쿼리 사용 (Fallback)
404
+ const likeQuery = `%${searchQuery}%`;
405
+ return `m.reflection_notes LIKE ?`;
406
+ }
407
+ }
408
+ /**
409
+ * 사용자에게 검색 결과가 선택된 이유를 명확히 전달하여 검색 결과의 신뢰성을 높입니다.
410
+ * 관련성, 최근성, 중요도 등 다양한 요소를 종합하여 투명한 검색 과정을 제공합니다.
316
411
  */
317
412
  generateRecallReason(relevance, recency, importance, finalScore, isFTS = false) {
318
413
  const reasons = [];
@@ -1 +1 @@
1
- {"version":3,"file":"search-engine.js","sourceRoot":"","sources":["../../src/algorithms/search-engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search-engine.js","sourceRoot":"","sources":["../../src/algorithms/search-engine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAStE,MAAM,OAAO,YAAY;IACf,OAAO,CAAgB;IAE/B;QACE,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CACV,EAAO,EACP,KAAkB;QAElB,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAC1C,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,KAAK,CAAC;QAE1D,2DAA2D;QAC3D,MAAM,WAAW,GAAG,OAAO,EAAE,EAAE,IAAI,OAAO,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;QAEzD,IAAI,GAAW,CAAC;QAChB,MAAM,MAAM,GAAU,EAAE,CAAC;QAEzB,wCAAwC;QACxC,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClD,qEAAqE;YACrE,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;YAE1D,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;gBAEjD,uCAAuC;gBACvC,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC/C,GAAG,GAAG;;;;;;;;;WASL,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,GAAG,GAAG;;;;;;;;;;;WAWL,CAAC;oBACF,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,0CAA0C;gBAC1C,MAAM,SAAS,GAAG,IAAI,WAAW,GAAG,CAAC;gBAErC,uCAAuC;gBACvC,MAAM,wBAAwB,GAAG,IAAI,CAAC,mCAAmC,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;gBAC3F,MAAM,mBAAmB,GAAG,wBAAwB,CAAC,CAAC,CAAC,OAAO,wBAAwB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9F,MAAM,qBAAqB,GAAG,wBAAwB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAE1E,GAAG,GAAG;;;;;;;;;sEASwD,mBAAmB;SAChF,CAAC;gBACF,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,qBAAqB,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,uCAAuC;YACvC,GAAG,GAAG;;;;;;;;;OASL,CAAC;YAEF,0CAA0C;YAC1C,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClD,MAAM,SAAS,GAAG,IAAI,WAAW,GAAG,CAAC;gBAErC,uCAAuC;gBACvC,MAAM,wBAAwB,GAAG,IAAI,CAAC,mCAAmC,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;gBAC3F,MAAM,mBAAmB,GAAG,wBAAwB,CAAC,CAAC,CAAC,OAAO,wBAAwB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9F,MAAM,qBAAqB,GAAG,wBAAwB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAE1E,GAAG,IAAI,0BAA0B,mBAAmB,EAAE,CAAC;gBACvD,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,qBAAqB,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QAED,qDAAqD;QACrD,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,IAAI,OAAO,EAAE,EAAE,IAAI,OAAO,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzC,UAAU,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACpE,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC;QAED,IAAI,OAAO,EAAE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7C,UAAU,CAAC,IAAI,CAAC,cAAc,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACxE,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;QAED,IAAI,OAAO,EAAE,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/D,UAAU,CAAC,IAAI,CAAC,uBAAuB,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC1F,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,OAAO,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;YAClC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,6CAA6C;QACpF,CAAC;QAED,IAAI,OAAO,EAAE,SAAS,EAAE,CAAC;YACvB,UAAU,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC;QAED,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;YACrB,UAAU,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAED,IAAI,OAAO,EAAE,oBAAoB,KAAK,SAAS,EAAE,CAAC;YAChD,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;gBACjC,UAAU,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YACpD,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;QAED,aAAa;QACb,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;YAChE,GAAG,IAAI,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChD,CAAC;QAED,sDAAsD;QACtD,GAAG,IAAI,oDAAoD,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,qDAAqD;QAE7E,gCAAgC;QAChC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAE5C,sDAAsD;QACtD,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAE9D,4CAA4C;QAC5C,MAAM,YAAY,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAEnD,+BAA+B;QAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACxC,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC,CAAC,gDAAgD;QAE3G,OAAO;YACL,KAAK,EAAE,YAAY;YACnB,WAAW,EAAE,YAAY,CAAC,MAAM;YAChC,UAAU,EAAE,SAAS;SACtB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACK,aAAa,CAAC,KAAa;QACjC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,KAAK,GAAG,CAAC,CAAC;QAEvC,yCAAyC;QACzC,MAAM,iBAAiB,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,iBAAiB,GAAG,CAAC,CAAC;QAEnD,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACjC,OAAO,IAAI,CAAC,CAAC,uDAAuD;QACtE,CAAC;QAED,2CAA2C;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,SAAS,GAAG,CAAC,CAAC;QAEhD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YACxC,OAAO,IAAI,CAAC,CAAC,uDAAuD;QACtE,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;OAGG;IACK,eAAe,CAAC,KAAa;QACnC,iCAAiC;QACjC,IAAI,SAAS,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAElD,qCAAqC;QACrC,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC;QAEzD,yCAAyC;QACzC,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAE3C,sCAAsC;QACtC,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAC/C,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CACtD,CAAC;QAEF,iDAAiD;QACjD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,KAAa;QAC/B,kDAAkD;QAClD,OAAO,KAAK;aACT,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAE,sCAAsC;aAC3D,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAE,wCAAwC;aAC7D,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,mBAAmB;aAC9C,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,WAAW;aAChC,IAAI,EAAE,CAAC;IACZ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY,CAAC,EAAqB,EAAE,GAAW,EAAE,MAAiB;QAC9E,uDAAuD;QACvD,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAED;;;OAGG;IACK,YAAY,CAAC,OAAc,EAAE,KAAa;QAChD,MAAM,gBAAgB,GAAa,EAAE,CAAC;QAEtC,OAAO,OAAO;aACX,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE;YAChB,iEAAiE;YACjE,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC;YAClC,MAAM,SAAS,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC;gBAC7B,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,mDAAmD;gBAClF,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC;oBAC9B,KAAK;oBACL,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;iBAC3C,CAAC,CAAC;YAEL,6CAA6C;YAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAC3C,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EACxB,GAAG,CAAC,IAAI,CACT,CAAC;YAEF,+CAA+C;YAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,CACjD,GAAG,CAAC,UAAU,EACd,GAAG,CAAC,MAAM,EACV,GAAG,CAAC,IAAI,CACT,CAAC;YAEF,uCAAuC;YACvC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;gBACxC,SAAS,EAAE,CAAC,EAAE,gDAAgD;gBAC9D,SAAS,EAAE,CAAC;gBACZ,SAAS,EAAE,CAAC;aACb,CAAC,CAAC;YAEH,yCAAyC;YACzC,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,2BAA2B,CACjE,GAAG,CAAC,OAAO,EACX,gBAAgB,CACjB,CAAC;YAEF,wCAAwC;YACxC,MAAM,kBAAkB,GAAG,GAAG,CAAC,mBAAmB,KAAK,IAAI,IAAI,GAAG,CAAC,mBAAmB,KAAK,SAAS;gBAClG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC;gBACjC,CAAC,CAAC,SAAS,CAAC;YAEd,WAAW;YACX,IAAI,UAAkB,CAAC;YAEvB,iDAAiD;YACjD,IAAI,aAAa,CAAC,yBAAyB,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;gBAChF,oDAAoD;gBACpD,MAAM,gBAAgB,GAAG,SAAS,CAAC;gBACnC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,oCAAoC,CAC5D,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,CAAC,yDAAyD;iBACrE,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,kDAAkD;gBAClD,UAAU,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC;oBACxB,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC;wBAC/C,SAAS,EAAE,GAAG;wBACd,OAAO;wBACP,UAAU;wBACV,KAAK;wBACL,mBAAmB,EAAE,kBAAkB;qBACxC,CAAC,GAAG,GAAG,CAAC,CAAC;oBACV,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC;wBAC/B,SAAS;wBACT,OAAO;wBACP,UAAU;wBACV,KAAK;wBACL,mBAAmB,EAAE,kBAAkB;qBACxC,CAAC,CAAC;YACP,CAAC;YAED,iDAAiD;YACjD,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAEnC,MAAM,MAAM,GAAQ;gBAClB,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,aAAa,EAAE,GAAG,CAAC,aAAa;gBAChC,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;gBAC1C,KAAK,EAAE,UAAU;gBACjB,aAAa,EAAE,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,GAAG,CAAC,CAAC;aAClG,CAAC;YAEF,sDAAsD;YACtD,IAAI,aAAa,CAAC,yBAAyB,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;gBAChF,MAAM,CAAC,mBAAmB,GAAG,kBAAkB,CAAC;YAClD,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,+CAA+C;IACvF,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,qBAAqB,CAAC,EAAO;QACzC,IAAI,CAAC;YACH,qDAAqD;YACrD,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC;;;OAGzB,CAAC,CAAC,GAAG,EAAE,CAAC;YAET,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;gBACjD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,4CAA4C;YAC5C,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC,GAAG,EAAE,CAAC;YAChF,MAAM,OAAO,GAAG,KAAK,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;YAEzC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;gBACjD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,8CAA8C;YAC9C,IAAI,CAAC;gBACH,EAAE,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC,GAAG,EAAE,CAAC;gBAC1D,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;gBAC5B,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,OAAO,QAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,QAAQ,CAAC,CAAC;gBACrD,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;YACnD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACK,gCAAgC,CAAC,EAAO;QAC9C,4BAA4B;QAC5B,IAAI,OAAO,CAAC,GAAG,CAAC,6BAA6B,KAAK,MAAM,EAAE,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;YAC3D,OAAO,KAAK,CAAC;QACf,CAAC;QAED,eAAe;QACf,IAAI,iBAAiB,CAAC,EAAE,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;YAC9D,OAAO,KAAK,CAAC;QACf,CAAC;QAED,wCAAwC;QACxC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC;;;OAG5B,CAAC,CAAC,GAAG,EAAiC,CAAC;YAExC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,KAAK,CAAC;YACf,CAAC;YAED,mCAAmC;YACnC,MAAM,kBAAkB,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;YAEtE,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;gBAClE,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,6CAA6C,EAAE,KAAK,CAAC,CAAC;YAClE,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACK,mCAAmC,CAAC,EAAO,EAAE,WAAmB;QACtE,kEAAkE;QAClE,wCAAwC;QACxC,8CAA8C;QAE9C,MAAM,UAAU,GAAG,IAAI,CAAC,gCAAgC,CAAC,EAAE,CAAC,CAAC;QAE7D,IAAI,UAAU,EAAE,CAAC;YACf,mBAAmB;YACnB,gDAAgD;YAChD,6CAA6C;YAC7C,OAAO,IAAI,CAAC,CAAC,6BAA6B;QAC5C,CAAC;aAAM,CAAC;YACN,wBAAwB;YACxB,MAAM,SAAS,GAAG,IAAI,WAAW,GAAG,CAAC;YACrC,OAAO,2BAA2B,CAAC;QACrC,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,oBAAoB,CAC1B,SAAiB,EACjB,OAAe,EACf,UAAkB,EAClB,UAAkB,EAClB,QAAiB,KAAK;QAEtB,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,SAAS,GAAG,GAAG,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;QACD,IAAI,OAAO,GAAG,GAAG,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,UAAU,GAAG,GAAG,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;QACD,IAAI,UAAU,GAAG,GAAG,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3B,CAAC;QAED,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAC9D,CAAC;CACF"}