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":"skill-sections.js","names":[],"sources":["../../config/skill-sections.ts"],"sourcesContent":["/**\n * Skill section taxonomy — single source of truth for required SKILL.md section\n * names, aliases, and per-category overrides (issues #1375, #1408).\n *\n * Both SkillValidator and GeneratedSkillValidationService import from here to\n * guarantee identical pass/fail outcomes when validating the same SKILL.md content.\n *\n * ## Design\n * - `DEFAULT_REQUIRED_SECTIONS` is the canonical list used by all skill categories\n * unless a category-specific override is registered in `CATEGORY_SECTION_TAXONOMIES`.\n * - Alias matching is case-insensitive and punctuation-normalised (same rules as\n * SkillValidator's `parseH2Headings`/`hasHeadingAlias` helpers).\n * - `MAX_SKILL_LINES` is the shared line-length cap applied by both validators.\n *\n * ## Extending\n * To add a new skill category with different required sections, add an entry to\n * `CATEGORY_SECTION_TAXONOMIES` and export it. Do NOT edit `DEFAULT_REQUIRED_SECTIONS`\n * unless you also update the crystallizer template and all related tests.\n */\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface SectionDefinition {\n /** Stable machine identifier — used in error messages and tests. */\n id: string;\n /** Human-readable canonical label shown in validation error messages. */\n label: string;\n /**\n * Heading text that counts as satisfying this requirement. Validators normalize\n * these aliases before comparing them with the normalized heading text from\n * `parseH2Headings()`, so entries may use readable casing and punctuation.\n */\n aliases: string[];\n}\n\n/**\n * Project-level taxonomy override map. Keys are category identifiers; use\n * `default` to replace the default taxonomy for categories without a specific\n * override. Each value replaces the inherited taxonomy for that category.\n */\nexport type SectionTaxonomyOverrides = Record<string, SectionDefinition[]>;\n\n// ---------------------------------------------------------------------------\n// Shared line-limit constant (issue #1366)\n// ---------------------------------------------------------------------------\n\n/**\n * Maximum number of lines allowed in a SKILL.md file.\n * Used by BOTH SkillValidator and GeneratedSkillValidationService.\n */\nexport const MAX_SKILL_LINES = 300;\n\nexport {\n MAX_SKILL_FILE_BYTES,\n MAX_SKILL_FILE_BYTES_SAFE,\n MAX_RECIPE_JSON_BYTES,\n MAX_WORKFLOW_STEPS_IN_SKILL,\n MAX_STEP_SUMMARY_CHARS,\n} from \"./skill-size-limits.js\";\n\n// ---------------------------------------------------------------------------\n// Shared category frontmatter keys\n// ---------------------------------------------------------------------------\n\n/**\n * Alternate frontmatter keys that resolve to \"category\" semantics.\n * Used by BOTH SkillValidator and GeneratedSkillValidationService when\n * extracting category information from skill frontmatter.\n * Order matters: earlier keys take precedence in fallback chains.\n */\nexport const CATEGORY_FRONTMATTER_KEYS = [\"category\", \"categories\", \"tags\", \"type\", \"kind\"] as const;\n\n// ---------------------------------------------------------------------------\n// Default required-section taxonomy\n// ---------------------------------------------------------------------------\n\n/**\n * Unified required-section definitions for all standard skill categories.\n *\n * Supersedes:\n * - SkillValidator's inline `requiredSections` array (which lacked Scope and Provenance)\n * - GeneratedSkillValidationService's `REQUIRED_SECTIONS` exact-match list (which\n * lacked Verification and Anti-patterns, and used brittle exact-string matching)\n *\n * The crystallizer template (skill-crystallizer.ts) emits all eight sections below;\n * any future changes to the template must keep the aliases here in sync.\n */\nexport const DEFAULT_REQUIRED_SECTIONS: SectionDefinition[] = [\n {\n id: \"trigger\",\n label: \"Trigger\",\n aliases: [\"trigger\", \"when to activate\", \"when to use\"],\n },\n {\n id: \"scope\",\n label: \"Scope\",\n aliases: [\"scope\"],\n },\n {\n id: \"when-not-to-use\",\n label: \"When not to use\",\n aliases: [\"when not to use\", \"do not use when\", \"do not use\", \"anti-activation conditions\"],\n },\n {\n id: \"workflow\",\n label: \"Workflow\",\n aliases: [\"workflow\", \"steps\"],\n },\n {\n id: \"verification\",\n label: \"Verification\",\n aliases: [\"verification\", \"quality checklist\", \"validation\"],\n },\n {\n id: \"anti-patterns\",\n label: \"Anti-patterns / Known Failures\",\n aliases: [\"anti-patterns / known failures\", \"anti-patterns\", \"known failures\"],\n },\n {\n id: \"examples\",\n label: \"Examples\",\n aliases: [\"examples\"],\n },\n {\n id: \"provenance\",\n label: \"Provenance\",\n aliases: [\"provenance\"],\n },\n];\n\n// ---------------------------------------------------------------------------\n// Per-category taxonomy overrides (issue #1408)\n// ---------------------------------------------------------------------------\n\n/**\n * Per-category section taxonomy overrides.\n * Keys are skill category identifiers (e.g. \"procedure-skill\", \"explain-skill\").\n * When a category is listed here, its section list REPLACES the default for that\n * category — it is NOT merged. To extend the default, spread DEFAULT_REQUIRED_SECTIONS\n * and add your extra entries.\n *\n * @example\n * ```ts\n * CATEGORY_SECTION_TAXONOMIES[\"explain-skill\"] = [\n * ...DEFAULT_REQUIRED_SECTIONS,\n * { id: \"risk\", label: \"Risk\", aliases: [\"risk\", \"risks\"] },\n * ];\n * ```\n */\nexport const CATEGORY_SECTION_TAXONOMIES: Record<string, SectionDefinition[]> = {\n procedure: [\n {\n id: \"when-not-to-use\",\n label: \"When not to use\",\n aliases: [\"when not to use\", \"do not use when\", \"do not use\", \"anti-activation conditions\"],\n },\n {\n id: \"workflow\",\n label: \"Workflow\",\n aliases: [\"workflow\", \"steps\"],\n },\n {\n id: \"verification\",\n label: \"Verification\",\n aliases: [\"verification\", \"quality checklist\", \"validation\"],\n },\n {\n id: \"examples\",\n label: \"Examples\",\n aliases: [\"examples\"],\n },\n ],\n};\n\n// ---------------------------------------------------------------------------\n// Accessor helper\n// ---------------------------------------------------------------------------\n\n/**\n * Returns the required section definitions for the given category.\n * Falls back to DEFAULT_REQUIRED_SECTIONS when no category-specific override is\n * registered or when `category` is undefined / empty.\n */\nexport function getSectionTaxonomy(\n category?: string,\n projectOverrides?: SectionTaxonomyOverrides,\n): SectionDefinition[] {\n const projectCategoryOverride = category ? projectOverrides?.[category] : undefined;\n if (projectCategoryOverride && projectCategoryOverride.length > 0) return projectCategoryOverride;\n\n const projectDefaultOverride = projectOverrides?.default;\n if (projectDefaultOverride && projectDefaultOverride.length > 0) return projectDefaultOverride;\n\n if (category && CATEGORY_SECTION_TAXONOMIES[category] != null) {\n const override = CATEGORY_SECTION_TAXONOMIES[category];\n if (override.length > 0) return override;\n }\n return DEFAULT_REQUIRED_SECTIONS;\n}\n"],"mappings":";;;;;;;;AAwEA,MAAa,4BAA4B;CAAC;CAAY;CAAc;CAAQ;CAAQ;CAAO;;;;;;;;;;;;AAiB3F,MAAa,4BAAiD;CAC5D;EACE,IAAI;EACJ,OAAO;EACP,SAAS;GAAC;GAAW;GAAoB;GAAc;EACxD;CACD;EACE,IAAI;EACJ,OAAO;EACP,SAAS,CAAC,QAAQ;EACnB;CACD;EACE,IAAI;EACJ,OAAO;EACP,SAAS;GAAC;GAAmB;GAAmB;GAAc;GAA6B;EAC5F;CACD;EACE,IAAI;EACJ,OAAO;EACP,SAAS,CAAC,YAAY,QAAQ;EAC/B;CACD;EACE,IAAI;EACJ,OAAO;EACP,SAAS;GAAC;GAAgB;GAAqB;GAAa;EAC7D;CACD;EACE,IAAI;EACJ,OAAO;EACP,SAAS;GAAC;GAAkC;GAAiB;GAAiB;EAC/E;CACD;EACE,IAAI;EACJ,OAAO;EACP,SAAS,CAAC,WAAW;EACtB;CACD;EACE,IAAI;EACJ,OAAO;EACP,SAAS,CAAC,aAAa;EACxB;CACF;;;;;;;;;;;;;;;;AAqBD,MAAa,8BAAmE,EAC9E,WAAW;CACT;EACE,IAAI;EACJ,OAAO;EACP,SAAS;GAAC;GAAmB;GAAmB;GAAc;GAA6B;EAC5F;CACD;EACE,IAAI;EACJ,OAAO;EACP,SAAS,CAAC,YAAY,QAAQ;EAC/B;CACD;EACE,IAAI;EACJ,OAAO;EACP,SAAS;GAAC;GAAgB;GAAqB;GAAa;EAC7D;CACD;EACE,IAAI;EACJ,OAAO;EACP,SAAS,CAAC,WAAW;EACtB;CACF,EACF;;;;;;AAWD,SAAgB,mBACd,UACA,kBACqB;CACrB,MAAM,0BAA0B,WAAW,mBAAmB,YAAY,KAAA;CAC1E,IAAI,2BAA2B,wBAAwB,SAAS,GAAG,OAAO;CAE1E,MAAM,yBAAyB,kBAAkB;CACjD,IAAI,0BAA0B,uBAAuB,SAAS,GAAG,OAAO;CAExE,IAAI,YAAY,4BAA4B,aAAa,MAAM;EAC7D,MAAM,WAAW,4BAA4B;EAC7C,IAAI,SAAS,SAAS,GAAG,OAAO;;CAElC,OAAO"}
1
+ {"version":3,"file":"skill-sections.js","names":[],"sources":["../../config/skill-sections.ts"],"sourcesContent":["/**\n * Skill section taxonomy — single source of truth for required SKILL.md section\n * names, aliases, and per-category overrides (issues #1375, #1408).\n *\n * Both SkillValidator and GeneratedSkillValidationService import from here to\n * guarantee identical pass/fail outcomes when validating the same SKILL.md content.\n *\n * ## Design\n * - `DEFAULT_REQUIRED_SECTIONS` is the canonical list used by all skill categories\n * unless a category-specific override is registered in `CATEGORY_SECTION_TAXONOMIES`.\n * - Alias matching is case-insensitive and punctuation-normalised (same rules as\n * SkillValidator's `parseH2Headings`/`hasHeadingAlias` helpers).\n * - `MAX_SKILL_LINES` is the shared line-length cap applied by both validators.\n *\n * ## Extending\n * To add a new skill category with different required sections, add an entry to\n * `CATEGORY_SECTION_TAXONOMIES` and export it. Do NOT edit `DEFAULT_REQUIRED_SECTIONS`\n * unless you also update the crystallizer template and all related tests.\n */\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface SectionDefinition {\n /** Stable machine identifier — used in error messages and tests. */\n id: string;\n /** Human-readable canonical label shown in validation error messages. */\n label: string;\n /**\n * Heading text that counts as satisfying this requirement. Validators normalize\n * these aliases before comparing them with the normalized heading text from\n * `parseH2Headings()`, so entries may use readable casing and punctuation.\n */\n aliases: string[];\n}\n\n/**\n * Project-level taxonomy override map. Keys are category identifiers; use\n * `default` to replace the default taxonomy for categories without a specific\n * override. Each value replaces the inherited taxonomy for that category.\n */\nexport type SectionTaxonomyOverrides = Record<string, SectionDefinition[]>;\n\n// ---------------------------------------------------------------------------\n// Shared line-limit constant (issue #1366)\n// ---------------------------------------------------------------------------\n\n/**\n * Maximum number of lines allowed in a SKILL.md file.\n * Used by BOTH SkillValidator and GeneratedSkillValidationService.\n */\nexport const MAX_SKILL_LINES = 300;\n\nexport {\n MAX_SKILL_FILE_BYTES,\n MAX_SKILL_FILE_BYTES_SAFE,\n MAX_RECIPE_JSON_BYTES,\n MAX_WORKFLOW_STEPS_IN_SKILL,\n MAX_STEP_SUMMARY_CHARS,\n} from \"./skill-size-limits.js\";\n\n// ---------------------------------------------------------------------------\n// Shared category frontmatter keys\n// ---------------------------------------------------------------------------\n\n/**\n * Alternate frontmatter keys that resolve to \"category\" semantics.\n * Used by BOTH SkillValidator and GeneratedSkillValidationService when\n * extracting category information from skill frontmatter.\n * Order matters: earlier keys take precedence in fallback chains.\n */\nexport const CATEGORY_FRONTMATTER_KEYS = [\"category\", \"categories\", \"tags\", \"type\", \"kind\"] as const;\n\n// ---------------------------------------------------------------------------\n// Default required-section taxonomy\n// ---------------------------------------------------------------------------\n\n/**\n * Unified required-section definitions for all standard skill categories.\n *\n * Supersedes:\n * - SkillValidator's inline `requiredSections` array (which lacked Scope and Provenance)\n * - GeneratedSkillValidationService's `REQUIRED_SECTIONS` exact-match list (which\n * lacked Verification and Anti-patterns, and used brittle exact-string matching)\n *\n * The crystallizer template (skill-crystallizer.ts) emits all eight sections below;\n * any future changes to the template must keep the aliases here in sync.\n */\nexport const DEFAULT_REQUIRED_SECTIONS: SectionDefinition[] = [\n {\n id: \"trigger\",\n label: \"Trigger\",\n aliases: [\"trigger\", \"when to activate\", \"when to use\"],\n },\n {\n id: \"scope\",\n label: \"Scope\",\n aliases: [\"scope\"],\n },\n {\n id: \"when-not-to-use\",\n label: \"When not to use\",\n aliases: [\"when not to use\", \"do not use when\", \"do not use\", \"anti-activation conditions\"],\n },\n {\n id: \"workflow\",\n label: \"Workflow\",\n aliases: [\"workflow\", \"steps\"],\n },\n {\n id: \"verification\",\n label: \"Verification\",\n aliases: [\"verification\", \"quality checklist\", \"validation\"],\n },\n {\n id: \"anti-patterns\",\n label: \"Anti-patterns / Known Failures\",\n aliases: [\"anti-patterns / known failures\", \"anti-patterns\", \"known failures\"],\n },\n {\n id: \"examples\",\n label: \"Examples\",\n aliases: [\"examples\"],\n },\n {\n id: \"provenance\",\n label: \"Provenance\",\n aliases: [\"provenance\"],\n },\n];\n\n// ---------------------------------------------------------------------------\n// Per-category taxonomy overrides (issue #1408)\n// ---------------------------------------------------------------------------\n\n/**\n * Per-category section taxonomy overrides.\n * Keys are skill category identifiers (e.g. \"procedure-skill\", \"explain-skill\").\n * When a category is listed here, its section list REPLACES the default for that\n * category — it is NOT merged. To extend the default, spread DEFAULT_REQUIRED_SECTIONS\n * and add your extra entries.\n *\n * @example\n * ```ts\n * CATEGORY_SECTION_TAXONOMIES[\"explain-skill\"] = [\n * ...DEFAULT_REQUIRED_SECTIONS,\n * { id: \"risk\", label: \"Risk\", aliases: [\"risk\", \"risks\"] },\n * ];\n * ```\n */\nexport const CATEGORY_SECTION_TAXONOMIES: Record<string, SectionDefinition[]> = {\n procedure: [\n {\n id: \"when-not-to-use\",\n label: \"When not to use\",\n aliases: [\"when not to use\", \"do not use when\", \"do not use\", \"anti-activation conditions\"],\n },\n {\n id: \"workflow\",\n label: \"Workflow\",\n aliases: [\"workflow\", \"steps\"],\n },\n {\n id: \"verification\",\n label: \"Verification\",\n aliases: [\"verification\", \"quality checklist\", \"validation\"],\n },\n {\n id: \"examples\",\n label: \"Examples\",\n aliases: [\"examples\"],\n },\n ],\n};\n\n// ---------------------------------------------------------------------------\n// Accessor helper\n// ---------------------------------------------------------------------------\n\n/**\n * Returns the required section definitions for the given category.\n * Falls back to DEFAULT_REQUIRED_SECTIONS when no category-specific override is\n * registered or when `category` is undefined / empty.\n */\nexport function getSectionTaxonomy(\n category?: string,\n projectOverrides?: SectionTaxonomyOverrides,\n): SectionDefinition[] {\n const projectCategoryOverride = category ? projectOverrides?.[category] : undefined;\n if (projectCategoryOverride && projectCategoryOverride.length > 0) return projectCategoryOverride;\n\n const projectDefaultOverride = projectOverrides?.default;\n if (projectDefaultOverride && projectDefaultOverride.length > 0) return projectDefaultOverride;\n\n if (category && CATEGORY_SECTION_TAXONOMIES[category] != null) {\n const override = CATEGORY_SECTION_TAXONOMIES[category];\n if (override.length > 0) return override;\n }\n return DEFAULT_REQUIRED_SECTIONS;\n}\n"],"mappings":";;;;;;;;AAwEA,MAAa,4BAA4B;CAAC;CAAY;CAAc;CAAQ;CAAQ;AAAM;;;;;;;;;;;;AAiB1F,MAAa,4BAAiD;CAC5D;EACE,IAAI;EACJ,OAAO;EACP,SAAS;GAAC;GAAW;GAAoB;EAAa;CACxD;CACA;EACE,IAAI;EACJ,OAAO;EACP,SAAS,CAAC,OAAO;CACnB;CACA;EACE,IAAI;EACJ,OAAO;EACP,SAAS;GAAC;GAAmB;GAAmB;GAAc;EAA4B;CAC5F;CACA;EACE,IAAI;EACJ,OAAO;EACP,SAAS,CAAC,YAAY,OAAO;CAC/B;CACA;EACE,IAAI;EACJ,OAAO;EACP,SAAS;GAAC;GAAgB;GAAqB;EAAY;CAC7D;CACA;EACE,IAAI;EACJ,OAAO;EACP,SAAS;GAAC;GAAkC;GAAiB;EAAgB;CAC/E;CACA;EACE,IAAI;EACJ,OAAO;EACP,SAAS,CAAC,UAAU;CACtB;CACA;EACE,IAAI;EACJ,OAAO;EACP,SAAS,CAAC,YAAY;CACxB;AACF;;;;;;;;;;;;;;;;AAqBA,MAAa,8BAAmE,EAC9E,WAAW;CACT;EACE,IAAI;EACJ,OAAO;EACP,SAAS;GAAC;GAAmB;GAAmB;GAAc;EAA4B;CAC5F;CACA;EACE,IAAI;EACJ,OAAO;EACP,SAAS,CAAC,YAAY,OAAO;CAC/B;CACA;EACE,IAAI;EACJ,OAAO;EACP,SAAS;GAAC;GAAgB;GAAqB;EAAY;CAC7D;CACA;EACE,IAAI;EACJ,OAAO;EACP,SAAS,CAAC,UAAU;CACtB;AACF,EACF;;;;;;AAWA,SAAgB,mBACd,UACA,kBACqB;CACrB,MAAM,0BAA0B,WAAW,mBAAmB,YAAY,KAAA;CAC1E,IAAI,2BAA2B,wBAAwB,SAAS,GAAG,OAAO;CAE1E,MAAM,yBAAyB,kBAAkB;CACjD,IAAI,0BAA0B,uBAAuB,SAAS,GAAG,OAAO;CAExE,IAAI,YAAY,4BAA4B,aAAa,MAAM;EAC7D,MAAM,WAAW,4BAA4B;EAC7C,IAAI,SAAS,SAAS,GAAG,OAAO;CAClC;CACA,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"skill-size-limits.js","names":[],"sources":["../../config/skill-size-limits.ts"],"sourcesContent":["/**\n * Shared size limits for generated skills (issues #1537, #1540, #1542).\n * Aligns with OpenClaw workspace skill loader default (256 KB).\n */\n\n/** OpenClaw `DEFAULT_MAX_SKILL_FILE_BYTES` — hard loader ceiling. */\nexport const MAX_SKILL_FILE_BYTES = 256_000;\n\n/** Conservative write-time target for generated `SKILL.md`. */\nexport const MAX_SKILL_FILE_BYTES_SAFE = 200_000;\n\n/**\n * Aggressive target for `SKILL.md` body before progressive disclosure\n * is *triggered* (per #1539: \"preferably 64-96 KB maximum\").\n * Skills under this stay one file; skills over it offload detail into\n * `references/workflow.md` (or other sidecars) until they fit.\n */\nexport const MAX_SKILL_FILE_BYTES_AGGRESSIVE_TARGET = 96_000;\n\n/** Bounded `recipe.json` sidecar cap (UTF-8 bytes). */\nexport const MAX_RECIPE_JSON_BYTES = 64_000;\n\n/** Max recipe steps retained in sidecar after summarization. */\nexport const MAX_RECIPE_STEPS_IN_SIDECAR = 50;\n\n/** Max workflow lines in `SKILL.md` body. */\nexport const MAX_WORKFLOW_STEPS_IN_SKILL = 25;\n\n/** Per-step summary length in workflow lines. */\nexport const MAX_STEP_SUMMARY_CHARS = 240;\n\n/** Optional cap for total generated skill directory (UTF-8 bytes). */\nexport const MAX_SKILL_DIR_BYTES = 512_000;\n\n/** Max `references/workflow.md` sidecar (UTF-8 bytes). */\nexport const MAX_REFERENCE_WORKFLOW_BYTES = 96_000;\n\n/** Skill Creator description field limit. */\nexport const MAX_SKILL_DESCRIPTION_CHARS = 1024;\n\nexport function utf8ByteLength(text: string): number {\n return Buffer.byteLength(text, \"utf8\");\n}\n"],"mappings":";;;;;;AAMA,MAAa,uBAAuB;;AAGpC,MAAa,4BAA4B;;;;;;;AAQzC,MAAa,yCAAyC;;AAGtD,MAAa,wBAAwB;;AAerC,MAAa,+BAA+B;;AAG5C,MAAa,8BAA8B;AAE3C,SAAgB,eAAe,MAAsB;CACnD,OAAO,OAAO,WAAW,MAAM,OAAO"}
1
+ {"version":3,"file":"skill-size-limits.js","names":[],"sources":["../../config/skill-size-limits.ts"],"sourcesContent":["/**\n * Shared size limits for generated skills (issues #1537, #1540, #1542).\n * Aligns with OpenClaw workspace skill loader default (256 KB).\n */\n\n/** OpenClaw `DEFAULT_MAX_SKILL_FILE_BYTES` — hard loader ceiling. */\nexport const MAX_SKILL_FILE_BYTES = 256_000;\n\n/** Conservative write-time target for generated `SKILL.md`. */\nexport const MAX_SKILL_FILE_BYTES_SAFE = 200_000;\n\n/**\n * Aggressive target for `SKILL.md` body before progressive disclosure\n * is *triggered* (per #1539: \"preferably 64-96 KB maximum\").\n * Skills under this stay one file; skills over it offload detail into\n * `references/workflow.md` (or other sidecars) until they fit.\n */\nexport const MAX_SKILL_FILE_BYTES_AGGRESSIVE_TARGET = 96_000;\n\n/** Bounded `recipe.json` sidecar cap (UTF-8 bytes). */\nexport const MAX_RECIPE_JSON_BYTES = 64_000;\n\n/** Max recipe steps retained in sidecar after summarization. */\nexport const MAX_RECIPE_STEPS_IN_SIDECAR = 50;\n\n/** Max workflow lines in `SKILL.md` body. */\nexport const MAX_WORKFLOW_STEPS_IN_SKILL = 25;\n\n/** Per-step summary length in workflow lines. */\nexport const MAX_STEP_SUMMARY_CHARS = 240;\n\n/** Optional cap for total generated skill directory (UTF-8 bytes). */\nexport const MAX_SKILL_DIR_BYTES = 512_000;\n\n/** Max `references/workflow.md` sidecar (UTF-8 bytes). */\nexport const MAX_REFERENCE_WORKFLOW_BYTES = 96_000;\n\n/** Skill Creator description field limit. */\nexport const MAX_SKILL_DESCRIPTION_CHARS = 1024;\n\nexport function utf8ByteLength(text: string): number {\n return Buffer.byteLength(text, \"utf8\");\n}\n"],"mappings":";;;;;;AAMA,MAAa,uBAAuB;;AAGpC,MAAa,4BAA4B;;;;;;;AAQzC,MAAa,yCAAyC;;AAGtD,MAAa,wBAAwB;;AAerC,MAAa,+BAA+B;;AAG5C,MAAa,8BAA8B;AAE3C,SAAgB,eAAe,MAAsB;CACnD,OAAO,OAAO,WAAW,MAAM,MAAM;AACvC"}
@@ -1 +1 @@
1
- {"version":3,"file":"agents.js","names":[],"sources":["../../../config/types/agents.ts"],"sourcesContent":["/** Proposal statuses for persona evolution workflow */\nexport const PROPOSAL_STATUSES = [\"pending\", \"approved\", \"rejected\", \"applied\"] as const;\nexport type ProposalStatus = (typeof PROPOSAL_STATUSES)[number];\n\n/** Identity file types that can be proposed for modification */\nexport const IDENTITY_FILE_TYPES = [\"SOUL.md\", \"IDENTITY.md\", \"USER.md\"] as const;\nexport type IdentityFileType = (typeof IDENTITY_FILE_TYPES)[number];\n\n/** Multi-agent memory scoping configuration (dynamic agent detection) */\nexport type MultiAgentConfig = {\n /** Agent ID of the orchestrator (main agent). Default: \"main\". This agent sees all scopes. */\n orchestratorId: string;\n /** Default storage scope for new facts. Options: \"global\" (backward compatible, default), \"agent\" (specialists auto-scope), \"auto\" (orchestrator→global, specialists→agent). */\n defaultStoreScope: \"global\" | \"agent\" | \"auto\";\n /** When true, throw error if agent detection fails in \"agent\" or \"auto\" scope mode (instead of silently falling back to orchestrator). Default: false. */\n strictAgentScoping?: boolean;\n /**\n * ⚠️ SECURITY: When true, tools can use caller-provided scope params (userId, agentId, sessionId) to access other users' memories.\n * This is UNSAFE in multi-tenant deployments but useful in single-user setups for advanced filtering.\n * Default: false (secure by default — tools only see memories from authenticated context).\n */\n trustToolScopeParams?: boolean;\n};\n\n/** Opt-in persona proposals: agent self-evolution with human approval gate */\nexport type PersonaProposalsConfig = {\n enabled: boolean;\n /** When true, approved proposals are applied automatically without human review (default: false). */\n autoApply: boolean;\n /** Identity files that can be modified via proposals (default: [\"SOUL.md\", \"IDENTITY.md\", \"USER.md\"]) */\n allowedFiles: IdentityFileType[];\n /** Max proposals per week to prevent spam (default: 5) */\n maxProposalsPerWeek: number;\n /** Min confidence score 0-1 for proposals (default: 0.7) */\n minConfidence: number;\n /** Days before proposals auto-expire if not reviewed (default: 30, 0 = never) */\n proposalTTLDays: number;\n /** Require minimum session evidence count (default: 10) */\n minSessionEvidence: number;\n};\n"],"mappings":";;AACA,MAAa,oBAAoB;CAAC;CAAW;CAAY;CAAY;CAAU;;AAI/E,MAAa,sBAAsB;CAAC;CAAW;CAAe;CAAU"}
1
+ {"version":3,"file":"agents.js","names":[],"sources":["../../../config/types/agents.ts"],"sourcesContent":["/** Proposal statuses for persona evolution workflow */\nexport const PROPOSAL_STATUSES = [\"pending\", \"approved\", \"rejected\", \"applied\"] as const;\nexport type ProposalStatus = (typeof PROPOSAL_STATUSES)[number];\n\n/** Identity file types that can be proposed for modification */\nexport const IDENTITY_FILE_TYPES = [\"SOUL.md\", \"IDENTITY.md\", \"USER.md\"] as const;\nexport type IdentityFileType = (typeof IDENTITY_FILE_TYPES)[number];\n\n/** Multi-agent memory scoping configuration (dynamic agent detection) */\nexport type MultiAgentConfig = {\n /** Agent ID of the orchestrator (main agent). Default: \"main\". This agent sees all scopes. */\n orchestratorId: string;\n /** Default storage scope for new facts. Options: \"global\" (backward compatible, default), \"agent\" (specialists auto-scope), \"auto\" (orchestrator→global, specialists→agent). */\n defaultStoreScope: \"global\" | \"agent\" | \"auto\";\n /** When true, throw error if agent detection fails in \"agent\" or \"auto\" scope mode (instead of silently falling back to orchestrator). Default: false. */\n strictAgentScoping?: boolean;\n /**\n * ⚠️ SECURITY: When true, tools can use caller-provided scope params (userId, agentId, sessionId) to access other users' memories.\n * This is UNSAFE in multi-tenant deployments but useful in single-user setups for advanced filtering.\n * Default: false (secure by default — tools only see memories from authenticated context).\n */\n trustToolScopeParams?: boolean;\n};\n\n/** Opt-in persona proposals: agent self-evolution with human approval gate */\nexport type PersonaProposalsConfig = {\n enabled: boolean;\n /** When true, approved proposals are applied automatically without human review (default: false). */\n autoApply: boolean;\n /** Identity files that can be modified via proposals (default: [\"SOUL.md\", \"IDENTITY.md\", \"USER.md\"]) */\n allowedFiles: IdentityFileType[];\n /** Max proposals per week to prevent spam (default: 5) */\n maxProposalsPerWeek: number;\n /** Min confidence score 0-1 for proposals (default: 0.7) */\n minConfidence: number;\n /** Days before proposals auto-expire if not reviewed (default: 30, 0 = never) */\n proposalTTLDays: number;\n /** Require minimum session evidence count (default: 10) */\n minSessionEvidence: number;\n};\n"],"mappings":";;AACA,MAAa,oBAAoB;CAAC;CAAW;CAAY;CAAY;AAAS;;AAI9E,MAAa,sBAAsB;CAAC;CAAW;CAAe;AAAS"}
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.js","names":[],"sources":["../../../config/types/bootstrap.ts"],"sourcesContent":["/** Ordered startup phases used by internal bootstrap and registration manifests. */\nexport const BOOTSTRAP_PHASES = [\"core\", \"optional\"] as const;\n\n/** `core` must succeed before any `optional` subsystem is installed. */\nexport type BootstrapPhase = (typeof BOOTSTRAP_PHASES)[number];\n\n/** Shared manifest metadata for phased bootstrap and tool installers. */\nexport type BootstrapPhaseConfig = {\n bootstrapPhase: BootstrapPhase;\n};\n"],"mappings":";;AACA,MAAa,mBAAmB,CAAC,QAAQ,WAAW"}
1
+ {"version":3,"file":"bootstrap.js","names":[],"sources":["../../../config/types/bootstrap.ts"],"sourcesContent":["/** Ordered startup phases used by internal bootstrap and registration manifests. */\nexport const BOOTSTRAP_PHASES = [\"core\", \"optional\"] as const;\n\n/** `core` must succeed before any `optional` subsystem is installed. */\nexport type BootstrapPhase = (typeof BOOTSTRAP_PHASES)[number];\n\n/** Shared manifest metadata for phased bootstrap and tool installers. */\nexport type BootstrapPhaseConfig = {\n bootstrapPhase: BootstrapPhase;\n};\n"],"mappings":";;AACA,MAAa,mBAAmB,CAAC,QAAQ,UAAU"}
@@ -1 +1 @@
1
- {"version":3,"file":"core.js","names":[],"sources":["../../../config/types/core.ts"],"sourcesContent":["export const DECAY_CLASSES = [\n \"permanent\",\n \"durable\", // ~3 months half-life\n \"normal\", // ~90 days half-life (#1186/#1189: aligned with implicit-feedback trajectory TTL)\n \"short\", // ~2 days half-life\n \"ephemeral\", // ~4 hours half-life\n \"stable\", // legacy: 90 days\n \"active\", // legacy: 14 days\n \"session\", // legacy: 24 hours\n \"checkpoint\", // legacy: 4 hours\n] as const;\nexport type DecayClass = (typeof DECAY_CLASSES)[number];\n\n/** TTL defaults in seconds per decay class. null = never expires. */\nexport const TTL_DEFAULTS: Record<DecayClass, number | null> = {\n permanent: null,\n durable: 90 * 24 * 3600, // ~3 months\n // Issue #1186/#1189: trajectory lessons and other source-/importance-defaulted facts use\n // `normal` and need ~90 days of grace before they expire (was 14 days). Reinforcement on\n // recall keeps useful facts alive; never-recalled facts now actually expire.\n normal: 90 * 24 * 3600, // ~90 days\n short: 2 * 24 * 3600, // 2 days\n ephemeral: 4 * 3600, // 4 hours\n stable: 90 * 24 * 3600, // legacy: 90 days\n active: 14 * 24 * 3600, // legacy: 14 days\n session: 24 * 3600, // legacy: 24 hours\n checkpoint: 4 * 3600, // legacy: 4 hours\n};\n\nexport type StoreDedupeAction = \"skip\" | \"boost\" | \"merge\" | \"store\";\n\n/**\n * Behaviour when a write would exceed `maxPerDay`:\n * - `drop` (legacy default) — reject the new write, increment `daily_writes.dropped`.\n * - `evict-lowest-confidence` — supersede the lowest-confidence active fact for the same\n * source and insert the new one, incrementing `daily_writes.evicted` (#1194). This is the\n * recommended setting for noisy ingest paths (e.g. implicit-feedback) where dropping new\n * evidence in favour of stale facts is the wrong choice.\n */\nexport type StoreOverflowAction = \"drop\" | \"evict-lowest-confidence\";\n\nexport type StoreSourceProfile = {\n vectorThreshold?: number;\n lexicalJaccard?: number;\n maxPerDay?: number;\n onDuplicate?: StoreDedupeAction;\n boostBy?: number;\n /** Strategy applied when `maxPerDay` is exceeded (#1194). Default `drop`. */\n onOverflow?: StoreOverflowAction;\n};\n\n/** Store options: fuzzy dedupe and optional classify-before-write. */\nexport type StoreConfig = {\n fuzzyDedupe: boolean;\n /** Per-source dedupe/quotas; exact keys or glob patterns such as seed:*. */\n sourceProfiles?: Record<string, StoreSourceProfile>;\n /** Fallback source profile when no exact/glob profile matches. */\n defaultProfile?: StoreSourceProfile;\n /** Classify incoming fact against existing similar facts (ADD/UPDATE/DELETE/NOOP) before storing (default: false) */\n classifyBeforeWrite?: boolean;\n /** Model for classification; when unset, runtime uses getDefaultCronModel(cfg, \"nano\") */\n classifyModel?: string;\n};\n\n/** Write-Ahead Log (WAL) configuration for crash resilience */\nexport type WALConfig = {\n /** Enable WAL for crash resilience (default: true) */\n enabled: boolean;\n /** Path to WAL file (default: same directory as SQLite DB) */\n walPath?: string;\n /** Maximum age of WAL entries before they're considered stale (ms, default: 5 minutes) */\n maxAge?: number;\n};\n\n/** Event log archival configuration. */\nexport type EventLogConfig = {\n /** Days before consolidated events are archived (default: 90). */\n archivalDays: number;\n /** Output directory for compressed JSONL archives (default: '~/.openclaw/event-archive'). */\n archivePath: string;\n};\n\n/** Shortest-path traversal configuration (Issue #140). */\nexport type PathConfig = {\n /** Enable memory_path tool (default: true). */\n enabled: boolean;\n /** Hard cap on maxDepth accepted by memory_path (default: 10). */\n maxPathDepth: number;\n};\n\n/**\n * Memory pressure diagnostic snapshot configuration (Issue #1551).\n * When memory pressure crosses a critical threshold, optionally emit a compact diagnostic bundle\n * to distinguish JS heap, native addon memory, SQLite handles, LanceDB/Arrow buffers,\n * and stale plugin generations.\n */\nexport type DiagnosticsConfig = {\n /** Enable memory pressure snapshots on critical threshold (default: false). */\n enabled: boolean;\n /** Write JSON artifact to ~/.openclaw/diagnostics/memory-pressure/ (default: false). */\n writeArtifact: boolean;\n /** Minimum seconds between snapshots (rate-limit cooldown, default: 300). */\n cooldownSec: number;\n /** Include /proc/self/status memory fields on Linux (default: true on Linux). */\n includeLinuxProcMem: boolean;\n /** Max sample paths per FD group in snapshot (default: 5). */\n fdGroupSampleLimit: number;\n};\n"],"mappings":";AAAA,MAAa,gBAAgB;CAC3B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;AAID,MAAa,eAAkD;CAC7D,WAAW;CACX,SAAS,OAAU;CAInB,QAAQ,OAAU;CAClB,OAAO,KAAS;CAChB,WAAW,IAAI;CACf,QAAQ,OAAU;CAClB,QAAQ,MAAU;CAClB,SAAS,KAAK;CACd,YAAY,IAAI;CACjB"}
1
+ {"version":3,"file":"core.js","names":[],"sources":["../../../config/types/core.ts"],"sourcesContent":["export const DECAY_CLASSES = [\n \"permanent\",\n \"durable\", // ~3 months half-life\n \"normal\", // ~90 days half-life (#1186/#1189: aligned with implicit-feedback trajectory TTL)\n \"short\", // ~2 days half-life\n \"ephemeral\", // ~4 hours half-life\n \"stable\", // legacy: 90 days\n \"active\", // legacy: 14 days\n \"session\", // legacy: 24 hours\n \"checkpoint\", // legacy: 4 hours\n] as const;\nexport type DecayClass = (typeof DECAY_CLASSES)[number];\n\n/** TTL defaults in seconds per decay class. null = never expires. */\nexport const TTL_DEFAULTS: Record<DecayClass, number | null> = {\n permanent: null,\n durable: 90 * 24 * 3600, // ~3 months\n // Issue #1186/#1189: trajectory lessons and other source-/importance-defaulted facts use\n // `normal` and need ~90 days of grace before they expire (was 14 days). Reinforcement on\n // recall keeps useful facts alive; never-recalled facts now actually expire.\n normal: 90 * 24 * 3600, // ~90 days\n short: 2 * 24 * 3600, // 2 days\n ephemeral: 4 * 3600, // 4 hours\n stable: 90 * 24 * 3600, // legacy: 90 days\n active: 14 * 24 * 3600, // legacy: 14 days\n session: 24 * 3600, // legacy: 24 hours\n checkpoint: 4 * 3600, // legacy: 4 hours\n};\n\nexport type StoreDedupeAction = \"skip\" | \"boost\" | \"merge\" | \"store\";\n\n/**\n * Behaviour when a write would exceed `maxPerDay`:\n * - `drop` (legacy default) — reject the new write, increment `daily_writes.dropped`.\n * - `evict-lowest-confidence` — supersede the lowest-confidence active fact for the same\n * source and insert the new one, incrementing `daily_writes.evicted` (#1194). This is the\n * recommended setting for noisy ingest paths (e.g. implicit-feedback) where dropping new\n * evidence in favour of stale facts is the wrong choice.\n */\nexport type StoreOverflowAction = \"drop\" | \"evict-lowest-confidence\";\n\nexport type StoreSourceProfile = {\n vectorThreshold?: number;\n lexicalJaccard?: number;\n maxPerDay?: number;\n onDuplicate?: StoreDedupeAction;\n boostBy?: number;\n /** Strategy applied when `maxPerDay` is exceeded (#1194). Default `drop`. */\n onOverflow?: StoreOverflowAction;\n};\n\n/** Store options: fuzzy dedupe and optional classify-before-write. */\nexport type StoreConfig = {\n fuzzyDedupe: boolean;\n /** Per-source dedupe/quotas; exact keys or glob patterns such as seed:*. */\n sourceProfiles?: Record<string, StoreSourceProfile>;\n /** Fallback source profile when no exact/glob profile matches. */\n defaultProfile?: StoreSourceProfile;\n /** Classify incoming fact against existing similar facts (ADD/UPDATE/DELETE/NOOP) before storing (default: false) */\n classifyBeforeWrite?: boolean;\n /** Model for classification; when unset, runtime uses getDefaultCronModel(cfg, \"nano\") */\n classifyModel?: string;\n};\n\n/** Write-Ahead Log (WAL) configuration for crash resilience */\nexport type WALConfig = {\n /** Enable WAL for crash resilience (default: true) */\n enabled: boolean;\n /** Path to WAL file (default: same directory as SQLite DB) */\n walPath?: string;\n /** Maximum age of WAL entries before they're considered stale (ms, default: 5 minutes) */\n maxAge?: number;\n};\n\n/** Event log archival configuration. */\nexport type EventLogConfig = {\n /** Days before consolidated events are archived (default: 90). */\n archivalDays: number;\n /** Output directory for compressed JSONL archives (default: '~/.openclaw/event-archive'). */\n archivePath: string;\n};\n\n/** Shortest-path traversal configuration (Issue #140). */\nexport type PathConfig = {\n /** Enable memory_path tool (default: true). */\n enabled: boolean;\n /** Hard cap on maxDepth accepted by memory_path (default: 10). */\n maxPathDepth: number;\n};\n\n/**\n * Memory pressure diagnostic snapshot configuration (Issue #1551).\n * When memory pressure crosses a critical threshold, optionally emit a compact diagnostic bundle\n * to distinguish JS heap, native addon memory, SQLite handles, LanceDB/Arrow buffers,\n * and stale plugin generations.\n */\nexport type DiagnosticsConfig = {\n /** Enable memory pressure snapshots on critical threshold (default: false). */\n enabled: boolean;\n /** Write JSON artifact to ~/.openclaw/diagnostics/memory-pressure/ (default: false). */\n writeArtifact: boolean;\n /** Minimum seconds between snapshots (rate-limit cooldown, default: 300). */\n cooldownSec: number;\n /** Include /proc/self/status memory fields on Linux (default: true on Linux). */\n includeLinuxProcMem: boolean;\n /** Max sample paths per FD group in snapshot (default: 5). */\n fdGroupSampleLimit: number;\n};\n"],"mappings":";AAAA,MAAa,gBAAgB;CAC3B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AAIA,MAAa,eAAkD;CAC7D,WAAW;CACX,SAAS,OAAU;CAInB,QAAQ,OAAU;CAClB,OAAO,KAAS;CAChB,WAAW,IAAI;CACf,QAAQ,OAAU;CAClB,QAAQ,MAAU;CAClB,SAAS,KAAK;CACd,YAAY,IAAI;AAClB"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../config/types/index.ts"],"sourcesContent":["export * from \"./core.js\";\nexport * from \"./bootstrap.js\";\nexport * from \"./retrieval.js\";\nexport * from \"./capture.js\";\nexport * from \"./maintenance.js\";\nexport * from \"./features.js\";\nexport * from \"./agents.js\";\nexport * from \"./sensors.js\";\n\n// Re-export all types from domain files and define HybridMemoryConfig and other shared types\n\nimport type {\n AutoClassifyConfig,\n AutoRecallConfig,\n ContextualVariantsConfig,\n DocumentGradingConfig,\n QueryExpansionConfig,\n RerankingConfig,\n RetrievalConfig,\n SearchConfig,\n} from \"./retrieval.js\";\n\nimport type { DiagnosticsConfig, EventLogConfig, PathConfig, StoreConfig, WALConfig } from \"./core.js\";\n\nimport type {\n ExtractionConfig,\n IdentityPromotionConfig,\n IdentityReflectionConfig,\n PassiveObserverConfig,\n ProceduresConfig,\n ReflectionConfig,\n} from \"./capture.js\";\n\nimport type {\n HealthConfig,\n MaintenanceConfig,\n NightlyCycleConfig,\n ProvenanceConfig,\n VerificationConfig,\n} from \"./maintenance.js\";\n\nimport type {\n AliasesConfig,\n AmbientConfig,\n ApiTapConfig,\n ClosedLoopConfig,\n ClustersConfig,\n CostTrackingConfig,\n CrossAgentLearningConfig,\n CrystallizationConfig,\n DashboardConfig,\n DigestConfig,\n DocumentsConfig,\n EntityExtractionConfig,\n FrequencyCaptureConfig,\n FrustrationDetectionConfig,\n FutureDateProtectionConfig,\n GapsConfig,\n GraphConfig,\n GraphRetrievalConfig,\n HumanizerConfig,\n ImplicitFeedbackConfig,\n IngestConfig,\n LifecycleAdaptersConfig,\n MemoryTieringConfig,\n ReinforcementConfig,\n SelfExtensionConfig,\n ToolEffectivenessConfig,\n WorkflowTrackingConfig,\n} from \"./features.js\";\n\nimport type { MultiAgentConfig, PersonaProposalsConfig } from \"./agents.js\";\n\nimport type { SensorSweepConfig } from \"./sensors.js\";\n\n/** Tier for cron job model selection: \"default\" = standard, \"heavy\" = larger context/reasoning. */\n/** \"nano\" = ultra-cheap for high-frequency ops (autoClassify, HyDE, classifyBeforeWrite, summarize); falls back to \"default\" when unset. */\n/** \"maintenance\" = dedicated tier for scheduled/manual maintenance commands; falls back to \"default\" when unset. */\nexport type CronModelTier = \"default\" | \"maintenance\" | \"heavy\" | \"nano\";\n\n/**\n * Per-provider API credentials for direct LLM calls (bypasses the gateway agent endpoint).\n * Built-in defaults: google uses distill.apiKey + Gemini OpenAI-compat endpoint; openai uses embedding.apiKey.\n */\nexport type LLMProviderConfig = {\n /** API key for this provider. Overrides built-in defaults (distill.apiKey for google, embedding.apiKey for openai). */\n apiKey?: string;\n /** OpenAI-compatible base URL. Overrides built-in defaults. */\n baseURL?: string;\n};\n\n/** LLM model preference: ordered lists per tier with direct provider API calls. */\nexport type LLMConfig = {\n /** Internal: set to \"gateway\" when auto-derived from agents.defaults.model; undefined when from plugin config. */\n _source?: \"gateway\";\n /**\n * Optional: ordered model list for maintenance/scheduled work — dream cycle, reflection, consolidation helpers.\n * When not set, falls back to the default tier.\n */\n maintenance?: string[];\n /**\n * How maintenance-tier commands (distill when `distill.modelTier=maintenance`, dream-cycle, etc.) build\n * automatic fallback chains (#1226). Unset defaults to `cheap-only` (strip expensive models unless listed in `llm.maintenance`).\n * - `cheap-only`: strip o3 / gpt-5.4+ / gpt-4o / large MiniMax / Opus / Gemini 3 & 2.5 Pro from automatic fallbacks.\n * - `explicit-only`: when `llm.maintenance` is non-empty, do not append `llm.fallbackModel` or `distill.fallbackModels`.\n * - `default` / `allow-heavy`: legacy behaviour — full tier preference + global fallbacks.\n */\n maintenanceFallbackPolicy?: \"default\" | \"cheap-only\" | \"explicit-only\" | \"allow-heavy\";\n /** Ordered preference for default-tier LLM calls (first available wins). */\n default: string[];\n /** Ordered preference for heavy-tier LLM calls (e.g. distill, spawn). */\n heavy: string[];\n /**\n * Optional: ordered model list for nano/ultra-light ops — autoClassify, HyDE, classifyBeforeWrite, auto-recall summarize.\n * These run on every chat message or write, so cheapness matters most.\n * When not set, falls back to the default tier.\n * Ideal models: openai/gpt-4.1-nano, google/gemini-2.5-flash-lite, anthropic/claude-haiku-*.\n */\n nano?: string[];\n /** When true, if all preferred models fail, try the fallback model. */\n fallbackToDefault?: boolean;\n /** When fallbackToDefault is true, this model is tried last. */\n fallbackModel?: string;\n /**\n * Per-provider API config for direct LLM calls.\n * Keys are provider prefixes as they appear in model IDs (e.g. \"google\", \"openai\", \"anthropic\", \"ollama\").\n * Built-in providers (google, openai, ollama) have defaults; others require explicit apiKey + baseURL.\n * Example: { google: { apiKey: \"AIzaSy...\" }, anthropic: { apiKey: \"sk-ant-...\", baseURL: \"https://api.anthropic.com/v1\" } }\n * Ollama example: { ollama: { baseURL: \"http://127.0.0.1:11434/v1\" } }\n */\n providers?: Record<string, LLMProviderConfig | undefined>;\n /**\n * When true and an `ollama/*` model appears in any tier list, automatically start Ollama (`ollama serve`)\n * if it is not already running. Only has effect when Ollama models are configured.\n * Default: false.\n */\n localAutoStart?: boolean;\n /**\n * Provider IDs to exclude from all LLM use (tier lists, verify, etc.).\n * Use when a provider is configured (e.g. in llm.default) but you want hybrid-memory to never use it (e.g. low credits).\n * Example: [\"anthropic\"] — Anthropic models are not tried even if listed in llm.nano/default/heavy.\n */\n disabledProviders?: string[];\n};\n\n/** Minimal plugin config shape for resolving cron job model (no full parse). */\nexport type CronModelConfig = {\n embedding?: { apiKey?: string };\n distill?: { apiKey?: string; defaultModel?: string; fallbackModels?: string[] };\n reflection?: { model?: string };\n /** Optional: when present, use for cron LLM (e.g. Claude). */\n claude?: { apiKey?: string; defaultModel?: string };\n /** Optional: gateway-routed LLM preference lists (issue #87). When set, overrides provider-based resolution. */\n llm?: LLMConfig;\n};\n\n/** Credential types supported by the credentials store */\nexport const CREDENTIAL_TYPES = [\"token\", \"password\", \"api_key\", \"ssh\", \"bearer\", \"other\"] as const;\nexport type CredentialType = (typeof CREDENTIAL_TYPES)[number];\n\n/** Auto-capture configuration for credential scanning from tool call inputs */\nexport type CredentialAutoCaptureConfig = {\n /** Enable scanning of tool call inputs for credential patterns (default: false, opt-in) */\n toolCalls: boolean;\n /**\n * Pattern set to use: \"builtin\" uses the built-in regex set (default: \"builtin\").\n * Custom patterns are not currently supported but reserved for future extension.\n */\n patterns?: \"builtin\";\n /** Emit info-level log on each capture (default: true) */\n logCaptures?: boolean;\n /** When true, only store when a credential pattern matched (reject value-only extraction). Default false. */\n requirePatternMatch?: boolean;\n};\n\n/** Opt-in credentials: structured, encrypted storage for API keys, tokens, etc. */\nexport type CredentialsConfig = {\n enabled: boolean;\n store: \"sqlite\";\n /** Encryption key: \"env:VAR_NAME\" resolves from env, or raw string (not recommended) */\n encryptionKey: string;\n /** When enabled, detect credential patterns in conversation and prompt to store (default false) */\n autoDetect?: boolean;\n /** Auto-capture credentials from tool call inputs (default: disabled) */\n autoCapture?: CredentialAutoCaptureConfig;\n /** Days before expiry to warn (default 7) */\n expiryWarningDays?: number;\n /**\n * When true, include the raw credential value in the plain-text tool `content`.\n * Default: false. Only enable for explicit local debugging — content is commonly\n * persisted in transcripts, logs, and memory-extraction pipelines.\n */\n revealInContent?: boolean;\n};\n\n/** Error reporting configuration for GlitchTip/Sentry integration (opt-in, privacy-first) */\nexport type UpdateNudgeConfig = {\n /** Emit upgrade reminders for outdated installs (default: true). */\n enabled: boolean;\n /** Minimum hours between repeated upgrade reminders (default: 24). */\n intervalHours: number;\n /** How long cached latest-version results stay fresh (default: 24). */\n cacheTtlHours: number;\n};\n\n/** Error reporting configuration for GlitchTip/Sentry integration (opt-in, privacy-first) */\nexport type ErrorReportingConfig = {\n enabled: boolean;\n /** DSN for self-hosted mode. Not required in schema (only at runtime for self-hosted). */\n dsn?: string;\n consent: boolean;\n /** \"community\" (default): use hardcoded community DSN. \"self-hosted\": require custom DSN. */\n mode: \"community\" | \"self-hosted\";\n environment?: string;\n sampleRate?: number;\n /** Opt-in: Only sent when explicitly configured. Not sent by default for privacy.\n * Optional UUID identifying this bot instance; sent as tag so GlitchTip can group errors by bot. */\n botId?: string;\n /** Opt-in: Only sent when explicitly configured. Not sent by default for privacy.\n * Optional friendly name for this bot; sent as tag for readable reports. */\n botName?: string;\n /**\n * Optional map of error fingerprints to the version that fixed them.\n * Errors matching a fingerprint from an older version are silently dropped (not regressions).\n * Format: { \"ErrorType:message prefix (first 100 chars)\": \"YYYY.M.NNN\" }\n * When not configured, behavior is identical to today.\n */\n resolvedIssues?: Record<string, string>;\n /** Background latest-version check plus user-facing upgrade reminders. */\n updateNudge: UpdateNudgeConfig;\n};\n\n/** Configuration for a single embedding model in a multi-model setup (Issue #158). */\nexport interface EmbeddingModelConfig {\n /** Model identifier (e.g. \"nomic-embed-text\", \"text-embedding-3-small\"). */\n name: string;\n /** Provider for this model. */\n provider: \"openai\" | \"ollama\" | \"onnx\";\n /** Vector dimensions this model produces. */\n dimensions: number;\n /** Semantic role this model plays. */\n role: \"general\" | \"domain\" | \"query\" | \"custom\";\n /** API key for openai provider (overrides embedding.apiKey). */\n apiKey?: string;\n /** Endpoint for ollama provider (overrides embedding.endpoint). */\n endpoint?: string;\n /** Whether this model is active (default: true). */\n enabled?: boolean;\n}\n\n/** Configuration for LanceDB vector store behaviour (issue #128). */\nexport type VectorConfig = {\n /**\n * When true, automatically drop and recreate the LanceDB table if its vector dimension\n * doesn't match the configured embedding model dimension.\n * After repair, existing facts from SQLite are re-embedded automatically.\n * Default: false (log the mismatch and return empty results instead of throwing).\n */\n autoRepair: boolean;\n};\n\n/** Optional heartbeat / long-running hints for ACTIVE-TASKS.md rows (not goals). */\nexport type ActiveTaskLongRunningRegistrationMode = \"off\" | \"suggest\" | \"confirm\" | \"auto_main_private\";\n\n/** Policy for long-running external workflows detected from user requests. */\nexport type ActiveTaskLongRunningRegistrationConfig = {\n /**\n * `off`: do nothing.\n * `suggest`: prepend a suggested active-task payload.\n * `confirm`: prepend a guard requiring explicit task registration/confirmation first.\n * `auto_main_private`: auto-create a task in main/private sessions; otherwise suggest.\n */\n mode: ActiveTaskLongRunningRegistrationMode;\n};\n\nexport type ActiveTaskHygieneConfig = {\n /**\n * When the last user message matches goal stewardship heartbeat patterns,\n * prepend an extra **task hygiene** block (stale counts, review nudge). Default: true.\n */\n heartbeatEscalation: boolean;\n /**\n * If > 0, tasks whose **updated** timestamp is older than this many **days**\n * get a line suggesting `active_task_propose_goal` + `goal_register`. Default: 0 (off).\n */\n suggestGoalAfterTaskAgeDays: number;\n /** Character budget for the heartbeat task-hygiene block. Default: 2500. */\n heartbeatNudgeMaxChars: number;\n /** Guard/auto-proposal policy for long-running external workflows (default: suggest). */\n longRunningRegistration?: ActiveTaskLongRunningRegistrationConfig;\n};\n\nexport type ActiveTaskProjectionDedupeBy = \"none\" | \"label\" | \"normalizedTitle\";\n\n/** Facts-backed `ACTIVE-TASKS.md` projection (`hybrid-mem active-tasks render`). See docs/ACTIVE-TASKS-PROJECTION.md. */\nexport type ActiveTaskProjectionConfig = {\n /**\n * `readable` applies filters and optional caps (default).\n * `full` lists all rows (no title/dedupe filters); caps still apply when `maxRowsPerSection` is set.\n */\n mode: \"readable\" | \"full\";\n /** Drop rows whose title resolves to the generic placeholder when `mode` is `readable` (default: true). */\n excludeGenericTitle: boolean;\n /** Minimum trimmed title length when > 0 (`readable` only). */\n titleMinChars: number;\n dedupeBy: ActiveTaskProjectionDedupeBy;\n /** Cap per section (Active, Stale — revisit, Completed); omitted rows summarized in a footer line. */\n maxRowsPerSection?: number;\n /** Use sectioned layout (Active / Stale — revisit) for facts render (default: true). */\n sectioned: boolean;\n};\n\n/** Active task working memory: ACTIVE-TASKS.md persistence and session injection */\nexport type ActiveTaskConfig = {\n /** Enable active task working memory (default: true) */\n enabled: boolean;\n /**\n * Where the task ledger lives: `markdown` reads/writes ACTIVE-TASKS.md.\n * `facts` uses hybrid-memory `category:project` facts (memory_store compatible).\n * Default: markdown.\n */\n ledger: \"markdown\" | \"facts\";\n /** Path to ACTIVE-TASKS.md (default: \"ACTIVE-TASKS.md\" in workspace root) */\n filePath: string;\n /** Auto-write task entries on subagent spawn/complete events (default: true) */\n autoCheckpoint: boolean;\n /**\n * Max tokens for session-start injection (default: 500).\n * Config must be a positive integer; fractional values are floored; non-positive values are not used (default applies).\n */\n injectionBudget: number;\n /**\n * Optional cap on active rows considered for injection after projection filters and sorting.\n * When unset, `projection.maxRowsPerSection` applies if set; otherwise no count cap (token budget still applies).\n */\n injectionMaxTasks?: number;\n /**\n * Duration before flagging a task as stale. Supports human-friendly strings:\n * \"24h\", \"1d\", \"1d12h30m\", \"45m\", or a plain integer (treated as minutes).\n * Default: \"24h\".\n *\n * Legacy `staleHours: number` is automatically converted on config load.\n */\n staleThreshold: string;\n /** Flush task summary to memory/YYYY-MM-DD.md on completion (default: true) */\n flushOnComplete: boolean;\n /** Stale-task warning injection at session start */\n staleWarning: {\n /** Inject stale task warnings into context on before_agent_start (default: true) */\n enabled: boolean;\n };\n /**\n * Stronger nudges for normal tasks (docs/TASK-HYGIENE.md): heartbeat escalation,\n * optional “consider a goal” hints for long-running tasks.\n */\n taskHygiene: ActiveTaskHygieneConfig;\n /** Markdown projection when `ledger` is `facts` (render path, filters, sectioning). */\n projection: ActiveTaskProjectionConfig;\n /**\n * Live-state reconciliation: periodic GitHub API/CLI checks to mark tasks done when external PRs/issues close.\n * Requires explicit opt-in (default: false) due to external network calls.\n */\n liveStateReconcile: {\n /** Enable live-state reconciliation (default: false). Requires activeTask.enabled and ledger: facts. */\n enabled: boolean;\n };\n};\n\n/** Goal stewardship — autonomous pursuit of long-running goals (docs/GOAL-STEWARDSHIP-DESIGN.md). */\nexport type GoalStewardshipDefaults = {\n maxDispatches: number;\n maxAssessments: number;\n cooldownMinutes: number;\n escalateAfterFailures: number;\n priority: \"critical\" | \"high\" | \"normal\" | \"low\";\n};\n\nexport type GoalStewardshipGlobalLimits = {\n maxDispatchesPerHour: number;\n maxActiveGoals: number;\n};\n\n/** Optional knobs for cross-feature escalation visibility (defaults preserve prior behavior). */\nexport type GoalStewardshipEscalationPolicy = {\n /**\n * When heartbeat matches and task hygiene runs, append a **goal-escalation** snippet if any goal is **blocked** or **stalled**.\n * Default: true.\n */\n taskHygieneOnBlockedGoals: boolean;\n};\n\n/** Trip goals stuck with unchanged blockers / no progress; escalate to human with summary (see docs/GOAL-STEWARDSHIP-OPERATOR.md). */\nexport type GoalStewardshipCircuitBreakerConfig = {\n enabled: boolean;\n /** Consecutive assessments with the same blocker fingerprint before blocking (default: 0 = off). */\n sameBlockerRepeatLimit: number;\n /** Block when (assessmentCount - last progress assessment count) reaches this; 0 = off (default: 0). */\n maxAssessmentsWithoutProgress: number;\n /** Build human-readable summary for history / memory (default: true). */\n composeHumanSummary: boolean;\n /** Append escalation to workspace memory/YYYY-MM-DD.md when composeHumanSummary (default: true). */\n appendMemoryEscalation: boolean;\n};\n\n/** Relative weights for multi-goal stewardship attention (default: critical 4, high 2, normal 1, low 0.5). */\nexport type GoalStewardshipAttentionWeights = {\n critical: number;\n high: number;\n normal: number;\n low: number;\n};\n\n/** Which goal priorities require explicit `confirmed: true` on goal_register. */\nexport type GoalStewardshipConfirmationPolicy = {\n requireRegisterAckForPriorities: Array<\"critical\" | \"high\" | \"normal\" | \"low\">;\n};\n\nexport type GoalStewardshipConfig = {\n enabled: boolean;\n goalsDir: string;\n model: string | null;\n heartbeatStewardship: boolean;\n watchdogHealthCheck: boolean;\n defaults: GoalStewardshipDefaults;\n globalLimits: GoalStewardshipGlobalLimits;\n /**\n * Regex sources for heartbeat detection. Empty = built-in defaults (`heartbeat` and common variants).\n */\n heartbeatPatterns: string[];\n attentionWeights: GoalStewardshipAttentionWeights;\n /** Combined cap (characters) for multi-goal stewardship prepend blocks in one heartbeat. */\n multiGoalMaxChars: number;\n /** Max goals to include in one heartbeat after weighting. */\n multiGoalMaxGoals: number;\n /** On heartbeat, rewrite ACTIVE-TASKS.md with a Goals mirror section (requires activeTask.enabled). */\n heartbeatRefreshActiveTask: boolean;\n confirmationPolicy: GoalStewardshipConfirmationPolicy;\n /**\n * When true, call a nano-tier LLM once per heartbeat to refine triage. When false, heuristics only.\n */\n llmTriageOnHeartbeat: boolean;\n /** When triage/heuristic indicates complex work, add a line suggesting heavy-tier reasoning for dispatch. */\n triageSuggestHeavyDirective: boolean;\n circuitBreaker: GoalStewardshipCircuitBreakerConfig;\n /** Cross-layer nudges and visibility (issue #1096). */\n escalationPolicy: GoalStewardshipEscalationPolicy;\n /** Allow command_exit_zero verification in the watchdog (shell execution). Default: false. */\n allowCommandVerification: boolean;\n /** Allow pr_merged verification (GitHub API). Default: false — network + token required. */\n allowPrVerification: boolean;\n};\n\n/** Self-correction pipeline: semantic dedup, TOOLS.md sectioning, auto-rewrite vs approve */\nexport type SelfCorrectionConfig = {\n /** Enable self-correction pipeline (default: true). */\n enabled?: boolean;\n /** Use embedding similarity to skip near-duplicate facts before MEMORY_STORE (default: true). */\n semanticDedup: boolean;\n /** Similarity threshold for semantic dedup, 0–1 (default: 0.92). */\n semanticDedupThreshold: number;\n /** TOOLS.md section heading for new rules, e.g. \"Self-correction rules\" (default: \"Self-correction rules\"). */\n toolsSection: string;\n /** When true (default), insert suggested TOOLS rules under toolsSection. Set false to only suggest in report (then use --approve to apply). */\n applyToolsByDefault: boolean;\n /** When true, LLM rewrites TOOLS.md to integrate new rules (no duplicates/contradictions). When false, use section insert (or suggest if applyToolsByDefault is false) (default: false). */\n autoRewriteTools: boolean;\n /** When true and incident count > spawnThreshold, run Phase 2 via `openclaw sessions spawn --model <model>` for large context. Model is chosen from config (Gemini/OpenAI/Claude) when spawnModel is empty (default: false). */\n analyzeViaSpawn: boolean;\n /** Use spawn for Phase 2 when incidents exceed this count (default: 15). */\n spawnThreshold: number;\n /** Model for spawn when analyzeViaSpawn is true. Empty = use provider default from config (see getDefaultCronModel). */\n spawnModel: string;\n /** TOOLS.md section heading for positive reinforcement rules (default: \"Positive Reinforcement Rules\"). */\n positiveRulesSection?: string;\n /** When true, run LLM analysis on reinforcement incidents (default: true). */\n reinforcementLLMAnalysis?: boolean;\n /** When true, reinforcement analysis may create proposals in the proposals DB (default: true). */\n reinforcementToProposals?: boolean;\n /** When true, self-correction AGENTS_RULE remediations are written to proposals DB (default: true). */\n agentsRuleToProposals?: boolean;\n};\n\n/**\n * Gateway authentication configuration.\n * The token field accepts a SecretRef for safe storage:\n * - \"env:VAR_NAME\" — resolve from process.env[VAR_NAME] at startup\n * - \"file:/path\" — read from a file at startup (whitespace-trimmed)\n * - plain string — used as-is (not recommended; token will be in config)\n * When set, takes priority over the OPENCLAW_GATEWAY_TOKEN environment variable.\n */\nexport type GatewayAuthConfig = {\n /**\n * Auth token for the OpenClaw gateway.\n * Use a SecretRef so the plaintext token is never stored in config files:\n * \"env:OPENCLAW_GATEWAY_TOKEN\" or \"file:/run/secrets/gateway-token\"\n */\n token?: string;\n};\n\n/**\n * @internal Runtime representation of GatewayAuthConfig after SecretRef resolution.\n * `_resolvedToken` holds the actual token value; it is stored as a non-enumerable\n * property so it never appears in JSON.stringify or config dumps.\n */\nexport type ResolvedGatewayAuthConfig = GatewayAuthConfig & {\n readonly _resolvedToken?: string;\n};\n\nexport type GatewayConfig = {\n auth?: ResolvedGatewayAuthConfig;\n};\n\n/**\n * Per-provider auth profile ordering for OAuth-first LLM authentication.\n * When configured, OAuth profiles are tried before API keys (first eligible wins).\n * Requires the OpenClaw gateway (OPENCLAW_GATEWAY_PORT) to be running for OAuth routing.\n *\n * Example:\n * auth:\n * order:\n * anthropic: ['anthropic:claude-cli', 'anthropic:api'] # OAuth first, API key fallback\n * openai: ['openai-codex', 'openai:api'] # OAuth first, API key fallback\n * google: ['google-gemini-cli', 'google:default'] # OAuth first, API key fallback\n *\n * Supported OAuth/token profiles (must be set up via `openclaw configure`):\n * - anthropic:claude-cli — Claude Code CLI OAuth\n * - openai-codex — OpenAI Codex OAuth\n * - github-copilot — GitHub Copilot token (device code flow)\n * - google-gemini-cli — Gemini CLI OAuth\n * - google-vertex — Google Vertex AI OAuth\n * - qwen-portal:qwen-cli — Qwen Code CLI OAuth\n * - minimax-portal:minimax-cli — MiniMax CLI OAuth\n */\nexport type AuthOrderConfig = {\n /**\n * Per-provider ordered list of auth profile IDs.\n * First eligible profile wins; falls through on missing/expired OAuth token.\n * Keys are provider prefixes (e.g. \"anthropic\", \"openai\", \"google\").\n * Always populated when an AuthOrderConfig is present (parseAuthConfig never returns {}).\n */\n order: Record<string, string[]>;\n /**\n * When a provider has both OAuth and an API key, prefer OAuth (default: true).\n * On OAuth failure the plugin records backoff and uses the API key until backoff expires.\n */\n preferOAuthWhenBoth?: boolean;\n /**\n * Backoff delays in minutes after each OAuth failure before trying OAuth again.\n * Default: [5, 30, 60, 120, 240] (5min → 30min → 1h → 2h → 4h).\n */\n backoffScheduleMinutes?: number[];\n /**\n * Reset backoff levels after this many hours so OAuth is tried again from level 0.\n * Default: 24.\n */\n resetBackoffAfterHours?: number;\n};\n\n/** Configuration mode presets. See docs/CONFIGURATION-MODES.md. */\nexport type ConfigMode = \"local\" | \"minimal\" | \"enhanced\" | \"complete\";\n\n/**\n * Output verbosity level for CLI commands and tool responses.\n * - silent: no unsolicited output — suppresses capability hints, relevant-memories,\n * relevant-procedures, and credential-hint blocks. Memory tools remain fully functional.\n * Ideal for users who want the plugin to work silently in the background.\n * - quiet: minimal output — counts/totals only, no decorative headers or config echo.\n * Ideal for scripted/cron use and low-noise deployments (default for local mode).\n * - normal: current default behaviour — balanced output with key details.\n * - verbose: extra detail — full breakdowns, all fields, config summaries.\n * Ideal for debugging and interactive sessions (default for complete mode).\n */\nexport type VerbosityLevel = \"silent\" | \"quiet\" | \"normal\" | \"verbose\";\n\nexport type MemoryCategory = string;\n\nexport type HybridMemoryConfig = {\n embedding: {\n provider: \"openai\" | \"ollama\" | \"onnx\" | \"google\";\n model: string;\n /** Required for openai provider; optional for ollama/onnx. */\n apiKey?: string;\n /** Optional ordered preference list (openai gateway fallback). First model defines vector dimension; all must have same dimension. */\n models?: string[];\n /** Vector dimensions for this model (required for ollama/onnx; auto-resolved for known openai models). */\n dimensions: number;\n /** Azure OpenAI: embedding deployment name (must match Azure Portal). When set, used as the API model id; `model` still resolves dimensions. */\n deployment?: string;\n /** Ollama endpoint URL (default: http://localhost:11434). Only used when provider='ollama'. */\n endpoint?: string;\n /** Number of texts to embed per batch call (default: 50). */\n batchSize: number;\n /**\n * Ordered list of embedding providers to try (failover). First working wins.\n * When unset, inferred from llm config (ollama if llm.nano/default/heavy contains \"ollama/\", openai if apiKey set, google if distill.apiKey or llm.providers.google set); default [\"ollama\", \"openai\"] when both possible so Ollama acts as a tier.\n */\n preferredProviders?: (\"ollama\" | \"openai\" | \"google\")[];\n /** Resolved by parser from distill.apiKey or llm.providers.google.apiKey when preferredProviders includes \"google\". Not set by user. */\n googleApiKey?: string;\n /**\n * Additional embedding models for multi-model support (Issue #158).\n * When non-empty, facts are embedded with all models and stored in the fact_embeddings table.\n * At retrieval time, all model indices are queried and results are merged via RRF.\n * When empty/undefined, the system works in single-model mode (backward compatible).\n */\n multiModels?: EmbeddingModelConfig[];\n /**\n * When `true`, automatically re-generate embeddings for all facts whenever the\n * embedding model or provider changes on startup (Issue #153).\n * Default: `false` — changes are logged but no re-embedding is performed automatically.\n * Enable when switching models to avoid stale vectors causing poor search quality.\n */\n autoMigrate?: boolean;\n };\n lanceDbPath: string;\n sqlitePath: string;\n autoCapture: boolean;\n autoRecall: AutoRecallConfig;\n /** Max characters per captured/stored fact (filter and truncation). Default 5000. */\n captureMaxChars: number;\n categories: string[];\n autoClassify: AutoClassifyConfig;\n /** Store options (2.3): fuzzyDedupe = skip store when normalized text matches existing. */\n store: StoreConfig;\n /** Opt-in credential management: structured, encrypted storage (default: disabled) */\n credentials: CredentialsConfig;\n /** Graph-based spreading activation: auto-linking and graph traversal */\n graph: GraphConfig;\n /** Entity extraction hygiene: suppress common-noun pseudo-entities (#1190). */\n entityExtraction: EntityExtractionConfig;\n /** Write-Ahead Log for crash resilience (default: enabled) */\n wal: WALConfig;\n /** Memory pressure diagnostic snapshots — Issue #1551 (default: disabled). */\n diagnostics: DiagnosticsConfig;\n /** Event log archival configuration. */\n eventLog: EventLogConfig;\n /** Opt-in persona proposals: agent self-evolution with human approval (default: disabled) */\n personaProposals: PersonaProposalsConfig;\n /** Passive observer — background fact extraction from session transcripts (default: disabled) */\n passiveObserver: PassiveObserverConfig;\n /** Reflection layer — synthesize behavioral patterns from facts (default: disabled) */\n reflection: ReflectionConfig;\n /** Identity reflection layer — synthesize persona-level insights from reflection outputs (default: disabled) */\n identityReflection: IdentityReflectionConfig;\n /** Promotion pipeline — cluster repeated durable identity reflections into stable persona state. */\n identityPromotion: IdentityPromotionConfig;\n /** Procedural memory — procedure tagging and auto-skills (default: enabled) */\n procedures: ProceduresConfig;\n /** Multi-pass extraction with LLM verification (Issue #166, default: disabled). */\n extraction: ExtractionConfig;\n /** Dynamic memory tiering — hot/warm/cold (default: enabled) */\n memoryTiering: MemoryTieringConfig;\n /** Optional: LLM preference lists and per-provider API config for direct chat calls (issue #87). */\n llm?: LLMConfig;\n /**\n * Optional: OAuth-first auth profile ordering per provider (issue #311).\n * When set, providers with OAuth profiles route through the OpenClaw gateway instead of direct API keys.\n * Falls back to API keys when gateway is unavailable or OAuth token is missing/expired.\n */\n auth?: AuthOrderConfig;\n /** Optional: Gemini for distill (1M context). apiKey/defaultModel deprecated in favor of llm + gateway. */\n distill?: {\n apiKey?: string;\n defaultModel?: string;\n /** Fallback models to try if primary model fails after retries (optional). Deprecated: use llm.default/heavy. */\n fallbackModels?: string[];\n /** Enable directive extraction from sessions (default: true). */\n extractDirectives?: boolean;\n /** Enable reinforcement extraction from sessions (default: true). */\n extractReinforcement?: boolean;\n /** Reinforcement boost added to facts search score (default: 0.1). */\n reinforcementBoost?: number;\n /** Phase 2: Reinforcement boost added to procedures search score (default: 0.1). */\n reinforcementProcedureBoost?: number;\n /** Phase 2: Number of reinforcements to trigger auto-promotion of procedures (default: 2). */\n reinforcementPromotionThreshold?: number;\n /** Model tier for main session distill pass. \"maintenance\" is the safe default; \"heavy\" is opt-in. */\n modelTier?: \"nano\" | \"maintenance\" | \"default\" | \"heavy\";\n /** Model tier for extraction pipeline (extract-reinforcement LLM analysis). \"nano\" saves cost; \"maintenance\" isolates from llm.default; unset defaults to \"nano\". */\n extractionModelTier?: \"nano\" | \"maintenance\" | \"default\" | \"heavy\";\n };\n /** Auto-build multilingual keywords from memory (default: enabled). Run at first startup if no file, then weekly. */\n languageKeywords: { autoBuild: boolean; weeklyIntervalDays: number };\n /** Optional: ingest workspace markdown files as facts (skills, TOOLS.md, etc.) */\n ingest?: IngestConfig;\n /** Optional: search tweaks (HyDE query expansion) */\n search?: SearchConfig;\n /** Multi-strategy RRF retrieval pipeline configuration (Issue #152). */\n retrieval: RetrievalConfig;\n /** Optional: self-correction analysis — semantic dedup, TOOLS sectioning, auto-rewrite, spawn */\n selfCorrection?: SelfCorrectionConfig;\n /** Multi-agent memory scoping — dynamic agent detection and scope defaults (default: orchestratorId=\"main\", defaultStoreScope=\"global\") */\n multiAgent: MultiAgentConfig;\n /** Error reporting to GlitchTip/Sentry (opt-out, default: enabled with community DSN). Set enabled: false or consent: false to opt out. */\n errorReporting: ErrorReportingConfig;\n /** Active task working memory — ACTIVE-TASKS.md persistence and session injection (default: enabled) */\n activeTask: ActiveTaskConfig;\n /** Goal stewardship — autonomous long-running goals (default: disabled). */\n goalStewardship: GoalStewardshipConfig;\n /** Vector store configuration (LanceDB schema validation and auto-repair, issue #128). */\n vector: VectorConfig;\n /** Enhanced ambient retrieval with multi-query generation (Issue #156, default: disabled). */\n ambient: AmbientConfig;\n /** GraphRAG retrieval: semantic search + graph expansion (Issue #145, default: enabled, defaultExpand: false). */\n graphRetrieval: GraphRetrievalConfig;\n /** Future-date decay freeze protection (#144). Enabled by default. */\n futureDateProtection: FutureDateProtectionConfig;\n /** Maintenance tasks: monthly review, consolidation, etc. */\n maintenance: MaintenanceConfig;\n /** Nightly dream cycle: automated prune → consolidate → reflect (Issue #143, default: disabled). */\n nightlyCycle: NightlyCycleConfig;\n /** Confidence reinforcement on repeated mentions (Issue #147, default: enabled). */\n reinforcement: ReinforcementConfig;\n /** Topic cluster detection: BFS connected-component analysis on memory_links (Issue #146). */\n clusters: ClustersConfig;\n /** Memory health dashboard (Issue #148, default: enabled). */\n health: HealthConfig;\n /** Knowledge gap analysis — orphan/weak detection and suggested links (Issue #141, default: enabled). */\n gaps: GapsConfig;\n /** Multi-hook retrieval aliases: generate and index alternative phrasings per fact (Issue #149, default: disabled). */\n aliases: AliasesConfig;\n /** Shortest-path traversal between memories via BFS (Issue #140, default: enabled). */\n path: PathConfig;\n /** Document ingestion via MarkItDown Python bridge (Issue #206, default: disabled). */\n documents: DocumentsConfig;\n /** Workflow tracking: tool-sequence capture and pattern learning (Issue #209, default: disabled). */\n workflowTracking: WorkflowTrackingConfig;\n /** Workflow crystallization: auto-generate AgentSkill SKILL.md files from repeated patterns (Issue #208, default: disabled). */\n crystallization: CrystallizationConfig;\n /** Plugin self-extension: generate tool proposals from usage-pattern gaps (Issue #210, default: disabled). */\n selfExtension: SelfExtensionConfig;\n /**\n * Top-level alias for implicitFeedback.trajectoryLLMAnalysis (Issue #754).\n * When set, takes precedence over implicitFeedback.trajectoryLLMAnalysis.\n * The nested key is still supported with a deprecation warning.\n */\n trajectoryLLMAnalysis?: boolean;\n /**\n * Top-level alias for implicitFeedback.feedToSelfCorrection (Issue #754).\n * When set, takes precedence over implicitFeedback.feedToSelfCorrection.\n * The nested key is still supported with a deprecation warning.\n */\n feedToSelfCorrection?: boolean;\n /**\n * Top-level alias for distill.extractReinforcement (Issue #754).\n * When set, takes precedence over distill.extractReinforcement.\n * The nested key is still supported with a deprecation warning.\n */\n extractReinforcement?: boolean;\n /** Implicit feedback detection from behavioral conversation signals (Issue #262, default: enabled). */\n implicitFeedback: ImplicitFeedbackConfig;\n /** Closed-loop rule effectiveness measurement (Issue #262, default: enabled). */\n closedLoop: ClosedLoopConfig;\n /** Real-time frustration detection from conversation signals (Issue #263, default: enabled). */\n frustrationDetection: FrustrationDetectionConfig;\n /** Cross-agent lesson generalisation — promote agent-scoped lessons to global (Issue #263, default: disabled). */\n crossAgentLearning: CrossAgentLearningConfig;\n /** Tool effectiveness scoring from workflow traces (Issue #263, default: enabled). */\n toolEffectiveness: ToolEffectivenessConfig;\n /** Contextual variant generation at index time (Issue #159, default: disabled). */\n contextualVariants: ContextualVariantsConfig;\n /** Query expansion via LLM at retrieval time (Issue #160, default: disabled). */\n queryExpansion: QueryExpansionConfig;\n /** LLM re-ranking of RRF fusion results (Issue #161, default: disabled). */\n reranking: RerankingConfig;\n /** Adaptive document grading and query rewriting for retrieval quality (default: disabled). */\n documentGrading: DocumentGradingConfig;\n /** Verification store for critical facts (Issue #162, default: disabled). */\n verification: VerificationConfig;\n /** Provenance tracing for fact-to-source chains (Issue #163, default: disabled). */\n provenance: ProvenanceConfig;\n /** LLM cost tracking — per-feature token usage and estimated cost (Issue #270, default: enabled). */\n costTracking: CostTrackingConfig;\n /** Mission Control dashboard HTTP server (Issue #309, default: enabled on port 7700). */\n dashboard: DashboardConfig;\n /** Sensor sweep — cron-based data collection writing to Event Bus, no LLM (Issue #236, default: disabled). */\n sensorSweep: SensorSweepConfig;\n /** ApiTap integration — intercept browser traffic to auto-generate API skill specs (Issue #614, default: disabled). */\n apiTap: ApiTapConfig;\n /** Humanizer style scoring — quality-loop metric for detecting AI-writing patterns (Issue #616, default: disabled). */\n humanizer: HumanizerConfig;\n /** Weekly digest delivery for cron + operator review (Issue #1197). */\n digest: DigestConfig;\n /** Entity lifecycle adapters — GitHub Phase 2 stub (Issue #1196). */\n lifecycle: LifecycleAdaptersConfig;\n /** Frequency-based auto-save: capture repeated references including credentials to vault (Issue #784, default: disabled). */\n frequencyCapture: FrequencyCaptureConfig;\n /**\n * Output verbosity level for CLI commands and tool responses (Issue #282).\n * quiet: counts/totals only. normal: balanced default. verbose: full detail.\n * Defaults: local→quiet, minimal→normal, enhanced→normal, complete→verbose.\n */\n verbosity: VerbosityLevel;\n /** Set when user specified a mode in config; used by verify to show \"Mode: Normal\" etc. */\n mode?: ConfigMode | \"custom\";\n /**\n * Gateway connection settings. Token supports SecretRef:\n * \"env:VAR_NAME\" or \"file:/path/to/file\"\n * Overrides the OPENCLAW_GATEWAY_TOKEN environment variable when set.\n */\n gateway?: GatewayConfig;\n};\n"],"mappings":";;;;;AA6JA,MAAa,mBAAmB;CAAC;CAAS;CAAY;CAAW;CAAO;CAAU;CAAQ"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../config/types/index.ts"],"sourcesContent":["export * from \"./core.js\";\nexport * from \"./bootstrap.js\";\nexport * from \"./retrieval.js\";\nexport * from \"./capture.js\";\nexport * from \"./maintenance.js\";\nexport * from \"./features.js\";\nexport * from \"./agents.js\";\nexport * from \"./sensors.js\";\n\n// Re-export all types from domain files and define HybridMemoryConfig and other shared types\n\nimport type {\n AutoClassifyConfig,\n AutoRecallConfig,\n ContextualVariantsConfig,\n DocumentGradingConfig,\n QueryExpansionConfig,\n RerankingConfig,\n RetrievalConfig,\n SearchConfig,\n} from \"./retrieval.js\";\n\nimport type { DiagnosticsConfig, EventLogConfig, PathConfig, StoreConfig, WALConfig } from \"./core.js\";\n\nimport type {\n ExtractionConfig,\n IdentityPromotionConfig,\n IdentityReflectionConfig,\n PassiveObserverConfig,\n ProceduresConfig,\n ReflectionConfig,\n} from \"./capture.js\";\n\nimport type {\n HealthConfig,\n MaintenanceConfig,\n NightlyCycleConfig,\n ProvenanceConfig,\n VerificationConfig,\n} from \"./maintenance.js\";\n\nimport type {\n AliasesConfig,\n AmbientConfig,\n ApiTapConfig,\n ClosedLoopConfig,\n ClustersConfig,\n CostTrackingConfig,\n CrossAgentLearningConfig,\n CrystallizationConfig,\n DashboardConfig,\n DigestConfig,\n DocumentsConfig,\n EntityExtractionConfig,\n FrequencyCaptureConfig,\n FrustrationDetectionConfig,\n FutureDateProtectionConfig,\n GapsConfig,\n GraphConfig,\n GraphRetrievalConfig,\n HumanizerConfig,\n ImplicitFeedbackConfig,\n IngestConfig,\n LifecycleAdaptersConfig,\n MemoryTieringConfig,\n ReinforcementConfig,\n SelfExtensionConfig,\n ToolEffectivenessConfig,\n WorkflowTrackingConfig,\n} from \"./features.js\";\n\nimport type { MultiAgentConfig, PersonaProposalsConfig } from \"./agents.js\";\n\nimport type { SensorSweepConfig } from \"./sensors.js\";\n\n/** Tier for cron job model selection: \"default\" = standard, \"heavy\" = larger context/reasoning. */\n/** \"nano\" = ultra-cheap for high-frequency ops (autoClassify, HyDE, classifyBeforeWrite, summarize); falls back to \"default\" when unset. */\n/** \"maintenance\" = dedicated tier for scheduled/manual maintenance commands; falls back to \"default\" when unset. */\nexport type CronModelTier = \"default\" | \"maintenance\" | \"heavy\" | \"nano\";\n\n/**\n * Per-provider API credentials for direct LLM calls (bypasses the gateway agent endpoint).\n * Built-in defaults: google uses distill.apiKey + Gemini OpenAI-compat endpoint; openai uses embedding.apiKey.\n */\nexport type LLMProviderConfig = {\n /** API key for this provider. Overrides built-in defaults (distill.apiKey for google, embedding.apiKey for openai). */\n apiKey?: string;\n /** OpenAI-compatible base URL. Overrides built-in defaults. */\n baseURL?: string;\n};\n\n/** LLM model preference: ordered lists per tier with direct provider API calls. */\nexport type LLMConfig = {\n /** Internal: set to \"gateway\" when auto-derived from agents.defaults.model; undefined when from plugin config. */\n _source?: \"gateway\";\n /**\n * Optional: ordered model list for maintenance/scheduled work — dream cycle, reflection, consolidation helpers.\n * When not set, falls back to the default tier.\n */\n maintenance?: string[];\n /**\n * How maintenance-tier commands (distill when `distill.modelTier=maintenance`, dream-cycle, etc.) build\n * automatic fallback chains (#1226). Unset defaults to `cheap-only` (strip expensive models unless listed in `llm.maintenance`).\n * - `cheap-only`: strip o3 / gpt-5.4+ / gpt-4o / large MiniMax / Opus / Gemini 3 & 2.5 Pro from automatic fallbacks.\n * - `explicit-only`: when `llm.maintenance` is non-empty, do not append `llm.fallbackModel` or `distill.fallbackModels`.\n * - `default` / `allow-heavy`: legacy behaviour — full tier preference + global fallbacks.\n */\n maintenanceFallbackPolicy?: \"default\" | \"cheap-only\" | \"explicit-only\" | \"allow-heavy\";\n /** Ordered preference for default-tier LLM calls (first available wins). */\n default: string[];\n /** Ordered preference for heavy-tier LLM calls (e.g. distill, spawn). */\n heavy: string[];\n /**\n * Optional: ordered model list for nano/ultra-light ops — autoClassify, HyDE, classifyBeforeWrite, auto-recall summarize.\n * These run on every chat message or write, so cheapness matters most.\n * When not set, falls back to the default tier.\n * Ideal models: openai/gpt-4.1-nano, google/gemini-2.5-flash-lite, anthropic/claude-haiku-*.\n */\n nano?: string[];\n /** When true, if all preferred models fail, try the fallback model. */\n fallbackToDefault?: boolean;\n /** When fallbackToDefault is true, this model is tried last. */\n fallbackModel?: string;\n /**\n * Per-provider API config for direct LLM calls.\n * Keys are provider prefixes as they appear in model IDs (e.g. \"google\", \"openai\", \"anthropic\", \"ollama\").\n * Built-in providers (google, openai, ollama) have defaults; others require explicit apiKey + baseURL.\n * Example: { google: { apiKey: \"AIzaSy...\" }, anthropic: { apiKey: \"sk-ant-...\", baseURL: \"https://api.anthropic.com/v1\" } }\n * Ollama example: { ollama: { baseURL: \"http://127.0.0.1:11434/v1\" } }\n */\n providers?: Record<string, LLMProviderConfig | undefined>;\n /**\n * When true and an `ollama/*` model appears in any tier list, automatically start Ollama (`ollama serve`)\n * if it is not already running. Only has effect when Ollama models are configured.\n * Default: false.\n */\n localAutoStart?: boolean;\n /**\n * Provider IDs to exclude from all LLM use (tier lists, verify, etc.).\n * Use when a provider is configured (e.g. in llm.default) but you want hybrid-memory to never use it (e.g. low credits).\n * Example: [\"anthropic\"] — Anthropic models are not tried even if listed in llm.nano/default/heavy.\n */\n disabledProviders?: string[];\n};\n\n/** Minimal plugin config shape for resolving cron job model (no full parse). */\nexport type CronModelConfig = {\n embedding?: { apiKey?: string };\n distill?: { apiKey?: string; defaultModel?: string; fallbackModels?: string[] };\n reflection?: { model?: string };\n /** Optional: when present, use for cron LLM (e.g. Claude). */\n claude?: { apiKey?: string; defaultModel?: string };\n /** Optional: gateway-routed LLM preference lists (issue #87). When set, overrides provider-based resolution. */\n llm?: LLMConfig;\n};\n\n/** Credential types supported by the credentials store */\nexport const CREDENTIAL_TYPES = [\"token\", \"password\", \"api_key\", \"ssh\", \"bearer\", \"other\"] as const;\nexport type CredentialType = (typeof CREDENTIAL_TYPES)[number];\n\n/** Auto-capture configuration for credential scanning from tool call inputs */\nexport type CredentialAutoCaptureConfig = {\n /** Enable scanning of tool call inputs for credential patterns (default: false, opt-in) */\n toolCalls: boolean;\n /**\n * Pattern set to use: \"builtin\" uses the built-in regex set (default: \"builtin\").\n * Custom patterns are not currently supported but reserved for future extension.\n */\n patterns?: \"builtin\";\n /** Emit info-level log on each capture (default: true) */\n logCaptures?: boolean;\n /** When true, only store when a credential pattern matched (reject value-only extraction). Default false. */\n requirePatternMatch?: boolean;\n};\n\n/** Opt-in credentials: structured, encrypted storage for API keys, tokens, etc. */\nexport type CredentialsConfig = {\n enabled: boolean;\n store: \"sqlite\";\n /** Encryption key: \"env:VAR_NAME\" resolves from env, or raw string (not recommended) */\n encryptionKey: string;\n /** When enabled, detect credential patterns in conversation and prompt to store (default false) */\n autoDetect?: boolean;\n /** Auto-capture credentials from tool call inputs (default: disabled) */\n autoCapture?: CredentialAutoCaptureConfig;\n /** Days before expiry to warn (default 7) */\n expiryWarningDays?: number;\n /**\n * When true, include the raw credential value in the plain-text tool `content`.\n * Default: false. Only enable for explicit local debugging — content is commonly\n * persisted in transcripts, logs, and memory-extraction pipelines.\n */\n revealInContent?: boolean;\n};\n\n/** Error reporting configuration for GlitchTip/Sentry integration (opt-in, privacy-first) */\nexport type UpdateNudgeConfig = {\n /** Emit upgrade reminders for outdated installs (default: true). */\n enabled: boolean;\n /** Minimum hours between repeated upgrade reminders (default: 24). */\n intervalHours: number;\n /** How long cached latest-version results stay fresh (default: 24). */\n cacheTtlHours: number;\n};\n\n/** Error reporting configuration for GlitchTip/Sentry integration (opt-in, privacy-first) */\nexport type ErrorReportingConfig = {\n enabled: boolean;\n /** DSN for self-hosted mode. Not required in schema (only at runtime for self-hosted). */\n dsn?: string;\n consent: boolean;\n /** \"community\" (default): use hardcoded community DSN. \"self-hosted\": require custom DSN. */\n mode: \"community\" | \"self-hosted\";\n environment?: string;\n sampleRate?: number;\n /** Opt-in: Only sent when explicitly configured. Not sent by default for privacy.\n * Optional UUID identifying this bot instance; sent as tag so GlitchTip can group errors by bot. */\n botId?: string;\n /** Opt-in: Only sent when explicitly configured. Not sent by default for privacy.\n * Optional friendly name for this bot; sent as tag for readable reports. */\n botName?: string;\n /**\n * Optional map of error fingerprints to the version that fixed them.\n * Errors matching a fingerprint from an older version are silently dropped (not regressions).\n * Format: { \"ErrorType:message prefix (first 100 chars)\": \"YYYY.M.NNN\" }\n * When not configured, behavior is identical to today.\n */\n resolvedIssues?: Record<string, string>;\n /** Background latest-version check plus user-facing upgrade reminders. */\n updateNudge: UpdateNudgeConfig;\n};\n\n/** Configuration for a single embedding model in a multi-model setup (Issue #158). */\nexport interface EmbeddingModelConfig {\n /** Model identifier (e.g. \"nomic-embed-text\", \"text-embedding-3-small\"). */\n name: string;\n /** Provider for this model. */\n provider: \"openai\" | \"ollama\" | \"onnx\";\n /** Vector dimensions this model produces. */\n dimensions: number;\n /** Semantic role this model plays. */\n role: \"general\" | \"domain\" | \"query\" | \"custom\";\n /** API key for openai provider (overrides embedding.apiKey). */\n apiKey?: string;\n /** Endpoint for ollama provider (overrides embedding.endpoint). */\n endpoint?: string;\n /** Whether this model is active (default: true). */\n enabled?: boolean;\n}\n\n/** Configuration for LanceDB vector store behaviour (issue #128). */\nexport type VectorConfig = {\n /**\n * When true, automatically drop and recreate the LanceDB table if its vector dimension\n * doesn't match the configured embedding model dimension.\n * After repair, existing facts from SQLite are re-embedded automatically.\n * Default: false (log the mismatch and return empty results instead of throwing).\n */\n autoRepair: boolean;\n};\n\n/** Optional heartbeat / long-running hints for ACTIVE-TASKS.md rows (not goals). */\nexport type ActiveTaskLongRunningRegistrationMode = \"off\" | \"suggest\" | \"confirm\" | \"auto_main_private\";\n\n/** Policy for long-running external workflows detected from user requests. */\nexport type ActiveTaskLongRunningRegistrationConfig = {\n /**\n * `off`: do nothing.\n * `suggest`: prepend a suggested active-task payload.\n * `confirm`: prepend a guard requiring explicit task registration/confirmation first.\n * `auto_main_private`: auto-create a task in main/private sessions; otherwise suggest.\n */\n mode: ActiveTaskLongRunningRegistrationMode;\n};\n\nexport type ActiveTaskHygieneConfig = {\n /**\n * When the last user message matches goal stewardship heartbeat patterns,\n * prepend an extra **task hygiene** block (stale counts, review nudge). Default: true.\n */\n heartbeatEscalation: boolean;\n /**\n * If > 0, tasks whose **updated** timestamp is older than this many **days**\n * get a line suggesting `active_task_propose_goal` + `goal_register`. Default: 0 (off).\n */\n suggestGoalAfterTaskAgeDays: number;\n /** Character budget for the heartbeat task-hygiene block. Default: 2500. */\n heartbeatNudgeMaxChars: number;\n /** Guard/auto-proposal policy for long-running external workflows (default: suggest). */\n longRunningRegistration?: ActiveTaskLongRunningRegistrationConfig;\n};\n\nexport type ActiveTaskProjectionDedupeBy = \"none\" | \"label\" | \"normalizedTitle\";\n\n/** Facts-backed `ACTIVE-TASKS.md` projection (`hybrid-mem active-tasks render`). See docs/ACTIVE-TASKS-PROJECTION.md. */\nexport type ActiveTaskProjectionConfig = {\n /**\n * `readable` applies filters and optional caps (default).\n * `full` lists all rows (no title/dedupe filters); caps still apply when `maxRowsPerSection` is set.\n */\n mode: \"readable\" | \"full\";\n /** Drop rows whose title resolves to the generic placeholder when `mode` is `readable` (default: true). */\n excludeGenericTitle: boolean;\n /** Minimum trimmed title length when > 0 (`readable` only). */\n titleMinChars: number;\n dedupeBy: ActiveTaskProjectionDedupeBy;\n /** Cap per section (Active, Stale — revisit, Completed); omitted rows summarized in a footer line. */\n maxRowsPerSection?: number;\n /** Use sectioned layout (Active / Stale — revisit) for facts render (default: true). */\n sectioned: boolean;\n};\n\n/** Active task working memory: ACTIVE-TASKS.md persistence and session injection */\nexport type ActiveTaskConfig = {\n /** Enable active task working memory (default: true) */\n enabled: boolean;\n /**\n * Where the task ledger lives: `markdown` reads/writes ACTIVE-TASKS.md.\n * `facts` uses hybrid-memory `category:project` facts (memory_store compatible).\n * Default: markdown.\n */\n ledger: \"markdown\" | \"facts\";\n /** Path to ACTIVE-TASKS.md (default: \"ACTIVE-TASKS.md\" in workspace root) */\n filePath: string;\n /** Auto-write task entries on subagent spawn/complete events (default: true) */\n autoCheckpoint: boolean;\n /**\n * Max tokens for session-start injection (default: 500).\n * Config must be a positive integer; fractional values are floored; non-positive values are not used (default applies).\n */\n injectionBudget: number;\n /**\n * Optional cap on active rows considered for injection after projection filters and sorting.\n * When unset, `projection.maxRowsPerSection` applies if set; otherwise no count cap (token budget still applies).\n */\n injectionMaxTasks?: number;\n /**\n * Duration before flagging a task as stale. Supports human-friendly strings:\n * \"24h\", \"1d\", \"1d12h30m\", \"45m\", or a plain integer (treated as minutes).\n * Default: \"24h\".\n *\n * Legacy `staleHours: number` is automatically converted on config load.\n */\n staleThreshold: string;\n /** Flush task summary to memory/YYYY-MM-DD.md on completion (default: true) */\n flushOnComplete: boolean;\n /** Stale-task warning injection at session start */\n staleWarning: {\n /** Inject stale task warnings into context on before_agent_start (default: true) */\n enabled: boolean;\n };\n /**\n * Stronger nudges for normal tasks (docs/TASK-HYGIENE.md): heartbeat escalation,\n * optional “consider a goal” hints for long-running tasks.\n */\n taskHygiene: ActiveTaskHygieneConfig;\n /** Markdown projection when `ledger` is `facts` (render path, filters, sectioning). */\n projection: ActiveTaskProjectionConfig;\n /**\n * Live-state reconciliation: periodic GitHub API/CLI checks to mark tasks done when external PRs/issues close.\n * Requires explicit opt-in (default: false) due to external network calls.\n */\n liveStateReconcile: {\n /** Enable live-state reconciliation (default: false). Requires activeTask.enabled and ledger: facts. */\n enabled: boolean;\n };\n};\n\n/** Goal stewardship — autonomous pursuit of long-running goals (docs/GOAL-STEWARDSHIP-DESIGN.md). */\nexport type GoalStewardshipDefaults = {\n maxDispatches: number;\n maxAssessments: number;\n cooldownMinutes: number;\n escalateAfterFailures: number;\n priority: \"critical\" | \"high\" | \"normal\" | \"low\";\n};\n\nexport type GoalStewardshipGlobalLimits = {\n maxDispatchesPerHour: number;\n maxActiveGoals: number;\n};\n\n/** Optional knobs for cross-feature escalation visibility (defaults preserve prior behavior). */\nexport type GoalStewardshipEscalationPolicy = {\n /**\n * When heartbeat matches and task hygiene runs, append a **goal-escalation** snippet if any goal is **blocked** or **stalled**.\n * Default: true.\n */\n taskHygieneOnBlockedGoals: boolean;\n};\n\n/** Trip goals stuck with unchanged blockers / no progress; escalate to human with summary (see docs/GOAL-STEWARDSHIP-OPERATOR.md). */\nexport type GoalStewardshipCircuitBreakerConfig = {\n enabled: boolean;\n /** Consecutive assessments with the same blocker fingerprint before blocking (default: 0 = off). */\n sameBlockerRepeatLimit: number;\n /** Block when (assessmentCount - last progress assessment count) reaches this; 0 = off (default: 0). */\n maxAssessmentsWithoutProgress: number;\n /** Build human-readable summary for history / memory (default: true). */\n composeHumanSummary: boolean;\n /** Append escalation to workspace memory/YYYY-MM-DD.md when composeHumanSummary (default: true). */\n appendMemoryEscalation: boolean;\n};\n\n/** Relative weights for multi-goal stewardship attention (default: critical 4, high 2, normal 1, low 0.5). */\nexport type GoalStewardshipAttentionWeights = {\n critical: number;\n high: number;\n normal: number;\n low: number;\n};\n\n/** Which goal priorities require explicit `confirmed: true` on goal_register. */\nexport type GoalStewardshipConfirmationPolicy = {\n requireRegisterAckForPriorities: Array<\"critical\" | \"high\" | \"normal\" | \"low\">;\n};\n\nexport type GoalStewardshipConfig = {\n enabled: boolean;\n goalsDir: string;\n model: string | null;\n heartbeatStewardship: boolean;\n watchdogHealthCheck: boolean;\n defaults: GoalStewardshipDefaults;\n globalLimits: GoalStewardshipGlobalLimits;\n /**\n * Regex sources for heartbeat detection. Empty = built-in defaults (`heartbeat` and common variants).\n */\n heartbeatPatterns: string[];\n attentionWeights: GoalStewardshipAttentionWeights;\n /** Combined cap (characters) for multi-goal stewardship prepend blocks in one heartbeat. */\n multiGoalMaxChars: number;\n /** Max goals to include in one heartbeat after weighting. */\n multiGoalMaxGoals: number;\n /** On heartbeat, rewrite ACTIVE-TASKS.md with a Goals mirror section (requires activeTask.enabled). */\n heartbeatRefreshActiveTask: boolean;\n confirmationPolicy: GoalStewardshipConfirmationPolicy;\n /**\n * When true, call a nano-tier LLM once per heartbeat to refine triage. When false, heuristics only.\n */\n llmTriageOnHeartbeat: boolean;\n /** When triage/heuristic indicates complex work, add a line suggesting heavy-tier reasoning for dispatch. */\n triageSuggestHeavyDirective: boolean;\n circuitBreaker: GoalStewardshipCircuitBreakerConfig;\n /** Cross-layer nudges and visibility (issue #1096). */\n escalationPolicy: GoalStewardshipEscalationPolicy;\n /** Allow command_exit_zero verification in the watchdog (shell execution). Default: false. */\n allowCommandVerification: boolean;\n /** Allow pr_merged verification (GitHub API). Default: false — network + token required. */\n allowPrVerification: boolean;\n};\n\n/** Self-correction pipeline: semantic dedup, TOOLS.md sectioning, auto-rewrite vs approve */\nexport type SelfCorrectionConfig = {\n /** Enable self-correction pipeline (default: true). */\n enabled?: boolean;\n /** Use embedding similarity to skip near-duplicate facts before MEMORY_STORE (default: true). */\n semanticDedup: boolean;\n /** Similarity threshold for semantic dedup, 0–1 (default: 0.92). */\n semanticDedupThreshold: number;\n /** TOOLS.md section heading for new rules, e.g. \"Self-correction rules\" (default: \"Self-correction rules\"). */\n toolsSection: string;\n /** When true (default), insert suggested TOOLS rules under toolsSection. Set false to only suggest in report (then use --approve to apply). */\n applyToolsByDefault: boolean;\n /** When true, LLM rewrites TOOLS.md to integrate new rules (no duplicates/contradictions). When false, use section insert (or suggest if applyToolsByDefault is false) (default: false). */\n autoRewriteTools: boolean;\n /** When true and incident count > spawnThreshold, run Phase 2 via `openclaw sessions spawn --model <model>` for large context. Model is chosen from config (Gemini/OpenAI/Claude) when spawnModel is empty (default: false). */\n analyzeViaSpawn: boolean;\n /** Use spawn for Phase 2 when incidents exceed this count (default: 15). */\n spawnThreshold: number;\n /** Model for spawn when analyzeViaSpawn is true. Empty = use provider default from config (see getDefaultCronModel). */\n spawnModel: string;\n /** TOOLS.md section heading for positive reinforcement rules (default: \"Positive Reinforcement Rules\"). */\n positiveRulesSection?: string;\n /** When true, run LLM analysis on reinforcement incidents (default: true). */\n reinforcementLLMAnalysis?: boolean;\n /** When true, reinforcement analysis may create proposals in the proposals DB (default: true). */\n reinforcementToProposals?: boolean;\n /** When true, self-correction AGENTS_RULE remediations are written to proposals DB (default: true). */\n agentsRuleToProposals?: boolean;\n};\n\n/**\n * Gateway authentication configuration.\n * The token field accepts a SecretRef for safe storage:\n * - \"env:VAR_NAME\" — resolve from process.env[VAR_NAME] at startup\n * - \"file:/path\" — read from a file at startup (whitespace-trimmed)\n * - plain string — used as-is (not recommended; token will be in config)\n * When set, takes priority over the OPENCLAW_GATEWAY_TOKEN environment variable.\n */\nexport type GatewayAuthConfig = {\n /**\n * Auth token for the OpenClaw gateway.\n * Use a SecretRef so the plaintext token is never stored in config files:\n * \"env:OPENCLAW_GATEWAY_TOKEN\" or \"file:/run/secrets/gateway-token\"\n */\n token?: string;\n};\n\n/**\n * @internal Runtime representation of GatewayAuthConfig after SecretRef resolution.\n * `_resolvedToken` holds the actual token value; it is stored as a non-enumerable\n * property so it never appears in JSON.stringify or config dumps.\n */\nexport type ResolvedGatewayAuthConfig = GatewayAuthConfig & {\n readonly _resolvedToken?: string;\n};\n\nexport type GatewayConfig = {\n auth?: ResolvedGatewayAuthConfig;\n};\n\n/**\n * Per-provider auth profile ordering for OAuth-first LLM authentication.\n * When configured, OAuth profiles are tried before API keys (first eligible wins).\n * Requires the OpenClaw gateway (OPENCLAW_GATEWAY_PORT) to be running for OAuth routing.\n *\n * Example:\n * auth:\n * order:\n * anthropic: ['anthropic:claude-cli', 'anthropic:api'] # OAuth first, API key fallback\n * openai: ['openai-codex', 'openai:api'] # OAuth first, API key fallback\n * google: ['google-gemini-cli', 'google:default'] # OAuth first, API key fallback\n *\n * Supported OAuth/token profiles (must be set up via `openclaw configure`):\n * - anthropic:claude-cli — Claude Code CLI OAuth\n * - openai-codex — OpenAI Codex OAuth\n * - github-copilot — GitHub Copilot token (device code flow)\n * - google-gemini-cli — Gemini CLI OAuth\n * - google-vertex — Google Vertex AI OAuth\n * - qwen-portal:qwen-cli — Qwen Code CLI OAuth\n * - minimax-portal:minimax-cli — MiniMax CLI OAuth\n */\nexport type AuthOrderConfig = {\n /**\n * Per-provider ordered list of auth profile IDs.\n * First eligible profile wins; falls through on missing/expired OAuth token.\n * Keys are provider prefixes (e.g. \"anthropic\", \"openai\", \"google\").\n * Always populated when an AuthOrderConfig is present (parseAuthConfig never returns {}).\n */\n order: Record<string, string[]>;\n /**\n * When a provider has both OAuth and an API key, prefer OAuth (default: true).\n * On OAuth failure the plugin records backoff and uses the API key until backoff expires.\n */\n preferOAuthWhenBoth?: boolean;\n /**\n * Backoff delays in minutes after each OAuth failure before trying OAuth again.\n * Default: [5, 30, 60, 120, 240] (5min → 30min → 1h → 2h → 4h).\n */\n backoffScheduleMinutes?: number[];\n /**\n * Reset backoff levels after this many hours so OAuth is tried again from level 0.\n * Default: 24.\n */\n resetBackoffAfterHours?: number;\n};\n\n/** Configuration mode presets. See docs/CONFIGURATION-MODES.md. */\nexport type ConfigMode = \"local\" | \"minimal\" | \"enhanced\" | \"complete\";\n\n/**\n * Output verbosity level for CLI commands and tool responses.\n * - silent: no unsolicited output — suppresses capability hints, relevant-memories,\n * relevant-procedures, and credential-hint blocks. Memory tools remain fully functional.\n * Ideal for users who want the plugin to work silently in the background.\n * - quiet: minimal output — counts/totals only, no decorative headers or config echo.\n * Ideal for scripted/cron use and low-noise deployments (default for local mode).\n * - normal: current default behaviour — balanced output with key details.\n * - verbose: extra detail — full breakdowns, all fields, config summaries.\n * Ideal for debugging and interactive sessions (default for complete mode).\n */\nexport type VerbosityLevel = \"silent\" | \"quiet\" | \"normal\" | \"verbose\";\n\nexport type MemoryCategory = string;\n\nexport type HybridMemoryConfig = {\n embedding: {\n provider: \"openai\" | \"ollama\" | \"onnx\" | \"google\";\n model: string;\n /** Required for openai provider; optional for ollama/onnx. */\n apiKey?: string;\n /** Optional ordered preference list (openai gateway fallback). First model defines vector dimension; all must have same dimension. */\n models?: string[];\n /** Vector dimensions for this model (required for ollama/onnx; auto-resolved for known openai models). */\n dimensions: number;\n /** Azure OpenAI: embedding deployment name (must match Azure Portal). When set, used as the API model id; `model` still resolves dimensions. */\n deployment?: string;\n /** Ollama endpoint URL (default: http://localhost:11434). Only used when provider='ollama'. */\n endpoint?: string;\n /** Number of texts to embed per batch call (default: 50). */\n batchSize: number;\n /**\n * Ordered list of embedding providers to try (failover). First working wins.\n * When unset, inferred from llm config (ollama if llm.nano/default/heavy contains \"ollama/\", openai if apiKey set, google if distill.apiKey or llm.providers.google set); default [\"ollama\", \"openai\"] when both possible so Ollama acts as a tier.\n */\n preferredProviders?: (\"ollama\" | \"openai\" | \"google\")[];\n /** Resolved by parser from distill.apiKey or llm.providers.google.apiKey when preferredProviders includes \"google\". Not set by user. */\n googleApiKey?: string;\n /**\n * Additional embedding models for multi-model support (Issue #158).\n * When non-empty, facts are embedded with all models and stored in the fact_embeddings table.\n * At retrieval time, all model indices are queried and results are merged via RRF.\n * When empty/undefined, the system works in single-model mode (backward compatible).\n */\n multiModels?: EmbeddingModelConfig[];\n /**\n * When `true`, automatically re-generate embeddings for all facts whenever the\n * embedding model or provider changes on startup (Issue #153).\n * Default: `false` — changes are logged but no re-embedding is performed automatically.\n * Enable when switching models to avoid stale vectors causing poor search quality.\n */\n autoMigrate?: boolean;\n };\n lanceDbPath: string;\n sqlitePath: string;\n autoCapture: boolean;\n autoRecall: AutoRecallConfig;\n /** Max characters per captured/stored fact (filter and truncation). Default 5000. */\n captureMaxChars: number;\n categories: string[];\n autoClassify: AutoClassifyConfig;\n /** Store options (2.3): fuzzyDedupe = skip store when normalized text matches existing. */\n store: StoreConfig;\n /** Opt-in credential management: structured, encrypted storage (default: disabled) */\n credentials: CredentialsConfig;\n /** Graph-based spreading activation: auto-linking and graph traversal */\n graph: GraphConfig;\n /** Entity extraction hygiene: suppress common-noun pseudo-entities (#1190). */\n entityExtraction: EntityExtractionConfig;\n /** Write-Ahead Log for crash resilience (default: enabled) */\n wal: WALConfig;\n /** Memory pressure diagnostic snapshots — Issue #1551 (default: disabled). */\n diagnostics: DiagnosticsConfig;\n /** Event log archival configuration. */\n eventLog: EventLogConfig;\n /** Opt-in persona proposals: agent self-evolution with human approval (default: disabled) */\n personaProposals: PersonaProposalsConfig;\n /** Passive observer — background fact extraction from session transcripts (default: disabled) */\n passiveObserver: PassiveObserverConfig;\n /** Reflection layer — synthesize behavioral patterns from facts (default: disabled) */\n reflection: ReflectionConfig;\n /** Identity reflection layer — synthesize persona-level insights from reflection outputs (default: disabled) */\n identityReflection: IdentityReflectionConfig;\n /** Promotion pipeline — cluster repeated durable identity reflections into stable persona state. */\n identityPromotion: IdentityPromotionConfig;\n /** Procedural memory — procedure tagging and auto-skills (default: enabled) */\n procedures: ProceduresConfig;\n /** Multi-pass extraction with LLM verification (Issue #166, default: disabled). */\n extraction: ExtractionConfig;\n /** Dynamic memory tiering — hot/warm/cold (default: enabled) */\n memoryTiering: MemoryTieringConfig;\n /** Optional: LLM preference lists and per-provider API config for direct chat calls (issue #87). */\n llm?: LLMConfig;\n /**\n * Optional: OAuth-first auth profile ordering per provider (issue #311).\n * When set, providers with OAuth profiles route through the OpenClaw gateway instead of direct API keys.\n * Falls back to API keys when gateway is unavailable or OAuth token is missing/expired.\n */\n auth?: AuthOrderConfig;\n /** Optional: Gemini for distill (1M context). apiKey/defaultModel deprecated in favor of llm + gateway. */\n distill?: {\n apiKey?: string;\n defaultModel?: string;\n /** Fallback models to try if primary model fails after retries (optional). Deprecated: use llm.default/heavy. */\n fallbackModels?: string[];\n /** Enable directive extraction from sessions (default: true). */\n extractDirectives?: boolean;\n /** Enable reinforcement extraction from sessions (default: true). */\n extractReinforcement?: boolean;\n /** Reinforcement boost added to facts search score (default: 0.1). */\n reinforcementBoost?: number;\n /** Phase 2: Reinforcement boost added to procedures search score (default: 0.1). */\n reinforcementProcedureBoost?: number;\n /** Phase 2: Number of reinforcements to trigger auto-promotion of procedures (default: 2). */\n reinforcementPromotionThreshold?: number;\n /** Model tier for main session distill pass. \"maintenance\" is the safe default; \"heavy\" is opt-in. */\n modelTier?: \"nano\" | \"maintenance\" | \"default\" | \"heavy\";\n /** Model tier for extraction pipeline (extract-reinforcement LLM analysis). \"nano\" saves cost; \"maintenance\" isolates from llm.default; unset defaults to \"nano\". */\n extractionModelTier?: \"nano\" | \"maintenance\" | \"default\" | \"heavy\";\n };\n /** Auto-build multilingual keywords from memory (default: enabled). Run at first startup if no file, then weekly. */\n languageKeywords: { autoBuild: boolean; weeklyIntervalDays: number };\n /** Optional: ingest workspace markdown files as facts (skills, TOOLS.md, etc.) */\n ingest?: IngestConfig;\n /** Optional: search tweaks (HyDE query expansion) */\n search?: SearchConfig;\n /** Multi-strategy RRF retrieval pipeline configuration (Issue #152). */\n retrieval: RetrievalConfig;\n /** Optional: self-correction analysis — semantic dedup, TOOLS sectioning, auto-rewrite, spawn */\n selfCorrection?: SelfCorrectionConfig;\n /** Multi-agent memory scoping — dynamic agent detection and scope defaults (default: orchestratorId=\"main\", defaultStoreScope=\"global\") */\n multiAgent: MultiAgentConfig;\n /** Error reporting to GlitchTip/Sentry (opt-out, default: enabled with community DSN). Set enabled: false or consent: false to opt out. */\n errorReporting: ErrorReportingConfig;\n /** Active task working memory — ACTIVE-TASKS.md persistence and session injection (default: enabled) */\n activeTask: ActiveTaskConfig;\n /** Goal stewardship — autonomous long-running goals (default: disabled). */\n goalStewardship: GoalStewardshipConfig;\n /** Vector store configuration (LanceDB schema validation and auto-repair, issue #128). */\n vector: VectorConfig;\n /** Enhanced ambient retrieval with multi-query generation (Issue #156, default: disabled). */\n ambient: AmbientConfig;\n /** GraphRAG retrieval: semantic search + graph expansion (Issue #145, default: enabled, defaultExpand: false). */\n graphRetrieval: GraphRetrievalConfig;\n /** Future-date decay freeze protection (#144). Enabled by default. */\n futureDateProtection: FutureDateProtectionConfig;\n /** Maintenance tasks: monthly review, consolidation, etc. */\n maintenance: MaintenanceConfig;\n /** Nightly dream cycle: automated prune → consolidate → reflect (Issue #143, default: disabled). */\n nightlyCycle: NightlyCycleConfig;\n /** Confidence reinforcement on repeated mentions (Issue #147, default: enabled). */\n reinforcement: ReinforcementConfig;\n /** Topic cluster detection: BFS connected-component analysis on memory_links (Issue #146). */\n clusters: ClustersConfig;\n /** Memory health dashboard (Issue #148, default: enabled). */\n health: HealthConfig;\n /** Knowledge gap analysis — orphan/weak detection and suggested links (Issue #141, default: enabled). */\n gaps: GapsConfig;\n /** Multi-hook retrieval aliases: generate and index alternative phrasings per fact (Issue #149, default: disabled). */\n aliases: AliasesConfig;\n /** Shortest-path traversal between memories via BFS (Issue #140, default: enabled). */\n path: PathConfig;\n /** Document ingestion via MarkItDown Python bridge (Issue #206, default: disabled). */\n documents: DocumentsConfig;\n /** Workflow tracking: tool-sequence capture and pattern learning (Issue #209, default: disabled). */\n workflowTracking: WorkflowTrackingConfig;\n /** Workflow crystallization: auto-generate AgentSkill SKILL.md files from repeated patterns (Issue #208, default: disabled). */\n crystallization: CrystallizationConfig;\n /** Plugin self-extension: generate tool proposals from usage-pattern gaps (Issue #210, default: disabled). */\n selfExtension: SelfExtensionConfig;\n /**\n * Top-level alias for implicitFeedback.trajectoryLLMAnalysis (Issue #754).\n * When set, takes precedence over implicitFeedback.trajectoryLLMAnalysis.\n * The nested key is still supported with a deprecation warning.\n */\n trajectoryLLMAnalysis?: boolean;\n /**\n * Top-level alias for implicitFeedback.feedToSelfCorrection (Issue #754).\n * When set, takes precedence over implicitFeedback.feedToSelfCorrection.\n * The nested key is still supported with a deprecation warning.\n */\n feedToSelfCorrection?: boolean;\n /**\n * Top-level alias for distill.extractReinforcement (Issue #754).\n * When set, takes precedence over distill.extractReinforcement.\n * The nested key is still supported with a deprecation warning.\n */\n extractReinforcement?: boolean;\n /** Implicit feedback detection from behavioral conversation signals (Issue #262, default: enabled). */\n implicitFeedback: ImplicitFeedbackConfig;\n /** Closed-loop rule effectiveness measurement (Issue #262, default: enabled). */\n closedLoop: ClosedLoopConfig;\n /** Real-time frustration detection from conversation signals (Issue #263, default: enabled). */\n frustrationDetection: FrustrationDetectionConfig;\n /** Cross-agent lesson generalisation — promote agent-scoped lessons to global (Issue #263, default: disabled). */\n crossAgentLearning: CrossAgentLearningConfig;\n /** Tool effectiveness scoring from workflow traces (Issue #263, default: enabled). */\n toolEffectiveness: ToolEffectivenessConfig;\n /** Contextual variant generation at index time (Issue #159, default: disabled). */\n contextualVariants: ContextualVariantsConfig;\n /** Query expansion via LLM at retrieval time (Issue #160, default: disabled). */\n queryExpansion: QueryExpansionConfig;\n /** LLM re-ranking of RRF fusion results (Issue #161, default: disabled). */\n reranking: RerankingConfig;\n /** Adaptive document grading and query rewriting for retrieval quality (default: disabled). */\n documentGrading: DocumentGradingConfig;\n /** Verification store for critical facts (Issue #162, default: disabled). */\n verification: VerificationConfig;\n /** Provenance tracing for fact-to-source chains (Issue #163, default: disabled). */\n provenance: ProvenanceConfig;\n /** LLM cost tracking — per-feature token usage and estimated cost (Issue #270, default: enabled). */\n costTracking: CostTrackingConfig;\n /** Mission Control dashboard HTTP server (Issue #309, default: enabled on port 7700). */\n dashboard: DashboardConfig;\n /** Sensor sweep — cron-based data collection writing to Event Bus, no LLM (Issue #236, default: disabled). */\n sensorSweep: SensorSweepConfig;\n /** ApiTap integration — intercept browser traffic to auto-generate API skill specs (Issue #614, default: disabled). */\n apiTap: ApiTapConfig;\n /** Humanizer style scoring — quality-loop metric for detecting AI-writing patterns (Issue #616, default: disabled). */\n humanizer: HumanizerConfig;\n /** Weekly digest delivery for cron + operator review (Issue #1197). */\n digest: DigestConfig;\n /** Entity lifecycle adapters — GitHub Phase 2 stub (Issue #1196). */\n lifecycle: LifecycleAdaptersConfig;\n /** Frequency-based auto-save: capture repeated references including credentials to vault (Issue #784, default: disabled). */\n frequencyCapture: FrequencyCaptureConfig;\n /**\n * Output verbosity level for CLI commands and tool responses (Issue #282).\n * quiet: counts/totals only. normal: balanced default. verbose: full detail.\n * Defaults: local→quiet, minimal→normal, enhanced→normal, complete→verbose.\n */\n verbosity: VerbosityLevel;\n /** Set when user specified a mode in config; used by verify to show \"Mode: Normal\" etc. */\n mode?: ConfigMode | \"custom\";\n /**\n * Gateway connection settings. Token supports SecretRef:\n * \"env:VAR_NAME\" or \"file:/path/to/file\"\n * Overrides the OPENCLAW_GATEWAY_TOKEN environment variable when set.\n */\n gateway?: GatewayConfig;\n};\n"],"mappings":";;;;;AA6JA,MAAa,mBAAmB;CAAC;CAAS;CAAY;CAAW;CAAO;CAAU;AAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":[],"sources":["../../config/utils.ts"],"sourcesContent":["import type { ConfigMode, VerbosityLevel } from \"./types/index.js\";\n\n/** Default categories — can be extended via config.categories */\nexport const DEFAULT_MEMORY_CATEGORIES = [\n \"preference\",\n \"fact\",\n \"decision\",\n \"entity\",\n \"pattern\",\n \"rule\",\n \"edict\",\n \"other\",\n /** Operational / agent categories (audit #1193 — avoids “unknown category” drift on long-lived stores). Remap legacy `forge_*` → `forge` and `episode` → `ops_summary` via `categories remap`. */\n \"forge\",\n \"monitoring\",\n \"ops_status\",\n \"ops_summary\",\n \"coding_task\",\n \"quality_loop\",\n \"topic_labels\",\n] as const;\n\n/** Runtime categories: starts as defaults, extended by config */\nlet _runtimeCategories: string[] = [...DEFAULT_MEMORY_CATEGORIES];\n\nexport function getMemoryCategories(): readonly string[] {\n return _runtimeCategories;\n}\n\nexport function setMemoryCategories(categories: string[]): void {\n // Always include defaults + any custom ones, deduplicated\n const merged = new Set([...DEFAULT_MEMORY_CATEGORIES, ...categories]);\n _runtimeCategories = [...merged];\n}\n\nexport function isValidCategory(cat: string): boolean {\n return _runtimeCategories.includes(cat);\n}\n\n/** Preset overrides per mode. Merged under user config so user keys win. See CONFIGURATION-MODES.md. */\nexport const PRESET_OVERRIDES: Record<ConfigMode, Record<string, unknown>> = {\n local: {\n autoCapture: true,\n /** Credentials vault on; set `credentials.encryptionKey` (16+ chars or env:VAR) for encryption at rest. */\n credentials: { enabled: true },\n autoRecall: {\n enabled: true,\n interactiveEnrichment: \"fast\",\n entityLookup: { enabled: false },\n authFailure: { enabled: false },\n },\n autoClassify: { enabled: false, suggestCategories: false },\n store: { fuzzyDedupe: true, classifyBeforeWrite: false },\n graph: { enabled: false },\n procedures: { enabled: false },\n reflection: { enabled: false },\n wal: { enabled: true },\n languageKeywords: { autoBuild: false },\n personaProposals: { enabled: false },\n memoryTiering: { enabled: false },\n distill: { extractDirectives: true, extractReinforcement: false },\n verbosity: \"quiet\",\n /** FTS-only recall and capture: no embedding/vector/LLM calls; local SQLite + files only. */\n retrieval: { strategies: [\"fts5\"] },\n },\n /** Minimal: nano for auto-classify, default (flash) for distill — good value at low cost. Ingest paths on so occasional ingest-files gets facts. */\n minimal: {\n autoCapture: true,\n credentials: { enabled: true },\n autoRecall: {\n enabled: true,\n interactiveEnrichment: \"fast\",\n entityLookup: { enabled: false },\n authFailure: { enabled: true },\n },\n autoClassify: { enabled: true, suggestCategories: true },\n store: { fuzzyDedupe: false, classifyBeforeWrite: false },\n graph: { enabled: true, autoLink: false, useInRecall: true, strengthenOnRecall: false, hubDegreeCap: 500 },\n procedures: { enabled: true, requireApprovalForPromote: true },\n reflection: { enabled: false },\n wal: { enabled: true },\n languageKeywords: { autoBuild: true },\n personaProposals: { enabled: false },\n memoryTiering: { enabled: true, compactionOnSessionEnd: true },\n distill: { extractDirectives: true, extractReinforcement: true, extractionModelTier: \"nano\" },\n ingest: { paths: [\"skills/**/*.md\", \"TOOLS.md\", \"AGENTS.md\"] },\n verbosity: \"normal\",\n },\n enhanced: {\n autoCapture: true,\n autoRecall: {\n enabled: true,\n interactiveEnrichment: \"fast\",\n entityLookup: { enabled: true },\n authFailure: { enabled: true },\n },\n autoClassify: { enabled: true, suggestCategories: true },\n credentials: { autoDetect: true, autoCapture: { toolCalls: true } },\n store: { fuzzyDedupe: true, classifyBeforeWrite: true },\n graph: { enabled: true, autoLink: true, useInRecall: true, strengthenOnRecall: false, hubDegreeCap: 500 },\n procedures: { enabled: true, requireApprovalForPromote: true },\n reflection: { enabled: true },\n wal: { enabled: true },\n languageKeywords: { autoBuild: true },\n personaProposals: { enabled: false },\n memoryTiering: { enabled: true, compactionOnSessionEnd: true },\n selfCorrection: {\n semanticDedup: true,\n applyToolsByDefault: true,\n autoRewriteTools: false,\n analyzeViaSpawn: false,\n },\n distill: { extractDirectives: true, extractReinforcement: true, extractionModelTier: \"nano\" },\n ingest: { paths: [\"skills/**/*.md\", \"TOOLS.md\", \"AGENTS.md\"] },\n frustrationDetection: { enabled: false },\n nightlyCycle: { enabled: false },\n passiveObserver: { enabled: false },\n extraction: { extractionPasses: true },\n workflowTracking: { enabled: false },\n selfExtension: { enabled: false },\n crystallization: { enabled: false },\n verification: { enabled: false },\n provenance: { enabled: false },\n aliases: { enabled: false },\n crossAgentLearning: { enabled: false },\n reranking: { enabled: false },\n contextualVariants: { enabled: false },\n documents: { enabled: false },\n verbosity: \"normal\",\n },\n complete: {\n autoCapture: true,\n autoRecall: {\n enabled: true,\n interactiveEnrichment: \"fast\",\n entityLookup: { enabled: true },\n authFailure: { enabled: true },\n },\n autoClassify: { enabled: true, suggestCategories: true },\n credentials: { autoDetect: true, autoCapture: { toolCalls: true } },\n store: { fuzzyDedupe: true, classifyBeforeWrite: true },\n graph: { enabled: true, autoLink: true, useInRecall: true, strengthenOnRecall: false, hubDegreeCap: 500 },\n procedures: { enabled: true, requireApprovalForPromote: true },\n reflection: { enabled: true },\n wal: { enabled: true },\n languageKeywords: { autoBuild: true },\n personaProposals: { enabled: false },\n memoryTiering: { enabled: true, compactionOnSessionEnd: true },\n selfCorrection: {\n semanticDedup: true,\n applyToolsByDefault: true,\n autoRewriteTools: false,\n analyzeViaSpawn: false,\n },\n // queryExpansion not set in preset — defaults to disabled; set explicitly to enable.\n ingest: { paths: [\"skills/**/*.md\", \"TOOLS.md\", \"AGENTS.md\"] },\n distill: { extractDirectives: true, extractReinforcement: true, extractionModelTier: \"maintenance\" },\n frustrationDetection: { enabled: false },\n nightlyCycle: { enabled: false },\n passiveObserver: { enabled: false },\n extraction: { extractionPasses: true },\n workflowTracking: { enabled: false },\n selfExtension: { enabled: false },\n crystallization: { enabled: false },\n verification: { enabled: false },\n provenance: { enabled: false },\n aliases: { enabled: false },\n crossAgentLearning: { enabled: false },\n reranking: { enabled: false },\n contextualVariants: { enabled: false },\n documents: { enabled: false },\n verbosity: \"verbose\",\n },\n};\n\n/**\n * Check if verbosity level is in \"compact mode\" (quiet or silent).\n * Compact mode suppresses verbose output and only shows minimal information.\n * Use this helper instead of inline checks to ensure consistent behavior across the codebase.\n */\nexport function isCompactVerbosity(verbosity: VerbosityLevel | undefined): boolean {\n return verbosity === \"quiet\" || verbosity === \"silent\";\n}\n"],"mappings":";;AAGA,MAAa,4BAA4B;CACvC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;AAGD,IAAI,qBAA+B,CAAC,GAAG,0BAA0B;AAEjE,SAAgB,sBAAyC;CACvD,OAAO;;AAGT,SAAgB,oBAAoB,YAA4B;CAG9D,qBAAqB,CAAC,GAAG,IADN,IAAI,CAAC,GAAG,2BAA2B,GAAG,WAAW,CACrC,CAAC;;AAGlC,SAAgB,gBAAgB,KAAsB;CACpD,OAAO,mBAAmB,SAAS,IAAI;;;AAIzC,MAAa,mBAAgE;CAC3E,OAAO;EACL,aAAa;;EAEb,aAAa,EAAE,SAAS,MAAM;EAC9B,YAAY;GACV,SAAS;GACT,uBAAuB;GACvB,cAAc,EAAE,SAAS,OAAO;GAChC,aAAa,EAAE,SAAS,OAAO;GAChC;EACD,cAAc;GAAE,SAAS;GAAO,mBAAmB;GAAO;EAC1D,OAAO;GAAE,aAAa;GAAM,qBAAqB;GAAO;EACxD,OAAO,EAAE,SAAS,OAAO;EACzB,YAAY,EAAE,SAAS,OAAO;EAC9B,YAAY,EAAE,SAAS,OAAO;EAC9B,KAAK,EAAE,SAAS,MAAM;EACtB,kBAAkB,EAAE,WAAW,OAAO;EACtC,kBAAkB,EAAE,SAAS,OAAO;EACpC,eAAe,EAAE,SAAS,OAAO;EACjC,SAAS;GAAE,mBAAmB;GAAM,sBAAsB;GAAO;EACjE,WAAW;;EAEX,WAAW,EAAE,YAAY,CAAC,OAAO,EAAE;EACpC;;CAED,SAAS;EACP,aAAa;EACb,aAAa,EAAE,SAAS,MAAM;EAC9B,YAAY;GACV,SAAS;GACT,uBAAuB;GACvB,cAAc,EAAE,SAAS,OAAO;GAChC,aAAa,EAAE,SAAS,MAAM;GAC/B;EACD,cAAc;GAAE,SAAS;GAAM,mBAAmB;GAAM;EACxD,OAAO;GAAE,aAAa;GAAO,qBAAqB;GAAO;EACzD,OAAO;GAAE,SAAS;GAAM,UAAU;GAAO,aAAa;GAAM,oBAAoB;GAAO,cAAc;GAAK;EAC1G,YAAY;GAAE,SAAS;GAAM,2BAA2B;GAAM;EAC9D,YAAY,EAAE,SAAS,OAAO;EAC9B,KAAK,EAAE,SAAS,MAAM;EACtB,kBAAkB,EAAE,WAAW,MAAM;EACrC,kBAAkB,EAAE,SAAS,OAAO;EACpC,eAAe;GAAE,SAAS;GAAM,wBAAwB;GAAM;EAC9D,SAAS;GAAE,mBAAmB;GAAM,sBAAsB;GAAM,qBAAqB;GAAQ;EAC7F,QAAQ,EAAE,OAAO;GAAC;GAAkB;GAAY;GAAY,EAAE;EAC9D,WAAW;EACZ;CACD,UAAU;EACR,aAAa;EACb,YAAY;GACV,SAAS;GACT,uBAAuB;GACvB,cAAc,EAAE,SAAS,MAAM;GAC/B,aAAa,EAAE,SAAS,MAAM;GAC/B;EACD,cAAc;GAAE,SAAS;GAAM,mBAAmB;GAAM;EACxD,aAAa;GAAE,YAAY;GAAM,aAAa,EAAE,WAAW,MAAM;GAAE;EACnE,OAAO;GAAE,aAAa;GAAM,qBAAqB;GAAM;EACvD,OAAO;GAAE,SAAS;GAAM,UAAU;GAAM,aAAa;GAAM,oBAAoB;GAAO,cAAc;GAAK;EACzG,YAAY;GAAE,SAAS;GAAM,2BAA2B;GAAM;EAC9D,YAAY,EAAE,SAAS,MAAM;EAC7B,KAAK,EAAE,SAAS,MAAM;EACtB,kBAAkB,EAAE,WAAW,MAAM;EACrC,kBAAkB,EAAE,SAAS,OAAO;EACpC,eAAe;GAAE,SAAS;GAAM,wBAAwB;GAAM;EAC9D,gBAAgB;GACd,eAAe;GACf,qBAAqB;GACrB,kBAAkB;GAClB,iBAAiB;GAClB;EACD,SAAS;GAAE,mBAAmB;GAAM,sBAAsB;GAAM,qBAAqB;GAAQ;EAC7F,QAAQ,EAAE,OAAO;GAAC;GAAkB;GAAY;GAAY,EAAE;EAC9D,sBAAsB,EAAE,SAAS,OAAO;EACxC,cAAc,EAAE,SAAS,OAAO;EAChC,iBAAiB,EAAE,SAAS,OAAO;EACnC,YAAY,EAAE,kBAAkB,MAAM;EACtC,kBAAkB,EAAE,SAAS,OAAO;EACpC,eAAe,EAAE,SAAS,OAAO;EACjC,iBAAiB,EAAE,SAAS,OAAO;EACnC,cAAc,EAAE,SAAS,OAAO;EAChC,YAAY,EAAE,SAAS,OAAO;EAC9B,SAAS,EAAE,SAAS,OAAO;EAC3B,oBAAoB,EAAE,SAAS,OAAO;EACtC,WAAW,EAAE,SAAS,OAAO;EAC7B,oBAAoB,EAAE,SAAS,OAAO;EACtC,WAAW,EAAE,SAAS,OAAO;EAC7B,WAAW;EACZ;CACD,UAAU;EACR,aAAa;EACb,YAAY;GACV,SAAS;GACT,uBAAuB;GACvB,cAAc,EAAE,SAAS,MAAM;GAC/B,aAAa,EAAE,SAAS,MAAM;GAC/B;EACD,cAAc;GAAE,SAAS;GAAM,mBAAmB;GAAM;EACxD,aAAa;GAAE,YAAY;GAAM,aAAa,EAAE,WAAW,MAAM;GAAE;EACnE,OAAO;GAAE,aAAa;GAAM,qBAAqB;GAAM;EACvD,OAAO;GAAE,SAAS;GAAM,UAAU;GAAM,aAAa;GAAM,oBAAoB;GAAO,cAAc;GAAK;EACzG,YAAY;GAAE,SAAS;GAAM,2BAA2B;GAAM;EAC9D,YAAY,EAAE,SAAS,MAAM;EAC7B,KAAK,EAAE,SAAS,MAAM;EACtB,kBAAkB,EAAE,WAAW,MAAM;EACrC,kBAAkB,EAAE,SAAS,OAAO;EACpC,eAAe;GAAE,SAAS;GAAM,wBAAwB;GAAM;EAC9D,gBAAgB;GACd,eAAe;GACf,qBAAqB;GACrB,kBAAkB;GAClB,iBAAiB;GAClB;EAED,QAAQ,EAAE,OAAO;GAAC;GAAkB;GAAY;GAAY,EAAE;EAC9D,SAAS;GAAE,mBAAmB;GAAM,sBAAsB;GAAM,qBAAqB;GAAe;EACpG,sBAAsB,EAAE,SAAS,OAAO;EACxC,cAAc,EAAE,SAAS,OAAO;EAChC,iBAAiB,EAAE,SAAS,OAAO;EACnC,YAAY,EAAE,kBAAkB,MAAM;EACtC,kBAAkB,EAAE,SAAS,OAAO;EACpC,eAAe,EAAE,SAAS,OAAO;EACjC,iBAAiB,EAAE,SAAS,OAAO;EACnC,cAAc,EAAE,SAAS,OAAO;EAChC,YAAY,EAAE,SAAS,OAAO;EAC9B,SAAS,EAAE,SAAS,OAAO;EAC3B,oBAAoB,EAAE,SAAS,OAAO;EACtC,WAAW,EAAE,SAAS,OAAO;EAC7B,oBAAoB,EAAE,SAAS,OAAO;EACtC,WAAW,EAAE,SAAS,OAAO;EAC7B,WAAW;EACZ;CACF;;;;;;AAOD,SAAgB,mBAAmB,WAAgD;CACjF,OAAO,cAAc,WAAW,cAAc"}
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../config/utils.ts"],"sourcesContent":["import type { ConfigMode, VerbosityLevel } from \"./types/index.js\";\n\n/** Default categories — can be extended via config.categories */\nexport const DEFAULT_MEMORY_CATEGORIES = [\n \"preference\",\n \"fact\",\n \"decision\",\n \"entity\",\n \"pattern\",\n \"rule\",\n \"edict\",\n \"other\",\n /** Operational / agent categories (audit #1193 — avoids “unknown category” drift on long-lived stores). Remap legacy `forge_*` → `forge` and `episode` → `ops_summary` via `categories remap`. */\n \"forge\",\n \"monitoring\",\n \"ops_status\",\n \"ops_summary\",\n \"coding_task\",\n \"quality_loop\",\n \"topic_labels\",\n] as const;\n\n/** Runtime categories: starts as defaults, extended by config */\nlet _runtimeCategories: string[] = [...DEFAULT_MEMORY_CATEGORIES];\n\nexport function getMemoryCategories(): readonly string[] {\n return _runtimeCategories;\n}\n\nexport function setMemoryCategories(categories: string[]): void {\n // Always include defaults + any custom ones, deduplicated\n const merged = new Set([...DEFAULT_MEMORY_CATEGORIES, ...categories]);\n _runtimeCategories = [...merged];\n}\n\nexport function isValidCategory(cat: string): boolean {\n return _runtimeCategories.includes(cat);\n}\n\n/** Preset overrides per mode. Merged under user config so user keys win. See CONFIGURATION-MODES.md. */\nexport const PRESET_OVERRIDES: Record<ConfigMode, Record<string, unknown>> = {\n local: {\n autoCapture: true,\n /** Credentials vault on; set `credentials.encryptionKey` (16+ chars or env:VAR) for encryption at rest. */\n credentials: { enabled: true },\n autoRecall: {\n enabled: true,\n interactiveEnrichment: \"fast\",\n entityLookup: { enabled: false },\n authFailure: { enabled: false },\n },\n autoClassify: { enabled: false, suggestCategories: false },\n store: { fuzzyDedupe: true, classifyBeforeWrite: false },\n graph: { enabled: false },\n procedures: { enabled: false },\n reflection: { enabled: false },\n wal: { enabled: true },\n languageKeywords: { autoBuild: false },\n personaProposals: { enabled: false },\n memoryTiering: { enabled: false },\n distill: { extractDirectives: true, extractReinforcement: false },\n verbosity: \"quiet\",\n /** FTS-only recall and capture: no embedding/vector/LLM calls; local SQLite + files only. */\n retrieval: { strategies: [\"fts5\"] },\n },\n /** Minimal: nano for auto-classify, default (flash) for distill — good value at low cost. Ingest paths on so occasional ingest-files gets facts. */\n minimal: {\n autoCapture: true,\n credentials: { enabled: true },\n autoRecall: {\n enabled: true,\n interactiveEnrichment: \"fast\",\n entityLookup: { enabled: false },\n authFailure: { enabled: true },\n },\n autoClassify: { enabled: true, suggestCategories: true },\n store: { fuzzyDedupe: false, classifyBeforeWrite: false },\n graph: { enabled: true, autoLink: false, useInRecall: true, strengthenOnRecall: false, hubDegreeCap: 500 },\n procedures: { enabled: true, requireApprovalForPromote: true },\n reflection: { enabled: false },\n wal: { enabled: true },\n languageKeywords: { autoBuild: true },\n personaProposals: { enabled: false },\n memoryTiering: { enabled: true, compactionOnSessionEnd: true },\n distill: { extractDirectives: true, extractReinforcement: true, extractionModelTier: \"nano\" },\n ingest: { paths: [\"skills/**/*.md\", \"TOOLS.md\", \"AGENTS.md\"] },\n verbosity: \"normal\",\n },\n enhanced: {\n autoCapture: true,\n autoRecall: {\n enabled: true,\n interactiveEnrichment: \"fast\",\n entityLookup: { enabled: true },\n authFailure: { enabled: true },\n },\n autoClassify: { enabled: true, suggestCategories: true },\n credentials: { autoDetect: true, autoCapture: { toolCalls: true } },\n store: { fuzzyDedupe: true, classifyBeforeWrite: true },\n graph: { enabled: true, autoLink: true, useInRecall: true, strengthenOnRecall: false, hubDegreeCap: 500 },\n procedures: { enabled: true, requireApprovalForPromote: true },\n reflection: { enabled: true },\n wal: { enabled: true },\n languageKeywords: { autoBuild: true },\n personaProposals: { enabled: false },\n memoryTiering: { enabled: true, compactionOnSessionEnd: true },\n selfCorrection: {\n semanticDedup: true,\n applyToolsByDefault: true,\n autoRewriteTools: false,\n analyzeViaSpawn: false,\n },\n distill: { extractDirectives: true, extractReinforcement: true, extractionModelTier: \"nano\" },\n ingest: { paths: [\"skills/**/*.md\", \"TOOLS.md\", \"AGENTS.md\"] },\n frustrationDetection: { enabled: false },\n nightlyCycle: { enabled: false },\n passiveObserver: { enabled: false },\n extraction: { extractionPasses: true },\n workflowTracking: { enabled: false },\n selfExtension: { enabled: false },\n crystallization: { enabled: false },\n verification: { enabled: false },\n provenance: { enabled: false },\n aliases: { enabled: false },\n crossAgentLearning: { enabled: false },\n reranking: { enabled: false },\n contextualVariants: { enabled: false },\n documents: { enabled: false },\n verbosity: \"normal\",\n },\n complete: {\n autoCapture: true,\n autoRecall: {\n enabled: true,\n interactiveEnrichment: \"fast\",\n entityLookup: { enabled: true },\n authFailure: { enabled: true },\n },\n autoClassify: { enabled: true, suggestCategories: true },\n credentials: { autoDetect: true, autoCapture: { toolCalls: true } },\n store: { fuzzyDedupe: true, classifyBeforeWrite: true },\n graph: { enabled: true, autoLink: true, useInRecall: true, strengthenOnRecall: false, hubDegreeCap: 500 },\n procedures: { enabled: true, requireApprovalForPromote: true },\n reflection: { enabled: true },\n wal: { enabled: true },\n languageKeywords: { autoBuild: true },\n personaProposals: { enabled: false },\n memoryTiering: { enabled: true, compactionOnSessionEnd: true },\n selfCorrection: {\n semanticDedup: true,\n applyToolsByDefault: true,\n autoRewriteTools: false,\n analyzeViaSpawn: false,\n },\n // queryExpansion not set in preset — defaults to disabled; set explicitly to enable.\n ingest: { paths: [\"skills/**/*.md\", \"TOOLS.md\", \"AGENTS.md\"] },\n distill: { extractDirectives: true, extractReinforcement: true, extractionModelTier: \"maintenance\" },\n frustrationDetection: { enabled: false },\n nightlyCycle: { enabled: false },\n passiveObserver: { enabled: false },\n extraction: { extractionPasses: true },\n workflowTracking: { enabled: false },\n selfExtension: { enabled: false },\n crystallization: { enabled: false },\n verification: { enabled: false },\n provenance: { enabled: false },\n aliases: { enabled: false },\n crossAgentLearning: { enabled: false },\n reranking: { enabled: false },\n contextualVariants: { enabled: false },\n documents: { enabled: false },\n verbosity: \"verbose\",\n },\n};\n\n/**\n * Check if verbosity level is in \"compact mode\" (quiet or silent).\n * Compact mode suppresses verbose output and only shows minimal information.\n * Use this helper instead of inline checks to ensure consistent behavior across the codebase.\n */\nexport function isCompactVerbosity(verbosity: VerbosityLevel | undefined): boolean {\n return verbosity === \"quiet\" || verbosity === \"silent\";\n}\n"],"mappings":";;AAGA,MAAa,4BAA4B;CACvC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AAGA,IAAI,qBAA+B,CAAC,GAAG,yBAAyB;AAEhE,SAAgB,sBAAyC;CACvD,OAAO;AACT;AAEA,SAAgB,oBAAoB,YAA4B;CAG9D,qBAAqB,CAAC,GAAG,IADN,IAAI,CAAC,GAAG,2BAA2B,GAAG,UAAU,CACrC,CAAC;AACjC;AAEA,SAAgB,gBAAgB,KAAsB;CACpD,OAAO,mBAAmB,SAAS,GAAG;AACxC;;AAGA,MAAa,mBAAgE;CAC3E,OAAO;EACL,aAAa;;EAEb,aAAa,EAAE,SAAS,KAAK;EAC7B,YAAY;GACV,SAAS;GACT,uBAAuB;GACvB,cAAc,EAAE,SAAS,MAAM;GAC/B,aAAa,EAAE,SAAS,MAAM;EAChC;EACA,cAAc;GAAE,SAAS;GAAO,mBAAmB;EAAM;EACzD,OAAO;GAAE,aAAa;GAAM,qBAAqB;EAAM;EACvD,OAAO,EAAE,SAAS,MAAM;EACxB,YAAY,EAAE,SAAS,MAAM;EAC7B,YAAY,EAAE,SAAS,MAAM;EAC7B,KAAK,EAAE,SAAS,KAAK;EACrB,kBAAkB,EAAE,WAAW,MAAM;EACrC,kBAAkB,EAAE,SAAS,MAAM;EACnC,eAAe,EAAE,SAAS,MAAM;EAChC,SAAS;GAAE,mBAAmB;GAAM,sBAAsB;EAAM;EAChE,WAAW;;EAEX,WAAW,EAAE,YAAY,CAAC,MAAM,EAAE;CACpC;;CAEA,SAAS;EACP,aAAa;EACb,aAAa,EAAE,SAAS,KAAK;EAC7B,YAAY;GACV,SAAS;GACT,uBAAuB;GACvB,cAAc,EAAE,SAAS,MAAM;GAC/B,aAAa,EAAE,SAAS,KAAK;EAC/B;EACA,cAAc;GAAE,SAAS;GAAM,mBAAmB;EAAK;EACvD,OAAO;GAAE,aAAa;GAAO,qBAAqB;EAAM;EACxD,OAAO;GAAE,SAAS;GAAM,UAAU;GAAO,aAAa;GAAM,oBAAoB;GAAO,cAAc;EAAI;EACzG,YAAY;GAAE,SAAS;GAAM,2BAA2B;EAAK;EAC7D,YAAY,EAAE,SAAS,MAAM;EAC7B,KAAK,EAAE,SAAS,KAAK;EACrB,kBAAkB,EAAE,WAAW,KAAK;EACpC,kBAAkB,EAAE,SAAS,MAAM;EACnC,eAAe;GAAE,SAAS;GAAM,wBAAwB;EAAK;EAC7D,SAAS;GAAE,mBAAmB;GAAM,sBAAsB;GAAM,qBAAqB;EAAO;EAC5F,QAAQ,EAAE,OAAO;GAAC;GAAkB;GAAY;EAAW,EAAE;EAC7D,WAAW;CACb;CACA,UAAU;EACR,aAAa;EACb,YAAY;GACV,SAAS;GACT,uBAAuB;GACvB,cAAc,EAAE,SAAS,KAAK;GAC9B,aAAa,EAAE,SAAS,KAAK;EAC/B;EACA,cAAc;GAAE,SAAS;GAAM,mBAAmB;EAAK;EACvD,aAAa;GAAE,YAAY;GAAM,aAAa,EAAE,WAAW,KAAK;EAAE;EAClE,OAAO;GAAE,aAAa;GAAM,qBAAqB;EAAK;EACtD,OAAO;GAAE,SAAS;GAAM,UAAU;GAAM,aAAa;GAAM,oBAAoB;GAAO,cAAc;EAAI;EACxG,YAAY;GAAE,SAAS;GAAM,2BAA2B;EAAK;EAC7D,YAAY,EAAE,SAAS,KAAK;EAC5B,KAAK,EAAE,SAAS,KAAK;EACrB,kBAAkB,EAAE,WAAW,KAAK;EACpC,kBAAkB,EAAE,SAAS,MAAM;EACnC,eAAe;GAAE,SAAS;GAAM,wBAAwB;EAAK;EAC7D,gBAAgB;GACd,eAAe;GACf,qBAAqB;GACrB,kBAAkB;GAClB,iBAAiB;EACnB;EACA,SAAS;GAAE,mBAAmB;GAAM,sBAAsB;GAAM,qBAAqB;EAAO;EAC5F,QAAQ,EAAE,OAAO;GAAC;GAAkB;GAAY;EAAW,EAAE;EAC7D,sBAAsB,EAAE,SAAS,MAAM;EACvC,cAAc,EAAE,SAAS,MAAM;EAC/B,iBAAiB,EAAE,SAAS,MAAM;EAClC,YAAY,EAAE,kBAAkB,KAAK;EACrC,kBAAkB,EAAE,SAAS,MAAM;EACnC,eAAe,EAAE,SAAS,MAAM;EAChC,iBAAiB,EAAE,SAAS,MAAM;EAClC,cAAc,EAAE,SAAS,MAAM;EAC/B,YAAY,EAAE,SAAS,MAAM;EAC7B,SAAS,EAAE,SAAS,MAAM;EAC1B,oBAAoB,EAAE,SAAS,MAAM;EACrC,WAAW,EAAE,SAAS,MAAM;EAC5B,oBAAoB,EAAE,SAAS,MAAM;EACrC,WAAW,EAAE,SAAS,MAAM;EAC5B,WAAW;CACb;CACA,UAAU;EACR,aAAa;EACb,YAAY;GACV,SAAS;GACT,uBAAuB;GACvB,cAAc,EAAE,SAAS,KAAK;GAC9B,aAAa,EAAE,SAAS,KAAK;EAC/B;EACA,cAAc;GAAE,SAAS;GAAM,mBAAmB;EAAK;EACvD,aAAa;GAAE,YAAY;GAAM,aAAa,EAAE,WAAW,KAAK;EAAE;EAClE,OAAO;GAAE,aAAa;GAAM,qBAAqB;EAAK;EACtD,OAAO;GAAE,SAAS;GAAM,UAAU;GAAM,aAAa;GAAM,oBAAoB;GAAO,cAAc;EAAI;EACxG,YAAY;GAAE,SAAS;GAAM,2BAA2B;EAAK;EAC7D,YAAY,EAAE,SAAS,KAAK;EAC5B,KAAK,EAAE,SAAS,KAAK;EACrB,kBAAkB,EAAE,WAAW,KAAK;EACpC,kBAAkB,EAAE,SAAS,MAAM;EACnC,eAAe;GAAE,SAAS;GAAM,wBAAwB;EAAK;EAC7D,gBAAgB;GACd,eAAe;GACf,qBAAqB;GACrB,kBAAkB;GAClB,iBAAiB;EACnB;EAEA,QAAQ,EAAE,OAAO;GAAC;GAAkB;GAAY;EAAW,EAAE;EAC7D,SAAS;GAAE,mBAAmB;GAAM,sBAAsB;GAAM,qBAAqB;EAAc;EACnG,sBAAsB,EAAE,SAAS,MAAM;EACvC,cAAc,EAAE,SAAS,MAAM;EAC/B,iBAAiB,EAAE,SAAS,MAAM;EAClC,YAAY,EAAE,kBAAkB,KAAK;EACrC,kBAAkB,EAAE,SAAS,MAAM;EACnC,eAAe,EAAE,SAAS,MAAM;EAChC,iBAAiB,EAAE,SAAS,MAAM;EAClC,cAAc,EAAE,SAAS,MAAM;EAC/B,YAAY,EAAE,SAAS,MAAM;EAC7B,SAAS,EAAE,SAAS,MAAM;EAC1B,oBAAoB,EAAE,SAAS,MAAM;EACrC,WAAW,EAAE,SAAS,MAAM;EAC5B,oBAAoB,EAAE,SAAS,MAAM;EACrC,WAAW,EAAE,SAAS,MAAM;EAC5B,WAAW;CACb;AACF;;;;;;AAOA,SAAgB,mBAAmB,WAAgD;CACjF,OAAO,cAAc,WAAW,cAAc;AAChD"}
@@ -1 +1 @@
1
- {"version":3,"file":"index-help.js","names":[],"sources":["../index-help.ts"],"sourcesContent":["/** Exported for tests. Stops at `--` so `hybrid-mem store -- --help` is not treated as plugin-level help. */\nexport function isHybridMemHelpInvocation(argv: string[]): boolean {\n const hybridIdx = argv.indexOf(\"hybrid-mem\");\n if (hybridIdx === -1) return false;\n for (let i = hybridIdx + 1; i < argv.length; i++) {\n const a = argv[i];\n if (a === \"--\") break;\n if (a === \"--help\" || a === \"-h\") return true;\n }\n return false;\n}\n"],"mappings":";;AACA,SAAgB,0BAA0B,MAAyB;CACjE,MAAM,YAAY,KAAK,QAAQ,aAAa;CAC5C,IAAI,cAAc,IAAI,OAAO;CAC7B,KAAK,IAAI,IAAI,YAAY,GAAG,IAAI,KAAK,QAAQ,KAAK;EAChD,MAAM,IAAI,KAAK;EACf,IAAI,MAAM,MAAM;EAChB,IAAI,MAAM,YAAY,MAAM,MAAM,OAAO;;CAE3C,OAAO"}
1
+ {"version":3,"file":"index-help.js","names":[],"sources":["../index-help.ts"],"sourcesContent":["/** Exported for tests. Stops at `--` so `hybrid-mem store -- --help` is not treated as plugin-level help. */\nexport function isHybridMemHelpInvocation(argv: string[]): boolean {\n const hybridIdx = argv.indexOf(\"hybrid-mem\");\n if (hybridIdx === -1) return false;\n for (let i = hybridIdx + 1; i < argv.length; i++) {\n const a = argv[i];\n if (a === \"--\") break;\n if (a === \"--help\" || a === \"-h\") return true;\n }\n return false;\n}\n"],"mappings":";;AACA,SAAgB,0BAA0B,MAAyB;CACjE,MAAM,YAAY,KAAK,QAAQ,YAAY;CAC3C,IAAI,cAAc,IAAI,OAAO;CAC7B,KAAK,IAAI,IAAI,YAAY,GAAG,IAAI,KAAK,QAAQ,KAAK;EAChD,MAAM,IAAI,KAAK;EACf,IAAI,MAAM,MAAM;EAChB,IAAI,MAAM,YAAY,MAAM,MAAM,OAAO;CAC3C;CACA,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"index-testing-exports.js","names":[],"sources":["../index-testing-exports.ts"],"sourcesContent":["/**\n * Test-only exports from the hybrid memory plugin (split from index.ts).\n */\nimport { FactsDB } from \"./backends/facts-db.js\";\nimport { VectorDB } from \"./backends/vector-db.js\";\nimport { WriteAheadLog } from \"./backends/wal.js\";\nimport { buildInstallDefaults, deepMerge } from \"./cli/handlers.js\";\nimport { Embeddings, safeEmbed } from \"./services/embeddings.js\";\nimport { buildFts5Query, rebuildFtsIndex, searchFts } from \"./services/fts-search.js\";\nimport { HOP_SCORE_DECAY, expandGraph, formatLinkPath } from \"./services/graph-retrieval.js\";\nimport { filterByScope, mergeResults } from \"./services/merge-results.js\";\nimport {\n DEFAULT_RETRIEVAL_CONFIG,\n estimateTokenCount,\n packIntoBudget,\n runExplicitDeepRetrieval,\n serializeFactForContext,\n} from \"./services/retrieval-orchestrator.js\";\nimport { RRF_K_DEFAULT, applyPostRrfAdjustments, fuseResults } from \"./services/rrf-fusion.js\";\nexport type {\n GraphExpandedResult,\n GraphExpansionStats,\n GraphFactLookup,\n GraphRetrievalOptions,\n LinkPathStep,\n} from \"./services/graph-retrieval.js\";\nexport { DEFAULT_GRAPH_HUB_DEGREE_CAP, resolveGraphHubDegreeCap } from \"./services/graph-retrieval.js\";\nexport * from \"./services/pending-autopilot/index.js\";\nexport {\n PERSONA_APPLY_CONFIDENCE_THRESHOLD,\n PERSONA_PROPOSAL_TRIAGE_POLICY_VERSION,\n PERSONA_REJECT_CONFIDENCE_THRESHOLD,\n createPersonaProposalTriageAdapter,\n decidePersonaProposal,\n renderPersonaProposalTriageHumanSummary,\n runPersonaProposalTriage,\n stablePersonaProposalTriageJson,\n validatePersonaPolicy,\n} from \"./services/persona-proposal-triage.js\";\nexport type {\n PersonaProposalDecisionView,\n PersonaProposalPendingItem,\n PersonaProposalReviewBundle,\n PersonaProposalRisk,\n PersonaProposalTriageOptions,\n PersonaProposalTriagePolicy,\n PersonaProposalTriageResult,\n} from \"./services/persona-proposal-triage.js\";\nimport { findShortestPath, formatPath, resolveInput } from \"./services/shortest-path.js\";\nexport type { ShortestPathResult, PathStep, ShortestPathLookup } from \"./services/shortest-path.js\";\nimport {\n analyzeKnowledgeGaps,\n computeIsolationScore,\n computeRankScore,\n detectOrphans,\n detectSuggestedLinks,\n detectWeak,\n} from \"./services/knowledge-gaps.js\";\nexport type {\n GapFact,\n SuggestedLink,\n KnowledgeGapReport,\n GapMode,\n GapFactsDB,\n GapVectorDB,\n GapEmbeddings,\n} from \"./services/knowledge-gaps.js\";\nimport { detectClusters, generateClusterLabel } from \"./services/topic-clusters.js\";\nexport type {\n TopicCluster,\n ClusterDetectionResult,\n ClusterDetectionOptions,\n ClusterFactLookup,\n} from \"./services/topic-clusters.js\";\nimport {\n detectCredentialPatterns,\n extractCredentialMatch,\n inferServiceFromText,\n isCredentialLike,\n} from \"./services/auto-capture.js\";\nimport { normalizeSuggestedLabel } from \"./services/auto-classifier.js\";\nimport { parseClassificationResponse } from \"./services/classification.js\";\nimport { getRoot, isStructuredForConsolidation, runConsolidate, unionFind } from \"./services/consolidation.js\";\nimport { extractStructuredFields } from \"./services/fact-extraction.js\";\nimport {\n dotProductSimilarity,\n loadReflectionDedupeCorpusVectors,\n normalizeVector,\n parsePatternsFromReflectionResponse,\n} from \"./services/reflection.js\";\nimport { AliasDB, generateAliases, searchAliasStrategy, storeAliases } from \"./services/retrieval-aliases.js\";\nimport { findSimilarByEmbedding } from \"./services/vector-search.js\";\nimport { parseSourceDate } from \"./utils/dates.js\";\nimport { calculateExpiry, classifyDecay } from \"./utils/decay.js\";\nimport { isHybridMemJsonInvocation } from \"./utils/hybrid-mem-json-cli.js\";\n\nexport { isHybridMemJsonInvocation };\nimport {\n extractTags,\n normalizeTextForDedupe,\n normalizedHash,\n parseTags,\n serializeTags,\n tagsContains,\n} from \"./utils/tags.js\";\nimport {\n estimateTokens,\n estimateTokensForDisplay,\n formatProgressiveIndexLine,\n truncateForStorage,\n truncateText,\n} from \"./utils/text.js\";\nimport { CredentialsDB, decryptValue, deriveKey, encryptValue } from \"./backends/credentials-db.js\";\nimport { CrystallizationStore } from \"./backends/crystallization-store.js\";\nimport { EventBus, computeFingerprint } from \"./backends/event-bus.js\";\nimport { EventLog } from \"./backends/event-log.js\";\nimport { IssueStore } from \"./backends/issue-store.js\";\nimport { LearningsDB } from \"./backends/learnings-db.js\";\nimport { ProposalsDB } from \"./backends/proposals-db.js\";\nimport { ToolProposalStore } from \"./backends/tool-proposal-store.js\";\nimport {\n WorkflowStore,\n extractGoalKeywords,\n hashToolSequence,\n sequenceDistance,\n sequenceSimilarity,\n} from \"./backends/workflow-store.js\";\nimport { CrystallizationProposer } from \"./services/crystallization-proposer.js\";\nimport { GapDetector, computeGapId, deriveToolNameFromSequence } from \"./services/gap-detector.js\";\nimport {\n computeEvidenceHash,\n computeLegacyEvidenceHash,\n computePatternId,\n detectCrystallizationCandidates,\n scorePattern,\n} from \"./services/pattern-detector.js\";\nimport { ProvenanceService } from \"./services/provenance.js\";\nimport {\n buildExamplesText,\n crystallizeSkill,\n deriveSkillName,\n inferCategory,\n isExecOnlySequence,\n} from \"./services/skill-crystallizer.js\";\nimport { SkillValidator, buildNonPlaceholderEmailPattern } from \"./services/skill-validator.js\";\nimport { ToolProposer } from \"./services/tool-proposer.js\";\nimport { VerificationError, VerificationStore, shouldAutoVerify } from \"./services/verification-store.js\";\nimport { WorkflowTracker } from \"./services/workflow-tracker.js\";\nimport { detectCategory } from \"./setup/register-plugin.js\";\nimport { isHybridMemHelpInvocation } from \"./index-help.js\";\n\nexport const _testing = {\n // Utility functions\n normalizeTextForDedupe,\n normalizedHash,\n truncateText,\n truncateForStorage,\n isHybridMemHelpInvocation,\n isHybridMemJsonInvocation,\n extractTags,\n serializeTags,\n parseTags,\n tagsContains,\n parseSourceDate,\n estimateTokens,\n estimateTokensForDisplay,\n formatProgressiveIndexLine,\n classifyDecay,\n calculateExpiry,\n extractStructuredFields,\n detectCategory,\n detectCredentialPatterns,\n extractCredentialMatch,\n isCredentialLike,\n inferServiceFromText,\n isStructuredForConsolidation,\n runConsolidate,\n normalizeSuggestedLabel,\n unionFind,\n getRoot,\n mergeResults,\n filterByScope,\n safeEmbed,\n deepMerge,\n buildInstallDefaults,\n // Encryption primitives (used by CredentialsDB)\n deriveKey,\n encryptValue,\n decryptValue,\n // Classes for testing\n FactsDB,\n CredentialsDB,\n ProposalsDB,\n EventLog,\n EventBus,\n computeFingerprint,\n VectorDB,\n Embeddings,\n WriteAheadLog,\n // Classification (for tests)\n parseClassificationResponse,\n findSimilarByEmbedding,\n // Reflection parsing (for tests) - re-exported from service\n parsePatternsFromReflectionResponse,\n loadReflectionDedupeCorpusVectors,\n normalizeVector,\n dotProductSimilarity,\n // FTS5 search service (Issue #151)\n searchFts,\n rebuildFtsIndex,\n buildFts5Query,\n // RRF scoring pipeline (Issue #152)\n fuseResults,\n applyPostRrfAdjustments,\n RRF_K_DEFAULT,\n runExplicitDeepRetrieval,\n packIntoBudget,\n serializeFactForContext,\n estimateTokenCount,\n DEFAULT_RETRIEVAL_CONFIG,\n // GraphRAG retrieval (Issue #145)\n expandGraph,\n formatLinkPath,\n HOP_SCORE_DECAY,\n // Shortest-path traversal (Issue #140)\n findShortestPath,\n resolveInput,\n formatPath,\n // Knowledge gap analysis (Issue #141)\n analyzeKnowledgeGaps,\n detectOrphans,\n detectWeak,\n detectSuggestedLinks,\n computeIsolationScore,\n computeRankScore,\n // Topic cluster detection (Issue #146)\n detectClusters,\n generateClusterLabel,\n // Retrieval aliases (Issue #149)\n AliasDB,\n generateAliases,\n storeAliases,\n searchAliasStrategy,\n // Issue lifecycle tracking (Issue #137)\n IssueStore,\n // Workflow trace tracking (Issue #209)\n WorkflowStore,\n WorkflowTracker,\n sequenceDistance,\n sequenceSimilarity,\n extractGoalKeywords,\n hashToolSequence,\n // Workflow crystallization (Issue #208)\n CrystallizationStore,\n detectCrystallizationCandidates,\n crystallizeSkill,\n SkillValidator,\n buildNonPlaceholderEmailPattern,\n CrystallizationProposer,\n computePatternId,\n computeEvidenceHash,\n computeLegacyEvidenceHash,\n scorePattern,\n deriveSkillName,\n isExecOnlySequence,\n buildExamplesText,\n inferCategory,\n // Plugin self-extension (Issue #210)\n ToolProposalStore,\n GapDetector,\n ToolProposer,\n computeGapId,\n deriveToolNameFromSequence,\n // Verification store for critical facts (Issue #162)\n VerificationStore,\n shouldAutoVerify,\n VerificationError,\n // Provenance tracing (Issue #163)\n ProvenanceService,\n // Learnings intake buffer — staged memory promotion (Issue #617)\n LearningsDB,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuJA,MAAa,WAAW;CAEtB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CAEA;CACA;CACA;CACA;CAEA;CACA;CACA;CAEA;CACA;CACA,eAAA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CAEA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CAEA;CACA;CACA;CACA;CAEA;CAEA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CAEA;CAEA;CACD"}
1
+ {"version":3,"file":"index-testing-exports.js","names":[],"sources":["../index-testing-exports.ts"],"sourcesContent":["/**\n * Test-only exports from the hybrid memory plugin (split from index.ts).\n */\nimport { FactsDB } from \"./backends/facts-db.js\";\nimport { VectorDB } from \"./backends/vector-db.js\";\nimport { WriteAheadLog } from \"./backends/wal.js\";\nimport { buildInstallDefaults, deepMerge } from \"./cli/handlers.js\";\nimport { Embeddings, safeEmbed } from \"./services/embeddings.js\";\nimport { buildFts5Query, rebuildFtsIndex, searchFts } from \"./services/fts-search.js\";\nimport { HOP_SCORE_DECAY, expandGraph, formatLinkPath } from \"./services/graph-retrieval.js\";\nimport { filterByScope, mergeResults } from \"./services/merge-results.js\";\nimport {\n DEFAULT_RETRIEVAL_CONFIG,\n estimateTokenCount,\n packIntoBudget,\n runExplicitDeepRetrieval,\n serializeFactForContext,\n} from \"./services/retrieval-orchestrator.js\";\nimport { RRF_K_DEFAULT, applyPostRrfAdjustments, fuseResults } from \"./services/rrf-fusion.js\";\nexport type {\n GraphExpandedResult,\n GraphExpansionStats,\n GraphFactLookup,\n GraphRetrievalOptions,\n LinkPathStep,\n} from \"./services/graph-retrieval.js\";\nexport { DEFAULT_GRAPH_HUB_DEGREE_CAP, resolveGraphHubDegreeCap } from \"./services/graph-retrieval.js\";\nexport * from \"./services/pending-autopilot/index.js\";\nexport {\n PERSONA_APPLY_CONFIDENCE_THRESHOLD,\n PERSONA_PROPOSAL_TRIAGE_POLICY_VERSION,\n PERSONA_REJECT_CONFIDENCE_THRESHOLD,\n createPersonaProposalTriageAdapter,\n decidePersonaProposal,\n renderPersonaProposalTriageHumanSummary,\n runPersonaProposalTriage,\n stablePersonaProposalTriageJson,\n validatePersonaPolicy,\n} from \"./services/persona-proposal-triage.js\";\nexport type {\n PersonaProposalDecisionView,\n PersonaProposalPendingItem,\n PersonaProposalReviewBundle,\n PersonaProposalRisk,\n PersonaProposalTriageOptions,\n PersonaProposalTriagePolicy,\n PersonaProposalTriageResult,\n} from \"./services/persona-proposal-triage.js\";\nimport { findShortestPath, formatPath, resolveInput } from \"./services/shortest-path.js\";\nexport type { ShortestPathResult, PathStep, ShortestPathLookup } from \"./services/shortest-path.js\";\nimport {\n analyzeKnowledgeGaps,\n computeIsolationScore,\n computeRankScore,\n detectOrphans,\n detectSuggestedLinks,\n detectWeak,\n} from \"./services/knowledge-gaps.js\";\nexport type {\n GapFact,\n SuggestedLink,\n KnowledgeGapReport,\n GapMode,\n GapFactsDB,\n GapVectorDB,\n GapEmbeddings,\n} from \"./services/knowledge-gaps.js\";\nimport { detectClusters, generateClusterLabel } from \"./services/topic-clusters.js\";\nexport type {\n TopicCluster,\n ClusterDetectionResult,\n ClusterDetectionOptions,\n ClusterFactLookup,\n} from \"./services/topic-clusters.js\";\nimport {\n detectCredentialPatterns,\n extractCredentialMatch,\n inferServiceFromText,\n isCredentialLike,\n} from \"./services/auto-capture.js\";\nimport { normalizeSuggestedLabel } from \"./services/auto-classifier.js\";\nimport { parseClassificationResponse } from \"./services/classification.js\";\nimport { getRoot, isStructuredForConsolidation, runConsolidate, unionFind } from \"./services/consolidation.js\";\nimport { extractStructuredFields } from \"./services/fact-extraction.js\";\nimport {\n dotProductSimilarity,\n loadReflectionDedupeCorpusVectors,\n normalizeVector,\n parsePatternsFromReflectionResponse,\n} from \"./services/reflection.js\";\nimport { AliasDB, generateAliases, searchAliasStrategy, storeAliases } from \"./services/retrieval-aliases.js\";\nimport { findSimilarByEmbedding } from \"./services/vector-search.js\";\nimport { parseSourceDate } from \"./utils/dates.js\";\nimport { calculateExpiry, classifyDecay } from \"./utils/decay.js\";\nimport { isHybridMemJsonInvocation } from \"./utils/hybrid-mem-json-cli.js\";\n\nexport { isHybridMemJsonInvocation };\nimport {\n extractTags,\n normalizeTextForDedupe,\n normalizedHash,\n parseTags,\n serializeTags,\n tagsContains,\n} from \"./utils/tags.js\";\nimport {\n estimateTokens,\n estimateTokensForDisplay,\n formatProgressiveIndexLine,\n truncateForStorage,\n truncateText,\n} from \"./utils/text.js\";\nimport { CredentialsDB, decryptValue, deriveKey, encryptValue } from \"./backends/credentials-db.js\";\nimport { CrystallizationStore } from \"./backends/crystallization-store.js\";\nimport { EventBus, computeFingerprint } from \"./backends/event-bus.js\";\nimport { EventLog } from \"./backends/event-log.js\";\nimport { IssueStore } from \"./backends/issue-store.js\";\nimport { LearningsDB } from \"./backends/learnings-db.js\";\nimport { ProposalsDB } from \"./backends/proposals-db.js\";\nimport { ToolProposalStore } from \"./backends/tool-proposal-store.js\";\nimport {\n WorkflowStore,\n extractGoalKeywords,\n hashToolSequence,\n sequenceDistance,\n sequenceSimilarity,\n} from \"./backends/workflow-store.js\";\nimport { CrystallizationProposer } from \"./services/crystallization-proposer.js\";\nimport { GapDetector, computeGapId, deriveToolNameFromSequence } from \"./services/gap-detector.js\";\nimport {\n computeEvidenceHash,\n computeLegacyEvidenceHash,\n computePatternId,\n detectCrystallizationCandidates,\n scorePattern,\n} from \"./services/pattern-detector.js\";\nimport { ProvenanceService } from \"./services/provenance.js\";\nimport {\n buildExamplesText,\n crystallizeSkill,\n deriveSkillName,\n inferCategory,\n isExecOnlySequence,\n} from \"./services/skill-crystallizer.js\";\nimport { SkillValidator, buildNonPlaceholderEmailPattern } from \"./services/skill-validator.js\";\nimport { ToolProposer } from \"./services/tool-proposer.js\";\nimport { VerificationError, VerificationStore, shouldAutoVerify } from \"./services/verification-store.js\";\nimport { WorkflowTracker } from \"./services/workflow-tracker.js\";\nimport { detectCategory } from \"./setup/register-plugin.js\";\nimport { isHybridMemHelpInvocation } from \"./index-help.js\";\n\nexport const _testing = {\n // Utility functions\n normalizeTextForDedupe,\n normalizedHash,\n truncateText,\n truncateForStorage,\n isHybridMemHelpInvocation,\n isHybridMemJsonInvocation,\n extractTags,\n serializeTags,\n parseTags,\n tagsContains,\n parseSourceDate,\n estimateTokens,\n estimateTokensForDisplay,\n formatProgressiveIndexLine,\n classifyDecay,\n calculateExpiry,\n extractStructuredFields,\n detectCategory,\n detectCredentialPatterns,\n extractCredentialMatch,\n isCredentialLike,\n inferServiceFromText,\n isStructuredForConsolidation,\n runConsolidate,\n normalizeSuggestedLabel,\n unionFind,\n getRoot,\n mergeResults,\n filterByScope,\n safeEmbed,\n deepMerge,\n buildInstallDefaults,\n // Encryption primitives (used by CredentialsDB)\n deriveKey,\n encryptValue,\n decryptValue,\n // Classes for testing\n FactsDB,\n CredentialsDB,\n ProposalsDB,\n EventLog,\n EventBus,\n computeFingerprint,\n VectorDB,\n Embeddings,\n WriteAheadLog,\n // Classification (for tests)\n parseClassificationResponse,\n findSimilarByEmbedding,\n // Reflection parsing (for tests) - re-exported from service\n parsePatternsFromReflectionResponse,\n loadReflectionDedupeCorpusVectors,\n normalizeVector,\n dotProductSimilarity,\n // FTS5 search service (Issue #151)\n searchFts,\n rebuildFtsIndex,\n buildFts5Query,\n // RRF scoring pipeline (Issue #152)\n fuseResults,\n applyPostRrfAdjustments,\n RRF_K_DEFAULT,\n runExplicitDeepRetrieval,\n packIntoBudget,\n serializeFactForContext,\n estimateTokenCount,\n DEFAULT_RETRIEVAL_CONFIG,\n // GraphRAG retrieval (Issue #145)\n expandGraph,\n formatLinkPath,\n HOP_SCORE_DECAY,\n // Shortest-path traversal (Issue #140)\n findShortestPath,\n resolveInput,\n formatPath,\n // Knowledge gap analysis (Issue #141)\n analyzeKnowledgeGaps,\n detectOrphans,\n detectWeak,\n detectSuggestedLinks,\n computeIsolationScore,\n computeRankScore,\n // Topic cluster detection (Issue #146)\n detectClusters,\n generateClusterLabel,\n // Retrieval aliases (Issue #149)\n AliasDB,\n generateAliases,\n storeAliases,\n searchAliasStrategy,\n // Issue lifecycle tracking (Issue #137)\n IssueStore,\n // Workflow trace tracking (Issue #209)\n WorkflowStore,\n WorkflowTracker,\n sequenceDistance,\n sequenceSimilarity,\n extractGoalKeywords,\n hashToolSequence,\n // Workflow crystallization (Issue #208)\n CrystallizationStore,\n detectCrystallizationCandidates,\n crystallizeSkill,\n SkillValidator,\n buildNonPlaceholderEmailPattern,\n CrystallizationProposer,\n computePatternId,\n computeEvidenceHash,\n computeLegacyEvidenceHash,\n scorePattern,\n deriveSkillName,\n isExecOnlySequence,\n buildExamplesText,\n inferCategory,\n // Plugin self-extension (Issue #210)\n ToolProposalStore,\n GapDetector,\n ToolProposer,\n computeGapId,\n deriveToolNameFromSequence,\n // Verification store for critical facts (Issue #162)\n VerificationStore,\n shouldAutoVerify,\n VerificationError,\n // Provenance tracing (Issue #163)\n ProvenanceService,\n // Learnings intake buffer — staged memory promotion (Issue #617)\n LearningsDB,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuJA,MAAa,WAAW;CAEtB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CAEA;CACA;CACA;CACA;CAEA;CACA;CACA;CAEA;CACA;CACA,eAAA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CAEA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CAEA;CACA;CACA;CACA;CAEA;CAEA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CAEA;CAEA;AACF"}
package/dist/index.d.ts CHANGED
@@ -32,7 +32,7 @@ declare const memoryHybridPlugin: {
32
32
  readonly memoryManagerVersion: "3.0";
33
33
  readonly schemaVersion: 3;
34
34
  };
35
- register(api: ClawdbotPluginApi): Promise<void>;
35
+ register(api: ClawdbotPluginApi): void;
36
36
  };
37
37
  //#endregion
38
38
  export { AUTOPILOT_ACTIONS, AUTOPILOT_ACTION_CLASSES, AUTOPILOT_CAPABILITY_CLASSES, AUTOPILOT_MODES, AUTOPILOT_REASON_CODES, AutopilotAction, AutopilotActionClass, AutopilotCapabilityClass, AutopilotMode, AutopilotReasonCode, type ClusterDetectionOptions, type ClusterDetectionResult, type ClusterFactLookup, type ContradictionRecord, CreatePendingRunInput, DEFAULT_GRAPH_HUB_DEGREE_CAP, type GapEmbeddings, type GapFact, type GapFactsDB, type GapMode, type GapVectorDB, type GraphExpandedResult, type GraphExpansionStats, type GraphFactLookup, type GraphRetrievalOptions, type KnowledgeGapReport, type LinkPathStep, type MessageLike, PENDING_AUTOPILOT_SCHEMA_VERSION, PENDING_QUEUES, PERSONA_APPLY_CONFIDENCE_THRESHOLD, PERSONA_PROPOSAL_TRIAGE_POLICY_VERSION, PERSONA_REJECT_CONFIDENCE_THRESHOLD, type PathStep, PendingAutopilotCursor, PendingAutopilotLock, PendingAutopilotRunSummary, PendingAutopilotStore, PendingDecision, PendingDecisionActorContext, PendingDecisionContext, PendingDecisionEvidence, PendingItem, PendingQueue, PendingQueueAdapter, type PersonaProposalDecisionView, type PersonaProposalPendingItem, type PersonaProposalReviewBundle, type PersonaProposalRisk, type PersonaProposalTriageOptions, type PersonaProposalTriagePolicy, type PersonaProposalTriageResult, RedactedAutopilotAudit, RedactedAutopilotSummary, RedactedAutopilotText, type RetrievalPipelineOptions, type ShortestPathLookup, type ShortestPathResult, type SuggestedLink, type TopicCluster, _testing, assertKnownEnum, canonicalJson, computePendingInputHash, createPendingAutopilotRunId, createPersonaProposalTriageAdapter, createStableRunSummary, decidePersonaProposal, memoryHybridPlugin as default, getHybridMemoryContextBudgetHint, isAutopilotAction, isAutopilotActionClass, isAutopilotCapabilityClass, isAutopilotMode, isAutopilotReasonCode, isHybridMemHelpInvocation, isHybridMemJsonInvocation, isPendingQueue, migratePendingAutopilotTables, redactAutopilotText, redactAutopilotValue, renderPersonaProposalTriageHumanSummary, resolveGraphHubDegreeCap, runPersonaProposalTriage, sanitizeMessagesForClaude, sanitizeMessagesForOpenAIResponses, sanitizePendingDecision, shouldAdvancePendingCursor, stablePersonaProposalTriageJson, stableRunSummaryJson, validatePersonaPolicy, versionInfo };
package/dist/index.js CHANGED
@@ -22,8 +22,8 @@ const memoryHybridPlugin = {
22
22
  kind: "memory",
23
23
  configSchema: hybridConfigSchema,
24
24
  versionInfo,
25
- async register(api) {
26
- await runMemoryHybridRegister(api);
25
+ register(api) {
26
+ runMemoryHybridRegister(api);
27
27
  }
28
28
  };
29
29
  //#endregion
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../index.ts"],"sourcesContent":["import type { ClawdbotPluginApi } from \"openclaw/plugin-sdk/core\";\n\nimport { hybridConfigSchema } from \"./config/hybrid-schema.js\";\nimport { versionInfo } from \"./versionInfo.js\";\nimport { PLUGIN_ID } from \"./utils/constants.js\";\nimport { runMemoryHybridRegister } from \"./setup/register-plugin.js\";\nimport { isHybridMemHelpInvocation } from \"./index-help.js\";\n\nexport { isHybridMemHelpInvocation };\nexport { isHybridMemJsonInvocation } from \"./utils/hybrid-mem-json-cli.js\";\nexport type {\n GraphExpandedResult,\n GraphExpansionStats,\n GraphFactLookup,\n GraphRetrievalOptions,\n LinkPathStep,\n} from \"./services/graph-retrieval.js\";\nexport { DEFAULT_GRAPH_HUB_DEGREE_CAP, resolveGraphHubDegreeCap } from \"./services/graph-retrieval.js\";\nexport * from \"./services/pending-autopilot/index.js\";\nexport {\n PERSONA_APPLY_CONFIDENCE_THRESHOLD,\n PERSONA_PROPOSAL_TRIAGE_POLICY_VERSION,\n PERSONA_REJECT_CONFIDENCE_THRESHOLD,\n createPersonaProposalTriageAdapter,\n decidePersonaProposal,\n renderPersonaProposalTriageHumanSummary,\n runPersonaProposalTriage,\n stablePersonaProposalTriageJson,\n validatePersonaPolicy,\n} from \"./services/persona-proposal-triage.js\";\nexport type {\n PersonaProposalDecisionView,\n PersonaProposalPendingItem,\n PersonaProposalReviewBundle,\n PersonaProposalRisk,\n PersonaProposalTriageOptions,\n PersonaProposalTriagePolicy,\n PersonaProposalTriageResult,\n} from \"./services/persona-proposal-triage.js\";\nexport type { ShortestPathResult, PathStep, ShortestPathLookup } from \"./services/shortest-path.js\";\nexport type {\n GapFact,\n SuggestedLink,\n KnowledgeGapReport,\n GapMode,\n GapFactsDB,\n GapVectorDB,\n GapEmbeddings,\n} from \"./services/knowledge-gaps.js\";\nexport type {\n TopicCluster,\n ClusterDetectionResult,\n ClusterDetectionOptions,\n ClusterFactLookup,\n} from \"./services/topic-clusters.js\";\n\nexport { _testing } from \"./index-testing-exports.js\";\n\n// Plugin Definition\n\nconst memoryHybridPlugin = {\n id: PLUGIN_ID,\n name: \"Memory (Hybrid: SQLite + LanceDB)\",\n description: \"Two-tier memory: SQLite+FTS5 for structured facts, LanceDB for semantic search\",\n kind: \"memory\" as const,\n configSchema: hybridConfigSchema,\n versionInfo,\n\n async register(api: ClawdbotPluginApi) {\n await runMemoryHybridRegister(api);\n },\n};\n\nexport { versionInfo } from \"./versionInfo.js\";\nexport {\n sanitizeMessagesForClaude,\n sanitizeMessagesForOpenAIResponses,\n type MessageLike,\n} from \"./utils/sanitize-messages.js\";\nexport { getHybridMemoryContextBudgetHint } from \"./services/context-budget.js\";\nexport type { ContradictionRecord } from \"./backends/facts-db.js\";\nexport type { RetrievalPipelineOptions } from \"./services/retrieval-orchestrator.js\";\nexport default memoryHybridPlugin;\n"],"mappings":";;;;;;;;;;;;;;;;;AA4DA,MAAM,qBAAqB;CACzB,IAAI;CACJ,MAAM;CACN,aAAa;CACb,MAAM;CACN,cAAc;CACd;CAEA,MAAM,SAAS,KAAwB;EACrC,MAAM,wBAAwB,IAAI;;CAErC"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../index.ts"],"sourcesContent":["import type { ClawdbotPluginApi } from \"openclaw/plugin-sdk/core\";\n\nimport { hybridConfigSchema } from \"./config/hybrid-schema.js\";\nimport { versionInfo } from \"./versionInfo.js\";\nimport { PLUGIN_ID } from \"./utils/constants.js\";\nimport { runMemoryHybridRegister } from \"./setup/register-plugin.js\";\nimport { isHybridMemHelpInvocation } from \"./index-help.js\";\n\nexport { isHybridMemHelpInvocation };\nexport { isHybridMemJsonInvocation } from \"./utils/hybrid-mem-json-cli.js\";\nexport type {\n GraphExpandedResult,\n GraphExpansionStats,\n GraphFactLookup,\n GraphRetrievalOptions,\n LinkPathStep,\n} from \"./services/graph-retrieval.js\";\nexport { DEFAULT_GRAPH_HUB_DEGREE_CAP, resolveGraphHubDegreeCap } from \"./services/graph-retrieval.js\";\nexport * from \"./services/pending-autopilot/index.js\";\nexport {\n PERSONA_APPLY_CONFIDENCE_THRESHOLD,\n PERSONA_PROPOSAL_TRIAGE_POLICY_VERSION,\n PERSONA_REJECT_CONFIDENCE_THRESHOLD,\n createPersonaProposalTriageAdapter,\n decidePersonaProposal,\n renderPersonaProposalTriageHumanSummary,\n runPersonaProposalTriage,\n stablePersonaProposalTriageJson,\n validatePersonaPolicy,\n} from \"./services/persona-proposal-triage.js\";\nexport type {\n PersonaProposalDecisionView,\n PersonaProposalPendingItem,\n PersonaProposalReviewBundle,\n PersonaProposalRisk,\n PersonaProposalTriageOptions,\n PersonaProposalTriagePolicy,\n PersonaProposalTriageResult,\n} from \"./services/persona-proposal-triage.js\";\nexport type { ShortestPathResult, PathStep, ShortestPathLookup } from \"./services/shortest-path.js\";\nexport type {\n GapFact,\n SuggestedLink,\n KnowledgeGapReport,\n GapMode,\n GapFactsDB,\n GapVectorDB,\n GapEmbeddings,\n} from \"./services/knowledge-gaps.js\";\nexport type {\n TopicCluster,\n ClusterDetectionResult,\n ClusterDetectionOptions,\n ClusterFactLookup,\n} from \"./services/topic-clusters.js\";\n\nexport { _testing } from \"./index-testing-exports.js\";\n\n// Plugin Definition\n\nconst memoryHybridPlugin = {\n id: PLUGIN_ID,\n name: \"Memory (Hybrid: SQLite + LanceDB)\",\n description: \"Two-tier memory: SQLite+FTS5 for structured facts, LanceDB for semantic search\",\n kind: \"memory\" as const,\n configSchema: hybridConfigSchema,\n versionInfo,\n\n register(api: ClawdbotPluginApi) {\n runMemoryHybridRegister(api);\n },\n};\n\nexport { versionInfo } from \"./versionInfo.js\";\nexport {\n sanitizeMessagesForClaude,\n sanitizeMessagesForOpenAIResponses,\n type MessageLike,\n} from \"./utils/sanitize-messages.js\";\nexport { getHybridMemoryContextBudgetHint } from \"./services/context-budget.js\";\nexport type { ContradictionRecord } from \"./backends/facts-db.js\";\nexport type { RetrievalPipelineOptions } from \"./services/retrieval-orchestrator.js\";\nexport default memoryHybridPlugin;\n"],"mappings":";;;;;;;;;;;;;;;;;AA4DA,MAAM,qBAAqB;CACzB,IAAI;CACJ,MAAM;CACN,aAAa;CACb,MAAM;CACN,cAAc;CACd;CAEA,SAAS,KAAwB;EAC/B,wBAAwB,GAAG;CAC7B;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"hook-resolution-api.js","names":[],"sources":["../../lifecycle/hook-resolution-api.ts"],"sourcesContent":["/**\n * Fold OpenClaw typed-hook context (`PluginHookAgentContext`, 2nd callback arg) into\n * `api.context` so session/agent resolvers use `(event, api)` only (#1005).\n *\n * **Merge vs previous `api.context`:** for each of `sessionId`, `sessionKey`, and\n * `agentId`, a non-empty hook value replaces the same field on `api.context`. This mirrors\n * “hook before bare api.context” in the old three-argument resolver.\n *\n * **End-to-end identity:** event/session/payload fields still win over merged `api.context`\n * in `resolveSessionKeyFromHookEvent` and `resolveAgentIdFromHookEvent`, so structured\n * payloads cannot be overridden by hook context (symmetric for session key and agent id).\n */\n\nimport type { ClawdbotPluginApi } from \"openclaw/plugin-sdk/core\";\nimport type { HookAgentContextSlice } from \"./types.js\";\n\nfunction nonEmptyString(v: unknown): string | undefined {\n if (typeof v !== \"string\") return undefined;\n const t = v.trim();\n return t.length > 0 ? t : undefined;\n}\n\n/** Pick session/agent fields from an unknown hook context object. */\nexport function sliceHookAgentContext(hookCtx: unknown): HookAgentContextSlice | undefined {\n if (!hookCtx || typeof hookCtx !== \"object\") return undefined;\n const o = hookCtx as Record<string, unknown>;\n const agentId = nonEmptyString(o.agentId);\n const sessionKey = nonEmptyString(o.sessionKey);\n const sessionId = nonEmptyString(o.sessionId);\n if (!agentId && !sessionKey && !sessionId) return undefined;\n return {\n ...(agentId !== undefined ? { agentId } : {}),\n ...(sessionKey !== undefined ? { sessionKey } : {}),\n ...(sessionId !== undefined ? { sessionId } : {}),\n };\n}\n\n/**\n * Returns `api` unchanged when `hookCtx` carries no usable slice; otherwise a shallow\n * clone with `context` merged so hook fields override the same keys on `api.context`.\n */\nexport function withHookResolutionApi(api: ClawdbotPluginApi, hookCtx: unknown): ClawdbotPluginApi {\n const slice = sliceHookAgentContext(hookCtx);\n if (!slice) return api;\n const c = api.context ?? {};\n return {\n ...api,\n context: {\n ...c,\n // Order matches resolveSessionKeyFromHookEvent: sessionId before sessionKey on api.context.\n sessionId: slice.sessionId ?? c.sessionId,\n sessionKey: slice.sessionKey ?? c.sessionKey,\n agentId: slice.agentId ?? c.agentId,\n },\n } as ClawdbotPluginApi;\n}\n"],"mappings":";AAgBA,SAAS,eAAe,GAAgC;CACtD,IAAI,OAAO,MAAM,UAAU,OAAO,KAAA;CAClC,MAAM,IAAI,EAAE,MAAM;CAClB,OAAO,EAAE,SAAS,IAAI,IAAI,KAAA;;;AAI5B,SAAgB,sBAAsB,SAAqD;CACzF,IAAI,CAAC,WAAW,OAAO,YAAY,UAAU,OAAO,KAAA;CACpD,MAAM,IAAI;CACV,MAAM,UAAU,eAAe,EAAE,QAAQ;CACzC,MAAM,aAAa,eAAe,EAAE,WAAW;CAC/C,MAAM,YAAY,eAAe,EAAE,UAAU;CAC7C,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,WAAW,OAAO,KAAA;CAClD,OAAO;EACL,GAAI,YAAY,KAAA,IAAY,EAAE,SAAS,GAAG,EAAE;EAC5C,GAAI,eAAe,KAAA,IAAY,EAAE,YAAY,GAAG,EAAE;EAClD,GAAI,cAAc,KAAA,IAAY,EAAE,WAAW,GAAG,EAAE;EACjD;;;;;;AAOH,SAAgB,sBAAsB,KAAwB,SAAqC;CACjG,MAAM,QAAQ,sBAAsB,QAAQ;CAC5C,IAAI,CAAC,OAAO,OAAO;CACnB,MAAM,IAAI,IAAI,WAAW,EAAE;CAC3B,OAAO;EACL,GAAG;EACH,SAAS;GACP,GAAG;GAEH,WAAW,MAAM,aAAa,EAAE;GAChC,YAAY,MAAM,cAAc,EAAE;GAClC,SAAS,MAAM,WAAW,EAAE;GAC7B;EACF"}
1
+ {"version":3,"file":"hook-resolution-api.js","names":[],"sources":["../../lifecycle/hook-resolution-api.ts"],"sourcesContent":["/**\n * Fold OpenClaw typed-hook context (`PluginHookAgentContext`, 2nd callback arg) into\n * `api.context` so session/agent resolvers use `(event, api)` only (#1005).\n *\n * **Merge vs previous `api.context`:** for each of `sessionId`, `sessionKey`, and\n * `agentId`, a non-empty hook value replaces the same field on `api.context`. This mirrors\n * “hook before bare api.context” in the old three-argument resolver.\n *\n * **End-to-end identity:** event/session/payload fields still win over merged `api.context`\n * in `resolveSessionKeyFromHookEvent` and `resolveAgentIdFromHookEvent`, so structured\n * payloads cannot be overridden by hook context (symmetric for session key and agent id).\n */\n\nimport type { ClawdbotPluginApi } from \"openclaw/plugin-sdk/core\";\nimport type { HookAgentContextSlice } from \"./types.js\";\n\nfunction nonEmptyString(v: unknown): string | undefined {\n if (typeof v !== \"string\") return undefined;\n const t = v.trim();\n return t.length > 0 ? t : undefined;\n}\n\n/** Pick session/agent fields from an unknown hook context object. */\nexport function sliceHookAgentContext(hookCtx: unknown): HookAgentContextSlice | undefined {\n if (!hookCtx || typeof hookCtx !== \"object\") return undefined;\n const o = hookCtx as Record<string, unknown>;\n const agentId = nonEmptyString(o.agentId);\n const sessionKey = nonEmptyString(o.sessionKey);\n const sessionId = nonEmptyString(o.sessionId);\n if (!agentId && !sessionKey && !sessionId) return undefined;\n return {\n ...(agentId !== undefined ? { agentId } : {}),\n ...(sessionKey !== undefined ? { sessionKey } : {}),\n ...(sessionId !== undefined ? { sessionId } : {}),\n };\n}\n\n/**\n * Returns `api` unchanged when `hookCtx` carries no usable slice; otherwise a shallow\n * clone with `context` merged so hook fields override the same keys on `api.context`.\n */\nexport function withHookResolutionApi(api: ClawdbotPluginApi, hookCtx: unknown): ClawdbotPluginApi {\n const slice = sliceHookAgentContext(hookCtx);\n if (!slice) return api;\n const c = api.context ?? {};\n return {\n ...api,\n context: {\n ...c,\n // Order matches resolveSessionKeyFromHookEvent: sessionId before sessionKey on api.context.\n sessionId: slice.sessionId ?? c.sessionId,\n sessionKey: slice.sessionKey ?? c.sessionKey,\n agentId: slice.agentId ?? c.agentId,\n },\n } as ClawdbotPluginApi;\n}\n"],"mappings":";AAgBA,SAAS,eAAe,GAAgC;CACtD,IAAI,OAAO,MAAM,UAAU,OAAO,KAAA;CAClC,MAAM,IAAI,EAAE,KAAK;CACjB,OAAO,EAAE,SAAS,IAAI,IAAI,KAAA;AAC5B;;AAGA,SAAgB,sBAAsB,SAAqD;CACzF,IAAI,CAAC,WAAW,OAAO,YAAY,UAAU,OAAO,KAAA;CACpD,MAAM,IAAI;CACV,MAAM,UAAU,eAAe,EAAE,OAAO;CACxC,MAAM,aAAa,eAAe,EAAE,UAAU;CAC9C,MAAM,YAAY,eAAe,EAAE,SAAS;CAC5C,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,WAAW,OAAO,KAAA;CAClD,OAAO;EACL,GAAI,YAAY,KAAA,IAAY,EAAE,QAAQ,IAAI,CAAC;EAC3C,GAAI,eAAe,KAAA,IAAY,EAAE,WAAW,IAAI,CAAC;EACjD,GAAI,cAAc,KAAA,IAAY,EAAE,UAAU,IAAI,CAAC;CACjD;AACF;;;;;AAMA,SAAgB,sBAAsB,KAAwB,SAAqC;CACjG,MAAM,QAAQ,sBAAsB,OAAO;CAC3C,IAAI,CAAC,OAAO,OAAO;CACnB,MAAM,IAAI,IAAI,WAAW,CAAC;CAC1B,OAAO;EACL,GAAG;EACH,SAAS;GACP,GAAG;GAEH,WAAW,MAAM,aAAa,EAAE;GAChC,YAAY,MAAM,cAAc,EAAE;GAClC,SAAS,MAAM,WAAW,EAAE;EAC9B;CACF;AACF"}
@@ -2,7 +2,6 @@ import { getEnv } from "../utils/env-manager.js";
2
2
  import { capturePluginError } from "../services/error-reporter.js";
3
3
  import { isAbortOrTransientLlmError } from "../services/chat.js";
4
4
  import { getCronModelConfig, getDefaultCronModel } from "../config/index.js";
5
- import "../config.js";
6
5
  import { recordStartupMemoryCheckpoint } from "../services/startup-memory-attribution.js";
7
6
  import { TASK_LEDGER_CATEGORY } from "../services/task-ledger-facts.js";
8
7
  import { isRecallContextSuperseded, suppressStaleLifecycleDbError } from "../utils/registration-superseded.js";