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,297 @@
|
|
|
1
|
+
import { config } from '../config.js';
|
|
2
|
+
import { getQMDClient } from './embeddings/qmd-client.js';
|
|
3
|
+
import { logger } from './logger.js';
|
|
4
|
+
// Simple in-memory cache for embeddings (LRU with 1000 entries)
|
|
5
|
+
const embeddingCache = new Map();
|
|
6
|
+
const MAX_CACHE_SIZE = 1000;
|
|
7
|
+
function getCacheKey(input, provider) {
|
|
8
|
+
// Simple hash of input + provider
|
|
9
|
+
let hash = 0;
|
|
10
|
+
const str = input + provider;
|
|
11
|
+
for (let i = 0; i < str.length; i++) {
|
|
12
|
+
const char = str.charCodeAt(i);
|
|
13
|
+
hash = ((hash << 5) - hash) + char;
|
|
14
|
+
hash = hash & hash; // Convert to 32bit integer
|
|
15
|
+
}
|
|
16
|
+
return hash.toString();
|
|
17
|
+
}
|
|
18
|
+
function getCachedEmbedding(key) {
|
|
19
|
+
return embeddingCache.get(key);
|
|
20
|
+
}
|
|
21
|
+
function setCachedEmbedding(key, embedding) {
|
|
22
|
+
if (embeddingCache.size >= MAX_CACHE_SIZE) {
|
|
23
|
+
// Remove oldest entry (first one)
|
|
24
|
+
const firstKey = embeddingCache.keys().next().value;
|
|
25
|
+
if (firstKey) {
|
|
26
|
+
embeddingCache.delete(firstKey);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
embeddingCache.set(key, embedding);
|
|
30
|
+
}
|
|
31
|
+
export async function getEmbedding(input) {
|
|
32
|
+
if (!input || typeof input !== 'string') {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
const provider = config.embeddingsProvider;
|
|
36
|
+
const cacheKey = getCacheKey(input, provider);
|
|
37
|
+
// Check cache first
|
|
38
|
+
const cached = getCachedEmbedding(cacheKey);
|
|
39
|
+
if (cached) {
|
|
40
|
+
return cached;
|
|
41
|
+
}
|
|
42
|
+
let result = null;
|
|
43
|
+
if (provider === 'none') {
|
|
44
|
+
result = null;
|
|
45
|
+
}
|
|
46
|
+
else if (provider === 'qmd') {
|
|
47
|
+
result = await getQMDEmbedding(input);
|
|
48
|
+
// Fallback if QMD fails (unless qmd-only mode)
|
|
49
|
+
if (!result && config.qmdFallbackMode !== 'qmd-only') {
|
|
50
|
+
result = getLocalEmbedding(input);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
else if (provider === 'hybrid') {
|
|
54
|
+
// Hybrid mode: Try QMD first, then cloud providers, then local
|
|
55
|
+
if (config.qmdEnabled) {
|
|
56
|
+
result = await getQMDEmbedding(input);
|
|
57
|
+
}
|
|
58
|
+
if (!result && config.qmdFallbackMode !== 'qmd-only') {
|
|
59
|
+
result = await getOllamaEmbedding(input);
|
|
60
|
+
}
|
|
61
|
+
if (!result && config.qmdFallbackMode !== 'qmd-only' && config.qmdFallbackMode !== 'local-only') {
|
|
62
|
+
result = await getOpenAiEmbedding(input);
|
|
63
|
+
}
|
|
64
|
+
if (!result) {
|
|
65
|
+
result = getLocalEmbedding(input);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else if (provider === 'openai') {
|
|
69
|
+
result = await getOpenAiEmbedding(input);
|
|
70
|
+
}
|
|
71
|
+
else if (provider === 'ollama') {
|
|
72
|
+
result = await getOllamaEmbedding(input);
|
|
73
|
+
}
|
|
74
|
+
else if (provider === 'local') {
|
|
75
|
+
result = getLocalEmbedding(input);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
// Auto mode: try OpenAI first, then fallback
|
|
79
|
+
result = await getOpenAiEmbedding(input);
|
|
80
|
+
if (!result) {
|
|
81
|
+
result = await getOllamaEmbedding(input);
|
|
82
|
+
}
|
|
83
|
+
if (!result) {
|
|
84
|
+
result = getLocalEmbedding(input);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Cache the result if valid
|
|
88
|
+
if (result) {
|
|
89
|
+
setCachedEmbedding(cacheKey, result);
|
|
90
|
+
}
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Get embeddings for multiple inputs in parallel batches
|
|
95
|
+
* Processes inputs in batches to respect rate limits while parallelizing
|
|
96
|
+
*/
|
|
97
|
+
export async function getBatchEmbeddings(inputs, batchSize = 20) {
|
|
98
|
+
if (inputs.length === 0)
|
|
99
|
+
return [];
|
|
100
|
+
const results = new Array(inputs.length).fill(null);
|
|
101
|
+
const provider = config.embeddingsProvider;
|
|
102
|
+
// Check cache for all inputs first
|
|
103
|
+
const uncachedIndices = [];
|
|
104
|
+
const uncachedInputs = [];
|
|
105
|
+
for (let i = 0; i < inputs.length; i++) {
|
|
106
|
+
const cacheKey = getCacheKey(inputs[i], provider);
|
|
107
|
+
const cached = getCachedEmbedding(cacheKey);
|
|
108
|
+
if (cached) {
|
|
109
|
+
results[i] = cached;
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
uncachedIndices.push(i);
|
|
113
|
+
uncachedInputs.push(inputs[i]);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Process only uncached inputs in batches
|
|
117
|
+
for (let i = 0; i < uncachedInputs.length; i += batchSize) {
|
|
118
|
+
const batchEnd = Math.min(i + batchSize, uncachedInputs.length);
|
|
119
|
+
const batch = uncachedInputs.slice(i, batchEnd);
|
|
120
|
+
const indices = uncachedIndices.slice(i, batchEnd);
|
|
121
|
+
// Parallelize embeddings within batch using Promise.all
|
|
122
|
+
const batchResults = await Promise.all(batch.map((input) => getEmbedding(input)));
|
|
123
|
+
// Store results in correct positions and cache
|
|
124
|
+
for (let j = 0; j < batchResults.length; j++) {
|
|
125
|
+
results[indices[j]] = batchResults[j];
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return results;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Clear the embedding cache
|
|
132
|
+
*/
|
|
133
|
+
export function clearEmbeddingCache() {
|
|
134
|
+
embeddingCache.clear();
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Get embedding cache statistics
|
|
138
|
+
*/
|
|
139
|
+
export function getEmbeddingCacheStats() {
|
|
140
|
+
return {
|
|
141
|
+
size: embeddingCache.size,
|
|
142
|
+
maxSize: MAX_CACHE_SIZE,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Local TF-IDF embedding using character n-grams and word hashing
|
|
147
|
+
* Creates a 768-dimensional vector (same size as OpenAI text-embedding-3-small)
|
|
148
|
+
* Fast, no API calls, works offline
|
|
149
|
+
*/
|
|
150
|
+
function getLocalEmbedding(input) {
|
|
151
|
+
if (!input || typeof input !== 'string') {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
// Normalize text
|
|
155
|
+
const text = input.toLowerCase()
|
|
156
|
+
.replace(/[^a-z0-9\s]/g, ' ')
|
|
157
|
+
.replace(/\s+/g, ' ')
|
|
158
|
+
.trim();
|
|
159
|
+
if (text.length === 0) {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
// Embedding dimensions
|
|
163
|
+
const dimensions = 768;
|
|
164
|
+
const vector = new Array(dimensions).fill(0);
|
|
165
|
+
// Character n-grams (3-5 grams for semantic similarity)
|
|
166
|
+
const ngrams = [3, 4, 5];
|
|
167
|
+
for (const n of ngrams) {
|
|
168
|
+
for (let i = 0; i <= text.length - n; i++) {
|
|
169
|
+
const gram = text.substring(i, i + n);
|
|
170
|
+
const hash = djb2Hash(gram);
|
|
171
|
+
const idx = Math.abs(hash) % dimensions;
|
|
172
|
+
vector[idx] += 1;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Word-level hashing for semantic capture
|
|
176
|
+
const words = text.split(/\s+/).filter(w => w.length > 2);
|
|
177
|
+
for (const word of words) {
|
|
178
|
+
const hash = djb2Hash(word);
|
|
179
|
+
const idx = Math.abs(hash) % dimensions;
|
|
180
|
+
vector[idx] += 2; // Words weighted higher than n-grams
|
|
181
|
+
// Bigrams
|
|
182
|
+
if (words.length > 1) {
|
|
183
|
+
const idx2 = words.indexOf(word);
|
|
184
|
+
if (idx2 < words.length - 1) {
|
|
185
|
+
const bigram = `${word}_${words[idx2 + 1]}`;
|
|
186
|
+
const bigramHash = djb2Hash(bigram);
|
|
187
|
+
const bigramIdx = Math.abs(bigramHash) % dimensions;
|
|
188
|
+
vector[bigramIdx] += 3; // Bigrams weighted highest
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// Apply TF-IDF-like scaling: square root to dampen high frequencies
|
|
193
|
+
for (let i = 0; i < dimensions; i++) {
|
|
194
|
+
if (vector[i] > 0) {
|
|
195
|
+
vector[i] = Math.sqrt(vector[i]);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// L2 normalize
|
|
199
|
+
const norm = Math.sqrt(vector.reduce((sum, val) => sum + val * val, 0));
|
|
200
|
+
if (norm > 0) {
|
|
201
|
+
for (let i = 0; i < dimensions; i++) {
|
|
202
|
+
vector[i] /= norm;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return vector;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Get embedding via QMD
|
|
209
|
+
* Note: QMD doesn't expose direct embedding generation via MCP.
|
|
210
|
+
* This function returns null to trigger fallback to other providers.
|
|
211
|
+
* The main QMD integration value is through hybrid search (qmd_query).
|
|
212
|
+
*/
|
|
213
|
+
async function getQMDEmbedding(input) {
|
|
214
|
+
if (!config.qmdEnabled) {
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
try {
|
|
218
|
+
const client = await getQMDClient();
|
|
219
|
+
const available = await client.isAvailable();
|
|
220
|
+
if (!available) {
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
// QMD doesn't expose direct embedding generation via MCP
|
|
224
|
+
// The search tools use embeddings internally but don't return them
|
|
225
|
+
//
|
|
226
|
+
// For embedding generation, we rely on fallback providers
|
|
227
|
+
// QMD's main value is through the qmd_search, qmd_vsearch, qmd_query tools
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
logger.debug(`QMD embedding unavailable: ${error}`);
|
|
232
|
+
return null;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* DJB2 hash function - fast, good distribution
|
|
237
|
+
*/
|
|
238
|
+
function djb2Hash(str) {
|
|
239
|
+
let hash = 5381;
|
|
240
|
+
for (let i = 0; i < str.length; i++) {
|
|
241
|
+
hash = ((hash << 5) + hash) + str.charCodeAt(i);
|
|
242
|
+
}
|
|
243
|
+
return hash;
|
|
244
|
+
}
|
|
245
|
+
async function getOpenAiEmbedding(input) {
|
|
246
|
+
if (!config.openAiApiKey)
|
|
247
|
+
return null;
|
|
248
|
+
try {
|
|
249
|
+
const response = await fetch(config.openAiApiUrl, {
|
|
250
|
+
method: 'POST',
|
|
251
|
+
headers: {
|
|
252
|
+
'Content-Type': 'application/json',
|
|
253
|
+
Authorization: `Bearer ${config.openAiApiKey}`,
|
|
254
|
+
},
|
|
255
|
+
body: JSON.stringify({
|
|
256
|
+
model: config.openAiEmbeddingModel,
|
|
257
|
+
input,
|
|
258
|
+
}),
|
|
259
|
+
});
|
|
260
|
+
if (!response.ok) {
|
|
261
|
+
const message = await response.text();
|
|
262
|
+
console.warn(`OpenAI embeddings failed: ${response.status} ${message}`);
|
|
263
|
+
return null; // Return null to allow fallback
|
|
264
|
+
}
|
|
265
|
+
const payload = await response.json();
|
|
266
|
+
const embedding = payload.data?.[0]?.embedding;
|
|
267
|
+
return embedding ?? null;
|
|
268
|
+
}
|
|
269
|
+
catch (error) {
|
|
270
|
+
console.warn('OpenAI embeddings error:', error);
|
|
271
|
+
return null; // Return null to allow fallback
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
async function getOllamaEmbedding(input) {
|
|
275
|
+
try {
|
|
276
|
+
const response = await fetch(`${config.ollamaUrl}/api/embeddings`, {
|
|
277
|
+
method: 'POST',
|
|
278
|
+
headers: { 'Content-Type': 'application/json' },
|
|
279
|
+
body: JSON.stringify({
|
|
280
|
+
model: config.ollamaEmbeddingModel,
|
|
281
|
+
prompt: input,
|
|
282
|
+
}),
|
|
283
|
+
});
|
|
284
|
+
if (!response.ok) {
|
|
285
|
+
const message = await response.text();
|
|
286
|
+
console.warn(`Ollama embeddings failed: ${response.status} ${message}`);
|
|
287
|
+
return null; // Return null to allow fallback
|
|
288
|
+
}
|
|
289
|
+
const payload = await response.json();
|
|
290
|
+
return payload.embedding ?? null;
|
|
291
|
+
}
|
|
292
|
+
catch (error) {
|
|
293
|
+
console.warn('Ollama embeddings error:', error);
|
|
294
|
+
return null; // Return null to allow fallback
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=embeddings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../core/embeddings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAIrC,gEAAgE;AAChE,MAAM,cAAc,GAAG,IAAI,GAAG,EAAoB,CAAC;AACnD,MAAM,cAAc,GAAG,IAAI,CAAC;AAE5B,SAAS,WAAW,CAAC,KAAa,EAAE,QAAgB;IAClD,kCAAkC;IAClC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,GAAG,GAAG,KAAK,GAAG,QAAQ,CAAC;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;QACnC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,2BAA2B;IACjD,CAAC;IACD,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;AACzB,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW;IACrC,OAAO,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW,EAAE,SAAmB;IAC1D,IAAI,cAAc,CAAC,IAAI,IAAI,cAAc,EAAE,CAAC;QAC1C,kCAAkC;QAClC,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QACpD,IAAI,QAAQ,EAAE,CAAC;YACb,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IACD,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAa;IAC9C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,kBAAkB,CAAC;IAC3C,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAE9C,oBAAoB;IACpB,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,MAAM,GAAoB,IAAI,CAAC;IAEnC,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,MAAM,GAAG,IAAI,CAAC;IAChB,CAAC;SAAM,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;QAC9B,MAAM,GAAG,MAAM,eAAe,CAAC,KAAK,CAAC,CAAC;QACtC,+CAA+C;QAC/C,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,eAAe,KAAK,UAAU,EAAE,CAAC;YACrD,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;SAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,+DAA+D;QAC/D,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,MAAM,GAAG,MAAM,eAAe,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,eAAe,KAAK,UAAU,EAAE,CAAC;YACrD,MAAM,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,eAAe,KAAK,UAAU,IAAI,MAAM,CAAC,eAAe,KAAK,YAAY,EAAE,CAAC;YAChG,MAAM,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;SAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;SAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;SAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,6CAA6C;QAC7C,MAAM,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,IAAI,MAAM,EAAE,CAAC;QACX,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAgB,EAChB,YAAoB,EAAE;IAEtB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEnC,MAAM,OAAO,GAA2B,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5E,MAAM,QAAQ,GAAG,MAAM,CAAC,kBAAkB,CAAC;IAE3C,mCAAmC;IACnC,MAAM,eAAe,GAAa,EAAE,CAAC;IACrC,MAAM,cAAc,GAAa,EAAE,CAAC;IAEpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACxB,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAEnD,wDAAwD;QACxD,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CACpC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAC1C,CAAC;QAEF,+CAA+C;QAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,cAAc,CAAC,KAAK,EAAE,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO;QACL,IAAI,EAAE,cAAc,CAAC,IAAI;QACzB,OAAO,EAAE,cAAc;KACxB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,KAAa;IACtC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iBAAiB;IACjB,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,EAAE;SAC7B,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC;SAC5B,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;IAEV,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,uBAAuB;IACvB,MAAM,UAAU,GAAG,GAAG,CAAC;IACvB,MAAM,MAAM,GAAa,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEvD,wDAAwD;IACxD,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;YACxC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;QACxC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,qCAAqC;QAEvD,UAAU;QACV,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,MAAM,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC5C,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACpC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC;gBACpD,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,2BAA2B;YACrD,CAAC;QACH,CAAC;IACH,CAAC;IAED,oEAAoE;IACpE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,eAAe;IACf,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IACxE,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,eAAe,CAAC,KAAa;IAC1C,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QAE7C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QAED,yDAAyD;QACzD,mEAAmE;QACnE,EAAE;QACF,0DAA0D;QAC1D,2EAA2E;QAC3E,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,8BAA8B,KAAK,EAAE,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,QAAQ,CAAC,GAAW;IAC3B,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,KAAa;IAC7C,IAAI,CAAC,MAAM,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IAEtC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE;YAChD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,MAAM,CAAC,YAAY,EAAE;aAC/C;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,MAAM,CAAC,oBAAoB;gBAClC,KAAK;aACN,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,6BAA6B,QAAQ,CAAC,MAAM,IAAI,OAAO,EAAE,CAAC,CAAC;YACxE,OAAO,IAAI,CAAC,CAAC,gCAAgC;QAC/C,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA+C,CAAC;QACnF,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC;QAC/C,OAAO,SAAS,IAAI,IAAI,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,CAAC,gCAAgC;IAC/C,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,KAAa;IAC7C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,SAAS,iBAAiB,EAAE;YACjE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,MAAM,CAAC,oBAAoB;gBAClC,MAAM,EAAE,KAAK;aACd,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,6BAA6B,QAAQ,CAAC,MAAM,IAAI,OAAO,EAAE,CAAC,CAAC;YACxE,OAAO,IAAI,CAAC,CAAC,gCAAgC;QAC/C,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA8B,CAAC;QAClE,OAAO,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,CAAC,gCAAgC;IAC/C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Governance
|
|
3
|
+
* Implements protection, pinning, and immutability rules
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Mark a memory as protected (cannot be evicted)
|
|
7
|
+
*/
|
|
8
|
+
export declare function protectMemory(memoryId: string, reason: string): Promise<void>;
|
|
9
|
+
/**
|
|
10
|
+
* Pin a memory for automatic injection into context
|
|
11
|
+
*/
|
|
12
|
+
export declare function pinMemory(memoryId: string): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Unpin a memory
|
|
15
|
+
*/
|
|
16
|
+
export declare function unpinMemory(memoryId: string): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Get all pinned memories for auto-injection into context
|
|
19
|
+
*/
|
|
20
|
+
export declare function getPinnedMemories(): Promise<any[]>;
|
|
21
|
+
//# sourceMappingURL=governance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"governance.d.ts","sourceRoot":"","sources":["../../core/governance.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH;;GAEG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQnF;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ/D;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKjE;AAcD;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAgBxD"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Governance
|
|
3
|
+
* Implements protection, pinning, and immutability rules
|
|
4
|
+
*/
|
|
5
|
+
import { eq } from 'drizzle-orm';
|
|
6
|
+
import { getDb } from '../db/index.js';
|
|
7
|
+
import { getSchema } from '../db/schema.js';
|
|
8
|
+
import { config } from '../config.js';
|
|
9
|
+
import { performMemoryOperation } from './utils/memory-operations.js';
|
|
10
|
+
import { logger } from './logger.js';
|
|
11
|
+
/**
|
|
12
|
+
* Mark a memory as protected (cannot be evicted)
|
|
13
|
+
*/
|
|
14
|
+
export async function protectMemory(memoryId, reason) {
|
|
15
|
+
await performMemoryOperation(memoryId, {
|
|
16
|
+
name: 'protecting memory',
|
|
17
|
+
updates: {
|
|
18
|
+
isProtected: true,
|
|
19
|
+
metadata: { protectionReason: reason, protectedAt: new Date().toISOString() },
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Pin a memory for automatic injection into context
|
|
25
|
+
*/
|
|
26
|
+
export async function pinMemory(memoryId) {
|
|
27
|
+
await performMemoryOperation(memoryId, {
|
|
28
|
+
name: 'pinning memory',
|
|
29
|
+
updates: {
|
|
30
|
+
isPinned: true,
|
|
31
|
+
metadata: { pinnedAt: new Date().toISOString() },
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Unpin a memory
|
|
37
|
+
*/
|
|
38
|
+
export async function unpinMemory(memoryId) {
|
|
39
|
+
await performMemoryOperation(memoryId, {
|
|
40
|
+
name: 'unpinning memory',
|
|
41
|
+
updates: { isPinned: false },
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get all pinned memories for auto-injection into context
|
|
46
|
+
*/
|
|
47
|
+
export async function getPinnedMemories() {
|
|
48
|
+
if (!config.governanceEnabled)
|
|
49
|
+
return [];
|
|
50
|
+
try {
|
|
51
|
+
const db = await getDb();
|
|
52
|
+
const schema = await getSchema();
|
|
53
|
+
return await db
|
|
54
|
+
.select()
|
|
55
|
+
.from(schema.memories)
|
|
56
|
+
.where(eq(schema.memories.isPinned, true))
|
|
57
|
+
.limit(50);
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
logger.error('Error retrieving pinned memories', error);
|
|
61
|
+
return [];
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=governance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"governance.js","sourceRoot":"","sources":["../../core/governance.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB,EAAE,MAAc;IAClE,MAAM,sBAAsB,CAAC,QAAQ,EAAE;QACrC,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE;YACP,WAAW,EAAE,IAAI;YACjB,QAAQ,EAAE,EAAE,gBAAgB,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;SAC9E;KACF,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB;IAC9C,MAAM,sBAAsB,CAAC,QAAQ,EAAE;QACrC,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE;YACP,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;SACjD;KACF,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB;IAChD,MAAM,sBAAsB,CAAC,QAAQ,EAAE;QACrC,IAAI,EAAE,kBAAkB;QACxB,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;KAC7B,CAAC,CAAC;AACL,CAAC;AAcD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,IAAI,CAAC,MAAM,CAAC,iBAAiB;QAAE,OAAO,EAAE,CAAC;IAEzC,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;QAEjC,OAAO,MAAO,EAAU;aACrB,MAAM,EAAE;aACR,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;aACrB,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;aACzC,KAAK,CAAC,EAAE,CAAC,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;QACxD,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './cache.js';
|
|
2
|
+
export * from './context.js';
|
|
3
|
+
export * from './database.js';
|
|
4
|
+
export * from './embeddings.js';
|
|
5
|
+
export * from './observations.js';
|
|
6
|
+
export * from './privacy.js';
|
|
7
|
+
export * from './projects.js';
|
|
8
|
+
export * from './secret-detector.js';
|
|
9
|
+
export * from './worker.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../core/index.ts"],"names":[],"mappings":"AACA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAGhC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAE9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Shared services - Core utilities and services
|
|
2
|
+
export * from './cache.js';
|
|
3
|
+
export * from './context.js';
|
|
4
|
+
export * from './database.js';
|
|
5
|
+
export * from './embeddings.js';
|
|
6
|
+
// Note: local-embeddings exports duplicate of embeddings, import directly when needed
|
|
7
|
+
// export * from './local-embeddings.js';
|
|
8
|
+
export * from './observations.js';
|
|
9
|
+
export * from './privacy.js';
|
|
10
|
+
export * from './projects.js';
|
|
11
|
+
// Note: redis exports duplicates of cache, import directly when needed
|
|
12
|
+
export * from './secret-detector.js';
|
|
13
|
+
export * from './worker.js';
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../core/index.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,sFAAsF;AACtF,yCAAyC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,uEAAuE;AACvE,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Lifecycle Management
|
|
3
|
+
* Implements sector-based decay, tier classification, and eviction policies
|
|
4
|
+
*/
|
|
5
|
+
export interface LifecycleStats {
|
|
6
|
+
decayed: number;
|
|
7
|
+
evicted: number;
|
|
8
|
+
promoted: number;
|
|
9
|
+
tierChanges: {
|
|
10
|
+
hot: number;
|
|
11
|
+
warm: number;
|
|
12
|
+
cold: number;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Run full lifecycle maintenance on all memories
|
|
17
|
+
*/
|
|
18
|
+
export declare function runLifecycleMaintenance(projectId?: string): Promise<LifecycleStats>;
|
|
19
|
+
//# sourceMappingURL=lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../core/lifecycle.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAsBH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1D;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAqBzF"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Lifecycle Management
|
|
3
|
+
* Implements sector-based decay, tier classification, and eviction policies
|
|
4
|
+
*/
|
|
5
|
+
import { and, eq, lt, inArray } from 'drizzle-orm';
|
|
6
|
+
import { getDb } from '../db/index.js';
|
|
7
|
+
import { getSchema } from '../db/schema.js';
|
|
8
|
+
import { config } from '../config.js';
|
|
9
|
+
import { logger } from './logger.js';
|
|
10
|
+
const SECTOR_DECAY_RATES = {
|
|
11
|
+
episodic: 30,
|
|
12
|
+
semantic: 90,
|
|
13
|
+
procedural: 180,
|
|
14
|
+
autobiographical: 365,
|
|
15
|
+
working: 7,
|
|
16
|
+
};
|
|
17
|
+
const TIER_THRESHOLDS = {
|
|
18
|
+
hot: { recency: 7, coactivation: 10, salience: 70 },
|
|
19
|
+
warm: { recency: 30, coactivation: 5, salience: 50 },
|
|
20
|
+
cold: { recency: Infinity, coactivation: 0, salience: 0 },
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Run full lifecycle maintenance on all memories
|
|
24
|
+
*/
|
|
25
|
+
export async function runLifecycleMaintenance(projectId) {
|
|
26
|
+
if (!config.lifecycleEnabled) {
|
|
27
|
+
return { decayed: 0, evicted: 0, promoted: 0, tierChanges: { hot: 0, warm: 0, cold: 0 } };
|
|
28
|
+
}
|
|
29
|
+
const stats = {
|
|
30
|
+
decayed: 0,
|
|
31
|
+
evicted: 0,
|
|
32
|
+
promoted: 0,
|
|
33
|
+
tierChanges: { hot: 0, warm: 0, cold: 0 },
|
|
34
|
+
};
|
|
35
|
+
try {
|
|
36
|
+
await applyDecay(projectId, stats);
|
|
37
|
+
await updateTiers(projectId, stats);
|
|
38
|
+
await evictOldMemories(projectId, stats);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
logger.error('Lifecycle maintenance error', error);
|
|
42
|
+
}
|
|
43
|
+
return stats;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Apply decay to memories based on sector
|
|
47
|
+
*/
|
|
48
|
+
async function applyDecay(projectId, stats) {
|
|
49
|
+
try {
|
|
50
|
+
const db = await getDb();
|
|
51
|
+
const schema = await getSchema();
|
|
52
|
+
const now = new Date();
|
|
53
|
+
// For each sector, apply decay
|
|
54
|
+
for (const [sector, decayDays] of Object.entries(SECTOR_DECAY_RATES)) {
|
|
55
|
+
const decayThreshold = new Date(now.getTime() - decayDays * 24 * 60 * 60 * 1000);
|
|
56
|
+
// Build where clause
|
|
57
|
+
let where;
|
|
58
|
+
if (projectId) {
|
|
59
|
+
where = and(eq(schema.memories.sector, sector), eq(schema.memories.projectId, projectId), lt(schema.memories.lastDecayAt, decayThreshold), eq(schema.memories.isProtected, false));
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
where = and(eq(schema.memories.sector, sector), lt(schema.memories.lastDecayAt, decayThreshold), eq(schema.memories.isProtected, false));
|
|
63
|
+
}
|
|
64
|
+
// Decay: reduce relevance score by 10%
|
|
65
|
+
const result = await db.update(schema.memories)
|
|
66
|
+
.set({
|
|
67
|
+
relevanceScore: Math.max(0, schema.memories.relevanceScore * 0.9),
|
|
68
|
+
lastDecayAt: now,
|
|
69
|
+
})
|
|
70
|
+
.where(where);
|
|
71
|
+
const rowCount = result?.rowCount || 0;
|
|
72
|
+
stats.decayed += rowCount;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
logger.error('Error applying decay', error);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Update memory tiers based on recency, coactivation, and salience
|
|
81
|
+
* OPTIMIZED: Uses batched updates instead of individual UPDATE queries
|
|
82
|
+
*/
|
|
83
|
+
async function updateTiers(projectId, stats) {
|
|
84
|
+
try {
|
|
85
|
+
const db = await getDb();
|
|
86
|
+
const schema = await getSchema();
|
|
87
|
+
const now = new Date();
|
|
88
|
+
// Fetch all memories to classify
|
|
89
|
+
const where = projectId ? eq(schema.memories.projectId, projectId) : undefined;
|
|
90
|
+
const memories = await db
|
|
91
|
+
.select()
|
|
92
|
+
.from(schema.memories)
|
|
93
|
+
.where(where)
|
|
94
|
+
.limit(10000); // Process larger batches now
|
|
95
|
+
// Calculate tiers in memory
|
|
96
|
+
const tierAssignments = new Map();
|
|
97
|
+
const tierCounts = { hot: 0, warm: 0, cold: 0 };
|
|
98
|
+
for (const memory of memories) {
|
|
99
|
+
const recencyDays = (now.getTime() - new Date(memory.createdAt).getTime()) / (24 * 60 * 60 * 1000);
|
|
100
|
+
const coactivation = memory.coactivationScore || 0;
|
|
101
|
+
const salience = memory.relevanceScore || 50;
|
|
102
|
+
let newTier = 'cold';
|
|
103
|
+
if (recencyDays <= TIER_THRESHOLDS.hot.recency &&
|
|
104
|
+
coactivation >= TIER_THRESHOLDS.hot.coactivation &&
|
|
105
|
+
salience >= TIER_THRESHOLDS.hot.salience) {
|
|
106
|
+
newTier = 'hot';
|
|
107
|
+
}
|
|
108
|
+
else if (recencyDays <= TIER_THRESHOLDS.warm.recency &&
|
|
109
|
+
coactivation >= TIER_THRESHOLDS.warm.coactivation &&
|
|
110
|
+
salience >= TIER_THRESHOLDS.warm.salience) {
|
|
111
|
+
newTier = 'warm';
|
|
112
|
+
}
|
|
113
|
+
if (newTier !== memory.tier) {
|
|
114
|
+
tierAssignments.set(memory.id, newTier);
|
|
115
|
+
tierCounts[newTier]++;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
if (tierAssignments.size === 0)
|
|
119
|
+
return;
|
|
120
|
+
// Group by tier for efficient batched updates
|
|
121
|
+
const hotIds = Array.from(tierAssignments.entries())
|
|
122
|
+
.filter(([_, tier]) => tier === 'hot')
|
|
123
|
+
.map(([id]) => id);
|
|
124
|
+
const warmIds = Array.from(tierAssignments.entries())
|
|
125
|
+
.filter(([_, tier]) => tier === 'warm')
|
|
126
|
+
.map(([id]) => id);
|
|
127
|
+
const coldIds = Array.from(tierAssignments.entries())
|
|
128
|
+
.filter(([_, tier]) => tier === 'cold')
|
|
129
|
+
.map(([id]) => id);
|
|
130
|
+
// Execute batched updates instead of individual queries
|
|
131
|
+
if (hotIds.length > 0) {
|
|
132
|
+
await db
|
|
133
|
+
.update(schema.memories)
|
|
134
|
+
.set({ tier: 'hot', updatedAt: now })
|
|
135
|
+
.where(inArray(schema.memories.id, hotIds));
|
|
136
|
+
}
|
|
137
|
+
if (warmIds.length > 0) {
|
|
138
|
+
await db
|
|
139
|
+
.update(schema.memories)
|
|
140
|
+
.set({ tier: 'warm', updatedAt: now })
|
|
141
|
+
.where(inArray(schema.memories.id, warmIds));
|
|
142
|
+
}
|
|
143
|
+
if (coldIds.length > 0) {
|
|
144
|
+
await db
|
|
145
|
+
.update(schema.memories)
|
|
146
|
+
.set({ tier: 'cold', updatedAt: now })
|
|
147
|
+
.where(inArray(schema.memories.id, coldIds));
|
|
148
|
+
}
|
|
149
|
+
// Update stats
|
|
150
|
+
stats.tierChanges.hot = tierCounts.hot;
|
|
151
|
+
stats.tierChanges.warm = tierCounts.warm;
|
|
152
|
+
stats.tierChanges.cold = tierCounts.cold;
|
|
153
|
+
logger.debug('Tier updates complete', {
|
|
154
|
+
hot: tierCounts.hot,
|
|
155
|
+
warm: tierCounts.warm,
|
|
156
|
+
cold: tierCounts.cold,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
logger.error('Error updating tiers', error);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Evict old, cold memories with low relevance
|
|
165
|
+
*/
|
|
166
|
+
async function evictOldMemories(projectId, stats) {
|
|
167
|
+
try {
|
|
168
|
+
const db = await getDb();
|
|
169
|
+
const schema = await getSchema();
|
|
170
|
+
const evictionThreshold = new Date(Date.now() - 180 * 24 * 60 * 60 * 1000); // 180 days
|
|
171
|
+
const where = projectId
|
|
172
|
+
? and(eq(schema.memories.projectId, projectId), lt(schema.memories.createdAt, evictionThreshold), eq(schema.memories.isProtected, false), eq(schema.memories.isPinned, false), eq(schema.memories.tier, 'cold'), lt(schema.memories.relevanceScore, 20) // Very low relevance
|
|
173
|
+
)
|
|
174
|
+
: and(lt(schema.memories.createdAt, evictionThreshold), eq(schema.memories.isProtected, false), eq(schema.memories.isPinned, false), eq(schema.memories.tier, 'cold'), lt(schema.memories.relevanceScore, 20));
|
|
175
|
+
const result = await db.delete(schema.memories).where(where);
|
|
176
|
+
stats.evicted = result?.rowCount || 0;
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
logger.error('Error evicting memories', error);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../core/lifecycle.ts"],"names":[],"mappings":"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"}
|