openclaw-hybrid-memory 2026.5.310 → 2026.6.10
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/api/plugin-runtime.ts +2 -0
- package/backends/facts-db/contradictions.ts +1 -1
- package/cli/cmd-extract-directives.ts +225 -11
- package/cli/cmd-extract-proposals.ts +5 -6
- package/cli/cmd-extract-reinforcement.ts +71 -0
- package/cli/cmd-feedback.ts +15 -9
- package/cli/commands/manage/register-reflection-pipeline.ts +247 -13
- package/cli/commands/manage/register-storage-maintenance.ts +224 -15
- package/cli/commands/manage/storage-stats-helpers.ts +13 -2
- package/cli/context.ts +9 -19
- package/cli/distill.ts +31 -1
- package/cli/register.ts +28 -38
- package/dist/api/plugin-runtime.js.map +1 -1
- package/dist/backends/agent-health-store.js.map +1 -1
- package/dist/backends/apitap-store.js.map +1 -1
- package/dist/backends/audit-store.js.map +1 -1
- package/dist/backends/base-sqlite-store.js.map +1 -1
- package/dist/backends/cost-tracker.js.map +1 -1
- package/dist/backends/credentials-db.js +2 -3
- package/dist/backends/credentials-db.js.map +1 -1
- package/dist/backends/crystallization-store.js.map +1 -1
- package/dist/backends/edict-store.js.map +1 -1
- package/dist/backends/event-bus.js.map +1 -1
- package/dist/backends/event-log.js.map +1 -1
- package/dist/backends/facts-db/cache-manager.js.map +1 -1
- package/dist/backends/facts-db/clusters.js.map +1 -1
- package/dist/backends/facts-db/contradictions.js +1 -1
- package/dist/backends/facts-db/contradictions.js.map +1 -1
- package/dist/backends/facts-db/crud.js.map +1 -1
- package/dist/backends/facts-db/db-connection.js.map +1 -1
- package/dist/backends/facts-db/entity-autolink.js.map +1 -1
- package/dist/backends/facts-db/entity-layer.js.map +1 -1
- package/dist/backends/facts-db/episodes.js.map +1 -1
- package/dist/backends/facts-db/fact-queries.js.map +1 -1
- package/dist/backends/facts-db/fact-read-queries.js.map +1 -1
- package/dist/backends/facts-db/facts-db-layer1.js.map +1 -1
- package/dist/backends/facts-db/facts-db-layer2.js.map +1 -1
- package/dist/backends/facts-db/facts-db-layer3.js.map +1 -1
- package/dist/backends/facts-db/fts-text.js.map +1 -1
- package/dist/backends/facts-db/generated-skills/policy.js.map +1 -1
- package/dist/backends/facts-db/generated-skills.js.map +1 -1
- package/dist/backends/facts-db/housekeeping.js.map +1 -1
- package/dist/backends/facts-db/links.js.map +1 -1
- package/dist/backends/facts-db/maintenance.js.map +1 -1
- package/dist/backends/facts-db/procedures/crud.js.map +1 -1
- package/dist/backends/facts-db/procedures/internal.js.map +1 -1
- package/dist/backends/facts-db/procedures/promotion.js.map +1 -1
- package/dist/backends/facts-db/procedures/search.js.map +1 -1
- package/dist/backends/facts-db/procedures/stats.js.map +1 -1
- package/dist/backends/facts-db/reinforcement.js.map +1 -1
- package/dist/backends/facts-db/row-mapper.js.map +1 -1
- package/dist/backends/facts-db/scan-cursors.js.map +1 -1
- package/dist/backends/facts-db/schema-bootstrap.js.map +1 -1
- package/dist/backends/facts-db/scope-sql.js.map +1 -1
- package/dist/backends/facts-db/search.js.map +1 -1
- package/dist/backends/facts-db/stats.js.map +1 -1
- package/dist/backends/facts-db/types.js.map +1 -1
- package/dist/backends/facts-db/variants.js.map +1 -1
- package/dist/backends/identity-reflection-store.js.map +1 -1
- package/dist/backends/issue-store.js.map +1 -1
- package/dist/backends/learnings-db.js.map +1 -1
- package/dist/backends/migrations/facts-migrations.js.map +1 -1
- package/dist/backends/migrations/procedures.js.map +1 -1
- package/dist/backends/narratives-db.js.map +1 -1
- package/dist/backends/persona-state-store.js.map +1 -1
- package/dist/backends/proposals-db.js.map +1 -1
- package/dist/backends/scope-filter-sql.js.map +1 -1
- package/dist/backends/sqlite-schema-meta.js.map +1 -1
- package/dist/backends/tool-proposal-store.js.map +1 -1
- package/dist/backends/vector-db/constants.js.map +1 -1
- package/dist/backends/vector-db/path-utils.js.map +1 -1
- package/dist/backends/vector-db/runtime-locks.js.map +1 -1
- package/dist/backends/vector-db/vector-db-class.js.map +1 -1
- package/dist/backends/wal.js.map +1 -1
- package/dist/backends/workflow-store.js.map +1 -1
- package/dist/benchmark/shadow-eval.js.map +1 -1
- package/dist/cli/active-tasks.js.map +1 -1
- package/dist/cli/backup.js.map +1 -1
- package/dist/cli/benchmark.js.map +1 -1
- package/dist/cli/cmd-backfill.js.map +1 -1
- package/dist/cli/cmd-config.js.map +1 -1
- package/dist/cli/cmd-credentials.js.map +1 -1
- package/dist/cli/cmd-demo.js.map +1 -1
- package/dist/cli/cmd-distill.js.map +1 -1
- package/dist/cli/cmd-doctor.js.map +1 -1
- package/dist/cli/cmd-examples.js.map +1 -1
- package/dist/cli/cmd-extract-daily.js.map +1 -1
- package/dist/cli/cmd-extract-directives.js +141 -10
- package/dist/cli/cmd-extract-directives.js.map +1 -1
- package/dist/cli/cmd-extract-procedures.js.map +1 -1
- package/dist/cli/cmd-extract-proposals.js +3 -2
- package/dist/cli/cmd-extract-proposals.js.map +1 -1
- package/dist/cli/cmd-extract-reinforcement.js +39 -0
- package/dist/cli/cmd-extract-reinforcement.js.map +1 -1
- package/dist/cli/cmd-extract-sessions.js.map +1 -1
- package/dist/cli/cmd-feedback.js +9 -4
- package/dist/cli/cmd-feedback.js.map +1 -1
- package/dist/cli/cmd-health.js.map +1 -1
- package/dist/cli/cmd-providers.js.map +1 -1
- package/dist/cli/cmd-selfcorrection.js.map +1 -1
- package/dist/cli/cmd-setup.js.map +1 -1
- package/dist/cli/cmd-status.js.map +1 -1
- package/dist/cli/cmd-store.js.map +1 -1
- package/dist/cli/cmd-user-friendly.js.map +1 -1
- package/dist/cli/cmd-verify.js.map +1 -1
- package/dist/cli/commands/manage/bindings.js.map +1 -1
- package/dist/cli/commands/manage/dream-cycle-followup.js.map +1 -1
- package/dist/cli/commands/manage/maintenance-heartbeat.js.map +1 -1
- package/dist/cli/commands/manage/register-agents-audit-runall.js.map +1 -1
- package/dist/cli/commands/manage/register-analyze-maintenance-logs.js.map +1 -1
- package/dist/cli/commands/manage/register-budget-proposals.js.map +1 -1
- package/dist/cli/commands/manage/register-config-cli.js.map +1 -1
- package/dist/cli/commands/manage/register-corrections-and-pipeline.js.map +1 -1
- package/dist/cli/commands/manage/register-corrections.js.map +1 -1
- package/dist/cli/commands/manage/register-council.js.map +1 -1
- package/dist/cli/commands/manage/register-credentials-scope.js.map +1 -1
- package/dist/cli/commands/manage/register-digest.js.map +1 -1
- package/dist/cli/commands/manage/register-lifecycle.js.map +1 -1
- package/dist/cli/commands/manage/register-procedure-lifecycle.js.map +1 -1
- package/dist/cli/commands/manage/register-reconcile-cron-ledgers.js.map +1 -1
- package/dist/cli/commands/manage/register-reflection-pipeline.js +144 -7
- package/dist/cli/commands/manage/register-reflection-pipeline.js.map +1 -1
- package/dist/cli/commands/manage/register-self-correction-feedback.js.map +1 -1
- package/dist/cli/commands/manage/register-storage-and-stats.js.map +1 -1
- package/dist/cli/commands/manage/register-storage-entities-decay.js.map +1 -1
- package/dist/cli/commands/manage/register-storage-graph-audit.js.map +1 -1
- package/dist/cli/commands/manage/register-storage-maintenance.js +152 -9
- package/dist/cli/commands/manage/register-storage-maintenance.js.map +1 -1
- package/dist/cli/commands/manage/register-validate-cron-exit.js.map +1 -1
- package/dist/cli/commands/manage/storage-stats-helpers.js +10 -3
- package/dist/cli/commands/manage/storage-stats-helpers.js.map +1 -1
- package/dist/cli/commands/register-manage-commands.js.map +1 -1
- package/dist/cli/config-feature-summaries.js.map +1 -1
- package/dist/cli/config-output-sink.js.map +1 -1
- package/dist/cli/distill-session-jsonl.js.map +1 -1
- package/dist/cli/distill.js +10 -1
- package/dist/cli/distill.js.map +1 -1
- package/dist/cli/global-verbose.js.map +1 -1
- package/dist/cli/goals.js.map +1 -1
- package/dist/cli/hybrid-mem-commander-utils.js.map +1 -1
- package/dist/cli/install/config-merge.js.map +1 -1
- package/dist/cli/install/cron-jobs.js.map +1 -1
- package/dist/cli/install/embedding-detect.js.map +1 -1
- package/dist/cli/install/run-install.js.map +1 -1
- package/dist/cli/install/workspace.js.map +1 -1
- package/dist/cli/proposals.js.map +1 -1
- package/dist/cli/register.js.map +1 -1
- package/dist/cli/shared.js.map +1 -1
- package/dist/cli/skills.js.map +1 -1
- package/dist/cli/task-queue-status.js.map +1 -1
- package/dist/cli/verified.js.map +1 -1
- package/dist/cli/verify/fact-count.js.map +1 -1
- package/dist/cli/verify/openclaw-config.js.map +1 -1
- package/dist/cli/verify/plugin-config-credentials.js.map +1 -1
- package/dist/cli/verify/sections/config-cron.js.map +1 -1
- package/dist/cli/verify/sections/embeddings.js.map +1 -1
- package/dist/cli/verify/sections/infrastructure.js.map +1 -1
- package/dist/cli/verify/sections/llm-models.js.map +1 -1
- package/dist/cli/verify/sections/reconcile.js.map +1 -1
- package/dist/cli/verify/verify-run-state.js.map +1 -1
- package/dist/cli/verify-llm-azure-auth.js.map +1 -1
- package/dist/cli/verify.js.map +1 -1
- package/dist/config/hybrid-schema.js.map +1 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/maintenance-fallback-policy.js.map +1 -1
- package/dist/config/parsers/capture.js.map +1 -1
- package/dist/config/parsers/core.js.map +1 -1
- package/dist/config/parsers/features.js.map +1 -1
- package/dist/config/parsers/index.js.map +1 -1
- package/dist/config/parsers/maintenance.js.map +1 -1
- package/dist/config/parsers/retrieval.js.map +1 -1
- package/dist/config/parsers/sensors.js.map +1 -1
- package/dist/config/skill-sections.js.map +1 -1
- package/dist/config/skill-size-limits.js.map +1 -1
- package/dist/config/types/agents.js.map +1 -1
- package/dist/config/types/bootstrap.js.map +1 -1
- package/dist/config/types/core.js.map +1 -1
- package/dist/config/types/index.js.map +1 -1
- package/dist/config/utils.js.map +1 -1
- package/dist/index-help.js.map +1 -1
- package/dist/index-testing-exports.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/lifecycle/hook-resolution-api.js.map +1 -1
- package/dist/lifecycle/hooks.js +0 -1
- package/dist/lifecycle/hooks.js.map +1 -1
- package/dist/lifecycle/resolve-agent-id.js.map +1 -1
- package/dist/lifecycle/session-state.js.map +1 -1
- package/dist/lifecycle/stage-active-task.js.map +1 -1
- package/dist/lifecycle/stage-auth-failure.js.map +1 -1
- package/dist/lifecycle/stage-capture/run-capture.js.map +1 -1
- package/dist/lifecycle/stage-capture.js.map +1 -1
- package/dist/lifecycle/stage-cleanup.js.map +1 -1
- package/dist/lifecycle/stage-credential-hint.js.map +1 -1
- package/dist/lifecycle/stage-frustration.js.map +1 -1
- package/dist/lifecycle/stage-goal-stewardship.js.map +1 -1
- package/dist/lifecycle/stage-goal-subagent.js.map +1 -1
- package/dist/lifecycle/stage-injection.js +1 -1
- package/dist/lifecycle/stage-injection.js.map +1 -1
- package/dist/lifecycle/stage-recall/run-recall.js.map +1 -1
- package/dist/lifecycle/stage-recall.js.map +1 -1
- package/dist/lifecycle/stage-setup.js.map +1 -1
- package/dist/routes/dashboard/collectors.js.map +1 -1
- package/dist/routes/dashboard/html.js.map +1 -1
- package/dist/routes/dashboard/server.js.map +1 -1
- package/dist/routes/dashboard-graph.js.map +1 -1
- package/dist/routes/graphql-resolvers.js.map +1 -1
- package/dist/routes/graphql-server.js.map +1 -1
- package/dist/services/active-task-checkpoint.js.map +1 -1
- package/dist/services/active-task-injection.js.map +1 -1
- package/dist/services/active-task.js.map +1 -1
- package/dist/services/adaptive-catch-up-pacing.js +25 -0
- package/dist/services/adaptive-catch-up-pacing.js.map +1 -0
- package/dist/services/adaptive-maintenance-llm.js.map +1 -1
- package/dist/services/adaptive-model-limits.js.map +1 -1
- package/dist/services/ambient-retrieval.js.map +1 -1
- package/dist/services/apitap-service.js.map +1 -1
- package/dist/services/audit-health-exit-info.js.map +1 -1
- package/dist/services/audit-health-json.js.map +1 -1
- package/dist/services/auth-failure-detect.js.map +1 -1
- package/dist/services/auto-capture.js.map +1 -1
- package/dist/services/auto-classifier.js.map +1 -1
- package/dist/services/auto-skills-audit.js.map +1 -1
- package/dist/services/bootstrap-optional.js.map +1 -1
- package/dist/services/bootstrap-priority.js.map +1 -1
- package/dist/services/bootstrap.js.map +1 -1
- package/dist/services/capture-provenance.js.map +1 -1
- package/dist/services/capture-utils.js.map +1 -1
- package/dist/services/chat.js +22 -3
- package/dist/services/chat.js.map +1 -1
- package/dist/services/classification-scope.js.map +1 -1
- package/dist/services/classification.js.map +1 -1
- package/dist/services/cli-sql-dump.js.map +1 -1
- package/dist/services/consolidation.js.map +1 -1
- package/dist/services/context-audit.js +1 -1
- package/dist/services/context-audit.js.map +1 -1
- package/dist/services/context-budget.js.map +1 -1
- package/dist/services/context-engine.js.map +1 -1
- package/dist/services/contextual-variants.js.map +1 -1
- package/dist/services/continuous-verifier.js.map +1 -1
- package/dist/services/contradiction-adjudicator.js.map +1 -1
- package/dist/services/cost-context.js.map +1 -1
- package/dist/services/cost-feature-labels.js.map +1 -1
- package/dist/services/credential-migration.js.map +1 -1
- package/dist/services/credential-scanner.js.map +1 -1
- package/dist/services/credential-validation.js.map +1 -1
- package/dist/services/cron-exit-validator.js.map +1 -1
- package/dist/services/cron-guard.js.map +1 -1
- package/dist/services/cron-job-bash-harness.js +52 -5
- package/dist/services/cron-job-bash-harness.js.map +1 -1
- package/dist/services/cron-maintenance-reconciler.js +1 -3
- package/dist/services/cron-maintenance-reconciler.js.map +1 -1
- package/dist/services/cross-agent-learning.js.map +1 -1
- package/dist/services/crystallization-proposer.js.map +1 -1
- package/dist/services/dedupe-policy.js.map +1 -1
- package/dist/services/deprecated-cron-commands.js.map +1 -1
- package/dist/services/directive-extract.js.map +1 -1
- package/dist/services/document-chunker.js.map +1 -1
- package/dist/services/document-grader.js.map +1 -1
- package/dist/services/dream-cycle.js.map +1 -1
- package/dist/services/embedding-migration.js.map +1 -1
- package/dist/services/embedding-registry.js.map +1 -1
- package/dist/services/embeddings/chain-provider.js.map +1 -1
- package/dist/services/embeddings/factory.js.map +1 -1
- package/dist/services/embeddings/fallback-provider.js.map +1 -1
- package/dist/services/embeddings/ollama-provider.js.map +1 -1
- package/dist/services/embeddings/onnx-provider.js.map +1 -1
- package/dist/services/embeddings/openai-provider.js.map +1 -1
- package/dist/services/embeddings/shared.js +3 -3
- package/dist/services/embeddings/shared.js.map +1 -1
- package/dist/services/embeddings/types.js.map +1 -1
- package/dist/services/entity-enrichment-adaptive.js +128 -0
- package/dist/services/entity-enrichment-adaptive.js.map +1 -0
- package/dist/services/entity-enrichment-cli.js +389 -42
- package/dist/services/entity-enrichment-cli.js.map +1 -1
- package/dist/services/entity-enrichment.js +31 -5
- package/dist/services/entity-enrichment.js.map +1 -1
- package/dist/services/error-reporter/noisy-errors.js.map +1 -1
- package/dist/services/error-reporter/sanitize.js.map +1 -1
- package/dist/services/error-reporter.js.map +1 -1
- package/dist/services/event-hub-repair.js.map +1 -1
- package/dist/services/export-memory.js.map +1 -1
- package/dist/services/fact-extraction.js.map +1 -1
- package/dist/services/feedback-effectiveness.js.map +1 -1
- package/dist/services/find-duplicates.js.map +1 -1
- package/dist/services/frustration-detector.js.map +1 -1
- package/dist/services/fts-search.js.map +1 -1
- package/dist/services/gap-detector.js.map +1 -1
- package/dist/services/generated-skill-lifecycle.js.map +1 -1
- package/dist/services/generated-skill-validation.js.map +1 -1
- package/dist/services/goal-active-task-mirror.js.map +1 -1
- package/dist/services/goal-circuit-breaker.js.map +1 -1
- package/dist/services/goal-health.js.map +1 -1
- package/dist/services/goal-registry.js.map +1 -1
- package/dist/services/goal-stewardship-heartbeat.js.map +1 -1
- package/dist/services/goal-stewardship-llm-triage.js.map +1 -1
- package/dist/services/goal-stewardship-verify-cron.js.map +1 -1
- package/dist/services/goal-stewardship.js.map +1 -1
- package/dist/services/goal-subagent.js.map +1 -1
- package/dist/services/graph-retrieval.js.map +1 -1
- package/dist/services/humanizer-score.js.map +1 -1
- package/dist/services/hybrid-mem-cron-default-job-steps.js.map +1 -1
- package/dist/services/hyde-helper.js.map +1 -1
- package/dist/services/identity-reflection.js.map +1 -1
- package/dist/services/implicit-feedback-extract.js.map +1 -1
- package/dist/services/index.js.map +1 -1
- package/dist/services/ingest-utils.js.map +1 -1
- package/dist/services/intent-template.js.map +1 -1
- package/dist/services/json-array-parser.js.map +1 -1
- package/dist/services/knowledge-gaps.js.map +1 -1
- package/dist/services/language-keywords-build.js.map +1 -1
- package/dist/services/lifecycle/github-adapter.js.map +1 -1
- package/dist/services/llm-rate-limit-headers.js +1 -2
- package/dist/services/llm-rate-limit-headers.js.map +1 -1
- package/dist/services/maintenance-auto-fix.js.map +1 -1
- package/dist/services/maintenance-log-analyzer.js +7 -1
- package/dist/services/maintenance-log-analyzer.js.map +1 -1
- package/dist/services/maintenance-timestamp.js.map +1 -1
- package/dist/services/memory-diagnostics.js.map +1 -1
- package/dist/services/memory-index.js.map +1 -1
- package/dist/services/merge-results.js.map +1 -1
- package/dist/services/model-capabilities.js.map +1 -1
- package/dist/services/model-pricing.js.map +1 -1
- package/dist/services/narrative-recall.js.map +1 -1
- package/dist/services/openclaw-session-artifact.js.map +1 -1
- package/dist/services/passive-observer.js.map +1 -1
- package/dist/services/pattern-detector-hash.js.map +1 -1
- package/dist/services/pattern-detector.js.map +1 -1
- package/dist/services/pending-autopilot/foundation.js.map +1 -1
- package/dist/services/pending-autopilot/redaction.js.map +1 -1
- package/dist/services/pending-autopilot/store.js.map +1 -1
- package/dist/services/pending-autopilot/types.js.map +1 -1
- package/dist/services/pending-digest-autopilot-cron.js.map +1 -1
- package/dist/services/pending-digest-autopilot.js.map +1 -1
- package/dist/services/pending-review-digest.js.map +1 -1
- package/dist/services/persona-proposal-triage.js.map +1 -1
- package/dist/services/persona-state-promotion.js.map +1 -1
- package/dist/services/post-compaction-recall.js.map +1 -1
- package/dist/services/pre-consolidation-flush.js.map +1 -1
- package/dist/services/pre-finalization-guard.js.map +1 -1
- package/dist/services/procedure-cluster.js.map +1 -1
- package/dist/services/procedure-extractor.js.map +1 -1
- package/dist/services/procedure-promotion/duplicate-skill-cache.js.map +1 -1
- package/dist/services/procedure-promotion-policy.js.map +1 -1
- package/dist/services/procedure-selection-metrics.js.map +1 -1
- package/dist/services/procedure-skill-eval.js.map +1 -1
- package/dist/services/procedure-skill-generator.js.map +1 -1
- package/dist/services/procedure-skill-recipe.js.map +1 -1
- package/dist/services/procedure-skill-shrink.js.map +1 -1
- package/dist/services/procedure-skill-workflow.js.map +1 -1
- package/dist/services/provenance.js.map +1 -1
- package/dist/services/public-export-bundle.js.map +1 -1
- package/dist/services/python-bridge.js.map +1 -1
- package/dist/services/query-expander.js.map +1 -1
- package/dist/services/query-validator.js.map +1 -1
- package/dist/services/recall-pipeline.js.map +1 -1
- package/dist/services/recall-timing.js.map +1 -1
- package/dist/services/recent-http-attempts.js.map +1 -1
- package/dist/services/reflection/shared.js.map +1 -1
- package/dist/services/reflection.js.map +1 -1
- package/dist/services/reinforcement-extract.js.map +1 -1
- package/dist/services/reranker.js.map +1 -1
- package/dist/services/responses-adapter.js.map +1 -1
- package/dist/services/retrieval-aliases.js.map +1 -1
- package/dist/services/retrieval-mode-policy.js.map +1 -1
- package/dist/services/retrieval-orchestrator/packing.js.map +1 -1
- package/dist/services/retrieval-orchestrator.d.ts +2 -3
- package/dist/services/retrieval-orchestrator.js.map +1 -1
- package/dist/services/rrf-fusion.js.map +1 -1
- package/dist/services/self-correction-extract.js.map +1 -1
- package/dist/services/session-observability.js.map +1 -1
- package/dist/services/session-pre-filter.js.map +1 -1
- package/dist/services/shortest-path.js.map +1 -1
- package/dist/services/skill-allowed-tools.js.map +1 -1
- package/dist/services/skill-creator-validator.js.map +1 -1
- package/dist/services/skill-crystallizer-helpers.js.map +1 -1
- package/dist/services/skill-crystallizer.js.map +1 -1
- package/dist/services/skill-description-builder.js.map +1 -1
- package/dist/services/skill-eval-synthesizer.js.map +1 -1
- package/dist/services/skill-examples-builder.js.map +1 -1
- package/dist/services/skill-frontmatter.js.map +1 -1
- package/dist/services/skill-name-validator.js.map +1 -1
- package/dist/services/skill-prompt-injection.js.map +1 -1
- package/dist/services/skill-reference-sidecar.js.map +1 -1
- package/dist/services/skill-script-bundler.js.map +1 -1
- package/dist/services/skill-validator.js.map +1 -1
- package/dist/services/startup-memory-attribution.js.map +1 -1
- package/dist/services/task-hygiene.js.map +1 -1
- package/dist/services/task-ledger/canonical.js.map +1 -1
- package/dist/services/task-ledger-facts.js.map +1 -1
- package/dist/services/task-queue-leases.js.map +1 -1
- package/dist/services/task-queue-watchdog.js.map +1 -1
- package/dist/services/tool-effectiveness.js.map +1 -1
- package/dist/services/tool-proposer.js.map +1 -1
- package/dist/services/tools-md-section.js.map +1 -1
- package/dist/services/topic-clusters.js.map +1 -1
- package/dist/services/trajectory-tracker.js.map +1 -1
- package/dist/services/vector-backend-observability.js.map +1 -1
- package/dist/services/vector-lifecycle-audit.js.map +1 -1
- package/dist/services/vector-maintenance.js.map +1 -1
- package/dist/services/vector-search.js.map +1 -1
- package/dist/services/verification-store.js.map +1 -1
- package/dist/services/verified-fact-triage.js.map +1 -1
- package/dist/services/wal-helpers.js.map +1 -1
- package/dist/services/workflow-tracker.js.map +1 -1
- package/dist/setup/bootstrap-databases.js.map +1 -1
- package/dist/setup/cli-context/cli-services.js.map +1 -1
- package/dist/setup/cli-context/help-text.js.map +1 -1
- package/dist/setup/cli-context/metadata.js.map +1 -1
- package/dist/setup/cli-context/register-cli-with-help.js.map +1 -1
- package/dist/setup/cli-context/register-full.js.map +1 -1
- package/dist/setup/cli-context/register-help.js.map +1 -1
- package/dist/setup/cost-instrumentation.js.map +1 -1
- package/dist/setup/hybrid-memory-generation-state.js.map +1 -1
- package/dist/setup/hybrid-memory-reload-coordinator.js +13 -13
- package/dist/setup/hybrid-memory-reload-coordinator.js.map +1 -1
- package/dist/setup/plugin-service.js.map +1 -1
- package/dist/setup/provider-router.js.map +1 -1
- package/dist/setup/register-context-engine.js.map +1 -1
- package/dist/setup/register-hooks.js.map +1 -1
- package/dist/setup/register-plugin.js +25 -21
- package/dist/setup/register-plugin.js.map +1 -1
- package/dist/setup/register-tools.js.map +1 -1
- package/dist/setup/reregister-policy.js +2 -2
- package/dist/setup/reregister-policy.js.map +1 -1
- package/dist/setup/tool-installers.js.map +1 -1
- package/dist/setup/workspace-bootstrap.js.map +1 -1
- package/dist/src/worker/narratives.js.map +1 -1
- package/dist/tools/apitap-tools.js.map +1 -1
- package/dist/tools/credential-tools.js.map +1 -1
- package/dist/tools/crystallization-tools.js.map +1 -1
- package/dist/tools/dashboard-routes.js.map +1 -1
- package/dist/tools/document-tools.js.map +1 -1
- package/dist/tools/goal-tools.js.map +1 -1
- package/dist/tools/graph-tools.js.map +1 -1
- package/dist/tools/issue-tools.js.map +1 -1
- package/dist/tools/memory/build-runtime.js.map +1 -1
- package/dist/tools/memory/helpers.js.map +1 -1
- package/dist/tools/memory/register-checkpoint-tools.js.map +1 -1
- package/dist/tools/memory/register-directory-tools.js.map +1 -1
- package/dist/tools/memory/register-edict-tools.js.map +1 -1
- package/dist/tools/memory/register-episode-tools.js.map +1 -1
- package/dist/tools/memory/register-recall-tools.js.map +1 -1
- package/dist/tools/memory/register-store-tools.js.map +1 -1
- package/dist/tools/memory-tools.js.map +1 -1
- package/dist/tools/persona-tools.js.map +1 -1
- package/dist/tools/provenance-tools.js.map +1 -1
- package/dist/tools/public-api-routes.js.map +1 -1
- package/dist/tools/safe-register-http-route.js.map +1 -1
- package/dist/tools/self-extension-tools.js.map +1 -1
- package/dist/tools/task-hygiene-tools.js.map +1 -1
- package/dist/tools/utility-tools.js.map +1 -1
- package/dist/tools/verification-tools.js.map +1 -1
- package/dist/tools/workflow-tools.js.map +1 -1
- package/dist/types/issue-types.js.map +1 -1
- package/dist/types/learnings-types.js.map +1 -1
- package/dist/types/memory.js.map +1 -1
- package/dist/utils/apim-gateway-fetch.js.map +1 -1
- package/dist/utils/atomic-write.js.map +1 -1
- package/dist/utils/auth-failover.js.map +1 -1
- package/dist/utils/auth.js.map +1 -1
- package/dist/utils/compaction-model-watchdog.js.map +1 -1
- package/dist/utils/consolidation-controls.js.map +1 -1
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/date-detector.js.map +1 -1
- package/dist/utils/dates.js.map +1 -1
- package/dist/utils/decay.js.map +1 -1
- package/dist/utils/duration.js.map +1 -1
- package/dist/utils/embed-call.js.map +1 -1
- package/dist/utils/entity-lookup-resolve.js.map +1 -1
- package/dist/utils/entity-mention-quality.js.map +1 -1
- package/dist/utils/entity-stopwords.js.map +1 -1
- package/dist/utils/env-manager.js.map +1 -1
- package/dist/utils/error-tracking.js.map +1 -1
- package/dist/utils/event-loop-yield.js.map +1 -1
- package/dist/utils/extract-last-user-message.js.map +1 -1
- package/dist/utils/extraction-from-template.js.map +1 -1
- package/dist/utils/fact-embeddings.js.map +1 -1
- package/dist/utils/file-snapshot.js.map +1 -1
- package/dist/utils/format.js.map +1 -1
- package/dist/utils/fs.js.map +1 -1
- package/dist/utils/gh-repo-arg.js.map +1 -1
- package/dist/utils/hybrid-mem-json-cli.js.map +1 -1
- package/dist/utils/language-keywords.js.map +1 -1
- package/dist/utils/lifecycle-generation.js.map +1 -1
- package/dist/utils/llm-json-array.js.map +1 -1
- package/dist/utils/llm-selection.js.map +1 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/model-provider-family.js.map +1 -1
- package/dist/utils/model-tier.js.map +1 -1
- package/dist/utils/openclaw-agent-defaults.js.map +1 -1
- package/dist/utils/path.js.map +1 -1
- package/dist/utils/plugin-root.js.map +1 -1
- package/dist/utils/plugin-update-check.js.map +1 -1
- package/dist/utils/procedure-risk.js.map +1 -1
- package/dist/utils/progress-indicators.js.map +1 -1
- package/dist/utils/prompt-loader.js.map +1 -1
- package/dist/utils/provenance.js.map +1 -1
- package/dist/utils/provider-detection.js.map +1 -1
- package/dist/utils/registration-superseded.js.map +1 -1
- package/dist/utils/salience.js.map +1 -1
- package/dist/utils/sanitize-messages.js.map +1 -1
- package/dist/utils/scope-filter.js.map +1 -1
- package/dist/utils/skill-discovery.js.map +1 -1
- package/dist/utils/sqlite-file-perms.js.map +1 -1
- package/dist/utils/sqlite-outcome-compat.js.map +1 -1
- package/dist/utils/sqlite-transaction.js.map +1 -1
- package/dist/utils/stable-stringify.js.map +1 -1
- package/dist/utils/subagent-ended-utils.js.map +1 -1
- package/dist/utils/tags.js.map +1 -1
- package/dist/utils/text.js.map +1 -1
- package/dist/utils/timeout.js.map +1 -1
- package/dist/utils/typebox.js.map +1 -1
- package/dist/utils/version-check.js.map +1 -1
- package/dist/utils/wal-replay.js.map +1 -1
- package/dist/versionInfo.js.map +1 -1
- package/index.ts +2 -2
- package/lifecycle/hooks.ts +0 -1
- package/npm-shrinkwrap.json +487 -186
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
- package/services/adaptive-catch-up-pacing.ts +28 -0
- package/services/chat.ts +34 -1
- package/services/cron-job-bash-harness.ts +52 -5
- package/services/embeddings/shared.ts +5 -2
- package/services/entity-enrichment-adaptive.ts +245 -0
- package/services/entity-enrichment-cli.ts +553 -47
- package/services/entity-enrichment.ts +43 -2
- package/services/llm-rate-limit-headers.ts +1 -4
- package/services/maintenance-log-analyzer.ts +13 -9
- package/services/reinforcement-extract.ts +19 -0
- package/setup/hybrid-memory-reload-coordinator.ts +26 -0
- package/setup/register-plugin.ts +62 -32
- package/setup/reregister-policy.ts +10 -5
|
@@ -4,25 +4,34 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { existsSync, unlinkSync } from "node:fs";
|
|
7
|
+
import { isPreStoreGuardBlocked } from "../../../backends/facts-db/crud.js";
|
|
8
|
+
import { computeAdaptivePressureDelayMs } from "../../../services/adaptive-catch-up-pacing.js";
|
|
9
|
+
import {
|
|
10
|
+
is403QuotaOrRateLimitLike,
|
|
11
|
+
is429OrWrapped,
|
|
12
|
+
is500OrWrapped,
|
|
13
|
+
isConnectionErrorLike,
|
|
14
|
+
parseRetryAfterMs,
|
|
15
|
+
} from "../../../services/chat.js";
|
|
7
16
|
import { migrateEmbeddings } from "../../../services/embedding-migration.js";
|
|
8
|
-
import { capturePluginError } from "../../../services/error-reporter.js";
|
|
9
17
|
import { AllEmbeddingProvidersFailed } from "../../../services/embeddings.js";
|
|
18
|
+
import { buildVectorlessSloRepairRecommendation } from "../../../services/entity-enrichment-adaptive.js";
|
|
19
|
+
import { capturePluginError } from "../../../services/error-reporter.js";
|
|
10
20
|
import { recordMaintenanceTimestamp } from "../../../services/maintenance-timestamp.js";
|
|
11
21
|
import { countPendingReviewBacklogs } from "../../../services/pending-review-digest.js";
|
|
12
|
-
import { deleteVectorsForFactIds } from "../../../services/vector-maintenance.js";
|
|
13
22
|
import {
|
|
14
|
-
type VectorBackendObservability,
|
|
15
23
|
collectVectorBackendObservability,
|
|
24
|
+
type VectorBackendObservability,
|
|
16
25
|
} from "../../../services/vector-backend-observability.js";
|
|
17
26
|
import { appendVectorLifecycleAuditEvent } from "../../../services/vector-lifecycle-audit.js";
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
27
|
+
import { deleteVectorsForFactIds } from "../../../services/vector-maintenance.js";
|
|
28
|
+
import type { MemoryEntry } from "../../../types/memory.js";
|
|
20
29
|
import { embedCallWithTimeoutAndRetry } from "../../../utils/embed-call.js";
|
|
30
|
+
import { getEnv } from "../../../utils/env-manager.js";
|
|
21
31
|
import { type CommanderOptsParent, readHybridMemVerbose } from "../../global-verbose.js";
|
|
22
|
-
import { type Chainable,
|
|
32
|
+
import { approxIntervalMs, type Chainable, withExit } from "../../shared.js";
|
|
23
33
|
import type { ManageBindings } from "./bindings.js";
|
|
24
|
-
import
|
|
25
|
-
import { isPreStoreGuardBlocked } from "../../../backends/facts-db/crud.js";
|
|
34
|
+
import { runMaintenanceHeartbeat } from "./maintenance-heartbeat.js";
|
|
26
35
|
import {
|
|
27
36
|
countImplicitFeedbackTrajectorySignals,
|
|
28
37
|
defaultReindexCheckpointPath,
|
|
@@ -32,7 +41,6 @@ import {
|
|
|
32
41
|
recordStorageGrowthSample,
|
|
33
42
|
writeReindexCheckpoint,
|
|
34
43
|
} from "./storage-stats-helpers.js";
|
|
35
|
-
import { runMaintenanceHeartbeat } from "./maintenance-heartbeat.js";
|
|
36
44
|
|
|
37
45
|
type FactsDbWithBatch = {
|
|
38
46
|
getBatch: (
|
|
@@ -104,6 +112,53 @@ function isEmbeddingProviderServerError(err: unknown): boolean {
|
|
|
104
112
|
return false;
|
|
105
113
|
}
|
|
106
114
|
|
|
115
|
+
function isEmbeddingProviderRateLimitError(err: unknown): boolean {
|
|
116
|
+
if (!(err instanceof Error)) return false;
|
|
117
|
+
if (is429OrWrapped(err) || is403QuotaOrRateLimitLike(err)) return true;
|
|
118
|
+
if (err instanceof AllEmbeddingProvidersFailed) {
|
|
119
|
+
return err.causes.some(
|
|
120
|
+
(cause) => cause instanceof Error && (is429OrWrapped(cause) || is403QuotaOrRateLimitLike(cause)),
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function isEmbeddingProviderTransientError(err: unknown): boolean {
|
|
127
|
+
if (!(err instanceof Error)) return false;
|
|
128
|
+
if (isEmbeddingProviderRateLimitError(err) || is500OrWrapped(err) || isConnectionErrorLike(err)) return true;
|
|
129
|
+
if (err instanceof AllEmbeddingProvidersFailed) {
|
|
130
|
+
return err.causes.some(
|
|
131
|
+
(cause) =>
|
|
132
|
+
cause instanceof Error &&
|
|
133
|
+
(is429OrWrapped(cause) ||
|
|
134
|
+
is403QuotaOrRateLimitLike(cause) ||
|
|
135
|
+
is500OrWrapped(cause) ||
|
|
136
|
+
isConnectionErrorLike(cause)),
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function parseEmbeddingRetryAfterMs(err: unknown): number | undefined {
|
|
143
|
+
if (err instanceof Error) {
|
|
144
|
+
const fromTop = parseRetryAfterMs(err);
|
|
145
|
+
if (fromTop !== undefined) return fromTop;
|
|
146
|
+
}
|
|
147
|
+
if (err instanceof AllEmbeddingProvidersFailed) {
|
|
148
|
+
for (const cause of err.causes) {
|
|
149
|
+
if (!(cause instanceof Error)) continue;
|
|
150
|
+
const retryAfterMs = parseRetryAfterMs(cause);
|
|
151
|
+
if (retryAfterMs !== undefined) return retryAfterMs;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return undefined;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function sleep(ms: number): Promise<void> {
|
|
158
|
+
if (ms <= 0) return Promise.resolve();
|
|
159
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
160
|
+
}
|
|
161
|
+
|
|
107
162
|
export function registerManageStorageMaintenance(mem: Chainable, b: ManageBindings): void {
|
|
108
163
|
const {
|
|
109
164
|
factsDb,
|
|
@@ -653,6 +708,11 @@ export function registerManageStorageMaintenance(mem: Chainable, b: ManageBindin
|
|
|
653
708
|
.option("--source <s>", "Only process facts from this source")
|
|
654
709
|
.option("--apply", "Actually embed and write LanceDB/fact_embeddings rows; default is dry-run")
|
|
655
710
|
.option("--batch-size <n>", "Embedding batch size", "40")
|
|
711
|
+
.option("--batch-delay-ms <n>", "Delay between adaptive batches in ms (default 150)", "150")
|
|
712
|
+
.option(
|
|
713
|
+
"--adaptive-catch-up",
|
|
714
|
+
"Enable adaptive pacing (ramps up on healthy batches; backs off on provider/rate-limit/store pressure)",
|
|
715
|
+
)
|
|
656
716
|
.option(
|
|
657
717
|
"--max-embed-failures <n>",
|
|
658
718
|
"Circuit-break after this many consecutive embed failures and exit 1; prevents indefinite stall on provider outage (default: 5)",
|
|
@@ -668,6 +728,8 @@ export function registerManageStorageMaintenance(mem: Chainable, b: ManageBindin
|
|
|
668
728
|
source?: string;
|
|
669
729
|
apply?: boolean;
|
|
670
730
|
batchSize?: string;
|
|
731
|
+
batchDelayMs?: string;
|
|
732
|
+
adaptiveCatchUp?: boolean;
|
|
671
733
|
maxEmbedFailures?: string;
|
|
672
734
|
verbose?: boolean;
|
|
673
735
|
json?: boolean;
|
|
@@ -676,8 +738,18 @@ export function registerManageStorageMaintenance(mem: Chainable, b: ManageBindin
|
|
|
676
738
|
) => {
|
|
677
739
|
const limit = Number.parseInt(opts?.limit ?? "100", 10);
|
|
678
740
|
const batchSize = Number.parseInt(opts?.batchSize ?? "40", 10);
|
|
741
|
+
const batchDelayMs = Number.parseInt(opts?.batchDelayMs ?? "150", 10);
|
|
742
|
+
const adaptiveCatchUp = opts?.adaptiveCatchUp === true;
|
|
679
743
|
const maxEmbedFailures = Number.parseInt(opts?.maxEmbedFailures ?? "5", 10);
|
|
680
744
|
const verbose = !!opts?.verbose || readHybridMemVerbose(cmd);
|
|
745
|
+
const adaptiveMinBatchSize = 1;
|
|
746
|
+
const adaptiveMaxBatchSize = 200;
|
|
747
|
+
const adaptiveMinDelayMs = 0;
|
|
748
|
+
const adaptiveMaxDelayMs = 5_000;
|
|
749
|
+
const adaptiveBackoffMinDelayMs = 50;
|
|
750
|
+
const adaptiveBatchSizeStep = 5;
|
|
751
|
+
const adaptiveDelayStepMs = 25;
|
|
752
|
+
const adaptiveSuccessStreakForRampUp = 2;
|
|
681
753
|
if (!Number.isFinite(limit) || limit < 1) {
|
|
682
754
|
console.error("error: --limit must be a positive integer");
|
|
683
755
|
process.exitCode = 1;
|
|
@@ -688,19 +760,48 @@ export function registerManageStorageMaintenance(mem: Chainable, b: ManageBindin
|
|
|
688
760
|
process.exitCode = 1;
|
|
689
761
|
return;
|
|
690
762
|
}
|
|
763
|
+
if (!Number.isFinite(batchDelayMs) || batchDelayMs < 0) {
|
|
764
|
+
console.error("error: --batch-delay-ms must be a non-negative integer");
|
|
765
|
+
process.exitCode = 1;
|
|
766
|
+
return;
|
|
767
|
+
}
|
|
691
768
|
if (!Number.isFinite(maxEmbedFailures) || maxEmbedFailures < 1) {
|
|
692
769
|
console.error("error: --max-embed-failures must be a positive integer");
|
|
693
770
|
process.exitCode = 1;
|
|
694
771
|
return;
|
|
695
772
|
}
|
|
696
773
|
const before = factsDb.countVectorlessActiveFacts(opts?.source);
|
|
774
|
+
const globalVectorlessBefore = factsDb.countVectorlessActiveFacts();
|
|
697
775
|
const candidates = factsDb.listVectorlessActiveFacts({ limit, source: opts?.source });
|
|
698
776
|
const errors: string[] = [];
|
|
699
777
|
let embedded = 0;
|
|
700
778
|
let skipped = 0;
|
|
701
779
|
let storeFailures = 0;
|
|
702
780
|
let embedFailures = 0;
|
|
703
|
-
const
|
|
781
|
+
const startedAtMs = Date.now();
|
|
782
|
+
const baselineBatchSize = batchSize;
|
|
783
|
+
const baselineDelayMs = batchDelayMs;
|
|
784
|
+
let effectiveBatchSize = batchSize;
|
|
785
|
+
let effectiveDelayMs = batchDelayMs;
|
|
786
|
+
if (adaptiveCatchUp) {
|
|
787
|
+
effectiveBatchSize = Math.max(adaptiveMinBatchSize, Math.min(adaptiveMaxBatchSize, batchSize));
|
|
788
|
+
effectiveDelayMs = Math.max(adaptiveMinDelayMs, Math.min(adaptiveMaxDelayMs, batchDelayMs));
|
|
789
|
+
}
|
|
790
|
+
const adaptiveAdjustments: Array<{
|
|
791
|
+
reason: "pressure" | "ramp-up";
|
|
792
|
+
previousBatchSize: number;
|
|
793
|
+
previousDelayMs: number;
|
|
794
|
+
batchSize: number;
|
|
795
|
+
delayMs: number;
|
|
796
|
+
batchPressureSignals: number;
|
|
797
|
+
batchRateLimited: number;
|
|
798
|
+
batchTransientFailures: number;
|
|
799
|
+
batchStoreFailures: number;
|
|
800
|
+
batchEmbedFailures: number;
|
|
801
|
+
retryAfterMs?: number;
|
|
802
|
+
batchNumber: number;
|
|
803
|
+
}> = [];
|
|
804
|
+
let successStreak = 0;
|
|
704
805
|
let processed = 0;
|
|
705
806
|
let batchNumber = 0;
|
|
706
807
|
let providerCircuitBreak = false;
|
|
@@ -713,11 +814,18 @@ export function registerManageStorageMaintenance(mem: Chainable, b: ManageBindin
|
|
|
713
814
|
verbose,
|
|
714
815
|
async () => {
|
|
715
816
|
await vectorDb.runWithAutoOptimizePaused(async () => {
|
|
716
|
-
|
|
817
|
+
let offset = 0;
|
|
818
|
+
while (offset < candidates.length) {
|
|
717
819
|
if (providerCircuitBreak) break;
|
|
718
|
-
batchNumber
|
|
719
|
-
const batch = candidates.slice(offset, offset +
|
|
820
|
+
batchNumber++;
|
|
821
|
+
const batch = candidates.slice(offset, offset + effectiveBatchSize);
|
|
720
822
|
let vectors: (number[] | null)[];
|
|
823
|
+
let batchPressureSignals = 0;
|
|
824
|
+
let batchRateLimited = 0;
|
|
825
|
+
let batchTransientFailures = 0;
|
|
826
|
+
let batchStoreFailures = 0;
|
|
827
|
+
let batchEmbedFailures = 0;
|
|
828
|
+
let batchRetryAfterMs: number | undefined;
|
|
721
829
|
try {
|
|
722
830
|
vectors = await embedCallWithTimeoutAndRetry(
|
|
723
831
|
() => embeddings.embedBatch(batch.map((fact) => fact.text)),
|
|
@@ -725,6 +833,14 @@ export function registerManageStorageMaintenance(mem: Chainable, b: ManageBindin
|
|
|
725
833
|
);
|
|
726
834
|
consecutiveEmbedFailures = 0;
|
|
727
835
|
} catch (batchErr) {
|
|
836
|
+
const batchRateLimitedErr = isEmbeddingProviderRateLimitError(batchErr);
|
|
837
|
+
const batchTransientErr = isEmbeddingProviderTransientError(batchErr);
|
|
838
|
+
batchRetryAfterMs = parseEmbeddingRetryAfterMs(batchErr);
|
|
839
|
+
if (batchRateLimitedErr) batchRateLimited++;
|
|
840
|
+
if (batchTransientErr) batchTransientFailures++;
|
|
841
|
+
if (batchRateLimitedErr || batchTransientErr || batchRetryAfterMs !== undefined) {
|
|
842
|
+
batchPressureSignals++;
|
|
843
|
+
}
|
|
728
844
|
if (isEmbeddingProviderServerError(batchErr)) {
|
|
729
845
|
providerCircuitBreak = true;
|
|
730
846
|
providerCircuitBreakCause = "provider_5xx";
|
|
@@ -747,7 +863,19 @@ export function registerManageStorageMaintenance(mem: Chainable, b: ManageBindin
|
|
|
747
863
|
} catch (singleErr) {
|
|
748
864
|
errors.push(`fact ${fact.id}: embed failed — ${String(singleErr)}`);
|
|
749
865
|
embedFailures++;
|
|
866
|
+
batchEmbedFailures++;
|
|
750
867
|
vectors.push(null);
|
|
868
|
+
const rateLimited = isEmbeddingProviderRateLimitError(singleErr);
|
|
869
|
+
const transient = isEmbeddingProviderTransientError(singleErr);
|
|
870
|
+
const retryAfterMs = parseEmbeddingRetryAfterMs(singleErr);
|
|
871
|
+
if (rateLimited) batchRateLimited++;
|
|
872
|
+
if (transient) batchTransientFailures++;
|
|
873
|
+
if (rateLimited || transient || retryAfterMs !== undefined) {
|
|
874
|
+
batchPressureSignals++;
|
|
875
|
+
}
|
|
876
|
+
if (retryAfterMs !== undefined) {
|
|
877
|
+
batchRetryAfterMs = Math.max(batchRetryAfterMs ?? 0, retryAfterMs);
|
|
878
|
+
}
|
|
751
879
|
if (isEmbeddingProviderServerError(singleErr)) {
|
|
752
880
|
providerCircuitBreak = true;
|
|
753
881
|
providerCircuitBreakCause = "provider_5xx";
|
|
@@ -798,26 +926,74 @@ export function registerManageStorageMaintenance(mem: Chainable, b: ManageBindin
|
|
|
798
926
|
} catch (err) {
|
|
799
927
|
errors.push(`fact ${fact.id}: store failed — ${String(err)}`);
|
|
800
928
|
storeFailures++;
|
|
929
|
+
batchStoreFailures++;
|
|
801
930
|
skipped++;
|
|
802
931
|
} finally {
|
|
803
932
|
processed++;
|
|
804
933
|
}
|
|
805
934
|
}
|
|
935
|
+
if (adaptiveCatchUp) {
|
|
936
|
+
const hadPressure = batchPressureSignals > 0 || batchStoreFailures > 0 || batchEmbedFailures > 0;
|
|
937
|
+
const previousBatchSize = effectiveBatchSize;
|
|
938
|
+
const previousDelayMs = effectiveDelayMs;
|
|
939
|
+
if (hadPressure) {
|
|
940
|
+
successStreak = 0;
|
|
941
|
+
effectiveBatchSize = Math.max(adaptiveMinBatchSize, Math.floor(effectiveBatchSize / 2));
|
|
942
|
+
effectiveDelayMs = computeAdaptivePressureDelayMs({
|
|
943
|
+
currentDelayMs: effectiveDelayMs,
|
|
944
|
+
batchRetryAfterMs,
|
|
945
|
+
maxAdaptiveDelayMs: adaptiveMaxDelayMs,
|
|
946
|
+
backoffMinDelayMs: adaptiveBackoffMinDelayMs,
|
|
947
|
+
});
|
|
948
|
+
} else {
|
|
949
|
+
successStreak++;
|
|
950
|
+
if (successStreak >= adaptiveSuccessStreakForRampUp) {
|
|
951
|
+
successStreak = 0;
|
|
952
|
+
effectiveBatchSize = Math.min(
|
|
953
|
+
adaptiveMaxBatchSize,
|
|
954
|
+
effectiveBatchSize + adaptiveBatchSizeStep,
|
|
955
|
+
);
|
|
956
|
+
effectiveDelayMs = Math.max(adaptiveMinDelayMs, effectiveDelayMs - adaptiveDelayStepMs);
|
|
957
|
+
}
|
|
958
|
+
}
|
|
959
|
+
if (previousBatchSize !== effectiveBatchSize || previousDelayMs !== effectiveDelayMs) {
|
|
960
|
+
adaptiveAdjustments.push({
|
|
961
|
+
reason: hadPressure ? "pressure" : "ramp-up",
|
|
962
|
+
previousBatchSize,
|
|
963
|
+
previousDelayMs,
|
|
964
|
+
batchSize: effectiveBatchSize,
|
|
965
|
+
delayMs: effectiveDelayMs,
|
|
966
|
+
batchPressureSignals,
|
|
967
|
+
batchRateLimited,
|
|
968
|
+
batchTransientFailures,
|
|
969
|
+
batchStoreFailures,
|
|
970
|
+
batchEmbedFailures,
|
|
971
|
+
retryAfterMs: batchRetryAfterMs,
|
|
972
|
+
batchNumber,
|
|
973
|
+
});
|
|
974
|
+
}
|
|
975
|
+
}
|
|
976
|
+
offset += batch.length;
|
|
977
|
+
if (adaptiveCatchUp && offset < candidates.length && !providerCircuitBreak) {
|
|
978
|
+
await sleep(effectiveDelayMs);
|
|
979
|
+
}
|
|
806
980
|
}
|
|
807
981
|
});
|
|
808
982
|
},
|
|
809
983
|
{
|
|
810
984
|
progressSupplier: () =>
|
|
811
|
-
`stage=embed-and-store; processed=${processed}/${candidates.length}; embedded=${embedded}; skipped=${skipped}; embedFailures=${embedFailures}; storeFailures=${storeFailures}; batch=${batchNumber}
|
|
985
|
+
`stage=embed-and-store; processed=${processed}/${candidates.length}; remaining=${Math.max(0, candidates.length - processed)}; embedded=${embedded}; skipped=${skipped}; embedFailures=${embedFailures}; storeFailures=${storeFailures}; batch=${batchNumber}; batchSize=${effectiveBatchSize}; delayMs=${effectiveDelayMs}`,
|
|
812
986
|
jsonMode: opts?.json === true,
|
|
813
987
|
},
|
|
814
988
|
);
|
|
815
989
|
}
|
|
816
990
|
const after = opts?.apply ? factsDb.countVectorlessActiveFacts(opts?.source) : before;
|
|
991
|
+
const durationMs = Date.now() - startedAtMs;
|
|
817
992
|
const report: Record<string, unknown> = {
|
|
818
993
|
apply: opts?.apply === true,
|
|
819
994
|
source: opts?.source ?? null,
|
|
820
995
|
before,
|
|
996
|
+
candidates: candidates.length,
|
|
821
997
|
considered: candidates.length,
|
|
822
998
|
embedded,
|
|
823
999
|
skipped,
|
|
@@ -826,8 +1002,32 @@ export function registerManageStorageMaintenance(mem: Chainable, b: ManageBindin
|
|
|
826
1002
|
errors,
|
|
827
1003
|
after,
|
|
828
1004
|
processed,
|
|
1005
|
+
remaining: after,
|
|
1006
|
+
durationMs,
|
|
829
1007
|
aborted,
|
|
830
1008
|
};
|
|
1009
|
+
if (adaptiveCatchUp) {
|
|
1010
|
+
report.adaptive = {
|
|
1011
|
+
enabled: true,
|
|
1012
|
+
baselineBatchSize,
|
|
1013
|
+
baselineDelayMs,
|
|
1014
|
+
effectiveBatchSize,
|
|
1015
|
+
effectiveDelayMs,
|
|
1016
|
+
adjustments: adaptiveAdjustments,
|
|
1017
|
+
};
|
|
1018
|
+
}
|
|
1019
|
+
const globalVectorlessAfter = opts?.apply ? factsDb.countVectorlessActiveFacts() : globalVectorlessBefore;
|
|
1020
|
+
report.vectorSloRepair = buildVectorlessSloRepairRecommendation({
|
|
1021
|
+
activeFacts: factsDb.getCount(),
|
|
1022
|
+
vectorlessBefore: globalVectorlessBefore,
|
|
1023
|
+
vectorlessAfter: globalVectorlessAfter,
|
|
1024
|
+
embeddedThisRun: embedded,
|
|
1025
|
+
runLimit: limit,
|
|
1026
|
+
effectiveBatchSize: adaptiveCatchUp ? effectiveBatchSize : batchSize,
|
|
1027
|
+
scopedSource: opts?.source,
|
|
1028
|
+
scopedVectorlessBefore: opts?.source ? before : undefined,
|
|
1029
|
+
scopedVectorlessAfter: opts?.source ? after : undefined,
|
|
1030
|
+
});
|
|
831
1031
|
if (providerCircuitBreak) {
|
|
832
1032
|
report.failedReason =
|
|
833
1033
|
providerCircuitBreakCause === "provider_5xx"
|
|
@@ -842,7 +1042,16 @@ export function registerManageStorageMaintenance(mem: Chainable, b: ManageBindin
|
|
|
842
1042
|
return;
|
|
843
1043
|
}
|
|
844
1044
|
console.log(
|
|
845
|
-
`Reembed vectorless ${report.apply ? "applied" : "dry-run"}: before ${before}, candidates ${candidates.length}, embedded ${embedded}, skipped ${skipped}, storeFailures ${storeFailures}, after ${after}`,
|
|
1045
|
+
`Reembed vectorless ${report.apply ? "applied" : "dry-run"}: before ${before}, candidates ${candidates.length}, embedded ${embedded}, skipped ${skipped}, storeFailures ${storeFailures}, after ${after}, remaining ${after}, durationMs ${durationMs}`,
|
|
1046
|
+
);
|
|
1047
|
+
if (adaptiveCatchUp) {
|
|
1048
|
+
console.log(
|
|
1049
|
+
`Adaptive pacing: batchSize ${baselineBatchSize}->${effectiveBatchSize}, delayMs ${baselineDelayMs}->${effectiveDelayMs}, adjustments ${adaptiveAdjustments.length}`,
|
|
1050
|
+
);
|
|
1051
|
+
}
|
|
1052
|
+
const slo = report.vectorSloRepair as ReturnType<typeof buildVectorlessSloRepairRecommendation>;
|
|
1053
|
+
console.log(
|
|
1054
|
+
`Vectorless SLO repair: ratio ${(slo.vectorlessRatioAfter * 100).toFixed(2)}% (target ${(slo.targetVectorlessRatio * 100).toFixed(0)}%), clear ${slo.vectorlessToClearForSlo} more, ~${slo.estimatedRunsToReachSlo} run(s) at limit ${slo.recommendedLimitNextRun} batch ${slo.recommendedBatchSizeNextRun}`,
|
|
846
1055
|
);
|
|
847
1056
|
if (candidates.length > 0 && !opts?.apply) {
|
|
848
1057
|
console.log("Examples:");
|
|
@@ -81,6 +81,17 @@ export function parseBoundedFloatOption(raw: unknown, fallback: number, min: num
|
|
|
81
81
|
return Math.max(min, Math.min(max, value));
|
|
82
82
|
}
|
|
83
83
|
|
|
84
|
+
function formatRatioPercent(value: number): string {
|
|
85
|
+
return `${(value * 100).toFixed(2)}%`;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function formatVectorLifecycleSloBreach(breach: AuditHealthReport["vectorLifecycleSlo"]["breaches"][number]): string {
|
|
89
|
+
if (breach.key === "vectorless_ratio") {
|
|
90
|
+
return `${breach.key} actual=${breach.actual} (${formatRatioPercent(breach.actual)}) target=${breach.target} (${formatRatioPercent(breach.target)})`;
|
|
91
|
+
}
|
|
92
|
+
return `${breach.key} actual=${breach.actual} target=${breach.target}`;
|
|
93
|
+
}
|
|
94
|
+
|
|
84
95
|
type SyncBundleFile = {
|
|
85
96
|
path: string;
|
|
86
97
|
contentBase64: string;
|
|
@@ -786,7 +797,7 @@ export function buildAuditHealthReport(
|
|
|
786
797
|
);
|
|
787
798
|
if (vectorLifecycleSloBreaches.length > 0)
|
|
788
799
|
warnings.push(
|
|
789
|
-
`Vector lifecycle SLO breach(es): ${vectorLifecycleSloBreaches.map(
|
|
800
|
+
`Vector lifecycle SLO breach(es): ${vectorLifecycleSloBreaches.map(formatVectorLifecycleSloBreach).join("; ")}`,
|
|
790
801
|
);
|
|
791
802
|
if (procedureTriage.summary.total > 0) {
|
|
792
803
|
const reasonBreakdown = Object.entries(procedureTriage.summary.byReason)
|
|
@@ -941,7 +952,7 @@ export function printAuditHealthMarkdown(report: AuditHealthReport): void {
|
|
|
941
952
|
}
|
|
942
953
|
if (report.vectorLifecycleSlo.breaches.length > 0) {
|
|
943
954
|
console.log(
|
|
944
|
-
`Vector lifecycle SLO breaches: ${report.vectorLifecycleSlo.breaches.map(
|
|
955
|
+
`Vector lifecycle SLO breaches: ${report.vectorLifecycleSlo.breaches.map(formatVectorLifecycleSloBreach).join(", ")}`,
|
|
945
956
|
);
|
|
946
957
|
}
|
|
947
958
|
if (report.vectorlessBySource.length > 0) {
|
package/cli/context.ts
CHANGED
|
@@ -152,26 +152,16 @@ export type ManageContext = {
|
|
|
152
152
|
model?: string;
|
|
153
153
|
all?: boolean;
|
|
154
154
|
verbose?: boolean;
|
|
155
|
+
adaptiveCatchUp?: boolean;
|
|
156
|
+
batchSize?: number;
|
|
157
|
+
batchDelayMs?: number;
|
|
158
|
+
timeBudgetSec?: number;
|
|
159
|
+
targetDurationSec?: number;
|
|
160
|
+
maxConcurrency?: number;
|
|
161
|
+
providerPressureBudget?: number;
|
|
155
162
|
onProgress?: (progress: import("../services/entity-enrichment-cli.js").EntityEnrichmentProgress) => void;
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
pendingTotal?: number;
|
|
159
|
-
pendingByTier?: { hot: number; warm: number; structural: number; cold: number; unknown: number };
|
|
160
|
-
processed: number;
|
|
161
|
-
factsEnriched: number;
|
|
162
|
-
mode?: "bounded" | "all";
|
|
163
|
-
effectiveLimit?: number | "all";
|
|
164
|
-
remainingTotal?: number;
|
|
165
|
-
estimatedRunsRemaining?: number;
|
|
166
|
-
mentions: number;
|
|
167
|
-
accepted: number;
|
|
168
|
-
rejected: number;
|
|
169
|
-
duplicates: number;
|
|
170
|
-
rejectReasons: Record<string, number>;
|
|
171
|
-
skipped?: boolean;
|
|
172
|
-
pendingFactIds?: string[];
|
|
173
|
-
enrichedFacts?: import("../services/entity-enrichment-cli.js").EntityEnrichmentVerboseFact[];
|
|
174
|
-
}>;
|
|
163
|
+
onAdaptivePacing?: (state: import("../services/entity-enrichment-cli.js").EntityEnrichmentAdaptivePacing) => void;
|
|
164
|
+
}) => Promise<import("../services/entity-enrichment-cli.js").EntityEnrichmentCliResult>;
|
|
175
165
|
runResolveContradictions: () => Promise<{
|
|
176
166
|
autoResolved: Array<{ contradictionId: string; factIdNew: string; factIdOld: string }>;
|
|
177
167
|
ambiguous: Array<{ contradictionId: string; factIdNew: string; factIdOld: string }>;
|
package/cli/distill.ts
CHANGED
|
@@ -68,6 +68,15 @@ export type DistillContext = {
|
|
|
68
68
|
rejected?: number;
|
|
69
69
|
partial?: boolean;
|
|
70
70
|
dedupeDegraded?: boolean;
|
|
71
|
+
directiveDedupeMode?: "vector" | "lexical-only" | "mixed";
|
|
72
|
+
directiveRejected?: {
|
|
73
|
+
permanent: number;
|
|
74
|
+
retryable: number;
|
|
75
|
+
parserOrModelFailure: number;
|
|
76
|
+
boundedPartialRetry: number;
|
|
77
|
+
};
|
|
78
|
+
cursorAdvanced?: boolean;
|
|
79
|
+
cursorBlockedReason?: "retryable_rejections" | "parser_or_model_failure" | "bounded_partial_retry";
|
|
71
80
|
skipped?: boolean;
|
|
72
81
|
}>;
|
|
73
82
|
runExtractReinforcement: (opts: {
|
|
@@ -386,12 +395,26 @@ export function registerDistillCommands(mem: Chainable, ctx: DistillContext): vo
|
|
|
386
395
|
if ((result.rejected ?? 0) > 0) {
|
|
387
396
|
console.log(`Rejected ${result.rejected} non-durable/untrusted directive candidate(s).`);
|
|
388
397
|
}
|
|
398
|
+
if (result.directiveRejected) {
|
|
399
|
+
console.log(
|
|
400
|
+
`Status: directiveRejected=permanent:${result.directiveRejected.permanent},retryable:${result.directiveRejected.retryable},parserOrModelFailure:${result.directiveRejected.parserOrModelFailure},boundedPartialRetry:${result.directiveRejected.boundedPartialRetry}`,
|
|
401
|
+
);
|
|
402
|
+
}
|
|
389
403
|
if (result.partial) {
|
|
390
|
-
console.log("Status: partial (rejections detected; cursor not advanced).");
|
|
404
|
+
console.log("Status: partial (retryable rejections detected; cursor not advanced).");
|
|
391
405
|
}
|
|
392
406
|
if (result.dedupeDegraded) {
|
|
393
407
|
console.log("Status: degraded dedupe (lexical-only fallback used).");
|
|
394
408
|
}
|
|
409
|
+
if (result.directiveDedupeMode) {
|
|
410
|
+
console.log(`Status: directiveDedupeMode=${result.directiveDedupeMode}`);
|
|
411
|
+
}
|
|
412
|
+
if (typeof result.cursorAdvanced === "boolean") {
|
|
413
|
+
console.log(`Status: cursorAdvanced=${result.cursorAdvanced}`);
|
|
414
|
+
}
|
|
415
|
+
if (result.cursorBlockedReason) {
|
|
416
|
+
console.log(`Status: cursorBlockedReason=${result.cursorBlockedReason}`);
|
|
417
|
+
}
|
|
395
418
|
}
|
|
396
419
|
},
|
|
397
420
|
),
|
|
@@ -440,6 +463,13 @@ export function registerDistillCommands(mem: Chainable, ctx: DistillContext): vo
|
|
|
440
463
|
const status = result.annotationStatus;
|
|
441
464
|
if (status) {
|
|
442
465
|
console.log(`Annotation status: ${status}`);
|
|
466
|
+
if (result.annotationDiagnostic) {
|
|
467
|
+
const diagnostic = result.annotationDiagnostic;
|
|
468
|
+
console.log(`Annotation diagnostic: ${diagnostic.kind} — ${diagnostic.summary}`);
|
|
469
|
+
for (const action of diagnostic.recommendedActions) {
|
|
470
|
+
console.log(` next: ${action}`);
|
|
471
|
+
}
|
|
472
|
+
}
|
|
443
473
|
if (status === "failed_annotation" || status === "degraded_model_or_parser") {
|
|
444
474
|
process.exitCode = 1;
|
|
445
475
|
}
|
package/cli/register.ts
CHANGED
|
@@ -17,7 +17,7 @@ import { PLUGIN_ID } from "../utils/constants.js";
|
|
|
17
17
|
import { type ActiveTaskContext, registerActiveTaskCommands } from "./active-tasks.js";
|
|
18
18
|
import { registerBenchmarkCommands } from "./benchmark.js";
|
|
19
19
|
import { registerStatusCommands } from "./cmd-status.js";
|
|
20
|
-
import { type UserFriendlyContext
|
|
20
|
+
import { registerUserFriendlyCommands, type UserFriendlyContext } from "./cmd-user-friendly.js";
|
|
21
21
|
import { type DistillContext, registerDistillCommands } from "./distill.js";
|
|
22
22
|
import { registerGoalCommands } from "./goals.js";
|
|
23
23
|
import { type ManageContext, registerManageCommands } from "./manage.js";
|
|
@@ -52,37 +52,37 @@ import type {
|
|
|
52
52
|
VerifyCliSink,
|
|
53
53
|
} from "./types.js";
|
|
54
54
|
import { registerVerifiedCommands } from "./verified.js";
|
|
55
|
-
import { type VerifyContext
|
|
55
|
+
import { registerVerifyCommands, type VerifyContext } from "./verify.js";
|
|
56
56
|
|
|
57
57
|
export type {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
58
|
+
ActiveTaskContext,
|
|
59
|
+
AnalyzeFeedbackPhrasesResult,
|
|
60
|
+
BackfillCliResult,
|
|
61
|
+
BackfillCliSink,
|
|
62
|
+
ConfigCliResult,
|
|
63
|
+
CredentialsAuditResult,
|
|
64
|
+
CredentialsPruneResult,
|
|
65
|
+
DistillCliResult,
|
|
66
|
+
DistillCliSink,
|
|
63
67
|
DistillWindowResult,
|
|
64
|
-
RecordDistillResult,
|
|
65
68
|
ExtractDailyResult,
|
|
66
69
|
ExtractDailySink,
|
|
67
70
|
ExtractProceduresResult,
|
|
71
|
+
FindDuplicatesResult,
|
|
68
72
|
GenerateAutoSkillsResult,
|
|
69
|
-
BackfillCliResult,
|
|
70
|
-
BackfillCliSink,
|
|
71
73
|
IngestFilesResult,
|
|
72
74
|
IngestFilesSink,
|
|
73
|
-
|
|
74
|
-
|
|
75
|
+
InstallCliResult,
|
|
76
|
+
MigrateToVaultResult,
|
|
77
|
+
RecordDistillResult,
|
|
75
78
|
SelfCorrectionExtractResult,
|
|
76
79
|
SelfCorrectionRunResult,
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
CredentialsAuditResult,
|
|
80
|
-
CredentialsPruneResult,
|
|
81
|
-
UpgradeCliResult,
|
|
80
|
+
StoreCliOpts,
|
|
81
|
+
StoreCliResult,
|
|
82
82
|
UninstallCliResult,
|
|
83
|
-
|
|
83
|
+
UpgradeCliResult,
|
|
84
|
+
VerifyCliSink,
|
|
84
85
|
};
|
|
85
|
-
export type { ActiveTaskContext };
|
|
86
86
|
|
|
87
87
|
export type HybridMemCliContext = {
|
|
88
88
|
factsDb: FactsDB;
|
|
@@ -293,26 +293,16 @@ export type HybridMemCliContext = {
|
|
|
293
293
|
model?: string;
|
|
294
294
|
verbose?: boolean;
|
|
295
295
|
all?: boolean;
|
|
296
|
+
adaptiveCatchUp?: boolean;
|
|
297
|
+
batchSize?: number;
|
|
298
|
+
batchDelayMs?: number;
|
|
299
|
+
timeBudgetSec?: number;
|
|
300
|
+
targetDurationSec?: number;
|
|
301
|
+
maxConcurrency?: number;
|
|
302
|
+
providerPressureBudget?: number;
|
|
296
303
|
onProgress?: (progress: import("../services/entity-enrichment-cli.js").EntityEnrichmentProgress) => void;
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
pendingTotal?: number;
|
|
300
|
-
pendingByTier?: { hot: number; warm: number; structural: number; cold: number; unknown: number };
|
|
301
|
-
processed: number;
|
|
302
|
-
factsEnriched: number;
|
|
303
|
-
mode?: "bounded" | "all";
|
|
304
|
-
effectiveLimit?: number | "all";
|
|
305
|
-
remainingTotal?: number;
|
|
306
|
-
estimatedRunsRemaining?: number;
|
|
307
|
-
mentions: number;
|
|
308
|
-
accepted: number;
|
|
309
|
-
rejected: number;
|
|
310
|
-
duplicates: number;
|
|
311
|
-
rejectReasons: Record<string, number>;
|
|
312
|
-
skipped?: boolean;
|
|
313
|
-
pendingFactIds?: string[];
|
|
314
|
-
enrichedFacts?: import("../services/entity-enrichment-cli.js").EntityEnrichmentVerboseFact[];
|
|
315
|
-
}>;
|
|
304
|
+
onAdaptivePacing?: (state: import("../services/entity-enrichment-cli.js").EntityEnrichmentAdaptivePacing) => void;
|
|
305
|
+
}) => Promise<import("../services/entity-enrichment-cli.js").EntityEnrichmentCliResult>;
|
|
316
306
|
runSelfCorrectionExtract: (opts: {
|
|
317
307
|
days?: number;
|
|
318
308
|
outputPath?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-runtime.js","names":[],"sources":["../../api/plugin-runtime.ts"],"sourcesContent":["/**\n * PluginRuntime: instance-scoped container for all mutable plugin state.\n *\n * Replaces module-level `let` variables in index.ts to enable:\n * - Independent plugin instances in the same process (testability)\n * - Clearer ownership of runtime state\n * - Explicit context passing to tools and lifecycle hooks\n *\n * A single module-level `const runtimeRef: { value: PluginRuntime | null }` holds the\n * active instance. Closures (tools, timers, event handlers) capture `runtimeRef` by\n * reference; when register() creates a fresh PluginRuntime after a SIGUSR1 reload the\n * closures automatically see the new instance through `runtimeRef.value`.\n */\n\nimport type OpenAI from \"openai\";\nimport type { AgentHealthStore } from \"../backends/agent-health-store.js\";\nimport type { ApitapStore } from \"../backends/apitap-store.js\";\nimport type { AuditStore } from \"../backends/audit-store.js\";\nimport type { CostTracker } from \"../backends/cost-tracker.js\";\nimport type { CredentialsDB } from \"../backends/credentials-db.js\";\nimport type { CrystallizationStore } from \"../backends/crystallization-store.js\";\nimport type { EdictStore } from \"../backends/edict-store.js\";\nimport type { EventBus } from \"../backends/event-bus.js\";\nimport type { EventLog } from \"../backends/event-log.js\";\nimport type { FactsDB } from \"../backends/facts-db.js\";\nimport type { IdentityReflectionStore } from \"../backends/identity-reflection-store.js\";\nimport type { IssueStore } from \"../backends/issue-store.js\";\nimport type { LearningsDB } from \"../backends/learnings-db.js\";\nimport type { NarrativesDB } from \"../backends/narratives-db.js\";\nimport type { PersonaStateStore } from \"../backends/persona-state-store.js\";\nimport type { ProposalsDB } from \"../backends/proposals-db.js\";\nimport type { ToolProposalStore } from \"../backends/tool-proposal-store.js\";\nimport type { VectorDB } from \"../backends/vector-db.js\";\nimport type { WriteAheadLog } from \"../backends/wal.js\";\nimport type { WorkflowStore } from \"../backends/workflow-store.js\";\nimport type { HybridMemoryConfig } from \"../config.js\";\nimport type { PendingLLMWarnings } from \"../services/chat.js\";\nimport type { VariantGenerationQueue } from \"../services/contextual-variants.js\";\nimport type { EmbeddingRegistry } from \"../services/embedding-registry.js\";\nimport type { EmbeddingProvider } from \"../services/embeddings.js\";\nimport type { ProvenanceService } from \"../services/provenance.js\";\nimport type { PythonBridge } from \"../services/python-bridge.js\";\nimport type { AliasDB } from \"../services/retrieval-aliases.js\";\nimport type { VerificationStore } from \"../services/verification-store.js\";\nimport type { LifecycleHooksHandle } from \"../setup/register-hooks.js\";\nimport type { ToolRegistrationHandle } from \"../setup/register-tools.js\";\n\n/** All mutable per-instance state for the memory-hybrid plugin. */\nexport interface PluginRuntime {\n // --- Config & resolved paths ---\n cfg: HybridMemoryConfig;\n resolvedLancePath: string;\n resolvedSqlitePath: string;\n\n // --- Core backends (always present after init) ---\n factsDb: FactsDB;\n edictStore: EdictStore;\n vectorDb: VectorDB;\n embeddings: EmbeddingProvider;\n embeddingRegistry: EmbeddingRegistry;\n openai: OpenAI;\n\n // --- Optional backends (null when feature disabled) ---\n credentialsDb: CredentialsDB | null;\n wal: WriteAheadLog | null;\n proposalsDb: ProposalsDB | null;\n identityReflectionStore: IdentityReflectionStore | null;\n personaStateStore: PersonaStateStore | null;\n eventLog: EventLog | null;\n narrativesDb: NarrativesDB | null;\n aliasDb: AliasDB | null;\n eventBus: EventBus | null;\n costTracker: CostTracker | null;\n issueStore: IssueStore | null;\n workflowStore: WorkflowStore | null;\n crystallizationStore: CrystallizationStore | null;\n toolProposalStore: ToolProposalStore | null;\n provenanceService: ProvenanceService | null;\n verificationStore: VerificationStore | null;\n apitapStore: ApitapStore | null;\n pythonBridge: PythonBridge | null;\n variantQueue: VariantGenerationQueue | null;\n /** Staged intake buffer for errors, lessons, and feature requests (Issue #617). */\n learningsDb: LearningsDB | null;\n /** Cross-agent audit log (Issue #790). */\n auditStore: AuditStore | null;\n agentHealthStore: AgentHealthStore | null;\n\n // --- Lifecycle state ---\n /** Handle returned by registerLifecycleHooks; set after hooks are registered, null until then. */\n lifecycleHooksHandle: LifecycleHooksHandle | null;\n /** Handle returned by registerTools; set after tool registration, null until then. */\n toolRegistrationHandle: ToolRegistrationHandle | null;\n /**\n * Resolves when async bootstrap work from `initializeDatabases` finishes (embedding/vault checks, etc.).\n * Used to sequence CLI teardown so we do not close DBs while init I/O is still running (Issue #1039).\n */\n bootstrapAsyncInit: Promise<void>;\n /** Tracks whether bootstrapAsyncInit has settled (used by re-register reuse policy). */\n bootstrapSettledRef?: { value: boolean };\n /** Last bootstrap health snapshot from initializeDatabases() for reuse-databases policy. */\n bootstrapHealth?: {\n embeddingsOk: boolean;\n credentialsVaultOk: boolean;\n lastCheckTime: number;\n };\n pendingLLMWarnings: PendingLLMWarnings;\n\n // --- Mutable refs (objects so that closures can share mutations) ---\n /** Detected agent for current session; updated on before_agent_start. */\n currentAgentIdRef: { value: string | null };\n /** Set to true once the restart-pending flag has been cleared this session. */\n restartPendingClearedRef: { value: boolean };\n /** Count of in-flight recall operations (degradation / back-pressure). */\n recallInFlightRef: { value: number };\n /** Last user prompt used for interactive auto-recall (issue #957 post-compaction reinjection). */\n lastAutoRecallPromptRef: { value: string | null };\n /** Last progressive index fact IDs (1-based position → fact id). */\n lastProgressiveIndexIds: string[];\n\n // --- Timer refs (objects so they can be passed by reference to plugin-service) ---\n timers: {\n pruneTimer: { value: ReturnType<typeof setInterval> | null };\n classifyTimer: { value: ReturnType<typeof setInterval> | null };\n classifyStartupTimeout: { value: ReturnType<typeof setTimeout> | null };\n proposalsPruneTimer: { value: ReturnType<typeof setInterval> | null };\n languageKeywordsTimer: { value: ReturnType<typeof setInterval> | null };\n languageKeywordsStartupTimeout: { value: ReturnType<typeof setTimeout> | null };\n postUpgradeTimeout: { value: ReturnType<typeof setTimeout> | null };\n passiveObserverTimer: { value: ReturnType<typeof setInterval> | null };\n /** Issue #631: Stale-run watchdog timer for autonomous task queue self-healing. */\n watchdogTimer: { value: ReturnType<typeof setInterval> | null };\n };\n}\n\n/** Create a fresh, empty timers bag for a new PluginRuntime instance. */\nexport function createTimers(): PluginRuntime[\"timers\"] {\n return {\n pruneTimer: { value: null },\n classifyTimer: { value: null },\n classifyStartupTimeout: { value: null },\n proposalsPruneTimer: { value: null },\n languageKeywordsTimer: { value: null },\n languageKeywordsStartupTimeout: { value: null },\n postUpgradeTimeout: { value: null },\n passiveObserverTimer: { value: null },\n watchdogTimer: { value: null },\n };\n}\n\n/**\n * Clear all runtime timer handles and reset refs.\n * Shared by CLI teardown and hot-reload cleanup paths.\n */\nexport function clearRuntimeTimers(timers: PluginRuntime[\"timers\"]): void {\n if (timers.pruneTimer.value) {\n clearInterval(timers.pruneTimer.value);\n timers.pruneTimer.value = null;\n }\n if (timers.classifyTimer.value) {\n clearInterval(timers.classifyTimer.value);\n timers.classifyTimer.value = null;\n }\n if (timers.classifyStartupTimeout.value) {\n clearTimeout(timers.classifyStartupTimeout.value);\n timers.classifyStartupTimeout.value = null;\n }\n if (timers.proposalsPruneTimer.value) {\n clearInterval(timers.proposalsPruneTimer.value);\n timers.proposalsPruneTimer.value = null;\n }\n if (timers.languageKeywordsTimer.value) {\n clearInterval(timers.languageKeywordsTimer.value);\n timers.languageKeywordsTimer.value = null;\n }\n if (timers.languageKeywordsStartupTimeout.value) {\n clearTimeout(timers.languageKeywordsStartupTimeout.value);\n timers.languageKeywordsStartupTimeout.value = null;\n }\n if (timers.postUpgradeTimeout.value) {\n clearTimeout(timers.postUpgradeTimeout.value);\n timers.postUpgradeTimeout.value = null;\n }\n if (timers.passiveObserverTimer.value) {\n clearInterval(timers.passiveObserverTimer.value);\n timers.passiveObserverTimer.value = null;\n }\n if (timers.watchdogTimer.value) {\n clearInterval(timers.watchdogTimer.value);\n timers.watchdogTimer.value = null;\n }\n}\n"],"mappings":";;AAwIA,SAAgB,eAAwC;CACtD,OAAO;EACL,YAAY,EAAE,OAAO,MAAM;EAC3B,eAAe,EAAE,OAAO,MAAM;EAC9B,wBAAwB,EAAE,OAAO,MAAM;EACvC,qBAAqB,EAAE,OAAO,MAAM;EACpC,uBAAuB,EAAE,OAAO,MAAM;EACtC,gCAAgC,EAAE,OAAO,MAAM;EAC/C,oBAAoB,EAAE,OAAO,MAAM;EACnC,sBAAsB,EAAE,OAAO,MAAM;EACrC,eAAe,EAAE,OAAO,MAAM;EAC/B;;;;;;AAOH,SAAgB,mBAAmB,QAAuC;CACxE,IAAI,OAAO,WAAW,OAAO;EAC3B,cAAc,OAAO,WAAW,MAAM;EACtC,OAAO,WAAW,QAAQ;;CAE5B,IAAI,OAAO,cAAc,OAAO;EAC9B,cAAc,OAAO,cAAc,MAAM;EACzC,OAAO,cAAc,QAAQ;;CAE/B,IAAI,OAAO,uBAAuB,OAAO;EACvC,aAAa,OAAO,uBAAuB,MAAM;EACjD,OAAO,uBAAuB,QAAQ;;CAExC,IAAI,OAAO,oBAAoB,OAAO;EACpC,cAAc,OAAO,oBAAoB,MAAM;EAC/C,OAAO,oBAAoB,QAAQ;;CAErC,IAAI,OAAO,sBAAsB,OAAO;EACtC,cAAc,OAAO,sBAAsB,MAAM;EACjD,OAAO,sBAAsB,QAAQ;;CAEvC,IAAI,OAAO,+BAA+B,OAAO;EAC/C,aAAa,OAAO,+BAA+B,MAAM;EACzD,OAAO,+BAA+B,QAAQ;;CAEhD,IAAI,OAAO,mBAAmB,OAAO;EACnC,aAAa,OAAO,mBAAmB,MAAM;EAC7C,OAAO,mBAAmB,QAAQ;;CAEpC,IAAI,OAAO,qBAAqB,OAAO;EACrC,cAAc,OAAO,qBAAqB,MAAM;EAChD,OAAO,qBAAqB,QAAQ;;CAEtC,IAAI,OAAO,cAAc,OAAO;EAC9B,cAAc,OAAO,cAAc,MAAM;EACzC,OAAO,cAAc,QAAQ"}
|
|
1
|
+
{"version":3,"file":"plugin-runtime.js","names":[],"sources":["../../api/plugin-runtime.ts"],"sourcesContent":["/**\n * PluginRuntime: instance-scoped container for all mutable plugin state.\n *\n * Replaces module-level `let` variables in index.ts to enable:\n * - Independent plugin instances in the same process (testability)\n * - Clearer ownership of runtime state\n * - Explicit context passing to tools and lifecycle hooks\n *\n * A single module-level `const runtimeRef: { value: PluginRuntime | null }` holds the\n * active instance. Closures (tools, timers, event handlers) capture `runtimeRef` by\n * reference; when register() creates a fresh PluginRuntime after a SIGUSR1 reload the\n * closures automatically see the new instance through `runtimeRef.value`.\n */\n\nimport type OpenAI from \"openai\";\nimport type { AgentHealthStore } from \"../backends/agent-health-store.js\";\nimport type { ApitapStore } from \"../backends/apitap-store.js\";\nimport type { AuditStore } from \"../backends/audit-store.js\";\nimport type { CostTracker } from \"../backends/cost-tracker.js\";\nimport type { CredentialsDB } from \"../backends/credentials-db.js\";\nimport type { CrystallizationStore } from \"../backends/crystallization-store.js\";\nimport type { EdictStore } from \"../backends/edict-store.js\";\nimport type { EventBus } from \"../backends/event-bus.js\";\nimport type { EventLog } from \"../backends/event-log.js\";\nimport type { FactsDB } from \"../backends/facts-db.js\";\nimport type { IdentityReflectionStore } from \"../backends/identity-reflection-store.js\";\nimport type { IssueStore } from \"../backends/issue-store.js\";\nimport type { LearningsDB } from \"../backends/learnings-db.js\";\nimport type { NarrativesDB } from \"../backends/narratives-db.js\";\nimport type { PersonaStateStore } from \"../backends/persona-state-store.js\";\nimport type { ProposalsDB } from \"../backends/proposals-db.js\";\nimport type { ToolProposalStore } from \"../backends/tool-proposal-store.js\";\nimport type { VectorDB } from \"../backends/vector-db.js\";\nimport type { WriteAheadLog } from \"../backends/wal.js\";\nimport type { WorkflowStore } from \"../backends/workflow-store.js\";\nimport type { HybridMemoryConfig } from \"../config.js\";\nimport type { PendingLLMWarnings } from \"../services/chat.js\";\nimport type { VariantGenerationQueue } from \"../services/contextual-variants.js\";\nimport type { EmbeddingRegistry } from \"../services/embedding-registry.js\";\nimport type { EmbeddingProvider } from \"../services/embeddings.js\";\nimport type { ProvenanceService } from \"../services/provenance.js\";\nimport type { PythonBridge } from \"../services/python-bridge.js\";\nimport type { AliasDB } from \"../services/retrieval-aliases.js\";\nimport type { VerificationStore } from \"../services/verification-store.js\";\nimport type { LifecycleHooksHandle } from \"../setup/register-hooks.js\";\nimport type { ToolRegistrationHandle } from \"../setup/register-tools.js\";\n\n/** All mutable per-instance state for the memory-hybrid plugin. */\nexport interface PluginRuntime {\n // --- Config & resolved paths ---\n cfg: HybridMemoryConfig;\n /** Parse-time config snapshot for hot-reload reuse checks (bootstrap may mutate `cfg`). */\n parsedCfgSnapshot: HybridMemoryConfig;\n resolvedLancePath: string;\n resolvedSqlitePath: string;\n\n // --- Core backends (always present after init) ---\n factsDb: FactsDB;\n edictStore: EdictStore;\n vectorDb: VectorDB;\n embeddings: EmbeddingProvider;\n embeddingRegistry: EmbeddingRegistry;\n openai: OpenAI;\n\n // --- Optional backends (null when feature disabled) ---\n credentialsDb: CredentialsDB | null;\n wal: WriteAheadLog | null;\n proposalsDb: ProposalsDB | null;\n identityReflectionStore: IdentityReflectionStore | null;\n personaStateStore: PersonaStateStore | null;\n eventLog: EventLog | null;\n narrativesDb: NarrativesDB | null;\n aliasDb: AliasDB | null;\n eventBus: EventBus | null;\n costTracker: CostTracker | null;\n issueStore: IssueStore | null;\n workflowStore: WorkflowStore | null;\n crystallizationStore: CrystallizationStore | null;\n toolProposalStore: ToolProposalStore | null;\n provenanceService: ProvenanceService | null;\n verificationStore: VerificationStore | null;\n apitapStore: ApitapStore | null;\n pythonBridge: PythonBridge | null;\n variantQueue: VariantGenerationQueue | null;\n /** Staged intake buffer for errors, lessons, and feature requests (Issue #617). */\n learningsDb: LearningsDB | null;\n /** Cross-agent audit log (Issue #790). */\n auditStore: AuditStore | null;\n agentHealthStore: AgentHealthStore | null;\n\n // --- Lifecycle state ---\n /** Handle returned by registerLifecycleHooks; set after hooks are registered, null until then. */\n lifecycleHooksHandle: LifecycleHooksHandle | null;\n /** Handle returned by registerTools; set after tool registration, null until then. */\n toolRegistrationHandle: ToolRegistrationHandle | null;\n /**\n * Resolves when async bootstrap work from `initializeDatabases` finishes (embedding/vault checks, etc.).\n * Used to sequence CLI teardown so we do not close DBs while init I/O is still running (Issue #1039).\n */\n bootstrapAsyncInit: Promise<void>;\n /** Tracks whether bootstrapAsyncInit has settled (used by re-register reuse policy). */\n bootstrapSettledRef?: { value: boolean };\n /** Last bootstrap health snapshot from initializeDatabases() for reuse-databases policy. */\n bootstrapHealth?: {\n embeddingsOk: boolean;\n credentialsVaultOk: boolean;\n lastCheckTime: number;\n };\n pendingLLMWarnings: PendingLLMWarnings;\n\n // --- Mutable refs (objects so that closures can share mutations) ---\n /** Detected agent for current session; updated on before_agent_start. */\n currentAgentIdRef: { value: string | null };\n /** Set to true once the restart-pending flag has been cleared this session. */\n restartPendingClearedRef: { value: boolean };\n /** Count of in-flight recall operations (degradation / back-pressure). */\n recallInFlightRef: { value: number };\n /** Last user prompt used for interactive auto-recall (issue #957 post-compaction reinjection). */\n lastAutoRecallPromptRef: { value: string | null };\n /** Last progressive index fact IDs (1-based position → fact id). */\n lastProgressiveIndexIds: string[];\n\n // --- Timer refs (objects so they can be passed by reference to plugin-service) ---\n timers: {\n pruneTimer: { value: ReturnType<typeof setInterval> | null };\n classifyTimer: { value: ReturnType<typeof setInterval> | null };\n classifyStartupTimeout: { value: ReturnType<typeof setTimeout> | null };\n proposalsPruneTimer: { value: ReturnType<typeof setInterval> | null };\n languageKeywordsTimer: { value: ReturnType<typeof setInterval> | null };\n languageKeywordsStartupTimeout: { value: ReturnType<typeof setTimeout> | null };\n postUpgradeTimeout: { value: ReturnType<typeof setTimeout> | null };\n passiveObserverTimer: { value: ReturnType<typeof setInterval> | null };\n /** Issue #631: Stale-run watchdog timer for autonomous task queue self-healing. */\n watchdogTimer: { value: ReturnType<typeof setInterval> | null };\n };\n}\n\n/** Create a fresh, empty timers bag for a new PluginRuntime instance. */\nexport function createTimers(): PluginRuntime[\"timers\"] {\n return {\n pruneTimer: { value: null },\n classifyTimer: { value: null },\n classifyStartupTimeout: { value: null },\n proposalsPruneTimer: { value: null },\n languageKeywordsTimer: { value: null },\n languageKeywordsStartupTimeout: { value: null },\n postUpgradeTimeout: { value: null },\n passiveObserverTimer: { value: null },\n watchdogTimer: { value: null },\n };\n}\n\n/**\n * Clear all runtime timer handles and reset refs.\n * Shared by CLI teardown and hot-reload cleanup paths.\n */\nexport function clearRuntimeTimers(timers: PluginRuntime[\"timers\"]): void {\n if (timers.pruneTimer.value) {\n clearInterval(timers.pruneTimer.value);\n timers.pruneTimer.value = null;\n }\n if (timers.classifyTimer.value) {\n clearInterval(timers.classifyTimer.value);\n timers.classifyTimer.value = null;\n }\n if (timers.classifyStartupTimeout.value) {\n clearTimeout(timers.classifyStartupTimeout.value);\n timers.classifyStartupTimeout.value = null;\n }\n if (timers.proposalsPruneTimer.value) {\n clearInterval(timers.proposalsPruneTimer.value);\n timers.proposalsPruneTimer.value = null;\n }\n if (timers.languageKeywordsTimer.value) {\n clearInterval(timers.languageKeywordsTimer.value);\n timers.languageKeywordsTimer.value = null;\n }\n if (timers.languageKeywordsStartupTimeout.value) {\n clearTimeout(timers.languageKeywordsStartupTimeout.value);\n timers.languageKeywordsStartupTimeout.value = null;\n }\n if (timers.postUpgradeTimeout.value) {\n clearTimeout(timers.postUpgradeTimeout.value);\n timers.postUpgradeTimeout.value = null;\n }\n if (timers.passiveObserverTimer.value) {\n clearInterval(timers.passiveObserverTimer.value);\n timers.passiveObserverTimer.value = null;\n }\n if (timers.watchdogTimer.value) {\n clearInterval(timers.watchdogTimer.value);\n timers.watchdogTimer.value = null;\n }\n}\n"],"mappings":";;AA0IA,SAAgB,eAAwC;CACtD,OAAO;EACL,YAAY,EAAE,OAAO,KAAK;EAC1B,eAAe,EAAE,OAAO,KAAK;EAC7B,wBAAwB,EAAE,OAAO,KAAK;EACtC,qBAAqB,EAAE,OAAO,KAAK;EACnC,uBAAuB,EAAE,OAAO,KAAK;EACrC,gCAAgC,EAAE,OAAO,KAAK;EAC9C,oBAAoB,EAAE,OAAO,KAAK;EAClC,sBAAsB,EAAE,OAAO,KAAK;EACpC,eAAe,EAAE,OAAO,KAAK;CAC/B;AACF;;;;;AAMA,SAAgB,mBAAmB,QAAuC;CACxE,IAAI,OAAO,WAAW,OAAO;EAC3B,cAAc,OAAO,WAAW,KAAK;EACrC,OAAO,WAAW,QAAQ;CAC5B;CACA,IAAI,OAAO,cAAc,OAAO;EAC9B,cAAc,OAAO,cAAc,KAAK;EACxC,OAAO,cAAc,QAAQ;CAC/B;CACA,IAAI,OAAO,uBAAuB,OAAO;EACvC,aAAa,OAAO,uBAAuB,KAAK;EAChD,OAAO,uBAAuB,QAAQ;CACxC;CACA,IAAI,OAAO,oBAAoB,OAAO;EACpC,cAAc,OAAO,oBAAoB,KAAK;EAC9C,OAAO,oBAAoB,QAAQ;CACrC;CACA,IAAI,OAAO,sBAAsB,OAAO;EACtC,cAAc,OAAO,sBAAsB,KAAK;EAChD,OAAO,sBAAsB,QAAQ;CACvC;CACA,IAAI,OAAO,+BAA+B,OAAO;EAC/C,aAAa,OAAO,+BAA+B,KAAK;EACxD,OAAO,+BAA+B,QAAQ;CAChD;CACA,IAAI,OAAO,mBAAmB,OAAO;EACnC,aAAa,OAAO,mBAAmB,KAAK;EAC5C,OAAO,mBAAmB,QAAQ;CACpC;CACA,IAAI,OAAO,qBAAqB,OAAO;EACrC,cAAc,OAAO,qBAAqB,KAAK;EAC/C,OAAO,qBAAqB,QAAQ;CACtC;CACA,IAAI,OAAO,cAAc,OAAO;EAC9B,cAAc,OAAO,cAAc,KAAK;EACxC,OAAO,cAAc,QAAQ;CAC/B;AACF"}
|