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,144 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Remember Command - Unified memory write
|
|
3
|
-
*
|
|
4
|
-
* Single implementation for both CLI and MCP.
|
|
5
|
-
*/
|
|
6
|
-
import { rememberMemory, findSimilarMemories } from '../memory/memories.js';
|
|
7
|
-
import { createLearning } from '../ingestion/learnings.js';
|
|
8
|
-
import { pinMemory, unpinMemory } from '../security/governance.js';
|
|
9
|
-
import { detectMemorySignals } from '../memory/trigger-detector.js';
|
|
10
|
-
export async function executeRemember(options) {
|
|
11
|
-
const { content, project, tags, tier, type, learningType, source, route, pin, unpin } = options;
|
|
12
|
-
const signals = detectMemorySignals(content);
|
|
13
|
-
let routing = "memory";
|
|
14
|
-
let inferredType = type || signals.suggestedType;
|
|
15
|
-
let routingReason = "";
|
|
16
|
-
// Check for learning patterns if auto mode
|
|
17
|
-
if (route === "auto" || !route) {
|
|
18
|
-
const hasLessonPattern = /(\bfailed\s+because\b|\blesson\s+learned\b|\bnext\s+time\b|\broot\s+cause\b|\bsuccess\b.*\bbecause\b|\bi\s+learned\b|\binsight\b)/i.test(content);
|
|
19
|
-
const hasLearningType = /(\bsuccess\b|\bfailure\b|\bfix\b|\binsight\b)/i.test(content);
|
|
20
|
-
const hasHackPattern = /(\bHACK\b|\bworkaround\b|\btemporary\s+fix\b)/i.test(content);
|
|
21
|
-
const hasFixmePattern = /(\bFIXME\b|\bXXX\b|\bbug\b.*\bfix\b)/i.test(content);
|
|
22
|
-
if (hasLessonPattern || hasLearningType || hasHackPattern || hasFixmePattern) {
|
|
23
|
-
routing = "learning";
|
|
24
|
-
if (hasHackPattern || hasFixmePattern) {
|
|
25
|
-
routingReason = "Detected code pattern (HACK/FIXME)";
|
|
26
|
-
}
|
|
27
|
-
else {
|
|
28
|
-
routingReason = "Detected learning pattern in content";
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
else if (signals.suggestedType === 'task') {
|
|
32
|
-
routing = "memory";
|
|
33
|
-
routingReason = "Detected TODO pattern";
|
|
34
|
-
}
|
|
35
|
-
else if (signals.suggestedType === 'observation' && /\b(note|note\s+that|log|remember)\b/i.test(content)) {
|
|
36
|
-
routing = "note";
|
|
37
|
-
routingReason = "Detected note pattern";
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
routing = "memory";
|
|
41
|
-
routingReason = `Detected as ${inferredType}`;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
else if (route === "learning") {
|
|
45
|
-
routing = "learning";
|
|
46
|
-
routingReason = "Override: forced to learning";
|
|
47
|
-
}
|
|
48
|
-
else if (route === "note") {
|
|
49
|
-
routing = "note";
|
|
50
|
-
routingReason = "Override: forced to note";
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
routing = "memory";
|
|
54
|
-
routingReason = "Override: forced to memory";
|
|
55
|
-
}
|
|
56
|
-
let result;
|
|
57
|
-
const parsedTags = tags ? tags.split(',').map((t) => t.trim()) : [];
|
|
58
|
-
const parsedTier = tier === "cold" ? "cold" : "hot";
|
|
59
|
-
if (routing === "learning") {
|
|
60
|
-
let parsedLearningType = "insight";
|
|
61
|
-
if (learningType) {
|
|
62
|
-
parsedLearningType = learningType;
|
|
63
|
-
}
|
|
64
|
-
else {
|
|
65
|
-
if (/(\bsuccess\b|\bworked\b|\bfinished\b)/i.test(content))
|
|
66
|
-
parsedLearningType = "success";
|
|
67
|
-
else if (/(\bfailed\b|\berror\b|\bbroke\b)/i.test(content))
|
|
68
|
-
parsedLearningType = "failure";
|
|
69
|
-
else if (/(\bfix\b|\b workaround\b|\bsolved\b)/i.test(content))
|
|
70
|
-
parsedLearningType = "fix";
|
|
71
|
-
}
|
|
72
|
-
const learning = await createLearning({
|
|
73
|
-
type: parsedLearningType,
|
|
74
|
-
content,
|
|
75
|
-
project,
|
|
76
|
-
autoLink: true
|
|
77
|
-
});
|
|
78
|
-
result = { id: learning.id, type: "learning", learningType: parsedLearningType, content };
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
// Check for similar memories to avoid duplicates (deduplication)
|
|
82
|
-
const similarMemories = await findSimilarMemories(content, 0.85, 3);
|
|
83
|
-
const memory = await rememberMemory({
|
|
84
|
-
content,
|
|
85
|
-
type: inferredType,
|
|
86
|
-
tags: parsedTags,
|
|
87
|
-
project,
|
|
88
|
-
tier: parsedTier,
|
|
89
|
-
source: source || 'cli'
|
|
90
|
-
});
|
|
91
|
-
// If found similar memories, create association instead of duplicate
|
|
92
|
-
if (similarMemories.length > 0) {
|
|
93
|
-
const { createAssociation } = await import('../associations.js');
|
|
94
|
-
for (const similar of similarMemories) {
|
|
95
|
-
await createAssociation(memory.id, similar.id, 'duplicate', similar.similarity ?? 0.85);
|
|
96
|
-
}
|
|
97
|
-
memory.similarTo = similarMemories.map(s => s.id);
|
|
98
|
-
}
|
|
99
|
-
if (pin) {
|
|
100
|
-
await pinMemory(memory.id);
|
|
101
|
-
}
|
|
102
|
-
else if (unpin) {
|
|
103
|
-
await unpinMemory(memory.id);
|
|
104
|
-
}
|
|
105
|
-
result = { id: memory.id, type: "memory", memoryType: inferredType, tier: parsedTier, content, pinned: pin };
|
|
106
|
-
// Auto-update knowledge graph (fire-and-forget, don't fail remember on graph error)
|
|
107
|
-
const { addMemoryToGraph } = await import('../graph/graph-builder.js');
|
|
108
|
-
const graphResult = await addMemoryToGraph(memory.id).catch((e) => {
|
|
109
|
-
console.warn('[Graph] Auto-update failed:', e.message);
|
|
110
|
-
return null;
|
|
111
|
-
});
|
|
112
|
-
if (graphResult) {
|
|
113
|
-
result.graph = { entities: graphResult.entitiesCreated, relations: graphResult.relationsCreated };
|
|
114
|
-
}
|
|
115
|
-
// Auto-assign to place (fire-and-forget)
|
|
116
|
-
const { autoAssignMemory } = await import('../places/memory-places.js');
|
|
117
|
-
const projectId = memory.projectId || project;
|
|
118
|
-
const placeResult = await autoAssignMemory({
|
|
119
|
-
memoryId: memory.id,
|
|
120
|
-
projectId: projectId,
|
|
121
|
-
content: content,
|
|
122
|
-
tags: parsedTags,
|
|
123
|
-
memoryType: inferredType
|
|
124
|
-
}).catch((e) => {
|
|
125
|
-
console.warn('[Places] Auto-assign failed:', e.message);
|
|
126
|
-
return null;
|
|
127
|
-
});
|
|
128
|
-
if (placeResult?.assigned && placeResult.placeId) {
|
|
129
|
-
result.place = { id: placeResult.placeId, type: placeResult.placeType ?? 'inbox' };
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
return {
|
|
133
|
-
ok: true,
|
|
134
|
-
id: result.id,
|
|
135
|
-
routing,
|
|
136
|
-
type: routing === "learning" ? result.learningType : result.memoryType,
|
|
137
|
-
tier: routing === "memory" ? parsedTier : 'N/A',
|
|
138
|
-
priority: signals.priority,
|
|
139
|
-
confidence: signals.confidence,
|
|
140
|
-
pinned: result.pinned,
|
|
141
|
-
reason: routingReason
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
//# sourceMappingURL=remember.js.map
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TOON Compression - Token-efficient memory format
|
|
3
|
-
*
|
|
4
|
-
* Compact format for memory context using abbreviated notation.
|
|
5
|
-
* Achieves efficient token usage for context injection.
|
|
6
|
-
*
|
|
7
|
-
* Format:
|
|
8
|
-
* {
|
|
9
|
-
* m:[type], // memory type (1-2 chars)
|
|
10
|
-
* c:"...", // content (truncated)
|
|
11
|
-
* t:[], // tags (array)
|
|
12
|
-
* d:123 // days ago
|
|
13
|
-
* }
|
|
14
|
-
*/
|
|
15
|
-
/**
|
|
16
|
-
* Compress a memory to TOON format
|
|
17
|
-
*/
|
|
18
|
-
export declare function compressForContext(content: string): string;
|
|
19
|
-
/**
|
|
20
|
-
* Decompress TOON back to readable format
|
|
21
|
-
*/
|
|
22
|
-
export declare function decompressFromContext(toonString: string): string;
|
|
23
|
-
/**
|
|
24
|
-
* Estimate compression ratio
|
|
25
|
-
*/
|
|
26
|
-
export declare function estimateCompressionRatio(content: string): number;
|
|
27
|
-
/**
|
|
28
|
-
* Check if content is JSON
|
|
29
|
-
*/
|
|
30
|
-
export declare function isJson(content: string): boolean;
|
|
31
|
-
/**
|
|
32
|
-
* Check if content is compressed format
|
|
33
|
-
*/
|
|
34
|
-
export declare function isCompressed(content: string): boolean;
|
|
35
|
-
/**
|
|
36
|
-
* Count tokens (rough estimate)
|
|
37
|
-
* Import from context-window.ts - single source of truth
|
|
38
|
-
*/
|
|
39
|
-
import { estimateTokens } from './context/context-window.js';
|
|
40
|
-
export { estimateTokens };
|
|
41
|
-
/**
|
|
42
|
-
* Truncate to token budget
|
|
43
|
-
*/
|
|
44
|
-
export declare function truncateToTokenBudget(content: string, maxTokens: number): string;
|
|
45
|
-
//# sourceMappingURL=compression.d.ts.map
|
package/dist/core/compression.js
DELETED
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TOON Compression - Token-efficient memory format
|
|
3
|
-
*
|
|
4
|
-
* Compact format for memory context using abbreviated notation.
|
|
5
|
-
* Achieves efficient token usage for context injection.
|
|
6
|
-
*
|
|
7
|
-
* Format:
|
|
8
|
-
* {
|
|
9
|
-
* m:[type], // memory type (1-2 chars)
|
|
10
|
-
* c:"...", // content (truncated)
|
|
11
|
-
* t:[], // tags (array)
|
|
12
|
-
* d:123 // days ago
|
|
13
|
-
* }
|
|
14
|
-
*/
|
|
15
|
-
const MAX_CONTENT_LENGTH = 80; // Max chars per content
|
|
16
|
-
const MAX_TAGS = 3; // Max tags to include
|
|
17
|
-
/**
|
|
18
|
-
* Compress a memory to TOON format
|
|
19
|
-
*/
|
|
20
|
-
export function compressForContext(content) {
|
|
21
|
-
// If not JSON or already short, just return
|
|
22
|
-
if (!isJson(content) || content.length <= MAX_CONTENT_LENGTH) {
|
|
23
|
-
return content;
|
|
24
|
-
}
|
|
25
|
-
try {
|
|
26
|
-
const parsed = JSON.parse(content);
|
|
27
|
-
// Build compact TOON object
|
|
28
|
-
const toon = {
|
|
29
|
-
m: parsed.type?.substring(0, 2) || 'ob', // observation -> ob
|
|
30
|
-
};
|
|
31
|
-
// Truncate content
|
|
32
|
-
if (parsed.content) {
|
|
33
|
-
const truncated = parsed.content.substring(0, MAX_CONTENT_LENGTH);
|
|
34
|
-
toon.c = truncated.length < parsed.content.length ? truncated + '..' : truncated;
|
|
35
|
-
}
|
|
36
|
-
// Add tags (limited)
|
|
37
|
-
if (parsed.tags && Array.isArray(parsed.tags)) {
|
|
38
|
-
toon.t = parsed.tags.slice(0, MAX_TAGS);
|
|
39
|
-
}
|
|
40
|
-
// Add days ago if there's a date
|
|
41
|
-
if (parsed.createdAt) {
|
|
42
|
-
const days = Math.floor((Date.now() - new Date(parsed.createdAt).getTime()) / (1000 * 60 * 60 * 24));
|
|
43
|
-
if (days > 0) {
|
|
44
|
-
toon.d = days;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
return JSON.stringify(toon);
|
|
48
|
-
}
|
|
49
|
-
catch {
|
|
50
|
-
// Not parseable JSON, return truncated content
|
|
51
|
-
return content.substring(0, MAX_CONTENT_LENGTH);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Decompress TOON back to readable format
|
|
56
|
-
*/
|
|
57
|
-
export function decompressFromContext(toonString) {
|
|
58
|
-
// Check if it's TOON format
|
|
59
|
-
if (!isCompressed(toonString)) {
|
|
60
|
-
return toonString;
|
|
61
|
-
}
|
|
62
|
-
try {
|
|
63
|
-
const parsed = JSON.parse(toonString);
|
|
64
|
-
// If it has TOON markers, expand it
|
|
65
|
-
if (parsed.m || parsed.c || parsed.t) {
|
|
66
|
-
const typeMap = {
|
|
67
|
-
ob: 'observation',
|
|
68
|
-
su: 'success',
|
|
69
|
-
f: 'failure',
|
|
70
|
-
fx: 'fix',
|
|
71
|
-
i: 'insight',
|
|
72
|
-
};
|
|
73
|
-
const type = typeMap[parsed.m] || 'observation';
|
|
74
|
-
const parts = [`[${type}]`];
|
|
75
|
-
if (parsed.c) {
|
|
76
|
-
parts.push(parsed.c);
|
|
77
|
-
}
|
|
78
|
-
if (parsed.t && parsed.t.length > 0) {
|
|
79
|
-
parts.push(`#${parsed.t.join(' #')}`);
|
|
80
|
-
}
|
|
81
|
-
if (parsed.d) {
|
|
82
|
-
parts.push(`(${parsed.d}d ago)`);
|
|
83
|
-
}
|
|
84
|
-
return parts.join(' ');
|
|
85
|
-
}
|
|
86
|
-
return toonString;
|
|
87
|
-
}
|
|
88
|
-
catch {
|
|
89
|
-
// Not valid TOON, return as-is
|
|
90
|
-
return toonString;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Estimate compression ratio
|
|
95
|
-
*/
|
|
96
|
-
export function estimateCompressionRatio(content) {
|
|
97
|
-
if (!isJson(content) || content.length <= MAX_CONTENT_LENGTH) {
|
|
98
|
-
return 1.0;
|
|
99
|
-
}
|
|
100
|
-
const compressed = compressForContext(content);
|
|
101
|
-
return compressed.length / content.length;
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Check if content is JSON
|
|
105
|
-
*/
|
|
106
|
-
export function isJson(content) {
|
|
107
|
-
try {
|
|
108
|
-
JSON.parse(content);
|
|
109
|
-
return true;
|
|
110
|
-
}
|
|
111
|
-
catch {
|
|
112
|
-
return false;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Check if content is compressed format
|
|
117
|
-
*/
|
|
118
|
-
export function isCompressed(content) {
|
|
119
|
-
if (!content.startsWith('{') || !content.endsWith('}')) {
|
|
120
|
-
return false;
|
|
121
|
-
}
|
|
122
|
-
try {
|
|
123
|
-
const parsed = JSON.parse(content);
|
|
124
|
-
// Has compressed markers
|
|
125
|
-
return parsed.m !== undefined || parsed.c !== undefined;
|
|
126
|
-
}
|
|
127
|
-
catch {
|
|
128
|
-
return false;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Count tokens (rough estimate)
|
|
133
|
-
* Import from context-window.ts - single source of truth
|
|
134
|
-
*/
|
|
135
|
-
import { estimateTokens } from './context/context-window.js';
|
|
136
|
-
export { estimateTokens };
|
|
137
|
-
/**
|
|
138
|
-
* Truncate to token budget
|
|
139
|
-
*/
|
|
140
|
-
export function truncateToTokenBudget(content, maxTokens) {
|
|
141
|
-
const tokens = estimateTokens(content);
|
|
142
|
-
if (tokens <= maxTokens) {
|
|
143
|
-
return content;
|
|
144
|
-
}
|
|
145
|
-
// Binary search for the right length
|
|
146
|
-
let low = 0;
|
|
147
|
-
let high = content.length;
|
|
148
|
-
while (low < high) {
|
|
149
|
-
const mid = Math.floor((low + high) / 2);
|
|
150
|
-
const estimated = estimateTokens(content.substring(0, mid));
|
|
151
|
-
if (estimated <= maxTokens) {
|
|
152
|
-
low = mid + 1;
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
high = mid;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
return content.substring(0, low) + '...';
|
|
159
|
-
}
|
|
160
|
-
//# sourceMappingURL=compression.js.map
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
export interface ConsolidationStats {
|
|
2
|
-
clustered: number;
|
|
3
|
-
merged: number;
|
|
4
|
-
tokensRecovered: number;
|
|
5
|
-
deduped: number;
|
|
6
|
-
consolidated: number;
|
|
7
|
-
}
|
|
8
|
-
export interface DeduplicationResult {
|
|
9
|
-
duplicatesFound: number;
|
|
10
|
-
mergedCount: number;
|
|
11
|
-
tokensRecovered: number;
|
|
12
|
-
groups: DuplicateGroup[];
|
|
13
|
-
}
|
|
14
|
-
export interface DuplicateGroup {
|
|
15
|
-
canonicalId: string;
|
|
16
|
-
duplicateIds: string[];
|
|
17
|
-
similarity: number;
|
|
18
|
-
reason: string;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Run automated deduplication job
|
|
22
|
-
* Finds and marks duplicates for review or auto-merges high-confidence duplicates
|
|
23
|
-
*/
|
|
24
|
-
export declare function runDeduplicationJob(projectId?: string): Promise<DeduplicationResult>;
|
|
25
|
-
/**
|
|
26
|
-
* Run full consolidation job (dedup + memory consolidation)
|
|
27
|
-
*/
|
|
28
|
-
export declare function runFullConsolidationJob(projectId?: string): Promise<ConsolidationStats>;
|
|
29
|
-
/**
|
|
30
|
-
* Get deduplication statistics
|
|
31
|
-
*/
|
|
32
|
-
export declare function getDeduplicationStats(projectId?: string): Promise<{
|
|
33
|
-
totalMemories: number;
|
|
34
|
-
mergedMemories: number;
|
|
35
|
-
pendingDuplicates: number;
|
|
36
|
-
}>;
|
|
37
|
-
//# sourceMappingURL=consolidation.d.ts.map
|
|
@@ -1,248 +0,0 @@
|
|
|
1
|
-
// Memory Consolidation & Deduplication
|
|
2
|
-
import { eq, inArray, and } from 'drizzle-orm';
|
|
3
|
-
import { getDb } from '../db/index.js';
|
|
4
|
-
import { getSchema } from '../db/schema.js';
|
|
5
|
-
import { createAssociation } from './associations.js';
|
|
6
|
-
import { logger } from './logger.js';
|
|
7
|
-
import { consolidateMemories } from './memory/consolidation.js';
|
|
8
|
-
/**
|
|
9
|
-
* Run automated deduplication job
|
|
10
|
-
* Finds and marks duplicates for review or auto-merges high-confidence duplicates
|
|
11
|
-
*/
|
|
12
|
-
export async function runDeduplicationJob(projectId) {
|
|
13
|
-
const result = {
|
|
14
|
-
duplicatesFound: 0,
|
|
15
|
-
mergedCount: 0,
|
|
16
|
-
tokensRecovered: 0,
|
|
17
|
-
groups: [],
|
|
18
|
-
};
|
|
19
|
-
try {
|
|
20
|
-
const db = await getDb();
|
|
21
|
-
const schema = await getSchema();
|
|
22
|
-
// Get active memories for deduplication check
|
|
23
|
-
const whereClause = projectId
|
|
24
|
-
? and(eq(schema.memories.projectId, projectId), eq(schema.memories.status, 'active'))
|
|
25
|
-
: eq(schema.memories.status, 'active');
|
|
26
|
-
const memories = await db
|
|
27
|
-
.select()
|
|
28
|
-
.from(schema.memories)
|
|
29
|
-
.where(whereClause)
|
|
30
|
-
.limit(500);
|
|
31
|
-
if (memories.length < 2) {
|
|
32
|
-
return result;
|
|
33
|
-
}
|
|
34
|
-
// Find duplicate groups using SimHash
|
|
35
|
-
const duplicateGroups = await findDuplicatesBySimHash(memories);
|
|
36
|
-
result.duplicatesFound = duplicateGroups.reduce((sum, g) => sum + g.duplicateIds.length, 0);
|
|
37
|
-
// Auto-merge high-confidence duplicates (>0.95 similarity)
|
|
38
|
-
for (const group of duplicateGroups) {
|
|
39
|
-
if (group.similarity >= 0.95) {
|
|
40
|
-
const tokensSaved = await autoMergeDuplicates(group.canonicalId, group.duplicateIds);
|
|
41
|
-
result.mergedCount += group.duplicateIds.length;
|
|
42
|
-
result.tokensRecovered += tokensSaved;
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
// Lower confidence - just create association for review
|
|
46
|
-
for (const dupId of group.duplicateIds) {
|
|
47
|
-
await createAssociation(group.canonicalId, dupId, 'duplicate', group.similarity);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
result.groups.push(group);
|
|
51
|
-
}
|
|
52
|
-
logger.info('Deduplication job completed', {
|
|
53
|
-
duplicatesFound: result.duplicatesFound,
|
|
54
|
-
mergedCount: result.mergedCount,
|
|
55
|
-
tokensRecovered: result.tokensRecovered,
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
catch (error) {
|
|
59
|
-
logger.error('Deduplication job error', error);
|
|
60
|
-
}
|
|
61
|
-
return result;
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Find duplicates using SimHash (efficient near-duplicate detection)
|
|
65
|
-
*/
|
|
66
|
-
async function findDuplicatesBySimHash(memories) {
|
|
67
|
-
const groups = [];
|
|
68
|
-
const processed = new Set();
|
|
69
|
-
// Compute SimHash for each memory
|
|
70
|
-
const hashes = memories.map(m => ({
|
|
71
|
-
id: m.id,
|
|
72
|
-
hash: computeSimHash(m.content),
|
|
73
|
-
content: m.content,
|
|
74
|
-
createdAt: m.createdAt,
|
|
75
|
-
}));
|
|
76
|
-
// Compare hashes to find similar content
|
|
77
|
-
for (let i = 0; i < hashes.length; i++) {
|
|
78
|
-
if (processed.has(hashes[i].id))
|
|
79
|
-
continue;
|
|
80
|
-
const duplicates = [];
|
|
81
|
-
let maxSimilarity = 0;
|
|
82
|
-
for (let j = i + 1; j < hashes.length; j++) {
|
|
83
|
-
if (processed.has(hashes[j].id))
|
|
84
|
-
continue;
|
|
85
|
-
const hammingDistance = computeHammingDistance(hashes[i].hash, hashes[j].hash);
|
|
86
|
-
const similarity = 1 - (hammingDistance / 64); // 64-bit hash
|
|
87
|
-
if (similarity >= 0.85) {
|
|
88
|
-
duplicates.push(hashes[j].id);
|
|
89
|
-
maxSimilarity = Math.max(maxSimilarity, similarity);
|
|
90
|
-
processed.add(hashes[j].id);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
if (duplicates.length > 0) {
|
|
94
|
-
processed.add(hashes[i].id);
|
|
95
|
-
groups.push({
|
|
96
|
-
canonicalId: hashes[i].id, // Keep oldest as canonical
|
|
97
|
-
duplicateIds: duplicates,
|
|
98
|
-
similarity: maxSimilarity,
|
|
99
|
-
reason: 'content-similarity',
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
return groups;
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Compute SimHash for text (64-bit fingerprint)
|
|
107
|
-
*/
|
|
108
|
-
function computeSimHash(text) {
|
|
109
|
-
const tokens = text.toLowerCase().split(/\s+/).filter(t => t.length > 2);
|
|
110
|
-
const weights = new Array(64).fill(0);
|
|
111
|
-
for (const token of tokens) {
|
|
112
|
-
const hash = simpleHash(token);
|
|
113
|
-
for (let i = 0; i < 64; i++) {
|
|
114
|
-
if ((hash >> BigInt(i)) & 1n) {
|
|
115
|
-
weights[i] += 1;
|
|
116
|
-
}
|
|
117
|
-
else {
|
|
118
|
-
weights[i] -= 1;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
let simHash = 0n;
|
|
123
|
-
for (let i = 0; i < 64; i++) {
|
|
124
|
-
if (weights[i] > 0) {
|
|
125
|
-
simHash |= (1n << BigInt(i));
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
return simHash;
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Simple hash function for strings
|
|
132
|
-
*/
|
|
133
|
-
function simpleHash(str) {
|
|
134
|
-
let hash = 0n;
|
|
135
|
-
for (let i = 0; i < str.length; i++) {
|
|
136
|
-
const char = BigInt(str.charCodeAt(i));
|
|
137
|
-
hash = ((hash << 5n) - hash) + char;
|
|
138
|
-
hash = hash & hash; // Convert to 64bit integer
|
|
139
|
-
}
|
|
140
|
-
return hash;
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Compute Hamming distance between two hashes
|
|
144
|
-
*/
|
|
145
|
-
function computeHammingDistance(a, b) {
|
|
146
|
-
let xor = a ^ b;
|
|
147
|
-
let distance = 0;
|
|
148
|
-
while (xor !== 0n) {
|
|
149
|
-
distance += Number(xor & 1n);
|
|
150
|
-
xor >>= 1n;
|
|
151
|
-
}
|
|
152
|
-
return distance;
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* Auto-merge duplicates into canonical memory
|
|
156
|
-
*/
|
|
157
|
-
async function autoMergeDuplicates(canonicalId, duplicateIds) {
|
|
158
|
-
try {
|
|
159
|
-
const db = await getDb();
|
|
160
|
-
const schema = await getSchema();
|
|
161
|
-
const now = new Date();
|
|
162
|
-
// Calculate tokens recovered
|
|
163
|
-
const duplicates = await db
|
|
164
|
-
.select()
|
|
165
|
-
.from(schema.memories)
|
|
166
|
-
.where(inArray(schema.memories.id, duplicateIds));
|
|
167
|
-
let tokensRecovered = 0;
|
|
168
|
-
for (const dup of duplicates) {
|
|
169
|
-
tokensRecovered += Math.ceil((dup.content?.length || 0) / 4);
|
|
170
|
-
}
|
|
171
|
-
// Mark duplicates as merged
|
|
172
|
-
await db
|
|
173
|
-
.update(schema.memories)
|
|
174
|
-
.set({
|
|
175
|
-
status: 'merged',
|
|
176
|
-
mergedInto: canonicalId,
|
|
177
|
-
mergedAt: now,
|
|
178
|
-
updatedAt: now,
|
|
179
|
-
})
|
|
180
|
-
.where(inArray(schema.memories.id, duplicateIds));
|
|
181
|
-
// Create associations for traceability
|
|
182
|
-
for (const dupId of duplicateIds) {
|
|
183
|
-
await createAssociation(canonicalId, dupId, 'merged', 0.95);
|
|
184
|
-
}
|
|
185
|
-
return tokensRecovered;
|
|
186
|
-
}
|
|
187
|
-
catch (error) {
|
|
188
|
-
logger.error('Error auto-merging duplicates', error);
|
|
189
|
-
return 0;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* Run full consolidation job (dedup + memory consolidation)
|
|
194
|
-
*/
|
|
195
|
-
export async function runFullConsolidationJob(projectId) {
|
|
196
|
-
const stats = {
|
|
197
|
-
clustered: 0,
|
|
198
|
-
merged: 0,
|
|
199
|
-
tokensRecovered: 0,
|
|
200
|
-
deduped: 0,
|
|
201
|
-
consolidated: 0,
|
|
202
|
-
};
|
|
203
|
-
// Run deduplication first
|
|
204
|
-
const dedupResult = await runDeduplicationJob(projectId);
|
|
205
|
-
stats.deduped = dedupResult.duplicatesFound;
|
|
206
|
-
stats.merged = dedupResult.mergedCount;
|
|
207
|
-
stats.tokensRecovered += dedupResult.tokensRecovered;
|
|
208
|
-
// Run memory consolidation for each project
|
|
209
|
-
if (projectId) {
|
|
210
|
-
const consolidationResults = await consolidateMemories({
|
|
211
|
-
projectId,
|
|
212
|
-
minAge: 60,
|
|
213
|
-
maxImportance: 25,
|
|
214
|
-
minClusterSize: 3,
|
|
215
|
-
limit: 100,
|
|
216
|
-
});
|
|
217
|
-
stats.consolidated = consolidationResults.length;
|
|
218
|
-
stats.clustered = consolidationResults.reduce((sum, r) => sum + r.clusterSize, 0);
|
|
219
|
-
}
|
|
220
|
-
logger.info('Full consolidation job completed', stats);
|
|
221
|
-
return stats;
|
|
222
|
-
}
|
|
223
|
-
/**
|
|
224
|
-
* Get deduplication statistics
|
|
225
|
-
*/
|
|
226
|
-
export async function getDeduplicationStats(projectId) {
|
|
227
|
-
try {
|
|
228
|
-
const db = await getDb();
|
|
229
|
-
const schema = await getSchema();
|
|
230
|
-
const whereClause = projectId
|
|
231
|
-
? eq(schema.memories.projectId, projectId)
|
|
232
|
-
: undefined;
|
|
233
|
-
const memories = await db
|
|
234
|
-
.select()
|
|
235
|
-
.from(schema.memories)
|
|
236
|
-
.where(whereClause);
|
|
237
|
-
return {
|
|
238
|
-
totalMemories: memories.length,
|
|
239
|
-
mergedMemories: memories.filter((m) => m.status === 'merged').length,
|
|
240
|
-
pendingDuplicates: 0, // Would need to query associations
|
|
241
|
-
};
|
|
242
|
-
}
|
|
243
|
-
catch (error) {
|
|
244
|
-
logger.error('Error getting deduplication stats', error);
|
|
245
|
-
return { totalMemories: 0, mergedMemories: 0, pendingDuplicates: 0 };
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
//# sourceMappingURL=consolidation.js.map
|