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
@@ -1,475 +0,0 @@
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 fs from "node:fs";
5
- import path from "node:path";
6
- import { fileURLToPath } from "node:url";
7
- import { writeFileAtomic } from "../../core/common.js";
8
- import { ENGINE_NAME_PATTERN_SOURCE } from "../../core/config/engine-semantics.js";
9
- import { ConfigError, UsageError } from "../../core/errors.js";
10
- import { getConfigDir } from "../../core/paths.js";
11
- import { warnOnce } from "../../core/warn.js";
12
- import { cloneExecutionJsonObject } from "../../execution/json.js";
13
- /**
14
- * Installed and operator-owned model intent aliases (#802). `resolveExecution`
15
- * expands a recognized alias once, into an exact model and inference defaults
16
- * at the layer that chose it; harness builders never reinterpret it.
17
- */
18
- export const MODEL_MAP_VERSION = 1;
19
- let standaloneInstalledModelMapText;
20
- const ENGINE_KEY_PATTERN = new RegExp(ENGINE_NAME_PATTERN_SOURCE);
21
- const ALIAS_KEY_PATTERN = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
22
- const RESERVED_MAP_KEYS = new Set(["__proto__", "constructor", "prototype", "tostring"]);
23
- /**
24
- * A profile's own field names (#946). When one of these appears directly
25
- * under an alias — e.g. `"fast": { "engine": "local-fast" }` — it is not a
26
- * per-platform column named `model`/`inference`/`engine`; it is a wildcard
27
- * default profile applied to every platform column of that alias, exactly
28
- * the flat shorthand the original proposal asked for. A nested per-platform
29
- * entry in the same alias (`"fast": { "claude": { ... } }`) still overrides
30
- * the wildcard for that one column, so both forms compose.
31
- */
32
- const PROFILE_FIELD_KEYS = new Set(["model", "inference", "engine"]);
33
- /** Internal key the wildcard default profile is stored under (never user-writable directly). */
34
- export const WILDCARD_ENGINE_KEY = "*";
35
- function assertSafeMapKey(key, source, jsonPath) {
36
- if (RESERVED_MAP_KEYS.has(key.toLowerCase())) {
37
- invalid(source, jsonPath, "reserved prototype-like key is not allowed");
38
- }
39
- }
40
- function invalid(source, jsonPath, detail) {
41
- throw new ConfigError(`Invalid ${source} at ${jsonPath}: ${detail}`, "INVALID_CONFIG_FILE", `Fix ${source}, or remove the optional user models.json to use AKM's installed defaults.`);
42
- }
43
- function requireRecord(value, source, jsonPath) {
44
- if (value === null ||
45
- typeof value !== "object" ||
46
- Array.isArray(value) ||
47
- Object.getPrototypeOf(value) !== Object.prototype) {
48
- invalid(source, jsonPath, "expected a JSON object");
49
- }
50
- return value;
51
- }
52
- function assertOnlyKeys(value, allowed, source, jsonPath) {
53
- const allowedSet = new Set(allowed);
54
- for (const key of Object.keys(value)) {
55
- if (!allowedSet.has(key))
56
- invalid(source, `${jsonPath}.${key}`, "unknown field");
57
- }
58
- }
59
- function requireNonemptyString(value, source, jsonPath) {
60
- if (typeof value !== "string" || value.length === 0 || value.trim() !== value) {
61
- invalid(source, jsonPath, "expected a nonempty string without surrounding whitespace");
62
- }
63
- return value;
64
- }
65
- function freezeRecord(entries) {
66
- const record = Object.create(null);
67
- for (const [key, value] of entries)
68
- record[key] = value;
69
- return Object.freeze(record);
70
- }
71
- function ownValue(record, key) {
72
- return record !== undefined && Object.hasOwn(record, key) ? record[key] : undefined;
73
- }
74
- function parseProfileLayer(value, source, jsonPath) {
75
- if (typeof value === "string")
76
- return requireNonemptyString(value, source, jsonPath);
77
- const record = requireRecord(value, source, jsonPath);
78
- assertOnlyKeys(record, ["model", "inference", "engine"], source, jsonPath);
79
- if (!Object.hasOwn(record, "model") && !Object.hasOwn(record, "inference") && !Object.hasOwn(record, "engine")) {
80
- invalid(source, jsonPath, "structured profile must contain model, inference, and/or engine");
81
- }
82
- if (Object.hasOwn(record, "model") && Object.hasOwn(record, "engine")) {
83
- invalid(source, jsonPath, "model and engine cannot both be set; engine is an indirection for the model value");
84
- }
85
- const out = {};
86
- if (Object.hasOwn(record, "model"))
87
- out.model = requireNonemptyString(record.model, source, `${jsonPath}.model`);
88
- if (Object.hasOwn(record, "engine")) {
89
- const rawEngine = requireNonemptyString(record.engine, source, `${jsonPath}.engine`);
90
- const engine = rawEngine.toLowerCase();
91
- assertSafeMapKey(engine, source, `${jsonPath}.engine`);
92
- if (!ENGINE_KEY_PATTERN.test(engine)) {
93
- invalid(source, `${jsonPath}.engine`, "engine reference must be lowercase kebab-case");
94
- }
95
- out.engine = engine;
96
- }
97
- if (Object.hasOwn(record, "inference")) {
98
- if (record.inference === null)
99
- out.inference = null;
100
- else {
101
- try {
102
- out.inference = cloneExecutionJsonObject(record.inference, `${source} ${jsonPath}.inference`);
103
- }
104
- catch (error) {
105
- invalid(source, `${jsonPath}.inference`, error instanceof Error ? error.message : String(error));
106
- }
107
- }
108
- }
109
- return Object.freeze(out);
110
- }
111
- /** Parse one installed or user layer. Partial structured profiles are valid at this stage. */
112
- export function parseModelMapLayer(text, source) {
113
- let parsed;
114
- try {
115
- parsed = JSON.parse(text);
116
- }
117
- catch {
118
- invalid(source, "$", "invalid JSON syntax");
119
- }
120
- const root = requireRecord(parsed, source, "$");
121
- assertOnlyKeys(root, ["version", "aliases"], source, "$");
122
- if (root.version !== MODEL_MAP_VERSION) {
123
- invalid(source, "$.version", `expected version ${MODEL_MAP_VERSION}`);
124
- }
125
- if (!Object.hasOwn(root, "aliases"))
126
- invalid(source, "$.aliases", "required field is missing");
127
- const rawAliases = requireRecord(root.aliases, source, "$.aliases");
128
- const aliases = [];
129
- const aliasesSeen = new Map();
130
- for (const [rawAlias, rawEngines] of Object.entries(rawAliases)) {
131
- const alias = rawAlias.toLowerCase();
132
- assertSafeMapKey(alias, source, `$.aliases.${rawAlias}`);
133
- if (!ALIAS_KEY_PATTERN.test(alias))
134
- invalid(source, `$.aliases.${rawAlias}`, "alias must be lowercase kebab-case");
135
- const previous = aliasesSeen.get(alias);
136
- if (previous !== undefined) {
137
- invalid(source, `$.aliases.${rawAlias}`, `alias collides case-insensitively with ${previous}`);
138
- }
139
- aliasesSeen.set(alias, rawAlias);
140
- const engineRecord = requireRecord(rawEngines, source, `$.aliases.${rawAlias}`);
141
- if (Object.keys(engineRecord).length === 0) {
142
- invalid(source, `$.aliases.${rawAlias}`, "alias must contain at least one engine mapping");
143
- }
144
- const engines = [];
145
- const enginesSeen = new Map();
146
- const wildcardFields = {};
147
- const platformEntries = [];
148
- for (const [rawKey, rawValue] of Object.entries(engineRecord)) {
149
- if (PROFILE_FIELD_KEYS.has(rawKey))
150
- wildcardFields[rawKey] = rawValue;
151
- else
152
- platformEntries.push([rawKey, rawValue]);
153
- }
154
- if (Object.keys(wildcardFields).length > 0) {
155
- engines.push([WILDCARD_ENGINE_KEY, parseProfileLayer(wildcardFields, source, `$.aliases.${rawAlias}`)]);
156
- }
157
- for (const [rawEngine, rawProfile] of platformEntries) {
158
- const engine = rawEngine.toLowerCase();
159
- assertSafeMapKey(engine, source, `$.aliases.${rawAlias}.${rawEngine}`);
160
- if (!ENGINE_KEY_PATTERN.test(engine)) {
161
- invalid(source, `$.aliases.${rawAlias}.${rawEngine}`, "engine key must be lowercase kebab-case");
162
- }
163
- const previousEngine = enginesSeen.get(engine);
164
- if (previousEngine !== undefined) {
165
- invalid(source, `$.aliases.${rawAlias}.${rawEngine}`, `engine key collides case-insensitively with ${previousEngine}`);
166
- }
167
- enginesSeen.set(engine, rawEngine);
168
- engines.push([engine, parseProfileLayer(rawProfile, source, `$.aliases.${rawAlias}.${rawEngine}`)]);
169
- }
170
- aliases.push([alias, freezeRecord(engines)]);
171
- }
172
- return Object.freeze({ version: MODEL_MAP_VERSION, aliases: freezeRecord(aliases) });
173
- }
174
- function isJsonObject(value) {
175
- return value !== null && value !== undefined && typeof value === "object" && !Array.isArray(value);
176
- }
177
- function mergeJsonValue(base, overlay) {
178
- if (!isJsonObject(base) || !isJsonObject(overlay))
179
- return overlay;
180
- const entries = new Map(Object.entries(base));
181
- for (const [key, value] of Object.entries(overlay))
182
- entries.set(key, mergeJsonValue(entries.get(key), value));
183
- return Object.freeze(Object.fromEntries(entries));
184
- }
185
- function normalizeLayerEntry(entry) {
186
- return typeof entry === "string" ? Object.freeze({ model: entry }) : entry;
187
- }
188
- function mergeProfiles(base, overlay) {
189
- const next = normalizeLayerEntry(overlay);
190
- const out = {};
191
- if (base?.model !== undefined)
192
- out.model = base.model;
193
- if (base?.engine !== undefined)
194
- out.engine = base.engine;
195
- if (base && Object.hasOwn(base, "inference"))
196
- out.inference = base.inference;
197
- // A literal `model` and an `engine` indirection are mutually exclusive within
198
- // one layer (enforced at parse time); across layers, whichever the nearer
199
- // layer sets replaces the other so the merged profile keeps that invariant.
200
- if (next.model !== undefined) {
201
- out.model = next.model;
202
- delete out.engine;
203
- }
204
- if (next.engine !== undefined) {
205
- out.engine = next.engine;
206
- delete out.model;
207
- }
208
- if (Object.hasOwn(next, "inference")) {
209
- out.inference =
210
- next.inference !== null && next.inference !== undefined && isJsonObject(base?.inference)
211
- ? mergeJsonValue(base.inference, next.inference)
212
- : next.inference;
213
- }
214
- return Object.freeze(out);
215
- }
216
- /**
217
- * Derive the `{ model, inference }` a model-map profile borrows from a
218
- * configured engine (#946). `resolveExecution` derives an engine's own
219
- * defaults with the same function, so the two cannot diverge. `model` is
220
- * copied verbatim from the engine's own config value; it must already be
221
- * meaningful for the model-map column's platform (akm does not translate
222
- * between an engine's connection and an agent platform's own provider
223
- * registry). Only `kind: "llm"` engines contribute inference defaults — an
224
- * agent-kind engine's schema carries no temperature/thinking fields.
225
- */
226
- export function engineModelAndInference(engine) {
227
- const out = {};
228
- if (Object.hasOwn(engine, "model") && engine.model !== undefined)
229
- out.model = engine.model;
230
- if (engine.kind === "llm") {
231
- const inference = {};
232
- if (Object.hasOwn(engine, "temperature"))
233
- inference.temperature = engine.temperature;
234
- if (Object.hasOwn(engine, "maxTokens"))
235
- inference.maxTokens = engine.maxTokens;
236
- if (Object.hasOwn(engine, "supportsJsonSchema"))
237
- inference.supportsJsonSchema = engine.supportsJsonSchema;
238
- if (Object.hasOwn(engine, "extraParams"))
239
- inference.extraParams = engine.extraParams;
240
- if (Object.hasOwn(engine, "contextLength"))
241
- inference.contextLength = engine.contextLength;
242
- if (Object.hasOwn(engine, "enableThinking"))
243
- inference.enableThinking = engine.enableThinking;
244
- if (Object.hasOwn(engine, "reasoningEffort"))
245
- inference.reasoningEffort = engine.reasoningEffort;
246
- if (Object.keys(inference).length > 0)
247
- out.inference = inference;
248
- }
249
- return Object.freeze(out);
250
- }
251
- /** Overlay user fields over installed fields, per (alias, column), without resolving `engine` indirection. */
252
- function mergeRawProfileLayers(installed, user) {
253
- const aliases = new Map();
254
- const apply = (layer) => {
255
- for (const [alias, layerEngines] of Object.entries(layer.aliases)) {
256
- const mergedEngines = aliases.get(alias) ?? new Map();
257
- const wildcard = ownValue(layerEngines, WILDCARD_ENGINE_KEY);
258
- if (wildcard !== undefined) {
259
- // This layer's wildcard default (#946) overlays every platform column
260
- // already accumulated from earlier layers, before this layer's own
261
- // explicit per-platform entries (applied below) get a chance to
262
- // override it for their one column.
263
- for (const [engineKey, profile] of mergedEngines) {
264
- if (engineKey === WILDCARD_ENGINE_KEY)
265
- continue;
266
- mergedEngines.set(engineKey, mergeProfiles(profile, wildcard));
267
- }
268
- }
269
- for (const [engineKey, profile] of Object.entries(layerEngines)) {
270
- mergedEngines.set(engineKey, mergeProfiles(mergedEngines.get(engineKey), profile));
271
- }
272
- aliases.set(alias, mergedEngines);
273
- }
274
- };
275
- apply(installed);
276
- if (user)
277
- apply(user);
278
- return aliases;
279
- }
280
- /**
281
- * The overlaid-but-unresolved profile per (alias, column), before any
282
- * `engine` indirection is expanded. `akm models list` (#946) uses this to
283
- * report whether a column resolves through a literal `model` or an `engine`
284
- * reference — information {@link mergeModelMapLayers} collapses away once it
285
- * performs the final resolution.
286
- */
287
- export function mergedModelMapProfiles(installed, user) {
288
- const aliases = mergeRawProfileLayers(installed, user);
289
- const out = [];
290
- for (const [alias, engineProfiles] of aliases)
291
- out.push([alias, freezeRecord(engineProfiles)]);
292
- return freezeRecord(out);
293
- }
294
- /**
295
- * Overlay user fields over installed fields, resolve any `engine` indirection
296
- * against configured engines, then enforce usable merged profiles.
297
- */
298
- export function mergeModelMapLayers(installed, user, engines) {
299
- const aliases = mergeRawProfileLayers(installed, user);
300
- const resolvedAliases = [];
301
- for (const [alias, engineProfiles] of aliases) {
302
- const resolvedEngines = [];
303
- for (const [engineKey, profile] of engineProfiles) {
304
- let model = profile.model;
305
- let inference = Object.hasOwn(profile, "inference") ? profile.inference : undefined;
306
- if (model === undefined && profile.engine !== undefined) {
307
- const target = ownValue(engines, profile.engine);
308
- if (target === undefined) {
309
- invalid("merged models.json", `$.aliases.${alias}.${engineKey}.engine`, `references unknown engine ${JSON.stringify(profile.engine)}; a usable model is required after overlay`);
310
- }
311
- const expansion = engineModelAndInference(target);
312
- if (expansion.model === undefined) {
313
- invalid("merged models.json", `$.aliases.${alias}.${engineKey}.engine`, `engine ${JSON.stringify(profile.engine)} has no usable model; a usable model is required after overlay`);
314
- }
315
- model = expansion.model;
316
- inference =
317
- inference === undefined
318
- ? expansion.inference
319
- : inference !== null && isJsonObject(expansion.inference)
320
- ? mergeJsonValue(expansion.inference, inference)
321
- : inference;
322
- }
323
- if (model === undefined) {
324
- invalid("merged models.json", `$.aliases.${alias}.${engineKey}.model`, "a usable model is required after overlay");
325
- }
326
- resolvedEngines.push([engineKey, Object.freeze(inference !== undefined ? { model, inference } : { model })]);
327
- }
328
- resolvedAliases.push([alias, freezeRecord(resolvedEngines)]);
329
- }
330
- return Object.freeze({ version: MODEL_MAP_VERSION, aliases: freezeRecord(resolvedAliases) });
331
- }
332
- function selectionFromProfile(input, profile) {
333
- if (!profile.model)
334
- throw new ConfigError(`Model alias ${JSON.stringify(input)} does not resolve to a usable model.`);
335
- return Object.freeze({
336
- input,
337
- interpretation: "alias",
338
- model: profile.model,
339
- ...(Object.hasOwn(profile, "inference") ? { inference: profile.inference } : {}),
340
- });
341
- }
342
- /** Resolve one alias through the merged installed/user registry. */
343
- export function resolveModelMapAlias(input, engine, map) {
344
- const alias = input.toLowerCase();
345
- const selectedEngine = engine.toLowerCase();
346
- const tier = ownValue(map.aliases, alias);
347
- // A specific platform column always wins; the alias-level wildcard default
348
- // (#946) is only a fallback for a column no layer ever set explicitly.
349
- const profile = ownValue(tier, selectedEngine) ?? ownValue(tier, WILDCARD_ENGINE_KEY);
350
- if (profile !== undefined)
351
- return selectionFromProfile(input, profile);
352
- const knownAliasUnmappedForEngine = tier !== undefined;
353
- if (knownAliasUnmappedForEngine) {
354
- warnOnce(`model-map-alias-no-engine-mapping:${alias}:${selectedEngine}`, `[akm] Model alias ${JSON.stringify(input)} has no mapping for engine ${JSON.stringify(engine)}; using ${JSON.stringify(input)} as the literal model name. Add $.aliases.${alias}.${engine} to models.json to map it.`);
355
- }
356
- return Object.freeze({
357
- input,
358
- interpretation: "exact",
359
- model: input,
360
- ...(knownAliasUnmappedForEngine ? { unmappedForEngine: true } : {}),
361
- });
362
- }
363
- export function userModelMapPath(env = process.env) {
364
- return path.join(getConfigDir(env), "models.json");
365
- }
366
- function modelMapFileError(label, filePath, action) {
367
- return new ConfigError(`${label} could not be ${action}: ${filePath}.`, "INVALID_CONFIG_FILE", `Ensure ${filePath} is a readable regular file owned by the expected user.`);
368
- }
369
- /**
370
- * Read one models.json. `optional` treats absence (including a dangling
371
- * symlink) as "no file"; anything that is not a regular file is refused
372
- * rather than read, so a FIFO cannot hang the CLI.
373
- */
374
- function readModelMapFile(filePath, label, optional) {
375
- let stat;
376
- try {
377
- stat = fs.statSync(filePath);
378
- }
379
- catch (error) {
380
- if (optional && error?.code === "ENOENT")
381
- return undefined;
382
- throw modelMapFileError(label, filePath, optional ? "inspected" : "found");
383
- }
384
- if (!stat.isFile()) {
385
- throw new ConfigError(`Unable to read ${label.toLowerCase()} because it is not a readable regular file: ${filePath}.`, "INVALID_CONFIG_FILE", "Replace it with a readable regular models.json file, or a symlink to one.");
386
- }
387
- try {
388
- return fs.readFileSync(filePath, "utf8");
389
- }
390
- catch {
391
- throw modelMapFileError(label, filePath, "read");
392
- }
393
- }
394
- /** Resolve the one authoritative external-asset location for this runtime. */
395
- export function installedModelMapPaths(moduleUrl = import.meta.url) {
396
- const modulePath = fileURLToPath(moduleUrl);
397
- const moduleDirectory = path.dirname(modulePath);
398
- const unbundledModule = path.basename(moduleDirectory) === "agent" && path.basename(path.dirname(moduleDirectory)) === "integrations";
399
- const assetPath = path.resolve(moduleDirectory, unbundledModule ? "../../assets/models.json" : "assets/models.json");
400
- return Object.freeze([assetPath]);
401
- }
402
- /**
403
- * Standalone bootstrap only. `scripts/akm-standalone.ts` derives these bytes
404
- * from the authoritative JSON import that Bun embeds into the executable.
405
- */
406
- export function registerStandaloneModelMapFallback(text) {
407
- standaloneInstalledModelMapText = text;
408
- }
409
- /** Load installed bytes lazily so health can report a missing/bad package asset. */
410
- export function readInstalledModelMapText(options = {}) {
411
- if (options.installedText !== undefined)
412
- return options.installedText;
413
- // Registration occurs only in the compiled standalone bootstrap. Once set,
414
- // the embedded authority must win over any mutable file beside the binary.
415
- if (standaloneInstalledModelMapText !== undefined)
416
- return standaloneInstalledModelMapText;
417
- const candidates = installedModelMapPaths();
418
- for (const candidate of candidates) {
419
- const external = readModelMapFile(candidate, "Installed models.json", true);
420
- if (external !== undefined)
421
- return external;
422
- }
423
- throw new ConfigError(`Installed models.json is missing from this AKM installation (checked: ${candidates.join(", ")}).`, "INVALID_CONFIG_FILE", "Reinstall AKM so its dist/assets/models.json package asset is restored.");
424
- }
425
- /** Read and parse the installed authority plus the optional operator overlay, without resolving them. */
426
- export function loadModelMapLayers(options = {}) {
427
- const installed = parseModelMapLayer(readInstalledModelMapText(options), "installed models.json");
428
- const userPath = userModelMapPath(options.env);
429
- const userText = readModelMapFile(userPath, "User models.json", true);
430
- const user = userText !== undefined ? parseModelMapLayer(userText, `user models.json (${userPath})`) : undefined;
431
- return Object.freeze({ installed, ...(user ? { user } : {}), userPath, userStatus: user ? "loaded" : "absent" });
432
- }
433
- /** Load the installed authority plus the optional operator overlay. */
434
- export function loadModelMap(options = {}) {
435
- const { installed, user, userPath, userStatus } = loadModelMapLayers(options);
436
- return Object.freeze({ map: mergeModelMapLayers(installed, user, options.engines), userPath, userStatus });
437
- }
438
- function targetExistsError(target, detail) {
439
- return new UsageError(`${detail}: ${target}`, "RESOURCE_ALREADY_EXISTS", "Move the existing target aside, then retry. Use --overwrite only for a regular file you intend to replace.");
440
- }
441
- function copyIoError(target, action) {
442
- return new ConfigError(`Unable to ${action} user models.json at ${target}.`, "INVALID_CONFIG_FILE", "Check the configuration directory ownership and permissions, then retry.");
443
- }
444
- /** `akm models copy-defaults`: copy the validated installed map into the config directory. */
445
- export function copyDefaultModelMap(options = {}) {
446
- const text = readInstalledModelMapText(options);
447
- mergeModelMapLayers(parseModelMapLayer(text, "installed models.json"));
448
- const target = userModelMapPath(options.env);
449
- let existing;
450
- try {
451
- existing = fs.lstatSync(target);
452
- }
453
- catch (error) {
454
- if (error?.code !== "ENOENT")
455
- throw copyIoError(target, "inspect");
456
- }
457
- if (existing && !existing.isFile()) {
458
- throw targetExistsError(target, "Refusing to replace a non-regular models.json target");
459
- }
460
- if (existing && options.overwrite !== true)
461
- throw targetExistsError(target, "User models.json already exists");
462
- try {
463
- fs.mkdirSync(path.dirname(target), { recursive: true, mode: 0o700 });
464
- }
465
- catch {
466
- throw copyIoError(target, "create the configuration directory for");
467
- }
468
- try {
469
- writeFileAtomic(target, text, 0o600);
470
- }
471
- catch {
472
- throw copyIoError(target, "write");
473
- }
474
- return { path: target, copied: true, overwritten: existing !== undefined };
475
- }
@@ -1,107 +0,0 @@
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
- * Aider CLI agent command builder (P2, plan §"The adapter contract" step 2 /
6
- * §"Capability matrix").
7
- *
8
- * Translates a platform-agnostic {@link AgentDispatchRequest} into the exact
9
- * headless argv the `aider` CLI expects. Per the capability matrix the
10
- * headless invocation is:
11
- *
12
- * aider -m "<p>" --yes-always
13
- *
14
- * with `--model <m>` for model selection, NO structured-output mode (Aider is
15
- * the "none" tier — prompt-injected schema + embedded-JSON extraction), and
16
- * NO session flag (resume is chat-history files, not an id).
17
- *
18
- * Platform-specific mapping decisions (all localized here, per the adapter
19
- * contract):
20
- *
21
- * - **prompt** — `--message` is Aider's one-shot non-interactive mode (the
22
- * matrix's `-m`; the long form is used for self-documenting argv). Unlike
23
- * claude/codex/pi there is NO positional prompt and NO `--` end-of-options
24
- * separator to hide behind: the prompt is a *flag value*. The glued
25
- * `--message=<payload>` form is therefore used so a payload that begins
26
- * with `-`/`--` binds to the flag lexically and can never be parsed as a
27
- * separate option by Aider's argument parser.
28
- * - **--yes-always** — always emitted: auto-confirms every interactive
29
- * prompt (create file? run command? …), which is what makes a captured,
30
- * unattended run possible. This is the matrix's documented headless shape.
31
- * - **--no-pretty** — always emitted: disables colored/pretty terminal
32
- * rendering so captured stdout is clean text for `./result-extractor.ts`
33
- * (the same "dispatch is the captured path" reasoning as the Claude
34
- * builder's unconditional `--print` and Codex's unconditional `--json`).
35
- * - **systemPrompt** — Aider has no system-prompt flag (its nearest concept
36
- * is conventions files via `--read`, which take a path, not text). Folded
37
- * into the message payload — system text first, blank line, then the task —
38
- * mirroring the codex builder's treatment.
39
- * - **schema** — the matrix places Aider in the "via prompt+validate" tier
40
- * with *no* structured output mode at all (plan §"Structured-output
41
- * normalization", tier "none"): there is no schema flag and no JSON output
42
- * flag, so the JSON Schema reaches it only as the instruction the shared
43
- * request lowering appends to the prompt. Downstream, embedded-JSON
44
- * extraction + the engine's shared retry-until-valid loop supply the
45
- * validation Aider lacks. No temp schema file is written — that is Codex's
46
- * native-schema mechanism (`--output-schema`), which Aider does not have.
47
- * - **tools** — deliberately unconsumed. Aider has no per-tool allowlist
48
- * flag; tool-ish behaviour is governed by its own switches (`--yes-always`,
49
- * git integration, shell-command confirmation). A restrictive policy is
50
- * therefore dropped rather than approximated — never silently widened.
51
- * - **resume/session** — NOT expressible: Aider persists context in
52
- * chat-history files (`.aider.chat.history.md`), not session ids, so there
53
- * is no flag-shaped resume to describe and the extractor
54
- * never yields a `sessionId`. akm's `workflow_run_units` remains the
55
- * durable source of truth; resume works even against a harness with no
56
- * session model (plan §"Session, MCP, and identity across harnesses" —
57
- * Aider is the plan's named example).
58
- * - **inference** — not translated: the shared lowering reports each field of
59
- * the request's inference as untranslated.
60
- *
61
- * Registered: `aiderBuilder` is `AiderHarness.agentBuilder` (`./index.ts`),
62
- * one of the ten harnesses `HARNESS_REGISTRY` constructs
63
- * (`harnesses/index.ts`); `agent/builders.ts` derives `BUILTIN_BUILDERS` from
64
- * that registry, so this builder is reachable under the `"aider"` platform
65
- * name without any further wiring.
66
- */
67
- import { resolveDispatchModel } from "../../agent/builder-shared.js";
68
- import { createAgentRequestLowerer } from "../../agent/request-lowering.js";
69
- /** Canonical harness/platform id used for model-alias resolution. */
70
- export const AIDER_PLATFORM = "aider";
71
- /** Assemble the `--message` payload: optional system text, then the task prompt. */
72
- function buildMessagePayload(req) {
73
- const sections = [];
74
- if (req.systemPrompt)
75
- sections.push(req.systemPrompt);
76
- sections.push(req.prompt);
77
- return sections.join("\n\n");
78
- }
79
- /**
80
- * Aider builder.
81
- * Command shape:
82
- * aider [--model <m>] --yes-always --no-pretty --message=<[system\n\n]prompt>
83
- */
84
- export const aiderBuilder = {
85
- platform: AIDER_PLATFORM,
86
- personaChannel: "prompt",
87
- lower: createAgentRequestLowerer({
88
- adapter: AIDER_PLATFORM,
89
- personaChannel: "prompt",
90
- tools: "none",
91
- }),
92
- build(profile, req) {
93
- const args = [...profile.args];
94
- if (req.model) {
95
- const resolved = resolveDispatchModel(req, profile, AIDER_PLATFORM);
96
- args.push("--model", resolved);
97
- }
98
- // Headless essentials (matrix shape): auto-confirm everything, and keep
99
- // captured stdout free of pretty/ANSI rendering for the extractor.
100
- args.push("--yes-always");
101
- args.push("--no-pretty");
102
- // Glued form: the payload is a flag VALUE (no positional prompt exists),
103
- // so `=` binding keeps a dash-leading payload from parsing as an option.
104
- args.push(`--message=${buildMessagePayload(req)}`);
105
- return { argv: [profile.bin, ...args] };
106
- },
107
- };
@@ -1,53 +0,0 @@
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
- * ANSI escape sequences (CSI color/cursor codes). Defensive only: the builder
6
- * always passes `--no-pretty`, but a user profile may override that.
7
- * Constructed from a char code so no literal control character appears in
8
- * source (lint-friendly, same bytes).
9
- */
10
- const ANSI_ESCAPE_RE = new RegExp(`${String.fromCharCode(27)}\\[[0-9;?]*[ -/]*[@-~]`, "g");
11
- /**
12
- * Aider's own announcement lines — banner, model/repo configuration echo,
13
- * chat-history notices, edit/commit/usage reports. All patterns are anchored
14
- * at line start and match documented phrasings only; anything else is treated
15
- * as reply content.
16
- */
17
- const NOISE_LINE_PATTERNS = [
18
- /^aider v\d/, // version banner
19
- /^(Main model|Weak model|Editor model|Model):\s/, // model announcements
20
- /^Git repo:\s/, // repo detection
21
- /^Repo-map:\s/, // repo-map status
22
- /^Added .+ to the chat\.?$/, // file add notices
23
- /^Restored previous conversation history\.?$/, // chat-history reload notice
24
- /^Use \/help\b/, // onboarding hint line
25
- /^Tokens: .+/, // usage/cost footer
26
- /^Cost: .+/, // standalone cost footer
27
- /^Applied edit to .+/, // edit application notices
28
- /^Commit [0-9a-f]{6,}\b/, // auto-commit notices
29
- /^You can use \/undo\b/, // undo hint after auto-commit
30
- /^[─━-]{4,}$/, // ── / ━━ / ---- separator rules
31
- ];
32
- function isNoiseLine(line) {
33
- return NOISE_LINE_PATTERNS.some((pattern) => pattern.test(line));
34
- }
35
- /**
36
- * Normalize a raw aider run result into `{ text, sessionId? }`.
37
- * See the module doc for the stdout shape handled.
38
- */
39
- export const aiderResultExtractor = (result) => {
40
- const raw = result.stdout.replace(ANSI_ESCAPE_RE, "").trim();
41
- const kept = raw
42
- .split("\n")
43
- .filter((line) => !isNoiseLine(line.trim()))
44
- .join("\n")
45
- .trim();
46
- // Never return empty text when stdout had content: an all-noise filter
47
- // outcome means the patterns over-matched for this capture, so fall back to
48
- // the full trimmed stdout (downstream parsing still gets material).
49
- const text = kept.length > 0 ? kept : raw;
50
- // No session model (chat-history files, not ids): only a spawn-layer id
51
- // passes through; output never supplies one.
52
- return result.sessionId === undefined ? { text } : { text, sessionId: result.sessionId };
53
- };