squish-memory 1.1.5 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +32 -16
- package/CHANGELOG.md +147 -0
- package/README.md +120 -78
- package/{scripts → bin}/dependency-manager.mjs +217 -217
- package/{scripts → bin}/detect-clients.mjs +78 -78
- package/bin/install-interactive.mjs +321 -0
- package/bin/squish-mcp.mjs +44 -0
- package/bin/squish.mjs +33 -0
- package/config/mcp-migration-map.json +1 -6
- package/config/mcp-mode-semantics.json +19 -23
- package/config/mcp-remote-auth.json +3 -26
- package/config/mcp-universal.schema.json +5 -35
- package/config/settings.json +107 -52
- package/config.js +5 -0
- package/config.ts +218 -0
- package/core/adapters/config/claude-code.ts +133 -0
- package/core/adapters/config/cursor.ts +90 -0
- package/core/adapters/config/opencode.ts +89 -0
- package/core/adapters/config/windsurf.ts +90 -0
- package/core/adapters/index.ts +102 -0
- package/core/adapters/timeline.ts +116 -0
- package/core/adapters/types.ts +166 -0
- package/core/agent-preferences.ts +140 -0
- package/core/algorithms/analytics/token-estimator.ts +216 -0
- package/core/algorithms/detection/hash-filters.ts +260 -0
- package/core/algorithms/detection/semantic-ranker.ts +194 -0
- package/core/algorithms/detection/two-stage-detector.ts +421 -0
- package/core/algorithms/handlers/approve-merge.ts +215 -0
- package/core/algorithms/handlers/detect-duplicates.ts +192 -0
- package/core/algorithms/handlers/get-stats.ts +132 -0
- package/core/algorithms/handlers/list-proposals.ts +130 -0
- package/core/algorithms/handlers/preview-merge.ts +139 -0
- package/core/algorithms/handlers/reject-merge.ts +93 -0
- package/core/algorithms/handlers/reverse-merge.ts +155 -0
- package/{dist/core/algorithms/index.js → core/algorithms/index.ts} +39 -26
- package/core/algorithms/operations/cache-maintenance.ts +182 -0
- package/core/algorithms/safety/safety-checks.ts +256 -0
- package/core/algorithms/strategies/merge-strategies.ts +381 -0
- package/core/algorithms/types.ts +140 -0
- package/core/algorithms/utils/response-builder.ts +61 -0
- package/core/associations.ts +363 -0
- package/core/beliefs/decay.ts +289 -0
- package/core/beliefs/extractor.ts +131 -0
- package/core/beliefs/store.ts +557 -0
- package/core/beliefs/types.ts +38 -0
- package/core/commands/mcp-server.ts +5 -0
- package/core/compression.ts +177 -0
- package/core/config.js +2 -0
- package/core/consolidation.ts +330 -0
- package/core/context/agent-context.ts +388 -0
- package/core/context/context-paging.ts +449 -0
- package/core/context/context-window.ts +234 -0
- package/core/context/context.ts +35 -0
- package/core/embeddings/embeddings.ts +616 -0
- package/core/embeddings/google-multimodal.ts +200 -0
- package/{dist/core/local-embeddings.js → core/embeddings/local-embeddings.ts} +12 -11
- package/core/embeddings/qmd-client.ts +495 -0
- package/core/embeddings/transformers-local.ts +261 -0
- package/core/embeddings.js +4 -0
- package/core/error-handling.ts +206 -0
- package/core/external +219 -0
- package/core/graph/entity-deduplicator.ts +232 -0
- package/core/graph/graph-builder.ts +257 -0
- package/core/graph/graph-traversal.ts +490 -0
- package/core/graph/index.ts +24 -0
- package/core/graph/llm-entity-extractor.ts +402 -0
- package/core/graph/multi-hop-retrieval.ts +317 -0
- package/core/graph/relationship-extractor.ts +465 -0
- package/core/hooks/agent-hooks.ts +653 -0
- package/core/hooks/auto-tagger.ts +149 -0
- package/core/hooks/capture-filter.ts +169 -0
- package/core/hot-cache.ts +388 -0
- package/core/index.ts +10 -0
- package/core/ingestion/agent-memory.ts +167 -0
- package/core/ingestion/core-memory.ts +326 -0
- package/core/ingestion/learnings.ts +260 -0
- package/core/ingestion/signal-engine.ts +266 -0
- package/core/integrations/obsidian-vault.ts +197 -0
- package/core/layers/generator.ts +115 -0
- package/{dist/core/lib/db-client.d.ts → core/lib/db-client.ts} +168 -114
- package/core/lib/parse-embedding.ts +59 -0
- package/{dist/core/lib/schemas.js → core/lib/schemas.ts} +102 -87
- package/core/lib/types.ts +49 -0
- package/core/lib/utils.ts +151 -0
- package/core/lib/validation.ts +180 -0
- package/core/lifecycle.ts +353 -0
- package/core/logger.ts +59 -0
- package/core/memory/bridge-discovery.ts +395 -0
- package/core/memory/categorizer.ts +390 -0
- package/core/memory/conflict-detector.ts +62 -0
- package/core/memory/consolidation.ts +372 -0
- package/core/memory/context-collector.ts +75 -0
- package/core/memory/contradiction-resolver.ts +494 -0
- package/core/memory/edit-workflow.ts +174 -0
- package/core/memory/entity-extractor.ts +426 -0
- package/core/memory/entity-resolver.ts +89 -0
- package/core/memory/explain.ts +112 -0
- package/core/memory/fact-deriver.ts +300 -0
- package/core/memory/fact-extractor.ts +120 -0
- package/core/memory/feedback-tracker.ts +200 -0
- package/core/memory/hooks.ts +230 -0
- package/core/memory/hybrid-retrieval.ts +65 -0
- package/core/memory/hybrid-scorer.ts +325 -0
- package/core/memory/hybrid-search.ts +748 -0
- package/core/memory/importance.ts +319 -0
- package/{dist/core/memory/index.js → core/memory/index.ts} +11 -10
- package/core/memory/loader.ts +178 -0
- package/core/memory/markdown/markdown-storage.ts +318 -0
- package/core/memory/memories.ts +565 -0
- package/core/memory/memory-lifecycle.ts +51 -0
- package/core/memory/memory-manager.ts +53 -0
- package/core/memory/migrate.ts +173 -0
- package/core/memory/normalization.ts +30 -0
- package/core/memory/path-strengthener.ts +211 -0
- package/core/memory/progressive-disclosure.ts +392 -0
- package/core/memory/query-processor.ts +130 -0
- package/core/memory/query-rewriter.ts +153 -0
- package/core/memory/response-analyzer.ts +81 -0
- package/core/memory/retrieval-feedback.ts +276 -0
- package/core/memory/serialization.ts +83 -0
- package/core/memory/stale-cleaner.ts +147 -0
- package/core/memory/stats.ts +181 -0
- package/core/memory/telemetry.ts +392 -0
- package/core/memory/temporal-facts.ts +356 -0
- package/core/memory/temporal-parser.ts +477 -0
- package/core/memory/trigger-detector.ts +104 -0
- package/core/memory/write-gate.ts +288 -0
- package/{dist/core/places/index.js → core/places/index.ts} +12 -12
- package/core/places/memory-places.ts +339 -0
- package/core/places/places.ts +406 -0
- package/core/places/rules.ts +308 -0
- package/core/places/walking.ts +192 -0
- package/core/projects +89 -0
- package/core/projects.ts +131 -0
- package/core/redis.ts +82 -0
- package/core/responses.ts +187 -0
- package/core/runtime/trust-report.ts +195 -0
- package/core/runtime/trust-state.ts +360 -0
- package/core/scheduler/cron-scheduler.ts +590 -0
- package/core/scheduler/heartbeat.ts +91 -0
- package/{dist/core/scheduler/index.js → core/scheduler/index.ts} +8 -8
- package/core/scheduler/job-runner.ts +197 -0
- package/core/search/conversations.ts +166 -0
- package/core/search/entities.ts +46 -0
- package/core/search/folder-context.ts +154 -0
- package/core/search/graph-boost.ts +22 -0
- package/{dist/core/search/index.js → core/search/index.ts} +4 -5
- package/core/search/qmd-wrapper.ts +84 -0
- package/core/security/encrypt.ts +51 -0
- package/core/security/governance.ts +102 -0
- package/core/security/privacy.ts +108 -0
- package/core/security/secret-detector.ts +122 -0
- package/core/session/auto-load.ts +160 -0
- package/core/session/entity-tracker.ts +363 -0
- package/{dist/core/session/index.js → core/session/index.ts} +7 -7
- package/core/session/reference-resolver.ts +158 -0
- package/core/session/self-iteration-job.ts +478 -0
- package/core/session/session-hooks.ts +69 -0
- package/core/session/types.ts +36 -0
- package/core/session/working-set.ts +275 -0
- package/{dist/core/snapshots/cleanup.js → core/snapshots/cleanup.ts} +13 -12
- package/core/snapshots/comparison.ts +59 -0
- package/core/snapshots/creation.ts +139 -0
- package/core/snapshots/retrieval.ts +44 -0
- package/core/snapshots/stats.ts +63 -0
- package/core/storage/cache.ts +241 -0
- package/core/storage/database.ts +23 -0
- package/{dist/core/summarization/cleanup.js → core/summarization/cleanup.ts} +13 -12
- package/core/summarization/queries.ts +32 -0
- package/core/summarization/stats.ts +64 -0
- package/core/summarization/strategies.ts +52 -0
- package/core/summarization.ts +248 -0
- package/core/temporal-facts.ts +244 -0
- package/core/tracing/collector.ts +470 -0
- package/core/tracing/visualizer.ts +195 -0
- package/core/utils/cleanup-operations.ts +50 -0
- package/core/utils/content-extraction.ts +95 -0
- package/core/utils/filter-builder.ts +56 -0
- package/core/utils/history-traversal.ts +63 -0
- package/core/utils/memory-operations.ts +56 -0
- package/core/utils/query-operations.ts +83 -0
- package/core/utils/summarization-helpers.ts +45 -0
- package/core/utils/temporal-queries.ts +39 -0
- package/{dist/core/utils/vector-operations.js → core/utils/vector-operations.ts} +135 -129
- package/core/utils/version-management.ts +74 -0
- package/core/worker.ts +333 -0
- package/db/adapter.ts +215 -0
- package/{dist/db/bootstrap.js → db/bootstrap.ts} +388 -418
- package/db/drizzle/migrations/0000_needy_cerebro.sql +402 -0
- package/db/drizzle/migrations/meta/0000_snapshot.json +3451 -0
- package/db/drizzle/migrations/meta/_journal.json +13 -0
- package/db/drizzle/schema-sqlite.ts +1032 -0
- package/db/drizzle/schema.ts +1128 -0
- package/db/drizzle.config.ts +12 -0
- package/db/index.ts +83 -0
- package/db/init.sql +5 -0
- package/db/migrations/associations.ts +35 -0
- package/db/migrations/beliefs.ts +89 -0
- package/db/migrations/core-memory.ts +35 -0
- package/db/migrations/fts.ts +59 -0
- package/db/migrations/index.ts +54 -0
- package/db/migrations/indexes.ts +36 -0
- package/db/migrations/learnings.ts +34 -0
- package/db/migrations/maintenance.ts +68 -0
- package/db/migrations/memories.ts +22 -0
- package/db/migrations/memory-places.ts +35 -0
- package/db/migrations/places.ts +49 -0
- package/db/migrations/projects.ts +21 -0
- package/db/migrations/tier-conversion.ts +24 -0
- package/db/neon.ts +22 -0
- package/db/schema/beliefs.ts +50 -0
- package/db/schema/generator.ts +159 -0
- package/db/schema/index.ts +58 -0
- package/db/schema/learnings.ts +32 -0
- package/db/schema/memories.ts +83 -0
- package/db/schema/projects.ts +33 -0
- package/db/schema.ts +13 -0
- package/db/supabase.ts +27 -0
- package/mcp.json.example +8 -11
- package/package.json +140 -159
- package/packages/cli/package.json +22 -0
- package/packages/cli/src/commands/clean.ts +68 -0
- package/packages/cli/src/commands/context.ts +79 -0
- package/packages/cli/src/commands/doctor.ts +357 -0
- package/packages/cli/src/commands/forget.ts +72 -0
- package/packages/cli/src/commands/health.ts +36 -0
- package/packages/cli/src/commands/inspect.ts +41 -0
- package/packages/cli/src/commands/link.ts +50 -0
- package/packages/cli/src/commands/migrate.ts +93 -0
- package/packages/cli/src/commands/recall.ts +99 -0
- package/packages/cli/src/commands/recent.ts +57 -0
- package/packages/cli/src/commands/remember.ts +139 -0
- package/packages/cli/src/commands/run.ts +58 -0
- package/packages/cli/src/commands/stale.ts +43 -0
- package/packages/cli/src/commands/stats.ts +42 -0
- package/packages/cli/src/index.ts +57 -0
- package/packages/cli/tsconfig.json +24 -0
- package/packages/mcp/package.json +26 -0
- package/packages/mcp/src/index.ts +940 -0
- package/packages/mcp/tsconfig.json +20 -0
- package/skills/squish-memory/SKILL.md +38 -35
- package/skills/squish-memory/{scripts/install.sh → install.sh} +1 -1
- package/skills/squish-memory/references/claude-desktop.json +12 -0
- package/skills/squish-memory/references/openclaw.json +13 -0
- package/skills/squish-memory/references/opencode.json +14 -0
- package/config/hooks/claude-code-hooks.json +0 -39
- package/config/hooks/cursor-hooks.json +0 -30
- package/config/hooks/opencode-hooks.json +0 -30
- package/config/hooks/windsurf-hooks.json +0 -30
- package/config/mcp-cli-fallback-policy.json +0 -22
- package/config/mcp.json +0 -38
- package/config/plugin-manifest.json +0 -101
- package/config/plugin-manifest.schema.json +0 -244
- package/config/plugin.json +0 -32
- package/config/remote-memory-policy.json +0 -32
- package/core/commands/context-paging.md +0 -51
- package/core/commands/context-status.md +0 -22
- package/core/commands/context.md +0 -5
- package/core/commands/core-memory.md +0 -56
- package/core/commands/health.md +0 -5
- package/core/commands/init.md +0 -39
- package/core/commands/merge.md +0 -113
- package/core/commands/recall.md +0 -5
- package/core/commands/remember.md +0 -11
- package/core/commands/search.md +0 -10
- package/dist/config.d.ts +0 -83
- package/dist/config.js +0 -242
- package/dist/core/adapters/config/claude-code.d.ts +0 -45
- package/dist/core/adapters/config/claude-code.js +0 -113
- package/dist/core/adapters/config/cursor.d.ts +0 -26
- package/dist/core/adapters/config/cursor.js +0 -74
- package/dist/core/adapters/config/opencode.d.ts +0 -23
- package/dist/core/adapters/config/opencode.js +0 -73
- package/dist/core/adapters/config/windsurf.d.ts +0 -26
- package/dist/core/adapters/config/windsurf.js +0 -74
- package/dist/core/adapters/index.d.ts +0 -45
- package/dist/core/adapters/index.js +0 -84
- package/dist/core/adapters/scripts/install-adapter.d.ts +0 -19
- package/dist/core/adapters/scripts/install-adapter.js +0 -149
- package/dist/core/adapters/timeline.d.ts +0 -23
- package/dist/core/adapters/timeline.js +0 -88
- package/dist/core/adapters/types.d.ts +0 -157
- package/dist/core/adapters/types.js +0 -50
- package/dist/core/algorithms/analytics/token-estimator.d.ts +0 -50
- package/dist/core/algorithms/analytics/token-estimator.js +0 -154
- package/dist/core/algorithms/detection/hash-filters.d.ts +0 -47
- package/dist/core/algorithms/detection/hash-filters.js +0 -190
- package/dist/core/algorithms/detection/semantic-ranker.d.ts +0 -32
- package/dist/core/algorithms/detection/semantic-ranker.js +0 -118
- package/dist/core/algorithms/detection/two-stage-detector.d.ts +0 -52
- package/dist/core/algorithms/detection/two-stage-detector.js +0 -299
- package/dist/core/algorithms/handlers/approve-merge.d.ts +0 -22
- package/dist/core/algorithms/handlers/approve-merge.js +0 -179
- package/dist/core/algorithms/handlers/detect-duplicates.d.ts +0 -47
- package/dist/core/algorithms/handlers/detect-duplicates.js +0 -145
- package/dist/core/algorithms/handlers/get-stats.d.ts +0 -39
- package/dist/core/algorithms/handlers/get-stats.js +0 -88
- package/dist/core/algorithms/handlers/list-proposals.d.ts +0 -45
- package/dist/core/algorithms/handlers/list-proposals.js +0 -83
- package/dist/core/algorithms/handlers/preview-merge.d.ts +0 -39
- package/dist/core/algorithms/handlers/preview-merge.js +0 -93
- package/dist/core/algorithms/handlers/reject-merge.d.ts +0 -28
- package/dist/core/algorithms/handlers/reject-merge.js +0 -69
- package/dist/core/algorithms/handlers/reverse-merge.d.ts +0 -21
- package/dist/core/algorithms/handlers/reverse-merge.js +0 -121
- package/dist/core/algorithms/index.d.ts +0 -21
- package/dist/core/algorithms/operations/cache-maintenance.d.ts +0 -12
- package/dist/core/algorithms/operations/cache-maintenance.js +0 -157
- package/dist/core/algorithms/safety/safety-checks.d.ts +0 -22
- package/dist/core/algorithms/safety/safety-checks.js +0 -179
- package/dist/core/algorithms/strategies/merge-strategies.d.ts +0 -50
- package/dist/core/algorithms/strategies/merge-strategies.js +0 -288
- package/dist/core/algorithms/types.d.ts +0 -133
- package/dist/core/algorithms/types.js +0 -5
- package/dist/core/algorithms/utils/response-builder.d.ts +0 -28
- package/dist/core/algorithms/utils/response-builder.js +0 -37
- package/dist/core/associations.d.ts +0 -31
- package/dist/core/associations.js +0 -248
- package/dist/core/autosave.d.ts +0 -19
- package/dist/core/autosave.js +0 -16
- package/dist/core/commands/managed-sync.d.ts +0 -10
- package/dist/core/commands/managed-sync.js +0 -64
- package/dist/core/commands/mcp-server.d.ts +0 -3
- package/dist/core/commands/mcp-server.js +0 -739
- package/dist/core/consolidation.d.ts +0 -37
- package/dist/core/consolidation.js +0 -248
- package/dist/core/context/agent-context.d.ts +0 -106
- package/dist/core/context/agent-context.js +0 -274
- package/dist/core/context/context-paging.d.ts +0 -80
- package/dist/core/context/context-paging.js +0 -328
- package/dist/core/context/context-window.d.ts +0 -40
- package/dist/core/context/context-window.js +0 -177
- package/dist/core/context/context.d.ts +0 -7
- package/dist/core/context/context.js +0 -22
- package/dist/core/embeddings/google-multimodal.d.ts +0 -14
- package/dist/core/embeddings/google-multimodal.js +0 -142
- package/dist/core/embeddings/qmd-client.d.ts +0 -136
- package/dist/core/embeddings/qmd-client.js +0 -403
- package/dist/core/embeddings.d.ts +0 -29
- package/dist/core/embeddings.js +0 -454
- package/dist/core/error-handling.d.ts +0 -63
- package/dist/core/error-handling.js +0 -173
- package/dist/core/external-folder/index.d.ts +0 -102
- package/dist/core/external-folder/index.js +0 -294
- package/dist/core/hooks/agent-hooks.d.ts +0 -74
- package/dist/core/hooks/agent-hooks.js +0 -244
- package/dist/core/hooks/auto-tagger.d.ts +0 -19
- package/dist/core/hooks/auto-tagger.js +0 -155
- package/dist/core/hooks/capture-filter.d.ts +0 -41
- package/dist/core/hooks/capture-filter.js +0 -128
- package/dist/core/index.d.ts +0 -10
- package/dist/core/index.js +0 -14
- package/dist/core/ingestion/agent-memory.d.ts +0 -22
- package/dist/core/ingestion/agent-memory.js +0 -109
- package/dist/core/ingestion/core-memory.d.ts +0 -78
- package/dist/core/ingestion/core-memory.js +0 -226
- package/dist/core/ingestion/learnings.d.ts +0 -57
- package/dist/core/ingestion/learnings.js +0 -202
- package/dist/core/layers/generator.d.ts +0 -25
- package/dist/core/layers/generator.js +0 -76
- package/dist/core/lib/db-client.js +0 -130
- package/dist/core/lib/schemas.d.ts +0 -129
- package/dist/core/lib/utils.d.ts +0 -14
- package/dist/core/lib/utils.js +0 -90
- package/dist/core/lib/validation.d.ts +0 -38
- package/dist/core/lib/validation.js +0 -151
- package/dist/core/lifecycle.d.ts +0 -26
- package/dist/core/lifecycle.js +0 -302
- package/dist/core/local-embeddings.d.ts +0 -11
- package/dist/core/logger.d.ts +0 -16
- package/dist/core/logger.js +0 -40
- package/dist/core/mcp/client.d.ts +0 -17
- package/dist/core/mcp/client.js +0 -101
- package/dist/core/mcp/index.d.ts +0 -6
- package/dist/core/mcp/index.js +0 -6
- package/dist/core/mcp/server.d.ts +0 -18
- package/dist/core/mcp/server.js +0 -157
- package/dist/core/mcp/standalone-server.d.ts +0 -13
- package/dist/core/mcp/standalone-server.js +0 -46
- package/dist/core/mcp/tools.d.ts +0 -9
- package/dist/core/mcp/tools.js +0 -365
- package/dist/core/mcp/types.d.ts +0 -315
- package/dist/core/mcp/types.js +0 -48
- package/dist/core/memory/bridge-discovery.d.ts +0 -50
- package/dist/core/memory/bridge-discovery.js +0 -291
- package/dist/core/memory/categorizer.d.ts +0 -27
- package/dist/core/memory/categorizer.js +0 -305
- package/dist/core/memory/conflict-detector.d.ts +0 -7
- package/dist/core/memory/conflict-detector.js +0 -43
- package/dist/core/memory/consolidation.d.ts +0 -42
- package/dist/core/memory/consolidation.js +0 -303
- package/dist/core/memory/context-collector.d.ts +0 -10
- package/dist/core/memory/context-collector.js +0 -56
- package/dist/core/memory/contradiction-resolver.d.ts +0 -40
- package/dist/core/memory/contradiction-resolver.js +0 -368
- package/dist/core/memory/edit-workflow.d.ts +0 -19
- package/dist/core/memory/edit-workflow.js +0 -120
- package/dist/core/memory/entity-extractor.d.ts +0 -33
- package/dist/core/memory/entity-extractor.js +0 -336
- package/dist/core/memory/entity-resolver.d.ts +0 -23
- package/dist/core/memory/entity-resolver.js +0 -64
- package/dist/core/memory/fact-extractor.d.ts +0 -24
- package/dist/core/memory/fact-extractor.js +0 -89
- package/dist/core/memory/feedback-tracker.d.ts +0 -12
- package/dist/core/memory/feedback-tracker.js +0 -155
- package/dist/core/memory/hooks.d.ts +0 -88
- package/dist/core/memory/hooks.js +0 -174
- package/dist/core/memory/hybrid-retrieval.d.ts +0 -29
- package/dist/core/memory/hybrid-retrieval.js +0 -139
- package/dist/core/memory/hybrid-scorer.d.ts +0 -40
- package/dist/core/memory/hybrid-scorer.js +0 -284
- package/dist/core/memory/hybrid-search.d.ts +0 -20
- package/dist/core/memory/hybrid-search.js +0 -359
- package/dist/core/memory/importance.d.ts +0 -63
- package/dist/core/memory/importance.js +0 -298
- package/dist/core/memory/index.d.ts +0 -8
- package/dist/core/memory/loader.d.ts +0 -31
- package/dist/core/memory/loader.js +0 -141
- package/dist/core/memory/markdown/markdown-storage.d.ts +0 -72
- package/dist/core/memory/markdown/markdown-storage.js +0 -243
- package/dist/core/memory/memories.d.ts +0 -47
- package/dist/core/memory/memories.js +0 -449
- package/dist/core/memory/memory-lifecycle.d.ts +0 -8
- package/dist/core/memory/memory-lifecycle.js +0 -55
- package/dist/core/memory/memory-manager.d.ts +0 -15
- package/dist/core/memory/memory-manager.js +0 -46
- package/dist/core/memory/migrate.d.ts +0 -21
- package/dist/core/memory/migrate.js +0 -134
- package/dist/core/memory/normalization.d.ts +0 -22
- package/dist/core/memory/normalization.js +0 -26
- package/dist/core/memory/progressive-disclosure.d.ts +0 -43
- package/dist/core/memory/progressive-disclosure.js +0 -280
- package/dist/core/memory/query-processor.d.ts +0 -21
- package/dist/core/memory/query-processor.js +0 -72
- package/dist/core/memory/query-rewriter.d.ts +0 -13
- package/dist/core/memory/query-rewriter.js +0 -118
- package/dist/core/memory/response-analyzer.d.ts +0 -9
- package/dist/core/memory/response-analyzer.js +0 -61
- package/dist/core/memory/serialization.d.ts +0 -10
- package/dist/core/memory/serialization.js +0 -84
- package/dist/core/memory/stats.d.ts +0 -22
- package/dist/core/memory/stats.js +0 -138
- package/dist/core/memory/telemetry.d.ts +0 -69
- package/dist/core/memory/telemetry.js +0 -313
- package/dist/core/memory/temporal-facts.d.ts +0 -41
- package/dist/core/memory/temporal-facts.js +0 -283
- package/dist/core/memory/temporal-parser.d.ts +0 -32
- package/dist/core/memory/temporal-parser.js +0 -385
- package/dist/core/memory/trigger-detector.d.ts +0 -14
- package/dist/core/memory/trigger-detector.js +0 -42
- package/dist/core/memory/write-gate.d.ts +0 -54
- package/dist/core/memory/write-gate.js +0 -210
- package/dist/core/namespaces/index.d.ts +0 -71
- package/dist/core/namespaces/index.js +0 -305
- package/dist/core/namespaces/uri-parser.d.ts +0 -31
- package/dist/core/namespaces/uri-parser.js +0 -74
- package/dist/core/obsidian-vault.d.ts +0 -30
- package/dist/core/obsidian-vault.js +0 -94
- package/dist/core/places/index.d.ts +0 -14
- package/dist/core/places/memory-places.d.ts +0 -68
- package/dist/core/places/memory-places.js +0 -261
- package/dist/core/places/places.d.ts +0 -88
- package/dist/core/places/places.js +0 -314
- package/dist/core/places/rules.d.ts +0 -74
- package/dist/core/places/rules.js +0 -240
- package/dist/core/places/walking.d.ts +0 -56
- package/dist/core/places/walking.js +0 -121
- package/dist/core/projects.d.ts +0 -17
- package/dist/core/projects.js +0 -108
- package/dist/core/redis.d.ts +0 -11
- package/dist/core/redis.js +0 -69
- package/dist/core/responses.d.ts +0 -96
- package/dist/core/responses.js +0 -122
- package/dist/core/scheduler/cron-scheduler.d.ts +0 -32
- package/dist/core/scheduler/cron-scheduler.js +0 -332
- package/dist/core/scheduler/heartbeat.d.ts +0 -11
- package/dist/core/scheduler/heartbeat.js +0 -73
- package/dist/core/scheduler/index.d.ts +0 -8
- package/dist/core/scheduler/job-runner.d.ts +0 -11
- package/dist/core/scheduler/job-runner.js +0 -164
- package/dist/core/search/conversations.d.ts +0 -25
- package/dist/core/search/conversations.js +0 -110
- package/dist/core/search/entities.d.ts +0 -12
- package/dist/core/search/entities.js +0 -31
- package/dist/core/search/folder-context.d.ts +0 -25
- package/dist/core/search/folder-context.js +0 -119
- package/dist/core/search/graph-boost.d.ts +0 -7
- package/dist/core/search/graph-boost.js +0 -23
- package/dist/core/search/index.d.ts +0 -4
- package/dist/core/search/qmd-search.d.ts +0 -61
- package/dist/core/search/qmd-search.js +0 -178
- package/dist/core/security/encrypt.d.ts +0 -6
- package/dist/core/security/encrypt.js +0 -47
- package/dist/core/security/governance.d.ts +0 -26
- package/dist/core/security/governance.js +0 -79
- package/dist/core/security/privacy.d.ts +0 -23
- package/dist/core/security/privacy.js +0 -82
- package/dist/core/security/secret-detector.d.ts +0 -32
- package/dist/core/security/secret-detector.js +0 -88
- package/dist/core/session/auto-load.d.ts +0 -6
- package/dist/core/session/auto-load.js +0 -119
- package/dist/core/session/index.d.ts +0 -7
- package/dist/core/session/self-iteration-job.d.ts +0 -20
- package/dist/core/session/self-iteration-job.js +0 -282
- package/dist/core/session/session-hooks.d.ts +0 -18
- package/dist/core/session/session-hooks.js +0 -58
- package/dist/core/session/types.d.ts +0 -26
- package/dist/core/session/types.js +0 -10
- package/dist/core/session-hooks/self-iteration-job.d.ts +0 -20
- package/dist/core/session-hooks/self-iteration-job.js +0 -282
- package/dist/core/session-hooks/session-hooks.d.ts +0 -18
- package/dist/core/session-hooks/session-hooks.js +0 -58
- package/dist/core/snapshots/cleanup.d.ts +0 -9
- package/dist/core/snapshots/comparison.d.ts +0 -19
- package/dist/core/snapshots/comparison.js +0 -43
- package/dist/core/snapshots/creation.d.ts +0 -19
- package/dist/core/snapshots/creation.js +0 -126
- package/dist/core/snapshots/retrieval.d.ts +0 -7
- package/dist/core/snapshots/retrieval.js +0 -41
- package/dist/core/snapshots/stats.d.ts +0 -11
- package/dist/core/snapshots/stats.js +0 -52
- package/dist/core/snapshots.d.ts +0 -29
- package/dist/core/snapshots.js +0 -220
- package/dist/core/storage/cache.d.ts +0 -13
- package/dist/core/storage/cache.js +0 -202
- package/dist/core/storage/database.d.ts +0 -12
- package/dist/core/storage/database.js +0 -12
- package/dist/core/summarization/cleanup.d.ts +0 -9
- package/dist/core/summarization/queries.d.ts +0 -9
- package/dist/core/summarization/queries.js +0 -28
- package/dist/core/summarization/stats.d.ts +0 -14
- package/dist/core/summarization/stats.js +0 -52
- package/dist/core/summarization/strategies.d.ts +0 -24
- package/dist/core/summarization/strategies.js +0 -28
- package/dist/core/summarization.d.ts +0 -37
- package/dist/core/summarization.js +0 -188
- package/dist/core/sync/qmd-sync.d.ts +0 -94
- package/dist/core/sync/qmd-sync.js +0 -201
- package/dist/core/temporal-facts.d.ts +0 -54
- package/dist/core/temporal-facts.js +0 -193
- package/dist/core/toon.d.ts +0 -43
- package/dist/core/toon.js +0 -160
- package/dist/core/tracing/collector.d.ts +0 -111
- package/dist/core/tracing/collector.js +0 -350
- package/dist/core/tracing/visualizer.d.ts +0 -32
- package/dist/core/tracing/visualizer.js +0 -165
- package/dist/core/utils/cleanup-operations.d.ts +0 -13
- package/dist/core/utils/cleanup-operations.js +0 -44
- package/dist/core/utils/content-extraction.d.ts +0 -19
- package/dist/core/utils/content-extraction.js +0 -75
- package/dist/core/utils/filter-builder.d.ts +0 -13
- package/dist/core/utils/filter-builder.js +0 -44
- package/dist/core/utils/history-traversal.d.ts +0 -13
- package/dist/core/utils/history-traversal.js +0 -50
- package/dist/core/utils/memory-operations.d.ts +0 -17
- package/dist/core/utils/memory-operations.js +0 -43
- package/dist/core/utils/query-operations.d.ts +0 -18
- package/dist/core/utils/query-operations.js +0 -65
- package/dist/core/utils/summarization-helpers.d.ts +0 -21
- package/dist/core/utils/summarization-helpers.js +0 -38
- package/dist/core/utils/temporal-queries.d.ts +0 -13
- package/dist/core/utils/temporal-queries.js +0 -27
- package/dist/core/utils/vector-operations.d.ts +0 -71
- package/dist/core/utils/version-management.d.ts +0 -9
- package/dist/core/utils/version-management.js +0 -61
- package/dist/core/worker.d.ts +0 -82
- package/dist/core/worker.js +0 -272
- package/dist/db/adapter.d.ts +0 -7
- package/dist/db/adapter.js +0 -175
- package/dist/db/bootstrap.d.ts +0 -9
- package/dist/db/drizzle/schema-sqlite.d.ts +0 -4837
- package/dist/db/drizzle/schema-sqlite.js +0 -684
- package/dist/db/drizzle/schema.d.ts +0 -4082
- package/dist/db/drizzle/schema.js +0 -770
- package/dist/db/drizzle.config.d.ts +0 -3
- package/dist/db/drizzle.config.js +0 -12
- package/dist/db/index.d.ts +0 -7
- package/dist/db/index.js +0 -89
- package/dist/db/neon.d.ts +0 -8
- package/dist/db/neon.js +0 -20
- package/dist/db/schema/index.d.ts +0 -40
- package/dist/db/schema/index.js +0 -105
- package/dist/db/schema/tables/context-sessions.d.ts +0 -9
- package/dist/db/schema/tables/context-sessions.js +0 -37
- package/dist/db/schema/tables/conversations.d.ts +0 -9
- package/dist/db/schema/tables/conversations.js +0 -47
- package/dist/db/schema/tables/core-memory.d.ts +0 -9
- package/dist/db/schema/tables/core-memory.js +0 -41
- package/dist/db/schema/tables/entities.d.ts +0 -9
- package/dist/db/schema/tables/entities.js +0 -39
- package/dist/db/schema/tables/entity-relations.d.ts +0 -9
- package/dist/db/schema/tables/entity-relations.js +0 -31
- package/dist/db/schema/tables/learnings.d.ts +0 -9
- package/dist/db/schema/tables/learnings.js +0 -66
- package/dist/db/schema/tables/memories.d.ts +0 -9
- package/dist/db/schema/tables/memories.js +0 -161
- package/dist/db/schema/tables/memory-associations.d.ts +0 -9
- package/dist/db/schema/tables/memory-associations.js +0 -39
- package/dist/db/schema/tables/memory-hash-cache.d.ts +0 -9
- package/dist/db/schema/tables/memory-hash-cache.js +0 -29
- package/dist/db/schema/tables/memory-merge-history.d.ts +0 -9
- package/dist/db/schema/tables/memory-merge-history.js +0 -33
- package/dist/db/schema/tables/memory-merge-proposals.d.ts +0 -9
- package/dist/db/schema/tables/memory-merge-proposals.js +0 -39
- package/dist/db/schema/tables/messages.d.ts +0 -9
- package/dist/db/schema/tables/messages.js +0 -41
- package/dist/db/schema/tables/namespaces.d.ts +0 -9
- package/dist/db/schema/tables/namespaces.js +0 -37
- package/dist/db/schema/tables/projects.d.ts +0 -9
- package/dist/db/schema/tables/projects.js +0 -31
- package/dist/db/schema/tables/users.d.ts +0 -9
- package/dist/db/schema/tables/users.js +0 -27
- package/dist/db/schema.d.ts +0 -3
- package/dist/db/schema.js +0 -11
- package/dist/db/supabase.d.ts +0 -9
- package/dist/db/supabase.js +0 -24
- package/dist/index.d.ts +0 -7
- package/dist/index.js +0 -1677
- package/dist/vendor/sql.js/sql-wasm.wasm +0 -0
- package/dist/webui/server.d.ts +0 -5
- package/dist/webui/server.js +0 -642
- package/generated/mcp/manifest.json +0 -23
- package/generated/mcp/mcp-servers.json +0 -25
- package/generated/mcp/mcporter.json +0 -34
- package/generated/mcp/openclaw-memory-qmd.json +0 -17
- package/generated/mcp/runtime.json +0 -12
- package/scripts/README.md +0 -60
- package/scripts/build-release.sh +0 -36
- package/scripts/check-secrets.js +0 -132
- package/scripts/copy-runtime-assets.mjs +0 -26
- package/scripts/generate-mcp.mjs +0 -264
- package/scripts/github-release.sh +0 -77
- package/scripts/init-dirs.mjs +0 -13
- package/scripts/install-claude-code.sh +0 -85
- package/scripts/install-cursor.sh +0 -56
- package/scripts/install-hooks.sh +0 -73
- package/scripts/install-interactive.mjs +0 -357
- package/scripts/install-opencode.sh +0 -75
- package/scripts/install-plugin.mjs +0 -415
- package/scripts/install-windsurf.sh +0 -67
- package/scripts/remote-preflight.mjs +0 -62
- package/scripts/squish-fallback.mjs +0 -132
- package/scripts/test-interactive.mjs +0 -131
- package/scripts/verify-mcp.mjs +0 -214
- package/skills/squish-memory/scripts/install.mjs +0 -335
- package/skills/squish-memory/write_skill.js +0 -2
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/** Job Runner - Maintenance job implementations */
|
|
2
|
+
|
|
3
|
+
import { logger } from '../logger.js';
|
|
4
|
+
import { type JobExecutionContext } from './cron-scheduler.js';
|
|
5
|
+
import { runDeduplicationJob } from '../consolidation.js';
|
|
6
|
+
import { runLifecycleMaintenance } from '../lifecycle.js';
|
|
7
|
+
import { pruneWeakAssociations } from '../associations.js';
|
|
8
|
+
import { pruneOldSummaries } from '../summarization.js';
|
|
9
|
+
import { getDb } from '../../db/index.js';
|
|
10
|
+
import { memories, memoryFeedback } from '../../db/drizzle/schema-sqlite.js';
|
|
11
|
+
import { eq, and, gt, lt } from 'drizzle-orm';
|
|
12
|
+
|
|
13
|
+
export async function runNightlyJob(context: JobExecutionContext): Promise<{
|
|
14
|
+
recordsProcessed: number;
|
|
15
|
+
summary: Record<string, unknown>;
|
|
16
|
+
}> {
|
|
17
|
+
const summary: Record<string, unknown> = {};
|
|
18
|
+
let recordsProcessed = 0;
|
|
19
|
+
|
|
20
|
+
logger.info('[NightlyJob] Starting nightly maintenance');
|
|
21
|
+
|
|
22
|
+
if (context.config.applyDecay !== false || context.config.updateTiers !== false) {
|
|
23
|
+
try {
|
|
24
|
+
const lifecycleResult = await runLifecycleMaintenance();
|
|
25
|
+
summary.decayApplied = lifecycleResult?.decayed || 0;
|
|
26
|
+
// Simplified: hot/cold only (warm removed)
|
|
27
|
+
summary.tiersUpdated = (lifecycleResult?.tierChanges?.hot || 0) +
|
|
28
|
+
(lifecycleResult?.tierChanges?.cold || 0);
|
|
29
|
+
recordsProcessed += summary.decayApplied as number;
|
|
30
|
+
recordsProcessed += summary.tiersUpdated as number;
|
|
31
|
+
logger.info(`[NightlyJob] Lifecycle: ${summary.decayApplied} decayed, ${summary.tiersUpdated} tier updates`);
|
|
32
|
+
} catch (error) {
|
|
33
|
+
logger.error('[NightlyJob] Lifecycle maintenance failed:', error);
|
|
34
|
+
summary.lifecycleError = error instanceof Error ? error.message : String(error);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (context.config.mergeDuplicates !== false) {
|
|
39
|
+
try {
|
|
40
|
+
const dedupResult = await runDeduplicationJob();
|
|
41
|
+
summary.duplicatesMerged = dedupResult?.mergedCount || 0;
|
|
42
|
+
recordsProcessed += summary.duplicatesMerged as number;
|
|
43
|
+
logger.info(`[NightlyJob] Merged ${summary.duplicatesMerged} duplicate memories`);
|
|
44
|
+
} catch (error) {
|
|
45
|
+
logger.error('[NightlyJob] Deduplication failed:', error);
|
|
46
|
+
summary.dedupError = error instanceof Error ? error.message : String(error);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (context.config.boostAccessed !== false) {
|
|
51
|
+
try {
|
|
52
|
+
const boostResult = await boostFrequentlyAccessed();
|
|
53
|
+
summary.memoriesBoosted = boostResult;
|
|
54
|
+
recordsProcessed += boostResult;
|
|
55
|
+
logger.info(`[NightlyJob] Boosted ${summary.memoriesBoosted} frequently accessed memories`);
|
|
56
|
+
} catch (error) {
|
|
57
|
+
logger.error('[NightlyJob] Boost failed:', error);
|
|
58
|
+
summary.boostError = error instanceof Error ? error.message : String(error);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
logger.info(`[NightlyJob] Completed: ${recordsProcessed} records processed`);
|
|
63
|
+
|
|
64
|
+
return { recordsProcessed, summary };
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export async function runWeeklyJob(context: JobExecutionContext): Promise<{
|
|
68
|
+
recordsProcessed: number;
|
|
69
|
+
summary: Record<string, unknown>;
|
|
70
|
+
}> {
|
|
71
|
+
const summary: Record<string, unknown> = {};
|
|
72
|
+
let recordsProcessed = 0;
|
|
73
|
+
|
|
74
|
+
logger.info('[WeeklyJob] Starting weekly maintenance');
|
|
75
|
+
|
|
76
|
+
if (context.config.archiveStale !== false) {
|
|
77
|
+
try {
|
|
78
|
+
const archiveResult = await archiveStaleMemories(90);
|
|
79
|
+
summary.memoriesArchived = archiveResult;
|
|
80
|
+
recordsProcessed += archiveResult;
|
|
81
|
+
logger.info(`[WeeklyJob] Archived ${summary.memoriesArchived} stale memories`);
|
|
82
|
+
} catch (error) {
|
|
83
|
+
logger.error('[WeeklyJob] Archive failed:', error);
|
|
84
|
+
summary.archiveError = error instanceof Error ? error.message : String(error);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (context.config.pruneAssociations !== false) {
|
|
89
|
+
try {
|
|
90
|
+
const pruneResult = await pruneWeakAssociations();
|
|
91
|
+
summary.associationsPruned = typeof pruneResult === 'number' ? pruneResult : 0;
|
|
92
|
+
recordsProcessed += summary.associationsPruned as number;
|
|
93
|
+
logger.info(`[WeeklyJob] Pruned ${summary.associationsPruned} weak associations`);
|
|
94
|
+
} catch (error) {
|
|
95
|
+
logger.error('[WeeklyJob] Association pruning failed:', error);
|
|
96
|
+
summary.pruneError = error instanceof Error ? error.message : String(error);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (context.config.pruneSummaries !== false) {
|
|
101
|
+
try {
|
|
102
|
+
const summaryPruneResult = await pruneOldSummaries(30);
|
|
103
|
+
summary.summariesPruned = typeof summaryPruneResult === 'number' ? summaryPruneResult : 0;
|
|
104
|
+
recordsProcessed += summary.summariesPruned as number;
|
|
105
|
+
logger.info(`[WeeklyJob] Pruned ${summary.summariesPruned} old summaries`);
|
|
106
|
+
} catch (error) {
|
|
107
|
+
logger.error('[WeeklyJob] Summary pruning failed:', error);
|
|
108
|
+
summary.summaryPruneError = error instanceof Error ? error.message : String(error);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (context.config.cleanupFeedback !== false) {
|
|
113
|
+
try {
|
|
114
|
+
const feedbackCleanupResult = await cleanupOldFeedbackRecords(30);
|
|
115
|
+
summary.feedbackRecordsCleaned = feedbackCleanupResult;
|
|
116
|
+
recordsProcessed += feedbackCleanupResult;
|
|
117
|
+
logger.info(`[WeeklyJob] Cleaned ${summary.feedbackRecordsCleaned} old feedback records`);
|
|
118
|
+
} catch (error) {
|
|
119
|
+
logger.error('[WeeklyJob] Feedback cleanup failed:', error);
|
|
120
|
+
summary.feedbackError = error instanceof Error ? error.message : String(error);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
logger.info(`[WeeklyJob] Completed: ${recordsProcessed} records processed`);
|
|
125
|
+
|
|
126
|
+
return { recordsProcessed, summary };
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
async function boostFrequentlyAccessed(): Promise<number> {
|
|
130
|
+
const db = await getDb();
|
|
131
|
+
if (!db) return 0;
|
|
132
|
+
|
|
133
|
+
const sqliteDb = db as any;
|
|
134
|
+
const frequentlyAccessed = await sqliteDb
|
|
135
|
+
.select()
|
|
136
|
+
.from(memories)
|
|
137
|
+
.where(gt(memories.accessCount, 3));
|
|
138
|
+
|
|
139
|
+
let boosted = 0;
|
|
140
|
+
for (const memory of frequentlyAccessed) {
|
|
141
|
+
const currentPriority = memory.retrievalPriority ?? 50;
|
|
142
|
+
const newPriority = Math.min(100, currentPriority + 5);
|
|
143
|
+
|
|
144
|
+
await sqliteDb
|
|
145
|
+
.update(memories)
|
|
146
|
+
.set({ retrievalPriority: newPriority })
|
|
147
|
+
.where(eq(memories.id, memory.id));
|
|
148
|
+
|
|
149
|
+
boosted++;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return boosted;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
async function archiveStaleMemories(daysOld: number): Promise<number> {
|
|
156
|
+
const db = await getDb();
|
|
157
|
+
if (!db) return 0;
|
|
158
|
+
|
|
159
|
+
const staleThreshold = new Date(Date.now() - daysOld * 24 * 60 * 60 * 1000);
|
|
160
|
+
const sqliteDb = db as any;
|
|
161
|
+
|
|
162
|
+
const staleMemories = await sqliteDb
|
|
163
|
+
.select()
|
|
164
|
+
.from(memories)
|
|
165
|
+
.where(and(
|
|
166
|
+
lt(memories.lastAccessedAt, staleThreshold),
|
|
167
|
+
lt(memories.importanceScore, 30),
|
|
168
|
+
eq(memories.isProtected, false),
|
|
169
|
+
eq(memories.isPinned, false)
|
|
170
|
+
));
|
|
171
|
+
|
|
172
|
+
let archived = 0;
|
|
173
|
+
for (const memory of staleMemories) {
|
|
174
|
+
await sqliteDb
|
|
175
|
+
.update(memories)
|
|
176
|
+
.set({ tier: 'cold' })
|
|
177
|
+
.where(eq(memories.id, memory.id));
|
|
178
|
+
|
|
179
|
+
archived++;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
return archived;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
async function cleanupOldFeedbackRecords(daysOld: number): Promise<number> {
|
|
186
|
+
const db = await getDb();
|
|
187
|
+
if (!db) return 0;
|
|
188
|
+
|
|
189
|
+
const oldThreshold = new Date(Date.now() - daysOld * 24 * 60 * 60 * 1000);
|
|
190
|
+
const sqliteDb = db as any;
|
|
191
|
+
|
|
192
|
+
await sqliteDb
|
|
193
|
+
.delete(memoryFeedback)
|
|
194
|
+
.where(lt(memoryFeedback.createdAt, oldThreshold));
|
|
195
|
+
|
|
196
|
+
return 0;
|
|
197
|
+
}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { and, desc, eq, gte, lte } from 'drizzle-orm';
|
|
2
|
+
import { getDb } from '../../db/index.js';
|
|
3
|
+
import { getSchema } from '../../db/schema.js';
|
|
4
|
+
import { config } from '../../config.js';
|
|
5
|
+
import { requireProject } from '../../core/projects.js';
|
|
6
|
+
import { deserializeMetadata } from '../../core/memory/serialization.js';
|
|
7
|
+
import { createDatabaseClient } from '../storage/database.js';
|
|
8
|
+
import { normalizeTimestamp, clampLimit } from '../lib/utils.js';
|
|
9
|
+
|
|
10
|
+
export interface ConversationRecord {
|
|
11
|
+
id: string;
|
|
12
|
+
projectId?: string | null;
|
|
13
|
+
sessionId: string;
|
|
14
|
+
title?: string | null;
|
|
15
|
+
summary?: string | null;
|
|
16
|
+
messageCount?: number | null;
|
|
17
|
+
tokenCount?: number | null;
|
|
18
|
+
startedAt?: string | null;
|
|
19
|
+
endedAt?: string | null;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface ConversationSearchInput {
|
|
23
|
+
query: string;
|
|
24
|
+
limit?: number;
|
|
25
|
+
role?: 'user' | 'assistant';
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface RecentConversationsInput {
|
|
29
|
+
n?: number;
|
|
30
|
+
before?: string;
|
|
31
|
+
after?: string;
|
|
32
|
+
project?: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export async function searchConversations(input: ConversationSearchInput): Promise<ConversationRecord[]> {
|
|
36
|
+
const limit = clampLimit(input.limit, 5, 1, 50);
|
|
37
|
+
if (config.isTeamMode) {
|
|
38
|
+
return await searchConversationsPostgres(input, limit);
|
|
39
|
+
}
|
|
40
|
+
return await searchConversationsSqlite(input, limit);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export async function getRecentConversations(input: RecentConversationsInput): Promise<ConversationRecord[]> {
|
|
44
|
+
const db = createDatabaseClient(await getDb());
|
|
45
|
+
const schema = await getSchema();
|
|
46
|
+
const limit = clampLimit(input.n, 3, 1, 50);
|
|
47
|
+
const whereParts = [] as any[];
|
|
48
|
+
|
|
49
|
+
if (input.project) {
|
|
50
|
+
const project = await requireProject(input.project);
|
|
51
|
+
whereParts.push(eq(schema.conversations.projectId, project.id));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (input.before) {
|
|
55
|
+
whereParts.push(lte(schema.conversations.startedAt, new Date(input.before)));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (input.after) {
|
|
59
|
+
whereParts.push(gte(schema.conversations.startedAt, new Date(input.after)));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const query = whereParts.length
|
|
63
|
+
? db.select().from(schema.conversations).where(and(...whereParts)).orderBy(desc(schema.conversations.startedAt)).limit(limit)
|
|
64
|
+
: db.select().from(schema.conversations).orderBy(desc(schema.conversations.startedAt)).limit(limit);
|
|
65
|
+
|
|
66
|
+
const rows = await query;
|
|
67
|
+
return rows.map((row: any) => normalizeConversation(row));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async function searchConversationsSqlite(input: ConversationSearchInput, limit: number): Promise<ConversationRecord[]> {
|
|
71
|
+
const db = createDatabaseClient(await getDb());
|
|
72
|
+
const sqlite = db.$client as any;
|
|
73
|
+
const params: Array<string | number> = [input.query];
|
|
74
|
+
let where = 'messages_fts MATCH ?';
|
|
75
|
+
|
|
76
|
+
if (input.role) {
|
|
77
|
+
where += ' AND m.role = ?';
|
|
78
|
+
params.push(input.role);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
params.push(limit);
|
|
82
|
+
|
|
83
|
+
const statement = sqlite.prepare(`
|
|
84
|
+
SELECT DISTINCT
|
|
85
|
+
c.id as id,
|
|
86
|
+
c.project_id as projectId,
|
|
87
|
+
c.session_id as sessionId,
|
|
88
|
+
c.title as title,
|
|
89
|
+
c.summary as summary,
|
|
90
|
+
c.message_count as messageCount,
|
|
91
|
+
c.token_count as tokenCount,
|
|
92
|
+
c.started_at as startedAt,
|
|
93
|
+
c.ended_at as endedAt,
|
|
94
|
+
c.metadata as metadata
|
|
95
|
+
FROM conversations c
|
|
96
|
+
JOIN messages m ON m.conversation_id = c.id
|
|
97
|
+
JOIN messages_fts ON messages_fts.rowid = m.rowid
|
|
98
|
+
WHERE ${where}
|
|
99
|
+
ORDER BY c.started_at DESC
|
|
100
|
+
LIMIT ?
|
|
101
|
+
`);
|
|
102
|
+
|
|
103
|
+
const rows = statement.all(...params) as Array<{
|
|
104
|
+
id: string;
|
|
105
|
+
projectId: string | null;
|
|
106
|
+
sessionId: string;
|
|
107
|
+
title: string | null;
|
|
108
|
+
summary: string | null;
|
|
109
|
+
messageCount: number | null;
|
|
110
|
+
tokenCount: number | null;
|
|
111
|
+
startedAt: string | null;
|
|
112
|
+
endedAt: string | null;
|
|
113
|
+
metadata: string | null;
|
|
114
|
+
}>;
|
|
115
|
+
return rows.map((row: any) => normalizeConversation(row));
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
async function searchConversationsPostgres(input: ConversationSearchInput, limit: number): Promise<ConversationRecord[]> {
|
|
119
|
+
const db = createDatabaseClient(await getDb());
|
|
120
|
+
const values: Array<string | number> = [`%${input.query}%`];
|
|
121
|
+
const whereParts: string[] = [`m.content ILIKE $1`];
|
|
122
|
+
|
|
123
|
+
if (input.role) {
|
|
124
|
+
values.push(input.role);
|
|
125
|
+
whereParts.push(`m.role = $${values.length}`);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
values.push(limit);
|
|
129
|
+
|
|
130
|
+
const rows = await (db.$client as any).query(
|
|
131
|
+
`SELECT DISTINCT ON (c.id)
|
|
132
|
+
c.id as "id",
|
|
133
|
+
c.project_id as "projectId",
|
|
134
|
+
c.session_id as "sessionId",
|
|
135
|
+
c.title as "title",
|
|
136
|
+
c.summary as "summary",
|
|
137
|
+
c.message_count as "messageCount",
|
|
138
|
+
c.token_count as "tokenCount",
|
|
139
|
+
c.started_at as "startedAt",
|
|
140
|
+
c.ended_at as "endedAt",
|
|
141
|
+
c.metadata as "metadata"
|
|
142
|
+
FROM conversations c
|
|
143
|
+
JOIN messages m ON m.conversation_id = c.id
|
|
144
|
+
WHERE ${whereParts.join(' AND ')}
|
|
145
|
+
ORDER BY c.id, c.started_at DESC
|
|
146
|
+
LIMIT $${values.length}`,
|
|
147
|
+
values
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
return rows.rows.map((row: any) => normalizeConversation(row));
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function normalizeConversation(row: any): ConversationRecord {
|
|
154
|
+
const metadata = deserializeMetadata(row.metadata ?? null);
|
|
155
|
+
return {
|
|
156
|
+
id: row.id,
|
|
157
|
+
projectId: row.projectId ?? row.project_id ?? null,
|
|
158
|
+
sessionId: row.sessionId ?? row.session_id,
|
|
159
|
+
title: row.title ?? null,
|
|
160
|
+
summary: row.summary ?? null,
|
|
161
|
+
messageCount: row.messageCount ?? row.message_count ?? null,
|
|
162
|
+
tokenCount: row.tokenCount ?? row.token_count ?? null,
|
|
163
|
+
startedAt: normalizeTimestamp(row.startedAt ?? row.started_at),
|
|
164
|
+
endedAt: normalizeTimestamp(row.endedAt ?? row.ended_at),
|
|
165
|
+
};
|
|
166
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { desc, eq } from 'drizzle-orm';
|
|
2
|
+
import { getDb } from '../../db/index.js';
|
|
3
|
+
import { getSchema } from '../../db/schema.js';
|
|
4
|
+
import { config } from '../../config.js';
|
|
5
|
+
import { requireProject } from '../../core/projects.js';
|
|
6
|
+
import { deserializeMetadata } from '../../core/memory/serialization.js';
|
|
7
|
+
import { createDatabaseClient } from '../storage/database.js';
|
|
8
|
+
import { normalizeTimestamp } from '../lib/utils.js';
|
|
9
|
+
|
|
10
|
+
export interface EntityRecord {
|
|
11
|
+
id: string;
|
|
12
|
+
projectId?: string | null;
|
|
13
|
+
name: string;
|
|
14
|
+
type: string;
|
|
15
|
+
description?: string | null;
|
|
16
|
+
properties?: Record<string, unknown> | null;
|
|
17
|
+
createdAt?: string | null;
|
|
18
|
+
updatedAt?: string | null;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export async function getEntitiesForProject(projectPath: string, limit: number): Promise<EntityRecord[]> {
|
|
22
|
+
const db = createDatabaseClient(await getDb());
|
|
23
|
+
const schema = await getSchema();
|
|
24
|
+
const project = await requireProject(projectPath);
|
|
25
|
+
|
|
26
|
+
const rows = await db.select().from(schema.entities)
|
|
27
|
+
.where(eq(schema.entities.projectId, project.id))
|
|
28
|
+
.orderBy(desc(schema.entities.createdAt))
|
|
29
|
+
.limit(limit);
|
|
30
|
+
|
|
31
|
+
return rows.map((row: any) => normalizeEntity(row));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function normalizeEntity(row: any): EntityRecord {
|
|
35
|
+
const properties = deserializeMetadata(row.properties ?? null);
|
|
36
|
+
return {
|
|
37
|
+
id: row.id,
|
|
38
|
+
projectId: row.projectId ?? row.project_id ?? null,
|
|
39
|
+
name: row.name,
|
|
40
|
+
type: row.type,
|
|
41
|
+
description: row.description ?? null,
|
|
42
|
+
properties,
|
|
43
|
+
createdAt: normalizeTimestamp(row.createdAt ?? row.created_at),
|
|
44
|
+
updatedAt: normalizeTimestamp(row.updatedAt ?? row.updated_at),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Folder Context Generation
|
|
3
|
+
* Generates and maintains per-folder CLAUDE.md files with session summaries
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { promises as fs } from 'fs';
|
|
7
|
+
import path from 'path';
|
|
8
|
+
import { getRecentConversations } from './conversations.js';
|
|
9
|
+
import { logger } from '../../core/logger.js';
|
|
10
|
+
|
|
11
|
+
interface FolderContextData {
|
|
12
|
+
projectPath: string;
|
|
13
|
+
projectName: string;
|
|
14
|
+
gitRemote?: string;
|
|
15
|
+
gitBranch?: string;
|
|
16
|
+
recentConversations: Array<{ content: string; timestamp: string }>;
|
|
17
|
+
keyObservations: Array<{ summary: string; timestamp: string; type: string }>;
|
|
18
|
+
lastUpdated: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function formatDate(dateStr: string): string {
|
|
22
|
+
return new Date(dateStr).toLocaleDateString('en-US', {
|
|
23
|
+
year: 'numeric',
|
|
24
|
+
month: '2-digit',
|
|
25
|
+
day: '2-digit'
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function generateClaudeMdContent(data: FolderContextData): string {
|
|
30
|
+
const lines: string[] = [
|
|
31
|
+
`# Squish Context - ${data.projectName}`,
|
|
32
|
+
'',
|
|
33
|
+
'<squish-context>',
|
|
34
|
+
'',
|
|
35
|
+
`**Project**: ${data.projectPath}`
|
|
36
|
+
];
|
|
37
|
+
|
|
38
|
+
if (data.gitRemote) {
|
|
39
|
+
const gitInfo = data.gitBranch ? `${data.gitRemote} @ ${data.gitBranch}` : data.gitRemote;
|
|
40
|
+
lines.push(`**Git**: ${gitInfo}`);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
lines.push(`**Last Updated**: ${data.lastUpdated}`, '');
|
|
44
|
+
|
|
45
|
+
if (data.recentConversations.length > 0) {
|
|
46
|
+
lines.push('## Recent Activity');
|
|
47
|
+
for (const conv of data.recentConversations) {
|
|
48
|
+
const date = formatDate(conv.timestamp);
|
|
49
|
+
const preview = conv.content.substring(0, 80).replace(/\n/g, ' ');
|
|
50
|
+
lines.push(`- [${date}] ${preview}...`);
|
|
51
|
+
}
|
|
52
|
+
lines.push('');
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (data.keyObservations.length > 0) {
|
|
56
|
+
lines.push('## Key Observations');
|
|
57
|
+
for (const obs of data.keyObservations) {
|
|
58
|
+
lines.push(`- ${obs.summary} (${obs.type})`);
|
|
59
|
+
}
|
|
60
|
+
lines.push('');
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
lines.push(
|
|
64
|
+
'## Previous Context',
|
|
65
|
+
'*(Managed by Squish - do not edit this section)*',
|
|
66
|
+
'',
|
|
67
|
+
'</squish-context>',
|
|
68
|
+
'',
|
|
69
|
+
'<!-- You can add custom notes and project context here -->',
|
|
70
|
+
''
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
return lines.join('\n');
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async function collectFolderContextData(projectPath: string): Promise<FolderContextData> {
|
|
77
|
+
const recentConversations = await getRecentConversations({ n: 5, project: projectPath })
|
|
78
|
+
.catch(() => []);
|
|
79
|
+
|
|
80
|
+
return {
|
|
81
|
+
projectPath,
|
|
82
|
+
projectName: path.basename(projectPath),
|
|
83
|
+
recentConversations: (recentConversations || []).map((conv: any) => ({
|
|
84
|
+
content: conv?.summary || '',
|
|
85
|
+
timestamp: conv?.startedAt?.toISOString() || new Date().toISOString()
|
|
86
|
+
})),
|
|
87
|
+
keyObservations: [],
|
|
88
|
+
lastUpdated: new Date().toISOString()
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
async function preserveUserContent(claudeMdPath: string): Promise<string> {
|
|
93
|
+
try {
|
|
94
|
+
const existingContent = await fs.readFile(claudeMdPath, 'utf-8');
|
|
95
|
+
const match = existingContent.match(/<\/squish-context>([\s\S]*)/);
|
|
96
|
+
return match ? match[1] : '';
|
|
97
|
+
} catch {
|
|
98
|
+
return '';
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export async function generateAndInjectFolderContext(projectPath: string): Promise<void> {
|
|
103
|
+
const claudeMdPath = path.join(projectPath, 'CLAUDE.md');
|
|
104
|
+
const contextData = await collectFolderContextData(projectPath);
|
|
105
|
+
const newContent = generateClaudeMdContent(contextData);
|
|
106
|
+
const userContent = await preserveUserContent(claudeMdPath);
|
|
107
|
+
|
|
108
|
+
await fs.writeFile(claudeMdPath, newContent + userContent, 'utf-8');
|
|
109
|
+
logger.info(`Updated folder context: ${claudeMdPath}`);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export async function readFolderContext(projectPath: string): Promise<FolderContextData | null> {
|
|
113
|
+
try {
|
|
114
|
+
const claudeMdPath = path.join(projectPath, 'CLAUDE.md');
|
|
115
|
+
const content = await fs.readFile(claudeMdPath, 'utf-8');
|
|
116
|
+
|
|
117
|
+
const contextMatch = content.match(/<squish-context>([\s\S]*?)<\/squish-context>/);
|
|
118
|
+
if (!contextMatch) return null;
|
|
119
|
+
|
|
120
|
+
const contextContent = contextMatch[1];
|
|
121
|
+
|
|
122
|
+
const projectPathMatch = contextContent.match(/\*\*Project\*\*:\s*(.+)/);
|
|
123
|
+
const gitMatch = contextContent.match(/\*\*Git\*\*:\s*(.+)/);
|
|
124
|
+
const updatedMatch = contextContent.match(/\*\*Last Updated\*\*:\s*(.+)/);
|
|
125
|
+
|
|
126
|
+
return {
|
|
127
|
+
projectPath: projectPathMatch?.[1] || projectPath,
|
|
128
|
+
projectName: path.basename(projectPath),
|
|
129
|
+
gitRemote: gitMatch?.[1].split(' @')[0],
|
|
130
|
+
gitBranch: gitMatch?.[1].split('@ ')[1],
|
|
131
|
+
recentConversations: [],
|
|
132
|
+
keyObservations: [],
|
|
133
|
+
lastUpdated: updatedMatch?.[1] || new Date().toISOString()
|
|
134
|
+
};
|
|
135
|
+
} catch {
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export async function injectFolderContextIntoSession(projectPath: string): Promise<string> {
|
|
141
|
+
try {
|
|
142
|
+
const claudeMdPath = path.join(projectPath, 'CLAUDE.md');
|
|
143
|
+
const content = await fs.readFile(claudeMdPath, 'utf-8');
|
|
144
|
+
const match = content.match(/<squish-context>([\s\S]*?)<\/squish-context>/);
|
|
145
|
+
|
|
146
|
+
if (match) {
|
|
147
|
+
return `\n<squish-folder-context>\n${match[1]}\n</squish-folder-context>\n`;
|
|
148
|
+
}
|
|
149
|
+
} catch {
|
|
150
|
+
// File doesn't exist or can't be read
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return '';
|
|
154
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { getDb } from '../../db/index.js';
|
|
2
|
+
import { memoryAssociations } from '../../db/drizzle/schema.js';
|
|
3
|
+
import { inArray } from 'drizzle-orm';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Compute a simple graph boost for a set of memory IDs.
|
|
7
|
+
* For each memory, sum (weight * coactivationCount) of outgoing associations.
|
|
8
|
+
* Returns a map from memoryId to boost value (default 0).
|
|
9
|
+
*/
|
|
10
|
+
export async function computeGraphBoost(memoryIds: string[]): Promise<Record<string, number>> {
|
|
11
|
+
const boost: Record<string, number> = {};
|
|
12
|
+
if (memoryIds.length === 0) return boost;
|
|
13
|
+
const db = await getDb();
|
|
14
|
+
// @ts-ignore - drizzle overload
|
|
15
|
+
const rows = await db.select().from(memoryAssociations).where(inArray(memoryAssociations.fromMemoryId, memoryIds));
|
|
16
|
+
for (const row of rows) {
|
|
17
|
+
const from = row.fromMemoryId as string;
|
|
18
|
+
const val = (row.weight ?? 0) * (row.coactivationCount ?? 0);
|
|
19
|
+
boost[from] = (boost[from] ?? 0) + val;
|
|
20
|
+
}
|
|
21
|
+
return boost;
|
|
22
|
+
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
// Search feature - Search and discovery
|
|
2
|
-
export * from './conversations.js';
|
|
3
|
-
export * from './entities.js';
|
|
4
|
-
export * from './folder-context.js';
|
|
5
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
// Search feature - Search and discovery
|
|
2
|
+
export * from './conversations.js';
|
|
3
|
+
export * from './entities.js';
|
|
4
|
+
export * from './folder-context.js';
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { getQMDClient, type QMDSearchResult } from '../embeddings/qmd-client.js';
|
|
2
|
+
|
|
3
|
+
export type { QMDSearchResult };
|
|
4
|
+
|
|
5
|
+
export interface QMDStatus {
|
|
6
|
+
indexHealth: string;
|
|
7
|
+
documentCount: number;
|
|
8
|
+
collections?: Array<{
|
|
9
|
+
name: string;
|
|
10
|
+
path: string;
|
|
11
|
+
documentCount: number;
|
|
12
|
+
}>;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export async function isAvailable(): Promise<boolean> {
|
|
16
|
+
const client = await getQMDClient();
|
|
17
|
+
return client.isAvailable();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export async function search(
|
|
21
|
+
query: string,
|
|
22
|
+
options: { collection?: string; limit?: number; minScore?: number } = {}
|
|
23
|
+
): Promise<QMDSearchResult[]> {
|
|
24
|
+
const client = await getQMDClient();
|
|
25
|
+
if (!(await client.isAvailable())) return [];
|
|
26
|
+
return client.search({ query, ...options });
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export async function vsearch(
|
|
30
|
+
query: string,
|
|
31
|
+
options: { collection?: string; limit?: number; minScore?: number } = {}
|
|
32
|
+
): Promise<QMDSearchResult[]> {
|
|
33
|
+
const client = await getQMDClient();
|
|
34
|
+
if (!(await client.isAvailable())) return [];
|
|
35
|
+
return client.vsearch({ query, ...options });
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export async function query(
|
|
39
|
+
queryText: string,
|
|
40
|
+
options: { collection?: string; limit?: number; minScore?: number } = {}
|
|
41
|
+
): Promise<QMDSearchResult[]> {
|
|
42
|
+
const client = await getQMDClient();
|
|
43
|
+
if (!(await client.isAvailable())) return [];
|
|
44
|
+
return client.query({ query: queryText, ...options });
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export async function get(
|
|
48
|
+
pathOrDocid: string,
|
|
49
|
+
options: { full?: boolean; maxBytes?: number } = {}
|
|
50
|
+
): Promise<string> {
|
|
51
|
+
const client = await getQMDClient();
|
|
52
|
+
if (!(await client.isAvailable())) return '';
|
|
53
|
+
return client.get({ pathOrDocid, ...options });
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export async function status(): Promise<QMDStatus | null> {
|
|
57
|
+
const client = await getQMDClient();
|
|
58
|
+
if (!(await client.isAvailable())) return null;
|
|
59
|
+
const result = await client.status();
|
|
60
|
+
if (!result) return null;
|
|
61
|
+
|
|
62
|
+
return {
|
|
63
|
+
indexHealth: result.indexHealth,
|
|
64
|
+
documentCount: result.collections.reduce((sum, collection) => sum + collection.documentCount, 0),
|
|
65
|
+
collections: result.collections,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export async function embed(): Promise<number[] | null> {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export async function ensureWikiDir(projectPath: string): Promise<string> {
|
|
74
|
+
const { join } = await import('path');
|
|
75
|
+
const { mkdirSync, existsSync } = await import('fs');
|
|
76
|
+
const wikiDir = join(projectPath, '.squish', 'wiki');
|
|
77
|
+
if (!existsSync(wikiDir)) mkdirSync(wikiDir, { recursive: true });
|
|
78
|
+
return wikiDir;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export async function close(): Promise<void> {
|
|
82
|
+
const client = await getQMDClient();
|
|
83
|
+
await client.disconnect();
|
|
84
|
+
}
|