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,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QMD Memory Synchronization
|
|
3
|
+
*
|
|
4
|
+
* Syncs Squish memories to QMD collections for hybrid search.
|
|
5
|
+
* Writes memories as markdown files to QMD collection directories.
|
|
6
|
+
*
|
|
7
|
+
* QMD automatically indexes files in collection directories, so we just
|
|
8
|
+
* need to write files to the right location.
|
|
9
|
+
*
|
|
10
|
+
* Collection Structure:
|
|
11
|
+
* - qmd-collections/squish-observations/ - Observation memories
|
|
12
|
+
* - qmd-collections/squish-facts/ - Fact memories
|
|
13
|
+
* - qmd-collections/squish-decisions/ - Decision memories
|
|
14
|
+
* - qmd-collections/squish-context/ - Context memories
|
|
15
|
+
* - qmd-collections/squish-preferences/ - Preference memories
|
|
16
|
+
*/
|
|
17
|
+
import { mkdir, writeFile } from 'fs/promises';
|
|
18
|
+
import { join } from 'path';
|
|
19
|
+
import { getQMDClient } from '../embeddings/qmd-client.js';
|
|
20
|
+
import { config } from '../../config.js';
|
|
21
|
+
import { logger } from '../logger.js';
|
|
22
|
+
/**
|
|
23
|
+
* QMD Memory Sync class
|
|
24
|
+
*
|
|
25
|
+
* Manages synchronization of Squish memories to QMD collections.
|
|
26
|
+
*/
|
|
27
|
+
export class QMDMemorySync {
|
|
28
|
+
collectionsPath;
|
|
29
|
+
client;
|
|
30
|
+
initialized = false;
|
|
31
|
+
constructor() {
|
|
32
|
+
this.collectionsPath = config.qmdCollectionsPath;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Initialize the sync layer
|
|
36
|
+
*
|
|
37
|
+
* Creates collection directories and verifies QMD connection.
|
|
38
|
+
*/
|
|
39
|
+
async initialize() {
|
|
40
|
+
if (this.initialized) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
this.initialized = true;
|
|
44
|
+
try {
|
|
45
|
+
// Ensure collections directory exists
|
|
46
|
+
await mkdir(this.collectionsPath, { recursive: true });
|
|
47
|
+
// Initialize QMD client (but don't fail if QMD isn't installed)
|
|
48
|
+
try {
|
|
49
|
+
this.client = await getQMDClient();
|
|
50
|
+
const available = await this.client.isAvailable();
|
|
51
|
+
if (available) {
|
|
52
|
+
logger.info('QMD sync initialized with available QMD server');
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
logger.info('QMD sync initialized (QMD server not available)');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
logger.debug('QMD client unavailable, sync will be deferred');
|
|
60
|
+
}
|
|
61
|
+
// Create collection directories for each memory type
|
|
62
|
+
for (const [memoryType, collectionName] of Object.entries(config.qmdCollectionMapping)) {
|
|
63
|
+
await this.createCollection(String(collectionName));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
logger.error(`Failed to initialize QMD sync: ${error}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Sync a memory to QMD
|
|
72
|
+
*
|
|
73
|
+
* Writes memory as markdown to the appropriate collection directory.
|
|
74
|
+
* QMD will automatically index the file on its next update cycle.
|
|
75
|
+
*
|
|
76
|
+
* @param memory - Memory record to sync
|
|
77
|
+
*/
|
|
78
|
+
async syncMemory(memory) {
|
|
79
|
+
// Lazy initialization
|
|
80
|
+
if (!this.initialized) {
|
|
81
|
+
await this.initialize();
|
|
82
|
+
}
|
|
83
|
+
// Check if QMD is available
|
|
84
|
+
if (this.client && !(await this.client.isAvailable())) {
|
|
85
|
+
logger.debug('QMD unavailable, skipping sync');
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const collection = this.getCollectionForMemory(memory);
|
|
89
|
+
const filename = this.getFilenameForMemory(memory);
|
|
90
|
+
const content = this.formatMemoryAsMarkdown(memory);
|
|
91
|
+
const filepath = join(this.collectionsPath, collection, filename);
|
|
92
|
+
try {
|
|
93
|
+
await mkdir(join(this.collectionsPath, collection), { recursive: true });
|
|
94
|
+
await writeFile(filepath, content, 'utf-8');
|
|
95
|
+
logger.debug(`Synced memory ${memory.id} to QMD collection ${collection}`);
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
logger.error(`Failed to sync memory to QMD: ${error}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Batch sync multiple memories
|
|
103
|
+
*
|
|
104
|
+
* @param memories - Array of memory records to sync
|
|
105
|
+
*/
|
|
106
|
+
async syncMemories(memories) {
|
|
107
|
+
for (const memory of memories) {
|
|
108
|
+
await this.syncMemory(memory);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Trigger QMD re-index
|
|
113
|
+
*
|
|
114
|
+
* Note: This would typically call `qmd update` or `qmd embed`.
|
|
115
|
+
* For now, we just log that documents are ready for indexing.
|
|
116
|
+
*/
|
|
117
|
+
async reindex() {
|
|
118
|
+
if (!this.client || !(await this.client.isAvailable())) {
|
|
119
|
+
logger.debug('QMD unavailable, skipping reindex');
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
// In a full implementation, this would spawn a qmd process
|
|
123
|
+
// to update the index. For now, we rely on QMD's background indexing.
|
|
124
|
+
logger.info('QMD collections updated, ready for indexing');
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get collection name for a memory
|
|
128
|
+
*
|
|
129
|
+
* @param memory - Memory record
|
|
130
|
+
* @returns QMD collection name
|
|
131
|
+
*/
|
|
132
|
+
getCollectionForMemory(memory) {
|
|
133
|
+
const mapping = config.qmdCollectionMapping || {};
|
|
134
|
+
return mapping[memory.type] || 'squish-default';
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Generate filename for memory
|
|
138
|
+
*
|
|
139
|
+
* Uses a docid-like format (6-char hash) for consistent naming.
|
|
140
|
+
*
|
|
141
|
+
* @param memory - Memory record
|
|
142
|
+
* @returns Filename for the memory
|
|
143
|
+
*/
|
|
144
|
+
getFilenameForMemory(memory) {
|
|
145
|
+
// Create a short hash from the memory ID (like QMD's docid)
|
|
146
|
+
const hash = Buffer.from(memory.id.replace(/-/g, '')).toString('base64')
|
|
147
|
+
.replace(/[+/=]/g, '')
|
|
148
|
+
.substring(0, 6);
|
|
149
|
+
// Format: type-hash.md
|
|
150
|
+
return `${memory.type}-${hash}.md`;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Format memory as markdown for QMD indexing
|
|
154
|
+
*
|
|
155
|
+
* Uses frontmatter for metadata and standard markdown for content.
|
|
156
|
+
*
|
|
157
|
+
* @param memory - Memory record
|
|
158
|
+
* @returns Markdown formatted string
|
|
159
|
+
*/
|
|
160
|
+
formatMemoryAsMarkdown(memory) {
|
|
161
|
+
const frontmatter = [
|
|
162
|
+
'---',
|
|
163
|
+
`id: ${memory.id}`,
|
|
164
|
+
`type: ${memory.type}`,
|
|
165
|
+
memory.tags && memory.tags.length > 0 ? `tags: ${memory.tags.join(', ')}` : '',
|
|
166
|
+
memory.createdAt ? `created: ${memory.createdAt}` : '',
|
|
167
|
+
memory.metadata ? `metadata: ${JSON.stringify(memory.metadata)}` : '',
|
|
168
|
+
'---',
|
|
169
|
+
'',
|
|
170
|
+
`# ${this.capitalize(memory.type)}`,
|
|
171
|
+
''
|
|
172
|
+
].filter(line => line !== '').join('\n');
|
|
173
|
+
return frontmatter + memory.content;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Capitalize first letter of a string
|
|
177
|
+
*/
|
|
178
|
+
capitalize(str) {
|
|
179
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Create a QMD collection directory
|
|
183
|
+
*
|
|
184
|
+
* @param name - Collection name
|
|
185
|
+
*/
|
|
186
|
+
async createCollection(name) {
|
|
187
|
+
const collectionPath = join(this.collectionsPath, name);
|
|
188
|
+
await mkdir(collectionPath, { recursive: true });
|
|
189
|
+
logger.debug(`QMD collection prepared: ${name}`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// Singleton instance
|
|
193
|
+
let syncInstance = null;
|
|
194
|
+
/**
|
|
195
|
+
* Get the singleton QMD memory sync instance
|
|
196
|
+
*
|
|
197
|
+
* @returns QMDMemorySync instance
|
|
198
|
+
*/
|
|
199
|
+
export async function getQMDMemorySync() {
|
|
200
|
+
if (!syncInstance) {
|
|
201
|
+
syncInstance = new QMDMemorySync();
|
|
202
|
+
await syncInstance.initialize();
|
|
203
|
+
}
|
|
204
|
+
return syncInstance;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Reset the singleton sync instance
|
|
208
|
+
* Useful for testing or when configuration changes.
|
|
209
|
+
*/
|
|
210
|
+
export function resetQMDMemorySync() {
|
|
211
|
+
syncInstance = null;
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=qmd-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qmd-sync.js","sourceRoot":"","sources":["../../../core/sync/qmd-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Temporal Facts System
|
|
3
|
+
* Manages versioned facts with validity windows
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Store a new fact with temporal validity
|
|
7
|
+
*/
|
|
8
|
+
export declare function storeFact(content: string, options?: {
|
|
9
|
+
validFrom?: Date;
|
|
10
|
+
validTo?: Date;
|
|
11
|
+
confidence?: number;
|
|
12
|
+
tags?: string[];
|
|
13
|
+
projectId?: string;
|
|
14
|
+
}): Promise<string>;
|
|
15
|
+
/**
|
|
16
|
+
* Update a fact by creating a new version
|
|
17
|
+
*/
|
|
18
|
+
export declare function updateFact(previousFactId: string, newContent: string, reason: string): Promise<string>;
|
|
19
|
+
/**
|
|
20
|
+
* Query facts valid at a specific point in time
|
|
21
|
+
*/
|
|
22
|
+
export declare function queryFactsAtTime(timestamp?: Date, options?: {
|
|
23
|
+
minConfidence?: number;
|
|
24
|
+
tags?: string[];
|
|
25
|
+
projectId?: string;
|
|
26
|
+
limit?: number;
|
|
27
|
+
}): Promise<any[]>;
|
|
28
|
+
/**
|
|
29
|
+
* Get the complete version history of a fact
|
|
30
|
+
*/
|
|
31
|
+
export declare function getFactHistory(factId: string): Promise<any[]>;
|
|
32
|
+
/**
|
|
33
|
+
* Apply confidence decay based on temporal distance
|
|
34
|
+
*/
|
|
35
|
+
export declare function applyConfidenceDecay(factId: string, ageDays: number): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Invalidate a fact (mark as no longer valid)
|
|
38
|
+
*/
|
|
39
|
+
export declare function invalidateFact(factId: string, reason: string): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Check if a fact is currently valid
|
|
42
|
+
*/
|
|
43
|
+
export declare function isFactValid(factId: string, atTime?: Date): Promise<boolean>;
|
|
44
|
+
/**
|
|
45
|
+
* Get statistics about facts
|
|
46
|
+
*/
|
|
47
|
+
export declare function getFactStats(projectId?: string): Promise<{
|
|
48
|
+
totalFacts: number;
|
|
49
|
+
activeFacts: number;
|
|
50
|
+
expiredFacts: number;
|
|
51
|
+
avgConfidence: number;
|
|
52
|
+
avgAge: number;
|
|
53
|
+
}>;
|
|
54
|
+
//# sourceMappingURL=temporal-facts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temporal-facts.d.ts","sourceRoot":"","sources":["../../core/temporal-facts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH;;GAEG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IACP,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACf,GACL,OAAO,CAAC,MAAM,CAAC,CA2BjB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,GAAE,IAAiB,EAC5B,OAAO,GAAE;IACP,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CACX,GACL,OAAO,CAAC,GAAG,EAAE,CAAC,CA2BhB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAEnE;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BzF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAelF;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,IAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CAmB7F;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CA8CD"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Temporal Facts System
|
|
3
|
+
* Manages versioned facts with validity windows
|
|
4
|
+
*/
|
|
5
|
+
import { and, eq, gte, desc } from 'drizzle-orm';
|
|
6
|
+
import { randomUUID } from 'crypto';
|
|
7
|
+
import { getDb } from '../db/index.js';
|
|
8
|
+
import { getSchema } from '../db/schema.js';
|
|
9
|
+
import { traverseSupersededChain } from './utils/history-traversal.js';
|
|
10
|
+
import { createNewFactVersion } from './utils/version-management.js';
|
|
11
|
+
import { buildFactAtTimeQuery } from './utils/temporal-queries.js';
|
|
12
|
+
import { logger } from './logger.js';
|
|
13
|
+
/**
|
|
14
|
+
* Store a new fact with temporal validity
|
|
15
|
+
*/
|
|
16
|
+
export async function storeFact(content, options = {}) {
|
|
17
|
+
try {
|
|
18
|
+
const db = await getDb();
|
|
19
|
+
const schema = await getSchema();
|
|
20
|
+
const factId = randomUUID();
|
|
21
|
+
await db.insert(schema.memories).values({
|
|
22
|
+
id: factId,
|
|
23
|
+
type: 'fact',
|
|
24
|
+
sector: 'semantic',
|
|
25
|
+
content,
|
|
26
|
+
confidence: options.confidence || 100,
|
|
27
|
+
validFrom: options.validFrom || new Date(),
|
|
28
|
+
validTo: options.validTo || null,
|
|
29
|
+
version: 1,
|
|
30
|
+
tags: options.tags || [],
|
|
31
|
+
projectId: options.projectId || null,
|
|
32
|
+
createdAt: new Date(),
|
|
33
|
+
updatedAt: new Date(),
|
|
34
|
+
});
|
|
35
|
+
return factId;
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
logger.error('Error storing fact', error);
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Update a fact by creating a new version
|
|
44
|
+
*/
|
|
45
|
+
export async function updateFact(previousFactId, newContent, reason) {
|
|
46
|
+
return createNewFactVersion(previousFactId, newContent, {}, reason);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Query facts valid at a specific point in time
|
|
50
|
+
*/
|
|
51
|
+
export async function queryFactsAtTime(timestamp = new Date(), options = {}) {
|
|
52
|
+
try {
|
|
53
|
+
const db = await getDb();
|
|
54
|
+
const schema = await getSchema();
|
|
55
|
+
const minConfidence = options.minConfidence || 0;
|
|
56
|
+
const limit = options.limit || 100;
|
|
57
|
+
const additionalFilters = [gte(schema.memories.confidence, minConfidence)];
|
|
58
|
+
if (options.projectId) {
|
|
59
|
+
additionalFilters.push(eq(schema.memories.projectId, options.projectId));
|
|
60
|
+
}
|
|
61
|
+
const where = buildFactAtTimeQuery(schema, timestamp, additionalFilters);
|
|
62
|
+
const results = await db
|
|
63
|
+
.select()
|
|
64
|
+
.from(schema.memories)
|
|
65
|
+
.where(where)
|
|
66
|
+
.orderBy(desc(schema.memories.confidence))
|
|
67
|
+
.limit(limit);
|
|
68
|
+
return results;
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
logger.error('Error querying facts at time', error);
|
|
72
|
+
return [];
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Get the complete version history of a fact
|
|
77
|
+
*/
|
|
78
|
+
export async function getFactHistory(factId) {
|
|
79
|
+
return traverseSupersededChain(factId);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Apply confidence decay based on temporal distance
|
|
83
|
+
*/
|
|
84
|
+
export async function applyConfidenceDecay(factId, ageDays) {
|
|
85
|
+
try {
|
|
86
|
+
const db = await getDb();
|
|
87
|
+
const schema = await getSchema();
|
|
88
|
+
// Confidence decays exponentially: newConfidence = originalConfidence * e^(-lambda * ageDays)
|
|
89
|
+
// Using lambda = 0.01 for moderate decay
|
|
90
|
+
const decayFactor = Math.exp(-0.01 * ageDays);
|
|
91
|
+
const fact = await db
|
|
92
|
+
.select()
|
|
93
|
+
.from(schema.memories)
|
|
94
|
+
.where(eq(schema.memories.id, factId))
|
|
95
|
+
.limit(1);
|
|
96
|
+
if (fact.length === 0)
|
|
97
|
+
return;
|
|
98
|
+
const newConfidence = Math.max(0, Math.floor(fact[0].confidence * decayFactor));
|
|
99
|
+
await db
|
|
100
|
+
.update(schema.memories)
|
|
101
|
+
.set({ confidence: newConfidence })
|
|
102
|
+
.where(eq(schema.memories.id, factId));
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
logger.error('Error applying confidence decay', error);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Invalidate a fact (mark as no longer valid)
|
|
110
|
+
*/
|
|
111
|
+
export async function invalidateFact(factId, reason) {
|
|
112
|
+
try {
|
|
113
|
+
const db = await getDb();
|
|
114
|
+
const schema = await getSchema();
|
|
115
|
+
await db
|
|
116
|
+
.update(schema.memories)
|
|
117
|
+
.set({
|
|
118
|
+
validTo: new Date(),
|
|
119
|
+
metadata: { invalidationReason: reason, invalidatedAt: new Date().toISOString() },
|
|
120
|
+
})
|
|
121
|
+
.where(eq(schema.memories.id, factId));
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
logger.error('Error invalidating fact', error);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Check if a fact is currently valid
|
|
129
|
+
*/
|
|
130
|
+
export async function isFactValid(factId, atTime = new Date()) {
|
|
131
|
+
try {
|
|
132
|
+
const db = await getDb();
|
|
133
|
+
const schema = await getSchema();
|
|
134
|
+
const additionalFilters = [eq(schema.memories.id, factId)];
|
|
135
|
+
const where = buildFactAtTimeQuery(schema, atTime, additionalFilters);
|
|
136
|
+
const fact = await db
|
|
137
|
+
.select()
|
|
138
|
+
.from(schema.memories)
|
|
139
|
+
.where(where)
|
|
140
|
+
.limit(1);
|
|
141
|
+
return fact.length > 0;
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
logger.error('Error checking fact validity', error);
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Get statistics about facts
|
|
150
|
+
*/
|
|
151
|
+
export async function getFactStats(projectId) {
|
|
152
|
+
try {
|
|
153
|
+
const db = await getDb();
|
|
154
|
+
const schema = await getSchema();
|
|
155
|
+
const now = new Date();
|
|
156
|
+
const where = projectId
|
|
157
|
+
? and(eq(schema.memories.type, 'fact'), eq(schema.memories.projectId, projectId))
|
|
158
|
+
: eq(schema.memories.type, 'fact');
|
|
159
|
+
const facts = await db.select().from(schema.memories).where(where);
|
|
160
|
+
let active = 0;
|
|
161
|
+
let expired = 0;
|
|
162
|
+
let totalConfidence = 0;
|
|
163
|
+
let totalAge = 0;
|
|
164
|
+
for (const fact of facts) {
|
|
165
|
+
totalConfidence += fact.confidence || 0;
|
|
166
|
+
if (fact.validTo && new Date(fact.validTo) < now) {
|
|
167
|
+
expired++;
|
|
168
|
+
}
|
|
169
|
+
else if (!fact.validTo || new Date(fact.validTo) >= now) {
|
|
170
|
+
active++;
|
|
171
|
+
}
|
|
172
|
+
totalAge += (now.getTime() - new Date(fact.createdAt).getTime()) / (1000 * 60 * 60 * 24);
|
|
173
|
+
}
|
|
174
|
+
return {
|
|
175
|
+
totalFacts: facts.length,
|
|
176
|
+
activeFacts: active,
|
|
177
|
+
expiredFacts: expired,
|
|
178
|
+
avgConfidence: facts.length > 0 ? totalConfidence / facts.length : 0,
|
|
179
|
+
avgAge: facts.length > 0 ? totalAge / facts.length : 0,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
logger.error('Error getting fact stats', error);
|
|
184
|
+
return {
|
|
185
|
+
totalFacts: 0,
|
|
186
|
+
activeFacts: 0,
|
|
187
|
+
expiredFacts: 0,
|
|
188
|
+
avgConfidence: 0,
|
|
189
|
+
avgAge: 0,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=temporal-facts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temporal-facts.js","sourceRoot":"","sources":["../../core/temporal-facts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Cleanup Operations Utilities
|
|
3
|
+
* Common patterns for age-based cleanup operations
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Cleanup old session summaries
|
|
7
|
+
*/
|
|
8
|
+
export declare function cleanupOldSessionSummaries(olderThanDays?: number): Promise<number>;
|
|
9
|
+
/**
|
|
10
|
+
* Cleanup old memory snapshots
|
|
11
|
+
*/
|
|
12
|
+
export declare function cleanupOldMemorySnapshots(olderThanDays?: number): Promise<number>;
|
|
13
|
+
//# sourceMappingURL=cleanup-operations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanup-operations.d.ts","sourceRoot":"","sources":["../../../core/utils/cleanup-operations.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;GAEG;AACH,wBAAsB,0BAA0B,CAAC,aAAa,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB5F;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAAC,aAAa,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB3F"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Cleanup Operations Utilities
|
|
3
|
+
* Common patterns for age-based cleanup operations
|
|
4
|
+
*/
|
|
5
|
+
import { getDb } from '../../db/index.js';
|
|
6
|
+
import { getSchema } from '../../db/schema.js';
|
|
7
|
+
import { logger } from '../logger.js';
|
|
8
|
+
/**
|
|
9
|
+
* Cleanup old session summaries
|
|
10
|
+
*/
|
|
11
|
+
export async function cleanupOldSessionSummaries(olderThanDays = 30) {
|
|
12
|
+
try {
|
|
13
|
+
const db = await getDb();
|
|
14
|
+
const schema = await getSchema();
|
|
15
|
+
const threshold = new Date(Date.now() - olderThanDays * 24 * 60 * 60 * 1000);
|
|
16
|
+
const result = await db
|
|
17
|
+
.delete(schema.sessionSummaries)
|
|
18
|
+
.where(schema.sessionSummaries.createdAt < threshold);
|
|
19
|
+
return result?.rowCount || 0;
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
logger.error('Error pruning old summaries', error);
|
|
23
|
+
return 0;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Cleanup old memory snapshots
|
|
28
|
+
*/
|
|
29
|
+
export async function cleanupOldMemorySnapshots(olderThanDays = 90) {
|
|
30
|
+
try {
|
|
31
|
+
const db = await getDb();
|
|
32
|
+
const schema = await getSchema();
|
|
33
|
+
const threshold = new Date(Date.now() - olderThanDays * 24 * 60 * 60 * 1000);
|
|
34
|
+
const result = await db
|
|
35
|
+
.delete(schema.memorySnapshots)
|
|
36
|
+
.where(schema.memorySnapshots.createdAt < threshold);
|
|
37
|
+
return result?.rowCount || 0;
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
logger.error('Error deleting old snapshots', error);
|
|
41
|
+
return 0;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=cleanup-operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanup-operations.js","sourceRoot":"","sources":["../../../core/utils/cleanup-operations.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,gBAAwB,EAAE;IACzE,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;QAEjC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAE7E,MAAM,MAAM,GAAG,MAAO,EAAU;aAC7B,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC;aAC/B,KAAK,CAAE,MAAM,CAAC,gBAAgB,CAAC,SAAiB,GAAG,SAAS,CAAC,CAAC;QAEjE,OAAO,MAAM,EAAE,QAAQ,IAAI,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;QACnD,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,gBAAwB,EAAE;IACxE,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;QAEjC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAE7E,MAAM,MAAM,GAAG,MAAO,EAAU;aAC7B,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC;aAC9B,KAAK,CAAE,MAAM,CAAC,eAAe,CAAC,SAAiB,GAAG,SAAS,CAAC,CAAC;QAEhE,OAAO,MAAM,EAAE,QAAQ,IAAI,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Content Extraction Utilities
|
|
3
|
+
* Common patterns for extracting information from messages
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Extract key information from conversation messages
|
|
7
|
+
*/
|
|
8
|
+
export declare function extractMessageContent(messages: any[]): {
|
|
9
|
+
userMessages: any[];
|
|
10
|
+
assistantMessages: any[];
|
|
11
|
+
toolCalls: Set<string>;
|
|
12
|
+
topics: Set<string>;
|
|
13
|
+
timestamp: string;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Generate basic extractive summary from extracted content
|
|
17
|
+
*/
|
|
18
|
+
export declare function generateExtractiveSummary(extracted: ReturnType<typeof extractMessageContent>): string;
|
|
19
|
+
//# sourceMappingURL=content-extraction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-extraction.d.ts","sourceRoot":"","sources":["../../../core/utils/content-extraction.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG;IACtD,YAAY,EAAE,GAAG,EAAE,CAAC;IACpB,iBAAiB,EAAE,GAAG,EAAE,CAAC;IACzB,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB,CAwCA;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,UAAU,CAAC,OAAO,qBAAqB,CAAC,GAAG,MAAM,CAsBrG"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Content Extraction Utilities
|
|
3
|
+
* Common patterns for extracting information from messages
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Extract key information from conversation messages
|
|
7
|
+
*/
|
|
8
|
+
export function extractMessageContent(messages) {
|
|
9
|
+
// Extract key information from messages
|
|
10
|
+
const userMessages = messages.filter((m) => m.role === 'user');
|
|
11
|
+
const assistantMessages = messages.filter((m) => m.role === 'assistant');
|
|
12
|
+
// Extract tool calls
|
|
13
|
+
const toolCalls = new Set();
|
|
14
|
+
for (const msg of messages) {
|
|
15
|
+
if (msg.toolCalls && Array.isArray(msg.toolCalls)) {
|
|
16
|
+
for (const tc of msg.toolCalls) {
|
|
17
|
+
toolCalls.add(tc.name);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
// Extract topics from first and last user messages
|
|
22
|
+
const topics = new Set();
|
|
23
|
+
if (userMessages.length > 0) {
|
|
24
|
+
const firstUser = userMessages[0].content || '';
|
|
25
|
+
const lastUser = userMessages[userMessages.length - 1].content || '';
|
|
26
|
+
// Simple topic extraction (first 10 words)
|
|
27
|
+
const extractTopics = (text) => {
|
|
28
|
+
const words = text.split(/\s+/).slice(0, 10);
|
|
29
|
+
return words.join(' ');
|
|
30
|
+
};
|
|
31
|
+
if (firstUser)
|
|
32
|
+
topics.add(extractTopics(firstUser));
|
|
33
|
+
if (lastUser && lastUser !== firstUser)
|
|
34
|
+
topics.add(extractTopics(lastUser));
|
|
35
|
+
}
|
|
36
|
+
const timestamp = messages.length > 0 ? messages[messages.length - 1].createdAt : 'unknown';
|
|
37
|
+
return {
|
|
38
|
+
userMessages,
|
|
39
|
+
assistantMessages,
|
|
40
|
+
toolCalls,
|
|
41
|
+
topics,
|
|
42
|
+
timestamp,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Generate basic extractive summary from extracted content
|
|
47
|
+
*/
|
|
48
|
+
export function generateExtractiveSummary(extracted) {
|
|
49
|
+
const parts = [];
|
|
50
|
+
if (extracted.userMessages.length > 0) {
|
|
51
|
+
parts.push(`User prompts: ${extracted.userMessages.length}`);
|
|
52
|
+
}
|
|
53
|
+
if (extracted.assistantMessages.length > 0) {
|
|
54
|
+
parts.push(`Assistant responses: ${extracted.assistantMessages.length}`);
|
|
55
|
+
}
|
|
56
|
+
if (extracted.toolCalls.size > 0) {
|
|
57
|
+
parts.push(`Tools used: ${Array.from(extracted.toolCalls).join(', ')}`);
|
|
58
|
+
}
|
|
59
|
+
if (extracted.topics.size > 0) {
|
|
60
|
+
parts.push(`Topics: ${Array.from(extracted.topics).join('; ')}`);
|
|
61
|
+
}
|
|
62
|
+
parts.push(`Last activity: ${extracted.timestamp}`);
|
|
63
|
+
return parts.join('. ');
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=content-extraction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-extraction.js","sourceRoot":"","sources":["../../../core/utils/content-extraction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Requirements Filter Builder
|
|
3
|
+
* Common patterns for building database filters from criteria objects
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Build database filter array from MemoryCriteria
|
|
7
|
+
*/
|
|
8
|
+
export declare function buildMemoryFilters(criteria: any, schema: any): any[];
|
|
9
|
+
/**
|
|
10
|
+
* Build database filter array from partial criteria (for assertions)
|
|
11
|
+
*/
|
|
12
|
+
export declare function buildMemoryFiltersPartial(criteria: any, schema: any): any[];
|
|
13
|
+
//# sourceMappingURL=filter-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-builder.d.ts","sourceRoot":"","sources":["../../../core/utils/filter-builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,GAAG,EAAE,CAgCpE;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,GAAG,EAAE,CAQ3E"}
|