squish-memory 1.1.5 → 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/.env.example +32 -16
- package/CHANGELOG.md +147 -0
- package/README.md +120 -78
- package/{scripts → bin}/dependency-manager.mjs +217 -217
- package/{scripts → bin}/detect-clients.mjs +78 -78
- package/bin/install-interactive.mjs +321 -0
- package/bin/squish-mcp.mjs +44 -0
- package/bin/squish.mjs +33 -0
- package/config/mcp-migration-map.json +1 -6
- package/config/mcp-mode-semantics.json +19 -23
- package/config/mcp-remote-auth.json +3 -26
- package/config/mcp-universal.schema.json +5 -35
- package/config/settings.json +107 -52
- package/config.js +5 -0
- package/config.ts +218 -0
- package/core/adapters/config/claude-code.ts +133 -0
- package/core/adapters/config/cursor.ts +90 -0
- package/core/adapters/config/opencode.ts +89 -0
- package/core/adapters/config/windsurf.ts +90 -0
- package/core/adapters/index.ts +102 -0
- package/core/adapters/timeline.ts +116 -0
- package/core/adapters/types.ts +166 -0
- package/core/agent-preferences.ts +140 -0
- package/core/algorithms/analytics/token-estimator.ts +216 -0
- package/core/algorithms/detection/hash-filters.ts +260 -0
- package/core/algorithms/detection/semantic-ranker.ts +194 -0
- package/core/algorithms/detection/two-stage-detector.ts +421 -0
- package/core/algorithms/handlers/approve-merge.ts +215 -0
- package/core/algorithms/handlers/detect-duplicates.ts +192 -0
- package/core/algorithms/handlers/get-stats.ts +132 -0
- package/core/algorithms/handlers/list-proposals.ts +130 -0
- package/core/algorithms/handlers/preview-merge.ts +139 -0
- package/core/algorithms/handlers/reject-merge.ts +93 -0
- package/core/algorithms/handlers/reverse-merge.ts +155 -0
- package/{dist/core/algorithms/index.js → core/algorithms/index.ts} +39 -26
- package/core/algorithms/operations/cache-maintenance.ts +182 -0
- package/core/algorithms/safety/safety-checks.ts +256 -0
- package/core/algorithms/strategies/merge-strategies.ts +381 -0
- package/core/algorithms/types.ts +140 -0
- package/core/algorithms/utils/response-builder.ts +61 -0
- package/core/associations.ts +363 -0
- package/core/beliefs/decay.ts +289 -0
- package/core/beliefs/extractor.ts +131 -0
- package/core/beliefs/store.ts +557 -0
- package/core/beliefs/types.ts +38 -0
- package/core/commands/mcp-server.ts +5 -0
- package/core/compression.ts +177 -0
- package/core/config.js +2 -0
- package/core/consolidation.ts +330 -0
- package/core/context/agent-context.ts +388 -0
- package/core/context/context-paging.ts +449 -0
- package/core/context/context-window.ts +234 -0
- package/core/context/context.ts +35 -0
- package/core/embeddings/embeddings.ts +616 -0
- package/core/embeddings/google-multimodal.ts +200 -0
- package/{dist/core/local-embeddings.js → core/embeddings/local-embeddings.ts} +12 -11
- package/core/embeddings/qmd-client.ts +495 -0
- package/core/embeddings/transformers-local.ts +261 -0
- package/core/embeddings.js +4 -0
- package/core/error-handling.ts +206 -0
- package/core/external +219 -0
- package/core/graph/entity-deduplicator.ts +232 -0
- package/core/graph/graph-builder.ts +257 -0
- package/core/graph/graph-traversal.ts +490 -0
- package/core/graph/index.ts +24 -0
- package/core/graph/llm-entity-extractor.ts +402 -0
- package/core/graph/multi-hop-retrieval.ts +317 -0
- package/core/graph/relationship-extractor.ts +465 -0
- package/core/hooks/agent-hooks.ts +653 -0
- package/core/hooks/auto-tagger.ts +149 -0
- package/core/hooks/capture-filter.ts +169 -0
- package/core/hot-cache.ts +388 -0
- package/core/index.ts +10 -0
- package/core/ingestion/agent-memory.ts +167 -0
- package/core/ingestion/core-memory.ts +326 -0
- package/core/ingestion/learnings.ts +260 -0
- package/core/ingestion/signal-engine.ts +266 -0
- package/core/integrations/obsidian-vault.ts +197 -0
- package/core/layers/generator.ts +115 -0
- package/{dist/core/lib/db-client.d.ts → core/lib/db-client.ts} +168 -114
- package/core/lib/parse-embedding.ts +59 -0
- package/{dist/core/lib/schemas.js → core/lib/schemas.ts} +102 -87
- package/core/lib/types.ts +49 -0
- package/core/lib/utils.ts +151 -0
- package/core/lib/validation.ts +180 -0
- package/core/lifecycle.ts +353 -0
- package/core/logger.ts +59 -0
- package/core/memory/bridge-discovery.ts +395 -0
- package/core/memory/categorizer.ts +390 -0
- package/core/memory/conflict-detector.ts +62 -0
- package/core/memory/consolidation.ts +372 -0
- package/core/memory/context-collector.ts +75 -0
- package/core/memory/contradiction-resolver.ts +494 -0
- package/core/memory/edit-workflow.ts +174 -0
- package/core/memory/entity-extractor.ts +426 -0
- package/core/memory/entity-resolver.ts +89 -0
- package/core/memory/explain.ts +112 -0
- package/core/memory/fact-deriver.ts +300 -0
- package/core/memory/fact-extractor.ts +120 -0
- package/core/memory/feedback-tracker.ts +200 -0
- package/core/memory/hooks.ts +230 -0
- package/core/memory/hybrid-retrieval.ts +65 -0
- package/core/memory/hybrid-scorer.ts +325 -0
- package/core/memory/hybrid-search.ts +748 -0
- package/core/memory/importance.ts +319 -0
- package/{dist/core/memory/index.js → core/memory/index.ts} +11 -10
- package/core/memory/loader.ts +178 -0
- package/core/memory/markdown/markdown-storage.ts +318 -0
- package/core/memory/memories.ts +565 -0
- package/core/memory/memory-lifecycle.ts +51 -0
- package/core/memory/memory-manager.ts +53 -0
- package/core/memory/migrate.ts +173 -0
- package/core/memory/normalization.ts +30 -0
- package/core/memory/path-strengthener.ts +211 -0
- package/core/memory/progressive-disclosure.ts +392 -0
- package/core/memory/query-processor.ts +130 -0
- package/core/memory/query-rewriter.ts +153 -0
- package/core/memory/response-analyzer.ts +81 -0
- package/core/memory/retrieval-feedback.ts +276 -0
- package/core/memory/serialization.ts +83 -0
- package/core/memory/stale-cleaner.ts +147 -0
- package/core/memory/stats.ts +181 -0
- package/core/memory/telemetry.ts +392 -0
- package/core/memory/temporal-facts.ts +356 -0
- package/core/memory/temporal-parser.ts +477 -0
- package/core/memory/trigger-detector.ts +104 -0
- package/core/memory/write-gate.ts +288 -0
- package/{dist/core/places/index.js → core/places/index.ts} +12 -12
- package/core/places/memory-places.ts +339 -0
- package/core/places/places.ts +406 -0
- package/core/places/rules.ts +308 -0
- package/core/places/walking.ts +192 -0
- package/core/projects +89 -0
- package/core/projects.ts +131 -0
- package/core/redis.ts +82 -0
- package/core/responses.ts +187 -0
- package/core/runtime/trust-report.ts +195 -0
- package/core/runtime/trust-state.ts +360 -0
- package/core/scheduler/cron-scheduler.ts +590 -0
- package/core/scheduler/heartbeat.ts +91 -0
- package/{dist/core/scheduler/index.js → core/scheduler/index.ts} +8 -8
- package/core/scheduler/job-runner.ts +197 -0
- package/core/search/conversations.ts +166 -0
- package/core/search/entities.ts +46 -0
- package/core/search/folder-context.ts +154 -0
- package/core/search/graph-boost.ts +22 -0
- package/{dist/core/search/index.js → core/search/index.ts} +4 -5
- package/core/search/qmd-wrapper.ts +84 -0
- package/core/security/encrypt.ts +51 -0
- package/core/security/governance.ts +102 -0
- package/core/security/privacy.ts +108 -0
- package/core/security/secret-detector.ts +122 -0
- package/core/session/auto-load.ts +160 -0
- package/core/session/entity-tracker.ts +363 -0
- package/{dist/core/session/index.js → core/session/index.ts} +7 -7
- package/core/session/reference-resolver.ts +158 -0
- package/core/session/self-iteration-job.ts +478 -0
- package/core/session/session-hooks.ts +69 -0
- package/core/session/types.ts +36 -0
- package/core/session/working-set.ts +275 -0
- package/{dist/core/snapshots/cleanup.js → core/snapshots/cleanup.ts} +13 -12
- package/core/snapshots/comparison.ts +59 -0
- package/core/snapshots/creation.ts +139 -0
- package/core/snapshots/retrieval.ts +44 -0
- package/core/snapshots/stats.ts +63 -0
- package/core/storage/cache.ts +241 -0
- package/core/storage/database.ts +23 -0
- package/{dist/core/summarization/cleanup.js → core/summarization/cleanup.ts} +13 -12
- package/core/summarization/queries.ts +32 -0
- package/core/summarization/stats.ts +64 -0
- package/core/summarization/strategies.ts +52 -0
- package/core/summarization.ts +248 -0
- package/core/temporal-facts.ts +244 -0
- package/core/tracing/collector.ts +470 -0
- package/core/tracing/visualizer.ts +195 -0
- package/core/utils/cleanup-operations.ts +50 -0
- package/core/utils/content-extraction.ts +95 -0
- package/core/utils/filter-builder.ts +56 -0
- package/core/utils/history-traversal.ts +63 -0
- package/core/utils/memory-operations.ts +56 -0
- package/core/utils/query-operations.ts +83 -0
- package/core/utils/summarization-helpers.ts +45 -0
- package/core/utils/temporal-queries.ts +39 -0
- package/{dist/core/utils/vector-operations.js → core/utils/vector-operations.ts} +135 -129
- package/core/utils/version-management.ts +74 -0
- package/core/worker.ts +333 -0
- package/db/adapter.ts +215 -0
- package/{dist/db/bootstrap.js → db/bootstrap.ts} +388 -418
- package/db/drizzle/migrations/0000_needy_cerebro.sql +402 -0
- package/db/drizzle/migrations/meta/0000_snapshot.json +3451 -0
- package/db/drizzle/migrations/meta/_journal.json +13 -0
- package/db/drizzle/schema-sqlite.ts +1032 -0
- package/db/drizzle/schema.ts +1128 -0
- package/db/drizzle.config.ts +12 -0
- package/db/index.ts +83 -0
- package/db/init.sql +5 -0
- package/db/migrations/associations.ts +35 -0
- package/db/migrations/beliefs.ts +89 -0
- package/db/migrations/core-memory.ts +35 -0
- package/db/migrations/fts.ts +59 -0
- package/db/migrations/index.ts +54 -0
- package/db/migrations/indexes.ts +36 -0
- package/db/migrations/learnings.ts +34 -0
- package/db/migrations/maintenance.ts +68 -0
- package/db/migrations/memories.ts +22 -0
- package/db/migrations/memory-places.ts +35 -0
- package/db/migrations/places.ts +49 -0
- package/db/migrations/projects.ts +21 -0
- package/db/migrations/tier-conversion.ts +24 -0
- package/db/neon.ts +22 -0
- package/db/schema/beliefs.ts +50 -0
- package/db/schema/generator.ts +159 -0
- package/db/schema/index.ts +58 -0
- package/db/schema/learnings.ts +32 -0
- package/db/schema/memories.ts +83 -0
- package/db/schema/projects.ts +33 -0
- package/db/schema.ts +13 -0
- package/db/supabase.ts +27 -0
- package/mcp.json.example +8 -11
- package/package.json +140 -159
- package/packages/cli/package.json +22 -0
- package/packages/cli/src/commands/clean.ts +68 -0
- package/packages/cli/src/commands/context.ts +79 -0
- package/packages/cli/src/commands/doctor.ts +357 -0
- package/packages/cli/src/commands/forget.ts +72 -0
- package/packages/cli/src/commands/health.ts +36 -0
- package/packages/cli/src/commands/inspect.ts +41 -0
- package/packages/cli/src/commands/link.ts +50 -0
- package/packages/cli/src/commands/migrate.ts +93 -0
- package/packages/cli/src/commands/recall.ts +99 -0
- package/packages/cli/src/commands/recent.ts +57 -0
- package/packages/cli/src/commands/remember.ts +139 -0
- package/packages/cli/src/commands/run.ts +58 -0
- package/packages/cli/src/commands/stale.ts +43 -0
- package/packages/cli/src/commands/stats.ts +42 -0
- package/packages/cli/src/index.ts +57 -0
- package/packages/cli/tsconfig.json +24 -0
- package/packages/mcp/package.json +26 -0
- package/packages/mcp/src/index.ts +940 -0
- package/packages/mcp/tsconfig.json +20 -0
- package/skills/squish-memory/SKILL.md +38 -35
- package/skills/squish-memory/{scripts/install.sh → install.sh} +1 -1
- package/skills/squish-memory/references/claude-desktop.json +12 -0
- package/skills/squish-memory/references/openclaw.json +13 -0
- package/skills/squish-memory/references/opencode.json +14 -0
- package/config/hooks/claude-code-hooks.json +0 -39
- package/config/hooks/cursor-hooks.json +0 -30
- package/config/hooks/opencode-hooks.json +0 -30
- package/config/hooks/windsurf-hooks.json +0 -30
- package/config/mcp-cli-fallback-policy.json +0 -22
- package/config/mcp.json +0 -38
- package/config/plugin-manifest.json +0 -101
- package/config/plugin-manifest.schema.json +0 -244
- package/config/plugin.json +0 -32
- package/config/remote-memory-policy.json +0 -32
- package/core/commands/context-paging.md +0 -51
- package/core/commands/context-status.md +0 -22
- package/core/commands/context.md +0 -5
- package/core/commands/core-memory.md +0 -56
- package/core/commands/health.md +0 -5
- package/core/commands/init.md +0 -39
- package/core/commands/merge.md +0 -113
- package/core/commands/recall.md +0 -5
- package/core/commands/remember.md +0 -11
- package/core/commands/search.md +0 -10
- package/dist/config.d.ts +0 -83
- package/dist/config.js +0 -242
- 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 -157
- package/dist/core/adapters/types.js +0 -50
- 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/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 -22
- 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 -133
- 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 -31
- package/dist/core/associations.js +0 -248
- package/dist/core/autosave.d.ts +0 -19
- package/dist/core/autosave.js +0 -16
- package/dist/core/commands/managed-sync.d.ts +0 -10
- package/dist/core/commands/managed-sync.js +0 -64
- package/dist/core/commands/mcp-server.d.ts +0 -3
- package/dist/core/commands/mcp-server.js +0 -739
- 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/google-multimodal.d.ts +0 -14
- package/dist/core/embeddings/google-multimodal.js +0 -142
- package/dist/core/embeddings/qmd-client.d.ts +0 -136
- package/dist/core/embeddings/qmd-client.js +0 -403
- package/dist/core/embeddings.d.ts +0 -29
- package/dist/core/embeddings.js +0 -454
- package/dist/core/error-handling.d.ts +0 -63
- package/dist/core/error-handling.js +0 -173
- package/dist/core/external-folder/index.d.ts +0 -102
- package/dist/core/external-folder/index.js +0 -294
- package/dist/core/hooks/agent-hooks.d.ts +0 -74
- package/dist/core/hooks/agent-hooks.js +0 -244
- 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/index.d.ts +0 -10
- package/dist/core/index.js +0 -14
- 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 -202
- package/dist/core/layers/generator.d.ts +0 -25
- package/dist/core/layers/generator.js +0 -76
- package/dist/core/lib/db-client.js +0 -130
- package/dist/core/lib/schemas.d.ts +0 -129
- package/dist/core/lib/utils.d.ts +0 -14
- package/dist/core/lib/utils.js +0 -90
- package/dist/core/lib/validation.d.ts +0 -38
- package/dist/core/lib/validation.js +0 -151
- package/dist/core/lifecycle.d.ts +0 -26
- package/dist/core/lifecycle.js +0 -302
- package/dist/core/local-embeddings.d.ts +0 -11
- package/dist/core/logger.d.ts +0 -16
- package/dist/core/logger.js +0 -40
- 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 -9
- package/dist/core/mcp/tools.js +0 -365
- package/dist/core/mcp/types.d.ts +0 -315
- 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 -305
- 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 -303
- 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 -33
- package/dist/core/memory/entity-extractor.js +0 -336
- package/dist/core/memory/entity-resolver.d.ts +0 -23
- package/dist/core/memory/entity-resolver.js +0 -64
- 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 -29
- package/dist/core/memory/hybrid-retrieval.js +0 -139
- package/dist/core/memory/hybrid-scorer.d.ts +0 -40
- package/dist/core/memory/hybrid-scorer.js +0 -284
- package/dist/core/memory/hybrid-search.d.ts +0 -20
- package/dist/core/memory/hybrid-search.js +0 -359
- package/dist/core/memory/importance.d.ts +0 -63
- package/dist/core/memory/importance.js +0 -298
- package/dist/core/memory/index.d.ts +0 -8
- 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 -47
- package/dist/core/memory/memories.js +0 -449
- package/dist/core/memory/memory-lifecycle.d.ts +0 -8
- package/dist/core/memory/memory-lifecycle.js +0 -55
- 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 -22
- package/dist/core/memory/normalization.js +0 -26
- 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 -72
- 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/serialization.d.ts +0 -10
- package/dist/core/memory/serialization.js +0 -84
- package/dist/core/memory/stats.d.ts +0 -22
- package/dist/core/memory/stats.js +0 -138
- 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 -14
- package/dist/core/memory/trigger-detector.js +0 -42
- package/dist/core/memory/write-gate.d.ts +0 -54
- package/dist/core/memory/write-gate.js +0 -210
- package/dist/core/namespaces/index.d.ts +0 -71
- package/dist/core/namespaces/index.js +0 -305
- package/dist/core/namespaces/uri-parser.d.ts +0 -31
- package/dist/core/namespaces/uri-parser.js +0 -74
- package/dist/core/obsidian-vault.d.ts +0 -30
- package/dist/core/obsidian-vault.js +0 -94
- package/dist/core/places/index.d.ts +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 -108
- 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/scheduler/cron-scheduler.d.ts +0 -32
- package/dist/core/scheduler/cron-scheduler.js +0 -332
- 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/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/qmd-search.d.ts +0 -61
- package/dist/core/search/qmd-search.js +0 -178
- 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 -119
- package/dist/core/session/index.d.ts +0 -7
- package/dist/core/session/self-iteration-job.d.ts +0 -20
- package/dist/core/session/self-iteration-job.js +0 -282
- 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-hooks/self-iteration-job.d.ts +0 -20
- package/dist/core/session-hooks/self-iteration-job.js +0 -282
- package/dist/core/session-hooks/session-hooks.d.ts +0 -18
- package/dist/core/session-hooks/session-hooks.js +0 -58
- package/dist/core/snapshots/cleanup.d.ts +0 -9
- 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 -19
- package/dist/core/snapshots/creation.js +0 -126
- 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/snapshots.d.ts +0 -29
- package/dist/core/snapshots.js +0 -220
- 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/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/sync/qmd-sync.d.ts +0 -94
- package/dist/core/sync/qmd-sync.js +0 -201
- package/dist/core/temporal-facts.d.ts +0 -54
- package/dist/core/temporal-facts.js +0 -193
- package/dist/core/toon.d.ts +0 -43
- package/dist/core/toon.js +0 -160
- 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 -21
- package/dist/core/utils/summarization-helpers.js +0 -38
- 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/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 -9
- package/dist/db/drizzle/schema-sqlite.d.ts +0 -4837
- package/dist/db/drizzle/schema-sqlite.js +0 -684
- package/dist/db/drizzle/schema.d.ts +0 -4082
- package/dist/db/drizzle/schema.js +0 -770
- 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/neon.d.ts +0 -8
- package/dist/db/neon.js +0 -20
- package/dist/db/schema/index.d.ts +0 -40
- package/dist/db/schema/index.js +0 -105
- 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/index.d.ts +0 -7
- package/dist/index.js +0 -1677
- package/dist/vendor/sql.js/sql-wasm.wasm +0 -0
- package/dist/webui/server.d.ts +0 -5
- package/dist/webui/server.js +0 -642
- package/generated/mcp/manifest.json +0 -23
- package/generated/mcp/mcp-servers.json +0 -25
- package/generated/mcp/mcporter.json +0 -34
- package/generated/mcp/openclaw-memory-qmd.json +0 -17
- package/generated/mcp/runtime.json +0 -12
- package/scripts/README.md +0 -60
- package/scripts/build-release.sh +0 -36
- package/scripts/check-secrets.js +0 -132
- package/scripts/copy-runtime-assets.mjs +0 -26
- package/scripts/generate-mcp.mjs +0 -264
- package/scripts/github-release.sh +0 -77
- package/scripts/init-dirs.mjs +0 -13
- package/scripts/install-claude-code.sh +0 -85
- package/scripts/install-cursor.sh +0 -56
- package/scripts/install-hooks.sh +0 -73
- package/scripts/install-interactive.mjs +0 -357
- package/scripts/install-opencode.sh +0 -75
- package/scripts/install-plugin.mjs +0 -415
- package/scripts/install-windsurf.sh +0 -67
- package/scripts/remote-preflight.mjs +0 -62
- package/scripts/squish-fallback.mjs +0 -132
- package/scripts/test-interactive.mjs +0 -131
- package/scripts/verify-mcp.mjs +0 -214
- package/skills/squish-memory/scripts/install.mjs +0 -335
- package/skills/squish-memory/write_skill.js +0 -2
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Importance Scoring System
|
|
3
|
+
* Calculates and manages memory importance scores (0-100) with temporal decay
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { Memory } from '../../db/drizzle/schema.js';
|
|
7
|
+
import { eq } from 'drizzle-orm';
|
|
8
|
+
import { cosineSimilarity as vectorCosineSimilarity } from '../utils/vector-operations.js';
|
|
9
|
+
import { getDbClient } from '../lib/db-client.js';
|
|
10
|
+
|
|
11
|
+
export interface ImportanceScore {
|
|
12
|
+
score: number; // 0-100
|
|
13
|
+
components: {
|
|
14
|
+
base: number;
|
|
15
|
+
recency: number;
|
|
16
|
+
accessFrequency: number;
|
|
17
|
+
typeWeight: number;
|
|
18
|
+
userFlags: number;
|
|
19
|
+
};
|
|
20
|
+
explanation: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Type weights for importance scoring
|
|
25
|
+
* Higher values = more important memory types
|
|
26
|
+
*/
|
|
27
|
+
const TYPE_WEIGHTS: Record<string, number> = {
|
|
28
|
+
decision: 15,
|
|
29
|
+
fact: 10,
|
|
30
|
+
preference: 8,
|
|
31
|
+
context: 5,
|
|
32
|
+
observation: 0,
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Calculate importance score for a memory
|
|
37
|
+
*
|
|
38
|
+
* Formula: base + recency + accessFrequency + typeWeight + userFlags
|
|
39
|
+
* All values are clamped to 0-100 range
|
|
40
|
+
*/
|
|
41
|
+
export function calculateImportance(memory: Partial<Memory>): ImportanceScore {
|
|
42
|
+
const components = {
|
|
43
|
+
base: 50, // Neutral starting point
|
|
44
|
+
recency: calculateRecencyComponent(memory),
|
|
45
|
+
accessFrequency: calculateAccessFrequencyComponent(memory),
|
|
46
|
+
typeWeight: calculateTypeWeightComponent(memory),
|
|
47
|
+
userFlags: calculateUserFlagsComponent(memory),
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
// Calculate total score (clamped to 0-100)
|
|
51
|
+
const score = Math.min(
|
|
52
|
+
100,
|
|
53
|
+
Math.max(
|
|
54
|
+
0,
|
|
55
|
+
components.base +
|
|
56
|
+
components.recency +
|
|
57
|
+
components.accessFrequency +
|
|
58
|
+
components.typeWeight +
|
|
59
|
+
components.userFlags
|
|
60
|
+
)
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
return {
|
|
64
|
+
score,
|
|
65
|
+
components,
|
|
66
|
+
explanation: generateImportanceExplanation(components, memory),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Calculate recency component (0-30 points)
|
|
72
|
+
* Uses exponential decay based on memory age
|
|
73
|
+
*/
|
|
74
|
+
function calculateRecencyComponent(memory: Partial<Memory>): number {
|
|
75
|
+
if (!memory.createdAt) return 0;
|
|
76
|
+
|
|
77
|
+
const now = Date.now();
|
|
78
|
+
const createdAt = new Date(memory.createdAt).getTime();
|
|
79
|
+
const ageDays = (now - createdAt) / (1000 * 60 * 60 * 24);
|
|
80
|
+
|
|
81
|
+
// Decay rate: default 30 days half-life
|
|
82
|
+
const decayRate = memory.importanceDecayRate ?? 30;
|
|
83
|
+
|
|
84
|
+
// Exponential decay: 30 * (0.5 ^ (age / halfLife))
|
|
85
|
+
// Maximum 30 points for very recent memories
|
|
86
|
+
const recencyScore = 30 * Math.pow(0.5, ageDays / decayRate);
|
|
87
|
+
|
|
88
|
+
return Math.max(0, Math.min(30, recencyScore));
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Calculate access frequency component (0-15 points)
|
|
93
|
+
* More frequently accessed memories are more important
|
|
94
|
+
*/
|
|
95
|
+
function calculateAccessFrequencyComponent(memory: Partial<Memory>): number {
|
|
96
|
+
const accessCount = memory.accessCount ?? 0;
|
|
97
|
+
const usageCount = memory.usageCount ?? 0;
|
|
98
|
+
|
|
99
|
+
// Combined access count (from both fields)
|
|
100
|
+
const totalAccess = accessCount + usageCount;
|
|
101
|
+
|
|
102
|
+
// Logarithmic scaling: 15 * log10(totalAccess + 1)
|
|
103
|
+
// This gives diminishing returns for high access counts
|
|
104
|
+
const accessScore = 15 * Math.log10(totalAccess + 1);
|
|
105
|
+
|
|
106
|
+
return Math.min(15, accessScore);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Calculate type weight component (0-15 points)
|
|
111
|
+
* Different memory types have different inherent importance
|
|
112
|
+
*/
|
|
113
|
+
function calculateTypeWeightComponent(memory: Partial<Memory>): number {
|
|
114
|
+
const type = memory.type ?? 'observation';
|
|
115
|
+
return TYPE_WEIGHTS[type] ?? 0;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Calculate user flags component (0 or +20 points)
|
|
120
|
+
* Pinned or protected memories get maximum importance
|
|
121
|
+
*/
|
|
122
|
+
function calculateUserFlagsComponent(memory: Partial<Memory>): number {
|
|
123
|
+
// Pinned memories get maximum boost
|
|
124
|
+
if (memory.isPinned) return 20;
|
|
125
|
+
|
|
126
|
+
// Protected memories also get significant boost
|
|
127
|
+
if (memory.isProtected) return 15;
|
|
128
|
+
|
|
129
|
+
// Immutable memories are important but not as much
|
|
130
|
+
if (memory.isImmutable) return 10;
|
|
131
|
+
|
|
132
|
+
return 0;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Generate human-readable explanation for importance score
|
|
137
|
+
*/
|
|
138
|
+
function generateImportanceExplanation(
|
|
139
|
+
components: ImportanceScore['components'],
|
|
140
|
+
memory: Partial<Memory>
|
|
141
|
+
): string {
|
|
142
|
+
const parts: string[] = [];
|
|
143
|
+
|
|
144
|
+
// Base score
|
|
145
|
+
parts.push(`base: ${components.base}`);
|
|
146
|
+
|
|
147
|
+
// Recency
|
|
148
|
+
if (components.recency > 20) {
|
|
149
|
+
parts.push('very recent');
|
|
150
|
+
} else if (components.recency > 10) {
|
|
151
|
+
parts.push('recent');
|
|
152
|
+
} else if (components.recency > 0) {
|
|
153
|
+
parts.push('somewhat recent');
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Access frequency
|
|
157
|
+
const totalAccess = (memory.accessCount ?? 0) + (memory.usageCount ?? 0);
|
|
158
|
+
if (totalAccess > 10) {
|
|
159
|
+
parts.push('frequently accessed');
|
|
160
|
+
} else if (totalAccess > 3) {
|
|
161
|
+
parts.push('occasionally accessed');
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Type
|
|
165
|
+
const type = memory.type ?? 'observation';
|
|
166
|
+
if (type !== 'observation') {
|
|
167
|
+
parts.push(`${type} type`);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// User flags
|
|
171
|
+
if (memory.isPinned) {
|
|
172
|
+
parts.push('pinned by user');
|
|
173
|
+
} else if (memory.isProtected) {
|
|
174
|
+
parts.push('protected');
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
return parts.join(', ');
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Update importance score for a memory
|
|
182
|
+
* Used when memory is accessed or modified
|
|
183
|
+
*/
|
|
184
|
+
export async function updateImportanceScore(
|
|
185
|
+
memoryId: string,
|
|
186
|
+
incrementAccess: boolean = false
|
|
187
|
+
): Promise<number> {
|
|
188
|
+
const { db, schema } = await getDbClient();
|
|
189
|
+
|
|
190
|
+
// Get current memory
|
|
191
|
+
const memories = await db
|
|
192
|
+
.select()
|
|
193
|
+
.from(schema.memories)
|
|
194
|
+
.where(eq(schema.memories.id, memoryId))
|
|
195
|
+
.limit(1);
|
|
196
|
+
|
|
197
|
+
if (memories.length === 0) {
|
|
198
|
+
throw new Error(`Memory not found: ${memoryId}`);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
const memory = memories[0];
|
|
202
|
+
|
|
203
|
+
// Calculate new importance score
|
|
204
|
+
const importance = calculateImportance(memory);
|
|
205
|
+
|
|
206
|
+
// Update memory with new score
|
|
207
|
+
const updateData: any = {
|
|
208
|
+
importanceScore: importance.score,
|
|
209
|
+
lastImportanceRecalc: new Date(),
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
// Increment access count if requested
|
|
213
|
+
if (incrementAccess) {
|
|
214
|
+
updateData.accessCount = (memory.accessCount ?? 0) + 1;
|
|
215
|
+
updateData.lastAccessedAt = new Date();
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
await db
|
|
219
|
+
.update(schema.memories)
|
|
220
|
+
.set(updateData)
|
|
221
|
+
.where(eq(schema.memories.id, memoryId));
|
|
222
|
+
|
|
223
|
+
return importance.score;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Get low-importance memories that are candidates for consolidation
|
|
228
|
+
* These are old, rarely accessed memories with low importance scores
|
|
229
|
+
*/
|
|
230
|
+
export async function getLowImportanceMemories(
|
|
231
|
+
projectId: string,
|
|
232
|
+
options: {
|
|
233
|
+
minAge?: number; // days
|
|
234
|
+
maxImportance?: number; // 0-100
|
|
235
|
+
limit?: number;
|
|
236
|
+
} = {}
|
|
237
|
+
): Promise<any[]> {
|
|
238
|
+
const { db, schema } = await getDbClient();
|
|
239
|
+
|
|
240
|
+
const {
|
|
241
|
+
minAge = 90, // 90 days old by default
|
|
242
|
+
maxImportance = 30, // importance score below 30
|
|
243
|
+
limit = 100,
|
|
244
|
+
} = options;
|
|
245
|
+
|
|
246
|
+
const minAgeTimestamp = new Date(Date.now() - minAge * 24 * 60 * 60 * 1000);
|
|
247
|
+
|
|
248
|
+
const memories = await db
|
|
249
|
+
.select()
|
|
250
|
+
.from(schema.memories)
|
|
251
|
+
.where(eq(schema.memories.projectId, projectId))
|
|
252
|
+
.all();
|
|
253
|
+
|
|
254
|
+
// Filter by criteria
|
|
255
|
+
return memories
|
|
256
|
+
.filter((m: any) => {
|
|
257
|
+
// Skip pinned/protected/consolidated
|
|
258
|
+
if (m.isPinned || m.isProtected || m.isConsolidated) {
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// Check age
|
|
263
|
+
if (m.createdAt) {
|
|
264
|
+
const createdAt = new Date(m.createdAt).getTime();
|
|
265
|
+
if (createdAt > minAgeTimestamp.getTime()) {
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// Check importance
|
|
271
|
+
if ((m.importanceScore ?? 50) > maxImportance) {
|
|
272
|
+
return false;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
return true;
|
|
276
|
+
})
|
|
277
|
+
.slice(0, limit);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Set importance score manually (for user override)
|
|
282
|
+
*/
|
|
283
|
+
export async function setImportanceScore(
|
|
284
|
+
memoryId: string,
|
|
285
|
+
score: number
|
|
286
|
+
): Promise<void> {
|
|
287
|
+
if (score < 0 || score > 100) {
|
|
288
|
+
throw new Error('Importance score must be between 0 and 100');
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
const { db, schema } = await getDbClient();
|
|
292
|
+
|
|
293
|
+
await db
|
|
294
|
+
.update(schema.memories)
|
|
295
|
+
.set({
|
|
296
|
+
importanceScore: Math.round(score),
|
|
297
|
+
lastImportanceRecalc: new Date(),
|
|
298
|
+
})
|
|
299
|
+
.where(eq(schema.memories.id, memoryId));
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* Pin a memory to prevent decay and consolidation
|
|
304
|
+
*/
|
|
305
|
+
export async function pinMemory(memoryId: string, pinned: boolean = true): Promise<void> {
|
|
306
|
+
const { db, schema } = await getDbClient();
|
|
307
|
+
|
|
308
|
+
await db
|
|
309
|
+
.update(schema.memories)
|
|
310
|
+
.set({
|
|
311
|
+
isPinned: pinned ? 1 : 0,
|
|
312
|
+
// When pinning, set max importance; when unpinning, recalculate
|
|
313
|
+
importanceScore: pinned ? 100 : undefined,
|
|
314
|
+
lastImportanceRecalc: new Date(),
|
|
315
|
+
})
|
|
316
|
+
.where(eq(schema.memories.id, memoryId));
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// cosineSimilarity has been removed - import from core/utils/vector-operations.ts directly
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
// Memory feature - Store and manage memories
|
|
2
|
-
export * from './
|
|
3
|
-
export * from './
|
|
4
|
-
export * from './
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
export * from './
|
|
9
|
-
export * from './
|
|
10
|
-
|
|
1
|
+
// Memory feature - Store and manage memories
|
|
2
|
+
export * from './normalization.js';
|
|
3
|
+
export * from './memories.js';
|
|
4
|
+
export * from './memory-manager.js';
|
|
5
|
+
export * from './serialization.js';
|
|
6
|
+
|
|
7
|
+
// Advanced memory features
|
|
8
|
+
export * from './temporal-parser.js';
|
|
9
|
+
export * from './entity-extractor.js';
|
|
10
|
+
export * from './hybrid-scorer.js';
|
|
11
|
+
export * from './bridge-discovery.js';
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Loading Abstraction
|
|
3
|
+
* Unified utilities for loading memories by ID with configurable options
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { eq, inArray } from 'drizzle-orm';
|
|
7
|
+
import { getDbClient } from '../lib/db-client.js';
|
|
8
|
+
import { decrypt } from '../security/encrypt.js';
|
|
9
|
+
import { normalizeMemory, type MemoryRecord } from './normalization.js';
|
|
10
|
+
import { requireUuid } from '../lib/validation.js';
|
|
11
|
+
import { withDatabaseErrorHandling } from '../lib/utils.js';
|
|
12
|
+
|
|
13
|
+
export interface LoadMemoryOptions {
|
|
14
|
+
incrementAccess?: boolean;
|
|
15
|
+
decrypt?: boolean;
|
|
16
|
+
normalize?: boolean;
|
|
17
|
+
includeSensitive?: boolean;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Load a single memory by ID with configurable options
|
|
22
|
+
*/
|
|
23
|
+
export async function loadMemory(
|
|
24
|
+
id: string,
|
|
25
|
+
options: LoadMemoryOptions = {}
|
|
26
|
+
): Promise<MemoryRecord | any | null> {
|
|
27
|
+
const { incrementAccess = true, decrypt: shouldDecrypt = true, normalize = true, includeSensitive = false } = options;
|
|
28
|
+
|
|
29
|
+
// Validate UUID
|
|
30
|
+
requireUuid(id);
|
|
31
|
+
|
|
32
|
+
const { db, schema } = await getDbClient();
|
|
33
|
+
|
|
34
|
+
// Query the memory
|
|
35
|
+
const rows = await db.select().from(schema.memories).where(eq(schema.memories.id, id)).limit(1);
|
|
36
|
+
const row = rows[0];
|
|
37
|
+
if (!row) return null;
|
|
38
|
+
|
|
39
|
+
// Increment access count if needed
|
|
40
|
+
if (incrementAccess) {
|
|
41
|
+
await db.update(schema.memories)
|
|
42
|
+
.set({
|
|
43
|
+
accessCount: (row.accessCount ?? 0) + 1,
|
|
44
|
+
lastAccessedAt: new Date(),
|
|
45
|
+
})
|
|
46
|
+
.where(eq(schema.memories.id, id));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Determine content: decrypt if needed
|
|
50
|
+
let content = row.content;
|
|
51
|
+
let encryptedContent = row.encrypted_content;
|
|
52
|
+
let encryptionNonce = row.encryption_nonce;
|
|
53
|
+
|
|
54
|
+
if (shouldDecrypt && row.is_encrypted) {
|
|
55
|
+
try {
|
|
56
|
+
content = decrypt(encryptedContent, encryptionNonce);
|
|
57
|
+
} catch (e) {
|
|
58
|
+
console.warn('Failed to decrypt memory', e);
|
|
59
|
+
content = row.content; // fallback to stored content (encrypted)
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Build result object
|
|
64
|
+
let result: any = { ...row, content };
|
|
65
|
+
|
|
66
|
+
// If not decrypting and includeSensitive, keep encrypted fields
|
|
67
|
+
if (!shouldDecrypt && includeSensitive) {
|
|
68
|
+
result.encrypted_content = encryptedContent;
|
|
69
|
+
result.encryption_nonce = encryptionNonce;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// If normalize, convert to MemoryRecord shape
|
|
73
|
+
if (normalize) {
|
|
74
|
+
return normalizeMemory(result);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Otherwise return raw-ish row (with content possibly decrypted)
|
|
78
|
+
return result;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Load multiple memories by IDs efficiently
|
|
83
|
+
* Returns a Map keyed by memory ID
|
|
84
|
+
*/
|
|
85
|
+
export async function loadMemories(
|
|
86
|
+
ids: string[],
|
|
87
|
+
options: LoadMemoryOptions = {}
|
|
88
|
+
): Promise<Map<string, any>> {
|
|
89
|
+
const { incrementAccess = true, decrypt: shouldDecrypt = true, normalize = true, includeSensitive = false } = options;
|
|
90
|
+
|
|
91
|
+
if (ids.length === 0) {
|
|
92
|
+
return new Map();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Validate all UUIDs
|
|
96
|
+
for (const id of ids) {
|
|
97
|
+
requireUuid(id);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const { db, schema } = await getDbClient();
|
|
101
|
+
|
|
102
|
+
// Batch query using IN operator
|
|
103
|
+
const rows = await db
|
|
104
|
+
.select()
|
|
105
|
+
.from(schema.memories)
|
|
106
|
+
.where(inArray(schema.memories.id, ids));
|
|
107
|
+
|
|
108
|
+
// Create a map from id to row
|
|
109
|
+
const rowMap = new Map<string, any>();
|
|
110
|
+
for (const row of rows) {
|
|
111
|
+
rowMap.set(row.id, row);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Increment access counts if needed
|
|
115
|
+
if (incrementAccess) {
|
|
116
|
+
const now = new Date();
|
|
117
|
+
for (const row of rows) {
|
|
118
|
+
await db.update(schema.memories)
|
|
119
|
+
.set({
|
|
120
|
+
accessCount: (row.accessCount ?? 0) + 1,
|
|
121
|
+
lastAccessedAt: now,
|
|
122
|
+
})
|
|
123
|
+
.where(eq(schema.memories.id, row.id));
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Process each row according to options
|
|
128
|
+
const resultMap = new Map<string, any>();
|
|
129
|
+
for (const row of rows) {
|
|
130
|
+
let content = row.content;
|
|
131
|
+
let encryptedContent = row.encrypted_content;
|
|
132
|
+
let encryptionNonce = row.encryption_nonce;
|
|
133
|
+
|
|
134
|
+
if (shouldDecrypt && row.is_encrypted) {
|
|
135
|
+
try {
|
|
136
|
+
content = decrypt(encryptedContent, encryptionNonce);
|
|
137
|
+
} catch (e) {
|
|
138
|
+
console.warn('Failed to decrypt memory', e);
|
|
139
|
+
content = row.content;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
let result: any = { ...row, content };
|
|
144
|
+
|
|
145
|
+
if (!shouldDecrypt && includeSensitive) {
|
|
146
|
+
result.encrypted_content = encryptedContent;
|
|
147
|
+
result.encryption_nonce = encryptionNonce;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (normalize) {
|
|
151
|
+
resultMap.set(row.id, normalizeMemory(result));
|
|
152
|
+
} else {
|
|
153
|
+
resultMap.set(row.id, result);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
return resultMap;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Load a memory by ID with raw database access, no processing.
|
|
162
|
+
*
|
|
163
|
+
* This is for special cases that need the raw database row without
|
|
164
|
+
* normalization, decryption, or access count updates.
|
|
165
|
+
*
|
|
166
|
+
* @param id - Memory UUID
|
|
167
|
+
* @returns Raw database row or null if not found
|
|
168
|
+
*/
|
|
169
|
+
export async function loadMemoryRaw(id: string): Promise<any | null> {
|
|
170
|
+
// Validate UUID
|
|
171
|
+
requireUuid(id);
|
|
172
|
+
|
|
173
|
+
const { db, schema } = await getDbClient();
|
|
174
|
+
|
|
175
|
+
// Direct query without any processing
|
|
176
|
+
const rows = await db.select().from(schema.memories).where(eq(schema.memories.id, id)).limit(1);
|
|
177
|
+
return rows[0] || null;
|
|
178
|
+
}
|