squish-memory 1.0.2 → 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 +146 -0
- package/CHANGELOG.md +202 -0
- package/README.md +192 -287
- 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 +10 -12
- package/config/mcp-remote-auth.json +3 -26
- package/config/mcp-universal.schema.json +5 -35
- package/config/settings.json +78 -22
- 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/core/embeddings/local-embeddings.ts +12 -0
- 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 +61 -14
- package/dist/config.js +159 -139
- package/dist/core/adapters/config/claude-code.d.ts +45 -0
- package/dist/core/adapters/config/claude-code.js +113 -0
- package/dist/core/adapters/config/cursor.d.ts +26 -0
- package/dist/core/adapters/config/cursor.js +74 -0
- package/dist/core/adapters/config/opencode.d.ts +23 -0
- package/dist/core/adapters/config/opencode.js +73 -0
- package/dist/core/adapters/config/windsurf.d.ts +26 -0
- package/dist/core/adapters/config/windsurf.js +74 -0
- package/dist/core/adapters/index.d.ts +45 -0
- package/dist/core/adapters/index.js +84 -0
- package/dist/core/adapters/scripts/install-adapter.d.ts +19 -0
- package/dist/core/adapters/scripts/install-adapter.js +149 -0
- package/dist/core/adapters/timeline.d.ts +23 -0
- package/dist/core/adapters/timeline.js +88 -0
- package/dist/core/adapters/types.d.ts +137 -0
- package/dist/core/adapters/types.js +50 -0
- package/dist/core/agent-preferences.d.ts +16 -0
- package/dist/core/agent-preferences.js +124 -0
- package/dist/{algorithms → core/algorithms}/analytics/token-estimator.d.ts +1 -1
- package/dist/{algorithms → core/algorithms}/analytics/token-estimator.js +3 -3
- package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.d.ts +1 -1
- package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.js +1 -1
- package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.d.ts +1 -1
- package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.js +7 -10
- package/dist/{algorithms → core/algorithms}/handlers/approve-merge.js +4 -4
- package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.js +3 -3
- package/dist/{algorithms → core/algorithms}/handlers/get-stats.js +3 -3
- package/dist/{algorithms → core/algorithms}/handlers/list-proposals.js +3 -3
- package/dist/{algorithms → core/algorithms}/handlers/preview-merge.js +3 -3
- package/dist/{algorithms → core/algorithms}/handlers/reject-merge.js +3 -3
- package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.js +3 -3
- package/dist/core/algorithms/index.d.ts +21 -0
- package/dist/core/algorithms/index.js +26 -0
- package/dist/core/algorithms/operations/cache-maintenance.d.ts +12 -0
- package/dist/core/algorithms/operations/cache-maintenance.js +157 -0
- package/dist/{algorithms → core/algorithms}/safety/safety-checks.d.ts +2 -6
- package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.d.ts +19 -1
- package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.js +74 -123
- package/dist/core/algorithms/types.d.ts +125 -0
- package/dist/core/algorithms/types.js +5 -0
- package/dist/core/associations.d.ts +3 -2
- package/dist/core/associations.js +37 -2
- package/dist/core/autosave.d.ts +19 -0
- package/dist/core/autosave.js +16 -0
- 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 +2 -0
- package/dist/core/commands/mcp-server.js +6 -0
- package/dist/core/commands/remember.d.ts +24 -0
- package/dist/core/commands/remember.js +144 -0
- package/dist/core/compression.d.ts +45 -0
- package/dist/core/compression.js +160 -0
- package/dist/core/context/agent-context.d.ts +106 -0
- package/dist/core/context/agent-context.js +274 -0
- package/dist/core/{context-paging.d.ts → context/context-paging.d.ts} +2 -12
- package/dist/core/{context-paging.js → context/context-paging.js} +19 -39
- package/dist/core/context/context-window.d.ts +40 -0
- package/dist/core/context/context-window.js +177 -0
- package/dist/core/context/context.js +22 -0
- 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/embeddings/local-embeddings.d.ts +11 -0
- 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 -401
- package/dist/core/error-handling.d.ts +63 -0
- package/dist/core/error-handling.js +173 -0
- 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 +83 -0
- package/dist/core/hooks/agent-hooks.js +521 -0
- package/dist/core/hooks/auto-tagger.d.ts +19 -0
- package/dist/core/hooks/auto-tagger.js +155 -0
- package/dist/core/hooks/capture-filter.d.ts +41 -0
- package/dist/core/hooks/capture-filter.js +128 -0
- 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/{agent-memory.js → ingestion/agent-memory.js} +5 -7
- package/dist/core/{core-memory.d.ts → ingestion/core-memory.d.ts} +2 -2
- package/dist/core/{core-memory.js → ingestion/core-memory.js} +7 -7
- package/dist/core/ingestion/learnings.d.ts +57 -0
- package/dist/core/ingestion/learnings.js +205 -0
- package/dist/core/ingestion/signal-engine.d.ts +41 -0
- package/dist/core/ingestion/signal-engine.js +201 -0
- package/dist/core/integrations/obsidian-vault.d.ts +31 -0
- package/dist/core/integrations/obsidian-vault.js +156 -0
- package/dist/core/lib/db-client.d.ts +114 -0
- package/dist/core/lib/db-client.js +130 -0
- 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 +132 -0
- package/dist/core/lib/schemas.js +87 -0
- package/dist/core/lib/types.d.ts +45 -0
- package/dist/core/lib/types.js +6 -0
- package/dist/core/{utils.d.ts → lib/utils.d.ts} +5 -0
- package/dist/core/lib/utils.js +145 -0
- package/dist/core/lib/validation.d.ts +38 -0
- package/dist/core/lib/validation.js +151 -0
- package/dist/core/lifecycle.d.ts +7 -1
- package/dist/core/lifecycle.js +152 -42
- package/dist/core/logger.d.ts +1 -0
- package/dist/core/logger.js +13 -1
- package/dist/core/mcp/tools.d.ts +0 -2
- package/dist/core/mcp/tools.js +35 -90
- package/dist/core/mcp/types.d.ts +25 -253
- package/dist/core/mcp/types.js +2 -2
- package/dist/core/memory/categorizer.js +2 -0
- package/dist/core/memory/conflict-detector.js +1 -1
- package/dist/core/memory/consolidation.d.ts +1 -10
- package/dist/core/memory/consolidation.js +4 -39
- package/dist/core/memory/context-collector.js +1 -1
- package/dist/core/memory/edit-workflow.js +1 -1
- package/dist/core/memory/entity-extractor.d.ts +4 -0
- package/dist/core/memory/entity-extractor.js +30 -16
- package/dist/core/memory/entity-resolver.js +7 -7
- 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/fact-extractor.js +12 -12
- package/dist/core/memory/feedback-tracker.js +1 -1
- package/dist/core/memory/hooks.d.ts +88 -0
- package/dist/core/memory/hooks.js +174 -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 +9 -11
- package/dist/core/memory/hybrid-search.js +496 -273
- package/dist/core/memory/importance.d.ts +2 -24
- package/dist/core/memory/importance.js +7 -91
- package/dist/core/memory/index.d.ts +1 -0
- package/dist/core/memory/index.js +1 -0
- package/dist/core/memory/loader.d.ts +31 -0
- package/dist/core/memory/loader.js +141 -0
- package/dist/core/memory/markdown/markdown-storage.d.ts +72 -0
- package/dist/core/memory/markdown/markdown-storage.js +243 -0
- package/dist/core/memory/memories.d.ts +23 -19
- package/dist/core/memory/memories.js +243 -228
- package/dist/core/memory/memory-lifecycle.d.ts +8 -0
- package/dist/core/memory/memory-lifecycle.js +47 -0
- package/dist/core/memory/migrate.d.ts +21 -0
- package/dist/core/memory/migrate.js +134 -0
- package/dist/core/memory/normalization.d.ts +7 -0
- package/dist/core/memory/normalization.js +26 -0
- package/dist/core/memory/path-strengthener.d.ts +39 -0
- package/dist/core/memory/path-strengthener.js +150 -0
- package/dist/core/memory/progressive-disclosure.js +1 -1
- package/dist/core/memory/query-processor.js +37 -3
- package/dist/core/memory/query-rewriter.js +9 -9
- package/dist/core/memory/retrieval-feedback.d.ts +70 -0
- package/dist/core/memory/retrieval-feedback.js +213 -0
- package/dist/core/memory/serialization.d.ts +4 -0
- package/dist/core/memory/serialization.js +49 -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 +15 -0
- package/dist/core/memory/stats.js +69 -13
- package/dist/core/memory/temporal-facts.js +21 -0
- package/dist/core/memory/trigger-detector.d.ts +8 -1
- package/dist/core/memory/trigger-detector.js +42 -5
- package/dist/core/memory/write-gate.js +1 -1
- package/dist/core/places/index.d.ts +14 -0
- package/dist/core/places/index.js +14 -0
- package/dist/core/places/memory-places.d.ts +68 -0
- package/dist/core/places/memory-places.js +261 -0
- package/dist/core/places/places.d.ts +88 -0
- package/dist/core/places/places.js +314 -0
- package/dist/core/places/rules.d.ts +74 -0
- package/dist/core/places/rules.js +240 -0
- package/dist/core/places/walking.d.ts +56 -0
- package/dist/core/places/walking.js +121 -0
- package/dist/core/projects.d.ts +5 -0
- package/dist/core/projects.js +47 -18
- package/dist/core/responses.d.ts +96 -0
- package/dist/core/responses.js +122 -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 +193 -10
- package/dist/core/scheduler/index.d.ts +1 -1
- package/dist/core/scheduler/index.js +1 -1
- package/dist/core/scheduler/job-runner.js +2 -2
- package/dist/core/search/conversations.js +40 -42
- package/dist/core/search/entities.js +6 -9
- package/dist/core/search/graph-boost.d.ts +7 -0
- package/dist/core/search/graph-boost.js +23 -0
- package/dist/core/search/qmd-wrapper.d.ts +36 -0
- package/dist/core/search/qmd-wrapper.js +58 -0
- package/dist/core/security/encrypt.d.ts +6 -0
- package/dist/core/security/encrypt.js +47 -0
- package/dist/core/{governance.d.ts → security/governance.d.ts} +6 -1
- package/dist/core/security/governance.js +79 -0
- package/dist/core/session/auto-load.js +34 -9
- package/dist/core/session/entity-tracker.d.ts +62 -0
- package/dist/core/session/entity-tracker.js +287 -0
- package/dist/core/session/index.d.ts +1 -1
- package/dist/core/session/index.js +1 -1
- package/dist/core/session/reference-resolver.d.ts +26 -0
- package/dist/core/session/reference-resolver.js +121 -0
- package/dist/core/{session-hooks → session}/self-iteration-job.d.ts +15 -0
- package/dist/core/{session-hooks → session}/self-iteration-job.js +195 -90
- 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/{cache.js → storage/cache.js} +2 -2
- package/dist/core/utils/memory-operations.js +1 -1
- package/dist/core/utils/summarization-helpers.d.ts +0 -4
- package/dist/core/utils/summarization-helpers.js +1 -6
- package/dist/core/utils/vector-operations.d.ts +71 -0
- package/dist/core/utils/vector-operations.js +129 -0
- package/dist/db/adapter.d.ts +3 -3
- package/dist/db/adapter.js +99 -88
- package/dist/db/bootstrap.d.ts +2 -0
- package/dist/db/bootstrap.js +921 -674
- package/dist/{drizzle → db/drizzle}/schema-sqlite.d.ts +775 -25
- package/dist/{drizzle → db/drizzle}/schema-sqlite.js +170 -24
- package/dist/{drizzle → db/drizzle}/schema.d.ts +731 -32
- package/dist/{drizzle → db/drizzle}/schema.js +192 -32
- package/dist/db/drizzle.config.d.ts +3 -0
- package/dist/db/drizzle.config.js +12 -0
- package/dist/db/index.d.ts +1 -5
- package/dist/db/index.js +51 -8
- 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/neon.d.ts +8 -0
- package/dist/db/neon.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 +39 -0
- package/dist/db/schema/index.js +51 -0
- 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/db/schema/tables/context-sessions.d.ts +9 -0
- package/dist/db/schema/tables/context-sessions.js +37 -0
- package/dist/db/schema/tables/conversations.d.ts +9 -0
- package/dist/db/schema/tables/conversations.js +47 -0
- package/dist/db/schema/tables/core-memory.d.ts +9 -0
- package/dist/db/schema/tables/core-memory.js +41 -0
- package/dist/db/schema/tables/entities.d.ts +9 -0
- package/dist/db/schema/tables/entities.js +39 -0
- package/dist/db/schema/tables/entity-relations.d.ts +9 -0
- package/dist/db/schema/tables/entity-relations.js +31 -0
- package/dist/db/schema/tables/learnings.d.ts +9 -0
- package/dist/db/schema/tables/learnings.js +66 -0
- package/dist/db/schema/tables/memories.d.ts +9 -0
- package/dist/db/schema/tables/memories.js +161 -0
- package/dist/db/schema/tables/memory-associations.d.ts +9 -0
- package/dist/db/schema/tables/memory-associations.js +39 -0
- package/dist/db/schema/tables/memory-hash-cache.d.ts +9 -0
- package/dist/db/schema/tables/memory-hash-cache.js +29 -0
- package/dist/db/schema/tables/memory-merge-history.d.ts +9 -0
- package/dist/db/schema/tables/memory-merge-history.js +33 -0
- package/dist/db/schema/tables/memory-merge-proposals.d.ts +9 -0
- package/dist/db/schema/tables/memory-merge-proposals.js +39 -0
- package/dist/db/schema/tables/messages.d.ts +9 -0
- package/dist/db/schema/tables/messages.js +41 -0
- package/dist/db/schema/tables/namespaces.d.ts +9 -0
- package/dist/db/schema/tables/namespaces.js +37 -0
- package/dist/db/schema/tables/projects.d.ts +9 -0
- package/dist/db/schema/tables/projects.js +31 -0
- package/dist/db/schema/tables/users.d.ts +9 -0
- package/dist/db/schema/tables/users.js +27 -0
- package/dist/db/schema.d.ts +1 -1
- package/dist/db/schema.js +2 -2
- package/dist/db/supabase.d.ts +9 -0
- package/dist/db/supabase.js +24 -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 -0
- package/package.json +132 -173
- 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 +107 -114
- package/skills/squish-memory/install.sh +3 -3
- package/skills/squish-memory/{claude-desktop.json → references/claude-desktop.json} +12 -12
- package/skills/squish-memory/{openclaw.json → references/openclaw.json} +13 -13
- package/skills/squish-memory/{opencode.json → references/opencode.json} +14 -14
- package/.claude-plugin/marketplace.json +0 -20
- package/.claude-plugin/plugin.json +0 -32
- package/.env.mcp.example +0 -60
- package/.mcp.json +0 -11
- package/QUICK-START.md +0 -71
- package/bin/squish-add.mjs +0 -32
- package/bin/squish-rm.mjs +0 -21
- package/commands/context-paging.md +0 -51
- package/commands/context-status.md +0 -22
- package/commands/context.md +0 -5
- package/commands/core-memory.md +0 -56
- package/commands/health.md +0 -5
- package/commands/init.md +0 -39
- package/commands/merge.md +0 -113
- package/commands/observe.md +0 -5
- package/commands/recall.md +0 -5
- package/commands/remember.md +0 -11
- package/commands/search.md +0 -10
- package/config/mcp-cli-fallback-policy.json +0 -22
- package/config/mcp.json +0 -38
- package/config/plugin-manifest.json +0 -152
- package/config/plugin-manifest.schema.json +0 -244
- package/config/remote-memory-policy.json +0 -32
- package/dist/api/web/index.d.ts +0 -3
- package/dist/api/web/index.js +0 -4
- package/dist/api/web/web-server.d.ts +0 -3
- package/dist/api/web/web-server.js +0 -6
- package/dist/api/web/web.d.ts +0 -4
- package/dist/api/web/web.js +0 -639
- package/dist/commands/managed-sync.d.ts +0 -10
- package/dist/commands/managed-sync.js +0 -64
- package/dist/commands/mcp-server.d.ts +0 -3
- package/dist/commands/mcp-server.js +0 -393
- package/dist/core/context.js +0 -24
- package/dist/core/governance.js +0 -64
- package/dist/core/local-embeddings.d.ts +0 -6
- package/dist/core/local-embeddings.js +0 -20
- 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/observations.d.ts +0 -26
- package/dist/core/observations.js +0 -110
- package/dist/core/requirements.d.ts +0 -20
- package/dist/core/requirements.js +0 -35
- package/dist/core/search/qmd-search.d.ts +0 -61
- package/dist/core/search/qmd-search.js +0 -178
- package/dist/core/snapshots.d.ts +0 -29
- package/dist/core/snapshots.js +0 -220
- package/dist/core/sync/qmd-sync.d.ts +0 -106
- package/dist/core/sync/qmd-sync.js +0 -213
- package/dist/core/utils.js +0 -74
- package/dist/index.d.ts +0 -19
- package/dist/index.js +0 -997
- 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/hooks/hooks.json +0 -52
- package/hooks/post-tool-use.js +0 -26
- package/hooks/session-end.js +0 -28
- package/hooks/session-start.js +0 -33
- package/hooks/user-prompt-submit.js +0 -26
- package/hooks/utils.js +0 -153
- package/npx-installer.js +0 -208
- package/packages/plugin-claude-code/README.md +0 -73
- package/packages/plugin-claude-code/dist/plugin-wrapper.d.ts +0 -35
- package/packages/plugin-claude-code/dist/plugin-wrapper.js +0 -191
- package/packages/plugin-claude-code/package.json +0 -31
- package/packages/plugin-openclaw/README.md +0 -70
- package/packages/plugin-openclaw/dist/index.d.ts +0 -49
- package/packages/plugin-openclaw/dist/index.js +0 -262
- package/packages/plugin-openclaw/openclaw.plugin.json +0 -94
- package/packages/plugin-openclaw/package.json +0 -31
- package/packages/plugin-opencode/install.mjs +0 -217
- package/packages/plugin-opencode/package.json +0 -21
- package/plugin.json +0 -32
- package/scripts/build-release.sh +0 -36
- package/scripts/check-secrets.js +0 -132
- package/scripts/db/check-db.mjs +0 -88
- package/scripts/db/fix-all-columns.mjs +0 -52
- package/scripts/db/fix-schema-all.mjs +0 -55
- package/scripts/db/fix-schema-full.mjs +0 -46
- package/scripts/db/fix-schema.mjs +0 -38
- package/scripts/db/init-db.mjs +0 -13
- package/scripts/db/recreate-db.mjs +0 -14
- package/scripts/generate-mcp.mjs +0 -264
- package/scripts/github-release.sh +0 -77
- package/scripts/init-dirs.mjs +0 -13
- package/scripts/install-interactive.mjs +0 -677
- package/scripts/install-mcp.mjs +0 -116
- package/scripts/install-plugin.mjs +0 -415
- package/scripts/install-web.sh +0 -120
- package/scripts/install.mjs +0 -340
- package/scripts/openclaw-bootstrap.mjs +0 -127
- package/scripts/package-release.sh +0 -71
- package/scripts/remote-preflight.mjs +0 -62
- package/scripts/squish-fallback.mjs +0 -132
- package/scripts/test/test-all-systems.mjs +0 -139
- package/scripts/test/test-memory-system.mjs +0 -139
- package/scripts/test/test-v0.5.0.mjs +0 -210
- package/scripts/test-interactive.mjs +0 -131
- package/scripts/verify-mcp.mjs +0 -214
- package/skills/memory-guide/SKILL.md +0 -332
- package/skills/squish-cli/SKILL.md +0 -240
- package/skills/squish-mcp/SKILL.md +0 -355
- package/skills/squish-memory/install.mjs +0 -335
- package/skills/squish-memory/skill.json +0 -32
- /package/dist/{algorithms → core/algorithms}/detection/hash-filters.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/detection/hash-filters.js +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/approve-merge.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/get-stats.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/list-proposals.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/preview-merge.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/reject-merge.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/safety/safety-checks.js +0 -0
- /package/dist/{algorithms → core/algorithms}/utils/response-builder.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/utils/response-builder.js +0 -0
- /package/dist/core/{context.d.ts → context/context.d.ts} +0 -0
- /package/dist/core/{agent-memory.d.ts → ingestion/agent-memory.d.ts} +0 -0
- /package/dist/core/{privacy.d.ts → security/privacy.d.ts} +0 -0
- /package/dist/core/{privacy.js → security/privacy.js} +0 -0
- /package/dist/core/{secret-detector.d.ts → security/secret-detector.d.ts} +0 -0
- /package/dist/core/{secret-detector.js → security/secret-detector.js} +0 -0
- /package/dist/core/{session-hooks → session}/session-hooks.d.ts +0 -0
- /package/dist/core/{session-hooks → session}/session-hooks.js +0 -0
- /package/dist/core/{cache.d.ts → storage/cache.d.ts} +0 -0
- /package/dist/core/{database.d.ts → storage/database.d.ts} +0 -0
- /package/dist/core/{database.js → storage/database.js} +0 -0
|
@@ -1,17 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Importance Scoring System
|
|
3
|
-
*
|
|
4
|
-
* Calculates and manages memory importance scores (0-100) with temporal decay.
|
|
5
|
-
* Based on research from Mnemosyne architecture and ReMe (Memory Replay).
|
|
6
|
-
*
|
|
7
|
-
* Scoring factors:
|
|
8
|
-
* - Base score: 50 (neutral)
|
|
9
|
-
* - Recency boost: decays over time (exponential decay)
|
|
10
|
-
* - Access frequency: more frequently accessed = higher importance
|
|
11
|
-
* - Type weighting: decisions > facts > preferences > context > observations
|
|
12
|
-
* - User flags: pinned/protected memories get maximum importance
|
|
3
|
+
* Calculates and manages memory importance scores (0-100) with temporal decay
|
|
13
4
|
*/
|
|
14
|
-
import type { Memory } from '../../drizzle/schema.js';
|
|
5
|
+
import type { Memory } from '../../db/drizzle/schema.js';
|
|
15
6
|
export interface ImportanceScore {
|
|
16
7
|
score: number;
|
|
17
8
|
components: {
|
|
@@ -35,14 +26,6 @@ export declare function calculateImportance(memory: Partial<Memory>): Importance
|
|
|
35
26
|
* Used when memory is accessed or modified
|
|
36
27
|
*/
|
|
37
28
|
export declare function updateImportanceScore(memoryId: string, incrementAccess?: boolean): Promise<number>;
|
|
38
|
-
/**
|
|
39
|
-
* Decay importance scores for old memories
|
|
40
|
-
* Should be run periodically (e.g., daily) to reduce scores of stale memories
|
|
41
|
-
*
|
|
42
|
-
* This function applies exponential decay to all memories that haven't been
|
|
43
|
-
* recalculated recently, keeping the system's importance scores current.
|
|
44
|
-
*/
|
|
45
|
-
export declare function decayImportanceScores(projectId?: string): Promise<number>;
|
|
46
29
|
/**
|
|
47
30
|
* Get low-importance memories that are candidates for consolidation
|
|
48
31
|
* These are old, rarely accessed memories with low importance scores
|
|
@@ -60,9 +43,4 @@ export declare function setImportanceScore(memoryId: string, score: number): Pro
|
|
|
60
43
|
* Pin a memory to prevent decay and consolidation
|
|
61
44
|
*/
|
|
62
45
|
export declare function pinMemory(memoryId: string, pinned?: boolean): Promise<void>;
|
|
63
|
-
/**
|
|
64
|
-
* Calculate cosine similarity between two vectors
|
|
65
|
-
* Re-exported for use in consolidation
|
|
66
|
-
*/
|
|
67
|
-
export declare function cosineSimilarity(vecA: number[], vecB: number[]): number;
|
|
68
46
|
//# sourceMappingURL=importance.d.ts.map
|
|
@@ -1,20 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Importance Scoring System
|
|
3
|
-
*
|
|
4
|
-
* Calculates and manages memory importance scores (0-100) with temporal decay.
|
|
5
|
-
* Based on research from Mnemosyne architecture and ReMe (Memory Replay).
|
|
6
|
-
*
|
|
7
|
-
* Scoring factors:
|
|
8
|
-
* - Base score: 50 (neutral)
|
|
9
|
-
* - Recency boost: decays over time (exponential decay)
|
|
10
|
-
* - Access frequency: more frequently accessed = higher importance
|
|
11
|
-
* - Type weighting: decisions > facts > preferences > context > observations
|
|
12
|
-
* - User flags: pinned/protected memories get maximum importance
|
|
3
|
+
* Calculates and manages memory importance scores (0-100) with temporal decay
|
|
13
4
|
*/
|
|
14
|
-
import { createDatabaseClient } from '../database.js';
|
|
15
|
-
import { getDb } from '../../db/index.js';
|
|
16
|
-
import { getSchema } from '../../db/schema.js';
|
|
17
5
|
import { eq } from 'drizzle-orm';
|
|
6
|
+
import { getDbClient } from '../lib/db-client.js';
|
|
18
7
|
/**
|
|
19
8
|
* Type weights for importance scoring
|
|
20
9
|
* Higher values = more important memory types
|
|
@@ -151,8 +140,7 @@ function generateImportanceExplanation(components, memory) {
|
|
|
151
140
|
* Used when memory is accessed or modified
|
|
152
141
|
*/
|
|
153
142
|
export async function updateImportanceScore(memoryId, incrementAccess = false) {
|
|
154
|
-
const db =
|
|
155
|
-
const schema = await getSchema();
|
|
143
|
+
const { db, schema } = await getDbClient();
|
|
156
144
|
// Get current memory
|
|
157
145
|
const memories = await db
|
|
158
146
|
.select()
|
|
@@ -181,60 +169,12 @@ export async function updateImportanceScore(memoryId, incrementAccess = false) {
|
|
|
181
169
|
.where(eq(schema.memories.id, memoryId));
|
|
182
170
|
return importance.score;
|
|
183
171
|
}
|
|
184
|
-
/**
|
|
185
|
-
* Decay importance scores for old memories
|
|
186
|
-
* Should be run periodically (e.g., daily) to reduce scores of stale memories
|
|
187
|
-
*
|
|
188
|
-
* This function applies exponential decay to all memories that haven't been
|
|
189
|
-
* recalculated recently, keeping the system's importance scores current.
|
|
190
|
-
*/
|
|
191
|
-
export async function decayImportanceScores(projectId) {
|
|
192
|
-
const db = createDatabaseClient(await getDb());
|
|
193
|
-
const schema = await getSchema();
|
|
194
|
-
// Get memories that need recalculation
|
|
195
|
-
// (those not recalculated in the last 24 hours)
|
|
196
|
-
const oneDayAgo = new Date(Date.now() - 24 * 60 * 60 * 1000);
|
|
197
|
-
let memories;
|
|
198
|
-
if (projectId) {
|
|
199
|
-
memories = await db
|
|
200
|
-
.select()
|
|
201
|
-
.from(schema.memories)
|
|
202
|
-
.where(eq(schema.memories.projectId, projectId))
|
|
203
|
-
.all();
|
|
204
|
-
}
|
|
205
|
-
else {
|
|
206
|
-
memories = await db.select().from(schema.memories).all();
|
|
207
|
-
}
|
|
208
|
-
let updatedCount = 0;
|
|
209
|
-
for (const memory of memories) {
|
|
210
|
-
// Skip pinned/protected memories (they don't decay)
|
|
211
|
-
if (memory.isPinned || memory.isProtected) {
|
|
212
|
-
continue;
|
|
213
|
-
}
|
|
214
|
-
// Skip consolidated memories
|
|
215
|
-
if (memory.isConsolidated) {
|
|
216
|
-
continue;
|
|
217
|
-
}
|
|
218
|
-
// Recalculate importance (which includes recency decay)
|
|
219
|
-
const importance = calculateImportance(memory);
|
|
220
|
-
await db
|
|
221
|
-
.update(schema.memories)
|
|
222
|
-
.set({
|
|
223
|
-
importanceScore: importance.score,
|
|
224
|
-
lastImportanceRecalc: new Date(),
|
|
225
|
-
})
|
|
226
|
-
.where(eq(schema.memories.id, memory.id));
|
|
227
|
-
updatedCount++;
|
|
228
|
-
}
|
|
229
|
-
return updatedCount;
|
|
230
|
-
}
|
|
231
172
|
/**
|
|
232
173
|
* Get low-importance memories that are candidates for consolidation
|
|
233
174
|
* These are old, rarely accessed memories with low importance scores
|
|
234
175
|
*/
|
|
235
176
|
export async function getLowImportanceMemories(projectId, options = {}) {
|
|
236
|
-
const db =
|
|
237
|
-
const schema = await getSchema();
|
|
177
|
+
const { db, schema } = await getDbClient();
|
|
238
178
|
const { minAge = 90, // 90 days old by default
|
|
239
179
|
maxImportance = 30, // importance score below 30
|
|
240
180
|
limit = 100, } = options;
|
|
@@ -273,8 +213,7 @@ export async function setImportanceScore(memoryId, score) {
|
|
|
273
213
|
if (score < 0 || score > 100) {
|
|
274
214
|
throw new Error('Importance score must be between 0 and 100');
|
|
275
215
|
}
|
|
276
|
-
const db =
|
|
277
|
-
const schema = await getSchema();
|
|
216
|
+
const { db, schema } = await getDbClient();
|
|
278
217
|
await db
|
|
279
218
|
.update(schema.memories)
|
|
280
219
|
.set({
|
|
@@ -287,8 +226,7 @@ export async function setImportanceScore(memoryId, score) {
|
|
|
287
226
|
* Pin a memory to prevent decay and consolidation
|
|
288
227
|
*/
|
|
289
228
|
export async function pinMemory(memoryId, pinned = true) {
|
|
290
|
-
const db =
|
|
291
|
-
const schema = await getSchema();
|
|
229
|
+
const { db, schema } = await getDbClient();
|
|
292
230
|
await db
|
|
293
231
|
.update(schema.memories)
|
|
294
232
|
.set({
|
|
@@ -299,27 +237,5 @@ export async function pinMemory(memoryId, pinned = true) {
|
|
|
299
237
|
})
|
|
300
238
|
.where(eq(schema.memories.id, memoryId));
|
|
301
239
|
}
|
|
302
|
-
|
|
303
|
-
* Calculate cosine similarity between two vectors
|
|
304
|
-
* Re-exported for use in consolidation
|
|
305
|
-
*/
|
|
306
|
-
export function cosineSimilarity(vecA, vecB) {
|
|
307
|
-
if (vecA.length !== vecB.length) {
|
|
308
|
-
return 0;
|
|
309
|
-
}
|
|
310
|
-
let dotProduct = 0;
|
|
311
|
-
let magnitudeA = 0;
|
|
312
|
-
let magnitudeB = 0;
|
|
313
|
-
for (let i = 0; i < vecA.length; i++) {
|
|
314
|
-
dotProduct += vecA[i] * vecB[i];
|
|
315
|
-
magnitudeA += vecA[i] * vecA[i];
|
|
316
|
-
magnitudeB += vecB[i] * vecB[i];
|
|
317
|
-
}
|
|
318
|
-
magnitudeA = Math.sqrt(magnitudeA);
|
|
319
|
-
magnitudeB = Math.sqrt(magnitudeB);
|
|
320
|
-
if (magnitudeA === 0 || magnitudeB === 0) {
|
|
321
|
-
return 0;
|
|
322
|
-
}
|
|
323
|
-
return dotProduct / (magnitudeA * magnitudeB);
|
|
324
|
-
}
|
|
240
|
+
// cosineSimilarity has been removed - import from core/utils/vector-operations.ts directly
|
|
325
241
|
//# sourceMappingURL=importance.js.map
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Loading Abstraction
|
|
3
|
+
* Unified utilities for loading memories by ID with configurable options
|
|
4
|
+
*/
|
|
5
|
+
import { type MemoryRecord } from './normalization.js';
|
|
6
|
+
export interface LoadMemoryOptions {
|
|
7
|
+
incrementAccess?: boolean;
|
|
8
|
+
decrypt?: boolean;
|
|
9
|
+
normalize?: boolean;
|
|
10
|
+
includeSensitive?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Load a single memory by ID with configurable options
|
|
14
|
+
*/
|
|
15
|
+
export declare function loadMemory(id: string, options?: LoadMemoryOptions): Promise<MemoryRecord | any | null>;
|
|
16
|
+
/**
|
|
17
|
+
* Load multiple memories by IDs efficiently
|
|
18
|
+
* Returns a Map keyed by memory ID
|
|
19
|
+
*/
|
|
20
|
+
export declare function loadMemories(ids: string[], options?: LoadMemoryOptions): Promise<Map<string, any>>;
|
|
21
|
+
/**
|
|
22
|
+
* Load a memory by ID with raw database access, no processing.
|
|
23
|
+
*
|
|
24
|
+
* This is for special cases that need the raw database row without
|
|
25
|
+
* normalization, decryption, or access count updates.
|
|
26
|
+
*
|
|
27
|
+
* @param id - Memory UUID
|
|
28
|
+
* @returns Raw database row or null if not found
|
|
29
|
+
*/
|
|
30
|
+
export declare function loadMemoryRaw(id: string): Promise<any | null>;
|
|
31
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Loading Abstraction
|
|
3
|
+
* Unified utilities for loading memories by ID with configurable options
|
|
4
|
+
*/
|
|
5
|
+
import { eq, inArray } from 'drizzle-orm';
|
|
6
|
+
import { getDbClient } from '../lib/db-client.js';
|
|
7
|
+
import { decrypt } from '../security/encrypt.js';
|
|
8
|
+
import { normalizeMemory } from './normalization.js';
|
|
9
|
+
import { requireUuid } from '../lib/validation.js';
|
|
10
|
+
/**
|
|
11
|
+
* Load a single memory by ID with configurable options
|
|
12
|
+
*/
|
|
13
|
+
export async function loadMemory(id, options = {}) {
|
|
14
|
+
const { incrementAccess = true, decrypt: shouldDecrypt = true, normalize = true, includeSensitive = false } = options;
|
|
15
|
+
// Validate UUID
|
|
16
|
+
requireUuid(id);
|
|
17
|
+
const { db, schema } = await getDbClient();
|
|
18
|
+
// Query the memory
|
|
19
|
+
const rows = await db.select().from(schema.memories).where(eq(schema.memories.id, id)).limit(1);
|
|
20
|
+
const row = rows[0];
|
|
21
|
+
if (!row)
|
|
22
|
+
return null;
|
|
23
|
+
// Increment access count if needed
|
|
24
|
+
if (incrementAccess) {
|
|
25
|
+
await db.update(schema.memories)
|
|
26
|
+
.set({
|
|
27
|
+
accessCount: (row.accessCount ?? 0) + 1,
|
|
28
|
+
lastAccessedAt: new Date(),
|
|
29
|
+
})
|
|
30
|
+
.where(eq(schema.memories.id, id));
|
|
31
|
+
}
|
|
32
|
+
// Determine content: decrypt if needed
|
|
33
|
+
let content = row.content;
|
|
34
|
+
let encryptedContent = row.encrypted_content;
|
|
35
|
+
let encryptionNonce = row.encryption_nonce;
|
|
36
|
+
if (shouldDecrypt && row.is_encrypted) {
|
|
37
|
+
try {
|
|
38
|
+
content = decrypt(encryptedContent, encryptionNonce);
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
console.warn('Failed to decrypt memory', e);
|
|
42
|
+
content = row.content; // fallback to stored content (encrypted)
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Build result object
|
|
46
|
+
let result = { ...row, content };
|
|
47
|
+
// If not decrypting and includeSensitive, keep encrypted fields
|
|
48
|
+
if (!shouldDecrypt && includeSensitive) {
|
|
49
|
+
result.encrypted_content = encryptedContent;
|
|
50
|
+
result.encryption_nonce = encryptionNonce;
|
|
51
|
+
}
|
|
52
|
+
// If normalize, convert to MemoryRecord shape
|
|
53
|
+
if (normalize) {
|
|
54
|
+
return normalizeMemory(result);
|
|
55
|
+
}
|
|
56
|
+
// Otherwise return raw-ish row (with content possibly decrypted)
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Load multiple memories by IDs efficiently
|
|
61
|
+
* Returns a Map keyed by memory ID
|
|
62
|
+
*/
|
|
63
|
+
export async function loadMemories(ids, options = {}) {
|
|
64
|
+
const { incrementAccess = true, decrypt: shouldDecrypt = true, normalize = true, includeSensitive = false } = options;
|
|
65
|
+
if (ids.length === 0) {
|
|
66
|
+
return new Map();
|
|
67
|
+
}
|
|
68
|
+
// Validate all UUIDs
|
|
69
|
+
for (const id of ids) {
|
|
70
|
+
requireUuid(id);
|
|
71
|
+
}
|
|
72
|
+
const { db, schema } = await getDbClient();
|
|
73
|
+
// Batch query using IN operator
|
|
74
|
+
const rows = await db
|
|
75
|
+
.select()
|
|
76
|
+
.from(schema.memories)
|
|
77
|
+
.where(inArray(schema.memories.id, ids));
|
|
78
|
+
// Create a map from id to row
|
|
79
|
+
const rowMap = new Map();
|
|
80
|
+
for (const row of rows) {
|
|
81
|
+
rowMap.set(row.id, row);
|
|
82
|
+
}
|
|
83
|
+
// Increment access counts if needed
|
|
84
|
+
if (incrementAccess) {
|
|
85
|
+
const now = new Date();
|
|
86
|
+
for (const row of rows) {
|
|
87
|
+
await db.update(schema.memories)
|
|
88
|
+
.set({
|
|
89
|
+
accessCount: (row.accessCount ?? 0) + 1,
|
|
90
|
+
lastAccessedAt: now,
|
|
91
|
+
})
|
|
92
|
+
.where(eq(schema.memories.id, row.id));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Process each row according to options
|
|
96
|
+
const resultMap = new Map();
|
|
97
|
+
for (const row of rows) {
|
|
98
|
+
let content = row.content;
|
|
99
|
+
let encryptedContent = row.encrypted_content;
|
|
100
|
+
let encryptionNonce = row.encryption_nonce;
|
|
101
|
+
if (shouldDecrypt && row.is_encrypted) {
|
|
102
|
+
try {
|
|
103
|
+
content = decrypt(encryptedContent, encryptionNonce);
|
|
104
|
+
}
|
|
105
|
+
catch (e) {
|
|
106
|
+
console.warn('Failed to decrypt memory', e);
|
|
107
|
+
content = row.content;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
let result = { ...row, content };
|
|
111
|
+
if (!shouldDecrypt && includeSensitive) {
|
|
112
|
+
result.encrypted_content = encryptedContent;
|
|
113
|
+
result.encryption_nonce = encryptionNonce;
|
|
114
|
+
}
|
|
115
|
+
if (normalize) {
|
|
116
|
+
resultMap.set(row.id, normalizeMemory(result));
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
resultMap.set(row.id, result);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return resultMap;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Load a memory by ID with raw database access, no processing.
|
|
126
|
+
*
|
|
127
|
+
* This is for special cases that need the raw database row without
|
|
128
|
+
* normalization, decryption, or access count updates.
|
|
129
|
+
*
|
|
130
|
+
* @param id - Memory UUID
|
|
131
|
+
* @returns Raw database row or null if not found
|
|
132
|
+
*/
|
|
133
|
+
export async function loadMemoryRaw(id) {
|
|
134
|
+
// Validate UUID
|
|
135
|
+
requireUuid(id);
|
|
136
|
+
const { db, schema } = await getDbClient();
|
|
137
|
+
// Direct query without any processing
|
|
138
|
+
const rows = await db.select().from(schema.memories).where(eq(schema.memories.id, id)).limit(1);
|
|
139
|
+
return rows[0] || null;
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Markdown Storage
|
|
3
|
+
*
|
|
4
|
+
* Stores memories as markdown files in .squish/memory/
|
|
5
|
+
* Following Karpathy LLM Memory pattern:
|
|
6
|
+
* - raw/ : Append-only memory files (never edit)
|
|
7
|
+
* - processed/ : LLM-generated articles (future)
|
|
8
|
+
* - outputs/ : Query responses (future)
|
|
9
|
+
*
|
|
10
|
+
* Each memory = one .md file with YAML frontmatter
|
|
11
|
+
*/
|
|
12
|
+
import type { MemoryType } from '../memories.js';
|
|
13
|
+
export interface MarkdownMemoryInput {
|
|
14
|
+
content: string;
|
|
15
|
+
type?: MemoryType;
|
|
16
|
+
tags?: string[];
|
|
17
|
+
reasoning?: string;
|
|
18
|
+
memoryContext?: string;
|
|
19
|
+
examples?: string;
|
|
20
|
+
exceptions?: string;
|
|
21
|
+
source?: string;
|
|
22
|
+
project?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface MarkdownMemoryFile {
|
|
25
|
+
id: string;
|
|
26
|
+
type: MemoryType;
|
|
27
|
+
content: string;
|
|
28
|
+
tags: string[];
|
|
29
|
+
createdAt: string;
|
|
30
|
+
source?: string;
|
|
31
|
+
project?: string;
|
|
32
|
+
reasoning?: string;
|
|
33
|
+
memoryContext?: string;
|
|
34
|
+
examples?: string;
|
|
35
|
+
exceptions?: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Save a memory to memory raw folder
|
|
39
|
+
*/
|
|
40
|
+
export declare function saveToMarkdown(input: MarkdownMemoryInput): Promise<MarkdownMemoryFile>;
|
|
41
|
+
/**
|
|
42
|
+
* Get all memories from memory raw folder
|
|
43
|
+
*/
|
|
44
|
+
export declare function getMarkdownMemories(options?: {
|
|
45
|
+
since?: Date;
|
|
46
|
+
until?: Date;
|
|
47
|
+
tags?: string[];
|
|
48
|
+
type?: MemoryType;
|
|
49
|
+
project?: string;
|
|
50
|
+
}): Promise<MarkdownMemoryFile[]>;
|
|
51
|
+
/**
|
|
52
|
+
* Get a specific memory by ID
|
|
53
|
+
*/
|
|
54
|
+
export declare function getMarkdownMemory(id: string): Promise<MarkdownMemoryFile | null>;
|
|
55
|
+
/**
|
|
56
|
+
* Delete a memory from memory
|
|
57
|
+
*/
|
|
58
|
+
export declare function deleteMarkdownMemory(id: string): Promise<boolean>;
|
|
59
|
+
/**
|
|
60
|
+
* Get memory storage stats
|
|
61
|
+
*/
|
|
62
|
+
export declare function getMemoryStats(): Promise<{
|
|
63
|
+
totalMemories: number;
|
|
64
|
+
byType: Record<string, number>;
|
|
65
|
+
byTag: Record<string, number>;
|
|
66
|
+
storageSizeBytes: number;
|
|
67
|
+
}>;
|
|
68
|
+
/**
|
|
69
|
+
* Check if memory storage is available
|
|
70
|
+
*/
|
|
71
|
+
export declare function isMemoryStorageAvailable(): boolean;
|
|
72
|
+
//# sourceMappingURL=markdown-storage.d.ts.map
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Markdown Storage
|
|
3
|
+
*
|
|
4
|
+
* Stores memories as markdown files in .squish/memory/
|
|
5
|
+
* Following Karpathy LLM Memory pattern:
|
|
6
|
+
* - raw/ : Append-only memory files (never edit)
|
|
7
|
+
* - processed/ : LLM-generated articles (future)
|
|
8
|
+
* - outputs/ : Query responses (future)
|
|
9
|
+
*
|
|
10
|
+
* Each memory = one .md file with YAML frontmatter
|
|
11
|
+
*/
|
|
12
|
+
import { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync, unlinkSync } from 'fs';
|
|
13
|
+
import { join } from 'path';
|
|
14
|
+
import { randomUUID } from 'crypto';
|
|
15
|
+
import { logger } from '../../logger.js';
|
|
16
|
+
import { getDataDir } from '../../../config.js';
|
|
17
|
+
/**
|
|
18
|
+
* Get the memory base path (.squish/memory/)
|
|
19
|
+
*/
|
|
20
|
+
function getMemoryPath() {
|
|
21
|
+
return join(getDataDir(), 'memory');
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get the raw memories path (.squish/memory/raw/)
|
|
25
|
+
*/
|
|
26
|
+
function getRawPath() {
|
|
27
|
+
return join(getMemoryPath(), 'raw');
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Ensure memory directory structure exists
|
|
31
|
+
*/
|
|
32
|
+
function ensureMemoryStructure() {
|
|
33
|
+
const dirs = [getMemoryPath(), getRawPath()];
|
|
34
|
+
for (const dir of dirs) {
|
|
35
|
+
if (!existsSync(dir)) {
|
|
36
|
+
mkdirSync(dir, { recursive: true });
|
|
37
|
+
logger.info(`[MemoryStorage] Created directory: ${dir}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Format memory as markdown with YAML frontmatter
|
|
43
|
+
*/
|
|
44
|
+
function formatMemoryAsMarkdown(memory) {
|
|
45
|
+
const lines = [];
|
|
46
|
+
// YAML frontmatter
|
|
47
|
+
lines.push('---');
|
|
48
|
+
lines.push(`id: ${memory.id}`);
|
|
49
|
+
lines.push(`type: ${memory.type}`);
|
|
50
|
+
lines.push(`created: ${memory.createdAt}`);
|
|
51
|
+
if (memory.tags && memory.tags.length > 0) {
|
|
52
|
+
lines.push(`tags: [${memory.tags.join(', ')}]`);
|
|
53
|
+
}
|
|
54
|
+
if (memory.source) {
|
|
55
|
+
lines.push(`source: ${memory.source}`);
|
|
56
|
+
}
|
|
57
|
+
if (memory.project) {
|
|
58
|
+
lines.push(`project: ${memory.project}`);
|
|
59
|
+
}
|
|
60
|
+
if (memory.reasoning) {
|
|
61
|
+
lines.push(`reasoning: |`);
|
|
62
|
+
lines.push(memory.reasoning.split('\n').map(l => ` ${l}`).join('\n'));
|
|
63
|
+
}
|
|
64
|
+
if (memory.memoryContext) {
|
|
65
|
+
lines.push(`context: |`);
|
|
66
|
+
lines.push(memory.memoryContext.split('\n').map(l => ` ${l}`).join('\n'));
|
|
67
|
+
}
|
|
68
|
+
if (memory.examples) {
|
|
69
|
+
lines.push(`examples: |`);
|
|
70
|
+
lines.push(memory.examples.split('\n').map(l => ` ${l}`).join('\n'));
|
|
71
|
+
}
|
|
72
|
+
if (memory.exceptions) {
|
|
73
|
+
lines.push(`exceptions: |`);
|
|
74
|
+
lines.push(memory.exceptions.split('\n').map(l => ` ${l}`).join('\n'));
|
|
75
|
+
}
|
|
76
|
+
lines.push('---');
|
|
77
|
+
lines.push('');
|
|
78
|
+
lines.push(memory.content);
|
|
79
|
+
return lines.join('\n');
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Parse markdown file to MarkdownMemoryFile
|
|
83
|
+
*/
|
|
84
|
+
function parseMarkdownFile(filePath) {
|
|
85
|
+
try {
|
|
86
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
87
|
+
const match = content.match(/^---\n([\s\S]*?)\n---/);
|
|
88
|
+
if (!match)
|
|
89
|
+
return null;
|
|
90
|
+
const frontmatter = match[1];
|
|
91
|
+
const body = content.slice(match[0].length).trim();
|
|
92
|
+
const memory = { content: body };
|
|
93
|
+
// Parse frontmatter lines
|
|
94
|
+
const lines = frontmatter.split('\n');
|
|
95
|
+
for (const line of lines) {
|
|
96
|
+
const colonIdx = line.indexOf(':');
|
|
97
|
+
if (colonIdx === -1)
|
|
98
|
+
continue;
|
|
99
|
+
const key = line.slice(0, colonIdx).trim();
|
|
100
|
+
let value = line.slice(colonIdx + 1).trim();
|
|
101
|
+
// Handle array values like tags: [tag1, tag2]
|
|
102
|
+
if (value.startsWith('[') && value.endsWith(']')) {
|
|
103
|
+
value = value.slice(1, -1);
|
|
104
|
+
memory[key] = value.split(',').map((t) => t.trim());
|
|
105
|
+
}
|
|
106
|
+
else if (value === 'true' || value === 'false') {
|
|
107
|
+
memory[key] = value === 'true';
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
memory[key] = value;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return memory;
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
logger.warn(`[MemoryStorage] Failed to parse ${filePath}: ${error}`);
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Save a memory to memory raw folder
|
|
122
|
+
*/
|
|
123
|
+
export async function saveToMarkdown(input) {
|
|
124
|
+
ensureMemoryStructure();
|
|
125
|
+
const id = randomUUID();
|
|
126
|
+
const createdAt = new Date().toISOString();
|
|
127
|
+
const memory = {
|
|
128
|
+
id,
|
|
129
|
+
type: input.type || 'observation',
|
|
130
|
+
content: input.content,
|
|
131
|
+
tags: input.tags || [],
|
|
132
|
+
createdAt,
|
|
133
|
+
source: input.source,
|
|
134
|
+
project: input.project,
|
|
135
|
+
reasoning: input.reasoning,
|
|
136
|
+
memoryContext: input.memoryContext,
|
|
137
|
+
examples: input.examples,
|
|
138
|
+
exceptions: input.exceptions,
|
|
139
|
+
};
|
|
140
|
+
const filePath = join(getRawPath(), `${id}.md`);
|
|
141
|
+
writeFileSync(filePath, formatMemoryAsMarkdown(memory), 'utf-8');
|
|
142
|
+
logger.info(`[MemoryStorage] Saved memory to ${filePath}`);
|
|
143
|
+
return memory;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Get all memories from memory raw folder
|
|
147
|
+
*/
|
|
148
|
+
export async function getMarkdownMemories(options) {
|
|
149
|
+
ensureMemoryStructure();
|
|
150
|
+
const files = readdirSync(getRawPath()).filter(f => f.endsWith('.md'));
|
|
151
|
+
const memories = [];
|
|
152
|
+
for (const file of files) {
|
|
153
|
+
const filePath = join(getRawPath(), file);
|
|
154
|
+
const memory = parseMarkdownFile(filePath);
|
|
155
|
+
if (!memory)
|
|
156
|
+
continue;
|
|
157
|
+
const createdAt = new Date(memory.createdAt);
|
|
158
|
+
// Filter by date range
|
|
159
|
+
if (options?.since && createdAt < options.since)
|
|
160
|
+
continue;
|
|
161
|
+
if (options?.until && createdAt > options.until)
|
|
162
|
+
continue;
|
|
163
|
+
// Filter by tags
|
|
164
|
+
if (options?.tags && options.tags.length > 0) {
|
|
165
|
+
const hasTag = options.tags.some(t => memory.tags.includes(t));
|
|
166
|
+
if (!hasTag)
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
// Filter by type
|
|
170
|
+
if (options?.type && memory.type !== options.type)
|
|
171
|
+
continue;
|
|
172
|
+
// Filter by project
|
|
173
|
+
if (options?.project && memory.project !== options.project)
|
|
174
|
+
continue;
|
|
175
|
+
memories.push(memory);
|
|
176
|
+
}
|
|
177
|
+
// Sort by createdAt descending
|
|
178
|
+
memories.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
|
|
179
|
+
return memories;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Get a specific memory by ID
|
|
183
|
+
*/
|
|
184
|
+
export async function getMarkdownMemory(id) {
|
|
185
|
+
const filePath = join(getRawPath(), `${id}.md`);
|
|
186
|
+
if (!existsSync(filePath)) {
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
return parseMarkdownFile(filePath);
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Delete a memory from memory
|
|
193
|
+
*/
|
|
194
|
+
export async function deleteMarkdownMemory(id) {
|
|
195
|
+
const filePath = join(getRawPath(), `${id}.md`);
|
|
196
|
+
if (!existsSync(filePath)) {
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
unlinkSync(filePath);
|
|
200
|
+
logger.info(`[MemoryStorage] Deleted memory ${id}`);
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Get memory storage stats
|
|
205
|
+
*/
|
|
206
|
+
export async function getMemoryStats() {
|
|
207
|
+
ensureMemoryStructure();
|
|
208
|
+
const files = readdirSync(getRawPath()).filter(f => f.endsWith('.md'));
|
|
209
|
+
const byType = {};
|
|
210
|
+
const byTag = {};
|
|
211
|
+
let storageSizeBytes = 0;
|
|
212
|
+
for (const file of files) {
|
|
213
|
+
const filePath = join(getRawPath(), file);
|
|
214
|
+
const stats = await import('fs').then(fs => fs.statSync(filePath));
|
|
215
|
+
storageSizeBytes += stats.size;
|
|
216
|
+
const memory = parseMarkdownFile(filePath);
|
|
217
|
+
if (!memory)
|
|
218
|
+
continue;
|
|
219
|
+
byType[memory.type] = (byType[memory.type] || 0) + 1;
|
|
220
|
+
for (const tag of memory.tags) {
|
|
221
|
+
byTag[tag] = (byTag[tag] || 0) + 1;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return {
|
|
225
|
+
totalMemories: files.length,
|
|
226
|
+
byType,
|
|
227
|
+
byTag,
|
|
228
|
+
storageSizeBytes,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Check if memory storage is available
|
|
233
|
+
*/
|
|
234
|
+
export function isMemoryStorageAvailable() {
|
|
235
|
+
try {
|
|
236
|
+
ensureMemoryStructure();
|
|
237
|
+
return existsSync(getRawPath());
|
|
238
|
+
}
|
|
239
|
+
catch {
|
|
240
|
+
return false;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=markdown-storage.js.map
|