claude-memory-layer 1.0.30 → 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 +12 -5
- package/dist/cli/index.js +4 -3
- package/dist/cli/index.js.map +2 -2
- package/dist/core/index.js +3 -2
- package/dist/core/index.js.map +2 -2
- package/dist/hooks/post-tool-use.js +3 -2
- package/dist/hooks/post-tool-use.js.map +2 -2
- package/dist/hooks/semantic-daemon.js +3 -2
- package/dist/hooks/semantic-daemon.js.map +2 -2
- package/dist/hooks/session-end.js +3 -2
- package/dist/hooks/session-end.js.map +2 -2
- package/dist/hooks/session-start.js +3 -2
- package/dist/hooks/session-start.js.map +2 -2
- package/dist/hooks/stop.js +3 -2
- package/dist/hooks/stop.js.map +2 -2
- package/dist/hooks/user-prompt-submit.js +3 -2
- package/dist/hooks/user-prompt-submit.js.map +2 -2
- package/dist/index.js +3 -2
- package/dist/index.js.map +2 -2
- package/dist/mcp/index.js +3 -2
- package/dist/mcp/index.js.map +2 -2
- package/dist/server/api/index.js +3 -2
- package/dist/server/api/index.js.map +2 -2
- package/dist/server/index.js +3 -2
- package/dist/server/index.js.map +2 -2
- package/dist/services/memory-service.js +3 -2
- package/dist/services/memory-service.js.map +2 -2
- package/package.json +10 -3
- package/scripts/postinstall-embedding-backend.cjs +18 -16
- 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 -233
- 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 -175
- 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 -83
- 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,171 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Graduation Worker
|
|
3
|
-
* Periodically evaluates memory events for promotion to higher levels
|
|
4
|
-
* L0 → L1 → L2 → L3 → L4 based on access patterns and confidence
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import type { MemoryLevel } from './types.js';
|
|
8
|
-
import { EventStore } from './event-store.js';
|
|
9
|
-
import { GraduationPipeline } from './graduation.js';
|
|
10
|
-
|
|
11
|
-
export interface GraduationWorkerConfig {
|
|
12
|
-
/** How often to run graduation evaluation (ms) */
|
|
13
|
-
evaluationIntervalMs: number;
|
|
14
|
-
/** Batch size for graduation evaluation */
|
|
15
|
-
batchSize: number;
|
|
16
|
-
/** Minimum time between evaluations of the same event (ms) */
|
|
17
|
-
cooldownMs: number;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const DEFAULT_CONFIG: GraduationWorkerConfig = {
|
|
21
|
-
evaluationIntervalMs: 300000, // 5 minutes
|
|
22
|
-
batchSize: 50,
|
|
23
|
-
cooldownMs: 3600000 // 1 hour cooldown between evaluations
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
export class GraduationWorker {
|
|
27
|
-
private running = false;
|
|
28
|
-
private timeout: NodeJS.Timeout | null = null;
|
|
29
|
-
private lastEvaluated: Map<string, number> = new Map();
|
|
30
|
-
|
|
31
|
-
constructor(
|
|
32
|
-
private eventStore: EventStore,
|
|
33
|
-
private graduation: GraduationPipeline,
|
|
34
|
-
private config: GraduationWorkerConfig = DEFAULT_CONFIG
|
|
35
|
-
) {}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Start the graduation worker
|
|
39
|
-
*/
|
|
40
|
-
start(): void {
|
|
41
|
-
if (this.running) return;
|
|
42
|
-
this.running = true;
|
|
43
|
-
this.scheduleNext();
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Stop the graduation worker
|
|
48
|
-
*/
|
|
49
|
-
stop(): void {
|
|
50
|
-
this.running = false;
|
|
51
|
-
if (this.timeout) {
|
|
52
|
-
clearTimeout(this.timeout);
|
|
53
|
-
this.timeout = null;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Check if currently running
|
|
59
|
-
*/
|
|
60
|
-
isRunning(): boolean {
|
|
61
|
-
return this.running;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Force a graduation evaluation run
|
|
66
|
-
*/
|
|
67
|
-
async forceRun(): Promise<GraduationRunResult> {
|
|
68
|
-
return await this.runGraduation();
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Schedule the next graduation check
|
|
73
|
-
*/
|
|
74
|
-
private scheduleNext(): void {
|
|
75
|
-
if (!this.running) return;
|
|
76
|
-
|
|
77
|
-
this.timeout = setTimeout(
|
|
78
|
-
() => this.run(),
|
|
79
|
-
this.config.evaluationIntervalMs
|
|
80
|
-
);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Run graduation evaluation
|
|
85
|
-
*/
|
|
86
|
-
private async run(): Promise<void> {
|
|
87
|
-
if (!this.running) return;
|
|
88
|
-
|
|
89
|
-
try {
|
|
90
|
-
await this.runGraduation();
|
|
91
|
-
} catch (error) {
|
|
92
|
-
console.error('Graduation error:', error);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
this.scheduleNext();
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Perform graduation evaluation across all levels
|
|
100
|
-
*/
|
|
101
|
-
private async runGraduation(): Promise<GraduationRunResult> {
|
|
102
|
-
const result: GraduationRunResult = {
|
|
103
|
-
evaluated: 0,
|
|
104
|
-
graduated: 0,
|
|
105
|
-
byLevel: {}
|
|
106
|
-
};
|
|
107
|
-
|
|
108
|
-
const levels: MemoryLevel[] = ['L0', 'L1', 'L2', 'L3'];
|
|
109
|
-
const now = Date.now();
|
|
110
|
-
|
|
111
|
-
for (const level of levels) {
|
|
112
|
-
const events = await this.eventStore.getEventsByLevel(level, {
|
|
113
|
-
limit: this.config.batchSize
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
let levelGraduated = 0;
|
|
117
|
-
|
|
118
|
-
for (const event of events) {
|
|
119
|
-
// Check cooldown
|
|
120
|
-
const lastEval = this.lastEvaluated.get(event.id);
|
|
121
|
-
if (lastEval && (now - lastEval) < this.config.cooldownMs) {
|
|
122
|
-
continue;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
result.evaluated++;
|
|
126
|
-
this.lastEvaluated.set(event.id, now);
|
|
127
|
-
|
|
128
|
-
const gradResult = await this.graduation.evaluateGraduation(event.id, level);
|
|
129
|
-
|
|
130
|
-
if (gradResult.success) {
|
|
131
|
-
result.graduated++;
|
|
132
|
-
levelGraduated++;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
if (levelGraduated > 0) {
|
|
137
|
-
result.byLevel[level] = levelGraduated;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
// Clean up old cooldown entries (keep last 1000)
|
|
142
|
-
if (this.lastEvaluated.size > 1000) {
|
|
143
|
-
const entries = Array.from(this.lastEvaluated.entries());
|
|
144
|
-
entries.sort((a, b) => b[1] - a[1]);
|
|
145
|
-
this.lastEvaluated = new Map(entries.slice(0, 1000));
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
return result;
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
export interface GraduationRunResult {
|
|
153
|
-
evaluated: number;
|
|
154
|
-
graduated: number;
|
|
155
|
-
byLevel: Record<string, number>;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* Create a Graduation Worker instance
|
|
160
|
-
*/
|
|
161
|
-
export function createGraduationWorker(
|
|
162
|
-
eventStore: EventStore,
|
|
163
|
-
graduation: GraduationPipeline,
|
|
164
|
-
config?: Partial<GraduationWorkerConfig>
|
|
165
|
-
): GraduationWorker {
|
|
166
|
-
return new GraduationWorker(
|
|
167
|
-
eventStore,
|
|
168
|
-
graduation,
|
|
169
|
-
{ ...DEFAULT_CONFIG, ...config }
|
|
170
|
-
);
|
|
171
|
-
}
|
package/src/core/graduation.ts
DELETED
|
@@ -1,377 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Memory Graduation Pipeline - AXIOMMIND L0→L1→L2→L3→L4
|
|
3
|
-
*
|
|
4
|
-
* L0: EventStore (raw events, append-only)
|
|
5
|
-
* L1: Structured JSON (session summaries, patterns)
|
|
6
|
-
* L2: Type Candidates (Idris2-inspired, validated schemas)
|
|
7
|
-
* L3: Verified Knowledge (cross-session validated)
|
|
8
|
-
* L4: Active/Searchable (indexed, readily available)
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { EventStore } from './event-store.js';
|
|
12
|
-
import type {
|
|
13
|
-
MemoryEvent,
|
|
14
|
-
MemoryLevel,
|
|
15
|
-
GraduationResult,
|
|
16
|
-
Insight
|
|
17
|
-
} from './types.js';
|
|
18
|
-
|
|
19
|
-
export interface GraduationCriteria {
|
|
20
|
-
minAccessCount: number;
|
|
21
|
-
minConfidence: number;
|
|
22
|
-
minCrossSessionRefs: number;
|
|
23
|
-
maxAgeDays: number;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export interface LevelCriteria {
|
|
27
|
-
L0toL1: GraduationCriteria;
|
|
28
|
-
L1toL2: GraduationCriteria;
|
|
29
|
-
L2toL3: GraduationCriteria;
|
|
30
|
-
L3toL4: GraduationCriteria;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const DEFAULT_CRITERIA: LevelCriteria = {
|
|
34
|
-
L0toL1: {
|
|
35
|
-
minAccessCount: 1,
|
|
36
|
-
minConfidence: 0.5,
|
|
37
|
-
minCrossSessionRefs: 0,
|
|
38
|
-
maxAgeDays: 30
|
|
39
|
-
},
|
|
40
|
-
L1toL2: {
|
|
41
|
-
minAccessCount: 3,
|
|
42
|
-
minConfidence: 0.7,
|
|
43
|
-
minCrossSessionRefs: 1,
|
|
44
|
-
maxAgeDays: 60
|
|
45
|
-
},
|
|
46
|
-
L2toL3: {
|
|
47
|
-
minAccessCount: 5,
|
|
48
|
-
minConfidence: 0.85,
|
|
49
|
-
minCrossSessionRefs: 2,
|
|
50
|
-
maxAgeDays: 90
|
|
51
|
-
},
|
|
52
|
-
L3toL4: {
|
|
53
|
-
minAccessCount: 10,
|
|
54
|
-
minConfidence: 0.92,
|
|
55
|
-
minCrossSessionRefs: 3,
|
|
56
|
-
maxAgeDays: 180
|
|
57
|
-
}
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
export interface EventMetrics {
|
|
61
|
-
eventId: string;
|
|
62
|
-
accessCount: number;
|
|
63
|
-
lastAccessed: Date;
|
|
64
|
-
crossSessionRefs: number;
|
|
65
|
-
confidence: number;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export class GraduationPipeline {
|
|
69
|
-
private readonly eventStore: EventStore;
|
|
70
|
-
private readonly criteria: LevelCriteria;
|
|
71
|
-
private readonly metrics: Map<string, EventMetrics> = new Map();
|
|
72
|
-
|
|
73
|
-
constructor(
|
|
74
|
-
eventStore: EventStore,
|
|
75
|
-
criteria: Partial<LevelCriteria> = {}
|
|
76
|
-
) {
|
|
77
|
-
this.eventStore = eventStore;
|
|
78
|
-
this.criteria = {
|
|
79
|
-
L0toL1: { ...DEFAULT_CRITERIA.L0toL1, ...criteria.L0toL1 },
|
|
80
|
-
L1toL2: { ...DEFAULT_CRITERIA.L1toL2, ...criteria.L1toL2 },
|
|
81
|
-
L2toL3: { ...DEFAULT_CRITERIA.L2toL3, ...criteria.L2toL3 },
|
|
82
|
-
L3toL4: { ...DEFAULT_CRITERIA.L3toL4, ...criteria.L3toL4 }
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// Track which sessions have accessed each event
|
|
87
|
-
private readonly sessionAccesses: Map<string, Set<string>> = new Map();
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Record an access to an event (used for graduation scoring)
|
|
91
|
-
*/
|
|
92
|
-
recordAccess(eventId: string, fromSessionId: string, confidence: number = 1.0): void {
|
|
93
|
-
const existing = this.metrics.get(eventId);
|
|
94
|
-
|
|
95
|
-
// Track sessions that have accessed this event
|
|
96
|
-
if (!this.sessionAccesses.has(eventId)) {
|
|
97
|
-
this.sessionAccesses.set(eventId, new Set());
|
|
98
|
-
}
|
|
99
|
-
const sessions = this.sessionAccesses.get(eventId)!;
|
|
100
|
-
const isNewSession = !sessions.has(fromSessionId);
|
|
101
|
-
sessions.add(fromSessionId);
|
|
102
|
-
|
|
103
|
-
if (existing) {
|
|
104
|
-
existing.accessCount++;
|
|
105
|
-
existing.lastAccessed = new Date();
|
|
106
|
-
existing.confidence = Math.max(existing.confidence, confidence);
|
|
107
|
-
// Update cross-session references count
|
|
108
|
-
if (isNewSession && sessions.size > 1) {
|
|
109
|
-
existing.crossSessionRefs = sessions.size - 1;
|
|
110
|
-
}
|
|
111
|
-
} else {
|
|
112
|
-
this.metrics.set(eventId, {
|
|
113
|
-
eventId,
|
|
114
|
-
accessCount: 1,
|
|
115
|
-
lastAccessed: new Date(),
|
|
116
|
-
crossSessionRefs: 0,
|
|
117
|
-
confidence
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
/**
|
|
123
|
-
* Evaluate if an event should graduate to the next level
|
|
124
|
-
*/
|
|
125
|
-
async evaluateGraduation(eventId: string, currentLevel: MemoryLevel): Promise<GraduationResult> {
|
|
126
|
-
const metrics = this.metrics.get(eventId);
|
|
127
|
-
|
|
128
|
-
if (!metrics) {
|
|
129
|
-
return {
|
|
130
|
-
eventId,
|
|
131
|
-
fromLevel: currentLevel,
|
|
132
|
-
toLevel: currentLevel,
|
|
133
|
-
success: false,
|
|
134
|
-
reason: 'No metrics available for event'
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
const nextLevel = this.getNextLevel(currentLevel);
|
|
139
|
-
if (!nextLevel) {
|
|
140
|
-
return {
|
|
141
|
-
eventId,
|
|
142
|
-
fromLevel: currentLevel,
|
|
143
|
-
toLevel: currentLevel,
|
|
144
|
-
success: false,
|
|
145
|
-
reason: 'Already at maximum level'
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
const criteria = this.getCriteria(currentLevel, nextLevel);
|
|
150
|
-
const evaluation = this.checkCriteria(metrics, criteria);
|
|
151
|
-
|
|
152
|
-
if (evaluation.passed) {
|
|
153
|
-
// Update level in event store
|
|
154
|
-
await this.eventStore.updateMemoryLevel(eventId, nextLevel);
|
|
155
|
-
|
|
156
|
-
return {
|
|
157
|
-
eventId,
|
|
158
|
-
fromLevel: currentLevel,
|
|
159
|
-
toLevel: nextLevel,
|
|
160
|
-
success: true
|
|
161
|
-
};
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
return {
|
|
165
|
-
eventId,
|
|
166
|
-
fromLevel: currentLevel,
|
|
167
|
-
toLevel: currentLevel,
|
|
168
|
-
success: false,
|
|
169
|
-
reason: evaluation.reason
|
|
170
|
-
};
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Run graduation evaluation for all events at a given level
|
|
175
|
-
*/
|
|
176
|
-
async graduateBatch(level: MemoryLevel): Promise<GraduationResult[]> {
|
|
177
|
-
const results: GraduationResult[] = [];
|
|
178
|
-
|
|
179
|
-
for (const eventId of this.metrics.keys()) {
|
|
180
|
-
const result = await this.evaluateGraduation(eventId, level);
|
|
181
|
-
results.push(result);
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
return results;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
/**
|
|
188
|
-
* Extract insights from graduated events (L1+)
|
|
189
|
-
*/
|
|
190
|
-
extractInsights(events: MemoryEvent[]): Insight[] {
|
|
191
|
-
const insights: Insight[] = [];
|
|
192
|
-
|
|
193
|
-
// Pattern detection: Look for repeated themes
|
|
194
|
-
const patterns = this.detectPatterns(events);
|
|
195
|
-
for (const pattern of patterns) {
|
|
196
|
-
insights.push({
|
|
197
|
-
id: crypto.randomUUID(),
|
|
198
|
-
insightType: 'pattern',
|
|
199
|
-
content: pattern.description,
|
|
200
|
-
canonicalKey: pattern.key,
|
|
201
|
-
confidence: pattern.confidence,
|
|
202
|
-
sourceEvents: pattern.eventIds,
|
|
203
|
-
createdAt: new Date(),
|
|
204
|
-
lastUpdated: new Date()
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
// Preference detection: Look for user preferences
|
|
209
|
-
const preferences = this.detectPreferences(events);
|
|
210
|
-
for (const pref of preferences) {
|
|
211
|
-
insights.push({
|
|
212
|
-
id: crypto.randomUUID(),
|
|
213
|
-
insightType: 'preference',
|
|
214
|
-
content: pref.description,
|
|
215
|
-
canonicalKey: pref.key,
|
|
216
|
-
confidence: pref.confidence,
|
|
217
|
-
sourceEvents: pref.eventIds,
|
|
218
|
-
createdAt: new Date(),
|
|
219
|
-
lastUpdated: new Date()
|
|
220
|
-
});
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
return insights;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
/**
|
|
227
|
-
* Get the next level in the graduation pipeline
|
|
228
|
-
*/
|
|
229
|
-
private getNextLevel(current: MemoryLevel): MemoryLevel | null {
|
|
230
|
-
const levels: MemoryLevel[] = ['L0', 'L1', 'L2', 'L3', 'L4'];
|
|
231
|
-
const currentIndex = levels.indexOf(current);
|
|
232
|
-
|
|
233
|
-
if (currentIndex === -1 || currentIndex >= levels.length - 1) {
|
|
234
|
-
return null;
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
return levels[currentIndex + 1];
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
/**
|
|
241
|
-
* Get criteria for level transition
|
|
242
|
-
*/
|
|
243
|
-
private getCriteria(from: MemoryLevel, to: MemoryLevel): GraduationCriteria {
|
|
244
|
-
const key = `${from}to${to}` as keyof LevelCriteria;
|
|
245
|
-
return this.criteria[key] || DEFAULT_CRITERIA.L0toL1;
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
/**
|
|
249
|
-
* Check if metrics meet criteria
|
|
250
|
-
*/
|
|
251
|
-
private checkCriteria(
|
|
252
|
-
metrics: EventMetrics,
|
|
253
|
-
criteria: GraduationCriteria
|
|
254
|
-
): { passed: boolean; reason?: string } {
|
|
255
|
-
if (metrics.accessCount < criteria.minAccessCount) {
|
|
256
|
-
return {
|
|
257
|
-
passed: false,
|
|
258
|
-
reason: `Access count ${metrics.accessCount} < ${criteria.minAccessCount}`
|
|
259
|
-
};
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
if (metrics.confidence < criteria.minConfidence) {
|
|
263
|
-
return {
|
|
264
|
-
passed: false,
|
|
265
|
-
reason: `Confidence ${metrics.confidence} < ${criteria.minConfidence}`
|
|
266
|
-
};
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
if (metrics.crossSessionRefs < criteria.minCrossSessionRefs) {
|
|
270
|
-
return {
|
|
271
|
-
passed: false,
|
|
272
|
-
reason: `Cross-session refs ${metrics.crossSessionRefs} < ${criteria.minCrossSessionRefs}`
|
|
273
|
-
};
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
const ageDays = (Date.now() - metrics.lastAccessed.getTime()) / (1000 * 60 * 60 * 24);
|
|
277
|
-
if (ageDays > criteria.maxAgeDays) {
|
|
278
|
-
return {
|
|
279
|
-
passed: false,
|
|
280
|
-
reason: `Event too old: ${ageDays.toFixed(1)} days > ${criteria.maxAgeDays}`
|
|
281
|
-
};
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
return { passed: true };
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
/**
|
|
288
|
-
* Detect patterns in events
|
|
289
|
-
*/
|
|
290
|
-
private detectPatterns(events: MemoryEvent[]): Array<{
|
|
291
|
-
key: string;
|
|
292
|
-
description: string;
|
|
293
|
-
confidence: number;
|
|
294
|
-
eventIds: string[];
|
|
295
|
-
}> {
|
|
296
|
-
// Simple pattern detection: group by canonical key and look for repeats
|
|
297
|
-
const keyGroups = new Map<string, MemoryEvent[]>();
|
|
298
|
-
|
|
299
|
-
for (const event of events) {
|
|
300
|
-
const existing = keyGroups.get(event.canonicalKey) || [];
|
|
301
|
-
existing.push(event);
|
|
302
|
-
keyGroups.set(event.canonicalKey, existing);
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
const patterns: Array<{
|
|
306
|
-
key: string;
|
|
307
|
-
description: string;
|
|
308
|
-
confidence: number;
|
|
309
|
-
eventIds: string[];
|
|
310
|
-
}> = [];
|
|
311
|
-
|
|
312
|
-
for (const [key, groupEvents] of keyGroups) {
|
|
313
|
-
if (groupEvents.length >= 2) {
|
|
314
|
-
patterns.push({
|
|
315
|
-
key,
|
|
316
|
-
description: `Repeated topic: ${key.slice(0, 50)}`,
|
|
317
|
-
confidence: Math.min(1.0, groupEvents.length / 5),
|
|
318
|
-
eventIds: groupEvents.map(e => e.id)
|
|
319
|
-
});
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
return patterns;
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
/**
|
|
327
|
-
* Detect user preferences from events
|
|
328
|
-
*/
|
|
329
|
-
private detectPreferences(events: MemoryEvent[]): Array<{
|
|
330
|
-
key: string;
|
|
331
|
-
description: string;
|
|
332
|
-
confidence: number;
|
|
333
|
-
eventIds: string[];
|
|
334
|
-
}> {
|
|
335
|
-
// Simple preference detection: look for keywords
|
|
336
|
-
const preferenceKeywords = ['prefer', 'like', 'want', 'always', 'never', 'favorite'];
|
|
337
|
-
const preferences: Array<{
|
|
338
|
-
key: string;
|
|
339
|
-
description: string;
|
|
340
|
-
confidence: number;
|
|
341
|
-
eventIds: string[];
|
|
342
|
-
}> = [];
|
|
343
|
-
|
|
344
|
-
for (const event of events) {
|
|
345
|
-
if (event.eventType !== 'user_prompt') continue;
|
|
346
|
-
|
|
347
|
-
const lowerContent = event.content.toLowerCase();
|
|
348
|
-
for (const keyword of preferenceKeywords) {
|
|
349
|
-
if (lowerContent.includes(keyword)) {
|
|
350
|
-
preferences.push({
|
|
351
|
-
key: `preference_${keyword}_${event.id.slice(0, 8)}`,
|
|
352
|
-
description: `User preference: ${event.content.slice(0, 100)}`,
|
|
353
|
-
confidence: 0.7,
|
|
354
|
-
eventIds: [event.id]
|
|
355
|
-
});
|
|
356
|
-
break;
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
return preferences;
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
/**
|
|
365
|
-
* Get graduation statistics
|
|
366
|
-
*/
|
|
367
|
-
async getStats(): Promise<{ level: string; count: number }[]> {
|
|
368
|
-
return this.eventStore.getLevelStats();
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
/**
|
|
373
|
-
* Create graduation pipeline with default settings
|
|
374
|
-
*/
|
|
375
|
-
export function createGraduationPipeline(eventStore: EventStore): GraduationPipeline {
|
|
376
|
-
return new GraduationPipeline(eventStore);
|
|
377
|
-
}
|
package/src/core/index.ts
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Core module exports
|
|
3
|
-
* AXIOMMIND Memory Graduation Pipeline
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
// Types
|
|
7
|
-
export * from './types.js';
|
|
8
|
-
export * from './model/raw-event.js';
|
|
9
|
-
export * from './model/memory-fact.js';
|
|
10
|
-
export * from './model/memory-summary.js';
|
|
11
|
-
export * from './model/memory-rule.js';
|
|
12
|
-
export * from './model/retrieval-result.js';
|
|
13
|
-
|
|
14
|
-
// Registry
|
|
15
|
-
export * from './registry/project-path.js';
|
|
16
|
-
export * from './registry/session-registry.js';
|
|
17
|
-
|
|
18
|
-
// Engine
|
|
19
|
-
export * from './engine/index.js';
|
|
20
|
-
|
|
21
|
-
// Derivation
|
|
22
|
-
export * from './derive/index.js';
|
|
23
|
-
|
|
24
|
-
// Canonical Key (identity)
|
|
25
|
-
export * from './canonical-key.js';
|
|
26
|
-
|
|
27
|
-
// Storage
|
|
28
|
-
export * from './event-store.js';
|
|
29
|
-
export * from './sqlite-wrapper.js';
|
|
30
|
-
export * from './sqlite-event-store.js';
|
|
31
|
-
export * from './sync-worker.js';
|
|
32
|
-
export * from './mongo-sync-worker.js';
|
|
33
|
-
export * from './entity-repo.js';
|
|
34
|
-
export * from './edge-repo.js';
|
|
35
|
-
|
|
36
|
-
// Vector
|
|
37
|
-
export * from './vector-store.js';
|
|
38
|
-
export * from './embedder.js';
|
|
39
|
-
export * from './vector-worker.js';
|
|
40
|
-
export * from './vector-outbox.js';
|
|
41
|
-
|
|
42
|
-
// Product validation
|
|
43
|
-
export * from './product-validation-matrix.js';
|
|
44
|
-
|
|
45
|
-
// Matching & Alignment
|
|
46
|
-
export * from './matcher.js';
|
|
47
|
-
export * from './evidence-aligner.js';
|
|
48
|
-
|
|
49
|
-
// Retrieval & Graduation
|
|
50
|
-
export * from './retriever.js';
|
|
51
|
-
export * from './graduation.js';
|
|
52
|
-
export * from './graduation-worker.js';
|
|
53
|
-
|
|
54
|
-
// Task Entity System
|
|
55
|
-
export * from './task/index.js';
|
|
56
|
-
|
|
57
|
-
// Shared Store (Cross-Project Knowledge)
|
|
58
|
-
export * from './shared-event-store.js';
|
|
59
|
-
export * from './shared-store.js';
|
|
60
|
-
export * from './shared-vector-store.js';
|
|
61
|
-
export * from './shared-promoter.js';
|
|
62
|
-
|
|
63
|
-
// External read-only market context
|
|
64
|
-
export * from './external-market-context.js';
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import type { MemoryEventInput } from './types.js';
|
|
2
|
-
|
|
3
|
-
export type IngestStage = 'before' | 'after' | 'error';
|
|
4
|
-
|
|
5
|
-
export interface IngestContext {
|
|
6
|
-
stage: IngestStage;
|
|
7
|
-
operation: 'user_prompt' | 'agent_response' | 'session_summary' | 'tool_observation';
|
|
8
|
-
sessionId: string;
|
|
9
|
-
event: MemoryEventInput;
|
|
10
|
-
error?: Error;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export type IngestInterceptor = (context: IngestContext) => Promise<void> | void;
|
|
14
|
-
|
|
15
|
-
export class IngestInterceptorRegistry {
|
|
16
|
-
private before: IngestInterceptor[] = [];
|
|
17
|
-
private after: IngestInterceptor[] = [];
|
|
18
|
-
private onError: IngestInterceptor[] = [];
|
|
19
|
-
|
|
20
|
-
registerBefore(interceptor: IngestInterceptor): () => void {
|
|
21
|
-
this.before.push(interceptor);
|
|
22
|
-
return () => {
|
|
23
|
-
this.before = this.before.filter((i) => i !== interceptor);
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
registerAfter(interceptor: IngestInterceptor): () => void {
|
|
28
|
-
this.after.push(interceptor);
|
|
29
|
-
return () => {
|
|
30
|
-
this.after = this.after.filter((i) => i !== interceptor);
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
registerOnError(interceptor: IngestInterceptor): () => void {
|
|
35
|
-
this.onError.push(interceptor);
|
|
36
|
-
return () => {
|
|
37
|
-
this.onError = this.onError.filter((i) => i !== interceptor);
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
async run(stage: IngestStage, context: Omit<IngestContext, 'stage'>): Promise<void> {
|
|
42
|
-
const interceptors = stage === 'before'
|
|
43
|
-
? this.before
|
|
44
|
-
: stage === 'after'
|
|
45
|
-
? this.after
|
|
46
|
-
: this.onError;
|
|
47
|
-
|
|
48
|
-
for (const interceptor of interceptors) {
|
|
49
|
-
await interceptor({ ...context, stage });
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export function mergeHierarchicalMetadata(
|
|
55
|
-
base: Record<string, unknown> | undefined,
|
|
56
|
-
patch: Record<string, unknown> | undefined
|
|
57
|
-
): Record<string, unknown> | undefined {
|
|
58
|
-
if (!base && !patch) return undefined;
|
|
59
|
-
if (!base) return patch;
|
|
60
|
-
if (!patch) return base;
|
|
61
|
-
|
|
62
|
-
const result: Record<string, unknown> = { ...base };
|
|
63
|
-
|
|
64
|
-
for (const [key, value] of Object.entries(patch)) {
|
|
65
|
-
const current = result[key];
|
|
66
|
-
if (
|
|
67
|
-
typeof current === 'object' && current !== null && !Array.isArray(current) &&
|
|
68
|
-
typeof value === 'object' && value !== null && !Array.isArray(value)
|
|
69
|
-
) {
|
|
70
|
-
result[key] = mergeHierarchicalMetadata(
|
|
71
|
-
current as Record<string, unknown>,
|
|
72
|
-
value as Record<string, unknown>
|
|
73
|
-
);
|
|
74
|
-
} else {
|
|
75
|
-
result[key] = value;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
return result;
|
|
80
|
-
}
|