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,195 @@
|
|
|
1
|
+
/** Trace Visualizer - Creates ASCII visualizations of search traces
|
|
2
|
+
*
|
|
3
|
+
* Provides tree-format output showing search pipeline stages and timing
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { logger } from '../logger.js';
|
|
7
|
+
import { SearchTrace } from './collector.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Create visual ASCII visualization of a trace
|
|
11
|
+
*/
|
|
12
|
+
export function visualizeTrace(trace: SearchTrace): string {
|
|
13
|
+
const lines: string[] = [];
|
|
14
|
+
|
|
15
|
+
// Header
|
|
16
|
+
lines.push('='.repeat(60));
|
|
17
|
+
lines.push(`Search Trace: ${trace.id}`);
|
|
18
|
+
lines.push(`Session: ${trace.sessionId || 'N/A'}`);
|
|
19
|
+
lines.push(`Query: "${trace.query}"`);
|
|
20
|
+
lines.push('='.repeat(60));
|
|
21
|
+
lines.push('');
|
|
22
|
+
|
|
23
|
+
// Total duration
|
|
24
|
+
lines.push(`Total Duration: ${trace.totalDurationMs}ms (${(trace.totalDurationMs / 1000).toFixed(2)}s)`);
|
|
25
|
+
lines.push('');
|
|
26
|
+
|
|
27
|
+
// Stage timeline visualization
|
|
28
|
+
lines.push('─'.repeat(60));
|
|
29
|
+
lines.push('Pipeline Stages:');
|
|
30
|
+
lines.push('─'.repeat(60));
|
|
31
|
+
lines.push('');
|
|
32
|
+
|
|
33
|
+
const stageNames: string[] = [];
|
|
34
|
+
const stageTimings: number[] = [];
|
|
35
|
+
|
|
36
|
+
if (trace.queryRewrite) {
|
|
37
|
+
stageNames.push('Query Rewrite');
|
|
38
|
+
stageTimings.push(trace.queryRewrite.timeMs || 0);
|
|
39
|
+
}
|
|
40
|
+
if (trace.candidateRetrieval) {
|
|
41
|
+
stageNames.push('Candidate Retrieval');
|
|
42
|
+
stageTimings.push(trace.candidateRetrieval.timeMs || 0);
|
|
43
|
+
}
|
|
44
|
+
if (trace.entityFiltering) {
|
|
45
|
+
stageNames.push('Entity Filtering');
|
|
46
|
+
stageTimings.push(trace.entityFiltering.timeMs || 0);
|
|
47
|
+
}
|
|
48
|
+
if (trace.hybridScoring) {
|
|
49
|
+
stageNames.push('Hybrid Scoring');
|
|
50
|
+
stageTimings.push(trace.hybridScoring.timeMs || 0);
|
|
51
|
+
}
|
|
52
|
+
if (trace.reranking) {
|
|
53
|
+
stageNames.push('Reranking');
|
|
54
|
+
stageTimings.push(trace.reranking.timeMs || 0);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (stageNames.length > 0) {
|
|
58
|
+
let cumulativeTime = 0;
|
|
59
|
+
const maxStageNameLength = Math.max(...stageNames.map(n => n.length));
|
|
60
|
+
|
|
61
|
+
stageNames.forEach((name, i) => {
|
|
62
|
+
const duration = stageTimings[i] || 0;
|
|
63
|
+
cumulativeTime += duration;
|
|
64
|
+
const progressPercent = ((cumulativeTime / trace.totalDurationMs) * 100).toFixed(1);
|
|
65
|
+
const barLength = Math.max(0, Math.min(40, Math.round((duration / trace.totalDurationMs) * 40)));
|
|
66
|
+
|
|
67
|
+
// Stage name with timing
|
|
68
|
+
const paddedName = name.padEnd(maxStageNameLength + 2);
|
|
69
|
+
lines.push(`${paddedName} │ ${duration.toString().padStart(4)}ms │ ${progressPercent.padStart(5)}%`);
|
|
70
|
+
|
|
71
|
+
// Visualization bar
|
|
72
|
+
const bar = '█'.repeat(barLength) + '░'.repeat(40 - barLength);
|
|
73
|
+
lines.push(` └─ ${bar}`);
|
|
74
|
+
|
|
75
|
+
lines.push('');
|
|
76
|
+
});
|
|
77
|
+
} else {
|
|
78
|
+
lines.push(' No stage data available');
|
|
79
|
+
lines.push('');
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Top results
|
|
83
|
+
if (trace.topResults && trace.topResults.length > 0) {
|
|
84
|
+
lines.push('─'.repeat(60));
|
|
85
|
+
lines.push(`Top Results (${trace.topResults.length}):`);
|
|
86
|
+
lines.push('─'.repeat(60));
|
|
87
|
+
lines.push('');
|
|
88
|
+
|
|
89
|
+
trace.topResults.slice(0, 5).forEach((result, i) => {
|
|
90
|
+
const type = result.type || 'memory';
|
|
91
|
+
const content = result.content?.substring(0, 60) || '';
|
|
92
|
+
const score = result.hybridScore?.toFixed(2) || 'N/A';
|
|
93
|
+
lines.push(`${(i + 1).toString().padStart(2)}. [${type.padEnd(8)}] (score: ${score})`);
|
|
94
|
+
if (content.length > 0) {
|
|
95
|
+
lines.push(` ${content}`);
|
|
96
|
+
}
|
|
97
|
+
lines.push('');
|
|
98
|
+
});
|
|
99
|
+
} else if (trace.resultCount !== undefined) {
|
|
100
|
+
lines.push('─'.repeat(60));
|
|
101
|
+
lines.push(`Results: ${trace.resultCount} returned`);
|
|
102
|
+
lines.push('─'.repeat(60));
|
|
103
|
+
lines.push('');
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Footer
|
|
107
|
+
lines.push('='.repeat(60));
|
|
108
|
+
lines.push('');
|
|
109
|
+
|
|
110
|
+
return lines.join('\n');
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Create compact single-line trace summary
|
|
115
|
+
*/
|
|
116
|
+
export function summarizeTrace(trace: SearchTrace): string {
|
|
117
|
+
const parts: string[] = [];
|
|
118
|
+
|
|
119
|
+
parts.push(`[${trace.id.substring(0, 8)}]`);
|
|
120
|
+
parts.push(`"${trace.query.substring(0, 30)}${trace.query.length > 30 ? '...' : ''}"`);
|
|
121
|
+
parts.push(`${trace.totalDurationMs}ms`);
|
|
122
|
+
parts.push(trace.resultCount !== undefined ? `${trace.resultCount} results` : 'unknown');
|
|
123
|
+
|
|
124
|
+
return parts.join(' | ');
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Compare multiple traces
|
|
129
|
+
*/
|
|
130
|
+
export function compareTraces(traces: SearchTrace[]): string {
|
|
131
|
+
const lines: string[] = [];
|
|
132
|
+
|
|
133
|
+
lines.push('─'.repeat(80));
|
|
134
|
+
lines.push('Trace Comparison');
|
|
135
|
+
lines.push('─'.repeat(80));
|
|
136
|
+
lines.push('');
|
|
137
|
+
lines.push('ID'.padEnd(10) + ' | ' + 'Query'.padEnd(30) + ' | ' + 'Duration'.padEnd(10) + ' | ' + 'Results');
|
|
138
|
+
lines.push('─'.repeat(80));
|
|
139
|
+
|
|
140
|
+
traces.forEach(trace => {
|
|
141
|
+
const id = trace.id.substring(0, 8);
|
|
142
|
+
const query = trace.query.substring(0, 30);
|
|
143
|
+
const duration = `${trace.totalDurationMs}ms`;
|
|
144
|
+
const results = trace.resultCount !== undefined ? trace.resultCount.toString() : '?';
|
|
145
|
+
lines.push(`${id.padEnd(10)} | ${query.padEnd(30)} | ${duration.padEnd(10)} | ${results.padEnd(8)}`);
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
return lines.join('\n');
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Get stage breakdown table
|
|
153
|
+
*/
|
|
154
|
+
export function getStageBreakdown(trace: SearchTrace): string {
|
|
155
|
+
const lines: string[] = [];
|
|
156
|
+
|
|
157
|
+
lines.push('Stage Timing Breakdown:');
|
|
158
|
+
lines.push('');
|
|
159
|
+
|
|
160
|
+
const stages = [
|
|
161
|
+
{ name: 'Query Rewrite', data: trace.queryRewrite, timeMs: trace.queryRewrite?.timeMs || 0 },
|
|
162
|
+
{ name: 'Candidate Retrieval', data: trace.candidateRetrieval, timeMs: trace.candidateRetrieval?.timeMs || 0 },
|
|
163
|
+
{ name: 'Entity Filtering', data: trace.entityFiltering, timeMs: trace.entityFiltering?.timeMs || 0 },
|
|
164
|
+
{ name: 'Hybrid Scoring', data: trace.hybridScoring, timeMs: trace.hybridScoring?.timeMs || 0 },
|
|
165
|
+
{ name: 'Reranking', data: trace.reranking, timeMs: trace.reranking?.timeMs || 0 },
|
|
166
|
+
];
|
|
167
|
+
|
|
168
|
+
const validStages = stages.filter(s => s.data && s.timeMs !== undefined);
|
|
169
|
+
|
|
170
|
+
if (validStages.length > 0) {
|
|
171
|
+
const maxNameLength = Math.max(...validStages.map(s => s.name.length));
|
|
172
|
+
|
|
173
|
+
validStages.forEach(stage => {
|
|
174
|
+
const percentage = ((stage.timeMs / trace.totalDurationMs) * 100).toFixed(1);
|
|
175
|
+
lines.push(` ${stage.name.padEnd(maxNameLength)} │ ${stage.timeMs.toString().padStart(4)}ms │ ${percentage.padStart(5)}%`);
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
lines.push('');
|
|
179
|
+
lines.push(' ' + '─'.repeat(maxNameLength + 4 + 5 + 6));
|
|
180
|
+
} else {
|
|
181
|
+
lines.push(' No stage timing data available');
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
return lines.join('\n');
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Export all visualizer functions
|
|
189
|
+
*/
|
|
190
|
+
export default {
|
|
191
|
+
visualizeTrace,
|
|
192
|
+
summarizeTrace,
|
|
193
|
+
compareTraces,
|
|
194
|
+
getStageBreakdown,
|
|
195
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Cleanup Operations Utilities
|
|
3
|
+
* Common patterns for age-based cleanup operations
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { getDb } from '../../db/index.js';
|
|
7
|
+
import { getSchema } from '../../db/schema.js';
|
|
8
|
+
import { logger } from '../logger.js';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Cleanup old session summaries
|
|
12
|
+
*/
|
|
13
|
+
export async function cleanupOldSessionSummaries(olderThanDays: number = 30): Promise<number> {
|
|
14
|
+
try {
|
|
15
|
+
const db = await getDb();
|
|
16
|
+
const schema = await getSchema();
|
|
17
|
+
|
|
18
|
+
const threshold = new Date(Date.now() - olderThanDays * 24 * 60 * 60 * 1000);
|
|
19
|
+
|
|
20
|
+
const result = await (db as any)
|
|
21
|
+
.delete(schema.sessionSummaries)
|
|
22
|
+
.where((schema.sessionSummaries.createdAt as any) < threshold);
|
|
23
|
+
|
|
24
|
+
return result?.rowCount || 0;
|
|
25
|
+
} catch (error) {
|
|
26
|
+
logger.error('Error pruning old summaries', error);
|
|
27
|
+
return 0;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Cleanup old memory snapshots
|
|
33
|
+
*/
|
|
34
|
+
export async function cleanupOldMemorySnapshots(olderThanDays: number = 90): Promise<number> {
|
|
35
|
+
try {
|
|
36
|
+
const db = await getDb();
|
|
37
|
+
const schema = await getSchema();
|
|
38
|
+
|
|
39
|
+
const threshold = new Date(Date.now() - olderThanDays * 24 * 60 * 60 * 1000);
|
|
40
|
+
|
|
41
|
+
const result = await (db as any)
|
|
42
|
+
.delete(schema.memorySnapshots)
|
|
43
|
+
.where((schema.memorySnapshots.createdAt as any) < threshold);
|
|
44
|
+
|
|
45
|
+
return result?.rowCount || 0;
|
|
46
|
+
} catch (error) {
|
|
47
|
+
logger.error('Error deleting old snapshots', error);
|
|
48
|
+
return 0;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Content Extraction Utilities
|
|
3
|
+
* Common patterns for extracting information from messages
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Extract key information from conversation messages
|
|
8
|
+
*/
|
|
9
|
+
export function extractMessageContent(messages: any[]): {
|
|
10
|
+
userMessages: any[];
|
|
11
|
+
assistantMessages: any[];
|
|
12
|
+
toolCalls: Set<string>;
|
|
13
|
+
topics: Set<string>;
|
|
14
|
+
timestamp: string;
|
|
15
|
+
} {
|
|
16
|
+
// Extract key information from messages
|
|
17
|
+
const userMessages = messages.filter((m: any) => m.role === 'user');
|
|
18
|
+
const assistantMessages = messages.filter((m: any) => m.role === 'assistant');
|
|
19
|
+
|
|
20
|
+
// Extract tool calls
|
|
21
|
+
const toolCalls = new Set<string>();
|
|
22
|
+
for (const msg of messages) {
|
|
23
|
+
if (msg.toolCalls && Array.isArray(msg.toolCalls)) {
|
|
24
|
+
for (const tc of msg.toolCalls) {
|
|
25
|
+
toolCalls.add(tc.name);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Extract topics from first and last user messages
|
|
31
|
+
const topics = new Set<string>();
|
|
32
|
+
if (userMessages.length > 0) {
|
|
33
|
+
const firstUser = userMessages[0].content || '';
|
|
34
|
+
const lastUser = userMessages[userMessages.length - 1].content || '';
|
|
35
|
+
|
|
36
|
+
// Simple topic extraction (first 10 words)
|
|
37
|
+
const extractTopics = (text: string) => {
|
|
38
|
+
const words = text.split(/\s+/).slice(0, 10);
|
|
39
|
+
return words.join(' ');
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
if (firstUser) topics.add(extractTopics(firstUser));
|
|
43
|
+
if (lastUser && lastUser !== firstUser) topics.add(extractTopics(lastUser));
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const timestamp = messages.length > 0 ? messages[messages.length - 1].createdAt : 'unknown';
|
|
47
|
+
|
|
48
|
+
return {
|
|
49
|
+
userMessages,
|
|
50
|
+
assistantMessages,
|
|
51
|
+
toolCalls,
|
|
52
|
+
topics,
|
|
53
|
+
timestamp,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Generate basic extractive summary from extracted content
|
|
59
|
+
*/
|
|
60
|
+
export function generateExtractiveSummary(extracted: ReturnType<typeof extractMessageContent>): string {
|
|
61
|
+
const hasContent =
|
|
62
|
+
extracted.userMessages.length > 0 ||
|
|
63
|
+
extracted.assistantMessages.length > 0 ||
|
|
64
|
+
extracted.toolCalls.size > 0 ||
|
|
65
|
+
extracted.topics.size > 0 ||
|
|
66
|
+
extracted.timestamp !== 'unknown';
|
|
67
|
+
|
|
68
|
+
if (!hasContent) {
|
|
69
|
+
return '';
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const parts: string[] = [];
|
|
73
|
+
|
|
74
|
+
if (extracted.userMessages.length > 0) {
|
|
75
|
+
parts.push(`User prompts: ${extracted.userMessages.length}`);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (extracted.assistantMessages.length > 0) {
|
|
79
|
+
parts.push(`Assistant responses: ${extracted.assistantMessages.length}`);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (extracted.toolCalls.size > 0) {
|
|
83
|
+
parts.push(`Tools used: ${Array.from(extracted.toolCalls).join(', ')}`);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (extracted.topics.size > 0) {
|
|
87
|
+
parts.push(`Topics: ${Array.from(extracted.topics).join('; ')}`);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (extracted.timestamp !== 'unknown') {
|
|
91
|
+
parts.push(`Last activity: ${extracted.timestamp}`);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return parts.join('. ');
|
|
95
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Requirements Filter Builder
|
|
3
|
+
* Common patterns for building database filters from criteria objects
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { eq, inArray, gte } from 'drizzle-orm';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Build database filter array from MemoryCriteria
|
|
10
|
+
*/
|
|
11
|
+
export function buildMemoryFilters(criteria: any, schema: any): any[] {
|
|
12
|
+
const filters: any[] = [];
|
|
13
|
+
|
|
14
|
+
if (criteria.type) {
|
|
15
|
+
filters.push(eq(schema.memories.type as any, criteria.type));
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if (criteria.types && criteria.types.length > 0) {
|
|
19
|
+
filters.push(inArray(schema.memories.type as any, criteria.types));
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (criteria.sector) {
|
|
23
|
+
filters.push(eq(schema.memories.sector as any, criteria.sector));
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (criteria.minConfidence !== undefined) {
|
|
27
|
+
filters.push(gte(schema.memories.confidence as any, criteria.minConfidence));
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (criteria.minRelevance !== undefined) {
|
|
31
|
+
filters.push(gte(schema.memories.relevanceScore as any, criteria.minRelevance));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (criteria.projectId) {
|
|
35
|
+
filters.push(eq(schema.memories.projectId, criteria.projectId));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (criteria.agentId) {
|
|
39
|
+
filters.push(eq(schema.memories.agentId as any, criteria.agentId));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return filters;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Build database filter array from partial criteria (for assertions)
|
|
47
|
+
*/
|
|
48
|
+
export function buildMemoryFiltersPartial(criteria: any, schema: any): any[] {
|
|
49
|
+
const filters: any[] = [];
|
|
50
|
+
|
|
51
|
+
if (criteria.type) {
|
|
52
|
+
filters.push(eq(schema.memories.type as any, criteria.type));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return filters;
|
|
56
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared History and Version Tracking Utilities
|
|
3
|
+
* Common patterns for traversing version chains and history
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { eq } from 'drizzle-orm';
|
|
7
|
+
import { getDb } from '../../db/index.js';
|
|
8
|
+
import { getSchema } from '../../db/schema.js';
|
|
9
|
+
import { logger } from '../logger.js';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Traverse superseded fact chain (specific to memories table)
|
|
13
|
+
* Follows the supersededBy chain to build complete version history
|
|
14
|
+
*/
|
|
15
|
+
export async function traverseSupersededChain(
|
|
16
|
+
startFactId: string,
|
|
17
|
+
options: {
|
|
18
|
+
maxDepth?: number;
|
|
19
|
+
includeStart?: boolean;
|
|
20
|
+
} = {}
|
|
21
|
+
): Promise<any[]> {
|
|
22
|
+
const { maxDepth = 50, includeStart = true } = options;
|
|
23
|
+
|
|
24
|
+
try {
|
|
25
|
+
const db = await getDb();
|
|
26
|
+
const schema = await getSchema();
|
|
27
|
+
|
|
28
|
+
// Get the starting fact
|
|
29
|
+
const initial = await (db as any)
|
|
30
|
+
.select()
|
|
31
|
+
.from(schema.memories)
|
|
32
|
+
.where(eq(schema.memories.id, startFactId))
|
|
33
|
+
.limit(1);
|
|
34
|
+
|
|
35
|
+
if (initial.length === 0) {
|
|
36
|
+
return [];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const history: any[] = includeStart ? [initial[0]] : [];
|
|
40
|
+
let currentId = initial[0].supersededBy;
|
|
41
|
+
let depth = 0;
|
|
42
|
+
|
|
43
|
+
// Follow the superseded chain
|
|
44
|
+
while (currentId && depth < maxDepth) {
|
|
45
|
+
const next = await (db as any)
|
|
46
|
+
.select()
|
|
47
|
+
.from(schema.memories)
|
|
48
|
+
.where(eq(schema.memories.id, currentId))
|
|
49
|
+
.limit(1);
|
|
50
|
+
|
|
51
|
+
if (next.length === 0) break;
|
|
52
|
+
|
|
53
|
+
history.push(next[0]);
|
|
54
|
+
currentId = next[0].supersededBy;
|
|
55
|
+
depth++;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return history;
|
|
59
|
+
} catch (error) {
|
|
60
|
+
logger.error('Error traversing superseded chain', error);
|
|
61
|
+
return [];
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Memory Operations Utilities
|
|
3
|
+
* Common patterns for memory governance operations
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { eq } from 'drizzle-orm';
|
|
7
|
+
import { getDb } from '../../db/index.js';
|
|
8
|
+
import { getSchema } from '../../db/schema.js';
|
|
9
|
+
import { createDatabaseClient } from '../storage/database.js';
|
|
10
|
+
import { config } from '../../config.js';
|
|
11
|
+
import { logger } from '../logger.js';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Generic memory operation with governance checks and error handling
|
|
15
|
+
*/
|
|
16
|
+
export async function performMemoryOperation(
|
|
17
|
+
memoryId: string,
|
|
18
|
+
operation: {
|
|
19
|
+
name: string;
|
|
20
|
+
updates: Record<string, any>;
|
|
21
|
+
requiresGovernance?: boolean;
|
|
22
|
+
}
|
|
23
|
+
): Promise<void> {
|
|
24
|
+
if (operation.requiresGovernance !== false && !config.governanceEnabled) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
try {
|
|
29
|
+
const db = await getDb();
|
|
30
|
+
const client = createDatabaseClient(db);
|
|
31
|
+
const schema = await getSchema();
|
|
32
|
+
|
|
33
|
+
await client
|
|
34
|
+
.update(schema.memories)
|
|
35
|
+
.set(operation.updates)
|
|
36
|
+
.where(eq(schema.memories.id, memoryId));
|
|
37
|
+
} catch (error) {
|
|
38
|
+
logger.error(`Error ${operation.name.toLowerCase()}`, error);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Redis publish operation with error handling
|
|
44
|
+
*/
|
|
45
|
+
export async function performRedisPublish(
|
|
46
|
+
getRedisClient: () => Promise<any>,
|
|
47
|
+
channel: string,
|
|
48
|
+
message: unknown
|
|
49
|
+
): Promise<void> {
|
|
50
|
+
try {
|
|
51
|
+
const redis = await getRedisClient();
|
|
52
|
+
await redis.publish(channel, JSON.stringify(message));
|
|
53
|
+
} catch (error) {
|
|
54
|
+
logger.error('Error publishing to Redis', error);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Requirements Query Operations
|
|
3
|
+
* Common patterns for database queries with error handling
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { and } from 'drizzle-orm';
|
|
7
|
+
import { getDb } from '../../db/index.js';
|
|
8
|
+
import { getSchema } from '../../db/schema.js';
|
|
9
|
+
|
|
10
|
+
export class MemoryRequirementError extends Error {
|
|
11
|
+
constructor(
|
|
12
|
+
message: string,
|
|
13
|
+
public readonly missingCriteria: any,
|
|
14
|
+
public readonly context?: any
|
|
15
|
+
) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.name = 'MemoryRequirementError';
|
|
18
|
+
Object.setPrototypeOf(this, MemoryRequirementError.prototype);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Execute a memory requirement query with standard error handling
|
|
24
|
+
*/
|
|
25
|
+
export async function executeMemoryQuery(
|
|
26
|
+
criteria: any,
|
|
27
|
+
filters: any[],
|
|
28
|
+
limit: number = 1,
|
|
29
|
+
operation: string = 'memory requirement'
|
|
30
|
+
): Promise<any[]> {
|
|
31
|
+
try {
|
|
32
|
+
const db = await getDb();
|
|
33
|
+
const schema = await getSchema();
|
|
34
|
+
|
|
35
|
+
const query = filters.length > 0 ? and(...filters) : undefined;
|
|
36
|
+
|
|
37
|
+
const memories = await (db as any)
|
|
38
|
+
.select()
|
|
39
|
+
.from(schema.memories)
|
|
40
|
+
.where(query)
|
|
41
|
+
.limit(limit);
|
|
42
|
+
|
|
43
|
+
return memories;
|
|
44
|
+
} catch (error) {
|
|
45
|
+
if (error instanceof MemoryRequirementError) {
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
49
|
+
throw new MemoryRequirementError(`Error checking ${operation}: ${msg}`, criteria);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Execute a memory assertion query (expecting specific results)
|
|
55
|
+
*/
|
|
56
|
+
export async function executeMemoryAssertion(
|
|
57
|
+
criteria: any,
|
|
58
|
+
filters: any[],
|
|
59
|
+
expectedCount: number,
|
|
60
|
+
operation: string,
|
|
61
|
+
errorMessage: string
|
|
62
|
+
): Promise<any[]> {
|
|
63
|
+
try {
|
|
64
|
+
const memories = await executeMemoryQuery(criteria, filters, 100, operation);
|
|
65
|
+
|
|
66
|
+
if (expectedCount === 0 && memories.length > 0) {
|
|
67
|
+
throw new MemoryRequirementError(errorMessage, criteria, { found: memories[0].id });
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (expectedCount > 0 && memories.length < expectedCount) {
|
|
71
|
+
const msg = `Required ${expectedCount} memories but found ${memories.length}`;
|
|
72
|
+
throw new MemoryRequirementError(msg, criteria, { found: memories.length, required: expectedCount });
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return memories;
|
|
76
|
+
} catch (error) {
|
|
77
|
+
if (error instanceof MemoryRequirementError) {
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
81
|
+
throw new MemoryRequirementError(`Error ${operation}: ${msg}`, criteria);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Summarization Strategy Utilities
|
|
3
|
+
* Common patterns for different summarization approaches
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { getDb } from '../../db/index.js';
|
|
7
|
+
import { getSchema } from '../../db/schema.js';
|
|
8
|
+
import { config } from '../../config.js';
|
|
9
|
+
import { estimateTokens } from '../context/context-window.js';
|
|
10
|
+
|
|
11
|
+
export { estimateTokens };
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Chunk messages for incremental summarization
|
|
15
|
+
*/
|
|
16
|
+
export function chunkMessages(messages: any[], chunkSize: number): any[][] {
|
|
17
|
+
const chunks: any[][] = [];
|
|
18
|
+
for (let i = 0; i < messages.length; i += chunkSize) {
|
|
19
|
+
chunks.push(messages.slice(i, i + chunkSize));
|
|
20
|
+
}
|
|
21
|
+
return chunks;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Get rolling window of messages
|
|
26
|
+
*/
|
|
27
|
+
export function getRollingWindow(messages: any[], windowSize: number): any[] {
|
|
28
|
+
if (windowSize <= 0) {
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return messages.slice(-windowSize);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Calculate tokens saved by summarization
|
|
37
|
+
*/
|
|
38
|
+
export function calculateTokensSaved(messages: any[], summary: string): number {
|
|
39
|
+
const originalTokens = messages.reduce(
|
|
40
|
+
(sum: number, m: any) => sum + estimateTokens(m.content || ''),
|
|
41
|
+
0
|
|
42
|
+
);
|
|
43
|
+
const summaryTokens = estimateTokens(summary);
|
|
44
|
+
return Math.max(0, originalTokens - summaryTokens);
|
|
45
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Temporal Query Utilities
|
|
3
|
+
* Common patterns for temporal database queries
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { and, eq, lte, gte, or, isNull } from 'drizzle-orm';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Build temporal validity filters for queries
|
|
10
|
+
*/
|
|
11
|
+
export function buildTemporalFilters(
|
|
12
|
+
schema: any,
|
|
13
|
+
timestamp: Date = new Date(),
|
|
14
|
+
additionalFilters: any[] = []
|
|
15
|
+
): any[] {
|
|
16
|
+
const filters = [
|
|
17
|
+
lte(schema.validFrom as any, timestamp),
|
|
18
|
+
or(isNull(schema.validTo), gte(schema.validTo as any, timestamp)),
|
|
19
|
+
...additionalFilters
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
return filters;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Build temporal query for facts at a specific time
|
|
27
|
+
*/
|
|
28
|
+
export function buildFactAtTimeQuery(
|
|
29
|
+
schema: any,
|
|
30
|
+
timestamp: Date = new Date(),
|
|
31
|
+
additionalFilters: any[] = []
|
|
32
|
+
): any {
|
|
33
|
+
const filters = buildTemporalFilters(schema, timestamp, [
|
|
34
|
+
eq(schema.type as any, 'fact'),
|
|
35
|
+
...additionalFilters
|
|
36
|
+
]);
|
|
37
|
+
|
|
38
|
+
return and(...filters);
|
|
39
|
+
}
|