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
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent-Aware Memory Management
|
|
3
|
+
* Provides agent isolation and visibility rules
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { and, eq, inArray, or } from 'drizzle-orm';
|
|
7
|
+
import { randomUUID } from 'crypto';
|
|
8
|
+
import { getDb } from '../../db/index.js';
|
|
9
|
+
import { getSchema } from '../../db/schema.js';
|
|
10
|
+
import { config } from '../../config.js';
|
|
11
|
+
import { getEmbedding } from '../embeddings.js';
|
|
12
|
+
import { logger } from '../logger.js';
|
|
13
|
+
|
|
14
|
+
export type VisibilityScope = 'private' | 'project' | 'team' | 'global';
|
|
15
|
+
|
|
16
|
+
export interface AgentContext {
|
|
17
|
+
agentId: string;
|
|
18
|
+
agentRole?: string;
|
|
19
|
+
userId?: string;
|
|
20
|
+
projectId?: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Store a memory with agent context
|
|
25
|
+
*/
|
|
26
|
+
export async function storeAgentMemory(
|
|
27
|
+
content: string,
|
|
28
|
+
context: AgentContext,
|
|
29
|
+
options: {
|
|
30
|
+
type?: string;
|
|
31
|
+
sector?: string;
|
|
32
|
+
visibilityScope?: VisibilityScope;
|
|
33
|
+
tags?: string[];
|
|
34
|
+
metadata?: Record<string, unknown>;
|
|
35
|
+
} = {}
|
|
36
|
+
): Promise<string> {
|
|
37
|
+
if (!config.agentIsolationEnabled) {
|
|
38
|
+
// Fall back to standard memory storage
|
|
39
|
+
return await storeStandardMemory(content, options);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
try {
|
|
43
|
+
const db = await getDb();
|
|
44
|
+
const schema = await getSchema();
|
|
45
|
+
|
|
46
|
+
const memoryId = randomUUID();
|
|
47
|
+
const embedding = await getEmbedding(content);
|
|
48
|
+
const visibilityScope = options.visibilityScope || config.defaultVisibilityScope;
|
|
49
|
+
|
|
50
|
+
// Determine scopes based on visibility
|
|
51
|
+
const readScope = calculateReadScope(context, visibilityScope);
|
|
52
|
+
const writeScope = [`agent:${context.agentId}`];
|
|
53
|
+
|
|
54
|
+
await (db as any).insert(schema.memories).values({
|
|
55
|
+
id: memoryId,
|
|
56
|
+
content,
|
|
57
|
+
type: options.type || 'observation',
|
|
58
|
+
sector: options.sector || 'episodic',
|
|
59
|
+
agentId: context.agentId,
|
|
60
|
+
agentRole: context.agentRole || 'general',
|
|
61
|
+
userId: context.userId || null,
|
|
62
|
+
projectId: context.projectId || null,
|
|
63
|
+
visibilityScope,
|
|
64
|
+
writeScope,
|
|
65
|
+
readScope,
|
|
66
|
+
tags: options.tags || [],
|
|
67
|
+
metadata: options.metadata || null,
|
|
68
|
+
embedding: embedding || null,
|
|
69
|
+
confidence: 100,
|
|
70
|
+
relevanceScore: 50,
|
|
71
|
+
createdAt: new Date(),
|
|
72
|
+
updatedAt: new Date(),
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
return memoryId;
|
|
76
|
+
} catch (error) {
|
|
77
|
+
logger.error('Error storing agent memory', error);
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
// Helper Functions
|
|
93
|
+
|
|
94
|
+
function calculateReadScope(context: AgentContext, visibility: VisibilityScope): string[] {
|
|
95
|
+
switch (visibility) {
|
|
96
|
+
case 'private':
|
|
97
|
+
return [`agent:${context.agentId}`];
|
|
98
|
+
case 'project':
|
|
99
|
+
return [`agent:${context.agentId}`, `project:${context.projectId || '*'}`];
|
|
100
|
+
case 'team':
|
|
101
|
+
return [`agent:${context.agentId}`, 'team:*'];
|
|
102
|
+
case 'global':
|
|
103
|
+
return ['*'];
|
|
104
|
+
default:
|
|
105
|
+
return [`agent:${context.agentId}`];
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
async function storeStandardMemory(
|
|
110
|
+
content: string,
|
|
111
|
+
options: {
|
|
112
|
+
type?: string;
|
|
113
|
+
sector?: string;
|
|
114
|
+
tags?: string[];
|
|
115
|
+
metadata?: Record<string, unknown>;
|
|
116
|
+
} = {}
|
|
117
|
+
): Promise<string> {
|
|
118
|
+
// Fallback to standard memory storage if agent isolation is disabled
|
|
119
|
+
const db = await getDb();
|
|
120
|
+
const schema = await getSchema();
|
|
121
|
+
const memoryId = randomUUID();
|
|
122
|
+
const embedding = await getEmbedding(content);
|
|
123
|
+
|
|
124
|
+
await (db as any).insert(schema.memories).values({
|
|
125
|
+
id: memoryId,
|
|
126
|
+
content,
|
|
127
|
+
type: options.type || 'observation',
|
|
128
|
+
sector: options.sector || 'episodic',
|
|
129
|
+
tags: options.tags || [],
|
|
130
|
+
metadata: options.metadata || null,
|
|
131
|
+
embedding: embedding || null,
|
|
132
|
+
confidence: 100,
|
|
133
|
+
relevanceScore: 50,
|
|
134
|
+
createdAt: new Date(),
|
|
135
|
+
updatedAt: new Date(),
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
return memoryId;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
async function searchStandardMemories(
|
|
142
|
+
query: string,
|
|
143
|
+
options: {
|
|
144
|
+
limit?: number;
|
|
145
|
+
type?: string;
|
|
146
|
+
} = {}
|
|
147
|
+
): Promise<any[]> {
|
|
148
|
+
// Fallback to standard memory search if agent isolation is disabled
|
|
149
|
+
const db = await getDb();
|
|
150
|
+
const schema = await getSchema();
|
|
151
|
+
const limit = Math.min(options.limit || 10, 100);
|
|
152
|
+
|
|
153
|
+
let where: any = undefined;
|
|
154
|
+
if (options.type) {
|
|
155
|
+
where = eq(schema.memories.type as any, options.type);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return await (db as any)
|
|
159
|
+
.select()
|
|
160
|
+
.from(schema.memories)
|
|
161
|
+
.where(
|
|
162
|
+
where
|
|
163
|
+
? and(where, (schema.memories.content as any).ilike(`%${query}%`))
|
|
164
|
+
: (schema.memories.content as any).ilike(`%${query}%`)
|
|
165
|
+
)
|
|
166
|
+
.limit(limit);
|
|
167
|
+
}
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core Memory Service - Always-in-context memory (Tier 1)
|
|
3
|
+
*
|
|
4
|
+
* Small, persistent, always-visible memory block (< 2KB total).
|
|
5
|
+
* This memory is automatically injected into every agent interaction.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { eq, and, sql } from 'drizzle-orm';
|
|
9
|
+
import { getDb } from '../../db/index.js';
|
|
10
|
+
import { getSchema, type SchemaModule } from '../../db/schema.js';
|
|
11
|
+
import { createDatabaseClient } from '../storage/database.js';
|
|
12
|
+
import config from '../../config.js';
|
|
13
|
+
import { estimateTokens } from '../context/context-window.js';
|
|
14
|
+
|
|
15
|
+
type CoreMemorySection = 'persona' | 'user_info' | 'project_context' | 'working_notes';
|
|
16
|
+
|
|
17
|
+
// Use configurable limits from environment
|
|
18
|
+
const MAX_TOTAL_SIZE_BYTES = config.coreMemoryTotalBytes;
|
|
19
|
+
const MAX_SECTION_SIZE_BYTES = config.coreMemorySectionBytes;
|
|
20
|
+
|
|
21
|
+
interface CoreMemoryContent {
|
|
22
|
+
persona: string;
|
|
23
|
+
user_info: string;
|
|
24
|
+
project_context: string;
|
|
25
|
+
working_notes: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Initialize core memory for a project
|
|
30
|
+
*/
|
|
31
|
+
export async function initializeCoreMemory(projectId: string, userId?: string): Promise<void> {
|
|
32
|
+
const db = createDatabaseClient(await getDb());
|
|
33
|
+
const schema = await getSchema();
|
|
34
|
+
const { coreMemory } = schema;
|
|
35
|
+
|
|
36
|
+
const sections: CoreMemorySection[] = ['persona', 'user_info', 'project_context', 'working_notes'];
|
|
37
|
+
|
|
38
|
+
for (const section of sections) {
|
|
39
|
+
const existing = await db
|
|
40
|
+
.select()
|
|
41
|
+
.from(coreMemory)
|
|
42
|
+
.where(
|
|
43
|
+
and(
|
|
44
|
+
eq(coreMemory.projectId, projectId as any),
|
|
45
|
+
eq(coreMemory.section, section)
|
|
46
|
+
)
|
|
47
|
+
)
|
|
48
|
+
.limit(1);
|
|
49
|
+
|
|
50
|
+
if (existing.length === 0) {
|
|
51
|
+
await db.insert(coreMemory).values({
|
|
52
|
+
projectId: projectId as any,
|
|
53
|
+
userId: userId as any,
|
|
54
|
+
section,
|
|
55
|
+
content: '',
|
|
56
|
+
sizeBytes: 0,
|
|
57
|
+
version: 1,
|
|
58
|
+
} as any);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Get all core memory sections for a project
|
|
65
|
+
*/
|
|
66
|
+
export async function getCoreMemory(projectId: string): Promise<CoreMemoryContent> {
|
|
67
|
+
const db = createDatabaseClient(await getDb());
|
|
68
|
+
const schema = await getSchema();
|
|
69
|
+
const { coreMemory } = schema;
|
|
70
|
+
|
|
71
|
+
const sections = await db
|
|
72
|
+
.select()
|
|
73
|
+
.from(coreMemory)
|
|
74
|
+
.where(eq(coreMemory.projectId, projectId as any));
|
|
75
|
+
|
|
76
|
+
const content: CoreMemoryContent = {
|
|
77
|
+
persona: '',
|
|
78
|
+
user_info: '',
|
|
79
|
+
project_context: '',
|
|
80
|
+
working_notes: '',
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
for (const section of sections) {
|
|
84
|
+
const key = section.section as keyof CoreMemoryContent;
|
|
85
|
+
content[key] = section.content || '';
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return content;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Get a specific core memory section
|
|
93
|
+
*/
|
|
94
|
+
export async function getCoreMemorySection(
|
|
95
|
+
projectId: string,
|
|
96
|
+
section: CoreMemorySection
|
|
97
|
+
): Promise<string> {
|
|
98
|
+
const db = createDatabaseClient(await getDb());
|
|
99
|
+
const schema = await getSchema();
|
|
100
|
+
const { coreMemory } = schema;
|
|
101
|
+
|
|
102
|
+
const result = await db
|
|
103
|
+
.select()
|
|
104
|
+
.from(coreMemory)
|
|
105
|
+
.where(
|
|
106
|
+
and(
|
|
107
|
+
eq(coreMemory.projectId, projectId as any),
|
|
108
|
+
eq(coreMemory.section, section)
|
|
109
|
+
)
|
|
110
|
+
)
|
|
111
|
+
.limit(1);
|
|
112
|
+
|
|
113
|
+
return result[0]?.content || '';
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Update (replace) a core memory section
|
|
118
|
+
*/
|
|
119
|
+
export async function editCoreMemorySection(
|
|
120
|
+
projectId: string,
|
|
121
|
+
section: CoreMemorySection,
|
|
122
|
+
content: string
|
|
123
|
+
): Promise<{ success: boolean; message?: string; sizeBytes?: number; tokensEstimate?: number }> {
|
|
124
|
+
const sizeBytes = Buffer.byteLength(content, 'utf8');
|
|
125
|
+
const tokensEstimate = estimateTokens(content);
|
|
126
|
+
|
|
127
|
+
// Check section size limit
|
|
128
|
+
if (sizeBytes > MAX_SECTION_SIZE_BYTES) {
|
|
129
|
+
return {
|
|
130
|
+
success: false,
|
|
131
|
+
message: `Content exceeds section limit of ${MAX_SECTION_SIZE_BYTES} bytes (got ${sizeBytes} bytes)`,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Check total size limit
|
|
136
|
+
const totalSize = await getTotalCoreMemorySize(projectId, section, sizeBytes);
|
|
137
|
+
if (totalSize > MAX_TOTAL_SIZE_BYTES) {
|
|
138
|
+
return {
|
|
139
|
+
success: false,
|
|
140
|
+
message: `Total core memory would exceed ${MAX_TOTAL_SIZE_BYTES} bytes (would be ${totalSize} bytes)`,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const db = createDatabaseClient(await getDb());
|
|
145
|
+
const schema = await getSchema();
|
|
146
|
+
const { coreMemory } = schema;
|
|
147
|
+
|
|
148
|
+
await db
|
|
149
|
+
.update(coreMemory)
|
|
150
|
+
.set({
|
|
151
|
+
content,
|
|
152
|
+
sizeBytes,
|
|
153
|
+
tokensEstimate,
|
|
154
|
+
version: sql`${coreMemory.version} + 1`,
|
|
155
|
+
updatedAt: new Date() as any,
|
|
156
|
+
} as any)
|
|
157
|
+
.where(
|
|
158
|
+
and(
|
|
159
|
+
eq(coreMemory.projectId, projectId as any),
|
|
160
|
+
eq(coreMemory.section, section)
|
|
161
|
+
)
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
return { success: true, sizeBytes, tokensEstimate };
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Append content to a core memory section
|
|
169
|
+
*/
|
|
170
|
+
export async function appendCoreMemorySection(
|
|
171
|
+
projectId: string,
|
|
172
|
+
section: CoreMemorySection,
|
|
173
|
+
text: string
|
|
174
|
+
): Promise<{ success: boolean; message?: string; sizeBytes?: number }> {
|
|
175
|
+
const currentContent = await getCoreMemorySection(projectId, section);
|
|
176
|
+
const newContent = currentContent ? `${currentContent}\n${text}` : text;
|
|
177
|
+
|
|
178
|
+
return editCoreMemorySection(projectId, section, newContent);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Replace text within a core memory section
|
|
183
|
+
*/
|
|
184
|
+
export async function replaceCoreMemoryText(
|
|
185
|
+
projectId: string,
|
|
186
|
+
section: CoreMemorySection,
|
|
187
|
+
oldText: string,
|
|
188
|
+
newText: string
|
|
189
|
+
): Promise<{ success: boolean; message?: string; sizeBytes?: number }> {
|
|
190
|
+
const currentContent = await getCoreMemorySection(projectId, section);
|
|
191
|
+
|
|
192
|
+
if (!currentContent.includes(oldText)) {
|
|
193
|
+
return {
|
|
194
|
+
success: false,
|
|
195
|
+
message: `Text "${oldText}" not found in section "${section}"`,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
const newContent = currentContent.replace(oldText, newText);
|
|
200
|
+
return editCoreMemorySection(projectId, section, newContent);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Get total size of core memory (excluding one section if calculating new size)
|
|
205
|
+
*/
|
|
206
|
+
async function getTotalCoreMemorySize(
|
|
207
|
+
projectId: string,
|
|
208
|
+
excludeSection?: CoreMemorySection,
|
|
209
|
+
newSectionSize?: number
|
|
210
|
+
): Promise<number> {
|
|
211
|
+
const db = createDatabaseClient(await getDb());
|
|
212
|
+
const schema = await getSchema();
|
|
213
|
+
const { coreMemory } = schema;
|
|
214
|
+
|
|
215
|
+
const sections = await db
|
|
216
|
+
.select()
|
|
217
|
+
.from(coreMemory)
|
|
218
|
+
.where(eq(coreMemory.projectId, projectId as any));
|
|
219
|
+
|
|
220
|
+
let total = 0;
|
|
221
|
+
for (const section of sections) {
|
|
222
|
+
if (section.section === excludeSection) {
|
|
223
|
+
total += newSectionSize || 0;
|
|
224
|
+
} else {
|
|
225
|
+
total += section.sizeBytes || 0;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
return total;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Get core memory stats
|
|
234
|
+
*/
|
|
235
|
+
export async function getCoreMemoryStats(projectId: string): Promise<{
|
|
236
|
+
totalBytes: number;
|
|
237
|
+
totalTokens: number;
|
|
238
|
+
maxBytes: number;
|
|
239
|
+
maxTokens: number;
|
|
240
|
+
usagePercent: number;
|
|
241
|
+
tokenUsagePercent: number;
|
|
242
|
+
sections: Array<{
|
|
243
|
+
section: string;
|
|
244
|
+
sizeBytes: number;
|
|
245
|
+
tokensEstimate: number;
|
|
246
|
+
version: number;
|
|
247
|
+
updatedAt: Date;
|
|
248
|
+
}>;
|
|
249
|
+
}> {
|
|
250
|
+
const db = createDatabaseClient(await getDb());
|
|
251
|
+
const schema = await getSchema();
|
|
252
|
+
const { coreMemory } = schema;
|
|
253
|
+
|
|
254
|
+
const sections = await db
|
|
255
|
+
.select()
|
|
256
|
+
.from(coreMemory)
|
|
257
|
+
.where(eq(coreMemory.projectId, projectId as any));
|
|
258
|
+
|
|
259
|
+
const totalBytes = sections.reduce((sum: number, s: any) => sum + (s.sizeBytes || 0), 0);
|
|
260
|
+
const totalTokens = sections.reduce((sum: number, s: any) => sum + (s.tokensEstimate || 0), 0);
|
|
261
|
+
|
|
262
|
+
// Estimate max tokens from max bytes (rough approximation: 1 token ≈ 4 chars)
|
|
263
|
+
const maxTokens = Math.floor(MAX_TOTAL_SIZE_BYTES / 4);
|
|
264
|
+
|
|
265
|
+
return {
|
|
266
|
+
totalBytes,
|
|
267
|
+
totalTokens,
|
|
268
|
+
maxBytes: MAX_TOTAL_SIZE_BYTES,
|
|
269
|
+
maxTokens,
|
|
270
|
+
usagePercent: (totalBytes / MAX_TOTAL_SIZE_BYTES) * 100,
|
|
271
|
+
tokenUsagePercent: (totalTokens / maxTokens) * 100,
|
|
272
|
+
sections: sections.map((s: any) => ({
|
|
273
|
+
section: s.section,
|
|
274
|
+
sizeBytes: s.sizeBytes || 0,
|
|
275
|
+
tokensEstimate: s.tokensEstimate || 0,
|
|
276
|
+
version: s.version || 1,
|
|
277
|
+
updatedAt: s.updatedAt,
|
|
278
|
+
})),
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Estimate token count from text (rough approximation: 1 token ≈ 4 chars)
|
|
284
|
+
* Import from context-window.ts - single source of truth
|
|
285
|
+
*/
|
|
286
|
+
export { estimateTokens } from '../context/context-window.js';
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Get core memory formatted for context injection
|
|
290
|
+
*/
|
|
291
|
+
export async function formatCoreMemoryForInjection(projectId: string): Promise<string> {
|
|
292
|
+
const content = await getCoreMemory(projectId);
|
|
293
|
+
const stats = await getCoreMemoryStats(projectId);
|
|
294
|
+
|
|
295
|
+
let formatted = `# Core Memory (Always-In-Context)\n\n`;
|
|
296
|
+
|
|
297
|
+
if (content.persona) {
|
|
298
|
+
formatted += `## Agent Persona\n${content.persona}\n\n`;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
if (content.user_info) {
|
|
302
|
+
formatted += `## User Information\n${content.user_info}\n\n`;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
if (content.project_context) {
|
|
306
|
+
formatted += `## Project Context\n${content.project_context}\n\n`;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
if (content.working_notes) {
|
|
310
|
+
formatted += `## Working Notes\n${content.working_notes}\n\n`;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
formatted += `---\n`;
|
|
314
|
+
formatted += `Core Memory Usage:\n`;
|
|
315
|
+
formatted += `- Bytes: ${stats.totalBytes}/${stats.maxBytes} (${stats.usagePercent.toFixed(1)}%)\n`;
|
|
316
|
+
formatted += `- Tokens: ~${stats.totalTokens}/${stats.maxTokens} (${stats.tokenUsagePercent.toFixed(1)}%)\n\n`;
|
|
317
|
+
|
|
318
|
+
// Add tool usage hints for agent-driven retrieval
|
|
319
|
+
formatted += `### Memory Tools Available\n`;
|
|
320
|
+
formatted += `When you need to recall information or store something important, use these tools:\n`;
|
|
321
|
+
formatted += `- **Search**: Use \`/squish:search\` to find stored memories matching a query\n`;
|
|
322
|
+
formatted += `- **Store**: Use \`/squish:remember\` to save new information for future use\n`;
|
|
323
|
+
formatted += `- **Update Core Memory**: Use \`/squish:core-memory\` to edit this always-visible memory\n`;
|
|
324
|
+
|
|
325
|
+
return formatted;
|
|
326
|
+
}
|