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
|
@@ -1,305 +0,0 @@
|
|
|
1
|
-
/** Namespace Management - Hierarchical folder-like namespaces for memories */
|
|
2
|
-
import { randomUUID } from 'crypto';
|
|
3
|
-
import { eq, and, isNull } from 'drizzle-orm';
|
|
4
|
-
import { getDb } from '../../db/index.js';
|
|
5
|
-
import { getSchema } from '../../db/schema.js';
|
|
6
|
-
import { logger } from '../logger.js';
|
|
7
|
-
/**
|
|
8
|
-
* Create a new namespace
|
|
9
|
-
*/
|
|
10
|
-
export async function createNamespace(input) {
|
|
11
|
-
const db = await getDb();
|
|
12
|
-
if (!db) {
|
|
13
|
-
throw new Error('Database unavailable');
|
|
14
|
-
}
|
|
15
|
-
const schema = await getSchema();
|
|
16
|
-
const id = randomUUID();
|
|
17
|
-
// Check if namespace with same name exists under parent
|
|
18
|
-
const sqliteDb = db;
|
|
19
|
-
const existing = await sqliteDb.select()
|
|
20
|
-
.from(schema.namespaces)
|
|
21
|
-
.where(and(eq(schema.namespaces.projectId, input.projectId), eq(schema.namespaces.name, input.name), input.parentId
|
|
22
|
-
? eq(schema.namespaces.parentId, input.parentId)
|
|
23
|
-
: isNull(schema.namespaces.parentId)))
|
|
24
|
-
.limit(1);
|
|
25
|
-
if (existing.length > 0) {
|
|
26
|
-
throw new Error(`Namespace "${input.name}" already exists under ${input.parentId || 'root'}`);
|
|
27
|
-
}
|
|
28
|
-
// Build namespace path
|
|
29
|
-
const path = await buildNamespacePath(input.projectId, input.name, input.parentId ?? null);
|
|
30
|
-
await sqliteDb.insert(schema.namespaces).values({
|
|
31
|
-
id,
|
|
32
|
-
projectId: input.projectId,
|
|
33
|
-
name: input.name,
|
|
34
|
-
type: input.type,
|
|
35
|
-
parentId: input.parentId || null,
|
|
36
|
-
description: input.description || null,
|
|
37
|
-
createdAt: new Date(),
|
|
38
|
-
updatedAt: new Date(),
|
|
39
|
-
});
|
|
40
|
-
logger.info(`[Namespaces] Created namespace: ${path}`);
|
|
41
|
-
return {
|
|
42
|
-
id,
|
|
43
|
-
projectId: input.projectId,
|
|
44
|
-
name: input.name,
|
|
45
|
-
type: input.type,
|
|
46
|
-
parentId: input.parentId || null,
|
|
47
|
-
description: input.description || null,
|
|
48
|
-
path,
|
|
49
|
-
createdAt: new Date(),
|
|
50
|
-
updatedAt: new Date(),
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Build full namespace path from parent
|
|
55
|
-
*/
|
|
56
|
-
async function buildNamespacePath(projectId, name, parentId) {
|
|
57
|
-
if (!parentId) {
|
|
58
|
-
return name;
|
|
59
|
-
}
|
|
60
|
-
const db = await getDb();
|
|
61
|
-
const schema = await getSchema();
|
|
62
|
-
const sqliteDb = db;
|
|
63
|
-
const [parent] = await sqliteDb.select()
|
|
64
|
-
.from(schema.namespaces)
|
|
65
|
-
.where(eq(schema.namespaces.id, parentId))
|
|
66
|
-
.limit(1);
|
|
67
|
-
if (!parent) {
|
|
68
|
-
return name;
|
|
69
|
-
}
|
|
70
|
-
return `${parent.path}/${name}`;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Get a namespace by ID
|
|
74
|
-
*/
|
|
75
|
-
export async function getNamespaceById(id) {
|
|
76
|
-
const db = await getDb();
|
|
77
|
-
if (!db)
|
|
78
|
-
return null;
|
|
79
|
-
const schema = await getSchema();
|
|
80
|
-
const sqliteDb = db;
|
|
81
|
-
const [row] = await sqliteDb.select()
|
|
82
|
-
.from(schema.namespaces)
|
|
83
|
-
.where(eq(schema.namespaces.id, id))
|
|
84
|
-
.limit(1);
|
|
85
|
-
if (!row)
|
|
86
|
-
return null;
|
|
87
|
-
return {
|
|
88
|
-
id: row.id,
|
|
89
|
-
projectId: row.projectId,
|
|
90
|
-
name: row.name,
|
|
91
|
-
type: row.type,
|
|
92
|
-
parentId: row.parentId,
|
|
93
|
-
description: row.description,
|
|
94
|
-
path: row.path,
|
|
95
|
-
createdAt: new Date(row.createdAt),
|
|
96
|
-
updatedAt: new Date(row.updatedAt),
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Resolve a namespace path to a namespace ID
|
|
101
|
-
* @example resolveNamespacePath('my-project', ['user', 'preferences']) -> namespaceId
|
|
102
|
-
*/
|
|
103
|
-
export async function resolveNamespacePath(projectId, path) {
|
|
104
|
-
if (path.length === 0)
|
|
105
|
-
return null;
|
|
106
|
-
const db = await getDb();
|
|
107
|
-
if (!db)
|
|
108
|
-
return null;
|
|
109
|
-
const schema = await getSchema();
|
|
110
|
-
const sqliteDb = db;
|
|
111
|
-
let parentId = null;
|
|
112
|
-
let targetNamespace = null;
|
|
113
|
-
// Traverse path segments
|
|
114
|
-
for (const segment of path) {
|
|
115
|
-
const [result] = await sqliteDb.select()
|
|
116
|
-
.from(schema.namespaces)
|
|
117
|
-
.where(and(eq(schema.namespaces.projectId, projectId), eq(schema.namespaces.name, segment), parentId
|
|
118
|
-
? eq(schema.namespaces.parentId, parentId)
|
|
119
|
-
: isNull(schema.namespaces.parentId)))
|
|
120
|
-
.limit(1);
|
|
121
|
-
if (!result)
|
|
122
|
-
return null;
|
|
123
|
-
targetNamespace = result;
|
|
124
|
-
parentId = result.id;
|
|
125
|
-
}
|
|
126
|
-
return targetNamespace?.id || null;
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* Get namespace tree for a project
|
|
130
|
-
*/
|
|
131
|
-
export async function getNamespaceTree(projectId) {
|
|
132
|
-
const db = await getDb();
|
|
133
|
-
if (!db)
|
|
134
|
-
return [];
|
|
135
|
-
const schema = await getSchema();
|
|
136
|
-
const sqliteDb = db;
|
|
137
|
-
// Get all namespaces for project
|
|
138
|
-
const all = await sqliteDb.select()
|
|
139
|
-
.from(schema.namespaces)
|
|
140
|
-
.where(eq(schema.namespaces.projectId, projectId))
|
|
141
|
-
.orderBy(schema.namespaces.name);
|
|
142
|
-
// Build tree structure
|
|
143
|
-
const map = new Map();
|
|
144
|
-
const roots = [];
|
|
145
|
-
for (const row of all) {
|
|
146
|
-
const node = {
|
|
147
|
-
id: row.id,
|
|
148
|
-
name: row.name,
|
|
149
|
-
type: row.type,
|
|
150
|
-
description: row.description,
|
|
151
|
-
path: row.path,
|
|
152
|
-
children: [],
|
|
153
|
-
};
|
|
154
|
-
map.set(row.id, node);
|
|
155
|
-
if (!row.parentId) {
|
|
156
|
-
roots.push(node);
|
|
157
|
-
}
|
|
158
|
-
else {
|
|
159
|
-
const parent = map.get(row.parentId);
|
|
160
|
-
if (parent) {
|
|
161
|
-
parent.children.push(node);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
return roots;
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* Get or create default namespaces for a project
|
|
169
|
-
*/
|
|
170
|
-
export async function getDefaultNamespaces(projectId) {
|
|
171
|
-
const db = await getDb();
|
|
172
|
-
if (!db)
|
|
173
|
-
return [];
|
|
174
|
-
const schema = await getSchema();
|
|
175
|
-
const sqliteDb = db;
|
|
176
|
-
const created = [];
|
|
177
|
-
const defaults = [
|
|
178
|
-
{ name: 'user', type: 'user', description: 'User-specific memories and preferences' },
|
|
179
|
-
{ name: 'agent', type: 'agent', description: 'Agent-specific knowledge and state' },
|
|
180
|
-
{ name: 'project', type: 'project', description: 'Project-specific decisions and context' },
|
|
181
|
-
];
|
|
182
|
-
const defaultNames = ['user', 'agent', 'project'];
|
|
183
|
-
// Check all default namespaces at once with IN clause
|
|
184
|
-
const existing = await sqliteDb.select()
|
|
185
|
-
.from(schema.namespaces)
|
|
186
|
-
.where(and(eq(schema.namespaces.projectId, projectId), eq(schema.namespaces.name, defaultNames[0]), eq(schema.namespaces.type, 'user'), isNull(schema.namespaces.parentId)));
|
|
187
|
-
if (existing.length > 0) {
|
|
188
|
-
const ns = await createNamespace({
|
|
189
|
-
projectId,
|
|
190
|
-
name: defaultNames[0],
|
|
191
|
-
type: 'user',
|
|
192
|
-
parentId: null,
|
|
193
|
-
});
|
|
194
|
-
created.push({
|
|
195
|
-
id: ns.id,
|
|
196
|
-
projectId: ns.projectId,
|
|
197
|
-
name: ns.name,
|
|
198
|
-
type: ns.type,
|
|
199
|
-
parentId: ns.parentId,
|
|
200
|
-
description: ns.description,
|
|
201
|
-
path: ns.path,
|
|
202
|
-
createdAt: new Date(ns.createdAt),
|
|
203
|
-
updatedAt: new Date(ns.updatedAt),
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
// Check remaining defaults sequentially (agent and project)
|
|
207
|
-
for (const defName of defaultNames.slice(1)) {
|
|
208
|
-
const existing = await sqliteDb.select()
|
|
209
|
-
.from(schema.namespaces)
|
|
210
|
-
.where(and(eq(schema.namespaces.projectId, projectId), eq(schema.namespaces.name, defName), eq(schema.namespaces.type, defName), isNull(schema.namespaces.parentId)))
|
|
211
|
-
.limit(1);
|
|
212
|
-
if (existing.length === 0) {
|
|
213
|
-
const ns = await createNamespace({
|
|
214
|
-
projectId,
|
|
215
|
-
name: defName,
|
|
216
|
-
type: defName === 'agent' ? 'agent' : 'project',
|
|
217
|
-
parentId: null,
|
|
218
|
-
});
|
|
219
|
-
created.push(ns);
|
|
220
|
-
}
|
|
221
|
-
else {
|
|
222
|
-
created.push({
|
|
223
|
-
id: existing[0].id,
|
|
224
|
-
projectId: existing[0].projectId,
|
|
225
|
-
name: existing[0].name,
|
|
226
|
-
type: existing[0].type,
|
|
227
|
-
parentId: existing[0].parentId,
|
|
228
|
-
description: existing[0].description,
|
|
229
|
-
path: existing[0].path,
|
|
230
|
-
createdAt: new Date(existing[0].createdAt),
|
|
231
|
-
updatedAt: new Date(existing[0].updatedAt),
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
logger.info(`[Namespaces] Default namespaces ready for project: ${projectId}`);
|
|
236
|
-
return created;
|
|
237
|
-
}
|
|
238
|
-
/**
|
|
239
|
-
* List namespaces with optional filtering
|
|
240
|
-
*/
|
|
241
|
-
export async function listNamespaces(options = {}) {
|
|
242
|
-
const db = await getDb();
|
|
243
|
-
if (!db)
|
|
244
|
-
return [];
|
|
245
|
-
const schema = await getSchema();
|
|
246
|
-
const sqliteDb = db;
|
|
247
|
-
const conditions = [];
|
|
248
|
-
if (options.projectId) {
|
|
249
|
-
conditions.push(eq(schema.namespaces.projectId, options.projectId));
|
|
250
|
-
}
|
|
251
|
-
if (options.type) {
|
|
252
|
-
conditions.push(eq(schema.namespaces.type, options.type));
|
|
253
|
-
}
|
|
254
|
-
if (options.parentId !== undefined) {
|
|
255
|
-
if (options.parentId === null) {
|
|
256
|
-
conditions.push(isNull(schema.namespaces.parentId));
|
|
257
|
-
}
|
|
258
|
-
else {
|
|
259
|
-
conditions.push(eq(schema.namespaces.parentId, options.parentId));
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
const rows = await sqliteDb.select()
|
|
263
|
-
.from(schema.namespaces)
|
|
264
|
-
.where(conditions.length > 0 ? and(...conditions) : undefined)
|
|
265
|
-
.orderBy(schema.namespaces.name);
|
|
266
|
-
return rows.map((row) => ({
|
|
267
|
-
id: row.id,
|
|
268
|
-
projectId: row.projectId,
|
|
269
|
-
name: row.name,
|
|
270
|
-
type: row.type,
|
|
271
|
-
parentId: row.parentId,
|
|
272
|
-
description: row.description,
|
|
273
|
-
path: row.path,
|
|
274
|
-
createdAt: new Date(row.createdAt),
|
|
275
|
-
updatedAt: new Date(row.updatedAt),
|
|
276
|
-
}));
|
|
277
|
-
}
|
|
278
|
-
/**
|
|
279
|
-
* Delete a namespace (cascades to child namespaces)
|
|
280
|
-
*/
|
|
281
|
-
export async function deleteNamespace(id) {
|
|
282
|
-
const db = await getDb();
|
|
283
|
-
if (!db)
|
|
284
|
-
return;
|
|
285
|
-
const schema = await getSchema();
|
|
286
|
-
const sqliteDb = db;
|
|
287
|
-
await sqliteDb.delete(schema.namespaces).where(eq(schema.namespaces.id, id));
|
|
288
|
-
logger.info(`[Namespaces] Deleted namespace: ${id}`);
|
|
289
|
-
}
|
|
290
|
-
/**
|
|
291
|
-
* Update namespace
|
|
292
|
-
*/
|
|
293
|
-
export async function updateNamespace(id, updates) {
|
|
294
|
-
const db = await getDb();
|
|
295
|
-
if (!db)
|
|
296
|
-
return;
|
|
297
|
-
const schema = await getSchema();
|
|
298
|
-
const sqliteDb = db;
|
|
299
|
-
await sqliteDb.update(schema.namespaces).set({
|
|
300
|
-
...updates,
|
|
301
|
-
updatedAt: new Date(),
|
|
302
|
-
}).where(eq(schema.namespaces.id, id));
|
|
303
|
-
logger.info(`[Namespaces] Updated namespace: ${id}`);
|
|
304
|
-
}
|
|
305
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/** URI Parser for Squish namespace scheme (squish://) */
|
|
2
|
-
export interface SquishURIParsed {
|
|
3
|
-
type: 'namespace';
|
|
4
|
-
projectId: string;
|
|
5
|
-
namespacePath: string[];
|
|
6
|
-
memoryId?: string;
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* Parse a squish:// URI into components
|
|
10
|
-
* @example parseSquishURI('squish://my-project/user/preferences') -> { type: 'namespace', projectId: 'my-project', namespacePath: ['user', 'preferences'] }
|
|
11
|
-
*/
|
|
12
|
-
export declare function parseSquishURI(uri: string): SquishURIParsed | null;
|
|
13
|
-
/**
|
|
14
|
-
* Build a squish:// URI from components
|
|
15
|
-
* @example buildSquishURI('my-project', ['user', 'preferences']) -> 'squish://my-project/user/preferences'
|
|
16
|
-
*/
|
|
17
|
-
export declare function buildSquishURI(projectId: string, path: string[], memoryId?: string): string;
|
|
18
|
-
/**
|
|
19
|
-
* Validate a namespace path (no "..", no empty segments)
|
|
20
|
-
*/
|
|
21
|
-
export declare function validateNamespacePath(path: string[]): boolean;
|
|
22
|
-
/**
|
|
23
|
-
* Get parent namespace path
|
|
24
|
-
* @example getParentPath(['user', 'preferences', 'coding']) -> ['user', 'preferences']
|
|
25
|
-
*/
|
|
26
|
-
export declare function getParentPath(path: string[]): string[] | null;
|
|
27
|
-
/**
|
|
28
|
-
* Join namespace path segments
|
|
29
|
-
*/
|
|
30
|
-
export declare function joinNamespacePath(...segments: (string | string[])[]): string[];
|
|
31
|
-
//# sourceMappingURL=uri-parser.d.ts.map
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
/** URI Parser for Squish namespace scheme (squish://) */
|
|
2
|
-
/**
|
|
3
|
-
* Parse a squish:// URI into components
|
|
4
|
-
* @example parseSquishURI('squish://my-project/user/preferences') -> { type: 'namespace', projectId: 'my-project', namespacePath: ['user', 'preferences'] }
|
|
5
|
-
*/
|
|
6
|
-
export function parseSquishURI(uri) {
|
|
7
|
-
if (!uri || typeof uri !== 'string') {
|
|
8
|
-
return null;
|
|
9
|
-
}
|
|
10
|
-
// Match squish://project/path/to/memory
|
|
11
|
-
const match = uri.match(/^squish:\/\/([^\/]+)\/(.*)$/);
|
|
12
|
-
if (!match) {
|
|
13
|
-
return null;
|
|
14
|
-
}
|
|
15
|
-
const [, projectId, pathPart] = match;
|
|
16
|
-
const namespacePath = pathPart ? pathPart.split('/').filter(Boolean) : [];
|
|
17
|
-
// If path ends with a UUID, it's a memory ID
|
|
18
|
-
const lastSegment = namespacePath[namespacePath.length - 1];
|
|
19
|
-
let memoryId;
|
|
20
|
-
if (lastSegment && /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/.test(lastSegment)) {
|
|
21
|
-
memoryId = lastSegment;
|
|
22
|
-
namespacePath.pop();
|
|
23
|
-
}
|
|
24
|
-
return {
|
|
25
|
-
type: 'namespace',
|
|
26
|
-
projectId,
|
|
27
|
-
namespacePath,
|
|
28
|
-
memoryId,
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Build a squish:// URI from components
|
|
33
|
-
* @example buildSquishURI('my-project', ['user', 'preferences']) -> 'squish://my-project/user/preferences'
|
|
34
|
-
*/
|
|
35
|
-
export function buildSquishURI(projectId, path, memoryId) {
|
|
36
|
-
if (!projectId) {
|
|
37
|
-
throw new Error('Project ID is required');
|
|
38
|
-
}
|
|
39
|
-
const cleanPath = path.filter(Boolean);
|
|
40
|
-
const basePath = `squish://${projectId}${cleanPath.length > 0 ? '/' + cleanPath.join('/') : ''}`;
|
|
41
|
-
return memoryId ? `${basePath}/${memoryId}` : basePath;
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Validate a namespace path (no "..", no empty segments)
|
|
45
|
-
*/
|
|
46
|
-
export function validateNamespacePath(path) {
|
|
47
|
-
if (path.length === 0)
|
|
48
|
-
return true;
|
|
49
|
-
for (const segment of path) {
|
|
50
|
-
if (!segment || segment.length === 0) {
|
|
51
|
-
return false;
|
|
52
|
-
}
|
|
53
|
-
if (segment.includes('..')) {
|
|
54
|
-
return false;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
return true;
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Get parent namespace path
|
|
61
|
-
* @example getParentPath(['user', 'preferences', 'coding']) -> ['user', 'preferences']
|
|
62
|
-
*/
|
|
63
|
-
export function getParentPath(path) {
|
|
64
|
-
if (path.length <= 1)
|
|
65
|
-
return null;
|
|
66
|
-
return path.slice(0, -1);
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Join namespace path segments
|
|
70
|
-
*/
|
|
71
|
-
export function joinNamespacePath(...segments) {
|
|
72
|
-
return segments.flat().filter(Boolean);
|
|
73
|
-
}
|
|
74
|
-
//# sourceMappingURL=uri-parser.js.map
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* QMD Hybrid Search Integration
|
|
3
|
-
*
|
|
4
|
-
* Integrates QMD's BM25+vector+rerank pipeline with Squish memories.
|
|
5
|
-
* Provides enhanced search capabilities when QMD is available.
|
|
6
|
-
*
|
|
7
|
-
* QMD Search Pipeline:
|
|
8
|
-
* 1. Query Expansion (LLM generates alternative queries)
|
|
9
|
-
* 2. Parallel BM25 (FTS5) + Vector Search
|
|
10
|
-
* 3. RRF Fusion (Reciprocal Rank Fusion)
|
|
11
|
-
* 4. LLM Re-ranking (yes/no with logprobs)
|
|
12
|
-
* 5. Position-Aware Blending
|
|
13
|
-
*
|
|
14
|
-
* Installation: bun install -g qmd
|
|
15
|
-
* GitHub: https://github.com/tobi/qmd
|
|
16
|
-
*/
|
|
17
|
-
import type { SearchInput, SearchResult } from '../memory/memories.js';
|
|
18
|
-
export interface QMDSearchOptions extends SearchInput {
|
|
19
|
-
useHybrid?: boolean;
|
|
20
|
-
collection?: string;
|
|
21
|
-
includeSquishResults?: boolean;
|
|
22
|
-
}
|
|
23
|
-
export interface QMDHybridSearchResult extends SearchResult {
|
|
24
|
-
qmdScore?: number;
|
|
25
|
-
source: 'squish' | 'qmd' | 'hybrid';
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Search memories using QMD's hybrid search
|
|
29
|
-
*
|
|
30
|
-
* @param options - Search options including query, type, limit, etc.
|
|
31
|
-
* @returns QMD-enhanced search results
|
|
32
|
-
*/
|
|
33
|
-
export declare function searchWithQMD(options: QMDSearchOptions): Promise<QMDHybridSearchResult[]>;
|
|
34
|
-
/**
|
|
35
|
-
* Fused search: combine Squish and QMD results
|
|
36
|
-
*
|
|
37
|
-
* Runs both searches in parallel and merges results with deduplication.
|
|
38
|
-
*
|
|
39
|
-
* @param options - Search options
|
|
40
|
-
* @returns Fused search results from both sources
|
|
41
|
-
*/
|
|
42
|
-
export declare function fusedSearch(options: QMDSearchOptions): Promise<QMDHybridSearchResult[]>;
|
|
43
|
-
/**
|
|
44
|
-
* Check if QMD is available and configured
|
|
45
|
-
*
|
|
46
|
-
* @returns true if QMD is enabled and available
|
|
47
|
-
*/
|
|
48
|
-
export declare function isQMDAvailable(): Promise<boolean>;
|
|
49
|
-
/**
|
|
50
|
-
* Get QMD status and collection info
|
|
51
|
-
*
|
|
52
|
-
* @returns QMD status or null if unavailable
|
|
53
|
-
*/
|
|
54
|
-
export declare function getQMDStatus(): Promise<{
|
|
55
|
-
available: boolean;
|
|
56
|
-
collections: Array<{
|
|
57
|
-
name: string;
|
|
58
|
-
documentCount: number;
|
|
59
|
-
}>;
|
|
60
|
-
} | null>;
|
|
61
|
-
//# sourceMappingURL=qmd-search.d.ts.map
|
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* QMD Hybrid Search Integration
|
|
3
|
-
*
|
|
4
|
-
* Integrates QMD's BM25+vector+rerank pipeline with Squish memories.
|
|
5
|
-
* Provides enhanced search capabilities when QMD is available.
|
|
6
|
-
*
|
|
7
|
-
* QMD Search Pipeline:
|
|
8
|
-
* 1. Query Expansion (LLM generates alternative queries)
|
|
9
|
-
* 2. Parallel BM25 (FTS5) + Vector Search
|
|
10
|
-
* 3. RRF Fusion (Reciprocal Rank Fusion)
|
|
11
|
-
* 4. LLM Re-ranking (yes/no with logprobs)
|
|
12
|
-
* 5. Position-Aware Blending
|
|
13
|
-
*
|
|
14
|
-
* Installation: bun install -g qmd
|
|
15
|
-
* GitHub: https://github.com/tobi/qmd
|
|
16
|
-
*/
|
|
17
|
-
import { getQMDClient } from '../embeddings/qmd-client.js';
|
|
18
|
-
import { search } from '../memory/memories.js';
|
|
19
|
-
import { logger } from '../logger.js';
|
|
20
|
-
import { config } from '../../config.js';
|
|
21
|
-
/**
|
|
22
|
-
* Search memories using QMD's hybrid search
|
|
23
|
-
*
|
|
24
|
-
* @param options - Search options including query, type, limit, etc.
|
|
25
|
-
* @returns QMD-enhanced search results
|
|
26
|
-
*/
|
|
27
|
-
export async function searchWithQMD(options) {
|
|
28
|
-
const client = await getQMDClient();
|
|
29
|
-
if (!(await client.isAvailable())) {
|
|
30
|
-
logger.warn('QMD unavailable, falling back to Squish search');
|
|
31
|
-
// Fallback to Squish search
|
|
32
|
-
const squishResults = await search(options);
|
|
33
|
-
return squishResults.map((r) => ({
|
|
34
|
-
...r,
|
|
35
|
-
source: 'squish'
|
|
36
|
-
}));
|
|
37
|
-
}
|
|
38
|
-
// Determine collection based on memory type mapping
|
|
39
|
-
const collection = options.collection || getCollectionForType(options.type);
|
|
40
|
-
try {
|
|
41
|
-
let qmdResults = [];
|
|
42
|
-
if (options.useHybrid !== false) {
|
|
43
|
-
// Use qmd_query (hybrid with reranking) - best quality
|
|
44
|
-
qmdResults = await client.query({
|
|
45
|
-
query: options.query,
|
|
46
|
-
collection,
|
|
47
|
-
limit: options.limit || 10,
|
|
48
|
-
minScore: 0.2
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
// Use qmd_vsearch (semantic only) - faster
|
|
53
|
-
qmdResults = await client.vsearch({
|
|
54
|
-
query: options.query,
|
|
55
|
-
collection,
|
|
56
|
-
limit: options.limit || 10,
|
|
57
|
-
minScore: 0.2
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
// Map QMD results to Squish format
|
|
61
|
-
return qmdResults.map((result) => ({
|
|
62
|
-
id: result.docid || result.path,
|
|
63
|
-
content: result.snippet || result.title,
|
|
64
|
-
type: options.type || 'observation',
|
|
65
|
-
tags: [],
|
|
66
|
-
projectId: options.project ? options.project : null,
|
|
67
|
-
similarity: result.score,
|
|
68
|
-
qmdScore: result.score,
|
|
69
|
-
source: 'qmd',
|
|
70
|
-
createdAt: new Date().toISOString() // QMD doesn't provide timestamps
|
|
71
|
-
}));
|
|
72
|
-
}
|
|
73
|
-
catch (error) {
|
|
74
|
-
logger.error(`QMD search failed: ${error}`);
|
|
75
|
-
// Fallback to Squish search
|
|
76
|
-
const squishResults = await search(options);
|
|
77
|
-
return squishResults.map((r) => ({
|
|
78
|
-
...r,
|
|
79
|
-
source: 'squish'
|
|
80
|
-
}));
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Fused search: combine Squish and QMD results
|
|
85
|
-
*
|
|
86
|
-
* Runs both searches in parallel and merges results with deduplication.
|
|
87
|
-
*
|
|
88
|
-
* @param options - Search options
|
|
89
|
-
* @returns Fused search results from both sources
|
|
90
|
-
*/
|
|
91
|
-
export async function fusedSearch(options) {
|
|
92
|
-
const client = await getQMDClient();
|
|
93
|
-
const qmdAvailable = await client.isAvailable();
|
|
94
|
-
// Run searches in parallel
|
|
95
|
-
const results = await Promise.allSettled([
|
|
96
|
-
search(options),
|
|
97
|
-
qmdAvailable ? searchWithQMD({ ...options, includeSquishResults: false }) : []
|
|
98
|
-
]);
|
|
99
|
-
const squishResults = results[0].status === 'fulfilled'
|
|
100
|
-
? results[0].value.map((r) => ({ ...r, source: 'squish' }))
|
|
101
|
-
: [];
|
|
102
|
-
const qmdResults = results[1].status === 'fulfilled'
|
|
103
|
-
? results[1].value
|
|
104
|
-
: [];
|
|
105
|
-
// Deduplicate by content similarity
|
|
106
|
-
const seenContent = new Set();
|
|
107
|
-
const merged = [];
|
|
108
|
-
for (const result of [...squishResults, ...qmdResults]) {
|
|
109
|
-
// Create a content key for deduplication (first 100 chars)
|
|
110
|
-
const contentKey = result.content.substring(0, 100);
|
|
111
|
-
if (!seenContent.has(contentKey)) {
|
|
112
|
-
seenContent.add(contentKey);
|
|
113
|
-
merged.push(result);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
// Re-rank by combined score
|
|
117
|
-
merged.sort((a, b) => {
|
|
118
|
-
const scoreA = (a.similarity || 0) + (a.qmdScore || 0) / 2;
|
|
119
|
-
const scoreB = (b.similarity || 0) + (b.qmdScore || 0) / 2;
|
|
120
|
-
return scoreB - scoreA;
|
|
121
|
-
});
|
|
122
|
-
return merged.slice(0, options.limit || 10);
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Get QMD collection name for a memory type
|
|
126
|
-
*
|
|
127
|
-
* Uses the configured collection mapping from config.
|
|
128
|
-
*
|
|
129
|
-
* @param type - Memory type (observation, fact, decision, context, preference)
|
|
130
|
-
* @returns QMD collection name
|
|
131
|
-
*/
|
|
132
|
-
function getCollectionForType(type) {
|
|
133
|
-
if (!type) {
|
|
134
|
-
return 'squish-all';
|
|
135
|
-
}
|
|
136
|
-
const mapping = config.qmdCollectionMapping || {};
|
|
137
|
-
return mapping[type] || `squish-${type}`;
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* Check if QMD is available and configured
|
|
141
|
-
*
|
|
142
|
-
* @returns true if QMD is enabled and available
|
|
143
|
-
*/
|
|
144
|
-
export async function isQMDAvailable() {
|
|
145
|
-
if (!config.qmdEnabled) {
|
|
146
|
-
return false;
|
|
147
|
-
}
|
|
148
|
-
try {
|
|
149
|
-
const client = await getQMDClient();
|
|
150
|
-
return await client.isAvailable();
|
|
151
|
-
}
|
|
152
|
-
catch {
|
|
153
|
-
return false;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* Get QMD status and collection info
|
|
158
|
-
*
|
|
159
|
-
* @returns QMD status or null if unavailable
|
|
160
|
-
*/
|
|
161
|
-
export async function getQMDStatus() {
|
|
162
|
-
try {
|
|
163
|
-
const client = await getQMDClient();
|
|
164
|
-
const available = await client.isAvailable();
|
|
165
|
-
if (!available) {
|
|
166
|
-
return { available: false, collections: [] };
|
|
167
|
-
}
|
|
168
|
-
const status = await client.status();
|
|
169
|
-
return {
|
|
170
|
-
available: true,
|
|
171
|
-
collections: status?.collections || []
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
catch {
|
|
175
|
-
return null;
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
//# sourceMappingURL=qmd-search.js.map
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/** Self-Iteration Job - Auto-extract key facts from ended conversations
|
|
2
|
-
*
|
|
3
|
-
* Processes conversations to extract memories and generate summaries
|
|
4
|
-
*/
|
|
5
|
-
import { type JobHandler } from '../scheduler/cron-scheduler.js';
|
|
6
|
-
export interface SelfIterationConfig {
|
|
7
|
-
enabled: boolean;
|
|
8
|
-
extractFacts: boolean;
|
|
9
|
-
generateSummaries: boolean;
|
|
10
|
-
consolidateMemories: boolean;
|
|
11
|
-
minMessageCount: number;
|
|
12
|
-
maxMessagesToProcess: number;
|
|
13
|
-
}
|
|
14
|
-
declare const DEFAULT_CONFIG: SelfIterationConfig;
|
|
15
|
-
/**
|
|
16
|
-
* Register self-iteration job handler
|
|
17
|
-
*/
|
|
18
|
-
declare const selfIterationHandler: JobHandler;
|
|
19
|
-
export { selfIterationHandler, DEFAULT_CONFIG };
|
|
20
|
-
//# sourceMappingURL=self-iteration-job.d.ts.map
|