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,181 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Retrieval Analytics Service
|
|
3
|
-
*
|
|
4
|
-
* Owns retrieval telemetry read-model and helpfulness evaluation workflows so
|
|
5
|
-
* MemoryService can remain a thin facade over focused engine services.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import type { MemoryEvent } from '../types.js';
|
|
9
|
-
|
|
10
|
-
export interface RetrievalTraceStats {
|
|
11
|
-
totalQueries: number;
|
|
12
|
-
avgCandidateCount: number;
|
|
13
|
-
avgSelectedCount: number;
|
|
14
|
-
selectionRate: number;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export interface HelpfulnessStats {
|
|
18
|
-
avgScore: number;
|
|
19
|
-
totalEvaluated: number;
|
|
20
|
-
totalRetrievals: number;
|
|
21
|
-
helpful: number;
|
|
22
|
-
neutral: number;
|
|
23
|
-
unhelpful: number;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export interface HelpfulMemory {
|
|
27
|
-
eventId: string;
|
|
28
|
-
summary: string;
|
|
29
|
-
helpfulnessScore: number;
|
|
30
|
-
accessCount: number;
|
|
31
|
-
evaluationCount: number;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export interface RetrievalTraceDetail {
|
|
35
|
-
eventId: string;
|
|
36
|
-
score: number;
|
|
37
|
-
semanticScore?: number;
|
|
38
|
-
lexicalScore?: number;
|
|
39
|
-
recencyScore?: number;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export interface RetrievalTrace {
|
|
43
|
-
traceId: string;
|
|
44
|
-
sessionId?: string;
|
|
45
|
-
projectHash?: string;
|
|
46
|
-
queryText: string;
|
|
47
|
-
strategy?: string;
|
|
48
|
-
candidateEventIds: string[];
|
|
49
|
-
selectedEventIds: string[];
|
|
50
|
-
candidateDetails: RetrievalTraceDetail[];
|
|
51
|
-
selectedDetails: RetrievalTraceDetail[];
|
|
52
|
-
candidateCount: number;
|
|
53
|
-
selectedCount: number;
|
|
54
|
-
confidence?: string;
|
|
55
|
-
fallbackTrace: string[];
|
|
56
|
-
createdAt: Date;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export interface AccessedMemory {
|
|
60
|
-
memoryId: string;
|
|
61
|
-
summary: string;
|
|
62
|
-
topics: string[];
|
|
63
|
-
accessCount: number;
|
|
64
|
-
lastAccessed: string | null;
|
|
65
|
-
confidence: number;
|
|
66
|
-
createdAt: Date;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
type AccessedMemoryEvent = MemoryEvent & {
|
|
70
|
-
access_count?: number;
|
|
71
|
-
last_accessed_at?: string | null;
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
export interface RetrievalAnalyticsStore {
|
|
75
|
-
getRetrievalTraceStats(): Promise<RetrievalTraceStats>;
|
|
76
|
-
getRecentRetrievalTraces(limit?: number): Promise<RetrievalTrace[]>;
|
|
77
|
-
getMostAccessed(limit?: number): Promise<AccessedMemoryEvent[]>;
|
|
78
|
-
evaluateSessionHelpfulness(sessionId: string): Promise<void>;
|
|
79
|
-
getUnevaluatedSessions(currentSessionId: string, limit?: number): Promise<string[]>;
|
|
80
|
-
getHelpfulMemories(limit?: number): Promise<HelpfulMemory[]>;
|
|
81
|
-
getHelpfulnessStats(): Promise<HelpfulnessStats>;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
export interface RetrievalAnalyticsServiceDeps {
|
|
85
|
-
initialize: () => Promise<void>;
|
|
86
|
-
retrievalStore: RetrievalAnalyticsStore;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
export class RetrievalAnalyticsService {
|
|
90
|
-
constructor(private readonly deps: RetrievalAnalyticsServiceDeps) {}
|
|
91
|
-
|
|
92
|
-
async getRetrievalTraceStats(): Promise<RetrievalTraceStats> {
|
|
93
|
-
await this.deps.initialize();
|
|
94
|
-
return this.deps.retrievalStore.getRetrievalTraceStats();
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
async getRecentRetrievalTraces(limit: number = 50): Promise<RetrievalTrace[]> {
|
|
98
|
-
await this.deps.initialize();
|
|
99
|
-
return this.deps.retrievalStore.getRecentRetrievalTraces(limit);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
async getMostAccessedMemories(limit: number = 10): Promise<AccessedMemory[]> {
|
|
103
|
-
// Preserve the historical lightweight path: SQLiteEventStore.getMostAccessed()
|
|
104
|
-
// initializes itself and no-ops safely in read-only scenarios, so dashboard
|
|
105
|
-
// access summaries should not trigger vector/embedder/worker initialization.
|
|
106
|
-
const events = await this.deps.retrievalStore.getMostAccessed(limit);
|
|
107
|
-
|
|
108
|
-
return events.map((event) => ({
|
|
109
|
-
memoryId: event.id,
|
|
110
|
-
summary: event.content.substring(0, 200) + (event.content.length > 200 ? '...' : ''),
|
|
111
|
-
topics: this.extractTopicsFromContent(event.content),
|
|
112
|
-
accessCount: event.access_count || 0,
|
|
113
|
-
lastAccessed: event.last_accessed_at || null,
|
|
114
|
-
confidence: 1.0,
|
|
115
|
-
createdAt: event.timestamp,
|
|
116
|
-
}));
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
async evaluateSessionHelpfulness(sessionId: string): Promise<void> {
|
|
120
|
-
await this.deps.initialize();
|
|
121
|
-
await this.deps.retrievalStore.evaluateSessionHelpfulness(sessionId);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
async evaluatePendingSessions(currentSessionId: string, limit: number = 5): Promise<void> {
|
|
125
|
-
await this.deps.initialize();
|
|
126
|
-
const sessions = await this.deps.retrievalStore.getUnevaluatedSessions(currentSessionId, limit);
|
|
127
|
-
|
|
128
|
-
for (const sessionId of sessions) {
|
|
129
|
-
try {
|
|
130
|
-
await this.deps.retrievalStore.evaluateSessionHelpfulness(sessionId);
|
|
131
|
-
} catch {
|
|
132
|
-
// Best-effort backfill: one broken session should not block hook startup.
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
async getHelpfulMemories(limit: number = 10): Promise<HelpfulMemory[]> {
|
|
138
|
-
await this.deps.initialize();
|
|
139
|
-
return this.deps.retrievalStore.getHelpfulMemories(limit);
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
async getHelpfulnessStats(): Promise<HelpfulnessStats> {
|
|
143
|
-
await this.deps.initialize();
|
|
144
|
-
return this.deps.retrievalStore.getHelpfulnessStats();
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* Extract topic keywords from event content (markdown headings and key terms).
|
|
149
|
-
*/
|
|
150
|
-
private extractTopicsFromContent(content: string): string[] {
|
|
151
|
-
const topics: Set<string> = new Set();
|
|
152
|
-
|
|
153
|
-
const headings = content.match(/^#{1,3}\s+(.+)$/gm);
|
|
154
|
-
if (headings) {
|
|
155
|
-
for (const heading of headings.slice(0, 5)) {
|
|
156
|
-
const text = heading.replace(/^#+\s+/, '').replace(/[*_`#]/g, '').trim();
|
|
157
|
-
if (text.length > 2 && text.length < 50) {
|
|
158
|
-
topics.add(text);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
const boldTerms = content.match(/\*\*([^*]+)\*\*/g);
|
|
164
|
-
if (boldTerms) {
|
|
165
|
-
for (const boldTerm of boldTerms.slice(0, 5)) {
|
|
166
|
-
const text = boldTerm.replace(/\*\*/g, '').trim();
|
|
167
|
-
if (text.length > 2 && text.length < 30) {
|
|
168
|
-
topics.add(text);
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
return Array.from(topics).slice(0, 5);
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
export function createRetrievalAnalyticsService(
|
|
178
|
-
deps: RetrievalAnalyticsServiceDeps
|
|
179
|
-
): RetrievalAnalyticsService {
|
|
180
|
-
return new RetrievalAnalyticsService(deps);
|
|
181
|
-
}
|
|
@@ -1,420 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Retrieval Disclosure Service
|
|
3
|
-
*
|
|
4
|
-
* Provides a product-facing progressive disclosure surface on top of retrieval:
|
|
5
|
-
* search -> expand -> source. Search returns compact, spec-aligned result
|
|
6
|
-
* envelopes; expand adds surrounding context; source resolves to canonical raw
|
|
7
|
-
* events or other source references.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import type { RetrievalReason, RetrievalResultEnvelope, RetrievalResultType } from '../model/retrieval-result.js';
|
|
11
|
-
import type { UnifiedRetrievalResult, MemoryWithContext } from '../retriever.js';
|
|
12
|
-
import type { MemoryEvent, SharedTroubleshootingEntry } from '../types.js';
|
|
13
|
-
import type { RetrieveMemoriesOptions } from './retrieval-orchestrator.js';
|
|
14
|
-
|
|
15
|
-
export type RetrievalDisclosureResultType = RetrievalResultType;
|
|
16
|
-
export type RetrievalDisclosureReason = RetrievalReason;
|
|
17
|
-
export type RetrievalDisclosureEnvelope = RetrievalResultEnvelope;
|
|
18
|
-
export type RetrievalDisclosureSourceType =
|
|
19
|
-
| 'raw_event'
|
|
20
|
-
| 'transcript'
|
|
21
|
-
| 'tool_output'
|
|
22
|
-
| 'imported_history'
|
|
23
|
-
| 'shared_troubleshooting';
|
|
24
|
-
|
|
25
|
-
export interface RetrievalDisclosureSearchResponse {
|
|
26
|
-
results: RetrievalResultEnvelope[];
|
|
27
|
-
meta: {
|
|
28
|
-
total: number;
|
|
29
|
-
usedVector: boolean;
|
|
30
|
-
usedKeyword: boolean;
|
|
31
|
-
fallbackApplied: boolean;
|
|
32
|
-
confidence?: UnifiedRetrievalResult['matchResult']['confidence'];
|
|
33
|
-
totalTokens?: number;
|
|
34
|
-
fallbackTrace?: string[];
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export interface RetrievalDisclosureSourceReference {
|
|
39
|
-
sourceRef: string;
|
|
40
|
-
sourceType: RetrievalDisclosureSourceType;
|
|
41
|
-
eventIds: string[];
|
|
42
|
-
metadata?: Record<string, unknown>;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export interface RetrievalDisclosureExpansion {
|
|
46
|
-
target: RetrievalResultEnvelope;
|
|
47
|
-
surroundingFacts?: RetrievalResultEnvelope[];
|
|
48
|
-
summaries?: RetrievalResultEnvelope[];
|
|
49
|
-
relatedSources?: RetrievalDisclosureSourceReference[];
|
|
50
|
-
expandedContext?: string;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export interface RetrievalDisclosureSource extends RetrievalDisclosureSourceReference {
|
|
54
|
-
rawEvents: MemoryEvent[];
|
|
55
|
-
primaryEvent?: MemoryEvent;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export interface RetrievalDisclosureSearchOptions extends RetrieveMemoriesOptions {}
|
|
59
|
-
|
|
60
|
-
export interface RetrievalDisclosureExpandOptions {
|
|
61
|
-
windowSize?: number;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export interface RetrievalDisclosureOrchestrator {
|
|
65
|
-
retrieveMemories(
|
|
66
|
-
query: string,
|
|
67
|
-
options?: RetrievalDisclosureSearchOptions
|
|
68
|
-
): Promise<UnifiedRetrievalResult>;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export interface RetrievalDisclosureEventStore {
|
|
72
|
-
getEvent(id: string): Promise<MemoryEvent | null>;
|
|
73
|
-
getSessionEvents(sessionId: string): Promise<MemoryEvent[]>;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
export interface RetrievalDisclosureSharedStore {
|
|
77
|
-
get(entryId: string): Promise<SharedTroubleshootingEntry | null>;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
export interface RetrievalDisclosureServiceDeps {
|
|
81
|
-
initialize: () => Promise<void>;
|
|
82
|
-
retrievalOrchestrator: RetrievalDisclosureOrchestrator;
|
|
83
|
-
eventStore: RetrievalDisclosureEventStore;
|
|
84
|
-
sharedStore?: RetrievalDisclosureSharedStore;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
export class RetrievalDisclosureService {
|
|
88
|
-
constructor(private readonly deps: RetrievalDisclosureServiceDeps) {}
|
|
89
|
-
|
|
90
|
-
async search(
|
|
91
|
-
query: string,
|
|
92
|
-
options?: RetrievalDisclosureSearchOptions
|
|
93
|
-
): Promise<RetrievalDisclosureSearchResponse> {
|
|
94
|
-
const result = await this.deps.retrievalOrchestrator.retrieveMemories(query, options);
|
|
95
|
-
const debugByEventId = this.buildDebugIndex(result);
|
|
96
|
-
const projectResults = result.memories.map((memory) => this.memoryToEnvelope(
|
|
97
|
-
memory,
|
|
98
|
-
result,
|
|
99
|
-
debugByEventId.get(memory.event.id)
|
|
100
|
-
));
|
|
101
|
-
const sharedResults = (result.sharedMemories || []).map((entry) => this.sharedToEnvelope(entry));
|
|
102
|
-
const results = [...projectResults, ...sharedResults];
|
|
103
|
-
|
|
104
|
-
return {
|
|
105
|
-
results,
|
|
106
|
-
meta: {
|
|
107
|
-
total: results.length,
|
|
108
|
-
usedVector: this.usedVector(result),
|
|
109
|
-
usedKeyword: this.usedKeyword(result),
|
|
110
|
-
fallbackApplied: this.fallbackApplied(result),
|
|
111
|
-
confidence: result.matchResult.confidence,
|
|
112
|
-
totalTokens: result.totalTokens,
|
|
113
|
-
fallbackTrace: result.fallbackTrace || []
|
|
114
|
-
}
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
async expand(
|
|
119
|
-
resultId: string,
|
|
120
|
-
options?: RetrievalDisclosureExpandOptions
|
|
121
|
-
): Promise<RetrievalDisclosureExpansion | null> {
|
|
122
|
-
const parsedId = parseDisclosureResultRef(resultId);
|
|
123
|
-
if (parsedId.kind === 'shared') {
|
|
124
|
-
return this.expandShared(parsedId.entryId);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
const targetEvent = await this.deps.eventStore.getEvent(parsedId.eventId);
|
|
128
|
-
if (!targetEvent) return null;
|
|
129
|
-
|
|
130
|
-
const windowSize = Math.max(0, options?.windowSize ?? 3);
|
|
131
|
-
const sessionEvents = (await this.deps.eventStore.getSessionEvents(targetEvent.sessionId))
|
|
132
|
-
.slice()
|
|
133
|
-
.sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());
|
|
134
|
-
const targetIndex = sessionEvents.findIndex((event) => event.id === targetEvent.id);
|
|
135
|
-
const surroundingEvents = targetIndex === -1
|
|
136
|
-
? []
|
|
137
|
-
: sessionEvents.slice(
|
|
138
|
-
Math.max(0, targetIndex - windowSize),
|
|
139
|
-
Math.min(sessionEvents.length, targetIndex + windowSize + 1)
|
|
140
|
-
);
|
|
141
|
-
const nearbyEvents = surroundingEvents.length > 0 ? surroundingEvents : [targetEvent];
|
|
142
|
-
const nonTargetEvents = nearbyEvents.filter((event) => event.id !== targetEvent.id);
|
|
143
|
-
|
|
144
|
-
return {
|
|
145
|
-
target: this.eventToEnvelope(targetEvent, 1, ['continuity_link']),
|
|
146
|
-
surroundingFacts: nonTargetEvents.map((event) => this.eventToEnvelope(event, 1, this.reasonsForContextEvent(event))),
|
|
147
|
-
summaries: nonTargetEvents
|
|
148
|
-
.filter((event) => event.eventType === 'session_summary')
|
|
149
|
-
.map((event) => this.eventToEnvelope(event, 1, ['summary_fallback'])),
|
|
150
|
-
relatedSources: nearbyEvents.map((event) => this.sourceReferenceForEvent(event)),
|
|
151
|
-
expandedContext: this.formatTimelineContext(nearbyEvents)
|
|
152
|
-
};
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
async source(resultId: string): Promise<RetrievalDisclosureSource | null> {
|
|
156
|
-
const parsedId = parseDisclosureResultRef(resultId);
|
|
157
|
-
if (parsedId.kind === 'shared') {
|
|
158
|
-
return this.sourceShared(parsedId.entryId);
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
const rawEvent = await this.deps.eventStore.getEvent(parsedId.eventId);
|
|
162
|
-
if (!rawEvent) return null;
|
|
163
|
-
|
|
164
|
-
return {
|
|
165
|
-
...this.sourceReferenceForEvent(rawEvent),
|
|
166
|
-
rawEvents: [rawEvent],
|
|
167
|
-
primaryEvent: rawEvent
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
private async expandShared(entryId: string): Promise<RetrievalDisclosureExpansion | null> {
|
|
172
|
-
const entry = await this.deps.sharedStore?.get(entryId);
|
|
173
|
-
if (!entry) return null;
|
|
174
|
-
|
|
175
|
-
return {
|
|
176
|
-
target: this.sharedToEnvelope(entry),
|
|
177
|
-
surroundingFacts: [],
|
|
178
|
-
summaries: [],
|
|
179
|
-
relatedSources: [this.sourceReferenceForShared(entry)],
|
|
180
|
-
expandedContext: this.formatSharedContext(entry)
|
|
181
|
-
};
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
private async sourceShared(entryId: string): Promise<RetrievalDisclosureSource | null> {
|
|
185
|
-
const entry = await this.deps.sharedStore?.get(entryId);
|
|
186
|
-
if (!entry) return null;
|
|
187
|
-
|
|
188
|
-
const sourceReference = this.sourceReferenceForShared(entry);
|
|
189
|
-
return {
|
|
190
|
-
...sourceReference,
|
|
191
|
-
rawEvents: [],
|
|
192
|
-
metadata: {
|
|
193
|
-
...sourceReference.metadata,
|
|
194
|
-
symptoms: entry.symptoms,
|
|
195
|
-
rootCause: entry.rootCause,
|
|
196
|
-
solution: entry.solution,
|
|
197
|
-
technologies: entry.technologies,
|
|
198
|
-
confidence: entry.confidence,
|
|
199
|
-
usageCount: entry.usageCount
|
|
200
|
-
}
|
|
201
|
-
};
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
private memoryToEnvelope(
|
|
205
|
-
memory: MemoryWithContext,
|
|
206
|
-
result: UnifiedRetrievalResult,
|
|
207
|
-
debug?: RetrievalDebugDetail
|
|
208
|
-
): RetrievalResultEnvelope {
|
|
209
|
-
return this.eventToEnvelope(
|
|
210
|
-
memory.event,
|
|
211
|
-
memory.score,
|
|
212
|
-
this.inferReasons(memory, result, debug),
|
|
213
|
-
{
|
|
214
|
-
semanticScore: debug?.semanticScore,
|
|
215
|
-
lexicalScore: debug?.lexicalScore,
|
|
216
|
-
recencyScore: debug?.recencyScore
|
|
217
|
-
}
|
|
218
|
-
);
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
private eventToEnvelope(
|
|
222
|
-
event: MemoryEvent,
|
|
223
|
-
score: number,
|
|
224
|
-
reasons: RetrievalDisclosureReason[],
|
|
225
|
-
extraMetadata?: Record<string, unknown>
|
|
226
|
-
): RetrievalResultEnvelope {
|
|
227
|
-
return {
|
|
228
|
-
id: toDisclosureResultId(event.id),
|
|
229
|
-
resultType: this.resultTypeForEvent(event),
|
|
230
|
-
title: this.titleForEvent(event),
|
|
231
|
-
snippet: this.preview(event.content, 240),
|
|
232
|
-
score,
|
|
233
|
-
reasons,
|
|
234
|
-
sourceRef: toDisclosureResultId(event.id),
|
|
235
|
-
sessionId: event.sessionId,
|
|
236
|
-
metadata: {
|
|
237
|
-
eventId: event.id,
|
|
238
|
-
eventType: event.eventType,
|
|
239
|
-
timestamp: event.timestamp.toISOString(),
|
|
240
|
-
canonicalKey: event.canonicalKey,
|
|
241
|
-
...event.metadata,
|
|
242
|
-
...extraMetadata
|
|
243
|
-
}
|
|
244
|
-
};
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
private sharedToEnvelope(entry: SharedTroubleshootingEntry): RetrievalResultEnvelope {
|
|
248
|
-
return {
|
|
249
|
-
id: `shared:${entry.entryId}`,
|
|
250
|
-
resultType: 'rule',
|
|
251
|
-
title: entry.title,
|
|
252
|
-
snippet: this.preview(entry.solution || entry.rootCause || entry.symptoms.join(' '), 240),
|
|
253
|
-
score: entry.confidence,
|
|
254
|
-
reasons: ['semantic_match'],
|
|
255
|
-
sourceRef: `shared:${entry.entryId}`,
|
|
256
|
-
metadata: {
|
|
257
|
-
sourceProjectHash: entry.sourceProjectHash,
|
|
258
|
-
sourceEntryId: entry.sourceEntryId,
|
|
259
|
-
topics: entry.topics,
|
|
260
|
-
technologies: entry.technologies,
|
|
261
|
-
confidence: entry.confidence,
|
|
262
|
-
usageCount: entry.usageCount
|
|
263
|
-
}
|
|
264
|
-
};
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
private buildDebugIndex(result: UnifiedRetrievalResult): Map<string, RetrievalDebugDetail> {
|
|
268
|
-
const byEventId = new Map<string, RetrievalDebugDetail>();
|
|
269
|
-
|
|
270
|
-
for (const detail of result.candidateDebug || []) {
|
|
271
|
-
byEventId.set(detail.eventId, detail);
|
|
272
|
-
}
|
|
273
|
-
for (const detail of result.selectedDebug || []) {
|
|
274
|
-
byEventId.set(detail.eventId, detail);
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
return byEventId;
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
private inferReasons(
|
|
281
|
-
memory: MemoryWithContext,
|
|
282
|
-
result: UnifiedRetrievalResult,
|
|
283
|
-
debug?: RetrievalDebugDetail
|
|
284
|
-
): RetrievalDisclosureReason[] {
|
|
285
|
-
const reasons = new Set<RetrievalDisclosureReason>();
|
|
286
|
-
|
|
287
|
-
const usedVector = this.usedVector(result);
|
|
288
|
-
const usedKeyword = this.usedKeyword(result);
|
|
289
|
-
|
|
290
|
-
if (usedVector && (debug?.semanticScore ?? 0) > 0) reasons.add('semantic_match');
|
|
291
|
-
if ((debug?.lexicalScore ?? 0) > 0 || usedKeyword) reasons.add('keyword_match');
|
|
292
|
-
if ((debug?.recencyScore ?? 0) > 0) reasons.add('recent_relevance');
|
|
293
|
-
if ((result.fallbackTrace || []).some((step) => step === 'fallback:summary')) reasons.add('summary_fallback');
|
|
294
|
-
if (memory.sessionContext) reasons.add('continuity_link');
|
|
295
|
-
if (memory.event.eventType === 'tool_observation') reasons.add('tool_followup');
|
|
296
|
-
if (reasons.size === 0) reasons.add(usedVector ? 'semantic_match' : 'keyword_match');
|
|
297
|
-
|
|
298
|
-
return Array.from(reasons);
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
private reasonsForContextEvent(event: MemoryEvent): RetrievalDisclosureReason[] {
|
|
302
|
-
if (event.eventType === 'tool_observation') return ['tool_followup'];
|
|
303
|
-
if (event.eventType === 'session_summary') return ['summary_fallback'];
|
|
304
|
-
return ['continuity_link'];
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
private resultTypeForEvent(event: MemoryEvent): RetrievalDisclosureResultType {
|
|
308
|
-
if (event.eventType === 'session_summary') return 'summary';
|
|
309
|
-
if (event.eventType === 'tool_observation') return 'tool_evidence';
|
|
310
|
-
return 'source';
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
private sourceReferenceForEvent(event: MemoryEvent): RetrievalDisclosureSourceReference {
|
|
314
|
-
return {
|
|
315
|
-
sourceRef: toDisclosureResultId(event.id),
|
|
316
|
-
sourceType: this.sourceTypeForEvent(event),
|
|
317
|
-
eventIds: [event.id]
|
|
318
|
-
};
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
private sourceReferenceForShared(entry: SharedTroubleshootingEntry): RetrievalDisclosureSourceReference {
|
|
322
|
-
return {
|
|
323
|
-
sourceRef: `shared:${entry.entryId}`,
|
|
324
|
-
sourceType: 'shared_troubleshooting',
|
|
325
|
-
eventIds: [],
|
|
326
|
-
metadata: {
|
|
327
|
-
sourceProjectHash: entry.sourceProjectHash,
|
|
328
|
-
sourceEntryId: entry.sourceEntryId,
|
|
329
|
-
topics: entry.topics
|
|
330
|
-
}
|
|
331
|
-
};
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
private sourceTypeForEvent(event: MemoryEvent): RetrievalDisclosureSourceType {
|
|
335
|
-
const metadata = event.metadata || {};
|
|
336
|
-
if (event.eventType === 'tool_observation') return 'tool_output';
|
|
337
|
-
if (typeof metadata.transcriptPath === 'string') return 'transcript';
|
|
338
|
-
if (typeof metadata.importedFrom === 'string') return 'imported_history';
|
|
339
|
-
return 'raw_event';
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
private titleForEvent(event: MemoryEvent): string {
|
|
343
|
-
if (event.eventType === 'session_summary') return 'Session summary';
|
|
344
|
-
if (event.eventType === 'tool_observation') return 'Tool evidence';
|
|
345
|
-
if (event.eventType === 'agent_response') return 'Agent response';
|
|
346
|
-
return 'User prompt';
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
private usedVector(result: UnifiedRetrievalResult): boolean {
|
|
350
|
-
return (result.fallbackTrace || []).some((step) => step.includes(':deep'));
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
private usedKeyword(result: UnifiedRetrievalResult): boolean {
|
|
354
|
-
return (result.fallbackTrace || []).some((step) => step.includes(':fast')) ||
|
|
355
|
-
[...(result.selectedDebug || []), ...(result.candidateDebug || [])]
|
|
356
|
-
.some((detail) => (detail.lexicalScore ?? 0) > 0);
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
private fallbackApplied(result: UnifiedRetrievalResult): boolean {
|
|
360
|
-
return (result.fallbackTrace || []).some((step) => step.includes('fallback'));
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
private formatTimelineContext(events: MemoryEvent[]): string {
|
|
364
|
-
return events
|
|
365
|
-
.map((event) => `[${event.eventType}] ${event.content}`)
|
|
366
|
-
.join('\n\n');
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
private formatSharedContext(entry: SharedTroubleshootingEntry): string {
|
|
370
|
-
return [
|
|
371
|
-
`[shared_troubleshooting] ${entry.title}`,
|
|
372
|
-
`Symptoms: ${entry.symptoms.join('; ')}`,
|
|
373
|
-
`Root cause: ${entry.rootCause}`,
|
|
374
|
-
`Solution: ${entry.solution}`,
|
|
375
|
-
`Topics: ${entry.topics.join(', ')}`
|
|
376
|
-
].join('\n');
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
private preview(content: string, maxLength: number): string {
|
|
380
|
-
const normalized = content.replace(/\s+/g, ' ').trim();
|
|
381
|
-
if (normalized.length <= maxLength) return normalized;
|
|
382
|
-
return `${normalized.slice(0, Math.max(0, maxLength - 3))}...`;
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
interface RetrievalDebugDetail {
|
|
387
|
-
eventId: string;
|
|
388
|
-
score: number;
|
|
389
|
-
semanticScore?: number;
|
|
390
|
-
lexicalScore?: number;
|
|
391
|
-
recencyScore?: number;
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
export function toDisclosureResultId(eventId: string): string {
|
|
395
|
-
return eventId.startsWith('event:') ? eventId : `event:${eventId}`;
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
export type ParsedDisclosureResultId =
|
|
399
|
-
| { kind: 'event'; eventId: string }
|
|
400
|
-
| { kind: 'shared'; entryId: string };
|
|
401
|
-
|
|
402
|
-
export function parseDisclosureResultId(resultId: string): string {
|
|
403
|
-
return resultId.startsWith('event:') ? resultId.slice('event:'.length) : resultId;
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
export function parseDisclosureResultRef(resultId: string): ParsedDisclosureResultId {
|
|
407
|
-
if (resultId.startsWith('shared:')) {
|
|
408
|
-
return { kind: 'shared', entryId: resultId.slice('shared:'.length) };
|
|
409
|
-
}
|
|
410
|
-
return {
|
|
411
|
-
kind: 'event',
|
|
412
|
-
eventId: parseDisclosureResultId(resultId)
|
|
413
|
-
};
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
export function createRetrievalDisclosureService(
|
|
417
|
-
deps: RetrievalDisclosureServiceDeps
|
|
418
|
-
): RetrievalDisclosureService {
|
|
419
|
-
return new RetrievalDisclosureService(deps);
|
|
420
|
-
}
|