squish-memory 1.0.2 → 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 +146 -0
- package/CHANGELOG.md +202 -0
- package/README.md +192 -287
- 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 +10 -12
- package/config/mcp-remote-auth.json +3 -26
- package/config/mcp-universal.schema.json +5 -35
- package/config/settings.json +78 -22
- 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/core/embeddings/local-embeddings.ts +12 -0
- 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 +61 -14
- package/dist/config.js +159 -139
- package/dist/core/adapters/config/claude-code.d.ts +45 -0
- package/dist/core/adapters/config/claude-code.js +113 -0
- package/dist/core/adapters/config/cursor.d.ts +26 -0
- package/dist/core/adapters/config/cursor.js +74 -0
- package/dist/core/adapters/config/opencode.d.ts +23 -0
- package/dist/core/adapters/config/opencode.js +73 -0
- package/dist/core/adapters/config/windsurf.d.ts +26 -0
- package/dist/core/adapters/config/windsurf.js +74 -0
- package/dist/core/adapters/index.d.ts +45 -0
- package/dist/core/adapters/index.js +84 -0
- package/dist/core/adapters/scripts/install-adapter.d.ts +19 -0
- package/dist/core/adapters/scripts/install-adapter.js +149 -0
- package/dist/core/adapters/timeline.d.ts +23 -0
- package/dist/core/adapters/timeline.js +88 -0
- package/dist/core/adapters/types.d.ts +137 -0
- package/dist/core/adapters/types.js +50 -0
- package/dist/core/agent-preferences.d.ts +16 -0
- package/dist/core/agent-preferences.js +124 -0
- package/dist/{algorithms → core/algorithms}/analytics/token-estimator.d.ts +1 -1
- package/dist/{algorithms → core/algorithms}/analytics/token-estimator.js +3 -3
- package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.d.ts +1 -1
- package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.js +1 -1
- package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.d.ts +1 -1
- package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.js +7 -10
- package/dist/{algorithms → core/algorithms}/handlers/approve-merge.js +4 -4
- package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.js +3 -3
- package/dist/{algorithms → core/algorithms}/handlers/get-stats.js +3 -3
- package/dist/{algorithms → core/algorithms}/handlers/list-proposals.js +3 -3
- package/dist/{algorithms → core/algorithms}/handlers/preview-merge.js +3 -3
- package/dist/{algorithms → core/algorithms}/handlers/reject-merge.js +3 -3
- package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.js +3 -3
- package/dist/core/algorithms/index.d.ts +21 -0
- package/dist/core/algorithms/index.js +26 -0
- package/dist/core/algorithms/operations/cache-maintenance.d.ts +12 -0
- package/dist/core/algorithms/operations/cache-maintenance.js +157 -0
- package/dist/{algorithms → core/algorithms}/safety/safety-checks.d.ts +2 -6
- package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.d.ts +19 -1
- package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.js +74 -123
- package/dist/core/algorithms/types.d.ts +125 -0
- package/dist/core/algorithms/types.js +5 -0
- package/dist/core/associations.d.ts +3 -2
- package/dist/core/associations.js +37 -2
- package/dist/core/autosave.d.ts +19 -0
- package/dist/core/autosave.js +16 -0
- 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 +2 -0
- package/dist/core/commands/mcp-server.js +6 -0
- package/dist/core/commands/remember.d.ts +24 -0
- package/dist/core/commands/remember.js +144 -0
- package/dist/core/compression.d.ts +45 -0
- package/dist/core/compression.js +160 -0
- package/dist/core/context/agent-context.d.ts +106 -0
- package/dist/core/context/agent-context.js +274 -0
- package/dist/core/{context-paging.d.ts → context/context-paging.d.ts} +2 -12
- package/dist/core/{context-paging.js → context/context-paging.js} +19 -39
- package/dist/core/context/context-window.d.ts +40 -0
- package/dist/core/context/context-window.js +177 -0
- package/dist/core/context/context.js +22 -0
- 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/embeddings/local-embeddings.d.ts +11 -0
- 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 -401
- package/dist/core/error-handling.d.ts +63 -0
- package/dist/core/error-handling.js +173 -0
- 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 +83 -0
- package/dist/core/hooks/agent-hooks.js +521 -0
- package/dist/core/hooks/auto-tagger.d.ts +19 -0
- package/dist/core/hooks/auto-tagger.js +155 -0
- package/dist/core/hooks/capture-filter.d.ts +41 -0
- package/dist/core/hooks/capture-filter.js +128 -0
- 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/{agent-memory.js → ingestion/agent-memory.js} +5 -7
- package/dist/core/{core-memory.d.ts → ingestion/core-memory.d.ts} +2 -2
- package/dist/core/{core-memory.js → ingestion/core-memory.js} +7 -7
- package/dist/core/ingestion/learnings.d.ts +57 -0
- package/dist/core/ingestion/learnings.js +205 -0
- package/dist/core/ingestion/signal-engine.d.ts +41 -0
- package/dist/core/ingestion/signal-engine.js +201 -0
- package/dist/core/integrations/obsidian-vault.d.ts +31 -0
- package/dist/core/integrations/obsidian-vault.js +156 -0
- package/dist/core/lib/db-client.d.ts +114 -0
- package/dist/core/lib/db-client.js +130 -0
- 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 +132 -0
- package/dist/core/lib/schemas.js +87 -0
- package/dist/core/lib/types.d.ts +45 -0
- package/dist/core/lib/types.js +6 -0
- package/dist/core/{utils.d.ts → lib/utils.d.ts} +5 -0
- package/dist/core/lib/utils.js +145 -0
- package/dist/core/lib/validation.d.ts +38 -0
- package/dist/core/lib/validation.js +151 -0
- package/dist/core/lifecycle.d.ts +7 -1
- package/dist/core/lifecycle.js +152 -42
- package/dist/core/logger.d.ts +1 -0
- package/dist/core/logger.js +13 -1
- package/dist/core/mcp/tools.d.ts +0 -2
- package/dist/core/mcp/tools.js +35 -90
- package/dist/core/mcp/types.d.ts +25 -253
- package/dist/core/mcp/types.js +2 -2
- package/dist/core/memory/categorizer.js +2 -0
- package/dist/core/memory/conflict-detector.js +1 -1
- package/dist/core/memory/consolidation.d.ts +1 -10
- package/dist/core/memory/consolidation.js +4 -39
- package/dist/core/memory/context-collector.js +1 -1
- package/dist/core/memory/edit-workflow.js +1 -1
- package/dist/core/memory/entity-extractor.d.ts +4 -0
- package/dist/core/memory/entity-extractor.js +30 -16
- package/dist/core/memory/entity-resolver.js +7 -7
- 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/fact-extractor.js +12 -12
- package/dist/core/memory/feedback-tracker.js +1 -1
- package/dist/core/memory/hooks.d.ts +88 -0
- package/dist/core/memory/hooks.js +174 -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 +9 -11
- package/dist/core/memory/hybrid-search.js +496 -273
- package/dist/core/memory/importance.d.ts +2 -24
- package/dist/core/memory/importance.js +7 -91
- package/dist/core/memory/index.d.ts +1 -0
- package/dist/core/memory/index.js +1 -0
- package/dist/core/memory/loader.d.ts +31 -0
- package/dist/core/memory/loader.js +141 -0
- package/dist/core/memory/markdown/markdown-storage.d.ts +72 -0
- package/dist/core/memory/markdown/markdown-storage.js +243 -0
- package/dist/core/memory/memories.d.ts +23 -19
- package/dist/core/memory/memories.js +243 -228
- package/dist/core/memory/memory-lifecycle.d.ts +8 -0
- package/dist/core/memory/memory-lifecycle.js +47 -0
- package/dist/core/memory/migrate.d.ts +21 -0
- package/dist/core/memory/migrate.js +134 -0
- package/dist/core/memory/normalization.d.ts +7 -0
- package/dist/core/memory/normalization.js +26 -0
- package/dist/core/memory/path-strengthener.d.ts +39 -0
- package/dist/core/memory/path-strengthener.js +150 -0
- package/dist/core/memory/progressive-disclosure.js +1 -1
- package/dist/core/memory/query-processor.js +37 -3
- package/dist/core/memory/query-rewriter.js +9 -9
- package/dist/core/memory/retrieval-feedback.d.ts +70 -0
- package/dist/core/memory/retrieval-feedback.js +213 -0
- package/dist/core/memory/serialization.d.ts +4 -0
- package/dist/core/memory/serialization.js +49 -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 +15 -0
- package/dist/core/memory/stats.js +69 -13
- package/dist/core/memory/temporal-facts.js +21 -0
- package/dist/core/memory/trigger-detector.d.ts +8 -1
- package/dist/core/memory/trigger-detector.js +42 -5
- package/dist/core/memory/write-gate.js +1 -1
- package/dist/core/places/index.d.ts +14 -0
- package/dist/core/places/index.js +14 -0
- package/dist/core/places/memory-places.d.ts +68 -0
- package/dist/core/places/memory-places.js +261 -0
- package/dist/core/places/places.d.ts +88 -0
- package/dist/core/places/places.js +314 -0
- package/dist/core/places/rules.d.ts +74 -0
- package/dist/core/places/rules.js +240 -0
- package/dist/core/places/walking.d.ts +56 -0
- package/dist/core/places/walking.js +121 -0
- package/dist/core/projects.d.ts +5 -0
- package/dist/core/projects.js +47 -18
- package/dist/core/responses.d.ts +96 -0
- package/dist/core/responses.js +122 -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 +193 -10
- package/dist/core/scheduler/index.d.ts +1 -1
- package/dist/core/scheduler/index.js +1 -1
- package/dist/core/scheduler/job-runner.js +2 -2
- package/dist/core/search/conversations.js +40 -42
- package/dist/core/search/entities.js +6 -9
- package/dist/core/search/graph-boost.d.ts +7 -0
- package/dist/core/search/graph-boost.js +23 -0
- package/dist/core/search/qmd-wrapper.d.ts +36 -0
- package/dist/core/search/qmd-wrapper.js +58 -0
- package/dist/core/security/encrypt.d.ts +6 -0
- package/dist/core/security/encrypt.js +47 -0
- package/dist/core/{governance.d.ts → security/governance.d.ts} +6 -1
- package/dist/core/security/governance.js +79 -0
- package/dist/core/session/auto-load.js +34 -9
- package/dist/core/session/entity-tracker.d.ts +62 -0
- package/dist/core/session/entity-tracker.js +287 -0
- package/dist/core/session/index.d.ts +1 -1
- package/dist/core/session/index.js +1 -1
- package/dist/core/session/reference-resolver.d.ts +26 -0
- package/dist/core/session/reference-resolver.js +121 -0
- package/dist/core/{session-hooks → session}/self-iteration-job.d.ts +15 -0
- package/dist/core/{session-hooks → session}/self-iteration-job.js +195 -90
- 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/{cache.js → storage/cache.js} +2 -2
- package/dist/core/utils/memory-operations.js +1 -1
- package/dist/core/utils/summarization-helpers.d.ts +0 -4
- package/dist/core/utils/summarization-helpers.js +1 -6
- package/dist/core/utils/vector-operations.d.ts +71 -0
- package/dist/core/utils/vector-operations.js +129 -0
- package/dist/db/adapter.d.ts +3 -3
- package/dist/db/adapter.js +99 -88
- package/dist/db/bootstrap.d.ts +2 -0
- package/dist/db/bootstrap.js +921 -674
- package/dist/{drizzle → db/drizzle}/schema-sqlite.d.ts +775 -25
- package/dist/{drizzle → db/drizzle}/schema-sqlite.js +170 -24
- package/dist/{drizzle → db/drizzle}/schema.d.ts +731 -32
- package/dist/{drizzle → db/drizzle}/schema.js +192 -32
- package/dist/db/drizzle.config.d.ts +3 -0
- package/dist/db/drizzle.config.js +12 -0
- package/dist/db/index.d.ts +1 -5
- package/dist/db/index.js +51 -8
- 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/neon.d.ts +8 -0
- package/dist/db/neon.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 +39 -0
- package/dist/db/schema/index.js +51 -0
- 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/db/schema/tables/context-sessions.d.ts +9 -0
- package/dist/db/schema/tables/context-sessions.js +37 -0
- package/dist/db/schema/tables/conversations.d.ts +9 -0
- package/dist/db/schema/tables/conversations.js +47 -0
- package/dist/db/schema/tables/core-memory.d.ts +9 -0
- package/dist/db/schema/tables/core-memory.js +41 -0
- package/dist/db/schema/tables/entities.d.ts +9 -0
- package/dist/db/schema/tables/entities.js +39 -0
- package/dist/db/schema/tables/entity-relations.d.ts +9 -0
- package/dist/db/schema/tables/entity-relations.js +31 -0
- package/dist/db/schema/tables/learnings.d.ts +9 -0
- package/dist/db/schema/tables/learnings.js +66 -0
- package/dist/db/schema/tables/memories.d.ts +9 -0
- package/dist/db/schema/tables/memories.js +161 -0
- package/dist/db/schema/tables/memory-associations.d.ts +9 -0
- package/dist/db/schema/tables/memory-associations.js +39 -0
- package/dist/db/schema/tables/memory-hash-cache.d.ts +9 -0
- package/dist/db/schema/tables/memory-hash-cache.js +29 -0
- package/dist/db/schema/tables/memory-merge-history.d.ts +9 -0
- package/dist/db/schema/tables/memory-merge-history.js +33 -0
- package/dist/db/schema/tables/memory-merge-proposals.d.ts +9 -0
- package/dist/db/schema/tables/memory-merge-proposals.js +39 -0
- package/dist/db/schema/tables/messages.d.ts +9 -0
- package/dist/db/schema/tables/messages.js +41 -0
- package/dist/db/schema/tables/namespaces.d.ts +9 -0
- package/dist/db/schema/tables/namespaces.js +37 -0
- package/dist/db/schema/tables/projects.d.ts +9 -0
- package/dist/db/schema/tables/projects.js +31 -0
- package/dist/db/schema/tables/users.d.ts +9 -0
- package/dist/db/schema/tables/users.js +27 -0
- package/dist/db/schema.d.ts +1 -1
- package/dist/db/schema.js +2 -2
- package/dist/db/supabase.d.ts +9 -0
- package/dist/db/supabase.js +24 -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 -0
- package/package.json +132 -173
- 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 +107 -114
- package/skills/squish-memory/install.sh +3 -3
- package/skills/squish-memory/{claude-desktop.json → references/claude-desktop.json} +12 -12
- package/skills/squish-memory/{openclaw.json → references/openclaw.json} +13 -13
- package/skills/squish-memory/{opencode.json → references/opencode.json} +14 -14
- package/.claude-plugin/marketplace.json +0 -20
- package/.claude-plugin/plugin.json +0 -32
- package/.env.mcp.example +0 -60
- package/.mcp.json +0 -11
- package/QUICK-START.md +0 -71
- package/bin/squish-add.mjs +0 -32
- package/bin/squish-rm.mjs +0 -21
- package/commands/context-paging.md +0 -51
- package/commands/context-status.md +0 -22
- package/commands/context.md +0 -5
- package/commands/core-memory.md +0 -56
- package/commands/health.md +0 -5
- package/commands/init.md +0 -39
- package/commands/merge.md +0 -113
- package/commands/observe.md +0 -5
- package/commands/recall.md +0 -5
- package/commands/remember.md +0 -11
- package/commands/search.md +0 -10
- package/config/mcp-cli-fallback-policy.json +0 -22
- package/config/mcp.json +0 -38
- package/config/plugin-manifest.json +0 -152
- package/config/plugin-manifest.schema.json +0 -244
- package/config/remote-memory-policy.json +0 -32
- package/dist/api/web/index.d.ts +0 -3
- package/dist/api/web/index.js +0 -4
- package/dist/api/web/web-server.d.ts +0 -3
- package/dist/api/web/web-server.js +0 -6
- package/dist/api/web/web.d.ts +0 -4
- package/dist/api/web/web.js +0 -639
- package/dist/commands/managed-sync.d.ts +0 -10
- package/dist/commands/managed-sync.js +0 -64
- package/dist/commands/mcp-server.d.ts +0 -3
- package/dist/commands/mcp-server.js +0 -393
- package/dist/core/context.js +0 -24
- package/dist/core/governance.js +0 -64
- package/dist/core/local-embeddings.d.ts +0 -6
- package/dist/core/local-embeddings.js +0 -20
- 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/observations.d.ts +0 -26
- package/dist/core/observations.js +0 -110
- package/dist/core/requirements.d.ts +0 -20
- package/dist/core/requirements.js +0 -35
- package/dist/core/search/qmd-search.d.ts +0 -61
- package/dist/core/search/qmd-search.js +0 -178
- package/dist/core/snapshots.d.ts +0 -29
- package/dist/core/snapshots.js +0 -220
- package/dist/core/sync/qmd-sync.d.ts +0 -106
- package/dist/core/sync/qmd-sync.js +0 -213
- package/dist/core/utils.js +0 -74
- package/dist/index.d.ts +0 -19
- package/dist/index.js +0 -997
- 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/hooks/hooks.json +0 -52
- package/hooks/post-tool-use.js +0 -26
- package/hooks/session-end.js +0 -28
- package/hooks/session-start.js +0 -33
- package/hooks/user-prompt-submit.js +0 -26
- package/hooks/utils.js +0 -153
- package/npx-installer.js +0 -208
- package/packages/plugin-claude-code/README.md +0 -73
- package/packages/plugin-claude-code/dist/plugin-wrapper.d.ts +0 -35
- package/packages/plugin-claude-code/dist/plugin-wrapper.js +0 -191
- package/packages/plugin-claude-code/package.json +0 -31
- package/packages/plugin-openclaw/README.md +0 -70
- package/packages/plugin-openclaw/dist/index.d.ts +0 -49
- package/packages/plugin-openclaw/dist/index.js +0 -262
- package/packages/plugin-openclaw/openclaw.plugin.json +0 -94
- package/packages/plugin-openclaw/package.json +0 -31
- package/packages/plugin-opencode/install.mjs +0 -217
- package/packages/plugin-opencode/package.json +0 -21
- package/plugin.json +0 -32
- package/scripts/build-release.sh +0 -36
- package/scripts/check-secrets.js +0 -132
- package/scripts/db/check-db.mjs +0 -88
- package/scripts/db/fix-all-columns.mjs +0 -52
- package/scripts/db/fix-schema-all.mjs +0 -55
- package/scripts/db/fix-schema-full.mjs +0 -46
- package/scripts/db/fix-schema.mjs +0 -38
- package/scripts/db/init-db.mjs +0 -13
- package/scripts/db/recreate-db.mjs +0 -14
- package/scripts/generate-mcp.mjs +0 -264
- package/scripts/github-release.sh +0 -77
- package/scripts/init-dirs.mjs +0 -13
- package/scripts/install-interactive.mjs +0 -677
- package/scripts/install-mcp.mjs +0 -116
- package/scripts/install-plugin.mjs +0 -415
- package/scripts/install-web.sh +0 -120
- package/scripts/install.mjs +0 -340
- package/scripts/openclaw-bootstrap.mjs +0 -127
- package/scripts/package-release.sh +0 -71
- package/scripts/remote-preflight.mjs +0 -62
- package/scripts/squish-fallback.mjs +0 -132
- package/scripts/test/test-all-systems.mjs +0 -139
- package/scripts/test/test-memory-system.mjs +0 -139
- package/scripts/test/test-v0.5.0.mjs +0 -210
- package/scripts/test-interactive.mjs +0 -131
- package/scripts/verify-mcp.mjs +0 -214
- package/skills/memory-guide/SKILL.md +0 -332
- package/skills/squish-cli/SKILL.md +0 -240
- package/skills/squish-mcp/SKILL.md +0 -355
- package/skills/squish-memory/install.mjs +0 -335
- package/skills/squish-memory/skill.json +0 -32
- /package/dist/{algorithms → core/algorithms}/detection/hash-filters.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/detection/hash-filters.js +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/approve-merge.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/get-stats.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/list-proposals.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/preview-merge.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/reject-merge.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/safety/safety-checks.js +0 -0
- /package/dist/{algorithms → core/algorithms}/utils/response-builder.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/utils/response-builder.js +0 -0
- /package/dist/core/{context.d.ts → context/context.d.ts} +0 -0
- /package/dist/core/{agent-memory.d.ts → ingestion/agent-memory.d.ts} +0 -0
- /package/dist/core/{privacy.d.ts → security/privacy.d.ts} +0 -0
- /package/dist/core/{privacy.js → security/privacy.js} +0 -0
- /package/dist/core/{secret-detector.d.ts → security/secret-detector.d.ts} +0 -0
- /package/dist/core/{secret-detector.js → security/secret-detector.js} +0 -0
- /package/dist/core/{session-hooks → session}/session-hooks.d.ts +0 -0
- /package/dist/core/{session-hooks → session}/session-hooks.js +0 -0
- /package/dist/core/{cache.d.ts → storage/cache.d.ts} +0 -0
- /package/dist/core/{database.d.ts → storage/database.d.ts} +0 -0
- /package/dist/core/{database.js → storage/database.js} +0 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Learnings Module
|
|
3
|
+
* Agent learnings: success, failure, fix, insight
|
|
4
|
+
* With auto-linking to similar memories and learnings
|
|
5
|
+
*/
|
|
6
|
+
export type LearningType = 'success' | 'failure' | 'fix' | 'insight';
|
|
7
|
+
export interface LearningInput {
|
|
8
|
+
type: LearningType;
|
|
9
|
+
content: string;
|
|
10
|
+
context?: string;
|
|
11
|
+
action?: string;
|
|
12
|
+
target?: string;
|
|
13
|
+
project?: string;
|
|
14
|
+
memoryId?: string;
|
|
15
|
+
autoLink?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface LearningRecord {
|
|
18
|
+
id: string;
|
|
19
|
+
projectId?: string | null;
|
|
20
|
+
conversationId?: string | null;
|
|
21
|
+
type: LearningType;
|
|
22
|
+
action: string;
|
|
23
|
+
target?: string | null;
|
|
24
|
+
summary: string;
|
|
25
|
+
details?: Record<string, unknown> | null;
|
|
26
|
+
memoryId?: string | null;
|
|
27
|
+
isImported?: boolean;
|
|
28
|
+
createdAt?: string | null;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Create a learning and optionally auto-link to similar memories/learnings
|
|
32
|
+
*/
|
|
33
|
+
export declare function createLearning(input: LearningInput): Promise<LearningRecord>;
|
|
34
|
+
/**
|
|
35
|
+
* Get learnings for a project
|
|
36
|
+
*/
|
|
37
|
+
export declare function getLearnings(projectPath: string, limit: number): Promise<LearningRecord[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Get recent learnings
|
|
40
|
+
*/
|
|
41
|
+
export declare function getRecentLearnings(projectPath: string, limit?: number): Promise<LearningRecord[]>;
|
|
42
|
+
/**
|
|
43
|
+
* Get learning by ID
|
|
44
|
+
*/
|
|
45
|
+
export declare function getLearningById(learningId: string): Promise<LearningRecord | null>;
|
|
46
|
+
/**
|
|
47
|
+
* Get learnings linked to a specific memory
|
|
48
|
+
*/
|
|
49
|
+
export declare function getLearningsForMemory(memoryId: string): Promise<LearningRecord[]>;
|
|
50
|
+
/**
|
|
51
|
+
* Delete a learning
|
|
52
|
+
*/
|
|
53
|
+
export declare function deleteLearning(learningId: string): Promise<boolean>;
|
|
54
|
+
export declare const getObservations: typeof getLearnings;
|
|
55
|
+
export declare const getRecentObservations: typeof getRecentLearnings;
|
|
56
|
+
export declare const getObservationById: typeof getLearningById;
|
|
57
|
+
//# sourceMappingURL=learnings.d.ts.map
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Learnings Module
|
|
3
|
+
* Agent learnings: success, failure, fix, insight
|
|
4
|
+
* With auto-linking to similar memories and learnings
|
|
5
|
+
*/
|
|
6
|
+
import { randomUUID } from 'crypto';
|
|
7
|
+
import { desc, eq } from 'drizzle-orm';
|
|
8
|
+
import { getEmbedding } from '../embeddings.js';
|
|
9
|
+
import { getOrCreateProject, requireProject } from '../projects.js';
|
|
10
|
+
import { serializeMetadata, deserializeMetadata } from '../memory/serialization.js';
|
|
11
|
+
import { normalizeTimestamp, prepareEmbedding } from '../lib/utils.js';
|
|
12
|
+
import { logger } from '../logger.js';
|
|
13
|
+
import { getDbClient } from '../lib/db-client.js';
|
|
14
|
+
import { createAssociation } from '../associations.js';
|
|
15
|
+
import { search } from '../memory/memories.js';
|
|
16
|
+
import { updateAgentPreference } from '../agent-preferences.js';
|
|
17
|
+
/**
|
|
18
|
+
* Create a learning and optionally auto-link to similar memories/learnings
|
|
19
|
+
*/
|
|
20
|
+
export async function createLearning(input) {
|
|
21
|
+
const { db, schema } = await getDbClient();
|
|
22
|
+
const project = await getOrCreateProject(input.project);
|
|
23
|
+
const embedding = await getEmbedding(input.content);
|
|
24
|
+
const id = randomUUID();
|
|
25
|
+
const learningType = input.type;
|
|
26
|
+
const autoLink = input.autoLink !== false; // default true
|
|
27
|
+
// Build details with learning metadata
|
|
28
|
+
const details = serializeMetadata({
|
|
29
|
+
learningType: learningType,
|
|
30
|
+
learningContent: input.content,
|
|
31
|
+
learningContext: input.context,
|
|
32
|
+
});
|
|
33
|
+
const embeddingValues = prepareEmbedding(embedding);
|
|
34
|
+
// Insert the learning
|
|
35
|
+
await db.insert(schema.learnings).values({
|
|
36
|
+
id,
|
|
37
|
+
projectId: project?.id ?? null,
|
|
38
|
+
type: learningType,
|
|
39
|
+
action: input.action ?? input.content,
|
|
40
|
+
summary: input.context || input.content,
|
|
41
|
+
target: input.target ?? null,
|
|
42
|
+
details,
|
|
43
|
+
memoryId: input.memoryId ?? null,
|
|
44
|
+
...embeddingValues,
|
|
45
|
+
createdAt: new Date(),
|
|
46
|
+
});
|
|
47
|
+
// If memoryId provided, create bidirectional link
|
|
48
|
+
if (input.memoryId) {
|
|
49
|
+
await createAssociation(input.memoryId, // from memory
|
|
50
|
+
id, // to learning
|
|
51
|
+
'relates_to', 1);
|
|
52
|
+
}
|
|
53
|
+
// Auto-link to similar memories and learnings (if enabled)
|
|
54
|
+
if (autoLink) {
|
|
55
|
+
await autoLinkLearning(id, input.content, project?.id ?? null);
|
|
56
|
+
}
|
|
57
|
+
// Extract and store agent preferences from this learning
|
|
58
|
+
await updateAgentPreference(project?.id ?? 'default', input.content, id);
|
|
59
|
+
return {
|
|
60
|
+
id,
|
|
61
|
+
projectId: project?.id ?? null,
|
|
62
|
+
conversationId: null,
|
|
63
|
+
type: learningType,
|
|
64
|
+
action: input.action ?? input.content,
|
|
65
|
+
target: input.target ?? null,
|
|
66
|
+
summary: input.context || input.content,
|
|
67
|
+
details: { learningType: learningType, learningContent: input.content, learningContext: input.context },
|
|
68
|
+
memoryId: input.memoryId ?? null,
|
|
69
|
+
createdAt: new Date().toISOString(),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Auto-link a learning to similar memories above threshold
|
|
74
|
+
*/
|
|
75
|
+
async function autoLinkLearning(learningId, content, projectId) {
|
|
76
|
+
const SIMILARITY_THRESHOLD = 0.85;
|
|
77
|
+
const MAX_LINKS = 5;
|
|
78
|
+
if (!projectId)
|
|
79
|
+
return;
|
|
80
|
+
try {
|
|
81
|
+
// Search for similar memories using the search function
|
|
82
|
+
const similarMemories = await search({
|
|
83
|
+
query: content,
|
|
84
|
+
limit: MAX_LINKS,
|
|
85
|
+
});
|
|
86
|
+
// Filter by similarity threshold
|
|
87
|
+
const relevantMemories = similarMemories.filter((m) => (m.similarity ?? 0) >= SIMILARITY_THRESHOLD);
|
|
88
|
+
// Create associations with memories
|
|
89
|
+
for (const mem of relevantMemories) {
|
|
90
|
+
await createAssociation(learningId, // from learning
|
|
91
|
+
mem.id, // to memory
|
|
92
|
+
'relates_to', mem.similarity ?? 0.9);
|
|
93
|
+
}
|
|
94
|
+
logger.info(`Auto-linked learning ${learningId} to ${relevantMemories.length} memories`);
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
logger.error('Error in auto-linking:', error);
|
|
98
|
+
// Don't fail learning creation if auto-link fails
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Get learnings for a project
|
|
103
|
+
*/
|
|
104
|
+
export async function getLearnings(projectPath, limit) {
|
|
105
|
+
try {
|
|
106
|
+
const { db, schema } = await getDbClient();
|
|
107
|
+
const project = await requireProject(projectPath);
|
|
108
|
+
const rows = await db.select().from(schema.learnings)
|
|
109
|
+
.where(eq(schema.learnings.projectId, project.id))
|
|
110
|
+
.orderBy(desc(schema.learnings.createdAt))
|
|
111
|
+
.limit(limit);
|
|
112
|
+
return rows.map((row) => normalizeLearning(row));
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Get recent learnings
|
|
120
|
+
*/
|
|
121
|
+
export async function getRecentLearnings(projectPath, limit = 10) {
|
|
122
|
+
try {
|
|
123
|
+
const { db, schema } = await getDbClient();
|
|
124
|
+
const project = await requireProject(projectPath);
|
|
125
|
+
const rows = await db.select().from(schema.learnings)
|
|
126
|
+
.where(eq(schema.learnings.projectId, project.id))
|
|
127
|
+
.orderBy(desc(schema.learnings.createdAt))
|
|
128
|
+
.limit(limit);
|
|
129
|
+
return rows.map((row) => normalizeLearning(row));
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
logger.error('Error getting recent learnings', error);
|
|
133
|
+
throw error;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Get learning by ID
|
|
138
|
+
*/
|
|
139
|
+
export async function getLearningById(learningId) {
|
|
140
|
+
try {
|
|
141
|
+
const { db, schema } = await getDbClient();
|
|
142
|
+
const rows = await db.select().from(schema.learnings)
|
|
143
|
+
.where(eq(schema.learnings.id, learningId))
|
|
144
|
+
.limit(1);
|
|
145
|
+
if (rows.length === 0)
|
|
146
|
+
return null;
|
|
147
|
+
return normalizeLearning(rows[0]);
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
logger.error('Error getting learning', error);
|
|
151
|
+
throw error;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Get learnings linked to a specific memory
|
|
156
|
+
*/
|
|
157
|
+
export async function getLearningsForMemory(memoryId) {
|
|
158
|
+
try {
|
|
159
|
+
const { db, schema } = await getDbClient();
|
|
160
|
+
const rows = await db.select().from(schema.learnings)
|
|
161
|
+
.where(eq(schema.learnings.memoryId, memoryId))
|
|
162
|
+
.orderBy(desc(schema.learnings.createdAt));
|
|
163
|
+
return rows.map((row) => normalizeLearning(row));
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
logger.error('Error getting learnings for memory', error);
|
|
167
|
+
throw error;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Delete a learning
|
|
172
|
+
*/
|
|
173
|
+
export async function deleteLearning(learningId) {
|
|
174
|
+
try {
|
|
175
|
+
const { db, schema } = await getDbClient();
|
|
176
|
+
await db.delete(schema.learnings)
|
|
177
|
+
.where(eq(schema.learnings.id, learningId));
|
|
178
|
+
return true;
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
logger.error('Error deleting learning', error);
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function normalizeLearning(row) {
|
|
186
|
+
const details = deserializeMetadata(row.details ?? null);
|
|
187
|
+
return {
|
|
188
|
+
id: row.id,
|
|
189
|
+
projectId: row.projectId ?? row.project_id ?? null,
|
|
190
|
+
conversationId: row.conversationId ?? row.conversation_id ?? null,
|
|
191
|
+
type: row.type,
|
|
192
|
+
action: row.action,
|
|
193
|
+
target: row.target ?? null,
|
|
194
|
+
summary: row.summary,
|
|
195
|
+
details,
|
|
196
|
+
memoryId: row.memoryId ?? row.memory_id ?? null,
|
|
197
|
+
isImported: row.isImported ?? row.is_imported ?? false,
|
|
198
|
+
createdAt: normalizeTimestamp(row.createdAt ?? row.created_at),
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
// Backwards compatibility aliases
|
|
202
|
+
export const getObservations = getLearnings;
|
|
203
|
+
export const getRecentObservations = getRecentLearnings;
|
|
204
|
+
export const getObservationById = getLearningById;
|
|
205
|
+
//# sourceMappingURL=learnings.js.map
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export type SignalClassification = 'discard' | 'session-only' | 'durable-distilled' | 'durable-raw+distilled';
|
|
2
|
+
export interface SignalEventInput {
|
|
3
|
+
toolName: string;
|
|
4
|
+
toolInput?: Record<string, unknown>;
|
|
5
|
+
toolResult?: unknown;
|
|
6
|
+
sessionId?: string | null;
|
|
7
|
+
}
|
|
8
|
+
export interface SignalDecision {
|
|
9
|
+
classification: SignalClassification;
|
|
10
|
+
reasons: string[];
|
|
11
|
+
storeRaw: boolean;
|
|
12
|
+
importance: 'low' | 'medium' | 'high';
|
|
13
|
+
wakeUpPriority: 'low' | 'medium' | 'high';
|
|
14
|
+
placeHint: {
|
|
15
|
+
placeType: 'inbox' | 'ref' | 'wip' | 'sandbox' | 'board' | 'sparks' | 'archive' | null;
|
|
16
|
+
confidence: number;
|
|
17
|
+
};
|
|
18
|
+
graphHint: {
|
|
19
|
+
shouldEnrich: boolean;
|
|
20
|
+
entityTerms: string[];
|
|
21
|
+
reason?: string;
|
|
22
|
+
};
|
|
23
|
+
content: string;
|
|
24
|
+
contentHash: string;
|
|
25
|
+
estimatedSavings: number;
|
|
26
|
+
}
|
|
27
|
+
export interface DistillInput {
|
|
28
|
+
toolName: string;
|
|
29
|
+
command?: string;
|
|
30
|
+
content: string;
|
|
31
|
+
classification: SignalClassification;
|
|
32
|
+
}
|
|
33
|
+
export declare function hashSignalContent(content: string): string;
|
|
34
|
+
export declare function classifySignalEvent(input: SignalEventInput): SignalDecision;
|
|
35
|
+
export declare function distillSignalEvent(input: DistillInput): string;
|
|
36
|
+
export declare function shouldReturnRawFallback(input: {
|
|
37
|
+
query: string;
|
|
38
|
+
hasRawFallback: boolean;
|
|
39
|
+
nuanceSuppressed: boolean;
|
|
40
|
+
}): boolean;
|
|
41
|
+
//# sourceMappingURL=signal-engine.d.ts.map
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { createHash } from 'crypto';
|
|
2
|
+
function normalizeContent(toolResult) {
|
|
3
|
+
if (typeof toolResult === 'string')
|
|
4
|
+
return toolResult;
|
|
5
|
+
if (toolResult == null)
|
|
6
|
+
return '';
|
|
7
|
+
if (typeof toolResult === 'object') {
|
|
8
|
+
try {
|
|
9
|
+
return JSON.stringify(toolResult, null, 2);
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return String(toolResult);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return String(toolResult);
|
|
16
|
+
}
|
|
17
|
+
function estimateNoiseSavings(raw, distilled) {
|
|
18
|
+
return Math.max(0, raw.length - distilled.length);
|
|
19
|
+
}
|
|
20
|
+
function extractEntityTerms(content) {
|
|
21
|
+
const matches = content.match(/\b([A-Z][A-Za-z0-9]+|[a-z]+(?:\.[a-z0-9_-]+)+|[A-Za-z0-9_-]+\.ts)\b/g) ?? [];
|
|
22
|
+
return [...new Set(matches.filter((term) => term.length > 2))].slice(0, 6);
|
|
23
|
+
}
|
|
24
|
+
function inferPlaceHint(toolName, normalized) {
|
|
25
|
+
if (['write', 'edit', 'multiedit'].includes(toolName.toLowerCase()) || /\b(fix|bug|implement|refactor|edited|wrote)\b/.test(normalized)) {
|
|
26
|
+
return { placeType: 'wip', confidence: 0.88 };
|
|
27
|
+
}
|
|
28
|
+
if (/\b(test|assertionerror|traceback|exception|experiment|verify)\b/.test(normalized)) {
|
|
29
|
+
return { placeType: 'sandbox', confidence: 0.92 };
|
|
30
|
+
}
|
|
31
|
+
if (/\b(hypothesis|plan|decided|roadmap|task|todo|investigate)\b/.test(normalized)) {
|
|
32
|
+
return { placeType: 'board', confidence: 0.74 };
|
|
33
|
+
}
|
|
34
|
+
if (/\b(research|docs|pattern|reference|api|architecture)\b/.test(normalized)) {
|
|
35
|
+
return { placeType: 'ref', confidence: 0.72 };
|
|
36
|
+
}
|
|
37
|
+
if (/\b(idea|explore|future|concept)\b/.test(normalized)) {
|
|
38
|
+
return { placeType: 'sparks', confidence: 0.68 };
|
|
39
|
+
}
|
|
40
|
+
return { placeType: null, confidence: 0 };
|
|
41
|
+
}
|
|
42
|
+
function inferGraphHint(normalized, content, classification) {
|
|
43
|
+
if (classification === 'discard' || classification === 'session-only') {
|
|
44
|
+
return { shouldEnrich: false, entityTerms: [], reason: 'non-durable signal' };
|
|
45
|
+
}
|
|
46
|
+
const entityTerms = extractEntityTerms(content);
|
|
47
|
+
const hasStructuredSignal = entityTerms.length > 0 || /\b(fix|decision|preference|error|graph|ranking|entity|relationship)\b/.test(normalized);
|
|
48
|
+
if (!hasStructuredSignal) {
|
|
49
|
+
return { shouldEnrich: false, entityTerms: [], reason: 'no graph-worthy entities' };
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
shouldEnrich: true,
|
|
53
|
+
entityTerms,
|
|
54
|
+
reason: 'durable signal with identifiable entities',
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
export function hashSignalContent(content) {
|
|
58
|
+
return createHash('sha1').update(content).digest('hex');
|
|
59
|
+
}
|
|
60
|
+
export function classifySignalEvent(input) {
|
|
61
|
+
const toolName = input.toolName;
|
|
62
|
+
const command = String(input.toolInput?.command ?? input.toolInput?.cmd ?? '');
|
|
63
|
+
const content = normalizeContent(input.toolResult);
|
|
64
|
+
const normalized = `${command}\n${content}`.toLowerCase();
|
|
65
|
+
const reasons = [];
|
|
66
|
+
const noisyCommand = /\b(npm|bun|pnpm|yarn)\s+(install|add)\b/.test(normalized) ||
|
|
67
|
+
/\bdownload(ed|ing)?\b|\bfetch(ed|ing)?\b|\bprogress\b|\bresolved\b/.test(normalized);
|
|
68
|
+
if (noisyCommand) {
|
|
69
|
+
const placeHint = inferPlaceHint(toolName, normalized);
|
|
70
|
+
reasons.push('noise filtered from install/build output');
|
|
71
|
+
return {
|
|
72
|
+
classification: 'discard',
|
|
73
|
+
reasons,
|
|
74
|
+
storeRaw: false,
|
|
75
|
+
importance: 'low',
|
|
76
|
+
wakeUpPriority: 'low',
|
|
77
|
+
placeHint,
|
|
78
|
+
graphHint: inferGraphHint(normalized, content, 'discard'),
|
|
79
|
+
content,
|
|
80
|
+
contentHash: hashSignalContent(normalized),
|
|
81
|
+
estimatedSavings: content.length,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
if (/\b(current hypothesis|hypothesis:|investigate|trying next)\b/.test(normalized)) {
|
|
85
|
+
const placeHint = inferPlaceHint(toolName, normalized);
|
|
86
|
+
reasons.push('active session hypothesis');
|
|
87
|
+
return {
|
|
88
|
+
classification: 'session-only',
|
|
89
|
+
reasons,
|
|
90
|
+
storeRaw: false,
|
|
91
|
+
importance: 'medium',
|
|
92
|
+
wakeUpPriority: 'high',
|
|
93
|
+
placeHint,
|
|
94
|
+
graphHint: inferGraphHint(normalized, content, 'session-only'),
|
|
95
|
+
content,
|
|
96
|
+
contentHash: hashSignalContent(normalized),
|
|
97
|
+
estimatedSavings: 0,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
if (/\bcorrection:|actually\b|\binstead of\b|\bprefer(s)?\b/.test(normalized)) {
|
|
101
|
+
const placeHint = inferPlaceHint(toolName, normalized);
|
|
102
|
+
reasons.push('correction or preference worth durable retention');
|
|
103
|
+
return {
|
|
104
|
+
classification: 'durable-distilled',
|
|
105
|
+
reasons,
|
|
106
|
+
storeRaw: false,
|
|
107
|
+
importance: 'high',
|
|
108
|
+
wakeUpPriority: 'high',
|
|
109
|
+
placeHint,
|
|
110
|
+
graphHint: inferGraphHint(normalized, content, 'durable-distilled'),
|
|
111
|
+
content,
|
|
112
|
+
contentHash: hashSignalContent(normalized),
|
|
113
|
+
estimatedSavings: estimateNoiseSavings(content, distillSignalEvent({
|
|
114
|
+
toolName,
|
|
115
|
+
command,
|
|
116
|
+
content,
|
|
117
|
+
classification: 'durable-distilled',
|
|
118
|
+
})),
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
if (/\b(fail|failed|failing|assertionerror|stack trace|traceback|exception)\b/.test(normalized) ||
|
|
122
|
+
/\b(test|pytest|vitest|jest|bun test)\b/.test(normalized)) {
|
|
123
|
+
const placeHint = inferPlaceHint(toolName, normalized);
|
|
124
|
+
reasons.push('test or debugging signal with nuance-sensitive output');
|
|
125
|
+
return {
|
|
126
|
+
classification: 'durable-raw+distilled',
|
|
127
|
+
reasons,
|
|
128
|
+
storeRaw: true,
|
|
129
|
+
importance: 'high',
|
|
130
|
+
wakeUpPriority: 'high',
|
|
131
|
+
placeHint,
|
|
132
|
+
graphHint: inferGraphHint(normalized, content, 'durable-raw+distilled'),
|
|
133
|
+
content,
|
|
134
|
+
contentHash: hashSignalContent(normalized),
|
|
135
|
+
estimatedSavings: estimateNoiseSavings(content, distillSignalEvent({
|
|
136
|
+
toolName,
|
|
137
|
+
command,
|
|
138
|
+
content,
|
|
139
|
+
classification: 'durable-raw+distilled',
|
|
140
|
+
})),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
if (['write', 'edit', 'multiedit'].includes(toolName.toLowerCase())) {
|
|
144
|
+
const placeHint = inferPlaceHint(toolName, normalized);
|
|
145
|
+
reasons.push('meaningful file modification');
|
|
146
|
+
return {
|
|
147
|
+
classification: 'durable-distilled',
|
|
148
|
+
reasons,
|
|
149
|
+
storeRaw: false,
|
|
150
|
+
importance: 'medium',
|
|
151
|
+
wakeUpPriority: 'medium',
|
|
152
|
+
placeHint,
|
|
153
|
+
graphHint: inferGraphHint(normalized, content, 'durable-distilled'),
|
|
154
|
+
content,
|
|
155
|
+
contentHash: hashSignalContent(normalized),
|
|
156
|
+
estimatedSavings: estimateNoiseSavings(content, distillSignalEvent({
|
|
157
|
+
toolName,
|
|
158
|
+
command,
|
|
159
|
+
content,
|
|
160
|
+
classification: 'durable-distilled',
|
|
161
|
+
})),
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
reasons.push('session-scoped operational context');
|
|
165
|
+
const placeHint = inferPlaceHint(toolName, normalized);
|
|
166
|
+
return {
|
|
167
|
+
classification: 'session-only',
|
|
168
|
+
reasons,
|
|
169
|
+
storeRaw: false,
|
|
170
|
+
importance: 'low',
|
|
171
|
+
wakeUpPriority: 'low',
|
|
172
|
+
placeHint,
|
|
173
|
+
graphHint: inferGraphHint(normalized, content, 'session-only'),
|
|
174
|
+
content,
|
|
175
|
+
contentHash: hashSignalContent(normalized),
|
|
176
|
+
estimatedSavings: 0,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
export function distillSignalEvent(input) {
|
|
180
|
+
const lines = input.content
|
|
181
|
+
.split(/\r?\n/)
|
|
182
|
+
.map((line) => line.trim())
|
|
183
|
+
.filter(Boolean);
|
|
184
|
+
const important = lines.filter((line) => /\b(fail|error|exception|traceback|assert|stack|correction|prefer|decision|fix|edited|wrote)\b/i.test(line));
|
|
185
|
+
const selected = important.length > 0 ? important : lines.slice(0, 4);
|
|
186
|
+
const cleaned = selected.filter((line) => !/\b(pass(ing)?|resolved|download(ed|ing)?|progress|packages? added)\b/i.test(line));
|
|
187
|
+
if (/assertionerror|traceback|exception|stack/i.test(input.content) && !cleaned.some((line) => /assertionerror|traceback|exception|stack/i.test(line))) {
|
|
188
|
+
const extra = lines.find((line) => /assertionerror|traceback|exception|stack/i.test(line));
|
|
189
|
+
if (extra)
|
|
190
|
+
cleaned.push(extra);
|
|
191
|
+
}
|
|
192
|
+
return cleaned.slice(0, 6).join('\n');
|
|
193
|
+
}
|
|
194
|
+
export function shouldReturnRawFallback(input) {
|
|
195
|
+
if (!input.hasRawFallback)
|
|
196
|
+
return false;
|
|
197
|
+
if (input.nuanceSuppressed)
|
|
198
|
+
return true;
|
|
199
|
+
return /\b(raw|original|full|stack trace|traceback|stderr|stdout|rewind)\b/i.test(input.query);
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=signal-engine.js.map
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/** Obsidian Vault Integration
|
|
2
|
+
*
|
|
3
|
+
* Appends hot memories to Obsidian daily notes
|
|
4
|
+
* Format: YYYY-MM-DD.md with memory blocks
|
|
5
|
+
*/
|
|
6
|
+
export interface ObsidianMemoryInput {
|
|
7
|
+
content: string;
|
|
8
|
+
id: string;
|
|
9
|
+
type: string;
|
|
10
|
+
tags: string[];
|
|
11
|
+
reasoning?: string;
|
|
12
|
+
memoryContext?: string;
|
|
13
|
+
examples?: string;
|
|
14
|
+
exceptions?: string;
|
|
15
|
+
source?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Append a memory to the daily note in Obsidian vault
|
|
19
|
+
* Creates YYYY-MM-DD.md file if it doesn't exist
|
|
20
|
+
*/
|
|
21
|
+
export declare function appendToObsidianVault(memory: ObsidianMemoryInput, vaultPath: string): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Check if Obsidian vault is connected and accessible
|
|
24
|
+
*/
|
|
25
|
+
export declare function isObsidianConnected(vaultPath: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Read existing memories from Obsidian vault (for import feature)
|
|
28
|
+
* Scans vault for .md files and extracts memory blocks
|
|
29
|
+
*/
|
|
30
|
+
export declare function readFromVault(vaultPath: string): Promise<ObsidianMemoryInput[]>;
|
|
31
|
+
//# sourceMappingURL=obsidian-vault.d.ts.map
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/** Obsidian Vault Integration
|
|
2
|
+
*
|
|
3
|
+
* Appends hot memories to Obsidian daily notes
|
|
4
|
+
* Format: YYYY-MM-DD.md with memory blocks
|
|
5
|
+
*/
|
|
6
|
+
import { existsSync, mkdirSync, appendFileSync, readFileSync, readdirSync } from 'fs';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
import { randomUUID } from 'crypto';
|
|
9
|
+
import { logger } from '../logger.js';
|
|
10
|
+
/**
|
|
11
|
+
* Append a memory to the daily note in Obsidian vault
|
|
12
|
+
* Creates YYYY-MM-DD.md file if it doesn't exist
|
|
13
|
+
*/
|
|
14
|
+
export async function appendToObsidianVault(memory, vaultPath) {
|
|
15
|
+
const today = new Date();
|
|
16
|
+
const year = today.getFullYear();
|
|
17
|
+
const month = String(today.getMonth() + 1).padStart(2, '0');
|
|
18
|
+
const day = String(today.getDate()).padStart(2, '0');
|
|
19
|
+
const dateStr = `${year}-${month}-${day}`;
|
|
20
|
+
const dailyNotePath = join(vaultPath, `${dateStr}.md`);
|
|
21
|
+
// Ensure vault directory exists
|
|
22
|
+
if (!existsSync(vaultPath)) {
|
|
23
|
+
mkdirSync(vaultPath, { recursive: true });
|
|
24
|
+
logger.info(`[Obsidian] Created vault directory: ${vaultPath}`);
|
|
25
|
+
}
|
|
26
|
+
// Build memory block content
|
|
27
|
+
const memoryBlock = formatMemoryAsBlock(memory);
|
|
28
|
+
// Check if daily note exists, if not create with header
|
|
29
|
+
if (!existsSync(dailyNotePath)) {
|
|
30
|
+
const header = `# ${dateStr}\n\n## Squish Memories\n\n`;
|
|
31
|
+
appendFileSync(dailyNotePath, header, 'utf-8');
|
|
32
|
+
logger.info(`[Obsidian] Created daily note: ${dailyNotePath}`);
|
|
33
|
+
}
|
|
34
|
+
// Append memory block
|
|
35
|
+
appendFileSync(dailyNotePath, memoryBlock + '\n\n', 'utf-8');
|
|
36
|
+
logger.info(`[Obsidian] Appended memory to ${dateStr}.md`);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Format memory as Obsidian-compatible block
|
|
40
|
+
*/
|
|
41
|
+
function formatMemoryAsBlock(memory) {
|
|
42
|
+
const lines = [];
|
|
43
|
+
// Memory content as checkbox (can be toggled in Obsidian)
|
|
44
|
+
lines.push(`- [ ] "${memory.content}"`);
|
|
45
|
+
// Add ID reference for linking
|
|
46
|
+
lines.push(` - **id:** \`${memory.id}\``);
|
|
47
|
+
// Type and tags
|
|
48
|
+
if (memory.type) {
|
|
49
|
+
lines.push(` - **type:** ${memory.type}`);
|
|
50
|
+
}
|
|
51
|
+
if (memory.tags && memory.tags.length > 0) {
|
|
52
|
+
const tagList = memory.tags.map(t => `#${t.replace(/\s+/g, '-')}`).join(' ');
|
|
53
|
+
lines.push(` - **tags:** ${tagList}`);
|
|
54
|
+
}
|
|
55
|
+
// Rich context fields
|
|
56
|
+
if (memory.source) {
|
|
57
|
+
lines.push(` - **source:** ${memory.source}`);
|
|
58
|
+
}
|
|
59
|
+
if (memory.reasoning) {
|
|
60
|
+
lines.push(` - **reasoning:** ${memory.reasoning}`);
|
|
61
|
+
}
|
|
62
|
+
if (memory.memoryContext) {
|
|
63
|
+
lines.push(` - **context:** ${memory.memoryContext}`);
|
|
64
|
+
}
|
|
65
|
+
if (memory.examples) {
|
|
66
|
+
lines.push(` - **examples:** ${memory.examples}`);
|
|
67
|
+
}
|
|
68
|
+
if (memory.exceptions) {
|
|
69
|
+
lines.push(` - **exceptions:** ${memory.exceptions}`);
|
|
70
|
+
}
|
|
71
|
+
return lines.join('\n');
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Check if Obsidian vault is connected and accessible
|
|
75
|
+
*/
|
|
76
|
+
export function isObsidianConnected(vaultPath) {
|
|
77
|
+
if (!vaultPath || vaultPath === '') {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
// Check if path exists or can be created
|
|
81
|
+
const parentDir = vaultPath.includes('/')
|
|
82
|
+
? vaultPath.split('/').slice(0, -1).join('/')
|
|
83
|
+
: vaultPath.split('\\').slice(0, -1).join('\\');
|
|
84
|
+
return existsSync(parentDir) || true; // Assume creatable if parent exists
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Read existing memories from Obsidian vault (for import feature)
|
|
88
|
+
* Scans vault for .md files and extracts memory blocks
|
|
89
|
+
*/
|
|
90
|
+
export async function readFromVault(vaultPath) {
|
|
91
|
+
if (!existsSync(vaultPath)) {
|
|
92
|
+
logger.warn(`[Obsidian] Vault path does not exist: ${vaultPath}`);
|
|
93
|
+
return [];
|
|
94
|
+
}
|
|
95
|
+
const memories = [];
|
|
96
|
+
// Recursively find all .md files
|
|
97
|
+
const mdFiles = await findMarkdownFiles(vaultPath);
|
|
98
|
+
for (const filePath of mdFiles) {
|
|
99
|
+
try {
|
|
100
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
101
|
+
const filename = filePath.split(/[/\\]/).pop() || '';
|
|
102
|
+
// Extract frontmatter if present
|
|
103
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
104
|
+
let tags = [];
|
|
105
|
+
if (frontmatterMatch) {
|
|
106
|
+
const tagMatch = frontmatterMatch[1].match(/tags:\s*\[([^\]]*)\]/);
|
|
107
|
+
if (tagMatch) {
|
|
108
|
+
tags = tagMatch[1].split(',').map((t) => t.trim()).filter(Boolean);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Extract content after frontmatter
|
|
112
|
+
const body = frontmatterMatch ? content.slice(frontmatterMatch[0].length).trim() : content;
|
|
113
|
+
// Skip empty files or very short ones
|
|
114
|
+
if (body.length < 10)
|
|
115
|
+
continue;
|
|
116
|
+
memories.push({
|
|
117
|
+
id: randomUUID(),
|
|
118
|
+
content: body,
|
|
119
|
+
tags,
|
|
120
|
+
type: 'observation'
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
logger.warn(`[Obsidian] Failed to read file ${filePath}: ${error}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
logger.info(`[Obsidian] Found ${memories.length} memories in vault`);
|
|
128
|
+
return memories;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Recursively find all markdown files in a directory
|
|
132
|
+
*/
|
|
133
|
+
async function findMarkdownFiles(dir) {
|
|
134
|
+
const files = [];
|
|
135
|
+
try {
|
|
136
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
137
|
+
for (const entry of entries) {
|
|
138
|
+
const fullPath = join(dir, entry.name);
|
|
139
|
+
if (entry.isDirectory()) {
|
|
140
|
+
// Skip hidden directories
|
|
141
|
+
if (!entry.name.startsWith('.')) {
|
|
142
|
+
const subFiles = await findMarkdownFiles(fullPath);
|
|
143
|
+
files.push(...subFiles);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
else if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
147
|
+
files.push(fullPath);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
logger.warn(`[Obsidian] Failed to read directory ${dir}: ${error}`);
|
|
153
|
+
}
|
|
154
|
+
return files;
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=obsidian-vault.js.map
|