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,402 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Entity Extractor
|
|
3
|
+
*
|
|
4
|
+
* Extracts named entities and relationships from memory content using
|
|
5
|
+
* LLM-powered analysis. Falls back to regex extraction when LLM is unavailable.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { logger } from '../logger.js';
|
|
9
|
+
import { config } from '../../config.js';
|
|
10
|
+
import {
|
|
11
|
+
extractEntities as regexExtractEntities,
|
|
12
|
+
linkEntitiesToMemories,
|
|
13
|
+
type EntityType,
|
|
14
|
+
type ExtractedEntity,
|
|
15
|
+
} from '../memory/entity-extractor.js';
|
|
16
|
+
|
|
17
|
+
// ─── Types ──────────────────────────────────────────────────────────────────
|
|
18
|
+
|
|
19
|
+
export type RelationType =
|
|
20
|
+
| 'works_on'
|
|
21
|
+
| 'depends_on'
|
|
22
|
+
| 'manages'
|
|
23
|
+
| 'uses'
|
|
24
|
+
| 'caused'
|
|
25
|
+
| 'located_in'
|
|
26
|
+
| 'belongs_to'
|
|
27
|
+
| 'reports_to'
|
|
28
|
+
| 'occurred_on'
|
|
29
|
+
| 'affects'
|
|
30
|
+
| 'contains'
|
|
31
|
+
| 'implements'
|
|
32
|
+
| 'extends'
|
|
33
|
+
| 'related_to'
|
|
34
|
+
| 'part_of'
|
|
35
|
+
| 'owns'
|
|
36
|
+
| 'created'
|
|
37
|
+
| 'resolved'
|
|
38
|
+
| 'blocks';
|
|
39
|
+
|
|
40
|
+
export interface ExtractedRelation {
|
|
41
|
+
fromEntity: string;
|
|
42
|
+
toEntity: string;
|
|
43
|
+
relationType: RelationType;
|
|
44
|
+
confidence: number;
|
|
45
|
+
context: string;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export interface LLMExtractionResult {
|
|
49
|
+
entities: ExtractedEntity[];
|
|
50
|
+
relations: ExtractedRelation[];
|
|
51
|
+
source: 'llm' | 'regex' | 'none';
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// ─── LLM Prompt ─────────────────────────────────────────────────────────────
|
|
55
|
+
|
|
56
|
+
const ENTITY_EXTRACTION_PROMPT = `You are an entity and relationship extractor for an AI memory system. Given text, extract:
|
|
57
|
+
|
|
58
|
+
1. ENTITIES: Named things mentioned (people, projects, systems, tools, concepts, events)
|
|
59
|
+
2. RELATIONSHIPS: How entities connect to each other
|
|
60
|
+
|
|
61
|
+
Return ONLY valid JSON in this exact format:
|
|
62
|
+
{
|
|
63
|
+
"entities": [
|
|
64
|
+
{"name": "Alice", "type": "person", "confidence": 0.95},
|
|
65
|
+
{"name": "Project Atlas", "type": "concept", "confidence": 0.9}
|
|
66
|
+
],
|
|
67
|
+
"relations": [
|
|
68
|
+
{"from": "Alice", "to": "Project Atlas", "type": "works_on", "confidence": 0.85, "context": "Alice is the tech lead on Project Atlas"},
|
|
69
|
+
{"from": "Project Atlas", "to": "PostgreSQL", "type": "uses", "confidence": 0.9, "context": "Project Atlas uses PostgreSQL for its primary datastore"}
|
|
70
|
+
]
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
Entity types: person, file, function, class, concept, tool, date, location, pattern, technique, other
|
|
74
|
+
Relation types: works_on, depends_on, manages, uses, caused, located_in, belongs_to, reports_to, occurred_on, affects, contains, implements, extends, related_to, part_of, owns, created, resolved, blocks
|
|
75
|
+
|
|
76
|
+
Rules:
|
|
77
|
+
- Extract only explicitly mentioned entities and relationships
|
|
78
|
+
- Use the most specific relation type available
|
|
79
|
+
- Include confidence scores (0-1)
|
|
80
|
+
- Keep entity names as they appear in text (preserve capitalization)
|
|
81
|
+
- For ambiguous relationships, use "related_to"
|
|
82
|
+
- Do NOT invent entities or relationships not present in the text`;
|
|
83
|
+
|
|
84
|
+
// ─── LLM Call Abstraction ───────────────────────────────────────────────────
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Call an LLM for entity extraction.
|
|
88
|
+
* Uses OpenAI-compatible API (works with OpenAI, Ollama, LM Studio, local endpoints).
|
|
89
|
+
*/
|
|
90
|
+
async function callLLM(prompt: string, content: string): Promise<string | null> {
|
|
91
|
+
// Determine which provider to use for extraction
|
|
92
|
+
const provider = config.llmProvider;
|
|
93
|
+
const endpoint = config.llmEndpoint || config.lmStudioUrl || config.ollamaUrl;
|
|
94
|
+
const model = config.llmExtractionModel;
|
|
95
|
+
if (!model) {
|
|
96
|
+
logger.debug('LLM extraction model not configured; using regex fallback');
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Try OpenAI first if configured and provider matches
|
|
101
|
+
if ((provider === 'openai' || !provider) && config.openAiApiKey) {
|
|
102
|
+
try {
|
|
103
|
+
const chatUrl = config.openAiApiUrl.replace('/embeddings', '/chat/completions');
|
|
104
|
+
const response = await fetch(chatUrl, {
|
|
105
|
+
method: 'POST',
|
|
106
|
+
headers: {
|
|
107
|
+
'Content-Type': 'application/json',
|
|
108
|
+
Authorization: `Bearer ${config.openAiApiKey}`,
|
|
109
|
+
},
|
|
110
|
+
body: JSON.stringify({
|
|
111
|
+
model,
|
|
112
|
+
messages: [
|
|
113
|
+
{ role: 'system', content: prompt },
|
|
114
|
+
{ role: 'user', content },
|
|
115
|
+
],
|
|
116
|
+
temperature: 0.1,
|
|
117
|
+
max_tokens: 2000,
|
|
118
|
+
}),
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
if (!response.ok) {
|
|
122
|
+
logger.warn(`LLM entity extraction failed (OpenAI): ${response.status}`);
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const payload = await response.json() as { choices?: Array<{ message?: { content?: string } }> };
|
|
127
|
+
return payload.choices?.[0]?.message?.content ?? null;
|
|
128
|
+
} catch (error) {
|
|
129
|
+
logger.warn('LLM entity extraction error (OpenAI):', { error: error as Error });
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Try Ollama if configured and provider matches
|
|
134
|
+
if ((provider === 'ollama' || !provider) && config.ollamaUrl) {
|
|
135
|
+
try {
|
|
136
|
+
const response = await fetch(`${config.ollamaUrl}/api/chat`, {
|
|
137
|
+
method: 'POST',
|
|
138
|
+
headers: { 'Content-Type': 'application/json' },
|
|
139
|
+
body: JSON.stringify({
|
|
140
|
+
model,
|
|
141
|
+
messages: [
|
|
142
|
+
{ role: 'system', content: prompt },
|
|
143
|
+
{ role: 'user', content },
|
|
144
|
+
],
|
|
145
|
+
stream: false,
|
|
146
|
+
options: { temperature: 0.1 },
|
|
147
|
+
}),
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
if (!response.ok) {
|
|
151
|
+
logger.warn(`Ollama entity extraction failed: ${response.status}`);
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const payload = await response.json() as { message?: { content?: string } };
|
|
156
|
+
return payload.message?.content ?? null;
|
|
157
|
+
} catch (error) {
|
|
158
|
+
logger.warn('LLM entity extraction error (Ollama):', { error: error as Error });
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Try LM Studio / custom endpoint if configured and provider matches
|
|
163
|
+
if ((provider === 'lmstudio' || provider === 'local' || !provider) && (config.lmStudioUrl || endpoint)) {
|
|
164
|
+
try {
|
|
165
|
+
const baseUrl = endpoint || config.lmStudioUrl;
|
|
166
|
+
if (!baseUrl) return null;
|
|
167
|
+
const response = await fetch(`${baseUrl}/v1/chat/completions`, {
|
|
168
|
+
method: 'POST',
|
|
169
|
+
headers: { 'Content-Type': 'application/json' },
|
|
170
|
+
body: JSON.stringify({
|
|
171
|
+
model,
|
|
172
|
+
messages: [
|
|
173
|
+
{ role: 'system', content: prompt },
|
|
174
|
+
{ role: 'user', content },
|
|
175
|
+
],
|
|
176
|
+
temperature: 0.1,
|
|
177
|
+
max_tokens: 2000,
|
|
178
|
+
}),
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
if (!response.ok) {
|
|
182
|
+
logger.warn(`LM Studio entity extraction failed: ${response.status}`);
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const payload = await response.json() as { choices?: Array<{ message?: { content?: string } }> };
|
|
187
|
+
return payload.choices?.[0]?.message?.content ?? null;
|
|
188
|
+
} catch (error) {
|
|
189
|
+
logger.warn('LLM entity extraction error (LM Studio):', { error: error as Error });
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// ─── JSON Parsing ────────────────────────────────────────────────────────────
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Parse LLM response into structured extraction result.
|
|
200
|
+
* Handles various response formats (raw JSON, markdown code blocks, etc.)
|
|
201
|
+
*/
|
|
202
|
+
function parseLLMResponse(response: string): { entities: ExtractedEntity[]; relations: ExtractedRelation[] } | null {
|
|
203
|
+
// Try to extract JSON from the response
|
|
204
|
+
let jsonStr = response.trim();
|
|
205
|
+
|
|
206
|
+
// Handle markdown code blocks
|
|
207
|
+
const codeBlockMatch = jsonStr.match(/```(?:json)?\s*([\s\S]*?)```/);
|
|
208
|
+
if (codeBlockMatch) {
|
|
209
|
+
jsonStr = codeBlockMatch[1].trim();
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// Try to find JSON object in the response
|
|
213
|
+
const jsonMatch = jsonStr.match(/\{[\s\S]*\}/);
|
|
214
|
+
if (!jsonMatch) {
|
|
215
|
+
logger.debug('No JSON found in LLM response');
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
try {
|
|
220
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
221
|
+
|
|
222
|
+
// Validate structure
|
|
223
|
+
if (!parsed.entities || !Array.isArray(parsed.entities)) {
|
|
224
|
+
logger.debug('LLM response missing entities array');
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
const entities: ExtractedEntity[] = (parsed.entities as any[])
|
|
229
|
+
.filter((e: any) => e.name && e.type)
|
|
230
|
+
.map((e: any) => ({
|
|
231
|
+
name: String(e.name),
|
|
232
|
+
type: validateEntityType(String(e.type)),
|
|
233
|
+
confidence: typeof e.confidence === 'number' ? Math.min(1, Math.max(0, e.confidence)) : 0.8,
|
|
234
|
+
startIndex: 0,
|
|
235
|
+
endIndex: 0,
|
|
236
|
+
context: String(e.context || ''),
|
|
237
|
+
normalized: e.normalized ? String(e.normalized) : undefined,
|
|
238
|
+
}));
|
|
239
|
+
|
|
240
|
+
const relations: ExtractedRelation[] = (parsed.relations || [])
|
|
241
|
+
.filter((r: any) => r.from && r.to && r.type)
|
|
242
|
+
.map((r: any) => ({
|
|
243
|
+
fromEntity: String(r.from),
|
|
244
|
+
toEntity: String(r.to),
|
|
245
|
+
relationType: validateRelationType(String(r.type)),
|
|
246
|
+
confidence: typeof r.confidence === 'number' ? Math.min(1, Math.max(0, r.confidence)) : 0.7,
|
|
247
|
+
context: String(r.context || ''),
|
|
248
|
+
}));
|
|
249
|
+
|
|
250
|
+
return { entities, relations };
|
|
251
|
+
} catch (error) {
|
|
252
|
+
logger.debug('Failed to parse LLM response as JSON', { error: error as Error });
|
|
253
|
+
return null;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
function validateEntityType(type: string): EntityType {
|
|
258
|
+
const validTypes: EntityType[] = ['person', 'file', 'function', 'class', 'concept', 'tool', 'date', 'location', 'pattern', 'technique', 'other'];
|
|
259
|
+
const lower = type.toLowerCase() as EntityType;
|
|
260
|
+
if (validTypes.includes(lower)) return lower;
|
|
261
|
+
return 'other';
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
function validateRelationType(type: string): RelationType {
|
|
265
|
+
const validTypes: RelationType[] = [
|
|
266
|
+
'works_on', 'depends_on', 'manages', 'uses', 'caused', 'located_in',
|
|
267
|
+
'belongs_to', 'reports_to', 'occurred_on', 'affects', 'contains',
|
|
268
|
+
'implements', 'extends', 'related_to', 'part_of', 'owns', 'created',
|
|
269
|
+
'resolved', 'blocks',
|
|
270
|
+
];
|
|
271
|
+
const lower = type.toLowerCase() as RelationType;
|
|
272
|
+
if (validTypes.includes(lower)) return lower;
|
|
273
|
+
return 'related_to';
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// ─── Main Extraction Functions ───────────────────────────────────────────────
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* Extract entities and relationships from text using LLM.
|
|
280
|
+
* Falls back to regex extraction when LLM is unavailable.
|
|
281
|
+
*/
|
|
282
|
+
export async function extractEntitiesAndRelations(
|
|
283
|
+
content: string,
|
|
284
|
+
options?: {
|
|
285
|
+
preferLLM?: boolean;
|
|
286
|
+
maxContentLength?: number;
|
|
287
|
+
}
|
|
288
|
+
): Promise<LLMExtractionResult> {
|
|
289
|
+
const { preferLLM = true, maxContentLength = 4000 } = options || {};
|
|
290
|
+
|
|
291
|
+
// Truncate very long content
|
|
292
|
+
const truncatedContent = content.length > maxContentLength
|
|
293
|
+
? content.substring(0, maxContentLength) + '...'
|
|
294
|
+
: content;
|
|
295
|
+
|
|
296
|
+
// Try LLM extraction first if preferred
|
|
297
|
+
if (preferLLM) {
|
|
298
|
+
const llmResult = await extractWithLLM(truncatedContent);
|
|
299
|
+
if (llmResult) {
|
|
300
|
+
logger.debug('LLM entity extraction succeeded', {
|
|
301
|
+
entityCount: llmResult.entities.length,
|
|
302
|
+
relationCount: llmResult.relations.length,
|
|
303
|
+
});
|
|
304
|
+
return { ...llmResult, source: 'llm' };
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// Fall back to regex extraction
|
|
309
|
+
const regexEntities = await regexExtractEntities(content);
|
|
310
|
+
if (regexEntities.length > 0) {
|
|
311
|
+
logger.debug('Regex entity extraction fallback', {
|
|
312
|
+
entityCount: regexEntities.length,
|
|
313
|
+
});
|
|
314
|
+
return {
|
|
315
|
+
entities: regexEntities,
|
|
316
|
+
relations: [], // Regex extraction doesn't produce relations
|
|
317
|
+
source: 'regex',
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
return { entities: [], relations: [], source: 'none' };
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* Extract entities and relations using LLM.
|
|
326
|
+
*/
|
|
327
|
+
async function extractWithLLM(content: string): Promise<Omit<LLMExtractionResult, 'source'> | null> {
|
|
328
|
+
const response = await callLLM(ENTITY_EXTRACTION_PROMPT, content);
|
|
329
|
+
if (!response) return null;
|
|
330
|
+
|
|
331
|
+
const parsed = parseLLMResponse(response);
|
|
332
|
+
if (!parsed) return null;
|
|
333
|
+
|
|
334
|
+
// Validate that extracted entities actually appear in the content
|
|
335
|
+
const validatedEntities = parsed.entities.filter((entity) => {
|
|
336
|
+
// Allow entities whose name or a significant substring appears in content
|
|
337
|
+
const nameLower = entity.name.toLowerCase();
|
|
338
|
+
const contentLower = content.toLowerCase();
|
|
339
|
+
// Check if the entity name or a key part of it appears in content
|
|
340
|
+
const words = nameLower.split(/\s+/);
|
|
341
|
+
return words.some(word => word.length > 2 && contentLower.includes(word));
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
// Validate that relation entities exist in the entity list
|
|
345
|
+
const entityNames = new Set(validatedEntities.map(e => e.name.toLowerCase()));
|
|
346
|
+
const validatedRelations = parsed.relations.filter((relation) => {
|
|
347
|
+
const fromExists = entityNames.has(relation.fromEntity.toLowerCase());
|
|
348
|
+
const toExists = entityNames.has(relation.toEntity.toLowerCase());
|
|
349
|
+
// Allow relations where at least one entity is known
|
|
350
|
+
// (the LLM might use slightly different names)
|
|
351
|
+
return fromExists || toExists ||
|
|
352
|
+
// Also allow if both entity names appear in the content
|
|
353
|
+
(content.toLowerCase().includes(relation.fromEntity.toLowerCase()) &&
|
|
354
|
+
content.toLowerCase().includes(relation.toEntity.toLowerCase()));
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
return {
|
|
358
|
+
entities: validatedEntities,
|
|
359
|
+
relations: validatedRelations,
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* Extract entities and relations from multiple memories in batch.
|
|
365
|
+
* More efficient than calling extractEntitiesAndRelations for each memory.
|
|
366
|
+
*/
|
|
367
|
+
export async function batchExtractEntitiesAndRelations(
|
|
368
|
+
contents: string[],
|
|
369
|
+
options?: {
|
|
370
|
+
preferLLM?: boolean;
|
|
371
|
+
maxContentLength?: number;
|
|
372
|
+
batchSize?: number;
|
|
373
|
+
}
|
|
374
|
+
): Promise<LLMExtractionResult[]> {
|
|
375
|
+
const { batchSize = 5 } = options || {};
|
|
376
|
+
const results: LLMExtractionResult[] = [];
|
|
377
|
+
|
|
378
|
+
// Process in batches to avoid overwhelming the LLM
|
|
379
|
+
for (let i = 0; i < contents.length; i += batchSize) {
|
|
380
|
+
const batch = contents.slice(i, i + batchSize);
|
|
381
|
+
const batchResults = await Promise.all(
|
|
382
|
+
batch.map(content => extractEntitiesAndRelations(content, options))
|
|
383
|
+
);
|
|
384
|
+
results.push(...batchResults);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
return results;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
/**
|
|
391
|
+
* Get the extraction prompt for testing/debugging purposes.
|
|
392
|
+
*/
|
|
393
|
+
export function getExtractionPrompt(): string {
|
|
394
|
+
return ENTITY_EXTRACTION_PROMPT;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* Parse an LLM response for testing/debugging purposes.
|
|
399
|
+
*/
|
|
400
|
+
export function testParseLLMResponse(response: string): { entities: ExtractedEntity[]; relations: ExtractedRelation[] } | null {
|
|
401
|
+
return parseLLMResponse(response);
|
|
402
|
+
}
|