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 +1 @@
1
- {"version":3,"file":"reflection.js","names":[],"sources":["../../services/reflection.ts"],"sourcesContent":["/**\n * Reflection service: pattern synthesis from memory facts.\n *\n * Three layers:\n * 1. Patterns (runReflection): Extract high-level patterns from recent facts\n * 2. Rules (runReflectionRules): Synthesize patterns into actionable one-liners\n * 3. Meta-patterns (runReflectionMeta): Synthesize patterns into 1-3 meta-patterns\n */\n\nimport { createHash, randomUUID } from \"node:crypto\";\nimport type OpenAI from \"openai\";\nimport type { FactsDB } from \"../backends/facts-db.js\";\nimport type { VectorDB } from \"../backends/vector-db.js\";\nimport type { MemoryCategory, MemoryEntry } from \"../types/memory.js\";\nimport {\n REFLECTION_DEDUPE_429_CIRCUIT_BREAKER_BACKOFF_MS,\n REFLECTION_DEDUPE_429_CIRCUIT_BREAKER_THRESHOLD,\n REFLECTION_DEDUPE_LOAD_TIMEOUT_MS,\n REFLECTION_DEDUPE_MAX_ROWS_PER_RUN,\n REFLECTION_DEDUPE_THRESHOLD,\n REFLECTION_IMPORTANCE,\n REFLECTION_MAX_FACT_LENGTH,\n REFLECTION_MAX_FACTS_PER_CATEGORY,\n REFLECTION_META_MAX_CHARS,\n REFLECTION_PATTERN_MAX_CHARS,\n REFLECTION_TEMPERATURE,\n} from \"../utils/constants.js\";\nimport { getEnv } from \"../utils/env-manager.js\";\nimport { persistCanonicalFactEmbedding } from \"../utils/fact-embeddings.js\";\nimport { fillPrompt, loadPrompt } from \"../utils/prompt-loader.js\";\nimport { withTimeout } from \"../utils/timeout.js\";\nimport { chatCompleteWithAdaptiveMaintenanceRetry } from \"./adaptive-maintenance-llm.js\";\nimport { is403QuotaOrRateLimitLike, is429OrWrapped, LLMRetryError } from \"./chat.js\";\nimport { CostFeature } from \"./cost-feature-labels.js\";\nimport type { EmbeddingProvider } from \"./embeddings.js\";\nimport { shouldSuppressEmbeddingError } from \"./embeddings.js\";\nimport { capturePluginError } from \"./error-reporter.js\";\nimport { recordMaintenanceTimestamp } from \"./maintenance-timestamp.js\";\nimport type { ProvenanceService } from \"./provenance.js\";\nimport {\n dotProductSimilarity,\n normalizeVector,\n parsePatternsFromReflectionResponse,\n REFLECTION_MAX_PATTERNS_FOR_META,\n REFLECTION_MAX_PATTERNS_FOR_RULES,\n REFLECTION_META_MIN_CHARS,\n REFLECTION_PATTERN_MIN_CHARS,\n REFLECTION_RULE_MAX_CHARS,\n REFLECTION_RULE_MIN_CHARS,\n} from \"./reflection/shared.js\";\n\nexport { dotProductSimilarity, normalizeVector, parsePatternsFromReflectionResponse } from \"./reflection/shared.js\";\n\nimport { stripThinkingWrapperBlocks } from \"../utils/llm-json-array.js\";\nimport { cleanupEvictedVector } from \"./vector-maintenance.js\";\n\n/** Non-superseded, non-expired pattern facts (same filter as reflection dedupe corpus). */\nexport function countActivePatternFactsForMaintenance(factsDb: FactsDB): number {\n return factsDb.countActiveFactsByCategory(\"pattern\");\n}\n\nexport interface ReflectionConfig {\n defaultWindow: number;\n minObservations: number;\n enabled?: boolean;\n}\n\ninterface ReflectionOptions {\n window: number;\n dryRun: boolean;\n model: string;\n verbose?: boolean;\n fallbackModels?: string[];\n modelSource?: string;\n adaptiveStatePath?: string;\n}\n\ninterface ReflectionResult {\n factsAnalyzed: number;\n patternsExtracted: number;\n patternsStored: number;\n window: number;\n}\n\ninterface ReflectionRulesResult {\n rulesExtracted: number;\n rulesStored: number;\n diagnostics: ReflectionRulesDiagnostics;\n}\n\nexport interface ReflectionRulesDiagnostics {\n modelResponseChars: number;\n parseSuccess: boolean;\n parsedCandidates: number;\n rejectedDuplicates: number;\n rejectedLowConfidence: number;\n stored: number;\n zeroRulesReason?: string;\n status: \"ok\" | \"partial\" | \"degraded\";\n}\n\n// Accepted model phrases when \"0 rules\" is a valid no-op rather than parse failure.\n// Anchored to start-of-string but allows leading whitespace so phrases like\n// \"No actionable rules detected from ...\" are correctly classified.\n// Only accepts single-line no-op responses; multiline outputs must be parsed for RULE lines.\nconst VALID_NO_RULES_PATTERN =\n /^\\s*(no\\s+(actionable\\s+)?rules?|no rules (detected|identified)|unable to extract rules|insufficient information for rules)[^\\n\\r]*$/i;\nconst LOW_CONFIDENCE_PREFIX_PATTERN =\n /^\\s*(?:\\[(?:low[-\\s]?confidence)\\]|\\((?:low[-\\s]?confidence)\\)|low[-\\s]?confidence\\s*[:\\-])\\s*/i;\nconst EXPLICIT_CONFIDENCE_PREFIX_PATTERN =\n /^\\s*(?:\\[|\\()?\\s*confidence\\s*[:=]\\s*(?<value>0(?:\\.\\d+)?|1(?:\\.0+)?)\\s*(?:\\]|\\))?\\s*/i;\nconst REFLECTION_RULE_MIN_CONFIDENCE = 0.5;\n\nconst THINKING_WRAPPER_TAGS_PATTERN = /<\\/?(?:redacted_thinking|thinking|reasoning|think)>/gi;\n\nfunction stripThinkingWrapperTagsKeepContent(s: string): string {\n return s.replace(THINKING_WRAPPER_TAGS_PATTERN, \"\").trim();\n}\n\nfunction extractThinkingWrapperContents(s: string): string[] {\n const matches = s.matchAll(\n /<(?:redacted_thinking|thinking|reasoning|think)>([\\s\\S]*?)<\\/(?:redacted_thinking|thinking|reasoning|think)>/gi,\n );\n const contents: string[] = [];\n for (const match of matches) {\n const content = match[1]?.trim();\n if (content) contents.push(content);\n }\n return contents;\n}\n\nfunction derivePreMergeText(mergedText: string, appendedText: string): string | null {\n const appendSuffix = `\\n${appendedText}`;\n const maxSuffixLen = Math.min(appendSuffix.length, mergedText.length);\n for (let suffixLen = maxSuffixLen; suffixLen >= 1; suffixLen--) {\n if (mergedText.endsWith(appendSuffix.slice(0, suffixLen))) {\n return mergedText.slice(0, mergedText.length - suffixLen);\n }\n }\n return null;\n}\n\nfunction rollbackMergedFactText(\n factsDb: FactsDB,\n logger: { warn: (msg: string) => void },\n opts: {\n context: string;\n factId: string;\n mergedText: string;\n appendedText: string;\n preMergeText?: string | null;\n reason: \"merge-reembed-failure\" | \"vector-store-failure\" | \"metadata-update-failure\";\n },\n): boolean {\n const previousText = opts.preMergeText ?? derivePreMergeText(opts.mergedText, opts.appendedText);\n if (previousText == null) {\n logger.warn(\n `memory-hybrid: ${opts.context} — failed to derive pre-merge text for fact ${opts.factId.slice(0, 8)} after ${opts.reason}; leaving merged text in place`,\n );\n return false;\n }\n const restoreMergedFactText = (factsDb as FactsDB & { restoreMergedFactText?: (id: string, text: string) => boolean })\n .restoreMergedFactText;\n if (typeof restoreMergedFactText !== \"function\") {\n logger.warn(\n `memory-hybrid: ${opts.context} — factsDb.restoreMergedFactText unavailable for fact ${opts.factId.slice(0, 8)} after ${opts.reason}; leaving merged text in place`,\n );\n return false;\n }\n try {\n const restored = restoreMergedFactText.call(factsDb, opts.factId, previousText);\n if (!restored) {\n logger.warn(\n `memory-hybrid: ${opts.context} — rollback update did not affect fact ${opts.factId.slice(0, 8)} after ${opts.reason}; leaving merged text in place`,\n );\n return false;\n }\n logger.warn(\n `memory-hybrid: ${opts.context} — rolled back merged text for fact ${opts.factId.slice(0, 8)} after ${opts.reason} to preserve text/vector consistency`,\n );\n return true;\n } catch (err) {\n logger.warn(\n `memory-hybrid: ${opts.context} — failed to roll back merged text for fact ${opts.factId.slice(0, 8)} after ${opts.reason}: ${err}`,\n );\n return false;\n }\n}\n\nfunction resolvePreMergeText(mergedText: string, appendedText: string, preMergeText?: string | null): string | null {\n return preMergeText ?? derivePreMergeText(mergedText, appendedText);\n}\n\nasync function restoreMergedFactVectorState(opts: {\n context: string;\n factId: string;\n category: \"pattern\" | \"rule\";\n preMergeText: string | null;\n preMergeVector: number[] | null;\n preMergeEmbeddingModel: string | null;\n fallbackEmbeddingModel: string;\n vectorDb: VectorDB;\n factsDb: FactsDB;\n logger: { warn: (msg: string) => void };\n}): Promise<void> {\n if (!opts.preMergeText) {\n opts.logger.warn(\n `memory-hybrid: ${opts.context} — pre-merge text unavailable for ${opts.factId.slice(0, 8)}; cannot restore vector state`,\n );\n return;\n }\n if (!opts.preMergeVector || opts.preMergeVector.length === 0) {\n opts.logger.warn(\n `memory-hybrid: ${opts.context} — pre-merge vector unavailable for ${opts.factId.slice(0, 8)}; leaving post-rollback vector state empty`,\n );\n return;\n }\n try {\n await opts.vectorDb.store({\n text: opts.preMergeText,\n vector: opts.preMergeVector,\n importance: REFLECTION_IMPORTANCE,\n category: opts.category,\n id: opts.factId,\n });\n } catch (err) {\n opts.logger.warn(\n `memory-hybrid: ${opts.context} — failed to restore pre-merge vector for ${opts.factId.slice(0, 8)} after rollback: ${err}`,\n );\n try {\n await opts.vectorDb.delete(opts.factId);\n opts.logger.warn(\n `memory-hybrid: ${opts.context} — deleted merged vector for ${opts.factId.slice(0, 8)} to prevent Lance drift after restore failure`,\n );\n } catch (delErr) {\n opts.logger.warn(\n `memory-hybrid: ${opts.context} — failed to delete merged vector for ${opts.factId.slice(0, 8)} after restore failure: ${delErr}`,\n );\n }\n return;\n }\n const embeddingModel =\n opts.preMergeEmbeddingModel && opts.preMergeEmbeddingModel.trim().length > 0\n ? opts.preMergeEmbeddingModel\n : opts.fallbackEmbeddingModel;\n try {\n persistCanonicalFactEmbedding(\n opts.factsDb,\n opts.factId,\n embeddingModel,\n opts.preMergeVector,\n \"reflection-fact-embeddings\",\n opts.context,\n opts.logger.warn.bind(opts.logger),\n );\n opts.factsDb.setEmbeddingModel(opts.factId, embeddingModel);\n } catch (err) {\n opts.logger.warn(\n `memory-hybrid: ${opts.context} — failed to restore canonical embeddings for ${opts.factId.slice(0, 8)} after rollback: ${err}`,\n );\n }\n}\n\nfunction reusedExistingStoreEntry(\n storeResult: {\n entry: MemoryEntry;\n embeddingStale?: boolean;\n newlyStored?: boolean;\n },\n candidateText: string,\n): boolean {\n if (storeResult.newlyStored === false) return true;\n return storeResult.embeddingStale !== true && storeResult.entry.text !== candidateText;\n}\n\ninterface ReflectionMetaResult {\n metaExtracted: number;\n metaStored: number;\n}\n\n/**\n * Build normalized dedupe-corpus vectors for existing facts: prefer LanceDB rows (same id as fact),\n * else call the embedding API. Batches API calls (20) with adaptive throttle based on rate limits.\n * Wrapped with timeout to prevent indefinite hangs during VectorDB operations.\n *\n * Implements circuit breaker: after N consecutive 429s, pauses and returns partial results.\n * Supports resumable processing via checkpoint cursor (future enhancement).\n */\nexport async function loadReflectionDedupeCorpusVectors(\n facts: MemoryEntry[],\n embeddings: EmbeddingProvider,\n vectorDb: VectorDB,\n logger: { info: (msg: string) => void; warn?: (msg: string) => void },\n logPrefix: string,\n captureOperation: string,\n markEmbeddingModel?: (factId: string, model: string) => void,\n dryRun = false,\n): Promise<(number[] | null)[]> {\n const loadWithTimeout = async (): Promise<(number[] | null)[]> => {\n const startMs = Date.now();\n const logWarn = (msg: string) => (logger.warn ?? logger.info)(msg);\n const vdb = vectorDb as VectorDB & {\n getVectorDim?: () => number;\n getVectorsByFactIds?: (ids: string[]) => Promise<Map<string, number[]>>;\n store?: (entry: {\n text: string;\n vector: number[];\n importance: number;\n category: string;\n id?: string;\n }) => Promise<string>;\n isLanceDbAvailable?: () => boolean;\n isLanceAvailable?: () => boolean;\n };\n const dim = typeof vdb.getVectorDim === \"function\" ? vdb.getVectorDim() : 0;\n const canPersistToLance =\n typeof vdb.isLanceDbAvailable === \"function\"\n ? vdb.isLanceDbAvailable()\n : typeof vdb.isLanceAvailable === \"function\"\n ? vdb.isLanceAvailable()\n : true;\n let byId = new Map<string, number[]>();\n\n const maxRowsThisRun = REFLECTION_DEDUPE_MAX_ROWS_PER_RUN;\n const effectiveFacts = facts.length > maxRowsThisRun ? facts.slice(0, maxRowsThisRun) : facts;\n\n if (facts.length > maxRowsThisRun) {\n logWarn(\n `${logPrefix} — dedupe corpus: limiting to ${maxRowsThisRun} rows (total ${facts.length}) to prevent unbounded backlog work. Remaining ${facts.length - maxRowsThisRun} rows will be processed in future runs.`,\n );\n }\n\n logger.info(\n `${logPrefix} — dedupe corpus: loading vectors from Lance index for ${effectiveFacts.length} fact(s)${facts.length > effectiveFacts.length ? ` (capped from ${facts.length})` : \"\"}...`,\n );\n\n if (typeof vdb.getVectorsByFactIds === \"function\") {\n try {\n byId = await vdb.getVectorsByFactIds(effectiveFacts.map((f) => f.id));\n const elapsedS = ((Date.now() - startMs) / 1000).toFixed(1);\n logger.info(\n `${logPrefix} — dedupe corpus: loaded ${byId.size} vector(s) from Lance index (elapsed: ${elapsedS}s)`,\n );\n } catch (err) {\n logger.info(`${logPrefix} — dedupe corpus: Lance index load failed, will use embedding API for all: ${err}`);\n byId = new Map();\n }\n }\n\n const result: (number[] | null)[] = new Array(facts.length);\n let lanceHits = 0;\n let lanceModelOkHits = 0;\n let lanceModelMissingHits = 0;\n let lanceModelMismatchSkips = 0;\n let apiEmbeds = 0;\n let apiPersisted = 0;\n let apiPersistFailures = 0;\n let embedFailures = 0;\n let nonNullSoFar = 0;\n let embedAttemptsThisRun = 0;\n let consecutive429s = 0;\n let total429s = 0;\n let throttleDelayMs = 200;\n const startedAt = Date.now();\n let lastProgressAt = startedAt;\n\n logger.info(\n `${logPrefix} — dedupe corpus: processing ${effectiveFacts.length} facts in batches of 20 (${dryRun ? \"dry-run: no Lance checkpoint / metadata writes\" : \"checkpointing API-hydrated vectors\"})`,\n );\n\n const totalBatches = Math.ceil(effectiveFacts.length / 20);\n let batchNumber = 0;\n\n for (let i = 0; i < effectiveFacts.length; i += 20) {\n const batchStartedAt = Date.now();\n const end = Math.min(i + 20, effectiveFacts.length);\n batchNumber++;\n let hadApiEmbed = false;\n let had429ThisBatch = false;\n let batchLance = 0;\n let batchApi = 0;\n let batchPersisted = 0;\n let batchPersistFailures = 0;\n let batchEmbedFailures = 0;\n let batchMismatchSkips = 0;\n\n for (let j = i; j < end; j++) {\n const f = effectiveFacts[j]!;\n const cached = byId.get(f.id.toLowerCase()) ?? byId.get(f.id);\n const modelKnown = f.embeddingModel != null && embeddings.modelName != null;\n const modelOk = modelKnown && f.embeddingModel === embeddings.modelName;\n const useCache = dim > 0 && cached != null && cached.length === dim && (!modelKnown || modelOk);\n if (useCache) {\n result[j] = normalizeVector(cached);\n nonNullSoFar++;\n lanceHits++;\n batchLance++;\n if (modelOk) lanceModelOkHits++;\n else if (!f.embeddingModel) {\n lanceModelMissingHits++;\n if (!dryRun && embeddings.modelName && markEmbeddingModel) {\n try {\n markEmbeddingModel(f.id, embeddings.modelName);\n } catch (markErr) {\n logger.info(\n `${logPrefix} — dedupe corpus: failed to mark embedding model for cached fact ${f.id}: ${markErr}`,\n );\n }\n }\n }\n } else {\n if (dim > 0 && cached != null && cached.length === dim && modelKnown && !modelOk) {\n lanceModelMismatchSkips++;\n batchMismatchSkips++;\n }\n try {\n embedAttemptsThisRun++;\n const vec = await embeddings.embed(f.text);\n result[j] = normalizeVector(vec);\n nonNullSoFar++;\n apiEmbeds++;\n batchApi++;\n hadApiEmbed = true;\n consecutive429s = 0;\n\n if (!dryRun && typeof vdb.store === \"function\") {\n let persistSucceeded = !canPersistToLance;\n if (canPersistToLance) {\n try {\n await vdb.store({\n text: f.text,\n vector: vec,\n importance: typeof f.importance === \"number\" ? f.importance : REFLECTION_IMPORTANCE,\n category: f.category,\n id: f.id,\n });\n apiPersisted++;\n batchPersisted++;\n persistSucceeded = true;\n } catch (storeErr) {\n apiPersistFailures++;\n batchPersistFailures++;\n logger.info(\n `${logPrefix} — dedupe corpus: failed to persist hydrated vector for fact ${f.id}: ${storeErr}`,\n );\n }\n }\n if (persistSucceeded && embeddings.modelName && markEmbeddingModel) {\n try {\n markEmbeddingModel(f.id, embeddings.modelName);\n } catch (markErr) {\n logger.info(\n `${logPrefix} — dedupe corpus: failed to mark embedding model for hydrated fact ${f.id}: ${markErr}`,\n );\n }\n }\n }\n } catch (err) {\n const isRateLimit =\n is429OrWrapped(err instanceof Error ? err : new Error(String(err))) || is403QuotaOrRateLimitLike(err);\n\n if (isRateLimit) {\n consecutive429s++;\n total429s++;\n had429ThisBatch = true;\n\n if (consecutive429s >= REFLECTION_DEDUPE_429_CIRCUIT_BREAKER_THRESHOLD) {\n const failedAtRow = j;\n const remainingInSlice = effectiveFacts.length - failedAtRow;\n logWarn(\n `[embedding-quota] ${logPrefix} — circuit breaker triggered: ${consecutive429s} consecutive 429s. ` +\n `Stopped at row ${failedAtRow}/${effectiveFacts.length} in this run, deferring ${remainingInSlice}. ` +\n `Total 429s this run: ${total429s}. Will resume in next dream-cycle.`,\n );\n for (let k = j; k < effectiveFacts.length; k++) {\n result[k] = null;\n }\n for (let k = effectiveFacts.length; k < facts.length; k++) {\n result[k] = null;\n }\n return result;\n }\n\n throttleDelayMs = Math.min(throttleDelayMs * 2, 10_000);\n logWarn(\n `[embedding-quota] ${logPrefix} — 429 rate limit (${consecutive429s} consecutive, ${total429s} total) — ` +\n `increasing throttle to ${throttleDelayMs}ms`,\n );\n } else {\n embedFailures++;\n batchEmbedFailures++;\n }\n\n if (!shouldSuppressEmbeddingError(err)) {\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: captureOperation,\n subsystem: \"embeddings\",\n factId: f.id,\n });\n }\n result[j] = null;\n hadApiEmbed = true;\n }\n }\n }\n\n const elapsedMs = Date.now() - startedAt;\n const batchMs = Date.now() - batchStartedAt;\n const processed = end;\n const remainingSlice = effectiveFacts.length - end;\n const ok = nonNullSoFar;\n const elapsedS = (elapsedMs / 1000).toFixed(1);\n const capDeferred = facts.length - effectiveFacts.length;\n const periodicBatchLog =\n (effectiveFacts.length <= 500 && (batchNumber % 5 === 0 || end === effectiveFacts.length)) ||\n (effectiveFacts.length > 500 &&\n effectiveFacts.length <= 1000 &&\n (batchNumber % 10 === 0 || end % 200 === 0 || end === effectiveFacts.length)) ||\n (effectiveFacts.length > 1000 && (batchNumber % 20 === 0 || end % 400 === 0 || end === effectiveFacts.length));\n\n const shouldLog =\n periodicBatchLog ||\n effectiveFacts.length > 1000 ||\n batchApi > 0 ||\n had429ThisBatch ||\n batchMs >= 5000 ||\n Date.now() - lastProgressAt >= 10_000 ||\n end === effectiveFacts.length;\n\n if (shouldLog) {\n lastProgressAt = Date.now();\n logger.info(\n `${logPrefix} — dedupe corpus progress: batch ${batchNumber}/${Math.max(1, totalBatches)}, ${processed}/${effectiveFacts.length} processed, ${remainingSlice} remaining this run${capDeferred > 0 ? ` (${capDeferred} row(s) capped for next run)` : \"\"}; batch=${batchMs}ms (Lance ${batchLance}, API ${batchApi}, persisted ${batchPersisted}, persistFailures ${batchPersistFailures}, embedFailures ${batchEmbedFailures}, mismatchSkips ${batchMismatchSkips}); totals: Lance ${lanceHits} (model-ok ${lanceModelOkHits}, missing ${lanceModelMissingHits}, mismatch-skips ${lanceModelMismatchSkips}), API ${apiEmbeds}, persisted ${apiPersisted}, persistFailures ${apiPersistFailures}, embedFailures ${embedFailures}, 429s=${total429s}, throttle=${throttleDelayMs}ms, non-null ${ok}; elapsed=${elapsedMs}ms (${elapsedS}s)`,\n );\n }\n\n if (hadApiEmbed && end < effectiveFacts.length) {\n const batchDelay = had429ThisBatch\n ? Math.max(throttleDelayMs, REFLECTION_DEDUPE_429_CIRCUIT_BREAKER_BACKOFF_MS / 3)\n : throttleDelayMs;\n await new Promise((r) => setTimeout(r, batchDelay));\n }\n }\n\n for (let idx = effectiveFacts.length; idx < facts.length; idx++) {\n result[idx] = null;\n }\n\n if (effectiveFacts.length > 0) {\n const ok = result.filter((v) => v !== null).length;\n const elapsedS = ((Date.now() - startMs) / 1000).toFixed(1);\n const deferredCap = facts.length - effectiveFacts.length;\n logger.info(\n `${logPrefix} — dedupe corpus: completed ${Math.max(1, totalBatches)} batch(es), ${lanceHits} vector(s) reused from Lance index (model-ok ${lanceModelOkHits}, missing ${lanceModelMissingHits}, mismatch-skips ${lanceModelMismatchSkips}), ${apiEmbeds} row(s) hydrated via embedding API (${embedAttemptsThisRun} attempt(s)), ${apiPersisted} persisted to Lance (${apiPersistFailures} persist failure(s)), ${embedFailures} embed failure(s), ${total429s} embedding rate-limit event(s), throttle=${throttleDelayMs}ms, ${ok}/${facts.length} non-null for cosine check (elapsed: ${elapsedS}s)${deferredCap > 0 ? `; ${deferredCap} row(s) deferred to next run (per-run cap)` : \"\"}`,\n );\n }\n return result;\n };\n\n // Wrap the entire operation with a timeout\n const result = await withTimeout(REFLECTION_DEDUPE_LOAD_TIMEOUT_MS, loadWithTimeout);\n\n if (result === null) {\n (logger.warn ?? logger.info)(\n `${logPrefix} — dedupe corpus: timed out after ${REFLECTION_DEDUPE_LOAD_TIMEOUT_MS}ms while loading ${facts.length} vectors; falling back to empty corpus (dedupe disabled for this run)`,\n );\n return new Array(facts.length).fill(null);\n }\n\n return result;\n}\n\n/**\n * Run reflection — gather recent facts, call LLM to extract patterns, dedupe, store.\n */\nexport async function runReflection(\n factsDb: FactsDB,\n vectorDb: VectorDB,\n embeddings: EmbeddingProvider,\n openai: OpenAI,\n config: ReflectionConfig,\n opts: ReflectionOptions,\n logger: { info: (msg: string) => void; warn: (msg: string) => void },\n provenanceService?: ProvenanceService | null,\n): Promise<ReflectionResult> {\n // Feature-gating: exit 0 if reflection is disabled\n if (config.enabled === false) {\n return { factsAnalyzed: 0, patternsExtracted: 0, patternsStored: 0, window: opts.window };\n }\n const windowDays = Math.min(90, Math.max(1, opts.window));\n const touchReflectLastRun = () => {\n if (!opts.dryRun) recordMaintenanceTimestamp(factsDb.sqlitePath, \".reflect_last_run\");\n };\n const recentFacts = factsDb.getRecentFacts(windowDays);\n\n if (recentFacts.length < config.minObservations) {\n logger.info(`memory-hybrid: reflection — ${recentFacts.length} facts in window (min ${config.minObservations})`);\n touchReflectLastRun();\n return { factsAnalyzed: recentFacts.length, patternsExtracted: 0, patternsStored: 0, window: windowDays };\n }\n\n // Group by category, cap length and count\n const byCategory = new Map<string, MemoryEntry[]>();\n for (const f of recentFacts) {\n const cat = f.category;\n if (!byCategory.has(cat)) byCategory.set(cat, []);\n const arr = byCategory.get(cat)!;\n if (arr.length >= REFLECTION_MAX_FACTS_PER_CATEGORY) continue;\n arr.push(f);\n }\n\n const factLines: string[] = [];\n for (const [cat, entries] of byCategory) {\n for (const e of entries) {\n const text = e.text.slice(0, REFLECTION_MAX_FACT_LENGTH).trim();\n if (text.length < 10) continue;\n factLines.push(`[${cat}] ${text}`);\n }\n }\n if (factLines.length === 0) {\n logger.info(\n `memory-hybrid: reflection — ${recentFacts.length} recent facts but all too short after trimming; skipping LLM`,\n );\n touchReflectLastRun();\n return { factsAnalyzed: recentFacts.length, patternsExtracted: 0, patternsStored: 0, window: windowDays };\n }\n\n const factsBlock = factLines.join(\"\\n\");\n const nowSec = Math.floor(Date.now() / 1000);\n const existingPatternFacts = factsDb\n .getByCategory(\"pattern\")\n .filter((f) => !f.supersededAt && (f.expiresAt === null || f.expiresAt > nowSec));\n const existingPatternsFingerprint = existingPatternFacts\n .map((f) => f.id)\n .sort()\n .join(\",\");\n const inputHash = createHash(\"sha256\")\n .update(`${windowDays}:${opts.model}:${factsBlock}:${existingPatternsFingerprint}`)\n .digest(\"hex\")\n .slice(0, 16);\n const prevHash = factsDb.getMaintenanceState(\"reflection_input_hash\");\n if (prevHash === inputHash) {\n logger.info(\"memory-hybrid: reflection — input facts unchanged since last run, skipping LLM call\");\n touchReflectLastRun();\n return { factsAnalyzed: recentFacts.length, patternsExtracted: 0, patternsStored: 0, window: windowDays };\n }\n\n const prompt = fillPrompt(loadPrompt(\"reflection\"), { window: String(windowDays), facts: factsBlock });\n\n if (opts.verbose) {\n logger.info(\n `memory-hybrid: reflection — LLM call (${prompt.length} chars, ${recentFacts.length} facts in window, model=${opts.model})`,\n );\n }\n\n let rawResponse: string;\n try {\n const adaptiveEnabled = (getEnv(\"OPENCLAW_HYBRID_MEM_ADAPTIVE_DISTILL\") ?? \"\").trim() !== \"0\";\n const detail = await chatCompleteWithAdaptiveMaintenanceRetry({\n model: opts.model,\n modelSource: opts.modelSource,\n content: prompt,\n temperature: REFLECTION_TEMPERATURE,\n maxTokens: 1500,\n openai,\n fallbackModels: opts.fallbackModels ?? [],\n label: \"memory-hybrid: reflection\",\n feature: CostFeature.reflection,\n logger,\n adaptiveStatePath: opts.adaptiveStatePath,\n enabled: adaptiveEnabled,\n });\n if (detail.modelUsed !== opts.model) {\n logger.info(`memory-hybrid: reflection — used fallback model ${detail.modelUsed}`);\n }\n rawResponse = detail.content;\n } catch (err) {\n logger.warn(`memory-hybrid: reflection LLM failed: ${err}`);\n const retryAttempt = err instanceof LLMRetryError ? err.attemptNumber : 1;\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"reflection-llm\",\n subsystem: \"openai\",\n windowDays,\n retryAttempt,\n });\n touchReflectLastRun();\n return { factsAnalyzed: recentFacts.length, patternsExtracted: 0, patternsStored: 0, window: windowDays };\n }\n\n const uniqueNewPatterns = parsePatternsFromReflectionResponse(rawResponse);\n\n if (uniqueNewPatterns.length === 0) {\n logger.info(\"memory-hybrid: reflection — 0 patterns extracted from LLM\");\n if (!opts.dryRun) {\n factsDb.setMaintenanceState(\"reflection_input_hash\", inputHash);\n }\n touchReflectLastRun();\n return { factsAnalyzed: recentFacts.length, patternsExtracted: 0, patternsStored: 0, window: windowDays };\n }\n\n logger.info(\n `memory-hybrid: reflection — LLM completed successfully: ${uniqueNewPatterns.length} candidate pattern(s) after parse (next: load prior pattern vectors for dedupe — Lance index + embedding API as needed — then each new pattern)`,\n );\n\n if (opts.verbose) {\n logger.info(`memory-hybrid: reflection — extracted ${uniqueNewPatterns.length} patterns:`);\n for (const pattern of uniqueNewPatterns) {\n logger.info(` PATTERN: ${pattern}`);\n }\n }\n\n let existingVectors: (number[] | null)[] = [];\n if (existingPatternFacts.length > 0) {\n logger.info(\n `memory-hybrid: reflection — loading ${existingPatternFacts.length} existing pattern row(s) for dedupe (Lance vectors + embedding API when index or model is missing)`,\n );\n existingVectors = await loadReflectionDedupeCorpusVectors(\n existingPatternFacts,\n embeddings,\n vectorDb,\n logger,\n \"memory-hybrid: reflection\",\n \"reflection-embed-existing\",\n (factId, model) => factsDb.setEmbeddingModel(factId, model),\n opts.dryRun,\n );\n } else {\n logger.info(\"memory-hybrid: reflection — no existing pattern facts for dedupe; embedding new candidates only\");\n }\n\n logger.info(\n `memory-hybrid: reflection — embedding ${uniqueNewPatterns.length} new candidate pattern(s) for duplicate check + storage`,\n );\n\n let stored = 0;\n let duplicatesSkipped = 0;\n let newPatternEmbedFailures = 0;\n let storeDedupeVectorFallbackSuppressed = 0;\n const reflectionRunId = provenanceService ? randomUUID() : null;\n const candidateStartMs = Date.now();\n let candidateIndex = 0;\n const inRunFactVectors = new Map<string, { vector: number[]; embeddingModel: string }>();\n\n for (const patternText of uniqueNewPatterns) {\n candidateIndex++;\n let vec: number[];\n try {\n vec = await embeddings.embed(patternText);\n } catch (err) {\n newPatternEmbedFailures++;\n // AllEmbeddingProvidersFailed is expected when all providers are unavailable — don't report (#486)\n if (!shouldSuppressEmbeddingError(err)) {\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"embed-pattern\",\n severity: \"info\",\n subsystem: \"reflection\",\n });\n }\n continue; // Skip this pattern on embed failure\n }\n const normVec = normalizeVector(vec);\n let isDuplicate = false;\n for (const ev of existingVectors) {\n if (ev === null || ev.length === 0) continue;\n if (dotProductSimilarity(normVec, ev) >= REFLECTION_DEDUPE_THRESHOLD) {\n isDuplicate = true;\n break;\n }\n }\n if (isDuplicate) {\n duplicatesSkipped++;\n if (opts.verbose) {\n logger.info(`memory-hybrid: reflection — skipped duplicate: ${patternText.slice(0, 60)}...`);\n }\n continue;\n }\n\n if (opts.dryRun) {\n logger.info(`memory-hybrid: reflection [dry-run] would store: ${patternText.slice(0, 60)}...`);\n stored++;\n continue;\n }\n\n storeDedupeVectorFallbackSuppressed++;\n const storeResult = factsDb.storeWithResult(\n {\n text: patternText,\n category: \"pattern\" as MemoryCategory,\n importance: REFLECTION_IMPORTANCE,\n entity: null,\n key: null,\n value: null,\n source: \"reflection\",\n decayClass: \"permanent\",\n tags: [\"reflection\", \"pattern\"],\n extractionMethod: \"reflection\",\n extractionConfidence: REFLECTION_IMPORTANCE,\n },\n {\n warnContext: \"reflection\",\n suppressVectorFallbackWarning: true,\n },\n );\n if (storeResult.skipped) {\n continue;\n }\n const entry = storeResult.entry;\n const mergeExistingIndex = storeResult.embeddingStale\n ? existingPatternFacts.findIndex((f) => f.id === entry.id)\n : -1;\n const inRunMerge = storeResult.embeddingStale && mergeExistingIndex < 0 ? inRunFactVectors.get(entry.id) : null;\n const preMergeVector =\n mergeExistingIndex >= 0 && mergeExistingIndex < existingVectors.length\n ? existingVectors[mergeExistingIndex]\n : (inRunMerge?.vector ?? null);\n const preMergeEmbeddingModel =\n mergeExistingIndex >= 0\n ? (existingPatternFacts[mergeExistingIndex]?.embeddingModel ?? null)\n : (inRunMerge?.embeddingModel ?? null);\n // Skip reused existing facts unless this was a merge update that requires re-embed.\n if (reusedExistingStoreEntry(storeResult, patternText) && !storeResult.embeddingStale) {\n duplicatesSkipped++;\n // Keep this candidate in the in-run dedupe corpus so later patterns don't miss near-duplicates.\n existingVectors.push(normVec);\n if (opts.verbose) {\n logger.info(`memory-hybrid: reflection — skipped store-level duplicate: ${patternText.slice(0, 60)}...`);\n }\n continue;\n }\n // CRITICAL FIX (#2): Delete vector for evicted fact to prevent orphaned vectors\n await cleanupEvictedVector({\n vectorDb: vectorDb,\n evictedFactId: storeResult.evictedFactId,\n logger: logger,\n context: \"reflection\",\n });\n if (opts.verbose) {\n logger.info(\n `memory-hybrid: reflection — stored pattern (importance ${REFLECTION_IMPORTANCE}): ${patternText.slice(0, 80)}${patternText.length > 80 ? \"...\" : \"\"}`,\n );\n }\n // If embeddingStale=true (merge path), re-embed the updated merged text\n const textToEmbed = storeResult.embeddingStale ? entry.text : patternText;\n let vectorToStore: number[];\n try {\n vectorToStore = storeResult.embeddingStale ? await embeddings.embed(textToEmbed) : vec;\n } catch (err) {\n newPatternEmbedFailures++;\n if (!shouldSuppressEmbeddingError(err)) {\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"embed-pattern-merge\",\n severity: \"info\",\n subsystem: \"reflection\",\n });\n }\n if (storeResult.embeddingStale) {\n rollbackMergedFactText(factsDb, logger, {\n context: \"reflection\",\n factId: entry.id,\n mergedText: entry.text,\n appendedText: patternText,\n preMergeText: storeResult.preMergeText,\n reason: \"merge-reembed-failure\",\n });\n }\n continue;\n }\n let vectorStored = false;\n try {\n await vectorDb.store({\n text: textToEmbed,\n vector: vectorToStore,\n importance: REFLECTION_IMPORTANCE,\n category: \"pattern\",\n id: entry.id,\n });\n vectorStored = true;\n } catch (err) {\n logger.warn(`memory-hybrid: reflection vector store failed: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"reflection-vector-store\",\n subsystem: \"vector\",\n factId: entry.id,\n });\n if (storeResult.embeddingStale) {\n const preMergeText = resolvePreMergeText(entry.text, patternText, storeResult.preMergeText);\n const rolledBack = rollbackMergedFactText(factsDb, logger, {\n context: \"reflection\",\n factId: entry.id,\n mergedText: entry.text,\n appendedText: patternText,\n preMergeText: storeResult.preMergeText,\n reason: \"vector-store-failure\",\n });\n if (rolledBack) {\n await restoreMergedFactVectorState({\n context: \"reflection\",\n factId: entry.id,\n category: \"pattern\",\n preMergeText,\n preMergeVector,\n preMergeEmbeddingModel,\n fallbackEmbeddingModel: embeddings.modelName,\n vectorDb,\n factsDb,\n logger,\n });\n }\n continue;\n }\n if (storeResult.newlyStored === false) {\n logger.warn(\n `memory-hybrid: reflection — preserving existing pattern fact ${entry.id.slice(0, 8)} after vector store failure on reused entry`,\n );\n continue;\n }\n if (!storeResult.embeddingStale) {\n try {\n factsDb.delete(entry.id);\n if (provenanceService) {\n try {\n provenanceService.deleteEdgesByFactId(entry.id);\n } catch (provErr) {\n logger.warn(\n `memory-hybrid: reflection — failed to clean up provenance for pattern fact ${entry.id.slice(0, 8)}: ${provErr}`,\n );\n }\n }\n try {\n await vectorDb.delete(entry.id);\n } catch (vecErr) {\n logger.warn(\n `memory-hybrid: reflection — failed to clean up vector for pattern fact ${entry.id.slice(0, 8)}: ${vecErr}`,\n );\n }\n logger.warn(\n `memory-hybrid: reflection — deleted pattern fact ${entry.id.slice(0, 8)} after vector store failure to prevent SQLite/LanceDB split`,\n );\n } catch (deleteErr) {\n logger.warn(\n `memory-hybrid: reflection — failed to delete pattern fact ${entry.id.slice(0, 8)} after vector store failure: ${deleteErr}`,\n );\n }\n continue;\n }\n }\n if (vectorStored) {\n try {\n persistCanonicalFactEmbedding(\n factsDb,\n entry.id,\n embeddings.modelName,\n vectorToStore,\n \"reflection-fact-embeddings\",\n \"reflection\",\n logger.warn?.bind(logger),\n );\n factsDb.setEmbeddingModel(entry.id, embeddings.modelName);\n } catch (err) {\n logger.warn(`memory-hybrid: reflection metadata update failed after vector store: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"reflection-metadata-update\",\n subsystem: \"sqlite\",\n factId: entry.id,\n });\n if (storeResult.embeddingStale) {\n const preMergeText = resolvePreMergeText(entry.text, patternText, storeResult.preMergeText);\n const hasPreMergeVector = Array.isArray(preMergeVector) && preMergeVector.length > 0;\n if (!preMergeText || !hasPreMergeVector) {\n logger.warn(\n `memory-hybrid: reflection — metadata rollback skipped for pattern fact ${entry.id.slice(0, 8)} because pre-merge vector state is unavailable; keeping merged text to avoid SQLite/LanceDB mismatch`,\n );\n continue;\n }\n try {\n (factsDb as FactsDB & { deleteEmbeddings?: (factId: string) => void }).deleteEmbeddings?.(entry.id);\n } catch (embErr) {\n logger.warn(\n `memory-hybrid: reflection — failed to delete canonical embeddings for pattern fact ${entry.id.slice(0, 8)} after metadata failure: ${embErr}`,\n );\n }\n if (preMergeVector && preMergeVector.length > 0) {\n try {\n await vectorDb.delete(entry.id);\n } catch (vecErr) {\n logger.warn(\n `memory-hybrid: reflection — failed to delete merged vector for pattern fact ${entry.id.slice(0, 8)} before rollback: ${vecErr}`,\n );\n }\n }\n const rolledBack = rollbackMergedFactText(factsDb, logger, {\n context: \"reflection\",\n factId: entry.id,\n mergedText: entry.text,\n appendedText: patternText,\n preMergeText: storeResult.preMergeText,\n reason: \"metadata-update-failure\",\n });\n if (rolledBack) {\n if (preMergeVector && preMergeVector.length > 0) {\n await restoreMergedFactVectorState({\n context: \"reflection\",\n factId: entry.id,\n category: \"pattern\",\n preMergeText,\n preMergeVector,\n preMergeEmbeddingModel,\n fallbackEmbeddingModel: embeddings.modelName,\n vectorDb,\n factsDb,\n logger,\n });\n } else {\n try {\n await vectorDb.delete(entry.id);\n logger.warn(\n `memory-hybrid: reflection — deleted merged vector for pattern fact ${entry.id.slice(0, 8)} after metadata failure (no pre-merge vector to restore)`,\n );\n } catch (vecErr) {\n logger.warn(\n `memory-hybrid: reflection — failed to delete merged vector for pattern fact ${entry.id.slice(0, 8)} after metadata failure: ${vecErr}`,\n );\n }\n }\n }\n vectorStored = false;\n continue;\n }\n // For new inserts, clean up the partial state\n if (storeResult.newlyStored !== false) {\n try {\n (factsDb as FactsDB & { deleteEmbeddings?: (factId: string) => void }).deleteEmbeddings?.(entry.id);\n } catch (embErr) {\n logger.warn(\n `memory-hybrid: reflection — failed to delete canonical embeddings for pattern fact ${entry.id.slice(0, 8)} after metadata failure: ${embErr}`,\n );\n }\n try {\n await vectorDb.delete(entry.id);\n } catch (vecErr) {\n logger.warn(\n `memory-hybrid: reflection — failed to delete Lance vector for pattern fact ${entry.id.slice(0, 8)} after metadata failure: ${vecErr}`,\n );\n }\n try {\n factsDb.delete(entry.id);\n } catch (deleteErr) {\n logger.warn(\n `memory-hybrid: reflection — failed to delete pattern fact ${entry.id.slice(0, 8)} after metadata failure: ${deleteErr}`,\n );\n }\n if (provenanceService) {\n try {\n provenanceService.deleteEdgesByFactId(entry.id);\n } catch (provErr) {\n logger.warn(\n `memory-hybrid: reflection — failed to clean up provenance for pattern fact ${entry.id.slice(0, 8)}: ${provErr}`,\n );\n }\n }\n logger.warn(\n `memory-hybrid: reflection — deleted pattern fact ${entry.id.slice(0, 8)} after metadata failure to prevent partial store`,\n );\n }\n vectorStored = false;\n continue;\n }\n }\n if (vectorStored) {\n if (provenanceService && reflectionRunId) {\n try {\n provenanceService.addEdge(entry.id, {\n edgeType: \"DERIVED_FROM\",\n sourceType: \"reflection\",\n sourceId: reflectionRunId,\n });\n } catch (err) {\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"reflection-provenance-derived\",\n subsystem: \"provenance\",\n factId: entry.id,\n });\n }\n }\n // If this was a merge (embeddingStale=true), replace the existing vector for this fact ID\n // instead of pushing a duplicate vector for the same fact.\n if (storeResult.embeddingStale) {\n const existingIndex = existingPatternFacts.findIndex((f) => f.id === entry.id);\n if (existingIndex >= 0 && existingIndex < existingVectors.length) {\n existingVectors[existingIndex] = normalizeVector(vectorToStore);\n } else {\n // Fact was inserted earlier in this loop, not in pre-run snapshot\n existingVectors.push(normalizeVector(vectorToStore));\n }\n inRunFactVectors.set(entry.id, { vector: vectorToStore, embeddingModel: embeddings.modelName });\n } else {\n existingVectors.push(normalizeVector(vectorToStore));\n inRunFactVectors.set(entry.id, { vector: vectorToStore, embeddingModel: embeddings.modelName });\n }\n stored++;\n }\n\n // Progress logging during per-candidate dedupe (every 3 candidates or at the end)\n // This is especially helpful when checking against a large existing corpus\n if (\n opts.verbose &&\n existingPatternFacts.length > 100 &&\n (candidateIndex % 3 === 0 || candidateIndex === uniqueNewPatterns.length)\n ) {\n const elapsedS = ((Date.now() - candidateStartMs) / 1000).toFixed(1);\n logger.info(\n `memory-hybrid: reflection — dedupe progress: ${candidateIndex}/${uniqueNewPatterns.length} candidates processed, ${stored} stored, ${duplicatesSkipped} duplicates, ${newPatternEmbedFailures} embed failures (elapsed: ${elapsedS}s)`,\n );\n }\n }\n\n if (!opts.dryRun) {\n factsDb.setMaintenanceState(\"reflection_input_hash\", inputHash);\n }\n logger.info(\n `memory-hybrid: reflection — finished: ${stored} pattern(s) stored in DB + vector index, ${duplicatesSkipped} skipped as near-duplicate(s), ${newPatternEmbedFailures} new-pattern embed failure(s), ${uniqueNewPatterns.length} candidate(s) total`,\n );\n if (storeDedupeVectorFallbackSuppressed > 0) {\n logger.info(\n `memory-hybrid: reflection — store dedupe used lexical-only for ${storeDedupeVectorFallbackSuppressed} store(s) (phase-level cosine dedupe already handled near-duplicates)`,\n );\n }\n\n touchReflectLastRun();\n return {\n factsAnalyzed: recentFacts.length,\n patternsExtracted: uniqueNewPatterns.length,\n patternsStored: stored,\n window: windowDays,\n };\n}\n\n/**\n * Rules layer — synthesize patterns into actionable one-line rules (category \"rule\").\n */\nexport async function runReflectionRules(\n factsDb: FactsDB,\n vectorDb: VectorDB,\n embeddings: EmbeddingProvider,\n openai: OpenAI,\n opts: {\n dryRun: boolean;\n model: string;\n verbose?: boolean;\n fallbackModels?: string[];\n modelSource?: string;\n adaptiveStatePath?: string;\n },\n logger: { info: (msg: string) => void; warn: (msg: string) => void },\n provenanceService?: ProvenanceService | null,\n): Promise<ReflectionRulesResult> {\n const baseDiagnostics: ReflectionRulesDiagnostics = {\n modelResponseChars: 0,\n parseSuccess: false,\n parsedCandidates: 0,\n rejectedDuplicates: 0,\n rejectedLowConfidence: 0,\n stored: 0,\n status: \"ok\",\n };\n const nowSec = Math.floor(Date.now() / 1000);\n const patternFacts = factsDb\n .getByCategory(\"pattern\")\n .filter((f) => !f.supersededAt && (f.expiresAt === null || f.expiresAt > nowSec));\n const patterns = patternFacts.slice(0, REFLECTION_MAX_PATTERNS_FOR_RULES).map((f) => f.text);\n if (patterns.length < 2) {\n logger.info(`memory-hybrid: reflect-rules — need at least 2 patterns, have ${patterns.length}`);\n const diagnostics: ReflectionRulesDiagnostics = {\n ...baseDiagnostics,\n zeroRulesReason: \"insufficient_patterns\",\n status: \"partial\",\n };\n logger.info(\n \"memory-hybrid: reflect-rules — diagnostics: \" +\n `model_response_chars=${diagnostics.modelResponseChars} ` +\n `parse_success=${diagnostics.parseSuccess} ` +\n `parsed_candidates=${diagnostics.parsedCandidates} ` +\n `rejected_duplicates=${diagnostics.rejectedDuplicates} ` +\n `rejected_low_confidence=${diagnostics.rejectedLowConfidence} ` +\n `stored=${diagnostics.stored} ` +\n `status=${diagnostics.status} zero_rules_reason=${diagnostics.zeroRulesReason}`,\n );\n return { rulesExtracted: 0, rulesStored: 0, diagnostics };\n }\n const patternsBlock = patterns.map((p, i) => `${i + 1}. ${p}`).join(\"\\n\");\n const prompt = fillPrompt(loadPrompt(\"reflection-rules\"), { patterns: patternsBlock });\n if (opts.verbose) {\n logger.info(\n `memory-hybrid: reflect-rules — LLM call (${prompt.length} chars, ${patterns.length} patterns, model=${opts.model})`,\n );\n }\n let rawResponse: string;\n try {\n const adaptiveEnabled = (getEnv(\"OPENCLAW_HYBRID_MEM_ADAPTIVE_DISTILL\") ?? \"\").trim() !== \"0\";\n const detail = await chatCompleteWithAdaptiveMaintenanceRetry({\n model: opts.model,\n modelSource: opts.modelSource,\n content: prompt,\n temperature: REFLECTION_TEMPERATURE,\n maxTokens: 800,\n openai,\n fallbackModels: opts.fallbackModels ?? [],\n label: \"memory-hybrid: reflect-rules\",\n feature: CostFeature.reflectionRules,\n logger,\n adaptiveStatePath: opts.adaptiveStatePath,\n enabled: adaptiveEnabled,\n });\n if (detail.modelUsed !== opts.model) {\n logger.info(`memory-hybrid: reflect-rules — used fallback model ${detail.modelUsed}`);\n }\n rawResponse = detail.content;\n } catch (err) {\n logger.warn(`memory-hybrid: reflect-rules LLM failed: ${err}`);\n const retryAttempt = err instanceof LLMRetryError ? err.attemptNumber : 1;\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"reflection-rules-llm\",\n subsystem: \"openai\",\n retryAttempt,\n });\n const diagnostics: ReflectionRulesDiagnostics = {\n ...baseDiagnostics,\n zeroRulesReason: \"llm_call_failed\",\n status: \"degraded\",\n };\n logger.info(\n \"memory-hybrid: reflect-rules — diagnostics: \" +\n `model_response_chars=${diagnostics.modelResponseChars} ` +\n `parse_success=${diagnostics.parseSuccess} ` +\n `parsed_candidates=${diagnostics.parsedCandidates} ` +\n `rejected_duplicates=${diagnostics.rejectedDuplicates} ` +\n `rejected_low_confidence=${diagnostics.rejectedLowConfidence} ` +\n `stored=${diagnostics.stored} ` +\n `status=${diagnostics.status} zero_rules_reason=${diagnostics.zeroRulesReason}`,\n );\n return { rulesExtracted: 0, rulesStored: 0, diagnostics };\n }\n const trimmedResponse = rawResponse.trim();\n const strippedResponse = stripThinkingWrapperBlocks(trimmedResponse);\n const wrapperContents = extractThinkingWrapperContents(trimmedResponse);\n const responseForParsing = strippedResponse.length > 0 ? strippedResponse : trimmedResponse;\n const rules: string[] = [];\n let rejectedLowConfidence = 0;\n let rejectedLength = 0;\n let parseableLines = 0;\n for (const line of responseForParsing.split(/\\n/)) {\n const m = line.match(/^\\s*RULE:\\s*(.+)/);\n if (!m) continue;\n parseableLines++;\n let text = m[1].trim();\n if (LOW_CONFIDENCE_PREFIX_PATTERN.test(text)) {\n rejectedLowConfidence++;\n continue;\n }\n const confidencePrefix = text.match(EXPLICIT_CONFIDENCE_PREFIX_PATTERN);\n if (confidencePrefix?.groups?.value) {\n const confidence = Number.parseFloat(confidencePrefix.groups.value);\n text = text.slice(confidencePrefix[0].length).trim();\n if (Number.isFinite(confidence) && confidence < REFLECTION_RULE_MIN_CONFIDENCE) {\n rejectedLowConfidence++;\n continue;\n }\n }\n if (text.length >= REFLECTION_RULE_MIN_CHARS && text.length <= REFLECTION_RULE_MAX_CHARS) {\n rules.push(text);\n } else {\n rejectedLength++;\n }\n }\n for (const wrapperContent of wrapperContents) {\n for (const line of wrapperContent.split(/\\n/)) {\n const m = line.match(/^\\s*RULE:\\s*(.+)/);\n if (!m) continue;\n parseableLines++;\n let text = m[1].trim();\n if (LOW_CONFIDENCE_PREFIX_PATTERN.test(text)) {\n rejectedLowConfidence++;\n continue;\n }\n const confidencePrefix = text.match(EXPLICIT_CONFIDENCE_PREFIX_PATTERN);\n if (confidencePrefix?.groups?.value) {\n const confidence = Number.parseFloat(confidencePrefix.groups.value);\n text = text.slice(confidencePrefix[0].length).trim();\n if (Number.isFinite(confidence) && confidence < REFLECTION_RULE_MIN_CONFIDENCE) {\n rejectedLowConfidence++;\n continue;\n }\n }\n if (text.length >= REFLECTION_RULE_MIN_CHARS && text.length <= REFLECTION_RULE_MAX_CHARS) {\n rules.push(text);\n } else {\n rejectedLength++;\n }\n }\n }\n const seenInBatch = new Set<string>();\n const uniqueRules: string[] = [];\n let rejectedDuplicates = 0;\n for (const r of rules) {\n const key = r.toLowerCase().replace(/\\s+/g, \" \");\n if (seenInBatch.has(key)) {\n rejectedDuplicates++;\n continue;\n }\n seenInBatch.add(key);\n uniqueRules.push(r);\n }\n const wrapperTagStrippedResponse = stripThinkingWrapperTagsKeepContent(trimmedResponse);\n const noRulesClassificationResponse = strippedResponse.length > 0 ? strippedResponse : wrapperTagStrippedResponse;\n const containsRuleLineInResponse =\n /(?:^|\\n)\\s*RULE:/i.test(noRulesClassificationResponse) ||\n wrapperContents.some((content) => /(?:^|\\n)\\s*RULE:/i.test(content));\n const looksLikeValidNoRules =\n !containsRuleLineInResponse &&\n (VALID_NO_RULES_PATTERN.test(noRulesClassificationResponse) ||\n wrapperContents.some((content) => VALID_NO_RULES_PATTERN.test(content)));\n const parseSuccess = parseableLines > 0 || looksLikeValidNoRules;\n const modelResponseChars = rawResponse.length;\n if (uniqueRules.length === 0) {\n logger.info(\"memory-hybrid: reflect-rules — 0 rules extracted from LLM\");\n const zeroRulesReason =\n parseableLines > 0 && rejectedDuplicates > 0 && rejectedLowConfidence === 0 && rejectedLength === 0\n ? \"all_candidates_duplicate\"\n : parseableLines > 0 && rejectedLowConfidence > 0 && rejectedDuplicates === 0 && rejectedLength === 0\n ? \"all_candidates_rejected_low_confidence\"\n : parseableLines > 0 && rejectedLength > 0 && rejectedLowConfidence === 0 && rejectedDuplicates === 0\n ? \"all_candidates_rejected_length\"\n : parseableLines > 0\n ? \"all_candidates_rejected\"\n : looksLikeValidNoRules\n ? \"valid_no_actionable_rules\"\n : noRulesClassificationResponse.length === 0\n ? \"empty_model_response\"\n : \"invalid_response_format\";\n const diagnostics: ReflectionRulesDiagnostics = {\n modelResponseChars,\n parseSuccess,\n parsedCandidates: parseableLines,\n rejectedDuplicates,\n rejectedLowConfidence,\n stored: 0,\n zeroRulesReason,\n status:\n zeroRulesReason === \"invalid_response_format\" || zeroRulesReason === \"empty_model_response\"\n ? \"degraded\"\n : zeroRulesReason === \"valid_no_actionable_rules\"\n ? \"ok\"\n : \"partial\",\n };\n logger.info(\n \"memory-hybrid: reflect-rules — diagnostics: \" +\n `model_response_chars=${diagnostics.modelResponseChars} ` +\n `parse_success=${diagnostics.parseSuccess} ` +\n `parsed_candidates=${diagnostics.parsedCandidates} ` +\n `rejected_duplicates=${diagnostics.rejectedDuplicates} ` +\n `rejected_low_confidence=${diagnostics.rejectedLowConfidence} ` +\n `stored=${diagnostics.stored} ` +\n `status=${diagnostics.status} zero_rules_reason=${diagnostics.zeroRulesReason}`,\n );\n return { rulesExtracted: uniqueRules.length, rulesStored: 0, diagnostics };\n }\n\n logger.info(\n `memory-hybrid: reflect-rules — LLM completed successfully: ${uniqueRules.length} candidate rule(s) after parse (next: load prior rule vectors for dedupe, then each new rule)`,\n );\n\n if (opts.verbose) {\n logger.info(`memory-hybrid: reflect-rules — extracted ${uniqueRules.length} rules:`);\n for (const rule of uniqueRules) {\n logger.info(` RULE: ${rule}`);\n }\n }\n const existingRuleFacts = factsDb\n .getByCategory(\"rule\")\n .filter((f) => !f.supersededAt && (f.expiresAt === null || f.expiresAt > nowSec));\n let existingVectors: (number[] | null)[] = [];\n if (existingRuleFacts.length > 0) {\n logger.info(\n `memory-hybrid: reflect-rules — loading ${existingRuleFacts.length} existing rule row(s) for dedupe (Lance vectors + embedding API when index or model is missing)`,\n );\n existingVectors = await loadReflectionDedupeCorpusVectors(\n existingRuleFacts,\n embeddings,\n vectorDb,\n logger,\n \"memory-hybrid: reflect-rules\",\n \"reflection-rules-embed-existing\",\n (factId, model) => factsDb.setEmbeddingModel(factId, model),\n opts.dryRun,\n );\n } else {\n logger.info(\"memory-hybrid: reflect-rules — no existing rule facts for dedupe; embedding new candidates only\");\n }\n\n logger.info(\n `memory-hybrid: reflect-rules — embedding ${uniqueRules.length} new candidate rule(s) for duplicate check + storage`,\n );\n\n let stored = 0;\n let rulesDuplicatesSkipped = 0;\n const batchDuplicatesSkipped = rejectedDuplicates;\n let embeddingBasedDuplicates = 0;\n let storeLevelDuplicates = 0;\n let newRuleEmbedFailures = 0;\n let vectorStoreFailures = 0;\n let metadataFailures = 0;\n let storeSkipped = 0;\n let storeDedupeVectorFallbackSuppressed = 0;\n const reflectionRunId = provenanceService ? randomUUID() : null;\n const inRunFactVectors = new Map<string, { vector: number[]; embeddingModel: string }>();\n for (const ruleText of uniqueRules) {\n let vec: number[];\n try {\n vec = await embeddings.embed(ruleText);\n } catch (err) {\n newRuleEmbedFailures++;\n // AllEmbeddingProvidersFailed is expected when all providers are unavailable — don't report (#486)\n if (!shouldSuppressEmbeddingError(err)) {\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"embed-rule\",\n severity: \"info\",\n subsystem: \"reflection\",\n });\n }\n continue; // Skip this rule on embed failure\n }\n const normVec = normalizeVector(vec);\n let isDuplicate = false;\n for (const ev of existingVectors) {\n if (ev === null || ev.length === 0) continue;\n if (dotProductSimilarity(normVec, ev) >= REFLECTION_DEDUPE_THRESHOLD) {\n isDuplicate = true;\n break;\n }\n }\n if (isDuplicate) {\n rulesDuplicatesSkipped++;\n embeddingBasedDuplicates++;\n if (opts.verbose) {\n logger.info(`memory-hybrid: reflect-rules — skipped duplicate: ${ruleText.slice(0, 50)}...`);\n }\n continue;\n }\n if (opts.dryRun) {\n logger.info(`memory-hybrid: reflect-rules [dry-run] would store: ${ruleText.slice(0, 50)}...`);\n stored++;\n continue;\n }\n storeDedupeVectorFallbackSuppressed++;\n const storeResult = factsDb.storeWithResult(\n {\n text: ruleText,\n category: \"rule\" as MemoryCategory,\n importance: REFLECTION_IMPORTANCE,\n entity: null,\n key: null,\n value: null,\n source: \"reflection\",\n decayClass: \"permanent\",\n tags: [\"reflection\", \"rule\"],\n extractionMethod: \"reflection\",\n extractionConfidence: REFLECTION_IMPORTANCE,\n },\n {\n warnContext: \"reflect-rules\",\n suppressVectorFallbackWarning: true,\n },\n );\n if (storeResult.skipped) {\n storeSkipped++;\n continue;\n }\n const entry = storeResult.entry;\n const mergeExistingIndex = storeResult.embeddingStale ? existingRuleFacts.findIndex((f) => f.id === entry.id) : -1;\n const inRunMerge = storeResult.embeddingStale && mergeExistingIndex < 0 ? inRunFactVectors.get(entry.id) : null;\n const preMergeVector =\n mergeExistingIndex >= 0 && mergeExistingIndex < existingVectors.length\n ? existingVectors[mergeExistingIndex]\n : (inRunMerge?.vector ?? null);\n const preMergeEmbeddingModel =\n mergeExistingIndex >= 0\n ? (existingRuleFacts[mergeExistingIndex]?.embeddingModel ?? null)\n : (inRunMerge?.embeddingModel ?? null);\n // Skip reused existing facts unless this was a merge update that requires re-embed.\n if (reusedExistingStoreEntry(storeResult, ruleText) && !storeResult.embeddingStale) {\n storeLevelDuplicates++;\n rulesDuplicatesSkipped++;\n // Keep this candidate in the in-run dedupe corpus so later rules don't miss near-duplicates.\n existingVectors.push(normVec);\n if (opts.verbose) {\n logger.info(`memory-hybrid: reflect-rules — skipped store-level duplicate: ${ruleText.slice(0, 50)}...`);\n }\n continue;\n }\n // CRITICAL FIX (#2): Delete vector for evicted fact to prevent orphaned vectors\n await cleanupEvictedVector({\n vectorDb: vectorDb,\n evictedFactId: storeResult.evictedFactId,\n logger: logger,\n context: \"reflection\",\n });\n if (opts.verbose) {\n logger.info(\n `memory-hybrid: reflect-rules — stored rule: ${ruleText.slice(0, 100)}${ruleText.length > 100 ? \"...\" : \"\"}`,\n );\n }\n // If embeddingStale=true (merge path), re-embed the updated merged text\n let textToEmbed = ruleText;\n let vectorToStore: number[];\n if (storeResult.embeddingStale) {\n try {\n textToEmbed = entry.text;\n vectorToStore = await embeddings.embed(textToEmbed);\n } catch (err) {\n newRuleEmbedFailures++;\n if (!shouldSuppressEmbeddingError(err)) {\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"embed-rule-merge\",\n severity: \"info\",\n subsystem: \"reflection\",\n });\n }\n rollbackMergedFactText(factsDb, logger, {\n context: \"reflect-rules\",\n factId: entry.id,\n mergedText: entry.text,\n appendedText: ruleText,\n preMergeText: storeResult.preMergeText,\n reason: \"merge-reembed-failure\",\n });\n continue;\n }\n } else {\n vectorToStore = vec;\n }\n let vectorStored = false;\n try {\n await vectorDb.store({\n text: textToEmbed,\n vector: vectorToStore,\n importance: REFLECTION_IMPORTANCE,\n category: \"rule\",\n id: entry.id,\n });\n vectorStored = true;\n } catch (err) {\n vectorStoreFailures++;\n logger.warn(`memory-hybrid: reflect-rules vector store failed: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"reflection-rules-vector-store\",\n subsystem: \"vector\",\n factId: entry.id,\n });\n if (storeResult.embeddingStale) {\n const preMergeText = resolvePreMergeText(entry.text, ruleText, storeResult.preMergeText);\n const rolledBack = rollbackMergedFactText(factsDb, logger, {\n context: \"reflect-rules\",\n factId: entry.id,\n mergedText: entry.text,\n appendedText: ruleText,\n preMergeText: storeResult.preMergeText,\n reason: \"vector-store-failure\",\n });\n if (rolledBack) {\n await restoreMergedFactVectorState({\n context: \"reflect-rules\",\n factId: entry.id,\n category: \"rule\",\n preMergeText,\n preMergeVector,\n preMergeEmbeddingModel,\n fallbackEmbeddingModel: embeddings.modelName,\n vectorDb,\n factsDb,\n logger,\n });\n }\n continue;\n }\n if (storeResult.newlyStored === false) {\n logger.warn(\n `memory-hybrid: reflect-rules — preserving existing rule fact ${entry.id.slice(0, 8)} after vector store failure on reused entry`,\n );\n continue;\n }\n if (!storeResult.embeddingStale) {\n try {\n factsDb.delete(entry.id);\n if (provenanceService) {\n try {\n provenanceService.deleteEdgesByFactId(entry.id);\n } catch (provErr) {\n logger.warn(\n `memory-hybrid: reflect-rules — failed to clean up provenance for rule fact ${entry.id.slice(0, 8)}: ${provErr}`,\n );\n }\n }\n try {\n await vectorDb.delete(entry.id);\n } catch (vecErr) {\n logger.warn(\n `memory-hybrid: reflect-rules — failed to clean up vector for rule fact ${entry.id.slice(0, 8)}: ${vecErr}`,\n );\n }\n logger.warn(\n `memory-hybrid: reflect-rules — deleted rule fact ${entry.id.slice(0, 8)} after vector store failure to prevent SQLite/LanceDB split`,\n );\n } catch (deleteErr) {\n logger.warn(\n `memory-hybrid: reflect-rules — failed to delete rule fact ${entry.id.slice(0, 8)} after vector store failure: ${deleteErr}`,\n );\n }\n continue;\n }\n }\n if (vectorStored) {\n try {\n persistCanonicalFactEmbedding(\n factsDb,\n entry.id,\n embeddings.modelName,\n vectorToStore,\n \"reflection-fact-embeddings\",\n \"reflection\",\n logger.warn?.bind(logger),\n );\n factsDb.setEmbeddingModel(entry.id, embeddings.modelName);\n } catch (err) {\n metadataFailures++;\n logger.warn(`memory-hybrid: reflect-rules metadata update failed after vector store: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"reflection-rules-metadata-update\",\n subsystem: \"sqlite\",\n factId: entry.id,\n });\n if (storeResult.embeddingStale) {\n const preMergeText = resolvePreMergeText(entry.text, ruleText, storeResult.preMergeText);\n const hasPreMergeVector = Array.isArray(preMergeVector) && preMergeVector.length > 0;\n if (!preMergeText || !hasPreMergeVector) {\n logger.warn(\n `memory-hybrid: reflect-rules — metadata rollback skipped for rule fact ${entry.id.slice(0, 8)} because pre-merge vector state is unavailable; keeping merged text to avoid SQLite/LanceDB mismatch`,\n );\n continue;\n }\n try {\n (factsDb as FactsDB & { deleteEmbeddings?: (factId: string) => void }).deleteEmbeddings?.(entry.id);\n } catch (embErr) {\n logger.warn(\n `memory-hybrid: reflect-rules — failed to delete canonical embeddings for rule fact ${entry.id.slice(0, 8)} after metadata failure: ${embErr}`,\n );\n }\n if (preMergeVector && preMergeVector.length > 0) {\n try {\n await vectorDb.delete(entry.id);\n } catch (vecErr) {\n logger.warn(\n `memory-hybrid: reflect-rules — failed to delete merged vector for rule fact ${entry.id.slice(0, 8)} before rollback: ${vecErr}`,\n );\n }\n }\n const rolledBack = rollbackMergedFactText(factsDb, logger, {\n context: \"reflect-rules\",\n factId: entry.id,\n mergedText: entry.text,\n appendedText: ruleText,\n preMergeText: storeResult.preMergeText,\n reason: \"metadata-update-failure\",\n });\n if (rolledBack) {\n if (preMergeVector && preMergeVector.length > 0) {\n await restoreMergedFactVectorState({\n context: \"reflect-rules\",\n factId: entry.id,\n category: \"rule\",\n preMergeText,\n preMergeVector,\n preMergeEmbeddingModel,\n fallbackEmbeddingModel: embeddings.modelName,\n vectorDb,\n factsDb,\n logger,\n });\n } else {\n try {\n await vectorDb.delete(entry.id);\n logger.warn(\n `memory-hybrid: reflect-rules — deleted merged vector for rule fact ${entry.id.slice(0, 8)} after metadata failure (no pre-merge vector to restore)`,\n );\n } catch (vecErr) {\n logger.warn(\n `memory-hybrid: reflect-rules — failed to delete merged vector for rule fact ${entry.id.slice(0, 8)} after metadata failure: ${vecErr}`,\n );\n }\n }\n }\n vectorStored = false;\n continue;\n }\n // For new inserts, clean up the partial state\n if (storeResult.newlyStored !== false) {\n try {\n (factsDb as FactsDB & { deleteEmbeddings?: (factId: string) => void }).deleteEmbeddings?.(entry.id);\n } catch (embErr) {\n logger.warn(\n `memory-hybrid: reflect-rules — failed to delete canonical embeddings for rule fact ${entry.id.slice(0, 8)} after metadata failure: ${embErr}`,\n );\n }\n try {\n await vectorDb.delete(entry.id);\n } catch (vecErr) {\n logger.warn(\n `memory-hybrid: reflect-rules — failed to delete Lance vector for rule fact ${entry.id.slice(0, 8)} after metadata failure: ${vecErr}`,\n );\n }\n try {\n factsDb.delete(entry.id);\n } catch (deleteErr) {\n logger.warn(\n `memory-hybrid: reflect-rules — failed to delete rule fact ${entry.id.slice(0, 8)} after metadata failure: ${deleteErr}`,\n );\n }\n if (provenanceService) {\n try {\n provenanceService.deleteEdgesByFactId(entry.id);\n } catch (provErr) {\n logger.warn(\n `memory-hybrid: reflect-rules — failed to clean up provenance for rule fact ${entry.id.slice(0, 8)}: ${provErr}`,\n );\n }\n }\n logger.warn(\n `memory-hybrid: reflect-rules — deleted rule fact ${entry.id.slice(0, 8)} after metadata failure to prevent partial store`,\n );\n }\n vectorStored = false;\n continue;\n }\n }\n if (vectorStored) {\n if (provenanceService && reflectionRunId) {\n try {\n provenanceService.addEdge(entry.id, {\n edgeType: \"DERIVED_FROM\",\n sourceType: \"reflection\",\n sourceId: reflectionRunId,\n });\n } catch (err) {\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"reflection-rules-provenance-derived\",\n subsystem: \"provenance\",\n factId: entry.id,\n });\n }\n }\n // If this was a merge (embeddingStale=true), replace the existing vector for this fact ID\n // instead of pushing a duplicate vector for the same fact.\n if (storeResult.embeddingStale) {\n const existingIndex = existingRuleFacts.findIndex((f) => f.id === entry.id);\n if (existingIndex >= 0 && existingIndex < existingVectors.length) {\n existingVectors[existingIndex] = normalizeVector(vectorToStore);\n } else {\n // Fact was inserted earlier in this loop, not in pre-run snapshot\n existingVectors.push(normalizeVector(vectorToStore));\n }\n inRunFactVectors.set(entry.id, { vector: vectorToStore, embeddingModel: embeddings.modelName });\n } else {\n existingVectors.push(normalizeVector(vectorToStore));\n inRunFactVectors.set(entry.id, { vector: vectorToStore, embeddingModel: embeddings.modelName });\n }\n stored++;\n }\n }\n\n logger.info(\n `memory-hybrid: reflect-rules — finished: ${stored} rule(s) stored, ${batchDuplicatesSkipped} skipped as batch duplicate(s), ${rulesDuplicatesSkipped} skipped as near-duplicate(s), ${newRuleEmbedFailures} new-rule embed failure(s), ${uniqueRules.length} candidate(s) total`,\n );\n if (storeDedupeVectorFallbackSuppressed > 0) {\n logger.info(\n `memory-hybrid: reflect-rules — store dedupe used lexical-only for ${storeDedupeVectorFallbackSuppressed} store(s) (phase-level cosine dedupe already handled near-duplicates)`,\n );\n }\n\n let zeroRulesReason: ReflectionRulesDiagnostics[\"zeroRulesReason\"];\n if (stored <= 0) {\n const allCandidatesBlocked =\n newRuleEmbedFailures +\n embeddingBasedDuplicates +\n storeLevelDuplicates +\n vectorStoreFailures +\n metadataFailures +\n storeSkipped ===\n uniqueRules.length;\n if (vectorStoreFailures === uniqueRules.length) {\n // All candidates failed only at vector store\n zeroRulesReason = \"vector_store_failed\";\n } else if (newRuleEmbedFailures === uniqueRules.length) {\n // All candidates failed at embedding\n zeroRulesReason = \"all_candidates_embedding_failed\";\n } else if (metadataFailures === uniqueRules.length) {\n // All candidates failed at metadata persistence\n zeroRulesReason = \"all_candidates_metadata_failed\";\n } else if (embeddingBasedDuplicates + storeLevelDuplicates === uniqueRules.length) {\n // All candidates are duplicates (no failures)\n zeroRulesReason = \"all_candidates_duplicate\";\n } else if (\n allCandidatesBlocked &&\n vectorStoreFailures > 0 &&\n (embeddingBasedDuplicates > 0 || storeLevelDuplicates > 0)\n ) {\n // Mixed: some vector store failures and some duplicates\n zeroRulesReason = \"candidates_duplicate_or_vector_store_failed\";\n } else if (allCandidatesBlocked && newRuleEmbedFailures > 0) {\n // Mixed: some embedding failures and other blocks\n zeroRulesReason = \"candidates_duplicate_or_embedding_failed\";\n } else {\n zeroRulesReason = \"no_storable_candidates\";\n }\n }\n const diagnostics: ReflectionRulesDiagnostics = {\n modelResponseChars,\n parseSuccess,\n parsedCandidates: parseableLines,\n rejectedDuplicates: batchDuplicatesSkipped + rulesDuplicatesSkipped,\n rejectedLowConfidence,\n stored,\n zeroRulesReason,\n status:\n stored > 0 &&\n stored === uniqueRules.length &&\n newRuleEmbedFailures === 0 &&\n vectorStoreFailures === 0 &&\n metadataFailures === 0\n ? \"ok\"\n : stored > 0\n ? \"partial\"\n : zeroRulesReason === \"all_candidates_embedding_failed\"\n ? \"degraded\"\n : zeroRulesReason === \"candidates_duplicate_or_embedding_failed\"\n ? \"degraded\"\n : zeroRulesReason === \"all_candidates_duplicate\"\n ? \"partial\"\n : zeroRulesReason === \"candidates_duplicate_or_vector_store_failed\"\n ? \"partial\"\n : zeroRulesReason === \"vector_store_failed\"\n ? \"partial\"\n : zeroRulesReason === \"all_candidates_metadata_failed\"\n ? \"partial\"\n : \"partial\",\n };\n logger.info(\n \"memory-hybrid: reflect-rules — diagnostics: \" +\n `model_response_chars=${diagnostics.modelResponseChars} ` +\n `parse_success=${diagnostics.parseSuccess} ` +\n `parsed_candidates=${diagnostics.parsedCandidates} ` +\n `rejected_duplicates=${diagnostics.rejectedDuplicates} ` +\n `rejected_low_confidence=${diagnostics.rejectedLowConfidence} ` +\n `stored=${diagnostics.stored} ` +\n `status=${diagnostics.status}` +\n (diagnostics.zeroRulesReason ? ` zero_rules_reason=${diagnostics.zeroRulesReason}` : \"\"),\n );\n return { rulesExtracted: uniqueRules.length, rulesStored: stored, diagnostics };\n}\n\n/**\n * Reflection on reflections — synthesize patterns into 1-3 meta-patterns (stored as pattern + meta tag).\n */\nexport async function runReflectionMeta(\n factsDb: FactsDB,\n vectorDb: VectorDB,\n embeddings: EmbeddingProvider,\n openai: OpenAI,\n opts: {\n dryRun: boolean;\n model: string;\n verbose?: boolean;\n fallbackModels?: string[];\n modelSource?: string;\n adaptiveStatePath?: string;\n },\n logger: { info: (msg: string) => void; warn: (msg: string) => void },\n provenanceService?: ProvenanceService | null,\n): Promise<ReflectionMetaResult> {\n const nowSec = Math.floor(Date.now() / 1000);\n const patternFacts = factsDb\n .getByCategory(\"pattern\")\n .filter((f) => !f.supersededAt && (f.expiresAt === null || f.expiresAt > nowSec));\n const patterns = patternFacts.slice(0, REFLECTION_MAX_PATTERNS_FOR_META).map((f) => f.text);\n if (patterns.length < 3) {\n logger.info(`memory-hybrid: reflect-meta — need at least 3 patterns, have ${patterns.length}`);\n return { metaExtracted: 0, metaStored: 0 };\n }\n const patternsBlock = patterns.map((p, i) => `${i + 1}. ${p}`).join(\"\\n\");\n const prompt = fillPrompt(loadPrompt(\"reflection-meta\"), { patterns: patternsBlock });\n if (opts.verbose) {\n logger.info(\n `memory-hybrid: reflect-meta — LLM call (${prompt.length} chars, ${patterns.length} patterns, model=${opts.model})`,\n );\n }\n let rawResponse: string;\n try {\n const adaptiveEnabled = (getEnv(\"OPENCLAW_HYBRID_MEM_ADAPTIVE_DISTILL\") ?? \"\").trim() !== \"0\";\n const detail = await chatCompleteWithAdaptiveMaintenanceRetry({\n model: opts.model,\n modelSource: opts.modelSource,\n content: prompt,\n temperature: REFLECTION_TEMPERATURE,\n maxTokens: 500,\n openai,\n fallbackModels: opts.fallbackModels ?? [],\n label: \"memory-hybrid: reflect-meta\",\n feature: CostFeature.reflectionMeta,\n logger,\n adaptiveStatePath: opts.adaptiveStatePath,\n enabled: adaptiveEnabled,\n });\n if (detail.modelUsed !== opts.model) {\n logger.info(`memory-hybrid: reflect-meta — used fallback model ${detail.modelUsed}`);\n }\n rawResponse = detail.content;\n } catch (err) {\n logger.warn(`memory-hybrid: reflect-meta LLM failed: ${err}`);\n const retryAttempt = err instanceof LLMRetryError ? err.attemptNumber : 1;\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"reflection-meta-llm\",\n subsystem: \"openai\",\n retryAttempt,\n });\n return { metaExtracted: 0, metaStored: 0 };\n }\n const metas: string[] = [];\n for (const line of rawResponse.split(/\\n/)) {\n const m = line.match(/^\\s*META:\\s*(.+)/);\n if (!m) continue;\n const text = m[1].trim();\n if (text.length >= REFLECTION_META_MIN_CHARS && text.length <= REFLECTION_META_MAX_CHARS) metas.push(text);\n }\n const seenInBatch = new Set<string>();\n const uniqueMetas: string[] = [];\n for (const x of metas) {\n const key = x.toLowerCase().replace(/\\s+/g, \" \");\n if (seenInBatch.has(key)) continue;\n seenInBatch.add(key);\n uniqueMetas.push(x);\n }\n if (uniqueMetas.length === 0) {\n logger.info(\"memory-hybrid: reflect-meta — 0 meta-patterns extracted from LLM\");\n return { metaExtracted: metas.length, metaStored: 0 };\n }\n\n logger.info(\n `memory-hybrid: reflect-meta — LLM completed successfully: ${uniqueMetas.length} candidate meta-pattern(s) after parse`,\n );\n\n if (opts.verbose) {\n logger.info(`memory-hybrid: reflect-meta — extracted ${uniqueMetas.length} meta-patterns:`);\n for (const meta of uniqueMetas) {\n logger.info(` META: ${meta}`);\n }\n }\n const existingMetaFacts = factsDb\n .getByCategory(\"pattern\")\n .filter(\n (f) => !f.supersededAt && (f.expiresAt === null || f.expiresAt > nowSec) && f.tags?.includes(\"meta\") === true,\n );\n let existingVectors: (number[] | null)[] = [];\n if (existingMetaFacts.length > 0) {\n logger.info(\n `memory-hybrid: reflect-meta — loading ${existingMetaFacts.length} existing meta-pattern row(s) for dedupe (Lance vectors + embedding API when index or model is missing)`,\n );\n existingVectors = await loadReflectionDedupeCorpusVectors(\n existingMetaFacts,\n embeddings,\n vectorDb,\n logger,\n \"memory-hybrid: reflect-meta\",\n \"reflection-meta-embed-existing\",\n (factId, model) => factsDb.setEmbeddingModel(factId, model),\n opts.dryRun,\n );\n } else {\n logger.info(\"memory-hybrid: reflect-meta — no existing meta-patterns for dedupe; embedding new candidates only\");\n }\n\n logger.info(\n `memory-hybrid: reflect-meta — embedding ${uniqueMetas.length} new candidate meta-pattern(s) for duplicate check + storage`,\n );\n\n let stored = 0;\n let metaDuplicatesSkipped = 0;\n let newMetaEmbedFailures = 0;\n let storeDedupeVectorFallbackSuppressed = 0;\n const reflectionRunId = provenanceService ? randomUUID() : null;\n const inRunFactVectors = new Map<string, { vector: number[]; embeddingModel: string }>();\n for (const metaText of uniqueMetas) {\n let vec: number[];\n try {\n vec = await embeddings.embed(metaText);\n } catch (err) {\n newMetaEmbedFailures++;\n // AllEmbeddingProvidersFailed is expected when all providers are unavailable — don't report (#486)\n if (!shouldSuppressEmbeddingError(err)) {\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"embed-meta\",\n severity: \"info\",\n subsystem: \"reflection\",\n });\n }\n continue; // Skip this meta-pattern on embed failure\n }\n const normVec = normalizeVector(vec);\n let isDuplicate = false;\n for (const ev of existingVectors) {\n if (ev === null || ev.length === 0) continue;\n if (dotProductSimilarity(normVec, ev) >= REFLECTION_DEDUPE_THRESHOLD) {\n isDuplicate = true;\n break;\n }\n }\n if (isDuplicate) {\n metaDuplicatesSkipped++;\n if (opts.verbose) {\n logger.info(`memory-hybrid: reflect-meta — skipped duplicate: ${metaText.slice(0, 50)}...`);\n }\n continue;\n }\n if (opts.dryRun) {\n logger.info(`memory-hybrid: reflect-meta [dry-run] would store: ${metaText.slice(0, 50)}...`);\n stored++;\n continue;\n }\n storeDedupeVectorFallbackSuppressed++;\n const storeResult = factsDb.storeWithResult(\n {\n text: metaText,\n category: \"pattern\" as MemoryCategory,\n importance: REFLECTION_IMPORTANCE,\n entity: null,\n key: null,\n value: null,\n source: \"reflection\",\n decayClass: \"permanent\",\n tags: [\"reflection\", \"pattern\", \"meta\"],\n extractionMethod: \"reflection\",\n extractionConfidence: REFLECTION_IMPORTANCE,\n },\n {\n warnContext: \"reflect-meta\",\n suppressVectorFallbackWarning: true,\n },\n );\n if (storeResult.skipped) {\n continue;\n }\n const entry = storeResult.entry;\n const mergeExistingIndex = storeResult.embeddingStale ? existingMetaFacts.findIndex((f) => f.id === entry.id) : -1;\n const inRunMerge = storeResult.embeddingStale && mergeExistingIndex < 0 ? inRunFactVectors.get(entry.id) : null;\n const preMergeVector =\n mergeExistingIndex >= 0 && mergeExistingIndex < existingVectors.length\n ? existingVectors[mergeExistingIndex]\n : (inRunMerge?.vector ?? null);\n const preMergeEmbeddingModel =\n mergeExistingIndex >= 0\n ? (existingMetaFacts[mergeExistingIndex]?.embeddingModel ?? null)\n : (inRunMerge?.embeddingModel ?? null);\n // Skip reused existing facts unless this was a merge update that requires re-embed.\n if (reusedExistingStoreEntry(storeResult, metaText) && !storeResult.embeddingStale) {\n metaDuplicatesSkipped++;\n // Keep this candidate in the in-run dedupe corpus so later meta-patterns don't miss near-duplicates.\n existingVectors.push(normVec);\n if (opts.verbose) {\n logger.info(`memory-hybrid: reflect-meta — skipped store-level duplicate: ${metaText.slice(0, 50)}...`);\n }\n continue;\n }\n // CRITICAL FIX (#2): Delete vector for evicted fact to prevent orphaned vectors\n await cleanupEvictedVector({\n vectorDb: vectorDb,\n evictedFactId: storeResult.evictedFactId,\n logger: logger,\n context: \"reflection\",\n });\n if (opts.verbose) {\n logger.info(\n `memory-hybrid: reflect-meta — stored meta-pattern: ${metaText.slice(0, 100)}${metaText.length > 100 ? \"...\" : \"\"}`,\n );\n }\n // If embeddingStale=true (merge path), re-embed the updated merged text\n let textToEmbed: string;\n let vectorToStore: number[];\n if (storeResult.embeddingStale) {\n try {\n textToEmbed = entry.text;\n vectorToStore = await embeddings.embed(textToEmbed);\n } catch (err) {\n newMetaEmbedFailures++;\n if (!shouldSuppressEmbeddingError(err)) {\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"embed-meta-merge\",\n severity: \"info\",\n subsystem: \"reflection\",\n });\n }\n rollbackMergedFactText(factsDb, logger, {\n context: \"reflect-meta\",\n factId: entry.id,\n mergedText: entry.text,\n appendedText: metaText,\n preMergeText: storeResult.preMergeText,\n reason: \"merge-reembed-failure\",\n });\n continue;\n }\n } else {\n textToEmbed = metaText;\n vectorToStore = vec;\n }\n let vectorStored = false;\n try {\n await vectorDb.store({\n text: textToEmbed,\n vector: vectorToStore,\n importance: REFLECTION_IMPORTANCE,\n category: \"pattern\",\n id: entry.id,\n });\n vectorStored = true;\n } catch (err) {\n logger.warn(`memory-hybrid: reflect-meta vector store failed: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"reflection-meta-vector-store\",\n subsystem: \"vector\",\n factId: entry.id,\n });\n if (storeResult.embeddingStale) {\n const preMergeText = resolvePreMergeText(entry.text, metaText, storeResult.preMergeText);\n const rolledBack = rollbackMergedFactText(factsDb, logger, {\n context: \"reflect-meta\",\n factId: entry.id,\n mergedText: entry.text,\n appendedText: metaText,\n preMergeText: storeResult.preMergeText,\n reason: \"vector-store-failure\",\n });\n if (rolledBack) {\n await restoreMergedFactVectorState({\n context: \"reflect-meta\",\n factId: entry.id,\n category: \"pattern\",\n preMergeText,\n preMergeVector,\n preMergeEmbeddingModel,\n fallbackEmbeddingModel: embeddings.modelName,\n vectorDb,\n factsDb,\n logger,\n });\n }\n continue;\n }\n if (storeResult.newlyStored === false) {\n logger.warn(\n `memory-hybrid: reflect-meta — preserving existing meta-pattern fact ${entry.id.slice(0, 8)} after vector store failure on reused entry`,\n );\n continue;\n }\n if (!storeResult.embeddingStale) {\n try {\n factsDb.delete(entry.id);\n if (provenanceService) {\n try {\n provenanceService.deleteEdgesByFactId(entry.id);\n } catch (provErr) {\n logger.warn(\n `memory-hybrid: reflect-meta — failed to clean up provenance for meta-pattern fact ${entry.id.slice(0, 8)}: ${provErr}`,\n );\n }\n }\n try {\n await vectorDb.delete(entry.id);\n } catch (vecErr) {\n logger.warn(\n `memory-hybrid: reflect-meta — failed to clean up vector for meta-pattern fact ${entry.id.slice(0, 8)}: ${vecErr}`,\n );\n }\n logger.warn(\n `memory-hybrid: reflect-meta — deleted meta-pattern fact ${entry.id.slice(0, 8)} after vector store failure to prevent SQLite/LanceDB split`,\n );\n } catch (deleteErr) {\n logger.warn(\n `memory-hybrid: reflect-meta — failed to delete meta-pattern fact ${entry.id.slice(0, 8)} after vector store failure: ${deleteErr}`,\n );\n }\n continue;\n }\n }\n if (vectorStored) {\n try {\n persistCanonicalFactEmbedding(\n factsDb,\n entry.id,\n embeddings.modelName,\n vectorToStore,\n \"reflection-fact-embeddings\",\n \"reflection\",\n logger.warn?.bind(logger),\n );\n factsDb.setEmbeddingModel(entry.id, embeddings.modelName);\n } catch (err) {\n logger.warn(`memory-hybrid: reflect-meta metadata update failed after vector store: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"reflection-meta-metadata-update\",\n subsystem: \"sqlite\",\n factId: entry.id,\n });\n if (storeResult.embeddingStale) {\n const preMergeText = resolvePreMergeText(entry.text, metaText, storeResult.preMergeText);\n const hasPreMergeVector = Array.isArray(preMergeVector) && preMergeVector.length > 0;\n if (!preMergeText || !hasPreMergeVector) {\n logger.warn(\n `memory-hybrid: reflect-meta — metadata rollback skipped for meta-pattern fact ${entry.id.slice(0, 8)} because pre-merge vector state is unavailable; keeping merged text to avoid SQLite/LanceDB mismatch`,\n );\n continue;\n }\n try {\n (factsDb as FactsDB & { deleteEmbeddings?: (factId: string) => void }).deleteEmbeddings?.(entry.id);\n } catch (embErr) {\n logger.warn(\n `memory-hybrid: reflect-meta — failed to delete canonical embeddings for meta-pattern fact ${entry.id.slice(0, 8)} after metadata failure: ${embErr}`,\n );\n }\n if (preMergeVector && preMergeVector.length > 0) {\n try {\n await vectorDb.delete(entry.id);\n } catch (vecErr) {\n logger.warn(\n `memory-hybrid: reflect-meta — failed to delete merged vector for meta-pattern fact ${entry.id.slice(0, 8)} before rollback: ${vecErr}`,\n );\n }\n }\n const rolledBack = rollbackMergedFactText(factsDb, logger, {\n context: \"reflect-meta\",\n factId: entry.id,\n mergedText: entry.text,\n appendedText: metaText,\n preMergeText: storeResult.preMergeText,\n reason: \"metadata-update-failure\",\n });\n if (rolledBack) {\n if (preMergeVector && preMergeVector.length > 0) {\n await restoreMergedFactVectorState({\n context: \"reflect-meta\",\n factId: entry.id,\n category: \"pattern\",\n preMergeText,\n preMergeVector,\n preMergeEmbeddingModel,\n fallbackEmbeddingModel: embeddings.modelName,\n vectorDb,\n factsDb,\n logger,\n });\n } else {\n try {\n await vectorDb.delete(entry.id);\n logger.warn(\n `memory-hybrid: reflect-meta — deleted merged vector for meta-pattern fact ${entry.id.slice(0, 8)} after metadata failure (no pre-merge vector to restore)`,\n );\n } catch (vecErr) {\n logger.warn(\n `memory-hybrid: reflect-meta — failed to delete merged vector for meta-pattern fact ${entry.id.slice(0, 8)} after metadata failure: ${vecErr}`,\n );\n }\n }\n }\n vectorStored = false;\n continue;\n }\n // For new inserts, clean up the partial state\n if (storeResult.newlyStored !== false) {\n try {\n (factsDb as FactsDB & { deleteEmbeddings?: (factId: string) => void }).deleteEmbeddings?.(entry.id);\n } catch (embErr) {\n logger.warn(\n `memory-hybrid: reflect-meta — failed to delete canonical embeddings for meta-pattern fact ${entry.id.slice(0, 8)} after metadata failure: ${embErr}`,\n );\n }\n try {\n await vectorDb.delete(entry.id);\n } catch (vecErr) {\n logger.warn(\n `memory-hybrid: reflect-meta — failed to delete Lance vector for meta-pattern fact ${entry.id.slice(0, 8)} after metadata failure: ${vecErr}`,\n );\n }\n try {\n factsDb.delete(entry.id);\n } catch (deleteErr) {\n logger.warn(\n `memory-hybrid: reflect-meta — failed to delete meta-pattern fact ${entry.id.slice(0, 8)} after metadata failure: ${deleteErr}`,\n );\n }\n if (provenanceService) {\n try {\n provenanceService.deleteEdgesByFactId(entry.id);\n } catch (provErr) {\n logger.warn(\n `memory-hybrid: reflect-meta — failed to clean up provenance for meta-pattern fact ${entry.id.slice(0, 8)}: ${provErr}`,\n );\n }\n }\n logger.warn(\n `memory-hybrid: reflect-meta — deleted meta-pattern fact ${entry.id.slice(0, 8)} after metadata failure to prevent partial store`,\n );\n }\n vectorStored = false;\n continue;\n }\n }\n if (vectorStored) {\n if (provenanceService && reflectionRunId) {\n try {\n provenanceService.addEdge(entry.id, {\n edgeType: \"DERIVED_FROM\",\n sourceType: \"reflection\",\n sourceId: reflectionRunId,\n });\n } catch (err) {\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"reflection-meta-provenance-derived\",\n subsystem: \"provenance\",\n factId: entry.id,\n });\n }\n }\n // If this was a merge (embeddingStale=true), replace the existing vector for this fact ID\n // instead of pushing a duplicate vector for the same fact.\n if (storeResult.embeddingStale) {\n const existingIndex = existingMetaFacts.findIndex((f) => f.id === entry.id);\n if (existingIndex >= 0 && existingIndex < existingVectors.length) {\n existingVectors[existingIndex] = normalizeVector(vectorToStore);\n } else {\n // Fact was inserted earlier in this loop, not in pre-run snapshot\n existingVectors.push(normalizeVector(vectorToStore));\n }\n inRunFactVectors.set(entry.id, { vector: vectorToStore, embeddingModel: embeddings.modelName });\n } else {\n existingVectors.push(normalizeVector(vectorToStore));\n inRunFactVectors.set(entry.id, { vector: vectorToStore, embeddingModel: embeddings.modelName });\n }\n stored++;\n }\n }\n\n logger.info(\n `memory-hybrid: reflect-meta — finished: ${stored} meta-pattern(s) stored, ${metaDuplicatesSkipped} skipped as near-duplicate(s), ${newMetaEmbedFailures} embed failure(s), ${uniqueMetas.length} candidate(s) total`,\n );\n if (storeDedupeVectorFallbackSuppressed > 0) {\n logger.info(\n `memory-hybrid: reflect-meta — store dedupe used lexical-only for ${storeDedupeVectorFallbackSuppressed} store(s) (phase-level cosine dedupe already handled near-duplicates)`,\n );\n }\n\n return { metaExtracted: metas.length, metaStored: stored };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"reflection.js","names":[],"sources":["../../services/reflection.ts"],"sourcesContent":["/**\n * Reflection service: pattern synthesis from memory facts.\n *\n * Three layers:\n * 1. Patterns (runReflection): Extract high-level patterns from recent facts\n * 2. Rules (runReflectionRules): Synthesize patterns into actionable one-liners\n * 3. Meta-patterns (runReflectionMeta): Synthesize patterns into 1-3 meta-patterns\n */\n\nimport { createHash, randomUUID } from \"node:crypto\";\nimport type OpenAI from \"openai\";\nimport type { FactsDB } from \"../backends/facts-db.js\";\nimport type { VectorDB } from \"../backends/vector-db.js\";\nimport type { MemoryCategory, MemoryEntry } from \"../types/memory.js\";\nimport {\n REFLECTION_DEDUPE_429_CIRCUIT_BREAKER_BACKOFF_MS,\n REFLECTION_DEDUPE_429_CIRCUIT_BREAKER_THRESHOLD,\n REFLECTION_DEDUPE_LOAD_TIMEOUT_MS,\n REFLECTION_DEDUPE_MAX_ROWS_PER_RUN,\n REFLECTION_DEDUPE_THRESHOLD,\n REFLECTION_IMPORTANCE,\n REFLECTION_MAX_FACT_LENGTH,\n REFLECTION_MAX_FACTS_PER_CATEGORY,\n REFLECTION_META_MAX_CHARS,\n REFLECTION_PATTERN_MAX_CHARS,\n REFLECTION_TEMPERATURE,\n} from \"../utils/constants.js\";\nimport { getEnv } from \"../utils/env-manager.js\";\nimport { persistCanonicalFactEmbedding } from \"../utils/fact-embeddings.js\";\nimport { fillPrompt, loadPrompt } from \"../utils/prompt-loader.js\";\nimport { withTimeout } from \"../utils/timeout.js\";\nimport { chatCompleteWithAdaptiveMaintenanceRetry } from \"./adaptive-maintenance-llm.js\";\nimport { is403QuotaOrRateLimitLike, is429OrWrapped, LLMRetryError } from \"./chat.js\";\nimport { CostFeature } from \"./cost-feature-labels.js\";\nimport type { EmbeddingProvider } from \"./embeddings.js\";\nimport { shouldSuppressEmbeddingError } from \"./embeddings.js\";\nimport { capturePluginError } from \"./error-reporter.js\";\nimport { recordMaintenanceTimestamp } from \"./maintenance-timestamp.js\";\nimport type { ProvenanceService } from \"./provenance.js\";\nimport {\n dotProductSimilarity,\n normalizeVector,\n parsePatternsFromReflectionResponse,\n REFLECTION_MAX_PATTERNS_FOR_META,\n REFLECTION_MAX_PATTERNS_FOR_RULES,\n REFLECTION_META_MIN_CHARS,\n REFLECTION_PATTERN_MIN_CHARS,\n REFLECTION_RULE_MAX_CHARS,\n REFLECTION_RULE_MIN_CHARS,\n} from \"./reflection/shared.js\";\n\nexport { dotProductSimilarity, normalizeVector, parsePatternsFromReflectionResponse } from \"./reflection/shared.js\";\n\nimport { stripThinkingWrapperBlocks } from \"../utils/llm-json-array.js\";\nimport { cleanupEvictedVector } from \"./vector-maintenance.js\";\n\n/** Non-superseded, non-expired pattern facts (same filter as reflection dedupe corpus). */\nexport function countActivePatternFactsForMaintenance(factsDb: FactsDB): number {\n return factsDb.countActiveFactsByCategory(\"pattern\");\n}\n\nexport interface ReflectionConfig {\n defaultWindow: number;\n minObservations: number;\n enabled?: boolean;\n}\n\ninterface ReflectionOptions {\n window: number;\n dryRun: boolean;\n model: string;\n verbose?: boolean;\n fallbackModels?: string[];\n modelSource?: string;\n adaptiveStatePath?: string;\n}\n\ninterface ReflectionResult {\n factsAnalyzed: number;\n patternsExtracted: number;\n patternsStored: number;\n window: number;\n}\n\ninterface ReflectionRulesResult {\n rulesExtracted: number;\n rulesStored: number;\n diagnostics: ReflectionRulesDiagnostics;\n}\n\nexport interface ReflectionRulesDiagnostics {\n modelResponseChars: number;\n parseSuccess: boolean;\n parsedCandidates: number;\n rejectedDuplicates: number;\n rejectedLowConfidence: number;\n stored: number;\n zeroRulesReason?: string;\n status: \"ok\" | \"partial\" | \"degraded\";\n}\n\n// Accepted model phrases when \"0 rules\" is a valid no-op rather than parse failure.\n// Anchored to start-of-string but allows leading whitespace so phrases like\n// \"No actionable rules detected from ...\" are correctly classified.\n// Only accepts single-line no-op responses; multiline outputs must be parsed for RULE lines.\nconst VALID_NO_RULES_PATTERN =\n /^\\s*(no\\s+(actionable\\s+)?rules?|no rules (detected|identified)|unable to extract rules|insufficient information for rules)[^\\n\\r]*$/i;\nconst LOW_CONFIDENCE_PREFIX_PATTERN =\n /^\\s*(?:\\[(?:low[-\\s]?confidence)\\]|\\((?:low[-\\s]?confidence)\\)|low[-\\s]?confidence\\s*[:\\-])\\s*/i;\nconst EXPLICIT_CONFIDENCE_PREFIX_PATTERN =\n /^\\s*(?:\\[|\\()?\\s*confidence\\s*[:=]\\s*(?<value>0(?:\\.\\d+)?|1(?:\\.0+)?)\\s*(?:\\]|\\))?\\s*/i;\nconst REFLECTION_RULE_MIN_CONFIDENCE = 0.5;\n\nconst THINKING_WRAPPER_TAGS_PATTERN = /<\\/?(?:redacted_thinking|thinking|reasoning|think)>/gi;\n\nfunction stripThinkingWrapperTagsKeepContent(s: string): string {\n return s.replace(THINKING_WRAPPER_TAGS_PATTERN, \"\").trim();\n}\n\nfunction extractThinkingWrapperContents(s: string): string[] {\n const matches = s.matchAll(\n /<(?:redacted_thinking|thinking|reasoning|think)>([\\s\\S]*?)<\\/(?:redacted_thinking|thinking|reasoning|think)>/gi,\n );\n const contents: string[] = [];\n for (const match of matches) {\n const content = match[1]?.trim();\n if (content) contents.push(content);\n }\n return contents;\n}\n\nfunction derivePreMergeText(mergedText: string, appendedText: string): string | null {\n const appendSuffix = `\\n${appendedText}`;\n const maxSuffixLen = Math.min(appendSuffix.length, mergedText.length);\n for (let suffixLen = maxSuffixLen; suffixLen >= 1; suffixLen--) {\n if (mergedText.endsWith(appendSuffix.slice(0, suffixLen))) {\n return mergedText.slice(0, mergedText.length - suffixLen);\n }\n }\n return null;\n}\n\nfunction rollbackMergedFactText(\n factsDb: FactsDB,\n logger: { warn: (msg: string) => void },\n opts: {\n context: string;\n factId: string;\n mergedText: string;\n appendedText: string;\n preMergeText?: string | null;\n reason: \"merge-reembed-failure\" | \"vector-store-failure\" | \"metadata-update-failure\";\n },\n): boolean {\n const previousText = opts.preMergeText ?? derivePreMergeText(opts.mergedText, opts.appendedText);\n if (previousText == null) {\n logger.warn(\n `memory-hybrid: ${opts.context} — failed to derive pre-merge text for fact ${opts.factId.slice(0, 8)} after ${opts.reason}; leaving merged text in place`,\n );\n return false;\n }\n const restoreMergedFactText = (factsDb as FactsDB & { restoreMergedFactText?: (id: string, text: string) => boolean })\n .restoreMergedFactText;\n if (typeof restoreMergedFactText !== \"function\") {\n logger.warn(\n `memory-hybrid: ${opts.context} — factsDb.restoreMergedFactText unavailable for fact ${opts.factId.slice(0, 8)} after ${opts.reason}; leaving merged text in place`,\n );\n return false;\n }\n try {\n const restored = restoreMergedFactText.call(factsDb, opts.factId, previousText);\n if (!restored) {\n logger.warn(\n `memory-hybrid: ${opts.context} — rollback update did not affect fact ${opts.factId.slice(0, 8)} after ${opts.reason}; leaving merged text in place`,\n );\n return false;\n }\n logger.warn(\n `memory-hybrid: ${opts.context} — rolled back merged text for fact ${opts.factId.slice(0, 8)} after ${opts.reason} to preserve text/vector consistency`,\n );\n return true;\n } catch (err) {\n logger.warn(\n `memory-hybrid: ${opts.context} — failed to roll back merged text for fact ${opts.factId.slice(0, 8)} after ${opts.reason}: ${err}`,\n );\n return false;\n }\n}\n\nfunction resolvePreMergeText(mergedText: string, appendedText: string, preMergeText?: string | null): string | null {\n return preMergeText ?? derivePreMergeText(mergedText, appendedText);\n}\n\nasync function restoreMergedFactVectorState(opts: {\n context: string;\n factId: string;\n category: \"pattern\" | \"rule\";\n preMergeText: string | null;\n preMergeVector: number[] | null;\n preMergeEmbeddingModel: string | null;\n fallbackEmbeddingModel: string;\n vectorDb: VectorDB;\n factsDb: FactsDB;\n logger: { warn: (msg: string) => void };\n}): Promise<void> {\n if (!opts.preMergeText) {\n opts.logger.warn(\n `memory-hybrid: ${opts.context} — pre-merge text unavailable for ${opts.factId.slice(0, 8)}; cannot restore vector state`,\n );\n return;\n }\n if (!opts.preMergeVector || opts.preMergeVector.length === 0) {\n opts.logger.warn(\n `memory-hybrid: ${opts.context} — pre-merge vector unavailable for ${opts.factId.slice(0, 8)}; leaving post-rollback vector state empty`,\n );\n return;\n }\n try {\n await opts.vectorDb.store({\n text: opts.preMergeText,\n vector: opts.preMergeVector,\n importance: REFLECTION_IMPORTANCE,\n category: opts.category,\n id: opts.factId,\n });\n } catch (err) {\n opts.logger.warn(\n `memory-hybrid: ${opts.context} — failed to restore pre-merge vector for ${opts.factId.slice(0, 8)} after rollback: ${err}`,\n );\n try {\n await opts.vectorDb.delete(opts.factId);\n opts.logger.warn(\n `memory-hybrid: ${opts.context} — deleted merged vector for ${opts.factId.slice(0, 8)} to prevent Lance drift after restore failure`,\n );\n } catch (delErr) {\n opts.logger.warn(\n `memory-hybrid: ${opts.context} — failed to delete merged vector for ${opts.factId.slice(0, 8)} after restore failure: ${delErr}`,\n );\n }\n return;\n }\n const embeddingModel =\n opts.preMergeEmbeddingModel && opts.preMergeEmbeddingModel.trim().length > 0\n ? opts.preMergeEmbeddingModel\n : opts.fallbackEmbeddingModel;\n try {\n persistCanonicalFactEmbedding(\n opts.factsDb,\n opts.factId,\n embeddingModel,\n opts.preMergeVector,\n \"reflection-fact-embeddings\",\n opts.context,\n opts.logger.warn.bind(opts.logger),\n );\n opts.factsDb.setEmbeddingModel(opts.factId, embeddingModel);\n } catch (err) {\n opts.logger.warn(\n `memory-hybrid: ${opts.context} — failed to restore canonical embeddings for ${opts.factId.slice(0, 8)} after rollback: ${err}`,\n );\n }\n}\n\nfunction reusedExistingStoreEntry(\n storeResult: {\n entry: MemoryEntry;\n embeddingStale?: boolean;\n newlyStored?: boolean;\n },\n candidateText: string,\n): boolean {\n if (storeResult.newlyStored === false) return true;\n return storeResult.embeddingStale !== true && storeResult.entry.text !== candidateText;\n}\n\ninterface ReflectionMetaResult {\n metaExtracted: number;\n metaStored: number;\n}\n\n/**\n * Build normalized dedupe-corpus vectors for existing facts: prefer LanceDB rows (same id as fact),\n * else call the embedding API. Batches API calls (20) with adaptive throttle based on rate limits.\n * Wrapped with timeout to prevent indefinite hangs during VectorDB operations.\n *\n * Implements circuit breaker: after N consecutive 429s, pauses and returns partial results.\n * Supports resumable processing via checkpoint cursor (future enhancement).\n */\nexport async function loadReflectionDedupeCorpusVectors(\n facts: MemoryEntry[],\n embeddings: EmbeddingProvider,\n vectorDb: VectorDB,\n logger: { info: (msg: string) => void; warn?: (msg: string) => void },\n logPrefix: string,\n captureOperation: string,\n markEmbeddingModel?: (factId: string, model: string) => void,\n dryRun = false,\n): Promise<(number[] | null)[]> {\n const loadWithTimeout = async (): Promise<(number[] | null)[]> => {\n const startMs = Date.now();\n const logWarn = (msg: string) => (logger.warn ?? logger.info)(msg);\n const vdb = vectorDb as VectorDB & {\n getVectorDim?: () => number;\n getVectorsByFactIds?: (ids: string[]) => Promise<Map<string, number[]>>;\n store?: (entry: {\n text: string;\n vector: number[];\n importance: number;\n category: string;\n id?: string;\n }) => Promise<string>;\n isLanceDbAvailable?: () => boolean;\n isLanceAvailable?: () => boolean;\n };\n const dim = typeof vdb.getVectorDim === \"function\" ? vdb.getVectorDim() : 0;\n const canPersistToLance =\n typeof vdb.isLanceDbAvailable === \"function\"\n ? vdb.isLanceDbAvailable()\n : typeof vdb.isLanceAvailable === \"function\"\n ? vdb.isLanceAvailable()\n : true;\n let byId = new Map<string, number[]>();\n\n const maxRowsThisRun = REFLECTION_DEDUPE_MAX_ROWS_PER_RUN;\n const effectiveFacts = facts.length > maxRowsThisRun ? facts.slice(0, maxRowsThisRun) : facts;\n\n if (facts.length > maxRowsThisRun) {\n logWarn(\n `${logPrefix} — dedupe corpus: limiting to ${maxRowsThisRun} rows (total ${facts.length}) to prevent unbounded backlog work. Remaining ${facts.length - maxRowsThisRun} rows will be processed in future runs.`,\n );\n }\n\n logger.info(\n `${logPrefix} — dedupe corpus: loading vectors from Lance index for ${effectiveFacts.length} fact(s)${facts.length > effectiveFacts.length ? ` (capped from ${facts.length})` : \"\"}...`,\n );\n\n if (typeof vdb.getVectorsByFactIds === \"function\") {\n try {\n byId = await vdb.getVectorsByFactIds(effectiveFacts.map((f) => f.id));\n const elapsedS = ((Date.now() - startMs) / 1000).toFixed(1);\n logger.info(\n `${logPrefix} — dedupe corpus: loaded ${byId.size} vector(s) from Lance index (elapsed: ${elapsedS}s)`,\n );\n } catch (err) {\n logger.info(`${logPrefix} — dedupe corpus: Lance index load failed, will use embedding API for all: ${err}`);\n byId = new Map();\n }\n }\n\n const result: (number[] | null)[] = new Array(facts.length);\n let lanceHits = 0;\n let lanceModelOkHits = 0;\n let lanceModelMissingHits = 0;\n let lanceModelMismatchSkips = 0;\n let apiEmbeds = 0;\n let apiPersisted = 0;\n let apiPersistFailures = 0;\n let embedFailures = 0;\n let nonNullSoFar = 0;\n let embedAttemptsThisRun = 0;\n let consecutive429s = 0;\n let total429s = 0;\n let throttleDelayMs = 200;\n const startedAt = Date.now();\n let lastProgressAt = startedAt;\n\n logger.info(\n `${logPrefix} — dedupe corpus: processing ${effectiveFacts.length} facts in batches of 20 (${dryRun ? \"dry-run: no Lance checkpoint / metadata writes\" : \"checkpointing API-hydrated vectors\"})`,\n );\n\n const totalBatches = Math.ceil(effectiveFacts.length / 20);\n let batchNumber = 0;\n\n for (let i = 0; i < effectiveFacts.length; i += 20) {\n const batchStartedAt = Date.now();\n const end = Math.min(i + 20, effectiveFacts.length);\n batchNumber++;\n let hadApiEmbed = false;\n let had429ThisBatch = false;\n let batchLance = 0;\n let batchApi = 0;\n let batchPersisted = 0;\n let batchPersistFailures = 0;\n let batchEmbedFailures = 0;\n let batchMismatchSkips = 0;\n\n for (let j = i; j < end; j++) {\n const f = effectiveFacts[j]!;\n const cached = byId.get(f.id.toLowerCase()) ?? byId.get(f.id);\n const modelKnown = f.embeddingModel != null && embeddings.modelName != null;\n const modelOk = modelKnown && f.embeddingModel === embeddings.modelName;\n const useCache = dim > 0 && cached != null && cached.length === dim && (!modelKnown || modelOk);\n if (useCache) {\n result[j] = normalizeVector(cached);\n nonNullSoFar++;\n lanceHits++;\n batchLance++;\n if (modelOk) lanceModelOkHits++;\n else if (!f.embeddingModel) {\n lanceModelMissingHits++;\n if (!dryRun && embeddings.modelName && markEmbeddingModel) {\n try {\n markEmbeddingModel(f.id, embeddings.modelName);\n } catch (markErr) {\n logger.info(\n `${logPrefix} — dedupe corpus: failed to mark embedding model for cached fact ${f.id}: ${markErr}`,\n );\n }\n }\n }\n } else {\n if (dim > 0 && cached != null && cached.length === dim && modelKnown && !modelOk) {\n lanceModelMismatchSkips++;\n batchMismatchSkips++;\n }\n try {\n embedAttemptsThisRun++;\n const vec = await embeddings.embed(f.text);\n result[j] = normalizeVector(vec);\n nonNullSoFar++;\n apiEmbeds++;\n batchApi++;\n hadApiEmbed = true;\n consecutive429s = 0;\n\n if (!dryRun && typeof vdb.store === \"function\") {\n let persistSucceeded = !canPersistToLance;\n if (canPersistToLance) {\n try {\n await vdb.store({\n text: f.text,\n vector: vec,\n importance: typeof f.importance === \"number\" ? f.importance : REFLECTION_IMPORTANCE,\n category: f.category,\n id: f.id,\n });\n apiPersisted++;\n batchPersisted++;\n persistSucceeded = true;\n } catch (storeErr) {\n apiPersistFailures++;\n batchPersistFailures++;\n logger.info(\n `${logPrefix} — dedupe corpus: failed to persist hydrated vector for fact ${f.id}: ${storeErr}`,\n );\n }\n }\n if (persistSucceeded && embeddings.modelName && markEmbeddingModel) {\n try {\n markEmbeddingModel(f.id, embeddings.modelName);\n } catch (markErr) {\n logger.info(\n `${logPrefix} — dedupe corpus: failed to mark embedding model for hydrated fact ${f.id}: ${markErr}`,\n );\n }\n }\n }\n } catch (err) {\n const isRateLimit =\n is429OrWrapped(err instanceof Error ? err : new Error(String(err))) || is403QuotaOrRateLimitLike(err);\n\n if (isRateLimit) {\n consecutive429s++;\n total429s++;\n had429ThisBatch = true;\n\n if (consecutive429s >= REFLECTION_DEDUPE_429_CIRCUIT_BREAKER_THRESHOLD) {\n const failedAtRow = j;\n const remainingInSlice = effectiveFacts.length - failedAtRow;\n logWarn(\n `[embedding-quota] ${logPrefix} — circuit breaker triggered: ${consecutive429s} consecutive 429s. ` +\n `Stopped at row ${failedAtRow}/${effectiveFacts.length} in this run, deferring ${remainingInSlice}. ` +\n `Total 429s this run: ${total429s}. Will resume in next dream-cycle.`,\n );\n for (let k = j; k < effectiveFacts.length; k++) {\n result[k] = null;\n }\n for (let k = effectiveFacts.length; k < facts.length; k++) {\n result[k] = null;\n }\n return result;\n }\n\n throttleDelayMs = Math.min(throttleDelayMs * 2, 10_000);\n logWarn(\n `[embedding-quota] ${logPrefix} — 429 rate limit (${consecutive429s} consecutive, ${total429s} total) — ` +\n `increasing throttle to ${throttleDelayMs}ms`,\n );\n } else {\n embedFailures++;\n batchEmbedFailures++;\n }\n\n if (!shouldSuppressEmbeddingError(err)) {\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: captureOperation,\n subsystem: \"embeddings\",\n factId: f.id,\n });\n }\n result[j] = null;\n hadApiEmbed = true;\n }\n }\n }\n\n const elapsedMs = Date.now() - startedAt;\n const batchMs = Date.now() - batchStartedAt;\n const processed = end;\n const remainingSlice = effectiveFacts.length - end;\n const ok = nonNullSoFar;\n const elapsedS = (elapsedMs / 1000).toFixed(1);\n const capDeferred = facts.length - effectiveFacts.length;\n const periodicBatchLog =\n (effectiveFacts.length <= 500 && (batchNumber % 5 === 0 || end === effectiveFacts.length)) ||\n (effectiveFacts.length > 500 &&\n effectiveFacts.length <= 1000 &&\n (batchNumber % 10 === 0 || end % 200 === 0 || end === effectiveFacts.length)) ||\n (effectiveFacts.length > 1000 && (batchNumber % 20 === 0 || end % 400 === 0 || end === effectiveFacts.length));\n\n const shouldLog =\n periodicBatchLog ||\n effectiveFacts.length > 1000 ||\n batchApi > 0 ||\n had429ThisBatch ||\n batchMs >= 5000 ||\n Date.now() - lastProgressAt >= 10_000 ||\n end === effectiveFacts.length;\n\n if (shouldLog) {\n lastProgressAt = Date.now();\n logger.info(\n `${logPrefix} — dedupe corpus progress: batch ${batchNumber}/${Math.max(1, totalBatches)}, ${processed}/${effectiveFacts.length} processed, ${remainingSlice} remaining this run${capDeferred > 0 ? ` (${capDeferred} row(s) capped for next run)` : \"\"}; batch=${batchMs}ms (Lance ${batchLance}, API ${batchApi}, persisted ${batchPersisted}, persistFailures ${batchPersistFailures}, embedFailures ${batchEmbedFailures}, mismatchSkips ${batchMismatchSkips}); totals: Lance ${lanceHits} (model-ok ${lanceModelOkHits}, missing ${lanceModelMissingHits}, mismatch-skips ${lanceModelMismatchSkips}), API ${apiEmbeds}, persisted ${apiPersisted}, persistFailures ${apiPersistFailures}, embedFailures ${embedFailures}, 429s=${total429s}, throttle=${throttleDelayMs}ms, non-null ${ok}; elapsed=${elapsedMs}ms (${elapsedS}s)`,\n );\n }\n\n if (hadApiEmbed && end < effectiveFacts.length) {\n const batchDelay = had429ThisBatch\n ? Math.max(throttleDelayMs, REFLECTION_DEDUPE_429_CIRCUIT_BREAKER_BACKOFF_MS / 3)\n : throttleDelayMs;\n await new Promise((r) => setTimeout(r, batchDelay));\n }\n }\n\n for (let idx = effectiveFacts.length; idx < facts.length; idx++) {\n result[idx] = null;\n }\n\n if (effectiveFacts.length > 0) {\n const ok = result.filter((v) => v !== null).length;\n const elapsedS = ((Date.now() - startMs) / 1000).toFixed(1);\n const deferredCap = facts.length - effectiveFacts.length;\n logger.info(\n `${logPrefix} — dedupe corpus: completed ${Math.max(1, totalBatches)} batch(es), ${lanceHits} vector(s) reused from Lance index (model-ok ${lanceModelOkHits}, missing ${lanceModelMissingHits}, mismatch-skips ${lanceModelMismatchSkips}), ${apiEmbeds} row(s) hydrated via embedding API (${embedAttemptsThisRun} attempt(s)), ${apiPersisted} persisted to Lance (${apiPersistFailures} persist failure(s)), ${embedFailures} embed failure(s), ${total429s} embedding rate-limit event(s), throttle=${throttleDelayMs}ms, ${ok}/${facts.length} non-null for cosine check (elapsed: ${elapsedS}s)${deferredCap > 0 ? `; ${deferredCap} row(s) deferred to next run (per-run cap)` : \"\"}`,\n );\n }\n return result;\n };\n\n // Wrap the entire operation with a timeout\n const result = await withTimeout(REFLECTION_DEDUPE_LOAD_TIMEOUT_MS, loadWithTimeout);\n\n if (result === null) {\n (logger.warn ?? logger.info)(\n `${logPrefix} — dedupe corpus: timed out after ${REFLECTION_DEDUPE_LOAD_TIMEOUT_MS}ms while loading ${facts.length} vectors; falling back to empty corpus (dedupe disabled for this run)`,\n );\n return new Array(facts.length).fill(null);\n }\n\n return result;\n}\n\n/**\n * Run reflection — gather recent facts, call LLM to extract patterns, dedupe, store.\n */\nexport async function runReflection(\n factsDb: FactsDB,\n vectorDb: VectorDB,\n embeddings: EmbeddingProvider,\n openai: OpenAI,\n config: ReflectionConfig,\n opts: ReflectionOptions,\n logger: { info: (msg: string) => void; warn: (msg: string) => void },\n provenanceService?: ProvenanceService | null,\n): Promise<ReflectionResult> {\n // Feature-gating: exit 0 if reflection is disabled\n if (config.enabled === false) {\n return { factsAnalyzed: 0, patternsExtracted: 0, patternsStored: 0, window: opts.window };\n }\n const windowDays = Math.min(90, Math.max(1, opts.window));\n const touchReflectLastRun = () => {\n if (!opts.dryRun) recordMaintenanceTimestamp(factsDb.sqlitePath, \".reflect_last_run\");\n };\n const recentFacts = factsDb.getRecentFacts(windowDays);\n\n if (recentFacts.length < config.minObservations) {\n logger.info(`memory-hybrid: reflection — ${recentFacts.length} facts in window (min ${config.minObservations})`);\n touchReflectLastRun();\n return { factsAnalyzed: recentFacts.length, patternsExtracted: 0, patternsStored: 0, window: windowDays };\n }\n\n // Group by category, cap length and count\n const byCategory = new Map<string, MemoryEntry[]>();\n for (const f of recentFacts) {\n const cat = f.category;\n if (!byCategory.has(cat)) byCategory.set(cat, []);\n const arr = byCategory.get(cat)!;\n if (arr.length >= REFLECTION_MAX_FACTS_PER_CATEGORY) continue;\n arr.push(f);\n }\n\n const factLines: string[] = [];\n for (const [cat, entries] of byCategory) {\n for (const e of entries) {\n const text = e.text.slice(0, REFLECTION_MAX_FACT_LENGTH).trim();\n if (text.length < 10) continue;\n factLines.push(`[${cat}] ${text}`);\n }\n }\n if (factLines.length === 0) {\n logger.info(\n `memory-hybrid: reflection — ${recentFacts.length} recent facts but all too short after trimming; skipping LLM`,\n );\n touchReflectLastRun();\n return { factsAnalyzed: recentFacts.length, patternsExtracted: 0, patternsStored: 0, window: windowDays };\n }\n\n const factsBlock = factLines.join(\"\\n\");\n const nowSec = Math.floor(Date.now() / 1000);\n const existingPatternFacts = factsDb\n .getByCategory(\"pattern\")\n .filter((f) => !f.supersededAt && (f.expiresAt === null || f.expiresAt > nowSec));\n const existingPatternsFingerprint = existingPatternFacts\n .map((f) => f.id)\n .sort()\n .join(\",\");\n const inputHash = createHash(\"sha256\")\n .update(`${windowDays}:${opts.model}:${factsBlock}:${existingPatternsFingerprint}`)\n .digest(\"hex\")\n .slice(0, 16);\n const prevHash = factsDb.getMaintenanceState(\"reflection_input_hash\");\n if (prevHash === inputHash) {\n logger.info(\"memory-hybrid: reflection — input facts unchanged since last run, skipping LLM call\");\n touchReflectLastRun();\n return { factsAnalyzed: recentFacts.length, patternsExtracted: 0, patternsStored: 0, window: windowDays };\n }\n\n const prompt = fillPrompt(loadPrompt(\"reflection\"), { window: String(windowDays), facts: factsBlock });\n\n if (opts.verbose) {\n logger.info(\n `memory-hybrid: reflection — LLM call (${prompt.length} chars, ${recentFacts.length} facts in window, model=${opts.model})`,\n );\n }\n\n let rawResponse: string;\n try {\n const adaptiveEnabled = (getEnv(\"OPENCLAW_HYBRID_MEM_ADAPTIVE_DISTILL\") ?? \"\").trim() !== \"0\";\n const detail = await chatCompleteWithAdaptiveMaintenanceRetry({\n model: opts.model,\n modelSource: opts.modelSource,\n content: prompt,\n temperature: REFLECTION_TEMPERATURE,\n maxTokens: 1500,\n openai,\n fallbackModels: opts.fallbackModels ?? [],\n label: \"memory-hybrid: reflection\",\n feature: CostFeature.reflection,\n logger,\n adaptiveStatePath: opts.adaptiveStatePath,\n enabled: adaptiveEnabled,\n });\n if (detail.modelUsed !== opts.model) {\n logger.info(`memory-hybrid: reflection — used fallback model ${detail.modelUsed}`);\n }\n rawResponse = detail.content;\n } catch (err) {\n logger.warn(`memory-hybrid: reflection LLM failed: ${err}`);\n const retryAttempt = err instanceof LLMRetryError ? err.attemptNumber : 1;\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"reflection-llm\",\n subsystem: \"openai\",\n windowDays,\n retryAttempt,\n });\n touchReflectLastRun();\n return { factsAnalyzed: recentFacts.length, patternsExtracted: 0, patternsStored: 0, window: windowDays };\n }\n\n const uniqueNewPatterns = parsePatternsFromReflectionResponse(rawResponse);\n\n if (uniqueNewPatterns.length === 0) {\n logger.info(\"memory-hybrid: reflection — 0 patterns extracted from LLM\");\n if (!opts.dryRun) {\n factsDb.setMaintenanceState(\"reflection_input_hash\", inputHash);\n }\n touchReflectLastRun();\n return { factsAnalyzed: recentFacts.length, patternsExtracted: 0, patternsStored: 0, window: windowDays };\n }\n\n logger.info(\n `memory-hybrid: reflection — LLM completed successfully: ${uniqueNewPatterns.length} candidate pattern(s) after parse (next: load prior pattern vectors for dedupe — Lance index + embedding API as needed — then each new pattern)`,\n );\n\n if (opts.verbose) {\n logger.info(`memory-hybrid: reflection — extracted ${uniqueNewPatterns.length} patterns:`);\n for (const pattern of uniqueNewPatterns) {\n logger.info(` PATTERN: ${pattern}`);\n }\n }\n\n let existingVectors: (number[] | null)[] = [];\n if (existingPatternFacts.length > 0) {\n logger.info(\n `memory-hybrid: reflection — loading ${existingPatternFacts.length} existing pattern row(s) for dedupe (Lance vectors + embedding API when index or model is missing)`,\n );\n existingVectors = await loadReflectionDedupeCorpusVectors(\n existingPatternFacts,\n embeddings,\n vectorDb,\n logger,\n \"memory-hybrid: reflection\",\n \"reflection-embed-existing\",\n (factId, model) => factsDb.setEmbeddingModel(factId, model),\n opts.dryRun,\n );\n } else {\n logger.info(\"memory-hybrid: reflection — no existing pattern facts for dedupe; embedding new candidates only\");\n }\n\n logger.info(\n `memory-hybrid: reflection — embedding ${uniqueNewPatterns.length} new candidate pattern(s) for duplicate check + storage`,\n );\n\n let stored = 0;\n let duplicatesSkipped = 0;\n let newPatternEmbedFailures = 0;\n let storeDedupeVectorFallbackSuppressed = 0;\n const reflectionRunId = provenanceService ? randomUUID() : null;\n const candidateStartMs = Date.now();\n let candidateIndex = 0;\n const inRunFactVectors = new Map<string, { vector: number[]; embeddingModel: string }>();\n\n for (const patternText of uniqueNewPatterns) {\n candidateIndex++;\n let vec: number[];\n try {\n vec = await embeddings.embed(patternText);\n } catch (err) {\n newPatternEmbedFailures++;\n // AllEmbeddingProvidersFailed is expected when all providers are unavailable — don't report (#486)\n if (!shouldSuppressEmbeddingError(err)) {\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"embed-pattern\",\n severity: \"info\",\n subsystem: \"reflection\",\n });\n }\n continue; // Skip this pattern on embed failure\n }\n const normVec = normalizeVector(vec);\n let isDuplicate = false;\n for (const ev of existingVectors) {\n if (ev === null || ev.length === 0) continue;\n if (dotProductSimilarity(normVec, ev) >= REFLECTION_DEDUPE_THRESHOLD) {\n isDuplicate = true;\n break;\n }\n }\n if (isDuplicate) {\n duplicatesSkipped++;\n if (opts.verbose) {\n logger.info(`memory-hybrid: reflection — skipped duplicate: ${patternText.slice(0, 60)}...`);\n }\n continue;\n }\n\n if (opts.dryRun) {\n logger.info(`memory-hybrid: reflection [dry-run] would store: ${patternText.slice(0, 60)}...`);\n stored++;\n continue;\n }\n\n storeDedupeVectorFallbackSuppressed++;\n const storeResult = factsDb.storeWithResult(\n {\n text: patternText,\n category: \"pattern\" as MemoryCategory,\n importance: REFLECTION_IMPORTANCE,\n entity: null,\n key: null,\n value: null,\n source: \"reflection\",\n decayClass: \"permanent\",\n tags: [\"reflection\", \"pattern\"],\n extractionMethod: \"reflection\",\n extractionConfidence: REFLECTION_IMPORTANCE,\n },\n {\n warnContext: \"reflection\",\n suppressVectorFallbackWarning: true,\n },\n );\n if (storeResult.skipped) {\n continue;\n }\n const entry = storeResult.entry;\n const mergeExistingIndex = storeResult.embeddingStale\n ? existingPatternFacts.findIndex((f) => f.id === entry.id)\n : -1;\n const inRunMerge = storeResult.embeddingStale && mergeExistingIndex < 0 ? inRunFactVectors.get(entry.id) : null;\n const preMergeVector =\n mergeExistingIndex >= 0 && mergeExistingIndex < existingVectors.length\n ? existingVectors[mergeExistingIndex]\n : (inRunMerge?.vector ?? null);\n const preMergeEmbeddingModel =\n mergeExistingIndex >= 0\n ? (existingPatternFacts[mergeExistingIndex]?.embeddingModel ?? null)\n : (inRunMerge?.embeddingModel ?? null);\n // Skip reused existing facts unless this was a merge update that requires re-embed.\n if (reusedExistingStoreEntry(storeResult, patternText) && !storeResult.embeddingStale) {\n duplicatesSkipped++;\n // Keep this candidate in the in-run dedupe corpus so later patterns don't miss near-duplicates.\n existingVectors.push(normVec);\n if (opts.verbose) {\n logger.info(`memory-hybrid: reflection — skipped store-level duplicate: ${patternText.slice(0, 60)}...`);\n }\n continue;\n }\n // CRITICAL FIX (#2): Delete vector for evicted fact to prevent orphaned vectors\n await cleanupEvictedVector({\n vectorDb: vectorDb,\n evictedFactId: storeResult.evictedFactId,\n logger: logger,\n context: \"reflection\",\n });\n if (opts.verbose) {\n logger.info(\n `memory-hybrid: reflection — stored pattern (importance ${REFLECTION_IMPORTANCE}): ${patternText.slice(0, 80)}${patternText.length > 80 ? \"...\" : \"\"}`,\n );\n }\n // If embeddingStale=true (merge path), re-embed the updated merged text\n const textToEmbed = storeResult.embeddingStale ? entry.text : patternText;\n let vectorToStore: number[];\n try {\n vectorToStore = storeResult.embeddingStale ? await embeddings.embed(textToEmbed) : vec;\n } catch (err) {\n newPatternEmbedFailures++;\n if (!shouldSuppressEmbeddingError(err)) {\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"embed-pattern-merge\",\n severity: \"info\",\n subsystem: \"reflection\",\n });\n }\n if (storeResult.embeddingStale) {\n rollbackMergedFactText(factsDb, logger, {\n context: \"reflection\",\n factId: entry.id,\n mergedText: entry.text,\n appendedText: patternText,\n preMergeText: storeResult.preMergeText,\n reason: \"merge-reembed-failure\",\n });\n }\n continue;\n }\n let vectorStored = false;\n try {\n await vectorDb.store({\n text: textToEmbed,\n vector: vectorToStore,\n importance: REFLECTION_IMPORTANCE,\n category: \"pattern\",\n id: entry.id,\n });\n vectorStored = true;\n } catch (err) {\n logger.warn(`memory-hybrid: reflection vector store failed: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"reflection-vector-store\",\n subsystem: \"vector\",\n factId: entry.id,\n });\n if (storeResult.embeddingStale) {\n const preMergeText = resolvePreMergeText(entry.text, patternText, storeResult.preMergeText);\n const rolledBack = rollbackMergedFactText(factsDb, logger, {\n context: \"reflection\",\n factId: entry.id,\n mergedText: entry.text,\n appendedText: patternText,\n preMergeText: storeResult.preMergeText,\n reason: \"vector-store-failure\",\n });\n if (rolledBack) {\n await restoreMergedFactVectorState({\n context: \"reflection\",\n factId: entry.id,\n category: \"pattern\",\n preMergeText,\n preMergeVector,\n preMergeEmbeddingModel,\n fallbackEmbeddingModel: embeddings.modelName,\n vectorDb,\n factsDb,\n logger,\n });\n }\n continue;\n }\n if (storeResult.newlyStored === false) {\n logger.warn(\n `memory-hybrid: reflection — preserving existing pattern fact ${entry.id.slice(0, 8)} after vector store failure on reused entry`,\n );\n continue;\n }\n if (!storeResult.embeddingStale) {\n try {\n factsDb.delete(entry.id);\n if (provenanceService) {\n try {\n provenanceService.deleteEdgesByFactId(entry.id);\n } catch (provErr) {\n logger.warn(\n `memory-hybrid: reflection — failed to clean up provenance for pattern fact ${entry.id.slice(0, 8)}: ${provErr}`,\n );\n }\n }\n try {\n await vectorDb.delete(entry.id);\n } catch (vecErr) {\n logger.warn(\n `memory-hybrid: reflection — failed to clean up vector for pattern fact ${entry.id.slice(0, 8)}: ${vecErr}`,\n );\n }\n logger.warn(\n `memory-hybrid: reflection — deleted pattern fact ${entry.id.slice(0, 8)} after vector store failure to prevent SQLite/LanceDB split`,\n );\n } catch (deleteErr) {\n logger.warn(\n `memory-hybrid: reflection — failed to delete pattern fact ${entry.id.slice(0, 8)} after vector store failure: ${deleteErr}`,\n );\n }\n continue;\n }\n }\n if (vectorStored) {\n try {\n persistCanonicalFactEmbedding(\n factsDb,\n entry.id,\n embeddings.modelName,\n vectorToStore,\n \"reflection-fact-embeddings\",\n \"reflection\",\n logger.warn?.bind(logger),\n );\n factsDb.setEmbeddingModel(entry.id, embeddings.modelName);\n } catch (err) {\n logger.warn(`memory-hybrid: reflection metadata update failed after vector store: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"reflection-metadata-update\",\n subsystem: \"sqlite\",\n factId: entry.id,\n });\n if (storeResult.embeddingStale) {\n const preMergeText = resolvePreMergeText(entry.text, patternText, storeResult.preMergeText);\n const hasPreMergeVector = Array.isArray(preMergeVector) && preMergeVector.length > 0;\n if (!preMergeText || !hasPreMergeVector) {\n logger.warn(\n `memory-hybrid: reflection — metadata rollback skipped for pattern fact ${entry.id.slice(0, 8)} because pre-merge vector state is unavailable; keeping merged text to avoid SQLite/LanceDB mismatch`,\n );\n continue;\n }\n try {\n (factsDb as FactsDB & { deleteEmbeddings?: (factId: string) => void }).deleteEmbeddings?.(entry.id);\n } catch (embErr) {\n logger.warn(\n `memory-hybrid: reflection — failed to delete canonical embeddings for pattern fact ${entry.id.slice(0, 8)} after metadata failure: ${embErr}`,\n );\n }\n if (preMergeVector && preMergeVector.length > 0) {\n try {\n await vectorDb.delete(entry.id);\n } catch (vecErr) {\n logger.warn(\n `memory-hybrid: reflection — failed to delete merged vector for pattern fact ${entry.id.slice(0, 8)} before rollback: ${vecErr}`,\n );\n }\n }\n const rolledBack = rollbackMergedFactText(factsDb, logger, {\n context: \"reflection\",\n factId: entry.id,\n mergedText: entry.text,\n appendedText: patternText,\n preMergeText: storeResult.preMergeText,\n reason: \"metadata-update-failure\",\n });\n if (rolledBack) {\n if (preMergeVector && preMergeVector.length > 0) {\n await restoreMergedFactVectorState({\n context: \"reflection\",\n factId: entry.id,\n category: \"pattern\",\n preMergeText,\n preMergeVector,\n preMergeEmbeddingModel,\n fallbackEmbeddingModel: embeddings.modelName,\n vectorDb,\n factsDb,\n logger,\n });\n } else {\n try {\n await vectorDb.delete(entry.id);\n logger.warn(\n `memory-hybrid: reflection — deleted merged vector for pattern fact ${entry.id.slice(0, 8)} after metadata failure (no pre-merge vector to restore)`,\n );\n } catch (vecErr) {\n logger.warn(\n `memory-hybrid: reflection — failed to delete merged vector for pattern fact ${entry.id.slice(0, 8)} after metadata failure: ${vecErr}`,\n );\n }\n }\n }\n vectorStored = false;\n continue;\n }\n // For new inserts, clean up the partial state\n if (storeResult.newlyStored !== false) {\n try {\n (factsDb as FactsDB & { deleteEmbeddings?: (factId: string) => void }).deleteEmbeddings?.(entry.id);\n } catch (embErr) {\n logger.warn(\n `memory-hybrid: reflection — failed to delete canonical embeddings for pattern fact ${entry.id.slice(0, 8)} after metadata failure: ${embErr}`,\n );\n }\n try {\n await vectorDb.delete(entry.id);\n } catch (vecErr) {\n logger.warn(\n `memory-hybrid: reflection — failed to delete Lance vector for pattern fact ${entry.id.slice(0, 8)} after metadata failure: ${vecErr}`,\n );\n }\n try {\n factsDb.delete(entry.id);\n } catch (deleteErr) {\n logger.warn(\n `memory-hybrid: reflection — failed to delete pattern fact ${entry.id.slice(0, 8)} after metadata failure: ${deleteErr}`,\n );\n }\n if (provenanceService) {\n try {\n provenanceService.deleteEdgesByFactId(entry.id);\n } catch (provErr) {\n logger.warn(\n `memory-hybrid: reflection — failed to clean up provenance for pattern fact ${entry.id.slice(0, 8)}: ${provErr}`,\n );\n }\n }\n logger.warn(\n `memory-hybrid: reflection — deleted pattern fact ${entry.id.slice(0, 8)} after metadata failure to prevent partial store`,\n );\n }\n vectorStored = false;\n continue;\n }\n }\n if (vectorStored) {\n if (provenanceService && reflectionRunId) {\n try {\n provenanceService.addEdge(entry.id, {\n edgeType: \"DERIVED_FROM\",\n sourceType: \"reflection\",\n sourceId: reflectionRunId,\n });\n } catch (err) {\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"reflection-provenance-derived\",\n subsystem: \"provenance\",\n factId: entry.id,\n });\n }\n }\n // If this was a merge (embeddingStale=true), replace the existing vector for this fact ID\n // instead of pushing a duplicate vector for the same fact.\n if (storeResult.embeddingStale) {\n const existingIndex = existingPatternFacts.findIndex((f) => f.id === entry.id);\n if (existingIndex >= 0 && existingIndex < existingVectors.length) {\n existingVectors[existingIndex] = normalizeVector(vectorToStore);\n } else {\n // Fact was inserted earlier in this loop, not in pre-run snapshot\n existingVectors.push(normalizeVector(vectorToStore));\n }\n inRunFactVectors.set(entry.id, { vector: vectorToStore, embeddingModel: embeddings.modelName });\n } else {\n existingVectors.push(normalizeVector(vectorToStore));\n inRunFactVectors.set(entry.id, { vector: vectorToStore, embeddingModel: embeddings.modelName });\n }\n stored++;\n }\n\n // Progress logging during per-candidate dedupe (every 3 candidates or at the end)\n // This is especially helpful when checking against a large existing corpus\n if (\n opts.verbose &&\n existingPatternFacts.length > 100 &&\n (candidateIndex % 3 === 0 || candidateIndex === uniqueNewPatterns.length)\n ) {\n const elapsedS = ((Date.now() - candidateStartMs) / 1000).toFixed(1);\n logger.info(\n `memory-hybrid: reflection — dedupe progress: ${candidateIndex}/${uniqueNewPatterns.length} candidates processed, ${stored} stored, ${duplicatesSkipped} duplicates, ${newPatternEmbedFailures} embed failures (elapsed: ${elapsedS}s)`,\n );\n }\n }\n\n if (!opts.dryRun) {\n factsDb.setMaintenanceState(\"reflection_input_hash\", inputHash);\n }\n logger.info(\n `memory-hybrid: reflection — finished: ${stored} pattern(s) stored in DB + vector index, ${duplicatesSkipped} skipped as near-duplicate(s), ${newPatternEmbedFailures} new-pattern embed failure(s), ${uniqueNewPatterns.length} candidate(s) total`,\n );\n if (storeDedupeVectorFallbackSuppressed > 0) {\n logger.info(\n `memory-hybrid: reflection — store dedupe used lexical-only for ${storeDedupeVectorFallbackSuppressed} store(s) (phase-level cosine dedupe already handled near-duplicates)`,\n );\n }\n\n touchReflectLastRun();\n return {\n factsAnalyzed: recentFacts.length,\n patternsExtracted: uniqueNewPatterns.length,\n patternsStored: stored,\n window: windowDays,\n };\n}\n\n/**\n * Rules layer — synthesize patterns into actionable one-line rules (category \"rule\").\n */\nexport async function runReflectionRules(\n factsDb: FactsDB,\n vectorDb: VectorDB,\n embeddings: EmbeddingProvider,\n openai: OpenAI,\n opts: {\n dryRun: boolean;\n model: string;\n verbose?: boolean;\n fallbackModels?: string[];\n modelSource?: string;\n adaptiveStatePath?: string;\n },\n logger: { info: (msg: string) => void; warn: (msg: string) => void },\n provenanceService?: ProvenanceService | null,\n): Promise<ReflectionRulesResult> {\n const baseDiagnostics: ReflectionRulesDiagnostics = {\n modelResponseChars: 0,\n parseSuccess: false,\n parsedCandidates: 0,\n rejectedDuplicates: 0,\n rejectedLowConfidence: 0,\n stored: 0,\n status: \"ok\",\n };\n const nowSec = Math.floor(Date.now() / 1000);\n const patternFacts = factsDb\n .getByCategory(\"pattern\")\n .filter((f) => !f.supersededAt && (f.expiresAt === null || f.expiresAt > nowSec));\n const patterns = patternFacts.slice(0, REFLECTION_MAX_PATTERNS_FOR_RULES).map((f) => f.text);\n if (patterns.length < 2) {\n logger.info(`memory-hybrid: reflect-rules — need at least 2 patterns, have ${patterns.length}`);\n const diagnostics: ReflectionRulesDiagnostics = {\n ...baseDiagnostics,\n zeroRulesReason: \"insufficient_patterns\",\n status: \"partial\",\n };\n logger.info(\n \"memory-hybrid: reflect-rules — diagnostics: \" +\n `model_response_chars=${diagnostics.modelResponseChars} ` +\n `parse_success=${diagnostics.parseSuccess} ` +\n `parsed_candidates=${diagnostics.parsedCandidates} ` +\n `rejected_duplicates=${diagnostics.rejectedDuplicates} ` +\n `rejected_low_confidence=${diagnostics.rejectedLowConfidence} ` +\n `stored=${diagnostics.stored} ` +\n `status=${diagnostics.status} zero_rules_reason=${diagnostics.zeroRulesReason}`,\n );\n return { rulesExtracted: 0, rulesStored: 0, diagnostics };\n }\n const patternsBlock = patterns.map((p, i) => `${i + 1}. ${p}`).join(\"\\n\");\n const prompt = fillPrompt(loadPrompt(\"reflection-rules\"), { patterns: patternsBlock });\n if (opts.verbose) {\n logger.info(\n `memory-hybrid: reflect-rules — LLM call (${prompt.length} chars, ${patterns.length} patterns, model=${opts.model})`,\n );\n }\n let rawResponse: string;\n try {\n const adaptiveEnabled = (getEnv(\"OPENCLAW_HYBRID_MEM_ADAPTIVE_DISTILL\") ?? \"\").trim() !== \"0\";\n const detail = await chatCompleteWithAdaptiveMaintenanceRetry({\n model: opts.model,\n modelSource: opts.modelSource,\n content: prompt,\n temperature: REFLECTION_TEMPERATURE,\n maxTokens: 800,\n openai,\n fallbackModels: opts.fallbackModels ?? [],\n label: \"memory-hybrid: reflect-rules\",\n feature: CostFeature.reflectionRules,\n logger,\n adaptiveStatePath: opts.adaptiveStatePath,\n enabled: adaptiveEnabled,\n });\n if (detail.modelUsed !== opts.model) {\n logger.info(`memory-hybrid: reflect-rules — used fallback model ${detail.modelUsed}`);\n }\n rawResponse = detail.content;\n } catch (err) {\n logger.warn(`memory-hybrid: reflect-rules LLM failed: ${err}`);\n const retryAttempt = err instanceof LLMRetryError ? err.attemptNumber : 1;\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"reflection-rules-llm\",\n subsystem: \"openai\",\n retryAttempt,\n });\n const diagnostics: ReflectionRulesDiagnostics = {\n ...baseDiagnostics,\n zeroRulesReason: \"llm_call_failed\",\n status: \"degraded\",\n };\n logger.info(\n \"memory-hybrid: reflect-rules — diagnostics: \" +\n `model_response_chars=${diagnostics.modelResponseChars} ` +\n `parse_success=${diagnostics.parseSuccess} ` +\n `parsed_candidates=${diagnostics.parsedCandidates} ` +\n `rejected_duplicates=${diagnostics.rejectedDuplicates} ` +\n `rejected_low_confidence=${diagnostics.rejectedLowConfidence} ` +\n `stored=${diagnostics.stored} ` +\n `status=${diagnostics.status} zero_rules_reason=${diagnostics.zeroRulesReason}`,\n );\n return { rulesExtracted: 0, rulesStored: 0, diagnostics };\n }\n const trimmedResponse = rawResponse.trim();\n const strippedResponse = stripThinkingWrapperBlocks(trimmedResponse);\n const wrapperContents = extractThinkingWrapperContents(trimmedResponse);\n const responseForParsing = strippedResponse.length > 0 ? strippedResponse : trimmedResponse;\n const rules: string[] = [];\n let rejectedLowConfidence = 0;\n let rejectedLength = 0;\n let parseableLines = 0;\n for (const line of responseForParsing.split(/\\n/)) {\n const m = line.match(/^\\s*RULE:\\s*(.+)/);\n if (!m) continue;\n parseableLines++;\n let text = m[1].trim();\n if (LOW_CONFIDENCE_PREFIX_PATTERN.test(text)) {\n rejectedLowConfidence++;\n continue;\n }\n const confidencePrefix = text.match(EXPLICIT_CONFIDENCE_PREFIX_PATTERN);\n if (confidencePrefix?.groups?.value) {\n const confidence = Number.parseFloat(confidencePrefix.groups.value);\n text = text.slice(confidencePrefix[0].length).trim();\n if (Number.isFinite(confidence) && confidence < REFLECTION_RULE_MIN_CONFIDENCE) {\n rejectedLowConfidence++;\n continue;\n }\n }\n if (text.length >= REFLECTION_RULE_MIN_CHARS && text.length <= REFLECTION_RULE_MAX_CHARS) {\n rules.push(text);\n } else {\n rejectedLength++;\n }\n }\n for (const wrapperContent of wrapperContents) {\n for (const line of wrapperContent.split(/\\n/)) {\n const m = line.match(/^\\s*RULE:\\s*(.+)/);\n if (!m) continue;\n parseableLines++;\n let text = m[1].trim();\n if (LOW_CONFIDENCE_PREFIX_PATTERN.test(text)) {\n rejectedLowConfidence++;\n continue;\n }\n const confidencePrefix = text.match(EXPLICIT_CONFIDENCE_PREFIX_PATTERN);\n if (confidencePrefix?.groups?.value) {\n const confidence = Number.parseFloat(confidencePrefix.groups.value);\n text = text.slice(confidencePrefix[0].length).trim();\n if (Number.isFinite(confidence) && confidence < REFLECTION_RULE_MIN_CONFIDENCE) {\n rejectedLowConfidence++;\n continue;\n }\n }\n if (text.length >= REFLECTION_RULE_MIN_CHARS && text.length <= REFLECTION_RULE_MAX_CHARS) {\n rules.push(text);\n } else {\n rejectedLength++;\n }\n }\n }\n const seenInBatch = new Set<string>();\n const uniqueRules: string[] = [];\n let rejectedDuplicates = 0;\n for (const r of rules) {\n const key = r.toLowerCase().replace(/\\s+/g, \" \");\n if (seenInBatch.has(key)) {\n rejectedDuplicates++;\n continue;\n }\n seenInBatch.add(key);\n uniqueRules.push(r);\n }\n const wrapperTagStrippedResponse = stripThinkingWrapperTagsKeepContent(trimmedResponse);\n const noRulesClassificationResponse = strippedResponse.length > 0 ? strippedResponse : wrapperTagStrippedResponse;\n const containsRuleLineInResponse =\n /(?:^|\\n)\\s*RULE:/i.test(noRulesClassificationResponse) ||\n wrapperContents.some((content) => /(?:^|\\n)\\s*RULE:/i.test(content));\n const looksLikeValidNoRules =\n !containsRuleLineInResponse &&\n (VALID_NO_RULES_PATTERN.test(noRulesClassificationResponse) ||\n wrapperContents.some((content) => VALID_NO_RULES_PATTERN.test(content)));\n const parseSuccess = parseableLines > 0 || looksLikeValidNoRules;\n const modelResponseChars = rawResponse.length;\n if (uniqueRules.length === 0) {\n logger.info(\"memory-hybrid: reflect-rules — 0 rules extracted from LLM\");\n const zeroRulesReason =\n parseableLines > 0 && rejectedDuplicates > 0 && rejectedLowConfidence === 0 && rejectedLength === 0\n ? \"all_candidates_duplicate\"\n : parseableLines > 0 && rejectedLowConfidence > 0 && rejectedDuplicates === 0 && rejectedLength === 0\n ? \"all_candidates_rejected_low_confidence\"\n : parseableLines > 0 && rejectedLength > 0 && rejectedLowConfidence === 0 && rejectedDuplicates === 0\n ? \"all_candidates_rejected_length\"\n : parseableLines > 0\n ? \"all_candidates_rejected\"\n : looksLikeValidNoRules\n ? \"valid_no_actionable_rules\"\n : noRulesClassificationResponse.length === 0\n ? \"empty_model_response\"\n : \"invalid_response_format\";\n const diagnostics: ReflectionRulesDiagnostics = {\n modelResponseChars,\n parseSuccess,\n parsedCandidates: parseableLines,\n rejectedDuplicates,\n rejectedLowConfidence,\n stored: 0,\n zeroRulesReason,\n status:\n zeroRulesReason === \"invalid_response_format\" || zeroRulesReason === \"empty_model_response\"\n ? \"degraded\"\n : zeroRulesReason === \"valid_no_actionable_rules\"\n ? \"ok\"\n : \"partial\",\n };\n logger.info(\n \"memory-hybrid: reflect-rules — diagnostics: \" +\n `model_response_chars=${diagnostics.modelResponseChars} ` +\n `parse_success=${diagnostics.parseSuccess} ` +\n `parsed_candidates=${diagnostics.parsedCandidates} ` +\n `rejected_duplicates=${diagnostics.rejectedDuplicates} ` +\n `rejected_low_confidence=${diagnostics.rejectedLowConfidence} ` +\n `stored=${diagnostics.stored} ` +\n `status=${diagnostics.status} zero_rules_reason=${diagnostics.zeroRulesReason}`,\n );\n return { rulesExtracted: uniqueRules.length, rulesStored: 0, diagnostics };\n }\n\n logger.info(\n `memory-hybrid: reflect-rules — LLM completed successfully: ${uniqueRules.length} candidate rule(s) after parse (next: load prior rule vectors for dedupe, then each new rule)`,\n );\n\n if (opts.verbose) {\n logger.info(`memory-hybrid: reflect-rules — extracted ${uniqueRules.length} rules:`);\n for (const rule of uniqueRules) {\n logger.info(` RULE: ${rule}`);\n }\n }\n const existingRuleFacts = factsDb\n .getByCategory(\"rule\")\n .filter((f) => !f.supersededAt && (f.expiresAt === null || f.expiresAt > nowSec));\n let existingVectors: (number[] | null)[] = [];\n if (existingRuleFacts.length > 0) {\n logger.info(\n `memory-hybrid: reflect-rules — loading ${existingRuleFacts.length} existing rule row(s) for dedupe (Lance vectors + embedding API when index or model is missing)`,\n );\n existingVectors = await loadReflectionDedupeCorpusVectors(\n existingRuleFacts,\n embeddings,\n vectorDb,\n logger,\n \"memory-hybrid: reflect-rules\",\n \"reflection-rules-embed-existing\",\n (factId, model) => factsDb.setEmbeddingModel(factId, model),\n opts.dryRun,\n );\n } else {\n logger.info(\"memory-hybrid: reflect-rules — no existing rule facts for dedupe; embedding new candidates only\");\n }\n\n logger.info(\n `memory-hybrid: reflect-rules — embedding ${uniqueRules.length} new candidate rule(s) for duplicate check + storage`,\n );\n\n let stored = 0;\n let rulesDuplicatesSkipped = 0;\n const batchDuplicatesSkipped = rejectedDuplicates;\n let embeddingBasedDuplicates = 0;\n let storeLevelDuplicates = 0;\n let newRuleEmbedFailures = 0;\n let vectorStoreFailures = 0;\n let metadataFailures = 0;\n let storeSkipped = 0;\n let storeDedupeVectorFallbackSuppressed = 0;\n const reflectionRunId = provenanceService ? randomUUID() : null;\n const inRunFactVectors = new Map<string, { vector: number[]; embeddingModel: string }>();\n for (const ruleText of uniqueRules) {\n let vec: number[];\n try {\n vec = await embeddings.embed(ruleText);\n } catch (err) {\n newRuleEmbedFailures++;\n // AllEmbeddingProvidersFailed is expected when all providers are unavailable — don't report (#486)\n if (!shouldSuppressEmbeddingError(err)) {\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"embed-rule\",\n severity: \"info\",\n subsystem: \"reflection\",\n });\n }\n continue; // Skip this rule on embed failure\n }\n const normVec = normalizeVector(vec);\n let isDuplicate = false;\n for (const ev of existingVectors) {\n if (ev === null || ev.length === 0) continue;\n if (dotProductSimilarity(normVec, ev) >= REFLECTION_DEDUPE_THRESHOLD) {\n isDuplicate = true;\n break;\n }\n }\n if (isDuplicate) {\n rulesDuplicatesSkipped++;\n embeddingBasedDuplicates++;\n if (opts.verbose) {\n logger.info(`memory-hybrid: reflect-rules — skipped duplicate: ${ruleText.slice(0, 50)}...`);\n }\n continue;\n }\n if (opts.dryRun) {\n logger.info(`memory-hybrid: reflect-rules [dry-run] would store: ${ruleText.slice(0, 50)}...`);\n stored++;\n continue;\n }\n storeDedupeVectorFallbackSuppressed++;\n const storeResult = factsDb.storeWithResult(\n {\n text: ruleText,\n category: \"rule\" as MemoryCategory,\n importance: REFLECTION_IMPORTANCE,\n entity: null,\n key: null,\n value: null,\n source: \"reflection\",\n decayClass: \"permanent\",\n tags: [\"reflection\", \"rule\"],\n extractionMethod: \"reflection\",\n extractionConfidence: REFLECTION_IMPORTANCE,\n },\n {\n warnContext: \"reflect-rules\",\n suppressVectorFallbackWarning: true,\n },\n );\n if (storeResult.skipped) {\n storeSkipped++;\n continue;\n }\n const entry = storeResult.entry;\n const mergeExistingIndex = storeResult.embeddingStale ? existingRuleFacts.findIndex((f) => f.id === entry.id) : -1;\n const inRunMerge = storeResult.embeddingStale && mergeExistingIndex < 0 ? inRunFactVectors.get(entry.id) : null;\n const preMergeVector =\n mergeExistingIndex >= 0 && mergeExistingIndex < existingVectors.length\n ? existingVectors[mergeExistingIndex]\n : (inRunMerge?.vector ?? null);\n const preMergeEmbeddingModel =\n mergeExistingIndex >= 0\n ? (existingRuleFacts[mergeExistingIndex]?.embeddingModel ?? null)\n : (inRunMerge?.embeddingModel ?? null);\n // Skip reused existing facts unless this was a merge update that requires re-embed.\n if (reusedExistingStoreEntry(storeResult, ruleText) && !storeResult.embeddingStale) {\n storeLevelDuplicates++;\n rulesDuplicatesSkipped++;\n // Keep this candidate in the in-run dedupe corpus so later rules don't miss near-duplicates.\n existingVectors.push(normVec);\n if (opts.verbose) {\n logger.info(`memory-hybrid: reflect-rules — skipped store-level duplicate: ${ruleText.slice(0, 50)}...`);\n }\n continue;\n }\n // CRITICAL FIX (#2): Delete vector for evicted fact to prevent orphaned vectors\n await cleanupEvictedVector({\n vectorDb: vectorDb,\n evictedFactId: storeResult.evictedFactId,\n logger: logger,\n context: \"reflection\",\n });\n if (opts.verbose) {\n logger.info(\n `memory-hybrid: reflect-rules — stored rule: ${ruleText.slice(0, 100)}${ruleText.length > 100 ? \"...\" : \"\"}`,\n );\n }\n // If embeddingStale=true (merge path), re-embed the updated merged text\n let textToEmbed = ruleText;\n let vectorToStore: number[];\n if (storeResult.embeddingStale) {\n try {\n textToEmbed = entry.text;\n vectorToStore = await embeddings.embed(textToEmbed);\n } catch (err) {\n newRuleEmbedFailures++;\n if (!shouldSuppressEmbeddingError(err)) {\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"embed-rule-merge\",\n severity: \"info\",\n subsystem: \"reflection\",\n });\n }\n rollbackMergedFactText(factsDb, logger, {\n context: \"reflect-rules\",\n factId: entry.id,\n mergedText: entry.text,\n appendedText: ruleText,\n preMergeText: storeResult.preMergeText,\n reason: \"merge-reembed-failure\",\n });\n continue;\n }\n } else {\n vectorToStore = vec;\n }\n let vectorStored = false;\n try {\n await vectorDb.store({\n text: textToEmbed,\n vector: vectorToStore,\n importance: REFLECTION_IMPORTANCE,\n category: \"rule\",\n id: entry.id,\n });\n vectorStored = true;\n } catch (err) {\n vectorStoreFailures++;\n logger.warn(`memory-hybrid: reflect-rules vector store failed: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"reflection-rules-vector-store\",\n subsystem: \"vector\",\n factId: entry.id,\n });\n if (storeResult.embeddingStale) {\n const preMergeText = resolvePreMergeText(entry.text, ruleText, storeResult.preMergeText);\n const rolledBack = rollbackMergedFactText(factsDb, logger, {\n context: \"reflect-rules\",\n factId: entry.id,\n mergedText: entry.text,\n appendedText: ruleText,\n preMergeText: storeResult.preMergeText,\n reason: \"vector-store-failure\",\n });\n if (rolledBack) {\n await restoreMergedFactVectorState({\n context: \"reflect-rules\",\n factId: entry.id,\n category: \"rule\",\n preMergeText,\n preMergeVector,\n preMergeEmbeddingModel,\n fallbackEmbeddingModel: embeddings.modelName,\n vectorDb,\n factsDb,\n logger,\n });\n }\n continue;\n }\n if (storeResult.newlyStored === false) {\n logger.warn(\n `memory-hybrid: reflect-rules — preserving existing rule fact ${entry.id.slice(0, 8)} after vector store failure on reused entry`,\n );\n continue;\n }\n if (!storeResult.embeddingStale) {\n try {\n factsDb.delete(entry.id);\n if (provenanceService) {\n try {\n provenanceService.deleteEdgesByFactId(entry.id);\n } catch (provErr) {\n logger.warn(\n `memory-hybrid: reflect-rules — failed to clean up provenance for rule fact ${entry.id.slice(0, 8)}: ${provErr}`,\n );\n }\n }\n try {\n await vectorDb.delete(entry.id);\n } catch (vecErr) {\n logger.warn(\n `memory-hybrid: reflect-rules — failed to clean up vector for rule fact ${entry.id.slice(0, 8)}: ${vecErr}`,\n );\n }\n logger.warn(\n `memory-hybrid: reflect-rules — deleted rule fact ${entry.id.slice(0, 8)} after vector store failure to prevent SQLite/LanceDB split`,\n );\n } catch (deleteErr) {\n logger.warn(\n `memory-hybrid: reflect-rules — failed to delete rule fact ${entry.id.slice(0, 8)} after vector store failure: ${deleteErr}`,\n );\n }\n continue;\n }\n }\n if (vectorStored) {\n try {\n persistCanonicalFactEmbedding(\n factsDb,\n entry.id,\n embeddings.modelName,\n vectorToStore,\n \"reflection-fact-embeddings\",\n \"reflection\",\n logger.warn?.bind(logger),\n );\n factsDb.setEmbeddingModel(entry.id, embeddings.modelName);\n } catch (err) {\n metadataFailures++;\n logger.warn(`memory-hybrid: reflect-rules metadata update failed after vector store: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"reflection-rules-metadata-update\",\n subsystem: \"sqlite\",\n factId: entry.id,\n });\n if (storeResult.embeddingStale) {\n const preMergeText = resolvePreMergeText(entry.text, ruleText, storeResult.preMergeText);\n const hasPreMergeVector = Array.isArray(preMergeVector) && preMergeVector.length > 0;\n if (!preMergeText || !hasPreMergeVector) {\n logger.warn(\n `memory-hybrid: reflect-rules — metadata rollback skipped for rule fact ${entry.id.slice(0, 8)} because pre-merge vector state is unavailable; keeping merged text to avoid SQLite/LanceDB mismatch`,\n );\n continue;\n }\n try {\n (factsDb as FactsDB & { deleteEmbeddings?: (factId: string) => void }).deleteEmbeddings?.(entry.id);\n } catch (embErr) {\n logger.warn(\n `memory-hybrid: reflect-rules — failed to delete canonical embeddings for rule fact ${entry.id.slice(0, 8)} after metadata failure: ${embErr}`,\n );\n }\n if (preMergeVector && preMergeVector.length > 0) {\n try {\n await vectorDb.delete(entry.id);\n } catch (vecErr) {\n logger.warn(\n `memory-hybrid: reflect-rules — failed to delete merged vector for rule fact ${entry.id.slice(0, 8)} before rollback: ${vecErr}`,\n );\n }\n }\n const rolledBack = rollbackMergedFactText(factsDb, logger, {\n context: \"reflect-rules\",\n factId: entry.id,\n mergedText: entry.text,\n appendedText: ruleText,\n preMergeText: storeResult.preMergeText,\n reason: \"metadata-update-failure\",\n });\n if (rolledBack) {\n if (preMergeVector && preMergeVector.length > 0) {\n await restoreMergedFactVectorState({\n context: \"reflect-rules\",\n factId: entry.id,\n category: \"rule\",\n preMergeText,\n preMergeVector,\n preMergeEmbeddingModel,\n fallbackEmbeddingModel: embeddings.modelName,\n vectorDb,\n factsDb,\n logger,\n });\n } else {\n try {\n await vectorDb.delete(entry.id);\n logger.warn(\n `memory-hybrid: reflect-rules — deleted merged vector for rule fact ${entry.id.slice(0, 8)} after metadata failure (no pre-merge vector to restore)`,\n );\n } catch (vecErr) {\n logger.warn(\n `memory-hybrid: reflect-rules — failed to delete merged vector for rule fact ${entry.id.slice(0, 8)} after metadata failure: ${vecErr}`,\n );\n }\n }\n }\n vectorStored = false;\n continue;\n }\n // For new inserts, clean up the partial state\n if (storeResult.newlyStored !== false) {\n try {\n (factsDb as FactsDB & { deleteEmbeddings?: (factId: string) => void }).deleteEmbeddings?.(entry.id);\n } catch (embErr) {\n logger.warn(\n `memory-hybrid: reflect-rules — failed to delete canonical embeddings for rule fact ${entry.id.slice(0, 8)} after metadata failure: ${embErr}`,\n );\n }\n try {\n await vectorDb.delete(entry.id);\n } catch (vecErr) {\n logger.warn(\n `memory-hybrid: reflect-rules — failed to delete Lance vector for rule fact ${entry.id.slice(0, 8)} after metadata failure: ${vecErr}`,\n );\n }\n try {\n factsDb.delete(entry.id);\n } catch (deleteErr) {\n logger.warn(\n `memory-hybrid: reflect-rules — failed to delete rule fact ${entry.id.slice(0, 8)} after metadata failure: ${deleteErr}`,\n );\n }\n if (provenanceService) {\n try {\n provenanceService.deleteEdgesByFactId(entry.id);\n } catch (provErr) {\n logger.warn(\n `memory-hybrid: reflect-rules — failed to clean up provenance for rule fact ${entry.id.slice(0, 8)}: ${provErr}`,\n );\n }\n }\n logger.warn(\n `memory-hybrid: reflect-rules — deleted rule fact ${entry.id.slice(0, 8)} after metadata failure to prevent partial store`,\n );\n }\n vectorStored = false;\n continue;\n }\n }\n if (vectorStored) {\n if (provenanceService && reflectionRunId) {\n try {\n provenanceService.addEdge(entry.id, {\n edgeType: \"DERIVED_FROM\",\n sourceType: \"reflection\",\n sourceId: reflectionRunId,\n });\n } catch (err) {\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"reflection-rules-provenance-derived\",\n subsystem: \"provenance\",\n factId: entry.id,\n });\n }\n }\n // If this was a merge (embeddingStale=true), replace the existing vector for this fact ID\n // instead of pushing a duplicate vector for the same fact.\n if (storeResult.embeddingStale) {\n const existingIndex = existingRuleFacts.findIndex((f) => f.id === entry.id);\n if (existingIndex >= 0 && existingIndex < existingVectors.length) {\n existingVectors[existingIndex] = normalizeVector(vectorToStore);\n } else {\n // Fact was inserted earlier in this loop, not in pre-run snapshot\n existingVectors.push(normalizeVector(vectorToStore));\n }\n inRunFactVectors.set(entry.id, { vector: vectorToStore, embeddingModel: embeddings.modelName });\n } else {\n existingVectors.push(normalizeVector(vectorToStore));\n inRunFactVectors.set(entry.id, { vector: vectorToStore, embeddingModel: embeddings.modelName });\n }\n stored++;\n }\n }\n\n logger.info(\n `memory-hybrid: reflect-rules — finished: ${stored} rule(s) stored, ${batchDuplicatesSkipped} skipped as batch duplicate(s), ${rulesDuplicatesSkipped} skipped as near-duplicate(s), ${newRuleEmbedFailures} new-rule embed failure(s), ${uniqueRules.length} candidate(s) total`,\n );\n if (storeDedupeVectorFallbackSuppressed > 0) {\n logger.info(\n `memory-hybrid: reflect-rules — store dedupe used lexical-only for ${storeDedupeVectorFallbackSuppressed} store(s) (phase-level cosine dedupe already handled near-duplicates)`,\n );\n }\n\n let zeroRulesReason: ReflectionRulesDiagnostics[\"zeroRulesReason\"];\n if (stored <= 0) {\n const allCandidatesBlocked =\n newRuleEmbedFailures +\n embeddingBasedDuplicates +\n storeLevelDuplicates +\n vectorStoreFailures +\n metadataFailures +\n storeSkipped ===\n uniqueRules.length;\n if (vectorStoreFailures === uniqueRules.length) {\n // All candidates failed only at vector store\n zeroRulesReason = \"vector_store_failed\";\n } else if (newRuleEmbedFailures === uniqueRules.length) {\n // All candidates failed at embedding\n zeroRulesReason = \"all_candidates_embedding_failed\";\n } else if (metadataFailures === uniqueRules.length) {\n // All candidates failed at metadata persistence\n zeroRulesReason = \"all_candidates_metadata_failed\";\n } else if (embeddingBasedDuplicates + storeLevelDuplicates === uniqueRules.length) {\n // All candidates are duplicates (no failures)\n zeroRulesReason = \"all_candidates_duplicate\";\n } else if (\n allCandidatesBlocked &&\n vectorStoreFailures > 0 &&\n (embeddingBasedDuplicates > 0 || storeLevelDuplicates > 0)\n ) {\n // Mixed: some vector store failures and some duplicates\n zeroRulesReason = \"candidates_duplicate_or_vector_store_failed\";\n } else if (allCandidatesBlocked && newRuleEmbedFailures > 0) {\n // Mixed: some embedding failures and other blocks\n zeroRulesReason = \"candidates_duplicate_or_embedding_failed\";\n } else {\n zeroRulesReason = \"no_storable_candidates\";\n }\n }\n const diagnostics: ReflectionRulesDiagnostics = {\n modelResponseChars,\n parseSuccess,\n parsedCandidates: parseableLines,\n rejectedDuplicates: batchDuplicatesSkipped + rulesDuplicatesSkipped,\n rejectedLowConfidence,\n stored,\n zeroRulesReason,\n status:\n stored > 0 &&\n stored === uniqueRules.length &&\n newRuleEmbedFailures === 0 &&\n vectorStoreFailures === 0 &&\n metadataFailures === 0\n ? \"ok\"\n : stored > 0\n ? \"partial\"\n : zeroRulesReason === \"all_candidates_embedding_failed\"\n ? \"degraded\"\n : zeroRulesReason === \"candidates_duplicate_or_embedding_failed\"\n ? \"degraded\"\n : zeroRulesReason === \"all_candidates_duplicate\"\n ? \"partial\"\n : zeroRulesReason === \"candidates_duplicate_or_vector_store_failed\"\n ? \"partial\"\n : zeroRulesReason === \"vector_store_failed\"\n ? \"partial\"\n : zeroRulesReason === \"all_candidates_metadata_failed\"\n ? \"partial\"\n : \"partial\",\n };\n logger.info(\n \"memory-hybrid: reflect-rules — diagnostics: \" +\n `model_response_chars=${diagnostics.modelResponseChars} ` +\n `parse_success=${diagnostics.parseSuccess} ` +\n `parsed_candidates=${diagnostics.parsedCandidates} ` +\n `rejected_duplicates=${diagnostics.rejectedDuplicates} ` +\n `rejected_low_confidence=${diagnostics.rejectedLowConfidence} ` +\n `stored=${diagnostics.stored} ` +\n `status=${diagnostics.status}` +\n (diagnostics.zeroRulesReason ? ` zero_rules_reason=${diagnostics.zeroRulesReason}` : \"\"),\n );\n return { rulesExtracted: uniqueRules.length, rulesStored: stored, diagnostics };\n}\n\n/**\n * Reflection on reflections — synthesize patterns into 1-3 meta-patterns (stored as pattern + meta tag).\n */\nexport async function runReflectionMeta(\n factsDb: FactsDB,\n vectorDb: VectorDB,\n embeddings: EmbeddingProvider,\n openai: OpenAI,\n opts: {\n dryRun: boolean;\n model: string;\n verbose?: boolean;\n fallbackModels?: string[];\n modelSource?: string;\n adaptiveStatePath?: string;\n },\n logger: { info: (msg: string) => void; warn: (msg: string) => void },\n provenanceService?: ProvenanceService | null,\n): Promise<ReflectionMetaResult> {\n const nowSec = Math.floor(Date.now() / 1000);\n const patternFacts = factsDb\n .getByCategory(\"pattern\")\n .filter((f) => !f.supersededAt && (f.expiresAt === null || f.expiresAt > nowSec));\n const patterns = patternFacts.slice(0, REFLECTION_MAX_PATTERNS_FOR_META).map((f) => f.text);\n if (patterns.length < 3) {\n logger.info(`memory-hybrid: reflect-meta — need at least 3 patterns, have ${patterns.length}`);\n return { metaExtracted: 0, metaStored: 0 };\n }\n const patternsBlock = patterns.map((p, i) => `${i + 1}. ${p}`).join(\"\\n\");\n const prompt = fillPrompt(loadPrompt(\"reflection-meta\"), { patterns: patternsBlock });\n if (opts.verbose) {\n logger.info(\n `memory-hybrid: reflect-meta — LLM call (${prompt.length} chars, ${patterns.length} patterns, model=${opts.model})`,\n );\n }\n let rawResponse: string;\n try {\n const adaptiveEnabled = (getEnv(\"OPENCLAW_HYBRID_MEM_ADAPTIVE_DISTILL\") ?? \"\").trim() !== \"0\";\n const detail = await chatCompleteWithAdaptiveMaintenanceRetry({\n model: opts.model,\n modelSource: opts.modelSource,\n content: prompt,\n temperature: REFLECTION_TEMPERATURE,\n maxTokens: 500,\n openai,\n fallbackModels: opts.fallbackModels ?? [],\n label: \"memory-hybrid: reflect-meta\",\n feature: CostFeature.reflectionMeta,\n logger,\n adaptiveStatePath: opts.adaptiveStatePath,\n enabled: adaptiveEnabled,\n });\n if (detail.modelUsed !== opts.model) {\n logger.info(`memory-hybrid: reflect-meta — used fallback model ${detail.modelUsed}`);\n }\n rawResponse = detail.content;\n } catch (err) {\n logger.warn(`memory-hybrid: reflect-meta LLM failed: ${err}`);\n const retryAttempt = err instanceof LLMRetryError ? err.attemptNumber : 1;\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"reflection-meta-llm\",\n subsystem: \"openai\",\n retryAttempt,\n });\n return { metaExtracted: 0, metaStored: 0 };\n }\n const metas: string[] = [];\n for (const line of rawResponse.split(/\\n/)) {\n const m = line.match(/^\\s*META:\\s*(.+)/);\n if (!m) continue;\n const text = m[1].trim();\n if (text.length >= REFLECTION_META_MIN_CHARS && text.length <= REFLECTION_META_MAX_CHARS) metas.push(text);\n }\n const seenInBatch = new Set<string>();\n const uniqueMetas: string[] = [];\n for (const x of metas) {\n const key = x.toLowerCase().replace(/\\s+/g, \" \");\n if (seenInBatch.has(key)) continue;\n seenInBatch.add(key);\n uniqueMetas.push(x);\n }\n if (uniqueMetas.length === 0) {\n logger.info(\"memory-hybrid: reflect-meta — 0 meta-patterns extracted from LLM\");\n return { metaExtracted: metas.length, metaStored: 0 };\n }\n\n logger.info(\n `memory-hybrid: reflect-meta — LLM completed successfully: ${uniqueMetas.length} candidate meta-pattern(s) after parse`,\n );\n\n if (opts.verbose) {\n logger.info(`memory-hybrid: reflect-meta — extracted ${uniqueMetas.length} meta-patterns:`);\n for (const meta of uniqueMetas) {\n logger.info(` META: ${meta}`);\n }\n }\n const existingMetaFacts = factsDb\n .getByCategory(\"pattern\")\n .filter(\n (f) => !f.supersededAt && (f.expiresAt === null || f.expiresAt > nowSec) && f.tags?.includes(\"meta\") === true,\n );\n let existingVectors: (number[] | null)[] = [];\n if (existingMetaFacts.length > 0) {\n logger.info(\n `memory-hybrid: reflect-meta — loading ${existingMetaFacts.length} existing meta-pattern row(s) for dedupe (Lance vectors + embedding API when index or model is missing)`,\n );\n existingVectors = await loadReflectionDedupeCorpusVectors(\n existingMetaFacts,\n embeddings,\n vectorDb,\n logger,\n \"memory-hybrid: reflect-meta\",\n \"reflection-meta-embed-existing\",\n (factId, model) => factsDb.setEmbeddingModel(factId, model),\n opts.dryRun,\n );\n } else {\n logger.info(\"memory-hybrid: reflect-meta — no existing meta-patterns for dedupe; embedding new candidates only\");\n }\n\n logger.info(\n `memory-hybrid: reflect-meta — embedding ${uniqueMetas.length} new candidate meta-pattern(s) for duplicate check + storage`,\n );\n\n let stored = 0;\n let metaDuplicatesSkipped = 0;\n let newMetaEmbedFailures = 0;\n let storeDedupeVectorFallbackSuppressed = 0;\n const reflectionRunId = provenanceService ? randomUUID() : null;\n const inRunFactVectors = new Map<string, { vector: number[]; embeddingModel: string }>();\n for (const metaText of uniqueMetas) {\n let vec: number[];\n try {\n vec = await embeddings.embed(metaText);\n } catch (err) {\n newMetaEmbedFailures++;\n // AllEmbeddingProvidersFailed is expected when all providers are unavailable — don't report (#486)\n if (!shouldSuppressEmbeddingError(err)) {\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"embed-meta\",\n severity: \"info\",\n subsystem: \"reflection\",\n });\n }\n continue; // Skip this meta-pattern on embed failure\n }\n const normVec = normalizeVector(vec);\n let isDuplicate = false;\n for (const ev of existingVectors) {\n if (ev === null || ev.length === 0) continue;\n if (dotProductSimilarity(normVec, ev) >= REFLECTION_DEDUPE_THRESHOLD) {\n isDuplicate = true;\n break;\n }\n }\n if (isDuplicate) {\n metaDuplicatesSkipped++;\n if (opts.verbose) {\n logger.info(`memory-hybrid: reflect-meta — skipped duplicate: ${metaText.slice(0, 50)}...`);\n }\n continue;\n }\n if (opts.dryRun) {\n logger.info(`memory-hybrid: reflect-meta [dry-run] would store: ${metaText.slice(0, 50)}...`);\n stored++;\n continue;\n }\n storeDedupeVectorFallbackSuppressed++;\n const storeResult = factsDb.storeWithResult(\n {\n text: metaText,\n category: \"pattern\" as MemoryCategory,\n importance: REFLECTION_IMPORTANCE,\n entity: null,\n key: null,\n value: null,\n source: \"reflection\",\n decayClass: \"permanent\",\n tags: [\"reflection\", \"pattern\", \"meta\"],\n extractionMethod: \"reflection\",\n extractionConfidence: REFLECTION_IMPORTANCE,\n },\n {\n warnContext: \"reflect-meta\",\n suppressVectorFallbackWarning: true,\n },\n );\n if (storeResult.skipped) {\n continue;\n }\n const entry = storeResult.entry;\n const mergeExistingIndex = storeResult.embeddingStale ? existingMetaFacts.findIndex((f) => f.id === entry.id) : -1;\n const inRunMerge = storeResult.embeddingStale && mergeExistingIndex < 0 ? inRunFactVectors.get(entry.id) : null;\n const preMergeVector =\n mergeExistingIndex >= 0 && mergeExistingIndex < existingVectors.length\n ? existingVectors[mergeExistingIndex]\n : (inRunMerge?.vector ?? null);\n const preMergeEmbeddingModel =\n mergeExistingIndex >= 0\n ? (existingMetaFacts[mergeExistingIndex]?.embeddingModel ?? null)\n : (inRunMerge?.embeddingModel ?? null);\n // Skip reused existing facts unless this was a merge update that requires re-embed.\n if (reusedExistingStoreEntry(storeResult, metaText) && !storeResult.embeddingStale) {\n metaDuplicatesSkipped++;\n // Keep this candidate in the in-run dedupe corpus so later meta-patterns don't miss near-duplicates.\n existingVectors.push(normVec);\n if (opts.verbose) {\n logger.info(`memory-hybrid: reflect-meta — skipped store-level duplicate: ${metaText.slice(0, 50)}...`);\n }\n continue;\n }\n // CRITICAL FIX (#2): Delete vector for evicted fact to prevent orphaned vectors\n await cleanupEvictedVector({\n vectorDb: vectorDb,\n evictedFactId: storeResult.evictedFactId,\n logger: logger,\n context: \"reflection\",\n });\n if (opts.verbose) {\n logger.info(\n `memory-hybrid: reflect-meta — stored meta-pattern: ${metaText.slice(0, 100)}${metaText.length > 100 ? \"...\" : \"\"}`,\n );\n }\n // If embeddingStale=true (merge path), re-embed the updated merged text\n let textToEmbed: string;\n let vectorToStore: number[];\n if (storeResult.embeddingStale) {\n try {\n textToEmbed = entry.text;\n vectorToStore = await embeddings.embed(textToEmbed);\n } catch (err) {\n newMetaEmbedFailures++;\n if (!shouldSuppressEmbeddingError(err)) {\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"embed-meta-merge\",\n severity: \"info\",\n subsystem: \"reflection\",\n });\n }\n rollbackMergedFactText(factsDb, logger, {\n context: \"reflect-meta\",\n factId: entry.id,\n mergedText: entry.text,\n appendedText: metaText,\n preMergeText: storeResult.preMergeText,\n reason: \"merge-reembed-failure\",\n });\n continue;\n }\n } else {\n textToEmbed = metaText;\n vectorToStore = vec;\n }\n let vectorStored = false;\n try {\n await vectorDb.store({\n text: textToEmbed,\n vector: vectorToStore,\n importance: REFLECTION_IMPORTANCE,\n category: \"pattern\",\n id: entry.id,\n });\n vectorStored = true;\n } catch (err) {\n logger.warn(`memory-hybrid: reflect-meta vector store failed: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"reflection-meta-vector-store\",\n subsystem: \"vector\",\n factId: entry.id,\n });\n if (storeResult.embeddingStale) {\n const preMergeText = resolvePreMergeText(entry.text, metaText, storeResult.preMergeText);\n const rolledBack = rollbackMergedFactText(factsDb, logger, {\n context: \"reflect-meta\",\n factId: entry.id,\n mergedText: entry.text,\n appendedText: metaText,\n preMergeText: storeResult.preMergeText,\n reason: \"vector-store-failure\",\n });\n if (rolledBack) {\n await restoreMergedFactVectorState({\n context: \"reflect-meta\",\n factId: entry.id,\n category: \"pattern\",\n preMergeText,\n preMergeVector,\n preMergeEmbeddingModel,\n fallbackEmbeddingModel: embeddings.modelName,\n vectorDb,\n factsDb,\n logger,\n });\n }\n continue;\n }\n if (storeResult.newlyStored === false) {\n logger.warn(\n `memory-hybrid: reflect-meta — preserving existing meta-pattern fact ${entry.id.slice(0, 8)} after vector store failure on reused entry`,\n );\n continue;\n }\n if (!storeResult.embeddingStale) {\n try {\n factsDb.delete(entry.id);\n if (provenanceService) {\n try {\n provenanceService.deleteEdgesByFactId(entry.id);\n } catch (provErr) {\n logger.warn(\n `memory-hybrid: reflect-meta — failed to clean up provenance for meta-pattern fact ${entry.id.slice(0, 8)}: ${provErr}`,\n );\n }\n }\n try {\n await vectorDb.delete(entry.id);\n } catch (vecErr) {\n logger.warn(\n `memory-hybrid: reflect-meta — failed to clean up vector for meta-pattern fact ${entry.id.slice(0, 8)}: ${vecErr}`,\n );\n }\n logger.warn(\n `memory-hybrid: reflect-meta — deleted meta-pattern fact ${entry.id.slice(0, 8)} after vector store failure to prevent SQLite/LanceDB split`,\n );\n } catch (deleteErr) {\n logger.warn(\n `memory-hybrid: reflect-meta — failed to delete meta-pattern fact ${entry.id.slice(0, 8)} after vector store failure: ${deleteErr}`,\n );\n }\n continue;\n }\n }\n if (vectorStored) {\n try {\n persistCanonicalFactEmbedding(\n factsDb,\n entry.id,\n embeddings.modelName,\n vectorToStore,\n \"reflection-fact-embeddings\",\n \"reflection\",\n logger.warn?.bind(logger),\n );\n factsDb.setEmbeddingModel(entry.id, embeddings.modelName);\n } catch (err) {\n logger.warn(`memory-hybrid: reflect-meta metadata update failed after vector store: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"reflection-meta-metadata-update\",\n subsystem: \"sqlite\",\n factId: entry.id,\n });\n if (storeResult.embeddingStale) {\n const preMergeText = resolvePreMergeText(entry.text, metaText, storeResult.preMergeText);\n const hasPreMergeVector = Array.isArray(preMergeVector) && preMergeVector.length > 0;\n if (!preMergeText || !hasPreMergeVector) {\n logger.warn(\n `memory-hybrid: reflect-meta — metadata rollback skipped for meta-pattern fact ${entry.id.slice(0, 8)} because pre-merge vector state is unavailable; keeping merged text to avoid SQLite/LanceDB mismatch`,\n );\n continue;\n }\n try {\n (factsDb as FactsDB & { deleteEmbeddings?: (factId: string) => void }).deleteEmbeddings?.(entry.id);\n } catch (embErr) {\n logger.warn(\n `memory-hybrid: reflect-meta — failed to delete canonical embeddings for meta-pattern fact ${entry.id.slice(0, 8)} after metadata failure: ${embErr}`,\n );\n }\n if (preMergeVector && preMergeVector.length > 0) {\n try {\n await vectorDb.delete(entry.id);\n } catch (vecErr) {\n logger.warn(\n `memory-hybrid: reflect-meta — failed to delete merged vector for meta-pattern fact ${entry.id.slice(0, 8)} before rollback: ${vecErr}`,\n );\n }\n }\n const rolledBack = rollbackMergedFactText(factsDb, logger, {\n context: \"reflect-meta\",\n factId: entry.id,\n mergedText: entry.text,\n appendedText: metaText,\n preMergeText: storeResult.preMergeText,\n reason: \"metadata-update-failure\",\n });\n if (rolledBack) {\n if (preMergeVector && preMergeVector.length > 0) {\n await restoreMergedFactVectorState({\n context: \"reflect-meta\",\n factId: entry.id,\n category: \"pattern\",\n preMergeText,\n preMergeVector,\n preMergeEmbeddingModel,\n fallbackEmbeddingModel: embeddings.modelName,\n vectorDb,\n factsDb,\n logger,\n });\n } else {\n try {\n await vectorDb.delete(entry.id);\n logger.warn(\n `memory-hybrid: reflect-meta — deleted merged vector for meta-pattern fact ${entry.id.slice(0, 8)} after metadata failure (no pre-merge vector to restore)`,\n );\n } catch (vecErr) {\n logger.warn(\n `memory-hybrid: reflect-meta — failed to delete merged vector for meta-pattern fact ${entry.id.slice(0, 8)} after metadata failure: ${vecErr}`,\n );\n }\n }\n }\n vectorStored = false;\n continue;\n }\n // For new inserts, clean up the partial state\n if (storeResult.newlyStored !== false) {\n try {\n (factsDb as FactsDB & { deleteEmbeddings?: (factId: string) => void }).deleteEmbeddings?.(entry.id);\n } catch (embErr) {\n logger.warn(\n `memory-hybrid: reflect-meta — failed to delete canonical embeddings for meta-pattern fact ${entry.id.slice(0, 8)} after metadata failure: ${embErr}`,\n );\n }\n try {\n await vectorDb.delete(entry.id);\n } catch (vecErr) {\n logger.warn(\n `memory-hybrid: reflect-meta — failed to delete Lance vector for meta-pattern fact ${entry.id.slice(0, 8)} after metadata failure: ${vecErr}`,\n );\n }\n try {\n factsDb.delete(entry.id);\n } catch (deleteErr) {\n logger.warn(\n `memory-hybrid: reflect-meta — failed to delete meta-pattern fact ${entry.id.slice(0, 8)} after metadata failure: ${deleteErr}`,\n );\n }\n if (provenanceService) {\n try {\n provenanceService.deleteEdgesByFactId(entry.id);\n } catch (provErr) {\n logger.warn(\n `memory-hybrid: reflect-meta — failed to clean up provenance for meta-pattern fact ${entry.id.slice(0, 8)}: ${provErr}`,\n );\n }\n }\n logger.warn(\n `memory-hybrid: reflect-meta — deleted meta-pattern fact ${entry.id.slice(0, 8)} after metadata failure to prevent partial store`,\n );\n }\n vectorStored = false;\n continue;\n }\n }\n if (vectorStored) {\n if (provenanceService && reflectionRunId) {\n try {\n provenanceService.addEdge(entry.id, {\n edgeType: \"DERIVED_FROM\",\n sourceType: \"reflection\",\n sourceId: reflectionRunId,\n });\n } catch (err) {\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"reflection-meta-provenance-derived\",\n subsystem: \"provenance\",\n factId: entry.id,\n });\n }\n }\n // If this was a merge (embeddingStale=true), replace the existing vector for this fact ID\n // instead of pushing a duplicate vector for the same fact.\n if (storeResult.embeddingStale) {\n const existingIndex = existingMetaFacts.findIndex((f) => f.id === entry.id);\n if (existingIndex >= 0 && existingIndex < existingVectors.length) {\n existingVectors[existingIndex] = normalizeVector(vectorToStore);\n } else {\n // Fact was inserted earlier in this loop, not in pre-run snapshot\n existingVectors.push(normalizeVector(vectorToStore));\n }\n inRunFactVectors.set(entry.id, { vector: vectorToStore, embeddingModel: embeddings.modelName });\n } else {\n existingVectors.push(normalizeVector(vectorToStore));\n inRunFactVectors.set(entry.id, { vector: vectorToStore, embeddingModel: embeddings.modelName });\n }\n stored++;\n }\n }\n\n logger.info(\n `memory-hybrid: reflect-meta — finished: ${stored} meta-pattern(s) stored, ${metaDuplicatesSkipped} skipped as near-duplicate(s), ${newMetaEmbedFailures} embed failure(s), ${uniqueMetas.length} candidate(s) total`,\n );\n if (storeDedupeVectorFallbackSuppressed > 0) {\n logger.info(\n `memory-hybrid: reflect-meta — store dedupe used lexical-only for ${storeDedupeVectorFallbackSuppressed} store(s) (phase-level cosine dedupe already handled near-duplicates)`,\n );\n }\n\n return { metaExtracted: metas.length, metaStored: stored };\n}\n"],"mappings":"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"}