squish-memory 1.1.5 → 1.2.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/.env.example +32 -16
- package/CHANGELOG.md +147 -0
- package/README.md +120 -78
- package/{scripts → bin}/dependency-manager.mjs +217 -217
- package/{scripts → bin}/detect-clients.mjs +78 -78
- package/bin/install-interactive.mjs +321 -0
- package/bin/squish-mcp.mjs +46 -0
- package/bin/squish.mjs +33 -0
- package/config/mcp-migration-map.json +1 -6
- package/config/mcp-mode-semantics.json +19 -23
- package/config/mcp-remote-auth.json +3 -26
- package/config/mcp-universal.schema.json +5 -35
- package/config/settings.json +107 -52
- package/config.js +5 -0
- package/config.ts +218 -0
- package/core/adapters/config/claude-code.ts +133 -0
- package/core/adapters/config/cursor.ts +90 -0
- package/core/adapters/config/opencode.ts +89 -0
- package/core/adapters/config/windsurf.ts +90 -0
- package/core/adapters/index.ts +102 -0
- package/core/adapters/timeline.ts +116 -0
- package/core/adapters/types.ts +166 -0
- package/core/agent-preferences.ts +140 -0
- package/core/algorithms/analytics/token-estimator.ts +216 -0
- package/core/algorithms/detection/hash-filters.ts +260 -0
- package/core/algorithms/detection/semantic-ranker.ts +194 -0
- package/core/algorithms/detection/two-stage-detector.ts +421 -0
- package/core/algorithms/handlers/approve-merge.ts +215 -0
- package/core/algorithms/handlers/detect-duplicates.ts +192 -0
- package/core/algorithms/handlers/get-stats.ts +132 -0
- package/core/algorithms/handlers/list-proposals.ts +130 -0
- package/core/algorithms/handlers/preview-merge.ts +139 -0
- package/core/algorithms/handlers/reject-merge.ts +93 -0
- package/core/algorithms/handlers/reverse-merge.ts +155 -0
- package/core/algorithms/index.ts +39 -0
- package/core/algorithms/operations/cache-maintenance.ts +182 -0
- package/core/algorithms/safety/safety-checks.ts +256 -0
- package/core/algorithms/strategies/merge-strategies.ts +381 -0
- package/core/algorithms/types.ts +140 -0
- package/core/algorithms/utils/response-builder.ts +61 -0
- package/core/associations.ts +363 -0
- package/core/beliefs/decay.ts +289 -0
- package/core/beliefs/extractor.ts +131 -0
- package/core/beliefs/store.ts +557 -0
- package/core/beliefs/types.ts +38 -0
- package/core/commands/mcp-server.ts +5 -0
- package/core/compression.ts +177 -0
- package/core/config.js +2 -0
- package/core/consolidation.ts +330 -0
- package/core/context/agent-context.ts +388 -0
- package/core/context/context-paging.ts +449 -0
- package/core/context/context-window.ts +234 -0
- package/core/context/context.ts +35 -0
- package/core/embeddings/embeddings.ts +616 -0
- package/core/embeddings/google-multimodal.ts +200 -0
- package/{dist/core/local-embeddings.js → core/embeddings/local-embeddings.ts} +12 -11
- package/core/embeddings/qmd-client.ts +495 -0
- package/core/embeddings/transformers-local.ts +261 -0
- package/core/embeddings.js +4 -0
- package/core/error-handling.ts +206 -0
- package/core/external +219 -0
- package/core/graph/entity-deduplicator.ts +232 -0
- package/core/graph/graph-builder.ts +257 -0
- package/core/graph/graph-traversal.ts +490 -0
- package/core/graph/index.ts +24 -0
- package/core/graph/llm-entity-extractor.ts +402 -0
- package/core/graph/multi-hop-retrieval.ts +317 -0
- package/core/graph/relationship-extractor.ts +465 -0
- package/core/hooks/agent-hooks.ts +653 -0
- package/core/hooks/auto-tagger.ts +149 -0
- package/core/hooks/capture-filter.ts +169 -0
- package/core/hot-cache.ts +388 -0
- package/core/index.ts +10 -0
- package/core/ingestion/agent-memory.ts +167 -0
- package/core/ingestion/core-memory.ts +326 -0
- package/core/ingestion/learnings.ts +260 -0
- package/core/ingestion/signal-engine.ts +266 -0
- package/core/integrations/obsidian-vault.ts +197 -0
- package/core/layers/generator.ts +115 -0
- package/core/lib/db-client.ts +168 -0
- package/core/lib/parse-embedding.ts +59 -0
- package/core/lib/schemas.ts +102 -0
- package/core/lib/types.ts +49 -0
- package/core/lib/utils.ts +151 -0
- package/core/lib/validation.ts +180 -0
- package/core/lifecycle.ts +353 -0
- package/core/logger.ts +59 -0
- package/core/memory/bridge-discovery.ts +395 -0
- package/core/memory/categorizer.ts +390 -0
- package/core/memory/conflict-detector.ts +62 -0
- package/core/memory/consolidation.ts +372 -0
- package/core/memory/context-collector.ts +75 -0
- package/core/memory/contradiction-resolver.ts +494 -0
- package/core/memory/edit-workflow.ts +174 -0
- package/core/memory/entity-extractor.ts +426 -0
- package/core/memory/entity-resolver.ts +89 -0
- package/core/memory/explain.ts +112 -0
- package/core/memory/fact-deriver.ts +300 -0
- package/core/memory/fact-extractor.ts +120 -0
- package/core/memory/feedback-tracker.ts +200 -0
- package/core/memory/hooks.ts +230 -0
- package/core/memory/hybrid-retrieval.ts +65 -0
- package/core/memory/hybrid-scorer.ts +325 -0
- package/core/memory/hybrid-search.ts +748 -0
- package/core/memory/importance.ts +319 -0
- package/core/memory/index.ts +11 -0
- package/core/memory/loader.ts +178 -0
- package/core/memory/markdown/markdown-storage.ts +318 -0
- package/core/memory/memories.ts +565 -0
- package/core/memory/memory-lifecycle.ts +51 -0
- package/core/memory/memory-manager.ts +53 -0
- package/core/memory/migrate.ts +173 -0
- package/core/memory/normalization.ts +30 -0
- package/core/memory/path-strengthener.ts +211 -0
- package/core/memory/progressive-disclosure.ts +392 -0
- package/core/memory/query-processor.ts +130 -0
- package/core/memory/query-rewriter.ts +153 -0
- package/core/memory/response-analyzer.ts +81 -0
- package/core/memory/retrieval-feedback.ts +276 -0
- package/core/memory/serialization.ts +83 -0
- package/core/memory/stale-cleaner.ts +147 -0
- package/core/memory/stats.ts +181 -0
- package/core/memory/telemetry.ts +392 -0
- package/core/memory/temporal-facts.ts +356 -0
- package/core/memory/temporal-parser.ts +477 -0
- package/core/memory/trigger-detector.ts +104 -0
- package/core/memory/write-gate.ts +288 -0
- package/core/places/index.ts +14 -0
- package/core/places/memory-places.ts +339 -0
- package/core/places/places.ts +406 -0
- package/core/places/rules.ts +308 -0
- package/core/places/walking.ts +192 -0
- package/core/projects +89 -0
- package/core/projects.ts +131 -0
- package/core/redis.ts +82 -0
- package/core/responses.ts +187 -0
- package/core/runtime/trust-report.ts +195 -0
- package/core/runtime/trust-state.ts +360 -0
- package/core/scheduler/cron-scheduler.ts +581 -0
- package/core/scheduler/heartbeat.ts +91 -0
- package/core/scheduler/index.ts +8 -0
- package/core/scheduler/job-runner.ts +197 -0
- package/core/search/conversations.ts +166 -0
- package/core/search/entities.ts +46 -0
- package/core/search/folder-context.ts +154 -0
- package/core/search/graph-boost.ts +22 -0
- package/core/search/index.ts +4 -0
- package/core/search/qmd-wrapper.ts +84 -0
- package/core/security/encrypt.ts +51 -0
- package/core/security/governance.ts +102 -0
- package/core/security/privacy.ts +108 -0
- package/core/security/secret-detector.ts +122 -0
- package/core/session/auto-load.ts +160 -0
- package/core/session/entity-tracker.ts +363 -0
- package/core/session/index.ts +7 -0
- package/core/session/reference-resolver.ts +158 -0
- package/core/session/self-iteration-job.ts +478 -0
- package/core/session/session-hooks.ts +69 -0
- package/core/session/types.ts +36 -0
- package/core/session/working-set.ts +275 -0
- package/core/snapshots/cleanup.ts +13 -0
- package/core/snapshots/comparison.ts +59 -0
- package/core/snapshots/creation.ts +139 -0
- package/core/snapshots/retrieval.ts +44 -0
- package/core/snapshots/stats.ts +63 -0
- package/core/storage/cache.ts +241 -0
- package/core/storage/database.ts +23 -0
- package/core/summarization/cleanup.ts +13 -0
- package/core/summarization/queries.ts +32 -0
- package/core/summarization/stats.ts +64 -0
- package/core/summarization/strategies.ts +52 -0
- package/core/summarization.ts +248 -0
- package/core/temporal-facts.ts +244 -0
- package/core/tracing/collector.ts +470 -0
- package/core/tracing/visualizer.ts +195 -0
- package/core/utils/cleanup-operations.ts +50 -0
- package/core/utils/content-extraction.ts +95 -0
- package/core/utils/filter-builder.ts +56 -0
- package/core/utils/history-traversal.ts +63 -0
- package/core/utils/memory-operations.ts +56 -0
- package/core/utils/query-operations.ts +83 -0
- package/core/utils/summarization-helpers.ts +45 -0
- package/core/utils/temporal-queries.ts +39 -0
- package/core/utils/vector-operations.ts +135 -0
- package/core/utils/version-management.ts +74 -0
- package/core/worker.ts +324 -0
- package/db/adapter.ts +215 -0
- package/db/bootstrap.ts +1055 -0
- package/db/drizzle/migrations/0000_needy_cerebro.sql +402 -0
- package/db/drizzle/migrations/meta/0000_snapshot.json +3451 -0
- package/db/drizzle/migrations/meta/_journal.json +13 -0
- package/db/drizzle/schema-sqlite.ts +1032 -0
- package/db/drizzle/schema.ts +1128 -0
- package/db/drizzle.config.ts +12 -0
- package/db/index.ts +83 -0
- package/db/init.sql +5 -0
- package/db/migrations/associations.ts +35 -0
- package/db/migrations/beliefs.ts +89 -0
- package/db/migrations/core-memory.ts +35 -0
- package/db/migrations/fts.ts +59 -0
- package/db/migrations/index.ts +54 -0
- package/db/migrations/indexes.ts +36 -0
- package/db/migrations/learnings.ts +34 -0
- package/db/migrations/maintenance.ts +68 -0
- package/db/migrations/memories.ts +22 -0
- package/db/migrations/memory-places.ts +35 -0
- package/db/migrations/places.ts +49 -0
- package/db/migrations/projects.ts +21 -0
- package/db/migrations/tier-conversion.ts +24 -0
- package/db/neon.ts +22 -0
- package/db/schema/beliefs.ts +50 -0
- package/db/schema/generator.ts +159 -0
- package/db/schema/index.ts +58 -0
- package/db/schema/learnings.ts +32 -0
- package/db/schema/memories.ts +83 -0
- package/db/schema/projects.ts +33 -0
- package/db/schema.ts +13 -0
- package/db/supabase.ts +27 -0
- package/dist/config.d.ts +40 -17
- package/dist/config.js +150 -198
- package/dist/core/adapters/types.d.ts +13 -33
- package/dist/core/adapters/types.js +1 -1
- package/dist/core/agent-preferences.d.ts +16 -0
- package/dist/core/agent-preferences.js +124 -0
- package/dist/core/algorithms/safety/safety-checks.d.ts +1 -5
- package/dist/core/algorithms/types.d.ts +0 -8
- package/dist/core/associations.d.ts +3 -1
- package/dist/core/associations.js +37 -1
- package/dist/core/beliefs/decay.d.ts +27 -0
- package/dist/core/beliefs/decay.js +217 -0
- package/dist/core/beliefs/extractor.d.ts +9 -0
- package/dist/core/beliefs/extractor.js +113 -0
- package/dist/core/beliefs/store.d.ts +46 -0
- package/dist/core/beliefs/store.js +466 -0
- package/dist/core/beliefs/types.d.ts +28 -0
- package/dist/core/beliefs/types.js +2 -0
- package/dist/core/commands/mcp-server.d.ts +0 -1
- package/dist/core/commands/mcp-server.js +4 -737
- package/dist/core/commands/remember.d.ts +24 -0
- package/dist/core/commands/remember.js +144 -0
- package/dist/core/{toon.d.ts → compression.d.ts} +6 -4
- package/dist/core/{toon.js → compression.js} +8 -8
- package/dist/core/context/agent-context.js +1 -1
- package/dist/core/embeddings/embeddings.d.ts +29 -0
- package/dist/core/embeddings/embeddings.js +546 -0
- package/dist/core/embeddings/google-multimodal.js +6 -2
- package/dist/core/{local-embeddings.d.ts → embeddings/local-embeddings.d.ts} +1 -1
- package/dist/core/embeddings/local-embeddings.js +11 -0
- package/dist/core/embeddings/qmd-client.js +1 -1
- package/dist/core/embeddings/transformers-local.d.ts +64 -0
- package/dist/core/embeddings/transformers-local.js +213 -0
- package/dist/core/embeddings.d.ts +1 -28
- package/dist/core/embeddings.js +2 -453
- package/dist/core/graph/entity-deduplicator.d.ts +24 -0
- package/dist/core/graph/entity-deduplicator.js +183 -0
- package/dist/core/graph/graph-builder.d.ts +46 -0
- package/dist/core/graph/graph-builder.js +174 -0
- package/dist/core/graph/graph-traversal.d.ts +80 -0
- package/dist/core/graph/graph-traversal.js +315 -0
- package/dist/core/graph/index.d.ts +19 -0
- package/dist/core/graph/index.js +13 -0
- package/dist/core/graph/llm-entity-extractor.d.ts +49 -0
- package/dist/core/graph/llm-entity-extractor.js +313 -0
- package/dist/core/graph/multi-hop-retrieval.d.ts +48 -0
- package/dist/core/graph/multi-hop-retrieval.js +215 -0
- package/dist/core/graph/relationship-extractor.d.ts +48 -0
- package/dist/core/graph/relationship-extractor.js +351 -0
- package/dist/core/hooks/agent-hooks.d.ts +10 -1
- package/dist/core/hooks/agent-hooks.js +301 -24
- package/dist/core/hot-cache.d.ts +86 -0
- package/dist/core/hot-cache.js +285 -0
- package/dist/core/index.d.ts +9 -9
- package/dist/core/index.js +9 -12
- package/dist/core/ingestion/core-memory.d.ts +2 -2
- package/dist/core/ingestion/core-memory.js +3 -3
- package/dist/core/ingestion/learnings.js +3 -0
- package/dist/core/ingestion/signal-engine.d.ts +41 -0
- package/dist/core/ingestion/signal-engine.js +201 -0
- package/dist/core/{obsidian-vault.d.ts → integrations/obsidian-vault.d.ts} +2 -1
- package/dist/core/{obsidian-vault.js → integrations/obsidian-vault.js} +69 -7
- package/dist/core/lib/parse-embedding.d.ts +9 -0
- package/dist/core/lib/parse-embedding.js +58 -0
- package/dist/core/lib/schemas.d.ts +57 -54
- package/dist/core/lib/types.d.ts +45 -0
- package/dist/core/lib/types.js +6 -0
- package/dist/core/lib/utils.d.ts +4 -0
- package/dist/core/lib/utils.js +55 -0
- package/dist/core/lifecycle.d.ts +0 -1
- package/dist/core/lifecycle.js +13 -23
- package/dist/core/logger.d.ts +1 -0
- package/dist/core/logger.js +14 -8
- package/dist/core/mcp/tools.d.ts +0 -2
- package/dist/core/mcp/tools.js +0 -87
- package/dist/core/mcp/types.d.ts +25 -253
- package/dist/core/mcp/types.js +2 -2
- package/dist/core/memory/categorizer.js +1 -0
- package/dist/core/memory/consolidation.js +2 -28
- package/dist/core/memory/entity-extractor.d.ts +4 -0
- package/dist/core/memory/entity-extractor.js +30 -16
- package/dist/core/memory/explain.d.ts +18 -0
- package/dist/core/memory/explain.js +92 -0
- package/dist/core/memory/fact-deriver.d.ts +31 -0
- package/dist/core/memory/fact-deriver.js +236 -0
- package/dist/core/memory/hybrid-retrieval.d.ts +14 -16
- package/dist/core/memory/hybrid-retrieval.js +25 -127
- package/dist/core/memory/hybrid-scorer.js +6 -23
- package/dist/core/memory/hybrid-search.d.ts +10 -7
- package/dist/core/memory/hybrid-search.js +458 -221
- package/dist/core/memory/importance.d.ts +0 -17
- package/dist/core/memory/importance.js +1 -58
- package/dist/core/memory/index.d.ts +1 -0
- package/dist/core/memory/index.js +1 -0
- package/dist/core/memory/memories.d.ts +13 -17
- package/dist/core/memory/memories.js +78 -75
- package/dist/core/memory/memory-lifecycle.d.ts +2 -2
- package/dist/core/memory/memory-lifecycle.js +10 -18
- package/dist/core/memory/normalization.d.ts +1 -16
- package/dist/core/memory/path-strengthener.d.ts +39 -0
- package/dist/core/memory/path-strengthener.js +150 -0
- package/dist/core/memory/query-processor.js +37 -3
- package/dist/core/memory/retrieval-feedback.d.ts +70 -0
- package/dist/core/memory/retrieval-feedback.js +213 -0
- package/dist/core/memory/stale-cleaner.d.ts +26 -0
- package/dist/core/memory/stale-cleaner.js +97 -0
- package/dist/core/memory/stats.d.ts +10 -0
- package/dist/core/memory/stats.js +8 -3
- package/dist/core/memory/trigger-detector.d.ts +8 -1
- package/dist/core/memory/trigger-detector.js +42 -5
- package/dist/core/places/index.d.ts +1 -1
- package/dist/core/places/index.js +1 -1
- package/dist/core/places/places.d.ts +13 -13
- package/dist/core/places/places.js +27 -27
- package/dist/core/places/rules.js +23 -23
- package/dist/core/places/walking.d.ts +3 -3
- package/dist/core/places/walking.js +7 -7
- package/dist/core/projects.js +8 -0
- package/dist/core/runtime/trust-report.d.ts +102 -0
- package/dist/core/runtime/trust-report.js +107 -0
- package/dist/core/runtime/trust-state.d.ts +12 -0
- package/dist/core/runtime/trust-state.js +309 -0
- package/dist/core/scheduler/cron-scheduler.d.ts +1 -1
- package/dist/core/scheduler/cron-scheduler.js +164 -3
- package/dist/core/scheduler/job-runner.js +1 -1
- package/dist/core/search/qmd-wrapper.d.ts +36 -0
- package/dist/core/search/qmd-wrapper.js +58 -0
- package/dist/core/session/auto-load.js +28 -3
- package/dist/core/session/entity-tracker.d.ts +62 -0
- package/dist/core/session/entity-tracker.js +287 -0
- package/dist/core/session/reference-resolver.d.ts +26 -0
- package/dist/core/session/reference-resolver.js +121 -0
- package/dist/core/session/self-iteration-job.d.ts +15 -0
- package/dist/core/session/self-iteration-job.js +163 -58
- package/dist/core/session/working-set.d.ts +50 -0
- package/dist/core/session/working-set.js +212 -0
- package/dist/core/snapshots/creation.d.ts +2 -8
- package/dist/core/snapshots/creation.js +3 -12
- package/dist/core/utils/summarization-helpers.d.ts +0 -4
- package/dist/core/utils/summarization-helpers.js +1 -6
- package/dist/db/bootstrap.d.ts +2 -0
- package/dist/db/bootstrap.js +229 -280
- package/dist/db/drizzle/schema-sqlite.d.ts +702 -1
- package/dist/db/drizzle/schema-sqlite.js +83 -4
- package/dist/db/drizzle/schema.d.ts +653 -1
- package/dist/db/drizzle/schema.js +93 -4
- package/dist/db/migrations/associations.d.ts +6 -0
- package/dist/db/migrations/associations.js +29 -0
- package/dist/db/migrations/beliefs.d.ts +10 -0
- package/dist/db/migrations/beliefs.js +76 -0
- package/dist/db/migrations/core-memory.d.ts +6 -0
- package/dist/db/migrations/core-memory.js +29 -0
- package/dist/db/migrations/fts.d.ts +6 -0
- package/dist/db/migrations/fts.js +52 -0
- package/dist/db/migrations/index.d.ts +25 -0
- package/dist/db/migrations/index.js +51 -0
- package/dist/db/migrations/indexes.d.ts +6 -0
- package/dist/db/migrations/indexes.js +30 -0
- package/dist/db/migrations/learnings.d.ts +7 -0
- package/dist/db/migrations/learnings.js +26 -0
- package/dist/db/migrations/maintenance.d.ts +6 -0
- package/dist/db/migrations/maintenance.js +61 -0
- package/dist/db/migrations/memories.d.ts +7 -0
- package/dist/db/migrations/memories.js +16 -0
- package/dist/db/migrations/memory-places.d.ts +6 -0
- package/dist/db/migrations/memory-places.js +29 -0
- package/dist/db/migrations/places.d.ts +6 -0
- package/dist/db/migrations/places.js +43 -0
- package/dist/db/migrations/projects.d.ts +3 -0
- package/dist/db/migrations/projects.js +13 -0
- package/dist/db/migrations/tier-conversion.d.ts +7 -0
- package/dist/db/migrations/tier-conversion.js +20 -0
- package/dist/db/schema/beliefs.d.ts +9 -0
- package/dist/db/schema/beliefs.js +46 -0
- package/dist/db/schema/generator.d.ts +38 -0
- package/dist/db/schema/generator.js +108 -0
- package/dist/db/schema/index.d.ts +19 -20
- package/dist/db/schema/index.js +25 -79
- package/dist/db/schema/learnings.d.ts +7 -0
- package/dist/db/schema/learnings.js +30 -0
- package/dist/db/schema/memories.d.ts +7 -0
- package/dist/db/schema/memories.js +81 -0
- package/dist/db/schema/projects.d.ts +4 -0
- package/dist/db/schema/projects.js +31 -0
- package/dist/packages/mcp/src/index.d.ts +3 -0
- package/dist/packages/mcp/src/index.js +733 -0
- package/mcp.json.example +8 -11
- package/package.json +57 -76
- package/packages/cli/package.json +22 -0
- package/packages/cli/src/commands/clean.ts +68 -0
- package/packages/cli/src/commands/context.ts +79 -0
- package/packages/cli/src/commands/doctor.ts +357 -0
- package/packages/cli/src/commands/forget.ts +72 -0
- package/packages/cli/src/commands/health.ts +36 -0
- package/packages/cli/src/commands/inspect.ts +41 -0
- package/packages/cli/src/commands/link.ts +50 -0
- package/packages/cli/src/commands/migrate.ts +93 -0
- package/packages/cli/src/commands/recall.ts +99 -0
- package/packages/cli/src/commands/recent.ts +57 -0
- package/packages/cli/src/commands/remember.ts +139 -0
- package/packages/cli/src/commands/run.ts +58 -0
- package/packages/cli/src/commands/stale.ts +43 -0
- package/packages/cli/src/commands/stats.ts +42 -0
- package/packages/cli/src/index.ts +57 -0
- package/packages/cli/tsconfig.json +24 -0
- package/packages/mcp/package.json +26 -0
- package/packages/mcp/src/index.ts +877 -0
- package/packages/mcp/tsconfig.json +20 -0
- package/skills/squish-memory/SKILL.md +38 -35
- package/skills/squish-memory/{scripts/install.sh → install.sh} +1 -1
- package/skills/squish-memory/references/claude-desktop.json +12 -0
- package/skills/squish-memory/references/openclaw.json +13 -0
- package/skills/squish-memory/references/opencode.json +14 -0
- package/config/hooks/claude-code-hooks.json +0 -39
- package/config/hooks/cursor-hooks.json +0 -30
- package/config/hooks/opencode-hooks.json +0 -30
- package/config/hooks/windsurf-hooks.json +0 -30
- package/config/mcp-cli-fallback-policy.json +0 -22
- package/config/mcp.json +0 -38
- package/config/plugin-manifest.json +0 -101
- package/config/plugin-manifest.schema.json +0 -244
- package/config/plugin.json +0 -32
- package/config/remote-memory-policy.json +0 -32
- package/core/commands/context-paging.md +0 -51
- package/core/commands/context-status.md +0 -22
- package/core/commands/context.md +0 -5
- package/core/commands/core-memory.md +0 -56
- package/core/commands/health.md +0 -5
- package/core/commands/init.md +0 -39
- package/core/commands/merge.md +0 -113
- package/core/commands/recall.md +0 -5
- package/core/commands/remember.md +0 -11
- package/core/commands/search.md +0 -10
- package/dist/core/commands/managed-sync.d.ts +0 -10
- package/dist/core/commands/managed-sync.js +0 -64
- package/dist/core/external-folder/index.d.ts +0 -102
- package/dist/core/external-folder/index.js +0 -294
- package/dist/core/namespaces/index.d.ts +0 -71
- package/dist/core/namespaces/index.js +0 -305
- package/dist/core/namespaces/uri-parser.d.ts +0 -31
- package/dist/core/namespaces/uri-parser.js +0 -74
- package/dist/core/search/qmd-search.d.ts +0 -61
- package/dist/core/search/qmd-search.js +0 -178
- package/dist/core/session-hooks/self-iteration-job.d.ts +0 -20
- package/dist/core/session-hooks/self-iteration-job.js +0 -282
- package/dist/core/session-hooks/session-hooks.d.ts +0 -18
- package/dist/core/session-hooks/session-hooks.js +0 -58
- package/dist/core/snapshots.d.ts +0 -29
- package/dist/core/snapshots.js +0 -220
- package/dist/core/sync/qmd-sync.d.ts +0 -94
- package/dist/core/sync/qmd-sync.js +0 -201
- package/dist/index.d.ts +0 -7
- package/dist/index.js +0 -1677
- package/dist/vendor/sql.js/sql-wasm.wasm +0 -0
- package/dist/webui/server.d.ts +0 -5
- package/dist/webui/server.js +0 -642
- package/generated/mcp/manifest.json +0 -23
- package/generated/mcp/mcp-servers.json +0 -25
- package/generated/mcp/mcporter.json +0 -34
- package/generated/mcp/openclaw-memory-qmd.json +0 -17
- package/generated/mcp/runtime.json +0 -12
- package/scripts/README.md +0 -60
- package/scripts/build-release.sh +0 -36
- package/scripts/check-secrets.js +0 -132
- package/scripts/copy-runtime-assets.mjs +0 -26
- package/scripts/generate-mcp.mjs +0 -264
- package/scripts/github-release.sh +0 -77
- package/scripts/init-dirs.mjs +0 -13
- package/scripts/install-claude-code.sh +0 -85
- package/scripts/install-cursor.sh +0 -56
- package/scripts/install-hooks.sh +0 -73
- package/scripts/install-interactive.mjs +0 -357
- package/scripts/install-opencode.sh +0 -75
- package/scripts/install-plugin.mjs +0 -415
- package/scripts/install-windsurf.sh +0 -67
- package/scripts/remote-preflight.mjs +0 -62
- package/scripts/squish-fallback.mjs +0 -132
- package/scripts/test-interactive.mjs +0 -131
- package/scripts/verify-mcp.mjs +0 -214
- package/skills/squish-memory/scripts/install.mjs +0 -335
- package/skills/squish-memory/write_skill.js +0 -2
|
@@ -12,12 +12,23 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import { randomUUID } from 'crypto';
|
|
14
14
|
import { createLearning } from '../ingestion/learnings.js';
|
|
15
|
-
import { getRecent } from '../memory/memories.js';
|
|
15
|
+
import { getRecent, rememberMemory } from '../memory/memories.js';
|
|
16
16
|
import { logger } from '../logger.js';
|
|
17
17
|
import { shouldCaptureTool, categorizeTool } from './capture-filter.js';
|
|
18
18
|
import { inferTags } from './auto-tagger.js';
|
|
19
19
|
import { ensureProject, getProjectByPath } from '../projects.js';
|
|
20
20
|
import { autoAssignMemory, initializeDefaultPlaces } from '../places/index.js';
|
|
21
|
+
import { compressForContext } from '../compression.js';
|
|
22
|
+
import { getAgentPreferences } from '../agent-preferences.js';
|
|
23
|
+
import { classifySignalEvent, distillSignalEvent } from '../ingestion/signal-engine.js';
|
|
24
|
+
import { compactSessionWorkingSet, recordSessionSignal } from '../session/working-set.js';
|
|
25
|
+
import { getDbClient } from '../lib/db-client.js';
|
|
26
|
+
import { eq } from 'drizzle-orm';
|
|
27
|
+
import { serializeMetadata, deserializeMetadata } from '../memory/serialization.js';
|
|
28
|
+
import { addMemoryToGraph } from '../graph/graph-builder.js';
|
|
29
|
+
import { addSessionContextToHotCache } from '../hot-cache.js';
|
|
30
|
+
import { extractBeliefsFromMemory } from '../beliefs/extractor.js';
|
|
31
|
+
import { upsertBeliefsForMemory, getRecentFailures, getActiveConstraints, getActiveDecisions } from '../beliefs/store.js';
|
|
21
32
|
/** Session ID for tracking across agents */
|
|
22
33
|
let currentSessionId = null;
|
|
23
34
|
/**
|
|
@@ -54,6 +65,7 @@ export async function handleSessionStart(params) {
|
|
|
54
65
|
// Get recent memories based on mode
|
|
55
66
|
const limit = mode === 'compact' ? 3 : 5;
|
|
56
67
|
const memories = await getRecent(projectPath, limit);
|
|
68
|
+
const compactedWorkingSet = await compactSessionWorkingSet(currentSessionId, projectPath);
|
|
57
69
|
// Get spatial memory context (places) for context injection
|
|
58
70
|
let placesContext = '';
|
|
59
71
|
try {
|
|
@@ -75,16 +87,76 @@ export async function handleSessionStart(params) {
|
|
|
75
87
|
// Don't fail if places not available
|
|
76
88
|
logger.debug(`[Hooks] Places context not available: ${e}`);
|
|
77
89
|
}
|
|
78
|
-
// Format for injection
|
|
79
|
-
const formatted = memories.map((m, i) =>
|
|
80
|
-
|
|
90
|
+
// Format for injection with compression
|
|
91
|
+
const formatted = memories.map((m, i) => {
|
|
92
|
+
const compressed = compressForContext(m.content || '');
|
|
93
|
+
return `${i + 1}. [${m.type}] ${compressed}`;
|
|
94
|
+
}).join('\n');
|
|
95
|
+
const workingSetContext = compactedWorkingSet.summary ? `Session working set:\n${compactedWorkingSet.summary}\n\n` : '';
|
|
96
|
+
const allContent = workingSetContext + formatted + placesContext;
|
|
97
|
+
// Get agent preferences for context injection
|
|
98
|
+
let preferences = [];
|
|
99
|
+
try {
|
|
100
|
+
const project = await getProjectByPath(projectPath);
|
|
101
|
+
if (project) {
|
|
102
|
+
preferences = await getAgentPreferences(project.id);
|
|
103
|
+
// Get beliefs for state reconstruction on session boot
|
|
104
|
+
// This is the "state reconstruction" - active beliefs shape next actions
|
|
105
|
+
const [failures, constraints, decisions] = await Promise.all([
|
|
106
|
+
getRecentFailures(project.id, 5),
|
|
107
|
+
getActiveConstraints(project.id, 10),
|
|
108
|
+
getActiveDecisions(project.id, 10),
|
|
109
|
+
]);
|
|
110
|
+
// Format beliefs into context
|
|
111
|
+
const beliefsSection = formatBeliefsForContext(failures, constraints, decisions);
|
|
112
|
+
// Add beliefs to injected context
|
|
113
|
+
if (beliefsSection) {
|
|
114
|
+
allContent = beliefsSection + '\n\n' + allContent;
|
|
115
|
+
}
|
|
116
|
+
logger.info(`[Hooks] Injected ${failures.length} failures, ${constraints.length} constraints, ${decisions.length} decisions`);
|
|
117
|
+
return {
|
|
118
|
+
memories: allContent ? allContent.split('\n') : [],
|
|
119
|
+
sessionId: currentSessionId,
|
|
120
|
+
count: memories.length,
|
|
121
|
+
preferences: preferences.length > 0 ? preferences : undefined,
|
|
122
|
+
beliefs: {
|
|
123
|
+
failures: failures.map(f => f.statement),
|
|
124
|
+
constraints: constraints.map(c => c.statement),
|
|
125
|
+
decisions: decisions.map(d => d.statement),
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch (e) {
|
|
131
|
+
logger.debug(`[Hooks] Agent preferences not available: ${e}`);
|
|
132
|
+
}
|
|
81
133
|
logger.info(`[Hooks] Injected ${memories.length} memories for session start`);
|
|
82
134
|
return {
|
|
83
135
|
memories: allContent ? allContent.split('\n') : [],
|
|
84
136
|
sessionId: currentSessionId,
|
|
85
137
|
count: memories.length,
|
|
138
|
+
preferences: preferences.length > 0 ? preferences : undefined,
|
|
86
139
|
};
|
|
87
140
|
}
|
|
141
|
+
/**
|
|
142
|
+
* Format beliefs into context section for session boot
|
|
143
|
+
* This drives "state reconstruction" - agent sees active constraints/failures/decisions
|
|
144
|
+
*/
|
|
145
|
+
function formatBeliefsForContext(failures, constraints, decisions) {
|
|
146
|
+
const sections = [];
|
|
147
|
+
if (failures.length > 0) {
|
|
148
|
+
sections.push('AVOID:\n' + failures.map((f, i) => ` ${i + 1}. ${f.statement}${f.context ? ` (${f.context})` : ''}`).join('\n'));
|
|
149
|
+
}
|
|
150
|
+
if (constraints.length > 0) {
|
|
151
|
+
sections.push('CONSTRAINTS:\n' + constraints.map((c, i) => ` ${i + 1}. ${c.statement}${c.context ? ` (${c.context})` : ''}`).join('\n'));
|
|
152
|
+
}
|
|
153
|
+
if (decisions.length > 0) {
|
|
154
|
+
sections.push('DECISIONS:\n' + decisions.map((d, i) => ` ${i + 1}. ${d.statement}${d.context ? ` (${d.context})` : ''}`).join('\n'));
|
|
155
|
+
}
|
|
156
|
+
if (sections.length === 0)
|
|
157
|
+
return '';
|
|
158
|
+
return sections.join('\n\n');
|
|
159
|
+
}
|
|
88
160
|
/**
|
|
89
161
|
* Post-tool-use hook - record observations
|
|
90
162
|
*/
|
|
@@ -98,49 +170,157 @@ export async function handlePostToolUse(params) {
|
|
|
98
170
|
}
|
|
99
171
|
// Check if we should capture this tool
|
|
100
172
|
if (!shouldCaptureTool(toolName)) {
|
|
173
|
+
await recordSessionSignal({
|
|
174
|
+
sessionId: currentSessionId,
|
|
175
|
+
projectPath,
|
|
176
|
+
classification: 'discard',
|
|
177
|
+
distilledContent: `Filtered tool: ${toolName}`,
|
|
178
|
+
toolName,
|
|
179
|
+
target: extractTarget(toolName, toolInput),
|
|
180
|
+
});
|
|
101
181
|
return { captured: false, reason: `Tool ${toolName} filtered out` };
|
|
102
182
|
}
|
|
103
183
|
// Extract relevant information
|
|
104
184
|
const category = categorizeTool(toolName);
|
|
105
185
|
const target = extractTarget(toolName, toolInput);
|
|
106
186
|
const content = extractContent(toolName, toolInput, toolResult);
|
|
187
|
+
const signalDecision = classifySignalEvent({
|
|
188
|
+
toolName,
|
|
189
|
+
toolInput,
|
|
190
|
+
toolResult,
|
|
191
|
+
sessionId: currentSessionId,
|
|
192
|
+
});
|
|
193
|
+
const distilledContent = distillSignalEvent({
|
|
194
|
+
toolName,
|
|
195
|
+
command: String(toolInput.command || toolInput.cmd || ''),
|
|
196
|
+
content: signalDecision.content || content,
|
|
197
|
+
classification: signalDecision.classification,
|
|
198
|
+
});
|
|
107
199
|
// Infer tags from context
|
|
108
|
-
const tags = inferTags(toolName, toolInput, content);
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
200
|
+
const tags = inferTags(toolName, toolInput, distilledContent || content);
|
|
201
|
+
await recordSessionSignal({
|
|
202
|
+
sessionId: currentSessionId,
|
|
203
|
+
projectPath,
|
|
204
|
+
classification: signalDecision.classification,
|
|
205
|
+
distilledContent,
|
|
206
|
+
toolName,
|
|
114
207
|
target,
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
208
|
+
metadata: {
|
|
209
|
+
activeFiles: extractActiveFiles(toolName, toolInput),
|
|
210
|
+
command: String(toolInput.command || toolInput.cmd || ''),
|
|
211
|
+
outcome: inferOutcome(signalDecision, toolResult),
|
|
212
|
+
contentHash: signalDecision.contentHash,
|
|
213
|
+
tokensSaved: signalDecision.estimatedSavings,
|
|
214
|
+
activePlaces: signalDecision.placeHint.placeType ? [signalDecision.placeHint.placeType] : [],
|
|
215
|
+
graphEntities: signalDecision.graphHint.entityTerms,
|
|
216
|
+
placeRouted: Boolean(signalDecision.placeHint.placeType),
|
|
217
|
+
graphEnriched: signalDecision.graphHint.shouldEnrich,
|
|
218
|
+
},
|
|
219
|
+
});
|
|
220
|
+
if (signalDecision.classification === 'discard') {
|
|
221
|
+
return { captured: false, reason: signalDecision.reasons.join(', ') };
|
|
222
|
+
}
|
|
223
|
+
if (signalDecision.classification === 'session-only') {
|
|
224
|
+
return { captured: false, reason: 'Stored in session working set only' };
|
|
225
|
+
}
|
|
118
226
|
try {
|
|
119
|
-
const
|
|
120
|
-
|
|
121
|
-
|
|
227
|
+
const memory = await rememberMemory({
|
|
228
|
+
content: `[${category}] ${distilledContent || content}`,
|
|
229
|
+
project: projectPath,
|
|
230
|
+
type: category === 'modification' ? 'decision' : category === 'planning' ? 'context' : 'observation',
|
|
231
|
+
source: 'auto-capture',
|
|
232
|
+
metadata: {
|
|
233
|
+
signal: {
|
|
234
|
+
classification: signalDecision.classification,
|
|
235
|
+
reasons: signalDecision.reasons,
|
|
236
|
+
nuanceSuppressed: signalDecision.classification === 'durable-raw+distilled',
|
|
237
|
+
wakeUpPriority: signalDecision.wakeUpPriority,
|
|
238
|
+
},
|
|
239
|
+
placeHint: signalDecision.placeHint,
|
|
240
|
+
graphHint: signalDecision.graphHint,
|
|
241
|
+
target,
|
|
242
|
+
toolName,
|
|
243
|
+
},
|
|
244
|
+
});
|
|
245
|
+
logger.info(`[Hooks] Captured ${toolName} → ${memory.id} (session: ${currentSessionId})`);
|
|
246
|
+
let placeAssignment;
|
|
122
247
|
try {
|
|
123
248
|
const project = await getProjectByPath(projectPath);
|
|
124
249
|
if (project) {
|
|
125
|
-
// Initialize default places if they don't exist
|
|
126
250
|
await initializeDefaultPlaces(project.id);
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
memoryId: learning.id,
|
|
251
|
+
placeAssignment = await autoAssignMemory({
|
|
252
|
+
memoryId: memory.id,
|
|
130
253
|
projectId: project.id,
|
|
131
254
|
toolName,
|
|
132
|
-
content:
|
|
255
|
+
content: memory.content,
|
|
133
256
|
tags,
|
|
257
|
+
memoryType: memory.type,
|
|
134
258
|
});
|
|
135
259
|
}
|
|
136
260
|
}
|
|
137
261
|
catch (placeError) {
|
|
138
|
-
// Don't fail the hook if place assignment fails
|
|
139
262
|
logger.warn(`[Hooks] Place assignment failed: ${placeError}`);
|
|
140
263
|
}
|
|
264
|
+
let graphStatus = {
|
|
265
|
+
enriched: false,
|
|
266
|
+
entitiesCreated: 0,
|
|
267
|
+
relationsCreated: 0,
|
|
268
|
+
source: 'none',
|
|
269
|
+
entityTerms: signalDecision.graphHint.entityTerms,
|
|
270
|
+
};
|
|
271
|
+
if (signalDecision.graphHint.shouldEnrich) {
|
|
272
|
+
try {
|
|
273
|
+
const graphResult = await addMemoryToGraph(memory.id, { preferLLM: true });
|
|
274
|
+
graphStatus = {
|
|
275
|
+
enriched: graphResult.entitiesCreated > 0 || graphResult.relationsCreated > 0,
|
|
276
|
+
entitiesCreated: graphResult.entitiesCreated,
|
|
277
|
+
relationsCreated: graphResult.relationsCreated,
|
|
278
|
+
source: graphResult.source,
|
|
279
|
+
entityTerms: signalDecision.graphHint.entityTerms,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
catch (graphError) {
|
|
283
|
+
logger.warn(`[Hooks] Graph enrichment failed: ${graphError}`);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
let rawFallbackSnapshotId;
|
|
287
|
+
if (signalDecision.classification === 'durable-raw+distilled') {
|
|
288
|
+
rawFallbackSnapshotId = await attachRawFallbackSnapshot(memory.id, signalDecision.content, signalDecision.reasons);
|
|
289
|
+
}
|
|
290
|
+
await attachInspectionMetadata(memory.id, {
|
|
291
|
+
classification: signalDecision.classification,
|
|
292
|
+
reasons: signalDecision.reasons,
|
|
293
|
+
rawFallbackSnapshotId,
|
|
294
|
+
nuanceSuppressed: signalDecision.classification === 'durable-raw+distilled',
|
|
295
|
+
placeId: placeAssignment?.placeId,
|
|
296
|
+
placeType: placeAssignment?.placeType,
|
|
297
|
+
graph: graphStatus,
|
|
298
|
+
});
|
|
299
|
+
try {
|
|
300
|
+
const project = await getProjectByPath(projectPath);
|
|
301
|
+
if (project) {
|
|
302
|
+
const beliefs = extractBeliefsFromMemory({
|
|
303
|
+
memoryId: memory.id,
|
|
304
|
+
content: memory.content,
|
|
305
|
+
type: memory.type,
|
|
306
|
+
metadata: memory.metadata ?? null,
|
|
307
|
+
});
|
|
308
|
+
if (beliefs.length > 0) {
|
|
309
|
+
const storedBeliefs = await upsertBeliefsForMemory({
|
|
310
|
+
projectId: project.id,
|
|
311
|
+
memoryId: memory.id,
|
|
312
|
+
beliefs,
|
|
313
|
+
});
|
|
314
|
+
await attachBeliefInspectionMetadata(memory.id, storedBeliefs);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
catch (beliefError) {
|
|
319
|
+
logger.warn(`[Hooks] Belief extraction failed: ${beliefError}`);
|
|
320
|
+
}
|
|
141
321
|
return {
|
|
142
322
|
captured: true,
|
|
143
|
-
memoryId:
|
|
323
|
+
memoryId: memory.id,
|
|
144
324
|
};
|
|
145
325
|
}
|
|
146
326
|
catch (error) {
|
|
@@ -148,8 +328,90 @@ export async function handlePostToolUse(params) {
|
|
|
148
328
|
return { captured: false, reason: 'Failed to create learning' };
|
|
149
329
|
}
|
|
150
330
|
}
|
|
331
|
+
async function attachRawFallbackSnapshot(memoryId, rawContent, reasons) {
|
|
332
|
+
const { db, schema } = await getDbClient();
|
|
333
|
+
const snapshotId = randomUUID();
|
|
334
|
+
await db.insert(schema.memorySnapshots).values({
|
|
335
|
+
id: snapshotId,
|
|
336
|
+
memoryId,
|
|
337
|
+
snapshotType: 'periodic',
|
|
338
|
+
content: rawContent,
|
|
339
|
+
metadata: serializeMetadata({
|
|
340
|
+
role: 'raw-fallback',
|
|
341
|
+
reasons,
|
|
342
|
+
createdBy: 'signal-engine',
|
|
343
|
+
}),
|
|
344
|
+
createdAt: new Date(),
|
|
345
|
+
});
|
|
346
|
+
return snapshotId;
|
|
347
|
+
}
|
|
348
|
+
async function attachInspectionMetadata(memoryId, signal) {
|
|
349
|
+
const { db, schema } = await getDbClient();
|
|
350
|
+
const rows = await db.select().from(schema.memories).where(eq(schema.memories.id, memoryId)).limit(1);
|
|
351
|
+
const row = rows[0];
|
|
352
|
+
if (!row)
|
|
353
|
+
return;
|
|
354
|
+
const details = deserializeMetadata(row.metadata ?? null) ?? {};
|
|
355
|
+
const next = {
|
|
356
|
+
...details,
|
|
357
|
+
signal,
|
|
358
|
+
classification: signal.classification,
|
|
359
|
+
reasons: signal.reasons,
|
|
360
|
+
rawFallbackSnapshotId: signal.rawFallbackSnapshotId,
|
|
361
|
+
nuanceSuppressed: signal.nuanceSuppressed,
|
|
362
|
+
placeId: signal.placeId,
|
|
363
|
+
placeType: signal.placeType,
|
|
364
|
+
graph: signal.graph,
|
|
365
|
+
graphStatus: signal.graph
|
|
366
|
+
? `${signal.graph.enriched ? 'enriched' : 'skipped'} (${signal.graph.entitiesCreated} entities, ${signal.graph.relationsCreated} relations)`
|
|
367
|
+
: 'none',
|
|
368
|
+
};
|
|
369
|
+
await db.update(schema.memories)
|
|
370
|
+
.set({ metadata: serializeMetadata(next), updatedAt: new Date() })
|
|
371
|
+
.where(eq(schema.memories.id, memoryId));
|
|
372
|
+
}
|
|
373
|
+
async function attachBeliefInspectionMetadata(memoryId, beliefs) {
|
|
374
|
+
const { db, schema } = await getDbClient();
|
|
375
|
+
const rows = await db.select().from(schema.memories).where(eq(schema.memories.id, memoryId)).limit(1);
|
|
376
|
+
const row = rows[0];
|
|
377
|
+
if (!row)
|
|
378
|
+
return;
|
|
379
|
+
const details = deserializeMetadata(row.metadata ?? null) ?? {};
|
|
380
|
+
const next = {
|
|
381
|
+
...details,
|
|
382
|
+
beliefs: beliefs.map((belief) => ({
|
|
383
|
+
id: belief.id,
|
|
384
|
+
type: belief.type,
|
|
385
|
+
statement: belief.statement,
|
|
386
|
+
status: belief.status,
|
|
387
|
+
confidence: belief.confidence,
|
|
388
|
+
sourceMemoryIds: belief.sourceMemoryIds,
|
|
389
|
+
reason: belief.reason,
|
|
390
|
+
})),
|
|
391
|
+
};
|
|
392
|
+
await db.update(schema.memories)
|
|
393
|
+
.set({ metadata: serializeMetadata(next), updatedAt: new Date() })
|
|
394
|
+
.where(eq(schema.memories.id, memoryId));
|
|
395
|
+
}
|
|
396
|
+
function extractActiveFiles(toolName, toolInput) {
|
|
397
|
+
const path = String(toolInput.filePath || toolInput.path || '');
|
|
398
|
+
if (['Write', 'Edit', 'MultiEdit'].includes(toolName) && path) {
|
|
399
|
+
return [path];
|
|
400
|
+
}
|
|
401
|
+
return [];
|
|
402
|
+
}
|
|
403
|
+
function inferOutcome(signalDecision, toolResult) {
|
|
404
|
+
const content = typeof toolResult === 'string' ? toolResult.toLowerCase() : String(toolResult ?? '').toLowerCase();
|
|
405
|
+
if (signalDecision.classification === 'discard')
|
|
406
|
+
return 'suppressed';
|
|
407
|
+
if (/\bfail|error|exception|traceback\b/.test(content))
|
|
408
|
+
return 'failure';
|
|
409
|
+
if (/\bpass|success|completed\b/.test(content))
|
|
410
|
+
return 'success';
|
|
411
|
+
return undefined;
|
|
412
|
+
}
|
|
151
413
|
/**
|
|
152
|
-
* Session end hook - save snapshot and sync
|
|
414
|
+
* Session end hook - save snapshot and sync to persistent hot cache
|
|
153
415
|
*/
|
|
154
416
|
export async function handleSessionEnd(params) {
|
|
155
417
|
const { projectPath, agentType, workInProgress } = params;
|
|
@@ -166,6 +428,21 @@ export async function handleSessionEnd(params) {
|
|
|
166
428
|
autoLink: false,
|
|
167
429
|
});
|
|
168
430
|
logger.info(`[Hooks] Saved session snapshot: ${snapshot.id}`);
|
|
431
|
+
// NEW: Also save to persistent hot cache (survives restart)
|
|
432
|
+
try {
|
|
433
|
+
const workingSet = await compactSessionWorkingSet(projectPath);
|
|
434
|
+
await addSessionContextToHotCache({
|
|
435
|
+
activeFiles: workingSet?.activeFiles || [],
|
|
436
|
+
commands: workingSet?.recentCommands?.slice(-3).map(c => c.command) || [],
|
|
437
|
+
failures: workingSet?.recentFailures?.slice(-2) || [],
|
|
438
|
+
decisions: [], // Could extract from recent signals
|
|
439
|
+
hypotheses: workingSet?.currentHypotheses?.slice(-2) || [],
|
|
440
|
+
}, projectPath);
|
|
441
|
+
logger.info('[Hooks] Saved session context to hot cache');
|
|
442
|
+
}
|
|
443
|
+
catch (error) {
|
|
444
|
+
logger.warn('[Hooks] Failed to save hot cache', error);
|
|
445
|
+
}
|
|
169
446
|
currentSessionId = null; // Clear session
|
|
170
447
|
return {
|
|
171
448
|
snapshotId: snapshot.id,
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hot Cache - Persistent session context (Karpathy-style)
|
|
3
|
+
*
|
|
4
|
+
* Implements the "hot.md" layer from LLM Wiki pattern:
|
|
5
|
+
* - ~500 words persistent session context
|
|
6
|
+
* - Survives restart (unlike session working set)
|
|
7
|
+
* - Auto-updates on session events
|
|
8
|
+
* - Deduplication and stale detection
|
|
9
|
+
*/
|
|
10
|
+
export interface HotCacheEntry {
|
|
11
|
+
id: string;
|
|
12
|
+
content: string;
|
|
13
|
+
hash: string;
|
|
14
|
+
createdAt: number;
|
|
15
|
+
lastReferencedAt: number;
|
|
16
|
+
referenceCount: number;
|
|
17
|
+
tags?: string[];
|
|
18
|
+
}
|
|
19
|
+
export interface HotCache {
|
|
20
|
+
version: string;
|
|
21
|
+
projectPath: string;
|
|
22
|
+
entries: HotCacheEntry[];
|
|
23
|
+
lastUpdated: number;
|
|
24
|
+
staleEntries: string[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Load hot cache from disk (or create new)
|
|
28
|
+
*/
|
|
29
|
+
export declare function loadHotCache(projectPath?: string): Promise<HotCache>;
|
|
30
|
+
/**
|
|
31
|
+
* Save hot cache to disk
|
|
32
|
+
*/
|
|
33
|
+
export declare function saveHotCache(cache: HotCache): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Add an entry to hot cache (with deduplication)
|
|
36
|
+
*/
|
|
37
|
+
export declare function addToHotCache(content: string, options?: {
|
|
38
|
+
projectPath?: string;
|
|
39
|
+
tags?: string[];
|
|
40
|
+
reference?: boolean;
|
|
41
|
+
}): Promise<HotCache>;
|
|
42
|
+
/**
|
|
43
|
+
* Get hot cache summary for context
|
|
44
|
+
* Returns markdown-formatted summary of recent entries
|
|
45
|
+
*/
|
|
46
|
+
export declare function getHotCacheSummary(options?: {
|
|
47
|
+
projectPath?: string;
|
|
48
|
+
maxEntries?: number;
|
|
49
|
+
}): Promise<string>;
|
|
50
|
+
/**
|
|
51
|
+
* Reference an existing hot cache entry (prevents staleness)
|
|
52
|
+
*/
|
|
53
|
+
export declare function referenceHotCacheEntry(entryId: string, projectPath?: string): Promise<boolean>;
|
|
54
|
+
/**
|
|
55
|
+
* Remove stale entries from hot cache
|
|
56
|
+
*/
|
|
57
|
+
export declare function cleanStaleEntries(projectPath?: string): Promise<number>;
|
|
58
|
+
/**
|
|
59
|
+
* Add session context to hot cache
|
|
60
|
+
* Called from session hooks with key session information
|
|
61
|
+
*/
|
|
62
|
+
export declare function addSessionContextToHotCache(sessionInfo: {
|
|
63
|
+
activeFiles?: string[];
|
|
64
|
+
commands?: string[];
|
|
65
|
+
failures?: string[];
|
|
66
|
+
decisions?: string[];
|
|
67
|
+
hypotheses?: string[];
|
|
68
|
+
}, projectPath?: string): Promise<HotCache>;
|
|
69
|
+
/**
|
|
70
|
+
* Get all hot cache entries (for advanced use)
|
|
71
|
+
*/
|
|
72
|
+
export declare function getHotCacheEntries(projectPath?: string): Promise<HotCacheEntry[]>;
|
|
73
|
+
/**
|
|
74
|
+
* Clear hot cache (dangerous - use with caution)
|
|
75
|
+
*/
|
|
76
|
+
export declare function clearHotCache(projectPath?: string): Promise<void>;
|
|
77
|
+
/**
|
|
78
|
+
* Get hot cache statistics
|
|
79
|
+
*/
|
|
80
|
+
export declare function getHotCacheStats(projectPath?: string): Promise<{
|
|
81
|
+
entries: number;
|
|
82
|
+
staleEntries: number;
|
|
83
|
+
oldestEntry: number | null;
|
|
84
|
+
newestEntry: number | null;
|
|
85
|
+
}>;
|
|
86
|
+
//# sourceMappingURL=hot-cache.d.ts.map
|