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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "openclaw-hybrid-memory",
3
3
  "kind": "memory",
4
- "version": "2026.5.310",
4
+ "version": "2026.6.10",
5
5
  "contracts": {
6
6
  "tools": [
7
7
  "active_task_checkpoint",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openclaw-hybrid-memory",
3
- "version": "2026.5.310",
3
+ "version": "2026.6.10",
4
4
  "type": "module",
5
5
  "description": "Give your OpenClaw agent lasting memory: structured facts, semantic search, auto-capture & recall, decay, optional credential vault. Part of Hybrid Memory v3.",
6
6
  "files": [
@@ -50,7 +50,7 @@
50
50
  "openclaw": ">=2026.5.0 <2027"
51
51
  },
52
52
  "dependencies": {
53
- "@lancedb/lancedb": "^0.29.0",
53
+ "@lancedb/lancedb": "^0.30.0",
54
54
  "@types/node": "^25.2.3",
55
55
  "commander": "^13.1.0",
56
56
  "franc": "^6.2.0",
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Adaptive catch-up pressure backoff: provider Retry-After is a hard floor and is not
3
+ * reduced by the normal adaptive max-delay cap (used only when no Retry-After hint).
4
+ */
5
+ export function computeAdaptivePressureDelayMs(opts: {
6
+ currentDelayMs: number;
7
+ batchRetryAfterMs?: number;
8
+ maxAdaptiveDelayMs: number;
9
+ backoffMinDelayMs: number;
10
+ }): number {
11
+ const retryAfterFloor = opts.batchRetryAfterMs ?? 0;
12
+ const retryAfterDelay = Math.max(retryAfterFloor, opts.currentDelayMs);
13
+ const scaledDelay = Math.ceil(retryAfterDelay * 1.5);
14
+ const computed = Math.max(opts.backoffMinDelayMs, scaledDelay, retryAfterFloor);
15
+ if (retryAfterFloor > 0) {
16
+ return computed;
17
+ }
18
+ return Math.min(opts.maxAdaptiveDelayMs, computed);
19
+ }
20
+
21
+ /** Cap inter-batch sleep so a configured time budget is not exceeded by pacing delay. */
22
+ export function capDelayMsByDeadline(delayMs: number, deadlineMs: number | undefined, nowMs = Date.now()): number {
23
+ if (delayMs <= 0) return 0;
24
+ if (deadlineMs == null) return delayMs;
25
+ const remainingMs = deadlineMs - nowMs;
26
+ if (remainingMs <= 0) return 0;
27
+ return Math.min(delayMs, remainingMs);
28
+ }
package/services/chat.ts CHANGED
@@ -193,6 +193,13 @@ export function is429OrWrapped(err: Error): boolean {
193
193
  return false;
194
194
  }
195
195
 
196
+ /** Returns true when the error is a ByteString serialization failure — direct or wrapped in LLMRetryError. */
197
+ export function isByteStringOrWrapped(err: Error): boolean {
198
+ if (isByteStringSerializationError(err)) return true;
199
+ if (err instanceof LLMRetryError && isByteStringSerializationError(err.cause)) return true;
200
+ return false;
201
+ }
202
+
196
203
  /**
197
204
  * Unified 5xx / internal server error detection helper.
198
205
  * Checks HTTP status code property first, then uses conservative message patterns.
@@ -347,6 +354,17 @@ function is400EmptyBodyGatewayError(err: unknown): boolean {
347
354
  return /\b400\b.*\bno body\b/i.test(err.message);
348
355
  }
349
356
 
357
+ /**
358
+ * True when the error is a Node.js / browser-fetch ByteString serialization failure.
359
+ * Thrown by the HTTP layer when a header value contains a character with code point > 255
360
+ * (e.g. U+2026 HORIZONTAL ELLIPSIS in a copy-pasted API key, model name, or custom header).
361
+ * These errors are permanent — retrying the same request will always fail (#1776).
362
+ */
363
+ export function isByteStringSerializationError(err: unknown): boolean {
364
+ if (!(err instanceof Error)) return false;
365
+ return /cannot convert argument to a bytestring/i.test(err.message);
366
+ }
367
+
350
368
  /** Some Azure/Foundry deployments return 400 when chat params are not supported for the model (#1165). */
351
369
  function is400UnsupportedOperationError(err: unknown): boolean {
352
370
  if (!(err instanceof Error)) return false;
@@ -537,7 +555,8 @@ export async function chatComplete(opts: {
537
555
  is404Like(err) || // #303: model not found = wrong model name in config, not a bug
538
556
  is403Like(err) || // #394: country/region restriction = operator config issue, not a bug
539
557
  is401Like(err) || // #475: invalid API key = operator config issue, not a bug
540
- isContextLengthError(err); // #488: input too long for model context window = wrong model choice, not a bug
558
+ isContextLengthError(err) || // #488: input too long for model context window = wrong model choice, not a bug
559
+ isByteStringSerializationError(err); // #1776: non-ASCII in HTTP header = config issue, not a bug
541
560
  if (!isTransient && !isConfigError) {
542
561
  capturePluginError(error, {
543
562
  subsystem: "chat",
@@ -649,6 +668,11 @@ export async function withLLMRetry<T>(
649
668
  );
650
669
  throw enrichLlmErrorMessage(lastError, opts?.llmContext);
651
670
  }
671
+ // Don't retry ByteString serialization errors — a non-ASCII character (e.g. U+2026 ELLIPSIS)
672
+ // in an HTTP header value (API key, model name, custom header) cannot be fixed by retrying (#1776).
673
+ if (isByteStringOrWrapped(lastError)) {
674
+ throw enrichLlmErrorMessage(lastError, opts?.llmContext);
675
+ }
652
676
  const isReasoningSequenceError = isResponsesReasoningSequenceError(lastError);
653
677
  // Azure/OpenAI Responses API intermittent malformed reasoning item sequence:
654
678
  // allow one retry, then fail fast so fallback model can run.
@@ -941,6 +965,7 @@ export async function chatCompleteWithRetryDetailed(opts: {
941
965
  const finalIsOOM = isOllamaOOM(finalError); // #387: OOM is expected when model too large for RAM
942
966
  const finalIs429 = is429OrWrapped(finalError); // #397
943
967
  const finalIsContextLength = isContextLengthError(finalError); // #488: input too long for model context window
968
+ const finalIsByteString = isByteStringOrWrapped(finalError); // #1776: non-ASCII in HTTP header = config issue
944
969
  const finalIsReasoningSequence = isResponsesReasoningSequenceError(finalError); // #1034
945
970
  /** Unwraps LLMRetryError so "Request was aborted" in the cause is detected (#935, #936). */
946
971
  const finalIsTransientLlm = isAbortOrTransientLlmError(finalError);
@@ -968,6 +993,7 @@ export async function chatCompleteWithRetryDetailed(opts: {
968
993
  !finalIs500 &&
969
994
  !finalIsOOM &&
970
995
  !finalIsContextLength && // #488: context window exceeded = config issue, not a bug
996
+ !finalIsByteString && // #1776: non-ASCII in HTTP header = config issue, not a bug
971
997
  !finalIsUnconfigured &&
972
998
  !finalIsTransientLlm &&
973
999
  !finalIs403 &&
@@ -996,6 +1022,13 @@ export async function chatCompleteWithRetryDetailed(opts: {
996
1022
  "Consider using a model with a larger context window or reducing input size. " +
997
1023
  "Run: openclaw hybrid-mem verify --test-llm",
998
1024
  );
1025
+ } else if (finalIsByteString) {
1026
+ // #1776: ByteString serialization error (non-ASCII in HTTP header) — config issue, not a code bug
1027
+ pendingWarnings?.add(
1028
+ "⚠️ Memory plugin: LLM request contains non-ASCII characters in HTTP headers (API key, model name, or custom header). " +
1029
+ "Check your provider configuration for invalid characters (e.g. copy-pasted ellipsis U+2026). " +
1030
+ "Run: openclaw hybrid-mem verify --test-llm",
1031
+ );
999
1032
  } else if (finalIs500) {
1000
1033
  // #302: 500 server errors are transient — don't report to GlitchTip; request will be retried naturally
1001
1034
  } else if (finalIs404) {
@@ -144,18 +144,65 @@ export function buildHybridMemCronBashBody(
144
144
  ' return "$original_ec"',
145
145
  " fi",
146
146
  " HM_VALIDATED=1",
147
+ ' local signal_during_validate=""',
148
+ " trap 'signal_during_validate=143' TERM INT",
149
+ " trap 'signal_during_validate=129' HUP",
150
+ " trap 'signal_during_validate=131' QUIT",
147
151
  " set +e",
148
152
  ' echo "--- validate-cron-exit ---" | tee -a "$HM_LOG"',
149
- ' openclaw hybrid-mem validate-cron-exit --exit-path "$HM_EXIT" --log-path "$HM_LOG" --required-steps "${HM_REQUIRED_STEPS[@]}" --allow-skip --json 2>&1 | tee -a "$HM_LOG"',
153
+ " local validate_output",
154
+ ' validate_output="$(mktemp "${TMPDIR:-/tmp}/hm-validate-XXXXXX")"',
155
+ ' openclaw hybrid-mem validate-cron-exit --exit-path "$HM_EXIT" --log-path "$HM_LOG" --required-steps "${HM_REQUIRED_STEPS[@]}" --allow-skip --json 2>&1 | tee -a "$HM_LOG" "$validate_output"',
150
156
  ' local validation_ec="${PIPESTATUS[0]}"',
151
- " set -e",
157
+ ' local maintenance_status=""',
158
+ " # Parse maintenanceStatus without jq to keep cron harness dependencies minimal/portable.",
159
+ ' maintenance_status="$(grep -Eo \'"maintenanceStatus"[[:space:]]*:[[:space:]]*"(success|skipped|partial|failed)"\' "$validate_output" | tail -n1 | sed -E \'s/.*"(success|skipped|partial|failed)"/\\1/\' || true)"',
160
+ ' rm -f "$validate_output"',
161
+ ' local final_ec="$validation_ec"',
162
+ " # Preserve original non-zero (step/signal) failure code; validation is supplemental diagnostics.",
152
163
  ' if [ "$original_ec" -ne 0 ]; then',
153
- ' return "$original_ec"',
164
+ ' if [ "$validation_ec" -ne 0 ] && [ "$validation_ec" -ne "$original_ec" ]; then',
165
+ ' echo "WARNING: validate-cron-exit failed with different exit code than original failure: validation_exit=${validation_ec} original_exit=${original_ec}" | tee -a "$HM_LOG"',
166
+ " fi",
167
+ ' final_ec="$original_ec"',
168
+ " fi",
169
+ ' if [ "$original_ec" -eq 0 ] && [ -n "$signal_during_validate" ]; then',
170
+ ' final_ec="$signal_during_validate"',
171
+ " fi",
172
+ ' local final_label="FAILED"',
173
+ ' if [ -n "$maintenance_status" ]; then',
174
+ ' case "$maintenance_status" in',
175
+ ' success) final_label="SUCCESS" ;;',
176
+ ' skipped) final_label="SKIPPED" ;;',
177
+ ' partial) final_label="PARTIAL" ;;',
178
+ " esac",
179
+ ' elif [ "$final_ec" -eq 0 ]; then',
180
+ ' final_label="SUCCESS"',
154
181
  " fi",
155
- ' return "$validation_ec"',
182
+ ' local ledger_status=""',
183
+ ' if [ -n "$maintenance_status" ]; then',
184
+ ' case "$maintenance_status" in',
185
+ ' success) ledger_status="ok" ;;',
186
+ ' failed) ledger_status="failed" ;;',
187
+ ' skipped) ledger_status="skipped" ;;',
188
+ ' partial) ledger_status="failed" ;;',
189
+ " esac",
190
+ " fi",
191
+ ' local status_suffix=""',
192
+ ' if [ -n "$ledger_status" ]; then',
193
+ ' status_suffix=" status=${ledger_status} reason=maintenance_${maintenance_status}"',
194
+ " fi",
195
+ " # HM_VALIDATED guard ensures this final validation row is written at most once per run.",
196
+ ' echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) validate-cron-exit exit=${validation_ec}${status_suffix}" >>"$HM_EXIT"',
197
+ ' echo "${final_label}: ${HM_JOB}" | tee -a "$HM_LOG"',
198
+ ' echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) ${HM_JOB} exit=${final_ec}" | tee -a "$HM_LOG"',
199
+ " set -e",
200
+ ' return "$final_ec"',
156
201
  "}",
157
202
  "trap 'ec=$?; trap - EXIT; hm_validate \"$ec\"; exit $?' EXIT",
158
- "trap 'trap - TERM INT; hm_validate 143; exit $?' TERM INT",
203
+ "trap 'trap - TERM INT HUP QUIT; hm_validate 143; exit $?' TERM INT",
204
+ "trap 'trap - TERM INT HUP QUIT; hm_validate 129; exit $?' HUP",
205
+ "trap 'trap - TERM INT HUP QUIT; hm_validate 131; exit $?' QUIT",
159
206
  "",
160
207
  ...lines,
161
208
  ].join("\n");
@@ -10,6 +10,7 @@ import {
10
10
  is404Like,
11
11
  is429OrWrapped,
12
12
  is500OrWrapped,
13
+ isByteStringSerializationError,
13
14
  isContextLengthError,
14
15
  } from "../chat.js";
15
16
  import { capturePluginError } from "../error-reporter.js";
@@ -195,7 +196,8 @@ export function shouldSuppressEmbeddingError(err: unknown): boolean {
195
196
  is500OrWrapped(err) ||
196
197
  isOllamaCircuitBreakerOpen(err) ||
197
198
  isOllamaConnectionFailure(err) ||
198
- isContextLengthError(err)
199
+ isContextLengthError(err) ||
200
+ isByteStringSerializationError(err)
199
201
  ) {
200
202
  return true;
201
203
  }
@@ -209,7 +211,8 @@ export function shouldSuppressEmbeddingError(err: unknown): boolean {
209
211
  is500OrWrapped(c) ||
210
212
  isOllamaCircuitBreakerOpen(c) ||
211
213
  isOllamaConnectionFailure(c) ||
212
- isContextLengthError(c),
214
+ isContextLengthError(c) ||
215
+ isByteStringSerializationError(c),
213
216
  );
214
217
  }
215
218
  return false;
@@ -0,0 +1,245 @@
1
+ /** Adaptive enrich-entities catch-up: budgets, summaries, and vectorless SLO repair hints. */
2
+
3
+ export const VECTORLESS_SLO_TARGET_RATIO = 0.02;
4
+
5
+ export type EntityEnrichmentStopReason = "completed" | "time_budget" | "provider_budget" | "exhausted";
6
+
7
+ /** Issue #1791 suggested telemetry field names. */
8
+ export type Issue1791AdaptiveTelemetry = {
9
+ mode: "adaptive-catchup";
10
+ processed: number;
11
+ enriched: number;
12
+ remaining: number;
13
+ durationSec: number;
14
+ avgSecPerFact: number;
15
+ provider429s: number;
16
+ timeouts: number;
17
+ batchSizeStart: number;
18
+ batchSizeEnd: number;
19
+ delayMsStart: number;
20
+ delayMsEnd: number;
21
+ concurrencyStart: number;
22
+ concurrencyEnd: number;
23
+ stopReason: EntityEnrichmentStopReason;
24
+ nextRecommendedLimit: number;
25
+ nextRecommendedTimeoutSec?: number;
26
+ estimatedRunsRemaining: number;
27
+ etaSeconds?: number;
28
+ };
29
+
30
+ export type EntityEnrichmentAdaptiveSummary = {
31
+ enabled: true;
32
+ durationMs: number;
33
+ avgSecondsPerFact: number;
34
+ processed: number;
35
+ remainingTotal: number;
36
+ rateLimitCount: number;
37
+ transientFailureCount: number;
38
+ timeoutFailureCount: number;
39
+ llmFailureCount: number;
40
+ startBatchSize: number;
41
+ endBatchSize: number;
42
+ startDelayMs: number;
43
+ endDelayMs: number;
44
+ startConcurrency: number;
45
+ endConcurrency: number;
46
+ stopReason: EntityEnrichmentStopReason;
47
+ timeBudgetSec?: number;
48
+ estimatedRunsRemaining: number;
49
+ etaSecondsAtCurrentLimit?: number;
50
+ nextRecommendedLimit: number;
51
+ nextRecommendedTimeoutSec?: number;
52
+ };
53
+
54
+ export type VectorlessSloRepairRecommendation = {
55
+ /** SLO ratio uses global vectorless counts (audit-health target is store-wide). */
56
+ sloScope: "global";
57
+ targetVectorlessRatio: number;
58
+ activeFacts: number;
59
+ vectorlessBefore: number;
60
+ vectorlessAfter: number;
61
+ /** When a run used --source, these reflect that filter only (not used for sloMetAfterRun). */
62
+ scopedSource?: string;
63
+ scopedVectorlessBefore?: number;
64
+ scopedVectorlessAfter?: number;
65
+ vectorlessRatioBefore: number;
66
+ vectorlessRatioAfter: number;
67
+ maxVectorlessAtTarget: number;
68
+ vectorlessToClearForSlo: number;
69
+ embeddedThisRun: number;
70
+ recommendedLimitNextRun: number;
71
+ recommendedBatchSizeNextRun: number;
72
+ estimatedRunsToReachSlo: number;
73
+ sloMetAfterRun: boolean;
74
+ };
75
+
76
+ export function sanitizeTimeBudgetSec(n: number | undefined): number | undefined {
77
+ if (n === undefined) return undefined;
78
+ const x = Math.floor(Number(n));
79
+ if (!Number.isFinite(x) || x < 1) return undefined;
80
+ return Math.min(86_400, x);
81
+ }
82
+
83
+ export function sanitizeMaxConcurrency(n: number | undefined, adaptiveCatchUp: boolean): number {
84
+ const x = Math.floor(Number(n ?? (adaptiveCatchUp ? 3 : 1)));
85
+ if (!Number.isFinite(x) || x < 1) return adaptiveCatchUp ? 3 : 1;
86
+ return Math.min(adaptiveCatchUp ? 16 : 1, x);
87
+ }
88
+
89
+ export function isLlmTimeoutLike(message: string): boolean {
90
+ const msg = message.toLowerCase();
91
+ return /timed out|llm request timeout|request was aborted/.test(msg);
92
+ }
93
+
94
+ /** Walk LLMRetryError `.cause` chains so wrapped timeouts still count toward pressure budgets. */
95
+ export function errorIndicatesLlmTimeout(err: unknown): boolean {
96
+ let e: unknown = err;
97
+ while (e instanceof Error) {
98
+ if (isLlmTimeoutLike(e.message)) return true;
99
+ if (e.name === "LLMRetryError" && "cause" in e) {
100
+ e = (e as { cause: unknown }).cause;
101
+ continue;
102
+ }
103
+ break;
104
+ }
105
+ return false;
106
+ }
107
+
108
+ export function buildEntityEnrichmentAdaptiveSummary(input: {
109
+ startedAtMs: number;
110
+ processed: number;
111
+ remainingTotal: number;
112
+ limit: number;
113
+ mode: "bounded" | "all";
114
+ rateLimitCount: number;
115
+ transientFailureCount: number;
116
+ timeoutFailureCount: number;
117
+ llmFailureCount: number;
118
+ startBatchSize: number;
119
+ endBatchSize: number;
120
+ startDelayMs: number;
121
+ endDelayMs: number;
122
+ startConcurrency: number;
123
+ endConcurrency: number;
124
+ stopReason: EntityEnrichmentStopReason;
125
+ timeBudgetSec?: number;
126
+ }): EntityEnrichmentAdaptiveSummary {
127
+ const durationMs = Math.max(0, Date.now() - input.startedAtMs);
128
+ const avgSecondsPerFact = input.processed > 0 ? Number((durationMs / 1000 / input.processed).toFixed(3)) : 0;
129
+ const estimatedRunsRemaining = input.mode === "all" ? 0 : Math.ceil(input.remainingTotal / Math.max(1, input.limit));
130
+ const factsPerRun = Math.max(1, input.processed);
131
+ const nextRecommendedLimit = Math.max(
132
+ input.limit,
133
+ Math.min(100_000, Math.ceil(input.remainingTotal / Math.max(1, estimatedRunsRemaining || 1))),
134
+ );
135
+ const etaSecondsAtCurrentLimit =
136
+ input.processed > 0 && input.remainingTotal > 0
137
+ ? Math.ceil((durationMs / 1000 / input.processed) * input.remainingTotal)
138
+ : undefined;
139
+ const nextRecommendedTimeoutSec =
140
+ input.timeoutFailureCount > 0
141
+ ? Math.min(600, Math.max(60, Math.ceil(Math.max(avgSecondsPerFact, 1) * 3)))
142
+ : undefined;
143
+
144
+ return {
145
+ enabled: true,
146
+ durationMs,
147
+ avgSecondsPerFact,
148
+ processed: input.processed,
149
+ remainingTotal: input.remainingTotal,
150
+ rateLimitCount: input.rateLimitCount,
151
+ transientFailureCount: input.transientFailureCount,
152
+ timeoutFailureCount: input.timeoutFailureCount,
153
+ llmFailureCount: input.llmFailureCount,
154
+ startBatchSize: input.startBatchSize,
155
+ endBatchSize: input.endBatchSize,
156
+ startDelayMs: input.startDelayMs,
157
+ endDelayMs: input.endDelayMs,
158
+ startConcurrency: input.startConcurrency,
159
+ endConcurrency: input.endConcurrency,
160
+ stopReason: input.stopReason,
161
+ timeBudgetSec: input.timeBudgetSec,
162
+ estimatedRunsRemaining,
163
+ etaSecondsAtCurrentLimit,
164
+ nextRecommendedLimit,
165
+ nextRecommendedTimeoutSec,
166
+ };
167
+ }
168
+
169
+ export function buildIssue1791AdaptiveTelemetry(
170
+ summary: EntityEnrichmentAdaptiveSummary,
171
+ factsEnriched: number,
172
+ ): Issue1791AdaptiveTelemetry {
173
+ return {
174
+ mode: "adaptive-catchup",
175
+ processed: summary.processed,
176
+ enriched: factsEnriched,
177
+ remaining: summary.remainingTotal,
178
+ durationSec: Number((summary.durationMs / 1000).toFixed(1)),
179
+ avgSecPerFact: summary.avgSecondsPerFact,
180
+ provider429s: summary.rateLimitCount,
181
+ timeouts: summary.timeoutFailureCount,
182
+ batchSizeStart: summary.startBatchSize,
183
+ batchSizeEnd: summary.endBatchSize,
184
+ delayMsStart: summary.startDelayMs,
185
+ delayMsEnd: summary.endDelayMs,
186
+ concurrencyStart: summary.startConcurrency,
187
+ concurrencyEnd: summary.endConcurrency,
188
+ stopReason: summary.stopReason,
189
+ nextRecommendedLimit: summary.nextRecommendedLimit,
190
+ nextRecommendedTimeoutSec: summary.nextRecommendedTimeoutSec,
191
+ estimatedRunsRemaining: summary.estimatedRunsRemaining,
192
+ etaSeconds: summary.etaSecondsAtCurrentLimit,
193
+ };
194
+ }
195
+
196
+ export function buildVectorlessSloRepairRecommendation(input: {
197
+ activeFacts: number;
198
+ vectorlessBefore: number;
199
+ vectorlessAfter: number;
200
+ embeddedThisRun: number;
201
+ runLimit: number;
202
+ effectiveBatchSize?: number;
203
+ scopedSource?: string;
204
+ scopedVectorlessBefore?: number;
205
+ scopedVectorlessAfter?: number;
206
+ }): VectorlessSloRepairRecommendation {
207
+ const activeFacts = Math.max(0, input.activeFacts);
208
+ const vectorlessBefore = Math.max(0, input.vectorlessBefore);
209
+ const vectorlessAfter = Math.max(0, input.vectorlessAfter);
210
+ const vectorlessRatioBefore = activeFacts > 0 ? vectorlessBefore / activeFacts : 0;
211
+ const vectorlessRatioAfter = activeFacts > 0 ? vectorlessAfter / activeFacts : 0;
212
+ const maxVectorlessAtTarget = Math.floor(activeFacts * VECTORLESS_SLO_TARGET_RATIO);
213
+ const vectorlessToClearForSlo = Math.max(0, vectorlessAfter - maxVectorlessAtTarget);
214
+ const embeddedPerRun = Math.max(1, input.embeddedThisRun);
215
+ const recommendedLimitNextRun = Math.max(input.runLimit, embeddedPerRun);
216
+ const recommendedBatchSizeNextRun = Math.max(1, input.effectiveBatchSize ?? embeddedPerRun);
217
+ const estimatedRunsToReachSlo = Math.ceil(vectorlessToClearForSlo / embeddedPerRun);
218
+
219
+ return {
220
+ sloScope: "global",
221
+ targetVectorlessRatio: VECTORLESS_SLO_TARGET_RATIO,
222
+ activeFacts,
223
+ vectorlessBefore,
224
+ vectorlessAfter,
225
+ vectorlessRatioBefore: Number(vectorlessRatioBefore.toFixed(4)),
226
+ vectorlessRatioAfter: Number(vectorlessRatioAfter.toFixed(4)),
227
+ maxVectorlessAtTarget,
228
+ vectorlessToClearForSlo,
229
+ embeddedThisRun: input.embeddedThisRun,
230
+ recommendedLimitNextRun,
231
+ recommendedBatchSizeNextRun,
232
+ estimatedRunsToReachSlo,
233
+ sloMetAfterRun: vectorlessRatioAfter <= VECTORLESS_SLO_TARGET_RATIO,
234
+ scopedSource: input.scopedSource,
235
+ scopedVectorlessBefore: input.scopedVectorlessBefore,
236
+ scopedVectorlessAfter: input.scopedVectorlessAfter,
237
+ };
238
+ }
239
+
240
+ export function sanitizeProviderPressureBudget(n: number | undefined): number | undefined {
241
+ if (n === undefined) return undefined;
242
+ const x = Math.floor(Number(n));
243
+ if (!Number.isFinite(x) || x < 1) return undefined;
244
+ return Math.min(10_000, x);
245
+ }