a2a-memory 0.9.1 → 0.10.1

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 (142) hide show
  1. package/README.md +134 -52
  2. package/dist/cli/commands/add.d.ts.map +1 -1
  3. package/dist/cli/commands/add.js +1 -0
  4. package/dist/cli/commands/add.js.map +1 -1
  5. package/dist/cli/commands/claude-sync.d.ts.map +1 -1
  6. package/dist/cli/commands/claude-sync.js +1 -0
  7. package/dist/cli/commands/claude-sync.js.map +1 -1
  8. package/dist/cli/commands/cleanup.d.ts.map +1 -1
  9. package/dist/cli/commands/cleanup.js +1 -0
  10. package/dist/cli/commands/cleanup.js.map +1 -1
  11. package/dist/cli/commands/config.d.ts.map +1 -1
  12. package/dist/cli/commands/config.js +2 -0
  13. package/dist/cli/commands/config.js.map +1 -1
  14. package/dist/cli/commands/edit.d.ts.map +1 -1
  15. package/dist/cli/commands/edit.js +3 -0
  16. package/dist/cli/commands/edit.js.map +1 -1
  17. package/dist/cli/commands/embed.d.ts.map +1 -1
  18. package/dist/cli/commands/embed.js +1 -0
  19. package/dist/cli/commands/embed.js.map +1 -1
  20. package/dist/cli/commands/proficiency.d.ts.map +1 -1
  21. package/dist/cli/commands/proficiency.js +4 -0
  22. package/dist/cli/commands/proficiency.js.map +1 -1
  23. package/dist/cli/commands/rm.d.ts.map +1 -1
  24. package/dist/cli/commands/rm.js +4 -0
  25. package/dist/cli/commands/rm.js.map +1 -1
  26. package/dist/cli/commands/search.d.ts.map +1 -1
  27. package/dist/cli/commands/search.js +52 -8
  28. package/dist/cli/commands/search.js.map +1 -1
  29. package/dist/cli/commands/setup.js +24 -0
  30. package/dist/cli/commands/setup.js.map +1 -1
  31. package/dist/cli/commands/skill.d.ts.map +1 -1
  32. package/dist/cli/commands/skill.js +16 -1
  33. package/dist/cli/commands/skill.js.map +1 -1
  34. package/dist/cli/commands/sync.d.ts.map +1 -1
  35. package/dist/cli/commands/sync.js +3 -0
  36. package/dist/cli/commands/sync.js.map +1 -1
  37. package/dist/config/manager.d.ts +67 -13
  38. package/dist/config/manager.d.ts.map +1 -1
  39. package/dist/config/manager.js +20 -5
  40. package/dist/config/manager.js.map +1 -1
  41. package/dist/db/database.d.ts +5 -0
  42. package/dist/db/database.d.ts.map +1 -1
  43. package/dist/db/database.js +47 -24
  44. package/dist/db/database.js.map +1 -1
  45. package/dist/embedding/e5-provider.d.ts +41 -0
  46. package/dist/embedding/e5-provider.d.ts.map +1 -0
  47. package/dist/embedding/e5-provider.js +147 -0
  48. package/dist/embedding/e5-provider.js.map +1 -0
  49. package/dist/embedding/index.d.ts +1 -0
  50. package/dist/embedding/index.d.ts.map +1 -1
  51. package/dist/embedding/index.js +5 -0
  52. package/dist/embedding/index.js.map +1 -1
  53. package/dist/extraction/dedup-manager.d.ts +40 -0
  54. package/dist/extraction/dedup-manager.d.ts.map +1 -0
  55. package/dist/extraction/dedup-manager.js +148 -0
  56. package/dist/extraction/dedup-manager.js.map +1 -0
  57. package/dist/extraction/extractor.d.ts.map +1 -1
  58. package/dist/extraction/extractor.js +23 -6
  59. package/dist/extraction/extractor.js.map +1 -1
  60. package/dist/extraction/filter.d.ts.map +1 -1
  61. package/dist/extraction/filter.js +3 -0
  62. package/dist/extraction/filter.js.map +1 -1
  63. package/dist/extraction/scorer.js +23 -12
  64. package/dist/extraction/scorer.js.map +1 -1
  65. package/dist/hooks/client-factory.d.ts +14 -0
  66. package/dist/hooks/client-factory.d.ts.map +1 -0
  67. package/dist/hooks/client-factory.js +22 -0
  68. package/dist/hooks/client-factory.js.map +1 -0
  69. package/dist/hooks/post-tool-use.d.ts.map +1 -1
  70. package/dist/hooks/post-tool-use.js +101 -22
  71. package/dist/hooks/post-tool-use.js.map +1 -1
  72. package/dist/hooks/pre-compact.d.ts +15 -0
  73. package/dist/hooks/pre-compact.d.ts.map +1 -0
  74. package/dist/hooks/pre-compact.js +209 -0
  75. package/dist/hooks/pre-compact.js.map +1 -0
  76. package/dist/hooks/session-end.d.ts.map +1 -1
  77. package/dist/hooks/session-end.js +56 -46
  78. package/dist/hooks/session-end.js.map +1 -1
  79. package/dist/hooks/session-start.d.ts.map +1 -1
  80. package/dist/hooks/session-start.js +205 -138
  81. package/dist/hooks/session-start.js.map +1 -1
  82. package/dist/hooks/shared.d.ts +1 -0
  83. package/dist/hooks/shared.d.ts.map +1 -1
  84. package/dist/hooks/shared.js +35 -0
  85. package/dist/hooks/shared.js.map +1 -1
  86. package/dist/hooks/user-prompt-submit.d.ts +15 -0
  87. package/dist/hooks/user-prompt-submit.d.ts.map +1 -0
  88. package/dist/hooks/user-prompt-submit.js +240 -0
  89. package/dist/hooks/user-prompt-submit.js.map +1 -0
  90. package/dist/index.d.ts +11 -3
  91. package/dist/index.d.ts.map +1 -1
  92. package/dist/index.js +8 -2
  93. package/dist/index.js.map +1 -1
  94. package/dist/lifecycle/quality-scorer.d.ts +2 -2
  95. package/dist/lifecycle/quality-scorer.d.ts.map +1 -1
  96. package/dist/lifecycle/quality-scorer.js +13 -7
  97. package/dist/lifecycle/quality-scorer.js.map +1 -1
  98. package/dist/lifecycle/tiering.d.ts.map +1 -1
  99. package/dist/lifecycle/tiering.js +11 -1
  100. package/dist/lifecycle/tiering.js.map +1 -1
  101. package/dist/proficiency/detection.d.ts +2 -4
  102. package/dist/proficiency/detection.d.ts.map +1 -1
  103. package/dist/proficiency/detection.js +11 -15
  104. package/dist/proficiency/detection.js.map +1 -1
  105. package/dist/proficiency/tracker.d.ts +2 -2
  106. package/dist/proficiency/tracker.d.ts.map +1 -1
  107. package/dist/proficiency/tracker.js +10 -7
  108. package/dist/proficiency/tracker.js.map +1 -1
  109. package/dist/search/adaptive-router.d.ts +28 -0
  110. package/dist/search/adaptive-router.d.ts.map +1 -0
  111. package/dist/search/adaptive-router.js +93 -0
  112. package/dist/search/adaptive-router.js.map +1 -0
  113. package/dist/search/ranker.d.ts +4 -0
  114. package/dist/search/ranker.d.ts.map +1 -1
  115. package/dist/search/ranker.js +4 -0
  116. package/dist/search/ranker.js.map +1 -1
  117. package/dist/search/reranker.d.ts +48 -0
  118. package/dist/search/reranker.d.ts.map +1 -0
  119. package/dist/search/reranker.js +155 -0
  120. package/dist/search/reranker.js.map +1 -0
  121. package/dist/skill/evaluator.d.ts +7 -9
  122. package/dist/skill/evaluator.d.ts.map +1 -1
  123. package/dist/skill/evaluator.js +122 -33
  124. package/dist/skill/evaluator.js.map +1 -1
  125. package/dist/skill/types.d.ts +5 -0
  126. package/dist/skill/types.d.ts.map +1 -1
  127. package/dist/sync/client.d.ts +26 -1
  128. package/dist/sync/client.d.ts.map +1 -1
  129. package/dist/sync/client.js +81 -28
  130. package/dist/sync/client.js.map +1 -1
  131. package/dist/sync/queue.d.ts +1 -1
  132. package/dist/sync/queue.d.ts.map +1 -1
  133. package/dist/sync/queue.js +20 -28
  134. package/dist/sync/queue.js.map +1 -1
  135. package/dist/sync/synchronizer.js +1 -1
  136. package/dist/sync/synchronizer.js.map +1 -1
  137. package/dist/sync/team-synchronizer.js.map +1 -1
  138. package/dist/types/index.d.ts +19 -2
  139. package/dist/types/index.d.ts.map +1 -1
  140. package/dist/types/index.js +11 -3
  141. package/dist/types/index.js.map +1 -1
  142. package/package.json +1 -1
@@ -9,6 +9,7 @@ import { getSharedDb, closeSharedDb, normalizeHookInput } from './shared.js';
9
9
  import { ConfigManager } from '../config/manager.js';
10
10
  import { scoreSignificance } from '../extraction/scorer.js';
11
11
  import { filterSensitiveInfo } from '../extraction/filter.js';
12
+ import { DedupManager } from '../extraction/dedup-manager.js';
12
13
  import { createLogger } from '../utils/logger.js';
13
14
  export async function handlePostToolUse(context) {
14
15
  const config = new ConfigManager().load();
@@ -84,13 +85,53 @@ export async function handlePostToolUse(context) {
84
85
  sessionId: context.sessionId,
85
86
  };
86
87
  const db = getSharedDb(config.db.path);
88
+ // Mem0 패턴: 4-Way 중복 판단 (ADD/UPDATE/DELETE/NOOP)
89
+ const dedupManager = new DedupManager();
90
+ const existingMemories = dedupManager.findCandidates(db.listMemories({ projectPath: context.projectPath, limit: 50 }), category, context.projectPath);
91
+ const decision = dedupManager.decide(filtered.filtered, existingMemories);
92
+ logger.info('Dedup decision', { action: decision.action, similarity: decision.similarity });
87
93
  let created;
88
94
  try {
89
- created = db.createMemory(input);
90
- // sync 대기 상태 설정 (~1ms)
91
- // team 모드에서도 동일: pending → SessionEnd에서 팀 sync 수행
92
- db.setSyncStatus(created.id, null, 'pending');
93
- logger.info('Memory captured', { category, memoryId: created.id });
95
+ switch (decision.action) {
96
+ case 'NOOP':
97
+ // 완전 중복 무시
98
+ logger.info('Memory skipped (duplicate)', { similarity: decision.similarity });
99
+ return;
100
+ case 'UPDATE':
101
+ // 기존 메모리 업데이트
102
+ if (decision.targetMemory) {
103
+ const mergedContent = dedupManager.mergeContent(decision.targetMemory.content, filtered.filtered);
104
+ db.updateMemory(decision.targetMemory.id, {
105
+ content: mergedContent,
106
+ tags: [...new Set([...(decision.targetMemory.tags || []), ...buildTags(context)])],
107
+ });
108
+ logger.info('Memory updated (merged)', { memoryId: decision.targetMemory.id });
109
+ }
110
+ return;
111
+ case 'DELETE': {
112
+ // 기존 삭제 후 새로 생성
113
+ if (decision.targetMemory) {
114
+ db.deleteMemory(decision.targetMemory.id);
115
+ logger.info('Old memory deleted', { memoryId: decision.targetMemory.id });
116
+ }
117
+ created = db.createMemory(input);
118
+ if (tier !== 'working') {
119
+ db.setSyncStatus(created.id, null, 'pending');
120
+ }
121
+ logger.info('Memory captured (after delete)', { category, memoryId: created.id });
122
+ break;
123
+ }
124
+ case 'ADD':
125
+ default:
126
+ created = db.createMemory(input);
127
+ // sync 대기 상태 설정 (~1ms)
128
+ // working tier는 서버에서 in-memory만 저장하므로 sync 제외
129
+ if (tier !== 'working') {
130
+ db.setSyncStatus(created.id, null, 'pending');
131
+ }
132
+ logger.info('Memory captured', { category, memoryId: created.id });
133
+ break;
134
+ }
94
135
  }
95
136
  catch (dbErr) {
96
137
  // 메모리 생성 실패 시 에러 로깅 (hook은 실패해도 Claude Code 영향 없어야 함)
@@ -142,16 +183,23 @@ function isConfigFile(filePath) {
142
183
  return configExts.some((ext) => filePath.endsWith(ext));
143
184
  }
144
185
  function detectActualError(result, input) {
186
+ // 짧은 성공 메시지의 오탐 방지 (200자 미만)
187
+ if (result.length < 200)
188
+ return false;
189
+ // Read 도구의 파일 내용에 "error" 포함된 경우 제외 (코드 자체의 에러 문자열)
190
+ const toolName = input?.toolName;
191
+ if (toolName === 'Read')
192
+ return false;
145
193
  const lowerResult = result.toLowerCase();
146
- // 실제 에러 키워드 존재 확인
147
- const errorPatterns = ['error:', 'error ', 'exception', 'failed', 'traceback'];
148
- const hasErrorKeyword = errorPatterns.some((kw) => lowerResult.includes(kw));
194
+ // 구분자 포함 패턴만 사용 ('error '(공백) 패턴 제거 → 오탐 감소)
195
+ const errorPatterns = ['error:', 'Error:', 'ERROR:', 'exception', 'Exception', 'failed:', 'Failed:', 'FAILED', 'traceback', 'Traceback'];
196
+ const hasErrorKeyword = errorPatterns.some((kw) => result.includes(kw) || lowerResult.includes(kw.toLowerCase()));
149
197
  if (!hasErrorKeyword)
150
198
  return false;
151
199
  // 파일명에만 'error'가 있는 경우 제외
152
200
  const filePath = (input?.file_path || input?.path || '');
153
201
  if (filePath.toLowerCase().includes('error') &&
154
- !errorPatterns.slice(1).some((kw) => lowerResult.includes(kw))) {
202
+ !errorPatterns.slice(2).some((kw) => lowerResult.includes(kw.toLowerCase()))) {
155
203
  return false;
156
204
  }
157
205
  return true;
@@ -159,6 +207,22 @@ function detectActualError(result, input) {
159
207
  function determineCategory(context, hasError) {
160
208
  if (hasError)
161
209
  return 'error_solution';
210
+ const lowerResult = context.toolResult.toLowerCase();
211
+ // Bash 도구: decision/convention 감지 (context에 몰리지 않도록 분류 강화)
212
+ if (context.toolName === 'Bash') {
213
+ const decisionKeywords = ['chose', 'decided', 'opted for', 'selected', 'picked', 'went with'];
214
+ if (decisionKeywords.some((kw) => lowerResult.includes(kw))) {
215
+ return 'decision';
216
+ }
217
+ const conventionKeywords = ['convention', 'standard', 'pattern', 'rule', 'guideline', 'best practice'];
218
+ if (conventionKeywords.some((kw) => lowerResult.includes(kw))) {
219
+ return 'convention';
220
+ }
221
+ }
222
+ // Read/Grep/Glob: 프로젝트 탐색 컨텍스트로 분류
223
+ if (context.toolName === 'Read' || context.toolName === 'Grep' || context.toolName === 'Glob') {
224
+ return 'context';
225
+ }
162
226
  // Issue 1 Fix: Don't auto-assign code_pattern for Write/Edit
163
227
  if (context.toolName === 'Write' || context.toolName === 'Edit') {
164
228
  const filePath = extractFilePath(context.toolInput);
@@ -184,26 +248,41 @@ function buildContent(context) {
184
248
  const parts = [`Tool: ${context.toolName}`];
185
249
  if (filePath)
186
250
  parts.push(`File: ${filePath}`);
187
- parts.push(`Result: ${context.toolResult.slice(0, 500)}`);
251
+ parts.push(`Result: ${context.toolResult.slice(0, 1000)}`);
188
252
  return parts.join('\n');
189
253
  }
254
+ /** URL 파편·카테고리 중복·도구명 등 저가치 태그 blocklist */
255
+ const TAG_BLOCKLIST = new Set([
256
+ 'id', 'com', 'app', 'get', 'set', 'src', 'table', 'the', 'to', 'in', 'of', 'a', 'is', 'for',
257
+ 'now', 'add', 'name', 'value', 'map', 'trim', 'type', 'data', 'list', 'new', 'test',
258
+ 'decision', 'error_solution', 'code_pattern', 'context', 'convention', 'skill', 'learning', 'project_knowledge',
259
+ // 도구명 태그 제외 (무의미한 반복)
260
+ 'Write', 'Edit', 'Bash', 'Read', 'Glob', 'Grep', 'Task', 'WebFetch', 'WebSearch',
261
+ 'write', 'edit', 'bash', 'read', 'glob', 'grep', 'task', 'webfetch', 'websearch',
262
+ ]);
190
263
  function buildTags(context) {
191
- const tags = [context.toolName];
264
+ const tags = [];
192
265
  const filePath = extractFilePath(context.toolInput);
193
266
  if (filePath) {
267
+ // 의미 있는 파일경로 토큰 추출 (디렉토리명 + 확장자)
268
+ const parts = filePath.split('/').filter(Boolean);
269
+ // 마지막 2~3 경로 세그먼트에서 의미 추출
270
+ const meaningful = parts.slice(-3).filter((p) => p.length > 2 && !TAG_BLOCKLIST.has(p.toLowerCase()));
271
+ for (const token of meaningful.slice(0, 2)) {
272
+ const clean = token.replace(/\.[^.]+$/, ''); // 확장자 제거
273
+ if (clean.length > 2 && !TAG_BLOCKLIST.has(clean.toLowerCase())) {
274
+ tags.push(clean);
275
+ }
276
+ }
277
+ // 확장자 태그 (고가치만)
194
278
  const ext = filePath.split('.').pop();
195
279
  if (ext) {
196
- // Issue 4 Fix: Filter low-value tags
197
- // Filter out pure numeric tags
198
- if (/^\d+$/.test(ext))
199
- return tags;
200
- // Filter out single-character tags
201
- if (ext.length === 1)
202
- return tags;
203
- // Filter out low-value extensions
204
- const lowValueExts = ['md', 'txt', 'json', 'yml', 'yaml', 'xml', 'html', 'css'];
205
- if (!lowValueExts.includes(ext.toLowerCase())) {
206
- tags.push(ext);
280
+ const lower = ext.toLowerCase();
281
+ if (!/^\d+$/.test(ext) && ext.length > 2 && !TAG_BLOCKLIST.has(lower)) {
282
+ const lowValueExts = ['md', 'txt', 'json', 'yml', 'yaml', 'xml', 'html', 'css'];
283
+ if (!lowValueExts.includes(lower)) {
284
+ tags.push(ext);
285
+ }
207
286
  }
208
287
  }
209
288
  }
@@ -1 +1 @@
1
- {"version":3,"file":"post-tool-use.js","sourceRoot":"","sources":["../../src/hooks/post-tool-use.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"post-tool-use.js","sourceRoot":"","sources":["../../src/hooks/post-tool-use.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * PreCompact Hook
3
+ *
4
+ * Claude Code 컨텍스트 윈도우 압축 직전 실행됩니다.
5
+ * 장기 세션에서 초기 중요 정보가 압축으로 유실되는 것을 방지합니다.
6
+ *
7
+ * 동작:
8
+ * 1. 현재 transcript에서 핵심 결정/진행 상태/미완료 작업 추출
9
+ * 2. "session_checkpoint" 카테고리로 DB 저장
10
+ * 3. UserPromptSubmit에서 checkpoint 메모리 우선 주입
11
+ */
12
+ import type { PreCompactContext } from '../types/index.js';
13
+ export declare function handlePreCompact(context: PreCompactContext): Promise<void>;
14
+ export declare function main(): Promise<void>;
15
+ //# sourceMappingURL=pre-compact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pre-compact.d.ts","sourceRoot":"","sources":["../../src/hooks/pre-compact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,KAAK,EAAE,iBAAiB,EAAqB,MAAM,mBAAmB,CAAC;AAgI9E,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyDhF;AAQD,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CA6B1C"}
@@ -0,0 +1,209 @@
1
+ /**
2
+ * PreCompact Hook
3
+ *
4
+ * Claude Code 컨텍스트 윈도우 압축 직전 실행됩니다.
5
+ * 장기 세션에서 초기 중요 정보가 압축으로 유실되는 것을 방지합니다.
6
+ *
7
+ * 동작:
8
+ * 1. 현재 transcript에서 핵심 결정/진행 상태/미완료 작업 추출
9
+ * 2. "session_checkpoint" 카테고리로 DB 저장
10
+ * 3. UserPromptSubmit에서 checkpoint 메모리 우선 주입
11
+ */
12
+ import { getSharedDb, closeSharedDb, normalizeHookInput } from './shared.js';
13
+ import { ConfigManager } from '../config/manager.js';
14
+ import { filterSensitiveInfo } from '../extraction/filter.js';
15
+ import { createLogger } from '../utils/logger.js';
16
+ // ============================================================
17
+ // Checkpoint Extraction
18
+ // ============================================================
19
+ /** 핵심 정보 패턴 */
20
+ const DECISION_PATTERNS = [
21
+ /(?:결정|decided|chose|선택|opted for|went with|채택)[::]?\s*(.+)/gi,
22
+ /(?:approach|방법|전략|strategy)[::]?\s*(.+)/gi,
23
+ ];
24
+ const PROGRESS_PATTERNS = [
25
+ /(?:완료|completed|done|finished|구현|implemented)[::]?\s*(.+)/gi,
26
+ /(?:진행 중|in progress|working on|작업 중)[::]?\s*(.+)/gi,
27
+ ];
28
+ const TODO_PATTERNS = [
29
+ /(?:TODO|해야 할|남은 작업|remaining|next step|다음)[::]?\s*(.+)/gi,
30
+ /(?:미완료|not yet|pending|아직|남겨둔)[::]?\s*(.+)/gi,
31
+ ];
32
+ const ERROR_PATTERNS = [
33
+ /(?:에러|error|bug|이슈|issue|문제)[::]?\s*(.+?)(?:→|->|해결|fixed|resolved)\s*(.+)/gi,
34
+ ];
35
+ /**
36
+ * transcript에서 핵심 정보 추출
37
+ */
38
+ function extractCheckpointInfo(transcript) {
39
+ const info = {
40
+ decisions: [],
41
+ progress: [],
42
+ todos: [],
43
+ errorSolutions: [],
44
+ };
45
+ // 최근 부분만 분석 (너무 긴 transcript 방지)
46
+ const recentText = transcript.slice(-10000);
47
+ for (const pattern of DECISION_PATTERNS) {
48
+ pattern.lastIndex = 0;
49
+ let match;
50
+ while ((match = pattern.exec(recentText)) !== null) {
51
+ const text = match[1].trim().slice(0, 200);
52
+ if (text.length > 10)
53
+ info.decisions.push(text);
54
+ }
55
+ }
56
+ for (const pattern of PROGRESS_PATTERNS) {
57
+ pattern.lastIndex = 0;
58
+ let match;
59
+ while ((match = pattern.exec(recentText)) !== null) {
60
+ const text = match[1].trim().slice(0, 200);
61
+ if (text.length > 10)
62
+ info.progress.push(text);
63
+ }
64
+ }
65
+ for (const pattern of TODO_PATTERNS) {
66
+ pattern.lastIndex = 0;
67
+ let match;
68
+ while ((match = pattern.exec(recentText)) !== null) {
69
+ const text = match[1].trim().slice(0, 200);
70
+ if (text.length > 10)
71
+ info.todos.push(text);
72
+ }
73
+ }
74
+ for (const pattern of ERROR_PATTERNS) {
75
+ pattern.lastIndex = 0;
76
+ let match;
77
+ while ((match = pattern.exec(recentText)) !== null) {
78
+ const problem = match[1].trim().slice(0, 100);
79
+ const solution = match[2]?.trim().slice(0, 100) || '';
80
+ if (problem.length > 5) {
81
+ info.errorSolutions.push(`${problem} → ${solution}`);
82
+ }
83
+ }
84
+ }
85
+ // 중복 제거
86
+ info.decisions = [...new Set(info.decisions)].slice(0, 5);
87
+ info.progress = [...new Set(info.progress)].slice(0, 5);
88
+ info.todos = [...new Set(info.todos)].slice(0, 5);
89
+ info.errorSolutions = [...new Set(info.errorSolutions)].slice(0, 5);
90
+ return info;
91
+ }
92
+ /**
93
+ * CheckpointInfo를 메모리 콘텐츠로 포맷
94
+ */
95
+ function formatCheckpointContent(info) {
96
+ const parts = ['[Session Checkpoint]'];
97
+ if (info.decisions.length > 0) {
98
+ parts.push('\nDecisions:');
99
+ for (const d of info.decisions)
100
+ parts.push(`- ${d}`);
101
+ }
102
+ if (info.progress.length > 0) {
103
+ parts.push('\nProgress:');
104
+ for (const p of info.progress)
105
+ parts.push(`- ${p}`);
106
+ }
107
+ if (info.todos.length > 0) {
108
+ parts.push('\nTODO:');
109
+ for (const t of info.todos)
110
+ parts.push(`- ${t}`);
111
+ }
112
+ if (info.errorSolutions.length > 0) {
113
+ parts.push('\nError Solutions:');
114
+ for (const e of info.errorSolutions)
115
+ parts.push(`- ${e}`);
116
+ }
117
+ return parts.join('\n');
118
+ }
119
+ // ============================================================
120
+ // Core Logic
121
+ // ============================================================
122
+ export async function handlePreCompact(context) {
123
+ const config = new ConfigManager().load();
124
+ const logger = createLogger('PreCompact', config.logging);
125
+ const startTime = performance.now();
126
+ logger.info('Hook started', { projectPath: context.projectPath });
127
+ const transcript = context.transcript || '';
128
+ if (transcript.length < 100) {
129
+ logger.info('Transcript too short, skipping checkpoint');
130
+ logger.flush();
131
+ return;
132
+ }
133
+ try {
134
+ const info = extractCheckpointInfo(transcript);
135
+ // 추출된 정보가 없으면 스킵
136
+ const totalItems = info.decisions.length + info.progress.length +
137
+ info.todos.length + info.errorSolutions.length;
138
+ if (totalItems === 0) {
139
+ logger.info('No checkpoint info extracted');
140
+ logger.flush();
141
+ return;
142
+ }
143
+ const content = formatCheckpointContent(info);
144
+ const filtered = filterSensitiveInfo(content);
145
+ const input = {
146
+ content: filtered.filtered,
147
+ category: 'context',
148
+ tier: 'episodic',
149
+ tags: ['session-checkpoint', 'pre-compact'],
150
+ projectPath: context.projectPath,
151
+ sessionId: context.sessionId,
152
+ };
153
+ const db = getSharedDb(config.db.path);
154
+ const created = db.createMemory(input);
155
+ logger.info('Checkpoint saved', {
156
+ memoryId: created.id,
157
+ decisions: info.decisions.length,
158
+ progress: info.progress.length,
159
+ todos: info.todos.length,
160
+ errors: info.errorSolutions.length,
161
+ durationMs: Math.round(performance.now() - startTime),
162
+ });
163
+ }
164
+ catch (err) {
165
+ logger.error('Checkpoint save failed', err instanceof Error ? err : new Error(String(err)));
166
+ }
167
+ finally {
168
+ logger.flush();
169
+ }
170
+ }
171
+ // ============================================================
172
+ // CLI Entrypoint
173
+ // ============================================================
174
+ const HOOK_TIMEOUT_MS = 5_000;
175
+ export async function main() {
176
+ const chunks = [];
177
+ for await (const chunk of process.stdin) {
178
+ chunks.push(chunk);
179
+ }
180
+ const input = Buffer.concat(chunks).toString('utf-8').trim();
181
+ if (!input) {
182
+ closeSharedDb();
183
+ process.exit(0);
184
+ }
185
+ const safetyTimer = setTimeout(() => {
186
+ console.error(`[a2a] PreCompact safety timeout (${HOOK_TIMEOUT_MS}ms)`);
187
+ closeSharedDb();
188
+ process.exit(0);
189
+ }, HOOK_TIMEOUT_MS);
190
+ safetyTimer.unref();
191
+ try {
192
+ const raw = JSON.parse(input);
193
+ const context = normalizeHookInput(raw);
194
+ await handlePreCompact(context);
195
+ }
196
+ catch (err) {
197
+ console.error('[a2a] PreCompact error:', err instanceof Error ? err.message : err);
198
+ }
199
+ finally {
200
+ closeSharedDb();
201
+ process.exit(0);
202
+ }
203
+ }
204
+ const isMainModule = process.argv[1]?.endsWith('pre-compact.js') ||
205
+ process.argv[1]?.endsWith('pre-compact.ts');
206
+ if (isMainModule) {
207
+ main();
208
+ }
209
+ //# sourceMappingURL=pre-compact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pre-compact.js","sourceRoot":"","sources":["../../src/hooks/pre-compact.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"session-end.d.ts","sourceRoot":"","sources":["../../src/hooks/session-end.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6FhF;AA2QD;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAsB1C"}
1
+ {"version":3,"file":"session-end.d.ts","sourceRoot":"","sources":["../../src/hooks/session-end.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AA8C3D,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8DhF;AA4QD;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAsB1C"}
@@ -9,9 +9,48 @@ import { getSharedDb, closeSharedDb, normalizeHookInput } from './shared.js';
9
9
  import { ConfigManager } from '../config/manager.js';
10
10
  import { parseSessionFile, findSessionFiles } from '../session/parser.js';
11
11
  import { extractMemories, extractMemoriesWithLLM, summarizeSession } from '../extraction/extractor.js';
12
- import { A2AClient } from '../sync/client.js';
12
+ import { createHookClient } from './client-factory.js';
13
13
  import { SyncQueue } from '../sync/queue.js';
14
14
  import { createLogger } from '../utils/logger.js';
15
+ /** autoSync push + 팀 동기화 */
16
+ async function syncToRemote(_context, config, db, logger) {
17
+ // autoSync push (pending 메모리 일괄 전송)
18
+ if (config.autoSync.enabled && config.autoSync.pushOnSessionEnd && config.server.apiKey) {
19
+ try {
20
+ const client = createHookClient(config);
21
+ if (!client)
22
+ throw new Error('sync client not available');
23
+ const queue = new SyncQueue(db, client);
24
+ const flushResult = await queue.flush({ timeoutMs: config.autoSync.timeoutMs });
25
+ if (flushResult.pushed > 0) {
26
+ console.error(`[a2a] Synced ${flushResult.pushed} memories to server`);
27
+ }
28
+ if (flushResult.errors.length > 0) {
29
+ console.error(`[a2a] Sync errors: ${flushResult.errors.join(', ')}`);
30
+ }
31
+ }
32
+ catch (syncErr) {
33
+ logger.warn('Sync push failed', { error: syncErr instanceof Error ? syncErr.message : String(syncErr) });
34
+ }
35
+ }
36
+ // 팀 동기화 (team 모드)
37
+ if (config.mode === 'team' && config.team && config.server.apiKey) {
38
+ try {
39
+ const { TeamSynchronizer } = await import('../sync/team-synchronizer.js');
40
+ const client = createHookClient(config);
41
+ if (!client)
42
+ throw new Error('team sync client not available');
43
+ const teamSync = new TeamSynchronizer(db, client, config.team.teamPath, config.team.nodeId);
44
+ const teamResult = await teamSync.syncDelta();
45
+ if (teamResult.pushed > 0) {
46
+ console.error(`[a2a] Team synced ${teamResult.pushed} memories`);
47
+ }
48
+ }
49
+ catch (teamErr) {
50
+ logger.warn('Team sync failed', { error: teamErr instanceof Error ? teamErr.message : String(teamErr) });
51
+ }
52
+ }
53
+ }
15
54
  export async function handleSessionEnd(context) {
16
55
  const config = new ConfigManager().load();
17
56
  const logger = createLogger('SessionEnd', config.logging);
@@ -39,47 +78,17 @@ export async function handleSessionEnd(context) {
39
78
  }
40
79
  // ── Phase 2: 항상 실행 — Sync, Cleanup (세션 추출과 독립) ──
41
80
  // 숙련도 추적 + 서버 Push (Phase 5)
42
- if (config.proficiency?.enabled && createdIds.length > 0) {
43
- await trackProficiency(context, config, db, logger, createdIds);
44
- }
45
- // autoSync push (pending 메모리 일괄 전송)
46
- if (config.autoSync.enabled && config.autoSync.pushOnSessionEnd && config.server.apiKey) {
47
- try {
48
- const client = new A2AClient({
49
- baseUrl: config.server.url,
50
- apiKey: config.server.apiKey,
51
- });
52
- const queue = new SyncQueue(db, client);
53
- const flushResult = await queue.flush({ timeoutMs: config.autoSync.timeoutMs });
54
- if (flushResult.pushed > 0) {
55
- console.error(`[a2a] Synced ${flushResult.pushed} memories to server`);
56
- }
57
- if (flushResult.errors.length > 0) {
58
- console.error(`[a2a] Sync errors: ${flushResult.errors.join(', ')}`);
59
- }
60
- }
61
- catch (syncErr) {
62
- logger.warn('Sync push failed', { error: syncErr instanceof Error ? syncErr.message : String(syncErr) });
63
- }
64
- }
65
- // 팀 동기화 (team 모드)
66
- if (config.mode === 'team' && config.team && config.server.apiKey) {
67
- try {
68
- const { TeamSynchronizer } = await import('../sync/team-synchronizer.js');
69
- const client = new A2AClient({
70
- baseUrl: config.server.url,
71
- apiKey: config.server.apiKey,
72
- });
73
- const teamSync = new TeamSynchronizer(db, client, config.team.teamPath, config.team.nodeId);
74
- const teamResult = await teamSync.syncDelta();
75
- if (teamResult.pushed > 0) {
76
- console.error(`[a2a] Team synced ${teamResult.pushed} memories`);
77
- }
78
- }
79
- catch (teamErr) {
80
- logger.warn('Team sync failed', { error: teamErr instanceof Error ? teamErr.message : String(teamErr) });
81
- }
81
+ // createdIds.length > 0 게이트 제거: PostToolUse가 세션 중 이미 메모리를 생성했으므로
82
+ // SessionEnd의 createdIds(세션파일 추출분)과 무관하게 proficiency 평가 수행
83
+ if (config.proficiency?.enabled) {
84
+ // 세션 생성된 모든 메모리를 DB에서 조회하여 평가 대상으로 사용
85
+ const sessionMemoryIds = createdIds.length > 0
86
+ ? createdIds
87
+ : db.listMemories({ limit: 50 }).map(m => m.id);
88
+ await trackProficiency(context, config, db, logger, sessionMemoryIds);
82
89
  }
90
+ // 원격 동기화 (autoSync push + 팀 동기화)
91
+ await syncToRemote(context, config, db, logger);
83
92
  // 라이프사이클 정리 (설정 활성화 시)
84
93
  if (config.lifecycle?.cleanupOnSessionEnd) {
85
94
  try {
@@ -222,7 +231,9 @@ async function extractSessionMemories(context, config, db, logger, createdIds) {
222
231
  if (sessionCount > 0 && sessionCount % config.skillConversion.evaluationInterval === 0) {
223
232
  const { SkillEvaluator } = await import('../skill/evaluator.js');
224
233
  const evaluator = new SkillEvaluator(db, config);
225
- const evalResult = await evaluator.evaluate(context.projectPath);
234
+ // Taxonomy 분류를 위한 A2AClient (선택적)
235
+ const taxonomyClient = createHookClient(config, 10000) ?? undefined; // taxonomy 분류는 빠르게 (10초)
236
+ const evalResult = await evaluator.evaluate(context.projectPath, taxonomyClient);
226
237
  if (evalResult.created > 0) {
227
238
  console.error(`[a2a] Skill crystallization: ${evalResult.created} new skills created`);
228
239
  }
@@ -284,10 +295,9 @@ async function trackProficiency(context, config, db, logger, createdIds) {
284
295
  // Proficiency Server Push
285
296
  if (detectedEvents.length > 0 && config.server?.apiKey && config.server?.url) {
286
297
  try {
287
- const pushClient = new A2AClient({
288
- baseUrl: config.server.url,
289
- apiKey: config.server.apiKey,
290
- });
298
+ const pushClient = createHookClient(config);
299
+ if (!pushClient)
300
+ return;
291
301
  const connected = await pushClient.testConnection();
292
302
  if (connected) {
293
303
  for (const event of detectedEvents) {