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,116 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SQLite Wrapper with WAL Mode Support
|
|
3
|
-
* Primary store for hooks - always available, no lock conflicts
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import Database from 'better-sqlite3';
|
|
7
|
-
import * as fs from 'fs';
|
|
8
|
-
import * as nodePath from 'path';
|
|
9
|
-
|
|
10
|
-
export type SQLiteDatabase = Database.Database;
|
|
11
|
-
|
|
12
|
-
export interface SQLiteOptions {
|
|
13
|
-
readonly?: boolean;
|
|
14
|
-
walMode?: boolean;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Creates a new SQLite database with WAL mode
|
|
19
|
-
*/
|
|
20
|
-
export function createSQLiteDatabase(path: string, options?: SQLiteOptions): SQLiteDatabase {
|
|
21
|
-
// Ensure parent directory exists
|
|
22
|
-
const dir = nodePath.dirname(path);
|
|
23
|
-
if (!fs.existsSync(dir)) {
|
|
24
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const db = new Database(path, {
|
|
28
|
-
readonly: options?.readonly ?? false,
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
// Enable WAL mode for concurrent access (unless read-only)
|
|
32
|
-
if (!options?.readonly && (options?.walMode ?? true)) {
|
|
33
|
-
db.pragma('journal_mode = WAL');
|
|
34
|
-
db.pragma('synchronous = NORMAL');
|
|
35
|
-
db.pragma('busy_timeout = 5000');
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
return db;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Execute a statement that doesn't return rows (INSERT, UPDATE, DELETE)
|
|
43
|
-
*/
|
|
44
|
-
export function sqliteRun(
|
|
45
|
-
db: SQLiteDatabase,
|
|
46
|
-
sql: string,
|
|
47
|
-
params: unknown[] = []
|
|
48
|
-
): Database.RunResult {
|
|
49
|
-
const stmt = db.prepare(sql);
|
|
50
|
-
return stmt.run(...params);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Execute a query and return all rows
|
|
55
|
-
*/
|
|
56
|
-
export function sqliteAll<T = Record<string, unknown>>(
|
|
57
|
-
db: SQLiteDatabase,
|
|
58
|
-
sql: string,
|
|
59
|
-
params: unknown[] = []
|
|
60
|
-
): T[] {
|
|
61
|
-
const stmt = db.prepare(sql);
|
|
62
|
-
return stmt.all(...params) as T[];
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Execute a query and return first row
|
|
67
|
-
*/
|
|
68
|
-
export function sqliteGet<T = Record<string, unknown>>(
|
|
69
|
-
db: SQLiteDatabase,
|
|
70
|
-
sql: string,
|
|
71
|
-
params: unknown[] = []
|
|
72
|
-
): T | undefined {
|
|
73
|
-
const stmt = db.prepare(sql);
|
|
74
|
-
return stmt.get(...params) as T | undefined;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Execute multiple statements (for schema creation)
|
|
79
|
-
*/
|
|
80
|
-
export function sqliteExec(db: SQLiteDatabase, sql: string): void {
|
|
81
|
-
db.exec(sql);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Close database connection
|
|
86
|
-
*/
|
|
87
|
-
export function sqliteClose(db: SQLiteDatabase): void {
|
|
88
|
-
db.close();
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Run multiple statements in a transaction
|
|
93
|
-
*/
|
|
94
|
-
export function sqliteTransaction<T>(
|
|
95
|
-
db: SQLiteDatabase,
|
|
96
|
-
fn: () => T
|
|
97
|
-
): T {
|
|
98
|
-
return db.transaction(fn)();
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Safely converts a value to a Date object
|
|
103
|
-
*/
|
|
104
|
-
export function toDateFromSQLite(value: unknown): Date {
|
|
105
|
-
if (value instanceof Date) return value;
|
|
106
|
-
if (typeof value === 'string') return new Date(value);
|
|
107
|
-
if (typeof value === 'number') return new Date(value);
|
|
108
|
-
return new Date(String(value));
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* Convert Date to ISO string for SQLite storage
|
|
113
|
-
*/
|
|
114
|
-
export function toSQLiteTimestamp(date: Date): string {
|
|
115
|
-
return date.toISOString();
|
|
116
|
-
}
|
package/src/core/sync-worker.ts
DELETED
|
@@ -1,228 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Sync Worker - SQLite to DuckDB synchronization
|
|
3
|
-
* Runs periodically to sync primary store (SQLite) to analytics store (DuckDB)
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { SQLiteEventStore } from './sqlite-event-store.js';
|
|
7
|
-
import { EventStore } from './event-store.js';
|
|
8
|
-
import { MemoryEvent } from './types.js';
|
|
9
|
-
|
|
10
|
-
export interface SyncWorkerConfig {
|
|
11
|
-
intervalMs: number; // Sync interval (default: 30000 = 30 seconds)
|
|
12
|
-
batchSize: number; // Events per batch (default: 500)
|
|
13
|
-
maxRetries: number; // Max retries on failure (default: 3)
|
|
14
|
-
retryDelayMs: number; // Delay between retries (default: 5000)
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
const DEFAULT_CONFIG: SyncWorkerConfig = {
|
|
18
|
-
intervalMs: 30000,
|
|
19
|
-
batchSize: 500,
|
|
20
|
-
maxRetries: 3,
|
|
21
|
-
retryDelayMs: 5000
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
export interface SyncStats {
|
|
25
|
-
lastSyncAt: Date | null;
|
|
26
|
-
eventsSynced: number;
|
|
27
|
-
sessionsSynced: number;
|
|
28
|
-
errors: number;
|
|
29
|
-
status: 'idle' | 'syncing' | 'error' | 'stopped';
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export class SyncWorker {
|
|
33
|
-
private config: SyncWorkerConfig;
|
|
34
|
-
private intervalHandle: NodeJS.Timeout | null = null;
|
|
35
|
-
private running = false;
|
|
36
|
-
private stats: SyncStats = {
|
|
37
|
-
lastSyncAt: null,
|
|
38
|
-
eventsSynced: 0,
|
|
39
|
-
sessionsSynced: 0,
|
|
40
|
-
errors: 0,
|
|
41
|
-
status: 'idle'
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
constructor(
|
|
45
|
-
private sqliteStore: SQLiteEventStore,
|
|
46
|
-
private duckdbStore: EventStore,
|
|
47
|
-
config?: Partial<SyncWorkerConfig>
|
|
48
|
-
) {
|
|
49
|
-
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Start the sync worker
|
|
54
|
-
*/
|
|
55
|
-
start(): void {
|
|
56
|
-
if (this.running) return;
|
|
57
|
-
|
|
58
|
-
this.running = true;
|
|
59
|
-
this.stats.status = 'idle';
|
|
60
|
-
|
|
61
|
-
// Run initial sync
|
|
62
|
-
this.syncNow().catch(err => {
|
|
63
|
-
console.error('[SyncWorker] Initial sync failed:', err);
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
// Schedule periodic sync
|
|
67
|
-
this.intervalHandle = setInterval(() => {
|
|
68
|
-
this.syncNow().catch(err => {
|
|
69
|
-
console.error('[SyncWorker] Periodic sync failed:', err);
|
|
70
|
-
});
|
|
71
|
-
}, this.config.intervalMs);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Stop the sync worker
|
|
76
|
-
*/
|
|
77
|
-
stop(): void {
|
|
78
|
-
this.running = false;
|
|
79
|
-
this.stats.status = 'stopped';
|
|
80
|
-
|
|
81
|
-
if (this.intervalHandle) {
|
|
82
|
-
clearInterval(this.intervalHandle);
|
|
83
|
-
this.intervalHandle = null;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Trigger immediate sync
|
|
89
|
-
*/
|
|
90
|
-
async syncNow(): Promise<void> {
|
|
91
|
-
if (this.stats.status === 'syncing') {
|
|
92
|
-
return; // Already syncing
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
this.stats.status = 'syncing';
|
|
96
|
-
|
|
97
|
-
try {
|
|
98
|
-
await this.syncEvents();
|
|
99
|
-
await this.syncSessions();
|
|
100
|
-
this.stats.lastSyncAt = new Date();
|
|
101
|
-
this.stats.status = 'idle';
|
|
102
|
-
} catch (error) {
|
|
103
|
-
this.stats.errors++;
|
|
104
|
-
this.stats.status = 'error';
|
|
105
|
-
throw error;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Sync events from SQLite to DuckDB
|
|
111
|
-
*/
|
|
112
|
-
private async syncEvents(): Promise<void> {
|
|
113
|
-
const targetName = 'duckdb_analytics';
|
|
114
|
-
|
|
115
|
-
// Get last sync position from SQLite
|
|
116
|
-
const position = await this.sqliteStore.getSyncPosition(targetName);
|
|
117
|
-
const lastTimestamp = position.lastTimestamp || '1970-01-01T00:00:00.000Z';
|
|
118
|
-
|
|
119
|
-
let hasMore = true;
|
|
120
|
-
let totalSynced = 0;
|
|
121
|
-
|
|
122
|
-
while (hasMore) {
|
|
123
|
-
// Get batch of events since last sync
|
|
124
|
-
const events = await this.sqliteStore.getEventsSince(lastTimestamp, this.config.batchSize);
|
|
125
|
-
|
|
126
|
-
if (events.length === 0) {
|
|
127
|
-
hasMore = false;
|
|
128
|
-
break;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// Insert into DuckDB with retry
|
|
132
|
-
await this.retryWithBackoff(async () => {
|
|
133
|
-
for (const event of events) {
|
|
134
|
-
await this.insertEventToDuckDB(event);
|
|
135
|
-
}
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
totalSynced += events.length;
|
|
139
|
-
|
|
140
|
-
// Update sync position
|
|
141
|
-
const lastEvent = events[events.length - 1];
|
|
142
|
-
await this.sqliteStore.updateSyncPosition(
|
|
143
|
-
targetName,
|
|
144
|
-
lastEvent.id,
|
|
145
|
-
lastEvent.timestamp.toISOString()
|
|
146
|
-
);
|
|
147
|
-
|
|
148
|
-
// Check if we got a full batch (more to sync)
|
|
149
|
-
hasMore = events.length === this.config.batchSize;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
this.stats.eventsSynced += totalSynced;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
/**
|
|
156
|
-
* Sync sessions from SQLite to DuckDB
|
|
157
|
-
*/
|
|
158
|
-
private async syncSessions(): Promise<void> {
|
|
159
|
-
// Get all sessions from SQLite
|
|
160
|
-
const sessions = await this.sqliteStore.getAllSessions();
|
|
161
|
-
|
|
162
|
-
// Upsert each session to DuckDB
|
|
163
|
-
for (const session of sessions) {
|
|
164
|
-
await this.retryWithBackoff(async () => {
|
|
165
|
-
await this.duckdbStore.upsertSession(session);
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
this.stats.sessionsSynced = sessions.length;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/**
|
|
173
|
-
* Insert a single event into DuckDB
|
|
174
|
-
*/
|
|
175
|
-
private async insertEventToDuckDB(event: MemoryEvent): Promise<void> {
|
|
176
|
-
// Use append which handles deduplication
|
|
177
|
-
await this.duckdbStore.append({
|
|
178
|
-
eventType: event.eventType,
|
|
179
|
-
sessionId: event.sessionId,
|
|
180
|
-
timestamp: event.timestamp,
|
|
181
|
-
content: event.content,
|
|
182
|
-
metadata: event.metadata
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
/**
|
|
187
|
-
* Retry operation with exponential backoff
|
|
188
|
-
*/
|
|
189
|
-
private async retryWithBackoff<T>(fn: () => Promise<T>): Promise<T> {
|
|
190
|
-
let lastError: Error | null = null;
|
|
191
|
-
|
|
192
|
-
for (let attempt = 0; attempt < this.config.maxRetries; attempt++) {
|
|
193
|
-
try {
|
|
194
|
-
return await fn();
|
|
195
|
-
} catch (error) {
|
|
196
|
-
lastError = error instanceof Error ? error : new Error(String(error));
|
|
197
|
-
|
|
198
|
-
if (attempt < this.config.maxRetries - 1) {
|
|
199
|
-
const delay = this.config.retryDelayMs * Math.pow(2, attempt);
|
|
200
|
-
await this.sleep(delay);
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
throw lastError;
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
/**
|
|
209
|
-
* Sleep utility
|
|
210
|
-
*/
|
|
211
|
-
private sleep(ms: number): Promise<void> {
|
|
212
|
-
return new Promise(resolve => setTimeout(resolve, ms));
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
/**
|
|
216
|
-
* Get sync statistics
|
|
217
|
-
*/
|
|
218
|
-
getStats(): SyncStats {
|
|
219
|
-
return { ...this.stats };
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
/**
|
|
223
|
-
* Check if worker is running
|
|
224
|
-
*/
|
|
225
|
-
isRunning(): boolean {
|
|
226
|
-
return this.running;
|
|
227
|
-
}
|
|
228
|
-
}
|
package/src/core/tag-taxonomy.ts
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
export const TAG_NAMESPACES = {
|
|
2
|
-
SYSTEM: 'sys:',
|
|
3
|
-
QUALITY: 'q:',
|
|
4
|
-
PROJECT: 'proj:',
|
|
5
|
-
TOPIC: 'topic:',
|
|
6
|
-
TEMPORAL: 't:',
|
|
7
|
-
USER: 'user:',
|
|
8
|
-
AGENT: 'agent:'
|
|
9
|
-
} as const;
|
|
10
|
-
|
|
11
|
-
export const VALID_TAG_NAMESPACES = new Set<string>(Object.values(TAG_NAMESPACES));
|
|
12
|
-
|
|
13
|
-
export function parseTag(tag: string): { namespace?: string; value: string } {
|
|
14
|
-
const value = (tag || '').trim();
|
|
15
|
-
const idx = value.indexOf(':');
|
|
16
|
-
if (idx <= 0) return { value };
|
|
17
|
-
|
|
18
|
-
const namespace = `${value.slice(0, idx)}:`;
|
|
19
|
-
const tagValue = value.slice(idx + 1);
|
|
20
|
-
if (!tagValue) return { value };
|
|
21
|
-
|
|
22
|
-
return { namespace, value: tagValue };
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export function validateTag(tag: string): boolean {
|
|
26
|
-
const normalized = (tag || '').trim();
|
|
27
|
-
if (!normalized) return false;
|
|
28
|
-
|
|
29
|
-
const { namespace } = parseTag(normalized);
|
|
30
|
-
if (!namespace) return true; // backward compatibility for legacy tags
|
|
31
|
-
return VALID_TAG_NAMESPACES.has(namespace);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export function withNamespace(value: string, namespace: string): string {
|
|
35
|
-
const clean = parseTag(value).value.trim();
|
|
36
|
-
return `${namespace}${clean}`;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export function normalizeTags(tags: unknown): string[] {
|
|
40
|
-
if (!Array.isArray(tags)) return [];
|
|
41
|
-
|
|
42
|
-
const dedup = new Set<string>();
|
|
43
|
-
for (const item of tags) {
|
|
44
|
-
if (typeof item !== 'string') continue;
|
|
45
|
-
const normalized = item.trim();
|
|
46
|
-
if (!validateTag(normalized)) continue;
|
|
47
|
-
dedup.add(normalized);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
return [...dedup];
|
|
51
|
-
}
|