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
@@ -6,7 +6,6 @@
6
6
  * decisions, used by the engine on both a fresh run and a resume, so the same
7
7
  * frozen plan produces byte-identical unit graphs. Pure except the
8
8
  * gate-evaluation journaling; never dispatches and never writes step rows.
9
- * See docs/architecture/decisions/0002-unit-reuse-and-input-hash-scope.md.
10
9
  */
11
10
  import { createHash } from "node:crypto";
12
11
  import unitPreambleTemplate from "../../assets/prompts/workflow-unit-preamble.md" with { type: "text" };
@@ -119,8 +118,7 @@ export function computeStepWorkList(plan, input) {
119
118
  const reducer = root.kind === "map" ? root.reducer : "collect";
120
119
  const scope = { params: input.params, stepOutputs: input.stepOutputs };
121
120
  // Instructions are ALWAYS the step's body prose, byte-exact — never
122
- // templated, never scanned for reference syntax (workflow-format-
123
- // unification, spec §2.3). Only `map.over` / `inputs[]`
121
+ // templated, never scanned for reference syntax. Only `map.over` / `inputs[]`
124
122
  // carry the closed reference grammar.
125
123
  // Resolve the step's declared `inputs:` ONCE (shared by every unit in this
126
124
  // step — map items differ, declared inputs do not): prior-step artifacts
@@ -197,9 +195,9 @@ export function computeStepWorkList(plan, input) {
197
195
  const execInputsJson = frozenExec && resolvedInputs.length > 0
198
196
  ? (canonicalJson(Object.fromEntries(resolvedInputs.map((entry) => [entry.reference, entry.value]))) ?? "{}")
199
197
  : undefined;
200
- // P2b Lane A2: the resolved effective task-composition inputs,
198
+ // The resolved effective task-composition inputs,
201
199
  // serialized ONCE here (mirrors execParamsJson/execInputsJson above) —
202
- // Lane B's delivery (buildUnitPrompt's "## Task inputs" block,
200
+ // the delivery (buildUnitPrompt's "## Task inputs" block,
203
201
  // buildExecContextEnv's AKM_TASK_INPUTS) reads both back per unit.
204
202
  const taskInputsJson = hasTaskInputs ? (canonicalJson(taskInputsResolution.values) ?? "{}") : undefined;
205
203
  const ctx = {
@@ -244,13 +242,11 @@ function buildStepWorkUnit(ctx, unitId, item, index) {
244
242
  params: input.params,
245
243
  ...(isFanOut ? { item, itemIndex: index } : {}),
246
244
  ...(resolvedInputs.length > 0 ? { inputs: resolvedInputs } : {}),
247
- // P2b Lane B: the composed task's resolved
245
+ // The composed task's resolved
248
246
  // `inputBindings`, when non-empty — see StepWorkUnitContext.taskInputs.
249
247
  ...(taskInputs && Object.keys(taskInputs).length > 0 ? { taskInputs } : {}),
250
248
  ...(input.gateFeedback ? { gateFeedback: input.gateFeedback } : {}),
251
- // An agent or SDK transport's request lowering appends the schema
252
- // instruction itself; a direct-LLM unit carries it in its prompt.
253
- ...(template.schema && ctx.runner === "llm" ? { schema: template.schema } : {}),
249
+ // Request lowering appends the schema instruction itself.
254
250
  instructions: template.instructions,
255
251
  });
256
252
  const inputHash = computeUnitInputHash(ctx, item);
@@ -265,7 +261,7 @@ function buildStepWorkUnit(ctx, unitId, item, index) {
265
261
  frozenTarget: target,
266
262
  environment: template.environment,
267
263
  ...(frozenExec ? { execContext: buildExecContextEnv({ ctx, unitId, item, index }) } : {}),
268
- ...(target.kind === "command" && target.request.model?.resolved ? { model: target.request.model.resolved } : {}),
264
+ ...(target.kind === "command" && target.request.model?.model ? { model: target.request.model.model } : {}),
269
265
  timeoutMs: ctx.timeoutMs,
270
266
  ...(template.schema ? { schema: template.schema } : {}),
271
267
  ...(template.retry ? { retry: template.retry } : {}),
@@ -311,7 +307,6 @@ function buildExecContextEnv(args) {
311
307
  * to do (names, never secret values). Informational — resume reuses a
312
308
  * completed row by unit id. `gateFeedback`/`taskInputs` are included only when
313
309
  * present so the loop-1, binding-free preimage keeps its `hashVersion` 7 shape.
314
- * See docs/architecture/decisions/0002-unit-reuse-and-input-hash-scope.md.
315
310
  */
316
311
  function computeUnitInputHash(ctx, item) {
317
312
  return createHash("sha256")
@@ -837,8 +832,8 @@ function judgeFailureNotes(runId, stepId, cause) {
837
832
  return (`Step "${stepId}" could not be verified: ${cause}. ` +
838
833
  `This is a verification-judge failure, not a verdict — no gate loop was consumed and the step's ` +
839
834
  `journaled units are preserved. Fix the verifier configuration or service, then run ` +
840
- `\`akm workflow resume ${runId}\` to re-evaluate the gate against the existing results ` +
841
- `without re-dispatching units.`);
835
+ `\`akm workflow resume ${runId}\` and \`akm workflow run ${runId}\` to re-evaluate the gate ` +
836
+ `against the existing results without re-dispatching units.`);
842
837
  }
843
838
  /**
844
839
  * Complete a step `blocked` for a verifier-INFRASTRUCTURE failure and return
@@ -944,7 +939,7 @@ export async function finalizeExecutedStep(input) {
944
939
  // rejection: block for resume without invoking the gate (no loop consumed).
945
940
  if (completionCriteria.some((c) => c.trim().length > 0) && !innerJudge) {
946
941
  return blockFinalizedStep(input, "this step declares completion criteria but no verification judge is available " +
947
- "(the frozen plan resolves no judge — set workflow.judgeEngine, or restore the judge configuration)");
942
+ "(the frozen plan resolves no judge — configure a connection or harness with `akm setup`, or restore the judge configuration)");
948
943
  }
949
944
  // Artifact-judging gate: a criteria-bearing executing step is judged on a
950
945
  // summary BUILT FROM the promoted artifact; everything else keeps the machine
@@ -966,7 +961,7 @@ export async function finalizeExecutedStep(input) {
966
961
  const summaryJudge = innerJudge
967
962
  ? async (prompt) => {
968
963
  if (gateTarget) {
969
- const engineName = gateTarget.request.engine.name;
964
+ const engineName = gateTarget.request.target.name;
970
965
  if (!engineName)
971
966
  throw new Error(`Gate ${stepId} has no frozen engine identity.`);
972
967
  gateUnit = {
@@ -975,7 +970,7 @@ export async function finalizeExecutedStep(input) {
975
970
  stepId,
976
971
  loop: gateLoop,
977
972
  engine: engineName,
978
- model: gateTarget.request.model?.resolved ?? null,
973
+ model: gateTarget.request.model?.model ?? null,
979
974
  runner: gateTarget.runner.kind,
980
975
  // The gate prefix rides the unit prefix's version — unit and gate
981
976
  // hashVersion are one vocabulary (p3a §0.1; the R-R15 fix moved
@@ -1059,7 +1054,8 @@ export async function finalizeExecutedStep(input) {
1059
1054
  }
1060
1055
  // Judge infrastructure failure: the fail-closed rejection is synthetic, not a
1061
1056
  // verdict. Consume NO gate loop; block the step (and therefore the run) so
1062
- // `akm workflow resume` retries the gate over the journaled units.
1057
+ // `akm workflow resume` then `akm workflow run` retries the gate over the
1058
+ // journaled units.
1063
1059
  if (rejection && judgeFailed) {
1064
1060
  return blockFinalizedStep(input, judgeFailure ?? "the verification judge failed");
1065
1061
  }
@@ -2,24 +2,17 @@
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
  import { ConfigError } from "../../core/errors.js";
5
- import { assertFrozenDirectoryContained } from "../../execution/directory-identity.js";
6
5
  import { canonicalResolvedExecutionRequest } from "../../execution/resolved-request.js";
7
6
  import { buildExecutionFromWire } from "../../integrations/agent/execution.js";
8
- import { runExecution, unwrapHarnessReply } from "../../integrations/agent/runner-dispatch.js";
7
+ import { runExecution } from "../../integrations/agent/runner-dispatch.js";
9
8
  /** Lower a frozen common request through its frozen runner only. */
10
9
  export function prepareWorkflowExecution(request, prompt = request.prompt) {
11
10
  const target = request.frozenTarget;
12
- if (target.cwdIdentity)
13
- assertFrozenDirectoryContained(target.cwdIdentity);
14
11
  const wire = JSON.parse(canonicalResolvedExecutionRequest(target.request));
15
12
  const command = { ...wire.command, content: prompt };
16
13
  const runtime = {
17
14
  ...wire.runtime,
18
- ...(request.cwd !== undefined
19
- ? { workspace: request.cwd }
20
- : target.cwdIdentity
21
- ? { workspace: target.cwdIdentity.realCwd }
22
- : {}),
15
+ ...(request.cwd !== undefined ? { workspace: request.cwd } : {}),
23
16
  ...(request.env !== undefined ? { environment: request.env } : {}),
24
17
  };
25
18
  wire.command = command;
@@ -63,13 +56,13 @@ export async function dispatchWorkflowExecution(request, feedback) {
63
56
  }
64
57
  const lowered = prepareWorkflowExecution(request, prompt);
65
58
  const notices = lowered.notices.length > 0 ? lowered.notices : undefined;
66
- if (request.env && Object.keys(request.env).length > 0 && lowered.runner.kind === "llm") {
59
+ if (request.env && Object.keys(request.env).length > 0 && lowered.profile === undefined) {
67
60
  return {
68
61
  ok: false,
69
62
  text: "",
70
63
  failureReason: "env_unsupported",
71
64
  error: `unit ${JSON.stringify(request.unitId)} declares env bindings, which require a child process ` +
72
- `(agent or sdk runner) — the "llm" runner cannot inject a per-unit child environment.`,
65
+ `(a harness or the internal runtime) — a direct model call cannot inject a per-unit child environment.`,
73
66
  ...(notices ? { notices } : {}),
74
67
  };
75
68
  }
@@ -77,11 +70,7 @@ export async function dispatchWorkflowExecution(request, feedback) {
77
70
  try {
78
71
  const eventSource = forwardedDispatchEventSource(request);
79
72
  result = await runExecution(lowered, {
80
- runOptions: {
81
- stdio: "captured",
82
- parseOutput: "text",
83
- ...(request.signal ? { signal: request.signal } : {}),
84
- },
73
+ ...(request.signal ? { signal: request.signal } : {}),
85
74
  ...(eventSource !== undefined ? { eventSource } : {}),
86
75
  });
87
76
  }
@@ -96,13 +85,10 @@ export async function dispatchWorkflowExecution(request, feedback) {
96
85
  ...(notices ? { notices } : {}),
97
86
  };
98
87
  }
99
- const extraction = result.ok ? unwrapHarnessReply(lowered.runner, result) : undefined;
100
- const text = extraction?.text ?? result.stdout;
101
- const sessionId = extraction?.sessionId ?? result.sessionId;
102
88
  return {
103
89
  ok: result.ok,
104
- text,
105
- ...(sessionId !== undefined ? { sessionId } : {}),
90
+ text: result.stdout,
91
+ ...(result.sessionId !== undefined ? { sessionId: result.sessionId } : {}),
106
92
  ...(result.reason ? { failureReason: result.reason } : {}),
107
93
  ...(result.error ? { error: result.error } : {}),
108
94
  ...(result.usage ? { usage: result.usage } : {}),
@@ -1,140 +1,35 @@
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 fs from "node:fs";
5
- import path from "node:path";
6
- import dotenv from "dotenv";
7
- import { loadAdapterExecutionSource } from "../../commands/command/execution-source-loader.js";
8
4
  import { makeBundleRef, parseBundleRef } from "../../core/asset/asset-ref.js";
9
- import { compareCodePoints, isWithin, toPosix } from "../../core/common.js";
10
5
  import { parseEnvRef } from "../../core/env-secret-ref.js";
11
6
  import { UsageError } from "../../core/errors.js";
12
- import { deriveInstallations } from "../../indexer/installations.js";
7
+ import { resolveConceptOwner } from "../../indexer/lookup/adapter-concept-owner.js";
13
8
  import { resolveSourceEntries } from "../../indexer/search/search-source.js";
14
- import { resolveAssetPath } from "../../sources/resolve.js";
15
- import { SECRET_TOKEN_RE } from "../exec/environment.js";
16
9
  /**
17
- * A step's frozen environment: `pass_env` names, then
18
- * one value-free descriptor per `unit.env` ref (owner, key set, secret-token
19
- * names). Values are read at dispatch (`exec/environment.ts`), never frozen.
10
+ * A step's frozen environment: `pass_env` names, then one bundle-qualified
11
+ * ref per `unit.env` entry. The env file, its keys and the secrets it names
12
+ * are read at dispatch (`exec/environment.ts`), never frozen.
20
13
  */
21
14
  export function freezeEnvironment(source, exec, context) {
22
15
  const passThrough = (exec?.passEnv ?? []).map((name) => Object.freeze({ kind: "pass-through", name }));
23
16
  const seen = new Set();
24
17
  const envRefs = [];
25
18
  for (const [precedence, ref] of (source.unit?.env ?? []).entries()) {
26
- if (parseEnvRef(ref).type !== "env") {
27
- throw new UsageError(`Expected an env ref; got ${ref}.`, "WORKFLOW_SOURCE_INVALID");
28
- }
29
- const owned = resolveOwnedAssetSync(ref, "env", context);
30
- if (seen.has(owned.ref))
19
+ parseEnvRef(ref);
20
+ const qualified = qualifyEnvRef(ref, context);
21
+ if (seen.has(qualified))
31
22
  continue;
32
- seen.add(owned.ref);
33
- const parsed = dotenv.parse(fs.readFileSync(owned.file));
34
- const secretNames = new Set();
35
- for (const value of Object.values(parsed)) {
36
- for (const match of value.matchAll(SECRET_TOKEN_RE))
37
- if (match[1])
38
- secretNames.add(match[1]);
39
- }
40
- envRefs.push(Object.freeze({
41
- kind: "env-ref",
42
- ref: owned.ref,
43
- owner: Object.freeze({
44
- bundle: owned.bundle,
45
- adapter: owned.adapter,
46
- requestedRoot: owned.root,
47
- requestedPath: owned.file,
48
- relativePath: toPosix(path.relative(owned.root, owned.file)),
49
- }),
50
- keys: Object.keys(parsed).sort(compareCodePoints),
51
- secretNames: [...secretNames].sort(compareCodePoints),
52
- precedence,
53
- }));
23
+ seen.add(qualified);
24
+ envRefs.push(Object.freeze({ kind: "env-ref", ref: qualified, precedence }));
54
25
  }
55
26
  return [...passThrough, ...envRefs];
56
27
  }
57
- /** Load a command or persona the workflow names, resolved through the workflow's own bundles. */
58
- export async function workflowExecutionSource(ref, kind, context) {
59
- const owned = await resolveOwnedAsset(ref, kind === "command" ? "command" : "agent", context);
60
- return kind === "command"
61
- ? loadAdapterExecutionSource(owned.ref, "command", { config: context.config })
62
- : loadAdapterExecutionSource(owned.ref, "persona", { config: context.config });
63
- }
64
- export async function resolveOwnedAsset(ref, type, context) {
65
- return resolveOwnedAssetCore(ref, type, context, false);
66
- }
67
- export function resolveOwnedAssetSync(ref, type, context) {
68
- return resolveOwnedAssetCore(ref, type, context, true);
69
- }
70
- function resolveOwnedAssetCore(refInput, type, context, sync) {
28
+ /** Qualify an env ref a step names with the bundle that owns it right now, through the one walk. */
29
+ function qualifyEnvRef(refInput, context) {
71
30
  const parsed = parseBundleRef(refInput);
72
- const plural = type === "env" ? "env" : `${type}s`;
73
- const conceptId = parsed.conceptId.startsWith(`${plural}/`) ? parsed.conceptId : `${plural}/${parsed.conceptId}`;
74
- const name = conceptId.slice(plural.length + 1);
75
- const direct = parsed.bundle ? configuredOwner(parsed.bundle, context.config) : undefined;
76
- const candidates = direct ? [direct] : installedOwners(parsed.bundle, context.config);
77
- const findSync = () => {
78
- for (const candidate of candidates) {
79
- const directory = path.join(candidate.root, plural);
80
- for (const extension of assetExtensions(type)) {
81
- const file = path.resolve(directory, `${name}${extension}`);
82
- if (fs.existsSync(file) && fs.statSync(file).isFile()) {
83
- if (!isWithin(file, candidate.root)) {
84
- throw new UsageError(`${file} resolves outside its owning root.`, "PATH_ESCAPE_VIOLATION");
85
- }
86
- return { ...candidate, ref: makeBundleRef(candidate.bundle, conceptId), file };
87
- }
88
- }
89
- }
31
+ const match = resolveConceptOwner({ bundle: parsed.bundle, conceptId: parsed.conceptId }, resolveSourceEntries(undefined, context.config), { includeSensitive: true });
32
+ if (!match)
90
33
  throw new UsageError(`Workflow source target ${refInput} was not found.`, "INVALID_FLAG_VALUE");
91
- };
92
- if (sync)
93
- return findSync();
94
- return (async () => {
95
- for (const candidate of candidates) {
96
- try {
97
- const file = await resolveAssetPath(candidate.root, type, name);
98
- return { ...candidate, ref: makeBundleRef(candidate.bundle, conceptId), file };
99
- }
100
- catch {
101
- // Continue in installation priority order.
102
- }
103
- }
104
- return findSync();
105
- })();
106
- }
107
- /** Every installed bundle root (or just `bundle`'s), in installation priority order. */
108
- function installedOwners(bundle, config) {
109
- const sources = resolveSourceEntries(undefined, config);
110
- const installations = deriveInstallations(sources);
111
- return sources.flatMap((source, index) => {
112
- const installation = installations[index];
113
- if (!installation || (bundle && installation.id !== bundle))
114
- return [];
115
- return [
116
- {
117
- bundle: installation.id,
118
- root: source.path,
119
- adapter: source.adapterId ?? installation.components[0]?.adapter ?? "akm",
120
- },
121
- ];
122
- });
123
- }
124
- function configuredOwner(bundle, config) {
125
- const entry = config.bundles?.[bundle];
126
- if (!entry || typeof entry.path !== "string")
127
- return undefined;
128
- const components = entry.components ? Object.values(entry.components) : [];
129
- const component = components[0];
130
- return {
131
- bundle,
132
- root: path.resolve(entry.path, component?.root ?? "."),
133
- adapter: component?.adapter ?? "akm",
134
- };
135
- }
136
- function assetExtensions(type) {
137
- if (type === "env")
138
- return ["", ".env"];
139
- return ["", ".md"];
34
+ return makeBundleRef(match.bundleId, parsed.conceptId);
140
35
  }
@@ -4,15 +4,14 @@
4
4
  /**
5
5
  * Freeze a compiled workflow plan into the plan a run executes. Every step's
6
6
  * authored spec resolves through the shared command/task authorities into a
7
- * frozen `root` (engine, model, timeout, concurrency, dispatch target and
7
+ * frozen `root` (connection or harness, model, timeout, concurrency, dispatch target and
8
8
  * environment descriptors); gates get their judge; the compile-only fields are
9
9
  * dropped; the source file's sha256 is recorded. Nothing is published here.
10
10
  */
11
11
  import { createHash } from "node:crypto";
12
- import { ConfigError, UsageError } from "../../core/errors.js";
13
- import { warn } from "../../core/warn.js";
14
- import { NO_ENGINE_MESSAGE_SUFFIX } from "../../integrations/agent/engine-fallback.js";
15
- import { resolveExecution } from "../../integrations/agent/execution.js";
12
+ import { SHIPPED_ALIAS } from "../../core/config/model-aliases.js";
13
+ import { UsageError } from "../../core/errors.js";
14
+ import { resolveExecution, shippedAlias } from "../../integrations/agent/execution.js";
16
15
  import { checkWorkflowPlan } from "../compile.js";
17
16
  import { defaultMapConcurrency, workflowMaxConcurrency } from "../concurrency-policy.js";
18
17
  import { canonicalJson } from "../ir/plan-hash.js";
@@ -35,26 +34,16 @@ export async function freezeWorkflow(asset, config, refPath = [asset.ref]) {
35
34
  refPath,
36
35
  freezeChild: (child, childRefPath) => freezeWorkflow(child, config, childRefPath),
37
36
  };
38
- let engineAnnouncement;
39
37
  const steps = [];
40
38
  for (const step of compiled.steps) {
41
39
  const { spec, ...frozenStep } = step;
42
40
  const source = { ...(spec ?? { source: { path: asset.path, start: 1, end: 1 } }), id: step.stepId };
43
41
  const resolved = await resolveStep(source, context);
44
- engineAnnouncement ??= resolved.engineAnnouncement;
45
42
  const root = frozenRoot(step.stepId, source, resolved, compiled, config);
46
43
  let frozenJudge = null;
47
44
  if (step.gate.criteria.length > 0) {
48
45
  const judge = resolveJudge(source, step.gate.criteria[0] ?? "", context);
49
- if (judge) {
50
- frozenJudge = judge.target;
51
- engineAnnouncement ??= judge.engineAnnouncement;
52
- }
53
- else {
54
- warn(`Workflow step "${step.stepId}" has completion criteria but no verification engine is available ` +
55
- "(set workflow.judgeEngine, defaults.engine, or install an opencode-sdk binary). The step will block " +
56
- "for `akm workflow resume` once it is reached.");
57
- }
46
+ frozenJudge = judge.target;
58
47
  }
59
48
  steps.push({ ...frozenStep, root, gate: { ...step.gate, frozenJudge } });
60
49
  }
@@ -68,7 +57,7 @@ export async function freezeWorkflow(asset, config, refPath = [asset.ref]) {
68
57
  sourceHash: asset.sourceHash,
69
58
  steps,
70
59
  };
71
- return { plan, warnings: checked.warnings, ...(engineAnnouncement ? { engineAnnouncement } : {}) };
60
+ return { plan, warnings: checked.warnings };
72
61
  }
73
62
  async function resolveStep(source, context) {
74
63
  const baseUnit = baseUnitOf(source);
@@ -80,22 +69,15 @@ async function resolveStep(source, context) {
80
69
  // A prose step: its body is the `akm/command` literal content (`parser.ts` `stepSpec`).
81
70
  return commandDispatch(source, baseUnit, source.with, context);
82
71
  }
83
- /** The gate judge's frozen command target, or undefined when no engine is available and none is configured. */
72
+ /** The gate judge's frozen command target: a model call, so it runs where model work runs. */
84
73
  function resolveJudge(source, rubric, context) {
85
- const configuredEngine = context.config.workflow?.judgeEngine;
86
- try {
87
- const prepared = resolveExecution({
88
- content: rubric.trim() || "Judge workflow completion.",
89
- config: context.config,
90
- ...(configuredEngine ? { current: { engine: configuredEngine } } : {}),
91
- });
92
- return commandResult(source, { onError: "fail", source: source.source }, prepared, context);
93
- }
94
- catch (err) {
95
- if (configuredEngine || !(err instanceof ConfigError && err.message.includes(NO_ENGINE_MESSAGE_SUFFIX)))
96
- throw err;
97
- return undefined;
98
- }
74
+ const prepared = resolveExecution({
75
+ content: rubric.trim() || "Judge workflow completion.",
76
+ config: context.config,
77
+ layers: [shippedAlias(SHIPPED_ALIAS.judge)],
78
+ modelWork: true,
79
+ });
80
+ return commandResult(source, { onError: "fail", source: source.source }, prepared, context);
99
81
  }
100
82
  function frozenRoot(stepId, source, resolved, plan, config) {
101
83
  const unit = resolved.unit;
@@ -107,7 +89,6 @@ function frozenRoot(stepId, source, resolved, plan, config) {
107
89
  .update(canonicalJson({
108
90
  exec: resolved.target.exec,
109
91
  environment: resolved.environment,
110
- cwdIdentity: resolved.target.cwdIdentity,
111
92
  }))
112
93
  .digest("hex"),
113
94
  }
@@ -25,17 +25,9 @@ export function freezeExecSpec(source, exec, context) {
25
25
  timeoutMs: declared === undefined ? DEFAULT_EXEC_TIMEOUT_MS : declared,
26
26
  };
27
27
  }
28
- export function targetConcurrency(runner, config) {
29
- if (runner.kind === "llm") {
30
- const configured = typeof runner.engine === "string" ? config.engines?.[runner.engine] : undefined;
31
- return defaultLlmEngineConcurrency(runner.connection.endpoint, configured?.kind === "llm" ? configured.concurrency : undefined);
32
- }
33
- if (runner.kind !== "sdk" || !runner.fallbackConnection)
34
- return undefined;
35
- const selected = typeof runner.engine === "string" ? config.engines?.[runner.engine] : undefined;
36
- const fallbackName = selected?.kind === "agent" ? selected.llmEngine : undefined;
37
- const fallback = fallbackName ? config.engines?.[fallbackName] : undefined;
38
- return defaultLlmEngineConcurrency(runner.fallbackConnection.endpoint, fallback?.kind === "llm" ? fallback.concurrency : undefined);
28
+ /** The fan-out a connection supports (its `concurrency`, else the endpoint's default); a harness sets none. */
29
+ export function targetConcurrency(runner) {
30
+ return runner.kind === "connection" ? defaultLlmEngineConcurrency(runner.endpoint, runner.concurrency) : undefined;
39
31
  }
40
32
  /** The request as it may be persisted: its live runtime environment removed. */
41
33
  export function durableRequest(request) {
@@ -45,14 +37,15 @@ export function durableRequest(request) {
45
37
  wire.runtime = runtime;
46
38
  return decodeResolvedExecutionRequest(wire);
47
39
  }
48
- export function executionUnitValues(unit, workspace) {
40
+ export function executionUnitValues(unit) {
49
41
  return Object.freeze({
42
+ ...(unit && Object.hasOwn(unit, "connection") ? { connection: unit.connection } : {}),
43
+ ...(unit && Object.hasOwn(unit, "harness") ? { harness: unit.harness } : {}),
50
44
  ...(unit && Object.hasOwn(unit, "engine") ? { engine: unit.engine } : {}),
51
45
  ...(unit && Object.hasOwn(unit, "model") ? { model: unit.model } : {}),
52
46
  ...(unit && Object.hasOwn(unit, "llm") ? { inference: unit.llm } : {}),
53
47
  ...(unit && Object.hasOwn(unit, "timeoutMs") ? { timeout: unit.timeoutMs } : {}),
54
48
  ...(unit && "output" in unit && Object.hasOwn(unit, "output") ? { outputSchema: unit.output } : {}),
55
- workspace,
56
49
  });
57
50
  }
58
51
  /** Step ids declared BEFORE `stepId` — the same ordering `map.over` and `inputs:` rely on. */
@@ -11,7 +11,6 @@ import { UsageError } from "../../../core/errors.js";
11
11
  import { workflowParamContract } from "../../ir/params.js";
12
12
  import { canonicalJson, canonicalPlanJson } from "../../ir/plan-hash.js";
13
13
  import { loadWorkflowAsset } from "../../runtime/workflow-asset-loader.js";
14
- import { resolveOwnedAsset } from "../environment.js";
15
14
  import { declaredParamNames, earlierStepIds, } from "../step-values.js";
16
15
  import { freezeTaskInputBindings } from "../task-bindings.js";
17
16
  /** The child target's own content identity: its ref, embedded plan hash, and bindings. */
@@ -46,10 +45,9 @@ function assertNoCompositionCycle(stepId, childRef, refPath) {
46
45
  }
47
46
  export async function childWorkflowDispatch(input) {
48
47
  const { source, baseUnit, childRefInput, context } = input;
49
- // Resolution failures propagate unchanged, in code and shape — the same
50
- // authority every other asset reference resolves through.
51
- const owned = await resolveOwnedAsset(childRefInput, "workflow", context);
52
- const childAsset = await loadWorkflowAsset(owned.ref);
48
+ // The loader resolves the ref through the one walk, so a missing child fails
49
+ // like any other missing workflow.
50
+ const childAsset = await loadWorkflowAsset(childRefInput);
53
51
  const childRef = childAsset.ref;
54
52
  // The composition cycle check, before any child compilation.
55
53
  assertNoCompositionCycle(source.id, childRef, context.refPath);
@@ -3,34 +3,28 @@
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  import { createHash } from "node:crypto";
5
5
  import { prepareCommandInvocation } from "../../../commands/command/command-execution.js";
6
- import { captureFrozenDirectoryIdentity } from "../../../execution/directory-identity.js";
7
6
  import { canonicalResolvedExecutionRequest, } from "../../../execution/resolved-request.js";
8
- import { fallbackAnnouncement } from "../../../integrations/agent/engine-fallback.js";
9
7
  import { buildExecution } from "../../../integrations/agent/execution.js";
10
- import { freezeEnvironment, workflowExecutionSource } from "../environment.js";
8
+ import { freezeEnvironment } from "../environment.js";
11
9
  import { durableRequest, executionUnitValues, targetConcurrency, } from "../step-values.js";
12
10
  export async function commandDispatch(source, baseUnit, action, context) {
13
11
  const prepared = await prepareCommandInvocation({
14
12
  action,
15
13
  config: context.config,
16
- ...(context.plan.defaults
17
- ? { invocationDefaults: executionUnitValues(context.plan.defaults, context.asset.sourcePath) }
18
- : {}),
14
+ ...(context.plan.defaults ? { invocationDefaults: executionUnitValues(context.plan.defaults) } : {}),
19
15
  inlineContentMode: "literal",
20
- current: executionUnitValues(source.unit, context.asset.sourcePath),
21
- sourceLoader: (ref, kind) => workflowExecutionSource(ref, kind, context),
16
+ current: executionUnitValues(source.unit),
22
17
  });
23
18
  return commandResult(source, baseUnit, prepared, context);
24
19
  }
25
20
  export function commandResult(source, baseUnit, prepared, context, literals = []) {
26
21
  const request = durableRequest(prepared.request);
27
22
  const lowered = buildExecution(request, prepared.runner);
28
- const cwdIdentity = captureFrozenDirectoryIdentity(context.asset.sourcePath);
29
23
  const runner = lowered.runner;
30
24
  const unit = {
31
25
  ...baseUnit,
32
- engine: request.engine.name,
33
- ...(request.model ? { model: request.model.resolved } : {}),
26
+ engine: request.target.name,
27
+ ...(request.model ? { model: request.model.model } : {}),
34
28
  ...(Object.hasOwn(request.runtime, "timeoutMs") ? { timeoutMs: request.runtime.timeoutMs } : {}),
35
29
  ...(request.inference ? { llm: request.inference } : {}),
36
30
  ...(request.outputSchema ? { output: request.outputSchema } : {}),
@@ -42,15 +36,15 @@ export function commandResult(source, baseUnit, prepared, context, literals = []
42
36
  contentHash: createHash("sha256").update(request.command.content).digest("hex"),
43
37
  request: JSON.parse(canonicalResolvedExecutionRequest(request)),
44
38
  runner,
45
- ...(targetConcurrency(runner, context.config) ? { concurrency: targetConcurrency(runner, context.config) } : {}),
46
- cwdIdentity,
39
+ ...(targetConcurrency(runner) ? { concurrency: targetConcurrency(runner) } : {}),
40
+ // Not a location. akm 0.10.0 and earlier decode a command-only plan and run it in the invoking directory,
41
+ // but their dispatch refuses a directory identity it cannot verify, so they stop here instead.
42
+ cwdIdentity: {},
47
43
  });
48
- const engineAnnouncement = fallbackAnnouncement(prepared.fallbackEngineName, request.engine.name);
49
44
  return {
50
45
  target,
51
46
  environment,
52
47
  unit,
53
48
  instructions: request.command.content,
54
- ...(engineAnnouncement ? { engineAnnouncement } : {}),
55
49
  };
56
50
  }
@@ -1,7 +1,6 @@
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 { captureFrozenDirectoryIdentity } from "../../../execution/directory-identity.js";
5
4
  import { freezeEnvironment } from "../environment.js";
6
5
  import { freezeExecSpec, } from "../step-values.js";
7
6
  export function directShell(source, baseUnit, context) {
@@ -9,13 +8,11 @@ export function directShell(source, baseUnit, context) {
9
8
  if (!authoredExec)
10
9
  throw new Error(`workflow shell step ${source.id} has no argv`);
11
10
  const exec = freezeExecSpec(source, authoredExec, context);
12
- const cwdIdentity = captureFrozenDirectoryIdentity(context.asset.sourcePath, authoredExec.cwd);
13
11
  const environment = Object.freeze(freezeEnvironment(source, authoredExec, context));
14
12
  const target = Object.freeze({
15
13
  kind: "shell",
16
14
  contentHash: "",
17
15
  exec,
18
- cwdIdentity,
19
16
  });
20
17
  return {
21
18
  target,
@@ -6,7 +6,6 @@
6
6
  * {@link freezeTaskInputBindings} classifies an authored `with:` against a
7
7
  * child workflow's `params:` contract. A reference's resolved value is
8
8
  * validated before each attempt (`exec/step-work.ts`).
9
- * See docs/architecture/decisions/0008-task-binding-normalization.md.
10
9
  */
11
10
  import { isRecord } from "../../core/common.js";
12
11
  import { UsageError } from "../../core/errors.js";