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
@@ -0,0 +1,41 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ /**
5
+ * `connections`: the OpenAI-compatible endpoints akm reaches models through.
6
+ *
7
+ * akm owns `endpoint`, `apiKey`, `models`, `contextLength`, `timeoutMs` and
8
+ * `concurrency` (and keeps the retired `apiKeyFile` as written, never reading it). Every other key on a connection, or on a model entry, is a
9
+ * request field in the endpoint's own spelling and is sent with each request as
10
+ * written: the connection's fields apply to all its models, a model entry's
11
+ * override them.
12
+ */
13
+ import { z } from "zod";
14
+ import { WORKFLOW_MAX_TIMEOUT_MS } from "../../../workflows/resource-limits.js";
15
+ import { connectionEndpoint, engineName, envReferenceApiKey, nonEmptyString, positiveInt, retiredApiKeyFile, } from "./primitives.js";
16
+ /**
17
+ * Timeouts share the workflow ceiling: a larger value would pass config
18
+ * validation and then fail every run with an unlocated "invocation is invalid".
19
+ * `null` runs unbounded.
20
+ */
21
+ export const timeoutMsField = z.union([positiveInt.max(WORKFLOW_MAX_TIMEOUT_MS), z.null()]).optional();
22
+ /**
23
+ * One alias's target: the model's name, or an object holding it together with
24
+ * request fields of its own. The object is listed first so a JSON value given to
25
+ * `akm config set` is read as one.
26
+ */
27
+ export const ModelEntrySchema = z.union([z.object({ model: nonEmptyString }).catchall(z.unknown()), nonEmptyString]);
28
+ /** Alias (`fast`, `balanced`, `reasoning`, or any the user adds) to the model it names. */
29
+ export const ModelAliasesSchema = z.record(nonEmptyString, ModelEntrySchema);
30
+ export const ConnectionSchema = z
31
+ .object({
32
+ endpoint: connectionEndpoint,
33
+ apiKey: envReferenceApiKey.optional(),
34
+ apiKeyFile: retiredApiKeyFile.optional(),
35
+ models: ModelAliasesSchema.optional(),
36
+ contextLength: positiveInt.optional(),
37
+ timeoutMs: timeoutMsField,
38
+ concurrency: positiveInt.optional(),
39
+ })
40
+ .catchall(z.unknown());
41
+ export const ConnectionsSchema = z.record(engineName, ConnectionSchema);
@@ -6,7 +6,7 @@
6
6
  * `config-schema.ts` monolith — no behavior change.
7
7
  */
8
8
  import { z } from "zod";
9
- import { positiveInt, symbolicOrWarnApiKey } from "./primitives.js";
9
+ import { envReferenceApiKey, positiveInt } from "./primitives.js";
10
10
  const EmbeddingOllamaOptionsSchema = z
11
11
  .object({
12
12
  num_ctx: positiveInt.optional(),
@@ -26,7 +26,7 @@ export const EmbeddingConnectionConfigSchema = z
26
26
  provider: z.string().optional(),
27
27
  endpoint: z.string().optional(),
28
28
  model: z.string().optional(),
29
- apiKey: symbolicOrWarnApiKey("embedding.apiKey").optional(),
29
+ apiKey: envReferenceApiKey.optional(),
30
30
  dimension: positiveInt.optional(),
31
31
  localModel: z.string().min(1).optional(),
32
32
  /**
@@ -0,0 +1,41 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ /**
5
+ * `harnesses`: agent programs the user already has (Claude Code, Codex,
6
+ * OpenCode, ...). An entry's key is its platform unless `platform` says
7
+ * otherwise, so `{ "claude": {} }` enables Claude Code and a second install is
8
+ * `{ "claude-work": { "platform": "claude", "bin": "/opt/claude-work/bin/claude" } }`.
9
+ */
10
+ import { z } from "zod";
11
+ import { HARNESS_CONFIG_PLATFORMS } from "../../../integrations/harnesses/index.js";
12
+ import { ModelAliasesSchema, timeoutMsField } from "./connections.js";
13
+ import { engineName, nonEmptyString } from "./primitives.js";
14
+ export const HarnessSchema = z
15
+ .object({
16
+ platform: z.enum(HARNESS_CONFIG_PLATFORMS).optional(),
17
+ bin: nonEmptyString.optional(),
18
+ args: z.array(z.string()).optional(),
19
+ workspace: nonEmptyString.optional(),
20
+ /** The harness's native agent to run when a request names none (platforms with native agents only). */
21
+ agent: nonEmptyString.optional(),
22
+ timeoutMs: timeoutMsField,
23
+ /** Alias to model for this harness, over the map akm ships for its platform. A harness is given the name only. */
24
+ models: ModelAliasesSchema.optional(),
25
+ /** `false`: akm's own model calls are never sent here by default; a call that names this harness still runs on it. */
26
+ modelWork: z.boolean().optional(),
27
+ })
28
+ .passthrough();
29
+ /** Why a harness parsed from this entry cannot be run: it names no platform and its name is not one. */
30
+ export function harnessNameProblem(name, harness) {
31
+ if (harness.platform !== undefined || HARNESS_CONFIG_PLATFORMS.includes(name))
32
+ return undefined;
33
+ return `harness "${name}" is not a platform name; set platform to one of ${HARNESS_CONFIG_PLATFORMS.join(", ")}`;
34
+ }
35
+ export const HarnessesSchema = z.record(engineName, HarnessSchema).superRefine((harnesses, ctx) => {
36
+ for (const [name, harness] of Object.entries(harnesses)) {
37
+ const message = harnessNameProblem(name, harness);
38
+ if (message !== undefined)
39
+ ctx.addIssue({ code: z.ZodIssueCode.custom, path: [name, "platform"], message });
40
+ }
41
+ });
@@ -7,14 +7,14 @@
7
7
  */
8
8
  import { z } from "zod";
9
9
  import { IMPROVE_PROCESS_NAMES } from "../engine-semantics.js";
10
- import { engineName, LlmInvocationOverridesSchema, nonEmptyString, positiveInt } from "./primitives.js";
10
+ import { nonEmptyString, positiveInt } from "./primitives.js";
11
11
  // ── Improve profile / process ──────────────────────────────────────────────
12
12
  //
13
13
  // WI-9.6 (§4.2/§10.2): each of the improve processes (reflect, distill,
14
14
  // consolidate, memoryInference, extract, validation, triage,
15
15
  // proactiveMaintenance — graphExtraction had one too, until the LLM
16
16
  // entity-graph it ran was retired in 0.9.17-alpha.9) gets its OWN schema
17
- // below — a shared base (engine, model, llm, enabled, timeoutMs) extended
17
+ // below — a shared base (`enabled`) extended
18
18
  // with only the fields meaningful on that process — replacing the prior
19
19
  // single ImproveProcessConfigSchema reused via `.optional()` for all of them
20
20
  // (which accepted, and silently ignored, any field on any process). Field→process assignment is derived from each
@@ -34,12 +34,10 @@ import { engineName, LlmInvocationOverridesSchema, nonEmptyString, positiveInt }
34
34
  // `processes.<name>` uses the NARROW per-process schemas via
35
35
  // {@link ImproveProfileProcessesSchema} below — setting a field on the wrong
36
36
  // process there is now rejected (the intended §4.2 improvement).
37
+ // A strategy says which processes run and how; where a process runs (connection,
38
+ // harness, model, inference, timeout) is `improve.processes.<name>`, never here.
37
39
  const IMPROVE_PROCESS_BASE_FIELDS = {
38
- engine: engineName.optional(),
39
- model: nonEmptyString.optional(),
40
- llm: LlmInvocationOverridesSchema.optional(),
41
40
  enabled: z.boolean().optional(),
42
- timeoutMs: z.union([positiveInt, z.null()]).optional(),
43
41
  };
44
42
  /** Reflect/distill/consolidate: process-level asset-type filter (see improve-strategies.ts shouldSkipRef/DEFAULT_ALLOWED_TYPES). */
45
43
  const allowedTypesField = z.array(z.string().min(1)).optional();
@@ -61,17 +59,11 @@ const processLimitField = positiveInt.optional();
61
59
  * The distill and reflect LLM-as-judge quality gates. Default ON; set
62
60
  * `enabled: false` on the process to opt out. A judge error, timeout or
63
61
  * unparsable reply never passes: distill and reflect both send the content
64
- * to a person. `engine`, `model`, `timeoutMs` and `llm` give the
65
- * gate a judge of its own (#1011), resolved over the process's own settings;
66
- * with none set, the gate judges with the generator's runner.
62
+ * to a person. Where the judge runs is `improve.qualityGate`.
67
63
  */
68
64
  const qualityGateField = z
69
65
  .object({
70
66
  enabled: z.boolean().optional(),
71
- engine: engineName.optional(),
72
- model: nonEmptyString.optional(),
73
- timeoutMs: z.union([positiveInt, z.null()]).optional(),
74
- llm: LlmInvocationOverridesSchema.passthrough().optional(),
75
67
  })
76
68
  .passthrough()
77
69
  .optional();
@@ -120,20 +112,13 @@ const extractTriageGateField = z
120
112
  })
121
113
  .passthrough()
122
114
  .optional();
123
- // Unknown keys pass through here like every other nested surface (the loader
124
- // names them once); `extraParams` remains the arbitrary provider-parameter
125
- // escape hatch.
126
- const triageJudgmentLlmOverridesField = LlmInvocationOverridesSchema.passthrough();
115
+ // Unknown keys pass through here like every other nested surface (the loader names them once).
127
116
  const triageJudgmentObjectField = z
128
117
  .object({
129
118
  enabled: z.boolean().optional(),
130
- engine: engineName.optional(),
131
- model: nonEmptyString.optional(),
132
- timeoutMs: z.union([positiveInt, z.null()]).optional(),
133
- llm: triageJudgmentLlmOverridesField.optional(),
134
119
  })
135
120
  .passthrough();
136
- /** Triage process: explicit LLM-as-judge enablement and execution overrides. */
121
+ /** Triage process: whether the LLM-as-judge runs; it runs where `improve.processes.triage` says. */
137
122
  const triageJudgmentField = z
138
123
  .union([z.boolean(), triageJudgmentObjectField])
139
124
  .transform((value) => typeof value === "boolean" ? { enabled: value } : { ...value, enabled: value.enabled ?? true })
@@ -258,8 +243,8 @@ export const ProactiveMaintenanceProcessConfigSchema = z
258
243
  /**
259
244
  * Process names that once had a dedicated schema and are now gone. Setting
260
245
  * one, even with `enabled: true`, is tolerated rather than rejected by the
261
- * "unknown enabled process" check below — an old config must keep loading
262
- * (AGENTS.md "Reading persisted data"). `graphExtraction`: the LLM
246
+ * "unknown enabled process" check below — an old config must keep loading.
247
+ * `graphExtraction`: the LLM
263
248
  * entity-graph extraction it ran was retired in 0.9.17-alpha.9.
264
249
  * `feedbackDistillation`: a wrapper of `processes.distill.enabled`, removed in
265
250
  * 0.8.0.
@@ -297,10 +282,6 @@ const ImproveProfileProcessesSchema = z
297
282
  });
298
283
  export const ImproveProfileConfigSchema = z
299
284
  .object({
300
- engine: engineName.optional(),
301
- model: nonEmptyString.optional(),
302
- timeoutMs: z.union([positiveInt, z.null()]).optional(),
303
- llm: LlmInvocationOverridesSchema.optional(),
304
285
  description: z.string().min(1).optional(),
305
286
  processes: ImproveProfileProcessesSchema.optional(),
306
287
  limit: positiveInt.optional(),
@@ -8,7 +8,7 @@
8
8
  */
9
9
  import { z } from "zod";
10
10
  import { ImproveProfileConfigSchema } from "./improve-processes.js";
11
- import { engineName, nonNegativeNumber } from "./primitives.js";
11
+ import { engineName, LlmInvocationOverridesSchema, nonEmptyString, nonNegativeNumber, positiveInt } from "./primitives.js";
12
12
  // ── Improve top-level (event retention, salience, state GC) ────────────────
13
13
  const ImproveSalienceSchema = z.object({}).passthrough();
14
14
  // #733 — orphan-GC pass (Workstream C, lean by design: one config gate).
@@ -27,8 +27,43 @@ const ImproveStateGcSchema = z
27
27
  collect: z.boolean().optional(),
28
28
  })
29
29
  .passthrough();
30
+ /**
31
+ * Where one improve call runs: a connection or a harness, the model (an alias or
32
+ * a name), inference settings and a timeout. Strategies say which processes run;
33
+ * this says where, whichever strategy is selected.
34
+ */
35
+ export const ImproveWhereSchema = z
36
+ .object({
37
+ connection: nonEmptyString.optional(),
38
+ harness: nonEmptyString.optional(),
39
+ model: nonEmptyString.optional(),
40
+ llm: LlmInvocationOverridesSchema.optional(),
41
+ timeoutMs: z.union([positiveInt, z.null()]).optional(),
42
+ })
43
+ .passthrough();
44
+ /** The improve processes that make a model call; `proactiveMaintenance` makes none, so it has no place to run. */
45
+ const ImproveProcessesSchema = z
46
+ .object({
47
+ reflect: ImproveWhereSchema.optional(),
48
+ distill: ImproveWhereSchema.optional(),
49
+ consolidate: ImproveWhereSchema.optional(),
50
+ memoryInference: ImproveWhereSchema.optional(),
51
+ extract: ImproveWhereSchema.optional(),
52
+ validation: ImproveWhereSchema.optional(),
53
+ triage: ImproveWhereSchema.optional(),
54
+ })
55
+ .passthrough();
30
56
  export const ImproveConfigSchema = z
31
57
  .object({
58
+ /** The strategy `akm improve` runs when `--strategy` names none. */
59
+ strategy: engineName.optional(),
60
+ /** Where improve's model work runs: a connection, or a harness, over the default. */
61
+ connection: nonEmptyString.optional(),
62
+ harness: nonEmptyString.optional(),
63
+ /** Where each improve process runs, over `connection` / `harness` above. */
64
+ processes: ImproveProcessesSchema.optional(),
65
+ /** Where the judge of the reflect and distill quality gates runs, over `connection` / `harness` above (not over the process's own settings, which are the writer's). */
66
+ qualityGate: ImproveWhereSchema.optional(),
32
67
  strategies: z.record(engineName, ImproveProfileConfigSchema).optional(),
33
68
  eventRetentionDays: nonNegativeNumber.optional(),
34
69
  salience: ImproveSalienceSchema.optional(),
@@ -2,41 +2,34 @@
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
  /**
5
- * `index` config: reserved feature sections + arbitrary per-pass entries.
6
- * Extracted verbatim from the former `config-schema.ts` monolith — no behavior
7
- * change.
5
+ * `index` config: the index-wide model-work settings + arbitrary per-pass entries.
8
6
  */
9
7
  import { z } from "zod";
10
- import { engineName, LlmInvocationOverridesSchema, nonEmptyString, positiveInt } from "./primitives.js";
8
+ import { LlmInvocationOverridesSchema, nonEmptyString, positiveInt } from "./primitives.js";
11
9
  // ── Index / per-pass ────────────────────────────────────────────────────────
12
10
  /**
13
- * Per-pass `index.<pass>` entry. Unknown keys (including inline engine
11
+ * Per-pass `index.<pass>` entry. Unknown keys (including inline connection
14
12
  * settings an earlier release carried) are kept and named by the config
15
13
  * loader's schema walk like any other unknown key.
16
14
  */
17
15
  export const IndexPassConfigSchema = z
18
16
  .object({
19
- engine: engineName.optional(),
17
+ connection: nonEmptyString.optional(),
20
18
  model: nonEmptyString.optional(),
21
19
  timeoutMs: z.union([positiveInt, z.null()]).optional(),
22
20
  enabled: z.boolean().optional(),
23
21
  llm: LlmInvocationOverridesSchema.optional(),
24
22
  })
25
23
  .passthrough();
26
- const IndexDefaultsSchema = z
27
- .object({
28
- engine: engineName.optional(),
29
- model: nonEmptyString.optional(),
30
- timeoutMs: z.union([positiveInt, z.null()]).optional(),
31
- llm: LlmInvocationOverridesSchema.optional(),
32
- })
33
- .passthrough();
24
+ /** The keys that are settings for every pass, not a pass of their own. */
25
+ const INDEX_WIDE_KEYS = ["connection", "model", "timeoutMs", "llm"];
34
26
  /**
35
- * Index config is a union of reserved feature sections and per-pass entries.
36
- * Passthrough so per-pass entries (keyed by arbitrary pass names like
37
- * `memory`, or a retired one like `graph`) can live next to the reserved keys.
38
- * The outer preprocess emits the legacy parser's actionable error messages
39
- * for the two most common type-shape mistakes:
27
+ * Index config is the index-wide model-work settings (`connection`, `model`,
28
+ * `timeoutMs`, `llm`) plus per-pass entries keyed by pass name. Passthrough so
29
+ * per-pass entries (keyed by arbitrary pass names like `memory`, or a retired
30
+ * one like `graph`) can live next to the index-wide keys. The outer preprocess
31
+ * emits the legacy parser's actionable error messages for the two most common
32
+ * type-shape mistakes:
40
33
  * - An array at the `index` block.
41
34
  * - A non-object at `index.<passName>`.
42
35
  * Inner field validation (invocation overrides, provider-key rejection) is
@@ -55,6 +48,8 @@ const IndexConfigRuntimeSchema = z.preprocess((raw, ctx) => {
55
48
  if (typeof raw !== "object")
56
49
  return raw;
57
50
  for (const [passName, value] of Object.entries(raw)) {
51
+ if (INDEX_WIDE_KEYS.includes(passName))
52
+ continue;
58
53
  if (typeof value !== "object" || value === null || Array.isArray(value)) {
59
54
  ctx.addIssue({
60
55
  code: z.ZodIssueCode.custom,
@@ -66,7 +61,10 @@ const IndexConfigRuntimeSchema = z.preprocess((raw, ctx) => {
66
61
  return raw;
67
62
  }, z
68
63
  .object({
69
- defaults: IndexDefaultsSchema.optional(),
64
+ connection: nonEmptyString.optional(),
65
+ model: nonEmptyString.optional(),
66
+ timeoutMs: z.union([positiveInt, z.null()]).optional(),
67
+ llm: LlmInvocationOverridesSchema.optional(),
70
68
  })
71
69
  .catchall(IndexPassConfigSchema));
72
70
  // The runtime catchall correctly validates arbitrary pass objects, but its
@@ -8,6 +8,8 @@
8
8
  */
9
9
  import { z } from "zod";
10
10
  import { validateExtraParams } from "../../extra-params.js";
11
+ import { redactUrlCredentials } from "../../redaction.js";
12
+ import { isSecretRefToken } from "../../ref-token.js";
11
13
  import { warnOnce } from "../../warn.js";
12
14
  import { ENGINE_NAME_PATTERN_SOURCE } from "../engine-semantics.js";
13
15
  /** Persisted config schema version. Package prerelease/patch versions do not change this value. */
@@ -28,24 +30,50 @@ export const httpUrl = z.string().refine((v) => v.startsWith("http://") || v.sta
28
30
  });
29
31
  const ENGINE_NAME_PATTERN = new RegExp(ENGINE_NAME_PATTERN_SOURCE);
30
32
  export const ENV_REFERENCE_PATTERN = /^\$[A-Za-z_][A-Za-z0-9_]*$|^\$\{[A-Za-z_][A-Za-z0-9_]*\}$/;
31
- /** `secret://<name>` — an apiKey reference into the akm secret store, resolved via `resolveSecretFromStore`. */
32
- export const SECRET_STORE_REFERENCE_PATTERN = /^secret:\/\/(.+)$/;
33
33
  export const engineName = z
34
34
  .string()
35
35
  .max(63)
36
36
  .regex(ENGINE_NAME_PATTERN, "names must be lowercase kebab-case and must not begin with reserved akm-");
37
- /** The two symbolic apiKey forms akm accepts: an env-var reference or a secret-store reference. Never matches a literal key. */
37
+ /** The two symbolic credential forms akm accepts in a bundle source's `credential`: an env-var reference (`$VAR`, `${VAR}`) or a `secrets/` ref (`${secrets/name}`). Never matches a literal key. */
38
38
  export function isApiKeyReference(value) {
39
- return ENV_REFERENCE_PATTERN.test(value) || SECRET_STORE_REFERENCE_PATTERN.test(value);
39
+ return ENV_REFERENCE_PATTERN.test(value) || isSecretRefToken(value);
40
40
  }
41
- export function symbolicOrWarnApiKey(label) {
42
- return z.string().superRefine((value) => {
43
- if (isApiKeyReference(value))
44
- return;
45
- warnOnce(`config:literal-api-key:${label}`, `A ${label} in config.json is a literal API key, not a $VAR/\${VAR}/secret:// reference; using it as configured. Prefer \`akm config set ...apiKey '$VAR'\` (with the corresponding env var set) or \`secret://<name>\` (with \`akm secret set <name> ...\`) — see docs/reference/data-and-telemetry.md.`);
46
- });
41
+ /** A `$VAR` / `${VAR}` reference to an environment variable. */
42
+ export function isEnvReference(value) {
43
+ return ENV_REFERENCE_PATTERN.test(value);
47
44
  }
48
- export const chatCompletionsEndpoint = z.string().superRefine((value, ctx) => {
45
+ /** The variable a `$VAR` / `${VAR}` reference names. */
46
+ export function envReferenceName(value) {
47
+ return /^\$(?:\{)?([A-Za-z_][A-Za-z0-9_]*)(?:\})?$/.exec(value)?.[1];
48
+ }
49
+ /**
50
+ * The `apiKey` of a connection, `embedding` or `search.curateRerank`: a `$VAR` /
51
+ * `${VAR}` reference, or absent (the key is then `credentials.json`'s under the
52
+ * block's name). Anything else is never read or sent: it is warned about once,
53
+ * never a load error, and kept as written so an ordinary write does not delete
54
+ * the user's key from their file (`akm migrate apply` moves it).
55
+ */
56
+ export const envReferenceApiKey = z.string().transform((value) => {
57
+ if (isEnvReference(value))
58
+ return value;
59
+ if (isSecretRefToken(value)) {
60
+ warnOnce("config:secret-ref-api-key", "An apiKey that is a secret-store reference is ignored: akm reads a key from a $VAR or credentials.json. `akm migrate apply` moves it into credentials.json.");
61
+ }
62
+ else {
63
+ warnOnce("config:literal-api-key", "A literal apiKey in config.json is ignored: akm does not read keys from config. Use a $VAR reference, or run `akm migrate apply` to move the key into credentials.json.");
64
+ }
65
+ return value;
66
+ });
67
+ /**
68
+ * The retired `apiKeyFile` of an engine that `akm migrate apply` could not read yet: kept as written so a
69
+ * later run can move the key it names, never read, sent or printed by akm.
70
+ */
71
+ export const retiredApiKeyFile = z.string().transform((value) => {
72
+ warnOnce("config:api-key-file", "An apiKeyFile in config.json is ignored: akm reads a key from a $VAR or credentials.json. `akm migrate apply` moves the key the file holds once it can be read.");
73
+ return value;
74
+ });
75
+ /** A connection endpoint: a complete http(s) URL, the OpenAI-compatible base (`…/v1`) or the chat-completions URL itself. */
76
+ export const connectionEndpoint = z.string().superRefine((value, ctx) => {
49
77
  let url;
50
78
  try {
51
79
  url = new URL(value);
@@ -59,10 +87,9 @@ export const chatCompletionsEndpoint = z.string().superRefine((value, ctx) => {
59
87
  return;
60
88
  }
61
89
  if (url.username || url.password) {
62
- warnOnce(`chatCompletionsEndpoint:userinfo:${value}`, `Config endpoint "${value}" embeds a username/password; consider moving the credential to the engine's apiKey field instead.`);
63
- }
64
- if (!url.pathname.endsWith("/chat/completions")) {
65
- warnOnce(`chatCompletionsEndpoint:path:${value}`, `Config endpoint "${value}" does not end in /chat/completions; using it as configured.`);
90
+ // The warning names the endpoint without the credential it is about, and is keyed by that too.
91
+ const shown = redactUrlCredentials(value);
92
+ warnOnce(`connectionEndpoint:userinfo:${shown}`, `Config endpoint "${shown}" embeds a username/password; move the credential out of the URL (apiKey: "$VAR", or credentials.json).`);
66
93
  }
67
94
  });
68
95
  export const ExtraParamsSchema = z.record(z.unknown()).superRefine((value, ctx) => {
@@ -75,9 +102,7 @@ export const LlmInvocationOverridesSchema = z
75
102
  .object({
76
103
  temperature: z.number().finite().optional(),
77
104
  maxTokens: positiveInt.optional(),
78
- supportsJsonSchema: z.boolean().optional(),
79
105
  extraParams: ExtraParamsSchema.optional(),
80
- contextLength: positiveInt.optional(),
81
106
  enableThinking: z.boolean().optional(),
82
107
  reasoningEffort: nonEmptyString.optional(),
83
108
  })
@@ -6,21 +6,16 @@
6
6
  * reranker.
7
7
  */
8
8
  import { z } from "zod";
9
- import { httpUrl, nonEmptyString, positiveInt, symbolicOrWarnApiKey } from "./primitives.js";
9
+ import { envReferenceApiKey, httpUrl, nonEmptyString, positiveInt } from "./primitives.js";
10
10
  // ── Search ──────────────────────────────────────────────────────────────────
11
11
  /**
12
12
  * `search.curateRerank` (#951) — an optional cross-encoder rerank pass over
13
13
  * `akm curate`'s top fused candidates.
14
14
  *
15
- * Deliberately its own small config arm rather than a third member of the
16
- * `engines` map (`EngineConfigSchema` in ./engines.ts): that union's "llm" /
17
- * "agent" kinds are load-bearing all the way through execution-lowering,
18
- * runner dispatch, and the harness model map (100+ call sites narrow on
19
- * `engine.kind`). A reranker is neither — it never dispatches an agent or
20
- * lowers to a chat-completions call — so folding it into that union would
21
- * force every one of those call sites to account for a kind they can't do
22
- * anything with. `endpoint` + `model` (+ optional `apiKey`) is the same
23
- * connection shape as an LLM engine without inheriting that machinery.
15
+ * Deliberately its own small config block rather than a `connections` entry: a
16
+ * reranker never dispatches an agent or lowers to a chat-completions call, and
17
+ * its `endpoint` is the full rerank URL. Its `apiKey` follows the connection
18
+ * rule (`$VAR`, or `credentials.json` under the name `curateRerank`).
24
19
  *
25
20
  * `curate_rerank` was removed as a dead `llm.features.*` key in 0.8.0 (no
26
21
  * implementation ever sent a request); this is a new, real implementation,
@@ -32,7 +27,7 @@ export const CurateRerankConfigSchema = z
32
27
  /** Full URL of the reranker's rerank endpoint, e.g. `http://host:port/rerank`. */
33
28
  endpoint: httpUrl.optional(),
34
29
  model: nonEmptyString.optional(),
35
- apiKey: symbolicOrWarnApiKey("search.curateRerank.apiKey").optional(),
30
+ apiKey: envReferenceApiKey.optional(),
36
31
  timeoutMs: positiveInt.optional(),
37
32
  /** How many of the top fused search candidates curate sends to the reranker. Default 30. */
38
33
  topN: positiveInt.max(50).optional(),
@@ -64,7 +64,7 @@ export const SourceConfigEntrySchema = z
64
64
  ctx.addIssue({
65
65
  code: z.ZodIssueCode.custom,
66
66
  path: ["credential"],
67
- message: "git credential must be a $VAR or secret://<name> reference",
67
+ message: "git credential must be a $VAR, ${VAR} or ${secrets/<name>} reference",
68
68
  });
69
69
  }
70
70
  });
@@ -77,20 +77,20 @@ export const RegistryConfigEntrySchema = z
77
77
  options: z.record(z.unknown()).optional(),
78
78
  })
79
79
  .passthrough();
80
- // ── Bundles (0.9.0 config-shape cutover, spec §10.1 / D-R5) ─────────────────
80
+ // ── Bundles ─────────────────────────────────────────────────────────────────
81
81
  //
82
82
  // `bundles` + `defaultBundle` are the desired-configuration shape. Each bundle
83
83
  // entry carries ONE source descriptor (`path` | `git` | `website` | `npm`
84
84
  // — mirroring today's source types), an optional `writable`, an optional
85
85
  // `registryId` locator (the original registry install id, preserved verbatim so
86
86
  // a non-slug-legal id like `github:owner/repo` is not lost when its slug-legal
87
- // bundle KEY is derived), and an optional single-entry `components` map (spec
88
- // §10.1; the transitional one-component-per-bundle coupling — NOT multi-component
89
- // machinery). The map KEY is the workspace bundle slug (spec §11.1 charset: no
87
+ // bundle KEY is derived), and an optional single-entry `components` map (the
88
+ // transitional one-component-per-bundle coupling — NOT multi-component
89
+ // machinery). The map KEY is the workspace bundle slug (charset: no
90
90
  // `/`, `:`, `.`, `#`, whitespace), validated with {@link isBundleSlug}.
91
91
  //
92
92
  // `bindings` is not accepted here; the top-level schema rejects it.
93
- /** Website source descriptor for a bundle entry (spec §10.1). */
93
+ /** Website source descriptor for a bundle entry. */
94
94
  const BundleWebsiteDescriptorSchema = z
95
95
  .object({
96
96
  url: httpUrl,
@@ -110,7 +110,7 @@ const BundleWebsiteDescriptorSchema = z
110
110
  crawlTimeoutMs: z.number().int().min(0).optional(),
111
111
  })
112
112
  .passthrough();
113
- /** One component of a bundle (spec §10.1). Single-entry, transitional. */
113
+ /** One component of a bundle. Single-entry, transitional. */
114
114
  const BundleComponentConfigSchema = z
115
115
  .object({
116
116
  root: z.string().min(1).optional(),
@@ -178,7 +178,7 @@ export const BundleConfigEntrySchema = z
178
178
  ctx.addIssue({
179
179
  code: z.ZodIssueCode.custom,
180
180
  path: ["credential"],
181
- message: "git credential must be a $VAR or secret://<name> reference",
181
+ message: "git credential must be a $VAR, ${VAR} or ${secrets/<name>} reference",
182
182
  });
183
183
  }
184
184
  const componentEntries = entry.components ? Object.entries(entry.components) : [];
@@ -216,7 +216,7 @@ export const BundleConfigEntrySchema = z
216
216
  }
217
217
  });
218
218
  /**
219
- * `bundles` map. Keys are workspace bundle slugs (spec §11.1 / D-R5 charset).
219
+ * `bundles` map. Keys are workspace bundle slugs.
220
220
  * The key charset is validated with {@link isBundleSlug} so a key can never carry
221
221
  * `/`, `:`, `.`, `#`, or whitespace (which would break the `bundle//conceptId`
222
222
  * ref grammar).
@@ -2,12 +2,10 @@
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
  /**
5
- * `workflow` engine settings. Extracted verbatim from the former
6
- * `config-schema.ts` monolith — no behavior change.
5
+ * `workflow` settings (fan-out limits).
7
6
  */
8
7
  import { z } from "zod";
9
- import { engineName, positiveInt } from "./primitives.js";
10
- // ── Workflow engine ─────────────────────────────────────────────────────────
8
+ import { positiveInt } from "./primitives.js";
11
9
  /**
12
10
  * Workflow-engine settings (`workflow`).
13
11
  *
@@ -34,7 +32,5 @@ export const WorkflowConfigSchema = z
34
32
  .object({
35
33
  maxConcurrency: positiveInt.optional(),
36
34
  defaultMapConcurrency: positiveInt.optional(),
37
- /** Named LLM or agent engine frozen into every criteria-bearing gate. */
38
- judgeEngine: engineName.optional(),
39
35
  })
40
36
  .passthrough();
@@ -0,0 +1,66 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ import { isRecord } from "../common.js";
5
+ import { warnOnce } from "../warn.js";
6
+ import { ConnectionSchema } from "./schema/connections.js";
7
+ import { HarnessSchema, harnessNameProblem } from "./schema/harnesses.js";
8
+ import { engineName } from "./schema/primitives.js";
9
+ /** The first thing a schema found wrong with an entry, as a sentence fragment. */
10
+ function firstIssue(error) {
11
+ const issue = error.issues[0];
12
+ const where = issue?.path.join(".");
13
+ return `${where ? `${where}: ` : ""}${issue?.message ?? "it is not valid"}`;
14
+ }
15
+ /** Why an entry cannot have this name, if it cannot: the rule every connection and harness name follows. */
16
+ function nameProblem(name) {
17
+ const parsed = engineName.safeParse(name);
18
+ return parsed.success ? undefined : `its name breaks the naming rule (${firstIssue(parsed.error)})`;
19
+ }
20
+ /** Why a connection entry cannot be used, if it cannot: its name breaks the rule, or its own schema rejects it. */
21
+ function connectionProblem(name, entry) {
22
+ const parsed = ConnectionSchema.safeParse(entry);
23
+ return nameProblem(name) ?? (parsed.success ? undefined : firstIssue(parsed.error));
24
+ }
25
+ /** Why a harness entry cannot be used, if it cannot: as for a connection, or it names no platform and is not one. */
26
+ function harnessProblem(name, entry) {
27
+ const parsed = HarnessSchema.safeParse(entry);
28
+ return nameProblem(name) ?? (parsed.success ? harnessNameProblem(name, parsed.data) : firstIssue(parsed.error));
29
+ }
30
+ /** The connections and harnesses of `raw` that their own schemas reject, in file order. */
31
+ export function findUnusableEntries(raw) {
32
+ const unusable = [];
33
+ const check = (entries, kind, problem) => {
34
+ if (!isRecord(entries))
35
+ return;
36
+ for (const [name, entry] of Object.entries(entries)) {
37
+ const why = problem(name, entry);
38
+ if (why !== undefined)
39
+ unusable.push({ kind, name, why });
40
+ }
41
+ };
42
+ check(raw.connections, "connection", connectionProblem);
43
+ check(raw.harnesses, "harness", harnessProblem);
44
+ return unusable;
45
+ }
46
+ /**
47
+ * A connection or harness its own schema rejects (no endpoint, an endpoint that
48
+ * is not a URL, a model that is not a name, a harness akm cannot run, a name that
49
+ * breaks the naming rule) is of no
50
+ * use, but it is not a reason to refuse the rest of the config or to disable the
51
+ * entries beside it: each is dropped from what is read, with one warning naming
52
+ * it and the first thing wrong. The file keeps it, and a write does not remove it.
53
+ */
54
+ export function dropUnusableEntries(raw, sourcePath) {
55
+ const unusable = findUnusableEntries(raw);
56
+ if (unusable.length === 0)
57
+ return raw;
58
+ const out = { ...raw };
59
+ for (const { kind, name, why } of unusable) {
60
+ warnOnce(`config:unusable:${kind}:${sourcePath ?? "inline"}:${name}`, `Ignoring ${kind} "${name}"${sourcePath ? ` in ${sourcePath}` : ""}: ${why}.`);
61
+ const holder = kind === "connection" ? "connections" : "harnesses";
62
+ const { [name]: _dropped, ...kept } = out[holder];
63
+ out[holder] = kept;
64
+ }
65
+ return out;
66
+ }
@@ -14,15 +14,12 @@ export function containsReflectPromptScaffolding(content) {
14
14
  }
15
15
  /**
16
16
  * Return a secret-free rejection reason when generated content is unsafe to
17
- * persist. `redactedContent` is the same body after applying the dispatch
18
- * lease's sensitive-value inventory; comparing it avoids exposing the value.
17
+ * persist. A dispatch redacts its reply before anything reads it, so content
18
+ * that echoed a credential reaches here carrying the marker.
19
19
  */
20
- export function generatedContentRejection(content, redactedContent) {
20
+ export function generatedContentRejection(content) {
21
21
  if (containsRedactedContent(content)) {
22
22
  return `Agent proposal content contains ${REDACTED_CONTENT_MARKER}; refusing to persist already-redacted text.`;
23
23
  }
24
- if (redactedContent !== content) {
25
- return "Agent proposal content echoed a configured credential; refusing to persist either the secret or a redacted replacement.";
26
- }
27
24
  return undefined;
28
25
  }