claude-brain 0.14.2 → 0.14.4
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 +191 -191
- package/VERSION +1 -1
- package/assets/CLAUDE-unified.md +11 -11
- package/assets/CLAUDE.md +11 -11
- package/bunfig.toml +8 -8
- package/package.json +80 -80
- package/packs/backend/node.json +173 -173
- package/packs/core/javascript.json +176 -176
- package/packs/core/typescript.json +222 -222
- package/packs/frontend/react.json +254 -254
- package/packs/meta/testing.json +172 -172
- package/src/automation/auto-context.ts +240 -240
- package/src/automation/decision-detector.ts +452 -452
- package/src/automation/index.ts +11 -11
- package/src/automation/phase12-manager.ts +456 -456
- package/src/automation/proactive-recall.ts +373 -373
- package/src/automation/project-detector.ts +310 -310
- package/src/automation/repo-scanner.ts +205 -205
- package/src/cli/auto-setup.ts +82 -82
- package/src/cli/bin.ts +202 -202
- package/src/cli/commands/chroma.ts +573 -573
- package/src/cli/commands/git-hook.ts +189 -189
- package/src/cli/commands/hooks.ts +213 -213
- package/src/cli/commands/init.ts +122 -122
- package/src/cli/commands/install-mcp.ts +92 -92
- package/src/cli/commands/pack.ts +197 -197
- package/src/cli/commands/serve.ts +167 -167
- package/src/cli/commands/start.ts +42 -42
- package/src/cli/commands/uninstall-mcp.ts +41 -41
- package/src/cli/commands/update.ts +121 -121
- package/src/cli/diagnose.ts +4 -4
- package/src/cli/health-check.ts +4 -4
- package/src/cli/migrate-chroma.ts +106 -106
- package/src/cli/setup.ts +4 -4
- package/src/cli/ui/animations.ts +80 -80
- package/src/cli/ui/components.ts +82 -82
- package/src/cli/ui/index.ts +4 -4
- package/src/cli/ui/logo.ts +36 -36
- package/src/cli/ui/theme.ts +55 -55
- package/src/config/defaults.ts +50 -50
- package/src/config/home.ts +55 -55
- package/src/config/index.ts +7 -7
- package/src/config/loader.ts +166 -166
- package/src/config/migration.ts +76 -76
- package/src/config/schema.ts +360 -360
- package/src/config/validator.ts +184 -184
- package/src/config/watcher.ts +86 -86
- package/src/context/assembler.ts +398 -398
- package/src/context/cache-manager.ts +101 -101
- package/src/context/formatter.ts +84 -84
- package/src/context/hierarchy.ts +85 -85
- package/src/context/index.ts +83 -83
- package/src/context/progress-tracker.ts +174 -174
- package/src/context/standards-manager.ts +287 -287
- package/src/context/types.ts +252 -252
- package/src/context/validator.ts +58 -58
- package/src/diagnostics/index.ts +123 -123
- package/src/health/index.ts +229 -229
- package/src/hooks/brain-hook.ts +112 -112
- package/src/hooks/capture.ts +168 -168
- package/src/hooks/deduplicator.ts +72 -72
- package/src/hooks/git-capture.ts +109 -109
- package/src/hooks/git-hook-installer.ts +207 -207
- package/src/hooks/index.ts +20 -20
- package/src/hooks/installer.ts +191 -194
- package/src/hooks/passive-classifier.ts +366 -366
- package/src/hooks/queue.ts +129 -129
- package/src/hooks/session-tracker.ts +275 -275
- package/src/hooks/types.ts +47 -47
- package/src/index.ts +7 -7
- package/src/intelligence/cross-project/affinity.ts +162 -162
- package/src/intelligence/cross-project/generalizer.ts +283 -283
- package/src/intelligence/cross-project/index.ts +13 -13
- package/src/intelligence/cross-project/transfer.ts +201 -201
- package/src/intelligence/index.ts +24 -24
- package/src/intelligence/optimization/index.ts +10 -10
- package/src/intelligence/optimization/precompute.ts +202 -202
- package/src/intelligence/optimization/semantic-cache.ts +207 -207
- package/src/intelligence/prediction/context-anticipator.ts +198 -198
- package/src/intelligence/prediction/decision-predictor.ts +184 -184
- package/src/intelligence/prediction/index.ts +13 -13
- package/src/intelligence/prediction/recommender.ts +268 -268
- package/src/intelligence/reasoning/chain-retrieval.ts +247 -247
- package/src/intelligence/reasoning/counterfactual.ts +248 -248
- package/src/intelligence/reasoning/index.ts +13 -13
- package/src/intelligence/reasoning/synthesizer.ts +169 -169
- package/src/intelligence/temporal/evolution.ts +197 -197
- package/src/intelligence/temporal/index.ts +16 -16
- package/src/intelligence/temporal/query-processor.ts +190 -190
- package/src/intelligence/temporal/timeline.ts +259 -259
- package/src/intelligence/temporal/trends.ts +263 -263
- package/src/knowledge/entity-extractor.ts +416 -416
- package/src/knowledge/graph/builder.ts +185 -185
- package/src/knowledge/graph/linker.ts +201 -201
- package/src/knowledge/graph/memory-graph.ts +359 -359
- package/src/knowledge/graph/schema.ts +99 -99
- package/src/knowledge/graph/search.ts +168 -168
- package/src/knowledge/relationship-extractor.ts +108 -108
- package/src/memory/chroma/client.ts +174 -174
- package/src/memory/chroma/collection-manager.ts +94 -94
- package/src/memory/chroma/config.ts +57 -57
- package/src/memory/chroma/embeddings.ts +153 -153
- package/src/memory/chroma/index.ts +82 -82
- package/src/memory/chroma/migration.ts +270 -270
- package/src/memory/chroma/schemas.ts +69 -69
- package/src/memory/chroma/search.ts +315 -315
- package/src/memory/chroma/store.ts +741 -741
- package/src/memory/consolidation/archiver.ts +164 -164
- package/src/memory/consolidation/merger.ts +186 -186
- package/src/memory/consolidation/scorer.ts +138 -138
- package/src/memory/context-builder.ts +236 -236
- package/src/memory/database.ts +169 -169
- package/src/memory/embedding-utils.ts +156 -156
- package/src/memory/embeddings.ts +226 -226
- package/src/memory/episodic/detector.ts +108 -108
- package/src/memory/episodic/manager.ts +351 -351
- package/src/memory/episodic/summarizer.ts +179 -179
- package/src/memory/episodic/types.ts +52 -52
- package/src/memory/index.ts +582 -582
- package/src/memory/knowledge-extractor.ts +455 -455
- package/src/memory/learning.ts +378 -378
- package/src/memory/patterns.ts +396 -396
- package/src/memory/schema.ts +88 -88
- package/src/memory/search.ts +309 -309
- package/src/memory/store.ts +787 -787
- package/src/memory/types.ts +121 -121
- package/src/orchestrator/coordinator.ts +272 -272
- package/src/orchestrator/decision-logger.ts +228 -228
- package/src/orchestrator/event-emitter.ts +198 -198
- package/src/orchestrator/event-queue.ts +184 -184
- package/src/orchestrator/handlers/base-handler.ts +70 -70
- package/src/orchestrator/handlers/context-handler.ts +73 -73
- package/src/orchestrator/handlers/decision-handler.ts +204 -204
- package/src/orchestrator/handlers/index.ts +10 -10
- package/src/orchestrator/handlers/status-handler.ts +131 -131
- package/src/orchestrator/handlers/task-handler.ts +171 -171
- package/src/orchestrator/index.ts +275 -275
- package/src/orchestrator/task-parser.ts +284 -284
- package/src/orchestrator/types.ts +98 -98
- package/src/packs/index.ts +9 -9
- package/src/packs/loader.ts +134 -134
- package/src/packs/manager.ts +204 -204
- package/src/packs/ranker.ts +78 -78
- package/src/packs/types.ts +81 -81
- package/src/phase12/index.ts +5 -5
- package/src/retrieval/bm25/index.ts +300 -300
- package/src/retrieval/bm25/tokenizer.ts +184 -184
- package/src/retrieval/feedback/adaptive.ts +223 -223
- package/src/retrieval/feedback/index.ts +16 -16
- package/src/retrieval/feedback/metrics.ts +223 -223
- package/src/retrieval/feedback/store.ts +283 -283
- package/src/retrieval/fusion/index.ts +194 -194
- package/src/retrieval/fusion/rrf.ts +163 -163
- package/src/retrieval/index.ts +12 -12
- package/src/retrieval/pipeline.ts +375 -375
- package/src/retrieval/query/expander.ts +198 -198
- package/src/retrieval/query/index.ts +27 -27
- package/src/retrieval/query/intent-classifier.ts +236 -236
- package/src/retrieval/query/temporal-parser.ts +295 -295
- package/src/retrieval/reranker/index.ts +188 -188
- package/src/retrieval/reranker/model.ts +95 -95
- package/src/retrieval/service.ts +125 -125
- package/src/retrieval/types.ts +162 -162
- package/src/routing/entity-extractor.ts +428 -428
- package/src/routing/intent-classifier.ts +436 -436
- package/src/routing/response-filter.ts +258 -254
- package/src/routing/router.ts +1322 -1314
- package/src/routing/search-engine.ts +475 -475
- package/src/routing/types.ts +94 -84
- package/src/scripts/health-check.ts +118 -118
- package/src/scripts/setup.ts +122 -122
- package/src/server/handlers/call-tool.ts +156 -156
- package/src/server/handlers/index.ts +9 -9
- package/src/server/handlers/list-tools.ts +35 -35
- package/src/server/handlers/tools/analyze-decision-evolution.ts +151 -151
- package/src/server/handlers/tools/auto-remember.ts +200 -200
- package/src/server/handlers/tools/brain.ts +85 -85
- package/src/server/handlers/tools/create-project.ts +135 -135
- package/src/server/handlers/tools/detect-trends.ts +144 -144
- package/src/server/handlers/tools/find-cross-project-patterns.ts +168 -168
- package/src/server/handlers/tools/get-activity-log.ts +194 -194
- package/src/server/handlers/tools/get-code-standards.ts +124 -124
- package/src/server/handlers/tools/get-corrections.ts +154 -154
- package/src/server/handlers/tools/get-decision-timeline.ts +172 -172
- package/src/server/handlers/tools/get-episode.ts +103 -103
- package/src/server/handlers/tools/get-patterns.ts +158 -158
- package/src/server/handlers/tools/get-phase12-status.ts +63 -63
- package/src/server/handlers/tools/get-project-context.ts +75 -75
- package/src/server/handlers/tools/get-recommendations.ts +145 -145
- package/src/server/handlers/tools/index.ts +31 -31
- package/src/server/handlers/tools/init-project.ts +757 -757
- package/src/server/handlers/tools/list-episodes.ts +90 -90
- package/src/server/handlers/tools/list-projects.ts +125 -125
- package/src/server/handlers/tools/rate-memory.ts +101 -101
- package/src/server/handlers/tools/recall-similar.ts +87 -87
- package/src/server/handlers/tools/recognize-pattern.ts +126 -126
- package/src/server/handlers/tools/record-correction.ts +125 -125
- package/src/server/handlers/tools/remember-decision.ts +153 -153
- package/src/server/handlers/tools/schemas.ts +253 -253
- package/src/server/handlers/tools/search-knowledge-graph.ts +102 -102
- package/src/server/handlers/tools/smart-context.ts +146 -146
- package/src/server/handlers/tools/update-progress.ts +131 -131
- package/src/server/handlers/tools/what-if-analysis.ts +135 -135
- package/src/server/http-api.ts +693 -693
- package/src/server/index.ts +40 -40
- package/src/server/mcp-server.ts +283 -283
- package/src/server/providers/index.ts +7 -7
- package/src/server/providers/prompts.ts +327 -327
- package/src/server/providers/resources.ts +622 -622
- package/src/server/services.ts +468 -468
- package/src/server/types.ts +39 -39
- package/src/server/utils/error-handler.ts +155 -155
- package/src/server/utils/index.ts +13 -13
- package/src/server/utils/memory-indicator.ts +83 -83
- package/src/server/utils/request-context.ts +122 -122
- package/src/server/utils/response-formatter.ts +129 -124
- package/src/server/utils/validators.ts +210 -210
- package/src/setup/index.ts +48 -48
- package/src/setup/wizard.ts +461 -461
- package/src/tools/index.ts +24 -24
- package/src/tools/registry.ts +115 -115
- package/src/tools/schemas.test.ts +30 -30
- package/src/tools/schemas.ts +617 -617
- package/src/tools/types.ts +412 -412
- package/src/utils/circuit-breaker.ts +130 -130
- package/src/utils/cleanup.ts +34 -34
- package/src/utils/error-handler.ts +132 -132
- package/src/utils/error-messages.ts +60 -60
- package/src/utils/fallback.ts +45 -45
- package/src/utils/index.ts +54 -54
- package/src/utils/logger-utils.ts +80 -80
- package/src/utils/logger.ts +88 -88
- package/src/utils/phase12-helper.ts +56 -56
- package/src/utils/retry.ts +94 -94
- package/src/utils/timing.ts +47 -47
- package/src/utils/transaction.ts +63 -63
- package/src/vault/frontmatter.ts +264 -264
- package/src/vault/index.ts +318 -318
- package/src/vault/paths.ts +106 -106
- package/src/vault/query.ts +422 -422
- package/src/vault/reader.ts +264 -264
- package/src/vault/templates.ts +186 -186
- package/src/vault/types.ts +73 -73
- package/src/vault/watcher.ts +277 -277
- package/src/vault/writer.ts +413 -413
- package/tsconfig.json +30 -30
|
@@ -1,164 +1,164 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Memory Archiver
|
|
3
|
-
* Moves low-importance memories to archive collection
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import type { Logger } from 'pino'
|
|
7
|
-
import type { CollectionManager } from '../chroma/collection-manager'
|
|
8
|
-
import type { EmbeddingProvider } from '../chroma/embeddings'
|
|
9
|
-
import type { ImportanceScorer, ImportanceScore } from './scorer'
|
|
10
|
-
|
|
11
|
-
export interface ArchiveResult {
|
|
12
|
-
archivedCount: number
|
|
13
|
-
archivedIds: string[]
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export class MemoryArchiver {
|
|
17
|
-
private logger: Logger
|
|
18
|
-
private collections: CollectionManager
|
|
19
|
-
private embeddings?: EmbeddingProvider
|
|
20
|
-
private scorer: ImportanceScorer
|
|
21
|
-
|
|
22
|
-
constructor(
|
|
23
|
-
logger: Logger,
|
|
24
|
-
collections: CollectionManager,
|
|
25
|
-
scorer: ImportanceScorer,
|
|
26
|
-
embeddings?: EmbeddingProvider
|
|
27
|
-
) {
|
|
28
|
-
this.logger = logger.child({ component: 'memory-archiver' })
|
|
29
|
-
this.collections = collections
|
|
30
|
-
this.scorer = scorer
|
|
31
|
-
this.embeddings = embeddings
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
async archiveLowImportance(threshold: number = 0.2): Promise<ArchiveResult> {
|
|
35
|
-
const archivedIds: string[] = []
|
|
36
|
-
|
|
37
|
-
try {
|
|
38
|
-
const decisionsCollection = await this.collections.getDecisions()
|
|
39
|
-
const archiveCollection = await this.collections.getArchivedMemories()
|
|
40
|
-
|
|
41
|
-
const results = await decisionsCollection.get({
|
|
42
|
-
include: ['documents', 'metadatas', 'embeddings']
|
|
43
|
-
})
|
|
44
|
-
|
|
45
|
-
for (let i = 0; i < results.ids.length; i++) {
|
|
46
|
-
const id = results.ids[i]
|
|
47
|
-
const metadata = results.metadatas?.[i] as Record<string, any>
|
|
48
|
-
|
|
49
|
-
const score = this.scorer.score({
|
|
50
|
-
id,
|
|
51
|
-
created_at: metadata?.created_at || new Date().toISOString(),
|
|
52
|
-
recall_count: metadata?.recall_count || 0,
|
|
53
|
-
average_rating: metadata?.average_rating,
|
|
54
|
-
max_similarity: metadata?.max_similarity
|
|
55
|
-
})
|
|
56
|
-
|
|
57
|
-
if (score.total < threshold) {
|
|
58
|
-
// Move to archive
|
|
59
|
-
try {
|
|
60
|
-
await archiveCollection.add({
|
|
61
|
-
ids: [id],
|
|
62
|
-
documents: [results.documents?.[i] as string],
|
|
63
|
-
metadatas: [{
|
|
64
|
-
...metadata,
|
|
65
|
-
archived_at: new Date().toISOString(),
|
|
66
|
-
importance_score: score.total
|
|
67
|
-
}],
|
|
68
|
-
...(results.embeddings?.[i] ? { embeddings: [results.embeddings[i] as number[]] } : {})
|
|
69
|
-
})
|
|
70
|
-
|
|
71
|
-
await decisionsCollection.delete({ ids: [id] })
|
|
72
|
-
archivedIds.push(id)
|
|
73
|
-
} catch (moveError) {
|
|
74
|
-
this.logger.warn({ error: moveError, id }, 'Failed to archive individual memory')
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
this.logger.info({
|
|
80
|
-
archivedCount: archivedIds.length,
|
|
81
|
-
totalChecked: results.ids.length,
|
|
82
|
-
threshold
|
|
83
|
-
}, 'Archive sweep complete')
|
|
84
|
-
|
|
85
|
-
} catch (error) {
|
|
86
|
-
this.logger.error({ error }, 'Failed to archive low-importance memories')
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
return { archivedCount: archivedIds.length, archivedIds }
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
async restore(memoryId: string): Promise<boolean> {
|
|
93
|
-
try {
|
|
94
|
-
const archiveCollection = await this.collections.getArchivedMemories()
|
|
95
|
-
const decisionsCollection = await this.collections.getDecisions()
|
|
96
|
-
|
|
97
|
-
const result = await archiveCollection.get({
|
|
98
|
-
ids: [memoryId],
|
|
99
|
-
include: ['documents', 'metadatas', 'embeddings']
|
|
100
|
-
})
|
|
101
|
-
|
|
102
|
-
if (result.ids.length === 0) {
|
|
103
|
-
this.logger.warn({ memoryId }, 'Memory not found in archive')
|
|
104
|
-
return false
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
const metadata = { ...(result.metadatas?.[0] as Record<string, any>) }
|
|
108
|
-
delete metadata.archived_at
|
|
109
|
-
delete metadata.importance_score
|
|
110
|
-
metadata.updated_at = new Date().toISOString()
|
|
111
|
-
metadata.restored_from_archive = true
|
|
112
|
-
|
|
113
|
-
await decisionsCollection.add({
|
|
114
|
-
ids: [memoryId],
|
|
115
|
-
documents: [result.documents?.[0] as string],
|
|
116
|
-
metadatas: [metadata],
|
|
117
|
-
...(result.embeddings?.[0] ? { embeddings: [result.embeddings[0] as number[]] } : {})
|
|
118
|
-
})
|
|
119
|
-
|
|
120
|
-
await archiveCollection.delete({ ids: [memoryId] })
|
|
121
|
-
|
|
122
|
-
this.logger.info({ memoryId }, 'Memory restored from archive')
|
|
123
|
-
return true
|
|
124
|
-
} catch (error) {
|
|
125
|
-
this.logger.error({ error, memoryId }, 'Failed to restore memory')
|
|
126
|
-
return false
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
async searchArchive(query: string, limit: number = 10): Promise<any[]> {
|
|
131
|
-
try {
|
|
132
|
-
const archiveCollection = await this.collections.getArchivedMemories()
|
|
133
|
-
|
|
134
|
-
let results: any
|
|
135
|
-
|
|
136
|
-
if (this.embeddings) {
|
|
137
|
-
const embedding = await this.embeddings.generate(query)
|
|
138
|
-
results = await archiveCollection.query({
|
|
139
|
-
queryEmbeddings: [embedding],
|
|
140
|
-
nResults: limit,
|
|
141
|
-
include: ['documents', 'metadatas', 'distances']
|
|
142
|
-
})
|
|
143
|
-
} else {
|
|
144
|
-
results = await archiveCollection.query({
|
|
145
|
-
queryTexts: [query],
|
|
146
|
-
nResults: limit,
|
|
147
|
-
include: ['documents', 'metadatas', 'distances']
|
|
148
|
-
})
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
if (!results.ids?.[0]) return []
|
|
152
|
-
|
|
153
|
-
return results.ids[0].map((id: string, i: number) => ({
|
|
154
|
-
id,
|
|
155
|
-
content: results.documents?.[0]?.[i],
|
|
156
|
-
metadata: results.metadatas?.[0]?.[i],
|
|
157
|
-
similarity: 1 - (results.distances?.[0]?.[i] || 0)
|
|
158
|
-
}))
|
|
159
|
-
} catch (error) {
|
|
160
|
-
this.logger.error({ error, query }, 'Failed to search archive')
|
|
161
|
-
return []
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Memory Archiver
|
|
3
|
+
* Moves low-importance memories to archive collection
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { Logger } from 'pino'
|
|
7
|
+
import type { CollectionManager } from '../chroma/collection-manager'
|
|
8
|
+
import type { EmbeddingProvider } from '../chroma/embeddings'
|
|
9
|
+
import type { ImportanceScorer, ImportanceScore } from './scorer'
|
|
10
|
+
|
|
11
|
+
export interface ArchiveResult {
|
|
12
|
+
archivedCount: number
|
|
13
|
+
archivedIds: string[]
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export class MemoryArchiver {
|
|
17
|
+
private logger: Logger
|
|
18
|
+
private collections: CollectionManager
|
|
19
|
+
private embeddings?: EmbeddingProvider
|
|
20
|
+
private scorer: ImportanceScorer
|
|
21
|
+
|
|
22
|
+
constructor(
|
|
23
|
+
logger: Logger,
|
|
24
|
+
collections: CollectionManager,
|
|
25
|
+
scorer: ImportanceScorer,
|
|
26
|
+
embeddings?: EmbeddingProvider
|
|
27
|
+
) {
|
|
28
|
+
this.logger = logger.child({ component: 'memory-archiver' })
|
|
29
|
+
this.collections = collections
|
|
30
|
+
this.scorer = scorer
|
|
31
|
+
this.embeddings = embeddings
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async archiveLowImportance(threshold: number = 0.2): Promise<ArchiveResult> {
|
|
35
|
+
const archivedIds: string[] = []
|
|
36
|
+
|
|
37
|
+
try {
|
|
38
|
+
const decisionsCollection = await this.collections.getDecisions()
|
|
39
|
+
const archiveCollection = await this.collections.getArchivedMemories()
|
|
40
|
+
|
|
41
|
+
const results = await decisionsCollection.get({
|
|
42
|
+
include: ['documents', 'metadatas', 'embeddings']
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
for (let i = 0; i < results.ids.length; i++) {
|
|
46
|
+
const id = results.ids[i]
|
|
47
|
+
const metadata = results.metadatas?.[i] as Record<string, any>
|
|
48
|
+
|
|
49
|
+
const score = this.scorer.score({
|
|
50
|
+
id,
|
|
51
|
+
created_at: metadata?.created_at || new Date().toISOString(),
|
|
52
|
+
recall_count: metadata?.recall_count || 0,
|
|
53
|
+
average_rating: metadata?.average_rating,
|
|
54
|
+
max_similarity: metadata?.max_similarity
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
if (score.total < threshold) {
|
|
58
|
+
// Move to archive
|
|
59
|
+
try {
|
|
60
|
+
await archiveCollection.add({
|
|
61
|
+
ids: [id],
|
|
62
|
+
documents: [results.documents?.[i] as string],
|
|
63
|
+
metadatas: [{
|
|
64
|
+
...metadata,
|
|
65
|
+
archived_at: new Date().toISOString(),
|
|
66
|
+
importance_score: score.total
|
|
67
|
+
}],
|
|
68
|
+
...(results.embeddings?.[i] ? { embeddings: [results.embeddings[i] as number[]] } : {})
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
await decisionsCollection.delete({ ids: [id] })
|
|
72
|
+
archivedIds.push(id)
|
|
73
|
+
} catch (moveError) {
|
|
74
|
+
this.logger.warn({ error: moveError, id }, 'Failed to archive individual memory')
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
this.logger.info({
|
|
80
|
+
archivedCount: archivedIds.length,
|
|
81
|
+
totalChecked: results.ids.length,
|
|
82
|
+
threshold
|
|
83
|
+
}, 'Archive sweep complete')
|
|
84
|
+
|
|
85
|
+
} catch (error) {
|
|
86
|
+
this.logger.error({ error }, 'Failed to archive low-importance memories')
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return { archivedCount: archivedIds.length, archivedIds }
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
async restore(memoryId: string): Promise<boolean> {
|
|
93
|
+
try {
|
|
94
|
+
const archiveCollection = await this.collections.getArchivedMemories()
|
|
95
|
+
const decisionsCollection = await this.collections.getDecisions()
|
|
96
|
+
|
|
97
|
+
const result = await archiveCollection.get({
|
|
98
|
+
ids: [memoryId],
|
|
99
|
+
include: ['documents', 'metadatas', 'embeddings']
|
|
100
|
+
})
|
|
101
|
+
|
|
102
|
+
if (result.ids.length === 0) {
|
|
103
|
+
this.logger.warn({ memoryId }, 'Memory not found in archive')
|
|
104
|
+
return false
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const metadata = { ...(result.metadatas?.[0] as Record<string, any>) }
|
|
108
|
+
delete metadata.archived_at
|
|
109
|
+
delete metadata.importance_score
|
|
110
|
+
metadata.updated_at = new Date().toISOString()
|
|
111
|
+
metadata.restored_from_archive = true
|
|
112
|
+
|
|
113
|
+
await decisionsCollection.add({
|
|
114
|
+
ids: [memoryId],
|
|
115
|
+
documents: [result.documents?.[0] as string],
|
|
116
|
+
metadatas: [metadata],
|
|
117
|
+
...(result.embeddings?.[0] ? { embeddings: [result.embeddings[0] as number[]] } : {})
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
await archiveCollection.delete({ ids: [memoryId] })
|
|
121
|
+
|
|
122
|
+
this.logger.info({ memoryId }, 'Memory restored from archive')
|
|
123
|
+
return true
|
|
124
|
+
} catch (error) {
|
|
125
|
+
this.logger.error({ error, memoryId }, 'Failed to restore memory')
|
|
126
|
+
return false
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
async searchArchive(query: string, limit: number = 10): Promise<any[]> {
|
|
131
|
+
try {
|
|
132
|
+
const archiveCollection = await this.collections.getArchivedMemories()
|
|
133
|
+
|
|
134
|
+
let results: any
|
|
135
|
+
|
|
136
|
+
if (this.embeddings) {
|
|
137
|
+
const embedding = await this.embeddings.generate(query)
|
|
138
|
+
results = await archiveCollection.query({
|
|
139
|
+
queryEmbeddings: [embedding],
|
|
140
|
+
nResults: limit,
|
|
141
|
+
include: ['documents', 'metadatas', 'distances']
|
|
142
|
+
})
|
|
143
|
+
} else {
|
|
144
|
+
results = await archiveCollection.query({
|
|
145
|
+
queryTexts: [query],
|
|
146
|
+
nResults: limit,
|
|
147
|
+
include: ['documents', 'metadatas', 'distances']
|
|
148
|
+
})
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
if (!results.ids?.[0]) return []
|
|
152
|
+
|
|
153
|
+
return results.ids[0].map((id: string, i: number) => ({
|
|
154
|
+
id,
|
|
155
|
+
content: results.documents?.[0]?.[i],
|
|
156
|
+
metadata: results.metadatas?.[0]?.[i],
|
|
157
|
+
similarity: 1 - (results.distances?.[0]?.[i] || 0)
|
|
158
|
+
}))
|
|
159
|
+
} catch (error) {
|
|
160
|
+
this.logger.error({ error, query }, 'Failed to search archive')
|
|
161
|
+
return []
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|