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
@@ -2,58 +2,41 @@
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  /**
5
- * Run a built execution: the one place credentials are read. A direct LLM
6
- * goes to `chatCompletion`, an agent engine to `runAgent` (the harness builder
7
- * turns the request into argv), an SDK engine to `runOpencodeSdk`. Every
8
- * credential and passthrough value that could reach the child is redacted
9
- * from the result.
5
+ * Run a built execution: the one place credentials are read. Model work on a
6
+ * connection goes to `chatCompletion`, a harness to `runAgent` (the harness
7
+ * builder turns the request into argv), and agent work on a connection to
8
+ * akm's own runtime (`agentRuntime`). The key of the connection a run used is
9
+ * redacted from its result.
10
10
  */
11
11
  import fs from "node:fs";
12
12
  import os from "node:os";
13
13
  import path from "node:path";
14
- import { assertNever } from "../../core/assert.js";
14
+ import { resolveApiKey } from "../../core/config/credentials.js";
15
15
  import { UsageError } from "../../core/errors.js";
16
- import { collectSensitiveValues, isEnvPassthroughValueSafeToExpose, redactSensitiveText, redactSensitiveValue, } from "../../core/redaction.js";
17
- import { MODEL_WORK_POLICY_ID } from "../../execution/source.js";
16
+ import { collectInferredSecretValues, collectSensitiveValues, redactSensitiveText } from "../../core/redaction.js";
18
17
  import { chatCompletion, LlmCallError } from "../../llm/client.js";
19
18
  import { emitLlmUsage } from "../../llm/usage-telemetry.js";
20
- import { getHarness } from "../harnesses/index.js";
21
- import { closeServer as disposeOpencodeSdkServers, runOpencodeSdk } from "../harnesses/opencode-sdk/sdk-runner.js";
22
- import { modelFromArgs } from "./builder-shared.js";
23
- import { lookupApiKeyFileValue, lookupApiKeySecretRefValue, lookupCredentialFromEnv, resolveEngine, } from "./engine-resolution.js";
24
- import { materializeLlmRunnerConnection, materializeSdkFallbackConnection } from "./runner.js";
19
+ import { modelFromArgs } from "../harnesses/harness.js";
20
+ import { harnessProfile, runtimeProfile } from "./profiles.js";
21
+ import { mergeLayerInference, resolveTarget } from "./resolution.js";
22
+ import { agentRuntime } from "./runtime.js";
25
23
  import { runAgent } from "./spawn.js";
26
- const OPERATIONAL_OPTIONS = [
27
- "stdio",
28
- "parseOutput",
29
- "signal",
30
- "envSource",
31
- "spawn",
32
- "setTimeoutFn",
33
- "clearTimeoutFn",
34
- "onEvent",
35
- ];
36
- /** Every value that can reach one dispatch and must never be echoed back: credentials and secret-looking env. */
37
- export function collectDispatchSensitiveValues(runner, opts, envSource = opts.envSource ?? process.env) {
38
- const values = [];
39
- if (runner.kind === "llm") {
40
- values.push(runner.connection.apiKey, lookupCredentialFromEnv(runner.credential, envSource), runner.apiKeyFile ? lookupApiKeyFileValue(runner.apiKeyFile) : undefined, runner.apiKeySecretRef ? lookupApiKeySecretRefValue(runner.apiKeySecretRef) : undefined);
41
- }
42
- else {
43
- if (runner.kind === "sdk") {
44
- values.push(runner.fallbackConnection?.apiKey, lookupCredentialFromEnv(runner.fallbackCredential, envSource), runner.fallbackApiKeyFile ? lookupApiKeyFileValue(runner.fallbackApiKeyFile) : undefined, runner.fallbackApiKeySecretRef ? lookupApiKeySecretRefValue(runner.fallbackApiKeySecretRef) : undefined);
45
- }
46
- values.push(...Object.values(runner.profile.env ?? {}));
47
- for (const name of runner.profile.envPassthrough) {
48
- if (!isEnvPassthroughValueSafeToExpose(name, envSource[name]))
49
- values.push(envSource[name]);
50
- }
51
- }
52
- for (const [name, value] of Object.entries(opts.env ?? {})) {
53
- if (!isEnvPassthroughValueSafeToExpose(name, value))
54
- values.push(value);
55
- }
56
- return collectSensitiveValues(values);
24
+ /**
25
+ * The value a dispatch must never echo back: the key of the connection it runs on.
26
+ * A harness is the user's own program and holds no key of akm's, so there is none.
27
+ * A request's own `env` is configuration; a caller's secret values are redacted
28
+ * through its own sensitive set.
29
+ */
30
+ export function collectDispatchSensitiveValues(runner, envSource = process.env) {
31
+ // The child inherits akm's environment, so a reply that echoes a credential-named variable's value is scrubbed
32
+ // of it, as the connection's own key is.
33
+ const inherited = collectInferredSecretValues(envSource);
34
+ if (runner.kind !== "connection")
35
+ return collectSensitiveValues(inherited);
36
+ return collectSensitiveValues([
37
+ resolveApiKey(runner.apiKey, { connection: runner.name }, runner.endpoint, envSource, true, runner.storedKey !== false),
38
+ ...inherited,
39
+ ]);
57
40
  }
58
41
  function redactResult(result, sensitiveValues) {
59
42
  return {
@@ -61,7 +44,6 @@ function redactResult(result, sensitiveValues) {
61
44
  stdout: redactSensitiveText(result.stdout, sensitiveValues),
62
45
  stderr: redactSensitiveText(result.stderr, sensitiveValues),
63
46
  ...(result.error !== undefined ? { error: redactSensitiveText(result.error, sensitiveValues) } : {}),
64
- ...(result.parsed !== undefined ? { parsed: redactSensitiveValue(result.parsed, sensitiveValues) } : {}),
65
47
  };
66
48
  }
67
49
  function llmFailureReason(error) {
@@ -88,16 +70,14 @@ const USAGE_ERROR_CODES = {
88
70
  llm_rate_limit: "rate_limited",
89
71
  };
90
72
  /**
91
- * The model an agent or SDK dispatch ran: the request's, else the one an agent
92
- * CLI's own `args` select, which its command carries when the request names
93
- * none. An SDK server never sees `args`, so an SDK engine with no model named
94
- * has none to report: opencode picks it.
73
+ * The model an agent or runtime dispatch ran: the request's, else the one a
74
+ * harness's own `args` select, which its command carries when the request names none.
95
75
  */
96
76
  function dispatchedModel({ request, runner }) {
97
- return request.model?.resolved ?? (runner.kind === "agent" ? modelFromArgs(runner.profile.args) : undefined);
77
+ return request.model?.model ?? (runner.kind === "harness" ? modelFromArgs(runner.args) : undefined);
98
78
  }
99
79
  /**
100
- * One usage record for an agent or SDK dispatch, through the same sink and
80
+ * One usage record for an agent or runtime dispatch, through the same sink and
101
81
  * ambient `withLlmStage` attribution as the LLM transport's per-HTTP-attempt
102
82
  * records: the model it ran, and tokens when the runner reported them.
103
83
  */
@@ -117,159 +97,154 @@ function recordDispatchUsage(execution, result) {
117
97
  ...(result.ok ? {} : { errorCode: (result.reason && USAGE_ERROR_CODES[result.reason]) ?? "unknown_error" }),
118
98
  });
119
99
  }
120
- async function dispatchRunner(runner, prompt, opts, seams, llm) {
121
- const envSource = opts.envSource ?? process.env;
122
- const secrets = collectDispatchSensitiveValues(runner, opts, envSource);
100
+ /**
101
+ * The chat connection a connection runner stands for: its key read now, and the
102
+ * portable settings of the runner's choosing layers and of this call's request
103
+ * (the request's nearer), which the client translates. The one place a
104
+ * connection's key is read for a call.
105
+ */
106
+ export function materializeConnection(runner, inference, envSource = process.env) {
107
+ const apiKey = resolveApiKey(runner.apiKey, { connection: runner.name }, runner.endpoint, envSource, false, runner.storedKey !== false);
108
+ const settings = mergeLayerInference([
109
+ { inference: runner.inference },
110
+ { inference: inference },
111
+ ]);
112
+ return {
113
+ endpoint: runner.endpoint,
114
+ model: runner.model,
115
+ request: runner.request,
116
+ ...(settings ? { inference: settings } : {}),
117
+ timeoutMs: runner.timeoutMs,
118
+ ...(runner.contextLength !== undefined ? { contextLength: runner.contextLength } : {}),
119
+ ...(apiKey ? { apiKey } : {}),
120
+ };
121
+ }
122
+ /** `llm` is given for a direct chat; without it a connection runs akm's internal runtime. */
123
+ async function dispatchRunner({ runner, profile, inference, confined }, opts, seams, llm) {
124
+ const secrets = collectDispatchSensitiveValues(runner);
123
125
  let result;
124
- switch (runner.kind) {
125
- case "llm": {
126
- if (!llm)
127
- throw new Error("an llm runner dispatches only a built execution's chat messages");
128
- const connection = materializeLlmRunnerConnection(runner, envSource);
129
- if (connection.apiKey)
130
- secrets.push(connection.apiKey);
131
- result = await llm(connection, opts);
132
- break;
133
- }
134
- case "agent":
135
- result = await (seams.runAgent ?? runAgent)(runner.profile, prompt, opts);
136
- break;
137
- case "sdk": {
138
- const fallbackConnection = materializeSdkFallbackConnection(runner, envSource);
139
- if (fallbackConnection?.apiKey)
140
- secrets.push(fallbackConnection.apiKey);
141
- result = await (seams.runSdk ?? runOpencodeSdk)(runner.profile, prompt, opts, fallbackConnection);
142
- break;
143
- }
144
- default:
145
- return assertNever(runner);
126
+ if (runner.kind === "harness") {
127
+ const harnessRunProfile = profile ?? harnessProfile(runner);
128
+ const spawn = (spawnOpts) => (seams.runAgent ?? runAgent)(harnessRunProfile, spawnOpts);
129
+ result = await (confined ? inScratchDirectory(opts, spawn) : spawn(opts));
130
+ }
131
+ else {
132
+ const connection = materializeConnection(runner, inference);
133
+ if (connection.apiKey)
134
+ secrets.push(connection.apiKey);
135
+ result = llm
136
+ ? await llm(connection, opts)
137
+ : await (seams.runSdk ?? agentRuntime.run)(profile ?? runtimeProfile(runner), opts, connection);
146
138
  }
147
139
  return redactResult(result, collectSensitiveValues(secrets));
148
140
  }
149
141
  /**
150
- * The scratch working directory for one model-work dispatch on an agent or SDK
151
- * engine, so the edit the model-work tool policy grants never reaches the
152
- * stash.
153
- */
154
- function createModelWorkDirectory() {
155
- return fs.mkdtempSync(path.join(os.tmpdir(), "akm-model-work-"));
156
- }
157
- /**
158
- * Run a built execution. Credentials are read here, once per call, and never
159
- * returned. Model work on an agent or SDK engine runs in a scratch working
160
- * directory that akm creates for the dispatch and removes after it, and must
161
- * end with an answer: an agent that stops with none (opencode at its step
162
- * limit, for one) has failed with `parse_error`.
142
+ * Run `work` in a scratch working directory that akm creates for it and removes
143
+ * after, so the edit that model work on a CLI harness cannot be denied never
144
+ * reaches the stash. This function owns the directory's lifecycle: nothing else,
145
+ * the test tooling included, removes an `akm-model-work-*` directory.
163
146
  */
164
- export async function runExecution(execution, options = {}) {
165
- const scratch = execution.runner.kind !== "llm" && execution.request.authorization.policy?.id === MODEL_WORK_POLICY_ID
166
- ? createModelWorkDirectory()
167
- : undefined;
147
+ async function inScratchDirectory(opts, work) {
148
+ const scratch = fs.mkdtempSync(path.join(os.tmpdir(), "akm-model-work-"));
168
149
  try {
169
- return await runBuiltExecution(execution, options, scratch);
150
+ return await work({ ...opts, cwd: scratch });
170
151
  }
171
152
  finally {
172
- if (scratch)
173
- fs.rmSync(scratch, { recursive: true, force: true });
153
+ fs.rmSync(scratch, { recursive: true, force: true });
174
154
  }
175
155
  }
176
- /** A successful reply's text, unwrapped from its harness's framing (claude's `--output-format json` result envelope, for one). */
177
- export function unwrapHarnessReply(runner, result) {
178
- const extractor = runner.kind === "agent" ? getHarness(runner.profile.platform ?? runner.profile.name)?.resultExtractor : undefined;
179
- return extractor ? extractor(result) : { text: result.stdout };
156
+ /** Whether this execution is model work that runs an agent (not a direct chat). */
157
+ function isConfinedAgentWork(execution) {
158
+ return execution.request.modelWork && execution.messages === undefined;
180
159
  }
181
- /** A model-work reply's answer: its harness's framing stripped, and no answer is a `parse_error`. */
160
+ /** A model-work reply must end with an answer: an agent that stops with none (opencode at its step limit, for one) has failed. */
182
161
  function modelWorkAnswer(runner, result) {
183
- const extracted = unwrapHarnessReply(runner, result);
184
- const answer = {
185
- ...result,
186
- stdout: extracted.text,
187
- ...(extracted.sessionId ? { sessionId: extracted.sessionId } : {}),
188
- };
189
- if (extracted.text.trim() !== "")
190
- return answer;
191
- return { ...answer, ok: false, reason: "parse_error", error: `Engine "${runner.engine}" returned no answer.` };
162
+ if (result.stdout.trim() !== "")
163
+ return result;
164
+ return { ...result, ok: false, reason: "parse_error", error: `"${runner.name}" returned no answer.` };
192
165
  }
193
- /** `scratch` is the model-work working directory, set only for model work on an agent or SDK engine. */
194
- async function runBuiltExecution(execution, options, scratch) {
195
- const opts = { ...execution.options, ...(scratch ? { cwd: scratch } : {}) };
196
- const operational = options.runOptions ?? {};
197
- for (const key of OPERATIONAL_OPTIONS) {
198
- if (operational[key] !== undefined)
199
- opts[key] = operational[key];
200
- }
201
- if (options.eventSource !== undefined) {
202
- opts.env = { ...execution.options.env, AKM_EVENT_SOURCE: options.eventSource };
166
+ /**
167
+ * Run a built execution. Credentials are read here, once per call, and never
168
+ * returned. Model work on a harness runs confined: in a scratch working
169
+ * directory, and it must end with an answer: an agent that stops with none
170
+ * (opencode at its step limit, for one) has failed with `parse_error`.
171
+ */
172
+ export async function runExecution(execution, options = {}) {
173
+ const confined = isConfinedAgentWork(execution);
174
+ const opts = { ...execution.options };
175
+ if (options.signal)
176
+ opts.signal = options.signal;
177
+ // Model work is akm's own traffic: its reads and its agents' commands are the improve pipeline's, never the
178
+ // user's demand. A caller's source (a task, say) wins, as does one the unit's own `env:` binds.
179
+ const eventSource = options.eventSource ??
180
+ (execution.request.modelWork && execution.options.env?.AKM_EVENT_SOURCE === undefined ? "improve" : undefined);
181
+ if (eventSource !== undefined) {
182
+ opts.env = { ...execution.options.env, AKM_EVENT_SOURCE: eventSource };
203
183
  }
204
184
  const chat = options.chat ?? chatCompletion;
205
- const llm = async (connection, callOpts) => {
206
- const started = Date.now();
207
- try {
208
- const stdout = await chat(connection, [...(execution.messages ?? [])], {
209
- ...execution.chatOptions,
210
- ...(Object.hasOwn(callOpts, "timeoutMs") ? { timeoutMs: callOpts.timeoutMs } : {}),
211
- ...(callOpts.signal ? { signal: callOpts.signal } : {}),
212
- ...(options.onRetryAttempt ? { onRetryAttempt: options.onRetryAttempt } : {}),
213
- });
214
- return { ok: true, exitCode: 0, stdout, stderr: "", durationMs: Date.now() - started };
215
- }
216
- catch (error) {
217
- // Returned rather than thrown so the redaction below covers provider bodies.
218
- return {
219
- ok: false,
220
- exitCode: null,
221
- stdout: "",
222
- stderr: "",
223
- durationMs: Date.now() - started,
224
- error: error instanceof Error ? error.message : String(error),
225
- reason: llmFailureReason(error),
226
- ...(error instanceof LlmCallError ? { llmErrorCode: error.code } : {}),
227
- };
228
- }
229
- };
230
- let result = await dispatchRunner(execution.runner, execution.prompt, opts, options, llm);
231
- if (scratch !== undefined && result.ok)
185
+ const llm = execution.messages === undefined
186
+ ? undefined
187
+ : async (connection, callOpts) => {
188
+ const started = Date.now();
189
+ try {
190
+ const stdout = await chat(connection, [...(execution.messages ?? [])], {
191
+ ...execution.chatOptions,
192
+ ...(Object.hasOwn(callOpts, "timeoutMs") ? { timeoutMs: callOpts.timeoutMs } : {}),
193
+ ...(callOpts.signal ? { signal: callOpts.signal } : {}),
194
+ ...(options.onRetryAttempt ? { onRetryAttempt: options.onRetryAttempt } : {}),
195
+ });
196
+ return { ok: true, exitCode: 0, stdout, stderr: "", durationMs: Date.now() - started };
197
+ }
198
+ catch (error) {
199
+ // Returned rather than thrown so the redaction below covers provider bodies.
200
+ return {
201
+ ok: false,
202
+ exitCode: null,
203
+ stdout: "",
204
+ stderr: "",
205
+ durationMs: Date.now() - started,
206
+ error: error instanceof Error ? error.message : String(error),
207
+ reason: llmFailureReason(error),
208
+ ...(error instanceof LlmCallError ? { llmErrorCode: error.code } : {}),
209
+ };
210
+ }
211
+ };
212
+ let result = await dispatchRunner({
213
+ runner: execution.runner,
214
+ ...(execution.profile ? { profile: execution.profile } : {}),
215
+ inference: execution.request.inference,
216
+ confined,
217
+ }, opts, options, llm);
218
+ if (confined && result.ok)
232
219
  result = modelWorkAnswer(execution.runner, result);
233
220
  // The LLM transport records each HTTP attempt itself.
234
- if (execution.runner.kind !== "llm")
221
+ if (llm === undefined)
235
222
  recordDispatchUsage(execution, result);
236
223
  return result;
237
224
  }
238
- /** `akm agent`: launch an agent engine interactively, with no prompt of its own. */
225
+ /**
226
+ * `akm agent` with no prompt: start the harness for a person to use, with the terminal
227
+ * inherited and nothing to run (no `-p`, no empty turn). A connection has nothing
228
+ * interactive to start, so it is refused rather than billed for an empty turn.
229
+ */
239
230
  export async function executeInteractiveAgentInvocation(input, seams = {}) {
240
- const runner = resolveEngine(input.engine, input.config);
241
- if (runner.kind === "llm") {
242
- throw new UsageError(`Engine "${input.engine}" is an LLM engine; akm agent requires an agent engine.`, "INVALID_FLAG_VALUE");
231
+ const runner = resolveTarget({
232
+ config: input.config,
233
+ layers: [
234
+ ...(input.connection === undefined ? [] : [{ connection: input.connection }]),
235
+ ...(input.harness === undefined ? [] : [{ harness: input.harness }]),
236
+ ...(input.engine === undefined ? [] : [{ engine: input.engine }]),
237
+ ...(input.model === undefined ? [] : [{ model: input.model }]),
238
+ ],
239
+ });
240
+ if (runner.kind === "connection") {
241
+ throw new UsageError(`"${runner.name}" is a connection, which has nothing to start interactively: pass --prompt, or name a harness.`, "MISSING_REQUIRED_ARGUMENT", "Pass --prompt to run a task on the connection, or name a harness with --harness to start it interactively.");
243
242
  }
244
243
  const opts = {
245
- stdio: runner.kind === "sdk" ? runner.profile.stdio : "interactive",
246
- parseOutput: "text",
247
- ...(input.timeoutMs !== undefined
248
- ? { timeoutMs: input.timeoutMs }
249
- : runner.timeoutMs !== undefined
250
- ? { timeoutMs: runner.timeoutMs }
251
- : {}),
252
- ...(input.cwd ? { cwd: input.cwd } : runner.profile.workspace ? { cwd: runner.profile.workspace } : {}),
244
+ stdio: "interactive",
245
+ timeoutMs: input.timeoutMs ?? runner.timeoutMs,
246
+ ...(input.cwd ? { cwd: input.cwd } : runner.workspace ? { cwd: runner.workspace } : {}),
247
+ dispatch: { ...(runner.model ? { model: runner.model } : {}), ...(runner.agent ? { agent: runner.agent } : {}) },
253
248
  };
254
- return { engine: input.engine, result: await dispatchRunner(runner, "", opts, seams) };
255
- }
256
- /**
257
- * Close the `opencode serve` children the SDK runner keeps for reuse. Its own
258
- * teardown hangs off `process.once("exit")`, which never fires while a child
259
- * holds the event loop open, so the CLI and workflow engine call this in
260
- * `finally` blocks. A no-op when no SDK server was started.
261
- */
262
- export async function disposeDispatchResources() {
263
- await disposeOpencodeSdkServers();
264
- }
265
- /**
266
- * Fail fast, before an operation makes any durable change, when `runner`'s
267
- * required credential is missing. Reads it and keeps nothing: every dispatch
268
- * reads it again.
269
- */
270
- export function assertRunnerCredentials(runner, envSource) {
271
- if (runner.kind === "llm")
272
- materializeLlmRunnerConnection(runner, envSource);
273
- if (runner.kind === "sdk")
274
- materializeSdkFallbackConnection(runner, envSource);
249
+ return { engine: runner.name, result: await dispatchRunner({ runner }, opts, seams) };
275
250
  }
@@ -1,78 +1,28 @@
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 { materializeLlmConnection } from "./engine-resolution.js";
5
- /** The symbolic LLM use behind one llm runner; nothing is read here. */
6
- export function llmUseFromRunner(runner) {
7
- return {
8
- engine: runner.engine,
9
- connection: runner.connection,
10
- ...(runner.credential ? { credential: runner.credential } : {}),
11
- ...(runner.apiKeyFile ? { apiKeyFile: runner.apiKeyFile } : {}),
12
- ...(runner.apiKeySecretRef ? { apiKeySecretRef: runner.apiKeySecretRef } : {}),
13
- timeoutMs: runner.timeoutMs ?? null,
14
- };
15
- }
16
- /** The symbolic LLM use behind an sdk runner's provider fallback, when it has one. */
17
- export function sdkFallbackUseFromRunner(runner) {
18
- if (!runner.fallbackConnection)
19
- return undefined;
20
- return {
21
- engine: runner.engine,
22
- connection: runner.fallbackConnection,
23
- ...(runner.fallbackCredential ? { credential: runner.fallbackCredential } : {}),
24
- ...(runner.fallbackApiKeyFile ? { apiKeyFile: runner.fallbackApiKeyFile } : {}),
25
- ...(runner.fallbackApiKeySecretRef ? { apiKeySecretRef: runner.fallbackApiKeySecretRef } : {}),
26
- timeoutMs: runner.fallbackTimeoutMs !== undefined ? runner.fallbackTimeoutMs : (runner.fallbackConnection.timeoutMs ?? null),
27
- };
28
- }
29
- /** Read the current credential and inject it: the dispatch boundary for one llm runner. */
30
- export function materializeLlmRunnerConnection(runner, envSource = process.env) {
31
- return materializeLlmConnection(llmUseFromRunner(runner), envSource);
32
- }
33
- /** The same for an sdk runner's provider fallback, when it has one. */
34
- export function materializeSdkFallbackConnection(runner, envSource = process.env) {
35
- const use = sdkFallbackUseFromRunner(runner);
36
- return use ? materializeLlmConnection(use, envSource) : undefined;
37
- }
38
- function isRecord(value) {
39
- return value !== null && typeof value === "object" && !Array.isArray(value);
40
- }
4
+ import { isRecord } from "../../core/common.js";
41
5
  /**
42
- * Read a journaled runner back. Tolerant: unknown keys are kept and missing
43
- * profile defaults are filled in; only a shape nothing could dispatch is refused.
6
+ * Read a journaled runner back. A current runner is kept as stored. An earlier
7
+ * release's `llm`, `agent` and `sdk` runners are not read: they fall through to
8
+ * the last case and the plan that holds one cannot be decoded, so its run starts
9
+ * afresh.
44
10
  */
45
11
  export function decodeFrozenRunnerSpec(value) {
46
- if (!isRecord(value) || typeof value.engine !== "string") {
47
- throw new TypeError("a frozen runner must be an object with an engine name");
48
- }
49
- if (value.kind === "llm") {
50
- if (!isRecord(value.connection) || typeof value.connection.endpoint !== "string") {
51
- throw new TypeError("a frozen llm runner must carry connection.endpoint");
52
- }
53
- return value;
12
+ if (!isRecord(value))
13
+ throw new TypeError("a frozen runner must be an object");
14
+ switch (value.kind) {
15
+ case "connection":
16
+ if (typeof value.name !== "string" || typeof value.endpoint !== "string" || typeof value.model !== "string") {
17
+ throw new TypeError("a frozen connection runner must carry name, endpoint and model");
18
+ }
19
+ return value;
20
+ case "harness":
21
+ if (typeof value.name !== "string" || typeof value.platform !== "string" || typeof value.bin !== "string") {
22
+ throw new TypeError("a frozen harness runner must carry name, platform and bin");
23
+ }
24
+ return { args: [], ...value };
25
+ default:
26
+ throw new TypeError("a frozen runner's kind must be connection or harness");
54
27
  }
55
- if (value.kind !== "agent" && value.kind !== "sdk") {
56
- throw new TypeError("a frozen runner's kind must be llm, agent, or sdk");
57
- }
58
- const profile = value.profile;
59
- if (!isRecord(profile) || typeof profile.name !== "string" || typeof profile.bin !== "string") {
60
- throw new TypeError("a frozen agent runner must carry profile.name and profile.bin");
61
- }
62
- return {
63
- ...value,
64
- profile: { args: [], envPassthrough: [], stdio: "captured", parseOutput: "text", ...profile },
65
- };
66
- }
67
- export function runnerIsLlm(runner) {
68
- return runner.kind === "llm";
69
- }
70
- /**
71
- * The LLM connection behind a runner, whatever its kind: an llm runner's own,
72
- * an sdk runner's provider fallback, none for an agent CLI.
73
- */
74
- export function runnerLlmConnection(runner) {
75
- if (runner.kind === "llm")
76
- return runner.connection;
77
- return runner.kind === "sdk" ? runner.fallbackConnection : undefined;
78
28
  }
@@ -0,0 +1,4 @@
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
+ export {};
@@ -0,0 +1,10 @@
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
+ * The one place akm's agent runtime is chosen. Lowering and dispatch use
6
+ * {@link agentRuntime} and import nothing of the implementation; replacing the
7
+ * runtime is a change to this line and the folder it names.
8
+ */
9
+ import { opencodeRuntime } from "../harnesses/opencode/runtime/index.js";
10
+ export const agentRuntime = opencodeRuntime;