claude-memory-layer 1.0.31 → 1.0.32

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 (313) hide show
  1. package/README.md +9 -2
  2. package/dist/cli/index.js +1 -1
  3. package/package.json +11 -2
  4. package/scripts/postinstall-embedding-backend.cjs +16 -12
  5. package/AGENTS.md +0 -71
  6. package/CLAUDE.md +0 -30
  7. package/HANDOFF.md +0 -92
  8. package/Memo.txt +0 -558
  9. package/benchmarks/replay/anonymized-real-sessions.json +0 -48
  10. package/config/kpi-thresholds.json +0 -7
  11. package/context.md +0 -636
  12. package/docs/ARCHITECTURE_COMPARISON_AND_RECOMMENDATIONS.md +0 -627
  13. package/docs/HERMES_MEMORY_INGESTION_ANALYSIS.md +0 -440
  14. package/docs/MCP_MEMORY_SERVICE_COMPARATIVE_REVIEW.md +0 -271
  15. package/docs/MEMORY_USEFULNESS_AUDIT.md +0 -371
  16. package/docs/MEMORY_USEFULNESS_AUDIT_RAW.json +0 -80
  17. package/docs/MEMSEARCH_PROJECT_STRUCTURE_ANALYSIS.md +0 -333
  18. package/docs/MEMU_ADOPTION.md +0 -40
  19. package/docs/OPERATIONS.md +0 -18
  20. package/docs/PRODUCT_VALIDATION_MATRIX.md +0 -82
  21. package/docs/PROJECT_STRUCTURE_ANALYSIS.md +0 -421
  22. package/docs/REFACTORING_MILESTONES_AND_ISSUES.md +0 -501
  23. package/docs/REFACTORING_PLAN_THIN_CORE.md +0 -414
  24. package/docs/REFERENCE_PROJECT_ANALYSES.md +0 -25
  25. package/docs/SUPERLOCALMEMORY_PROJECT_STRUCTURE_ANALYSIS.md +0 -452
  26. package/docs/TARGET_ARCHITECTURE_AND_FOLDER_STRUCTURE.md +0 -446
  27. package/docs/architecture/comparison-index.md +0 -47
  28. package/docs/reports/codex-real-data-validation-20260505T040447Z.md +0 -46
  29. package/plan.md +0 -1642
  30. package/scripts/build.ts +0 -159
  31. package/scripts/bump-patch-version.sh +0 -18
  32. package/scripts/delete-unknown-projects.js +0 -154
  33. package/scripts/fix-sync-gap.js +0 -32
  34. package/scripts/generate-session-qrels.ts +0 -126
  35. package/scripts/heartbeat-memory-orchestrator.sh +0 -28
  36. package/scripts/replay-retrieval-benchmark.ts +0 -69
  37. package/scripts/report-sync-gap.js +0 -26
  38. package/scripts/review-queue-auto-resolve.js +0 -21
  39. package/scripts/sync-gap-auto-heal.sh +0 -17
  40. package/spec.md +0 -624
  41. package/specs/20260207-dashboard-upgrade/context.md +0 -38
  42. package/specs/20260207-dashboard-upgrade/spec.md +0 -96
  43. package/specs/citations-system/context.md +0 -243
  44. package/specs/citations-system/plan.md +0 -495
  45. package/specs/citations-system/spec.md +0 -371
  46. package/specs/endless-mode/context.md +0 -305
  47. package/specs/endless-mode/plan.md +0 -620
  48. package/specs/endless-mode/spec.md +0 -455
  49. package/specs/entity-edge-model/context.md +0 -401
  50. package/specs/entity-edge-model/plan.md +0 -459
  51. package/specs/entity-edge-model/spec.md +0 -391
  52. package/specs/evidence-aligner-v2/context.md +0 -401
  53. package/specs/evidence-aligner-v2/plan.md +0 -303
  54. package/specs/evidence-aligner-v2/spec.md +0 -312
  55. package/specs/mcp-desktop-integration/context.md +0 -278
  56. package/specs/mcp-desktop-integration/plan.md +0 -550
  57. package/specs/mcp-desktop-integration/spec.md +0 -494
  58. package/specs/memory-utilization-improvements/context.md +0 -145
  59. package/specs/memory-utilization-improvements/plan.md +0 -361
  60. package/specs/memory-utilization-improvements/spec.md +0 -361
  61. package/specs/post-tool-use-hook/context.md +0 -319
  62. package/specs/post-tool-use-hook/plan.md +0 -469
  63. package/specs/post-tool-use-hook/spec.md +0 -364
  64. package/specs/private-tags/context.md +0 -288
  65. package/specs/private-tags/plan.md +0 -412
  66. package/specs/private-tags/spec.md +0 -345
  67. package/specs/progressive-disclosure/context.md +0 -346
  68. package/specs/progressive-disclosure/plan.md +0 -663
  69. package/specs/progressive-disclosure/spec.md +0 -415
  70. package/specs/selective-tool-observation/context.md +0 -100
  71. package/specs/selective-tool-observation/plan.md +0 -158
  72. package/specs/selective-tool-observation/spec.md +0 -127
  73. package/specs/task-entity-system/context.md +0 -297
  74. package/specs/task-entity-system/plan.md +0 -301
  75. package/specs/task-entity-system/spec.md +0 -314
  76. package/specs/thin-core-refactor/context.md +0 -275
  77. package/specs/thin-core-refactor/plan.md +0 -536
  78. package/specs/thin-core-refactor/spec.md +0 -465
  79. package/specs/vector-outbox-v2/context.md +0 -470
  80. package/specs/vector-outbox-v2/plan.md +0 -562
  81. package/specs/vector-outbox-v2/spec.md +0 -466
  82. package/specs/web-viewer-ui/context.md +0 -384
  83. package/specs/web-viewer-ui/plan.md +0 -797
  84. package/specs/web-viewer-ui/spec.md +0 -516
  85. package/src/adapters/claude/capture/index.ts +0 -3
  86. package/src/adapters/claude/context/index.ts +0 -3
  87. package/src/adapters/claude/hooks/index.ts +0 -21
  88. package/src/adapters/claude/hooks/post-tool-use.ts +0 -239
  89. package/src/adapters/claude/hooks/prompt-injection-policy.ts +0 -104
  90. package/src/adapters/claude/hooks/semantic-daemon-client.ts +0 -209
  91. package/src/adapters/claude/hooks/semantic-daemon.ts +0 -283
  92. package/src/adapters/claude/hooks/session-end.ts +0 -59
  93. package/src/adapters/claude/hooks/session-start.ts +0 -73
  94. package/src/adapters/claude/hooks/stop.ts +0 -128
  95. package/src/adapters/claude/hooks/user-prompt-submit.ts +0 -361
  96. package/src/adapters/claude/index.ts +0 -4
  97. package/src/adapters/claude/transcript/index.ts +0 -4
  98. package/src/adapters/claude/transcript/transcript-reader.ts +0 -57
  99. package/src/adapters/claude/transcript/turn-reconstructor.ts +0 -65
  100. package/src/apps/cli/claude-settings-hooks.ts +0 -138
  101. package/src/apps/cli/codex-import-runner.ts +0 -125
  102. package/src/apps/cli/codex-validation-output.ts +0 -95
  103. package/src/apps/cli/hermes-import-runner.ts +0 -130
  104. package/src/apps/cli/hermes-validation-output.ts +0 -91
  105. package/src/apps/cli/index.ts +0 -1735
  106. package/src/apps/cli/mcp-install.ts +0 -106
  107. package/src/apps/cli/retrieval-disclosure-output.ts +0 -196
  108. package/src/apps/dashboard/assets/js/bootstrap.js +0 -244
  109. package/src/apps/dashboard/assets/js/chat.js +0 -373
  110. package/src/apps/dashboard/assets/js/disclosure.js +0 -232
  111. package/src/apps/dashboard/assets/js/modals.js +0 -298
  112. package/src/apps/dashboard/assets/js/overview.js +0 -655
  113. package/src/apps/dashboard/assets/js/state.js +0 -72
  114. package/src/apps/dashboard/assets/js/views.js +0 -468
  115. package/src/apps/dashboard/index.html +0 -543
  116. package/src/apps/dashboard/index.ts +0 -3
  117. package/src/apps/dashboard/style.css +0 -1750
  118. package/src/apps/index.ts +0 -5
  119. package/src/apps/server/api/chat.ts +0 -244
  120. package/src/apps/server/api/citations.ts +0 -105
  121. package/src/apps/server/api/events.ts +0 -137
  122. package/src/apps/server/api/health.ts +0 -53
  123. package/src/apps/server/api/index.ts +0 -26
  124. package/src/apps/server/api/projects.ts +0 -74
  125. package/src/apps/server/api/search.ts +0 -184
  126. package/src/apps/server/api/sessions.ts +0 -115
  127. package/src/apps/server/api/stats.ts +0 -723
  128. package/src/apps/server/api/turns.ts +0 -143
  129. package/src/apps/server/api/utils.ts +0 -65
  130. package/src/apps/server/index.ts +0 -111
  131. package/src/cli/index.ts +0 -3
  132. package/src/cli/retrieval-disclosure-output.ts +0 -2
  133. package/src/compat/index.ts +0 -5
  134. package/src/core/canonical-key.ts +0 -186
  135. package/src/core/citation-generator.ts +0 -63
  136. package/src/core/consolidated-store.ts +0 -356
  137. package/src/core/consolidation-worker.ts +0 -493
  138. package/src/core/context-formatter.ts +0 -276
  139. package/src/core/continuity-manager.ts +0 -341
  140. package/src/core/db-wrapper.ts +0 -64
  141. package/src/core/derive/fact-deriver.ts +0 -170
  142. package/src/core/derive/index.ts +0 -2
  143. package/src/core/derive/summary-deriver.ts +0 -76
  144. package/src/core/edge-repo.ts +0 -333
  145. package/src/core/embedder.ts +0 -4
  146. package/src/core/engine/embedding-maintenance-service.ts +0 -187
  147. package/src/core/engine/endless-memory-services.ts +0 -4
  148. package/src/core/engine/index.ts +0 -19
  149. package/src/core/engine/memory-engine-services.ts +0 -170
  150. package/src/core/engine/memory-ingest-service.ts +0 -317
  151. package/src/core/engine/memory-query-service.ts +0 -173
  152. package/src/core/engine/memory-runtime-service.ts +0 -162
  153. package/src/core/engine/memory-service-composition.ts +0 -231
  154. package/src/core/engine/retrieval-analytics-service.ts +0 -181
  155. package/src/core/engine/retrieval-disclosure-service.ts +0 -420
  156. package/src/core/engine/retrieval-orchestrator.ts +0 -377
  157. package/src/core/engine/retrieval-services.ts +0 -176
  158. package/src/core/engine/shared-memory-services.ts +0 -4
  159. package/src/core/entity-repo.ts +0 -349
  160. package/src/core/event-store.ts +0 -779
  161. package/src/core/evidence-aligner.ts +0 -635
  162. package/src/core/external-market-context.ts +0 -582
  163. package/src/core/graduation-worker.ts +0 -171
  164. package/src/core/graduation.ts +0 -377
  165. package/src/core/index.ts +0 -64
  166. package/src/core/ingest-interceptor.ts +0 -80
  167. package/src/core/markdown-mirror.ts +0 -70
  168. package/src/core/matcher.ts +0 -208
  169. package/src/core/md-mirror.ts +0 -92
  170. package/src/core/metadata-extractor.ts +0 -203
  171. package/src/core/model/memory-fact.ts +0 -30
  172. package/src/core/model/memory-rule.ts +0 -14
  173. package/src/core/model/memory-summary.ts +0 -21
  174. package/src/core/model/raw-event.ts +0 -28
  175. package/src/core/model/retrieval-result.ts +0 -35
  176. package/src/core/mongo-sync-config.ts +0 -165
  177. package/src/core/mongo-sync-worker.ts +0 -381
  178. package/src/core/privacy/filter.ts +0 -190
  179. package/src/core/privacy/index.ts +0 -20
  180. package/src/core/privacy/tag-parser.ts +0 -145
  181. package/src/core/product-validation-matrix.ts +0 -314
  182. package/src/core/progressive-retriever.ts +0 -414
  183. package/src/core/registry/project-path.ts +0 -54
  184. package/src/core/registry/session-registry.ts +0 -69
  185. package/src/core/replay-evaluator.ts +0 -625
  186. package/src/core/retrieval-benchmark.ts +0 -117
  187. package/src/core/retrieval-quality.ts +0 -109
  188. package/src/core/retriever.ts +0 -800
  189. package/src/core/session-qrels.ts +0 -360
  190. package/src/core/shared-event-store.ts +0 -114
  191. package/src/core/shared-promoter.ts +0 -249
  192. package/src/core/shared-store.ts +0 -289
  193. package/src/core/shared-vector-store.ts +0 -203
  194. package/src/core/sqlite-event-store.ts +0 -1846
  195. package/src/core/sqlite-wrapper.ts +0 -116
  196. package/src/core/sync-worker.ts +0 -228
  197. package/src/core/tag-taxonomy.ts +0 -51
  198. package/src/core/task/blocker-resolver.ts +0 -333
  199. package/src/core/task/index.ts +0 -9
  200. package/src/core/task/task-matcher.ts +0 -240
  201. package/src/core/task/task-projector.ts +0 -358
  202. package/src/core/task/task-resolver.ts +0 -421
  203. package/src/core/turn-state.ts +0 -207
  204. package/src/core/types.ts +0 -952
  205. package/src/core/vector-outbox.ts +0 -299
  206. package/src/core/vector-store.ts +0 -231
  207. package/src/core/vector-worker.ts +0 -521
  208. package/src/core/working-set-store.ts +0 -257
  209. package/src/extensions/endless-memory/endless-memory-services.ts +0 -350
  210. package/src/extensions/endless-memory/index.ts +0 -1
  211. package/src/extensions/index.ts +0 -5
  212. package/src/extensions/mcp/handlers.ts +0 -960
  213. package/src/extensions/mcp/index.ts +0 -48
  214. package/src/extensions/mcp/tools.ts +0 -252
  215. package/src/extensions/shared-memory/index.ts +0 -1
  216. package/src/extensions/shared-memory/shared-memory-services.ts +0 -211
  217. package/src/extensions/vector/embedder.ts +0 -234
  218. package/src/extensions/vector/index.ts +0 -1
  219. package/src/hooks/post-tool-use.ts +0 -9
  220. package/src/hooks/semantic-daemon-client.ts +0 -1
  221. package/src/hooks/semantic-daemon.ts +0 -11
  222. package/src/hooks/session-end.ts +0 -9
  223. package/src/hooks/session-start.ts +0 -9
  224. package/src/hooks/stop.ts +0 -9
  225. package/src/hooks/user-prompt-submit.ts +0 -9
  226. package/src/index.ts +0 -13
  227. package/src/mcp/handlers.ts +0 -2
  228. package/src/mcp/index.ts +0 -4
  229. package/src/mcp/tools.ts +0 -2
  230. package/src/server/api/chat.ts +0 -2
  231. package/src/server/api/citations.ts +0 -2
  232. package/src/server/api/events.ts +0 -2
  233. package/src/server/api/health.ts +0 -2
  234. package/src/server/api/index.ts +0 -2
  235. package/src/server/api/projects.ts +0 -2
  236. package/src/server/api/search.ts +0 -2
  237. package/src/server/api/sessions.ts +0 -2
  238. package/src/server/api/stats.ts +0 -2
  239. package/src/server/api/turns.ts +0 -2
  240. package/src/server/api/utils.ts +0 -2
  241. package/src/server/index.ts +0 -2
  242. package/src/services/bootstrap-organizer.ts +0 -463
  243. package/src/services/codex-session-history-importer.ts +0 -966
  244. package/src/services/hermes-session-history-importer.ts +0 -733
  245. package/src/services/memory-service-config.ts +0 -36
  246. package/src/services/memory-service-registry.ts +0 -150
  247. package/src/services/memory-service.ts +0 -688
  248. package/src/services/session-history-importer.ts +0 -629
  249. package/tests/README.md +0 -23
  250. package/tests/adapters/claude/claude-semantic-daemon-adapter.test.ts +0 -54
  251. package/tests/adapters/claude/claude-transcript-reconstructor.test.ts +0 -98
  252. package/tests/adapters/claude-hook-prompt-injection-policy.test.ts +0 -99
  253. package/tests/apps/app-layer-boundary.test.ts +0 -48
  254. package/tests/apps/claude-settings-hooks.test.ts +0 -107
  255. package/tests/apps/cli-disclosure-output.test.ts +0 -212
  256. package/tests/apps/codex-import-runner.test.ts +0 -99
  257. package/tests/apps/codex-validation-output.test.ts +0 -100
  258. package/tests/apps/hermes-import-runner.test.ts +0 -99
  259. package/tests/apps/mcp-install-command.test.ts +0 -59
  260. package/tests/apps/package-build-entrypoints.test.ts +0 -30
  261. package/tests/apps/postinstall-embedding-backend.test.ts +0 -185
  262. package/tests/apps/search-api-disclosure.test.ts +0 -162
  263. package/tests/apps/stats-api-lightweight.test.ts +0 -67
  264. package/tests/apps/ui-disclosure-output.test.ts +0 -140
  265. package/tests/core/bootstrap-organizer.test.ts +0 -111
  266. package/tests/core/canonical-key.test.ts +0 -101
  267. package/tests/core/codex-session-history-importer-validation.test.ts +0 -185
  268. package/tests/core/consolidation-worker.test.ts +0 -75
  269. package/tests/core/embedding-maintenance-service.test.ts +0 -282
  270. package/tests/core/evidence-aligner.test.ts +0 -152
  271. package/tests/core/external-market-context.test.ts +0 -209
  272. package/tests/core/fact-deriver.test.ts +0 -79
  273. package/tests/core/hermes-session-history-importer-validation.test.ts +0 -609
  274. package/tests/core/ingest-interceptor.test.ts +0 -38
  275. package/tests/core/markdown-mirror.test.ts +0 -85
  276. package/tests/core/matcher.test.ts +0 -112
  277. package/tests/core/md-mirror.test.ts +0 -50
  278. package/tests/core/memory-engine-services.test.ts +0 -240
  279. package/tests/core/memory-ingest-service.test.ts +0 -296
  280. package/tests/core/memory-query-service.test.ts +0 -129
  281. package/tests/core/memory-runtime-service.test.ts +0 -201
  282. package/tests/core/memory-service-composition.test.ts +0 -192
  283. package/tests/core/memory-service-config.test.ts +0 -41
  284. package/tests/core/memory-service-facade.test.ts +0 -30
  285. package/tests/core/memory-service-registry.test.ts +0 -206
  286. package/tests/core/product-validation-matrix.test.ts +0 -61
  287. package/tests/core/project-registry.test.ts +0 -78
  288. package/tests/core/replay-evaluator.test.ts +0 -181
  289. package/tests/core/retrieval-analytics-service.test.ts +0 -210
  290. package/tests/core/retrieval-benchmark.test.ts +0 -93
  291. package/tests/core/retrieval-disclosure-service.test.ts +0 -264
  292. package/tests/core/retrieval-orchestrator.test.ts +0 -403
  293. package/tests/core/retrieval-quality.test.ts +0 -31
  294. package/tests/core/retrieval-services.test.ts +0 -185
  295. package/tests/core/retriever-fallback-chain.test.ts +0 -223
  296. package/tests/core/retriever-strategy-scope.test.ts +0 -164
  297. package/tests/core/retriever.memu-adoption.test.ts +0 -122
  298. package/tests/core/session-history-importer-filter.test.ts +0 -78
  299. package/tests/core/session-qrels.test.ts +0 -250
  300. package/tests/core/sqlite-event-store-replication.test.ts +0 -127
  301. package/tests/core/summary-deriver.test.ts +0 -66
  302. package/tests/extensions/embedder-warning-suppression.test.ts +0 -84
  303. package/tests/extensions/endless-memory-extension-boundary.test.ts +0 -17
  304. package/tests/extensions/endless-memory-services.test.ts +0 -325
  305. package/tests/extensions/mcp-context-tools.test.ts +0 -905
  306. package/tests/extensions/mcp-extension-boundary.test.ts +0 -21
  307. package/tests/extensions/mcp-package-build.test.ts +0 -22
  308. package/tests/extensions/mcp-project-aware-tools.test.ts +0 -102
  309. package/tests/extensions/shared-memory-extension-boundary.test.ts +0 -24
  310. package/tests/extensions/shared-memory-services.test.ts +0 -309
  311. package/tests/extensions/vector-extension-boundary.test.ts +0 -21
  312. package/tsconfig.json +0 -24
  313. package/vitest.config.ts +0 -15
@@ -1,415 +0,0 @@
1
- # Progressive Disclosure Specification
2
-
3
- > **Version**: 1.0.0
4
- > **Status**: Draft
5
- > **Created**: 2026-02-01
6
- > **Reference**: claude-mem (thedotmack/claude-mem)
7
-
8
- ## 1. 개요
9
-
10
- ### 1.1 문제 정의
11
-
12
- 현재 시스템에서 메모리 검색 시 토큰 비효율 발생:
13
-
14
- 1. **전체 로드 문제**: 검색 결과를 한 번에 모든 내용을 가져옴
15
- 2. **토큰 낭비**: 관련 없는 내용도 컨텍스트에 포함
16
- 3. **컨텍스트 한계**: 대용량 메모리 사용 시 토큰 초과
17
-
18
- ### 1.2 해결 방향
19
-
20
- **3-Layer Progressive Disclosure**:
21
- - Layer 1: 검색 인덱스 (ID + 요약) - 최소 토큰
22
- - Layer 2: 타임라인 컨텍스트 - 시간순 맥락
23
- - Layer 3: 상세 정보 - 선택된 항목만 전체 로드
24
-
25
- ## 2. 핵심 개념
26
-
27
- ### 2.1 3-Layer 아키텍처
28
-
29
- ```
30
- ┌─────────────────────────────────────────────────────────────┐
31
- │ User Query │
32
- └─────────────────────────────────────────────────────────────┘
33
-
34
-
35
- ┌─────────────────────────────────────────────────────────────┐
36
- │ Layer 1: Search Index (~50-100 tokens per result) │
37
- │ ┌──────────────────────────────────────────────────────┐ │
38
- │ │ { id: "mem_1", summary: "파일 구조 설명", score: 0.95 } │ │
39
- │ │ { id: "mem_2", summary: "타입 정의 논의", score: 0.87 } │ │
40
- │ │ { id: "mem_3", summary: "버그 수정 방법", score: 0.82 } │ │
41
- │ └──────────────────────────────────────────────────────┘ │
42
- └─────────────────────────────────────────────────────────────┘
43
-
44
- (선택적 확장)
45
-
46
- ┌─────────────────────────────────────────────────────────────┐
47
- │ Layer 2: Timeline Context (~200 tokens) │
48
- │ ┌──────────────────────────────────────────────────────┐ │
49
- │ │ 2026-01-30 14:00: "파일 구조 변경 결정" │ │
50
- │ │ 2026-01-30 14:15: "types.ts 분리" ← mem_1 │ │
51
- │ │ 2026-01-30 14:30: "테스트 작성" │ │
52
- │ └──────────────────────────────────────────────────────┘ │
53
- └─────────────────────────────────────────────────────────────┘
54
-
55
- (필요 시만)
56
-
57
- ┌─────────────────────────────────────────────────────────────┐
58
- │ Layer 3: Full Details (~500-1000 tokens per result) │
59
- │ ┌──────────────────────────────────────────────────────┐ │
60
- │ │ mem_1: { │ │
61
- │ │ content: "전체 대화 내용...", │ │
62
- │ │ metadata: {...}, │ │
63
- │ │ evidence: [...] │ │
64
- │ │ } │ │
65
- │ └──────────────────────────────────────────────────────┘ │
66
- └─────────────────────────────────────────────────────────────┘
67
- ```
68
-
69
- ### 2.2 토큰 효율성
70
-
71
- | 방식 | 5개 결과 토큰 | 20개 결과 토큰 |
72
- |------|--------------|---------------|
73
- | 기존 (전체 로드) | ~5,000 | ~20,000 |
74
- | Progressive L1 | ~500 | ~2,000 |
75
- | Progressive L1+L2 | ~700 | ~2,200 |
76
- | Progressive L1+L2+L3 (2개) | ~1,700 | ~2,200 |
77
-
78
- **예상 토큰 절약: ~10배**
79
-
80
- ### 2.3 확장 트리거
81
-
82
- ```typescript
83
- type ExpansionTrigger =
84
- | 'high_confidence' // score ≥ 0.92 → 자동 L3 확장
85
- | 'user_request' // "자세히 알려줘" → L3 확장
86
- | 'temporal_proximity' // 시간적 근접 → L2 확장
87
- | 'explicit_id' // "mem_1 보여줘" → L3 확장
88
- | 'ambiguity'; // 여러 유사 결과 → L2 확장
89
- ```
90
-
91
- ## 3. 데이터 스키마
92
-
93
- ### 3.1 Layer 1: SearchIndex
94
-
95
- ```typescript
96
- const SearchIndexItemSchema = z.object({
97
- id: z.string(), // 이벤트/메모리 ID
98
- summary: z.string().max(100), // 한 줄 요약
99
- score: z.number(), // 유사도 점수
100
- type: z.enum(['prompt', 'response', 'tool', 'insight']),
101
- timestamp: z.date(),
102
- sessionId: z.string()
103
- });
104
-
105
- type SearchIndexItem = z.infer<typeof SearchIndexItemSchema>;
106
-
107
- // 반환 예시
108
- {
109
- id: "evt_abc123",
110
- summary: "DuckDB 스키마 설계 논의",
111
- score: 0.94,
112
- type: "response",
113
- timestamp: "2026-01-30T14:00:00Z",
114
- sessionId: "session_xyz"
115
- }
116
- ```
117
-
118
- ### 3.2 Layer 2: TimelineContext
119
-
120
- ```typescript
121
- const TimelineItemSchema = z.object({
122
- id: z.string(),
123
- timestamp: z.date(),
124
- type: z.enum(['prompt', 'response', 'tool', 'insight']),
125
- preview: z.string().max(200), // 2-3문장 미리보기
126
- isTarget: z.boolean() // 검색 결과에 해당하는지
127
- });
128
-
129
- type TimelineItem = z.infer<typeof TimelineItemSchema>;
130
-
131
- // 반환 예시 (target ID 주변 ±3개)
132
- [
133
- { id: "evt_1", preview: "이전 대화...", isTarget: false },
134
- { id: "evt_2", preview: "관련 질문...", isTarget: false },
135
- { id: "evt_abc123", preview: "DuckDB 스키마...", isTarget: true }, // 타겟
136
- { id: "evt_3", preview: "후속 논의...", isTarget: false }
137
- ]
138
- ```
139
-
140
- ### 3.3 Layer 3: FullDetail
141
-
142
- ```typescript
143
- const FullDetailSchema = z.object({
144
- id: z.string(),
145
- content: z.string(), // 전체 내용
146
- type: z.enum(['prompt', 'response', 'tool', 'insight']),
147
- timestamp: z.date(),
148
- sessionId: z.string(),
149
-
150
- // 메타데이터
151
- metadata: z.object({
152
- tokenCount: z.number(),
153
- hasCode: z.boolean(),
154
- files: z.array(z.string()).optional(),
155
- tools: z.array(z.string()).optional()
156
- }),
157
-
158
- // 관계 정보
159
- relations: z.object({
160
- parentId: z.string().optional(),
161
- childIds: z.array(z.string()),
162
- relatedIds: z.array(z.string())
163
- }).optional()
164
- });
165
-
166
- type FullDetail = z.infer<typeof FullDetailSchema>;
167
- ```
168
-
169
- ## 4. API 인터페이스
170
-
171
- ### 4.1 ProgressiveRetriever
172
-
173
- ```typescript
174
- interface ProgressiveRetriever {
175
- // Layer 1: 검색 인덱스 반환
176
- searchIndex(
177
- query: string,
178
- options?: {
179
- topK?: number;
180
- filter?: SearchFilter;
181
- }
182
- ): Promise<SearchIndexItem[]>;
183
-
184
- // Layer 2: 타임라인 컨텍스트 반환
185
- getTimeline(
186
- targetIds: string[],
187
- options?: {
188
- windowSize?: number; // 앞뒤로 몇 개씩
189
- }
190
- ): Promise<TimelineItem[]>;
191
-
192
- // Layer 3: 상세 정보 반환
193
- getDetails(ids: string[]): Promise<FullDetail[]>;
194
-
195
- // 편의 메서드: 자동 확장
196
- smartSearch(
197
- query: string,
198
- options?: SmartSearchOptions
199
- ): Promise<ProgressiveSearchResult>;
200
- }
201
- ```
202
-
203
- ### 4.2 SmartSearch 옵션
204
-
205
- ```typescript
206
- interface SmartSearchOptions {
207
- // Layer 1 설정
208
- topK: number; // 기본: 10
209
- minScore: number; // 기본: 0.7
210
-
211
- // 자동 확장 설정
212
- autoExpandTimeline: boolean; // 기본: true (score gap 클 때)
213
- autoExpandDetails: boolean; // 기본: true (score ≥ 0.92)
214
- maxAutoExpandCount: number; // 기본: 3
215
-
216
- // 토큰 제한
217
- maxTotalTokens: number; // 기본: 2000
218
- }
219
- ```
220
-
221
- ### 4.3 ProgressiveSearchResult
222
-
223
- ```typescript
224
- interface ProgressiveSearchResult {
225
- // Layer 1 (항상 포함)
226
- index: SearchIndexItem[];
227
-
228
- // Layer 2 (선택적)
229
- timeline?: TimelineItem[];
230
-
231
- // Layer 3 (선택적)
232
- details?: FullDetail[];
233
-
234
- // 메타정보
235
- meta: {
236
- totalMatches: number;
237
- expandedCount: number;
238
- estimatedTokens: number;
239
- expansionReason?: string;
240
- };
241
- }
242
- ```
243
-
244
- ## 5. 확장 규칙
245
-
246
- ### 5.1 자동 확장 조건
247
-
248
- ```typescript
249
- function shouldAutoExpand(results: SearchIndexItem[]): ExpansionDecision {
250
- // Rule 1: 높은 신뢰도 단일 결과
251
- if (results[0]?.score >= 0.92 && results.length === 1) {
252
- return { expand: true, ids: [results[0].id], reason: 'high_confidence' };
253
- }
254
-
255
- // Rule 2: 명확한 1등 (2등과 gap이 큼)
256
- if (results.length >= 2) {
257
- const gap = results[0].score - results[1].score;
258
- if (results[0].score >= 0.85 && gap >= 0.1) {
259
- return { expand: true, ids: [results[0].id], reason: 'clear_winner' };
260
- }
261
- }
262
-
263
- // Rule 3: 모호한 결과 → 타임라인만 확장
264
- if (results.length >= 3 && results[2].score >= 0.8) {
265
- return {
266
- expand: true,
267
- expandTimeline: true,
268
- expandDetails: false,
269
- ids: results.slice(0, 3).map(r => r.id),
270
- reason: 'ambiguous_results'
271
- };
272
- }
273
-
274
- // Rule 4: 낮은 점수 → 확장 안 함
275
- return { expand: false, reason: 'low_confidence' };
276
- }
277
- ```
278
-
279
- ### 5.2 토큰 예산 관리
280
-
281
- ```typescript
282
- function expandWithinBudget(
283
- index: SearchIndexItem[],
284
- budget: number
285
- ): ProgressiveSearchResult {
286
- let usedTokens = estimateTokens(index); // ~50-100 per item
287
- const result: ProgressiveSearchResult = { index, meta: { ... } };
288
-
289
- // 예산 내에서 확장
290
- const sortedByScore = [...index].sort((a, b) => b.score - a.score);
291
-
292
- for (const item of sortedByScore) {
293
- if (usedTokens >= budget) break;
294
-
295
- // 타임라인 추가 (~200 tokens)
296
- if (usedTokens + 200 <= budget && !result.timeline) {
297
- result.timeline = await getTimeline([item.id]);
298
- usedTokens += estimateTokens(result.timeline);
299
- }
300
-
301
- // 상세 추가 (~500-1000 tokens)
302
- if (item.score >= 0.85 && usedTokens + 800 <= budget) {
303
- const detail = await getDetails([item.id]);
304
- result.details = [...(result.details || []), ...detail];
305
- usedTokens += estimateTokens(detail);
306
- }
307
- }
308
-
309
- result.meta.estimatedTokens = usedTokens;
310
- return result;
311
- }
312
- ```
313
-
314
- ## 6. 컨텍스트 포맷
315
-
316
- ### 6.1 Layer 1 포맷 (최소)
317
-
318
- ```markdown
319
- ## Related Memories (5 matches)
320
-
321
- | ID | Summary | Score |
322
- |----|---------|-------|
323
- | mem_1 | DuckDB 스키마 설계 논의 | 0.94 |
324
- | mem_2 | 타입 시스템 리팩토링 | 0.87 |
325
- | mem_3 | 벡터 저장소 설정 | 0.82 |
326
- | mem_4 | 테스트 코드 작성 | 0.78 |
327
- | mem_5 | CI/CD 파이프라인 | 0.75 |
328
-
329
- *Use "show mem_1" for details*
330
- ```
331
-
332
- ### 6.2 Layer 2 포맷 (타임라인)
333
-
334
- ```markdown
335
- ## Related Memories with Timeline
336
-
337
- ### Context around mem_1 (2026-01-30)
338
-
339
- 14:00 - User: "DB 스키마를 어떻게 설계할까?"
340
- 14:05 - **[mem_1]** Assistant: "DuckDB를 사용하여 이벤트 소싱 패턴..."
341
- 14:15 - User: "인덱스는 어떻게?"
342
- 14:20 - Assistant: "다음 인덱스들을 추천..."
343
- ```
344
-
345
- ### 6.3 Layer 3 포맷 (상세)
346
-
347
- ```markdown
348
- ## Memory Detail: mem_1
349
-
350
- **Session**: session_xyz | **Date**: 2026-01-30 14:05
351
-
352
- ### Content
353
- DuckDB를 사용하여 이벤트 소싱 패턴을 구현하는 방법을 설명드립니다.
354
-
355
- 1. events 테이블 생성:
356
- \`\`\`sql
357
- CREATE TABLE events (
358
- event_id VARCHAR PRIMARY KEY,
359
- ...
360
- );
361
- \`\`\`
362
-
363
- 2. 인덱스 설계:
364
- - event_type별 인덱스
365
- - session_id별 인덱스
366
- ...
367
-
368
- **Related Files**: src/core/event-store.ts, src/core/types.ts
369
- **Tools Used**: Read, Write
370
- ```
371
-
372
- ## 7. 캐싱 전략
373
-
374
- ### 7.1 Layer별 캐싱
375
-
376
- ```typescript
377
- interface CacheConfig {
378
- layer1: {
379
- ttl: 60 * 1000, // 1분 (검색 결과)
380
- maxSize: 100 // 최근 100개 쿼리
381
- };
382
- layer2: {
383
- ttl: 5 * 60 * 1000, // 5분 (타임라인)
384
- maxSize: 500
385
- };
386
- layer3: {
387
- ttl: 30 * 60 * 1000, // 30분 (상세 정보)
388
- maxSize: 200
389
- };
390
- }
391
- ```
392
-
393
- ### 7.2 캐시 키
394
-
395
- ```typescript
396
- function getCacheKey(layer: number, params: unknown): string {
397
- switch (layer) {
398
- case 1:
399
- return `l1:${hash(params.query)}:${params.topK}`;
400
- case 2:
401
- return `l2:${params.targetIds.sort().join(',')}`;
402
- case 3:
403
- return `l3:${params.id}`;
404
- }
405
- }
406
- ```
407
-
408
- ## 8. 성공 기준
409
-
410
- - [ ] Layer 1 검색이 100ms 이내 반환
411
- - [ ] Layer 2 타임라인이 200ms 이내 반환
412
- - [ ] Layer 3 상세가 500ms 이내 반환
413
- - [ ] 평균 토큰 사용량이 기존 대비 50% 이상 감소
414
- - [ ] 자동 확장이 적절한 경우에만 동작
415
- - [ ] 토큰 예산 내에서 최적의 결과 제공
@@ -1,100 +0,0 @@
1
- # Context: Selective Storage (전체 이벤트 타입 분석)
2
-
3
- ## 실측 데이터 (f4d5c120 / shopping_assistant)
4
- > SQLite events.sqlite 직접 쿼리 기준 (10,536개)
5
-
6
- ### 이벤트 구성
7
-
8
- | eventType | count | 비율 | avg_len |
9
- |-------------------|--------|--------|---------|
10
- | tool_observation | 7,212 | 68.5% | 4,166 |
11
- | agent_response | 2,222 | 21.1% | 417 |
12
- | user_prompt | 948 | 9.0% | 620 |
13
- | session_summary | 154 | 1.5% | 172 |
14
-
15
- ---
16
-
17
- ## 1. tool_observation 분석
18
-
19
- ### 도구별 분포 (전체)
20
-
21
- | Tool | count | avg_len | 저장 가치 |
22
- |--------------|-------|---------|-----------|
23
- | Read | 2,285 | 4,678 | ❌ 낮음 (재현 가능) |
24
- | Bash | 2,034 | 2,593 | ✅/⚠️ 조건부 |
25
- | Grep | 1,338 | 1,931 | ❌ 낮음 (재현 가능) |
26
- | Edit | 737 | 11,034 | ✅ 높음 (변경 기록) |
27
- | Write | 323 | 5,042 | ✅ 높음 (생성 기록) |
28
- | Glob | 171 | 3,733 | ❌ 낮음 (재현 가능) |
29
- | ToolSearch | 133 | 301 | ❌ 낮음 (시스템 내부) |
30
- | Task | 114 | 7,592 | ✅ 높음 (서브태스크 결과) |
31
- | Skill | 23 | 203 | ❌ 낮음 |
32
- | ExitPlanMode | 10 | 5,594 | ⚠️ 조건부 |
33
- | EnterPlanMode| 10 | 275 | ❌ 낮음 |
34
- | Agent | 6 | 8,320 | ✅ 높음 |
35
- | WebFetch | 2 | 1,868 | ❌ 낮음 (재현 가능) |
36
- | 기타 MCP | ~16| - | ⚠️ 케이스별 |
37
-
38
- ### 문제
39
- - Read/Grep/Glob 합계 **3,794개 (52.6%)** → 모두 재현 가능, 저장 불필요
40
- - Bash 중 의미 없는 빈 출력 다수 존재 가능
41
- - 현재 제외 목록: TodoWrite, TodoRead만 (너무 좁음)
42
-
43
- ---
44
-
45
- ## 2. agent_response 분석
46
-
47
- ### 길이 분포
48
-
49
- | 구간 | count | 비율 | 특성 |
50
- |--------------|-------|-------|------|
51
- | < 50 chars | 608 | 27.4% | 도구 체인 전환 메시지 |
52
- | 50~200 chars | 587 | 26.4% | 짧은 중간 응답 |
53
- | 200~1k chars | 758 | 34.1% | 실질적 내용 |
54
- | > 1k chars | 269 | 12.1% | 명확히 가치 있음 |
55
-
56
- ### 실제 저장된 짧은 응답 예시
57
-
58
- ```
59
- [15] "**문제 찾았습니다!** 🎯"
60
- [20] "이제 실제로 서버를 시작해보겠습니다:"
61
- [44] "code-server 문제를 진단해보겠습니다. 먼저 현재 상태를 확인하겠습니다."
62
- [50] "이제 ChatGraph를 수정하여 ManualQuestionService를 통합합니다."
63
- ```
64
-
65
- → Claude가 다음 도구를 호출하기 전에 내뱉는 **전환 문장**. 단독 retrieval 가치 없음.
66
-
67
- ### 문제
68
- - 608개 (27%)가 50자 미만 전환 메시지 → 노이즈
69
- - min-length 150자 적용 시 **~53% (1,195개) 감소** 가능
70
-
71
- ---
72
-
73
- ## 3. user_prompt 분석
74
-
75
- ### 문제: import 시 필터 미적용
76
-
77
- ```
78
- [1] '1', '2', '3' ← 메뉴 번호 선택
79
- [2] 'go', 'go' ← 단순 실행 명령
80
- [2] '커밋', '커밋' ← 한글 단어 2자
81
- [2] '\x03\x03' ← Ctrl+C 입력 (!!!)
82
- ```
83
-
84
- - 188개가 15자 미만 쓰레기 입력
85
- - **원인**: 임포터가 shouldStorePrompt() 필터를 적용하지 않아 transcript의 모든 user 메시지 저장
86
- - Ctrl+C 입력까지 저장되는 것이 결정적 증거
87
-
88
- ---
89
-
90
- ## 전체 최적화 효과 예측
91
-
92
- | 대상 | 현재 | 감소량 | 방법 |
93
- |------|------|--------|------|
94
- | tool_obs / Read+Grep+Glob+ToolSearch | 3,927개 | -3,927 | blocklist |
95
- | tool_obs / Bash (empty output) | ~500개 | -500 | min-output-len |
96
- | tool_obs / Skill+EnterPlanMode | ~33개 | -33 | blocklist |
97
- | agent_response < 150자 | ~1,195개 | -1,195 | min-length |
98
- | user_prompt tiny (import) | 188개 | -188 | importer 필터 |
99
- | **합계** | **10,536개** | **약 -5,843개** | |
100
- | **결과** | | **→ 약 4,693개** | **-55% 감소** |
@@ -1,158 +0,0 @@
1
- # Plan: Selective Storage Filtering
2
-
3
- ## 구현 범위
4
-
5
- 3개 파일 수정, 스키마 변경 없음.
6
-
7
- ---
8
-
9
- ## Step 1. post-tool-use.ts — blocklist 확장 + output 필터
10
-
11
- ### 1-1. DEFAULT_CONFIG 업데이트
12
-
13
- ```ts
14
- const DEFAULT_CONFIG: Config['toolObservation'] = {
15
- enabled: true,
16
- excludedTools: [
17
- // 기존
18
- 'TodoWrite', 'TodoRead',
19
- // 추가: 재현 가능한 조회 도구
20
- 'Read', 'Grep', 'Glob',
21
- 'ToolSearch', 'WebFetch', 'WebSearch', 'NotebookRead',
22
- // 추가: 저가치 시스템 도구
23
- 'Skill', 'EnterPlanMode',
24
- ],
25
- minOutputLength: parseInt(process.env.CLAUDE_MEMORY_TOOL_MIN_OUTPUT_LEN || '100'),
26
- maxOutputLength: 10000,
27
- maxOutputLines: 100,
28
- storeOnlyOnSuccess: false
29
- };
30
- ```
31
-
32
- ### 1-2. 환경변수 오버라이드
33
-
34
- ```ts
35
- const envBlocklist = process.env.CLAUDE_MEMORY_TOOL_BLOCKLIST;
36
- if (envBlocklist) {
37
- config.excludedTools = envBlocklist.split(',').map(s => s.trim());
38
- }
39
- ```
40
-
41
- ### 1-3. ALWAYS_STORE 집합 + hasSignificantOutput 함수
42
-
43
- ```ts
44
- const ALWAYS_STORE_TOOLS = new Set([
45
- 'Write', 'Edit', 'MultiEdit', 'Agent', 'Task', 'ExitPlanMode'
46
- ]);
47
-
48
- function hasSignificantOutput(
49
- toolName: string,
50
- output: string,
51
- response: PostToolUseInput['tool_response'],
52
- minLen: number
53
- ): boolean {
54
- if (ALWAYS_STORE_TOOLS.has(toolName)) return true;
55
- if (response?.stderr && response.stderr.trim().length > 0) return true;
56
- return output.trim().length >= minLen;
57
- }
58
- ```
59
-
60
- ### 1-4. main() — step 4.5 위치에 output 필터 삽입
61
-
62
- ```ts
63
- // 기존 step 4 (success filter) 다음에 추가
64
- // 4.5. output-level 필터
65
- if (!hasSignificantOutput(
66
- input.tool_name, toolOutput, input.tool_response,
67
- config.minOutputLength ?? 100
68
- )) {
69
- console.log(JSON.stringify({}));
70
- return;
71
- }
72
- ```
73
-
74
- ---
75
-
76
- ## Step 2. stop.ts — agent_response min-length 필터
77
-
78
- ### 변경 위치: storeAgentResponse 루프 내
79
-
80
- ```ts
81
- const MIN_AGENT_RESPONSE_LEN = parseInt(
82
- process.env.CLAUDE_MEMORY_AGENT_RESPONSE_MIN_LEN || '150'
83
- );
84
-
85
- // Store each assistant response
86
- const lastIdx = assistantMessages.length - 1;
87
- for (let i = 0; i < assistantMessages.length; i++) {
88
- const text = assistantMessages[i];
89
- const isLast = i === lastIdx;
90
-
91
- // 마지막 메시지는 최종 답변일 수 있으므로 길이 무관 저장
92
- if (!isLast && text.trim().length < MIN_AGENT_RESPONSE_LEN) continue;
93
-
94
- // ... 기존 privacy filter, truncate, store 로직
95
- }
96
- ```
97
-
98
- ---
99
-
100
- ## Step 3. session-history-importer.ts — shouldStorePrompt 적용
101
-
102
- ### 변경 위치: user_prompt 저장 전
103
-
104
- ```ts
105
- // shouldStorePrompt와 동일한 로직 인라인 적용
106
- function isWorthStoringPrompt(content: string): boolean {
107
- const trimmed = content.trim();
108
- if (trimmed.startsWith('/')) return false;
109
- if (trimmed.length < 15) return false;
110
- if (!/[a-zA-Z가-힣]{2,}/.test(trimmed)) return false;
111
- return true;
112
- }
113
-
114
- // importer 루프 내 user role 메시지 처리 시:
115
- if (message.role === 'user') {
116
- const textContent = extractTextContent(message);
117
- if (!isWorthStoringPrompt(textContent)) continue; // 추가
118
- await service.storeUserPrompt(sessionId, textContent, ...);
119
- }
120
- ```
121
-
122
- > 참고: `shouldStorePrompt`를 `user-prompt-submit.ts`에서 공유 유틸로 추출하면
123
- > 중복 없이 재사용 가능. 단, 임포터만 수정하는 경우엔 인라인도 무방.
124
-
125
- ---
126
-
127
- ## 구현 순서
128
-
129
- 1. `src/hooks/post-tool-use.ts` 수정 (Step 1)
130
- 2. `src/hooks/stop.ts` 수정 (Step 2)
131
- 3. `src/services/session-history-importer.ts` 수정 (Step 3)
132
- 4. `npm run build`
133
- 5. 검증
134
-
135
- ---
136
-
137
- ## 리스크 및 대응
138
-
139
- | 리스크 | 대응 |
140
- |--------|------|
141
- | Read 결과가 필요한 경우 | agent_response에 내용이 반영됨. Read 자체보다 해석이 더 가치 있음 |
142
- | Grep 결과 패턴 필요 | user_prompt + agent_response에 충분한 맥락 있음 |
143
- | 짧은 agent_response가 중요한 경우 | 마지막 메시지 예외 처리로 커버 |
144
- | importer 소급 필터 없음 | 신규 import부터 적용, 기존 데이터 유지 |
145
- | 환경변수로 비활성화 가능 | `CLAUDE_MEMORY_TOOL_BLOCKLIST=""` 로 전체 허용 가능 |
146
-
147
- ---
148
-
149
- ## 검증 기준
150
-
151
- - `npm run build` 성공
152
- - Read/Grep/Glob 도구 사용 후 tool_observation 미생성 확인
153
- - Bash 에러 발생 시 tool_observation 생성 확인
154
- - Write/Edit 실행 시 tool_observation 생성 확인
155
- - 짧은 agent_response (< 150자) 저장 안 됨 확인
156
- - 마지막 agent_response는 길이 무관 저장 확인
157
- - import 시 '1', 'go', Ctrl+C 저장 안 됨 확인
158
- - dashboard stats tool_observation 비율 감소 추세 확인