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,28 +1,24 @@
1
1
  // This Source Code Form is subject to the terms of the Mozilla Public
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
- import { deepMergeConfig } from "../../core/config/deep-merge.js";
5
4
  import { ConfigError } from "../../core/errors.js";
6
- import { DURATION_UNITS, parseDuration } from "../../core/time.js";
7
- import { EXECUTION_MAX_TIMEOUT_MS } from "../../execution/limits.js";
5
+ import { PORTABLE_INFERENCE_KEYS } from "../../core/llm-inference.js";
8
6
  import { createInlineResolvedCommand, createResolvedExecutionRequest, decodeResolvedExecutionRequest, } from "../../execution/resolved-request.js";
9
- import { cloneToolSelection, isPortableExecutionAgentSelector, MODEL_WORK_POLICY_ID, } from "../../execution/source.js";
7
+ import { isPortableExecutionAgentSelector } from "../../execution/source.js";
10
8
  import { getHarness } from "../harnesses/index.js";
11
- import { DEFAULT_LLM_TIMEOUT_MS } from "./config.js";
12
- import { FALLBACK_ENGINE_NAME, fallbackEngineConfig, NO_ENGINE_MESSAGE_SUFFIX, NO_ENGINE_REMEDY, } from "./engine-fallback.js";
13
- import { configuredEngine, resolveEngine } from "./engine-resolution.js";
14
- import { engineModelAndInference, loadModelMap, resolveModelMapAlias } from "./model-map.js";
15
- import { extensionFields, hasToolSelection, untranslated } from "./request-lowering.js";
9
+ import { harnessProfile, runtimeProfile } from "./profiles.js";
10
+ import { lowerRequest, untranslated } from "./request-lowering.js";
11
+ import { mergeLayerInference, parseTimeout, resolveTarget, withReasoningEffort } from "./resolution.js";
16
12
  import { decodeFrozenRunnerSpec } from "./runner.js";
17
- const LLM_INFERENCE_FIELDS = [
18
- "temperature",
19
- "maxTokens",
20
- "supportsJsonSchema",
21
- "extraParams",
22
- "contextLength",
23
- "enableThinking",
24
- "reasoningEffort",
25
- ];
13
+ import { agentRuntime } from "./runtime.js";
14
+ /** The farthest layer of a call: the alias its kind of work asks for until something nearer names a model. */
15
+ export function shippedAlias(alias) {
16
+ return { id: "shipped-alias", kind: "installation", values: { model: alias } };
17
+ }
18
+ /** The layer for a call's own flags and arguments: nearer than every other. */
19
+ export function currentLayer(values) {
20
+ return { id: "current-invocation", kind: "current", values };
21
+ }
26
22
  function has(values, key) {
27
23
  return (values !== null &&
28
24
  values !== undefined &&
@@ -37,273 +33,41 @@ function nearest(layers, key) {
37
33
  }
38
34
  return undefined;
39
35
  }
40
- function explicit(layer, via = "explicit") {
41
- return { layer: layer.id, kind: layer.kind, via };
42
- }
43
- function inferenceOf(source) {
44
- const out = {};
45
- for (const key of LLM_INFERENCE_FIELDS)
46
- if (source[key] !== undefined)
47
- out[key] = source[key];
48
- return Object.keys(out).length > 0 ? out : undefined;
36
+ function explicit(layer) {
37
+ return { layer: layer.id, kind: layer.kind, via: layer.kind === "installation" ? "default" : "explicit" };
49
38
  }
50
- /** A configured engine's model, inference, timeout and workspace, and where its aliases resolve. */
51
- function engineDefaults(name, engine, config) {
52
- const own = engineModelAndInference(engine);
53
- const values = {
54
- ...(own.model !== undefined ? { model: own.model } : {}),
55
- ...(own.inference !== undefined ? { inference: own.inference } : {}),
56
- ...(Object.hasOwn(engine, "timeoutMs") ? { timeout: engine.timeoutMs ?? null } : {}),
57
- };
58
- if (engine.kind === "llm")
59
- return { kind: "llm", platform: engine.provider ?? name, modelMapKey: name, values };
60
- if (engine.workspace !== undefined)
61
- values.workspace = engine.workspace;
62
- if (engine.agent !== undefined)
63
- values.agent = engine.agent;
64
- if (engine.platform !== "opencode-sdk") {
65
- return { kind: "agent", platform: engine.platform, modelMapKey: engine.platform, values };
66
- }
67
- // An SDK engine runs its own `llmEngine`'s model/inference/timeout unless it sets its own. With no
68
- // `llmEngine` it has no fallback, and opencode picks the model: `defaults.llmEngine` is not borrowed.
69
- const fallbackName = engine.llmEngine;
70
- const fallback = fallbackName && config.engines && Object.hasOwn(config.engines, fallbackName)
71
- ? config.engines[fallbackName]
72
- : undefined;
73
- if (fallback?.kind !== "llm" || !fallbackName) {
74
- return { kind: "sdk", platform: "opencode-sdk", modelMapKey: "opencode-sdk", values };
75
- }
76
- const inherited = engineModelAndInference(fallback);
77
- return {
78
- kind: "sdk",
79
- platform: "opencode-sdk",
80
- modelMapKey: own.model === undefined ? fallbackName : "opencode-sdk",
81
- values: {
82
- ...(inherited.model !== undefined ? { model: inherited.model } : {}),
83
- ...(inherited.inference !== undefined ? { inference: inherited.inference } : {}),
84
- ...values,
85
- timeout: Object.hasOwn(engine, "timeoutMs")
86
- ? (engine.timeoutMs ?? null)
87
- : Object.hasOwn(fallback, "timeoutMs")
88
- ? (fallback.timeoutMs ?? null)
89
- : DEFAULT_LLM_TIMEOUT_MS,
90
- },
91
- };
92
- }
93
- /** The same defaults read back from an already-resolved runner. */
94
- function runnerDefaults(runner) {
95
- const timeout = Object.hasOwn(runner, "timeoutMs") ? { timeout: runner.timeoutMs ?? null } : {};
96
- if (runner.kind === "llm") {
97
- const inference = inferenceOf(runner.connection);
98
- return {
99
- kind: "llm",
100
- platform: runner.connection.provider ?? runner.engine,
101
- modelMapKey: runner.engine,
102
- values: {
103
- ...(runner.connection.model !== undefined ? { model: runner.connection.model } : {}),
104
- ...(inference ? { inference } : {}),
105
- ...timeout,
106
- },
107
- };
108
- }
109
- const platform = runner.profile.platform ?? runner.profile.name;
110
- const fallback = runner.kind === "sdk" ? runner.fallbackConnection : undefined;
111
- const model = runner.profile.model ?? fallback?.model;
112
- const fallbackInference = fallback ? inferenceOf(fallback) : undefined;
113
- const inference = fallbackInference !== undefined || runner.profile.inference !== undefined
114
- ? { ...fallbackInference, ...runner.profile.inference }
115
- : undefined;
116
- return {
117
- kind: runner.kind,
118
- platform,
119
- modelMapKey: platform,
120
- values: {
121
- ...(model !== undefined ? { model } : {}),
122
- ...(inference ? { inference } : {}),
123
- ...timeout,
124
- ...(runner.profile.workspace !== undefined ? { workspace: runner.profile.workspace } : {}),
125
- ...(runner.profile.agent !== undefined ? { agent: runner.profile.agent } : {}),
126
- },
127
- };
128
- }
129
- /**
130
- * The engine, from an ordered list: the nearest layer that names one, then
131
- * `defaults.engine`, then the implicit opencode-sdk fallback when its binary
132
- * is present. A named engine that is not configured is an error, never rescued.
133
- */
134
- function selectEngine(config, layers) {
135
- for (let index = layers.length - 1; index >= 0; index -= 1) {
136
- const layer = layers[index];
137
- const name = layer?.values.engine;
138
- if (layer && typeof name === "string" && name.length > 0) {
139
- return { name, engine: configuredEngine(name, config), provenance: explicit(layer), fallback: false };
39
+ /** Record which layer set each inference key, mirroring {@link mergeLayerInference}. */
40
+ function recordInferenceProvenance(layers, provenance) {
41
+ for (const layer of layers) {
42
+ if (!has(layer.values, "inference"))
43
+ continue;
44
+ const source = explicit(layer);
45
+ provenance["/inference"] = source;
46
+ const inference = layer.values.inference ?? null;
47
+ if (inference === null) {
48
+ for (const key of Object.keys(provenance))
49
+ if (key.startsWith("/inference/"))
50
+ delete provenance[key];
51
+ continue;
140
52
  }
141
- }
142
- const installed = config.defaults?.engine;
143
- if (installed) {
144
- return {
145
- name: installed,
146
- engine: configuredEngine(installed, config),
147
- provenance: { layer: "installation-defaults", kind: "installation", via: "explicit" },
148
- fallback: false,
149
- };
150
- }
151
- const fallback = fallbackEngineConfig(config);
152
- if (fallback) {
153
- return {
154
- name: FALLBACK_ENGINE_NAME,
155
- engine: fallback,
156
- provenance: { layer: FALLBACK_ENGINE_NAME, kind: "fallback", via: "fallback" },
157
- fallback: true,
158
- };
159
- }
160
- throw new ConfigError(`Execution ${NO_ENGINE_MESSAGE_SUFFIX}`, "INVALID_CONFIG_FILE", NO_ENGINE_REMEDY);
161
- }
162
- function parseTimeout(value) {
163
- if (value === null)
164
- return null;
165
- const milliseconds = typeof value === "string" ? parseDuration(value, DURATION_UNITS) : value;
166
- if (typeof milliseconds !== "number" ||
167
- !Number.isInteger(milliseconds) ||
168
- milliseconds < 0 ||
169
- milliseconds > EXECUTION_MAX_TIMEOUT_MS) {
170
- throw new ConfigError("Execution timeout must be null, a whole number of milliseconds, or a duration such as 20m.", "INVALID_CONFIG_FILE");
171
- }
172
- return milliseconds;
173
- }
174
- /** Tool names a selection asks for; `undefined` when a structured policy cannot be reduced to names. */
175
- function requestedToolNames(tools) {
176
- if (typeof tools === "string") {
177
- return tools
178
- .split(",")
179
- .map((tool) => tool.trim())
180
- .filter(Boolean);
181
- }
182
- if (Array.isArray(tools))
183
- return tools.map((tool) => tool.trim()).filter(Boolean);
184
- const policy = tools;
185
- if (Object.values(policy).some((value) => typeof value !== "boolean"))
186
- return undefined;
187
- return Object.keys(policy).filter((tool) => policy[tool] === true);
188
- }
189
- /**
190
- * Assets may only narrow the host's `execution.allowedTools`; without a config
191
- * nothing is allowed. The model-work policy is akm's own and always allowed:
192
- * it confines an engine more tightly than leaving tools unset does.
193
- */
194
- function authorizeTools(tools, config, modelWork) {
195
- if (modelWork) {
196
- return {
197
- status: "allowed",
198
- reason: "The model-work tool policy is akm's own.",
199
- policy: { id: MODEL_WORK_POLICY_ID },
200
- };
201
- }
202
- if (!hasToolSelection(tools))
203
- return { status: "not-required" };
204
- if (!config) {
205
- return {
206
- status: "denied",
207
- reason: "Selected tools require an explicit machine/user authorization policy.",
208
- policy: { id: "unconfigured" },
209
- };
210
- }
211
- const allowed = new Set(config.execution?.allowedTools ?? []);
212
- const names = requestedToolNames(tools);
213
- const permitted = allowed.has("*") || names?.every((tool) => allowed.has(tool)) === true;
214
- return permitted
215
- ? {
216
- status: "allowed",
217
- reason: "Selected tools were authorized by operator policy.",
218
- policy: { id: "config-execution-allowed-tools" },
53
+ for (const key of Object.keys(withReasoningEffort(inference))) {
54
+ provenance[`/inference/${key.replaceAll("~", "~0").replaceAll("/", "~1")}`] = source;
219
55
  }
220
- : {
221
- status: "denied",
222
- reason: "Selected tools are not authorized by operator policy.",
223
- policy: { id: "config-execution-allowed-tools" },
224
- };
225
- }
226
- function withInference(connection, inference) {
227
- const out = { ...connection };
228
- for (const key of LLM_INFERENCE_FIELDS)
229
- delete out[key];
230
- if (inference)
231
- for (const key of LLM_INFERENCE_FIELDS)
232
- if (inference[key] !== undefined)
233
- out[key] = inference[key];
234
- return out;
235
- }
236
- /** Apply a request's model, inference, timeout and workspace to its runner. Idempotent. */
237
- function applyRequest(base, request) {
238
- const timeout = Object.hasOwn(request.runtime, "timeoutMs")
239
- ? { timeoutMs: request.runtime.timeoutMs ?? null }
240
- : Object.hasOwn(base, "timeoutMs")
241
- ? { timeoutMs: base.timeoutMs }
242
- : {};
243
- const model = request.model?.resolved;
244
- if (base.kind === "llm") {
245
- const { model: _model, ...connection } = base.connection;
246
- return {
247
- ...base,
248
- connection: withInference({ ...connection, ...(model !== undefined ? { model } : {}) }, request.inference),
249
- ...timeout,
250
- };
251
56
  }
252
- const { model: _model, workspace: _workspace, inference: ownInference, ...profile } = base.profile;
253
- const workspace = request.runtime.workspace;
254
- const inference = Object.hasOwn(request, "inference") ? request.inference : ownInference;
255
- const next = {
256
- ...base,
257
- profile: {
258
- ...profile,
259
- ...(model !== undefined ? { model } : {}),
260
- ...(typeof workspace === "string" ? { workspace } : {}),
261
- ...(inference ? { inference } : {}),
262
- },
263
- ...timeout,
264
- };
265
- if (next.kind === "sdk" && next.fallbackConnection) {
266
- let fallback = { ...next.fallbackConnection };
267
- if (request.model === null)
268
- delete fallback.model;
269
- if (Object.hasOwn(request, "inference"))
270
- fallback = withInference(fallback, request.inference);
271
- next.fallbackConnection = fallback;
272
- }
273
- return next;
274
- }
275
- /**
276
- * Reasoning effort has one word in a request: `reasoningEffort`, which is what
277
- * engines, opencode and the LLM request body call it. `effort` is the same
278
- * setting as a `models.json` alias or an asset's `effort:` frontmatter spells
279
- * it, and becomes `reasoningEffort` here, in the one place every layer's
280
- * inference is merged, so the nearest layer wins whichever word it used. When
281
- * one inference object has both, `reasoningEffort` wins.
282
- */
283
- function withReasoningEffort(inference) {
284
- if (!Object.hasOwn(inference, "effort"))
285
- return inference;
286
- const { effort, ...rest } = inference;
287
- return Object.hasOwn(rest, "reasoningEffort") ? rest : { ...rest, reasoningEffort: effort };
288
57
  }
289
- function mergeInference(current, layerInference, source, provenance) {
290
- provenance["/inference"] = source;
291
- if (layerInference === null) {
292
- for (const key of Object.keys(provenance))
293
- if (key.startsWith("/inference/"))
294
- delete provenance[key];
295
- return null;
296
- }
297
- const next = withReasoningEffort(layerInference);
298
- for (const key of Object.keys(next)) {
299
- provenance[`/inference/${key.replaceAll("~", "~0").replaceAll("/", "~1")}`] = source;
300
- }
301
- return deepMergeConfig(current ?? {}, next);
58
+ /** A journaled runner under this call's layers: the nearest layer's timeout and (exact) model replace its own. */
59
+ function applyLayers(runner, layers) {
60
+ const timeout = nearest(layers, "timeout")?.values.timeout;
61
+ const model = nearest(layers, "model")?.values.model;
62
+ return {
63
+ ...runner,
64
+ ...(timeout !== undefined ? { timeoutMs: parseTimeout(timeout) } : {}),
65
+ ...(typeof model === "string" && model ? { model } : {}),
66
+ };
302
67
  }
303
68
  /**
304
- * Resolve one execution: select the engine, merge its defaults with the
305
- * caller's layers (nearest wins), expand a model alias, authorize tools, and
306
- * apply the result to the engine's runner.
69
+ * Resolve one execution: pick where it runs and the model (`resolveTarget`), merge
70
+ * the caller's other layers (nearest wins), and build the request for that target.
307
71
  */
308
72
  export function resolveExecution(input) {
309
73
  const command = input.command ??
@@ -312,88 +76,55 @@ export function resolveExecution(input) {
312
76
  ...(input.argumentInput !== undefined ? { argumentInput: input.argumentInput } : {}),
313
77
  content: input.content ?? "",
314
78
  });
315
- const callerLayers = [
316
- ...(input.agentLayer ? [{ ...input.agentLayer, kind: "agent" }] : []),
317
- {
318
- id: input.commandLayer?.id ?? "inline-command",
319
- kind: "command",
320
- values: input.commandLayer?.values ?? {},
321
- },
322
- ...(input.invocationDefaults
323
- ? [{ id: "invocation-defaults", kind: "invocation-defaults", values: input.invocationDefaults }]
324
- : []),
325
- ...(input.current ? [{ id: "current-invocation", kind: "current", values: input.current }] : []),
326
- ];
79
+ const layers = input.layers ?? [];
80
+ const modelWork = input.modelWork === true;
81
+ let runner;
82
+ if (input.runner)
83
+ runner = applyLayers(input.runner, layers);
84
+ else if (input.config) {
85
+ runner = resolveTarget({ config: input.config, modelWork, layers: layers.map((layer) => layer.values) });
86
+ }
87
+ else
88
+ throw new TypeError("resolveExecution needs a config or a runner");
327
89
  const provenance = {};
328
- let name;
329
- let defaults;
330
- let base;
331
- let fallback = false;
332
- if (input.runner) {
333
- name = input.runner.engine;
334
- defaults = runnerDefaults(input.runner);
335
- base = input.runner;
336
- provenance.engine = { layer: "installation-defaults", kind: "installation", via: "explicit" };
337
- }
338
- else {
339
- if (!input.config)
340
- throw new TypeError("resolveExecution needs a config or a runner");
341
- const selected = selectEngine(input.config, callerLayers);
342
- name = selected.name;
343
- fallback = selected.fallback;
344
- defaults = engineDefaults(name, selected.engine, input.config);
345
- base = resolveEngine(name, input.config, selected.engine);
346
- provenance.engine = selected.provenance;
347
- }
348
- const layers = [{ id: name, kind: "engine", values: defaults.values }, ...callerLayers];
90
+ const targetLayer = [...layers]
91
+ .reverse()
92
+ .find((layer) => has(layer.values, "connection") || has(layer.values, "harness") || has(layer.values, "engine"));
93
+ provenance.target = targetLayer
94
+ ? explicit(targetLayer)
95
+ : { layer: "installation-defaults", kind: "installation", via: "explicit" };
349
96
  provenance.command = { layer: command.source?.ref ?? "inline", kind: "command", via: "source" };
350
97
  let persona = input.persona;
351
- // The engine's own `agent` is only a default for a request that names none: it never replaces a
98
+ // The harness's own `agent` is only a default for a request that names none: it never replaces a
352
99
  // persona, and model work keeps its confined agent.
353
- const engineAgentApplies = !persona && input.modelWork !== true;
354
- let agentLayer = nearest(layers, "agent");
355
- if (agentLayer?.kind === "engine" && !engineAgentApplies)
356
- agentLayer = undefined;
357
- const agent = agentLayer?.values.agent;
100
+ let agent;
101
+ const agentLayer = nearest(layers, "agent");
358
102
  if (agentLayer) {
103
+ agent = agentLayer.values.agent;
359
104
  provenance.agent = explicit(agentLayer);
360
105
  // A native selector (or an explicit null) replaces any persona.
361
106
  if (typeof agent !== "string" || !isPortableExecutionAgentSelector(agent))
362
107
  persona = null;
363
108
  }
109
+ else if (runner.kind === "harness" && runner.agent !== undefined && !persona && !modelWork) {
110
+ agent = runner.agent;
111
+ provenance.agent = { layer: runner.name, kind: "installation", via: "explicit" };
112
+ }
364
113
  if (persona)
365
114
  provenance.persona = { layer: persona.source.ref, kind: "agent", via: "source" };
366
115
  const modelLayer = nearest(layers, "model");
367
- let model;
368
- let aliasInference;
369
- if (modelLayer) {
116
+ if (modelLayer)
370
117
  provenance.model = explicit(modelLayer);
371
- const value = modelLayer.values.model;
372
- if (value === null)
373
- model = null;
374
- else if (typeof value === "string" && value.length > 0) {
375
- const map = input.modelMap ?? (input.config ? loadModelMap({ engines: input.config.engines }).map : undefined);
376
- const selection = map
377
- ? resolveModelMapAlias(value, defaults.modelMapKey, map)
378
- : { input: value, interpretation: "exact", model: value };
379
- model = { input: selection.input, interpretation: selection.interpretation, resolved: selection.model };
380
- if ("inference" in selection && selection.inference !== undefined)
381
- aliasInference = selection.inference;
382
- }
383
- else {
384
- throw new ConfigError("Resolved model must be null or a non-empty string.", "INVALID_CONFIG_FILE");
385
- }
386
- }
387
- // An alias's inference applies at the layer that chose the alias, under that layer's own inference.
388
- let inference;
389
- for (const layer of layers) {
390
- if (layer === modelLayer && aliasInference !== undefined) {
391
- inference = mergeInference(inference, aliasInference, explicit(layer, "model-alias"), provenance);
392
- }
393
- if (has(layer.values, "inference")) {
394
- inference = mergeInference(inference, layer.values.inference ?? null, explicit(layer), provenance);
395
- }
118
+ const requested = modelLayer?.values.model;
119
+ let model;
120
+ if (runner.model !== undefined) {
121
+ model = {
122
+ model: runner.model,
123
+ ...(typeof requested === "string" && requested !== runner.model ? { alias: requested } : {}),
124
+ };
396
125
  }
126
+ const inference = mergeLayerInference(layers.map((layer) => layer.values));
127
+ recordInferenceProvenance(layers, provenance);
397
128
  const select = (key, field) => {
398
129
  const layer = nearest(layers, key);
399
130
  if (layer)
@@ -401,141 +132,112 @@ export function resolveExecution(input) {
401
132
  return layer;
402
133
  };
403
134
  const schemaLayer = select("outputSchema", "outputSchema");
404
- const modelWork = input.modelWork === true;
405
- const toolsLayer = modelWork ? undefined : select("tools", "tools");
406
135
  const timeoutLayer = select("timeout", "runtime.timeoutMs");
407
136
  const workspaceLayer = select("workspace", "runtime.workspace");
408
137
  const environmentLayer = select("environment", "runtime.environment");
409
- const settingsLayer = select("runtime", "runtime.settings");
410
- const tools = toolsLayer ? cloneToolSelection(toolsLayer.values.tools ?? null, "tools") : undefined;
411
- const authorization = authorizeTools(tools, input.runner ? undefined : input.config, modelWork);
412
- provenance.authorization = {
413
- layer: typeof authorization.policy?.id === "string" ? authorization.policy.id : "not-required",
414
- kind: "authorization",
415
- via: "policy",
416
- };
138
+ const workspace = workspaceLayer
139
+ ? (workspaceLayer.values.workspace ?? null)
140
+ : runner.kind === "harness"
141
+ ? runner.workspace
142
+ : undefined;
143
+ if (!timeoutLayer) {
144
+ const targets = runner.kind === "connection" ? input.config?.connections : input.config?.harnesses;
145
+ const configured = input.config === undefined || Object.hasOwn(targets?.[runner.name] ?? {}, "timeoutMs");
146
+ provenance["runtime.timeoutMs"] = {
147
+ layer: runner.name,
148
+ kind: "installation",
149
+ via: configured ? "explicit" : "default",
150
+ };
151
+ }
417
152
  const request = createResolvedExecutionRequest({
418
153
  command,
419
154
  ...(input.conversation !== undefined ? { conversation: input.conversation } : {}),
420
- ...(agentLayer ? { agent: agent } : {}),
155
+ ...(agent !== undefined ? { agent } : {}),
421
156
  ...(persona !== undefined ? { persona } : {}),
422
- engine: { name, kind: defaults.kind, platform: defaults.platform },
423
- ...(modelLayer ? { model: model ?? null } : {}),
157
+ target: {
158
+ name: runner.name,
159
+ kind: runner.kind,
160
+ ...(runner.kind === "harness" ? { platform: runner.platform } : {}),
161
+ },
162
+ ...(model ? { model } : {}),
424
163
  ...(inference !== undefined ? { inference } : {}),
425
164
  ...(schemaLayer ? { outputSchema: schemaLayer.values.outputSchema ?? null } : {}),
426
- ...(toolsLayer ? { tools } : {}),
427
- authorization,
165
+ modelWork,
428
166
  runtime: {
429
- ...(timeoutLayer ? { timeoutMs: parseTimeout(timeoutLayer.values.timeout ?? null) } : {}),
430
- ...(workspaceLayer ? { workspace: workspaceLayer.values.workspace ?? null } : {}),
167
+ timeoutMs: runner.timeoutMs,
168
+ ...(workspace !== undefined ? { workspace } : {}),
431
169
  ...(environmentLayer ? { environment: environmentLayer.values.environment ?? null } : {}),
432
- ...(settingsLayer ? { settings: settingsLayer.values.runtime ?? null } : {}),
433
170
  },
434
- notices: [],
435
171
  });
436
172
  const sorted = Object.fromEntries(Object.entries(provenance).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)));
437
- return {
438
- request,
439
- runner: applyRequest(base, request),
440
- provenance: sorted,
441
- ...(fallback ? { fallbackEngineName: name } : {}),
442
- };
173
+ return { request, runner, provenance: sorted };
443
174
  }
444
175
  function nonEmpty(value) {
445
176
  return value !== null && value !== undefined && Object.keys(value).length > 0;
446
177
  }
447
- function buildLlm(request, runner, options) {
178
+ function buildChat(request, runner, options) {
448
179
  if (typeof request.agent === "string" && request.persona === null) {
449
- throw new ConfigError(`The direct LLM transport cannot consume native agent selector ${JSON.stringify(request.agent)}.`, "INVALID_CONFIG_FILE");
450
- }
451
- if (hasToolSelection(request.tools)) {
452
- throw new ConfigError("The direct LLM transport cannot enforce the resolved tool policy.", "INVALID_CONFIG_FILE");
180
+ throw new ConfigError(`A direct model call cannot consume native agent selector ${JSON.stringify(request.agent)}.`, "INVALID_CONFIG_FILE");
453
181
  }
454
- const notices = [...request.notices];
182
+ const notices = [];
455
183
  const skip = (field) => {
456
- notices.push(untranslated("llm", field));
184
+ notices.push(untranslated("connection", field));
457
185
  };
458
186
  for (const key of Object.keys(request.inference ?? {}).sort()) {
459
- if (!LLM_INFERENCE_FIELDS.includes(key))
187
+ if (!PORTABLE_INFERENCE_KEYS.includes(key))
460
188
  skip(`inference.${key}`);
461
189
  }
462
190
  const chatOptions = {};
463
- // Sent unless the engine opts out; chatCompletion drops it once if the provider rejects it.
464
- if (request.outputSchema) {
465
- if (runner.connection.supportsJsonSchema !== false)
466
- chatOptions.responseSchema = request.outputSchema;
467
- else
468
- skip("outputSchema");
469
- }
191
+ // Sent unless the call opts out; chatCompletion drops it once if the provider rejects it.
192
+ if (request.outputSchema)
193
+ chatOptions.responseSchema = request.outputSchema;
470
194
  if (request.runtime.workspace)
471
195
  skip("runtime.workspace");
472
196
  if (nonEmpty(request.runtime.environment))
473
197
  skip("runtime.environment");
474
- if (nonEmpty(request.runtime.settings))
475
- skip("runtime.settings");
476
- for (const field of extensionFields(request))
477
- skip(field);
478
198
  const messages = [
479
199
  ...(request.persona ? [{ role: "system", content: request.persona.content }] : []),
480
200
  ...(request.conversation ?? []).map((message) => ({ role: message.role, content: message.content })),
481
201
  { role: "user", content: request.command.content },
482
202
  ];
483
- return { request, runner, prompt: request.command.content, options, messages, chatOptions, notices };
203
+ return { request, runner, options, messages, chatOptions, notices };
484
204
  }
485
205
  /**
486
- * Build a request for its runner's transport: the harness's own builder for
487
- * agent/SDK engines, chat messages for a direct LLM. A request whose tools
488
- * were denied by `execution.allowedTools` stops here.
206
+ * Build a request for its runner's transport: chat messages for model work on a
207
+ * connection; otherwise the harness's own builder, which for agent work on a
208
+ * connection is akm's internal runtime.
489
209
  */
490
210
  export function buildExecution(request, runner) {
491
- if (request.authorization.status === "denied") {
492
- throw new ConfigError(request.authorization.reason ?? "Resolved execution is not authorized by operator policy.", "EXECUTION_NOT_AUTHORIZED");
493
- }
494
- const applied = applyRequest(runner, request);
495
211
  const environment = request.runtime.environment;
212
+ const workspace = request.runtime.workspace;
496
213
  const options = {
497
214
  stdio: "captured",
498
- parseOutput: "text",
499
- ...(applied.timeoutMs !== undefined ? { timeoutMs: applied.timeoutMs } : {}),
500
- ...(applied.kind !== "llm" && applied.profile.workspace ? { cwd: applied.profile.workspace } : {}),
215
+ ...(request.runtime.timeoutMs !== undefined ? { timeoutMs: request.runtime.timeoutMs } : {}),
216
+ ...(typeof workspace === "string" ? { cwd: workspace } : {}),
501
217
  ...(environment ? { env: { ...environment } } : {}),
502
218
  };
503
- if (applied.kind === "llm")
504
- return buildLlm(request, applied, options);
505
- const platform = applied.profile.platform ?? applied.profile.name;
506
- const harness = getHarness(platform);
507
- const lower = harness?.agentBuilder?.lower ?? harness?.executionLowerer?.lower;
508
- if (!lower) {
509
- throw new ConfigError(`Agent platform ${JSON.stringify(platform)} has no registered request builder.`, "INVALID_CONFIG_FILE");
510
- }
511
- const built = lower(applied.profile, request);
219
+ if (runner.kind === "connection" && request.modelWork)
220
+ return buildChat(request, runner, options);
221
+ // Agent work on a connection runs on akm's own runtime, which is no harness and has its own lowering target.
222
+ const profile = runner.kind === "harness" ? harnessProfile(runner) : runtimeProfile(runner);
223
+ const target = runner.kind === "connection" ? agentRuntime.lowering : getHarness(runner.platform);
224
+ if (!target) {
225
+ throw new ConfigError(`Agent platform ${JSON.stringify(profile.platform)} has no registered request builder.`, "INVALID_CONFIG_FILE");
226
+ }
227
+ const built = lowerRequest(target, request);
512
228
  return {
513
229
  request,
514
- runner: applied,
515
- prompt: built.prompt,
230
+ runner,
516
231
  options: { ...options, dispatch: built.dispatch },
517
- notices: [...request.notices, ...built.notices],
232
+ profile,
233
+ notices: built.notices,
518
234
  };
519
235
  }
520
236
  /**
521
237
  * Resume: build a journaled `{ request, runner }` exactly as frozen. Never
522
- * reads config, models.json or credentials, so a config edit after the freeze
523
- * cannot change what a resumed unit runs.
238
+ * reads config or credentials, so a config edit after the freeze cannot change
239
+ * what a resumed unit runs.
524
240
  */
525
241
  export function buildExecutionFromWire(wire) {
526
242
  return buildExecution(decodeResolvedExecutionRequest(wire.request), decodeFrozenRunnerSpec(wire.runner));
527
243
  }
528
- /** Each configured engine's own model selection and models.json column, for `akm health`. */
529
- export function executionEngineDefinitionsFromConfig(config) {
530
- return Object.fromEntries(Object.entries(config.engines ?? {}).map(([name, engine]) => {
531
- const defaults = engineDefaults(name, engine, config);
532
- return [
533
- name,
534
- {
535
- selection: { name, kind: defaults.kind, platform: defaults.platform },
536
- defaults: defaults.values,
537
- modelMapKey: defaults.modelMapKey,
538
- },
539
- ];
540
- }));
541
- }