akm-cli 0.10.261012-beta → 0.10.261014-beta

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 (518) hide show
  1. package/CHANGELOG.md +710 -3
  2. package/README.md +15 -0
  3. package/SECURITY.md +11 -10
  4. package/STABILITY.md +47 -51
  5. package/dist/assets/hints/cli-hints-full.md +21 -19
  6. package/dist/assets/hints/cli-hints-short.md +3 -4
  7. package/dist/assets/opencode/akm-plugin.js +177 -0
  8. package/dist/assets/stash-skeleton/README.md +1 -1
  9. package/dist/assets/tasks/core/improve.yml +1 -1
  10. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +1 -1
  11. package/dist/assets/ui/config.js +27 -10
  12. package/dist/assets/workflows/workflow-template.md +2 -2
  13. package/dist/cli/clack.js +3 -1
  14. package/dist/cli/selection.js +33 -0
  15. package/dist/cli/shared.js +14 -1
  16. package/dist/cli/unknown-flags.js +6 -37
  17. package/dist/cli.js +69 -48
  18. package/dist/commands/agent/agent-dispatch.js +17 -25
  19. package/dist/commands/agent/contribute-cli.js +9 -8
  20. package/dist/commands/command/command-cli.js +4 -8
  21. package/dist/commands/command/command-execution.js +25 -39
  22. package/dist/commands/command/execution-source-loader.js +10 -14
  23. package/dist/commands/completions.js +1 -1
  24. package/dist/commands/config-cli.js +14 -5
  25. package/dist/commands/env/child-env.js +12 -14
  26. package/dist/commands/env/env-binding.js +47 -58
  27. package/dist/commands/env/env-cli.js +22 -24
  28. package/dist/commands/env/env.js +10 -58
  29. package/dist/commands/env/secret-cli.js +11 -29
  30. package/dist/commands/env/secret.js +3 -10
  31. package/dist/commands/health/checks.js +10 -849
  32. package/dist/commands/health/connections-and-harnesses-check.js +109 -0
  33. package/dist/commands/health/egress.js +3 -3
  34. package/dist/commands/health/html-report.js +9 -10
  35. package/dist/commands/health/plugin-staleness.js +18 -11
  36. package/dist/commands/health/report-view-model.js +16 -12
  37. package/dist/commands/health/scheduler-binary.js +1 -1
  38. package/dist/commands/health/semantic-search-check.js +85 -0
  39. package/dist/commands/health/type-directory-check.js +0 -3
  40. package/dist/commands/health.js +30 -42
  41. package/dist/commands/improve/consolidate/pair-pass.js +10 -25
  42. package/dist/commands/improve/consolidate.js +10 -15
  43. package/dist/commands/improve/distill.js +5 -17
  44. package/dist/commands/improve/eligibility.js +1 -3
  45. package/dist/commands/improve/execution.js +37 -40
  46. package/dist/commands/improve/extract-cli.js +6 -11
  47. package/dist/commands/improve/extract-prompt.js +2 -2
  48. package/dist/commands/improve/extract.js +67 -97
  49. package/dist/commands/improve/improve-cli.js +22 -128
  50. package/dist/commands/improve/improve-report.js +1 -1
  51. package/dist/commands/improve/improve-strategies.js +25 -108
  52. package/dist/commands/improve/improve.js +10 -14
  53. package/dist/commands/improve/loop-stages.js +3 -0
  54. package/dist/commands/improve/memory/memory-improve.js +1 -1
  55. package/dist/commands/improve/preparation.js +8 -13
  56. package/dist/commands/improve/reflect.js +203 -332
  57. package/dist/commands/improve/retrieval-scope.js +1 -1
  58. package/dist/commands/improve/session-asset.js +3 -2
  59. package/dist/commands/improve/stage.js +87 -115
  60. package/dist/commands/lint/base-linter.js +3 -3
  61. package/dist/commands/lint/env-key-rules.js +7 -6
  62. package/dist/commands/lint/index.js +3 -3
  63. package/dist/commands/models-cli.js +103 -63
  64. package/dist/commands/proposal/drain.js +26 -39
  65. package/dist/commands/proposal/proposal-cli.js +14 -18
  66. package/dist/commands/proposal/propose-cli.js +4 -2
  67. package/dist/commands/proposal/propose.js +37 -64
  68. package/dist/commands/proposal/repository.js +17 -17
  69. package/dist/commands/proposal/validators/proposal-validators.js +3 -6
  70. package/dist/commands/read/curate.js +10 -6
  71. package/dist/commands/read/registry-search.js +2 -48
  72. package/dist/commands/read/search-cli.js +1 -8
  73. package/dist/commands/read/search.js +5 -6
  74. package/dist/commands/read/show.js +6 -29
  75. package/dist/commands/remember.js +25 -40
  76. package/dist/commands/sources/add-cli.js +8 -63
  77. package/dist/commands/sources/bundle-cli.js +8 -9
  78. package/dist/commands/sources/bundle-config-ops.js +2 -2
  79. package/dist/commands/sources/info.js +12 -1
  80. package/dist/commands/sources/init.js +1 -1
  81. package/dist/commands/sources/installed-stashes.js +119 -63
  82. package/dist/commands/sources/migration-help.js +1 -1
  83. package/dist/commands/sources/plugin-upgrade.js +8 -15
  84. package/dist/commands/sources/schema-repair.js +4 -10
  85. package/dist/commands/sources/source-add.js +2 -2
  86. package/dist/commands/sources/source-clone.js +31 -7
  87. package/dist/commands/sources/source-manage.js +4 -4
  88. package/dist/commands/targets.js +175 -0
  89. package/dist/commands/tasks/explain.js +104 -69
  90. package/dist/commands/tasks/tasks-cli.js +9 -11
  91. package/dist/commands/tasks/tasks.js +75 -97
  92. package/dist/commands/ui/api.js +11 -3
  93. package/dist/commands/ui/redact.js +5 -31
  94. package/dist/commands/ui/workspace-actions.js +1 -1
  95. package/dist/commands/workflow/plan.js +48 -9
  96. package/dist/commands/workflow-cli.js +40 -45
  97. package/dist/core/adapter/adapters/agent-skills-adapter.js +10 -11
  98. package/dist/core/adapter/adapters/akm-adapter.js +36 -41
  99. package/dist/core/adapter/adapters/akm-lint.js +10 -12
  100. package/dist/core/adapter/adapters/akm-metadata.js +2 -2
  101. package/dist/core/adapter/adapters/akm-task-adapter.js +8 -9
  102. package/dist/core/adapter/adapters/akm-workflow-adapter.js +5 -5
  103. package/dist/core/adapter/adapters/claude-adapter.js +1 -1
  104. package/dist/core/adapter/adapters/dotenv-adapter.js +7 -6
  105. package/dist/core/adapter/adapters/generic-files-adapter.js +5 -5
  106. package/dist/core/adapter/adapters/index.js +3 -4
  107. package/dist/core/adapter/adapters/llm-wiki-adapter.js +12 -14
  108. package/dist/core/adapter/adapters/okf-adapter.js +8 -10
  109. package/dist/core/adapter/adapters/opencode-adapter.js +1 -1
  110. package/dist/core/adapter/adapters/shared.js +3 -3
  111. package/dist/core/adapter/adapters/tool-dir-shared.js +7 -25
  112. package/dist/core/adapter/adapters/website-snapshot-adapter.js +3 -3
  113. package/dist/core/adapter/detect-adapter.js +1 -1
  114. package/dist/core/adapter/execution-source.js +13 -35
  115. package/dist/core/adapter/registry.js +1 -1
  116. package/dist/core/adapter/validate-context.js +2 -4
  117. package/dist/core/asset/asset-placement.js +1 -1
  118. package/dist/core/asset/asset-ref.js +3 -3
  119. package/dist/core/asset/resolve-ref.js +5 -0
  120. package/dist/core/bundle-rename.js +12 -4
  121. package/dist/core/closest-match.js +37 -0
  122. package/dist/core/common.js +37 -57
  123. package/dist/core/config/config-io.js +26 -18
  124. package/dist/core/config/config-schema.js +19 -106
  125. package/dist/core/config/config-sources.js +3 -3
  126. package/dist/core/config/config-types.js +4 -4
  127. package/dist/core/config/config-walker.js +50 -77
  128. package/dist/core/config/config.js +438 -109
  129. package/dist/core/config/convert-engine-references.js +114 -0
  130. package/dist/core/config/convert-engines-shared.js +40 -0
  131. package/dist/core/config/convert-engines.js +300 -0
  132. package/dist/core/config/convert-models-overlay.js +137 -0
  133. package/dist/core/config/credentials.js +304 -0
  134. package/dist/core/config/engine-semantics.js +3 -3
  135. package/dist/core/config/migrate-keys.js +222 -0
  136. package/dist/core/config/model-aliases.js +37 -0
  137. package/dist/core/config/models-file.js +34 -0
  138. package/dist/core/config/retired-engines.js +53 -0
  139. package/dist/core/config/schema/connections.js +41 -0
  140. package/dist/core/config/schema/embedding.js +2 -2
  141. package/dist/core/config/schema/harnesses.js +41 -0
  142. package/dist/core/config/schema/improve-processes.js +9 -28
  143. package/dist/core/config/schema/improve.js +36 -1
  144. package/dist/core/config/schema/index-config.js +18 -20
  145. package/dist/core/config/schema/primitives.js +42 -17
  146. package/dist/core/config/schema/search.js +6 -11
  147. package/dist/core/config/schema/sources-bundles.js +9 -9
  148. package/dist/core/config/schema/workflow.js +2 -6
  149. package/dist/core/config/unusable-entries.js +66 -0
  150. package/dist/core/content-safety.js +3 -6
  151. package/dist/core/endpoint-url.js +47 -0
  152. package/dist/core/env-secret-ref.js +84 -73
  153. package/dist/core/errors.js +10 -16
  154. package/dist/core/extra-params.js +3 -3
  155. package/dist/core/improve-result.js +8 -9
  156. package/dist/core/json-schema.js +1 -1
  157. package/dist/core/lesson-lint.js +1 -1
  158. package/dist/core/llm-inference.js +80 -0
  159. package/dist/core/parse.js +2 -2
  160. package/dist/core/paths.js +33 -10
  161. package/dist/core/recognition-util.js +8 -10
  162. package/dist/core/redaction.js +94 -55
  163. package/dist/core/ref-token.js +82 -0
  164. package/dist/core/secret-value.js +14 -0
  165. package/dist/core/state/migrations.js +17 -22
  166. package/dist/core/structured.js +2 -68
  167. package/dist/core/subprocess.js +63 -22
  168. package/dist/core/type-presentation.js +10 -14
  169. package/dist/core/write-source.js +20 -4
  170. package/dist/execution/input-contract.js +3 -6
  171. package/dist/execution/notices.js +49 -0
  172. package/dist/execution/resolved-request.js +24 -40
  173. package/dist/execution/source.js +21 -45
  174. package/dist/execution/target-ref.js +2 -2
  175. package/dist/indexer/bundle-identity-guard.js +6 -5
  176. package/dist/indexer/ensure-index.js +1 -1
  177. package/dist/indexer/index-writer-lock.js +1 -1
  178. package/dist/indexer/indexer.js +46 -42
  179. package/dist/indexer/installations.js +12 -22
  180. package/dist/indexer/lookup/adapter-concept-owner.js +40 -14
  181. package/dist/indexer/materialize-embeddings.js +20 -16
  182. package/dist/indexer/passes/memory-inference.js +21 -50
  183. package/dist/indexer/passes/metadata.js +5 -5
  184. package/dist/indexer/scan/doc-to-entry.js +1 -1
  185. package/dist/indexer/scan/drain-dir.js +9 -11
  186. package/dist/indexer/search/db-search.js +9 -7
  187. package/dist/indexer/search/search-source.js +42 -22
  188. package/dist/indexer/usage/usage-events.js +2 -3
  189. package/dist/indexer/walk/index-context.js +2 -1
  190. package/dist/indexer/walk/matchers.js +3 -11
  191. package/dist/indexer/walk/path-resolver.js +13 -68
  192. package/dist/indexer/walk/walker.js +32 -26
  193. package/dist/integrations/agent/akm-read-tools.js +81 -0
  194. package/dist/integrations/agent/config.js +1 -1
  195. package/dist/integrations/agent/detect.js +32 -36
  196. package/dist/integrations/agent/execution.js +130 -428
  197. package/dist/integrations/agent/index.js +1 -1
  198. package/dist/integrations/agent/profiles.js +24 -28
  199. package/dist/integrations/agent/prompts.js +17 -30
  200. package/dist/integrations/agent/request-lowering.js +67 -101
  201. package/dist/integrations/agent/resolution.js +332 -0
  202. package/dist/integrations/agent/runner-dispatch.js +156 -181
  203. package/dist/integrations/agent/runner.js +20 -70
  204. package/dist/integrations/agent/runtime-port.js +4 -0
  205. package/dist/integrations/agent/runtime.js +10 -0
  206. package/dist/integrations/agent/spawn.js +65 -190
  207. package/dist/integrations/harnesses/aider/index.js +19 -39
  208. package/dist/integrations/harnesses/amazonq/index.js +17 -32
  209. package/dist/integrations/harnesses/claude/index.js +59 -28
  210. package/dist/integrations/harnesses/claude/session-log.js +7 -5
  211. package/dist/integrations/harnesses/codex/index.js +19 -31
  212. package/dist/integrations/harnesses/copilot/index.js +17 -35
  213. package/dist/integrations/harnesses/gemini/index.js +18 -34
  214. package/dist/integrations/harnesses/harness.js +36 -0
  215. package/dist/integrations/harnesses/index.js +20 -51
  216. package/dist/integrations/harnesses/opencode/agent-builder.js +132 -100
  217. package/dist/integrations/harnesses/opencode/index.js +11 -33
  218. package/dist/integrations/harnesses/opencode/roots.js +50 -0
  219. package/dist/integrations/harnesses/opencode/runtime/binary.js +206 -0
  220. package/dist/integrations/harnesses/opencode/runtime/command.js +152 -0
  221. package/dist/integrations/harnesses/opencode/runtime/index.js +177 -0
  222. package/dist/integrations/harnesses/opencode/runtime/tar.js +107 -0
  223. package/dist/integrations/harnesses/opencode/session-log-v1.js +15 -7
  224. package/dist/integrations/harnesses/opencode/session-log-v2.js +72 -48
  225. package/dist/integrations/harnesses/opencode/session-log.js +58 -137
  226. package/dist/integrations/harnesses/opencode/version.js +34 -53
  227. package/dist/integrations/harnesses/openhands/index.js +13 -37
  228. package/dist/integrations/harnesses/pi/index.js +21 -32
  229. package/dist/integrations/lockfile.js +1 -1
  230. package/dist/integrations/session-logs/index.js +11 -31
  231. package/dist/llm/client.js +93 -111
  232. package/dist/llm/embedder.js +19 -34
  233. package/dist/llm/embedders/connection.js +31 -0
  234. package/dist/llm/embedders/local-model-files.js +56 -0
  235. package/dist/llm/embedders/local.js +146 -115
  236. package/dist/llm/embedders/remote.js +26 -23
  237. package/dist/llm/embedders/types.js +1 -1
  238. package/dist/llm/index-passes.js +33 -39
  239. package/dist/llm/memory-infer.js +67 -77
  240. package/dist/llm/model-list.js +35 -0
  241. package/dist/llm/rerank-client.js +8 -14
  242. package/dist/llm/structured-call.js +45 -99
  243. package/dist/llm/structured.js +60 -0
  244. package/dist/output/renderers.js +2 -8
  245. package/dist/output/shapes/helpers.js +18 -44
  246. package/dist/output/shapes/passthrough.js +1 -0
  247. package/dist/output/shapes.js +1 -7
  248. package/dist/output/text/command-format.js +41 -39
  249. package/dist/output/text/health-format.js +8 -2
  250. package/dist/output/text/helpers.js +1 -1
  251. package/dist/output/text/migrate.js +12 -0
  252. package/dist/output/text/models.js +3 -2
  253. package/dist/output/text/registry-commands.js +1 -2
  254. package/dist/output/text/show-directives.js +16 -28
  255. package/dist/output/text/show-format.js +0 -2
  256. package/dist/output/text/targets-table.js +70 -0
  257. package/dist/output/text/workflow-format.js +44 -15
  258. package/dist/output/text.js +1 -1
  259. package/dist/registry/providers/skills-sh.js +1 -28
  260. package/dist/registry/providers/static-index.js +1 -71
  261. package/dist/runtime.js +6 -2
  262. package/dist/scripts/akm-migrate-node.js +47095 -44905
  263. package/dist/scripts/akm-migrate.js +46946 -44755
  264. package/dist/setup/detect.js +28 -273
  265. package/dist/setup/endpoint.js +36 -0
  266. package/dist/setup/semantic-assets.js +13 -19
  267. package/dist/setup/setup-flags.js +77 -0
  268. package/dist/setup/setup-plan.js +144 -0
  269. package/dist/setup/setup.js +134 -358
  270. package/dist/setup/steps/connection-shared.js +49 -101
  271. package/dist/setup/steps/connection.js +121 -524
  272. package/dist/setup/steps/embeddings.js +151 -0
  273. package/dist/setup/steps/harnesses.js +118 -0
  274. package/dist/setup/steps/platforms.js +2 -81
  275. package/dist/setup/steps/tasks.js +1 -2
  276. package/dist/setup/steps.js +10 -0
  277. package/dist/setup/summary.js +67 -0
  278. package/dist/sources/freshness.js +16 -21
  279. package/dist/sources/providers/git-provider.js +2 -9
  280. package/dist/sources/providers/provider-utils.js +13 -5
  281. package/dist/sources/resolve.js +12 -16
  282. package/dist/sources/snapshot-fetchers/robots.js +11 -12
  283. package/dist/sources/snapshot-fetchers/secret-seam.js +2 -4
  284. package/dist/sources/snapshot-fetchers/website-ingest.js +8 -15
  285. package/dist/sources/snapshot-fetchers/x.js +1 -1
  286. package/dist/standalone/onnxruntime-library.js +52 -0
  287. package/dist/storage/repositories/improve-ledger-repository.js +1 -1
  288. package/dist/storage/repositories/improve-runs-repository.js +0 -13
  289. package/dist/storage/repositories/index-entries-repository.js +2 -2
  290. package/dist/storage/repositories/proposals-repository.js +2 -2
  291. package/dist/storage/repositories/task-history-repository.js +2 -2
  292. package/dist/storage/repositories/workflow-runs-repository.js +44 -129
  293. package/dist/storage/sqlite-read-snapshot.js +33 -29
  294. package/dist/tasks/embedded.js +1 -1
  295. package/dist/tasks/log-redaction.js +7 -119
  296. package/dist/tasks/prepare/prepare-support.js +8 -7
  297. package/dist/tasks/prepare/prepare.js +8 -9
  298. package/dist/tasks/prepare/script-capture.js +9 -25
  299. package/dist/tasks/run/attempt-lifecycle.js +17 -35
  300. package/dist/tasks/run/load-task.js +54 -27
  301. package/dist/tasks/run/run-command-task.js +15 -10
  302. package/dist/tasks/run/run-native-task.js +8 -21
  303. package/dist/tasks/run/run-task.js +5 -8
  304. package/dist/tasks/run/run-workflow-task.js +14 -21
  305. package/dist/tasks/run/task-history.js +9 -17
  306. package/dist/tasks/run/task-log.js +1 -5
  307. package/dist/tasks/scheduler-invocation.js +13 -18
  308. package/dist/tasks/scheduler-sync.js +0 -1
  309. package/dist/tasks/source/bounded-document.js +31 -117
  310. package/dist/tasks/source/parse-task-source.js +0 -1
  311. package/dist/tasks/source/project-v4.js +5 -3
  312. package/dist/tasks/source/task-input-diagnostics.js +3 -4
  313. package/dist/tasks/source/task-source-v4.js +48 -72
  314. package/dist/tasks/source-v3.js +2 -5
  315. package/dist/tasks/task-run-reserved-flags.js +1 -2
  316. package/dist/workflows/authoring/authoring.js +2 -7
  317. package/dist/workflows/compile.js +1 -15
  318. package/dist/workflows/concurrency-policy.js +4 -4
  319. package/dist/workflows/exec/child-workflow.js +1 -4
  320. package/dist/workflows/exec/dispatch-redaction.js +35 -86
  321. package/dist/workflows/exec/environment.js +13 -77
  322. package/dist/workflows/exec/exec-unit.js +14 -55
  323. package/dist/workflows/exec/frozen-judge.js +26 -28
  324. package/dist/workflows/exec/native-executor.js +126 -71
  325. package/dist/workflows/exec/run-workflow.js +38 -42
  326. package/dist/workflows/exec/step-work.js +13 -17
  327. package/dist/workflows/exec/unit-dispatch.js +7 -21
  328. package/dist/workflows/freeze/environment.js +14 -119
  329. package/dist/workflows/freeze/freeze.js +14 -33
  330. package/dist/workflows/freeze/step-values.js +6 -13
  331. package/dist/workflows/freeze/targets/child-workflow.js +3 -5
  332. package/dist/workflows/freeze/targets/command.js +9 -15
  333. package/dist/workflows/freeze/targets/shell.js +0 -3
  334. package/dist/workflows/freeze/task-bindings.js +0 -1
  335. package/dist/workflows/parser.js +50 -59
  336. package/dist/workflows/plan.js +8 -2
  337. package/dist/workflows/renderer.js +83 -9
  338. package/dist/workflows/resource-limits.js +2 -2
  339. package/dist/workflows/runtime/run-plan.js +38 -23
  340. package/dist/workflows/runtime/runs.js +55 -93
  341. package/dist/workflows/runtime/workflow-asset-loader.js +55 -86
  342. package/dist/workflows/source-files.js +7 -19
  343. package/docs/README.md +10 -16
  344. package/docs/architecture/README.md +2 -37
  345. package/docs/architecture/adapters.md +2 -2
  346. package/docs/architecture/akm-core-principles.md +256 -118
  347. package/docs/architecture/architecture.md +283 -99
  348. package/docs/architecture/improvement.md +8 -2
  349. package/docs/architecture/internals/classification.md +1 -3
  350. package/docs/architecture/internals/fresh-host-rebuild-runbook.md +7 -6
  351. package/docs/architecture/internals/health-advisories.md +35 -74
  352. package/docs/architecture/internals/improve-workflow.md +27 -26
  353. package/docs/architecture/internals/indexing.md +3 -3
  354. package/docs/architecture/internals/storage-locations.md +48 -15
  355. package/docs/architecture/persisted-data-compat.md +10 -6
  356. package/docs/architecture/specs/okf-support.md +9 -11
  357. package/docs/architecture/specs/ref.md +7 -9
  358. package/docs/architecture/testing/testing-workflow.md +172 -52
  359. package/docs/architecture/workflow-engine.md +51 -34
  360. package/docs/guides/README.md +0 -1
  361. package/docs/guides/author-bundles.md +15 -20
  362. package/docs/guides/author-workflows.md +93 -71
  363. package/docs/guides/bundles.md +20 -16
  364. package/docs/guides/discover-and-load.md +1 -1
  365. package/docs/guides/getting-started.md +49 -3
  366. package/docs/guides/improve-the-library.md +10 -4
  367. package/docs/guides/recipes/headless-install.md +11 -16
  368. package/docs/guides/run-workflows.md +29 -20
  369. package/docs/guides/scheduling.md +2 -2
  370. package/docs/guides/use-with-any-agent.md +20 -22
  371. package/docs/integration/bundling-akm.md +19 -9
  372. package/docs/maintainers/README.md +2 -6
  373. package/docs/maintainers/release-checklist.md +73 -126
  374. package/docs/migration/README.md +10 -3
  375. package/docs/migration/release-notes/0.10.0.md +81 -16
  376. package/docs/migration/release-notes/0.6.0.md +1 -1
  377. package/docs/migration/release-notes/0.7.0.md +1 -1
  378. package/docs/migration/release-notes/0.9.0.md +1 -1
  379. package/docs/migration/release-notes/README.md +1 -1
  380. package/docs/migration/v0.9-to-v0.10.md +300 -60
  381. package/docs/migration/v0.9.1-to-v0.9.2.md +6 -5
  382. package/docs/posts/config-v2-lessons-16.md +1 -1
  383. package/docs/posts/llm-mode-reflect-13.md +1 -1
  384. package/docs/posts/release-0.6.0.md +11 -11
  385. package/docs/posts/release-0.8.0.md +4 -4
  386. package/docs/posts/workflows-vaults-09.md +1 -1
  387. package/docs/reference/README.md +1 -1
  388. package/docs/reference/asset-types.md +2 -2
  389. package/docs/reference/cli.md +477 -388
  390. package/docs/reference/configuration.md +569 -550
  391. package/docs/reference/data-and-telemetry.md +9 -6
  392. package/docs/reference/env-and-secrets.md +72 -15
  393. package/docs/reference/refs.md +3 -20
  394. package/docs/reference/registry.md +12 -38
  395. package/docs/reference/supported-formats.md +1 -1
  396. package/docs/reference/tasks.md +22 -11
  397. package/docs/reference/ui-api.md +14 -9
  398. package/docs/reference/workflow-schema.md +199 -154
  399. package/docs/reference/workflows.md +4 -6
  400. package/package.json +9 -11
  401. package/schemas/akm-config.json +1696 -2922
  402. package/schemas/akm-task.json +4 -4
  403. package/schemas/akm-workflow.json +36 -9
  404. package/ROADMAP.md +0 -112
  405. package/dist/assets/models.json +0 -35
  406. package/dist/commands/health/engine-usage.js +0 -45
  407. package/dist/commands/sources/dangerous-env-audit.js +0 -134
  408. package/dist/core/activation-policy.js +0 -67
  409. package/dist/core/config/schema/engines.js +0 -160
  410. package/dist/core/config/schema/execution.js +0 -23
  411. package/dist/core/spawn-env.js +0 -268
  412. package/dist/execution/directory-identity.js +0 -78
  413. package/dist/integrations/agent/builder-shared.js +0 -33
  414. package/dist/integrations/agent/builders.js +0 -43
  415. package/dist/integrations/agent/engine-fallback.js +0 -59
  416. package/dist/integrations/agent/engine-resolution.js +0 -333
  417. package/dist/integrations/agent/model-map.js +0 -475
  418. package/dist/integrations/harnesses/aider/agent-builder.js +0 -107
  419. package/dist/integrations/harnesses/aider/result-extractor.js +0 -53
  420. package/dist/integrations/harnesses/amazonq/agent-builder.js +0 -138
  421. package/dist/integrations/harnesses/amazonq/result-extractor.js +0 -48
  422. package/dist/integrations/harnesses/claude/agent-builder.js +0 -106
  423. package/dist/integrations/harnesses/claude/config-import.js +0 -67
  424. package/dist/integrations/harnesses/claude/result-extractor.js +0 -67
  425. package/dist/integrations/harnesses/codex/agent-builder.js +0 -150
  426. package/dist/integrations/harnesses/codex/result-extractor.js +0 -110
  427. package/dist/integrations/harnesses/copilot/agent-builder.js +0 -117
  428. package/dist/integrations/harnesses/copilot/result-extractor.js +0 -178
  429. package/dist/integrations/harnesses/gemini/agent-builder.js +0 -114
  430. package/dist/integrations/harnesses/gemini/result-extractor.js +0 -149
  431. package/dist/integrations/harnesses/opencode/config-import.js +0 -149
  432. package/dist/integrations/harnesses/opencode/model-config.js +0 -33
  433. package/dist/integrations/harnesses/opencode/model-work-agent.js +0 -115
  434. package/dist/integrations/harnesses/opencode/session-log-types.js +0 -12
  435. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -44
  436. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +0 -1052
  437. package/dist/integrations/harnesses/opencode-sdk/v1-adapter.js +0 -199
  438. package/dist/integrations/harnesses/opencode-sdk/v2-adapter.js +0 -254
  439. package/dist/integrations/harnesses/opencode-sdk/wire.js +0 -66
  440. package/dist/integrations/harnesses/openhands/agent-builder.js +0 -120
  441. package/dist/integrations/harnesses/openhands/result-extractor.js +0 -135
  442. package/dist/integrations/harnesses/pi/agent-builder.js +0 -89
  443. package/dist/integrations/harnesses/pi/result-extractor.js +0 -168
  444. package/dist/integrations/harnesses/shared.js +0 -18
  445. package/dist/integrations/harnesses/types.js +0 -55
  446. package/dist/llm/feature-gate.js +0 -115
  447. package/dist/output/shapes/models-list.js +0 -16
  448. package/dist/output/shapes/registry-search.js +0 -10
  449. package/dist/setup/detected-engines.js +0 -136
  450. package/dist/setup/engine-config.js +0 -97
  451. package/dist/setup/harness-config-import.js +0 -47
  452. package/dist/setup/providers.js +0 -14
  453. package/dist/setup/steps/semantic.js +0 -39
  454. package/dist/workflows/authoring/scope-key.js +0 -79
  455. package/dist/workflows/exec/lowering-notices.js +0 -23
  456. package/dist/workflows/source-semantics.js +0 -110
  457. package/docs/architecture/0.10-process-rules.md +0 -832
  458. package/docs/architecture/akm-architecture-decision-history.md +0 -2055
  459. package/docs/architecture/comparisons/claude-code-vs-akm-workflows-full.md +0 -550
  460. package/docs/architecture/decisions/0001-no-interpolation-attached-structured-context.md +0 -72
  461. package/docs/architecture/decisions/0002-unit-reuse-and-input-hash-scope.md +0 -142
  462. package/docs/architecture/decisions/0003-child-env-allowlist-and-provenance.md +0 -189
  463. package/docs/architecture/decisions/0004-task-input-contract-and-flag-coercion.md +0 -97
  464. package/docs/architecture/decisions/0005-task-result-vocabulary-and-legacy-read-mapping.md +0 -108
  465. package/docs/architecture/decisions/0006-task-source-version-routing.md +0 -124
  466. package/docs/architecture/decisions/0007-workflow-composition-bounds.md +0 -83
  467. package/docs/architecture/decisions/0008-task-binding-normalization.md +0 -88
  468. package/docs/architecture/decisions/0009-child-run-publication-column-parity.md +0 -80
  469. package/docs/architecture/decisions/0010-driver-protocol-cut.md +0 -36
  470. package/docs/architecture/decisions/0011-engine-run-loop-invariants.md +0 -125
  471. package/docs/architecture/decisions/README.md +0 -62
  472. package/docs/architecture/internals/functional-contract-patterns.md +0 -340
  473. package/docs/architecture/internals/registry-network-boundary.md +0 -57
  474. package/docs/architecture/internals/search.md +0 -248
  475. package/docs/architecture/reviews/env-secret-access.md +0 -319
  476. package/docs/architecture/runtime-boundary-design.md +0 -153
  477. package/docs/architecture/specs/0.9.0-close-out-plan.md +0 -361
  478. package/docs/architecture/specs/0.9.0-decisions.md +0 -532
  479. package/docs/architecture/specs/0.9.0-docs-code-drift-register.md +0 -745
  480. package/docs/architecture/specs/0.9.0-open-items-register.md +0 -135
  481. package/docs/architecture/specs/0.9.0-public-api-issue-backlog.md +0 -740
  482. package/docs/architecture/specs/0.9.0-release-surface-review.md +0 -636
  483. package/docs/architecture/specs/agent-command-engine-model-design.md +0 -513
  484. package/docs/architecture/specs/akm-0.9.0-bundle-adapter-spec.md +0 -501
  485. package/docs/architecture/specs/akm-0.9.0-ref-grammar-decision.md +0 -291
  486. package/docs/architecture/specs/akm-format-neutral-bundle-workspace-spec.md +0 -2059
  487. package/docs/architecture/specs/di-seams-plan.md +0 -539
  488. package/docs/architecture/specs/driver-protocol-keep-or-cut.md +0 -275
  489. package/docs/architecture/specs/fact-asset-type.md +0 -142
  490. package/docs/architecture/specs/improve-collapse-churn-detector-design.md +0 -634
  491. package/docs/architecture/specs/reviews/task-workflow-unification/README.md +0 -72
  492. package/docs/architecture/specs/reviews/task-workflow-unification/findings-consolidated.md +0 -152
  493. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-alternatives.md +0 -352
  494. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-bunqueue.md +0 -300
  495. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-openworkflow.md +0 -402
  496. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-1.md +0 -758
  497. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-2.md +0 -645
  498. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-3.md +0 -602
  499. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-adversarial.md +0 -27
  500. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-architecture.md +0 -27
  501. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-coverage.md +0 -74
  502. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-security.md +0 -15
  503. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-adversarial.md +0 -132
  504. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-verification.md +0 -147
  505. package/docs/architecture/specs/stash-conventions-code-spec.md +0 -275
  506. package/docs/architecture/specs/stash-organization-conventions.md +0 -377
  507. package/docs/architecture/specs/task-workflow-format-unification.md +0 -721
  508. package/docs/architecture/specs/workflow-engine-buy-vs-build.md +0 -231
  509. package/docs/architecture/specs/workflow-format-unification.md +0 -432
  510. package/docs/architecture/testing/manual-testing-checklist.md +0 -3411
  511. package/docs/architecture/testing/okf-v0.2-conformance-runbook.md +0 -924
  512. package/docs/architecture/testing/task-workflow-manual-tests.md +0 -1720
  513. package/docs/guides/claude-code-vs-akm-workflows.md +0 -29
  514. package/docs/guides/knowledge-management.md +0 -18
  515. package/docs/maintainers/curate-workmap.md +0 -335
  516. package/docs/migration/v0.5-to-v0.6.md +0 -759
  517. package/docs/migration/v0.7-to-v0.8.md +0 -1378
  518. package/docs/plans/0.9.2-agent-command-workflow-plan.md +0 -423
@@ -7,7 +7,7 @@
7
7
  * `finalizeImproveResult` persists on a live run (`improve-usage-report.ts`),
8
8
  * so the command and the end-of-run stderr table stay byte-identical in
9
9
  * structure. A row with no persisted `usageReport` degrades rather than
10
- * errors, per AGENTS.md's "reader must tolerate data older releases wrote":
10
+ * errors (a reader must tolerate data older releases wrote):
11
11
  * its cross-tab is recomputed from the run's own `llm_usage` events and a
12
12
  * `notes` entry explains why — either the row predates #944, or (per
13
13
  * `recordTerminatedImproveRun` in improve-result-file.ts) the run was
@@ -4,12 +4,12 @@
4
4
  import consolidate from "../../assets/improve-strategies/consolidate.json" with { type: "json" };
5
5
  import defaultStrategy from "../../assets/improve-strategies/default.json" with { type: "json" };
6
6
  import { conceptIdFromTypeName, parseRefInput } from "../../core/asset/resolve-ref.js";
7
+ import { ambiguousDefaultAdvice, } from "../../core/config/config.js";
7
8
  import { ImproveProfileConfigSchema } from "../../core/config/config-schema.js";
8
9
  import { deepMergeConfig } from "../../core/config/deep-merge.js";
9
10
  import { BUILTIN_IMPROVE_STRATEGY_NAMES, IMPROVE_ENGINE_PROCESSES, IMPROVE_PROCESS_NAMES, REMOVED_IMPROVE_STRATEGY_NAMES, } from "../../core/config/engine-semantics.js";
11
+ import { SHIPPED_ALIAS } from "../../core/config/model-aliases.js";
10
12
  import { ConfigError } from "../../core/errors.js";
11
- import { describeLlmCredentialAvailability, } from "../../integrations/agent/engine-resolution.js";
12
- import { runnerLlmConnection } from "../../integrations/agent/runner.js";
13
13
  import { applyAutonomyGate } from "./autonomy-gate.js";
14
14
  import { resolveImproveExecution } from "./execution.js";
15
15
  import { stripBundle } from "./ledger.js";
@@ -70,7 +70,7 @@ if (BUILTIN_IMPROVE_STRATEGY_NAMES.some((name) => !(name in BUILTIN_STRATEGIES))
70
70
  throw new Error("Built-in improve strategy names are out of sync with their assets");
71
71
  }
72
72
  export function resolveImproveStrategy(name, config) {
73
- const selectedName = name ?? config.defaults?.improveStrategy ?? "default";
73
+ const selectedName = name ?? config.improve?.strategy ?? "default";
74
74
  const userStrategies = config.improve?.strategies ?? {};
75
75
  // graph-refresh named a specific, common retirement — refuse it
76
76
  // unconditionally, even when `improve.strategies["graph-refresh"]` still
@@ -111,16 +111,15 @@ export function resolveImproveStrategy(name, config) {
111
111
  }
112
112
  /**
113
113
  * The processes that make their own model calls, so the plan resolves a runner
114
- * for each: every engine process but triage, whose engine is its judgment's.
114
+ * for each: every process that makes a model call but triage, whose connection or harness is its judgment's.
115
115
  */
116
116
  export const MODEL_CALLING_PROCESSES = new Set(IMPROVE_ENGINE_PROCESSES.filter((name) => name !== "triage"));
117
117
  /**
118
118
  * Project a resolved improve plan into one routing row per
119
119
  * {@link IMPROVE_PROCESS_NAMES} name, plus a `"triage.judgment"`
120
- * pseudo-row when the strategy configures a judgment engine. Pure — no I/O,
120
+ * pseudo-row when the strategy configures a judgment connection or harness. Pure — no I/O,
121
121
  * no re-resolution. Shared by `improve --dry-run`'s `plan.processes` (#947)
122
- * and `akm health`'s post-run reporting (#944); health's own
123
- * `active-improve-strategy` check keeps its existing `engines` shape.
122
+ * and `akm health`'s post-run reporting (#944).
124
123
  */
125
124
  export function projectResolvedProcessRouting(plan) {
126
125
  const unavailableByProcess = new Map(plan.engineUnavailable.map((item) => [item.process, item]));
@@ -133,20 +132,11 @@ export function projectResolvedProcessRouting(plan) {
133
132
  enabled: process.enabled,
134
133
  ...(process.runner
135
134
  ? {
136
- engine: process.runner.engine,
137
- model: runnerLlmConnection(process.runner)?.model,
135
+ engine: process.runner.name,
136
+ ...(process.runner.model !== undefined ? { model: process.runner.model } : {}),
138
137
  engineKind: process.runner.kind,
139
138
  }
140
- : // #800/#957 round 3 — a credential-unavailable process never carries a
141
- // runner, but its structurally resolved engine/model is still worth
142
- // showing in the routing table (dry-run preview, health probe).
143
- unavailable?.engine
144
- ? {
145
- engine: unavailable.engine,
146
- ...(unavailable.model ? { model: unavailable.model } : {}),
147
- engineKind: "llm",
148
- }
149
- : {}),
139
+ : {}),
150
140
  notices: process.notices ?? [],
151
141
  ...(unavailable ? { unavailable: { configKey: unavailable.configKey, reason: unavailable.reason } } : {}),
152
142
  });
@@ -158,9 +148,9 @@ export function projectResolvedProcessRouting(plan) {
158
148
  enabled: plan.triageJudgment !== null,
159
149
  ...(plan.triageJudgment
160
150
  ? {
161
- engine: plan.triageJudgment.engine,
151
+ engine: plan.triageJudgment.name,
162
152
  engineKind: plan.triageJudgment.kind,
163
- ...(plan.triageJudgment.kind === "llm" ? { model: plan.triageJudgment.connection.model } : {}),
153
+ ...(plan.triageJudgment.model !== undefined ? { model: plan.triageJudgment.model } : {}),
164
154
  }
165
155
  : {}),
166
156
  notices: plan.triageJudgmentNotices ?? [],
@@ -193,39 +183,9 @@ export function resolveImprovePlan(name, config, options = {}) {
193
183
  const strategy = { name: selected.name, config: gatedStrategyConfig };
194
184
  return { ...buildImprovePlan(strategy, config, options), autonomyGated: gated };
195
185
  }
196
- /** Describe why a resolved-but-uncredentialed runner belongs in `engineUnavailable` (#957). */
197
- function credentialUnavailableReason(engineName, status) {
198
- return `requires a credential that is not available in this process's environment (engine "${engineName}": ${status.reason})`;
199
- }
200
- /**
201
- * Whether the credential akm reads for `runner` is reachable in `env`: an LLM
202
- * engine's own, or an SDK engine's LLM fallback. An agent CLI reads its own.
203
- */
204
- function runnerCredentialStatus(runner, env) {
205
- if (runner.kind === "llm")
206
- return describeLlmCredentialAvailability(runner, env);
207
- if (runner.kind === "sdk") {
208
- return describeLlmCredentialAvailability({
209
- credential: runner.fallbackCredential,
210
- apiKeyFile: runner.fallbackApiKeyFile,
211
- apiKeySecretRef: runner.fallbackApiKeySecretRef,
212
- }, env);
213
- }
214
- return { available: true };
215
- }
216
186
  function buildImprovePlan(strategy, config, options) {
217
- const env = options.env ?? process.env;
218
187
  const processes = {};
219
188
  const engineUnavailable = [];
220
- // #957 round 2 — distinguishes "credential unavailable" (a working engine
221
- // whose secret isn't in this environment) from "no engine selected at all"
222
- // among the pushes below, so `allowAllDisabled` can bypass the ConfigError
223
- // only for the former. The latter is the guard's original, pre-#957
224
- // condition and must keep hard-aborting for every caller, including a
225
- // health probe with `allowAllDisabled` set — a totally unconfigured
226
- // install is not the credential-in-the-wrong-environment case this option
227
- // exists for.
228
- let anyEngineNotConfigured = false;
229
189
  for (const processName of IMPROVE_PROCESS_NAMES) {
230
190
  const sourceProcessConfig = strategy.config.processes?.[processName] ?? {};
231
191
  const enabled = sourceProcessConfig.enabled === true;
@@ -238,49 +198,22 @@ function buildImprovePlan(strategy, config, options) {
238
198
  // Validation itself is structural and always runs. Only its optional repair
239
199
  // step needs a model, so disabling repair must not create an LLM preflight.
240
200
  const skipsRepairEngine = processName === "validation" && options.repairValidationFailures === false;
241
- // #957: a resolved-but-uncredentialed runner is folded into the same
242
- // "no engine" branch below — set here so the shared push/continue block
243
- // can tell the two apart in its reason text.
244
- let credentialUnavailableMessage;
245
- // #800/#957 round 3 — the structurally resolved engine/model/contextLength
246
- // for the credential-unavailable case only, so a dry-run preview can read
247
- // what resolution decided (e.g. the consolidation chunk-size estimate)
248
- // without the runner ever carrying a credential-less connection forward.
249
- let credentialUnavailableRouting;
250
201
  if (!skipsRepairEngine) {
251
202
  const resolved = resolveImproveExecution({
252
203
  config,
253
- profile: strategy.config,
254
- process: sourceProcessConfig,
255
204
  processName,
205
+ alias: SHIPPED_ALIAS.improve,
206
+ ...(options.run ? { run: options.run } : {}),
256
207
  });
257
208
  runner = resolved?.runner ?? null;
258
209
  notices = resolved?.notices ?? [];
259
- if (runner) {
260
- const credentialStatus = runnerCredentialStatus(runner, env);
261
- if (!credentialStatus.available) {
262
- const connection = runnerLlmConnection(runner);
263
- credentialUnavailableMessage = credentialUnavailableReason(runner.engine, credentialStatus);
264
- credentialUnavailableRouting = {
265
- engine: runner.engine,
266
- ...(connection?.model !== undefined ? { model: connection.model } : {}),
267
- ...(connection?.contextLength !== undefined ? { contextLength: connection.contextLength } : {}),
268
- };
269
- runner = null;
270
- notices = [];
271
- }
272
- }
273
210
  }
274
211
  if (!runner && !skipsRepairEngine) {
275
- const configKey = `improve.strategies.${strategy.name}.processes.${processName}.engine`;
276
- if (!credentialUnavailableMessage)
277
- anyEngineNotConfigured = true;
212
+ const configKey = `improve.processes.${processName}.connection`;
278
213
  engineUnavailable.push({
279
214
  process: processName,
280
215
  configKey,
281
- reason: credentialUnavailableMessage ??
282
- `requires an engine that is not configured. Set defaults.llmEngine or ${configKey}`,
283
- ...credentialUnavailableRouting,
216
+ reason: `requires a connection or harness that is not configured. Run \`akm setup\`, or set ${configKey}`,
284
217
  });
285
218
  processes[processName] = Object.freeze({
286
219
  enabled: false,
@@ -299,43 +232,26 @@ function buildImprovePlan(strategy, config, options) {
299
232
  });
300
233
  }
301
234
  if (engineUnavailable.length > 0 &&
302
- // proactiveMaintenance uses no engine: it is a selector, so it alone does not keep a run alive.
303
- !IMPROVE_ENGINE_PROCESSES.some((name) => processes[name].enabled) &&
304
- (!options.allowAllDisabled || anyEngineNotConfigured)) {
235
+ // Triage without its judgment and proactiveMaintenance make no model call: they alone do not keep a run alive.
236
+ ![...MODEL_CALLING_PROCESSES].some((name) => processes[name].enabled)) {
305
237
  const names = engineUnavailable.map((item) => `"${item.process}"`).join(", ");
306
- throw new ConfigError(`No improve process can run: ${names} ${engineUnavailable.length === 1 ? "requires" : "require"} an engine that is not configured. Set defaults.llmEngine, or the per-process engine key named for each.`, "LLM_NOT_CONFIGURED");
238
+ const ambiguous = ambiguousDefaultAdvice(config);
239
+ throw new ConfigError(`No improve process can run: ${names} ${engineUnavailable.length === 1 ? "requires" : "require"} a connection or harness that ${ambiguous ? "has no default to run on" : "is not configured"}. ${ambiguous ? `${ambiguous}.` : "Run `akm setup`, or set improve.connection or improve.harness."}`, "LLM_NOT_CONFIGURED");
307
240
  }
308
241
  const triage = strategy.config.processes?.triage;
309
242
  const judgmentEnabled = triage?.judgment?.enabled === true;
310
243
  const triageJudgmentResolution = processes.triage.enabled && judgmentEnabled
311
244
  ? resolveImproveExecution({
312
245
  config,
313
- profile: strategy.config,
314
- process: triage,
315
- current: triage.judgment,
246
+ process: "triage",
316
247
  processName: "triage-judgment",
248
+ alias: SHIPPED_ALIAS.judge,
249
+ ...(options.run ? { run: options.run } : {}),
317
250
  })
318
251
  : null;
319
- let triageJudgment = triageJudgmentResolution?.runner ?? null;
252
+ const triageJudgment = triageJudgmentResolution?.runner ?? null;
320
253
  if (processes.triage.enabled && judgmentEnabled && !triageJudgment) {
321
- throw new ConfigError(`Enabled improve triage judgment requires an engine. Set defaults.llmEngine or improve.strategies.${strategy.name}.processes.triage.judgment.engine.`, "LLM_NOT_CONFIGURED");
322
- }
323
- // #957: same credential-unavailable treatment as the main per-process loop
324
- // above — a triage judgment engine that resolves structurally but whose
325
- // credential (or, for an SDK judgment, its LLM fallback credential) is
326
- // unavailable in this process's environment is folded into
327
- // `engineUnavailable` under the reserved `"triage.judgment"` process name
328
- // instead of silently reaching dispatch with a doomed credential.
329
- if (triageJudgment) {
330
- const credentialStatus = runnerCredentialStatus(triageJudgment, env);
331
- if (!credentialStatus.available) {
332
- engineUnavailable.push({
333
- process: "triage.judgment",
334
- configKey: `improve.strategies.${strategy.name}.processes.triage.judgment.engine`,
335
- reason: credentialUnavailableReason(triageJudgment.engine, credentialStatus),
336
- });
337
- triageJudgment = null;
338
- }
254
+ throw new ConfigError(`Enabled improve triage judgment requires a connection or harness. Run \`akm setup\`, or set improve.connection or improve.processes.triage.connection.`, "LLM_NOT_CONFIGURED");
339
255
  }
340
256
  const frozenProcesses = Object.freeze(processes);
341
257
  const frozenStrategy = Object.freeze({
@@ -350,6 +266,7 @@ function buildImprovePlan(strategy, config, options) {
350
266
  strategy: frozenStrategy,
351
267
  processes: frozenProcesses,
352
268
  triageJudgment: triageJudgment ? cloneAndFreeze(triageJudgment) : null,
269
+ ...(options.run ? { run: cloneAndFreeze(options.run) } : {}),
353
270
  ...(triageJudgmentResolution?.notices.length
354
271
  ? { triageJudgmentNotices: cloneAndFreeze(triageJudgmentResolution.notices) }
355
272
  : {}),
@@ -10,6 +10,7 @@ import fs from "node:fs";
10
10
  import path from "node:path";
11
11
  import { parseRefInput } from "../../core/asset/resolve-ref.js";
12
12
  import { bundlesToSourceEntries, loadConfig } from "../../core/config/config.js";
13
+ import { collectCredentialValues } from "../../core/config/credentials.js";
13
14
  import { ConfigError, rethrowIfTestIsolationError, UsageError } from "../../core/errors.js";
14
15
  import { appendEvent } from "../../core/events.js";
15
16
  import { classifyImproveAction, foldDistillSkipped } from "../../core/improve-types.js";
@@ -20,12 +21,12 @@ import { openStateDatabase } from "../../core/state-db.js";
20
21
  import { info, warn, warnVerbose } from "../../core/warn.js";
21
22
  import { beginWriteProvenance, relativeWrittenPath } from "../../core/write-provenance.js";
22
23
  import { resolveWorkingStashTarget, resolveWritable, resolveWriteTarget } from "../../core/write-source.js";
24
+ import { noticeSet } from "../../execution/notices.js";
23
25
  import { ensureIndex } from "../../indexer/ensure-index.js";
24
26
  import { indexWrittenAssets } from "../../indexer/index-written-assets.js";
25
27
  import { akmIndex } from "../../indexer/indexer.js";
26
28
  import { countPendingMemoriesNeedingDecision } from "../../indexer/passes/memory-inference.js";
27
29
  import { resolveEntryContentDir, resolveSourceEntries } from "../../indexer/search/search-source.js";
28
- import { collectEngineCredentialValues } from "../../integrations/agent/engine-resolution.js";
29
30
  import { installLlmUsagePersistence } from "../../llm/usage-persist.js";
30
31
  import { withLlmStage } from "../../llm/usage-telemetry.js";
31
32
  import { GitStashPushError, isGitBackedStash, listGitChangedPaths, resolveWritableOverride, saveGitStash, } from "../../sources/providers/git.js";
@@ -47,7 +48,7 @@ import { analyzeMemoryCleanup, purgeGracedArchive, RETIRE_GRACE_DAYS, } from "./
47
48
  import { buildImproveExecutionPlan } from "./planner.js";
48
49
  import { CONSOLIDATION_CONFIG_KEYS, pickDefined, recordImproveSkip, runImprovePreparationStage } from "./preparation.js";
49
50
  import { akmReflect } from "./reflect.js";
50
- import { errMessage, noticeSet } from "./stage.js";
51
+ import { errMessage } from "./stage.js";
51
52
  export { runImproveMaintenancePasses } from "./loop-stages.js";
52
53
  export function renderSyncCommitMessage(template, result, nowMs) {
53
54
  const iso = new Date(nowMs).toISOString();
@@ -65,7 +66,7 @@ export function renderSyncCommitMessage(template, result, nowMs) {
65
66
  return template.replace(/\{(\w+)\}/g, (match, key) => tokens[key] ?? match);
66
67
  }
67
68
  /**
68
- * How long the loop waits for its first engine response before printing one
69
+ * How long the loop waits for its first model response before printing one
69
70
  * "still waiting" line (#957): a dead endpoint otherwise looks like a slow run.
70
71
  * Armed when the loop starts, not at run start.
71
72
  */
@@ -109,7 +110,7 @@ export async function akmImprove(options = {}) {
109
110
  const { budgetMs, budgetAbortController, scope, selectedStrategy, syncRepoDir, resolvedStateDbPath } = setup;
110
111
  let clearBudgetTimer = () => { };
111
112
  let clearFirstResponseHeartbeat = () => { };
112
- // Set by the usage sink when any engine call terminates, prepass included.
113
+ // Set by the usage sink when any model call terminates, prepass included.
113
114
  let firstEngineResponseSeen = false;
114
115
  let initialGitPaths = new Set();
115
116
  let preRunSync;
@@ -253,7 +254,7 @@ export async function akmImprove(options = {}) {
253
254
  }
254
255
  if (!firstEngineResponseSeen) {
255
256
  const firstResponseTimer = setTimeout(() => {
256
- warn("[improve] Still waiting for the first engine response...");
257
+ warn("[improve] Still waiting for the first model response...");
257
258
  }, FIRST_ENGINE_RESPONSE_HEARTBEAT_MS);
258
259
  firstResponseTimer.unref?.();
259
260
  clearFirstResponseHeartbeat = () => clearTimeout(firstResponseTimer);
@@ -360,12 +361,8 @@ function resolveImproveRunSetup(options) {
360
361
  const scope = resolveImproveScope(options.scope);
361
362
  const config = options.config ?? loadConfig();
362
363
  const configuredImproveProfile = resolveImproveStrategy(options.strategy, config).config;
363
- // A dry run never dispatches, so an all-disabled strategy must not abort it.
364
364
  const resolvedPlan = options.resolvedPlan ??
365
- resolveImprovePlan(options.strategy, config, {
366
- repairValidationFailures: options.repairValidationFailures,
367
- allowAllDisabled: options.dryRun,
368
- });
365
+ resolveImprovePlan(options.strategy, config, { repairValidationFailures: options.repairValidationFailures });
369
366
  const selectedStrategy = resolvedPlan.strategy;
370
367
  const improveProfile = selectedStrategy.config;
371
368
  const configuredLimits = {
@@ -433,7 +430,7 @@ function resolveImproveRunSetup(options) {
433
430
  config,
434
431
  resolvedPlan,
435
432
  selectedStrategy,
436
- improveSensitiveValues: collectEngineCredentialValues(config),
433
+ improveSensitiveValues: collectCredentialValues(config),
437
434
  improveProfile,
438
435
  configuredImproveProfile,
439
436
  configuredLimits,
@@ -626,7 +623,6 @@ export function buildDryRunResult(run, collected, preparation) {
626
623
  ...(preparation?.planning ? { plan: buildResultExecutionPlan(run, preparation, collected, true) } : {}),
627
624
  ...(strategyFilteredRefs.length > 0 ? { strategyFilteredRefs } : {}),
628
625
  ...(run.resolvedPlan.engineUnavailable.length > 0 ? { skippedProcesses: run.resolvedPlan.engineUnavailable } : {}),
629
- ...(run.options.engineProbe !== undefined ? { engineProbe: run.options.engineProbe } : {}),
630
626
  ...(preparation?.proactiveMaintenance ? { proactiveMaintenance: preparation.proactiveMaintenance } : {}),
631
627
  };
632
628
  }
@@ -725,7 +721,8 @@ async function runTriagePrePass(run) {
725
721
  dryRun: false,
726
722
  excludeIds: new Set(),
727
723
  judgment: resolvedPlan.triageJudgment,
728
- }), { engine: resolvedPlan.triageJudgment?.engine, process: "triage.judgment" });
724
+ signal: run.budgetAbortController.signal,
725
+ }), { engine: resolvedPlan.triageJudgment?.name, process: "triage.judgment" });
729
726
  }
730
727
  catch (err) {
731
728
  warn(`[improve] triage pre-pass failed (non-fatal): ${errMessage(err)}`);
@@ -1026,7 +1023,6 @@ function finalizeImproveResult(args) {
1026
1023
  ...(preparation.planning ? { plan: buildResultExecutionPlan(run, preparation, collected, false) } : {}),
1027
1024
  ...(strategyFilteredRefs.length > 0 ? { strategyFilteredRefs } : {}),
1028
1025
  ...(resolvedPlan.engineUnavailable.length > 0 ? { skippedProcesses: resolvedPlan.engineUnavailable } : {}),
1029
- ...(options.engineProbe !== undefined ? { engineProbe: options.engineProbe } : {}),
1030
1026
  ...(usageReport ? { usageReport } : {}),
1031
1027
  actions: persistedActions,
1032
1028
  ...(distillSkippedAggregate ? { distillSkipped: distillSkippedAggregate } : {}),
@@ -155,6 +155,8 @@ async function runLoopReflectPass(planned, env, tally) {
155
155
  signal: env.budgetSignal,
156
156
  eventsCtx: env.eventsCtx,
157
157
  ...(planned.eligibilitySource ? { eligibilitySource: planned.eligibilitySource } : {}),
158
+ llmRunner: resolvedPlan.processes.reflect.runner,
159
+ ...(resolvedPlan.run ? { run: resolvedPlan.run } : {}),
158
160
  };
159
161
  const result = await attributeStage(resolvedPlan, "reflect", () => env.reflectFn(reflectArgs));
160
162
  const reason = result.ok ? undefined : result.reason;
@@ -254,6 +256,7 @@ async function runLoopDistillPass(planned, refType, isDistillOnly, env, tally) {
254
256
  ...(improveProfile ? { improveProfile } : {}),
255
257
  config: options.config,
256
258
  llmRunner: resolvedPlan.processes.distill.runner,
259
+ ...(resolvedPlan.run ? { run: resolvedPlan.run } : {}),
257
260
  signal: env.budgetSignal,
258
261
  eventsCtx: env.eventsCtx,
259
262
  ...(planned.eligibilitySource ? { eligibilitySource: planned.eligibilitySource } : {}),
@@ -558,7 +558,7 @@ export function archiveCleanupCandidate(stashDir, candidate, filePath) {
558
558
  ? { successorRefs: candidate.successorRefs }
559
559
  : {}),
560
560
  }, "Archived derived memory for recoverable cleanup.\n");
561
- // 4c (third review round): write the tombstone BEFORE moving the file — a
561
+ // Write the tombstone BEFORE moving the file — a
562
562
  // crash in between used to leave a file already at archivedPath with no
563
563
  // cleanup.md to explain it (unrecoverable: revert refuses on a missing
564
564
  // tombstone, and nothing else knows this archive dir exists). Reordered,
@@ -24,7 +24,6 @@ import { appendEvent, readEvents } from "../../core/events.js";
24
24
  import { withStateDb } from "../../core/state-db.js";
25
25
  import { info, warn } from "../../core/warn.js";
26
26
  import { countUsageEventsByType, USAGE_EVENT_RETENTION_DAYS } from "../../indexer/usage/usage-events.js";
27
- import { runnerLlmConnection } from "../../integrations/agent/runner.js";
28
27
  import { getAvailableHarnesses } from "../../integrations/session-logs/index.js";
29
28
  import { getZeroResultSearches } from "../../storage/repositories/index-entries-repository.js";
30
29
  import { getRetrievalCounts } from "../../storage/repositories/index-utility-repository.js";
@@ -113,11 +112,8 @@ function planConsolidationPass(args) {
113
112
  maxChunkSize: processConfig?.maxChunkSize,
114
113
  }, primaryStashDir, [], args.existingKnowledgeBodyHashes ?? loadExistingKnowledgeBodyHashes(primaryStashDir), { readOnly: args.eventsCtx?.readOnly === true })
115
114
  : { poolSize: 0, candidatePoolSize: 0, judgedUnchanged: 0 };
116
- // A credential-unavailable engine still resolved its context length.
117
- const unavailable = resolvedPlan.engineUnavailable.find((item) => item.process === "consolidate");
118
- const chunkSize = computeSafeChunkSize((resolvedPlan.processes.consolidate.runner &&
119
- runnerLlmConnection(resolvedPlan.processes.consolidate.runner)?.contextLength) ??
120
- unavailable?.contextLength ??
115
+ const consolidateRunner = resolvedPlan.processes.consolidate.runner;
116
+ const chunkSize = computeSafeChunkSize((consolidateRunner?.kind === "connection" ? consolidateRunner.contextLength : undefined) ??
121
117
  DEFAULT_CONTEXT_LENGTH_TOKENS, 500, processConfig?.maxChunkSize);
122
118
  const profilePassed = processConfig?.enabled !== false;
123
119
  const deltaPassed = pool.candidatePoolSize > 0 || pool.judgedUnchanged === 0;
@@ -194,17 +190,17 @@ async function runConsolidationPass(args) {
194
190
  return { consolidation, plan: planned.plan };
195
191
  }
196
192
  /** The extract gates, evaluated once for both the live pass and the dry-run report. */
197
- function inspectExtractPass(args, readOnly) {
193
+ async function inspectExtractPass(args, readOnly) {
198
194
  const { options, improveProfile, resolvedPlan, eventsCtx } = args;
199
195
  const enabled = resolvedPlan.processes.extract.enabled;
200
- const hasRunner = resolvedPlan.processes.extract.runner?.engine !== undefined;
196
+ const hasRunner = resolvedPlan.processes.extract.runner !== null;
201
197
  const availableHarnesses = (options.extractHarnesses ?? getAvailableHarnesses()).filter((h) => h.isAvailable());
202
198
  const configured = improveProfile.processes?.extract?.minNewSessions;
203
199
  const minNewSessions = typeof configured === "number" ? configured : 0;
204
200
  let newCandidateCount;
205
201
  if (enabled && hasRunner && availableHarnesses.length > 0 && minNewSessions > 0) {
206
202
  const defaultSince = improveProfile.processes?.extract?.defaultSince;
207
- newCandidateCount = (options.extractCandidateCountFn ?? countNewExtractCandidates)(options.config ?? loadConfig(), {
203
+ newCandidateCount = await (options.extractCandidateCountFn ?? countNewExtractCandidates)(options.config ?? loadConfig(), {
208
204
  harnesses: availableHarnesses,
209
205
  improveProfile,
210
206
  ...(defaultSince ? { since: defaultSince } : {}),
@@ -245,17 +241,16 @@ async function runSessionExtractPass(args, plan) {
245
241
  if (!resolvedPlan.processes.extract.enabled)
246
242
  return { warnings };
247
243
  const runner = resolvedPlan.processes.extract.runner;
248
- if (!runner?.engine) {
244
+ if (!runner) {
249
245
  throw new ConfigError("Resolved improve plan has no runner for enabled extract process.", "LLM_NOT_CONFIGURED");
250
246
  }
251
247
  const config = options.config ?? loadConfig();
252
248
  const extractPlan = Object.freeze({
253
249
  strategy: resolvedPlan.strategy.name,
254
- engine: runner.engine,
250
+ engine: runner.name,
255
251
  enabled: true,
256
252
  process: resolvedPlan.processes.extract.config,
257
253
  runner,
258
- timeoutMs: runner.timeoutMs === undefined ? 600_000 : runner.timeoutMs,
259
254
  embeddingConfig: Object.freeze(structuredClone(config.embedding)),
260
255
  ...(resolvedPlan.processes.extract.notices?.length ? { notices: resolvedPlan.processes.extract.notices } : {}),
261
256
  });
@@ -374,7 +369,7 @@ export async function runImprovePreparationStage(args) {
374
369
  plan: planConsolidationPass(args).plan,
375
370
  }
376
371
  : await runConsolidationPass(args);
377
- const extractPlan = inspectExtractPass(args, planOnly);
372
+ const extractPlan = await inspectExtractPass(args, planOnly);
378
373
  const extractPass = planOnly ? { warnings: [] } : await runSessionExtractPass(args, extractPlan);
379
374
  cleanupWarnings.push(...extractPass.warnings);
380
375
  if (persist) {