abmind 0.0.1 → 0.1.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/CHANGELOG.md +34 -0
- package/LICENSE +190 -0
- package/README.md +191 -0
- package/dist/cli/abmind-backfill.d.ts +3 -0
- package/dist/cli/abmind-backfill.d.ts.map +1 -0
- package/dist/cli/abmind-backfill.js +64 -0
- package/dist/cli/abmind-backfill.js.map +1 -0
- package/dist/cli/abmind-backup.d.ts +5 -0
- package/dist/cli/abmind-backup.d.ts.map +1 -0
- package/dist/cli/abmind-backup.js +44 -0
- package/dist/cli/abmind-backup.js.map +1 -0
- package/dist/cli/abmind-bundle.d.ts +7 -0
- package/dist/cli/abmind-bundle.d.ts.map +1 -0
- package/dist/cli/abmind-bundle.js +17 -0
- package/dist/cli/abmind-bundle.js.map +1 -0
- package/dist/cli/abmind-edit.d.ts +10 -0
- package/dist/cli/abmind-edit.d.ts.map +1 -0
- package/dist/cli/abmind-edit.js +160 -0
- package/dist/cli/abmind-edit.js.map +1 -0
- package/dist/cli/abmind-embed.d.ts +3 -0
- package/dist/cli/abmind-embed.d.ts.map +1 -0
- package/dist/cli/abmind-embed.js +83 -0
- package/dist/cli/abmind-embed.js.map +1 -0
- package/dist/cli/abmind-expand.d.ts +6 -0
- package/dist/cli/abmind-expand.d.ts.map +1 -0
- package/dist/cli/abmind-expand.js +100 -0
- package/dist/cli/abmind-expand.js.map +1 -0
- package/dist/cli/abmind-hook-doctor.d.ts +8 -0
- package/dist/cli/abmind-hook-doctor.d.ts.map +1 -0
- package/dist/cli/abmind-hook-doctor.js +73 -0
- package/dist/cli/abmind-hook-doctor.js.map +1 -0
- package/dist/cli/abmind-hook-recall.d.ts +16 -0
- package/dist/cli/abmind-hook-recall.d.ts.map +1 -0
- package/dist/cli/abmind-hook-recall.js +123 -0
- package/dist/cli/abmind-hook-recall.js.map +1 -0
- package/dist/cli/abmind-hook-store.d.ts +17 -0
- package/dist/cli/abmind-hook-store.d.ts.map +1 -0
- package/dist/cli/abmind-hook-store.js +115 -0
- package/dist/cli/abmind-hook-store.js.map +1 -0
- package/dist/cli/abmind-hook-wakeup.d.ts +12 -0
- package/dist/cli/abmind-hook-wakeup.d.ts.map +1 -0
- package/dist/cli/abmind-hook-wakeup.js +143 -0
- package/dist/cli/abmind-hook-wakeup.js.map +1 -0
- package/dist/cli/abmind-ingest.d.ts +7 -0
- package/dist/cli/abmind-ingest.d.ts.map +1 -0
- package/dist/cli/abmind-ingest.js +96 -0
- package/dist/cli/abmind-ingest.js.map +1 -0
- package/dist/cli/abmind-install.d.ts +10 -0
- package/dist/cli/abmind-install.d.ts.map +1 -0
- package/dist/cli/abmind-install.js +240 -0
- package/dist/cli/abmind-install.js.map +1 -0
- package/dist/cli/abmind-mcp.d.ts +3 -0
- package/dist/cli/abmind-mcp.d.ts.map +1 -0
- package/dist/cli/abmind-mcp.js +26 -0
- package/dist/cli/abmind-mcp.js.map +1 -0
- package/dist/cli/abmind-memory-stats.d.ts +3 -0
- package/dist/cli/abmind-memory-stats.d.ts.map +1 -0
- package/dist/cli/abmind-memory-stats.js +45 -0
- package/dist/cli/abmind-memory-stats.js.map +1 -0
- package/dist/cli/abmind-migrate-openclaw.d.ts +12 -0
- package/dist/cli/abmind-migrate-openclaw.d.ts.map +1 -0
- package/dist/cli/abmind-migrate-openclaw.js +247 -0
- package/dist/cli/abmind-migrate-openclaw.js.map +1 -0
- package/dist/cli/abmind-recall.d.ts +8 -0
- package/dist/cli/abmind-recall.d.ts.map +1 -0
- package/dist/cli/abmind-recall.js +94 -0
- package/dist/cli/abmind-recall.js.map +1 -0
- package/dist/cli/abmind-reset.d.ts +11 -0
- package/dist/cli/abmind-reset.d.ts.map +1 -0
- package/dist/cli/abmind-reset.js +143 -0
- package/dist/cli/abmind-reset.js.map +1 -0
- package/dist/cli/abmind-restore.d.ts +5 -0
- package/dist/cli/abmind-restore.d.ts.map +1 -0
- package/dist/cli/abmind-restore.js +64 -0
- package/dist/cli/abmind-restore.js.map +1 -0
- package/dist/cli/abmind-retro-extract.d.ts +15 -0
- package/dist/cli/abmind-retro-extract.d.ts.map +1 -0
- package/dist/cli/abmind-retro-extract.js +113 -0
- package/dist/cli/abmind-retro-extract.js.map +1 -0
- package/dist/cli/abmind-rollback.d.ts +8 -0
- package/dist/cli/abmind-rollback.d.ts.map +1 -0
- package/dist/cli/abmind-rollback.js +76 -0
- package/dist/cli/abmind-rollback.js.map +1 -0
- package/dist/cli/abmind-secrets.d.ts +12 -0
- package/dist/cli/abmind-secrets.d.ts.map +1 -0
- package/dist/cli/abmind-secrets.js +83 -0
- package/dist/cli/abmind-secrets.js.map +1 -0
- package/dist/cli/abmind-sleep-apply.d.ts +3 -0
- package/dist/cli/abmind-sleep-apply.d.ts.map +1 -0
- package/dist/cli/abmind-sleep-apply.js +50 -0
- package/dist/cli/abmind-sleep-apply.js.map +1 -0
- package/dist/cli/abmind-sleep-report.d.ts +3 -0
- package/dist/cli/abmind-sleep-report.d.ts.map +1 -0
- package/dist/cli/abmind-sleep-report.js +40 -0
- package/dist/cli/abmind-sleep-report.js.map +1 -0
- package/dist/cli/abmind-sleep-state.d.ts +3 -0
- package/dist/cli/abmind-sleep-state.d.ts.map +1 -0
- package/dist/cli/abmind-sleep-state.js +33 -0
- package/dist/cli/abmind-sleep-state.js.map +1 -0
- package/dist/cli/abmind-sleep.d.ts +14 -0
- package/dist/cli/abmind-sleep.d.ts.map +1 -0
- package/dist/cli/abmind-sleep.js +186 -0
- package/dist/cli/abmind-sleep.js.map +1 -0
- package/dist/cli/abmind-status-runtime.d.ts +9 -0
- package/dist/cli/abmind-status-runtime.d.ts.map +1 -0
- package/dist/cli/abmind-status-runtime.js +132 -0
- package/dist/cli/abmind-status-runtime.js.map +1 -0
- package/dist/cli/abmind-status.d.ts +3 -0
- package/dist/cli/abmind-status.d.ts.map +1 -0
- package/dist/cli/abmind-status.js +45 -0
- package/dist/cli/abmind-status.js.map +1 -0
- package/dist/cli/abmind-store.d.ts +54 -0
- package/dist/cli/abmind-store.d.ts.map +1 -0
- package/dist/cli/abmind-store.js +251 -0
- package/dist/cli/abmind-store.js.map +1 -0
- package/dist/cli/abmind-update.d.ts +11 -0
- package/dist/cli/abmind-update.d.ts.map +1 -0
- package/dist/cli/abmind-update.js +160 -0
- package/dist/cli/abmind-update.js.map +1 -0
- package/dist/cli/abmind-wakeup.d.ts +3 -0
- package/dist/cli/abmind-wakeup.d.ts.map +1 -0
- package/dist/cli/abmind-wakeup.js +36 -0
- package/dist/cli/abmind-wakeup.js.map +1 -0
- package/dist/cli/abmind.d.ts +10 -0
- package/dist/cli/abmind.d.ts.map +1 -0
- package/dist/cli/abmind.js +100 -0
- package/dist/cli/abmind.js.map +1 -0
- package/dist/src/abm-v2-vocab.d.ts +10 -0
- package/dist/src/abm-v2-vocab.d.ts.map +1 -0
- package/dist/src/abm-v2-vocab.js +66 -0
- package/dist/src/abm-v2-vocab.js.map +1 -0
- package/dist/src/adapters/openclaw.d.ts +66 -0
- package/dist/src/adapters/openclaw.d.ts.map +1 -0
- package/dist/src/adapters/openclaw.js +97 -0
- package/dist/src/adapters/openclaw.js.map +1 -0
- package/dist/src/backend-factory.d.ts +9 -0
- package/dist/src/backend-factory.d.ts.map +1 -0
- package/dist/src/backend-factory.js +23 -0
- package/dist/src/backend-factory.js.map +1 -0
- package/dist/src/backup.d.ts +19 -0
- package/dist/src/backup.d.ts.map +1 -0
- package/dist/src/backup.js +191 -0
- package/dist/src/backup.js.map +1 -0
- package/dist/src/brain-patterns.d.ts +20 -0
- package/dist/src/brain-patterns.d.ts.map +1 -0
- package/dist/src/brain-patterns.js +72 -0
- package/dist/src/brain-patterns.js.map +1 -0
- package/dist/src/cli-entry.d.ts +10 -0
- package/dist/src/cli-entry.d.ts.map +1 -0
- package/dist/src/cli-entry.js +29 -0
- package/dist/src/cli-entry.js.map +1 -0
- package/dist/src/cli-flags.d.ts +29 -0
- package/dist/src/cli-flags.d.ts.map +1 -0
- package/dist/src/cli-flags.js +72 -0
- package/dist/src/cli-flags.js.map +1 -0
- package/dist/src/cli-runner-raw.d.ts +21 -0
- package/dist/src/cli-runner-raw.d.ts.map +1 -0
- package/dist/src/cli-runner-raw.js +41 -0
- package/dist/src/cli-runner-raw.js.map +1 -0
- package/dist/src/cli-runner.d.ts +26 -0
- package/dist/src/cli-runner.d.ts.map +1 -0
- package/dist/src/cli-runner.js +51 -0
- package/dist/src/cli-runner.js.map +1 -0
- package/dist/src/consolidation-search.d.ts +17 -0
- package/dist/src/consolidation-search.d.ts.map +1 -0
- package/dist/src/consolidation-search.js +83 -0
- package/dist/src/consolidation-search.js.map +1 -0
- package/dist/src/context-engine.d.ts +89 -0
- package/dist/src/context-engine.d.ts.map +1 -0
- package/dist/src/context-engine.js +216 -0
- package/dist/src/context-engine.js.map +1 -0
- package/dist/src/context-tier-renderer.d.ts +79 -0
- package/dist/src/context-tier-renderer.d.ts.map +1 -0
- package/dist/src/context-tier-renderer.js +223 -0
- package/dist/src/context-tier-renderer.js.map +1 -0
- package/dist/src/contradiction-checker.d.ts +16 -0
- package/dist/src/contradiction-checker.d.ts.map +1 -0
- package/dist/src/contradiction-checker.js +40 -0
- package/dist/src/contradiction-checker.js.map +1 -0
- package/dist/src/crypto.d.ts +15 -0
- package/dist/src/crypto.d.ts.map +1 -0
- package/dist/src/crypto.js +86 -0
- package/dist/src/crypto.js.map +1 -0
- package/dist/src/deploy-lib/cleanup.d.ts +38 -0
- package/dist/src/deploy-lib/cleanup.d.ts.map +1 -0
- package/dist/src/deploy-lib/cleanup.js +71 -0
- package/dist/src/deploy-lib/cleanup.js.map +1 -0
- package/dist/src/deploy-lib/index.d.ts +20 -0
- package/dist/src/deploy-lib/index.d.ts.map +1 -0
- package/dist/src/deploy-lib/index.js +20 -0
- package/dist/src/deploy-lib/index.js.map +1 -0
- package/dist/src/deploy-lib/lock.d.ts +37 -0
- package/dist/src/deploy-lib/lock.d.ts.map +1 -0
- package/dist/src/deploy-lib/lock.js +107 -0
- package/dist/src/deploy-lib/lock.js.map +1 -0
- package/dist/src/deploy-lib/manifest.d.ts +42 -0
- package/dist/src/deploy-lib/manifest.d.ts.map +1 -0
- package/dist/src/deploy-lib/manifest.js +38 -0
- package/dist/src/deploy-lib/manifest.js.map +1 -0
- package/dist/src/deploy-lib/paths.d.ts +29 -0
- package/dist/src/deploy-lib/paths.d.ts.map +1 -0
- package/dist/src/deploy-lib/paths.js +40 -0
- package/dist/src/deploy-lib/paths.js.map +1 -0
- package/dist/src/deploy-lib/releases.d.ts +52 -0
- package/dist/src/deploy-lib/releases.d.ts.map +1 -0
- package/dist/src/deploy-lib/releases.js +119 -0
- package/dist/src/deploy-lib/releases.js.map +1 -0
- package/dist/src/deploy-lib/safe-copy.d.ts +16 -0
- package/dist/src/deploy-lib/safe-copy.d.ts.map +1 -0
- package/dist/src/deploy-lib/safe-copy.js +32 -0
- package/dist/src/deploy-lib/safe-copy.js.map +1 -0
- package/dist/src/embedding-health.d.ts +12 -0
- package/dist/src/embedding-health.d.ts.map +1 -0
- package/dist/src/embedding-health.js +18 -0
- package/dist/src/embedding-health.js.map +1 -0
- package/dist/src/embedding-provider.d.ts +48 -0
- package/dist/src/embedding-provider.d.ts.map +1 -0
- package/dist/src/embedding-provider.js +145 -0
- package/dist/src/embedding-provider.js.map +1 -0
- package/dist/src/embedding-quantize.d.ts +11 -0
- package/dist/src/embedding-quantize.d.ts.map +1 -0
- package/dist/src/embedding-quantize.js +38 -0
- package/dist/src/embedding-quantize.js.map +1 -0
- package/dist/src/emotion-arc.d.ts +17 -0
- package/dist/src/emotion-arc.d.ts.map +1 -0
- package/dist/src/emotion-arc.js +62 -0
- package/dist/src/emotion-arc.js.map +1 -0
- package/dist/src/emotion-tagger.d.ts +8 -0
- package/dist/src/emotion-tagger.d.ts.map +1 -0
- package/dist/src/emotion-tagger.js +45 -0
- package/dist/src/emotion-tagger.js.map +1 -0
- package/dist/src/emotion-utils.d.ts +13 -0
- package/dist/src/emotion-utils.d.ts.map +1 -0
- package/dist/src/emotion-utils.js +76 -0
- package/dist/src/emotion-utils.js.map +1 -0
- package/dist/src/entity-graph.d.ts +33 -0
- package/dist/src/entity-graph.d.ts.map +1 -0
- package/dist/src/entity-graph.js +42 -0
- package/dist/src/entity-graph.js.map +1 -0
- package/dist/src/env-schema.d.ts +46 -0
- package/dist/src/env-schema.d.ts.map +1 -0
- package/dist/src/env-schema.js +93 -0
- package/dist/src/env-schema.js.map +1 -0
- package/dist/src/hook-helpers.d.ts +16 -0
- package/dist/src/hook-helpers.d.ts.map +1 -0
- package/dist/src/hook-helpers.js +64 -0
- package/dist/src/hook-helpers.js.map +1 -0
- package/dist/src/imemory-system.d.ts +138 -0
- package/dist/src/imemory-system.d.ts.map +1 -0
- package/dist/src/imemory-system.js +40 -0
- package/dist/src/imemory-system.js.map +1 -0
- package/dist/src/importance-flagger.d.ts +8 -0
- package/dist/src/importance-flagger.d.ts.map +1 -0
- package/dist/src/importance-flagger.js +24 -0
- package/dist/src/importance-flagger.js.map +1 -0
- package/dist/src/index.d.ts +79 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +79 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/ingest-pipeline.d.ts +32 -0
- package/dist/src/ingest-pipeline.d.ts.map +1 -0
- package/dist/src/ingest-pipeline.js +58 -0
- package/dist/src/ingest-pipeline.js.map +1 -0
- package/dist/src/injection-scanner.d.ts +16 -0
- package/dist/src/injection-scanner.d.ts.map +1 -0
- package/dist/src/injection-scanner.js +182 -0
- package/dist/src/injection-scanner.js.map +1 -0
- package/dist/src/local-time.d.ts +12 -0
- package/dist/src/local-time.d.ts.map +1 -0
- package/dist/src/local-time.js +23 -0
- package/dist/src/local-time.js.map +1 -0
- package/dist/src/maintenance-service.d.ts +46 -0
- package/dist/src/maintenance-service.d.ts.map +1 -0
- package/dist/src/maintenance-service.js +280 -0
- package/dist/src/maintenance-service.js.map +1 -0
- package/dist/src/mcp-server.d.ts +6 -0
- package/dist/src/mcp-server.d.ts.map +1 -0
- package/dist/src/mcp-server.js +50 -0
- package/dist/src/mcp-server.js.map +1 -0
- package/dist/src/media-sanitizer.d.ts +11 -0
- package/dist/src/media-sanitizer.d.ts.map +1 -0
- package/dist/src/media-sanitizer.js +56 -0
- package/dist/src/media-sanitizer.js.map +1 -0
- package/dist/src/mem-config-env.d.ts +18 -0
- package/dist/src/mem-config-env.d.ts.map +1 -0
- package/dist/src/mem-config-env.js +43 -0
- package/dist/src/mem-config-env.js.map +1 -0
- package/dist/src/mem-env.d.ts +5 -0
- package/dist/src/mem-env.d.ts.map +1 -0
- package/dist/src/mem-env.js +19 -0
- package/dist/src/mem-env.js.map +1 -0
- package/dist/src/mem-logger.d.ts +20 -0
- package/dist/src/mem-logger.d.ts.map +1 -0
- package/dist/src/mem-logger.js +24 -0
- package/dist/src/mem-logger.js.map +1 -0
- package/dist/src/mem-paths.d.ts +20 -0
- package/dist/src/mem-paths.d.ts.map +1 -0
- package/dist/src/mem-paths.js +43 -0
- package/dist/src/mem-paths.js.map +1 -0
- package/dist/src/mem-types.d.ts +157 -0
- package/dist/src/mem-types.d.ts.map +1 -0
- package/dist/src/mem-types.js +2 -0
- package/dist/src/mem-types.js.map +1 -0
- package/dist/src/memory-backend.d.ts +65 -0
- package/dist/src/memory-backend.d.ts.map +1 -0
- package/dist/src/memory-backend.js +43 -0
- package/dist/src/memory-backend.js.map +1 -0
- package/dist/src/memory-compressor.d.ts +17 -0
- package/dist/src/memory-compressor.d.ts.map +1 -0
- package/dist/src/memory-compressor.js +147 -0
- package/dist/src/memory-compressor.js.map +1 -0
- package/dist/src/memory-config.d.ts +30 -0
- package/dist/src/memory-config.d.ts.map +1 -0
- package/dist/src/memory-config.js +62 -0
- package/dist/src/memory-config.js.map +1 -0
- package/dist/src/memory-db.d.ts +7 -0
- package/dist/src/memory-db.d.ts.map +1 -0
- package/dist/src/memory-db.js +173 -0
- package/dist/src/memory-db.js.map +1 -0
- package/dist/src/memory-editor.d.ts +32 -0
- package/dist/src/memory-editor.d.ts.map +1 -0
- package/dist/src/memory-editor.js +339 -0
- package/dist/src/memory-editor.js.map +1 -0
- package/dist/src/memory-index.d.ts +91 -0
- package/dist/src/memory-index.d.ts.map +1 -0
- package/dist/src/memory-index.js +310 -0
- package/dist/src/memory-index.js.map +1 -0
- package/dist/src/memory-ipc-client.d.ts +22 -0
- package/dist/src/memory-ipc-client.d.ts.map +1 -0
- package/dist/src/memory-ipc-client.js +75 -0
- package/dist/src/memory-ipc-client.js.map +1 -0
- package/dist/src/memory-ipc-server.d.ts +17 -0
- package/dist/src/memory-ipc-server.d.ts.map +1 -0
- package/dist/src/memory-ipc-server.js +86 -0
- package/dist/src/memory-ipc-server.js.map +1 -0
- package/dist/src/memory-manager.d.ts +155 -0
- package/dist/src/memory-manager.d.ts.map +1 -0
- package/dist/src/memory-manager.js +463 -0
- package/dist/src/memory-manager.js.map +1 -0
- package/dist/src/memory-renderer.d.ts +15 -0
- package/dist/src/memory-renderer.d.ts.map +1 -0
- package/dist/src/memory-renderer.js +126 -0
- package/dist/src/memory-renderer.js.map +1 -0
- package/dist/src/message-store.d.ts +42 -0
- package/dist/src/message-store.d.ts.map +1 -0
- package/dist/src/message-store.js +145 -0
- package/dist/src/message-store.js.map +1 -0
- package/dist/src/mmr.d.ts +17 -0
- package/dist/src/mmr.d.ts.map +1 -0
- package/dist/src/mmr.js +48 -0
- package/dist/src/mmr.js.map +1 -0
- package/dist/src/ollama-embed.d.ts +46 -0
- package/dist/src/ollama-embed.d.ts.map +1 -0
- package/dist/src/ollama-embed.js +139 -0
- package/dist/src/ollama-embed.js.map +1 -0
- package/dist/src/openclaw-plugin/engine.d.ts +87 -0
- package/dist/src/openclaw-plugin/engine.d.ts.map +1 -0
- package/dist/src/openclaw-plugin/engine.js +121 -0
- package/dist/src/openclaw-plugin/engine.js.map +1 -0
- package/dist/src/openclaw-plugin/hooks.d.ts +41 -0
- package/dist/src/openclaw-plugin/hooks.d.ts.map +1 -0
- package/dist/src/openclaw-plugin/hooks.js +155 -0
- package/dist/src/openclaw-plugin/hooks.js.map +1 -0
- package/dist/src/openclaw-plugin/index.d.ts +20 -0
- package/dist/src/openclaw-plugin/index.d.ts.map +1 -0
- package/dist/src/openclaw-plugin/index.js +145 -0
- package/dist/src/openclaw-plugin/index.js.map +1 -0
- package/dist/src/openclaw-plugin/message-adapter.d.ts +13 -0
- package/dist/src/openclaw-plugin/message-adapter.d.ts.map +1 -0
- package/dist/src/openclaw-plugin/message-adapter.js +49 -0
- package/dist/src/openclaw-plugin/message-adapter.js.map +1 -0
- package/dist/src/openclaw-plugin/prompt-builder.d.ts +17 -0
- package/dist/src/openclaw-plugin/prompt-builder.d.ts.map +1 -0
- package/dist/src/openclaw-plugin/prompt-builder.js +22 -0
- package/dist/src/openclaw-plugin/prompt-builder.js.map +1 -0
- package/dist/src/openclaw-plugin/public-artifacts.d.ts +20 -0
- package/dist/src/openclaw-plugin/public-artifacts.d.ts.map +1 -0
- package/dist/src/openclaw-plugin/public-artifacts.js +59 -0
- package/dist/src/openclaw-plugin/public-artifacts.js.map +1 -0
- package/dist/src/openclaw-plugin/runtime-adapter.d.ts +26 -0
- package/dist/src/openclaw-plugin/runtime-adapter.d.ts.map +1 -0
- package/dist/src/openclaw-plugin/runtime-adapter.js +161 -0
- package/dist/src/openclaw-plugin/runtime-adapter.js.map +1 -0
- package/dist/src/openclaw-plugin/session-mapper.d.ts +11 -0
- package/dist/src/openclaw-plugin/session-mapper.d.ts.map +1 -0
- package/dist/src/openclaw-plugin/session-mapper.js +17 -0
- package/dist/src/openclaw-plugin/session-mapper.js.map +1 -0
- package/dist/src/openclaw-plugin/tools.d.ts +31 -0
- package/dist/src/openclaw-plugin/tools.d.ts.map +1 -0
- package/dist/src/openclaw-plugin/tools.js +127 -0
- package/dist/src/openclaw-plugin/tools.js.map +1 -0
- package/dist/src/openclaw-plugin/types.d.ts +34 -0
- package/dist/src/openclaw-plugin/types.d.ts.map +1 -0
- package/dist/src/openclaw-plugin/types.js +2 -0
- package/dist/src/openclaw-plugin/types.js.map +1 -0
- package/dist/src/query-tokenizer.d.ts +33 -0
- package/dist/src/query-tokenizer.d.ts.map +1 -0
- package/dist/src/query-tokenizer.js +84 -0
- package/dist/src/query-tokenizer.js.map +1 -0
- package/dist/src/recall-benchmark.d.ts +13 -0
- package/dist/src/recall-benchmark.d.ts.map +1 -0
- package/dist/src/recall-benchmark.js +256 -0
- package/dist/src/recall-benchmark.js.map +1 -0
- package/dist/src/recall-engine.d.ts +81 -0
- package/dist/src/recall-engine.d.ts.map +1 -0
- package/dist/src/recall-engine.js +387 -0
- package/dist/src/recall-engine.js.map +1 -0
- package/dist/src/redact-secrets.d.ts +20 -0
- package/dist/src/redact-secrets.d.ts.map +1 -0
- package/dist/src/redact-secrets.js +42 -0
- package/dist/src/redact-secrets.js.map +1 -0
- package/dist/src/runtime-store.d.ts +47 -0
- package/dist/src/runtime-store.d.ts.map +1 -0
- package/dist/src/runtime-store.js +78 -0
- package/dist/src/runtime-store.js.map +1 -0
- package/dist/src/session-context.d.ts +10 -0
- package/dist/src/session-context.d.ts.map +1 -0
- package/dist/src/session-context.js +83 -0
- package/dist/src/session-context.js.map +1 -0
- package/dist/src/session-memory.d.ts +8 -0
- package/dist/src/session-memory.d.ts.map +1 -0
- package/dist/src/session-memory.js +45 -0
- package/dist/src/session-memory.js.map +1 -0
- package/dist/src/signature-generator.d.ts +15 -0
- package/dist/src/signature-generator.d.ts.map +1 -0
- package/dist/src/signature-generator.js +78 -0
- package/dist/src/signature-generator.js.map +1 -0
- package/dist/src/sleep/basic.d.ts +48 -0
- package/dist/src/sleep/basic.d.ts.map +1 -0
- package/dist/src/sleep/basic.js +147 -0
- package/dist/src/sleep/basic.js.map +1 -0
- package/dist/src/sleep/levels.d.ts +20 -0
- package/dist/src/sleep/levels.d.ts.map +1 -0
- package/dist/src/sleep/levels.js +11 -0
- package/dist/src/sleep/levels.js.map +1 -0
- package/dist/src/sleep/native.d.ts +41 -0
- package/dist/src/sleep/native.d.ts.map +1 -0
- package/dist/src/sleep/native.js +112 -0
- package/dist/src/sleep/native.js.map +1 -0
- package/dist/src/sleep/orchestrator.d.ts +64 -0
- package/dist/src/sleep/orchestrator.d.ts.map +1 -0
- package/dist/src/sleep/orchestrator.js +960 -0
- package/dist/src/sleep/orchestrator.js.map +1 -0
- package/dist/src/sleep/runtime.d.ts +15 -0
- package/dist/src/sleep/runtime.d.ts.map +1 -0
- package/dist/src/sleep/runtime.js +2 -0
- package/dist/src/sleep/runtime.js.map +1 -0
- package/dist/src/sleep/sleep-daily-summary.d.ts +64 -0
- package/dist/src/sleep/sleep-daily-summary.d.ts.map +1 -0
- package/dist/src/sleep/sleep-daily-summary.js +273 -0
- package/dist/src/sleep/sleep-daily-summary.js.map +1 -0
- package/dist/src/sleep/sleep-extract-daily.d.ts +12 -0
- package/dist/src/sleep/sleep-extract-daily.d.ts.map +1 -0
- package/dist/src/sleep/sleep-extract-daily.js +55 -0
- package/dist/src/sleep/sleep-extract-daily.js.map +1 -0
- package/dist/src/sleep/sleep-prompt-loader.d.ts +27 -0
- package/dist/src/sleep/sleep-prompt-loader.d.ts.map +1 -0
- package/dist/src/sleep/sleep-prompt-loader.js +116 -0
- package/dist/src/sleep/sleep-prompt-loader.js.map +1 -0
- package/dist/src/sleep/test-harness.d.ts +67 -0
- package/dist/src/sleep/test-harness.d.ts.map +1 -0
- package/dist/src/sleep/test-harness.js +121 -0
- package/dist/src/sleep/test-harness.js.map +1 -0
- package/dist/src/sleep/trigger.d.ts +3 -0
- package/dist/src/sleep/trigger.d.ts.map +1 -0
- package/dist/src/sleep/trigger.js +66 -0
- package/dist/src/sleep/trigger.js.map +1 -0
- package/dist/src/sleep-data-access.d.ts +54 -0
- package/dist/src/sleep-data-access.d.ts.map +1 -0
- package/dist/src/sleep-data-access.js +176 -0
- package/dist/src/sleep-data-access.js.map +1 -0
- package/dist/src/sleep-pipeline.d.ts +9 -0
- package/dist/src/sleep-pipeline.d.ts.map +1 -0
- package/dist/src/sleep-pipeline.js +8 -0
- package/dist/src/sleep-pipeline.js.map +1 -0
- package/dist/src/sleep-state-gatherer.d.ts +74 -0
- package/dist/src/sleep-state-gatherer.d.ts.map +1 -0
- package/dist/src/sleep-state-gatherer.js +275 -0
- package/dist/src/sleep-state-gatherer.js.map +1 -0
- package/dist/src/sqlite-backend.d.ts +23 -0
- package/dist/src/sqlite-backend.d.ts.map +1 -0
- package/dist/src/sqlite-backend.js +48 -0
- package/dist/src/sqlite-backend.js.map +1 -0
- package/dist/src/test-helpers.d.ts +3 -0
- package/dist/src/test-helpers.d.ts.map +1 -0
- package/dist/src/test-helpers.js +5 -0
- package/dist/src/test-helpers.js.map +1 -0
- package/dist/src/tier-llm-refinement.d.ts +35 -0
- package/dist/src/tier-llm-refinement.d.ts.map +1 -0
- package/dist/src/tier-llm-refinement.js +131 -0
- package/dist/src/tier-llm-refinement.js.map +1 -0
- package/dist/src/timeline-builder.d.ts +45 -0
- package/dist/src/timeline-builder.d.ts.map +1 -0
- package/dist/src/timeline-builder.js +147 -0
- package/dist/src/timeline-builder.js.map +1 -0
- package/dist/src/trigram-search.d.ts +28 -0
- package/dist/src/trigram-search.d.ts.map +1 -0
- package/dist/src/trigram-search.js +192 -0
- package/dist/src/trigram-search.js.map +1 -0
- package/dist/src/turn-classifier.d.ts +29 -0
- package/dist/src/turn-classifier.d.ts.map +1 -0
- package/dist/src/turn-classifier.js +186 -0
- package/dist/src/turn-classifier.js.map +1 -0
- package/dist/src/user-utils.d.ts +6 -0
- package/dist/src/user-utils.d.ts.map +1 -0
- package/dist/src/user-utils.js +27 -0
- package/dist/src/user-utils.js.map +1 -0
- package/dist/src/wake-up-builder.d.ts +12 -0
- package/dist/src/wake-up-builder.d.ts.map +1 -0
- package/dist/src/wake-up-builder.js +45 -0
- package/dist/src/wake-up-builder.js.map +1 -0
- package/dist/src/wake-up-renderer.d.ts +29 -0
- package/dist/src/wake-up-renderer.d.ts.map +1 -0
- package/dist/src/wake-up-renderer.js +182 -0
- package/dist/src/wake-up-renderer.js.map +1 -0
- package/package.json +87 -5
- package/prompts/sleep/01-gc-noise.md +28 -0
- package/prompts/sleep/02-daily-summary.md +3 -0
- package/prompts/sleep/03-extract-from-daily.md +3 -0
- package/prompts/sleep/04-retrospective.md +30 -0
- package/prompts/sleep/06-feedback.md +17 -0
- package/prompts/sleep/07-topic-assignment.md +23 -0
- package/prompts/sleep/08-core-promotion.md +26 -0
- package/prompts/sleep/09-merge.md +19 -0
- package/prompts/sleep/10-translation.md +17 -0
- package/prompts/sleep/11-skill-review.md +12 -0
- package/prompts/sleep/12-core-knowledge.md +14 -0
- package/prompts/sleep/13-consolidation.md +11 -0
- package/prompts/sleep/14-emotion-context.md +17 -0
- package/prompts/sleep/15-contradiction-and-graph.md +48 -0
- package/prompts/sleep/16-rem-synthesis.md +31 -0
- package/prompts/sleep/basic.md +12 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* context-engine.ts — DB-backed context window management.
|
|
3
|
+
* Pure data layer: reads/writes context state. No LLM calls.
|
|
4
|
+
* Agentbridge orchestrates compaction decisions and LLM summarization.
|
|
5
|
+
*/
|
|
6
|
+
import type Database from "better-sqlite3";
|
|
7
|
+
export interface ContextMessage {
|
|
8
|
+
id: number;
|
|
9
|
+
role: string;
|
|
10
|
+
content: string;
|
|
11
|
+
timestamp: number;
|
|
12
|
+
classification?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface ContextSummary {
|
|
15
|
+
id: number;
|
|
16
|
+
chatId: string;
|
|
17
|
+
depth: number;
|
|
18
|
+
content: string;
|
|
19
|
+
tokenEstimate: number;
|
|
20
|
+
sourceMessageStart: number;
|
|
21
|
+
sourceMessageEnd: number;
|
|
22
|
+
classification: number;
|
|
23
|
+
model: string | null;
|
|
24
|
+
createdAt: number;
|
|
25
|
+
}
|
|
26
|
+
export interface ContextSnapshot {
|
|
27
|
+
summaries: ContextSummary[];
|
|
28
|
+
messages: ContextMessage[];
|
|
29
|
+
estimatedTokens: number;
|
|
30
|
+
pendingCompaction: boolean;
|
|
31
|
+
}
|
|
32
|
+
export interface CompactionChunk {
|
|
33
|
+
messages: ContextMessage[];
|
|
34
|
+
sourceStart: number;
|
|
35
|
+
sourceEnd: number;
|
|
36
|
+
classification: number;
|
|
37
|
+
chunkTokens: number;
|
|
38
|
+
totalTokens: number;
|
|
39
|
+
}
|
|
40
|
+
export interface ContextWatermark {
|
|
41
|
+
chatId: string;
|
|
42
|
+
watermarkMessageId: number;
|
|
43
|
+
compactionCount: number;
|
|
44
|
+
lastCompactedAt: number | null;
|
|
45
|
+
lastFailedAt: number | null;
|
|
46
|
+
pendingCompaction: number;
|
|
47
|
+
model: string | null;
|
|
48
|
+
tokenEstimate: number | null;
|
|
49
|
+
}
|
|
50
|
+
export declare const CHARS_PER_TOKEN = 4;
|
|
51
|
+
export declare const TAIL_TOKENS = 20000;
|
|
52
|
+
export declare const TAIL_MIN_MESSAGES = 12;
|
|
53
|
+
export declare const MAX_CHUNK_TOKENS = 40000;
|
|
54
|
+
export declare const CONDENSATION_THRESHOLD_TOKENS = 8000;
|
|
55
|
+
export declare const COMPACTION_THRESHOLD_PCT = 0.5;
|
|
56
|
+
export declare const COOLDOWN_MS: number;
|
|
57
|
+
export declare class ContextEngine {
|
|
58
|
+
private db;
|
|
59
|
+
constructor(db: Database.Database);
|
|
60
|
+
/** Load current context state: summaries + messages from watermark. */
|
|
61
|
+
buildContext(chatId: string): ContextSnapshot;
|
|
62
|
+
/** Expose DB for tier renderer (needs to load hint columns). */
|
|
63
|
+
getDb(): Database.Database;
|
|
64
|
+
/** Identify the chunk to compact. Returns null if nothing to compact. */
|
|
65
|
+
getCompactionChunk(chatId: string, tokenBudget: number): CompactionChunk | null;
|
|
66
|
+
/** Store a compaction summary and advance the watermark. */
|
|
67
|
+
persistSummary(chatId: string, content: string, tokenEstimate: number, sourceStart: number, sourceEnd: number, classification: number, model?: string | null): number;
|
|
68
|
+
/** Store a condensed summary (depth > 0) and archive the source leaves. */
|
|
69
|
+
persistCondensedSummary(chatId: string, content: string, tokenEstimate: number, sourceLeafIds: number[], model?: string | null): number;
|
|
70
|
+
/** Archive all summaries for a chat (/reset). */
|
|
71
|
+
archiveContext(chatId: string): void;
|
|
72
|
+
/** Check if condensation is needed. */
|
|
73
|
+
needsCondensation(chatId: string): {
|
|
74
|
+
needed: boolean;
|
|
75
|
+
leafIds: number[];
|
|
76
|
+
totalTokens: number;
|
|
77
|
+
};
|
|
78
|
+
/** Set pending compaction flag. */
|
|
79
|
+
setPendingCompaction(chatId: string): void;
|
|
80
|
+
/** Record a failed compaction attempt (for cooldown). */
|
|
81
|
+
setLastFailed(chatId: string): void;
|
|
82
|
+
/** Get watermark for GC coordination. Returns MAX_INT if no watermark (protect all). */
|
|
83
|
+
getMinWatermarkForGC(): number;
|
|
84
|
+
getWatermark(chatId: string): ContextWatermark | null;
|
|
85
|
+
getSummaries(chatId: string): ContextSummary[];
|
|
86
|
+
getMessagesFrom(chatId: string, fromMessageId: number): ContextMessage[];
|
|
87
|
+
private advanceWatermark;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=context-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-engine.d.ts","sourceRoot":"","sources":["../../src/context-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* context-engine.ts — DB-backed context window management.
|
|
3
|
+
* Pure data layer: reads/writes context state. No LLM calls.
|
|
4
|
+
* Agentbridge orchestrates compaction decisions and LLM summarization.
|
|
5
|
+
*/
|
|
6
|
+
// ── Constants (exported for agentbridge to reference) ────────────────────────
|
|
7
|
+
export const CHARS_PER_TOKEN = 4;
|
|
8
|
+
export const TAIL_TOKENS = 20_000;
|
|
9
|
+
export const TAIL_MIN_MESSAGES = 12;
|
|
10
|
+
export const MAX_CHUNK_TOKENS = 40_000;
|
|
11
|
+
export const CONDENSATION_THRESHOLD_TOKENS = 8_000;
|
|
12
|
+
export const COMPACTION_THRESHOLD_PCT = 0.50;
|
|
13
|
+
export const COOLDOWN_MS = 10 * 60 * 1000;
|
|
14
|
+
// ── Context Engine ───────────────────────────────────────────────────────────
|
|
15
|
+
export class ContextEngine {
|
|
16
|
+
db;
|
|
17
|
+
constructor(db) {
|
|
18
|
+
this.db = db;
|
|
19
|
+
}
|
|
20
|
+
/** Load current context state: summaries + messages from watermark. */
|
|
21
|
+
buildContext(chatId) {
|
|
22
|
+
const wm = this.getWatermark(chatId);
|
|
23
|
+
const summaries = this.getSummaries(chatId);
|
|
24
|
+
const messages = this.getMessagesFrom(chatId, wm?.watermarkMessageId ?? 0);
|
|
25
|
+
const summaryTokens = summaries.reduce((s, x) => s + x.tokenEstimate, 0);
|
|
26
|
+
const messageTokens = messages.reduce((s, m) => s + Math.ceil(m.content.length / CHARS_PER_TOKEN), 0);
|
|
27
|
+
return {
|
|
28
|
+
summaries,
|
|
29
|
+
messages,
|
|
30
|
+
estimatedTokens: summaryTokens + messageTokens,
|
|
31
|
+
pendingCompaction: (wm?.pendingCompaction ?? 0) === 1,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/** Expose DB for tier renderer (needs to load hint columns). */
|
|
35
|
+
getDb() {
|
|
36
|
+
return this.db;
|
|
37
|
+
}
|
|
38
|
+
/** Identify the chunk to compact. Returns null if nothing to compact. */
|
|
39
|
+
getCompactionChunk(chatId, tokenBudget) {
|
|
40
|
+
const wm = this.getWatermark(chatId);
|
|
41
|
+
// Cooldown check
|
|
42
|
+
if (wm?.lastFailedAt && (Date.now() - wm.lastFailedAt) < COOLDOWN_MS)
|
|
43
|
+
return null;
|
|
44
|
+
const messages = this.getMessagesFrom(chatId, wm?.watermarkMessageId ?? 0);
|
|
45
|
+
if (messages.length <= TAIL_MIN_MESSAGES)
|
|
46
|
+
return null;
|
|
47
|
+
const msgTokens = messages.map(m => Math.ceil(m.content.length / CHARS_PER_TOKEN));
|
|
48
|
+
const totalTokens = msgTokens.reduce((s, t) => s + t, 0);
|
|
49
|
+
// Find tail boundary
|
|
50
|
+
let tailTokens = 0;
|
|
51
|
+
let tailStart = messages.length;
|
|
52
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
53
|
+
if (tailTokens + msgTokens[i] > TAIL_TOKENS && (messages.length - i) >= TAIL_MIN_MESSAGES)
|
|
54
|
+
break;
|
|
55
|
+
tailTokens += msgTokens[i];
|
|
56
|
+
tailStart = i;
|
|
57
|
+
}
|
|
58
|
+
// Last user message must be in tail
|
|
59
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
60
|
+
if (messages[i].role === "user") {
|
|
61
|
+
if (i < tailStart)
|
|
62
|
+
tailStart = i;
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (tailStart <= 0)
|
|
67
|
+
return null;
|
|
68
|
+
// Dynamic chunk: min(all outside tail, MAX_CHUNK_TOKENS)
|
|
69
|
+
let chunkEnd = 0;
|
|
70
|
+
let chunkTokens = 0;
|
|
71
|
+
for (let i = 0; i < tailStart; i++) {
|
|
72
|
+
if (chunkTokens + msgTokens[i] > MAX_CHUNK_TOKENS && chunkEnd > 0)
|
|
73
|
+
break;
|
|
74
|
+
chunkTokens += msgTokens[i];
|
|
75
|
+
chunkEnd = i + 1;
|
|
76
|
+
}
|
|
77
|
+
if (chunkEnd <= 0)
|
|
78
|
+
return null;
|
|
79
|
+
// Don't split tool groups
|
|
80
|
+
while (chunkEnd > 1 && messages[chunkEnd - 1]?.role === "tool")
|
|
81
|
+
chunkEnd--;
|
|
82
|
+
const chunk = messages.slice(0, chunkEnd);
|
|
83
|
+
// Classification: max of non-SECRET sources
|
|
84
|
+
const maxClass = chunk.reduce((max, m) => {
|
|
85
|
+
const c = m.classification ?? 1;
|
|
86
|
+
return c < 3 && c > max ? c : max;
|
|
87
|
+
}, 1);
|
|
88
|
+
return {
|
|
89
|
+
messages: chunk,
|
|
90
|
+
sourceStart: chunk[0].id,
|
|
91
|
+
sourceEnd: chunk[chunk.length - 1].id,
|
|
92
|
+
classification: maxClass,
|
|
93
|
+
chunkTokens,
|
|
94
|
+
totalTokens,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/** Store a compaction summary and advance the watermark. */
|
|
98
|
+
persistSummary(chatId, content, tokenEstimate, sourceStart, sourceEnd, classification, model) {
|
|
99
|
+
const stmt = this.db.prepare(`
|
|
100
|
+
INSERT INTO context_summaries (chat_id, depth, content, token_estimate, source_message_start, source_message_end, classification, model, created_at)
|
|
101
|
+
VALUES (?, 0, ?, ?, ?, ?, ?, ?, ?)
|
|
102
|
+
`);
|
|
103
|
+
const result = stmt.run(chatId, content, tokenEstimate, sourceStart, sourceEnd, classification, model ?? null, Date.now());
|
|
104
|
+
this.advanceWatermark(chatId, sourceEnd + 1, model ?? null, tokenEstimate);
|
|
105
|
+
return Number(result.lastInsertRowid);
|
|
106
|
+
}
|
|
107
|
+
/** Store a condensed summary (depth > 0) and archive the source leaves. */
|
|
108
|
+
persistCondensedSummary(chatId, content, tokenEstimate, sourceLeafIds, model) {
|
|
109
|
+
const leaves = this.getSummaries(chatId).filter(s => sourceLeafIds.includes(s.id));
|
|
110
|
+
if (leaves.length === 0)
|
|
111
|
+
return -1;
|
|
112
|
+
const sourceStart = Math.min(...leaves.map(l => l.sourceMessageStart));
|
|
113
|
+
const sourceEnd = Math.max(...leaves.map(l => l.sourceMessageEnd));
|
|
114
|
+
const maxDepth = Math.max(...leaves.map(l => l.depth));
|
|
115
|
+
const classification = Math.max(...leaves.map(l => l.classification));
|
|
116
|
+
const stmt = this.db.prepare(`
|
|
117
|
+
INSERT INTO context_summaries (chat_id, depth, content, token_estimate, source_message_start, source_message_end, classification, model, created_at)
|
|
118
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
119
|
+
`);
|
|
120
|
+
const result = stmt.run(chatId, maxDepth + 1, content, tokenEstimate, sourceStart, sourceEnd, classification, model ?? null, Date.now());
|
|
121
|
+
// Archive source leaves
|
|
122
|
+
const ids = sourceLeafIds.map(() => "?").join(",");
|
|
123
|
+
this.db.prepare(`UPDATE context_summaries SET archived = 1 WHERE id IN (${ids})`).run(...sourceLeafIds);
|
|
124
|
+
return Number(result.lastInsertRowid);
|
|
125
|
+
}
|
|
126
|
+
/** Archive all summaries for a chat (/reset). */
|
|
127
|
+
archiveContext(chatId) {
|
|
128
|
+
this.db.prepare("UPDATE context_summaries SET archived = 1 WHERE chat_id = ? AND archived = 0").run(chatId);
|
|
129
|
+
const latest = this.db.prepare("SELECT MAX(id) as maxId FROM messages WHERE session_id = ?").get(chatId);
|
|
130
|
+
if (latest?.maxId) {
|
|
131
|
+
this.advanceWatermark(chatId, latest.maxId + 1, null, null);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/** Check if condensation is needed. */
|
|
135
|
+
needsCondensation(chatId) {
|
|
136
|
+
const leaves = this.getSummaries(chatId).filter(s => s.depth === 0);
|
|
137
|
+
const totalTokens = leaves.reduce((s, x) => s + x.tokenEstimate, 0);
|
|
138
|
+
return { needed: totalTokens > CONDENSATION_THRESHOLD_TOKENS, leafIds: leaves.map(l => l.id), totalTokens };
|
|
139
|
+
}
|
|
140
|
+
/** Set pending compaction flag. */
|
|
141
|
+
setPendingCompaction(chatId) {
|
|
142
|
+
this.db.prepare(`
|
|
143
|
+
INSERT INTO context_watermarks (chat_id, watermark_message_id, pending_compaction)
|
|
144
|
+
VALUES (?, 0, 1)
|
|
145
|
+
ON CONFLICT(chat_id) DO UPDATE SET pending_compaction = 1
|
|
146
|
+
`).run(chatId);
|
|
147
|
+
}
|
|
148
|
+
/** Record a failed compaction attempt (for cooldown). */
|
|
149
|
+
setLastFailed(chatId) {
|
|
150
|
+
this.db.prepare(`
|
|
151
|
+
INSERT INTO context_watermarks (chat_id, watermark_message_id, last_failed_at)
|
|
152
|
+
VALUES (?, 0, ?)
|
|
153
|
+
ON CONFLICT(chat_id) DO UPDATE SET last_failed_at = excluded.last_failed_at
|
|
154
|
+
`).run(chatId, Date.now());
|
|
155
|
+
}
|
|
156
|
+
/** Get watermark for GC coordination. Returns MAX_INT if no watermark (protect all). */
|
|
157
|
+
getMinWatermarkForGC() {
|
|
158
|
+
const row = this.db.prepare("SELECT MIN(watermark_message_id) as minWm FROM context_watermarks").get();
|
|
159
|
+
return row?.minWm ?? 2147483647;
|
|
160
|
+
}
|
|
161
|
+
// ── Getters ────────────────────────────────────────────────────────────────
|
|
162
|
+
getWatermark(chatId) {
|
|
163
|
+
const row = this.db.prepare("SELECT * FROM context_watermarks WHERE chat_id = ?").get(chatId);
|
|
164
|
+
if (!row)
|
|
165
|
+
return null;
|
|
166
|
+
return {
|
|
167
|
+
chatId: row.chat_id,
|
|
168
|
+
watermarkMessageId: row.watermark_message_id,
|
|
169
|
+
compactionCount: row.compaction_count,
|
|
170
|
+
lastCompactedAt: row.last_compacted_at,
|
|
171
|
+
lastFailedAt: row.last_failed_at,
|
|
172
|
+
pendingCompaction: row.pending_compaction,
|
|
173
|
+
model: row.model,
|
|
174
|
+
tokenEstimate: row.token_estimate,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
getSummaries(chatId) {
|
|
178
|
+
const rows = this.db.prepare("SELECT * FROM context_summaries WHERE chat_id = ? AND archived = 0 ORDER BY created_at").all(chatId);
|
|
179
|
+
return rows.map(r => ({
|
|
180
|
+
id: r.id,
|
|
181
|
+
chatId: r.chat_id,
|
|
182
|
+
depth: r.depth,
|
|
183
|
+
content: r.content,
|
|
184
|
+
tokenEstimate: r.token_estimate,
|
|
185
|
+
sourceMessageStart: r.source_message_start,
|
|
186
|
+
sourceMessageEnd: r.source_message_end,
|
|
187
|
+
classification: r.classification,
|
|
188
|
+
model: r.model,
|
|
189
|
+
createdAt: r.created_at,
|
|
190
|
+
}));
|
|
191
|
+
}
|
|
192
|
+
getMessagesFrom(chatId, fromMessageId) {
|
|
193
|
+
const rows = this.db.prepare("SELECT id, role, content, timestamp FROM messages WHERE session_id = ? AND id >= ? ORDER BY id").all(chatId, fromMessageId);
|
|
194
|
+
return rows.map(r => ({
|
|
195
|
+
id: r.id,
|
|
196
|
+
role: r.role,
|
|
197
|
+
content: r.content,
|
|
198
|
+
timestamp: r.timestamp,
|
|
199
|
+
}));
|
|
200
|
+
}
|
|
201
|
+
// ── Private ────────────────────────────────────────────────────────────────
|
|
202
|
+
advanceWatermark(chatId, watermarkMessageId, model, tokenEstimate) {
|
|
203
|
+
this.db.prepare(`
|
|
204
|
+
INSERT INTO context_watermarks (chat_id, watermark_message_id, compaction_count, last_compacted_at, model, token_estimate)
|
|
205
|
+
VALUES (?, ?, 1, ?, ?, ?)
|
|
206
|
+
ON CONFLICT(chat_id) DO UPDATE SET
|
|
207
|
+
watermark_message_id = excluded.watermark_message_id,
|
|
208
|
+
compaction_count = compaction_count + 1,
|
|
209
|
+
last_compacted_at = excluded.last_compacted_at,
|
|
210
|
+
model = excluded.model,
|
|
211
|
+
token_estimate = excluded.token_estimate,
|
|
212
|
+
pending_compaction = 0
|
|
213
|
+
`).run(chatId, watermarkMessageId, Date.now(), model, tokenEstimate);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=context-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-engine.js","sourceRoot":"","sources":["../../src/context-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* context-tier-renderer.ts — Three-tier context assembly (#348).
|
|
3
|
+
*
|
|
4
|
+
* Assembles API context in three tiers:
|
|
5
|
+
* - tail: last N turns, verbatim prose
|
|
6
|
+
* - middle: next M turns, ABM-L rendering via stored hints (pure function)
|
|
7
|
+
* - head: older than tail+middle, represented via #319 summaries
|
|
8
|
+
*
|
|
9
|
+
* Phase 1: pure-function heuristic. No LLM, no cache, no batching.
|
|
10
|
+
* Phase 2 (behind COMPACTION_LLM_ENABLED=true): optional LLM refinement
|
|
11
|
+
* layer that takes heuristic output and refines it. Caches result.
|
|
12
|
+
* Heuristic is always the fallback — LLM never replaces, only enhances.
|
|
13
|
+
*
|
|
14
|
+
* ABM-L is render-only. Stored messages stay as raw prose + structured
|
|
15
|
+
* metadata columns. Compression happens at assembly time only.
|
|
16
|
+
*/
|
|
17
|
+
import type Database from "better-sqlite3";
|
|
18
|
+
import { ContextEngine } from "./context-engine.js";
|
|
19
|
+
import type { ContextMessage } from "./context-engine.js";
|
|
20
|
+
import { LlmRefinementCache, type RefineLlmFn } from "./tier-llm-refinement.js";
|
|
21
|
+
export type Tier = "tail" | "middle" | "head";
|
|
22
|
+
export interface TierBreakdown {
|
|
23
|
+
tailCount: number;
|
|
24
|
+
middleCount: number;
|
|
25
|
+
headCount: number;
|
|
26
|
+
}
|
|
27
|
+
export interface TieredContextResult {
|
|
28
|
+
messages: Array<{
|
|
29
|
+
role: string;
|
|
30
|
+
content: string;
|
|
31
|
+
}>;
|
|
32
|
+
tierBreakdown: TierBreakdown;
|
|
33
|
+
estimatedTokens: number;
|
|
34
|
+
}
|
|
35
|
+
export interface MessageWithHints extends ContextMessage {
|
|
36
|
+
type_hint?: string | null;
|
|
37
|
+
topic_hint?: string | null;
|
|
38
|
+
emotion_hint?: string | null;
|
|
39
|
+
}
|
|
40
|
+
/** Exposed for tests / debugging. */
|
|
41
|
+
export declare function _getLlmCache(): LlmRefinementCache;
|
|
42
|
+
/**
|
|
43
|
+
* Determine which tier a message belongs to based on its position from the end.
|
|
44
|
+
* Pure function — deterministic given inputs.
|
|
45
|
+
*/
|
|
46
|
+
export declare function determineTier(positionFromEnd: number, tailSize: number, middleSize: number): Tier;
|
|
47
|
+
/**
|
|
48
|
+
* Render a single conversation turn as ABM-L using the configured codec.
|
|
49
|
+
* Pure function of (message_with_hints, ABML_VERSION).
|
|
50
|
+
*
|
|
51
|
+
* Falls back to defaults when hints are null (historical messages from
|
|
52
|
+
* before the classifier was added).
|
|
53
|
+
*/
|
|
54
|
+
export declare function renderMiddleTurn(msg: MessageWithHints): string;
|
|
55
|
+
/**
|
|
56
|
+
* Main assembly entry point. Builds the three-tier context from DB state.
|
|
57
|
+
*
|
|
58
|
+
* Order of operations:
|
|
59
|
+
* 1. Load raw context via ContextEngine.buildContext() (#319 summaries + messages)
|
|
60
|
+
* 2. Apply tier boundaries (pure function of position)
|
|
61
|
+
* 3. Render: tail verbatim, middle via ABM-L, head as injected summaries
|
|
62
|
+
* 4. Return TieredContextResult with breakdown + token estimate
|
|
63
|
+
*
|
|
64
|
+
* If CONTEXT_TIER_ENABLED=false, falls back to the legacy binary assembly
|
|
65
|
+
* (raw messages + summary head, no middle tier).
|
|
66
|
+
*/
|
|
67
|
+
export declare function renderForContext(db: Database.Database, engine: ContextEngine, chatId: string): TieredContextResult;
|
|
68
|
+
/**
|
|
69
|
+
* Refine the middle tier via LLM batch call. Runs async, never blocks user.
|
|
70
|
+
* Only acts when COMPACTION_LLM_ENABLED=true. Caches results per (chatId, messageId).
|
|
71
|
+
*
|
|
72
|
+
* Intended callers: afterTurn()/afterResponse() hooks in the transport layer.
|
|
73
|
+
* Errors are swallowed (logged) — heuristic remains the fallback.
|
|
74
|
+
*/
|
|
75
|
+
export declare function refineMiddleTierBatch(db: Database.Database, engine: ContextEngine, chatId: string, llmCall: RefineLlmFn, batchSize?: number): Promise<{
|
|
76
|
+
refined: number;
|
|
77
|
+
skipped: number;
|
|
78
|
+
}>;
|
|
79
|
+
//# sourceMappingURL=context-tier-renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-tier-renderer.d.ts","sourceRoot":"","sources":["../../src/context-tier-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAI3C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,qBAAqB,CAAC;AAG1E,OAAO,EAAE,kBAAkB,EAAe,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAI7F,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,aAAa,EAAE,aAAa,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,gBAAiB,SAAQ,cAAc;IACtD,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAQD,qCAAqC;AACrC,wBAAgB,YAAY,IAAI,kBAAkB,CAEjD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,IAAI,CAIN;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,gBAAgB,GAAG,MAAM,CAgB9D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,MAAM,GACb,mBAAmB,CA2ErB;AA4BD;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,WAAW,EACpB,SAAS,SAAK,GACb,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAoC/C"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* context-tier-renderer.ts — Three-tier context assembly (#348).
|
|
3
|
+
*
|
|
4
|
+
* Assembles API context in three tiers:
|
|
5
|
+
* - tail: last N turns, verbatim prose
|
|
6
|
+
* - middle: next M turns, ABM-L rendering via stored hints (pure function)
|
|
7
|
+
* - head: older than tail+middle, represented via #319 summaries
|
|
8
|
+
*
|
|
9
|
+
* Phase 1: pure-function heuristic. No LLM, no cache, no batching.
|
|
10
|
+
* Phase 2 (behind COMPACTION_LLM_ENABLED=true): optional LLM refinement
|
|
11
|
+
* layer that takes heuristic output and refines it. Caches result.
|
|
12
|
+
* Heuristic is always the fallback — LLM never replaces, only enhances.
|
|
13
|
+
*
|
|
14
|
+
* ABM-L is render-only. Stored messages stay as raw prose + structured
|
|
15
|
+
* metadata columns. Compression happens at assembly time only.
|
|
16
|
+
*/
|
|
17
|
+
import { getAbmindEnv } from "./env-schema.js";
|
|
18
|
+
import { renderMemory } from "./memory-renderer.js";
|
|
19
|
+
import { typeCodeToFull } from "./turn-classifier.js";
|
|
20
|
+
import { localMonth } from "./local-time.js";
|
|
21
|
+
import { logDebug } from "./mem-logger.js";
|
|
22
|
+
import { LlmRefinementCache, refineBatch } from "./tier-llm-refinement.js";
|
|
23
|
+
const TAG = "context-tier-renderer";
|
|
24
|
+
const CHARS_PER_TOKEN = 4;
|
|
25
|
+
const SUMMARY_FRAMING = "[Context summary — earlier in this conversation]";
|
|
26
|
+
/** Module-level LRU cache for Phase 2 LLM refinement. */
|
|
27
|
+
const llmCache = new LlmRefinementCache(10_000);
|
|
28
|
+
/** Exposed for tests / debugging. */
|
|
29
|
+
export function _getLlmCache() {
|
|
30
|
+
return llmCache;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Determine which tier a message belongs to based on its position from the end.
|
|
34
|
+
* Pure function — deterministic given inputs.
|
|
35
|
+
*/
|
|
36
|
+
export function determineTier(positionFromEnd, tailSize, middleSize) {
|
|
37
|
+
if (positionFromEnd < tailSize)
|
|
38
|
+
return "tail";
|
|
39
|
+
if (positionFromEnd < tailSize + middleSize)
|
|
40
|
+
return "middle";
|
|
41
|
+
return "head";
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Render a single conversation turn as ABM-L using the configured codec.
|
|
45
|
+
* Pure function of (message_with_hints, ABML_VERSION).
|
|
46
|
+
*
|
|
47
|
+
* Falls back to defaults when hints are null (historical messages from
|
|
48
|
+
* before the classifier was added).
|
|
49
|
+
*/
|
|
50
|
+
export function renderMiddleTurn(msg) {
|
|
51
|
+
const typeCode = msg.type_hint ?? null;
|
|
52
|
+
const memoryType = typeCodeToFull(typeCode);
|
|
53
|
+
const topic = msg.topic_hint ?? "general";
|
|
54
|
+
const emotion = msg.emotion_hint ?? "";
|
|
55
|
+
const date = localMonth(new Date(msg.timestamp));
|
|
56
|
+
return renderMemory({
|
|
57
|
+
role: (msg.role === "assistant" || msg.role === "ASSISTANT" ? "assistant" : "user"),
|
|
58
|
+
memory_type: memoryType,
|
|
59
|
+
topic,
|
|
60
|
+
emotion_tags: emotion,
|
|
61
|
+
content_en: msg.content,
|
|
62
|
+
confidence: 3,
|
|
63
|
+
date,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Main assembly entry point. Builds the three-tier context from DB state.
|
|
68
|
+
*
|
|
69
|
+
* Order of operations:
|
|
70
|
+
* 1. Load raw context via ContextEngine.buildContext() (#319 summaries + messages)
|
|
71
|
+
* 2. Apply tier boundaries (pure function of position)
|
|
72
|
+
* 3. Render: tail verbatim, middle via ABM-L, head as injected summaries
|
|
73
|
+
* 4. Return TieredContextResult with breakdown + token estimate
|
|
74
|
+
*
|
|
75
|
+
* If CONTEXT_TIER_ENABLED=false, falls back to the legacy binary assembly
|
|
76
|
+
* (raw messages + summary head, no middle tier).
|
|
77
|
+
*/
|
|
78
|
+
export function renderForContext(db, engine, chatId) {
|
|
79
|
+
const env = getAbmindEnv();
|
|
80
|
+
const snapshot = engine.buildContext(chatId);
|
|
81
|
+
if (!env.contextTierEnabled) {
|
|
82
|
+
// Fallback: legacy #319 binary behavior — summaries + all raw messages
|
|
83
|
+
return renderLegacyBinary(snapshot);
|
|
84
|
+
}
|
|
85
|
+
// Load full message rows with hints (buildContext returns minimal ContextMessage)
|
|
86
|
+
const hintRows = loadMessagesWithHints(db, chatId, snapshot.messages.map(m => m.id));
|
|
87
|
+
// Tier determination (pure function of position)
|
|
88
|
+
const totalMessages = hintRows.length;
|
|
89
|
+
const tailSize = env.contextTierTail;
|
|
90
|
+
const middleSize = env.contextTierMiddle;
|
|
91
|
+
const tierOfIndex = (idx) => {
|
|
92
|
+
const posFromEnd = totalMessages - 1 - idx;
|
|
93
|
+
return determineTier(posFromEnd, tailSize, middleSize);
|
|
94
|
+
};
|
|
95
|
+
// Build final messages array: head summaries first, then middle, then tail
|
|
96
|
+
const contextMessages = [];
|
|
97
|
+
// Head tier — inject summaries as user messages with framing
|
|
98
|
+
for (const summary of snapshot.summaries) {
|
|
99
|
+
contextMessages.push({ role: "user", content: `${SUMMARY_FRAMING}\n\n${summary.content}` });
|
|
100
|
+
}
|
|
101
|
+
let middleCount = 0;
|
|
102
|
+
let tailCount = 0;
|
|
103
|
+
for (let i = 0; i < hintRows.length; i++) {
|
|
104
|
+
const msg = hintRows[i];
|
|
105
|
+
if (!msg)
|
|
106
|
+
continue;
|
|
107
|
+
const tier = tierOfIndex(i);
|
|
108
|
+
if (tier === "tail") {
|
|
109
|
+
// Verbatim
|
|
110
|
+
contextMessages.push({ role: msg.role, content: msg.content });
|
|
111
|
+
tailCount++;
|
|
112
|
+
}
|
|
113
|
+
else if (tier === "middle") {
|
|
114
|
+
// Check LLM refinement cache (only when COMPACTION_LLM_ENABLED)
|
|
115
|
+
let rendered;
|
|
116
|
+
if (env.compactionLlmEnabled) {
|
|
117
|
+
const cached = llmCache.get(chatId, msg.id);
|
|
118
|
+
rendered = cached ?? renderMiddleTurn(msg);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
rendered = renderMiddleTurn(msg);
|
|
122
|
+
}
|
|
123
|
+
contextMessages.push({ role: msg.role, content: rendered });
|
|
124
|
+
middleCount++;
|
|
125
|
+
}
|
|
126
|
+
// Head messages are not included here — they should have been folded into summaries.
|
|
127
|
+
// If they appear here it means #319 hasn't compacted yet. Skip; will appear in tail/middle
|
|
128
|
+
// when position changes.
|
|
129
|
+
}
|
|
130
|
+
const estimatedTokens = contextMessages.reduce((sum, m) => sum + Math.ceil(m.content.length / CHARS_PER_TOKEN), 0);
|
|
131
|
+
logDebug(TAG, `tier assembly: head=${snapshot.summaries.length} middle=${middleCount} tail=${tailCount} est=${estimatedTokens}tok`);
|
|
132
|
+
return {
|
|
133
|
+
messages: contextMessages,
|
|
134
|
+
tierBreakdown: {
|
|
135
|
+
tailCount,
|
|
136
|
+
middleCount,
|
|
137
|
+
headCount: snapshot.summaries.length,
|
|
138
|
+
},
|
|
139
|
+
estimatedTokens,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
function renderLegacyBinary(snapshot) {
|
|
143
|
+
const contextMessages = [];
|
|
144
|
+
for (const summary of snapshot.summaries) {
|
|
145
|
+
contextMessages.push({ role: "user", content: `${SUMMARY_FRAMING}\n\n${summary.content}` });
|
|
146
|
+
}
|
|
147
|
+
for (const msg of snapshot.messages) {
|
|
148
|
+
contextMessages.push({ role: msg.role, content: msg.content });
|
|
149
|
+
}
|
|
150
|
+
const estimatedTokens = contextMessages.reduce((sum, m) => sum + Math.ceil(m.content.length / CHARS_PER_TOKEN), 0);
|
|
151
|
+
return {
|
|
152
|
+
messages: contextMessages,
|
|
153
|
+
tierBreakdown: {
|
|
154
|
+
tailCount: snapshot.messages.length,
|
|
155
|
+
middleCount: 0,
|
|
156
|
+
headCount: snapshot.summaries.length,
|
|
157
|
+
},
|
|
158
|
+
estimatedTokens,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Refine the middle tier via LLM batch call. Runs async, never blocks user.
|
|
163
|
+
* Only acts when COMPACTION_LLM_ENABLED=true. Caches results per (chatId, messageId).
|
|
164
|
+
*
|
|
165
|
+
* Intended callers: afterTurn()/afterResponse() hooks in the transport layer.
|
|
166
|
+
* Errors are swallowed (logged) — heuristic remains the fallback.
|
|
167
|
+
*/
|
|
168
|
+
export async function refineMiddleTierBatch(db, engine, chatId, llmCall, batchSize = 20) {
|
|
169
|
+
const env = getAbmindEnv();
|
|
170
|
+
if (!env.compactionLlmEnabled || !env.contextTierEnabled) {
|
|
171
|
+
return { refined: 0, skipped: 0 };
|
|
172
|
+
}
|
|
173
|
+
const snapshot = engine.buildContext(chatId);
|
|
174
|
+
const hintRows = loadMessagesWithHints(db, chatId, snapshot.messages.map(m => m.id));
|
|
175
|
+
const totalMessages = hintRows.length;
|
|
176
|
+
const tailSize = env.contextTierTail;
|
|
177
|
+
const middleSize = env.contextTierMiddle;
|
|
178
|
+
// Collect middle-tier messages that are not yet cached
|
|
179
|
+
const uncached = [];
|
|
180
|
+
for (let i = 0; i < hintRows.length; i++) {
|
|
181
|
+
const msg = hintRows[i];
|
|
182
|
+
if (!msg)
|
|
183
|
+
continue;
|
|
184
|
+
const posFromEnd = totalMessages - 1 - i;
|
|
185
|
+
const tier = determineTier(posFromEnd, tailSize, middleSize);
|
|
186
|
+
if (tier !== "middle")
|
|
187
|
+
continue;
|
|
188
|
+
if (llmCache.get(chatId, msg.id) !== null)
|
|
189
|
+
continue;
|
|
190
|
+
uncached.push(msg);
|
|
191
|
+
if (uncached.length >= batchSize)
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
if (uncached.length === 0)
|
|
195
|
+
return { refined: 0, skipped: 0 };
|
|
196
|
+
const refined = await refineBatch(uncached, llmCall);
|
|
197
|
+
// Populate cache — only entries the LLM successfully returned
|
|
198
|
+
for (const [msgId, rendered] of refined.entries()) {
|
|
199
|
+
llmCache.set(chatId, msgId, rendered);
|
|
200
|
+
}
|
|
201
|
+
const skipped = uncached.length - refined.size;
|
|
202
|
+
logDebug(TAG, `LLM refinement: refined=${refined.size} skipped=${skipped} (fallback to heuristic for skipped)`);
|
|
203
|
+
return { refined: refined.size, skipped };
|
|
204
|
+
}
|
|
205
|
+
function loadMessagesWithHints(db, chatId, ids) {
|
|
206
|
+
if (ids.length === 0)
|
|
207
|
+
return [];
|
|
208
|
+
const placeholders = ids.map(() => "?").join(",");
|
|
209
|
+
const rows = db.prepare(`SELECT id, role, content, timestamp, type_hint, topic_hint, emotion_hint
|
|
210
|
+
FROM messages
|
|
211
|
+
WHERE session_id = ? AND id IN (${placeholders})
|
|
212
|
+
ORDER BY timestamp ASC, id ASC`).all(chatId, ...ids);
|
|
213
|
+
return rows.map(r => ({
|
|
214
|
+
id: r.id,
|
|
215
|
+
role: r.role,
|
|
216
|
+
content: r.content,
|
|
217
|
+
timestamp: r.timestamp,
|
|
218
|
+
type_hint: r.type_hint,
|
|
219
|
+
topic_hint: r.topic_hint,
|
|
220
|
+
emotion_hint: r.emotion_hint,
|
|
221
|
+
}));
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=context-tier-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-tier-renderer.js","sourceRoot":"","sources":["../../src/context-tier-renderer.ts"],"names":[],"mappings":"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"}
|