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,518 +1 @@
1
- /**
2
- * PostToolUse Hook
3
- *
4
- * Claude Code가 도구를 실행한 후 호출됩니다.
5
- * 중요도가 높은 행동을 로컬 DB에 자동 캡처합니다.
6
- * 비동기로 실행되어 Claude Code 응답을 블로킹하지 않습니다.
7
- */
8
- import { getSharedDb, closeSharedDb, normalizeHookInput } from './shared.js';
9
- import { ConfigManager } from '../config/manager.js';
10
- import { scoreSignificance } from '../extraction/scorer.js';
11
- import { filterSensitiveInfo } from '../extraction/filter.js';
12
- import { DedupManager } from '../extraction/dedup-manager.js';
13
- import { createLogger } from '../utils/logger.js';
14
- import { isClaudeMemoryFile } from '../claude/sync.js';
15
- import { createHookClient } from './client-factory.js';
16
- import { SyncQueue } from '../sync/queue.js';
17
- /** pending 메모리가 이 수 이상이면 PostToolUse에서 자동 push */
18
- const AUTO_SYNC_THRESHOLD = 20;
19
- /** PostToolUse sync 타임아웃 (Hook 속도 유지) */
20
- const AUTO_SYNC_TIMEOUT_MS = 10_000;
21
- export async function handlePostToolUse(context) {
22
- const t0 = performance.now();
23
- const config = new ConfigManager().load();
24
- const tConfigLoad = performance.now();
25
- const logger = createLogger('PostToolUse', config.logging);
26
- try {
27
- logger.info('Hook started', { toolName: context.toolName });
28
- if (!config.autoCapture.enabled) {
29
- logger.info('Auto-capture disabled');
30
- return;
31
- }
32
- // 트리거 도구인지 확인
33
- if (!config.autoCapture.triggers.includes(context.toolName)) {
34
- logger.debug('Tool not in triggers', { toolName: context.toolName });
35
- return;
36
- }
37
- // 민감 파일 체크
38
- const filePath = extractFilePath(context.toolInput);
39
- if (filePath && isSensitiveFile(filePath, config.autoCapture.excludePatterns)) {
40
- logger.info('Sensitive file excluded', { filePath });
41
- return;
42
- }
43
- // Claude auto-memory 파일 동기화 (Write/Edit → a2a-memory DB)
44
- if (filePath && isClaudeMemoryFile(filePath) &&
45
- (context.toolName === 'Write' || context.toolName === 'Edit')) {
46
- const tClaudeSyncStart = performance.now();
47
- try {
48
- const db = getSharedDb(config.db.path);
49
- const { syncClaudeMd } = await import('../claude/sync.js');
50
- await syncClaudeMd(db, {
51
- claudeMdPath: filePath,
52
- projectPath: context.projectPath,
53
- });
54
- const tClaudeSyncEnd = performance.now();
55
- const totalMs = Math.round(tClaudeSyncEnd - t0);
56
- const claudeSyncMs = Math.round(tClaudeSyncEnd - tClaudeSyncStart);
57
- const configMs = Math.round(tConfigLoad - t0);
58
- process.stderr.write(`[A2A] PostToolUse completed (total: ${totalMs}ms | config: ${configMs}ms, claudeSync: ${claudeSyncMs}ms)\n`);
59
- logger.info('Claude memory file synced', { filePath });
60
- }
61
- catch (syncErr) {
62
- logger.warn('Claude memory sync failed', {
63
- error: syncErr instanceof Error ? syncErr.message : String(syncErr),
64
- });
65
- }
66
- return; // 일반 캡처 로직 스킵 (구조화된 섹션 동기화로 대체)
67
- }
68
- // 중요도 점수 계산
69
- const tSignificanceStart = performance.now();
70
- const message = {
71
- uuid: context.sessionId,
72
- type: 'assistant',
73
- message: {
74
- role: 'assistant',
75
- content: context.toolResult,
76
- },
77
- timestamp: new Date().toISOString(),
78
- };
79
- const isNewFile = context.toolName === 'Write';
80
- const isConfigChange = filePath ? isConfigFile(filePath) : false;
81
- const hasError = detectActualError(context.toolResult, context.toolInput);
82
- // Extract bash command from tool input for significance scoring
83
- let bashCommand;
84
- if (context.toolName === 'Bash' && context.toolInput) {
85
- try {
86
- const parsed = typeof context.toolInput === 'string' ? JSON.parse(context.toolInput) : context.toolInput;
87
- bashCommand = parsed?.command ?? parsed?.cmd ?? (typeof parsed === 'string' ? parsed : undefined);
88
- }
89
- catch {
90
- bashCommand = typeof context.toolInput === 'string' ? context.toolInput : undefined;
91
- }
92
- }
93
- const significance = scoreSignificance(message, {
94
- toolName: context.toolName,
95
- isNewFile,
96
- isConfigChange,
97
- hasError,
98
- bashCommand,
99
- }, config.autoCapture.significanceThreshold);
100
- const tSignificanceEnd = performance.now();
101
- // 2단계 threshold: working tier(0.3~0.6)도 저장 허용
102
- const workingThreshold = config.autoCapture.significanceThreshold * 0.5; // 0.3
103
- logger.info('Tool evaluated', {
104
- toolName: context.toolName,
105
- score: significance.totalScore,
106
- shouldCapture: significance.totalScore >= workingThreshold,
107
- });
108
- if (significance.totalScore < workingThreshold) {
109
- return;
110
- }
111
- // 메모리 생성
112
- const category = determineCategory(context, hasError);
113
- const content = buildContent(context);
114
- const filtered = filterSensitiveInfo(content);
115
- // 2단계 tier 결정: working(0.3~threshold) vs semantic(threshold+)
116
- let tier;
117
- if (hasError) {
118
- tier = 'episodic';
119
- }
120
- else if (significance.totalScore < config.autoCapture.significanceThreshold) {
121
- tier = 'working';
122
- }
123
- else {
124
- tier = 'semantic';
125
- }
126
- const input = {
127
- content: filtered.filtered,
128
- category,
129
- tier,
130
- tags: buildTags(context),
131
- projectPath: context.projectPath,
132
- sessionId: context.sessionId,
133
- };
134
- const db = getSharedDb(config.db.path);
135
- // Mem0 패턴: 4-Way 중복 판단 (ADD/UPDATE/DELETE/NOOP)
136
- const tDedupStart = performance.now();
137
- const dedupManager = new DedupManager();
138
- const existingMemories = dedupManager.findCandidates(db.listMemories({ projectPath: context.projectPath, limit: 50 }), category, context.projectPath);
139
- const decision = dedupManager.decide(filtered.filtered, existingMemories);
140
- const tDedupEnd = performance.now();
141
- logger.info('Dedup decision', { action: decision.action, similarity: decision.similarity });
142
- const tDbWriteStart = performance.now();
143
- let created;
144
- try {
145
- switch (decision.action) {
146
- case 'NOOP':
147
- // 완전 중복 — 무시
148
- logger.info('Memory skipped (duplicate)', { similarity: decision.similarity });
149
- return;
150
- case 'UPDATE':
151
- // 기존 메모리 업데이트
152
- if (decision.targetMemory) {
153
- const mergedContent = dedupManager.mergeContent(decision.targetMemory.content, filtered.filtered);
154
- db.updateMemory(decision.targetMemory.id, {
155
- content: mergedContent,
156
- tags: [...new Set([...(decision.targetMemory.tags || []), ...buildTags(context)])],
157
- });
158
- logger.info('Memory updated (merged)', { memoryId: decision.targetMemory.id });
159
- }
160
- return;
161
- case 'DELETE': {
162
- // 기존 삭제 후 새로 생성
163
- if (decision.targetMemory) {
164
- db.deleteMemory(decision.targetMemory.id);
165
- logger.info('Old memory deleted', { memoryId: decision.targetMemory.id });
166
- }
167
- created = db.createMemory(input);
168
- if (tier !== 'working') {
169
- db.setSyncStatus(created.id, null, 'pending');
170
- }
171
- logger.info('Memory captured (after delete)', { category, memoryId: created.id });
172
- break;
173
- }
174
- case 'ADD':
175
- default:
176
- created = db.createMemory(input);
177
- // sync 대기 상태 설정 (~1ms)
178
- // working tier는 서버에서 in-memory만 저장하므로 sync 제외
179
- if (tier !== 'working') {
180
- db.setSyncStatus(created.id, null, 'pending');
181
- }
182
- logger.info('Memory captured', { category, memoryId: created.id });
183
- break;
184
- }
185
- }
186
- catch (dbErr) {
187
- // 메모리 생성 실패 시 에러 로깅 (hook은 실패해도 Claude Code 영향 없어야 함)
188
- const errObj = dbErr instanceof Error ? dbErr : new Error(String(dbErr));
189
- logger.error('Memory creation failed', errObj, { category });
190
- // 에러를 삼키고 계속 진행
191
- }
192
- const tDbWriteEnd = performance.now();
193
- // 로컬 임베딩 자동 생성 (~1ms, hook 속도 유지)
194
- if (created && config.embedding?.enabled && config.embedding.provider === 'local') {
195
- try {
196
- const { createEmbeddingProvider } = await import('../embedding/index.js');
197
- const provider = createEmbeddingProvider(config.embedding, config.llm);
198
- const emb = await Promise.resolve(provider.embed(created.content));
199
- if (Array.isArray(emb)) {
200
- db.saveEmbedding(created.id, emb);
201
- }
202
- }
203
- catch (embErr) {
204
- // 임베딩 생성 실패 무시 — 다음 세션에서 재시도
205
- logger.warn('Embedding failed', { error: embErr instanceof Error ? embErr.message : String(embErr) });
206
- }
207
- }
208
- // OpenAI 임베딩은 SessionEnd에서 일괄 처리 (hook 속도 유지)
209
- // 주입 키워드 매칭 (fire-and-forget, < 10ms)
210
- try {
211
- const injection = db.getLatestInjection(context.sessionId);
212
- if (injection && injection.injectedKeywords) {
213
- const toolText = `${context.toolName} ${JSON.stringify(context.toolInput)} ${String(context.toolResult)}`.toLowerCase();
214
- const keywords = JSON.parse(injection.injectedKeywords);
215
- const matched = keywords.filter((kw) => toolText.includes(kw));
216
- if (matched.length > 0) {
217
- db.recordInjectionHit(injection.id, matched, context.toolName);
218
- }
219
- }
220
- }
221
- catch {
222
- // 매칭 실패는 비치명적
223
- }
224
- // 추출 평가 기록 (ADD/DELETE 시에만)
225
- if (created && (decision.action === 'ADD' || decision.action === 'DELETE')) {
226
- try {
227
- db.recordExtractionEval({
228
- memoryId: created.id,
229
- sessionId: context.sessionId,
230
- significanceScore: significance.totalScore,
231
- dedupAction: decision.action,
232
- tier,
233
- });
234
- }
235
- catch {
236
- // 평가 기록 실패는 비치명적
237
- }
238
- }
239
- // 스킬 자동 갱신: 새 메모리가 기존 스킬과 유사하면 흡수 (fire-and-forget, < 10ms)
240
- if (created && created.embedding && config.skillConversion?.enabled) {
241
- try {
242
- const { SkillEvaluator } = await import('../skill/evaluator.js');
243
- const evaluator = new SkillEvaluator(db, config);
244
- const absorption = evaluator.absorbIntoSkill(created);
245
- if (absorption.absorbed) {
246
- logger.info('Memory absorbed into skill', { memoryId: created.id, skillId: absorption.skillId });
247
- }
248
- }
249
- catch {
250
- // 스킬 갱신 실패는 비치명적
251
- }
252
- }
253
- // 자동 동기화: pending이 임계치 이상이면 백그라운드 push
254
- const tAutoSyncStart = performance.now();
255
- let autoSyncMs = 0;
256
- if (config.autoSync?.enabled && config.server?.apiKey) {
257
- try {
258
- const pendingCount = db.getPendingSyncCount();
259
- if (pendingCount >= AUTO_SYNC_THRESHOLD) {
260
- const client = createHookClient(config);
261
- if (client) {
262
- const queue = new SyncQueue(db, client);
263
- const flushResult = await queue.flush({ timeoutMs: AUTO_SYNC_TIMEOUT_MS });
264
- if (flushResult.pushed > 0) {
265
- logger.info('Auto-sync pushed', { pushed: flushResult.pushed, pending: pendingCount });
266
- console.error(`[a2a] Auto-synced ${flushResult.pushed} memories`);
267
- }
268
- }
269
- }
270
- }
271
- catch (syncErr) {
272
- // sync 실패는 무시 — 다음 기회에 재시도
273
- logger.warn('Auto-sync failed', { error: syncErr instanceof Error ? syncErr.message : String(syncErr) });
274
- }
275
- autoSyncMs = Math.round(performance.now() - tAutoSyncStart);
276
- }
277
- const totalMs = Math.round(performance.now() - t0);
278
- const configMs = Math.round(tConfigLoad - t0);
279
- const significanceMs = Math.round(tSignificanceEnd - tSignificanceStart);
280
- const dedupMs = Math.round(tDedupEnd - tDedupStart);
281
- const dbMs = Math.round(tDbWriteEnd - tDbWriteStart);
282
- const syncPart = autoSyncMs > 0 ? `, sync: ${autoSyncMs}ms` : '';
283
- process.stderr.write(`[A2A] PostToolUse completed (total: ${totalMs}ms | config: ${configMs}ms, significance: ${significanceMs}ms, dedup: ${dedupMs}ms, db: ${dbMs}ms${syncPart})\n`);
284
- logger.info('Hook completed', { durationMs: totalMs });
285
- }
286
- finally {
287
- logger.flush();
288
- }
289
- }
290
- function extractFilePath(toolInput) {
291
- if (typeof toolInput.file_path === 'string')
292
- return toolInput.file_path;
293
- if (typeof toolInput.path === 'string')
294
- return toolInput.path;
295
- return null;
296
- }
297
- function isSensitiveFile(filePath, patterns) {
298
- const fileName = filePath.split('/').pop() ?? '';
299
- return patterns.some((pattern) => {
300
- if (pattern.startsWith('*'))
301
- return fileName.endsWith(pattern.slice(1));
302
- if (pattern.endsWith('*'))
303
- return fileName.startsWith(pattern.slice(0, -1));
304
- return fileName === pattern;
305
- });
306
- }
307
- function isConfigFile(filePath) {
308
- const configExts = ['.json', '.yaml', '.yml', '.toml', '.env', '.ini', '.cfg'];
309
- return configExts.some((ext) => filePath.endsWith(ext));
310
- }
311
- function detectActualError(result, input) {
312
- // 짧은 성공 메시지의 오탐 방지 (200자 미만)
313
- if (result.length < 200)
314
- return false;
315
- // Read 도구의 파일 내용에 "error" 포함된 경우 제외 (코드 자체의 에러 문자열)
316
- const toolName = input?.toolName;
317
- if (toolName === 'Read')
318
- return false;
319
- const lowerResult = result.toLowerCase();
320
- // 구분자 포함 패턴만 사용 ('error '(공백) 패턴 제거 → 오탐 감소)
321
- const errorPatterns = ['error:', 'Error:', 'ERROR:', 'exception', 'Exception', 'failed:', 'Failed:', 'FAILED', 'traceback', 'Traceback'];
322
- const hasErrorKeyword = errorPatterns.some((kw) => result.includes(kw) || lowerResult.includes(kw.toLowerCase()));
323
- if (!hasErrorKeyword)
324
- return false;
325
- // 파일명에만 'error'가 있는 경우 제외
326
- const filePath = (input?.file_path || input?.path || '');
327
- if (filePath.toLowerCase().includes('error') &&
328
- !errorPatterns.slice(2).some((kw) => lowerResult.includes(kw.toLowerCase()))) {
329
- return false;
330
- }
331
- return true;
332
- }
333
- function determineCategory(context, hasError) {
334
- if (hasError)
335
- return 'error_solution';
336
- const lowerResult = context.toolResult.toLowerCase();
337
- // Bash 도구: decision/convention 감지 (context에 몰리지 않도록 분류 강화)
338
- if (context.toolName === 'Bash') {
339
- const decisionKeywords = ['chose', 'decided', 'opted for', 'selected', 'picked', 'went with'];
340
- if (decisionKeywords.some((kw) => lowerResult.includes(kw))) {
341
- return 'decision';
342
- }
343
- const conventionKeywords = ['convention', 'standard', 'pattern', 'rule', 'guideline', 'best practice'];
344
- if (conventionKeywords.some((kw) => lowerResult.includes(kw))) {
345
- return 'convention';
346
- }
347
- }
348
- // Read/Grep/Glob: 프로젝트 탐색 컨텍스트로 분류
349
- if (context.toolName === 'Read' || context.toolName === 'Grep' || context.toolName === 'Glob') {
350
- return 'context';
351
- }
352
- // Issue 1 Fix: Don't auto-assign code_pattern for Write/Edit
353
- if (context.toolName === 'Write' || context.toolName === 'Edit') {
354
- const filePath = extractFilePath(context.toolInput);
355
- const result = context.toolResult;
356
- // Test/tmp files → context
357
- if (filePath && (filePath.includes('/test/') || filePath.includes('/tmp/'))) {
358
- return 'context';
359
- }
360
- // Simple success messages → context
361
- if (result.length < 50 ||
362
- result.toLowerCase().includes('file written successfully') ||
363
- result.toLowerCase().includes('file created') ||
364
- result.toLowerCase().includes('created successfully')) {
365
- return 'context';
366
- }
367
- // Only code_pattern if meaningful content
368
- return 'code_pattern';
369
- }
370
- return 'context';
371
- }
372
- /**
373
- * "Tool: {name}" prefix는 노이즈를 유발하므로 제거합니다.
374
- * 파일 작업 성공 메시지처럼 의미없는 toolResult도 필터링합니다.
375
- */
376
- function buildContent(context) {
377
- const filePath = extractFilePath(context.toolInput);
378
- const parts = [];
379
- if (filePath)
380
- parts.push(`File: ${filePath}`);
381
- let result = context.toolResult.slice(0, 1500).trim();
382
- // Bash stdout/stderr JSON → 의미 있는 텍스트 추출
383
- if (context.toolName === 'Bash' && result.startsWith('{')) {
384
- result = extractBashContent(result);
385
- }
386
- // 과도한 JSON/코드 블록 → 핵심만 추출
387
- if (result.length > 500 && (result.startsWith('{') || result.startsWith('['))) {
388
- result = summarizeJsonResult(result);
389
- }
390
- result = result.slice(0, 1000).trim();
391
- if (result && !isNoiseResult(result)) {
392
- parts.push(result);
393
- }
394
- if (parts.length === 0) {
395
- parts.push(`${context.toolName} executed`);
396
- }
397
- return parts.join('\n');
398
- }
399
- /** Bash toolResult JSON에서 stdout/stderr 텍스트 추출 */
400
- function extractBashContent(raw) {
401
- try {
402
- const parsed = JSON.parse(raw);
403
- const stdout = (parsed.stdout || '').trim();
404
- const stderr = (parsed.stderr || '').trim();
405
- // 에러가 있으면 에러 우선
406
- if (stderr && stderr.length > 10) {
407
- return `[Error] ${stderr.slice(0, 500)}${stdout ? '\n[Output] ' + stdout.slice(0, 300) : ''}`;
408
- }
409
- // stdout만 있으면 그대로
410
- if (stdout) {
411
- return stdout.slice(0, 1000);
412
- }
413
- return raw.slice(0, 500);
414
- }
415
- catch {
416
- return raw.slice(0, 1000);
417
- }
418
- }
419
- /** 긴 JSON 결과를 핵심 키/값으로 요약 */
420
- function summarizeJsonResult(raw) {
421
- try {
422
- const parsed = JSON.parse(raw);
423
- if (Array.isArray(parsed)) {
424
- return `[Array: ${parsed.length} items] ${JSON.stringify(parsed[0]).slice(0, 200)}...`;
425
- }
426
- // 주요 키만 추출
427
- const keys = Object.keys(parsed).slice(0, 10);
428
- const summary = keys.map(k => {
429
- const v = parsed[k];
430
- const vs = typeof v === 'string' ? v.slice(0, 80) : JSON.stringify(v).slice(0, 80);
431
- return `${k}: ${vs}`;
432
- }).join(', ');
433
- return summary.slice(0, 800);
434
- }
435
- catch {
436
- return raw.slice(0, 500);
437
- }
438
- }
439
- /** 파일 작업 성공 메시지 등 저가치 결과 판별 */
440
- function isNoiseResult(result) {
441
- const NOISE_RESULT_PATTERNS = [
442
- /^File (?:created|updated|written|modified|deleted)(?: successfully)?\.?$/i,
443
- /^(?:File )?(?:written|created|saved) successfully\.?$/i,
444
- /^(?:No|0) (?:files?|changes?) /i,
445
- /^\d+ files? (?:found|matched|updated|deleted)\.?$/i,
446
- /^(?:Success|Done|OK|Created|Updated|Deleted)\.?$/i,
447
- ];
448
- return NOISE_RESULT_PATTERNS.some(p => p.test(result.trim()));
449
- }
450
- /** URL 파편·카테고리 중복·도구명 등 저가치 태그 blocklist */
451
- const TAG_BLOCKLIST = new Set([
452
- 'id', 'com', 'app', 'get', 'set', 'src', 'table', 'the', 'to', 'in', 'of', 'a', 'is', 'for',
453
- 'now', 'add', 'name', 'value', 'map', 'trim', 'type', 'data', 'list', 'new', 'test',
454
- 'decision', 'error_solution', 'code_pattern', 'context', 'convention', 'skill', 'learning', 'project_knowledge',
455
- // 도구명 태그 제외 (무의미한 반복)
456
- 'Write', 'Edit', 'Bash', 'Read', 'Glob', 'Grep', 'Task', 'WebFetch', 'WebSearch',
457
- 'write', 'edit', 'bash', 'read', 'glob', 'grep', 'task', 'webfetch', 'websearch',
458
- ]);
459
- function buildTags(context) {
460
- const tags = [];
461
- const filePath = extractFilePath(context.toolInput);
462
- if (filePath) {
463
- // 의미 있는 파일경로 토큰 추출 (디렉토리명 + 확장자)
464
- const parts = filePath.split('/').filter(Boolean);
465
- // 마지막 2~3 경로 세그먼트에서 의미 추출
466
- const meaningful = parts.slice(-3).filter((p) => p.length > 2 && !TAG_BLOCKLIST.has(p.toLowerCase()));
467
- for (const token of meaningful.slice(0, 2)) {
468
- const clean = token.replace(/\.[^.]+$/, ''); // 확장자 제거
469
- if (clean.length > 2 && !TAG_BLOCKLIST.has(clean.toLowerCase())) {
470
- tags.push(clean);
471
- }
472
- }
473
- // 확장자 태그 (고가치만)
474
- const ext = filePath.split('.').pop();
475
- if (ext) {
476
- const lower = ext.toLowerCase();
477
- if (!/^\d+$/.test(ext) && ext.length > 2 && !TAG_BLOCKLIST.has(lower)) {
478
- const lowValueExts = ['md', 'txt', 'json', 'yml', 'yaml', 'xml', 'html', 'css'];
479
- if (!lowValueExts.includes(lower)) {
480
- tags.push(ext);
481
- }
482
- }
483
- }
484
- }
485
- return tags;
486
- }
487
- /**
488
- * CLI 엔트리포인트
489
- */
490
- export async function main() {
491
- const chunks = [];
492
- for await (const chunk of process.stdin) {
493
- chunks.push(chunk);
494
- }
495
- const input = Buffer.concat(chunks).toString('utf-8').trim();
496
- if (!input) {
497
- process.exit(0);
498
- }
499
- try {
500
- const raw = JSON.parse(input);
501
- const context = normalizeHookInput(raw);
502
- await handlePostToolUse(context);
503
- }
504
- catch (err) {
505
- console.error('[a2a] PostToolUse error:', err instanceof Error ? err.message : err);
506
- process.exit(0);
507
- }
508
- finally {
509
- closeSharedDb();
510
- }
511
- }
512
- // 직접 실행 시에만 main() 호출
513
- const isMainModule = process.argv[1]?.endsWith('post-tool-use.js') ||
514
- process.argv[1]?.endsWith('post-tool-use.ts');
515
- if (isMainModule) {
516
- main();
517
- }
518
- //# sourceMappingURL=post-tool-use.js.map
1
+ (function(_0x58982c,_0x278909){const _0x5723b0=_0x58982c();function _0x5d1311(_0x9709cf,_0x1afa79){return _0x3b27(_0x1afa79-0x289,_0x9709cf);}function _0x4f952c(_0x3851c7,_0x372a11){return _0x3b27(_0x372a11- -0x318,_0x3851c7);}while(!![]){try{const _0x799616=-parseInt(_0x5d1311(0x478,0x521))/0x1*(parseInt(_0x4f952c(-0x11d,-0xf7))/0x2)+parseInt(_0x4f952c(-0x11b,-0xd4))/0x3*(-parseInt(_0x5d1311(0x493,0x4cb))/0x4)+-parseInt(_0x4f952c(-0x98,-0x1a))/0x5*(parseInt(_0x4f952c(-0xcc,-0x125))/0x6)+parseInt(_0x5d1311(0x4c1,0x540))/0x7+parseInt(_0x4f952c(-0x7a,-0xf1))/0x8*(parseInt(_0x4f952c(-0x85,-0xf0))/0x9)+parseInt(_0x4f952c(-0x151,-0x141))/0xa*(-parseInt(_0x5d1311(0x4d2,0x483))/0xb)+-parseInt(_0x4f952c(-0x11c,-0xf6))/0xc*(-parseInt(_0x4f952c(-0x102,-0xeb))/0xd);if(_0x799616===_0x278909)break;else _0x5723b0['push'](_0x5723b0['shift']());}catch(_0x227286){_0x5723b0['push'](_0x5723b0['shift']());}}}(_0x5d23,0x85a2a));function _0x328e29(_0x463057,_0x3263bc){return _0x3b27(_0x463057- -0x14d,_0x3263bc);}import{readFileSync,writeFileSync,existsSync,mkdirSync}from'node:fs';import{join}from'node:path';import{homedir}from'node:os';import{getSharedDb,closeSharedDb,normalizeHookInput}from'./shared.js';import{ConfigManager}from'../config/manager.js';import{scoreSignificance}from'../extraction/scorer.js';import{filterSensitiveInfo}from'../extraction/filter.js';import{DedupManager}from'../extraction/dedup-manager.js';import{createLogger}from'../utils/logger.js';import{isClaudeMemoryFile}from'../claude/sync.js';import{createHookClient}from'./client-factory.js';import{SyncQueue}from'../sync/queue.js';const AUTO_SYNC_THRESHOLD=0x14,RULE_STRONG_KEYWORDS=/금지|절대|must not|never|mandatory|필수|반드시/gi;function parseFrontmatterType(_0x1d66a5){const _0x31ea4c=_0x1d66a5['match'](/^---\n[\s\S]*?^type:\s*(\w+)/m);return _0x31ea4c?_0x31ea4c[0x1]:null;}function parseFrontmatterDescription(_0x16dc3b){function _0x2eff76(_0x3f1178,_0x32dac6){return _0x3b27(_0x3f1178- -0x17a,_0x32dac6);}const _0x45690f=_0x16dc3b['match'](/^---\n[\s\S]*?^description:\s*(.+)/m);return _0x45690f?_0x45690f[0x1][_0x2eff76(0x7c,0xe5)]():null;}function isRuleContent(_0x1f37e9){const _0x1c2e33={'UxmWK':function(_0x500c67,_0xa55db6){return _0x500c67===_0xa55db6;}},_0x3021a9=parseFrontmatterType(_0x1f37e9);function _0xda34cb(_0x53dda0,_0xc20680){return _0x3b27(_0x53dda0-0x361,_0xc20680);}if(_0x1c2e33[_0xda34cb(0x5ec,0x63d)](_0x3021a9,_0xda34cb(0x563,0x4eb)))return!![];const _0x254734=extractBody(_0x1f37e9),_0x57dd1e=(_0x254734['match'](/\|/g)||[])[_0xda34cb(0x67e,0x615)];if(_0x57dd1e>0xa)return![];const _0x65bb35=_0x254734[_0xda34cb(0x65c,0x5bc)](RULE_STRONG_KEYWORDS)||[];if(_0x254734[_0xda34cb(0x67e,0x644)]<=0xc8)return _0x65bb35[_0x28c7b1(-0x96,0x5)]>=0x1;function _0x28c7b1(_0x2a00a6,_0xbeb410){return _0x3b27(_0x2a00a6- -0x3b3,_0xbeb410);}return _0x65bb35[_0xda34cb(0x67e,0x72f)]>=0x2;}function extractBody(_0x13753e){function _0x3ff373(_0x174396,_0x41a471){return _0x3b27(_0x174396- -0x1c1,_0x41a471);}function _0x4ad8b6(_0x379c7a,_0x402aeb){return _0x3b27(_0x402aeb-0x225,_0x379c7a);}const _0x2b47d6={'nUJfN':function(_0x1bd6fe,_0x2e4de2){return _0x1bd6fe+_0x2e4de2;},'eydCw':_0x4ad8b6(0x5d7,0x521),'WcthX':function(_0x2b5a37,_0x5cdae6){return _0x2b5a37!==_0x5cdae6;},'zWcnN':function(_0x34fdff,_0x23f76c){return _0x34fdff+_0x23f76c;}},_0x43399e=_0x13753e[_0x4ad8b6(0x41c,0x4ac)](_0x3ff373(0x13b,0x1d8),_0x2b47d6[_0x4ad8b6(0x5f4,0x54a)](_0x13753e[_0x4ad8b6(0x479,0x4ac)](_0x2b47d6[_0x4ad8b6(0x43d,0x4d4)]),0x3));if(_0x2b47d6['WcthX'](_0x43399e,-0x1))return _0x13753e[_0x4ad8b6(0x4f7,0x49a)](_0x2b47d6['zWcnN'](_0x43399e,0x3))['trim']();return _0x13753e[_0x3ff373(0x35,-0x3c)]();}function getRulesTarget(_0x511efc){function _0x5425b9(_0x5e29ab,_0xa2a388){return _0x3b27(_0x5e29ab- -0x14d,_0xa2a388);}function _0x49b51b(_0x554d02,_0xadabd9){return _0x3b27(_0x554d02-0x85,_0xadabd9);}const _0x901afa={'Fxghj':function(_0x5ef041,_0x33560a){return _0x5ef041(_0x33560a);},'IgiGR':function(_0x489172){return _0x489172();},'yXNox':'.claude','DEcSn':function(_0x59f76f,_0x196e9e,_0x4b621e){return _0x59f76f(_0x196e9e,_0x4b621e);},'ytDjh':'auto-rules'+'.md'};if(_0x511efc){const _0x45c730=join(_0x511efc,'.claude',_0x49b51b(0x243,0x21b));return!_0x901afa['Fxghj'](existsSync,_0x45c730)&&mkdirSync(_0x45c730,{'recursive':!![]}),join(_0x45c730,'auto-rules'+_0x49b51b(0x2c6,0x2b6));}const _0x35003d=join(_0x901afa[_0x5425b9(0x176,0x188)](homedir),_0x901afa['yXNox'],_0x49b51b(0x243,0x225),_0x49b51b(0x2c8,0x316));return!_0x901afa['Fxghj'](existsSync,_0x35003d)&&_0x901afa[_0x5425b9(0x197,0x22d)](mkdirSync,_0x35003d,{'recursive':!![]}),join(_0x35003d,_0x901afa['ytDjh']);}function extractRuleSummary(_0x584864){function _0x3ab5c4(_0xa7a7c7,_0x1644e9){return _0x3b27(_0xa7a7c7-0x29e,_0x1644e9);}const _0xa1b98a={'wBqXt':function(_0x4c5ada,_0xf39db8){return _0x4c5ada(_0xf39db8);},'llfzx':_0x37490e(0x1cf,0x180)},_0x542f95=parseFrontmatterDescription(_0x584864);function _0x37490e(_0x10c831,_0x427998){return _0x3b27(_0x10c831- -0x11c,_0x427998);}if(_0x542f95&&_0x542f95['length']>=0xa)return _0x542f95;const _0x417f1c=_0xa1b98a['wBqXt'](extractBody,_0x584864),_0x4c129d=_0x417f1c['split']('\x0a');for(const _0xe87316 of _0x4c129d){const _0x246083=_0xe87316[_0x3ab5c4(0x494,0x4c0)]();if(_0x246083[_0x3ab5c4(0x5bb,0x523)]<0xa)continue;if(_0x246083[_0x37490e(0x1c6,0x14e)]('#'))continue;if(_0x246083['startsWith']('[')&&_0x246083[_0x37490e(0xef,0xef)](']('))continue;if(_0x246083[_0x37490e(0x1c6,0x172)]('|')||_0x246083[_0x37490e(0x1c6,0x138)]('>'))continue;if(_0x246083[_0x3ab5c4(0x580,0x601)](_0xa1b98a['llfzx']))continue;const _0x317306=_0x246083[_0x37490e(0x1f1,0x1c3)](/^[-*]\s+/,'')['replace'](/^\d+\.\s+/,'');if(_0x317306[_0x3ab5c4(0x5bb,0x5f1)]>=0xa)return _0x317306['slice'](0x0,0xc8);}return null;}function compileToClaudeRules(_0x433f5c,_0x437065){const _0x1963a4={'VdeQT':function(_0x4d4ea0,_0x9bcc48){return _0x4d4ea0(_0x9bcc48);},'OqTNn':function(_0x424377,_0x184922){return _0x424377(_0x184922);},'kEqJN':function(_0x1d7705,_0x5d18c3){return _0x1d7705(_0x5d18c3);},'sMfgZ':function(_0x1c4017,_0x2a99f7,_0x3abdac){return _0x1c4017(_0x2a99f7,_0x3abdac);},'ADXXO':'utf-8','lisuz':function(_0x4576af,_0x2d7b23,_0x33690f,_0x41448a){return _0x4576af(_0x2d7b23,_0x33690f,_0x41448a);}};function _0xae5177(_0x8931b8,_0x51773d){return _0x3b27(_0x51773d- -0x1d4,_0x8931b8);}const _0x5bac9b=_0x1963a4[_0x4377f0(0x104,0x137)](extractRuleSummary,_0x433f5c);if(!_0x5bac9b)return![];const _0x4758bc=_0x1963a4[_0x4377f0(0x164,0x12c)](getRulesTarget,_0x437065);if(_0x1963a4['kEqJN'](existsSync,_0x4758bc)){const _0x3c780f=_0x1963a4[_0x4377f0(-0x1a,0x7f)](readFileSync,_0x4758bc,_0x1963a4[_0xae5177(0x69,0x14)]),_0x22da52=_0x5bac9b['slice'](0x0,0x32);if(_0x22da52&&_0x3c780f['includes'](_0x22da52))return![];}const _0x57c00a='\x0a-\x20'+_0x5bac9b+'\x0a',_0x592dd4=_0x1963a4['kEqJN'](existsSync,_0x4758bc)?'':_0xae5177(0xe3,0x42)+_0x4377f0(0x1a3,0xed)+_0xae5177(0x117,0x153)+'oolUse에서\x20자'+'동\x20감지된\x20규칙입니'+_0x4377f0(0xb9,0x32);function _0x4377f0(_0x298735,_0x1f2400){return _0x3b27(_0x1f2400- -0x1e3,_0x298735);}return _0x1963a4['lisuz'](writeFileSync,_0x4758bc,_0x592dd4,{'flag':'a'}),_0x1963a4[_0x4377f0(0x3f,-0x1a)](writeFileSync,_0x4758bc,_0x57c00a,{'flag':'a'}),!![];}const AUTO_SYNC_TIMEOUT_MS=0x2710;export async function handlePostToolUse(_0x100135){function _0x2a9f2(_0x26a8bb,_0x3f7462){return _0x3b27(_0x3f7462- -0x1bb,_0x26a8bb);}const _0x1ead63={'McwKJ':function(_0x81f065){return _0x81f065();},'SNdSA':function(_0x1c105d,_0x27f49e,_0x12191c){return _0x1c105d(_0x27f49e,_0x12191c);},'QOSWO':_0x180168(-0x5b,-0x87)+_0x180168(-0x11e,-0x85)+_0x2a9f2(0xbb,0x101)+_0x180168(-0xed,-0x81),'ZYGDQ':'Auto-captu'+_0x180168(-0x101,-0xa9)+'d','uNWZh':function(_0x2def20,_0x2133b7){return _0x2def20<_0x2133b7;},'Rbrqa':function(_0x287f30,_0x54b5b4){return _0x287f30===_0x54b5b4;},'xAJWa':_0x180168(-0x46,-0xdc),'bDmMA':'Exception','lFzNA':_0x2a9f2(-0x4b,0x2),'DvMLL':'Failed:','loegL':_0x2a9f2(0x70,0x42),'vVCll':_0x2a9f2(0x64,0x7d),'LIxbr':_0x180168(-0xd,0x38),'EKoYd':function(_0x5d77c6,_0x55a593,_0x2a6213){return _0x5d77c6(_0x55a593,_0x2a6213);},'Xklji':_0x180168(0x14,-0x43)+'e','clLlC':_0x2a9f2(-0x3e,0x71)+'ed','yNPDt':function(_0x150c96,_0x3c00e6){return _0x150c96(_0x3c00e6);},'FMHdg':_0x180168(-0x178,-0xd1),'fkBHI':function(_0x3e7b2c,_0x56b139,_0x590e44){return _0x3e7b2c(_0x56b139,_0x590e44);},'zZsZI':function(_0x472a1f,_0x3d75ae){return _0x472a1f-_0x3d75ae;},'UHMCA':function(_0x26b258,_0x44f3a0){return _0x26b258!==_0x44f3a0;},'ePmMw':_0x180168(-0xe,0x1),'UxhuY':function(_0x5d3ef1,_0x3009e9,_0x1479c0){return _0x5d3ef1(_0x3009e9,_0x1479c0);},'bNPdV':_0x2a9f2(0xa5,0xd5),'nalMA':_0x2a9f2(0x1bd,0x161),'BfuYe':function(_0x399db8,_0x3ed5d1){return _0x399db8===_0x3ed5d1;},'QKdSU':'Bash','tyzbD':_0x180168(-0x4e,0x4a)+_0x180168(-0x6d,0x31),'XzLiL':function(_0x3d824b,_0x2dfadc){return _0x3d824b<_0x2dfadc;},'OpOHq':function(_0x5c9f3d,_0x3b7596,_0x15c3a7){return _0x5c9f3d(_0x3b7596,_0x15c3a7);},'LBoIC':function(_0xe5b823,_0x3625c4){return _0xe5b823(_0x3625c4);},'fBnYM':_0x180168(-0x12d,-0x119),'kmaAA':_0x2a9f2(0xfd,0x109),'kghIn':function(_0x1fbfe0,_0x2d1821){return _0x1fbfe0(_0x2d1821);},'vCqOo':_0x2a9f2(0x84,0x11f),'UwhtW':_0x2a9f2(0xb7,0x13e)+'pped\x20(dupl'+_0x180168(-0x4c,-0x105),'kYqQR':function(_0x4510bb,_0xc3c5dd){return _0x4510bb!==_0xc3c5dd;},'rpKXX':_0x180168(-0x1d,0x36),'PCEbW':function(_0x23a9f8,_0x419f64){return _0x23a9f8(_0x419f64);},'EXCZH':_0x2a9f2(0xde,0xc0),'iVMsp':_0x180168(0x1a,-0x49),'JOoQm':_0x2a9f2(0xb0,0xfe),'eUbmo':_0x2a9f2(0xa2,0x8f)+_0x180168(-0x122,-0xc6),'xQPBf':_0x2a9f2(0x95,0x2e),'IHdfx':'../embeddi'+_0x180168(-0x64,-0xd4)+'s','EYSoV':function(_0x13f07a,_0x5c33d1,_0x5f523b){return _0x13f07a(_0x5c33d1,_0x5f523b);},'KUDQI':_0x180168(-0xe8,-0xf7),'hmVxZ':function(_0x3d993a,_0x25479b){return _0x3d993a(_0x25479b);},'CkKDN':function(_0x31fd30,_0x1eb53b){return _0x31fd30>_0x1eb53b;},'xyVLH':_0x180168(-0x35,-0x51),'vzYuC':_0x180168(-0x5b,-0xd3)+'valuator.j'+'s','GfVkr':_0x180168(-0x5c,-0x37)+_0x2a9f2(0x57,0x58)+_0x2a9f2(0x1a6,0x133),'XXZFq':function(_0x30e6a8,_0x2a3016){return _0x30e6a8===_0x2a3016;},'UYLNW':'ZqqJO','IGweq':'Auto-sync\x20'+_0x2a9f2(0x82,0x4),'dKLcv':function(_0x4c8389,_0x3db600){return _0x4c8389-_0x3db600;},'ztKJz':function(_0x14f896,_0x173e5d){return _0x14f896-_0x173e5d;}};function _0x180168(_0x4e35fa,_0x33d2ee){return _0x3b27(_0x33d2ee- -0x2da,_0x4e35fa);}const _0x155b3f=performance['now'](),_0x467888=new ConfigManager()[_0x180168(-0x114,-0x107)](),_0xadd228=performance[_0x2a9f2(0x1c0,0x14f)](),_0x4e0b77=_0x1ead63[_0x180168(-0x1a2,-0x104)](createLogger,_0x1ead63['Xklji'],_0x467888[_0x2a9f2(0x92,0x32)]);try{_0x4e0b77['info'](_0x1ead63[_0x2a9f2(0x1df,0x13b)],{'toolName':_0x100135[_0x2a9f2(0x1a1,0xf6)]});if(!_0x467888[_0x2a9f2(0x154,0xb2)+'e'][_0x180168(-0x4f,-0xcd)]){_0x4e0b77[_0x180168(0x2c,0x1e)]('Auto-captu'+_0x2a9f2(0x2f,0x76)+'d');return;}if(!_0x467888['autoCaptur'+'e'][_0x180168(-0x17,-0x7f)][_0x180168(-0x3d,-0xcf)](_0x100135['toolName'])){_0x4e0b77['debug']('Tool\x20not\x20i'+_0x180168(-0x4f,-0x1),{'toolName':_0x100135[_0x180168(-0xe1,-0x29)]});return;}const _0x13780e=extractFilePath(_0x100135[_0x180168(0x66,0x2e)]);if(_0x13780e&&isSensitiveFile(_0x13780e,_0x467888[_0x2a9f2(0x0,0xb2)+'e'][_0x2a9f2(0x1b9,0x144)+'terns'])){_0x4e0b77[_0x180168(0xa,0x1e)]('Sensitive\x20'+_0x180168(-0x105,-0xd6)+'ded',{'filePath':_0x13780e});return;}if(_0x13780e&&_0x1ead63['yNPDt'](isClaudeMemoryFile,_0x13780e)&&(_0x1ead63[_0x2a9f2(0x158,0xd1)](_0x100135[_0x2a9f2(0x161,0xf6)],_0x1ead63['FMHdg'])||_0x100135['toolName']===_0x180168(-0x144,-0xca))){const _0x51639c=performance[_0x2a9f2(0x1e9,0x14f)]();try{const _0x5d70df=_0x1ead63['yNPDt'](getSharedDb,_0x467888['db'][_0x2a9f2(-0x6f,0x24)]),{syncClaudeMd:_0x3fbb76}=await import(_0x2a9f2(0x185,0x113)+_0x2a9f2(0x46,0x8c));await _0x1ead63[_0x2a9f2(0x101,0xa8)](_0x3fbb76,_0x5d70df,{'claudeMdPath':_0x13780e,'projectPath':_0x100135[_0x2a9f2(0x123,0xca)+'h']});const _0xc6d275=performance[_0x180168(-0x70,0x30)](),_0x1bf1cc=Math['round'](_0xc6d275-_0x155b3f),_0x3e52a7=Math['round'](_0x1ead63[_0x2a9f2(0x9f,0x102)](_0xc6d275,_0x51639c)),_0x2b930d=Math[_0x180168(-0x97,-0x7d)](_0xadd228-_0x155b3f);process['stderr'][_0x180168(-0x22,-0x58)](_0x180168(-0x4d,-0xef)+_0x2a9f2(0x137,0x81)+_0x2a9f2(0x90,0x13a)+_0x2a9f2(0x1c8,0x14e)+_0x1bf1cc+(_0x180168(-0xa2,-0x7c)+'g:\x20')+_0x2b930d+(_0x180168(-0xa8,-0xd0)+_0x180168(-0x1bf,-0x10c))+_0x3e52a7+_0x2a9f2(0xe9,0xd9)),_0x4e0b77[_0x180168(-0xd,0x1e)](_0x2a9f2(0x1b7,0x11c)+'ory\x20file\x20s'+_0x2a9f2(0x146,0xf8),{'filePath':_0x13780e});try{if(_0x1ead63[_0x180168(-0xda,-0x31)](_0x2a9f2(0xe7,0xea),_0x1ead63['ePmMw'])){const _0x451c93=_0x1ead63[_0x2a9f2(0x1d3,0x11a)](readFileSync,_0x13780e,_0x1ead63[_0x180168(0xc5,0x2b)]);if(_0x1ead63[_0x2a9f2(0xc2,0x94)](isRuleContent,_0x451c93)){const _0xbb532c=_0x1ead63['EKoYd'](compileToClaudeRules,_0x451c93,_0x100135[_0x2a9f2(0x81,0xca)+'h']);_0xbb532c&&_0x4e0b77[_0x2a9f2(0xa3,0x13d)](_0x1ead63[_0x2a9f2(0xdb,0x29)],{'filePath':_0x13780e});}}else _0x5a41ba();}catch{}}catch(_0x3f826c){_0x4e0b77[_0x2a9f2(-0x2d,-0x4)](_0x180168(0x9b,-0x3)+'ory\x20sync\x20f'+'ailed',{'error':_0x3f826c instanceof Error?_0x3f826c[_0x180168(-0x6,-0xac)]:_0x1ead63[_0x2a9f2(0xa8,0x94)](String,_0x3f826c)});}return;}const _0x438a5e=performance['now'](),_0x3f40c4={'uuid':_0x100135[_0x2a9f2(0x148,0x91)],'type':_0x180168(0x71,0x42),'message':{'role':_0x1ead63[_0x2a9f2(0x3f,0xf0)],'content':_0x100135[_0x2a9f2(-0x24,0x17)]},'timestamp':new Date()[_0x180168(-0x156,-0xb5)+'g']()},_0x1a2884=_0x1ead63[_0x2a9f2(0xa0,0x116)](_0x100135[_0x2a9f2(0xe4,0xf6)],_0x1ead63[_0x180168(-0xcf,-0xb7)]),_0xa5d640=_0x13780e?isConfigFile(_0x13780e):![],_0x138688=_0x1ead63[_0x180168(-0x56,-0x5)](detectActualError,_0x100135['toolResult'],_0x100135[_0x2a9f2(0x1d7,0x14d)]);let _0x525150;if(_0x100135[_0x180168(-0x1b,-0x29)]===_0x1ead63['QKdSU']&&_0x100135[_0x2a9f2(0x1b3,0x14d)])try{const _0xd4c246=typeof _0x100135['toolInput']===_0x2a9f2(0xba,0xc9)?JSON[_0x180168(-0x6a,0x2)](_0x100135[_0x180168(0xb5,0x2e)]):_0x100135['toolInput'];_0x525150=_0xd4c246?.[_0x2a9f2(0x74,0x1e)]??_0xd4c246?.['cmd']??(_0x1ead63[_0x2a9f2(0x14d,0xd1)](typeof _0xd4c246,'string')?_0xd4c246:undefined);}catch{_0x525150=typeof _0x100135[_0x180168(-0x7,0x2e)]===_0x180168(0x14,-0x56)?_0x100135[_0x2a9f2(0x100,0x14d)]:undefined;}const _0x4c185b=scoreSignificance(_0x3f40c4,{'toolName':_0x100135[_0x2a9f2(0x150,0xf6)],'isNewFile':_0x1a2884,'isConfigChange':_0xa5d640,'hasError':_0x138688,'bashCommand':_0x525150},_0x467888['autoCaptur'+'e']['significan'+_0x2a9f2(0x1b3,0xfa)+'d']),_0x44fbfe=performance['now'](),_0x552f54=_0x467888['autoCaptur'+'e'][_0x180168(-0x159,-0xd2)+_0x2a9f2(0x90,0xfa)+'d']*0.5;_0x4e0b77['info'](_0x1ead63[_0x2a9f2(0x22,0x19)],{'toolName':_0x100135[_0x180168(-0xa0,-0x29)],'score':_0x4c185b[_0x2a9f2(0x36,0x7a)],'shouldCapture':_0x4c185b[_0x180168(-0x15e,-0xa5)]>=_0x552f54});if(_0x1ead63[_0x2a9f2(0x17c,0x149)](_0x4c185b[_0x180168(-0x145,-0xa5)],_0x552f54))return;const _0x16135d=_0x1ead63[_0x180168(-0x117,-0xc3)](determineCategory,_0x100135,_0x138688),_0x32e7f7=_0x1ead63[_0x180168(-0x6c,-0xe5)](buildContent,_0x100135),_0x184c65=filterSensitiveInfo(_0x32e7f7);let _0x19b063;if(_0x138688)_0x19b063=_0x1ead63[_0x180168(-0x40,-0x38)];else _0x1ead63[_0x2a9f2(0x8c,0x1f)](_0x4c185b[_0x180168(-0x8a,-0xa5)],_0x467888[_0x180168(-0x23,-0x6d)+'e']['significan'+'ceThreshol'+'d'])?_0x19b063=_0x180168(-0xc8,-0x21):_0x19b063=_0x1ead63[_0x2a9f2(0x15f,0x103)];const _0x2f969a={'content':_0x184c65[_0x2a9f2(0x4e,0x40)],'category':_0x16135d,'tier':_0x19b063,'tags':_0x1ead63[_0x2a9f2(-0x2b,0x8a)](buildTags,_0x100135),'projectPath':_0x100135[_0x2a9f2(0x3b,0xca)+'h'],'sessionId':_0x100135['sessionId']},_0x3514f6=getSharedDb(_0x467888['db']['path']),_0x2111df=performance[_0x180168(-0xd,0x30)](),_0x485b34=new DedupManager(),_0x31d200=_0x485b34[_0x180168(-0x8a,-0xc8)+_0x2a9f2(0x185,0x10a)](_0x3514f6['listMemori'+'es']({'projectPath':_0x100135[_0x180168(0x3,-0x55)+'h'],'limit':0x32}),_0x16135d,_0x100135['projectPat'+'h']),_0x511993=_0x485b34[_0x180168(-0x2f,-0x44)](_0x184c65[_0x180168(-0x136,-0xdf)],_0x31d200),_0x2d7831=performance['now']();_0x4e0b77['info'](_0x180168(-0x4,-0x60)+_0x2a9f2(-0x6,0x80),{'action':_0x511993[_0x180168(-0x74,-0xb0)],'similarity':_0x511993[_0x2a9f2(0xb7,0xb1)]});const _0x3e1b5a=performance[_0x180168(0x20,0x30)]();let _0x30364b;try{switch(_0x511993[_0x180168(-0xbd,-0xb0)]){case _0x1ead63[_0x2a9f2(0x1b6,0x16d)]:_0x4e0b77[_0x180168(0xcf,0x1e)](_0x1ead63['UwhtW'],{'similarity':_0x511993[_0x180168(0x1c,-0x6e)]});return;case _0x180168(-0xd5,-0x114):if(_0x511993[_0x2a9f2(0x99,0x105)+'ry']){if(_0x1ead63['kYqQR'](_0x1ead63['rpKXX'],_0x180168(-0xd1,-0x57))){const _0x5e11c4=_0x485b34[_0x180168(-0xe4,-0xaa)+'nt'](_0x511993[_0x180168(0x73,-0x1a)+'ry'][_0x180168(-0x7a,-0xe)],_0x184c65[_0x180168(-0xc1,-0xdf)]);_0x3514f6['updateMemo'+'ry'](_0x511993[_0x2a9f2(0x64,0x105)+'ry']['id'],{'content':_0x5e11c4,'tags':[...new Set([..._0x511993[_0x180168(0x86,-0x1a)+'ry'][_0x180168(-0x68,0x10)]||[],..._0x1ead63[_0x180168(-0xca,-0x10b)](buildTags,_0x100135)])]}),_0x4e0b77[_0x2a9f2(0xd5,0x13d)](_0x2a9f2(0xdf,0x9b)+_0x2a9f2(0x13b,0x145)+'ed)',{'memoryId':_0x511993['targetMemo'+'ry']['id']});}else _0x1ead63[_0x2a9f2(0x20d,0x168)](_0x4545ce);}return;case _0x1ead63[_0x2a9f2(0x110,0x14b)]:{if(_0x511993[_0x2a9f2(0x1b2,0x105)+'ry']){if(_0x1ead63[_0x180168(-0xed,-0x10f)]!==_0x2a9f2(0x128,0x13c))_0x3514f6[_0x2a9f2(0xd7,0x96)+'ry'](_0x511993[_0x180168(-0xd,-0x1a)+'ry']['id']),_0x4e0b77[_0x2a9f2(0x150,0x13d)]('Old\x20memory'+_0x180168(-0x42,-0x28),{'memoryId':_0x511993[_0x2a9f2(0x159,0x105)+'ry']['id']});else{const _0x22cfce=_0x1ead63[_0x2a9f2(0x7b,0xf1)](_0x1fa845,_0x58d235,_0xfce7da['projectPat'+'h']);_0x22cfce&&_0x36d71f[_0x2a9f2(0x1ef,0x13d)](_0x1ead63[_0x2a9f2(-0x70,0x29)],{'filePath':_0x3e1a59});}}_0x30364b=_0x3514f6['createMemo'+'ry'](_0x2f969a);_0x1ead63[_0x180168(-0x18f,-0x11e)](_0x19b063,_0x2a9f2(0x196,0xfe))&&_0x3514f6[_0x180168(0x3a,0x4c)+_0x180168(0x12,-0x30)](_0x30364b['id'],null,'pending');_0x4e0b77[_0x180168(-0x90,0x1e)]('Memory\x20cap'+_0x2a9f2(0xda,0xb4)+_0x2a9f2(0x23,0x85),{'category':_0x16135d,'memoryId':_0x30364b['id']});break;}case _0x180168(-0xdd,-0x51):default:_0x30364b=_0x3514f6[_0x180168(-0x127,-0xd5)+'ry'](_0x2f969a);_0x1ead63[_0x2a9f2(0xcf,0xee)](_0x19b063,_0x1ead63[_0x180168(-0x1e,-0xc2)])&&_0x3514f6[_0x2a9f2(0x1d6,0x16b)+'tus'](_0x30364b['id'],null,'pending');_0x4e0b77[_0x180168(0x6,0x1e)](_0x1ead63[_0x180168(0xf,-0x41)],{'category':_0x16135d,'memoryId':_0x30364b['id']});break;}}catch(_0x532dc2){if(_0x1ead63[_0x180168(-0xb6,-0x31)](_0x180168(0xb2,0x17),_0x180168(-0x3b,0x17)))_0x5539f3[_0x180168(-0x5b,0xd)](_0x20cd30);else{const _0x36f672=_0x532dc2 instanceof Error?_0x532dc2:new Error(String(_0x532dc2));_0x4e0b77[_0x180168(0xa2,0x38)](_0x2a9f2(0x26,-0x1)+_0x2a9f2(0x103,0x7b)+'ed',_0x36f672,{'category':_0x16135d});}}const _0x1a7f76=performance['now']();if(_0x30364b&&_0x467888[_0x2a9f2(0x8f,0x34)]?.[_0x2a9f2(-0x33,0x52)]&&_0x467888[_0x2a9f2(0xb3,0x34)][_0x180168(-0x131,-0xec)]===_0x2a9f2(0xb5,0xc)){if(_0x1ead63[_0x2a9f2(0xfa,0xee)](_0x1ead63['xQPBf'],_0x2a9f2(0x16a,0x11b)))try{const {createEmbeddingProvider:_0x4a8df4}=await import(_0x1ead63[_0x2a9f2(0x97,0xd4)]),_0x23a583=_0x1ead63[_0x180168(-0x22,-0x91)](_0x4a8df4,_0x467888['embedding'],_0x467888[_0x2a9f2(0xb0,0x78)]),_0x1853bd=await Promise[_0x2a9f2(0x21,0x5f)](_0x23a583['embed'](_0x30364b['content']));if(Array[_0x2a9f2(0x1b0,0x142)](_0x1853bd)){if(_0x1ead63[_0x180168(-0xfe,-0x4e)](_0x1ead63[_0x180168(-0x77,0x15)],_0x180168(-0x57,-0x14))){_0x5dc639['info'](_0x1ead63[_0x180168(-0x112,-0x69)]);return;}else _0x3514f6['saveEmbedd'+'ing'](_0x30364b['id'],_0x1853bd);}}catch(_0x2f474b){_0x4e0b77['warn']('Embedding\x20'+_0x2a9f2(-0x61,0x4),{'error':_0x2f474b instanceof Error?_0x2f474b[_0x2a9f2(0xd4,0x73)]:String(_0x2f474b)});}else return _0x2702b3[_0x2a9f2(0x7f,0xba)](0x0,0x1f4);}try{if(_0x1ead63[_0x180168(-0xa,-0x4e)]('qWxbH',_0x2a9f2(-0x7a,0x26))){const _0x5bac08=_0x3514f6[_0x2a9f2(0x1ee,0x15d)+_0x180168(-0x160,-0xe9)](_0x100135[_0x180168(-0xb7,-0x8e)]);if(_0x5bac08&&_0x5bac08['injectedKe'+_0x180168(-0x3a,0x46)]){const _0x2db6b1=(_0x100135[_0x180168(0x38,-0x29)]+'\x20'+JSON[_0x2a9f2(0x81,0xa1)](_0x100135[_0x180168(0x72,0x2e)])+'\x20'+_0x1ead63[_0x180168(-0x60,-0x82)](String,_0x100135[_0x2a9f2(0x2,0x17)]))[_0x180168(-0x59,-0xc9)+'e'](),_0x249edd=JSON[_0x2a9f2(0x1d9,0x121)](_0x5bac08[_0x180168(-0x3f,-0xdb)+'ywords']),_0x52659e=_0x249edd[_0x2a9f2(0x23,0xbb)](_0x2223e4=>_0x2db6b1[_0x180168(-0x47,-0xcf)](_0x2223e4));_0x1ead63[_0x180168(-0xf8,-0xff)](_0x52659e['length'],0x0)&&_0x3514f6[_0x2a9f2(0x14a,0xc3)+_0x180168(-0xef,-0x74)](_0x5bac08['id'],_0x52659e,_0x100135['toolName']);}}else{if(_0x1ead63[_0x2a9f2(0x23,0x1f)](_0x245cac[_0x2a9f2(0x1e2,0x162)],0xc8))return![];const _0x574a10=_0x26cf2b?.[_0x2a9f2(0xb7,0xf6)];if(_0x1ead63['Rbrqa'](_0x574a10,_0x180168(0x1b,-0x39)))return![];const _0x3ea31c=_0x14e611[_0x180168(-0x25,-0xc9)+'e'](),_0x367261=['error:',_0x180168(-0xe2,-0xe6),'ERROR:',_0x1ead63[_0x180168(0x85,0x20)],_0x1ead63[_0x180168(0x70,0x39)],_0x1ead63[_0x2a9f2(-0x3b,0x3d)],_0x1ead63[_0x2a9f2(0x120,0x90)],'FAILED',_0x1ead63[_0x2a9f2(0x5c,0xf3)],_0x1ead63['vVCll']],_0x384883=_0x367261['some'](_0x21ad13=>_0x26a876[_0x2a9f2(0x43,0x50)](_0x21ad13)||_0x3ea31c[_0x180168(-0x130,-0xcf)](_0x21ad13[_0x2a9f2(0xd2,0x56)+'e']()));if(!_0x384883)return![];const _0x546be8=_0x3b4af2?.[_0x180168(-0x5f,-0xab)]||_0x2cc49e?.['path']||'';if(_0x546be8[_0x2a9f2(-0x33,0x56)+'e']()[_0x180168(-0x124,-0xcf)](_0x1ead63['LIxbr'])&&!_0x367261['slice'](0x2)[_0x180168(0x65,-0x52)](_0x387241=>_0x3ea31c[_0x180168(-0x6f,-0xcf)](_0x387241[_0x2a9f2(0x99,0x56)+'e']())))return![];return!![];}}catch{}if(_0x30364b&&(_0x511993['action']===_0x1ead63[_0x2a9f2(0xfa,0x159)]||_0x511993[_0x2a9f2(-0x3e,0x6f)]===_0x1ead63[_0x180168(0xd5,0x2c)]))try{_0x3514f6[_0x2a9f2(0x124,0x126)+'actionEval']({'memoryId':_0x30364b['id'],'sessionId':_0x100135[_0x2a9f2(0x105,0x91)],'significanceScore':_0x4c185b[_0x2a9f2(0x46,0x7a)],'dedupAction':_0x511993[_0x180168(-0x10a,-0xb0)],'tier':_0x19b063});}catch{}if(_0x30364b&&_0x30364b['embedding']&&_0x467888['skillConve'+_0x180168(-0x5b,-0xe3)]?.[_0x180168(-0x87,-0xcd)])try{const {SkillEvaluator:_0x43e4ba}=await import(_0x1ead63['vzYuC']),_0x4c2cce=new _0x43e4ba(_0x3514f6,_0x467888),_0x12c66a=_0x4c2cce[_0x180168(0x8d,0x18)+_0x180168(-0xac,-0x12)](_0x30364b);_0x12c66a[_0x180168(-0x186,-0x10d)]&&_0x4e0b77[_0x180168(-0x2a,0x1e)](_0x1ead63['GfVkr'],{'memoryId':_0x30364b['id'],'skillId':_0x12c66a[_0x2a9f2(0x43,0xa6)]});}catch{}const _0x46981d=performance[_0x2a9f2(0x1a8,0x14f)]();let _0x19d765=0x0;if(_0x467888['autoSync']?.['enabled']&&_0x467888[_0x180168(-0xbe,-0x88)]?.[_0x180168(0x5a,0xe)]){try{const _0x436ca3=_0x3514f6[_0x2a9f2(0xf,0x27)+'SyncCount']();if(_0x436ca3>=AUTO_SYNC_THRESHOLD){const _0x4b8de0=createHookClient(_0x467888);if(_0x4b8de0){if(_0x1ead63['XXZFq'](_0x1ead63[_0x180168(-0x24,-0x8a)],_0x1ead63[_0x180168(-0x5f,-0x8a)])){const _0x3cf489=new SyncQueue(_0x3514f6,_0x4b8de0),_0x36dc16=await _0x3cf489[_0x2a9f2(0x94,0x123)]({'timeoutMs':AUTO_SYNC_TIMEOUT_MS});_0x36dc16[_0x180168(-0x132,-0x11a)]>0x0&&(_0x4e0b77['info'](_0x180168(-0x1b,-0x5e)+'pushed',{'pushed':_0x36dc16['pushed'],'pending':_0x436ca3}),console[_0x180168(0xe4,0x38)]('[a2a]\x20Auto'+_0x2a9f2(0x7c,0xa9)+_0x36dc16[_0x2a9f2(0xc,0x5)]+_0x2a9f2(0x110,0xb7)));}else _0xe9706a[_0x2a9f2(0xbe,0x13d)]('Memory\x20abs'+_0x180168(-0x179,-0xc7)+_0x180168(0x82,0x14),{'memoryId':_0x3c62b3['id'],'skillId':_0x3ed853[_0x180168(0x31,-0x79)]});}}}catch(_0xdca63b){_0x4e0b77[_0x180168(-0x92,-0x123)](_0x1ead63['IGweq'],{'error':_0xdca63b instanceof Error?_0xdca63b[_0x180168(-0x139,-0xac)]:_0x1ead63[_0x2a9f2(0xf,0x8a)](String,_0xdca63b)});}_0x19d765=Math[_0x180168(-0x3a,-0x7d)](_0x1ead63[_0x2a9f2(0xcd,0x46)](performance[_0x180168(0x25,0x30)](),_0x46981d));}const _0x2f0449=Math['round'](performance[_0x2a9f2(0xe8,0x14f)]()-_0x155b3f),_0x3d34a6=Math[_0x2a9f2(0x35,0xa2)](_0xadd228-_0x155b3f),_0x1c8aad=Math[_0x180168(-0xb8,-0x7d)](_0x1ead63[_0x2a9f2(0xf4,0xc4)](_0x44fbfe,_0x438a5e)),_0x572314=Math['round'](_0x2d7831-_0x2111df),_0x586d0b=Math[_0x2a9f2(0xa3,0xa2)](_0x1ead63[_0x180168(0x92,-0x1d)](_0x1a7f76,_0x3e1b5a)),_0x28af53=_0x19d765>0x0?_0x2a9f2(-0x1,0x63)+_0x19d765+'ms':'';process[_0x2a9f2(0x15e,0x114)][_0x180168(0x5b,-0x58)](_0x2a9f2(-0x81,0x30)+_0x2a9f2(0x1,0x81)+_0x180168(0x52,0x1b)+_0x180168(0x81,0x2f)+_0x2f0449+('ms\x20|\x20confi'+'g:\x20')+_0x3d34a6+(_0x2a9f2(0x98,0x8b)+_0x2a9f2(-0x3,0xa4))+_0x1c8aad+('ms,\x20dedup:'+'\x20')+_0x572314+_0x180168(0x75,-0x22)+_0x586d0b+'ms'+_0x28af53+')\x0a'),_0x4e0b77[_0x180168(0x5e,0x1e)](_0x2a9f2(0x6c,0x7f)+_0x2a9f2(0x3d,0x70),{'durationMs':_0x2f0449});}finally{_0x4e0b77['flush']();}}function extractFilePath(_0x30e83d){const _0x1f9ddf={'ghmNM':function(_0x371b5d,_0x8208d){return _0x371b5d===_0x8208d;},'SzSgN':_0x390d7d(0x3d7,0x373),'GJhpV':function(_0x5a4cad,_0xe8911e){return _0x5a4cad===_0xe8911e;},'dHFOX':_0x390d7d(0x472,0x3d5)};let _0x43b78c=_0x30e83d;function _0x390d7d(_0x2a7a2f,_0x52e363){return _0x3b27(_0x2a7a2f-0x153,_0x52e363);}if(_0x1f9ddf[_0x390d7d(0x439,0x4d8)](typeof _0x43b78c,_0x1f9ddf[_0x390d7d(0x454,0x3a9)]))try{_0x43b78c=JSON[_0x390d7d(0x42f,0x498)](_0x43b78c);}catch{return null;}if(_0x1f9ddf[_0x390d7d(0x3a0,0x35a)](typeof _0x43b78c,_0x1f9ddf['dHFOX'])&&_0x43b78c!==null){if(_0x1f9ddf[_0x390d7d(0x3a0,0x442)](typeof _0x43b78c[_0x390d7d(0x382,0x3a4)],_0x4fb2cb(-0x60,0xc)))return _0x43b78c[_0x4fb2cb(-0xb5,-0x78)];if(typeof _0x43b78c[_0x4fb2cb(-0x105,-0x16d)]===_0x4fb2cb(-0x60,-0x2e))return _0x43b78c[_0x390d7d(0x332,0x2c0)];}function _0x4fb2cb(_0x5150bf,_0xf6b07b){return _0x3b27(_0x5150bf- -0x2e4,_0xf6b07b);}return null;}function isSensitiveFile(_0x22fb0e,_0x58f03b){const _0x520a04={'nvlnC':function(_0x43d485,_0x4f7a7a){return _0x43d485===_0x4f7a7a;}},_0x53b759=_0x22fb0e[_0x11199a(0x25a,0x230)]('/')[_0x5a74fe(0x357,0x3a1)]()??'';function _0x11199a(_0x437542,_0x445a8a){return _0x3b27(_0x437542-0x3b,_0x445a8a);}function _0x5a74fe(_0x267dea,_0x3b7438){return _0x3b27(_0x267dea-0xc9,_0x3b7438);}return _0x58f03b['some'](_0x1150f4=>{function _0x11f776(_0x45f7ed,_0x1bccb1){return _0x5a74fe(_0x45f7ed- -0x1a3,_0x1bccb1);}if(_0x1150f4[_0x448dce(0x631,0x5b3)]('*'))return _0x53b759[_0x11f776(0xf6,0x152)](_0x1150f4[_0x448dce(0x5fa,0x546)](0x1));if(_0x1150f4[_0x11f776(0xf6,0x153)]('*'))return _0x53b759[_0x11f776(0x208,0x167)](_0x1150f4['slice'](0x0,-0x1));function _0x448dce(_0x2ce87c,_0x587f89){return _0x5a74fe(_0x587f89-0x208,_0x2ce87c);}return _0x520a04[_0x11f776(0x104,0x79)](_0x53b759,_0x1150f4);});}function isConfigFile(_0x4f1169){const _0xf766e7={'Fxnwn':_0xbcc33c(0x5cf,0x5ef),'Jolyk':_0x5af4c6(0x5b4,0x59d),'INUwO':_0xbcc33c(0x5b3,0x567)};function _0xbcc33c(_0x21d67d,_0xe40db1){return _0x3b27(_0x21d67d-0x2f2,_0xe40db1);}function _0x5af4c6(_0x20a67d,_0x3598e2){return _0x3b27(_0x20a67d-0x3a5,_0x3598e2);}const _0x510193=[_0x5af4c6(0x652,0x6b6),_0xf766e7[_0xbcc33c(0x4c3,0x54e)],_0xf766e7[_0xbcc33c(0x5a8,0x56e)],_0xf766e7['INUwO'],_0x5af4c6(0x638,0x5f4),'.ini',_0xbcc33c(0x5ad,0x624)];return _0x510193['some'](_0x28d92f=>_0x4f1169[_0x5af4c6(0x575,0x517)](_0x28d92f));}function _0x3b27(_0x518918,_0x3822de){_0x518918=_0x518918-0x1b7;const _0x5d2329=_0x5d23();let _0x3b27c5=_0x5d2329[_0x518918];if(_0x3b27['xavrcG']===undefined){var _0x55fb7e=function(_0x316b0a){const _0x16d1e8='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x10bbf7='',_0x592f19='';for(let _0x59a16a=0x0,_0x51a0b4,_0x408f34,_0x1a8310=0x0;_0x408f34=_0x316b0a['charAt'](_0x1a8310++);~_0x408f34&&(_0x51a0b4=_0x59a16a%0x4?_0x51a0b4*0x40+_0x408f34:_0x408f34,_0x59a16a++%0x4)?_0x10bbf7+=String['fromCharCode'](0xff&_0x51a0b4>>(-0x2*_0x59a16a&0x6)):0x0){_0x408f34=_0x16d1e8['indexOf'](_0x408f34);}for(let _0x580fee=0x0,_0x291bdc=_0x10bbf7['length'];_0x580fee<_0x291bdc;_0x580fee++){_0x592f19+='%'+('00'+_0x10bbf7['charCodeAt'](_0x580fee)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x592f19);};_0x3b27['uHZrWy']=_0x55fb7e,_0x3b27['MZCgPn']={},_0x3b27['xavrcG']=!![];}const _0x46e27d=_0x5d2329[0x0],_0x2d418c=_0x518918+_0x46e27d,_0x3420d5=_0x3b27['MZCgPn'][_0x2d418c];return!_0x3420d5?(_0x3b27c5=_0x3b27['uHZrWy'](_0x3b27c5),_0x3b27['MZCgPn'][_0x2d418c]=_0x3b27c5):_0x3b27c5=_0x3420d5,_0x3b27c5;}function _0x5d23(){const _0x18eae6=['vg9VBfvZzsbLCG','C2TPBgXjza','C01Mz1O','zMTcseK','lxn5BMnLzca','ANnVBG','y3rPB25iAxq','zMLSzsb3CML0Da','zgvJAwrLza','z2v0','rMLSztOG','D2vIzMv0y2G','C2LTAwXHCML0Eq','yxv0B0nHChr1CG','tgr1rhO','DhvYzwqGkgfMDa','DgHL','wLLhrfe','ig1LBw9YAwvZ','sxnWtg4','Dhjkq0i','C2XPy2u','zMLSDgvY','igv4zwn1DgvK','DgfIBgu','zKHOCwO','rgvKDxaGzgvJAq','revmrvrf','qxv0BY1ZEw5Jia','DgfIrfK','CMvJB3jKsw5Qzq','ENrlsNO','DxnLlMPZ','rMTgvK4','D3jPDgu','wfHVC0S','C3rYAw5N','ChjVAMvJDfbHDa','DurbzLG','Aw5KzxHpzG','C29Tzq','qure','Cgf0DgvYBG','vxHTv0S','uMjYCwe','z3vPzgvSAw5L','Cg9W','suHKzNG','DxrMltG','D0HeDNq','D2vUDcb3AxrO','lMvUDG','BxmPcG','rgrZC2G','zgvJAwrL','ug9ZDfrVB2XvCW','mtK1mZnOwKzwsha','zvvIBw8','DKjhvLO','AhrTBa','y2HVC2u','BwfW','B3b0zwqGzM9Y','DgLVBG','CM9YoG','uMvHza','zKjUwu0','twvTB3j5igfICW','zurTAhm','txrJBLG','wLv6t0u','wvneBha','yMvZDcbWCMfJDa','vuHnq0e','DhvZ','BMfStue','u05Ku0e','lMPZB24','Bg9Lz0W','zxLKq3C','rhDnyNm','Dg9VBe5HBwu','igrLBgv0zwq','Ew5Jzwq','zwHJDKy','y2vuAhjLC2HVBa','sM9SEwS','mZaYnJe5mvDRqwfpsa','BxmSigrIoIa','D29YA2LUzW','AxnLwKW','lMnMzW','y2XHDwrLl3j1Ba','ELPZwKK','A21Hque','D2vIC2vHCMnO','DgfYz2v0twvTBW','lNrVBwW','uLb0DwK','swDPr1i','C2vTyw50Awm','yxrLCW','D0H2q3q','yNboyvK','u2TPBgW','DgvZDa','Cg9ZDc10B29Slq','DhLWzq','y29UDgvUDa','y29T','lI4Vy2XHDwrLlW','C3rKzxjY','zwn0zwqGuNvSzq','qMz1wwu','CMvHza','w2eYyv0Gug9ZDa','EfrNB1e','vxHODvK','r1viCvO','q2XHDwrLig1LBq','igL0zw1Zxsa','BIb0CMLNz2vYCW','tK9pua','rfDlseu','CgfYC2u','lNLHBwW','zMX1C2G','C3rKB3v0','zMLSzsbJCMvHDa','CMvJB3jKrxH0CG','C3rHCNrZv2L0Aa','Cvj0ywm','revJu24','r2XVyG','z2HTtK0','ChvZAa','yxbPs2v5','zxjYB3jFC29SDq','DgfNCW','ygbG','yxDoCKy','rvjst1i6','ihnRAwXS','s1veuuK','zwrPDa','BMnvreu','ywjZB3jIsw50BW','y29UDMvUDgLVBG','z2vOweC','BxbSzxrLzcaODa','y2XmBem','ueDnq08','Aw5MBW','twvTB3j5ihnRAq','Eefkv2e','Bwf0y2G','ls0T','AxnbCNjHEq','mtuZodbQALrwt2S','zxHJBhvKzvbHDa','yxrLzcaOBwvYzW','u3Ptz04','EwfTBa','C3rHBMrHCMq','whPmAuW','yK5qzfy','rvHdwKG','BgvHCM5PBMC','Dg9VBeLUChv0','B3rHBdOG','BM93','yxrLza','C3jJ','CMvWBgfJzq','DhH0','t3futM4','zefhCfu','z0nNtLi','zxjYB3i','yKrTtue','EhLwteG','Ew1S','v2fSELm','ue5rwvy','z2v0tgf0zxn0sq','BMfTzq','vMrLuvq','CNvSzq','yxnZAxn0yw50','BgvUz3rO','zw4GC3vJy2vZCW','B2jQzwn0','ExDVCMrZ','DxnLlNrZ','ywrK','twn3s0O','vg9VBcbLDMfSDq','BLvkzK4','C2v0u3LUy1n0yq','CWOkpIbqB3n0va','DKnXt28','D2fYBG','Dg9tDhjPBMC','vgfZAW','twvTB3j5ignYzq','zxHPDa','A1LXuvi','zMfPBgvKoG','CNvSzxm','zMfPBgvK','ChvZAgvK','zxbPC29KAwm','yKfTD0W','y29Kzv9Wyxr0zq','ufzOzxG','C2v0','vvbeqvrf','Bg9JywW','DfnWrxa','BgLZDxO','A2v5CW','AvznC3a','CgLJA2vK','ywjZB3jIzwq','u3LUyZOG','uenfyLC','zw5KC1DPDgG','rNHUD24','Dg9VBfjLC3vSDa','Bg9Hza','DhL6yKq','AwnHDguP','ruTVwwq','nZbjtKfQDhq','DMfSDwu','y29TBwfUza','Du5xwMG','q2Tlre4','u2vtqLe','s0vVAeG','BNzSBKm','Cgf0Aa','z3jLCa','CvD4yKG','z2v0ugvUzgLUzW','t1rAAxC','uu9tv08','rxzYExu','zNvSBhK','r3jLCa','qurywe8','EKzRBwO','qMfZAa','w0eYqv0Gug9ZDa','rwDOAxK','Bg9Nz2LUzW','ChjVDMLKzxi','zw1IzwrKAw5N','AM9PBG','BMPLy3rPB24','w0vYCM9Yxsa','ndjkvwrkwe8','rxjYB3i6','tejVsum','DhjPBq','CNnPB24','Bez6tKe','C2TPBgW','mtu1mde4nLrfwxb3qG','zMLSDgvYzwq','wvbtA1a','DhjHy2vIywnR','zxHJzxb0Aw9U','Aw5Qzwn0zwrlzq','ugjurgu','zeTmy3y','zMvLzgjHy2S','AgfZ','zMLSzsbLEgnSDq','y3jLyxrLtwvTBW','BMCVAw5KzxGUAG','lI4VC2TPBgWVzq','C2LNBMLMAwnHBG','v3jPDgu','BxmSignSyxvKzq','Aw5JBhvKzxm','BMv3','zw5HyMXLza','z2XVyG','lNLTBa','rwrPDa','Dg9mB3DLCKnHCW','zMLUzenHBMrPza','B3jIzwqGAw50BW','DhvYzwq','64UKlGO','iYbbDxrVlwrLDa','t3bpshe','sK9Vuw0','BuXPrvm','CMvZB2X2zq','DxvKvKe','yxjNDG','y29Uy2f0','lcbZEw5JoIa','C3bSAxq','w0fYCMf5oIa','ntHkC1vXBhu','mtj5D3LNDui','rK1izgC','DgfZAW','Dg9ju09tDhjPBG','s1nIvhm','mtu5otjYseTSCwO','mJK2mwvHCfbwBq','B3DSzwrNzq','ywn0Aw9U','zxrLza','sg9VAYbZDgfYDa','mJe5ndK4mtfqvgnkrhm','BwvZC2fNzq','zMLSzv9WyxrO','BwvYz2vdB250zq','CMuGzgLZywjSzq','uxH2vLe','BgXT','zM9AB1C','Dg90ywXty29Yzq','yxrPB24GzMfPBa','v2vIu2vHCMnO','vhjHy2vIywnR','v2vIrMv0y2G','sg9VAYbJB21WBa','C2LVBG','vg9VBfvZzsbJBW','l3rLC3qV','zgvJAxnPB24','D2HUDvK','zxiGzgvSzxrLkq','lM1K','mtaXnLbTzu1Vqq','z2XVyMfS','nZC1nvHbuhDrAW','A2DOsw4','BxmSihnPz25PzG','C3LUyY5QCW','AMzSuvC','rvLtB1y','twvTB3j5ignHCa','rhznteW','C2vZC2LVBKLK','r0POCfy','rxHJzxb0Aw9U','Eu5qrhq','vvLmtLC','zgvSzxrLtwvTBW','C2vYDMvY','uNvSzsbJB21WAq','ChjVAMvJDf9RBG','BgvKihrVih4VlG','twvTB3j5ihvWza','y29UDgv4Da','Ag1wEfO','zxmV','rMfPBgvKoG','DhjPz2DLCNm','C3rYAw5NAwz5','CM91BMq','BxmGFcbJB25MAq','AwnHBMnLoIa'];_0x5d23=function(){return _0x18eae6;};return _0x5d23();}function detectActualError(_0x3b5398,_0x4a4749){const _0x3c2552={'trJCB':function(_0x5b2d35,_0x18bcff){return _0x5b2d35===_0x18bcff;},'tSpEp':_0x46ece1(0x543,0x4f6),'fHhqj':'error:','AABrr':'exception','gCgNR':_0x17174a(0x526,0x51c),'QxvVQ':_0x46ece1(0x45f,0x4e7),'UmZuK':'FAILED','tabDY':_0x17174a(0x510,0x537)};function _0x46ece1(_0x541b0f,_0x145b01){return _0x3b27(_0x541b0f-0x2a2,_0x145b01);}if(_0x3b5398[_0x46ece1(0x5bf,0x51e)]<0xc8)return![];function _0x17174a(_0x9e985b,_0xf19ce1){return _0x3b27(_0x9e985b-0x2d8,_0xf19ce1);}const _0x2df237=_0x4a4749?.[_0x17174a(0x589,0x5b5)];if(_0x3c2552[_0x17174a(0x54c,0x59f)](_0x2df237,_0x3c2552[_0x17174a(0x4a0,0x4b8)]))return![];const _0x340e62=_0x3b5398[_0x17174a(0x4e9,0x4b3)+'e'](),_0x137f0f=[_0x3c2552[_0x46ece1(0x51b,0x589)],_0x46ece1(0x496,0x47e),_0x17174a(0x5c5,0x678),_0x3c2552['AABrr'],_0x3c2552[_0x46ece1(0x5b3,0x56f)],_0x3c2552[_0x46ece1(0x4d4,0x491)],_0x46ece1(0x4fc,0x594),_0x3c2552['UmZuK'],'traceback',_0x3c2552[_0x17174a(0x555,0x58e)]],_0x27c704=_0x137f0f[_0x46ece1(0x52a,0x586)](_0x25df5e=>_0x3b5398[_0x17174a(0x4e3,0x4ff)](_0x25df5e)||_0x340e62[_0x46ece1(0x4ad,0x525)](_0x25df5e[_0x17174a(0x4e9,0x489)+'e']()));if(!_0x27c704)return![];const _0x3b162c=_0x4a4749?.[_0x17174a(0x507,0x4d7)]||_0x4a4749?.[_0x46ece1(0x481,0x429)]||'';if(_0x3b162c[_0x46ece1(0x4b3,0x514)+'e']()[_0x17174a(0x4e3,0x4c4)](_0x17174a(0x5ea,0x66f))&&!_0x137f0f[_0x46ece1(0x517,0x52d)](0x2)[_0x17174a(0x560,0x5b0)](_0x2b9b24=>_0x340e62[_0x46ece1(0x4ad,0x522)](_0x2b9b24[_0x17174a(0x4e9,0x4b8)+'e']())))return![];return!![];}function determineCategory(_0x57aea2,_0x4956f0){const _0x4b47b1={'vBGVZ':_0x43844d(0x294,0x310),'WZbVX':_0x263124(0x47c,0x49c),'uDAfX':'selected','qRtac':_0x43844d(0x1f7,0x285),'Ddssh':_0x263124(0x3e0,0x43c),'LduDz':'convention','KEohH':_0x263124(0x4cf,0x501),'Eghiy':_0x43844d(0x3c9,0x343),'jflQW':_0x43844d(0x3cf,0x346),'ehcvF':function(_0x4560ca,_0xaf163d){return _0x4560ca===_0xaf163d;},'bAmwL':_0x263124(0x485,0x3e5),'bLEIP':function(_0x273b13,_0x692a94){return _0x273b13===_0x692a94;},'IhWYo':function(_0x182298,_0x561d14){return _0x182298===_0x561d14;},'iseZL':_0x43844d(0x24f,0x2c2),'MaTYI':function(_0x4f8ed8,_0x94bb5e){return _0x4f8ed8(_0x94bb5e);},'RPtui':_0x263124(0x411,0x43b),'acNlS':_0x263124(0x484,0x3fa),'YSDlp':function(_0x1f1a4b,_0x1b3685){return _0x1f1a4b<_0x1b3685;}};function _0x43844d(_0x45d8ec,_0x51b768){return _0x3b27(_0x51b768-0xb9,_0x45d8ec);}if(_0x4956f0)return _0x263124(0x515,0x4e7)+'tion';const _0x52090b=_0x57aea2[_0x43844d(0x1d4,0x28b)]['toLowerCas'+'e']();function _0x263124(_0xc5ac5b,_0x2091da){return _0x3b27(_0x2091da-0x1fe,_0xc5ac5b);}if(_0x57aea2['toolName']==='Bash'){const _0x11940a=/^\[master |^\[main |^{"stdout":|^=== \d+\.|^\s*\d+ files? changed/m[_0x43844d(0x2d7,0x382)](_0x57aea2[_0x263124(0x35a,0x3d0)]);if(_0x11940a)return _0x4b47b1[_0x43844d(0x3f4,0x353)];const _0x3cb207=[_0x263124(0x3f4,0x49a),_0x43844d(0x34b,0x321),_0x4b47b1['WZbVX'],_0x4b47b1[_0x263124(0x43c,0x484)],_0x4b47b1[_0x43844d(0x37b,0x39c)],_0x263124(0x4e1,0x490)];if(_0x3cb207[_0x263124(0x465,0x486)](_0x886184=>_0x52090b['includes'](_0x886184)))return _0x4b47b1[_0x43844d(0x2ab,0x34e)];const _0x5ca902=[_0x4b47b1[_0x43844d(0x32f,0x327)],_0x4b47b1[_0x43844d(0x211,0x296)],_0x4b47b1[_0x263124(0x46e,0x3ea)],_0x43844d(0x450,0x3d4),_0x4b47b1[_0x43844d(0x376,0x301)],_0x263124(0x4ef,0x4a6)+'ice'];if(_0x5ca902[_0x43844d(0x2d5,0x341)](_0x27da91=>_0x52090b['includes'](_0x27da91)))return _0x43844d(0x365,0x3ac);}if(_0x4b47b1[_0x43844d(0x2bf,0x36d)](_0x57aea2[_0x263124(0x448,0x4af)],'Read')||_0x57aea2[_0x43844d(0x378,0x36a)]===_0x4b47b1[_0x263124(0x389,0x3c0)]||_0x4b47b1['bLEIP'](_0x57aea2[_0x43844d(0x32e,0x36a)],_0x263124(0x52f,0x4e3)))return _0x4b47b1[_0x43844d(0x381,0x353)];if(_0x4b47b1['IhWYo'](_0x57aea2[_0x43844d(0x41b,0x36a)],_0x4b47b1[_0x43844d(0x344,0x373)])||_0x57aea2[_0x263124(0x509,0x4af)]===_0x263124(0x3b2,0x40e)){const _0x1052ba=_0x4b47b1['MaTYI'](extractFilePath,_0x57aea2[_0x43844d(0x41e,0x3c1)]),_0x481bcb=_0x57aea2[_0x263124(0x445,0x3d0)];if(_0x1052ba&&(_0x1052ba[_0x263124(0x461,0x409)](_0x4b47b1[_0x43844d(0x340,0x37b)])||_0x1052ba['includes']('/tmp/'))){if(_0x4b47b1[_0x263124(0x4fd,0x4b2)](_0x43844d(0x25f,0x2d2),_0x4b47b1['acNlS']))_0x2bed8e=_0x5d2017[_0x263124(0x51d,0x4da)](_0x49b19c);else return _0x263124(0x474,0x455);}if(_0x4b47b1[_0x43844d(0x3fd,0x360)](_0x481bcb['length'],0x32)||_0x481bcb[_0x43844d(0x27a,0x2ca)+'e']()[_0x263124(0x3ba,0x409)](_0x43844d(0x2cc,0x320)+_0x263124(0x506,0x51c)+_0x263124(0x375,0x3e4))||_0x481bcb[_0x43844d(0x249,0x2ca)+'e']()[_0x263124(0x483,0x409)](_0x263124(0x479,0x4de)+'ed')||_0x481bcb[_0x43844d(0x21e,0x2ca)+'e']()[_0x263124(0x3d0,0x409)]('created\x20su'+'ccessfully'))return'context';return _0x263124(0x42c,0x3c1)+'rn';}return _0x4b47b1[_0x43844d(0x319,0x353)];}function buildContent(_0x253b02){const _0x40f7fd={'PNQYV':function(_0x1705b9,_0x13cca4){return _0x1705b9(_0x13cca4);},'Evryu':function(_0x10c58f,_0x1d2746){return _0x10c58f(_0x1d2746);}},_0x59ec78=extractFilePath(_0x253b02['toolInput']);function _0x59c371(_0x1aca7d,_0x48b08c){return _0x3b27(_0x48b08c- -0x3a5,_0x1aca7d);}function _0x53b5b0(_0x24a5a9,_0x16b59f){return _0x3b27(_0x24a5a9-0x2ff,_0x16b59f);}const _0x5a410a=[];if(_0x59ec78)_0x5a410a[_0x59c371(-0x10,-0xbe)](_0x59c371(-0x14b,-0x13b)+_0x59ec78);let _0x2039b2=_0x253b02[_0x59c371(-0x146,-0x1d3)]['slice'](0x0,0x5dc)[_0x59c371(-0x1f4,-0x1af)]();return _0x253b02['toolName']===_0x59c371(-0x206,-0x1bb)&&_0x2039b2[_0x59c371(-0xc4,-0xc3)]('{')&&(_0x2039b2=_0x40f7fd[_0x59c371(-0x1d,-0x8e)](extractBashContent,_0x2039b2)),_0x2039b2[_0x53b5b0(0x61c,0x59f)]>0x1f4&&(_0x2039b2[_0x53b5b0(0x5e1,0x581)]('{')||_0x2039b2['startsWith']('['))&&(_0x2039b2=summarizeJsonResult(_0x2039b2)),_0x2039b2=_0x2039b2[_0x53b5b0(0x574,0x584)](0x0,0x3e8)['trim'](),_0x2039b2&&!_0x40f7fd[_0x59c371(-0x255,-0x1c0)](isNoiseResult,_0x2039b2)&&_0x5a410a[_0x59c371(-0x4e,-0xbe)](_0x2039b2),_0x5a410a[_0x53b5b0(0x61c,0x6b5)]===0x0&&_0x5a410a['push'](_0x253b02[_0x59c371(-0x194,-0xf4)]+_0x59c371(-0xee,-0x12e)),_0x5a410a[_0x59c371(-0x123,-0x1b5)]('\x0a');}function extractBashContent(_0x7d796e){function _0x705166(_0x1f4535,_0x28abc8){return _0x3b27(_0x28abc8-0x5c,_0x1f4535);}function _0x1a231d(_0x476555,_0x458aa6){return _0x3b27(_0x458aa6- -0x227,_0x476555);}const _0x43fbb5={'cAjcW':function(_0x57cfaf,_0x563d5e,_0x309cca){return _0x57cfaf(_0x563d5e,_0x309cca);},'gehXG':_0x1a231d(0x53,0x55)+_0x705166(0x23d,0x21b),'DAjJR':_0x705166(0x35a,0x323),'whnuY':_0x1a231d(0x13d,0xc5)};try{const _0x45cb77=JSON['parse'](_0x7d796e),_0x43248a=(_0x45cb77[_0x705166(0x37a,0x33b)]||'')[_0x705166(0x230,0x252)](),_0x4694a9=(_0x45cb77['stderr']||'')['trim']();if(_0x4694a9&&_0x4694a9['length']>0xa)return _0x705166(0x2e5,0x24e)+_0x4694a9['slice'](0x0,0x1f4)+(_0x43248a?'\x0a[Output]\x20'+_0x43248a[_0x1a231d(0x1d,0x4e)](0x0,0x12c):'');if(_0x43248a){if('ZUzOE'!==_0x705166(0x2b8,0x302)){const _0x3d6522=DokNkU['cAjcW'](_0x5ed72d,_0x4e1e6c,_0x1a231d(0x114,0x69)),_0x45bada=_0x237aba['slice'](0x0,0x32);if(_0x45bada&&_0x3d6522['includes'](_0x45bada))return![];}else return _0x43248a[_0x705166(0x2fa,0x2d1)](0x0,0x3e8);}return _0x7d796e[_0x1a231d(-0x51,0x4e)](0x0,0x1f4);}catch{if(_0x43fbb5['DAjJR']!==_0x43fbb5[_0x1a231d(0xab,0x18)])return _0x7d796e[_0x705166(0x2fd,0x2d1)](0x0,0x3e8);else _0x347db9[_0x705166(0x2b4,0x213)](DokNkU[_0x705166(0x34d,0x350)],{'error':_0x2c0edc instanceof _0x249bd2?_0x18ad25['message']:_0x225968(_0x3cd1a3)});}}function summarizeJsonResult(_0x18ed87){function _0x2d2159(_0x432d21,_0x329949){return _0x3b27(_0x329949-0xc2,_0x432d21);}function _0x252720(_0x19ae53,_0x59dd25){return _0x3b27(_0x19ae53-0x13a,_0x59dd25);}try{const _0x29b9f0=JSON[_0x252720(0x416,0x426)](_0x18ed87);if(Array['isArray'](_0x29b9f0))return _0x2d2159(0x316,0x2e2)+_0x29b9f0[_0x2d2159(0x466,0x3df)]+_0x252720(0x412,0x3e4)+JSON[_0x252720(0x396,0x38d)](_0x29b9f0[0x0])['slice'](0x0,0xc8)+'...';const _0x199eb3=Object[_0x2d2159(0x289,0x28c)](_0x29b9f0)[_0x2d2159(0x3b3,0x337)](0x0,0xa),_0x2b0f85=_0x199eb3[_0x252720(0x3d7,0x363)](_0x19e3d9=>{const _0x56ebf7=_0x29b9f0[_0x19e3d9];function _0x36f352(_0x808b86,_0x28b077){return _0x252720(_0x28b077- -0x2bb,_0x808b86);}function _0x23039e(_0xfd3ed6,_0x18ee8a){return _0x252720(_0xfd3ed6- -0x205,_0x18ee8a);}const _0x531f6a=typeof _0x56ebf7===_0x23039e(0x1b9,0x1f1)?_0x56ebf7['slice'](0x0,0x50):JSON[_0x23039e(0x191,0x177)](_0x56ebf7)['slice'](0x0,0x50);return _0x19e3d9+':\x20'+_0x531f6a;})['join'](',\x20');return _0x2b0f85[_0x2d2159(0x3e7,0x337)](0x0,0x320);}catch{return _0x18ed87['slice'](0x0,0x1f4);}}function isNoiseResult(_0x5a6952){const _0x5ad03b=[/^File (?:created|updated|written|modified|deleted)(?: successfully)?\.?$/i,/^(?:File )?(?:written|created|saved) successfully\.?$/i,/^(?:No|0) (?:files?|changes?) /i,/^\d+ files? (?:found|matched|updated|deleted)\.?$/i,/^(?:Success|Done|OK|Created|Updated|Deleted)\.?$/i];function _0x5767c2(_0x48dacb,_0x4f0a00){return _0x3b27(_0x4f0a00-0x2f4,_0x48dacb);}return _0x5ad03b['some'](_0x4b639f=>_0x4b639f['test'](_0x5a6952[_0x5767c2(0x583,0x4ea)]()));}const TAG_BLOCKLIST=new Set(['id',_0x5fa517(0xc3,0xfd),'app',_0x328e29(0x11c,0xa2),_0x328e29(0x78,0xf5),_0x328e29(0x1bf,0x270),_0x5fa517(0x6e,0x127),_0x328e29(0x123,0x70),'to','in','of','a','is','for','now',_0x328e29(0x1d5,0x18b),_0x328e29(0x1cc,0x248),_0x5fa517(-0x32,-0xbe),'map',_0x328e29(0xa9,0x5f),_0x5fa517(0xc1,0x74),'data','list',_0x328e29(0xbf,0xf4),'test',_0x328e29(0xf1,0x64),_0x5fa517(0xdf,0x79)+_0x5fa517(0x95,-0x19),'code_patte'+'rn',_0x5fa517(0x4d,0xaf),_0x328e29(0x1a6,0x19c),_0x328e29(0xac,0x1a),_0x328e29(0x1ba,0x19a),_0x328e29(0x107,0xfc)+_0x5fa517(0x1f,-0x3),_0x5fa517(-0x1,0x74),_0x5fa517(0x6,-0x2f),'Bash','Read',_0x328e29(0x198,0x207),_0x328e29(0x9a,-0xe),_0x5fa517(-0x51,0x23),_0x328e29(0xec,0x193),_0x328e29(0xea,0x116),_0x328e29(0x135,0x1ea),_0x328e29(0x1a3,0x208),'bash',_0x5fa517(0xc8,0x122),_0x328e29(0xc1,0x12f),_0x328e29(0x93,0x53),_0x5fa517(0x1a,0xc4),_0x5fa517(0x61,-0x4e),_0x328e29(0x172,0x14f)]);function _0x5fa517(_0x2ba613,_0x2aeda4){return _0x3b27(_0x2ba613- -0x20a,_0x2aeda4);}function buildTags(_0x3853fb){function _0x3ee62b(_0xccb7e2,_0x125584){return _0x328e29(_0x125584-0x464,_0xccb7e2);}const _0x19e445={'KxBUF':function(_0xd8851a,_0xd9ddc3){return _0xd8851a(_0xd9ddc3);},'xTgoQ':function(_0x42b1d0,_0x4257cc){return _0x42b1d0!==_0x4257cc;},'FkFVN':_0x36c44f(0x48,0x97),'PbTDe':_0x3ee62b(0x60d,0x62c),'SeSBQ':_0x36c44f(0x1d2,0x1d5),'WalzS':'xml','foZoW':_0x36c44f(0x206,0x16e),'IspLn':'css'},_0x6c2272=[],_0x568f57=_0x19e445['KxBUF'](extractFilePath,_0x3853fb[_0x3ee62b(0x59c,0x61f)]);if(_0x568f57){if(_0x19e445[_0x36c44f(0x259,0x1a7)](_0x36c44f(0x68,0x97),_0x19e445[_0x3ee62b(0x5a5,0x598)]))return _0x3523de[_0x3ee62b(0x5f0,0x58c)](0x0,0x3e8);else{const _0x38d93e=_0x568f57['split']('/')[_0x3ee62b(0x59e,0x58d)](Boolean),_0x2875ac=_0x38d93e[_0x3ee62b(0x556,0x58c)](-0x3)[_0x3ee62b(0x594,0x58d)](_0x2d41cc=>_0x2d41cc[_0x36c44f(0x2a3,0x1f0)]>0x2&&!TAG_BLOCKLIST['has'](_0x2d41cc[_0x3ee62b(0x5db,0x528)+'e']()));for(const _0x1516ce of _0x2875ac[_0x3ee62b(0x5b3,0x58c)](0x0,0x2)){const _0x45165d=_0x1516ce['replace'](/\.[^.]+$/,'');_0x45165d[_0x36c44f(0x14d,0x1f0)]>0x2&&!TAG_BLOCKLIST['has'](_0x45165d['toLowerCas'+'e']())&&_0x6c2272['push'](_0x45165d);}const _0x323c46=_0x568f57[_0x3ee62b(0x57d,0x536)]('.')[_0x36c44f(0x1ce,0x161)]();if(_0x323c46){const _0x8ac0e0=_0x323c46[_0x36c44f(0x178,0xe4)+'e']();if(!/^\d+$/[_0x3ee62b(0x66c,0x5e0)](_0x323c46)&&_0x323c46[_0x36c44f(0x296,0x1f0)]>0x2&&!TAG_BLOCKLIST[_0x36c44f(0x70,0xd6)](_0x8ac0e0)){const _0x4e7ddc=['md',_0x3ee62b(0x61d,0x625),_0x36c44f(0x13a,0x138),_0x19e445[_0x36c44f(0x90,0xd3)],_0x19e445[_0x3ee62b(0x553,0x4f3)],_0x19e445[_0x36c44f(0x20a,0x1e9)],_0x19e445[_0x36c44f(0x6a,0x107)],_0x19e445[_0x3ee62b(0x58f,0x58a)]];!_0x4e7ddc[_0x36c44f(0x195,0xde)](_0x8ac0e0)&&_0x6c2272['push'](_0x323c46);}}}}function _0x36c44f(_0x1cdcc6,_0x5c8341){return _0x328e29(_0x5c8341-0x20,_0x1cdcc6);}return _0x6c2272;}export async function main(){function _0x546192(_0x1f74a7,_0x61d391){return _0x328e29(_0x61d391- -0x12,_0x1f74a7);}const _0x277a39={'uudVA':_0x546192(0x1d2,0x131),'eDmhs':function(_0x33ba8b,_0xe106c5){return _0x33ba8b(_0xe106c5);},'KSbTs':function(_0xdf7abe,_0x2e1039){return _0xdf7abe instanceof _0x2e1039;},'DwMbs':function(_0x274272){return _0x274272();}},_0x5ea282=[];for await(const _0x4e663e of process['stdin']){_0x5ea282[_0x546192(0x208,0x188)](_0x4e663e);}function _0x1ab29b(_0x2c41d3,_0x1f6553){return _0x328e29(_0x1f6553-0xf5,_0x2c41d3);}const _0x2ec646=Buffer[_0x546192(0x82,0xbe)](_0x5ea282)[_0x1ab29b(0x1e3,0x160)](_0x277a39[_0x546192(0x13b,0xbc)])[_0x546192(0xc,0x97)]();!_0x2ec646&&process[_0x1ab29b(0xe8,0x163)](0x0);try{const _0x1cd3be=JSON[_0x1ab29b(0x2d1,0x284)](_0x2ec646),_0x1c52b9=_0x277a39[_0x1ab29b(0x1f0,0x24c)](normalizeHookInput,_0x1cd3be);await _0x277a39['eDmhs'](handlePostToolUse,_0x1c52b9);}catch(_0x4903c0){console['error'](_0x546192(0x196,0x174)+_0x546192(0xdd,0x101)+_0x1ab29b(0x258,0x248),_0x277a39[_0x1ab29b(0x1ed,0x1ce)](_0x4903c0,Error)?_0x4903c0[_0x546192(0x83,0xcf)]:_0x4903c0),process[_0x546192(0x1f,0x5c)](0x0);}finally{_0x277a39[_0x1ab29b(0x259,0x258)](closeSharedDb);}}const isMainModule=process['argv'][0x1]?.[_0x5fa517(-0x3a,-0x35)](_0x5fa517(0xc0,0xf5)+_0x328e29(0x133,0x12c))||process[_0x5fa517(0x12,-0x75)][0x1]?.[_0x328e29(0x83,0xf)](_0x328e29(0x17d,0x22c)+_0x328e29(0x1d4,0x19c));isMainModule&&main();