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.
- package/README.md +9 -2
- package/dist/cli/index.js +1 -1
- package/package.json +11 -2
- package/scripts/postinstall-embedding-backend.cjs +16 -12
- package/AGENTS.md +0 -71
- package/CLAUDE.md +0 -30
- package/HANDOFF.md +0 -92
- package/Memo.txt +0 -558
- package/benchmarks/replay/anonymized-real-sessions.json +0 -48
- package/config/kpi-thresholds.json +0 -7
- package/context.md +0 -636
- package/docs/ARCHITECTURE_COMPARISON_AND_RECOMMENDATIONS.md +0 -627
- package/docs/HERMES_MEMORY_INGESTION_ANALYSIS.md +0 -440
- package/docs/MCP_MEMORY_SERVICE_COMPARATIVE_REVIEW.md +0 -271
- package/docs/MEMORY_USEFULNESS_AUDIT.md +0 -371
- package/docs/MEMORY_USEFULNESS_AUDIT_RAW.json +0 -80
- package/docs/MEMSEARCH_PROJECT_STRUCTURE_ANALYSIS.md +0 -333
- package/docs/MEMU_ADOPTION.md +0 -40
- package/docs/OPERATIONS.md +0 -18
- package/docs/PRODUCT_VALIDATION_MATRIX.md +0 -82
- package/docs/PROJECT_STRUCTURE_ANALYSIS.md +0 -421
- package/docs/REFACTORING_MILESTONES_AND_ISSUES.md +0 -501
- package/docs/REFACTORING_PLAN_THIN_CORE.md +0 -414
- package/docs/REFERENCE_PROJECT_ANALYSES.md +0 -25
- package/docs/SUPERLOCALMEMORY_PROJECT_STRUCTURE_ANALYSIS.md +0 -452
- package/docs/TARGET_ARCHITECTURE_AND_FOLDER_STRUCTURE.md +0 -446
- package/docs/architecture/comparison-index.md +0 -47
- package/docs/reports/codex-real-data-validation-20260505T040447Z.md +0 -46
- package/plan.md +0 -1642
- package/scripts/build.ts +0 -159
- package/scripts/bump-patch-version.sh +0 -18
- package/scripts/delete-unknown-projects.js +0 -154
- package/scripts/fix-sync-gap.js +0 -32
- package/scripts/generate-session-qrels.ts +0 -126
- package/scripts/heartbeat-memory-orchestrator.sh +0 -28
- package/scripts/replay-retrieval-benchmark.ts +0 -69
- package/scripts/report-sync-gap.js +0 -26
- package/scripts/review-queue-auto-resolve.js +0 -21
- package/scripts/sync-gap-auto-heal.sh +0 -17
- package/spec.md +0 -624
- package/specs/20260207-dashboard-upgrade/context.md +0 -38
- package/specs/20260207-dashboard-upgrade/spec.md +0 -96
- package/specs/citations-system/context.md +0 -243
- package/specs/citations-system/plan.md +0 -495
- package/specs/citations-system/spec.md +0 -371
- package/specs/endless-mode/context.md +0 -305
- package/specs/endless-mode/plan.md +0 -620
- package/specs/endless-mode/spec.md +0 -455
- package/specs/entity-edge-model/context.md +0 -401
- package/specs/entity-edge-model/plan.md +0 -459
- package/specs/entity-edge-model/spec.md +0 -391
- package/specs/evidence-aligner-v2/context.md +0 -401
- package/specs/evidence-aligner-v2/plan.md +0 -303
- package/specs/evidence-aligner-v2/spec.md +0 -312
- package/specs/mcp-desktop-integration/context.md +0 -278
- package/specs/mcp-desktop-integration/plan.md +0 -550
- package/specs/mcp-desktop-integration/spec.md +0 -494
- package/specs/memory-utilization-improvements/context.md +0 -145
- package/specs/memory-utilization-improvements/plan.md +0 -361
- package/specs/memory-utilization-improvements/spec.md +0 -361
- package/specs/post-tool-use-hook/context.md +0 -319
- package/specs/post-tool-use-hook/plan.md +0 -469
- package/specs/post-tool-use-hook/spec.md +0 -364
- package/specs/private-tags/context.md +0 -288
- package/specs/private-tags/plan.md +0 -412
- package/specs/private-tags/spec.md +0 -345
- package/specs/progressive-disclosure/context.md +0 -346
- package/specs/progressive-disclosure/plan.md +0 -663
- package/specs/progressive-disclosure/spec.md +0 -415
- package/specs/selective-tool-observation/context.md +0 -100
- package/specs/selective-tool-observation/plan.md +0 -158
- package/specs/selective-tool-observation/spec.md +0 -127
- package/specs/task-entity-system/context.md +0 -297
- package/specs/task-entity-system/plan.md +0 -301
- package/specs/task-entity-system/spec.md +0 -314
- package/specs/thin-core-refactor/context.md +0 -275
- package/specs/thin-core-refactor/plan.md +0 -536
- package/specs/thin-core-refactor/spec.md +0 -465
- package/specs/vector-outbox-v2/context.md +0 -470
- package/specs/vector-outbox-v2/plan.md +0 -562
- package/specs/vector-outbox-v2/spec.md +0 -466
- package/specs/web-viewer-ui/context.md +0 -384
- package/specs/web-viewer-ui/plan.md +0 -797
- package/specs/web-viewer-ui/spec.md +0 -516
- package/src/adapters/claude/capture/index.ts +0 -3
- package/src/adapters/claude/context/index.ts +0 -3
- package/src/adapters/claude/hooks/index.ts +0 -21
- package/src/adapters/claude/hooks/post-tool-use.ts +0 -239
- package/src/adapters/claude/hooks/prompt-injection-policy.ts +0 -104
- package/src/adapters/claude/hooks/semantic-daemon-client.ts +0 -209
- package/src/adapters/claude/hooks/semantic-daemon.ts +0 -283
- package/src/adapters/claude/hooks/session-end.ts +0 -59
- package/src/adapters/claude/hooks/session-start.ts +0 -73
- package/src/adapters/claude/hooks/stop.ts +0 -128
- package/src/adapters/claude/hooks/user-prompt-submit.ts +0 -361
- package/src/adapters/claude/index.ts +0 -4
- package/src/adapters/claude/transcript/index.ts +0 -4
- package/src/adapters/claude/transcript/transcript-reader.ts +0 -57
- package/src/adapters/claude/transcript/turn-reconstructor.ts +0 -65
- package/src/apps/cli/claude-settings-hooks.ts +0 -138
- package/src/apps/cli/codex-import-runner.ts +0 -125
- package/src/apps/cli/codex-validation-output.ts +0 -95
- package/src/apps/cli/hermes-import-runner.ts +0 -130
- package/src/apps/cli/hermes-validation-output.ts +0 -91
- package/src/apps/cli/index.ts +0 -1735
- package/src/apps/cli/mcp-install.ts +0 -106
- package/src/apps/cli/retrieval-disclosure-output.ts +0 -196
- package/src/apps/dashboard/assets/js/bootstrap.js +0 -244
- package/src/apps/dashboard/assets/js/chat.js +0 -373
- package/src/apps/dashboard/assets/js/disclosure.js +0 -232
- package/src/apps/dashboard/assets/js/modals.js +0 -298
- package/src/apps/dashboard/assets/js/overview.js +0 -655
- package/src/apps/dashboard/assets/js/state.js +0 -72
- package/src/apps/dashboard/assets/js/views.js +0 -468
- package/src/apps/dashboard/index.html +0 -543
- package/src/apps/dashboard/index.ts +0 -3
- package/src/apps/dashboard/style.css +0 -1750
- package/src/apps/index.ts +0 -5
- package/src/apps/server/api/chat.ts +0 -244
- package/src/apps/server/api/citations.ts +0 -105
- package/src/apps/server/api/events.ts +0 -137
- package/src/apps/server/api/health.ts +0 -53
- package/src/apps/server/api/index.ts +0 -26
- package/src/apps/server/api/projects.ts +0 -74
- package/src/apps/server/api/search.ts +0 -184
- package/src/apps/server/api/sessions.ts +0 -115
- package/src/apps/server/api/stats.ts +0 -723
- package/src/apps/server/api/turns.ts +0 -143
- package/src/apps/server/api/utils.ts +0 -65
- package/src/apps/server/index.ts +0 -111
- package/src/cli/index.ts +0 -3
- package/src/cli/retrieval-disclosure-output.ts +0 -2
- package/src/compat/index.ts +0 -5
- package/src/core/canonical-key.ts +0 -186
- package/src/core/citation-generator.ts +0 -63
- package/src/core/consolidated-store.ts +0 -356
- package/src/core/consolidation-worker.ts +0 -493
- package/src/core/context-formatter.ts +0 -276
- package/src/core/continuity-manager.ts +0 -341
- package/src/core/db-wrapper.ts +0 -64
- package/src/core/derive/fact-deriver.ts +0 -170
- package/src/core/derive/index.ts +0 -2
- package/src/core/derive/summary-deriver.ts +0 -76
- package/src/core/edge-repo.ts +0 -333
- package/src/core/embedder.ts +0 -4
- package/src/core/engine/embedding-maintenance-service.ts +0 -187
- package/src/core/engine/endless-memory-services.ts +0 -4
- package/src/core/engine/index.ts +0 -19
- package/src/core/engine/memory-engine-services.ts +0 -170
- package/src/core/engine/memory-ingest-service.ts +0 -317
- package/src/core/engine/memory-query-service.ts +0 -173
- package/src/core/engine/memory-runtime-service.ts +0 -162
- package/src/core/engine/memory-service-composition.ts +0 -231
- package/src/core/engine/retrieval-analytics-service.ts +0 -181
- package/src/core/engine/retrieval-disclosure-service.ts +0 -420
- package/src/core/engine/retrieval-orchestrator.ts +0 -377
- package/src/core/engine/retrieval-services.ts +0 -176
- package/src/core/engine/shared-memory-services.ts +0 -4
- package/src/core/entity-repo.ts +0 -349
- package/src/core/event-store.ts +0 -779
- package/src/core/evidence-aligner.ts +0 -635
- package/src/core/external-market-context.ts +0 -582
- package/src/core/graduation-worker.ts +0 -171
- package/src/core/graduation.ts +0 -377
- package/src/core/index.ts +0 -64
- package/src/core/ingest-interceptor.ts +0 -80
- package/src/core/markdown-mirror.ts +0 -70
- package/src/core/matcher.ts +0 -208
- package/src/core/md-mirror.ts +0 -92
- package/src/core/metadata-extractor.ts +0 -203
- package/src/core/model/memory-fact.ts +0 -30
- package/src/core/model/memory-rule.ts +0 -14
- package/src/core/model/memory-summary.ts +0 -21
- package/src/core/model/raw-event.ts +0 -28
- package/src/core/model/retrieval-result.ts +0 -35
- package/src/core/mongo-sync-config.ts +0 -165
- package/src/core/mongo-sync-worker.ts +0 -381
- package/src/core/privacy/filter.ts +0 -190
- package/src/core/privacy/index.ts +0 -20
- package/src/core/privacy/tag-parser.ts +0 -145
- package/src/core/product-validation-matrix.ts +0 -314
- package/src/core/progressive-retriever.ts +0 -414
- package/src/core/registry/project-path.ts +0 -54
- package/src/core/registry/session-registry.ts +0 -69
- package/src/core/replay-evaluator.ts +0 -625
- package/src/core/retrieval-benchmark.ts +0 -117
- package/src/core/retrieval-quality.ts +0 -109
- package/src/core/retriever.ts +0 -800
- package/src/core/session-qrels.ts +0 -360
- package/src/core/shared-event-store.ts +0 -114
- package/src/core/shared-promoter.ts +0 -249
- package/src/core/shared-store.ts +0 -289
- package/src/core/shared-vector-store.ts +0 -203
- package/src/core/sqlite-event-store.ts +0 -1846
- package/src/core/sqlite-wrapper.ts +0 -116
- package/src/core/sync-worker.ts +0 -228
- package/src/core/tag-taxonomy.ts +0 -51
- package/src/core/task/blocker-resolver.ts +0 -333
- package/src/core/task/index.ts +0 -9
- package/src/core/task/task-matcher.ts +0 -240
- package/src/core/task/task-projector.ts +0 -358
- package/src/core/task/task-resolver.ts +0 -421
- package/src/core/turn-state.ts +0 -207
- package/src/core/types.ts +0 -952
- package/src/core/vector-outbox.ts +0 -299
- package/src/core/vector-store.ts +0 -231
- package/src/core/vector-worker.ts +0 -521
- package/src/core/working-set-store.ts +0 -257
- package/src/extensions/endless-memory/endless-memory-services.ts +0 -350
- package/src/extensions/endless-memory/index.ts +0 -1
- package/src/extensions/index.ts +0 -5
- package/src/extensions/mcp/handlers.ts +0 -960
- package/src/extensions/mcp/index.ts +0 -48
- package/src/extensions/mcp/tools.ts +0 -252
- package/src/extensions/shared-memory/index.ts +0 -1
- package/src/extensions/shared-memory/shared-memory-services.ts +0 -211
- package/src/extensions/vector/embedder.ts +0 -234
- package/src/extensions/vector/index.ts +0 -1
- package/src/hooks/post-tool-use.ts +0 -9
- package/src/hooks/semantic-daemon-client.ts +0 -1
- package/src/hooks/semantic-daemon.ts +0 -11
- package/src/hooks/session-end.ts +0 -9
- package/src/hooks/session-start.ts +0 -9
- package/src/hooks/stop.ts +0 -9
- package/src/hooks/user-prompt-submit.ts +0 -9
- package/src/index.ts +0 -13
- package/src/mcp/handlers.ts +0 -2
- package/src/mcp/index.ts +0 -4
- package/src/mcp/tools.ts +0 -2
- package/src/server/api/chat.ts +0 -2
- package/src/server/api/citations.ts +0 -2
- package/src/server/api/events.ts +0 -2
- package/src/server/api/health.ts +0 -2
- package/src/server/api/index.ts +0 -2
- package/src/server/api/projects.ts +0 -2
- package/src/server/api/search.ts +0 -2
- package/src/server/api/sessions.ts +0 -2
- package/src/server/api/stats.ts +0 -2
- package/src/server/api/turns.ts +0 -2
- package/src/server/api/utils.ts +0 -2
- package/src/server/index.ts +0 -2
- package/src/services/bootstrap-organizer.ts +0 -463
- package/src/services/codex-session-history-importer.ts +0 -966
- package/src/services/hermes-session-history-importer.ts +0 -733
- package/src/services/memory-service-config.ts +0 -36
- package/src/services/memory-service-registry.ts +0 -150
- package/src/services/memory-service.ts +0 -688
- package/src/services/session-history-importer.ts +0 -629
- package/tests/README.md +0 -23
- package/tests/adapters/claude/claude-semantic-daemon-adapter.test.ts +0 -54
- package/tests/adapters/claude/claude-transcript-reconstructor.test.ts +0 -98
- package/tests/adapters/claude-hook-prompt-injection-policy.test.ts +0 -99
- package/tests/apps/app-layer-boundary.test.ts +0 -48
- package/tests/apps/claude-settings-hooks.test.ts +0 -107
- package/tests/apps/cli-disclosure-output.test.ts +0 -212
- package/tests/apps/codex-import-runner.test.ts +0 -99
- package/tests/apps/codex-validation-output.test.ts +0 -100
- package/tests/apps/hermes-import-runner.test.ts +0 -99
- package/tests/apps/mcp-install-command.test.ts +0 -59
- package/tests/apps/package-build-entrypoints.test.ts +0 -30
- package/tests/apps/postinstall-embedding-backend.test.ts +0 -185
- package/tests/apps/search-api-disclosure.test.ts +0 -162
- package/tests/apps/stats-api-lightweight.test.ts +0 -67
- package/tests/apps/ui-disclosure-output.test.ts +0 -140
- package/tests/core/bootstrap-organizer.test.ts +0 -111
- package/tests/core/canonical-key.test.ts +0 -101
- package/tests/core/codex-session-history-importer-validation.test.ts +0 -185
- package/tests/core/consolidation-worker.test.ts +0 -75
- package/tests/core/embedding-maintenance-service.test.ts +0 -282
- package/tests/core/evidence-aligner.test.ts +0 -152
- package/tests/core/external-market-context.test.ts +0 -209
- package/tests/core/fact-deriver.test.ts +0 -79
- package/tests/core/hermes-session-history-importer-validation.test.ts +0 -609
- package/tests/core/ingest-interceptor.test.ts +0 -38
- package/tests/core/markdown-mirror.test.ts +0 -85
- package/tests/core/matcher.test.ts +0 -112
- package/tests/core/md-mirror.test.ts +0 -50
- package/tests/core/memory-engine-services.test.ts +0 -240
- package/tests/core/memory-ingest-service.test.ts +0 -296
- package/tests/core/memory-query-service.test.ts +0 -129
- package/tests/core/memory-runtime-service.test.ts +0 -201
- package/tests/core/memory-service-composition.test.ts +0 -192
- package/tests/core/memory-service-config.test.ts +0 -41
- package/tests/core/memory-service-facade.test.ts +0 -30
- package/tests/core/memory-service-registry.test.ts +0 -206
- package/tests/core/product-validation-matrix.test.ts +0 -61
- package/tests/core/project-registry.test.ts +0 -78
- package/tests/core/replay-evaluator.test.ts +0 -181
- package/tests/core/retrieval-analytics-service.test.ts +0 -210
- package/tests/core/retrieval-benchmark.test.ts +0 -93
- package/tests/core/retrieval-disclosure-service.test.ts +0 -264
- package/tests/core/retrieval-orchestrator.test.ts +0 -403
- package/tests/core/retrieval-quality.test.ts +0 -31
- package/tests/core/retrieval-services.test.ts +0 -185
- package/tests/core/retriever-fallback-chain.test.ts +0 -223
- package/tests/core/retriever-strategy-scope.test.ts +0 -164
- package/tests/core/retriever.memu-adoption.test.ts +0 -122
- package/tests/core/session-history-importer-filter.test.ts +0 -78
- package/tests/core/session-qrels.test.ts +0 -250
- package/tests/core/sqlite-event-store-replication.test.ts +0 -127
- package/tests/core/summary-deriver.test.ts +0 -66
- package/tests/extensions/embedder-warning-suppression.test.ts +0 -84
- package/tests/extensions/endless-memory-extension-boundary.test.ts +0 -17
- package/tests/extensions/endless-memory-services.test.ts +0 -325
- package/tests/extensions/mcp-context-tools.test.ts +0 -905
- package/tests/extensions/mcp-extension-boundary.test.ts +0 -21
- package/tests/extensions/mcp-package-build.test.ts +0 -22
- package/tests/extensions/mcp-project-aware-tools.test.ts +0 -102
- package/tests/extensions/shared-memory-extension-boundary.test.ts +0 -24
- package/tests/extensions/shared-memory-services.test.ts +0 -309
- package/tests/extensions/vector-extension-boundary.test.ts +0 -21
- package/tsconfig.json +0 -24
- package/vitest.config.ts +0 -15
|
@@ -1,257 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Working Set Store
|
|
3
|
-
* Manages the active memory window for Endless Mode
|
|
4
|
-
* Biomimetic: Simulates human working memory (7±2 items, 15-30s duration)
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { randomUUID } from 'crypto';
|
|
8
|
-
import { dbRun, dbAll, toDate, type Database } from './db-wrapper.js';
|
|
9
|
-
import type {
|
|
10
|
-
MemoryEvent,
|
|
11
|
-
EndlessModeConfig,
|
|
12
|
-
WorkingSet,
|
|
13
|
-
WorkingSetItem
|
|
14
|
-
} from './types.js';
|
|
15
|
-
import { EventStore } from './event-store.js';
|
|
16
|
-
|
|
17
|
-
export class WorkingSetStore {
|
|
18
|
-
constructor(
|
|
19
|
-
private eventStore: EventStore,
|
|
20
|
-
private config: EndlessModeConfig
|
|
21
|
-
) {}
|
|
22
|
-
|
|
23
|
-
private get db(): Database {
|
|
24
|
-
return this.eventStore.getDatabase();
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Add an event to the working set
|
|
29
|
-
*/
|
|
30
|
-
async add(eventId: string, relevanceScore: number = 1.0, topics?: string[]): Promise<void> {
|
|
31
|
-
const expiresAt = new Date(
|
|
32
|
-
Date.now() + this.config.workingSet.timeWindowHours * 60 * 60 * 1000
|
|
33
|
-
);
|
|
34
|
-
|
|
35
|
-
await dbRun(
|
|
36
|
-
this.db,
|
|
37
|
-
`INSERT OR REPLACE INTO working_set (id, event_id, added_at, relevance_score, topics, expires_at)
|
|
38
|
-
VALUES (?, ?, CURRENT_TIMESTAMP, ?, ?, ?)`,
|
|
39
|
-
[
|
|
40
|
-
randomUUID(),
|
|
41
|
-
eventId,
|
|
42
|
-
relevanceScore,
|
|
43
|
-
JSON.stringify(topics || []),
|
|
44
|
-
expiresAt.toISOString()
|
|
45
|
-
]
|
|
46
|
-
);
|
|
47
|
-
|
|
48
|
-
// Enforce size limit
|
|
49
|
-
await this.enforceLimit();
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Get the current working set
|
|
54
|
-
*/
|
|
55
|
-
async get(): Promise<WorkingSet> {
|
|
56
|
-
// Clean up expired items first
|
|
57
|
-
await this.cleanup();
|
|
58
|
-
|
|
59
|
-
// Get working set items with their events
|
|
60
|
-
const rows = await dbAll<Record<string, unknown>>(
|
|
61
|
-
this.db,
|
|
62
|
-
`SELECT ws.*, e.*
|
|
63
|
-
FROM working_set ws
|
|
64
|
-
JOIN events e ON ws.event_id = e.id
|
|
65
|
-
ORDER BY ws.relevance_score DESC, ws.added_at DESC
|
|
66
|
-
LIMIT ?`,
|
|
67
|
-
[this.config.workingSet.maxEvents]
|
|
68
|
-
);
|
|
69
|
-
|
|
70
|
-
const events: MemoryEvent[] = rows.map(row => ({
|
|
71
|
-
id: row.id as string,
|
|
72
|
-
eventType: row.event_type as 'user_prompt' | 'agent_response' | 'session_summary' | 'tool_observation',
|
|
73
|
-
sessionId: row.session_id as string,
|
|
74
|
-
timestamp: toDate(row.timestamp),
|
|
75
|
-
content: row.content as string,
|
|
76
|
-
canonicalKey: row.canonical_key as string,
|
|
77
|
-
dedupeKey: row.dedupe_key as string,
|
|
78
|
-
metadata: row.metadata ? JSON.parse(row.metadata as string) : undefined
|
|
79
|
-
}));
|
|
80
|
-
|
|
81
|
-
return {
|
|
82
|
-
recentEvents: events,
|
|
83
|
-
lastActivity: events.length > 0 ? events[0].timestamp : new Date(),
|
|
84
|
-
continuityScore: await this.calculateContinuityScore()
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Get working set items (metadata only)
|
|
90
|
-
*/
|
|
91
|
-
async getItems(): Promise<WorkingSetItem[]> {
|
|
92
|
-
const rows = await dbAll<Record<string, unknown>>(
|
|
93
|
-
this.db,
|
|
94
|
-
`SELECT * FROM working_set ORDER BY relevance_score DESC, added_at DESC`
|
|
95
|
-
);
|
|
96
|
-
|
|
97
|
-
return rows.map(row => ({
|
|
98
|
-
id: row.id as string,
|
|
99
|
-
eventId: row.event_id as string,
|
|
100
|
-
addedAt: toDate(row.added_at),
|
|
101
|
-
relevanceScore: row.relevance_score as number,
|
|
102
|
-
topics: row.topics ? JSON.parse(row.topics as string) : undefined,
|
|
103
|
-
expiresAt: toDate(row.expires_at)
|
|
104
|
-
}));
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Update relevance score for an event
|
|
109
|
-
*/
|
|
110
|
-
async updateRelevance(eventId: string, score: number): Promise<void> {
|
|
111
|
-
await dbRun(
|
|
112
|
-
this.db,
|
|
113
|
-
`UPDATE working_set SET relevance_score = ? WHERE event_id = ?`,
|
|
114
|
-
[score, eventId]
|
|
115
|
-
);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Prune specific events from working set (after consolidation)
|
|
120
|
-
*/
|
|
121
|
-
async prune(eventIds: string[]): Promise<void> {
|
|
122
|
-
if (eventIds.length === 0) return;
|
|
123
|
-
|
|
124
|
-
const placeholders = eventIds.map(() => '?').join(',');
|
|
125
|
-
await dbRun(
|
|
126
|
-
this.db,
|
|
127
|
-
`DELETE FROM working_set WHERE event_id IN (${placeholders})`,
|
|
128
|
-
eventIds
|
|
129
|
-
);
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* Get the count of items in working set
|
|
134
|
-
*/
|
|
135
|
-
async count(): Promise<number> {
|
|
136
|
-
const result = await dbAll<{ count: number }>(
|
|
137
|
-
this.db,
|
|
138
|
-
`SELECT COUNT(*) as count FROM working_set`
|
|
139
|
-
);
|
|
140
|
-
return result[0]?.count || 0;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* Clear the entire working set
|
|
145
|
-
*/
|
|
146
|
-
async clear(): Promise<void> {
|
|
147
|
-
await dbRun(this.db, `DELETE FROM working_set`);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Check if an event is in the working set
|
|
152
|
-
*/
|
|
153
|
-
async contains(eventId: string): Promise<boolean> {
|
|
154
|
-
const result = await dbAll<{ count: number }>(
|
|
155
|
-
this.db,
|
|
156
|
-
`SELECT COUNT(*) as count FROM working_set WHERE event_id = ?`,
|
|
157
|
-
[eventId]
|
|
158
|
-
);
|
|
159
|
-
return (result[0]?.count || 0) > 0;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
/**
|
|
163
|
-
* Refresh expiration for an event (rehears al - keep relevant items longer)
|
|
164
|
-
*/
|
|
165
|
-
async refresh(eventId: string): Promise<void> {
|
|
166
|
-
const newExpiresAt = new Date(
|
|
167
|
-
Date.now() + this.config.workingSet.timeWindowHours * 60 * 60 * 1000
|
|
168
|
-
);
|
|
169
|
-
|
|
170
|
-
await dbRun(
|
|
171
|
-
this.db,
|
|
172
|
-
`UPDATE working_set SET expires_at = ? WHERE event_id = ?`,
|
|
173
|
-
[newExpiresAt.toISOString(), eventId]
|
|
174
|
-
);
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
/**
|
|
178
|
-
* Clean up expired items
|
|
179
|
-
*/
|
|
180
|
-
private async cleanup(): Promise<void> {
|
|
181
|
-
await dbRun(
|
|
182
|
-
this.db,
|
|
183
|
-
`DELETE FROM working_set WHERE expires_at < datetime('now')`
|
|
184
|
-
);
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
/**
|
|
188
|
-
* Enforce the maximum size limit
|
|
189
|
-
* Removes lowest relevance items when over limit
|
|
190
|
-
*/
|
|
191
|
-
private async enforceLimit(): Promise<void> {
|
|
192
|
-
const maxEvents = this.config.workingSet.maxEvents;
|
|
193
|
-
|
|
194
|
-
// Get IDs to keep (highest relevance, most recent)
|
|
195
|
-
const keepIds = await dbAll<{ id: string }>(
|
|
196
|
-
this.db,
|
|
197
|
-
`SELECT id FROM working_set
|
|
198
|
-
ORDER BY relevance_score DESC, added_at DESC
|
|
199
|
-
LIMIT ?`,
|
|
200
|
-
[maxEvents]
|
|
201
|
-
);
|
|
202
|
-
|
|
203
|
-
if (keepIds.length === 0) return;
|
|
204
|
-
|
|
205
|
-
const keepIdList = keepIds.map(r => r.id);
|
|
206
|
-
const placeholders = keepIdList.map(() => '?').join(',');
|
|
207
|
-
|
|
208
|
-
// Delete everything not in the keep list
|
|
209
|
-
await dbRun(
|
|
210
|
-
this.db,
|
|
211
|
-
`DELETE FROM working_set WHERE id NOT IN (${placeholders})`,
|
|
212
|
-
keepIdList
|
|
213
|
-
);
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
/**
|
|
217
|
-
* Calculate continuity score based on recent context transitions
|
|
218
|
-
*/
|
|
219
|
-
private async calculateContinuityScore(): Promise<number> {
|
|
220
|
-
const result = await dbAll<{ avg_score: number | null }>(
|
|
221
|
-
this.db,
|
|
222
|
-
`SELECT AVG(continuity_score) as avg_score
|
|
223
|
-
FROM continuity_log
|
|
224
|
-
WHERE created_at > datetime('now', '-1 hour')`
|
|
225
|
-
);
|
|
226
|
-
|
|
227
|
-
return result[0]?.avg_score ?? 0.5;
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
/**
|
|
231
|
-
* Get topics from current working set for context matching
|
|
232
|
-
*/
|
|
233
|
-
async getActiveTopics(): Promise<string[]> {
|
|
234
|
-
const rows = await dbAll<{ topics: string }>(
|
|
235
|
-
this.db,
|
|
236
|
-
`SELECT topics FROM working_set WHERE topics IS NOT NULL`
|
|
237
|
-
);
|
|
238
|
-
|
|
239
|
-
const allTopics = new Set<string>();
|
|
240
|
-
for (const row of rows) {
|
|
241
|
-
const topics = JSON.parse(row.topics) as string[];
|
|
242
|
-
topics.forEach(t => allTopics.add(t));
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
return Array.from(allTopics);
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
/**
|
|
250
|
-
* Create a Working Set Store instance
|
|
251
|
-
*/
|
|
252
|
-
export function createWorkingSetStore(
|
|
253
|
-
eventStore: EventStore,
|
|
254
|
-
config: EndlessModeConfig
|
|
255
|
-
): WorkingSetStore {
|
|
256
|
-
return new WorkingSetStore(eventStore, config);
|
|
257
|
-
}
|
|
@@ -1,350 +0,0 @@
|
|
|
1
|
-
import { randomUUID } from 'crypto';
|
|
2
|
-
|
|
3
|
-
import type { EventStore } from '../../core/event-store.js';
|
|
4
|
-
import {
|
|
5
|
-
createWorkingSetStore,
|
|
6
|
-
type WorkingSetStore
|
|
7
|
-
} from '../../core/working-set-store.js';
|
|
8
|
-
import {
|
|
9
|
-
createConsolidatedStore,
|
|
10
|
-
type ConsolidatedStore
|
|
11
|
-
} from '../../core/consolidated-store.js';
|
|
12
|
-
import {
|
|
13
|
-
createConsolidationWorker,
|
|
14
|
-
type ConsolidationWorker
|
|
15
|
-
} from '../../core/consolidation-worker.js';
|
|
16
|
-
import {
|
|
17
|
-
createContinuityManager,
|
|
18
|
-
type ContinuityManager
|
|
19
|
-
} from '../../core/continuity-manager.js';
|
|
20
|
-
import type {
|
|
21
|
-
ConsolidatedMemory,
|
|
22
|
-
ContinuityScore,
|
|
23
|
-
EndlessModeConfig,
|
|
24
|
-
EndlessModeStatus,
|
|
25
|
-
MemoryMode,
|
|
26
|
-
WorkingSet
|
|
27
|
-
} from '../../core/types.js';
|
|
28
|
-
|
|
29
|
-
export interface EndlessConfigStore {
|
|
30
|
-
getEndlessConfig(key: string): Promise<unknown>;
|
|
31
|
-
setEndlessConfig(key: string, value: unknown): Promise<void>;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export interface WorkingSetStorePort {
|
|
35
|
-
add(eventId: string, relevanceScore?: number): Promise<void>;
|
|
36
|
-
get(): Promise<WorkingSet>;
|
|
37
|
-
count(): Promise<number>;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export interface ConsolidatedStorePort {
|
|
41
|
-
search(query: string, options?: { topK?: number }): Promise<ConsolidatedMemory[]>;
|
|
42
|
-
getAll(options?: { limit?: number }): Promise<ConsolidatedMemory[]>;
|
|
43
|
-
markAccessed(memoryId: string): Promise<void>;
|
|
44
|
-
count(): Promise<number>;
|
|
45
|
-
getLastConsolidationTime(): Promise<Date | null>;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export interface ConsolidationWorkerPort {
|
|
49
|
-
start(): void;
|
|
50
|
-
stop(): void;
|
|
51
|
-
recordActivity(): void;
|
|
52
|
-
forceRun(): Promise<number>;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export interface ContinuityManagerPort {
|
|
56
|
-
createSnapshot(
|
|
57
|
-
id: string,
|
|
58
|
-
content: string,
|
|
59
|
-
metadata?: { files?: string[]; entities?: string[] }
|
|
60
|
-
): unknown;
|
|
61
|
-
calculateScore(snapshot: unknown): Promise<ContinuityScore>;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export interface EndlessMemoryServicesFactories {
|
|
65
|
-
createWorkingSetStore: (eventStore: EventStore, config: EndlessModeConfig) => WorkingSetStorePort;
|
|
66
|
-
createConsolidatedStore: (eventStore: EventStore) => ConsolidatedStorePort;
|
|
67
|
-
createConsolidationWorker: (
|
|
68
|
-
workingSetStore: WorkingSetStorePort,
|
|
69
|
-
consolidatedStore: ConsolidatedStorePort,
|
|
70
|
-
config: EndlessModeConfig
|
|
71
|
-
) => ConsolidationWorkerPort;
|
|
72
|
-
createContinuityManager: (eventStore: EventStore, config: EndlessModeConfig) => ContinuityManagerPort;
|
|
73
|
-
randomUUID?: () => string;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
export interface EndlessMemoryServicesOptions {
|
|
77
|
-
eventStore: EventStore;
|
|
78
|
-
configStore: EndlessConfigStore;
|
|
79
|
-
initialize: () => Promise<void>;
|
|
80
|
-
factories?: EndlessMemoryServicesFactories;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
export interface EndlessMemoryServices {
|
|
84
|
-
initializeFromSavedMode(): Promise<void>;
|
|
85
|
-
initializeEndlessMode(): Promise<void>;
|
|
86
|
-
getEndlessConfig(): Promise<EndlessModeConfig>;
|
|
87
|
-
setEndlessConfig(config: Partial<EndlessModeConfig>): Promise<void>;
|
|
88
|
-
setMode(mode: MemoryMode): Promise<void>;
|
|
89
|
-
getMode(): MemoryMode;
|
|
90
|
-
isEndlessModeActive(): boolean;
|
|
91
|
-
addToWorkingSet(eventId: string, relevanceScore?: number): Promise<void>;
|
|
92
|
-
getWorkingSet(): Promise<WorkingSet | null>;
|
|
93
|
-
searchConsolidated(query: string, options?: { topK?: number }): Promise<ConsolidatedMemory[]>;
|
|
94
|
-
getConsolidatedMemories(limit?: number): Promise<ConsolidatedMemory[]>;
|
|
95
|
-
markMemoryAccessed(memoryId: string): Promise<void>;
|
|
96
|
-
calculateContinuity(
|
|
97
|
-
content: string,
|
|
98
|
-
metadata?: { files?: string[]; entities?: string[] }
|
|
99
|
-
): Promise<ContinuityScore | null>;
|
|
100
|
-
recordActivity(): void;
|
|
101
|
-
forceConsolidation(): Promise<number>;
|
|
102
|
-
getEndlessModeStatus(): Promise<EndlessModeStatus>;
|
|
103
|
-
formatEndlessContext(query: string): Promise<string>;
|
|
104
|
-
shutdown(): void;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
function getDefaultEndlessConfig(): EndlessModeConfig {
|
|
108
|
-
return {
|
|
109
|
-
enabled: true,
|
|
110
|
-
workingSet: {
|
|
111
|
-
maxEvents: 100,
|
|
112
|
-
timeWindowHours: 24,
|
|
113
|
-
minRelevanceScore: 0.5
|
|
114
|
-
},
|
|
115
|
-
consolidation: {
|
|
116
|
-
triggerIntervalMs: 3600000,
|
|
117
|
-
triggerEventCount: 100,
|
|
118
|
-
triggerIdleMs: 1800000,
|
|
119
|
-
useLLMSummarization: false
|
|
120
|
-
},
|
|
121
|
-
continuity: {
|
|
122
|
-
minScoreForSeamless: 0.7,
|
|
123
|
-
topicDecayHours: 48
|
|
124
|
-
}
|
|
125
|
-
};
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
const defaultFactories: Required<EndlessMemoryServicesFactories> = {
|
|
129
|
-
createWorkingSetStore: (eventStore, config) => createWorkingSetStore(eventStore, config) as WorkingSetStore,
|
|
130
|
-
createConsolidatedStore: (eventStore) => createConsolidatedStore(eventStore) as ConsolidatedStore,
|
|
131
|
-
createConsolidationWorker: (workingSetStore, consolidatedStore, config) => createConsolidationWorker(
|
|
132
|
-
workingSetStore as WorkingSetStore,
|
|
133
|
-
consolidatedStore as ConsolidatedStore,
|
|
134
|
-
config
|
|
135
|
-
) as ConsolidationWorker,
|
|
136
|
-
createContinuityManager: (eventStore, config) => createContinuityManager(eventStore, config) as ContinuityManager,
|
|
137
|
-
randomUUID
|
|
138
|
-
};
|
|
139
|
-
|
|
140
|
-
class DefaultEndlessMemoryServices implements EndlessMemoryServices {
|
|
141
|
-
private readonly factories: Required<EndlessMemoryServicesFactories>;
|
|
142
|
-
private workingSetStore: WorkingSetStorePort | null = null;
|
|
143
|
-
private consolidatedStore: ConsolidatedStorePort | null = null;
|
|
144
|
-
private consolidationWorker: ConsolidationWorkerPort | null = null;
|
|
145
|
-
private continuityManager: ContinuityManagerPort | null = null;
|
|
146
|
-
private mode: MemoryMode = 'session';
|
|
147
|
-
|
|
148
|
-
constructor(private readonly options: EndlessMemoryServicesOptions) {
|
|
149
|
-
this.factories = options.factories
|
|
150
|
-
? { ...options.factories, randomUUID: options.factories.randomUUID ?? randomUUID }
|
|
151
|
-
: defaultFactories;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
async initializeFromSavedMode(): Promise<void> {
|
|
155
|
-
const savedMode = await this.options.configStore.getEndlessConfig('mode') as MemoryMode | null;
|
|
156
|
-
if (savedMode === 'endless') {
|
|
157
|
-
this.mode = 'endless';
|
|
158
|
-
await this.initializeEndlessMode();
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
async initializeEndlessMode(): Promise<void> {
|
|
163
|
-
if (this.consolidationWorker) return;
|
|
164
|
-
|
|
165
|
-
const config = await this.getEndlessConfig();
|
|
166
|
-
const workingSetStore = this.factories.createWorkingSetStore(this.options.eventStore, config);
|
|
167
|
-
const consolidatedStore = this.factories.createConsolidatedStore(this.options.eventStore);
|
|
168
|
-
const consolidationWorker = this.factories.createConsolidationWorker(
|
|
169
|
-
workingSetStore,
|
|
170
|
-
consolidatedStore,
|
|
171
|
-
config
|
|
172
|
-
);
|
|
173
|
-
const continuityManager = this.factories.createContinuityManager(this.options.eventStore, config);
|
|
174
|
-
|
|
175
|
-
try {
|
|
176
|
-
consolidationWorker.start();
|
|
177
|
-
} catch (error) {
|
|
178
|
-
consolidationWorker.stop();
|
|
179
|
-
throw error;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
this.workingSetStore = workingSetStore;
|
|
183
|
-
this.consolidatedStore = consolidatedStore;
|
|
184
|
-
this.consolidationWorker = consolidationWorker;
|
|
185
|
-
this.continuityManager = continuityManager;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
async getEndlessConfig(): Promise<EndlessModeConfig> {
|
|
189
|
-
const savedConfig = await this.options.configStore.getEndlessConfig('config') as EndlessModeConfig | null;
|
|
190
|
-
return savedConfig || getDefaultEndlessConfig();
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
async setEndlessConfig(config: Partial<EndlessModeConfig>): Promise<void> {
|
|
194
|
-
const current = await this.getEndlessConfig();
|
|
195
|
-
const merged = { ...current, ...config };
|
|
196
|
-
await this.options.configStore.setEndlessConfig('config', merged);
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
async setMode(mode: MemoryMode): Promise<void> {
|
|
200
|
-
await this.options.initialize();
|
|
201
|
-
if (mode === this.mode) return;
|
|
202
|
-
|
|
203
|
-
this.mode = mode;
|
|
204
|
-
await this.options.configStore.setEndlessConfig('mode', mode);
|
|
205
|
-
|
|
206
|
-
if (mode === 'endless') {
|
|
207
|
-
await this.initializeEndlessMode();
|
|
208
|
-
} else {
|
|
209
|
-
this.stopEndlessMode();
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
getMode(): MemoryMode {
|
|
214
|
-
return this.mode;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
isEndlessModeActive(): boolean {
|
|
218
|
-
return this.mode === 'endless';
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
async addToWorkingSet(eventId: string, relevanceScore?: number): Promise<void> {
|
|
222
|
-
if (!this.workingSetStore) return;
|
|
223
|
-
await this.workingSetStore.add(eventId, relevanceScore);
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
async getWorkingSet(): Promise<WorkingSet | null> {
|
|
227
|
-
if (!this.workingSetStore) return null;
|
|
228
|
-
return this.workingSetStore.get();
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
async searchConsolidated(query: string, options?: { topK?: number }): Promise<ConsolidatedMemory[]> {
|
|
232
|
-
if (!this.consolidatedStore) return [];
|
|
233
|
-
return this.consolidatedStore.search(query, options);
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
async getConsolidatedMemories(limit?: number): Promise<ConsolidatedMemory[]> {
|
|
237
|
-
if (!this.consolidatedStore) return [];
|
|
238
|
-
return this.consolidatedStore.getAll({ limit });
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
async markMemoryAccessed(memoryId: string): Promise<void> {
|
|
242
|
-
if (!this.consolidatedStore) return;
|
|
243
|
-
await this.consolidatedStore.markAccessed(memoryId);
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
async calculateContinuity(
|
|
247
|
-
content: string,
|
|
248
|
-
metadata?: { files?: string[]; entities?: string[] }
|
|
249
|
-
): Promise<ContinuityScore | null> {
|
|
250
|
-
if (!this.continuityManager) return null;
|
|
251
|
-
const snapshot = this.continuityManager.createSnapshot(
|
|
252
|
-
this.factories.randomUUID(),
|
|
253
|
-
content,
|
|
254
|
-
metadata
|
|
255
|
-
);
|
|
256
|
-
return this.continuityManager.calculateScore(snapshot);
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
recordActivity(): void {
|
|
260
|
-
this.consolidationWorker?.recordActivity();
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
async forceConsolidation(): Promise<number> {
|
|
264
|
-
if (!this.consolidationWorker) return 0;
|
|
265
|
-
return this.consolidationWorker.forceRun();
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
async getEndlessModeStatus(): Promise<EndlessModeStatus> {
|
|
269
|
-
await this.options.initialize();
|
|
270
|
-
|
|
271
|
-
let workingSetSize = 0;
|
|
272
|
-
let continuityScore = 0.5;
|
|
273
|
-
let consolidatedCount = 0;
|
|
274
|
-
let lastConsolidation: Date | null = null;
|
|
275
|
-
|
|
276
|
-
if (this.workingSetStore) {
|
|
277
|
-
workingSetSize = await this.workingSetStore.count();
|
|
278
|
-
const workingSet = await this.workingSetStore.get();
|
|
279
|
-
continuityScore = workingSet.continuityScore;
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
if (this.consolidatedStore) {
|
|
283
|
-
consolidatedCount = await this.consolidatedStore.count();
|
|
284
|
-
lastConsolidation = await this.consolidatedStore.getLastConsolidationTime();
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
return {
|
|
288
|
-
mode: this.mode,
|
|
289
|
-
workingSetSize,
|
|
290
|
-
continuityScore,
|
|
291
|
-
consolidatedCount,
|
|
292
|
-
lastConsolidation
|
|
293
|
-
};
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
async formatEndlessContext(query: string): Promise<string> {
|
|
297
|
-
if (!this.isEndlessModeActive()) {
|
|
298
|
-
return '';
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
const workingSet = await this.getWorkingSet();
|
|
302
|
-
const consolidated = await this.searchConsolidated(query, { topK: 3 });
|
|
303
|
-
const continuity = await this.calculateContinuity(query);
|
|
304
|
-
|
|
305
|
-
const parts: string[] = [];
|
|
306
|
-
|
|
307
|
-
if (continuity) {
|
|
308
|
-
const statusEmoji = continuity.transitionType === 'seamless' ? '🔗' :
|
|
309
|
-
continuity.transitionType === 'topic_shift' ? '↪️' : '🆕';
|
|
310
|
-
parts.push(`${statusEmoji} Context: ${continuity.transitionType} (score: ${continuity.score.toFixed(2)})`);
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
if (workingSet && workingSet.recentEvents.length > 0) {
|
|
314
|
-
parts.push('\n## Recent Context (Working Set)');
|
|
315
|
-
const recent = workingSet.recentEvents.slice(0, 5);
|
|
316
|
-
for (const event of recent) {
|
|
317
|
-
const preview = event.content.slice(0, 80) + (event.content.length > 80 ? '...' : '');
|
|
318
|
-
const time = event.timestamp.toLocaleTimeString();
|
|
319
|
-
parts.push(`- ${time} [${event.eventType}] ${preview}`);
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
if (consolidated.length > 0) {
|
|
324
|
-
parts.push('\n## Related Knowledge (Consolidated)');
|
|
325
|
-
for (const memory of consolidated) {
|
|
326
|
-
parts.push(`- ${memory.topics.slice(0, 3).join(', ')}: ${memory.summary.slice(0, 100)}...`);
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
return parts.join('\n');
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
shutdown(): void {
|
|
334
|
-
this.stopEndlessMode();
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
private stopEndlessMode(): void {
|
|
338
|
-
if (this.consolidationWorker) {
|
|
339
|
-
this.consolidationWorker.stop();
|
|
340
|
-
}
|
|
341
|
-
this.workingSetStore = null;
|
|
342
|
-
this.consolidatedStore = null;
|
|
343
|
-
this.consolidationWorker = null;
|
|
344
|
-
this.continuityManager = null;
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
export function createEndlessMemoryServices(options: EndlessMemoryServicesOptions): EndlessMemoryServices {
|
|
349
|
-
return new DefaultEndlessMemoryServices(options);
|
|
350
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './endless-memory-services.js';
|