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,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Folder Context Generation
|
|
3
|
+
* Generates and maintains per-folder CLAUDE.md files with session summaries
|
|
4
|
+
*/
|
|
5
|
+
import { promises as fs } from 'fs';
|
|
6
|
+
import path from 'path';
|
|
7
|
+
import { getRecentConversations } from './conversations.js';
|
|
8
|
+
import { logger } from '../../core/logger.js';
|
|
9
|
+
function formatDate(dateStr) {
|
|
10
|
+
return new Date(dateStr).toLocaleDateString('en-US', {
|
|
11
|
+
year: 'numeric',
|
|
12
|
+
month: '2-digit',
|
|
13
|
+
day: '2-digit'
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
function generateClaudeMdContent(data) {
|
|
17
|
+
const lines = [
|
|
18
|
+
`# Squish Context - ${data.projectName}`,
|
|
19
|
+
'',
|
|
20
|
+
'<squish-context>',
|
|
21
|
+
'',
|
|
22
|
+
`**Project**: ${data.projectPath}`
|
|
23
|
+
];
|
|
24
|
+
if (data.gitRemote) {
|
|
25
|
+
const gitInfo = data.gitBranch ? `${data.gitRemote} @ ${data.gitBranch}` : data.gitRemote;
|
|
26
|
+
lines.push(`**Git**: ${gitInfo}`);
|
|
27
|
+
}
|
|
28
|
+
lines.push(`**Last Updated**: ${data.lastUpdated}`, '');
|
|
29
|
+
if (data.recentConversations.length > 0) {
|
|
30
|
+
lines.push('## Recent Activity');
|
|
31
|
+
for (const conv of data.recentConversations) {
|
|
32
|
+
const date = formatDate(conv.timestamp);
|
|
33
|
+
const preview = conv.content.substring(0, 80).replace(/\n/g, ' ');
|
|
34
|
+
lines.push(`- [${date}] ${preview}...`);
|
|
35
|
+
}
|
|
36
|
+
lines.push('');
|
|
37
|
+
}
|
|
38
|
+
if (data.keyObservations.length > 0) {
|
|
39
|
+
lines.push('## Key Observations');
|
|
40
|
+
for (const obs of data.keyObservations) {
|
|
41
|
+
lines.push(`- ${obs.summary} (${obs.type})`);
|
|
42
|
+
}
|
|
43
|
+
lines.push('');
|
|
44
|
+
}
|
|
45
|
+
lines.push('## Previous Context', '*(Managed by Squish - do not edit this section)*', '', '</squish-context>', '', '<!-- You can add custom notes and project context here -->', '');
|
|
46
|
+
return lines.join('\n');
|
|
47
|
+
}
|
|
48
|
+
async function collectFolderContextData(projectPath) {
|
|
49
|
+
const recentConversations = await getRecentConversations({ n: 5, project: projectPath })
|
|
50
|
+
.catch(() => []);
|
|
51
|
+
return {
|
|
52
|
+
projectPath,
|
|
53
|
+
projectName: path.basename(projectPath),
|
|
54
|
+
recentConversations: (recentConversations || []).map((conv) => ({
|
|
55
|
+
content: conv?.summary || '',
|
|
56
|
+
timestamp: conv?.startedAt?.toISOString() || new Date().toISOString()
|
|
57
|
+
})),
|
|
58
|
+
keyObservations: [],
|
|
59
|
+
lastUpdated: new Date().toISOString()
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
async function preserveUserContent(claudeMdPath) {
|
|
63
|
+
try {
|
|
64
|
+
const existingContent = await fs.readFile(claudeMdPath, 'utf-8');
|
|
65
|
+
const match = existingContent.match(/<\/squish-context>([\s\S]*)/);
|
|
66
|
+
return match ? match[1] : '';
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return '';
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export async function generateAndInjectFolderContext(projectPath) {
|
|
73
|
+
const claudeMdPath = path.join(projectPath, 'CLAUDE.md');
|
|
74
|
+
const contextData = await collectFolderContextData(projectPath);
|
|
75
|
+
const newContent = generateClaudeMdContent(contextData);
|
|
76
|
+
const userContent = await preserveUserContent(claudeMdPath);
|
|
77
|
+
await fs.writeFile(claudeMdPath, newContent + userContent, 'utf-8');
|
|
78
|
+
logger.info(`Updated folder context: ${claudeMdPath}`);
|
|
79
|
+
}
|
|
80
|
+
export async function readFolderContext(projectPath) {
|
|
81
|
+
try {
|
|
82
|
+
const claudeMdPath = path.join(projectPath, 'CLAUDE.md');
|
|
83
|
+
const content = await fs.readFile(claudeMdPath, 'utf-8');
|
|
84
|
+
const contextMatch = content.match(/<squish-context>([\s\S]*?)<\/squish-context>/);
|
|
85
|
+
if (!contextMatch)
|
|
86
|
+
return null;
|
|
87
|
+
const contextContent = contextMatch[1];
|
|
88
|
+
const projectPathMatch = contextContent.match(/\*\*Project\*\*:\s*(.+)/);
|
|
89
|
+
const gitMatch = contextContent.match(/\*\*Git\*\*:\s*(.+)/);
|
|
90
|
+
const updatedMatch = contextContent.match(/\*\*Last Updated\*\*:\s*(.+)/);
|
|
91
|
+
return {
|
|
92
|
+
projectPath: projectPathMatch?.[1] || projectPath,
|
|
93
|
+
projectName: path.basename(projectPath),
|
|
94
|
+
gitRemote: gitMatch?.[1].split(' @')[0],
|
|
95
|
+
gitBranch: gitMatch?.[1].split('@ ')[1],
|
|
96
|
+
recentConversations: [],
|
|
97
|
+
keyObservations: [],
|
|
98
|
+
lastUpdated: updatedMatch?.[1] || new Date().toISOString()
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
export async function injectFolderContextIntoSession(projectPath) {
|
|
106
|
+
try {
|
|
107
|
+
const claudeMdPath = path.join(projectPath, 'CLAUDE.md');
|
|
108
|
+
const content = await fs.readFile(claudeMdPath, 'utf-8');
|
|
109
|
+
const match = content.match(/<squish-context>([\s\S]*?)<\/squish-context>/);
|
|
110
|
+
if (match) {
|
|
111
|
+
return `\n<squish-folder-context>\n${match[1]}\n</squish-folder-context>\n`;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// File doesn't exist or can't be read
|
|
116
|
+
}
|
|
117
|
+
return '';
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=folder-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"folder-context.js","sourceRoot":"","sources":["../../../core/search/folder-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../core/search/index.ts"],"names":[],"mappings":"AACA,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../core/search/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QMD Hybrid Search Integration
|
|
3
|
+
*
|
|
4
|
+
* Integrates QMD's BM25+vector+rerank pipeline with Squish memories.
|
|
5
|
+
* Provides enhanced search capabilities when QMD is available.
|
|
6
|
+
*
|
|
7
|
+
* QMD Search Pipeline:
|
|
8
|
+
* 1. Query Expansion (LLM generates alternative queries)
|
|
9
|
+
* 2. Parallel BM25 (FTS5) + Vector Search
|
|
10
|
+
* 3. RRF Fusion (Reciprocal Rank Fusion)
|
|
11
|
+
* 4. LLM Re-ranking (yes/no with logprobs)
|
|
12
|
+
* 5. Position-Aware Blending
|
|
13
|
+
*
|
|
14
|
+
* Installation: bun install -g qmd
|
|
15
|
+
* GitHub: https://github.com/tobi/qmd
|
|
16
|
+
*/
|
|
17
|
+
import type { SearchInput, SearchResult } from '../memory/memories.js';
|
|
18
|
+
export interface QMDSearchOptions extends SearchInput {
|
|
19
|
+
useHybrid?: boolean;
|
|
20
|
+
collection?: string;
|
|
21
|
+
includeSquishResults?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface QMDHybridSearchResult extends SearchResult {
|
|
24
|
+
qmdScore?: number;
|
|
25
|
+
source: 'squish' | 'qmd' | 'hybrid';
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Search memories using QMD's hybrid search
|
|
29
|
+
*
|
|
30
|
+
* @param options - Search options including query, type, limit, etc.
|
|
31
|
+
* @returns QMD-enhanced search results
|
|
32
|
+
*/
|
|
33
|
+
export declare function searchWithQMD(options: QMDSearchOptions): Promise<QMDHybridSearchResult[]>;
|
|
34
|
+
/**
|
|
35
|
+
* Fused search: combine Squish and QMD results
|
|
36
|
+
*
|
|
37
|
+
* Runs both searches in parallel and merges results with deduplication.
|
|
38
|
+
*
|
|
39
|
+
* @param options - Search options
|
|
40
|
+
* @returns Fused search results from both sources
|
|
41
|
+
*/
|
|
42
|
+
export declare function fusedSearch(options: QMDSearchOptions): Promise<QMDHybridSearchResult[]>;
|
|
43
|
+
/**
|
|
44
|
+
* Check if QMD is available and configured
|
|
45
|
+
*
|
|
46
|
+
* @returns true if QMD is enabled and available
|
|
47
|
+
*/
|
|
48
|
+
export declare function isQMDAvailable(): Promise<boolean>;
|
|
49
|
+
/**
|
|
50
|
+
* Get QMD status and collection info
|
|
51
|
+
*
|
|
52
|
+
* @returns QMD status or null if unavailable
|
|
53
|
+
*/
|
|
54
|
+
export declare function getQMDStatus(): Promise<{
|
|
55
|
+
available: boolean;
|
|
56
|
+
collections: Array<{
|
|
57
|
+
name: string;
|
|
58
|
+
documentCount: number;
|
|
59
|
+
}>;
|
|
60
|
+
} | null>;
|
|
61
|
+
//# sourceMappingURL=qmd-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qmd-search.d.ts","sourceRoot":"","sources":["../../../core/search/qmd-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAKvE,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,qBAAsB,SAAQ,YAAY;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,QAAQ,GAAG,KAAK,GAAG,QAAQ,CAAC;CACrC;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,qBAAqB,EAAE,CAAC,CA0DlC;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAuClC;AAmBD;;;;GAIG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAWvD;AAED;;;;GAIG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC;IAC5C,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7D,GAAG,IAAI,CAAC,CAiBR"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QMD Hybrid Search Integration
|
|
3
|
+
*
|
|
4
|
+
* Integrates QMD's BM25+vector+rerank pipeline with Squish memories.
|
|
5
|
+
* Provides enhanced search capabilities when QMD is available.
|
|
6
|
+
*
|
|
7
|
+
* QMD Search Pipeline:
|
|
8
|
+
* 1. Query Expansion (LLM generates alternative queries)
|
|
9
|
+
* 2. Parallel BM25 (FTS5) + Vector Search
|
|
10
|
+
* 3. RRF Fusion (Reciprocal Rank Fusion)
|
|
11
|
+
* 4. LLM Re-ranking (yes/no with logprobs)
|
|
12
|
+
* 5. Position-Aware Blending
|
|
13
|
+
*
|
|
14
|
+
* Installation: bun install -g qmd
|
|
15
|
+
* GitHub: https://github.com/tobi/qmd
|
|
16
|
+
*/
|
|
17
|
+
import { getQMDClient } from '../embeddings/qmd-client.js';
|
|
18
|
+
import { searchMemories } from '../memory/memories.js';
|
|
19
|
+
import { logger } from '../logger.js';
|
|
20
|
+
import { config } from '../../config.js';
|
|
21
|
+
/**
|
|
22
|
+
* Search memories using QMD's hybrid search
|
|
23
|
+
*
|
|
24
|
+
* @param options - Search options including query, type, limit, etc.
|
|
25
|
+
* @returns QMD-enhanced search results
|
|
26
|
+
*/
|
|
27
|
+
export async function searchWithQMD(options) {
|
|
28
|
+
const client = await getQMDClient();
|
|
29
|
+
if (!(await client.isAvailable())) {
|
|
30
|
+
logger.warn('QMD unavailable, falling back to Squish search');
|
|
31
|
+
// Fallback to Squish search
|
|
32
|
+
const squishResults = await searchMemories(options);
|
|
33
|
+
return squishResults.map((r) => ({
|
|
34
|
+
...r,
|
|
35
|
+
source: 'squish'
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
// Determine collection based on memory type mapping
|
|
39
|
+
const collection = options.collection || getCollectionForType(options.type);
|
|
40
|
+
try {
|
|
41
|
+
let qmdResults = [];
|
|
42
|
+
if (options.useHybrid !== false) {
|
|
43
|
+
// Use qmd_query (hybrid with reranking) - best quality
|
|
44
|
+
qmdResults = await client.query({
|
|
45
|
+
query: options.query,
|
|
46
|
+
collection,
|
|
47
|
+
limit: options.limit || 10,
|
|
48
|
+
minScore: 0.2
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
// Use qmd_vsearch (semantic only) - faster
|
|
53
|
+
qmdResults = await client.vsearch({
|
|
54
|
+
query: options.query,
|
|
55
|
+
collection,
|
|
56
|
+
limit: options.limit || 10,
|
|
57
|
+
minScore: 0.2
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
// Map QMD results to Squish format
|
|
61
|
+
return qmdResults.map((result) => ({
|
|
62
|
+
id: result.docid || result.path,
|
|
63
|
+
content: result.snippet || result.title,
|
|
64
|
+
type: options.type || 'observation',
|
|
65
|
+
tags: [],
|
|
66
|
+
projectId: options.project ? options.project : null,
|
|
67
|
+
similarity: result.score,
|
|
68
|
+
qmdScore: result.score,
|
|
69
|
+
source: 'qmd',
|
|
70
|
+
createdAt: new Date().toISOString() // QMD doesn't provide timestamps
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
logger.error(`QMD search failed: ${error}`);
|
|
75
|
+
// Fallback to Squish search
|
|
76
|
+
const squishResults = await searchMemories(options);
|
|
77
|
+
return squishResults.map((r) => ({
|
|
78
|
+
...r,
|
|
79
|
+
source: 'squish'
|
|
80
|
+
}));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Fused search: combine Squish and QMD results
|
|
85
|
+
*
|
|
86
|
+
* Runs both searches in parallel and merges results with deduplication.
|
|
87
|
+
*
|
|
88
|
+
* @param options - Search options
|
|
89
|
+
* @returns Fused search results from both sources
|
|
90
|
+
*/
|
|
91
|
+
export async function fusedSearch(options) {
|
|
92
|
+
const client = await getQMDClient();
|
|
93
|
+
const qmdAvailable = await client.isAvailable();
|
|
94
|
+
// Run searches in parallel
|
|
95
|
+
const results = await Promise.allSettled([
|
|
96
|
+
searchMemories(options),
|
|
97
|
+
qmdAvailable ? searchWithQMD({ ...options, includeSquishResults: false }) : []
|
|
98
|
+
]);
|
|
99
|
+
const squishResults = results[0].status === 'fulfilled'
|
|
100
|
+
? results[0].value.map((r) => ({ ...r, source: 'squish' }))
|
|
101
|
+
: [];
|
|
102
|
+
const qmdResults = results[1].status === 'fulfilled'
|
|
103
|
+
? results[1].value
|
|
104
|
+
: [];
|
|
105
|
+
// Deduplicate by content similarity
|
|
106
|
+
const seenContent = new Set();
|
|
107
|
+
const merged = [];
|
|
108
|
+
for (const result of [...squishResults, ...qmdResults]) {
|
|
109
|
+
// Create a content key for deduplication (first 100 chars)
|
|
110
|
+
const contentKey = result.content.substring(0, 100);
|
|
111
|
+
if (!seenContent.has(contentKey)) {
|
|
112
|
+
seenContent.add(contentKey);
|
|
113
|
+
merged.push(result);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Re-rank by combined score
|
|
117
|
+
merged.sort((a, b) => {
|
|
118
|
+
const scoreA = (a.similarity || 0) + (a.qmdScore || 0) / 2;
|
|
119
|
+
const scoreB = (b.similarity || 0) + (b.qmdScore || 0) / 2;
|
|
120
|
+
return scoreB - scoreA;
|
|
121
|
+
});
|
|
122
|
+
return merged.slice(0, options.limit || 10);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Get QMD collection name for a memory type
|
|
126
|
+
*
|
|
127
|
+
* Uses the configured collection mapping from config.
|
|
128
|
+
*
|
|
129
|
+
* @param type - Memory type (observation, fact, decision, context, preference)
|
|
130
|
+
* @returns QMD collection name
|
|
131
|
+
*/
|
|
132
|
+
function getCollectionForType(type) {
|
|
133
|
+
if (!type) {
|
|
134
|
+
return 'squish-all';
|
|
135
|
+
}
|
|
136
|
+
const mapping = config.qmdCollectionMapping || {};
|
|
137
|
+
return mapping[type] || `squish-${type}`;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Check if QMD is available and configured
|
|
141
|
+
*
|
|
142
|
+
* @returns true if QMD is enabled and available
|
|
143
|
+
*/
|
|
144
|
+
export async function isQMDAvailable() {
|
|
145
|
+
if (!config.qmdEnabled) {
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
try {
|
|
149
|
+
const client = await getQMDClient();
|
|
150
|
+
return await client.isAvailable();
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Get QMD status and collection info
|
|
158
|
+
*
|
|
159
|
+
* @returns QMD status or null if unavailable
|
|
160
|
+
*/
|
|
161
|
+
export async function getQMDStatus() {
|
|
162
|
+
try {
|
|
163
|
+
const client = await getQMDClient();
|
|
164
|
+
const available = await client.isAvailable();
|
|
165
|
+
if (!available) {
|
|
166
|
+
return { available: false, collections: [] };
|
|
167
|
+
}
|
|
168
|
+
const status = await client.status();
|
|
169
|
+
return {
|
|
170
|
+
available: true,
|
|
171
|
+
collections: status?.collections || []
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=qmd-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qmd-search.js","sourceRoot":"","sources":["../../../core/search/qmd-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Secret Detector
|
|
3
|
+
* Pattern-based detection of API keys, tokens, and credentials
|
|
4
|
+
*/
|
|
5
|
+
export interface SecretMatch {
|
|
6
|
+
type: string;
|
|
7
|
+
pattern: string;
|
|
8
|
+
value: string;
|
|
9
|
+
start: number;
|
|
10
|
+
end: number;
|
|
11
|
+
confidence: 'high' | 'medium' | 'low';
|
|
12
|
+
}
|
|
13
|
+
type Confidence = SecretMatch['confidence'];
|
|
14
|
+
interface PatternConfig {
|
|
15
|
+
pattern: RegExp;
|
|
16
|
+
type: string;
|
|
17
|
+
confidence: Confidence;
|
|
18
|
+
}
|
|
19
|
+
export declare function detectSecrets(text: string, minConfidence?: Confidence): SecretMatch[];
|
|
20
|
+
export declare function likelyContainsSecrets(text: string): boolean;
|
|
21
|
+
export declare function getSecretSummary(text: string): {
|
|
22
|
+
count: number;
|
|
23
|
+
types: string[];
|
|
24
|
+
};
|
|
25
|
+
export declare function redactSecrets(text: string, replacement?: string): string;
|
|
26
|
+
export declare const SECRET_PATTERNS: {
|
|
27
|
+
high: PatternConfig[];
|
|
28
|
+
medium: PatternConfig[];
|
|
29
|
+
low: PatternConfig[];
|
|
30
|
+
};
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=secret-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-detector.d.ts","sourceRoot":"","sources":["../../core/secret-detector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CACvC;AAED,KAAK,UAAU,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;AAE5C,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,UAAU,CAAC;CACxB;AAkDD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,GAAE,UAAqB,GAAG,WAAW,EAAE,CAqB/F;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAMjF;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,SAAe,GAAG,MAAM,CAU9E;AAED,eAAO,MAAM,eAAe;;;;CAI3B,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Secret Detector
|
|
3
|
+
* Pattern-based detection of API keys, tokens, and credentials
|
|
4
|
+
*/
|
|
5
|
+
const HIGH_CONFIDENCE_PATTERNS = [
|
|
6
|
+
{ pattern: /(?:AKIA|ASIA)[0-9A-Z]{16}/g, type: 'aws_access_key', confidence: 'high' },
|
|
7
|
+
{ pattern: /aws_secret_access_key\s*=\s*[^\s]+/gi, type: 'aws_secret_key', confidence: 'high' },
|
|
8
|
+
{ pattern: /-----BEGIN (?:RSA|OPENSSH|PRIVATE) KEY-----/g, type: 'ssh_private_key', confidence: 'high' },
|
|
9
|
+
{ pattern: /-----BEGIN PGP PRIVATE KEY BLOCK-----/g, type: 'gpg_private_key', confidence: 'high' },
|
|
10
|
+
{ pattern: /AIza[0-9A-Za-z\-_]{35}/g, type: 'google_api_key', confidence: 'high' },
|
|
11
|
+
{ pattern: /gh[pousr]_[A-Za-z0-9_]{36,255}/g, type: 'github_token', confidence: 'high' },
|
|
12
|
+
{ pattern: /xox[baprs]-[0-9]{10,13}-[0-9]{10,13}-[A-Za-z0-9_-]{24,34}/g, type: 'slack_token', confidence: 'high' },
|
|
13
|
+
{ pattern: /sk_live_[0-9a-zA-Z]{20,}/g, type: 'stripe_api_key', confidence: 'high' },
|
|
14
|
+
{ pattern: /(mongodb|postgres|mysql|redis|cassandra):\/\/[^\s]+@[^\s]+/gi, type: 'database_url', confidence: 'high' }
|
|
15
|
+
];
|
|
16
|
+
const MEDIUM_CONFIDENCE_PATTERNS = [
|
|
17
|
+
{ pattern: /(?:api[_-]?key|apikey|api_secret|secret_key)\s*[:=]\s*['""`]?[A-Za-z0-9_-]{20,}['""`]?/gi, type: 'api_key', confidence: 'medium' },
|
|
18
|
+
{ pattern: /bearer\s+[A-Za-z0-9._-]+/gi, type: 'bearer_token', confidence: 'medium' },
|
|
19
|
+
{ pattern: /eyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/g, type: 'jwt_token', confidence: 'medium' },
|
|
20
|
+
{ pattern: /basic\s+[A-Za-z0-9+/=]+/gi, type: 'basic_auth', confidence: 'medium' },
|
|
21
|
+
{ pattern: /(?:password|passwd|pwd)\s*[:=]\s*['""`]?[^\s'""`]+['""`]?/gi, type: 'password', confidence: 'medium' },
|
|
22
|
+
{ pattern: /(?:connection_string|connstr|conn_string)\s*[:=]\s*['""`][^'""`]+['""`]/gi, type: 'connection_string', confidence: 'medium' }
|
|
23
|
+
];
|
|
24
|
+
const LOW_CONFIDENCE_PATTERNS = [
|
|
25
|
+
{ pattern: /\b(?:token|auth_token|access_token|refresh_token)\b/gi, type: 'token_reference', confidence: 'low' },
|
|
26
|
+
{ pattern: /\b(?:secret|secret_key|api_secret|client_secret)\b/gi, type: 'secret_reference', confidence: 'low' },
|
|
27
|
+
{ pattern: /\b(?:credential|cred|credentials)\b/gi, type: 'credential_reference', confidence: 'low' }
|
|
28
|
+
];
|
|
29
|
+
const CONFIDENCE_LEVELS = { high: 3, medium: 2, low: 1 };
|
|
30
|
+
function findMatches(text, config) {
|
|
31
|
+
const regex = new RegExp(config.pattern.source, config.pattern.flags);
|
|
32
|
+
const matches = [];
|
|
33
|
+
let match;
|
|
34
|
+
while ((match = regex.exec(text)) !== null) {
|
|
35
|
+
matches.push({
|
|
36
|
+
type: config.type,
|
|
37
|
+
pattern: config.pattern.source,
|
|
38
|
+
value: match[0],
|
|
39
|
+
start: match.index,
|
|
40
|
+
end: match.index + match[0].length,
|
|
41
|
+
confidence: config.confidence
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
return matches;
|
|
45
|
+
}
|
|
46
|
+
export function detectSecrets(text, minConfidence = 'medium') {
|
|
47
|
+
const minLevel = CONFIDENCE_LEVELS[minConfidence];
|
|
48
|
+
const matches = [];
|
|
49
|
+
for (const config of HIGH_CONFIDENCE_PATTERNS) {
|
|
50
|
+
matches.push(...findMatches(text, config));
|
|
51
|
+
}
|
|
52
|
+
if (minLevel <= 2) {
|
|
53
|
+
for (const config of MEDIUM_CONFIDENCE_PATTERNS) {
|
|
54
|
+
matches.push(...findMatches(text, config));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (minLevel <= 1) {
|
|
58
|
+
for (const config of LOW_CONFIDENCE_PATTERNS) {
|
|
59
|
+
matches.push(...findMatches(text, config));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return matches;
|
|
63
|
+
}
|
|
64
|
+
export function likelyContainsSecrets(text) {
|
|
65
|
+
return detectSecrets(text, 'high').length > 0;
|
|
66
|
+
}
|
|
67
|
+
export function getSecretSummary(text) {
|
|
68
|
+
const secrets = detectSecrets(text);
|
|
69
|
+
return {
|
|
70
|
+
count: secrets.length,
|
|
71
|
+
types: [...new Set(secrets.map(s => s.type))]
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
export function redactSecrets(text, replacement = '[REDACTED]') {
|
|
75
|
+
const secrets = detectSecrets(text, 'high');
|
|
76
|
+
let result = text;
|
|
77
|
+
const sorted = [...secrets].sort((a, b) => b.start - a.start);
|
|
78
|
+
for (const secret of sorted) {
|
|
79
|
+
result = result.substring(0, secret.start) + replacement + result.substring(secret.end);
|
|
80
|
+
}
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
export const SECRET_PATTERNS = {
|
|
84
|
+
high: HIGH_CONFIDENCE_PATTERNS,
|
|
85
|
+
medium: MEDIUM_CONFIDENCE_PATTERNS,
|
|
86
|
+
low: LOW_CONFIDENCE_PATTERNS
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=secret-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-detector.js","sourceRoot":"","sources":["../../core/secret-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../../../core/snapshots/cleanup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,aAAa,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAEpF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Snapshot Cleanup Operations
|
|
3
|
+
* Maintenance and cleanup for snapshot data
|
|
4
|
+
*/
|
|
5
|
+
import { cleanupOldMemorySnapshots } from '../utils/cleanup-operations.js';
|
|
6
|
+
/**
|
|
7
|
+
* Delete old snapshots
|
|
8
|
+
*/
|
|
9
|
+
export async function deleteOldSnapshots(olderThanDays = 90) {
|
|
10
|
+
return cleanupOldMemorySnapshots(olderThanDays);
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=cleanup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../../core/snapshots/cleanup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAE3E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,gBAAwB,EAAE;IACjE,OAAO,yBAAyB,CAAC,aAAa,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Snapshot Comparison Operations
|
|
3
|
+
* Functions for comparing and diffing snapshots
|
|
4
|
+
*/
|
|
5
|
+
export interface MemoryDiff {
|
|
6
|
+
added?: string[];
|
|
7
|
+
removed?: string[];
|
|
8
|
+
changed?: Record<string, {
|
|
9
|
+
from: unknown;
|
|
10
|
+
to: unknown;
|
|
11
|
+
}>;
|
|
12
|
+
}
|
|
13
|
+
export declare function calculateDiff(before: string, after: string): MemoryDiff;
|
|
14
|
+
export declare function compareSnapshots(snapshotId1: string, snapshotId2: string): Promise<{
|
|
15
|
+
diff: MemoryDiff;
|
|
16
|
+
contextBefore: string;
|
|
17
|
+
contextAfter: string;
|
|
18
|
+
}>;
|
|
19
|
+
//# sourceMappingURL=comparison.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comparison.d.ts","sourceRoot":"","sources":["../../../core/snapshots/comparison.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,EAAE,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAC1D;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,CAcvE;AAED,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAkB5E"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Snapshot Comparison Operations
|
|
3
|
+
* Functions for comparing and diffing snapshots
|
|
4
|
+
*/
|
|
5
|
+
import { getMemorySnapshot } from './retrieval.js';
|
|
6
|
+
import { logger } from '../logger.js';
|
|
7
|
+
export function calculateDiff(before, after) {
|
|
8
|
+
const beforeLines = before.split('\n');
|
|
9
|
+
const afterLines = after.split('\n');
|
|
10
|
+
const beforeSet = new Set(beforeLines);
|
|
11
|
+
const afterSet = new Set(afterLines);
|
|
12
|
+
const added = afterLines.filter(line => !beforeSet.has(line));
|
|
13
|
+
const removed = beforeLines.filter(line => !afterSet.has(line));
|
|
14
|
+
return {
|
|
15
|
+
added: added.length > 0 ? added : undefined,
|
|
16
|
+
removed: removed.length > 0 ? removed : undefined,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export async function compareSnapshots(snapshotId1, snapshotId2) {
|
|
20
|
+
try {
|
|
21
|
+
const snap1 = await getMemorySnapshot(snapshotId1);
|
|
22
|
+
const snap2 = await getMemorySnapshot(snapshotId2);
|
|
23
|
+
if (!snap1 || !snap2) {
|
|
24
|
+
throw new Error('One or both snapshots not found');
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
diff: calculateDiff(snap1.content, snap2.content),
|
|
28
|
+
contextBefore: snap1.content.substring(0, 200),
|
|
29
|
+
contextAfter: snap2.content.substring(0, 200),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
logger.error('Error comparing snapshots', error);
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=comparison.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comparison.js","sourceRoot":"","sources":["../../../core/snapshots/comparison.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAQtC,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,KAAa;IACzD,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAErC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IAErC,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAEhE,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;QAC3C,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;KAClD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,WAAmB,EACnB,WAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,WAAW,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAEnD,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QAED,OAAO;YACL,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC;YACjD,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;YAC9C,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;SAC9C,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|