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":"skills.js","names":[],"sources":["../../cli/skills.ts"],"sourcesContent":["/**\n * CLI: skill proposal queue (crystallization lifecycle) and generated-skill telemetry.\n *\n * Commands:\n * - hybrid-mem skills queue | show | validate | reject | install | rescan | telemetry …\n */\n\nimport type { FactsDB } from \"../backends/facts-db.js\";\nimport type { CrystallizationQueueStatusFilter, CrystallizationStore } from \"../backends/crystallization-store.js\";\nimport {\n assertCrystallizationQueueStatusFilter,\n CRYSTALLIZATION_QUEUE_STATUS_FILTERS,\n} from \"../backends/crystallization-store.js\";\nimport type { HybridMemoryConfig } from \"../config.js\";\nimport { CrystallizationProposer } from \"../services/crystallization-proposer.js\";\nimport {\n summarizeSkillProposalValidation,\n type SkillProposalValidationResult,\n} from \"../services/generated-skill-validation.js\";\nimport { GeneratedSkillLifecycleService } from \"../services/generated-skill-lifecycle.js\";\nimport { auditAutoSkills, quarantineAutoSkills } from \"../services/auto-skills-audit.js\";\nimport { SkillValidator } from \"../services/skill-validator.js\";\nimport { resolveWorkspacePath } from \"../utils/path.js\";\nimport type { Chainable } from \"./shared.js\";\nimport { relativeTime, withExit } from \"./shared.js\";\n\ntype ArgumentChainable = {\n command(name: string): ArgumentChainable;\n argument(name: string, desc?: string): ArgumentChainable;\n description(desc: string): ArgumentChainable;\n option(flags: string, desc?: string, defaultValue?: unknown): ArgumentChainable;\n requiredOption(flags: string, desc?: string, defaultValue?: unknown): ArgumentChainable;\n action(fn: (...args: any[]) => void | Promise<void>): ArgumentChainable;\n};\n\ntype SkillsCliContext = {\n crystallizationStore?: CrystallizationStore | null;\n cfg: HybridMemoryConfig;\n factsDb?: FactsDB | null;\n};\n\nfunction formatIso(ts: number | null | undefined): string {\n return typeof ts === \"number\" && ts > 0 ? new Date(ts * 1000).toISOString() : \"never\";\n}\n\nfunction formatRate(value: number | null | undefined): string {\n return typeof value === \"number\" ? `${Math.round(value * 100)}%` : \"n/a\";\n}\n\nfunction requireStore(ctx: SkillsCliContext): CrystallizationStore {\n const store = ctx.crystallizationStore;\n if (!store) {\n throw new Error(\"Crystallization store is not available (plugin not fully initialized?)\");\n }\n return store;\n}\n\nfunction formatProposalReadiness(p: { validationResult?: SkillProposalValidationResult }): string {\n const vr = p.validationResult;\n if (!vr) return \" — validation: not run\";\n if (vr.approvalDecision === \"allow\") return \" — ready ✓\";\n if (vr.approvalDecision === \"allow-with-override\") return \" — needs override\";\n if (vr.approvalDecision === \"deny\") return \" — blocked (deny)\";\n return ` — ${vr.approvalDecision}`;\n}\n\nexport function registerSkillsCommands(mem: Chainable, ctx: SkillsCliContext): void {\n const skills = mem\n .command(\"skills\")\n .description(\"Generated skill proposals (crystallization queue) and promoted-skill telemetry\") as ArgumentChainable;\n\n const factsDb = ctx.factsDb ?? null;\n if (factsDb) {\n registerGeneratedSkillTelemetryCli(skills, factsDb);\n }\n\n const queue = skills.command(\"queue\") as ArgumentChainable;\n\n queue\n .description(\"List proposal cards in the approval queue\")\n .option(\n \"--status <status>\",\n `Filter: ${CRYSTALLIZATION_QUEUE_STATUS_FILTERS.join(\", \")} (pending=drafted+validated, approved=approved+installed; ready=validated+allow; needs-override=validated+allow-with-override)`,\n )\n .option(\"--limit <n>\", \"Limit results (default: 20)\")\n .option(\"--json\", \"Print JSON\")\n .action(\n withExit(async (opts: { status?: string; limit?: string; json?: boolean }) => {\n const store = requireStore(ctx);\n const limit = opts.limit ? Math.max(1, Math.min(100, Number(opts.limit))) : 20;\n const status = (opts.status as CrystallizationQueueStatusFilter | undefined) ?? undefined;\n let proposals;\n try {\n assertCrystallizationQueueStatusFilter(opts.status);\n proposals = store.list({ status, limit });\n } catch (err) {\n console.error(`error: ${err instanceof Error ? err.message : String(err)}`);\n process.exitCode = 1;\n return;\n }\n\n if (opts.json) {\n console.log(JSON.stringify({ ok: true, count: proposals.length, proposals }, null, 2));\n return;\n }\n\n if (proposals.length === 0) {\n console.log(status ? `No ${status} skill proposals found.` : \"No skill proposals found.\");\n return;\n }\n\n for (const p of proposals) {\n let observed = \"\";\n try {\n const snap = JSON.parse(p.patternSnapshot) as { totalCount?: number; successRate?: number };\n if (typeof snap.totalCount === \"number\") {\n observed = ` (${snap.totalCount} runs, ${Math.round((snap.successRate ?? 0) * 100)}% success)`;\n }\n } catch {\n // ignore\n }\n console.log(`[${p.status}] ${p.skillName}${observed}${formatProposalReadiness(p)}`);\n console.log(` id: ${p.id}`);\n if (p.validationResult) {\n console.log(` validation: ${summarizeSkillProposalValidation(p.validationResult)}`);\n }\n if (p.category) console.log(` category: ${p.category}`);\n if (p.outputPath) console.log(` output: ${p.outputPath}`);\n if (p.rejectionReason) console.log(` rejected: ${p.rejectionReason}`);\n console.log(\"\");\n }\n }),\n );\n\n (skills.command(\"show\") as ArgumentChainable)\n .description(\"Show a single proposal card and draft content\")\n .argument(\"<id>\", \"Proposal id\")\n .option(\"--json\", \"Print JSON\")\n .action(\n withExit(async (id: string, opts: { json?: boolean }) => {\n const store = requireStore(ctx);\n const proposal = store.getById(id);\n if (!proposal) {\n console.error(`Proposal '${id}' not found`);\n process.exitCode = 1;\n return;\n }\n\n let card: unknown = null;\n if (proposal.proposalCardJson) {\n try {\n card = JSON.parse(proposal.proposalCardJson);\n } catch {\n card = null;\n }\n }\n\n if (opts.json) {\n console.log(JSON.stringify({ ok: true, proposal, card }, null, 2));\n return;\n }\n\n console.log(`[${proposal.status}] ${proposal.skillName}`);\n console.log(`id: ${proposal.id}`);\n console.log(`patternId: ${proposal.patternId}`);\n console.log(`evidenceHash: ${proposal.evidenceHash}`);\n if (proposal.category) console.log(`category: ${proposal.category}`);\n if (proposal.outputPath) console.log(`output: ${proposal.outputPath}`);\n if (proposal.rejectionReason) console.log(`rejection: ${proposal.rejectionReason}`);\n if (card) console.log(`card: ${JSON.stringify(card, null, 2)}`);\n console.log(\"\");\n console.log(proposal.skillContent);\n }),\n );\n\n (skills.command(\"validate\") as ArgumentChainable)\n .description(\n \"Run the full GSV validation pipeline (static + dry-load + activation) against the draft SKILL.md \" +\n \"— same validator as 'skills install'. Use --legacy for a quick static-only check.\",\n )\n .argument(\"<id>\", \"Proposal id\")\n .option(\"--legacy\", \"Run only the fast SkillValidator (static checks only — skips dry-load and activation eval)\")\n .option(\"--json\", \"Print JSON\")\n .action(\n withExit(async (id: string, opts: { legacy?: boolean; json?: boolean }) => {\n const store = requireStore(ctx);\n const proposal = store.getById(id);\n if (!proposal) {\n console.error(`Proposal '${id}' not found`);\n process.exitCode = 1;\n return;\n }\n\n if (opts.legacy) {\n // Cheap path: run only SkillValidator (static checks without dry-load/activation).\n const validator = new SkillValidator({\n sectionTaxonomyOverrides: ctx.cfg.crystallization.sectionTaxonomy,\n });\n const result = validator.validate(proposal.skillContent);\n if (opts.json) {\n console.log(\n JSON.stringify(\n { ok: result.valid, proposalId: id, mode: \"legacy\", violations: result.violations },\n null,\n 2,\n ),\n );\n } else if (result.valid) {\n console.log(`✓ Valid (${id}) [legacy — static only]`);\n } else {\n console.log(`✗ Invalid (${id}) [legacy — static only]`);\n for (const v of result.violations) console.log(` - ${v}`);\n }\n if (!result.valid) process.exitCode = 2;\n return;\n }\n\n // Full GSV pipeline — same validator path used by 'skills install' (issue #1402).\n const proposer = new CrystallizationProposer(null, store, ctx.cfg.crystallization);\n const result = proposer.validateProposal(id);\n if (!result) {\n console.error(`Proposal '${id}' not found`);\n process.exitCode = 1;\n return;\n }\n\n if (opts.json) {\n console.log(\n JSON.stringify(\n {\n ok: result.approvalDecision === \"allow\",\n proposalId: id,\n approvalDecision: result.approvalDecision,\n overallStatus: result.overallStatus,\n staticValidation: {\n status: result.staticValidation.status,\n violations: result.staticValidation.violations,\n },\n dryLoadValidation: {\n status: result.dryLoadValidation.status,\n violations: result.dryLoadValidation.violations,\n },\n syntheticActivationEval: {\n status: result.syntheticActivationEval.status,\n score: result.syntheticActivationEval.score,\n notes: result.syntheticActivationEval.notes,\n },\n summary: summarizeSkillProposalValidation(result),\n },\n null,\n 2,\n ),\n );\n } else {\n const icon =\n result.approvalDecision === \"deny\" ? \"✗\" : result.approvalDecision === \"allow-with-override\" ? \"⚠\" : \"✓\";\n console.log(`${icon} ${result.approvalDecision.toUpperCase()} (${id})`);\n console.log(` static: ${result.staticValidation.status}`);\n console.log(` dry-load: ${result.dryLoadValidation.status}`);\n console.log(\n ` activation: ${result.syntheticActivationEval.status} (score: ${result.syntheticActivationEval.score})`,\n );\n const allViolations = [\n ...result.staticValidation.violations.map((v) => `[static] ${v}`),\n ...result.dryLoadValidation.violations.map((v) => `[dry-load] ${v}`),\n ...result.syntheticActivationEval.notes.map((v) => `[activation] ${v}`),\n ];\n for (const v of allViolations) console.log(` - ${v}`);\n if (result.approvalDecision === \"allow-with-override\") {\n console.log(` → Use --override-warnings with 'skills install ${id}' to bypass activation warnings`);\n }\n }\n\n if (result.approvalDecision !== \"allow\") process.exitCode = 2;\n }),\n );\n\n (skills.command(\"reject\") as ArgumentChainable)\n .description(\"Reject a crystallization proposal or permanently reject an installed generated skill\")\n .argument(\"<target>\", \"Proposal id or generated skill name\")\n .option(\"--reason <reason>\", \"Reason recorded for audit / operator rejection\")\n .option(\"--json\", \"Print JSON\")\n .action(\n withExit(async (target: string, opts?: { reason?: string; json?: boolean }) => {\n const proposal = ctx.crystallizationStore?.getById(target) ?? null;\n if (proposal) {\n const store = requireStore(ctx);\n const proposer = new CrystallizationProposer(null, store, ctx.cfg.crystallization);\n const result = proposer.rejectProposal(target, opts?.reason);\n if (opts?.json) {\n console.log(JSON.stringify({ ok: result.success, ...result }, null, 2));\n if (!result.success) process.exitCode = 1;\n return;\n }\n console.log(result.success ? `✓ ${result.message}` : `✗ ${result.message}`);\n if (!result.success) process.exitCode = 1;\n return;\n }\n\n if (!factsDb) {\n console.error(`error: no proposal or generated skill found for '${target}'`);\n process.exitCode = 1;\n return;\n }\n const lifecycle = new GeneratedSkillLifecycleService(factsDb);\n const current = lifecycle.getSkill(target);\n if (!current) {\n console.error(`error: no proposal or generated skill found for '${target}'`);\n process.exitCode = 1;\n return;\n }\n const reason = opts?.reason?.trim();\n if (!reason) {\n console.error(\"error: --reason is required when rejecting an installed generated skill\");\n process.exitCode = 1;\n return;\n }\n if (current.skillState === \"rejected\" || current.skillState === \"uninstalled\") {\n console.error(\n `error: skill '${target}' is in terminal state '${current.skillState}' — only installed, non-terminal skills can be rejected`,\n );\n process.exitCode = 1;\n return;\n }\n const updated = lifecycle.setState(target, \"rejected\", reason);\n if (!updated) {\n console.error(`error: generated skill not found: ${target}`);\n process.exitCode = 1;\n return;\n }\n if (opts?.json) {\n console.log(JSON.stringify(updated, null, 2));\n return;\n }\n console.log(`Rejected ${target}: ${updated.skillStateReason ?? \"manual rejection\"}`);\n }),\n );\n\n (skills.command(\"install\") as ArgumentChainable)\n .description(\"Approve and install a proposal (writes SKILL.md to the skills directory)\")\n .argument(\"<id>\", \"Proposal id\")\n .option(\"--name <slug>\", \"Rename before install\")\n .option(\"--category <category>\", \"Category override\")\n .option(\"--description <text>\", \"Override proposal description (frontmatter + card)\")\n .option(\"--recommended-output <type>\", \"Output type override (currently: 'SKILL.md only')\", \"SKILL.md only\")\n .option(\"--override-warnings\", \"Approve proposals with activation warnings (explicit operator override)\")\n .option(\"--dry-run\", \"Preview validation and output path without writing SKILL.md to disk\")\n .option(\"--json\", \"Print JSON\")\n .action(\n withExit(\n async (\n id: string,\n opts: {\n name?: string;\n category?: string;\n description?: string;\n recommendedOutput?: string;\n overrideWarnings?: boolean;\n dryRun?: boolean;\n json?: boolean;\n },\n ) => {\n const store = requireStore(ctx);\n\n if (opts.dryRun) {\n // Dry-run: run the full GSV pipeline but do NOT write to disk.\n const proposer = new CrystallizationProposer(null, store, ctx.cfg.crystallization);\n const result = proposer.validateProposal(id, {\n name: opts.name,\n category: opts.category,\n description: opts.description,\n recommendedOutput: opts.recommendedOutput === \"SKILL.md only\" ? \"SKILL.md only\" : undefined,\n });\n if (!result) {\n console.error(`Proposal '${id}' not found`);\n process.exitCode = 1;\n return;\n }\n const dryRunWouldInstall =\n result.approvalDecision === \"allow\" ||\n (result.approvalDecision === \"allow-with-override\" && opts.overrideWarnings === true);\n if (opts.json) {\n console.log(\n JSON.stringify(\n {\n dryRun: true,\n ok: dryRunWouldInstall,\n proposalId: id,\n approvalDecision: result.approvalDecision,\n overallStatus: result.overallStatus,\n staticValidation: {\n status: result.staticValidation.status,\n violations: result.staticValidation.violations,\n outputPath: result.staticValidation.safeOutputPath,\n },\n dryLoadValidation: {\n status: result.dryLoadValidation.status,\n violations: result.dryLoadValidation.violations,\n },\n syntheticActivationEval: {\n status: result.syntheticActivationEval.status,\n score: result.syntheticActivationEval.score,\n notes: result.syntheticActivationEval.notes,\n },\n summary: summarizeSkillProposalValidation(result),\n },\n null,\n 2,\n ),\n );\n if (!dryRunWouldInstall) process.exitCode = 2;\n return;\n }\n const icon =\n result.approvalDecision === \"deny\" ? \"✗\" : result.approvalDecision === \"allow-with-override\" ? \"⚠\" : \"✓\";\n console.log(`[dry-run] ${icon} ${result.approvalDecision.toUpperCase()} (${id})`);\n console.log(` would write to: ${result.staticValidation.safeOutputPath}`);\n console.log(` static: ${result.staticValidation.status}`);\n console.log(` dry-load: ${result.dryLoadValidation.status}`);\n console.log(\n ` activation: ${result.syntheticActivationEval.status} (score: ${result.syntheticActivationEval.score})`,\n );\n const dryViolations = [\n ...result.staticValidation.violations.map((v) => `[static] ${v}`),\n ...result.dryLoadValidation.violations.map((v) => `[dry-load] ${v}`),\n ...result.syntheticActivationEval.notes.map((v) => `[activation] ${v}`),\n ];\n for (const v of dryViolations) console.log(` - ${v}`);\n if (result.approvalDecision === \"allow-with-override\" && !opts.overrideWarnings) {\n console.log(\" → Add --override-warnings to proceed despite activation warnings\");\n }\n if (!dryRunWouldInstall) process.exitCode = 2;\n return;\n }\n\n const proposer = new CrystallizationProposer(null, store, ctx.cfg.crystallization);\n const result = proposer.approveProposal(id, {\n name: opts.name,\n category: opts.category,\n description: opts.description,\n recommendedOutput: opts.recommendedOutput === \"SKILL.md only\" ? \"SKILL.md only\" : undefined,\n overrideWarnings: opts.overrideWarnings === true,\n });\n if (opts.json) {\n console.log(JSON.stringify({ ok: result.success, ...result }, null, 2));\n if (!result.success) process.exitCode = 1;\n return;\n }\n console.log(result.success ? `✓ ${result.message}` : `✗ ${result.message}`);\n if (!result.success) process.exitCode = 1;\n },\n ),\n );\n\n (skills.command(\"suggest\") as ArgumentChainable)\n .description(\n \"List near-eligible procedures with their current blocking gates — proactive promotion candidate triage (#1546).\",\n )\n .option(\"--limit <n>\", \"Max candidates to print (default: 20)\")\n .option(\"--threshold <n>\", \"Validation threshold override (default: 3)\")\n .option(\"--ttl-days <n>\", \"Skill TTL days override (default: 30)\")\n .option(\"--json\", \"Print JSON\")\n .action(\n withExit(async (opts: { limit?: string; threshold?: string; ttlDays?: string; json?: boolean }) => {\n const factsDb = ctx.factsDb;\n if (!factsDb) {\n console.error(\"error: facts DB is not available\");\n process.exitCode = 1;\n return;\n }\n const parsedLimit = Number(opts.limit);\n if (opts.limit && (!Number.isFinite(parsedLimit) || parsedLimit < 1)) {\n console.error(`error: --limit must be a positive number, got: ${opts.limit}`);\n process.exitCode = 1;\n return;\n }\n const limit = opts.limit ? Math.max(1, Math.min(100, parsedLimit)) : 20;\n const parsedThreshold = Number(opts.threshold);\n if (opts.threshold && (!Number.isFinite(parsedThreshold) || parsedThreshold < 1)) {\n console.error(`error: --threshold must be a positive number, got: ${opts.threshold}`);\n process.exitCode = 1;\n return;\n }\n const threshold = opts.threshold ? Math.max(1, parsedThreshold) : 3;\n const parsedTtlDays = Number(opts.ttlDays);\n if (opts.ttlDays && (!Number.isFinite(parsedTtlDays) || parsedTtlDays < 1)) {\n console.error(`error: --ttl-days must be a positive number, got: ${opts.ttlDays}`);\n process.exitCode = 1;\n return;\n }\n const ttlDays = opts.ttlDays ? Math.max(1, parsedTtlDays) : 30;\n // Dry-run generation gives us the per-procedure decision + blocking reasons\n // without touching disk — exactly the data operators need to triage which\n // procedures to nudge with more evidence vs. ignore.\n const { generateAutoSkills } = await import(\"../services/procedure-skill-generator.js\");\n const skillsAutoPath = resolveWorkspacePath(ctx.cfg.procedures.skillsAutoPath ?? \"skills/auto\");\n const result = generateAutoSkills(\n factsDb,\n {\n skillsAutoPath,\n validationThreshold: threshold,\n skillTTLDays: ttlDays,\n maxPerRun: 200,\n dryRun: true,\n policy: \"auto-safe\",\n },\n { info: () => undefined, warn: () => undefined },\n );\n const candidates = (result.decisions ?? [])\n .filter((d) => d.action === \"deferred-for-human\" || d.action === \"failed-validation\")\n .slice(0, limit);\n if (opts.json) {\n console.log(JSON.stringify({ ok: true, summary: result.summary, candidates }, null, 2));\n return;\n }\n const s = result.summary ?? ({ candidates: 0, eligible: 0, drafted: 0, deferred: 0, rejected: 0 } as any);\n console.log(\n `Candidates: ${s.candidates}, eligible: ${s.eligible}, would-draft: ${s.drafted}, deferred: ${s.deferred}, rejected: ${s.rejected}`,\n );\n if (s.defersByReason && Object.keys(s.defersByReason).length > 0) {\n console.log(\"Defer reasons:\");\n for (const [reason, count] of Object.entries(s.defersByReason)) {\n console.log(` - ${reason}: ${count}`);\n }\n }\n for (const c of candidates) {\n console.log(`- ${c.procedureId} [${c.action}] reasons=${(c.reasons ?? []).join(\",\") || \"(none)\"}`);\n }\n }),\n );\n\n (skills.command(\"audit\") as ArgumentChainable)\n .description(\n \"Scan skills/auto generated procedure skills for size, loadability, and suspicious content (dry-run by default)\",\n )\n .option(\"--path <dir>\", \"Skills auto directory (default: skills/auto)\")\n .option(\"--json\", \"Emit JSON report\")\n .option(\"--quarantine\", \"Move oversized/suspicious skills to skills/auto-quarantine/YYYY-MM-DD/\")\n .action(\n withExit(async (opts: { path?: string; json?: boolean; quarantine?: boolean }) => {\n const skillsPath = resolveWorkspacePath(opts.path ?? \"skills/auto\");\n const report = auditAutoSkills(skillsPath);\n if (opts.quarantine) {\n const toMove = report.entries.filter(\n (e) => !e.loadable || e.transcriptLike || e.secretLike || e.injectionLike,\n );\n const result = quarantineAutoSkills(skillsPath, toMove);\n if (opts.json) {\n console.log(JSON.stringify({ ok: result.errors.length === 0, report, quarantine: result }, null, 2));\n if (result.errors.length > 0) process.exitCode = 2;\n return;\n }\n console.log(`Quarantined: ${result.quarantined.join(\", \") || \"(none)\"}`);\n for (const err of result.errors) console.error(` error: ${err}`);\n if (result.errors.length > 0) process.exitCode = 2;\n return;\n }\n if (opts.json) {\n console.log(JSON.stringify({ ok: true, ...report }, null, 2));\n return;\n }\n console.log(\n `Scanned: ${report.scanned}, oversized: ${report.oversized}, suspicious: ${report.suspicious}, quarantinable: ${report.quarantinable}`,\n );\n for (const entry of report.entries) {\n const flags = [\n entry.transcriptLike ? \"transcript\" : null,\n entry.secretLike ? \"secret\" : null,\n entry.injectionLike ? \"injection\" : null,\n ]\n .filter((flag): flag is string => flag != null)\n .join(\", \");\n console.log(\n `- ${entry.slug}: ${entry.skillBytes} B, loadable=${entry.loadable}, transcript=${entry.transcriptLike}, secret=${entry.secretLike}, injection=${entry.injectionLike}${flags ? ` (${flags})` : \"\"}`,\n );\n }\n }),\n );\n\n (skills.command(\"rescan\") as ArgumentChainable)\n .description(\n \"Re-validate on-disk SKILL.md for each installed crystallization proposal; quarantine rows that fail generated-skill validation\",\n )\n .option(\"--json\", \"Print JSON\")\n .action(\n withExit(async (opts: { json?: boolean }) => {\n const store = requireStore(ctx);\n const proposer = new CrystallizationProposer(null, store, ctx.cfg.crystallization);\n const result = proposer.rescanInstalledSkills();\n if (opts.json) {\n console.log(JSON.stringify({ ok: result.errors.length === 0, ...result }, null, 2));\n if (result.errors.length > 0) process.exitCode = 2;\n return;\n }\n console.log(\n `Scanned: ${result.scanned}, quarantined: ${result.quarantined}, skipped (no path): ${result.skipped}`,\n );\n for (const line of result.messages) console.log(` ${line}`);\n for (const line of result.errors) console.error(` error: ${line}`);\n if (result.errors.length > 0) process.exitCode = 2;\n }),\n );\n}\n\nfunction registerGeneratedSkillTelemetryCli(skills: ArgumentChainable, factsDb: FactsDB): void {\n const lifecycle = new GeneratedSkillLifecycleService(factsDb);\n skills\n .command(\"telemetry [skillName]\")\n .description(\"Report generated skill activation telemetry and lifecycle recommendations\")\n .option(\"--json\", \"Emit JSON\")\n .action(\n withExit(async (skillName?: string, opts?: { json?: boolean }) => {\n const report = lifecycle.buildReport({\n skillName,\n recentActivationLimit: skillName ? 20 : 5,\n });\n if (!report || report.rows.length === 0) {\n if (opts?.json) {\n console.log(JSON.stringify(report, null, 2));\n return;\n }\n console.log(\n skillName ? `No generated skill found for ${skillName}.` : \"No generated skills have been promoted yet.\",\n );\n return;\n }\n if (opts?.json) {\n console.log(JSON.stringify(report, null, 2));\n return;\n }\n console.log(\"Generated skill telemetry\");\n for (const row of report.rows) {\n console.log(\n `- ${row.skillName} state=${row.state} activations/week=${row.metrics.activationCountPerWeek} near-miss=${row.metrics.nearMissCount} false+=${row.metrics.falsePositiveSignals} false-=${row.metrics.falseNegativeSignals} lastUsed=${row.metrics.lastUsedAt ? relativeTime(row.metrics.lastUsedAt * 1000) : \"never\"} recommendation=${row.recommendation}`,\n );\n console.log(\n ` outcomes: success=${formatRate(row.metrics.successRate)} failure=${formatRate(row.metrics.failureRate)} partial=${formatRate(row.metrics.partialRate)} userCorrections=${row.metrics.correctionCount} repeatedRequestCorrections=${row.metrics.repeatedCorrectionCount} generatedAt=${formatIso(row.generatedAt)}`,\n );\n if (row.stateReason) console.log(` stateReason: ${row.stateReason}`);\n if (row.flags.overTriggering || row.flags.archiveCandidate || row.flags.revisionCandidate) {\n const flags = [\n row.flags.overTriggering ? \"over-triggering\" : null,\n row.flags.archiveCandidate ? \"archive-candidate\" : null,\n row.flags.revisionCandidate ? \"revise-trigger\" : null,\n ].filter((flag): flag is string => flag != null);\n if (flags.length > 0) console.log(` flags: ${flags.join(\", \")}`);\n }\n if (skillName && row.recentActivations.length > 0) {\n console.log(\" recent activations:\");\n for (const activation of row.recentActivations) {\n console.log(\n ` ${activation.id} ${activation.decision} outcome=${activation.taskOutcome ?? \"unknown\"} correction=${activation.userCorrection ? \"yes\" : \"no\"} at=${formatIso(activation.createdAt)}${activation.requestSummary ? ` request=\"${activation.requestSummary}\"` : \"\"}`,\n );\n }\n }\n }\n }),\n );\n\n skills\n .command(\"record <skillName>\")\n .description(\"Record a generated skill activation or near-miss decision\")\n .option(\"--decision <decision>\", \"selected, considered, or skipped\", \"selected\")\n .option(\"--request-summary <summary>\", \"Redacted request summary\")\n .option(\"--request-hash <hash>\", \"Optional request hash override\")\n .option(\"--confidence <value>\", \"Selection confidence (0-1)\")\n .option(\n \"--reason <reason>\",\n \"Why the skill was selected or skipped (or correction explanation when using --user-correction)\",\n )\n .option(\"--outcome <outcome>\", \"success, failure, partial, or unknown\")\n .option(\n \"--false-positive\",\n \"Operator false-positive signal (sets caused rework; does not record a user correction)\",\n )\n .option(\"--user-correction\", \"Explicit user correction (requires non-empty --reason as correction explanation)\")\n .option(\"--false-negative\", \"Mark this near-miss as a false-negative signal\")\n .option(\"--caused-rework\", \"Mark this activation as having caused rework\")\n .option(\"--saved-tool-calls <n>\", \"Estimate tool calls saved\")\n .option(\"--saved-time-ms <n>\", \"Estimate milliseconds saved\")\n .option(\"--scope <scope>\", \"global, user, agent, or session\")\n .option(\"--scope-target <id>\", \"Scope target id\")\n .option(\"--agent-id <id>\", \"Agent id\")\n .option(\"--session-id <id>\", \"Session id\")\n .option(\"--procedure-id <id>\", \"Procedure id to disambiguate skills with same basename\")\n .option(\"--json\", \"Emit JSON\")\n .action(\n withExit(\n async (\n skillName: string,\n opts?: {\n decision?: string;\n requestSummary?: string;\n requestHash?: string;\n confidence?: string;\n reason?: string;\n outcome?: string;\n falsePositive?: boolean;\n userCorrection?: boolean;\n falseNegative?: boolean;\n causedRework?: boolean;\n savedToolCalls?: string;\n savedTimeMs?: string;\n scope?: string;\n scopeTarget?: string;\n agentId?: string;\n sessionId?: string;\n procedureId?: string;\n json?: boolean;\n },\n ) => {\n const decision = opts?.decision ?? \"selected\";\n if (![\"selected\", \"considered\", \"skipped\"].includes(decision)) {\n console.error(`error: invalid --decision: ${decision}`);\n process.exitCode = 1;\n return;\n }\n const outcome = opts?.outcome;\n if (outcome && ![\"success\", \"failure\", \"partial\", \"unknown\"].includes(outcome)) {\n console.error(`error: invalid --outcome: ${outcome}`);\n process.exitCode = 1;\n return;\n }\n if (opts?.scope && ![\"global\", \"user\", \"agent\", \"session\"].includes(opts.scope)) {\n console.error(`error: invalid --scope: ${opts.scope}`);\n process.exitCode = 1;\n return;\n }\n const confidence = opts?.confidence != null ? Number.parseFloat(opts.confidence) : null;\n if (\n opts?.confidence != null &&\n (confidence == null || !Number.isFinite(confidence) || confidence < 0 || confidence > 1)\n ) {\n console.error(\"error: --confidence must be a number between 0 and 1\");\n process.exitCode = 1;\n return;\n }\n const savedToolCalls = opts?.savedToolCalls != null ? Number.parseInt(opts.savedToolCalls, 10) : null;\n if (\n opts?.savedToolCalls != null &&\n (savedToolCalls == null || !Number.isFinite(savedToolCalls) || savedToolCalls < 0)\n ) {\n console.error(\"error: --saved-tool-calls must be a non-negative integer\");\n process.exitCode = 1;\n return;\n }\n const savedTimeMs = opts?.savedTimeMs != null ? Number.parseInt(opts.savedTimeMs, 10) : null;\n if (opts?.savedTimeMs != null && (savedTimeMs == null || !Number.isFinite(savedTimeMs) || savedTimeMs < 0)) {\n console.error(\"error: --saved-time-ms must be a non-negative integer\");\n process.exitCode = 1;\n return;\n }\n const userCorrection = opts?.userCorrection === true;\n const operatorFalsePositive = opts?.falsePositive === true;\n if (userCorrection) {\n const r = (opts?.reason ?? \"\").trim();\n if (!r) {\n console.error(\"error: --user-correction requires a non-empty --reason (correction explanation)\");\n process.exitCode = 1;\n return;\n }\n }\n const causedRework = opts?.causedRework === true || operatorFalsePositive;\n try {\n const activation = lifecycle.recordTelemetry({\n skillName,\n procedureId: opts?.procedureId,\n decision: decision as \"selected\" | \"considered\" | \"skipped\",\n requestSummary: opts?.requestSummary,\n requestHash: opts?.requestHash,\n confidence,\n reason: userCorrection ? undefined : opts?.reason,\n taskOutcome: outcome as \"success\" | \"failure\" | \"partial\" | \"unknown\" | undefined,\n userCorrection,\n correctionReason: userCorrection ? opts?.reason?.trim() : undefined,\n falseNegativeSignal: opts?.falseNegative,\n causedRework,\n savedToolCalls,\n savedTimeMs,\n scope: opts?.scope as \"global\" | \"user\" | \"agent\" | \"session\" | undefined,\n scopeTarget: opts?.scopeTarget,\n agentId: opts?.agentId,\n sessionId: opts?.sessionId,\n });\n if (!activation) {\n console.error(\"error: facts DB is not open\");\n process.exitCode = 1;\n return;\n }\n const skill = factsDb.getGeneratedSkillByName(skillName, activation.procedureId);\n if (opts?.json) {\n console.log(JSON.stringify({ activation, skill }, null, 2));\n return;\n }\n console.log(\n `Recorded ${activation.decision} for ${activation.skillName} as ${activation.id} (state=${skill?.skillState ?? \"experimental\"})`,\n );\n } catch (err) {\n console.error(`error: ${err instanceof Error ? err.message : String(err)}`);\n process.exitCode = 1;\n }\n },\n ),\n );\n\n skills\n .command(\"correct <activationId>\")\n .description(\"Mark a specific generated skill activation as a false-positive\")\n .requiredOption(\"--reason <reason>\", \"Why the user corrected or rejected the skill\")\n .option(\"--json\", \"Emit JSON\")\n .action(\n withExit(async (activationId: string, opts?: { reason?: string; json?: boolean }) => {\n const activation = lifecycle.markFalsePositive(activationId, opts?.reason ?? \"user correction\");\n if (!activation) {\n console.error(`error: activation not found: ${activationId}`);\n process.exitCode = 1;\n return;\n }\n const skill = factsDb.getGeneratedSkillByName(activation.skillName, activation.procedureId);\n if (opts?.json) {\n console.log(JSON.stringify({ activation, skill }, null, 2));\n return;\n }\n console.log(\n `Marked activation ${activation.id} for ${activation.skillName} as false-positive (state=${skill?.skillState ?? \"experimental\"})`,\n );\n }),\n );\n\n skills\n .command(\"demote <skillName>\")\n .description(\"Demote a generated skill that is over-triggering or otherwise unsafe\")\n .requiredOption(\"--reason <reason>\", \"Operator reason for demotion\")\n .option(\"--json\", \"Emit JSON\")\n .action(\n withExit(async (skillName: string, opts?: { reason?: string; json?: boolean }) => {\n const updated = lifecycle.setState(skillName, \"demoted\", opts?.reason ?? \"manual demotion\");\n if (!updated) {\n console.error(`error: generated skill not found: ${skillName}`);\n process.exitCode = 1;\n return;\n }\n if (opts?.json) {\n console.log(JSON.stringify(updated, null, 2));\n return;\n }\n console.log(`Demoted ${skillName}: ${updated.skillStateReason ?? \"manual demotion\"}`);\n }),\n );\n\n skills\n .command(\"reset <skillName>\")\n .description(\n \"Reset a demoted or archived skill back to experimental for a second chance.\\nUse this when a skill was wrongly demoted or after agent behaviour has changed.\",\n )\n .requiredOption(\"--reason <reason>\", \"Operator reason for the reset\")\n .option(\"--json\", \"Emit JSON\")\n .action(\n withExit(async (skillName: string, opts?: { reason?: string; json?: boolean }) => {\n const current = lifecycle.getSkill(skillName);\n if (!current) {\n console.error(`error: generated skill not found: ${skillName}`);\n process.exitCode = 1;\n return;\n }\n if (\n current.skillState !== \"demoted\" &&\n current.skillState !== \"archived\" &&\n current.skillState !== \"uninstalled\"\n ) {\n console.error(\n `error: skill '${skillName}' is in state '${current.skillState ?? \"experimental\"}' — only demoted, archived, or uninstalled skills can be reset`,\n );\n process.exitCode = 1;\n return;\n }\n const updated = lifecycle.setState(skillName, \"experimental\", opts?.reason ?? \"manual reset\");\n if (!updated) {\n console.error(`error: generated skill not found: ${skillName}`);\n process.exitCode = 1;\n return;\n }\n if (opts?.json) {\n console.log(JSON.stringify(updated, null, 2));\n return;\n }\n console.log(`Reset ${skillName} to experimental: ${updated.skillStateReason ?? \"manual reset\"}`);\n }),\n );\n\n skills\n .command(\"doctor\")\n .description(\n \"Scan for generated skills whose SKILL.md no longer exists on disk.\\n\" +\n \"Reports rows with missing files and optionally marks them as uninstalled.\",\n )\n .option(\"--fix\", \"Mark missing skills as uninstalled in the DB\")\n .option(\"--workspace <path>\", \"Workspace root used to resolve relative skill paths\")\n .option(\"--json\", \"Emit JSON\")\n .action(\n withExit(async (opts?: { fix?: boolean; workspace?: string; json?: boolean }) => {\n const report = lifecycle.reconcileDiskState({\n fix: opts?.fix === true,\n workspaceRoot: opts?.workspace,\n });\n if (!report) {\n console.error(\"error: facts DB is not open\");\n process.exitCode = 1;\n return;\n }\n const failedCount = report.failedFixCount;\n if (opts?.fix && failedCount > 0) {\n process.exitCode = 2;\n }\n const outputReport = { ...report, failedCount, exitCode: process.exitCode ?? 0 };\n if (opts?.json) {\n console.log(JSON.stringify(outputReport, null, 2));\n return;\n }\n console.log(`Skills doctor: checked ${report.totalChecked} generated skill(s) at ${report.checkedAt}`);\n if (report.issues.length === 0) {\n console.log(\"✓ All generated skills found on disk.\");\n return;\n }\n console.log(`\\n⚠ ${report.issues.length} skill(s) missing on disk:`);\n for (const issue of report.issues) {\n console.log(` [${issue.state}] ${issue.skillName}`);\n console.log(` path: ${issue.skillPath}`);\n console.log(` expected at: ${issue.resolvedAbsolutePath}`);\n }\n if (!opts?.fix) {\n console.log(\"\\nRun with --fix to mark these as uninstalled in the DB.\");\n } else {\n console.log(`\\nMarked ${report.fixedCount} missing skill(s) as uninstalled.`);\n for (const issue of report.issues.filter((row) => row.fixed)) {\n console.log(` fixed: ${issue.skillName} (${issue.procedureId})`);\n }\n if (failedCount > 0) {\n console.log(` failed: ${failedCount} skill(s) could not be marked uninstalled.`);\n }\n }\n }),\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"skills.js","names":[],"sources":["../../cli/skills.ts"],"sourcesContent":["/**\n * CLI: skill proposal queue (crystallization lifecycle) and generated-skill telemetry.\n *\n * Commands:\n * - hybrid-mem skills queue | show | validate | reject | install | rescan | telemetry …\n */\n\nimport type { FactsDB } from \"../backends/facts-db.js\";\nimport type { CrystallizationQueueStatusFilter, CrystallizationStore } from \"../backends/crystallization-store.js\";\nimport {\n assertCrystallizationQueueStatusFilter,\n CRYSTALLIZATION_QUEUE_STATUS_FILTERS,\n} from \"../backends/crystallization-store.js\";\nimport type { HybridMemoryConfig } from \"../config.js\";\nimport { CrystallizationProposer } from \"../services/crystallization-proposer.js\";\nimport {\n summarizeSkillProposalValidation,\n type SkillProposalValidationResult,\n} from \"../services/generated-skill-validation.js\";\nimport { GeneratedSkillLifecycleService } from \"../services/generated-skill-lifecycle.js\";\nimport { auditAutoSkills, quarantineAutoSkills } from \"../services/auto-skills-audit.js\";\nimport { SkillValidator } from \"../services/skill-validator.js\";\nimport { resolveWorkspacePath } from \"../utils/path.js\";\nimport type { Chainable } from \"./shared.js\";\nimport { relativeTime, withExit } from \"./shared.js\";\n\ntype ArgumentChainable = {\n command(name: string): ArgumentChainable;\n argument(name: string, desc?: string): ArgumentChainable;\n description(desc: string): ArgumentChainable;\n option(flags: string, desc?: string, defaultValue?: unknown): ArgumentChainable;\n requiredOption(flags: string, desc?: string, defaultValue?: unknown): ArgumentChainable;\n action(fn: (...args: any[]) => void | Promise<void>): ArgumentChainable;\n};\n\ntype SkillsCliContext = {\n crystallizationStore?: CrystallizationStore | null;\n cfg: HybridMemoryConfig;\n factsDb?: FactsDB | null;\n};\n\nfunction formatIso(ts: number | null | undefined): string {\n return typeof ts === \"number\" && ts > 0 ? new Date(ts * 1000).toISOString() : \"never\";\n}\n\nfunction formatRate(value: number | null | undefined): string {\n return typeof value === \"number\" ? `${Math.round(value * 100)}%` : \"n/a\";\n}\n\nfunction requireStore(ctx: SkillsCliContext): CrystallizationStore {\n const store = ctx.crystallizationStore;\n if (!store) {\n throw new Error(\"Crystallization store is not available (plugin not fully initialized?)\");\n }\n return store;\n}\n\nfunction formatProposalReadiness(p: { validationResult?: SkillProposalValidationResult }): string {\n const vr = p.validationResult;\n if (!vr) return \" — validation: not run\";\n if (vr.approvalDecision === \"allow\") return \" — ready ✓\";\n if (vr.approvalDecision === \"allow-with-override\") return \" — needs override\";\n if (vr.approvalDecision === \"deny\") return \" — blocked (deny)\";\n return ` — ${vr.approvalDecision}`;\n}\n\nexport function registerSkillsCommands(mem: Chainable, ctx: SkillsCliContext): void {\n const skills = mem\n .command(\"skills\")\n .description(\"Generated skill proposals (crystallization queue) and promoted-skill telemetry\") as ArgumentChainable;\n\n const factsDb = ctx.factsDb ?? null;\n if (factsDb) {\n registerGeneratedSkillTelemetryCli(skills, factsDb);\n }\n\n const queue = skills.command(\"queue\") as ArgumentChainable;\n\n queue\n .description(\"List proposal cards in the approval queue\")\n .option(\n \"--status <status>\",\n `Filter: ${CRYSTALLIZATION_QUEUE_STATUS_FILTERS.join(\", \")} (pending=drafted+validated, approved=approved+installed; ready=validated+allow; needs-override=validated+allow-with-override)`,\n )\n .option(\"--limit <n>\", \"Limit results (default: 20)\")\n .option(\"--json\", \"Print JSON\")\n .action(\n withExit(async (opts: { status?: string; limit?: string; json?: boolean }) => {\n const store = requireStore(ctx);\n const limit = opts.limit ? Math.max(1, Math.min(100, Number(opts.limit))) : 20;\n const status = (opts.status as CrystallizationQueueStatusFilter | undefined) ?? undefined;\n let proposals;\n try {\n assertCrystallizationQueueStatusFilter(opts.status);\n proposals = store.list({ status, limit });\n } catch (err) {\n console.error(`error: ${err instanceof Error ? err.message : String(err)}`);\n process.exitCode = 1;\n return;\n }\n\n if (opts.json) {\n console.log(JSON.stringify({ ok: true, count: proposals.length, proposals }, null, 2));\n return;\n }\n\n if (proposals.length === 0) {\n console.log(status ? `No ${status} skill proposals found.` : \"No skill proposals found.\");\n return;\n }\n\n for (const p of proposals) {\n let observed = \"\";\n try {\n const snap = JSON.parse(p.patternSnapshot) as { totalCount?: number; successRate?: number };\n if (typeof snap.totalCount === \"number\") {\n observed = ` (${snap.totalCount} runs, ${Math.round((snap.successRate ?? 0) * 100)}% success)`;\n }\n } catch {\n // ignore\n }\n console.log(`[${p.status}] ${p.skillName}${observed}${formatProposalReadiness(p)}`);\n console.log(` id: ${p.id}`);\n if (p.validationResult) {\n console.log(` validation: ${summarizeSkillProposalValidation(p.validationResult)}`);\n }\n if (p.category) console.log(` category: ${p.category}`);\n if (p.outputPath) console.log(` output: ${p.outputPath}`);\n if (p.rejectionReason) console.log(` rejected: ${p.rejectionReason}`);\n console.log(\"\");\n }\n }),\n );\n\n (skills.command(\"show\") as ArgumentChainable)\n .description(\"Show a single proposal card and draft content\")\n .argument(\"<id>\", \"Proposal id\")\n .option(\"--json\", \"Print JSON\")\n .action(\n withExit(async (id: string, opts: { json?: boolean }) => {\n const store = requireStore(ctx);\n const proposal = store.getById(id);\n if (!proposal) {\n console.error(`Proposal '${id}' not found`);\n process.exitCode = 1;\n return;\n }\n\n let card: unknown = null;\n if (proposal.proposalCardJson) {\n try {\n card = JSON.parse(proposal.proposalCardJson);\n } catch {\n card = null;\n }\n }\n\n if (opts.json) {\n console.log(JSON.stringify({ ok: true, proposal, card }, null, 2));\n return;\n }\n\n console.log(`[${proposal.status}] ${proposal.skillName}`);\n console.log(`id: ${proposal.id}`);\n console.log(`patternId: ${proposal.patternId}`);\n console.log(`evidenceHash: ${proposal.evidenceHash}`);\n if (proposal.category) console.log(`category: ${proposal.category}`);\n if (proposal.outputPath) console.log(`output: ${proposal.outputPath}`);\n if (proposal.rejectionReason) console.log(`rejection: ${proposal.rejectionReason}`);\n if (card) console.log(`card: ${JSON.stringify(card, null, 2)}`);\n console.log(\"\");\n console.log(proposal.skillContent);\n }),\n );\n\n (skills.command(\"validate\") as ArgumentChainable)\n .description(\n \"Run the full GSV validation pipeline (static + dry-load + activation) against the draft SKILL.md \" +\n \"— same validator as 'skills install'. Use --legacy for a quick static-only check.\",\n )\n .argument(\"<id>\", \"Proposal id\")\n .option(\"--legacy\", \"Run only the fast SkillValidator (static checks only — skips dry-load and activation eval)\")\n .option(\"--json\", \"Print JSON\")\n .action(\n withExit(async (id: string, opts: { legacy?: boolean; json?: boolean }) => {\n const store = requireStore(ctx);\n const proposal = store.getById(id);\n if (!proposal) {\n console.error(`Proposal '${id}' not found`);\n process.exitCode = 1;\n return;\n }\n\n if (opts.legacy) {\n // Cheap path: run only SkillValidator (static checks without dry-load/activation).\n const validator = new SkillValidator({\n sectionTaxonomyOverrides: ctx.cfg.crystallization.sectionTaxonomy,\n });\n const result = validator.validate(proposal.skillContent);\n if (opts.json) {\n console.log(\n JSON.stringify(\n { ok: result.valid, proposalId: id, mode: \"legacy\", violations: result.violations },\n null,\n 2,\n ),\n );\n } else if (result.valid) {\n console.log(`✓ Valid (${id}) [legacy — static only]`);\n } else {\n console.log(`✗ Invalid (${id}) [legacy — static only]`);\n for (const v of result.violations) console.log(` - ${v}`);\n }\n if (!result.valid) process.exitCode = 2;\n return;\n }\n\n // Full GSV pipeline — same validator path used by 'skills install' (issue #1402).\n const proposer = new CrystallizationProposer(null, store, ctx.cfg.crystallization);\n const result = proposer.validateProposal(id);\n if (!result) {\n console.error(`Proposal '${id}' not found`);\n process.exitCode = 1;\n return;\n }\n\n if (opts.json) {\n console.log(\n JSON.stringify(\n {\n ok: result.approvalDecision === \"allow\",\n proposalId: id,\n approvalDecision: result.approvalDecision,\n overallStatus: result.overallStatus,\n staticValidation: {\n status: result.staticValidation.status,\n violations: result.staticValidation.violations,\n },\n dryLoadValidation: {\n status: result.dryLoadValidation.status,\n violations: result.dryLoadValidation.violations,\n },\n syntheticActivationEval: {\n status: result.syntheticActivationEval.status,\n score: result.syntheticActivationEval.score,\n notes: result.syntheticActivationEval.notes,\n },\n summary: summarizeSkillProposalValidation(result),\n },\n null,\n 2,\n ),\n );\n } else {\n const icon =\n result.approvalDecision === \"deny\" ? \"✗\" : result.approvalDecision === \"allow-with-override\" ? \"⚠\" : \"✓\";\n console.log(`${icon} ${result.approvalDecision.toUpperCase()} (${id})`);\n console.log(` static: ${result.staticValidation.status}`);\n console.log(` dry-load: ${result.dryLoadValidation.status}`);\n console.log(\n ` activation: ${result.syntheticActivationEval.status} (score: ${result.syntheticActivationEval.score})`,\n );\n const allViolations = [\n ...result.staticValidation.violations.map((v) => `[static] ${v}`),\n ...result.dryLoadValidation.violations.map((v) => `[dry-load] ${v}`),\n ...result.syntheticActivationEval.notes.map((v) => `[activation] ${v}`),\n ];\n for (const v of allViolations) console.log(` - ${v}`);\n if (result.approvalDecision === \"allow-with-override\") {\n console.log(` → Use --override-warnings with 'skills install ${id}' to bypass activation warnings`);\n }\n }\n\n if (result.approvalDecision !== \"allow\") process.exitCode = 2;\n }),\n );\n\n (skills.command(\"reject\") as ArgumentChainable)\n .description(\"Reject a crystallization proposal or permanently reject an installed generated skill\")\n .argument(\"<target>\", \"Proposal id or generated skill name\")\n .option(\"--reason <reason>\", \"Reason recorded for audit / operator rejection\")\n .option(\"--json\", \"Print JSON\")\n .action(\n withExit(async (target: string, opts?: { reason?: string; json?: boolean }) => {\n const proposal = ctx.crystallizationStore?.getById(target) ?? null;\n if (proposal) {\n const store = requireStore(ctx);\n const proposer = new CrystallizationProposer(null, store, ctx.cfg.crystallization);\n const result = proposer.rejectProposal(target, opts?.reason);\n if (opts?.json) {\n console.log(JSON.stringify({ ok: result.success, ...result }, null, 2));\n if (!result.success) process.exitCode = 1;\n return;\n }\n console.log(result.success ? `✓ ${result.message}` : `✗ ${result.message}`);\n if (!result.success) process.exitCode = 1;\n return;\n }\n\n if (!factsDb) {\n console.error(`error: no proposal or generated skill found for '${target}'`);\n process.exitCode = 1;\n return;\n }\n const lifecycle = new GeneratedSkillLifecycleService(factsDb);\n const current = lifecycle.getSkill(target);\n if (!current) {\n console.error(`error: no proposal or generated skill found for '${target}'`);\n process.exitCode = 1;\n return;\n }\n const reason = opts?.reason?.trim();\n if (!reason) {\n console.error(\"error: --reason is required when rejecting an installed generated skill\");\n process.exitCode = 1;\n return;\n }\n if (current.skillState === \"rejected\" || current.skillState === \"uninstalled\") {\n console.error(\n `error: skill '${target}' is in terminal state '${current.skillState}' — only installed, non-terminal skills can be rejected`,\n );\n process.exitCode = 1;\n return;\n }\n const updated = lifecycle.setState(target, \"rejected\", reason);\n if (!updated) {\n console.error(`error: generated skill not found: ${target}`);\n process.exitCode = 1;\n return;\n }\n if (opts?.json) {\n console.log(JSON.stringify(updated, null, 2));\n return;\n }\n console.log(`Rejected ${target}: ${updated.skillStateReason ?? \"manual rejection\"}`);\n }),\n );\n\n (skills.command(\"install\") as ArgumentChainable)\n .description(\"Approve and install a proposal (writes SKILL.md to the skills directory)\")\n .argument(\"<id>\", \"Proposal id\")\n .option(\"--name <slug>\", \"Rename before install\")\n .option(\"--category <category>\", \"Category override\")\n .option(\"--description <text>\", \"Override proposal description (frontmatter + card)\")\n .option(\"--recommended-output <type>\", \"Output type override (currently: 'SKILL.md only')\", \"SKILL.md only\")\n .option(\"--override-warnings\", \"Approve proposals with activation warnings (explicit operator override)\")\n .option(\"--dry-run\", \"Preview validation and output path without writing SKILL.md to disk\")\n .option(\"--json\", \"Print JSON\")\n .action(\n withExit(\n async (\n id: string,\n opts: {\n name?: string;\n category?: string;\n description?: string;\n recommendedOutput?: string;\n overrideWarnings?: boolean;\n dryRun?: boolean;\n json?: boolean;\n },\n ) => {\n const store = requireStore(ctx);\n\n if (opts.dryRun) {\n // Dry-run: run the full GSV pipeline but do NOT write to disk.\n const proposer = new CrystallizationProposer(null, store, ctx.cfg.crystallization);\n const result = proposer.validateProposal(id, {\n name: opts.name,\n category: opts.category,\n description: opts.description,\n recommendedOutput: opts.recommendedOutput === \"SKILL.md only\" ? \"SKILL.md only\" : undefined,\n });\n if (!result) {\n console.error(`Proposal '${id}' not found`);\n process.exitCode = 1;\n return;\n }\n const dryRunWouldInstall =\n result.approvalDecision === \"allow\" ||\n (result.approvalDecision === \"allow-with-override\" && opts.overrideWarnings === true);\n if (opts.json) {\n console.log(\n JSON.stringify(\n {\n dryRun: true,\n ok: dryRunWouldInstall,\n proposalId: id,\n approvalDecision: result.approvalDecision,\n overallStatus: result.overallStatus,\n staticValidation: {\n status: result.staticValidation.status,\n violations: result.staticValidation.violations,\n outputPath: result.staticValidation.safeOutputPath,\n },\n dryLoadValidation: {\n status: result.dryLoadValidation.status,\n violations: result.dryLoadValidation.violations,\n },\n syntheticActivationEval: {\n status: result.syntheticActivationEval.status,\n score: result.syntheticActivationEval.score,\n notes: result.syntheticActivationEval.notes,\n },\n summary: summarizeSkillProposalValidation(result),\n },\n null,\n 2,\n ),\n );\n if (!dryRunWouldInstall) process.exitCode = 2;\n return;\n }\n const icon =\n result.approvalDecision === \"deny\" ? \"✗\" : result.approvalDecision === \"allow-with-override\" ? \"⚠\" : \"✓\";\n console.log(`[dry-run] ${icon} ${result.approvalDecision.toUpperCase()} (${id})`);\n console.log(` would write to: ${result.staticValidation.safeOutputPath}`);\n console.log(` static: ${result.staticValidation.status}`);\n console.log(` dry-load: ${result.dryLoadValidation.status}`);\n console.log(\n ` activation: ${result.syntheticActivationEval.status} (score: ${result.syntheticActivationEval.score})`,\n );\n const dryViolations = [\n ...result.staticValidation.violations.map((v) => `[static] ${v}`),\n ...result.dryLoadValidation.violations.map((v) => `[dry-load] ${v}`),\n ...result.syntheticActivationEval.notes.map((v) => `[activation] ${v}`),\n ];\n for (const v of dryViolations) console.log(` - ${v}`);\n if (result.approvalDecision === \"allow-with-override\" && !opts.overrideWarnings) {\n console.log(\" → Add --override-warnings to proceed despite activation warnings\");\n }\n if (!dryRunWouldInstall) process.exitCode = 2;\n return;\n }\n\n const proposer = new CrystallizationProposer(null, store, ctx.cfg.crystallization);\n const result = proposer.approveProposal(id, {\n name: opts.name,\n category: opts.category,\n description: opts.description,\n recommendedOutput: opts.recommendedOutput === \"SKILL.md only\" ? \"SKILL.md only\" : undefined,\n overrideWarnings: opts.overrideWarnings === true,\n });\n if (opts.json) {\n console.log(JSON.stringify({ ok: result.success, ...result }, null, 2));\n if (!result.success) process.exitCode = 1;\n return;\n }\n console.log(result.success ? `✓ ${result.message}` : `✗ ${result.message}`);\n if (!result.success) process.exitCode = 1;\n },\n ),\n );\n\n (skills.command(\"suggest\") as ArgumentChainable)\n .description(\n \"List near-eligible procedures with their current blocking gates — proactive promotion candidate triage (#1546).\",\n )\n .option(\"--limit <n>\", \"Max candidates to print (default: 20)\")\n .option(\"--threshold <n>\", \"Validation threshold override (default: 3)\")\n .option(\"--ttl-days <n>\", \"Skill TTL days override (default: 30)\")\n .option(\"--json\", \"Print JSON\")\n .action(\n withExit(async (opts: { limit?: string; threshold?: string; ttlDays?: string; json?: boolean }) => {\n const factsDb = ctx.factsDb;\n if (!factsDb) {\n console.error(\"error: facts DB is not available\");\n process.exitCode = 1;\n return;\n }\n const parsedLimit = Number(opts.limit);\n if (opts.limit && (!Number.isFinite(parsedLimit) || parsedLimit < 1)) {\n console.error(`error: --limit must be a positive number, got: ${opts.limit}`);\n process.exitCode = 1;\n return;\n }\n const limit = opts.limit ? Math.max(1, Math.min(100, parsedLimit)) : 20;\n const parsedThreshold = Number(opts.threshold);\n if (opts.threshold && (!Number.isFinite(parsedThreshold) || parsedThreshold < 1)) {\n console.error(`error: --threshold must be a positive number, got: ${opts.threshold}`);\n process.exitCode = 1;\n return;\n }\n const threshold = opts.threshold ? Math.max(1, parsedThreshold) : 3;\n const parsedTtlDays = Number(opts.ttlDays);\n if (opts.ttlDays && (!Number.isFinite(parsedTtlDays) || parsedTtlDays < 1)) {\n console.error(`error: --ttl-days must be a positive number, got: ${opts.ttlDays}`);\n process.exitCode = 1;\n return;\n }\n const ttlDays = opts.ttlDays ? Math.max(1, parsedTtlDays) : 30;\n // Dry-run generation gives us the per-procedure decision + blocking reasons\n // without touching disk — exactly the data operators need to triage which\n // procedures to nudge with more evidence vs. ignore.\n const { generateAutoSkills } = await import(\"../services/procedure-skill-generator.js\");\n const skillsAutoPath = resolveWorkspacePath(ctx.cfg.procedures.skillsAutoPath ?? \"skills/auto\");\n const result = generateAutoSkills(\n factsDb,\n {\n skillsAutoPath,\n validationThreshold: threshold,\n skillTTLDays: ttlDays,\n maxPerRun: 200,\n dryRun: true,\n policy: \"auto-safe\",\n },\n { info: () => undefined, warn: () => undefined },\n );\n const candidates = (result.decisions ?? [])\n .filter((d) => d.action === \"deferred-for-human\" || d.action === \"failed-validation\")\n .slice(0, limit);\n if (opts.json) {\n console.log(JSON.stringify({ ok: true, summary: result.summary, candidates }, null, 2));\n return;\n }\n const s = result.summary ?? ({ candidates: 0, eligible: 0, drafted: 0, deferred: 0, rejected: 0 } as any);\n console.log(\n `Candidates: ${s.candidates}, eligible: ${s.eligible}, would-draft: ${s.drafted}, deferred: ${s.deferred}, rejected: ${s.rejected}`,\n );\n if (s.defersByReason && Object.keys(s.defersByReason).length > 0) {\n console.log(\"Defer reasons:\");\n for (const [reason, count] of Object.entries(s.defersByReason)) {\n console.log(` - ${reason}: ${count}`);\n }\n }\n for (const c of candidates) {\n console.log(`- ${c.procedureId} [${c.action}] reasons=${(c.reasons ?? []).join(\",\") || \"(none)\"}`);\n }\n }),\n );\n\n (skills.command(\"audit\") as ArgumentChainable)\n .description(\n \"Scan skills/auto generated procedure skills for size, loadability, and suspicious content (dry-run by default)\",\n )\n .option(\"--path <dir>\", \"Skills auto directory (default: skills/auto)\")\n .option(\"--json\", \"Emit JSON report\")\n .option(\"--quarantine\", \"Move oversized/suspicious skills to skills/auto-quarantine/YYYY-MM-DD/\")\n .action(\n withExit(async (opts: { path?: string; json?: boolean; quarantine?: boolean }) => {\n const skillsPath = resolveWorkspacePath(opts.path ?? \"skills/auto\");\n const report = auditAutoSkills(skillsPath);\n if (opts.quarantine) {\n const toMove = report.entries.filter(\n (e) => !e.loadable || e.transcriptLike || e.secretLike || e.injectionLike,\n );\n const result = quarantineAutoSkills(skillsPath, toMove);\n if (opts.json) {\n console.log(JSON.stringify({ ok: result.errors.length === 0, report, quarantine: result }, null, 2));\n if (result.errors.length > 0) process.exitCode = 2;\n return;\n }\n console.log(`Quarantined: ${result.quarantined.join(\", \") || \"(none)\"}`);\n for (const err of result.errors) console.error(` error: ${err}`);\n if (result.errors.length > 0) process.exitCode = 2;\n return;\n }\n if (opts.json) {\n console.log(JSON.stringify({ ok: true, ...report }, null, 2));\n return;\n }\n console.log(\n `Scanned: ${report.scanned}, oversized: ${report.oversized}, suspicious: ${report.suspicious}, quarantinable: ${report.quarantinable}`,\n );\n for (const entry of report.entries) {\n const flags = [\n entry.transcriptLike ? \"transcript\" : null,\n entry.secretLike ? \"secret\" : null,\n entry.injectionLike ? \"injection\" : null,\n ]\n .filter((flag): flag is string => flag != null)\n .join(\", \");\n console.log(\n `- ${entry.slug}: ${entry.skillBytes} B, loadable=${entry.loadable}, transcript=${entry.transcriptLike}, secret=${entry.secretLike}, injection=${entry.injectionLike}${flags ? ` (${flags})` : \"\"}`,\n );\n }\n }),\n );\n\n (skills.command(\"rescan\") as ArgumentChainable)\n .description(\n \"Re-validate on-disk SKILL.md for each installed crystallization proposal; quarantine rows that fail generated-skill validation\",\n )\n .option(\"--json\", \"Print JSON\")\n .action(\n withExit(async (opts: { json?: boolean }) => {\n const store = requireStore(ctx);\n const proposer = new CrystallizationProposer(null, store, ctx.cfg.crystallization);\n const result = proposer.rescanInstalledSkills();\n if (opts.json) {\n console.log(JSON.stringify({ ok: result.errors.length === 0, ...result }, null, 2));\n if (result.errors.length > 0) process.exitCode = 2;\n return;\n }\n console.log(\n `Scanned: ${result.scanned}, quarantined: ${result.quarantined}, skipped (no path): ${result.skipped}`,\n );\n for (const line of result.messages) console.log(` ${line}`);\n for (const line of result.errors) console.error(` error: ${line}`);\n if (result.errors.length > 0) process.exitCode = 2;\n }),\n );\n}\n\nfunction registerGeneratedSkillTelemetryCli(skills: ArgumentChainable, factsDb: FactsDB): void {\n const lifecycle = new GeneratedSkillLifecycleService(factsDb);\n skills\n .command(\"telemetry [skillName]\")\n .description(\"Report generated skill activation telemetry and lifecycle recommendations\")\n .option(\"--json\", \"Emit JSON\")\n .action(\n withExit(async (skillName?: string, opts?: { json?: boolean }) => {\n const report = lifecycle.buildReport({\n skillName,\n recentActivationLimit: skillName ? 20 : 5,\n });\n if (!report || report.rows.length === 0) {\n if (opts?.json) {\n console.log(JSON.stringify(report, null, 2));\n return;\n }\n console.log(\n skillName ? `No generated skill found for ${skillName}.` : \"No generated skills have been promoted yet.\",\n );\n return;\n }\n if (opts?.json) {\n console.log(JSON.stringify(report, null, 2));\n return;\n }\n console.log(\"Generated skill telemetry\");\n for (const row of report.rows) {\n console.log(\n `- ${row.skillName} state=${row.state} activations/week=${row.metrics.activationCountPerWeek} near-miss=${row.metrics.nearMissCount} false+=${row.metrics.falsePositiveSignals} false-=${row.metrics.falseNegativeSignals} lastUsed=${row.metrics.lastUsedAt ? relativeTime(row.metrics.lastUsedAt * 1000) : \"never\"} recommendation=${row.recommendation}`,\n );\n console.log(\n ` outcomes: success=${formatRate(row.metrics.successRate)} failure=${formatRate(row.metrics.failureRate)} partial=${formatRate(row.metrics.partialRate)} userCorrections=${row.metrics.correctionCount} repeatedRequestCorrections=${row.metrics.repeatedCorrectionCount} generatedAt=${formatIso(row.generatedAt)}`,\n );\n if (row.stateReason) console.log(` stateReason: ${row.stateReason}`);\n if (row.flags.overTriggering || row.flags.archiveCandidate || row.flags.revisionCandidate) {\n const flags = [\n row.flags.overTriggering ? \"over-triggering\" : null,\n row.flags.archiveCandidate ? \"archive-candidate\" : null,\n row.flags.revisionCandidate ? \"revise-trigger\" : null,\n ].filter((flag): flag is string => flag != null);\n if (flags.length > 0) console.log(` flags: ${flags.join(\", \")}`);\n }\n if (skillName && row.recentActivations.length > 0) {\n console.log(\" recent activations:\");\n for (const activation of row.recentActivations) {\n console.log(\n ` ${activation.id} ${activation.decision} outcome=${activation.taskOutcome ?? \"unknown\"} correction=${activation.userCorrection ? \"yes\" : \"no\"} at=${formatIso(activation.createdAt)}${activation.requestSummary ? ` request=\"${activation.requestSummary}\"` : \"\"}`,\n );\n }\n }\n }\n }),\n );\n\n skills\n .command(\"record <skillName>\")\n .description(\"Record a generated skill activation or near-miss decision\")\n .option(\"--decision <decision>\", \"selected, considered, or skipped\", \"selected\")\n .option(\"--request-summary <summary>\", \"Redacted request summary\")\n .option(\"--request-hash <hash>\", \"Optional request hash override\")\n .option(\"--confidence <value>\", \"Selection confidence (0-1)\")\n .option(\n \"--reason <reason>\",\n \"Why the skill was selected or skipped (or correction explanation when using --user-correction)\",\n )\n .option(\"--outcome <outcome>\", \"success, failure, partial, or unknown\")\n .option(\n \"--false-positive\",\n \"Operator false-positive signal (sets caused rework; does not record a user correction)\",\n )\n .option(\"--user-correction\", \"Explicit user correction (requires non-empty --reason as correction explanation)\")\n .option(\"--false-negative\", \"Mark this near-miss as a false-negative signal\")\n .option(\"--caused-rework\", \"Mark this activation as having caused rework\")\n .option(\"--saved-tool-calls <n>\", \"Estimate tool calls saved\")\n .option(\"--saved-time-ms <n>\", \"Estimate milliseconds saved\")\n .option(\"--scope <scope>\", \"global, user, agent, or session\")\n .option(\"--scope-target <id>\", \"Scope target id\")\n .option(\"--agent-id <id>\", \"Agent id\")\n .option(\"--session-id <id>\", \"Session id\")\n .option(\"--procedure-id <id>\", \"Procedure id to disambiguate skills with same basename\")\n .option(\"--json\", \"Emit JSON\")\n .action(\n withExit(\n async (\n skillName: string,\n opts?: {\n decision?: string;\n requestSummary?: string;\n requestHash?: string;\n confidence?: string;\n reason?: string;\n outcome?: string;\n falsePositive?: boolean;\n userCorrection?: boolean;\n falseNegative?: boolean;\n causedRework?: boolean;\n savedToolCalls?: string;\n savedTimeMs?: string;\n scope?: string;\n scopeTarget?: string;\n agentId?: string;\n sessionId?: string;\n procedureId?: string;\n json?: boolean;\n },\n ) => {\n const decision = opts?.decision ?? \"selected\";\n if (![\"selected\", \"considered\", \"skipped\"].includes(decision)) {\n console.error(`error: invalid --decision: ${decision}`);\n process.exitCode = 1;\n return;\n }\n const outcome = opts?.outcome;\n if (outcome && ![\"success\", \"failure\", \"partial\", \"unknown\"].includes(outcome)) {\n console.error(`error: invalid --outcome: ${outcome}`);\n process.exitCode = 1;\n return;\n }\n if (opts?.scope && ![\"global\", \"user\", \"agent\", \"session\"].includes(opts.scope)) {\n console.error(`error: invalid --scope: ${opts.scope}`);\n process.exitCode = 1;\n return;\n }\n const confidence = opts?.confidence != null ? Number.parseFloat(opts.confidence) : null;\n if (\n opts?.confidence != null &&\n (confidence == null || !Number.isFinite(confidence) || confidence < 0 || confidence > 1)\n ) {\n console.error(\"error: --confidence must be a number between 0 and 1\");\n process.exitCode = 1;\n return;\n }\n const savedToolCalls = opts?.savedToolCalls != null ? Number.parseInt(opts.savedToolCalls, 10) : null;\n if (\n opts?.savedToolCalls != null &&\n (savedToolCalls == null || !Number.isFinite(savedToolCalls) || savedToolCalls < 0)\n ) {\n console.error(\"error: --saved-tool-calls must be a non-negative integer\");\n process.exitCode = 1;\n return;\n }\n const savedTimeMs = opts?.savedTimeMs != null ? Number.parseInt(opts.savedTimeMs, 10) : null;\n if (opts?.savedTimeMs != null && (savedTimeMs == null || !Number.isFinite(savedTimeMs) || savedTimeMs < 0)) {\n console.error(\"error: --saved-time-ms must be a non-negative integer\");\n process.exitCode = 1;\n return;\n }\n const userCorrection = opts?.userCorrection === true;\n const operatorFalsePositive = opts?.falsePositive === true;\n if (userCorrection) {\n const r = (opts?.reason ?? \"\").trim();\n if (!r) {\n console.error(\"error: --user-correction requires a non-empty --reason (correction explanation)\");\n process.exitCode = 1;\n return;\n }\n }\n const causedRework = opts?.causedRework === true || operatorFalsePositive;\n try {\n const activation = lifecycle.recordTelemetry({\n skillName,\n procedureId: opts?.procedureId,\n decision: decision as \"selected\" | \"considered\" | \"skipped\",\n requestSummary: opts?.requestSummary,\n requestHash: opts?.requestHash,\n confidence,\n reason: userCorrection ? undefined : opts?.reason,\n taskOutcome: outcome as \"success\" | \"failure\" | \"partial\" | \"unknown\" | undefined,\n userCorrection,\n correctionReason: userCorrection ? opts?.reason?.trim() : undefined,\n falseNegativeSignal: opts?.falseNegative,\n causedRework,\n savedToolCalls,\n savedTimeMs,\n scope: opts?.scope as \"global\" | \"user\" | \"agent\" | \"session\" | undefined,\n scopeTarget: opts?.scopeTarget,\n agentId: opts?.agentId,\n sessionId: opts?.sessionId,\n });\n if (!activation) {\n console.error(\"error: facts DB is not open\");\n process.exitCode = 1;\n return;\n }\n const skill = factsDb.getGeneratedSkillByName(skillName, activation.procedureId);\n if (opts?.json) {\n console.log(JSON.stringify({ activation, skill }, null, 2));\n return;\n }\n console.log(\n `Recorded ${activation.decision} for ${activation.skillName} as ${activation.id} (state=${skill?.skillState ?? \"experimental\"})`,\n );\n } catch (err) {\n console.error(`error: ${err instanceof Error ? err.message : String(err)}`);\n process.exitCode = 1;\n }\n },\n ),\n );\n\n skills\n .command(\"correct <activationId>\")\n .description(\"Mark a specific generated skill activation as a false-positive\")\n .requiredOption(\"--reason <reason>\", \"Why the user corrected or rejected the skill\")\n .option(\"--json\", \"Emit JSON\")\n .action(\n withExit(async (activationId: string, opts?: { reason?: string; json?: boolean }) => {\n const activation = lifecycle.markFalsePositive(activationId, opts?.reason ?? \"user correction\");\n if (!activation) {\n console.error(`error: activation not found: ${activationId}`);\n process.exitCode = 1;\n return;\n }\n const skill = factsDb.getGeneratedSkillByName(activation.skillName, activation.procedureId);\n if (opts?.json) {\n console.log(JSON.stringify({ activation, skill }, null, 2));\n return;\n }\n console.log(\n `Marked activation ${activation.id} for ${activation.skillName} as false-positive (state=${skill?.skillState ?? \"experimental\"})`,\n );\n }),\n );\n\n skills\n .command(\"demote <skillName>\")\n .description(\"Demote a generated skill that is over-triggering or otherwise unsafe\")\n .requiredOption(\"--reason <reason>\", \"Operator reason for demotion\")\n .option(\"--json\", \"Emit JSON\")\n .action(\n withExit(async (skillName: string, opts?: { reason?: string; json?: boolean }) => {\n const updated = lifecycle.setState(skillName, \"demoted\", opts?.reason ?? \"manual demotion\");\n if (!updated) {\n console.error(`error: generated skill not found: ${skillName}`);\n process.exitCode = 1;\n return;\n }\n if (opts?.json) {\n console.log(JSON.stringify(updated, null, 2));\n return;\n }\n console.log(`Demoted ${skillName}: ${updated.skillStateReason ?? \"manual demotion\"}`);\n }),\n );\n\n skills\n .command(\"reset <skillName>\")\n .description(\n \"Reset a demoted or archived skill back to experimental for a second chance.\\nUse this when a skill was wrongly demoted or after agent behaviour has changed.\",\n )\n .requiredOption(\"--reason <reason>\", \"Operator reason for the reset\")\n .option(\"--json\", \"Emit JSON\")\n .action(\n withExit(async (skillName: string, opts?: { reason?: string; json?: boolean }) => {\n const current = lifecycle.getSkill(skillName);\n if (!current) {\n console.error(`error: generated skill not found: ${skillName}`);\n process.exitCode = 1;\n return;\n }\n if (\n current.skillState !== \"demoted\" &&\n current.skillState !== \"archived\" &&\n current.skillState !== \"uninstalled\"\n ) {\n console.error(\n `error: skill '${skillName}' is in state '${current.skillState ?? \"experimental\"}' — only demoted, archived, or uninstalled skills can be reset`,\n );\n process.exitCode = 1;\n return;\n }\n const updated = lifecycle.setState(skillName, \"experimental\", opts?.reason ?? \"manual reset\");\n if (!updated) {\n console.error(`error: generated skill not found: ${skillName}`);\n process.exitCode = 1;\n return;\n }\n if (opts?.json) {\n console.log(JSON.stringify(updated, null, 2));\n return;\n }\n console.log(`Reset ${skillName} to experimental: ${updated.skillStateReason ?? \"manual reset\"}`);\n }),\n );\n\n skills\n .command(\"doctor\")\n .description(\n \"Scan for generated skills whose SKILL.md no longer exists on disk.\\n\" +\n \"Reports rows with missing files and optionally marks them as uninstalled.\",\n )\n .option(\"--fix\", \"Mark missing skills as uninstalled in the DB\")\n .option(\"--workspace <path>\", \"Workspace root used to resolve relative skill paths\")\n .option(\"--json\", \"Emit JSON\")\n .action(\n withExit(async (opts?: { fix?: boolean; workspace?: string; json?: boolean }) => {\n const report = lifecycle.reconcileDiskState({\n fix: opts?.fix === true,\n workspaceRoot: opts?.workspace,\n });\n if (!report) {\n console.error(\"error: facts DB is not open\");\n process.exitCode = 1;\n return;\n }\n const failedCount = report.failedFixCount;\n if (opts?.fix && failedCount > 0) {\n process.exitCode = 2;\n }\n const outputReport = { ...report, failedCount, exitCode: process.exitCode ?? 0 };\n if (opts?.json) {\n console.log(JSON.stringify(outputReport, null, 2));\n return;\n }\n console.log(`Skills doctor: checked ${report.totalChecked} generated skill(s) at ${report.checkedAt}`);\n if (report.issues.length === 0) {\n console.log(\"✓ All generated skills found on disk.\");\n return;\n }\n console.log(`\\n⚠ ${report.issues.length} skill(s) missing on disk:`);\n for (const issue of report.issues) {\n console.log(` [${issue.state}] ${issue.skillName}`);\n console.log(` path: ${issue.skillPath}`);\n console.log(` expected at: ${issue.resolvedAbsolutePath}`);\n }\n if (!opts?.fix) {\n console.log(\"\\nRun with --fix to mark these as uninstalled in the DB.\");\n } else {\n console.log(`\\nMarked ${report.fixedCount} missing skill(s) as uninstalled.`);\n for (const issue of report.issues.filter((row) => row.fixed)) {\n console.log(` fixed: ${issue.skillName} (${issue.procedureId})`);\n }\n if (failedCount > 0) {\n console.log(` failed: ${failedCount} skill(s) could not be marked uninstalled.`);\n }\n }\n }),\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"task-queue-status.js","names":[],"sources":["../../cli/task-queue-status.ts"],"sourcesContent":["/**\n * CLI: print task queue state JSON for cron / strategic prompts (#983).\n * Reads ~/.openclaw/workspace/state/task-queue/current.json (after idle placeholder exists).\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { isAbsolute, join } from \"node:path\";\nimport { readActiveTaskFileWithResolvedPath } from \"../services/active-task.js\";\nimport {\n type TaskQueueItem,\n ensureTaskQueueIdlePlaceholder,\n taskQueueItemHasRecognizedSemantics,\n writeCanonicalIdleTaskQueueFile,\n} from \"../services/task-queue-watchdog.js\";\nimport { getEnv } from \"../utils/env-manager.js\";\nimport { readJsonFile } from \"../utils/fs.js\";\nimport type { Chainable } from \"./shared.js\";\n\nexport type TaskQueueStatusCliOptions = {\n stateDir?: string;\n /** Include ACTIVE-TASKS.md summary when the file exists (default path: workspace/ACTIVE-TASKS.md). */\n withActiveTasks?: boolean;\n /** Default ACTIVE-TASKS.md path relative to workspace when not absolute. */\n activeTaskRelativePath?: string;\n};\n\nexport async function runTaskQueueStatusForCli(opts: TaskQueueStatusCliOptions = {}): Promise<void> {\n const dir = opts.stateDir ?? join(homedir(), \".openclaw\", \"workspace\", \"state\", \"task-queue\");\n const currentPath = join(dir, \"current.json\");\n if (!existsSync(currentPath)) {\n console.log(\n JSON.stringify(\n {\n ok: true,\n path: currentPath,\n available: false,\n reason: \"missing\",\n hint: \"Run the gateway with hybrid-memory (task-queue watchdog creates an idle placeholder) or `openclaw hybrid-mem task-queue-touch`.\",\n },\n null,\n 2,\n ),\n );\n return;\n }\n const current = await readJsonFile<TaskQueueItem>(currentPath);\n if (current == null) {\n console.log(\n JSON.stringify(\n {\n ok: true,\n path: currentPath,\n available: false,\n reason: \"malformed\",\n hint: \"current.json exists but is not valid JSON or is empty — repair or replace the file.\",\n },\n null,\n 2,\n ),\n );\n return;\n }\n const recognized = taskQueueItemHasRecognizedSemantics(current);\n const out: Record<string, unknown> = {\n ok: true,\n path: currentPath,\n available: true,\n recognized,\n current,\n };\n if (!recognized) {\n out.hint =\n \"current.json is not a recognized task-queue payload (metadata-only shells are repaired by the watchdog or `task-queue-touch --repair`). See issue #1037.\";\n }\n\n if (opts.withActiveTasks) {\n const workspaceRoot = getEnv(\"OPENCLAW_WORKSPACE\") ?? join(homedir(), \".openclaw\", \"workspace\");\n const rel = opts.activeTaskRelativePath ?? \"ACTIVE-TASKS.md\";\n const activePath = isAbsolute(rel) ? rel : join(workspaceRoot, rel);\n try {\n const file = await readActiveTaskFileWithResolvedPath(activePath, 7 * 24 * 60);\n if (!file) {\n out.activeTasks = { filePath: activePath, available: false };\n } else {\n const { readFrom, ...rest } = file;\n out.activeTasks = {\n filePath: activePath,\n ...(readFrom !== activePath ? { readFrom } : {}),\n active: rest.active.map((t) => ({\n label: t.label,\n description: t.description,\n status: t.status,\n branch: t.branch,\n subagent: t.subagent,\n next: t.next,\n updated: t.updated,\n })),\n completedCount: rest.completed.length,\n };\n }\n } catch {\n out.activeTasks = { filePath: activePath, error: \"could_not_read\" };\n }\n }\n\n console.log(JSON.stringify(out, null, 2));\n}\n\n/** Register task-queue CLI helpers (status JSON + idle touch). */\nexport function registerTaskQueueStatusCommands(mem: Chainable): void {\n mem\n .command(\"task-queue-status\")\n .description(\"Print task-queue current.json as JSON (for cron / scripts; #983)\")\n .option(\"--state-dir <path>\", \"Override state directory (default: ~/.openclaw/workspace/state/task-queue)\")\n .option(\"--with-active-tasks\", \"Include ACTIVE-TASKS.md summary (workspace/ACTIVE-TASKS.md by default)\")\n .option(\n \"--active-task-file <path>\",\n \"ACTIVE-TASKS.md path (absolute or relative to OPENCLAW_WORKSPACE / ~/.openclaw/workspace)\",\n )\n .action(async (opts: { stateDir?: string; withActiveTasks?: boolean; activeTaskFile?: string }) => {\n await runTaskQueueStatusForCli({\n stateDir: opts.stateDir,\n withActiveTasks: !!opts.withActiveTasks,\n activeTaskRelativePath: opts.activeTaskFile,\n });\n });\n\n mem\n .command(\"task-queue-touch\")\n .description(\n \"Create task-queue state dir and idle current.json if missing (#983); use --repair to fix bad snapshots\",\n )\n .option(\"--state-dir <path>\", \"Override state directory\")\n .option(\n \"--repair\",\n \"If current.json exists but is not a recognized queue payload, archive it to history/ and write canonical idle (#1037)\",\n )\n .action(async (opts: { stateDir?: string; repair?: boolean }) => {\n const dir = opts.stateDir ?? join(homedir(), \".openclaw\", \"workspace\", \"state\", \"task-queue\");\n if (opts.repair && existsSync(join(dir, \"current.json\"))) {\n const currentPath = join(dir, \"current.json\");\n const raw = await readJsonFile<TaskQueueItem>(currentPath);\n if (raw === null) {\n console.error(\n \"✗ current.json is malformed (not valid JSON) — delete manually or check task-queue-status for details\",\n );\n return;\n }\n if (!taskQueueItemHasRecognizedSemantics(raw)) {\n const { mkdir, writeFile } = await import(\"node:fs/promises\");\n const histDir = join(dir, \"history\");\n await mkdir(histDir, { recursive: true });\n const archived = {\n ...raw,\n repairedBy: \"task-queue-touch\",\n repairedAt: new Date().toISOString(),\n };\n const body = JSON.stringify(archived, null, 2);\n let dest = \"\";\n for (let attempt = 0; attempt < 16; attempt++) {\n const ts = new Date().toISOString().replace(/[:.]/g, \"-\");\n dest = join(histDir, `${ts}-${randomUUID()}-degenerate-cli.json`);\n try {\n await writeFile(dest, body, { encoding: \"utf-8\", flag: \"wx\" });\n break;\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code !== \"EEXIST\" || attempt === 15) throw e;\n }\n }\n await writeCanonicalIdleTaskQueueFile(dir, { info: (m) => console.log(m) });\n console.log(`✓ Repaired degenerate current.json — archived to ${dest} and wrote idle placeholder`);\n return;\n }\n }\n const wrote = await ensureTaskQueueIdlePlaceholder(dir, {\n info: (m) => console.log(m),\n });\n if (wrote) {\n console.log(`✓ Idle placeholder written under ${dir}`);\n } else {\n console.log(`current.json already exists — left unchanged (${dir})`);\n }\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"task-queue-status.js","names":[],"sources":["../../cli/task-queue-status.ts"],"sourcesContent":["/**\n * CLI: print task queue state JSON for cron / strategic prompts (#983).\n * Reads ~/.openclaw/workspace/state/task-queue/current.json (after idle placeholder exists).\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { isAbsolute, join } from \"node:path\";\nimport { readActiveTaskFileWithResolvedPath } from \"../services/active-task.js\";\nimport {\n type TaskQueueItem,\n ensureTaskQueueIdlePlaceholder,\n taskQueueItemHasRecognizedSemantics,\n writeCanonicalIdleTaskQueueFile,\n} from \"../services/task-queue-watchdog.js\";\nimport { getEnv } from \"../utils/env-manager.js\";\nimport { readJsonFile } from \"../utils/fs.js\";\nimport type { Chainable } from \"./shared.js\";\n\nexport type TaskQueueStatusCliOptions = {\n stateDir?: string;\n /** Include ACTIVE-TASKS.md summary when the file exists (default path: workspace/ACTIVE-TASKS.md). */\n withActiveTasks?: boolean;\n /** Default ACTIVE-TASKS.md path relative to workspace when not absolute. */\n activeTaskRelativePath?: string;\n};\n\nexport async function runTaskQueueStatusForCli(opts: TaskQueueStatusCliOptions = {}): Promise<void> {\n const dir = opts.stateDir ?? join(homedir(), \".openclaw\", \"workspace\", \"state\", \"task-queue\");\n const currentPath = join(dir, \"current.json\");\n if (!existsSync(currentPath)) {\n console.log(\n JSON.stringify(\n {\n ok: true,\n path: currentPath,\n available: false,\n reason: \"missing\",\n hint: \"Run the gateway with hybrid-memory (task-queue watchdog creates an idle placeholder) or `openclaw hybrid-mem task-queue-touch`.\",\n },\n null,\n 2,\n ),\n );\n return;\n }\n const current = await readJsonFile<TaskQueueItem>(currentPath);\n if (current == null) {\n console.log(\n JSON.stringify(\n {\n ok: true,\n path: currentPath,\n available: false,\n reason: \"malformed\",\n hint: \"current.json exists but is not valid JSON or is empty — repair or replace the file.\",\n },\n null,\n 2,\n ),\n );\n return;\n }\n const recognized = taskQueueItemHasRecognizedSemantics(current);\n const out: Record<string, unknown> = {\n ok: true,\n path: currentPath,\n available: true,\n recognized,\n current,\n };\n if (!recognized) {\n out.hint =\n \"current.json is not a recognized task-queue payload (metadata-only shells are repaired by the watchdog or `task-queue-touch --repair`). See issue #1037.\";\n }\n\n if (opts.withActiveTasks) {\n const workspaceRoot = getEnv(\"OPENCLAW_WORKSPACE\") ?? join(homedir(), \".openclaw\", \"workspace\");\n const rel = opts.activeTaskRelativePath ?? \"ACTIVE-TASKS.md\";\n const activePath = isAbsolute(rel) ? rel : join(workspaceRoot, rel);\n try {\n const file = await readActiveTaskFileWithResolvedPath(activePath, 7 * 24 * 60);\n if (!file) {\n out.activeTasks = { filePath: activePath, available: false };\n } else {\n const { readFrom, ...rest } = file;\n out.activeTasks = {\n filePath: activePath,\n ...(readFrom !== activePath ? { readFrom } : {}),\n active: rest.active.map((t) => ({\n label: t.label,\n description: t.description,\n status: t.status,\n branch: t.branch,\n subagent: t.subagent,\n next: t.next,\n updated: t.updated,\n })),\n completedCount: rest.completed.length,\n };\n }\n } catch {\n out.activeTasks = { filePath: activePath, error: \"could_not_read\" };\n }\n }\n\n console.log(JSON.stringify(out, null, 2));\n}\n\n/** Register task-queue CLI helpers (status JSON + idle touch). */\nexport function registerTaskQueueStatusCommands(mem: Chainable): void {\n mem\n .command(\"task-queue-status\")\n .description(\"Print task-queue current.json as JSON (for cron / scripts; #983)\")\n .option(\"--state-dir <path>\", \"Override state directory (default: ~/.openclaw/workspace/state/task-queue)\")\n .option(\"--with-active-tasks\", \"Include ACTIVE-TASKS.md summary (workspace/ACTIVE-TASKS.md by default)\")\n .option(\n \"--active-task-file <path>\",\n \"ACTIVE-TASKS.md path (absolute or relative to OPENCLAW_WORKSPACE / ~/.openclaw/workspace)\",\n )\n .action(async (opts: { stateDir?: string; withActiveTasks?: boolean; activeTaskFile?: string }) => {\n await runTaskQueueStatusForCli({\n stateDir: opts.stateDir,\n withActiveTasks: !!opts.withActiveTasks,\n activeTaskRelativePath: opts.activeTaskFile,\n });\n });\n\n mem\n .command(\"task-queue-touch\")\n .description(\n \"Create task-queue state dir and idle current.json if missing (#983); use --repair to fix bad snapshots\",\n )\n .option(\"--state-dir <path>\", \"Override state directory\")\n .option(\n \"--repair\",\n \"If current.json exists but is not a recognized queue payload, archive it to history/ and write canonical idle (#1037)\",\n )\n .action(async (opts: { stateDir?: string; repair?: boolean }) => {\n const dir = opts.stateDir ?? join(homedir(), \".openclaw\", \"workspace\", \"state\", \"task-queue\");\n if (opts.repair && existsSync(join(dir, \"current.json\"))) {\n const currentPath = join(dir, \"current.json\");\n const raw = await readJsonFile<TaskQueueItem>(currentPath);\n if (raw === null) {\n console.error(\n \"✗ current.json is malformed (not valid JSON) — delete manually or check task-queue-status for details\",\n );\n return;\n }\n if (!taskQueueItemHasRecognizedSemantics(raw)) {\n const { mkdir, writeFile } = await import(\"node:fs/promises\");\n const histDir = join(dir, \"history\");\n await mkdir(histDir, { recursive: true });\n const archived = {\n ...raw,\n repairedBy: \"task-queue-touch\",\n repairedAt: new Date().toISOString(),\n };\n const body = JSON.stringify(archived, null, 2);\n let dest = \"\";\n for (let attempt = 0; attempt < 16; attempt++) {\n const ts = new Date().toISOString().replace(/[:.]/g, \"-\");\n dest = join(histDir, `${ts}-${randomUUID()}-degenerate-cli.json`);\n try {\n await writeFile(dest, body, { encoding: \"utf-8\", flag: \"wx\" });\n break;\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code !== \"EEXIST\" || attempt === 15) throw e;\n }\n }\n await writeCanonicalIdleTaskQueueFile(dir, { info: (m) => console.log(m) });\n console.log(`✓ Repaired degenerate current.json — archived to ${dest} and wrote idle placeholder`);\n return;\n }\n }\n const wrote = await ensureTaskQueueIdlePlaceholder(dir, {\n info: (m) => console.log(m),\n });\n if (wrote) {\n console.log(`✓ Idle placeholder written under ${dir}`);\n } else {\n console.log(`current.json already exists — left unchanged (${dir})`);\n }\n });\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"verified.js","names":[],"sources":["../../cli/verified.ts"],"sourcesContent":["import { dirname, join } from \"node:path\";\nimport type { FactsDB } from \"../backends/facts-db.js\";\nimport { PendingAutopilotStore } from \"../services/pending-autopilot/index.js\";\nimport {\n VERIFIED_REVIEW_QUEUE_SOURCE,\n assertVerifiedTriagePolicy,\n listVerifiedFactTriageItems,\n runVerifiedFactTriage,\n type VerifiedTriagePolicy,\n} from \"../services/verified-fact-triage.js\";\nimport { type Chainable, withExit } from \"./shared.js\";\n\nexport interface VerifiedCliContext {\n factsDb: Pick<FactsDB, \"getRawDb\">;\n resolvedSqlitePath?: string;\n resolvePath?: (file: string) => string;\n reverificationDays?: number;\n}\n\nexport function registerVerifiedCommands(mem: Chainable, ctx: VerifiedCliContext): void {\n const verified = mem.command(\"verified\").description(\"Inspect and conservatively triage verified facts.\");\n\n verified\n .command(\"list\")\n .description(\"List the verified-fact review queue (due-for-reverification latest verified facts).\")\n .option(\"--max <n>\", \"Maximum items to list (default: 100)\")\n .option(\"--policy <policy>\", \"report-only, classify, or apply-obvious (default: classify)\")\n .option(\"--json\", \"Emit structured JSON\")\n .action(\n withExit(async (opts?: { max?: string; policy?: string; json?: boolean }) => {\n const max = parsePositiveInt(opts?.max, 100);\n const policy: VerifiedTriagePolicy = assertVerifiedTriagePolicy(String(opts?.policy ?? \"classify\"));\n const items = listVerifiedFactTriageItems(ctx.factsDb.getRawDb(), {\n max,\n reverificationDays: ctx.reverificationDays,\n policy,\n });\n const output = {\n reviewQueueSource: VERIFIED_REVIEW_QUEUE_SOURCE,\n count: items.length,\n items: items.map((item) => ({\n verifiedFactId: item.payload.verified.id,\n factId: item.payload.verified.factId,\n nextVerification: item.payload.verified.nextVerification,\n verifiedAt: item.payload.verified.verifiedAt,\n scope: item.payload.fact?.scope ?? null,\n scopeTarget: item.payload.fact?.scopeTarget ?? null,\n inputHash: item.inputHash,\n })),\n };\n if (opts?.json) console.log(JSON.stringify(output, null, 2));\n else {\n console.log(`Verified review queue source: ${VERIFIED_REVIEW_QUEUE_SOURCE}`);\n console.log(`Pending verified-fact reviews: ${output.count}`);\n for (const item of output.items) {\n console.log(`- ${item.factId} (verified=${item.verifiedFactId}, next=${item.nextVerification ?? \"none\"})`);\n }\n }\n }),\n );\n\n verified\n .command(\"triage\")\n .description(\"Classify due verified-fact reviews with conservative non-destructive policies.\")\n .option(\"--dry-run\", \"Preview only; persist no durable review/foundation state\")\n .option(\"--apply\", \"Persist allowed non-destructive pending-autopilot decisions\")\n .option(\"--policy <policy>\", \"report-only, classify, or apply-obvious (default: report-only)\")\n .option(\"--max <n>\", \"Maximum items to inspect (default: 100)\")\n .option(\"--json\", \"Emit structured JSON\")\n .action(\n withExit(async (opts?: { dryRun?: boolean; apply?: boolean; policy?: string; max?: string; json?: boolean }) => {\n if (opts?.dryRun && opts?.apply) throw new Error(\"Use only one of --dry-run or --apply\");\n const mode = opts?.apply ? \"apply\" : \"dry-run\";\n const policy: VerifiedTriagePolicy = assertVerifiedTriagePolicy(String(opts?.policy ?? \"report-only\"));\n if (mode === \"apply\" && policy === \"report-only\") {\n throw new Error(\n \"Policy report-only is preview-only; use --dry-run or choose --policy classify/apply-obvious.\",\n );\n }\n const max = parsePositiveInt(opts?.max, 100);\n const store =\n mode === \"apply\" && policy !== \"report-only\"\n ? new PendingAutopilotStore(resolvePendingAutopilotPath(ctx))\n : null;\n try {\n const result = await runVerifiedFactTriage(ctx.factsDb, {\n mode,\n policy,\n max,\n reverificationDays: ctx.reverificationDays,\n store,\n });\n if (opts?.json) console.log(JSON.stringify(result, null, 2));\n else printHumanTriage(result);\n } finally {\n store?.close();\n }\n }),\n );\n}\n\nfunction parsePositiveInt(value: string | undefined, fallback: number): number {\n if (value == null) return fallback;\n const parsed = Number.parseInt(value, 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;\n}\n\nfunction resolvePendingAutopilotPath(ctx: VerifiedCliContext): string {\n if (ctx.resolvePath) return ctx.resolvePath(\"pending-autopilot.db\");\n if (ctx.resolvedSqlitePath) return join(dirname(ctx.resolvedSqlitePath), \"pending-autopilot.db\");\n return \"./pending-autopilot.db\";\n}\n\nfunction printHumanTriage(result: Awaited<ReturnType<typeof runVerifiedFactTriage>>): void {\n console.log(`Verified fact triage ${result.mode} policy=${result.policy}`);\n console.log(`Queue source: ${result.reviewQueueSource}`);\n console.log(\n `Inspected ${result.counts.inspected}; human-review ${result.counts.needsHuman}; applied metadata ${result.counts.applied}; failed ${result.counts.failed}`,\n );\n const groups = new Map<string, typeof result.items>();\n for (const item of result.items) groups.set(item.bucket, [...(groups.get(item.bucket) ?? []), item]);\n for (const [bucket, items] of groups) {\n console.log(`\\n${bucket}: ${items.length}`);\n for (const item of items) console.log(`- ${item.factId}: ${item.reason} (${item.recommendedAction})`);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"verified.js","names":[],"sources":["../../cli/verified.ts"],"sourcesContent":["import { dirname, join } from \"node:path\";\nimport type { FactsDB } from \"../backends/facts-db.js\";\nimport { PendingAutopilotStore } from \"../services/pending-autopilot/index.js\";\nimport {\n VERIFIED_REVIEW_QUEUE_SOURCE,\n assertVerifiedTriagePolicy,\n listVerifiedFactTriageItems,\n runVerifiedFactTriage,\n type VerifiedTriagePolicy,\n} from \"../services/verified-fact-triage.js\";\nimport { type Chainable, withExit } from \"./shared.js\";\n\nexport interface VerifiedCliContext {\n factsDb: Pick<FactsDB, \"getRawDb\">;\n resolvedSqlitePath?: string;\n resolvePath?: (file: string) => string;\n reverificationDays?: number;\n}\n\nexport function registerVerifiedCommands(mem: Chainable, ctx: VerifiedCliContext): void {\n const verified = mem.command(\"verified\").description(\"Inspect and conservatively triage verified facts.\");\n\n verified\n .command(\"list\")\n .description(\"List the verified-fact review queue (due-for-reverification latest verified facts).\")\n .option(\"--max <n>\", \"Maximum items to list (default: 100)\")\n .option(\"--policy <policy>\", \"report-only, classify, or apply-obvious (default: classify)\")\n .option(\"--json\", \"Emit structured JSON\")\n .action(\n withExit(async (opts?: { max?: string; policy?: string; json?: boolean }) => {\n const max = parsePositiveInt(opts?.max, 100);\n const policy: VerifiedTriagePolicy = assertVerifiedTriagePolicy(String(opts?.policy ?? \"classify\"));\n const items = listVerifiedFactTriageItems(ctx.factsDb.getRawDb(), {\n max,\n reverificationDays: ctx.reverificationDays,\n policy,\n });\n const output = {\n reviewQueueSource: VERIFIED_REVIEW_QUEUE_SOURCE,\n count: items.length,\n items: items.map((item) => ({\n verifiedFactId: item.payload.verified.id,\n factId: item.payload.verified.factId,\n nextVerification: item.payload.verified.nextVerification,\n verifiedAt: item.payload.verified.verifiedAt,\n scope: item.payload.fact?.scope ?? null,\n scopeTarget: item.payload.fact?.scopeTarget ?? null,\n inputHash: item.inputHash,\n })),\n };\n if (opts?.json) console.log(JSON.stringify(output, null, 2));\n else {\n console.log(`Verified review queue source: ${VERIFIED_REVIEW_QUEUE_SOURCE}`);\n console.log(`Pending verified-fact reviews: ${output.count}`);\n for (const item of output.items) {\n console.log(`- ${item.factId} (verified=${item.verifiedFactId}, next=${item.nextVerification ?? \"none\"})`);\n }\n }\n }),\n );\n\n verified\n .command(\"triage\")\n .description(\"Classify due verified-fact reviews with conservative non-destructive policies.\")\n .option(\"--dry-run\", \"Preview only; persist no durable review/foundation state\")\n .option(\"--apply\", \"Persist allowed non-destructive pending-autopilot decisions\")\n .option(\"--policy <policy>\", \"report-only, classify, or apply-obvious (default: report-only)\")\n .option(\"--max <n>\", \"Maximum items to inspect (default: 100)\")\n .option(\"--json\", \"Emit structured JSON\")\n .action(\n withExit(async (opts?: { dryRun?: boolean; apply?: boolean; policy?: string; max?: string; json?: boolean }) => {\n if (opts?.dryRun && opts?.apply) throw new Error(\"Use only one of --dry-run or --apply\");\n const mode = opts?.apply ? \"apply\" : \"dry-run\";\n const policy: VerifiedTriagePolicy = assertVerifiedTriagePolicy(String(opts?.policy ?? \"report-only\"));\n if (mode === \"apply\" && policy === \"report-only\") {\n throw new Error(\n \"Policy report-only is preview-only; use --dry-run or choose --policy classify/apply-obvious.\",\n );\n }\n const max = parsePositiveInt(opts?.max, 100);\n const store =\n mode === \"apply\" && policy !== \"report-only\"\n ? new PendingAutopilotStore(resolvePendingAutopilotPath(ctx))\n : null;\n try {\n const result = await runVerifiedFactTriage(ctx.factsDb, {\n mode,\n policy,\n max,\n reverificationDays: ctx.reverificationDays,\n store,\n });\n if (opts?.json) console.log(JSON.stringify(result, null, 2));\n else printHumanTriage(result);\n } finally {\n store?.close();\n }\n }),\n );\n}\n\nfunction parsePositiveInt(value: string | undefined, fallback: number): number {\n if (value == null) return fallback;\n const parsed = Number.parseInt(value, 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;\n}\n\nfunction resolvePendingAutopilotPath(ctx: VerifiedCliContext): string {\n if (ctx.resolvePath) return ctx.resolvePath(\"pending-autopilot.db\");\n if (ctx.resolvedSqlitePath) return join(dirname(ctx.resolvedSqlitePath), \"pending-autopilot.db\");\n return \"./pending-autopilot.db\";\n}\n\nfunction printHumanTriage(result: Awaited<ReturnType<typeof runVerifiedFactTriage>>): void {\n console.log(`Verified fact triage ${result.mode} policy=${result.policy}`);\n console.log(`Queue source: ${result.reviewQueueSource}`);\n console.log(\n `Inspected ${result.counts.inspected}; human-review ${result.counts.needsHuman}; applied metadata ${result.counts.applied}; failed ${result.counts.failed}`,\n );\n const groups = new Map<string, typeof result.items>();\n for (const item of result.items) groups.set(item.bucket, [...(groups.get(item.bucket) ?? []), item]);\n for (const [bucket, items] of groups) {\n console.log(`\\n${bucket}: ${items.length}`);\n for (const item of items) console.log(`- ${item.factId}: ${item.reason} (${item.recommendedAction})`);\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"fact-count.js","names":[],"sources":["../../../cli/verify/fact-count.ts"],"sourcesContent":["import type { DatabaseSync } from \"node:sqlite\";\n\nconst VERIFY_FACT_COUNT_TTL_MS = 5 * 60_000;\nlet verifyFactCountCache: { path: string; n: number; at: number } | null = null;\n\nexport function readApproxFactsRowCount(db: DatabaseSync): number | null {\n try {\n const row = db.prepare(`SELECT stat FROM sqlite_stat1 WHERE tbl = 'facts' LIMIT 1`).get() as\n | { stat: string | number }\n | undefined;\n if (row == null || row.stat === undefined || row.stat === null) return null;\n const statStr = String(row.stat).trim();\n const firstInt = statStr.split(/\\s+/)[0];\n if (!firstInt) return null;\n const n = Number.parseInt(firstInt, 10);\n return Number.isFinite(n) && n >= 0 ? Math.floor(n) : null;\n } catch {\n return null;\n }\n}\n\nexport function getCachedFactCount(\n factsDb: { count: () => number; getRawDb: () => DatabaseSync },\n sqlitePath: string,\n): number {\n const now = Date.now();\n if (\n verifyFactCountCache &&\n verifyFactCountCache.path === sqlitePath &&\n now - verifyFactCountCache.at < VERIFY_FACT_COUNT_TTL_MS\n ) {\n return verifyFactCountCache.n;\n }\n const approx = readApproxFactsRowCount(factsDb.getRawDb());\n const n = approx != null ? approx : factsDb.count();\n verifyFactCountCache = { path: sqlitePath, n, at: now };\n return n;\n}\n\n/** Test-only: reset verify fact-count TTL cache between tests. */\nexport function resetVerifyFactCountCacheForTests(): void {\n verifyFactCountCache = null;\n}\n"],"mappings":";AAEA,MAAM,2BAA2B,IAAI;AACrC,IAAI,uBAAuE;AAE3E,SAAgB,wBAAwB,IAAiC;CACvE,IAAI;EACF,MAAM,MAAM,GAAG,QAAQ,4DAA4D,CAAC,KAAK;EAGzF,IAAI,OAAO,QAAQ,IAAI,SAAS,KAAA,KAAa,IAAI,SAAS,MAAM,OAAO;EAEvE,MAAM,WADU,OAAO,IAAI,KAAK,CAAC,MACT,CAAC,MAAM,MAAM,CAAC;EACtC,IAAI,CAAC,UAAU,OAAO;EACtB,MAAM,IAAI,OAAO,SAAS,UAAU,GAAG;EACvC,OAAO,OAAO,SAAS,EAAE,IAAI,KAAK,IAAI,KAAK,MAAM,EAAE,GAAG;SAChD;EACN,OAAO;;;AAIX,SAAgB,mBACd,SACA,YACQ;CACR,MAAM,MAAM,KAAK,KAAK;CACtB,IACE,wBACA,qBAAqB,SAAS,cAC9B,MAAM,qBAAqB,KAAK,0BAEhC,OAAO,qBAAqB;CAE9B,MAAM,SAAS,wBAAwB,QAAQ,UAAU,CAAC;CAC1D,MAAM,IAAI,UAAU,OAAO,SAAS,QAAQ,OAAO;CACnD,uBAAuB;EAAE,MAAM;EAAY;EAAG,IAAI;EAAK;CACvD,OAAO"}
1
+ {"version":3,"file":"fact-count.js","names":[],"sources":["../../../cli/verify/fact-count.ts"],"sourcesContent":["import type { DatabaseSync } from \"node:sqlite\";\n\nconst VERIFY_FACT_COUNT_TTL_MS = 5 * 60_000;\nlet verifyFactCountCache: { path: string; n: number; at: number } | null = null;\n\nexport function readApproxFactsRowCount(db: DatabaseSync): number | null {\n try {\n const row = db.prepare(`SELECT stat FROM sqlite_stat1 WHERE tbl = 'facts' LIMIT 1`).get() as\n | { stat: string | number }\n | undefined;\n if (row == null || row.stat === undefined || row.stat === null) return null;\n const statStr = String(row.stat).trim();\n const firstInt = statStr.split(/\\s+/)[0];\n if (!firstInt) return null;\n const n = Number.parseInt(firstInt, 10);\n return Number.isFinite(n) && n >= 0 ? Math.floor(n) : null;\n } catch {\n return null;\n }\n}\n\nexport function getCachedFactCount(\n factsDb: { count: () => number; getRawDb: () => DatabaseSync },\n sqlitePath: string,\n): number {\n const now = Date.now();\n if (\n verifyFactCountCache &&\n verifyFactCountCache.path === sqlitePath &&\n now - verifyFactCountCache.at < VERIFY_FACT_COUNT_TTL_MS\n ) {\n return verifyFactCountCache.n;\n }\n const approx = readApproxFactsRowCount(factsDb.getRawDb());\n const n = approx != null ? approx : factsDb.count();\n verifyFactCountCache = { path: sqlitePath, n, at: now };\n return n;\n}\n\n/** Test-only: reset verify fact-count TTL cache between tests. */\nexport function resetVerifyFactCountCacheForTests(): void {\n verifyFactCountCache = null;\n}\n"],"mappings":";AAEA,MAAM,2BAA2B,IAAI;AACrC,IAAI,uBAAuE;AAE3E,SAAgB,wBAAwB,IAAiC;CACvE,IAAI;EACF,MAAM,MAAM,GAAG,QAAQ,2DAA2D,EAAE,IAAI;EAGxF,IAAI,OAAO,QAAQ,IAAI,SAAS,KAAA,KAAa,IAAI,SAAS,MAAM,OAAO;EAEvE,MAAM,WADU,OAAO,IAAI,IAAI,EAAE,KACV,EAAE,MAAM,KAAK,EAAE;EACtC,IAAI,CAAC,UAAU,OAAO;EACtB,MAAM,IAAI,OAAO,SAAS,UAAU,EAAE;EACtC,OAAO,OAAO,SAAS,CAAC,KAAK,KAAK,IAAI,KAAK,MAAM,CAAC,IAAI;CACxD,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAgB,mBACd,SACA,YACQ;CACR,MAAM,MAAM,KAAK,IAAI;CACrB,IACE,wBACA,qBAAqB,SAAS,cAC9B,MAAM,qBAAqB,KAAK,0BAEhC,OAAO,qBAAqB;CAE9B,MAAM,SAAS,wBAAwB,QAAQ,SAAS,CAAC;CACzD,MAAM,IAAI,UAAU,OAAO,SAAS,QAAQ,MAAM;CAClD,uBAAuB;EAAE,MAAM;EAAY;EAAG,IAAI;CAAI;CACtD,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"openclaw-config.js","names":[],"sources":["../../../cli/verify/openclaw-config.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\n\nexport type OpenclawConfigReadResult =\n | { path: string; exists: false; root: undefined; error: undefined }\n | { path: string; exists: true; root: Record<string, unknown>; error: undefined }\n | { path: string; exists: true; root: undefined; error: string };\n\nexport function readOpenclawConfigRoot(configPath: string): OpenclawConfigReadResult {\n if (!existsSync(configPath)) return { path: configPath, exists: false, root: undefined, error: undefined };\n try {\n const raw = readFileSync(configPath, \"utf-8\");\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n return { path: configPath, exists: true, root: parsed, error: undefined };\n } catch (err) {\n return {\n path: configPath,\n exists: true,\n root: undefined,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n}\n"],"mappings":";;AAOA,SAAgB,uBAAuB,YAA8C;CACnF,IAAI,CAAC,WAAW,WAAW,EAAE,OAAO;EAAE,MAAM;EAAY,QAAQ;EAAO,MAAM,KAAA;EAAW,OAAO,KAAA;EAAW;CAC1G,IAAI;EACF,MAAM,MAAM,aAAa,YAAY,QAAQ;EAE7C,OAAO;GAAE,MAAM;GAAY,QAAQ;GAAM,MAD1B,KAAK,MAAM,IAC2B;GAAE,OAAO,KAAA;GAAW;UAClE,KAAK;EACZ,OAAO;GACL,MAAM;GACN,QAAQ;GACR,MAAM,KAAA;GACN,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;GACxD"}
1
+ {"version":3,"file":"openclaw-config.js","names":[],"sources":["../../../cli/verify/openclaw-config.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\n\nexport type OpenclawConfigReadResult =\n | { path: string; exists: false; root: undefined; error: undefined }\n | { path: string; exists: true; root: Record<string, unknown>; error: undefined }\n | { path: string; exists: true; root: undefined; error: string };\n\nexport function readOpenclawConfigRoot(configPath: string): OpenclawConfigReadResult {\n if (!existsSync(configPath)) return { path: configPath, exists: false, root: undefined, error: undefined };\n try {\n const raw = readFileSync(configPath, \"utf-8\");\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n return { path: configPath, exists: true, root: parsed, error: undefined };\n } catch (err) {\n return {\n path: configPath,\n exists: true,\n root: undefined,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n}\n"],"mappings":";;AAOA,SAAgB,uBAAuB,YAA8C;CACnF,IAAI,CAAC,WAAW,UAAU,GAAG,OAAO;EAAE,MAAM;EAAY,QAAQ;EAAO,MAAM,KAAA;EAAW,OAAO,KAAA;CAAU;CACzG,IAAI;EACF,MAAM,MAAM,aAAa,YAAY,OAAO;EAE5C,OAAO;GAAE,MAAM;GAAY,QAAQ;GAAM,MAD1B,KAAK,MAAM,GAC0B;GAAG,OAAO,KAAA;EAAU;CAC1E,SAAS,KAAK;EACZ,OAAO;GACL,MAAM;GACN,QAAQ;GACR,MAAM,KAAA;GACN,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;EACxD;CACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-config-credentials.js","names":[],"sources":["../../../cli/verify/plugin-config-credentials.ts"],"sourcesContent":["import { getPluginConfigFromFile } from \"../cmd-install.js\";\nimport type { VerifyRunState } from \"./verify-run-state.js\";\n\nexport function ensureRawPluginConfigOnState(state: VerifyRunState): void {\n if (state.rawPluginConfig !== undefined) return;\n const rawPluginConfigResult = getPluginConfigFromFile(state.defaultConfigPath);\n state.rawPluginConfig = \"error\" in rawPluginConfigResult ? undefined : rawPluginConfigResult.config;\n if (\n \"error\" in rawPluginConfigResult &&\n state.openclawConfigRead.exists &&\n state.openclawConfigRead.error === undefined\n ) {\n state.warnings.push(\n `OpenClaw config at ${state.defaultConfigPath} could not be interpreted for plugin settings (${rawPluginConfigResult.error}).`,\n );\n }\n}\n\nexport function credentialSource(rawKey: unknown): string {\n if (typeof rawKey !== \"string\" || !rawKey.trim()) return \"\";\n const v = rawKey.trim();\n if (v.startsWith(\"env:\")) return \"env\";\n if (v.startsWith(\"file:\")) return \"file\";\n return \"plugin\";\n}\n\nexport function rawEmbeddingApiKey(state: VerifyRunState): unknown {\n const emb = state.rawPluginConfig?.embedding as Record<string, unknown> | undefined;\n return emb?.apiKey;\n}\n\nexport function rawDistillApiKey(state: VerifyRunState): unknown {\n const d = state.rawPluginConfig?.distill as Record<string, unknown> | undefined;\n return d?.apiKey;\n}\n\nexport function rawLlmProviderApiKey(state: VerifyRunState, provider: string): unknown {\n const prov = (state.rawPluginConfig?.llm as Record<string, unknown> | undefined)?.providers as\n | Record<string, unknown>\n | undefined;\n const p = prov?.[provider] as Record<string, unknown> | undefined;\n return p?.apiKey;\n}\n\nexport function rawClaudeApiKey(state: VerifyRunState): unknown {\n const c = state.rawPluginConfig?.claude as Record<string, unknown> | undefined;\n return c?.apiKey;\n}\n"],"mappings":";;;AAGA,SAAgB,6BAA6B,OAA6B;CACxE,IAAI,MAAM,oBAAoB,KAAA,GAAW;CACzC,MAAM,wBAAwB,wBAAwB,MAAM,kBAAkB;CAC9E,MAAM,kBAAkB,WAAW,wBAAwB,KAAA,IAAY,sBAAsB;CAC7F,IACE,WAAW,yBACX,MAAM,mBAAmB,UACzB,MAAM,mBAAmB,UAAU,KAAA,GAEnC,MAAM,SAAS,KACb,sBAAsB,MAAM,kBAAkB,iDAAiD,sBAAsB,MAAM,IAC5H;;AAIL,SAAgB,iBAAiB,QAAyB;CACxD,IAAI,OAAO,WAAW,YAAY,CAAC,OAAO,MAAM,EAAE,OAAO;CACzD,MAAM,IAAI,OAAO,MAAM;CACvB,IAAI,EAAE,WAAW,OAAO,EAAE,OAAO;CACjC,IAAI,EAAE,WAAW,QAAQ,EAAE,OAAO;CAClC,OAAO;;AAGT,SAAgB,mBAAmB,OAAgC;CAEjE,QADY,MAAM,iBAAiB,YACvB;;AAGd,SAAgB,iBAAiB,OAAgC;CAE/D,QADU,MAAM,iBAAiB,UACvB;;AAGZ,SAAgB,qBAAqB,OAAuB,UAA2B;CAKrF,UAJc,MAAM,iBAAiB,MAA6C,aAGjE,YACP;;AAGZ,SAAgB,gBAAgB,OAAgC;CAE9D,QADU,MAAM,iBAAiB,SACvB"}
1
+ {"version":3,"file":"plugin-config-credentials.js","names":[],"sources":["../../../cli/verify/plugin-config-credentials.ts"],"sourcesContent":["import { getPluginConfigFromFile } from \"../cmd-install.js\";\nimport type { VerifyRunState } from \"./verify-run-state.js\";\n\nexport function ensureRawPluginConfigOnState(state: VerifyRunState): void {\n if (state.rawPluginConfig !== undefined) return;\n const rawPluginConfigResult = getPluginConfigFromFile(state.defaultConfigPath);\n state.rawPluginConfig = \"error\" in rawPluginConfigResult ? undefined : rawPluginConfigResult.config;\n if (\n \"error\" in rawPluginConfigResult &&\n state.openclawConfigRead.exists &&\n state.openclawConfigRead.error === undefined\n ) {\n state.warnings.push(\n `OpenClaw config at ${state.defaultConfigPath} could not be interpreted for plugin settings (${rawPluginConfigResult.error}).`,\n );\n }\n}\n\nexport function credentialSource(rawKey: unknown): string {\n if (typeof rawKey !== \"string\" || !rawKey.trim()) return \"\";\n const v = rawKey.trim();\n if (v.startsWith(\"env:\")) return \"env\";\n if (v.startsWith(\"file:\")) return \"file\";\n return \"plugin\";\n}\n\nexport function rawEmbeddingApiKey(state: VerifyRunState): unknown {\n const emb = state.rawPluginConfig?.embedding as Record<string, unknown> | undefined;\n return emb?.apiKey;\n}\n\nexport function rawDistillApiKey(state: VerifyRunState): unknown {\n const d = state.rawPluginConfig?.distill as Record<string, unknown> | undefined;\n return d?.apiKey;\n}\n\nexport function rawLlmProviderApiKey(state: VerifyRunState, provider: string): unknown {\n const prov = (state.rawPluginConfig?.llm as Record<string, unknown> | undefined)?.providers as\n | Record<string, unknown>\n | undefined;\n const p = prov?.[provider] as Record<string, unknown> | undefined;\n return p?.apiKey;\n}\n\nexport function rawClaudeApiKey(state: VerifyRunState): unknown {\n const c = state.rawPluginConfig?.claude as Record<string, unknown> | undefined;\n return c?.apiKey;\n}\n"],"mappings":";;;AAGA,SAAgB,6BAA6B,OAA6B;CACxE,IAAI,MAAM,oBAAoB,KAAA,GAAW;CACzC,MAAM,wBAAwB,wBAAwB,MAAM,iBAAiB;CAC7E,MAAM,kBAAkB,WAAW,wBAAwB,KAAA,IAAY,sBAAsB;CAC7F,IACE,WAAW,yBACX,MAAM,mBAAmB,UACzB,MAAM,mBAAmB,UAAU,KAAA,GAEnC,MAAM,SAAS,KACb,sBAAsB,MAAM,kBAAkB,iDAAiD,sBAAsB,MAAM,GAC7H;AAEJ;AAEA,SAAgB,iBAAiB,QAAyB;CACxD,IAAI,OAAO,WAAW,YAAY,CAAC,OAAO,KAAK,GAAG,OAAO;CACzD,MAAM,IAAI,OAAO,KAAK;CACtB,IAAI,EAAE,WAAW,MAAM,GAAG,OAAO;CACjC,IAAI,EAAE,WAAW,OAAO,GAAG,OAAO;CAClC,OAAO;AACT;AAEA,SAAgB,mBAAmB,OAAgC;CAEjE,QADY,MAAM,iBAAiB,YACvB;AACd;AAEA,SAAgB,iBAAiB,OAAgC;CAE/D,QADU,MAAM,iBAAiB,UACvB;AACZ;AAEA,SAAgB,qBAAqB,OAAuB,UAA2B;CAKrF,UAJc,MAAM,iBAAiB,MAA6C,aAGjE,YACP;AACZ;AAEA,SAAgB,gBAAgB,OAAgC;CAE9D,QADU,MAAM,iBAAiB,SACvB;AACZ"}