a2a-memory 0.11.5 → 0.11.6

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 (259) hide show
  1. package/LICENSE +7 -19
  2. package/README.md +1 -1
  3. package/dist/a2a/client.js +1 -252
  4. package/dist/a2a/discovery.js +1 -115
  5. package/dist/a2a/index.js +1 -8
  6. package/dist/a2a/types.js +1 -42
  7. package/dist/adapters/anthropic.js +1 -117
  8. package/dist/chunking/chunker.js +1 -163
  9. package/dist/claude/sync.js +1 -298
  10. package/dist/cli/commands/add.js +1 -80
  11. package/dist/cli/commands/claude-sync.js +1 -70
  12. package/dist/cli/commands/cleanup.js +1 -83
  13. package/dist/cli/commands/config.js +1 -79
  14. package/dist/cli/commands/edit.js +1 -69
  15. package/dist/cli/commands/embed.js +1 -92
  16. package/dist/cli/commands/extract.js +1 -103
  17. package/dist/cli/commands/health.js +1 -105
  18. package/dist/cli/commands/list.js +1 -46
  19. package/dist/cli/commands/migrate-chunks.js +1 -205
  20. package/dist/cli/commands/migrate-file-refs.js +1 -183
  21. package/dist/cli/commands/proficiency.js +1 -146
  22. package/dist/cli/commands/rm.js +1 -64
  23. package/dist/cli/commands/search.js +1 -90
  24. package/dist/cli/commands/setup-wizard.js +1 -387
  25. package/dist/cli/commands/setup.js +1 -170
  26. package/dist/cli/commands/skill.js +1 -151
  27. package/dist/cli/commands/status.js +1 -70
  28. package/dist/cli/commands/sync.js +1 -202
  29. package/dist/cli/commands/team.js +1 -142
  30. package/dist/cli/index.js +1 -87
  31. package/dist/config/manager.js +1 -372
  32. package/dist/db/database.js +1 -1400
  33. package/dist/embedding/e5-provider.js +1 -147
  34. package/dist/embedding/index.js +1 -34
  35. package/dist/embedding/local-provider.js +1 -157
  36. package/dist/embedding/openai-provider.js +1 -92
  37. package/dist/embedding/quantization.js +1 -89
  38. package/dist/extraction/dedup-manager.js +1 -161
  39. package/dist/extraction/emotion-filter.js +1 -33
  40. package/dist/extraction/extractor.js +1 -648
  41. package/dist/extraction/file-reference.js +1 -77
  42. package/dist/extraction/filter.js +1 -86
  43. package/dist/extraction/scorer.js +1 -142
  44. package/dist/extraction/similarity.js +1 -85
  45. package/dist/hooks/client-factory.js +1 -44
  46. package/dist/hooks/post-tool-use.js +1 -518
  47. package/dist/hooks/pre-compact.js +1 -209
  48. package/dist/hooks/session-end.js +1 -633
  49. package/dist/hooks/session-start.js +1 -549
  50. package/dist/hooks/shared.js +1 -110
  51. package/dist/hooks/user-prompt-submit.js +1 -316
  52. package/dist/i18n/index.js +1 -2
  53. package/dist/i18n/messages.js +1 -150
  54. package/dist/index.js +1 -43
  55. package/dist/lifecycle/cleanup-scheduler.js +1 -137
  56. package/dist/lifecycle/cleanup.js +1 -116
  57. package/dist/lifecycle/index.js +1 -13
  58. package/dist/lifecycle/quality-scorer.js +1 -46
  59. package/dist/lifecycle/tiering.js +1 -246
  60. package/dist/llm/client.js +1 -226
  61. package/dist/llm/index.js +1 -5
  62. package/dist/proficiency/actr-engine.js +1 -106
  63. package/dist/proficiency/detection.js +1 -77
  64. package/dist/proficiency/index.js +1 -9
  65. package/dist/proficiency/tracker.js +1 -173
  66. package/dist/proficiency/types.js +1 -8
  67. package/dist/providers/adapters.js +1 -140
  68. package/dist/providers/detector.js +1 -57
  69. package/dist/search/adaptive-router.js +1 -93
  70. package/dist/search/index.js +1 -9
  71. package/dist/search/ranker.js +1 -171
  72. package/dist/search/reranker.js +1 -155
  73. package/dist/session/parser.js +1 -130
  74. package/dist/skill/evaluator.js +1 -509
  75. package/dist/skill/index.js +1 -7
  76. package/dist/skill/types.js +1 -7
  77. package/dist/sync/client.js +1 -597
  78. package/dist/sync/encryption.js +1 -203
  79. package/dist/sync/index.js +1 -12
  80. package/dist/sync/queue.js +1 -214
  81. package/dist/sync/scheduler.js +1 -140
  82. package/dist/sync/synchronizer.js +1 -241
  83. package/dist/sync/team-synchronizer.js +1 -204
  84. package/dist/sync/vector-clock.js +1 -70
  85. package/dist/types/index.d.ts +1 -1
  86. package/dist/types/index.js +1 -132
  87. package/dist/utils/keychain.js +1 -170
  88. package/dist/utils/logger.js +1 -128
  89. package/package.json +14 -10
  90. package/dist/a2a/client.d.ts.map +0 -1
  91. package/dist/a2a/client.js.map +0 -1
  92. package/dist/a2a/discovery.d.ts.map +0 -1
  93. package/dist/a2a/discovery.js.map +0 -1
  94. package/dist/a2a/index.d.ts.map +0 -1
  95. package/dist/a2a/index.js.map +0 -1
  96. package/dist/a2a/types.d.ts.map +0 -1
  97. package/dist/a2a/types.js.map +0 -1
  98. package/dist/adapters/anthropic.d.ts.map +0 -1
  99. package/dist/adapters/anthropic.js.map +0 -1
  100. package/dist/chunking/chunker.d.ts.map +0 -1
  101. package/dist/chunking/chunker.js.map +0 -1
  102. package/dist/claude/sync.d.ts.map +0 -1
  103. package/dist/claude/sync.js.map +0 -1
  104. package/dist/cli/commands/add.d.ts.map +0 -1
  105. package/dist/cli/commands/add.js.map +0 -1
  106. package/dist/cli/commands/claude-sync.d.ts.map +0 -1
  107. package/dist/cli/commands/claude-sync.js.map +0 -1
  108. package/dist/cli/commands/cleanup.d.ts.map +0 -1
  109. package/dist/cli/commands/cleanup.js.map +0 -1
  110. package/dist/cli/commands/config.d.ts.map +0 -1
  111. package/dist/cli/commands/config.js.map +0 -1
  112. package/dist/cli/commands/edit.d.ts.map +0 -1
  113. package/dist/cli/commands/edit.js.map +0 -1
  114. package/dist/cli/commands/embed.d.ts.map +0 -1
  115. package/dist/cli/commands/embed.js.map +0 -1
  116. package/dist/cli/commands/extract.d.ts.map +0 -1
  117. package/dist/cli/commands/extract.js.map +0 -1
  118. package/dist/cli/commands/health.d.ts.map +0 -1
  119. package/dist/cli/commands/health.js.map +0 -1
  120. package/dist/cli/commands/list.d.ts.map +0 -1
  121. package/dist/cli/commands/list.js.map +0 -1
  122. package/dist/cli/commands/migrate-chunks.d.ts.map +0 -1
  123. package/dist/cli/commands/migrate-chunks.js.map +0 -1
  124. package/dist/cli/commands/migrate-file-refs.d.ts.map +0 -1
  125. package/dist/cli/commands/migrate-file-refs.js.map +0 -1
  126. package/dist/cli/commands/proficiency.d.ts.map +0 -1
  127. package/dist/cli/commands/proficiency.js.map +0 -1
  128. package/dist/cli/commands/rm.d.ts.map +0 -1
  129. package/dist/cli/commands/rm.js.map +0 -1
  130. package/dist/cli/commands/search.d.ts.map +0 -1
  131. package/dist/cli/commands/search.js.map +0 -1
  132. package/dist/cli/commands/setup-wizard.d.ts.map +0 -1
  133. package/dist/cli/commands/setup-wizard.js.map +0 -1
  134. package/dist/cli/commands/setup.d.ts.map +0 -1
  135. package/dist/cli/commands/setup.js.map +0 -1
  136. package/dist/cli/commands/skill.d.ts.map +0 -1
  137. package/dist/cli/commands/skill.js.map +0 -1
  138. package/dist/cli/commands/status.d.ts.map +0 -1
  139. package/dist/cli/commands/status.js.map +0 -1
  140. package/dist/cli/commands/sync.d.ts.map +0 -1
  141. package/dist/cli/commands/sync.js.map +0 -1
  142. package/dist/cli/commands/team.d.ts.map +0 -1
  143. package/dist/cli/commands/team.js.map +0 -1
  144. package/dist/cli/index.d.ts.map +0 -1
  145. package/dist/cli/index.js.map +0 -1
  146. package/dist/config/manager.d.ts.map +0 -1
  147. package/dist/config/manager.js.map +0 -1
  148. package/dist/db/database.d.ts.map +0 -1
  149. package/dist/db/database.js.map +0 -1
  150. package/dist/embedding/e5-provider.d.ts.map +0 -1
  151. package/dist/embedding/e5-provider.js.map +0 -1
  152. package/dist/embedding/index.d.ts.map +0 -1
  153. package/dist/embedding/index.js.map +0 -1
  154. package/dist/embedding/local-provider.d.ts.map +0 -1
  155. package/dist/embedding/local-provider.js.map +0 -1
  156. package/dist/embedding/openai-provider.d.ts.map +0 -1
  157. package/dist/embedding/openai-provider.js.map +0 -1
  158. package/dist/embedding/quantization.d.ts.map +0 -1
  159. package/dist/embedding/quantization.js.map +0 -1
  160. package/dist/extraction/dedup-manager.d.ts.map +0 -1
  161. package/dist/extraction/dedup-manager.js.map +0 -1
  162. package/dist/extraction/emotion-filter.d.ts.map +0 -1
  163. package/dist/extraction/emotion-filter.js.map +0 -1
  164. package/dist/extraction/extractor.d.ts.map +0 -1
  165. package/dist/extraction/extractor.js.map +0 -1
  166. package/dist/extraction/file-reference.d.ts.map +0 -1
  167. package/dist/extraction/file-reference.js.map +0 -1
  168. package/dist/extraction/filter.d.ts.map +0 -1
  169. package/dist/extraction/filter.js.map +0 -1
  170. package/dist/extraction/scorer.d.ts.map +0 -1
  171. package/dist/extraction/scorer.js.map +0 -1
  172. package/dist/extraction/similarity.d.ts.map +0 -1
  173. package/dist/extraction/similarity.js.map +0 -1
  174. package/dist/hooks/client-factory.d.ts.map +0 -1
  175. package/dist/hooks/client-factory.js.map +0 -1
  176. package/dist/hooks/post-tool-use.d.ts.map +0 -1
  177. package/dist/hooks/post-tool-use.js.map +0 -1
  178. package/dist/hooks/pre-compact.d.ts.map +0 -1
  179. package/dist/hooks/pre-compact.js.map +0 -1
  180. package/dist/hooks/session-end.d.ts.map +0 -1
  181. package/dist/hooks/session-end.js.map +0 -1
  182. package/dist/hooks/session-start.d.ts.map +0 -1
  183. package/dist/hooks/session-start.js.map +0 -1
  184. package/dist/hooks/shared.d.ts.map +0 -1
  185. package/dist/hooks/shared.js.map +0 -1
  186. package/dist/hooks/user-prompt-submit.d.ts.map +0 -1
  187. package/dist/hooks/user-prompt-submit.js.map +0 -1
  188. package/dist/i18n/index.d.ts.map +0 -1
  189. package/dist/i18n/index.js.map +0 -1
  190. package/dist/i18n/messages.d.ts.map +0 -1
  191. package/dist/i18n/messages.js.map +0 -1
  192. package/dist/index.d.ts.map +0 -1
  193. package/dist/index.js.map +0 -1
  194. package/dist/lifecycle/cleanup-scheduler.d.ts.map +0 -1
  195. package/dist/lifecycle/cleanup-scheduler.js.map +0 -1
  196. package/dist/lifecycle/cleanup.d.ts.map +0 -1
  197. package/dist/lifecycle/cleanup.js.map +0 -1
  198. package/dist/lifecycle/index.d.ts.map +0 -1
  199. package/dist/lifecycle/index.js.map +0 -1
  200. package/dist/lifecycle/quality-scorer.d.ts.map +0 -1
  201. package/dist/lifecycle/quality-scorer.js.map +0 -1
  202. package/dist/lifecycle/tiering.d.ts.map +0 -1
  203. package/dist/lifecycle/tiering.js.map +0 -1
  204. package/dist/llm/client.d.ts.map +0 -1
  205. package/dist/llm/client.js.map +0 -1
  206. package/dist/llm/index.d.ts.map +0 -1
  207. package/dist/llm/index.js.map +0 -1
  208. package/dist/proficiency/actr-engine.d.ts.map +0 -1
  209. package/dist/proficiency/actr-engine.js.map +0 -1
  210. package/dist/proficiency/detection.d.ts.map +0 -1
  211. package/dist/proficiency/detection.js.map +0 -1
  212. package/dist/proficiency/index.d.ts.map +0 -1
  213. package/dist/proficiency/index.js.map +0 -1
  214. package/dist/proficiency/tracker.d.ts.map +0 -1
  215. package/dist/proficiency/tracker.js.map +0 -1
  216. package/dist/proficiency/types.d.ts.map +0 -1
  217. package/dist/proficiency/types.js.map +0 -1
  218. package/dist/providers/adapters.d.ts.map +0 -1
  219. package/dist/providers/adapters.js.map +0 -1
  220. package/dist/providers/detector.d.ts.map +0 -1
  221. package/dist/providers/detector.js.map +0 -1
  222. package/dist/search/adaptive-router.d.ts.map +0 -1
  223. package/dist/search/adaptive-router.js.map +0 -1
  224. package/dist/search/index.d.ts.map +0 -1
  225. package/dist/search/index.js.map +0 -1
  226. package/dist/search/ranker.d.ts.map +0 -1
  227. package/dist/search/ranker.js.map +0 -1
  228. package/dist/search/reranker.d.ts.map +0 -1
  229. package/dist/search/reranker.js.map +0 -1
  230. package/dist/session/parser.d.ts.map +0 -1
  231. package/dist/session/parser.js.map +0 -1
  232. package/dist/skill/evaluator.d.ts.map +0 -1
  233. package/dist/skill/evaluator.js.map +0 -1
  234. package/dist/skill/index.d.ts.map +0 -1
  235. package/dist/skill/index.js.map +0 -1
  236. package/dist/skill/types.d.ts.map +0 -1
  237. package/dist/skill/types.js.map +0 -1
  238. package/dist/sync/client.d.ts.map +0 -1
  239. package/dist/sync/client.js.map +0 -1
  240. package/dist/sync/encryption.d.ts.map +0 -1
  241. package/dist/sync/encryption.js.map +0 -1
  242. package/dist/sync/index.d.ts.map +0 -1
  243. package/dist/sync/index.js.map +0 -1
  244. package/dist/sync/queue.d.ts.map +0 -1
  245. package/dist/sync/queue.js.map +0 -1
  246. package/dist/sync/scheduler.d.ts.map +0 -1
  247. package/dist/sync/scheduler.js.map +0 -1
  248. package/dist/sync/synchronizer.d.ts.map +0 -1
  249. package/dist/sync/synchronizer.js.map +0 -1
  250. package/dist/sync/team-synchronizer.d.ts.map +0 -1
  251. package/dist/sync/team-synchronizer.js.map +0 -1
  252. package/dist/sync/vector-clock.d.ts.map +0 -1
  253. package/dist/sync/vector-clock.js.map +0 -1
  254. package/dist/types/index.d.ts.map +0 -1
  255. package/dist/types/index.js.map +0 -1
  256. package/dist/utils/keychain.d.ts.map +0 -1
  257. package/dist/utils/keychain.js.map +0 -1
  258. package/dist/utils/logger.d.ts.map +0 -1
  259. package/dist/utils/logger.js.map +0 -1
@@ -1,549 +1 @@
1
- /**
2
- * SessionStart Hook
3
- *
4
- * Claude Code 세션 시작 시 실행됩니다.
5
- * Progressive Disclosure: compact 인덱스 모드로 출력합니다.
6
- * 상세 내용은 CLI `a2a-memory search`로 확인 가능.
7
- */
8
- import { basename } from 'node:path';
9
- import { getSharedDb, closeSharedDb, normalizeHookInput } from './shared.js';
10
- import { ConfigManager } from '../config/manager.js';
11
- import { createHookClient } from './client-factory.js';
12
- import { MemorySynchronizer } from '../sync/synchronizer.js';
13
- import { deduplicateByEmbedding } from '../extraction/similarity.js';
14
- import { HybridRanker } from '../search/ranker.js';
15
- import { AdaptiveRouter } from '../search/adaptive-router.js';
16
- import { createLogger } from '../utils/logger.js';
17
- /**
18
- * 동일 Parent의 인접 chunk 병합
19
- * - 같은 Parent에서 2개 이상 Child가 히트되면 → Parent content로 대체
20
- * - 토큰 버짓 내에서만
21
- */
22
- function mergeParentChunks(selectedMemories, db, maxTokens) {
23
- // parentId별 그룹화
24
- const parentGroups = new Map();
25
- const independent = [];
26
- for (const item of selectedMemories) {
27
- if (item.memory.parentId) {
28
- const group = parentGroups.get(item.memory.parentId) ?? [];
29
- group.push(item);
30
- parentGroups.set(item.memory.parentId, group);
31
- }
32
- else {
33
- independent.push(item);
34
- }
35
- }
36
- const result = [...independent];
37
- let cumulativeParentTokens = 0;
38
- const maxParentBudget = maxTokens * 0.5; // Parent 대체에 할당할 최대 토큰
39
- for (const [parentId, children] of parentGroups) {
40
- if (children.length >= 2) {
41
- // 2개 이상 Child → Parent로 대체 시도
42
- const parent = db.getMemory(parentId);
43
- if (parent) {
44
- const parentTokens = Math.ceil(parent.content.length / 4);
45
- if (cumulativeParentTokens + parentTokens <= maxParentBudget) {
46
- result.push({ memory: parent, score: Math.max(...children.map(c => c.score)) });
47
- cumulativeParentTokens += parentTokens;
48
- continue;
49
- }
50
- }
51
- }
52
- // Parent 대체 불가 시 Children 그대로 사용
53
- result.push(...children);
54
- }
55
- return result;
56
- }
57
- /**
58
- * 프로젝트 경로에서 컨텍스트 인식 검색 쿼리 생성
59
- * 프로젝트명 토큰 + 최근 메모리 태그 결합
60
- */
61
- function buildSearchQuery(projectPath, db) {
62
- const name = basename(projectPath);
63
- const baseKeywords = name.split(/[-_.]/).filter((k) => k.length > 1);
64
- if (!db)
65
- return baseKeywords.join(' ');
66
- // 1. 최근 메모리에서 핵심 태그 추출
67
- const recentMemories = db.listMemories({
68
- projectPath,
69
- limit: 10,
70
- });
71
- const recentTags = new Set();
72
- for (const mem of recentMemories) {
73
- for (const tag of (mem.tags || [])) {
74
- if (tag.length > 2 && !tag.startsWith('session:') && !tag.startsWith('claude-md')) {
75
- recentTags.add(tag);
76
- }
77
- }
78
- }
79
- // 2. 최근 메모리 content에서 TF-IDF 스타일 키워드 추출 (새로 추가)
80
- const STOP_WORDS = new Set([
81
- 'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
82
- 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',
83
- 'should', 'may', 'might', 'can', 'shall', 'to', 'of', 'in', 'for',
84
- 'on', 'with', 'at', 'by', 'from', 'as', 'into', 'through', 'during',
85
- 'and', 'but', 'or', 'nor', 'not', 'so', 'yet', 'both', 'either',
86
- 'this', 'that', 'these', 'those', 'it', 'its', 'i', 'we', 'you',
87
- 'he', 'she', 'they', 'me', 'him', 'her', 'us', 'them', 'my', 'your',
88
- 'his', 'our', 'their', 'what', 'which', 'who', 'when', 'where', 'how',
89
- 'all', 'each', 'every', 'any', 'few', 'more', 'most', 'some', 'such',
90
- 'no', 'only', 'same', 'than', 'too', 'very', 'just', 'also', 'now',
91
- ]);
92
- const wordFreq = new Map();
93
- for (const mem of recentMemories) {
94
- const words = mem.content
95
- .toLowerCase()
96
- .replace(/[^a-z가-힣0-9\s]/g, ' ')
97
- .split(/\s+/)
98
- .filter(w => w.length > 2 && !STOP_WORDS.has(w) && !/^\d+$/.test(w));
99
- for (const w of words) {
100
- wordFreq.set(w, (wordFreq.get(w) || 0) + 1);
101
- }
102
- }
103
- // 빈도 Top 5 키워드 추출 (프로젝트명과 중복 제거)
104
- const baseSet = new Set(baseKeywords.map(k => k.toLowerCase()));
105
- const contentKeywords = [...wordFreq.entries()]
106
- .sort((a, b) => b[1] - a[1])
107
- .filter(([w]) => !baseSet.has(w))
108
- .slice(0, 5)
109
- .map(([w]) => w);
110
- // 3. 프로젝트명 + 태그 + content 키워드 결합 (최대 10 키워드)
111
- const allKeywords = [...baseKeywords, ...Array.from(recentTags).slice(0, 3), ...contentKeywords];
112
- return allKeywords.slice(0, 10).join(' ');
113
- }
114
- /** 카테고리 표시 레이블 */
115
- const CATEGORY_LABELS = {
116
- error_solution: 'Known Issues & Solutions',
117
- convention: 'Project Conventions',
118
- decision: 'Architecture Decisions',
119
- code_pattern: 'Code Patterns',
120
- skill: 'Active Skills',
121
- learning: 'Learnings',
122
- context: 'Project Context',
123
- };
124
- /** 카테고리 출력 우선순위 */
125
- const CATEGORY_ORDER = ['error_solution', 'convention', 'decision', 'code_pattern', 'skill', 'learning', 'context'];
126
- /** error_solution 카테고리 상한 */
127
- const ERROR_SOLUTION_MAX = 3;
128
- /**
129
- * 카테고리 다양성을 보장하는 메모리 선택
130
- * - error_solution 최대 ERROR_SOLUTION_MAX개 (상한)
131
- * - skill, decision, convention 각 최소 1개 (있으면)
132
- * - 나머지 슬롯은 점수순
133
- */
134
- function selectWithCategoryDiversity(sortedResults, limit) {
135
- if (sortedResults.length <= limit)
136
- return sortedResults;
137
- const selected = [];
138
- const used = new Set();
139
- // 카테고리별 그룹화
140
- const byCat = new Map();
141
- for (const item of sortedResults) {
142
- const cat = item.memory.category;
143
- if (!byCat.has(cat))
144
- byCat.set(cat, []);
145
- byCat.get(cat).push(item);
146
- }
147
- // 1. 우선 보장 카테고리: skill, decision, convention 각 최소 1개
148
- const priorityCategories = ['skill', 'decision', 'convention'];
149
- for (const cat of priorityCategories) {
150
- const items = byCat.get(cat);
151
- if (items && items.length > 0 && selected.length < limit) {
152
- const pick = items[0]; // 점수 내림차순이므로 첫 번째가 최고
153
- selected.push(pick);
154
- used.add(pick.memory.id);
155
- }
156
- }
157
- // 2. error_solution 상한 적용
158
- const errorItems = byCat.get('error_solution') ?? [];
159
- let errorCount = 0;
160
- for (const item of errorItems) {
161
- if (errorCount >= ERROR_SOLUTION_MAX)
162
- break;
163
- if (used.has(item.memory.id))
164
- continue;
165
- if (selected.length >= limit)
166
- break;
167
- selected.push(item);
168
- used.add(item.memory.id);
169
- errorCount++;
170
- }
171
- // 3. 나머지 슬롯은 점수순으로 채움
172
- for (const item of sortedResults) {
173
- if (selected.length >= limit)
174
- break;
175
- if (used.has(item.memory.id))
176
- continue;
177
- selected.push(item);
178
- used.add(item.memory.id);
179
- }
180
- // 점수 내림차순 재정렬 (출력 일관성)
181
- selected.sort((a, b) => b.score - a.score);
182
- return selected;
183
- }
184
- /**
185
- * 여러 줄 콘텐츠를 지정 길이로 요약
186
- */
187
- function summarizeMultiline(content, maxLen) {
188
- const lines = content.split('\n').filter((l) => l.trim());
189
- let result = '';
190
- for (const line of lines) {
191
- if ((result + ' ' + line).length > maxLen)
192
- break;
193
- result += (result ? ' ' : '') + line.trim();
194
- }
195
- return result || content.slice(0, maxLen) + '…';
196
- }
197
- /**
198
- * 구조화된 메모리 출력 포맷 생성
199
- */
200
- function formatMemoryOutput(selectedMemories, teamMemories, _projectPath, proficiencyMap) {
201
- const lines = ['<!-- A2A Memory Context -->'];
202
- // 카테고리별 그룹화
203
- const grouped = new Map();
204
- for (const m of selectedMemories) {
205
- const cat = m.memory.category;
206
- if (!grouped.has(cat))
207
- grouped.set(cat, []);
208
- grouped.get(cat).push(m);
209
- }
210
- // 우선순위 순서로 출력
211
- for (const cat of CATEGORY_ORDER) {
212
- const items = grouped.get(cat);
213
- if (!items || items.length === 0)
214
- continue;
215
- const label = CATEGORY_LABELS[cat] || cat;
216
- lines.push(`\n### ${label}`);
217
- for (const { memory } of items) {
218
- const summary = summarizeMultiline(memory.content, 500);
219
- // 스킬 카테고리: 숙련도 레벨 표시
220
- if (cat === 'skill' && proficiencyMap && proficiencyMap.size > 0) {
221
- // skill_name 매칭: content 첫 줄 또는 태그에서 이름 추출
222
- const skillName = memory.content.split('\n')[0].slice(0, 50).trim();
223
- const level = proficiencyMap.get(skillName);
224
- const levelSuffix = level !== undefined ? ` [Lv.${level}]` : '';
225
- lines.push(`- ${summary}${levelSuffix}`);
226
- }
227
- else {
228
- lines.push(`- ${summary}`);
229
- }
230
- }
231
- }
232
- // 팀 메모리
233
- if (teamMemories.length > 0) {
234
- lines.push('\n### Team Insights');
235
- for (const tm of teamMemories) {
236
- lines.push(`- [${tm.category}] ${summarizeMultiline(tm.content, 150)}`);
237
- }
238
- }
239
- lines.push('');
240
- lines.push('💡 `a2a-memory search <query>` for details.');
241
- lines.push('<!-- /A2A Memory Context -->');
242
- return lines.join('\n');
243
- }
244
- /** pull 동기화 로직 (fire-and-forget) */
245
- async function pullRemoteMemories(config, db) {
246
- if (!config.autoSync.enabled || !config.autoSync.pullOnSessionStart || !config.server.apiKey)
247
- return;
248
- const client = createHookClient(config, 5000); // fire-and-forget이지만 이벤트 루프 유지 방지
249
- if (!client)
250
- return;
251
- if (config.mode === 'team' && config.team) {
252
- // 팀 모드: TeamSynchronizer로 pull
253
- try {
254
- const { TeamSynchronizer } = await import('../sync/team-synchronizer.js');
255
- const teamSync = new TeamSynchronizer(db, client, config.team.teamPath, config.team.nodeId);
256
- teamSync.pullFromTeam().catch((err) => {
257
- console.error('[a2a] Team pull failed (background):', err instanceof Error ? err.message : String(err));
258
- });
259
- }
260
- catch {
261
- // TeamSynchronizer 미설치 시 무시
262
- }
263
- }
264
- else {
265
- const synchronizer = new MemorySynchronizer(db, client);
266
- synchronizer.pull().catch((err) => {
267
- console.error('[a2a] Background pull failed, using local cache:', err instanceof Error ? err.message : String(err));
268
- });
269
- }
270
- }
271
- /** 메모리 검색 및 필터링 */
272
- async function fetchRelevantMemories(context, config, db, logger) {
273
- const limit = config.autoInject.maxMemories;
274
- // 1차: FTS 검색 (프로젝트명 + 최근 태그 기반)
275
- const query = buildSearchQuery(context.projectPath, db);
276
- const ftsResults = query ? db.search({ query, limit }) : [];
277
- logger.info('FTS search', { count: ftsResults.length, query });
278
- // AdaptiveRouter로 쿼리 복잡도 분류 (<1ms, 규칙 기반)
279
- const router = new AdaptiveRouter();
280
- const routing = router.classify(query);
281
- logger.debug('Query routing', { complexity: routing.complexity, reason: routing.reason });
282
- let results;
283
- // 2차: 벡터 검색 활성 조건 (routing + embedding config 모두 충족)
284
- if (routing.useVector && config.embedding?.enabled) {
285
- try {
286
- const { createEmbeddingProvider } = await import('../embedding/index.js');
287
- const provider = createEmbeddingProvider(config.embedding, config.llm);
288
- // 쿼리 임베딩 생성 (동기/비동기 대응)
289
- const queryText = query || basename(context.projectPath);
290
- const queryEmbedding = await Promise.resolve(provider.embed(queryText));
291
- // 벡터 검색
292
- const vectorResults = db.searchByVector(queryEmbedding, limit);
293
- // 최근 메모리
294
- const recentMemories = db.listMemories({ limit, projectPath: context.projectPath });
295
- // HybridRanker로 통합 (부스트 활성화)
296
- const ranker = new HybridRanker({
297
- categoryBoost: true,
298
- tierBoost: true,
299
- recencyDecay: true,
300
- });
301
- let ranked = ranker.rank(ftsResults, vectorResults, recentMemories);
302
- // 3차: Reranker 적용 (complex 쿼리 시 top-20 → limit으로 정제)
303
- if (routing.useReranker) {
304
- try {
305
- const { CrossEncoderReranker } = await import('../search/reranker.js');
306
- const reranker = new CrossEncoderReranker();
307
- // top-20을 rerank하여 limit개로 줄임
308
- const candidates = ranked.slice(0, 20);
309
- ranked = await reranker.rerank(query, candidates, limit);
310
- logger.debug('Reranking applied', { candidates: candidates.length, output: ranked.length });
311
- }
312
- catch {
313
- // Reranker 실패 시 기존 결과 사용 (graceful degradation)
314
- logger.debug('Reranker unavailable, using hybrid results');
315
- }
316
- }
317
- results = ranked.slice(0, limit).map(r => ({
318
- memory: r.memory,
319
- score: r.score,
320
- matchType: 'hybrid',
321
- }));
322
- logger.info('Hybrid search', { count: results.length, routing: routing.complexity });
323
- }
324
- catch (embErr) {
325
- // 임베딩 실패 시 FTS 결과만 사용
326
- logger.warn('Embedding search failed', { error: embErr instanceof Error ? embErr.message : String(embErr) });
327
- results = ftsResults;
328
- }
329
- }
330
- else {
331
- // 임베딩 비활성 또는 simple 쿼리: FTS 검색 + 벡터 폴백 유지 (하위호환)
332
- results = ftsResults;
333
- // FTS 결과 부족 시 벡터 검색 폴백
334
- if (results.length < limit) {
335
- try {
336
- // 최근 메모리에서 임베딩 기반 보충
337
- const allMemories = db.listMemories({ limit: limit * 2, projectPath: context.projectPath });
338
- const withEmbedding = allMemories.filter((m) => m.embedding && m.embedding.length > 0);
339
- if (withEmbedding.length > 0) {
340
- // 이미 결과에 있는 ID 제외
341
- const existingIds = new Set(results.map((r) => r.memory.id));
342
- const additional = withEmbedding
343
- .filter((m) => !existingIds.has(m.id))
344
- .slice(0, limit - results.length)
345
- .map((m) => ({
346
- memory: m,
347
- score: 0.5, // 벡터 폴백 기본 점수
348
- matchType: 'vector',
349
- }));
350
- results.push(...additional);
351
- }
352
- }
353
- catch (vecErr) {
354
- // 벡터 검색 실패 무시
355
- logger.warn('Vector fallback failed', { error: vecErr instanceof Error ? vecErr.message : String(vecErr) });
356
- }
357
- }
358
- }
359
- return { results, query };
360
- }
361
- /** 팀 메모리 + proficiency 조회 */
362
- async function buildSkillInjection(context, config, query, limit, logger) {
363
- // 팀 메모리 검색 (team 모드, 3초 타임아웃)
364
- let teamMemoryData = [];
365
- if (config.mode === 'team' && config.team && config.server.apiKey) {
366
- try {
367
- const teamClient = createHookClient(config, 3000); // Hook에서는 짧은 타임아웃
368
- if (!teamClient)
369
- throw new Error('team client not available');
370
- const teamMemories = await teamClient.searchTeamMemories(config.team.teamPath, query, { limit: Math.min(3, limit) });
371
- teamMemoryData = teamMemories.map((tm) => ({
372
- category: tm.category,
373
- content: tm.content,
374
- }));
375
- }
376
- catch (teamErr) {
377
- // 팀 검색 실패 무시
378
- logger.warn('Team search failed', { error: teamErr instanceof Error ? teamErr.message : String(teamErr) });
379
- }
380
- }
381
- // Proficiency Level 표시 (서버에서 pull, 3초 타임아웃)
382
- let proficiencyMap = new Map();
383
- if (config.server?.apiKey && config.server?.url) {
384
- try {
385
- const profClient = createHookClient(config, 3000); // Hook에서는 짧은 타임아웃 (기본 60초 → 3초)
386
- const proficiencies = profClient ? await profClient.listProficiencies(context.projectPath) : [];
387
- if (proficiencies.length > 0) {
388
- proficiencyMap = new Map(proficiencies.map(p => [p.skill_name, p.level]));
389
- logger.debug('Fetched proficiency levels from server', { count: proficiencies.length });
390
- }
391
- }
392
- catch {
393
- // 서버 연결 실패 또는 타임아웃 시 무시 (Lv. 표시 생략)
394
- }
395
- }
396
- return { teamMemoryData, proficiencyMap };
397
- }
398
- /**
399
- * sessionId 해시의 마지막 비트로 A/B 그룹을 결정 (50:50).
400
- * - 'A': 기존 메모리 주입 수행
401
- * - 'B': 주입 건너뜀 (로깅만)
402
- */
403
- function resolveAbGroup(sessionId) {
404
- let hash = 0;
405
- for (let i = 0; i < sessionId.length; i++) {
406
- hash = (hash * 31 + sessionId.charCodeAt(i)) >>> 0;
407
- }
408
- return (hash & 1) === 0 ? 'A' : 'B';
409
- }
410
- export async function handleSessionStart(context) {
411
- const config = new ConfigManager().load();
412
- const logger = createLogger('SessionStart', config.logging);
413
- const startTime = performance.now();
414
- logger.info('Hook started', { projectPath: context.projectPath });
415
- if (!config.autoInject.enabled) {
416
- logger.info('Auto-inject disabled');
417
- logger.flush();
418
- return '';
419
- }
420
- // A/B 테스트: enabled 시 B그룹은 주입 건너뜀
421
- const abTestEnabled = config.abTest?.enabled === true;
422
- const abGroup = abTestEnabled ? resolveAbGroup(context.sessionId) : 'A';
423
- if (abTestEnabled && abGroup === 'B') {
424
- logger.info('A/B test: group B — skipping injection', { sessionId: context.sessionId });
425
- // B그룹 로그 기록 (주입 없음 표시)
426
- try {
427
- const db = getSharedDb(config.db.path);
428
- db.recordInjection({
429
- sessionId: context.sessionId,
430
- hookType: 'session_start',
431
- injectedMemoryIds: [],
432
- injectedKeywords: [],
433
- totalInjected: 0,
434
- abGroup: 'B',
435
- });
436
- }
437
- catch {
438
- // 로그 기록 실패는 비치명적
439
- }
440
- logger.flush();
441
- return '';
442
- }
443
- const db = getSharedDb(config.db.path);
444
- try {
445
- // Step 1: 백그라운드 pull (fire-and-forget)
446
- await pullRemoteMemories(config, db);
447
- // Step 2: 메모리 검색 및 필터링
448
- const { results, query } = await fetchRelevantMemories(context, config, db, logger);
449
- if (results.length === 0) {
450
- logger.info('No memories found');
451
- logger.flush();
452
- return '';
453
- }
454
- const limit = config.autoInject.maxMemories;
455
- // 코사인 중복 제거 (임베딩 있을 때)
456
- const memories = results.map((r) => r.memory);
457
- const deduped = deduplicateByEmbedding(memories);
458
- const dedupedIds = new Set(deduped.map((m) => m.id));
459
- const dedupedResults = results.filter((r) => dedupedIds.has(r.memory.id));
460
- // 점수 내림차순 정렬
461
- dedupedResults.sort((a, b) => b.score - a.score);
462
- // 실제로 출력할 메모리 선택 (카테고리 다양성 보장)
463
- const selectedMemories = selectWithCategoryDiversity(dedupedResults, limit);
464
- // Parent-Child 병합 (동일 Parent에서 다수 Child 히트 시 Parent content로 대체)
465
- const mergedMemories = mergeParentChunks(selectedMemories, db, config.autoInject.maxTokens);
466
- // 접근 추적: 주입되는 메모리의 access_count 증가
467
- // skill도 포함 — 순환 강화는 evaluator가 skill을 클러스터링 대상에서 제외하여 방지
468
- for (const { memory } of mergedMemories) {
469
- db.recordAccess(memory.id); // 세션 주입 시 접근 기록
470
- }
471
- // Step 3: 팀 메모리 + proficiency 조회
472
- const { teamMemoryData, proficiencyMap } = await buildSkillInjection(context, config, query, limit, logger);
473
- // 주입 효과 기록 (fire-and-forget, < 5ms)
474
- try {
475
- const keywords = mergedMemories.flatMap(({ memory }) => memory.content.toLowerCase().split(/\s+/).filter(w => w.length > 3).slice(0, 5));
476
- db.recordInjection({
477
- sessionId: context.sessionId,
478
- hookType: 'session_start',
479
- injectedMemoryIds: mergedMemories.map(({ memory }) => memory.id),
480
- injectedKeywords: [...new Set(keywords)].slice(0, 20),
481
- totalInjected: mergedMemories.length,
482
- abGroup: abTestEnabled ? abGroup : undefined,
483
- });
484
- }
485
- catch {
486
- // 효과 기록 실패는 비치명적
487
- }
488
- // 구조화된 포맷으로 출력
489
- const output = formatMemoryOutput(mergedMemories, teamMemoryData, context.projectPath, proficiencyMap);
490
- logger.info('Hook completed', {
491
- durationMs: Math.round(performance.now() - startTime),
492
- memories: mergedMemories.length,
493
- });
494
- logger.flush();
495
- return output;
496
- }
497
- finally {
498
- // DB는 싱글톤으로 관리 — close하지 않음
499
- }
500
- }
501
- /** 전체 Hook 안전 타임아웃 (초) */
502
- const HOOK_TIMEOUT_MS = 10_000;
503
- /**
504
- * CLI 엔트리포인트
505
- * stdin으로 HookContext JSON을 받아 처리
506
- * 전체 실행에 HOOK_TIMEOUT_MS 안전장치 적용
507
- */
508
- export async function main() {
509
- const chunks = [];
510
- for await (const chunk of process.stdin) {
511
- chunks.push(chunk);
512
- }
513
- const input = Buffer.concat(chunks).toString('utf-8').trim();
514
- if (!input) {
515
- closeSharedDb();
516
- process.exit(0);
517
- }
518
- // 전체 Hook 실행 안전장치: HOOK_TIMEOUT_MS 초과 시 강제 종료
519
- // unref()로 이 타이머만으로 이벤트 루프가 유지되지 않게 함
520
- const safetyTimer = setTimeout(() => {
521
- console.error(`[a2a] SessionStart safety timeout (${HOOK_TIMEOUT_MS}ms) — exiting gracefully`);
522
- closeSharedDb();
523
- process.exit(0);
524
- }, HOOK_TIMEOUT_MS);
525
- safetyTimer.unref();
526
- try {
527
- const raw = JSON.parse(input);
528
- const context = normalizeHookInput(raw);
529
- const output = await handleSessionStart(context);
530
- if (output) {
531
- process.stdout.write(output);
532
- }
533
- }
534
- catch (err) {
535
- console.error('[a2a] SessionStart error:', err instanceof Error ? err.message : err);
536
- }
537
- finally {
538
- closeSharedDb();
539
- // fire-and-forget 프로미스가 이벤트 루프를 붙잡고 있을 수 있으므로 명시적 종료
540
- process.exit(0);
541
- }
542
- }
543
- // 직접 실행 시에만 main() 호출
544
- const isMainModule = process.argv[1]?.endsWith('session-start.js') ||
545
- process.argv[1]?.endsWith('session-start.ts');
546
- if (isMainModule) {
547
- main();
548
- }
549
- //# sourceMappingURL=session-start.js.map
1
+ (function(_0x2a43f4,_0x5bd0ff){function _0x3b35ec(_0x1f899c,_0x54f419){return _0x35c1(_0x1f899c-0x397,_0x54f419);}function _0x4966f0(_0x3bd4da,_0x1f7b9e){return _0x35c1(_0x3bd4da- -0x3be,_0x1f7b9e);}const _0x9f61a2=_0x2a43f4();while(!![]){try{const _0x5c2f36=parseInt(_0x4966f0(-0x26f,-0x245))/0x1+-parseInt(_0x4966f0(-0x1da,-0x255))/0x2*(parseInt(_0x4966f0(-0x1f8,-0x1b3))/0x3)+-parseInt(_0x3b35ec(0x55a,0x5b4))/0x4+parseInt(_0x3b35ec(0x4ec,0x45c))/0x5+-parseInt(_0x3b35ec(0x5b8,0x56b))/0x6*(-parseInt(_0x4966f0(-0x12e,-0x1a6))/0x7)+-parseInt(_0x4966f0(-0x1b7,-0x1f6))/0x8*(-parseInt(_0x3b35ec(0x61d,0x59c))/0x9)+parseInt(_0x4966f0(-0x1f5,-0x1e7))/0xa*(parseInt(_0x3b35ec(0x580,0x614))/0xb);if(_0x5c2f36===_0x5bd0ff)break;else _0x9f61a2['push'](_0x9f61a2['shift']());}catch(_0x11e999){_0x9f61a2['push'](_0x9f61a2['shift']());}}}(_0x30c5,0x33cd7));import{basename}from'node:path';import{getSharedDb,closeSharedDb,normalizeHookInput}from'./shared.js';import{ConfigManager}from'../config/manager.js';import{createHookClient}from'./client-factory.js';import{MemorySynchronizer}from'../sync/synchronizer.js';function _0x345095(_0x4c4fde,_0x52e6db){return _0x35c1(_0x52e6db-0x57,_0x4c4fde);}import{deduplicateByEmbedding}from'../extraction/similarity.js';function _0x30c5(){const _0x3861d5=['C2TPBgXFBMfTzq','qwD1yNa','BfznC1m','AM9PBG','u2rpBMW','uMvYyw5RzxiGDq','u1ftC1a','C2XPy2u','uhjVAMvJDcbdBW','z3bis3e','C2vYDMvY','q0LSAwe','y2fU','DgHLBq','yxjNDG','Be5xCNG','zxH0ic0TpG','Aw9Uu3rHCNq','D2L0Aa','zw1VCNKGq29UDa','yxj0','sMLHtuu','lI4VC3LUyY90zq','zxjYB3jFC29SDq','y2XHC3nPzNK','y2XHDwrLlw1K','CMvZB2X2zq','zgvJAxnPB24','BxzNEgy','AK95zeS','DxnLvMvJDg9Y','B0HyCNC','uK9SD1C','BNzlyLa','DgvHBsbJBgLLBG','DxjS','C3rKAw4','B2Dgtxq','shLICMLKihnLyq','y2vPBa','D2HV','Ew91CG','ChjVAMvJDfbHDa','rLPgugm','D2HPy2G','pceTlsbbmKeGtq','vuDWsxG','DxPzBgG','CeLADLm','Aw9Uu3rHCNqGCW','Bgv3tgO','zgLK','s2XuA0m','y3fqA0C','BxD0sfa','rw1IzwrKAw5Nia','zw5KC1DPDgG','Aw5MBW','CfviExK','yxj0lMPZ','Bwf4twvTB3jPzq','C2v0','C29Tzq','ywzLDhKGDgLTzq','zKHdDNK','z3jVDxaGqIdIGjqG','C3rHCNrZv2L0Aa','uNPUsu0','CM91BMq','DgHLC2u','BM93','AwfKBhy','B2zPy2LLBMn5ia','CMvJB3jKsw5Qzq','zhvYAw5N','C2HHBgW','D3HlENK','yxbWBgLLza','twvTB3jPzxm','zwzdAxy','Aw9UCW','tvDhA2q','zwfgD0S','zNn6z1a','BxmPiokaLcbLEgL0','suDrseW','BeHNyvK','Aw9Uu3rHCNqGzq','uhblzNC','EwXmuNq','qxjJAgL0zwn0Dq','DMvJDg9Y','C2TPBgW','CM5Z','D2fYBG','mtaWndy5nKXYB3v2ua','DgLVBG','B3vY','m29lue9xAW','C2vZC2LVBL9ZDa','BMf2ywLSywjSzq','mtGXmhrtCeT2yG','BM90','y29UDgvUDa','CvfID3O','qxv0BY1PBMPLyW','zNjVBq','yxv0B1n5BMm','DgvHBvbHDgG','BgXT','BgLZDfbYB2zPyW','tLfVqMC','zw5HyMXLza','AgLT','DKzUuxC','AhLTt0K','Cvvdzwu','ChvZAa','qMHnCM4','zw1IzwrKAw5N','Bgv2zwW','A2vvrfC','z0jMDeu','Dujmyvm','sg9VAYbJB21WBa','DNjLC3u','Bw9ZDa','AgTsAfO','odi4nJy4wLnfs3zs','BgvK','tvPPtxi','ywrK','DgvHBq','ntaYn3rlC1nOBq','B25SEq','CMvYyw5RzxiUAG','Aw5N','A1nUtvK','zM9Y','DxrMltG','Bw9Kzq','ugTAD3a','AgvY','DLbvCeC','Agfvr1G','DxP0teG','BM9KzuLK','q3vNEKm','cImJiYbuzwfTia','C2L6zq','q0vZAMW','C2HL','w2eYyv0Gu2vZCW','y2f0zwDVCNK','yxbPs2v5','r05ty3K','zw50CMLLCW','C2vHCMnO','s25VD24GsxnZDq','AKPvA2G','zwL0AgvY','yw55','DwXSEq','mJC2odbAtK1cq3q','y29TCgXLEgL0Eq','CMvYyw5R','C29YDa','C3D5rhe','q29Kzsbqyxr0zq','uKfQywK','CgfYzw50swq','BffSs20','DgHYB3vNAa','tgrWwM8','DxnLuMvYyw5Rzq','r1nbwuu','yNv0','zuvqD3m','CwDYDha','ifTmDI4','Avj1tNO','tvrMtfq','vMjoAwe','BwLNAhq','Dg9zAg0','AgLZ','ywjuzxn0','yw0TC3LUy2HYBW','BNzLBNrPB25Z','mJrOt1POEhy','Ewv0','CMuGrgvJAxnPBW','AgfZ','uwzkswO','lI4VC2vHCMnOlW','wvDOwxq','DgHHBG','C2vZC2LVBJO','lcb1C2LUzYbOEq','rhzhD3O','zxjYB3i','uxbYBLe','uMvYyw5RAw5Nia','wxnYCuy','u2XNBgK','Bgv2zwXZigzYBW','rxn3zem','uwncuva','Avryqxi','DgHHDa','zwfJAa','Eg9uEKO','DgfNCW','y29UDgv4Da','zMXHDe1HCa','ANvZDa','B3v0icG','BcbJywnOztO','v0L4vge','AgfK','DgHVC2u','CxPMrxq','cImJiYa','Aw5NigDYywnLzG','BsbZzxj2zxi','u2HIC0e','vMvJDg9YigzHBa','q0zyCe8','q1DTDLm','DK9Rrfy','BMTmBNK','Bu52Aeu','C2TPChbPBMCGAq','rMv0y2HLzcbWCG','zuHRrwy','vKPWzue','BgvUz3rO','vwXsq2S','AhLICMLK','Bwf5','B3vUzcK6','BNrLEhq','Bg9Hza','twvTB3j5ienVBG','DLfWr1C','C2vZC2LVBI1ZDa','C3bSAxq','lI4Vzw1IzwrKAq','CNjVCJO','shHqvgu','C3vJAa','Agf2zq','Dgv4DcaTlt4','zgvIDwC','BwvZC2fNzq','D291Bgq','BLjpqwO','D2fZ','DcbKAxnHyMXLza','Cgf0Aa','yw5K','yKXowLm','ChvSBe9Uu2vZCW','CMnO','idXXDwvYEt5Gia','rwreveS','Dw5Yzwy','pceTlsaVqtjbia','y3rPB24','C2nVCMu','DgHLAxi','uNrUu1q','C2vZC2LVBKLK','BwfW','zMX1C2G','tM8GBwvTB3jPzq','Bwf4vg9Rzw5Z','y2f0y2G','DxnPBMCGBg9Jyq','8j+sOsbGytjHlw1LBq','r1PnsLe','ywXS','Bwf4','zMLSDgvY','Bg9Nz2LUzW','wgDVz1C','D2LSBa','sg9VAYbZDgfYDa','DgHLEq','qwn0AxzLifnRAq','ndvrvxbSwuW','CMvWBgfJzq','w2eYyv0GvgvHBq','uhfuCKi','z1DSwK8','wu9Tz3e','yMvLBG','DcbUB3qGyxzHAq','DgHPCW','zxzLCNK','mZG1mti2tffKswTh','AcbMywLSzwq','yvvLDfC','s2HyzeS','y291Bgq','DfbbBNK','qND0uum','s2L6Dee','Dg9V','zxHPDa','yxv0B0LUAMvJDa','BgvHCM5PBMC','tMTMvfq','sw5ZAwDODhm','AuDJCNO','yxjL','Dg9mB3DLCKnHCW','D3jPDgu','CMfUAW','CgfYC2u','AwvUy2LLCW','Dg9tDhjPBMC','z2v0','CMvJB3jKqwnJzq','DhjPBq','lsbB','mJi4mtmYA0HSsgjo','CKnZvgu','w2eYyv0GqMfJAW','ChvSBa','y29UDMvUDgLVBG','ufnIBg4','mty0nZm1mgfzzKHvAa','CYbMB3vUza','vff2BeK','u2vZC2LVBLn0yq','CgTrywm','yM90Aa','CMvHC29U','BwvTB3j5','rxjmCuK','z2v0twvTB3j5','D2vYzq','D2HHDa','BML6zxiUANm','Au52s2u','DgHL'];_0x30c5=function(){return _0x3861d5;};return _0x30c5();}import{HybridRanker}from'../search/ranker.js';import{AdaptiveRouter}from'../search/adaptive-router.js';import{createLogger}from'../utils/logger.js';function mergeParentChunks(_0x1a40b3,_0x18c9b0,_0x593686){const _0x514e67={'aUetW':'session_st'+_0x50944c(-0x21,-0x65),'MWGkd':function(_0xeb4779,_0x2d2840){return _0xeb4779*_0x2d2840;},'MTfLT':function(_0x2cc36d,_0x1063a5){return _0x2cc36d/_0x1063a5;},'Agubp':_0x50944c(-0x5,-0x24),'RAjai':_0xa6eadc(0x392,0x42d)},_0x1e4f57=new Map(),_0x3e6693=[];function _0x50944c(_0x4e1de6,_0x387674){return _0x35c1(_0x387674- -0x1dd,_0x4e1de6);}for(const _0x478511 of _0x1a40b3){if(_0x478511[_0xa6eadc(0x388,0x3f9)][_0x50944c(0x95,0x31)]){const _0x469b6f=_0x1e4f57[_0xa6eadc(0x377,0x368)](_0x478511['memory']['parentId'])??[];_0x469b6f['push'](_0x478511),_0x1e4f57['set'](_0x478511[_0xa6eadc(0x388,0x388)][_0xa6eadc(0x43a,0x401)],_0x469b6f);}else _0x3e6693[_0xa6eadc(0x405,0x4a9)](_0x478511);}const _0x39e2cb=[..._0x3e6693];let _0xb76abc=0x0;const _0x3a25ff=_0x514e67[_0x50944c(-0x32,-0x28)](_0x593686,0.5);function _0xa6eadc(_0x576838,_0x3e2ceb){return _0x35c1(_0x576838-0x22c,_0x3e2ceb);}for(const [_0x1f704a,_0x2b05e0]of _0x1e4f57){if(_0x2b05e0[_0xa6eadc(0x47c,0x40c)]>=0x2){const _0x791fac=_0x18c9b0[_0xa6eadc(0x38a,0x429)](_0x1f704a);if(_0x791fac){const _0x1065f2=Math[_0x50944c(-0xce,-0x52)](_0x514e67[_0x50944c(0xc8,0x3c)](_0x791fac[_0xa6eadc(0x3f7,0x370)]['length'],0x4));if(_0xb76abc+_0x1065f2<=_0x3a25ff){if(_0x514e67[_0xa6eadc(0x391,0x310)]!==_0x514e67[_0xa6eadc(0x439,0x4cf)]){_0x39e2cb['push']({'memory':_0x791fac,'score':Math[_0xa6eadc(0x4aa,0x4ca)](..._0x2b05e0[_0x50944c(0x124,0x98)](_0x5d762f=>_0x5d762f[_0x50944c(0xb8,0x94)]))}),_0xb76abc+=_0x1065f2;continue;}else{const _0x58101d=_0x217ded['flatMap'](({memory:_0x3143b1})=>_0x3143b1[_0xa6eadc(0x3f7,0x46e)][_0x50944c(-0xdd,-0x98)+'e']()['split'](/\s+/)[_0xa6eadc(0x4ab,0x42d)](_0x1268b4=>_0x1268b4[_0x50944c(0x9d,0x73)]>0x3)[_0x50944c(-0xa8,-0x72)](0x0,0x5));_0x5b2624[_0xa6eadc(0x3d9,0x453)+'ction']({'sessionId':_0x37e12c['sessionId'],'hookType':_0x514e67[_0xa6eadc(0x4be,0x52f)],'injectedMemoryIds':_0xa2792f['map'](({memory:_0x5cf00b})=>_0x5cf00b['id']),'injectedKeywords':[...new _0x3367f3(_0x58101d)][_0x50944c(0x2a,-0x72)](0x0,0x14),'totalInjected':_0x427e38[_0x50944c(0xf0,0x73)],'abGroup':_0x50cfc0?_0x130bbf:_0x1c585e});}}}}_0x39e2cb[_0x50944c(-0x8f,-0x4)](..._0x2b05e0);}return _0x39e2cb;}function buildSearchQuery(_0x3965ce,_0x78f082){const _0xe7b83d={'CWmvS':function(_0x3e8dc7,_0x3e386d){return _0x3e8dc7(_0x3e386d);},'bLNZS':_0x16e628(-0x101,-0xd9),'mwtHP':_0x16e628(-0x13a,-0x1ac),'eHkEf':_0x16e628(-0x19,-0xbe),'EswdC':_0x16e628(-0x11f,-0x15f),'ylLRt':_0x1baa67(-0xe5,-0x72),'fHCvy':_0x1baa67(-0x105,-0x10f),'GZMJQ':'does','YsrqF':_0x16e628(-0xe7,-0x133),'lNWrx':_0x1baa67(-0xc2,-0x3d),'wUlgc':_0x1baa67(-0xb0,-0x104),'UGpIx':'should','xrMWY':_0x16e628(-0x2b,-0x64),'nROAj':_0x16e628(-0x10e,-0x142),'lHgaY':_0x16e628(-0xcf,-0x11c),'mNvhE':_0x1baa67(-0x156,-0xd1),'lewLj':_0x16e628(-0x108,-0x171),'eaFwK':_0x16e628(-0x16,0x54),'QfJIj':'nor','RznIM':_0x16e628(-0x5c,0x4f),'QcBQP':_0x16e628(0x10,-0x20),'GSAYE':_0x1baa67(-0x10f,-0xad),'tPAny':_0x16e628(-0x3e,-0x94),'ReTBQ':'you','PpKfw':_0x1baa67(-0x152,-0xca),'oHXrw':_0x16e628(-0x61,-0x44),'vOkDV':_0x1baa67(-0xd2,-0x84),'mvgxf':_0x1baa67(-0x1b8,-0x23b),'uBLaS':'where','iadlv':'how','uMlAM':_0x16e628(-0x1,0x76),'ymsCG':_0x1baa67(-0x10e,-0x11c),'qzfEt':_0x1baa67(-0x162,-0xcb),'VbNia':_0x16e628(-0x20,0x2c),'rCsTe':_0x16e628(0x1a,0xc2),'HxPTe':'very'},_0x40320f=_0xe7b83d[_0x1baa67(-0xfc,-0x16a)](basename,_0x3965ce),_0x5c7510=_0x40320f['split'](/[-_.]/)['filter'](_0x3b8041=>_0x3b8041[_0x1baa67(-0xf4,-0x130)]>0x1);if(!_0x78f082)return _0x5c7510[_0x1baa67(-0x1dd,-0x218)]('\x20');function _0x16e628(_0x28910f,_0x322648){return _0x35c1(_0x28910f- -0x27e,_0x322648);}const _0x4c41c8=_0x78f082['listMemori'+'es']({'projectPath':_0x3965ce,'limit':0xa}),_0x380857=new Set();for(const _0x4f5225 of _0x4c41c8){for(const _0x27e8a2 of _0x4f5225[_0x1baa67(-0x10c,-0x77)]||[]){_0x27e8a2[_0x16e628(-0x2e,-0x9)]>0x2&&!_0x27e8a2['startsWith'](_0x16e628(-0x55,-0x7))&&!_0x27e8a2[_0x16e628(-0xd8,-0x68)](_0xe7b83d[_0x16e628(-0x15,-0x83)])&&_0x380857[_0x1baa67(-0x15d,-0x14e)](_0x27e8a2);}}const _0x815cce=new Set([_0x1baa67(-0x1e1,-0x1f5),'a','an','is',_0xe7b83d[_0x16e628(-0xe4,-0x67)],_0xe7b83d[_0x1baa67(-0xf6,-0x127)],_0xe7b83d[_0x16e628(-0x4c,-0xdc)],'be',_0x16e628(0xe,-0xa),'being',_0xe7b83d[_0x1baa67(-0x187,-0x176)],_0x1baa67(-0x120,-0x17c),_0xe7b83d[_0x16e628(-0xda,-0x117)],'do',_0xe7b83d[_0x1baa67(-0xc8,-0xb5)],_0xe7b83d[_0x1baa67(-0x115,-0x179)],_0xe7b83d[_0x16e628(-0x10b,-0x126)],_0x16e628(-0x1b,0x8),_0xe7b83d['wUlgc'],_0xe7b83d[_0x1baa67(-0x1b2,-0x11a)],_0xe7b83d['xrMWY'],_0x16e628(-0x63,0x2e),_0xe7b83d[_0x16e628(-0x1a,-0x4c)],_0xe7b83d[_0x16e628(-0xc4,-0x16)],'to','of','in',_0xe7b83d[_0x16e628(-0x33,0x21)],'on',_0xe7b83d[_0x1baa67(-0x1ae,-0x16a)],'at','by',_0x1baa67(-0x176,-0x19a),'as','into',_0x16e628(-0x6e,-0x76),_0x16e628(-0xd0,-0xaa),_0xe7b83d[_0x16e628(-0xc8,-0x108)],_0x16e628(-0x6a,-0xac),'or',_0xe7b83d[_0x1baa67(-0x11f,-0xf2)],_0x1baa67(-0x17a,-0x124),'so',_0xe7b83d[_0x1baa67(-0x19d,-0x20d)],_0x16e628(-0x124,-0x1b7),_0x16e628(-0x7a,-0xd2),_0xe7b83d[_0x16e628(-0x4b,0x58)],_0xe7b83d[_0x1baa67(-0x131,-0x169)],_0x1baa67(-0x19b,-0x23f),_0xe7b83d[_0x16e628(0x17,0x5a)],'it','its','i','we',_0xe7b83d['ReTBQ'],'he',_0x1baa67(-0x149,-0xb2),_0x16e628(0x6,-0x73),'me',_0x1baa67(-0x16f,-0xc4),_0xe7b83d[_0x16e628(-0xc2,-0x115)],'us',_0x16e628(-0x10d,-0x15e),'my',_0x16e628(-0xf1,-0x100),_0xe7b83d[_0x1baa67(-0x1c1,-0x12a)],_0x16e628(-0xb9,-0x153),_0xe7b83d[_0x16e628(-0x35,-0x92)],_0x1baa67(-0x1e4,-0x24a),_0x1baa67(-0x1b4,-0x1d3),_0xe7b83d[_0x16e628(-0xfe,-0xa0)],'when',_0xe7b83d[_0x1baa67(-0x165,-0x179)],_0xe7b83d[_0x16e628(-0xd3,-0x148)],_0xe7b83d['uMlAM'],_0xe7b83d['ymsCG'],_0x16e628(0x11,0x9),_0x1baa67(-0x13f,-0xe1),'few','more',_0xe7b83d[_0x1baa67(-0x103,-0x189)],_0x16e628(-0xdc,-0x103),_0xe7b83d[_0x1baa67(-0x12a,-0xf7)],'no',_0x16e628(-0x94,-0xc4),'same',_0x16e628(-0x56,-0xc9),_0xe7b83d[_0x16e628(-0x12e,-0x90)],_0xe7b83d[_0x16e628(-0x21,-0x29)],_0x16e628(-0x43,-0x61),'also',_0x1baa67(-0x19a,-0x148)]),_0x28aca2=new Map();for(const _0xba4a3c of _0x4c41c8){const _0x49a3a5=_0xba4a3c[_0x16e628(-0xb3,-0x12b)][_0x1baa67(-0x1ff,-0x159)+'e']()[_0x16e628(0x9,-0xa2)](/[^a-z가-힣0-9\s]/g,'\x20')[_0x16e628(-0x24,0x3e)](/\s+/)[_0x1baa67(-0xc5,-0x4d)](_0x2803ba=>_0x2803ba[_0x16e628(-0x2e,0x2c)]>0x2&&!_0x815cce['has'](_0x2803ba)&&!/^\d+$/['test'](_0x2803ba));for(const _0x4ada2f of _0x49a3a5){_0x28aca2['set'](_0x4ada2f,(_0x28aca2['get'](_0x4ada2f)||0x0)+0x1);}}function _0x1baa67(_0x48a48f,_0x8d52d1){return _0x35c1(_0x48a48f- -0x344,_0x8d52d1);}const _0x3f56e8=new Set(_0x5c7510['map'](_0x592eaa=>_0x592eaa['toLowerCas'+'e']())),_0x140ca6=[..._0x28aca2[_0x16e628(-0x7e,-0x45)]()][_0x16e628(-0x74,0x1)]((_0x4e750b,_0x3ae0c6)=>_0x3ae0c6[0x1]-_0x4e750b[0x1])[_0x16e628(0x1,-0x52)](([_0x56b0b0])=>!_0x3f56e8[_0x16e628(-0x5a,-0xb6)](_0x56b0b0))['slice'](0x0,0x5)[_0x16e628(-0x9,0x1d)](([_0x264b46])=>_0x264b46),_0xf4d1f8=[..._0x5c7510,...Array['from'](_0x380857)[_0x1baa67(-0x1d9,-0x285)](0x0,0x3),..._0x140ca6];return _0xf4d1f8[_0x1baa67(-0x1d9,-0x1be)](0x0,0xa)[_0x1baa67(-0x1dd,-0x142)]('\x20');}const CATEGORY_LABELS={'error_solution':_0x345095(0x2fb,0x259)+'es\x20&\x20Solut'+_0x345095(0x1fc,0x20b),'convention':'Project\x20Co'+_0x216698(0x2f7,0x3a3),'decision':_0x216698(0x295,0x1fd)+_0x216698(0x2fa,0x26f)+'ns','code_pattern':_0x345095(0x1ca,0x263)+_0x345095(0x218,0x218),'skill':_0x216698(0x35c,0x3d6)+'lls','learning':'Learnings','context':_0x216698(0x243,0x2c0)+_0x216698(0x32c,0x367)},CATEGORY_ORDER=[_0x345095(0x13c,0x1d2)+_0x345095(0x259,0x21b),_0x216698(0x22a,0x2b1),_0x216698(0x256,0x230),'code_patte'+'rn',_0x216698(0x297,0x232),_0x345095(0xf1,0x197),_0x216698(0x310,0x2e8)],ERROR_SOLUTION_MAX=0x3;function _0x35c1(_0x47f252,_0x28eb30){_0x47f252=_0x47f252-0x140;const _0x30c518=_0x30c5();let _0x35c1c6=_0x30c518[_0x47f252];if(_0x35c1['QhBntf']===undefined){var _0x10a935=function(_0x2067ea){const _0x243e8f='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2781db='',_0x19f449='';for(let _0x57c189=0x0,_0x3cfb20,_0x129df9,_0x1a2298=0x0;_0x129df9=_0x2067ea['charAt'](_0x1a2298++);~_0x129df9&&(_0x3cfb20=_0x57c189%0x4?_0x3cfb20*0x40+_0x129df9:_0x129df9,_0x57c189++%0x4)?_0x2781db+=String['fromCharCode'](0xff&_0x3cfb20>>(-0x2*_0x57c189&0x6)):0x0){_0x129df9=_0x243e8f['indexOf'](_0x129df9);}for(let _0x3ac1d5=0x0,_0xec9d14=_0x2781db['length'];_0x3ac1d5<_0xec9d14;_0x3ac1d5++){_0x19f449+='%'+('00'+_0x2781db['charCodeAt'](_0x3ac1d5)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x19f449);};_0x35c1['mQZFOE']=_0x10a935,_0x35c1['kJVBZY']={},_0x35c1['QhBntf']=!![];}const _0x904eef=_0x30c518[0x0],_0x16a1ed=_0x47f252+_0x904eef,_0x2ec3e3=_0x35c1['kJVBZY'][_0x16a1ed];return!_0x2ec3e3?(_0x35c1c6=_0x35c1['mQZFOE'](_0x35c1c6),_0x35c1['kJVBZY'][_0x16a1ed]=_0x35c1c6):_0x35c1c6=_0x2ec3e3,_0x35c1c6;}function _0x216698(_0x44302d,_0x5be693){return _0x35c1(_0x44302d-0xd7,_0x5be693);}function selectWithCategoryDiversity(_0x156b09,_0xba2f59){const _0x466d08={'CugzC':function(_0x578d96,_0x394011,_0x2eb4fd){return _0x578d96(_0x394011,_0x2eb4fd);},'vQpGW':function(_0xc59ba0,_0x446fe9){return _0xc59ba0===_0x446fe9;},'vrEfN':_0x27341b(0x64,-0x3f),'DvGwz':_0x27341b(-0x21,-0x4b),'gpHKq':_0x3f2958(0x4a0,0x467),'hkRhZ':_0x27341b(-0xac,-0xb8),'haUGX':_0x27341b(0x2e,-0x58),'KiztA':_0x3f2958(0x49c,0x44b)+_0x27341b(-0x3b,-0x47),'PkZwp':function(_0x3dcab8,_0x41a988){return _0x3dcab8>=_0x41a988;}};if(_0x156b09['length']<=_0xba2f59)return _0x156b09;const _0x1fb5f8=[],_0x54e435=new Set(),_0x577e11=new Map();function _0x27341b(_0xd33b63,_0x3865c0){return _0x216698(_0x3865c0- -0x2e2,_0xd33b63);}for(const _0x153b30 of _0x156b09){if(_0x466d08[_0x3f2958(0x579,0x50b)](_0x27341b(0x35,-0x3f),_0x466d08['vrEfN'])){const _0x4bf7b2=_0x153b30[_0x3f2958(0x47d,0x499)][_0x27341b(0x82,-0xe)];if(!_0x577e11[_0x27341b(0x42,0x19)](_0x4bf7b2))_0x577e11[_0x27341b(-0x54,-0x6a)](_0x4bf7b2,[]);_0x577e11[_0x3f2958(0x46c,0x3d1)](_0x4bf7b2)[_0x27341b(0x6e,-0x32)](_0x153b30);}else _0x3f1f7c[_0x3f2958(0x4fa,0x463)]('-\x20'+_0x37a5cf);}const _0x15ecef=[_0x466d08[_0x27341b(0x9b,0x20)],_0x466d08[_0x3f2958(0x48e,0x428)],_0x466d08[_0x3f2958(0x504,0x48b)]];function _0x3f2958(_0x309cd8,_0x2d8af7){return _0x216698(_0x309cd8-0x24a,_0x2d8af7);}for(const _0x46a9a9 of _0x15ecef){const _0x2a9fd8=_0x577e11[_0x3f2958(0x46c,0x3ca)](_0x46a9a9);if(_0x2a9fd8&&_0x2a9fd8['length']>0x0&&_0x1fb5f8[_0x27341b(0xad,0x45)]<_0xba2f59){if(_0x466d08[_0x3f2958(0x579,0x57c)](_0x466d08[_0x27341b(0x6b,-0x17)],_0x27341b(-0x5d,-0x58))){const _0x429c2f=_0x2a9fd8[0x0];_0x1fb5f8['push'](_0x429c2f),_0x54e435['add'](_0x429c2f[_0x3f2958(0x47d,0x495)]['id']);}else{_0x19f581[_0x27341b(-0xa0,-0x32)]('\x0a###\x20Team\x20'+_0x3f2958(0x463,0x42e));for(const _0x4a84c5 of _0x2f624e){_0xbbdd1d[_0x3f2958(0x4fa,0x4f4)](_0x3f2958(0x46f,0x45a)+_0x4a84c5[_0x27341b(0x36,-0xe)]+']\x20'+_0x466d08[_0x3f2958(0x518,0x519)](_0x4ea64d,_0x4a84c5[_0x3f2958(0x4ec,0x49c)],0x96));}}}}const _0x3aed56=_0x577e11['get'](_0x466d08[_0x3f2958(0x5b8,0x657)])??[];let _0x41fdab=0x0;for(const _0x13fd75 of _0x3aed56){if(_0x466d08[_0x3f2958(0x512,0x571)](_0x41fdab,ERROR_SOLUTION_MAX))break;if(_0x54e435[_0x27341b(0x8d,0x19)](_0x13fd75[_0x27341b(-0x5e,-0xaf)]['id']))continue;if(_0x1fb5f8[_0x27341b(0x20,0x45)]>=_0xba2f59)break;_0x1fb5f8[_0x27341b(0x2e,-0x32)](_0x13fd75),_0x54e435['add'](_0x13fd75['memory']['id']),_0x41fdab++;}for(const _0x5e1aa2 of _0x156b09){if(_0x466d08[_0x27341b(0x46,-0x1a)](_0x1fb5f8[_0x27341b(0x13,0x45)],_0xba2f59))break;if(_0x54e435[_0x27341b(-0x3b,0x19)](_0x5e1aa2[_0x3f2958(0x47d,0x486)]['id']))continue;_0x1fb5f8[_0x3f2958(0x4fa,0x472)](_0x5e1aa2),_0x54e435['add'](_0x5e1aa2[_0x3f2958(0x47d,0x3d2)]['id']);}return _0x1fb5f8[_0x3f2958(0x52b,0x4f9)]((_0x5a9fd6,_0x4ce0ce)=>_0x4ce0ce[_0x27341b(0x8c,0x66)]-_0x5a9fd6[_0x3f2958(0x592,0x4f9)]),_0x1fb5f8;}function summarizeMultiline(_0x467961,_0x4412e7){function _0x17f3cc(_0x3150c7,_0x38c446){return _0x216698(_0x3150c7- -0x469,_0x38c446);}const _0x2ab48b={'NkfTT':function(_0x18c7f0,_0x393b0b){return _0x18c7f0>_0x393b0b;},'QprnQ':function(_0x551675,_0x624488){return _0x551675+_0x624488;}},_0xb7b21=_0x467961[_0x17f3cc(-0x138,-0x1b4)]('\x0a')['filter'](_0x3c430e=>_0x3c430e[_0x17f3cc(-0x245,-0x226)]());let _0x4c8f96='';for(const _0x46919c of _0xb7b21){if(_0x2ab48b[_0x17f3cc(-0x251,-0x1f0)]((_0x4c8f96+'\x20'+_0x46919c)[_0x17f3cc(-0x142,-0x1ed)],_0x4412e7))break;_0x4c8f96+=_0x2ab48b[_0x17f3cc(-0x165,-0x1ef)](_0x4c8f96?'\x20':'',_0x46919c[_0x4dad79(0x177,0x13e)]());}function _0x4dad79(_0xec3d7e,_0x547098){return _0x216698(_0xec3d7e- -0xad,_0x547098);}return _0x4c8f96||_0x2ab48b['QprnQ'](_0x467961[_0x17f3cc(-0x227,-0x1b0)](0x0,_0x4412e7),'…');}function formatMemoryOutput(_0x5345a0,_0x2cb87,_0x321fe7,_0xb3f46e){const _0x1fc415={'gWlZO':function(_0x209cd1,_0x3a09f2,_0x359bc2){return _0x209cd1(_0x3a09f2,_0x359bc2);},'RtnST':function(_0x2c6ff0,_0x4101dc){return _0x2c6ff0===_0x4101dc;},'gBftE':_0x424d60(0x10f,0x105),'hPMDc':function(_0x314af4,_0x346bf6){return _0x314af4>_0x346bf6;},'Slgli':function(_0xe506f,_0x4739bc){return _0xe506f!==_0x4739bc;},'UwdPY':_0x424d60(0x126,0x10f),'ErLqI':_0x132107(0x1d2,0x164)+'Insights'},_0x438445=[_0x132107(0x16b,0x138)+_0x424d60(0xc6,0x11d)+_0x132107(0x14e,0xd8)],_0x45d321=new Map();function _0x132107(_0x21c5e5,_0x1dc5ca){return _0x216698(_0x21c5e5- -0xfd,_0x1dc5ca);}for(const _0xaf66dd of _0x5345a0){const _0x16c8fd=_0xaf66dd[_0x424d60(0xab,0x116)][_0x132107(0x1d7,0x202)];if(!_0x45d321[_0x132107(0x1fe,0x29c)](_0x16c8fd))_0x45d321[_0x132107(0x17b,0x1ac)](_0x16c8fd,[]);_0x45d321['get'](_0x16c8fd)['push'](_0xaf66dd);}for(const _0xc7a78b of CATEGORY_ORDER){const _0x563a17=_0x45d321[_0x132107(0x125,0x1be)](_0xc7a78b);if(!_0x563a17||_0x563a17[_0x424d60(0x19f,0x1dd)]===0x0)continue;const _0x2614ee=CATEGORY_LABELS[_0xc7a78b]||_0xc7a78b;_0x438445[_0x424d60(0x128,0x95)](_0x132107(0x21c,0x246)+_0x2614ee);for(const {memory:_0x24ad1a}of _0x563a17){const _0x481464=_0x1fc415[_0x132107(0x264,0x2ff)](summarizeMultiline,_0x24ad1a['content'],0x1f4);if(_0x1fc415[_0x132107(0x24d,0x2dc)](_0xc7a78b,_0x1fc415[_0x132107(0x1b8,0x11f)])&&_0xb3f46e&&_0x1fc415['hPMDc'](_0xb3f46e[_0x132107(0x1d3,0x14a)],0x0)){const _0x3705dc=_0x24ad1a[_0x132107(0x1a5,0x140)]['split']('\x0a')[0x0][_0x424d60(0xba,0x96)](0x0,0x32)[_0x424d60(0x9c,0x137)](),_0x1dfb7c=_0xb3f46e['get'](_0x3705dc),_0x421466=_0x1dfb7c!==undefined?_0x132107(0x1f1,0x27d)+_0x1dfb7c+']':'';_0x438445['push']('-\x20'+_0x481464+_0x421466);}else _0x438445['push']('-\x20'+_0x481464);}}if(_0x2cb87[_0x424d60(0x19f,0x16e)]>0x0){if(_0x1fc415[_0x132107(0x20a,0x209)](_0x424d60(0x165,0x1e3),_0x1fc415['UwdPY'])){_0x438445[_0x132107(0x1b3,0x153)](_0x1fc415[_0x132107(0x137,0xda)]);for(const _0x216806 of _0x2cb87){_0x438445['push']('-\x20['+_0x216806[_0x132107(0x1d7,0x242)]+']\x20'+_0x1fc415[_0x132107(0x264,0x2ae)](summarizeMultiline,_0x216806[_0x424d60(0x11a,0x160)],0x96));}}else _0x333919['stdout'][_0x132107(0x120,0x1bb)](_0x5f26e1);}_0x438445['push'](''),_0x438445['push'](_0x424d60(0x1ca,0x17f)+'ory\x20search'+_0x132107(0x246,0x255)+'for\x20detail'+'s.'),_0x438445[_0x424d60(0x128,0x10d)](_0x132107(0x249,0x29a)+_0x424d60(0x1a6,0x19d)+_0x132107(0x23a,0x2e8));function _0x424d60(_0x2ceca5,_0x487809){return _0x216698(_0x2ceca5- -0x188,_0x487809);}return _0x438445[_0x424d60(0xb6,0x3e)]('\x0a');}async function pullRemoteMemories(_0x3ee83d,_0x2783dd){function _0x296b6b(_0xc2962b,_0x5801b1){return _0x345095(_0x5801b1,_0xc2962b-0x332);}const _0x321c7c={'FZFPc':_0x296b6b(0x611,0x693)+'\x20pull\x20fail'+'ed\x20(backgr'+_0x296b6b(0x5dd,0x679),'iRuNz':function(_0xa965f,_0x4a92bd){return _0xa965f(_0x4a92bd);},'UlRCk':function(_0x2bee4a,_0x5b58e0,_0x4bb703){return _0x2bee4a(_0x5b58e0,_0x4bb703);},'Nmmhi':function(_0x4adb59,_0x117101){return _0x4adb59===_0x117101;}};function _0x360f67(_0x5ca961,_0x55ed34){return _0x345095(_0x55ed34,_0x5ca961- -0x316);}if(!_0x3ee83d[_0x296b6b(0x558,0x502)][_0x360f67(-0xeb,-0x155)]||!_0x3ee83d[_0x360f67(-0xf0,-0x74)][_0x360f67(-0x55,0x2e)+_0x296b6b(0x4fe,0x49c)]||!_0x3ee83d['server'][_0x360f67(-0xc1,-0x10c)])return;const _0x14212e=_0x321c7c[_0x296b6b(0x5da,0x5a5)](createHookClient,_0x3ee83d,0x1388);if(!_0x14212e)return;if(_0x321c7c['Nmmhi'](_0x3ee83d[_0x296b6b(0x579,0x5e7)],_0x296b6b(0x571,0x5d1))&&_0x3ee83d[_0x296b6b(0x571,0x51b)])try{const {TeamSynchronizer:_0x4b6d70}=await import(_0x360f67(-0x145,-0x131)+_0x296b6b(0x5a8,0x58d)+_0x296b6b(0x4ea,0x550)),_0x559d20=new _0x4b6d70(_0x2783dd,_0x14212e,_0x3ee83d['team'][_0x296b6b(0x559,0x584)],_0x3ee83d[_0x360f67(-0xd7,-0x2c)][_0x296b6b(0x57f,0x53b)]);_0x559d20['pullFromTe'+'am']()['catch'](_0x56bc15=>{function _0x31bd76(_0x356b2e,_0x43b452){return _0x296b6b(_0x43b452- -0x377,_0x356b2e);}function _0x1529fd(_0x267125,_0x4c713d){return _0x296b6b(_0x267125- -0x418,_0x4c713d);}console[_0x1529fd(0x19d,0x147)](_0x321c7c[_0x1529fd(0x100,0x17c)],_0x56bc15 instanceof Error?_0x56bc15[_0x31bd76(0x296,0x274)]:_0x321c7c[_0x1529fd(0x189,0x185)](String,_0x56bc15));});}catch{}else{const _0x5481d6=new MemorySynchronizer(_0x2783dd,_0x14212e);_0x5481d6[_0x360f67(-0x16d,-0x1b2)]()[_0x360f67(-0x46,-0xc5)](_0x505285=>{function _0x539537(_0x369cb9,_0x4b4677){return _0x296b6b(_0x369cb9- -0x2f5,_0x4b4677);}function _0x257ade(_0x535be4,_0x270c6e){return _0x296b6b(_0x535be4- -0x17e,_0x270c6e);}console[_0x257ade(0x437,0x4cc)](_0x539537(0x1e5,0x272)+'ground\x20pul'+'l\x20failed,\x20'+_0x539537(0x30e,0x298)+_0x539537(0x2d1,0x282),_0x505285 instanceof Error?_0x505285[_0x539537(0x2f6,0x297)]:String(_0x505285));});}}async function fetchRelevantMemories(_0x2e44f6,_0x3ee981,_0x22d637,_0x10fe3b){const _0x570c44={'EdDTK':function(_0x3181dd,_0x15b0ec){return _0x3181dd>_0x15b0ec;},'WIxTa':'session:','fszgP':_0x246a5a(0x6a,0xb)+'oficiency\x20'+_0x109db1(0x471,0x449)+'m\x20server','DCJTo':'Query\x20rout'+_0x246a5a(0x19,-0x56),'YCFBd':_0x246a5a(-0xa8,-0x33),'xoTzJ':function(_0x5882b1,_0x5e4c8f,_0x4812fa){return _0x5882b1(_0x5e4c8f,_0x4812fa);},'iTXAr':_0x246a5a(0x80,-0x14)+_0x246a5a(0x9,-0x91),'BwtQC':_0x109db1(0x3ca,0x3bc)+_0x246a5a(0x88,0x29),'ShbsA':_0x109db1(0x433,0x3c4),'nkLny':function(_0xc229d7,_0x50b473){return _0xc229d7 instanceof _0x50b473;},'eEPws':function(_0x574f25,_0x2761dd){return _0x574f25(_0x2761dd);},'FzLcF':'BhMrn'},_0x449a2c=_0x3ee981[_0x109db1(0x4da,0x521)][_0x246a5a(-0x89,-0xa2)+'s'],_0x27cc08=buildSearchQuery(_0x2e44f6[_0x109db1(0x3ce,0x3f5)+'h'],_0x22d637),_0x55bebb=_0x27cc08?_0x22d637[_0x109db1(0x441,0x405)]({'query':_0x27cc08,'limit':_0x449a2c}):[];_0x10fe3b['info']('FTS\x20search',{'count':_0x55bebb[_0x109db1(0x490,0x446)],'query':_0x27cc08});const _0x49a08b=new AdaptiveRouter();function _0x246a5a(_0x190966,_0x248201){return _0x345095(_0x190966,_0x248201- -0x299);}const _0xf73086=_0x49a08b[_0x246a5a(-0x52,-0xc6)](_0x27cc08);_0x10fe3b[_0x246a5a(-0x22,0x1f)](_0x570c44['DCJTo'],{'complexity':_0xf73086[_0x246a5a(0x15,-0x3a)],'reason':_0xf73086[_0x246a5a(-0x11c,-0xe7)]});function _0x109db1(_0x325f63,_0x272b02){return _0x345095(_0x272b02,_0x325f63-0x1e9);}let _0x238d5e;if(_0xf73086[_0x109db1(0x3c2,0x38b)]&&_0x3ee981[_0x109db1(0x41b,0x46a)]?.[_0x109db1(0x414,0x411)])try{if(_0x570c44['YCFBd']===_0x109db1(0x3c1,0x353))_0x1e1c21[_0x246a5a(0x1c,-0x69)](_0x39b7f9);else{const {createEmbeddingProvider:_0x46985f}=await import(_0x246a5a(0xaf,0x19)+'ng/index.j'+'s'),_0x53b2d6=_0x570c44[_0x109db1(0x477,0x46c)](_0x46985f,_0x3ee981[_0x109db1(0x41b,0x3f2)],_0x3ee981[_0x246a5a(-0xc7,-0x71)]),_0x2c9870=_0x27cc08||basename(_0x2e44f6[_0x246a5a(-0x11,-0xb4)+'h']),_0x329897=await Promise[_0x246a5a(-0x153,-0xc4)](_0x53b2d6['embed'](_0x2c9870)),_0x5a8144=_0x22d637['searchByVe'+'ctor'](_0x329897,_0x449a2c),_0x1ce0af=_0x22d637['listMemori'+'es']({'limit':_0x449a2c,'projectPath':_0x2e44f6['projectPat'+'h']}),_0x3295b1=new HybridRanker({'categoryBoost':!![],'tierBoost':!![],'recencyDecay':!![]});let _0x3f0520=_0x3295b1[_0x109db1(0x387,0x430)](_0x55bebb,_0x5a8144,_0x1ce0af);if(_0xf73086[_0x109db1(0x452,0x4c0)+'r'])try{const {CrossEncoderReranker:_0xde504c}=await import(_0x109db1(0x466,0x44d)+_0x246a5a(-0xa0,-0x57)+'s'),_0x2ae7bd=new _0xde504c(),_0xb205be=_0x3f0520['slice'](0x0,0x14);_0x3f0520=await _0x2ae7bd[_0x246a5a(-0xf,-0x39)](_0x27cc08,_0xb205be,_0x449a2c),_0x10fe3b[_0x246a5a(0x3e,0x1f)](_0x570c44[_0x246a5a(0x86,-0xe)],{'candidates':_0xb205be[_0x246a5a(0x14,0xe)],'output':_0x3f0520[_0x109db1(0x490,0x43d)]});}catch{_0x10fe3b[_0x246a5a(-0x81,0x1f)](_0x246a5a(-0x95,-0xd9)+_0x246a5a(-0xf1,-0x7a)+_0x246a5a(0x96,-0x18)+'brid\x20resul'+'ts');}_0x238d5e=_0x3f0520['slice'](0x0,_0x449a2c)['map'](_0x2b40e2=>({'memory':_0x2b40e2[_0x109db1(0x39c,0x411)],'score':_0x2b40e2[_0x246a5a(0x51,0x2f)],'matchType':_0x109db1(0x492,0x537)})),_0x10fe3b[_0x246a5a(-0x3e,-0xa5)](_0x570c44[_0x246a5a(0x61,0x54)],{'count':_0x238d5e[_0x109db1(0x490,0x4fd)],'routing':_0xf73086[_0x109db1(0x448,0x497)]});}}catch(_0xbfe5d2){if(_0x570c44[_0x109db1(0x485,0x46b)]===_0x109db1(0x433,0x461))_0x10fe3b[_0x246a5a(-0x111,-0x80)](_0x246a5a(-0xac,-0xa7)+'search\x20fai'+_0x109db1(0x425,0x3cd),{'error':_0x570c44['nkLny'](_0xbfe5d2,Error)?_0xbfe5d2[_0x246a5a(0x8d,0x20)]:_0x570c44[_0x109db1(0x455,0x3e0)](String,_0xbfe5d2)}),_0x238d5e=_0x55bebb;else for(const _0x394984 of _0x5f37b0[_0x246a5a(-0x53,-0xa)]||[]){jUYZtZ[_0x109db1(0x4ad,0x51f)](_0x394984[_0x246a5a(0x4f,0xe)],0x2)&&!_0x394984[_0x246a5a(0x11,-0x9c)](jUYZtZ[_0x109db1(0x47e,0x50f)])&&!_0x394984[_0x246a5a(-0xa1,-0x9c)](_0x109db1(0x3bd,0x370))&&_0x126f2e[_0x109db1(0x427,0x3c9)](_0x394984);}}else{if(_0x109db1(0x41a,0x3cd)!==_0x570c44['FzLcF'])_0x910dd1=new _0x31f3a2(_0x410d2c[_0x246a5a(-0x63,0x33)](_0x20d66d=>[_0x20d66d[_0x109db1(0x3a4,0x441)],_0x20d66d[_0x246a5a(-0xc4,-0x66)]])),_0x536fa5['debug'](_0x570c44[_0x246a5a(-0x53,-0x8b)],{'count':_0x3eedda['length']});else{_0x238d5e=_0x55bebb;if(_0x238d5e[_0x109db1(0x490,0x529)]<_0x449a2c)try{const _0x34346f=_0x22d637['listMemori'+'es']({'limit':_0x449a2c*0x2,'projectPath':_0x2e44f6['projectPat'+'h']}),_0x200cdc=_0x34346f[_0x246a5a(-0x50,0x3d)](_0x497e0a=>_0x497e0a[_0x109db1(0x41b,0x443)]&&_0x497e0a[_0x246a5a(0x43,-0x67)][_0x246a5a(0xe,0xe)]>0x0);if(_0x200cdc['length']>0x0){const _0xb10be4=new Set(_0x238d5e[_0x246a5a(0xa9,0x33)](_0x4e2522=>_0x4e2522['memory']['id'])),_0xac2d88=_0x200cdc['filter'](_0x5de355=>!_0xb10be4[_0x109db1(0x464,0x4c0)](_0x5de355['id']))[_0x109db1(0x3ab,0x3e4)](0x0,_0x449a2c-_0x238d5e[_0x109db1(0x490,0x513)])[_0x246a5a(-0x26,0x33)](_0x4d7039=>({'memory':_0x4d7039,'score':0.5,'matchType':_0x246a5a(-0x15,-0x83)}));_0x238d5e[_0x109db1(0x419,0x452)](..._0xac2d88);}}catch(_0x2aa3f3){_0x10fe3b[_0x246a5a(-0xde,-0x80)](_0x109db1(0x486,0x4de)+'lback\x20fail'+'ed',{'error':_0x570c44[_0x109db1(0x48a,0x452)](_0x2aa3f3,Error)?_0x2aa3f3[_0x109db1(0x4a2,0x43a)]:_0x570c44[_0x109db1(0x455,0x4bc)](String,_0x2aa3f3)});}}}return{'results':_0x238d5e,'query':_0x27cc08};}async function buildSkillInjection(_0x1c6103,_0x2feeb9,_0x183488,_0x1852cd,_0x1eb53c){function _0x348937(_0x2adfb6,_0x1fae15){return _0x216698(_0x1fae15- -0x64,_0x2adfb6);}const _0x3bae67={'Cmbjd':function(_0x11c2ba,_0x5d9c43){return _0x11c2ba(_0x5d9c43);},'OOMGT':function(_0xf015e,_0x27f3e7){return _0xf015e===_0x27f3e7;},'VJpeA':function(_0x160702,_0x3ae249){return _0x160702!==_0x3ae249;},'CFXpO':_0x43a86b(0x3b0,0x310),'pUHyy':'QIoiM','swyDq':_0x43a86b(0x31c,0x283),'JiaME':_0x43a86b(0x2a3,0x250)+_0x43a86b(0x3aa,0x32f)+'lable','YanDm':function(_0x555b33,_0x5943fb){return _0x555b33 instanceof _0x5943fb;},'LdpZo':function(_0x4ad1f3,_0x2852b9){return _0x4ad1f3>_0x2852b9;}};let _0x453c72=[];if(_0x3bae67['OOMGT'](_0x2feeb9[_0x43a86b(0x30d,0x351)],_0x43a86b(0x305,0x33c))&&_0x2feeb9[_0x348937(0x214,0x25b)]&&_0x2feeb9[_0x43a86b(0x28b,0x1ed)][_0x348937(0x2f4,0x271)]){if(_0x3bae67[_0x43a86b(0x36c,0x362)](_0x3bae67[_0x348937(0x222,0x2ba)],_0x3bae67[_0x348937(0x26e,0x211)]))try{if(_0x3bae67[_0x43a86b(0x328,0x32e)]===_0x348937(0x2b4,0x272)){const _0x4f7ee8=createHookClient(_0x2feeb9,0xbb8);if(!_0x4f7ee8)throw new Error(_0x3bae67[_0x348937(0x144,0x1ec)]);const _0x371c2d=await _0x4f7ee8['searchTeam'+_0x348937(0x21c,0x225)](_0x2feeb9['team']['teamPath'],_0x183488,{'limit':Math['min'](0x3,_0x1852cd)});_0x453c72=_0x371c2d['map'](_0x2069f2=>({'category':_0x2069f2[_0x43a86b(0x31a,0x3a1)],'content':_0x2069f2[_0x348937(0x2a8,0x23e)]}));}else{const _0x1a7fc7=_0x5720d2[_0x43a86b(0x268,0x271)](_0x47e549);if(_0x1a7fc7&&_0x1a7fc7[_0x348937(0x320,0x2c3)]>0x0&&_0x202372[_0x43a86b(0x36d,0x40d)]<_0x76adaa){const _0x32f8d9=_0x1a7fc7[0x0];_0x164f7f['push'](_0x32f8d9),_0x24456a[_0x43a86b(0x304,0x2cf)](_0x32f8d9['memory']['id']);}}}catch(_0x3b7cd0){_0x1eb53c[_0x348937(0x1a3,0x235)]('Team\x20searc'+_0x43a86b(0x3ae,0x36c),{'error':_0x3bae67['YanDm'](_0x3b7cd0,Error)?_0x3b7cd0[_0x348937(0x34e,0x2d5)]:String(_0x3b7cd0)});}else{const _0x557986=_0x3bae67['Cmbjd'](_0x134f3c,_0x477d8c['db']['path']);_0x557986[_0x348937(0x24e,0x220)+_0x43a86b(0x38d,0x3ec)]({'sessionId':_0x374c80[_0x348937(0x380,0x2e7)],'hookType':_0x43a86b(0x2e4,0x2d8)+_0x348937(0x27c,0x1eb),'injectedMemoryIds':[],'injectedKeywords':[],'totalInjected':0x0,'abGroup':'B'});}}let _0x5f3d1c=new Map();function _0x43a86b(_0x19a571,_0x5e16ef){return _0x216698(_0x19a571-0x46,_0x5e16ef);}if(_0x2feeb9[_0x348937(0x139,0x1e1)]?.['apiKey']&&_0x2feeb9[_0x43a86b(0x28b,0x23f)]?.[_0x348937(0x277,0x1fa)])try{const _0x5932ce=createHookClient(_0x2feeb9,0xbb8),_0x5591da=_0x5932ce?await _0x5932ce[_0x348937(0x205,0x245)+_0x348937(0x214,0x1bc)](_0x1c6103['projectPat'+'h']):[];_0x3bae67[_0x43a86b(0x32e,0x3c5)](_0x5591da[_0x348937(0x2c8,0x2c3)],0x0)&&(_0x5f3d1c=new Map(_0x5591da[_0x348937(0x305,0x2e8)](_0x371db6=>[_0x371db6[_0x43a86b(0x281,0x2df)],_0x371db6['level']])),_0x1eb53c[_0x348937(0x261,0x2d4)](_0x348937(0x231,0x2c0)+_0x348937(0x1d4,0x21f)+_0x348937(0x250,0x2a4)+_0x348937(0x316,0x2b7),{'count':_0x5591da[_0x348937(0x33a,0x2c3)]}));}catch{}return{'teamMemoryData':_0x453c72,'proficiencyMap':_0x5f3d1c};}function resolveAbGroup(_0x204671){const _0x5cc55a={'pIZvS':function(_0x26fedf,_0x290a44){return _0x26fedf<_0x290a44;},'SQSsP':function(_0x4a54ef,_0x3b2e48){return _0x4a54ef>>>_0x3b2e48;},'qUCee':function(_0x49090f,_0x41bb7f){return _0x49090f*_0x41bb7f;},'ROlwW':function(_0x33054c,_0x1e668b){return _0x33054c===_0x1e668b;},'uztLH':function(_0x1ec171,_0x558de5){return _0x1ec171&_0x558de5;}};function _0x86d0f4(_0x3db9ea,_0x8a03d6){return _0x216698(_0x3db9ea-0x17a,_0x8a03d6);}let _0x38aa23=0x0;for(let _0x513b85=0x0;_0x5cc55a[_0x6c7018(0x25d,0x27a)](_0x513b85,_0x204671['length']);_0x513b85++){_0x38aa23=_0x5cc55a[_0x86d0f4(0x3bb,0x3b8)](_0x5cc55a[_0x86d0f4(0x429,0x37d)](_0x38aa23,0x1f)+_0x204671['charCodeAt'](_0x513b85),0x0);}function _0x6c7018(_0x431c25,_0x1e135f){return _0x216698(_0x1e135f-0xf,_0x431c25);}return _0x5cc55a[_0x6c7018(0x221,0x26a)](_0x5cc55a[_0x6c7018(0x2b8,0x2db)](_0x38aa23,0x1),0x0)?'A':'B';}export async function handleSessionStart(_0x42e8cf){const _0x1141e9={'YWhYt':function(_0x407d32){return _0x407d32();},'keUDW':_0x27bc2e(-0x3f,-0xde)+'ionStart\x20e'+_0x27bc2e(0x21,-0x18),'vFnQw':function(_0x44a3d1,_0x47fe4f,_0x45d100){return _0x44a3d1(_0x47fe4f,_0x45d100);},'jJUkh':function(_0x5ef280,_0x32918b){return _0x5ef280===_0x32918b;},'NQoBg':'skill','uzYlh':_0x14b86d(0x530,0x4ac)+'rt','ogFMt':_0x14b86d(0x673,0x5d7)+'ed','pkQac':function(_0x12df09,_0x2bab8b){return _0x12df09!==_0x2bab8b;},'HMvXi':function(_0x3e5abc,_0x4e2e44){return _0x3e5abc===_0x4e2e44;},'MZiMr':function(_0x53f874,_0x1640e5){return _0x53f874(_0x1640e5);},'toYhm':_0x14b86d(0x509,0x4ec),'CIlia':function(_0x48850c,_0x234f46,_0x2ee1c7){return _0x48850c(_0x234f46,_0x2ee1c7);},'Qxsvu':function(_0x3f1887,_0x450891,_0x5d401e,_0x4b6bf9,_0x1be450){return _0x3f1887(_0x450891,_0x5d401e,_0x4b6bf9,_0x1be450);},'iNvKe':function(_0x45ab9e,_0x2a9795){return _0x45ab9e===_0x2a9795;},'CEsjl':_0x27bc2e(-0xa2,-0xe7),'vresu':function(_0x3180e9,_0x5eeeb7){return _0x3180e9(_0x5eeeb7);},'PqTrB':function(_0x1b6a80,_0x507c20,_0x1639fd,_0x2240a2){return _0x1b6a80(_0x507c20,_0x1639fd,_0x2240a2);},'PSbln':function(_0x43d237,_0x33ae5e,_0x39d289,_0x453228,_0xdd16c,_0x3acad0){return _0x43d237(_0x33ae5e,_0x39d289,_0x453228,_0xdd16c,_0x3acad0);},'SvoKy':_0x14b86d(0x5f9,0x5df),'iGcrz':_0x14b86d(0x552,0x504),'oLBPx':'session_st'+_0x14b86d(0x44d,0x4cc),'SdOnl':_0x14b86d(0x488,0x534)+'eted','kSnMY':function(_0x3b610c,_0x4deeb2){return _0x3b610c-_0x4deeb2;}};function _0x27bc2e(_0x1c1ade,_0x1f86c4){return _0x216698(_0x1c1ade- -0x312,_0x1f86c4);}const _0x505e0f=new ConfigManager()[_0x14b86d(0x58a,0x5aa)]();function _0x14b86d(_0x19170d,_0x4536cf){return _0x216698(_0x4536cf-0x27d,_0x19170d);}const _0x342e44=createLogger(_0x1141e9[_0x14b86d(0x4c4,0x4e7)],_0x505e0f[_0x14b86d(0x538,0x5d4)]),_0x3e5a83=performance[_0x27bc2e(-0x91,-0xa4)]();_0x342e44['info'](_0x1141e9[_0x27bc2e(-0xb2,-0x13a)],{'projectPath':_0x42e8cf['projectPat'+'h']});if(!_0x505e0f[_0x14b86d(0x570,0x5ee)]['enabled']){if(_0x1141e9[_0x27bc2e(-0xe2,-0x82)](_0x14b86d(0x5f8,0x5d5),_0x27bc2e(-0xe4,-0x9e)))return _0x342e44[_0x27bc2e(-0x9e,-0x30)](_0x27bc2e(-0x6e,-0x92)+_0x14b86d(0x56f,0x5ba)),_0x342e44[_0x14b86d(0x536,0x5ca)](),'';else _0x115980[_0x14b86d(0x447,0x4a0)+'ss'](_0x5a1720['id']);}const _0x1f44ef=_0x1141e9['HMvXi'](_0x505e0f[_0x14b86d(0x559,0x572)]?.[_0x14b86d(0x52c,0x528)],!![]),_0x25f512=_0x1f44ef?_0x1141e9[_0x27bc2e(-0x55,0x0)](resolveAbGroup,_0x42e8cf[_0x27bc2e(0x39,-0x5c)]):'A';if(_0x1f44ef&&_0x25f512==='B'){_0x342e44[_0x14b86d(0x53a,0x4f1)]('A/B\x20test:\x20'+_0x27bc2e(-0x96,-0xbb)+_0x27bc2e(0x11,0xbc)+'njection',{'sessionId':_0x42e8cf[_0x27bc2e(0x39,0xa5)]});try{if('Dzlpz'!==_0x1141e9[_0x14b86d(0x610,0x570)]){const _0x3dcd61=getSharedDb(_0x505e0f['db'][_0x14b86d(0x5de,0x5bb)]);_0x3dcd61['recordInje'+_0x27bc2e(0x35,0x52)]({'sessionId':_0x42e8cf[_0x27bc2e(0x39,-0x1c)],'hookType':_0x14b86d(0x4fd,0x51b)+_0x14b86d(0x4d5,0x4cc),'injectedMemoryIds':[],'injectedKeywords':[],'totalInjected':0x0,'abGroup':'B'});}else _0x1141e9[_0x27bc2e(-0x14,0x79)](_0x1fea59),_0x5a49a0['exit'](0x0);}catch{}return _0x342e44[_0x27bc2e(0x3b,0xe)](),'';}const _0x4513a8=_0x1141e9[_0x14b86d(0x5b7,0x53a)](getSharedDb,_0x505e0f['db']['path']);try{await _0x1141e9[_0x27bc2e(-0xcc,-0x11b)](pullRemoteMemories,_0x505e0f,_0x4513a8);const {results:_0xcc0504,query:_0x4cdc62}=await _0x1141e9['Qxsvu'](fetchRelevantMemories,_0x42e8cf,_0x505e0f,_0x4513a8,_0x342e44);if(_0x1141e9[_0x14b86d(0x519,0x4b6)](_0xcc0504[_0x27bc2e(0x15,0x8)],0x0)){if(_0x27bc2e(-0xa2,-0x98)!==_0x1141e9[_0x14b86d(0x4ee,0x54e)])_0x525221['error'](_0x1141e9[_0x27bc2e(-0x5e,-0xaa)],_0x553330 instanceof _0x15efc7?_0x35f979[_0x27bc2e(0x27,0x10)]:_0x35bf86);else return _0x342e44['info'](_0x14b86d(0x59b,0x5cb)+_0x14b86d(0x478,0x4aa)),_0x342e44['flush'](),'';}const _0x4fd594=_0x505e0f[_0x14b86d(0x632,0x5ee)][_0x14b86d(0x59f,0x4f4)+'s'],_0x1a9c51=_0xcc0504['map'](_0x51dd78=>_0x51dd78['memory']),_0x8310a5=_0x1141e9[_0x27bc2e(-0x5a,-0xe)](deduplicateByEmbedding,_0x1a9c51),_0x11de0b=new Set(_0x8310a5[_0x27bc2e(0x3a,0xb)](_0x5e8da3=>_0x5e8da3['id'])),_0x212121=_0xcc0504[_0x14b86d(0x61b,0x5d3)](_0x455430=>_0x11de0b[_0x27bc2e(-0x17,-0x80)](_0x455430['memory']['id']));_0x212121['sort']((_0x42de66,_0x1d1f22)=>_0x1d1f22['score']-_0x42de66['score']);const _0x4feea7=selectWithCategoryDiversity(_0x212121,_0x4fd594),_0x437cd1=_0x1141e9[_0x27bc2e(0x4e,-0xc)](mergeParentChunks,_0x4feea7,_0x4513a8,_0x505e0f[_0x27bc2e(0x5f,-0x3c)][_0x14b86d(0x5ea,0x5cc)]);for(const {memory:_0x2379b9}of _0x437cd1){_0x4513a8[_0x27bc2e(-0xef,-0x7a)+'ss'](_0x2379b9['id']);}const {teamMemoryData:_0x42d054,proficiencyMap:_0x4ca5ed}=await _0x1141e9[_0x14b86d(0x493,0x4a8)](buildSkillInjection,_0x42e8cf,_0x505e0f,_0x4cdc62,_0x4fd594,_0x342e44);try{if(_0x1141e9['SvoKy']!==_0x1141e9[_0x27bc2e(-0xf8,-0x57)]){const _0x491c40=_0x437cd1[_0x27bc2e(-0x1,-0x2a)](({memory:_0x14cd88})=>_0x14cd88[_0x14b86d(0x567,0x51f)][_0x27bc2e(-0xf6,-0x130)+'e']()['split'](/\s+/)[_0x27bc2e(0x44,0xa0)](_0x461265=>_0x461265[_0x27bc2e(0x15,0x8c)]>0x3)['slice'](0x0,0x5));_0x4513a8[_0x27bc2e(-0x8e,-0x133)+_0x14b86d(0x5cf,0x5c4)]({'sessionId':_0x42e8cf[_0x27bc2e(0x39,0xa0)],'hookType':_0x1141e9['oLBPx'],'injectedMemoryIds':_0x437cd1[_0x14b86d(0x57b,0x5c9)](({memory:_0x16f704})=>_0x16f704['id']),'injectedKeywords':[...new Set(_0x491c40)][_0x27bc2e(-0xd0,-0xdf)](0x0,0x14),'totalInjected':_0x437cd1[_0x14b86d(0x55c,0x5a4)],'abGroup':_0x1f44ef?_0x25f512:undefined});}else{const _0x1412bf=HnXfZz[_0x27bc2e(-0x65,-0x74)](_0x53a767,_0x58e910[_0x14b86d(0x566,0x51f)],0x1f4);if(HnXfZz[_0x27bc2e(-0x38,0x73)](_0x4faa6c,HnXfZz[_0x14b86d(0x5b0,0x527)])&&_0x289c71&&_0x609e84['size']>0x0){const _0x2ba895=_0x3dc34a[_0x14b86d(0x536,0x51f)][_0x14b86d(0x529,0x5ae)]('\x0a')[0x0][_0x14b86d(0x518,0x4bf)](0x0,0x32)[_0x14b86d(0x51d,0x4a1)](),_0x223838=_0x4bb1d0['get'](_0x2ba895),_0x4cc1b0=_0x223838!==_0x3f5a00?'\x20[Lv.'+_0x223838+']':'';_0xa50688[_0x27bc2e(-0x62,0x13)]('-\x20'+_0x1412bf+_0x4cc1b0);}else _0x49b08f[_0x14b86d(0x4c4,0x52d)]('-\x20'+_0x1412bf);}}catch{}const _0x48de74=formatMemoryOutput(_0x437cd1,_0x42d054,_0x42e8cf['projectPat'+'h'],_0x4ca5ed);return _0x342e44[_0x27bc2e(-0x9e,-0x70)](_0x1141e9[_0x14b86d(0x49b,0x4bc)],{'durationMs':Math[_0x27bc2e(-0x93,-0x18)](_0x1141e9[_0x27bc2e(-0x4e,-0x6d)](performance['now'](),_0x3e5a83)),'memories':_0x437cd1[_0x14b86d(0x552,0x5a4)]}),_0x342e44[_0x27bc2e(0x3b,-0x63)](),_0x48de74;}finally{}}const HOOK_TIMEOUT_MS=0x2710;export async function main(){const _0x1f6e30={'nvKbP':function(_0x436549){return _0x436549();},'YHDqg':_0x56b1ac(0xc2,0x67)},_0x55bc1c=[];for await(const _0x1ea2a0 of process[_0x56b1ac(0x8d,0x0)]){_0x55bc1c[_0x56b1ac(0x44,0x51)](_0x1ea2a0);}const _0x248aaf=Buffer['concat'](_0x55bc1c)[_0x56b1ac(-0x6c,-0x3e)](_0x1f6e30['YHDqg'])[_0x56b1ac(0x41,-0x3b)]();!_0x248aaf&&(_0x1f6e30[_0x56b1ac(0xa1,-0x3)](closeSharedDb),process[_0x56b1ac(0x129,0x111)](0x0));const _0x1b55fe=setTimeout(()=>{console[_0x37b953(0xb3,0xcd)](_0x37b953(0xcd,0x9d)+_0x37b953(-0x5a,0x36)+_0x48d1c1(0x3c2,0x404)+_0x37b953(0x86,0xdd)+HOOK_TIMEOUT_MS+(_0x48d1c1(0x467,0x419)+_0x48d1c1(0x499,0x4a4)+_0x48d1c1(0x482,0x467)));function _0x37b953(_0x2044d8,_0x13c0e8){return _0x5c175c(_0x13c0e8- -0x137,_0x2044d8);}function _0x48d1c1(_0x1becd5,_0x20e85a){return _0x5c175c(_0x20e85a-0x289,_0x1becd5);}_0x1f6e30['nvKbP'](closeSharedDb),process[_0x48d1c1(0x487,0x4fa)](0x0);},HOOK_TIMEOUT_MS);function _0x56b1ac(_0x65e681,_0x216ad6){return _0x216698(_0x216ad6- -0x25f,_0x65e681);}function _0x5c175c(_0x28359d,_0x2dd082){return _0x216698(_0x28359d- -0xff,_0x2dd082);}_0x1b55fe[_0x56b1ac(0xe6,0xe6)]();try{const _0x44e85c=JSON[_0x56b1ac(-0x1e,-0x40)](_0x248aaf),_0x32ba77=normalizeHookInput(_0x44e85c),_0x43ebf9=await handleSessionStart(_0x32ba77);_0x43ebf9&&process['stdout'][_0x56b1ac(0x3e,-0x42)](_0x43ebf9);}catch(_0x19d9e8){console[_0x5c175c(0x204,0x2a9)](_0x5c175c(0x1d4,0x24b)+_0x56b1ac(-0x2d,0x33)+'rror:',_0x19d9e8 instanceof Error?_0x19d9e8[_0x5c175c(0x23a,0x293)]:_0x19d9e8);}finally{closeSharedDb(),process[_0x5c175c(0x271,0x22c)](0x0);}}const isMainModule=process[_0x345095(0x193,0x1c9)][0x1]?.[_0x216698(0x273,0x2ed)]('session-st'+_0x216698(0x276,0x297))||process[_0x345095(0x243,0x1c9)][0x1]?.['endsWith'](_0x345095(0x31e,0x2b0)+'art.ts');isMainModule&&main();