squish-memory 1.1.5 → 1.2.1
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 +44 -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/{dist/core/algorithms/index.js → core/algorithms/index.ts} +39 -26
- 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/{dist/core/lib/db-client.d.ts → core/lib/db-client.ts} +168 -114
- package/core/lib/parse-embedding.ts +59 -0
- package/{dist/core/lib/schemas.js → core/lib/schemas.ts} +102 -87
- 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/{dist/core/memory/index.js → core/memory/index.ts} +11 -10
- 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/{dist/core/places/index.js → core/places/index.ts} +12 -12
- 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 +590 -0
- package/core/scheduler/heartbeat.ts +91 -0
- package/{dist/core/scheduler/index.js → core/scheduler/index.ts} +8 -8
- 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/{dist/core/search/index.js → core/search/index.ts} +4 -5
- 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/{dist/core/session/index.js → core/session/index.ts} +7 -7
- 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/{dist/core/snapshots/cleanup.js → core/snapshots/cleanup.ts} +13 -12
- 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/{dist/core/summarization/cleanup.js → core/summarization/cleanup.ts} +13 -12
- 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/{dist/core/utils/vector-operations.js → core/utils/vector-operations.ts} +135 -129
- package/core/utils/version-management.ts +74 -0
- package/core/worker.ts +333 -0
- package/db/adapter.ts +215 -0
- package/{dist/db/bootstrap.js → db/bootstrap.ts} +388 -418
- 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/mcp.json.example +8 -11
- package/package.json +140 -159
- 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 +940 -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/config.d.ts +0 -83
- package/dist/config.js +0 -242
- package/dist/core/adapters/config/claude-code.d.ts +0 -45
- package/dist/core/adapters/config/claude-code.js +0 -113
- package/dist/core/adapters/config/cursor.d.ts +0 -26
- package/dist/core/adapters/config/cursor.js +0 -74
- package/dist/core/adapters/config/opencode.d.ts +0 -23
- package/dist/core/adapters/config/opencode.js +0 -73
- package/dist/core/adapters/config/windsurf.d.ts +0 -26
- package/dist/core/adapters/config/windsurf.js +0 -74
- package/dist/core/adapters/index.d.ts +0 -45
- package/dist/core/adapters/index.js +0 -84
- package/dist/core/adapters/scripts/install-adapter.d.ts +0 -19
- package/dist/core/adapters/scripts/install-adapter.js +0 -149
- package/dist/core/adapters/timeline.d.ts +0 -23
- package/dist/core/adapters/timeline.js +0 -88
- package/dist/core/adapters/types.d.ts +0 -157
- package/dist/core/adapters/types.js +0 -50
- package/dist/core/algorithms/analytics/token-estimator.d.ts +0 -50
- package/dist/core/algorithms/analytics/token-estimator.js +0 -154
- package/dist/core/algorithms/detection/hash-filters.d.ts +0 -47
- package/dist/core/algorithms/detection/hash-filters.js +0 -190
- package/dist/core/algorithms/detection/semantic-ranker.d.ts +0 -32
- package/dist/core/algorithms/detection/semantic-ranker.js +0 -118
- package/dist/core/algorithms/detection/two-stage-detector.d.ts +0 -52
- package/dist/core/algorithms/detection/two-stage-detector.js +0 -299
- package/dist/core/algorithms/handlers/approve-merge.d.ts +0 -22
- package/dist/core/algorithms/handlers/approve-merge.js +0 -179
- package/dist/core/algorithms/handlers/detect-duplicates.d.ts +0 -47
- package/dist/core/algorithms/handlers/detect-duplicates.js +0 -145
- package/dist/core/algorithms/handlers/get-stats.d.ts +0 -39
- package/dist/core/algorithms/handlers/get-stats.js +0 -88
- package/dist/core/algorithms/handlers/list-proposals.d.ts +0 -45
- package/dist/core/algorithms/handlers/list-proposals.js +0 -83
- package/dist/core/algorithms/handlers/preview-merge.d.ts +0 -39
- package/dist/core/algorithms/handlers/preview-merge.js +0 -93
- package/dist/core/algorithms/handlers/reject-merge.d.ts +0 -28
- package/dist/core/algorithms/handlers/reject-merge.js +0 -69
- package/dist/core/algorithms/handlers/reverse-merge.d.ts +0 -21
- package/dist/core/algorithms/handlers/reverse-merge.js +0 -121
- package/dist/core/algorithms/index.d.ts +0 -21
- package/dist/core/algorithms/operations/cache-maintenance.d.ts +0 -12
- package/dist/core/algorithms/operations/cache-maintenance.js +0 -157
- package/dist/core/algorithms/safety/safety-checks.d.ts +0 -22
- package/dist/core/algorithms/safety/safety-checks.js +0 -179
- package/dist/core/algorithms/strategies/merge-strategies.d.ts +0 -50
- package/dist/core/algorithms/strategies/merge-strategies.js +0 -288
- package/dist/core/algorithms/types.d.ts +0 -133
- package/dist/core/algorithms/types.js +0 -5
- package/dist/core/algorithms/utils/response-builder.d.ts +0 -28
- package/dist/core/algorithms/utils/response-builder.js +0 -37
- package/dist/core/associations.d.ts +0 -31
- package/dist/core/associations.js +0 -248
- package/dist/core/autosave.d.ts +0 -19
- package/dist/core/autosave.js +0 -16
- package/dist/core/commands/managed-sync.d.ts +0 -10
- package/dist/core/commands/managed-sync.js +0 -64
- package/dist/core/commands/mcp-server.d.ts +0 -3
- package/dist/core/commands/mcp-server.js +0 -739
- package/dist/core/consolidation.d.ts +0 -37
- package/dist/core/consolidation.js +0 -248
- package/dist/core/context/agent-context.d.ts +0 -106
- package/dist/core/context/agent-context.js +0 -274
- package/dist/core/context/context-paging.d.ts +0 -80
- package/dist/core/context/context-paging.js +0 -328
- package/dist/core/context/context-window.d.ts +0 -40
- package/dist/core/context/context-window.js +0 -177
- package/dist/core/context/context.d.ts +0 -7
- package/dist/core/context/context.js +0 -22
- package/dist/core/embeddings/google-multimodal.d.ts +0 -14
- package/dist/core/embeddings/google-multimodal.js +0 -142
- package/dist/core/embeddings/qmd-client.d.ts +0 -136
- package/dist/core/embeddings/qmd-client.js +0 -403
- package/dist/core/embeddings.d.ts +0 -29
- package/dist/core/embeddings.js +0 -454
- package/dist/core/error-handling.d.ts +0 -63
- package/dist/core/error-handling.js +0 -173
- package/dist/core/external-folder/index.d.ts +0 -102
- package/dist/core/external-folder/index.js +0 -294
- package/dist/core/hooks/agent-hooks.d.ts +0 -74
- package/dist/core/hooks/agent-hooks.js +0 -244
- package/dist/core/hooks/auto-tagger.d.ts +0 -19
- package/dist/core/hooks/auto-tagger.js +0 -155
- package/dist/core/hooks/capture-filter.d.ts +0 -41
- package/dist/core/hooks/capture-filter.js +0 -128
- package/dist/core/index.d.ts +0 -10
- package/dist/core/index.js +0 -14
- package/dist/core/ingestion/agent-memory.d.ts +0 -22
- package/dist/core/ingestion/agent-memory.js +0 -109
- package/dist/core/ingestion/core-memory.d.ts +0 -78
- package/dist/core/ingestion/core-memory.js +0 -226
- package/dist/core/ingestion/learnings.d.ts +0 -57
- package/dist/core/ingestion/learnings.js +0 -202
- package/dist/core/layers/generator.d.ts +0 -25
- package/dist/core/layers/generator.js +0 -76
- package/dist/core/lib/db-client.js +0 -130
- package/dist/core/lib/schemas.d.ts +0 -129
- package/dist/core/lib/utils.d.ts +0 -14
- package/dist/core/lib/utils.js +0 -90
- package/dist/core/lib/validation.d.ts +0 -38
- package/dist/core/lib/validation.js +0 -151
- package/dist/core/lifecycle.d.ts +0 -26
- package/dist/core/lifecycle.js +0 -302
- package/dist/core/local-embeddings.d.ts +0 -11
- package/dist/core/logger.d.ts +0 -16
- package/dist/core/logger.js +0 -40
- package/dist/core/mcp/client.d.ts +0 -17
- package/dist/core/mcp/client.js +0 -101
- package/dist/core/mcp/index.d.ts +0 -6
- package/dist/core/mcp/index.js +0 -6
- package/dist/core/mcp/server.d.ts +0 -18
- package/dist/core/mcp/server.js +0 -157
- package/dist/core/mcp/standalone-server.d.ts +0 -13
- package/dist/core/mcp/standalone-server.js +0 -46
- package/dist/core/mcp/tools.d.ts +0 -9
- package/dist/core/mcp/tools.js +0 -365
- package/dist/core/mcp/types.d.ts +0 -315
- package/dist/core/mcp/types.js +0 -48
- package/dist/core/memory/bridge-discovery.d.ts +0 -50
- package/dist/core/memory/bridge-discovery.js +0 -291
- package/dist/core/memory/categorizer.d.ts +0 -27
- package/dist/core/memory/categorizer.js +0 -305
- package/dist/core/memory/conflict-detector.d.ts +0 -7
- package/dist/core/memory/conflict-detector.js +0 -43
- package/dist/core/memory/consolidation.d.ts +0 -42
- package/dist/core/memory/consolidation.js +0 -303
- package/dist/core/memory/context-collector.d.ts +0 -10
- package/dist/core/memory/context-collector.js +0 -56
- package/dist/core/memory/contradiction-resolver.d.ts +0 -40
- package/dist/core/memory/contradiction-resolver.js +0 -368
- package/dist/core/memory/edit-workflow.d.ts +0 -19
- package/dist/core/memory/edit-workflow.js +0 -120
- package/dist/core/memory/entity-extractor.d.ts +0 -33
- package/dist/core/memory/entity-extractor.js +0 -336
- package/dist/core/memory/entity-resolver.d.ts +0 -23
- package/dist/core/memory/entity-resolver.js +0 -64
- package/dist/core/memory/fact-extractor.d.ts +0 -24
- package/dist/core/memory/fact-extractor.js +0 -89
- package/dist/core/memory/feedback-tracker.d.ts +0 -12
- package/dist/core/memory/feedback-tracker.js +0 -155
- package/dist/core/memory/hooks.d.ts +0 -88
- package/dist/core/memory/hooks.js +0 -174
- package/dist/core/memory/hybrid-retrieval.d.ts +0 -29
- package/dist/core/memory/hybrid-retrieval.js +0 -139
- package/dist/core/memory/hybrid-scorer.d.ts +0 -40
- package/dist/core/memory/hybrid-scorer.js +0 -284
- package/dist/core/memory/hybrid-search.d.ts +0 -20
- package/dist/core/memory/hybrid-search.js +0 -359
- package/dist/core/memory/importance.d.ts +0 -63
- package/dist/core/memory/importance.js +0 -298
- package/dist/core/memory/index.d.ts +0 -8
- package/dist/core/memory/loader.d.ts +0 -31
- package/dist/core/memory/loader.js +0 -141
- package/dist/core/memory/markdown/markdown-storage.d.ts +0 -72
- package/dist/core/memory/markdown/markdown-storage.js +0 -243
- package/dist/core/memory/memories.d.ts +0 -47
- package/dist/core/memory/memories.js +0 -449
- package/dist/core/memory/memory-lifecycle.d.ts +0 -8
- package/dist/core/memory/memory-lifecycle.js +0 -55
- package/dist/core/memory/memory-manager.d.ts +0 -15
- package/dist/core/memory/memory-manager.js +0 -46
- package/dist/core/memory/migrate.d.ts +0 -21
- package/dist/core/memory/migrate.js +0 -134
- package/dist/core/memory/normalization.d.ts +0 -22
- package/dist/core/memory/normalization.js +0 -26
- package/dist/core/memory/progressive-disclosure.d.ts +0 -43
- package/dist/core/memory/progressive-disclosure.js +0 -280
- package/dist/core/memory/query-processor.d.ts +0 -21
- package/dist/core/memory/query-processor.js +0 -72
- package/dist/core/memory/query-rewriter.d.ts +0 -13
- package/dist/core/memory/query-rewriter.js +0 -118
- package/dist/core/memory/response-analyzer.d.ts +0 -9
- package/dist/core/memory/response-analyzer.js +0 -61
- package/dist/core/memory/serialization.d.ts +0 -10
- package/dist/core/memory/serialization.js +0 -84
- package/dist/core/memory/stats.d.ts +0 -22
- package/dist/core/memory/stats.js +0 -138
- package/dist/core/memory/telemetry.d.ts +0 -69
- package/dist/core/memory/telemetry.js +0 -313
- package/dist/core/memory/temporal-facts.d.ts +0 -41
- package/dist/core/memory/temporal-facts.js +0 -283
- package/dist/core/memory/temporal-parser.d.ts +0 -32
- package/dist/core/memory/temporal-parser.js +0 -385
- package/dist/core/memory/trigger-detector.d.ts +0 -14
- package/dist/core/memory/trigger-detector.js +0 -42
- package/dist/core/memory/write-gate.d.ts +0 -54
- package/dist/core/memory/write-gate.js +0 -210
- 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/obsidian-vault.d.ts +0 -30
- package/dist/core/obsidian-vault.js +0 -94
- package/dist/core/places/index.d.ts +0 -14
- package/dist/core/places/memory-places.d.ts +0 -68
- package/dist/core/places/memory-places.js +0 -261
- package/dist/core/places/places.d.ts +0 -88
- package/dist/core/places/places.js +0 -314
- package/dist/core/places/rules.d.ts +0 -74
- package/dist/core/places/rules.js +0 -240
- package/dist/core/places/walking.d.ts +0 -56
- package/dist/core/places/walking.js +0 -121
- package/dist/core/projects.d.ts +0 -17
- package/dist/core/projects.js +0 -108
- package/dist/core/redis.d.ts +0 -11
- package/dist/core/redis.js +0 -69
- package/dist/core/responses.d.ts +0 -96
- package/dist/core/responses.js +0 -122
- package/dist/core/scheduler/cron-scheduler.d.ts +0 -32
- package/dist/core/scheduler/cron-scheduler.js +0 -332
- package/dist/core/scheduler/heartbeat.d.ts +0 -11
- package/dist/core/scheduler/heartbeat.js +0 -73
- package/dist/core/scheduler/index.d.ts +0 -8
- package/dist/core/scheduler/job-runner.d.ts +0 -11
- package/dist/core/scheduler/job-runner.js +0 -164
- package/dist/core/search/conversations.d.ts +0 -25
- package/dist/core/search/conversations.js +0 -110
- package/dist/core/search/entities.d.ts +0 -12
- package/dist/core/search/entities.js +0 -31
- package/dist/core/search/folder-context.d.ts +0 -25
- package/dist/core/search/folder-context.js +0 -119
- package/dist/core/search/graph-boost.d.ts +0 -7
- package/dist/core/search/graph-boost.js +0 -23
- package/dist/core/search/index.d.ts +0 -4
- package/dist/core/search/qmd-search.d.ts +0 -61
- package/dist/core/search/qmd-search.js +0 -178
- package/dist/core/security/encrypt.d.ts +0 -6
- package/dist/core/security/encrypt.js +0 -47
- package/dist/core/security/governance.d.ts +0 -26
- package/dist/core/security/governance.js +0 -79
- package/dist/core/security/privacy.d.ts +0 -23
- package/dist/core/security/privacy.js +0 -82
- package/dist/core/security/secret-detector.d.ts +0 -32
- package/dist/core/security/secret-detector.js +0 -88
- package/dist/core/session/auto-load.d.ts +0 -6
- package/dist/core/session/auto-load.js +0 -119
- package/dist/core/session/index.d.ts +0 -7
- package/dist/core/session/self-iteration-job.d.ts +0 -20
- package/dist/core/session/self-iteration-job.js +0 -282
- package/dist/core/session/session-hooks.d.ts +0 -18
- package/dist/core/session/session-hooks.js +0 -58
- package/dist/core/session/types.d.ts +0 -26
- package/dist/core/session/types.js +0 -10
- 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/cleanup.d.ts +0 -9
- package/dist/core/snapshots/comparison.d.ts +0 -19
- package/dist/core/snapshots/comparison.js +0 -43
- package/dist/core/snapshots/creation.d.ts +0 -19
- package/dist/core/snapshots/creation.js +0 -126
- package/dist/core/snapshots/retrieval.d.ts +0 -7
- package/dist/core/snapshots/retrieval.js +0 -41
- package/dist/core/snapshots/stats.d.ts +0 -11
- package/dist/core/snapshots/stats.js +0 -52
- package/dist/core/snapshots.d.ts +0 -29
- package/dist/core/snapshots.js +0 -220
- package/dist/core/storage/cache.d.ts +0 -13
- package/dist/core/storage/cache.js +0 -202
- package/dist/core/storage/database.d.ts +0 -12
- package/dist/core/storage/database.js +0 -12
- package/dist/core/summarization/cleanup.d.ts +0 -9
- package/dist/core/summarization/queries.d.ts +0 -9
- package/dist/core/summarization/queries.js +0 -28
- package/dist/core/summarization/stats.d.ts +0 -14
- package/dist/core/summarization/stats.js +0 -52
- package/dist/core/summarization/strategies.d.ts +0 -24
- package/dist/core/summarization/strategies.js +0 -28
- package/dist/core/summarization.d.ts +0 -37
- package/dist/core/summarization.js +0 -188
- package/dist/core/sync/qmd-sync.d.ts +0 -94
- package/dist/core/sync/qmd-sync.js +0 -201
- package/dist/core/temporal-facts.d.ts +0 -54
- package/dist/core/temporal-facts.js +0 -193
- package/dist/core/toon.d.ts +0 -43
- package/dist/core/toon.js +0 -160
- package/dist/core/tracing/collector.d.ts +0 -111
- package/dist/core/tracing/collector.js +0 -350
- package/dist/core/tracing/visualizer.d.ts +0 -32
- package/dist/core/tracing/visualizer.js +0 -165
- package/dist/core/utils/cleanup-operations.d.ts +0 -13
- package/dist/core/utils/cleanup-operations.js +0 -44
- package/dist/core/utils/content-extraction.d.ts +0 -19
- package/dist/core/utils/content-extraction.js +0 -75
- package/dist/core/utils/filter-builder.d.ts +0 -13
- package/dist/core/utils/filter-builder.js +0 -44
- package/dist/core/utils/history-traversal.d.ts +0 -13
- package/dist/core/utils/history-traversal.js +0 -50
- package/dist/core/utils/memory-operations.d.ts +0 -17
- package/dist/core/utils/memory-operations.js +0 -43
- package/dist/core/utils/query-operations.d.ts +0 -18
- package/dist/core/utils/query-operations.js +0 -65
- package/dist/core/utils/summarization-helpers.d.ts +0 -21
- package/dist/core/utils/summarization-helpers.js +0 -38
- package/dist/core/utils/temporal-queries.d.ts +0 -13
- package/dist/core/utils/temporal-queries.js +0 -27
- package/dist/core/utils/vector-operations.d.ts +0 -71
- package/dist/core/utils/version-management.d.ts +0 -9
- package/dist/core/utils/version-management.js +0 -61
- package/dist/core/worker.d.ts +0 -82
- package/dist/core/worker.js +0 -272
- package/dist/db/adapter.d.ts +0 -7
- package/dist/db/adapter.js +0 -175
- package/dist/db/bootstrap.d.ts +0 -9
- package/dist/db/drizzle/schema-sqlite.d.ts +0 -4837
- package/dist/db/drizzle/schema-sqlite.js +0 -684
- package/dist/db/drizzle/schema.d.ts +0 -4082
- package/dist/db/drizzle/schema.js +0 -770
- package/dist/db/drizzle.config.d.ts +0 -3
- package/dist/db/drizzle.config.js +0 -12
- package/dist/db/index.d.ts +0 -7
- package/dist/db/index.js +0 -89
- package/dist/db/neon.d.ts +0 -8
- package/dist/db/neon.js +0 -20
- package/dist/db/schema/index.d.ts +0 -40
- package/dist/db/schema/index.js +0 -105
- package/dist/db/schema/tables/context-sessions.d.ts +0 -9
- package/dist/db/schema/tables/context-sessions.js +0 -37
- package/dist/db/schema/tables/conversations.d.ts +0 -9
- package/dist/db/schema/tables/conversations.js +0 -47
- package/dist/db/schema/tables/core-memory.d.ts +0 -9
- package/dist/db/schema/tables/core-memory.js +0 -41
- package/dist/db/schema/tables/entities.d.ts +0 -9
- package/dist/db/schema/tables/entities.js +0 -39
- package/dist/db/schema/tables/entity-relations.d.ts +0 -9
- package/dist/db/schema/tables/entity-relations.js +0 -31
- package/dist/db/schema/tables/learnings.d.ts +0 -9
- package/dist/db/schema/tables/learnings.js +0 -66
- package/dist/db/schema/tables/memories.d.ts +0 -9
- package/dist/db/schema/tables/memories.js +0 -161
- package/dist/db/schema/tables/memory-associations.d.ts +0 -9
- package/dist/db/schema/tables/memory-associations.js +0 -39
- package/dist/db/schema/tables/memory-hash-cache.d.ts +0 -9
- package/dist/db/schema/tables/memory-hash-cache.js +0 -29
- package/dist/db/schema/tables/memory-merge-history.d.ts +0 -9
- package/dist/db/schema/tables/memory-merge-history.js +0 -33
- package/dist/db/schema/tables/memory-merge-proposals.d.ts +0 -9
- package/dist/db/schema/tables/memory-merge-proposals.js +0 -39
- package/dist/db/schema/tables/messages.d.ts +0 -9
- package/dist/db/schema/tables/messages.js +0 -41
- package/dist/db/schema/tables/namespaces.d.ts +0 -9
- package/dist/db/schema/tables/namespaces.js +0 -37
- package/dist/db/schema/tables/projects.d.ts +0 -9
- package/dist/db/schema/tables/projects.js +0 -31
- package/dist/db/schema/tables/users.d.ts +0 -9
- package/dist/db/schema/tables/users.js +0 -27
- package/dist/db/schema.d.ts +0 -3
- package/dist/db/schema.js +0 -11
- package/dist/db/supabase.d.ts +0 -9
- package/dist/db/supabase.js +0 -24
- 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,284 +0,0 @@
|
|
|
1
|
-
/** Hybrid Scorer - Multi-factor relevance scoring for memory ranking */
|
|
2
|
-
import { logger } from '../../core/logger.js';
|
|
3
|
-
export async function hybridScore(queryEmbedding, memories, options = {}) {
|
|
4
|
-
const weights = {
|
|
5
|
-
semantic: options.weights?.semantic ?? 0.30,
|
|
6
|
-
recency: options.weights?.recency ?? 0.20,
|
|
7
|
-
coactivation: options.weights?.coactivation ?? 0.10,
|
|
8
|
-
importance: options.weights?.importance ?? 0.15,
|
|
9
|
-
confidence: options.weights?.confidence ?? 0.15,
|
|
10
|
-
feedback: options.weights?.feedback ?? 0.10,
|
|
11
|
-
};
|
|
12
|
-
const decayDays = options.decayDays ?? 30;
|
|
13
|
-
const minSemanticScore = options.minSemanticScore ?? 0.0;
|
|
14
|
-
const scored = [];
|
|
15
|
-
const now = new Date();
|
|
16
|
-
for (const memory of memories) {
|
|
17
|
-
if (queryEmbedding && weights.semantic > 0) {
|
|
18
|
-
const semanticScore = calculateSemanticScore(queryEmbedding, memory);
|
|
19
|
-
if (semanticScore < minSemanticScore)
|
|
20
|
-
continue;
|
|
21
|
-
}
|
|
22
|
-
const components = {
|
|
23
|
-
semantic: queryEmbedding ? calculateSemanticScore(queryEmbedding, memory) : 50,
|
|
24
|
-
recency: calculateRecencyScore(memory, now, decayDays),
|
|
25
|
-
coactivation: calculateCoactivationScore(memory),
|
|
26
|
-
importance: calculateImportanceScore(memory),
|
|
27
|
-
confidence: calculateConfidenceScore(memory),
|
|
28
|
-
feedback: calculateFeedbackScore(memory),
|
|
29
|
-
};
|
|
30
|
-
const totalScore = Math.min(100, components.semantic * weights.semantic +
|
|
31
|
-
components.recency * weights.recency +
|
|
32
|
-
components.coactivation * weights.coactivation +
|
|
33
|
-
components.importance * weights.importance +
|
|
34
|
-
components.confidence * weights.confidence +
|
|
35
|
-
components.feedback * weights.feedback);
|
|
36
|
-
scored.push({
|
|
37
|
-
memoryId: memory.id,
|
|
38
|
-
memory,
|
|
39
|
-
totalScore: Math.round(totalScore * 100) / 100,
|
|
40
|
-
components: {
|
|
41
|
-
semantic: Math.round(components.semantic * 100) / 100,
|
|
42
|
-
recency: Math.round(components.recency * 100) / 100,
|
|
43
|
-
coactivation: Math.round(components.coactivation * 100) / 100,
|
|
44
|
-
importance: Math.round(components.importance * 100) / 100,
|
|
45
|
-
confidence: Math.round(components.confidence * 100) / 100,
|
|
46
|
-
feedback: Math.round(components.feedback * 100) / 100,
|
|
47
|
-
},
|
|
48
|
-
rank: 0,
|
|
49
|
-
explanation: options.includeExplanation
|
|
50
|
-
? generateScoreExplanation(components, weights, memory)
|
|
51
|
-
: '',
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
scored.sort((a, b) => b.totalScore - a.totalScore);
|
|
55
|
-
for (let i = 0; i < scored.length; i++) {
|
|
56
|
-
scored[i].rank = i + 1;
|
|
57
|
-
}
|
|
58
|
-
return scored;
|
|
59
|
-
}
|
|
60
|
-
function calculateSemanticScore(queryEmbedding, memory) {
|
|
61
|
-
if (!memory.embedding || queryEmbedding.length === 0)
|
|
62
|
-
return 50;
|
|
63
|
-
try {
|
|
64
|
-
let memoryEmbedding = null;
|
|
65
|
-
if (Array.isArray(memory.embedding)) {
|
|
66
|
-
memoryEmbedding = memory.embedding;
|
|
67
|
-
}
|
|
68
|
-
else if (typeof memory.embedding === 'string') {
|
|
69
|
-
memoryEmbedding = JSON.parse(memory.embedding);
|
|
70
|
-
}
|
|
71
|
-
if (!memoryEmbedding || memoryEmbedding.length === 0)
|
|
72
|
-
return 50;
|
|
73
|
-
const cosineSimilarity = calculateCosineSimilarity(queryEmbedding, memoryEmbedding);
|
|
74
|
-
return Math.max(0, Math.min(100, (cosineSimilarity + 1) * 50));
|
|
75
|
-
}
|
|
76
|
-
catch (error) {
|
|
77
|
-
logger.error('Error calculating semantic score', error);
|
|
78
|
-
return 50;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
function calculateRecencyScore(memory, now, decayDays) {
|
|
82
|
-
// Enhanced bi-temporal recency scoring: considers validity period and learning time
|
|
83
|
-
const validFromDate = memory.validFrom ? new Date(memory.validFrom) : null;
|
|
84
|
-
const validToDate = memory.validTo ? new Date(memory.validTo) : null;
|
|
85
|
-
const recordedAtDate = memory.recordedAt ? new Date(memory.recordedAt) : null;
|
|
86
|
-
const createdDate = memory.createdAt ? new Date(memory.createdAt) : null;
|
|
87
|
-
// Calculate score based on how relevant the memory is right now
|
|
88
|
-
let score = 50; // Default neutral score
|
|
89
|
-
// If we have a validity period, score based on current time's position within that period
|
|
90
|
-
if (validFromDate && validToDate) {
|
|
91
|
-
const timeInPeriod = now.getTime() - validFromDate.getTime();
|
|
92
|
-
const periodLength = validToDate.getTime() - validFromDate.getTime();
|
|
93
|
-
if (periodLength > 0) {
|
|
94
|
-
// If now is within the validity period, high score
|
|
95
|
-
if (now >= validFromDate && now <= validToDate) {
|
|
96
|
-
// Full score if right in middle, decreasing toward edges
|
|
97
|
-
const progress = timeInPeriod / periodLength;
|
|
98
|
-
const distanceFromCenter = Math.abs(0.5 - progress) * 2; // 0 at center, 1 at edges
|
|
99
|
-
score = 100 * (1 - distanceFromCenter * 0.8); // 100 at center, 40 at edges
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
// Outside validity period - score based on how recently it expired or how far in future
|
|
103
|
-
if (now < validFromDate) {
|
|
104
|
-
// Future validity - score based on how soon it becomes valid
|
|
105
|
-
const daysUntilValid = (validFromDate.getTime() - now.getTime()) / (24 * 60 * 60 * 1000);
|
|
106
|
-
score = Math.max(20, 100 - Math.min(80, daysUntilValid / decayDays * 100));
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
// Past validity - score based on how recently it expired
|
|
110
|
-
const daysSinceExpired = (now.getTime() - validToDate.getTime()) / (24 * 60 * 60 * 1000);
|
|
111
|
-
score = Math.max(10, 60 - Math.min(50, daysSinceExpired / decayDays * 100));
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
// If we only have validFrom (open-ended validity)
|
|
117
|
-
else if (validFromDate) {
|
|
118
|
-
const daysSinceValid = (now.getTime() - validFromDate.getTime()) / (24 * 60 * 60 * 1000);
|
|
119
|
-
if (now >= validFromDate) {
|
|
120
|
-
// Still valid - decay from full score over time
|
|
121
|
-
score = Math.max(30, 100 - Math.min(70, daysSinceValid / decayDays * 100));
|
|
122
|
-
}
|
|
123
|
-
else {
|
|
124
|
-
// Becomes valid in future
|
|
125
|
-
const daysUntilValid = (validFromDate.getTime() - now.getTime()) / (24 * 60 * 60 * 1000);
|
|
126
|
-
score = Math.max(20, 100 - Math.min(80, daysUntilValid / decayDays * 100));
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
// Fallback to learned/recorded time
|
|
130
|
-
else {
|
|
131
|
-
const learnedDate = recordedAtDate || createdDate;
|
|
132
|
-
if (learnedDate) {
|
|
133
|
-
const daysSinceLearned = (now.getTime() - learnedDate.getTime()) / (24 * 60 * 60 * 1000);
|
|
134
|
-
score = 100 * Math.pow(0.5, daysSinceLearned / decayDays);
|
|
135
|
-
score = Math.max(0, Math.min(100, score));
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
return Math.round(score * 10) / 10; // Return one decimal place
|
|
139
|
-
}
|
|
140
|
-
function calculateCoactivationScore(memory) {
|
|
141
|
-
if (!memory.coactivationScore || memory.coactivationScore === 0)
|
|
142
|
-
return 10;
|
|
143
|
-
return Math.min(100, memory.coactivationScore * 5);
|
|
144
|
-
}
|
|
145
|
-
function calculateImportanceScore(memory) {
|
|
146
|
-
let score = 50;
|
|
147
|
-
if (memory.tier === 'hot')
|
|
148
|
-
score += 30;
|
|
149
|
-
else if (memory.tier === 'warm')
|
|
150
|
-
score += 15;
|
|
151
|
-
if (memory.relevanceScore)
|
|
152
|
-
score += memory.relevanceScore * 0.2;
|
|
153
|
-
if (memory.isPinned)
|
|
154
|
-
score += 10;
|
|
155
|
-
if (memory.isProtected)
|
|
156
|
-
score += 10;
|
|
157
|
-
if (memory.isMergeable || memory.isMerged)
|
|
158
|
-
score -= 10;
|
|
159
|
-
return Math.max(0, Math.min(100, score));
|
|
160
|
-
}
|
|
161
|
-
function calculateConfidenceScore(memory) {
|
|
162
|
-
let score = 50;
|
|
163
|
-
const signals = memory.metadata?.memorySignals;
|
|
164
|
-
if (signals) {
|
|
165
|
-
if (signals.priority === 'high')
|
|
166
|
-
score += 25;
|
|
167
|
-
if (signals.explicitTriggers && signals.explicitTriggers.length > 0) {
|
|
168
|
-
score += 15 * Math.min(signals.explicitTriggers.length, 2);
|
|
169
|
-
}
|
|
170
|
-
if (signals.implicit) {
|
|
171
|
-
if (signals.implicit.decision)
|
|
172
|
-
score += 10;
|
|
173
|
-
if (signals.implicit.correction)
|
|
174
|
-
score += 15;
|
|
175
|
-
if (signals.implicit.preference)
|
|
176
|
-
score += 8;
|
|
177
|
-
if (signals.implicit.workflowRule)
|
|
178
|
-
score += 12;
|
|
179
|
-
if (signals.implicit.lesson)
|
|
180
|
-
score += 10;
|
|
181
|
-
}
|
|
182
|
-
if (signals.requiresConflictCheck)
|
|
183
|
-
score -= 5;
|
|
184
|
-
}
|
|
185
|
-
switch (memory.type) {
|
|
186
|
-
case 'decision':
|
|
187
|
-
score += 10;
|
|
188
|
-
break;
|
|
189
|
-
case 'preference':
|
|
190
|
-
score += 5;
|
|
191
|
-
break;
|
|
192
|
-
case 'fact':
|
|
193
|
-
score += 8;
|
|
194
|
-
break;
|
|
195
|
-
case 'context':
|
|
196
|
-
score += 3;
|
|
197
|
-
break;
|
|
198
|
-
}
|
|
199
|
-
if (memory.source === 'mcp')
|
|
200
|
-
score += 5;
|
|
201
|
-
if (memory.accessCount && memory.accessCount > 5) {
|
|
202
|
-
score += Math.min(10, memory.accessCount / 2);
|
|
203
|
-
}
|
|
204
|
-
return Math.max(0, Math.min(100, score));
|
|
205
|
-
}
|
|
206
|
-
function calculateFeedbackScore(memory) {
|
|
207
|
-
const retrievalPriority = memory.retrievalPriority ?? 50;
|
|
208
|
-
return Math.max(0, Math.min(100, retrievalPriority));
|
|
209
|
-
}
|
|
210
|
-
function calculateCosineSimilarity(vecA, vecB) {
|
|
211
|
-
if (vecA.length !== vecB.length)
|
|
212
|
-
return 0;
|
|
213
|
-
let dotProduct = 0;
|
|
214
|
-
let magnitudeA = 0;
|
|
215
|
-
let magnitudeB = 0;
|
|
216
|
-
for (let i = 0; i < vecA.length; i++) {
|
|
217
|
-
dotProduct += vecA[i] * vecB[i];
|
|
218
|
-
magnitudeA += vecA[i] * vecA[i];
|
|
219
|
-
magnitudeB += vecB[i] * vecB[i];
|
|
220
|
-
}
|
|
221
|
-
magnitudeA = Math.sqrt(magnitudeA);
|
|
222
|
-
magnitudeB = Math.sqrt(magnitudeB);
|
|
223
|
-
if (magnitudeA === 0 || magnitudeB === 0)
|
|
224
|
-
return 0;
|
|
225
|
-
return dotProduct / (magnitudeA * magnitudeB);
|
|
226
|
-
}
|
|
227
|
-
function generateScoreExplanation(components, weights, memory) {
|
|
228
|
-
const parts = [];
|
|
229
|
-
if (components.semantic > 70)
|
|
230
|
-
parts.push(`highly relevant (${components.semantic.toFixed(0)})`);
|
|
231
|
-
else if (components.semantic > 50)
|
|
232
|
-
parts.push(`somewhat relevant (${components.semantic.toFixed(0)})`);
|
|
233
|
-
else
|
|
234
|
-
parts.push(`low relevance (${components.semantic.toFixed(0)})`);
|
|
235
|
-
if (components.recency > 70)
|
|
236
|
-
parts.push('recent');
|
|
237
|
-
else if (components.recency > 30)
|
|
238
|
-
parts.push('moderately recent');
|
|
239
|
-
else
|
|
240
|
-
parts.push('older');
|
|
241
|
-
if (memory.tier === 'hot')
|
|
242
|
-
parts.push('active memory');
|
|
243
|
-
else if (memory.tier === 'warm')
|
|
244
|
-
parts.push('accessible memory');
|
|
245
|
-
else
|
|
246
|
-
parts.push('archived memory');
|
|
247
|
-
if (components.coactivation > 60)
|
|
248
|
-
parts.push('frequently associated');
|
|
249
|
-
if (components.confidence > 80)
|
|
250
|
-
parts.push('high confidence');
|
|
251
|
-
else if (components.confidence > 60)
|
|
252
|
-
parts.push('moderate confidence');
|
|
253
|
-
else if (components.confidence < 40)
|
|
254
|
-
parts.push('low confidence');
|
|
255
|
-
if (components.feedback > 70)
|
|
256
|
-
parts.push('frequently useful');
|
|
257
|
-
else if (components.feedback < 30)
|
|
258
|
-
parts.push('rarely used');
|
|
259
|
-
return parts.join(', ');
|
|
260
|
-
}
|
|
261
|
-
export async function scoreAndRankMemories(queryEmbedding, memories, topK = 10, options = {}) {
|
|
262
|
-
const scored = await hybridScore(queryEmbedding, memories, options);
|
|
263
|
-
logger.debug('Scored and ranked memories', {
|
|
264
|
-
total: scored.length,
|
|
265
|
-
topK,
|
|
266
|
-
topScores: scored.slice(0, topK).map((s) => ({ id: s.memoryId, score: s.totalScore })),
|
|
267
|
-
});
|
|
268
|
-
return scored.slice(0, topK);
|
|
269
|
-
}
|
|
270
|
-
export function getScoreDistribution(scored) {
|
|
271
|
-
if (scored.length === 0) {
|
|
272
|
-
return { min: 0, max: 0, avg: 0, median: 0, p95: 0, p99: 0 };
|
|
273
|
-
}
|
|
274
|
-
const scores = scored.map((s) => s.totalScore).sort((a, b) => a - b);
|
|
275
|
-
return {
|
|
276
|
-
min: scores[0],
|
|
277
|
-
max: scores[scores.length - 1],
|
|
278
|
-
avg: scores.reduce((a, b) => a + b, 0) / scores.length,
|
|
279
|
-
median: scores[Math.floor(scores.length / 2)],
|
|
280
|
-
p95: scores[Math.floor((95 / 100) * scores.length)],
|
|
281
|
-
p99: scores[Math.floor((99 / 100) * scores.length)],
|
|
282
|
-
};
|
|
283
|
-
}
|
|
284
|
-
//# sourceMappingURL=hybrid-scorer.js.map
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Hybrid Search - Combines BM25 keyword search with vector semantic search
|
|
3
|
-
* Uses Reciprocal Rank Fusion (RRF) for result merging
|
|
4
|
-
*/
|
|
5
|
-
import type { SearchResult, SearchInput } from './memories.js';
|
|
6
|
-
export interface HybridSearchOptions {
|
|
7
|
-
limit?: number;
|
|
8
|
-
project?: string;
|
|
9
|
-
type?: string;
|
|
10
|
-
tags?: string[];
|
|
11
|
-
/** Weight for BM25 results (0-1), default 0.5 */
|
|
12
|
-
bm25Weight?: number;
|
|
13
|
-
/** Weight for vector results (0-1), default 0.5 */
|
|
14
|
-
vectorWeight?: number;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Main hybrid search function - combines BM25 and vector search with RRF
|
|
18
|
-
*/
|
|
19
|
-
export declare function hybridSearch(input: SearchInput, options?: HybridSearchOptions): Promise<SearchResult[]>;
|
|
20
|
-
//# sourceMappingURL=hybrid-search.d.ts.map
|
|
@@ -1,359 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Hybrid Search - Combines BM25 keyword search with vector semantic search
|
|
3
|
-
* Uses Reciprocal Rank Fusion (RRF) for result merging
|
|
4
|
-
*/
|
|
5
|
-
import { getDb } from '../../db/index.js';
|
|
6
|
-
import { createDatabaseClient } from '../storage/database.js';
|
|
7
|
-
import { getEmbedding } from '../../core/embeddings.js';
|
|
8
|
-
import { requireProject } from '../../core/projects.js';
|
|
9
|
-
import { deserializeTags, deserializeMetadata, normalizeTags } from './serialization.js';
|
|
10
|
-
import { computeGraphBoost } from '../search/graph-boost.js';
|
|
11
|
-
import { normalizeTimestamp } from '../lib/utils.js';
|
|
12
|
-
import { cosineSimilarity } from '../utils/vector-operations.js';
|
|
13
|
-
import config from '../../config.js';
|
|
14
|
-
/**
|
|
15
|
-
* Reciprocal Rank Fusion (RRF) constant
|
|
16
|
-
* Higher values = more influence from lower-ranked items
|
|
17
|
-
* 60 is the standard value used in research
|
|
18
|
-
*/
|
|
19
|
-
const RRF_K = 60;
|
|
20
|
-
/**
|
|
21
|
-
* Main hybrid search function - combines BM25 and vector search with RRF
|
|
22
|
-
*/
|
|
23
|
-
export async function hybridSearch(input, options = {}) {
|
|
24
|
-
const limit = options.limit ?? input.limit ?? 10;
|
|
25
|
-
const bm25Weight = options.bm25Weight ?? 0.5;
|
|
26
|
-
const vectorWeight = options.vectorWeight ?? 0.5;
|
|
27
|
-
// Run both searches in parallel
|
|
28
|
-
const [bm25Results, vectorResults] = await Promise.all([
|
|
29
|
-
bm25Search(input, { ...options, limit: limit * 2 }),
|
|
30
|
-
vectorSearch(input, { ...options, limit: limit * 2 }),
|
|
31
|
-
]);
|
|
32
|
-
// Compute graph boost for the candidate memory IDs
|
|
33
|
-
const candidateIds = Array.from(new Set([...bm25Results.map(r => r.id), ...vectorResults.map(r => r.id)]));
|
|
34
|
-
const graphBoostMap = await computeGraphBoost(candidateIds);
|
|
35
|
-
// Apply RRF to merge results, incorporating graph boost
|
|
36
|
-
return reciprocalRankFusion(bm25Results, vectorResults, { limit, bm25Weight, vectorWeight }, graphBoostMap);
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* BM25 keyword search using SQLite FTS5
|
|
40
|
-
*/
|
|
41
|
-
async function bm25Search(input, options) {
|
|
42
|
-
try {
|
|
43
|
-
const db = createDatabaseClient(await getDb());
|
|
44
|
-
const sqlite = db.$client;
|
|
45
|
-
const limit = options.limit ?? 10;
|
|
46
|
-
const tags = normalizeTags(options.tags ?? input.tags);
|
|
47
|
-
// Build FTS5 query with proper escaping
|
|
48
|
-
const ftsQuery = buildFtsQuery(input.query);
|
|
49
|
-
const isEmptyQuery = ftsQuery === '*';
|
|
50
|
-
// Build WHERE conditions
|
|
51
|
-
const conditions = [];
|
|
52
|
-
const params = [];
|
|
53
|
-
// For non-empty queries, use FTS5 MATCH
|
|
54
|
-
if (!isEmptyQuery) {
|
|
55
|
-
conditions.push('memories_fts MATCH ?');
|
|
56
|
-
params.push(ftsQuery);
|
|
57
|
-
}
|
|
58
|
-
if (input.type) {
|
|
59
|
-
conditions.push('m.type = ?');
|
|
60
|
-
params.push(input.type);
|
|
61
|
-
}
|
|
62
|
-
if (tags.length) {
|
|
63
|
-
conditions.push('(' + tags.map(() => 'm.tags LIKE ?').join(' OR ') + ')');
|
|
64
|
-
params.push(...tags.map((tag) => `%${tag}%`));
|
|
65
|
-
}
|
|
66
|
-
let projectId = null;
|
|
67
|
-
if (input.project) {
|
|
68
|
-
const project = await requireProject(input.project);
|
|
69
|
-
projectId = project.id;
|
|
70
|
-
conditions.push('m.project_id = ?');
|
|
71
|
-
params.push(project.id);
|
|
72
|
-
}
|
|
73
|
-
// For empty query with no filters, use "1=1" to match all
|
|
74
|
-
const whereClause = conditions.length > 0 ? conditions.join(' AND ') : '1=1';
|
|
75
|
-
// Build query based on whether we have a search term or not
|
|
76
|
-
const statement = sqlite.prepare(`
|
|
77
|
-
SELECT
|
|
78
|
-
m.id as id,
|
|
79
|
-
m.project_id as projectId,
|
|
80
|
-
m.type as type,
|
|
81
|
-
m.content as content,
|
|
82
|
-
m.summary as summary,
|
|
83
|
-
m.tags as tags,
|
|
84
|
-
m.metadata as metadata,
|
|
85
|
-
${isEmptyQuery ? '0 as bm25Score' : 'bm25(memories_fts) as bm25Score'},
|
|
86
|
-
m.created_at as createdAt
|
|
87
|
-
FROM memories m
|
|
88
|
-
${isEmptyQuery ? '' : 'INNER JOIN memories_fts ON m.rowid = memories_fts.rowid'}
|
|
89
|
-
WHERE ${whereClause}
|
|
90
|
-
${isEmptyQuery ? 'ORDER BY m.created_at DESC' : 'ORDER BY bm25(memories_fts)'}
|
|
91
|
-
LIMIT ?
|
|
92
|
-
`);
|
|
93
|
-
const rows = statement.all(...params, limit * 3);
|
|
94
|
-
// Return as ranked results (lower BM25 score = better rank)
|
|
95
|
-
return rows.map((row, index) => ({
|
|
96
|
-
id: row.id,
|
|
97
|
-
rank: index + 1,
|
|
98
|
-
score: row.bm25Score,
|
|
99
|
-
result: {
|
|
100
|
-
id: row.id,
|
|
101
|
-
projectId: row.projectId,
|
|
102
|
-
type: row.type,
|
|
103
|
-
content: row.content,
|
|
104
|
-
summary: row.summary ?? undefined,
|
|
105
|
-
tags: deserializeTags(row.tags ?? null),
|
|
106
|
-
metadata: deserializeMetadata(row.metadata ?? null),
|
|
107
|
-
createdAt: row.createdAt ? (normalizeTimestamp(Number(row.createdAt)) ?? undefined) : undefined,
|
|
108
|
-
},
|
|
109
|
-
}));
|
|
110
|
-
}
|
|
111
|
-
catch (error) {
|
|
112
|
-
throw error;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Vector semantic search using cosine similarity
|
|
117
|
-
*/
|
|
118
|
-
async function vectorSearch(input, options) {
|
|
119
|
-
try {
|
|
120
|
-
const db = createDatabaseClient(await getDb());
|
|
121
|
-
const sqlite = db.$client;
|
|
122
|
-
const limit = options.limit ?? 10;
|
|
123
|
-
const tags = normalizeTags(options.tags ?? input.tags);
|
|
124
|
-
// Check for empty query
|
|
125
|
-
const isEmptyQuery = !input.query || input.query.trim() === '';
|
|
126
|
-
// Get query embedding (only for non-empty queries)
|
|
127
|
-
let queryEmbedding = null;
|
|
128
|
-
if (!isEmptyQuery) {
|
|
129
|
-
queryEmbedding = await getEmbedding(input.query);
|
|
130
|
-
// If embedding fails but query is not empty, still proceed without semantic ranking
|
|
131
|
-
// Fall back to recency-based ranking
|
|
132
|
-
}
|
|
133
|
-
// Build WHERE conditions
|
|
134
|
-
const conditions = [];
|
|
135
|
-
const params = [];
|
|
136
|
-
if (input.type) {
|
|
137
|
-
conditions.push('m.type = ?');
|
|
138
|
-
params.push(input.type);
|
|
139
|
-
}
|
|
140
|
-
if (tags.length) {
|
|
141
|
-
conditions.push('(' + tags.map(() => 'm.tags LIKE ?').join(' OR ') + ')');
|
|
142
|
-
params.push(...tags.map((tag) => `%${tag}%`));
|
|
143
|
-
}
|
|
144
|
-
let projectId = null;
|
|
145
|
-
if (input.project) {
|
|
146
|
-
const project = await requireProject(input.project);
|
|
147
|
-
projectId = project.id;
|
|
148
|
-
conditions.push('m.project_id = ?');
|
|
149
|
-
params.push(project.id);
|
|
150
|
-
}
|
|
151
|
-
const whereClause = conditions.length > 0
|
|
152
|
-
? 'WHERE ' + conditions.join(' AND ')
|
|
153
|
-
: '';
|
|
154
|
-
// Fetch candidates for vector search
|
|
155
|
-
const statement = sqlite.prepare(`
|
|
156
|
-
SELECT
|
|
157
|
-
m.id as id,
|
|
158
|
-
m.project_id as projectId,
|
|
159
|
-
m.type as type,
|
|
160
|
-
m.content as content,
|
|
161
|
-
m.summary as summary,
|
|
162
|
-
m.tags as tags,
|
|
163
|
-
m.metadata as metadata,
|
|
164
|
-
m.embedding as embedding,
|
|
165
|
-
m.embedding_json as embeddingJson,
|
|
166
|
-
m.created_at as createdAt
|
|
167
|
-
FROM memories m
|
|
168
|
-
${whereClause}
|
|
169
|
-
ORDER BY m.created_at DESC
|
|
170
|
-
LIMIT ?
|
|
171
|
-
`);
|
|
172
|
-
const rows = statement.all(...params, limit * 3);
|
|
173
|
-
// If no embedding available, return results ordered by recency
|
|
174
|
-
if (!queryEmbedding) {
|
|
175
|
-
return rows.slice(0, limit * 2).map((item, index) => ({
|
|
176
|
-
id: item.id,
|
|
177
|
-
rank: index + 1,
|
|
178
|
-
score: 0, // No similarity score available
|
|
179
|
-
result: {
|
|
180
|
-
id: item.id,
|
|
181
|
-
projectId: item.projectId,
|
|
182
|
-
type: item.type,
|
|
183
|
-
content: item.content,
|
|
184
|
-
summary: item.summary ?? undefined,
|
|
185
|
-
tags: deserializeTags(item.tags ?? null),
|
|
186
|
-
metadata: deserializeMetadata(item.metadata ?? null),
|
|
187
|
-
createdAt: item.createdAt ? (normalizeTimestamp(Number(item.createdAt)) ?? undefined) : undefined,
|
|
188
|
-
similarity: 0,
|
|
189
|
-
},
|
|
190
|
-
}));
|
|
191
|
-
}
|
|
192
|
-
// Calculate cosine similarity for each result
|
|
193
|
-
const scored = rows
|
|
194
|
-
.map((row) => {
|
|
195
|
-
const embedding = parseEmbedding(row.embedding) ?? parseEmbedding(row.embeddingJson);
|
|
196
|
-
if (!embedding)
|
|
197
|
-
return null;
|
|
198
|
-
const similarity = cosineSimilarity(queryEmbedding, embedding);
|
|
199
|
-
return {
|
|
200
|
-
id: row.id,
|
|
201
|
-
projectId: row.projectId,
|
|
202
|
-
type: row.type,
|
|
203
|
-
content: row.content,
|
|
204
|
-
summary: row.summary,
|
|
205
|
-
tags: row.tags,
|
|
206
|
-
metadata: row.metadata,
|
|
207
|
-
createdAt: row.createdAt,
|
|
208
|
-
similarity,
|
|
209
|
-
};
|
|
210
|
-
})
|
|
211
|
-
.filter((item) => item !== null);
|
|
212
|
-
// Sort by similarity (descending) and return as ranked results
|
|
213
|
-
scored.sort((a, b) => b.similarity - a.similarity);
|
|
214
|
-
return scored.slice(0, limit * 2).map((item, index) => ({
|
|
215
|
-
id: item.id,
|
|
216
|
-
rank: index + 1,
|
|
217
|
-
score: item.similarity,
|
|
218
|
-
result: {
|
|
219
|
-
id: item.id,
|
|
220
|
-
projectId: item.projectId,
|
|
221
|
-
type: item.type,
|
|
222
|
-
content: item.content,
|
|
223
|
-
summary: item.summary ?? undefined,
|
|
224
|
-
tags: deserializeTags(item.tags ?? null),
|
|
225
|
-
metadata: deserializeMetadata(item.metadata ?? null),
|
|
226
|
-
createdAt: item.createdAt ? (normalizeTimestamp(Number(item.createdAt)) ?? undefined) : undefined,
|
|
227
|
-
similarity: item.similarity,
|
|
228
|
-
},
|
|
229
|
-
}));
|
|
230
|
-
}
|
|
231
|
-
catch (error) {
|
|
232
|
-
throw error;
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
/**
|
|
236
|
-
* Reciprocal Rank Fusion (RRF) - merges ranked lists without score calibration
|
|
237
|
-
*
|
|
238
|
-
* RRF Formula: score(item) = sum(weight_i / (k + rank_i))
|
|
239
|
-
* Where k is a constant (typically 60) that prevents high ranks from dominating
|
|
240
|
-
*
|
|
241
|
-
* Benefits:
|
|
242
|
-
* - No need to calibrate different scoring systems (BM25 vs cosine similarity)
|
|
243
|
-
* - Handles items that appear in only one list
|
|
244
|
-
* - Proven to outperform weighted score fusion in most cases
|
|
245
|
-
*/
|
|
246
|
-
function reciprocalRankFusion(bm25Results, vectorResults, options, graphBoostMap) {
|
|
247
|
-
const { limit, bm25Weight, vectorWeight } = options;
|
|
248
|
-
const scores = new Map();
|
|
249
|
-
// Process BM25 results
|
|
250
|
-
for (const item of bm25Results) {
|
|
251
|
-
const rrfScore = (bm25Weight * 2) / (RRF_K + item.rank);
|
|
252
|
-
const existing = scores.get(item.id);
|
|
253
|
-
if (existing) {
|
|
254
|
-
existing.score += rrfScore;
|
|
255
|
-
}
|
|
256
|
-
else {
|
|
257
|
-
scores.set(item.id, { score: rrfScore, result: item.result });
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
// Process vector results
|
|
261
|
-
for (const item of vectorResults) {
|
|
262
|
-
const rrfScore = (vectorWeight * 2) / (RRF_K + item.rank);
|
|
263
|
-
const existing = scores.get(item.id);
|
|
264
|
-
if (existing) {
|
|
265
|
-
existing.score += rrfScore;
|
|
266
|
-
}
|
|
267
|
-
else {
|
|
268
|
-
scores.set(item.id, { score: rrfScore, result: item.result });
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
// Add graph boost to each score
|
|
272
|
-
for (const [id, entry] of scores.entries()) {
|
|
273
|
-
const boost = graphBoostMap[id] ?? 0;
|
|
274
|
-
const weight = config.scoringWeights.graphBoost ?? 1;
|
|
275
|
-
entry.score += boost * weight;
|
|
276
|
-
}
|
|
277
|
-
// Sort by final score (descending) and return top results
|
|
278
|
-
return Array.from(scores.values())
|
|
279
|
-
.sort((a, b) => b.score - a.score)
|
|
280
|
-
.slice(0, limit)
|
|
281
|
-
.map((item) => ({
|
|
282
|
-
...item.result,
|
|
283
|
-
similarity: item.result.similarity ?? 0,
|
|
284
|
-
}));
|
|
285
|
-
}
|
|
286
|
-
/**
|
|
287
|
-
* Build FTS5 query string from user input
|
|
288
|
-
* Handles phrase searches, OR operators for better recall, and special characters
|
|
289
|
-
*/
|
|
290
|
-
function buildFtsQuery(query) {
|
|
291
|
-
// Ensure query is a string
|
|
292
|
-
const queryString = typeof query === 'string' ? query : String(query ?? '');
|
|
293
|
-
// Remove special characters that could break FTS5 syntax (except quotes)
|
|
294
|
-
// Hyphens are problematic in FTS5 - they're treated as exclusion operators
|
|
295
|
-
let cleaned = queryString.replace(/[^\w\s"'-]/g, ' ');
|
|
296
|
-
// If query contains quotes, preserve as phrase search
|
|
297
|
-
if (cleaned.includes('"')) {
|
|
298
|
-
return cleaned || '*'; // Return * for empty after cleaning
|
|
299
|
-
}
|
|
300
|
-
// Split into terms
|
|
301
|
-
const terms = cleaned.trim().split(/\s+/).filter((t) => t.length > 0);
|
|
302
|
-
if (terms.length === 0) {
|
|
303
|
-
return '*'; // Match all for empty query
|
|
304
|
-
}
|
|
305
|
-
// Wrap terms containing hyphens in quotes (e.g., "trash-cli" prevents hyphen being interpreted as NOT)
|
|
306
|
-
const processedTerms = terms.map(term => {
|
|
307
|
-
if (term.includes('-')) {
|
|
308
|
-
return `"${term}"`;
|
|
309
|
-
}
|
|
310
|
-
return term;
|
|
311
|
-
});
|
|
312
|
-
// For multi-word queries, use OR for better recall (any term matches)
|
|
313
|
-
// This is less restrictive than AND and finds more relevant results
|
|
314
|
-
if (processedTerms.length > 1) {
|
|
315
|
-
return processedTerms.join(' OR ');
|
|
316
|
-
}
|
|
317
|
-
return processedTerms[0];
|
|
318
|
-
}
|
|
319
|
-
/**
|
|
320
|
-
* Parse embedding from SQLite storage
|
|
321
|
-
*/
|
|
322
|
-
function parseEmbedding(embeddingData) {
|
|
323
|
-
if (!embeddingData)
|
|
324
|
-
return null;
|
|
325
|
-
if (Array.isArray(embeddingData))
|
|
326
|
-
return embeddingData;
|
|
327
|
-
if (embeddingData instanceof Uint8Array || Buffer.isBuffer(embeddingData)) {
|
|
328
|
-
try {
|
|
329
|
-
const json = JSON.parse(embeddingData.toString());
|
|
330
|
-
if (Array.isArray(json))
|
|
331
|
-
return json;
|
|
332
|
-
}
|
|
333
|
-
catch {
|
|
334
|
-
try {
|
|
335
|
-
const buffer = embeddingData.buffer;
|
|
336
|
-
const arrayBuffer = buffer instanceof ArrayBuffer
|
|
337
|
-
? buffer
|
|
338
|
-
: buffer;
|
|
339
|
-
const floatArray = new Float32Array(arrayBuffer);
|
|
340
|
-
return Array.from(floatArray);
|
|
341
|
-
}
|
|
342
|
-
catch {
|
|
343
|
-
return null;
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
if (typeof embeddingData === 'string') {
|
|
348
|
-
try {
|
|
349
|
-
const parsed = JSON.parse(embeddingData);
|
|
350
|
-
if (Array.isArray(parsed))
|
|
351
|
-
return parsed;
|
|
352
|
-
}
|
|
353
|
-
catch {
|
|
354
|
-
return null;
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
return null;
|
|
358
|
-
}
|
|
359
|
-
//# sourceMappingURL=hybrid-search.js.map
|