squish-memory 1.1.5 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +32 -16
- package/CHANGELOG.md +147 -0
- package/README.md +120 -78
- package/{scripts → bin}/dependency-manager.mjs +217 -217
- package/{scripts → bin}/detect-clients.mjs +78 -78
- package/bin/install-interactive.mjs +321 -0
- package/bin/squish-mcp.mjs +46 -0
- package/bin/squish.mjs +33 -0
- package/config/mcp-migration-map.json +1 -6
- package/config/mcp-mode-semantics.json +19 -23
- package/config/mcp-remote-auth.json +3 -26
- package/config/mcp-universal.schema.json +5 -35
- package/config/settings.json +107 -52
- package/config.js +5 -0
- package/config.ts +218 -0
- package/core/adapters/config/claude-code.ts +133 -0
- package/core/adapters/config/cursor.ts +90 -0
- package/core/adapters/config/opencode.ts +89 -0
- package/core/adapters/config/windsurf.ts +90 -0
- package/core/adapters/index.ts +102 -0
- package/core/adapters/timeline.ts +116 -0
- package/core/adapters/types.ts +166 -0
- package/core/agent-preferences.ts +140 -0
- package/core/algorithms/analytics/token-estimator.ts +216 -0
- package/core/algorithms/detection/hash-filters.ts +260 -0
- package/core/algorithms/detection/semantic-ranker.ts +194 -0
- package/core/algorithms/detection/two-stage-detector.ts +421 -0
- package/core/algorithms/handlers/approve-merge.ts +215 -0
- package/core/algorithms/handlers/detect-duplicates.ts +192 -0
- package/core/algorithms/handlers/get-stats.ts +132 -0
- package/core/algorithms/handlers/list-proposals.ts +130 -0
- package/core/algorithms/handlers/preview-merge.ts +139 -0
- package/core/algorithms/handlers/reject-merge.ts +93 -0
- package/core/algorithms/handlers/reverse-merge.ts +155 -0
- package/core/algorithms/index.ts +39 -0
- package/core/algorithms/operations/cache-maintenance.ts +182 -0
- package/core/algorithms/safety/safety-checks.ts +256 -0
- package/core/algorithms/strategies/merge-strategies.ts +381 -0
- package/core/algorithms/types.ts +140 -0
- package/core/algorithms/utils/response-builder.ts +61 -0
- package/core/associations.ts +363 -0
- package/core/beliefs/decay.ts +289 -0
- package/core/beliefs/extractor.ts +131 -0
- package/core/beliefs/store.ts +557 -0
- package/core/beliefs/types.ts +38 -0
- package/core/commands/mcp-server.ts +5 -0
- package/core/compression.ts +177 -0
- package/core/config.js +2 -0
- package/core/consolidation.ts +330 -0
- package/core/context/agent-context.ts +388 -0
- package/core/context/context-paging.ts +449 -0
- package/core/context/context-window.ts +234 -0
- package/core/context/context.ts +35 -0
- package/core/embeddings/embeddings.ts +616 -0
- package/core/embeddings/google-multimodal.ts +200 -0
- package/{dist/core/local-embeddings.js → core/embeddings/local-embeddings.ts} +12 -11
- package/core/embeddings/qmd-client.ts +495 -0
- package/core/embeddings/transformers-local.ts +261 -0
- package/core/embeddings.js +4 -0
- package/core/error-handling.ts +206 -0
- package/core/external +219 -0
- package/core/graph/entity-deduplicator.ts +232 -0
- package/core/graph/graph-builder.ts +257 -0
- package/core/graph/graph-traversal.ts +490 -0
- package/core/graph/index.ts +24 -0
- package/core/graph/llm-entity-extractor.ts +402 -0
- package/core/graph/multi-hop-retrieval.ts +317 -0
- package/core/graph/relationship-extractor.ts +465 -0
- package/core/hooks/agent-hooks.ts +653 -0
- package/core/hooks/auto-tagger.ts +149 -0
- package/core/hooks/capture-filter.ts +169 -0
- package/core/hot-cache.ts +388 -0
- package/core/index.ts +10 -0
- package/core/ingestion/agent-memory.ts +167 -0
- package/core/ingestion/core-memory.ts +326 -0
- package/core/ingestion/learnings.ts +260 -0
- package/core/ingestion/signal-engine.ts +266 -0
- package/core/integrations/obsidian-vault.ts +197 -0
- package/core/layers/generator.ts +115 -0
- package/core/lib/db-client.ts +168 -0
- package/core/lib/parse-embedding.ts +59 -0
- package/core/lib/schemas.ts +102 -0
- package/core/lib/types.ts +49 -0
- package/core/lib/utils.ts +151 -0
- package/core/lib/validation.ts +180 -0
- package/core/lifecycle.ts +353 -0
- package/core/logger.ts +59 -0
- package/core/memory/bridge-discovery.ts +395 -0
- package/core/memory/categorizer.ts +390 -0
- package/core/memory/conflict-detector.ts +62 -0
- package/core/memory/consolidation.ts +372 -0
- package/core/memory/context-collector.ts +75 -0
- package/core/memory/contradiction-resolver.ts +494 -0
- package/core/memory/edit-workflow.ts +174 -0
- package/core/memory/entity-extractor.ts +426 -0
- package/core/memory/entity-resolver.ts +89 -0
- package/core/memory/explain.ts +112 -0
- package/core/memory/fact-deriver.ts +300 -0
- package/core/memory/fact-extractor.ts +120 -0
- package/core/memory/feedback-tracker.ts +200 -0
- package/core/memory/hooks.ts +230 -0
- package/core/memory/hybrid-retrieval.ts +65 -0
- package/core/memory/hybrid-scorer.ts +325 -0
- package/core/memory/hybrid-search.ts +748 -0
- package/core/memory/importance.ts +319 -0
- package/core/memory/index.ts +11 -0
- package/core/memory/loader.ts +178 -0
- package/core/memory/markdown/markdown-storage.ts +318 -0
- package/core/memory/memories.ts +565 -0
- package/core/memory/memory-lifecycle.ts +51 -0
- package/core/memory/memory-manager.ts +53 -0
- package/core/memory/migrate.ts +173 -0
- package/core/memory/normalization.ts +30 -0
- package/core/memory/path-strengthener.ts +211 -0
- package/core/memory/progressive-disclosure.ts +392 -0
- package/core/memory/query-processor.ts +130 -0
- package/core/memory/query-rewriter.ts +153 -0
- package/core/memory/response-analyzer.ts +81 -0
- package/core/memory/retrieval-feedback.ts +276 -0
- package/core/memory/serialization.ts +83 -0
- package/core/memory/stale-cleaner.ts +147 -0
- package/core/memory/stats.ts +181 -0
- package/core/memory/telemetry.ts +392 -0
- package/core/memory/temporal-facts.ts +356 -0
- package/core/memory/temporal-parser.ts +477 -0
- package/core/memory/trigger-detector.ts +104 -0
- package/core/memory/write-gate.ts +288 -0
- package/core/places/index.ts +14 -0
- package/core/places/memory-places.ts +339 -0
- package/core/places/places.ts +406 -0
- package/core/places/rules.ts +308 -0
- package/core/places/walking.ts +192 -0
- package/core/projects +89 -0
- package/core/projects.ts +131 -0
- package/core/redis.ts +82 -0
- package/core/responses.ts +187 -0
- package/core/runtime/trust-report.ts +195 -0
- package/core/runtime/trust-state.ts +360 -0
- package/core/scheduler/cron-scheduler.ts +581 -0
- package/core/scheduler/heartbeat.ts +91 -0
- package/core/scheduler/index.ts +8 -0
- package/core/scheduler/job-runner.ts +197 -0
- package/core/search/conversations.ts +166 -0
- package/core/search/entities.ts +46 -0
- package/core/search/folder-context.ts +154 -0
- package/core/search/graph-boost.ts +22 -0
- package/core/search/index.ts +4 -0
- package/core/search/qmd-wrapper.ts +84 -0
- package/core/security/encrypt.ts +51 -0
- package/core/security/governance.ts +102 -0
- package/core/security/privacy.ts +108 -0
- package/core/security/secret-detector.ts +122 -0
- package/core/session/auto-load.ts +160 -0
- package/core/session/entity-tracker.ts +363 -0
- package/core/session/index.ts +7 -0
- package/core/session/reference-resolver.ts +158 -0
- package/core/session/self-iteration-job.ts +478 -0
- package/core/session/session-hooks.ts +69 -0
- package/core/session/types.ts +36 -0
- package/core/session/working-set.ts +275 -0
- package/core/snapshots/cleanup.ts +13 -0
- package/core/snapshots/comparison.ts +59 -0
- package/core/snapshots/creation.ts +139 -0
- package/core/snapshots/retrieval.ts +44 -0
- package/core/snapshots/stats.ts +63 -0
- package/core/storage/cache.ts +241 -0
- package/core/storage/database.ts +23 -0
- package/core/summarization/cleanup.ts +13 -0
- package/core/summarization/queries.ts +32 -0
- package/core/summarization/stats.ts +64 -0
- package/core/summarization/strategies.ts +52 -0
- package/core/summarization.ts +248 -0
- package/core/temporal-facts.ts +244 -0
- package/core/tracing/collector.ts +470 -0
- package/core/tracing/visualizer.ts +195 -0
- package/core/utils/cleanup-operations.ts +50 -0
- package/core/utils/content-extraction.ts +95 -0
- package/core/utils/filter-builder.ts +56 -0
- package/core/utils/history-traversal.ts +63 -0
- package/core/utils/memory-operations.ts +56 -0
- package/core/utils/query-operations.ts +83 -0
- package/core/utils/summarization-helpers.ts +45 -0
- package/core/utils/temporal-queries.ts +39 -0
- package/core/utils/vector-operations.ts +135 -0
- package/core/utils/version-management.ts +74 -0
- package/core/worker.ts +324 -0
- package/db/adapter.ts +215 -0
- package/db/bootstrap.ts +1055 -0
- package/db/drizzle/migrations/0000_needy_cerebro.sql +402 -0
- package/db/drizzle/migrations/meta/0000_snapshot.json +3451 -0
- package/db/drizzle/migrations/meta/_journal.json +13 -0
- package/db/drizzle/schema-sqlite.ts +1032 -0
- package/db/drizzle/schema.ts +1128 -0
- package/db/drizzle.config.ts +12 -0
- package/db/index.ts +83 -0
- package/db/init.sql +5 -0
- package/db/migrations/associations.ts +35 -0
- package/db/migrations/beliefs.ts +89 -0
- package/db/migrations/core-memory.ts +35 -0
- package/db/migrations/fts.ts +59 -0
- package/db/migrations/index.ts +54 -0
- package/db/migrations/indexes.ts +36 -0
- package/db/migrations/learnings.ts +34 -0
- package/db/migrations/maintenance.ts +68 -0
- package/db/migrations/memories.ts +22 -0
- package/db/migrations/memory-places.ts +35 -0
- package/db/migrations/places.ts +49 -0
- package/db/migrations/projects.ts +21 -0
- package/db/migrations/tier-conversion.ts +24 -0
- package/db/neon.ts +22 -0
- package/db/schema/beliefs.ts +50 -0
- package/db/schema/generator.ts +159 -0
- package/db/schema/index.ts +58 -0
- package/db/schema/learnings.ts +32 -0
- package/db/schema/memories.ts +83 -0
- package/db/schema/projects.ts +33 -0
- package/db/schema.ts +13 -0
- package/db/supabase.ts +27 -0
- package/dist/config.d.ts +40 -17
- package/dist/config.js +150 -198
- package/dist/core/adapters/types.d.ts +13 -33
- package/dist/core/adapters/types.js +1 -1
- package/dist/core/agent-preferences.d.ts +16 -0
- package/dist/core/agent-preferences.js +124 -0
- package/dist/core/algorithms/safety/safety-checks.d.ts +1 -5
- package/dist/core/algorithms/types.d.ts +0 -8
- package/dist/core/associations.d.ts +3 -1
- package/dist/core/associations.js +37 -1
- package/dist/core/beliefs/decay.d.ts +27 -0
- package/dist/core/beliefs/decay.js +217 -0
- package/dist/core/beliefs/extractor.d.ts +9 -0
- package/dist/core/beliefs/extractor.js +113 -0
- package/dist/core/beliefs/store.d.ts +46 -0
- package/dist/core/beliefs/store.js +466 -0
- package/dist/core/beliefs/types.d.ts +28 -0
- package/dist/core/beliefs/types.js +2 -0
- package/dist/core/commands/mcp-server.d.ts +0 -1
- package/dist/core/commands/mcp-server.js +4 -737
- package/dist/core/commands/remember.d.ts +24 -0
- package/dist/core/commands/remember.js +144 -0
- package/dist/core/{toon.d.ts → compression.d.ts} +6 -4
- package/dist/core/{toon.js → compression.js} +8 -8
- package/dist/core/context/agent-context.js +1 -1
- package/dist/core/embeddings/embeddings.d.ts +29 -0
- package/dist/core/embeddings/embeddings.js +546 -0
- package/dist/core/embeddings/google-multimodal.js +6 -2
- package/dist/core/{local-embeddings.d.ts → embeddings/local-embeddings.d.ts} +1 -1
- package/dist/core/embeddings/local-embeddings.js +11 -0
- package/dist/core/embeddings/qmd-client.js +1 -1
- package/dist/core/embeddings/transformers-local.d.ts +64 -0
- package/dist/core/embeddings/transformers-local.js +213 -0
- package/dist/core/embeddings.d.ts +1 -28
- package/dist/core/embeddings.js +2 -453
- package/dist/core/graph/entity-deduplicator.d.ts +24 -0
- package/dist/core/graph/entity-deduplicator.js +183 -0
- package/dist/core/graph/graph-builder.d.ts +46 -0
- package/dist/core/graph/graph-builder.js +174 -0
- package/dist/core/graph/graph-traversal.d.ts +80 -0
- package/dist/core/graph/graph-traversal.js +315 -0
- package/dist/core/graph/index.d.ts +19 -0
- package/dist/core/graph/index.js +13 -0
- package/dist/core/graph/llm-entity-extractor.d.ts +49 -0
- package/dist/core/graph/llm-entity-extractor.js +313 -0
- package/dist/core/graph/multi-hop-retrieval.d.ts +48 -0
- package/dist/core/graph/multi-hop-retrieval.js +215 -0
- package/dist/core/graph/relationship-extractor.d.ts +48 -0
- package/dist/core/graph/relationship-extractor.js +351 -0
- package/dist/core/hooks/agent-hooks.d.ts +10 -1
- package/dist/core/hooks/agent-hooks.js +301 -24
- package/dist/core/hot-cache.d.ts +86 -0
- package/dist/core/hot-cache.js +285 -0
- package/dist/core/index.d.ts +9 -9
- package/dist/core/index.js +9 -12
- package/dist/core/ingestion/core-memory.d.ts +2 -2
- package/dist/core/ingestion/core-memory.js +3 -3
- package/dist/core/ingestion/learnings.js +3 -0
- package/dist/core/ingestion/signal-engine.d.ts +41 -0
- package/dist/core/ingestion/signal-engine.js +201 -0
- package/dist/core/{obsidian-vault.d.ts → integrations/obsidian-vault.d.ts} +2 -1
- package/dist/core/{obsidian-vault.js → integrations/obsidian-vault.js} +69 -7
- package/dist/core/lib/parse-embedding.d.ts +9 -0
- package/dist/core/lib/parse-embedding.js +58 -0
- package/dist/core/lib/schemas.d.ts +57 -54
- package/dist/core/lib/types.d.ts +45 -0
- package/dist/core/lib/types.js +6 -0
- package/dist/core/lib/utils.d.ts +4 -0
- package/dist/core/lib/utils.js +55 -0
- package/dist/core/lifecycle.d.ts +0 -1
- package/dist/core/lifecycle.js +13 -23
- package/dist/core/logger.d.ts +1 -0
- package/dist/core/logger.js +14 -8
- package/dist/core/mcp/tools.d.ts +0 -2
- package/dist/core/mcp/tools.js +0 -87
- package/dist/core/mcp/types.d.ts +25 -253
- package/dist/core/mcp/types.js +2 -2
- package/dist/core/memory/categorizer.js +1 -0
- package/dist/core/memory/consolidation.js +2 -28
- package/dist/core/memory/entity-extractor.d.ts +4 -0
- package/dist/core/memory/entity-extractor.js +30 -16
- package/dist/core/memory/explain.d.ts +18 -0
- package/dist/core/memory/explain.js +92 -0
- package/dist/core/memory/fact-deriver.d.ts +31 -0
- package/dist/core/memory/fact-deriver.js +236 -0
- package/dist/core/memory/hybrid-retrieval.d.ts +14 -16
- package/dist/core/memory/hybrid-retrieval.js +25 -127
- package/dist/core/memory/hybrid-scorer.js +6 -23
- package/dist/core/memory/hybrid-search.d.ts +10 -7
- package/dist/core/memory/hybrid-search.js +458 -221
- package/dist/core/memory/importance.d.ts +0 -17
- package/dist/core/memory/importance.js +1 -58
- package/dist/core/memory/index.d.ts +1 -0
- package/dist/core/memory/index.js +1 -0
- package/dist/core/memory/memories.d.ts +13 -17
- package/dist/core/memory/memories.js +78 -75
- package/dist/core/memory/memory-lifecycle.d.ts +2 -2
- package/dist/core/memory/memory-lifecycle.js +10 -18
- package/dist/core/memory/normalization.d.ts +1 -16
- package/dist/core/memory/path-strengthener.d.ts +39 -0
- package/dist/core/memory/path-strengthener.js +150 -0
- package/dist/core/memory/query-processor.js +37 -3
- package/dist/core/memory/retrieval-feedback.d.ts +70 -0
- package/dist/core/memory/retrieval-feedback.js +213 -0
- package/dist/core/memory/stale-cleaner.d.ts +26 -0
- package/dist/core/memory/stale-cleaner.js +97 -0
- package/dist/core/memory/stats.d.ts +10 -0
- package/dist/core/memory/stats.js +8 -3
- package/dist/core/memory/trigger-detector.d.ts +8 -1
- package/dist/core/memory/trigger-detector.js +42 -5
- package/dist/core/places/index.d.ts +1 -1
- package/dist/core/places/index.js +1 -1
- package/dist/core/places/places.d.ts +13 -13
- package/dist/core/places/places.js +27 -27
- package/dist/core/places/rules.js +23 -23
- package/dist/core/places/walking.d.ts +3 -3
- package/dist/core/places/walking.js +7 -7
- package/dist/core/projects.js +8 -0
- package/dist/core/runtime/trust-report.d.ts +102 -0
- package/dist/core/runtime/trust-report.js +107 -0
- package/dist/core/runtime/trust-state.d.ts +12 -0
- package/dist/core/runtime/trust-state.js +309 -0
- package/dist/core/scheduler/cron-scheduler.d.ts +1 -1
- package/dist/core/scheduler/cron-scheduler.js +164 -3
- package/dist/core/scheduler/job-runner.js +1 -1
- package/dist/core/search/qmd-wrapper.d.ts +36 -0
- package/dist/core/search/qmd-wrapper.js +58 -0
- package/dist/core/session/auto-load.js +28 -3
- package/dist/core/session/entity-tracker.d.ts +62 -0
- package/dist/core/session/entity-tracker.js +287 -0
- package/dist/core/session/reference-resolver.d.ts +26 -0
- package/dist/core/session/reference-resolver.js +121 -0
- package/dist/core/session/self-iteration-job.d.ts +15 -0
- package/dist/core/session/self-iteration-job.js +163 -58
- package/dist/core/session/working-set.d.ts +50 -0
- package/dist/core/session/working-set.js +212 -0
- package/dist/core/snapshots/creation.d.ts +2 -8
- package/dist/core/snapshots/creation.js +3 -12
- package/dist/core/utils/summarization-helpers.d.ts +0 -4
- package/dist/core/utils/summarization-helpers.js +1 -6
- package/dist/db/bootstrap.d.ts +2 -0
- package/dist/db/bootstrap.js +229 -280
- package/dist/db/drizzle/schema-sqlite.d.ts +702 -1
- package/dist/db/drizzle/schema-sqlite.js +83 -4
- package/dist/db/drizzle/schema.d.ts +653 -1
- package/dist/db/drizzle/schema.js +93 -4
- package/dist/db/migrations/associations.d.ts +6 -0
- package/dist/db/migrations/associations.js +29 -0
- package/dist/db/migrations/beliefs.d.ts +10 -0
- package/dist/db/migrations/beliefs.js +76 -0
- package/dist/db/migrations/core-memory.d.ts +6 -0
- package/dist/db/migrations/core-memory.js +29 -0
- package/dist/db/migrations/fts.d.ts +6 -0
- package/dist/db/migrations/fts.js +52 -0
- package/dist/db/migrations/index.d.ts +25 -0
- package/dist/db/migrations/index.js +51 -0
- package/dist/db/migrations/indexes.d.ts +6 -0
- package/dist/db/migrations/indexes.js +30 -0
- package/dist/db/migrations/learnings.d.ts +7 -0
- package/dist/db/migrations/learnings.js +26 -0
- package/dist/db/migrations/maintenance.d.ts +6 -0
- package/dist/db/migrations/maintenance.js +61 -0
- package/dist/db/migrations/memories.d.ts +7 -0
- package/dist/db/migrations/memories.js +16 -0
- package/dist/db/migrations/memory-places.d.ts +6 -0
- package/dist/db/migrations/memory-places.js +29 -0
- package/dist/db/migrations/places.d.ts +6 -0
- package/dist/db/migrations/places.js +43 -0
- package/dist/db/migrations/projects.d.ts +3 -0
- package/dist/db/migrations/projects.js +13 -0
- package/dist/db/migrations/tier-conversion.d.ts +7 -0
- package/dist/db/migrations/tier-conversion.js +20 -0
- package/dist/db/schema/beliefs.d.ts +9 -0
- package/dist/db/schema/beliefs.js +46 -0
- package/dist/db/schema/generator.d.ts +38 -0
- package/dist/db/schema/generator.js +108 -0
- package/dist/db/schema/index.d.ts +19 -20
- package/dist/db/schema/index.js +25 -79
- package/dist/db/schema/learnings.d.ts +7 -0
- package/dist/db/schema/learnings.js +30 -0
- package/dist/db/schema/memories.d.ts +7 -0
- package/dist/db/schema/memories.js +81 -0
- package/dist/db/schema/projects.d.ts +4 -0
- package/dist/db/schema/projects.js +31 -0
- package/dist/packages/mcp/src/index.d.ts +3 -0
- package/dist/packages/mcp/src/index.js +733 -0
- package/mcp.json.example +8 -11
- package/package.json +57 -76
- package/packages/cli/package.json +22 -0
- package/packages/cli/src/commands/clean.ts +68 -0
- package/packages/cli/src/commands/context.ts +79 -0
- package/packages/cli/src/commands/doctor.ts +357 -0
- package/packages/cli/src/commands/forget.ts +72 -0
- package/packages/cli/src/commands/health.ts +36 -0
- package/packages/cli/src/commands/inspect.ts +41 -0
- package/packages/cli/src/commands/link.ts +50 -0
- package/packages/cli/src/commands/migrate.ts +93 -0
- package/packages/cli/src/commands/recall.ts +99 -0
- package/packages/cli/src/commands/recent.ts +57 -0
- package/packages/cli/src/commands/remember.ts +139 -0
- package/packages/cli/src/commands/run.ts +58 -0
- package/packages/cli/src/commands/stale.ts +43 -0
- package/packages/cli/src/commands/stats.ts +42 -0
- package/packages/cli/src/index.ts +57 -0
- package/packages/cli/tsconfig.json +24 -0
- package/packages/mcp/package.json +26 -0
- package/packages/mcp/src/index.ts +877 -0
- package/packages/mcp/tsconfig.json +20 -0
- package/skills/squish-memory/SKILL.md +38 -35
- package/skills/squish-memory/{scripts/install.sh → install.sh} +1 -1
- package/skills/squish-memory/references/claude-desktop.json +12 -0
- package/skills/squish-memory/references/openclaw.json +13 -0
- package/skills/squish-memory/references/opencode.json +14 -0
- package/config/hooks/claude-code-hooks.json +0 -39
- package/config/hooks/cursor-hooks.json +0 -30
- package/config/hooks/opencode-hooks.json +0 -30
- package/config/hooks/windsurf-hooks.json +0 -30
- package/config/mcp-cli-fallback-policy.json +0 -22
- package/config/mcp.json +0 -38
- package/config/plugin-manifest.json +0 -101
- package/config/plugin-manifest.schema.json +0 -244
- package/config/plugin.json +0 -32
- package/config/remote-memory-policy.json +0 -32
- package/core/commands/context-paging.md +0 -51
- package/core/commands/context-status.md +0 -22
- package/core/commands/context.md +0 -5
- package/core/commands/core-memory.md +0 -56
- package/core/commands/health.md +0 -5
- package/core/commands/init.md +0 -39
- package/core/commands/merge.md +0 -113
- package/core/commands/recall.md +0 -5
- package/core/commands/remember.md +0 -11
- package/core/commands/search.md +0 -10
- package/dist/core/commands/managed-sync.d.ts +0 -10
- package/dist/core/commands/managed-sync.js +0 -64
- package/dist/core/external-folder/index.d.ts +0 -102
- package/dist/core/external-folder/index.js +0 -294
- package/dist/core/namespaces/index.d.ts +0 -71
- package/dist/core/namespaces/index.js +0 -305
- package/dist/core/namespaces/uri-parser.d.ts +0 -31
- package/dist/core/namespaces/uri-parser.js +0 -74
- package/dist/core/search/qmd-search.d.ts +0 -61
- package/dist/core/search/qmd-search.js +0 -178
- package/dist/core/session-hooks/self-iteration-job.d.ts +0 -20
- package/dist/core/session-hooks/self-iteration-job.js +0 -282
- package/dist/core/session-hooks/session-hooks.d.ts +0 -18
- package/dist/core/session-hooks/session-hooks.js +0 -58
- package/dist/core/snapshots.d.ts +0 -29
- package/dist/core/snapshots.js +0 -220
- package/dist/core/sync/qmd-sync.d.ts +0 -94
- package/dist/core/sync/qmd-sync.js +0 -201
- package/dist/index.d.ts +0 -7
- package/dist/index.js +0 -1677
- package/dist/vendor/sql.js/sql-wasm.wasm +0 -0
- package/dist/webui/server.d.ts +0 -5
- package/dist/webui/server.js +0 -642
- package/generated/mcp/manifest.json +0 -23
- package/generated/mcp/mcp-servers.json +0 -25
- package/generated/mcp/mcporter.json +0 -34
- package/generated/mcp/openclaw-memory-qmd.json +0 -17
- package/generated/mcp/runtime.json +0 -12
- package/scripts/README.md +0 -60
- package/scripts/build-release.sh +0 -36
- package/scripts/check-secrets.js +0 -132
- package/scripts/copy-runtime-assets.mjs +0 -26
- package/scripts/generate-mcp.mjs +0 -264
- package/scripts/github-release.sh +0 -77
- package/scripts/init-dirs.mjs +0 -13
- package/scripts/install-claude-code.sh +0 -85
- package/scripts/install-cursor.sh +0 -56
- package/scripts/install-hooks.sh +0 -73
- package/scripts/install-interactive.mjs +0 -357
- package/scripts/install-opencode.sh +0 -75
- package/scripts/install-plugin.mjs +0 -415
- package/scripts/install-windsurf.sh +0 -67
- package/scripts/remote-preflight.mjs +0 -62
- package/scripts/squish-fallback.mjs +0 -132
- package/scripts/test-interactive.mjs +0 -131
- package/scripts/verify-mcp.mjs +0 -214
- package/skills/squish-memory/scripts/install.mjs +0 -335
- package/skills/squish-memory/write_skill.js +0 -2
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Temporal Facts System
|
|
3
|
+
* Manages versioned facts with validity windows
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { and, eq, lte, gte, or, isNull, desc } from 'drizzle-orm';
|
|
7
|
+
import { randomUUID } from 'crypto';
|
|
8
|
+
import { getDb } from '../db/index.js';
|
|
9
|
+
import { getSchema } from '../db/schema.js';
|
|
10
|
+
import { traverseSupersededChain } from './utils/history-traversal.js';
|
|
11
|
+
import { createNewFactVersion } from './utils/version-management.js';
|
|
12
|
+
import { buildFactAtTimeQuery } from './utils/temporal-queries.js';
|
|
13
|
+
import { logger } from './logger.js';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Store a new fact with temporal validity
|
|
17
|
+
*/
|
|
18
|
+
export async function storeFact(
|
|
19
|
+
content: string,
|
|
20
|
+
options: {
|
|
21
|
+
validFrom?: Date;
|
|
22
|
+
validTo?: Date;
|
|
23
|
+
confidence?: number;
|
|
24
|
+
tags?: string[];
|
|
25
|
+
projectId?: string;
|
|
26
|
+
} = {}
|
|
27
|
+
): Promise<string> {
|
|
28
|
+
try {
|
|
29
|
+
const db = await getDb();
|
|
30
|
+
const schema = await getSchema();
|
|
31
|
+
|
|
32
|
+
const factId = randomUUID();
|
|
33
|
+
|
|
34
|
+
await (db as any).insert(schema.memories).values({
|
|
35
|
+
id: factId,
|
|
36
|
+
type: 'fact',
|
|
37
|
+
sector: 'semantic',
|
|
38
|
+
content,
|
|
39
|
+
confidence: options.confidence || 100,
|
|
40
|
+
validFrom: options.validFrom || new Date(),
|
|
41
|
+
validTo: options.validTo || null,
|
|
42
|
+
version: 1,
|
|
43
|
+
tags: options.tags || [],
|
|
44
|
+
projectId: options.projectId || null,
|
|
45
|
+
createdAt: new Date(),
|
|
46
|
+
updatedAt: new Date(),
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
return factId;
|
|
50
|
+
} catch (error) {
|
|
51
|
+
logger.error('Error storing fact', error);
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Update a fact by creating a new version
|
|
58
|
+
*/
|
|
59
|
+
export async function updateFact(
|
|
60
|
+
previousFactId: string,
|
|
61
|
+
newContent: string,
|
|
62
|
+
reason: string
|
|
63
|
+
): Promise<string> {
|
|
64
|
+
return createNewFactVersion(previousFactId, newContent, {}, reason);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Query facts valid at a specific point in time
|
|
69
|
+
*/
|
|
70
|
+
export async function queryFactsAtTime(
|
|
71
|
+
timestamp: Date = new Date(),
|
|
72
|
+
options: {
|
|
73
|
+
minConfidence?: number;
|
|
74
|
+
tags?: string[];
|
|
75
|
+
projectId?: string;
|
|
76
|
+
limit?: number;
|
|
77
|
+
} = {}
|
|
78
|
+
): Promise<any[]> {
|
|
79
|
+
try {
|
|
80
|
+
const db = await getDb();
|
|
81
|
+
const schema = await getSchema();
|
|
82
|
+
|
|
83
|
+
const minConfidence = options.minConfidence || 0;
|
|
84
|
+
const limit = options.limit || 100;
|
|
85
|
+
|
|
86
|
+
const additionalFilters = [gte(schema.memories.confidence as any, minConfidence)];
|
|
87
|
+
if (options.projectId) {
|
|
88
|
+
additionalFilters.push(eq(schema.memories.projectId, options.projectId));
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const where = buildFactAtTimeQuery(schema, timestamp, additionalFilters);
|
|
92
|
+
|
|
93
|
+
const results = await (db as any)
|
|
94
|
+
.select()
|
|
95
|
+
.from(schema.memories)
|
|
96
|
+
.where(where)
|
|
97
|
+
.orderBy(desc(schema.memories.confidence))
|
|
98
|
+
.limit(limit);
|
|
99
|
+
|
|
100
|
+
return results;
|
|
101
|
+
} catch (error) {
|
|
102
|
+
logger.error('Error querying facts at time', error);
|
|
103
|
+
return [];
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Get the complete version history of a fact
|
|
109
|
+
*/
|
|
110
|
+
export async function getFactHistory(factId: string): Promise<any[]> {
|
|
111
|
+
return traverseSupersededChain(factId);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Apply confidence decay based on temporal distance
|
|
116
|
+
*/
|
|
117
|
+
export async function applyConfidenceDecay(factId: string, ageDays: number): Promise<void> {
|
|
118
|
+
try {
|
|
119
|
+
const db = await getDb();
|
|
120
|
+
const schema = await getSchema();
|
|
121
|
+
|
|
122
|
+
// Confidence decays exponentially: newConfidence = originalConfidence * e^(-lambda * ageDays)
|
|
123
|
+
// Using lambda = 0.01 for moderate decay
|
|
124
|
+
const decayFactor = Math.exp(-0.01 * ageDays);
|
|
125
|
+
|
|
126
|
+
const fact = await (db as any)
|
|
127
|
+
.select()
|
|
128
|
+
.from(schema.memories)
|
|
129
|
+
.where(eq(schema.memories.id, factId))
|
|
130
|
+
.limit(1);
|
|
131
|
+
|
|
132
|
+
if (fact.length === 0) return;
|
|
133
|
+
|
|
134
|
+
const newConfidence = Math.max(0, Math.floor(fact[0].confidence * decayFactor));
|
|
135
|
+
|
|
136
|
+
await (db as any)
|
|
137
|
+
.update(schema.memories)
|
|
138
|
+
.set({ confidence: newConfidence })
|
|
139
|
+
.where(eq(schema.memories.id, factId));
|
|
140
|
+
} catch (error) {
|
|
141
|
+
logger.error('Error applying confidence decay', error);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Invalidate a fact (mark as no longer valid)
|
|
147
|
+
*/
|
|
148
|
+
export async function invalidateFact(factId: string, reason: string): Promise<void> {
|
|
149
|
+
try {
|
|
150
|
+
const db = await getDb();
|
|
151
|
+
const schema = await getSchema();
|
|
152
|
+
|
|
153
|
+
await (db as any)
|
|
154
|
+
.update(schema.memories)
|
|
155
|
+
.set({
|
|
156
|
+
validTo: new Date(),
|
|
157
|
+
metadata: { invalidationReason: reason, invalidatedAt: new Date().toISOString() },
|
|
158
|
+
})
|
|
159
|
+
.where(eq(schema.memories.id, factId));
|
|
160
|
+
} catch (error) {
|
|
161
|
+
logger.error('Error invalidating fact', error);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Check if a fact is currently valid
|
|
167
|
+
*/
|
|
168
|
+
export async function isFactValid(factId: string, atTime: Date = new Date()): Promise<boolean> {
|
|
169
|
+
try {
|
|
170
|
+
const db = await getDb();
|
|
171
|
+
const schema = await getSchema();
|
|
172
|
+
|
|
173
|
+
const additionalFilters = [eq(schema.memories.id, factId)];
|
|
174
|
+
const where = buildFactAtTimeQuery(schema, atTime, additionalFilters);
|
|
175
|
+
|
|
176
|
+
const fact = await (db as any)
|
|
177
|
+
.select()
|
|
178
|
+
.from(schema.memories)
|
|
179
|
+
.where(where)
|
|
180
|
+
.limit(1);
|
|
181
|
+
|
|
182
|
+
return fact.length > 0;
|
|
183
|
+
} catch (error) {
|
|
184
|
+
logger.error('Error checking fact validity', error);
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Get statistics about facts
|
|
191
|
+
*/
|
|
192
|
+
export async function getFactStats(projectId?: string): Promise<{
|
|
193
|
+
totalFacts: number;
|
|
194
|
+
activeFacts: number;
|
|
195
|
+
expiredFacts: number;
|
|
196
|
+
avgConfidence: number;
|
|
197
|
+
avgAge: number;
|
|
198
|
+
}> {
|
|
199
|
+
try {
|
|
200
|
+
const db = await getDb();
|
|
201
|
+
const schema = await getSchema();
|
|
202
|
+
|
|
203
|
+
const now = new Date();
|
|
204
|
+
const where = projectId
|
|
205
|
+
? and(eq(schema.memories.type as any, 'fact'), eq(schema.memories.projectId, projectId))
|
|
206
|
+
: eq(schema.memories.type as any, 'fact');
|
|
207
|
+
|
|
208
|
+
const facts = await (db as any).select().from(schema.memories).where(where);
|
|
209
|
+
|
|
210
|
+
let active = 0;
|
|
211
|
+
let expired = 0;
|
|
212
|
+
let totalConfidence = 0;
|
|
213
|
+
let totalAge = 0;
|
|
214
|
+
|
|
215
|
+
for (const fact of facts) {
|
|
216
|
+
totalConfidence += fact.confidence || 0;
|
|
217
|
+
|
|
218
|
+
if (fact.validTo && new Date(fact.validTo) < now) {
|
|
219
|
+
expired++;
|
|
220
|
+
} else if (!fact.validTo || new Date(fact.validTo) >= now) {
|
|
221
|
+
active++;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
totalAge += (now.getTime() - new Date(fact.createdAt).getTime()) / (1000 * 60 * 60 * 24);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
return {
|
|
228
|
+
totalFacts: facts.length,
|
|
229
|
+
activeFacts: active,
|
|
230
|
+
expiredFacts: expired,
|
|
231
|
+
avgConfidence: facts.length > 0 ? totalConfidence / facts.length : 0,
|
|
232
|
+
avgAge: facts.length > 0 ? totalAge / facts.length : 0,
|
|
233
|
+
};
|
|
234
|
+
} catch (error) {
|
|
235
|
+
logger.error('Error getting fact stats', error);
|
|
236
|
+
return {
|
|
237
|
+
totalFacts: 0,
|
|
238
|
+
activeFacts: 0,
|
|
239
|
+
expiredFacts: 0,
|
|
240
|
+
avgConfidence: 0,
|
|
241
|
+
avgAge: 0,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
}
|
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
/** Trace Collector - Collects search pipeline traces for debugging and performance analysis
|
|
2
|
+
*
|
|
3
|
+
* Trace storage format - All search operations are logged with timing information
|
|
4
|
+
* Trace retrieval - Get traces by session or ID
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { logger } from '../logger.js';
|
|
8
|
+
import { getDb } from '../../db/index.js';
|
|
9
|
+
import { getSchema } from '../../db/schema.js';
|
|
10
|
+
import { eq, desc, sql } from 'drizzle-orm';
|
|
11
|
+
|
|
12
|
+
export interface SearchTrace {
|
|
13
|
+
id: string; // UUID of this trace
|
|
14
|
+
sessionId: string | null; // Session that originated this trace
|
|
15
|
+
query: string;
|
|
16
|
+
timestamp: Date; // When trace started
|
|
17
|
+
totalDurationMs: number; // Total trace duration in milliseconds
|
|
18
|
+
metadata: Record<string, unknown>; // Additional metadata about the trace
|
|
19
|
+
// Stage data (stored as JSONB in schema)
|
|
20
|
+
queryRewrite?: QueryRewriteStage;
|
|
21
|
+
candidateRetrieval?: RetrievalStage;
|
|
22
|
+
entityFiltering?: RetrievalStage;
|
|
23
|
+
hybridScoring?: ScoringStage;
|
|
24
|
+
reranking?: RerankingStage;
|
|
25
|
+
resultCount?: number;
|
|
26
|
+
topResults?: TopResult[];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface QueryRewriteStage {
|
|
30
|
+
original?: string;
|
|
31
|
+
rewritten?: string;
|
|
32
|
+
method?: string;
|
|
33
|
+
timeMs?: number;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface RetrievalStage {
|
|
37
|
+
candidates?: number;
|
|
38
|
+
results?: number;
|
|
39
|
+
timeMs?: number;
|
|
40
|
+
entities?: string[];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface ScoringStage {
|
|
44
|
+
results?: number;
|
|
45
|
+
timeMs?: number;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export interface RerankingStage {
|
|
49
|
+
results?: number;
|
|
50
|
+
timeMs?: number;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface TopResult {
|
|
54
|
+
type?: string;
|
|
55
|
+
content?: string;
|
|
56
|
+
hybridScore?: number;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export interface TraceOptions {
|
|
60
|
+
sessionId?: string;
|
|
61
|
+
limit?: number; // Limit traces to retrieve
|
|
62
|
+
session?: string; // Filter by session ID
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export interface TraceStats {
|
|
66
|
+
totalTraces: number;
|
|
67
|
+
totalDurationMs: number;
|
|
68
|
+
avgDurationMs: number;
|
|
69
|
+
recentSessions: number;
|
|
70
|
+
totalErrors: number;
|
|
71
|
+
errorRate: number;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Start a new search trace collection
|
|
76
|
+
*/
|
|
77
|
+
export async function startTrace(sessionId: string, query: string): Promise<string> {
|
|
78
|
+
const db = await getDb();
|
|
79
|
+
if (!db) {
|
|
80
|
+
logger.error('Database unavailable for trace collection');
|
|
81
|
+
return '';
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const schema = await getSchema();
|
|
85
|
+
const sqliteDb = db as any;
|
|
86
|
+
|
|
87
|
+
const traceId = crypto.randomUUID();
|
|
88
|
+
const timestamp = new Date();
|
|
89
|
+
|
|
90
|
+
// Create trace record
|
|
91
|
+
await sqliteDb.insert(schema.searchTraces).values({
|
|
92
|
+
id: traceId,
|
|
93
|
+
sessionId,
|
|
94
|
+
query,
|
|
95
|
+
timestamp,
|
|
96
|
+
resultCount: 0,
|
|
97
|
+
totalDurationMs: 0,
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
logger.info(`[Tracing] Started trace ${traceId}`);
|
|
101
|
+
|
|
102
|
+
return traceId;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Add query rewrite stage data
|
|
107
|
+
*/
|
|
108
|
+
export async function addQueryRewriteStage(traceId: string, stage: QueryRewriteStage): Promise<void> {
|
|
109
|
+
const db = await getDb();
|
|
110
|
+
if (!db) return;
|
|
111
|
+
|
|
112
|
+
const schema = await getSchema();
|
|
113
|
+
const sqliteDb = db as any;
|
|
114
|
+
const data = JSON.stringify(stage);
|
|
115
|
+
|
|
116
|
+
await sqliteDb.update(schema.searchTraces)
|
|
117
|
+
.set({
|
|
118
|
+
queryRewrite: sql`CAST(? AS jsonb)`,
|
|
119
|
+
})
|
|
120
|
+
.where(eq(schema.searchTraces.id, traceId))
|
|
121
|
+
.set({ queryRewrite: data });
|
|
122
|
+
|
|
123
|
+
logger.debug(`[Tracing] Added queryRewrite stage to trace ${traceId}`);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Add candidate retrieval stage data
|
|
128
|
+
*/
|
|
129
|
+
export async function addCandidateRetrievalStage(traceId: string, stage: RetrievalStage): Promise<void> {
|
|
130
|
+
const db = await getDb();
|
|
131
|
+
if (!db) return;
|
|
132
|
+
|
|
133
|
+
const schema = await getSchema();
|
|
134
|
+
const sqliteDb = db as any;
|
|
135
|
+
const data = JSON.stringify(stage);
|
|
136
|
+
|
|
137
|
+
await sqliteDb.update(schema.searchTraces)
|
|
138
|
+
.set({ candidateRetrieval: data })
|
|
139
|
+
.where(eq(schema.searchTraces.id, traceId));
|
|
140
|
+
|
|
141
|
+
logger.debug(`[Tracing] Added candidateRetrieval stage to trace ${traceId}`);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Add entity filtering stage data
|
|
146
|
+
*/
|
|
147
|
+
export async function addEntityFilteringStage(traceId: string, stage: RetrievalStage): Promise<void> {
|
|
148
|
+
const db = await getDb();
|
|
149
|
+
if (!db) return;
|
|
150
|
+
|
|
151
|
+
const schema = await getSchema();
|
|
152
|
+
const sqliteDb = db as any;
|
|
153
|
+
const data = JSON.stringify(stage);
|
|
154
|
+
|
|
155
|
+
await sqliteDb.update(schema.searchTraces)
|
|
156
|
+
.set({ entityFiltering: data })
|
|
157
|
+
.where(eq(schema.searchTraces.id, traceId));
|
|
158
|
+
|
|
159
|
+
logger.debug(`[Tracing] Added entityFiltering stage to trace ${traceId}`);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Add hybrid scoring stage data
|
|
164
|
+
*/
|
|
165
|
+
export async function addHybridScoringStage(traceId: string, stage: ScoringStage): Promise<void> {
|
|
166
|
+
const db = await getDb();
|
|
167
|
+
if (!db) return;
|
|
168
|
+
|
|
169
|
+
const schema = await getSchema();
|
|
170
|
+
const sqliteDb = db as any;
|
|
171
|
+
const data = JSON.stringify(stage);
|
|
172
|
+
|
|
173
|
+
await sqliteDb.update(schema.searchTraces)
|
|
174
|
+
.set({ hybridScoring: data })
|
|
175
|
+
.where(eq(schema.searchTraces.id, traceId));
|
|
176
|
+
|
|
177
|
+
logger.debug(`[Tracing] Added hybridScoring stage to trace ${traceId}`);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Add reranking stage data
|
|
182
|
+
*/
|
|
183
|
+
export async function addRerankingStage(traceId: string, stage: RerankingStage): Promise<void> {
|
|
184
|
+
const db = await getDb();
|
|
185
|
+
if (!db) return;
|
|
186
|
+
|
|
187
|
+
const schema = await getSchema();
|
|
188
|
+
const sqliteDb = db as any;
|
|
189
|
+
const data = JSON.stringify(stage);
|
|
190
|
+
|
|
191
|
+
await sqliteDb.update(schema.searchTraces)
|
|
192
|
+
.set({ reranking: data })
|
|
193
|
+
.where(eq(schema.searchTraces.id, traceId));
|
|
194
|
+
|
|
195
|
+
logger.debug(`[Tracing] Added reranking stage to trace ${traceId}`);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Complete current trace (all stages done)
|
|
200
|
+
*/
|
|
201
|
+
export async function completeTrace(traceId: string, results: TopResult[]): Promise<void> {
|
|
202
|
+
const db = await getDb();
|
|
203
|
+
if (!db) return;
|
|
204
|
+
|
|
205
|
+
const schema = await getSchema();
|
|
206
|
+
const sqliteDb = db as any;
|
|
207
|
+
|
|
208
|
+
// Get trace
|
|
209
|
+
const rows = await sqliteDb.select()
|
|
210
|
+
.from(schema.searchTraces)
|
|
211
|
+
.where(eq(schema.searchTraces.id, traceId))
|
|
212
|
+
.limit(1);
|
|
213
|
+
|
|
214
|
+
if (!rows || rows.length === 0) {
|
|
215
|
+
logger.warn(`[Tracing] Trace ${traceId} not found`);
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
const trace = rows[0];
|
|
220
|
+
const startTime = trace.timestamp.getTime();
|
|
221
|
+
const endTime = Date.now();
|
|
222
|
+
const totalDurationMs = endTime - startTime;
|
|
223
|
+
|
|
224
|
+
const resultCount = results.length;
|
|
225
|
+
const topResults = results.slice(0, 10);
|
|
226
|
+
|
|
227
|
+
await sqliteDb.update(schema.searchTraces)
|
|
228
|
+
.set({
|
|
229
|
+
resultCount,
|
|
230
|
+
topResults: JSON.stringify(topResults),
|
|
231
|
+
totalDurationMs,
|
|
232
|
+
})
|
|
233
|
+
.where(eq(schema.searchTraces.id, traceId));
|
|
234
|
+
|
|
235
|
+
logger.info(`[Tracing] Completed trace ${traceId} with ${resultCount} results`);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Get traces for a session
|
|
240
|
+
*/
|
|
241
|
+
export async function getTraces(options: TraceOptions = {}): Promise<SearchTrace[]> {
|
|
242
|
+
const db = await getDb();
|
|
243
|
+
if (!db) return [];
|
|
244
|
+
|
|
245
|
+
const schema = await getSchema();
|
|
246
|
+
const sqliteDb = db as any;
|
|
247
|
+
|
|
248
|
+
let conditions = [];
|
|
249
|
+
|
|
250
|
+
if (options.sessionId) {
|
|
251
|
+
conditions.push(eq(schema.searchTraces.sessionId, options.sessionId));
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
if (options.session && options.session.length > 0) {
|
|
255
|
+
conditions.push(eq(schema.searchTraces.sessionId, options.session));
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
const query = sqliteDb.select()
|
|
259
|
+
.from(schema.searchTraces)
|
|
260
|
+
.where(conditions.length > 0 ? eq(schema.searchTraces.sessionId, options.sessionId || options.session || '') : undefined)
|
|
261
|
+
.orderBy(desc(schema.searchTraces.timestamp));
|
|
262
|
+
|
|
263
|
+
if (options.limit) {
|
|
264
|
+
query.limit(options.limit);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
const traces = await query;
|
|
268
|
+
|
|
269
|
+
return traces.map((row: any): SearchTrace => ({
|
|
270
|
+
id: row.id,
|
|
271
|
+
sessionId: row.session_id,
|
|
272
|
+
query: row.query,
|
|
273
|
+
timestamp: row.timestamp,
|
|
274
|
+
totalDurationMs: row.total_duration_ms,
|
|
275
|
+
metadata: row.metadata ? JSON.parse(String(row.metadata)) : {},
|
|
276
|
+
queryRewrite: row.query_rewrite ? JSON.parse(String(row.query_rewrite)) : undefined,
|
|
277
|
+
candidateRetrieval: row.candidate_retrieval ? JSON.parse(String(row.candidate_retrieval)) : undefined,
|
|
278
|
+
entityFiltering: row.entity_filtering ? JSON.parse(String(row.entity_filtering)) : undefined,
|
|
279
|
+
hybridScoring: row.hybrid_scoring ? JSON.parse(String(row.hybrid_scoring)) : undefined,
|
|
280
|
+
reranking: row.reranking ? JSON.parse(String(row.reranking)) : undefined,
|
|
281
|
+
resultCount: row.result_count,
|
|
282
|
+
topResults: row.top_results ? JSON.parse(String(row.top_results)) : undefined,
|
|
283
|
+
}));
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* Get a specific trace by ID
|
|
288
|
+
*/
|
|
289
|
+
export async function getTraceById(traceId: string): Promise<SearchTrace | null> {
|
|
290
|
+
const db = await getDb();
|
|
291
|
+
if (!db) return null;
|
|
292
|
+
|
|
293
|
+
const schema = await getSchema();
|
|
294
|
+
const sqliteDb = db as any;
|
|
295
|
+
|
|
296
|
+
const rows = await sqliteDb.select()
|
|
297
|
+
.from(schema.searchTraces)
|
|
298
|
+
.where(eq(schema.searchTraces.id, traceId))
|
|
299
|
+
.limit(1);
|
|
300
|
+
|
|
301
|
+
if (rows.length === 0) return null;
|
|
302
|
+
|
|
303
|
+
const row = rows[0];
|
|
304
|
+
|
|
305
|
+
return {
|
|
306
|
+
id: row.id,
|
|
307
|
+
sessionId: row.session_id,
|
|
308
|
+
query: row.query,
|
|
309
|
+
timestamp: row.timestamp,
|
|
310
|
+
totalDurationMs: row.total_duration_ms,
|
|
311
|
+
metadata: row.metadata ? JSON.parse(String(row.metadata)) : {},
|
|
312
|
+
queryRewrite: row.query_rewrite ? JSON.parse(String(row.query_rewrite)) : undefined,
|
|
313
|
+
candidateRetrieval: row.candidate_retrieval ? JSON.parse(String(row.candidate_retrieval)) : undefined,
|
|
314
|
+
entityFiltering: row.entity_filtering ? JSON.parse(String(row.entity_filtering)) : undefined,
|
|
315
|
+
hybridScoring: row.hybrid_scoring ? JSON.parse(String(row.hybrid_scoring)) : undefined,
|
|
316
|
+
reranking: row.reranking ? JSON.parse(String(row.reranking)) : undefined,
|
|
317
|
+
resultCount: row.result_count,
|
|
318
|
+
topResults: row.top_results ? JSON.parse(String(row.top_results)) : undefined,
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Get recent traces (limited)
|
|
324
|
+
*/
|
|
325
|
+
export async function getRecentTraces(limit: number = 10): Promise<SearchTrace[]> {
|
|
326
|
+
const db = await getDb();
|
|
327
|
+
if (!db) return [];
|
|
328
|
+
|
|
329
|
+
const schema = await getSchema();
|
|
330
|
+
const sqliteDb = db as any;
|
|
331
|
+
|
|
332
|
+
const traces = await sqliteDb.select()
|
|
333
|
+
.from(schema.searchTraces)
|
|
334
|
+
.orderBy(desc(schema.searchTraces.timestamp))
|
|
335
|
+
.limit(limit);
|
|
336
|
+
|
|
337
|
+
return traces.map((row: any): SearchTrace => ({
|
|
338
|
+
id: row.id,
|
|
339
|
+
sessionId: row.session_id,
|
|
340
|
+
query: row.query,
|
|
341
|
+
timestamp: row.timestamp,
|
|
342
|
+
totalDurationMs: row.total_duration_ms,
|
|
343
|
+
metadata: row.metadata ? JSON.parse(String(row.metadata)) : {},
|
|
344
|
+
queryRewrite: row.query_rewrite ? JSON.parse(String(row.query_rewrite)) : undefined,
|
|
345
|
+
candidateRetrieval: row.candidate_retrieval ? JSON.parse(String(row.candidate_retrieval)) : undefined,
|
|
346
|
+
entityFiltering: row.entity_filtering ? JSON.parse(String(row.entity_filtering)) : undefined,
|
|
347
|
+
hybridScoring: row.hybrid_scoring ? JSON.parse(String(row.hybrid_scoring)) : undefined,
|
|
348
|
+
reranking: row.reranking ? JSON.parse(String(row.reranking)) : undefined,
|
|
349
|
+
resultCount: row.result_count,
|
|
350
|
+
topResults: row.top_results ? JSON.parse(String(row.top_results)) : undefined,
|
|
351
|
+
}));
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/**
|
|
355
|
+
* Get recent session summary traces (aggregated by session)
|
|
356
|
+
*/
|
|
357
|
+
export async function getSessionTraces(sessionId: string): Promise<SearchTrace[]> {
|
|
358
|
+
const db = await getDb();
|
|
359
|
+
if (!db) return [];
|
|
360
|
+
|
|
361
|
+
const schema = await getSchema();
|
|
362
|
+
const sqliteDb = db as any;
|
|
363
|
+
|
|
364
|
+
// Get all traces for this session
|
|
365
|
+
const traces = await sqliteDb.select()
|
|
366
|
+
.from(schema.searchTraces)
|
|
367
|
+
.where(eq(schema.searchTraces.sessionId, sessionId))
|
|
368
|
+
.orderBy(desc(schema.searchTraces.timestamp));
|
|
369
|
+
|
|
370
|
+
if (traces.length === 0) return [];
|
|
371
|
+
|
|
372
|
+
return traces.map((row: any): SearchTrace => ({
|
|
373
|
+
id: row.id,
|
|
374
|
+
sessionId: row.session_id,
|
|
375
|
+
query: row.query,
|
|
376
|
+
timestamp: row.timestamp,
|
|
377
|
+
totalDurationMs: row.total_duration_ms,
|
|
378
|
+
metadata: row.metadata ? JSON.parse(String(row.metadata)) : {},
|
|
379
|
+
queryRewrite: row.query_rewrite ? JSON.parse(String(row.query_rewrite)) : undefined,
|
|
380
|
+
candidateRetrieval: row.candidate_retrieval ? JSON.parse(String(row.candidate_retrieval)) : undefined,
|
|
381
|
+
entityFiltering: row.entity_filtering ? JSON.parse(String(row.entity_filtering)) : undefined,
|
|
382
|
+
hybridScoring: row.hybrid_scoring ? JSON.parse(String(row.hybrid_scoring)) : undefined,
|
|
383
|
+
reranking: row.reranking ? JSON.parse(String(row.reranking)) : undefined,
|
|
384
|
+
resultCount: row.result_count,
|
|
385
|
+
topResults: row.top_results ? JSON.parse(String(row.top_results)) : undefined,
|
|
386
|
+
}));
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* Create visual ASCII visualization of a trace
|
|
391
|
+
*/
|
|
392
|
+
export function visualizeTrace(trace: SearchTrace): string {
|
|
393
|
+
const lines: string[] = [];
|
|
394
|
+
|
|
395
|
+
// Header
|
|
396
|
+
lines.push(`Search Trace: ${trace.id}`);
|
|
397
|
+
lines.push(`Session: ${trace.sessionId || 'N/A'}`);
|
|
398
|
+
lines.push(`Query: "${trace.query}"`);
|
|
399
|
+
lines.push('');
|
|
400
|
+
|
|
401
|
+
// Total duration
|
|
402
|
+
lines.push(`Duration: ${trace.totalDurationMs}ms (${(trace.totalDurationMs / 1000).toFixed(2)}s)`);
|
|
403
|
+
lines.push('');
|
|
404
|
+
|
|
405
|
+
// Stages summary
|
|
406
|
+
const stageNames: string[] = [];
|
|
407
|
+
if (trace.queryRewrite) stageNames.push(`Query Rewrite (${trace.queryRewrite.timeMs || 0}ms)`);
|
|
408
|
+
if (trace.candidateRetrieval) stageNames.push(`Candidate Retrieval (${trace.candidateRetrieval.timeMs || 0}ms)`);
|
|
409
|
+
if (trace.entityFiltering) stageNames.push(`Entity Filtering (${trace.entityFiltering.timeMs || 0}ms)`);
|
|
410
|
+
if (trace.hybridScoring) stageNames.push(`Hybrid Scoring (${trace.hybridScoring.timeMs || 0}ms)`);
|
|
411
|
+
if (trace.reranking) stageNames.push(`Reranking (${trace.reranking.timeMs || 0}ms)`);
|
|
412
|
+
|
|
413
|
+
if (stageNames.length > 0) {
|
|
414
|
+
lines.push('Stages:');
|
|
415
|
+
stageNames.forEach(name => lines.push(` - ${name}`));
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
lines.push('');
|
|
419
|
+
|
|
420
|
+
// Top results
|
|
421
|
+
if (trace.topResults && trace.topResults.length > 0) {
|
|
422
|
+
lines.push(`Top Results (${trace.topResults.length}):`);
|
|
423
|
+
|
|
424
|
+
trace.topResults.slice(0, 5).forEach((result, i) =>
|
|
425
|
+
lines.push(` ${i + 1}. [${result.type || 'memory'}] ${result.content?.substring(0, 50)}... (score: ${result.hybridScore?.toFixed(2)})`)
|
|
426
|
+
);
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
return lines.join('\n');
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
/**
|
|
433
|
+
* Get trace statistics (performance metrics)
|
|
434
|
+
*/
|
|
435
|
+
export async function getTraceStats(): Promise<TraceStats> {
|
|
436
|
+
const db = await getDb();
|
|
437
|
+
if (!db) {
|
|
438
|
+
return {
|
|
439
|
+
totalTraces: 0,
|
|
440
|
+
totalDurationMs: 0,
|
|
441
|
+
avgDurationMs: 0,
|
|
442
|
+
recentSessions: 0,
|
|
443
|
+
totalErrors: 0,
|
|
444
|
+
errorRate: 0,
|
|
445
|
+
};
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
const schema = await getSchema();
|
|
449
|
+
const sqliteDb = db as any;
|
|
450
|
+
|
|
451
|
+
const traces = await sqliteDb.select()
|
|
452
|
+
.from(schema.searchTraces)
|
|
453
|
+
.limit(100);
|
|
454
|
+
|
|
455
|
+
const totalTraces = traces.length;
|
|
456
|
+
const totalDurationMs = traces.reduce((sum: number, t: any) => sum + (t.total_duration_ms || 0), 0);
|
|
457
|
+
const avgDurationMs = totalTraces > 0 ? Math.round(totalDurationMs / totalTraces) : 0;
|
|
458
|
+
|
|
459
|
+
const uniqueSessions = new Set(traces.map((t: any) => t.session_id).filter(Boolean));
|
|
460
|
+
const recentSessions = uniqueSessions.size;
|
|
461
|
+
|
|
462
|
+
return {
|
|
463
|
+
totalTraces,
|
|
464
|
+
totalDurationMs,
|
|
465
|
+
avgDurationMs,
|
|
466
|
+
recentSessions,
|
|
467
|
+
totalErrors: 0,
|
|
468
|
+
errorRate: 0,
|
|
469
|
+
};
|
|
470
|
+
}
|