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,210 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Write Gate Enforcement
|
|
3
|
-
* Validates memories before writing to ensure quality, security, and consistency
|
|
4
|
-
* Integrates secret detection, trigger detection, and content validation
|
|
5
|
-
*/
|
|
6
|
-
import { detectSecrets, redactSecrets } from '../security/secret-detector.js';
|
|
7
|
-
import { detectMemorySignals } from './trigger-detector.js';
|
|
8
|
-
import { resolveContradictions } from './contradiction-resolver.js';
|
|
9
|
-
import { logger } from '../logger.js';
|
|
10
|
-
const DEFAULT_OPTIONS = {
|
|
11
|
-
allowSecrets: false,
|
|
12
|
-
minContentLength: 5,
|
|
13
|
-
maxContentLength: 50000,
|
|
14
|
-
skipContradictionCheck: false,
|
|
15
|
-
skipTemporalSupersession: false,
|
|
16
|
-
};
|
|
17
|
-
/**
|
|
18
|
-
* Main write gate function - validates and sanitizes content before write
|
|
19
|
-
*/
|
|
20
|
-
export async function enforceWriteGate(content, type, options = {}) {
|
|
21
|
-
const opts = { ...DEFAULT_OPTIONS, ...options };
|
|
22
|
-
const result = {
|
|
23
|
-
allowed: true,
|
|
24
|
-
sanitized: false,
|
|
25
|
-
warnings: [],
|
|
26
|
-
errors: [],
|
|
27
|
-
metadata: {
|
|
28
|
-
secretsDetected: 0,
|
|
29
|
-
signals: null,
|
|
30
|
-
contradictions: { found: false, count: 0 },
|
|
31
|
-
temporalSupersession: { count: 0 },
|
|
32
|
-
},
|
|
33
|
-
};
|
|
34
|
-
let processedContent = content;
|
|
35
|
-
// 1. Content length validation
|
|
36
|
-
if (content.length < opts.minContentLength) {
|
|
37
|
-
result.errors.push(`Content too short (min ${opts.minContentLength} characters)`);
|
|
38
|
-
result.allowed = false;
|
|
39
|
-
return result;
|
|
40
|
-
}
|
|
41
|
-
if (content.length > opts.maxContentLength) {
|
|
42
|
-
result.errors.push(`Content too long (max ${opts.maxContentLength} characters)`);
|
|
43
|
-
result.allowed = false;
|
|
44
|
-
return result;
|
|
45
|
-
}
|
|
46
|
-
// 2. Secret detection
|
|
47
|
-
const secrets = detectSecrets(content, 'high');
|
|
48
|
-
result.metadata.secretsDetected = secrets.length;
|
|
49
|
-
if (secrets.length > 0) {
|
|
50
|
-
const secretTypes = [...new Set(secrets.map(s => s.type))];
|
|
51
|
-
if (!opts.allowSecrets) {
|
|
52
|
-
result.errors.push(`Potential secrets detected: ${secretTypes.join(', ')}`);
|
|
53
|
-
result.warnings.push('Content contains sensitive data that must be redacted');
|
|
54
|
-
result.allowed = false;
|
|
55
|
-
return result;
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
// Redact secrets but allow write
|
|
59
|
-
processedContent = redactSecrets(content);
|
|
60
|
-
result.sanitized = true;
|
|
61
|
-
result.sanitizedContent = processedContent;
|
|
62
|
-
result.warnings.push(`Redacted ${secrets.length} potential secrets: ${secretTypes.join(', ')}`);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
// 3. Memory signals detection
|
|
66
|
-
const signals = detectMemorySignals(content);
|
|
67
|
-
result.metadata.signals = signals;
|
|
68
|
-
// Add warnings for high-priority signals
|
|
69
|
-
if (signals.priority === 'high') {
|
|
70
|
-
result.warnings.push('High-priority memory signal detected');
|
|
71
|
-
}
|
|
72
|
-
if (signals.implicit.correction) {
|
|
73
|
-
result.warnings.push('Content appears to be a correction - contradiction check recommended');
|
|
74
|
-
}
|
|
75
|
-
// 4. Contradiction detection (async, non-blocking for write)
|
|
76
|
-
if (!opts.skipContradictionCheck && signals.implicit.correction) {
|
|
77
|
-
try {
|
|
78
|
-
const contradictionResult = await resolveContradictions(processedContent, type, opts.projectId);
|
|
79
|
-
result.metadata.contradictions = {
|
|
80
|
-
found: contradictionResult.supersededIds.length > 0,
|
|
81
|
-
count: contradictionResult.supersededIds.length,
|
|
82
|
-
};
|
|
83
|
-
if (contradictionResult.supersededIds.length > 0) {
|
|
84
|
-
result.warnings.push(`This memory supersedes ${contradictionResult.supersededIds.length} older memories`);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
catch (error) {
|
|
88
|
-
logger.error('Contradiction check failed', error);
|
|
89
|
-
result.warnings.push('Contradiction check failed - proceeding with write');
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
// 5. Temporal fact handling
|
|
93
|
-
if (!opts.skipTemporalSupersession) {
|
|
94
|
-
try {
|
|
95
|
-
// This would be done after the memory is actually written, but we note it here
|
|
96
|
-
result.metadata.temporalSupersession = { count: 0 };
|
|
97
|
-
}
|
|
98
|
-
catch (error) {
|
|
99
|
-
logger.error('Temporal check failed', error);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
// 6. Content quality checks
|
|
103
|
-
const qualityIssues = checkContentQuality(processedContent);
|
|
104
|
-
result.warnings.push(...qualityIssues);
|
|
105
|
-
return result;
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Quick validation without async operations
|
|
109
|
-
* Use for fast pre-check before full validation
|
|
110
|
-
*/
|
|
111
|
-
export function quickValidate(content) {
|
|
112
|
-
const errors = [];
|
|
113
|
-
// Check for empty or whitespace-only content
|
|
114
|
-
if (!content || content.trim().length === 0) {
|
|
115
|
-
errors.push('Content is empty');
|
|
116
|
-
return { valid: false, errors };
|
|
117
|
-
}
|
|
118
|
-
// Check for minimum length
|
|
119
|
-
if (content.trim().length < 5) {
|
|
120
|
-
errors.push('Content is too short');
|
|
121
|
-
}
|
|
122
|
-
// Check for obvious secrets (high confidence only)
|
|
123
|
-
const secrets = detectSecrets(content, 'high');
|
|
124
|
-
if (secrets.length > 0) {
|
|
125
|
-
errors.push(`Content contains ${secrets.length} potential secrets`);
|
|
126
|
-
}
|
|
127
|
-
return { valid: errors.length === 0, errors };
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Check content quality and return warnings
|
|
131
|
-
*/
|
|
132
|
-
function checkContentQuality(content) {
|
|
133
|
-
const warnings = [];
|
|
134
|
-
// Check for excessive repetition
|
|
135
|
-
const words = content.toLowerCase().split(/\s+/);
|
|
136
|
-
const wordCounts = new Map();
|
|
137
|
-
for (const word of words) {
|
|
138
|
-
if (word.length > 3) { // Only check meaningful words
|
|
139
|
-
wordCounts.set(word, (wordCounts.get(word) || 0) + 1);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
for (const [word, count] of wordCounts.entries()) {
|
|
143
|
-
if (count > 10) {
|
|
144
|
-
warnings.push(`Excessive repetition detected: "${word}" appears ${count} times`);
|
|
145
|
-
break; // Only report one
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
// Check for very long lines (might be code or minified content)
|
|
149
|
-
const lines = content.split('\n');
|
|
150
|
-
for (const line of lines) {
|
|
151
|
-
if (line.length > 1000) {
|
|
152
|
-
warnings.push('Content contains very long lines - may not be human-readable');
|
|
153
|
-
break;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
// Check for binary-like content
|
|
157
|
-
const binaryPattern = /[\x00-\x08\x0E-\x1F]/;
|
|
158
|
-
if (binaryPattern.test(content)) {
|
|
159
|
-
warnings.push('Content may contain binary data');
|
|
160
|
-
}
|
|
161
|
-
return warnings;
|
|
162
|
-
}
|
|
163
|
-
/**
|
|
164
|
-
* Sanitize content for storage
|
|
165
|
-
* Redacts secrets and normalizes whitespace
|
|
166
|
-
*/
|
|
167
|
-
export function sanitizeForStorage(content) {
|
|
168
|
-
// Redact secrets
|
|
169
|
-
let sanitized = redactSecrets(content);
|
|
170
|
-
// Normalize excessive whitespace
|
|
171
|
-
sanitized = sanitized.replace(/\n{3,}/g, '\n\n');
|
|
172
|
-
sanitized = sanitized.replace(/ {2,}/g, ' ');
|
|
173
|
-
// Trim
|
|
174
|
-
sanitized = sanitized.trim();
|
|
175
|
-
return sanitized;
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
|
-
* Calculate a quality score for content (0-100)
|
|
179
|
-
*/
|
|
180
|
-
export function calculateContentQualityScore(content) {
|
|
181
|
-
let score = 100;
|
|
182
|
-
// Deduct for short content
|
|
183
|
-
if (content.length < 20) {
|
|
184
|
-
score -= 30;
|
|
185
|
-
}
|
|
186
|
-
else if (content.length < 50) {
|
|
187
|
-
score -= 15;
|
|
188
|
-
}
|
|
189
|
-
// Deduct for secrets
|
|
190
|
-
const secrets = detectSecrets(content, 'high');
|
|
191
|
-
score -= secrets.length * 20;
|
|
192
|
-
// Deduct for repetition
|
|
193
|
-
const words = content.toLowerCase().split(/\s+/);
|
|
194
|
-
const uniqueWords = new Set(words.filter(w => w.length > 3));
|
|
195
|
-
const repetitionRatio = uniqueWords.size / Math.max(1, words.length);
|
|
196
|
-
if (repetitionRatio < 0.3) {
|
|
197
|
-
score -= 20;
|
|
198
|
-
}
|
|
199
|
-
// Bonus for structure (sentences, punctuation)
|
|
200
|
-
const sentences = content.split(/[.!?]+/).filter(s => s.trim().length > 0);
|
|
201
|
-
if (sentences.length > 1) {
|
|
202
|
-
score += 10;
|
|
203
|
-
}
|
|
204
|
-
// Bonus for reasonable length
|
|
205
|
-
if (content.length >= 50 && content.length <= 2000) {
|
|
206
|
-
score += 5;
|
|
207
|
-
}
|
|
208
|
-
return Math.max(0, Math.min(100, score));
|
|
209
|
-
}
|
|
210
|
-
//# sourceMappingURL=write-gate.js.map
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
/** Namespace Management - Hierarchical folder-like namespaces for memories */
|
|
2
|
-
export type NamespaceType = 'root' | 'user' | 'agent' | 'project' | 'custom';
|
|
3
|
-
export interface Namespace {
|
|
4
|
-
id: string;
|
|
5
|
-
projectId: string;
|
|
6
|
-
name: string;
|
|
7
|
-
parentId: string | null;
|
|
8
|
-
type: NamespaceType;
|
|
9
|
-
description: string | null;
|
|
10
|
-
path: string;
|
|
11
|
-
children?: Namespace[];
|
|
12
|
-
createdAt: Date;
|
|
13
|
-
updatedAt: Date;
|
|
14
|
-
}
|
|
15
|
-
export interface NamespaceCreateInput {
|
|
16
|
-
projectId: string;
|
|
17
|
-
name: string;
|
|
18
|
-
type: NamespaceType;
|
|
19
|
-
parentId?: string | null;
|
|
20
|
-
description?: string;
|
|
21
|
-
}
|
|
22
|
-
export interface NamespaceTree {
|
|
23
|
-
id: string;
|
|
24
|
-
name: string;
|
|
25
|
-
type: NamespaceType;
|
|
26
|
-
description: string | null;
|
|
27
|
-
path: string;
|
|
28
|
-
children: NamespaceTree[];
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Create a new namespace
|
|
32
|
-
*/
|
|
33
|
-
export declare function createNamespace(input: NamespaceCreateInput): Promise<Namespace>;
|
|
34
|
-
/**
|
|
35
|
-
* Get a namespace by ID
|
|
36
|
-
*/
|
|
37
|
-
export declare function getNamespaceById(id: string): Promise<Namespace | null>;
|
|
38
|
-
/**
|
|
39
|
-
* Resolve a namespace path to a namespace ID
|
|
40
|
-
* @example resolveNamespacePath('my-project', ['user', 'preferences']) -> namespaceId
|
|
41
|
-
*/
|
|
42
|
-
export declare function resolveNamespacePath(projectId: string, path: string[]): Promise<string | null>;
|
|
43
|
-
/**
|
|
44
|
-
* Get namespace tree for a project
|
|
45
|
-
*/
|
|
46
|
-
export declare function getNamespaceTree(projectId: string): Promise<NamespaceTree[]>;
|
|
47
|
-
/**
|
|
48
|
-
* Get or create default namespaces for a project
|
|
49
|
-
*/
|
|
50
|
-
export declare function getDefaultNamespaces(projectId: string): Promise<Namespace[]>;
|
|
51
|
-
/**
|
|
52
|
-
* List namespaces with optional filtering
|
|
53
|
-
*/
|
|
54
|
-
export declare function listNamespaces(options?: {
|
|
55
|
-
projectId?: string;
|
|
56
|
-
type?: NamespaceType;
|
|
57
|
-
parentId?: string;
|
|
58
|
-
recursive?: boolean;
|
|
59
|
-
}): Promise<Namespace[]>;
|
|
60
|
-
/**
|
|
61
|
-
* Delete a namespace (cascades to child namespaces)
|
|
62
|
-
*/
|
|
63
|
-
export declare function deleteNamespace(id: string): Promise<void>;
|
|
64
|
-
/**
|
|
65
|
-
* Update namespace
|
|
66
|
-
*/
|
|
67
|
-
export declare function updateNamespace(id: string, updates: Partial<{
|
|
68
|
-
name: string;
|
|
69
|
-
description: string;
|
|
70
|
-
}>): Promise<void>;
|
|
71
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,305 +0,0 @@
|
|
|
1
|
-
/** Namespace Management - Hierarchical folder-like namespaces for memories */
|
|
2
|
-
import { randomUUID } from 'crypto';
|
|
3
|
-
import { eq, and, isNull } from 'drizzle-orm';
|
|
4
|
-
import { getDb } from '../../db/index.js';
|
|
5
|
-
import { getSchema } from '../../db/schema.js';
|
|
6
|
-
import { logger } from '../logger.js';
|
|
7
|
-
/**
|
|
8
|
-
* Create a new namespace
|
|
9
|
-
*/
|
|
10
|
-
export async function createNamespace(input) {
|
|
11
|
-
const db = await getDb();
|
|
12
|
-
if (!db) {
|
|
13
|
-
throw new Error('Database unavailable');
|
|
14
|
-
}
|
|
15
|
-
const schema = await getSchema();
|
|
16
|
-
const id = randomUUID();
|
|
17
|
-
// Check if namespace with same name exists under parent
|
|
18
|
-
const sqliteDb = db;
|
|
19
|
-
const existing = await sqliteDb.select()
|
|
20
|
-
.from(schema.namespaces)
|
|
21
|
-
.where(and(eq(schema.namespaces.projectId, input.projectId), eq(schema.namespaces.name, input.name), input.parentId
|
|
22
|
-
? eq(schema.namespaces.parentId, input.parentId)
|
|
23
|
-
: isNull(schema.namespaces.parentId)))
|
|
24
|
-
.limit(1);
|
|
25
|
-
if (existing.length > 0) {
|
|
26
|
-
throw new Error(`Namespace "${input.name}" already exists under ${input.parentId || 'root'}`);
|
|
27
|
-
}
|
|
28
|
-
// Build namespace path
|
|
29
|
-
const path = await buildNamespacePath(input.projectId, input.name, input.parentId ?? null);
|
|
30
|
-
await sqliteDb.insert(schema.namespaces).values({
|
|
31
|
-
id,
|
|
32
|
-
projectId: input.projectId,
|
|
33
|
-
name: input.name,
|
|
34
|
-
type: input.type,
|
|
35
|
-
parentId: input.parentId || null,
|
|
36
|
-
description: input.description || null,
|
|
37
|
-
createdAt: new Date(),
|
|
38
|
-
updatedAt: new Date(),
|
|
39
|
-
});
|
|
40
|
-
logger.info(`[Namespaces] Created namespace: ${path}`);
|
|
41
|
-
return {
|
|
42
|
-
id,
|
|
43
|
-
projectId: input.projectId,
|
|
44
|
-
name: input.name,
|
|
45
|
-
type: input.type,
|
|
46
|
-
parentId: input.parentId || null,
|
|
47
|
-
description: input.description || null,
|
|
48
|
-
path,
|
|
49
|
-
createdAt: new Date(),
|
|
50
|
-
updatedAt: new Date(),
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Build full namespace path from parent
|
|
55
|
-
*/
|
|
56
|
-
async function buildNamespacePath(projectId, name, parentId) {
|
|
57
|
-
if (!parentId) {
|
|
58
|
-
return name;
|
|
59
|
-
}
|
|
60
|
-
const db = await getDb();
|
|
61
|
-
const schema = await getSchema();
|
|
62
|
-
const sqliteDb = db;
|
|
63
|
-
const [parent] = await sqliteDb.select()
|
|
64
|
-
.from(schema.namespaces)
|
|
65
|
-
.where(eq(schema.namespaces.id, parentId))
|
|
66
|
-
.limit(1);
|
|
67
|
-
if (!parent) {
|
|
68
|
-
return name;
|
|
69
|
-
}
|
|
70
|
-
return `${parent.path}/${name}`;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Get a namespace by ID
|
|
74
|
-
*/
|
|
75
|
-
export async function getNamespaceById(id) {
|
|
76
|
-
const db = await getDb();
|
|
77
|
-
if (!db)
|
|
78
|
-
return null;
|
|
79
|
-
const schema = await getSchema();
|
|
80
|
-
const sqliteDb = db;
|
|
81
|
-
const [row] = await sqliteDb.select()
|
|
82
|
-
.from(schema.namespaces)
|
|
83
|
-
.where(eq(schema.namespaces.id, id))
|
|
84
|
-
.limit(1);
|
|
85
|
-
if (!row)
|
|
86
|
-
return null;
|
|
87
|
-
return {
|
|
88
|
-
id: row.id,
|
|
89
|
-
projectId: row.projectId,
|
|
90
|
-
name: row.name,
|
|
91
|
-
type: row.type,
|
|
92
|
-
parentId: row.parentId,
|
|
93
|
-
description: row.description,
|
|
94
|
-
path: row.path,
|
|
95
|
-
createdAt: new Date(row.createdAt),
|
|
96
|
-
updatedAt: new Date(row.updatedAt),
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Resolve a namespace path to a namespace ID
|
|
101
|
-
* @example resolveNamespacePath('my-project', ['user', 'preferences']) -> namespaceId
|
|
102
|
-
*/
|
|
103
|
-
export async function resolveNamespacePath(projectId, path) {
|
|
104
|
-
if (path.length === 0)
|
|
105
|
-
return null;
|
|
106
|
-
const db = await getDb();
|
|
107
|
-
if (!db)
|
|
108
|
-
return null;
|
|
109
|
-
const schema = await getSchema();
|
|
110
|
-
const sqliteDb = db;
|
|
111
|
-
let parentId = null;
|
|
112
|
-
let targetNamespace = null;
|
|
113
|
-
// Traverse path segments
|
|
114
|
-
for (const segment of path) {
|
|
115
|
-
const [result] = await sqliteDb.select()
|
|
116
|
-
.from(schema.namespaces)
|
|
117
|
-
.where(and(eq(schema.namespaces.projectId, projectId), eq(schema.namespaces.name, segment), parentId
|
|
118
|
-
? eq(schema.namespaces.parentId, parentId)
|
|
119
|
-
: isNull(schema.namespaces.parentId)))
|
|
120
|
-
.limit(1);
|
|
121
|
-
if (!result)
|
|
122
|
-
return null;
|
|
123
|
-
targetNamespace = result;
|
|
124
|
-
parentId = result.id;
|
|
125
|
-
}
|
|
126
|
-
return targetNamespace?.id || null;
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* Get namespace tree for a project
|
|
130
|
-
*/
|
|
131
|
-
export async function getNamespaceTree(projectId) {
|
|
132
|
-
const db = await getDb();
|
|
133
|
-
if (!db)
|
|
134
|
-
return [];
|
|
135
|
-
const schema = await getSchema();
|
|
136
|
-
const sqliteDb = db;
|
|
137
|
-
// Get all namespaces for project
|
|
138
|
-
const all = await sqliteDb.select()
|
|
139
|
-
.from(schema.namespaces)
|
|
140
|
-
.where(eq(schema.namespaces.projectId, projectId))
|
|
141
|
-
.orderBy(schema.namespaces.name);
|
|
142
|
-
// Build tree structure
|
|
143
|
-
const map = new Map();
|
|
144
|
-
const roots = [];
|
|
145
|
-
for (const row of all) {
|
|
146
|
-
const node = {
|
|
147
|
-
id: row.id,
|
|
148
|
-
name: row.name,
|
|
149
|
-
type: row.type,
|
|
150
|
-
description: row.description,
|
|
151
|
-
path: row.path,
|
|
152
|
-
children: [],
|
|
153
|
-
};
|
|
154
|
-
map.set(row.id, node);
|
|
155
|
-
if (!row.parentId) {
|
|
156
|
-
roots.push(node);
|
|
157
|
-
}
|
|
158
|
-
else {
|
|
159
|
-
const parent = map.get(row.parentId);
|
|
160
|
-
if (parent) {
|
|
161
|
-
parent.children.push(node);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
return roots;
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* Get or create default namespaces for a project
|
|
169
|
-
*/
|
|
170
|
-
export async function getDefaultNamespaces(projectId) {
|
|
171
|
-
const db = await getDb();
|
|
172
|
-
if (!db)
|
|
173
|
-
return [];
|
|
174
|
-
const schema = await getSchema();
|
|
175
|
-
const sqliteDb = db;
|
|
176
|
-
const created = [];
|
|
177
|
-
const defaults = [
|
|
178
|
-
{ name: 'user', type: 'user', description: 'User-specific memories and preferences' },
|
|
179
|
-
{ name: 'agent', type: 'agent', description: 'Agent-specific knowledge and state' },
|
|
180
|
-
{ name: 'project', type: 'project', description: 'Project-specific decisions and context' },
|
|
181
|
-
];
|
|
182
|
-
const defaultNames = ['user', 'agent', 'project'];
|
|
183
|
-
// Check all default namespaces at once with IN clause
|
|
184
|
-
const existing = await sqliteDb.select()
|
|
185
|
-
.from(schema.namespaces)
|
|
186
|
-
.where(and(eq(schema.namespaces.projectId, projectId), eq(schema.namespaces.name, defaultNames[0]), eq(schema.namespaces.type, 'user'), isNull(schema.namespaces.parentId)));
|
|
187
|
-
if (existing.length > 0) {
|
|
188
|
-
const ns = await createNamespace({
|
|
189
|
-
projectId,
|
|
190
|
-
name: defaultNames[0],
|
|
191
|
-
type: 'user',
|
|
192
|
-
parentId: null,
|
|
193
|
-
});
|
|
194
|
-
created.push({
|
|
195
|
-
id: ns.id,
|
|
196
|
-
projectId: ns.projectId,
|
|
197
|
-
name: ns.name,
|
|
198
|
-
type: ns.type,
|
|
199
|
-
parentId: ns.parentId,
|
|
200
|
-
description: ns.description,
|
|
201
|
-
path: ns.path,
|
|
202
|
-
createdAt: new Date(ns.createdAt),
|
|
203
|
-
updatedAt: new Date(ns.updatedAt),
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
// Check remaining defaults sequentially (agent and project)
|
|
207
|
-
for (const defName of defaultNames.slice(1)) {
|
|
208
|
-
const existing = await sqliteDb.select()
|
|
209
|
-
.from(schema.namespaces)
|
|
210
|
-
.where(and(eq(schema.namespaces.projectId, projectId), eq(schema.namespaces.name, defName), eq(schema.namespaces.type, defName), isNull(schema.namespaces.parentId)))
|
|
211
|
-
.limit(1);
|
|
212
|
-
if (existing.length === 0) {
|
|
213
|
-
const ns = await createNamespace({
|
|
214
|
-
projectId,
|
|
215
|
-
name: defName,
|
|
216
|
-
type: defName === 'agent' ? 'agent' : 'project',
|
|
217
|
-
parentId: null,
|
|
218
|
-
});
|
|
219
|
-
created.push(ns);
|
|
220
|
-
}
|
|
221
|
-
else {
|
|
222
|
-
created.push({
|
|
223
|
-
id: existing[0].id,
|
|
224
|
-
projectId: existing[0].projectId,
|
|
225
|
-
name: existing[0].name,
|
|
226
|
-
type: existing[0].type,
|
|
227
|
-
parentId: existing[0].parentId,
|
|
228
|
-
description: existing[0].description,
|
|
229
|
-
path: existing[0].path,
|
|
230
|
-
createdAt: new Date(existing[0].createdAt),
|
|
231
|
-
updatedAt: new Date(existing[0].updatedAt),
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
logger.info(`[Namespaces] Default namespaces ready for project: ${projectId}`);
|
|
236
|
-
return created;
|
|
237
|
-
}
|
|
238
|
-
/**
|
|
239
|
-
* List namespaces with optional filtering
|
|
240
|
-
*/
|
|
241
|
-
export async function listNamespaces(options = {}) {
|
|
242
|
-
const db = await getDb();
|
|
243
|
-
if (!db)
|
|
244
|
-
return [];
|
|
245
|
-
const schema = await getSchema();
|
|
246
|
-
const sqliteDb = db;
|
|
247
|
-
const conditions = [];
|
|
248
|
-
if (options.projectId) {
|
|
249
|
-
conditions.push(eq(schema.namespaces.projectId, options.projectId));
|
|
250
|
-
}
|
|
251
|
-
if (options.type) {
|
|
252
|
-
conditions.push(eq(schema.namespaces.type, options.type));
|
|
253
|
-
}
|
|
254
|
-
if (options.parentId !== undefined) {
|
|
255
|
-
if (options.parentId === null) {
|
|
256
|
-
conditions.push(isNull(schema.namespaces.parentId));
|
|
257
|
-
}
|
|
258
|
-
else {
|
|
259
|
-
conditions.push(eq(schema.namespaces.parentId, options.parentId));
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
const rows = await sqliteDb.select()
|
|
263
|
-
.from(schema.namespaces)
|
|
264
|
-
.where(conditions.length > 0 ? and(...conditions) : undefined)
|
|
265
|
-
.orderBy(schema.namespaces.name);
|
|
266
|
-
return rows.map((row) => ({
|
|
267
|
-
id: row.id,
|
|
268
|
-
projectId: row.projectId,
|
|
269
|
-
name: row.name,
|
|
270
|
-
type: row.type,
|
|
271
|
-
parentId: row.parentId,
|
|
272
|
-
description: row.description,
|
|
273
|
-
path: row.path,
|
|
274
|
-
createdAt: new Date(row.createdAt),
|
|
275
|
-
updatedAt: new Date(row.updatedAt),
|
|
276
|
-
}));
|
|
277
|
-
}
|
|
278
|
-
/**
|
|
279
|
-
* Delete a namespace (cascades to child namespaces)
|
|
280
|
-
*/
|
|
281
|
-
export async function deleteNamespace(id) {
|
|
282
|
-
const db = await getDb();
|
|
283
|
-
if (!db)
|
|
284
|
-
return;
|
|
285
|
-
const schema = await getSchema();
|
|
286
|
-
const sqliteDb = db;
|
|
287
|
-
await sqliteDb.delete(schema.namespaces).where(eq(schema.namespaces.id, id));
|
|
288
|
-
logger.info(`[Namespaces] Deleted namespace: ${id}`);
|
|
289
|
-
}
|
|
290
|
-
/**
|
|
291
|
-
* Update namespace
|
|
292
|
-
*/
|
|
293
|
-
export async function updateNamespace(id, updates) {
|
|
294
|
-
const db = await getDb();
|
|
295
|
-
if (!db)
|
|
296
|
-
return;
|
|
297
|
-
const schema = await getSchema();
|
|
298
|
-
const sqliteDb = db;
|
|
299
|
-
await sqliteDb.update(schema.namespaces).set({
|
|
300
|
-
...updates,
|
|
301
|
-
updatedAt: new Date(),
|
|
302
|
-
}).where(eq(schema.namespaces.id, id));
|
|
303
|
-
logger.info(`[Namespaces] Updated namespace: ${id}`);
|
|
304
|
-
}
|
|
305
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/** URI Parser for Squish namespace scheme (squish://) */
|
|
2
|
-
export interface SquishURIParsed {
|
|
3
|
-
type: 'namespace';
|
|
4
|
-
projectId: string;
|
|
5
|
-
namespacePath: string[];
|
|
6
|
-
memoryId?: string;
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* Parse a squish:// URI into components
|
|
10
|
-
* @example parseSquishURI('squish://my-project/user/preferences') -> { type: 'namespace', projectId: 'my-project', namespacePath: ['user', 'preferences'] }
|
|
11
|
-
*/
|
|
12
|
-
export declare function parseSquishURI(uri: string): SquishURIParsed | null;
|
|
13
|
-
/**
|
|
14
|
-
* Build a squish:// URI from components
|
|
15
|
-
* @example buildSquishURI('my-project', ['user', 'preferences']) -> 'squish://my-project/user/preferences'
|
|
16
|
-
*/
|
|
17
|
-
export declare function buildSquishURI(projectId: string, path: string[], memoryId?: string): string;
|
|
18
|
-
/**
|
|
19
|
-
* Validate a namespace path (no "..", no empty segments)
|
|
20
|
-
*/
|
|
21
|
-
export declare function validateNamespacePath(path: string[]): boolean;
|
|
22
|
-
/**
|
|
23
|
-
* Get parent namespace path
|
|
24
|
-
* @example getParentPath(['user', 'preferences', 'coding']) -> ['user', 'preferences']
|
|
25
|
-
*/
|
|
26
|
-
export declare function getParentPath(path: string[]): string[] | null;
|
|
27
|
-
/**
|
|
28
|
-
* Join namespace path segments
|
|
29
|
-
*/
|
|
30
|
-
export declare function joinNamespacePath(...segments: (string | string[])[]): string[];
|
|
31
|
-
//# sourceMappingURL=uri-parser.d.ts.map
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
/** URI Parser for Squish namespace scheme (squish://) */
|
|
2
|
-
/**
|
|
3
|
-
* Parse a squish:// URI into components
|
|
4
|
-
* @example parseSquishURI('squish://my-project/user/preferences') -> { type: 'namespace', projectId: 'my-project', namespacePath: ['user', 'preferences'] }
|
|
5
|
-
*/
|
|
6
|
-
export function parseSquishURI(uri) {
|
|
7
|
-
if (!uri || typeof uri !== 'string') {
|
|
8
|
-
return null;
|
|
9
|
-
}
|
|
10
|
-
// Match squish://project/path/to/memory
|
|
11
|
-
const match = uri.match(/^squish:\/\/([^\/]+)\/(.*)$/);
|
|
12
|
-
if (!match) {
|
|
13
|
-
return null;
|
|
14
|
-
}
|
|
15
|
-
const [, projectId, pathPart] = match;
|
|
16
|
-
const namespacePath = pathPart ? pathPart.split('/').filter(Boolean) : [];
|
|
17
|
-
// If path ends with a UUID, it's a memory ID
|
|
18
|
-
const lastSegment = namespacePath[namespacePath.length - 1];
|
|
19
|
-
let memoryId;
|
|
20
|
-
if (lastSegment && /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/.test(lastSegment)) {
|
|
21
|
-
memoryId = lastSegment;
|
|
22
|
-
namespacePath.pop();
|
|
23
|
-
}
|
|
24
|
-
return {
|
|
25
|
-
type: 'namespace',
|
|
26
|
-
projectId,
|
|
27
|
-
namespacePath,
|
|
28
|
-
memoryId,
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Build a squish:// URI from components
|
|
33
|
-
* @example buildSquishURI('my-project', ['user', 'preferences']) -> 'squish://my-project/user/preferences'
|
|
34
|
-
*/
|
|
35
|
-
export function buildSquishURI(projectId, path, memoryId) {
|
|
36
|
-
if (!projectId) {
|
|
37
|
-
throw new Error('Project ID is required');
|
|
38
|
-
}
|
|
39
|
-
const cleanPath = path.filter(Boolean);
|
|
40
|
-
const basePath = `squish://${projectId}${cleanPath.length > 0 ? '/' + cleanPath.join('/') : ''}`;
|
|
41
|
-
return memoryId ? `${basePath}/${memoryId}` : basePath;
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Validate a namespace path (no "..", no empty segments)
|
|
45
|
-
*/
|
|
46
|
-
export function validateNamespacePath(path) {
|
|
47
|
-
if (path.length === 0)
|
|
48
|
-
return true;
|
|
49
|
-
for (const segment of path) {
|
|
50
|
-
if (!segment || segment.length === 0) {
|
|
51
|
-
return false;
|
|
52
|
-
}
|
|
53
|
-
if (segment.includes('..')) {
|
|
54
|
-
return false;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
return true;
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Get parent namespace path
|
|
61
|
-
* @example getParentPath(['user', 'preferences', 'coding']) -> ['user', 'preferences']
|
|
62
|
-
*/
|
|
63
|
-
export function getParentPath(path) {
|
|
64
|
-
if (path.length <= 1)
|
|
65
|
-
return null;
|
|
66
|
-
return path.slice(0, -1);
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Join namespace path segments
|
|
70
|
-
*/
|
|
71
|
-
export function joinNamespacePath(...segments) {
|
|
72
|
-
return segments.flat().filter(Boolean);
|
|
73
|
-
}
|
|
74
|
-
//# sourceMappingURL=uri-parser.js.map
|