a2a-memory 0.1.2 → 0.6.0

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 (191) hide show
  1. package/README.md +262 -45
  2. package/dist/adapters/anthropic.d.ts +69 -0
  3. package/dist/adapters/anthropic.d.ts.map +1 -0
  4. package/dist/adapters/anthropic.js +116 -0
  5. package/dist/adapters/anthropic.js.map +1 -0
  6. package/dist/claude/sync.d.ts +57 -0
  7. package/dist/claude/sync.d.ts.map +1 -0
  8. package/dist/claude/sync.js +201 -0
  9. package/dist/claude/sync.js.map +1 -0
  10. package/dist/cli/commands/add.d.ts +8 -0
  11. package/dist/cli/commands/add.d.ts.map +1 -0
  12. package/dist/cli/commands/add.js +45 -0
  13. package/dist/cli/commands/add.js.map +1 -0
  14. package/dist/cli/commands/claude-sync.d.ts +11 -0
  15. package/dist/cli/commands/claude-sync.d.ts.map +1 -0
  16. package/dist/cli/commands/claude-sync.js +69 -0
  17. package/dist/cli/commands/claude-sync.js.map +1 -0
  18. package/dist/cli/commands/cleanup.d.ts +8 -0
  19. package/dist/cli/commands/cleanup.d.ts.map +1 -0
  20. package/dist/cli/commands/cleanup.js +82 -0
  21. package/dist/cli/commands/cleanup.js.map +1 -0
  22. package/dist/cli/commands/edit.d.ts +8 -0
  23. package/dist/cli/commands/edit.d.ts.map +1 -0
  24. package/dist/cli/commands/edit.js +66 -0
  25. package/dist/cli/commands/edit.js.map +1 -0
  26. package/dist/cli/commands/embed.d.ts +8 -0
  27. package/dist/cli/commands/embed.d.ts.map +1 -0
  28. package/dist/cli/commands/embed.js +93 -0
  29. package/dist/cli/commands/embed.js.map +1 -0
  30. package/dist/cli/commands/health.d.ts +8 -0
  31. package/dist/cli/commands/health.d.ts.map +1 -0
  32. package/dist/cli/commands/health.js +108 -0
  33. package/dist/cli/commands/health.js.map +1 -0
  34. package/dist/cli/commands/rm.d.ts +8 -0
  35. package/dist/cli/commands/rm.d.ts.map +1 -0
  36. package/dist/cli/commands/rm.js +60 -0
  37. package/dist/cli/commands/rm.js.map +1 -0
  38. package/dist/cli/commands/sync.d.ts.map +1 -1
  39. package/dist/cli/commands/sync.js +52 -0
  40. package/dist/cli/commands/sync.js.map +1 -1
  41. package/dist/cli/commands/team.d.ts +7 -0
  42. package/dist/cli/commands/team.d.ts.map +1 -0
  43. package/dist/cli/commands/team.js +144 -0
  44. package/dist/cli/commands/team.js.map +1 -0
  45. package/dist/cli/index.d.ts +5 -0
  46. package/dist/cli/index.d.ts.map +1 -1
  47. package/dist/cli/index.js +44 -1
  48. package/dist/cli/index.js.map +1 -1
  49. package/dist/config/manager.d.ts +16 -0
  50. package/dist/config/manager.d.ts.map +1 -1
  51. package/dist/config/manager.js +170 -5
  52. package/dist/config/manager.js.map +1 -1
  53. package/dist/db/database.d.ts +28 -3
  54. package/dist/db/database.d.ts.map +1 -1
  55. package/dist/db/database.js +291 -64
  56. package/dist/db/database.js.map +1 -1
  57. package/dist/embedding/index.d.ts +21 -0
  58. package/dist/embedding/index.d.ts.map +1 -0
  59. package/dist/embedding/index.js +29 -0
  60. package/dist/embedding/index.js.map +1 -0
  61. package/dist/embedding/local-provider.d.ts +40 -0
  62. package/dist/embedding/local-provider.d.ts.map +1 -0
  63. package/dist/embedding/local-provider.js +157 -0
  64. package/dist/embedding/local-provider.js.map +1 -0
  65. package/dist/embedding/openai-provider.d.ts +31 -0
  66. package/dist/embedding/openai-provider.d.ts.map +1 -0
  67. package/dist/embedding/openai-provider.js +92 -0
  68. package/dist/embedding/openai-provider.js.map +1 -0
  69. package/dist/embedding/quantization.d.ts +34 -0
  70. package/dist/embedding/quantization.d.ts.map +1 -0
  71. package/dist/embedding/quantization.js +89 -0
  72. package/dist/embedding/quantization.js.map +1 -0
  73. package/dist/extraction/extractor.d.ts +11 -1
  74. package/dist/extraction/extractor.d.ts.map +1 -1
  75. package/dist/extraction/extractor.js +63 -20
  76. package/dist/extraction/extractor.js.map +1 -1
  77. package/dist/extraction/filter.d.ts.map +1 -1
  78. package/dist/extraction/filter.js +25 -3
  79. package/dist/extraction/filter.js.map +1 -1
  80. package/dist/extraction/scorer.d.ts +2 -0
  81. package/dist/extraction/scorer.d.ts.map +1 -1
  82. package/dist/extraction/scorer.js +23 -1
  83. package/dist/extraction/scorer.js.map +1 -1
  84. package/dist/extraction/similarity.d.ts +25 -0
  85. package/dist/extraction/similarity.d.ts.map +1 -0
  86. package/dist/extraction/similarity.js +85 -0
  87. package/dist/extraction/similarity.js.map +1 -0
  88. package/dist/hooks/post-tool-use.d.ts.map +1 -1
  89. package/dist/hooks/post-tool-use.js +88 -53
  90. package/dist/hooks/post-tool-use.js.map +1 -1
  91. package/dist/hooks/session-end.d.ts +1 -0
  92. package/dist/hooks/session-end.d.ts.map +1 -1
  93. package/dist/hooks/session-end.js +173 -33
  94. package/dist/hooks/session-end.js.map +1 -1
  95. package/dist/hooks/session-start.d.ts +2 -2
  96. package/dist/hooks/session-start.d.ts.map +1 -1
  97. package/dist/hooks/session-start.js +172 -22
  98. package/dist/hooks/session-start.js.map +1 -1
  99. package/dist/hooks/shared.d.ts +18 -0
  100. package/dist/hooks/shared.d.ts.map +1 -0
  101. package/dist/hooks/shared.js +46 -0
  102. package/dist/hooks/shared.js.map +1 -0
  103. package/dist/i18n/index.d.ts +3 -0
  104. package/dist/i18n/index.d.ts.map +1 -0
  105. package/dist/i18n/index.js +2 -0
  106. package/dist/i18n/index.js.map +1 -0
  107. package/dist/i18n/messages.d.ts +82 -0
  108. package/dist/i18n/messages.d.ts.map +1 -0
  109. package/dist/i18n/messages.js +150 -0
  110. package/dist/i18n/messages.js.map +1 -0
  111. package/dist/index.d.ts +25 -5
  112. package/dist/index.d.ts.map +1 -1
  113. package/dist/index.js +20 -3
  114. package/dist/index.js.map +1 -1
  115. package/dist/lifecycle/cleanup.d.ts +25 -0
  116. package/dist/lifecycle/cleanup.d.ts.map +1 -0
  117. package/dist/lifecycle/cleanup.js +52 -0
  118. package/dist/lifecycle/cleanup.js.map +1 -0
  119. package/dist/lifecycle/index.d.ts +15 -0
  120. package/dist/lifecycle/index.d.ts.map +1 -0
  121. package/dist/lifecycle/index.js +12 -0
  122. package/dist/lifecycle/index.js.map +1 -0
  123. package/dist/lifecycle/quality-scorer.d.ts +19 -0
  124. package/dist/lifecycle/quality-scorer.d.ts.map +1 -0
  125. package/dist/lifecycle/quality-scorer.js +40 -0
  126. package/dist/lifecycle/quality-scorer.js.map +1 -0
  127. package/dist/lifecycle/tiering.d.ts +50 -0
  128. package/dist/lifecycle/tiering.d.ts.map +1 -0
  129. package/dist/lifecycle/tiering.js +235 -0
  130. package/dist/lifecycle/tiering.js.map +1 -0
  131. package/dist/llm/client.d.ts +37 -0
  132. package/dist/llm/client.d.ts.map +1 -0
  133. package/dist/llm/client.js +154 -0
  134. package/dist/llm/client.js.map +1 -0
  135. package/dist/llm/index.d.ts +6 -0
  136. package/dist/llm/index.d.ts.map +1 -0
  137. package/dist/llm/index.js +5 -0
  138. package/dist/llm/index.js.map +1 -0
  139. package/dist/search/index.d.ts +8 -0
  140. package/dist/search/index.d.ts.map +1 -0
  141. package/dist/search/index.js +7 -0
  142. package/dist/search/index.js.map +1 -0
  143. package/dist/search/ranker.d.ts +30 -0
  144. package/dist/search/ranker.d.ts.map +1 -0
  145. package/dist/search/ranker.js +91 -0
  146. package/dist/search/ranker.js.map +1 -0
  147. package/dist/sync/client.d.ts +103 -0
  148. package/dist/sync/client.d.ts.map +1 -1
  149. package/dist/sync/client.js +186 -6
  150. package/dist/sync/client.js.map +1 -1
  151. package/dist/sync/encryption.d.ts +72 -0
  152. package/dist/sync/encryption.d.ts.map +1 -0
  153. package/dist/sync/encryption.js +203 -0
  154. package/dist/sync/encryption.js.map +1 -0
  155. package/dist/sync/index.d.ts +9 -0
  156. package/dist/sync/index.d.ts.map +1 -1
  157. package/dist/sync/index.js +6 -0
  158. package/dist/sync/index.js.map +1 -1
  159. package/dist/sync/queue.d.ts +49 -0
  160. package/dist/sync/queue.d.ts.map +1 -0
  161. package/dist/sync/queue.js +112 -0
  162. package/dist/sync/queue.js.map +1 -0
  163. package/dist/sync/scheduler.d.ts +69 -0
  164. package/dist/sync/scheduler.d.ts.map +1 -0
  165. package/dist/sync/scheduler.js +140 -0
  166. package/dist/sync/scheduler.js.map +1 -0
  167. package/dist/sync/synchronizer.d.ts +19 -5
  168. package/dist/sync/synchronizer.d.ts.map +1 -1
  169. package/dist/sync/synchronizer.js +128 -70
  170. package/dist/sync/synchronizer.js.map +1 -1
  171. package/dist/sync/team-synchronizer.d.ts +43 -0
  172. package/dist/sync/team-synchronizer.d.ts.map +1 -0
  173. package/dist/sync/team-synchronizer.js +126 -0
  174. package/dist/sync/team-synchronizer.js.map +1 -0
  175. package/dist/sync/vector-clock.d.ts +23 -0
  176. package/dist/sync/vector-clock.d.ts.map +1 -0
  177. package/dist/sync/vector-clock.js +40 -0
  178. package/dist/sync/vector-clock.js.map +1 -0
  179. package/dist/types/index.d.ts +74 -2
  180. package/dist/types/index.d.ts.map +1 -1
  181. package/dist/types/index.js +56 -4
  182. package/dist/types/index.js.map +1 -1
  183. package/dist/utils/keychain.d.ts +50 -0
  184. package/dist/utils/keychain.d.ts.map +1 -0
  185. package/dist/utils/keychain.js +166 -0
  186. package/dist/utils/keychain.js.map +1 -0
  187. package/dist/utils/logger.d.ts +16 -0
  188. package/dist/utils/logger.d.ts.map +1 -0
  189. package/dist/utils/logger.js +118 -0
  190. package/dist/utils/logger.js.map +1 -0
  191. package/package.json +1 -1
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Memory Tiering Engine
3
+ *
4
+ * 메모리 접근 패턴 기반 티어링 시스템:
5
+ * - hot: 최근 hotThresholdDays 이내 접근 OR tier='core'
6
+ * - warm: 최근 warmThresholdDays 이내 접근 OR tier='active'
7
+ * - cold: 나머지 (오래된 메모리)
8
+ *
9
+ * Cold 메모리는 zlib 압축으로 저장 공간 절약.
10
+ */
11
+ import type { Memory, TieringConfig, TieringResult, StorageTier } from '../types/index.js';
12
+ import type { MemoryDatabase } from '../db/database.js';
13
+ /**
14
+ * 메모리 접근 패턴 기반 티어 결정
15
+ *
16
+ * 규칙:
17
+ * - tier='working' (core) → 항상 hot (강등 불가)
18
+ * - tier='episodic' (active) → 접근 시간과 관계없이 warm 이상
19
+ * - 나머지: lastAccessedAt 기준 hot/warm/cold 분류
20
+ *
21
+ * @param memory - 메모리 객체
22
+ * @param config - 티어링 설정
23
+ * @returns 결정된 storage tier
24
+ */
25
+ export declare function determineTier(memory: Memory, config: TieringConfig): StorageTier;
26
+ /**
27
+ * 전체 메모리 티어 재계산 및 재배치
28
+ *
29
+ * 1. 모든 메모리의 적절한 티어 결정
30
+ * 2. 현재 티어와 비교하여 승격/강등 카운트
31
+ * 3. cold 티어 메모리 압축 (설정 활성화 시)
32
+ * 4. DB 업데이트
33
+ *
34
+ * @param db - 메모리 데이터베이스
35
+ * @param config - 티어링 설정
36
+ * @returns 티어링 결과 (승격/강등/압축 수)
37
+ */
38
+ export declare function rebalanceTiers(db: MemoryDatabase, config: TieringConfig): TieringResult;
39
+ /**
40
+ * 메모리 접근 시 자동 승격
41
+ *
42
+ * autoPromote 설정이 활성화되어 있고,
43
+ * 현재 cold/warm 티어인 메모리를 hot으로 승격합니다.
44
+ *
45
+ * @param db - 메모리 데이터베이스
46
+ * @param memoryId - 메모리 ID
47
+ * @param config - 티어링 설정
48
+ */
49
+ export declare function promoteOnAccess(db: MemoryDatabase, memoryId: string, config: TieringConfig): void;
50
+ //# sourceMappingURL=tiering.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiering.d.ts","sourceRoot":"","sources":["../../src/lifecycle/tiering.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAIxD;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,WAAW,CAwChF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,GAAG,aAAa,CAgEvF;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,cAAc,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,aAAa,GACpB,IAAI,CAuBN"}
@@ -0,0 +1,235 @@
1
+ /**
2
+ * Memory Tiering Engine
3
+ *
4
+ * 메모리 접근 패턴 기반 티어링 시스템:
5
+ * - hot: 최근 hotThresholdDays 이내 접근 OR tier='core'
6
+ * - warm: 최근 warmThresholdDays 이내 접근 OR tier='active'
7
+ * - cold: 나머지 (오래된 메모리)
8
+ *
9
+ * Cold 메모리는 zlib 압축으로 저장 공간 절약.
10
+ */
11
+ import { gzipSync, gunzipSync } from 'node:zlib';
12
+ const COMPRESSED_PREFIX = 'COMPRESSED:';
13
+ /**
14
+ * 메모리 접근 패턴 기반 티어 결정
15
+ *
16
+ * 규칙:
17
+ * - tier='working' (core) → 항상 hot (강등 불가)
18
+ * - tier='episodic' (active) → 접근 시간과 관계없이 warm 이상
19
+ * - 나머지: lastAccessedAt 기준 hot/warm/cold 분류
20
+ *
21
+ * @param memory - 메모리 객체
22
+ * @param config - 티어링 설정
23
+ * @returns 결정된 storage tier
24
+ */
25
+ export function determineTier(memory, config) {
26
+ // core 티어는 항상 hot
27
+ if (memory.tier === 'working') {
28
+ return 'hot';
29
+ }
30
+ // episodic 티어는 최소 warm 보장 (접근 시간 무관)
31
+ if (memory.tier === 'episodic') {
32
+ // 단, 접근 기록이 있으면 hot 승격 가능
33
+ if (memory.lastAccessedAt) {
34
+ const daysSinceAccess = getDaysSince(memory.lastAccessedAt);
35
+ if (daysSinceAccess <= config.hotThresholdDays) {
36
+ return 'hot';
37
+ }
38
+ }
39
+ return 'warm';
40
+ }
41
+ // semantic 티어: 접근 패턴 기반
42
+ if (!memory.lastAccessedAt) {
43
+ // 접근 기록 없음 → createdAt 기준
44
+ const daysSinceCreation = getDaysSince(memory.createdAt);
45
+ if (daysSinceCreation <= config.hotThresholdDays) {
46
+ return 'hot';
47
+ }
48
+ if (daysSinceCreation <= config.warmThresholdDays) {
49
+ return 'warm';
50
+ }
51
+ return 'cold';
52
+ }
53
+ const daysSinceAccess = getDaysSince(memory.lastAccessedAt);
54
+ if (daysSinceAccess <= config.hotThresholdDays) {
55
+ return 'hot';
56
+ }
57
+ if (daysSinceAccess <= config.warmThresholdDays) {
58
+ return 'warm';
59
+ }
60
+ return 'cold';
61
+ }
62
+ /**
63
+ * 전체 메모리 티어 재계산 및 재배치
64
+ *
65
+ * 1. 모든 메모리의 적절한 티어 결정
66
+ * 2. 현재 티어와 비교하여 승격/강등 카운트
67
+ * 3. cold 티어 메모리 압축 (설정 활성화 시)
68
+ * 4. DB 업데이트
69
+ *
70
+ * @param db - 메모리 데이터베이스
71
+ * @param config - 티어링 설정
72
+ * @returns 티어링 결과 (승격/강등/압축 수)
73
+ */
74
+ export function rebalanceTiers(db, config) {
75
+ if (!config.enabled) {
76
+ return { promoted: 0, demoted: 0, compressed: 0, totalProcessed: 0 };
77
+ }
78
+ const allMemories = db.listMemories({ limit: 999999 });
79
+ let promoted = 0;
80
+ let demoted = 0;
81
+ let compressed = 0;
82
+ for (const memory of allMemories) {
83
+ const currentTier = getStorageTier(memory);
84
+ const targetTier = determineTier(memory, config);
85
+ // 티어 변경 필요 여부 확인
86
+ if (currentTier === targetTier) {
87
+ // 티어 변경 없음, 압축 상태만 확인
88
+ if (targetTier === 'cold' && config.coldCompressionEnabled) {
89
+ if (!isCompressed(memory.content)) {
90
+ const compressedContent = compressContent(memory.content);
91
+ db.updateMemory(memory.id, { content: compressedContent });
92
+ compressed++;
93
+ }
94
+ }
95
+ continue;
96
+ }
97
+ // 티어 변경 필요
98
+ const tierRank = { hot: 2, warm: 1, cold: 0 };
99
+ if (tierRank[targetTier] > tierRank[currentTier]) {
100
+ promoted++;
101
+ }
102
+ else {
103
+ demoted++;
104
+ }
105
+ // content 압축/해제 처리
106
+ let newContent = memory.content;
107
+ if (targetTier === 'cold' && config.coldCompressionEnabled) {
108
+ // cold로 강등 → 압축
109
+ if (!isCompressed(memory.content)) {
110
+ newContent = compressContent(memory.content);
111
+ compressed++;
112
+ }
113
+ }
114
+ else if (currentTier === 'cold' && isCompressed(memory.content)) {
115
+ // cold에서 승격 → 압축 해제
116
+ newContent = decompressContent(memory.content);
117
+ }
118
+ // 메타데이터 업데이트 (storage tier는 메타데이터로 추적)
119
+ // Memory.tier는 semantic tier이므로 변경하지 않음
120
+ // storage tier는 별도 필드나 tags로 관리 필요
121
+ // 현재 구현에서는 content만 압축/해제 처리
122
+ if (newContent !== memory.content) {
123
+ db.updateMemory(memory.id, { content: newContent });
124
+ }
125
+ }
126
+ return {
127
+ promoted,
128
+ demoted,
129
+ compressed,
130
+ totalProcessed: allMemories.length,
131
+ };
132
+ }
133
+ /**
134
+ * 메모리 접근 시 자동 승격
135
+ *
136
+ * autoPromote 설정이 활성화되어 있고,
137
+ * 현재 cold/warm 티어인 메모리를 hot으로 승격합니다.
138
+ *
139
+ * @param db - 메모리 데이터베이스
140
+ * @param memoryId - 메모리 ID
141
+ * @param config - 티어링 설정
142
+ */
143
+ export function promoteOnAccess(db, memoryId, config) {
144
+ if (!config.enabled || !config.autoPromote) {
145
+ return;
146
+ }
147
+ // DB에서 조회하지 않고, 이미 조회된 메모리를 받아 처리하는 것이 효율적이지만
148
+ // 현재 API 구조상 id만 받으므로 재조회 필요
149
+ const memory = db.getMemory(memoryId);
150
+ if (!memory) {
151
+ return;
152
+ }
153
+ const currentTier = getStorageTier(memory);
154
+ const targetTier = determineTier(memory, config);
155
+ // hot으로 승격 필요한 경우
156
+ if (targetTier === 'hot' && currentTier !== 'hot') {
157
+ // 압축 해제
158
+ if (isCompressed(memory.content)) {
159
+ const decompressedContent = decompressContent(memory.content);
160
+ db.updateMemory(memoryId, { content: decompressedContent });
161
+ }
162
+ }
163
+ }
164
+ // ============================
165
+ // Helper Functions
166
+ // ============================
167
+ /**
168
+ * 메모리의 현재 storage tier 추정
169
+ * (실제로는 별도 필드가 필요하지만, 현재는 압축 여부로 판단)
170
+ */
171
+ function getStorageTier(memory) {
172
+ // core는 항상 hot
173
+ if (memory.tier === 'working') {
174
+ return 'hot';
175
+ }
176
+ // 압축되어 있으면 cold
177
+ if (isCompressed(memory.content)) {
178
+ return 'cold';
179
+ }
180
+ // episodic은 기본 warm
181
+ if (memory.tier === 'episodic') {
182
+ return 'warm';
183
+ }
184
+ // semantic은 접근 패턴 기반 추정
185
+ if (!memory.lastAccessedAt) {
186
+ const daysSinceCreation = getDaysSince(memory.createdAt);
187
+ if (daysSinceCreation <= 7)
188
+ return 'hot';
189
+ if (daysSinceCreation <= 30)
190
+ return 'warm';
191
+ return 'cold';
192
+ }
193
+ const daysSinceAccess = getDaysSince(memory.lastAccessedAt);
194
+ if (daysSinceAccess <= 7)
195
+ return 'hot';
196
+ if (daysSinceAccess <= 30)
197
+ return 'warm';
198
+ return 'cold';
199
+ }
200
+ /**
201
+ * ISO 8601 문자열에서 현재까지의 일수 계산
202
+ */
203
+ function getDaysSince(isoDate) {
204
+ const date = new Date(isoDate);
205
+ const now = new Date();
206
+ const diffMs = now.getTime() - date.getTime();
207
+ return Math.floor(diffMs / (1000 * 60 * 60 * 24));
208
+ }
209
+ /**
210
+ * content가 압축되어 있는지 확인
211
+ */
212
+ function isCompressed(content) {
213
+ return content.startsWith(COMPRESSED_PREFIX);
214
+ }
215
+ /**
216
+ * content 압축 (zlib gzip)
217
+ */
218
+ function compressContent(content) {
219
+ const buffer = Buffer.from(content, 'utf-8');
220
+ const compressed = gzipSync(buffer);
221
+ return COMPRESSED_PREFIX + compressed.toString('base64');
222
+ }
223
+ /**
224
+ * content 압축 해제
225
+ */
226
+ function decompressContent(content) {
227
+ if (!isCompressed(content)) {
228
+ return content;
229
+ }
230
+ const base64Data = content.slice(COMPRESSED_PREFIX.length);
231
+ const compressed = Buffer.from(base64Data, 'base64');
232
+ const decompressed = gunzipSync(compressed);
233
+ return decompressed.toString('utf-8');
234
+ }
235
+ //# sourceMappingURL=tiering.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiering.js","sourceRoot":"","sources":["../../src/lifecycle/tiering.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * LLM Client — AI 기반 분류/요약
3
+ * npm 의존성 없음, native fetch 사용
4
+ */
5
+ import type { LLMConfig } from '../types/index.js';
6
+ export interface LLMClient {
7
+ complete(prompt: string, systemPrompt?: string): Promise<string>;
8
+ summarize(contents: string[]): Promise<string>;
9
+ classify(content: string, categories: string[]): Promise<string>;
10
+ }
11
+ export declare class OpenAILLMClient implements LLMClient {
12
+ private apiKey;
13
+ private model;
14
+ private maxTokens;
15
+ private timeout;
16
+ constructor(config: LLMConfig);
17
+ complete(prompt: string, systemPrompt?: string): Promise<string>;
18
+ summarize(contents: string[]): Promise<string>;
19
+ classify(content: string, categories: string[]): Promise<string>;
20
+ }
21
+ export declare class AnthropicLLMClient implements LLMClient {
22
+ private apiKey;
23
+ private model;
24
+ private maxTokens;
25
+ private timeout;
26
+ constructor(config: LLMConfig);
27
+ complete(prompt: string, systemPrompt?: string): Promise<string>;
28
+ summarize(contents: string[]): Promise<string>;
29
+ classify(content: string, categories: string[]): Promise<string>;
30
+ }
31
+ export declare class NoOpLLMClient implements LLMClient {
32
+ complete(): Promise<string>;
33
+ summarize(): Promise<string>;
34
+ classify(_content: string, categories: string[]): Promise<string>;
35
+ }
36
+ export declare function createLLMClient(config?: LLMConfig): LLMClient;
37
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/llm/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjE,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAClE;AAED,qBAAa,eAAgB,YAAW,SAAS;IAC/C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,SAAS;IAQvB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA6ChE,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAQ9C,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;CAUvE;AAED,qBAAa,kBAAmB,YAAW,SAAS;IAClD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,SAAS;IAQvB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA4ChE,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAQ9C,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;CAUvE;AAED,qBAAa,aAAc,YAAW,SAAS;IACvC,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;IAG3B,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IAG5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;CAGxE;AAED,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,CAa7D"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * LLM Client — AI 기반 분류/요약
3
+ * npm 의존성 없음, native fetch 사용
4
+ */
5
+ export class OpenAILLMClient {
6
+ apiKey;
7
+ model;
8
+ maxTokens;
9
+ timeout;
10
+ constructor(config) {
11
+ if (!config.apiKey)
12
+ throw new Error('OpenAI API key is required');
13
+ this.apiKey = config.apiKey;
14
+ this.model = config.model ?? 'gpt-4o-mini';
15
+ this.maxTokens = config.maxTokens ?? 500;
16
+ this.timeout = 10000;
17
+ }
18
+ async complete(prompt, systemPrompt) {
19
+ const messages = [];
20
+ if (systemPrompt) {
21
+ messages.push({ role: 'system', content: systemPrompt });
22
+ }
23
+ messages.push({ role: 'user', content: prompt });
24
+ const controller = new AbortController();
25
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
26
+ try {
27
+ const response = await fetch('https://api.openai.com/v1/chat/completions', {
28
+ method: 'POST',
29
+ headers: {
30
+ 'Content-Type': 'application/json',
31
+ 'Authorization': `Bearer ${this.apiKey}`,
32
+ },
33
+ body: JSON.stringify({
34
+ model: this.model,
35
+ messages,
36
+ max_tokens: this.maxTokens,
37
+ temperature: 0.3,
38
+ }),
39
+ signal: controller.signal,
40
+ });
41
+ clearTimeout(timeoutId);
42
+ if (!response.ok) {
43
+ throw new Error(`OpenAI API error: ${response.status}`);
44
+ }
45
+ const data = await response.json();
46
+ return data.choices[0]?.message?.content?.trim() ?? '';
47
+ }
48
+ catch (error) {
49
+ clearTimeout(timeoutId);
50
+ if (error instanceof Error && error.name === 'AbortError') {
51
+ throw new Error('LLM request timeout (10s)');
52
+ }
53
+ throw error;
54
+ }
55
+ }
56
+ async summarize(contents) {
57
+ const joined = contents.join('\n---\n').slice(0, 4000);
58
+ return this.complete(`Summarize the following development session contents in 2-3 concise sentences:\n\n${joined}`, 'You are a technical summarizer. Be concise and focus on key decisions, errors solved, and patterns used.');
59
+ }
60
+ async classify(content, categories) {
61
+ const categoryList = categories.join(', ');
62
+ const result = await this.complete(`Classify the following content into exactly one of these categories: ${categoryList}\n\nContent:\n${content.slice(0, 2000)}\n\nRespond with ONLY the category name, nothing else.`, 'You are a content classifier. Respond with only the category name.');
63
+ const cleaned = result.toLowerCase().trim();
64
+ const match = categories.find((c) => c.toLowerCase() === cleaned);
65
+ return match ?? categories[categories.length - 1];
66
+ }
67
+ }
68
+ export class AnthropicLLMClient {
69
+ apiKey;
70
+ model;
71
+ maxTokens;
72
+ timeout;
73
+ constructor(config) {
74
+ if (!config.apiKey)
75
+ throw new Error('Anthropic API key is required');
76
+ this.apiKey = config.apiKey;
77
+ this.model = config.model ?? 'claude-sonnet-4-5-20250929';
78
+ this.maxTokens = config.maxTokens ?? 500;
79
+ this.timeout = 10000;
80
+ }
81
+ async complete(prompt, systemPrompt) {
82
+ const controller = new AbortController();
83
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
84
+ try {
85
+ const body = {
86
+ model: this.model,
87
+ max_tokens: this.maxTokens,
88
+ messages: [{ role: 'user', content: prompt }],
89
+ };
90
+ if (systemPrompt) {
91
+ body.system = systemPrompt;
92
+ }
93
+ const response = await fetch('https://api.anthropic.com/v1/messages', {
94
+ method: 'POST',
95
+ headers: {
96
+ 'Content-Type': 'application/json',
97
+ 'x-api-key': this.apiKey,
98
+ 'anthropic-version': '2023-06-01',
99
+ },
100
+ body: JSON.stringify(body),
101
+ signal: controller.signal,
102
+ });
103
+ clearTimeout(timeoutId);
104
+ if (!response.ok) {
105
+ throw new Error(`Anthropic API error: ${response.status}`);
106
+ }
107
+ const data = await response.json();
108
+ return data.content[0]?.text?.trim() ?? '';
109
+ }
110
+ catch (error) {
111
+ clearTimeout(timeoutId);
112
+ if (error instanceof Error && error.name === 'AbortError') {
113
+ throw new Error('LLM request timeout (10s)');
114
+ }
115
+ throw error;
116
+ }
117
+ }
118
+ async summarize(contents) {
119
+ const joined = contents.join('\n---\n').slice(0, 4000);
120
+ return this.complete(`Summarize the following development session contents in 2-3 concise sentences:\n\n${joined}`, 'You are a technical summarizer. Be concise and focus on key decisions, errors solved, and patterns used.');
121
+ }
122
+ async classify(content, categories) {
123
+ const categoryList = categories.join(', ');
124
+ const result = await this.complete(`Classify the following content into exactly one of these categories: ${categoryList}\n\nContent:\n${content.slice(0, 2000)}\n\nRespond with ONLY the category name, nothing else.`, 'You are a content classifier. Respond with only the category name.');
125
+ const cleaned = result.toLowerCase().trim();
126
+ const match = categories.find((c) => c.toLowerCase() === cleaned);
127
+ return match ?? categories[categories.length - 1];
128
+ }
129
+ }
130
+ export class NoOpLLMClient {
131
+ async complete() {
132
+ return '';
133
+ }
134
+ async summarize() {
135
+ return '';
136
+ }
137
+ async classify(_content, categories) {
138
+ return categories[categories.length - 1];
139
+ }
140
+ }
141
+ export function createLLMClient(config) {
142
+ if (!config || !config.enabled || config.provider === 'none') {
143
+ return new NoOpLLMClient();
144
+ }
145
+ switch (config.provider) {
146
+ case 'openai':
147
+ return new OpenAILLMClient(config);
148
+ case 'anthropic':
149
+ return new AnthropicLLMClient(config);
150
+ default:
151
+ return new NoOpLLMClient();
152
+ }
153
+ }
154
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/llm/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * LLM Module - AI Classification & Summarization
3
+ */
4
+ export { createLLMClient, OpenAILLMClient, AnthropicLLMClient, NoOpLLMClient, } from './client.js';
5
+ export type { LLMClient } from './client.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * LLM Module - AI Classification & Summarization
3
+ */
4
+ export { createLLMClient, OpenAILLMClient, AnthropicLLMClient, NoOpLLMClient, } from './client.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,aAAa,GACd,MAAM,aAAa,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Search Module
3
+ *
4
+ * 하이브리드 검색 (FTS + Vector + Recency) 통합 모듈.
5
+ */
6
+ export { HybridRanker } from './ranker.js';
7
+ export type { RankedResult } from './ranker.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/search/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Search Module
3
+ *
4
+ * 하이브리드 검색 (FTS + Vector + Recency) 통합 모듈.
5
+ */
6
+ export { HybridRanker } from './ranker.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/search/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Reciprocal Rank Fusion (RRF) 기반 하이브리드 검색
3
+ *
4
+ * FTS, Vector, Recency 결과를 통합하여 최적의 검색 결과 제공.
5
+ */
6
+ import type { Memory, MemorySearchResult } from '../types/index.js';
7
+ export interface RankedResult {
8
+ memory: Memory;
9
+ score: number;
10
+ sources: Array<{
11
+ type: 'fts' | 'vector' | 'recency';
12
+ rank: number;
13
+ }>;
14
+ }
15
+ /**
16
+ * RRF (Reciprocal Rank Fusion) 기반 하이브리드 랭커
17
+ *
18
+ * RRF 공식: score = sum(1 / (k + rank_i)) for each source
19
+ * - k: RRF 파라미터 (기본: 60) - 낮을수록 상위 순위에 더 높은 가중치
20
+ * - rank: 각 소스에서의 순위 (1부터 시작)
21
+ */
22
+ export declare class HybridRanker {
23
+ private k;
24
+ constructor(k?: number);
25
+ /**
26
+ * FTS + Vector + Recency 결과를 RRF로 통합
27
+ */
28
+ rank(ftsResults: MemorySearchResult[], vectorResults: MemorySearchResult[], recencyResults?: Memory[]): RankedResult[];
29
+ }
30
+ //# sourceMappingURL=ranker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ranker.d.ts","sourceRoot":"","sources":["../../src/search/ranker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEpE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtE;AAED;;;;;;GAMG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,CAAC,CAAS;gBAEN,CAAC,GAAE,MAAW;IAI1B;;OAEG;IACH,IAAI,CACF,UAAU,EAAE,kBAAkB,EAAE,EAChC,aAAa,EAAE,kBAAkB,EAAE,EACnC,cAAc,CAAC,EAAE,MAAM,EAAE,GACxB,YAAY,EAAE;CA0ElB"}