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,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Walking Interface - Sequential memory retrieval through places
|
|
3
|
+
*
|
|
4
|
+
* Implements place walking through memory places:
|
|
5
|
+
* - Walk single place to get memories in order
|
|
6
|
+
* - Walk all places for full tour
|
|
7
|
+
* - Token budget handling with TOON compression
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { getDb } from '../../db/index.js';
|
|
11
|
+
import { getSchema } from '../../db/schema.js';
|
|
12
|
+
import { getProjectPlaces, type Place } from './places.js';
|
|
13
|
+
import { getPlaceMemories } from './memory-places.js';
|
|
14
|
+
import { getMemory } from '../memory/memories.js';
|
|
15
|
+
import { compressForContext, isCompressed } from '../compression.js';
|
|
16
|
+
import { logger } from '../logger.js';
|
|
17
|
+
|
|
18
|
+
export interface WalkOptions {
|
|
19
|
+
tokenBudget?: number; // Max tokens (default: 170)
|
|
20
|
+
maxMemoriesPerPlace?: number;
|
|
21
|
+
includePurpose?: boolean;
|
|
22
|
+
compressWithCompression?: boolean;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface WalkResult {
|
|
26
|
+
place: Place;
|
|
27
|
+
memories: MemorySummary[];
|
|
28
|
+
totalTokens: number;
|
|
29
|
+
truncated: boolean;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface MemorySummary {
|
|
33
|
+
id: string;
|
|
34
|
+
content: string;
|
|
35
|
+
type: string;
|
|
36
|
+
tags: string[];
|
|
37
|
+
createdAt: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Walk through a single place
|
|
42
|
+
*/
|
|
43
|
+
export async function walkPlace(
|
|
44
|
+
projectId: string,
|
|
45
|
+
placeType: string,
|
|
46
|
+
options: WalkOptions = {}
|
|
47
|
+
): Promise<WalkResult | null> {
|
|
48
|
+
const { tokenBudget = 170, maxMemoriesPerPlace = 10, includePurpose = true, compressWithCompression = false } = options;
|
|
49
|
+
|
|
50
|
+
// Get the place
|
|
51
|
+
const places = await getProjectPlaces(projectId);
|
|
52
|
+
const place = places.find(p => p.placeType === placeType);
|
|
53
|
+
|
|
54
|
+
if (!place) {
|
|
55
|
+
logger.warn(`[Walking] Place not found: ${placeType}`);
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Get memory IDs for this place
|
|
60
|
+
const memoryIds = await getPlaceMemories(place.id, maxMemoriesPerPlace);
|
|
61
|
+
|
|
62
|
+
// Get full memories
|
|
63
|
+
const memories: MemorySummary[] = [];
|
|
64
|
+
let totalTokens = 0;
|
|
65
|
+
|
|
66
|
+
for (const memoryId of memoryIds) {
|
|
67
|
+
const memory = await getMemory(memoryId);
|
|
68
|
+
if (!memory) continue;
|
|
69
|
+
|
|
70
|
+
let content = memory.content || '';
|
|
71
|
+
|
|
72
|
+
// Compress with TOON if requested
|
|
73
|
+
if (compressWithCompression && content) {
|
|
74
|
+
content = compressForContext(content);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const tokenEstimate = Math.ceil(content.length / 4); // rough token estimate
|
|
78
|
+
|
|
79
|
+
if (totalTokens + tokenEstimate > tokenBudget) {
|
|
80
|
+
// Would exceed budget - stop adding
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
memories.push({
|
|
85
|
+
id: memory.id,
|
|
86
|
+
content,
|
|
87
|
+
type: memory.type,
|
|
88
|
+
tags: memory.tags || [],
|
|
89
|
+
createdAt: memory.createdAt || '',
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
totalTokens += tokenEstimate;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return {
|
|
96
|
+
place,
|
|
97
|
+
memories,
|
|
98
|
+
totalTokens,
|
|
99
|
+
truncated: memories.length < memoryIds.length,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Walk through all places in sort order
|
|
105
|
+
*/
|
|
106
|
+
export async function walkAllPlaces(
|
|
107
|
+
projectId: string,
|
|
108
|
+
options: WalkOptions = {}
|
|
109
|
+
): Promise<WalkResult[]> {
|
|
110
|
+
const places = await getProjectPlaces(projectId);
|
|
111
|
+
const results: WalkResult[] = [];
|
|
112
|
+
|
|
113
|
+
for (const place of places) {
|
|
114
|
+
const walkResult = await walkPlace(projectId, place.placeType, options);
|
|
115
|
+
if (walkResult && walkResult.memories.length > 0) {
|
|
116
|
+
results.push(walkResult);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
logger.info(`[Walking] Walked ${results.length} places for project ${projectId}`);
|
|
121
|
+
return results;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Quick tour - just place names and purposes (minimal tokens)
|
|
126
|
+
*/
|
|
127
|
+
export async function quickTour(projectId: string): Promise<{
|
|
128
|
+
places: { name: string; purpose: string; memoryCount: number }[];
|
|
129
|
+
totalMemories: number;
|
|
130
|
+
}> {
|
|
131
|
+
const places = await getProjectPlaces(projectId);
|
|
132
|
+
|
|
133
|
+
return {
|
|
134
|
+
places: places.map(p => ({
|
|
135
|
+
name: p.name,
|
|
136
|
+
purpose: p.purpose || '',
|
|
137
|
+
memoryCount: p.memoryCount,
|
|
138
|
+
})),
|
|
139
|
+
totalMemories: places.reduce((sum, p) => sum + p.memoryCount, 0),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Get context summary for a place (for injection)
|
|
145
|
+
*/
|
|
146
|
+
export async function getPlaceContext(
|
|
147
|
+
projectId: string,
|
|
148
|
+
placeType: string,
|
|
149
|
+
maxTokens: number = 50
|
|
150
|
+
): Promise<string> {
|
|
151
|
+
const walkResult = await walkPlace(projectId, placeType, {
|
|
152
|
+
tokenBudget: maxTokens,
|
|
153
|
+
compressWithCompression: true,
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
if (!walkResult || walkResult.memories.length === 0) {
|
|
157
|
+
return '';
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
const lines = walkResult.memories.map((m, i) =>
|
|
161
|
+
`${i + 1}. [${m.type}] ${m.content.substring(0, 100)}`
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
return `## ${walkResult.place.name}\n${lines.join('\n')}`;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Full context for session start (all places)
|
|
169
|
+
*/
|
|
170
|
+
export async function getFullWalkingContext(
|
|
171
|
+
projectId: string,
|
|
172
|
+
maxTokens: number = 170
|
|
173
|
+
): Promise<string> {
|
|
174
|
+
const results = await walkAllPlaces(projectId, {
|
|
175
|
+
tokenBudget: Math.floor(maxTokens / 7), // Distribute across 7 places
|
|
176
|
+
compressWithCompression: true,
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
if (results.length === 0) {
|
|
180
|
+
return 'No memories yet. Start building your spatial memory!';
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const sections = results.map(r => {
|
|
184
|
+
const lines = r.memories.slice(0, 3).map((m, i) =>
|
|
185
|
+
` ${i + 1}. ${m.content.substring(0, 60)}...`
|
|
186
|
+
).join('\n');
|
|
187
|
+
|
|
188
|
+
return `## ${r.place.name}\n${lines}`;
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
return sections.join('\n\n');
|
|
192
|
+
}
|
package/core/projects
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// Deterministic Memory Requirements
|
|
2
|
+
import { eq } from 'drizzle-orm';
|
|
3
|
+
import { getSchema } from '../db/schema.js';
|
|
4
|
+
import { buildMemoryFilters, buildMemoryFiltersPartial } from './utils/filter-builder.js';
|
|
5
|
+
import { executeMemoryQuery, executeMemoryAssertion, MemoryRequirementError } from './utils/query-operations.js';
|
|
6
|
+
|
|
7
|
+
export interface MemoryCriteria {
|
|
8
|
+
tag?: string;
|
|
9
|
+
type?: string;
|
|
10
|
+
types?: string[];
|
|
11
|
+
sector?: string;
|
|
12
|
+
minAge?: number;
|
|
13
|
+
maxAge?: number;
|
|
14
|
+
minConfidence?: number;
|
|
15
|
+
minRelevance?: number;
|
|
16
|
+
projectId?: string;
|
|
17
|
+
agentId?: string;
|
|
18
|
+
visibilityScope?: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export async function requireMemory(criteria: MemoryCriteria): Promise<any> {
|
|
22
|
+
const schema = await getSchema();
|
|
23
|
+
const filters = buildMemoryFilters(criteria, schema);
|
|
24
|
+
|
|
25
|
+
const memories = await executeMemoryAssertion(
|
|
26
|
+
criteria,
|
|
27
|
+
filters,
|
|
28
|
+
1,
|
|
29
|
+
'memory requirement',
|
|
30
|
+
'Required memory not found'
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
return memories[0];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export async function assertMemoryPresent(memoryId: string): Promise<void> {
|
|
37
|
+
const criteria = { memoryId };
|
|
38
|
+
const schema = await getSchema();
|
|
39
|
+
const filters = [eq(schema.memories.id, memoryId)];
|
|
40
|
+
|
|
41
|
+
await executeMemoryAssertion(
|
|
42
|
+
criteria,
|
|
43
|
+
filters,
|
|
44
|
+
1,
|
|
45
|
+
'asserting memory presence',
|
|
46
|
+
'Required memory is not present: ' + memoryId
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export async function assertMemoryNotPresent(criteria: MemoryCriteria): Promise<void> {
|
|
51
|
+
const schema = await getSchema();
|
|
52
|
+
const filters = buildMemoryFiltersPartial(criteria, schema);
|
|
53
|
+
|
|
54
|
+
await executeMemoryAssertion(
|
|
55
|
+
criteria,
|
|
56
|
+
filters,
|
|
57
|
+
0,
|
|
58
|
+
'checking memory non-presence',
|
|
59
|
+
'Memory should not exist but was found'
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export async function requireMemories(criteria: MemoryCriteria, minCount: number = 1): Promise<any[]> {
|
|
64
|
+
const schema = await getSchema();
|
|
65
|
+
const filters = buildMemoryFilters(criteria, schema);
|
|
66
|
+
|
|
67
|
+
return executeMemoryAssertion(
|
|
68
|
+
criteria,
|
|
69
|
+
filters,
|
|
70
|
+
minCount,
|
|
71
|
+
'checking memory requirements',
|
|
72
|
+
`Required ${minCount} memories but found fewer`
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export async function requireHighConfidenceMemory(
|
|
77
|
+
criteria: MemoryCriteria,
|
|
78
|
+
minConfidence: number = 80
|
|
79
|
+
): Promise<any> {
|
|
80
|
+
return requireMemory({ ...criteria, minConfidence });
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export async function requireRecentMemory(
|
|
84
|
+
criteria: MemoryCriteria,
|
|
85
|
+
maxAgeDays: number = 7
|
|
86
|
+
): Promise<any> {
|
|
87
|
+
const maxAge = maxAgeDays * 24 * 60 * 60 * 1000;
|
|
88
|
+
return requireMemory({ ...criteria, maxAge });
|
|
89
|
+
}
|
package/core/projects.ts
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { basename } from 'path';
|
|
2
|
+
import { randomUUID } from 'crypto';
|
|
3
|
+
import { eq } from 'drizzle-orm';
|
|
4
|
+
import { getDb } from '../db/index.js';
|
|
5
|
+
import { getSchema } from '../db/schema.js';
|
|
6
|
+
import { serializeMetadata, deserializeMetadata } from './memory/serialization.js';
|
|
7
|
+
import { config } from '../config.js';
|
|
8
|
+
import { createDatabaseClient } from './storage/database.js';
|
|
9
|
+
|
|
10
|
+
export interface ProjectRecord {
|
|
11
|
+
id: string;
|
|
12
|
+
name: string;
|
|
13
|
+
path: string;
|
|
14
|
+
description?: string | null;
|
|
15
|
+
metadata?: Record<string, unknown> | null;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export async function getProjectByPath(path: string): Promise<ProjectRecord | null> {
|
|
19
|
+
try {
|
|
20
|
+
const db = createDatabaseClient(await getDb());
|
|
21
|
+
const schema = await getSchema();
|
|
22
|
+
const rows = await db.select().from(schema.projects).where(eq(schema.projects.path, path)).limit(1);
|
|
23
|
+
const row = rows[0];
|
|
24
|
+
if (!row) return null;
|
|
25
|
+
return normalizeProject(row);
|
|
26
|
+
} catch (error: any) {
|
|
27
|
+
throw error;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export async function ensureProject(path?: string): Promise<ProjectRecord | null> {
|
|
32
|
+
if (!path) return null;
|
|
33
|
+
const existing = await getProjectByPath(path);
|
|
34
|
+
if (existing) return existing;
|
|
35
|
+
|
|
36
|
+
const db = createDatabaseClient(await getDb());
|
|
37
|
+
const schema = await getSchema();
|
|
38
|
+
const id = randomUUID();
|
|
39
|
+
const name = basename(path) || path;
|
|
40
|
+
const metadata = { source: 'mcp' };
|
|
41
|
+
|
|
42
|
+
await db.insert(schema.projects).values({
|
|
43
|
+
id,
|
|
44
|
+
name,
|
|
45
|
+
path,
|
|
46
|
+
metadata: serializeMetadata(metadata),
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
return { id, name, path, metadata };
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export class ProjectNotFoundError extends Error {
|
|
53
|
+
constructor(path: string) {
|
|
54
|
+
super(`Project not found: ${path}`);
|
|
55
|
+
this.name = 'ProjectNotFoundError';
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export async function requireProject(path: string): Promise<ProjectRecord> {
|
|
60
|
+
const project = await getProjectByPath(path);
|
|
61
|
+
if (!project) {
|
|
62
|
+
throw new ProjectNotFoundError(path);
|
|
63
|
+
}
|
|
64
|
+
return project;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export async function getOrCreateProject(path?: string): Promise<ProjectRecord | null> {
|
|
68
|
+
if (!path) return null;
|
|
69
|
+
const existing = await getProjectByPath(path);
|
|
70
|
+
if (existing) return existing;
|
|
71
|
+
|
|
72
|
+
const db = createDatabaseClient(await getDb());
|
|
73
|
+
const schema = await getSchema();
|
|
74
|
+
const id = randomUUID();
|
|
75
|
+
const name = basename(path) || path;
|
|
76
|
+
const metadata = { source: 'mcp' };
|
|
77
|
+
|
|
78
|
+
await db.insert(schema.projects).values({
|
|
79
|
+
id,
|
|
80
|
+
name,
|
|
81
|
+
path,
|
|
82
|
+
metadata: serializeMetadata(metadata),
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
return { id, name, path, metadata };
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function normalizeProject(row: any): ProjectRecord {
|
|
89
|
+
const metadata = deserializeMetadata(row.metadata ?? null);
|
|
90
|
+
return {
|
|
91
|
+
id: row.id,
|
|
92
|
+
name: row.name,
|
|
93
|
+
path: row.path,
|
|
94
|
+
description: row.description ?? null,
|
|
95
|
+
metadata,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export async function getAllProjects(): Promise<ProjectRecord[]> {
|
|
100
|
+
try {
|
|
101
|
+
const db = createDatabaseClient(await getDb());
|
|
102
|
+
const schema = await getSchema();
|
|
103
|
+
const rows = await db.select().from(schema.projects);
|
|
104
|
+
|
|
105
|
+
// Auto-create default project if none exist
|
|
106
|
+
if (rows.length === 0) {
|
|
107
|
+
const cwd = process.cwd();
|
|
108
|
+
const defaultProject = await getOrCreateProject(cwd);
|
|
109
|
+
if (defaultProject) {
|
|
110
|
+
return [defaultProject];
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return rows.map(normalizeProject);
|
|
115
|
+
} catch (error: any) {
|
|
116
|
+
throw error;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export async function getProjectById(id: string): Promise<ProjectRecord | null> {
|
|
121
|
+
try {
|
|
122
|
+
const db = createDatabaseClient(await getDb());
|
|
123
|
+
const schema = await getSchema();
|
|
124
|
+
const rows = await db.select().from(schema.projects).where(eq(schema.projects.id, id)).limit(1);
|
|
125
|
+
const row = rows[0];
|
|
126
|
+
if (!row) return null;
|
|
127
|
+
return normalizeProject(row);
|
|
128
|
+
} catch (error: any) {
|
|
129
|
+
throw error;
|
|
130
|
+
}
|
|
131
|
+
}
|
package/core/redis.ts
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { createClient, RedisClientType } from 'redis';
|
|
2
|
+
import { performRedisPublish } from './utils/memory-operations.js';
|
|
3
|
+
import { logger } from './logger.js';
|
|
4
|
+
|
|
5
|
+
const REDIS_URL = process.env.REDIS_URL || 'redis://localhost:6379';
|
|
6
|
+
|
|
7
|
+
let client: RedisClientType | null = null;
|
|
8
|
+
|
|
9
|
+
export async function getRedisClient(): Promise<RedisClientType> {
|
|
10
|
+
if (client && client.isOpen) {
|
|
11
|
+
return client;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
client = createClient({ url: REDIS_URL });
|
|
15
|
+
|
|
16
|
+
client.on('error', (err) => {
|
|
17
|
+
logger.error('Redis client error', err);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
client.on('connect', () => {
|
|
21
|
+
logger.info('Redis connected');
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
await client.connect();
|
|
25
|
+
return client;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export async function closeRedisConnection(): Promise<void> {
|
|
29
|
+
if (client && client.isOpen) {
|
|
30
|
+
await client.quit();
|
|
31
|
+
client = null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Cache helpers with TTL
|
|
36
|
+
export async function cacheGet<T>(key: string): Promise<T | null> {
|
|
37
|
+
const redis = await getRedisClient();
|
|
38
|
+
const value = await redis.get(key);
|
|
39
|
+
return value ? JSON.parse(value) : null;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export async function cacheSet<T>(key: string, value: T, ttlSeconds: number = 300): Promise<void> {
|
|
43
|
+
const redis = await getRedisClient();
|
|
44
|
+
await redis.setEx(key, ttlSeconds, JSON.stringify(value));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export async function cacheDelete(key: string): Promise<void> {
|
|
48
|
+
const redis = await getRedisClient();
|
|
49
|
+
await redis.del(key);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export async function cacheClear(pattern: string): Promise<void> {
|
|
53
|
+
const redis = await getRedisClient();
|
|
54
|
+
const keys = await redis.keys(pattern);
|
|
55
|
+
if (keys.length > 0) {
|
|
56
|
+
await redis.del(keys);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Pub/Sub for real-time sync
|
|
61
|
+
export async function publish(channel: string, message: unknown): Promise<void> {
|
|
62
|
+
await performRedisPublish(getRedisClient, channel, message);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export async function subscribe(channel: string, callback: (message: unknown) => void): Promise<void> {
|
|
66
|
+
const subscriber = (await getRedisClient()).duplicate();
|
|
67
|
+
await subscriber.connect();
|
|
68
|
+
await subscriber.subscribe(channel, (message) => {
|
|
69
|
+
callback(JSON.parse(message));
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Check Redis health
|
|
74
|
+
export async function checkRedisHealth(): Promise<boolean> {
|
|
75
|
+
try {
|
|
76
|
+
const redis = await getRedisClient();
|
|
77
|
+
const pong = await redis.ping();
|
|
78
|
+
return pong === 'PONG';
|
|
79
|
+
} catch {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ResponseFormatter - Unified response formatting for all Squish output contexts
|
|
3
|
+
* @module core/responses
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export type ResponseStatus = 'ok' | 'error';
|
|
7
|
+
|
|
8
|
+
export interface BaseResponse<T = unknown> {
|
|
9
|
+
status: ResponseStatus;
|
|
10
|
+
message?: string;
|
|
11
|
+
data?: T;
|
|
12
|
+
error?: string;
|
|
13
|
+
timestamp?: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface PaginatedResponse<T> extends BaseResponse<T[]> {
|
|
17
|
+
count: number;
|
|
18
|
+
total?: number;
|
|
19
|
+
page?: number;
|
|
20
|
+
limit?: number;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Format options for web responses
|
|
25
|
+
*/
|
|
26
|
+
export interface WebFormatOptions {
|
|
27
|
+
statusCode?: number;
|
|
28
|
+
pagination?: { total: number; page: number; limit: number };
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Unified response formatter for all Squish output contexts
|
|
33
|
+
*/
|
|
34
|
+
export class ResponseFormatter {
|
|
35
|
+
/**
|
|
36
|
+
* Generate ISO timestamp
|
|
37
|
+
*/
|
|
38
|
+
private static getTimestamp(): string {
|
|
39
|
+
return new Date().toISOString();
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Build base response with timestamp
|
|
44
|
+
*/
|
|
45
|
+
private static buildBase<T>(status: ResponseStatus, message?: string, data?: T, error?: string): BaseResponse<T> {
|
|
46
|
+
return {
|
|
47
|
+
status,
|
|
48
|
+
message,
|
|
49
|
+
data,
|
|
50
|
+
error,
|
|
51
|
+
timestamp: this.getTimestamp(),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// CLI Formatters
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Format response for CLI output (pretty-printed JSON)
|
|
59
|
+
*/
|
|
60
|
+
static cli<T>(data: T, message?: string): string {
|
|
61
|
+
const response = this.buildBase<T>(data instanceof Error ? 'error' : 'ok', message, data);
|
|
62
|
+
return JSON.stringify(response, null, 2);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Format error for CLI and exit process
|
|
67
|
+
*/
|
|
68
|
+
static cliError(error: Error): never {
|
|
69
|
+
const response = this.buildBase<void>('error', error.message, undefined, error.message);
|
|
70
|
+
console.error(JSON.stringify(response, null, 2));
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Web API Formatters
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Format successful response for Web API
|
|
78
|
+
*/
|
|
79
|
+
static web<T>(
|
|
80
|
+
data: T,
|
|
81
|
+
message?: string,
|
|
82
|
+
options?: WebFormatOptions
|
|
83
|
+
): { status: number; body: BaseResponse<T> } {
|
|
84
|
+
const body = this.buildBase<T>('ok', message, data);
|
|
85
|
+
|
|
86
|
+
// Add pagination metadata if provided
|
|
87
|
+
if (options?.pagination) {
|
|
88
|
+
(body as any).count = options.pagination.total;
|
|
89
|
+
(body as any).total = options.pagination.total;
|
|
90
|
+
(body as any).page = options.pagination.page;
|
|
91
|
+
(body as any).limit = options.pagination.limit;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return {
|
|
95
|
+
status: options?.statusCode ?? 200,
|
|
96
|
+
body,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Format error response for Web API
|
|
102
|
+
*/
|
|
103
|
+
static webError(
|
|
104
|
+
error: Error,
|
|
105
|
+
options?: { statusCode?: number; log?: boolean }
|
|
106
|
+
): { status: number; body: BaseResponse } {
|
|
107
|
+
const statusCode = options?.statusCode ?? 500;
|
|
108
|
+
const body = this.buildBase<void>('error', error.message, undefined, error.message);
|
|
109
|
+
|
|
110
|
+
if (options?.log !== false) {
|
|
111
|
+
console.error(`[Web API Error ${statusCode}]:`, error.message);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return { status: statusCode, body };
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// MCP Formatters
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Format response for MCP tools
|
|
121
|
+
*/
|
|
122
|
+
static mcp<T>(
|
|
123
|
+
data: T,
|
|
124
|
+
message?: string
|
|
125
|
+
): { content: Array<{ type: string; text: string }> } {
|
|
126
|
+
const response = this.buildBase<T>('ok', message, data);
|
|
127
|
+
return {
|
|
128
|
+
content: [{ type: 'text', text: JSON.stringify(response, null, 2) }],
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Format error for MCP tools (throws McpError)
|
|
134
|
+
*/
|
|
135
|
+
static mcpError(
|
|
136
|
+
error: Error,
|
|
137
|
+
context?: string
|
|
138
|
+
): never {
|
|
139
|
+
const message = context ? `${context}: ${error.message}` : error.message;
|
|
140
|
+
const response = this.buildBase<void>('error', message, undefined, message);
|
|
141
|
+
|
|
142
|
+
// Import McpError dynamically to avoid requiring @modelcontextprotocol/sdk in non-MCP contexts
|
|
143
|
+
try {
|
|
144
|
+
const { McpError, ErrorCode } = require('@modelcontextprotocol/sdk/types.js');
|
|
145
|
+
throw new McpError(ErrorCode.InternalError, JSON.stringify(response));
|
|
146
|
+
} catch (e) {
|
|
147
|
+
// If McpError is not available, throw a standard error with MCP-formatted message
|
|
148
|
+
const mcpError = new Error(JSON.stringify(response));
|
|
149
|
+
mcpError.name = 'McpError';
|
|
150
|
+
throw mcpError;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Algorithm Handler Formatters
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Format response for algorithm handlers
|
|
158
|
+
*/
|
|
159
|
+
static algorithm<T>(
|
|
160
|
+
data: T,
|
|
161
|
+
message: string,
|
|
162
|
+
options?: { ok?: boolean; error?: string }
|
|
163
|
+
): BaseResponse<T> {
|
|
164
|
+
const isOk = options?.ok !== false;
|
|
165
|
+
return this.buildBase<T>(
|
|
166
|
+
isOk ? 'ok' : 'error',
|
|
167
|
+
message,
|
|
168
|
+
isOk ? data : undefined,
|
|
169
|
+
options?.error
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Convenience method for success responses
|
|
175
|
+
*/
|
|
176
|
+
static success<T>(data: T, message?: string): BaseResponse<T> {
|
|
177
|
+
return this.buildBase<T>('ok', message, data);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Convenience method for failure responses
|
|
182
|
+
*/
|
|
183
|
+
static failure(message: string, error?: Error | string): BaseResponse {
|
|
184
|
+
const errorMessage = error instanceof Error ? error.message : error;
|
|
185
|
+
return this.buildBase<void>('error', message, undefined, errorMessage);
|
|
186
|
+
}
|
|
187
|
+
}
|