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
@@ -49,6 +49,8 @@ import type { ToolRegistrationHandle } from "../setup/register-tools.js";
49
49
  export interface PluginRuntime {
50
50
  // --- Config & resolved paths ---
51
51
  cfg: HybridMemoryConfig;
52
+ /** Parse-time config snapshot for hot-reload reuse checks (bootstrap may mutate `cfg`). */
53
+ parsedCfgSnapshot: HybridMemoryConfig;
52
54
  resolvedLancePath: string;
53
55
  resolvedSqlitePath: string;
54
56
 
@@ -925,7 +925,7 @@ export async function resolveContradictionsAutonomously(
925
925
  if (applied) decisionsApplied++;
926
926
  }
927
927
  continue;
928
- } else if (lww.eligible && isFactVerified(db, contradiction.factIdOld)) {
928
+ } else if (isFactVerified(db, contradiction.factIdOld)) {
929
929
  reviewItem.suggestedReason = "Older fact is verified; leaving for manual review.";
930
930
  }
931
931
 
@@ -15,11 +15,75 @@ import type { HandlerContext } from "./handlers.js";
15
15
  import { acquireScanSlot, clearScanLock } from "./shared.js";
16
16
 
17
17
  import { getSessionFilePathsSince, getMaxMtime } from "./cmd-extract-sessions.js";
18
+
19
+ const VECTOR_CANDIDATE_LIMIT = 10;
20
+ const VECTOR_CANDIDATE_OVERFETCH_LIMIT = 50;
21
+ const VECTOR_CANDIDATE_MIN_SCORE = 0;
22
+
23
+ /**
24
+ * Identifies transient/retryable store errors (SQLite busy, network issues) vs permanent errors.
25
+ * Permanent errors (TypeError, schema bugs, etc.) should not block cursor advancement.
26
+ */
27
+ function isRetryableStoreError(err: unknown): boolean {
28
+ const message = err instanceof Error ? err.message : String(err);
29
+ const code =
30
+ typeof err === "object" && err !== null && "code" in err ? String((err as { code?: unknown }).code ?? "") : "";
31
+
32
+ // SQLite busy/lock errors are retryable
33
+ if (/SQLITE_BUSY|database is locked/i.test(message) || /SQLITE_BUSY/i.test(code)) {
34
+ return true;
35
+ }
36
+
37
+ // Transient network errors are retryable
38
+ if (
39
+ /ECONNREFUSED|ECONNRESET|ETIMEDOUT|ENOTFOUND|EAI_AGAIN|EHOSTUNREACH|socket hang up|fetch failed|network timeout|connect\s+ETIMEDOUT/i.test(
40
+ message,
41
+ ) ||
42
+ /ECONNREFUSED|ECONNRESET|ETIMEDOUT|ENOTFOUND|EHOSTUNREACH/i.test(code)
43
+ ) {
44
+ return true;
45
+ }
46
+
47
+ // All other errors (TypeError, schema bugs, programming errors) are permanent
48
+ return false;
49
+ }
50
+
51
+ function getVectorSearchFailReason(vectorDb: unknown): string | null {
52
+ const getter = (vectorDb as { getLastSearchFailReason?: unknown }).getLastSearchFailReason;
53
+ if (typeof getter !== "function") return null;
54
+ try {
55
+ const reason = getter.call(vectorDb);
56
+ return typeof reason === "string" && reason.length > 0 ? reason : null;
57
+ } catch {
58
+ return null;
59
+ }
60
+ }
61
+
62
+ function isLiveFact(candidate: { supersededAt?: number | null; expiresAt?: number | null }): boolean {
63
+ const nowSec = Math.floor(Date.now() / 1000);
64
+ return candidate.supersededAt == null && (candidate.expiresAt == null || candidate.expiresAt > nowSec);
65
+ }
66
+
18
67
  export async function runExtractDirectivesForCli(
19
68
  ctx: HandlerContext,
20
69
  opts: { days?: number; verbose?: boolean; dryRun?: boolean; full?: boolean },
21
- ): Promise<DirectiveExtractResult & { stored?: number; partial?: boolean; dedupeDegraded?: boolean }> {
22
- const { factsDb, vectorDb, cfg, logger } = ctx;
70
+ ): Promise<
71
+ DirectiveExtractResult & {
72
+ stored?: number;
73
+ partial?: boolean;
74
+ dedupeDegraded?: boolean;
75
+ directiveDedupeMode?: "vector" | "lexical-only" | "mixed";
76
+ directiveRejected?: {
77
+ permanent: number;
78
+ retryable: number;
79
+ parserOrModelFailure: number;
80
+ boundedPartialRetry: number;
81
+ };
82
+ cursorAdvanced?: boolean;
83
+ cursorBlockedReason?: "retryable_rejections" | "parser_or_model_failure" | "bounded_partial_retry";
84
+ }
85
+ > {
86
+ const { factsDb, vectorDb, embeddings, cfg, logger } = ctx;
23
87
  const SCAN_TYPE = "extract-directives";
24
88
  logger.info?.("memory-hybrid: extract-directives — regex extraction (no LLM model selection)");
25
89
  const sessionDir = cfg.procedures.sessionsDir;
@@ -87,6 +151,11 @@ export async function runExtractDirectivesForCli(
87
151
  // Store directives as facts if not dry-run
88
152
  let stored = 0;
89
153
  let storeDedupeVectorFallbackSuppressed = 0;
154
+ let vectorDedupeStores = 0;
155
+ let lexicalOnlyDedupeStores = 0;
156
+ let retryableRejected = 0;
157
+ let parserOrModelRejected = 0;
158
+ let boundedPartialRetryRejected = 0;
90
159
  if (!opts.dryRun) {
91
160
  for (const incident of result.incidents) {
92
161
  try {
@@ -111,10 +180,59 @@ export async function runExtractDirectivesForCli(
111
180
  ? "fact"
112
181
  : "other";
113
182
  const source = `directive:${incident.sessionFile}`;
114
- const shouldCountVectorFallback = shouldReportVectorDedupeFallback({
183
+ let vector: number[] | undefined;
184
+ let vectorCandidates: Array<{ id: string; score: number }> | undefined;
185
+ try {
186
+ vector = await embeddings.embed(incident.extractedRule);
187
+ if (cfg.store?.fuzzyDedupe ?? true) {
188
+ const sourceScope = "global";
189
+ const sourceScopeTarget = null;
190
+ const embeddingModelName =
191
+ typeof embeddings.modelName === "string" && embeddings.modelName.trim().length > 0
192
+ ? embeddings.modelName
193
+ : null;
194
+ const neighbors = await vectorDb.search(
195
+ vector,
196
+ VECTOR_CANDIDATE_OVERFETCH_LIMIT,
197
+ VECTOR_CANDIDATE_MIN_SCORE,
198
+ );
199
+ if (!getVectorSearchFailReason(vectorDb)) {
200
+ vectorCandidates = neighbors
201
+ .map((candidate) => ({
202
+ id: candidate.entry.id,
203
+ score: candidate.score,
204
+ }))
205
+ .filter(
206
+ (candidate) =>
207
+ typeof candidate.id === "string" && candidate.id.length > 0 && Number.isFinite(candidate.score),
208
+ )
209
+ .filter((candidate) => {
210
+ const fact = factsDb.getById(candidate.id);
211
+ return (
212
+ fact != null &&
213
+ isLiveFact(fact) &&
214
+ fact.source.startsWith("directive:") &&
215
+ (fact.scope ?? "global") === sourceScope &&
216
+ (fact.scope === "global" ? null : (fact.scopeTarget ?? null)) === sourceScopeTarget &&
217
+ (embeddingModelName == null ||
218
+ fact.embeddingModel == null ||
219
+ fact.embeddingModel === embeddingModelName)
220
+ );
221
+ })
222
+ .slice(0, VECTOR_CANDIDATE_LIMIT);
223
+ }
224
+ }
225
+ } catch (err) {
226
+ capturePluginError(err instanceof Error ? err : new Error(String(err)), {
227
+ subsystem: "cli",
228
+ operation: "runExtractDirectivesForCli:vector-candidates",
229
+ });
230
+ }
231
+ const usedLexicalOnlyFallback = shouldReportVectorDedupeFallback({
115
232
  source,
116
233
  fuzzyDedupe: cfg.store?.fuzzyDedupe ?? true,
117
234
  storeConfig: cfg.store,
235
+ vectorCandidates,
118
236
  });
119
237
  const storeResult = factsDb.storeWithResult(
120
238
  {
@@ -131,13 +249,24 @@ export async function runExtractDirectivesForCli(
131
249
  tags: ["directive-extract", ...incident.categories.map((c) => `directive:${c}`)],
132
250
  },
133
251
  {
252
+ vectorCandidates,
134
253
  warnContext: "extract-directives",
135
254
  suppressVectorFallbackWarning: true,
136
255
  },
137
256
  );
257
+ const usedVectorCandidates = Boolean(vectorCandidates && vectorCandidates.length > 0);
258
+ if (usedLexicalOnlyFallback) {
259
+ storeDedupeVectorFallbackSuppressed++;
260
+ lexicalOnlyDedupeStores++;
261
+ } else if (usedVectorCandidates) {
262
+ vectorDedupeStores++;
263
+ } else {
264
+ lexicalOnlyDedupeStores++;
265
+ }
138
266
  if (storeResult.skipped) {
139
267
  continue;
140
268
  }
269
+ const entry = storeResult.entry;
141
270
  // CRITICAL FIX (#2): Delete vector for evicted fact to prevent orphaned vectors
142
271
  await cleanupEvictedVector({
143
272
  vectorDb,
@@ -145,9 +274,57 @@ export async function runExtractDirectivesForCli(
145
274
  logger: logger,
146
275
  context: "extract-directives",
147
276
  });
148
- if (shouldCountVectorFallback) storeDedupeVectorFallbackSuppressed++;
149
- stored++;
277
+ if (storeResult.embeddingStale) {
278
+ try {
279
+ const mergedVector = await embeddings.embed(entry.text);
280
+ // Avoid pre-delete so transient store failures do not leave merged facts without any vector.
281
+ await vectorDb.store({
282
+ text: entry.text,
283
+ vector: mergedVector,
284
+ importance: entry.importance,
285
+ category: entry.category as MemoryCategory,
286
+ id: entry.id,
287
+ });
288
+ factsDb.setEmbeddingModel(entry.id, embeddings.modelName);
289
+ } catch (err) {
290
+ logger.warn?.(`memory-hybrid: extract-directives merged vector refresh failed: ${err}`);
291
+ capturePluginError(err instanceof Error ? err : new Error(String(err)), {
292
+ subsystem: "cli",
293
+ operation: "runExtractDirectivesForCli:merged-vector-refresh",
294
+ });
295
+ }
296
+ continue;
297
+ }
298
+ if (!storeResult.newlyStored) {
299
+ continue;
300
+ }
301
+ if (!vector) {
302
+ stored++;
303
+ continue;
304
+ }
305
+ try {
306
+ await vectorDb.store({
307
+ text: incident.extractedRule,
308
+ vector,
309
+ importance: 0.8,
310
+ category: category as MemoryCategory,
311
+ id: entry.id,
312
+ });
313
+ factsDb.setEmbeddingModel(entry.id, embeddings.modelName);
314
+ stored++;
315
+ } catch (err) {
316
+ logger.warn?.(`memory-hybrid: extract-directives vector store failed: ${err}`);
317
+ capturePluginError(err instanceof Error ? err : new Error(String(err)), {
318
+ subsystem: "cli",
319
+ operation: "runExtractDirectivesForCli:vector-store",
320
+ });
321
+ stored++;
322
+ }
150
323
  } catch (err) {
324
+ const isRetryable = isRetryableStoreError(err);
325
+ if (isRetryable) {
326
+ retryableRejected++;
327
+ }
151
328
  capturePluginError(err as Error, {
152
329
  subsystem: "cli",
153
330
  operation: "runExtractDirectivesForCli:store",
@@ -158,19 +335,56 @@ export async function runExtractDirectivesForCli(
158
335
 
159
336
  if (storeDedupeVectorFallbackSuppressed > 0) {
160
337
  logger.warn?.(
161
- `memory-hybrid: extract-directives DEGRADED — store dedupe used lexical-only for ${storeDedupeVectorFallbackSuppressed} store(s) (vectorCandidates not wired for this CLI path yet)`,
338
+ `memory-hybrid: extract-directives DEGRADED — store dedupe used lexical-only for ${storeDedupeVectorFallbackSuppressed} store(s) (embedding or vector search failed)`,
162
339
  );
163
340
  }
164
- const partial = (result.rejected ?? 0) > 0;
341
+ const directiveRejected = {
342
+ permanent: result.rejected ?? 0,
343
+ retryable: retryableRejected,
344
+ parserOrModelFailure: parserOrModelRejected,
345
+ boundedPartialRetry: boundedPartialRetryRejected,
346
+ };
347
+ const blockedRejections =
348
+ directiveRejected.retryable + directiveRejected.parserOrModelFailure + directiveRejected.boundedPartialRetry;
349
+ const partial = blockedRejections > 0;
165
350
  const dedupeDegraded = storeDedupeVectorFallbackSuppressed > 0;
166
- const returnVal = { ...result, stored, partial, dedupeDegraded };
167
- if (!opts.dryRun && !partial) {
351
+ const totalDedupeStores = vectorDedupeStores + lexicalOnlyDedupeStores;
352
+ let directiveDedupeMode: "vector" | "lexical-only" | "mixed" | undefined;
353
+ if (vectorDedupeStores === totalDedupeStores && totalDedupeStores > 0) {
354
+ directiveDedupeMode = "vector";
355
+ } else if (lexicalOnlyDedupeStores === totalDedupeStores && totalDedupeStores > 0) {
356
+ directiveDedupeMode = "lexical-only";
357
+ } else if (totalDedupeStores > 0) {
358
+ directiveDedupeMode = "mixed";
359
+ }
360
+ let cursorAdvanced: boolean | undefined;
361
+ let cursorBlockedReason: "retryable_rejections" | "parser_or_model_failure" | "bounded_partial_retry" | undefined;
362
+ if (directiveRejected.parserOrModelFailure > 0) {
363
+ cursorBlockedReason = "parser_or_model_failure";
364
+ } else if (directiveRejected.boundedPartialRetry > 0) {
365
+ cursorBlockedReason = "bounded_partial_retry";
366
+ } else if (directiveRejected.retryable > 0) {
367
+ cursorBlockedReason = "retryable_rejections";
368
+ }
369
+ const returnVal = {
370
+ ...result,
371
+ stored,
372
+ partial,
373
+ dedupeDegraded,
374
+ directiveDedupeMode,
375
+ directiveRejected,
376
+ cursorAdvanced,
377
+ cursorBlockedReason,
378
+ };
379
+ if (!opts.dryRun && !cursorBlockedReason) {
168
380
  const lastSessionTs = getMaxMtime(filePaths);
169
381
  factsDb.updateScanCursor(SCAN_TYPE, lastSessionTs ?? 0, result.sessionsScanned);
382
+ returnVal.cursorAdvanced = true;
170
383
  }
171
- if (!opts.dryRun && partial) {
384
+ if (!opts.dryRun && cursorBlockedReason) {
385
+ returnVal.cursorAdvanced = false;
172
386
  logger.info?.(
173
- `memory-hybrid: extract-directives — ${result.rejected ?? 0} directive candidate(s) rejected, cursor not advanced`,
387
+ `memory-hybrid: extract-directives — cursor blocked (${cursorBlockedReason}); rejected={permanent:${directiveRejected.permanent},retryable:${directiveRejected.retryable},parserOrModelFailure:${directiveRejected.parserOrModelFailure},boundedPartialRetry:${directiveRejected.boundedPartialRetry}}`,
174
388
  );
175
389
  }
176
390
  return returnVal;
@@ -177,16 +177,15 @@ export async function runGenerateProposalsForCli(
177
177
  rawResponse = detail.content;
178
178
  } catch (err) {
179
179
  const errMsg = err instanceof Error ? err.message : String(err);
180
- console.error(
181
- `memory-hybrid: generate-proposals LLM call failed (model=${model}, fallbacks=${JSON.stringify(
182
- fallbackModels,
183
- )}): ${errMsg}`,
184
- );
180
+ const failureMessage = `memory-hybrid: generate-proposals LLM call failed (model=${model}, fallbacks=${JSON.stringify(
181
+ fallbackModels,
182
+ )}): ${errMsg}`;
183
+ console.error(failureMessage);
185
184
  capturePluginError(err instanceof Error ? err : new Error(String(err)), {
186
185
  subsystem: "cli",
187
186
  operation: "runGenerateProposalsForCli:llm",
188
187
  });
189
- return { created: 0 };
188
+ throw new Error(failureMessage);
190
189
  }
191
190
  let items: Array<{
192
191
  targetFile: string;
@@ -16,6 +16,7 @@ import { CostFeature } from "../services/cost-feature-labels.js";
16
16
  import { capturePluginError } from "../services/error-reporter.js";
17
17
  import {
18
18
  type AnnotationReasons,
19
+ type ReinforcementAnnotationDiagnostic,
19
20
  type ReinforcementAnnotationStatus,
20
21
  type ReinforcementExtractResult,
21
22
  runReinforcementExtract,
@@ -456,6 +457,7 @@ export async function runExtractReinforcementForCli(
456
457
 
457
458
  // Derive annotation status for the incidentsFound > 0 && annotated == 0 case
458
459
  let annotationStatus: ReinforcementAnnotationStatus | undefined;
460
+ let annotationDiagnostic: ReinforcementAnnotationDiagnostic | undefined;
459
461
  if (!opts.dryRun && result.incidents.length > 0 && annotated === 0) {
460
462
  if (llmAnalysisFailed && annotationReasons.noRecalledIds === result.incidents.length) {
461
463
  annotationStatus = "degraded_model_or_parser";
@@ -474,10 +476,79 @@ export async function runExtractReinforcementForCli(
474
476
  // Do not override a successful annotation with a failure status — leave undefined.
475
477
  }
476
478
 
479
+ if (!opts.dryRun && result.incidents.length > 0 && annotated === 0 && annotationStatus) {
480
+ const noIdsAfterRecall = result.incidents.filter(
481
+ (incident) =>
482
+ incident.recalledMemoryIds.length === 0 &&
483
+ incident.toolCallSequence.some((tool) => tool.toLowerCase() === "memory_recall"),
484
+ ).length;
485
+ if (annotationStatus === "partial_no_matches") {
486
+ if (noIdsAfterRecall > 0) {
487
+ annotationDiagnostic = {
488
+ kind: "missing_recall_metadata",
489
+ summary: `${noIdsAfterRecall}/${result.incidents.length} incident(s) invoked memory_recall but yielded no parseable memory IDs.`,
490
+ recommendedActions: [
491
+ "Inspect memory_recall tool_result payload format and ensure IDs remain visible in session logs.",
492
+ "Run a targeted replay to confirm retrieval output includes canonical UUID IDs.",
493
+ ],
494
+ };
495
+ } else {
496
+ annotationDiagnostic = {
497
+ kind: "expected_sparse_data",
498
+ summary:
499
+ "No incidents included recalled memory IDs; this is expected for sessions without explicit memory recall usage.",
500
+ recommendedActions: [
501
+ "Treat as informational unless recall-heavy sessions also show partial_no_matches.",
502
+ "If recall should have happened, inspect retrieval prompting and memory_recall tool usage in those sessions.",
503
+ ],
504
+ };
505
+ }
506
+ } else if (annotationStatus === "degraded_model_or_parser") {
507
+ annotationDiagnostic = {
508
+ kind: "model_or_parser_degraded",
509
+ summary:
510
+ "LLM analysis failed or returned unparseable output while incidents lacked reinforceable recalled IDs.",
511
+ recommendedActions: [
512
+ "Retry extract-reinforcement after confirming LLM/provider health and parser logs.",
513
+ "If this persists, run with --verbose and inspect reinforcement analysis prompt/response shape.",
514
+ ],
515
+ };
516
+ } else if (annotationReasons.errors > 0) {
517
+ annotationDiagnostic = {
518
+ kind: "annotation_errors",
519
+ summary: `${annotationReasons.errors} incident(s) hit runtime annotation errors.`,
520
+ recommendedActions: [
521
+ "Inspect captured plugin errors for runExtractReinforcementForCli.",
522
+ "Address procedure/fact reinforce exceptions before rerunning extract-reinforcement.",
523
+ ],
524
+ };
525
+ } else if (annotationReasons.recalledIdsNoMatch === result.incidents.length) {
526
+ annotationDiagnostic = {
527
+ kind: "stale_recalled_ids",
528
+ summary: "All recalled memory IDs failed to match active reinforceable facts.",
529
+ recommendedActions: [
530
+ "Audit stale/superseded IDs referenced by memory_recall outputs.",
531
+ "Re-run retrieval against current fact IDs and repair stale recall references.",
532
+ ],
533
+ };
534
+ } else if (annotationStatus === "failed_annotation") {
535
+ annotationDiagnostic = {
536
+ kind: "mixed_failure",
537
+ summary: `Mixed failure: ${annotationReasons.noRecalledIds} incident(s) had no recalled IDs, ${annotationReasons.recalledIdsNoMatch} had stale IDs.`,
538
+ recommendedActions: [
539
+ "Address both missing recall metadata and stale ID issues.",
540
+ "Inspect sessions without recalled IDs for memory_recall usage gaps.",
541
+ "Audit stale/superseded IDs in the remaining sessions.",
542
+ ],
543
+ };
544
+ }
545
+ }
546
+
477
547
  // Attach annotation results to the returned value
478
548
  result.annotated = annotated;
479
549
  result.annotationReasons = annotationReasons;
480
550
  if (annotationStatus !== undefined) result.annotationStatus = annotationStatus;
551
+ if (annotationDiagnostic) result.annotationDiagnostic = annotationDiagnostic;
481
552
 
482
553
  if (!opts.dryRun) {
483
554
  const lastSessionTs = getMaxMtime(filePaths);
@@ -11,8 +11,7 @@
11
11
  import { existsSync, readFileSync, statSync } from "node:fs";
12
12
  import { homedir } from "node:os";
13
13
  import { basename, dirname, join } from "node:path";
14
-
15
- import type { ReinforcementContext } from "../backends/facts-db.js";
14
+ import type { FactsDB, ReinforcementContext } from "../backends/facts-db.js";
16
15
  import { getCronModelConfig, getDefaultCronModel, getLLMModelPreference, isCompactVerbosity } from "../config.js";
17
16
  import { chatCompleteWithRetry } from "../services/chat.js";
18
17
  import { CostFeature } from "../services/cost-feature-labels.js";
@@ -22,18 +21,17 @@ import { getEffectivenessReport, runClosedLoopAnalysis } from "../services/feedb
22
21
  import { extractImplicitSignals, parseSessionTurns } from "../services/implicit-feedback-extract.js";
23
22
  import { getModeCostEstimates } from "../services/model-pricing.js";
24
23
  import {
25
- ToolEffectivenessStore,
26
24
  computeToolEffectiveness,
27
25
  formatToolEffectivenessReport,
28
26
  generateMonthlyReport,
27
+ ToolEffectivenessStore,
29
28
  } from "../services/tool-effectiveness.js";
30
29
  import { analyzeTrajectoriesWithLLM, buildTrajectories, serializeTrajectory } from "../services/trajectory-tracker.js";
31
- import type { FactsDB } from "../backends/facts-db.js";
30
+ import { cleanupEvictedVector } from "../services/vector-maintenance.js";
32
31
  import { loadPrompt } from "../utils/prompt-loader.js";
32
+ import { createTransaction } from "../utils/sqlite-transaction.js";
33
33
  import { getSessionFilePathsSince } from "./cmd-extract.js";
34
34
  import type { HandlerContext } from "./handlers.js";
35
- import { cleanupEvictedVector } from "../services/vector-maintenance.js";
36
- import { createTransaction } from "../utils/sqlite-transaction.js";
37
35
 
38
36
  const IMPLICIT_FEEDBACK_LESSON_TAGS = ["implicit-feedback", "trajectory", "feedback"];
39
37
 
@@ -184,6 +182,16 @@ function buildImplicitFeedbackCleanupFilter(includeLegacy: boolean): string {
184
182
  return SQL_IMPLICIT_TRAJECTORY_LESSON_FILTER;
185
183
  }
186
184
 
185
+ export type ImplicitFeedbackCollapseStatus = "no_candidates" | "no_changes" | "partial" | "collapsed";
186
+
187
+ /** Operator-facing collapse outcome for `reflect-meta --collapse-implicit-feedback` (#1736). */
188
+ export function implicitFeedbackCollapseStatus(scanned: number, collapsed: number): ImplicitFeedbackCollapseStatus {
189
+ if (scanned === 0) return "no_candidates";
190
+ if (collapsed === 0) return "no_changes";
191
+ if (collapsed < scanned) return "partial";
192
+ return "collapsed";
193
+ }
194
+
187
195
  export function cleanupImplicitFeedbackDuplicates(
188
196
  factsDb: FactsDB,
189
197
  opts: {
@@ -1418,9 +1426,7 @@ function hasValidWorkflowTraces(dbPath: string): boolean {
1418
1426
  (tool): tool is string => typeof tool === "string" && tool.trim().length > 0,
1419
1427
  );
1420
1428
  if (nonEmptyTools.length > 0) return true;
1421
- } catch {
1422
- continue;
1423
- }
1429
+ } catch {}
1424
1430
  }
1425
1431
  return false;
1426
1432
  } finally {