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":"features.js","names":[],"sources":["../../../config/parsers/features.ts"],"sourcesContent":["import { DEFAULT_GLITCHTIP_DSN } from \"../../services/error-reporter.js\";\nimport { DEFAULT_PLACEHOLDER_EMAIL_DOMAINS } from \"../../services/skill-validator.js\";\nimport { pluginLogger } from \"../../utils/logger.js\";\nimport type { SectionDefinition, SectionTaxonomyOverrides } from \"../skill-sections.js\";\nimport type { PersonaProposalsConfig } from \"../types/agents.js\";\nimport { IDENTITY_FILE_TYPES, type IdentityFileType } from \"../types/agents.js\";\nimport type {\n AliasesConfig,\n AmbientConfig,\n ApiTapConfig,\n ClosedLoopConfig,\n ClustersConfig,\n CostTrackingConfig,\n CrossAgentLearningConfig,\n CrystallizationConfig,\n DashboardConfig,\n DigestAutopilotConfig,\n DigestConfig,\n DigestWeeklyDeliveryConfig,\n DocumentsConfig,\n EntityExtractionConfig,\n FrequencyCaptureConfig,\n FrustrationDetectionConfig,\n FrustrationSignalWeights,\n FutureDateProtectionConfig,\n GapsConfig,\n GraphConfig,\n GraphRetrievalConfig,\n HumanizerConfig,\n ImplicitFeedbackConfig,\n ImplicitSignalType,\n IngestConfig,\n LifecycleAdaptersConfig,\n MemoryTieringConfig,\n ReinforcementConfig,\n SelfExtensionConfig,\n ToolEffectivenessConfig,\n WorkflowTrackingConfig,\n} from \"../types/features.js\";\nimport type { ErrorReportingConfig, MultiAgentConfig } from \"../types/index.js\";\n\nexport function parseEntityExtractionConfig(cfg: Record<string, unknown>): EntityExtractionConfig {\n const raw = cfg.entityExtraction as Record<string, unknown> | undefined;\n const stopWords = Array.isArray(raw?.stopWords)\n ? [\n ...new Set(\n (raw.stopWords as unknown[])\n .filter((v): v is string => typeof v === \"string\")\n .map((v) => v.trim())\n .filter(Boolean),\n ),\n ]\n : [];\n return { stopWords };\n}\n\nexport function parseGraphConfig(cfg: Record<string, unknown>): GraphConfig {\n const graphRaw = cfg.graph as Record<string, unknown> | undefined;\n return {\n enabled: graphRaw?.enabled !== false,\n autoLink: graphRaw?.autoLink === true,\n autoLinkMinScore:\n typeof graphRaw?.autoLinkMinScore === \"number\" && graphRaw.autoLinkMinScore >= 0 && graphRaw.autoLinkMinScore <= 1\n ? graphRaw.autoLinkMinScore\n : 0.7,\n autoLinkLimit:\n typeof graphRaw?.autoLinkLimit === \"number\" && graphRaw.autoLinkLimit > 0\n ? Math.floor(graphRaw.autoLinkLimit)\n : 3,\n maxTraversalDepth:\n typeof graphRaw?.maxTraversalDepth === \"number\" && graphRaw.maxTraversalDepth > 0\n ? Math.floor(graphRaw.maxTraversalDepth)\n : 2,\n useInRecall: graphRaw?.useInRecall !== false,\n coOccurrenceWeight:\n typeof graphRaw?.coOccurrenceWeight === \"number\" &&\n graphRaw.coOccurrenceWeight >= 0 &&\n graphRaw.coOccurrenceWeight <= 1\n ? graphRaw.coOccurrenceWeight\n : 0.3,\n autoSupersede: graphRaw?.autoSupersede !== false,\n strengthenOnRecall: graphRaw?.strengthenOnRecall === true,\n hubDegreeCap:\n graphRaw?.hubDegreeCap === null\n ? null\n : typeof graphRaw?.hubDegreeCap === \"number\" && graphRaw.hubDegreeCap > 0\n ? Math.floor(graphRaw.hubDegreeCap)\n : 500,\n hubScorePenalty:\n typeof graphRaw?.hubScorePenalty === \"number\" && graphRaw.hubScorePenalty > 0 && graphRaw.hubScorePenalty < 1\n ? graphRaw.hubScorePenalty\n : null,\n };\n}\n\nexport function parseGraphRetrievalConfig(cfg: Record<string, unknown>): GraphRetrievalConfig {\n const graphRetrievalRaw = cfg.graphRetrieval as Record<string, unknown> | undefined;\n return {\n enabled: graphRetrievalRaw?.enabled !== false,\n defaultExpand: graphRetrievalRaw?.defaultExpand === true,\n maxExpandDepth:\n typeof graphRetrievalRaw?.maxExpandDepth === \"number\" && graphRetrievalRaw.maxExpandDepth >= 0\n ? Math.min(5, Math.floor(graphRetrievalRaw.maxExpandDepth))\n : 3,\n maxExpandedResults:\n typeof graphRetrievalRaw?.maxExpandedResults === \"number\" && graphRetrievalRaw.maxExpandedResults >= 0\n ? Math.min(50, Math.floor(graphRetrievalRaw.maxExpandedResults))\n : 20,\n };\n}\n\nexport function parseClustersConfig(cfg: Record<string, unknown>): ClustersConfig {\n const clustersRaw = cfg.clusters as Record<string, unknown> | undefined;\n return {\n enabled: clustersRaw?.enabled !== false,\n minClusterSize:\n typeof clustersRaw?.minClusterSize === \"number\" && clustersRaw.minClusterSize >= 1\n ? Math.floor(clustersRaw.minClusterSize)\n : 3,\n refreshIntervalDays:\n typeof clustersRaw?.refreshIntervalDays === \"number\" && clustersRaw.refreshIntervalDays >= 0\n ? Math.floor(clustersRaw.refreshIntervalDays)\n : 7,\n labelModel:\n typeof clustersRaw?.labelModel === \"string\" && clustersRaw.labelModel.trim().length > 0\n ? clustersRaw.labelModel.trim()\n : null,\n };\n}\n\nexport function parseGapsConfig(cfg: Record<string, unknown>): GapsConfig {\n const gapsRaw = cfg.gaps as Record<string, unknown> | undefined;\n return {\n enabled: gapsRaw?.enabled !== false,\n similarityThreshold:\n typeof gapsRaw?.similarityThreshold === \"number\" &&\n gapsRaw.similarityThreshold >= 0 &&\n gapsRaw.similarityThreshold <= 1\n ? gapsRaw.similarityThreshold\n : 0.8,\n };\n}\n\nexport function parseAliasesConfig(cfg: Record<string, unknown>): AliasesConfig {\n const aliasesRaw = cfg.aliases as Record<string, unknown> | undefined;\n return {\n enabled: aliasesRaw?.enabled === true,\n maxAliases:\n typeof aliasesRaw?.maxAliases === \"number\" && aliasesRaw.maxAliases > 0\n ? Math.min(10, Math.floor(aliasesRaw.maxAliases))\n : 5,\n model: typeof aliasesRaw?.model === \"string\" ? aliasesRaw.model : undefined,\n };\n}\n\nexport function parseIngestConfig(cfg: Record<string, unknown>): IngestConfig | undefined {\n const ingestRaw = cfg.ingest as Record<string, unknown> | undefined;\n if (!ingestRaw || !Array.isArray(ingestRaw.paths) || ingestRaw.paths.length === 0) return undefined;\n return {\n paths: (ingestRaw.paths as string[]).filter((p) => typeof p === \"string\" && p.length > 0),\n chunkSize:\n typeof ingestRaw.chunkSize === \"number\" && ingestRaw.chunkSize > 0 ? Math.floor(ingestRaw.chunkSize) : 800,\n overlap: typeof ingestRaw.overlap === \"number\" && ingestRaw.overlap >= 0 ? Math.floor(ingestRaw.overlap) : 100,\n };\n}\n\nexport function parseMemoryTieringConfig(cfg: Record<string, unknown>): MemoryTieringConfig {\n const tierRaw = cfg.memoryTiering as Record<string, unknown> | undefined;\n const hotByRecallRaw = tierRaw?.hotByRecall as Record<string, unknown> | undefined;\n return {\n enabled: tierRaw?.enabled !== false,\n hotMaxTokens:\n typeof tierRaw?.hotMaxTokens === \"number\" && tierRaw.hotMaxTokens > 0 ? Math.floor(tierRaw.hotMaxTokens) : 2000,\n compactionOnSessionEnd: tierRaw?.compactionOnSessionEnd !== false,\n inactivePreferenceDays:\n typeof tierRaw?.inactivePreferenceDays === \"number\" && tierRaw.inactivePreferenceDays >= 0\n ? Math.floor(tierRaw.inactivePreferenceDays)\n : 7,\n hotMaxFacts:\n typeof tierRaw?.hotMaxFacts === \"number\" && tierRaw.hotMaxFacts > 0 ? Math.floor(tierRaw.hotMaxFacts) : 50,\n coldAfterInactivityDays:\n typeof tierRaw?.coldAfterInactivityDays === \"number\" && tierRaw.coldAfterInactivityDays >= 0\n ? Math.floor(tierRaw.coldAfterInactivityDays)\n : 30,\n hotMinAccessCount:\n typeof tierRaw?.hotMinAccessCount === \"number\" && tierRaw.hotMinAccessCount > 0\n ? Math.floor(tierRaw.hotMinAccessCount)\n : 3,\n hotAccessWindowDays:\n typeof tierRaw?.hotAccessWindowDays === \"number\" && tierRaw.hotAccessWindowDays >= 0\n ? Math.floor(tierRaw.hotAccessWindowDays)\n : 7,\n hotPreferenceImportance:\n typeof tierRaw?.hotPreferenceImportance === \"number\" && tierRaw.hotPreferenceImportance >= 0\n ? Math.min(1, tierRaw.hotPreferenceImportance)\n : 0.7,\n hotByRecall: {\n windowDays:\n typeof hotByRecallRaw?.windowDays === \"number\" && hotByRecallRaw.windowDays >= 0\n ? Math.floor(hotByRecallRaw.windowDays)\n : 7,\n topN: typeof hotByRecallRaw?.topN === \"number\" && hotByRecallRaw.topN >= 0 ? Math.floor(hotByRecallRaw.topN) : 20,\n },\n structuralByCategory: tierRaw?.structuralByCategory !== false,\n structuralPermanent: tierRaw?.structuralPermanent === true,\n };\n}\n\nexport function parseAmbientConfig(cfg: Record<string, unknown>): AmbientConfig {\n const ambientRaw = cfg.ambient as Record<string, unknown> | undefined;\n return {\n enabled: ambientRaw?.enabled === true,\n multiQuery: ambientRaw?.multiQuery === true,\n topicShiftThreshold:\n typeof ambientRaw?.topicShiftThreshold === \"number\" &&\n ambientRaw.topicShiftThreshold >= 0 &&\n ambientRaw.topicShiftThreshold <= 2\n ? ambientRaw.topicShiftThreshold\n : 0.4,\n maxQueriesPerTrigger:\n typeof ambientRaw?.maxQueriesPerTrigger === \"number\" && ambientRaw.maxQueriesPerTrigger >= 1\n ? Math.min(4, Math.floor(ambientRaw.maxQueriesPerTrigger))\n : 4,\n budgetTokens:\n typeof ambientRaw?.budgetTokens === \"number\" && ambientRaw.budgetTokens > 0\n ? Math.floor(ambientRaw.budgetTokens)\n : 2000,\n };\n}\n\nexport function parseReinforcementConfig(cfg: Record<string, unknown>): ReinforcementConfig {\n const reinforcementRaw = cfg.reinforcement as Record<string, unknown> | undefined;\n return {\n enabled: reinforcementRaw?.enabled !== false,\n passiveBoost:\n typeof reinforcementRaw?.passiveBoost === \"number\" &&\n reinforcementRaw.passiveBoost >= 0 &&\n reinforcementRaw.passiveBoost <= 1\n ? reinforcementRaw.passiveBoost\n : 0.1,\n activeBoost:\n typeof reinforcementRaw?.activeBoost === \"number\" &&\n reinforcementRaw.activeBoost >= 0 &&\n reinforcementRaw.activeBoost <= 1\n ? reinforcementRaw.activeBoost\n : 0.05,\n maxConfidence:\n typeof reinforcementRaw?.maxConfidence === \"number\" &&\n reinforcementRaw.maxConfidence > 0 &&\n reinforcementRaw.maxConfidence <= 1\n ? reinforcementRaw.maxConfidence\n : 1.0,\n similarityThreshold:\n typeof reinforcementRaw?.similarityThreshold === \"number\" &&\n reinforcementRaw.similarityThreshold > 0 &&\n reinforcementRaw.similarityThreshold <= 1\n ? reinforcementRaw.similarityThreshold\n : 0.85,\n maxEventsPerFact:\n typeof reinforcementRaw?.maxEventsPerFact === \"number\" && reinforcementRaw.maxEventsPerFact > 0\n ? Math.floor(reinforcementRaw.maxEventsPerFact)\n : 50,\n diversityWeight:\n typeof reinforcementRaw?.diversityWeight === \"number\" && reinforcementRaw.diversityWeight >= 0\n ? Math.min(1.0, reinforcementRaw.diversityWeight)\n : 1.0,\n trackContext: reinforcementRaw?.trackContext !== false,\n boostAmount:\n typeof reinforcementRaw?.boostAmount === \"number\" && reinforcementRaw.boostAmount > 0\n ? reinforcementRaw.boostAmount\n : 1.0,\n };\n}\n\nexport function parseFutureDateProtectionConfig(cfg: Record<string, unknown>): FutureDateProtectionConfig {\n const fdpRaw = cfg.futureDateProtection as Record<string, unknown> | undefined;\n return {\n enabled: fdpRaw?.enabled !== false, // default: true\n // Fix #5: 0 means \"no limit\"; only fall back to 365 when value is absent/negative/non-number\n maxFreezeDays:\n typeof fdpRaw?.maxFreezeDays === \"number\" && fdpRaw.maxFreezeDays >= 0 ? Math.floor(fdpRaw.maxFreezeDays) : 365,\n };\n}\n\nexport function parseDocumentsConfig(cfg: Record<string, unknown>): DocumentsConfig {\n const documentsRaw = cfg.documents as Record<string, unknown> | undefined;\n const chunkSize =\n typeof documentsRaw?.chunkSize === \"number\" && documentsRaw.chunkSize >= 100\n ? Math.floor(documentsRaw.chunkSize)\n : 2000;\n const chunkOverlap =\n typeof documentsRaw?.chunkOverlap === \"number\" && documentsRaw.chunkOverlap >= 0\n ? Math.floor(documentsRaw.chunkOverlap)\n : 200;\n return {\n enabled: documentsRaw?.enabled === true,\n pythonPath:\n typeof documentsRaw?.pythonPath === \"string\" && documentsRaw.pythonPath.trim().length > 0\n ? documentsRaw.pythonPath.trim()\n : \"python3\",\n chunkSize,\n chunkOverlap: Math.min(chunkOverlap, Math.max(0, chunkSize - 100)),\n maxDocumentSize:\n typeof documentsRaw?.maxDocumentSize === \"number\" && documentsRaw.maxDocumentSize > 0\n ? Math.floor(documentsRaw.maxDocumentSize)\n : 50 * 1024 * 1024,\n autoTag: documentsRaw?.autoTag !== false,\n visionEnabled: documentsRaw?.visionEnabled === true,\n visionModel:\n typeof documentsRaw?.visionModel === \"string\" && documentsRaw.visionModel.trim().length > 0\n ? documentsRaw.visionModel.trim()\n : undefined,\n allowedPaths: Array.isArray(documentsRaw?.allowedPaths)\n ? (documentsRaw.allowedPaths as string[])\n .filter((p) => typeof p === \"string\" && p.trim().length > 0)\n .map((p) => p.trim())\n : undefined,\n };\n}\n\nexport function parsePersonaProposalsConfig(cfg: Record<string, unknown>): PersonaProposalsConfig {\n const proposalsRaw = cfg.personaProposals as Record<string, unknown> | undefined;\n return {\n enabled: proposalsRaw?.enabled === true,\n autoApply: proposalsRaw?.autoApply === true,\n allowedFiles: (() => {\n if (!Array.isArray(proposalsRaw?.allowedFiles)) {\n return [...IDENTITY_FILE_TYPES];\n }\n const filtered = (proposalsRaw.allowedFiles as string[]).filter((f) =>\n IDENTITY_FILE_TYPES.includes(f as IdentityFileType),\n ) as IdentityFileType[];\n // Fallback to defaults if filter produces empty array\n return filtered.length > 0 ? filtered : [...IDENTITY_FILE_TYPES];\n })(),\n maxProposalsPerWeek:\n typeof proposalsRaw?.maxProposalsPerWeek === \"number\" && proposalsRaw.maxProposalsPerWeek > 0\n ? Math.floor(proposalsRaw.maxProposalsPerWeek)\n : 5,\n minConfidence:\n typeof proposalsRaw?.minConfidence === \"number\" &&\n proposalsRaw.minConfidence >= 0 &&\n proposalsRaw.minConfidence <= 1\n ? proposalsRaw.minConfidence\n : 0.7,\n proposalTTLDays:\n typeof proposalsRaw?.proposalTTLDays === \"number\" && proposalsRaw.proposalTTLDays >= 0\n ? Math.floor(proposalsRaw.proposalTTLDays)\n : 30,\n minSessionEvidence:\n typeof proposalsRaw?.minSessionEvidence === \"number\" && proposalsRaw.minSessionEvidence > 0\n ? Math.floor(proposalsRaw.minSessionEvidence)\n : 10,\n };\n}\n\nexport function parseMultiAgentConfig(cfg: Record<string, unknown>): MultiAgentConfig {\n const multiAgentRaw = cfg.multiAgent as Record<string, unknown> | undefined;\n return {\n orchestratorId:\n typeof multiAgentRaw?.orchestratorId === \"string\" && multiAgentRaw.orchestratorId.trim().length > 0\n ? multiAgentRaw.orchestratorId.trim()\n : \"main\",\n defaultStoreScope: (() => {\n const scope = multiAgentRaw?.defaultStoreScope;\n if (scope === \"agent\" || scope === \"auto\") return scope;\n return \"global\"; // backward compatible default\n })(),\n strictAgentScoping: multiAgentRaw?.strictAgentScoping === true,\n trustToolScopeParams: multiAgentRaw?.trustToolScopeParams === true, // Default: false (secure by default)\n };\n}\n\n/**\n * Parse error reporting config. Error reporting and telemetry default to **opt-out** (enabled = true)\n * during the active development phase of this tool. This is a deliberate product decision:\n *\n * - During early development, crash reports and error telemetry are essential for quickly identifying\n * and fixing issues across diverse user environments.\n * - The community DSN reports to a shared GlitchTip instance operated by the project maintainer.\n * - Users can opt out at any time by setting `errorReporting.enabled: false` or `errorReporting.consent: false`\n * in their config.\n *\n * DESIGN DECISION: Opt-out (not opt-in) is intentional for the development phase.\n * This default SHOULD be revisited and switched to opt-in before a stable/production release.\n * Track this at: https://github.com/markus-lassfolk/openclaw-hybrid-memory/issues/600\n *\n * Do not change this default without an explicit product decision and changelog entry.\n */\nexport function parseErrorReportingConfig(cfg: Record<string, unknown>): ErrorReportingConfig {\n const errorReportingRaw = cfg.errorReporting as Record<string, unknown> | undefined;\n\n // When errorReporting is not specified: opt-out defaults (enabled + consent true, community DSN)\n if (!errorReportingRaw || typeof errorReportingRaw !== \"object\") {\n return {\n enabled: true, // opt-out during dev phase — see JSDoc above\n dsn: DEFAULT_GLITCHTIP_DSN,\n consent: true,\n mode: \"community\",\n sampleRate: 1.0,\n updateNudge: {\n enabled: true,\n intervalHours: 24,\n cacheTtlHours: 24,\n },\n };\n }\n\n // enabled defaults to true — user must explicitly set enabled: false to opt out\n let enabled = errorReportingRaw.enabled !== false; // opt-out: true unless user explicitly disables\n // consent defaults to true — user must explicitly set consent: false to opt out\n const consent = errorReportingRaw.consent !== false;\n const dsnRaw = typeof errorReportingRaw.dsn === \"string\" ? errorReportingRaw.dsn.trim() : \"\";\n const modeRaw = typeof errorReportingRaw.mode === \"string\" ? errorReportingRaw.mode : \"community\";\n const mode: \"community\" | \"self-hosted\" = modeRaw === \"self-hosted\" ? \"self-hosted\" : \"community\";\n\n if (enabled && !consent) {\n pluginLogger.warn(\"memory-hybrid: errorReporting.enabled=true but consent is false; disabling error reporting.\");\n enabled = false;\n }\n\n // Validate DSN when enabled in self-hosted mode\n if (enabled && mode === \"self-hosted\") {\n if (!dsnRaw) {\n throw new Error(\n 'errorReporting mode is \"self-hosted\" but dsn is empty or missing. ' +\n 'Provide a valid DSN or switch to mode: \"community\".',\n );\n }\n // Reject placeholders\n const placeholderPatterns = /<key>|<host>|<project-id>|YOUR_DSN|PLACEHOLDER/i;\n if (placeholderPatterns.test(dsnRaw)) {\n throw new Error(\n \"errorReporting.dsn contains placeholder values. \" +\n 'Replace <key>, <host>, <project-id> with actual values, or use mode: \"community\".',\n );\n }\n }\n\n // Optional botId: UUID format so GlitchTip can group errors by bot\n const botIdRaw = typeof errorReportingRaw.botId === \"string\" ? errorReportingRaw.botId.trim() : \"\";\n const uuidLike = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n const botId = botIdRaw.length > 0 && uuidLike.test(botIdRaw) ? botIdRaw : undefined;\n\n // Optional friendly name for readable GlitchTip reports\n const botNameRaw = typeof errorReportingRaw.botName === \"string\" ? errorReportingRaw.botName.trim() : \"\";\n const botName = botNameRaw.length > 0 ? botNameRaw.slice(0, 64) : undefined;\n\n const updateNudgeRaw =\n errorReportingRaw.updateNudge && typeof errorReportingRaw.updateNudge === \"object\"\n ? (errorReportingRaw.updateNudge as Record<string, unknown>)\n : undefined;\n const updateNudge = {\n enabled: updateNudgeRaw?.enabled !== false,\n intervalHours:\n updateNudgeRaw?.intervalHours === 0\n ? 0\n : typeof updateNudgeRaw?.intervalHours === \"number\" && updateNudgeRaw.intervalHours > 0\n ? Math.min(24 * 30, updateNudgeRaw.intervalHours)\n : 24,\n cacheTtlHours:\n updateNudgeRaw?.cacheTtlHours === 0\n ? 0\n : typeof updateNudgeRaw?.cacheTtlHours === \"number\" && updateNudgeRaw.cacheTtlHours > 0\n ? Math.min(24 * 30, updateNudgeRaw.cacheTtlHours)\n : 24,\n };\n\n // Optional resolvedIssues map for version-aware filtering\n const validVersionPattern = /^\\d+\\.\\d+\\.\\d+/;\n const resolvedIssues =\n errorReportingRaw.resolvedIssues &&\n typeof errorReportingRaw.resolvedIssues === \"object\" &&\n !Array.isArray(errorReportingRaw.resolvedIssues)\n ? Object.fromEntries(\n Object.entries(errorReportingRaw.resolvedIssues).filter((entry): entry is [string, string] => {\n if (typeof entry[1] !== \"string\") return false;\n if (!validVersionPattern.test(entry[1])) {\n pluginLogger.warn(\n `memory-hybrid: errorReporting.resolvedIssues[\"${entry[0]}\"] has invalid version \"${entry[1]}\" — skipped.`,\n );\n return false;\n }\n return true;\n }),\n )\n : undefined;\n\n return {\n enabled,\n consent,\n mode,\n dsn: mode === \"community\" ? dsnRaw || DEFAULT_GLITCHTIP_DSN : dsnRaw || undefined,\n environment: typeof errorReportingRaw.environment === \"string\" ? errorReportingRaw.environment : undefined,\n sampleRate:\n typeof errorReportingRaw.sampleRate === \"number\" &&\n errorReportingRaw.sampleRate >= 0 &&\n errorReportingRaw.sampleRate <= 1\n ? errorReportingRaw.sampleRate\n : 1.0,\n botId,\n botName,\n resolvedIssues,\n updateNudge,\n };\n}\n\nexport function parseWorkflowTrackingConfig(cfg: Record<string, unknown>): WorkflowTrackingConfig {\n const raw = cfg.workflowTracking as Record<string, unknown> | undefined;\n return {\n enabled: raw?.enabled === true,\n maxTracesPerDay:\n typeof raw?.maxTracesPerDay === \"number\" && raw.maxTracesPerDay > 0 ? Math.floor(raw.maxTracesPerDay) : 100,\n retentionDays: typeof raw?.retentionDays === \"number\" && raw.retentionDays > 0 ? Math.floor(raw.retentionDays) : 90,\n goalExtractionModel:\n typeof raw?.goalExtractionModel === \"string\" && raw.goalExtractionModel.trim().length > 0\n ? raw.goalExtractionModel.trim()\n : undefined,\n };\n}\n\nfunction parseSectionTaxonomyOverrides(raw: unknown): SectionTaxonomyOverrides | undefined {\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return undefined;\n const out: SectionTaxonomyOverrides = {};\n for (const [category, value] of Object.entries(raw as Record<string, unknown>)) {\n if (!Array.isArray(value)) continue;\n const sections: SectionDefinition[] = [];\n for (const entry of value) {\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) continue;\n const section = entry as Record<string, unknown>;\n const id = typeof section.id === \"string\" ? section.id.trim() : \"\";\n const label = typeof section.label === \"string\" ? section.label.trim() : \"\";\n const aliases = Array.isArray(section.aliases)\n ? (section.aliases as unknown[])\n .filter((v): v is string => typeof v === \"string\")\n .map((v) => v.trim())\n .filter(Boolean)\n : [];\n if (id.length > 0 && label.length > 0 && aliases.length > 0) {\n sections.push({ id, label, aliases: [...new Set(aliases)] });\n }\n }\n const normalizedCategory = category.trim();\n if (normalizedCategory.length > 0 && sections.length > 0) out[normalizedCategory] = sections;\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nexport function parseCrystallizationConfig(cfg: Record<string, unknown>): CrystallizationConfig {\n const raw = cfg.crystallization as Record<string, unknown> | undefined;\n return {\n enabled: raw?.enabled === true,\n minUsageCount: typeof raw?.minUsageCount === \"number\" && raw.minUsageCount > 0 ? Math.floor(raw.minUsageCount) : 5,\n minSuccessRate:\n typeof raw?.minSuccessRate === \"number\" && raw.minSuccessRate >= 0 && raw.minSuccessRate <= 1\n ? raw.minSuccessRate\n : 0.7,\n autoApprove: raw?.autoApprove === true,\n outputDir:\n typeof raw?.outputDir === \"string\" && raw.outputDir.trim().length > 0\n ? raw.outputDir.trim()\n : \"~/.openclaw/workspace/skills/auto\",\n maxCrystallized:\n typeof raw?.maxCrystallized === \"number\" && raw.maxCrystallized > 0 ? Math.floor(raw.maxCrystallized) : 50,\n pruneUnusedDays:\n typeof raw?.pruneUnusedDays === \"number\" && raw.pruneUnusedDays >= 0 ? Math.floor(raw.pruneUnusedDays) : 30,\n evidenceCountBucketSize:\n typeof raw?.evidenceCountBucketSize === \"number\" && raw.evidenceCountBucketSize >= 1\n ? Math.min(1000, Math.floor(raw.evidenceCountBucketSize))\n : 5,\n sectionTaxonomy: parseSectionTaxonomyOverrides(raw?.sectionTaxonomy),\n placeholderEmailDomains: (() => {\n const raw_domains = raw?.placeholderEmailDomains;\n if (!Array.isArray(raw_domains)) return [...DEFAULT_PLACEHOLDER_EMAIL_DOMAINS];\n const valid = raw_domains\n .filter((d): d is string => typeof d === \"string\" && d.trim().length > 0)\n .map((d) => d.trim());\n return valid.length > 0 ? valid : [...DEFAULT_PLACEHOLDER_EMAIL_DOMAINS];\n })(),\n };\n}\n\nexport function parseSelfExtensionConfig(cfg: Record<string, unknown>): SelfExtensionConfig {\n const raw = cfg.selfExtension as Record<string, unknown> | undefined;\n return {\n enabled: raw?.enabled === true,\n minGapFrequency:\n typeof raw?.minGapFrequency === \"number\" && raw.minGapFrequency > 0 ? Math.floor(raw.minGapFrequency) : 3,\n minToolSavings:\n typeof raw?.minToolSavings === \"number\" && raw.minToolSavings > 0 ? Math.floor(raw.minToolSavings) : 2,\n maxProposals: typeof raw?.maxProposals === \"number\" && raw.maxProposals > 0 ? Math.floor(raw.maxProposals) : 20,\n };\n}\n\nconst ALL_IMPLICIT_SIGNAL_TYPES: ImplicitSignalType[] = [\n \"rephrase\",\n \"immediate_action\",\n \"topic_change\",\n \"grateful_close\",\n \"self_service\",\n \"escalation\",\n \"terse_response\",\n \"extended_engagement\",\n \"copy_paste\",\n \"correction_cascade\",\n \"silence_after_action\",\n];\n\nexport function parseImplicitFeedbackConfig(cfg: Record<string, unknown>): ImplicitFeedbackConfig {\n const raw = cfg.implicitFeedback as Record<string, unknown> | undefined;\n const validTypes = new Set<string>(ALL_IMPLICIT_SIGNAL_TYPES);\n const signalTypes: ImplicitSignalType[] = Array.isArray(raw?.signalTypes)\n ? (raw.signalTypes as unknown[]).filter((t): t is ImplicitSignalType => typeof t === \"string\" && validTypes.has(t))\n : ALL_IMPLICIT_SIGNAL_TYPES;\n\n // Issue #754: top-level aliases take precedence over nested keys\n const topLevelTrajectoryLLMAnalysis =\n typeof cfg.trajectoryLLMAnalysis === \"boolean\" ? cfg.trajectoryLLMAnalysis : undefined;\n const topLevelFeedToSelfCorrection =\n typeof cfg.feedToSelfCorrection === \"boolean\" ? cfg.feedToSelfCorrection : undefined;\n\n // Deprecation warnings for old nested keys when top-level is also set\n if (topLevelTrajectoryLLMAnalysis !== undefined && raw?.trajectoryLLMAnalysis !== undefined) {\n pluginLogger.warn(\n \"memory-hybrid: both `trajectoryLLMAnalysis` (top-level) and `implicitFeedback.trajectoryLLMAnalysis` are set; \" +\n \"using top-level `trajectoryLLMAnalysis`. The nested key is deprecated — move it to the top level.\",\n );\n }\n if (topLevelFeedToSelfCorrection !== undefined && raw?.feedToSelfCorrection !== undefined) {\n pluginLogger.warn(\n \"memory-hybrid: both `feedToSelfCorrection` (top-level) and `implicitFeedback.feedToSelfCorrection` are set; \" +\n \"using top-level `feedToSelfCorrection`. The nested key is deprecated — move it to the top level.\",\n );\n }\n\n return {\n enabled: raw?.enabled !== false,\n minConfidence:\n typeof raw?.minConfidence === \"number\" && raw.minConfidence >= 0 && raw.minConfidence <= 1\n ? raw.minConfidence\n : 0.5,\n signalTypes,\n rephraseThreshold:\n typeof raw?.rephraseThreshold === \"number\" && raw.rephraseThreshold > 0 && raw.rephraseThreshold <= 1\n ? raw.rephraseThreshold\n : 0.8,\n topicChangeThreshold:\n typeof raw?.topicChangeThreshold === \"number\" && raw.topicChangeThreshold >= 0 && raw.topicChangeThreshold <= 1\n ? raw.topicChangeThreshold\n : 0.3,\n terseResponseRatio:\n typeof raw?.terseResponseRatio === \"number\" && raw.terseResponseRatio > 0 && raw.terseResponseRatio <= 1\n ? raw.terseResponseRatio\n : 0.4,\n feedToReinforcement: raw?.feedToReinforcement !== false,\n // Issue #754: top-level takes precedence; fall back to nested with deprecation warning\n feedToSelfCorrection:\n topLevelFeedToSelfCorrection !== undefined ? topLevelFeedToSelfCorrection : raw?.feedToSelfCorrection !== false,\n maxLessonsPerDay:\n typeof raw?.maxLessonsPerDay === \"number\" && raw.maxLessonsPerDay >= 0\n ? Math.min(1000, Math.floor(raw.maxLessonsPerDay))\n : 50,\n lessonDedupeJaccard:\n typeof raw?.lessonDedupeJaccard === \"number\" && raw.lessonDedupeJaccard > 0 && raw.lessonDedupeJaccard <= 1\n ? raw.lessonDedupeJaccard\n : 0.7,\n autoCleanup: raw?.autoCleanup !== false,\n cleanupLimit:\n typeof raw?.cleanupLimit === \"number\" && raw.cleanupLimit >= 0\n ? Math.min(10000, Math.floor(raw.cleanupLimit))\n : 1000,\n maxSessionsPerRun:\n typeof raw?.maxSessionsPerRun === \"number\" && raw.maxSessionsPerRun >= 0\n ? Math.min(10000, Math.floor(raw.maxSessionsPerRun))\n : 50,\n maxSignalsPerRun:\n typeof raw?.maxSignalsPerRun === \"number\" && raw.maxSignalsPerRun >= 0\n ? Math.min(100000, Math.floor(raw.maxSignalsPerRun))\n : 100,\n maxTrajectoriesPerRun:\n typeof raw?.maxTrajectoriesPerRun === \"number\" && raw.maxTrajectoriesPerRun >= 0\n ? Math.min(10000, Math.floor(raw.maxTrajectoriesPerRun))\n : 50,\n maxWallClockSeconds:\n typeof raw?.maxWallClockSeconds === \"number\" && raw.maxWallClockSeconds >= 0\n ? Math.min(86400, Math.floor(raw.maxWallClockSeconds))\n : 300,\n trajectoryLLMAnalysis:\n topLevelTrajectoryLLMAnalysis !== undefined ? topLevelTrajectoryLLMAnalysis : raw?.trajectoryLLMAnalysis === true,\n };\n}\n\nexport function parseClosedLoopConfig(cfg: Record<string, unknown>): ClosedLoopConfig {\n const raw = cfg.closedLoop as Record<string, unknown> | undefined;\n return {\n enabled: raw?.enabled !== false,\n measurementWindowDays:\n typeof raw?.measurementWindowDays === \"number\" && raw.measurementWindowDays > 0\n ? Math.floor(raw.measurementWindowDays)\n : 7,\n minSampleSize: typeof raw?.minSampleSize === \"number\" && raw.minSampleSize > 0 ? Math.floor(raw.minSampleSize) : 5,\n autoDeprecateThreshold:\n typeof raw?.autoDeprecateThreshold === \"number\" ? Math.max(-1, Math.min(0, raw.autoDeprecateThreshold)) : -0.3,\n autoBoostThreshold:\n typeof raw?.autoBoostThreshold === \"number\" ? Math.max(0, Math.min(1, raw.autoBoostThreshold)) : 0.5,\n runInNightlyCycle: raw?.runInNightlyCycle !== false,\n };\n}\n\nexport function parseFrustrationDetectionConfig(cfg: Record<string, unknown>): FrustrationDetectionConfig {\n const raw = cfg.frustrationDetection as Record<string, unknown> | undefined;\n\n // Parse optional signal weights\n const weightsRaw = raw?.signalWeights as Record<string, unknown> | undefined;\n let signalWeights: FrustrationSignalWeights | undefined;\n if (weightsRaw && typeof weightsRaw === \"object\") {\n const validSignals = [\n \"short_reply\",\n \"imperative_tone\",\n \"repeated_instruction\",\n \"caps_or_emphasis\",\n \"explicit_frustration\",\n \"correction_frequency\",\n \"question_to_command\",\n \"reduced_context\",\n \"emoji_shift\",\n ];\n const parsed: FrustrationSignalWeights = {};\n for (const sig of validSignals) {\n if (typeof weightsRaw[sig] === \"number\") {\n (parsed as Record<string, number>)[sig] = Math.max(0, Math.min(1, weightsRaw[sig] as number));\n }\n }\n if (Object.keys(parsed).length > 0) signalWeights = parsed;\n }\n\n const thresholdsRaw = raw?.adaptationThresholds as Record<string, unknown> | undefined;\n\n return {\n enabled: raw?.enabled === true,\n windowSize:\n typeof raw?.windowSize === \"number\" && raw.windowSize >= 2 && raw.windowSize <= 50\n ? Math.floor(raw.windowSize)\n : 8,\n decayRate: typeof raw?.decayRate === \"number\" && raw.decayRate > 0 && raw.decayRate <= 1 ? raw.decayRate : 0.85,\n signalWeights,\n injectionThreshold:\n typeof raw?.injectionThreshold === \"number\" && raw.injectionThreshold >= 0 && raw.injectionThreshold <= 1\n ? raw.injectionThreshold\n : 0.3,\n adaptationThresholds: {\n medium:\n typeof thresholdsRaw?.medium === \"number\" && thresholdsRaw.medium >= 0 && thresholdsRaw.medium <= 1\n ? thresholdsRaw.medium\n : 0.3,\n high:\n typeof thresholdsRaw?.high === \"number\" && thresholdsRaw.high >= 0 && thresholdsRaw.high <= 1\n ? thresholdsRaw.high\n : 0.5,\n critical:\n typeof thresholdsRaw?.critical === \"number\" && thresholdsRaw.critical >= 0 && thresholdsRaw.critical <= 1\n ? thresholdsRaw.critical\n : 0.7,\n },\n feedToImplicitPipeline: raw?.feedToImplicitPipeline !== false,\n };\n}\n\nexport function parseCrossAgentLearningConfig(cfg: Record<string, unknown>): CrossAgentLearningConfig {\n const raw = cfg.crossAgentLearning as Record<string, unknown> | undefined;\n return {\n enabled: raw?.enabled === true,\n windowDays:\n typeof raw?.windowDays === \"number\" && raw.windowDays >= 1 ? Math.min(90, Math.floor(raw.windowDays)) : 14,\n model: typeof raw?.model === \"string\" && raw.model.trim().length > 0 ? raw.model.trim() : undefined,\n fallbackModels: Array.isArray(raw?.fallbackModels)\n ? (raw.fallbackModels as string[]).filter((m) => typeof m === \"string\" && m.trim().length > 0)\n : undefined,\n batchSize: typeof raw?.batchSize === \"number\" && raw.batchSize >= 5 ? Math.min(100, Math.floor(raw.batchSize)) : 20,\n minSourceConfidence:\n typeof raw?.minSourceConfidence === \"number\" && raw.minSourceConfidence >= 0 && raw.minSourceConfidence <= 1\n ? raw.minSourceConfidence\n : 0.4,\n runInNightlyCycle: raw?.runInNightlyCycle !== false,\n };\n}\n\nexport function parseToolEffectivenessConfig(cfg: Record<string, unknown>): ToolEffectivenessConfig {\n const raw = cfg.toolEffectiveness as Record<string, unknown> | undefined;\n return {\n enabled: raw?.enabled !== false,\n minCalls: typeof raw?.minCalls === \"number\" && raw.minCalls >= 1 ? Math.floor(raw.minCalls) : 3,\n topN: typeof raw?.topN === \"number\" && raw.topN >= 1 ? Math.min(50, Math.floor(raw.topN)) : 10,\n lowScoreThreshold:\n typeof raw?.lowScoreThreshold === \"number\" && raw.lowScoreThreshold >= 0 && raw.lowScoreThreshold <= 1\n ? raw.lowScoreThreshold\n : 0.3,\n decayFactor:\n typeof raw?.decayFactor === \"number\" && raw.decayFactor > 0 && raw.decayFactor <= 1 ? raw.decayFactor : 0.95,\n runInNightlyCycle: raw?.runInNightlyCycle !== false,\n injectHints: raw?.injectHints !== false,\n };\n}\n\nexport function parseCostTrackingConfig(cfg: Record<string, unknown>): CostTrackingConfig {\n const raw = cfg.costTracking as Record<string, unknown> | undefined;\n return {\n enabled: raw?.enabled !== false,\n retainDays: typeof raw?.retainDays === \"number\" && raw.retainDays >= 1 ? Math.floor(raw.retainDays) : 90,\n pruneInNightlyCycle: raw?.pruneInNightlyCycle !== false,\n };\n}\n\nexport function parseDashboardConfig(cfg: Record<string, unknown>): DashboardConfig {\n const raw = cfg.dashboard as Record<string, unknown> | undefined;\n return {\n enabled: raw?.enabled !== false,\n port: typeof raw?.port === \"number\" && raw.port >= 1024 && raw.port <= 65535 ? Math.floor(raw.port) : 7700,\n gitRepo: typeof raw?.gitRepo === \"string\" ? raw.gitRepo : undefined,\n };\n}\n\nexport function parseApiTapConfig(cfg: Record<string, unknown>): ApiTapConfig {\n const raw = cfg.apiTap as Record<string, unknown> | undefined;\n return {\n enabled: raw?.enabled === true,\n captureTimeoutSeconds:\n typeof raw?.captureTimeoutSeconds === \"number\" && raw.captureTimeoutSeconds >= 5\n ? Math.min(300, Math.floor(raw.captureTimeoutSeconds))\n : 60,\n endpointTtlDays:\n typeof raw?.endpointTtlDays === \"number\" && raw.endpointTtlDays >= 1\n ? Math.min(365, Math.floor(raw.endpointTtlDays))\n : 30,\n maxEndpointsPerSession:\n typeof raw?.maxEndpointsPerSession === \"number\" && raw.maxEndpointsPerSession >= 1\n ? Math.min(500, Math.floor(raw.maxEndpointsPerSession))\n : 50,\n allowedPatterns: Array.isArray(raw?.allowedPatterns)\n ? (raw.allowedPatterns as unknown[]).filter((p): p is string => typeof p === \"string\" && p.trim().length > 0)\n : [],\n blockedPatterns: Array.isArray(raw?.blockedPatterns)\n ? (raw.blockedPatterns as unknown[]).filter((p): p is string => typeof p === \"string\" && p.trim().length > 0)\n : [\"**/*oauth*/**\", \"**/*auth*/**\", \"**/*login*/**\", \"**/*signin*/**\", \"**/*token*/**\", \"**/*password*/**\"],\n };\n}\n\nexport function parseHumanizerConfig(cfg: Record<string, unknown>): HumanizerConfig {\n const raw = cfg.humanizer as Record<string, unknown> | undefined;\n const maxTextLength =\n typeof raw?.maxTextLength === \"number\" && raw.maxTextLength >= 1\n ? Math.min(20_000, Math.floor(raw.maxTextLength))\n : 4000;\n const minTextLength =\n typeof raw?.minTextLength === \"number\" && raw.minTextLength >= 0\n ? Math.min(maxTextLength, Math.floor(raw.minTextLength))\n : 100;\n return {\n enabled: raw?.enabled === true,\n bin: typeof raw?.bin === \"string\" && raw.bin.trim().length > 0 ? raw.bin.trim() : \"humanizer\",\n minTextLength,\n maxTextLength,\n modelTag: typeof raw?.modelTag === \"string\" && raw.modelTag.trim().length > 0 ? raw.modelTag.trim() : undefined,\n skillTag: typeof raw?.skillTag === \"string\" && raw.skillTag.trim().length > 0 ? raw.skillTag.trim() : undefined,\n };\n}\n\nexport function parseFrequencyCaptureConfig(cfg: Record<string, unknown>): FrequencyCaptureConfig {\n const raw = cfg.frequencyCapture as Record<string, unknown> | undefined;\n return {\n enabled: raw?.enabled === true,\n mentionThreshold:\n typeof raw?.mentionThreshold === \"number\" && raw.mentionThreshold >= 1 ? Math.floor(raw.mentionThreshold) : 3,\n lookbackSessions:\n typeof raw?.lookbackSessions === \"number\" && raw.lookbackSessions >= 1 ? Math.floor(raw.lookbackSessions) : 5,\n defaultImportance:\n typeof raw?.defaultImportance === \"number\" && raw.defaultImportance >= 0 && raw.defaultImportance <= 1\n ? raw.defaultImportance\n : 0.6,\n captureCredentials: raw?.captureCredentials !== false,\n ttlDays: typeof raw?.ttlDays === \"number\" && raw.ttlDays >= 1 ? Math.floor(raw.ttlDays) : 30,\n };\n}\n\n/** Safe parse for cron install paths that do not run the full hybrid config validator. */\nexport function parseDigestWeeklyDeliveryOnly(cfg: Record<string, unknown>): DigestWeeklyDeliveryConfig {\n const digest = cfg.digest as Record<string, unknown> | undefined;\n const weekly = digest?.weekly as Record<string, unknown> | undefined;\n const delivery = weekly?.delivery as Record<string, unknown> | undefined;\n const modeRaw = delivery?.mode;\n const valid = [\"telegram\", \"system\", \"none\"] as const;\n let mode: (typeof valid)[number] = \"system\";\n if (typeof modeRaw === \"string\" && (valid as readonly string[]).includes(modeRaw)) {\n mode = modeRaw as (typeof valid)[number];\n } else if (modeRaw !== undefined) {\n pluginLogger.warn(\n `memory-hybrid: invalid digest.weekly.delivery.mode \"${modeRaw}\"; expected telegram|system|none. Using \"system\".`,\n );\n }\n const chatId =\n typeof delivery?.chatId === \"string\" && delivery.chatId.trim().length > 0 ? delivery.chatId.trim() : undefined;\n if (mode === \"telegram\" && !chatId) {\n pluginLogger.warn(\n `memory-hybrid: digest.weekly.delivery.mode is \"telegram\" but chatId is missing; using \"system\".`,\n );\n return { mode: \"system\" };\n }\n return { mode, ...(chatId ? { chatId } : {}) };\n}\n\nexport function parseDigestConfig(cfg: Record<string, unknown>): DigestConfig {\n return {\n weekly: { delivery: parseDigestWeeklyDeliveryOnly(cfg) },\n autopilot: parseDigestAutopilotConfig(cfg),\n };\n}\n\nconst DIGEST_AUTOPILOT_PERSONA_POLICIES = [\"disabled\", \"report-only\", \"cautious\", \"apply-safe\"] as const;\nconst DIGEST_AUTOPILOT_PROCEDURE_POLICIES = [\"disabled\", \"report-only\", \"dry-run-skills\", \"auto-safe\"] as const;\nconst DIGEST_AUTOPILOT_VERIFIED_POLICIES = [\"disabled\", \"report-only\", \"classify\", \"apply-obvious\"] as const;\nconst DIGEST_AUTOPILOT_READ_ONLY_POLICIES = [\"disabled\", \"report-only\", \"classify\"] as const;\n\nfunction parseAutopilotPolicy<T extends readonly string[]>(\n value: unknown,\n allowed: T,\n fallback: T[number],\n field: string,\n): T[number] {\n if (typeof value === \"string\" && (allowed as readonly string[]).includes(value)) return value as T[number];\n if (value === undefined) return fallback;\n throw new Error(`Invalid digest.autopilot.${field}: ${String(value)}`);\n}\n\nfunction parseAutopilotPositiveInt(value: unknown, fallback: number, field: string, min = 1, max = 100_000): number {\n if (value === undefined) return fallback;\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new Error(`Invalid digest.autopilot.${field}: ${String(value)}`);\n }\n const normalized = Math.floor(value);\n if (normalized < min || normalized > max) {\n throw new Error(`Invalid digest.autopilot.${field}: ${String(value)}`);\n }\n return normalized;\n}\n\nfunction parseAutopilotStrictBoolean(value: unknown, field: string, defaultValue: boolean): boolean {\n if (value === undefined) return defaultValue;\n if (value === true) return true;\n if (value === false) return false;\n throw new Error(`Invalid digest.autopilot.${field}: expected boolean, received ${typeof value} (${String(value)})`);\n}\n\nexport function parseDigestAutopilotConfig(cfg: Record<string, unknown>): DigestAutopilotConfig {\n const digest = cfg.digest as Record<string, unknown> | undefined;\n const autopilot = digest?.autopilot as Record<string, unknown> | undefined;\n const modeRaw = autopilot?.mode;\n const mode = modeRaw === \"apply\" ? \"apply\" : \"dry-run\";\n if (modeRaw !== undefined && modeRaw !== \"apply\" && modeRaw !== \"dry-run\") {\n throw new Error(`Invalid digest.autopilot.mode: ${String(modeRaw)}`);\n }\n const scheduleRaw = autopilot?.schedule;\n const schedule = \"after-weekly-pending-digest\" as const;\n if (scheduleRaw !== undefined && scheduleRaw !== schedule) {\n throw new Error(`Invalid digest.autopilot.schedule: ${String(scheduleRaw)}`);\n }\n\n return {\n enabled: parseAutopilotStrictBoolean(autopilot?.enabled, \"enabled\", false),\n mode,\n schedule,\n maxPersona: parseAutopilotPositiveInt(autopilot?.maxPersona, 20, \"maxPersona\", 0),\n maxProcedures: parseAutopilotPositiveInt(autopilot?.maxProcedures, 50, \"maxProcedures\", 0),\n maxVerified: parseAutopilotPositiveInt(autopilot?.maxVerified, 100, \"maxVerified\", 0),\n maxTools: parseAutopilotPositiveInt(autopilot?.maxTools, 50, \"maxTools\", 0),\n maxCrystallization: parseAutopilotPositiveInt(autopilot?.maxCrystallization, 50, \"maxCrystallization\", 0),\n personaPolicy: parseAutopilotPolicy(\n autopilot?.personaPolicy,\n DIGEST_AUTOPILOT_PERSONA_POLICIES,\n \"cautious\",\n \"personaPolicy\",\n ),\n procedurePolicy: parseAutopilotPolicy(\n autopilot?.procedurePolicy,\n DIGEST_AUTOPILOT_PROCEDURE_POLICIES,\n \"auto-safe\",\n \"procedurePolicy\",\n ),\n verifiedPolicy: parseAutopilotPolicy(\n autopilot?.verifiedPolicy,\n DIGEST_AUTOPILOT_VERIFIED_POLICIES,\n \"classify\",\n \"verifiedPolicy\",\n ),\n toolPolicy: parseAutopilotPolicy(\n autopilot?.toolPolicy,\n DIGEST_AUTOPILOT_READ_ONLY_POLICIES,\n \"classify\",\n \"toolPolicy\",\n ),\n crystallizationPolicy: parseAutopilotPolicy(\n autopilot?.crystallizationPolicy,\n DIGEST_AUTOPILOT_READ_ONLY_POLICIES,\n \"classify\",\n \"crystallizationPolicy\",\n ),\n notifyOnNoop: parseAutopilotStrictBoolean(autopilot?.notifyOnNoop, \"notifyOnNoop\", false),\n notifyOnDryRunActions: parseAutopilotStrictBoolean(\n autopilot?.notifyOnDryRunActions,\n \"notifyOnDryRunActions\",\n false,\n ),\n notifyOnApplyActions: parseAutopilotStrictBoolean(autopilot?.notifyOnApplyActions, \"notifyOnApplyActions\", true),\n notifyOnHumanReviewRequired: parseAutopilotStrictBoolean(\n autopilot?.notifyOnHumanReviewRequired,\n \"notifyOnHumanReviewRequired\",\n true,\n ),\n notifyOnFailure: parseAutopilotStrictBoolean(autopilot?.notifyOnFailure, \"notifyOnFailure\", true),\n guardWindowHours: parseAutopilotPositiveInt(autopilot?.guardWindowHours, 120, \"guardWindowHours\"),\n lockTtlMinutes: parseAutopilotPositiveInt(autopilot?.lockTtlMinutes, 120, \"lockTtlMinutes\"),\n };\n}\n\nexport function parseLifecycleConfig(cfg: Record<string, unknown>): LifecycleAdaptersConfig {\n const raw = cfg.lifecycle as Record<string, unknown> | undefined;\n const adapters = raw?.adapters as Record<string, unknown> | undefined;\n const github = adapters?.github as Record<string, unknown> | undefined;\n const validAction = (value: unknown): \"expire-now\" | \"expire-soon\" | \"keep-stable\" | undefined =>\n value === \"expire-now\" || value === \"expire-soon\" || value === \"keep-stable\" ? value : undefined;\n const repos = Array.isArray(github?.repos)\n ? (github?.repos as unknown[])\n .filter((r): r is string => typeof r === \"string\" && r.trim().length > 0)\n .map((r) => r.trim())\n : undefined;\n return {\n adapters: {\n github: {\n enabled: github?.enabled === true,\n repo: typeof github?.repo === \"string\" && github.repo.trim().length > 0 ? github.repo.trim() : undefined,\n repos: repos && repos.length > 0 ? repos : undefined,\n tokenRef:\n typeof github?.tokenRef === \"string\" && github.tokenRef.trim().length > 0\n ? github.tokenRef.trim()\n : undefined,\n onMerged: validAction(github?.onMerged),\n onClosed: validAction(github?.onClosed),\n onOpen: validAction(github?.onOpen),\n },\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"features.js","names":[],"sources":["../../../config/parsers/features.ts"],"sourcesContent":["import { DEFAULT_GLITCHTIP_DSN } from \"../../services/error-reporter.js\";\nimport { DEFAULT_PLACEHOLDER_EMAIL_DOMAINS } from \"../../services/skill-validator.js\";\nimport { pluginLogger } from \"../../utils/logger.js\";\nimport type { SectionDefinition, SectionTaxonomyOverrides } from \"../skill-sections.js\";\nimport type { PersonaProposalsConfig } from \"../types/agents.js\";\nimport { IDENTITY_FILE_TYPES, type IdentityFileType } from \"../types/agents.js\";\nimport type {\n AliasesConfig,\n AmbientConfig,\n ApiTapConfig,\n ClosedLoopConfig,\n ClustersConfig,\n CostTrackingConfig,\n CrossAgentLearningConfig,\n CrystallizationConfig,\n DashboardConfig,\n DigestAutopilotConfig,\n DigestConfig,\n DigestWeeklyDeliveryConfig,\n DocumentsConfig,\n EntityExtractionConfig,\n FrequencyCaptureConfig,\n FrustrationDetectionConfig,\n FrustrationSignalWeights,\n FutureDateProtectionConfig,\n GapsConfig,\n GraphConfig,\n GraphRetrievalConfig,\n HumanizerConfig,\n ImplicitFeedbackConfig,\n ImplicitSignalType,\n IngestConfig,\n LifecycleAdaptersConfig,\n MemoryTieringConfig,\n ReinforcementConfig,\n SelfExtensionConfig,\n ToolEffectivenessConfig,\n WorkflowTrackingConfig,\n} from \"../types/features.js\";\nimport type { ErrorReportingConfig, MultiAgentConfig } from \"../types/index.js\";\n\nexport function parseEntityExtractionConfig(cfg: Record<string, unknown>): EntityExtractionConfig {\n const raw = cfg.entityExtraction as Record<string, unknown> | undefined;\n const stopWords = Array.isArray(raw?.stopWords)\n ? [\n ...new Set(\n (raw.stopWords as unknown[])\n .filter((v): v is string => typeof v === \"string\")\n .map((v) => v.trim())\n .filter(Boolean),\n ),\n ]\n : [];\n return { stopWords };\n}\n\nexport function parseGraphConfig(cfg: Record<string, unknown>): GraphConfig {\n const graphRaw = cfg.graph as Record<string, unknown> | undefined;\n return {\n enabled: graphRaw?.enabled !== false,\n autoLink: graphRaw?.autoLink === true,\n autoLinkMinScore:\n typeof graphRaw?.autoLinkMinScore === \"number\" && graphRaw.autoLinkMinScore >= 0 && graphRaw.autoLinkMinScore <= 1\n ? graphRaw.autoLinkMinScore\n : 0.7,\n autoLinkLimit:\n typeof graphRaw?.autoLinkLimit === \"number\" && graphRaw.autoLinkLimit > 0\n ? Math.floor(graphRaw.autoLinkLimit)\n : 3,\n maxTraversalDepth:\n typeof graphRaw?.maxTraversalDepth === \"number\" && graphRaw.maxTraversalDepth > 0\n ? Math.floor(graphRaw.maxTraversalDepth)\n : 2,\n useInRecall: graphRaw?.useInRecall !== false,\n coOccurrenceWeight:\n typeof graphRaw?.coOccurrenceWeight === \"number\" &&\n graphRaw.coOccurrenceWeight >= 0 &&\n graphRaw.coOccurrenceWeight <= 1\n ? graphRaw.coOccurrenceWeight\n : 0.3,\n autoSupersede: graphRaw?.autoSupersede !== false,\n strengthenOnRecall: graphRaw?.strengthenOnRecall === true,\n hubDegreeCap:\n graphRaw?.hubDegreeCap === null\n ? null\n : typeof graphRaw?.hubDegreeCap === \"number\" && graphRaw.hubDegreeCap > 0\n ? Math.floor(graphRaw.hubDegreeCap)\n : 500,\n hubScorePenalty:\n typeof graphRaw?.hubScorePenalty === \"number\" && graphRaw.hubScorePenalty > 0 && graphRaw.hubScorePenalty < 1\n ? graphRaw.hubScorePenalty\n : null,\n };\n}\n\nexport function parseGraphRetrievalConfig(cfg: Record<string, unknown>): GraphRetrievalConfig {\n const graphRetrievalRaw = cfg.graphRetrieval as Record<string, unknown> | undefined;\n return {\n enabled: graphRetrievalRaw?.enabled !== false,\n defaultExpand: graphRetrievalRaw?.defaultExpand === true,\n maxExpandDepth:\n typeof graphRetrievalRaw?.maxExpandDepth === \"number\" && graphRetrievalRaw.maxExpandDepth >= 0\n ? Math.min(5, Math.floor(graphRetrievalRaw.maxExpandDepth))\n : 3,\n maxExpandedResults:\n typeof graphRetrievalRaw?.maxExpandedResults === \"number\" && graphRetrievalRaw.maxExpandedResults >= 0\n ? Math.min(50, Math.floor(graphRetrievalRaw.maxExpandedResults))\n : 20,\n };\n}\n\nexport function parseClustersConfig(cfg: Record<string, unknown>): ClustersConfig {\n const clustersRaw = cfg.clusters as Record<string, unknown> | undefined;\n return {\n enabled: clustersRaw?.enabled !== false,\n minClusterSize:\n typeof clustersRaw?.minClusterSize === \"number\" && clustersRaw.minClusterSize >= 1\n ? Math.floor(clustersRaw.minClusterSize)\n : 3,\n refreshIntervalDays:\n typeof clustersRaw?.refreshIntervalDays === \"number\" && clustersRaw.refreshIntervalDays >= 0\n ? Math.floor(clustersRaw.refreshIntervalDays)\n : 7,\n labelModel:\n typeof clustersRaw?.labelModel === \"string\" && clustersRaw.labelModel.trim().length > 0\n ? clustersRaw.labelModel.trim()\n : null,\n };\n}\n\nexport function parseGapsConfig(cfg: Record<string, unknown>): GapsConfig {\n const gapsRaw = cfg.gaps as Record<string, unknown> | undefined;\n return {\n enabled: gapsRaw?.enabled !== false,\n similarityThreshold:\n typeof gapsRaw?.similarityThreshold === \"number\" &&\n gapsRaw.similarityThreshold >= 0 &&\n gapsRaw.similarityThreshold <= 1\n ? gapsRaw.similarityThreshold\n : 0.8,\n };\n}\n\nexport function parseAliasesConfig(cfg: Record<string, unknown>): AliasesConfig {\n const aliasesRaw = cfg.aliases as Record<string, unknown> | undefined;\n return {\n enabled: aliasesRaw?.enabled === true,\n maxAliases:\n typeof aliasesRaw?.maxAliases === \"number\" && aliasesRaw.maxAliases > 0\n ? Math.min(10, Math.floor(aliasesRaw.maxAliases))\n : 5,\n model: typeof aliasesRaw?.model === \"string\" ? aliasesRaw.model : undefined,\n };\n}\n\nexport function parseIngestConfig(cfg: Record<string, unknown>): IngestConfig | undefined {\n const ingestRaw = cfg.ingest as Record<string, unknown> | undefined;\n if (!ingestRaw || !Array.isArray(ingestRaw.paths) || ingestRaw.paths.length === 0) return undefined;\n return {\n paths: (ingestRaw.paths as string[]).filter((p) => typeof p === \"string\" && p.length > 0),\n chunkSize:\n typeof ingestRaw.chunkSize === \"number\" && ingestRaw.chunkSize > 0 ? Math.floor(ingestRaw.chunkSize) : 800,\n overlap: typeof ingestRaw.overlap === \"number\" && ingestRaw.overlap >= 0 ? Math.floor(ingestRaw.overlap) : 100,\n };\n}\n\nexport function parseMemoryTieringConfig(cfg: Record<string, unknown>): MemoryTieringConfig {\n const tierRaw = cfg.memoryTiering as Record<string, unknown> | undefined;\n const hotByRecallRaw = tierRaw?.hotByRecall as Record<string, unknown> | undefined;\n return {\n enabled: tierRaw?.enabled !== false,\n hotMaxTokens:\n typeof tierRaw?.hotMaxTokens === \"number\" && tierRaw.hotMaxTokens > 0 ? Math.floor(tierRaw.hotMaxTokens) : 2000,\n compactionOnSessionEnd: tierRaw?.compactionOnSessionEnd !== false,\n inactivePreferenceDays:\n typeof tierRaw?.inactivePreferenceDays === \"number\" && tierRaw.inactivePreferenceDays >= 0\n ? Math.floor(tierRaw.inactivePreferenceDays)\n : 7,\n hotMaxFacts:\n typeof tierRaw?.hotMaxFacts === \"number\" && tierRaw.hotMaxFacts > 0 ? Math.floor(tierRaw.hotMaxFacts) : 50,\n coldAfterInactivityDays:\n typeof tierRaw?.coldAfterInactivityDays === \"number\" && tierRaw.coldAfterInactivityDays >= 0\n ? Math.floor(tierRaw.coldAfterInactivityDays)\n : 30,\n hotMinAccessCount:\n typeof tierRaw?.hotMinAccessCount === \"number\" && tierRaw.hotMinAccessCount > 0\n ? Math.floor(tierRaw.hotMinAccessCount)\n : 3,\n hotAccessWindowDays:\n typeof tierRaw?.hotAccessWindowDays === \"number\" && tierRaw.hotAccessWindowDays >= 0\n ? Math.floor(tierRaw.hotAccessWindowDays)\n : 7,\n hotPreferenceImportance:\n typeof tierRaw?.hotPreferenceImportance === \"number\" && tierRaw.hotPreferenceImportance >= 0\n ? Math.min(1, tierRaw.hotPreferenceImportance)\n : 0.7,\n hotByRecall: {\n windowDays:\n typeof hotByRecallRaw?.windowDays === \"number\" && hotByRecallRaw.windowDays >= 0\n ? Math.floor(hotByRecallRaw.windowDays)\n : 7,\n topN: typeof hotByRecallRaw?.topN === \"number\" && hotByRecallRaw.topN >= 0 ? Math.floor(hotByRecallRaw.topN) : 20,\n },\n structuralByCategory: tierRaw?.structuralByCategory !== false,\n structuralPermanent: tierRaw?.structuralPermanent === true,\n };\n}\n\nexport function parseAmbientConfig(cfg: Record<string, unknown>): AmbientConfig {\n const ambientRaw = cfg.ambient as Record<string, unknown> | undefined;\n return {\n enabled: ambientRaw?.enabled === true,\n multiQuery: ambientRaw?.multiQuery === true,\n topicShiftThreshold:\n typeof ambientRaw?.topicShiftThreshold === \"number\" &&\n ambientRaw.topicShiftThreshold >= 0 &&\n ambientRaw.topicShiftThreshold <= 2\n ? ambientRaw.topicShiftThreshold\n : 0.4,\n maxQueriesPerTrigger:\n typeof ambientRaw?.maxQueriesPerTrigger === \"number\" && ambientRaw.maxQueriesPerTrigger >= 1\n ? Math.min(4, Math.floor(ambientRaw.maxQueriesPerTrigger))\n : 4,\n budgetTokens:\n typeof ambientRaw?.budgetTokens === \"number\" && ambientRaw.budgetTokens > 0\n ? Math.floor(ambientRaw.budgetTokens)\n : 2000,\n };\n}\n\nexport function parseReinforcementConfig(cfg: Record<string, unknown>): ReinforcementConfig {\n const reinforcementRaw = cfg.reinforcement as Record<string, unknown> | undefined;\n return {\n enabled: reinforcementRaw?.enabled !== false,\n passiveBoost:\n typeof reinforcementRaw?.passiveBoost === \"number\" &&\n reinforcementRaw.passiveBoost >= 0 &&\n reinforcementRaw.passiveBoost <= 1\n ? reinforcementRaw.passiveBoost\n : 0.1,\n activeBoost:\n typeof reinforcementRaw?.activeBoost === \"number\" &&\n reinforcementRaw.activeBoost >= 0 &&\n reinforcementRaw.activeBoost <= 1\n ? reinforcementRaw.activeBoost\n : 0.05,\n maxConfidence:\n typeof reinforcementRaw?.maxConfidence === \"number\" &&\n reinforcementRaw.maxConfidence > 0 &&\n reinforcementRaw.maxConfidence <= 1\n ? reinforcementRaw.maxConfidence\n : 1.0,\n similarityThreshold:\n typeof reinforcementRaw?.similarityThreshold === \"number\" &&\n reinforcementRaw.similarityThreshold > 0 &&\n reinforcementRaw.similarityThreshold <= 1\n ? reinforcementRaw.similarityThreshold\n : 0.85,\n maxEventsPerFact:\n typeof reinforcementRaw?.maxEventsPerFact === \"number\" && reinforcementRaw.maxEventsPerFact > 0\n ? Math.floor(reinforcementRaw.maxEventsPerFact)\n : 50,\n diversityWeight:\n typeof reinforcementRaw?.diversityWeight === \"number\" && reinforcementRaw.diversityWeight >= 0\n ? Math.min(1.0, reinforcementRaw.diversityWeight)\n : 1.0,\n trackContext: reinforcementRaw?.trackContext !== false,\n boostAmount:\n typeof reinforcementRaw?.boostAmount === \"number\" && reinforcementRaw.boostAmount > 0\n ? reinforcementRaw.boostAmount\n : 1.0,\n };\n}\n\nexport function parseFutureDateProtectionConfig(cfg: Record<string, unknown>): FutureDateProtectionConfig {\n const fdpRaw = cfg.futureDateProtection as Record<string, unknown> | undefined;\n return {\n enabled: fdpRaw?.enabled !== false, // default: true\n // Fix #5: 0 means \"no limit\"; only fall back to 365 when value is absent/negative/non-number\n maxFreezeDays:\n typeof fdpRaw?.maxFreezeDays === \"number\" && fdpRaw.maxFreezeDays >= 0 ? Math.floor(fdpRaw.maxFreezeDays) : 365,\n };\n}\n\nexport function parseDocumentsConfig(cfg: Record<string, unknown>): DocumentsConfig {\n const documentsRaw = cfg.documents as Record<string, unknown> | undefined;\n const chunkSize =\n typeof documentsRaw?.chunkSize === \"number\" && documentsRaw.chunkSize >= 100\n ? Math.floor(documentsRaw.chunkSize)\n : 2000;\n const chunkOverlap =\n typeof documentsRaw?.chunkOverlap === \"number\" && documentsRaw.chunkOverlap >= 0\n ? Math.floor(documentsRaw.chunkOverlap)\n : 200;\n return {\n enabled: documentsRaw?.enabled === true,\n pythonPath:\n typeof documentsRaw?.pythonPath === \"string\" && documentsRaw.pythonPath.trim().length > 0\n ? documentsRaw.pythonPath.trim()\n : \"python3\",\n chunkSize,\n chunkOverlap: Math.min(chunkOverlap, Math.max(0, chunkSize - 100)),\n maxDocumentSize:\n typeof documentsRaw?.maxDocumentSize === \"number\" && documentsRaw.maxDocumentSize > 0\n ? Math.floor(documentsRaw.maxDocumentSize)\n : 50 * 1024 * 1024,\n autoTag: documentsRaw?.autoTag !== false,\n visionEnabled: documentsRaw?.visionEnabled === true,\n visionModel:\n typeof documentsRaw?.visionModel === \"string\" && documentsRaw.visionModel.trim().length > 0\n ? documentsRaw.visionModel.trim()\n : undefined,\n allowedPaths: Array.isArray(documentsRaw?.allowedPaths)\n ? (documentsRaw.allowedPaths as string[])\n .filter((p) => typeof p === \"string\" && p.trim().length > 0)\n .map((p) => p.trim())\n : undefined,\n };\n}\n\nexport function parsePersonaProposalsConfig(cfg: Record<string, unknown>): PersonaProposalsConfig {\n const proposalsRaw = cfg.personaProposals as Record<string, unknown> | undefined;\n return {\n enabled: proposalsRaw?.enabled === true,\n autoApply: proposalsRaw?.autoApply === true,\n allowedFiles: (() => {\n if (!Array.isArray(proposalsRaw?.allowedFiles)) {\n return [...IDENTITY_FILE_TYPES];\n }\n const filtered = (proposalsRaw.allowedFiles as string[]).filter((f) =>\n IDENTITY_FILE_TYPES.includes(f as IdentityFileType),\n ) as IdentityFileType[];\n // Fallback to defaults if filter produces empty array\n return filtered.length > 0 ? filtered : [...IDENTITY_FILE_TYPES];\n })(),\n maxProposalsPerWeek:\n typeof proposalsRaw?.maxProposalsPerWeek === \"number\" && proposalsRaw.maxProposalsPerWeek > 0\n ? Math.floor(proposalsRaw.maxProposalsPerWeek)\n : 5,\n minConfidence:\n typeof proposalsRaw?.minConfidence === \"number\" &&\n proposalsRaw.minConfidence >= 0 &&\n proposalsRaw.minConfidence <= 1\n ? proposalsRaw.minConfidence\n : 0.7,\n proposalTTLDays:\n typeof proposalsRaw?.proposalTTLDays === \"number\" && proposalsRaw.proposalTTLDays >= 0\n ? Math.floor(proposalsRaw.proposalTTLDays)\n : 30,\n minSessionEvidence:\n typeof proposalsRaw?.minSessionEvidence === \"number\" && proposalsRaw.minSessionEvidence > 0\n ? Math.floor(proposalsRaw.minSessionEvidence)\n : 10,\n };\n}\n\nexport function parseMultiAgentConfig(cfg: Record<string, unknown>): MultiAgentConfig {\n const multiAgentRaw = cfg.multiAgent as Record<string, unknown> | undefined;\n return {\n orchestratorId:\n typeof multiAgentRaw?.orchestratorId === \"string\" && multiAgentRaw.orchestratorId.trim().length > 0\n ? multiAgentRaw.orchestratorId.trim()\n : \"main\",\n defaultStoreScope: (() => {\n const scope = multiAgentRaw?.defaultStoreScope;\n if (scope === \"agent\" || scope === \"auto\") return scope;\n return \"global\"; // backward compatible default\n })(),\n strictAgentScoping: multiAgentRaw?.strictAgentScoping === true,\n trustToolScopeParams: multiAgentRaw?.trustToolScopeParams === true, // Default: false (secure by default)\n };\n}\n\n/**\n * Parse error reporting config. Error reporting and telemetry default to **opt-out** (enabled = true)\n * during the active development phase of this tool. This is a deliberate product decision:\n *\n * - During early development, crash reports and error telemetry are essential for quickly identifying\n * and fixing issues across diverse user environments.\n * - The community DSN reports to a shared GlitchTip instance operated by the project maintainer.\n * - Users can opt out at any time by setting `errorReporting.enabled: false` or `errorReporting.consent: false`\n * in their config.\n *\n * DESIGN DECISION: Opt-out (not opt-in) is intentional for the development phase.\n * This default SHOULD be revisited and switched to opt-in before a stable/production release.\n * Track this at: https://github.com/markus-lassfolk/openclaw-hybrid-memory/issues/600\n *\n * Do not change this default without an explicit product decision and changelog entry.\n */\nexport function parseErrorReportingConfig(cfg: Record<string, unknown>): ErrorReportingConfig {\n const errorReportingRaw = cfg.errorReporting as Record<string, unknown> | undefined;\n\n // When errorReporting is not specified: opt-out defaults (enabled + consent true, community DSN)\n if (!errorReportingRaw || typeof errorReportingRaw !== \"object\") {\n return {\n enabled: true, // opt-out during dev phase — see JSDoc above\n dsn: DEFAULT_GLITCHTIP_DSN,\n consent: true,\n mode: \"community\",\n sampleRate: 1.0,\n updateNudge: {\n enabled: true,\n intervalHours: 24,\n cacheTtlHours: 24,\n },\n };\n }\n\n // enabled defaults to true — user must explicitly set enabled: false to opt out\n let enabled = errorReportingRaw.enabled !== false; // opt-out: true unless user explicitly disables\n // consent defaults to true — user must explicitly set consent: false to opt out\n const consent = errorReportingRaw.consent !== false;\n const dsnRaw = typeof errorReportingRaw.dsn === \"string\" ? errorReportingRaw.dsn.trim() : \"\";\n const modeRaw = typeof errorReportingRaw.mode === \"string\" ? errorReportingRaw.mode : \"community\";\n const mode: \"community\" | \"self-hosted\" = modeRaw === \"self-hosted\" ? \"self-hosted\" : \"community\";\n\n if (enabled && !consent) {\n pluginLogger.warn(\"memory-hybrid: errorReporting.enabled=true but consent is false; disabling error reporting.\");\n enabled = false;\n }\n\n // Validate DSN when enabled in self-hosted mode\n if (enabled && mode === \"self-hosted\") {\n if (!dsnRaw) {\n throw new Error(\n 'errorReporting mode is \"self-hosted\" but dsn is empty or missing. ' +\n 'Provide a valid DSN or switch to mode: \"community\".',\n );\n }\n // Reject placeholders\n const placeholderPatterns = /<key>|<host>|<project-id>|YOUR_DSN|PLACEHOLDER/i;\n if (placeholderPatterns.test(dsnRaw)) {\n throw new Error(\n \"errorReporting.dsn contains placeholder values. \" +\n 'Replace <key>, <host>, <project-id> with actual values, or use mode: \"community\".',\n );\n }\n }\n\n // Optional botId: UUID format so GlitchTip can group errors by bot\n const botIdRaw = typeof errorReportingRaw.botId === \"string\" ? errorReportingRaw.botId.trim() : \"\";\n const uuidLike = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n const botId = botIdRaw.length > 0 && uuidLike.test(botIdRaw) ? botIdRaw : undefined;\n\n // Optional friendly name for readable GlitchTip reports\n const botNameRaw = typeof errorReportingRaw.botName === \"string\" ? errorReportingRaw.botName.trim() : \"\";\n const botName = botNameRaw.length > 0 ? botNameRaw.slice(0, 64) : undefined;\n\n const updateNudgeRaw =\n errorReportingRaw.updateNudge && typeof errorReportingRaw.updateNudge === \"object\"\n ? (errorReportingRaw.updateNudge as Record<string, unknown>)\n : undefined;\n const updateNudge = {\n enabled: updateNudgeRaw?.enabled !== false,\n intervalHours:\n updateNudgeRaw?.intervalHours === 0\n ? 0\n : typeof updateNudgeRaw?.intervalHours === \"number\" && updateNudgeRaw.intervalHours > 0\n ? Math.min(24 * 30, updateNudgeRaw.intervalHours)\n : 24,\n cacheTtlHours:\n updateNudgeRaw?.cacheTtlHours === 0\n ? 0\n : typeof updateNudgeRaw?.cacheTtlHours === \"number\" && updateNudgeRaw.cacheTtlHours > 0\n ? Math.min(24 * 30, updateNudgeRaw.cacheTtlHours)\n : 24,\n };\n\n // Optional resolvedIssues map for version-aware filtering\n const validVersionPattern = /^\\d+\\.\\d+\\.\\d+/;\n const resolvedIssues =\n errorReportingRaw.resolvedIssues &&\n typeof errorReportingRaw.resolvedIssues === \"object\" &&\n !Array.isArray(errorReportingRaw.resolvedIssues)\n ? Object.fromEntries(\n Object.entries(errorReportingRaw.resolvedIssues).filter((entry): entry is [string, string] => {\n if (typeof entry[1] !== \"string\") return false;\n if (!validVersionPattern.test(entry[1])) {\n pluginLogger.warn(\n `memory-hybrid: errorReporting.resolvedIssues[\"${entry[0]}\"] has invalid version \"${entry[1]}\" — skipped.`,\n );\n return false;\n }\n return true;\n }),\n )\n : undefined;\n\n return {\n enabled,\n consent,\n mode,\n dsn: mode === \"community\" ? dsnRaw || DEFAULT_GLITCHTIP_DSN : dsnRaw || undefined,\n environment: typeof errorReportingRaw.environment === \"string\" ? errorReportingRaw.environment : undefined,\n sampleRate:\n typeof errorReportingRaw.sampleRate === \"number\" &&\n errorReportingRaw.sampleRate >= 0 &&\n errorReportingRaw.sampleRate <= 1\n ? errorReportingRaw.sampleRate\n : 1.0,\n botId,\n botName,\n resolvedIssues,\n updateNudge,\n };\n}\n\nexport function parseWorkflowTrackingConfig(cfg: Record<string, unknown>): WorkflowTrackingConfig {\n const raw = cfg.workflowTracking as Record<string, unknown> | undefined;\n return {\n enabled: raw?.enabled === true,\n maxTracesPerDay:\n typeof raw?.maxTracesPerDay === \"number\" && raw.maxTracesPerDay > 0 ? Math.floor(raw.maxTracesPerDay) : 100,\n retentionDays: typeof raw?.retentionDays === \"number\" && raw.retentionDays > 0 ? Math.floor(raw.retentionDays) : 90,\n goalExtractionModel:\n typeof raw?.goalExtractionModel === \"string\" && raw.goalExtractionModel.trim().length > 0\n ? raw.goalExtractionModel.trim()\n : undefined,\n };\n}\n\nfunction parseSectionTaxonomyOverrides(raw: unknown): SectionTaxonomyOverrides | undefined {\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return undefined;\n const out: SectionTaxonomyOverrides = {};\n for (const [category, value] of Object.entries(raw as Record<string, unknown>)) {\n if (!Array.isArray(value)) continue;\n const sections: SectionDefinition[] = [];\n for (const entry of value) {\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) continue;\n const section = entry as Record<string, unknown>;\n const id = typeof section.id === \"string\" ? section.id.trim() : \"\";\n const label = typeof section.label === \"string\" ? section.label.trim() : \"\";\n const aliases = Array.isArray(section.aliases)\n ? (section.aliases as unknown[])\n .filter((v): v is string => typeof v === \"string\")\n .map((v) => v.trim())\n .filter(Boolean)\n : [];\n if (id.length > 0 && label.length > 0 && aliases.length > 0) {\n sections.push({ id, label, aliases: [...new Set(aliases)] });\n }\n }\n const normalizedCategory = category.trim();\n if (normalizedCategory.length > 0 && sections.length > 0) out[normalizedCategory] = sections;\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nexport function parseCrystallizationConfig(cfg: Record<string, unknown>): CrystallizationConfig {\n const raw = cfg.crystallization as Record<string, unknown> | undefined;\n return {\n enabled: raw?.enabled === true,\n minUsageCount: typeof raw?.minUsageCount === \"number\" && raw.minUsageCount > 0 ? Math.floor(raw.minUsageCount) : 5,\n minSuccessRate:\n typeof raw?.minSuccessRate === \"number\" && raw.minSuccessRate >= 0 && raw.minSuccessRate <= 1\n ? raw.minSuccessRate\n : 0.7,\n autoApprove: raw?.autoApprove === true,\n outputDir:\n typeof raw?.outputDir === \"string\" && raw.outputDir.trim().length > 0\n ? raw.outputDir.trim()\n : \"~/.openclaw/workspace/skills/auto\",\n maxCrystallized:\n typeof raw?.maxCrystallized === \"number\" && raw.maxCrystallized > 0 ? Math.floor(raw.maxCrystallized) : 50,\n pruneUnusedDays:\n typeof raw?.pruneUnusedDays === \"number\" && raw.pruneUnusedDays >= 0 ? Math.floor(raw.pruneUnusedDays) : 30,\n evidenceCountBucketSize:\n typeof raw?.evidenceCountBucketSize === \"number\" && raw.evidenceCountBucketSize >= 1\n ? Math.min(1000, Math.floor(raw.evidenceCountBucketSize))\n : 5,\n sectionTaxonomy: parseSectionTaxonomyOverrides(raw?.sectionTaxonomy),\n placeholderEmailDomains: (() => {\n const raw_domains = raw?.placeholderEmailDomains;\n if (!Array.isArray(raw_domains)) return [...DEFAULT_PLACEHOLDER_EMAIL_DOMAINS];\n const valid = raw_domains\n .filter((d): d is string => typeof d === \"string\" && d.trim().length > 0)\n .map((d) => d.trim());\n return valid.length > 0 ? valid : [...DEFAULT_PLACEHOLDER_EMAIL_DOMAINS];\n })(),\n };\n}\n\nexport function parseSelfExtensionConfig(cfg: Record<string, unknown>): SelfExtensionConfig {\n const raw = cfg.selfExtension as Record<string, unknown> | undefined;\n return {\n enabled: raw?.enabled === true,\n minGapFrequency:\n typeof raw?.minGapFrequency === \"number\" && raw.minGapFrequency > 0 ? Math.floor(raw.minGapFrequency) : 3,\n minToolSavings:\n typeof raw?.minToolSavings === \"number\" && raw.minToolSavings > 0 ? Math.floor(raw.minToolSavings) : 2,\n maxProposals: typeof raw?.maxProposals === \"number\" && raw.maxProposals > 0 ? Math.floor(raw.maxProposals) : 20,\n };\n}\n\nconst ALL_IMPLICIT_SIGNAL_TYPES: ImplicitSignalType[] = [\n \"rephrase\",\n \"immediate_action\",\n \"topic_change\",\n \"grateful_close\",\n \"self_service\",\n \"escalation\",\n \"terse_response\",\n \"extended_engagement\",\n \"copy_paste\",\n \"correction_cascade\",\n \"silence_after_action\",\n];\n\nexport function parseImplicitFeedbackConfig(cfg: Record<string, unknown>): ImplicitFeedbackConfig {\n const raw = cfg.implicitFeedback as Record<string, unknown> | undefined;\n const validTypes = new Set<string>(ALL_IMPLICIT_SIGNAL_TYPES);\n const signalTypes: ImplicitSignalType[] = Array.isArray(raw?.signalTypes)\n ? (raw.signalTypes as unknown[]).filter((t): t is ImplicitSignalType => typeof t === \"string\" && validTypes.has(t))\n : ALL_IMPLICIT_SIGNAL_TYPES;\n\n // Issue #754: top-level aliases take precedence over nested keys\n const topLevelTrajectoryLLMAnalysis =\n typeof cfg.trajectoryLLMAnalysis === \"boolean\" ? cfg.trajectoryLLMAnalysis : undefined;\n const topLevelFeedToSelfCorrection =\n typeof cfg.feedToSelfCorrection === \"boolean\" ? cfg.feedToSelfCorrection : undefined;\n\n // Deprecation warnings for old nested keys when top-level is also set\n if (topLevelTrajectoryLLMAnalysis !== undefined && raw?.trajectoryLLMAnalysis !== undefined) {\n pluginLogger.warn(\n \"memory-hybrid: both `trajectoryLLMAnalysis` (top-level) and `implicitFeedback.trajectoryLLMAnalysis` are set; \" +\n \"using top-level `trajectoryLLMAnalysis`. The nested key is deprecated — move it to the top level.\",\n );\n }\n if (topLevelFeedToSelfCorrection !== undefined && raw?.feedToSelfCorrection !== undefined) {\n pluginLogger.warn(\n \"memory-hybrid: both `feedToSelfCorrection` (top-level) and `implicitFeedback.feedToSelfCorrection` are set; \" +\n \"using top-level `feedToSelfCorrection`. The nested key is deprecated — move it to the top level.\",\n );\n }\n\n return {\n enabled: raw?.enabled !== false,\n minConfidence:\n typeof raw?.minConfidence === \"number\" && raw.minConfidence >= 0 && raw.minConfidence <= 1\n ? raw.minConfidence\n : 0.5,\n signalTypes,\n rephraseThreshold:\n typeof raw?.rephraseThreshold === \"number\" && raw.rephraseThreshold > 0 && raw.rephraseThreshold <= 1\n ? raw.rephraseThreshold\n : 0.8,\n topicChangeThreshold:\n typeof raw?.topicChangeThreshold === \"number\" && raw.topicChangeThreshold >= 0 && raw.topicChangeThreshold <= 1\n ? raw.topicChangeThreshold\n : 0.3,\n terseResponseRatio:\n typeof raw?.terseResponseRatio === \"number\" && raw.terseResponseRatio > 0 && raw.terseResponseRatio <= 1\n ? raw.terseResponseRatio\n : 0.4,\n feedToReinforcement: raw?.feedToReinforcement !== false,\n // Issue #754: top-level takes precedence; fall back to nested with deprecation warning\n feedToSelfCorrection:\n topLevelFeedToSelfCorrection !== undefined ? topLevelFeedToSelfCorrection : raw?.feedToSelfCorrection !== false,\n maxLessonsPerDay:\n typeof raw?.maxLessonsPerDay === \"number\" && raw.maxLessonsPerDay >= 0\n ? Math.min(1000, Math.floor(raw.maxLessonsPerDay))\n : 50,\n lessonDedupeJaccard:\n typeof raw?.lessonDedupeJaccard === \"number\" && raw.lessonDedupeJaccard > 0 && raw.lessonDedupeJaccard <= 1\n ? raw.lessonDedupeJaccard\n : 0.7,\n autoCleanup: raw?.autoCleanup !== false,\n cleanupLimit:\n typeof raw?.cleanupLimit === \"number\" && raw.cleanupLimit >= 0\n ? Math.min(10000, Math.floor(raw.cleanupLimit))\n : 1000,\n maxSessionsPerRun:\n typeof raw?.maxSessionsPerRun === \"number\" && raw.maxSessionsPerRun >= 0\n ? Math.min(10000, Math.floor(raw.maxSessionsPerRun))\n : 50,\n maxSignalsPerRun:\n typeof raw?.maxSignalsPerRun === \"number\" && raw.maxSignalsPerRun >= 0\n ? Math.min(100000, Math.floor(raw.maxSignalsPerRun))\n : 100,\n maxTrajectoriesPerRun:\n typeof raw?.maxTrajectoriesPerRun === \"number\" && raw.maxTrajectoriesPerRun >= 0\n ? Math.min(10000, Math.floor(raw.maxTrajectoriesPerRun))\n : 50,\n maxWallClockSeconds:\n typeof raw?.maxWallClockSeconds === \"number\" && raw.maxWallClockSeconds >= 0\n ? Math.min(86400, Math.floor(raw.maxWallClockSeconds))\n : 300,\n trajectoryLLMAnalysis:\n topLevelTrajectoryLLMAnalysis !== undefined ? topLevelTrajectoryLLMAnalysis : raw?.trajectoryLLMAnalysis === true,\n };\n}\n\nexport function parseClosedLoopConfig(cfg: Record<string, unknown>): ClosedLoopConfig {\n const raw = cfg.closedLoop as Record<string, unknown> | undefined;\n return {\n enabled: raw?.enabled !== false,\n measurementWindowDays:\n typeof raw?.measurementWindowDays === \"number\" && raw.measurementWindowDays > 0\n ? Math.floor(raw.measurementWindowDays)\n : 7,\n minSampleSize: typeof raw?.minSampleSize === \"number\" && raw.minSampleSize > 0 ? Math.floor(raw.minSampleSize) : 5,\n autoDeprecateThreshold:\n typeof raw?.autoDeprecateThreshold === \"number\" ? Math.max(-1, Math.min(0, raw.autoDeprecateThreshold)) : -0.3,\n autoBoostThreshold:\n typeof raw?.autoBoostThreshold === \"number\" ? Math.max(0, Math.min(1, raw.autoBoostThreshold)) : 0.5,\n runInNightlyCycle: raw?.runInNightlyCycle !== false,\n };\n}\n\nexport function parseFrustrationDetectionConfig(cfg: Record<string, unknown>): FrustrationDetectionConfig {\n const raw = cfg.frustrationDetection as Record<string, unknown> | undefined;\n\n // Parse optional signal weights\n const weightsRaw = raw?.signalWeights as Record<string, unknown> | undefined;\n let signalWeights: FrustrationSignalWeights | undefined;\n if (weightsRaw && typeof weightsRaw === \"object\") {\n const validSignals = [\n \"short_reply\",\n \"imperative_tone\",\n \"repeated_instruction\",\n \"caps_or_emphasis\",\n \"explicit_frustration\",\n \"correction_frequency\",\n \"question_to_command\",\n \"reduced_context\",\n \"emoji_shift\",\n ];\n const parsed: FrustrationSignalWeights = {};\n for (const sig of validSignals) {\n if (typeof weightsRaw[sig] === \"number\") {\n (parsed as Record<string, number>)[sig] = Math.max(0, Math.min(1, weightsRaw[sig] as number));\n }\n }\n if (Object.keys(parsed).length > 0) signalWeights = parsed;\n }\n\n const thresholdsRaw = raw?.adaptationThresholds as Record<string, unknown> | undefined;\n\n return {\n enabled: raw?.enabled === true,\n windowSize:\n typeof raw?.windowSize === \"number\" && raw.windowSize >= 2 && raw.windowSize <= 50\n ? Math.floor(raw.windowSize)\n : 8,\n decayRate: typeof raw?.decayRate === \"number\" && raw.decayRate > 0 && raw.decayRate <= 1 ? raw.decayRate : 0.85,\n signalWeights,\n injectionThreshold:\n typeof raw?.injectionThreshold === \"number\" && raw.injectionThreshold >= 0 && raw.injectionThreshold <= 1\n ? raw.injectionThreshold\n : 0.3,\n adaptationThresholds: {\n medium:\n typeof thresholdsRaw?.medium === \"number\" && thresholdsRaw.medium >= 0 && thresholdsRaw.medium <= 1\n ? thresholdsRaw.medium\n : 0.3,\n high:\n typeof thresholdsRaw?.high === \"number\" && thresholdsRaw.high >= 0 && thresholdsRaw.high <= 1\n ? thresholdsRaw.high\n : 0.5,\n critical:\n typeof thresholdsRaw?.critical === \"number\" && thresholdsRaw.critical >= 0 && thresholdsRaw.critical <= 1\n ? thresholdsRaw.critical\n : 0.7,\n },\n feedToImplicitPipeline: raw?.feedToImplicitPipeline !== false,\n };\n}\n\nexport function parseCrossAgentLearningConfig(cfg: Record<string, unknown>): CrossAgentLearningConfig {\n const raw = cfg.crossAgentLearning as Record<string, unknown> | undefined;\n return {\n enabled: raw?.enabled === true,\n windowDays:\n typeof raw?.windowDays === \"number\" && raw.windowDays >= 1 ? Math.min(90, Math.floor(raw.windowDays)) : 14,\n model: typeof raw?.model === \"string\" && raw.model.trim().length > 0 ? raw.model.trim() : undefined,\n fallbackModels: Array.isArray(raw?.fallbackModels)\n ? (raw.fallbackModels as string[]).filter((m) => typeof m === \"string\" && m.trim().length > 0)\n : undefined,\n batchSize: typeof raw?.batchSize === \"number\" && raw.batchSize >= 5 ? Math.min(100, Math.floor(raw.batchSize)) : 20,\n minSourceConfidence:\n typeof raw?.minSourceConfidence === \"number\" && raw.minSourceConfidence >= 0 && raw.minSourceConfidence <= 1\n ? raw.minSourceConfidence\n : 0.4,\n runInNightlyCycle: raw?.runInNightlyCycle !== false,\n };\n}\n\nexport function parseToolEffectivenessConfig(cfg: Record<string, unknown>): ToolEffectivenessConfig {\n const raw = cfg.toolEffectiveness as Record<string, unknown> | undefined;\n return {\n enabled: raw?.enabled !== false,\n minCalls: typeof raw?.minCalls === \"number\" && raw.minCalls >= 1 ? Math.floor(raw.minCalls) : 3,\n topN: typeof raw?.topN === \"number\" && raw.topN >= 1 ? Math.min(50, Math.floor(raw.topN)) : 10,\n lowScoreThreshold:\n typeof raw?.lowScoreThreshold === \"number\" && raw.lowScoreThreshold >= 0 && raw.lowScoreThreshold <= 1\n ? raw.lowScoreThreshold\n : 0.3,\n decayFactor:\n typeof raw?.decayFactor === \"number\" && raw.decayFactor > 0 && raw.decayFactor <= 1 ? raw.decayFactor : 0.95,\n runInNightlyCycle: raw?.runInNightlyCycle !== false,\n injectHints: raw?.injectHints !== false,\n };\n}\n\nexport function parseCostTrackingConfig(cfg: Record<string, unknown>): CostTrackingConfig {\n const raw = cfg.costTracking as Record<string, unknown> | undefined;\n return {\n enabled: raw?.enabled !== false,\n retainDays: typeof raw?.retainDays === \"number\" && raw.retainDays >= 1 ? Math.floor(raw.retainDays) : 90,\n pruneInNightlyCycle: raw?.pruneInNightlyCycle !== false,\n };\n}\n\nexport function parseDashboardConfig(cfg: Record<string, unknown>): DashboardConfig {\n const raw = cfg.dashboard as Record<string, unknown> | undefined;\n return {\n enabled: raw?.enabled !== false,\n port: typeof raw?.port === \"number\" && raw.port >= 1024 && raw.port <= 65535 ? Math.floor(raw.port) : 7700,\n gitRepo: typeof raw?.gitRepo === \"string\" ? raw.gitRepo : undefined,\n };\n}\n\nexport function parseApiTapConfig(cfg: Record<string, unknown>): ApiTapConfig {\n const raw = cfg.apiTap as Record<string, unknown> | undefined;\n return {\n enabled: raw?.enabled === true,\n captureTimeoutSeconds:\n typeof raw?.captureTimeoutSeconds === \"number\" && raw.captureTimeoutSeconds >= 5\n ? Math.min(300, Math.floor(raw.captureTimeoutSeconds))\n : 60,\n endpointTtlDays:\n typeof raw?.endpointTtlDays === \"number\" && raw.endpointTtlDays >= 1\n ? Math.min(365, Math.floor(raw.endpointTtlDays))\n : 30,\n maxEndpointsPerSession:\n typeof raw?.maxEndpointsPerSession === \"number\" && raw.maxEndpointsPerSession >= 1\n ? Math.min(500, Math.floor(raw.maxEndpointsPerSession))\n : 50,\n allowedPatterns: Array.isArray(raw?.allowedPatterns)\n ? (raw.allowedPatterns as unknown[]).filter((p): p is string => typeof p === \"string\" && p.trim().length > 0)\n : [],\n blockedPatterns: Array.isArray(raw?.blockedPatterns)\n ? (raw.blockedPatterns as unknown[]).filter((p): p is string => typeof p === \"string\" && p.trim().length > 0)\n : [\"**/*oauth*/**\", \"**/*auth*/**\", \"**/*login*/**\", \"**/*signin*/**\", \"**/*token*/**\", \"**/*password*/**\"],\n };\n}\n\nexport function parseHumanizerConfig(cfg: Record<string, unknown>): HumanizerConfig {\n const raw = cfg.humanizer as Record<string, unknown> | undefined;\n const maxTextLength =\n typeof raw?.maxTextLength === \"number\" && raw.maxTextLength >= 1\n ? Math.min(20_000, Math.floor(raw.maxTextLength))\n : 4000;\n const minTextLength =\n typeof raw?.minTextLength === \"number\" && raw.minTextLength >= 0\n ? Math.min(maxTextLength, Math.floor(raw.minTextLength))\n : 100;\n return {\n enabled: raw?.enabled === true,\n bin: typeof raw?.bin === \"string\" && raw.bin.trim().length > 0 ? raw.bin.trim() : \"humanizer\",\n minTextLength,\n maxTextLength,\n modelTag: typeof raw?.modelTag === \"string\" && raw.modelTag.trim().length > 0 ? raw.modelTag.trim() : undefined,\n skillTag: typeof raw?.skillTag === \"string\" && raw.skillTag.trim().length > 0 ? raw.skillTag.trim() : undefined,\n };\n}\n\nexport function parseFrequencyCaptureConfig(cfg: Record<string, unknown>): FrequencyCaptureConfig {\n const raw = cfg.frequencyCapture as Record<string, unknown> | undefined;\n return {\n enabled: raw?.enabled === true,\n mentionThreshold:\n typeof raw?.mentionThreshold === \"number\" && raw.mentionThreshold >= 1 ? Math.floor(raw.mentionThreshold) : 3,\n lookbackSessions:\n typeof raw?.lookbackSessions === \"number\" && raw.lookbackSessions >= 1 ? Math.floor(raw.lookbackSessions) : 5,\n defaultImportance:\n typeof raw?.defaultImportance === \"number\" && raw.defaultImportance >= 0 && raw.defaultImportance <= 1\n ? raw.defaultImportance\n : 0.6,\n captureCredentials: raw?.captureCredentials !== false,\n ttlDays: typeof raw?.ttlDays === \"number\" && raw.ttlDays >= 1 ? Math.floor(raw.ttlDays) : 30,\n };\n}\n\n/** Safe parse for cron install paths that do not run the full hybrid config validator. */\nexport function parseDigestWeeklyDeliveryOnly(cfg: Record<string, unknown>): DigestWeeklyDeliveryConfig {\n const digest = cfg.digest as Record<string, unknown> | undefined;\n const weekly = digest?.weekly as Record<string, unknown> | undefined;\n const delivery = weekly?.delivery as Record<string, unknown> | undefined;\n const modeRaw = delivery?.mode;\n const valid = [\"telegram\", \"system\", \"none\"] as const;\n let mode: (typeof valid)[number] = \"system\";\n if (typeof modeRaw === \"string\" && (valid as readonly string[]).includes(modeRaw)) {\n mode = modeRaw as (typeof valid)[number];\n } else if (modeRaw !== undefined) {\n pluginLogger.warn(\n `memory-hybrid: invalid digest.weekly.delivery.mode \"${modeRaw}\"; expected telegram|system|none. Using \"system\".`,\n );\n }\n const chatId =\n typeof delivery?.chatId === \"string\" && delivery.chatId.trim().length > 0 ? delivery.chatId.trim() : undefined;\n if (mode === \"telegram\" && !chatId) {\n pluginLogger.warn(\n `memory-hybrid: digest.weekly.delivery.mode is \"telegram\" but chatId is missing; using \"system\".`,\n );\n return { mode: \"system\" };\n }\n return { mode, ...(chatId ? { chatId } : {}) };\n}\n\nexport function parseDigestConfig(cfg: Record<string, unknown>): DigestConfig {\n return {\n weekly: { delivery: parseDigestWeeklyDeliveryOnly(cfg) },\n autopilot: parseDigestAutopilotConfig(cfg),\n };\n}\n\nconst DIGEST_AUTOPILOT_PERSONA_POLICIES = [\"disabled\", \"report-only\", \"cautious\", \"apply-safe\"] as const;\nconst DIGEST_AUTOPILOT_PROCEDURE_POLICIES = [\"disabled\", \"report-only\", \"dry-run-skills\", \"auto-safe\"] as const;\nconst DIGEST_AUTOPILOT_VERIFIED_POLICIES = [\"disabled\", \"report-only\", \"classify\", \"apply-obvious\"] as const;\nconst DIGEST_AUTOPILOT_READ_ONLY_POLICIES = [\"disabled\", \"report-only\", \"classify\"] as const;\n\nfunction parseAutopilotPolicy<T extends readonly string[]>(\n value: unknown,\n allowed: T,\n fallback: T[number],\n field: string,\n): T[number] {\n if (typeof value === \"string\" && (allowed as readonly string[]).includes(value)) return value as T[number];\n if (value === undefined) return fallback;\n throw new Error(`Invalid digest.autopilot.${field}: ${String(value)}`);\n}\n\nfunction parseAutopilotPositiveInt(value: unknown, fallback: number, field: string, min = 1, max = 100_000): number {\n if (value === undefined) return fallback;\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new Error(`Invalid digest.autopilot.${field}: ${String(value)}`);\n }\n const normalized = Math.floor(value);\n if (normalized < min || normalized > max) {\n throw new Error(`Invalid digest.autopilot.${field}: ${String(value)}`);\n }\n return normalized;\n}\n\nfunction parseAutopilotStrictBoolean(value: unknown, field: string, defaultValue: boolean): boolean {\n if (value === undefined) return defaultValue;\n if (value === true) return true;\n if (value === false) return false;\n throw new Error(`Invalid digest.autopilot.${field}: expected boolean, received ${typeof value} (${String(value)})`);\n}\n\nexport function parseDigestAutopilotConfig(cfg: Record<string, unknown>): DigestAutopilotConfig {\n const digest = cfg.digest as Record<string, unknown> | undefined;\n const autopilot = digest?.autopilot as Record<string, unknown> | undefined;\n const modeRaw = autopilot?.mode;\n const mode = modeRaw === \"apply\" ? \"apply\" : \"dry-run\";\n if (modeRaw !== undefined && modeRaw !== \"apply\" && modeRaw !== \"dry-run\") {\n throw new Error(`Invalid digest.autopilot.mode: ${String(modeRaw)}`);\n }\n const scheduleRaw = autopilot?.schedule;\n const schedule = \"after-weekly-pending-digest\" as const;\n if (scheduleRaw !== undefined && scheduleRaw !== schedule) {\n throw new Error(`Invalid digest.autopilot.schedule: ${String(scheduleRaw)}`);\n }\n\n return {\n enabled: parseAutopilotStrictBoolean(autopilot?.enabled, \"enabled\", false),\n mode,\n schedule,\n maxPersona: parseAutopilotPositiveInt(autopilot?.maxPersona, 20, \"maxPersona\", 0),\n maxProcedures: parseAutopilotPositiveInt(autopilot?.maxProcedures, 50, \"maxProcedures\", 0),\n maxVerified: parseAutopilotPositiveInt(autopilot?.maxVerified, 100, \"maxVerified\", 0),\n maxTools: parseAutopilotPositiveInt(autopilot?.maxTools, 50, \"maxTools\", 0),\n maxCrystallization: parseAutopilotPositiveInt(autopilot?.maxCrystallization, 50, \"maxCrystallization\", 0),\n personaPolicy: parseAutopilotPolicy(\n autopilot?.personaPolicy,\n DIGEST_AUTOPILOT_PERSONA_POLICIES,\n \"cautious\",\n \"personaPolicy\",\n ),\n procedurePolicy: parseAutopilotPolicy(\n autopilot?.procedurePolicy,\n DIGEST_AUTOPILOT_PROCEDURE_POLICIES,\n \"auto-safe\",\n \"procedurePolicy\",\n ),\n verifiedPolicy: parseAutopilotPolicy(\n autopilot?.verifiedPolicy,\n DIGEST_AUTOPILOT_VERIFIED_POLICIES,\n \"classify\",\n \"verifiedPolicy\",\n ),\n toolPolicy: parseAutopilotPolicy(\n autopilot?.toolPolicy,\n DIGEST_AUTOPILOT_READ_ONLY_POLICIES,\n \"classify\",\n \"toolPolicy\",\n ),\n crystallizationPolicy: parseAutopilotPolicy(\n autopilot?.crystallizationPolicy,\n DIGEST_AUTOPILOT_READ_ONLY_POLICIES,\n \"classify\",\n \"crystallizationPolicy\",\n ),\n notifyOnNoop: parseAutopilotStrictBoolean(autopilot?.notifyOnNoop, \"notifyOnNoop\", false),\n notifyOnDryRunActions: parseAutopilotStrictBoolean(\n autopilot?.notifyOnDryRunActions,\n \"notifyOnDryRunActions\",\n false,\n ),\n notifyOnApplyActions: parseAutopilotStrictBoolean(autopilot?.notifyOnApplyActions, \"notifyOnApplyActions\", true),\n notifyOnHumanReviewRequired: parseAutopilotStrictBoolean(\n autopilot?.notifyOnHumanReviewRequired,\n \"notifyOnHumanReviewRequired\",\n true,\n ),\n notifyOnFailure: parseAutopilotStrictBoolean(autopilot?.notifyOnFailure, \"notifyOnFailure\", true),\n guardWindowHours: parseAutopilotPositiveInt(autopilot?.guardWindowHours, 120, \"guardWindowHours\"),\n lockTtlMinutes: parseAutopilotPositiveInt(autopilot?.lockTtlMinutes, 120, \"lockTtlMinutes\"),\n };\n}\n\nexport function parseLifecycleConfig(cfg: Record<string, unknown>): LifecycleAdaptersConfig {\n const raw = cfg.lifecycle as Record<string, unknown> | undefined;\n const adapters = raw?.adapters as Record<string, unknown> | undefined;\n const github = adapters?.github as Record<string, unknown> | undefined;\n const validAction = (value: unknown): \"expire-now\" | \"expire-soon\" | \"keep-stable\" | undefined =>\n value === \"expire-now\" || value === \"expire-soon\" || value === \"keep-stable\" ? value : undefined;\n const repos = Array.isArray(github?.repos)\n ? (github?.repos as unknown[])\n .filter((r): r is string => typeof r === \"string\" && r.trim().length > 0)\n .map((r) => r.trim())\n : undefined;\n return {\n adapters: {\n github: {\n enabled: github?.enabled === true,\n repo: typeof github?.repo === \"string\" && github.repo.trim().length > 0 ? github.repo.trim() : undefined,\n repos: repos && repos.length > 0 ? repos : undefined,\n tokenRef:\n typeof github?.tokenRef === \"string\" && github.tokenRef.trim().length > 0\n ? github.tokenRef.trim()\n : undefined,\n onMerged: validAction(github?.onMerged),\n onClosed: validAction(github?.onClosed),\n onOpen: validAction(github?.onOpen),\n },\n },\n };\n}\n"],"mappings":"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"}