squish-memory 1.1.5 → 1.2.0
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 +46 -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/core/algorithms/index.ts +39 -0
- 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/core/lib/db-client.ts +168 -0
- package/core/lib/parse-embedding.ts +59 -0
- package/core/lib/schemas.ts +102 -0
- 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/core/memory/index.ts +11 -0
- 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/core/places/index.ts +14 -0
- 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 +581 -0
- package/core/scheduler/heartbeat.ts +91 -0
- package/core/scheduler/index.ts +8 -0
- 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/core/search/index.ts +4 -0
- 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/core/session/index.ts +7 -0
- 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/core/snapshots/cleanup.ts +13 -0
- 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/core/summarization/cleanup.ts +13 -0
- 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/core/utils/vector-operations.ts +135 -0
- package/core/utils/version-management.ts +74 -0
- package/core/worker.ts +324 -0
- package/db/adapter.ts +215 -0
- package/db/bootstrap.ts +1055 -0
- 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/dist/config.d.ts +40 -17
- package/dist/config.js +150 -198
- package/dist/core/adapters/types.d.ts +13 -33
- package/dist/core/adapters/types.js +1 -1
- package/dist/core/agent-preferences.d.ts +16 -0
- package/dist/core/agent-preferences.js +124 -0
- package/dist/core/algorithms/safety/safety-checks.d.ts +1 -5
- package/dist/core/algorithms/types.d.ts +0 -8
- package/dist/core/associations.d.ts +3 -1
- package/dist/core/associations.js +37 -1
- package/dist/core/beliefs/decay.d.ts +27 -0
- package/dist/core/beliefs/decay.js +217 -0
- package/dist/core/beliefs/extractor.d.ts +9 -0
- package/dist/core/beliefs/extractor.js +113 -0
- package/dist/core/beliefs/store.d.ts +46 -0
- package/dist/core/beliefs/store.js +466 -0
- package/dist/core/beliefs/types.d.ts +28 -0
- package/dist/core/beliefs/types.js +2 -0
- package/dist/core/commands/mcp-server.d.ts +0 -1
- package/dist/core/commands/mcp-server.js +4 -737
- package/dist/core/commands/remember.d.ts +24 -0
- package/dist/core/commands/remember.js +144 -0
- package/dist/core/{toon.d.ts → compression.d.ts} +6 -4
- package/dist/core/{toon.js → compression.js} +8 -8
- package/dist/core/context/agent-context.js +1 -1
- package/dist/core/embeddings/embeddings.d.ts +29 -0
- package/dist/core/embeddings/embeddings.js +546 -0
- package/dist/core/embeddings/google-multimodal.js +6 -2
- package/dist/core/{local-embeddings.d.ts → embeddings/local-embeddings.d.ts} +1 -1
- package/dist/core/embeddings/local-embeddings.js +11 -0
- package/dist/core/embeddings/qmd-client.js +1 -1
- package/dist/core/embeddings/transformers-local.d.ts +64 -0
- package/dist/core/embeddings/transformers-local.js +213 -0
- package/dist/core/embeddings.d.ts +1 -28
- package/dist/core/embeddings.js +2 -453
- package/dist/core/graph/entity-deduplicator.d.ts +24 -0
- package/dist/core/graph/entity-deduplicator.js +183 -0
- package/dist/core/graph/graph-builder.d.ts +46 -0
- package/dist/core/graph/graph-builder.js +174 -0
- package/dist/core/graph/graph-traversal.d.ts +80 -0
- package/dist/core/graph/graph-traversal.js +315 -0
- package/dist/core/graph/index.d.ts +19 -0
- package/dist/core/graph/index.js +13 -0
- package/dist/core/graph/llm-entity-extractor.d.ts +49 -0
- package/dist/core/graph/llm-entity-extractor.js +313 -0
- package/dist/core/graph/multi-hop-retrieval.d.ts +48 -0
- package/dist/core/graph/multi-hop-retrieval.js +215 -0
- package/dist/core/graph/relationship-extractor.d.ts +48 -0
- package/dist/core/graph/relationship-extractor.js +351 -0
- package/dist/core/hooks/agent-hooks.d.ts +10 -1
- package/dist/core/hooks/agent-hooks.js +301 -24
- package/dist/core/hot-cache.d.ts +86 -0
- package/dist/core/hot-cache.js +285 -0
- package/dist/core/index.d.ts +9 -9
- package/dist/core/index.js +9 -12
- package/dist/core/ingestion/core-memory.d.ts +2 -2
- package/dist/core/ingestion/core-memory.js +3 -3
- package/dist/core/ingestion/learnings.js +3 -0
- package/dist/core/ingestion/signal-engine.d.ts +41 -0
- package/dist/core/ingestion/signal-engine.js +201 -0
- package/dist/core/{obsidian-vault.d.ts → integrations/obsidian-vault.d.ts} +2 -1
- package/dist/core/{obsidian-vault.js → integrations/obsidian-vault.js} +69 -7
- package/dist/core/lib/parse-embedding.d.ts +9 -0
- package/dist/core/lib/parse-embedding.js +58 -0
- package/dist/core/lib/schemas.d.ts +57 -54
- package/dist/core/lib/types.d.ts +45 -0
- package/dist/core/lib/types.js +6 -0
- package/dist/core/lib/utils.d.ts +4 -0
- package/dist/core/lib/utils.js +55 -0
- package/dist/core/lifecycle.d.ts +0 -1
- package/dist/core/lifecycle.js +13 -23
- package/dist/core/logger.d.ts +1 -0
- package/dist/core/logger.js +14 -8
- package/dist/core/mcp/tools.d.ts +0 -2
- package/dist/core/mcp/tools.js +0 -87
- package/dist/core/mcp/types.d.ts +25 -253
- package/dist/core/mcp/types.js +2 -2
- package/dist/core/memory/categorizer.js +1 -0
- package/dist/core/memory/consolidation.js +2 -28
- package/dist/core/memory/entity-extractor.d.ts +4 -0
- package/dist/core/memory/entity-extractor.js +30 -16
- package/dist/core/memory/explain.d.ts +18 -0
- package/dist/core/memory/explain.js +92 -0
- package/dist/core/memory/fact-deriver.d.ts +31 -0
- package/dist/core/memory/fact-deriver.js +236 -0
- package/dist/core/memory/hybrid-retrieval.d.ts +14 -16
- package/dist/core/memory/hybrid-retrieval.js +25 -127
- package/dist/core/memory/hybrid-scorer.js +6 -23
- package/dist/core/memory/hybrid-search.d.ts +10 -7
- package/dist/core/memory/hybrid-search.js +458 -221
- package/dist/core/memory/importance.d.ts +0 -17
- package/dist/core/memory/importance.js +1 -58
- package/dist/core/memory/index.d.ts +1 -0
- package/dist/core/memory/index.js +1 -0
- package/dist/core/memory/memories.d.ts +13 -17
- package/dist/core/memory/memories.js +78 -75
- package/dist/core/memory/memory-lifecycle.d.ts +2 -2
- package/dist/core/memory/memory-lifecycle.js +10 -18
- package/dist/core/memory/normalization.d.ts +1 -16
- package/dist/core/memory/path-strengthener.d.ts +39 -0
- package/dist/core/memory/path-strengthener.js +150 -0
- package/dist/core/memory/query-processor.js +37 -3
- package/dist/core/memory/retrieval-feedback.d.ts +70 -0
- package/dist/core/memory/retrieval-feedback.js +213 -0
- package/dist/core/memory/stale-cleaner.d.ts +26 -0
- package/dist/core/memory/stale-cleaner.js +97 -0
- package/dist/core/memory/stats.d.ts +10 -0
- package/dist/core/memory/stats.js +8 -3
- package/dist/core/memory/trigger-detector.d.ts +8 -1
- package/dist/core/memory/trigger-detector.js +42 -5
- package/dist/core/places/index.d.ts +1 -1
- package/dist/core/places/index.js +1 -1
- package/dist/core/places/places.d.ts +13 -13
- package/dist/core/places/places.js +27 -27
- package/dist/core/places/rules.js +23 -23
- package/dist/core/places/walking.d.ts +3 -3
- package/dist/core/places/walking.js +7 -7
- package/dist/core/projects.js +8 -0
- package/dist/core/runtime/trust-report.d.ts +102 -0
- package/dist/core/runtime/trust-report.js +107 -0
- package/dist/core/runtime/trust-state.d.ts +12 -0
- package/dist/core/runtime/trust-state.js +309 -0
- package/dist/core/scheduler/cron-scheduler.d.ts +1 -1
- package/dist/core/scheduler/cron-scheduler.js +164 -3
- package/dist/core/scheduler/job-runner.js +1 -1
- package/dist/core/search/qmd-wrapper.d.ts +36 -0
- package/dist/core/search/qmd-wrapper.js +58 -0
- package/dist/core/session/auto-load.js +28 -3
- package/dist/core/session/entity-tracker.d.ts +62 -0
- package/dist/core/session/entity-tracker.js +287 -0
- package/dist/core/session/reference-resolver.d.ts +26 -0
- package/dist/core/session/reference-resolver.js +121 -0
- package/dist/core/session/self-iteration-job.d.ts +15 -0
- package/dist/core/session/self-iteration-job.js +163 -58
- package/dist/core/session/working-set.d.ts +50 -0
- package/dist/core/session/working-set.js +212 -0
- package/dist/core/snapshots/creation.d.ts +2 -8
- package/dist/core/snapshots/creation.js +3 -12
- package/dist/core/utils/summarization-helpers.d.ts +0 -4
- package/dist/core/utils/summarization-helpers.js +1 -6
- package/dist/db/bootstrap.d.ts +2 -0
- package/dist/db/bootstrap.js +229 -280
- package/dist/db/drizzle/schema-sqlite.d.ts +702 -1
- package/dist/db/drizzle/schema-sqlite.js +83 -4
- package/dist/db/drizzle/schema.d.ts +653 -1
- package/dist/db/drizzle/schema.js +93 -4
- package/dist/db/migrations/associations.d.ts +6 -0
- package/dist/db/migrations/associations.js +29 -0
- package/dist/db/migrations/beliefs.d.ts +10 -0
- package/dist/db/migrations/beliefs.js +76 -0
- package/dist/db/migrations/core-memory.d.ts +6 -0
- package/dist/db/migrations/core-memory.js +29 -0
- package/dist/db/migrations/fts.d.ts +6 -0
- package/dist/db/migrations/fts.js +52 -0
- package/dist/db/migrations/index.d.ts +25 -0
- package/dist/db/migrations/index.js +51 -0
- package/dist/db/migrations/indexes.d.ts +6 -0
- package/dist/db/migrations/indexes.js +30 -0
- package/dist/db/migrations/learnings.d.ts +7 -0
- package/dist/db/migrations/learnings.js +26 -0
- package/dist/db/migrations/maintenance.d.ts +6 -0
- package/dist/db/migrations/maintenance.js +61 -0
- package/dist/db/migrations/memories.d.ts +7 -0
- package/dist/db/migrations/memories.js +16 -0
- package/dist/db/migrations/memory-places.d.ts +6 -0
- package/dist/db/migrations/memory-places.js +29 -0
- package/dist/db/migrations/places.d.ts +6 -0
- package/dist/db/migrations/places.js +43 -0
- package/dist/db/migrations/projects.d.ts +3 -0
- package/dist/db/migrations/projects.js +13 -0
- package/dist/db/migrations/tier-conversion.d.ts +7 -0
- package/dist/db/migrations/tier-conversion.js +20 -0
- package/dist/db/schema/beliefs.d.ts +9 -0
- package/dist/db/schema/beliefs.js +46 -0
- package/dist/db/schema/generator.d.ts +38 -0
- package/dist/db/schema/generator.js +108 -0
- package/dist/db/schema/index.d.ts +19 -20
- package/dist/db/schema/index.js +25 -79
- package/dist/db/schema/learnings.d.ts +7 -0
- package/dist/db/schema/learnings.js +30 -0
- package/dist/db/schema/memories.d.ts +7 -0
- package/dist/db/schema/memories.js +81 -0
- package/dist/db/schema/projects.d.ts +4 -0
- package/dist/db/schema/projects.js +31 -0
- package/dist/packages/mcp/src/index.d.ts +3 -0
- package/dist/packages/mcp/src/index.js +733 -0
- package/mcp.json.example +8 -11
- package/package.json +57 -76
- 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 +877 -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/core/commands/managed-sync.d.ts +0 -10
- package/dist/core/commands/managed-sync.js +0 -64
- package/dist/core/external-folder/index.d.ts +0 -102
- package/dist/core/external-folder/index.js +0 -294
- 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/search/qmd-search.d.ts +0 -61
- package/dist/core/search/qmd-search.js +0 -178
- 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.d.ts +0 -29
- package/dist/core/snapshots.js +0 -220
- package/dist/core/sync/qmd-sync.d.ts +0 -94
- package/dist/core/sync/qmd-sync.js +0 -201
- 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
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
* Calculates and manages memory importance scores (0-100) with temporal decay
|
|
4
4
|
*/
|
|
5
5
|
import type { Memory } from '../../db/drizzle/schema.js';
|
|
6
|
-
import { cosineSimilarity as vectorCosineSimilarity } from '../utils/vector-operations.js';
|
|
7
6
|
export interface ImportanceScore {
|
|
8
7
|
score: number;
|
|
9
8
|
components: {
|
|
@@ -27,16 +26,6 @@ export declare function calculateImportance(memory: Partial<Memory>): Importance
|
|
|
27
26
|
* Used when memory is accessed or modified
|
|
28
27
|
*/
|
|
29
28
|
export declare function updateImportanceScore(memoryId: string, incrementAccess?: boolean): Promise<number>;
|
|
30
|
-
/**
|
|
31
|
-
* Decay importance scores for old memories
|
|
32
|
-
* Should be run periodically (e.g., daily) to reduce scores of stale memories
|
|
33
|
-
*
|
|
34
|
-
* This function applies exponential decay to all memories that haven't been
|
|
35
|
-
* recalculated recently, keeping the system's importance scores current.
|
|
36
|
-
*
|
|
37
|
-
* Fixed: Uses batch update instead of N+1 individual queries
|
|
38
|
-
*/
|
|
39
|
-
export declare function decayImportanceScores(projectId?: string): Promise<number>;
|
|
40
29
|
/**
|
|
41
30
|
* Get low-importance memories that are candidates for consolidation
|
|
42
31
|
* These are old, rarely accessed memories with low importance scores
|
|
@@ -54,10 +43,4 @@ export declare function setImportanceScore(memoryId: string, score: number): Pro
|
|
|
54
43
|
* Pin a memory to prevent decay and consolidation
|
|
55
44
|
*/
|
|
56
45
|
export declare function pinMemory(memoryId: string, pinned?: boolean): Promise<void>;
|
|
57
|
-
/**
|
|
58
|
-
* Calculate cosine similarity between two vectors
|
|
59
|
-
* Re-exported from core/utils/vector-operations.ts for backward compatibility.
|
|
60
|
-
* This will be removed in v1.2.0 - import directly from core/utils/vector-operations.ts
|
|
61
|
-
*/
|
|
62
|
-
export declare const cosineSimilarity: typeof vectorCosineSimilarity;
|
|
63
46
|
//# sourceMappingURL=importance.d.ts.map
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
* Calculates and manages memory importance scores (0-100) with temporal decay
|
|
4
4
|
*/
|
|
5
5
|
import { eq } from 'drizzle-orm';
|
|
6
|
-
import { cosineSimilarity as vectorCosineSimilarity } from '../utils/vector-operations.js';
|
|
7
6
|
import { getDbClient } from '../lib/db-client.js';
|
|
8
7
|
/**
|
|
9
8
|
* Type weights for importance scoring
|
|
@@ -170,57 +169,6 @@ export async function updateImportanceScore(memoryId, incrementAccess = false) {
|
|
|
170
169
|
.where(eq(schema.memories.id, memoryId));
|
|
171
170
|
return importance.score;
|
|
172
171
|
}
|
|
173
|
-
/**
|
|
174
|
-
* Decay importance scores for old memories
|
|
175
|
-
* Should be run periodically (e.g., daily) to reduce scores of stale memories
|
|
176
|
-
*
|
|
177
|
-
* This function applies exponential decay to all memories that haven't been
|
|
178
|
-
* recalculated recently, keeping the system's importance scores current.
|
|
179
|
-
*
|
|
180
|
-
* Fixed: Uses batch update instead of N+1 individual queries
|
|
181
|
-
*/
|
|
182
|
-
export async function decayImportanceScores(projectId) {
|
|
183
|
-
const { db, schema, raw } = await getDbClient();
|
|
184
|
-
// Get memories that need recalculation
|
|
185
|
-
// (those not recalculated in the last 24 hours or never)
|
|
186
|
-
const oneDayAgo = new Date(Date.now() - 24 * 60 * 60 * 1000);
|
|
187
|
-
// Use raw SQL for bulk update - avoids N+1 queries - let's use raw SQL for efficiency
|
|
188
|
-
// Build a single UPDATE that sets importance to base 50 (neutral) minus decay
|
|
189
|
-
// The JS calculation is too complex to port to SQL, but we can at least
|
|
190
|
-
// use a simpler approach: just reset to default and let individual recalc happen on access
|
|
191
|
-
// For now, use a more efficient approach: bulk update with raw SQL
|
|
192
|
-
// This avoids N+1 queries while still using the JS calculation logic
|
|
193
|
-
const clientType = raw.$clientType || 'sqlite';
|
|
194
|
-
const now = new Date().toISOString();
|
|
195
|
-
if (clientType === 'sqlite') {
|
|
196
|
-
const sqliteClient = raw.$client;
|
|
197
|
-
// Single SQL update - set all non-pinned/consolidated memories to base decay
|
|
198
|
-
// Note: We can't fully replicate the JS calculation in SQL, so we apply
|
|
199
|
-
// a simple decay multiplier. Full recalculation happens on access.
|
|
200
|
-
const result = sqliteClient.prepare(`
|
|
201
|
-
UPDATE memories
|
|
202
|
-
SET importance_score = MAX(0, importance_score - 1),
|
|
203
|
-
last_importance_recalc = ?
|
|
204
|
-
WHERE (is_pinned = 0 AND is_protected = 0 AND is_consolidated = 0)
|
|
205
|
-
AND (last_importance_recalc IS NULL OR last_importance_recalc < ?)
|
|
206
|
-
${projectId ? 'AND project_id = ?' : ''}
|
|
207
|
-
`).run(now, oneDayAgo.toISOString(), ...(projectId ? [projectId] : []));
|
|
208
|
-
return result.changes;
|
|
209
|
-
}
|
|
210
|
-
else {
|
|
211
|
-
// PostgreSQL
|
|
212
|
-
const pgClient = raw.$client;
|
|
213
|
-
const result = await pgClient.query(`
|
|
214
|
-
UPDATE memories
|
|
215
|
-
SET importance_score = GREATEST(0, importance_score - 1),
|
|
216
|
-
last_importance_recalc = $1
|
|
217
|
-
WHERE (is_pinned = FALSE AND is_protected = FALSE AND is_consolidated = FALSE)
|
|
218
|
-
AND (last_importance_recalc IS NULL OR last_importance_recalc < $2)
|
|
219
|
-
${projectId ? 'AND project_id = $3' : ''}
|
|
220
|
-
`, [now, oneDayAgo.toISOString(), ...(projectId ? [projectId] : [])]);
|
|
221
|
-
return result.rowCount || 0;
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
172
|
/**
|
|
225
173
|
* Get low-importance memories that are candidates for consolidation
|
|
226
174
|
* These are old, rarely accessed memories with low importance scores
|
|
@@ -289,10 +237,5 @@ export async function pinMemory(memoryId, pinned = true) {
|
|
|
289
237
|
})
|
|
290
238
|
.where(eq(schema.memories.id, memoryId));
|
|
291
239
|
}
|
|
292
|
-
|
|
293
|
-
* Calculate cosine similarity between two vectors
|
|
294
|
-
* Re-exported from core/utils/vector-operations.ts for backward compatibility.
|
|
295
|
-
* This will be removed in v1.2.0 - import directly from core/utils/vector-operations.ts
|
|
296
|
-
*/
|
|
297
|
-
export const cosineSimilarity = vectorCosineSimilarity;
|
|
240
|
+
// cosineSimilarity has been removed - import from core/utils/vector-operations.ts directly
|
|
298
241
|
//# sourceMappingURL=importance.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import { MemoryRecord, MemoryType } from '../lib/types.js';
|
|
2
2
|
export interface RememberInput {
|
|
3
3
|
content: string;
|
|
4
4
|
type?: MemoryType;
|
|
@@ -12,6 +12,9 @@ export interface RememberInput {
|
|
|
12
12
|
exceptions?: string;
|
|
13
13
|
tier?: 'hot' | 'cold';
|
|
14
14
|
namespaceId?: string;
|
|
15
|
+
sessionId?: string;
|
|
16
|
+
sessionStartTime?: string;
|
|
17
|
+
toolName?: string;
|
|
15
18
|
}
|
|
16
19
|
export interface SearchInput {
|
|
17
20
|
query: string;
|
|
@@ -19,22 +22,10 @@ export interface SearchInput {
|
|
|
19
22
|
tags?: string[];
|
|
20
23
|
limit?: number;
|
|
21
24
|
project?: string;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
type: MemoryType;
|
|
27
|
-
content: string;
|
|
28
|
-
summary?: string | null;
|
|
29
|
-
tags: string[];
|
|
30
|
-
metadata?: Record<string, unknown> | null;
|
|
31
|
-
createdAt?: string | null;
|
|
32
|
-
validFrom?: string | null;
|
|
33
|
-
validTo?: string | null;
|
|
34
|
-
recordedAt?: string | null;
|
|
35
|
-
similarity?: number;
|
|
36
|
-
importance?: number;
|
|
37
|
-
confidenceLevel?: 'certain' | 'speculative' | 'outdated' | null;
|
|
25
|
+
placeId?: string;
|
|
26
|
+
placeType?: string;
|
|
27
|
+
sessionId?: string;
|
|
28
|
+
sessionStartTime?: string;
|
|
38
29
|
}
|
|
39
30
|
export interface SearchResult extends MemoryRecord {
|
|
40
31
|
similarity: number;
|
|
@@ -44,4 +35,9 @@ export declare function getMemory(id: string, incrementAccess?: boolean): Promis
|
|
|
44
35
|
export declare function setConfidence(id: string, level: 'certain' | 'speculative' | 'outdated'): Promise<boolean>;
|
|
45
36
|
export declare function getRecent(projectPath: string, limit: number): Promise<MemoryRecord[]>;
|
|
46
37
|
export declare function search(input: SearchInput): Promise<SearchResult[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Find similar memories to prevent duplicates
|
|
40
|
+
* Returns memories with similarity >= threshold
|
|
41
|
+
*/
|
|
42
|
+
export declare function findSimilarMemories(content: string, threshold?: number, limit?: number): Promise<SearchResult[]>;
|
|
47
43
|
//# sourceMappingURL=memories.d.ts.map
|
|
@@ -15,6 +15,12 @@ import { resolveContradictions, applySupersession } from './contradiction-resolv
|
|
|
15
15
|
import { encrypt, decrypt } from '../security/encrypt.js';
|
|
16
16
|
import { estimateTokens } from '../context/context-window.js';
|
|
17
17
|
import { getDbClient } from '../lib/db-client.js';
|
|
18
|
+
import { extractBeliefsFromMemory } from '../beliefs/extractor.js';
|
|
19
|
+
import { upsertBeliefsForMemory } from '../beliefs/store.js';
|
|
20
|
+
import { extractEntityNames } from './entity-extractor.js';
|
|
21
|
+
import { autoLinkByEntities } from '../associations.js';
|
|
22
|
+
import { addMemoryToGraph } from '../graph/graph-builder.js';
|
|
23
|
+
import { parseEmbedding } from '../lib/parse-embedding.js';
|
|
18
24
|
export async function rememberMemory(input) {
|
|
19
25
|
const { db, schema } = await getDbClient();
|
|
20
26
|
const tags = normalizeTags(input.tags);
|
|
@@ -56,6 +62,12 @@ export async function rememberMemory(input) {
|
|
|
56
62
|
priority: signals.priority,
|
|
57
63
|
requiresConflictCheck: signals.implicit.correction,
|
|
58
64
|
},
|
|
65
|
+
// Session metadata for temporal queries (Task 1)
|
|
66
|
+
sessionMetadata: {
|
|
67
|
+
sessionId: input.sessionId,
|
|
68
|
+
sessionStartTime: input.sessionStartTime,
|
|
69
|
+
toolName: input.toolName,
|
|
70
|
+
},
|
|
59
71
|
};
|
|
60
72
|
let metadataValue = serializeMetadata(enrichedMetadata);
|
|
61
73
|
// Prepare fields for insertion, handling optional encryption
|
|
@@ -92,10 +104,58 @@ export async function rememberMemory(input) {
|
|
|
92
104
|
insertValues.is_encrypted = false;
|
|
93
105
|
}
|
|
94
106
|
await db.insert(schema.memories).values(insertValues);
|
|
107
|
+
if (project?.id) {
|
|
108
|
+
try {
|
|
109
|
+
const beliefs = extractBeliefsFromMemory({
|
|
110
|
+
memoryId: id,
|
|
111
|
+
content: input.content,
|
|
112
|
+
type,
|
|
113
|
+
metadata: enrichedMetadata,
|
|
114
|
+
});
|
|
115
|
+
if (beliefs.length > 0) {
|
|
116
|
+
await upsertBeliefsForMemory({
|
|
117
|
+
projectId: project.id,
|
|
118
|
+
memoryId: id,
|
|
119
|
+
beliefs,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch (beliefError) {
|
|
124
|
+
logger.warn(`[Beliefs] Failed to derive beliefs for memory ${id}: ${beliefError}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Auto-link by entity overlap (synchronous - Task 5)
|
|
128
|
+
// Now memories are immediately findable via associations after storage
|
|
129
|
+
const entityNames = extractEntityNames(input.content);
|
|
130
|
+
if (entityNames.length > 0 && project?.id) {
|
|
131
|
+
try {
|
|
132
|
+
const linked = await autoLinkByEntities(id, entityNames, project.id);
|
|
133
|
+
if (linked > 0)
|
|
134
|
+
logger.debug(`[AutoLink] Linked memory ${id} to ${linked} related memories`);
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
logger.debug(`[AutoLink] Failed: ${err}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// Build graph for this memory (auto-build if enabled)
|
|
141
|
+
// This populates the entity_entities and entity_relations tables
|
|
142
|
+
if (config.graphAutoBuild && project?.id) {
|
|
143
|
+
try {
|
|
144
|
+
const graphResult = await addMemoryToGraph(id, {
|
|
145
|
+
preferLLM: config.llmEnabled,
|
|
146
|
+
});
|
|
147
|
+
if (graphResult.entitiesCreated > 0 || graphResult.relationsCreated > 0) {
|
|
148
|
+
logger.debug(`[Graph] Built graph for memory ${id}: ${graphResult.entitiesCreated} entities, ${graphResult.relationsCreated} relations`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
catch (graphError) {
|
|
152
|
+
logger.debug(`[Graph] Failed to build graph for memory ${id}: ${graphError}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
95
155
|
// Append to Obsidian vault if enabled and hot tier (NEW)
|
|
96
156
|
if (config.obsidianEnabled && config.obsidianVaultPath && insertValues.tier === 'hot') {
|
|
97
157
|
try {
|
|
98
|
-
const { appendToObsidianVault } = await import('../obsidian-vault.js');
|
|
158
|
+
const { appendToObsidianVault } = await import('../integrations/obsidian-vault.js');
|
|
99
159
|
await appendToObsidianVault({
|
|
100
160
|
content: input.content,
|
|
101
161
|
id,
|
|
@@ -112,26 +172,6 @@ export async function rememberMemory(input) {
|
|
|
112
172
|
logger.warn(`[Obsidian] Failed to append to vault: ${error}`);
|
|
113
173
|
}
|
|
114
174
|
}
|
|
115
|
-
// Write to external folder memory if enabled and hot tier
|
|
116
|
-
if (config.externalMemoryEnabled && config.externalMemoryPath && insertValues.tier === 'hot') {
|
|
117
|
-
try {
|
|
118
|
-
const { getExternalMemory } = await import('../external-folder/index.js');
|
|
119
|
-
const externalMemory = getExternalMemory();
|
|
120
|
-
const memoryRecord = {
|
|
121
|
-
id,
|
|
122
|
-
projectId: project?.id ?? null,
|
|
123
|
-
type,
|
|
124
|
-
content: input.content,
|
|
125
|
-
tags,
|
|
126
|
-
createdAt: insertValues.createdAt?.toISOString(),
|
|
127
|
-
confidenceLevel: null,
|
|
128
|
-
};
|
|
129
|
-
await externalMemory.writeMemory(externalMemory.toMarkdownFormat(memoryRecord));
|
|
130
|
-
}
|
|
131
|
-
catch (error) {
|
|
132
|
-
logger.warn(`[ExternalMemory] Failed to write: ${error}`);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
175
|
// Resolve contradictions and supersede old memories (async, non-blocking)
|
|
136
176
|
resolveContradictions(input.content, type, project?.id)
|
|
137
177
|
.then(async (result) => {
|
|
@@ -236,62 +276,12 @@ export async function getRecent(projectPath, limit) {
|
|
|
236
276
|
export async function search(input) {
|
|
237
277
|
const limit = clampLimit(input.limit, 10, 1, 100);
|
|
238
278
|
const tags = normalizeTags(input.tags);
|
|
239
|
-
//
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
dbResults = await searchMemoriesPostgres(input, tags, limit);
|
|
243
|
-
}
|
|
244
|
-
else {
|
|
245
|
-
// Use hybrid search for SQLite (BM25 + vectors with RRF)
|
|
246
|
-
dbResults = await hybridSearchImpl(input, { limit });
|
|
247
|
-
}
|
|
279
|
+
// Always use hybrid search for both SQLite and PostgreSQL
|
|
280
|
+
// Graph boost requires hybrid path for proper scoring
|
|
281
|
+
const dbResults = await hybridSearchImpl(input, { limit });
|
|
248
282
|
return dbResults.slice(0, limit);
|
|
249
283
|
}
|
|
250
|
-
|
|
251
|
-
* Parse embedding from SQLite storage
|
|
252
|
-
*/
|
|
253
|
-
function parseEmbedding(embeddingData) {
|
|
254
|
-
if (!embeddingData)
|
|
255
|
-
return null;
|
|
256
|
-
// If it's already an array
|
|
257
|
-
if (Array.isArray(embeddingData))
|
|
258
|
-
return embeddingData;
|
|
259
|
-
// If it's a Buffer/Uint8Array
|
|
260
|
-
if (embeddingData instanceof Uint8Array || Buffer.isBuffer(embeddingData)) {
|
|
261
|
-
// Try to parse as JSON first
|
|
262
|
-
try {
|
|
263
|
-
const json = JSON.parse(embeddingData.toString());
|
|
264
|
-
if (Array.isArray(json))
|
|
265
|
-
return json;
|
|
266
|
-
}
|
|
267
|
-
catch {
|
|
268
|
-
// Not JSON, try Float32Array
|
|
269
|
-
try {
|
|
270
|
-
const buffer = embeddingData.buffer;
|
|
271
|
-
const arrayBuffer = buffer instanceof ArrayBuffer
|
|
272
|
-
? buffer
|
|
273
|
-
: buffer;
|
|
274
|
-
const floatArray = new Float32Array(arrayBuffer);
|
|
275
|
-
return Array.from(floatArray);
|
|
276
|
-
}
|
|
277
|
-
catch {
|
|
278
|
-
return null;
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
// If it's a string
|
|
283
|
-
if (typeof embeddingData === 'string') {
|
|
284
|
-
try {
|
|
285
|
-
const parsed = JSON.parse(embeddingData);
|
|
286
|
-
if (Array.isArray(parsed))
|
|
287
|
-
return parsed;
|
|
288
|
-
}
|
|
289
|
-
catch {
|
|
290
|
-
return null;
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
return null;
|
|
294
|
-
}
|
|
284
|
+
// parseEmbedding imported from ../lib/parse-embedding.js
|
|
295
285
|
async function searchMemoriesSqlite(input, tags, limit) {
|
|
296
286
|
const { db } = await getDbClient();
|
|
297
287
|
const sqlite = db.$client;
|
|
@@ -446,4 +436,17 @@ function normalizeMemory(row) {
|
|
|
446
436
|
confidenceLevel: row.confidenceLevel ?? row.confidence_level ?? null,
|
|
447
437
|
};
|
|
448
438
|
}
|
|
439
|
+
/**
|
|
440
|
+
* Find similar memories to prevent duplicates
|
|
441
|
+
* Returns memories with similarity >= threshold
|
|
442
|
+
*/
|
|
443
|
+
export async function findSimilarMemories(content, threshold = 0.85, limit = 5) {
|
|
444
|
+
// Use search with high similarity
|
|
445
|
+
const results = await search({
|
|
446
|
+
query: content,
|
|
447
|
+
limit,
|
|
448
|
+
});
|
|
449
|
+
// Filter by similarity threshold
|
|
450
|
+
return results.filter(r => (r.similarity ?? 0) >= threshold);
|
|
451
|
+
}
|
|
449
452
|
//# sourceMappingURL=memories.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
/** Promote a memory to a higher tier (
|
|
1
|
+
/** Promote a memory to a higher tier (cold -> hot only, simplified from warm hierarchy) */
|
|
2
2
|
export declare function promoteTier(memoryId: string): Promise<void>;
|
|
3
|
-
/** Demote a memory tier or expire it based on decay */
|
|
3
|
+
/** Demote a memory tier or expire it based on decay (simplified: hot -> cold only) */
|
|
4
4
|
export declare function demoteTier(memoryId: string): Promise<void>;
|
|
5
5
|
export declare function expireMemory(memoryId: string): Promise<void>;
|
|
6
6
|
export declare function markMerged(memoryId: string, targetId: string): Promise<void>;
|
|
@@ -2,7 +2,7 @@ import { getDb } from '../../db/index.js';
|
|
|
2
2
|
import { memories } from '../../db/drizzle/schema.js';
|
|
3
3
|
import { eq } from 'drizzle-orm';
|
|
4
4
|
import { logger } from '../logger.js';
|
|
5
|
-
/** Promote a memory to a higher tier (
|
|
5
|
+
/** Promote a memory to a higher tier (cold -> hot only, simplified from warm hierarchy) */
|
|
6
6
|
export async function promoteTier(memoryId) {
|
|
7
7
|
const db = await getDb();
|
|
8
8
|
// @ts-ignore - drizzle overloads
|
|
@@ -10,15 +10,12 @@ export async function promoteTier(memoryId) {
|
|
|
10
10
|
const mem = row[0];
|
|
11
11
|
if (!mem)
|
|
12
12
|
return;
|
|
13
|
-
|
|
14
|
-
if (mem.tier === '
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
newTier = 'warm';
|
|
18
|
-
// @ts-ignore
|
|
19
|
-
await db.update(memories).set({ tier: newTier }).where(eq(memories.id, memoryId));
|
|
13
|
+
// Simplified: cold -> hot (no warm tier)
|
|
14
|
+
if (mem.tier === 'cold') {
|
|
15
|
+
await db.update(memories).set({ tier: 'hot' }).where(eq(memories.id, memoryId));
|
|
16
|
+
}
|
|
20
17
|
}
|
|
21
|
-
/** Demote a memory tier or expire it based on decay */
|
|
18
|
+
/** Demote a memory tier or expire it based on decay (simplified: hot -> cold only) */
|
|
22
19
|
export async function demoteTier(memoryId) {
|
|
23
20
|
const db = await getDb();
|
|
24
21
|
// @ts-ignore
|
|
@@ -26,15 +23,10 @@ export async function demoteTier(memoryId) {
|
|
|
26
23
|
const mem = row[0];
|
|
27
24
|
if (!mem)
|
|
28
25
|
return;
|
|
29
|
-
|
|
30
|
-
if (mem.tier === 'hot')
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
updates.tier = 'cold';
|
|
34
|
-
else
|
|
35
|
-
updates.status = 'expired';
|
|
36
|
-
// @ts-ignore
|
|
37
|
-
await db.update(memories).set(updates).where(eq(memories.id, memoryId));
|
|
26
|
+
// Simplified: hot -> cold (no warm tier)
|
|
27
|
+
if (mem.tier === 'hot') {
|
|
28
|
+
await db.update(memories).set({ tier: 'cold' }).where(eq(memories.id, memoryId));
|
|
29
|
+
}
|
|
38
30
|
}
|
|
39
31
|
export async function expireMemory(memoryId) {
|
|
40
32
|
const db = await getDb();
|
|
@@ -2,21 +2,6 @@
|
|
|
2
2
|
* Memory normalization utilities
|
|
3
3
|
* Shared between memories.ts and loader.ts to avoid circular dependencies
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
|
-
id: string;
|
|
7
|
-
projectId?: string | null;
|
|
8
|
-
type: string;
|
|
9
|
-
content: string;
|
|
10
|
-
summary?: string | null;
|
|
11
|
-
tags: string[];
|
|
12
|
-
metadata?: Record<string, unknown> | null;
|
|
13
|
-
createdAt?: string | null;
|
|
14
|
-
validFrom?: string | null;
|
|
15
|
-
validTo?: string | null;
|
|
16
|
-
recordedAt?: string | null;
|
|
17
|
-
similarity?: number;
|
|
18
|
-
importance?: number;
|
|
19
|
-
confidenceLevel?: 'certain' | 'speculative' | 'outdated' | null;
|
|
20
|
-
}
|
|
5
|
+
import type { MemoryRecord } from '../lib/types.js';
|
|
21
6
|
export declare function normalizeMemory(row: any): MemoryRecord;
|
|
22
7
|
//# sourceMappingURL=normalization.d.ts.map
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path Strengthener
|
|
3
|
+
*
|
|
4
|
+
* Strengthens association paths that led to successful retrievals and
|
|
5
|
+
* weakens paths that led to irrelevant results. This implements the
|
|
6
|
+
* "optimize" concept: the graph develops its own sense of relevance
|
|
7
|
+
* over time based on actual usage patterns.
|
|
8
|
+
*
|
|
9
|
+
* A customer support agent's graph naturally strengthens paths through
|
|
10
|
+
* product docs and refund policies while letting rarely-queried HR
|
|
11
|
+
* edges decay.
|
|
12
|
+
*/
|
|
13
|
+
export interface PathStrengthResult {
|
|
14
|
+
strengthened: number;
|
|
15
|
+
weakened: number;
|
|
16
|
+
pruned: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Strengthen the association path between memories that were
|
|
20
|
+
* retrieved together and found useful.
|
|
21
|
+
*/
|
|
22
|
+
export declare function strengthenPath(memoryIds: string[], boostAmount?: number): Promise<number>;
|
|
23
|
+
/**
|
|
24
|
+
* Weaken association paths that led to irrelevant results.
|
|
25
|
+
*/
|
|
26
|
+
export declare function weakenPath(memoryIds: string[], decayAmount?: number): Promise<number>;
|
|
27
|
+
/**
|
|
28
|
+
* Prune associations that have decayed below a threshold.
|
|
29
|
+
*/
|
|
30
|
+
export declare function pruneWeakAssociations(minWeight?: number, maxAge?: number): Promise<number>;
|
|
31
|
+
/**
|
|
32
|
+
* Run a full optimize cycle: strengthen useful paths, weaken unused ones,
|
|
33
|
+
* prune dead associations, and derive implicit facts.
|
|
34
|
+
*/
|
|
35
|
+
export declare function runPruneCycle(options?: {
|
|
36
|
+
minWeight?: number;
|
|
37
|
+
maxAge?: number;
|
|
38
|
+
}): Promise<PathStrengthResult>;
|
|
39
|
+
//# sourceMappingURL=path-strengthener.d.ts.map
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path Strengthener
|
|
3
|
+
*
|
|
4
|
+
* Strengthens association paths that led to successful retrievals and
|
|
5
|
+
* weakens paths that led to irrelevant results. This implements the
|
|
6
|
+
* "optimize" concept: the graph develops its own sense of relevance
|
|
7
|
+
* over time based on actual usage patterns.
|
|
8
|
+
*
|
|
9
|
+
* A customer support agent's graph naturally strengthens paths through
|
|
10
|
+
* product docs and refund policies while letting rarely-queried HR
|
|
11
|
+
* edges decay.
|
|
12
|
+
*/
|
|
13
|
+
import { eq, and, or, sql } from 'drizzle-orm';
|
|
14
|
+
import { getDb } from '../../db/index.js';
|
|
15
|
+
import { getSchema } from '../../db/schema.js';
|
|
16
|
+
import { logger } from '../logger.js';
|
|
17
|
+
/**
|
|
18
|
+
* Strengthen the association path between memories that were
|
|
19
|
+
* retrieved together and found useful.
|
|
20
|
+
*/
|
|
21
|
+
export async function strengthenPath(memoryIds, boostAmount = 2) {
|
|
22
|
+
if (memoryIds.length < 2)
|
|
23
|
+
return 0;
|
|
24
|
+
const db = await getDb();
|
|
25
|
+
const schema = await getSchema();
|
|
26
|
+
let strengthened = 0;
|
|
27
|
+
// Generate all pairs
|
|
28
|
+
for (let i = 0; i < memoryIds.length; i++) {
|
|
29
|
+
for (let j = i + 1; j < memoryIds.length; j++) {
|
|
30
|
+
try {
|
|
31
|
+
// Check if association exists
|
|
32
|
+
const existing = await db
|
|
33
|
+
.select()
|
|
34
|
+
.from(schema.memoryAssociations)
|
|
35
|
+
.where(or(and(eq(schema.memoryAssociations.fromMemoryId, memoryIds[i]), eq(schema.memoryAssociations.toMemoryId, memoryIds[j])), and(eq(schema.memoryAssociations.fromMemoryId, memoryIds[j]), eq(schema.memoryAssociations.toMemoryId, memoryIds[i]))))
|
|
36
|
+
.limit(1);
|
|
37
|
+
if (existing.length > 0) {
|
|
38
|
+
// Strengthen existing association
|
|
39
|
+
await db
|
|
40
|
+
.update(schema.memoryAssociations)
|
|
41
|
+
.set({
|
|
42
|
+
weight: sql `${schema.memoryAssociations.weight} + ${boostAmount}`,
|
|
43
|
+
coactivationCount: sql `${schema.memoryAssociations.coactivationCount} + 1`,
|
|
44
|
+
lastCoactivatedAt: new Date(),
|
|
45
|
+
})
|
|
46
|
+
.where(eq(schema.memoryAssociations.id, existing[0].id));
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
// Create new association
|
|
50
|
+
await db.insert(schema.memoryAssociations).values({
|
|
51
|
+
fromMemoryId: memoryIds[i],
|
|
52
|
+
toMemoryId: memoryIds[j],
|
|
53
|
+
associationType: 'co_occurred',
|
|
54
|
+
weight: boostAmount,
|
|
55
|
+
coactivationCount: 1,
|
|
56
|
+
lastCoactivatedAt: new Date(),
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
strengthened++;
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
logger.debug('Error strengthening path', {
|
|
63
|
+
from: memoryIds[i],
|
|
64
|
+
to: memoryIds[j],
|
|
65
|
+
error: error,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return strengthened;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Weaken association paths that led to irrelevant results.
|
|
74
|
+
*/
|
|
75
|
+
export async function weakenPath(memoryIds, decayAmount = 0.5) {
|
|
76
|
+
if (memoryIds.length < 2)
|
|
77
|
+
return 0;
|
|
78
|
+
const db = await getDb();
|
|
79
|
+
const schema = await getSchema();
|
|
80
|
+
let weakened = 0;
|
|
81
|
+
for (let i = 0; i < memoryIds.length; i++) {
|
|
82
|
+
for (let j = i + 1; j < memoryIds.length; j++) {
|
|
83
|
+
try {
|
|
84
|
+
const existing = await db
|
|
85
|
+
.select()
|
|
86
|
+
.from(schema.memoryAssociations)
|
|
87
|
+
.where(or(and(eq(schema.memoryAssociations.fromMemoryId, memoryIds[i]), eq(schema.memoryAssociations.toMemoryId, memoryIds[j])), and(eq(schema.memoryAssociations.fromMemoryId, memoryIds[j]), eq(schema.memoryAssociations.toMemoryId, memoryIds[i]))))
|
|
88
|
+
.limit(1);
|
|
89
|
+
if (existing.length > 0) {
|
|
90
|
+
// Weaken but don't remove (minimum weight of 1)
|
|
91
|
+
await db
|
|
92
|
+
.update(schema.memoryAssociations)
|
|
93
|
+
.set({
|
|
94
|
+
weight: sql `GREATEST(${schema.memoryAssociations.weight} - ${decayAmount}, 1)`,
|
|
95
|
+
})
|
|
96
|
+
.where(eq(schema.memoryAssociations.id, existing[0].id));
|
|
97
|
+
weakened++;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
logger.debug('Error weakening path', {
|
|
102
|
+
from: memoryIds[i],
|
|
103
|
+
to: memoryIds[j],
|
|
104
|
+
error: error,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return weakened;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Prune associations that have decayed below a threshold.
|
|
113
|
+
*/
|
|
114
|
+
export async function pruneWeakAssociations(minWeight = 2, maxAge = 90 // days
|
|
115
|
+
) {
|
|
116
|
+
const db = await getDb();
|
|
117
|
+
const schema = await getSchema();
|
|
118
|
+
const cutoffDate = new Date();
|
|
119
|
+
cutoffDate.setDate(cutoffDate.getDate() - maxAge);
|
|
120
|
+
try {
|
|
121
|
+
// Delete associations that are weak AND old
|
|
122
|
+
const result = await db
|
|
123
|
+
.delete(schema.memoryAssociations)
|
|
124
|
+
.where(and(sql `${schema.memoryAssociations.weight} < ${minWeight}`, sql `${schema.memoryAssociations.lastCoactivatedAt} < ${cutoffDate}`));
|
|
125
|
+
const pruned = result?.rowCount ?? 0;
|
|
126
|
+
logger.info('Pruned weak associations', { pruned, minWeight, maxAge });
|
|
127
|
+
return pruned;
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
logger.error('Error pruning weak associations', { error: error });
|
|
131
|
+
return 0;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Run a full optimize cycle: strengthen useful paths, weaken unused ones,
|
|
136
|
+
* prune dead associations, and derive implicit facts.
|
|
137
|
+
*/
|
|
138
|
+
export async function runPruneCycle(options) {
|
|
139
|
+
const { minWeight = 2, maxAge = 90 } = options || {};
|
|
140
|
+
logger.info('Starting prune cycle', { minWeight, maxAge });
|
|
141
|
+
// Step 1: Prune weak associations
|
|
142
|
+
const pruned = await pruneWeakAssociations(minWeight, maxAge);
|
|
143
|
+
logger.info('Prune cycle completed', { pruned });
|
|
144
|
+
return {
|
|
145
|
+
strengthened: 0, // Strengthening happens via retrieval feedback
|
|
146
|
+
weakened: 0, // Weakening happens via retrieval feedback
|
|
147
|
+
pruned,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=path-strengthener.js.map
|