squish-memory 1.2.0 → 1.2.1
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/bin/squish-mcp.mjs +40 -42
- package/core/scheduler/cron-scheduler.ts +10 -1
- package/core/worker.ts +10 -1
- package/package.json +119 -119
- package/packages/mcp/src/index.ts +99 -36
- package/dist/config.d.ts +0 -106
- package/dist/config.js +0 -194
- package/dist/core/adapters/config/claude-code.d.ts +0 -45
- package/dist/core/adapters/config/claude-code.js +0 -113
- package/dist/core/adapters/config/cursor.d.ts +0 -26
- package/dist/core/adapters/config/cursor.js +0 -74
- package/dist/core/adapters/config/opencode.d.ts +0 -23
- package/dist/core/adapters/config/opencode.js +0 -73
- package/dist/core/adapters/config/windsurf.d.ts +0 -26
- package/dist/core/adapters/config/windsurf.js +0 -74
- package/dist/core/adapters/index.d.ts +0 -45
- package/dist/core/adapters/index.js +0 -84
- package/dist/core/adapters/scripts/install-adapter.d.ts +0 -19
- package/dist/core/adapters/scripts/install-adapter.js +0 -149
- package/dist/core/adapters/timeline.d.ts +0 -23
- package/dist/core/adapters/timeline.js +0 -88
- package/dist/core/adapters/types.d.ts +0 -137
- package/dist/core/adapters/types.js +0 -50
- package/dist/core/agent-preferences.d.ts +0 -16
- package/dist/core/agent-preferences.js +0 -124
- package/dist/core/algorithms/analytics/token-estimator.d.ts +0 -50
- package/dist/core/algorithms/analytics/token-estimator.js +0 -154
- package/dist/core/algorithms/detection/hash-filters.d.ts +0 -47
- package/dist/core/algorithms/detection/hash-filters.js +0 -190
- package/dist/core/algorithms/detection/semantic-ranker.d.ts +0 -32
- package/dist/core/algorithms/detection/semantic-ranker.js +0 -118
- package/dist/core/algorithms/detection/two-stage-detector.d.ts +0 -52
- package/dist/core/algorithms/detection/two-stage-detector.js +0 -299
- package/dist/core/algorithms/handlers/approve-merge.d.ts +0 -22
- package/dist/core/algorithms/handlers/approve-merge.js +0 -179
- package/dist/core/algorithms/handlers/detect-duplicates.d.ts +0 -47
- package/dist/core/algorithms/handlers/detect-duplicates.js +0 -145
- package/dist/core/algorithms/handlers/get-stats.d.ts +0 -39
- package/dist/core/algorithms/handlers/get-stats.js +0 -88
- package/dist/core/algorithms/handlers/list-proposals.d.ts +0 -45
- package/dist/core/algorithms/handlers/list-proposals.js +0 -83
- package/dist/core/algorithms/handlers/preview-merge.d.ts +0 -39
- package/dist/core/algorithms/handlers/preview-merge.js +0 -93
- package/dist/core/algorithms/handlers/reject-merge.d.ts +0 -28
- package/dist/core/algorithms/handlers/reject-merge.js +0 -69
- package/dist/core/algorithms/handlers/reverse-merge.d.ts +0 -21
- package/dist/core/algorithms/handlers/reverse-merge.js +0 -121
- package/dist/core/algorithms/index.d.ts +0 -21
- package/dist/core/algorithms/index.js +0 -26
- package/dist/core/algorithms/operations/cache-maintenance.d.ts +0 -12
- package/dist/core/algorithms/operations/cache-maintenance.js +0 -157
- package/dist/core/algorithms/safety/safety-checks.d.ts +0 -18
- package/dist/core/algorithms/safety/safety-checks.js +0 -179
- package/dist/core/algorithms/strategies/merge-strategies.d.ts +0 -50
- package/dist/core/algorithms/strategies/merge-strategies.js +0 -288
- package/dist/core/algorithms/types.d.ts +0 -125
- package/dist/core/algorithms/types.js +0 -5
- package/dist/core/algorithms/utils/response-builder.d.ts +0 -28
- package/dist/core/algorithms/utils/response-builder.js +0 -37
- package/dist/core/associations.d.ts +0 -33
- package/dist/core/associations.js +0 -284
- package/dist/core/autosave.d.ts +0 -19
- package/dist/core/autosave.js +0 -16
- package/dist/core/beliefs/decay.d.ts +0 -27
- package/dist/core/beliefs/decay.js +0 -217
- package/dist/core/beliefs/extractor.d.ts +0 -9
- package/dist/core/beliefs/extractor.js +0 -113
- package/dist/core/beliefs/store.d.ts +0 -46
- package/dist/core/beliefs/store.js +0 -466
- package/dist/core/beliefs/types.d.ts +0 -28
- package/dist/core/beliefs/types.js +0 -2
- package/dist/core/commands/mcp-server.d.ts +0 -2
- package/dist/core/commands/mcp-server.js +0 -6
- package/dist/core/commands/remember.d.ts +0 -24
- package/dist/core/commands/remember.js +0 -144
- package/dist/core/compression.d.ts +0 -45
- package/dist/core/compression.js +0 -160
- package/dist/core/consolidation.d.ts +0 -37
- package/dist/core/consolidation.js +0 -248
- package/dist/core/context/agent-context.d.ts +0 -106
- package/dist/core/context/agent-context.js +0 -274
- package/dist/core/context/context-paging.d.ts +0 -80
- package/dist/core/context/context-paging.js +0 -328
- package/dist/core/context/context-window.d.ts +0 -40
- package/dist/core/context/context-window.js +0 -177
- package/dist/core/context/context.d.ts +0 -7
- package/dist/core/context/context.js +0 -22
- package/dist/core/embeddings/embeddings.d.ts +0 -29
- package/dist/core/embeddings/embeddings.js +0 -546
- package/dist/core/embeddings/google-multimodal.d.ts +0 -14
- package/dist/core/embeddings/google-multimodal.js +0 -146
- package/dist/core/embeddings/local-embeddings.d.ts +0 -11
- package/dist/core/embeddings/local-embeddings.js +0 -11
- package/dist/core/embeddings/qmd-client.d.ts +0 -136
- package/dist/core/embeddings/qmd-client.js +0 -403
- package/dist/core/embeddings/transformers-local.d.ts +0 -64
- package/dist/core/embeddings/transformers-local.js +0 -213
- package/dist/core/embeddings.d.ts +0 -2
- package/dist/core/embeddings.js +0 -3
- package/dist/core/error-handling.d.ts +0 -63
- package/dist/core/error-handling.js +0 -173
- package/dist/core/graph/entity-deduplicator.d.ts +0 -24
- package/dist/core/graph/entity-deduplicator.js +0 -183
- package/dist/core/graph/graph-builder.d.ts +0 -46
- package/dist/core/graph/graph-builder.js +0 -174
- package/dist/core/graph/graph-traversal.d.ts +0 -80
- package/dist/core/graph/graph-traversal.js +0 -315
- package/dist/core/graph/index.d.ts +0 -19
- package/dist/core/graph/index.js +0 -13
- package/dist/core/graph/llm-entity-extractor.d.ts +0 -49
- package/dist/core/graph/llm-entity-extractor.js +0 -313
- package/dist/core/graph/multi-hop-retrieval.d.ts +0 -48
- package/dist/core/graph/multi-hop-retrieval.js +0 -215
- package/dist/core/graph/relationship-extractor.d.ts +0 -48
- package/dist/core/graph/relationship-extractor.js +0 -351
- package/dist/core/hooks/agent-hooks.d.ts +0 -83
- package/dist/core/hooks/agent-hooks.js +0 -521
- package/dist/core/hooks/auto-tagger.d.ts +0 -19
- package/dist/core/hooks/auto-tagger.js +0 -155
- package/dist/core/hooks/capture-filter.d.ts +0 -41
- package/dist/core/hooks/capture-filter.js +0 -128
- package/dist/core/hot-cache.d.ts +0 -86
- package/dist/core/hot-cache.js +0 -285
- package/dist/core/index.d.ts +0 -10
- package/dist/core/index.js +0 -11
- package/dist/core/ingestion/agent-memory.d.ts +0 -22
- package/dist/core/ingestion/agent-memory.js +0 -109
- package/dist/core/ingestion/core-memory.d.ts +0 -78
- package/dist/core/ingestion/core-memory.js +0 -226
- package/dist/core/ingestion/learnings.d.ts +0 -57
- package/dist/core/ingestion/learnings.js +0 -205
- package/dist/core/ingestion/signal-engine.d.ts +0 -41
- package/dist/core/ingestion/signal-engine.js +0 -201
- package/dist/core/integrations/obsidian-vault.d.ts +0 -31
- package/dist/core/integrations/obsidian-vault.js +0 -156
- package/dist/core/layers/generator.d.ts +0 -25
- package/dist/core/layers/generator.js +0 -76
- package/dist/core/lib/db-client.d.ts +0 -114
- package/dist/core/lib/db-client.js +0 -130
- package/dist/core/lib/parse-embedding.d.ts +0 -9
- package/dist/core/lib/parse-embedding.js +0 -58
- package/dist/core/lib/schemas.d.ts +0 -132
- package/dist/core/lib/schemas.js +0 -87
- package/dist/core/lib/types.d.ts +0 -45
- package/dist/core/lib/types.js +0 -6
- package/dist/core/lib/utils.d.ts +0 -18
- package/dist/core/lib/utils.js +0 -145
- package/dist/core/lib/validation.d.ts +0 -38
- package/dist/core/lib/validation.js +0 -151
- package/dist/core/lifecycle.d.ts +0 -25
- package/dist/core/lifecycle.js +0 -292
- package/dist/core/logger.d.ts +0 -17
- package/dist/core/logger.js +0 -46
- package/dist/core/mcp/client.d.ts +0 -17
- package/dist/core/mcp/client.js +0 -101
- package/dist/core/mcp/index.d.ts +0 -6
- package/dist/core/mcp/index.js +0 -6
- package/dist/core/mcp/server.d.ts +0 -18
- package/dist/core/mcp/server.js +0 -157
- package/dist/core/mcp/standalone-server.d.ts +0 -13
- package/dist/core/mcp/standalone-server.js +0 -46
- package/dist/core/mcp/tools.d.ts +0 -7
- package/dist/core/mcp/tools.js +0 -278
- package/dist/core/mcp/types.d.ts +0 -87
- package/dist/core/mcp/types.js +0 -48
- package/dist/core/memory/bridge-discovery.d.ts +0 -50
- package/dist/core/memory/bridge-discovery.js +0 -291
- package/dist/core/memory/categorizer.d.ts +0 -27
- package/dist/core/memory/categorizer.js +0 -306
- package/dist/core/memory/conflict-detector.d.ts +0 -7
- package/dist/core/memory/conflict-detector.js +0 -43
- package/dist/core/memory/consolidation.d.ts +0 -42
- package/dist/core/memory/consolidation.js +0 -277
- package/dist/core/memory/context-collector.d.ts +0 -10
- package/dist/core/memory/context-collector.js +0 -56
- package/dist/core/memory/contradiction-resolver.d.ts +0 -40
- package/dist/core/memory/contradiction-resolver.js +0 -368
- package/dist/core/memory/edit-workflow.d.ts +0 -19
- package/dist/core/memory/edit-workflow.js +0 -120
- package/dist/core/memory/entity-extractor.d.ts +0 -37
- package/dist/core/memory/entity-extractor.js +0 -350
- package/dist/core/memory/entity-resolver.d.ts +0 -23
- package/dist/core/memory/entity-resolver.js +0 -64
- package/dist/core/memory/explain.d.ts +0 -18
- package/dist/core/memory/explain.js +0 -92
- package/dist/core/memory/fact-deriver.d.ts +0 -31
- package/dist/core/memory/fact-deriver.js +0 -236
- package/dist/core/memory/fact-extractor.d.ts +0 -24
- package/dist/core/memory/fact-extractor.js +0 -89
- package/dist/core/memory/feedback-tracker.d.ts +0 -12
- package/dist/core/memory/feedback-tracker.js +0 -155
- package/dist/core/memory/hooks.d.ts +0 -88
- package/dist/core/memory/hooks.js +0 -174
- package/dist/core/memory/hybrid-retrieval.d.ts +0 -27
- package/dist/core/memory/hybrid-retrieval.js +0 -37
- package/dist/core/memory/hybrid-scorer.d.ts +0 -40
- package/dist/core/memory/hybrid-scorer.js +0 -267
- package/dist/core/memory/hybrid-search.d.ts +0 -23
- package/dist/core/memory/hybrid-search.js +0 -596
- package/dist/core/memory/importance.d.ts +0 -46
- package/dist/core/memory/importance.js +0 -241
- package/dist/core/memory/index.d.ts +0 -9
- package/dist/core/memory/index.js +0 -11
- package/dist/core/memory/loader.d.ts +0 -31
- package/dist/core/memory/loader.js +0 -141
- package/dist/core/memory/markdown/markdown-storage.d.ts +0 -72
- package/dist/core/memory/markdown/markdown-storage.js +0 -243
- package/dist/core/memory/memories.d.ts +0 -43
- package/dist/core/memory/memories.js +0 -452
- package/dist/core/memory/memory-lifecycle.d.ts +0 -8
- package/dist/core/memory/memory-lifecycle.js +0 -47
- package/dist/core/memory/memory-manager.d.ts +0 -15
- package/dist/core/memory/memory-manager.js +0 -46
- package/dist/core/memory/migrate.d.ts +0 -21
- package/dist/core/memory/migrate.js +0 -134
- package/dist/core/memory/normalization.d.ts +0 -7
- package/dist/core/memory/normalization.js +0 -26
- package/dist/core/memory/path-strengthener.d.ts +0 -39
- package/dist/core/memory/path-strengthener.js +0 -150
- package/dist/core/memory/progressive-disclosure.d.ts +0 -43
- package/dist/core/memory/progressive-disclosure.js +0 -280
- package/dist/core/memory/query-processor.d.ts +0 -21
- package/dist/core/memory/query-processor.js +0 -106
- package/dist/core/memory/query-rewriter.d.ts +0 -13
- package/dist/core/memory/query-rewriter.js +0 -118
- package/dist/core/memory/response-analyzer.d.ts +0 -9
- package/dist/core/memory/response-analyzer.js +0 -61
- package/dist/core/memory/retrieval-feedback.d.ts +0 -70
- package/dist/core/memory/retrieval-feedback.js +0 -213
- package/dist/core/memory/serialization.d.ts +0 -10
- package/dist/core/memory/serialization.js +0 -84
- package/dist/core/memory/stale-cleaner.d.ts +0 -26
- package/dist/core/memory/stale-cleaner.js +0 -97
- package/dist/core/memory/stats.d.ts +0 -32
- package/dist/core/memory/stats.js +0 -143
- package/dist/core/memory/telemetry.d.ts +0 -69
- package/dist/core/memory/telemetry.js +0 -313
- package/dist/core/memory/temporal-facts.d.ts +0 -41
- package/dist/core/memory/temporal-facts.js +0 -283
- package/dist/core/memory/temporal-parser.d.ts +0 -32
- package/dist/core/memory/temporal-parser.js +0 -385
- package/dist/core/memory/trigger-detector.d.ts +0 -21
- package/dist/core/memory/trigger-detector.js +0 -79
- package/dist/core/memory/write-gate.d.ts +0 -54
- package/dist/core/memory/write-gate.js +0 -210
- package/dist/core/places/index.d.ts +0 -14
- package/dist/core/places/index.js +0 -14
- package/dist/core/places/memory-places.d.ts +0 -68
- package/dist/core/places/memory-places.js +0 -261
- package/dist/core/places/places.d.ts +0 -88
- package/dist/core/places/places.js +0 -314
- package/dist/core/places/rules.d.ts +0 -74
- package/dist/core/places/rules.js +0 -240
- package/dist/core/places/walking.d.ts +0 -56
- package/dist/core/places/walking.js +0 -121
- package/dist/core/projects.d.ts +0 -17
- package/dist/core/projects.js +0 -116
- package/dist/core/redis.d.ts +0 -11
- package/dist/core/redis.js +0 -69
- package/dist/core/responses.d.ts +0 -96
- package/dist/core/responses.js +0 -122
- package/dist/core/runtime/trust-report.d.ts +0 -102
- package/dist/core/runtime/trust-report.js +0 -107
- package/dist/core/runtime/trust-state.d.ts +0 -12
- package/dist/core/runtime/trust-state.js +0 -309
- package/dist/core/scheduler/cron-scheduler.d.ts +0 -32
- package/dist/core/scheduler/cron-scheduler.js +0 -493
- package/dist/core/scheduler/heartbeat.d.ts +0 -11
- package/dist/core/scheduler/heartbeat.js +0 -73
- package/dist/core/scheduler/index.d.ts +0 -8
- package/dist/core/scheduler/index.js +0 -8
- package/dist/core/scheduler/job-runner.d.ts +0 -11
- package/dist/core/scheduler/job-runner.js +0 -164
- package/dist/core/search/conversations.d.ts +0 -25
- package/dist/core/search/conversations.js +0 -110
- package/dist/core/search/entities.d.ts +0 -12
- package/dist/core/search/entities.js +0 -31
- package/dist/core/search/folder-context.d.ts +0 -25
- package/dist/core/search/folder-context.js +0 -119
- package/dist/core/search/graph-boost.d.ts +0 -7
- package/dist/core/search/graph-boost.js +0 -23
- package/dist/core/search/index.d.ts +0 -4
- package/dist/core/search/index.js +0 -5
- package/dist/core/search/qmd-wrapper.d.ts +0 -36
- package/dist/core/search/qmd-wrapper.js +0 -58
- package/dist/core/security/encrypt.d.ts +0 -6
- package/dist/core/security/encrypt.js +0 -47
- package/dist/core/security/governance.d.ts +0 -26
- package/dist/core/security/governance.js +0 -79
- package/dist/core/security/privacy.d.ts +0 -23
- package/dist/core/security/privacy.js +0 -82
- package/dist/core/security/secret-detector.d.ts +0 -32
- package/dist/core/security/secret-detector.js +0 -88
- package/dist/core/session/auto-load.d.ts +0 -6
- package/dist/core/session/auto-load.js +0 -144
- package/dist/core/session/entity-tracker.d.ts +0 -62
- package/dist/core/session/entity-tracker.js +0 -287
- package/dist/core/session/index.d.ts +0 -7
- package/dist/core/session/index.js +0 -7
- package/dist/core/session/reference-resolver.d.ts +0 -26
- package/dist/core/session/reference-resolver.js +0 -121
- package/dist/core/session/self-iteration-job.d.ts +0 -35
- package/dist/core/session/self-iteration-job.js +0 -387
- package/dist/core/session/session-hooks.d.ts +0 -18
- package/dist/core/session/session-hooks.js +0 -58
- package/dist/core/session/types.d.ts +0 -26
- package/dist/core/session/types.js +0 -10
- package/dist/core/session/working-set.d.ts +0 -50
- package/dist/core/session/working-set.js +0 -212
- package/dist/core/snapshots/cleanup.d.ts +0 -9
- package/dist/core/snapshots/cleanup.js +0 -12
- package/dist/core/snapshots/comparison.d.ts +0 -19
- package/dist/core/snapshots/comparison.js +0 -43
- package/dist/core/snapshots/creation.d.ts +0 -13
- package/dist/core/snapshots/creation.js +0 -117
- package/dist/core/snapshots/retrieval.d.ts +0 -7
- package/dist/core/snapshots/retrieval.js +0 -41
- package/dist/core/snapshots/stats.d.ts +0 -11
- package/dist/core/snapshots/stats.js +0 -52
- package/dist/core/storage/cache.d.ts +0 -13
- package/dist/core/storage/cache.js +0 -202
- package/dist/core/storage/database.d.ts +0 -12
- package/dist/core/storage/database.js +0 -12
- package/dist/core/summarization/cleanup.d.ts +0 -9
- package/dist/core/summarization/cleanup.js +0 -12
- package/dist/core/summarization/queries.d.ts +0 -9
- package/dist/core/summarization/queries.js +0 -28
- package/dist/core/summarization/stats.d.ts +0 -14
- package/dist/core/summarization/stats.js +0 -52
- package/dist/core/summarization/strategies.d.ts +0 -24
- package/dist/core/summarization/strategies.js +0 -28
- package/dist/core/summarization.d.ts +0 -37
- package/dist/core/summarization.js +0 -188
- package/dist/core/temporal-facts.d.ts +0 -54
- package/dist/core/temporal-facts.js +0 -193
- package/dist/core/tracing/collector.d.ts +0 -111
- package/dist/core/tracing/collector.js +0 -350
- package/dist/core/tracing/visualizer.d.ts +0 -32
- package/dist/core/tracing/visualizer.js +0 -165
- package/dist/core/utils/cleanup-operations.d.ts +0 -13
- package/dist/core/utils/cleanup-operations.js +0 -44
- package/dist/core/utils/content-extraction.d.ts +0 -19
- package/dist/core/utils/content-extraction.js +0 -75
- package/dist/core/utils/filter-builder.d.ts +0 -13
- package/dist/core/utils/filter-builder.js +0 -44
- package/dist/core/utils/history-traversal.d.ts +0 -13
- package/dist/core/utils/history-traversal.js +0 -50
- package/dist/core/utils/memory-operations.d.ts +0 -17
- package/dist/core/utils/memory-operations.js +0 -43
- package/dist/core/utils/query-operations.d.ts +0 -18
- package/dist/core/utils/query-operations.js +0 -65
- package/dist/core/utils/summarization-helpers.d.ts +0 -17
- package/dist/core/utils/summarization-helpers.js +0 -33
- package/dist/core/utils/temporal-queries.d.ts +0 -13
- package/dist/core/utils/temporal-queries.js +0 -27
- package/dist/core/utils/vector-operations.d.ts +0 -71
- package/dist/core/utils/vector-operations.js +0 -129
- package/dist/core/utils/version-management.d.ts +0 -9
- package/dist/core/utils/version-management.js +0 -61
- package/dist/core/worker.d.ts +0 -82
- package/dist/core/worker.js +0 -272
- package/dist/db/adapter.d.ts +0 -7
- package/dist/db/adapter.js +0 -175
- package/dist/db/bootstrap.d.ts +0 -11
- package/dist/db/bootstrap.js +0 -1034
- package/dist/db/drizzle/schema-sqlite.d.ts +0 -5538
- package/dist/db/drizzle/schema-sqlite.js +0 -763
- package/dist/db/drizzle/schema.d.ts +0 -4734
- package/dist/db/drizzle/schema.js +0 -859
- package/dist/db/drizzle.config.d.ts +0 -3
- package/dist/db/drizzle.config.js +0 -12
- package/dist/db/index.d.ts +0 -7
- package/dist/db/index.js +0 -89
- package/dist/db/migrations/associations.d.ts +0 -6
- package/dist/db/migrations/associations.js +0 -29
- package/dist/db/migrations/beliefs.d.ts +0 -10
- package/dist/db/migrations/beliefs.js +0 -76
- package/dist/db/migrations/core-memory.d.ts +0 -6
- package/dist/db/migrations/core-memory.js +0 -29
- package/dist/db/migrations/fts.d.ts +0 -6
- package/dist/db/migrations/fts.js +0 -52
- package/dist/db/migrations/index.d.ts +0 -25
- package/dist/db/migrations/index.js +0 -51
- package/dist/db/migrations/indexes.d.ts +0 -6
- package/dist/db/migrations/indexes.js +0 -30
- package/dist/db/migrations/learnings.d.ts +0 -7
- package/dist/db/migrations/learnings.js +0 -26
- package/dist/db/migrations/maintenance.d.ts +0 -6
- package/dist/db/migrations/maintenance.js +0 -61
- package/dist/db/migrations/memories.d.ts +0 -7
- package/dist/db/migrations/memories.js +0 -16
- package/dist/db/migrations/memory-places.d.ts +0 -6
- package/dist/db/migrations/memory-places.js +0 -29
- package/dist/db/migrations/places.d.ts +0 -6
- package/dist/db/migrations/places.js +0 -43
- package/dist/db/migrations/projects.d.ts +0 -3
- package/dist/db/migrations/projects.js +0 -13
- package/dist/db/migrations/tier-conversion.d.ts +0 -7
- package/dist/db/migrations/tier-conversion.js +0 -20
- package/dist/db/neon.d.ts +0 -8
- package/dist/db/neon.js +0 -20
- package/dist/db/schema/beliefs.d.ts +0 -9
- package/dist/db/schema/beliefs.js +0 -46
- package/dist/db/schema/generator.d.ts +0 -38
- package/dist/db/schema/generator.js +0 -108
- package/dist/db/schema/index.d.ts +0 -39
- package/dist/db/schema/index.js +0 -51
- package/dist/db/schema/learnings.d.ts +0 -7
- package/dist/db/schema/learnings.js +0 -30
- package/dist/db/schema/memories.d.ts +0 -7
- package/dist/db/schema/memories.js +0 -81
- package/dist/db/schema/projects.d.ts +0 -4
- package/dist/db/schema/projects.js +0 -31
- package/dist/db/schema/tables/context-sessions.d.ts +0 -9
- package/dist/db/schema/tables/context-sessions.js +0 -37
- package/dist/db/schema/tables/conversations.d.ts +0 -9
- package/dist/db/schema/tables/conversations.js +0 -47
- package/dist/db/schema/tables/core-memory.d.ts +0 -9
- package/dist/db/schema/tables/core-memory.js +0 -41
- package/dist/db/schema/tables/entities.d.ts +0 -9
- package/dist/db/schema/tables/entities.js +0 -39
- package/dist/db/schema/tables/entity-relations.d.ts +0 -9
- package/dist/db/schema/tables/entity-relations.js +0 -31
- package/dist/db/schema/tables/learnings.d.ts +0 -9
- package/dist/db/schema/tables/learnings.js +0 -66
- package/dist/db/schema/tables/memories.d.ts +0 -9
- package/dist/db/schema/tables/memories.js +0 -161
- package/dist/db/schema/tables/memory-associations.d.ts +0 -9
- package/dist/db/schema/tables/memory-associations.js +0 -39
- package/dist/db/schema/tables/memory-hash-cache.d.ts +0 -9
- package/dist/db/schema/tables/memory-hash-cache.js +0 -29
- package/dist/db/schema/tables/memory-merge-history.d.ts +0 -9
- package/dist/db/schema/tables/memory-merge-history.js +0 -33
- package/dist/db/schema/tables/memory-merge-proposals.d.ts +0 -9
- package/dist/db/schema/tables/memory-merge-proposals.js +0 -39
- package/dist/db/schema/tables/messages.d.ts +0 -9
- package/dist/db/schema/tables/messages.js +0 -41
- package/dist/db/schema/tables/namespaces.d.ts +0 -9
- package/dist/db/schema/tables/namespaces.js +0 -37
- package/dist/db/schema/tables/projects.d.ts +0 -9
- package/dist/db/schema/tables/projects.js +0 -31
- package/dist/db/schema/tables/users.d.ts +0 -9
- package/dist/db/schema/tables/users.js +0 -27
- package/dist/db/schema.d.ts +0 -3
- package/dist/db/schema.js +0 -11
- package/dist/db/supabase.d.ts +0 -9
- package/dist/db/supabase.js +0 -24
- package/dist/packages/mcp/src/index.d.ts +0 -3
- package/dist/packages/mcp/src/index.js +0 -733
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Semantic ranking using embeddings (Stage 2 of two-stage detection).
|
|
3
|
-
* Ranks candidates from Stage 1 by semantic similarity using cosine distance.
|
|
4
|
-
*/
|
|
5
|
-
import { cosineSimilarity } from '../../../core/utils/vector-operations.js';
|
|
6
|
-
function calculateConfidence(memory1, memory2, cosineSim) {
|
|
7
|
-
if (cosineSim >= 0.90) {
|
|
8
|
-
const factors = calculateConfidenceFactors(memory1, memory2);
|
|
9
|
-
if (factors.sameType && factors.tagOverlap > 0.5) {
|
|
10
|
-
return 'high';
|
|
11
|
-
}
|
|
12
|
-
if (factors.sameType || factors.tagOverlap > 0.3) {
|
|
13
|
-
return 'high';
|
|
14
|
-
}
|
|
15
|
-
return 'medium';
|
|
16
|
-
}
|
|
17
|
-
if (cosineSim >= 0.80) {
|
|
18
|
-
const factors = calculateConfidenceFactors(memory1, memory2);
|
|
19
|
-
if (factors.sameType && factors.contentLengthSimilarity > 0.7) {
|
|
20
|
-
return 'medium';
|
|
21
|
-
}
|
|
22
|
-
return 'medium';
|
|
23
|
-
}
|
|
24
|
-
return 'low';
|
|
25
|
-
}
|
|
26
|
-
function calculateConfidenceFactors(memory1, memory2) {
|
|
27
|
-
const sameType = memory1.type === memory2.type;
|
|
28
|
-
const tags1 = new Set(memory1.tags || []);
|
|
29
|
-
const tags2 = new Set(memory2.tags || []);
|
|
30
|
-
const overlap = Array.from(tags1).filter((tag) => tags2.has(tag)).length;
|
|
31
|
-
const union = new Set([...tags1, ...tags2]).size;
|
|
32
|
-
const tagOverlap = union === 0 ? 0 : overlap / union;
|
|
33
|
-
const len1 = memory1.content.length;
|
|
34
|
-
const len2 = memory2.content.length;
|
|
35
|
-
const maxLen = Math.max(len1, len2);
|
|
36
|
-
const minLen = Math.min(len1, len2);
|
|
37
|
-
const contentLengthSimilarity = maxLen === 0 ? 1 : minLen / maxLen;
|
|
38
|
-
return {
|
|
39
|
-
sameType,
|
|
40
|
-
tagOverlap,
|
|
41
|
-
contentLengthSimilarity,
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
function generateMergeReason(memory1, memory2, cosineSim, confidenceLevel) {
|
|
45
|
-
const factors = calculateConfidenceFactors(memory1, memory2);
|
|
46
|
-
const parts = [];
|
|
47
|
-
parts.push(`Semantic similarity: ${(cosineSim * 100).toFixed(1)}%`);
|
|
48
|
-
if (factors.sameType) {
|
|
49
|
-
parts.push(`Same type (${memory1.type})`);
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
parts.push(`Different types (${memory1.type} vs ${memory2.type})`);
|
|
53
|
-
}
|
|
54
|
-
if (factors.tagOverlap > 0) {
|
|
55
|
-
parts.push(`${(factors.tagOverlap * 100).toFixed(0)}% tag overlap`);
|
|
56
|
-
}
|
|
57
|
-
const len1 = memory1.content.length;
|
|
58
|
-
const len2 = memory2.content.length;
|
|
59
|
-
const diffPercent = Math.abs(len1 - len2) / Math.max(len1, len2);
|
|
60
|
-
parts.push(`Content length difference: ${(diffPercent * 100).toFixed(0)}%`);
|
|
61
|
-
parts.push(`Confidence: ${confidenceLevel}`);
|
|
62
|
-
return parts.join(' • ');
|
|
63
|
-
}
|
|
64
|
-
export async function rankCandidates(candidates, memories, embeddings, options) {
|
|
65
|
-
const semanticThreshold = options.semanticThreshold ?? 0.85;
|
|
66
|
-
const topK = options.topK ?? 10;
|
|
67
|
-
const rankedCandidates = [];
|
|
68
|
-
for (const { memoryId1, memoryId2 } of candidates) {
|
|
69
|
-
const memory1 = memories.get(memoryId1);
|
|
70
|
-
const memory2 = memories.get(memoryId2);
|
|
71
|
-
const embedding1 = embeddings.get(memoryId1);
|
|
72
|
-
const embedding2 = embeddings.get(memoryId2);
|
|
73
|
-
if (!memory1 || !memory2 || !embedding1 || !embedding2) {
|
|
74
|
-
continue;
|
|
75
|
-
}
|
|
76
|
-
const similarity = cosineSimilarity(embedding1, embedding2);
|
|
77
|
-
if (similarity < semanticThreshold) {
|
|
78
|
-
continue;
|
|
79
|
-
}
|
|
80
|
-
const confidence = calculateConfidence(memory1, memory2, similarity);
|
|
81
|
-
const mergeReason = generateMergeReason(memory1, memory2, similarity, confidence);
|
|
82
|
-
rankedCandidates.push({
|
|
83
|
-
memoryId1,
|
|
84
|
-
memoryId2,
|
|
85
|
-
memory1,
|
|
86
|
-
memory2,
|
|
87
|
-
cosineSimilarity: similarity,
|
|
88
|
-
confidenceLevel: confidence,
|
|
89
|
-
mergeReason,
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
rankedCandidates.sort((a, b) => b.cosineSimilarity - a.cosineSimilarity);
|
|
93
|
-
const selectedByMemory = new Map();
|
|
94
|
-
const filtered = [];
|
|
95
|
-
for (const candidate of rankedCandidates) {
|
|
96
|
-
const count1 = (selectedByMemory.get(candidate.memoryId1) || 0) + 1;
|
|
97
|
-
const count2 = (selectedByMemory.get(candidate.memoryId2) || 0) + 1;
|
|
98
|
-
if (count1 <= topK && count2 <= topK) {
|
|
99
|
-
filtered.push(candidate);
|
|
100
|
-
selectedByMemory.set(candidate.memoryId1, count1);
|
|
101
|
-
selectedByMemory.set(candidate.memoryId2, count2);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
return filtered;
|
|
105
|
-
}
|
|
106
|
-
export function analyzePair(memory1, memory2, embedding1, embedding2) {
|
|
107
|
-
const similarity = cosineSimilarity(embedding1, embedding2);
|
|
108
|
-
const confidence = calculateConfidence(memory1, memory2, similarity);
|
|
109
|
-
const mergeReason = generateMergeReason(memory1, memory2, similarity, confidence);
|
|
110
|
-
const factors = calculateConfidenceFactors(memory1, memory2);
|
|
111
|
-
return {
|
|
112
|
-
cosineSimilarity: similarity,
|
|
113
|
-
confidenceLevel: confidence,
|
|
114
|
-
mergeReason,
|
|
115
|
-
factors,
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
//# sourceMappingURL=semantic-ranker.js.map
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Three-stage duplicate detection orchestrator.
|
|
3
|
-
* Stage 0: Exact match (content hash-based)
|
|
4
|
-
* Stage 1: Hash-based prefiltering (SimHash + MinHash)
|
|
5
|
-
* Stage 2: Semantic ranking using embeddings
|
|
6
|
-
*/
|
|
7
|
-
import type { Memory, MemoryType } from '../../../db/drizzle/schema.js';
|
|
8
|
-
import { analyzePair } from './semantic-ranker.js';
|
|
9
|
-
export interface MemoryPair {
|
|
10
|
-
memory1: Memory;
|
|
11
|
-
memory2: Memory;
|
|
12
|
-
similarityScore: number;
|
|
13
|
-
detectionMethod: 'exact' | 'simhash' | 'minhash' | 'embedding';
|
|
14
|
-
confidenceLevel: 'high' | 'medium' | 'low';
|
|
15
|
-
mergeReason: string;
|
|
16
|
-
}
|
|
17
|
-
export interface DetectionResult {
|
|
18
|
-
candidates: MemoryPair[];
|
|
19
|
-
stage0Time: number;
|
|
20
|
-
stage1Time: number;
|
|
21
|
-
stage2Time: number;
|
|
22
|
-
totalCandidates: number;
|
|
23
|
-
filteredCandidates: number;
|
|
24
|
-
statistics: {
|
|
25
|
-
totalMemories: number;
|
|
26
|
-
memoriesByType: Record<MemoryType, number>;
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
export interface DetectionOptions {
|
|
30
|
-
projectId?: string;
|
|
31
|
-
type?: MemoryType;
|
|
32
|
-
threshold?: number;
|
|
33
|
-
limit?: number;
|
|
34
|
-
simhashThreshold?: number;
|
|
35
|
-
minhashThreshold?: number;
|
|
36
|
-
stage1Only?: boolean;
|
|
37
|
-
stage0Only?: boolean;
|
|
38
|
-
}
|
|
39
|
-
export declare function detectDuplicates(options: DetectionOptions): Promise<DetectionResult>;
|
|
40
|
-
export declare function analyzeMergePair(memoryId1: string, memoryId2: string): Promise<{
|
|
41
|
-
memory1: Memory;
|
|
42
|
-
memory2: Memory;
|
|
43
|
-
analysis: ReturnType<typeof analyzePair>;
|
|
44
|
-
} | null>;
|
|
45
|
-
export declare function getDetectionStats(projectId: string): Promise<{
|
|
46
|
-
totalMemories: number;
|
|
47
|
-
mergeableMemories: number;
|
|
48
|
-
mergedMemories: number;
|
|
49
|
-
canonicalMemories: number;
|
|
50
|
-
memoriesByType: Record<MemoryType, number>;
|
|
51
|
-
}>;
|
|
52
|
-
//# sourceMappingURL=two-stage-detector.d.ts.map
|
|
@@ -1,299 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Three-stage duplicate detection orchestrator.
|
|
3
|
-
* Stage 0: Exact match (content hash-based)
|
|
4
|
-
* Stage 1: Hash-based prefiltering (SimHash + MinHash)
|
|
5
|
-
* Stage 2: Semantic ranking using embeddings
|
|
6
|
-
*/
|
|
7
|
-
import { getEmbedding, getBatchEmbeddings } from '../../../core/embeddings.js';
|
|
8
|
-
import { SimHashFilter, MinHashFilter, findCandidatePairs } from './hash-filters.js';
|
|
9
|
-
import { rankCandidates, analyzePair } from './semantic-ranker.js';
|
|
10
|
-
import { eq, and } from 'drizzle-orm';
|
|
11
|
-
import * as crypto from 'crypto';
|
|
12
|
-
import { getDbClient } from '../../../core/lib/db-client.js';
|
|
13
|
-
export async function detectDuplicates(options) {
|
|
14
|
-
const startTime = Date.now();
|
|
15
|
-
const { db, schema } = await getDbClient();
|
|
16
|
-
let query = db.select().from(schema.memories);
|
|
17
|
-
if (options.projectId) {
|
|
18
|
-
query = query.where(eq(schema.memories.projectId, options.projectId));
|
|
19
|
-
}
|
|
20
|
-
if (options.type) {
|
|
21
|
-
query = query.where(eq(schema.memories.type, options.type));
|
|
22
|
-
}
|
|
23
|
-
query = query.where(and(eq(schema.memories.isMerged, false), eq(schema.memories.isMergeable, true), eq(schema.memories.isActive, true)));
|
|
24
|
-
const memories = await query.execute();
|
|
25
|
-
if (memories.length < 2) {
|
|
26
|
-
return {
|
|
27
|
-
candidates: [],
|
|
28
|
-
stage0Time: 0,
|
|
29
|
-
stage1Time: 0,
|
|
30
|
-
stage2Time: 0,
|
|
31
|
-
totalCandidates: 0,
|
|
32
|
-
filteredCandidates: 0,
|
|
33
|
-
statistics: {
|
|
34
|
-
totalMemories: memories.length,
|
|
35
|
-
memoriesByType: countByType(memories),
|
|
36
|
-
},
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
const memoriesById = new Map(memories.map((m) => [m.id, m]));
|
|
40
|
-
const contentById = new Map(memories.map((m) => [m.id, m.content]));
|
|
41
|
-
// Stage 0: Exact match using content hash
|
|
42
|
-
const stage0Start = Date.now();
|
|
43
|
-
const stage0Candidates = [];
|
|
44
|
-
// Group memories by content hash for exact matching
|
|
45
|
-
const contentHashGroups = new Map();
|
|
46
|
-
for (const memory of memories) {
|
|
47
|
-
const contentHash = crypto.createHash('md5').update(memory.content).digest('hex');
|
|
48
|
-
if (!contentHashGroups.has(contentHash)) {
|
|
49
|
-
contentHashGroups.set(contentHash, []);
|
|
50
|
-
}
|
|
51
|
-
contentHashGroups.get(contentHash).push(memory.id);
|
|
52
|
-
}
|
|
53
|
-
// Create pairs from each group with same content
|
|
54
|
-
for (const [hash, ids] of contentHashGroups.entries()) {
|
|
55
|
-
if (ids.length >= 2) {
|
|
56
|
-
// Create all unique pairs within this group
|
|
57
|
-
for (let i = 0; i < ids.length; i++) {
|
|
58
|
-
for (let j = i + 1; j < ids.length; j++) {
|
|
59
|
-
stage0Candidates.push({ memoryId1: ids[i], memoryId2: ids[j] });
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
const stage0Time = Date.now() - stage0Start;
|
|
65
|
-
// If we only want exact matches for testing, return early
|
|
66
|
-
if (options.stage0Only) {
|
|
67
|
-
const exactMatchCandidates = stage0Candidates.map(pair => ({
|
|
68
|
-
memory1: memoriesById.get(pair.memoryId1),
|
|
69
|
-
memory2: memoriesById.get(pair.memoryId2),
|
|
70
|
-
similarityScore: 1.0, // Exact match = 1.0 similarity
|
|
71
|
-
detectionMethod: 'exact',
|
|
72
|
-
confidenceLevel: 'high',
|
|
73
|
-
mergeReason: 'Exact content match',
|
|
74
|
-
}));
|
|
75
|
-
return {
|
|
76
|
-
candidates: exactMatchCandidates.slice(0, options.limit ?? 50),
|
|
77
|
-
stage0Time,
|
|
78
|
-
stage1Time: 0,
|
|
79
|
-
stage2Time: 0,
|
|
80
|
-
totalCandidates: stage0Candidates.length,
|
|
81
|
-
filteredCandidates: exactMatchCandidates.length,
|
|
82
|
-
statistics: {
|
|
83
|
-
totalMemories: memories.length,
|
|
84
|
-
memoriesByType: countByType(memories),
|
|
85
|
-
},
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
const simhashFilter = new SimHashFilter();
|
|
89
|
-
const minhashFilter = new MinHashFilter();
|
|
90
|
-
const allSimhashes = new Map();
|
|
91
|
-
const allMinhashes = new Map();
|
|
92
|
-
for (const memory of memories) {
|
|
93
|
-
allSimhashes.set(memory.id, simhashFilter.generateHash(memory.content));
|
|
94
|
-
allMinhashes.set(memory.id, minhashFilter.generateSignature(memory.content));
|
|
95
|
-
}
|
|
96
|
-
const stage1Start = Date.now();
|
|
97
|
-
const stage1Candidates = findCandidatePairs(contentById, allSimhashes, allMinhashes, {
|
|
98
|
-
simhashThreshold: options.simhashThreshold ?? 4,
|
|
99
|
-
minhashThreshold: options.minhashThreshold ?? 0.7,
|
|
100
|
-
});
|
|
101
|
-
const stage1Time = Date.now() - stage1Start;
|
|
102
|
-
// Combine stage 0 and stage 1 candidates for stage 2 processing
|
|
103
|
-
// We'll prioritize exact matches but also include fuzzy matches for better recall
|
|
104
|
-
const combinedCandidatesForStage2 = [
|
|
105
|
-
...stage0Candidates, // Exact matches first
|
|
106
|
-
...stage1Candidates // Then fuzzy matches
|
|
107
|
-
];
|
|
108
|
-
// Remove duplicates while preserving order (exact matches first)
|
|
109
|
-
const seenPairs = new Set();
|
|
110
|
-
const uniqueCombinedCandidates = [];
|
|
111
|
-
for (const pair of combinedCandidatesForStage2) {
|
|
112
|
-
const pairKey = `${pair.memoryId1}:${pair.memoryId2}`;
|
|
113
|
-
const reversePairKey = `${pair.memoryId2}:${pair.memoryId1}`;
|
|
114
|
-
if (!seenPairs.has(pairKey) && !seenPairs.has(reversePairKey)) {
|
|
115
|
-
seenPairs.add(pairKey);
|
|
116
|
-
uniqueCombinedCandidates.push(pair);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
if (options.stage1Only) {
|
|
120
|
-
// Process only stage 1 candidates (fuzzy matches) for backward compatibility
|
|
121
|
-
const stage1OnlyCandidates = stage1Candidates.map((pair) => ({
|
|
122
|
-
memory1: memoriesById.get(pair.memoryId1),
|
|
123
|
-
memory2: memoriesById.get(pair.memoryId2),
|
|
124
|
-
similarityScore: Math.max(1 - pair.simhashDistance / 64, pair.minhashSimilarity),
|
|
125
|
-
detectionMethod: pair.matched === 'both' ? 'simhash' : pair.matched,
|
|
126
|
-
confidenceLevel: 'low',
|
|
127
|
-
mergeReason: 'Stage 1 candidate (embedding analysis skipped)',
|
|
128
|
-
}));
|
|
129
|
-
return {
|
|
130
|
-
candidates: stage1OnlyCandidates.slice(0, options.limit ?? 50),
|
|
131
|
-
stage0Time,
|
|
132
|
-
stage1Time,
|
|
133
|
-
stage2Time: 0,
|
|
134
|
-
totalCandidates: stage1Candidates.length,
|
|
135
|
-
filteredCandidates: stage1OnlyCandidates.length,
|
|
136
|
-
statistics: {
|
|
137
|
-
totalMemories: memories.length,
|
|
138
|
-
memoriesByType: countByType(memories),
|
|
139
|
-
},
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
const stage2Start = Date.now();
|
|
143
|
-
const embeddings = new Map();
|
|
144
|
-
// Separate memories that already have embeddings from those that need generation
|
|
145
|
-
const memoriesWithoutEmbedding = memories.filter((m) => !m.embedding);
|
|
146
|
-
const memoriesWithEmbedding = memories.filter((m) => m.embedding);
|
|
147
|
-
// Add cached embeddings to map
|
|
148
|
-
for (const memory of memoriesWithEmbedding) {
|
|
149
|
-
embeddings.set(memory.id, memory.embedding);
|
|
150
|
-
}
|
|
151
|
-
// Generate embeddings for remaining memories in parallel batches
|
|
152
|
-
if (memoriesWithoutEmbedding.length > 0) {
|
|
153
|
-
const contents = memoriesWithoutEmbedding.map((m) => m.content);
|
|
154
|
-
const generatedEmbeddings = await getBatchEmbeddings(contents, 20);
|
|
155
|
-
for (let i = 0; i < memoriesWithoutEmbedding.length; i++) {
|
|
156
|
-
const embedding = generatedEmbeddings[i];
|
|
157
|
-
if (embedding) {
|
|
158
|
-
embeddings.set(memoriesWithoutEmbedding[i].id, embedding);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
const rankedCandidates = await rankCandidates(uniqueCombinedCandidates.map((pair) => ({
|
|
163
|
-
memoryId1: pair.memoryId1,
|
|
164
|
-
memoryId2: pair.memoryId2,
|
|
165
|
-
})), memoriesById, embeddings, {
|
|
166
|
-
semanticThreshold: options.threshold ?? 0.85,
|
|
167
|
-
topK: 10,
|
|
168
|
-
});
|
|
169
|
-
const stage2Time = Date.now() - stage2Start;
|
|
170
|
-
// Build final candidates list with proper scoring and methods
|
|
171
|
-
const finalCandidates = [];
|
|
172
|
-
// Add exact matches first (highest confidence)
|
|
173
|
-
for (const pair of stage0Candidates) {
|
|
174
|
-
const memory1 = memoriesById.get(pair.memoryId1);
|
|
175
|
-
const memory2 = memoriesById.get(pair.memoryId2);
|
|
176
|
-
if (memory1 && memory2) {
|
|
177
|
-
finalCandidates.push({
|
|
178
|
-
memory1,
|
|
179
|
-
memory2,
|
|
180
|
-
similarityScore: 1.0, // Exact match
|
|
181
|
-
detectionMethod: 'exact',
|
|
182
|
-
confidenceLevel: 'high',
|
|
183
|
-
mergeReason: 'Exact content match',
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
// Add semantic matches from stage 2
|
|
188
|
-
for (const ranked of rankedCandidates) {
|
|
189
|
-
finalCandidates.push({
|
|
190
|
-
memory1: ranked.memory1,
|
|
191
|
-
memory2: ranked.memory2,
|
|
192
|
-
similarityScore: ranked.cosineSimilarity,
|
|
193
|
-
detectionMethod: 'embedding',
|
|
194
|
-
confidenceLevel: ranked.confidenceLevel,
|
|
195
|
-
mergeReason: ranked.mergeReason,
|
|
196
|
-
});
|
|
197
|
-
}
|
|
198
|
-
// Add fuzzy matches (stage 1) that weren't already covered
|
|
199
|
-
const processedPairs = new Set();
|
|
200
|
-
for (const candidate of finalCandidates) {
|
|
201
|
-
const pairKey1 = `${candidate.memory1.id}:${candidate.memory2.id}`;
|
|
202
|
-
const pairKey2 = `${candidate.memory2.id}:${candidate.memory1.id}`;
|
|
203
|
-
processedPairs.add(pairKey1);
|
|
204
|
-
processedPairs.add(pairKey2);
|
|
205
|
-
}
|
|
206
|
-
for (const pair of stage1Candidates) {
|
|
207
|
-
const pairKey = `${pair.memoryId1}:${pair.memoryId2}`;
|
|
208
|
-
const reversePairKey = `${pair.memoryId2}:${pair.memoryId1}`;
|
|
209
|
-
if (!processedPairs.has(pairKey) && !processedPairs.has(reversePairKey)) {
|
|
210
|
-
const memory1 = memoriesById.get(pair.memoryId1);
|
|
211
|
-
const memory2 = memoriesById.get(pair.memoryId2);
|
|
212
|
-
if (memory1 && memory2) {
|
|
213
|
-
finalCandidates.push({
|
|
214
|
-
memory1,
|
|
215
|
-
memory2,
|
|
216
|
-
similarityScore: Math.max(1 - pair.simhashDistance / 64, pair.minhashSimilarity),
|
|
217
|
-
detectionMethod: pair.matched === 'both' ? 'simhash' : pair.matched,
|
|
218
|
-
confidenceLevel: 'low',
|
|
219
|
-
mergeReason: 'Stage 1 candidate (embedding analysis skipped)',
|
|
220
|
-
});
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
const limited = finalCandidates.slice(0, options.limit ?? 50);
|
|
225
|
-
return {
|
|
226
|
-
candidates: limited,
|
|
227
|
-
stage0Time,
|
|
228
|
-
stage1Time,
|
|
229
|
-
stage2Time,
|
|
230
|
-
totalCandidates: stage0Candidates.length + stage1Candidates.length,
|
|
231
|
-
filteredCandidates: finalCandidates.length,
|
|
232
|
-
statistics: {
|
|
233
|
-
totalMemories: memories.length,
|
|
234
|
-
memoriesByType: countByType(memories),
|
|
235
|
-
},
|
|
236
|
-
};
|
|
237
|
-
}
|
|
238
|
-
export async function analyzeMergePair(memoryId1, memoryId2) {
|
|
239
|
-
const { db, schema } = await getDbClient();
|
|
240
|
-
const [memory1] = await db
|
|
241
|
-
.select()
|
|
242
|
-
.from(schema.memories)
|
|
243
|
-
.where(eq(schema.memories.id, memoryId1));
|
|
244
|
-
const [memory2] = await db
|
|
245
|
-
.select()
|
|
246
|
-
.from(schema.memories)
|
|
247
|
-
.where(eq(schema.memories.id, memoryId2));
|
|
248
|
-
if (!memory1 || !memory2) {
|
|
249
|
-
return null;
|
|
250
|
-
}
|
|
251
|
-
const embedding1 = memory1.embedding || (await getEmbedding(memory1.content)) || [];
|
|
252
|
-
const embedding2 = memory2.embedding || (await getEmbedding(memory2.content)) || [];
|
|
253
|
-
if (!embedding1 || !embedding2 || embedding1.length === 0 || embedding2.length === 0) {
|
|
254
|
-
return null;
|
|
255
|
-
}
|
|
256
|
-
const analysis = analyzePair(memory1, memory2, embedding1, embedding2);
|
|
257
|
-
return {
|
|
258
|
-
memory1,
|
|
259
|
-
memory2,
|
|
260
|
-
analysis,
|
|
261
|
-
};
|
|
262
|
-
}
|
|
263
|
-
function countByType(memories) {
|
|
264
|
-
const counts = {
|
|
265
|
-
observation: 0,
|
|
266
|
-
fact: 0,
|
|
267
|
-
decision: 0,
|
|
268
|
-
context: 0,
|
|
269
|
-
preference: 0,
|
|
270
|
-
reflection: 0,
|
|
271
|
-
note: 0,
|
|
272
|
-
};
|
|
273
|
-
for (const memory of memories) {
|
|
274
|
-
const type = memory.type;
|
|
275
|
-
if (type in counts) {
|
|
276
|
-
counts[type]++;
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
return counts;
|
|
280
|
-
}
|
|
281
|
-
export async function getDetectionStats(projectId) {
|
|
282
|
-
const { db, schema } = await getDbClient();
|
|
283
|
-
const memories = await db
|
|
284
|
-
.select()
|
|
285
|
-
.from(schema.memories)
|
|
286
|
-
.where(eq(schema.memories.projectId, projectId));
|
|
287
|
-
const totalMemories = memories.length;
|
|
288
|
-
const mergedMemories = memories.filter((m) => m.isMerged).length;
|
|
289
|
-
const canonicalMemories = memories.filter((m) => m.isCanonical).length;
|
|
290
|
-
const mergeableMemories = memories.filter((m) => m.isMergeable && !m.isMerged).length;
|
|
291
|
-
return {
|
|
292
|
-
totalMemories,
|
|
293
|
-
mergeableMemories,
|
|
294
|
-
mergedMemories,
|
|
295
|
-
canonicalMemories,
|
|
296
|
-
memoriesByType: countByType(memories),
|
|
297
|
-
};
|
|
298
|
-
}
|
|
299
|
-
//# sourceMappingURL=two-stage-detector.js.map
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Executes the approved merge in a single atomic transaction.
|
|
3
|
-
*/
|
|
4
|
-
interface ApproveMergeInput {
|
|
5
|
-
proposalId: string;
|
|
6
|
-
reviewNotes?: string;
|
|
7
|
-
}
|
|
8
|
-
interface ApproveMergeResponse {
|
|
9
|
-
ok: boolean;
|
|
10
|
-
message: string;
|
|
11
|
-
data?: {
|
|
12
|
-
proposalId: string;
|
|
13
|
-
canonicalMemoryId: string;
|
|
14
|
-
mergedMemoryIds: string[];
|
|
15
|
-
tokensSaved: number;
|
|
16
|
-
mergedAt: string;
|
|
17
|
-
};
|
|
18
|
-
error?: string;
|
|
19
|
-
}
|
|
20
|
-
export declare function handleApproveMerge(input: ApproveMergeInput): Promise<ApproveMergeResponse>;
|
|
21
|
-
export {};
|
|
22
|
-
//# sourceMappingURL=approve-merge.d.ts.map
|
|
@@ -1,179 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Executes the approved merge in a single atomic transaction.
|
|
3
|
-
*/
|
|
4
|
-
import { randomUUID } from 'crypto';
|
|
5
|
-
import { getDb } from '../../../db/index.js';
|
|
6
|
-
import { getSchema } from '../../../db/schema.js';
|
|
7
|
-
import { createDatabaseClient } from '../../../core/storage/database.js';
|
|
8
|
-
import { eq, inArray } from 'drizzle-orm';
|
|
9
|
-
import { mergeMemories } from '../strategies/merge-strategies.js';
|
|
10
|
-
import { estimateTokensSaved } from '../analytics/token-estimator.js';
|
|
11
|
-
import { getEmbedding } from '../../../core/embeddings.js';
|
|
12
|
-
export async function handleApproveMerge(input) {
|
|
13
|
-
try {
|
|
14
|
-
const { proposalId, reviewNotes } = input;
|
|
15
|
-
if (!proposalId) {
|
|
16
|
-
return {
|
|
17
|
-
ok: false,
|
|
18
|
-
message: 'proposalId is required',
|
|
19
|
-
error: 'proposalId is required',
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
const db = createDatabaseClient(await getDb());
|
|
23
|
-
const schema = await getSchema();
|
|
24
|
-
const [proposal] = await db
|
|
25
|
-
.select()
|
|
26
|
-
.from(schema.memoryMergeProposals)
|
|
27
|
-
.where(eq(schema.memoryMergeProposals.id, proposalId));
|
|
28
|
-
if (!proposal) {
|
|
29
|
-
return {
|
|
30
|
-
ok: false,
|
|
31
|
-
message: 'Proposal not found',
|
|
32
|
-
error: `Proposal ${proposalId} not found`,
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
if (proposal.status !== 'pending') {
|
|
36
|
-
return {
|
|
37
|
-
ok: false,
|
|
38
|
-
message: `Proposal is not pending (status: ${proposal.status})`,
|
|
39
|
-
error: `Cannot approve non-pending proposal`,
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
// Step 2: Load source memories
|
|
43
|
-
const sourceIds = proposal.sourceMemoryIds || [];
|
|
44
|
-
if (sourceIds.length === 0) {
|
|
45
|
-
return {
|
|
46
|
-
ok: false,
|
|
47
|
-
message: 'No source memories found in proposal',
|
|
48
|
-
error: 'Proposal has no source memory IDs',
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
const sourceMemories = await db
|
|
52
|
-
.select()
|
|
53
|
-
.from(schema.memories)
|
|
54
|
-
.where(inArray(schema.memories.id, sourceIds));
|
|
55
|
-
if (sourceMemories.length !== sourceIds.length) {
|
|
56
|
-
return {
|
|
57
|
-
ok: false,
|
|
58
|
-
message: 'Not all source memories could be found',
|
|
59
|
-
error: 'Missing source memories',
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
// Step 3: Merge memories
|
|
63
|
-
let merged;
|
|
64
|
-
try {
|
|
65
|
-
merged = mergeMemories(sourceMemories);
|
|
66
|
-
}
|
|
67
|
-
catch (error) {
|
|
68
|
-
return {
|
|
69
|
-
ok: false,
|
|
70
|
-
message: 'Merge strategy failed',
|
|
71
|
-
error: error instanceof Error ? error.message : 'Unknown merge error',
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
// Step 4: Calculate token savings
|
|
75
|
-
const tokensSaved = estimateTokensSaved(sourceMemories, merged);
|
|
76
|
-
// Step 5: Generate embedding for merged memory
|
|
77
|
-
let embedding = null;
|
|
78
|
-
try {
|
|
79
|
-
embedding = (await getEmbedding(merged.content));
|
|
80
|
-
}
|
|
81
|
-
catch (err) {
|
|
82
|
-
// Continue without embedding if generation fails
|
|
83
|
-
}
|
|
84
|
-
// Step 6: Create canonical memory
|
|
85
|
-
const canonicalId = randomUUID();
|
|
86
|
-
const now = new Date();
|
|
87
|
-
await db.insert(schema.memories).values({
|
|
88
|
-
id: canonicalId,
|
|
89
|
-
projectId: sourceMemories[0].projectId,
|
|
90
|
-
userId: sourceMemories[0].userId,
|
|
91
|
-
type: sourceMemories[0].type,
|
|
92
|
-
content: merged.content,
|
|
93
|
-
summary: merged.summary,
|
|
94
|
-
embedding: embedding || undefined,
|
|
95
|
-
tags: merged.tags,
|
|
96
|
-
metadata: merged.metadata,
|
|
97
|
-
source: 'merge',
|
|
98
|
-
confidence: 85, // Merged confidence slightly lower than source
|
|
99
|
-
isActive: true,
|
|
100
|
-
isCanonical: true,
|
|
101
|
-
mergeSourceIds: sourceIds,
|
|
102
|
-
isMergeable: true,
|
|
103
|
-
mergeVersion: 1,
|
|
104
|
-
createdAt: now,
|
|
105
|
-
updatedAt: now,
|
|
106
|
-
isPrivate: sourceMemories[0].isPrivate,
|
|
107
|
-
hasSecrets: sourceMemories.some((m) => m.hasSecrets),
|
|
108
|
-
relevanceScore: Math.round(sourceMemories.reduce((sum, m) => sum + (m.relevanceScore || 50), 0) / sourceMemories.length),
|
|
109
|
-
accessCount: 0,
|
|
110
|
-
lastAccessedAt: null,
|
|
111
|
-
expiresAt: null,
|
|
112
|
-
});
|
|
113
|
-
// Step 7: Mark source memories as merged (soft archive)
|
|
114
|
-
for (const sourceMemory of sourceMemories) {
|
|
115
|
-
await db
|
|
116
|
-
.update(schema.memories)
|
|
117
|
-
.set({
|
|
118
|
-
isMerged: true,
|
|
119
|
-
mergedIntoId: canonicalId,
|
|
120
|
-
mergedAt: now,
|
|
121
|
-
isActive: false,
|
|
122
|
-
updatedAt: now,
|
|
123
|
-
})
|
|
124
|
-
.where(eq(schema.memories.id, sourceMemory.id));
|
|
125
|
-
}
|
|
126
|
-
// Step 8: Create merge history record (audit trail)
|
|
127
|
-
const historyId = randomUUID();
|
|
128
|
-
await db.insert(schema.memoryMergeHistory).values({
|
|
129
|
-
id: historyId,
|
|
130
|
-
projectId: sourceMemories[0].projectId,
|
|
131
|
-
userId: sourceMemories[0].userId,
|
|
132
|
-
proposalId,
|
|
133
|
-
sourceMemoryIds: sourceIds,
|
|
134
|
-
canonicalMemoryId: canonicalId,
|
|
135
|
-
sourceMemoriesSnapshot: sourceMemories.map((m) => ({
|
|
136
|
-
id: m.id,
|
|
137
|
-
type: m.type,
|
|
138
|
-
content: m.content,
|
|
139
|
-
summary: m.summary,
|
|
140
|
-
tags: m.tags,
|
|
141
|
-
metadata: m.metadata,
|
|
142
|
-
createdAt: m.createdAt,
|
|
143
|
-
})),
|
|
144
|
-
mergeStrategy: sourceMemories[0].type === 'preference' ? 'latest' : 'union',
|
|
145
|
-
tokensSaved,
|
|
146
|
-
isReversed: false,
|
|
147
|
-
mergedAt: now,
|
|
148
|
-
});
|
|
149
|
-
// Step 9: Update proposal status
|
|
150
|
-
await db
|
|
151
|
-
.update(schema.memoryMergeProposals)
|
|
152
|
-
.set({
|
|
153
|
-
status: 'approved',
|
|
154
|
-
reviewedAt: now,
|
|
155
|
-
reviewNotes: reviewNotes || undefined,
|
|
156
|
-
})
|
|
157
|
-
.where(eq(schema.memoryMergeProposals.id, proposalId));
|
|
158
|
-
// Step 10: Return success
|
|
159
|
-
return {
|
|
160
|
-
ok: true,
|
|
161
|
-
message: `Merge approved and executed. Created canonical memory ${canonicalId}`,
|
|
162
|
-
data: {
|
|
163
|
-
proposalId,
|
|
164
|
-
canonicalMemoryId: canonicalId,
|
|
165
|
-
mergedMemoryIds: sourceIds,
|
|
166
|
-
tokensSaved,
|
|
167
|
-
mergedAt: now.toISOString(),
|
|
168
|
-
},
|
|
169
|
-
};
|
|
170
|
-
}
|
|
171
|
-
catch (error) {
|
|
172
|
-
return {
|
|
173
|
-
ok: false,
|
|
174
|
-
message: 'Failed to approve merge',
|
|
175
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
176
|
-
};
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
//# sourceMappingURL=approve-merge.js.map
|