akm-cli 0.10.261012-beta → 0.10.261014-beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (518) hide show
  1. package/CHANGELOG.md +710 -3
  2. package/README.md +15 -0
  3. package/SECURITY.md +11 -10
  4. package/STABILITY.md +47 -51
  5. package/dist/assets/hints/cli-hints-full.md +21 -19
  6. package/dist/assets/hints/cli-hints-short.md +3 -4
  7. package/dist/assets/opencode/akm-plugin.js +177 -0
  8. package/dist/assets/stash-skeleton/README.md +1 -1
  9. package/dist/assets/tasks/core/improve.yml +1 -1
  10. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +1 -1
  11. package/dist/assets/ui/config.js +27 -10
  12. package/dist/assets/workflows/workflow-template.md +2 -2
  13. package/dist/cli/clack.js +3 -1
  14. package/dist/cli/selection.js +33 -0
  15. package/dist/cli/shared.js +14 -1
  16. package/dist/cli/unknown-flags.js +6 -37
  17. package/dist/cli.js +69 -48
  18. package/dist/commands/agent/agent-dispatch.js +17 -25
  19. package/dist/commands/agent/contribute-cli.js +9 -8
  20. package/dist/commands/command/command-cli.js +4 -8
  21. package/dist/commands/command/command-execution.js +25 -39
  22. package/dist/commands/command/execution-source-loader.js +10 -14
  23. package/dist/commands/completions.js +1 -1
  24. package/dist/commands/config-cli.js +14 -5
  25. package/dist/commands/env/child-env.js +12 -14
  26. package/dist/commands/env/env-binding.js +47 -58
  27. package/dist/commands/env/env-cli.js +22 -24
  28. package/dist/commands/env/env.js +10 -58
  29. package/dist/commands/env/secret-cli.js +11 -29
  30. package/dist/commands/env/secret.js +3 -10
  31. package/dist/commands/health/checks.js +10 -849
  32. package/dist/commands/health/connections-and-harnesses-check.js +109 -0
  33. package/dist/commands/health/egress.js +3 -3
  34. package/dist/commands/health/html-report.js +9 -10
  35. package/dist/commands/health/plugin-staleness.js +18 -11
  36. package/dist/commands/health/report-view-model.js +16 -12
  37. package/dist/commands/health/scheduler-binary.js +1 -1
  38. package/dist/commands/health/semantic-search-check.js +85 -0
  39. package/dist/commands/health/type-directory-check.js +0 -3
  40. package/dist/commands/health.js +30 -42
  41. package/dist/commands/improve/consolidate/pair-pass.js +10 -25
  42. package/dist/commands/improve/consolidate.js +10 -15
  43. package/dist/commands/improve/distill.js +5 -17
  44. package/dist/commands/improve/eligibility.js +1 -3
  45. package/dist/commands/improve/execution.js +37 -40
  46. package/dist/commands/improve/extract-cli.js +6 -11
  47. package/dist/commands/improve/extract-prompt.js +2 -2
  48. package/dist/commands/improve/extract.js +67 -97
  49. package/dist/commands/improve/improve-cli.js +22 -128
  50. package/dist/commands/improve/improve-report.js +1 -1
  51. package/dist/commands/improve/improve-strategies.js +25 -108
  52. package/dist/commands/improve/improve.js +10 -14
  53. package/dist/commands/improve/loop-stages.js +3 -0
  54. package/dist/commands/improve/memory/memory-improve.js +1 -1
  55. package/dist/commands/improve/preparation.js +8 -13
  56. package/dist/commands/improve/reflect.js +203 -332
  57. package/dist/commands/improve/retrieval-scope.js +1 -1
  58. package/dist/commands/improve/session-asset.js +3 -2
  59. package/dist/commands/improve/stage.js +87 -115
  60. package/dist/commands/lint/base-linter.js +3 -3
  61. package/dist/commands/lint/env-key-rules.js +7 -6
  62. package/dist/commands/lint/index.js +3 -3
  63. package/dist/commands/models-cli.js +103 -63
  64. package/dist/commands/proposal/drain.js +26 -39
  65. package/dist/commands/proposal/proposal-cli.js +14 -18
  66. package/dist/commands/proposal/propose-cli.js +4 -2
  67. package/dist/commands/proposal/propose.js +37 -64
  68. package/dist/commands/proposal/repository.js +17 -17
  69. package/dist/commands/proposal/validators/proposal-validators.js +3 -6
  70. package/dist/commands/read/curate.js +10 -6
  71. package/dist/commands/read/registry-search.js +2 -48
  72. package/dist/commands/read/search-cli.js +1 -8
  73. package/dist/commands/read/search.js +5 -6
  74. package/dist/commands/read/show.js +6 -29
  75. package/dist/commands/remember.js +25 -40
  76. package/dist/commands/sources/add-cli.js +8 -63
  77. package/dist/commands/sources/bundle-cli.js +8 -9
  78. package/dist/commands/sources/bundle-config-ops.js +2 -2
  79. package/dist/commands/sources/info.js +12 -1
  80. package/dist/commands/sources/init.js +1 -1
  81. package/dist/commands/sources/installed-stashes.js +119 -63
  82. package/dist/commands/sources/migration-help.js +1 -1
  83. package/dist/commands/sources/plugin-upgrade.js +8 -15
  84. package/dist/commands/sources/schema-repair.js +4 -10
  85. package/dist/commands/sources/source-add.js +2 -2
  86. package/dist/commands/sources/source-clone.js +31 -7
  87. package/dist/commands/sources/source-manage.js +4 -4
  88. package/dist/commands/targets.js +175 -0
  89. package/dist/commands/tasks/explain.js +104 -69
  90. package/dist/commands/tasks/tasks-cli.js +9 -11
  91. package/dist/commands/tasks/tasks.js +75 -97
  92. package/dist/commands/ui/api.js +11 -3
  93. package/dist/commands/ui/redact.js +5 -31
  94. package/dist/commands/ui/workspace-actions.js +1 -1
  95. package/dist/commands/workflow/plan.js +48 -9
  96. package/dist/commands/workflow-cli.js +40 -45
  97. package/dist/core/adapter/adapters/agent-skills-adapter.js +10 -11
  98. package/dist/core/adapter/adapters/akm-adapter.js +36 -41
  99. package/dist/core/adapter/adapters/akm-lint.js +10 -12
  100. package/dist/core/adapter/adapters/akm-metadata.js +2 -2
  101. package/dist/core/adapter/adapters/akm-task-adapter.js +8 -9
  102. package/dist/core/adapter/adapters/akm-workflow-adapter.js +5 -5
  103. package/dist/core/adapter/adapters/claude-adapter.js +1 -1
  104. package/dist/core/adapter/adapters/dotenv-adapter.js +7 -6
  105. package/dist/core/adapter/adapters/generic-files-adapter.js +5 -5
  106. package/dist/core/adapter/adapters/index.js +3 -4
  107. package/dist/core/adapter/adapters/llm-wiki-adapter.js +12 -14
  108. package/dist/core/adapter/adapters/okf-adapter.js +8 -10
  109. package/dist/core/adapter/adapters/opencode-adapter.js +1 -1
  110. package/dist/core/adapter/adapters/shared.js +3 -3
  111. package/dist/core/adapter/adapters/tool-dir-shared.js +7 -25
  112. package/dist/core/adapter/adapters/website-snapshot-adapter.js +3 -3
  113. package/dist/core/adapter/detect-adapter.js +1 -1
  114. package/dist/core/adapter/execution-source.js +13 -35
  115. package/dist/core/adapter/registry.js +1 -1
  116. package/dist/core/adapter/validate-context.js +2 -4
  117. package/dist/core/asset/asset-placement.js +1 -1
  118. package/dist/core/asset/asset-ref.js +3 -3
  119. package/dist/core/asset/resolve-ref.js +5 -0
  120. package/dist/core/bundle-rename.js +12 -4
  121. package/dist/core/closest-match.js +37 -0
  122. package/dist/core/common.js +37 -57
  123. package/dist/core/config/config-io.js +26 -18
  124. package/dist/core/config/config-schema.js +19 -106
  125. package/dist/core/config/config-sources.js +3 -3
  126. package/dist/core/config/config-types.js +4 -4
  127. package/dist/core/config/config-walker.js +50 -77
  128. package/dist/core/config/config.js +438 -109
  129. package/dist/core/config/convert-engine-references.js +114 -0
  130. package/dist/core/config/convert-engines-shared.js +40 -0
  131. package/dist/core/config/convert-engines.js +300 -0
  132. package/dist/core/config/convert-models-overlay.js +137 -0
  133. package/dist/core/config/credentials.js +304 -0
  134. package/dist/core/config/engine-semantics.js +3 -3
  135. package/dist/core/config/migrate-keys.js +222 -0
  136. package/dist/core/config/model-aliases.js +37 -0
  137. package/dist/core/config/models-file.js +34 -0
  138. package/dist/core/config/retired-engines.js +53 -0
  139. package/dist/core/config/schema/connections.js +41 -0
  140. package/dist/core/config/schema/embedding.js +2 -2
  141. package/dist/core/config/schema/harnesses.js +41 -0
  142. package/dist/core/config/schema/improve-processes.js +9 -28
  143. package/dist/core/config/schema/improve.js +36 -1
  144. package/dist/core/config/schema/index-config.js +18 -20
  145. package/dist/core/config/schema/primitives.js +42 -17
  146. package/dist/core/config/schema/search.js +6 -11
  147. package/dist/core/config/schema/sources-bundles.js +9 -9
  148. package/dist/core/config/schema/workflow.js +2 -6
  149. package/dist/core/config/unusable-entries.js +66 -0
  150. package/dist/core/content-safety.js +3 -6
  151. package/dist/core/endpoint-url.js +47 -0
  152. package/dist/core/env-secret-ref.js +84 -73
  153. package/dist/core/errors.js +10 -16
  154. package/dist/core/extra-params.js +3 -3
  155. package/dist/core/improve-result.js +8 -9
  156. package/dist/core/json-schema.js +1 -1
  157. package/dist/core/lesson-lint.js +1 -1
  158. package/dist/core/llm-inference.js +80 -0
  159. package/dist/core/parse.js +2 -2
  160. package/dist/core/paths.js +33 -10
  161. package/dist/core/recognition-util.js +8 -10
  162. package/dist/core/redaction.js +94 -55
  163. package/dist/core/ref-token.js +82 -0
  164. package/dist/core/secret-value.js +14 -0
  165. package/dist/core/state/migrations.js +17 -22
  166. package/dist/core/structured.js +2 -68
  167. package/dist/core/subprocess.js +63 -22
  168. package/dist/core/type-presentation.js +10 -14
  169. package/dist/core/write-source.js +20 -4
  170. package/dist/execution/input-contract.js +3 -6
  171. package/dist/execution/notices.js +49 -0
  172. package/dist/execution/resolved-request.js +24 -40
  173. package/dist/execution/source.js +21 -45
  174. package/dist/execution/target-ref.js +2 -2
  175. package/dist/indexer/bundle-identity-guard.js +6 -5
  176. package/dist/indexer/ensure-index.js +1 -1
  177. package/dist/indexer/index-writer-lock.js +1 -1
  178. package/dist/indexer/indexer.js +46 -42
  179. package/dist/indexer/installations.js +12 -22
  180. package/dist/indexer/lookup/adapter-concept-owner.js +40 -14
  181. package/dist/indexer/materialize-embeddings.js +20 -16
  182. package/dist/indexer/passes/memory-inference.js +21 -50
  183. package/dist/indexer/passes/metadata.js +5 -5
  184. package/dist/indexer/scan/doc-to-entry.js +1 -1
  185. package/dist/indexer/scan/drain-dir.js +9 -11
  186. package/dist/indexer/search/db-search.js +9 -7
  187. package/dist/indexer/search/search-source.js +42 -22
  188. package/dist/indexer/usage/usage-events.js +2 -3
  189. package/dist/indexer/walk/index-context.js +2 -1
  190. package/dist/indexer/walk/matchers.js +3 -11
  191. package/dist/indexer/walk/path-resolver.js +13 -68
  192. package/dist/indexer/walk/walker.js +32 -26
  193. package/dist/integrations/agent/akm-read-tools.js +81 -0
  194. package/dist/integrations/agent/config.js +1 -1
  195. package/dist/integrations/agent/detect.js +32 -36
  196. package/dist/integrations/agent/execution.js +130 -428
  197. package/dist/integrations/agent/index.js +1 -1
  198. package/dist/integrations/agent/profiles.js +24 -28
  199. package/dist/integrations/agent/prompts.js +17 -30
  200. package/dist/integrations/agent/request-lowering.js +67 -101
  201. package/dist/integrations/agent/resolution.js +332 -0
  202. package/dist/integrations/agent/runner-dispatch.js +156 -181
  203. package/dist/integrations/agent/runner.js +20 -70
  204. package/dist/integrations/agent/runtime-port.js +4 -0
  205. package/dist/integrations/agent/runtime.js +10 -0
  206. package/dist/integrations/agent/spawn.js +65 -190
  207. package/dist/integrations/harnesses/aider/index.js +19 -39
  208. package/dist/integrations/harnesses/amazonq/index.js +17 -32
  209. package/dist/integrations/harnesses/claude/index.js +59 -28
  210. package/dist/integrations/harnesses/claude/session-log.js +7 -5
  211. package/dist/integrations/harnesses/codex/index.js +19 -31
  212. package/dist/integrations/harnesses/copilot/index.js +17 -35
  213. package/dist/integrations/harnesses/gemini/index.js +18 -34
  214. package/dist/integrations/harnesses/harness.js +36 -0
  215. package/dist/integrations/harnesses/index.js +20 -51
  216. package/dist/integrations/harnesses/opencode/agent-builder.js +132 -100
  217. package/dist/integrations/harnesses/opencode/index.js +11 -33
  218. package/dist/integrations/harnesses/opencode/roots.js +50 -0
  219. package/dist/integrations/harnesses/opencode/runtime/binary.js +206 -0
  220. package/dist/integrations/harnesses/opencode/runtime/command.js +152 -0
  221. package/dist/integrations/harnesses/opencode/runtime/index.js +177 -0
  222. package/dist/integrations/harnesses/opencode/runtime/tar.js +107 -0
  223. package/dist/integrations/harnesses/opencode/session-log-v1.js +15 -7
  224. package/dist/integrations/harnesses/opencode/session-log-v2.js +72 -48
  225. package/dist/integrations/harnesses/opencode/session-log.js +58 -137
  226. package/dist/integrations/harnesses/opencode/version.js +34 -53
  227. package/dist/integrations/harnesses/openhands/index.js +13 -37
  228. package/dist/integrations/harnesses/pi/index.js +21 -32
  229. package/dist/integrations/lockfile.js +1 -1
  230. package/dist/integrations/session-logs/index.js +11 -31
  231. package/dist/llm/client.js +93 -111
  232. package/dist/llm/embedder.js +19 -34
  233. package/dist/llm/embedders/connection.js +31 -0
  234. package/dist/llm/embedders/local-model-files.js +56 -0
  235. package/dist/llm/embedders/local.js +146 -115
  236. package/dist/llm/embedders/remote.js +26 -23
  237. package/dist/llm/embedders/types.js +1 -1
  238. package/dist/llm/index-passes.js +33 -39
  239. package/dist/llm/memory-infer.js +67 -77
  240. package/dist/llm/model-list.js +35 -0
  241. package/dist/llm/rerank-client.js +8 -14
  242. package/dist/llm/structured-call.js +45 -99
  243. package/dist/llm/structured.js +60 -0
  244. package/dist/output/renderers.js +2 -8
  245. package/dist/output/shapes/helpers.js +18 -44
  246. package/dist/output/shapes/passthrough.js +1 -0
  247. package/dist/output/shapes.js +1 -7
  248. package/dist/output/text/command-format.js +41 -39
  249. package/dist/output/text/health-format.js +8 -2
  250. package/dist/output/text/helpers.js +1 -1
  251. package/dist/output/text/migrate.js +12 -0
  252. package/dist/output/text/models.js +3 -2
  253. package/dist/output/text/registry-commands.js +1 -2
  254. package/dist/output/text/show-directives.js +16 -28
  255. package/dist/output/text/show-format.js +0 -2
  256. package/dist/output/text/targets-table.js +70 -0
  257. package/dist/output/text/workflow-format.js +44 -15
  258. package/dist/output/text.js +1 -1
  259. package/dist/registry/providers/skills-sh.js +1 -28
  260. package/dist/registry/providers/static-index.js +1 -71
  261. package/dist/runtime.js +6 -2
  262. package/dist/scripts/akm-migrate-node.js +47095 -44905
  263. package/dist/scripts/akm-migrate.js +46946 -44755
  264. package/dist/setup/detect.js +28 -273
  265. package/dist/setup/endpoint.js +36 -0
  266. package/dist/setup/semantic-assets.js +13 -19
  267. package/dist/setup/setup-flags.js +77 -0
  268. package/dist/setup/setup-plan.js +144 -0
  269. package/dist/setup/setup.js +134 -358
  270. package/dist/setup/steps/connection-shared.js +49 -101
  271. package/dist/setup/steps/connection.js +121 -524
  272. package/dist/setup/steps/embeddings.js +151 -0
  273. package/dist/setup/steps/harnesses.js +118 -0
  274. package/dist/setup/steps/platforms.js +2 -81
  275. package/dist/setup/steps/tasks.js +1 -2
  276. package/dist/setup/steps.js +10 -0
  277. package/dist/setup/summary.js +67 -0
  278. package/dist/sources/freshness.js +16 -21
  279. package/dist/sources/providers/git-provider.js +2 -9
  280. package/dist/sources/providers/provider-utils.js +13 -5
  281. package/dist/sources/resolve.js +12 -16
  282. package/dist/sources/snapshot-fetchers/robots.js +11 -12
  283. package/dist/sources/snapshot-fetchers/secret-seam.js +2 -4
  284. package/dist/sources/snapshot-fetchers/website-ingest.js +8 -15
  285. package/dist/sources/snapshot-fetchers/x.js +1 -1
  286. package/dist/standalone/onnxruntime-library.js +52 -0
  287. package/dist/storage/repositories/improve-ledger-repository.js +1 -1
  288. package/dist/storage/repositories/improve-runs-repository.js +0 -13
  289. package/dist/storage/repositories/index-entries-repository.js +2 -2
  290. package/dist/storage/repositories/proposals-repository.js +2 -2
  291. package/dist/storage/repositories/task-history-repository.js +2 -2
  292. package/dist/storage/repositories/workflow-runs-repository.js +44 -129
  293. package/dist/storage/sqlite-read-snapshot.js +33 -29
  294. package/dist/tasks/embedded.js +1 -1
  295. package/dist/tasks/log-redaction.js +7 -119
  296. package/dist/tasks/prepare/prepare-support.js +8 -7
  297. package/dist/tasks/prepare/prepare.js +8 -9
  298. package/dist/tasks/prepare/script-capture.js +9 -25
  299. package/dist/tasks/run/attempt-lifecycle.js +17 -35
  300. package/dist/tasks/run/load-task.js +54 -27
  301. package/dist/tasks/run/run-command-task.js +15 -10
  302. package/dist/tasks/run/run-native-task.js +8 -21
  303. package/dist/tasks/run/run-task.js +5 -8
  304. package/dist/tasks/run/run-workflow-task.js +14 -21
  305. package/dist/tasks/run/task-history.js +9 -17
  306. package/dist/tasks/run/task-log.js +1 -5
  307. package/dist/tasks/scheduler-invocation.js +13 -18
  308. package/dist/tasks/scheduler-sync.js +0 -1
  309. package/dist/tasks/source/bounded-document.js +31 -117
  310. package/dist/tasks/source/parse-task-source.js +0 -1
  311. package/dist/tasks/source/project-v4.js +5 -3
  312. package/dist/tasks/source/task-input-diagnostics.js +3 -4
  313. package/dist/tasks/source/task-source-v4.js +48 -72
  314. package/dist/tasks/source-v3.js +2 -5
  315. package/dist/tasks/task-run-reserved-flags.js +1 -2
  316. package/dist/workflows/authoring/authoring.js +2 -7
  317. package/dist/workflows/compile.js +1 -15
  318. package/dist/workflows/concurrency-policy.js +4 -4
  319. package/dist/workflows/exec/child-workflow.js +1 -4
  320. package/dist/workflows/exec/dispatch-redaction.js +35 -86
  321. package/dist/workflows/exec/environment.js +13 -77
  322. package/dist/workflows/exec/exec-unit.js +14 -55
  323. package/dist/workflows/exec/frozen-judge.js +26 -28
  324. package/dist/workflows/exec/native-executor.js +126 -71
  325. package/dist/workflows/exec/run-workflow.js +38 -42
  326. package/dist/workflows/exec/step-work.js +13 -17
  327. package/dist/workflows/exec/unit-dispatch.js +7 -21
  328. package/dist/workflows/freeze/environment.js +14 -119
  329. package/dist/workflows/freeze/freeze.js +14 -33
  330. package/dist/workflows/freeze/step-values.js +6 -13
  331. package/dist/workflows/freeze/targets/child-workflow.js +3 -5
  332. package/dist/workflows/freeze/targets/command.js +9 -15
  333. package/dist/workflows/freeze/targets/shell.js +0 -3
  334. package/dist/workflows/freeze/task-bindings.js +0 -1
  335. package/dist/workflows/parser.js +50 -59
  336. package/dist/workflows/plan.js +8 -2
  337. package/dist/workflows/renderer.js +83 -9
  338. package/dist/workflows/resource-limits.js +2 -2
  339. package/dist/workflows/runtime/run-plan.js +38 -23
  340. package/dist/workflows/runtime/runs.js +55 -93
  341. package/dist/workflows/runtime/workflow-asset-loader.js +55 -86
  342. package/dist/workflows/source-files.js +7 -19
  343. package/docs/README.md +10 -16
  344. package/docs/architecture/README.md +2 -37
  345. package/docs/architecture/adapters.md +2 -2
  346. package/docs/architecture/akm-core-principles.md +256 -118
  347. package/docs/architecture/architecture.md +283 -99
  348. package/docs/architecture/improvement.md +8 -2
  349. package/docs/architecture/internals/classification.md +1 -3
  350. package/docs/architecture/internals/fresh-host-rebuild-runbook.md +7 -6
  351. package/docs/architecture/internals/health-advisories.md +35 -74
  352. package/docs/architecture/internals/improve-workflow.md +27 -26
  353. package/docs/architecture/internals/indexing.md +3 -3
  354. package/docs/architecture/internals/storage-locations.md +48 -15
  355. package/docs/architecture/persisted-data-compat.md +10 -6
  356. package/docs/architecture/specs/okf-support.md +9 -11
  357. package/docs/architecture/specs/ref.md +7 -9
  358. package/docs/architecture/testing/testing-workflow.md +172 -52
  359. package/docs/architecture/workflow-engine.md +51 -34
  360. package/docs/guides/README.md +0 -1
  361. package/docs/guides/author-bundles.md +15 -20
  362. package/docs/guides/author-workflows.md +93 -71
  363. package/docs/guides/bundles.md +20 -16
  364. package/docs/guides/discover-and-load.md +1 -1
  365. package/docs/guides/getting-started.md +49 -3
  366. package/docs/guides/improve-the-library.md +10 -4
  367. package/docs/guides/recipes/headless-install.md +11 -16
  368. package/docs/guides/run-workflows.md +29 -20
  369. package/docs/guides/scheduling.md +2 -2
  370. package/docs/guides/use-with-any-agent.md +20 -22
  371. package/docs/integration/bundling-akm.md +19 -9
  372. package/docs/maintainers/README.md +2 -6
  373. package/docs/maintainers/release-checklist.md +73 -126
  374. package/docs/migration/README.md +10 -3
  375. package/docs/migration/release-notes/0.10.0.md +81 -16
  376. package/docs/migration/release-notes/0.6.0.md +1 -1
  377. package/docs/migration/release-notes/0.7.0.md +1 -1
  378. package/docs/migration/release-notes/0.9.0.md +1 -1
  379. package/docs/migration/release-notes/README.md +1 -1
  380. package/docs/migration/v0.9-to-v0.10.md +300 -60
  381. package/docs/migration/v0.9.1-to-v0.9.2.md +6 -5
  382. package/docs/posts/config-v2-lessons-16.md +1 -1
  383. package/docs/posts/llm-mode-reflect-13.md +1 -1
  384. package/docs/posts/release-0.6.0.md +11 -11
  385. package/docs/posts/release-0.8.0.md +4 -4
  386. package/docs/posts/workflows-vaults-09.md +1 -1
  387. package/docs/reference/README.md +1 -1
  388. package/docs/reference/asset-types.md +2 -2
  389. package/docs/reference/cli.md +477 -388
  390. package/docs/reference/configuration.md +569 -550
  391. package/docs/reference/data-and-telemetry.md +9 -6
  392. package/docs/reference/env-and-secrets.md +72 -15
  393. package/docs/reference/refs.md +3 -20
  394. package/docs/reference/registry.md +12 -38
  395. package/docs/reference/supported-formats.md +1 -1
  396. package/docs/reference/tasks.md +22 -11
  397. package/docs/reference/ui-api.md +14 -9
  398. package/docs/reference/workflow-schema.md +199 -154
  399. package/docs/reference/workflows.md +4 -6
  400. package/package.json +9 -11
  401. package/schemas/akm-config.json +1696 -2922
  402. package/schemas/akm-task.json +4 -4
  403. package/schemas/akm-workflow.json +36 -9
  404. package/ROADMAP.md +0 -112
  405. package/dist/assets/models.json +0 -35
  406. package/dist/commands/health/engine-usage.js +0 -45
  407. package/dist/commands/sources/dangerous-env-audit.js +0 -134
  408. package/dist/core/activation-policy.js +0 -67
  409. package/dist/core/config/schema/engines.js +0 -160
  410. package/dist/core/config/schema/execution.js +0 -23
  411. package/dist/core/spawn-env.js +0 -268
  412. package/dist/execution/directory-identity.js +0 -78
  413. package/dist/integrations/agent/builder-shared.js +0 -33
  414. package/dist/integrations/agent/builders.js +0 -43
  415. package/dist/integrations/agent/engine-fallback.js +0 -59
  416. package/dist/integrations/agent/engine-resolution.js +0 -333
  417. package/dist/integrations/agent/model-map.js +0 -475
  418. package/dist/integrations/harnesses/aider/agent-builder.js +0 -107
  419. package/dist/integrations/harnesses/aider/result-extractor.js +0 -53
  420. package/dist/integrations/harnesses/amazonq/agent-builder.js +0 -138
  421. package/dist/integrations/harnesses/amazonq/result-extractor.js +0 -48
  422. package/dist/integrations/harnesses/claude/agent-builder.js +0 -106
  423. package/dist/integrations/harnesses/claude/config-import.js +0 -67
  424. package/dist/integrations/harnesses/claude/result-extractor.js +0 -67
  425. package/dist/integrations/harnesses/codex/agent-builder.js +0 -150
  426. package/dist/integrations/harnesses/codex/result-extractor.js +0 -110
  427. package/dist/integrations/harnesses/copilot/agent-builder.js +0 -117
  428. package/dist/integrations/harnesses/copilot/result-extractor.js +0 -178
  429. package/dist/integrations/harnesses/gemini/agent-builder.js +0 -114
  430. package/dist/integrations/harnesses/gemini/result-extractor.js +0 -149
  431. package/dist/integrations/harnesses/opencode/config-import.js +0 -149
  432. package/dist/integrations/harnesses/opencode/model-config.js +0 -33
  433. package/dist/integrations/harnesses/opencode/model-work-agent.js +0 -115
  434. package/dist/integrations/harnesses/opencode/session-log-types.js +0 -12
  435. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -44
  436. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +0 -1052
  437. package/dist/integrations/harnesses/opencode-sdk/v1-adapter.js +0 -199
  438. package/dist/integrations/harnesses/opencode-sdk/v2-adapter.js +0 -254
  439. package/dist/integrations/harnesses/opencode-sdk/wire.js +0 -66
  440. package/dist/integrations/harnesses/openhands/agent-builder.js +0 -120
  441. package/dist/integrations/harnesses/openhands/result-extractor.js +0 -135
  442. package/dist/integrations/harnesses/pi/agent-builder.js +0 -89
  443. package/dist/integrations/harnesses/pi/result-extractor.js +0 -168
  444. package/dist/integrations/harnesses/shared.js +0 -18
  445. package/dist/integrations/harnesses/types.js +0 -55
  446. package/dist/llm/feature-gate.js +0 -115
  447. package/dist/output/shapes/models-list.js +0 -16
  448. package/dist/output/shapes/registry-search.js +0 -10
  449. package/dist/setup/detected-engines.js +0 -136
  450. package/dist/setup/engine-config.js +0 -97
  451. package/dist/setup/harness-config-import.js +0 -47
  452. package/dist/setup/providers.js +0 -14
  453. package/dist/setup/steps/semantic.js +0 -39
  454. package/dist/workflows/authoring/scope-key.js +0 -79
  455. package/dist/workflows/exec/lowering-notices.js +0 -23
  456. package/dist/workflows/source-semantics.js +0 -110
  457. package/docs/architecture/0.10-process-rules.md +0 -832
  458. package/docs/architecture/akm-architecture-decision-history.md +0 -2055
  459. package/docs/architecture/comparisons/claude-code-vs-akm-workflows-full.md +0 -550
  460. package/docs/architecture/decisions/0001-no-interpolation-attached-structured-context.md +0 -72
  461. package/docs/architecture/decisions/0002-unit-reuse-and-input-hash-scope.md +0 -142
  462. package/docs/architecture/decisions/0003-child-env-allowlist-and-provenance.md +0 -189
  463. package/docs/architecture/decisions/0004-task-input-contract-and-flag-coercion.md +0 -97
  464. package/docs/architecture/decisions/0005-task-result-vocabulary-and-legacy-read-mapping.md +0 -108
  465. package/docs/architecture/decisions/0006-task-source-version-routing.md +0 -124
  466. package/docs/architecture/decisions/0007-workflow-composition-bounds.md +0 -83
  467. package/docs/architecture/decisions/0008-task-binding-normalization.md +0 -88
  468. package/docs/architecture/decisions/0009-child-run-publication-column-parity.md +0 -80
  469. package/docs/architecture/decisions/0010-driver-protocol-cut.md +0 -36
  470. package/docs/architecture/decisions/0011-engine-run-loop-invariants.md +0 -125
  471. package/docs/architecture/decisions/README.md +0 -62
  472. package/docs/architecture/internals/functional-contract-patterns.md +0 -340
  473. package/docs/architecture/internals/registry-network-boundary.md +0 -57
  474. package/docs/architecture/internals/search.md +0 -248
  475. package/docs/architecture/reviews/env-secret-access.md +0 -319
  476. package/docs/architecture/runtime-boundary-design.md +0 -153
  477. package/docs/architecture/specs/0.9.0-close-out-plan.md +0 -361
  478. package/docs/architecture/specs/0.9.0-decisions.md +0 -532
  479. package/docs/architecture/specs/0.9.0-docs-code-drift-register.md +0 -745
  480. package/docs/architecture/specs/0.9.0-open-items-register.md +0 -135
  481. package/docs/architecture/specs/0.9.0-public-api-issue-backlog.md +0 -740
  482. package/docs/architecture/specs/0.9.0-release-surface-review.md +0 -636
  483. package/docs/architecture/specs/agent-command-engine-model-design.md +0 -513
  484. package/docs/architecture/specs/akm-0.9.0-bundle-adapter-spec.md +0 -501
  485. package/docs/architecture/specs/akm-0.9.0-ref-grammar-decision.md +0 -291
  486. package/docs/architecture/specs/akm-format-neutral-bundle-workspace-spec.md +0 -2059
  487. package/docs/architecture/specs/di-seams-plan.md +0 -539
  488. package/docs/architecture/specs/driver-protocol-keep-or-cut.md +0 -275
  489. package/docs/architecture/specs/fact-asset-type.md +0 -142
  490. package/docs/architecture/specs/improve-collapse-churn-detector-design.md +0 -634
  491. package/docs/architecture/specs/reviews/task-workflow-unification/README.md +0 -72
  492. package/docs/architecture/specs/reviews/task-workflow-unification/findings-consolidated.md +0 -152
  493. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-alternatives.md +0 -352
  494. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-bunqueue.md +0 -300
  495. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-openworkflow.md +0 -402
  496. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-1.md +0 -758
  497. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-2.md +0 -645
  498. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-3.md +0 -602
  499. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-adversarial.md +0 -27
  500. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-architecture.md +0 -27
  501. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-coverage.md +0 -74
  502. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-security.md +0 -15
  503. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-adversarial.md +0 -132
  504. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-verification.md +0 -147
  505. package/docs/architecture/specs/stash-conventions-code-spec.md +0 -275
  506. package/docs/architecture/specs/stash-organization-conventions.md +0 -377
  507. package/docs/architecture/specs/task-workflow-format-unification.md +0 -721
  508. package/docs/architecture/specs/workflow-engine-buy-vs-build.md +0 -231
  509. package/docs/architecture/specs/workflow-format-unification.md +0 -432
  510. package/docs/architecture/testing/manual-testing-checklist.md +0 -3411
  511. package/docs/architecture/testing/okf-v0.2-conformance-runbook.md +0 -924
  512. package/docs/architecture/testing/task-workflow-manual-tests.md +0 -1720
  513. package/docs/guides/claude-code-vs-akm-workflows.md +0 -29
  514. package/docs/guides/knowledge-management.md +0 -18
  515. package/docs/maintainers/curate-workmap.md +0 -335
  516. package/docs/migration/v0.5-to-v0.6.md +0 -759
  517. package/docs/migration/v0.7-to-v0.8.md +0 -1378
  518. package/docs/plans/0.9.2-agent-command-workflow-plan.md +0 -423
@@ -2,34 +2,22 @@
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  /**
5
- * Task source v4 — the second, additive task source grammar (spec
6
- * docs/plans/specs/p2a-task-source-v4.md §1.1 D1, §1.2 D2, §1.5 D2-N1..D2-N7,
7
- * §3). Never call this grammar bare "v4" in prose — the workflow plan IR is
8
- * separately versioned (D1).
5
+ * Task source v4 — the second, additive task source grammar. Never call this
6
+ * grammar bare "v4" in prose — the workflow plan IR is separately versioned.
9
7
  *
10
8
  * `version: 4` introduces typed `inputs:`, a single bounded `output:` schema
11
9
  * (legal only on command targets, the one kind whose runtime consumes it —
12
10
  * see `targetConsumesOutputSchema` below),
13
- * OPTIONAL scheduling (absent `schedule:` is valid and manual-only, D2-N6),
11
+ * OPTIONAL scheduling (absent `schedule:` is valid and manual-only),
14
12
  * and top-level execution controls (the `akm:` options bag and the `on:`
15
- * trigger block are both GONE — every `akm:` member that D2 does not
16
- * re-home survives as a top-level key instead, D2-N7). There is no
13
+ * trigger block are both GONE — every `akm:` member that is not re-homed
14
+ * survives as a top-level key instead). There is no
17
15
  * github-action `uses:` variant.
18
16
  *
19
- * `src/tasks/source-v3.ts` IS edited by this phase (D2-N4): the bounded-document
20
- * front end and the path-generic field helpers move body-intact out of that
21
- * file into `./bounded-document.ts`, and `source-v3.ts` now imports (and,
22
- * for the names that were already part of its public surface, re-exports)
23
- * them instead of declaring its own copies — see `./bounded-document.ts`'s
24
- * own header and spec §6 F-2 for the extraction itself. `parseTimeout` and
25
- * `parseTools` moved that way; `nullableSelector` did not (a recorded
26
- * deviation from a literal reading of D2-N4's own extraction list — see the
27
- * P2a Review log) and stays declared directly in `source-v3.ts`.
28
- *
29
- * This file implements its OWN top-level-rooted versions of the three v3
17
+ * This file implements its OWN top-level-rooted versions of the two v3
30
18
  * helpers that hardcode the `["akm", …]` field path —
31
- * `parseTimeoutTopLevel`/`nullableSelectorTopLevel`/`parseToolsTopLevel`
32
- * below, siblings of v3's `parseTimeout`/`nullableSelector`/`parseTools` —
19
+ * `parseTimeoutTopLevel`/`nullableSelectorTopLevel` below, siblings of v3's
20
+ * `parseTimeout`/`nullableSelector` —
33
21
  * because task source v4 needs the same accept/reject semantics at a
34
22
  * different, un-prefixed field path, not the same field path.
35
23
  */
@@ -37,15 +25,16 @@ import { parseBuiltinCommandAction } from "../../commands/command/builtin-action
37
25
  import { UsageError } from "../../core/errors.js";
38
26
  import { checkJsonSchemaDefinition, JSON_SCHEMA_SUBSET_SUPPORTED_KEYWORDS, validateJsonSchemaSubset, } from "../../core/json-schema.js";
39
27
  import { DURATION_UNITS, parseDuration } from "../../core/time.js";
40
- import { warn } from "../../core/warn.js";
28
+ import { warn, warnOnce } from "../../core/warn.js";
41
29
  import { applyInputDefaults, INPUT_NAME_PATTERN, validateInputs, } from "../../execution/input-contract.js";
42
30
  import { EXECUTION_MAX_TIMEOUT_MS } from "../../execution/limits.js";
31
+ import { warnRetiredEngineKey } from "../../execution/source.js";
43
32
  import { classifyTargetRef } from "../../execution/target-ref.js";
44
33
  import { detectSecretShapedParams } from "../../workflows/exec/param-secrets.js";
45
34
  import { WORKFLOW_ENV_VAR_NAME_PATTERN, WORKFLOW_MAX_SCHEMA_BYTES } from "../../workflows/resource-limits.js";
46
35
  import { TASK_V3_HOST_SHELLS, TASK_V3_MAX_SCHEDULES } from "../source-v3.js";
47
36
  import { TASK_RUN_RESERVED_FLAG_NAMES } from "../task-run-reserved-flags.js";
48
- import { asRecord, checkKeys, cloneBoundedJson, noGithubExpression, own, parseEnvironment, parseStringArray, presentJsonValue, readBoundedTaskSourceYaml, sourceError, stringField, TASK_V3_MAX_REDACT_NAMES, utf8Bytes, validateWorkingDirectory, } from "./bounded-document.js";
37
+ import { asRecord, checkKeys, cloneBoundedJson, noGithubExpression, own, parseEnvironment, parseStringArray, presentJsonValue, readBoundedTaskSourceYaml, sourceError, stringField, TASK_V3_MAX_REDACT_NAMES, utf8Bytes, } from "./bounded-document.js";
49
38
  // ── Closed constants (D1, D2-N3, D2-N7) ─────────────────────────────────────
50
39
  export const TASK_SOURCE_V4_VERSION = 4;
51
40
  /** The exact, closed top-level key set (D2-N7) — `akm` and `on` are deliberately absent. */
@@ -65,6 +54,8 @@ export const TASK_SOURCE_V4_TOP_LEVEL_KEYS = [
65
54
  "working-directory",
66
55
  "schedule",
67
56
  "agent",
57
+ "connection",
58
+ "harness",
68
59
  "engine",
69
60
  "model",
70
61
  "inference",
@@ -95,26 +86,23 @@ function ctxFrom(options) {
95
86
  return {
96
87
  filePath: options.filePath,
97
88
  sourceLabel: SOURCE_LABEL,
98
- ...(options.workspaceRoot ? { workspaceRoot: options.workspaceRoot } : {}),
99
89
  ...(options.lineAt ? { lineAt: options.lineAt } : {}),
100
90
  };
101
91
  }
102
- // ── classifyTaskSourceV4Uses (spec §3.3) ────────────────────────────────────
92
+ // ── classifyTaskSourceV4Uses ────────────────────────────────────────────────
103
93
  /**
104
94
  * A value SHAPED like `owner/repo[/path]@revision` — used only to produce a
105
- * good "the github-action target was removed" message (B-13), never to
95
+ * good "the github-action target was removed" message, never to
106
96
  * accept. Deliberately a shape test, not a full github-locator grammar:
107
- * native target classification recognizes no github-action variant at all
108
- * (P4 deleted the last one, `classifyTaskV3Uses`'s locator branch in
109
- * `source-v3.ts`) — only the shape needs to be recognized here, so the
97
+ * native target classification recognizes no github-action variant at all —
98
+ * only the shape needs to be recognized here, so the
110
99
  * rejection can name the target the user typed rather than guess.
111
100
  *
112
- * Runs ONLY on {@link classifyTargetRef}'s failure path (0.9.2 review round 2):
101
+ * Runs ONLY on {@link classifyTargetRef}'s failure path:
113
102
  * `@` is a legal character in a canonical asset ref, so a value the canonical
114
103
  * classifier accepts (`commands/review@v2`) is a valid target even though it
115
104
  * also matches this shape — the shape test upgrades the generic invalid-ref
116
- * message, and never vetoes a ref classification accepts (spec §3.3: "exists
117
- * only to produce a good message, never to accept").
105
+ * message, and never vetoes a ref classification accepts.
118
106
  */
119
107
  function looksLikeGithubActionLocator(value) {
120
108
  const at = value.lastIndexOf("@");
@@ -129,18 +117,18 @@ function looksLikeGithubActionLocator(value) {
129
117
  return true;
130
118
  }
131
119
  /**
132
- * Classify one exact `uses:` string for task source v4 (spec §3.3). Delegates
120
+ * Classify one exact `uses:` string for task source v4. Delegates
133
121
  * to {@link classifyTargetRef} (`src/execution/target-ref.ts`) — the repo's
134
122
  * one canonical-ref classifier — rather than re-deriving ref grammar; layers
135
- * the `akm/command` builtin special case, the task-ref rejection (B-14), and
123
+ * the `akm/command` builtin special case, the task-ref rejection, and
136
124
  * — on the classification-failure path only — the github-locator-shape
137
- * rejection (B-13) on top.
125
+ * rejection on top.
138
126
  */
139
127
  /**
140
128
  * The remedy sentence every `uses:` rejection below ends with. ONE constant so
141
129
  * the advice can never drift from what {@link TaskSourceV4UsesTarget} actually
142
130
  * admits — `commands/`, `scripts/`, `workflows/`, and the `akm/command`
143
- * builtin. Notably NOT `tasks/`: a task ref is rejected by B-14 below.
131
+ * builtin. Notably NOT `tasks/`: a task ref is rejected below.
144
132
  */
145
133
  const TASK_SOURCE_V4_USES_REMEDY = "Use a canonical commands/, scripts/, or workflows/ ref, or akm/command, instead.";
146
134
  export function classifyTaskSourceV4Uses(value) {
@@ -210,18 +198,6 @@ function parseTimeoutTopLevel(value, ctx) {
210
198
  }
211
199
  return value;
212
200
  }
213
- function parseToolsTopLevel(value, ctx) {
214
- if (value === null || typeof value === "string")
215
- return value;
216
- if (Array.isArray(value)) {
217
- if (value.some((entry) => typeof entry !== "string"))
218
- sourceError(ctx, ["tools"], "array values must be strings.");
219
- return value;
220
- }
221
- if (typeof value === "object")
222
- return value;
223
- sourceError(ctx, ["tools"], "must be a string, string array, mapping, or null.");
224
- }
225
201
  function parseTarget(input, ctx) {
226
202
  const hasUses = own(input, "uses");
227
203
  if (hasUses) {
@@ -272,7 +248,6 @@ function parseTarget(input, ctx) {
272
248
  workingDirectory = stringField(input["working-directory"], ctx, ["working-directory"], {
273
249
  nonempty: true,
274
250
  });
275
- validateWorkingDirectory(workingDirectory, ctx);
276
251
  }
277
252
  return Object.freeze({
278
253
  kind: "run",
@@ -283,16 +258,20 @@ function parseTarget(input, ctx) {
283
258
  }
284
259
  function parseExecutionControls(input, ctx) {
285
260
  const out = {};
286
- for (const key of ["agent", "engine", "model"]) {
261
+ for (const key of ["agent", "connection", "harness", "engine", "model"]) {
287
262
  if (own(input, key))
288
263
  out[key] = nullableSelectorTopLevel(input[key], ctx, key);
264
+ if (key === "engine" && own(input, key))
265
+ warnRetiredEngineKey();
289
266
  }
290
267
  if (own(input, "inference")) {
291
268
  const inference = presentJsonValue(input.inference, ctx, ["inference"]);
292
269
  out.inference = inference === null ? null : asRecord(inference, ctx, ["inference"]);
293
270
  }
294
- if (own(input, "tools"))
295
- out.tools = parseToolsTopLevel(presentJsonValue(input.tools, ctx, ["tools"]), ctx);
271
+ // Retired: assets no longer restrict an agent's tools.
272
+ if (own(input, "tools")) {
273
+ warnOnce(`task-source-v4-tools:${ctx.filePath}`, `${ctx.filePath}: \`tools\` is retired and ignored.`);
274
+ }
296
275
  if (own(input, "timeout"))
297
276
  out.timeout = parseTimeoutTopLevel(input.timeout, ctx);
298
277
  if (own(input, "redact")) {
@@ -378,8 +357,7 @@ function parseInputDeclarations(value, ctx) {
378
357
  if (!INPUT_NAME_PATTERN.test(name)) {
379
358
  sourceError(ctx, ["inputs", name], "must match the input name pattern (a letter/underscore, then letters, digits, or underscores).");
380
359
  }
381
- // Code-review finding (docs/plans/specs/p2b-input-bindings.md review
382
- // round 2, scheduler-binding.ts:238): a declared input name that
360
+ // A declared input name that
383
361
  // collides with a flag `akm task run` already binds to itself (--bundle,
384
362
  // --scheduled, …) can never be supplied through that CLI — parseTaskInputFlags
385
363
  // (../../commands/tasks/tasks-cli.ts) always treats the name as its OWN
@@ -415,7 +393,7 @@ function parseOutputSchema(value, ctx) {
415
393
  * output schema anywhere (run-native-task.ts decides status from the exit
416
394
  * code alone; the workflow arm freezes a child plan without one), so an
417
395
  * authored `output:` there would be a silently unenforced contract — the
418
- * fifth state the fail-closed rule forbids (0.9.2 review round 2; same
396
+ * fifth state the fail-closed rule forbids (same
419
397
  * grammar pattern as `with:` being legal only with `uses: akm/command`).
420
398
  */
421
399
  function targetConsumesOutputSchema(target) {
@@ -423,7 +401,7 @@ function targetConsumesOutputSchema(target) {
423
401
  }
424
402
  // ── schedule: -> TaskSourceV4ScheduleBinding[] (D2-N5, D2-N6, B-06..B-10, B-38) ──
425
403
  /**
426
- * Every schedule binding must be independently runnable (0.9.2 review round 2).
404
+ * Every schedule binding must be independently runnable.
427
405
  *
428
406
  * A scheduled firing supplies NO input flags — `compileTaskSchedulerBindings`
429
407
  * (../scheduler-binding.ts) appends only the entry's own
@@ -431,8 +409,8 @@ function targetConsumesOutputSchema(target) {
431
409
  * tail — so that literal PLUS the declared defaults is the complete value set
432
410
  * `akm task run --scheduled` will see, and it is checked there by the very
433
411
  * same `applyInputDefaults` + `validateInputs` pair (../run/load-task.ts).
434
- * A `required: true` declaration may not also carry a `default` (D2-N3,
435
- * `parseInputDeclaration` above), so an entry that names no value for one can
412
+ * A `required: true` declaration may not also carry a `default`
413
+ * (`parseInputDeclaration` above), so an entry that names no value for one can
436
414
  * never satisfy the contract, at any hour, ever.
437
415
  *
438
416
  * The source document alone knows both halves of that contradiction, so it is
@@ -442,11 +420,11 @@ function targetConsumesOutputSchema(target) {
442
420
  * the DEFAULTED view — that gate is what makes such a schedule unreachable
443
421
  * rather than merely ill-advised, and it still guards a task source reaching
444
422
  * sync through any other path — but an author should not have to run `akm
445
- * task sync` to learn that a document contradicts itself (the parse-time
446
- * rejection p2a's own review log named as the natural fix). Manual `akm task
423
+ * task sync` to learn that a document contradicts itself, so it is rejected at
424
+ * parse time. Manual `akm task
447
425
  * run` is deliberately unaffected: a manual run takes the value from the
448
426
  * input's own `--<name>` flag, so a required, default-less input plus NO
449
- * `schedule:` stays valid and manual-only (B-06, D2-N6).
427
+ * `schedule:` stays valid and manual-only.
450
428
  *
451
429
  * Runs for every entry, AFTER the raw `schedule[i].inputs` check below, so an
452
430
  * entry that authors an `inputs:` mapping keeps that check's exact
@@ -475,12 +453,12 @@ function parseScheduleEntry(entryRaw, index, contract, ctx) {
475
453
  ...entryPath,
476
454
  "inputs",
477
455
  ]);
478
- // Fail-closed exact-name check (code-review finding, task-source-v4.ts:530):
479
- // `validateInputs`'s synthetic `{type:"object", properties}` schema (spec
480
- // §4.2) deliberately carries no `additionalProperties:false` — that is the
456
+ // Fail-closed exact-name check:
457
+ // `validateInputs`'s synthetic `{type:"object", properties}` schema
458
+ // deliberately carries no `additionalProperties:false` — that is the
481
459
  // right default for a general-purpose contract validator with other
482
460
  // callers (materializeInputFlags already does its own exact-name check
483
- // before ever calling validateInputs, per D3-N3's design) — so relying on
461
+ // before ever calling validateInputs) — so relying on
484
462
  // validateInputs alone here would silently accept a typo'd or wholly
485
463
  // undeclared schedule[i].inputs key forever, exactly the fifth state the
486
464
  // fail-closed rule forbids. checkKeys mirrors materializeInputFlags' own
@@ -491,9 +469,8 @@ function parseScheduleEntry(entryRaw, index, contract, ctx) {
491
469
  // sourceError call rooted at entryPath, not [...entryPath, "inputs"]: the
492
470
  // per-error detail already carries "inputs.<name>" (validateInputs), so
493
471
  // adding a SECOND ".inputs" segment to the field path here would render
494
- // two path roots in one message (code-review finding, was the bare "$"
495
- // default leaking through — see docs/plans/specs/p2a-task-source-v4.md
496
- // review-log item 4a).
472
+ // two path roots in one message (the bare "$" default would otherwise
473
+ // leak through).
497
474
  const errors = validateInputs(contract, inputsValue, { pathRoot: "inputs" });
498
475
  if (errors.length > 0)
499
476
  sourceError(ctx, entryPath, errors.join("; "));
@@ -528,8 +505,8 @@ function parseSchedule(input, contract, ctx) {
528
505
  // ── Top-level key rejection (akm:/on: removal, B-11/B-12; D2-N7) ───────────
529
506
  function checkTopLevelKeys(input, ctx) {
530
507
  if (own(input, "akm")) {
531
- sourceError(ctx, ["akm"], "is removed in task source v4; its members are top-level keys now (schedule, timeout, engine, model, redact, " +
532
- "maxSteps, maxRetries, description, when_to_use, tags, agent, inference, tools, and output for outputSchema) " +
508
+ sourceError(ctx, ["akm"], "is removed in task source v4; its members are top-level keys now (schedule, timeout, connection, harness, model, redact, " +
509
+ "maxSteps, maxRetries, description, when_to_use, tags, agent, inference, and output for outputSchema) " +
533
510
  "— see docs/reference/tasks.md.");
534
511
  }
535
512
  if (own(input, "on")) {
@@ -537,8 +514,8 @@ function checkTopLevelKeys(input, ctx) {
537
514
  }
538
515
  checkKeys(input, TASK_SOURCE_V4_TOP_LEVEL_KEYS, ctx, []);
539
516
  }
540
- // ── parseTaskSourceV4Document (spec §3.2) ───────────────────────────────────
541
- /** Parse an already-decoded JSON/YAML value as a task source v4 document (spec §3.2). */
517
+ // ── parseTaskSourceV4Document ───────────────────────────────────────────────
518
+ /** Parse an already-decoded JSON/YAML value as a task source v4 document. */
542
519
  export function parseTaskSourceV4Document(value, options) {
543
520
  const ctx = ctxFrom(options);
544
521
  const cloned = cloneBoundedJson(value, ctx, [], { nodes: 0 });
@@ -596,7 +573,6 @@ export function parseTaskSourceV4(input) {
596
573
  const { root, lineAt } = readBoundedTaskSourceYaml(input, { sourceLabel: SOURCE_LABEL });
597
574
  return parseTaskSourceV4Document(root, {
598
575
  filePath: input.filePath,
599
- ...(input.workspaceRoot ? { workspaceRoot: input.workspaceRoot } : {}),
600
576
  lineAt,
601
577
  });
602
578
  }
@@ -2,11 +2,8 @@
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 { TASK_V3_MAX_SCHEDULES } from "./source/bounded-document.js";
5
- // D2-N4 (spec docs/plans/specs/p2a-task-source-v4.md §3.1, §9): re-exported
6
- // at its EXISTING name so no importer changes. The one name a surviving
7
- // `src` consumer still imports (task-source-v4.ts) — every other
8
- // bounded-document re-export this file used to carry was dropped in P4
9
- // §3.2.3.
5
+ // Re-exported at its existing name so no importer changes: the one name a
6
+ // surviving `src` consumer still imports (task-source-v4.ts).
10
7
  export { TASK_V3_MAX_SCHEDULES };
11
8
  export const TASK_EXTENSION = ".yml";
12
9
  export const TASK_NEAR_MISS_EXTENSION = ".yaml";
@@ -7,8 +7,7 @@
7
7
  * declared `inputs:` name that collides with one, without creating an import
8
8
  * cycle back through the CLI layer.
9
9
  *
10
- * Code-review finding (docs/plans/specs/p2b-input-bindings.md, P2b review
11
- * round 2): `schedulerInputFlagTail` (`../tasks/scheduler-binding.ts`) and
10
+ * `schedulerInputFlagTail` (`../tasks/scheduler-binding.ts`) and
12
11
  * `akm task run <id> --<name> <value>` both let an authored/declared input
13
12
  * NAME collide with a flag `akm task run` already binds to itself
14
13
  * (`--bundle`, `--scheduled`, …). `parseTaskInputFlags`
@@ -49,15 +49,10 @@ export function assertWorkflowMarkdownName(name) {
49
49
  throw new UsageError(`akm workflow create is markdown-only: it emits Markdown and cannot create "${name}". ` +
50
50
  `Use a plain name (no ".yaml"/".yml" suffix).`);
51
51
  }
52
- // 0.9.2 review round 2 (P4 sweep criterion-21 caveat, spec
53
- // docs/plans/specs/p4-deletions-closeout.md §4.1 row B-49): this return's
54
- // third member was `stashDir` through 0.9.1 and leaked verbatim into the
52
+ // This return's third member (`bundleDir`) leaks verbatim into the
55
53
  // `akm workflow create` JSON envelope (Stable per STABILITY.md) via
56
54
  // `output("workflow-create", { ok: true, ...result })`
57
- // (src/commands/workflow-cli.ts). Renamed to `bundleDir` here — the same
58
- // value-preserving field rename `RunTaskOptions.stashDir` got in P1b (see
59
- // src/tasks/run/task-result.ts's header, F-3) — so the shipped envelope now
60
- // matches current bundle vocabulary. BREAKING vs 0.9.1's envelope shape.
55
+ // (src/commands/workflow-cli.ts), so renaming it changes the shipped envelope.
61
56
  export function createWorkflowAsset(input) {
62
57
  assertWorkflowMarkdownName(input.name);
63
58
  const config = loadConfig();
@@ -11,7 +11,6 @@
11
11
  import path from "node:path";
12
12
  import { parseWorkflow } from "./parser.js";
13
13
  import { formatReference, parseReference } from "./program/expressions.js";
14
- import { canonicalizeWorkflowWorkingDirectory, WorkflowSourceSemanticError } from "./source-semantics.js";
15
14
  /** Compile by authoritative source extension. */
16
15
  export function compileWorkflowSource(source, options) {
17
16
  const extension = path.extname(options.path).toLowerCase();
@@ -29,20 +28,7 @@ export function compileWorkflowSource(source, options) {
29
28
  ],
30
29
  };
31
30
  }
32
- const parsed = parseWorkflow(source, {
33
- path: options.path,
34
- title,
35
- validateExecCwd: (value) => {
36
- try {
37
- return { ok: true, value: canonicalizeWorkflowWorkingDirectory(value, options.workspaceRoot) };
38
- }
39
- catch (cause) {
40
- if (cause instanceof WorkflowSourceSemanticError)
41
- return { ok: false, code: cause.code, message: cause.message };
42
- return { ok: false, code: "working-directory-unverifiable", message: "cwd cannot be physically verified." };
43
- }
44
- },
45
- });
31
+ const parsed = parseWorkflow(source, { path: options.path, title });
46
32
  if (parsed.ok)
47
33
  return parsed;
48
34
  return {
@@ -19,7 +19,7 @@ export function workflowMaxConcurrency(configured, cpuCount = os.cpus()?.length
19
19
  // ── Fan-out defaults ─────────────────────────────────────────────────────────
20
20
  //
21
21
  // A `map` step's real width is the minimum of its own `map.concurrency`, the
22
- // run's frozen `execution.maxConcurrency`, the LLM engine's frozen
22
+ // run's frozen `execution.maxConcurrency`, the connection's frozen
23
23
  // concurrency, and the host CPU cap. The defaults are modest: map units call
24
24
  // rate-limited providers and RAM-hungry agents.
25
25
  /**
@@ -29,12 +29,12 @@ export function workflowMaxConcurrency(configured, cpuCount = os.cpus()?.length
29
29
  * (`workflow.defaultMapConcurrency`; `1` restores serial fan-out).
30
30
  */
31
31
  export const DEFAULT_MAP_CONCURRENCY = 4;
32
- /** Default concurrency for an LLM engine on a loopback endpoint: a local model server runs one inference. */
32
+ /** Default concurrency for a connection on a loopback endpoint: a local model server runs one inference. */
33
33
  export const DEFAULT_LOCAL_LLM_ENGINE_CONCURRENCY = 1;
34
- /** Default concurrency for a remote LLM engine: equal to {@link DEFAULT_MAP_CONCURRENCY}, so it never re-serializes a map. */
34
+ /** Default concurrency for a connection on a remote endpoint: equal to {@link DEFAULT_MAP_CONCURRENCY}, so it never re-serializes a map. */
35
35
  export const DEFAULT_REMOTE_LLM_ENGINE_CONCURRENCY = 4;
36
36
  export { isLoopbackEndpoint, isLoopbackHost } from "../core/loopback.js";
37
- /** Concurrency to freeze for an LLM engine: an explicit `engines.<name>.concurrency` (clamped), else by endpoint. */
37
+ /** Concurrency to freeze for a connection: its own `concurrency` (clamped), else by endpoint. */
38
38
  export function defaultLlmEngineConcurrency(endpoint, configured) {
39
39
  if (typeof configured === "number" && Number.isFinite(configured))
40
40
  return clampMaxConcurrency(configured);
@@ -104,8 +104,6 @@ async function publishChildRun(input, invocationKey) {
104
104
  run: {
105
105
  id: childRunId,
106
106
  workflowRef: target.ref,
107
- scopeKey: parentRow.scope_key,
108
- workflowEntryId: null,
109
107
  workflowTitle: target.frozenPlan.title,
110
108
  paramsJson: JSON.stringify(childParams),
111
109
  currentStepId: target.frozenPlan.steps[0]?.stepId ?? null,
@@ -149,8 +147,7 @@ async function driveChildRun(input, childRow) {
149
147
  ...(ctx.dispatcher ? { dispatcher: ctx.dispatcher } : {}),
150
148
  ...(ctx.maxConcurrency !== undefined ? { maxConcurrency: ctx.maxConcurrency } : {}),
151
149
  ...(ctx.eventSource !== undefined ? { eventSource: ctx.eventSource } : {}),
152
- // The parent's own `finally` owns the process-lifecycle drain; no maxSteps/maxRetries.
153
- disposeDispatchResources: () => { },
150
+ ...(ctx.bundleRootOverride !== undefined ? { bundleRootOverride: ctx.bundleRootOverride } : {}),
154
151
  };
155
152
  try {
156
153
  // The re-read stays inside this try: an escaped throw would skip the
@@ -2,105 +2,54 @@
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  /**
5
- * The one redaction contract every frozen-workflow dispatch (unit or gate
6
- * judge) is held to before anything about its outcome reaches durable state.
7
- * A leaf module, so the judge path reuses it without an import cycle.
5
+ * What a frozen-workflow unit's outcome is scrubbed of before it reaches
6
+ * durable state: the secrets its environment bindings substituted, on top of
7
+ * what the dispatch itself already redacted (the runner's connection key), and
8
+ * the credential-named variables of the environment every unit's process inherits.
8
9
  */
9
- import { collectSensitiveValues, isEnvPassthroughValueSafeToExpose, redactSensitiveText, redactSensitiveValue, } from "../../core/redaction.js";
10
- import { lookupApiKeyFileValue, lookupApiKeySecretRefValue } from "../../integrations/agent/engine-resolution.js";
10
+ import { collectInferredSecretValues, collectSensitiveValues, redactSensitiveValue } from "../../core/redaction.js";
11
+ import { collectDispatchSensitiveValues } from "../../integrations/agent/runner-dispatch.js";
11
12
  /**
12
13
  * Every exact value that must never reach the journal from one dispatch: the
13
- * resolved `env` bindings, the engine's (and SDK fallback's) credential from
14
- * env, file, or secret store, and unsafe passthrough values. Read at call time,
15
- * so collect no earlier than the dispatch being scrubbed.
14
+ * secrets substituted into the unit's env bindings (`dispatch.sensitiveValues`;
15
+ * the rest of an env asset is configuration and reaches the journal as is), the
16
+ * runner's connection key, and the credential-named variables of akm's
17
+ * environment, which a shell command inherits as a runner does. Read at call
18
+ * time, so collect no earlier than the dispatch being scrubbed.
16
19
  */
17
- export function collectWorkflowDispatchSensitiveValues(dispatch, env) {
18
- const values = new Set([...Object.values(env ?? {}), ...(dispatch.sensitiveValues ?? [])]);
19
- const addCredential = (runner) => {
20
- if (!runner)
21
- return;
22
- if (runner.kind === "llm") {
23
- for (const name of runner.credential?.names ?? []) {
24
- const value = process.env[name]?.trim();
25
- if (value)
26
- values.add(value);
27
- }
28
- // #905: file-backed credential — best-effort read, never throws, so a
29
- // broken apiKeyFile is reported by the real dispatch, not this collector.
30
- if (runner.apiKeyFile) {
31
- const value = lookupApiKeyFileValue(runner.apiKeyFile);
32
- if (value)
33
- values.add(value);
34
- }
35
- // #953: secret-store-backed credential — same best-effort rationale.
36
- if (runner.apiKeySecretRef) {
37
- const value = lookupApiKeySecretRefValue(runner.apiKeySecretRef);
38
- if (value)
39
- values.add(value);
40
- }
41
- return;
42
- }
43
- for (const name of runner.profile.envPassthrough ?? []) {
44
- const value = process.env[name];
45
- if (!isEnvPassthroughValueSafeToExpose(name, value) && value)
46
- values.add(value);
47
- }
48
- if (runner.kind === "sdk") {
49
- for (const name of runner.fallbackCredential?.names ?? []) {
50
- const value = process.env[name]?.trim();
51
- if (value)
52
- values.add(value);
53
- }
54
- if (runner.fallbackApiKeyFile) {
55
- const value = lookupApiKeyFileValue(runner.fallbackApiKeyFile);
56
- if (value)
57
- values.add(value);
58
- }
59
- if (runner.fallbackApiKeySecretRef) {
60
- const value = lookupApiKeySecretRefValue(runner.fallbackApiKeySecretRef);
61
- if (value)
62
- values.add(value);
63
- }
64
- }
65
- };
66
- addCredential(dispatch.runner);
20
+ export function collectWorkflowDispatchSensitiveValues(dispatch) {
21
+ const values = new Set(dispatch.sensitiveValues ?? []);
22
+ const dispatchValues = dispatch.runner
23
+ ? collectDispatchSensitiveValues(dispatch.runner)
24
+ : collectInferredSecretValues(process.env);
25
+ for (const value of dispatchValues)
26
+ values.add(value);
67
27
  return collectSensitiveValues(values);
68
28
  }
29
+ /**
30
+ * Turn a number leaf that is exactly a sensitive value into its text, so the string scrub redacts it (a
31
+ * numeric secret echoed as a JSON number). Only the unit's parsed `result` takes this path: a number
32
+ * elsewhere in an outcome (`tokens`) stays a number.
33
+ */
34
+ function stringifySensitiveNumbers(value, sensitiveValues) {
35
+ if (typeof value === "number")
36
+ return sensitiveValues.includes(String(value)) ? String(value) : value;
37
+ if (Array.isArray(value))
38
+ return value.map((entry) => stringifySensitiveNumbers(entry, sensitiveValues));
39
+ if (value && typeof value === "object") {
40
+ return Object.fromEntries(Object.entries(value).map(([key, child]) => [key, stringifySensitiveNumbers(child, sensitiveValues)]));
41
+ }
42
+ return value;
43
+ }
69
44
  /**
70
45
  * Scrub a dispatch outcome before anything about it is journaled. A
71
46
  * `failureReason` the scrub altered carried a secret, so it is downgraded.
72
47
  */
73
48
  export function redactUnitOutcome(outcome, sensitiveValues) {
74
- const redacted = redactSensitiveValue(outcome, sensitiveValues);
49
+ const prepared = "result" in outcome ? { ...outcome, result: stringifySensitiveNumbers(outcome.result, sensitiveValues) } : outcome;
50
+ const redacted = redactSensitiveValue(prepared, sensitiveValues);
75
51
  if (outcome.failureReason !== undefined && redacted.failureReason !== outcome.failureReason) {
76
52
  redacted.failureReason = "reported_failure";
77
53
  }
78
54
  return redacted;
79
55
  }
80
- /** Scrub a value thrown out of a dispatch; re-wrapped only when the scrub changed its message. */
81
- function redactDispatchError(err, sensitiveValues) {
82
- if (sensitiveValues.length === 0 || !(err instanceof Error))
83
- return err;
84
- const redacted = redactSensitiveText(err.message, sensitiveValues);
85
- if (redacted === err.message)
86
- return err;
87
- const replacement = new Error(redacted);
88
- replacement.name = err.name;
89
- return replacement;
90
- }
91
- /**
92
- * Wrap a dispatcher so both its outcome and its thrown error are scrubbed with
93
- * the request's `sensitiveValues` (the gate judge; the unit path scrubs at its
94
- * own journal boundary after the structured-output parse).
95
- */
96
- export function withDispatchRedaction(inner) {
97
- return async (request, feedback) => {
98
- const sensitiveValues = request.sensitiveValues ?? [];
99
- try {
100
- return redactUnitOutcome(await inner(request, feedback), sensitiveValues);
101
- }
102
- catch (err) {
103
- throw redactDispatchError(err, sensitiveValues);
104
- }
105
- };
106
- }