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.
- package/README.md +134 -52
- package/dist/cli/commands/add.d.ts.map +1 -1
- package/dist/cli/commands/add.js +1 -0
- package/dist/cli/commands/add.js.map +1 -1
- package/dist/cli/commands/claude-sync.d.ts.map +1 -1
- package/dist/cli/commands/claude-sync.js +1 -0
- package/dist/cli/commands/claude-sync.js.map +1 -1
- package/dist/cli/commands/cleanup.d.ts.map +1 -1
- package/dist/cli/commands/cleanup.js +1 -0
- package/dist/cli/commands/cleanup.js.map +1 -1
- package/dist/cli/commands/config.d.ts.map +1 -1
- package/dist/cli/commands/config.js +2 -0
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/edit.d.ts.map +1 -1
- package/dist/cli/commands/edit.js +3 -0
- package/dist/cli/commands/edit.js.map +1 -1
- package/dist/cli/commands/embed.d.ts.map +1 -1
- package/dist/cli/commands/embed.js +1 -0
- package/dist/cli/commands/embed.js.map +1 -1
- package/dist/cli/commands/proficiency.d.ts.map +1 -1
- package/dist/cli/commands/proficiency.js +4 -0
- package/dist/cli/commands/proficiency.js.map +1 -1
- package/dist/cli/commands/rm.d.ts.map +1 -1
- package/dist/cli/commands/rm.js +4 -0
- package/dist/cli/commands/rm.js.map +1 -1
- package/dist/cli/commands/search.d.ts.map +1 -1
- package/dist/cli/commands/search.js +52 -8
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/setup.js +24 -0
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/commands/skill.d.ts.map +1 -1
- package/dist/cli/commands/skill.js +16 -1
- package/dist/cli/commands/skill.js.map +1 -1
- package/dist/cli/commands/sync.d.ts.map +1 -1
- package/dist/cli/commands/sync.js +3 -0
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/config/manager.d.ts +67 -13
- package/dist/config/manager.d.ts.map +1 -1
- package/dist/config/manager.js +20 -5
- package/dist/config/manager.js.map +1 -1
- package/dist/db/database.d.ts +5 -0
- package/dist/db/database.d.ts.map +1 -1
- package/dist/db/database.js +47 -24
- package/dist/db/database.js.map +1 -1
- package/dist/embedding/e5-provider.d.ts +41 -0
- package/dist/embedding/e5-provider.d.ts.map +1 -0
- package/dist/embedding/e5-provider.js +147 -0
- package/dist/embedding/e5-provider.js.map +1 -0
- package/dist/embedding/index.d.ts +1 -0
- package/dist/embedding/index.d.ts.map +1 -1
- package/dist/embedding/index.js +5 -0
- package/dist/embedding/index.js.map +1 -1
- package/dist/extraction/dedup-manager.d.ts +40 -0
- package/dist/extraction/dedup-manager.d.ts.map +1 -0
- package/dist/extraction/dedup-manager.js +148 -0
- package/dist/extraction/dedup-manager.js.map +1 -0
- package/dist/extraction/extractor.d.ts.map +1 -1
- package/dist/extraction/extractor.js +23 -6
- package/dist/extraction/extractor.js.map +1 -1
- package/dist/extraction/filter.d.ts.map +1 -1
- package/dist/extraction/filter.js +3 -0
- package/dist/extraction/filter.js.map +1 -1
- package/dist/extraction/scorer.js +23 -12
- package/dist/extraction/scorer.js.map +1 -1
- package/dist/hooks/client-factory.d.ts +14 -0
- package/dist/hooks/client-factory.d.ts.map +1 -0
- package/dist/hooks/client-factory.js +22 -0
- package/dist/hooks/client-factory.js.map +1 -0
- package/dist/hooks/post-tool-use.d.ts.map +1 -1
- package/dist/hooks/post-tool-use.js +101 -22
- package/dist/hooks/post-tool-use.js.map +1 -1
- package/dist/hooks/pre-compact.d.ts +15 -0
- package/dist/hooks/pre-compact.d.ts.map +1 -0
- package/dist/hooks/pre-compact.js +209 -0
- package/dist/hooks/pre-compact.js.map +1 -0
- package/dist/hooks/session-end.d.ts.map +1 -1
- package/dist/hooks/session-end.js +56 -46
- package/dist/hooks/session-end.js.map +1 -1
- package/dist/hooks/session-start.d.ts.map +1 -1
- package/dist/hooks/session-start.js +205 -138
- package/dist/hooks/session-start.js.map +1 -1
- package/dist/hooks/shared.d.ts +1 -0
- package/dist/hooks/shared.d.ts.map +1 -1
- package/dist/hooks/shared.js +35 -0
- package/dist/hooks/shared.js.map +1 -1
- package/dist/hooks/user-prompt-submit.d.ts +15 -0
- package/dist/hooks/user-prompt-submit.d.ts.map +1 -0
- package/dist/hooks/user-prompt-submit.js +240 -0
- package/dist/hooks/user-prompt-submit.js.map +1 -0
- package/dist/index.d.ts +11 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/lifecycle/quality-scorer.d.ts +2 -2
- package/dist/lifecycle/quality-scorer.d.ts.map +1 -1
- package/dist/lifecycle/quality-scorer.js +13 -7
- package/dist/lifecycle/quality-scorer.js.map +1 -1
- package/dist/lifecycle/tiering.d.ts.map +1 -1
- package/dist/lifecycle/tiering.js +11 -1
- package/dist/lifecycle/tiering.js.map +1 -1
- package/dist/proficiency/detection.d.ts +2 -4
- package/dist/proficiency/detection.d.ts.map +1 -1
- package/dist/proficiency/detection.js +11 -15
- package/dist/proficiency/detection.js.map +1 -1
- package/dist/proficiency/tracker.d.ts +2 -2
- package/dist/proficiency/tracker.d.ts.map +1 -1
- package/dist/proficiency/tracker.js +10 -7
- package/dist/proficiency/tracker.js.map +1 -1
- package/dist/search/adaptive-router.d.ts +28 -0
- package/dist/search/adaptive-router.d.ts.map +1 -0
- package/dist/search/adaptive-router.js +93 -0
- package/dist/search/adaptive-router.js.map +1 -0
- package/dist/search/ranker.d.ts +4 -0
- package/dist/search/ranker.d.ts.map +1 -1
- package/dist/search/ranker.js +4 -0
- package/dist/search/ranker.js.map +1 -1
- package/dist/search/reranker.d.ts +48 -0
- package/dist/search/reranker.d.ts.map +1 -0
- package/dist/search/reranker.js +155 -0
- package/dist/search/reranker.js.map +1 -0
- package/dist/skill/evaluator.d.ts +7 -9
- package/dist/skill/evaluator.d.ts.map +1 -1
- package/dist/skill/evaluator.js +122 -33
- package/dist/skill/evaluator.js.map +1 -1
- package/dist/skill/types.d.ts +5 -0
- package/dist/skill/types.d.ts.map +1 -1
- package/dist/sync/client.d.ts +26 -1
- package/dist/sync/client.d.ts.map +1 -1
- package/dist/sync/client.js +81 -28
- package/dist/sync/client.js.map +1 -1
- package/dist/sync/queue.d.ts +1 -1
- package/dist/sync/queue.d.ts.map +1 -1
- package/dist/sync/queue.js +20 -28
- package/dist/sync/queue.js.map +1 -1
- package/dist/sync/synchronizer.js +1 -1
- package/dist/sync/synchronizer.js.map +1 -1
- package/dist/sync/team-synchronizer.js.map +1 -1
- package/dist/types/index.d.ts +19 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +11 -3
- package/dist/types/index.js.map +1 -1
- 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
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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:', '
|
|
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(
|
|
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,
|
|
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 = [
|
|
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
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAA2B;IACjE,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC,IAAI,EAAE,CAAC;IAC1C,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAEpC,IAAI,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE5D,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QAED,cAAc;QACd,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5D,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YACrE,OAAO;QACT,CAAC;QAED,WAAW;QACX,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACpD,IAAI,QAAQ,IAAI,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,EAAE,CAAC;YAC9E,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QAED,YAAY;QACZ,MAAM,OAAO,GAAG;YACd,IAAI,EAAE,OAAO,CAAC,SAAS;YACvB,IAAI,EAAE,WAAoB;YAC1B,OAAO,EAAE;gBACP,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,OAAO,CAAC,UAAU;aAC5B;YACD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;QAC/C,MAAM,cAAc,GAAG,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACjE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QAE1E,MAAM,YAAY,GAAG,iBAAiB,CAAC,OAAO,EAAE;YAC9C,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,SAAS;YACT,cAAc;YACd,QAAQ;SACT,EAAE,MAAM,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC;QAE7C,8CAA8C;QAC9C,MAAM,gBAAgB,GAAG,MAAM,CAAC,WAAW,CAAC,qBAAqB,GAAG,GAAG,CAAC,CAAC,MAAM;QAE/E,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,KAAK,EAAE,YAAY,CAAC,UAAU;YAC9B,aAAa,EAAE,YAAY,CAAC,UAAU,IAAI,gBAAgB;SAC3D,CAAC,CAAC;QAEH,IAAI,YAAY,CAAC,UAAU,GAAG,gBAAgB,EAAE,CAAC;YAC/C,OAAO;QACT,CAAC;QAEH,SAAS;QACT,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAE9C,8DAA8D;QAC9D,IAAI,IAAyC,CAAC;QAC9C,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,GAAG,UAAU,CAAC;QACpB,CAAC;aAAM,IAAI,YAAY,CAAC,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,qBAAqB,EAAE,CAAC;YAC9E,IAAI,GAAG,SAAS,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,UAAU,CAAC;QACpB,CAAC;QAED,MAAM,KAAK,GAAsB;YAC/B,OAAO,EAAE,QAAQ,CAAC,QAAQ;YAC1B,QAAQ;YACR,IAAI;YACJ,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC;YACxB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC;QAEA,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAEvC,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YACjC,uBAAuB;YACvB,kDAAkD;YAClD,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;YAE9C,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QACrE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,sDAAsD;YACtD,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACzE,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC7D,gBAAgB;QAClB,CAAC;QAED,kCAAkC;QAClC,IAAI,OAAO,IAAI,MAAM,CAAC,SAAS,EAAE,OAAO,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAClF,IAAI,CAAC;gBACH,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;gBAC1E,MAAM,QAAQ,GAAG,uBAAuB,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;gBACvE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;gBACnE,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvB,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;gBACpC,CAAC;YACH,CAAC;YAAC,OAAO,MAAM,EAAE,CAAC;gBAChB,6BAA6B;gBAC7B,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACxG,CAAC;QACH,CAAC;QACD,8CAA8C;QAE9C,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;IAC3F,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,SAAkC;IACzD,IAAI,OAAO,SAAS,CAAC,SAAS,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC,SAAS,CAAC;IACxE,IAAI,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC,IAAI,CAAC;IAC9D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB,EAAE,QAAkB;IAC3D,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IACjD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;QAC/B,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,OAAO,QAAQ,KAAK,OAAO,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB;IACpC,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/E,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAc,EAAE,KAA8B;IACvE,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACzC,kBAAkB;IAClB,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC/E,MAAM,eAAe,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7E,IAAI,CAAC,eAAe;QAAE,OAAO,KAAK,CAAC;IAEnC,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,CAAC,KAAK,EAAE,SAAS,IAAI,KAAK,EAAE,IAAI,IAAI,EAAE,CAAW,CAAC;IACnE,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;QACxC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACnE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB,CAAC,OAA2B,EAAE,QAAiB;IACvE,IAAI,QAAQ;QAAE,OAAO,gBAAgB,CAAC;IAEtC,6DAA6D;IAC7D,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAChE,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;QAElC,2BAA2B;QAC3B,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAC5E,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,oCAAoC;QACpC,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE;YAClB,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;YAC1D,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;YAC7C,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;YAC1D,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,0CAA0C;QAC1C,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,YAAY,CAAC,OAA2B;IAC/C,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,CAAC,SAAS,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5C,IAAI,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC;IAC9C,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,SAAS,CAAC,OAA2B;IAC5C,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACpD,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACtC,IAAI,GAAG,EAAE,CAAC;YACR,qCAAqC;YACrC,+BAA+B;YAC/B,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;YAEnC,mCAAmC;YACnC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YAElC,kCAAkC;YAClC,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YAChF,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;gBAC9C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAkC,CAAC;QACzE,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,aAAa,EAAE,CAAC;IAClB,CAAC;AACH,CAAC;AAED,sBAAsB;AACtB,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC;IAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC;AACnE,IAAI,YAAY,EAAE,CAAC;IACjB,IAAI,EAAE,CAAC;AACT,CAAC"}
|
|
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;
|
|
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 {
|
|
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
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
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 =
|
|
288
|
-
|
|
289
|
-
|
|
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) {
|