squish-memory 0.7.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/.claude-plugin/marketplace.json +20 -0
- package/.claude-plugin/plugin.json +32 -0
- package/.mcp.json +14 -0
- package/LICENSE +21 -0
- package/README.md +556 -0
- package/commands/context-paging.md +51 -0
- package/commands/context-status.md +22 -0
- package/commands/context.md +5 -0
- package/commands/core-memory.md +56 -0
- package/commands/health.md +5 -0
- package/commands/init.md +39 -0
- package/commands/merge.md +113 -0
- package/commands/observe.md +5 -0
- package/commands/recall.md +5 -0
- package/commands/remember.md +11 -0
- package/commands/search.md +10 -0
- package/dist/adapters/claude-code/capture.d.ts +11 -0
- package/dist/adapters/claude-code/capture.d.ts.map +1 -0
- package/dist/adapters/claude-code/capture.js +100 -0
- package/dist/adapters/claude-code/capture.js.map +1 -0
- package/dist/adapters/claude-code/index.d.ts +5 -0
- package/dist/adapters/claude-code/index.d.ts.map +1 -0
- package/dist/adapters/claude-code/index.js +6 -0
- package/dist/adapters/claude-code/index.js.map +1 -0
- package/dist/adapters/claude-code/injection.d.ts +34 -0
- package/dist/adapters/claude-code/injection.d.ts.map +1 -0
- package/dist/adapters/claude-code/injection.js +127 -0
- package/dist/adapters/claude-code/injection.js.map +1 -0
- package/dist/adapters/claude-code/plugin-wrapper.d.ts +21 -0
- package/dist/adapters/claude-code/plugin-wrapper.d.ts.map +1 -0
- package/dist/adapters/claude-code/plugin-wrapper.js +239 -0
- package/dist/adapters/claude-code/plugin-wrapper.js.map +1 -0
- package/dist/adapters/claude-code/types.d.ts +46 -0
- package/dist/adapters/claude-code/types.d.ts.map +1 -0
- package/dist/adapters/claude-code/types.js +6 -0
- package/dist/adapters/claude-code/types.js.map +1 -0
- package/dist/algorithms/merge/analytics/token-estimator.d.ts +50 -0
- package/dist/algorithms/merge/analytics/token-estimator.d.ts.map +1 -0
- package/dist/algorithms/merge/analytics/token-estimator.js +154 -0
- package/dist/algorithms/merge/analytics/token-estimator.js.map +1 -0
- package/dist/algorithms/merge/detection/hash-filters.d.ts +47 -0
- package/dist/algorithms/merge/detection/hash-filters.d.ts.map +1 -0
- package/dist/algorithms/merge/detection/hash-filters.js +190 -0
- package/dist/algorithms/merge/detection/hash-filters.js.map +1 -0
- package/dist/algorithms/merge/detection/semantic-ranker.d.ts +32 -0
- package/dist/algorithms/merge/detection/semantic-ranker.d.ts.map +1 -0
- package/dist/algorithms/merge/detection/semantic-ranker.js +118 -0
- package/dist/algorithms/merge/detection/semantic-ranker.js.map +1 -0
- package/dist/algorithms/merge/detection/two-stage-detector.d.ts +49 -0
- package/dist/algorithms/merge/detection/two-stage-detector.d.ts.map +1 -0
- package/dist/algorithms/merge/detection/two-stage-detector.js +185 -0
- package/dist/algorithms/merge/detection/two-stage-detector.js.map +1 -0
- package/dist/algorithms/merge/handlers/approve-merge.d.ts +22 -0
- package/dist/algorithms/merge/handlers/approve-merge.d.ts.map +1 -0
- package/dist/algorithms/merge/handlers/approve-merge.js +179 -0
- package/dist/algorithms/merge/handlers/approve-merge.js.map +1 -0
- package/dist/algorithms/merge/handlers/detect-duplicates.d.ts +47 -0
- package/dist/algorithms/merge/handlers/detect-duplicates.d.ts.map +1 -0
- package/dist/algorithms/merge/handlers/detect-duplicates.js +165 -0
- package/dist/algorithms/merge/handlers/detect-duplicates.js.map +1 -0
- package/dist/algorithms/merge/handlers/get-stats.d.ts +39 -0
- package/dist/algorithms/merge/handlers/get-stats.d.ts.map +1 -0
- package/dist/algorithms/merge/handlers/get-stats.js +88 -0
- package/dist/algorithms/merge/handlers/get-stats.js.map +1 -0
- package/dist/algorithms/merge/handlers/list-proposals.d.ts +45 -0
- package/dist/algorithms/merge/handlers/list-proposals.d.ts.map +1 -0
- package/dist/algorithms/merge/handlers/list-proposals.js +83 -0
- package/dist/algorithms/merge/handlers/list-proposals.js.map +1 -0
- package/dist/algorithms/merge/handlers/preview-merge.d.ts +39 -0
- package/dist/algorithms/merge/handlers/preview-merge.d.ts.map +1 -0
- package/dist/algorithms/merge/handlers/preview-merge.js +93 -0
- package/dist/algorithms/merge/handlers/preview-merge.js.map +1 -0
- package/dist/algorithms/merge/handlers/reject-merge.d.ts +28 -0
- package/dist/algorithms/merge/handlers/reject-merge.d.ts.map +1 -0
- package/dist/algorithms/merge/handlers/reject-merge.js +69 -0
- package/dist/algorithms/merge/handlers/reject-merge.js.map +1 -0
- package/dist/algorithms/merge/handlers/reverse-merge.d.ts +21 -0
- package/dist/algorithms/merge/handlers/reverse-merge.d.ts.map +1 -0
- package/dist/algorithms/merge/handlers/reverse-merge.js +121 -0
- package/dist/algorithms/merge/handlers/reverse-merge.js.map +1 -0
- package/dist/algorithms/merge/safety/safety-checks.d.ts +22 -0
- package/dist/algorithms/merge/safety/safety-checks.d.ts.map +1 -0
- package/dist/algorithms/merge/safety/safety-checks.js +215 -0
- package/dist/algorithms/merge/safety/safety-checks.js.map +1 -0
- package/dist/algorithms/merge/strategies/merge-strategies.d.ts +32 -0
- package/dist/algorithms/merge/strategies/merge-strategies.d.ts.map +1 -0
- package/dist/algorithms/merge/strategies/merge-strategies.js +337 -0
- package/dist/algorithms/merge/strategies/merge-strategies.js.map +1 -0
- package/dist/api/web/web.d.ts +4 -0
- package/dist/api/web/web.d.ts.map +1 -0
- package/dist/api/web/web.js +484 -0
- package/dist/api/web/web.js.map +1 -0
- package/dist/config.d.ts +28 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +83 -0
- package/dist/config.js.map +1 -0
- package/dist/core/agent-memory.d.ts +22 -0
- package/dist/core/agent-memory.d.ts.map +1 -0
- package/dist/core/agent-memory.js +111 -0
- package/dist/core/agent-memory.js.map +1 -0
- package/dist/core/associations.d.ts +32 -0
- package/dist/core/associations.d.ts.map +1 -0
- package/dist/core/associations.js +249 -0
- package/dist/core/associations.js.map +1 -0
- package/dist/core/cache.d.ts +13 -0
- package/dist/core/cache.d.ts.map +1 -0
- package/dist/core/cache.js +202 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/core/consolidation.d.ts +6 -0
- package/dist/core/consolidation.d.ts.map +1 -0
- package/dist/core/consolidation.js +40 -0
- package/dist/core/consolidation.js.map +1 -0
- package/dist/core/context-paging.d.ts +90 -0
- package/dist/core/context-paging.d.ts.map +1 -0
- package/dist/core/context-paging.js +348 -0
- package/dist/core/context-paging.js.map +1 -0
- package/dist/core/context.d.ts +7 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +24 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/core-memory.d.ts +73 -0
- package/dist/core/core-memory.d.ts.map +1 -0
- package/dist/core/core-memory.js +214 -0
- package/dist/core/core-memory.js.map +1 -0
- package/dist/core/database.d.ts +12 -0
- package/dist/core/database.d.ts.map +1 -0
- package/dist/core/database.js +12 -0
- package/dist/core/database.js.map +1 -0
- package/dist/core/embeddings/qmd-client.d.ts +136 -0
- package/dist/core/embeddings/qmd-client.d.ts.map +1 -0
- package/dist/core/embeddings/qmd-client.js +403 -0
- package/dist/core/embeddings/qmd-client.js.map +1 -0
- package/dist/core/embeddings/qmd-provider.d.ts +65 -0
- package/dist/core/embeddings/qmd-provider.d.ts.map +1 -0
- package/dist/core/embeddings/qmd-provider.js +133 -0
- package/dist/core/embeddings/qmd-provider.js.map +1 -0
- package/dist/core/embeddings.d.ts +19 -0
- package/dist/core/embeddings.d.ts.map +1 -0
- package/dist/core/embeddings.js +297 -0
- package/dist/core/embeddings.js.map +1 -0
- package/dist/core/governance.d.ts +21 -0
- package/dist/core/governance.d.ts.map +1 -0
- package/dist/core/governance.js +64 -0
- package/dist/core/governance.js.map +1 -0
- package/dist/core/index.d.ts +10 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +14 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/lifecycle.d.ts +19 -0
- package/dist/core/lifecycle.d.ts.map +1 -0
- package/dist/core/lifecycle.js +182 -0
- package/dist/core/lifecycle.js.map +1 -0
- package/dist/core/local-embeddings.d.ts +14 -0
- package/dist/core/local-embeddings.d.ts.map +1 -0
- package/dist/core/local-embeddings.js +94 -0
- package/dist/core/local-embeddings.js.map +1 -0
- package/dist/core/logger.d.ts +16 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +34 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/memory/bridge-discovery.d.ts +50 -0
- package/dist/core/memory/bridge-discovery.d.ts.map +1 -0
- package/dist/core/memory/bridge-discovery.js +291 -0
- package/dist/core/memory/bridge-discovery.js.map +1 -0
- package/dist/core/memory/entity-extractor.d.ts +33 -0
- package/dist/core/memory/entity-extractor.d.ts.map +1 -0
- package/dist/core/memory/entity-extractor.js +336 -0
- package/dist/core/memory/entity-extractor.js.map +1 -0
- package/dist/core/memory/entity-resolver.d.ts +23 -0
- package/dist/core/memory/entity-resolver.d.ts.map +1 -0
- package/dist/core/memory/entity-resolver.js +64 -0
- package/dist/core/memory/entity-resolver.js.map +1 -0
- package/dist/core/memory/fact-extractor.d.ts +24 -0
- package/dist/core/memory/fact-extractor.d.ts.map +1 -0
- package/dist/core/memory/fact-extractor.js +89 -0
- package/dist/core/memory/fact-extractor.js.map +1 -0
- package/dist/core/memory/hybrid-retrieval.d.ts +30 -0
- package/dist/core/memory/hybrid-retrieval.d.ts.map +1 -0
- package/dist/core/memory/hybrid-retrieval.js +63 -0
- package/dist/core/memory/hybrid-retrieval.js.map +1 -0
- package/dist/core/memory/hybrid-scorer.d.ts +51 -0
- package/dist/core/memory/hybrid-scorer.d.ts.map +1 -0
- package/dist/core/memory/hybrid-scorer.js +248 -0
- package/dist/core/memory/hybrid-scorer.js.map +1 -0
- package/dist/core/memory/index.d.ts +8 -0
- package/dist/core/memory/index.d.ts.map +1 -0
- package/dist/core/memory/index.js +10 -0
- package/dist/core/memory/index.js.map +1 -0
- package/dist/core/memory/memories.d.ts +35 -0
- package/dist/core/memory/memories.d.ts.map +1 -0
- package/dist/core/memory/memories.js +338 -0
- package/dist/core/memory/memories.js.map +1 -0
- package/dist/core/memory/memory-manager.d.ts +15 -0
- package/dist/core/memory/memory-manager.d.ts.map +1 -0
- package/dist/core/memory/memory-manager.js +46 -0
- package/dist/core/memory/memory-manager.js.map +1 -0
- package/dist/core/memory/query-processor.d.ts +21 -0
- package/dist/core/memory/query-processor.d.ts.map +1 -0
- package/dist/core/memory/query-processor.js +72 -0
- package/dist/core/memory/query-processor.js.map +1 -0
- package/dist/core/memory/serialization.d.ts +6 -0
- package/dist/core/memory/serialization.d.ts.map +1 -0
- package/dist/core/memory/serialization.js +35 -0
- package/dist/core/memory/serialization.js.map +1 -0
- package/dist/core/memory/temporal-parser.d.ts +32 -0
- package/dist/core/memory/temporal-parser.d.ts.map +1 -0
- package/dist/core/memory/temporal-parser.js +385 -0
- package/dist/core/memory/temporal-parser.js.map +1 -0
- package/dist/core/observations.d.ts +26 -0
- package/dist/core/observations.d.ts.map +1 -0
- package/dist/core/observations.js +118 -0
- package/dist/core/observations.js.map +1 -0
- package/dist/core/privacy.d.ts +23 -0
- package/dist/core/privacy.d.ts.map +1 -0
- package/dist/core/privacy.js +82 -0
- package/dist/core/privacy.js.map +1 -0
- package/dist/core/projects.d.ts +10 -0
- package/dist/core/projects.d.ts.map +1 -0
- package/dist/core/projects.js +66 -0
- package/dist/core/projects.js.map +1 -0
- package/dist/core/redis.d.ts +11 -0
- package/dist/core/redis.d.ts.map +1 -0
- package/dist/core/redis.js +69 -0
- package/dist/core/redis.js.map +1 -0
- package/dist/core/requirements.d.ts +20 -0
- package/dist/core/requirements.d.ts.map +1 -0
- package/dist/core/requirements.js +35 -0
- package/dist/core/requirements.js.map +1 -0
- package/dist/core/search/conversations.d.ts +25 -0
- package/dist/core/search/conversations.d.ts.map +1 -0
- package/dist/core/search/conversations.js +112 -0
- package/dist/core/search/conversations.js.map +1 -0
- package/dist/core/search/entities.d.ts +12 -0
- package/dist/core/search/entities.d.ts.map +1 -0
- package/dist/core/search/entities.js +34 -0
- package/dist/core/search/entities.js.map +1 -0
- package/dist/core/search/folder-context.d.ts +25 -0
- package/dist/core/search/folder-context.d.ts.map +1 -0
- package/dist/core/search/folder-context.js +119 -0
- package/dist/core/search/folder-context.js.map +1 -0
- package/dist/core/search/index.d.ts +4 -0
- package/dist/core/search/index.d.ts.map +1 -0
- package/dist/core/search/index.js +5 -0
- package/dist/core/search/index.js.map +1 -0
- package/dist/core/search/qmd-search.d.ts +61 -0
- package/dist/core/search/qmd-search.d.ts.map +1 -0
- package/dist/core/search/qmd-search.js +178 -0
- package/dist/core/search/qmd-search.js.map +1 -0
- package/dist/core/secret-detector.d.ts +32 -0
- package/dist/core/secret-detector.d.ts.map +1 -0
- package/dist/core/secret-detector.js +88 -0
- package/dist/core/secret-detector.js.map +1 -0
- package/dist/core/snapshots/cleanup.d.ts +9 -0
- package/dist/core/snapshots/cleanup.d.ts.map +1 -0
- package/dist/core/snapshots/cleanup.js +12 -0
- package/dist/core/snapshots/cleanup.js.map +1 -0
- package/dist/core/snapshots/comparison.d.ts +19 -0
- package/dist/core/snapshots/comparison.d.ts.map +1 -0
- package/dist/core/snapshots/comparison.js +37 -0
- package/dist/core/snapshots/comparison.js.map +1 -0
- package/dist/core/snapshots/creation.d.ts +19 -0
- package/dist/core/snapshots/creation.d.ts.map +1 -0
- package/dist/core/snapshots/creation.js +126 -0
- package/dist/core/snapshots/creation.js.map +1 -0
- package/dist/core/snapshots/retrieval.d.ts +7 -0
- package/dist/core/snapshots/retrieval.d.ts.map +1 -0
- package/dist/core/snapshots/retrieval.js +41 -0
- package/dist/core/snapshots/retrieval.js.map +1 -0
- package/dist/core/snapshots/stats.d.ts +11 -0
- package/dist/core/snapshots/stats.d.ts.map +1 -0
- package/dist/core/snapshots/stats.js +52 -0
- package/dist/core/snapshots/stats.js.map +1 -0
- package/dist/core/snapshots.d.ts +29 -0
- package/dist/core/snapshots.d.ts.map +1 -0
- package/dist/core/snapshots.js +220 -0
- package/dist/core/snapshots.js.map +1 -0
- package/dist/core/summarization/cleanup.d.ts +9 -0
- package/dist/core/summarization/cleanup.d.ts.map +1 -0
- package/dist/core/summarization/cleanup.js +12 -0
- package/dist/core/summarization/cleanup.js.map +1 -0
- package/dist/core/summarization/queries.d.ts +9 -0
- package/dist/core/summarization/queries.d.ts.map +1 -0
- package/dist/core/summarization/queries.js +28 -0
- package/dist/core/summarization/queries.js.map +1 -0
- package/dist/core/summarization/stats.d.ts +14 -0
- package/dist/core/summarization/stats.d.ts.map +1 -0
- package/dist/core/summarization/stats.js +52 -0
- package/dist/core/summarization/stats.js.map +1 -0
- package/dist/core/summarization/strategies.d.ts +24 -0
- package/dist/core/summarization/strategies.d.ts.map +1 -0
- package/dist/core/summarization/strategies.js +28 -0
- package/dist/core/summarization/strategies.js.map +1 -0
- package/dist/core/summarization.d.ts +37 -0
- package/dist/core/summarization.d.ts.map +1 -0
- package/dist/core/summarization.js +188 -0
- package/dist/core/summarization.js.map +1 -0
- package/dist/core/sync/qmd-sync.d.ts +106 -0
- package/dist/core/sync/qmd-sync.d.ts.map +1 -0
- package/dist/core/sync/qmd-sync.js +213 -0
- package/dist/core/sync/qmd-sync.js.map +1 -0
- package/dist/core/temporal-facts.d.ts +54 -0
- package/dist/core/temporal-facts.d.ts.map +1 -0
- package/dist/core/temporal-facts.js +193 -0
- package/dist/core/temporal-facts.js.map +1 -0
- package/dist/core/utils/cleanup-operations.d.ts +13 -0
- package/dist/core/utils/cleanup-operations.d.ts.map +1 -0
- package/dist/core/utils/cleanup-operations.js +44 -0
- package/dist/core/utils/cleanup-operations.js.map +1 -0
- package/dist/core/utils/content-extraction.d.ts +19 -0
- package/dist/core/utils/content-extraction.d.ts.map +1 -0
- package/dist/core/utils/content-extraction.js +65 -0
- package/dist/core/utils/content-extraction.js.map +1 -0
- package/dist/core/utils/filter-builder.d.ts +13 -0
- package/dist/core/utils/filter-builder.d.ts.map +1 -0
- package/dist/core/utils/filter-builder.js +44 -0
- package/dist/core/utils/filter-builder.js.map +1 -0
- package/dist/core/utils/history-traversal.d.ts +13 -0
- package/dist/core/utils/history-traversal.d.ts.map +1 -0
- package/dist/core/utils/history-traversal.js +50 -0
- package/dist/core/utils/history-traversal.js.map +1 -0
- package/dist/core/utils/memory-operations.d.ts +17 -0
- package/dist/core/utils/memory-operations.d.ts.map +1 -0
- package/dist/core/utils/memory-operations.js +41 -0
- package/dist/core/utils/memory-operations.js.map +1 -0
- package/dist/core/utils/query-operations.d.ts +18 -0
- package/dist/core/utils/query-operations.d.ts.map +1 -0
- package/dist/core/utils/query-operations.js +65 -0
- package/dist/core/utils/query-operations.js.map +1 -0
- package/dist/core/utils/summarization-helpers.d.ts +21 -0
- package/dist/core/utils/summarization-helpers.d.ts.map +1 -0
- package/dist/core/utils/summarization-helpers.js +35 -0
- package/dist/core/utils/summarization-helpers.js.map +1 -0
- package/dist/core/utils/temporal-queries.d.ts +13 -0
- package/dist/core/utils/temporal-queries.d.ts.map +1 -0
- package/dist/core/utils/temporal-queries.js +27 -0
- package/dist/core/utils/temporal-queries.js.map +1 -0
- package/dist/core/utils/version-management.d.ts +9 -0
- package/dist/core/utils/version-management.d.ts.map +1 -0
- package/dist/core/utils/version-management.js +61 -0
- package/dist/core/utils/version-management.js.map +1 -0
- package/dist/core/utils.d.ts +13 -0
- package/dist/core/utils.d.ts.map +1 -0
- package/dist/core/utils.js +51 -0
- package/dist/core/utils.js.map +1 -0
- package/dist/core/worker.d.ts +62 -0
- package/dist/core/worker.d.ts.map +1 -0
- package/dist/core/worker.js +186 -0
- package/dist/core/worker.js.map +1 -0
- package/dist/db/adapter.d.ts +6 -0
- package/dist/db/adapter.d.ts.map +1 -0
- package/dist/db/adapter.js +43 -0
- package/dist/db/adapter.js.map +1 -0
- package/dist/db/bootstrap.d.ts +9 -0
- package/dist/db/bootstrap.d.ts.map +1 -0
- package/dist/db/bootstrap.js +444 -0
- package/dist/db/bootstrap.js.map +1 -0
- package/dist/db/index.d.ts +11 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +43 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/schema.d.ts +3 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +11 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/drizzle/schema-sqlite.d.ts +3046 -0
- package/dist/drizzle/schema-sqlite.d.ts.map +1 -0
- package/dist/drizzle/schema-sqlite.js +405 -0
- package/dist/drizzle/schema-sqlite.js.map +1 -0
- package/dist/drizzle/schema.d.ts +2969 -0
- package/dist/drizzle/schema.d.ts.map +1 -0
- package/dist/drizzle/schema.js +555 -0
- package/dist/drizzle/schema.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +784 -0
- package/dist/index.js.map +1 -0
- package/hooks/hooks.json +52 -0
- package/hooks/post-tool-use.js +26 -0
- package/hooks/session-end.js +28 -0
- package/hooks/session-start.js +33 -0
- package/hooks/user-prompt-submit.js +26 -0
- package/hooks/utils.js +153 -0
- package/npx-installer.js +208 -0
- package/package.json +101 -0
- package/plugin.json +32 -0
- package/skills/memory-guide/SKILL.md +198 -0
- package/skills/squish-memory/SKILL.md +87 -0
- package/skills/squish-memory/install.sh +91 -0
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Entity Extractor
|
|
3
|
+
* Extracts named entities from memory content
|
|
4
|
+
* Supports people, files, functions, dates, locations, concepts, tools, and patterns
|
|
5
|
+
*/
|
|
6
|
+
import { getDb } from '../../db/index.js';
|
|
7
|
+
import { getSchema } from '../../db/schema.js';
|
|
8
|
+
import { eq, and } from 'drizzle-orm';
|
|
9
|
+
import { logger } from '../../core/logger.js';
|
|
10
|
+
// Regex patterns for entity detection
|
|
11
|
+
const PATTERNS = {
|
|
12
|
+
// File paths: src/components/Button.tsx, ./config.json, /var/log/app.log
|
|
13
|
+
filePath: /(?:^|[^\w])(?:\.?\/[\w.-]*[\w.-]*(?:\/[\w.-]+)*|[\w.-]+\.(?:ts|tsx|js|jsx|py|rb|go|java|cpp|c|h|json|yaml|yml|env|md|txt|csv|sql|graphql))\b/gm,
|
|
14
|
+
// Functions/methods: `functionName()`, `object.method()`, `Class.staticMethod()`
|
|
15
|
+
functionCall: /\b([a-zA-Z_$][a-zA-Z0-9_$]*)\s*(?=\()/g,
|
|
16
|
+
// Classes: `class ClassName`, `new ClassName()`, `extends ClassName`
|
|
17
|
+
className: /\b(?:class|new|extends|implements)\s+([A-Z][a-zA-Z0-9_$]*)\b/g,
|
|
18
|
+
// Common names (capitalized words not at sentence start)
|
|
19
|
+
personName: /(?:^|[^.\w])\b([A-Z][a-z]+(?:\s+[A-Z][a-z]+)?)\b(?![^.\w])/g,
|
|
20
|
+
// Capitalized concepts: `Machine Learning`, `React Hooks`
|
|
21
|
+
concept: /\b(?:[A-Z][a-z]+\s+)+(?:System|Architecture|Pattern|Model|Algorithm|Framework|Library|Process|Concept|Theory|Method)\b/g,
|
|
22
|
+
// Technologies/Tools: React, Node.js, PostgreSQL, Docker, Kubernetes
|
|
23
|
+
tool: /\b(?:React|Vue|Angular|Node\.?js?|Express|Django|Flask|FastAPI|PostgreSQL|MongoDB|Redis|Docker|Kubernetes|Terraform|AWS|Azure|GCP|GitHub|GitLab|Jenkins|Figma|Sketch|Adobe|Webpack|Vite|npm|yarn|pnpm|TypeScript|JavaScript|Python|Go|Rust|Java|C\+\+|C#)\b/g,
|
|
24
|
+
// Design patterns: `singleton pattern`, `factory method`, `observer pattern`
|
|
25
|
+
designPattern: /\b(?:abstract\s+)?(?:factory|singleton|observer|decorator|strategy|adapter|bridge|facade|proxy|chain\s+of\s+responsibility|composite|template\s+method|visitor|builder|prototype|memento|interpreter|command|state|mediator)\s+(?:pattern|method)\b/gi,
|
|
26
|
+
// Techniques/Methodologies: `memoization`, `caching`, `lazy loading`, `debouncing`
|
|
27
|
+
technique: /\b(?:memoization|caching|lazy\s+loading|debouncing|throttling|currying|composition|recursion|iteration|hashing|indexing|sharding|replication|optimization|refactoring|testing|debugging|profiling|monitoring|logging)\b/gi,
|
|
28
|
+
// Quoted concepts and important terms
|
|
29
|
+
quotedConcept: /["`]([^"`]+)["`]/g,
|
|
30
|
+
// ISO dates
|
|
31
|
+
date: /\b(\d{4}-\d{2}-\d{2})(?:T\d{2}:\d{2}:\d{2})?\b/g,
|
|
32
|
+
// Common code keywords and variables
|
|
33
|
+
codeVariable: /\b(?:const|let|var|function|async|await|return|import|export|class|interface|type|enum)\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\b/g,
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Extract entities from content
|
|
37
|
+
*/
|
|
38
|
+
export async function extractEntities(content) {
|
|
39
|
+
const entities = [];
|
|
40
|
+
const seenKeys = new Set(); // Deduplicate entities
|
|
41
|
+
// Extract file paths
|
|
42
|
+
const filePaths = Array.from(content.matchAll(PATTERNS.filePath));
|
|
43
|
+
for (const match of filePaths) {
|
|
44
|
+
const name = match[0].trim();
|
|
45
|
+
const key = `file:${name}`;
|
|
46
|
+
if (!seenKeys.has(key)) {
|
|
47
|
+
entities.push({
|
|
48
|
+
name,
|
|
49
|
+
type: 'file',
|
|
50
|
+
confidence: 0.9,
|
|
51
|
+
startIndex: match.index || 0,
|
|
52
|
+
endIndex: (match.index || 0) + match[0].length,
|
|
53
|
+
context: extractContext(content, match.index || 0),
|
|
54
|
+
normalized: normalizePath(name),
|
|
55
|
+
});
|
|
56
|
+
seenKeys.add(key);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Extract function calls
|
|
60
|
+
const functionCalls = Array.from(content.matchAll(PATTERNS.functionCall));
|
|
61
|
+
for (const match of functionCalls) {
|
|
62
|
+
const name = match[1];
|
|
63
|
+
const key = `function:${name}`;
|
|
64
|
+
if (!seenKeys.has(key) && name.length > 2) {
|
|
65
|
+
entities.push({
|
|
66
|
+
name,
|
|
67
|
+
type: 'function',
|
|
68
|
+
confidence: 0.85,
|
|
69
|
+
startIndex: match.index || 0,
|
|
70
|
+
endIndex: (match.index || 0) + match[0].length,
|
|
71
|
+
context: extractContext(content, match.index || 0),
|
|
72
|
+
});
|
|
73
|
+
seenKeys.add(key);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Extract class names
|
|
77
|
+
const classNames = Array.from(content.matchAll(PATTERNS.className));
|
|
78
|
+
for (const match of classNames) {
|
|
79
|
+
const name = match[1];
|
|
80
|
+
const key = `class:${name}`;
|
|
81
|
+
if (!seenKeys.has(key)) {
|
|
82
|
+
entities.push({
|
|
83
|
+
name,
|
|
84
|
+
type: 'class',
|
|
85
|
+
confidence: 0.95,
|
|
86
|
+
startIndex: match.index || 0,
|
|
87
|
+
endIndex: (match.index || 0) + match[0].length,
|
|
88
|
+
context: extractContext(content, match.index || 0),
|
|
89
|
+
});
|
|
90
|
+
seenKeys.add(key);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Extract technologies/tools
|
|
94
|
+
const tools = Array.from(content.matchAll(PATTERNS.tool));
|
|
95
|
+
for (const match of tools) {
|
|
96
|
+
const name = match[0];
|
|
97
|
+
const key = `tool:${name}`;
|
|
98
|
+
if (!seenKeys.has(key)) {
|
|
99
|
+
entities.push({
|
|
100
|
+
name,
|
|
101
|
+
type: 'tool',
|
|
102
|
+
confidence: 0.9,
|
|
103
|
+
startIndex: match.index || 0,
|
|
104
|
+
endIndex: (match.index || 0) + match[0].length,
|
|
105
|
+
context: extractContext(content, match.index || 0),
|
|
106
|
+
});
|
|
107
|
+
seenKeys.add(key);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Extract design patterns
|
|
111
|
+
const patterns = Array.from(content.matchAll(PATTERNS.designPattern));
|
|
112
|
+
for (const match of patterns) {
|
|
113
|
+
const name = match[0];
|
|
114
|
+
const key = `pattern:${name}`;
|
|
115
|
+
if (!seenKeys.has(key)) {
|
|
116
|
+
entities.push({
|
|
117
|
+
name,
|
|
118
|
+
type: 'pattern',
|
|
119
|
+
confidence: 0.92,
|
|
120
|
+
startIndex: match.index || 0,
|
|
121
|
+
endIndex: (match.index || 0) + match[0].length,
|
|
122
|
+
context: extractContext(content, match.index || 0),
|
|
123
|
+
});
|
|
124
|
+
seenKeys.add(key);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Extract techniques/methodologies
|
|
128
|
+
const techniques = Array.from(content.matchAll(PATTERNS.technique));
|
|
129
|
+
for (const match of techniques) {
|
|
130
|
+
const name = match[0];
|
|
131
|
+
const key = `technique:${name}`;
|
|
132
|
+
if (!seenKeys.has(key)) {
|
|
133
|
+
entities.push({
|
|
134
|
+
name,
|
|
135
|
+
type: 'technique',
|
|
136
|
+
confidence: 0.88,
|
|
137
|
+
startIndex: match.index || 0,
|
|
138
|
+
endIndex: (match.index || 0) + match[0].length,
|
|
139
|
+
context: extractContext(content, match.index || 0),
|
|
140
|
+
});
|
|
141
|
+
seenKeys.add(key);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Extract dates
|
|
145
|
+
const dates = Array.from(content.matchAll(PATTERNS.date));
|
|
146
|
+
for (const match of dates) {
|
|
147
|
+
const name = match[0];
|
|
148
|
+
const key = `date:${name}`;
|
|
149
|
+
if (!seenKeys.has(key)) {
|
|
150
|
+
entities.push({
|
|
151
|
+
name,
|
|
152
|
+
type: 'date',
|
|
153
|
+
confidence: 0.95,
|
|
154
|
+
startIndex: match.index || 0,
|
|
155
|
+
endIndex: (match.index || 0) + match[0].length,
|
|
156
|
+
context: extractContext(content, match.index || 0),
|
|
157
|
+
});
|
|
158
|
+
seenKeys.add(key);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// Extract quoted important concepts
|
|
162
|
+
const quotedConcepts = Array.from(content.matchAll(PATTERNS.quotedConcept));
|
|
163
|
+
for (const match of quotedConcepts) {
|
|
164
|
+
const name = match[1];
|
|
165
|
+
const key = `concept:${name}`;
|
|
166
|
+
if (!seenKeys.has(key) && name.length > 2) {
|
|
167
|
+
entities.push({
|
|
168
|
+
name,
|
|
169
|
+
type: 'concept',
|
|
170
|
+
confidence: 0.8,
|
|
171
|
+
startIndex: match.index || 0,
|
|
172
|
+
endIndex: (match.index || 0) + match[0].length,
|
|
173
|
+
context: extractContext(content, match.index || 0),
|
|
174
|
+
});
|
|
175
|
+
seenKeys.add(key);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// Extract capitalized concepts
|
|
179
|
+
const concepts = Array.from(content.matchAll(PATTERNS.concept));
|
|
180
|
+
for (const match of concepts) {
|
|
181
|
+
const name = match[0];
|
|
182
|
+
const key = `concept:${name}`;
|
|
183
|
+
if (!seenKeys.has(key)) {
|
|
184
|
+
entities.push({
|
|
185
|
+
name,
|
|
186
|
+
type: 'concept',
|
|
187
|
+
confidence: 0.75,
|
|
188
|
+
startIndex: match.index || 0,
|
|
189
|
+
endIndex: (match.index || 0) + match[0].length,
|
|
190
|
+
context: extractContext(content, match.index || 0),
|
|
191
|
+
});
|
|
192
|
+
seenKeys.add(key);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// Sort by start index
|
|
196
|
+
entities.sort((a, b) => a.startIndex - b.startIndex);
|
|
197
|
+
logger.debug('Entities extracted', {
|
|
198
|
+
count: entities.length,
|
|
199
|
+
byType: countByType(entities),
|
|
200
|
+
});
|
|
201
|
+
return entities;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Link extracted entities to memory records
|
|
205
|
+
* Creates entity records in the knowledge graph
|
|
206
|
+
*/
|
|
207
|
+
export async function linkEntitiesToMemories(memoryId, entities) {
|
|
208
|
+
if (entities.length === 0)
|
|
209
|
+
return;
|
|
210
|
+
try {
|
|
211
|
+
const db = await getDb();
|
|
212
|
+
const schema = await getSchema();
|
|
213
|
+
// Get memory to find project
|
|
214
|
+
const memories = await db
|
|
215
|
+
.select()
|
|
216
|
+
.from(schema.memories)
|
|
217
|
+
.where(eq(schema.memories.id, memoryId))
|
|
218
|
+
.limit(1);
|
|
219
|
+
if (memories.length === 0)
|
|
220
|
+
return;
|
|
221
|
+
const memory = memories[0];
|
|
222
|
+
// Insert unique entities into the knowledge graph
|
|
223
|
+
for (const entity of entities) {
|
|
224
|
+
try {
|
|
225
|
+
// Check if entity already exists
|
|
226
|
+
const existing = await db
|
|
227
|
+
.select()
|
|
228
|
+
.from(schema.entities)
|
|
229
|
+
.where(and(eq(schema.entities.projectId, memory.projectId), eq(schema.entities.name, entity.name), eq(schema.entities.type, entity.type)))
|
|
230
|
+
.limit(1);
|
|
231
|
+
if (existing.length === 0) {
|
|
232
|
+
// Insert new entity with metadata in properties
|
|
233
|
+
await db.insert(schema.entities).values({
|
|
234
|
+
name: entity.name,
|
|
235
|
+
type: entity.type,
|
|
236
|
+
projectId: memory.projectId,
|
|
237
|
+
description: entity.context,
|
|
238
|
+
properties: {
|
|
239
|
+
confidence: entity.confidence,
|
|
240
|
+
extractedFrom: memoryId,
|
|
241
|
+
normalized: entity.normalized,
|
|
242
|
+
},
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
catch (error) {
|
|
247
|
+
logger.error('Error inserting entity', { entity, error });
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
logger.debug('Entities linked to memory', {
|
|
251
|
+
memoryId,
|
|
252
|
+
entityCount: entities.length,
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
logger.error('Error linking entities to memories', error);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Get entities extracted from a memory based on properties
|
|
261
|
+
*/
|
|
262
|
+
export async function getMemoryEntities(memoryId) {
|
|
263
|
+
try {
|
|
264
|
+
const db = await getDb();
|
|
265
|
+
const schema = await getSchema();
|
|
266
|
+
// Find all entities with this memory ID in properties
|
|
267
|
+
const allEntities = await db.select().from(schema.entities);
|
|
268
|
+
const entities = [];
|
|
269
|
+
for (const entity of allEntities) {
|
|
270
|
+
const props = entity.properties;
|
|
271
|
+
if (props && props.extractedFrom === memoryId) {
|
|
272
|
+
entities.push({
|
|
273
|
+
name: entity.name,
|
|
274
|
+
type: entity.type,
|
|
275
|
+
confidence: props.confidence || 0.8,
|
|
276
|
+
startIndex: 0,
|
|
277
|
+
endIndex: 0,
|
|
278
|
+
context: entity.description || '',
|
|
279
|
+
normalized: props.normalized,
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
return entities;
|
|
284
|
+
}
|
|
285
|
+
catch (error) {
|
|
286
|
+
logger.error('Error getting memory entities', error);
|
|
287
|
+
return [];
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Get all entities for a project
|
|
292
|
+
*/
|
|
293
|
+
export async function getProjectEntities(projectId, type) {
|
|
294
|
+
try {
|
|
295
|
+
const db = await getDb();
|
|
296
|
+
const schema = await getSchema();
|
|
297
|
+
let query = db.select().from(schema.entities).where(eq(schema.entities.projectId, projectId));
|
|
298
|
+
if (type) {
|
|
299
|
+
query = query.where(eq(schema.entities.type, type));
|
|
300
|
+
}
|
|
301
|
+
return await query;
|
|
302
|
+
}
|
|
303
|
+
catch (error) {
|
|
304
|
+
logger.error('Error getting project entities', error);
|
|
305
|
+
return [];
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Extract context around entity
|
|
310
|
+
*/
|
|
311
|
+
function extractContext(content, index, contextLength = 50) {
|
|
312
|
+
const start = Math.max(0, index - contextLength);
|
|
313
|
+
const end = Math.min(content.length, index + contextLength);
|
|
314
|
+
return content.substring(start, end).trim();
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Normalize file path
|
|
318
|
+
*/
|
|
319
|
+
function normalizePath(path) {
|
|
320
|
+
return path
|
|
321
|
+
.trim()
|
|
322
|
+
.replace(/^\.\//, '')
|
|
323
|
+
.toLowerCase()
|
|
324
|
+
.replace(/\\/g, '/');
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Count entities by type
|
|
328
|
+
*/
|
|
329
|
+
function countByType(entities) {
|
|
330
|
+
const counts = {};
|
|
331
|
+
for (const entity of entities) {
|
|
332
|
+
counts[entity.type] = (counts[entity.type] || 0) + 1;
|
|
333
|
+
}
|
|
334
|
+
return counts;
|
|
335
|
+
}
|
|
336
|
+
//# sourceMappingURL=entity-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-extractor.js","sourceRoot":"","sources":["../../../core/memory/entity-extractor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAyB9C,sCAAsC;AACtC,MAAM,QAAQ,GAAG;IACf,yEAAyE;IACzE,QAAQ,EAAE,gJAAgJ;IAE1J,iFAAiF;IACjF,YAAY,EAAE,wCAAwC;IAEtD,qEAAqE;IACrE,SAAS,EAAE,+DAA+D;IAE1E,yDAAyD;IACzD,UAAU,EAAE,6DAA6D;IAEzE,0DAA0D;IAC1D,OAAO,EAAE,yHAAyH;IAElI,qEAAqE;IACrE,IAAI,EAAE,8PAA8P;IAEpQ,6EAA6E;IAC7E,aAAa,EAAE,uPAAuP;IAEtQ,mFAAmF;IACnF,SAAS,EAAE,2NAA2N;IAEtO,sCAAsC;IACtC,aAAa,EAAE,mBAAmB;IAElC,YAAY;IACZ,IAAI,EAAE,iDAAiD;IAEvD,qCAAqC;IACrC,YAAY,EAAE,yHAAyH;CACxI,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAe;IACnD,MAAM,QAAQ,GAAsB,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC,CAAC,uBAAuB;IAE3D,qBAAqB;IACrB,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClE,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,QAAQ,IAAI,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI;gBACJ,IAAI,EAAE,MAAM;gBACZ,UAAU,EAAE,GAAG;gBACf,UAAU,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC;gBAC5B,QAAQ,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;gBAC9C,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;gBAClD,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC;aAChC,CAAC,CAAC;YACH,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;IAC1E,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,GAAG,GAAG,YAAY,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI;gBACJ,IAAI,EAAE,UAAU;gBAChB,UAAU,EAAE,IAAI;gBAChB,UAAU,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC;gBAC5B,QAAQ,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;gBAC9C,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;aACnD,CAAC,CAAC;YACH,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACpE,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,GAAG,GAAG,SAAS,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI;gBACJ,IAAI,EAAE,OAAO;gBACb,UAAU,EAAE,IAAI;gBAChB,UAAU,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC;gBAC5B,QAAQ,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;gBAC9C,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;aACnD,CAAC,CAAC;YACH,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1D,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,GAAG,GAAG,QAAQ,IAAI,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI;gBACJ,IAAI,EAAE,MAAM;gBACZ,UAAU,EAAE,GAAG;gBACf,UAAU,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC;gBAC5B,QAAQ,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;gBAC9C,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;aACnD,CAAC,CAAC;YACH,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;IACtE,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,GAAG,GAAG,WAAW,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI;gBACJ,IAAI,EAAE,SAAS;gBACf,UAAU,EAAE,IAAI;gBAChB,UAAU,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC;gBAC5B,QAAQ,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;gBAC9C,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;aACnD,CAAC,CAAC;YACH,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,mCAAmC;IACnC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACpE,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,GAAG,GAAG,aAAa,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI;gBACJ,IAAI,EAAE,WAAW;gBACjB,UAAU,EAAE,IAAI;gBAChB,UAAU,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC;gBAC5B,QAAQ,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;gBAC9C,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;aACnD,CAAC,CAAC;YACH,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1D,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,GAAG,GAAG,QAAQ,IAAI,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI;gBACJ,IAAI,EAAE,MAAM;gBACZ,UAAU,EAAE,IAAI;gBAChB,UAAU,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC;gBAC5B,QAAQ,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;gBAC9C,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;aACnD,CAAC,CAAC;YACH,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;IAC5E,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,GAAG,GAAG,WAAW,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI;gBACJ,IAAI,EAAE,SAAS;gBACf,UAAU,EAAE,GAAG;gBACf,UAAU,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC;gBAC5B,QAAQ,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;gBAC9C,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;aACnD,CAAC,CAAC;YACH,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAChE,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,GAAG,GAAG,WAAW,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI;gBACJ,IAAI,EAAE,SAAS;gBACf,UAAU,EAAE,IAAI;gBAChB,UAAU,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC;gBAC5B,QAAQ,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;gBAC9C,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;aACnD,CAAC,CAAC;YACH,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IAErD,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE;QACjC,KAAK,EAAE,QAAQ,CAAC,MAAM;QACtB,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC;KAC9B,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,QAAgB,EAChB,QAA2B;IAE3B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAElC,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;QAEjC,6BAA6B;QAC7B,MAAM,QAAQ,GAAG,MAAO,EAAU;aAC/B,MAAM,EAAE;aACR,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;aACrB,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;aACvC,KAAK,CAAC,CAAC,CAAC,CAAC;QAEZ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAClC,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAE3B,kDAAkD;QAClD,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,iCAAiC;gBACjC,MAAM,QAAQ,GAAG,MAAO,EAAU;qBAC/B,MAAM,EAAE;qBACR,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;qBACrB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,EAC/C,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EACrC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CACtC,CACF;qBACA,KAAK,CAAC,CAAC,CAAC,CAAC;gBAEZ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC1B,gDAAgD;oBAChD,MAAO,EAAU,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;wBAC/C,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,SAAS,EAAE,MAAM,CAAC,SAAS;wBAC3B,WAAW,EAAE,MAAM,CAAC,OAAO;wBAC3B,UAAU,EAAE;4BACV,UAAU,EAAE,MAAM,CAAC,UAAU;4BAC7B,aAAa,EAAE,QAAQ;4BACvB,UAAU,EAAE,MAAM,CAAC,UAAU;yBAC9B;qBACF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE;YACxC,QAAQ;YACR,WAAW,EAAE,QAAQ,CAAC,MAAM;SAC7B,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,QAAgB;IACtD,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;QAEjC,sDAAsD;QACtD,MAAM,WAAW,GAAG,MAAO,EAAU,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAErE,MAAM,QAAQ,GAAsB,EAAE,CAAC;QAEvC,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,MAAM,CAAC,UAAqC,CAAC;YAC3D,IAAI,KAAK,IAAI,KAAK,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;gBAC9C,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,IAAI,EAAE,MAAM,CAAC,IAAkB;oBAC/B,UAAU,EAAG,KAAK,CAAC,UAAqB,IAAI,GAAG;oBAC/C,UAAU,EAAE,CAAC;oBACb,QAAQ,EAAE,CAAC;oBACX,OAAO,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE;oBACjC,UAAU,EAAE,KAAK,CAAC,UAAgC;iBACnD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;QACrD,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,SAAiB,EACjB,IAAiB;IAEjB,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;QAEjC,IAAI,KAAK,GAAS,EAAU,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;QAE5G,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACtD,CAAC;QAED,OAAO,MAAM,KAAK,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;QACtD,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,OAAe,EAAE,KAAa,EAAE,gBAAwB,EAAE;IAChF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,aAAa,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,GAAG,aAAa,CAAC,CAAC;IAC5D,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,IAAI;SACR,IAAI,EAAE;SACN,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;SACpB,WAAW,EAAE;SACb,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,QAA2B;IAC9C,MAAM,MAAM,GAAG,EAAgC,CAAC;IAEhD,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface ExtractedEntities {
|
|
2
|
+
primary: string[];
|
|
3
|
+
secondary: string[];
|
|
4
|
+
queryType: 'factual' | 'relational' | 'temporal';
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Extract entities from a query using Claude
|
|
8
|
+
* NO FALLBACKS - real extraction or throw
|
|
9
|
+
*/
|
|
10
|
+
export declare function extractQueryEntities(query: string, callClaudeFn: (prompt: string, maxTokens: number) => Promise<string>): Promise<ExtractedEntities>;
|
|
11
|
+
/**
|
|
12
|
+
* Score memory relevance based on entity matching
|
|
13
|
+
* Returns boost factor (0-1)
|
|
14
|
+
*/
|
|
15
|
+
export declare function scoreEntityMatch(memoryEntities: string[], queryEntities: string[]): number;
|
|
16
|
+
/**
|
|
17
|
+
* Filter and boost memories by entity relevance
|
|
18
|
+
*/
|
|
19
|
+
export declare function filterByEntities(memories: any[], queryEntities: string[]): Array<{
|
|
20
|
+
memory: any;
|
|
21
|
+
entityBoost: number;
|
|
22
|
+
}>;
|
|
23
|
+
//# sourceMappingURL=entity-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-resolver.d.ts","sourceRoot":"","sources":["../../../core/memory/entity-resolver.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,SAAS,GAAG,YAAY,GAAG,UAAU,CAAC;CAClD;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GACnE,OAAO,CAAC,iBAAiB,CAAC,CAwB5B;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,cAAc,EAAE,MAAM,EAAE,EACxB,aAAa,EAAE,MAAM,EAAE,GACtB,MAAM,CAmBR;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,GAAG,EAAE,EACf,aAAa,EAAE,MAAM,EAAE,GACtB,KAAK,CAAC;IAAE,MAAM,EAAE,GAAG,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAe7C"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract entities from a query using Claude
|
|
3
|
+
* NO FALLBACKS - real extraction or throw
|
|
4
|
+
*/
|
|
5
|
+
export async function extractQueryEntities(query, callClaudeFn) {
|
|
6
|
+
const prompt = `Extract entities from this question. Return ONLY JSON:
|
|
7
|
+
{
|
|
8
|
+
"primary": ["Alice", "project name"],
|
|
9
|
+
"secondary": ["team", "budget"],
|
|
10
|
+
"queryType": "factual"
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
Question: ${query}`;
|
|
14
|
+
const response = await callClaudeFn(prompt, 500);
|
|
15
|
+
const jsonMatch = response.match(/\{[\s\S]*\}/);
|
|
16
|
+
if (!jsonMatch) {
|
|
17
|
+
throw new Error('No JSON in entity extraction');
|
|
18
|
+
}
|
|
19
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
20
|
+
return {
|
|
21
|
+
primary: parsed.primary || [],
|
|
22
|
+
secondary: parsed.secondary || [],
|
|
23
|
+
queryType: parsed.queryType || 'factual',
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Score memory relevance based on entity matching
|
|
28
|
+
* Returns boost factor (0-1)
|
|
29
|
+
*/
|
|
30
|
+
export function scoreEntityMatch(memoryEntities, queryEntities) {
|
|
31
|
+
if (!queryEntities.length || !memoryEntities.length) {
|
|
32
|
+
return 0.5; // Neutral if no entities
|
|
33
|
+
}
|
|
34
|
+
const querySet = new Set(queryEntities.map(e => e.toLowerCase()));
|
|
35
|
+
const memorySet = new Set(memoryEntities.map(e => e.toLowerCase()));
|
|
36
|
+
// Count matches
|
|
37
|
+
let matches = 0;
|
|
38
|
+
for (const entity of querySet) {
|
|
39
|
+
if (memorySet.has(entity)) {
|
|
40
|
+
matches++;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Calculate boost (0-1)
|
|
44
|
+
const matchRatio = matches / querySet.size;
|
|
45
|
+
return 0.5 + (matchRatio * 0.5); // 0.5 to 1.0
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Filter and boost memories by entity relevance
|
|
49
|
+
*/
|
|
50
|
+
export function filterByEntities(memories, queryEntities) {
|
|
51
|
+
if (!queryEntities.length) {
|
|
52
|
+
// No entities to filter by, return all with neutral boost
|
|
53
|
+
return memories.map(m => ({ memory: m, entityBoost: 0.5 }));
|
|
54
|
+
}
|
|
55
|
+
return memories.map(memory => {
|
|
56
|
+
const memoryEntities = memory.metadata?.entities || [];
|
|
57
|
+
const boost = scoreEntityMatch(memoryEntities, queryEntities);
|
|
58
|
+
return {
|
|
59
|
+
memory,
|
|
60
|
+
entityBoost: boost,
|
|
61
|
+
};
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=entity-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-resolver.js","sourceRoot":"","sources":["../../../core/memory/entity-resolver.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,KAAa,EACb,YAAoE;IAEpE,MAAM,MAAM,GAAG;;;;;;;YAOL,KAAK,EAAE,CAAC;IAElB,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEjD,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAChD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAsB,CAAC;IAE7D,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;QAC7B,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE;QACjC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,SAAS;KACzC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,cAAwB,EACxB,aAAuB;IAEvB,IAAI,CAAC,aAAa,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;QACpD,OAAO,GAAG,CAAC,CAAC,yBAAyB;IACvC,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAEpE,gBAAgB;IAChB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,IAAI,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC3C,OAAO,GAAG,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC,aAAa;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAe,EACf,aAAuB;IAEvB,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;QAC1B,0DAA0D;QAC1D,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;QAC3B,MAAM,cAAc,GAAI,MAAM,CAAC,QAAQ,EAAE,QAAqB,IAAI,EAAE,CAAC;QACrE,MAAM,KAAK,GAAG,gBAAgB,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;QAE9D,OAAO;YACL,MAAM;YACN,WAAW,EAAE,KAAK;SACnB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { RememberInput } from './memories.js';
|
|
2
|
+
export interface ExtractedFact {
|
|
3
|
+
content: string;
|
|
4
|
+
confidence: number;
|
|
5
|
+
entities: string[];
|
|
6
|
+
relation?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface FactExtractionResult {
|
|
9
|
+
facts: ExtractedFact[];
|
|
10
|
+
summary: string;
|
|
11
|
+
entities: string[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Extract facts from conversation text using Claude API
|
|
15
|
+
*
|
|
16
|
+
* This function MUST return valid facts or throw an error.
|
|
17
|
+
* NO FALLBACKS - we need real extraction to reach 90% accuracy.
|
|
18
|
+
*/
|
|
19
|
+
export declare function extractFacts(text: string, callClaude: (prompt: string, maxTokens: number) => Promise<string>): Promise<FactExtractionResult>;
|
|
20
|
+
/**
|
|
21
|
+
* Convert extracted facts to memory inputs
|
|
22
|
+
*/
|
|
23
|
+
export declare function factsToMemoryInputs(sourceMemory: RememberInput, extraction: FactExtractionResult, sourceId: string): RememberInput[];
|
|
24
|
+
//# sourceMappingURL=fact-extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fact-extractor.d.ts","sourceRoot":"","sources":["../../../core/memory/fact-extractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GACjE,OAAO,CAAC,oBAAoB,CAAC,CAuE/B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,aAAa,EAC3B,UAAU,EAAE,oBAAoB,EAChC,QAAQ,EAAE,MAAM,GACf,aAAa,EAAE,CAejB"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract facts from conversation text using Claude API
|
|
3
|
+
*
|
|
4
|
+
* This function MUST return valid facts or throw an error.
|
|
5
|
+
* NO FALLBACKS - we need real extraction to reach 90% accuracy.
|
|
6
|
+
*/
|
|
7
|
+
export async function extractFacts(text, callClaude) {
|
|
8
|
+
if (!text || text.length < 50) {
|
|
9
|
+
// Too short for meaningful extraction - return as single fact
|
|
10
|
+
return {
|
|
11
|
+
facts: [{ content: text.trim(), confidence: 1.0, entities: [] }],
|
|
12
|
+
summary: text.trim(),
|
|
13
|
+
entities: []
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
const prompt = `Extract atomic facts from this conversation.
|
|
17
|
+
|
|
18
|
+
Requirements:
|
|
19
|
+
- Extract specific, verifiable facts (names, dates, numbers, relationships)
|
|
20
|
+
- Each fact should be a standalone statement
|
|
21
|
+
- Identify entities (people, organizations, projects, locations)
|
|
22
|
+
- Note temporal information and relationships
|
|
23
|
+
|
|
24
|
+
Return ONLY valid JSON in this exact format:
|
|
25
|
+
{"facts":[{"content":"fact statement","confidence":0.95,"entities":["Name"],"relation":"optional"}],"summary":"brief summary","entities":["all","entities"]}
|
|
26
|
+
|
|
27
|
+
Text to analyze:
|
|
28
|
+
${text.substring(0, 4000)}`;
|
|
29
|
+
const response = await callClaude(prompt, 2000);
|
|
30
|
+
// Extract JSON - look for the first { and last }
|
|
31
|
+
const startIdx = response.indexOf('{');
|
|
32
|
+
const endIdx = response.lastIndexOf('}');
|
|
33
|
+
if (startIdx === -1 || endIdx === -1 || startIdx >= endIdx) {
|
|
34
|
+
throw new Error(`Fact extraction failed: No valid JSON found in response. Response: ${response.substring(0, 200)}`);
|
|
35
|
+
}
|
|
36
|
+
const jsonStr = response.substring(startIdx, endIdx + 1);
|
|
37
|
+
let parsed;
|
|
38
|
+
try {
|
|
39
|
+
parsed = JSON.parse(jsonStr);
|
|
40
|
+
}
|
|
41
|
+
catch (parseError) {
|
|
42
|
+
throw new Error(`Fact extraction failed: JSON parse error. JSON: ${jsonStr.substring(0, 200)}`);
|
|
43
|
+
}
|
|
44
|
+
// Validate facts array exists and has content
|
|
45
|
+
if (!parsed.facts || !Array.isArray(parsed.facts)) {
|
|
46
|
+
throw new Error(`Fact extraction failed: Missing 'facts' array in response. Keys: ${Object.keys(parsed).join(', ')}`);
|
|
47
|
+
}
|
|
48
|
+
// Filter and clean facts
|
|
49
|
+
const validFacts = parsed.facts
|
|
50
|
+
.filter((f) => f && typeof f.content === 'string' && f.content.trim().length > 10)
|
|
51
|
+
.map((f) => ({
|
|
52
|
+
content: f.content.trim(),
|
|
53
|
+
confidence: Math.max(0, Math.min(1, typeof f.confidence === 'number' ? f.confidence : 0.8)),
|
|
54
|
+
entities: Array.isArray(f.entities) ? f.entities.filter((e) => typeof e === 'string') : [],
|
|
55
|
+
relation: typeof f.relation === 'string' ? f.relation : undefined
|
|
56
|
+
}));
|
|
57
|
+
if (validFacts.length === 0) {
|
|
58
|
+
throw new Error(`Fact extraction failed: No valid facts after filtering. Original count: ${parsed.facts.length}`);
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
facts: validFacts,
|
|
62
|
+
summary: typeof parsed.summary === 'string' && parsed.summary.trim()
|
|
63
|
+
? parsed.summary.trim()
|
|
64
|
+
: text.substring(0, 200),
|
|
65
|
+
entities: Array.isArray(parsed.entities)
|
|
66
|
+
? parsed.entities.filter((e) => typeof e === 'string')
|
|
67
|
+
: []
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Convert extracted facts to memory inputs
|
|
72
|
+
*/
|
|
73
|
+
export function factsToMemoryInputs(sourceMemory, extraction, sourceId) {
|
|
74
|
+
return extraction.facts.map((fact, index) => ({
|
|
75
|
+
content: fact.content,
|
|
76
|
+
type: 'fact',
|
|
77
|
+
metadata: {
|
|
78
|
+
sourceMemoryId: sourceId,
|
|
79
|
+
extractedAt: new Date().toISOString(),
|
|
80
|
+
entities: fact.entities,
|
|
81
|
+
relation: fact.relation,
|
|
82
|
+
confidence: Math.floor(fact.confidence * 100),
|
|
83
|
+
factIndex: index
|
|
84
|
+
},
|
|
85
|
+
tags: [...(sourceMemory.tags || []), 'extracted-fact', ...fact.entities],
|
|
86
|
+
project: sourceMemory.project
|
|
87
|
+
}));
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=fact-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fact-extractor.js","sourceRoot":"","sources":["../../../core/memory/fact-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { HybridScorerOptions } from './hybrid-scorer.js';
|
|
2
|
+
import { SearchInput, MemoryRecord } from './memories.js';
|
|
3
|
+
export interface HybridSearchOptions extends SearchInput {
|
|
4
|
+
candidateLimit?: number;
|
|
5
|
+
resultLimit?: number;
|
|
6
|
+
hybridOptions?: HybridScorerOptions;
|
|
7
|
+
queryEntities?: string[];
|
|
8
|
+
}
|
|
9
|
+
export interface HybridSearchResult extends MemoryRecord {
|
|
10
|
+
hybridScore: number;
|
|
11
|
+
semanticScore: number;
|
|
12
|
+
recencyScore: number;
|
|
13
|
+
coactivationScore: number;
|
|
14
|
+
importanceScore: number;
|
|
15
|
+
entityBoost: number;
|
|
16
|
+
rank: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Hybrid search with multi-factor re-ranking + entity filtering
|
|
20
|
+
*
|
|
21
|
+
* Algorithm:
|
|
22
|
+
* 1. Fetch N candidates using vector similarity
|
|
23
|
+
* 2. Filter/boost by entity relevance (Phase 3)
|
|
24
|
+
* 3. Re-rank using hybrid scoring (semantic + recency + coactivation + importance)
|
|
25
|
+
* 4. Return top M results
|
|
26
|
+
*
|
|
27
|
+
* This provides better relevance than pure vector search
|
|
28
|
+
*/
|
|
29
|
+
export declare function hybridSearch(options: HybridSearchOptions): Promise<HybridSearchResult[]>;
|
|
30
|
+
//# sourceMappingURL=hybrid-retrieval.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hybrid-retrieval.d.ts","sourceRoot":"","sources":["../../../core/memory/hybrid-retrieval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEtE,OAAO,EAAkB,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG1E,MAAM,WAAW,mBAAoB,SAAQ,WAAW;IACtD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACtD,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA0D/B"}
|