squish-memory 1.0.2 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +146 -0
- package/CHANGELOG.md +202 -0
- package/README.md +192 -287
- package/{scripts → bin}/dependency-manager.mjs +217 -217
- package/{scripts → bin}/detect-clients.mjs +78 -78
- package/bin/install-interactive.mjs +321 -0
- package/bin/squish-mcp.mjs +46 -0
- package/bin/squish.mjs +33 -0
- package/config/mcp-migration-map.json +1 -6
- package/config/mcp-mode-semantics.json +10 -12
- package/config/mcp-remote-auth.json +3 -26
- package/config/mcp-universal.schema.json +5 -35
- package/config/settings.json +78 -22
- package/config.js +5 -0
- package/config.ts +218 -0
- package/core/adapters/config/claude-code.ts +133 -0
- package/core/adapters/config/cursor.ts +90 -0
- package/core/adapters/config/opencode.ts +89 -0
- package/core/adapters/config/windsurf.ts +90 -0
- package/core/adapters/index.ts +102 -0
- package/core/adapters/timeline.ts +116 -0
- package/core/adapters/types.ts +166 -0
- package/core/agent-preferences.ts +140 -0
- package/core/algorithms/analytics/token-estimator.ts +216 -0
- package/core/algorithms/detection/hash-filters.ts +260 -0
- package/core/algorithms/detection/semantic-ranker.ts +194 -0
- package/core/algorithms/detection/two-stage-detector.ts +421 -0
- package/core/algorithms/handlers/approve-merge.ts +215 -0
- package/core/algorithms/handlers/detect-duplicates.ts +192 -0
- package/core/algorithms/handlers/get-stats.ts +132 -0
- package/core/algorithms/handlers/list-proposals.ts +130 -0
- package/core/algorithms/handlers/preview-merge.ts +139 -0
- package/core/algorithms/handlers/reject-merge.ts +93 -0
- package/core/algorithms/handlers/reverse-merge.ts +155 -0
- package/core/algorithms/index.ts +39 -0
- package/core/algorithms/operations/cache-maintenance.ts +182 -0
- package/core/algorithms/safety/safety-checks.ts +256 -0
- package/core/algorithms/strategies/merge-strategies.ts +381 -0
- package/core/algorithms/types.ts +140 -0
- package/core/algorithms/utils/response-builder.ts +61 -0
- package/core/associations.ts +363 -0
- package/core/beliefs/decay.ts +289 -0
- package/core/beliefs/extractor.ts +131 -0
- package/core/beliefs/store.ts +557 -0
- package/core/beliefs/types.ts +38 -0
- package/core/commands/mcp-server.ts +5 -0
- package/core/compression.ts +177 -0
- package/core/config.js +2 -0
- package/core/consolidation.ts +330 -0
- package/core/context/agent-context.ts +388 -0
- package/core/context/context-paging.ts +449 -0
- package/core/context/context-window.ts +234 -0
- package/core/context/context.ts +35 -0
- package/core/embeddings/embeddings.ts +616 -0
- package/core/embeddings/google-multimodal.ts +200 -0
- package/core/embeddings/local-embeddings.ts +12 -0
- package/core/embeddings/qmd-client.ts +495 -0
- package/core/embeddings/transformers-local.ts +261 -0
- package/core/embeddings.js +4 -0
- package/core/error-handling.ts +206 -0
- package/core/external +219 -0
- package/core/graph/entity-deduplicator.ts +232 -0
- package/core/graph/graph-builder.ts +257 -0
- package/core/graph/graph-traversal.ts +490 -0
- package/core/graph/index.ts +24 -0
- package/core/graph/llm-entity-extractor.ts +402 -0
- package/core/graph/multi-hop-retrieval.ts +317 -0
- package/core/graph/relationship-extractor.ts +465 -0
- package/core/hooks/agent-hooks.ts +653 -0
- package/core/hooks/auto-tagger.ts +149 -0
- package/core/hooks/capture-filter.ts +169 -0
- package/core/hot-cache.ts +388 -0
- package/core/index.ts +10 -0
- package/core/ingestion/agent-memory.ts +167 -0
- package/core/ingestion/core-memory.ts +326 -0
- package/core/ingestion/learnings.ts +260 -0
- package/core/ingestion/signal-engine.ts +266 -0
- package/core/integrations/obsidian-vault.ts +197 -0
- package/core/layers/generator.ts +115 -0
- package/core/lib/db-client.ts +168 -0
- package/core/lib/parse-embedding.ts +59 -0
- package/core/lib/schemas.ts +102 -0
- package/core/lib/types.ts +49 -0
- package/core/lib/utils.ts +151 -0
- package/core/lib/validation.ts +180 -0
- package/core/lifecycle.ts +353 -0
- package/core/logger.ts +59 -0
- package/core/memory/bridge-discovery.ts +395 -0
- package/core/memory/categorizer.ts +390 -0
- package/core/memory/conflict-detector.ts +62 -0
- package/core/memory/consolidation.ts +372 -0
- package/core/memory/context-collector.ts +75 -0
- package/core/memory/contradiction-resolver.ts +494 -0
- package/core/memory/edit-workflow.ts +174 -0
- package/core/memory/entity-extractor.ts +426 -0
- package/core/memory/entity-resolver.ts +89 -0
- package/core/memory/explain.ts +112 -0
- package/core/memory/fact-deriver.ts +300 -0
- package/core/memory/fact-extractor.ts +120 -0
- package/core/memory/feedback-tracker.ts +200 -0
- package/core/memory/hooks.ts +230 -0
- package/core/memory/hybrid-retrieval.ts +65 -0
- package/core/memory/hybrid-scorer.ts +325 -0
- package/core/memory/hybrid-search.ts +748 -0
- package/core/memory/importance.ts +319 -0
- package/core/memory/index.ts +11 -0
- package/core/memory/loader.ts +178 -0
- package/core/memory/markdown/markdown-storage.ts +318 -0
- package/core/memory/memories.ts +565 -0
- package/core/memory/memory-lifecycle.ts +51 -0
- package/core/memory/memory-manager.ts +53 -0
- package/core/memory/migrate.ts +173 -0
- package/core/memory/normalization.ts +30 -0
- package/core/memory/path-strengthener.ts +211 -0
- package/core/memory/progressive-disclosure.ts +392 -0
- package/core/memory/query-processor.ts +130 -0
- package/core/memory/query-rewriter.ts +153 -0
- package/core/memory/response-analyzer.ts +81 -0
- package/core/memory/retrieval-feedback.ts +276 -0
- package/core/memory/serialization.ts +83 -0
- package/core/memory/stale-cleaner.ts +147 -0
- package/core/memory/stats.ts +181 -0
- package/core/memory/telemetry.ts +392 -0
- package/core/memory/temporal-facts.ts +356 -0
- package/core/memory/temporal-parser.ts +477 -0
- package/core/memory/trigger-detector.ts +104 -0
- package/core/memory/write-gate.ts +288 -0
- package/core/places/index.ts +14 -0
- package/core/places/memory-places.ts +339 -0
- package/core/places/places.ts +406 -0
- package/core/places/rules.ts +308 -0
- package/core/places/walking.ts +192 -0
- package/core/projects +89 -0
- package/core/projects.ts +131 -0
- package/core/redis.ts +82 -0
- package/core/responses.ts +187 -0
- package/core/runtime/trust-report.ts +195 -0
- package/core/runtime/trust-state.ts +360 -0
- package/core/scheduler/cron-scheduler.ts +581 -0
- package/core/scheduler/heartbeat.ts +91 -0
- package/core/scheduler/index.ts +8 -0
- package/core/scheduler/job-runner.ts +197 -0
- package/core/search/conversations.ts +166 -0
- package/core/search/entities.ts +46 -0
- package/core/search/folder-context.ts +154 -0
- package/core/search/graph-boost.ts +22 -0
- package/core/search/index.ts +4 -0
- package/core/search/qmd-wrapper.ts +84 -0
- package/core/security/encrypt.ts +51 -0
- package/core/security/governance.ts +102 -0
- package/core/security/privacy.ts +108 -0
- package/core/security/secret-detector.ts +122 -0
- package/core/session/auto-load.ts +160 -0
- package/core/session/entity-tracker.ts +363 -0
- package/core/session/index.ts +7 -0
- package/core/session/reference-resolver.ts +158 -0
- package/core/session/self-iteration-job.ts +478 -0
- package/core/session/session-hooks.ts +69 -0
- package/core/session/types.ts +36 -0
- package/core/session/working-set.ts +275 -0
- package/core/snapshots/cleanup.ts +13 -0
- package/core/snapshots/comparison.ts +59 -0
- package/core/snapshots/creation.ts +139 -0
- package/core/snapshots/retrieval.ts +44 -0
- package/core/snapshots/stats.ts +63 -0
- package/core/storage/cache.ts +241 -0
- package/core/storage/database.ts +23 -0
- package/core/summarization/cleanup.ts +13 -0
- package/core/summarization/queries.ts +32 -0
- package/core/summarization/stats.ts +64 -0
- package/core/summarization/strategies.ts +52 -0
- package/core/summarization.ts +248 -0
- package/core/temporal-facts.ts +244 -0
- package/core/tracing/collector.ts +470 -0
- package/core/tracing/visualizer.ts +195 -0
- package/core/utils/cleanup-operations.ts +50 -0
- package/core/utils/content-extraction.ts +95 -0
- package/core/utils/filter-builder.ts +56 -0
- package/core/utils/history-traversal.ts +63 -0
- package/core/utils/memory-operations.ts +56 -0
- package/core/utils/query-operations.ts +83 -0
- package/core/utils/summarization-helpers.ts +45 -0
- package/core/utils/temporal-queries.ts +39 -0
- package/core/utils/vector-operations.ts +135 -0
- package/core/utils/version-management.ts +74 -0
- package/core/worker.ts +324 -0
- package/db/adapter.ts +215 -0
- package/db/bootstrap.ts +1055 -0
- package/db/drizzle/migrations/0000_needy_cerebro.sql +402 -0
- package/db/drizzle/migrations/meta/0000_snapshot.json +3451 -0
- package/db/drizzle/migrations/meta/_journal.json +13 -0
- package/db/drizzle/schema-sqlite.ts +1032 -0
- package/db/drizzle/schema.ts +1128 -0
- package/db/drizzle.config.ts +12 -0
- package/db/index.ts +83 -0
- package/db/init.sql +5 -0
- package/db/migrations/associations.ts +35 -0
- package/db/migrations/beliefs.ts +89 -0
- package/db/migrations/core-memory.ts +35 -0
- package/db/migrations/fts.ts +59 -0
- package/db/migrations/index.ts +54 -0
- package/db/migrations/indexes.ts +36 -0
- package/db/migrations/learnings.ts +34 -0
- package/db/migrations/maintenance.ts +68 -0
- package/db/migrations/memories.ts +22 -0
- package/db/migrations/memory-places.ts +35 -0
- package/db/migrations/places.ts +49 -0
- package/db/migrations/projects.ts +21 -0
- package/db/migrations/tier-conversion.ts +24 -0
- package/db/neon.ts +22 -0
- package/db/schema/beliefs.ts +50 -0
- package/db/schema/generator.ts +159 -0
- package/db/schema/index.ts +58 -0
- package/db/schema/learnings.ts +32 -0
- package/db/schema/memories.ts +83 -0
- package/db/schema/projects.ts +33 -0
- package/db/schema.ts +13 -0
- package/db/supabase.ts +27 -0
- package/dist/config.d.ts +61 -14
- package/dist/config.js +159 -139
- package/dist/core/adapters/config/claude-code.d.ts +45 -0
- package/dist/core/adapters/config/claude-code.js +113 -0
- package/dist/core/adapters/config/cursor.d.ts +26 -0
- package/dist/core/adapters/config/cursor.js +74 -0
- package/dist/core/adapters/config/opencode.d.ts +23 -0
- package/dist/core/adapters/config/opencode.js +73 -0
- package/dist/core/adapters/config/windsurf.d.ts +26 -0
- package/dist/core/adapters/config/windsurf.js +74 -0
- package/dist/core/adapters/index.d.ts +45 -0
- package/dist/core/adapters/index.js +84 -0
- package/dist/core/adapters/scripts/install-adapter.d.ts +19 -0
- package/dist/core/adapters/scripts/install-adapter.js +149 -0
- package/dist/core/adapters/timeline.d.ts +23 -0
- package/dist/core/adapters/timeline.js +88 -0
- package/dist/core/adapters/types.d.ts +137 -0
- package/dist/core/adapters/types.js +50 -0
- package/dist/core/agent-preferences.d.ts +16 -0
- package/dist/core/agent-preferences.js +124 -0
- package/dist/{algorithms → core/algorithms}/analytics/token-estimator.d.ts +1 -1
- package/dist/{algorithms → core/algorithms}/analytics/token-estimator.js +3 -3
- package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.d.ts +1 -1
- package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.js +1 -1
- package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.d.ts +1 -1
- package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.js +7 -10
- package/dist/{algorithms → core/algorithms}/handlers/approve-merge.js +4 -4
- package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.js +3 -3
- package/dist/{algorithms → core/algorithms}/handlers/get-stats.js +3 -3
- package/dist/{algorithms → core/algorithms}/handlers/list-proposals.js +3 -3
- package/dist/{algorithms → core/algorithms}/handlers/preview-merge.js +3 -3
- package/dist/{algorithms → core/algorithms}/handlers/reject-merge.js +3 -3
- package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.js +3 -3
- package/dist/core/algorithms/index.d.ts +21 -0
- package/dist/core/algorithms/index.js +26 -0
- package/dist/core/algorithms/operations/cache-maintenance.d.ts +12 -0
- package/dist/core/algorithms/operations/cache-maintenance.js +157 -0
- package/dist/{algorithms → core/algorithms}/safety/safety-checks.d.ts +2 -6
- package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.d.ts +19 -1
- package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.js +74 -123
- package/dist/core/algorithms/types.d.ts +125 -0
- package/dist/core/algorithms/types.js +5 -0
- package/dist/core/associations.d.ts +3 -2
- package/dist/core/associations.js +37 -2
- package/dist/core/autosave.d.ts +19 -0
- package/dist/core/autosave.js +16 -0
- package/dist/core/beliefs/decay.d.ts +27 -0
- package/dist/core/beliefs/decay.js +217 -0
- package/dist/core/beliefs/extractor.d.ts +9 -0
- package/dist/core/beliefs/extractor.js +113 -0
- package/dist/core/beliefs/store.d.ts +46 -0
- package/dist/core/beliefs/store.js +466 -0
- package/dist/core/beliefs/types.d.ts +28 -0
- package/dist/core/beliefs/types.js +2 -0
- package/dist/core/commands/mcp-server.d.ts +2 -0
- package/dist/core/commands/mcp-server.js +6 -0
- package/dist/core/commands/remember.d.ts +24 -0
- package/dist/core/commands/remember.js +144 -0
- package/dist/core/compression.d.ts +45 -0
- package/dist/core/compression.js +160 -0
- package/dist/core/context/agent-context.d.ts +106 -0
- package/dist/core/context/agent-context.js +274 -0
- package/dist/core/{context-paging.d.ts → context/context-paging.d.ts} +2 -12
- package/dist/core/{context-paging.js → context/context-paging.js} +19 -39
- package/dist/core/context/context-window.d.ts +40 -0
- package/dist/core/context/context-window.js +177 -0
- package/dist/core/context/context.js +22 -0
- package/dist/core/embeddings/embeddings.d.ts +29 -0
- package/dist/core/embeddings/embeddings.js +546 -0
- package/dist/core/embeddings/google-multimodal.js +6 -2
- package/dist/core/embeddings/local-embeddings.d.ts +11 -0
- package/dist/core/embeddings/local-embeddings.js +11 -0
- package/dist/core/embeddings/qmd-client.js +1 -1
- package/dist/core/embeddings/transformers-local.d.ts +64 -0
- package/dist/core/embeddings/transformers-local.js +213 -0
- package/dist/core/embeddings.d.ts +1 -28
- package/dist/core/embeddings.js +2 -401
- package/dist/core/error-handling.d.ts +63 -0
- package/dist/core/error-handling.js +173 -0
- package/dist/core/graph/entity-deduplicator.d.ts +24 -0
- package/dist/core/graph/entity-deduplicator.js +183 -0
- package/dist/core/graph/graph-builder.d.ts +46 -0
- package/dist/core/graph/graph-builder.js +174 -0
- package/dist/core/graph/graph-traversal.d.ts +80 -0
- package/dist/core/graph/graph-traversal.js +315 -0
- package/dist/core/graph/index.d.ts +19 -0
- package/dist/core/graph/index.js +13 -0
- package/dist/core/graph/llm-entity-extractor.d.ts +49 -0
- package/dist/core/graph/llm-entity-extractor.js +313 -0
- package/dist/core/graph/multi-hop-retrieval.d.ts +48 -0
- package/dist/core/graph/multi-hop-retrieval.js +215 -0
- package/dist/core/graph/relationship-extractor.d.ts +48 -0
- package/dist/core/graph/relationship-extractor.js +351 -0
- package/dist/core/hooks/agent-hooks.d.ts +83 -0
- package/dist/core/hooks/agent-hooks.js +521 -0
- package/dist/core/hooks/auto-tagger.d.ts +19 -0
- package/dist/core/hooks/auto-tagger.js +155 -0
- package/dist/core/hooks/capture-filter.d.ts +41 -0
- package/dist/core/hooks/capture-filter.js +128 -0
- package/dist/core/hot-cache.d.ts +86 -0
- package/dist/core/hot-cache.js +285 -0
- package/dist/core/index.d.ts +9 -9
- package/dist/core/index.js +9 -12
- package/dist/core/{agent-memory.js → ingestion/agent-memory.js} +5 -7
- package/dist/core/{core-memory.d.ts → ingestion/core-memory.d.ts} +2 -2
- package/dist/core/{core-memory.js → ingestion/core-memory.js} +7 -7
- package/dist/core/ingestion/learnings.d.ts +57 -0
- package/dist/core/ingestion/learnings.js +205 -0
- package/dist/core/ingestion/signal-engine.d.ts +41 -0
- package/dist/core/ingestion/signal-engine.js +201 -0
- package/dist/core/integrations/obsidian-vault.d.ts +31 -0
- package/dist/core/integrations/obsidian-vault.js +156 -0
- package/dist/core/lib/db-client.d.ts +114 -0
- package/dist/core/lib/db-client.js +130 -0
- package/dist/core/lib/parse-embedding.d.ts +9 -0
- package/dist/core/lib/parse-embedding.js +58 -0
- package/dist/core/lib/schemas.d.ts +132 -0
- package/dist/core/lib/schemas.js +87 -0
- package/dist/core/lib/types.d.ts +45 -0
- package/dist/core/lib/types.js +6 -0
- package/dist/core/{utils.d.ts → lib/utils.d.ts} +5 -0
- package/dist/core/lib/utils.js +145 -0
- package/dist/core/lib/validation.d.ts +38 -0
- package/dist/core/lib/validation.js +151 -0
- package/dist/core/lifecycle.d.ts +7 -1
- package/dist/core/lifecycle.js +152 -42
- package/dist/core/logger.d.ts +1 -0
- package/dist/core/logger.js +13 -1
- package/dist/core/mcp/tools.d.ts +0 -2
- package/dist/core/mcp/tools.js +35 -90
- package/dist/core/mcp/types.d.ts +25 -253
- package/dist/core/mcp/types.js +2 -2
- package/dist/core/memory/categorizer.js +2 -0
- package/dist/core/memory/conflict-detector.js +1 -1
- package/dist/core/memory/consolidation.d.ts +1 -10
- package/dist/core/memory/consolidation.js +4 -39
- package/dist/core/memory/context-collector.js +1 -1
- package/dist/core/memory/edit-workflow.js +1 -1
- package/dist/core/memory/entity-extractor.d.ts +4 -0
- package/dist/core/memory/entity-extractor.js +30 -16
- package/dist/core/memory/entity-resolver.js +7 -7
- package/dist/core/memory/explain.d.ts +18 -0
- package/dist/core/memory/explain.js +92 -0
- package/dist/core/memory/fact-deriver.d.ts +31 -0
- package/dist/core/memory/fact-deriver.js +236 -0
- package/dist/core/memory/fact-extractor.js +12 -12
- package/dist/core/memory/feedback-tracker.js +1 -1
- package/dist/core/memory/hooks.d.ts +88 -0
- package/dist/core/memory/hooks.js +174 -0
- package/dist/core/memory/hybrid-retrieval.d.ts +14 -16
- package/dist/core/memory/hybrid-retrieval.js +25 -127
- package/dist/core/memory/hybrid-scorer.js +6 -23
- package/dist/core/memory/hybrid-search.d.ts +9 -11
- package/dist/core/memory/hybrid-search.js +496 -273
- package/dist/core/memory/importance.d.ts +2 -24
- package/dist/core/memory/importance.js +7 -91
- package/dist/core/memory/index.d.ts +1 -0
- package/dist/core/memory/index.js +1 -0
- package/dist/core/memory/loader.d.ts +31 -0
- package/dist/core/memory/loader.js +141 -0
- package/dist/core/memory/markdown/markdown-storage.d.ts +72 -0
- package/dist/core/memory/markdown/markdown-storage.js +243 -0
- package/dist/core/memory/memories.d.ts +23 -19
- package/dist/core/memory/memories.js +243 -228
- package/dist/core/memory/memory-lifecycle.d.ts +8 -0
- package/dist/core/memory/memory-lifecycle.js +47 -0
- package/dist/core/memory/migrate.d.ts +21 -0
- package/dist/core/memory/migrate.js +134 -0
- package/dist/core/memory/normalization.d.ts +7 -0
- package/dist/core/memory/normalization.js +26 -0
- package/dist/core/memory/path-strengthener.d.ts +39 -0
- package/dist/core/memory/path-strengthener.js +150 -0
- package/dist/core/memory/progressive-disclosure.js +1 -1
- package/dist/core/memory/query-processor.js +37 -3
- package/dist/core/memory/query-rewriter.js +9 -9
- package/dist/core/memory/retrieval-feedback.d.ts +70 -0
- package/dist/core/memory/retrieval-feedback.js +213 -0
- package/dist/core/memory/serialization.d.ts +4 -0
- package/dist/core/memory/serialization.js +49 -0
- package/dist/core/memory/stale-cleaner.d.ts +26 -0
- package/dist/core/memory/stale-cleaner.js +97 -0
- package/dist/core/memory/stats.d.ts +15 -0
- package/dist/core/memory/stats.js +69 -13
- package/dist/core/memory/temporal-facts.js +21 -0
- package/dist/core/memory/trigger-detector.d.ts +8 -1
- package/dist/core/memory/trigger-detector.js +42 -5
- package/dist/core/memory/write-gate.js +1 -1
- package/dist/core/places/index.d.ts +14 -0
- package/dist/core/places/index.js +14 -0
- package/dist/core/places/memory-places.d.ts +68 -0
- package/dist/core/places/memory-places.js +261 -0
- package/dist/core/places/places.d.ts +88 -0
- package/dist/core/places/places.js +314 -0
- package/dist/core/places/rules.d.ts +74 -0
- package/dist/core/places/rules.js +240 -0
- package/dist/core/places/walking.d.ts +56 -0
- package/dist/core/places/walking.js +121 -0
- package/dist/core/projects.d.ts +5 -0
- package/dist/core/projects.js +47 -18
- package/dist/core/responses.d.ts +96 -0
- package/dist/core/responses.js +122 -0
- package/dist/core/runtime/trust-report.d.ts +102 -0
- package/dist/core/runtime/trust-report.js +107 -0
- package/dist/core/runtime/trust-state.d.ts +12 -0
- package/dist/core/runtime/trust-state.js +309 -0
- package/dist/core/scheduler/cron-scheduler.d.ts +1 -1
- package/dist/core/scheduler/cron-scheduler.js +193 -10
- package/dist/core/scheduler/index.d.ts +1 -1
- package/dist/core/scheduler/index.js +1 -1
- package/dist/core/scheduler/job-runner.js +2 -2
- package/dist/core/search/conversations.js +40 -42
- package/dist/core/search/entities.js +6 -9
- package/dist/core/search/graph-boost.d.ts +7 -0
- package/dist/core/search/graph-boost.js +23 -0
- package/dist/core/search/qmd-wrapper.d.ts +36 -0
- package/dist/core/search/qmd-wrapper.js +58 -0
- package/dist/core/security/encrypt.d.ts +6 -0
- package/dist/core/security/encrypt.js +47 -0
- package/dist/core/{governance.d.ts → security/governance.d.ts} +6 -1
- package/dist/core/security/governance.js +79 -0
- package/dist/core/session/auto-load.js +34 -9
- package/dist/core/session/entity-tracker.d.ts +62 -0
- package/dist/core/session/entity-tracker.js +287 -0
- package/dist/core/session/index.d.ts +1 -1
- package/dist/core/session/index.js +1 -1
- package/dist/core/session/reference-resolver.d.ts +26 -0
- package/dist/core/session/reference-resolver.js +121 -0
- package/dist/core/{session-hooks → session}/self-iteration-job.d.ts +15 -0
- package/dist/core/{session-hooks → session}/self-iteration-job.js +195 -90
- package/dist/core/session/working-set.d.ts +50 -0
- package/dist/core/session/working-set.js +212 -0
- package/dist/core/snapshots/creation.d.ts +2 -8
- package/dist/core/snapshots/creation.js +3 -12
- package/dist/core/{cache.js → storage/cache.js} +2 -2
- package/dist/core/utils/memory-operations.js +1 -1
- package/dist/core/utils/summarization-helpers.d.ts +0 -4
- package/dist/core/utils/summarization-helpers.js +1 -6
- package/dist/core/utils/vector-operations.d.ts +71 -0
- package/dist/core/utils/vector-operations.js +129 -0
- package/dist/db/adapter.d.ts +3 -3
- package/dist/db/adapter.js +99 -88
- package/dist/db/bootstrap.d.ts +2 -0
- package/dist/db/bootstrap.js +921 -674
- package/dist/{drizzle → db/drizzle}/schema-sqlite.d.ts +775 -25
- package/dist/{drizzle → db/drizzle}/schema-sqlite.js +170 -24
- package/dist/{drizzle → db/drizzle}/schema.d.ts +731 -32
- package/dist/{drizzle → db/drizzle}/schema.js +192 -32
- package/dist/db/drizzle.config.d.ts +3 -0
- package/dist/db/drizzle.config.js +12 -0
- package/dist/db/index.d.ts +1 -5
- package/dist/db/index.js +51 -8
- package/dist/db/migrations/associations.d.ts +6 -0
- package/dist/db/migrations/associations.js +29 -0
- package/dist/db/migrations/beliefs.d.ts +10 -0
- package/dist/db/migrations/beliefs.js +76 -0
- package/dist/db/migrations/core-memory.d.ts +6 -0
- package/dist/db/migrations/core-memory.js +29 -0
- package/dist/db/migrations/fts.d.ts +6 -0
- package/dist/db/migrations/fts.js +52 -0
- package/dist/db/migrations/index.d.ts +25 -0
- package/dist/db/migrations/index.js +51 -0
- package/dist/db/migrations/indexes.d.ts +6 -0
- package/dist/db/migrations/indexes.js +30 -0
- package/dist/db/migrations/learnings.d.ts +7 -0
- package/dist/db/migrations/learnings.js +26 -0
- package/dist/db/migrations/maintenance.d.ts +6 -0
- package/dist/db/migrations/maintenance.js +61 -0
- package/dist/db/migrations/memories.d.ts +7 -0
- package/dist/db/migrations/memories.js +16 -0
- package/dist/db/migrations/memory-places.d.ts +6 -0
- package/dist/db/migrations/memory-places.js +29 -0
- package/dist/db/migrations/places.d.ts +6 -0
- package/dist/db/migrations/places.js +43 -0
- package/dist/db/migrations/projects.d.ts +3 -0
- package/dist/db/migrations/projects.js +13 -0
- package/dist/db/migrations/tier-conversion.d.ts +7 -0
- package/dist/db/migrations/tier-conversion.js +20 -0
- package/dist/db/neon.d.ts +8 -0
- package/dist/db/neon.js +20 -0
- package/dist/db/schema/beliefs.d.ts +9 -0
- package/dist/db/schema/beliefs.js +46 -0
- package/dist/db/schema/generator.d.ts +38 -0
- package/dist/db/schema/generator.js +108 -0
- package/dist/db/schema/index.d.ts +39 -0
- package/dist/db/schema/index.js +51 -0
- package/dist/db/schema/learnings.d.ts +7 -0
- package/dist/db/schema/learnings.js +30 -0
- package/dist/db/schema/memories.d.ts +7 -0
- package/dist/db/schema/memories.js +81 -0
- package/dist/db/schema/projects.d.ts +4 -0
- package/dist/db/schema/projects.js +31 -0
- package/dist/db/schema/tables/context-sessions.d.ts +9 -0
- package/dist/db/schema/tables/context-sessions.js +37 -0
- package/dist/db/schema/tables/conversations.d.ts +9 -0
- package/dist/db/schema/tables/conversations.js +47 -0
- package/dist/db/schema/tables/core-memory.d.ts +9 -0
- package/dist/db/schema/tables/core-memory.js +41 -0
- package/dist/db/schema/tables/entities.d.ts +9 -0
- package/dist/db/schema/tables/entities.js +39 -0
- package/dist/db/schema/tables/entity-relations.d.ts +9 -0
- package/dist/db/schema/tables/entity-relations.js +31 -0
- package/dist/db/schema/tables/learnings.d.ts +9 -0
- package/dist/db/schema/tables/learnings.js +66 -0
- package/dist/db/schema/tables/memories.d.ts +9 -0
- package/dist/db/schema/tables/memories.js +161 -0
- package/dist/db/schema/tables/memory-associations.d.ts +9 -0
- package/dist/db/schema/tables/memory-associations.js +39 -0
- package/dist/db/schema/tables/memory-hash-cache.d.ts +9 -0
- package/dist/db/schema/tables/memory-hash-cache.js +29 -0
- package/dist/db/schema/tables/memory-merge-history.d.ts +9 -0
- package/dist/db/schema/tables/memory-merge-history.js +33 -0
- package/dist/db/schema/tables/memory-merge-proposals.d.ts +9 -0
- package/dist/db/schema/tables/memory-merge-proposals.js +39 -0
- package/dist/db/schema/tables/messages.d.ts +9 -0
- package/dist/db/schema/tables/messages.js +41 -0
- package/dist/db/schema/tables/namespaces.d.ts +9 -0
- package/dist/db/schema/tables/namespaces.js +37 -0
- package/dist/db/schema/tables/projects.d.ts +9 -0
- package/dist/db/schema/tables/projects.js +31 -0
- package/dist/db/schema/tables/users.d.ts +9 -0
- package/dist/db/schema/tables/users.js +27 -0
- package/dist/db/schema.d.ts +1 -1
- package/dist/db/schema.js +2 -2
- package/dist/db/supabase.d.ts +9 -0
- package/dist/db/supabase.js +24 -0
- package/dist/packages/mcp/src/index.d.ts +3 -0
- package/dist/packages/mcp/src/index.js +733 -0
- package/mcp.json.example +8 -0
- package/package.json +132 -173
- package/packages/cli/package.json +22 -0
- package/packages/cli/src/commands/clean.ts +68 -0
- package/packages/cli/src/commands/context.ts +79 -0
- package/packages/cli/src/commands/doctor.ts +357 -0
- package/packages/cli/src/commands/forget.ts +72 -0
- package/packages/cli/src/commands/health.ts +36 -0
- package/packages/cli/src/commands/inspect.ts +41 -0
- package/packages/cli/src/commands/link.ts +50 -0
- package/packages/cli/src/commands/migrate.ts +93 -0
- package/packages/cli/src/commands/recall.ts +99 -0
- package/packages/cli/src/commands/recent.ts +57 -0
- package/packages/cli/src/commands/remember.ts +139 -0
- package/packages/cli/src/commands/run.ts +58 -0
- package/packages/cli/src/commands/stale.ts +43 -0
- package/packages/cli/src/commands/stats.ts +42 -0
- package/packages/cli/src/index.ts +57 -0
- package/packages/cli/tsconfig.json +24 -0
- package/packages/mcp/package.json +26 -0
- package/packages/mcp/src/index.ts +877 -0
- package/packages/mcp/tsconfig.json +20 -0
- package/skills/squish-memory/SKILL.md +107 -114
- package/skills/squish-memory/install.sh +3 -3
- package/skills/squish-memory/{claude-desktop.json → references/claude-desktop.json} +12 -12
- package/skills/squish-memory/{openclaw.json → references/openclaw.json} +13 -13
- package/skills/squish-memory/{opencode.json → references/opencode.json} +14 -14
- package/.claude-plugin/marketplace.json +0 -20
- package/.claude-plugin/plugin.json +0 -32
- package/.env.mcp.example +0 -60
- package/.mcp.json +0 -11
- package/QUICK-START.md +0 -71
- package/bin/squish-add.mjs +0 -32
- package/bin/squish-rm.mjs +0 -21
- package/commands/context-paging.md +0 -51
- package/commands/context-status.md +0 -22
- package/commands/context.md +0 -5
- package/commands/core-memory.md +0 -56
- package/commands/health.md +0 -5
- package/commands/init.md +0 -39
- package/commands/merge.md +0 -113
- package/commands/observe.md +0 -5
- package/commands/recall.md +0 -5
- package/commands/remember.md +0 -11
- package/commands/search.md +0 -10
- package/config/mcp-cli-fallback-policy.json +0 -22
- package/config/mcp.json +0 -38
- package/config/plugin-manifest.json +0 -152
- package/config/plugin-manifest.schema.json +0 -244
- package/config/remote-memory-policy.json +0 -32
- package/dist/api/web/index.d.ts +0 -3
- package/dist/api/web/index.js +0 -4
- package/dist/api/web/web-server.d.ts +0 -3
- package/dist/api/web/web-server.js +0 -6
- package/dist/api/web/web.d.ts +0 -4
- package/dist/api/web/web.js +0 -639
- package/dist/commands/managed-sync.d.ts +0 -10
- package/dist/commands/managed-sync.js +0 -64
- package/dist/commands/mcp-server.d.ts +0 -3
- package/dist/commands/mcp-server.js +0 -393
- package/dist/core/context.js +0 -24
- package/dist/core/governance.js +0 -64
- package/dist/core/local-embeddings.d.ts +0 -6
- package/dist/core/local-embeddings.js +0 -20
- 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/observations.d.ts +0 -26
- package/dist/core/observations.js +0 -110
- package/dist/core/requirements.d.ts +0 -20
- package/dist/core/requirements.js +0 -35
- package/dist/core/search/qmd-search.d.ts +0 -61
- package/dist/core/search/qmd-search.js +0 -178
- package/dist/core/snapshots.d.ts +0 -29
- package/dist/core/snapshots.js +0 -220
- package/dist/core/sync/qmd-sync.d.ts +0 -106
- package/dist/core/sync/qmd-sync.js +0 -213
- package/dist/core/utils.js +0 -74
- package/dist/index.d.ts +0 -19
- package/dist/index.js +0 -997
- 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/hooks/hooks.json +0 -52
- package/hooks/post-tool-use.js +0 -26
- package/hooks/session-end.js +0 -28
- package/hooks/session-start.js +0 -33
- package/hooks/user-prompt-submit.js +0 -26
- package/hooks/utils.js +0 -153
- package/npx-installer.js +0 -208
- package/packages/plugin-claude-code/README.md +0 -73
- package/packages/plugin-claude-code/dist/plugin-wrapper.d.ts +0 -35
- package/packages/plugin-claude-code/dist/plugin-wrapper.js +0 -191
- package/packages/plugin-claude-code/package.json +0 -31
- package/packages/plugin-openclaw/README.md +0 -70
- package/packages/plugin-openclaw/dist/index.d.ts +0 -49
- package/packages/plugin-openclaw/dist/index.js +0 -262
- package/packages/plugin-openclaw/openclaw.plugin.json +0 -94
- package/packages/plugin-openclaw/package.json +0 -31
- package/packages/plugin-opencode/install.mjs +0 -217
- package/packages/plugin-opencode/package.json +0 -21
- package/plugin.json +0 -32
- package/scripts/build-release.sh +0 -36
- package/scripts/check-secrets.js +0 -132
- package/scripts/db/check-db.mjs +0 -88
- package/scripts/db/fix-all-columns.mjs +0 -52
- package/scripts/db/fix-schema-all.mjs +0 -55
- package/scripts/db/fix-schema-full.mjs +0 -46
- package/scripts/db/fix-schema.mjs +0 -38
- package/scripts/db/init-db.mjs +0 -13
- package/scripts/db/recreate-db.mjs +0 -14
- package/scripts/generate-mcp.mjs +0 -264
- package/scripts/github-release.sh +0 -77
- package/scripts/init-dirs.mjs +0 -13
- package/scripts/install-interactive.mjs +0 -677
- package/scripts/install-mcp.mjs +0 -116
- package/scripts/install-plugin.mjs +0 -415
- package/scripts/install-web.sh +0 -120
- package/scripts/install.mjs +0 -340
- package/scripts/openclaw-bootstrap.mjs +0 -127
- package/scripts/package-release.sh +0 -71
- package/scripts/remote-preflight.mjs +0 -62
- package/scripts/squish-fallback.mjs +0 -132
- package/scripts/test/test-all-systems.mjs +0 -139
- package/scripts/test/test-memory-system.mjs +0 -139
- package/scripts/test/test-v0.5.0.mjs +0 -210
- package/scripts/test-interactive.mjs +0 -131
- package/scripts/verify-mcp.mjs +0 -214
- package/skills/memory-guide/SKILL.md +0 -332
- package/skills/squish-cli/SKILL.md +0 -240
- package/skills/squish-mcp/SKILL.md +0 -355
- package/skills/squish-memory/install.mjs +0 -335
- package/skills/squish-memory/skill.json +0 -32
- /package/dist/{algorithms → core/algorithms}/detection/hash-filters.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/detection/hash-filters.js +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/approve-merge.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/get-stats.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/list-proposals.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/preview-merge.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/reject-merge.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/safety/safety-checks.js +0 -0
- /package/dist/{algorithms → core/algorithms}/utils/response-builder.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/utils/response-builder.js +0 -0
- /package/dist/core/{context.d.ts → context/context.d.ts} +0 -0
- /package/dist/core/{agent-memory.d.ts → ingestion/agent-memory.d.ts} +0 -0
- /package/dist/core/{privacy.d.ts → security/privacy.d.ts} +0 -0
- /package/dist/core/{privacy.js → security/privacy.js} +0 -0
- /package/dist/core/{secret-detector.d.ts → security/secret-detector.d.ts} +0 -0
- /package/dist/core/{secret-detector.js → security/secret-detector.js} +0 -0
- /package/dist/core/{session-hooks → session}/session-hooks.d.ts +0 -0
- /package/dist/core/{session-hooks → session}/session-hooks.js +0 -0
- /package/dist/core/{cache.d.ts → storage/cache.d.ts} +0 -0
- /package/dist/core/{database.d.ts → storage/database.d.ts} +0 -0
- /package/dist/core/{database.js → storage/database.js} +0 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified Error Handling System for Squish
|
|
3
|
+
* Provides standardized error handling across CLI, Web API, MCP server, and algorithm handlers
|
|
4
|
+
*/
|
|
5
|
+
import { isDatabaseUnavailableError } from './lib/utils.js';
|
|
6
|
+
export { isDatabaseUnavailableError };
|
|
7
|
+
/**
|
|
8
|
+
* Wraps database operations with standardized error handling
|
|
9
|
+
*/
|
|
10
|
+
export declare function withDbErrorHandling<T>(operation: () => Promise<T>, context: string): Promise<T>;
|
|
11
|
+
/**
|
|
12
|
+
* Formats errors for Web API responses
|
|
13
|
+
*/
|
|
14
|
+
export declare function formatApiError(error: any, defaultStatus?: number): {
|
|
15
|
+
status: number;
|
|
16
|
+
response: {
|
|
17
|
+
status: string;
|
|
18
|
+
message: string;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Formats errors for MCP tool responses
|
|
23
|
+
*/
|
|
24
|
+
export declare function formatMcpError(error: any, context?: string): never;
|
|
25
|
+
/**
|
|
26
|
+
* Formats errors for CLI commands
|
|
27
|
+
*/
|
|
28
|
+
export declare function formatCliError(error: any, exitCode?: number): never;
|
|
29
|
+
/**
|
|
30
|
+
* Formats errors for algorithm handlers
|
|
31
|
+
*/
|
|
32
|
+
export declare function formatAlgorithmError(error: any, context?: string): {
|
|
33
|
+
ok: false;
|
|
34
|
+
error: string;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Formats successful responses for algorithm handlers.
|
|
38
|
+
*
|
|
39
|
+
* @param data - The success data to return
|
|
40
|
+
* @param message - Optional success message
|
|
41
|
+
* @returns Object with ok: true, optional message, and data
|
|
42
|
+
*/
|
|
43
|
+
export declare function formatAlgorithmSuccess<T>(data: T, message?: string): {
|
|
44
|
+
ok: true;
|
|
45
|
+
data: T;
|
|
46
|
+
message?: string;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Error thrown when validation fails
|
|
50
|
+
*/
|
|
51
|
+
export declare class ValidationError extends Error {
|
|
52
|
+
field?: string | undefined;
|
|
53
|
+
constructor(message: string, field?: string | undefined);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Error thrown when a requested resource is not found.
|
|
57
|
+
* Used for missing memories, projects, etc.
|
|
58
|
+
*/
|
|
59
|
+
export declare class NotFoundError extends Error {
|
|
60
|
+
resource?: string | undefined;
|
|
61
|
+
constructor(message: string, resource?: string | undefined);
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=error-handling.d.ts.map
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified Error Handling System for Squish
|
|
3
|
+
* Provides standardized error handling across CLI, Web API, MCP server, and algorithm handlers
|
|
4
|
+
*/
|
|
5
|
+
import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
|
|
6
|
+
import { isDatabaseUnavailableError } from './lib/utils.js';
|
|
7
|
+
export { isDatabaseUnavailableError };
|
|
8
|
+
// Database operation wrapper
|
|
9
|
+
/**
|
|
10
|
+
* Wraps database operations with standardized error handling
|
|
11
|
+
*/
|
|
12
|
+
export async function withDbErrorHandling(operation, context) {
|
|
13
|
+
try {
|
|
14
|
+
return await operation();
|
|
15
|
+
}
|
|
16
|
+
catch (dbError) {
|
|
17
|
+
if (isDatabaseUnavailableError(dbError)) {
|
|
18
|
+
throw new Error(`Database unavailable: ${context}. Please check your database connection.`);
|
|
19
|
+
}
|
|
20
|
+
throw dbError;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
// API Response Formatters
|
|
24
|
+
/**
|
|
25
|
+
* Formats errors for Web API responses
|
|
26
|
+
*/
|
|
27
|
+
export function formatApiError(error, defaultStatus = 500) {
|
|
28
|
+
let message;
|
|
29
|
+
if (typeof error === 'string') {
|
|
30
|
+
message = error;
|
|
31
|
+
}
|
|
32
|
+
else if (error instanceof Error) {
|
|
33
|
+
message = error.message;
|
|
34
|
+
}
|
|
35
|
+
else if (error && typeof error === 'object' && 'message' in error) {
|
|
36
|
+
message = String(error.message);
|
|
37
|
+
}
|
|
38
|
+
else if (error && typeof error === 'object') {
|
|
39
|
+
message = 'Unknown error';
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
message = 'Unknown error';
|
|
43
|
+
}
|
|
44
|
+
// Check if it's a database unavailable error
|
|
45
|
+
if (isDatabaseUnavailableError(error)) {
|
|
46
|
+
return {
|
|
47
|
+
status: 503,
|
|
48
|
+
response: {
|
|
49
|
+
status: 'error',
|
|
50
|
+
message: `Service unavailable: ${message}`
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
// Check for custom error classes with status hints
|
|
55
|
+
if (error.status) {
|
|
56
|
+
return {
|
|
57
|
+
status: error.status,
|
|
58
|
+
response: {
|
|
59
|
+
status: 'error',
|
|
60
|
+
message
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
status: defaultStatus,
|
|
66
|
+
response: {
|
|
67
|
+
status: 'error',
|
|
68
|
+
message
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
// MCP Error Formatter
|
|
73
|
+
/**
|
|
74
|
+
* Formats errors for MCP tool responses
|
|
75
|
+
*/
|
|
76
|
+
export function formatMcpError(error, context) {
|
|
77
|
+
const message = error?.message || error?.toString() || 'Unknown error';
|
|
78
|
+
const fullMessage = context ? `${context}: ${message}` : message;
|
|
79
|
+
// Determine appropriate error code
|
|
80
|
+
let code;
|
|
81
|
+
if (isDatabaseUnavailableError(error)) {
|
|
82
|
+
code = ErrorCode.InternalError; // -32603
|
|
83
|
+
}
|
|
84
|
+
else if (error instanceof ValidationError) {
|
|
85
|
+
code = ErrorCode.InvalidParams; // -32602
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
code = ErrorCode.InternalError;
|
|
89
|
+
}
|
|
90
|
+
throw new McpError(code, fullMessage);
|
|
91
|
+
}
|
|
92
|
+
// CLI Error Formatter
|
|
93
|
+
/**
|
|
94
|
+
* Formats errors for CLI commands
|
|
95
|
+
*/
|
|
96
|
+
export function formatCliError(error, exitCode = 1) {
|
|
97
|
+
let message;
|
|
98
|
+
if (typeof error === 'string') {
|
|
99
|
+
message = error;
|
|
100
|
+
}
|
|
101
|
+
else if (error instanceof Error) {
|
|
102
|
+
message = error.message;
|
|
103
|
+
}
|
|
104
|
+
else if (error && typeof error === 'object' && 'message' in error) {
|
|
105
|
+
message = String(error.message);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
message = 'Unknown error';
|
|
109
|
+
}
|
|
110
|
+
// Output JSON to stdout for CLI consumers
|
|
111
|
+
console.log(JSON.stringify({ ok: false, error: message }, null, 2));
|
|
112
|
+
process.exit(exitCode);
|
|
113
|
+
}
|
|
114
|
+
// Algorithm Handler Formatters
|
|
115
|
+
/**
|
|
116
|
+
* Formats errors for algorithm handlers
|
|
117
|
+
*/
|
|
118
|
+
export function formatAlgorithmError(error, context) {
|
|
119
|
+
let message;
|
|
120
|
+
if (typeof error === 'string') {
|
|
121
|
+
message = error;
|
|
122
|
+
}
|
|
123
|
+
else if (error instanceof Error) {
|
|
124
|
+
message = error.message;
|
|
125
|
+
}
|
|
126
|
+
else if (error && typeof error === 'object' && 'message' in error) {
|
|
127
|
+
message = String(error.message);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
message = 'Unknown error';
|
|
131
|
+
}
|
|
132
|
+
const fullMessage = context ? `${context}: ${message}` : message;
|
|
133
|
+
return { ok: false, error: fullMessage };
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Formats successful responses for algorithm handlers.
|
|
137
|
+
*
|
|
138
|
+
* @param data - The success data to return
|
|
139
|
+
* @param message - Optional success message
|
|
140
|
+
* @returns Object with ok: true, optional message, and data
|
|
141
|
+
*/
|
|
142
|
+
export function formatAlgorithmSuccess(data, message) {
|
|
143
|
+
const result = { ok: true, data };
|
|
144
|
+
if (message) {
|
|
145
|
+
result.message = message;
|
|
146
|
+
}
|
|
147
|
+
return result;
|
|
148
|
+
}
|
|
149
|
+
// Custom Error Classes
|
|
150
|
+
/**
|
|
151
|
+
* Error thrown when validation fails
|
|
152
|
+
*/
|
|
153
|
+
export class ValidationError extends Error {
|
|
154
|
+
field;
|
|
155
|
+
constructor(message, field) {
|
|
156
|
+
super(message);
|
|
157
|
+
this.field = field;
|
|
158
|
+
this.name = 'ValidationError';
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Error thrown when a requested resource is not found.
|
|
163
|
+
* Used for missing memories, projects, etc.
|
|
164
|
+
*/
|
|
165
|
+
export class NotFoundError extends Error {
|
|
166
|
+
resource;
|
|
167
|
+
constructor(message, resource) {
|
|
168
|
+
super(message);
|
|
169
|
+
this.resource = resource;
|
|
170
|
+
this.name = 'NotFoundError';
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=error-handling.js.map
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Entity Deduplicator
|
|
3
|
+
*
|
|
4
|
+
* Deduplicates entities using embedding similarity and string matching.
|
|
5
|
+
* Critical for knowledge graph - prevents duplicate nodes for aliases like "AWS" / "Amazon Web Services".
|
|
6
|
+
*/
|
|
7
|
+
export interface DeduplicationResult {
|
|
8
|
+
merged: number;
|
|
9
|
+
aliases: Array<{
|
|
10
|
+
from: string;
|
|
11
|
+
to: string;
|
|
12
|
+
similarity: number;
|
|
13
|
+
}>;
|
|
14
|
+
totalEntities: number;
|
|
15
|
+
uniqueEntities: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Find and merge duplicate entities in a project.
|
|
19
|
+
*/
|
|
20
|
+
export declare function deduplicateProjectEntities(projectId: string, options?: {
|
|
21
|
+
similarityThreshold?: number;
|
|
22
|
+
dryRun?: boolean;
|
|
23
|
+
}): Promise<DeduplicationResult>;
|
|
24
|
+
//# sourceMappingURL=entity-deduplicator.d.ts.map
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Entity Deduplicator
|
|
3
|
+
*
|
|
4
|
+
* Deduplicates entities using embedding similarity and string matching.
|
|
5
|
+
* Critical for knowledge graph - prevents duplicate nodes for aliases like "AWS" / "Amazon Web Services".
|
|
6
|
+
*/
|
|
7
|
+
import { eq } from 'drizzle-orm';
|
|
8
|
+
import { getDb } from '../../db/index.js';
|
|
9
|
+
import { getSchema } from '../../db/schema.js';
|
|
10
|
+
import { cosineSimilarity } from '../utils/vector-operations.js';
|
|
11
|
+
import { parseEmbedding } from '../lib/parse-embedding.js';
|
|
12
|
+
import { logger } from '../logger.js';
|
|
13
|
+
// Common entity aliases for normalization
|
|
14
|
+
const KNOWN_ALIASES = {
|
|
15
|
+
'amazon web services': ['aws'],
|
|
16
|
+
'aws': ['amazon web services'],
|
|
17
|
+
'postgresql': ['postgres', 'pg'],
|
|
18
|
+
'kubernetes': ['k8s'],
|
|
19
|
+
'k8s': ['kubernetes'],
|
|
20
|
+
'javascript': ['js'],
|
|
21
|
+
'typescript': ['ts'],
|
|
22
|
+
'node.js': ['nodejs', 'node'],
|
|
23
|
+
'react.js': ['react'],
|
|
24
|
+
'vue.js': ['vue'],
|
|
25
|
+
'machine learning': ['ml'],
|
|
26
|
+
'artificial intelligence': ['ai'],
|
|
27
|
+
'large language model': ['llm'],
|
|
28
|
+
'natural language processing': ['nlp'],
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Find and merge duplicate entities in a project.
|
|
32
|
+
*/
|
|
33
|
+
export async function deduplicateProjectEntities(projectId, options) {
|
|
34
|
+
const { similarityThreshold = 0.85, dryRun = false } = options || {};
|
|
35
|
+
const db = await getDb();
|
|
36
|
+
const schema = await getSchema();
|
|
37
|
+
// Get all entities for the project
|
|
38
|
+
const entities = await db
|
|
39
|
+
.select()
|
|
40
|
+
.from(schema.entities)
|
|
41
|
+
.where(eq(schema.entities.projectId, projectId));
|
|
42
|
+
if (entities.length < 2) {
|
|
43
|
+
return {
|
|
44
|
+
merged: 0,
|
|
45
|
+
aliases: [],
|
|
46
|
+
totalEntities: entities.length,
|
|
47
|
+
uniqueEntities: entities.length,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const aliases = [];
|
|
51
|
+
const merged = new Set();
|
|
52
|
+
let mergeCount = 0;
|
|
53
|
+
// Compare each pair of entities
|
|
54
|
+
for (let i = 0; i < entities.length; i++) {
|
|
55
|
+
if (merged.has(entities[i].id))
|
|
56
|
+
continue;
|
|
57
|
+
for (let j = i + 1; j < entities.length; j++) {
|
|
58
|
+
if (merged.has(entities[j].id))
|
|
59
|
+
continue;
|
|
60
|
+
const similarity = await computeEntitySimilarity(entities[i], entities[j]);
|
|
61
|
+
if (similarity >= similarityThreshold) {
|
|
62
|
+
// Merge j into i (keep the one with more mentions)
|
|
63
|
+
const target = (entities[i].mentionCount || 0) >= (entities[j].mentionCount || 0)
|
|
64
|
+
? entities[i]
|
|
65
|
+
: entities[j];
|
|
66
|
+
const source = target.id === entities[i].id ? entities[j] : entities[i];
|
|
67
|
+
aliases.push({
|
|
68
|
+
from: source.name,
|
|
69
|
+
to: target.name,
|
|
70
|
+
similarity,
|
|
71
|
+
});
|
|
72
|
+
if (!dryRun) {
|
|
73
|
+
await mergeEntities(source, target, db, schema);
|
|
74
|
+
}
|
|
75
|
+
merged.add(source.id);
|
|
76
|
+
mergeCount++;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
logger.info('Entity deduplication completed', {
|
|
81
|
+
projectId,
|
|
82
|
+
totalEntities: entities.length,
|
|
83
|
+
merged: mergeCount,
|
|
84
|
+
dryRun,
|
|
85
|
+
});
|
|
86
|
+
return {
|
|
87
|
+
merged: mergeCount,
|
|
88
|
+
aliases,
|
|
89
|
+
totalEntities: entities.length,
|
|
90
|
+
uniqueEntities: entities.length - mergeCount,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Compute similarity between two entities.
|
|
95
|
+
* Uses a combination of string matching, known aliases, and embedding similarity.
|
|
96
|
+
*/
|
|
97
|
+
async function computeEntitySimilarity(entity1, entity2) {
|
|
98
|
+
// Must be same type to be considered duplicates
|
|
99
|
+
if (entity1.type !== entity2.type) {
|
|
100
|
+
return 0;
|
|
101
|
+
}
|
|
102
|
+
const name1 = entity1.name.toLowerCase().trim();
|
|
103
|
+
const name2 = entity2.name.toLowerCase().trim();
|
|
104
|
+
// Exact match
|
|
105
|
+
if (name1 === name2)
|
|
106
|
+
return 1.0;
|
|
107
|
+
// Check known aliases
|
|
108
|
+
const name1Aliases = KNOWN_ALIASES[name1] || [];
|
|
109
|
+
const name2Aliases = KNOWN_ALIASES[name2] || [];
|
|
110
|
+
if (name1Aliases.includes(name2) || name2Aliases.includes(name1)) {
|
|
111
|
+
return 0.99; // Very high confidence for known aliases
|
|
112
|
+
}
|
|
113
|
+
// String similarity (Jaccard on words)
|
|
114
|
+
const words1 = new Set(name1.split(/[\s._-]+/).filter((w) => w.length > 1));
|
|
115
|
+
const words2 = new Set(name2.split(/[\s._-]+/).filter((w) => w.length > 1));
|
|
116
|
+
const words1Arr = Array.from(words1);
|
|
117
|
+
const words2Arr = Array.from(words2);
|
|
118
|
+
const intersection = words1Arr.filter(w => words2.has(w));
|
|
119
|
+
const union = new Set([...words1Arr, ...words2Arr]);
|
|
120
|
+
if (words1.size > 0 && words2.size > 0) {
|
|
121
|
+
const jaccard = intersection.length / union.size;
|
|
122
|
+
if (jaccard >= 0.8)
|
|
123
|
+
return jaccard;
|
|
124
|
+
}
|
|
125
|
+
// One contains the other (e.g., "React" in "React.js")
|
|
126
|
+
if (name1.includes(name2) || name2.includes(name1)) {
|
|
127
|
+
const shorter = name1.length < name2.length ? name1 : name2;
|
|
128
|
+
const longer = name1.length < name2.length ? name2 : name1;
|
|
129
|
+
// Only count as similar if the shorter name is a significant portion
|
|
130
|
+
if (shorter.length / longer.length >= 0.5) {
|
|
131
|
+
return 0.85;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Embedding similarity (if available)
|
|
135
|
+
const embedding1 = parseEmbedding(entity1.embedding || entity1.embedding_json);
|
|
136
|
+
const embedding2 = parseEmbedding(entity2.embedding || entity2.embedding_json);
|
|
137
|
+
if (embedding1 && embedding2) {
|
|
138
|
+
const embSimilarity = cosineSimilarity(embedding1, embedding2);
|
|
139
|
+
if (embSimilarity >= similarityThreshold) {
|
|
140
|
+
return embSimilarity;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return 0;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Merge source entity into target entity.
|
|
147
|
+
* Updates all relations pointing to source to point to target instead.
|
|
148
|
+
*/
|
|
149
|
+
async function mergeEntities(source, target, db, schema) {
|
|
150
|
+
// Update all relations pointing FROM source to point FROM target
|
|
151
|
+
await db
|
|
152
|
+
.update(schema.entityRelations)
|
|
153
|
+
.set({ fromEntityId: target.id })
|
|
154
|
+
.where(eq(schema.entityRelations.fromEntityId, source.id));
|
|
155
|
+
// Update all relations pointing TO source to point TO target
|
|
156
|
+
await db
|
|
157
|
+
.update(schema.entityRelations)
|
|
158
|
+
.set({ toEntityId: target.id })
|
|
159
|
+
.where(eq(schema.entityRelations.toEntityId, source.id));
|
|
160
|
+
// Add source name as alias to target
|
|
161
|
+
const existingAliases = Array.isArray(target.aliases) ? target.aliases : [];
|
|
162
|
+
const updatedAliases = [...new Set([...existingAliases, source.name])];
|
|
163
|
+
await db
|
|
164
|
+
.update(schema.entities)
|
|
165
|
+
.set({
|
|
166
|
+
aliases: updatedAliases,
|
|
167
|
+
mentionCount: (target.mentionCount || 0) + (source.mentionCount || 0),
|
|
168
|
+
updatedAt: new Date(),
|
|
169
|
+
})
|
|
170
|
+
.where(eq(schema.entities.id, target.id));
|
|
171
|
+
// Delete source entity
|
|
172
|
+
await db
|
|
173
|
+
.delete(schema.entities)
|
|
174
|
+
.where(eq(schema.entities.id, source.id));
|
|
175
|
+
logger.debug('Merged entity', {
|
|
176
|
+
source: source.name,
|
|
177
|
+
target: target.name,
|
|
178
|
+
aliases: updatedAliases,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
// Module-level threshold for embedding similarity
|
|
182
|
+
const similarityThreshold = 0.85;
|
|
183
|
+
//# sourceMappingURL=entity-deduplicator.js.map
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Graph Builder
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates the full pipeline: extract entities and relations from
|
|
5
|
+
* memories and store them in the knowledge graph.
|
|
6
|
+
*/
|
|
7
|
+
export interface GraphBuildStats {
|
|
8
|
+
memoriesProcessed: number;
|
|
9
|
+
entitiesCreated: number;
|
|
10
|
+
relationsCreated: number;
|
|
11
|
+
entitiesDeduplicated: number;
|
|
12
|
+
errors: number;
|
|
13
|
+
durationMs: number;
|
|
14
|
+
}
|
|
15
|
+
export interface GraphAddStats {
|
|
16
|
+
entitiesCreated: number;
|
|
17
|
+
relationsCreated: number;
|
|
18
|
+
source: 'llm' | 'regex' | 'fallback' | 'none';
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Build or rebuild the entity graph for a project.
|
|
22
|
+
* Processes all memories in the project, extracting entities and relations.
|
|
23
|
+
*/
|
|
24
|
+
export declare function buildGraphForProject(projectPath: string, options?: {
|
|
25
|
+
clearExisting?: boolean;
|
|
26
|
+
batchSize?: number;
|
|
27
|
+
preferLLM?: boolean;
|
|
28
|
+
deduplicate?: boolean;
|
|
29
|
+
}): Promise<GraphBuildStats>;
|
|
30
|
+
/**
|
|
31
|
+
* Add a single memory to the knowledge graph.
|
|
32
|
+
* Used for incremental updates when new memories are stored.
|
|
33
|
+
*/
|
|
34
|
+
export declare function addMemoryToGraph(memoryId: string, options?: {
|
|
35
|
+
preferLLM?: boolean;
|
|
36
|
+
}): Promise<GraphAddStats>;
|
|
37
|
+
/**
|
|
38
|
+
* Get graph statistics for a project.
|
|
39
|
+
*/
|
|
40
|
+
export declare function getGraphStats(projectPath: string): Promise<{
|
|
41
|
+
entityCount: number;
|
|
42
|
+
relationCount: number;
|
|
43
|
+
relationTypes: Record<string, number>;
|
|
44
|
+
avgConnections: number;
|
|
45
|
+
}>;
|
|
46
|
+
//# sourceMappingURL=graph-builder.d.ts.map
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Graph Builder
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates the full pipeline: extract entities and relations from
|
|
5
|
+
* memories and store them in the knowledge graph.
|
|
6
|
+
*/
|
|
7
|
+
import { eq } from 'drizzle-orm';
|
|
8
|
+
import { getDb } from '../../db/index.js';
|
|
9
|
+
import { getSchema } from '../../db/schema.js';
|
|
10
|
+
import { logger } from '../logger.js';
|
|
11
|
+
import { config } from '../../config.js';
|
|
12
|
+
import { extractAndStoreRelations } from './relationship-extractor.js';
|
|
13
|
+
import { deduplicateProjectEntities } from './entity-deduplicator.js';
|
|
14
|
+
/**
|
|
15
|
+
* Build or rebuild the entity graph for a project.
|
|
16
|
+
* Processes all memories in the project, extracting entities and relations.
|
|
17
|
+
*/
|
|
18
|
+
export async function buildGraphForProject(projectPath, options) {
|
|
19
|
+
const startTime = Date.now();
|
|
20
|
+
const { clearExisting = false, batchSize = 10, preferLLM = true, deduplicate = true, } = options || {};
|
|
21
|
+
const db = await getDb();
|
|
22
|
+
const schema = await getSchema();
|
|
23
|
+
// Get project
|
|
24
|
+
const projectRows = await db
|
|
25
|
+
.select()
|
|
26
|
+
.from(schema.projects)
|
|
27
|
+
.where(eq(schema.projects.path, projectPath))
|
|
28
|
+
.limit(1);
|
|
29
|
+
if (projectRows.length === 0) {
|
|
30
|
+
logger.warn('Project not found for graph build', { projectPath });
|
|
31
|
+
return {
|
|
32
|
+
memoriesProcessed: 0,
|
|
33
|
+
entitiesCreated: 0,
|
|
34
|
+
relationsCreated: 0,
|
|
35
|
+
entitiesDeduplicated: 0,
|
|
36
|
+
errors: 0,
|
|
37
|
+
durationMs: Date.now() - startTime,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
const projectId = projectRows[0].id;
|
|
41
|
+
// Clear existing graph if requested
|
|
42
|
+
if (clearExisting) {
|
|
43
|
+
const { clearProjectGraph } = await import('./relationship-extractor.js');
|
|
44
|
+
await clearProjectGraph(projectId);
|
|
45
|
+
logger.info('Cleared existing graph for rebuild', { projectId });
|
|
46
|
+
}
|
|
47
|
+
// Get all active memories for the project
|
|
48
|
+
const memories = await db
|
|
49
|
+
.select()
|
|
50
|
+
.from(schema.memories)
|
|
51
|
+
.where(eq(schema.memories.projectId, projectId));
|
|
52
|
+
logger.info('Starting graph build for project', {
|
|
53
|
+
projectId,
|
|
54
|
+
memoryCount: memories.length,
|
|
55
|
+
clearExisting,
|
|
56
|
+
});
|
|
57
|
+
let entitiesCreated = 0;
|
|
58
|
+
let relationsCreated = 0;
|
|
59
|
+
let errors = 0;
|
|
60
|
+
// Process memories in batches
|
|
61
|
+
for (let i = 0; i < memories.length; i += batchSize) {
|
|
62
|
+
const batch = memories.slice(i, i + batchSize);
|
|
63
|
+
for (const memory of batch) {
|
|
64
|
+
try {
|
|
65
|
+
const result = await extractAndStoreRelations(memory.id, memory.content, projectId, { preferLLM });
|
|
66
|
+
entitiesCreated += result.entities;
|
|
67
|
+
relationsCreated += result.relations;
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
logger.error('Error processing memory for graph', {
|
|
71
|
+
memoryId: memory.id,
|
|
72
|
+
error: error,
|
|
73
|
+
});
|
|
74
|
+
errors++;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
logger.debug('Graph build batch progress', {
|
|
78
|
+
processed: Math.min(i + batchSize, memories.length),
|
|
79
|
+
total: memories.length,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
// Deduplicate entities
|
|
83
|
+
let entitiesDeduplicated = 0;
|
|
84
|
+
if (deduplicate) {
|
|
85
|
+
try {
|
|
86
|
+
const dedupResult = await deduplicateProjectEntities(projectId);
|
|
87
|
+
entitiesDeduplicated = dedupResult.merged;
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
logger.error('Error during entity deduplication', { error: error });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const stats = {
|
|
94
|
+
memoriesProcessed: memories.length,
|
|
95
|
+
entitiesCreated,
|
|
96
|
+
relationsCreated,
|
|
97
|
+
entitiesDeduplicated,
|
|
98
|
+
errors,
|
|
99
|
+
durationMs: Date.now() - startTime,
|
|
100
|
+
};
|
|
101
|
+
logger.info('Graph build completed', stats);
|
|
102
|
+
return stats;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Add a single memory to the knowledge graph.
|
|
106
|
+
* Used for incremental updates when new memories are stored.
|
|
107
|
+
*/
|
|
108
|
+
export async function addMemoryToGraph(memoryId, options) {
|
|
109
|
+
const db = await getDb();
|
|
110
|
+
const schema = await getSchema();
|
|
111
|
+
// Get the memory
|
|
112
|
+
const memories = await db
|
|
113
|
+
.select()
|
|
114
|
+
.from(schema.memories)
|
|
115
|
+
.where(eq(schema.memories.id, memoryId))
|
|
116
|
+
.limit(1);
|
|
117
|
+
if (memories.length === 0) {
|
|
118
|
+
return { entitiesCreated: 0, relationsCreated: 0, source: 'none' };
|
|
119
|
+
}
|
|
120
|
+
const memory = memories[0];
|
|
121
|
+
if (!memory.projectId) {
|
|
122
|
+
return { entitiesCreated: 0, relationsCreated: 0, source: 'none' };
|
|
123
|
+
}
|
|
124
|
+
// Use global config if not explicitly overridden
|
|
125
|
+
const preferLLM = options?.preferLLM ?? config.llmEnabled;
|
|
126
|
+
const result = await extractAndStoreRelations(memoryId, memory.content, memory.projectId, { preferLLM });
|
|
127
|
+
return {
|
|
128
|
+
entitiesCreated: result.entities,
|
|
129
|
+
relationsCreated: result.relations,
|
|
130
|
+
source: result.source,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Get graph statistics for a project.
|
|
135
|
+
*/
|
|
136
|
+
export async function getGraphStats(projectPath) {
|
|
137
|
+
const db = await getDb();
|
|
138
|
+
const schema = await getSchema();
|
|
139
|
+
const projectRows = await db
|
|
140
|
+
.select({ id: schema.projects.id })
|
|
141
|
+
.from(schema.projects)
|
|
142
|
+
.where(eq(schema.projects.path, projectPath))
|
|
143
|
+
.limit(1);
|
|
144
|
+
if (projectRows.length === 0) {
|
|
145
|
+
return { entityCount: 0, relationCount: 0, relationTypes: {}, avgConnections: 0 };
|
|
146
|
+
}
|
|
147
|
+
const projectId = projectRows[0].id;
|
|
148
|
+
const entities = await db
|
|
149
|
+
.select()
|
|
150
|
+
.from(schema.entities)
|
|
151
|
+
.where(eq(schema.entities.projectId, projectId));
|
|
152
|
+
const relations = await db
|
|
153
|
+
.select()
|
|
154
|
+
.from(schema.entityRelations);
|
|
155
|
+
// Filter relations to only those involving project entities
|
|
156
|
+
const entityIds = new Set(entities.map((e) => e.id));
|
|
157
|
+
const projectRelations = relations.filter((r) => entityIds.has(r.fromEntityId) || entityIds.has(r.toEntityId));
|
|
158
|
+
// Count by type
|
|
159
|
+
const relationTypes = {};
|
|
160
|
+
for (const r of projectRelations) {
|
|
161
|
+
const type = r.type || 'unknown';
|
|
162
|
+
relationTypes[type] = (relationTypes[type] || 0) + 1;
|
|
163
|
+
}
|
|
164
|
+
const avgConnections = entities.length > 0
|
|
165
|
+
? (projectRelations.length * 2) / entities.length
|
|
166
|
+
: 0;
|
|
167
|
+
return {
|
|
168
|
+
entityCount: entities.length,
|
|
169
|
+
relationCount: projectRelations.length,
|
|
170
|
+
relationTypes,
|
|
171
|
+
avgConnections: Math.round(avgConnections * 100) / 100,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=graph-builder.js.map
|