claude-memory-layer 1.0.31 → 1.0.33
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 +1110 -72
- package/dist/cli/index.js.map +4 -4
- package/dist/core/index.js +414 -25
- package/dist/core/index.js.map +2 -2
- package/dist/hooks/post-tool-use.js +416 -27
- package/dist/hooks/post-tool-use.js.map +2 -2
- package/dist/hooks/semantic-daemon.js +416 -27
- package/dist/hooks/semantic-daemon.js.map +2 -2
- package/dist/hooks/session-end.js +416 -27
- package/dist/hooks/session-end.js.map +2 -2
- package/dist/hooks/session-start.js +416 -27
- package/dist/hooks/session-start.js.map +2 -2
- package/dist/hooks/stop.js +416 -27
- package/dist/hooks/stop.js.map +2 -2
- package/dist/hooks/user-prompt-submit.js +504 -34
- package/dist/hooks/user-prompt-submit.js.map +2 -2
- package/dist/index.js +416 -27
- package/dist/index.js.map +2 -2
- package/dist/mcp/index.js +407 -32
- package/dist/mcp/index.js.map +2 -2
- package/dist/server/api/index.js +850 -44
- package/dist/server/api/index.js.map +3 -3
- package/dist/server/index.js +1073 -64
- package/dist/server/index.js.map +3 -3
- package/dist/services/memory-service.js +416 -27
- package/dist/services/memory-service.js.map +2 -2
- package/dist/ui/assets/js/bootstrap.js +2 -0
- package/dist/ui/assets/js/overview.js +166 -3
- package/dist/ui/assets/js/state.js +3 -0
- package/dist/ui/index.html +20 -0
- package/dist/ui/style.css +193 -0
- package/package.json +15 -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,360 +0,0 @@
|
|
|
1
|
-
import { readdir, stat } from 'node:fs/promises';
|
|
2
|
-
import * as path from 'node:path';
|
|
3
|
-
|
|
4
|
-
export interface SessionQrelsMemory {
|
|
5
|
-
id: string;
|
|
6
|
-
content: string;
|
|
7
|
-
sourceSessionId: string;
|
|
8
|
-
sourceTurnIndex: number;
|
|
9
|
-
timestamp?: string;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export type SessionQrelsExpectation = 'match' | 'no_match';
|
|
13
|
-
|
|
14
|
-
export interface SessionQrelsQuery {
|
|
15
|
-
queryId: string;
|
|
16
|
-
query: string;
|
|
17
|
-
expectedIds: string[];
|
|
18
|
-
expectedRelevance: Record<string, number>;
|
|
19
|
-
sourceSessionId: string;
|
|
20
|
-
sourceTurnIndex: number;
|
|
21
|
-
expectation?: SessionQrelsExpectation;
|
|
22
|
-
forbiddenIds?: string[];
|
|
23
|
-
knownAnswer?: string;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export interface SessionQrelsFixtureMetadata {
|
|
27
|
-
sourceFileCount?: number;
|
|
28
|
-
rawContentIncluded: boolean;
|
|
29
|
-
generatedAt?: string;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export interface SessionQrelsFixture {
|
|
33
|
-
name: string;
|
|
34
|
-
description: string;
|
|
35
|
-
ks: number[];
|
|
36
|
-
queries: SessionQrelsQuery[];
|
|
37
|
-
memories: SessionQrelsMemory[];
|
|
38
|
-
metadata?: SessionQrelsFixtureMetadata;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export interface SessionQrelsNoMatchQueryInput {
|
|
42
|
-
queryId?: string;
|
|
43
|
-
query: string;
|
|
44
|
-
forbiddenIds?: string[];
|
|
45
|
-
sourceSessionId?: string;
|
|
46
|
-
sourceTurnIndex?: number;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export interface SessionQrelsOptions {
|
|
50
|
-
name?: string;
|
|
51
|
-
description?: string;
|
|
52
|
-
ks?: number[];
|
|
53
|
-
maxQueries?: number;
|
|
54
|
-
redactContent?: boolean;
|
|
55
|
-
sourceFileCount?: number;
|
|
56
|
-
rawContentIncluded?: boolean;
|
|
57
|
-
generatedAt?: string;
|
|
58
|
-
noMatchQueries?: SessionQrelsNoMatchQueryInput[];
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export interface SessionQrelsFileCollectionOptions {
|
|
62
|
-
includeSubagents?: boolean;
|
|
63
|
-
maxFiles?: number;
|
|
64
|
-
minBytes?: number;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export interface SessionQrelsPerSessionSummary {
|
|
68
|
-
sourceSessionId: string;
|
|
69
|
-
queryCount: number;
|
|
70
|
-
memoryCount: number;
|
|
71
|
-
firstTurnIndex: number;
|
|
72
|
-
lastTurnIndex: number;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
export interface SessionQrelsSummary {
|
|
76
|
-
name: string;
|
|
77
|
-
description: string;
|
|
78
|
-
ks: number[];
|
|
79
|
-
queryCount: number;
|
|
80
|
-
positiveQueryCount: number;
|
|
81
|
-
noMatchQueryCount: number;
|
|
82
|
-
knownAnswerCount: number;
|
|
83
|
-
memoryCount: number;
|
|
84
|
-
sourceSessionCount: number;
|
|
85
|
-
sourceFileCount?: number;
|
|
86
|
-
rawContentIncluded: boolean;
|
|
87
|
-
perSession: SessionQrelsPerSessionSummary[];
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
interface ClaudeContentBlock {
|
|
91
|
-
type: string;
|
|
92
|
-
text?: string;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
type ClaudeMessageContent = string | ClaudeContentBlock[];
|
|
96
|
-
|
|
97
|
-
interface ClaudeJsonlEntry {
|
|
98
|
-
type?: string;
|
|
99
|
-
sessionId?: string;
|
|
100
|
-
timestamp?: string;
|
|
101
|
-
message?: {
|
|
102
|
-
role?: string;
|
|
103
|
-
content?: ClaudeMessageContent;
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
interface PendingPrompt {
|
|
108
|
-
sessionId: string;
|
|
109
|
-
text: string;
|
|
110
|
-
turnIndex: number;
|
|
111
|
-
timestamp?: string;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
export function buildSessionQrelsFixtureFromJsonl(
|
|
115
|
-
jsonl: string | string[],
|
|
116
|
-
options: SessionQrelsOptions = {}
|
|
117
|
-
): SessionQrelsFixture {
|
|
118
|
-
const lines = Array.isArray(jsonl) ? jsonl : jsonl.split(/\r?\n/);
|
|
119
|
-
const queries: SessionQrelsQuery[] = [];
|
|
120
|
-
const memories: SessionQrelsMemory[] = [];
|
|
121
|
-
const sessionCounters = new Map<string, number>();
|
|
122
|
-
const pendingBySession = new Map<string, PendingPrompt>();
|
|
123
|
-
|
|
124
|
-
for (const line of lines) {
|
|
125
|
-
if (options.maxQueries !== undefined && queries.length >= options.maxQueries) break;
|
|
126
|
-
const entry = parseEntry(line);
|
|
127
|
-
if (!entry) continue;
|
|
128
|
-
|
|
129
|
-
const sessionId = entry.sessionId || 'unknown-session';
|
|
130
|
-
const content = extractTextContent(entry.message?.content);
|
|
131
|
-
if (!content) continue;
|
|
132
|
-
|
|
133
|
-
if (entry.type === 'user') {
|
|
134
|
-
if (isWorthBenchmarkingPrompt(content)) {
|
|
135
|
-
const turnIndex = nextSessionCounter(sessionCounters, sessionId);
|
|
136
|
-
pendingBySession.set(sessionId, { sessionId, text: content, turnIndex, timestamp: entry.timestamp });
|
|
137
|
-
} else {
|
|
138
|
-
pendingBySession.delete(sessionId);
|
|
139
|
-
}
|
|
140
|
-
continue;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
if (entry.type === 'assistant') {
|
|
144
|
-
const pending = pendingBySession.get(sessionId);
|
|
145
|
-
if (!pending) continue;
|
|
146
|
-
|
|
147
|
-
const answer = content.trim();
|
|
148
|
-
if (answer.length === 0) continue;
|
|
149
|
-
const idSuffix = `${pending.sessionId}-${pending.turnIndex}`;
|
|
150
|
-
const memoryId = `m-${idSuffix}`;
|
|
151
|
-
const queryId = `q-${idSuffix}`;
|
|
152
|
-
const memoryContent = options.redactContent ? `[redacted memory ${memoryId}]` : answer;
|
|
153
|
-
memories.push({
|
|
154
|
-
id: memoryId,
|
|
155
|
-
content: memoryContent,
|
|
156
|
-
sourceSessionId: pending.sessionId,
|
|
157
|
-
sourceTurnIndex: pending.turnIndex,
|
|
158
|
-
timestamp: entry.timestamp ?? pending.timestamp
|
|
159
|
-
});
|
|
160
|
-
queries.push({
|
|
161
|
-
queryId,
|
|
162
|
-
query: options.redactContent ? `[redacted query ${queryId}]` : pending.text,
|
|
163
|
-
expectedIds: [memoryId],
|
|
164
|
-
expectedRelevance: { [memoryId]: 2 },
|
|
165
|
-
sourceSessionId: pending.sessionId,
|
|
166
|
-
sourceTurnIndex: pending.turnIndex,
|
|
167
|
-
expectation: 'match',
|
|
168
|
-
knownAnswer: memoryContent
|
|
169
|
-
});
|
|
170
|
-
pendingBySession.delete(sessionId);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
appendExplicitNoMatchQueries(queries, options);
|
|
175
|
-
|
|
176
|
-
const redactContent = options.redactContent === true;
|
|
177
|
-
const rawContentIncluded = options.rawContentIncluded ?? !redactContent;
|
|
178
|
-
|
|
179
|
-
return {
|
|
180
|
-
name: options.name ?? 'session-qrels-fixture',
|
|
181
|
-
description: options.description ?? 'Session-derived qrels fixture generated from Claude JSONL user/assistant turns.',
|
|
182
|
-
ks: options.ks ?? [1, 3, 5],
|
|
183
|
-
queries,
|
|
184
|
-
memories,
|
|
185
|
-
metadata: {
|
|
186
|
-
sourceFileCount: options.sourceFileCount,
|
|
187
|
-
rawContentIncluded,
|
|
188
|
-
generatedAt: options.generatedAt
|
|
189
|
-
}
|
|
190
|
-
};
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
export async function collectClaudeSessionJsonlFiles(
|
|
194
|
-
rootDir: string,
|
|
195
|
-
options: SessionQrelsFileCollectionOptions = {}
|
|
196
|
-
): Promise<string[]> {
|
|
197
|
-
const maxFiles = options.maxFiles ?? Number.POSITIVE_INFINITY;
|
|
198
|
-
const minBytes = options.minBytes ?? 0;
|
|
199
|
-
const files: string[] = [];
|
|
200
|
-
|
|
201
|
-
async function walk(dir: string): Promise<void> {
|
|
202
|
-
if (files.length >= maxFiles) return;
|
|
203
|
-
|
|
204
|
-
let entries;
|
|
205
|
-
try {
|
|
206
|
-
entries = await readdir(dir, { withFileTypes: true });
|
|
207
|
-
} catch {
|
|
208
|
-
return;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
entries.sort((a, b) => a.name.localeCompare(b.name));
|
|
212
|
-
|
|
213
|
-
for (const entry of entries) {
|
|
214
|
-
if (files.length >= maxFiles) return;
|
|
215
|
-
const fullPath = path.join(dir, entry.name);
|
|
216
|
-
if (entry.isDirectory()) {
|
|
217
|
-
if (!options.includeSubagents && entry.name.toLowerCase() === 'subagents') continue;
|
|
218
|
-
await walk(fullPath);
|
|
219
|
-
continue;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
if (!entry.isFile() || !entry.name.endsWith('.jsonl')) continue;
|
|
223
|
-
if (minBytes > 0) {
|
|
224
|
-
try {
|
|
225
|
-
const info = await stat(fullPath);
|
|
226
|
-
if (info.size < minBytes) continue;
|
|
227
|
-
} catch {
|
|
228
|
-
continue;
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
files.push(fullPath);
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
await walk(rootDir);
|
|
236
|
-
return files;
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
export function summarizeSessionQrelsFixture(fixture: SessionQrelsFixture): SessionQrelsSummary {
|
|
240
|
-
const bySession = new Map<string, SessionQrelsPerSessionSummary>();
|
|
241
|
-
|
|
242
|
-
function ensureSession(sourceSessionId: string, turnIndex: number): SessionQrelsPerSessionSummary {
|
|
243
|
-
const existing = bySession.get(sourceSessionId);
|
|
244
|
-
if (existing) {
|
|
245
|
-
existing.firstTurnIndex = Math.min(existing.firstTurnIndex, turnIndex);
|
|
246
|
-
existing.lastTurnIndex = Math.max(existing.lastTurnIndex, turnIndex);
|
|
247
|
-
return existing;
|
|
248
|
-
}
|
|
249
|
-
const created: SessionQrelsPerSessionSummary = {
|
|
250
|
-
sourceSessionId,
|
|
251
|
-
queryCount: 0,
|
|
252
|
-
memoryCount: 0,
|
|
253
|
-
firstTurnIndex: turnIndex,
|
|
254
|
-
lastTurnIndex: turnIndex
|
|
255
|
-
};
|
|
256
|
-
bySession.set(sourceSessionId, created);
|
|
257
|
-
return created;
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
for (const query of fixture.queries) {
|
|
261
|
-
ensureSession(query.sourceSessionId, query.sourceTurnIndex).queryCount += 1;
|
|
262
|
-
}
|
|
263
|
-
for (const memory of fixture.memories) {
|
|
264
|
-
ensureSession(memory.sourceSessionId, memory.sourceTurnIndex).memoryCount += 1;
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
const perSession = Array.from(bySession.values()).sort((a, b) => a.sourceSessionId.localeCompare(b.sourceSessionId));
|
|
268
|
-
|
|
269
|
-
const positiveQueryCount = fixture.queries.filter((query) => getQueryExpectation(query) === 'match').length;
|
|
270
|
-
const noMatchQueryCount = fixture.queries.filter((query) => getQueryExpectation(query) === 'no_match').length;
|
|
271
|
-
const knownAnswerCount = fixture.queries.filter((query) => typeof query.knownAnswer === 'string' && query.knownAnswer.length > 0).length;
|
|
272
|
-
|
|
273
|
-
return {
|
|
274
|
-
name: fixture.name,
|
|
275
|
-
description: fixture.description,
|
|
276
|
-
ks: fixture.ks,
|
|
277
|
-
queryCount: fixture.queries.length,
|
|
278
|
-
positiveQueryCount,
|
|
279
|
-
noMatchQueryCount,
|
|
280
|
-
knownAnswerCount,
|
|
281
|
-
memoryCount: fixture.memories.length,
|
|
282
|
-
sourceSessionCount: perSession.length,
|
|
283
|
-
sourceFileCount: fixture.metadata?.sourceFileCount,
|
|
284
|
-
rawContentIncluded: fixture.metadata?.rawContentIncluded ?? true,
|
|
285
|
-
perSession
|
|
286
|
-
};
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
function appendExplicitNoMatchQueries(
|
|
290
|
-
queries: SessionQrelsQuery[],
|
|
291
|
-
options: SessionQrelsOptions
|
|
292
|
-
): void {
|
|
293
|
-
const inputs = options.noMatchQueries ?? [];
|
|
294
|
-
if (inputs.length === 0) return;
|
|
295
|
-
|
|
296
|
-
const remaining = options.maxQueries === undefined
|
|
297
|
-
? Number.POSITIVE_INFINITY
|
|
298
|
-
: Math.max(0, options.maxQueries - queries.length);
|
|
299
|
-
|
|
300
|
-
const startIndex = queries.length;
|
|
301
|
-
inputs.slice(0, remaining).forEach((input, index) => {
|
|
302
|
-
const queryId = input.queryId ?? `q-no-match-${startIndex + index + 1}`;
|
|
303
|
-
queries.push({
|
|
304
|
-
queryId,
|
|
305
|
-
query: options.redactContent ? `[redacted query ${queryId}]` : input.query,
|
|
306
|
-
expectedIds: [],
|
|
307
|
-
expectedRelevance: {},
|
|
308
|
-
sourceSessionId: input.sourceSessionId ?? 'no-match',
|
|
309
|
-
sourceTurnIndex: input.sourceTurnIndex ?? 0,
|
|
310
|
-
expectation: 'no_match',
|
|
311
|
-
forbiddenIds: [...(input.forbiddenIds ?? [])]
|
|
312
|
-
});
|
|
313
|
-
});
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
function getQueryExpectation(query: SessionQrelsQuery): SessionQrelsExpectation {
|
|
317
|
-
return query.expectation ?? (query.expectedIds.length === 0 ? 'no_match' : 'match');
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
function parseEntry(line: string): ClaudeJsonlEntry | null {
|
|
321
|
-
const trimmed = line.trim();
|
|
322
|
-
if (!trimmed) return null;
|
|
323
|
-
try {
|
|
324
|
-
return JSON.parse(trimmed) as ClaudeJsonlEntry;
|
|
325
|
-
} catch {
|
|
326
|
-
return null;
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
function extractTextContent(content: ClaudeMessageContent | undefined): string | null {
|
|
331
|
-
if (!content) return null;
|
|
332
|
-
if (typeof content === 'string') return content.trim();
|
|
333
|
-
const texts = content
|
|
334
|
-
.filter((block) => block.type === 'text' && block.text)
|
|
335
|
-
.map((block) => block.text?.trim() ?? '')
|
|
336
|
-
.filter(Boolean);
|
|
337
|
-
return texts.length > 0 ? texts.join('\n') : null;
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
function isWorthBenchmarkingPrompt(content: string): boolean {
|
|
341
|
-
const trimmed = content.trim();
|
|
342
|
-
if (isClaudeLocalCommandArtifact(trimmed)) return false;
|
|
343
|
-
if (trimmed.startsWith('/')) return false;
|
|
344
|
-
if (trimmed.length < 15) return false;
|
|
345
|
-
return /[a-zA-Z가-힣]{2,}/.test(trimmed);
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
function isClaudeLocalCommandArtifact(content: string): boolean {
|
|
349
|
-
return (
|
|
350
|
-
/^<local-command-(stdout|stderr)>/.test(content) ||
|
|
351
|
-
/^<command-(name|message)>/.test(content) ||
|
|
352
|
-
(content.includes('<command-name>') && content.includes('<local-command-stdout>'))
|
|
353
|
-
);
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
function nextSessionCounter(counters: Map<string, number>, sessionId: string): number {
|
|
357
|
-
const next = (counters.get(sessionId) ?? 0) + 1;
|
|
358
|
-
counters.set(sessionId, next);
|
|
359
|
-
return next;
|
|
360
|
-
}
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SharedEventStore - Global database for cross-project knowledge
|
|
3
|
-
* Location: ~/.claude-code/memory/shared/
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
createDatabase,
|
|
8
|
-
dbRun,
|
|
9
|
-
dbClose,
|
|
10
|
-
type Database
|
|
11
|
-
} from './db-wrapper.js';
|
|
12
|
-
|
|
13
|
-
export class SharedEventStore {
|
|
14
|
-
private db: Database;
|
|
15
|
-
private initialized = false;
|
|
16
|
-
|
|
17
|
-
constructor(dbPath: string) {
|
|
18
|
-
this.db = createDatabase(dbPath);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
async initialize(): Promise<void> {
|
|
22
|
-
if (this.initialized) return;
|
|
23
|
-
|
|
24
|
-
// Shared troubleshooting entries table
|
|
25
|
-
await dbRun(this.db, `
|
|
26
|
-
CREATE TABLE IF NOT EXISTS shared_troubleshooting (
|
|
27
|
-
entry_id VARCHAR PRIMARY KEY,
|
|
28
|
-
source_project_hash VARCHAR NOT NULL,
|
|
29
|
-
source_entry_id VARCHAR NOT NULL,
|
|
30
|
-
title VARCHAR NOT NULL,
|
|
31
|
-
symptoms JSON NOT NULL,
|
|
32
|
-
root_cause TEXT NOT NULL,
|
|
33
|
-
solution TEXT NOT NULL,
|
|
34
|
-
topics JSON NOT NULL,
|
|
35
|
-
technologies JSON,
|
|
36
|
-
confidence REAL NOT NULL DEFAULT 0.8,
|
|
37
|
-
usage_count INTEGER DEFAULT 0,
|
|
38
|
-
last_used_at TIMESTAMP,
|
|
39
|
-
promoted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
40
|
-
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
41
|
-
UNIQUE(source_project_hash, source_entry_id)
|
|
42
|
-
)
|
|
43
|
-
`);
|
|
44
|
-
|
|
45
|
-
// Future extensibility: best practices table
|
|
46
|
-
await dbRun(this.db, `
|
|
47
|
-
CREATE TABLE IF NOT EXISTS shared_best_practices (
|
|
48
|
-
entry_id VARCHAR PRIMARY KEY,
|
|
49
|
-
source_project_hash VARCHAR NOT NULL,
|
|
50
|
-
source_entry_id VARCHAR NOT NULL,
|
|
51
|
-
title VARCHAR NOT NULL,
|
|
52
|
-
content_json JSON NOT NULL,
|
|
53
|
-
topics JSON NOT NULL,
|
|
54
|
-
confidence REAL NOT NULL DEFAULT 0.8,
|
|
55
|
-
usage_count INTEGER DEFAULT 0,
|
|
56
|
-
promoted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
57
|
-
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
58
|
-
UNIQUE(source_project_hash, source_entry_id)
|
|
59
|
-
)
|
|
60
|
-
`);
|
|
61
|
-
|
|
62
|
-
// Future extensibility: common errors table
|
|
63
|
-
await dbRun(this.db, `
|
|
64
|
-
CREATE TABLE IF NOT EXISTS shared_common_errors (
|
|
65
|
-
entry_id VARCHAR PRIMARY KEY,
|
|
66
|
-
source_project_hash VARCHAR NOT NULL,
|
|
67
|
-
source_entry_id VARCHAR NOT NULL,
|
|
68
|
-
title VARCHAR NOT NULL,
|
|
69
|
-
error_pattern TEXT NOT NULL,
|
|
70
|
-
solution TEXT NOT NULL,
|
|
71
|
-
topics JSON NOT NULL,
|
|
72
|
-
technologies JSON,
|
|
73
|
-
confidence REAL NOT NULL DEFAULT 0.8,
|
|
74
|
-
usage_count INTEGER DEFAULT 0,
|
|
75
|
-
promoted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
76
|
-
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
77
|
-
UNIQUE(source_project_hash, source_entry_id)
|
|
78
|
-
)
|
|
79
|
-
`);
|
|
80
|
-
|
|
81
|
-
// Indexes for troubleshooting
|
|
82
|
-
await dbRun(this.db, `
|
|
83
|
-
CREATE INDEX IF NOT EXISTS idx_shared_ts_confidence
|
|
84
|
-
ON shared_troubleshooting(confidence DESC)
|
|
85
|
-
`);
|
|
86
|
-
await dbRun(this.db, `
|
|
87
|
-
CREATE INDEX IF NOT EXISTS idx_shared_ts_usage
|
|
88
|
-
ON shared_troubleshooting(usage_count DESC)
|
|
89
|
-
`);
|
|
90
|
-
await dbRun(this.db, `
|
|
91
|
-
CREATE INDEX IF NOT EXISTS idx_shared_ts_source
|
|
92
|
-
ON shared_troubleshooting(source_project_hash)
|
|
93
|
-
`);
|
|
94
|
-
|
|
95
|
-
this.initialized = true;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
getDatabase(): Database {
|
|
99
|
-
return this.db;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
isInitialized(): boolean {
|
|
103
|
-
return this.initialized;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
async close(): Promise<void> {
|
|
107
|
-
await dbClose(this.db);
|
|
108
|
-
this.initialized = false;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
export function createSharedEventStore(dbPath: string): SharedEventStore {
|
|
113
|
-
return new SharedEventStore(dbPath);
|
|
114
|
-
}
|