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,351 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Relationship Extractor
|
|
3
|
+
*
|
|
4
|
+
* Populates entity_relations table with typed relationships extracted
|
|
5
|
+
* from memory content.
|
|
6
|
+
*/
|
|
7
|
+
import { eq, and, or } from 'drizzle-orm';
|
|
8
|
+
import { getDb } from '../../db/index.js';
|
|
9
|
+
import { getSchema } from '../../db/schema.js';
|
|
10
|
+
import { logger } from '../logger.js';
|
|
11
|
+
import { extractEntitiesAndRelations, } from './llm-entity-extractor.js';
|
|
12
|
+
// Fallback relationship types for non-LLM extraction
|
|
13
|
+
const FALLBACK_RELATION_TYPES = {
|
|
14
|
+
CO_OCCURS: 'co_occurs_with',
|
|
15
|
+
SAME_SENTENCE: 'mentioned_together',
|
|
16
|
+
SEQUENTIAL: 'mentioned_before',
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Generate fallback relationships from entity co-occurrence when LLM is unavailable.
|
|
20
|
+
* Creates edges between entities that appear in the same memory or sentence.
|
|
21
|
+
*/
|
|
22
|
+
function generateCoOccurrenceRelations(entities, content) {
|
|
23
|
+
const relations = [];
|
|
24
|
+
if (entities.length < 2)
|
|
25
|
+
return relations;
|
|
26
|
+
// Split content into sentences
|
|
27
|
+
const sentences = content.split(/[.!?]+/).filter(s => s.trim().length > 0);
|
|
28
|
+
// For each pair of entities, determine relationship strength based on proximity
|
|
29
|
+
for (let i = 0; i < entities.length; i++) {
|
|
30
|
+
for (let j = i + 1; j < entities.length; j++) {
|
|
31
|
+
const e1 = entities[i];
|
|
32
|
+
const e2 = entities[j];
|
|
33
|
+
// Skip if same entity
|
|
34
|
+
if (e1.name.toLowerCase() === e2.name.toLowerCase())
|
|
35
|
+
continue;
|
|
36
|
+
// Check if they appear in the same sentence
|
|
37
|
+
const sameSentence = sentences.some(sentence => {
|
|
38
|
+
return sentence.toLowerCase().includes(e1.name.toLowerCase()) &&
|
|
39
|
+
sentence.toLowerCase().includes(e2.name.toLowerCase());
|
|
40
|
+
});
|
|
41
|
+
// Check if e1 appears before e2 in text
|
|
42
|
+
const e1Index = content.toLowerCase().indexOf(e1.name.toLowerCase());
|
|
43
|
+
const e2Index = content.toLowerCase().indexOf(e2.name.toLowerCase());
|
|
44
|
+
const sequential = e1Index >= 0 && e2Index >= 0 && e1Index < e2Index;
|
|
45
|
+
// Determine relation type and confidence
|
|
46
|
+
let relationType;
|
|
47
|
+
let confidence;
|
|
48
|
+
if (sameSentence) {
|
|
49
|
+
relationType = FALLBACK_RELATION_TYPES.SAME_SENTENCE;
|
|
50
|
+
confidence = 0.7;
|
|
51
|
+
}
|
|
52
|
+
else if (sequential) {
|
|
53
|
+
relationType = FALLBACK_RELATION_TYPES.SEQUENTIAL;
|
|
54
|
+
confidence = 0.5;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
relationType = FALLBACK_RELATION_TYPES.CO_OCCURS;
|
|
58
|
+
confidence = 0.3;
|
|
59
|
+
}
|
|
60
|
+
// Create bidirectional relationships
|
|
61
|
+
relations.push({
|
|
62
|
+
fromEntity: e1.name,
|
|
63
|
+
toEntity: e2.name,
|
|
64
|
+
relationType,
|
|
65
|
+
confidence,
|
|
66
|
+
context: `Co-occurrence in memory (${relationType})`,
|
|
67
|
+
});
|
|
68
|
+
relations.push({
|
|
69
|
+
fromEntity: e2.name,
|
|
70
|
+
toEntity: e1.name,
|
|
71
|
+
relationType,
|
|
72
|
+
confidence,
|
|
73
|
+
context: `Co-occurrence in memory (${relationType})`,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return relations;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Extract entities and relations from memory content and store them in the database.
|
|
81
|
+
* Returns the stored entities and relations.
|
|
82
|
+
*/
|
|
83
|
+
export async function extractAndStoreRelations(memoryId, content, projectId, options) {
|
|
84
|
+
// Step 1: Extract entities and relations from content
|
|
85
|
+
const extraction = await extractEntitiesAndRelations(content, options);
|
|
86
|
+
if (extraction.entities.length === 0 && extraction.relations.length === 0) {
|
|
87
|
+
return { entities: 0, relations: 0, source: extraction.source };
|
|
88
|
+
}
|
|
89
|
+
// Step 2: Store entities and get their IDs
|
|
90
|
+
const entityIdMap = await storeEntities(extraction.entities, projectId);
|
|
91
|
+
// Step 3: Generate fallback relationships if LLM didn't produce any
|
|
92
|
+
let relationsToStore = extraction.relations;
|
|
93
|
+
if (relationsToStore.length === 0 && extraction.entities.length >= 2) {
|
|
94
|
+
logger.debug('No relations extracted, generating co-occurrence fallback', {
|
|
95
|
+
entityCount: extraction.entities.length,
|
|
96
|
+
});
|
|
97
|
+
const fallbackRelations = generateCoOccurrenceRelations(extraction.entities, content);
|
|
98
|
+
relationsToStore = fallbackRelations;
|
|
99
|
+
}
|
|
100
|
+
// Step 4: Store relations between entities
|
|
101
|
+
const storedRelations = await storeRelations(relationsToStore, entityIdMap);
|
|
102
|
+
// Step 5: Link entities to the memory record
|
|
103
|
+
await linkEntitiesToMemory(memoryId, extraction.entities, projectId);
|
|
104
|
+
logger.info('Extracted and stored entities/relations', {
|
|
105
|
+
memoryId,
|
|
106
|
+
entityCount: entityIdMap.size,
|
|
107
|
+
relationCount: storedRelations,
|
|
108
|
+
source: extraction.source,
|
|
109
|
+
});
|
|
110
|
+
return {
|
|
111
|
+
entities: entityIdMap.size,
|
|
112
|
+
relations: storedRelations,
|
|
113
|
+
source: extraction.source === 'none' ? 'fallback' : extraction.source,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Store extracted entities in the database, returning a map of entity name -> ID.
|
|
118
|
+
* Deduplicates by name+type within the project.
|
|
119
|
+
*/
|
|
120
|
+
async function storeEntities(entities, projectId) {
|
|
121
|
+
const db = await getDb();
|
|
122
|
+
const schema = await getSchema();
|
|
123
|
+
const entityIdMap = new Map();
|
|
124
|
+
for (const entity of entities) {
|
|
125
|
+
try {
|
|
126
|
+
// Check if entity already exists (by name + type + project)
|
|
127
|
+
const existing = await db
|
|
128
|
+
.select()
|
|
129
|
+
.from(schema.entities)
|
|
130
|
+
.where(and(eq(schema.entities.projectId, projectId), eq(schema.entities.name, entity.name), eq(schema.entities.type, entity.type)))
|
|
131
|
+
.limit(1);
|
|
132
|
+
if (existing.length > 0) {
|
|
133
|
+
// Update mention count and last_mentioned_at
|
|
134
|
+
await db
|
|
135
|
+
.update(schema.entities)
|
|
136
|
+
.set({
|
|
137
|
+
mentionCount: (existing[0].mentionCount || 0) + 1,
|
|
138
|
+
lastMentionedAt: new Date(),
|
|
139
|
+
updatedAt: new Date(),
|
|
140
|
+
})
|
|
141
|
+
.where(eq(schema.entities.id, existing[0].id));
|
|
142
|
+
entityIdMap.set(entity.name, existing[0].id);
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
// Create new entity
|
|
146
|
+
const newEntity = {
|
|
147
|
+
name: entity.name,
|
|
148
|
+
type: entity.type,
|
|
149
|
+
projectId,
|
|
150
|
+
description: entity.context || null,
|
|
151
|
+
properties: {
|
|
152
|
+
confidence: entity.confidence,
|
|
153
|
+
normalized: entity.normalized,
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
const inserted = await db
|
|
157
|
+
.insert(schema.entities)
|
|
158
|
+
.values(newEntity)
|
|
159
|
+
.returning();
|
|
160
|
+
entityIdMap.set(entity.name, inserted[0].id);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
logger.debug('Error storing entity', { entity: entity.name, error: error });
|
|
165
|
+
// Continue with other entities
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return entityIdMap;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Store extracted relations in the entity_relations table.
|
|
172
|
+
* Deduplicates by from+to+type.
|
|
173
|
+
*/
|
|
174
|
+
async function storeRelations(relations, entityIdMap) {
|
|
175
|
+
const db = await getDb();
|
|
176
|
+
const schema = await getSchema();
|
|
177
|
+
let storedCount = 0;
|
|
178
|
+
for (const relation of relations) {
|
|
179
|
+
const fromId = entityIdMap.get(relation.fromEntity);
|
|
180
|
+
const toId = entityIdMap.get(relation.toEntity);
|
|
181
|
+
// Skip relations where we can't resolve both entities
|
|
182
|
+
if (!fromId || !toId) {
|
|
183
|
+
// Try to find entities by name even if not in our extraction
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
try {
|
|
187
|
+
// Check if relation already exists
|
|
188
|
+
const existing = await db
|
|
189
|
+
.select()
|
|
190
|
+
.from(schema.entityRelations)
|
|
191
|
+
.where(and(eq(schema.entityRelations.fromEntityId, fromId), eq(schema.entityRelations.toEntityId, toId), eq(schema.entityRelations.type, relation.relationType)))
|
|
192
|
+
.limit(1);
|
|
193
|
+
if (existing.length > 0) {
|
|
194
|
+
// Strengthen existing relation
|
|
195
|
+
await db
|
|
196
|
+
.update(schema.entityRelations)
|
|
197
|
+
.set({
|
|
198
|
+
weight: Math.min(10, (existing[0].weight || 1) + 1),
|
|
199
|
+
properties: {
|
|
200
|
+
...(existing[0].properties || {}),
|
|
201
|
+
confidence: relation.confidence,
|
|
202
|
+
context: relation.context,
|
|
203
|
+
lastSeen: new Date().toISOString(),
|
|
204
|
+
},
|
|
205
|
+
})
|
|
206
|
+
.where(eq(schema.entityRelations.id, existing[0].id));
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
// Create new relation
|
|
210
|
+
await db.insert(schema.entityRelations).values({
|
|
211
|
+
fromEntityId: fromId,
|
|
212
|
+
toEntityId: toId,
|
|
213
|
+
type: relation.relationType,
|
|
214
|
+
weight: Math.round(relation.confidence * 10),
|
|
215
|
+
properties: {
|
|
216
|
+
confidence: relation.confidence,
|
|
217
|
+
context: relation.context,
|
|
218
|
+
},
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
storedCount++;
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
logger.debug('Error storing relation', {
|
|
225
|
+
from: relation.fromEntity,
|
|
226
|
+
to: relation.toEntity,
|
|
227
|
+
error: error,
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return storedCount;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Link extracted entities to a memory record.
|
|
235
|
+
* Updates the memory's metadata with entity references.
|
|
236
|
+
*/
|
|
237
|
+
async function linkEntitiesToMemory(memoryId, entities, projectId) {
|
|
238
|
+
const db = await getDb();
|
|
239
|
+
const schema = await getSchema();
|
|
240
|
+
try {
|
|
241
|
+
// Get current memory metadata
|
|
242
|
+
const memories = await db
|
|
243
|
+
.select()
|
|
244
|
+
.from(schema.memories)
|
|
245
|
+
.where(eq(schema.memories.id, memoryId))
|
|
246
|
+
.limit(1);
|
|
247
|
+
if (memories.length === 0)
|
|
248
|
+
return;
|
|
249
|
+
const memory = memories[0];
|
|
250
|
+
const existingMetadata = memory.metadata || {};
|
|
251
|
+
// Add entity names to metadata
|
|
252
|
+
const entityNames = entities.map(e => e.name);
|
|
253
|
+
const existingEntities = Array.isArray(existingMetadata.entities) ? existingMetadata.entities : [];
|
|
254
|
+
const updatedMetadata = {
|
|
255
|
+
...existingMetadata,
|
|
256
|
+
entities: [...new Set([...existingEntities, ...entityNames])],
|
|
257
|
+
};
|
|
258
|
+
await db
|
|
259
|
+
.update(schema.memories)
|
|
260
|
+
.set({ metadata: updatedMetadata })
|
|
261
|
+
.where(eq(schema.memories.id, memoryId));
|
|
262
|
+
}
|
|
263
|
+
catch (error) {
|
|
264
|
+
logger.debug('Error linking entities to memory', { memoryId, error: error });
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Get all relations for a set of entity IDs.
|
|
269
|
+
* Used by graph traversal to find connected entities.
|
|
270
|
+
*/
|
|
271
|
+
export async function getEntityRelations(entityIds, relationTypes) {
|
|
272
|
+
const db = await getDb();
|
|
273
|
+
const schema = await getSchema();
|
|
274
|
+
const whereConditions = relationTypes
|
|
275
|
+
? and(or(...entityIds.map(id => eq(schema.entityRelations.fromEntityId, id))), or(...relationTypes.map(type => eq(schema.entityRelations.type, type))))
|
|
276
|
+
: or(...entityIds.map(id => eq(schema.entityRelations.fromEntityId, id)));
|
|
277
|
+
const relations = await db
|
|
278
|
+
.select()
|
|
279
|
+
.from(schema.entityRelations)
|
|
280
|
+
.where(whereConditions);
|
|
281
|
+
// Also get incoming relations
|
|
282
|
+
const incomingRelations = await db
|
|
283
|
+
.select()
|
|
284
|
+
.from(schema.entityRelations)
|
|
285
|
+
.where(or(...entityIds.map(id => eq(schema.entityRelations.toEntityId, id))));
|
|
286
|
+
// Combine and deduplicate
|
|
287
|
+
const allRelations = [...relations, ...incomingRelations];
|
|
288
|
+
const seen = new Set();
|
|
289
|
+
const unique = [];
|
|
290
|
+
for (const r of allRelations) {
|
|
291
|
+
if (!seen.has(r.id)) {
|
|
292
|
+
seen.add(r.id);
|
|
293
|
+
unique.push({
|
|
294
|
+
id: r.id,
|
|
295
|
+
fromEntityId: r.fromEntityId,
|
|
296
|
+
toEntityId: r.toEntityId,
|
|
297
|
+
fromEntityName: '', // Will be populated by caller if needed
|
|
298
|
+
toEntityName: '',
|
|
299
|
+
relationType: r.type,
|
|
300
|
+
weight: r.weight || 1,
|
|
301
|
+
properties: r.properties,
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
return unique;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Get all entities for a project.
|
|
309
|
+
*/
|
|
310
|
+
export async function getProjectEntities(projectId, limit = 100) {
|
|
311
|
+
const db = await getDb();
|
|
312
|
+
const schema = await getSchema();
|
|
313
|
+
const entities = await db
|
|
314
|
+
.select({
|
|
315
|
+
id: schema.entities.id,
|
|
316
|
+
name: schema.entities.name,
|
|
317
|
+
type: schema.entities.type,
|
|
318
|
+
description: schema.entities.description,
|
|
319
|
+
})
|
|
320
|
+
.from(schema.entities)
|
|
321
|
+
.where(eq(schema.entities.projectId, projectId))
|
|
322
|
+
.limit(limit);
|
|
323
|
+
return entities;
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Delete all entities and relations for a project (for graph rebuild).
|
|
327
|
+
*/
|
|
328
|
+
export async function clearProjectGraph(projectId) {
|
|
329
|
+
const db = await getDb();
|
|
330
|
+
const schema = await getSchema();
|
|
331
|
+
// Delete relations first (foreign key constraint)
|
|
332
|
+
const projectEntities = await db
|
|
333
|
+
.select({ id: schema.entities.id })
|
|
334
|
+
.from(schema.entities)
|
|
335
|
+
.where(eq(schema.entities.projectId, projectId));
|
|
336
|
+
const entityIds = projectEntities.map((e) => e.id);
|
|
337
|
+
if (entityIds.length > 0) {
|
|
338
|
+
// Delete relations involving these entities
|
|
339
|
+
for (const entityId of entityIds) {
|
|
340
|
+
await db
|
|
341
|
+
.delete(schema.entityRelations)
|
|
342
|
+
.where(or(eq(schema.entityRelations.fromEntityId, entityId), eq(schema.entityRelations.toEntityId, entityId)));
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
// Delete entities
|
|
346
|
+
await db
|
|
347
|
+
.delete(schema.entities)
|
|
348
|
+
.where(eq(schema.entities.projectId, projectId));
|
|
349
|
+
logger.info('Cleared project graph', { projectId, entityCount: entityIds.length });
|
|
350
|
+
}
|
|
351
|
+
//# sourceMappingURL=relationship-extractor.js.map
|
|
@@ -33,6 +33,15 @@ export declare function handleSessionStart(params: {
|
|
|
33
33
|
memories: string[];
|
|
34
34
|
sessionId: string;
|
|
35
35
|
count: number;
|
|
36
|
+
preferences?: Array<{
|
|
37
|
+
key: string;
|
|
38
|
+
value: string;
|
|
39
|
+
}>;
|
|
40
|
+
beliefs?: {
|
|
41
|
+
failures: string[];
|
|
42
|
+
constraints: string[];
|
|
43
|
+
decisions: string[];
|
|
44
|
+
};
|
|
36
45
|
}>;
|
|
37
46
|
/**
|
|
38
47
|
* Post-tool-use hook - record observations
|
|
@@ -49,7 +58,7 @@ export declare function handlePostToolUse(params: {
|
|
|
49
58
|
reason?: string;
|
|
50
59
|
}>;
|
|
51
60
|
/**
|
|
52
|
-
* Session end hook - save snapshot and sync
|
|
61
|
+
* Session end hook - save snapshot and sync to persistent hot cache
|
|
53
62
|
*/
|
|
54
63
|
export declare function handleSessionEnd(params: {
|
|
55
64
|
projectPath: string;
|