akm-cli 0.9.0-rc.1 → 0.9.0-rc.13

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 (587) hide show
  1. package/CHANGELOG.md +1190 -52
  2. package/README.md +62 -37
  3. package/SECURITY.md +46 -31
  4. package/dist/akm +162 -38
  5. package/dist/akm-migrate +44 -0
  6. package/dist/assets/backends/schtasks-template.xml +2 -1
  7. package/dist/assets/hints/cli-hints-full.md +268 -118
  8. package/dist/assets/hints/cli-hints-short.md +87 -24
  9. package/dist/assets/{profiles → improve-strategies}/catchup.json +3 -1
  10. package/dist/assets/{profiles → improve-strategies}/consolidate.json +3 -1
  11. package/dist/assets/{profiles → improve-strategies}/default.json +6 -7
  12. package/dist/assets/improve-strategies/frequent.json +15 -0
  13. package/dist/assets/{profiles → improve-strategies}/graph-refresh.json +4 -2
  14. package/dist/assets/{profiles → improve-strategies}/memory-focus.json +4 -1
  15. package/dist/assets/{profiles → improve-strategies}/proactive-maintenance.json +5 -5
  16. package/dist/assets/{profiles → improve-strategies}/quick.json +4 -2
  17. package/dist/assets/improve-strategies/reflect-distill.json +30 -0
  18. package/dist/assets/{profiles → improve-strategies}/thorough.json +1 -1
  19. package/dist/assets/prompts/consolidate-system.md +5 -5
  20. package/dist/assets/prompts/extract-session.md +2 -6
  21. package/dist/assets/prompts/memory-infer-user.md +2 -3
  22. package/dist/assets/prompts/reflect-llm-framed-contract.md +11 -0
  23. package/dist/assets/prompts/reflect-llm-schema-contract.md +3 -0
  24. package/dist/assets/prompts/reflect-output-repair.md +3 -0
  25. package/dist/assets/stash-skeleton/README.md +38 -10
  26. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
  27. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
  28. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
  29. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
  30. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
  38. package/dist/assets/tasks/core/extract.yml +3 -2
  39. package/dist/assets/tasks/core/improve.yml +2 -1
  40. package/dist/assets/tasks/core/index-refresh.yml +1 -0
  41. package/dist/assets/tasks/core/sync.yml +1 -0
  42. package/dist/assets/tasks/core/version-check.yml +2 -1
  43. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  44. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  45. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  46. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  47. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  48. package/dist/assets/templates/html/health.html +5 -4
  49. package/dist/assets/workflows/workflow-template.md +31 -15
  50. package/dist/cli/invocation.js +279 -0
  51. package/dist/cli/parse-args.js +5 -90
  52. package/dist/cli/retired-commands.js +78 -0
  53. package/dist/cli/shared.js +158 -48
  54. package/dist/cli-node.mjs +2 -1
  55. package/dist/cli.js +747 -293
  56. package/dist/commands/agent/agent-dispatch.js +19 -18
  57. package/dist/commands/agent/agent-support.js +0 -24
  58. package/dist/commands/agent/contribute-cli.js +43 -97
  59. package/dist/commands/completions.js +80 -23
  60. package/dist/commands/config-cli.js +44 -281
  61. package/dist/commands/env/env-binding.js +13 -9
  62. package/dist/commands/env/env-cli.js +76 -159
  63. package/dist/commands/env/env.js +12 -163
  64. package/dist/commands/env/marker-path.js +6 -0
  65. package/dist/commands/env/secret-cli.js +45 -61
  66. package/dist/commands/env/secret.js +32 -62
  67. package/dist/commands/feedback-cli.js +179 -85
  68. package/dist/commands/health/accept-rate.js +58 -0
  69. package/dist/commands/health/advisories.js +7 -8
  70. package/dist/commands/health/checks.js +279 -94
  71. package/dist/commands/health/html-report.js +197 -578
  72. package/dist/commands/health/improve-metrics.js +277 -246
  73. package/dist/commands/health/llm-usage.js +19 -19
  74. package/dist/commands/health/md-report.js +16 -7
  75. package/dist/commands/health/metrics.js +67 -32
  76. package/dist/commands/health/renderers.js +47 -0
  77. package/dist/commands/health/report-view-model.js +508 -0
  78. package/dist/commands/health/stash-exposure.js +1 -1
  79. package/dist/commands/health/surfaces.js +16 -56
  80. package/dist/commands/health/task-runs.js +3 -67
  81. package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
  82. package/dist/commands/health/types-improve.js +29 -0
  83. package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
  84. package/dist/commands/health/types-result.js +7 -0
  85. package/dist/commands/health/types-runs.js +4 -0
  86. package/dist/commands/health/types-session-log.js +4 -0
  87. package/dist/commands/health/types-windows.js +4 -0
  88. package/dist/commands/health/types.js +26 -21
  89. package/dist/commands/health/windows.js +2 -3
  90. package/dist/commands/health.js +296 -167
  91. package/dist/commands/improve/anti-collapse.js +5 -5
  92. package/dist/commands/improve/autonomy-gate.js +68 -0
  93. package/dist/commands/improve/collapse-detector.js +65 -52
  94. package/dist/commands/improve/consolidate/chunking.js +9 -7
  95. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  96. package/dist/commands/improve/consolidate/merge.js +4 -0
  97. package/dist/commands/improve/consolidate.js +454 -1354
  98. package/dist/commands/improve/content-hash.js +39 -0
  99. package/dist/commands/improve/distill/content-repair.js +4 -10
  100. package/dist/commands/improve/distill/promote-memory.js +89 -64
  101. package/dist/commands/improve/distill/quality-gate.js +118 -42
  102. package/dist/commands/improve/distill-guards.js +1 -1
  103. package/dist/commands/improve/distill-promotion-policy.js +33 -888
  104. package/dist/commands/improve/distill.js +607 -363
  105. package/dist/commands/improve/eligibility.js +165 -79
  106. package/dist/commands/improve/extract-cli.js +35 -126
  107. package/dist/commands/improve/extract-prompt.js +6 -35
  108. package/dist/commands/improve/extract.js +640 -391
  109. package/dist/commands/improve/feedback-valence.js +2 -12
  110. package/dist/commands/improve/improve-cli.js +134 -135
  111. package/dist/commands/improve/improve-result-file.js +30 -50
  112. package/dist/commands/improve/improve-run-types.js +4 -0
  113. package/dist/commands/improve/improve-strategies.js +135 -0
  114. package/dist/commands/improve/improve.js +904 -701
  115. package/dist/commands/improve/locks.js +64 -111
  116. package/dist/commands/improve/loop-stages.js +1110 -923
  117. package/dist/commands/improve/memory/derived-ref.js +124 -0
  118. package/dist/commands/improve/memory/memory-belief.js +79 -7
  119. package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
  120. package/dist/commands/improve/memory/memory-improve.js +25 -37
  121. package/dist/commands/improve/outcome-loop.js +25 -88
  122. package/dist/commands/improve/preparation.js +1034 -813
  123. package/dist/commands/improve/proactive-maintenance.js +34 -9
  124. package/dist/commands/improve/proposal-envelope.js +31 -0
  125. package/dist/commands/improve/reflect.js +983 -794
  126. package/dist/commands/improve/run-context.js +119 -0
  127. package/dist/commands/improve/salience.js +24 -127
  128. package/dist/commands/improve/session-asset.js +7 -3
  129. package/dist/commands/improve/shared.js +14 -34
  130. package/dist/commands/improve/source-identity.js +28 -0
  131. package/dist/commands/improve/triage.js +20 -17
  132. package/dist/commands/lint/base-linter.js +340 -313
  133. package/dist/commands/lint/env-key-rules.js +31 -47
  134. package/dist/commands/lint/index.js +185 -30
  135. package/dist/commands/{events.js → log.js} +28 -38
  136. package/dist/commands/migrate-cli.js +54 -0
  137. package/dist/commands/migration-tool.js +55 -0
  138. package/dist/commands/observability-cli.js +70 -208
  139. package/dist/commands/proposal/diff-format.js +50 -0
  140. package/dist/commands/proposal/drain-policies.js +0 -6
  141. package/dist/commands/proposal/drain.js +91 -40
  142. package/dist/commands/proposal/proposal-cli.js +134 -132
  143. package/dist/commands/proposal/proposal-types.js +56 -0
  144. package/dist/commands/proposal/proposal.js +83 -65
  145. package/dist/commands/proposal/propose-cli.js +88 -0
  146. package/dist/commands/proposal/propose.js +105 -88
  147. package/dist/commands/proposal/repository.js +1303 -278
  148. package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
  149. package/dist/commands/proposal/validators/proposal-validators.js +61 -12
  150. package/dist/commands/proposal/validators/proposals.js +6 -8
  151. package/dist/commands/read/curate.js +78 -73
  152. package/dist/commands/read/knowledge.js +510 -13
  153. package/dist/commands/read/registry-search.js +2 -2
  154. package/dist/commands/read/remember-cli.js +84 -15
  155. package/dist/commands/read/search-cli.js +203 -96
  156. package/dist/commands/read/search.js +126 -94
  157. package/dist/commands/read/show.js +226 -250
  158. package/dist/commands/registry-cli.js +34 -60
  159. package/dist/commands/remember.js +18 -57
  160. package/dist/commands/sources/add-cli.js +104 -49
  161. package/dist/commands/sources/bundle-cli.js +166 -0
  162. package/dist/commands/sources/bundle-config-ops.js +63 -0
  163. package/dist/commands/sources/info.js +27 -15
  164. package/dist/commands/sources/init.js +30 -40
  165. package/dist/commands/sources/installed-stashes.js +469 -172
  166. package/dist/commands/sources/schema-repair.js +10 -9
  167. package/dist/commands/sources/self-update.js +182 -121
  168. package/dist/commands/sources/source-add.js +169 -178
  169. package/dist/commands/sources/source-clone.js +144 -41
  170. package/dist/commands/sources/source-manage.js +94 -59
  171. package/dist/commands/sources/sources-cli.js +64 -205
  172. package/dist/commands/sources/stash-cli.js +91 -54
  173. package/dist/commands/sources/stash-skeleton.js +1 -1
  174. package/dist/commands/tasks/tasks-cli.js +106 -104
  175. package/dist/commands/tasks/tasks.js +445 -262
  176. package/dist/commands/workflow-cli.js +75 -228
  177. package/dist/core/action-contributors.js +1 -1
  178. package/dist/core/activation-policy.js +49 -0
  179. package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
  180. package/dist/core/adapter/adapters/akm-adapter.js +528 -0
  181. package/dist/core/adapter/adapters/akm-lint.js +392 -0
  182. package/dist/core/adapter/adapters/akm-metadata.js +387 -0
  183. package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
  184. package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
  185. package/dist/core/adapter/adapters/claude-adapter.js +61 -0
  186. package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
  187. package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
  188. package/dist/core/adapter/adapters/index.js +80 -0
  189. package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
  190. package/dist/core/adapter/adapters/okf-adapter.js +391 -0
  191. package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
  192. package/dist/core/adapter/adapters/shared.js +286 -0
  193. package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
  194. package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
  195. package/dist/core/adapter/bundle-adapter.js +4 -0
  196. package/dist/core/adapter/detect-adapter.js +17 -0
  197. package/dist/core/adapter/recognize-match.js +44 -0
  198. package/dist/core/adapter/registry.js +56 -0
  199. package/dist/core/adapter/types.js +4 -0
  200. package/dist/core/asset/akm-markdown.js +30 -0
  201. package/dist/core/asset/asset-placement.js +243 -0
  202. package/dist/core/asset/asset-ref.js +110 -79
  203. package/dist/core/asset/asset-serialize.js +20 -0
  204. package/dist/core/asset/frontmatter.js +28 -12
  205. package/dist/core/asset/markdown.js +40 -51
  206. package/dist/core/asset/resolve-ref.js +274 -0
  207. package/dist/core/asset/stash-meta.js +2 -2
  208. package/dist/core/bundle-id.js +51 -0
  209. package/dist/core/common.js +281 -86
  210. package/dist/core/config/config-io.js +42 -128
  211. package/dist/core/config/config-schema.js +233 -855
  212. package/dist/core/config/config-sources.js +162 -39
  213. package/dist/core/config/config-types.js +16 -11
  214. package/dist/core/config/config-version.js +29 -0
  215. package/dist/core/config/config-walker.js +126 -37
  216. package/dist/core/config/config.js +154 -331
  217. package/dist/core/config/deep-merge.js +41 -0
  218. package/dist/core/config/engine-semantics.js +28 -0
  219. package/dist/core/config/experimental.js +21 -0
  220. package/dist/core/config/schema/embedding.js +38 -0
  221. package/dist/core/config/schema/engines.js +116 -0
  222. package/dist/core/config/schema/experimental.js +47 -0
  223. package/dist/core/config/schema/feedback.js +31 -0
  224. package/dist/core/config/schema/improve-processes.js +389 -0
  225. package/dist/core/config/schema/improve.js +94 -0
  226. package/dist/core/config/schema/index-config.js +176 -0
  227. package/dist/core/config/schema/output.js +18 -0
  228. package/dist/core/config/schema/primitives.js +94 -0
  229. package/dist/core/config/schema/search.js +30 -0
  230. package/dist/core/config/schema/setup.js +18 -0
  231. package/dist/core/config/schema/sources-bundles.js +169 -0
  232. package/dist/core/config/schema/workflow.js +29 -0
  233. package/dist/core/env-secret-ref.js +155 -20
  234. package/dist/core/errors.js +17 -15
  235. package/dist/core/events-types.js +4 -0
  236. package/dist/core/events.js +46 -128
  237. package/dist/core/extra-params.js +62 -0
  238. package/dist/core/file-change.js +17 -0
  239. package/dist/core/file-lock.js +202 -57
  240. package/dist/core/fs-txn.js +392 -0
  241. package/dist/core/git-message.js +59 -0
  242. package/dist/core/improve-result.js +167 -0
  243. package/dist/core/lesson-lint.js +1 -17
  244. package/dist/core/logs-db.js +1 -1
  245. package/dist/core/maintenance-barrier.js +135 -0
  246. package/dist/core/migration-operation.js +44 -0
  247. package/dist/core/mutation-target.js +78 -0
  248. package/dist/core/paths.js +22 -25
  249. package/dist/core/platform.js +10 -0
  250. package/dist/core/recognition-util.js +128 -0
  251. package/dist/core/redaction.js +392 -0
  252. package/dist/core/standards/resolve-standards-context.js +36 -65
  253. package/dist/core/standards/resolve-stash-standards.js +2 -2
  254. package/dist/core/standards/resolve-type-conventions.js +5 -5
  255. package/dist/core/state/migrations.js +242 -11
  256. package/dist/core/state-db.js +98 -10
  257. package/dist/core/structured.js +1 -1
  258. package/dist/core/subprocess.js +303 -0
  259. package/dist/core/text-truncation.js +9 -5
  260. package/dist/core/time.js +20 -0
  261. package/dist/core/type-presentation.js +130 -0
  262. package/dist/core/warn.js +0 -3
  263. package/dist/core/write-source.js +834 -118
  264. package/dist/indexer/bundle-identity-guard.js +92 -0
  265. package/dist/indexer/db/graph-db.js +1 -25
  266. package/dist/indexer/db/llm-cache.js +1 -1
  267. package/dist/indexer/ensure-index.js +30 -9
  268. package/dist/indexer/graph/graph-boost.js +9 -30
  269. package/dist/indexer/graph/graph-extraction.js +41 -27
  270. package/dist/indexer/graph/graph-types.js +4 -0
  271. package/dist/indexer/index-writer-lock.js +93 -49
  272. package/dist/indexer/index-written-assets.js +100 -53
  273. package/dist/indexer/indexer.js +746 -329
  274. package/dist/indexer/init.js +18 -25
  275. package/dist/indexer/installations.js +142 -0
  276. package/dist/indexer/passes/dir-staleness.js +18 -10
  277. package/dist/indexer/passes/memory-inference.js +25 -15
  278. package/dist/indexer/passes/metadata.js +412 -243
  279. package/dist/indexer/scan/doc-to-entry.js +160 -0
  280. package/dist/indexer/scan/drain-dir.js +134 -0
  281. package/dist/indexer/search/db-search.js +292 -108
  282. package/dist/indexer/search/fts-query.js +64 -0
  283. package/dist/indexer/search/ranking-contributors.js +145 -25
  284. package/dist/indexer/search/ranking-types.js +4 -0
  285. package/dist/indexer/search/ranking.js +28 -71
  286. package/dist/indexer/search/search-attribution.js +67 -0
  287. package/dist/indexer/search/search-fields.js +18 -3
  288. package/dist/indexer/search/search-hit-enrichers.js +30 -40
  289. package/dist/indexer/search/search-source.js +157 -111
  290. package/dist/indexer/search/semantic-status.js +4 -1
  291. package/dist/indexer/usage/usage-events.js +10 -30
  292. package/dist/indexer/walk/file-context.js +3 -45
  293. package/dist/indexer/walk/matchers.js +42 -73
  294. package/dist/indexer/walk/path-resolver.js +11 -5
  295. package/dist/indexer/walk/walker.js +42 -14
  296. package/dist/integrations/agent/builder-shared.js +7 -0
  297. package/dist/integrations/agent/builders.js +5 -58
  298. package/dist/integrations/agent/config.js +3 -143
  299. package/dist/integrations/agent/detect.js +17 -2
  300. package/dist/integrations/agent/engine-resolution.js +231 -0
  301. package/dist/integrations/agent/index.js +1 -2
  302. package/dist/integrations/agent/model-aliases.js +8 -3
  303. package/dist/integrations/agent/profiles.js +6 -99
  304. package/dist/integrations/agent/prompts.js +46 -18
  305. package/dist/integrations/agent/runner-dispatch.js +78 -13
  306. package/dist/integrations/agent/runner.js +76 -208
  307. package/dist/integrations/agent/spawn.js +48 -279
  308. package/dist/integrations/harnesses/aider/agent-builder.js +9 -8
  309. package/dist/integrations/harnesses/aider/index.js +2 -12
  310. package/dist/integrations/harnesses/amazonq/agent-builder.js +10 -16
  311. package/dist/integrations/harnesses/amazonq/index.js +3 -17
  312. package/dist/integrations/harnesses/claude/agent-builder.js +2 -3
  313. package/dist/integrations/harnesses/claude/config-import.js +1 -3
  314. package/dist/integrations/harnesses/claude/index.js +1 -14
  315. package/dist/integrations/harnesses/claude/session-log.js +27 -75
  316. package/dist/integrations/harnesses/codex/agent-builder.js +8 -7
  317. package/dist/integrations/harnesses/codex/index.js +2 -13
  318. package/dist/integrations/harnesses/copilot/agent-builder.js +9 -9
  319. package/dist/integrations/harnesses/copilot/index.js +1 -13
  320. package/dist/integrations/harnesses/gemini/agent-builder.js +8 -9
  321. package/dist/integrations/harnesses/gemini/index.js +1 -13
  322. package/dist/integrations/harnesses/ids.js +24 -0
  323. package/dist/integrations/harnesses/index.js +31 -33
  324. package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
  325. package/dist/integrations/harnesses/opencode/config-import.js +1 -3
  326. package/dist/integrations/harnesses/opencode/index.js +1 -18
  327. package/dist/integrations/harnesses/opencode/session-log.js +67 -125
  328. package/dist/integrations/harnesses/opencode-sdk/harness.js +3 -17
  329. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +274 -191
  330. package/dist/integrations/harnesses/openhands/agent-builder.js +12 -10
  331. package/dist/integrations/harnesses/openhands/index.js +2 -12
  332. package/dist/integrations/harnesses/pi/agent-builder.js +11 -18
  333. package/dist/integrations/harnesses/pi/index.js +3 -16
  334. package/dist/integrations/harnesses/shared.js +17 -0
  335. package/dist/integrations/harnesses/types.js +38 -34
  336. package/dist/integrations/lockfile.js +211 -24
  337. package/dist/integrations/session-logs/index.js +24 -40
  338. package/dist/integrations/session-logs/provider-base.js +113 -0
  339. package/dist/llm/client.js +182 -110
  340. package/dist/llm/embedders/deterministic.js +2 -2
  341. package/dist/llm/embedders/remote.js +21 -9
  342. package/dist/llm/feature-gate.js +17 -57
  343. package/dist/llm/graph-extract.js +12 -13
  344. package/dist/llm/index-passes.js +8 -42
  345. package/dist/llm/memory-infer.js +144 -1
  346. package/dist/llm/metadata-enhance.js +45 -30
  347. package/dist/llm/structured-call.js +16 -8
  348. package/dist/llm/usage-persist.js +30 -5
  349. package/dist/llm/usage-telemetry.js +59 -6
  350. package/dist/output/cli-hints.js +1 -2
  351. package/dist/output/command-registry.js +27 -0
  352. package/dist/output/context.js +22 -7
  353. package/dist/output/format-exempt.js +80 -0
  354. package/dist/output/generic-render.js +251 -0
  355. package/dist/output/html-render.js +11 -16
  356. package/dist/output/render-registry.js +57 -0
  357. package/dist/output/renderers.js +15 -281
  358. package/dist/output/shapes/curate.js +10 -1
  359. package/dist/output/shapes/events.js +12 -7
  360. package/dist/output/shapes/helpers.js +58 -84
  361. package/dist/output/shapes/passthrough.js +8 -40
  362. package/dist/output/shapes/proposal/producer.js +15 -7
  363. package/dist/output/shapes/registry.js +12 -6
  364. package/dist/output/shapes.js +0 -9
  365. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  366. package/dist/output/text/bundle-show.js +7 -0
  367. package/dist/output/text/command-format.js +562 -0
  368. package/dist/output/text/env.js +1 -3
  369. package/dist/output/text/events.js +8 -7
  370. package/dist/output/text/helpers.js +15 -1375
  371. package/dist/output/text/proposal/producer.js +4 -2
  372. package/dist/output/text/proposal-format.js +202 -0
  373. package/dist/output/text/registry-commands.js +1 -2
  374. package/dist/output/text/registry.js +12 -6
  375. package/dist/output/text/show-directives.js +117 -0
  376. package/dist/output/text/show-format.js +103 -0
  377. package/dist/output/text/sync.js +5 -0
  378. package/dist/output/text/workflow-format.js +332 -0
  379. package/dist/output/text/workflow.js +1 -2
  380. package/dist/output/text.js +10 -19
  381. package/dist/registry/factory.js +4 -6
  382. package/dist/registry/origin-resolve.js +16 -27
  383. package/dist/registry/providers/skills-sh.js +3 -3
  384. package/dist/registry/providers/static-index.js +15 -25
  385. package/dist/registry/resolve.js +43 -94
  386. package/dist/registry/semver.js +43 -0
  387. package/dist/runtime.js +81 -12
  388. package/dist/scripts/akm-migrate.js +35529 -0
  389. package/dist/setup/detect.js +5 -7
  390. package/dist/setup/detected-engines.js +136 -0
  391. package/dist/setup/engine-config.js +100 -0
  392. package/dist/setup/registry-stash-loader.js +3 -3
  393. package/dist/setup/semantic-assets.js +12 -9
  394. package/dist/setup/setup.js +444 -208
  395. package/dist/setup/steps/connection-shared.js +120 -0
  396. package/dist/setup/steps/connection.js +108 -305
  397. package/dist/setup/steps/platforms.js +13 -12
  398. package/dist/setup/steps/semantic.js +15 -3
  399. package/dist/setup/steps/sources.js +21 -15
  400. package/dist/setup/steps/stashdir.js +6 -4
  401. package/dist/setup/steps/tasks.js +236 -119
  402. package/dist/setup/steps.js +3 -2
  403. package/dist/sources/freshness.js +39 -0
  404. package/dist/sources/provider-factory.js +11 -17
  405. package/dist/sources/providers/filesystem.js +2 -3
  406. package/dist/sources/providers/git-install.js +278 -34
  407. package/dist/sources/providers/git-provider.js +54 -56
  408. package/dist/sources/providers/git-stash.js +420 -91
  409. package/dist/sources/providers/git.js +2 -2
  410. package/dist/sources/providers/npm.js +16 -19
  411. package/dist/sources/providers/provider-utils.js +47 -22
  412. package/dist/sources/providers/sync-from-ref.js +3 -9
  413. package/dist/sources/providers/website.js +2 -2
  414. package/dist/sources/resolve.js +11 -10
  415. package/dist/sources/snapshot-fetchers/types.js +4 -0
  416. package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
  417. package/dist/storage/database.js +60 -4
  418. package/dist/storage/engines/sqlite-migrations.js +156 -5
  419. package/dist/storage/locations.js +1 -2
  420. package/dist/storage/repositories/canaries-repository.js +1 -1
  421. package/dist/storage/repositories/events-repository.js +51 -11
  422. package/dist/storage/repositories/improve-runs-repository.js +6 -32
  423. package/dist/storage/repositories/index-connection.js +79 -0
  424. package/dist/storage/repositories/index-db.js +4 -3
  425. package/dist/storage/repositories/index-entries-repository.js +863 -0
  426. package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
  427. package/dist/storage/repositories/index-entry-types.js +4 -0
  428. package/dist/storage/repositories/index-fts-repository.js +167 -0
  429. package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
  430. package/dist/storage/repositories/index-meta-repository.js +49 -0
  431. package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
  432. package/dist/storage/repositories/index-sql.js +12 -0
  433. package/dist/storage/repositories/index-utility-repository.js +356 -0
  434. package/dist/storage/repositories/index-vec-repository.js +250 -0
  435. package/dist/storage/repositories/outcome-repository.js +119 -0
  436. package/dist/storage/repositories/proposals-repository.js +317 -75
  437. package/dist/storage/repositories/registry-cache.js +1 -1
  438. package/dist/storage/repositories/salience-repository.js +172 -0
  439. package/dist/storage/repositories/task-history-repository.js +110 -3
  440. package/dist/storage/repositories/workflow-runs-repository.js +68 -35
  441. package/dist/tasks/backends/cron.js +169 -46
  442. package/dist/tasks/backends/exec-utils.js +76 -3
  443. package/dist/tasks/backends/index.js +6 -9
  444. package/dist/tasks/backends/launchd.js +292 -55
  445. package/dist/tasks/backends/schtasks.js +557 -70
  446. package/dist/tasks/backends/types.js +4 -0
  447. package/dist/tasks/command-executable.js +93 -0
  448. package/dist/tasks/embedded.js +56 -38
  449. package/dist/tasks/parser.js +156 -64
  450. package/dist/tasks/resolve-akm-bin.js +144 -51
  451. package/dist/tasks/runner.js +377 -209
  452. package/dist/tasks/schedule.js +108 -19
  453. package/dist/tasks/scheduler-invocation.js +296 -0
  454. package/dist/tasks/schema.js +1 -1
  455. package/dist/tasks/task-id.js +35 -0
  456. package/dist/tasks/validator.js +30 -16
  457. package/dist/workflows/authoring/authoring.js +96 -148
  458. package/dist/workflows/authoring/scope-key.js +1 -1
  459. package/dist/workflows/cli.js +0 -20
  460. package/dist/workflows/concurrency-policy.js +15 -0
  461. package/dist/workflows/exec/brief.js +25 -59
  462. package/dist/workflows/exec/frozen-judge.js +47 -0
  463. package/dist/workflows/exec/native-executor.js +157 -94
  464. package/dist/workflows/exec/report.js +365 -200
  465. package/dist/workflows/exec/run-workflow.js +46 -40
  466. package/dist/workflows/exec/scheduler.js +12 -41
  467. package/dist/workflows/exec/step-work.js +239 -205
  468. package/dist/workflows/exec/workflow-engine-gate.js +67 -0
  469. package/dist/workflows/ir/compile.js +141 -283
  470. package/dist/workflows/ir/freeze.js +233 -0
  471. package/dist/workflows/ir/plan-hash.js +40 -5
  472. package/dist/workflows/ir/schema.js +537 -1
  473. package/dist/workflows/parser.js +878 -306
  474. package/dist/workflows/program/expressions.js +20 -208
  475. package/dist/workflows/program/schema.js +7 -10
  476. package/dist/workflows/renderer.js +99 -121
  477. package/dist/workflows/resource-limits.js +22 -0
  478. package/dist/workflows/runtime/checkin.js +1 -1
  479. package/dist/workflows/runtime/plan-classifier.js +131 -0
  480. package/dist/workflows/runtime/runs.js +200 -113
  481. package/dist/workflows/runtime/unit-checkin.js +1 -1
  482. package/dist/workflows/runtime/unit-phases.js +20 -0
  483. package/dist/workflows/runtime/workflow-asset-loader.js +235 -97
  484. package/dist/workflows/schema.js +1 -11
  485. package/dist/workflows/validate-summary.js +4 -26
  486. package/dist/workflows/validator.js +52 -30
  487. package/docs/README.md +42 -78
  488. package/docs/migration/README.md +8 -0
  489. package/docs/migration/release-notes/0.6.0.md +1 -1
  490. package/docs/migration/release-notes/0.7.0.md +9 -8
  491. package/docs/migration/release-notes/0.9.0.md +158 -14
  492. package/docs/migration/v0.7-to-v0.8.md +46 -47
  493. package/docs/migration/v0.8-to-v0.9.md +844 -0
  494. package/docs/reference/README.md +12 -0
  495. package/docs/reference/data-and-telemetry.md +333 -0
  496. package/package.json +21 -17
  497. package/schemas/akm-asset-envelope.json +93 -0
  498. package/schemas/akm-config.json +4636 -0
  499. package/schemas/akm-task.json +87 -0
  500. package/{dist/schemas → schemas}/akm-workflow.json +127 -82
  501. package/dist/akm-migrate-storage +0 -38
  502. package/dist/assets/help/help-accept.md +0 -12
  503. package/dist/assets/help/help-improve.md +0 -84
  504. package/dist/assets/help/help-proposals.md +0 -17
  505. package/dist/assets/help/help-propose.md +0 -17
  506. package/dist/assets/help/help-reject.md +0 -11
  507. package/dist/assets/profiles/frequent.json +0 -13
  508. package/dist/assets/profiles/recombine-only.json +0 -21
  509. package/dist/assets/profiles/reflect-distill.json +0 -30
  510. package/dist/assets/profiles/synthesize.json +0 -15
  511. package/dist/assets/prompts/procedural-system.md +0 -44
  512. package/dist/assets/prompts/recombine-system.md +0 -40
  513. package/dist/assets/prompts/staleness-detect-system.md +0 -6
  514. package/dist/assets/tasks/core/backup.yml +0 -4
  515. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  516. package/dist/assets/templates/html/default.html +0 -78
  517. package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
  518. package/dist/assets/wiki/index-template.md +0 -12
  519. package/dist/assets/wiki/ingest-workflow-template.md +0 -83
  520. package/dist/assets/wiki/log-template.md +0 -8
  521. package/dist/assets/wiki/schema-template.md +0 -61
  522. package/dist/cli/config-migrate.js +0 -150
  523. package/dist/cli/config-validate.js +0 -39
  524. package/dist/commands/graph/graph-cli.js +0 -124
  525. package/dist/commands/graph/graph.js +0 -487
  526. package/dist/commands/improve/calibration.js +0 -161
  527. package/dist/commands/improve/dedup.js +0 -482
  528. package/dist/commands/improve/extract-watch.js +0 -140
  529. package/dist/commands/improve/hot-probation.js +0 -45
  530. package/dist/commands/improve/improve-auto-accept.js +0 -276
  531. package/dist/commands/improve/improve-profiles.js +0 -168
  532. package/dist/commands/improve/procedural.js +0 -398
  533. package/dist/commands/improve/recombine.js +0 -818
  534. package/dist/commands/improve/schema-similarity-gate.js +0 -168
  535. package/dist/commands/lint/agent-linter.js +0 -44
  536. package/dist/commands/lint/command-linter.js +0 -44
  537. package/dist/commands/lint/default-linter.js +0 -16
  538. package/dist/commands/lint/fact-linter.js +0 -39
  539. package/dist/commands/lint/knowledge-linter.js +0 -16
  540. package/dist/commands/lint/memory-linter.js +0 -61
  541. package/dist/commands/lint/registry.js +0 -41
  542. package/dist/commands/lint/skill-linter.js +0 -45
  543. package/dist/commands/lint/task-linter.js +0 -50
  544. package/dist/commands/lint/workflow-linter.js +0 -81
  545. package/dist/commands/proposal/legacy-import.js +0 -115
  546. package/dist/commands/sources/history.js +0 -196
  547. package/dist/commands/tasks/default-tasks.js +0 -186
  548. package/dist/commands/wiki-cli.js +0 -292
  549. package/dist/core/asset/asset-registry.js +0 -76
  550. package/dist/core/asset/asset-spec.js +0 -316
  551. package/dist/core/config/config-migration.js +0 -602
  552. package/dist/core/deep-merge.js +0 -38
  553. package/dist/core/eval/rank-metrics.js +0 -113
  554. package/dist/core/ripgrep/install.js +0 -163
  555. package/dist/core/ripgrep/resolve.js +0 -81
  556. package/dist/indexer/db/db.js +0 -1414
  557. package/dist/indexer/manifest.js +0 -170
  558. package/dist/indexer/passes/metadata-contributors.js +0 -31
  559. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
  560. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -25
  561. package/dist/llm/call-ai.js +0 -62
  562. package/dist/llm/memory-infer-impl.js +0 -138
  563. package/dist/output/shapes/distill.js +0 -14
  564. package/dist/output/shapes/history.js +0 -11
  565. package/dist/output/text/distill.js +0 -6
  566. package/dist/output/text/enable-disable.js +0 -8
  567. package/dist/output/text/history.js +0 -6
  568. package/dist/output/text/wiki.js +0 -16
  569. package/dist/registry/build-index.js +0 -386
  570. package/dist/schemas/akm-config.json +0 -14225
  571. package/dist/scripts/migrate-storage.js +0 -13169
  572. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -10169
  573. package/dist/scripts/migrations/v16-to-v17.js +0 -141
  574. package/dist/setup/legacy-config.js +0 -106
  575. package/dist/storage/repositories/consolidation-repository.js +0 -38
  576. package/dist/storage/repositories/recombine-repository.js +0 -213
  577. package/dist/wiki/wiki-templates.js +0 -15
  578. package/dist/wiki/wiki.js +0 -1012
  579. package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
  580. package/dist/workflows/db.js +0 -350
  581. package/dist/workflows/exec/watch.js +0 -116
  582. package/dist/workflows/program/parser.js +0 -760
  583. package/dist/workflows/program/project.js +0 -105
  584. package/docs/data-and-telemetry.md +0 -227
  585. package/docs/migration/release-notes/0.9.0-beta.60.md +0 -19
  586. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
  587. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
@@ -2,111 +2,226 @@
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  import { spawnSync } from "node:child_process";
5
+ import { createRequire } from "node:module";
5
6
  import { loadConfig } from "../../core/config/config.js";
6
- import { detectAgentCliProfiles, requireAgentProfile } from "../../integrations/agent/index.js";
7
- import { TASK_FAIL_RATE_WARN, } from "./types.js";
8
- const ACTIVE_RUN_WARN_MS = 15 * 60 * 1000;
9
- /**
10
- * Probe the configured agent profile. Self-contained (reads config + PATH); the
11
- * only check that performs IO at dispatch time, preserving the original inline
12
- * `runAgentProbe()` call site behaviour exactly.
13
- */
14
- export function runAgentProbe() {
15
- const config = loadConfig();
16
- // v2: check profiles.agent first
17
- if (config.profiles?.agent) {
18
- const defaultName = config.defaults?.agent;
19
- const profileCount = Object.keys(config.profiles.agent).length;
20
- if (profileCount === 0) {
21
- return {
22
- name: "agent-profile",
23
- kind: "deterministic",
24
- status: "unknown",
25
- confidence: "high",
26
- message: "No agent profiles configured in profiles.agent.",
27
- };
28
- }
29
- const profileName = defaultName ?? Object.keys(config.profiles.agent)[0];
30
- const profile = config.profiles.agent[profileName];
7
+ import { resolveEngine } from "../../integrations/agent/engine-resolution.js";
8
+ import { resolveModel } from "../../integrations/agent/model-aliases.js";
9
+ import { resolveImprovePlan } from "../improve/improve-strategies.js";
10
+ import { ACTIVE_RUN_WARN_MS, TASK_FAIL_RATE_WARN, } from "./types.js";
11
+ function credentialAvailable(credential, env) {
12
+ return !credential?.required || credential.names.some((name) => Boolean(env[name]?.trim()));
13
+ }
14
+ function runConfiguredEngineProbe(checkName, engineName, config, deps) {
15
+ if (!engineName) {
31
16
  return {
32
- name: "agent-profile",
17
+ name: checkName,
33
18
  kind: "deterministic",
34
- status: "pass",
19
+ status: "unknown",
35
20
  confidence: "high",
36
- message: `v2 agent profile "${profileName}" configured (platform: ${profile?.platform ?? "unknown"}).`,
37
- evidence: { profile: profileName, platform: profile?.platform, profileCount },
21
+ message: checkName === "default-llm-engine"
22
+ ? "No default LLM engine is configured."
23
+ : "No default engine is configured.",
38
24
  };
39
25
  }
40
- if (!config.profiles?.agent && !config.defaults?.agent) {
26
+ const env = deps.env ?? process.env;
27
+ const configuredEngine = config.engines?.[engineName];
28
+ if (configuredEngine?.kind === "agent" && configuredEngine.platform === "opencode-sdk") {
29
+ let packageAvailable = false;
30
+ try {
31
+ const resolvePackage = deps.resolvePackage ?? ((name) => createRequire(import.meta.url).resolve(name));
32
+ resolvePackage("@opencode-ai/sdk");
33
+ packageAvailable = true;
34
+ }
35
+ catch {
36
+ packageAvailable = false;
37
+ }
38
+ const binary = configuredEngine.bin ?? "opencode";
39
+ const version = (deps.spawnSync ?? spawnSync)(binary, ["--version"], { encoding: "utf8", timeout: 5_000 });
40
+ const binaryAvailable = (version.status ?? 1) === 0;
41
+ const fallbackEngine = configuredEngine.llmEngine ?? config.defaults?.llmEngine;
42
+ let fallback;
43
+ let fallbackCredential;
44
+ let sdkRunner;
45
+ const resolve = deps.resolveEngine ?? resolveEngine;
46
+ try {
47
+ const resolved = resolve(engineName, config);
48
+ if (resolved.kind === "sdk")
49
+ sdkRunner = resolved;
50
+ }
51
+ catch {
52
+ sdkRunner = undefined;
53
+ }
54
+ if (sdkRunner?.fallbackConnection) {
55
+ fallback = { kind: "llm", connection: sdkRunner.fallbackConnection };
56
+ fallbackCredential = sdkRunner.fallbackCredential;
57
+ }
58
+ else if (fallbackEngine) {
59
+ try {
60
+ const resolved = resolve(fallbackEngine, config);
61
+ if (resolved.kind === "llm") {
62
+ fallback = resolved;
63
+ fallbackCredential = resolved.credential;
64
+ }
65
+ }
66
+ catch {
67
+ fallback = undefined;
68
+ }
69
+ }
70
+ const configuredModel = configuredEngine.model
71
+ ? resolveModel(configuredEngine.model, "opencode-sdk", configuredEngine.modelAliases, config.modelAliases)
72
+ : undefined;
73
+ const effectiveModel = sdkRunner?.profile.model ?? configuredModel ?? fallback?.connection.model;
74
+ const fallbackCredentialAvailable = credentialAvailable(fallbackCredential, env);
75
+ const missing = [
76
+ !packageAvailable ? "@opencode-ai/sdk package" : undefined,
77
+ !binaryAvailable ? `${binary} binary` : undefined,
78
+ fallbackEngine && !fallback ? "configured fallback LLM connection" : undefined,
79
+ !fallbackCredentialAvailable ? "required fallback credential" : undefined,
80
+ ].filter((value) => value !== undefined);
41
81
  return {
42
- name: "agent-profile",
82
+ name: checkName,
43
83
  kind: "deterministic",
44
- status: "unknown",
84
+ status: missing.length === 0 ? "pass" : "warn",
45
85
  confidence: "high",
46
- message: "No agent config present.",
86
+ message: missing.length === 0
87
+ ? `SDK engine "${engineName}" is available.`
88
+ : `SDK engine "${engineName}" is incomplete: missing ${missing.join(", ")}.`,
89
+ evidence: {
90
+ engine: engineName,
91
+ platform: configuredEngine.platform,
92
+ runtimeKind: "sdk",
93
+ binary,
94
+ binaryAvailable,
95
+ package: "@opencode-ai/sdk",
96
+ packageAvailable,
97
+ model: effectiveModel ?? null,
98
+ configuredModel: configuredModel ?? null,
99
+ modelSource: configuredModel ? "sdk" : effectiveModel ? "fallback" : null,
100
+ fallbackEngine: fallbackEngine ?? null,
101
+ fallbackEndpoint: fallback?.connection.endpoint ?? null,
102
+ fallbackModel: fallback?.connection.model ?? null,
103
+ requiredCredentialAvailable: fallbackCredentialAvailable,
104
+ },
47
105
  };
48
106
  }
49
- let profile;
50
107
  try {
51
- profile = requireAgentProfile(config);
52
- }
53
- catch (error) {
108
+ const runner = (deps.resolveEngine ?? resolveEngine)(engineName, config);
109
+ if (runner.kind === "llm") {
110
+ const requiredCredentialAvailable = credentialAvailable(runner.credential, env);
111
+ return {
112
+ name: checkName,
113
+ kind: "deterministic",
114
+ status: requiredCredentialAvailable ? "pass" : "warn",
115
+ confidence: "high",
116
+ message: requiredCredentialAvailable
117
+ ? `LLM engine "${engineName}" is configured.`
118
+ : `LLM engine "${engineName}" is configured, but its required credential is unavailable.`,
119
+ evidence: {
120
+ engine: engineName,
121
+ platform: null,
122
+ runtimeKind: "llm",
123
+ model: runner.connection.model,
124
+ endpoint: runner.connection.endpoint,
125
+ requiredCredentialAvailable,
126
+ },
127
+ };
128
+ }
129
+ const profile = runner.profile;
130
+ if (runner.kind === "sdk")
131
+ throw new Error(`SDK engine "${engineName}" has no matching SDK config.`);
132
+ const version = (deps.spawnSync ?? spawnSync)(profile.bin, ["--version"], { encoding: "utf8", timeout: 5_000 });
133
+ if ((version.status ?? 1) !== 0) {
134
+ return {
135
+ name: checkName,
136
+ kind: "deterministic",
137
+ status: "warn",
138
+ confidence: "medium",
139
+ message: `Agent engine "${engineName}" was found but \`--version\` failed.`,
140
+ evidence: {
141
+ engine: engineName,
142
+ platform: profile.platform ?? null,
143
+ runtimeKind: "agent",
144
+ model: profile.model ?? null,
145
+ },
146
+ };
147
+ }
54
148
  return {
55
- name: "agent-profile",
149
+ name: checkName,
56
150
  kind: "deterministic",
57
- status: "warn",
151
+ status: "pass",
58
152
  confidence: "high",
59
- message: error instanceof Error ? error.message : String(error),
153
+ message: `Agent engine "${engineName}" is available.`,
154
+ evidence: {
155
+ engine: engineName,
156
+ platform: profile.platform ?? null,
157
+ runtimeKind: "agent",
158
+ model: profile.model ?? null,
159
+ },
60
160
  };
61
161
  }
62
- if (profile.sdkMode === true) {
162
+ catch (error) {
63
163
  return {
64
- name: "agent-profile",
164
+ name: checkName,
65
165
  kind: "deterministic",
66
- status: profile.model ? "pass" : "warn",
166
+ status: "warn",
67
167
  confidence: "high",
68
- message: profile.model
69
- ? `SDK mode profile "${profile.name}" is configured.`
70
- : `SDK mode profile "${profile.name}" has no explicit model.`,
71
- evidence: { profile: profile.name, sdkMode: true, model: profile.model ?? null },
168
+ message: error instanceof Error ? error.message : String(error),
72
169
  };
73
170
  }
74
- const detections = detectAgentCliProfiles(config);
75
- const detection = detections.find((entry) => entry.name === profile.name);
76
- if (!detection?.available) {
171
+ }
172
+ export function runDefaultEngineProbe(deps = {}) {
173
+ const config = deps.loadConfig?.() ?? loadConfig();
174
+ return runConfiguredEngineProbe("default-engine", config.defaults?.engine, config, deps);
175
+ }
176
+ export function runDefaultLlmEngineProbe(deps = {}) {
177
+ const config = deps.loadConfig?.() ?? loadConfig();
178
+ return runConfiguredEngineProbe("default-llm-engine", config.defaults?.llmEngine, config, deps);
179
+ }
180
+ export function runActiveImproveStrategyProbe(deps = {}) {
181
+ const config = deps.loadConfig?.() ?? loadConfig();
182
+ const strategyName = config.defaults?.improveStrategy ?? "default";
183
+ try {
184
+ const plan = resolveImprovePlan(strategyName, config);
185
+ const env = deps.env ?? process.env;
186
+ const unavailableProcesses = Object.entries(plan.processes).flatMap(([name, process]) => {
187
+ if (!process.enabled || !process.runner)
188
+ return [];
189
+ return credentialAvailable(process.runner.credential, env) ? [] : [name];
190
+ });
191
+ if (plan.triageJudgment) {
192
+ const judgmentCredential = plan.triageJudgment.kind === "llm"
193
+ ? plan.triageJudgment.credential
194
+ : plan.triageJudgment.kind === "sdk"
195
+ ? plan.triageJudgment.fallbackCredential
196
+ : undefined;
197
+ if (!credentialAvailable(judgmentCredential, env))
198
+ unavailableProcesses.push("triage.judgment");
199
+ }
77
200
  return {
78
- name: "agent-profile",
201
+ name: "active-improve-strategy",
79
202
  kind: "deterministic",
80
- status: "fail",
203
+ status: unavailableProcesses.length === 0 ? "pass" : "warn",
81
204
  confidence: "high",
82
- message: `Default agent profile "${profile.name}" is not available on PATH.`,
83
- evidence: { profile: profile.name, bin: profile.bin },
205
+ message: unavailableProcesses.length === 0
206
+ ? `Active improve strategy "${plan.strategy.name}" has available process engines.`
207
+ : `Active improve strategy "${plan.strategy.name}" has unavailable required credentials for: ${unavailableProcesses.join(", ")}.`,
208
+ evidence: {
209
+ strategy: plan.strategy.name,
210
+ unavailableProcesses,
211
+ },
84
212
  };
85
213
  }
86
- const version = spawnSync(profile.bin, ["--version"], { encoding: "utf8", timeout: 5_000 });
87
- if ((version.status ?? 1) !== 0) {
214
+ catch (error) {
215
+ const explicitlyConfigured = config.defaults?.improveStrategy !== undefined || Object.keys(config.improve?.strategies ?? {}).length > 0;
88
216
  return {
89
- name: "agent-profile",
217
+ name: "active-improve-strategy",
90
218
  kind: "deterministic",
91
- status: "warn",
92
- confidence: "medium",
93
- message: `Agent binary "${profile.bin}" was found but \`--version\` failed.`,
94
- evidence: {
95
- profile: profile.name,
96
- bin: profile.bin,
97
- exitCode: version.status ?? null,
98
- stderr: (version.stderr ?? "").trim(),
99
- },
219
+ status: explicitlyConfigured ? "warn" : "unknown",
220
+ confidence: "high",
221
+ message: `Active improve strategy "${strategyName}" is unavailable: ${error instanceof Error ? error.message : String(error)}`,
222
+ evidence: { strategy: strategyName, unavailableProcesses: [] },
100
223
  };
101
224
  }
102
- return {
103
- name: "agent-profile",
104
- kind: "deterministic",
105
- status: "pass",
106
- confidence: "high",
107
- message: `Agent profile "${profile.name}" is available.`,
108
- evidence: { profile: profile.name, bin: profile.bin, version: (version.stdout ?? "").trim() },
109
- };
110
225
  }
111
226
  /**
112
227
  * The ordered health-check registry. ORDER IS LOAD-BEARING: `akmHealth`
@@ -173,44 +288,89 @@ export const HEALTH_CHECKS = [
173
288
  {
174
289
  name: "active-runs",
175
290
  channel: "hard",
176
- run: (ctx) => ({
177
- name: "active-runs",
178
- kind: "deterministic",
179
- status: ctx.stuckActiveRuns === 0 ? "pass" : "warn",
180
- confidence: "high",
181
- message: ctx.stuckActiveRuns === 0
182
- ? "No active task runs exceeded the stale threshold."
183
- : `${ctx.stuckActiveRuns} active task run(s) are older than ${Math.round(ACTIVE_RUN_WARN_MS / 60000)} minutes.`,
184
- evidence: { stuckActiveRuns: ctx.stuckActiveRuns },
185
- }),
291
+ run: (ctx) => {
292
+ // Name the stuck task_ids (deduped, oldest first) so an operator knows
293
+ // WHICH tasks to investigate, not just how many rows are stale. No
294
+ // pid/liveness detection — that's out of scope here.
295
+ const named = [...ctx.stuckActiveTasks].sort((a, b) => b.ageMs - a.ageMs);
296
+ const detail = named.map((t) => `${t.taskId} (${Math.round(t.ageMs / 60000)}m)`).join(", ");
297
+ return {
298
+ name: "active-runs",
299
+ kind: "deterministic",
300
+ status: ctx.stuckActiveRuns === 0 ? "pass" : "warn",
301
+ confidence: "high",
302
+ message: ctx.stuckActiveRuns === 0
303
+ ? "No active task runs exceeded the stale threshold."
304
+ : `${ctx.stuckActiveRuns} active task run(s) are older than ${Math.round(ACTIVE_RUN_WARN_MS / 60000)} minutes: ${detail}.`,
305
+ evidence: { stuckActiveRuns: ctx.stuckActiveRuns, stuckActiveTasks: ctx.stuckActiveTasks },
306
+ };
307
+ },
308
+ },
309
+ {
310
+ name: "default-engine",
311
+ channel: "hard",
312
+ run: () => runDefaultEngineProbe(),
313
+ },
314
+ {
315
+ name: "default-llm-engine",
316
+ channel: "hard",
317
+ run: () => runDefaultLlmEngineProbe(),
186
318
  },
187
319
  {
188
- name: "agent-profile",
320
+ name: "active-improve-strategy",
189
321
  channel: "hard",
190
- run: () => runAgentProbe(),
322
+ run: () => runActiveImproveStrategyProbe(),
191
323
  },
192
324
  {
193
325
  // C2 (13-bus-factor): the cron task-failure rate was computed and rendered
194
326
  // in the HTML report but never surfaced as an advisory, so a sustained
195
327
  // 15–16% fail rate stayed invisible on `akm health`. Warn at/above the SAME
196
328
  // 5% threshold the html-report badge uses (see TASK_FAIL_RATE_WARN).
329
+ //
330
+ // Item 6: the aggregate can hide a single consistently-failing task inside
331
+ // a large, mostly-healthy population (e.g. 1 flaky task at 100 rows total
332
+ // reads as <5% aggregate). Also warn when the single worst task_id (with
333
+ // enough rows to be a real signal — see MIN_ROWS_FOR_WORST_TASK_FAIL_RATE)
334
+ // crosses the same threshold, naming it explicitly.
197
335
  name: "task-fail-rate",
198
336
  channel: "advisory",
199
337
  run: (ctx) => {
200
338
  const pctStr = `${(ctx.taskFailRate * 100).toFixed(1)}%`;
201
339
  const thresholdPct = `${(TASK_FAIL_RATE_WARN * 100).toFixed(0)}%`;
202
- const warn = ctx.taskFailRate >= TASK_FAIL_RATE_WARN;
340
+ const aggregateWarn = ctx.taskFailRate >= TASK_FAIL_RATE_WARN;
341
+ const worst = ctx.worstTaskFailRate;
342
+ const worstWarn = worst !== null && worst.rate >= TASK_FAIL_RATE_WARN;
343
+ const warn = aggregateWarn || worstWarn;
344
+ let message;
345
+ if (ctx.taskRowCount === 0) {
346
+ message = `No cron tasks ran since ${ctx.since} — no task-fail-rate signal.`;
347
+ }
348
+ else if (warn) {
349
+ const parts = [];
350
+ if (aggregateWarn) {
351
+ parts.push(`aggregate ${pctStr} across ${ctx.taskRowCount} task(s) since ${ctx.since} ≥ ${thresholdPct}`);
352
+ }
353
+ if (worstWarn && worst) {
354
+ const worstPctStr = `${(worst.rate * 100).toFixed(1)}%`;
355
+ parts.push(`task "${worst.taskId}" fails ${worstPctStr} of its ${worst.rows} run(s) ≥ ${thresholdPct}`);
356
+ }
357
+ message = `Cron task fail rate warning: ${parts.join("; ")} — inspect failed runs (ok=false) for early-exit/harness errors.`;
358
+ }
359
+ else {
360
+ message = `Cron task fail rate ${pctStr} across ${ctx.taskRowCount} task(s) since ${ctx.since} (below ${thresholdPct} threshold).`;
361
+ }
203
362
  return {
204
363
  name: "task-fail-rate",
205
364
  kind: "deterministic",
206
365
  status: warn ? "warn" : "pass",
207
366
  confidence: "high",
208
- message: ctx.taskRowCount === 0
209
- ? `No cron tasks ran since ${ctx.since} — no task-fail-rate signal.`
210
- : warn
211
- ? `Cron task fail rate ${pctStr} across ${ctx.taskRowCount} task(s) since ${ctx.since} ≥ ${thresholdPct} threshold — inspect failed runs (ok=false) for early-exit/harness errors.`
212
- : `Cron task fail rate ${pctStr} across ${ctx.taskRowCount} task(s) since ${ctx.since} (below ${thresholdPct} threshold).`,
213
- evidence: { taskFailRate: ctx.taskFailRate, taskRowCount: ctx.taskRowCount, threshold: TASK_FAIL_RATE_WARN },
367
+ message,
368
+ evidence: {
369
+ taskFailRate: ctx.taskFailRate,
370
+ taskRowCount: ctx.taskRowCount,
371
+ threshold: TASK_FAIL_RATE_WARN,
372
+ worstTaskFailRate: worst,
373
+ },
214
374
  };
215
375
  },
216
376
  },
@@ -228,7 +388,7 @@ export const HEALTH_CHECKS = [
228
388
  const endpointAdvisory = blocked && remoteReason && ctx.embeddingEndpoint
229
389
  ? `Configured embedding endpoint ${ctx.embeddingEndpoint} is failing ` +
230
390
  `(${ctx.semanticStatus?.reason}${ctx.semanticStatus?.message ? `: ${ctx.semanticStatus.message}` : ""}) ` +
231
- `while semanticSearchMode is "${ctx.semanticSearchMode ?? "auto"}". Searches fall back to keyword-only. ` +
391
+ `while semanticSearchMode is "${ctx.semanticSearchMode ?? "off"}". Searches fall back to keyword-only. ` +
232
392
  `Restore the endpoint, or set semanticSearchMode to "off" (or remove embedding.endpoint to use the local model).`
233
393
  : undefined;
234
394
  return {
@@ -363,4 +523,29 @@ export const HEALTH_CHECKS = [
363
523
  };
364
524
  },
365
525
  },
526
+ {
527
+ // Item 4: stale durable-transaction journals under $DATA/txn (stranded
528
+ // recovery state seen twice in a real 0.9 migration) had zero health
529
+ // visibility. `count`/`unreadable` already exclude journals younger than
530
+ // the sweeper's grace period (a currently-running operation), so any
531
+ // nonzero count here is a real leftover.
532
+ name: "stale-txn-journals",
533
+ channel: "advisory",
534
+ run: (ctx) => {
535
+ const s = ctx.staleTxnJournals;
536
+ const warn = s.count > 0;
537
+ const unreadablePart = s.unreadable > 0 ? `, ${s.unreadable} unreadable` : "";
538
+ const agePart = s.oldestAgeMs !== null ? `, oldest ${Math.round(s.oldestAgeMs / 60000)}m old` : "";
539
+ return {
540
+ name: "stale-txn-journals",
541
+ kind: "deterministic",
542
+ status: warn ? "warn" : "pass",
543
+ confidence: "high",
544
+ message: warn
545
+ ? `${s.count} stale transaction journal(s) found under ${s.dir}${unreadablePart}${agePart} — see docs/migration/v0.9.0-troubleshooting.md for journal reconciliation steps.`
546
+ : "No stale transaction journals found.",
547
+ evidence: { dir: s.dir, count: s.count, unreadable: s.unreadable, oldestAgeMs: s.oldestAgeMs },
548
+ };
549
+ },
550
+ },
366
551
  ];