akm-cli 0.9.0-rc.0 → 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 (598) hide show
  1. package/CHANGELOG.md +1283 -22
  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/prompts/workflow-unit-preamble.md +26 -0
  26. package/dist/assets/stash-skeleton/README.md +38 -10
  27. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
  28. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
  29. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
  30. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
  38. package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
  39. package/dist/assets/tasks/core/extract.yml +3 -2
  40. package/dist/assets/tasks/core/improve.yml +2 -1
  41. package/dist/assets/tasks/core/index-refresh.yml +1 -0
  42. package/dist/assets/tasks/core/sync.yml +1 -0
  43. package/dist/assets/tasks/core/version-check.yml +2 -1
  44. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  45. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  46. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  47. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  48. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  49. package/dist/assets/templates/html/health.html +5 -4
  50. package/dist/assets/workflows/workflow-template.md +31 -15
  51. package/dist/cli/invocation.js +279 -0
  52. package/dist/cli/parse-args.js +5 -90
  53. package/dist/cli/retired-commands.js +78 -0
  54. package/dist/cli/shared.js +158 -48
  55. package/dist/cli-node.mjs +2 -1
  56. package/dist/cli.js +747 -293
  57. package/dist/commands/agent/agent-dispatch.js +19 -18
  58. package/dist/commands/agent/agent-support.js +0 -24
  59. package/dist/commands/agent/contribute-cli.js +43 -97
  60. package/dist/commands/completions.js +80 -23
  61. package/dist/commands/config-cli.js +44 -281
  62. package/dist/commands/env/env-binding.js +99 -0
  63. package/dist/commands/env/env-cli.js +84 -224
  64. package/dist/commands/env/env.js +12 -163
  65. package/dist/commands/env/marker-path.js +6 -0
  66. package/dist/commands/env/secret-cli.js +45 -61
  67. package/dist/commands/env/secret.js +32 -62
  68. package/dist/commands/feedback-cli.js +179 -85
  69. package/dist/commands/health/accept-rate.js +58 -0
  70. package/dist/commands/health/advisories.js +7 -8
  71. package/dist/commands/health/checks.js +279 -94
  72. package/dist/commands/health/html-report.js +197 -578
  73. package/dist/commands/health/improve-metrics.js +277 -246
  74. package/dist/commands/health/llm-usage.js +19 -19
  75. package/dist/commands/health/md-report.js +16 -7
  76. package/dist/commands/health/metrics.js +67 -32
  77. package/dist/commands/health/renderers.js +47 -0
  78. package/dist/commands/health/report-view-model.js +508 -0
  79. package/dist/commands/health/stash-exposure.js +1 -1
  80. package/dist/commands/health/surfaces.js +16 -56
  81. package/dist/commands/health/task-runs.js +3 -67
  82. package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
  83. package/dist/commands/health/types-improve.js +29 -0
  84. package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
  85. package/dist/commands/health/types-result.js +7 -0
  86. package/dist/commands/health/types-runs.js +4 -0
  87. package/dist/commands/health/types-session-log.js +4 -0
  88. package/dist/commands/health/types-windows.js +4 -0
  89. package/dist/commands/health/types.js +26 -21
  90. package/dist/commands/health/windows.js +2 -3
  91. package/dist/commands/health.js +296 -167
  92. package/dist/commands/improve/anti-collapse.js +5 -5
  93. package/dist/commands/improve/autonomy-gate.js +68 -0
  94. package/dist/commands/improve/collapse-detector.js +65 -52
  95. package/dist/commands/improve/consolidate/chunking.js +9 -7
  96. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  97. package/dist/commands/improve/consolidate/merge.js +4 -0
  98. package/dist/commands/improve/consolidate.js +454 -1354
  99. package/dist/commands/improve/content-hash.js +39 -0
  100. package/dist/commands/improve/distill/content-repair.js +4 -10
  101. package/dist/commands/improve/distill/promote-memory.js +89 -64
  102. package/dist/commands/improve/distill/quality-gate.js +118 -42
  103. package/dist/commands/improve/distill-guards.js +1 -1
  104. package/dist/commands/improve/distill-promotion-policy.js +33 -888
  105. package/dist/commands/improve/distill.js +607 -363
  106. package/dist/commands/improve/eligibility.js +165 -79
  107. package/dist/commands/improve/extract-cli.js +35 -126
  108. package/dist/commands/improve/extract-prompt.js +6 -35
  109. package/dist/commands/improve/extract.js +640 -391
  110. package/dist/commands/improve/feedback-valence.js +2 -12
  111. package/dist/commands/improve/improve-cli.js +134 -135
  112. package/dist/commands/improve/improve-result-file.js +30 -50
  113. package/dist/commands/improve/improve-run-types.js +4 -0
  114. package/dist/commands/improve/improve-strategies.js +135 -0
  115. package/dist/commands/improve/improve.js +904 -701
  116. package/dist/commands/improve/locks.js +64 -111
  117. package/dist/commands/improve/loop-stages.js +1110 -923
  118. package/dist/commands/improve/memory/derived-ref.js +124 -0
  119. package/dist/commands/improve/memory/memory-belief.js +79 -7
  120. package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
  121. package/dist/commands/improve/memory/memory-improve.js +25 -37
  122. package/dist/commands/improve/outcome-loop.js +25 -88
  123. package/dist/commands/improve/preparation.js +1034 -813
  124. package/dist/commands/improve/proactive-maintenance.js +34 -9
  125. package/dist/commands/improve/proposal-envelope.js +31 -0
  126. package/dist/commands/improve/reflect.js +983 -794
  127. package/dist/commands/improve/run-context.js +119 -0
  128. package/dist/commands/improve/salience.js +24 -127
  129. package/dist/commands/improve/session-asset.js +7 -3
  130. package/dist/commands/improve/shared.js +14 -34
  131. package/dist/commands/improve/source-identity.js +28 -0
  132. package/dist/commands/improve/triage.js +20 -17
  133. package/dist/commands/lint/base-linter.js +340 -313
  134. package/dist/commands/lint/env-key-rules.js +31 -47
  135. package/dist/commands/lint/index.js +185 -30
  136. package/dist/commands/{events.js → log.js} +28 -38
  137. package/dist/commands/migrate-cli.js +54 -0
  138. package/dist/commands/migration-tool.js +55 -0
  139. package/dist/commands/observability-cli.js +70 -208
  140. package/dist/commands/proposal/diff-format.js +50 -0
  141. package/dist/commands/proposal/drain-policies.js +0 -6
  142. package/dist/commands/proposal/drain.js +91 -40
  143. package/dist/commands/proposal/proposal-cli.js +134 -132
  144. package/dist/commands/proposal/proposal-types.js +56 -0
  145. package/dist/commands/proposal/proposal.js +83 -65
  146. package/dist/commands/proposal/propose-cli.js +88 -0
  147. package/dist/commands/proposal/propose.js +105 -88
  148. package/dist/commands/proposal/repository.js +1303 -278
  149. package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
  150. package/dist/commands/proposal/validators/proposal-validators.js +61 -12
  151. package/dist/commands/proposal/validators/proposals.js +6 -8
  152. package/dist/commands/read/curate.js +78 -73
  153. package/dist/commands/read/knowledge.js +510 -13
  154. package/dist/commands/read/registry-search.js +2 -2
  155. package/dist/commands/read/remember-cli.js +84 -15
  156. package/dist/commands/read/search-cli.js +203 -96
  157. package/dist/commands/read/search.js +126 -94
  158. package/dist/commands/read/show.js +226 -250
  159. package/dist/commands/registry-cli.js +34 -60
  160. package/dist/commands/remember.js +18 -57
  161. package/dist/commands/sources/add-cli.js +104 -49
  162. package/dist/commands/sources/bundle-cli.js +166 -0
  163. package/dist/commands/sources/bundle-config-ops.js +63 -0
  164. package/dist/commands/sources/info.js +27 -15
  165. package/dist/commands/sources/init.js +30 -40
  166. package/dist/commands/sources/installed-stashes.js +469 -172
  167. package/dist/commands/sources/migration-help.js +7 -4
  168. package/dist/commands/sources/schema-repair.js +10 -9
  169. package/dist/commands/sources/self-update.js +182 -121
  170. package/dist/commands/sources/source-add.js +169 -178
  171. package/dist/commands/sources/source-clone.js +144 -41
  172. package/dist/commands/sources/source-manage.js +94 -59
  173. package/dist/commands/sources/sources-cli.js +64 -205
  174. package/dist/commands/sources/stash-cli.js +91 -54
  175. package/dist/commands/sources/stash-skeleton.js +1 -1
  176. package/dist/commands/tasks/tasks-cli.js +106 -104
  177. package/dist/commands/tasks/tasks.js +445 -262
  178. package/dist/commands/workflow-cli.js +232 -121
  179. package/dist/core/action-contributors.js +1 -1
  180. package/dist/core/activation-policy.js +49 -0
  181. package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
  182. package/dist/core/adapter/adapters/akm-adapter.js +528 -0
  183. package/dist/core/adapter/adapters/akm-lint.js +392 -0
  184. package/dist/core/adapter/adapters/akm-metadata.js +387 -0
  185. package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
  186. package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
  187. package/dist/core/adapter/adapters/claude-adapter.js +61 -0
  188. package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
  189. package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
  190. package/dist/core/adapter/adapters/index.js +80 -0
  191. package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
  192. package/dist/core/adapter/adapters/okf-adapter.js +391 -0
  193. package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
  194. package/dist/core/adapter/adapters/shared.js +286 -0
  195. package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
  196. package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
  197. package/dist/core/adapter/bundle-adapter.js +4 -0
  198. package/dist/core/adapter/detect-adapter.js +17 -0
  199. package/dist/core/adapter/recognize-match.js +44 -0
  200. package/dist/core/adapter/registry.js +56 -0
  201. package/dist/core/adapter/types.js +4 -0
  202. package/dist/core/asset/akm-markdown.js +30 -0
  203. package/dist/core/asset/asset-placement.js +243 -0
  204. package/dist/core/asset/asset-ref.js +110 -79
  205. package/dist/core/asset/asset-serialize.js +20 -0
  206. package/dist/core/asset/frontmatter.js +28 -12
  207. package/dist/core/asset/markdown.js +40 -51
  208. package/dist/core/asset/resolve-ref.js +274 -0
  209. package/dist/core/asset/stash-meta.js +2 -2
  210. package/dist/core/bundle-id.js +51 -0
  211. package/dist/core/common.js +281 -86
  212. package/dist/core/config/config-io.js +42 -128
  213. package/dist/core/config/config-schema.js +233 -834
  214. package/dist/core/config/config-sources.js +162 -39
  215. package/dist/core/config/config-types.js +16 -11
  216. package/dist/core/config/config-version.js +29 -0
  217. package/dist/core/config/config-walker.js +126 -37
  218. package/dist/core/config/config.js +154 -331
  219. package/dist/core/config/deep-merge.js +41 -0
  220. package/dist/core/config/engine-semantics.js +28 -0
  221. package/dist/core/config/experimental.js +21 -0
  222. package/dist/core/config/schema/embedding.js +38 -0
  223. package/dist/core/config/schema/engines.js +116 -0
  224. package/dist/core/config/schema/experimental.js +47 -0
  225. package/dist/core/config/schema/feedback.js +31 -0
  226. package/dist/core/config/schema/improve-processes.js +389 -0
  227. package/dist/core/config/schema/improve.js +94 -0
  228. package/dist/core/config/schema/index-config.js +176 -0
  229. package/dist/core/config/schema/output.js +18 -0
  230. package/dist/core/config/schema/primitives.js +94 -0
  231. package/dist/core/config/schema/search.js +30 -0
  232. package/dist/core/config/schema/setup.js +18 -0
  233. package/dist/core/config/schema/sources-bundles.js +169 -0
  234. package/dist/core/config/schema/workflow.js +29 -0
  235. package/dist/core/env-secret-ref.js +155 -20
  236. package/dist/core/errors.js +17 -15
  237. package/dist/core/events-types.js +4 -0
  238. package/dist/core/events.js +46 -128
  239. package/dist/core/extra-params.js +62 -0
  240. package/dist/core/file-change.js +17 -0
  241. package/dist/core/file-lock.js +202 -57
  242. package/dist/core/fs-txn.js +392 -0
  243. package/dist/core/git-message.js +59 -0
  244. package/dist/core/improve-result.js +167 -0
  245. package/dist/core/json-schema.js +142 -0
  246. package/dist/core/lesson-lint.js +1 -17
  247. package/dist/core/logs-db.js +1 -1
  248. package/dist/core/maintenance-barrier.js +135 -0
  249. package/dist/core/migration-operation.js +44 -0
  250. package/dist/core/mutation-target.js +78 -0
  251. package/dist/core/paths.js +22 -25
  252. package/dist/core/platform.js +10 -0
  253. package/dist/core/recognition-util.js +128 -0
  254. package/dist/core/redaction.js +392 -0
  255. package/dist/core/standards/resolve-standards-context.js +36 -65
  256. package/dist/core/standards/resolve-stash-standards.js +2 -2
  257. package/dist/core/standards/resolve-type-conventions.js +5 -5
  258. package/dist/core/state/migrations.js +242 -11
  259. package/dist/core/state-db.js +98 -10
  260. package/dist/core/structured.js +1 -1
  261. package/dist/core/subprocess.js +303 -0
  262. package/dist/core/text-truncation.js +9 -5
  263. package/dist/core/time.js +20 -0
  264. package/dist/core/type-presentation.js +130 -0
  265. package/dist/core/warn.js +0 -3
  266. package/dist/core/write-source.js +834 -118
  267. package/dist/indexer/bundle-identity-guard.js +92 -0
  268. package/dist/indexer/db/graph-db.js +1 -25
  269. package/dist/indexer/db/llm-cache.js +1 -1
  270. package/dist/indexer/ensure-index.js +30 -9
  271. package/dist/indexer/graph/graph-boost.js +9 -30
  272. package/dist/indexer/graph/graph-extraction.js +41 -27
  273. package/dist/indexer/graph/graph-types.js +4 -0
  274. package/dist/indexer/index-writer-lock.js +93 -49
  275. package/dist/indexer/index-written-assets.js +100 -53
  276. package/dist/indexer/indexer.js +746 -329
  277. package/dist/indexer/init.js +18 -25
  278. package/dist/indexer/installations.js +142 -0
  279. package/dist/indexer/passes/dir-staleness.js +18 -10
  280. package/dist/indexer/passes/memory-inference.js +25 -15
  281. package/dist/indexer/passes/metadata.js +412 -243
  282. package/dist/indexer/scan/doc-to-entry.js +160 -0
  283. package/dist/indexer/scan/drain-dir.js +134 -0
  284. package/dist/indexer/search/db-search.js +292 -108
  285. package/dist/indexer/search/fts-query.js +64 -0
  286. package/dist/indexer/search/ranking-contributors.js +145 -25
  287. package/dist/indexer/search/ranking-types.js +4 -0
  288. package/dist/indexer/search/ranking.js +28 -71
  289. package/dist/indexer/search/search-attribution.js +67 -0
  290. package/dist/indexer/search/search-fields.js +18 -3
  291. package/dist/indexer/search/search-hit-enrichers.js +30 -40
  292. package/dist/indexer/search/search-source.js +157 -111
  293. package/dist/indexer/search/semantic-status.js +4 -1
  294. package/dist/indexer/usage/usage-events.js +10 -30
  295. package/dist/indexer/walk/file-context.js +3 -45
  296. package/dist/indexer/walk/matchers.js +42 -34
  297. package/dist/indexer/walk/path-resolver.js +11 -5
  298. package/dist/indexer/walk/walker.js +42 -14
  299. package/dist/integrations/agent/builder-shared.js +7 -0
  300. package/dist/integrations/agent/builders.js +5 -56
  301. package/dist/integrations/agent/config.js +3 -143
  302. package/dist/integrations/agent/detect.js +17 -2
  303. package/dist/integrations/agent/engine-resolution.js +231 -0
  304. package/dist/integrations/agent/index.js +1 -2
  305. package/dist/integrations/agent/model-aliases.js +16 -2
  306. package/dist/integrations/agent/profiles.js +36 -62
  307. package/dist/integrations/agent/prompts.js +46 -18
  308. package/dist/integrations/agent/runner-dispatch.js +93 -4
  309. package/dist/integrations/agent/runner.js +76 -208
  310. package/dist/integrations/agent/spawn.js +88 -196
  311. package/dist/integrations/harnesses/aider/agent-builder.js +114 -0
  312. package/dist/integrations/harnesses/aider/index.js +48 -0
  313. package/dist/integrations/harnesses/aider/result-extractor.js +53 -0
  314. package/dist/integrations/harnesses/amazonq/agent-builder.js +147 -0
  315. package/dist/integrations/harnesses/amazonq/index.js +45 -0
  316. package/dist/integrations/harnesses/amazonq/result-extractor.js +48 -0
  317. package/dist/integrations/harnesses/claude/agent-builder.js +46 -8
  318. package/dist/integrations/harnesses/claude/config-import.js +1 -3
  319. package/dist/integrations/harnesses/claude/index.js +24 -35
  320. package/dist/integrations/harnesses/claude/result-extractor.js +52 -0
  321. package/dist/integrations/harnesses/claude/session-log.js +27 -75
  322. package/dist/integrations/harnesses/codex/agent-builder.js +138 -0
  323. package/dist/integrations/harnesses/codex/index.js +52 -0
  324. package/dist/integrations/harnesses/codex/result-extractor.js +73 -0
  325. package/dist/integrations/harnesses/copilot/agent-builder.js +122 -0
  326. package/dist/integrations/harnesses/copilot/index.js +48 -0
  327. package/dist/integrations/harnesses/copilot/result-extractor.js +151 -0
  328. package/dist/integrations/harnesses/gemini/agent-builder.js +120 -0
  329. package/dist/integrations/harnesses/gemini/index.js +48 -0
  330. package/dist/integrations/harnesses/gemini/result-extractor.js +121 -0
  331. package/dist/integrations/harnesses/ids.js +24 -0
  332. package/dist/integrations/harnesses/index.js +54 -34
  333. package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
  334. package/dist/integrations/harnesses/opencode/config-import.js +1 -3
  335. package/dist/integrations/harnesses/opencode/index.js +14 -32
  336. package/dist/integrations/harnesses/opencode/session-log.js +67 -125
  337. package/dist/integrations/harnesses/opencode-sdk/harness.js +51 -0
  338. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +681 -108
  339. package/dist/integrations/harnesses/openhands/agent-builder.js +128 -0
  340. package/dist/integrations/harnesses/openhands/index.js +48 -0
  341. package/dist/integrations/harnesses/openhands/result-extractor.js +103 -0
  342. package/dist/integrations/harnesses/pi/agent-builder.js +97 -0
  343. package/dist/integrations/harnesses/pi/index.js +45 -0
  344. package/dist/integrations/harnesses/pi/result-extractor.js +135 -0
  345. package/dist/integrations/harnesses/shared.js +17 -0
  346. package/dist/integrations/harnesses/types.js +43 -32
  347. package/dist/integrations/lockfile.js +211 -24
  348. package/dist/integrations/session-logs/index.js +36 -39
  349. package/dist/integrations/session-logs/provider-base.js +113 -0
  350. package/dist/llm/client.js +182 -110
  351. package/dist/llm/embedders/deterministic.js +2 -2
  352. package/dist/llm/embedders/remote.js +21 -9
  353. package/dist/llm/feature-gate.js +17 -57
  354. package/dist/llm/graph-extract.js +12 -13
  355. package/dist/llm/index-passes.js +8 -42
  356. package/dist/llm/memory-infer.js +144 -1
  357. package/dist/llm/metadata-enhance.js +45 -30
  358. package/dist/llm/structured-call.js +16 -8
  359. package/dist/llm/usage-persist.js +30 -5
  360. package/dist/llm/usage-telemetry.js +59 -6
  361. package/dist/output/cli-hints.js +1 -2
  362. package/dist/output/command-registry.js +27 -0
  363. package/dist/output/context.js +22 -7
  364. package/dist/output/format-exempt.js +80 -0
  365. package/dist/output/generic-render.js +251 -0
  366. package/dist/output/html-render.js +11 -16
  367. package/dist/output/render-registry.js +57 -0
  368. package/dist/output/renderers.js +14 -279
  369. package/dist/output/shapes/curate.js +10 -1
  370. package/dist/output/shapes/events.js +12 -7
  371. package/dist/output/shapes/helpers.js +58 -84
  372. package/dist/output/shapes/passthrough.js +11 -39
  373. package/dist/output/shapes/proposal/producer.js +15 -7
  374. package/dist/output/shapes/registry.js +12 -6
  375. package/dist/output/shapes.js +0 -9
  376. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  377. package/dist/output/text/bundle-show.js +7 -0
  378. package/dist/output/text/command-format.js +562 -0
  379. package/dist/output/text/env.js +1 -3
  380. package/dist/output/text/events.js +8 -7
  381. package/dist/output/text/helpers.js +15 -1164
  382. package/dist/output/text/proposal/producer.js +4 -2
  383. package/dist/output/text/proposal-format.js +202 -0
  384. package/dist/output/text/registry-commands.js +1 -2
  385. package/dist/output/text/registry.js +12 -6
  386. package/dist/output/text/show-directives.js +117 -0
  387. package/dist/output/text/show-format.js +103 -0
  388. package/dist/output/text/sync.js +5 -0
  389. package/dist/output/text/workflow-format.js +332 -0
  390. package/dist/output/text/workflow.js +3 -2
  391. package/dist/output/text.js +10 -19
  392. package/dist/registry/factory.js +4 -6
  393. package/dist/registry/origin-resolve.js +16 -27
  394. package/dist/registry/providers/skills-sh.js +3 -3
  395. package/dist/registry/providers/static-index.js +15 -25
  396. package/dist/registry/resolve.js +43 -94
  397. package/dist/registry/semver.js +43 -0
  398. package/dist/runtime.js +81 -12
  399. package/dist/scripts/akm-migrate.js +35529 -0
  400. package/dist/setup/detect.js +5 -7
  401. package/dist/setup/detected-engines.js +136 -0
  402. package/dist/setup/engine-config.js +100 -0
  403. package/dist/setup/registry-stash-loader.js +3 -3
  404. package/dist/setup/semantic-assets.js +12 -9
  405. package/dist/setup/setup.js +444 -208
  406. package/dist/setup/steps/connection-shared.js +120 -0
  407. package/dist/setup/steps/connection.js +108 -305
  408. package/dist/setup/steps/platforms.js +13 -12
  409. package/dist/setup/steps/semantic.js +15 -3
  410. package/dist/setup/steps/sources.js +21 -15
  411. package/dist/setup/steps/stashdir.js +6 -4
  412. package/dist/setup/steps/tasks.js +236 -119
  413. package/dist/setup/steps.js +3 -2
  414. package/dist/sources/freshness.js +39 -0
  415. package/dist/sources/provider-factory.js +11 -17
  416. package/dist/sources/providers/filesystem.js +2 -3
  417. package/dist/sources/providers/git-install.js +278 -34
  418. package/dist/sources/providers/git-provider.js +54 -56
  419. package/dist/sources/providers/git-stash.js +420 -91
  420. package/dist/sources/providers/git.js +2 -2
  421. package/dist/sources/providers/npm.js +16 -19
  422. package/dist/sources/providers/provider-utils.js +47 -22
  423. package/dist/sources/providers/sync-from-ref.js +3 -9
  424. package/dist/sources/providers/website.js +2 -2
  425. package/dist/sources/resolve.js +11 -10
  426. package/dist/sources/snapshot-fetchers/types.js +4 -0
  427. package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
  428. package/dist/storage/database.js +60 -4
  429. package/dist/storage/engines/sqlite-migrations.js +156 -5
  430. package/dist/storage/locations.js +1 -2
  431. package/dist/storage/repositories/canaries-repository.js +1 -1
  432. package/dist/storage/repositories/events-repository.js +51 -11
  433. package/dist/storage/repositories/improve-runs-repository.js +6 -32
  434. package/dist/storage/repositories/index-connection.js +79 -0
  435. package/dist/storage/repositories/index-db.js +4 -3
  436. package/dist/storage/repositories/index-entries-repository.js +863 -0
  437. package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
  438. package/dist/storage/repositories/index-entry-types.js +4 -0
  439. package/dist/storage/repositories/index-fts-repository.js +167 -0
  440. package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
  441. package/dist/storage/repositories/index-meta-repository.js +49 -0
  442. package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
  443. package/dist/storage/repositories/index-sql.js +12 -0
  444. package/dist/storage/repositories/index-utility-repository.js +356 -0
  445. package/dist/storage/repositories/index-vec-repository.js +250 -0
  446. package/dist/storage/repositories/outcome-repository.js +119 -0
  447. package/dist/storage/repositories/proposals-repository.js +317 -75
  448. package/dist/storage/repositories/registry-cache.js +1 -1
  449. package/dist/storage/repositories/salience-repository.js +172 -0
  450. package/dist/storage/repositories/task-history-repository.js +110 -3
  451. package/dist/storage/repositories/workflow-runs-repository.js +240 -19
  452. package/dist/tasks/backends/cron.js +169 -46
  453. package/dist/tasks/backends/exec-utils.js +76 -3
  454. package/dist/tasks/backends/index.js +6 -9
  455. package/dist/tasks/backends/launchd.js +292 -55
  456. package/dist/tasks/backends/schtasks.js +557 -70
  457. package/dist/tasks/backends/types.js +4 -0
  458. package/dist/tasks/command-executable.js +93 -0
  459. package/dist/tasks/embedded.js +56 -38
  460. package/dist/tasks/parser.js +156 -64
  461. package/dist/tasks/resolve-akm-bin.js +144 -51
  462. package/dist/tasks/runner.js +377 -209
  463. package/dist/tasks/schedule.js +108 -19
  464. package/dist/tasks/scheduler-invocation.js +296 -0
  465. package/dist/tasks/schema.js +1 -1
  466. package/dist/tasks/task-id.js +35 -0
  467. package/dist/tasks/validator.js +30 -16
  468. package/dist/text-import-hook.mjs +1 -1
  469. package/dist/workflows/authoring/authoring.js +104 -43
  470. package/dist/workflows/authoring/scope-key.js +1 -1
  471. package/dist/workflows/cli.js +0 -16
  472. package/dist/workflows/concurrency-policy.js +15 -0
  473. package/dist/workflows/exec/brief.js +450 -0
  474. package/dist/workflows/exec/frozen-judge.js +47 -0
  475. package/dist/workflows/exec/native-executor.js +1038 -0
  476. package/dist/workflows/exec/param-secrets.js +115 -0
  477. package/dist/workflows/exec/report.js +1460 -0
  478. package/dist/workflows/exec/run-workflow.js +602 -0
  479. package/dist/workflows/exec/scheduler.js +71 -0
  480. package/dist/workflows/exec/step-work.js +1190 -0
  481. package/dist/workflows/exec/unit-writer.js +23 -0
  482. package/dist/workflows/exec/workflow-engine-gate.js +67 -0
  483. package/dist/workflows/exec/worktree.js +171 -0
  484. package/dist/workflows/ir/compile.js +246 -0
  485. package/dist/workflows/ir/freeze.js +233 -0
  486. package/dist/workflows/ir/params.js +54 -0
  487. package/dist/workflows/ir/plan-hash.js +68 -0
  488. package/dist/workflows/ir/schema.js +540 -0
  489. package/dist/workflows/parser.js +878 -304
  490. package/dist/workflows/program/expressions.js +181 -0
  491. package/dist/workflows/program/schema.js +51 -0
  492. package/dist/workflows/renderer.js +100 -45
  493. package/dist/workflows/resource-limits.js +22 -0
  494. package/dist/workflows/runtime/agent-identity.js +59 -14
  495. package/dist/workflows/runtime/checkin.js +1 -1
  496. package/dist/workflows/runtime/plan-classifier.js +131 -0
  497. package/dist/workflows/runtime/runs.js +376 -119
  498. package/dist/workflows/runtime/unit-checkin.js +45 -0
  499. package/dist/workflows/runtime/unit-phases.js +20 -0
  500. package/dist/workflows/runtime/workflow-asset-loader.js +241 -40
  501. package/dist/workflows/schema.js +1 -11
  502. package/dist/workflows/validate-summary.js +2 -3
  503. package/dist/workflows/validator.js +52 -30
  504. package/docs/README.md +42 -78
  505. package/docs/migration/README.md +8 -0
  506. package/docs/migration/release-notes/0.6.0.md +1 -1
  507. package/docs/migration/release-notes/0.7.0.md +9 -8
  508. package/docs/migration/release-notes/0.9.0.md +158 -14
  509. package/docs/migration/v0.7-to-v0.8.md +46 -47
  510. package/docs/migration/v0.8-to-v0.9.md +844 -0
  511. package/docs/reference/README.md +12 -0
  512. package/docs/reference/data-and-telemetry.md +333 -0
  513. package/package.json +21 -17
  514. package/schemas/akm-asset-envelope.json +93 -0
  515. package/schemas/akm-config.json +4636 -0
  516. package/schemas/akm-task.json +87 -0
  517. package/schemas/akm-workflow.json +373 -0
  518. package/dist/akm-migrate-storage +0 -38
  519. package/dist/assets/help/help-accept.md +0 -12
  520. package/dist/assets/help/help-improve.md +0 -84
  521. package/dist/assets/help/help-proposals.md +0 -17
  522. package/dist/assets/help/help-propose.md +0 -17
  523. package/dist/assets/help/help-reject.md +0 -11
  524. package/dist/assets/profiles/frequent.json +0 -13
  525. package/dist/assets/profiles/recombine-only.json +0 -21
  526. package/dist/assets/profiles/reflect-distill.json +0 -30
  527. package/dist/assets/profiles/synthesize.json +0 -15
  528. package/dist/assets/prompts/procedural-system.md +0 -44
  529. package/dist/assets/prompts/recombine-system.md +0 -40
  530. package/dist/assets/prompts/staleness-detect-system.md +0 -6
  531. package/dist/assets/tasks/core/backup.yml +0 -4
  532. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  533. package/dist/assets/templates/html/default.html +0 -78
  534. package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
  535. package/dist/assets/wiki/index-template.md +0 -12
  536. package/dist/assets/wiki/ingest-workflow-template.md +0 -83
  537. package/dist/assets/wiki/log-template.md +0 -8
  538. package/dist/assets/wiki/schema-template.md +0 -61
  539. package/dist/cli/config-migrate.js +0 -150
  540. package/dist/cli/config-validate.js +0 -39
  541. package/dist/commands/graph/graph-cli.js +0 -124
  542. package/dist/commands/graph/graph.js +0 -487
  543. package/dist/commands/improve/calibration.js +0 -161
  544. package/dist/commands/improve/dedup.js +0 -482
  545. package/dist/commands/improve/extract-watch.js +0 -140
  546. package/dist/commands/improve/hot-probation.js +0 -45
  547. package/dist/commands/improve/improve-auto-accept.js +0 -276
  548. package/dist/commands/improve/improve-profiles.js +0 -168
  549. package/dist/commands/improve/procedural.js +0 -398
  550. package/dist/commands/improve/recombine.js +0 -818
  551. package/dist/commands/improve/schema-similarity-gate.js +0 -168
  552. package/dist/commands/lint/agent-linter.js +0 -44
  553. package/dist/commands/lint/command-linter.js +0 -44
  554. package/dist/commands/lint/default-linter.js +0 -16
  555. package/dist/commands/lint/fact-linter.js +0 -39
  556. package/dist/commands/lint/knowledge-linter.js +0 -16
  557. package/dist/commands/lint/memory-linter.js +0 -61
  558. package/dist/commands/lint/registry.js +0 -41
  559. package/dist/commands/lint/skill-linter.js +0 -45
  560. package/dist/commands/lint/task-linter.js +0 -50
  561. package/dist/commands/lint/workflow-linter.js +0 -81
  562. package/dist/commands/proposal/legacy-import.js +0 -115
  563. package/dist/commands/sources/history.js +0 -196
  564. package/dist/commands/tasks/default-tasks.js +0 -186
  565. package/dist/commands/wiki-cli.js +0 -292
  566. package/dist/core/asset/asset-registry.js +0 -76
  567. package/dist/core/asset/asset-spec.js +0 -259
  568. package/dist/core/config/config-migration.js +0 -602
  569. package/dist/core/deep-merge.js +0 -38
  570. package/dist/core/eval/rank-metrics.js +0 -113
  571. package/dist/core/ripgrep/install.js +0 -163
  572. package/dist/core/ripgrep/resolve.js +0 -81
  573. package/dist/indexer/db/db.js +0 -1413
  574. package/dist/indexer/manifest.js +0 -170
  575. package/dist/indexer/passes/metadata-contributors.js +0 -31
  576. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
  577. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -49
  578. package/dist/llm/call-ai.js +0 -62
  579. package/dist/llm/memory-infer-impl.js +0 -138
  580. package/dist/output/shapes/distill.js +0 -14
  581. package/dist/output/shapes/history.js +0 -11
  582. package/dist/output/text/distill.js +0 -6
  583. package/dist/output/text/enable-disable.js +0 -8
  584. package/dist/output/text/history.js +0 -6
  585. package/dist/output/text/wiki.js +0 -16
  586. package/dist/registry/build-index.js +0 -386
  587. package/dist/scripts/migrate-storage.js +0 -19108
  588. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -9411
  589. package/dist/scripts/migrations/v16-to-v17.js +0 -141
  590. package/dist/setup/legacy-config.js +0 -106
  591. package/dist/storage/repositories/consolidation-repository.js +0 -38
  592. package/dist/storage/repositories/recombine-repository.js +0 -213
  593. package/dist/wiki/wiki-templates.js +0 -15
  594. package/dist/wiki/wiki.js +0 -1012
  595. package/dist/workflows/db.js +0 -215
  596. package/docs/data-and-telemetry.md +0 -226
  597. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
  598. /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
  ];