squish-memory 1.1.5 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +32 -16
- package/CHANGELOG.md +147 -0
- package/README.md +120 -78
- package/{scripts → bin}/dependency-manager.mjs +217 -217
- package/{scripts → bin}/detect-clients.mjs +78 -78
- package/bin/install-interactive.mjs +321 -0
- package/bin/squish-mcp.mjs +44 -0
- package/bin/squish.mjs +33 -0
- package/config/mcp-migration-map.json +1 -6
- package/config/mcp-mode-semantics.json +19 -23
- package/config/mcp-remote-auth.json +3 -26
- package/config/mcp-universal.schema.json +5 -35
- package/config/settings.json +107 -52
- package/config.js +5 -0
- package/config.ts +218 -0
- package/core/adapters/config/claude-code.ts +133 -0
- package/core/adapters/config/cursor.ts +90 -0
- package/core/adapters/config/opencode.ts +89 -0
- package/core/adapters/config/windsurf.ts +90 -0
- package/core/adapters/index.ts +102 -0
- package/core/adapters/timeline.ts +116 -0
- package/core/adapters/types.ts +166 -0
- package/core/agent-preferences.ts +140 -0
- package/core/algorithms/analytics/token-estimator.ts +216 -0
- package/core/algorithms/detection/hash-filters.ts +260 -0
- package/core/algorithms/detection/semantic-ranker.ts +194 -0
- package/core/algorithms/detection/two-stage-detector.ts +421 -0
- package/core/algorithms/handlers/approve-merge.ts +215 -0
- package/core/algorithms/handlers/detect-duplicates.ts +192 -0
- package/core/algorithms/handlers/get-stats.ts +132 -0
- package/core/algorithms/handlers/list-proposals.ts +130 -0
- package/core/algorithms/handlers/preview-merge.ts +139 -0
- package/core/algorithms/handlers/reject-merge.ts +93 -0
- package/core/algorithms/handlers/reverse-merge.ts +155 -0
- package/{dist/core/algorithms/index.js → core/algorithms/index.ts} +39 -26
- package/core/algorithms/operations/cache-maintenance.ts +182 -0
- package/core/algorithms/safety/safety-checks.ts +256 -0
- package/core/algorithms/strategies/merge-strategies.ts +381 -0
- package/core/algorithms/types.ts +140 -0
- package/core/algorithms/utils/response-builder.ts +61 -0
- package/core/associations.ts +363 -0
- package/core/beliefs/decay.ts +289 -0
- package/core/beliefs/extractor.ts +131 -0
- package/core/beliefs/store.ts +557 -0
- package/core/beliefs/types.ts +38 -0
- package/core/commands/mcp-server.ts +5 -0
- package/core/compression.ts +177 -0
- package/core/config.js +2 -0
- package/core/consolidation.ts +330 -0
- package/core/context/agent-context.ts +388 -0
- package/core/context/context-paging.ts +449 -0
- package/core/context/context-window.ts +234 -0
- package/core/context/context.ts +35 -0
- package/core/embeddings/embeddings.ts +616 -0
- package/core/embeddings/google-multimodal.ts +200 -0
- package/{dist/core/local-embeddings.js → core/embeddings/local-embeddings.ts} +12 -11
- package/core/embeddings/qmd-client.ts +495 -0
- package/core/embeddings/transformers-local.ts +261 -0
- package/core/embeddings.js +4 -0
- package/core/error-handling.ts +206 -0
- package/core/external +219 -0
- package/core/graph/entity-deduplicator.ts +232 -0
- package/core/graph/graph-builder.ts +257 -0
- package/core/graph/graph-traversal.ts +490 -0
- package/core/graph/index.ts +24 -0
- package/core/graph/llm-entity-extractor.ts +402 -0
- package/core/graph/multi-hop-retrieval.ts +317 -0
- package/core/graph/relationship-extractor.ts +465 -0
- package/core/hooks/agent-hooks.ts +653 -0
- package/core/hooks/auto-tagger.ts +149 -0
- package/core/hooks/capture-filter.ts +169 -0
- package/core/hot-cache.ts +388 -0
- package/core/index.ts +10 -0
- package/core/ingestion/agent-memory.ts +167 -0
- package/core/ingestion/core-memory.ts +326 -0
- package/core/ingestion/learnings.ts +260 -0
- package/core/ingestion/signal-engine.ts +266 -0
- package/core/integrations/obsidian-vault.ts +197 -0
- package/core/layers/generator.ts +115 -0
- package/{dist/core/lib/db-client.d.ts → core/lib/db-client.ts} +168 -114
- package/core/lib/parse-embedding.ts +59 -0
- package/{dist/core/lib/schemas.js → core/lib/schemas.ts} +102 -87
- package/core/lib/types.ts +49 -0
- package/core/lib/utils.ts +151 -0
- package/core/lib/validation.ts +180 -0
- package/core/lifecycle.ts +353 -0
- package/core/logger.ts +59 -0
- package/core/memory/bridge-discovery.ts +395 -0
- package/core/memory/categorizer.ts +390 -0
- package/core/memory/conflict-detector.ts +62 -0
- package/core/memory/consolidation.ts +372 -0
- package/core/memory/context-collector.ts +75 -0
- package/core/memory/contradiction-resolver.ts +494 -0
- package/core/memory/edit-workflow.ts +174 -0
- package/core/memory/entity-extractor.ts +426 -0
- package/core/memory/entity-resolver.ts +89 -0
- package/core/memory/explain.ts +112 -0
- package/core/memory/fact-deriver.ts +300 -0
- package/core/memory/fact-extractor.ts +120 -0
- package/core/memory/feedback-tracker.ts +200 -0
- package/core/memory/hooks.ts +230 -0
- package/core/memory/hybrid-retrieval.ts +65 -0
- package/core/memory/hybrid-scorer.ts +325 -0
- package/core/memory/hybrid-search.ts +748 -0
- package/core/memory/importance.ts +319 -0
- package/{dist/core/memory/index.js → core/memory/index.ts} +11 -10
- package/core/memory/loader.ts +178 -0
- package/core/memory/markdown/markdown-storage.ts +318 -0
- package/core/memory/memories.ts +565 -0
- package/core/memory/memory-lifecycle.ts +51 -0
- package/core/memory/memory-manager.ts +53 -0
- package/core/memory/migrate.ts +173 -0
- package/core/memory/normalization.ts +30 -0
- package/core/memory/path-strengthener.ts +211 -0
- package/core/memory/progressive-disclosure.ts +392 -0
- package/core/memory/query-processor.ts +130 -0
- package/core/memory/query-rewriter.ts +153 -0
- package/core/memory/response-analyzer.ts +81 -0
- package/core/memory/retrieval-feedback.ts +276 -0
- package/core/memory/serialization.ts +83 -0
- package/core/memory/stale-cleaner.ts +147 -0
- package/core/memory/stats.ts +181 -0
- package/core/memory/telemetry.ts +392 -0
- package/core/memory/temporal-facts.ts +356 -0
- package/core/memory/temporal-parser.ts +477 -0
- package/core/memory/trigger-detector.ts +104 -0
- package/core/memory/write-gate.ts +288 -0
- package/{dist/core/places/index.js → core/places/index.ts} +12 -12
- package/core/places/memory-places.ts +339 -0
- package/core/places/places.ts +406 -0
- package/core/places/rules.ts +308 -0
- package/core/places/walking.ts +192 -0
- package/core/projects +89 -0
- package/core/projects.ts +131 -0
- package/core/redis.ts +82 -0
- package/core/responses.ts +187 -0
- package/core/runtime/trust-report.ts +195 -0
- package/core/runtime/trust-state.ts +360 -0
- package/core/scheduler/cron-scheduler.ts +590 -0
- package/core/scheduler/heartbeat.ts +91 -0
- package/{dist/core/scheduler/index.js → core/scheduler/index.ts} +8 -8
- package/core/scheduler/job-runner.ts +197 -0
- package/core/search/conversations.ts +166 -0
- package/core/search/entities.ts +46 -0
- package/core/search/folder-context.ts +154 -0
- package/core/search/graph-boost.ts +22 -0
- package/{dist/core/search/index.js → core/search/index.ts} +4 -5
- package/core/search/qmd-wrapper.ts +84 -0
- package/core/security/encrypt.ts +51 -0
- package/core/security/governance.ts +102 -0
- package/core/security/privacy.ts +108 -0
- package/core/security/secret-detector.ts +122 -0
- package/core/session/auto-load.ts +160 -0
- package/core/session/entity-tracker.ts +363 -0
- package/{dist/core/session/index.js → core/session/index.ts} +7 -7
- package/core/session/reference-resolver.ts +158 -0
- package/core/session/self-iteration-job.ts +478 -0
- package/core/session/session-hooks.ts +69 -0
- package/core/session/types.ts +36 -0
- package/core/session/working-set.ts +275 -0
- package/{dist/core/snapshots/cleanup.js → core/snapshots/cleanup.ts} +13 -12
- package/core/snapshots/comparison.ts +59 -0
- package/core/snapshots/creation.ts +139 -0
- package/core/snapshots/retrieval.ts +44 -0
- package/core/snapshots/stats.ts +63 -0
- package/core/storage/cache.ts +241 -0
- package/core/storage/database.ts +23 -0
- package/{dist/core/summarization/cleanup.js → core/summarization/cleanup.ts} +13 -12
- package/core/summarization/queries.ts +32 -0
- package/core/summarization/stats.ts +64 -0
- package/core/summarization/strategies.ts +52 -0
- package/core/summarization.ts +248 -0
- package/core/temporal-facts.ts +244 -0
- package/core/tracing/collector.ts +470 -0
- package/core/tracing/visualizer.ts +195 -0
- package/core/utils/cleanup-operations.ts +50 -0
- package/core/utils/content-extraction.ts +95 -0
- package/core/utils/filter-builder.ts +56 -0
- package/core/utils/history-traversal.ts +63 -0
- package/core/utils/memory-operations.ts +56 -0
- package/core/utils/query-operations.ts +83 -0
- package/core/utils/summarization-helpers.ts +45 -0
- package/core/utils/temporal-queries.ts +39 -0
- package/{dist/core/utils/vector-operations.js → core/utils/vector-operations.ts} +135 -129
- package/core/utils/version-management.ts +74 -0
- package/core/worker.ts +333 -0
- package/db/adapter.ts +215 -0
- package/{dist/db/bootstrap.js → db/bootstrap.ts} +388 -418
- package/db/drizzle/migrations/0000_needy_cerebro.sql +402 -0
- package/db/drizzle/migrations/meta/0000_snapshot.json +3451 -0
- package/db/drizzle/migrations/meta/_journal.json +13 -0
- package/db/drizzle/schema-sqlite.ts +1032 -0
- package/db/drizzle/schema.ts +1128 -0
- package/db/drizzle.config.ts +12 -0
- package/db/index.ts +83 -0
- package/db/init.sql +5 -0
- package/db/migrations/associations.ts +35 -0
- package/db/migrations/beliefs.ts +89 -0
- package/db/migrations/core-memory.ts +35 -0
- package/db/migrations/fts.ts +59 -0
- package/db/migrations/index.ts +54 -0
- package/db/migrations/indexes.ts +36 -0
- package/db/migrations/learnings.ts +34 -0
- package/db/migrations/maintenance.ts +68 -0
- package/db/migrations/memories.ts +22 -0
- package/db/migrations/memory-places.ts +35 -0
- package/db/migrations/places.ts +49 -0
- package/db/migrations/projects.ts +21 -0
- package/db/migrations/tier-conversion.ts +24 -0
- package/db/neon.ts +22 -0
- package/db/schema/beliefs.ts +50 -0
- package/db/schema/generator.ts +159 -0
- package/db/schema/index.ts +58 -0
- package/db/schema/learnings.ts +32 -0
- package/db/schema/memories.ts +83 -0
- package/db/schema/projects.ts +33 -0
- package/db/schema.ts +13 -0
- package/db/supabase.ts +27 -0
- package/mcp.json.example +8 -11
- package/package.json +140 -159
- package/packages/cli/package.json +22 -0
- package/packages/cli/src/commands/clean.ts +68 -0
- package/packages/cli/src/commands/context.ts +79 -0
- package/packages/cli/src/commands/doctor.ts +357 -0
- package/packages/cli/src/commands/forget.ts +72 -0
- package/packages/cli/src/commands/health.ts +36 -0
- package/packages/cli/src/commands/inspect.ts +41 -0
- package/packages/cli/src/commands/link.ts +50 -0
- package/packages/cli/src/commands/migrate.ts +93 -0
- package/packages/cli/src/commands/recall.ts +99 -0
- package/packages/cli/src/commands/recent.ts +57 -0
- package/packages/cli/src/commands/remember.ts +139 -0
- package/packages/cli/src/commands/run.ts +58 -0
- package/packages/cli/src/commands/stale.ts +43 -0
- package/packages/cli/src/commands/stats.ts +42 -0
- package/packages/cli/src/index.ts +57 -0
- package/packages/cli/tsconfig.json +24 -0
- package/packages/mcp/package.json +26 -0
- package/packages/mcp/src/index.ts +940 -0
- package/packages/mcp/tsconfig.json +20 -0
- package/skills/squish-memory/SKILL.md +38 -35
- package/skills/squish-memory/{scripts/install.sh → install.sh} +1 -1
- package/skills/squish-memory/references/claude-desktop.json +12 -0
- package/skills/squish-memory/references/openclaw.json +13 -0
- package/skills/squish-memory/references/opencode.json +14 -0
- package/config/hooks/claude-code-hooks.json +0 -39
- package/config/hooks/cursor-hooks.json +0 -30
- package/config/hooks/opencode-hooks.json +0 -30
- package/config/hooks/windsurf-hooks.json +0 -30
- package/config/mcp-cli-fallback-policy.json +0 -22
- package/config/mcp.json +0 -38
- package/config/plugin-manifest.json +0 -101
- package/config/plugin-manifest.schema.json +0 -244
- package/config/plugin.json +0 -32
- package/config/remote-memory-policy.json +0 -32
- package/core/commands/context-paging.md +0 -51
- package/core/commands/context-status.md +0 -22
- package/core/commands/context.md +0 -5
- package/core/commands/core-memory.md +0 -56
- package/core/commands/health.md +0 -5
- package/core/commands/init.md +0 -39
- package/core/commands/merge.md +0 -113
- package/core/commands/recall.md +0 -5
- package/core/commands/remember.md +0 -11
- package/core/commands/search.md +0 -10
- package/dist/config.d.ts +0 -83
- package/dist/config.js +0 -242
- package/dist/core/adapters/config/claude-code.d.ts +0 -45
- package/dist/core/adapters/config/claude-code.js +0 -113
- package/dist/core/adapters/config/cursor.d.ts +0 -26
- package/dist/core/adapters/config/cursor.js +0 -74
- package/dist/core/adapters/config/opencode.d.ts +0 -23
- package/dist/core/adapters/config/opencode.js +0 -73
- package/dist/core/adapters/config/windsurf.d.ts +0 -26
- package/dist/core/adapters/config/windsurf.js +0 -74
- package/dist/core/adapters/index.d.ts +0 -45
- package/dist/core/adapters/index.js +0 -84
- package/dist/core/adapters/scripts/install-adapter.d.ts +0 -19
- package/dist/core/adapters/scripts/install-adapter.js +0 -149
- package/dist/core/adapters/timeline.d.ts +0 -23
- package/dist/core/adapters/timeline.js +0 -88
- package/dist/core/adapters/types.d.ts +0 -157
- package/dist/core/adapters/types.js +0 -50
- package/dist/core/algorithms/analytics/token-estimator.d.ts +0 -50
- package/dist/core/algorithms/analytics/token-estimator.js +0 -154
- package/dist/core/algorithms/detection/hash-filters.d.ts +0 -47
- package/dist/core/algorithms/detection/hash-filters.js +0 -190
- package/dist/core/algorithms/detection/semantic-ranker.d.ts +0 -32
- package/dist/core/algorithms/detection/semantic-ranker.js +0 -118
- package/dist/core/algorithms/detection/two-stage-detector.d.ts +0 -52
- package/dist/core/algorithms/detection/two-stage-detector.js +0 -299
- package/dist/core/algorithms/handlers/approve-merge.d.ts +0 -22
- package/dist/core/algorithms/handlers/approve-merge.js +0 -179
- package/dist/core/algorithms/handlers/detect-duplicates.d.ts +0 -47
- package/dist/core/algorithms/handlers/detect-duplicates.js +0 -145
- package/dist/core/algorithms/handlers/get-stats.d.ts +0 -39
- package/dist/core/algorithms/handlers/get-stats.js +0 -88
- package/dist/core/algorithms/handlers/list-proposals.d.ts +0 -45
- package/dist/core/algorithms/handlers/list-proposals.js +0 -83
- package/dist/core/algorithms/handlers/preview-merge.d.ts +0 -39
- package/dist/core/algorithms/handlers/preview-merge.js +0 -93
- package/dist/core/algorithms/handlers/reject-merge.d.ts +0 -28
- package/dist/core/algorithms/handlers/reject-merge.js +0 -69
- package/dist/core/algorithms/handlers/reverse-merge.d.ts +0 -21
- package/dist/core/algorithms/handlers/reverse-merge.js +0 -121
- package/dist/core/algorithms/index.d.ts +0 -21
- package/dist/core/algorithms/operations/cache-maintenance.d.ts +0 -12
- package/dist/core/algorithms/operations/cache-maintenance.js +0 -157
- package/dist/core/algorithms/safety/safety-checks.d.ts +0 -22
- package/dist/core/algorithms/safety/safety-checks.js +0 -179
- package/dist/core/algorithms/strategies/merge-strategies.d.ts +0 -50
- package/dist/core/algorithms/strategies/merge-strategies.js +0 -288
- package/dist/core/algorithms/types.d.ts +0 -133
- package/dist/core/algorithms/types.js +0 -5
- package/dist/core/algorithms/utils/response-builder.d.ts +0 -28
- package/dist/core/algorithms/utils/response-builder.js +0 -37
- package/dist/core/associations.d.ts +0 -31
- package/dist/core/associations.js +0 -248
- package/dist/core/autosave.d.ts +0 -19
- package/dist/core/autosave.js +0 -16
- package/dist/core/commands/managed-sync.d.ts +0 -10
- package/dist/core/commands/managed-sync.js +0 -64
- package/dist/core/commands/mcp-server.d.ts +0 -3
- package/dist/core/commands/mcp-server.js +0 -739
- package/dist/core/consolidation.d.ts +0 -37
- package/dist/core/consolidation.js +0 -248
- package/dist/core/context/agent-context.d.ts +0 -106
- package/dist/core/context/agent-context.js +0 -274
- package/dist/core/context/context-paging.d.ts +0 -80
- package/dist/core/context/context-paging.js +0 -328
- package/dist/core/context/context-window.d.ts +0 -40
- package/dist/core/context/context-window.js +0 -177
- package/dist/core/context/context.d.ts +0 -7
- package/dist/core/context/context.js +0 -22
- package/dist/core/embeddings/google-multimodal.d.ts +0 -14
- package/dist/core/embeddings/google-multimodal.js +0 -142
- package/dist/core/embeddings/qmd-client.d.ts +0 -136
- package/dist/core/embeddings/qmd-client.js +0 -403
- package/dist/core/embeddings.d.ts +0 -29
- package/dist/core/embeddings.js +0 -454
- package/dist/core/error-handling.d.ts +0 -63
- package/dist/core/error-handling.js +0 -173
- package/dist/core/external-folder/index.d.ts +0 -102
- package/dist/core/external-folder/index.js +0 -294
- package/dist/core/hooks/agent-hooks.d.ts +0 -74
- package/dist/core/hooks/agent-hooks.js +0 -244
- package/dist/core/hooks/auto-tagger.d.ts +0 -19
- package/dist/core/hooks/auto-tagger.js +0 -155
- package/dist/core/hooks/capture-filter.d.ts +0 -41
- package/dist/core/hooks/capture-filter.js +0 -128
- package/dist/core/index.d.ts +0 -10
- package/dist/core/index.js +0 -14
- package/dist/core/ingestion/agent-memory.d.ts +0 -22
- package/dist/core/ingestion/agent-memory.js +0 -109
- package/dist/core/ingestion/core-memory.d.ts +0 -78
- package/dist/core/ingestion/core-memory.js +0 -226
- package/dist/core/ingestion/learnings.d.ts +0 -57
- package/dist/core/ingestion/learnings.js +0 -202
- package/dist/core/layers/generator.d.ts +0 -25
- package/dist/core/layers/generator.js +0 -76
- package/dist/core/lib/db-client.js +0 -130
- package/dist/core/lib/schemas.d.ts +0 -129
- package/dist/core/lib/utils.d.ts +0 -14
- package/dist/core/lib/utils.js +0 -90
- package/dist/core/lib/validation.d.ts +0 -38
- package/dist/core/lib/validation.js +0 -151
- package/dist/core/lifecycle.d.ts +0 -26
- package/dist/core/lifecycle.js +0 -302
- package/dist/core/local-embeddings.d.ts +0 -11
- package/dist/core/logger.d.ts +0 -16
- package/dist/core/logger.js +0 -40
- package/dist/core/mcp/client.d.ts +0 -17
- package/dist/core/mcp/client.js +0 -101
- package/dist/core/mcp/index.d.ts +0 -6
- package/dist/core/mcp/index.js +0 -6
- package/dist/core/mcp/server.d.ts +0 -18
- package/dist/core/mcp/server.js +0 -157
- package/dist/core/mcp/standalone-server.d.ts +0 -13
- package/dist/core/mcp/standalone-server.js +0 -46
- package/dist/core/mcp/tools.d.ts +0 -9
- package/dist/core/mcp/tools.js +0 -365
- package/dist/core/mcp/types.d.ts +0 -315
- package/dist/core/mcp/types.js +0 -48
- package/dist/core/memory/bridge-discovery.d.ts +0 -50
- package/dist/core/memory/bridge-discovery.js +0 -291
- package/dist/core/memory/categorizer.d.ts +0 -27
- package/dist/core/memory/categorizer.js +0 -305
- package/dist/core/memory/conflict-detector.d.ts +0 -7
- package/dist/core/memory/conflict-detector.js +0 -43
- package/dist/core/memory/consolidation.d.ts +0 -42
- package/dist/core/memory/consolidation.js +0 -303
- package/dist/core/memory/context-collector.d.ts +0 -10
- package/dist/core/memory/context-collector.js +0 -56
- package/dist/core/memory/contradiction-resolver.d.ts +0 -40
- package/dist/core/memory/contradiction-resolver.js +0 -368
- package/dist/core/memory/edit-workflow.d.ts +0 -19
- package/dist/core/memory/edit-workflow.js +0 -120
- package/dist/core/memory/entity-extractor.d.ts +0 -33
- package/dist/core/memory/entity-extractor.js +0 -336
- package/dist/core/memory/entity-resolver.d.ts +0 -23
- package/dist/core/memory/entity-resolver.js +0 -64
- package/dist/core/memory/fact-extractor.d.ts +0 -24
- package/dist/core/memory/fact-extractor.js +0 -89
- package/dist/core/memory/feedback-tracker.d.ts +0 -12
- package/dist/core/memory/feedback-tracker.js +0 -155
- package/dist/core/memory/hooks.d.ts +0 -88
- package/dist/core/memory/hooks.js +0 -174
- package/dist/core/memory/hybrid-retrieval.d.ts +0 -29
- package/dist/core/memory/hybrid-retrieval.js +0 -139
- package/dist/core/memory/hybrid-scorer.d.ts +0 -40
- package/dist/core/memory/hybrid-scorer.js +0 -284
- package/dist/core/memory/hybrid-search.d.ts +0 -20
- package/dist/core/memory/hybrid-search.js +0 -359
- package/dist/core/memory/importance.d.ts +0 -63
- package/dist/core/memory/importance.js +0 -298
- package/dist/core/memory/index.d.ts +0 -8
- package/dist/core/memory/loader.d.ts +0 -31
- package/dist/core/memory/loader.js +0 -141
- package/dist/core/memory/markdown/markdown-storage.d.ts +0 -72
- package/dist/core/memory/markdown/markdown-storage.js +0 -243
- package/dist/core/memory/memories.d.ts +0 -47
- package/dist/core/memory/memories.js +0 -449
- package/dist/core/memory/memory-lifecycle.d.ts +0 -8
- package/dist/core/memory/memory-lifecycle.js +0 -55
- package/dist/core/memory/memory-manager.d.ts +0 -15
- package/dist/core/memory/memory-manager.js +0 -46
- package/dist/core/memory/migrate.d.ts +0 -21
- package/dist/core/memory/migrate.js +0 -134
- package/dist/core/memory/normalization.d.ts +0 -22
- package/dist/core/memory/normalization.js +0 -26
- package/dist/core/memory/progressive-disclosure.d.ts +0 -43
- package/dist/core/memory/progressive-disclosure.js +0 -280
- package/dist/core/memory/query-processor.d.ts +0 -21
- package/dist/core/memory/query-processor.js +0 -72
- package/dist/core/memory/query-rewriter.d.ts +0 -13
- package/dist/core/memory/query-rewriter.js +0 -118
- package/dist/core/memory/response-analyzer.d.ts +0 -9
- package/dist/core/memory/response-analyzer.js +0 -61
- package/dist/core/memory/serialization.d.ts +0 -10
- package/dist/core/memory/serialization.js +0 -84
- package/dist/core/memory/stats.d.ts +0 -22
- package/dist/core/memory/stats.js +0 -138
- package/dist/core/memory/telemetry.d.ts +0 -69
- package/dist/core/memory/telemetry.js +0 -313
- package/dist/core/memory/temporal-facts.d.ts +0 -41
- package/dist/core/memory/temporal-facts.js +0 -283
- package/dist/core/memory/temporal-parser.d.ts +0 -32
- package/dist/core/memory/temporal-parser.js +0 -385
- package/dist/core/memory/trigger-detector.d.ts +0 -14
- package/dist/core/memory/trigger-detector.js +0 -42
- package/dist/core/memory/write-gate.d.ts +0 -54
- package/dist/core/memory/write-gate.js +0 -210
- package/dist/core/namespaces/index.d.ts +0 -71
- package/dist/core/namespaces/index.js +0 -305
- package/dist/core/namespaces/uri-parser.d.ts +0 -31
- package/dist/core/namespaces/uri-parser.js +0 -74
- package/dist/core/obsidian-vault.d.ts +0 -30
- package/dist/core/obsidian-vault.js +0 -94
- package/dist/core/places/index.d.ts +0 -14
- package/dist/core/places/memory-places.d.ts +0 -68
- package/dist/core/places/memory-places.js +0 -261
- package/dist/core/places/places.d.ts +0 -88
- package/dist/core/places/places.js +0 -314
- package/dist/core/places/rules.d.ts +0 -74
- package/dist/core/places/rules.js +0 -240
- package/dist/core/places/walking.d.ts +0 -56
- package/dist/core/places/walking.js +0 -121
- package/dist/core/projects.d.ts +0 -17
- package/dist/core/projects.js +0 -108
- package/dist/core/redis.d.ts +0 -11
- package/dist/core/redis.js +0 -69
- package/dist/core/responses.d.ts +0 -96
- package/dist/core/responses.js +0 -122
- package/dist/core/scheduler/cron-scheduler.d.ts +0 -32
- package/dist/core/scheduler/cron-scheduler.js +0 -332
- package/dist/core/scheduler/heartbeat.d.ts +0 -11
- package/dist/core/scheduler/heartbeat.js +0 -73
- package/dist/core/scheduler/index.d.ts +0 -8
- package/dist/core/scheduler/job-runner.d.ts +0 -11
- package/dist/core/scheduler/job-runner.js +0 -164
- package/dist/core/search/conversations.d.ts +0 -25
- package/dist/core/search/conversations.js +0 -110
- package/dist/core/search/entities.d.ts +0 -12
- package/dist/core/search/entities.js +0 -31
- package/dist/core/search/folder-context.d.ts +0 -25
- package/dist/core/search/folder-context.js +0 -119
- package/dist/core/search/graph-boost.d.ts +0 -7
- package/dist/core/search/graph-boost.js +0 -23
- package/dist/core/search/index.d.ts +0 -4
- package/dist/core/search/qmd-search.d.ts +0 -61
- package/dist/core/search/qmd-search.js +0 -178
- package/dist/core/security/encrypt.d.ts +0 -6
- package/dist/core/security/encrypt.js +0 -47
- package/dist/core/security/governance.d.ts +0 -26
- package/dist/core/security/governance.js +0 -79
- package/dist/core/security/privacy.d.ts +0 -23
- package/dist/core/security/privacy.js +0 -82
- package/dist/core/security/secret-detector.d.ts +0 -32
- package/dist/core/security/secret-detector.js +0 -88
- package/dist/core/session/auto-load.d.ts +0 -6
- package/dist/core/session/auto-load.js +0 -119
- package/dist/core/session/index.d.ts +0 -7
- package/dist/core/session/self-iteration-job.d.ts +0 -20
- package/dist/core/session/self-iteration-job.js +0 -282
- package/dist/core/session/session-hooks.d.ts +0 -18
- package/dist/core/session/session-hooks.js +0 -58
- package/dist/core/session/types.d.ts +0 -26
- package/dist/core/session/types.js +0 -10
- package/dist/core/session-hooks/self-iteration-job.d.ts +0 -20
- package/dist/core/session-hooks/self-iteration-job.js +0 -282
- package/dist/core/session-hooks/session-hooks.d.ts +0 -18
- package/dist/core/session-hooks/session-hooks.js +0 -58
- package/dist/core/snapshots/cleanup.d.ts +0 -9
- package/dist/core/snapshots/comparison.d.ts +0 -19
- package/dist/core/snapshots/comparison.js +0 -43
- package/dist/core/snapshots/creation.d.ts +0 -19
- package/dist/core/snapshots/creation.js +0 -126
- package/dist/core/snapshots/retrieval.d.ts +0 -7
- package/dist/core/snapshots/retrieval.js +0 -41
- package/dist/core/snapshots/stats.d.ts +0 -11
- package/dist/core/snapshots/stats.js +0 -52
- package/dist/core/snapshots.d.ts +0 -29
- package/dist/core/snapshots.js +0 -220
- package/dist/core/storage/cache.d.ts +0 -13
- package/dist/core/storage/cache.js +0 -202
- package/dist/core/storage/database.d.ts +0 -12
- package/dist/core/storage/database.js +0 -12
- package/dist/core/summarization/cleanup.d.ts +0 -9
- package/dist/core/summarization/queries.d.ts +0 -9
- package/dist/core/summarization/queries.js +0 -28
- package/dist/core/summarization/stats.d.ts +0 -14
- package/dist/core/summarization/stats.js +0 -52
- package/dist/core/summarization/strategies.d.ts +0 -24
- package/dist/core/summarization/strategies.js +0 -28
- package/dist/core/summarization.d.ts +0 -37
- package/dist/core/summarization.js +0 -188
- package/dist/core/sync/qmd-sync.d.ts +0 -94
- package/dist/core/sync/qmd-sync.js +0 -201
- package/dist/core/temporal-facts.d.ts +0 -54
- package/dist/core/temporal-facts.js +0 -193
- package/dist/core/toon.d.ts +0 -43
- package/dist/core/toon.js +0 -160
- package/dist/core/tracing/collector.d.ts +0 -111
- package/dist/core/tracing/collector.js +0 -350
- package/dist/core/tracing/visualizer.d.ts +0 -32
- package/dist/core/tracing/visualizer.js +0 -165
- package/dist/core/utils/cleanup-operations.d.ts +0 -13
- package/dist/core/utils/cleanup-operations.js +0 -44
- package/dist/core/utils/content-extraction.d.ts +0 -19
- package/dist/core/utils/content-extraction.js +0 -75
- package/dist/core/utils/filter-builder.d.ts +0 -13
- package/dist/core/utils/filter-builder.js +0 -44
- package/dist/core/utils/history-traversal.d.ts +0 -13
- package/dist/core/utils/history-traversal.js +0 -50
- package/dist/core/utils/memory-operations.d.ts +0 -17
- package/dist/core/utils/memory-operations.js +0 -43
- package/dist/core/utils/query-operations.d.ts +0 -18
- package/dist/core/utils/query-operations.js +0 -65
- package/dist/core/utils/summarization-helpers.d.ts +0 -21
- package/dist/core/utils/summarization-helpers.js +0 -38
- package/dist/core/utils/temporal-queries.d.ts +0 -13
- package/dist/core/utils/temporal-queries.js +0 -27
- package/dist/core/utils/vector-operations.d.ts +0 -71
- package/dist/core/utils/version-management.d.ts +0 -9
- package/dist/core/utils/version-management.js +0 -61
- package/dist/core/worker.d.ts +0 -82
- package/dist/core/worker.js +0 -272
- package/dist/db/adapter.d.ts +0 -7
- package/dist/db/adapter.js +0 -175
- package/dist/db/bootstrap.d.ts +0 -9
- package/dist/db/drizzle/schema-sqlite.d.ts +0 -4837
- package/dist/db/drizzle/schema-sqlite.js +0 -684
- package/dist/db/drizzle/schema.d.ts +0 -4082
- package/dist/db/drizzle/schema.js +0 -770
- package/dist/db/drizzle.config.d.ts +0 -3
- package/dist/db/drizzle.config.js +0 -12
- package/dist/db/index.d.ts +0 -7
- package/dist/db/index.js +0 -89
- package/dist/db/neon.d.ts +0 -8
- package/dist/db/neon.js +0 -20
- package/dist/db/schema/index.d.ts +0 -40
- package/dist/db/schema/index.js +0 -105
- package/dist/db/schema/tables/context-sessions.d.ts +0 -9
- package/dist/db/schema/tables/context-sessions.js +0 -37
- package/dist/db/schema/tables/conversations.d.ts +0 -9
- package/dist/db/schema/tables/conversations.js +0 -47
- package/dist/db/schema/tables/core-memory.d.ts +0 -9
- package/dist/db/schema/tables/core-memory.js +0 -41
- package/dist/db/schema/tables/entities.d.ts +0 -9
- package/dist/db/schema/tables/entities.js +0 -39
- package/dist/db/schema/tables/entity-relations.d.ts +0 -9
- package/dist/db/schema/tables/entity-relations.js +0 -31
- package/dist/db/schema/tables/learnings.d.ts +0 -9
- package/dist/db/schema/tables/learnings.js +0 -66
- package/dist/db/schema/tables/memories.d.ts +0 -9
- package/dist/db/schema/tables/memories.js +0 -161
- package/dist/db/schema/tables/memory-associations.d.ts +0 -9
- package/dist/db/schema/tables/memory-associations.js +0 -39
- package/dist/db/schema/tables/memory-hash-cache.d.ts +0 -9
- package/dist/db/schema/tables/memory-hash-cache.js +0 -29
- package/dist/db/schema/tables/memory-merge-history.d.ts +0 -9
- package/dist/db/schema/tables/memory-merge-history.js +0 -33
- package/dist/db/schema/tables/memory-merge-proposals.d.ts +0 -9
- package/dist/db/schema/tables/memory-merge-proposals.js +0 -39
- package/dist/db/schema/tables/messages.d.ts +0 -9
- package/dist/db/schema/tables/messages.js +0 -41
- package/dist/db/schema/tables/namespaces.d.ts +0 -9
- package/dist/db/schema/tables/namespaces.js +0 -37
- package/dist/db/schema/tables/projects.d.ts +0 -9
- package/dist/db/schema/tables/projects.js +0 -31
- package/dist/db/schema/tables/users.d.ts +0 -9
- package/dist/db/schema/tables/users.js +0 -27
- package/dist/db/schema.d.ts +0 -3
- package/dist/db/schema.js +0 -11
- package/dist/db/supabase.d.ts +0 -9
- package/dist/db/supabase.js +0 -24
- package/dist/index.d.ts +0 -7
- package/dist/index.js +0 -1677
- package/dist/vendor/sql.js/sql-wasm.wasm +0 -0
- package/dist/webui/server.d.ts +0 -5
- package/dist/webui/server.js +0 -642
- package/generated/mcp/manifest.json +0 -23
- package/generated/mcp/mcp-servers.json +0 -25
- package/generated/mcp/mcporter.json +0 -34
- package/generated/mcp/openclaw-memory-qmd.json +0 -17
- package/generated/mcp/runtime.json +0 -12
- package/scripts/README.md +0 -60
- package/scripts/build-release.sh +0 -36
- package/scripts/check-secrets.js +0 -132
- package/scripts/copy-runtime-assets.mjs +0 -26
- package/scripts/generate-mcp.mjs +0 -264
- package/scripts/github-release.sh +0 -77
- package/scripts/init-dirs.mjs +0 -13
- package/scripts/install-claude-code.sh +0 -85
- package/scripts/install-cursor.sh +0 -56
- package/scripts/install-hooks.sh +0 -73
- package/scripts/install-interactive.mjs +0 -357
- package/scripts/install-opencode.sh +0 -75
- package/scripts/install-plugin.mjs +0 -415
- package/scripts/install-windsurf.sh +0 -67
- package/scripts/remote-preflight.mjs +0 -62
- package/scripts/squish-fallback.mjs +0 -132
- package/scripts/test-interactive.mjs +0 -131
- package/scripts/verify-mcp.mjs +0 -214
- package/skills/squish-memory/scripts/install.mjs +0 -335
- package/skills/squish-memory/write_skill.js +0 -2
|
@@ -1,87 +1,102 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared Zod schemas for input validation across Squish
|
|
3
|
-
* Provides consistent validation for common input types
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
*
|
|
20
|
-
*/
|
|
21
|
-
export const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
*
|
|
43
|
-
*/
|
|
44
|
-
export const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Shared Zod schemas for input validation across Squish
|
|
3
|
+
* Provides consistent validation for common input types
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Limit schema: integer between 1 and 100, default 20
|
|
10
|
+
*/
|
|
11
|
+
export const limitSchema = z.number().int().min(1).max(100).default(20);
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Offset schema: integer >= 0, default 0
|
|
15
|
+
*/
|
|
16
|
+
export const offsetSchema = z.number().int().min(0).default(0);
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Project ID/path schema: non-empty string
|
|
20
|
+
*/
|
|
21
|
+
export const projectIdSchema = z.string().min(1);
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Memory ID schema: valid UUID
|
|
25
|
+
*/
|
|
26
|
+
export const memoryIdSchema = z.string().uuid();
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Pagination schema combining limit and offset
|
|
30
|
+
*/
|
|
31
|
+
export const paginationSchema = z.object({
|
|
32
|
+
limit: limitSchema,
|
|
33
|
+
offset: offsetSchema,
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Search query schema: non-empty string
|
|
38
|
+
*/
|
|
39
|
+
export const searchQuerySchema = z.string().min(1).trim();
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Memory type schema
|
|
43
|
+
*/
|
|
44
|
+
export const memoryTypeSchema = z.enum(['observation', 'fact', 'decision', 'context', 'preference', 'note']);
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Association type schema
|
|
48
|
+
*/
|
|
49
|
+
export const associationTypeSchema = z.enum(['relates_to', 'supports', 'contradicts', 'supersedes', 'duplicate']);
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Weight schema: number between 0 and 1
|
|
53
|
+
*/
|
|
54
|
+
export const weightSchema = z.number().min(0).max(1);
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Learning type schema
|
|
58
|
+
*/
|
|
59
|
+
export const learningTypeSchema = z.enum(['success', 'failure', 'fix', 'observation']);
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Observation type schema
|
|
63
|
+
*/
|
|
64
|
+
export const observationTypeSchema = z.enum(['tool_use', 'file_change', 'error', 'pattern', 'insight']);
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Confidence level schema
|
|
68
|
+
*/
|
|
69
|
+
export const confidenceLevelSchema = z.enum(['certain', 'speculative', 'outdated']);
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Search input schema (common for search operations)
|
|
73
|
+
*/
|
|
74
|
+
export const searchInputSchema = z.object({
|
|
75
|
+
query: searchQuerySchema,
|
|
76
|
+
limit: limitSchema.optional(),
|
|
77
|
+
offset: offsetSchema.optional(),
|
|
78
|
+
project: projectIdSchema.optional(),
|
|
79
|
+
type: memoryTypeSchema.optional(),
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Memory recall schema
|
|
84
|
+
*/
|
|
85
|
+
export const recallInputSchema = z.object({
|
|
86
|
+
memoryId: memoryIdSchema,
|
|
87
|
+
limit: limitSchema.optional(),
|
|
88
|
+
project: projectIdSchema.optional(),
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Tag operation schema
|
|
93
|
+
*/
|
|
94
|
+
export const tagOperationSchema = z.object({
|
|
95
|
+
action: z.enum(['add', 'remove']),
|
|
96
|
+
tag: z.string().min(1),
|
|
97
|
+
search: z.string().optional(),
|
|
98
|
+
olderThan: z.string().optional(),
|
|
99
|
+
type: memoryTypeSchema.optional(),
|
|
100
|
+
limit: limitSchema.optional(),
|
|
101
|
+
project: projectIdSchema.optional(),
|
|
102
|
+
});
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared type definitions for Squish Memory system
|
|
3
|
+
* Consolidated from core/memory/memories.ts and core/memory/normalization.ts
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
// Valid memory type values
|
|
7
|
+
export type MemoryType = 'observation' | 'fact' | 'decision' | 'context' | 'preference' | 'note' | 'task';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Confidence level for memory records
|
|
11
|
+
* - certain: High confidence, verified information
|
|
12
|
+
* - speculative: Low confidence, unverified or uncertain
|
|
13
|
+
* - outdated: Information that may no longer be accurate
|
|
14
|
+
*/
|
|
15
|
+
export type ConfidenceLevel = 'certain' | 'speculative' | 'outdated';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Unified MemoryRecord interface
|
|
19
|
+
* Used across memories.ts and normalization.ts
|
|
20
|
+
*
|
|
21
|
+
* Note: type is string to avoid circular dependency with memories.ts
|
|
22
|
+
* Use MemoryType for type checking when needed
|
|
23
|
+
*/
|
|
24
|
+
export interface MemoryRecord {
|
|
25
|
+
id: string;
|
|
26
|
+
projectId?: string | null;
|
|
27
|
+
type: string; // Stored as string in DB (use MemoryType for valid values)
|
|
28
|
+
content: string;
|
|
29
|
+
summary?: string | null;
|
|
30
|
+
tags: string[];
|
|
31
|
+
metadata?: Record<string, unknown> | null;
|
|
32
|
+
createdAt?: string | null;
|
|
33
|
+
validFrom?: string | null;
|
|
34
|
+
validTo?: string | null;
|
|
35
|
+
recordedAt?: string | null;
|
|
36
|
+
similarity?: number;
|
|
37
|
+
importance?: number;
|
|
38
|
+
confidenceLevel?: ConfidenceLevel | null;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Result of a safety check
|
|
43
|
+
* Used to determine if a merge action can proceed
|
|
44
|
+
*/
|
|
45
|
+
export interface SafetyCheckResult {
|
|
46
|
+
passed: boolean;
|
|
47
|
+
warnings: string[];
|
|
48
|
+
blockers: string[]; // Hard failures
|
|
49
|
+
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utility functions for the squish codebase
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
|
|
6
|
+
import { config } from '../../config.js';
|
|
7
|
+
import { toSqliteJson } from '../memory/serialization.js';
|
|
8
|
+
|
|
9
|
+
export function normalizeTimestamp(value: any): string | null {
|
|
10
|
+
if (!value) return null;
|
|
11
|
+
if (value instanceof Date) return value.toISOString();
|
|
12
|
+
if (typeof value === 'number') {
|
|
13
|
+
try {
|
|
14
|
+
// Handle different timestamp formats using magnitude thresholds
|
|
15
|
+
// Microseconds: > 100000000000000 (e.g., 1700000000000000)
|
|
16
|
+
// Milliseconds: > 1000000000000 (e.g., 1700000000000)
|
|
17
|
+
// Seconds: <= 1000000000000 (e.g., 1700000000)
|
|
18
|
+
if (value > 100000000000000) {
|
|
19
|
+
return new Date(value / 1000).toISOString();
|
|
20
|
+
} else if (value > 1000000000000) {
|
|
21
|
+
return new Date(value).toISOString();
|
|
22
|
+
} else if (value >= 0) {
|
|
23
|
+
return new Date(value * 1000).toISOString();
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
} catch {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (typeof value === 'string') {
|
|
31
|
+
try {
|
|
32
|
+
const parsed = new Date(value);
|
|
33
|
+
if (!isNaN(parsed.getTime())) return parsed.toISOString();
|
|
34
|
+
return null;
|
|
35
|
+
} catch {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function now(): string {
|
|
43
|
+
return new Date().toISOString();
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function isDatabaseUnavailableError(error: any): boolean {
|
|
47
|
+
const message = error?.message || '';
|
|
48
|
+
return [
|
|
49
|
+
'Database unavailable',
|
|
50
|
+
'not a valid Win32 application',
|
|
51
|
+
'invalid ELF header',
|
|
52
|
+
'bun:',
|
|
53
|
+
'sql.js wasm asset not found',
|
|
54
|
+
'SQLite database initialization failed',
|
|
55
|
+
'working local SQLite driver',
|
|
56
|
+
].some((pattern) => message.includes(pattern));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export async function withDatabaseErrorHandling<T>(
|
|
60
|
+
operation: () => Promise<T>,
|
|
61
|
+
errorMessage: string
|
|
62
|
+
): Promise<T> {
|
|
63
|
+
try {
|
|
64
|
+
return await operation();
|
|
65
|
+
} catch (dbError: any) {
|
|
66
|
+
if (isDatabaseUnavailableError(dbError)) {
|
|
67
|
+
throw new McpError(ErrorCode.InternalError, errorMessage);
|
|
68
|
+
}
|
|
69
|
+
throw dbError;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function clampLimit(value: number | undefined, defaultValue: number, min: number = 1, max: number = 100): number {
|
|
74
|
+
return Math.min(Math.max(value ?? defaultValue, min), max);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export function prepareEmbedding(embedding: number[] | null): { embedding?: number[] | null; embeddingJson?: string | null } {
|
|
78
|
+
if (config.isTeamMode) {
|
|
79
|
+
return { embedding: embedding ?? null };
|
|
80
|
+
}
|
|
81
|
+
return { embeddingJson: toSqliteJson(embedding ?? null) };
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export function determineOverallStatus(dbStatus: string, redisOk: boolean): string {
|
|
85
|
+
if ((dbStatus === 'ok' || dbStatus === 'unavailable') && redisOk) {
|
|
86
|
+
return 'ok';
|
|
87
|
+
}
|
|
88
|
+
if (dbStatus === 'unavailable') {
|
|
89
|
+
return 'degraded';
|
|
90
|
+
}
|
|
91
|
+
return 'error';
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Date parsing utilities - shared between CLI and MCP
|
|
95
|
+
// ============================================================================
|
|
96
|
+
|
|
97
|
+
export function parseDate(input: string): Date | null {
|
|
98
|
+
if (!input) return null;
|
|
99
|
+
const now = new Date();
|
|
100
|
+
const lower = input.toLowerCase().trim();
|
|
101
|
+
|
|
102
|
+
// Direct date parse
|
|
103
|
+
const parsed = new Date(input);
|
|
104
|
+
if (!isNaN(parsed.getTime())) return parsed;
|
|
105
|
+
|
|
106
|
+
// Relative parsing
|
|
107
|
+
const dayMatch = lower.match(/(\d+)\s*day/i);
|
|
108
|
+
const weekMatch = lower.match(/(\d+)\s*week/i);
|
|
109
|
+
const monthMatch = lower.match(/(\d+)\s*month/i);
|
|
110
|
+
|
|
111
|
+
if (lower === 'today') {
|
|
112
|
+
const d = new Date(now);
|
|
113
|
+
d.setHours(0, 0, 0, 0);
|
|
114
|
+
return d;
|
|
115
|
+
}
|
|
116
|
+
if (lower === 'yesterday') return new Date(now.getTime() - 86400000);
|
|
117
|
+
if (lower === 'thisweek' || lower === 'this week') {
|
|
118
|
+
const d = new Date(now);
|
|
119
|
+
d.setDate(d.getDate() - d.getDay());
|
|
120
|
+
d.setHours(0, 0, 0, 0);
|
|
121
|
+
return d;
|
|
122
|
+
}
|
|
123
|
+
if (lower === 'lastweek' || lower === 'last week') {
|
|
124
|
+
const d = new Date(now);
|
|
125
|
+
d.setDate(d.getDate() - d.getDay() - 7);
|
|
126
|
+
return d;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (dayMatch) return new Date(now.getTime() - parseInt(dayMatch[1]) * 86400000);
|
|
130
|
+
if (weekMatch) return new Date(now.getTime() - parseInt(weekMatch[1]) * 604800000);
|
|
131
|
+
if (monthMatch) return new Date(now.getTime() - parseInt(monthMatch[1]) * 2592000000);
|
|
132
|
+
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export function filterByDateRange<T extends { createdAt?: string | null }>(
|
|
137
|
+
items: T[],
|
|
138
|
+
since?: string,
|
|
139
|
+
until?: string
|
|
140
|
+
): T[] {
|
|
141
|
+
const sinceDate = parseDate(since || '');
|
|
142
|
+
const untilDate = parseDate(until || '');
|
|
143
|
+
|
|
144
|
+
return items.filter(item => {
|
|
145
|
+
if (!item.createdAt) return true;
|
|
146
|
+
const created = new Date(item.createdAt);
|
|
147
|
+
if (sinceDate && created < sinceDate) return false;
|
|
148
|
+
if (untilDate && created > untilDate) return false;
|
|
149
|
+
return true;
|
|
150
|
+
});
|
|
151
|
+
}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input validation utilities for Squish
|
|
3
|
+
* Consolidates scattered validation patterns into a unified module
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { clampLimit as originalClampLimit } from './utils.js';
|
|
7
|
+
import { normalizeTags } from '../memory/serialization.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Validate and normalize a limit value with bounds checking
|
|
11
|
+
*/
|
|
12
|
+
export function validateLimit(
|
|
13
|
+
value: number | string | undefined,
|
|
14
|
+
defaultValue: number = 20,
|
|
15
|
+
min: number = 1,
|
|
16
|
+
max: number = 100
|
|
17
|
+
): number {
|
|
18
|
+
// Handle undefined, null, empty string
|
|
19
|
+
if (value === undefined || value === null || value === '') {
|
|
20
|
+
return defaultValue;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Convert string to number, truncate decimals
|
|
24
|
+
let num: number;
|
|
25
|
+
if (typeof value === 'string') {
|
|
26
|
+
const parsed = parseInt(value, 10);
|
|
27
|
+
if (isNaN(parsed)) {
|
|
28
|
+
return NaN;
|
|
29
|
+
}
|
|
30
|
+
num = parsed;
|
|
31
|
+
} else {
|
|
32
|
+
// Truncate decimals for numbers
|
|
33
|
+
num = Math.trunc(value);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Handle NaN
|
|
37
|
+
if (isNaN(num)) {
|
|
38
|
+
return NaN;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Clamp to bounds
|
|
42
|
+
return Math.min(Math.max(num, min), max);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Parse an integer with bounds checking
|
|
47
|
+
*/
|
|
48
|
+
export function parseIntBounded(
|
|
49
|
+
value: number | string | undefined,
|
|
50
|
+
defaultValue: number,
|
|
51
|
+
min: number,
|
|
52
|
+
max: number
|
|
53
|
+
): number {
|
|
54
|
+
return validateLimit(value, defaultValue, min, max);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Validate a project path
|
|
59
|
+
*/
|
|
60
|
+
export async function validateProjectPath(
|
|
61
|
+
path: string | undefined,
|
|
62
|
+
options?: { createIfMissing?: boolean; require?: boolean }
|
|
63
|
+
): Promise<string> {
|
|
64
|
+
const { createIfMissing = false, require: requireProject = false } = options || {};
|
|
65
|
+
|
|
66
|
+
// If path is undefined, throw if required or return current directory
|
|
67
|
+
if (path === undefined || path === '') {
|
|
68
|
+
if (requireProject) {
|
|
69
|
+
throw new Error('Project path is required');
|
|
70
|
+
}
|
|
71
|
+
return process.cwd();
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Resolve to absolute path
|
|
75
|
+
const absolutePath = path.startsWith('/') || /^[a-zA-Z]:\\/.test(path)
|
|
76
|
+
? path
|
|
77
|
+
: path.startsWith('~')
|
|
78
|
+
? path.replace(/^~/, process.env.HOME || process.env.USERPROFILE || '')
|
|
79
|
+
: path.startsWith('.')
|
|
80
|
+
? path
|
|
81
|
+
: path;
|
|
82
|
+
|
|
83
|
+
// Check if project exists in database
|
|
84
|
+
const { getProjectByPath } = await import('../projects.js');
|
|
85
|
+
const existingProject = await getProjectByPath(absolutePath);
|
|
86
|
+
|
|
87
|
+
if (existingProject) {
|
|
88
|
+
return absolutePath;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Project doesn't exist
|
|
92
|
+
if (requireProject) {
|
|
93
|
+
throw new Error(`Project not found: ${absolutePath}`);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (createIfMissing) {
|
|
97
|
+
const { ensureProject } = await import('../projects.js');
|
|
98
|
+
await ensureProject(absolutePath);
|
|
99
|
+
return absolutePath;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Return the path even if it doesn't exist in database (for non-db validation)
|
|
103
|
+
return absolutePath;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Validate a UUID
|
|
108
|
+
*/
|
|
109
|
+
export function validateUuid(id: string): boolean {
|
|
110
|
+
if (typeof id !== 'string' || !id) {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// UUID v4/v5 regex pattern (8-4-4-4-12 hex digits)
|
|
115
|
+
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
116
|
+
return uuidRegex.test(id);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Require a valid UUID, throws if invalid
|
|
121
|
+
*/
|
|
122
|
+
export function requireUuid(id: string): string {
|
|
123
|
+
if (!validateUuid(id)) {
|
|
124
|
+
throw new Error('Invalid UUID');
|
|
125
|
+
}
|
|
126
|
+
return id;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Validate a date value
|
|
131
|
+
*
|
|
132
|
+
* @param value - The date to validate (string, Date, number, or undefined)
|
|
133
|
+
* @returns Date object if valid, null otherwise
|
|
134
|
+
*/
|
|
135
|
+
export function validateDate(value: string | Date | number | undefined): Date | null {
|
|
136
|
+
if (!value) {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
try {
|
|
141
|
+
let date: Date;
|
|
142
|
+
|
|
143
|
+
if (value instanceof Date) {
|
|
144
|
+
date = value;
|
|
145
|
+
} else if (typeof value === 'number') {
|
|
146
|
+
// Handle both milliseconds and seconds timestamps
|
|
147
|
+
if (value > 100000000000000) {
|
|
148
|
+
// Microseconds, convert to milliseconds
|
|
149
|
+
date = new Date(value / 1000);
|
|
150
|
+
} else if (value > 1000000000000) {
|
|
151
|
+
// Milliseconds
|
|
152
|
+
date = new Date(value);
|
|
153
|
+
} else if (value >= 0) {
|
|
154
|
+
// Seconds
|
|
155
|
+
date = new Date(value * 1000);
|
|
156
|
+
} else {
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
} else if (typeof value === 'string') {
|
|
160
|
+
date = new Date(value);
|
|
161
|
+
} else {
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Check if date is valid
|
|
166
|
+
if (isNaN(date.getTime())) {
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return date;
|
|
171
|
+
} catch {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Re-export normalizeTags for tag validation
|
|
177
|
+
export { normalizeTags };
|
|
178
|
+
|
|
179
|
+
// Re-export clampLimit for backward compatibility
|
|
180
|
+
export { clampLimit } from './utils.js';
|