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
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Consolidation System
|
|
3
|
+
* Implements experience replay and memory consolidation
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { randomUUID } from 'crypto';
|
|
7
|
+
import { eq, inArray, and } from 'drizzle-orm';
|
|
8
|
+
import { createDatabaseClient } from '../storage/database.js';
|
|
9
|
+
import { getDb } from '../../db/index.js';
|
|
10
|
+
import { getSchema } from '../../db/schema.js';
|
|
11
|
+
import { getEmbedding } from '../../core/embeddings.js';
|
|
12
|
+
import { cosineSimilarity } from '../utils/vector-operations.js';
|
|
13
|
+
import { parseEmbedding } from '../lib/parse-embedding.js';
|
|
14
|
+
import { getLowImportanceMemories } from './importance.js';
|
|
15
|
+
import { rememberMemory } from './memories.js';
|
|
16
|
+
import { logger } from '../logger.js';
|
|
17
|
+
|
|
18
|
+
export interface ConsolidationOptions {
|
|
19
|
+
projectId: string;
|
|
20
|
+
minAge?: number; // days - minimum age for consolidation
|
|
21
|
+
maxImportance?: number; // 0-100 - maximum importance to consolidate
|
|
22
|
+
minClusterSize?: number; // minimum memories in a cluster to consolidate
|
|
23
|
+
similarityThreshold?: number; // 0-1 - minimum similarity to cluster
|
|
24
|
+
limit?: number; // max memories to process
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface ConsolidationResult {
|
|
28
|
+
consolidatedMemoryId: string;
|
|
29
|
+
sourceMemoryIds: string[];
|
|
30
|
+
clusterSize: number;
|
|
31
|
+
summary: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface ClusterResult {
|
|
35
|
+
memories: any[];
|
|
36
|
+
similarity: number;
|
|
37
|
+
representativeId: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Main consolidation function - consolidates low-importance old memories
|
|
42
|
+
*/
|
|
43
|
+
export async function consolidateMemories(
|
|
44
|
+
options: ConsolidationOptions
|
|
45
|
+
): Promise<ConsolidationResult[]> {
|
|
46
|
+
const {
|
|
47
|
+
projectId,
|
|
48
|
+
minAge = 90,
|
|
49
|
+
maxImportance = 30,
|
|
50
|
+
minClusterSize = 3,
|
|
51
|
+
similarityThreshold = 0.7,
|
|
52
|
+
limit = 100,
|
|
53
|
+
} = options;
|
|
54
|
+
|
|
55
|
+
// Get low-importance, old memories
|
|
56
|
+
const candidates = await getLowImportanceMemories(projectId, {
|
|
57
|
+
minAge,
|
|
58
|
+
maxImportance,
|
|
59
|
+
limit,
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
if (candidates.length < minClusterSize) {
|
|
63
|
+
logger.debug('Not enough memories to consolidate', {
|
|
64
|
+
count: candidates.length,
|
|
65
|
+
minClusterSize,
|
|
66
|
+
});
|
|
67
|
+
return [];
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Cluster memories by similarity
|
|
71
|
+
const clusters = await clusterMemoriesBySimilarity(candidates, {
|
|
72
|
+
minClusterSize,
|
|
73
|
+
similarityThreshold,
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
logger.info(`Found ${clusters.length} memory clusters for consolidation`);
|
|
77
|
+
|
|
78
|
+
const results: ConsolidationResult[] = [];
|
|
79
|
+
|
|
80
|
+
// Consolidate each cluster
|
|
81
|
+
for (const cluster of clusters) {
|
|
82
|
+
try {
|
|
83
|
+
const result = await consolidateCluster(cluster);
|
|
84
|
+
results.push(result);
|
|
85
|
+
} catch (error) {
|
|
86
|
+
logger.error('Failed to consolidate cluster', error);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return results;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Cluster memories by similarity using a simple greedy algorithm
|
|
95
|
+
*/
|
|
96
|
+
async function clusterMemoriesBySimilarity(
|
|
97
|
+
memories: any[],
|
|
98
|
+
options: {
|
|
99
|
+
minClusterSize?: number;
|
|
100
|
+
similarityThreshold?: number;
|
|
101
|
+
} = {}
|
|
102
|
+
): Promise<ClusterResult[]> {
|
|
103
|
+
const { minClusterSize = 3, similarityThreshold = 0.7 } = options;
|
|
104
|
+
|
|
105
|
+
const clustered = new Set<string>();
|
|
106
|
+
const clusters: ClusterResult[] = [];
|
|
107
|
+
|
|
108
|
+
for (const memory of memories) {
|
|
109
|
+
if (clustered.has(memory.id)) continue;
|
|
110
|
+
|
|
111
|
+
// Find similar memories
|
|
112
|
+
const similar: any[] = [memory];
|
|
113
|
+
const similarities: number[] = [1];
|
|
114
|
+
|
|
115
|
+
for (const other of memories) {
|
|
116
|
+
if (other.id === memory.id) continue;
|
|
117
|
+
if (clustered.has(other.id)) continue;
|
|
118
|
+
|
|
119
|
+
// Calculate similarity using embeddings
|
|
120
|
+
const sim = await calculateMemorySimilarity(memory, other);
|
|
121
|
+
if (sim >= similarityThreshold) {
|
|
122
|
+
similar.push(other);
|
|
123
|
+
similarities.push(sim);
|
|
124
|
+
clustered.add(other.id);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
clustered.add(memory.id);
|
|
129
|
+
|
|
130
|
+
// Only keep clusters that meet minimum size
|
|
131
|
+
if (similar.length >= minClusterSize) {
|
|
132
|
+
const avgSimilarity = similarities.reduce((a, b) => a + b, 0) / similarities.length;
|
|
133
|
+
clusters.push({
|
|
134
|
+
memories: similar as any,
|
|
135
|
+
similarity: avgSimilarity,
|
|
136
|
+
representativeId: memory.id,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return clusters;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Calculate similarity between two memories using their embeddings
|
|
146
|
+
*/
|
|
147
|
+
async function calculateMemorySimilarity(
|
|
148
|
+
memory1: any,
|
|
149
|
+
memory2: any
|
|
150
|
+
): Promise<number> {
|
|
151
|
+
let embedding1 = parseEmbedding(memory1.embedding) ?? parseEmbedding(memory1.embedding_json);
|
|
152
|
+
let embedding2 = parseEmbedding(memory2.embedding) ?? parseEmbedding(memory2.embedding_json);
|
|
153
|
+
|
|
154
|
+
if (!embedding1 || !embedding2) {
|
|
155
|
+
// Fallback to text similarity if embeddings not available
|
|
156
|
+
return textSimilarity(memory1.content, memory2.content);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return cosineSimilarity(embedding1, embedding2);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Simple text similarity as fallback (Jaccard similarity of word sets)
|
|
164
|
+
*/
|
|
165
|
+
function textSimilarity(text1: string, text2: string): number {
|
|
166
|
+
const words1 = new Set(text1.toLowerCase().split(/\s+/).filter(w => w.length > 2));
|
|
167
|
+
const words2 = new Set(text2.toLowerCase().split(/\s+/).filter(w => w.length > 2));
|
|
168
|
+
|
|
169
|
+
if (words1.size === 0 && words2.size === 0) return 1;
|
|
170
|
+
if (words1.size === 0 || words2.size === 0) return 0;
|
|
171
|
+
|
|
172
|
+
const intersection = new Set([...words1].filter(w => words2.has(w)));
|
|
173
|
+
const union = new Set([...words1, ...words2]);
|
|
174
|
+
|
|
175
|
+
return intersection.size / union.size;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Consolidate a cluster of memories into a single summary memory
|
|
180
|
+
*/
|
|
181
|
+
async function consolidateCluster(cluster: ClusterResult): Promise<ConsolidationResult> {
|
|
182
|
+
const { memories } = cluster;
|
|
183
|
+
const sourceMemoryIds = memories.map((m: any) => m.id);
|
|
184
|
+
|
|
185
|
+
// Generate extractive summary
|
|
186
|
+
const summary = generateExtractiveSummary(memories);
|
|
187
|
+
|
|
188
|
+
// Create consolidated memory
|
|
189
|
+
const consolidated = await rememberMemory({
|
|
190
|
+
content: summary,
|
|
191
|
+
type: 'context',
|
|
192
|
+
metadata: {
|
|
193
|
+
consolidatedFrom: sourceMemoryIds,
|
|
194
|
+
consolidatedAt: new Date().toISOString(),
|
|
195
|
+
clusterSize: memories.length,
|
|
196
|
+
avgSimilarity: cluster.similarity,
|
|
197
|
+
},
|
|
198
|
+
tags: ['consolidated'],
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
// Mark originals as consolidated
|
|
202
|
+
const db = createDatabaseClient(await getDb());
|
|
203
|
+
const schema = await getSchema();
|
|
204
|
+
|
|
205
|
+
await db
|
|
206
|
+
.update(schema.memories)
|
|
207
|
+
.set({
|
|
208
|
+
isConsolidated: 1,
|
|
209
|
+
consolidatedInto: consolidated.id,
|
|
210
|
+
consolidatedAt: new Date(),
|
|
211
|
+
})
|
|
212
|
+
.where(inArray(schema.memories.id, sourceMemoryIds));
|
|
213
|
+
|
|
214
|
+
logger.info('Consolidated memory cluster', {
|
|
215
|
+
consolidatedId: consolidated.id,
|
|
216
|
+
sourceCount: memories.length,
|
|
217
|
+
sourceIds: sourceMemoryIds,
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
return {
|
|
221
|
+
consolidatedMemoryId: consolidated.id,
|
|
222
|
+
sourceMemoryIds,
|
|
223
|
+
clusterSize: memories.length,
|
|
224
|
+
summary,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Generate extractive summary from a cluster of memories
|
|
230
|
+
* Uses text processing without requiring an LLM
|
|
231
|
+
*/
|
|
232
|
+
function generateExtractiveSummary(memories: any[]): string {
|
|
233
|
+
// Group by memory type
|
|
234
|
+
const byType = new Map<string, any[]>();
|
|
235
|
+
for (const m of memories) {
|
|
236
|
+
const type = m.type ?? 'observation';
|
|
237
|
+
if (!byType.has(type)) {
|
|
238
|
+
byType.set(type, []);
|
|
239
|
+
}
|
|
240
|
+
byType.get(type)!.push(m);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
const summaryParts: string[] = [];
|
|
244
|
+
|
|
245
|
+
// Add header with count
|
|
246
|
+
summaryParts.push(`Consolidated from ${memories.length} memories:`);
|
|
247
|
+
|
|
248
|
+
// Summarize each type
|
|
249
|
+
for (const [type, typeMemories] of byType.entries()) {
|
|
250
|
+
if (typeMemories.length === 1) {
|
|
251
|
+
summaryParts.push(`\n- ${type}: ${truncate(typeMemories[0].content, 100)}`);
|
|
252
|
+
} else {
|
|
253
|
+
summaryParts.push(`\n- ${type}s (${typeMemories.length}):`);
|
|
254
|
+
// Extract key phrases from each memory
|
|
255
|
+
for (const m of typeMemories.slice(0, 3)) {
|
|
256
|
+
summaryParts.push(` - ${truncate(m.content, 80)}`);
|
|
257
|
+
}
|
|
258
|
+
if (typeMemories.length > 3) {
|
|
259
|
+
summaryParts.push(` - ...and ${typeMemories.length - 3} more`);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
return summaryParts.join('\n');
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Truncate text to maximum length
|
|
269
|
+
*/
|
|
270
|
+
function truncate(text: string, maxLength: number): string {
|
|
271
|
+
if (text.length <= maxLength) return text;
|
|
272
|
+
return text.substring(0, maxLength - 3) + '...';
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Reverse consolidation - restore original memories
|
|
277
|
+
* This allows undoing consolidation if needed
|
|
278
|
+
*/
|
|
279
|
+
export async function reverseConsolidation(
|
|
280
|
+
consolidatedMemoryId: string
|
|
281
|
+
): Promise<void> {
|
|
282
|
+
const db = createDatabaseClient(await getDb());
|
|
283
|
+
const schema = await getSchema();
|
|
284
|
+
|
|
285
|
+
// Get the consolidated memory
|
|
286
|
+
const consolidated = await db
|
|
287
|
+
.select()
|
|
288
|
+
.from(schema.memories)
|
|
289
|
+
.where(eq(schema.memories.id, consolidatedMemoryId))
|
|
290
|
+
.limit(1);
|
|
291
|
+
|
|
292
|
+
if (consolidated.length === 0) {
|
|
293
|
+
throw new Error(`Consolidated memory not found: ${consolidatedMemoryId}`);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
const metadata = consolidated[0].metadata as any;
|
|
297
|
+
const sourceIds = metadata?.consolidatedFrom as string[] | undefined;
|
|
298
|
+
|
|
299
|
+
if (!sourceIds || sourceIds.length === 0) {
|
|
300
|
+
throw new Error('No source memories found in consolidated memory metadata');
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// Restore original memories
|
|
304
|
+
await db
|
|
305
|
+
.update(schema.memories)
|
|
306
|
+
.set({
|
|
307
|
+
isConsolidated: 0,
|
|
308
|
+
consolidatedInto: null,
|
|
309
|
+
consolidatedAt: null,
|
|
310
|
+
})
|
|
311
|
+
.where(inArray(schema.memories.id, sourceIds));
|
|
312
|
+
|
|
313
|
+
// Delete the consolidated memory
|
|
314
|
+
await db
|
|
315
|
+
.delete(schema.memories)
|
|
316
|
+
.where(eq(schema.memories.id, consolidatedMemoryId));
|
|
317
|
+
|
|
318
|
+
logger.info('Reversed consolidation', {
|
|
319
|
+
consolidatedId: consolidatedMemoryId,
|
|
320
|
+
restoredCount: sourceIds.length,
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* Get consolidation statistics for a project
|
|
326
|
+
*/
|
|
327
|
+
export async function getConsolidationStats(
|
|
328
|
+
projectId: string
|
|
329
|
+
): Promise<{
|
|
330
|
+
totalMemories: number;
|
|
331
|
+
consolidatedMemories: number;
|
|
332
|
+
consolidationsCreated: number;
|
|
333
|
+
avgClusterSize: number;
|
|
334
|
+
}> {
|
|
335
|
+
const db = createDatabaseClient(await getDb());
|
|
336
|
+
const schema = await getSchema();
|
|
337
|
+
|
|
338
|
+
// Get all memories for project
|
|
339
|
+
const memories = await db
|
|
340
|
+
.select()
|
|
341
|
+
.from(schema.memories)
|
|
342
|
+
.where(eq(schema.memories.projectId, projectId))
|
|
343
|
+
.all();
|
|
344
|
+
|
|
345
|
+
const totalMemories = memories.length;
|
|
346
|
+
const consolidatedMemories = memories.filter((m: any) => m.isConsolidated).length;
|
|
347
|
+
|
|
348
|
+
// Get consolidation summaries (memories created by consolidation)
|
|
349
|
+
const consolidations = memories.filter((m: any) => {
|
|
350
|
+
const metadata = m.metadata as any;
|
|
351
|
+
return metadata?.consolidatedFrom && Array.isArray(metadata.consolidatedFrom);
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
const consolidationsCreated = consolidations.length;
|
|
355
|
+
|
|
356
|
+
// Calculate average cluster size
|
|
357
|
+
let totalClusterSize = 0;
|
|
358
|
+
for (const m of consolidations) {
|
|
359
|
+
const metadata = m.metadata as any;
|
|
360
|
+
totalClusterSize += metadata?.clusterSize || 0;
|
|
361
|
+
}
|
|
362
|
+
const avgClusterSize = consolidationsCreated > 0
|
|
363
|
+
? totalClusterSize / consolidationsCreated
|
|
364
|
+
: 0;
|
|
365
|
+
|
|
366
|
+
return {
|
|
367
|
+
totalMemories,
|
|
368
|
+
consolidatedMemories,
|
|
369
|
+
consolidationsCreated,
|
|
370
|
+
avgClusterSize,
|
|
371
|
+
};
|
|
372
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/** Context Collector - Collect recent conversation context for query rewriting */
|
|
2
|
+
|
|
3
|
+
import { logger } from '../logger.js';
|
|
4
|
+
import { getDb } from '../../db/index.js';
|
|
5
|
+
import { messages, conversations } from '../../db/drizzle/schema-sqlite.js';
|
|
6
|
+
import { eq, desc } from 'drizzle-orm';
|
|
7
|
+
|
|
8
|
+
export interface ContextMessage {
|
|
9
|
+
role: 'user' | 'assistant';
|
|
10
|
+
content: string;
|
|
11
|
+
createdAt: Date;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export async function collectRecentContext(
|
|
15
|
+
sessionId: string,
|
|
16
|
+
count: number = 5
|
|
17
|
+
): Promise<ContextMessage[]> {
|
|
18
|
+
const db = await getDb();
|
|
19
|
+
if (!db) {
|
|
20
|
+
logger.warn('[ContextCollector] Database not available');
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
try {
|
|
25
|
+
const sqliteDb = db as any;
|
|
26
|
+
const [conversation] = await sqliteDb
|
|
27
|
+
.select()
|
|
28
|
+
.from(conversations)
|
|
29
|
+
.where(eq(conversations.sessionId, sessionId))
|
|
30
|
+
.orderBy(desc(conversations.startedAt))
|
|
31
|
+
.limit(1);
|
|
32
|
+
|
|
33
|
+
if (!conversation) {
|
|
34
|
+
logger.debug(`[ContextCollector] No conversation found for session ${sessionId}`);
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const recentMessages = await sqliteDb
|
|
39
|
+
.select()
|
|
40
|
+
.from(messages)
|
|
41
|
+
.where(eq(messages.conversationId, conversation.id))
|
|
42
|
+
.orderBy(desc(messages.createdAt))
|
|
43
|
+
.limit(count);
|
|
44
|
+
|
|
45
|
+
const ordered = recentMessages.reverse();
|
|
46
|
+
|
|
47
|
+
return ordered.map((msg: typeof messages.$inferSelect) => ({
|
|
48
|
+
role: msg.role as 'user' | 'assistant',
|
|
49
|
+
content: msg.content,
|
|
50
|
+
createdAt: new Date(msg.createdAt ?? Date.now()),
|
|
51
|
+
}));
|
|
52
|
+
} catch (error) {
|
|
53
|
+
logger.error('[ContextCollector] Failed to collect context:', error);
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function formatContextForLLM(messages: ContextMessage[]): string {
|
|
59
|
+
if (messages.length === 0) return '';
|
|
60
|
+
|
|
61
|
+
return messages
|
|
62
|
+
.map(msg => `${msg.role === 'user' ? 'User' : 'Assistant'}: ${msg.content}`)
|
|
63
|
+
.join('\n\n');
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export async function getLastUserMessages(
|
|
67
|
+
sessionId: string,
|
|
68
|
+
count: number = 3
|
|
69
|
+
): Promise<string[]> {
|
|
70
|
+
const context = await collectRecentContext(sessionId, count * 2);
|
|
71
|
+
return context
|
|
72
|
+
.filter(msg => msg.role === 'user')
|
|
73
|
+
.slice(-count)
|
|
74
|
+
.map(msg => msg.content);
|
|
75
|
+
}
|