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":"register-storage-maintenance.js","names":[],"sources":["../../../../cli/commands/manage/register-storage-maintenance.ts"],"sourcesContent":["/**\n * CLI registration functions for management commands.\n * Extracted from cli/register.ts lines 290-1552.\n */\n\nimport { existsSync, unlinkSync } from \"node:fs\";\nimport { migrateEmbeddings } from \"../../../services/embedding-migration.js\";\nimport { capturePluginError } from \"../../../services/error-reporter.js\";\nimport { AllEmbeddingProvidersFailed } from \"../../../services/embeddings.js\";\nimport { recordMaintenanceTimestamp } from \"../../../services/maintenance-timestamp.js\";\nimport { countPendingReviewBacklogs } from \"../../../services/pending-review-digest.js\";\nimport { deleteVectorsForFactIds } from \"../../../services/vector-maintenance.js\";\nimport {\n type VectorBackendObservability,\n collectVectorBackendObservability,\n} from \"../../../services/vector-backend-observability.js\";\nimport { appendVectorLifecycleAuditEvent } from \"../../../services/vector-lifecycle-audit.js\";\nimport { is500OrWrapped } from \"../../../services/chat.js\";\nimport { getEnv } from \"../../../utils/env-manager.js\";\nimport { embedCallWithTimeoutAndRetry } from \"../../../utils/embed-call.js\";\nimport { type CommanderOptsParent, readHybridMemVerbose } from \"../../global-verbose.js\";\nimport { type Chainable, approxIntervalMs, withExit } from \"../../shared.js\";\nimport type { ManageBindings } from \"./bindings.js\";\nimport type { MemoryEntry } from \"../../../types/memory.js\";\nimport { isPreStoreGuardBlocked } from \"../../../backends/facts-db/crud.js\";\nimport {\n countImplicitFeedbackTrajectorySignals,\n defaultReindexCheckpointPath,\n parseBoundedFloatOption,\n parseBoundedIntOption,\n readReindexCheckpoint,\n recordStorageGrowthSample,\n writeReindexCheckpoint,\n} from \"./storage-stats-helpers.js\";\nimport { runMaintenanceHeartbeat } from \"./maintenance-heartbeat.js\";\n\ntype FactsDbWithBatch = {\n getBatch: (\n offset: number,\n limit: number,\n opts: { includeSuperseded: boolean },\n ) => Array<{ id: string; text: string; category?: string; source?: string }>;\n getAll?: (opts: { includeSuperseded: boolean }) => Array<{ id: string }>;\n};\n\ntype FactsDbWithRawDb = {\n getRawDb: () => {\n prepare: (sql: string) => { get: (id: string) => unknown };\n };\n};\n\nfunction printVectorBackendObservabilitySummary(observability: VectorBackendObservability): void {\n console.log(`Captured: ${observability.capturedAt}`);\n if (observability.vectorDb.path) console.log(`Vector path: ${observability.vectorDb.path}`);\n console.log(\n `VectorDB: initialized=${String(observability.vectorDb.initialized)} lanceAvailable=${String(observability.vectorDb.lanceAvailable)} openReaders=${observability.vectorDb.openReaders ?? \"n/a\"} optimizing=${String(observability.vectorDb.optimizing)}`,\n );\n if (observability.vectorDb.degraded?.active) {\n console.log(\n `Degraded mode: active reason=${observability.vectorDb.degraded.reason ?? \"unknown\"} since=${observability.vectorDb.degraded.sinceEpochMs ?? \"n/a\"}`,\n );\n }\n if (observability.vectorDb.search) {\n console.log(\n `Search: active=${observability.vectorDb.search.active} peak=${observability.vectorDb.search.peak} total=${observability.vectorDb.search.total} lastResults=${observability.vectorDb.search.lastResultCount}`,\n );\n }\n if (observability.vectorDb.cache) {\n console.log(\n `Cache: rows=${observability.vectorDb.cache.rows ?? \"n/a\"} lastFilterKey=${observability.vectorDb.cache.lastFilterKey ?? \"n/a\"} lastRemoved=${observability.vectorDb.cache.lastRemovedRows}`,\n );\n }\n if (observability.vectorDb.lastOptimize) {\n console.log(\n `Last optimize: compacted=${observability.vectorDb.lastOptimize.compacted} removed=${observability.vectorDb.lastOptimize.removedFragments} freedBytes=${observability.vectorDb.lastOptimize.freedBytes}`,\n );\n }\n if (observability.lancedb.basePath) {\n console.log(\n `LanceDB: basePath=${observability.lancedb.basePath} totalSizeBytes=${observability.lancedb.totalSizeBytes ?? \"n/a\"}`,\n );\n for (const table of observability.lancedb.tables) {\n console.log(\n ` table=${table.name} exists=${table.exists} rows=${table.rowCount ?? \"n/a\"} sizeBytes=${table.sizeBytes ?? \"n/a\"}`,\n );\n }\n }\n}\n\nfunction hasGetBatch(db: object): db is object & FactsDbWithBatch {\n return \"getBatch\" in db && typeof (db as { getBatch?: unknown }).getBatch === \"function\";\n}\n\nfunction hasGetRawDb(db: object): db is object & FactsDbWithRawDb {\n return \"getRawDb\" in db && typeof (db as { getRawDb?: unknown }).getRawDb === \"function\";\n}\n\nfunction isEmbeddingProviderServerError(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n if (is500OrWrapped(err)) return true;\n if (err instanceof AllEmbeddingProvidersFailed) {\n return err.causes.some((cause) => is500OrWrapped(cause));\n }\n return false;\n}\n\nexport function registerManageStorageMaintenance(mem: Chainable, b: ManageBindings): void {\n const {\n factsDb,\n vectorDb,\n aliasDb,\n versionInfo,\n embeddings,\n mergeResults: merge,\n getMemoryCategories,\n cfg,\n runCompaction,\n tieringEnabled,\n ctx,\n listCommands,\n auditStore,\n runExport,\n } = b;\n\n const tierCompactCmd = mem\n .command(\"tier-compact\")\n .description(\n \"Tier compaction: move facts between hot/warm/cold/structural (does NOT shrink LanceDB — see vectordb-optimize)\",\n )\n .option(\"--dry-run\", \"Preview tier changes without mutating facts\");\n // Keep the legacy `compact` name working as a deprecated alias so existing\n // cron jobs and operator muscle memory don't break (#1249).\n tierCompactCmd.alias?.(\"compact\");\n tierCompactCmd.action(\n withExit(async (opts?: { dryRun?: boolean }) => {\n let counts;\n try {\n counts = await runCompaction({ apply: opts?.dryRun !== true });\n } catch (err) {\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"cli\",\n operation: \"compact\",\n });\n throw err;\n }\n // Record timestamp after successful compaction (not for dry-run)\n if (opts?.dryRun !== true && ctx.resolvedSqlitePath) {\n recordMaintenanceTimestamp(ctx.resolvedSqlitePath, \".compact_last_run\");\n }\n const mode = opts?.dryRun ? \"dry-run\" : \"apply\";\n const changed = counts.changed == null ? \"\" : ` changed=${counts.changed}/${counts.examined ?? \"?\"}`;\n console.log(\n `Tier compaction (${mode}): hot=${counts.hot} warm=${counts.warm} cold=${counts.cold} structural=${counts.structural}${changed}`,\n );\n }),\n );\n\n mem\n .command(\"retier\")\n .description(\"Preview or apply memory tier migration using current tiering rules\")\n .option(\"--apply\", \"Apply mutations. Omit for dry-run\")\n .action(\n withExit(async (opts?: { apply?: boolean }) => {\n const report = await runCompaction({ apply: opts?.apply === true });\n const mode = opts?.apply ? \"apply\" : \"dry-run\";\n console.log(\n `Retier (${mode}): examined=${report.examined ?? \"?\"} changed=${report.changed ?? \"?\"} hot=${report.hot} warm=${report.warm} cold=${report.cold} structural=${report.structural}`,\n );\n if (!opts?.apply) console.log(\"Dry-run only. Re-run with --apply to mutate fact tiers.\");\n }),\n );\n\n mem\n .command(\"vectordb-optimize\")\n .description(\n \"Compact LanceDB fragments and prune old versions (stats.freedBytes may be 0 while layout still improves). \" +\n \"Disk size in `stats` is the whole Lance directory — remove stray `memories_reindex_*` / `memories_old_*` folders after a failed re-index swap if present.\",\n )\n .option(\"--older-than-days <days>\", \"Remove versions older than this many days (default: 7)\", \"7\")\n .action(\n withExit(async (opts?: { olderThanDays?: string }) => {\n const parsedDays = Number.parseInt(opts?.olderThanDays ?? \"7\", 10);\n if (!Number.isFinite(parsedDays) || parsedDays < 0) {\n console.error(\"error: --older-than-days must be a finite number ≥ 0\");\n process.exitCode = 1;\n return;\n }\n const olderThanMs = parsedDays * 24 * 60 * 60 * 1000;\n try {\n const stats = await vectorDb.optimize(olderThanMs);\n // Record timestamp after successful optimization\n if (ctx.resolvedSqlitePath) {\n recordMaintenanceTimestamp(ctx.resolvedSqlitePath, \".vectordb_optimize_last_run\");\n }\n console.log(\n `LanceDB: compacted ${stats.compacted} fragments, pruned ${stats.removedFragments} fragment(s), freed ${stats.freedBytes} bytes`,\n );\n } catch (err) {\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"cli\",\n operation: \"vectordb-optimize\",\n });\n throw err;\n }\n }),\n );\n\n mem\n .command(\"vectordb-health\")\n .description(\n \"Low-cost LanceDB/Arrow/native memory health snapshot (RSS/native estimate, FD groups, cache/search bounds, table rows/sizes)\",\n )\n .option(\"--json\", \"Emit JSON\")\n .action(\n withExit(async (opts?: { json?: boolean }) => {\n let lanceBytes: number | null = null;\n try {\n const sizes = await Promise.resolve(ctx.richStatsExtras?.getStorageSizes());\n if (sizes && typeof sizes.lanceBytes === \"number\") lanceBytes = sizes.lanceBytes;\n } catch {\n // keep observability cheap/best-effort; omit lanceBytes on failure\n }\n const observability = await collectVectorBackendObservability({\n vectorDb,\n resolvedLancePath: ctx.resolvedLancePath,\n lanceBytes,\n });\n if (opts?.json) {\n console.log(JSON.stringify(observability, null, 2));\n return;\n }\n console.log(\"=== Vector Backend Health ===\");\n printVectorBackendObservabilitySummary(observability);\n }),\n );\n\n mem\n .command(\"record-storage-sample\")\n .description(\n \"Record one storage_growth_history row per UTC day (SQLite + Lance sizes). Use with daily cron so audit-health can compute 7d deltas.\",\n )\n .option(\"--force\", \"Bypass the once-per-UTC-day guard and record a fresh sample\")\n .option(\"--dry-run\", \"Compute and print the sample payload without writing a row\")\n .option(\"--json\", \"Emit parseable JSON\")\n .action(\n withExit(async (opts?: { force?: boolean; dryRun?: boolean; json?: boolean }) => {\n let lanceBytes: number | null = null;\n try {\n const sizes = await Promise.resolve(ctx.richStatsExtras?.getStorageSizes());\n if (sizes && typeof sizes.lanceBytes === \"number\") lanceBytes = sizes.lanceBytes;\n } catch (err) {\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"record-storage-sample-lance\",\n severity: \"info\",\n subsystem: \"cli\",\n });\n }\n const r = recordStorageGrowthSample(factsDb, lanceBytes, {\n force: opts?.force,\n dryRun: opts?.dryRun,\n });\n if (opts?.json) {\n // Emit cron-harness-compatible marker to stderr so hm_step can still\n // classify skips, while keeping stdout clean for JSON parsers.\n let marker = \"\";\n if (r.status === \"recorded\") {\n marker = \"status=success_recorded\";\n } else if (r.status === \"dry_run\") {\n marker = \"status=success_dry_run\";\n } else if (r.reason === \"storage_unavailable\") {\n marker = \"status=skipped_storage_unavailable\";\n } else {\n marker = \"status=skipped_already_sampled_today\";\n }\n console.error(`record-storage-sample: ${marker}`);\n console.log(\n JSON.stringify(\n {\n schemaVersion: 1,\n status: r.status,\n reason: r.reason,\n inserted: r.inserted,\n force: !!opts.force,\n dryRun: !!opts.dryRun,\n sampleId: r.sampleId,\n recordedAt: r.recordedAt,\n sample: r.sample,\n },\n null,\n 2,\n ),\n );\n return;\n }\n if (r.status === \"recorded\") {\n console.log(\n `record-storage-sample: inserted row (unix=${r.recordedAt}; sampleId=${r.sampleId ?? \"n/a\"}) status=success_recorded`,\n );\n return;\n }\n if (r.status === \"dry_run\") {\n console.log(\n `record-storage-sample: dry-run (unix=${r.sample.recordedAt}; sqliteBytes=${r.sample.sqliteBytes ?? \"null\"}; lanceBytes=${r.sample.lanceBytes ?? \"null\"}; linkCount=${r.sample.linkCount}; factCount=${r.sample.factCount}) status=success_dry_run`,\n );\n return;\n }\n console.log(\n r.reason === \"storage_unavailable\"\n ? `record-storage-sample: skipped (storage database unavailable; unix=${r.recordedAt}) status=skipped_storage_unavailable`\n : `record-storage-sample: skipped (already sampled today UTC; unix=${r.recordedAt}) status=skipped_already_sampled_today`,\n );\n }),\n );\n\n mem\n .command(\"stats\")\n .description(\n \"Show memory statistics. Rich output includes procedures, rules, patterns, directives, graph, and operational info. Use --efficiency for tiers, sources, and token estimates.\",\n )\n .option(\n \"--efficiency\",\n \"Add estimated stored tokens and a short note (rich mode); without rich stats, prints a compact efficiency-only report\",\n )\n .option(\"--brief\", \"Show only storage and decay counts (legacy-style)\")\n .action(\n withExit(async (opts?: { efficiency?: boolean; brief?: boolean }) => {\n const efficiency = opts?.efficiency ?? false;\n const brief = opts?.brief ?? false;\n const sqlCount = factsDb.count();\n let lanceCount = 0;\n try {\n lanceCount = await vectorDb.count();\n } catch (err) {\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"vector-count\",\n severity: \"info\",\n subsystem: \"cli\",\n });\n // vectorDb may be unavailable\n }\n const breakdown = factsDb.statsBreakdownByTier();\n const expired = factsDb.countExpired();\n\n const extras = ctx.richStatsExtras;\n const useRich = !brief && extras;\n\n if (useRich) {\n const byCategory = factsDb.statsBreakdownByCategory();\n const procedures = factsDb.proceduresCount();\n const proceduresValidated = factsDb.proceduresValidatedCount();\n const proceduresPromoted = factsDb.proceduresPromotedCount();\n const directives = factsDb.directivesCount();\n const rules = byCategory.rule ?? 0;\n const patterns = byCategory.pattern ?? 0;\n const metaPatterns = factsDb.metaPatternsCount();\n const links = factsDb.linksCount();\n const entities = factsDb.entityCount();\n const topEntitiesFiltered = factsDb.topEntitiesFiltered(5, ctx.cfg.entityExtraction.stopWords);\n const categoriesConfigured = getMemoryCategories();\n const uniqueInMemory = factsDb.uniqueMemoryCategories();\n const credentials = extras.getCredentialsCount();\n const proposalsPending = extras.getProposalsPending();\n const proposalsAvailable = extras.getProposalsAvailable();\n const pendingReview = countPendingReviewBacklogs(ctx.cfg, factsDb);\n const walPending = await extras.getWalPending();\n const timestamps = extras.getLastRunTimestamps();\n const sizes = await extras.getStorageSizes();\n\n const { reflectionPatternsCount, reflectionRulesCount } = factsDb.statsReflection();\n const selfCorrectionCount = factsDb.selfCorrectionIncidentsCount();\n const languageKeywordsCount = factsDb.languageKeywordsCount();\n\n const activeFacts = factsDb.getCount();\n const supersededFacts = factsDb.countSupersededFacts();\n const canonicalEmbeddings = factsDb.countCanonicalEmbeddings();\n const vectorless = factsDb.countVectorlessActiveFacts();\n const vectorlessBySource = factsDb.vectorlessActiveFactsBySource(5);\n const procedureTriage = factsDb.triageProcedures({ status: \"validated\", notPromoted: true, limit: 10_000 });\n const unresolvedContradictions = factsDb.contradictionsCount();\n const verifiedFacts = factsDb.countVerifiedFacts();\n const activity = factsDb.recentActivity();\n const decayBreakdown = factsDb.statsBreakdownByDecayClass();\n const activeDecayTotal = Object.values(decayBreakdown).reduce((sum, count) => sum + count, 0);\n const stablePermanentCount = (decayBreakdown.stable ?? 0) + (decayBreakdown.permanent ?? 0);\n const stablePermanentRatio = activeDecayTotal > 0 ? stablePermanentCount / activeDecayTotal : 0;\n const sourceBreakdown = factsDb.statsBySource();\n const dailyWrites = factsDb.statsDailyWrites().slice(0, 10);\n const implicitFeedbackSignals = countImplicitFeedbackTrajectorySignals(factsDb);\n const cronJobs = extras.getCronJobsStatus?.() ?? [];\n\n const lanceDelta = sqlCount - lanceCount;\n const lanceAbs = Math.abs(lanceDelta);\n const lanceDen = Math.max(sqlCount, lanceCount, 1);\n const lanceDeltaSignificant = lanceAbs > 100 && lanceAbs / lanceDen > 0.05;\n const totalFacts = sqlCount;\n const canonicalDelta = totalFacts - canonicalEmbeddings;\n const canonicalAbs = Math.abs(canonicalDelta);\n const canonicalDen = Math.max(totalFacts, canonicalEmbeddings, 1);\n const canonicalDeltaSignificant = canonicalAbs > 100 && canonicalAbs / canonicalDen > 0.05;\n\n console.log(\"=== Memory Statistics (rich) ===\");\n console.log(`Schema version: ${versionInfo.schemaVersion}`);\n console.log(`Plugin version: ${versionInfo.pluginVersion}`);\n console.log(`Memory Manager: ${versionInfo.memoryManagerVersion}`);\n console.log(\"\");\n console.log(`Total facts (SQLite): ${sqlCount}`);\n console.log(\n `Active facts: ${activeFacts}; superseded: ${supersededFacts}; expired pending prune: ${expired}`,\n );\n console.log(\n `Total vectors (LanceDB): ${lanceCount} (canonical embeddings in SQLite: ${canonicalEmbeddings})`,\n );\n console.log(`Vectorless active non-kv facts: ${vectorless}`);\n if (vectorlessBySource.length > 0) {\n console.log(`Vectorless by source: ${vectorlessBySource.map((r) => `${r.source}=${r.count}`).join(\", \")}`);\n }\n if (lanceDeltaSignificant || canonicalDeltaSignificant) {\n console.log(\n ` Health: SQLite facts ${sqlCount} vs LanceDB vectors ${lanceCount} (Δ=${lanceDelta}); total facts ${totalFacts} vs canonical embedding rows ${canonicalEmbeddings} (Δ=${canonicalDelta}). Run 'openclaw hybrid-mem re-index' if you switched embedding model or after a large backfill.`,\n );\n }\n console.log(\"\");\n const proceduresNote = procedures === 0 ? \" (run extract-procedures to populate)\" : \"\";\n console.log(\n `Procedures: ${procedures} (validated: ${proceduresValidated}, promoted: ${proceduresPromoted}, blocked: ${procedureTriage.summary.total}${procedureTriage.summary.topReason ? ` by ${procedureTriage.summary.topReason}` : \"\"})${proceduresNote}`,\n );\n console.log(\n `Pending review (proposals/procedures/tools/crystal/verified): ${pendingReview.persona}/${pendingReview.procedures}/${pendingReview.tools}/${pendingReview.crystallization}/${pendingReview.verified}`,\n );\n console.log(`Rules: ${rules}`);\n console.log(`Patterns: ${patterns}`);\n console.log(`Implicit-feedback signals: ${implicitFeedbackSignals}`);\n console.log(`Meta-patterns: ${metaPatterns}`);\n console.log(`Directives: ${directives}`);\n console.log(`Reflection (patterns/rules): ${reflectionPatternsCount}/${reflectionRulesCount}`);\n console.log(`Self-correction incidents: ${selfCorrectionCount}`);\n console.log(`Language keywords: ${languageKeywordsCount}`);\n if (dailyWrites.length > 0) {\n console.log(\"Per-source writes/day (latest):\");\n for (const row of dailyWrites) {\n const dropped = row.dropped > 0 ? `, dropped=${row.dropped}` : \"\";\n const evicted = row.evicted > 0 ? `, evicted=${row.evicted}` : \"\";\n console.log(` ${row.day} ${row.source}: count=${row.count}${dropped}${evicted}`);\n }\n }\n if (unresolvedContradictions > 0) {\n console.log(\n `Contradictions (unresolved): ${unresolvedContradictions} — run 'openclaw hybrid-mem resolve-contradictions'`,\n );\n } else {\n console.log(\"Contradictions (unresolved): 0\");\n }\n if (ctx.cfg.verification?.enabled) {\n console.log(`Verified facts: ${verifiedFacts}`);\n }\n console.log(\"\");\n console.log(`Graph (links/entities): ${links}/${entities}`);\n if (topEntitiesFiltered.length > 0) {\n const formatted = topEntitiesFiltered.map((row) => `${row.entity}=${row.count}`).join(\", \");\n console.log(`Top entities (filtered): ${formatted}`);\n }\n console.log(\n `Credentials (vaulted): ${credentials}${\n credentials === 0 && !ctx.cfg.credentials.enabled ? \" (vault off in effective config; counts stay 0)\" : \"\"\n }`,\n );\n const proposalsLine = proposalsAvailable\n ? `Proposals (pending): ${proposalsPending}${proposalsPending === 0 ? \" (run generate-proposals to create)\" : \"\"}`\n : ctx.cfg.personaProposals.enabled\n ? \"Proposals (pending): — (proposals store unavailable)\"\n : \"Proposals (pending): — (persona proposals off in effective config; see hybrid-mem config if file still shows enabled)\";\n console.log(proposalsLine);\n console.log(`WAL (pending distill): ${walPending}`);\n console.log(\"\");\n const configuredSet = new Set(categoriesConfigured);\n const inMemorySet = new Set(uniqueInMemory);\n const unknownCategories = uniqueInMemory.filter((category: string) => !configuredSet.has(category));\n const configuredOnlyCategories = categoriesConfigured.filter(\n (category: string) => !inMemorySet.has(category),\n );\n console.log(\n `Categories configured: ${categoriesConfigured.length} [${categoriesConfigured.slice(0, 3).join(\", \")}...]`,\n );\n console.log(`Categories in memory: ${uniqueInMemory.length} [${uniqueInMemory.slice(0, 3).join(\", \")}...]`);\n if (unknownCategories.length > 0) {\n console.log(\n `Discovered/unknown categories: ${unknownCategories.length} [${unknownCategories.join(\", \")}] — run 'openclaw hybrid-mem categories audit' and remap or promote them.`,\n );\n } else {\n console.log(\"Discovered/unknown categories: 0\");\n }\n if (configuredOnlyCategories.length > 0) {\n console.log(\n `Configured categories with no active facts: ${configuredOnlyCategories.length} [${configuredOnlyCategories.join(\", \")}]`,\n );\n }\n console.log(\"\");\n console.log(\n `Breakdown by tier: hot=${breakdown.hot}, warm=${breakdown.warm}, cold=${breakdown.cold}, structural=${breakdown.structural ?? 0}`,\n );\n const decayParts = Object.entries(decayBreakdown).sort((a, b) => b[1] - a[1]);\n if (decayParts.length > 0) {\n const summary = decayParts\n .map(\n ([k, v]) => `${k}=${v} (${activeDecayTotal > 0 ? ((v / activeDecayTotal) * 100).toFixed(1) : \"0.0\"}%)`,\n )\n .join(\", \");\n console.log(`Breakdown by decay: ${summary}`);\n console.log(\n `Decay stickiness: stable+permanent=${stablePermanentCount}/${activeDecayTotal} (${(stablePermanentRatio * 100).toFixed(1)}%)`,\n );\n if (stablePermanentRatio > 0.6) {\n console.log(\n \" Guidance: legacy stable/permanent ratio is high. Run `openclaw hybrid-mem decay reclassify --dry-run --stable-only` then `openclaw hybrid-mem decay reclassify --apply --stable-only`.\",\n );\n }\n }\n const topSources = Object.entries(sourceBreakdown)\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5);\n if (topSources.length > 0) {\n console.log(\n `Top sources (active): ${topSources.map(([s, c]) => `${s}=${c}`).join(\", \")} (of ${\n Object.keys(sourceBreakdown).length\n } sources)`,\n );\n }\n console.log(\"\");\n const oldestDays =\n activity.oldestActiveCreatedAtSec != null\n ? Math.max(0, Math.floor((Date.now() / 1000 - activity.oldestActiveCreatedAtSec) / 86400))\n : null;\n const newestAgeMin =\n activity.newestCreatedAtSec != null\n ? Math.max(0, Math.floor((Date.now() / 1000 - activity.newestCreatedAtSec) / 60))\n : null;\n console.log(\n `Recent activity: ${activity.last24h} new in 24h, ${activity.last7d} in 7d, ${activity.last30d} in 30d`,\n );\n if (newestAgeMin != null && oldestDays != null) {\n console.log(` Newest fact: ${newestAgeMin} min ago. Oldest active: ${oldestDays} days old.`);\n }\n console.log(\"\");\n console.log(`Last distill: ${timestamps.distill ?? \"(never)\"}`);\n console.log(`Last reflect: ${timestamps.reflect ?? \"(never)\"}`);\n console.log(`Last compact: ${timestamps.compact ?? \"(never)\"}`);\n console.log(`Last vectordb-optimize: ${timestamps.vectordbOptimize ?? \"(never)\"}`);\n console.log(\"\");\n if (sizes.sqliteBytes != null) console.log(`SQLite size: ${(sizes.sqliteBytes / 1024 / 1024).toFixed(2)} MB`);\n if (sizes.lanceBytes != null) console.log(`LanceDB size: ${(sizes.lanceBytes / 1024 / 1024).toFixed(2)} MB`);\n if (sizes.sqliteBytes != null && activeFacts > 0) {\n const bytesPerFact = sizes.sqliteBytes / activeFacts;\n console.log(`SQLite bytes per active fact: ${bytesPerFact.toFixed(0)}`);\n }\n if (sizes.sqliteBytes != null || sizes.lanceBytes != null) console.log(\"\");\n const vectorObservability = await collectVectorBackendObservability({\n vectorDb,\n resolvedLancePath: ctx.resolvedLancePath,\n lanceBytes: sizes.lanceBytes ?? null,\n });\n printVectorBackendObservabilitySummary(vectorObservability);\n console.log(\"\");\n if (efficiency) {\n const estimatedTokens = factsDb.estimateStoredTokens();\n console.log(\"--- Efficiency (token estimate) ---\");\n console.log(`Estimated stored tokens (all active tiers): ~${estimatedTokens}`);\n console.log(\"Note: Tiering and context scoping reduce tokens in the LLM vs raw store size.\");\n console.log(\"\");\n }\n if (cronJobs.length > 0) {\n const nowMs = Date.now();\n const dayMs = 86_400_000;\n const hourMs = 3_600_000;\n const noEmojiCron = getEnv(\"HYBRID_MEM_NO_EMOJI\") === \"1\";\n const staleLabel = noEmojiCron ? \"[WARN] stale\" : \"⚠ stale\";\n const fmtStaleWindow = (ms: number) =>\n ms >= dayMs ? `${Math.max(1, Math.round(ms / dayMs))}d` : `${Math.max(1, Math.round(ms / hourMs))}h`;\n console.log(`Cron jobs (hybrid-mem:*): ${cronJobs.length}`);\n for (const j of cronJobs) {\n const status = j.enabled ? \"enabled \" : \"disabled\";\n const sched = j.scheduleExpr ?? \"(no schedule)\";\n const last =\n j.lastRunAtMs != null ? `last ${Math.floor((nowMs - j.lastRunAtMs) / 3600000)}h ago` : \"last (never)\";\n const interval = approxIntervalMs(j.scheduleExpr);\n const stale = j.enabled && interval && (j.lastRunAtMs == null || nowMs - j.lastRunAtMs > interval * 1.5);\n const staleNote =\n stale && interval != null\n ? ` overdue (no run in >${fmtStaleWindow(interval * 1.5)} vs ~${fmtStaleWindow(interval)} schedule)`\n : \"\";\n const tail = stale ? ` ${staleLabel}${staleNote}` : \"\";\n console.log(` ${status} ${j.name.padEnd(30)} ${sched.padEnd(14)} ${last}${tail}`);\n }\n console.log(\"\");\n }\n } else if (efficiency) {\n const byTier = breakdown;\n const bySource = factsDb.statsBySource();\n const dailyWrites = factsDb.statsDailyWrites().slice(0, 10);\n const estimatedTokens = factsDb.estimateStoredTokens();\n console.log(\"=== Memory Efficiency Stats ===\");\n console.log(\n `Breakdown: hot=${byTier.hot}, warm=${byTier.warm}, cold=${byTier.cold}, structural=${byTier.structural ?? 0}`,\n );\n console.log(`Sources: ${Object.keys(bySource).length}`);\n for (const [src, count] of Object.entries(bySource).slice(0, 5)) {\n console.log(` ${src}: ${count}`);\n }\n if (dailyWrites.length > 0) {\n console.log(\"Per-source writes/day (latest):\");\n for (const row of dailyWrites) {\n const dropped = row.dropped > 0 ? `, dropped=${row.dropped}` : \"\";\n const evicted = row.evicted > 0 ? `, evicted=${row.evicted}` : \"\";\n console.log(` ${row.day} ${row.source}: count=${row.count}${dropped}${evicted}`);\n }\n }\n console.log(`Estimated tokens (all tiers): ~${estimatedTokens}`);\n console.log(\"\");\n console.log(\"Note: Tiering and scoping can significantly reduce token usage in LLM context.\");\n } else {\n const decayBreakdown = factsDb.statsBreakdownByDecayClass();\n const activeDecayTotal = Object.values(decayBreakdown).reduce((sum, count) => sum + count, 0);\n const stablePermanentCount = (decayBreakdown.stable ?? 0) + (decayBreakdown.permanent ?? 0);\n const stablePermanentRatio = activeDecayTotal > 0 ? stablePermanentCount / activeDecayTotal : 0;\n console.log(`Total facts (SQLite): ${sqlCount}`);\n console.log(`Total vectors (LanceDB): ${lanceCount}`);\n console.log(`Expired (prunable): ${expired}`);\n console.log(\n `Breakdown: hot=${breakdown.hot}, warm=${breakdown.warm}, cold=${breakdown.cold}, structural=${breakdown.structural ?? 0}`,\n );\n const decaySummary = Object.entries(decayBreakdown)\n .sort((a, b) => b[1] - a[1])\n .map(([k, v]) => `${k}=${v}`)\n .join(\", \");\n if (decaySummary.length > 0) {\n console.log(`Decay: ${decaySummary}`);\n console.log(\n `Decay stickiness (stable+permanent): ${stablePermanentCount}/${activeDecayTotal} (${(stablePermanentRatio * 100).toFixed(1)}%)`,\n );\n if (stablePermanentRatio > 0.6) {\n console.log(\n \"Guidance: run `openclaw hybrid-mem decay reclassify --dry-run --stable-only` then `openclaw hybrid-mem decay reclassify --apply --stable-only`.\",\n );\n }\n }\n }\n }),\n );\n\n mem\n .command(\"reembed-vectorless\")\n .description(\"Embed active non-kv facts that lack canonical embeddings (dry-run by default)\")\n .option(\"--limit <n>\", \"Maximum vectorless facts to process\", \"100\")\n .option(\"--source <s>\", \"Only process facts from this source\")\n .option(\"--apply\", \"Actually embed and write LanceDB/fact_embeddings rows; default is dry-run\")\n .option(\"--batch-size <n>\", \"Embedding batch size\", \"40\")\n .option(\n \"--max-embed-failures <n>\",\n \"Circuit-break after this many consecutive embed failures and exit 1; prevents indefinite stall on provider outage (default: 5)\",\n \"5\",\n )\n .option(\"-v, --verbose\", \"Emit periodic progress heartbeat for long runs\")\n .option(\"--json\", \"Emit JSON\")\n .action(\n withExit(\n async (\n opts?: {\n limit?: string;\n source?: string;\n apply?: boolean;\n batchSize?: string;\n maxEmbedFailures?: string;\n verbose?: boolean;\n json?: boolean;\n },\n cmd?: CommanderOptsParent,\n ) => {\n const limit = Number.parseInt(opts?.limit ?? \"100\", 10);\n const batchSize = Number.parseInt(opts?.batchSize ?? \"40\", 10);\n const maxEmbedFailures = Number.parseInt(opts?.maxEmbedFailures ?? \"5\", 10);\n const verbose = !!opts?.verbose || readHybridMemVerbose(cmd);\n if (!Number.isFinite(limit) || limit < 1) {\n console.error(\"error: --limit must be a positive integer\");\n process.exitCode = 1;\n return;\n }\n if (!Number.isFinite(batchSize) || batchSize < 1) {\n console.error(\"error: --batch-size must be a positive integer\");\n process.exitCode = 1;\n return;\n }\n if (!Number.isFinite(maxEmbedFailures) || maxEmbedFailures < 1) {\n console.error(\"error: --max-embed-failures must be a positive integer\");\n process.exitCode = 1;\n return;\n }\n const before = factsDb.countVectorlessActiveFacts(opts?.source);\n const candidates = factsDb.listVectorlessActiveFacts({ limit, source: opts?.source });\n const errors: string[] = [];\n let embedded = 0;\n let skipped = 0;\n let storeFailures = 0;\n let embedFailures = 0;\n const totalBatches = batchSize > 0 ? Math.ceil(candidates.length / batchSize) : 0;\n let processed = 0;\n let batchNumber = 0;\n let providerCircuitBreak = false;\n let providerCircuitBreakCause: string = \"max_failures\";\n let consecutiveEmbedFailures = 0;\n let aborted = false;\n if (opts?.apply) {\n await runMaintenanceHeartbeat(\n \"reembed-vectorless\",\n verbose,\n async () => {\n await vectorDb.runWithAutoOptimizePaused(async () => {\n for (let offset = 0; offset < candidates.length; offset += batchSize) {\n if (providerCircuitBreak) break;\n batchNumber = Math.floor(offset / batchSize) + 1;\n const batch = candidates.slice(offset, offset + batchSize);\n let vectors: (number[] | null)[];\n try {\n vectors = await embedCallWithTimeoutAndRetry(\n () => embeddings.embedBatch(batch.map((fact) => fact.text)),\n `reembed-vectorless:batch-${batchNumber}`,\n );\n consecutiveEmbedFailures = 0;\n } catch (batchErr) {\n if (isEmbeddingProviderServerError(batchErr)) {\n providerCircuitBreak = true;\n providerCircuitBreakCause = \"provider_5xx\";\n aborted = true;\n errors.push(\n `batch ${batchNumber}: embed failed with provider 5xx; fast-failing to avoid per-fact fallback stall — ${String(batchErr)}`,\n );\n break;\n }\n vectors = [];\n for (const fact of batch) {\n try {\n vectors.push(\n await embedCallWithTimeoutAndRetry(\n () => embeddings.embed(fact.text),\n `reembed-vectorless:fact-${fact.id}`,\n ),\n );\n consecutiveEmbedFailures = 0;\n } catch (singleErr) {\n errors.push(`fact ${fact.id}: embed failed — ${String(singleErr)}`);\n embedFailures++;\n vectors.push(null);\n if (isEmbeddingProviderServerError(singleErr)) {\n providerCircuitBreak = true;\n providerCircuitBreakCause = \"provider_5xx\";\n aborted = true;\n break;\n }\n consecutiveEmbedFailures++;\n if (consecutiveEmbedFailures >= maxEmbedFailures) {\n providerCircuitBreak = true;\n providerCircuitBreakCause = \"max_failures\";\n aborted = true;\n break;\n }\n }\n }\n }\n for (let i = 0; i < batch.length; i++) {\n if (providerCircuitBreak && i >= vectors.length) break;\n const fact = batch[i];\n const vec = vectors[i];\n if (!vec || vec.length === 0) {\n skipped++;\n processed++;\n continue;\n }\n try {\n try {\n await vectorDb.delete(fact.id);\n } catch {\n // Missing Lance row is the normal case for vectorless repair.\n }\n await vectorDb.store({\n id: fact.id,\n text: fact.text,\n vector: vec,\n importance: 0.5,\n category: fact.category,\n });\n factsDb.storeEmbedding(\n fact.id,\n embeddings.modelName,\n \"canonical\",\n new Float32Array(vec),\n vec.length,\n );\n factsDb.setEmbeddingModel(fact.id, embeddings.modelName);\n embedded++;\n } catch (err) {\n errors.push(`fact ${fact.id}: store failed — ${String(err)}`);\n storeFailures++;\n skipped++;\n } finally {\n processed++;\n }\n }\n }\n });\n },\n {\n progressSupplier: () =>\n `stage=embed-and-store; processed=${processed}/${candidates.length}; embedded=${embedded}; skipped=${skipped}; embedFailures=${embedFailures}; storeFailures=${storeFailures}; batch=${batchNumber}/${totalBatches}`,\n jsonMode: opts?.json === true,\n },\n );\n }\n const after = opts?.apply ? factsDb.countVectorlessActiveFacts(opts?.source) : before;\n const report: Record<string, unknown> = {\n apply: opts?.apply === true,\n source: opts?.source ?? null,\n before,\n considered: candidates.length,\n embedded,\n skipped,\n embedFailures,\n storeFailures,\n errors,\n after,\n processed,\n aborted,\n };\n if (providerCircuitBreak) {\n report.failedReason =\n providerCircuitBreakCause === \"provider_5xx\"\n ? \"failed_embedding_provider_5xx\"\n : \"failed_embedding_provider\";\n process.exitCode = 1;\n } else if (opts?.apply && storeFailures > 0) {\n process.exitCode = 2;\n }\n if (opts?.json) {\n console.log(JSON.stringify(report, null, 2));\n return;\n }\n console.log(\n `Reembed vectorless ${report.apply ? \"applied\" : \"dry-run\"}: before ${before}, candidates ${candidates.length}, embedded ${embedded}, skipped ${skipped}, storeFailures ${storeFailures}, after ${after}`,\n );\n if (candidates.length > 0 && !opts?.apply) {\n console.log(\"Examples:\");\n for (const fact of candidates.slice(0, 10)) {\n console.log(` ${fact.id} ${fact.source} ${fact.text.slice(0, 80).replace(/\\s+/g, \" \")}`);\n }\n console.log(\"Dry-run only. Re-run with --apply to write embeddings.\");\n }\n if (errors.length > 0) {\n console.warn(`Errors: ${errors.length}`);\n for (const err of errors.slice(0, 10)) console.warn(` - ${err}`);\n }\n if (providerCircuitBreak) {\n if (providerCircuitBreakCause === \"provider_5xx\") {\n console.error(\n `Provider fast-fail: embedding provider returned 5xx; aborted reembed-vectorless immediately to avoid per-fact fallback stall. Processed ${processed}/${candidates.length} fact(s); embedded ${embedded} (exit=1).`,\n );\n } else {\n console.error(\n `Provider circuit-break: ${maxEmbedFailures} consecutive embed failure(s) exceeded --max-embed-failures ${maxEmbedFailures}; processed ${processed}/${candidates.length} fact(s) before aborting; partial embeddings stored: ${embedded}. Re-run after provider recovery (exit=1).`,\n );\n }\n } else if (opts?.apply && storeFailures > 0) {\n console.warn(\n `Partial success: ${storeFailures} write failure(s) occurred during vector re-embedding; retryable LanceDB conflicts were retried where applicable (exit=2).`,\n );\n }\n },\n ),\n );\n\n mem\n .command(\"prune\")\n .description(\"Remove expired facts (decayed past threshold)\")\n .option(\"-v, --verbose\", \"List fact ids that will be removed before pruning\")\n .action(\n withExit(async (opts?: { verbose?: boolean }, cmd?: CommanderOptsParent) => {\n const verbose = !!opts?.verbose || readHybridMemVerbose(cmd);\n const before = factsDb.count();\n if (verbose) {\n const pending = factsDb.listExpiredFactIdsPendingPrune();\n if (pending.length > 0) {\n console.log(\"Fact ids to prune (--verbose):\");\n for (const id of pending) console.log(` ${id}`);\n } else {\n console.log(\"No expired facts pending prune (--verbose).\");\n }\n }\n const pendingVectorDeletes = factsDb.listExpiredFactIdsPendingPrune();\n const pruned = factsDb.prune();\n const vectorCleanup = await deleteVectorsForFactIds(vectorDb, pendingVectorDeletes, {\n operation: \"cli-prune-expired\",\n logger: {\n warn: (msg) => console.warn(msg),\n },\n });\n const after = factsDb.count();\n console.log(\n `Pruned ${pruned} expired facts. Before: ${before}, After: ${after}. Vector cleanup: ${vectorCleanup.deleted}/${vectorCleanup.attempted} deleted${vectorCleanup.failed > 0 ? ` (${vectorCleanup.failed} failed)` : \"\"}.`,\n );\n }),\n );\n\n mem\n .command(\"checkpoint\")\n .description(\"Checkpoint vector DB to disk (LanceDB optimization)\")\n .action(\n withExit(async () => {\n await vectorDb.checkpoint?.();\n console.log(\"Vector DB checkpoint complete.\");\n }),\n );\n\n mem\n .command(\"re-index\")\n .description(\n \"Re-embed all facts into a shadow table, validate, and atomically swap into place. Non-destructive: aborted runs preserve the live vector store (use after switching embedding model, e.g. to a larger one).\",\n )\n .option(\"--batch-size <n>\", \"Facts per embed batch (default: 50)\", \"50\")\n .option(\n \"--delay-ms-between-batches <n>\",\n \"Pause between embedding batches in ms (default: 0). On Azure/APIM with tight RPM, try 2000 — see docs/TROUBLESHOOTING.md and issue #940.\",\n \"0\",\n )\n .option(\n \"--min-fraction-success <n>\",\n \"Minimum fraction of facts that must be successfully embedded (0.0-1.0, default: 0.95). Re-index aborts without swapping if fewer facts are migrated.\",\n \"0.95\",\n )\n .option(\"--resume\", \"Resume from saved checkpoint file when available\")\n .option(\"--checkpoint-file <path>\", \"Checkpoint file path for resumable re-index\")\n .action(\n withExit(\n async (opts?: {\n batchSize?: string;\n delayMsBetweenBatches?: string;\n minFractionSuccess?: string;\n resume?: boolean;\n checkpointFile?: string;\n }) => {\n const batchSize = parseBoundedIntOption(opts?.batchSize, 50, 1, 500);\n const delayMsBetweenBatches = parseBoundedIntOption(opts?.delayMsBetweenBatches, 0, 0, 120_000);\n const minFractionSuccess = parseBoundedFloatOption(opts?.minFractionSuccess, 0.95, 0.0, 1.0);\n const checkpointPath =\n opts?.checkpointFile?.trim() ||\n (ctx.resolvedSqlitePath ? defaultReindexCheckpointPath(ctx.resolvedSqlitePath) : \"\");\n let resumeCheckpoint = opts?.resume === true && checkpointPath ? readReindexCheckpoint(checkpointPath) : null;\n\n // Get total facts for validation\n const totalFacts =\n typeof (factsDb as { getCount?: unknown }).getCount === \"function\"\n ? (factsDb as { getCount: (opts: { includeSuperseded: boolean }) => number }).getCount({\n includeSuperseded: false,\n })\n : factsDb.getAll({ includeSuperseded: false }).length;\n\n const runReindex = async () => {\n console.log(`Re-index: starting non-destructive re-index of ${totalFacts} facts...`);\n if (resumeCheckpoint) {\n console.log(\n `Re-index: resume enabled — checkpoint offset ${resumeCheckpoint.offset}/${resumeCheckpoint.total}`,\n );\n if (resumeCheckpoint.total !== totalFacts) {\n console.warn(\n `Re-index: checkpoint total (${resumeCheckpoint.total}) differs from current fact count (${totalFacts}); checkpoint will be ignored for safety.`,\n );\n resumeCheckpoint = null;\n } else if (resumeCheckpoint.offset > 0) {\n console.warn(\n \"Re-index: checkpoint offsets cannot be resumed with a newly-created shadow table; restarting from offset 0 for safety.\",\n );\n resumeCheckpoint = null;\n }\n }\n console.log(\"Re-index: creating shadow table for safe rebuild...\");\n\n let shadowTableName: string;\n try {\n shadowTableName = await vectorDb.createShadowTable();\n } catch (err) {\n console.error(`Re-index failed: unable to create shadow table: ${err}`);\n process.exit(1);\n }\n if (ctx.resolvedSqlitePath) {\n appendVectorLifecycleAuditEvent(ctx.resolvedSqlitePath, {\n event: \"reindex_started\",\n ts: new Date().toISOString(),\n details: { totalFacts, batchSize, delayMsBetweenBatches, minFractionSuccess, shadowTableName },\n });\n }\n\n console.log(\"Re-index: embedding all facts into shadow table (this may take a while)...\");\n const result = await migrateEmbeddings({\n factsDb,\n vectorDb,\n embeddings,\n batchSize,\n delayMsBetweenBatches,\n targetTableName: shadowTableName,\n checkpoint:\n checkpointPath.length > 0\n ? {\n load: () => (resumeCheckpoint ? { offset: resumeCheckpoint.offset } : null),\n save: (state) => writeReindexCheckpoint(checkpointPath, state),\n clear: () => {\n if (existsSync(checkpointPath)) unlinkSync(checkpointPath);\n },\n }\n : undefined,\n onProgress: (completed, total) => {\n if (total > 0 && completed % Math.max(1, Math.floor(total / 10)) === 0) {\n process.stdout.write(` ${completed}/${total} facts embedded...\\r`);\n if (ctx.resolvedSqlitePath) {\n appendVectorLifecycleAuditEvent(ctx.resolvedSqlitePath, {\n event: \"reindex_progress\",\n ts: new Date().toISOString(),\n details: { completed, total },\n });\n }\n }\n },\n logger: { info: (m) => console.log(m), warn: (m) => console.warn(m) },\n });\n\n console.log(\n `\\nRe-index: migration complete — ${result.migrated} embedded, ${result.skipped} skipped, ${result.errors.length} errors.`,\n );\n\n if (result.errors.length > 0 && result.errors.length <= 10) {\n for (const e of result.errors) console.warn(` - ${e}`);\n } else if (result.errors.length > 10) {\n console.warn(` (${result.errors.length} errors; first 5:)`);\n for (const e of result.errors.slice(0, 5)) console.warn(` - ${e}`);\n }\n\n // Hard abort (e.g. VectorDB closed mid-run, see #1247): never swap a\n // partial shadow table into place.\n if (result.aborted) {\n if (ctx.resolvedSqlitePath) {\n appendVectorLifecycleAuditEvent(ctx.resolvedSqlitePath, {\n event: \"reindex_aborted\",\n ts: new Date().toISOString(),\n details: {\n migrated: result.migrated,\n skipped: result.skipped,\n errors: result.errors.length,\n processed: result.processed,\n total: result.total,\n abortReason: result.abortReason ?? null,\n shadowTableName,\n },\n });\n }\n console.error(\n `\\nRe-index FAILED: ${result.migrated} embedded, ${result.skipped} skipped, ${result.errors.length} errors ` +\n `(processed ${result.processed}/${result.total}) — migration aborted before completion.`,\n );\n console.error(`Reason: ${result.abortReason ?? \"unknown\"}`);\n console.error(\"Live vector store was NOT modified.\");\n console.error(`Shadow table preserved for inspection: ${shadowTableName}`);\n console.error(\"Recommendation: Re-run 'openclaw hybrid-mem re-index --resume' to continue.\");\n process.exit(1);\n }\n\n // Validate row count before swapping\n const minRequired = Math.ceil(totalFacts * minFractionSuccess);\n if (result.migrated < minRequired) {\n console.error(\n `\\nRe-index validation failed: ${result.migrated} migrated < required minimum ${minRequired} ` +\n `(${(minFractionSuccess * 100).toFixed(1)}% of ${totalFacts} facts).`,\n );\n console.error(\"Aborting swap to preserve live vector store.\");\n console.error(`Shadow table preserved for inspection: ${shadowTableName}`);\n console.error(\"To retry, clean up shadow table and run re-index again.\");\n process.exit(1);\n }\n\n console.log(\n `Re-index: validation passed — ${result.migrated} >= ${minRequired} required (${(minFractionSuccess * 100).toFixed(1)}% of ${totalFacts})`,\n );\n console.log(\"Re-index: swapping shadow table into place...\");\n\n try {\n await vectorDb.swapShadowTable(shadowTableName, minFractionSuccess, totalFacts);\n } catch (err) {\n console.error(`\\nRe-index failed: shadow table swap failed: ${err}`);\n console.error(\"Live vector store was NOT modified.\");\n console.error(`Shadow table preserved for inspection: ${shadowTableName}`);\n process.exit(1);\n }\n\n // Update embedding metadata in SQLite (batch update for all facts)\n console.log(\"Re-index: updating embedding metadata in SQLite...\");\n const allFacts = hasGetBatch(factsDb)\n ? (() => {\n const facts: Array<{ id: string }> = [];\n let offset = 0;\n const batchSize = 500;\n while (true) {\n const batch = factsDb.getBatch(offset, batchSize, { includeSuperseded: false });\n if (batch.length === 0) break;\n facts.push(...batch);\n offset += batch.length;\n }\n return facts;\n })()\n : (factsDb as { getAll: (opts: { includeSuperseded: boolean }) => Array<{ id: string }> }).getAll({\n includeSuperseded: false,\n });\n\n for (const fact of allFacts) {\n try {\n factsDb.setEmbeddingModel(fact.id, embeddings.modelName);\n } catch {\n // ignore per-fact metadata update errors (non-fatal)\n }\n }\n\n if (ctx.resolvedSqlitePath) {\n appendVectorLifecycleAuditEvent(ctx.resolvedSqlitePath, {\n event: \"reindex_completed\",\n ts: new Date().toISOString(),\n details: {\n migrated: result.migrated,\n skipped: result.skipped,\n errors: result.errors.length,\n total: result.total,\n shadowTableName,\n },\n });\n }\n\n console.log(`\\nRe-index complete: ${result.migrated} facts successfully re-indexed.`);\n console.log(\"Live vector store updated atomically. Semantic search is fully operational.\");\n };\n\n if (typeof (vectorDb as { runWithReindexLock?: unknown }).runWithReindexLock === \"function\") {\n await (\n vectorDb as {\n runWithReindexLock: <T>(fn: () => Promise<T>) => Promise<T>;\n }\n ).runWithReindexLock(runReindex);\n } else {\n await runReindex();\n }\n },\n ),\n );\n\n mem\n .command(\"repair-vectors\")\n .description(\n \"Run an orchestrated vector lifecycle repair pipeline: reembed-vectorless, vectordb-optimize, reconcile orphans, and print a single report.\",\n )\n .option(\n \"--reconcile-policy <policy>\",\n \"Self-heal policy for SQLite-orphan vectors: conservative|balanced|aggressive\",\n \"balanced\",\n )\n .option(\"--max-fixes <n>\", \"Max SQLite-orphan vectors to auto-rebuild (default: 200)\", \"200\")\n .option(\"--json\", \"Emit JSON report\")\n .action(\n withExit(async (opts?: { reconcilePolicy?: string; maxFixes?: string; json?: boolean }) => {\n const resolveRepairBudget = (policy: \"conservative\" | \"balanced\" | \"aggressive\", maxFixes: number): number => {\n if (policy === \"conservative\") return 0;\n if (policy === \"balanced\") return maxFixes;\n return Math.max(maxFixes, 2000);\n };\n const policyRaw = String(opts?.reconcilePolicy ?? \"balanced\")\n .trim()\n .toLowerCase();\n const policy = policyRaw === \"conservative\" || policyRaw === \"aggressive\" ? policyRaw : \"balanced\";\n const maxFixes = parseBoundedIntOption(opts?.maxFixes, 200, 0, 5000);\n const report = {\n policy,\n maxFixes,\n startedAt: new Date().toISOString(),\n vectorlessBefore: factsDb.countVectorlessActiveFacts(),\n reembedded: 0,\n optimize: { compacted: 0, removedFragments: 0, freedBytes: 0 },\n reconcile: {\n vectorOrphans: 0,\n vectorOrphansDeleted: 0,\n sqliteOrphans: 0,\n sqliteOrphansRebuilt: 0,\n sqliteOrphansSkipped: 0,\n },\n vectorlessAfter: 0,\n errors: [] as string[],\n };\n\n // Step 1: reembed vectorless facts\n const candidates = factsDb.listVectorlessActiveFacts({ limit: Math.max(200, maxFixes) });\n const allowedRebuilds = resolveRepairBudget(policy, maxFixes);\n for (const fact of candidates.slice(0, allowedRebuilds)) {\n try {\n const vec = await embeddings.embed(fact.text);\n await vectorDb.store({\n id: fact.id,\n text: fact.text,\n vector: vec,\n importance: 0.5,\n category: fact.category,\n });\n report.reembedded++;\n } catch (err) {\n report.errors.push(`reembed ${fact.id}: ${String(err)}`);\n }\n }\n\n // Step 2: optimize\n try {\n report.optimize = await vectorDb.optimize();\n } catch (err) {\n report.errors.push(`optimize: ${String(err)}`);\n }\n\n // Step 3: reconcile and policy-based self-heal\n try {\n const sqliteIds = new Set(factsDb.getAllIds());\n const vectorIds = await vectorDb.getAllIds();\n const vectorIdSet = new Set(vectorIds);\n const vectorOrphans = vectorIds.filter((id) => !sqliteIds.has(id));\n const sqliteOrphans = Array.from(sqliteIds).filter((id) => !vectorIdSet.has(id));\n report.reconcile.vectorOrphans = vectorOrphans.length;\n report.reconcile.sqliteOrphans = sqliteOrphans.length;\n\n for (const id of vectorOrphans) {\n try {\n await vectorDb.delete(id);\n report.reconcile.vectorOrphansDeleted++;\n } catch (err) {\n report.errors.push(`delete orphan vector ${id}: ${String(err)}`);\n }\n }\n\n const rebuildLimit = Math.min(resolveRepairBudget(policy, maxFixes), sqliteOrphans.length);\n for (const id of sqliteOrphans.slice(0, rebuildLimit)) {\n try {\n const fact = factsDb.getById(id);\n if (!fact) {\n report.reconcile.sqliteOrphansSkipped++;\n continue;\n }\n const vec = await embeddings.embed(fact.text);\n await vectorDb.store({\n id: fact.id,\n text: fact.text,\n vector: vec,\n importance: fact.importance ?? 0.5,\n category: fact.category,\n });\n report.reconcile.sqliteOrphansRebuilt++;\n } catch (err) {\n report.errors.push(`rebuild sqlite orphan ${id}: ${String(err)}`);\n }\n }\n report.reconcile.sqliteOrphansSkipped += Math.max(0, sqliteOrphans.length - rebuildLimit);\n } catch (err) {\n report.errors.push(`reconcile: ${String(err)}`);\n }\n\n report.vectorlessAfter = factsDb.countVectorlessActiveFacts();\n const finishedAt = new Date().toISOString();\n if (ctx.resolvedSqlitePath) {\n appendVectorLifecycleAuditEvent(ctx.resolvedSqlitePath, {\n event: \"repair_vectors_completed\",\n ts: finishedAt,\n details: report as unknown as Record<string, unknown>,\n });\n }\n if (opts?.json) {\n console.log(JSON.stringify({ ...report, finishedAt }, null, 2));\n return;\n }\n console.log(\"Repair vectors report:\");\n console.log(` policy=${report.policy} maxFixes=${report.maxFixes}`);\n console.log(` vectorless: before=${report.vectorlessBefore} after=${report.vectorlessAfter}`);\n console.log(\n ` optimize: compacted=${report.optimize.compacted} removedFragments=${report.optimize.removedFragments} freedBytes=${report.optimize.freedBytes}`,\n );\n console.log(\n ` reconcile: vectorOrphans=${report.reconcile.vectorOrphans} deleted=${report.reconcile.vectorOrphansDeleted}; sqliteOrphans=${report.reconcile.sqliteOrphans} rebuilt=${report.reconcile.sqliteOrphansRebuilt} skipped=${report.reconcile.sqliteOrphansSkipped}`,\n );\n if (report.errors.length > 0) {\n console.log(` errors=${report.errors.length}`);\n for (const err of report.errors.slice(0, 10)) console.log(` - ${err}`);\n process.exitCode = 2;\n }\n }),\n );\n\n mem\n .command(\"classification-artifacts\")\n .description(\n \"Supersede existing NOOP/classification-artifact facts and remove their LanceDB vectors (issue #1561). \" +\n \"Dry-run by default; use --apply to mutate.\",\n )\n .option(\"--apply\", \"Actually supersede facts and delete vectors. Omit for dry-run.\")\n .option(\"--json\", \"Emit JSON report\")\n .action(\n withExit(async (opts?: { apply?: boolean; json?: boolean }) => {\n const apply = opts?.apply === true;\n const supersededIds: string[] = [];\n const verifiedSkippedIds: string[] = [];\n const vectorDeleteErrors: string[] = [];\n let vectorDeleteCount = 0;\n const verifiedLookup = (() => {\n try {\n return hasGetRawDb(factsDb)\n ? factsDb.getRawDb().prepare(\"SELECT 1 FROM verified_facts WHERE fact_id = ? LIMIT 1\")\n : null;\n } catch {\n return null;\n }\n })();\n const processFactBatch = async (\n facts: Array<{ id: string; text: string; category?: string; source?: string }>,\n ): Promise<number> => {\n let supersededCount = 0;\n for (const fact of facts) {\n if (!isPreStoreGuardBlocked({ text: fact.text, category: fact.category, source: fact.source })) continue;\n if (verifiedLookup?.get(fact.id)) {\n verifiedSkippedIds.push(fact.id);\n continue;\n }\n if (!apply) {\n supersededIds.push(fact.id);\n continue;\n }\n try {\n await vectorDb.delete(fact.id);\n vectorDeleteCount++;\n } catch (err) {\n vectorDeleteErrors.push(`vector delete ${fact.id}: ${String(err)}`);\n }\n try {\n factsDb.supersede(fact.id, null);\n supersededIds.push(fact.id);\n supersededCount++;\n } catch (err) {\n vectorDeleteErrors.push(`supersede ${fact.id}: ${String(err)}`);\n }\n }\n return supersededCount;\n };\n if (hasGetBatch(factsDb)) {\n const batchSize = 500;\n // In apply mode, keep offset at 0 because each superseded fact shrinks the result set.\n // In dry-run mode, increment offset normally since the set is stable.\n let offset = 0;\n while (true) {\n const batch = factsDb.getBatch(offset, batchSize, { includeSuperseded: false });\n if (batch.length === 0) break;\n const superseded = await processFactBatch(batch);\n // If applying changes, facts are removed from the result set; stay at offset 0.\n // If dry-run, the result set is stable; advance by batch size.\n if (!apply) {\n offset += batchSize;\n } else if (superseded === 0) {\n // No artifacts superseded in this batch; advance to avoid infinite loop.\n offset += batchSize;\n }\n }\n } else {\n // Fallback: process all facts in batches to avoid loading entire table into memory at once.\n const allFacts = (\n factsDb as unknown as { getAll(opts: { includeSuperseded: boolean }): MemoryEntry[] }\n ).getAll({\n includeSuperseded: false,\n });\n const batchSize = 500;\n for (let offset = 0; offset < allFacts.length; offset += batchSize) {\n const batch = allFacts.slice(offset, offset + batchSize);\n await processFactBatch(batch);\n }\n }\n\n if (apply && ctx.resolvedSqlitePath) {\n recordMaintenanceTimestamp(ctx.resolvedSqlitePath, \".classification_artifacts_last_run\");\n }\n\n const report = {\n apply,\n superseded: supersededIds.length,\n supersededIds,\n verifiedSkipped: verifiedSkippedIds.length,\n verifiedSkippedIds,\n vectorDeletes: apply ? vectorDeleteCount : 0,\n vectorDeleteErrors,\n };\n\n if (opts?.json) {\n console.log(JSON.stringify(report, null, 2));\n return;\n }\n\n if (supersededIds.length === 0) {\n console.log(\"classification-artifacts: no artifact facts found\");\n return;\n }\n\n console.log(\n `classification-artifacts ${apply ? \"applied\" : \"dry-run\"}: ${supersededIds.length} artifact fact(s) identified`,\n );\n if (verifiedSkippedIds.length > 0) {\n console.log(`Skipped verified facts: ${verifiedSkippedIds.length}`);\n }\n if (!apply) {\n console.log(\"Dry-run only. Re-run with --apply to supersede and delete vectors.\");\n console.log(\"Fact IDs:\");\n for (const id of supersededIds) console.log(` ${id}`);\n if (verifiedSkippedIds.length > 0) {\n console.log(\"Verified fact IDs left untouched:\");\n for (const id of verifiedSkippedIds) console.log(` ${id}`);\n }\n } else {\n console.log(`Vectors deleted: ${vectorDeleteCount}`);\n if (vectorDeleteErrors.length > 0) {\n console.warn(`Errors: ${vectorDeleteErrors.length}`);\n for (const e of vectorDeleteErrors.slice(0, 10)) console.warn(` - ${e}`);\n process.exitCode = 2;\n }\n }\n }),\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"register-storage-maintenance.js","names":[],"sources":["../../../../cli/commands/manage/register-storage-maintenance.ts"],"sourcesContent":["/**\n * CLI registration functions for management commands.\n * Extracted from cli/register.ts lines 290-1552.\n */\n\nimport { existsSync, unlinkSync } from \"node:fs\";\nimport { isPreStoreGuardBlocked } from \"../../../backends/facts-db/crud.js\";\nimport { computeAdaptivePressureDelayMs } from \"../../../services/adaptive-catch-up-pacing.js\";\nimport {\n is403QuotaOrRateLimitLike,\n is429OrWrapped,\n is500OrWrapped,\n isConnectionErrorLike,\n parseRetryAfterMs,\n} from \"../../../services/chat.js\";\nimport { migrateEmbeddings } from \"../../../services/embedding-migration.js\";\nimport { AllEmbeddingProvidersFailed } from \"../../../services/embeddings.js\";\nimport { buildVectorlessSloRepairRecommendation } from \"../../../services/entity-enrichment-adaptive.js\";\nimport { capturePluginError } from \"../../../services/error-reporter.js\";\nimport { recordMaintenanceTimestamp } from \"../../../services/maintenance-timestamp.js\";\nimport { countPendingReviewBacklogs } from \"../../../services/pending-review-digest.js\";\nimport {\n collectVectorBackendObservability,\n type VectorBackendObservability,\n} from \"../../../services/vector-backend-observability.js\";\nimport { appendVectorLifecycleAuditEvent } from \"../../../services/vector-lifecycle-audit.js\";\nimport { deleteVectorsForFactIds } from \"../../../services/vector-maintenance.js\";\nimport type { MemoryEntry } from \"../../../types/memory.js\";\nimport { embedCallWithTimeoutAndRetry } from \"../../../utils/embed-call.js\";\nimport { getEnv } from \"../../../utils/env-manager.js\";\nimport { type CommanderOptsParent, readHybridMemVerbose } from \"../../global-verbose.js\";\nimport { approxIntervalMs, type Chainable, withExit } from \"../../shared.js\";\nimport type { ManageBindings } from \"./bindings.js\";\nimport { runMaintenanceHeartbeat } from \"./maintenance-heartbeat.js\";\nimport {\n countImplicitFeedbackTrajectorySignals,\n defaultReindexCheckpointPath,\n parseBoundedFloatOption,\n parseBoundedIntOption,\n readReindexCheckpoint,\n recordStorageGrowthSample,\n writeReindexCheckpoint,\n} from \"./storage-stats-helpers.js\";\n\ntype FactsDbWithBatch = {\n getBatch: (\n offset: number,\n limit: number,\n opts: { includeSuperseded: boolean },\n ) => Array<{ id: string; text: string; category?: string; source?: string }>;\n getAll?: (opts: { includeSuperseded: boolean }) => Array<{ id: string }>;\n};\n\ntype FactsDbWithRawDb = {\n getRawDb: () => {\n prepare: (sql: string) => { get: (id: string) => unknown };\n };\n};\n\nfunction printVectorBackendObservabilitySummary(observability: VectorBackendObservability): void {\n console.log(`Captured: ${observability.capturedAt}`);\n if (observability.vectorDb.path) console.log(`Vector path: ${observability.vectorDb.path}`);\n console.log(\n `VectorDB: initialized=${String(observability.vectorDb.initialized)} lanceAvailable=${String(observability.vectorDb.lanceAvailable)} openReaders=${observability.vectorDb.openReaders ?? \"n/a\"} optimizing=${String(observability.vectorDb.optimizing)}`,\n );\n if (observability.vectorDb.degraded?.active) {\n console.log(\n `Degraded mode: active reason=${observability.vectorDb.degraded.reason ?? \"unknown\"} since=${observability.vectorDb.degraded.sinceEpochMs ?? \"n/a\"}`,\n );\n }\n if (observability.vectorDb.search) {\n console.log(\n `Search: active=${observability.vectorDb.search.active} peak=${observability.vectorDb.search.peak} total=${observability.vectorDb.search.total} lastResults=${observability.vectorDb.search.lastResultCount}`,\n );\n }\n if (observability.vectorDb.cache) {\n console.log(\n `Cache: rows=${observability.vectorDb.cache.rows ?? \"n/a\"} lastFilterKey=${observability.vectorDb.cache.lastFilterKey ?? \"n/a\"} lastRemoved=${observability.vectorDb.cache.lastRemovedRows}`,\n );\n }\n if (observability.vectorDb.lastOptimize) {\n console.log(\n `Last optimize: compacted=${observability.vectorDb.lastOptimize.compacted} removed=${observability.vectorDb.lastOptimize.removedFragments} freedBytes=${observability.vectorDb.lastOptimize.freedBytes}`,\n );\n }\n if (observability.lancedb.basePath) {\n console.log(\n `LanceDB: basePath=${observability.lancedb.basePath} totalSizeBytes=${observability.lancedb.totalSizeBytes ?? \"n/a\"}`,\n );\n for (const table of observability.lancedb.tables) {\n console.log(\n ` table=${table.name} exists=${table.exists} rows=${table.rowCount ?? \"n/a\"} sizeBytes=${table.sizeBytes ?? \"n/a\"}`,\n );\n }\n }\n}\n\nfunction hasGetBatch(db: object): db is object & FactsDbWithBatch {\n return \"getBatch\" in db && typeof (db as { getBatch?: unknown }).getBatch === \"function\";\n}\n\nfunction hasGetRawDb(db: object): db is object & FactsDbWithRawDb {\n return \"getRawDb\" in db && typeof (db as { getRawDb?: unknown }).getRawDb === \"function\";\n}\n\nfunction isEmbeddingProviderServerError(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n if (is500OrWrapped(err)) return true;\n if (err instanceof AllEmbeddingProvidersFailed) {\n return err.causes.some((cause) => is500OrWrapped(cause));\n }\n return false;\n}\n\nfunction isEmbeddingProviderRateLimitError(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n if (is429OrWrapped(err) || is403QuotaOrRateLimitLike(err)) return true;\n if (err instanceof AllEmbeddingProvidersFailed) {\n return err.causes.some(\n (cause) => cause instanceof Error && (is429OrWrapped(cause) || is403QuotaOrRateLimitLike(cause)),\n );\n }\n return false;\n}\n\nfunction isEmbeddingProviderTransientError(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n if (isEmbeddingProviderRateLimitError(err) || is500OrWrapped(err) || isConnectionErrorLike(err)) return true;\n if (err instanceof AllEmbeddingProvidersFailed) {\n return err.causes.some(\n (cause) =>\n cause instanceof Error &&\n (is429OrWrapped(cause) ||\n is403QuotaOrRateLimitLike(cause) ||\n is500OrWrapped(cause) ||\n isConnectionErrorLike(cause)),\n );\n }\n return false;\n}\n\nfunction parseEmbeddingRetryAfterMs(err: unknown): number | undefined {\n if (err instanceof Error) {\n const fromTop = parseRetryAfterMs(err);\n if (fromTop !== undefined) return fromTop;\n }\n if (err instanceof AllEmbeddingProvidersFailed) {\n for (const cause of err.causes) {\n if (!(cause instanceof Error)) continue;\n const retryAfterMs = parseRetryAfterMs(cause);\n if (retryAfterMs !== undefined) return retryAfterMs;\n }\n }\n return undefined;\n}\n\nfunction sleep(ms: number): Promise<void> {\n if (ms <= 0) return Promise.resolve();\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function registerManageStorageMaintenance(mem: Chainable, b: ManageBindings): void {\n const {\n factsDb,\n vectorDb,\n aliasDb,\n versionInfo,\n embeddings,\n mergeResults: merge,\n getMemoryCategories,\n cfg,\n runCompaction,\n tieringEnabled,\n ctx,\n listCommands,\n auditStore,\n runExport,\n } = b;\n\n const tierCompactCmd = mem\n .command(\"tier-compact\")\n .description(\n \"Tier compaction: move facts between hot/warm/cold/structural (does NOT shrink LanceDB — see vectordb-optimize)\",\n )\n .option(\"--dry-run\", \"Preview tier changes without mutating facts\");\n // Keep the legacy `compact` name working as a deprecated alias so existing\n // cron jobs and operator muscle memory don't break (#1249).\n tierCompactCmd.alias?.(\"compact\");\n tierCompactCmd.action(\n withExit(async (opts?: { dryRun?: boolean }) => {\n let counts;\n try {\n counts = await runCompaction({ apply: opts?.dryRun !== true });\n } catch (err) {\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"cli\",\n operation: \"compact\",\n });\n throw err;\n }\n // Record timestamp after successful compaction (not for dry-run)\n if (opts?.dryRun !== true && ctx.resolvedSqlitePath) {\n recordMaintenanceTimestamp(ctx.resolvedSqlitePath, \".compact_last_run\");\n }\n const mode = opts?.dryRun ? \"dry-run\" : \"apply\";\n const changed = counts.changed == null ? \"\" : ` changed=${counts.changed}/${counts.examined ?? \"?\"}`;\n console.log(\n `Tier compaction (${mode}): hot=${counts.hot} warm=${counts.warm} cold=${counts.cold} structural=${counts.structural}${changed}`,\n );\n }),\n );\n\n mem\n .command(\"retier\")\n .description(\"Preview or apply memory tier migration using current tiering rules\")\n .option(\"--apply\", \"Apply mutations. Omit for dry-run\")\n .action(\n withExit(async (opts?: { apply?: boolean }) => {\n const report = await runCompaction({ apply: opts?.apply === true });\n const mode = opts?.apply ? \"apply\" : \"dry-run\";\n console.log(\n `Retier (${mode}): examined=${report.examined ?? \"?\"} changed=${report.changed ?? \"?\"} hot=${report.hot} warm=${report.warm} cold=${report.cold} structural=${report.structural}`,\n );\n if (!opts?.apply) console.log(\"Dry-run only. Re-run with --apply to mutate fact tiers.\");\n }),\n );\n\n mem\n .command(\"vectordb-optimize\")\n .description(\n \"Compact LanceDB fragments and prune old versions (stats.freedBytes may be 0 while layout still improves). \" +\n \"Disk size in `stats` is the whole Lance directory — remove stray `memories_reindex_*` / `memories_old_*` folders after a failed re-index swap if present.\",\n )\n .option(\"--older-than-days <days>\", \"Remove versions older than this many days (default: 7)\", \"7\")\n .action(\n withExit(async (opts?: { olderThanDays?: string }) => {\n const parsedDays = Number.parseInt(opts?.olderThanDays ?? \"7\", 10);\n if (!Number.isFinite(parsedDays) || parsedDays < 0) {\n console.error(\"error: --older-than-days must be a finite number ≥ 0\");\n process.exitCode = 1;\n return;\n }\n const olderThanMs = parsedDays * 24 * 60 * 60 * 1000;\n try {\n const stats = await vectorDb.optimize(olderThanMs);\n // Record timestamp after successful optimization\n if (ctx.resolvedSqlitePath) {\n recordMaintenanceTimestamp(ctx.resolvedSqlitePath, \".vectordb_optimize_last_run\");\n }\n console.log(\n `LanceDB: compacted ${stats.compacted} fragments, pruned ${stats.removedFragments} fragment(s), freed ${stats.freedBytes} bytes`,\n );\n } catch (err) {\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n subsystem: \"cli\",\n operation: \"vectordb-optimize\",\n });\n throw err;\n }\n }),\n );\n\n mem\n .command(\"vectordb-health\")\n .description(\n \"Low-cost LanceDB/Arrow/native memory health snapshot (RSS/native estimate, FD groups, cache/search bounds, table rows/sizes)\",\n )\n .option(\"--json\", \"Emit JSON\")\n .action(\n withExit(async (opts?: { json?: boolean }) => {\n let lanceBytes: number | null = null;\n try {\n const sizes = await Promise.resolve(ctx.richStatsExtras?.getStorageSizes());\n if (sizes && typeof sizes.lanceBytes === \"number\") lanceBytes = sizes.lanceBytes;\n } catch {\n // keep observability cheap/best-effort; omit lanceBytes on failure\n }\n const observability = await collectVectorBackendObservability({\n vectorDb,\n resolvedLancePath: ctx.resolvedLancePath,\n lanceBytes,\n });\n if (opts?.json) {\n console.log(JSON.stringify(observability, null, 2));\n return;\n }\n console.log(\"=== Vector Backend Health ===\");\n printVectorBackendObservabilitySummary(observability);\n }),\n );\n\n mem\n .command(\"record-storage-sample\")\n .description(\n \"Record one storage_growth_history row per UTC day (SQLite + Lance sizes). Use with daily cron so audit-health can compute 7d deltas.\",\n )\n .option(\"--force\", \"Bypass the once-per-UTC-day guard and record a fresh sample\")\n .option(\"--dry-run\", \"Compute and print the sample payload without writing a row\")\n .option(\"--json\", \"Emit parseable JSON\")\n .action(\n withExit(async (opts?: { force?: boolean; dryRun?: boolean; json?: boolean }) => {\n let lanceBytes: number | null = null;\n try {\n const sizes = await Promise.resolve(ctx.richStatsExtras?.getStorageSizes());\n if (sizes && typeof sizes.lanceBytes === \"number\") lanceBytes = sizes.lanceBytes;\n } catch (err) {\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"record-storage-sample-lance\",\n severity: \"info\",\n subsystem: \"cli\",\n });\n }\n const r = recordStorageGrowthSample(factsDb, lanceBytes, {\n force: opts?.force,\n dryRun: opts?.dryRun,\n });\n if (opts?.json) {\n // Emit cron-harness-compatible marker to stderr so hm_step can still\n // classify skips, while keeping stdout clean for JSON parsers.\n let marker = \"\";\n if (r.status === \"recorded\") {\n marker = \"status=success_recorded\";\n } else if (r.status === \"dry_run\") {\n marker = \"status=success_dry_run\";\n } else if (r.reason === \"storage_unavailable\") {\n marker = \"status=skipped_storage_unavailable\";\n } else {\n marker = \"status=skipped_already_sampled_today\";\n }\n console.error(`record-storage-sample: ${marker}`);\n console.log(\n JSON.stringify(\n {\n schemaVersion: 1,\n status: r.status,\n reason: r.reason,\n inserted: r.inserted,\n force: !!opts.force,\n dryRun: !!opts.dryRun,\n sampleId: r.sampleId,\n recordedAt: r.recordedAt,\n sample: r.sample,\n },\n null,\n 2,\n ),\n );\n return;\n }\n if (r.status === \"recorded\") {\n console.log(\n `record-storage-sample: inserted row (unix=${r.recordedAt}; sampleId=${r.sampleId ?? \"n/a\"}) status=success_recorded`,\n );\n return;\n }\n if (r.status === \"dry_run\") {\n console.log(\n `record-storage-sample: dry-run (unix=${r.sample.recordedAt}; sqliteBytes=${r.sample.sqliteBytes ?? \"null\"}; lanceBytes=${r.sample.lanceBytes ?? \"null\"}; linkCount=${r.sample.linkCount}; factCount=${r.sample.factCount}) status=success_dry_run`,\n );\n return;\n }\n console.log(\n r.reason === \"storage_unavailable\"\n ? `record-storage-sample: skipped (storage database unavailable; unix=${r.recordedAt}) status=skipped_storage_unavailable`\n : `record-storage-sample: skipped (already sampled today UTC; unix=${r.recordedAt}) status=skipped_already_sampled_today`,\n );\n }),\n );\n\n mem\n .command(\"stats\")\n .description(\n \"Show memory statistics. Rich output includes procedures, rules, patterns, directives, graph, and operational info. Use --efficiency for tiers, sources, and token estimates.\",\n )\n .option(\n \"--efficiency\",\n \"Add estimated stored tokens and a short note (rich mode); without rich stats, prints a compact efficiency-only report\",\n )\n .option(\"--brief\", \"Show only storage and decay counts (legacy-style)\")\n .action(\n withExit(async (opts?: { efficiency?: boolean; brief?: boolean }) => {\n const efficiency = opts?.efficiency ?? false;\n const brief = opts?.brief ?? false;\n const sqlCount = factsDb.count();\n let lanceCount = 0;\n try {\n lanceCount = await vectorDb.count();\n } catch (err) {\n capturePluginError(err instanceof Error ? err : new Error(String(err)), {\n operation: \"vector-count\",\n severity: \"info\",\n subsystem: \"cli\",\n });\n // vectorDb may be unavailable\n }\n const breakdown = factsDb.statsBreakdownByTier();\n const expired = factsDb.countExpired();\n\n const extras = ctx.richStatsExtras;\n const useRich = !brief && extras;\n\n if (useRich) {\n const byCategory = factsDb.statsBreakdownByCategory();\n const procedures = factsDb.proceduresCount();\n const proceduresValidated = factsDb.proceduresValidatedCount();\n const proceduresPromoted = factsDb.proceduresPromotedCount();\n const directives = factsDb.directivesCount();\n const rules = byCategory.rule ?? 0;\n const patterns = byCategory.pattern ?? 0;\n const metaPatterns = factsDb.metaPatternsCount();\n const links = factsDb.linksCount();\n const entities = factsDb.entityCount();\n const topEntitiesFiltered = factsDb.topEntitiesFiltered(5, ctx.cfg.entityExtraction.stopWords);\n const categoriesConfigured = getMemoryCategories();\n const uniqueInMemory = factsDb.uniqueMemoryCategories();\n const credentials = extras.getCredentialsCount();\n const proposalsPending = extras.getProposalsPending();\n const proposalsAvailable = extras.getProposalsAvailable();\n const pendingReview = countPendingReviewBacklogs(ctx.cfg, factsDb);\n const walPending = await extras.getWalPending();\n const timestamps = extras.getLastRunTimestamps();\n const sizes = await extras.getStorageSizes();\n\n const { reflectionPatternsCount, reflectionRulesCount } = factsDb.statsReflection();\n const selfCorrectionCount = factsDb.selfCorrectionIncidentsCount();\n const languageKeywordsCount = factsDb.languageKeywordsCount();\n\n const activeFacts = factsDb.getCount();\n const supersededFacts = factsDb.countSupersededFacts();\n const canonicalEmbeddings = factsDb.countCanonicalEmbeddings();\n const vectorless = factsDb.countVectorlessActiveFacts();\n const vectorlessBySource = factsDb.vectorlessActiveFactsBySource(5);\n const procedureTriage = factsDb.triageProcedures({ status: \"validated\", notPromoted: true, limit: 10_000 });\n const unresolvedContradictions = factsDb.contradictionsCount();\n const verifiedFacts = factsDb.countVerifiedFacts();\n const activity = factsDb.recentActivity();\n const decayBreakdown = factsDb.statsBreakdownByDecayClass();\n const activeDecayTotal = Object.values(decayBreakdown).reduce((sum, count) => sum + count, 0);\n const stablePermanentCount = (decayBreakdown.stable ?? 0) + (decayBreakdown.permanent ?? 0);\n const stablePermanentRatio = activeDecayTotal > 0 ? stablePermanentCount / activeDecayTotal : 0;\n const sourceBreakdown = factsDb.statsBySource();\n const dailyWrites = factsDb.statsDailyWrites().slice(0, 10);\n const implicitFeedbackSignals = countImplicitFeedbackTrajectorySignals(factsDb);\n const cronJobs = extras.getCronJobsStatus?.() ?? [];\n\n const lanceDelta = sqlCount - lanceCount;\n const lanceAbs = Math.abs(lanceDelta);\n const lanceDen = Math.max(sqlCount, lanceCount, 1);\n const lanceDeltaSignificant = lanceAbs > 100 && lanceAbs / lanceDen > 0.05;\n const totalFacts = sqlCount;\n const canonicalDelta = totalFacts - canonicalEmbeddings;\n const canonicalAbs = Math.abs(canonicalDelta);\n const canonicalDen = Math.max(totalFacts, canonicalEmbeddings, 1);\n const canonicalDeltaSignificant = canonicalAbs > 100 && canonicalAbs / canonicalDen > 0.05;\n\n console.log(\"=== Memory Statistics (rich) ===\");\n console.log(`Schema version: ${versionInfo.schemaVersion}`);\n console.log(`Plugin version: ${versionInfo.pluginVersion}`);\n console.log(`Memory Manager: ${versionInfo.memoryManagerVersion}`);\n console.log(\"\");\n console.log(`Total facts (SQLite): ${sqlCount}`);\n console.log(\n `Active facts: ${activeFacts}; superseded: ${supersededFacts}; expired pending prune: ${expired}`,\n );\n console.log(\n `Total vectors (LanceDB): ${lanceCount} (canonical embeddings in SQLite: ${canonicalEmbeddings})`,\n );\n console.log(`Vectorless active non-kv facts: ${vectorless}`);\n if (vectorlessBySource.length > 0) {\n console.log(`Vectorless by source: ${vectorlessBySource.map((r) => `${r.source}=${r.count}`).join(\", \")}`);\n }\n if (lanceDeltaSignificant || canonicalDeltaSignificant) {\n console.log(\n ` Health: SQLite facts ${sqlCount} vs LanceDB vectors ${lanceCount} (Δ=${lanceDelta}); total facts ${totalFacts} vs canonical embedding rows ${canonicalEmbeddings} (Δ=${canonicalDelta}). Run 'openclaw hybrid-mem re-index' if you switched embedding model or after a large backfill.`,\n );\n }\n console.log(\"\");\n const proceduresNote = procedures === 0 ? \" (run extract-procedures to populate)\" : \"\";\n console.log(\n `Procedures: ${procedures} (validated: ${proceduresValidated}, promoted: ${proceduresPromoted}, blocked: ${procedureTriage.summary.total}${procedureTriage.summary.topReason ? ` by ${procedureTriage.summary.topReason}` : \"\"})${proceduresNote}`,\n );\n console.log(\n `Pending review (proposals/procedures/tools/crystal/verified): ${pendingReview.persona}/${pendingReview.procedures}/${pendingReview.tools}/${pendingReview.crystallization}/${pendingReview.verified}`,\n );\n console.log(`Rules: ${rules}`);\n console.log(`Patterns: ${patterns}`);\n console.log(`Implicit-feedback signals: ${implicitFeedbackSignals}`);\n console.log(`Meta-patterns: ${metaPatterns}`);\n console.log(`Directives: ${directives}`);\n console.log(`Reflection (patterns/rules): ${reflectionPatternsCount}/${reflectionRulesCount}`);\n console.log(`Self-correction incidents: ${selfCorrectionCount}`);\n console.log(`Language keywords: ${languageKeywordsCount}`);\n if (dailyWrites.length > 0) {\n console.log(\"Per-source writes/day (latest):\");\n for (const row of dailyWrites) {\n const dropped = row.dropped > 0 ? `, dropped=${row.dropped}` : \"\";\n const evicted = row.evicted > 0 ? `, evicted=${row.evicted}` : \"\";\n console.log(` ${row.day} ${row.source}: count=${row.count}${dropped}${evicted}`);\n }\n }\n if (unresolvedContradictions > 0) {\n console.log(\n `Contradictions (unresolved): ${unresolvedContradictions} — run 'openclaw hybrid-mem resolve-contradictions'`,\n );\n } else {\n console.log(\"Contradictions (unresolved): 0\");\n }\n if (ctx.cfg.verification?.enabled) {\n console.log(`Verified facts: ${verifiedFacts}`);\n }\n console.log(\"\");\n console.log(`Graph (links/entities): ${links}/${entities}`);\n if (topEntitiesFiltered.length > 0) {\n const formatted = topEntitiesFiltered.map((row) => `${row.entity}=${row.count}`).join(\", \");\n console.log(`Top entities (filtered): ${formatted}`);\n }\n console.log(\n `Credentials (vaulted): ${credentials}${\n credentials === 0 && !ctx.cfg.credentials.enabled ? \" (vault off in effective config; counts stay 0)\" : \"\"\n }`,\n );\n const proposalsLine = proposalsAvailable\n ? `Proposals (pending): ${proposalsPending}${proposalsPending === 0 ? \" (run generate-proposals to create)\" : \"\"}`\n : ctx.cfg.personaProposals.enabled\n ? \"Proposals (pending): — (proposals store unavailable)\"\n : \"Proposals (pending): — (persona proposals off in effective config; see hybrid-mem config if file still shows enabled)\";\n console.log(proposalsLine);\n console.log(`WAL (pending distill): ${walPending}`);\n console.log(\"\");\n const configuredSet = new Set(categoriesConfigured);\n const inMemorySet = new Set(uniqueInMemory);\n const unknownCategories = uniqueInMemory.filter((category: string) => !configuredSet.has(category));\n const configuredOnlyCategories = categoriesConfigured.filter(\n (category: string) => !inMemorySet.has(category),\n );\n console.log(\n `Categories configured: ${categoriesConfigured.length} [${categoriesConfigured.slice(0, 3).join(\", \")}...]`,\n );\n console.log(`Categories in memory: ${uniqueInMemory.length} [${uniqueInMemory.slice(0, 3).join(\", \")}...]`);\n if (unknownCategories.length > 0) {\n console.log(\n `Discovered/unknown categories: ${unknownCategories.length} [${unknownCategories.join(\", \")}] — run 'openclaw hybrid-mem categories audit' and remap or promote them.`,\n );\n } else {\n console.log(\"Discovered/unknown categories: 0\");\n }\n if (configuredOnlyCategories.length > 0) {\n console.log(\n `Configured categories with no active facts: ${configuredOnlyCategories.length} [${configuredOnlyCategories.join(\", \")}]`,\n );\n }\n console.log(\"\");\n console.log(\n `Breakdown by tier: hot=${breakdown.hot}, warm=${breakdown.warm}, cold=${breakdown.cold}, structural=${breakdown.structural ?? 0}`,\n );\n const decayParts = Object.entries(decayBreakdown).sort((a, b) => b[1] - a[1]);\n if (decayParts.length > 0) {\n const summary = decayParts\n .map(\n ([k, v]) => `${k}=${v} (${activeDecayTotal > 0 ? ((v / activeDecayTotal) * 100).toFixed(1) : \"0.0\"}%)`,\n )\n .join(\", \");\n console.log(`Breakdown by decay: ${summary}`);\n console.log(\n `Decay stickiness: stable+permanent=${stablePermanentCount}/${activeDecayTotal} (${(stablePermanentRatio * 100).toFixed(1)}%)`,\n );\n if (stablePermanentRatio > 0.6) {\n console.log(\n \" Guidance: legacy stable/permanent ratio is high. Run `openclaw hybrid-mem decay reclassify --dry-run --stable-only` then `openclaw hybrid-mem decay reclassify --apply --stable-only`.\",\n );\n }\n }\n const topSources = Object.entries(sourceBreakdown)\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5);\n if (topSources.length > 0) {\n console.log(\n `Top sources (active): ${topSources.map(([s, c]) => `${s}=${c}`).join(\", \")} (of ${\n Object.keys(sourceBreakdown).length\n } sources)`,\n );\n }\n console.log(\"\");\n const oldestDays =\n activity.oldestActiveCreatedAtSec != null\n ? Math.max(0, Math.floor((Date.now() / 1000 - activity.oldestActiveCreatedAtSec) / 86400))\n : null;\n const newestAgeMin =\n activity.newestCreatedAtSec != null\n ? Math.max(0, Math.floor((Date.now() / 1000 - activity.newestCreatedAtSec) / 60))\n : null;\n console.log(\n `Recent activity: ${activity.last24h} new in 24h, ${activity.last7d} in 7d, ${activity.last30d} in 30d`,\n );\n if (newestAgeMin != null && oldestDays != null) {\n console.log(` Newest fact: ${newestAgeMin} min ago. Oldest active: ${oldestDays} days old.`);\n }\n console.log(\"\");\n console.log(`Last distill: ${timestamps.distill ?? \"(never)\"}`);\n console.log(`Last reflect: ${timestamps.reflect ?? \"(never)\"}`);\n console.log(`Last compact: ${timestamps.compact ?? \"(never)\"}`);\n console.log(`Last vectordb-optimize: ${timestamps.vectordbOptimize ?? \"(never)\"}`);\n console.log(\"\");\n if (sizes.sqliteBytes != null) console.log(`SQLite size: ${(sizes.sqliteBytes / 1024 / 1024).toFixed(2)} MB`);\n if (sizes.lanceBytes != null) console.log(`LanceDB size: ${(sizes.lanceBytes / 1024 / 1024).toFixed(2)} MB`);\n if (sizes.sqliteBytes != null && activeFacts > 0) {\n const bytesPerFact = sizes.sqliteBytes / activeFacts;\n console.log(`SQLite bytes per active fact: ${bytesPerFact.toFixed(0)}`);\n }\n if (sizes.sqliteBytes != null || sizes.lanceBytes != null) console.log(\"\");\n const vectorObservability = await collectVectorBackendObservability({\n vectorDb,\n resolvedLancePath: ctx.resolvedLancePath,\n lanceBytes: sizes.lanceBytes ?? null,\n });\n printVectorBackendObservabilitySummary(vectorObservability);\n console.log(\"\");\n if (efficiency) {\n const estimatedTokens = factsDb.estimateStoredTokens();\n console.log(\"--- Efficiency (token estimate) ---\");\n console.log(`Estimated stored tokens (all active tiers): ~${estimatedTokens}`);\n console.log(\"Note: Tiering and context scoping reduce tokens in the LLM vs raw store size.\");\n console.log(\"\");\n }\n if (cronJobs.length > 0) {\n const nowMs = Date.now();\n const dayMs = 86_400_000;\n const hourMs = 3_600_000;\n const noEmojiCron = getEnv(\"HYBRID_MEM_NO_EMOJI\") === \"1\";\n const staleLabel = noEmojiCron ? \"[WARN] stale\" : \"⚠ stale\";\n const fmtStaleWindow = (ms: number) =>\n ms >= dayMs ? `${Math.max(1, Math.round(ms / dayMs))}d` : `${Math.max(1, Math.round(ms / hourMs))}h`;\n console.log(`Cron jobs (hybrid-mem:*): ${cronJobs.length}`);\n for (const j of cronJobs) {\n const status = j.enabled ? \"enabled \" : \"disabled\";\n const sched = j.scheduleExpr ?? \"(no schedule)\";\n const last =\n j.lastRunAtMs != null ? `last ${Math.floor((nowMs - j.lastRunAtMs) / 3600000)}h ago` : \"last (never)\";\n const interval = approxIntervalMs(j.scheduleExpr);\n const stale = j.enabled && interval && (j.lastRunAtMs == null || nowMs - j.lastRunAtMs > interval * 1.5);\n const staleNote =\n stale && interval != null\n ? ` overdue (no run in >${fmtStaleWindow(interval * 1.5)} vs ~${fmtStaleWindow(interval)} schedule)`\n : \"\";\n const tail = stale ? ` ${staleLabel}${staleNote}` : \"\";\n console.log(` ${status} ${j.name.padEnd(30)} ${sched.padEnd(14)} ${last}${tail}`);\n }\n console.log(\"\");\n }\n } else if (efficiency) {\n const byTier = breakdown;\n const bySource = factsDb.statsBySource();\n const dailyWrites = factsDb.statsDailyWrites().slice(0, 10);\n const estimatedTokens = factsDb.estimateStoredTokens();\n console.log(\"=== Memory Efficiency Stats ===\");\n console.log(\n `Breakdown: hot=${byTier.hot}, warm=${byTier.warm}, cold=${byTier.cold}, structural=${byTier.structural ?? 0}`,\n );\n console.log(`Sources: ${Object.keys(bySource).length}`);\n for (const [src, count] of Object.entries(bySource).slice(0, 5)) {\n console.log(` ${src}: ${count}`);\n }\n if (dailyWrites.length > 0) {\n console.log(\"Per-source writes/day (latest):\");\n for (const row of dailyWrites) {\n const dropped = row.dropped > 0 ? `, dropped=${row.dropped}` : \"\";\n const evicted = row.evicted > 0 ? `, evicted=${row.evicted}` : \"\";\n console.log(` ${row.day} ${row.source}: count=${row.count}${dropped}${evicted}`);\n }\n }\n console.log(`Estimated tokens (all tiers): ~${estimatedTokens}`);\n console.log(\"\");\n console.log(\"Note: Tiering and scoping can significantly reduce token usage in LLM context.\");\n } else {\n const decayBreakdown = factsDb.statsBreakdownByDecayClass();\n const activeDecayTotal = Object.values(decayBreakdown).reduce((sum, count) => sum + count, 0);\n const stablePermanentCount = (decayBreakdown.stable ?? 0) + (decayBreakdown.permanent ?? 0);\n const stablePermanentRatio = activeDecayTotal > 0 ? stablePermanentCount / activeDecayTotal : 0;\n console.log(`Total facts (SQLite): ${sqlCount}`);\n console.log(`Total vectors (LanceDB): ${lanceCount}`);\n console.log(`Expired (prunable): ${expired}`);\n console.log(\n `Breakdown: hot=${breakdown.hot}, warm=${breakdown.warm}, cold=${breakdown.cold}, structural=${breakdown.structural ?? 0}`,\n );\n const decaySummary = Object.entries(decayBreakdown)\n .sort((a, b) => b[1] - a[1])\n .map(([k, v]) => `${k}=${v}`)\n .join(\", \");\n if (decaySummary.length > 0) {\n console.log(`Decay: ${decaySummary}`);\n console.log(\n `Decay stickiness (stable+permanent): ${stablePermanentCount}/${activeDecayTotal} (${(stablePermanentRatio * 100).toFixed(1)}%)`,\n );\n if (stablePermanentRatio > 0.6) {\n console.log(\n \"Guidance: run `openclaw hybrid-mem decay reclassify --dry-run --stable-only` then `openclaw hybrid-mem decay reclassify --apply --stable-only`.\",\n );\n }\n }\n }\n }),\n );\n\n mem\n .command(\"reembed-vectorless\")\n .description(\"Embed active non-kv facts that lack canonical embeddings (dry-run by default)\")\n .option(\"--limit <n>\", \"Maximum vectorless facts to process\", \"100\")\n .option(\"--source <s>\", \"Only process facts from this source\")\n .option(\"--apply\", \"Actually embed and write LanceDB/fact_embeddings rows; default is dry-run\")\n .option(\"--batch-size <n>\", \"Embedding batch size\", \"40\")\n .option(\"--batch-delay-ms <n>\", \"Delay between adaptive batches in ms (default 150)\", \"150\")\n .option(\n \"--adaptive-catch-up\",\n \"Enable adaptive pacing (ramps up on healthy batches; backs off on provider/rate-limit/store pressure)\",\n )\n .option(\n \"--max-embed-failures <n>\",\n \"Circuit-break after this many consecutive embed failures and exit 1; prevents indefinite stall on provider outage (default: 5)\",\n \"5\",\n )\n .option(\"-v, --verbose\", \"Emit periodic progress heartbeat for long runs\")\n .option(\"--json\", \"Emit JSON\")\n .action(\n withExit(\n async (\n opts?: {\n limit?: string;\n source?: string;\n apply?: boolean;\n batchSize?: string;\n batchDelayMs?: string;\n adaptiveCatchUp?: boolean;\n maxEmbedFailures?: string;\n verbose?: boolean;\n json?: boolean;\n },\n cmd?: CommanderOptsParent,\n ) => {\n const limit = Number.parseInt(opts?.limit ?? \"100\", 10);\n const batchSize = Number.parseInt(opts?.batchSize ?? \"40\", 10);\n const batchDelayMs = Number.parseInt(opts?.batchDelayMs ?? \"150\", 10);\n const adaptiveCatchUp = opts?.adaptiveCatchUp === true;\n const maxEmbedFailures = Number.parseInt(opts?.maxEmbedFailures ?? \"5\", 10);\n const verbose = !!opts?.verbose || readHybridMemVerbose(cmd);\n const adaptiveMinBatchSize = 1;\n const adaptiveMaxBatchSize = 200;\n const adaptiveMinDelayMs = 0;\n const adaptiveMaxDelayMs = 5_000;\n const adaptiveBackoffMinDelayMs = 50;\n const adaptiveBatchSizeStep = 5;\n const adaptiveDelayStepMs = 25;\n const adaptiveSuccessStreakForRampUp = 2;\n if (!Number.isFinite(limit) || limit < 1) {\n console.error(\"error: --limit must be a positive integer\");\n process.exitCode = 1;\n return;\n }\n if (!Number.isFinite(batchSize) || batchSize < 1) {\n console.error(\"error: --batch-size must be a positive integer\");\n process.exitCode = 1;\n return;\n }\n if (!Number.isFinite(batchDelayMs) || batchDelayMs < 0) {\n console.error(\"error: --batch-delay-ms must be a non-negative integer\");\n process.exitCode = 1;\n return;\n }\n if (!Number.isFinite(maxEmbedFailures) || maxEmbedFailures < 1) {\n console.error(\"error: --max-embed-failures must be a positive integer\");\n process.exitCode = 1;\n return;\n }\n const before = factsDb.countVectorlessActiveFacts(opts?.source);\n const globalVectorlessBefore = factsDb.countVectorlessActiveFacts();\n const candidates = factsDb.listVectorlessActiveFacts({ limit, source: opts?.source });\n const errors: string[] = [];\n let embedded = 0;\n let skipped = 0;\n let storeFailures = 0;\n let embedFailures = 0;\n const startedAtMs = Date.now();\n const baselineBatchSize = batchSize;\n const baselineDelayMs = batchDelayMs;\n let effectiveBatchSize = batchSize;\n let effectiveDelayMs = batchDelayMs;\n if (adaptiveCatchUp) {\n effectiveBatchSize = Math.max(adaptiveMinBatchSize, Math.min(adaptiveMaxBatchSize, batchSize));\n effectiveDelayMs = Math.max(adaptiveMinDelayMs, Math.min(adaptiveMaxDelayMs, batchDelayMs));\n }\n const adaptiveAdjustments: Array<{\n reason: \"pressure\" | \"ramp-up\";\n previousBatchSize: number;\n previousDelayMs: number;\n batchSize: number;\n delayMs: number;\n batchPressureSignals: number;\n batchRateLimited: number;\n batchTransientFailures: number;\n batchStoreFailures: number;\n batchEmbedFailures: number;\n retryAfterMs?: number;\n batchNumber: number;\n }> = [];\n let successStreak = 0;\n let processed = 0;\n let batchNumber = 0;\n let providerCircuitBreak = false;\n let providerCircuitBreakCause: string = \"max_failures\";\n let consecutiveEmbedFailures = 0;\n let aborted = false;\n if (opts?.apply) {\n await runMaintenanceHeartbeat(\n \"reembed-vectorless\",\n verbose,\n async () => {\n await vectorDb.runWithAutoOptimizePaused(async () => {\n let offset = 0;\n while (offset < candidates.length) {\n if (providerCircuitBreak) break;\n batchNumber++;\n const batch = candidates.slice(offset, offset + effectiveBatchSize);\n let vectors: (number[] | null)[];\n let batchPressureSignals = 0;\n let batchRateLimited = 0;\n let batchTransientFailures = 0;\n let batchStoreFailures = 0;\n let batchEmbedFailures = 0;\n let batchRetryAfterMs: number | undefined;\n try {\n vectors = await embedCallWithTimeoutAndRetry(\n () => embeddings.embedBatch(batch.map((fact) => fact.text)),\n `reembed-vectorless:batch-${batchNumber}`,\n );\n consecutiveEmbedFailures = 0;\n } catch (batchErr) {\n const batchRateLimitedErr = isEmbeddingProviderRateLimitError(batchErr);\n const batchTransientErr = isEmbeddingProviderTransientError(batchErr);\n batchRetryAfterMs = parseEmbeddingRetryAfterMs(batchErr);\n if (batchRateLimitedErr) batchRateLimited++;\n if (batchTransientErr) batchTransientFailures++;\n if (batchRateLimitedErr || batchTransientErr || batchRetryAfterMs !== undefined) {\n batchPressureSignals++;\n }\n if (isEmbeddingProviderServerError(batchErr)) {\n providerCircuitBreak = true;\n providerCircuitBreakCause = \"provider_5xx\";\n aborted = true;\n errors.push(\n `batch ${batchNumber}: embed failed with provider 5xx; fast-failing to avoid per-fact fallback stall — ${String(batchErr)}`,\n );\n break;\n }\n vectors = [];\n for (const fact of batch) {\n try {\n vectors.push(\n await embedCallWithTimeoutAndRetry(\n () => embeddings.embed(fact.text),\n `reembed-vectorless:fact-${fact.id}`,\n ),\n );\n consecutiveEmbedFailures = 0;\n } catch (singleErr) {\n errors.push(`fact ${fact.id}: embed failed — ${String(singleErr)}`);\n embedFailures++;\n batchEmbedFailures++;\n vectors.push(null);\n const rateLimited = isEmbeddingProviderRateLimitError(singleErr);\n const transient = isEmbeddingProviderTransientError(singleErr);\n const retryAfterMs = parseEmbeddingRetryAfterMs(singleErr);\n if (rateLimited) batchRateLimited++;\n if (transient) batchTransientFailures++;\n if (rateLimited || transient || retryAfterMs !== undefined) {\n batchPressureSignals++;\n }\n if (retryAfterMs !== undefined) {\n batchRetryAfterMs = Math.max(batchRetryAfterMs ?? 0, retryAfterMs);\n }\n if (isEmbeddingProviderServerError(singleErr)) {\n providerCircuitBreak = true;\n providerCircuitBreakCause = \"provider_5xx\";\n aborted = true;\n break;\n }\n consecutiveEmbedFailures++;\n if (consecutiveEmbedFailures >= maxEmbedFailures) {\n providerCircuitBreak = true;\n providerCircuitBreakCause = \"max_failures\";\n aborted = true;\n break;\n }\n }\n }\n }\n for (let i = 0; i < batch.length; i++) {\n if (providerCircuitBreak && i >= vectors.length) break;\n const fact = batch[i];\n const vec = vectors[i];\n if (!vec || vec.length === 0) {\n skipped++;\n processed++;\n continue;\n }\n try {\n try {\n await vectorDb.delete(fact.id);\n } catch {\n // Missing Lance row is the normal case for vectorless repair.\n }\n await vectorDb.store({\n id: fact.id,\n text: fact.text,\n vector: vec,\n importance: 0.5,\n category: fact.category,\n });\n factsDb.storeEmbedding(\n fact.id,\n embeddings.modelName,\n \"canonical\",\n new Float32Array(vec),\n vec.length,\n );\n factsDb.setEmbeddingModel(fact.id, embeddings.modelName);\n embedded++;\n } catch (err) {\n errors.push(`fact ${fact.id}: store failed — ${String(err)}`);\n storeFailures++;\n batchStoreFailures++;\n skipped++;\n } finally {\n processed++;\n }\n }\n if (adaptiveCatchUp) {\n const hadPressure = batchPressureSignals > 0 || batchStoreFailures > 0 || batchEmbedFailures > 0;\n const previousBatchSize = effectiveBatchSize;\n const previousDelayMs = effectiveDelayMs;\n if (hadPressure) {\n successStreak = 0;\n effectiveBatchSize = Math.max(adaptiveMinBatchSize, Math.floor(effectiveBatchSize / 2));\n effectiveDelayMs = computeAdaptivePressureDelayMs({\n currentDelayMs: effectiveDelayMs,\n batchRetryAfterMs,\n maxAdaptiveDelayMs: adaptiveMaxDelayMs,\n backoffMinDelayMs: adaptiveBackoffMinDelayMs,\n });\n } else {\n successStreak++;\n if (successStreak >= adaptiveSuccessStreakForRampUp) {\n successStreak = 0;\n effectiveBatchSize = Math.min(\n adaptiveMaxBatchSize,\n effectiveBatchSize + adaptiveBatchSizeStep,\n );\n effectiveDelayMs = Math.max(adaptiveMinDelayMs, effectiveDelayMs - adaptiveDelayStepMs);\n }\n }\n if (previousBatchSize !== effectiveBatchSize || previousDelayMs !== effectiveDelayMs) {\n adaptiveAdjustments.push({\n reason: hadPressure ? \"pressure\" : \"ramp-up\",\n previousBatchSize,\n previousDelayMs,\n batchSize: effectiveBatchSize,\n delayMs: effectiveDelayMs,\n batchPressureSignals,\n batchRateLimited,\n batchTransientFailures,\n batchStoreFailures,\n batchEmbedFailures,\n retryAfterMs: batchRetryAfterMs,\n batchNumber,\n });\n }\n }\n offset += batch.length;\n if (adaptiveCatchUp && offset < candidates.length && !providerCircuitBreak) {\n await sleep(effectiveDelayMs);\n }\n }\n });\n },\n {\n progressSupplier: () =>\n `stage=embed-and-store; processed=${processed}/${candidates.length}; remaining=${Math.max(0, candidates.length - processed)}; embedded=${embedded}; skipped=${skipped}; embedFailures=${embedFailures}; storeFailures=${storeFailures}; batch=${batchNumber}; batchSize=${effectiveBatchSize}; delayMs=${effectiveDelayMs}`,\n jsonMode: opts?.json === true,\n },\n );\n }\n const after = opts?.apply ? factsDb.countVectorlessActiveFacts(opts?.source) : before;\n const durationMs = Date.now() - startedAtMs;\n const report: Record<string, unknown> = {\n apply: opts?.apply === true,\n source: opts?.source ?? null,\n before,\n candidates: candidates.length,\n considered: candidates.length,\n embedded,\n skipped,\n embedFailures,\n storeFailures,\n errors,\n after,\n processed,\n remaining: after,\n durationMs,\n aborted,\n };\n if (adaptiveCatchUp) {\n report.adaptive = {\n enabled: true,\n baselineBatchSize,\n baselineDelayMs,\n effectiveBatchSize,\n effectiveDelayMs,\n adjustments: adaptiveAdjustments,\n };\n }\n const globalVectorlessAfter = opts?.apply ? factsDb.countVectorlessActiveFacts() : globalVectorlessBefore;\n report.vectorSloRepair = buildVectorlessSloRepairRecommendation({\n activeFacts: factsDb.getCount(),\n vectorlessBefore: globalVectorlessBefore,\n vectorlessAfter: globalVectorlessAfter,\n embeddedThisRun: embedded,\n runLimit: limit,\n effectiveBatchSize: adaptiveCatchUp ? effectiveBatchSize : batchSize,\n scopedSource: opts?.source,\n scopedVectorlessBefore: opts?.source ? before : undefined,\n scopedVectorlessAfter: opts?.source ? after : undefined,\n });\n if (providerCircuitBreak) {\n report.failedReason =\n providerCircuitBreakCause === \"provider_5xx\"\n ? \"failed_embedding_provider_5xx\"\n : \"failed_embedding_provider\";\n process.exitCode = 1;\n } else if (opts?.apply && storeFailures > 0) {\n process.exitCode = 2;\n }\n if (opts?.json) {\n console.log(JSON.stringify(report, null, 2));\n return;\n }\n console.log(\n `Reembed vectorless ${report.apply ? \"applied\" : \"dry-run\"}: before ${before}, candidates ${candidates.length}, embedded ${embedded}, skipped ${skipped}, storeFailures ${storeFailures}, after ${after}, remaining ${after}, durationMs ${durationMs}`,\n );\n if (adaptiveCatchUp) {\n console.log(\n `Adaptive pacing: batchSize ${baselineBatchSize}->${effectiveBatchSize}, delayMs ${baselineDelayMs}->${effectiveDelayMs}, adjustments ${adaptiveAdjustments.length}`,\n );\n }\n const slo = report.vectorSloRepair as ReturnType<typeof buildVectorlessSloRepairRecommendation>;\n console.log(\n `Vectorless SLO repair: ratio ${(slo.vectorlessRatioAfter * 100).toFixed(2)}% (target ${(slo.targetVectorlessRatio * 100).toFixed(0)}%), clear ${slo.vectorlessToClearForSlo} more, ~${slo.estimatedRunsToReachSlo} run(s) at limit ${slo.recommendedLimitNextRun} batch ${slo.recommendedBatchSizeNextRun}`,\n );\n if (candidates.length > 0 && !opts?.apply) {\n console.log(\"Examples:\");\n for (const fact of candidates.slice(0, 10)) {\n console.log(` ${fact.id} ${fact.source} ${fact.text.slice(0, 80).replace(/\\s+/g, \" \")}`);\n }\n console.log(\"Dry-run only. Re-run with --apply to write embeddings.\");\n }\n if (errors.length > 0) {\n console.warn(`Errors: ${errors.length}`);\n for (const err of errors.slice(0, 10)) console.warn(` - ${err}`);\n }\n if (providerCircuitBreak) {\n if (providerCircuitBreakCause === \"provider_5xx\") {\n console.error(\n `Provider fast-fail: embedding provider returned 5xx; aborted reembed-vectorless immediately to avoid per-fact fallback stall. Processed ${processed}/${candidates.length} fact(s); embedded ${embedded} (exit=1).`,\n );\n } else {\n console.error(\n `Provider circuit-break: ${maxEmbedFailures} consecutive embed failure(s) exceeded --max-embed-failures ${maxEmbedFailures}; processed ${processed}/${candidates.length} fact(s) before aborting; partial embeddings stored: ${embedded}. Re-run after provider recovery (exit=1).`,\n );\n }\n } else if (opts?.apply && storeFailures > 0) {\n console.warn(\n `Partial success: ${storeFailures} write failure(s) occurred during vector re-embedding; retryable LanceDB conflicts were retried where applicable (exit=2).`,\n );\n }\n },\n ),\n );\n\n mem\n .command(\"prune\")\n .description(\"Remove expired facts (decayed past threshold)\")\n .option(\"-v, --verbose\", \"List fact ids that will be removed before pruning\")\n .action(\n withExit(async (opts?: { verbose?: boolean }, cmd?: CommanderOptsParent) => {\n const verbose = !!opts?.verbose || readHybridMemVerbose(cmd);\n const before = factsDb.count();\n if (verbose) {\n const pending = factsDb.listExpiredFactIdsPendingPrune();\n if (pending.length > 0) {\n console.log(\"Fact ids to prune (--verbose):\");\n for (const id of pending) console.log(` ${id}`);\n } else {\n console.log(\"No expired facts pending prune (--verbose).\");\n }\n }\n const pendingVectorDeletes = factsDb.listExpiredFactIdsPendingPrune();\n const pruned = factsDb.prune();\n const vectorCleanup = await deleteVectorsForFactIds(vectorDb, pendingVectorDeletes, {\n operation: \"cli-prune-expired\",\n logger: {\n warn: (msg) => console.warn(msg),\n },\n });\n const after = factsDb.count();\n console.log(\n `Pruned ${pruned} expired facts. Before: ${before}, After: ${after}. Vector cleanup: ${vectorCleanup.deleted}/${vectorCleanup.attempted} deleted${vectorCleanup.failed > 0 ? ` (${vectorCleanup.failed} failed)` : \"\"}.`,\n );\n }),\n );\n\n mem\n .command(\"checkpoint\")\n .description(\"Checkpoint vector DB to disk (LanceDB optimization)\")\n .action(\n withExit(async () => {\n await vectorDb.checkpoint?.();\n console.log(\"Vector DB checkpoint complete.\");\n }),\n );\n\n mem\n .command(\"re-index\")\n .description(\n \"Re-embed all facts into a shadow table, validate, and atomically swap into place. Non-destructive: aborted runs preserve the live vector store (use after switching embedding model, e.g. to a larger one).\",\n )\n .option(\"--batch-size <n>\", \"Facts per embed batch (default: 50)\", \"50\")\n .option(\n \"--delay-ms-between-batches <n>\",\n \"Pause between embedding batches in ms (default: 0). On Azure/APIM with tight RPM, try 2000 — see docs/TROUBLESHOOTING.md and issue #940.\",\n \"0\",\n )\n .option(\n \"--min-fraction-success <n>\",\n \"Minimum fraction of facts that must be successfully embedded (0.0-1.0, default: 0.95). Re-index aborts without swapping if fewer facts are migrated.\",\n \"0.95\",\n )\n .option(\"--resume\", \"Resume from saved checkpoint file when available\")\n .option(\"--checkpoint-file <path>\", \"Checkpoint file path for resumable re-index\")\n .action(\n withExit(\n async (opts?: {\n batchSize?: string;\n delayMsBetweenBatches?: string;\n minFractionSuccess?: string;\n resume?: boolean;\n checkpointFile?: string;\n }) => {\n const batchSize = parseBoundedIntOption(opts?.batchSize, 50, 1, 500);\n const delayMsBetweenBatches = parseBoundedIntOption(opts?.delayMsBetweenBatches, 0, 0, 120_000);\n const minFractionSuccess = parseBoundedFloatOption(opts?.minFractionSuccess, 0.95, 0.0, 1.0);\n const checkpointPath =\n opts?.checkpointFile?.trim() ||\n (ctx.resolvedSqlitePath ? defaultReindexCheckpointPath(ctx.resolvedSqlitePath) : \"\");\n let resumeCheckpoint = opts?.resume === true && checkpointPath ? readReindexCheckpoint(checkpointPath) : null;\n\n // Get total facts for validation\n const totalFacts =\n typeof (factsDb as { getCount?: unknown }).getCount === \"function\"\n ? (factsDb as { getCount: (opts: { includeSuperseded: boolean }) => number }).getCount({\n includeSuperseded: false,\n })\n : factsDb.getAll({ includeSuperseded: false }).length;\n\n const runReindex = async () => {\n console.log(`Re-index: starting non-destructive re-index of ${totalFacts} facts...`);\n if (resumeCheckpoint) {\n console.log(\n `Re-index: resume enabled — checkpoint offset ${resumeCheckpoint.offset}/${resumeCheckpoint.total}`,\n );\n if (resumeCheckpoint.total !== totalFacts) {\n console.warn(\n `Re-index: checkpoint total (${resumeCheckpoint.total}) differs from current fact count (${totalFacts}); checkpoint will be ignored for safety.`,\n );\n resumeCheckpoint = null;\n } else if (resumeCheckpoint.offset > 0) {\n console.warn(\n \"Re-index: checkpoint offsets cannot be resumed with a newly-created shadow table; restarting from offset 0 for safety.\",\n );\n resumeCheckpoint = null;\n }\n }\n console.log(\"Re-index: creating shadow table for safe rebuild...\");\n\n let shadowTableName: string;\n try {\n shadowTableName = await vectorDb.createShadowTable();\n } catch (err) {\n console.error(`Re-index failed: unable to create shadow table: ${err}`);\n process.exit(1);\n }\n if (ctx.resolvedSqlitePath) {\n appendVectorLifecycleAuditEvent(ctx.resolvedSqlitePath, {\n event: \"reindex_started\",\n ts: new Date().toISOString(),\n details: { totalFacts, batchSize, delayMsBetweenBatches, minFractionSuccess, shadowTableName },\n });\n }\n\n console.log(\"Re-index: embedding all facts into shadow table (this may take a while)...\");\n const result = await migrateEmbeddings({\n factsDb,\n vectorDb,\n embeddings,\n batchSize,\n delayMsBetweenBatches,\n targetTableName: shadowTableName,\n checkpoint:\n checkpointPath.length > 0\n ? {\n load: () => (resumeCheckpoint ? { offset: resumeCheckpoint.offset } : null),\n save: (state) => writeReindexCheckpoint(checkpointPath, state),\n clear: () => {\n if (existsSync(checkpointPath)) unlinkSync(checkpointPath);\n },\n }\n : undefined,\n onProgress: (completed, total) => {\n if (total > 0 && completed % Math.max(1, Math.floor(total / 10)) === 0) {\n process.stdout.write(` ${completed}/${total} facts embedded...\\r`);\n if (ctx.resolvedSqlitePath) {\n appendVectorLifecycleAuditEvent(ctx.resolvedSqlitePath, {\n event: \"reindex_progress\",\n ts: new Date().toISOString(),\n details: { completed, total },\n });\n }\n }\n },\n logger: { info: (m) => console.log(m), warn: (m) => console.warn(m) },\n });\n\n console.log(\n `\\nRe-index: migration complete — ${result.migrated} embedded, ${result.skipped} skipped, ${result.errors.length} errors.`,\n );\n\n if (result.errors.length > 0 && result.errors.length <= 10) {\n for (const e of result.errors) console.warn(` - ${e}`);\n } else if (result.errors.length > 10) {\n console.warn(` (${result.errors.length} errors; first 5:)`);\n for (const e of result.errors.slice(0, 5)) console.warn(` - ${e}`);\n }\n\n // Hard abort (e.g. VectorDB closed mid-run, see #1247): never swap a\n // partial shadow table into place.\n if (result.aborted) {\n if (ctx.resolvedSqlitePath) {\n appendVectorLifecycleAuditEvent(ctx.resolvedSqlitePath, {\n event: \"reindex_aborted\",\n ts: new Date().toISOString(),\n details: {\n migrated: result.migrated,\n skipped: result.skipped,\n errors: result.errors.length,\n processed: result.processed,\n total: result.total,\n abortReason: result.abortReason ?? null,\n shadowTableName,\n },\n });\n }\n console.error(\n `\\nRe-index FAILED: ${result.migrated} embedded, ${result.skipped} skipped, ${result.errors.length} errors ` +\n `(processed ${result.processed}/${result.total}) — migration aborted before completion.`,\n );\n console.error(`Reason: ${result.abortReason ?? \"unknown\"}`);\n console.error(\"Live vector store was NOT modified.\");\n console.error(`Shadow table preserved for inspection: ${shadowTableName}`);\n console.error(\"Recommendation: Re-run 'openclaw hybrid-mem re-index --resume' to continue.\");\n process.exit(1);\n }\n\n // Validate row count before swapping\n const minRequired = Math.ceil(totalFacts * minFractionSuccess);\n if (result.migrated < minRequired) {\n console.error(\n `\\nRe-index validation failed: ${result.migrated} migrated < required minimum ${minRequired} ` +\n `(${(minFractionSuccess * 100).toFixed(1)}% of ${totalFacts} facts).`,\n );\n console.error(\"Aborting swap to preserve live vector store.\");\n console.error(`Shadow table preserved for inspection: ${shadowTableName}`);\n console.error(\"To retry, clean up shadow table and run re-index again.\");\n process.exit(1);\n }\n\n console.log(\n `Re-index: validation passed — ${result.migrated} >= ${minRequired} required (${(minFractionSuccess * 100).toFixed(1)}% of ${totalFacts})`,\n );\n console.log(\"Re-index: swapping shadow table into place...\");\n\n try {\n await vectorDb.swapShadowTable(shadowTableName, minFractionSuccess, totalFacts);\n } catch (err) {\n console.error(`\\nRe-index failed: shadow table swap failed: ${err}`);\n console.error(\"Live vector store was NOT modified.\");\n console.error(`Shadow table preserved for inspection: ${shadowTableName}`);\n process.exit(1);\n }\n\n // Update embedding metadata in SQLite (batch update for all facts)\n console.log(\"Re-index: updating embedding metadata in SQLite...\");\n const allFacts = hasGetBatch(factsDb)\n ? (() => {\n const facts: Array<{ id: string }> = [];\n let offset = 0;\n const batchSize = 500;\n while (true) {\n const batch = factsDb.getBatch(offset, batchSize, { includeSuperseded: false });\n if (batch.length === 0) break;\n facts.push(...batch);\n offset += batch.length;\n }\n return facts;\n })()\n : (factsDb as { getAll: (opts: { includeSuperseded: boolean }) => Array<{ id: string }> }).getAll({\n includeSuperseded: false,\n });\n\n for (const fact of allFacts) {\n try {\n factsDb.setEmbeddingModel(fact.id, embeddings.modelName);\n } catch {\n // ignore per-fact metadata update errors (non-fatal)\n }\n }\n\n if (ctx.resolvedSqlitePath) {\n appendVectorLifecycleAuditEvent(ctx.resolvedSqlitePath, {\n event: \"reindex_completed\",\n ts: new Date().toISOString(),\n details: {\n migrated: result.migrated,\n skipped: result.skipped,\n errors: result.errors.length,\n total: result.total,\n shadowTableName,\n },\n });\n }\n\n console.log(`\\nRe-index complete: ${result.migrated} facts successfully re-indexed.`);\n console.log(\"Live vector store updated atomically. Semantic search is fully operational.\");\n };\n\n if (typeof (vectorDb as { runWithReindexLock?: unknown }).runWithReindexLock === \"function\") {\n await (\n vectorDb as {\n runWithReindexLock: <T>(fn: () => Promise<T>) => Promise<T>;\n }\n ).runWithReindexLock(runReindex);\n } else {\n await runReindex();\n }\n },\n ),\n );\n\n mem\n .command(\"repair-vectors\")\n .description(\n \"Run an orchestrated vector lifecycle repair pipeline: reembed-vectorless, vectordb-optimize, reconcile orphans, and print a single report.\",\n )\n .option(\n \"--reconcile-policy <policy>\",\n \"Self-heal policy for SQLite-orphan vectors: conservative|balanced|aggressive\",\n \"balanced\",\n )\n .option(\"--max-fixes <n>\", \"Max SQLite-orphan vectors to auto-rebuild (default: 200)\", \"200\")\n .option(\"--json\", \"Emit JSON report\")\n .action(\n withExit(async (opts?: { reconcilePolicy?: string; maxFixes?: string; json?: boolean }) => {\n const resolveRepairBudget = (policy: \"conservative\" | \"balanced\" | \"aggressive\", maxFixes: number): number => {\n if (policy === \"conservative\") return 0;\n if (policy === \"balanced\") return maxFixes;\n return Math.max(maxFixes, 2000);\n };\n const policyRaw = String(opts?.reconcilePolicy ?? \"balanced\")\n .trim()\n .toLowerCase();\n const policy = policyRaw === \"conservative\" || policyRaw === \"aggressive\" ? policyRaw : \"balanced\";\n const maxFixes = parseBoundedIntOption(opts?.maxFixes, 200, 0, 5000);\n const report = {\n policy,\n maxFixes,\n startedAt: new Date().toISOString(),\n vectorlessBefore: factsDb.countVectorlessActiveFacts(),\n reembedded: 0,\n optimize: { compacted: 0, removedFragments: 0, freedBytes: 0 },\n reconcile: {\n vectorOrphans: 0,\n vectorOrphansDeleted: 0,\n sqliteOrphans: 0,\n sqliteOrphansRebuilt: 0,\n sqliteOrphansSkipped: 0,\n },\n vectorlessAfter: 0,\n errors: [] as string[],\n };\n\n // Step 1: reembed vectorless facts\n const candidates = factsDb.listVectorlessActiveFacts({ limit: Math.max(200, maxFixes) });\n const allowedRebuilds = resolveRepairBudget(policy, maxFixes);\n for (const fact of candidates.slice(0, allowedRebuilds)) {\n try {\n const vec = await embeddings.embed(fact.text);\n await vectorDb.store({\n id: fact.id,\n text: fact.text,\n vector: vec,\n importance: 0.5,\n category: fact.category,\n });\n report.reembedded++;\n } catch (err) {\n report.errors.push(`reembed ${fact.id}: ${String(err)}`);\n }\n }\n\n // Step 2: optimize\n try {\n report.optimize = await vectorDb.optimize();\n } catch (err) {\n report.errors.push(`optimize: ${String(err)}`);\n }\n\n // Step 3: reconcile and policy-based self-heal\n try {\n const sqliteIds = new Set(factsDb.getAllIds());\n const vectorIds = await vectorDb.getAllIds();\n const vectorIdSet = new Set(vectorIds);\n const vectorOrphans = vectorIds.filter((id) => !sqliteIds.has(id));\n const sqliteOrphans = Array.from(sqliteIds).filter((id) => !vectorIdSet.has(id));\n report.reconcile.vectorOrphans = vectorOrphans.length;\n report.reconcile.sqliteOrphans = sqliteOrphans.length;\n\n for (const id of vectorOrphans) {\n try {\n await vectorDb.delete(id);\n report.reconcile.vectorOrphansDeleted++;\n } catch (err) {\n report.errors.push(`delete orphan vector ${id}: ${String(err)}`);\n }\n }\n\n const rebuildLimit = Math.min(resolveRepairBudget(policy, maxFixes), sqliteOrphans.length);\n for (const id of sqliteOrphans.slice(0, rebuildLimit)) {\n try {\n const fact = factsDb.getById(id);\n if (!fact) {\n report.reconcile.sqliteOrphansSkipped++;\n continue;\n }\n const vec = await embeddings.embed(fact.text);\n await vectorDb.store({\n id: fact.id,\n text: fact.text,\n vector: vec,\n importance: fact.importance ?? 0.5,\n category: fact.category,\n });\n report.reconcile.sqliteOrphansRebuilt++;\n } catch (err) {\n report.errors.push(`rebuild sqlite orphan ${id}: ${String(err)}`);\n }\n }\n report.reconcile.sqliteOrphansSkipped += Math.max(0, sqliteOrphans.length - rebuildLimit);\n } catch (err) {\n report.errors.push(`reconcile: ${String(err)}`);\n }\n\n report.vectorlessAfter = factsDb.countVectorlessActiveFacts();\n const finishedAt = new Date().toISOString();\n if (ctx.resolvedSqlitePath) {\n appendVectorLifecycleAuditEvent(ctx.resolvedSqlitePath, {\n event: \"repair_vectors_completed\",\n ts: finishedAt,\n details: report as unknown as Record<string, unknown>,\n });\n }\n if (opts?.json) {\n console.log(JSON.stringify({ ...report, finishedAt }, null, 2));\n return;\n }\n console.log(\"Repair vectors report:\");\n console.log(` policy=${report.policy} maxFixes=${report.maxFixes}`);\n console.log(` vectorless: before=${report.vectorlessBefore} after=${report.vectorlessAfter}`);\n console.log(\n ` optimize: compacted=${report.optimize.compacted} removedFragments=${report.optimize.removedFragments} freedBytes=${report.optimize.freedBytes}`,\n );\n console.log(\n ` reconcile: vectorOrphans=${report.reconcile.vectorOrphans} deleted=${report.reconcile.vectorOrphansDeleted}; sqliteOrphans=${report.reconcile.sqliteOrphans} rebuilt=${report.reconcile.sqliteOrphansRebuilt} skipped=${report.reconcile.sqliteOrphansSkipped}`,\n );\n if (report.errors.length > 0) {\n console.log(` errors=${report.errors.length}`);\n for (const err of report.errors.slice(0, 10)) console.log(` - ${err}`);\n process.exitCode = 2;\n }\n }),\n );\n\n mem\n .command(\"classification-artifacts\")\n .description(\n \"Supersede existing NOOP/classification-artifact facts and remove their LanceDB vectors (issue #1561). \" +\n \"Dry-run by default; use --apply to mutate.\",\n )\n .option(\"--apply\", \"Actually supersede facts and delete vectors. Omit for dry-run.\")\n .option(\"--json\", \"Emit JSON report\")\n .action(\n withExit(async (opts?: { apply?: boolean; json?: boolean }) => {\n const apply = opts?.apply === true;\n const supersededIds: string[] = [];\n const verifiedSkippedIds: string[] = [];\n const vectorDeleteErrors: string[] = [];\n let vectorDeleteCount = 0;\n const verifiedLookup = (() => {\n try {\n return hasGetRawDb(factsDb)\n ? factsDb.getRawDb().prepare(\"SELECT 1 FROM verified_facts WHERE fact_id = ? LIMIT 1\")\n : null;\n } catch {\n return null;\n }\n })();\n const processFactBatch = async (\n facts: Array<{ id: string; text: string; category?: string; source?: string }>,\n ): Promise<number> => {\n let supersededCount = 0;\n for (const fact of facts) {\n if (!isPreStoreGuardBlocked({ text: fact.text, category: fact.category, source: fact.source })) continue;\n if (verifiedLookup?.get(fact.id)) {\n verifiedSkippedIds.push(fact.id);\n continue;\n }\n if (!apply) {\n supersededIds.push(fact.id);\n continue;\n }\n try {\n await vectorDb.delete(fact.id);\n vectorDeleteCount++;\n } catch (err) {\n vectorDeleteErrors.push(`vector delete ${fact.id}: ${String(err)}`);\n }\n try {\n factsDb.supersede(fact.id, null);\n supersededIds.push(fact.id);\n supersededCount++;\n } catch (err) {\n vectorDeleteErrors.push(`supersede ${fact.id}: ${String(err)}`);\n }\n }\n return supersededCount;\n };\n if (hasGetBatch(factsDb)) {\n const batchSize = 500;\n // In apply mode, keep offset at 0 because each superseded fact shrinks the result set.\n // In dry-run mode, increment offset normally since the set is stable.\n let offset = 0;\n while (true) {\n const batch = factsDb.getBatch(offset, batchSize, { includeSuperseded: false });\n if (batch.length === 0) break;\n const superseded = await processFactBatch(batch);\n // If applying changes, facts are removed from the result set; stay at offset 0.\n // If dry-run, the result set is stable; advance by batch size.\n if (!apply) {\n offset += batchSize;\n } else if (superseded === 0) {\n // No artifacts superseded in this batch; advance to avoid infinite loop.\n offset += batchSize;\n }\n }\n } else {\n // Fallback: process all facts in batches to avoid loading entire table into memory at once.\n const allFacts = (\n factsDb as unknown as { getAll(opts: { includeSuperseded: boolean }): MemoryEntry[] }\n ).getAll({\n includeSuperseded: false,\n });\n const batchSize = 500;\n for (let offset = 0; offset < allFacts.length; offset += batchSize) {\n const batch = allFacts.slice(offset, offset + batchSize);\n await processFactBatch(batch);\n }\n }\n\n if (apply && ctx.resolvedSqlitePath) {\n recordMaintenanceTimestamp(ctx.resolvedSqlitePath, \".classification_artifacts_last_run\");\n }\n\n const report = {\n apply,\n superseded: supersededIds.length,\n supersededIds,\n verifiedSkipped: verifiedSkippedIds.length,\n verifiedSkippedIds,\n vectorDeletes: apply ? vectorDeleteCount : 0,\n vectorDeleteErrors,\n };\n\n if (opts?.json) {\n console.log(JSON.stringify(report, null, 2));\n return;\n }\n\n if (supersededIds.length === 0) {\n console.log(\"classification-artifacts: no artifact facts found\");\n return;\n }\n\n console.log(\n `classification-artifacts ${apply ? \"applied\" : \"dry-run\"}: ${supersededIds.length} artifact fact(s) identified`,\n );\n if (verifiedSkippedIds.length > 0) {\n console.log(`Skipped verified facts: ${verifiedSkippedIds.length}`);\n }\n if (!apply) {\n console.log(\"Dry-run only. Re-run with --apply to supersede and delete vectors.\");\n console.log(\"Fact IDs:\");\n for (const id of supersededIds) console.log(` ${id}`);\n if (verifiedSkippedIds.length > 0) {\n console.log(\"Verified fact IDs left untouched:\");\n for (const id of verifiedSkippedIds) console.log(` ${id}`);\n }\n } else {\n console.log(`Vectors deleted: ${vectorDeleteCount}`);\n if (vectorDeleteErrors.length > 0) {\n console.warn(`Errors: ${vectorDeleteErrors.length}`);\n for (const e of vectorDeleteErrors.slice(0, 10)) console.warn(` - ${e}`);\n process.exitCode = 2;\n }\n }\n }),\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA2DA,SAAS,uCAAuC,eAAiD;CAC/F,QAAQ,IAAI,aAAa,cAAc,YAAY;CACnD,IAAI,cAAc,SAAS,MAAM,QAAQ,IAAI,gBAAgB,cAAc,SAAS,MAAM;CAC1F,QAAQ,IACN,yBAAyB,OAAO,cAAc,SAAS,WAAW,EAAE,kBAAkB,OAAO,cAAc,SAAS,cAAc,EAAE,eAAe,cAAc,SAAS,eAAe,MAAM,cAAc,OAAO,cAAc,SAAS,UAAU,GACvP;CACA,IAAI,cAAc,SAAS,UAAU,QACnC,QAAQ,IACN,gCAAgC,cAAc,SAAS,SAAS,UAAU,UAAU,SAAS,cAAc,SAAS,SAAS,gBAAgB,OAC/I;CAEF,IAAI,cAAc,SAAS,QACzB,QAAQ,IACN,kBAAkB,cAAc,SAAS,OAAO,OAAO,QAAQ,cAAc,SAAS,OAAO,KAAK,SAAS,cAAc,SAAS,OAAO,MAAM,eAAe,cAAc,SAAS,OAAO,iBAC9L;CAEF,IAAI,cAAc,SAAS,OACzB,QAAQ,IACN,eAAe,cAAc,SAAS,MAAM,QAAQ,MAAM,iBAAiB,cAAc,SAAS,MAAM,iBAAiB,MAAM,eAAe,cAAc,SAAS,MAAM,iBAC7K;CAEF,IAAI,cAAc,SAAS,cACzB,QAAQ,IACN,4BAA4B,cAAc,SAAS,aAAa,UAAU,WAAW,cAAc,SAAS,aAAa,iBAAiB,cAAc,cAAc,SAAS,aAAa,YAC9L;CAEF,IAAI,cAAc,QAAQ,UAAU;EAClC,QAAQ,IACN,qBAAqB,cAAc,QAAQ,SAAS,kBAAkB,cAAc,QAAQ,kBAAkB,OAChH;EACA,KAAK,MAAM,SAAS,cAAc,QAAQ,QACxC,QAAQ,IACN,WAAW,MAAM,KAAK,UAAU,MAAM,OAAO,QAAQ,MAAM,YAAY,MAAM,aAAa,MAAM,aAAa,OAC/G;CAEJ;AACF;AAEA,SAAS,YAAY,IAA6C;CAChE,OAAO,cAAc,MAAM,OAAQ,GAA8B,aAAa;AAChF;AAEA,SAAS,YAAY,IAA6C;CAChE,OAAO,cAAc,MAAM,OAAQ,GAA8B,aAAa;AAChF;AAEA,SAAS,+BAA+B,KAAuB;CAC7D,IAAI,EAAE,eAAe,QAAQ,OAAO;CACpC,IAAI,eAAe,GAAG,GAAG,OAAO;CAChC,IAAI,eAAe,6BACjB,OAAO,IAAI,OAAO,MAAM,UAAU,eAAe,KAAK,CAAC;CAEzD,OAAO;AACT;AAEA,SAAS,kCAAkC,KAAuB;CAChE,IAAI,EAAE,eAAe,QAAQ,OAAO;CACpC,IAAI,eAAe,GAAG,KAAK,0BAA0B,GAAG,GAAG,OAAO;CAClE,IAAI,eAAe,6BACjB,OAAO,IAAI,OAAO,MACf,UAAU,iBAAiB,UAAU,eAAe,KAAK,KAAK,0BAA0B,KAAK,EAChG;CAEF,OAAO;AACT;AAEA,SAAS,kCAAkC,KAAuB;CAChE,IAAI,EAAE,eAAe,QAAQ,OAAO;CACpC,IAAI,kCAAkC,GAAG,KAAK,eAAe,GAAG,KAAK,sBAAsB,GAAG,GAAG,OAAO;CACxG,IAAI,eAAe,6BACjB,OAAO,IAAI,OAAO,MACf,UACC,iBAAiB,UAChB,eAAe,KAAK,KACnB,0BAA0B,KAAK,KAC/B,eAAe,KAAK,KACpB,sBAAsB,KAAK,EACjC;CAEF,OAAO;AACT;AAEA,SAAS,2BAA2B,KAAkC;CACpE,IAAI,eAAe,OAAO;EACxB,MAAM,UAAU,kBAAkB,GAAG;EACrC,IAAI,YAAY,KAAA,GAAW,OAAO;CACpC;CACA,IAAI,eAAe,6BACjB,KAAK,MAAM,SAAS,IAAI,QAAQ;EAC9B,IAAI,EAAE,iBAAiB,QAAQ;EAC/B,MAAM,eAAe,kBAAkB,KAAK;EAC5C,IAAI,iBAAiB,KAAA,GAAW,OAAO;CACzC;AAGJ;AAEA,SAAS,MAAM,IAA2B;CACxC,IAAI,MAAM,GAAG,OAAO,QAAQ,QAAQ;CACpC,OAAO,IAAI,SAAS,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;AAEA,SAAgB,iCAAiC,KAAgB,GAAyB;CACxF,MAAM,EACJ,SACA,UACA,SACA,aACA,YACA,cAAc,OACd,qBACA,KACA,eACA,gBACA,KACA,cACA,YACA,cACE;CAEJ,MAAM,iBAAiB,IACpB,QAAQ,cAAc,EACtB,YACC,gHACF,EACC,OAAO,aAAa,6CAA6C;CAGpE,eAAe,QAAQ,SAAS;CAChC,eAAe,OACb,SAAS,OAAO,SAAgC;EAC9C,IAAI;EACJ,IAAI;GACF,SAAS,MAAM,cAAc,EAAE,OAAO,MAAM,WAAW,KAAK,CAAC;EAC/D,SAAS,KAAK;GACZ,mBAAmB,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC,GAAG;IACtE,WAAW;IACX,WAAW;GACb,CAAC;GACD,MAAM;EACR;EAEA,IAAI,MAAM,WAAW,QAAQ,IAAI,oBAC/B,2BAA2B,IAAI,oBAAoB,mBAAmB;EAExE,MAAM,OAAO,MAAM,SAAS,YAAY;EACxC,MAAM,UAAU,OAAO,WAAW,OAAO,KAAK,YAAY,OAAO,QAAQ,GAAG,OAAO,YAAY;EAC/F,QAAQ,IACN,oBAAoB,KAAK,SAAS,OAAO,IAAI,QAAQ,OAAO,KAAK,QAAQ,OAAO,KAAK,cAAc,OAAO,aAAa,SACzH;CACF,CAAC,CACH;CAEA,IACG,QAAQ,QAAQ,EAChB,YAAY,oEAAoE,EAChF,OAAO,WAAW,mCAAmC,EACrD,OACC,SAAS,OAAO,SAA+B;EAC7C,MAAM,SAAS,MAAM,cAAc,EAAE,OAAO,MAAM,UAAU,KAAK,CAAC;EAClE,MAAM,OAAO,MAAM,QAAQ,UAAU;EACrC,QAAQ,IACN,WAAW,KAAK,cAAc,OAAO,YAAY,IAAI,WAAW,OAAO,WAAW,IAAI,OAAO,OAAO,IAAI,QAAQ,OAAO,KAAK,QAAQ,OAAO,KAAK,cAAc,OAAO,YACvK;EACA,IAAI,CAAC,MAAM,OAAO,QAAQ,IAAI,yDAAyD;CACzF,CAAC,CACH;CAEF,IACG,QAAQ,mBAAmB,EAC3B,YACC,qQAEF,EACC,OAAO,4BAA4B,0DAA0D,GAAG,EAChG,OACC,SAAS,OAAO,SAAsC;EACpD,MAAM,aAAa,OAAO,SAAS,MAAM,iBAAiB,KAAK,EAAE;EACjE,IAAI,CAAC,OAAO,SAAS,UAAU,KAAK,aAAa,GAAG;GAClD,QAAQ,MAAM,sDAAsD;GACpE,QAAQ,WAAW;GACnB;EACF;EACA,MAAM,cAAc,aAAa,KAAK,KAAK,KAAK;EAChD,IAAI;GACF,MAAM,QAAQ,MAAM,SAAS,SAAS,WAAW;GAEjD,IAAI,IAAI,oBACN,2BAA2B,IAAI,oBAAoB,6BAA6B;GAElF,QAAQ,IACN,sBAAsB,MAAM,UAAU,qBAAqB,MAAM,iBAAiB,sBAAsB,MAAM,WAAW,OAC3H;EACF,SAAS,KAAK;GACZ,mBAAmB,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC,GAAG;IACtE,WAAW;IACX,WAAW;GACb,CAAC;GACD,MAAM;EACR;CACF,CAAC,CACH;CAEF,IACG,QAAQ,iBAAiB,EACzB,YACC,8HACF,EACC,OAAO,UAAU,WAAW,EAC5B,OACC,SAAS,OAAO,SAA8B;EAC5C,IAAI,aAA4B;EAChC,IAAI;GACF,MAAM,QAAQ,MAAM,QAAQ,QAAQ,IAAI,iBAAiB,gBAAgB,CAAC;GAC1E,IAAI,SAAS,OAAO,MAAM,eAAe,UAAU,aAAa,MAAM;EACxE,QAAQ,CAER;EACA,MAAM,gBAAgB,MAAM,kCAAkC;GAC5D;GACA,mBAAmB,IAAI;GACvB;EACF,CAAC;EACD,IAAI,MAAM,MAAM;GACd,QAAQ,IAAI,KAAK,UAAU,eAAe,MAAM,CAAC,CAAC;GAClD;EACF;EACA,QAAQ,IAAI,+BAA+B;EAC3C,uCAAuC,aAAa;CACtD,CAAC,CACH;CAEF,IACG,QAAQ,uBAAuB,EAC/B,YACC,sIACF,EACC,OAAO,WAAW,6DAA6D,EAC/E,OAAO,aAAa,4DAA4D,EAChF,OAAO,UAAU,qBAAqB,EACtC,OACC,SAAS,OAAO,SAAiE;EAC/E,IAAI,aAA4B;EAChC,IAAI;GACF,MAAM,QAAQ,MAAM,QAAQ,QAAQ,IAAI,iBAAiB,gBAAgB,CAAC;GAC1E,IAAI,SAAS,OAAO,MAAM,eAAe,UAAU,aAAa,MAAM;EACxE,SAAS,KAAK;GACZ,mBAAmB,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC,GAAG;IACtE,WAAW;IACX,UAAU;IACV,WAAW;GACb,CAAC;EACH;EACA,MAAM,IAAI,0BAA0B,SAAS,YAAY;GACvD,OAAO,MAAM;GACb,QAAQ,MAAM;EAChB,CAAC;EACD,IAAI,MAAM,MAAM;GAGd,IAAI,SAAS;GACb,IAAI,EAAE,WAAW,YACf,SAAS;QACJ,IAAI,EAAE,WAAW,WACtB,SAAS;QACJ,IAAI,EAAE,WAAW,uBACtB,SAAS;QAET,SAAS;GAEX,QAAQ,MAAM,0BAA0B,QAAQ;GAChD,QAAQ,IACN,KAAK,UACH;IACE,eAAe;IACf,QAAQ,EAAE;IACV,QAAQ,EAAE;IACV,UAAU,EAAE;IACZ,OAAO,CAAC,CAAC,KAAK;IACd,QAAQ,CAAC,CAAC,KAAK;IACf,UAAU,EAAE;IACZ,YAAY,EAAE;IACd,QAAQ,EAAE;GACZ,GACA,MACA,CACF,CACF;GACA;EACF;EACA,IAAI,EAAE,WAAW,YAAY;GAC3B,QAAQ,IACN,6CAA6C,EAAE,WAAW,aAAa,EAAE,YAAY,MAAM,0BAC7F;GACA;EACF;EACA,IAAI,EAAE,WAAW,WAAW;GAC1B,QAAQ,IACN,wCAAwC,EAAE,OAAO,WAAW,gBAAgB,EAAE,OAAO,eAAe,OAAO,eAAe,EAAE,OAAO,cAAc,OAAO,cAAc,EAAE,OAAO,UAAU,cAAc,EAAE,OAAO,UAAU,yBAC5N;GACA;EACF;EACA,QAAQ,IACN,EAAE,WAAW,wBACT,sEAAsE,EAAE,WAAW,wCACnF,mEAAmE,EAAE,WAAW,uCACtF;CACF,CAAC,CACH;CAEF,IACG,QAAQ,OAAO,EACf,YACC,8KACF,EACC,OACC,gBACA,uHACF,EACC,OAAO,WAAW,mDAAmD,EACrE,OACC,SAAS,OAAO,SAAqD;EACnE,MAAM,aAAa,MAAM,cAAc;EACvC,MAAM,QAAQ,MAAM,SAAS;EAC7B,MAAM,WAAW,QAAQ,MAAM;EAC/B,IAAI,aAAa;EACjB,IAAI;GACF,aAAa,MAAM,SAAS,MAAM;EACpC,SAAS,KAAK;GACZ,mBAAmB,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC,GAAG;IACtE,WAAW;IACX,UAAU;IACV,WAAW;GACb,CAAC;EAEH;EACA,MAAM,YAAY,QAAQ,qBAAqB;EAC/C,MAAM,UAAU,QAAQ,aAAa;EAErC,MAAM,SAAS,IAAI;EAGnB,IAFgB,CAAC,SAAS,QAEb;GACX,MAAM,aAAa,QAAQ,yBAAyB;GACpD,MAAM,aAAa,QAAQ,gBAAgB;GAC3C,MAAM,sBAAsB,QAAQ,yBAAyB;GAC7D,MAAM,qBAAqB,QAAQ,wBAAwB;GAC3D,MAAM,aAAa,QAAQ,gBAAgB;GAC3C,MAAM,QAAQ,WAAW,QAAQ;GACjC,MAAM,WAAW,WAAW,WAAW;GACvC,MAAM,eAAe,QAAQ,kBAAkB;GAC/C,MAAM,QAAQ,QAAQ,WAAW;GACjC,MAAM,WAAW,QAAQ,YAAY;GACrC,MAAM,sBAAsB,QAAQ,oBAAoB,GAAG,IAAI,IAAI,iBAAiB,SAAS;GAC7F,MAAM,uBAAuB,oBAAoB;GACjD,MAAM,iBAAiB,QAAQ,uBAAuB;GACtD,MAAM,cAAc,OAAO,oBAAoB;GAC/C,MAAM,mBAAmB,OAAO,oBAAoB;GACpD,MAAM,qBAAqB,OAAO,sBAAsB;GACxD,MAAM,gBAAgB,2BAA2B,IAAI,KAAK,OAAO;GACjE,MAAM,aAAa,MAAM,OAAO,cAAc;GAC9C,MAAM,aAAa,OAAO,qBAAqB;GAC/C,MAAM,QAAQ,MAAM,OAAO,gBAAgB;GAE3C,MAAM,EAAE,yBAAyB,yBAAyB,QAAQ,gBAAgB;GAClF,MAAM,sBAAsB,QAAQ,6BAA6B;GACjE,MAAM,wBAAwB,QAAQ,sBAAsB;GAE5D,MAAM,cAAc,QAAQ,SAAS;GACrC,MAAM,kBAAkB,QAAQ,qBAAqB;GACrD,MAAM,sBAAsB,QAAQ,yBAAyB;GAC7D,MAAM,aAAa,QAAQ,2BAA2B;GACtD,MAAM,qBAAqB,QAAQ,8BAA8B,CAAC;GAClE,MAAM,kBAAkB,QAAQ,iBAAiB;IAAE,QAAQ;IAAa,aAAa;IAAM,OAAO;GAAO,CAAC;GAC1G,MAAM,2BAA2B,QAAQ,oBAAoB;GAC7D,MAAM,gBAAgB,QAAQ,mBAAmB;GACjD,MAAM,WAAW,QAAQ,eAAe;GACxC,MAAM,iBAAiB,QAAQ,2BAA2B;GAC1D,MAAM,mBAAmB,OAAO,OAAO,cAAc,EAAE,QAAQ,KAAK,UAAU,MAAM,OAAO,CAAC;GAC5F,MAAM,wBAAwB,eAAe,UAAU,MAAM,eAAe,aAAa;GACzF,MAAM,uBAAuB,mBAAmB,IAAI,uBAAuB,mBAAmB;GAC9F,MAAM,kBAAkB,QAAQ,cAAc;GAC9C,MAAM,cAAc,QAAQ,iBAAiB,EAAE,MAAM,GAAG,EAAE;GAC1D,MAAM,0BAA0B,uCAAuC,OAAO;GAC9E,MAAM,WAAW,OAAO,oBAAoB,KAAK,CAAC;GAElD,MAAM,aAAa,WAAW;GAC9B,MAAM,WAAW,KAAK,IAAI,UAAU;GAEpC,MAAM,wBAAwB,WAAW,OAAO,WAD/B,KAAK,IAAI,UAAU,YAAY,CACkB,IAAI;GACtE,MAAM,aAAa;GACnB,MAAM,iBAAiB,aAAa;GACpC,MAAM,eAAe,KAAK,IAAI,cAAc;GAE5C,MAAM,4BAA4B,eAAe,OAAO,eADnC,KAAK,IAAI,YAAY,qBAAqB,CACmB,IAAI;GAEtF,QAAQ,IAAI,kCAAkC;GAC9C,QAAQ,IAAI,mBAAmB,YAAY,eAAe;GAC1D,QAAQ,IAAI,mBAAmB,YAAY,eAAe;GAC1D,QAAQ,IAAI,mBAAmB,YAAY,sBAAsB;GACjE,QAAQ,IAAI,EAAE;GACd,QAAQ,IAAI,yBAAyB,UAAU;GAC/C,QAAQ,IACN,iBAAiB,YAAY,gBAAgB,gBAAgB,2BAA2B,SAC1F;GACA,QAAQ,IACN,4BAA4B,WAAW,oCAAoC,oBAAoB,EACjG;GACA,QAAQ,IAAI,mCAAmC,YAAY;GAC3D,IAAI,mBAAmB,SAAS,GAC9B,QAAQ,IAAI,yBAAyB,mBAAmB,KAAK,MAAM,GAAG,EAAE,OAAO,GAAG,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG;GAE3G,IAAI,yBAAyB,2BAC3B,QAAQ,IACN,0BAA0B,SAAS,sBAAsB,WAAW,MAAM,WAAW,iBAAiB,WAAW,+BAA+B,oBAAoB,MAAM,eAAe,iGAC3L;GAEF,QAAQ,IAAI,EAAE;GACd,MAAM,iBAAiB,eAAe,IAAI,0CAA0C;GACpF,QAAQ,IACN,eAAe,WAAW,eAAe,oBAAoB,cAAc,mBAAmB,aAAa,gBAAgB,QAAQ,QAAQ,gBAAgB,QAAQ,YAAY,OAAO,gBAAgB,QAAQ,cAAc,GAAG,GAAG,gBACpO;GACA,QAAQ,IACN,iEAAiE,cAAc,QAAQ,GAAG,cAAc,WAAW,GAAG,cAAc,MAAM,GAAG,cAAc,gBAAgB,GAAG,cAAc,UAC9L;GACA,QAAQ,IAAI,UAAU,OAAO;GAC7B,QAAQ,IAAI,aAAa,UAAU;GACnC,QAAQ,IAAI,8BAA8B,yBAAyB;GACnE,QAAQ,IAAI,kBAAkB,cAAc;GAC5C,QAAQ,IAAI,eAAe,YAAY;GACvC,QAAQ,IAAI,gCAAgC,wBAAwB,GAAG,sBAAsB;GAC7F,QAAQ,IAAI,8BAA8B,qBAAqB;GAC/D,QAAQ,IAAI,sBAAsB,uBAAuB;GACzD,IAAI,YAAY,SAAS,GAAG;IAC1B,QAAQ,IAAI,iCAAiC;IAC7C,KAAK,MAAM,OAAO,aAAa;KAC7B,MAAM,UAAU,IAAI,UAAU,IAAI,aAAa,IAAI,YAAY;KAC/D,MAAM,UAAU,IAAI,UAAU,IAAI,aAAa,IAAI,YAAY;KAC/D,QAAQ,IAAI,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,UAAU,IAAI,QAAQ,UAAU,SAAS;IAClF;GACF;GACA,IAAI,2BAA2B,GAC7B,QAAQ,IACN,gCAAgC,yBAAyB,oDAC3D;QAEA,QAAQ,IAAI,gCAAgC;GAE9C,IAAI,IAAI,IAAI,cAAc,SACxB,QAAQ,IAAI,mBAAmB,eAAe;GAEhD,QAAQ,IAAI,EAAE;GACd,QAAQ,IAAI,2BAA2B,MAAM,GAAG,UAAU;GAC1D,IAAI,oBAAoB,SAAS,GAAG;IAClC,MAAM,YAAY,oBAAoB,KAAK,QAAQ,GAAG,IAAI,OAAO,GAAG,IAAI,OAAO,EAAE,KAAK,IAAI;IAC1F,QAAQ,IAAI,4BAA4B,WAAW;GACrD;GACA,QAAQ,IACN,0BAA0B,cACxB,gBAAgB,KAAK,CAAC,IAAI,IAAI,YAAY,UAAU,oDAAoD,IAE5G;GACA,MAAM,gBAAgB,qBAClB,wBAAwB,mBAAmB,qBAAqB,IAAI,wCAAwC,OAC5G,IAAI,IAAI,iBAAiB,UACvB,yDACA;GACN,QAAQ,IAAI,aAAa;GACzB,QAAQ,IAAI,0BAA0B,YAAY;GAClD,QAAQ,IAAI,EAAE;GACd,MAAM,gBAAgB,IAAI,IAAI,oBAAoB;GAClD,MAAM,cAAc,IAAI,IAAI,cAAc;GAC1C,MAAM,oBAAoB,eAAe,QAAQ,aAAqB,CAAC,cAAc,IAAI,QAAQ,CAAC;GAClG,MAAM,2BAA2B,qBAAqB,QACnD,aAAqB,CAAC,YAAY,IAAI,QAAQ,CACjD;GACA,QAAQ,IACN,0BAA0B,qBAAqB,OAAO,IAAI,qBAAqB,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,EAAE,KACxG;GACA,QAAQ,IAAI,yBAAyB,eAAe,OAAO,IAAI,eAAe,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,EAAE,KAAK;GAC1G,IAAI,kBAAkB,SAAS,GAC7B,QAAQ,IACN,kCAAkC,kBAAkB,OAAO,IAAI,kBAAkB,KAAK,IAAI,EAAE,0EAC9F;QAEA,QAAQ,IAAI,kCAAkC;GAEhD,IAAI,yBAAyB,SAAS,GACpC,QAAQ,IACN,+CAA+C,yBAAyB,OAAO,IAAI,yBAAyB,KAAK,IAAI,EAAE,EACzH;GAEF,QAAQ,IAAI,EAAE;GACd,QAAQ,IACN,0BAA0B,UAAU,IAAI,SAAS,UAAU,KAAK,SAAS,UAAU,KAAK,eAAe,UAAU,cAAc,GACjI;GACA,MAAM,aAAa,OAAO,QAAQ,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE;GAC5E,IAAI,WAAW,SAAS,GAAG;IACzB,MAAM,UAAU,WACb,KACE,CAAC,GAAG,OAAO,GAAG,EAAE,GAAG,EAAE,IAAI,mBAAmB,KAAM,IAAI,mBAAoB,KAAK,QAAQ,CAAC,IAAI,MAAM,GACrG,EACC,KAAK,IAAI;IACZ,QAAQ,IAAI,uBAAuB,SAAS;IAC5C,QAAQ,IACN,sCAAsC,qBAAqB,GAAG,iBAAiB,KAAK,uBAAuB,KAAK,QAAQ,CAAC,EAAE,GAC7H;IACA,IAAI,uBAAuB,IACzB,QAAQ,IACN,0LACF;GAEJ;GACA,MAAM,aAAa,OAAO,QAAQ,eAAe,EAC9C,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE,EAC1B,MAAM,GAAG,CAAC;GACb,IAAI,WAAW,SAAS,GACtB,QAAQ,IACN,yBAAyB,WAAW,KAAK,CAAC,GAAG,OAAO,GAAG,EAAE,GAAG,GAAG,EAAE,KAAK,IAAI,EAAE,OAC1E,OAAO,KAAK,eAAe,EAAE,OAC9B,UACH;GAEF,QAAQ,IAAI,EAAE;GACd,MAAM,aACJ,SAAS,4BAA4B,OACjC,KAAK,IAAI,GAAG,KAAK,OAAO,KAAK,IAAI,IAAI,MAAO,SAAS,4BAA4B,KAAK,CAAC,IACvF;GACN,MAAM,eACJ,SAAS,sBAAsB,OAC3B,KAAK,IAAI,GAAG,KAAK,OAAO,KAAK,IAAI,IAAI,MAAO,SAAS,sBAAsB,EAAE,CAAC,IAC9E;GACN,QAAQ,IACN,oBAAoB,SAAS,QAAQ,eAAe,SAAS,OAAO,UAAU,SAAS,QAAQ,QACjG;GACA,IAAI,gBAAgB,QAAQ,cAAc,MACxC,QAAQ,IAAI,kBAAkB,aAAa,2BAA2B,WAAW,WAAW;GAE9F,QAAQ,IAAI,EAAE;GACd,QAAQ,IAAI,iBAAiB,WAAW,WAAW,WAAW;GAC9D,QAAQ,IAAI,iBAAiB,WAAW,WAAW,WAAW;GAC9D,QAAQ,IAAI,iBAAiB,WAAW,WAAW,WAAW;GAC9D,QAAQ,IAAI,2BAA2B,WAAW,oBAAoB,WAAW;GACjF,QAAQ,IAAI,EAAE;GACd,IAAI,MAAM,eAAe,MAAM,QAAQ,IAAI,iBAAiB,MAAM,cAAc,OAAO,MAAM,QAAQ,CAAC,EAAE,IAAI;GAC5G,IAAI,MAAM,cAAc,MAAM,QAAQ,IAAI,kBAAkB,MAAM,aAAa,OAAO,MAAM,QAAQ,CAAC,EAAE,IAAI;GAC3G,IAAI,MAAM,eAAe,QAAQ,cAAc,GAAG;IAChD,MAAM,eAAe,MAAM,cAAc;IACzC,QAAQ,IAAI,iCAAiC,aAAa,QAAQ,CAAC,GAAG;GACxE;GACA,IAAI,MAAM,eAAe,QAAQ,MAAM,cAAc,MAAM,QAAQ,IAAI,EAAE;GAMzE,uCAAuC,MALL,kCAAkC;IAClE;IACA,mBAAmB,IAAI;IACvB,YAAY,MAAM,cAAc;GAClC,CAAC,CACyD;GAC1D,QAAQ,IAAI,EAAE;GACd,IAAI,YAAY;IACd,MAAM,kBAAkB,QAAQ,qBAAqB;IACrD,QAAQ,IAAI,qCAAqC;IACjD,QAAQ,IAAI,gDAAgD,iBAAiB;IAC7E,QAAQ,IAAI,+EAA+E;IAC3F,QAAQ,IAAI,EAAE;GAChB;GACA,IAAI,SAAS,SAAS,GAAG;IACvB,MAAM,QAAQ,KAAK,IAAI;IACvB,MAAM,QAAQ;IACd,MAAM,SAAS;IAEf,MAAM,aADc,OAAO,qBAAqB,MAAM,MACrB,iBAAiB;IAClD,MAAM,kBAAkB,OACtB,MAAM,QAAQ,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,KAAK,CAAC,EAAE,KAAK,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,MAAM,CAAC,EAAE;IACpG,QAAQ,IAAI,6BAA6B,SAAS,QAAQ;IAC1D,KAAK,MAAM,KAAK,UAAU;KACxB,MAAM,SAAS,EAAE,UAAU,aAAa;KACxC,MAAM,QAAQ,EAAE,gBAAgB;KAChC,MAAM,OACJ,EAAE,eAAe,OAAO,QAAQ,KAAK,OAAO,QAAQ,EAAE,eAAe,IAAO,EAAE,SAAS;KACzF,MAAM,WAAW,iBAAiB,EAAE,YAAY;KAChD,MAAM,QAAQ,EAAE,WAAW,aAAa,EAAE,eAAe,QAAQ,QAAQ,EAAE,cAAc,WAAW;KACpG,MAAM,YACJ,SAAS,YAAY,OACjB,wBAAwB,eAAe,WAAW,GAAG,EAAE,OAAO,eAAe,QAAQ,EAAE,cACvF;KACN,MAAM,OAAO,QAAQ,IAAI,aAAa,cAAc;KACpD,QAAQ,IAAI,KAAK,OAAO,GAAG,EAAE,KAAK,OAAO,EAAE,EAAE,GAAG,MAAM,OAAO,EAAE,EAAE,GAAG,OAAO,MAAM;IACnF;IACA,QAAQ,IAAI,EAAE;GAChB;EACF,OAAO,IAAI,YAAY;GACrB,MAAM,SAAS;GACf,MAAM,WAAW,QAAQ,cAAc;GACvC,MAAM,cAAc,QAAQ,iBAAiB,EAAE,MAAM,GAAG,EAAE;GAC1D,MAAM,kBAAkB,QAAQ,qBAAqB;GACrD,QAAQ,IAAI,iCAAiC;GAC7C,QAAQ,IACN,kBAAkB,OAAO,IAAI,SAAS,OAAO,KAAK,SAAS,OAAO,KAAK,eAAe,OAAO,cAAc,GAC7G;GACA,QAAQ,IAAI,YAAY,OAAO,KAAK,QAAQ,EAAE,QAAQ;GACtD,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,EAAE,MAAM,GAAG,CAAC,GAC5D,QAAQ,IAAI,KAAK,IAAI,IAAI,OAAO;GAElC,IAAI,YAAY,SAAS,GAAG;IAC1B,QAAQ,IAAI,iCAAiC;IAC7C,KAAK,MAAM,OAAO,aAAa;KAC7B,MAAM,UAAU,IAAI,UAAU,IAAI,aAAa,IAAI,YAAY;KAC/D,MAAM,UAAU,IAAI,UAAU,IAAI,aAAa,IAAI,YAAY;KAC/D,QAAQ,IAAI,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,UAAU,IAAI,QAAQ,UAAU,SAAS;IAClF;GACF;GACA,QAAQ,IAAI,kCAAkC,iBAAiB;GAC/D,QAAQ,IAAI,EAAE;GACd,QAAQ,IAAI,gFAAgF;EAC9F,OAAO;GACL,MAAM,iBAAiB,QAAQ,2BAA2B;GAC1D,MAAM,mBAAmB,OAAO,OAAO,cAAc,EAAE,QAAQ,KAAK,UAAU,MAAM,OAAO,CAAC;GAC5F,MAAM,wBAAwB,eAAe,UAAU,MAAM,eAAe,aAAa;GACzF,MAAM,uBAAuB,mBAAmB,IAAI,uBAAuB,mBAAmB;GAC9F,QAAQ,IAAI,yBAAyB,UAAU;GAC/C,QAAQ,IAAI,4BAA4B,YAAY;GACpD,QAAQ,IAAI,uBAAuB,SAAS;GAC5C,QAAQ,IACN,kBAAkB,UAAU,IAAI,SAAS,UAAU,KAAK,SAAS,UAAU,KAAK,eAAe,UAAU,cAAc,GACzH;GACA,MAAM,eAAe,OAAO,QAAQ,cAAc,EAC/C,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE,EAC1B,KAAK,CAAC,GAAG,OAAO,GAAG,EAAE,GAAG,GAAG,EAC3B,KAAK,IAAI;GACZ,IAAI,aAAa,SAAS,GAAG;IAC3B,QAAQ,IAAI,UAAU,cAAc;IACpC,QAAQ,IACN,wCAAwC,qBAAqB,GAAG,iBAAiB,KAAK,uBAAuB,KAAK,QAAQ,CAAC,EAAE,GAC/H;IACA,IAAI,uBAAuB,IACzB,QAAQ,IACN,iJACF;GAEJ;EACF;CACF,CAAC,CACH;CAEF,IACG,QAAQ,oBAAoB,EAC5B,YAAY,+EAA+E,EAC3F,OAAO,eAAe,uCAAuC,KAAK,EAClE,OAAO,gBAAgB,qCAAqC,EAC5D,OAAO,WAAW,2EAA2E,EAC7F,OAAO,oBAAoB,wBAAwB,IAAI,EACvD,OAAO,wBAAwB,sDAAsD,KAAK,EAC1F,OACC,uBACA,uGACF,EACC,OACC,4BACA,kIACA,GACF,EACC,OAAO,iBAAiB,gDAAgD,EACxE,OAAO,UAAU,WAAW,EAC5B,OACC,SACE,OACE,MAWA,QACG;EACH,MAAM,QAAQ,OAAO,SAAS,MAAM,SAAS,OAAO,EAAE;EACtD,MAAM,YAAY,OAAO,SAAS,MAAM,aAAa,MAAM,EAAE;EAC7D,MAAM,eAAe,OAAO,SAAS,MAAM,gBAAgB,OAAO,EAAE;EACpE,MAAM,kBAAkB,MAAM,oBAAoB;EAClD,MAAM,mBAAmB,OAAO,SAAS,MAAM,oBAAoB,KAAK,EAAE;EAC1E,MAAM,UAAU,CAAC,CAAC,MAAM,WAAW,qBAAqB,GAAG;EAC3D,MAAM,uBAAuB;EAC7B,MAAM,uBAAuB;EAC7B,MAAM,qBAAqB;EAC3B,MAAM,qBAAqB;EAC3B,MAAM,4BAA4B;EAClC,MAAM,wBAAwB;EAC9B,MAAM,sBAAsB;EAC5B,MAAM,iCAAiC;EACvC,IAAI,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,GAAG;GACxC,QAAQ,MAAM,2CAA2C;GACzD,QAAQ,WAAW;GACnB;EACF;EACA,IAAI,CAAC,OAAO,SAAS,SAAS,KAAK,YAAY,GAAG;GAChD,QAAQ,MAAM,gDAAgD;GAC9D,QAAQ,WAAW;GACnB;EACF;EACA,IAAI,CAAC,OAAO,SAAS,YAAY,KAAK,eAAe,GAAG;GACtD,QAAQ,MAAM,wDAAwD;GACtE,QAAQ,WAAW;GACnB;EACF;EACA,IAAI,CAAC,OAAO,SAAS,gBAAgB,KAAK,mBAAmB,GAAG;GAC9D,QAAQ,MAAM,wDAAwD;GACtE,QAAQ,WAAW;GACnB;EACF;EACA,MAAM,SAAS,QAAQ,2BAA2B,MAAM,MAAM;EAC9D,MAAM,yBAAyB,QAAQ,2BAA2B;EAClE,MAAM,aAAa,QAAQ,0BAA0B;GAAE;GAAO,QAAQ,MAAM;EAAO,CAAC;EACpF,MAAM,SAAmB,CAAC;EAC1B,IAAI,WAAW;EACf,IAAI,UAAU;EACd,IAAI,gBAAgB;EACpB,IAAI,gBAAgB;EACpB,MAAM,cAAc,KAAK,IAAI;EAC7B,MAAM,oBAAoB;EAC1B,MAAM,kBAAkB;EACxB,IAAI,qBAAqB;EACzB,IAAI,mBAAmB;EACvB,IAAI,iBAAiB;GACnB,qBAAqB,KAAK,IAAI,sBAAsB,KAAK,IAAI,sBAAsB,SAAS,CAAC;GAC7F,mBAAmB,KAAK,IAAI,oBAAoB,KAAK,IAAI,oBAAoB,YAAY,CAAC;EAC5F;EACA,MAAM,sBAaD,CAAC;EACN,IAAI,gBAAgB;EACpB,IAAI,YAAY;EAChB,IAAI,cAAc;EAClB,IAAI,uBAAuB;EAC3B,IAAI,4BAAoC;EACxC,IAAI,2BAA2B;EAC/B,IAAI,UAAU;EACd,IAAI,MAAM,OACR,MAAM,wBACJ,sBACA,SACA,YAAY;GACV,MAAM,SAAS,0BAA0B,YAAY;IACnD,IAAI,SAAS;IACb,OAAO,SAAS,WAAW,QAAQ;KACjC,IAAI,sBAAsB;KAC1B;KACA,MAAM,QAAQ,WAAW,MAAM,QAAQ,SAAS,kBAAkB;KAClE,IAAI;KACJ,IAAI,uBAAuB;KAC3B,IAAI,mBAAmB;KACvB,IAAI,yBAAyB;KAC7B,IAAI,qBAAqB;KACzB,IAAI,qBAAqB;KACzB,IAAI;KACJ,IAAI;MACF,UAAU,MAAM,mCACR,WAAW,WAAW,MAAM,KAAK,SAAS,KAAK,IAAI,CAAC,GAC1D,4BAA4B,aAC9B;MACA,2BAA2B;KAC7B,SAAS,UAAU;MACjB,MAAM,sBAAsB,kCAAkC,QAAQ;MACtE,MAAM,oBAAoB,kCAAkC,QAAQ;MACpE,oBAAoB,2BAA2B,QAAQ;MACvD,IAAI,qBAAqB;MACzB,IAAI,mBAAmB;MACvB,IAAI,uBAAuB,qBAAqB,sBAAsB,KAAA,GACpE;MAEF,IAAI,+BAA+B,QAAQ,GAAG;OAC5C,uBAAuB;OACvB,4BAA4B;OAC5B,UAAU;OACV,OAAO,KACL,SAAS,YAAY,oFAAoF,OAAO,QAAQ,GAC1H;OACA;MACF;MACA,UAAU,CAAC;MACX,KAAK,MAAM,QAAQ,OACjB,IAAI;OACF,QAAQ,KACN,MAAM,mCACE,WAAW,MAAM,KAAK,IAAI,GAChC,2BAA2B,KAAK,IAClC,CACF;OACA,2BAA2B;MAC7B,SAAS,WAAW;OAClB,OAAO,KAAK,QAAQ,KAAK,GAAG,mBAAmB,OAAO,SAAS,GAAG;OAClE;OACA;OACA,QAAQ,KAAK,IAAI;OACjB,MAAM,cAAc,kCAAkC,SAAS;OAC/D,MAAM,YAAY,kCAAkC,SAAS;OAC7D,MAAM,eAAe,2BAA2B,SAAS;OACzD,IAAI,aAAa;OACjB,IAAI,WAAW;OACf,IAAI,eAAe,aAAa,iBAAiB,KAAA,GAC/C;OAEF,IAAI,iBAAiB,KAAA,GACnB,oBAAoB,KAAK,IAAI,qBAAqB,GAAG,YAAY;OAEnE,IAAI,+BAA+B,SAAS,GAAG;QAC7C,uBAAuB;QACvB,4BAA4B;QAC5B,UAAU;QACV;OACF;OACA;OACA,IAAI,4BAA4B,kBAAkB;QAChD,uBAAuB;QACvB,4BAA4B;QAC5B,UAAU;QACV;OACF;MACF;KAEJ;KACA,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;MACrC,IAAI,wBAAwB,KAAK,QAAQ,QAAQ;MACjD,MAAM,OAAO,MAAM;MACnB,MAAM,MAAM,QAAQ;MACpB,IAAI,CAAC,OAAO,IAAI,WAAW,GAAG;OAC5B;OACA;OACA;MACF;MACA,IAAI;OACF,IAAI;QACF,MAAM,SAAS,OAAO,KAAK,EAAE;OAC/B,QAAQ,CAER;OACA,MAAM,SAAS,MAAM;QACnB,IAAI,KAAK;QACT,MAAM,KAAK;QACX,QAAQ;QACR,YAAY;QACZ,UAAU,KAAK;OACjB,CAAC;OACD,QAAQ,eACN,KAAK,IACL,WAAW,WACX,aACA,IAAI,aAAa,GAAG,GACpB,IAAI,MACN;OACA,QAAQ,kBAAkB,KAAK,IAAI,WAAW,SAAS;OACvD;MACF,SAAS,KAAK;OACZ,OAAO,KAAK,QAAQ,KAAK,GAAG,mBAAmB,OAAO,GAAG,GAAG;OAC5D;OACA;OACA;MACF,UAAU;OACR;MACF;KACF;KACA,IAAI,iBAAiB;MACnB,MAAM,cAAc,uBAAuB,KAAK,qBAAqB,KAAK,qBAAqB;MAC/F,MAAM,oBAAoB;MAC1B,MAAM,kBAAkB;MACxB,IAAI,aAAa;OACf,gBAAgB;OAChB,qBAAqB,KAAK,IAAI,sBAAsB,KAAK,MAAM,qBAAqB,CAAC,CAAC;OACtF,mBAAmB,+BAA+B;QAChD,gBAAgB;QAChB;QACA,oBAAoB;QACpB,mBAAmB;OACrB,CAAC;MACH,OAAO;OACL;OACA,IAAI,iBAAiB,gCAAgC;QACnD,gBAAgB;QAChB,qBAAqB,KAAK,IACxB,sBACA,qBAAqB,qBACvB;QACA,mBAAmB,KAAK,IAAI,oBAAoB,mBAAmB,mBAAmB;OACxF;MACF;MACA,IAAI,sBAAsB,sBAAsB,oBAAoB,kBAClE,oBAAoB,KAAK;OACvB,QAAQ,cAAc,aAAa;OACnC;OACA;OACA,WAAW;OACX,SAAS;OACT;OACA;OACA;OACA;OACA;OACA,cAAc;OACd;MACF,CAAC;KAEL;KACA,UAAU,MAAM;KAChB,IAAI,mBAAmB,SAAS,WAAW,UAAU,CAAC,sBACpD,MAAM,MAAM,gBAAgB;IAEhC;GACF,CAAC;EACH,GACA;GACE,wBACE,oCAAoC,UAAU,GAAG,WAAW,OAAO,cAAc,KAAK,IAAI,GAAG,WAAW,SAAS,SAAS,EAAE,aAAa,SAAS,YAAY,QAAQ,kBAAkB,cAAc,kBAAkB,cAAc,UAAU,YAAY,cAAc,mBAAmB,YAAY;GAC3S,UAAU,MAAM,SAAS;EAC3B,CACF;EAEF,MAAM,QAAQ,MAAM,QAAQ,QAAQ,2BAA2B,MAAM,MAAM,IAAI;EAC/E,MAAM,aAAa,KAAK,IAAI,IAAI;EAChC,MAAM,SAAkC;GACtC,OAAO,MAAM,UAAU;GACvB,QAAQ,MAAM,UAAU;GACxB;GACA,YAAY,WAAW;GACvB,YAAY,WAAW;GACvB;GACA;GACA;GACA;GACA;GACA;GACA;GACA,WAAW;GACX;GACA;EACF;EACA,IAAI,iBACF,OAAO,WAAW;GAChB,SAAS;GACT;GACA;GACA;GACA;GACA,aAAa;EACf;EAEF,MAAM,wBAAwB,MAAM,QAAQ,QAAQ,2BAA2B,IAAI;EACnF,OAAO,kBAAkB,uCAAuC;GAC9D,aAAa,QAAQ,SAAS;GAC9B,kBAAkB;GAClB,iBAAiB;GACjB,iBAAiB;GACjB,UAAU;GACV,oBAAoB,kBAAkB,qBAAqB;GAC3D,cAAc,MAAM;GACpB,wBAAwB,MAAM,SAAS,SAAS,KAAA;GAChD,uBAAuB,MAAM,SAAS,QAAQ,KAAA;EAChD,CAAC;EACD,IAAI,sBAAsB;GACxB,OAAO,eACL,8BAA8B,iBAC1B,kCACA;GACN,QAAQ,WAAW;EACrB,OAAO,IAAI,MAAM,SAAS,gBAAgB,GACxC,QAAQ,WAAW;EAErB,IAAI,MAAM,MAAM;GACd,QAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;GAC3C;EACF;EACA,QAAQ,IACN,sBAAsB,OAAO,QAAQ,YAAY,UAAU,WAAW,OAAO,eAAe,WAAW,OAAO,aAAa,SAAS,YAAY,QAAQ,kBAAkB,cAAc,UAAU,MAAM,cAAc,MAAM,eAAe,YAC7O;EACA,IAAI,iBACF,QAAQ,IACN,8BAA8B,kBAAkB,IAAI,mBAAmB,YAAY,gBAAgB,IAAI,iBAAiB,gBAAgB,oBAAoB,QAC9J;EAEF,MAAM,MAAM,OAAO;EACnB,QAAQ,IACN,iCAAiC,IAAI,uBAAuB,KAAK,QAAQ,CAAC,EAAE,aAAa,IAAI,wBAAwB,KAAK,QAAQ,CAAC,EAAE,YAAY,IAAI,wBAAwB,UAAU,IAAI,wBAAwB,mBAAmB,IAAI,wBAAwB,SAAS,IAAI,6BACjR;EACA,IAAI,WAAW,SAAS,KAAK,CAAC,MAAM,OAAO;GACzC,QAAQ,IAAI,WAAW;GACvB,KAAK,MAAM,QAAQ,WAAW,MAAM,GAAG,EAAE,GACvC,QAAQ,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM,GAAG,EAAE,EAAE,QAAQ,QAAQ,GAAG,GAAG;GAE5F,QAAQ,IAAI,wDAAwD;EACtE;EACA,IAAI,OAAO,SAAS,GAAG;GACrB,QAAQ,KAAK,WAAW,OAAO,QAAQ;GACvC,KAAK,MAAM,OAAO,OAAO,MAAM,GAAG,EAAE,GAAG,QAAQ,KAAK,OAAO,KAAK;EAClE;EACA,IAAI,sBACF,IAAI,8BAA8B,gBAChC,QAAQ,MACN,2IAA2I,UAAU,GAAG,WAAW,OAAO,qBAAqB,SAAS,WAC1M;OAEA,QAAQ,MACN,2BAA2B,iBAAiB,8DAA8D,iBAAiB,cAAc,UAAU,GAAG,WAAW,OAAO,uDAAuD,SAAS,2CAC1O;OAEG,IAAI,MAAM,SAAS,gBAAgB,GACxC,QAAQ,KACN,oBAAoB,cAAc,2HACpC;CAEJ,CACF,CACF;CAEF,IACG,QAAQ,OAAO,EACf,YAAY,+CAA+C,EAC3D,OAAO,iBAAiB,mDAAmD,EAC3E,OACC,SAAS,OAAO,MAA8B,QAA8B;EAC1E,MAAM,UAAU,CAAC,CAAC,MAAM,WAAW,qBAAqB,GAAG;EAC3D,MAAM,SAAS,QAAQ,MAAM;EAC7B,IAAI,SAAS;GACX,MAAM,UAAU,QAAQ,+BAA+B;GACvD,IAAI,QAAQ,SAAS,GAAG;IACtB,QAAQ,IAAI,gCAAgC;IAC5C,KAAK,MAAM,MAAM,SAAS,QAAQ,IAAI,KAAK,IAAI;GACjD,OACE,QAAQ,IAAI,6CAA6C;EAE7D;EACA,MAAM,uBAAuB,QAAQ,+BAA+B;EACpE,MAAM,SAAS,QAAQ,MAAM;EAC7B,MAAM,gBAAgB,MAAM,wBAAwB,UAAU,sBAAsB;GAClF,WAAW;GACX,QAAQ,EACN,OAAO,QAAQ,QAAQ,KAAK,GAAG,EACjC;EACF,CAAC;EACD,MAAM,QAAQ,QAAQ,MAAM;EAC5B,QAAQ,IACN,UAAU,OAAO,0BAA0B,OAAO,WAAW,MAAM,oBAAoB,cAAc,QAAQ,GAAG,cAAc,UAAU,UAAU,cAAc,SAAS,IAAI,KAAK,cAAc,OAAO,YAAY,GAAG,EACxN;CACF,CAAC,CACH;CAEF,IACG,QAAQ,YAAY,EACpB,YAAY,qDAAqD,EACjE,OACC,SAAS,YAAY;EACnB,MAAM,SAAS,aAAa;EAC5B,QAAQ,IAAI,gCAAgC;CAC9C,CAAC,CACH;CAEF,IACG,QAAQ,UAAU,EAClB,YACC,6MACF,EACC,OAAO,oBAAoB,uCAAuC,IAAI,EACtE,OACC,kCACA,4IACA,GACF,EACC,OACC,8BACA,wJACA,MACF,EACC,OAAO,YAAY,kDAAkD,EACrE,OAAO,4BAA4B,6CAA6C,EAChF,OACC,SACE,OAAO,SAMD;EACJ,MAAM,YAAY,sBAAsB,MAAM,WAAW,IAAI,GAAG,GAAG;EACnE,MAAM,wBAAwB,sBAAsB,MAAM,uBAAuB,GAAG,GAAG,IAAO;EAC9F,MAAM,qBAAqB,wBAAwB,MAAM,oBAAoB,KAAM,GAAK,CAAG;EAC3F,MAAM,iBACJ,MAAM,gBAAgB,KAAK,MAC1B,IAAI,qBAAqB,6BAA6B,IAAI,kBAAkB,IAAI;EACnF,IAAI,mBAAmB,MAAM,WAAW,QAAQ,iBAAiB,sBAAsB,cAAc,IAAI;EAGzG,MAAM,aACJ,OAAQ,QAAmC,aAAa,aACnD,QAA2E,SAAS,EACnF,mBAAmB,MACrB,CAAC,IACD,QAAQ,OAAO,EAAE,mBAAmB,MAAM,CAAC,EAAE;EAEnD,MAAM,aAAa,YAAY;GAC7B,QAAQ,IAAI,kDAAkD,WAAW,UAAU;GACnF,IAAI,kBAAkB;IACpB,QAAQ,IACN,gDAAgD,iBAAiB,OAAO,GAAG,iBAAiB,OAC9F;IACA,IAAI,iBAAiB,UAAU,YAAY;KACzC,QAAQ,KACN,+BAA+B,iBAAiB,MAAM,qCAAqC,WAAW,0CACxG;KACA,mBAAmB;IACrB,OAAO,IAAI,iBAAiB,SAAS,GAAG;KACtC,QAAQ,KACN,wHACF;KACA,mBAAmB;IACrB;GACF;GACA,QAAQ,IAAI,qDAAqD;GAEjE,IAAI;GACJ,IAAI;IACF,kBAAkB,MAAM,SAAS,kBAAkB;GACrD,SAAS,KAAK;IACZ,QAAQ,MAAM,mDAAmD,KAAK;IACtE,QAAQ,KAAK,CAAC;GAChB;GACA,IAAI,IAAI,oBACN,gCAAgC,IAAI,oBAAoB;IACtD,OAAO;IACP,qBAAI,IAAI,KAAK,GAAE,YAAY;IAC3B,SAAS;KAAE;KAAY;KAAW;KAAuB;KAAoB;IAAgB;GAC/F,CAAC;GAGH,QAAQ,IAAI,4EAA4E;GACxF,MAAM,SAAS,MAAM,kBAAkB;IACrC;IACA;IACA;IACA;IACA;IACA,iBAAiB;IACjB,YACE,eAAe,SAAS,IACpB;KACE,YAAa,mBAAmB,EAAE,QAAQ,iBAAiB,OAAO,IAAI;KACtE,OAAO,UAAU,uBAAuB,gBAAgB,KAAK;KAC7D,aAAa;MACX,IAAI,WAAW,cAAc,GAAG,WAAW,cAAc;KAC3D;IACF,IACA,KAAA;IACN,aAAa,WAAW,UAAU;KAChC,IAAI,QAAQ,KAAK,YAAY,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,EAAE,CAAC,MAAM,GAAG;MACtE,QAAQ,OAAO,MAAM,KAAK,UAAU,GAAG,MAAM,qBAAqB;MAClE,IAAI,IAAI,oBACN,gCAAgC,IAAI,oBAAoB;OACtD,OAAO;OACP,qBAAI,IAAI,KAAK,GAAE,YAAY;OAC3B,SAAS;QAAE;QAAW;OAAM;MAC9B,CAAC;KAEL;IACF;IACA,QAAQ;KAAE,OAAO,MAAM,QAAQ,IAAI,CAAC;KAAG,OAAO,MAAM,QAAQ,KAAK,CAAC;IAAE;GACtE,CAAC;GAED,QAAQ,IACN,oCAAoC,OAAO,SAAS,aAAa,OAAO,QAAQ,YAAY,OAAO,OAAO,OAAO,SACnH;GAEA,IAAI,OAAO,OAAO,SAAS,KAAK,OAAO,OAAO,UAAU,IACtD,KAAK,MAAM,KAAK,OAAO,QAAQ,QAAQ,KAAK,OAAO,GAAG;QACjD,IAAI,OAAO,OAAO,SAAS,IAAI;IACpC,QAAQ,KAAK,MAAM,OAAO,OAAO,OAAO,mBAAmB;IAC3D,KAAK,MAAM,KAAK,OAAO,OAAO,MAAM,GAAG,CAAC,GAAG,QAAQ,KAAK,OAAO,GAAG;GACpE;GAIA,IAAI,OAAO,SAAS;IAClB,IAAI,IAAI,oBACN,gCAAgC,IAAI,oBAAoB;KACtD,OAAO;KACP,qBAAI,IAAI,KAAK,GAAE,YAAY;KAC3B,SAAS;MACP,UAAU,OAAO;MACjB,SAAS,OAAO;MAChB,QAAQ,OAAO,OAAO;MACtB,WAAW,OAAO;MAClB,OAAO,OAAO;MACd,aAAa,OAAO,eAAe;MACnC;KACF;IACF,CAAC;IAEH,QAAQ,MACN,sBAAsB,OAAO,SAAS,aAAa,OAAO,QAAQ,YAAY,OAAO,OAAO,OAAO,qBACnF,OAAO,UAAU,GAAG,OAAO,MAAM,yCACnD;IACA,QAAQ,MAAM,WAAW,OAAO,eAAe,WAAW;IAC1D,QAAQ,MAAM,qCAAqC;IACnD,QAAQ,MAAM,0CAA0C,iBAAiB;IACzE,QAAQ,MAAM,6EAA6E;IAC3F,QAAQ,KAAK,CAAC;GAChB;GAGA,MAAM,cAAc,KAAK,KAAK,aAAa,kBAAkB;GAC7D,IAAI,OAAO,WAAW,aAAa;IACjC,QAAQ,MACN,iCAAiC,OAAO,SAAS,+BAA+B,YAAY,KACrF,qBAAqB,KAAK,QAAQ,CAAC,EAAE,OAAO,WAAW,SAChE;IACA,QAAQ,MAAM,8CAA8C;IAC5D,QAAQ,MAAM,0CAA0C,iBAAiB;IACzE,QAAQ,MAAM,yDAAyD;IACvE,QAAQ,KAAK,CAAC;GAChB;GAEA,QAAQ,IACN,iCAAiC,OAAO,SAAS,MAAM,YAAY,cAAc,qBAAqB,KAAK,QAAQ,CAAC,EAAE,OAAO,WAAW,EAC1I;GACA,QAAQ,IAAI,+CAA+C;GAE3D,IAAI;IACF,MAAM,SAAS,gBAAgB,iBAAiB,oBAAoB,UAAU;GAChF,SAAS,KAAK;IACZ,QAAQ,MAAM,gDAAgD,KAAK;IACnE,QAAQ,MAAM,qCAAqC;IACnD,QAAQ,MAAM,0CAA0C,iBAAiB;IACzE,QAAQ,KAAK,CAAC;GAChB;GAGA,QAAQ,IAAI,oDAAoD;GAChE,MAAM,WAAW,YAAY,OAAO,WACzB;IACL,MAAM,QAA+B,CAAC;IACtC,IAAI,SAAS;IACb,MAAM,YAAY;IAClB,OAAO,MAAM;KACX,MAAM,QAAQ,QAAQ,SAAS,QAAQ,WAAW,EAAE,mBAAmB,MAAM,CAAC;KAC9E,IAAI,MAAM,WAAW,GAAG;KACxB,MAAM,KAAK,GAAG,KAAK;KACnB,UAAU,MAAM;IAClB;IACA,OAAO;GACT,GAAG,IACF,QAAwF,OAAO,EAC9F,mBAAmB,MACrB,CAAC;GAEL,KAAK,MAAM,QAAQ,UACjB,IAAI;IACF,QAAQ,kBAAkB,KAAK,IAAI,WAAW,SAAS;GACzD,QAAQ,CAER;GAGF,IAAI,IAAI,oBACN,gCAAgC,IAAI,oBAAoB;IACtD,OAAO;IACP,qBAAI,IAAI,KAAK,GAAE,YAAY;IAC3B,SAAS;KACP,UAAU,OAAO;KACjB,SAAS,OAAO;KAChB,QAAQ,OAAO,OAAO;KACtB,OAAO,OAAO;KACd;IACF;GACF,CAAC;GAGH,QAAQ,IAAI,wBAAwB,OAAO,SAAS,gCAAgC;GACpF,QAAQ,IAAI,6EAA6E;EAC3F;EAEA,IAAI,OAAQ,SAA8C,uBAAuB,YAC/E,MACE,SAGA,mBAAmB,UAAU;OAE/B,MAAM,WAAW;CAErB,CACF,CACF;CAEF,IACG,QAAQ,gBAAgB,EACxB,YACC,4IACF,EACC,OACC,+BACA,gFACA,UACF,EACC,OAAO,mBAAmB,4DAA4D,KAAK,EAC3F,OAAO,UAAU,kBAAkB,EACnC,OACC,SAAS,OAAO,SAA2E;EACzF,MAAM,uBAAuB,QAAoD,aAA6B;GAC5G,IAAI,WAAW,gBAAgB,OAAO;GACtC,IAAI,WAAW,YAAY,OAAO;GAClC,OAAO,KAAK,IAAI,UAAU,GAAI;EAChC;EACA,MAAM,YAAY,OAAO,MAAM,mBAAmB,UAAU,EACzD,KAAK,EACL,YAAY;EACf,MAAM,SAAS,cAAc,kBAAkB,cAAc,eAAe,YAAY;EACxF,MAAM,WAAW,sBAAsB,MAAM,UAAU,KAAK,GAAG,GAAI;EACnE,MAAM,SAAS;GACb;GACA;GACA,4BAAW,IAAI,KAAK,GAAE,YAAY;GAClC,kBAAkB,QAAQ,2BAA2B;GACrD,YAAY;GACZ,UAAU;IAAE,WAAW;IAAG,kBAAkB;IAAG,YAAY;GAAE;GAC7D,WAAW;IACT,eAAe;IACf,sBAAsB;IACtB,eAAe;IACf,sBAAsB;IACtB,sBAAsB;GACxB;GACA,iBAAiB;GACjB,QAAQ,CAAC;EACX;EAGA,MAAM,aAAa,QAAQ,0BAA0B,EAAE,OAAO,KAAK,IAAI,KAAK,QAAQ,EAAE,CAAC;EACvF,MAAM,kBAAkB,oBAAoB,QAAQ,QAAQ;EAC5D,KAAK,MAAM,QAAQ,WAAW,MAAM,GAAG,eAAe,GACpD,IAAI;GACF,MAAM,MAAM,MAAM,WAAW,MAAM,KAAK,IAAI;GAC5C,MAAM,SAAS,MAAM;IACnB,IAAI,KAAK;IACT,MAAM,KAAK;IACX,QAAQ;IACR,YAAY;IACZ,UAAU,KAAK;GACjB,CAAC;GACD,OAAO;EACT,SAAS,KAAK;GACZ,OAAO,OAAO,KAAK,WAAW,KAAK,GAAG,IAAI,OAAO,GAAG,GAAG;EACzD;EAIF,IAAI;GACF,OAAO,WAAW,MAAM,SAAS,SAAS;EAC5C,SAAS,KAAK;GACZ,OAAO,OAAO,KAAK,aAAa,OAAO,GAAG,GAAG;EAC/C;EAGA,IAAI;GACF,MAAM,YAAY,IAAI,IAAI,QAAQ,UAAU,CAAC;GAC7C,MAAM,YAAY,MAAM,SAAS,UAAU;GAC3C,MAAM,cAAc,IAAI,IAAI,SAAS;GACrC,MAAM,gBAAgB,UAAU,QAAQ,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;GACjE,MAAM,gBAAgB,MAAM,KAAK,SAAS,EAAE,QAAQ,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;GAC/E,OAAO,UAAU,gBAAgB,cAAc;GAC/C,OAAO,UAAU,gBAAgB,cAAc;GAE/C,KAAK,MAAM,MAAM,eACf,IAAI;IACF,MAAM,SAAS,OAAO,EAAE;IACxB,OAAO,UAAU;GACnB,SAAS,KAAK;IACZ,OAAO,OAAO,KAAK,wBAAwB,GAAG,IAAI,OAAO,GAAG,GAAG;GACjE;GAGF,MAAM,eAAe,KAAK,IAAI,oBAAoB,QAAQ,QAAQ,GAAG,cAAc,MAAM;GACzF,KAAK,MAAM,MAAM,cAAc,MAAM,GAAG,YAAY,GAClD,IAAI;IACF,MAAM,OAAO,QAAQ,QAAQ,EAAE;IAC/B,IAAI,CAAC,MAAM;KACT,OAAO,UAAU;KACjB;IACF;IACA,MAAM,MAAM,MAAM,WAAW,MAAM,KAAK,IAAI;IAC5C,MAAM,SAAS,MAAM;KACnB,IAAI,KAAK;KACT,MAAM,KAAK;KACX,QAAQ;KACR,YAAY,KAAK,cAAc;KAC/B,UAAU,KAAK;IACjB,CAAC;IACD,OAAO,UAAU;GACnB,SAAS,KAAK;IACZ,OAAO,OAAO,KAAK,yBAAyB,GAAG,IAAI,OAAO,GAAG,GAAG;GAClE;GAEF,OAAO,UAAU,wBAAwB,KAAK,IAAI,GAAG,cAAc,SAAS,YAAY;EAC1F,SAAS,KAAK;GACZ,OAAO,OAAO,KAAK,cAAc,OAAO,GAAG,GAAG;EAChD;EAEA,OAAO,kBAAkB,QAAQ,2BAA2B;EAC5D,MAAM,8BAAa,IAAI,KAAK,GAAE,YAAY;EAC1C,IAAI,IAAI,oBACN,gCAAgC,IAAI,oBAAoB;GACtD,OAAO;GACP,IAAI;GACJ,SAAS;EACX,CAAC;EAEH,IAAI,MAAM,MAAM;GACd,QAAQ,IAAI,KAAK,UAAU;IAAE,GAAG;IAAQ;GAAW,GAAG,MAAM,CAAC,CAAC;GAC9D;EACF;EACA,QAAQ,IAAI,wBAAwB;EACpC,QAAQ,IAAI,YAAY,OAAO,OAAO,YAAY,OAAO,UAAU;EACnE,QAAQ,IAAI,wBAAwB,OAAO,iBAAiB,SAAS,OAAO,iBAAiB;EAC7F,QAAQ,IACN,yBAAyB,OAAO,SAAS,UAAU,oBAAoB,OAAO,SAAS,iBAAiB,cAAc,OAAO,SAAS,YACxI;EACA,QAAQ,IACN,8BAA8B,OAAO,UAAU,cAAc,WAAW,OAAO,UAAU,qBAAqB,kBAAkB,OAAO,UAAU,cAAc,WAAW,OAAO,UAAU,qBAAqB,WAAW,OAAO,UAAU,sBAC9O;EACA,IAAI,OAAO,OAAO,SAAS,GAAG;GAC5B,QAAQ,IAAI,YAAY,OAAO,OAAO,QAAQ;GAC9C,KAAK,MAAM,OAAO,OAAO,OAAO,MAAM,GAAG,EAAE,GAAG,QAAQ,IAAI,SAAS,KAAK;GACxE,QAAQ,WAAW;EACrB;CACF,CAAC,CACH;CAEF,IACG,QAAQ,0BAA0B,EAClC,YACC,kJAEF,EACC,OAAO,WAAW,gEAAgE,EAClF,OAAO,UAAU,kBAAkB,EACnC,OACC,SAAS,OAAO,SAA+C;EAC7D,MAAM,QAAQ,MAAM,UAAU;EAC9B,MAAM,gBAA0B,CAAC;EACjC,MAAM,qBAA+B,CAAC;EACtC,MAAM,qBAA+B,CAAC;EACtC,IAAI,oBAAoB;EACxB,MAAM,wBAAwB;GAC5B,IAAI;IACF,OAAO,YAAY,OAAO,IACtB,QAAQ,SAAS,EAAE,QAAQ,wDAAwD,IACnF;GACN,QAAQ;IACN,OAAO;GACT;EACF,GAAG;EACH,MAAM,mBAAmB,OACvB,UACoB;GACpB,IAAI,kBAAkB;GACtB,KAAK,MAAM,QAAQ,OAAO;IACxB,IAAI,CAAC,uBAAuB;KAAE,MAAM,KAAK;KAAM,UAAU,KAAK;KAAU,QAAQ,KAAK;IAAO,CAAC,GAAG;IAChG,IAAI,gBAAgB,IAAI,KAAK,EAAE,GAAG;KAChC,mBAAmB,KAAK,KAAK,EAAE;KAC/B;IACF;IACA,IAAI,CAAC,OAAO;KACV,cAAc,KAAK,KAAK,EAAE;KAC1B;IACF;IACA,IAAI;KACF,MAAM,SAAS,OAAO,KAAK,EAAE;KAC7B;IACF,SAAS,KAAK;KACZ,mBAAmB,KAAK,iBAAiB,KAAK,GAAG,IAAI,OAAO,GAAG,GAAG;IACpE;IACA,IAAI;KACF,QAAQ,UAAU,KAAK,IAAI,IAAI;KAC/B,cAAc,KAAK,KAAK,EAAE;KAC1B;IACF,SAAS,KAAK;KACZ,mBAAmB,KAAK,aAAa,KAAK,GAAG,IAAI,OAAO,GAAG,GAAG;IAChE;GACF;GACA,OAAO;EACT;EACA,IAAI,YAAY,OAAO,GAAG;GACxB,MAAM,YAAY;GAGlB,IAAI,SAAS;GACb,OAAO,MAAM;IACX,MAAM,QAAQ,QAAQ,SAAS,QAAQ,WAAW,EAAE,mBAAmB,MAAM,CAAC;IAC9E,IAAI,MAAM,WAAW,GAAG;IACxB,MAAM,aAAa,MAAM,iBAAiB,KAAK;IAG/C,IAAI,CAAC,OACH,UAAU;SACL,IAAI,eAAe,GAExB,UAAU;GAEd;EACF,OAAO;GAEL,MAAM,WACJ,QACA,OAAO,EACP,mBAAmB,MACrB,CAAC;GACD,MAAM,YAAY;GAClB,KAAK,IAAI,SAAS,GAAG,SAAS,SAAS,QAAQ,UAAU,WAEvD,MAAM,iBADQ,SAAS,MAAM,QAAQ,SAAS,SACnB,CAAC;EAEhC;EAEA,IAAI,SAAS,IAAI,oBACf,2BAA2B,IAAI,oBAAoB,oCAAoC;EAGzF,MAAM,SAAS;GACb;GACA,YAAY,cAAc;GAC1B;GACA,iBAAiB,mBAAmB;GACpC;GACA,eAAe,QAAQ,oBAAoB;GAC3C;EACF;EAEA,IAAI,MAAM,MAAM;GACd,QAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;GAC3C;EACF;EAEA,IAAI,cAAc,WAAW,GAAG;GAC9B,QAAQ,IAAI,mDAAmD;GAC/D;EACF;EAEA,QAAQ,IACN,4BAA4B,QAAQ,YAAY,UAAU,IAAI,cAAc,OAAO,6BACrF;EACA,IAAI,mBAAmB,SAAS,GAC9B,QAAQ,IAAI,2BAA2B,mBAAmB,QAAQ;EAEpE,IAAI,CAAC,OAAO;GACV,QAAQ,IAAI,oEAAoE;GAChF,QAAQ,IAAI,WAAW;GACvB,KAAK,MAAM,MAAM,eAAe,QAAQ,IAAI,KAAK,IAAI;GACrD,IAAI,mBAAmB,SAAS,GAAG;IACjC,QAAQ,IAAI,mCAAmC;IAC/C,KAAK,MAAM,MAAM,oBAAoB,QAAQ,IAAI,KAAK,IAAI;GAC5D;EACF,OAAO;GACL,QAAQ,IAAI,oBAAoB,mBAAmB;GACnD,IAAI,mBAAmB,SAAS,GAAG;IACjC,QAAQ,KAAK,WAAW,mBAAmB,QAAQ;IACnD,KAAK,MAAM,KAAK,mBAAmB,MAAM,GAAG,EAAE,GAAG,QAAQ,KAAK,OAAO,GAAG;IACxE,QAAQ,WAAW;GACrB;EACF;CACF,CAAC,CACH;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"register-validate-cron-exit.js","names":[],"sources":["../../../../cli/commands/manage/register-validate-cron-exit.ts"],"sourcesContent":["/**\n * CLI command to validate cron exit ledger after maintenance runs.\n *\n * This can be called from within a cron job message to validate that all\n * required steps completed successfully and fail the job if they didn't.\n */\n\nimport { type Chainable, withExit } from \"../../shared.js\";\nimport {\n validateMaintenanceExecution,\n generateCronStatusReport,\n type ExitValidationResult,\n} from \"../../../services/cron-exit-validator.js\";\n\nexport function registerValidateCronExit(hybrid: Chainable): void {\n hybrid\n .command(\"validate-cron-exit\")\n .description(\"Validate cron exit ledger (internal use by cron jobs)\")\n .requiredOption(\"--exit-path <path>\", \"Path to HM_EXIT file\")\n .option(\"--log-path <path>\", \"Path to HM_LOG file\")\n .requiredOption(\"--required-steps <steps...>\", \"Required step names (space-separated)\")\n .option(\"--allow-skip\", \"Allow skip variants (e.g., distill-skipped) to count as success\")\n .option(\"--json\", \"Output JSON result\")\n .action(\n withExit(\n async (opts: {\n exitPath: string;\n logPath?: string;\n requiredSteps: string[];\n allowSkip?: boolean;\n json?: boolean;\n }) => {\n const result = validateMaintenanceExecution(\n opts.exitPath,\n opts.logPath,\n opts.requiredSteps,\n !!opts.allowSkip,\n );\n\n if (opts.json) {\n console.log(generateCronStatusReport(result));\n } else {\n printValidationResult(result);\n }\n\n if (result.maintenanceStatus === \"failed\" || result.maintenanceStatus === \"partial\") {\n process.exitCode = 1;\n }\n },\n ),\n );\n}\n\nfunction printValidationResult(result: ExitValidationResult): void {\n console.log(\"\\n=== Maintenance Validation ===\");\n console.log(`Status: ${result.maintenanceStatus.toUpperCase()}`);\n\n if (result.exitPath) {\n console.log(`Exit ledger: ${result.exitPath}`);\n }\n if (result.logPath) {\n console.log(`Log file: ${result.logPath}`);\n }\n\n console.log(`\\nSteps executed: ${result.steps.length}`);\n for (const step of result.steps) {\n const status = step.exitCode === 0 ? \"✓\" : \"✗\";\n console.log(` ${status} ${step.step} (exit=${step.exitCode})`);\n }\n\n if (result.missingSteps.length > 0) {\n console.log(`\\nMissing steps: ${result.missingSteps.join(\", \")}`);\n }\n\n if (result.failedSteps.length > 0) {\n console.log(\"\\nFailed steps:\");\n for (const step of result.failedSteps) {\n console.log(` ✗ ${step.step} (exit=${step.exitCode})`);\n }\n }\n\n if (result.error) {\n console.log(`\\nError: ${result.error}`);\n }\n\n console.log(`\\nGuard file update: ${result.guardUpdated ? \"YES\" : \"NO\"}`);\n console.log(\"==============================\\n\");\n}\n"],"mappings":";;;;;;;;;AAcA,SAAgB,yBAAyB,QAAyB;CAChE,OACG,QAAQ,qBAAqB,CAC7B,YAAY,wDAAwD,CACpE,eAAe,sBAAsB,uBAAuB,CAC5D,OAAO,qBAAqB,sBAAsB,CAClD,eAAe,+BAA+B,wCAAwC,CACtF,OAAO,gBAAgB,kEAAkE,CACzF,OAAO,UAAU,qBAAqB,CACtC,OACC,SACE,OAAO,SAMD;EACJ,MAAM,SAAS,6BACb,KAAK,UACL,KAAK,SACL,KAAK,eACL,CAAC,CAAC,KAAK,UACR;EAED,IAAI,KAAK,MACP,QAAQ,IAAI,yBAAyB,OAAO,CAAC;OAE7C,sBAAsB,OAAO;EAG/B,IAAI,OAAO,sBAAsB,YAAY,OAAO,sBAAsB,WACxE,QAAQ,WAAW;GAGxB,CACF;;AAGL,SAAS,sBAAsB,QAAoC;CACjE,QAAQ,IAAI,mCAAmC;CAC/C,QAAQ,IAAI,WAAW,OAAO,kBAAkB,aAAa,GAAG;CAEhE,IAAI,OAAO,UACT,QAAQ,IAAI,gBAAgB,OAAO,WAAW;CAEhD,IAAI,OAAO,SACT,QAAQ,IAAI,aAAa,OAAO,UAAU;CAG5C,QAAQ,IAAI,qBAAqB,OAAO,MAAM,SAAS;CACvD,KAAK,MAAM,QAAQ,OAAO,OAAO;EAC/B,MAAM,SAAS,KAAK,aAAa,IAAI,MAAM;EAC3C,QAAQ,IAAI,KAAK,OAAO,GAAG,KAAK,KAAK,SAAS,KAAK,SAAS,GAAG;;CAGjE,IAAI,OAAO,aAAa,SAAS,GAC/B,QAAQ,IAAI,oBAAoB,OAAO,aAAa,KAAK,KAAK,GAAG;CAGnE,IAAI,OAAO,YAAY,SAAS,GAAG;EACjC,QAAQ,IAAI,kBAAkB;EAC9B,KAAK,MAAM,QAAQ,OAAO,aACxB,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,KAAK,SAAS,GAAG;;CAI3D,IAAI,OAAO,OACT,QAAQ,IAAI,YAAY,OAAO,QAAQ;CAGzC,QAAQ,IAAI,wBAAwB,OAAO,eAAe,QAAQ,OAAO;CACzE,QAAQ,IAAI,mCAAmC"}
1
+ {"version":3,"file":"register-validate-cron-exit.js","names":[],"sources":["../../../../cli/commands/manage/register-validate-cron-exit.ts"],"sourcesContent":["/**\n * CLI command to validate cron exit ledger after maintenance runs.\n *\n * This can be called from within a cron job message to validate that all\n * required steps completed successfully and fail the job if they didn't.\n */\n\nimport { type Chainable, withExit } from \"../../shared.js\";\nimport {\n validateMaintenanceExecution,\n generateCronStatusReport,\n type ExitValidationResult,\n} from \"../../../services/cron-exit-validator.js\";\n\nexport function registerValidateCronExit(hybrid: Chainable): void {\n hybrid\n .command(\"validate-cron-exit\")\n .description(\"Validate cron exit ledger (internal use by cron jobs)\")\n .requiredOption(\"--exit-path <path>\", \"Path to HM_EXIT file\")\n .option(\"--log-path <path>\", \"Path to HM_LOG file\")\n .requiredOption(\"--required-steps <steps...>\", \"Required step names (space-separated)\")\n .option(\"--allow-skip\", \"Allow skip variants (e.g., distill-skipped) to count as success\")\n .option(\"--json\", \"Output JSON result\")\n .action(\n withExit(\n async (opts: {\n exitPath: string;\n logPath?: string;\n requiredSteps: string[];\n allowSkip?: boolean;\n json?: boolean;\n }) => {\n const result = validateMaintenanceExecution(\n opts.exitPath,\n opts.logPath,\n opts.requiredSteps,\n !!opts.allowSkip,\n );\n\n if (opts.json) {\n console.log(generateCronStatusReport(result));\n } else {\n printValidationResult(result);\n }\n\n if (result.maintenanceStatus === \"failed\" || result.maintenanceStatus === \"partial\") {\n process.exitCode = 1;\n }\n },\n ),\n );\n}\n\nfunction printValidationResult(result: ExitValidationResult): void {\n console.log(\"\\n=== Maintenance Validation ===\");\n console.log(`Status: ${result.maintenanceStatus.toUpperCase()}`);\n\n if (result.exitPath) {\n console.log(`Exit ledger: ${result.exitPath}`);\n }\n if (result.logPath) {\n console.log(`Log file: ${result.logPath}`);\n }\n\n console.log(`\\nSteps executed: ${result.steps.length}`);\n for (const step of result.steps) {\n const status = step.exitCode === 0 ? \"✓\" : \"✗\";\n console.log(` ${status} ${step.step} (exit=${step.exitCode})`);\n }\n\n if (result.missingSteps.length > 0) {\n console.log(`\\nMissing steps: ${result.missingSteps.join(\", \")}`);\n }\n\n if (result.failedSteps.length > 0) {\n console.log(\"\\nFailed steps:\");\n for (const step of result.failedSteps) {\n console.log(` ✗ ${step.step} (exit=${step.exitCode})`);\n }\n }\n\n if (result.error) {\n console.log(`\\nError: ${result.error}`);\n }\n\n console.log(`\\nGuard file update: ${result.guardUpdated ? \"YES\" : \"NO\"}`);\n console.log(\"==============================\\n\");\n}\n"],"mappings":";;;;;;;;;AAcA,SAAgB,yBAAyB,QAAyB;CAChE,OACG,QAAQ,oBAAoB,EAC5B,YAAY,uDAAuD,EACnE,eAAe,sBAAsB,sBAAsB,EAC3D,OAAO,qBAAqB,qBAAqB,EACjD,eAAe,+BAA+B,uCAAuC,EACrF,OAAO,gBAAgB,iEAAiE,EACxF,OAAO,UAAU,oBAAoB,EACrC,OACC,SACE,OAAO,SAMD;EACJ,MAAM,SAAS,6BACb,KAAK,UACL,KAAK,SACL,KAAK,eACL,CAAC,CAAC,KAAK,SACT;EAEA,IAAI,KAAK,MACP,QAAQ,IAAI,yBAAyB,MAAM,CAAC;OAE5C,sBAAsB,MAAM;EAG9B,IAAI,OAAO,sBAAsB,YAAY,OAAO,sBAAsB,WACxE,QAAQ,WAAW;CAEvB,CACF,CACF;AACJ;AAEA,SAAS,sBAAsB,QAAoC;CACjE,QAAQ,IAAI,kCAAkC;CAC9C,QAAQ,IAAI,WAAW,OAAO,kBAAkB,YAAY,GAAG;CAE/D,IAAI,OAAO,UACT,QAAQ,IAAI,gBAAgB,OAAO,UAAU;CAE/C,IAAI,OAAO,SACT,QAAQ,IAAI,aAAa,OAAO,SAAS;CAG3C,QAAQ,IAAI,qBAAqB,OAAO,MAAM,QAAQ;CACtD,KAAK,MAAM,QAAQ,OAAO,OAAO;EAC/B,MAAM,SAAS,KAAK,aAAa,IAAI,MAAM;EAC3C,QAAQ,IAAI,KAAK,OAAO,GAAG,KAAK,KAAK,SAAS,KAAK,SAAS,EAAE;CAChE;CAEA,IAAI,OAAO,aAAa,SAAS,GAC/B,QAAQ,IAAI,oBAAoB,OAAO,aAAa,KAAK,IAAI,GAAG;CAGlE,IAAI,OAAO,YAAY,SAAS,GAAG;EACjC,QAAQ,IAAI,iBAAiB;EAC7B,KAAK,MAAM,QAAQ,OAAO,aACxB,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,KAAK,SAAS,EAAE;CAE1D;CAEA,IAAI,OAAO,OACT,QAAQ,IAAI,YAAY,OAAO,OAAO;CAGxC,QAAQ,IAAI,wBAAwB,OAAO,eAAe,QAAQ,MAAM;CACxE,QAAQ,IAAI,kCAAkC;AAChD"}
@@ -51,6 +51,13 @@ function parseBoundedFloatOption(raw, fallback, min, max) {
51
51
  const parsed = Number.parseFloat(String(raw ?? fallback));
52
52
  return Math.max(min, Math.min(max, Number.isFinite(parsed) ? parsed : fallback));
53
53
  }
54
+ function formatRatioPercent(value) {
55
+ return `${(value * 100).toFixed(2)}%`;
56
+ }
57
+ function formatVectorLifecycleSloBreach(breach) {
58
+ if (breach.key === "vectorless_ratio") return `${breach.key} actual=${breach.actual} (${formatRatioPercent(breach.actual)}) target=${breach.target} (${formatRatioPercent(breach.target)})`;
59
+ return `${breach.key} actual=${breach.actual} target=${breach.target}`;
60
+ }
54
61
  const SYNC_BUNDLE_MIN_ITERATIONS = 1e5;
55
62
  const SYNC_BUNDLE_MAX_ITERATIONS = 2e6;
56
63
  const SYNC_BUNDLE_SALT_BYTES = 16;
@@ -275,7 +282,7 @@ function buildAuditHealthReport(factsDb, getMemoryCategories, entityStopWords =
275
282
  const rows = raw.prepare(`SELECT text FROM facts
276
283
  WHERE superseded_at IS NULL AND source = 'implicit-feedback'
277
284
  AND (category = 'pattern' OR (${SQL_IMPLICIT_TRAJECTORY_LESSON_FILTER}))
278
- LIMIT ?`).all(cap + 1);
285
+ LIMIT ?`).all(20001);
279
286
  const truncated = rows.length > cap;
280
287
  const forAgg = truncated ? rows.slice(0, cap) : rows;
281
288
  if (forAgg.length === 0) return [];
@@ -401,7 +408,7 @@ function buildAuditHealthReport(factsDb, getMemoryCategories, entityStopWords =
401
408
  if (entityStopwordMatches.length > 0) warnings.push(`Top entities include stop-word-like labels: ${entityStopwordMatches.map((row) => row.entity).join(", ")}.`);
402
409
  if (vectorless > 0) warnings.push(`${vectorless} active non-kv fact(s) are missing canonical embeddings.`);
403
410
  if (degraded) warnings.push(`Vector store is in degraded mode${degradedReason ? ` (reason: ${degradedReason})` : ""}; semantic retrieval may be unavailable.`);
404
- if (vectorLifecycleSloBreaches.length > 0) warnings.push(`Vector lifecycle SLO breach(es): ${vectorLifecycleSloBreaches.map((b) => `${b.key} actual=${b.actual} target=${b.target}`).join("; ")}`);
411
+ if (vectorLifecycleSloBreaches.length > 0) warnings.push(`Vector lifecycle SLO breach(es): ${vectorLifecycleSloBreaches.map(formatVectorLifecycleSloBreach).join("; ")}`);
405
412
  if (procedureTriage.summary.total > 0) {
406
413
  const reasonBreakdown = Object.entries(procedureTriage.summary.byReason).filter(([, count]) => count > 0).map(([reason, count]) => `${reason}=${count}`).join(", ");
407
414
  warnings.push(`${procedureTriage.summary.total} validated procedure(s) are not promoted (${reasonBreakdown}).`);
@@ -531,7 +538,7 @@ function printAuditHealthMarkdown(report) {
531
538
  console.log(`Vectorless active non-kv facts: ${report.vectorless}`);
532
539
  console.log(`Vector integrity score: ${report.vectorIntegrity.score}/100 (degraded=${report.vectorIntegrity.degraded ? "yes" : "no"}; vectorlessRatio=${report.vectorIntegrity.vectorlessRatio})`);
533
540
  if (report.vectorIntegrity.degradedReason) console.log(`Vector degraded reason: ${report.vectorIntegrity.degradedReason}`);
534
- if (report.vectorLifecycleSlo.breaches.length > 0) console.log(`Vector lifecycle SLO breaches: ${report.vectorLifecycleSlo.breaches.map((b) => `${b.key} actual=${b.actual} target=${b.target}`).join(", ")}`);
541
+ if (report.vectorLifecycleSlo.breaches.length > 0) console.log(`Vector lifecycle SLO breaches: ${report.vectorLifecycleSlo.breaches.map(formatVectorLifecycleSloBreach).join(", ")}`);
535
542
  if (report.vectorlessBySource.length > 0) console.log(`Vectorless by source: ${report.vectorlessBySource.map((r) => `${r.source}=${r.count}`).join(", ")}`);
536
543
  console.log(`Procedures: ${report.procedures.total} (validated: ${report.procedures.validated}, promoted: ${report.procedures.promoted}, blocked: ${report.procedures.blocked}${report.procedures.topBlockReason ? ` by ${report.procedures.topBlockReason}` : ""})`);
537
544
  console.log(`Tiers: ${JSON.stringify(report.tiers)}`);