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
@@ -35,10 +35,12 @@ import { LineCounter, parseDocument } from "yaml";
35
35
  import { bundleRefToString, parseBundleRef } from "../core/asset/asset-ref.js";
36
36
  import { parseFrontmatterBlock } from "../core/asset/frontmatter.js";
37
37
  import { parseMarkdownToc } from "../core/asset/markdown.js";
38
- import { isContainedRelativePath, isRecord } from "../core/common.js";
38
+ import { isRecord } from "../core/common.js";
39
39
  import { formatExtraParamsIssue, validateExtraParams } from "../core/extra-params.js";
40
40
  import { checkJsonSchemaDefinition, JSON_SCHEMA_SUBSET_SUPPORTED_KEYWORDS } from "../core/json-schema.js";
41
+ import { warnOnce } from "../core/warn.js";
41
42
  import { INPUT_NAME_PATTERN } from "../execution/input-contract.js";
43
+ import { warnRetiredEngineKey } from "../execution/source.js";
42
44
  import { classifyTargetRef } from "../execution/target-ref.js";
43
45
  import { WORKFLOW_PLAN_VERSION, } from "./plan.js";
44
46
  import { parseReference } from "./program/expressions.js";
@@ -88,13 +90,15 @@ const ENVELOPE_KEYS = [
88
90
  ];
89
91
  const WORKFLOW_KEYS = ["params", "defaults", "budget", "steps"];
90
92
  const TOP_LEVEL_KEYS = [...ENVELOPE_KEYS, ...WORKFLOW_KEYS];
91
- const DEFAULTS_KEYS = ["engine", "model", "timeout", "on_error", "llm"];
93
+ const DEFAULTS_KEYS = ["connection", "harness", "engine", "model", "timeout", "on_error", "llm"];
92
94
  const BUDGET_KEYS = ["max_tokens", "max_units"];
93
95
  const STEP_KEYS = ["id", "unit", "map", "inputs", "output", "gate"];
94
96
  const UNIT_KEYS = [
95
97
  "exec",
96
98
  "workflow",
97
99
  "with",
100
+ "connection",
101
+ "harness",
98
102
  "engine",
99
103
  "model",
100
104
  "llm",
@@ -105,8 +109,8 @@ const UNIT_KEYS = [
105
109
  "env",
106
110
  ];
107
111
  const EXEC_KEYS = ["command", "cwd", "pass_env"];
108
- /** Unit keys that name an ENGINE dispatch and therefore cannot appear beside `exec:`. */
109
- const UNIT_ENGINE_KEYS = ["engine", "model", "llm"];
112
+ /** Unit keys that name a model or agent dispatch and therefore cannot appear beside `exec:`. `engine` is the retired spelling of `connection` / `harness`. */
113
+ const UNIT_ENGINE_KEYS = ["connection", "harness", "engine", "model", "llm"];
110
114
  const MAP_KEYS = ["over", "concurrency", "reducer", "unit"];
111
115
  const RETRY_KEYS = ["max", "on"];
112
116
  const GATE_KEYS = ["max_loops"];
@@ -182,7 +186,6 @@ export function parseWorkflow(markdown, source) {
182
186
  const ctx = {
183
187
  filePath: path,
184
188
  errors,
185
- ...(source.validateExecCwd ? { validateExecCwd: source.validateExecCwd } : {}),
186
189
  lineAt,
187
190
  lineAtOffset: (offset) => Math.max(1, lineCounter.linePos(offset).line + lineOffset),
188
191
  nodeAt: (p) => (p.length === 0 ? doc.contents : doc.getIn(p, true)),
@@ -524,10 +527,14 @@ function parseDefaults(ctx, raw) {
524
527
  }
525
528
  checkUnknownKeys(ctx, raw, path, DEFAULTS_KEYS, `"defaults"`);
526
529
  const defaults = {};
527
- if (raw.engine !== undefined) {
528
- const engine = parseEngineName(ctx, raw.engine, [...path, "engine"], `"defaults.engine"`);
529
- if (engine !== undefined)
530
- defaults.engine = engine;
530
+ for (const key of ["connection", "harness", "engine"]) {
531
+ if (raw[key] === undefined)
532
+ continue;
533
+ const name = parseEngineName(ctx, raw[key], [...path, key], `"defaults.${key}"`);
534
+ if (name !== undefined)
535
+ defaults[key] = name;
536
+ if (key === "engine")
537
+ warnRetiredEngineKey();
531
538
  }
532
539
  if (raw.model !== undefined) {
533
540
  if (typeof raw.model === "string" && raw.model.trim() !== "")
@@ -655,7 +662,7 @@ function parseUnit(ctx, raw, path, stepLabel, allowWorkflow = true) {
655
662
  const exec = parseExec(ctx, raw.exec, [...path, "exec"], stepLabel);
656
663
  if (exec !== undefined)
657
664
  unit.exec = exec;
658
- // An exec unit dispatches no engine call, so every engine-selection key is
665
+ // An exec unit dispatches no model call, so every connection or harness selection key is
659
666
  // a contradiction rather than a harmless extra. Reported per key so the
660
667
  // author sees exactly which line to delete.
661
668
  for (const key of UNIT_ENGINE_KEYS) {
@@ -672,7 +679,7 @@ function parseUnit(ctx, raw, path, stepLabel, allowWorkflow = true) {
672
679
  if (raw.exec !== undefined) {
673
680
  ctx.err([...path, "workflow"], `${stepLabel} "unit" declares both "exec" and "workflow" — a unit runs one or the other.`);
674
681
  }
675
- // A workflow unit starts a child run: it reaches no engine and the child carries its own environment.
682
+ // A workflow unit starts a child run: it reaches no model and the child carries its own environment.
676
683
  for (const key of [...UNIT_ENGINE_KEYS, "env"]) {
677
684
  if (raw[key] === undefined)
678
685
  continue;
@@ -691,10 +698,14 @@ function parseUnit(ctx, raw, path, stepLabel, allowWorkflow = true) {
691
698
  unit.with = raw.with;
692
699
  }
693
700
  }
694
- if (raw.engine !== undefined) {
695
- const engine = parseEngineName(ctx, raw.engine, [...path, "engine"], `${stepLabel} "engine"`);
696
- if (engine !== undefined)
697
- unit.engine = engine;
701
+ for (const key of ["connection", "harness", "engine"]) {
702
+ if (raw[key] === undefined)
703
+ continue;
704
+ const name = parseEngineName(ctx, raw[key], [...path, key], `${stepLabel} "${key}"`);
705
+ if (name !== undefined)
706
+ unit[key] = name;
707
+ if (key === "engine")
708
+ warnRetiredEngineKey();
698
709
  }
699
710
  if (raw.model !== undefined) {
700
711
  if (typeof raw.model === "string" && raw.model.trim() !== "")
@@ -780,16 +791,18 @@ function parseExec(ctx, raw, path, stepLabel) {
780
791
  return exec;
781
792
  }
782
793
  /**
783
- * `pass_env:` — extra parent-process env var NAMES the child may see on top of
784
- * the default allowlist. NAMES ONLY: a value would be a plaintext secret in the
785
- * frozen plan, which is exactly what `env:` bindings exist to avoid.
794
+ * `pass_env:` — env var NAMES, recorded in the frozen plan. They select nothing:
795
+ * an exec child inherits akm's environment, so a workflow written before that
796
+ * still parses. NAMES ONLY: a value would be a plaintext secret in the frozen
797
+ * plan, which is exactly what `env:` bindings exist to avoid.
786
798
  */
787
799
  function parseExecPassEnv(ctx, raw, path, stepLabel) {
788
800
  if (raw === undefined)
789
801
  return undefined;
790
802
  if (!Array.isArray(raw) || raw.length === 0) {
791
- ctx.err(path, `${stepLabel} "exec.pass_env" must be a non-empty list of environment variable NAMES to copy through from ` +
792
- `akm's own environment, e.g. pass_env: [CARGO_HOME]. Values never appear here — use "env:" bindings for those.`);
803
+ ctx.err(path, `${stepLabel} "exec.pass_env" must be a non-empty list of environment variable NAMES, e.g. ` +
804
+ `pass_env: [CARGO_HOME]. It has no effect: the command inherits akm's environment. Values never appear ` +
805
+ `here — use "env:" bindings for those.`);
793
806
  return undefined;
794
807
  }
795
808
  const names = [];
@@ -829,36 +842,18 @@ function parseExecCommand(ctx, raw, path, stepLabel) {
829
842
  return argv;
830
843
  }
831
844
  /**
832
- * The optional relative `cwd:`. Rejected here (statically) for absolute paths
833
- * and `..` segments; containment against the resolved base directory is
834
- * re-checked at dispatch, so a symlinked subdirectory cannot escape either.
845
+ * The optional `cwd:`: a non-empty string, relative to the workflow's bundle root or absolute, and
846
+ * free to carry `${ref}` tokens. Nothing else is checked here; the unit's working directory is
847
+ * resolved at dispatch.
835
848
  */
836
849
  function parseExecCwd(ctx, raw, path, stepLabel) {
837
850
  if (raw === undefined)
838
851
  return undefined;
839
852
  if (typeof raw !== "string" || raw.trim() === "") {
840
- ctx.err(path, `${stepLabel} "exec.cwd" must be a non-empty relative path inside the unit's working directory.`);
841
- return undefined;
842
- }
843
- const value = raw.trim();
844
- if (!isContainedRelativePath(value)) {
845
- ctx.err(path, `${stepLabel} "exec.cwd" (${JSON.stringify(value)}) must be a RELATIVE path inside the unit's working ` +
846
- `directory — absolute paths, Windows drive letters, "~", and ".." segments are rejected.`);
853
+ ctx.err(path, `${stepLabel} "exec.cwd" must be a non-empty string.`);
847
854
  return undefined;
848
855
  }
849
- if (ctx.validateExecCwd) {
850
- const semantic = ctx.validateExecCwd(value);
851
- if (!semantic.ok) {
852
- ctx.errors.push({
853
- code: semantic.code,
854
- line: ctx.lineAt(path),
855
- message: semantic.message,
856
- });
857
- return undefined;
858
- }
859
- return semantic.value;
860
- }
861
- return value;
856
+ return raw.trim();
862
857
  }
863
858
  function parseMap(ctx, raw, path, stepLabel) {
864
859
  if (!isRecord(raw)) {
@@ -943,19 +938,19 @@ function parseGate(ctx, raw, path, stepLabel) {
943
938
  // Field helpers
944
939
  // ---------------------------------------------------------------------------
945
940
  /**
946
- * Engine names must already satisfy the frozen-plan grammar
941
+ * Connection and harness names must already satisfy the frozen-plan grammar
947
942
  * (`WORKFLOW_ENGINE_NAME_PATTERN`, max 63 chars) at parse time — the decoder
948
943
  * enforces the same bound on persisted plans, and a name that only fails there
949
944
  * surfaces as an unlocated "Invalid frozen workflow plan" at `workflow run`.
950
945
  */
951
946
  function parseEngineName(ctx, raw, path, label) {
952
947
  if (typeof raw !== "string" || raw.trim() === "") {
953
- ctx.err(path, `${label} must be a non-empty engine name.`);
948
+ ctx.err(path, `${label} must be a non-empty name.`);
954
949
  return undefined;
955
950
  }
956
951
  const name = raw.trim();
957
952
  if (!WORKFLOW_ENGINE_NAME_PATTERN.test(name) || name.length > WORKFLOW_MAX_ENGINE_NAME_LENGTH) {
958
- ctx.err(path, `${label} has an invalid engine name ${JSON.stringify(name)}. Engine names are lowercase words of letters ` +
953
+ ctx.err(path, `${label} has an invalid name ${JSON.stringify(name)}. Names are lowercase words of letters ` +
959
954
  `and digits separated by single dashes, starting with a letter (e.g. "code-review-llm"), at most ` +
960
955
  `${WORKFLOW_MAX_ENGINE_NAME_LENGTH} characters.`);
961
956
  return undefined;
@@ -1044,7 +1039,12 @@ function parseEnumField(ctx, raw, path, label, allowed) {
1044
1039
  ctx.err(path, `${label} must be one of: ${allowed.join(" | ")} (got ${JSON.stringify(raw)}).`);
1045
1040
  return undefined;
1046
1041
  }
1047
- /** Parse only invocation tuning. Connection identity belongs to a named engine. */
1042
+ /** Keys a unit's `llm:` once took and akm no longer reads: warned about once, then ignored. */
1043
+ const RETIRED_LLM_KEYS = {
1044
+ supports_json_schema: "akm retries without a schema when the endpoint rejects one",
1045
+ context_length: "the context window is a connection's setting (contextLength)",
1046
+ };
1047
+ /** Parse only invocation tuning. Where it is sent belongs to a named connection. */
1048
1048
  function parseLlmOverrides(ctx, raw, path, label) {
1049
1049
  if (raw === undefined)
1050
1050
  return undefined;
@@ -1076,11 +1076,9 @@ function parseLlmOverrides(ctx, raw, path, label) {
1076
1076
  else
1077
1077
  ctx.err([...path, "max_tokens"], `${label}.max_tokens must be a positive integer.`);
1078
1078
  }
1079
- if (raw.supports_json_schema !== undefined) {
1080
- if (typeof raw.supports_json_schema === "boolean")
1081
- result.supportsJsonSchema = raw.supports_json_schema;
1082
- else
1083
- ctx.err([...path, "supports_json_schema"], `${label}.supports_json_schema must be a boolean.`);
1079
+ for (const [key, why] of Object.entries(RETIRED_LLM_KEYS)) {
1080
+ if (raw[key] !== undefined)
1081
+ warnOnce(`workflow-llm-${key}`, `A workflow's llm.${key} is ignored: ${why}.`);
1084
1082
  }
1085
1083
  if (raw.extra_params !== undefined) {
1086
1084
  if (!isRecord(raw.extra_params)) {
@@ -1099,13 +1097,6 @@ function parseLlmOverrides(ctx, raw, path, label) {
1099
1097
  }
1100
1098
  }
1101
1099
  }
1102
- if (raw.context_length !== undefined) {
1103
- if (typeof raw.context_length === "number" && Number.isInteger(raw.context_length) && raw.context_length > 0) {
1104
- result.contextLength = raw.context_length;
1105
- }
1106
- else
1107
- ctx.err([...path, "context_length"], `${label}.context_length must be a positive integer.`);
1108
- }
1109
1100
  if (raw.enable_thinking !== undefined) {
1110
1101
  if (typeof raw.enable_thinking === "boolean")
1111
1102
  result.enableThinking = raw.enable_thinking;
@@ -1,5 +1,11 @@
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
- /** Stored plans record this; 0.9.15 and 0.9.16 wrote 5, which still decodes (the 0.9.15 floor, #1091). */
5
- export const WORKFLOW_PLAN_VERSION = 6;
4
+ /**
5
+ * Stored plans record this; 0.9.15 and 0.9.16 wrote 5 and early 0.10 wrote 6,
6
+ * which still decode (the 0.9.15 floor, #1091). 7 stopped freezing locations:
7
+ * the plan names the refs the engine dereferences, never a directory or file.
8
+ * 8 freezes a connection or harness where 7 froze an engine: a plan of 7 or
9
+ * earlier that holds a command target cannot be decoded, and its run starts afresh.
10
+ */
11
+ export const WORKFLOW_PLAN_VERSION = 8;
@@ -9,7 +9,9 @@
9
9
  * declares one.
10
10
  */
11
11
  import { displayRef } from "../core/asset/resolve-ref.js";
12
+ import { isInstalledBundle, resolveRefOwner } from "../core/env-secret-ref.js";
12
13
  import { UsageError } from "../core/errors.js";
14
+ import { substituteRefTokens } from "../core/ref-token.js";
13
15
  import { compileWorkflowSource, workflowStepInstructions } from "./compile.js";
14
16
  function shellQuote(value) {
15
17
  return `'${value.replace(/'/g, `'\\''`)}'`;
@@ -25,7 +27,7 @@ function deriveName(ctx) {
25
27
  return ext > 0 ? ctx.relPath.slice(0, ext) : ctx.relPath;
26
28
  }
27
29
  function loadPlan(ctx) {
28
- const result = compileWorkflowSource(ctx.content(), { path: ctx.relPath, workspaceRoot: ctx.stashRoot });
30
+ const result = compileWorkflowSource(ctx.content(), { path: ctx.relPath });
29
31
  if (result.ok)
30
32
  return result.plan;
31
33
  const summary = result.errors.map((e) => `${e.path}:${e.line} — ${e.message}`).join("\n");
@@ -43,16 +45,16 @@ function projectParameters(plan) {
43
45
  }
44
46
  /**
45
47
  * Compact, show-facing orchestration summary for one step. Field mapping:
46
- * `engine`/`model`/`timeoutMs` merge the run-level `defaults` exactly like the
48
+ * `engine` (the connection or harness a unit names), `model` and `timeoutMs` merge the run-level `defaults` exactly like the
47
49
  * compiler does (per-unit override wins), `fanOut.over` carries the raw
48
50
  * reference string.
49
51
  * Returns undefined when the step declares nothing worth summarizing.
50
52
  *
51
53
  * ## exec units
52
54
  *
53
- * An `exec` unit runs a shell command and names NO engine — the parser rejects
54
- * `engine`/`model`/`llm` alongside `exec:`. Merging `defaults.engine` into its
55
- * summary would make `show` state something untrue about what will run, so the
55
+ * An `exec` unit runs a shell command and names no connection or harness — the parser rejects
56
+ * `connection`/`harness`/`model`/`llm` alongside `exec:`. Merging the run's default
57
+ * into its summary would make `show` state something untrue about what will run, so the
56
58
  * two fields are suppressed and the argv is projected instead, under `exec`
57
59
  * (field presence carries the dispatch kind, exactly like `fanOut`
58
60
  * carries the step kind).
@@ -70,11 +72,16 @@ function projectParameters(plan) {
70
72
  * It is far smaller than the step `instructions` this same projection
71
73
  * already carries whole.
72
74
  */
73
- function summarizeStepOrchestration(step, defaults) {
75
+ export function summarizeStepOrchestration(step, defaults) {
74
76
  const spec = step.spec;
75
77
  const unit = spec?.unit;
76
- const exec = spec?.exec;
77
- const engine = exec ? undefined : (unit?.engine ?? defaults?.engine);
78
+ // A stored plan carries no authored spec: read the same fields off its frozen dispatch.
79
+ const frozen = spec ? undefined : frozenDispatch(step);
80
+ const exec = spec ? spec.exec : frozen?.exec;
81
+ const env = unit?.env ?? frozen?.env;
82
+ const workflow = spec ? spec.workflow : frozen?.workflow;
83
+ const named = (settings) => settings?.connection ?? settings?.harness ?? settings?.engine;
84
+ const engine = exec ? undefined : (named(unit) ?? named(defaults));
78
85
  const model = exec ? undefined : (unit?.model ?? defaults?.model);
79
86
  const timeoutMs = unit?.timeoutMs !== undefined ? unit.timeoutMs : defaults?.timeoutMs;
80
87
  const summary = {
@@ -93,10 +100,77 @@ function summarizeStepOrchestration(step, defaults) {
93
100
  }
94
101
  : {}),
95
102
  ...(unit?.output !== undefined || step.outputSchema !== undefined ? { hasSchema: true } : {}),
96
- ...(unit?.env !== undefined ? { env: [...unit.env] } : {}),
103
+ ...(env !== undefined ? { env: [...env] } : {}),
104
+ ...(workflow !== undefined ? { workflow } : {}),
97
105
  };
98
106
  return Object.keys(summary).length > 0 ? summary : undefined;
99
107
  }
108
+ /** The exec argv, env refs and child workflow a frozen step dispatches. */
109
+ function frozenDispatch(step) {
110
+ const root = step.root;
111
+ const unit = root?.kind === "map" ? root.template : root;
112
+ if (!unit)
113
+ return {};
114
+ const target = unit.frozenTarget;
115
+ const env = unit.environment.flatMap((binding) => (binding.kind === "env-ref" ? [binding.ref] : []));
116
+ return {
117
+ ...(target.kind === "shell"
118
+ ? {
119
+ exec: {
120
+ command: [...target.exec.command],
121
+ ...(target.exec.cwd !== undefined ? { cwd: target.exec.cwd } : {}),
122
+ ...(target.exec.passEnv ? { passEnv: [...target.exec.passEnv] } : {}),
123
+ },
124
+ }
125
+ : {}),
126
+ ...(env.length > 0 ? { env } : {}),
127
+ ...(target.kind === "child-workflow" ? { workflow: target.ref } : {}),
128
+ };
129
+ }
130
+ /**
131
+ * Add the bundle-qualified ref every `${ref}` token in the argv or cwd, every
132
+ * `env:` entry and the child `workflow:` resolves to right now, through the
133
+ * one owner walk (`resolveRefOwner`). A ref no bundle owns lands in
134
+ * `unresolved` instead; callers decide whether that is an error. No secret
135
+ * is read and no path is returned.
136
+ */
137
+ export function resolveOrchestrationRefs(summary) {
138
+ const refs = [];
139
+ const unresolved = [];
140
+ const note = (ref, where) => {
141
+ let owner;
142
+ try {
143
+ owner = resolveRefOwner(ref);
144
+ }
145
+ catch {
146
+ owner = undefined;
147
+ }
148
+ if (owner)
149
+ refs.push({ ref, resolved: owner.ref, in: where });
150
+ else
151
+ unresolved.push({ ref, in: where });
152
+ };
153
+ const tokens = (values, where) => {
154
+ const seen = new Set();
155
+ substituteRefTokens(Object.fromEntries(values.map((value, index) => [String(index), value])), (ref) => {
156
+ if (!seen.has(ref)) {
157
+ seen.add(ref);
158
+ note(ref, where);
159
+ }
160
+ return { kind: "path", path: "" };
161
+ }, isInstalledBundle);
162
+ };
163
+ if (summary.exec) {
164
+ tokens(summary.exec.command, "argv");
165
+ if (summary.exec.cwd !== undefined)
166
+ tokens([summary.exec.cwd], "cwd");
167
+ }
168
+ for (const ref of summary.env ?? [])
169
+ note(ref, "env");
170
+ if (summary.workflow !== undefined)
171
+ note(summary.workflow, "workflow");
172
+ return { ...summary, refs, ...(unresolved.length > 0 ? { unresolved } : {}) };
173
+ }
100
174
  function projectStepDefinitions(plan) {
101
175
  return plan.steps.map((step, sequenceIndex) => {
102
176
  const orchestration = summarizeStepOrchestration(step, plan.defaults);
@@ -35,7 +35,7 @@ export const WORKFLOW_EXEC_OUTPUT_TRUNCATED_MARKER = "__akm_exec_output_truncate
35
35
  // Per-var: Win32 `SetEnvironmentVariable` caps one variable at 32 767 UTF-16
36
36
  // code units; measuring UTF-8 bytes is conservative in the right direction.
37
37
  // Total: akm's own share of the `CreateProcess` `lpEnvironment` block, which it
38
- // shares with the allowlist, the unit's `env:` bindings and the argv.
38
+ // shares with the rest of the environment, the unit's `env:` bindings and the argv.
39
39
  const EXEC_CONTEXT_LIMITS_WIN32 = {
40
40
  perVarBytes: 32_767,
41
41
  totalBytes: 64_000,
@@ -45,7 +45,7 @@ const EXEC_CONTEXT_LIMITS_WIN32 = {
45
45
  // margin for the name, `=`, NUL and the kernel's own accounting — the guard must
46
46
  // never reject a spawn the platform would have accepted.
47
47
  // Total: half of macOS's 256 KiB `ARG_MAX` (the tightest supported total), so
48
- // the other half remains for the argv, the allowlist and the `env:` bindings.
48
+ // the other half remains for the argv, the rest of the environment and the `env:` bindings.
49
49
  const EXEC_CONTEXT_LIMITS_POSIX = {
50
50
  perVarBytes: 96 * 1024,
51
51
  totalBytes: 128 * 1024,
@@ -7,15 +7,21 @@
7
7
  *
8
8
  * {@link decodeWorkflowPlan} accepts every plan shape a release at or above
9
9
  * the 0.9.15 floor has stored — irVersion 5 (with its `sourceReadSet` and
10
- * host-identity fields, which 0.9.15 and 0.9.16 wrote) as well as the current
11
- * one — and keeps keys it does not know rather than
12
- * refusing them. It rejects only a plan it cannot run: no steps, a unit with
13
- * no frozen target, a request that does not decode. `plan_ir_version` and
14
- * `plan_hash` are informational columns: neither gates execution. A plan that
15
- * cannot be decoded comes back from {@link readRunPlan} as a `problem`
10
+ * host-identity fields, which 0.9.15 and 0.9.16 wrote) and irVersion 6 (with
11
+ * its frozen `cwdIdentity` and env owner paths) as well as the current one —
12
+ * and keeps keys it does not know rather than refusing them. A stored target
13
+ * is kept exactly as stored, location fields included: the unit `input_hash`
14
+ * and the child invocation key derive from the whole target, so dropping them
15
+ * would make an interrupted run publish a second child after an upgrade.
16
+ * Dispatch finds the bundle and the env asset by ref and never reads them. It
17
+ * rejects only a plan it cannot run: no steps, a unit with no frozen target, a
18
+ * request that does not decode — which is every command target an earlier
19
+ * irVersion froze, since each names an engine. `plan_hash` is an informational column. A plan
20
+ * that cannot be decoded comes back from {@link readRunPlan} as a `problem`
16
21
  * sentence and the caller decides the remedy (the engine abandons such a run
17
- * instead of throwing) — except for a plan a NEWER akm froze, which is `newer`
18
- * and whose problem names upgrading akm as the remedy.
22
+ * instead of throwing) — except for a plan a NEWER akm froze (`plan_ir_version`
23
+ * above this release's), which is refused unread as `newer` with a problem that
24
+ * names upgrading akm as the remedy.
19
25
  */
20
26
  import { UsageError } from "../../core/errors.js";
21
27
  import { warnOnce } from "../../core/warn.js";
@@ -26,6 +32,14 @@ export function readRunPlan(row) {
26
32
  if (!row.plan_json)
27
33
  return { ok: false, newer: false, problem: `Workflow run ${row.id} has no frozen workflow plan.` };
28
34
  const version = row.plan_ir_version ?? null;
35
+ if (version !== null && version > WORKFLOW_PLAN_VERSION) {
36
+ return {
37
+ ok: false,
38
+ newer: true,
39
+ problem: `Workflow run ${row.id} was frozen by a newer akm (plan irVersion ${version}) and this akm ` +
40
+ `(irVersion ${WORKFLOW_PLAN_VERSION}) will not run it. Upgrade akm to continue this run.`,
41
+ };
42
+ }
29
43
  try {
30
44
  const plan = decodeWorkflowPlan(JSON.parse(row.plan_json), {
31
45
  ...(row.workflow_ref ? { workflowRef: row.workflow_ref } : {}),
@@ -38,14 +52,6 @@ export function readRunPlan(row) {
38
52
  }
39
53
  catch (cause) {
40
54
  const detail = cause instanceof Error ? cause.message : String(cause);
41
- if (version !== null && version > WORKFLOW_PLAN_VERSION) {
42
- return {
43
- ok: false,
44
- newer: true,
45
- problem: `Workflow run ${row.id} was frozen by a newer akm (plan irVersion ${version}) and this akm cannot decode it: ` +
46
- `${detail}. Upgrade akm to continue this run.`,
47
- };
48
- }
49
55
  const frozenAs = version === null ? "" : ` (frozen as plan irVersion ${version})`;
50
56
  return {
51
57
  ok: false,
@@ -166,7 +172,7 @@ function decodeTarget(value, label) {
166
172
  kind: "shell",
167
173
  contentHash: string(target.contentHash, `${label} contentHash`),
168
174
  exec: decodeExec(target.exec, label),
169
- cwdIdentity: record(target.cwdIdentity, `${label} cwdIdentity`),
175
+ ...legacyField(target, "cwdIdentity"),
170
176
  ...optional,
171
177
  };
172
178
  case "child-workflow":
@@ -203,12 +209,15 @@ function decodeCommandTarget(target, label) {
203
209
  request,
204
210
  runner,
205
211
  ...(concurrency !== undefined ? { concurrency } : {}),
206
- ...(target.cwdIdentity && typeof target.cwdIdentity === "object"
207
- ? { cwdIdentity: target.cwdIdentity }
208
- : {}),
212
+ ...legacyField(target, "cwdIdentity"),
209
213
  ...(inputBindings ? { inputBindings } : {}),
210
214
  };
211
215
  }
216
+ /** A location field a stored target carries, kept as stored (see the module doc). */
217
+ function legacyField(source, key) {
218
+ const value = source[key];
219
+ return value && typeof value === "object" ? { [key]: value } : {};
220
+ }
212
221
  function decodeExec(value, label) {
213
222
  const exec = record(value, `${label} exec`);
214
223
  const command = exec.command;
@@ -246,14 +255,20 @@ function decodeEnvironmentBinding(value, label) {
246
255
  return { kind: "pass-through", name: string(binding.name, label) };
247
256
  if (binding.kind !== "env-ref")
248
257
  fail(`${label} has an unsupported kind`);
258
+ // Plans before irVersion 7 also carry the env file's owner, key names and secret names: kept as stored,
259
+ // never read (dispatch reads the env asset by ref).
249
260
  const strings = (items) => Array.isArray(items) ? items.filter((item) => typeof item === "string") : [];
250
261
  return {
251
262
  kind: "env-ref",
252
263
  ref: string(binding.ref, `${label} ref`),
253
- owner: record(binding.owner, `${label} owner`),
254
- keys: strings(binding.keys),
255
- secretNames: strings(binding.secretNames),
256
264
  precedence: typeof binding.precedence === "number" ? binding.precedence : 0,
265
+ ...(binding.owner && typeof binding.owner === "object"
266
+ ? {
267
+ owner: binding.owner,
268
+ keys: strings(binding.keys),
269
+ secretNames: strings(binding.secretNames),
270
+ }
271
+ : {}),
257
272
  };
258
273
  }
259
274
  function positiveInteger(value) {