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":"plugin-service.js","names":[],"sources":["../../setup/plugin-service.ts"],"sourcesContent":["import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, isAbsolute, join } from \"node:path\";\nimport type OpenAI from \"openai\";\nimport type { ClawdbotPluginApi } from \"openclaw/plugin-sdk/core\";\nimport { clearRuntimeTimers } from \"../api/plugin-runtime.js\";\nimport type { CredentialsDB } from \"../backends/credentials-db.js\";\nimport type { EdictStore } from \"../backends/edict-store.js\";\nimport type { FactsDB } from \"../backends/facts-db.js\";\nimport type { IssueStore } from \"../backends/issue-store.js\";\nimport type { NarrativesDB } from \"../backends/narratives-db.js\";\nimport type { ProposalsDB } from \"../backends/proposals-db.js\";\nimport type { VectorDB } from \"../backends/vector-db.js\";\nimport type { WriteAheadLog } from \"../backends/wal.js\";\nimport type { WorkflowStore } from \"../backends/workflow-store.js\";\nimport { ensureHybridMemoryWorkspaceSkillIfMissing, loadOpenclawRootForWorkspace } from \"../cli/cmd-install.js\";\nimport type { HybridMemoryConfig, MemoryCategory } from \"../config.js\";\nimport { getCronModelConfig, getDefaultCronModel } from \"../config.js\";\nimport type { DashboardServer } from \"../routes/dashboard-server.js\";\nimport { createDashboardServer } from \"../routes/dashboard-server.js\";\nimport { reconcileActiveTaskInProgressSessions } from \"../services/active-task.js\";\nimport { runAutoClassify } from \"../services/auto-classifier.js\";\nimport { syncCronLastRunFromGuards } from \"../services/cron-guard.js\";\nimport type { EmbeddingRegistry } from \"../services/embedding-registry.js\";\nimport {\n capturePluginError,\n flushErrorReporter,\n initErrorReporter,\n isErrorReporterActive,\n setErrorReporterMuted,\n} from \"../services/error-reporter.js\";\nimport { resolveGoalsDir, runGoalHealthCheck } from \"../services/goal-stewardship.js\";\nimport { runBuildLanguageKeywords } from \"../services/language-keywords-build.js\";\nimport { runPassiveObserver } from \"../services/passive-observer.js\";\nimport type { ProvenanceService } from \"../services/provenance.js\";\nimport {\n reconcileActiveTaskInProgressSessionsFacts,\n reconcileActiveTaskLiveState,\n renderActiveTaskMarkdownFile,\n} from \"../services/task-ledger-facts.js\";\nimport { runTaskQueueWatchdog } from \"../services/task-queue-watchdog.js\";\nimport {\n cleanupEvictedVector,\n deleteVectorsForFactIds,\n storeCanonicalVectorForFact,\n} from \"../services/vector-maintenance.js\";\nimport type { VerificationStore } from \"../services/verification-store.js\";\nimport { walRemove } from \"../services/wal-helpers.js\";\nimport { parseDuration } from \"../utils/duration.js\";\nimport { getEnv } from \"../utils/env-manager.js\";\nimport { persistCanonicalFactEmbedding } from \"../utils/fact-embeddings.js\";\nimport { getLanguageKeywordsFilePath } from \"../utils/language-keywords.js\";\nimport { findPluginRoot } from \"../utils/plugin-root.js\";\nimport {\n fetchLatestPublishedVersion,\n isPluginOutdated,\n isVersionCheckCacheFresh,\n maybeLogOutdatedVersionNudge,\n readVersionCheckCache,\n type VersionCheckCacheEntry,\n writeVersionCheckCache,\n} from \"../utils/plugin-update-check.js\";\nimport { checkOpenClawVersion } from \"../utils/version-check.js\";\nimport { versionInfo } from \"../versionInfo.js\";\n\nexport interface PluginServiceContext {\n PLUGIN_ID: string;\n factsDb: FactsDB;\n edictStore: EdictStore;\n vectorDb: VectorDB;\n embeddings: import(\"../services/embeddings.js\").EmbeddingProvider;\n embeddingRegistry: EmbeddingRegistry;\n credentialsDb: CredentialsDB | null;\n proposalsDb: ProposalsDB | null;\n wal: WriteAheadLog | null;\n eventLog?: import(\"../backends/event-log.js\").EventLog | null;\n cfg: HybridMemoryConfig;\n openai: OpenAI;\n resolvedLancePath: string;\n resolvedSqlitePath: string;\n api: ClawdbotPluginApi;\n pythonBridge?: import(\"../services/python-bridge.js\").PythonBridge | null;\n provenanceService?: ProvenanceService | null;\n costTracker?: import(\"../backends/cost-tracker.js\").CostTracker | null;\n auditStore?: import(\"../backends/audit-store.js\").AuditStore | null;\n agentHealthStore?: import(\"../backends/agent-health-store.js\").AgentHealthStore | null;\n // Memory Viewer stores (Issue #1023)\n verificationStore?: VerificationStore | null;\n issueStore?: IssueStore | null;\n workflowStore?: WorkflowStore | null;\n narrativesDb?: NarrativesDB | null;\n // Mutable timer refs that will be updated by the start handler\n timers: {\n pruneTimer: { value: ReturnType<typeof setInterval> | null };\n classifyTimer: { value: ReturnType<typeof setInterval> | null };\n classifyStartupTimeout: { value: ReturnType<typeof setTimeout> | null };\n proposalsPruneTimer: { value: ReturnType<typeof setInterval> | null };\n languageKeywordsTimer: { value: ReturnType<typeof setInterval> | null };\n languageKeywordsStartupTimeout: { value: ReturnType<typeof setTimeout> | null };\n postUpgradeTimeout: { value: ReturnType<typeof setTimeout> | null };\n passiveObserverTimer: { value: ReturnType<typeof setInterval> | null };\n watchdogTimer: { value: ReturnType<typeof setInterval> | null };\n };\n}\n\n/**\n * Creates the plugin service registration object with start/stop handlers.\n * Manages:\n * - Error reporter initialization\n * - WAL recovery on startup\n * - Periodic pruning, classification, language keywords building\n * - Post-upgrade pipeline\n * - Cleanup on shutdown\n */\nexport function createPluginService(ctx: PluginServiceContext) {\n const {\n PLUGIN_ID,\n factsDb,\n edictStore,\n vectorDb,\n embeddings,\n credentialsDb,\n proposalsDb,\n wal,\n eventLog,\n cfg,\n openai,\n resolvedLancePath,\n resolvedSqlitePath,\n api,\n timers,\n provenanceService,\n costTracker,\n auditStore,\n agentHealthStore,\n pythonBridge,\n verificationStore,\n issueStore,\n workflowStore,\n narrativesDb,\n } = ctx;\n\n let observerRunning = false;\n let observerRunPromise: Promise<void> | null = null;\n let watchdogRunning = false;\n let watchdogRunPromise: Promise<void> | null = null;\n let shuttingDown = false;\n let dashboardServer: DashboardServer | null = null;\n let versionCheckPromise: Promise<void> | null = null;\n\n return {\n id: PLUGIN_ID,\n _getVersionCheckPromise: () => versionCheckPromise,\n start: async () => {\n // Issue #422: surface missing Python deps early; deferred from register() for lighter CLI (issue #1111).\n if (pythonBridge) {\n const { ok, missing, spawnError } = pythonBridge.checkDependencies();\n if (!ok) {\n if (spawnError) {\n api.logger.warn(\n `memory-hybrid: documents.enabled but Python binary not found or failed to spawn: ${spawnError.message}. ` +\n `Check documents.pythonPath configuration (currently: ${cfg.documents.pythonPath}).`,\n );\n } else {\n const pkgs = missing.join(\", \");\n api.logger.warn(\n `memory-hybrid: documents.enabled but required Python package(s) not installed: ${pkgs}. ` +\n `Run: ${cfg.documents.pythonPath} -m pip install ${missing.join(\" \")} (see extensions/memory-hybrid/scripts/requirements.txt)`,\n );\n }\n }\n }\n\n const sqlCount = factsDb.count();\n const expired = factsDb.countExpired();\n const versionCheckCachePath =\n resolvedSqlitePath === \":memory:\" ? null : join(dirname(resolvedSqlitePath), \".latest-plugin-version.json\");\n const errorReportQueuePath =\n resolvedSqlitePath === \":memory:\"\n ? undefined\n : join(dirname(resolvedSqlitePath), \".error_reports.pending.jsonl\");\n const errorReportingActive = cfg.errorReporting.enabled && cfg.errorReporting.consent;\n let cachedVersionCheck = versionCheckCachePath ? readVersionCheckCache(versionCheckCachePath) : null;\n api.logger.info(\n `memory-hybrid: initialized v${versionInfo.pluginVersion} (sqlite: ${sqlCount} facts, lance: ${resolvedLancePath}, model: ${cfg.embedding.model})`,\n );\n\n checkOpenClawVersion(api.version, api.logger);\n\n try {\n const pluginRootDir = findPluginRoot(import.meta.url);\n const skillOutcome = ensureHybridMemoryWorkspaceSkillIfMissing({\n pluginRootDir,\n mergedOpenclawConfig: loadOpenclawRootForWorkspace(),\n });\n if (skillOutcome.deployed) {\n api.logger.info(`memory-hybrid: deployed bundled Agent Skill to workspace: ${skillOutcome.path}`);\n } else if (skillOutcome.skippedReason) {\n const benign = new Set([\"already_exists\", \"bundled_missing\", \"destination_dir_exists\"]);\n if (!benign.has(skillOutcome.skippedReason)) {\n const msg = `memory-hybrid: workspace skill bootstrap failed (${skillOutcome.skippedReason}) — ${skillOutcome.path}`;\n api.logger.warn(msg);\n capturePluginError(new Error(msg), {\n subsystem: \"plugin-service\",\n operation: \"ensure-workspace-skill\",\n });\n }\n }\n } catch (err) {\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"plugin-service\",\n operation: \"ensure-workspace-skill\",\n });\n }\n\n if (\n errorReportingActive &&\n cachedVersionCheck &&\n isPluginOutdated(versionInfo.pluginVersion, cachedVersionCheck.latestVersion) &&\n isVersionCheckCacheFresh(cachedVersionCheck, cfg.errorReporting.updateNudge.cacheTtlHours)\n ) {\n setErrorReporterMuted(true, `outdated-plugin:${cachedVersionCheck.latestVersion}`);\n const nextCachedVersionCheck = maybeLogOutdatedVersionNudge(\n versionInfo.pluginVersion,\n cachedVersionCheck,\n cfg.errorReporting.updateNudge,\n api.logger,\n );\n if (versionCheckCachePath && nextCachedVersionCheck.lastNudgedAt !== cachedVersionCheck.lastNudgedAt) {\n try {\n writeVersionCheckCache(versionCheckCachePath, nextCachedVersionCheck);\n } catch (err) {\n api.logger.debug?.(\n `memory-hybrid: failed to update nudge cache: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n cachedVersionCheck = nextCachedVersionCheck;\n }\n } else {\n setErrorReporterMuted(false);\n }\n\n // ========================================================================\n // Startup Task Sequencing (to avoid race conditions):\n // 1. Error reporter init (async)\n // 2. Prune expired facts (synchronous)\n // 3. WAL recovery (synchronous)\n // 4. Start periodic timers (async background tasks with delays)\n // ========================================================================\n\n // Initialize error reporter (always present — opt-out via enabled: false or consent: false)\n try {\n await initErrorReporter(\n {\n enabled: cfg.errorReporting.enabled,\n dsn: cfg.errorReporting.dsn,\n mode: cfg.errorReporting.mode ?? \"community\",\n consent: cfg.errorReporting.consent,\n environment: cfg.errorReporting.environment,\n sampleRate: cfg.errorReporting.sampleRate ?? 1.0,\n maxBreadcrumbs: 10,\n botId: cfg.errorReporting.botId,\n botName: cfg.errorReporting.botName,\n resolvedIssues: cfg.errorReporting.resolvedIssues,\n pendingQueuePath: errorReportQueuePath,\n },\n versionInfo.pluginVersion,\n api.logger,\n api.context?.agentId,\n );\n if (isErrorReporterActive()) {\n api.logger.info(\"memory-hybrid: error reporting enabled\");\n }\n } catch (err) {\n api.logger.warn(`memory-hybrid: error reporter initialization failed: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"plugin-service\",\n operation: \"init-error-reporter\",\n });\n }\n\n versionCheckPromise = (async () => {\n if (!errorReportingActive) return;\n try {\n const latestPublished = await fetchLatestPublishedVersion();\n if (!latestPublished.latestVersion || !latestPublished.source) {\n if (\n cachedVersionCheck &&\n isPluginOutdated(versionInfo.pluginVersion, cachedVersionCheck.latestVersion) &&\n isVersionCheckCacheFresh(cachedVersionCheck, cfg.errorReporting.updateNudge.cacheTtlHours)\n ) {\n setErrorReporterMuted(true, `outdated-plugin:${cachedVersionCheck.latestVersion}`);\n }\n return;\n }\n\n let cacheEntry: VersionCheckCacheEntry = {\n latestVersion: latestPublished.latestVersion,\n source: latestPublished.source,\n checkedAt: new Date().toISOString(),\n lastNudgedAt: cachedVersionCheck?.lastNudgedAt,\n };\n\n if (shuttingDown) return;\n\n if (isPluginOutdated(versionInfo.pluginVersion, latestPublished.latestVersion)) {\n setErrorReporterMuted(true, `outdated-plugin:${latestPublished.latestVersion}`);\n cacheEntry = maybeLogOutdatedVersionNudge(\n versionInfo.pluginVersion,\n cacheEntry,\n cfg.errorReporting.updateNudge,\n api.logger,\n );\n } else {\n setErrorReporterMuted(false);\n }\n\n if (shuttingDown) return;\n if (versionCheckCachePath) {\n try {\n writeVersionCheckCache(versionCheckCachePath, cacheEntry);\n } catch (err) {\n api.logger.debug?.(\n `memory-hybrid: failed to write version check cache: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n } catch (err) {\n api.logger.debug?.(\n `memory-hybrid: latest-version check failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n if (\n cachedVersionCheck &&\n isPluginOutdated(versionInfo.pluginVersion, cachedVersionCheck.latestVersion) &&\n isVersionCheckCacheFresh(cachedVersionCheck, cfg.errorReporting.updateNudge.cacheTtlHours)\n ) {\n setErrorReporterMuted(true, `outdated-plugin:${cachedVersionCheck.latestVersion}`);\n }\n }\n })();\n\n if (expired > 0) {\n const expiredIds = factsDb.listExpiredFactIdsPendingPrune();\n const pruned = factsDb.pruneExpired();\n const vectorCleanup = await deleteVectorsForFactIds(vectorDb, expiredIds, {\n operation: \"plugin-startup-prune-expired\",\n logger: api.logger,\n });\n api.logger.info(`memory-hybrid: startup prune removed ${pruned} expired facts`);\n if (vectorCleanup.failed > 0) {\n api.logger.warn(\n `memory-hybrid: startup vector cleanup partial: deleted ${vectorCleanup.deleted}/${vectorCleanup.attempted}, failed ${vectorCleanup.failed}`,\n );\n }\n }\n\n // WAL Recovery: replay uncommitted operations from previous session\n if (wal) {\n const pendingEntries = await wal.getValidEntries();\n if (pendingEntries.length > 0) {\n api.logger.info(`memory-hybrid: WAL recovery starting — found ${pendingEntries.length} pending operation(s)`);\n let recovered = 0;\n let failed = 0;\n\n for (const entry of pendingEntries) {\n try {\n // Skip diagnostic probe entries (e.g., doctor command durability tests).\n if (entry.data.probe) {\n await walRemove(wal, entry.id, api.logger);\n continue;\n }\n // Skip update operations without a targetId (cannot be replayed safely).\n if (entry.operation === \"update\" && !entry.targetId) {\n await walRemove(wal, entry.id, api.logger);\n continue;\n }\n if (entry.operation === \"store\" || entry.operation === \"update\") {\n const { text, category, importance, entity, key, value, source, decayClass, summary, tags } =\n entry.data;\n const walEmbeddingModel =\n typeof entry.data.embeddingModelName === \"string\" && entry.data.embeddingModelName.trim().length > 0\n ? entry.data.embeddingModelName.trim()\n : null;\n\n // Check if already stored (idempotency)\n if (!factsDb.hasDuplicate(text)) {\n // Store to SQLite\n const storeResult = factsDb.storeWithResult({\n text,\n category: (category as MemoryCategory) || \"other\",\n importance: importance ?? 0.5,\n entity: entity || null,\n key: key || null,\n value: value || null,\n source: source || \"wal-recovery\",\n decayClass,\n summary,\n tags,\n });\n if (storeResult.skipped) {\n continue;\n }\n const stored = storeResult.entry;\n await cleanupEvictedVector({\n vectorDb,\n evictedFactId: storeResult.evictedFactId,\n logger: api.logger,\n context: \"wal-recovery\",\n });\n\n // Store to LanceDB with same fact id for classification before clearing WAL.\n if (entry.data.vector) {\n try {\n const effectiveModel = walEmbeddingModel ?? embeddings.modelName;\n await storeCanonicalVectorForFact({\n vectorDb,\n factsDb,\n factId: stored.id,\n text,\n vector: entry.data.vector,\n importance: importance ?? 0.5,\n category: category || \"other\",\n embeddingModel: effectiveModel,\n });\n persistCanonicalFactEmbedding(\n factsDb,\n stored.id,\n effectiveModel,\n entry.data.vector,\n \"wal-recovery-fact-embeddings\",\n \"plugin-service\",\n api.logger.warn?.bind(api.logger),\n );\n } catch (err) {\n api.logger.warn(`memory-hybrid: WAL recovery vector store failed for entry ${entry.id}: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"plugin-service\",\n operation: \"wal-recovery-vector-store\",\n });\n }\n }\n\n recovered++;\n } else if (entry.data.vector) {\n // SQLite fact already exists (crash after SQL write, before vector write).\n // Re-attempt the vector store so the fact is searchable via semantics.\n const sourceForLookup = String(source || \"wal-recovery\").trim() || \"wal-recovery\";\n let existingId =\n (\n factsDb\n .getRawDb()\n .prepare(\n \"SELECT id FROM facts WHERE text = ? AND source = ? AND superseded_at IS NULL ORDER BY created_at DESC LIMIT 1\",\n )\n .get(text, sourceForLookup) as { id: string } | undefined\n )?.id ?? null;\n if (!existingId) existingId = factsDb.getDuplicateIdByNormalizedHash(text);\n if (existingId) {\n try {\n const effectiveModel = walEmbeddingModel ?? embeddings.modelName;\n await vectorDb.store({\n text,\n vector: entry.data.vector,\n importance: importance ?? 0.5,\n category: category || \"other\",\n id: existingId,\n });\n factsDb.setEmbeddingModel(existingId, effectiveModel);\n persistCanonicalFactEmbedding(\n factsDb,\n existingId,\n effectiveModel,\n entry.data.vector,\n \"wal-recovery-existing-fact-embeddings\",\n \"plugin-service\",\n api.logger.warn?.bind(api.logger),\n );\n api.logger.info(\n `memory-hybrid: WAL recovery — re-stored missing vector for already-stored fact ${existingId.slice(0, 8)}`,\n );\n } catch (err) {\n api.logger.warn(\n `memory-hybrid: WAL recovery vector re-store failed for existing fact ${existingId.slice(0, 8)}: ${err}`,\n );\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"plugin-service\",\n operation: \"wal-recovery-existing-vector-store\",\n });\n throw err;\n }\n } else {\n api.logger.warn(\n `memory-hybrid: WAL recovery could not resolve duplicate fact id for entry ${entry.id}; skipping vector re-store`,\n );\n }\n }\n } else {\n // Known but unhandled operation type (e.g., \"delete\")\n api.logger.warn(\n `memory-hybrid: WAL recovery skipping unsupported operation \"${entry.operation}\" (entry ${entry.id})`,\n );\n }\n\n await walRemove(wal, entry.id, api.logger);\n } catch (err) {\n api.logger.warn(`memory-hybrid: WAL recovery failed for entry ${entry.id}: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"plugin-service\",\n operation: \"wal-recovery-entry\",\n });\n failed++;\n }\n }\n\n if (recovered > 0 || failed > 0) {\n api.logger.info(\n `memory-hybrid: WAL recovery completed — recovered ${recovered} operation(s), ${failed} failed`,\n );\n }\n\n // Prune any remaining stale entries\n try {\n const pruned = await wal.pruneStale();\n if (pruned > 0) {\n api.logger.info(`memory-hybrid: WAL pruned ${pruned} stale entries`);\n }\n } catch (err) {\n api.logger.warn(`memory-hybrid: WAL prune failed: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"plugin-service\",\n operation: \"wal-prune-stale\",\n });\n }\n try {\n const compacted = await wal.compactIfOversized(16 * 1024 * 1024);\n if (compacted > 0) {\n api.logger.info(`memory-hybrid: WAL compacted ${compacted} stale entries (oversized file, issue #903)`);\n }\n } catch (err) {\n api.logger.warn(`memory-hybrid: WAL compactIfOversized failed: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"plugin-service\",\n operation: \"wal-compact-oversized\",\n });\n }\n }\n }\n\n // Issue #305: Sync cron job lastRunAtMs from persistent guard files so the cron\n // runner does not immediately re-fire jobs whose state was lost on restart/reboot.\n try {\n syncCronLastRunFromGuards(api.logger);\n } catch (err) {\n api.logger.warn?.(`memory-hybrid: cron guard sync failed (non-fatal): ${err}`);\n }\n\n // Issue #309: Mission Control dashboard HTTP server\n if (cfg.dashboard.enabled) {\n try {\n dashboardServer = await createDashboardServer(\n {\n factsDb,\n vectorDb,\n resolvedSqlitePath,\n resolvedLancePath,\n gitRepo: cfg.dashboard.gitRepo,\n costTracker,\n logger: api.logger,\n auditStore,\n agentHealthStore,\n edictStore,\n verificationStore,\n issueStore,\n workflowStore,\n narrativesDb,\n provenanceService,\n graphHubDegreeCap: cfg.graph.hubDegreeCap,\n graphHubScorePenalty: cfg.graph.hubScorePenalty,\n },\n cfg.dashboard.port,\n );\n api.logger.info(`memory-hybrid: dashboard started on http://127.0.0.1:${dashboardServer.port}`);\n } catch (err) {\n api.logger.warn(`memory-hybrid: dashboard server failed to start (non-fatal): ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"plugin-service\",\n operation: \"dashboard-start\",\n });\n }\n }\n\n // Periodic prune timer\n let pruneTickInFlight = false;\n timers.pruneTimer.value = setInterval(async () => {\n if (pruneTickInFlight) return;\n pruneTickInFlight = true;\n try {\n if (shuttingDown) return;\n if (typeof factsDb.isOpen === \"function\" && !factsDb.isOpen()) return;\n const decayNowSec = Math.floor(Date.now() / 1000);\n const expiredIds = factsDb.listExpiredFactIdsPendingPrune();\n const decayDeleteIds = factsDb.listFactIdsToBeDeletedByDecayRun(decayNowSec);\n const hardPruned = factsDb.pruneExpired();\n const softPruned = factsDb.decayConfidence(decayNowSec);\n const expiredCleanup = await deleteVectorsForFactIds(vectorDb, expiredIds, {\n operation: \"plugin-periodic-prune-expired\",\n logger: api.logger,\n });\n const decayedCleanup = await deleteVectorsForFactIds(vectorDb, decayDeleteIds, {\n operation: \"plugin-periodic-decay\",\n logger: api.logger,\n });\n const edictsPruned = edictStore.pruneExpired();\n let auditPruned = 0;\n if (auditStore) {\n try {\n auditPruned = auditStore.prune(90);\n } catch {\n /* non-fatal */\n }\n }\n let healthPruned = 0;\n if (agentHealthStore) {\n try {\n healthPruned = agentHealthStore.prune(30);\n } catch {\n /* non-fatal */\n }\n }\n if (hardPruned > 0 || softPruned > 0 || edictsPruned > 0 || auditPruned > 0 || healthPruned > 0) {\n api.logger.info(\n `memory-hybrid: periodic prune — ${hardPruned} expired, ${softPruned} decayed, ${edictsPruned} edicts pruned${auditPruned > 0 ? `, ${auditPruned} audit rows` : \"\"}${healthPruned > 0 ? `, ${healthPruned} agent-health rows` : \"\"}`,\n );\n }\n if (expiredCleanup.failed > 0 || decayedCleanup.failed > 0) {\n api.logger.warn(\n `memory-hybrid: periodic vector cleanup partial — expired deleted ${expiredCleanup.deleted}/${expiredCleanup.attempted} (failed ${expiredCleanup.failed}), decayed deleted ${decayedCleanup.deleted}/${decayedCleanup.attempted} (failed ${decayedCleanup.failed})`,\n );\n }\n } catch (err) {\n api.logger.warn(`memory-hybrid: periodic prune failed: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"plugin-service\",\n operation: \"periodic-prune\",\n });\n } finally {\n pruneTickInFlight = false;\n }\n }, 60 * 60_000); // every hour\n\n // Daily auto-classify: reclassify \"other\" facts using LLM (if enabled)\n if (cfg.autoClassify.enabled) {\n const CLASSIFY_INTERVAL = 24 * 60 * 60_000; // 24 hours\n const discoveredPath = join(dirname(resolvedSqlitePath), \".discovered-categories.json\");\n\n const classifyModel = cfg.autoClassify.model ?? getDefaultCronModel(getCronModelConfig(cfg), \"nano\");\n // Run once shortly after startup (5 min delay to let things settle)\n timers.classifyStartupTimeout.value = setTimeout(async () => {\n try {\n await runAutoClassify(factsDb, openai, cfg.autoClassify, api.logger, {\n discoveredCategoriesPath: discoveredPath,\n model: classifyModel,\n });\n } catch (err) {\n api.logger.warn(`memory-hybrid: startup auto-classify failed: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"plugin-service\",\n operation: \"startup-auto-classify\",\n });\n }\n }, 5 * 60_000);\n\n timers.classifyTimer.value = setInterval(async () => {\n try {\n if (shuttingDown) return;\n if (typeof factsDb.isOpen === \"function\" && !factsDb.isOpen()) return;\n await runAutoClassify(factsDb, openai, cfg.autoClassify, api.logger, {\n discoveredCategoriesPath: discoveredPath,\n model: classifyModel,\n });\n } catch (err) {\n api.logger.warn(`memory-hybrid: daily auto-classify failed: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"plugin-service\",\n operation: \"daily-auto-classify\",\n });\n }\n }, CLASSIFY_INTERVAL);\n\n api.logger.info(\n `memory-hybrid: auto-classify enabled (model: ${classifyModel}, interval: 24h, batch: ${cfg.autoClassify.batchSize})`,\n );\n }\n\n // Auto-build multilingual keywords: run once at startup if no file, then weekly (captures language drift)\n if (cfg.languageKeywords.autoBuild) {\n const langFilePath = getLanguageKeywordsFilePath();\n const runBuild = async () => {\n try {\n const facts = factsDb.getFactsForConsolidation(300);\n const result = await runBuildLanguageKeywords(facts, openai, dirname(resolvedSqlitePath), {\n model: cfg.autoClassify.model ?? getDefaultCronModel(getCronModelConfig(cfg), \"default\"),\n dryRun: false,\n });\n if (result.ok && result.languagesAdded > 0) {\n api.logger.info(\n `memory-hybrid: language keywords updated (${result.topLanguages.join(\", \")}, +${result.languagesAdded} languages)`,\n );\n } else if (result.ok) {\n api.logger.info(`memory-hybrid: language keywords build done (${result.topLanguages.join(\", \")})`);\n } else {\n api.logger.warn(`memory-hybrid: language keywords build failed: ${result.error}`);\n }\n } catch (err) {\n api.logger.warn(`memory-hybrid: language keywords build failed: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"plugin-service\",\n operation: \"language-keywords-build\",\n });\n }\n };\n\n if (langFilePath && !existsSync(langFilePath)) {\n api.logger.info(\"memory-hybrid: no language keywords file; building from memory samples in 3s…\");\n timers.languageKeywordsStartupTimeout.value = setTimeout(() => {\n void runBuild();\n timers.languageKeywordsStartupTimeout.value = null;\n }, 3000);\n }\n\n const weeklyMs = cfg.languageKeywords.weeklyIntervalDays * 24 * 60 * 60 * 1000;\n timers.languageKeywordsTimer.value = setInterval(() => void runBuild(), weeklyMs);\n api.logger.info(\n `memory-hybrid: language keywords auto-build enabled (every ${cfg.languageKeywords.weeklyIntervalDays} days)`,\n );\n }\n\n // Passive observer: background fact extraction from session transcripts\n if (cfg.passiveObserver.enabled) {\n const { getLLMModelPreference } = await import(\"../config.js\");\n const observerModel =\n cfg.passiveObserver.model ??\n getLLMModelPreference(getCronModelConfig(cfg), \"nano\")[0] ??\n getDefaultCronModel(getCronModelConfig(cfg), \"nano\");\n const observerFallbacks = (() => {\n const pref = getLLMModelPreference(getCronModelConfig(cfg), \"nano\");\n return pref.length > 1 ? pref.slice(1) : undefined;\n })();\n const dbDir = dirname(resolvedSqlitePath);\n\n const runObserver = async () => {\n try {\n const result = await runPassiveObserver(\n factsDb,\n vectorDb,\n embeddings,\n openai,\n cfg.passiveObserver,\n cfg.categories,\n {\n model: observerModel,\n fallbackModels: observerFallbacks,\n dbDir,\n proceduresSessionsDir: cfg.procedures.sessionsDir,\n reinforcement: cfg.reinforcement,\n provenanceService,\n eventLog,\n },\n api.logger,\n );\n if (result.factsStored > 0 || result.factsExtracted > 0 || result.factsReinforced > 0) {\n api.logger.info(\n `memory-hybrid: passive-observer — scanned ${result.sessionsScanned} sessions, ` +\n `${result.chunksProcessed} chunks, ${result.factsExtracted} extracted, ` +\n `${result.factsStored} stored, ${result.factsReinforced} reinforced`,\n );\n }\n } catch (err) {\n api.logger.warn(`memory-hybrid: passive-observer run failed: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"plugin-service\",\n operation: \"passive-observer-run\",\n });\n }\n };\n\n const intervalMs = cfg.passiveObserver.intervalMinutes * 60_000;\n timers.passiveObserverTimer.value = setInterval(() => {\n if (shuttingDown) return;\n if (typeof factsDb.isOpen === \"function\" && !factsDb.isOpen()) return;\n if (observerRunning) return;\n observerRunning = true;\n observerRunPromise = runObserver().finally(() => {\n observerRunning = false;\n observerRunPromise = null;\n });\n }, intervalMs);\n api.logger.info(\n `memory-hybrid: passive-observer enabled (model: ${observerModel}, interval: ${cfg.passiveObserver.intervalMinutes}m, minImportance: ${cfg.passiveObserver.minImportance})`,\n );\n }\n\n // Task queue watchdog: periodically detect stale/broken autonomous queue runs and self-heal\n const WATCHDOG_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes\n const watchdogRun = async () => {\n try {\n await runTaskQueueWatchdog({ repoDir: getEnv(\"OPENCLAW_WORKSPACE\") ?? process.cwd() }, api.logger);\n } catch (err) {\n api.logger.warn?.(`memory-hybrid: task-queue-watchdog failed (non-fatal): ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"plugin-service\",\n operation: \"task-queue-watchdog\",\n });\n }\n if (cfg.activeTask.enabled) {\n try {\n const workspaceRoot = getEnv(\"OPENCLAW_WORKSPACE\") ?? join(homedir(), \".openclaw\", \"workspace\");\n const activeTaskFilePath = isAbsolute(cfg.activeTask.filePath)\n ? cfg.activeTask.filePath\n : join(workspaceRoot, cfg.activeTask.filePath);\n const staleMinutes = parseDuration(cfg.activeTask.staleThreshold);\n const memoryDir = join(workspaceRoot, \"memory\");\n let reconciledLabels: string[] = [];\n let wrote = false;\n if (cfg.activeTask.ledger === \"facts\") {\n const r = await reconcileActiveTaskInProgressSessionsFacts(factsDb, vectorDb, embeddings, staleMinutes, {\n flushOnComplete: cfg.activeTask.flushOnComplete !== false,\n memoryDir,\n });\n reconciledLabels = r.reconciledLabels;\n wrote = r.wrote;\n // Gate is intentional: live GitHub reconciliation only runs when explicitly enabled in config.\n if (cfg.activeTask.liveStateReconcile.enabled) {\n try {\n const liveResult = await reconcileActiveTaskLiveState(factsDb, vectorDb, embeddings, {\n maxRequests: 20,\n log: api.logger,\n });\n if (liveResult.updatedCount > 0) {\n api.logger.info?.(\n `memory-hybrid: live-state reconcile — marked ${liveResult.updatedCount} task(s) done (checked ${liveResult.checkedCount}, skipped ${liveResult.skippedCount})`,\n );\n await renderActiveTaskMarkdownFile(\n factsDb,\n staleMinutes,\n activeTaskFilePath,\n cfg.activeTask.projection,\n );\n }\n } catch (liveErr) {\n api.logger.warn?.(`memory-hybrid: live-state reconcile failed (non-fatal): ${liveErr}`);\n }\n }\n } else {\n const r = await reconcileActiveTaskInProgressSessions(activeTaskFilePath, staleMinutes, {\n flushOnComplete: cfg.activeTask.flushOnComplete !== false,\n memoryDir,\n });\n reconciledLabels = r.reconciledLabels;\n wrote = r.wrote;\n }\n if (wrote && reconciledLabels.length > 0) {\n api.logger.info?.(\n `memory-hybrid: active-task session reconcile — completed orphan subagent row(s): ${reconciledLabels.join(\", \")}`,\n );\n }\n } catch (reconcileErr) {\n api.logger.warn?.(`memory-hybrid: active-task session reconcile failed (non-fatal): ${reconcileErr}`);\n capturePluginError(reconcileErr instanceof Error ? reconcileErr : new Error(String(reconcileErr)), {\n subsystem: \"plugin-service\",\n operation: \"active-task-session-reconcile\",\n });\n }\n }\n if (cfg.goalStewardship.enabled && cfg.goalStewardship.watchdogHealthCheck) {\n try {\n const workspaceRootGs = getEnv(\"OPENCLAW_WORKSPACE\") ?? join(homedir(), \".openclaw\", \"workspace\");\n const goalsDir = resolveGoalsDir(workspaceRootGs, cfg.goalStewardship.goalsDir);\n const gh = await runGoalHealthCheck({\n goalsDir,\n cfg: cfg.goalStewardship,\n workspaceRoot: workspaceRootGs,\n logger: api.logger,\n eventLog: eventLog ?? null,\n });\n if (gh.goalsChecked > 0) {\n const compact = gh.outcomes\n .map((o) => `${o.label}:${o.outcome}${o.reason ? `(${o.reason.slice(0, 80)})` : \"\"}`)\n .join(\"; \");\n api.logger.info?.(\n `memory-hybrid: goal health check — ${gh.goalsChecked} checked, ${gh.goalsUpdated} updated; outcomes: ${compact || \"none\"}`,\n );\n }\n } catch (ghErr) {\n api.logger.warn?.(`memory-hybrid: goal health check failed (non-fatal): ${ghErr}`);\n capturePluginError(ghErr instanceof Error ? ghErr : new Error(String(ghErr)), {\n subsystem: \"plugin-service\",\n operation: \"goal-health-check\",\n });\n }\n }\n };\n timers.watchdogTimer.value = setInterval(() => {\n if (shuttingDown) return;\n if (typeof factsDb.isOpen === \"function\" && !factsDb.isOpen()) return;\n if (watchdogRunning) return;\n watchdogRunning = true;\n watchdogRunPromise = watchdogRun().finally(() => {\n watchdogRunning = false;\n watchdogRunPromise = null;\n });\n }, WATCHDOG_INTERVAL_MS);\n api.logger.info(\"memory-hybrid: task-queue-watchdog enabled (interval: 5m)\");\n\n // Post-upgrade pipeline: once per version bump, run build-languages, self-correction, reflection, procedures (via CLI)\n const rawVersionFilePath = join(dirname(resolvedSqlitePath), \".last-post-upgrade-version\");\n // Expand literal $HOME or leading ~ if the sqlite path wasn't fully resolved before being stored.\n // Both forms can appear when the plugin config is serialized from user input before normalization.\n const _home = getEnv(\"HOME\") ?? homedir();\n const versionFile = rawVersionFilePath.replace(/\\$HOME/g, _home).replace(/^~(?=\\/|$)/, _home);\n timers.postUpgradeTimeout.value = setTimeout(() => {\n timers.postUpgradeTimeout.value = null;\n let lastVer = \"\";\n try {\n lastVer = readFileSync(versionFile, \"utf-8\").trim();\n } catch (err) {\n // ENOENT is expected on first run — don't report to error monitoring\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== \"ENOENT\") {\n capturePluginError(err as Error, {\n operation: \"read-version-file\",\n severity: \"warning\",\n subsystem: \"plugin-service\",\n });\n }\n /* ignore */\n }\n if (lastVer === versionInfo.pluginVersion) return;\n api.logger.info(\n \"memory-hybrid: post-upgrade pipeline starting (build-languages, self-correction, reflection, procedures)…\",\n );\n void (async () => {\n try {\n const { spawn } = await import(\"node:child_process\");\n\n // Helper to run CLI commands asynchronously (non-blocking)\n const runCli = async (args: string[]): Promise<boolean> => {\n return new Promise((resolve) => {\n const child = spawn(\"openclaw\", [\"hybrid-mem\", ...args], {\n cwd: homedir(),\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n timeout: 120_000,\n });\n\n let stderr = \"\";\n child.stderr?.on(\"data\", (chunk) => {\n stderr += chunk.toString();\n });\n\n child.on(\"close\", (code) => {\n if (code !== 0 && stderr) {\n api.logger.warn?.(`memory-hybrid: post-upgrade ${args[0]} failed: ${stderr.slice(0, 200)}`);\n }\n resolve(code === 0);\n });\n\n child.on(\"error\", (err) => {\n api.logger.warn?.(`memory-hybrid: post-upgrade ${args[0]} error: ${err.message}`);\n resolve(false);\n });\n });\n };\n\n const langPath = getLanguageKeywordsFilePath();\n if (langPath && !existsSync(langPath)) await runCli([\"build-languages\"]);\n await runCli([\"self-correction-run\"]);\n if (cfg.reflection.enabled) {\n await runCli([\"reflect\", \"--window\", String(cfg.reflection.defaultWindow)]);\n await runCli([\"reflect-rules\"]);\n }\n await runCli([\"extract-procedures\"]);\n await runCli([\"generate-auto-skills\"]);\n writeFileSync(versionFile, versionInfo.pluginVersion, \"utf-8\");\n api.logger.info(\"memory-hybrid: post-upgrade pipeline done.\");\n } catch (e) {\n api.logger.warn?.(`memory-hybrid: post-upgrade pipeline error: ${e}`);\n capturePluginError(e instanceof Error ? e : new Error(String(e)), {\n subsystem: \"plugin-service\",\n operation: \"post-upgrade-pipeline\",\n });\n }\n })();\n }, 20000);\n },\n stop: async () => {\n shuttingDown = true;\n // Flush pending error reports with timeout so persisted queue replay can reduce dropped diagnostics.\n if (isErrorReporterActive()) {\n const flushed = await flushErrorReporter(2000).catch(() => false);\n if (!flushed) {\n api.logger.warn(\"memory-hybrid: error reporter flush incomplete; pending reports will retry on next startup\");\n }\n }\n clearRuntimeTimers(timers);\n if (dashboardServer) {\n try {\n dashboardServer.close();\n } catch {\n /* non-fatal */\n }\n dashboardServer = null;\n }\n api.logger.info(\"memory-hybrid: stopping...\");\n if (observerRunPromise) {\n const timeoutMs = 5000;\n const completed = await Promise.race([\n observerRunPromise.then(() => true).catch(() => true),\n new Promise<boolean>((resolve) => setTimeout(() => resolve(false), timeoutMs)),\n ]);\n if (!completed) {\n api.logger.warn(\"memory-hybrid: passive-observer shutdown timed out; closing databases anyway\");\n }\n }\n if (watchdogRunPromise) {\n const timeoutMs = 5000;\n const completed = await Promise.race([\n watchdogRunPromise.then(() => true).catch(() => true),\n new Promise<boolean>((resolve) => setTimeout(() => resolve(false), timeoutMs)),\n ]);\n if (!completed) {\n api.logger.warn(\"memory-hybrid: task-queue-watchdog shutdown timed out; continuing shutdown anyway\");\n }\n }\n if (versionCheckPromise) {\n const timeoutMs = 5000;\n const completed = await Promise.race([\n versionCheckPromise.then(() => true).catch(() => true),\n new Promise<boolean>((resolve) => setTimeout(() => resolve(false), timeoutMs)),\n ]);\n if (!completed) {\n api.logger.warn(\"memory-hybrid: version-check shutdown timed out; continuing shutdown anyway\");\n }\n }\n if (ctx.pythonBridge) {\n await ctx.pythonBridge.shutdown();\n }\n factsDb.close();\n vectorDb.close();\n if (credentialsDb) {\n credentialsDb.close();\n }\n if (proposalsDb) {\n proposalsDb.close();\n }\n if (auditStore) {\n auditStore.close();\n }\n if (agentHealthStore) {\n agentHealthStore.close();\n }\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"plugin-service.js","names":[],"sources":["../../setup/plugin-service.ts"],"sourcesContent":["import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, isAbsolute, join } from \"node:path\";\nimport type OpenAI from \"openai\";\nimport type { ClawdbotPluginApi } from \"openclaw/plugin-sdk/core\";\nimport { clearRuntimeTimers } from \"../api/plugin-runtime.js\";\nimport type { CredentialsDB } from \"../backends/credentials-db.js\";\nimport type { EdictStore } from \"../backends/edict-store.js\";\nimport type { FactsDB } from \"../backends/facts-db.js\";\nimport type { IssueStore } from \"../backends/issue-store.js\";\nimport type { NarrativesDB } from \"../backends/narratives-db.js\";\nimport type { ProposalsDB } from \"../backends/proposals-db.js\";\nimport type { VectorDB } from \"../backends/vector-db.js\";\nimport type { WriteAheadLog } from \"../backends/wal.js\";\nimport type { WorkflowStore } from \"../backends/workflow-store.js\";\nimport { ensureHybridMemoryWorkspaceSkillIfMissing, loadOpenclawRootForWorkspace } from \"../cli/cmd-install.js\";\nimport type { HybridMemoryConfig, MemoryCategory } from \"../config.js\";\nimport { getCronModelConfig, getDefaultCronModel } from \"../config.js\";\nimport type { DashboardServer } from \"../routes/dashboard-server.js\";\nimport { createDashboardServer } from \"../routes/dashboard-server.js\";\nimport { reconcileActiveTaskInProgressSessions } from \"../services/active-task.js\";\nimport { runAutoClassify } from \"../services/auto-classifier.js\";\nimport { syncCronLastRunFromGuards } from \"../services/cron-guard.js\";\nimport type { EmbeddingRegistry } from \"../services/embedding-registry.js\";\nimport {\n capturePluginError,\n flushErrorReporter,\n initErrorReporter,\n isErrorReporterActive,\n setErrorReporterMuted,\n} from \"../services/error-reporter.js\";\nimport { resolveGoalsDir, runGoalHealthCheck } from \"../services/goal-stewardship.js\";\nimport { runBuildLanguageKeywords } from \"../services/language-keywords-build.js\";\nimport { runPassiveObserver } from \"../services/passive-observer.js\";\nimport type { ProvenanceService } from \"../services/provenance.js\";\nimport {\n reconcileActiveTaskInProgressSessionsFacts,\n reconcileActiveTaskLiveState,\n renderActiveTaskMarkdownFile,\n} from \"../services/task-ledger-facts.js\";\nimport { runTaskQueueWatchdog } from \"../services/task-queue-watchdog.js\";\nimport {\n cleanupEvictedVector,\n deleteVectorsForFactIds,\n storeCanonicalVectorForFact,\n} from \"../services/vector-maintenance.js\";\nimport type { VerificationStore } from \"../services/verification-store.js\";\nimport { walRemove } from \"../services/wal-helpers.js\";\nimport { parseDuration } from \"../utils/duration.js\";\nimport { getEnv } from \"../utils/env-manager.js\";\nimport { persistCanonicalFactEmbedding } from \"../utils/fact-embeddings.js\";\nimport { getLanguageKeywordsFilePath } from \"../utils/language-keywords.js\";\nimport { findPluginRoot } from \"../utils/plugin-root.js\";\nimport {\n fetchLatestPublishedVersion,\n isPluginOutdated,\n isVersionCheckCacheFresh,\n maybeLogOutdatedVersionNudge,\n readVersionCheckCache,\n type VersionCheckCacheEntry,\n writeVersionCheckCache,\n} from \"../utils/plugin-update-check.js\";\nimport { checkOpenClawVersion } from \"../utils/version-check.js\";\nimport { versionInfo } from \"../versionInfo.js\";\n\nexport interface PluginServiceContext {\n PLUGIN_ID: string;\n factsDb: FactsDB;\n edictStore: EdictStore;\n vectorDb: VectorDB;\n embeddings: import(\"../services/embeddings.js\").EmbeddingProvider;\n embeddingRegistry: EmbeddingRegistry;\n credentialsDb: CredentialsDB | null;\n proposalsDb: ProposalsDB | null;\n wal: WriteAheadLog | null;\n eventLog?: import(\"../backends/event-log.js\").EventLog | null;\n cfg: HybridMemoryConfig;\n openai: OpenAI;\n resolvedLancePath: string;\n resolvedSqlitePath: string;\n api: ClawdbotPluginApi;\n pythonBridge?: import(\"../services/python-bridge.js\").PythonBridge | null;\n provenanceService?: ProvenanceService | null;\n costTracker?: import(\"../backends/cost-tracker.js\").CostTracker | null;\n auditStore?: import(\"../backends/audit-store.js\").AuditStore | null;\n agentHealthStore?: import(\"../backends/agent-health-store.js\").AgentHealthStore | null;\n // Memory Viewer stores (Issue #1023)\n verificationStore?: VerificationStore | null;\n issueStore?: IssueStore | null;\n workflowStore?: WorkflowStore | null;\n narrativesDb?: NarrativesDB | null;\n // Mutable timer refs that will be updated by the start handler\n timers: {\n pruneTimer: { value: ReturnType<typeof setInterval> | null };\n classifyTimer: { value: ReturnType<typeof setInterval> | null };\n classifyStartupTimeout: { value: ReturnType<typeof setTimeout> | null };\n proposalsPruneTimer: { value: ReturnType<typeof setInterval> | null };\n languageKeywordsTimer: { value: ReturnType<typeof setInterval> | null };\n languageKeywordsStartupTimeout: { value: ReturnType<typeof setTimeout> | null };\n postUpgradeTimeout: { value: ReturnType<typeof setTimeout> | null };\n passiveObserverTimer: { value: ReturnType<typeof setInterval> | null };\n watchdogTimer: { value: ReturnType<typeof setInterval> | null };\n };\n}\n\n/**\n * Creates the plugin service registration object with start/stop handlers.\n * Manages:\n * - Error reporter initialization\n * - WAL recovery on startup\n * - Periodic pruning, classification, language keywords building\n * - Post-upgrade pipeline\n * - Cleanup on shutdown\n */\nexport function createPluginService(ctx: PluginServiceContext) {\n const {\n PLUGIN_ID,\n factsDb,\n edictStore,\n vectorDb,\n embeddings,\n credentialsDb,\n proposalsDb,\n wal,\n eventLog,\n cfg,\n openai,\n resolvedLancePath,\n resolvedSqlitePath,\n api,\n timers,\n provenanceService,\n costTracker,\n auditStore,\n agentHealthStore,\n pythonBridge,\n verificationStore,\n issueStore,\n workflowStore,\n narrativesDb,\n } = ctx;\n\n let observerRunning = false;\n let observerRunPromise: Promise<void> | null = null;\n let watchdogRunning = false;\n let watchdogRunPromise: Promise<void> | null = null;\n let shuttingDown = false;\n let dashboardServer: DashboardServer | null = null;\n let versionCheckPromise: Promise<void> | null = null;\n\n return {\n id: PLUGIN_ID,\n _getVersionCheckPromise: () => versionCheckPromise,\n start: async () => {\n // Issue #422: surface missing Python deps early; deferred from register() for lighter CLI (issue #1111).\n if (pythonBridge) {\n const { ok, missing, spawnError } = pythonBridge.checkDependencies();\n if (!ok) {\n if (spawnError) {\n api.logger.warn(\n `memory-hybrid: documents.enabled but Python binary not found or failed to spawn: ${spawnError.message}. ` +\n `Check documents.pythonPath configuration (currently: ${cfg.documents.pythonPath}).`,\n );\n } else {\n const pkgs = missing.join(\", \");\n api.logger.warn(\n `memory-hybrid: documents.enabled but required Python package(s) not installed: ${pkgs}. ` +\n `Run: ${cfg.documents.pythonPath} -m pip install ${missing.join(\" \")} (see extensions/memory-hybrid/scripts/requirements.txt)`,\n );\n }\n }\n }\n\n const sqlCount = factsDb.count();\n const expired = factsDb.countExpired();\n const versionCheckCachePath =\n resolvedSqlitePath === \":memory:\" ? null : join(dirname(resolvedSqlitePath), \".latest-plugin-version.json\");\n const errorReportQueuePath =\n resolvedSqlitePath === \":memory:\"\n ? undefined\n : join(dirname(resolvedSqlitePath), \".error_reports.pending.jsonl\");\n const errorReportingActive = cfg.errorReporting.enabled && cfg.errorReporting.consent;\n let cachedVersionCheck = versionCheckCachePath ? readVersionCheckCache(versionCheckCachePath) : null;\n api.logger.info(\n `memory-hybrid: initialized v${versionInfo.pluginVersion} (sqlite: ${sqlCount} facts, lance: ${resolvedLancePath}, model: ${cfg.embedding.model})`,\n );\n\n checkOpenClawVersion(api.version, api.logger);\n\n try {\n const pluginRootDir = findPluginRoot(import.meta.url);\n const skillOutcome = ensureHybridMemoryWorkspaceSkillIfMissing({\n pluginRootDir,\n mergedOpenclawConfig: loadOpenclawRootForWorkspace(),\n });\n if (skillOutcome.deployed) {\n api.logger.info(`memory-hybrid: deployed bundled Agent Skill to workspace: ${skillOutcome.path}`);\n } else if (skillOutcome.skippedReason) {\n const benign = new Set([\"already_exists\", \"bundled_missing\", \"destination_dir_exists\"]);\n if (!benign.has(skillOutcome.skippedReason)) {\n const msg = `memory-hybrid: workspace skill bootstrap failed (${skillOutcome.skippedReason}) — ${skillOutcome.path}`;\n api.logger.warn(msg);\n capturePluginError(new Error(msg), {\n subsystem: \"plugin-service\",\n operation: \"ensure-workspace-skill\",\n });\n }\n }\n } catch (err) {\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"plugin-service\",\n operation: \"ensure-workspace-skill\",\n });\n }\n\n if (\n errorReportingActive &&\n cachedVersionCheck &&\n isPluginOutdated(versionInfo.pluginVersion, cachedVersionCheck.latestVersion) &&\n isVersionCheckCacheFresh(cachedVersionCheck, cfg.errorReporting.updateNudge.cacheTtlHours)\n ) {\n setErrorReporterMuted(true, `outdated-plugin:${cachedVersionCheck.latestVersion}`);\n const nextCachedVersionCheck = maybeLogOutdatedVersionNudge(\n versionInfo.pluginVersion,\n cachedVersionCheck,\n cfg.errorReporting.updateNudge,\n api.logger,\n );\n if (versionCheckCachePath && nextCachedVersionCheck.lastNudgedAt !== cachedVersionCheck.lastNudgedAt) {\n try {\n writeVersionCheckCache(versionCheckCachePath, nextCachedVersionCheck);\n } catch (err) {\n api.logger.debug?.(\n `memory-hybrid: failed to update nudge cache: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n cachedVersionCheck = nextCachedVersionCheck;\n }\n } else {\n setErrorReporterMuted(false);\n }\n\n // ========================================================================\n // Startup Task Sequencing (to avoid race conditions):\n // 1. Error reporter init (async)\n // 2. Prune expired facts (synchronous)\n // 3. WAL recovery (synchronous)\n // 4. Start periodic timers (async background tasks with delays)\n // ========================================================================\n\n // Initialize error reporter (always present — opt-out via enabled: false or consent: false)\n try {\n await initErrorReporter(\n {\n enabled: cfg.errorReporting.enabled,\n dsn: cfg.errorReporting.dsn,\n mode: cfg.errorReporting.mode ?? \"community\",\n consent: cfg.errorReporting.consent,\n environment: cfg.errorReporting.environment,\n sampleRate: cfg.errorReporting.sampleRate ?? 1.0,\n maxBreadcrumbs: 10,\n botId: cfg.errorReporting.botId,\n botName: cfg.errorReporting.botName,\n resolvedIssues: cfg.errorReporting.resolvedIssues,\n pendingQueuePath: errorReportQueuePath,\n },\n versionInfo.pluginVersion,\n api.logger,\n api.context?.agentId,\n );\n if (isErrorReporterActive()) {\n api.logger.info(\"memory-hybrid: error reporting enabled\");\n }\n } catch (err) {\n api.logger.warn(`memory-hybrid: error reporter initialization failed: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"plugin-service\",\n operation: \"init-error-reporter\",\n });\n }\n\n versionCheckPromise = (async () => {\n if (!errorReportingActive) return;\n try {\n const latestPublished = await fetchLatestPublishedVersion();\n if (!latestPublished.latestVersion || !latestPublished.source) {\n if (\n cachedVersionCheck &&\n isPluginOutdated(versionInfo.pluginVersion, cachedVersionCheck.latestVersion) &&\n isVersionCheckCacheFresh(cachedVersionCheck, cfg.errorReporting.updateNudge.cacheTtlHours)\n ) {\n setErrorReporterMuted(true, `outdated-plugin:${cachedVersionCheck.latestVersion}`);\n }\n return;\n }\n\n let cacheEntry: VersionCheckCacheEntry = {\n latestVersion: latestPublished.latestVersion,\n source: latestPublished.source,\n checkedAt: new Date().toISOString(),\n lastNudgedAt: cachedVersionCheck?.lastNudgedAt,\n };\n\n if (shuttingDown) return;\n\n if (isPluginOutdated(versionInfo.pluginVersion, latestPublished.latestVersion)) {\n setErrorReporterMuted(true, `outdated-plugin:${latestPublished.latestVersion}`);\n cacheEntry = maybeLogOutdatedVersionNudge(\n versionInfo.pluginVersion,\n cacheEntry,\n cfg.errorReporting.updateNudge,\n api.logger,\n );\n } else {\n setErrorReporterMuted(false);\n }\n\n if (shuttingDown) return;\n if (versionCheckCachePath) {\n try {\n writeVersionCheckCache(versionCheckCachePath, cacheEntry);\n } catch (err) {\n api.logger.debug?.(\n `memory-hybrid: failed to write version check cache: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n } catch (err) {\n api.logger.debug?.(\n `memory-hybrid: latest-version check failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n if (\n cachedVersionCheck &&\n isPluginOutdated(versionInfo.pluginVersion, cachedVersionCheck.latestVersion) &&\n isVersionCheckCacheFresh(cachedVersionCheck, cfg.errorReporting.updateNudge.cacheTtlHours)\n ) {\n setErrorReporterMuted(true, `outdated-plugin:${cachedVersionCheck.latestVersion}`);\n }\n }\n })();\n\n if (expired > 0) {\n const expiredIds = factsDb.listExpiredFactIdsPendingPrune();\n const pruned = factsDb.pruneExpired();\n const vectorCleanup = await deleteVectorsForFactIds(vectorDb, expiredIds, {\n operation: \"plugin-startup-prune-expired\",\n logger: api.logger,\n });\n api.logger.info(`memory-hybrid: startup prune removed ${pruned} expired facts`);\n if (vectorCleanup.failed > 0) {\n api.logger.warn(\n `memory-hybrid: startup vector cleanup partial: deleted ${vectorCleanup.deleted}/${vectorCleanup.attempted}, failed ${vectorCleanup.failed}`,\n );\n }\n }\n\n // WAL Recovery: replay uncommitted operations from previous session\n if (wal) {\n const pendingEntries = await wal.getValidEntries();\n if (pendingEntries.length > 0) {\n api.logger.info(`memory-hybrid: WAL recovery starting — found ${pendingEntries.length} pending operation(s)`);\n let recovered = 0;\n let failed = 0;\n\n for (const entry of pendingEntries) {\n try {\n // Skip diagnostic probe entries (e.g., doctor command durability tests).\n if (entry.data.probe) {\n await walRemove(wal, entry.id, api.logger);\n continue;\n }\n // Skip update operations without a targetId (cannot be replayed safely).\n if (entry.operation === \"update\" && !entry.targetId) {\n await walRemove(wal, entry.id, api.logger);\n continue;\n }\n if (entry.operation === \"store\" || entry.operation === \"update\") {\n const { text, category, importance, entity, key, value, source, decayClass, summary, tags } =\n entry.data;\n const walEmbeddingModel =\n typeof entry.data.embeddingModelName === \"string\" && entry.data.embeddingModelName.trim().length > 0\n ? entry.data.embeddingModelName.trim()\n : null;\n\n // Check if already stored (idempotency)\n if (!factsDb.hasDuplicate(text)) {\n // Store to SQLite\n const storeResult = factsDb.storeWithResult({\n text,\n category: (category as MemoryCategory) || \"other\",\n importance: importance ?? 0.5,\n entity: entity || null,\n key: key || null,\n value: value || null,\n source: source || \"wal-recovery\",\n decayClass,\n summary,\n tags,\n });\n if (storeResult.skipped) {\n continue;\n }\n const stored = storeResult.entry;\n await cleanupEvictedVector({\n vectorDb,\n evictedFactId: storeResult.evictedFactId,\n logger: api.logger,\n context: \"wal-recovery\",\n });\n\n // Store to LanceDB with same fact id for classification before clearing WAL.\n if (entry.data.vector) {\n try {\n const effectiveModel = walEmbeddingModel ?? embeddings.modelName;\n await storeCanonicalVectorForFact({\n vectorDb,\n factsDb,\n factId: stored.id,\n text,\n vector: entry.data.vector,\n importance: importance ?? 0.5,\n category: category || \"other\",\n embeddingModel: effectiveModel,\n });\n persistCanonicalFactEmbedding(\n factsDb,\n stored.id,\n effectiveModel,\n entry.data.vector,\n \"wal-recovery-fact-embeddings\",\n \"plugin-service\",\n api.logger.warn?.bind(api.logger),\n );\n } catch (err) {\n api.logger.warn(`memory-hybrid: WAL recovery vector store failed for entry ${entry.id}: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"plugin-service\",\n operation: \"wal-recovery-vector-store\",\n });\n }\n }\n\n recovered++;\n } else if (entry.data.vector) {\n // SQLite fact already exists (crash after SQL write, before vector write).\n // Re-attempt the vector store so the fact is searchable via semantics.\n const sourceForLookup = String(source || \"wal-recovery\").trim() || \"wal-recovery\";\n let existingId =\n (\n factsDb\n .getRawDb()\n .prepare(\n \"SELECT id FROM facts WHERE text = ? AND source = ? AND superseded_at IS NULL ORDER BY created_at DESC LIMIT 1\",\n )\n .get(text, sourceForLookup) as { id: string } | undefined\n )?.id ?? null;\n if (!existingId) existingId = factsDb.getDuplicateIdByNormalizedHash(text);\n if (existingId) {\n try {\n const effectiveModel = walEmbeddingModel ?? embeddings.modelName;\n await vectorDb.store({\n text,\n vector: entry.data.vector,\n importance: importance ?? 0.5,\n category: category || \"other\",\n id: existingId,\n });\n factsDb.setEmbeddingModel(existingId, effectiveModel);\n persistCanonicalFactEmbedding(\n factsDb,\n existingId,\n effectiveModel,\n entry.data.vector,\n \"wal-recovery-existing-fact-embeddings\",\n \"plugin-service\",\n api.logger.warn?.bind(api.logger),\n );\n api.logger.info(\n `memory-hybrid: WAL recovery — re-stored missing vector for already-stored fact ${existingId.slice(0, 8)}`,\n );\n } catch (err) {\n api.logger.warn(\n `memory-hybrid: WAL recovery vector re-store failed for existing fact ${existingId.slice(0, 8)}: ${err}`,\n );\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"plugin-service\",\n operation: \"wal-recovery-existing-vector-store\",\n });\n throw err;\n }\n } else {\n api.logger.warn(\n `memory-hybrid: WAL recovery could not resolve duplicate fact id for entry ${entry.id}; skipping vector re-store`,\n );\n }\n }\n } else {\n // Known but unhandled operation type (e.g., \"delete\")\n api.logger.warn(\n `memory-hybrid: WAL recovery skipping unsupported operation \"${entry.operation}\" (entry ${entry.id})`,\n );\n }\n\n await walRemove(wal, entry.id, api.logger);\n } catch (err) {\n api.logger.warn(`memory-hybrid: WAL recovery failed for entry ${entry.id}: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"plugin-service\",\n operation: \"wal-recovery-entry\",\n });\n failed++;\n }\n }\n\n if (recovered > 0 || failed > 0) {\n api.logger.info(\n `memory-hybrid: WAL recovery completed — recovered ${recovered} operation(s), ${failed} failed`,\n );\n }\n\n // Prune any remaining stale entries\n try {\n const pruned = await wal.pruneStale();\n if (pruned > 0) {\n api.logger.info(`memory-hybrid: WAL pruned ${pruned} stale entries`);\n }\n } catch (err) {\n api.logger.warn(`memory-hybrid: WAL prune failed: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"plugin-service\",\n operation: \"wal-prune-stale\",\n });\n }\n try {\n const compacted = await wal.compactIfOversized(16 * 1024 * 1024);\n if (compacted > 0) {\n api.logger.info(`memory-hybrid: WAL compacted ${compacted} stale entries (oversized file, issue #903)`);\n }\n } catch (err) {\n api.logger.warn(`memory-hybrid: WAL compactIfOversized failed: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"plugin-service\",\n operation: \"wal-compact-oversized\",\n });\n }\n }\n }\n\n // Issue #305: Sync cron job lastRunAtMs from persistent guard files so the cron\n // runner does not immediately re-fire jobs whose state was lost on restart/reboot.\n try {\n syncCronLastRunFromGuards(api.logger);\n } catch (err) {\n api.logger.warn?.(`memory-hybrid: cron guard sync failed (non-fatal): ${err}`);\n }\n\n // Issue #309: Mission Control dashboard HTTP server\n if (cfg.dashboard.enabled) {\n try {\n dashboardServer = await createDashboardServer(\n {\n factsDb,\n vectorDb,\n resolvedSqlitePath,\n resolvedLancePath,\n gitRepo: cfg.dashboard.gitRepo,\n costTracker,\n logger: api.logger,\n auditStore,\n agentHealthStore,\n edictStore,\n verificationStore,\n issueStore,\n workflowStore,\n narrativesDb,\n provenanceService,\n graphHubDegreeCap: cfg.graph.hubDegreeCap,\n graphHubScorePenalty: cfg.graph.hubScorePenalty,\n },\n cfg.dashboard.port,\n );\n api.logger.info(`memory-hybrid: dashboard started on http://127.0.0.1:${dashboardServer.port}`);\n } catch (err) {\n api.logger.warn(`memory-hybrid: dashboard server failed to start (non-fatal): ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"plugin-service\",\n operation: \"dashboard-start\",\n });\n }\n }\n\n // Periodic prune timer\n let pruneTickInFlight = false;\n timers.pruneTimer.value = setInterval(async () => {\n if (pruneTickInFlight) return;\n pruneTickInFlight = true;\n try {\n if (shuttingDown) return;\n if (typeof factsDb.isOpen === \"function\" && !factsDb.isOpen()) return;\n const decayNowSec = Math.floor(Date.now() / 1000);\n const expiredIds = factsDb.listExpiredFactIdsPendingPrune();\n const decayDeleteIds = factsDb.listFactIdsToBeDeletedByDecayRun(decayNowSec);\n const hardPruned = factsDb.pruneExpired();\n const softPruned = factsDb.decayConfidence(decayNowSec);\n const expiredCleanup = await deleteVectorsForFactIds(vectorDb, expiredIds, {\n operation: \"plugin-periodic-prune-expired\",\n logger: api.logger,\n });\n const decayedCleanup = await deleteVectorsForFactIds(vectorDb, decayDeleteIds, {\n operation: \"plugin-periodic-decay\",\n logger: api.logger,\n });\n const edictsPruned = edictStore.pruneExpired();\n let auditPruned = 0;\n if (auditStore) {\n try {\n auditPruned = auditStore.prune(90);\n } catch {\n /* non-fatal */\n }\n }\n let healthPruned = 0;\n if (agentHealthStore) {\n try {\n healthPruned = agentHealthStore.prune(30);\n } catch {\n /* non-fatal */\n }\n }\n if (hardPruned > 0 || softPruned > 0 || edictsPruned > 0 || auditPruned > 0 || healthPruned > 0) {\n api.logger.info(\n `memory-hybrid: periodic prune — ${hardPruned} expired, ${softPruned} decayed, ${edictsPruned} edicts pruned${auditPruned > 0 ? `, ${auditPruned} audit rows` : \"\"}${healthPruned > 0 ? `, ${healthPruned} agent-health rows` : \"\"}`,\n );\n }\n if (expiredCleanup.failed > 0 || decayedCleanup.failed > 0) {\n api.logger.warn(\n `memory-hybrid: periodic vector cleanup partial — expired deleted ${expiredCleanup.deleted}/${expiredCleanup.attempted} (failed ${expiredCleanup.failed}), decayed deleted ${decayedCleanup.deleted}/${decayedCleanup.attempted} (failed ${decayedCleanup.failed})`,\n );\n }\n } catch (err) {\n api.logger.warn(`memory-hybrid: periodic prune failed: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"plugin-service\",\n operation: \"periodic-prune\",\n });\n } finally {\n pruneTickInFlight = false;\n }\n }, 60 * 60_000); // every hour\n\n // Daily auto-classify: reclassify \"other\" facts using LLM (if enabled)\n if (cfg.autoClassify.enabled) {\n const CLASSIFY_INTERVAL = 24 * 60 * 60_000; // 24 hours\n const discoveredPath = join(dirname(resolvedSqlitePath), \".discovered-categories.json\");\n\n const classifyModel = cfg.autoClassify.model ?? getDefaultCronModel(getCronModelConfig(cfg), \"nano\");\n // Run once shortly after startup (5 min delay to let things settle)\n timers.classifyStartupTimeout.value = setTimeout(async () => {\n try {\n await runAutoClassify(factsDb, openai, cfg.autoClassify, api.logger, {\n discoveredCategoriesPath: discoveredPath,\n model: classifyModel,\n });\n } catch (err) {\n api.logger.warn(`memory-hybrid: startup auto-classify failed: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"plugin-service\",\n operation: \"startup-auto-classify\",\n });\n }\n }, 5 * 60_000);\n\n timers.classifyTimer.value = setInterval(async () => {\n try {\n if (shuttingDown) return;\n if (typeof factsDb.isOpen === \"function\" && !factsDb.isOpen()) return;\n await runAutoClassify(factsDb, openai, cfg.autoClassify, api.logger, {\n discoveredCategoriesPath: discoveredPath,\n model: classifyModel,\n });\n } catch (err) {\n api.logger.warn(`memory-hybrid: daily auto-classify failed: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"plugin-service\",\n operation: \"daily-auto-classify\",\n });\n }\n }, CLASSIFY_INTERVAL);\n\n api.logger.info(\n `memory-hybrid: auto-classify enabled (model: ${classifyModel}, interval: 24h, batch: ${cfg.autoClassify.batchSize})`,\n );\n }\n\n // Auto-build multilingual keywords: run once at startup if no file, then weekly (captures language drift)\n if (cfg.languageKeywords.autoBuild) {\n const langFilePath = getLanguageKeywordsFilePath();\n const runBuild = async () => {\n try {\n const facts = factsDb.getFactsForConsolidation(300);\n const result = await runBuildLanguageKeywords(facts, openai, dirname(resolvedSqlitePath), {\n model: cfg.autoClassify.model ?? getDefaultCronModel(getCronModelConfig(cfg), \"default\"),\n dryRun: false,\n });\n if (result.ok && result.languagesAdded > 0) {\n api.logger.info(\n `memory-hybrid: language keywords updated (${result.topLanguages.join(\", \")}, +${result.languagesAdded} languages)`,\n );\n } else if (result.ok) {\n api.logger.info(`memory-hybrid: language keywords build done (${result.topLanguages.join(\", \")})`);\n } else {\n api.logger.warn(`memory-hybrid: language keywords build failed: ${result.error}`);\n }\n } catch (err) {\n api.logger.warn(`memory-hybrid: language keywords build failed: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"plugin-service\",\n operation: \"language-keywords-build\",\n });\n }\n };\n\n if (langFilePath && !existsSync(langFilePath)) {\n api.logger.info(\"memory-hybrid: no language keywords file; building from memory samples in 3s…\");\n timers.languageKeywordsStartupTimeout.value = setTimeout(() => {\n void runBuild();\n timers.languageKeywordsStartupTimeout.value = null;\n }, 3000);\n }\n\n const weeklyMs = cfg.languageKeywords.weeklyIntervalDays * 24 * 60 * 60 * 1000;\n timers.languageKeywordsTimer.value = setInterval(() => void runBuild(), weeklyMs);\n api.logger.info(\n `memory-hybrid: language keywords auto-build enabled (every ${cfg.languageKeywords.weeklyIntervalDays} days)`,\n );\n }\n\n // Passive observer: background fact extraction from session transcripts\n if (cfg.passiveObserver.enabled) {\n const { getLLMModelPreference } = await import(\"../config.js\");\n const observerModel =\n cfg.passiveObserver.model ??\n getLLMModelPreference(getCronModelConfig(cfg), \"nano\")[0] ??\n getDefaultCronModel(getCronModelConfig(cfg), \"nano\");\n const observerFallbacks = (() => {\n const pref = getLLMModelPreference(getCronModelConfig(cfg), \"nano\");\n return pref.length > 1 ? pref.slice(1) : undefined;\n })();\n const dbDir = dirname(resolvedSqlitePath);\n\n const runObserver = async () => {\n try {\n const result = await runPassiveObserver(\n factsDb,\n vectorDb,\n embeddings,\n openai,\n cfg.passiveObserver,\n cfg.categories,\n {\n model: observerModel,\n fallbackModels: observerFallbacks,\n dbDir,\n proceduresSessionsDir: cfg.procedures.sessionsDir,\n reinforcement: cfg.reinforcement,\n provenanceService,\n eventLog,\n },\n api.logger,\n );\n if (result.factsStored > 0 || result.factsExtracted > 0 || result.factsReinforced > 0) {\n api.logger.info(\n `memory-hybrid: passive-observer — scanned ${result.sessionsScanned} sessions, ` +\n `${result.chunksProcessed} chunks, ${result.factsExtracted} extracted, ` +\n `${result.factsStored} stored, ${result.factsReinforced} reinforced`,\n );\n }\n } catch (err) {\n api.logger.warn(`memory-hybrid: passive-observer run failed: ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"plugin-service\",\n operation: \"passive-observer-run\",\n });\n }\n };\n\n const intervalMs = cfg.passiveObserver.intervalMinutes * 60_000;\n timers.passiveObserverTimer.value = setInterval(() => {\n if (shuttingDown) return;\n if (typeof factsDb.isOpen === \"function\" && !factsDb.isOpen()) return;\n if (observerRunning) return;\n observerRunning = true;\n observerRunPromise = runObserver().finally(() => {\n observerRunning = false;\n observerRunPromise = null;\n });\n }, intervalMs);\n api.logger.info(\n `memory-hybrid: passive-observer enabled (model: ${observerModel}, interval: ${cfg.passiveObserver.intervalMinutes}m, minImportance: ${cfg.passiveObserver.minImportance})`,\n );\n }\n\n // Task queue watchdog: periodically detect stale/broken autonomous queue runs and self-heal\n const WATCHDOG_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes\n const watchdogRun = async () => {\n try {\n await runTaskQueueWatchdog({ repoDir: getEnv(\"OPENCLAW_WORKSPACE\") ?? process.cwd() }, api.logger);\n } catch (err) {\n api.logger.warn?.(`memory-hybrid: task-queue-watchdog failed (non-fatal): ${err}`);\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"plugin-service\",\n operation: \"task-queue-watchdog\",\n });\n }\n if (cfg.activeTask.enabled) {\n try {\n const workspaceRoot = getEnv(\"OPENCLAW_WORKSPACE\") ?? join(homedir(), \".openclaw\", \"workspace\");\n const activeTaskFilePath = isAbsolute(cfg.activeTask.filePath)\n ? cfg.activeTask.filePath\n : join(workspaceRoot, cfg.activeTask.filePath);\n const staleMinutes = parseDuration(cfg.activeTask.staleThreshold);\n const memoryDir = join(workspaceRoot, \"memory\");\n let reconciledLabels: string[] = [];\n let wrote = false;\n if (cfg.activeTask.ledger === \"facts\") {\n const r = await reconcileActiveTaskInProgressSessionsFacts(factsDb, vectorDb, embeddings, staleMinutes, {\n flushOnComplete: cfg.activeTask.flushOnComplete !== false,\n memoryDir,\n });\n reconciledLabels = r.reconciledLabels;\n wrote = r.wrote;\n // Gate is intentional: live GitHub reconciliation only runs when explicitly enabled in config.\n if (cfg.activeTask.liveStateReconcile.enabled) {\n try {\n const liveResult = await reconcileActiveTaskLiveState(factsDb, vectorDb, embeddings, {\n maxRequests: 20,\n log: api.logger,\n });\n if (liveResult.updatedCount > 0) {\n api.logger.info?.(\n `memory-hybrid: live-state reconcile — marked ${liveResult.updatedCount} task(s) done (checked ${liveResult.checkedCount}, skipped ${liveResult.skippedCount})`,\n );\n await renderActiveTaskMarkdownFile(\n factsDb,\n staleMinutes,\n activeTaskFilePath,\n cfg.activeTask.projection,\n );\n }\n } catch (liveErr) {\n api.logger.warn?.(`memory-hybrid: live-state reconcile failed (non-fatal): ${liveErr}`);\n }\n }\n } else {\n const r = await reconcileActiveTaskInProgressSessions(activeTaskFilePath, staleMinutes, {\n flushOnComplete: cfg.activeTask.flushOnComplete !== false,\n memoryDir,\n });\n reconciledLabels = r.reconciledLabels;\n wrote = r.wrote;\n }\n if (wrote && reconciledLabels.length > 0) {\n api.logger.info?.(\n `memory-hybrid: active-task session reconcile — completed orphan subagent row(s): ${reconciledLabels.join(\", \")}`,\n );\n }\n } catch (reconcileErr) {\n api.logger.warn?.(`memory-hybrid: active-task session reconcile failed (non-fatal): ${reconcileErr}`);\n capturePluginError(reconcileErr instanceof Error ? reconcileErr : new Error(String(reconcileErr)), {\n subsystem: \"plugin-service\",\n operation: \"active-task-session-reconcile\",\n });\n }\n }\n if (cfg.goalStewardship.enabled && cfg.goalStewardship.watchdogHealthCheck) {\n try {\n const workspaceRootGs = getEnv(\"OPENCLAW_WORKSPACE\") ?? join(homedir(), \".openclaw\", \"workspace\");\n const goalsDir = resolveGoalsDir(workspaceRootGs, cfg.goalStewardship.goalsDir);\n const gh = await runGoalHealthCheck({\n goalsDir,\n cfg: cfg.goalStewardship,\n workspaceRoot: workspaceRootGs,\n logger: api.logger,\n eventLog: eventLog ?? null,\n });\n if (gh.goalsChecked > 0) {\n const compact = gh.outcomes\n .map((o) => `${o.label}:${o.outcome}${o.reason ? `(${o.reason.slice(0, 80)})` : \"\"}`)\n .join(\"; \");\n api.logger.info?.(\n `memory-hybrid: goal health check — ${gh.goalsChecked} checked, ${gh.goalsUpdated} updated; outcomes: ${compact || \"none\"}`,\n );\n }\n } catch (ghErr) {\n api.logger.warn?.(`memory-hybrid: goal health check failed (non-fatal): ${ghErr}`);\n capturePluginError(ghErr instanceof Error ? ghErr : new Error(String(ghErr)), {\n subsystem: \"plugin-service\",\n operation: \"goal-health-check\",\n });\n }\n }\n };\n timers.watchdogTimer.value = setInterval(() => {\n if (shuttingDown) return;\n if (typeof factsDb.isOpen === \"function\" && !factsDb.isOpen()) return;\n if (watchdogRunning) return;\n watchdogRunning = true;\n watchdogRunPromise = watchdogRun().finally(() => {\n watchdogRunning = false;\n watchdogRunPromise = null;\n });\n }, WATCHDOG_INTERVAL_MS);\n api.logger.info(\"memory-hybrid: task-queue-watchdog enabled (interval: 5m)\");\n\n // Post-upgrade pipeline: once per version bump, run build-languages, self-correction, reflection, procedures (via CLI)\n const rawVersionFilePath = join(dirname(resolvedSqlitePath), \".last-post-upgrade-version\");\n // Expand literal $HOME or leading ~ if the sqlite path wasn't fully resolved before being stored.\n // Both forms can appear when the plugin config is serialized from user input before normalization.\n const _home = getEnv(\"HOME\") ?? homedir();\n const versionFile = rawVersionFilePath.replace(/\\$HOME/g, _home).replace(/^~(?=\\/|$)/, _home);\n timers.postUpgradeTimeout.value = setTimeout(() => {\n timers.postUpgradeTimeout.value = null;\n let lastVer = \"\";\n try {\n lastVer = readFileSync(versionFile, \"utf-8\").trim();\n } catch (err) {\n // ENOENT is expected on first run — don't report to error monitoring\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== \"ENOENT\") {\n capturePluginError(err as Error, {\n operation: \"read-version-file\",\n severity: \"warning\",\n subsystem: \"plugin-service\",\n });\n }\n /* ignore */\n }\n if (lastVer === versionInfo.pluginVersion) return;\n api.logger.info(\n \"memory-hybrid: post-upgrade pipeline starting (build-languages, self-correction, reflection, procedures)…\",\n );\n void (async () => {\n try {\n const { spawn } = await import(\"node:child_process\");\n\n // Helper to run CLI commands asynchronously (non-blocking)\n const runCli = async (args: string[]): Promise<boolean> => {\n return new Promise((resolve) => {\n const child = spawn(\"openclaw\", [\"hybrid-mem\", ...args], {\n cwd: homedir(),\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n timeout: 120_000,\n });\n\n let stderr = \"\";\n child.stderr?.on(\"data\", (chunk) => {\n stderr += chunk.toString();\n });\n\n child.on(\"close\", (code) => {\n if (code !== 0 && stderr) {\n api.logger.warn?.(`memory-hybrid: post-upgrade ${args[0]} failed: ${stderr.slice(0, 200)}`);\n }\n resolve(code === 0);\n });\n\n child.on(\"error\", (err) => {\n api.logger.warn?.(`memory-hybrid: post-upgrade ${args[0]} error: ${err.message}`);\n resolve(false);\n });\n });\n };\n\n const langPath = getLanguageKeywordsFilePath();\n if (langPath && !existsSync(langPath)) await runCli([\"build-languages\"]);\n await runCli([\"self-correction-run\"]);\n if (cfg.reflection.enabled) {\n await runCli([\"reflect\", \"--window\", String(cfg.reflection.defaultWindow)]);\n await runCli([\"reflect-rules\"]);\n }\n await runCli([\"extract-procedures\"]);\n await runCli([\"generate-auto-skills\"]);\n writeFileSync(versionFile, versionInfo.pluginVersion, \"utf-8\");\n api.logger.info(\"memory-hybrid: post-upgrade pipeline done.\");\n } catch (e) {\n api.logger.warn?.(`memory-hybrid: post-upgrade pipeline error: ${e}`);\n capturePluginError(e instanceof Error ? e : new Error(String(e)), {\n subsystem: \"plugin-service\",\n operation: \"post-upgrade-pipeline\",\n });\n }\n })();\n }, 20000);\n },\n stop: async () => {\n shuttingDown = true;\n // Flush pending error reports with timeout so persisted queue replay can reduce dropped diagnostics.\n if (isErrorReporterActive()) {\n const flushed = await flushErrorReporter(2000).catch(() => false);\n if (!flushed) {\n api.logger.warn(\"memory-hybrid: error reporter flush incomplete; pending reports will retry on next startup\");\n }\n }\n clearRuntimeTimers(timers);\n if (dashboardServer) {\n try {\n dashboardServer.close();\n } catch {\n /* non-fatal */\n }\n dashboardServer = null;\n }\n api.logger.info(\"memory-hybrid: stopping...\");\n if (observerRunPromise) {\n const timeoutMs = 5000;\n const completed = await Promise.race([\n observerRunPromise.then(() => true).catch(() => true),\n new Promise<boolean>((resolve) => setTimeout(() => resolve(false), timeoutMs)),\n ]);\n if (!completed) {\n api.logger.warn(\"memory-hybrid: passive-observer shutdown timed out; closing databases anyway\");\n }\n }\n if (watchdogRunPromise) {\n const timeoutMs = 5000;\n const completed = await Promise.race([\n watchdogRunPromise.then(() => true).catch(() => true),\n new Promise<boolean>((resolve) => setTimeout(() => resolve(false), timeoutMs)),\n ]);\n if (!completed) {\n api.logger.warn(\"memory-hybrid: task-queue-watchdog shutdown timed out; continuing shutdown anyway\");\n }\n }\n if (versionCheckPromise) {\n const timeoutMs = 5000;\n const completed = await Promise.race([\n versionCheckPromise.then(() => true).catch(() => true),\n new Promise<boolean>((resolve) => setTimeout(() => resolve(false), timeoutMs)),\n ]);\n if (!completed) {\n api.logger.warn(\"memory-hybrid: version-check shutdown timed out; continuing shutdown anyway\");\n }\n }\n if (ctx.pythonBridge) {\n await ctx.pythonBridge.shutdown();\n }\n factsDb.close();\n vectorDb.close();\n if (credentialsDb) {\n credentialsDb.close();\n }\n if (proposalsDb) {\n proposalsDb.close();\n }\n if (auditStore) {\n auditStore.close();\n }\n if (agentHealthStore) {\n agentHealthStore.close();\n }\n },\n };\n}\n"],"mappings":"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"}