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.
Files changed (535) hide show
  1. package/api/plugin-runtime.ts +2 -0
  2. package/backends/facts-db/contradictions.ts +1 -1
  3. package/cli/cmd-extract-directives.ts +225 -11
  4. package/cli/cmd-extract-proposals.ts +5 -6
  5. package/cli/cmd-extract-reinforcement.ts +71 -0
  6. package/cli/cmd-feedback.ts +15 -9
  7. package/cli/commands/manage/register-reflection-pipeline.ts +247 -13
  8. package/cli/commands/manage/register-storage-maintenance.ts +224 -15
  9. package/cli/commands/manage/storage-stats-helpers.ts +13 -2
  10. package/cli/context.ts +9 -19
  11. package/cli/distill.ts +31 -1
  12. package/cli/register.ts +28 -38
  13. package/dist/api/plugin-runtime.js.map +1 -1
  14. package/dist/backends/agent-health-store.js.map +1 -1
  15. package/dist/backends/apitap-store.js.map +1 -1
  16. package/dist/backends/audit-store.js.map +1 -1
  17. package/dist/backends/base-sqlite-store.js.map +1 -1
  18. package/dist/backends/cost-tracker.js.map +1 -1
  19. package/dist/backends/credentials-db.js +2 -3
  20. package/dist/backends/credentials-db.js.map +1 -1
  21. package/dist/backends/crystallization-store.js.map +1 -1
  22. package/dist/backends/edict-store.js.map +1 -1
  23. package/dist/backends/event-bus.js.map +1 -1
  24. package/dist/backends/event-log.js.map +1 -1
  25. package/dist/backends/facts-db/cache-manager.js.map +1 -1
  26. package/dist/backends/facts-db/clusters.js.map +1 -1
  27. package/dist/backends/facts-db/contradictions.js +1 -1
  28. package/dist/backends/facts-db/contradictions.js.map +1 -1
  29. package/dist/backends/facts-db/crud.js.map +1 -1
  30. package/dist/backends/facts-db/db-connection.js.map +1 -1
  31. package/dist/backends/facts-db/entity-autolink.js.map +1 -1
  32. package/dist/backends/facts-db/entity-layer.js.map +1 -1
  33. package/dist/backends/facts-db/episodes.js.map +1 -1
  34. package/dist/backends/facts-db/fact-queries.js.map +1 -1
  35. package/dist/backends/facts-db/fact-read-queries.js.map +1 -1
  36. package/dist/backends/facts-db/facts-db-layer1.js.map +1 -1
  37. package/dist/backends/facts-db/facts-db-layer2.js.map +1 -1
  38. package/dist/backends/facts-db/facts-db-layer3.js.map +1 -1
  39. package/dist/backends/facts-db/fts-text.js.map +1 -1
  40. package/dist/backends/facts-db/generated-skills/policy.js.map +1 -1
  41. package/dist/backends/facts-db/generated-skills.js.map +1 -1
  42. package/dist/backends/facts-db/housekeeping.js.map +1 -1
  43. package/dist/backends/facts-db/links.js.map +1 -1
  44. package/dist/backends/facts-db/maintenance.js.map +1 -1
  45. package/dist/backends/facts-db/procedures/crud.js.map +1 -1
  46. package/dist/backends/facts-db/procedures/internal.js.map +1 -1
  47. package/dist/backends/facts-db/procedures/promotion.js.map +1 -1
  48. package/dist/backends/facts-db/procedures/search.js.map +1 -1
  49. package/dist/backends/facts-db/procedures/stats.js.map +1 -1
  50. package/dist/backends/facts-db/reinforcement.js.map +1 -1
  51. package/dist/backends/facts-db/row-mapper.js.map +1 -1
  52. package/dist/backends/facts-db/scan-cursors.js.map +1 -1
  53. package/dist/backends/facts-db/schema-bootstrap.js.map +1 -1
  54. package/dist/backends/facts-db/scope-sql.js.map +1 -1
  55. package/dist/backends/facts-db/search.js.map +1 -1
  56. package/dist/backends/facts-db/stats.js.map +1 -1
  57. package/dist/backends/facts-db/types.js.map +1 -1
  58. package/dist/backends/facts-db/variants.js.map +1 -1
  59. package/dist/backends/identity-reflection-store.js.map +1 -1
  60. package/dist/backends/issue-store.js.map +1 -1
  61. package/dist/backends/learnings-db.js.map +1 -1
  62. package/dist/backends/migrations/facts-migrations.js.map +1 -1
  63. package/dist/backends/migrations/procedures.js.map +1 -1
  64. package/dist/backends/narratives-db.js.map +1 -1
  65. package/dist/backends/persona-state-store.js.map +1 -1
  66. package/dist/backends/proposals-db.js.map +1 -1
  67. package/dist/backends/scope-filter-sql.js.map +1 -1
  68. package/dist/backends/sqlite-schema-meta.js.map +1 -1
  69. package/dist/backends/tool-proposal-store.js.map +1 -1
  70. package/dist/backends/vector-db/constants.js.map +1 -1
  71. package/dist/backends/vector-db/path-utils.js.map +1 -1
  72. package/dist/backends/vector-db/runtime-locks.js.map +1 -1
  73. package/dist/backends/vector-db/vector-db-class.js.map +1 -1
  74. package/dist/backends/wal.js.map +1 -1
  75. package/dist/backends/workflow-store.js.map +1 -1
  76. package/dist/benchmark/shadow-eval.js.map +1 -1
  77. package/dist/cli/active-tasks.js.map +1 -1
  78. package/dist/cli/backup.js.map +1 -1
  79. package/dist/cli/benchmark.js.map +1 -1
  80. package/dist/cli/cmd-backfill.js.map +1 -1
  81. package/dist/cli/cmd-config.js.map +1 -1
  82. package/dist/cli/cmd-credentials.js.map +1 -1
  83. package/dist/cli/cmd-demo.js.map +1 -1
  84. package/dist/cli/cmd-distill.js.map +1 -1
  85. package/dist/cli/cmd-doctor.js.map +1 -1
  86. package/dist/cli/cmd-examples.js.map +1 -1
  87. package/dist/cli/cmd-extract-daily.js.map +1 -1
  88. package/dist/cli/cmd-extract-directives.js +141 -10
  89. package/dist/cli/cmd-extract-directives.js.map +1 -1
  90. package/dist/cli/cmd-extract-procedures.js.map +1 -1
  91. package/dist/cli/cmd-extract-proposals.js +3 -2
  92. package/dist/cli/cmd-extract-proposals.js.map +1 -1
  93. package/dist/cli/cmd-extract-reinforcement.js +39 -0
  94. package/dist/cli/cmd-extract-reinforcement.js.map +1 -1
  95. package/dist/cli/cmd-extract-sessions.js.map +1 -1
  96. package/dist/cli/cmd-feedback.js +9 -4
  97. package/dist/cli/cmd-feedback.js.map +1 -1
  98. package/dist/cli/cmd-health.js.map +1 -1
  99. package/dist/cli/cmd-providers.js.map +1 -1
  100. package/dist/cli/cmd-selfcorrection.js.map +1 -1
  101. package/dist/cli/cmd-setup.js.map +1 -1
  102. package/dist/cli/cmd-status.js.map +1 -1
  103. package/dist/cli/cmd-store.js.map +1 -1
  104. package/dist/cli/cmd-user-friendly.js.map +1 -1
  105. package/dist/cli/cmd-verify.js.map +1 -1
  106. package/dist/cli/commands/manage/bindings.js.map +1 -1
  107. package/dist/cli/commands/manage/dream-cycle-followup.js.map +1 -1
  108. package/dist/cli/commands/manage/maintenance-heartbeat.js.map +1 -1
  109. package/dist/cli/commands/manage/register-agents-audit-runall.js.map +1 -1
  110. package/dist/cli/commands/manage/register-analyze-maintenance-logs.js.map +1 -1
  111. package/dist/cli/commands/manage/register-budget-proposals.js.map +1 -1
  112. package/dist/cli/commands/manage/register-config-cli.js.map +1 -1
  113. package/dist/cli/commands/manage/register-corrections-and-pipeline.js.map +1 -1
  114. package/dist/cli/commands/manage/register-corrections.js.map +1 -1
  115. package/dist/cli/commands/manage/register-council.js.map +1 -1
  116. package/dist/cli/commands/manage/register-credentials-scope.js.map +1 -1
  117. package/dist/cli/commands/manage/register-digest.js.map +1 -1
  118. package/dist/cli/commands/manage/register-lifecycle.js.map +1 -1
  119. package/dist/cli/commands/manage/register-procedure-lifecycle.js.map +1 -1
  120. package/dist/cli/commands/manage/register-reconcile-cron-ledgers.js.map +1 -1
  121. package/dist/cli/commands/manage/register-reflection-pipeline.js +144 -7
  122. package/dist/cli/commands/manage/register-reflection-pipeline.js.map +1 -1
  123. package/dist/cli/commands/manage/register-self-correction-feedback.js.map +1 -1
  124. package/dist/cli/commands/manage/register-storage-and-stats.js.map +1 -1
  125. package/dist/cli/commands/manage/register-storage-entities-decay.js.map +1 -1
  126. package/dist/cli/commands/manage/register-storage-graph-audit.js.map +1 -1
  127. package/dist/cli/commands/manage/register-storage-maintenance.js +152 -9
  128. package/dist/cli/commands/manage/register-storage-maintenance.js.map +1 -1
  129. package/dist/cli/commands/manage/register-validate-cron-exit.js.map +1 -1
  130. package/dist/cli/commands/manage/storage-stats-helpers.js +10 -3
  131. package/dist/cli/commands/manage/storage-stats-helpers.js.map +1 -1
  132. package/dist/cli/commands/register-manage-commands.js.map +1 -1
  133. package/dist/cli/config-feature-summaries.js.map +1 -1
  134. package/dist/cli/config-output-sink.js.map +1 -1
  135. package/dist/cli/distill-session-jsonl.js.map +1 -1
  136. package/dist/cli/distill.js +10 -1
  137. package/dist/cli/distill.js.map +1 -1
  138. package/dist/cli/global-verbose.js.map +1 -1
  139. package/dist/cli/goals.js.map +1 -1
  140. package/dist/cli/hybrid-mem-commander-utils.js.map +1 -1
  141. package/dist/cli/install/config-merge.js.map +1 -1
  142. package/dist/cli/install/cron-jobs.js.map +1 -1
  143. package/dist/cli/install/embedding-detect.js.map +1 -1
  144. package/dist/cli/install/run-install.js.map +1 -1
  145. package/dist/cli/install/workspace.js.map +1 -1
  146. package/dist/cli/proposals.js.map +1 -1
  147. package/dist/cli/register.js.map +1 -1
  148. package/dist/cli/shared.js.map +1 -1
  149. package/dist/cli/skills.js.map +1 -1
  150. package/dist/cli/task-queue-status.js.map +1 -1
  151. package/dist/cli/verified.js.map +1 -1
  152. package/dist/cli/verify/fact-count.js.map +1 -1
  153. package/dist/cli/verify/openclaw-config.js.map +1 -1
  154. package/dist/cli/verify/plugin-config-credentials.js.map +1 -1
  155. package/dist/cli/verify/sections/config-cron.js.map +1 -1
  156. package/dist/cli/verify/sections/embeddings.js.map +1 -1
  157. package/dist/cli/verify/sections/infrastructure.js.map +1 -1
  158. package/dist/cli/verify/sections/llm-models.js.map +1 -1
  159. package/dist/cli/verify/sections/reconcile.js.map +1 -1
  160. package/dist/cli/verify/verify-run-state.js.map +1 -1
  161. package/dist/cli/verify-llm-azure-auth.js.map +1 -1
  162. package/dist/cli/verify.js.map +1 -1
  163. package/dist/config/hybrid-schema.js.map +1 -1
  164. package/dist/config/index.js.map +1 -1
  165. package/dist/config/maintenance-fallback-policy.js.map +1 -1
  166. package/dist/config/parsers/capture.js.map +1 -1
  167. package/dist/config/parsers/core.js.map +1 -1
  168. package/dist/config/parsers/features.js.map +1 -1
  169. package/dist/config/parsers/index.js.map +1 -1
  170. package/dist/config/parsers/maintenance.js.map +1 -1
  171. package/dist/config/parsers/retrieval.js.map +1 -1
  172. package/dist/config/parsers/sensors.js.map +1 -1
  173. package/dist/config/skill-sections.js.map +1 -1
  174. package/dist/config/skill-size-limits.js.map +1 -1
  175. package/dist/config/types/agents.js.map +1 -1
  176. package/dist/config/types/bootstrap.js.map +1 -1
  177. package/dist/config/types/core.js.map +1 -1
  178. package/dist/config/types/index.js.map +1 -1
  179. package/dist/config/utils.js.map +1 -1
  180. package/dist/index-help.js.map +1 -1
  181. package/dist/index-testing-exports.js.map +1 -1
  182. package/dist/index.d.ts +1 -1
  183. package/dist/index.js +2 -2
  184. package/dist/index.js.map +1 -1
  185. package/dist/lifecycle/hook-resolution-api.js.map +1 -1
  186. package/dist/lifecycle/hooks.js +0 -1
  187. package/dist/lifecycle/hooks.js.map +1 -1
  188. package/dist/lifecycle/resolve-agent-id.js.map +1 -1
  189. package/dist/lifecycle/session-state.js.map +1 -1
  190. package/dist/lifecycle/stage-active-task.js.map +1 -1
  191. package/dist/lifecycle/stage-auth-failure.js.map +1 -1
  192. package/dist/lifecycle/stage-capture/run-capture.js.map +1 -1
  193. package/dist/lifecycle/stage-capture.js.map +1 -1
  194. package/dist/lifecycle/stage-cleanup.js.map +1 -1
  195. package/dist/lifecycle/stage-credential-hint.js.map +1 -1
  196. package/dist/lifecycle/stage-frustration.js.map +1 -1
  197. package/dist/lifecycle/stage-goal-stewardship.js.map +1 -1
  198. package/dist/lifecycle/stage-goal-subagent.js.map +1 -1
  199. package/dist/lifecycle/stage-injection.js +1 -1
  200. package/dist/lifecycle/stage-injection.js.map +1 -1
  201. package/dist/lifecycle/stage-recall/run-recall.js.map +1 -1
  202. package/dist/lifecycle/stage-recall.js.map +1 -1
  203. package/dist/lifecycle/stage-setup.js.map +1 -1
  204. package/dist/routes/dashboard/collectors.js.map +1 -1
  205. package/dist/routes/dashboard/html.js.map +1 -1
  206. package/dist/routes/dashboard/server.js.map +1 -1
  207. package/dist/routes/dashboard-graph.js.map +1 -1
  208. package/dist/routes/graphql-resolvers.js.map +1 -1
  209. package/dist/routes/graphql-server.js.map +1 -1
  210. package/dist/services/active-task-checkpoint.js.map +1 -1
  211. package/dist/services/active-task-injection.js.map +1 -1
  212. package/dist/services/active-task.js.map +1 -1
  213. package/dist/services/adaptive-catch-up-pacing.js +25 -0
  214. package/dist/services/adaptive-catch-up-pacing.js.map +1 -0
  215. package/dist/services/adaptive-maintenance-llm.js.map +1 -1
  216. package/dist/services/adaptive-model-limits.js.map +1 -1
  217. package/dist/services/ambient-retrieval.js.map +1 -1
  218. package/dist/services/apitap-service.js.map +1 -1
  219. package/dist/services/audit-health-exit-info.js.map +1 -1
  220. package/dist/services/audit-health-json.js.map +1 -1
  221. package/dist/services/auth-failure-detect.js.map +1 -1
  222. package/dist/services/auto-capture.js.map +1 -1
  223. package/dist/services/auto-classifier.js.map +1 -1
  224. package/dist/services/auto-skills-audit.js.map +1 -1
  225. package/dist/services/bootstrap-optional.js.map +1 -1
  226. package/dist/services/bootstrap-priority.js.map +1 -1
  227. package/dist/services/bootstrap.js.map +1 -1
  228. package/dist/services/capture-provenance.js.map +1 -1
  229. package/dist/services/capture-utils.js.map +1 -1
  230. package/dist/services/chat.js +22 -3
  231. package/dist/services/chat.js.map +1 -1
  232. package/dist/services/classification-scope.js.map +1 -1
  233. package/dist/services/classification.js.map +1 -1
  234. package/dist/services/cli-sql-dump.js.map +1 -1
  235. package/dist/services/consolidation.js.map +1 -1
  236. package/dist/services/context-audit.js +1 -1
  237. package/dist/services/context-audit.js.map +1 -1
  238. package/dist/services/context-budget.js.map +1 -1
  239. package/dist/services/context-engine.js.map +1 -1
  240. package/dist/services/contextual-variants.js.map +1 -1
  241. package/dist/services/continuous-verifier.js.map +1 -1
  242. package/dist/services/contradiction-adjudicator.js.map +1 -1
  243. package/dist/services/cost-context.js.map +1 -1
  244. package/dist/services/cost-feature-labels.js.map +1 -1
  245. package/dist/services/credential-migration.js.map +1 -1
  246. package/dist/services/credential-scanner.js.map +1 -1
  247. package/dist/services/credential-validation.js.map +1 -1
  248. package/dist/services/cron-exit-validator.js.map +1 -1
  249. package/dist/services/cron-guard.js.map +1 -1
  250. package/dist/services/cron-job-bash-harness.js +52 -5
  251. package/dist/services/cron-job-bash-harness.js.map +1 -1
  252. package/dist/services/cron-maintenance-reconciler.js +1 -3
  253. package/dist/services/cron-maintenance-reconciler.js.map +1 -1
  254. package/dist/services/cross-agent-learning.js.map +1 -1
  255. package/dist/services/crystallization-proposer.js.map +1 -1
  256. package/dist/services/dedupe-policy.js.map +1 -1
  257. package/dist/services/deprecated-cron-commands.js.map +1 -1
  258. package/dist/services/directive-extract.js.map +1 -1
  259. package/dist/services/document-chunker.js.map +1 -1
  260. package/dist/services/document-grader.js.map +1 -1
  261. package/dist/services/dream-cycle.js.map +1 -1
  262. package/dist/services/embedding-migration.js.map +1 -1
  263. package/dist/services/embedding-registry.js.map +1 -1
  264. package/dist/services/embeddings/chain-provider.js.map +1 -1
  265. package/dist/services/embeddings/factory.js.map +1 -1
  266. package/dist/services/embeddings/fallback-provider.js.map +1 -1
  267. package/dist/services/embeddings/ollama-provider.js.map +1 -1
  268. package/dist/services/embeddings/onnx-provider.js.map +1 -1
  269. package/dist/services/embeddings/openai-provider.js.map +1 -1
  270. package/dist/services/embeddings/shared.js +3 -3
  271. package/dist/services/embeddings/shared.js.map +1 -1
  272. package/dist/services/embeddings/types.js.map +1 -1
  273. package/dist/services/entity-enrichment-adaptive.js +128 -0
  274. package/dist/services/entity-enrichment-adaptive.js.map +1 -0
  275. package/dist/services/entity-enrichment-cli.js +389 -42
  276. package/dist/services/entity-enrichment-cli.js.map +1 -1
  277. package/dist/services/entity-enrichment.js +31 -5
  278. package/dist/services/entity-enrichment.js.map +1 -1
  279. package/dist/services/error-reporter/noisy-errors.js.map +1 -1
  280. package/dist/services/error-reporter/sanitize.js.map +1 -1
  281. package/dist/services/error-reporter.js.map +1 -1
  282. package/dist/services/event-hub-repair.js.map +1 -1
  283. package/dist/services/export-memory.js.map +1 -1
  284. package/dist/services/fact-extraction.js.map +1 -1
  285. package/dist/services/feedback-effectiveness.js.map +1 -1
  286. package/dist/services/find-duplicates.js.map +1 -1
  287. package/dist/services/frustration-detector.js.map +1 -1
  288. package/dist/services/fts-search.js.map +1 -1
  289. package/dist/services/gap-detector.js.map +1 -1
  290. package/dist/services/generated-skill-lifecycle.js.map +1 -1
  291. package/dist/services/generated-skill-validation.js.map +1 -1
  292. package/dist/services/goal-active-task-mirror.js.map +1 -1
  293. package/dist/services/goal-circuit-breaker.js.map +1 -1
  294. package/dist/services/goal-health.js.map +1 -1
  295. package/dist/services/goal-registry.js.map +1 -1
  296. package/dist/services/goal-stewardship-heartbeat.js.map +1 -1
  297. package/dist/services/goal-stewardship-llm-triage.js.map +1 -1
  298. package/dist/services/goal-stewardship-verify-cron.js.map +1 -1
  299. package/dist/services/goal-stewardship.js.map +1 -1
  300. package/dist/services/goal-subagent.js.map +1 -1
  301. package/dist/services/graph-retrieval.js.map +1 -1
  302. package/dist/services/humanizer-score.js.map +1 -1
  303. package/dist/services/hybrid-mem-cron-default-job-steps.js.map +1 -1
  304. package/dist/services/hyde-helper.js.map +1 -1
  305. package/dist/services/identity-reflection.js.map +1 -1
  306. package/dist/services/implicit-feedback-extract.js.map +1 -1
  307. package/dist/services/index.js.map +1 -1
  308. package/dist/services/ingest-utils.js.map +1 -1
  309. package/dist/services/intent-template.js.map +1 -1
  310. package/dist/services/json-array-parser.js.map +1 -1
  311. package/dist/services/knowledge-gaps.js.map +1 -1
  312. package/dist/services/language-keywords-build.js.map +1 -1
  313. package/dist/services/lifecycle/github-adapter.js.map +1 -1
  314. package/dist/services/llm-rate-limit-headers.js +1 -2
  315. package/dist/services/llm-rate-limit-headers.js.map +1 -1
  316. package/dist/services/maintenance-auto-fix.js.map +1 -1
  317. package/dist/services/maintenance-log-analyzer.js +7 -1
  318. package/dist/services/maintenance-log-analyzer.js.map +1 -1
  319. package/dist/services/maintenance-timestamp.js.map +1 -1
  320. package/dist/services/memory-diagnostics.js.map +1 -1
  321. package/dist/services/memory-index.js.map +1 -1
  322. package/dist/services/merge-results.js.map +1 -1
  323. package/dist/services/model-capabilities.js.map +1 -1
  324. package/dist/services/model-pricing.js.map +1 -1
  325. package/dist/services/narrative-recall.js.map +1 -1
  326. package/dist/services/openclaw-session-artifact.js.map +1 -1
  327. package/dist/services/passive-observer.js.map +1 -1
  328. package/dist/services/pattern-detector-hash.js.map +1 -1
  329. package/dist/services/pattern-detector.js.map +1 -1
  330. package/dist/services/pending-autopilot/foundation.js.map +1 -1
  331. package/dist/services/pending-autopilot/redaction.js.map +1 -1
  332. package/dist/services/pending-autopilot/store.js.map +1 -1
  333. package/dist/services/pending-autopilot/types.js.map +1 -1
  334. package/dist/services/pending-digest-autopilot-cron.js.map +1 -1
  335. package/dist/services/pending-digest-autopilot.js.map +1 -1
  336. package/dist/services/pending-review-digest.js.map +1 -1
  337. package/dist/services/persona-proposal-triage.js.map +1 -1
  338. package/dist/services/persona-state-promotion.js.map +1 -1
  339. package/dist/services/post-compaction-recall.js.map +1 -1
  340. package/dist/services/pre-consolidation-flush.js.map +1 -1
  341. package/dist/services/pre-finalization-guard.js.map +1 -1
  342. package/dist/services/procedure-cluster.js.map +1 -1
  343. package/dist/services/procedure-extractor.js.map +1 -1
  344. package/dist/services/procedure-promotion/duplicate-skill-cache.js.map +1 -1
  345. package/dist/services/procedure-promotion-policy.js.map +1 -1
  346. package/dist/services/procedure-selection-metrics.js.map +1 -1
  347. package/dist/services/procedure-skill-eval.js.map +1 -1
  348. package/dist/services/procedure-skill-generator.js.map +1 -1
  349. package/dist/services/procedure-skill-recipe.js.map +1 -1
  350. package/dist/services/procedure-skill-shrink.js.map +1 -1
  351. package/dist/services/procedure-skill-workflow.js.map +1 -1
  352. package/dist/services/provenance.js.map +1 -1
  353. package/dist/services/public-export-bundle.js.map +1 -1
  354. package/dist/services/python-bridge.js.map +1 -1
  355. package/dist/services/query-expander.js.map +1 -1
  356. package/dist/services/query-validator.js.map +1 -1
  357. package/dist/services/recall-pipeline.js.map +1 -1
  358. package/dist/services/recall-timing.js.map +1 -1
  359. package/dist/services/recent-http-attempts.js.map +1 -1
  360. package/dist/services/reflection/shared.js.map +1 -1
  361. package/dist/services/reflection.js.map +1 -1
  362. package/dist/services/reinforcement-extract.js.map +1 -1
  363. package/dist/services/reranker.js.map +1 -1
  364. package/dist/services/responses-adapter.js.map +1 -1
  365. package/dist/services/retrieval-aliases.js.map +1 -1
  366. package/dist/services/retrieval-mode-policy.js.map +1 -1
  367. package/dist/services/retrieval-orchestrator/packing.js.map +1 -1
  368. package/dist/services/retrieval-orchestrator.d.ts +2 -3
  369. package/dist/services/retrieval-orchestrator.js.map +1 -1
  370. package/dist/services/rrf-fusion.js.map +1 -1
  371. package/dist/services/self-correction-extract.js.map +1 -1
  372. package/dist/services/session-observability.js.map +1 -1
  373. package/dist/services/session-pre-filter.js.map +1 -1
  374. package/dist/services/shortest-path.js.map +1 -1
  375. package/dist/services/skill-allowed-tools.js.map +1 -1
  376. package/dist/services/skill-creator-validator.js.map +1 -1
  377. package/dist/services/skill-crystallizer-helpers.js.map +1 -1
  378. package/dist/services/skill-crystallizer.js.map +1 -1
  379. package/dist/services/skill-description-builder.js.map +1 -1
  380. package/dist/services/skill-eval-synthesizer.js.map +1 -1
  381. package/dist/services/skill-examples-builder.js.map +1 -1
  382. package/dist/services/skill-frontmatter.js.map +1 -1
  383. package/dist/services/skill-name-validator.js.map +1 -1
  384. package/dist/services/skill-prompt-injection.js.map +1 -1
  385. package/dist/services/skill-reference-sidecar.js.map +1 -1
  386. package/dist/services/skill-script-bundler.js.map +1 -1
  387. package/dist/services/skill-validator.js.map +1 -1
  388. package/dist/services/startup-memory-attribution.js.map +1 -1
  389. package/dist/services/task-hygiene.js.map +1 -1
  390. package/dist/services/task-ledger/canonical.js.map +1 -1
  391. package/dist/services/task-ledger-facts.js.map +1 -1
  392. package/dist/services/task-queue-leases.js.map +1 -1
  393. package/dist/services/task-queue-watchdog.js.map +1 -1
  394. package/dist/services/tool-effectiveness.js.map +1 -1
  395. package/dist/services/tool-proposer.js.map +1 -1
  396. package/dist/services/tools-md-section.js.map +1 -1
  397. package/dist/services/topic-clusters.js.map +1 -1
  398. package/dist/services/trajectory-tracker.js.map +1 -1
  399. package/dist/services/vector-backend-observability.js.map +1 -1
  400. package/dist/services/vector-lifecycle-audit.js.map +1 -1
  401. package/dist/services/vector-maintenance.js.map +1 -1
  402. package/dist/services/vector-search.js.map +1 -1
  403. package/dist/services/verification-store.js.map +1 -1
  404. package/dist/services/verified-fact-triage.js.map +1 -1
  405. package/dist/services/wal-helpers.js.map +1 -1
  406. package/dist/services/workflow-tracker.js.map +1 -1
  407. package/dist/setup/bootstrap-databases.js.map +1 -1
  408. package/dist/setup/cli-context/cli-services.js.map +1 -1
  409. package/dist/setup/cli-context/help-text.js.map +1 -1
  410. package/dist/setup/cli-context/metadata.js.map +1 -1
  411. package/dist/setup/cli-context/register-cli-with-help.js.map +1 -1
  412. package/dist/setup/cli-context/register-full.js.map +1 -1
  413. package/dist/setup/cli-context/register-help.js.map +1 -1
  414. package/dist/setup/cost-instrumentation.js.map +1 -1
  415. package/dist/setup/hybrid-memory-generation-state.js.map +1 -1
  416. package/dist/setup/hybrid-memory-reload-coordinator.js +13 -13
  417. package/dist/setup/hybrid-memory-reload-coordinator.js.map +1 -1
  418. package/dist/setup/plugin-service.js.map +1 -1
  419. package/dist/setup/provider-router.js.map +1 -1
  420. package/dist/setup/register-context-engine.js.map +1 -1
  421. package/dist/setup/register-hooks.js.map +1 -1
  422. package/dist/setup/register-plugin.js +25 -21
  423. package/dist/setup/register-plugin.js.map +1 -1
  424. package/dist/setup/register-tools.js.map +1 -1
  425. package/dist/setup/reregister-policy.js +2 -2
  426. package/dist/setup/reregister-policy.js.map +1 -1
  427. package/dist/setup/tool-installers.js.map +1 -1
  428. package/dist/setup/workspace-bootstrap.js.map +1 -1
  429. package/dist/src/worker/narratives.js.map +1 -1
  430. package/dist/tools/apitap-tools.js.map +1 -1
  431. package/dist/tools/credential-tools.js.map +1 -1
  432. package/dist/tools/crystallization-tools.js.map +1 -1
  433. package/dist/tools/dashboard-routes.js.map +1 -1
  434. package/dist/tools/document-tools.js.map +1 -1
  435. package/dist/tools/goal-tools.js.map +1 -1
  436. package/dist/tools/graph-tools.js.map +1 -1
  437. package/dist/tools/issue-tools.js.map +1 -1
  438. package/dist/tools/memory/build-runtime.js.map +1 -1
  439. package/dist/tools/memory/helpers.js.map +1 -1
  440. package/dist/tools/memory/register-checkpoint-tools.js.map +1 -1
  441. package/dist/tools/memory/register-directory-tools.js.map +1 -1
  442. package/dist/tools/memory/register-edict-tools.js.map +1 -1
  443. package/dist/tools/memory/register-episode-tools.js.map +1 -1
  444. package/dist/tools/memory/register-recall-tools.js.map +1 -1
  445. package/dist/tools/memory/register-store-tools.js.map +1 -1
  446. package/dist/tools/memory-tools.js.map +1 -1
  447. package/dist/tools/persona-tools.js.map +1 -1
  448. package/dist/tools/provenance-tools.js.map +1 -1
  449. package/dist/tools/public-api-routes.js.map +1 -1
  450. package/dist/tools/safe-register-http-route.js.map +1 -1
  451. package/dist/tools/self-extension-tools.js.map +1 -1
  452. package/dist/tools/task-hygiene-tools.js.map +1 -1
  453. package/dist/tools/utility-tools.js.map +1 -1
  454. package/dist/tools/verification-tools.js.map +1 -1
  455. package/dist/tools/workflow-tools.js.map +1 -1
  456. package/dist/types/issue-types.js.map +1 -1
  457. package/dist/types/learnings-types.js.map +1 -1
  458. package/dist/types/memory.js.map +1 -1
  459. package/dist/utils/apim-gateway-fetch.js.map +1 -1
  460. package/dist/utils/atomic-write.js.map +1 -1
  461. package/dist/utils/auth-failover.js.map +1 -1
  462. package/dist/utils/auth.js.map +1 -1
  463. package/dist/utils/compaction-model-watchdog.js.map +1 -1
  464. package/dist/utils/consolidation-controls.js.map +1 -1
  465. package/dist/utils/constants.js.map +1 -1
  466. package/dist/utils/date-detector.js.map +1 -1
  467. package/dist/utils/dates.js.map +1 -1
  468. package/dist/utils/decay.js.map +1 -1
  469. package/dist/utils/duration.js.map +1 -1
  470. package/dist/utils/embed-call.js.map +1 -1
  471. package/dist/utils/entity-lookup-resolve.js.map +1 -1
  472. package/dist/utils/entity-mention-quality.js.map +1 -1
  473. package/dist/utils/entity-stopwords.js.map +1 -1
  474. package/dist/utils/env-manager.js.map +1 -1
  475. package/dist/utils/error-tracking.js.map +1 -1
  476. package/dist/utils/event-loop-yield.js.map +1 -1
  477. package/dist/utils/extract-last-user-message.js.map +1 -1
  478. package/dist/utils/extraction-from-template.js.map +1 -1
  479. package/dist/utils/fact-embeddings.js.map +1 -1
  480. package/dist/utils/file-snapshot.js.map +1 -1
  481. package/dist/utils/format.js.map +1 -1
  482. package/dist/utils/fs.js.map +1 -1
  483. package/dist/utils/gh-repo-arg.js.map +1 -1
  484. package/dist/utils/hybrid-mem-json-cli.js.map +1 -1
  485. package/dist/utils/language-keywords.js.map +1 -1
  486. package/dist/utils/lifecycle-generation.js.map +1 -1
  487. package/dist/utils/llm-json-array.js.map +1 -1
  488. package/dist/utils/llm-selection.js.map +1 -1
  489. package/dist/utils/logger.js.map +1 -1
  490. package/dist/utils/model-provider-family.js.map +1 -1
  491. package/dist/utils/model-tier.js.map +1 -1
  492. package/dist/utils/openclaw-agent-defaults.js.map +1 -1
  493. package/dist/utils/path.js.map +1 -1
  494. package/dist/utils/plugin-root.js.map +1 -1
  495. package/dist/utils/plugin-update-check.js.map +1 -1
  496. package/dist/utils/procedure-risk.js.map +1 -1
  497. package/dist/utils/progress-indicators.js.map +1 -1
  498. package/dist/utils/prompt-loader.js.map +1 -1
  499. package/dist/utils/provenance.js.map +1 -1
  500. package/dist/utils/provider-detection.js.map +1 -1
  501. package/dist/utils/registration-superseded.js.map +1 -1
  502. package/dist/utils/salience.js.map +1 -1
  503. package/dist/utils/sanitize-messages.js.map +1 -1
  504. package/dist/utils/scope-filter.js.map +1 -1
  505. package/dist/utils/skill-discovery.js.map +1 -1
  506. package/dist/utils/sqlite-file-perms.js.map +1 -1
  507. package/dist/utils/sqlite-outcome-compat.js.map +1 -1
  508. package/dist/utils/sqlite-transaction.js.map +1 -1
  509. package/dist/utils/stable-stringify.js.map +1 -1
  510. package/dist/utils/subagent-ended-utils.js.map +1 -1
  511. package/dist/utils/tags.js.map +1 -1
  512. package/dist/utils/text.js.map +1 -1
  513. package/dist/utils/timeout.js.map +1 -1
  514. package/dist/utils/typebox.js.map +1 -1
  515. package/dist/utils/version-check.js.map +1 -1
  516. package/dist/utils/wal-replay.js.map +1 -1
  517. package/dist/versionInfo.js.map +1 -1
  518. package/index.ts +2 -2
  519. package/lifecycle/hooks.ts +0 -1
  520. package/npm-shrinkwrap.json +487 -186
  521. package/openclaw.plugin.json +1 -1
  522. package/package.json +2 -2
  523. package/services/adaptive-catch-up-pacing.ts +28 -0
  524. package/services/chat.ts +34 -1
  525. package/services/cron-job-bash-harness.ts +52 -5
  526. package/services/embeddings/shared.ts +5 -2
  527. package/services/entity-enrichment-adaptive.ts +245 -0
  528. package/services/entity-enrichment-cli.ts +553 -47
  529. package/services/entity-enrichment.ts +43 -2
  530. package/services/llm-rate-limit-headers.ts +1 -4
  531. package/services/maintenance-log-analyzer.ts +13 -9
  532. package/services/reinforcement-extract.ts +19 -0
  533. package/setup/hybrid-memory-reload-coordinator.ts +26 -0
  534. package/setup/register-plugin.ts +62 -32
  535. 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 { is500OrWrapped } from "../../../services/chat.js";
19
- import { getEnv } from "../../../utils/env-manager.js";
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, approxIntervalMs, withExit } from "../../shared.js";
32
+ import { approxIntervalMs, type Chainable, withExit } from "../../shared.js";
23
33
  import type { ManageBindings } from "./bindings.js";
24
- import type { MemoryEntry } from "../../../types/memory.js";
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 totalBatches = batchSize > 0 ? Math.ceil(candidates.length / batchSize) : 0;
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
- for (let offset = 0; offset < candidates.length; offset += batchSize) {
817
+ let offset = 0;
818
+ while (offset < candidates.length) {
717
819
  if (providerCircuitBreak) break;
718
- batchNumber = Math.floor(offset / batchSize) + 1;
719
- const batch = candidates.slice(offset, offset + batchSize);
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}/${totalBatches}`,
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((b) => `${b.key} actual=${b.actual} target=${b.target}`).join("; ")}`,
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((b) => `${b.key} actual=${b.actual} target=${b.target}`).join(", ")}`,
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
- }) => Promise<{
157
- pending: number;
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, registerUserFriendlyCommands } from "./cmd-user-friendly.js";
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, registerVerifyCommands } from "./verify.js";
55
+ import { registerVerifyCommands, type VerifyContext } from "./verify.js";
56
56
 
57
57
  export type {
58
- FindDuplicatesResult,
59
- StoreCliOpts,
60
- StoreCliResult,
61
- InstallCliResult,
62
- VerifyCliSink,
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
- DistillCliResult,
74
- DistillCliSink,
75
+ InstallCliResult,
76
+ MigrateToVaultResult,
77
+ RecordDistillResult,
75
78
  SelfCorrectionExtractResult,
76
79
  SelfCorrectionRunResult,
77
- AnalyzeFeedbackPhrasesResult,
78
- MigrateToVaultResult,
79
- CredentialsAuditResult,
80
- CredentialsPruneResult,
81
- UpgradeCliResult,
80
+ StoreCliOpts,
81
+ StoreCliResult,
82
82
  UninstallCliResult,
83
- ConfigCliResult,
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
- }) => Promise<{
298
- pending: number;
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"}