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,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Squish Plugin Wrapper - Hook handlers for Claude Code integration
|
|
3
|
+
*/
|
|
4
|
+
import 'dotenv/config';
|
|
5
|
+
import { captureUserPrompt, captureToolUse, queueForSummarization } from './capture.js';
|
|
6
|
+
import { injectContextIntoSession } from './injection.js';
|
|
7
|
+
import { generateAndInjectFolderContext } from '../../core/search/folder-context.js';
|
|
8
|
+
import { getDb } from '../../db/index.js';
|
|
9
|
+
import { startWorker, forceLifecycleMaintenance } from '../../core/worker.js';
|
|
10
|
+
import { getPinnedMemories } from '../../core/governance.js';
|
|
11
|
+
import { summarizeSession } from '../../core/summarization.js';
|
|
12
|
+
import { config } from '../../config.js';
|
|
13
|
+
import { logger } from '../../core/logger.js';
|
|
14
|
+
import { initializeCoreMemory, formatCoreMemoryForInjection } from '../../core/core-memory.js';
|
|
15
|
+
import { initializeContextSession } from '../../core/context-paging.js';
|
|
16
|
+
import { ensureProject } from '../../core/projects.js';
|
|
17
|
+
import { hybridSearch } from '../../core/memory/hybrid-retrieval.js';
|
|
18
|
+
function getProjectPath(context) {
|
|
19
|
+
return context.workingDirectory || process.cwd();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Helper to log errors without breaking execution
|
|
23
|
+
*/
|
|
24
|
+
function logError(message, error) {
|
|
25
|
+
logger.error(message, error);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Hybrid search configuration for smart context retrieval
|
|
29
|
+
*/
|
|
30
|
+
const SMART_SEARCH_CONFIG = {
|
|
31
|
+
candidateLimit: 50,
|
|
32
|
+
resultLimit: 3,
|
|
33
|
+
hybridOptions: {
|
|
34
|
+
weights: {
|
|
35
|
+
semantic: 0.35,
|
|
36
|
+
recency: 0.25,
|
|
37
|
+
coactivation: 0.20,
|
|
38
|
+
importance: 0.20,
|
|
39
|
+
},
|
|
40
|
+
decayDays: 7,
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
function isAutoCapture(context) {
|
|
44
|
+
return context.config?.autoCapture !== false;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Detect if user message looks like it's asking a question or seeking information
|
|
48
|
+
*/
|
|
49
|
+
function shouldSmartSearch(userMessage) {
|
|
50
|
+
if (!userMessage || userMessage.length < 3)
|
|
51
|
+
return false;
|
|
52
|
+
// Question detection: explicit question mark or question keywords
|
|
53
|
+
const isExplicitQuestion = userMessage.includes('?');
|
|
54
|
+
const questionKeywords = [
|
|
55
|
+
'what ', 'where ', 'when ', 'how ', 'why ',
|
|
56
|
+
'remember', 'recall', 'tell me', 'explain', 'show me',
|
|
57
|
+
'find ', 'search ', 'look for', 'do you know'
|
|
58
|
+
];
|
|
59
|
+
const isQuestionLike = questionKeywords.some(kw => userMessage.toLowerCase().includes(kw));
|
|
60
|
+
// Context clue detection: user is trying to solve a problem or understand code
|
|
61
|
+
const contextKeywords = [
|
|
62
|
+
'debug', 'error', 'issue', 'problem', 'fix ',
|
|
63
|
+
'broken', 'not working', 'why is', 'what went',
|
|
64
|
+
'help', 'stuck', 'confused', 'doesn\'t work'
|
|
65
|
+
];
|
|
66
|
+
const hasContextClue = contextKeywords.some(kw => userMessage.toLowerCase().includes(kw));
|
|
67
|
+
return isExplicitQuestion || isQuestionLike || hasContextClue;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Format memory search results for injection
|
|
71
|
+
*/
|
|
72
|
+
function formatMemoriesForInjection(memories) {
|
|
73
|
+
if (memories.length === 0)
|
|
74
|
+
return '';
|
|
75
|
+
const MAX_CONTENT_LENGTH = 150;
|
|
76
|
+
const parts = ['## Relevant Memory\n'];
|
|
77
|
+
memories.slice(0, 3).forEach((memory, index) => {
|
|
78
|
+
const content = memory.content || '';
|
|
79
|
+
const type = memory.type || 'memory';
|
|
80
|
+
const truncated = content.length > MAX_CONTENT_LENGTH
|
|
81
|
+
? content.substring(0, MAX_CONTENT_LENGTH) + '...'
|
|
82
|
+
: content;
|
|
83
|
+
parts.push(`${index + 1}. [${type}] ${truncated.replace(/\n/g, ' ')}`);
|
|
84
|
+
});
|
|
85
|
+
return parts.join('\n');
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Wrap async function with timeout
|
|
89
|
+
*/
|
|
90
|
+
async function withTimeout(promise, timeoutMs, defaultValue) {
|
|
91
|
+
return Promise.race([
|
|
92
|
+
promise,
|
|
93
|
+
new Promise((resolve) => setTimeout(() => resolve(defaultValue), timeoutMs))
|
|
94
|
+
]);
|
|
95
|
+
}
|
|
96
|
+
export async function onInstall(_context) {
|
|
97
|
+
logger.info('Installation hook triggered');
|
|
98
|
+
await getDb();
|
|
99
|
+
try {
|
|
100
|
+
if (config.lifecycleEnabled || config.summarizationEnabled) {
|
|
101
|
+
await startWorker();
|
|
102
|
+
logger.info('Background worker initialized');
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
logger.error('Failed to start background worker', error);
|
|
107
|
+
}
|
|
108
|
+
logger.info('Squish v0.6.0 ready');
|
|
109
|
+
}
|
|
110
|
+
export async function onSessionStart(context) {
|
|
111
|
+
const projectPath = getProjectPath(context);
|
|
112
|
+
logger.info(`Session started in ${projectPath}`);
|
|
113
|
+
let coreMemoryText = '';
|
|
114
|
+
// Initialize core memory and context session for this project
|
|
115
|
+
try {
|
|
116
|
+
const project = await ensureProject(projectPath);
|
|
117
|
+
if (project?.id) {
|
|
118
|
+
// Initialize core memory (creates sections if they don't exist)
|
|
119
|
+
await initializeCoreMemory(project.id);
|
|
120
|
+
// NEW: Retrieve and format core memory for injection
|
|
121
|
+
coreMemoryText = await withTimeout(formatCoreMemoryForInjection(project.id), 2000, 'Core memory loading timed out');
|
|
122
|
+
// Initialize context session tracking
|
|
123
|
+
if (context.sessionId) {
|
|
124
|
+
await initializeContextSession(context.sessionId, project.id);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
logger.error('Failed to retrieve core memory:', error);
|
|
130
|
+
return 'Core memory unavailable (database initialization in progress)';
|
|
131
|
+
}
|
|
132
|
+
if (context.config?.autoInject !== false) {
|
|
133
|
+
await injectContextIntoSession(context, projectPath).catch(err => logError('Context injection error', err));
|
|
134
|
+
}
|
|
135
|
+
if (context.config?.generateFolderContext !== false) {
|
|
136
|
+
await generateAndInjectFolderContext(projectPath).catch(err => logError('Folder context error', err));
|
|
137
|
+
}
|
|
138
|
+
if (config.governanceEnabled && context.config?.autoInject !== false) {
|
|
139
|
+
try {
|
|
140
|
+
const pinnedMemories = await getPinnedMemories();
|
|
141
|
+
if (pinnedMemories.length > 0) {
|
|
142
|
+
logger.info(`Injecting ${pinnedMemories.length} pinned memories`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
logError('Failed to load pinned memories', error);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Return formatted core memory for hook injection
|
|
150
|
+
return coreMemoryText || 'Core memory initialized (empty)';
|
|
151
|
+
}
|
|
152
|
+
export async function onUserPromptSubmit(context) {
|
|
153
|
+
const projectPath = getProjectPath(context);
|
|
154
|
+
// Keep existing auto-capture (background operation) - records user prompts for later analysis
|
|
155
|
+
if (isAutoCapture(context) && context.userMessage) {
|
|
156
|
+
captureUserPrompt(projectPath, context.userMessage, context).catch(err => logger.info('Prompt capture error', err));
|
|
157
|
+
}
|
|
158
|
+
// Smart heuristic search: Look for relevant memories only when user is asking questions or seeking help
|
|
159
|
+
// This balances automation with user control - Claude still has final say via explicit /squish:search
|
|
160
|
+
if (!context.userMessage || !shouldSmartSearch(context.userMessage)) {
|
|
161
|
+
return '';
|
|
162
|
+
}
|
|
163
|
+
try {
|
|
164
|
+
const project = await ensureProject(projectPath);
|
|
165
|
+
if (!project?.id) {
|
|
166
|
+
return '';
|
|
167
|
+
}
|
|
168
|
+
// Smart search with HYBRID scoring: semantic + recency + coactivation + importance
|
|
169
|
+
// Fetches 50 candidates, re-ranks using multi-factor scoring, returns top 3
|
|
170
|
+
const relevantMemories = await withTimeout(hybridSearch({
|
|
171
|
+
query: context.userMessage,
|
|
172
|
+
project: projectPath,
|
|
173
|
+
...SMART_SEARCH_CONFIG,
|
|
174
|
+
}), 2000, []);
|
|
175
|
+
if (relevantMemories.length === 0) {
|
|
176
|
+
return '';
|
|
177
|
+
}
|
|
178
|
+
const formattedMemories = formatMemoriesForInjection(relevantMemories);
|
|
179
|
+
logger.info(`Smart search: Injecting ${relevantMemories.length} relevant memories`);
|
|
180
|
+
return formattedMemories;
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
logger.error('Smart search failed:', error);
|
|
184
|
+
return '';
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
export async function onPostToolUse(context) {
|
|
188
|
+
if (!isAutoCapture(context) || !context.toolName)
|
|
189
|
+
return;
|
|
190
|
+
const projectPath = getProjectPath(context);
|
|
191
|
+
captureToolUse(projectPath, context.toolName, context.toolArguments, context.toolResult, context)
|
|
192
|
+
.then(observation => {
|
|
193
|
+
if (observation?.id) {
|
|
194
|
+
queueForSummarization(observation.id, projectPath).catch(err => logger.info('Summarization queue error', err));
|
|
195
|
+
}
|
|
196
|
+
})
|
|
197
|
+
.catch(err => logger.error('Tool capture error', err));
|
|
198
|
+
}
|
|
199
|
+
export async function onSessionStop(context) {
|
|
200
|
+
const projectPath = getProjectPath(context);
|
|
201
|
+
logger.info(`Session ended in ${projectPath}`);
|
|
202
|
+
if (context.config?.generateFolderContext !== false) {
|
|
203
|
+
await generateAndInjectFolderContext(projectPath).catch(err => logger.error('Final folder context error', err));
|
|
204
|
+
}
|
|
205
|
+
if (config.summarizationEnabled && context.sessionId) {
|
|
206
|
+
try {
|
|
207
|
+
await summarizeSession(context.sessionId, 'final');
|
|
208
|
+
logger.info('Session summarized (final)');
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
logger.error('Failed to create final summary', error);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
if (config.lifecycleEnabled) {
|
|
215
|
+
try {
|
|
216
|
+
await forceLifecycleMaintenance(projectPath);
|
|
217
|
+
logger.info('Lifecycle maintenance completed on session end');
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
logger.error('Failed to run lifecycle maintenance', error);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
const SQUISH_VERSION = '0.6.0';
|
|
225
|
+
export async function onUpdate(context) {
|
|
226
|
+
logger.info('Squish plugin update triggered');
|
|
227
|
+
// The postinstall script should handle rebuilding
|
|
228
|
+
// Just provide user feedback
|
|
229
|
+
return `Squish v${SQUISH_VERSION} updated successfully. The MCP server will reconnect automatically.`;
|
|
230
|
+
}
|
|
231
|
+
export default {
|
|
232
|
+
onInstall,
|
|
233
|
+
onUpdate,
|
|
234
|
+
onSessionStart,
|
|
235
|
+
onUserPromptSubmit,
|
|
236
|
+
onPostToolUse,
|
|
237
|
+
onSessionStop
|
|
238
|
+
};
|
|
239
|
+
//# sourceMappingURL=plugin-wrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-wrapper.js","sourceRoot":"","sources":["../../../adapters/claude-code/plugin-wrapper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin Context Types
|
|
3
|
+
* Defines the interface between Claude Code and Squish plugin
|
|
4
|
+
*/
|
|
5
|
+
export interface PluginConfig {
|
|
6
|
+
autoCapture?: boolean;
|
|
7
|
+
autoInject?: boolean;
|
|
8
|
+
generateFolderContext?: boolean;
|
|
9
|
+
privacyMode?: 'strict' | 'moderate' | 'off';
|
|
10
|
+
maxContextItems?: number;
|
|
11
|
+
maxContextTokens?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface PluginContext {
|
|
14
|
+
workingDirectory?: string;
|
|
15
|
+
sessionId?: string;
|
|
16
|
+
conversationId?: string;
|
|
17
|
+
userMessage?: string;
|
|
18
|
+
userRole?: 'user' | 'assistant';
|
|
19
|
+
toolName?: string;
|
|
20
|
+
toolArguments?: Record<string, any>;
|
|
21
|
+
toolResult?: string | Record<string, any>;
|
|
22
|
+
config?: PluginConfig;
|
|
23
|
+
pluginVersion?: string;
|
|
24
|
+
pluginPath?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface SessionContext {
|
|
27
|
+
id: string;
|
|
28
|
+
workingDirectory: string;
|
|
29
|
+
startTime: Date;
|
|
30
|
+
conversationId: string;
|
|
31
|
+
projectPath: string;
|
|
32
|
+
gitRemote?: string;
|
|
33
|
+
gitBranch?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface CapturedObservation {
|
|
36
|
+
id: string;
|
|
37
|
+
type: 'tool_use' | 'user_prompt' | 'file_change' | 'error' | 'pattern' | 'insight';
|
|
38
|
+
action: string;
|
|
39
|
+
target: string;
|
|
40
|
+
summary: string;
|
|
41
|
+
details?: Record<string, any>;
|
|
42
|
+
timestamp: Date;
|
|
43
|
+
projectPath: string;
|
|
44
|
+
sessionId?: string;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../adapters/claude-code/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,WAAW,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,KAAK,CAAC;IAC5C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAE5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IAGxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAGhC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAG1C,MAAM,CAAC,EAAE,YAAY,CAAC;IAGtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,IAAI,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,GAAG,aAAa,GAAG,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IACnF,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,SAAS,EAAE,IAAI,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../adapters/claude-code/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token estimation for calculating context window savings from merges.
|
|
3
|
+
* Uses simple heuristic: 1 token ≈ 4 characters (can be upgraded to tiktoken for accuracy).
|
|
4
|
+
*/
|
|
5
|
+
import type { Memory } from '../../../drizzle/schema.js';
|
|
6
|
+
import type { MergedMemory } from '../strategies/merge-strategies.js';
|
|
7
|
+
export declare function estimateTokensSaved(sources: Memory[], merged: MergedMemory): number;
|
|
8
|
+
export declare function calculateProjectTokenSavings(projectId: string): Promise<{
|
|
9
|
+
totalSaved: number;
|
|
10
|
+
mergeCount: number;
|
|
11
|
+
avgSavingsPerMerge: number;
|
|
12
|
+
tokenSavingPercentage: number;
|
|
13
|
+
totalMemoryTokens: number;
|
|
14
|
+
}>;
|
|
15
|
+
/**
|
|
16
|
+
* Format token counts for display
|
|
17
|
+
*
|
|
18
|
+
* Converts token count to human-readable format with context usage
|
|
19
|
+
*/
|
|
20
|
+
export declare function formatTokenCount(tokens: number): string;
|
|
21
|
+
/**
|
|
22
|
+
* Format savings report
|
|
23
|
+
*/
|
|
24
|
+
export declare function formatSavingsReport(savings: {
|
|
25
|
+
totalSaved: number;
|
|
26
|
+
mergeCount: number;
|
|
27
|
+
avgSavingsPerMerge: number;
|
|
28
|
+
tokenSavingPercentage: number;
|
|
29
|
+
totalMemoryTokens: number;
|
|
30
|
+
}): string;
|
|
31
|
+
/**
|
|
32
|
+
* Estimate savings for a proposed merge (preview)
|
|
33
|
+
*
|
|
34
|
+
* Used in merge preview to show user estimated savings
|
|
35
|
+
*/
|
|
36
|
+
export declare function estimateMergeSavingsPreview(sources: Memory[], merged: MergedMemory): {
|
|
37
|
+
savedTokens: number;
|
|
38
|
+
savedPercentage: number;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Get token statistics for a set of memories
|
|
42
|
+
*/
|
|
43
|
+
export declare function getTokenStatistics(memories: Memory[]): {
|
|
44
|
+
total: number;
|
|
45
|
+
min: number;
|
|
46
|
+
max: number;
|
|
47
|
+
average: number;
|
|
48
|
+
median: number;
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=token-estimator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-estimator.d.ts","sourceRoot":"","sources":["../../../../algorithms/merge/analytics/token-estimator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAwDtE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAMnF;AAED,wBAAsB,4BAA4B,CAChD,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IACT,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC,CAuCD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAevD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,iBAAiB,EAAE,MAAM,CAAC;CAC3B,GAAG,MAAM,CAkBT;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,EAAE,YAAY,GACnB;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,CAOlD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,CAmBA"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token estimation for calculating context window savings from merges.
|
|
3
|
+
* Uses simple heuristic: 1 token ≈ 4 characters (can be upgraded to tiktoken for accuracy).
|
|
4
|
+
*/
|
|
5
|
+
import { getDb } from '../../../db/index.js';
|
|
6
|
+
import { getSchema } from '../../../db/schema.js';
|
|
7
|
+
import { createDatabaseClient } from '../../../core/database.js';
|
|
8
|
+
import { eq } from 'drizzle-orm';
|
|
9
|
+
function estimateTokensSimple(text) {
|
|
10
|
+
if (!text)
|
|
11
|
+
return 0;
|
|
12
|
+
return Math.ceil(text.length / 4);
|
|
13
|
+
}
|
|
14
|
+
function estimateMetadataOverhead() {
|
|
15
|
+
return 25;
|
|
16
|
+
}
|
|
17
|
+
function estimateMemoryTokens(memory) {
|
|
18
|
+
let tokens = 0;
|
|
19
|
+
tokens += estimateTokensSimple(memory.content);
|
|
20
|
+
if (memory.summary) {
|
|
21
|
+
tokens += estimateTokensSimple(memory.summary);
|
|
22
|
+
}
|
|
23
|
+
if (memory.tags && memory.tags.length > 0) {
|
|
24
|
+
tokens += estimateTokensSimple(memory.tags.join(' '));
|
|
25
|
+
}
|
|
26
|
+
if (memory.metadata) {
|
|
27
|
+
tokens += estimateTokensSimple(JSON.stringify(memory.metadata));
|
|
28
|
+
}
|
|
29
|
+
tokens += estimateMetadataOverhead();
|
|
30
|
+
return tokens;
|
|
31
|
+
}
|
|
32
|
+
function estimateMergedMemoryTokens(merged) {
|
|
33
|
+
let tokens = 0;
|
|
34
|
+
tokens += estimateTokensSimple(merged.content);
|
|
35
|
+
if (merged.summary) {
|
|
36
|
+
tokens += estimateTokensSimple(merged.summary);
|
|
37
|
+
}
|
|
38
|
+
if (merged.tags && merged.tags.length > 0) {
|
|
39
|
+
tokens += estimateTokensSimple(merged.tags.join(' '));
|
|
40
|
+
}
|
|
41
|
+
tokens += estimateTokensSimple(JSON.stringify(merged.metadata));
|
|
42
|
+
tokens += estimateMetadataOverhead();
|
|
43
|
+
return tokens;
|
|
44
|
+
}
|
|
45
|
+
export function estimateTokensSaved(sources, merged) {
|
|
46
|
+
const sourceTokens = sources.reduce((sum, memory) => sum + estimateMemoryTokens(memory), 0);
|
|
47
|
+
const mergedTokens = estimateMergedMemoryTokens(merged);
|
|
48
|
+
const savings = sourceTokens - mergedTokens;
|
|
49
|
+
return Math.max(0, savings);
|
|
50
|
+
}
|
|
51
|
+
export async function calculateProjectTokenSavings(projectId) {
|
|
52
|
+
const db = createDatabaseClient(await getDb());
|
|
53
|
+
const schema = await getSchema();
|
|
54
|
+
const memories = await db
|
|
55
|
+
.select()
|
|
56
|
+
.from(schema.memories)
|
|
57
|
+
.where(eq(schema.memories.projectId, projectId));
|
|
58
|
+
const totalMemoryTokens = memories.reduce((sum, m) => sum + estimateMemoryTokens(m), 0);
|
|
59
|
+
if (!schema.memoryMergeHistory) {
|
|
60
|
+
return {
|
|
61
|
+
totalSaved: 0,
|
|
62
|
+
mergeCount: 0,
|
|
63
|
+
avgSavingsPerMerge: 0,
|
|
64
|
+
tokenSavingPercentage: 0,
|
|
65
|
+
totalMemoryTokens,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
const mergeHistory = await db
|
|
69
|
+
.select()
|
|
70
|
+
.from(schema.memoryMergeHistory)
|
|
71
|
+
.where(eq(schema.memoryMergeHistory.projectId, projectId));
|
|
72
|
+
// Sum up token savings
|
|
73
|
+
const totalSaved = mergeHistory.reduce((sum, record) => sum + (record.tokensSaved || 0), 0);
|
|
74
|
+
const mergeCount = mergeHistory.length;
|
|
75
|
+
const avgSavingsPerMerge = mergeCount > 0 ? Math.round(totalSaved / mergeCount) : 0;
|
|
76
|
+
const tokenSavingPercentage = totalMemoryTokens > 0 ? (totalSaved / totalMemoryTokens) * 100 : 0;
|
|
77
|
+
return {
|
|
78
|
+
totalSaved,
|
|
79
|
+
mergeCount,
|
|
80
|
+
avgSavingsPerMerge,
|
|
81
|
+
tokenSavingPercentage,
|
|
82
|
+
totalMemoryTokens,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Format token counts for display
|
|
87
|
+
*
|
|
88
|
+
* Converts token count to human-readable format with context usage
|
|
89
|
+
*/
|
|
90
|
+
export function formatTokenCount(tokens) {
|
|
91
|
+
// Show percentage of typical context window
|
|
92
|
+
// Claude 3 / GPT-4: 128k tokens (~32k practical for context)
|
|
93
|
+
const contextWindow = 128000;
|
|
94
|
+
const typicalUseful = 32000;
|
|
95
|
+
const percentage = (tokens / contextWindow) * 100;
|
|
96
|
+
const usefulPercent = (tokens / typicalUseful) * 100;
|
|
97
|
+
if (tokens < 1000) {
|
|
98
|
+
return `${tokens} tokens (${percentage.toFixed(3)}% of context)`;
|
|
99
|
+
}
|
|
100
|
+
const kiloTokens = (tokens / 1000).toFixed(1);
|
|
101
|
+
return `${kiloTokens}k tokens (${usefulPercent.toFixed(1)}% of typical recall window)`;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Format savings report
|
|
105
|
+
*/
|
|
106
|
+
export function formatSavingsReport(savings) {
|
|
107
|
+
const lines = [];
|
|
108
|
+
lines.push('Memory Merge Savings Report');
|
|
109
|
+
lines.push('='.repeat(40));
|
|
110
|
+
if (savings.mergeCount === 0) {
|
|
111
|
+
lines.push('No merges completed yet');
|
|
112
|
+
return lines.join('\n');
|
|
113
|
+
}
|
|
114
|
+
lines.push(`Total Merges: ${savings.mergeCount}`);
|
|
115
|
+
lines.push(`Total Tokens Saved: ${formatTokenCount(savings.totalSaved)}`);
|
|
116
|
+
lines.push(`Avg Savings per Merge: ${formatTokenCount(savings.avgSavingsPerMerge)}`);
|
|
117
|
+
lines.push(`Reduction: ${savings.tokenSavingPercentage.toFixed(2)}%`);
|
|
118
|
+
lines.push(`Total Memory Tokens: ${formatTokenCount(savings.totalMemoryTokens)}`);
|
|
119
|
+
return lines.join('\n');
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Estimate savings for a proposed merge (preview)
|
|
123
|
+
*
|
|
124
|
+
* Used in merge preview to show user estimated savings
|
|
125
|
+
*/
|
|
126
|
+
export function estimateMergeSavingsPreview(sources, merged) {
|
|
127
|
+
const sourceTokens = sources.reduce((sum, m) => sum + estimateMemoryTokens(m), 0);
|
|
128
|
+
const mergedTokens = estimateMergedMemoryTokens(merged);
|
|
129
|
+
const savedTokens = Math.max(0, sourceTokens - mergedTokens);
|
|
130
|
+
const savedPercentage = sourceTokens > 0 ? (savedTokens / sourceTokens) * 100 : 0;
|
|
131
|
+
return { savedTokens, savedPercentage };
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Get token statistics for a set of memories
|
|
135
|
+
*/
|
|
136
|
+
export function getTokenStatistics(memories) {
|
|
137
|
+
const counts = memories.map((m) => estimateMemoryTokens(m));
|
|
138
|
+
const total = counts.reduce((a, b) => a + b, 0);
|
|
139
|
+
const min = Math.min(...counts);
|
|
140
|
+
const max = Math.max(...counts);
|
|
141
|
+
const average = Math.round(total / counts.length);
|
|
142
|
+
// Calculate median
|
|
143
|
+
const sorted = [...counts].sort((a, b) => a - b);
|
|
144
|
+
const middle = Math.floor(sorted.length / 2);
|
|
145
|
+
const median = sorted.length % 2 !== 0 ? sorted[middle] : (sorted[middle - 1] + sorted[middle]) / 2;
|
|
146
|
+
return {
|
|
147
|
+
total,
|
|
148
|
+
min,
|
|
149
|
+
max,
|
|
150
|
+
average,
|
|
151
|
+
median: Math.round(median),
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=token-estimator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-estimator.js","sourceRoot":"","sources":["../../../../algorithms/merge/analytics/token-estimator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hash-based duplicate detection filters (Stage 1).
|
|
3
|
+
* Uses SimHash and MinHash for fast approximate matching before semantic analysis.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* SimHash: Fast fingerprinting for near-duplicate detection.
|
|
7
|
+
* Tokenizes content, weights by frequency, and produces comparable hash fingerprints.
|
|
8
|
+
* Similar documents produce similar hashes with Hamming distance indicating edit distance.
|
|
9
|
+
*/
|
|
10
|
+
export declare class SimHashFilter {
|
|
11
|
+
private readonly dimensions;
|
|
12
|
+
generateHash(content: string): string;
|
|
13
|
+
hammingDistance(hash1: string, hash2: string): number;
|
|
14
|
+
findCandidates(targetHash: string, allHashes: Map<string, string>, threshold: number): string[];
|
|
15
|
+
private hashToken;
|
|
16
|
+
private popcount;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* MinHash: Estimates Jaccard similarity using character n-grams and multiple hash functions.
|
|
20
|
+
* Keeps minimum hash for each function, resulting in comparable signatures.
|
|
21
|
+
* More effective than SimHash for paraphrases. 128 functions give ~1% error margin.
|
|
22
|
+
*/
|
|
23
|
+
export declare class MinHashFilter {
|
|
24
|
+
private readonly numPermutations;
|
|
25
|
+
private readonly ngramSize;
|
|
26
|
+
generateSignature(content: string): number[];
|
|
27
|
+
jaccardSimilarity(sig1: number[], sig2: number[]): number;
|
|
28
|
+
findCandidates(targetSig: number[], allSigs: Map<string, number[]>, threshold: number): string[];
|
|
29
|
+
private generateNgrams;
|
|
30
|
+
private hashNgramWithSeed;
|
|
31
|
+
}
|
|
32
|
+
export interface Stage1CandidatePair {
|
|
33
|
+
memoryId1: string;
|
|
34
|
+
memoryId2: string;
|
|
35
|
+
simhashDistance: number;
|
|
36
|
+
minhashSimilarity: number;
|
|
37
|
+
matched: 'simhash' | 'minhash' | 'both';
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Combine SimHash and MinHash filters using union approach.
|
|
41
|
+
* Candidates pass if they match EITHER filter, casting wider net for stage 2 ranking.
|
|
42
|
+
*/
|
|
43
|
+
export declare function findCandidatePairs(memories: Map<string, string>, allSimhashes: Map<string, string>, allMinhashes: Map<string, number[]>, options: {
|
|
44
|
+
simhashThreshold?: number;
|
|
45
|
+
minhashThreshold?: number;
|
|
46
|
+
}): Stage1CandidatePair[];
|
|
47
|
+
//# sourceMappingURL=hash-filters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash-filters.d.ts","sourceRoot":"","sources":["../../../../algorithms/merge/detection/hash-filters.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;GAIG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAM;IAEjC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAuCrC,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAOrD,cAAc,CACZ,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,SAAS,EAAE,MAAM,GAChB,MAAM,EAAE;IAaX,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,QAAQ;CAQjB;AAED;;;;GAIG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAO;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAK;IAE/B,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAuB5C,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM;IAmBzD,cAAc,CACZ,SAAS,EAAE,MAAM,EAAE,EACnB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAC9B,SAAS,EAAE,MAAM,GAChB,MAAM,EAAE;IAaX,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,iBAAiB;CAU1B;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;CACzC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EACjC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EACnC,OAAO,EAAE;IACP,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,GACA,mBAAmB,EAAE,CAiDvB"}
|