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
@@ -101,6 +101,38 @@ function copyFileOutsideThisProcess(source, destination) {
101
101
  const reason = result.stderr.trim() || (result.signal ? `killed by ${result.signal}` : `exit status ${result.status}`);
102
102
  throw new Error(`cp could not copy ${source}: ${reason}`);
103
103
  }
104
+ /**
105
+ * Copy a stable main/WAL pair of the database at `dbPath` to `snapshotPath`
106
+ * (and `<snapshotPath>-wal`), never attaching SQLite to the source. Retries
107
+ * while a writer is active; throws {@link SqliteReadSnapshotUnavailableError}
108
+ * when the files never settle.
109
+ */
110
+ export function copySqliteSnapshot(dbPath, snapshotPath) {
111
+ for (let attempt = 0; attempt < SNAPSHOT_MAX_ATTEMPTS; attempt++) {
112
+ if (attempt > 0)
113
+ sleepSync(SNAPSHOT_BACKOFF_MS * attempt);
114
+ try {
115
+ if (pathExists(`${dbPath}-journal`))
116
+ continue;
117
+ const before = databaseFingerprint(dbPath);
118
+ copyFileOutsideThisProcess(dbPath, snapshotPath);
119
+ if (before.wal)
120
+ copyFileOutsideThisProcess(`${dbPath}-wal`, `${snapshotPath}-wal`);
121
+ else
122
+ fs.rmSync(`${snapshotPath}-wal`, { force: true });
123
+ const after = databaseFingerprint(dbPath);
124
+ if (fingerprintsEqual(before, after) && !pathExists(`${dbPath}-journal`))
125
+ return;
126
+ }
127
+ catch (error) {
128
+ if (error.code === "ENOENT")
129
+ continue;
130
+ throw error;
131
+ }
132
+ }
133
+ throw new SqliteReadSnapshotUnavailableError(`SQLite main/WAL files did not settle after ${SNAPSHOT_MAX_ATTEMPTS} attempts with backoff — ` +
134
+ "a writer may be continuously active, or a hot rollback journal never cleared");
135
+ }
104
136
  /**
105
137
  * Open an isolated copy of an existing SQLite database.
106
138
  *
@@ -118,35 +150,7 @@ export function openSqliteReadSnapshot(dbPath) {
118
150
  const snapshotPath = path.join(snapshotDir, "snapshot.db");
119
151
  let db;
120
152
  try {
121
- let copied = false;
122
- for (let attempt = 0; attempt < SNAPSHOT_MAX_ATTEMPTS; attempt++) {
123
- if (attempt > 0)
124
- sleepSync(SNAPSHOT_BACKOFF_MS * attempt);
125
- try {
126
- if (pathExists(`${dbPath}-journal`))
127
- continue;
128
- const before = databaseFingerprint(dbPath);
129
- copyFileOutsideThisProcess(dbPath, snapshotPath);
130
- if (before.wal)
131
- copyFileOutsideThisProcess(`${dbPath}-wal`, `${snapshotPath}-wal`);
132
- else
133
- fs.rmSync(`${snapshotPath}-wal`, { force: true });
134
- const after = databaseFingerprint(dbPath);
135
- if (fingerprintsEqual(before, after) && !pathExists(`${dbPath}-journal`)) {
136
- copied = true;
137
- break;
138
- }
139
- }
140
- catch (error) {
141
- if (error.code === "ENOENT")
142
- continue;
143
- throw error;
144
- }
145
- }
146
- if (!copied) {
147
- throw new SqliteReadSnapshotUnavailableError(`SQLite main/WAL files did not settle after ${SNAPSHOT_MAX_ATTEMPTS} attempts with backoff — ` +
148
- "a writer may be continuously active, or a hot rollback journal never cleared");
149
- }
153
+ copySqliteSnapshot(dbPath, snapshotPath);
150
154
  db = openDatabaseFinalizing(snapshotPath, { readonly: true, create: false });
151
155
  const closeSnapshot = db.close.bind(db);
152
156
  let closed = false;
@@ -69,7 +69,7 @@ export function listEmbeddedTasks() {
69
69
  }
70
70
  let parsed;
71
71
  try {
72
- parsed = parseTaskSource({ yaml, filePath, workspaceRoot: TASKS_ASSETS_DIR });
72
+ parsed = parseTaskSource({ yaml, filePath });
73
73
  }
74
74
  catch {
75
75
  continue;
@@ -1,110 +1,9 @@
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
- /**
5
- * Decide which exact values must be scrubbed from a task's persisted run log
6
- * (issue #755).
7
- *
8
- * # The gap
9
- *
10
- * All three task target kinds funnel through `persistRunLog`, which applied
11
- * only `redactCredentialPatterns` — credential *shapes* (`Bearer …`, `sk-…`,
12
- * webhook URLs). Prompt- and workflow-target runs additionally redact the exact
13
- * secret values reachable by the run before their output ever reaches the log.
14
- * Command-target runs did not: a scheduled command that echoed a configured
15
- * secret whose value is not credential-shaped persisted it verbatim, into both
16
- * the `.log` file and `logs.db`, for the whole retention window.
17
- *
18
- * # Why the obvious fix is wrong
19
- *
20
- * The issue proposed reusing {@link isEnvPassthroughValueSafeToExpose} — the
21
- * filter the prompt path uses — over the env handed to the child. That filter
22
- * fails CLOSED for any name outside a 22-entry allowlist, which is right where
23
- * it currently runs: the prompt path filters `envPassthrough`, a short list the
24
- * operator explicitly declared. A command task inherits the WHOLE ambient
25
- * environment, so the same rule classifies essentially everything as secret.
26
- * Measured on a developer machine: 127 of 132 variables, 25 of them with
27
- * one-character values (`SHLVL=1`, `OLDPWD=/`, `GIT_TERMINAL_PROMPT=0`).
28
- * Redaction is substring replacement, so those become live needles:
29
- *
30
- * Build finished in 12.4s -> Build finished in [REDACTED]2.[REDACTED]s
31
- * 3 tests passed, 0 failed -> [REDACTED] tests passed, [REDACTED] failed
32
- * wrote dist/index.js (48 KB) -> wrote dist[REDACTED]index.js ([REDACTED]8 KB)
33
- *
34
- * A fix that destroys every command log is not a fix.
35
- *
36
- * # What this does instead
37
- *
38
- * Three sources, and the distinction between them is the whole design:
39
- *
40
- * 1. **Declared by config** — the config names which variables hold
41
- * credentials (`engines.<n>.apiKey: ${VAR}`, `embedding.apiKey`, and the
42
- * implicit `AKM_ENGINE_<NAME>_API_KEY` / `AKM_LLM_API_KEY` /
43
- * `AKM_EMBED_API_KEY` recipes). akm KNOWS these are secret.
44
- * 2. **Declared by the task** — the `redact:` list, names only.
45
- * 3. **Inferred** — a name-shape heuristic over the remaining environment, for
46
- * the ambient credential akm was never told about.
47
- *
48
- * Only (3) is a guess, so only (3) carries {@link MIN_INFERRED_SECRET_LENGTH}.
49
- * A declared secret is redacted at ANY length, because the operator told us
50
- * what it is; applying a floor to declared values would silently stop redacting
51
- * short secrets that are scrubbed today. The floor exists solely to stop a
52
- * *guess* from mangling a log, and 8 clears every real credential format (AWS
53
- * key id 20, GitHub PAT 40, `sk-…` 40+) while excluding the flags and counters
54
- * that a name heuristic occasionally catches.
55
- *
56
- * Note what is deliberately NOT collected: the akm secret store on disk. A
57
- * spawned command sees `process.env`, not akm's stores — a stored secret can
58
- * only be echoed if it is already in the environment, where the rules above
59
- * catch it by name. Walking every bundle's `secrets/` on each task firing would
60
- * cost a recursive readdir plus an unbounded read for values the child cannot
61
- * reach anyway. `redact:` is the escape hatch for a secret injected under a
62
- * name none of the rules recognise.
63
- */
64
- import { collectSensitiveValues, isEnvPassthroughValueSafeToExpose } from "../core/redaction.js";
65
- import { collectEngineCredentialValues } from "../integrations/agent/engine-resolution.js";
66
- /**
67
- * Shortest value an INFERRED (name-heuristic) match may contribute as a
68
- * redaction needle. Declared secrets bypass this entirely.
69
- *
70
- * Redaction replaces substrings, so a short needle is not merely useless — it
71
- * corrupts unrelated output. Below 8 the noise tier is fully intact (`1`, `0`,
72
- * `/`, `80`, `true`, `xhigh`, `31999`); at 8 a chance collision with ordinary
73
- * log vocabulary is negligible, and every credential format in real use is far
74
- * longer. It also matches the conventional minimum password length, so a
75
- * secret shorter than this is already outside normal policy.
76
- */
77
- export const MIN_INFERRED_SECRET_LENGTH = 8;
78
- /**
79
- * Environment names whose VALUE is treated as a credential on shape alone.
80
- *
81
- * The keyword must be a whole `_`-delimited word. Anchoring on only one side
82
- * would drag in ordinary configuration from whichever side is left open:
83
- * a leading anchor alone matches `KEYBOARD_LAYOUT` and `AUTHOR`, a trailing one
84
- * matches `MONKEY` and `BYPASS`. Whole-word matching gets `GH_TOKEN`,
85
- * `NPM_AUTH_TOKEN`, `MY_API_KEY`, `DB_PASS` and `AWS_SECRET_ACCESS_KEY` right.
86
- */
87
- const INFERRED_SECRET_NAME = /(?:^|_)(?:API_?KEY|KEY|TOKEN|SECRET|PASSWORD|PASSWD|PASS|CREDENTIALS?|AUTH)(?:_|$)/i;
88
- /**
89
- * Credential variables whose name is a single glued word, which no
90
- * word-boundary rule can see. Enumerated rather than matched: loosening the
91
- * pattern enough to catch `PGPASSWORD` also catches `MONKEY`.
92
- *
93
- * `PWD` cannot be a keyword above for the same reason it appears here as part
94
- * of `MYSQL_PWD` — on its own it is the working directory.
95
- */
96
- const KNOWN_SECRET_NAMES = new Set(["PGPASSWORD", "MYSQL_PWD"]);
97
- /** True when the NAME alone marks this variable as holding a credential. */
98
- export function isInferredSecretName(name) {
99
- return KNOWN_SECRET_NAMES.has(name.toUpperCase()) || INFERRED_SECRET_NAME.test(name);
100
- }
101
- /** Resolve `${VAR}` / `$VAR` to the variable NAME, or undefined for anything else. */
102
- function envRefName(spec) {
103
- if (!spec)
104
- return undefined;
105
- const match = /^\$\{?([A-Za-z_][A-Za-z0-9_]*)\}?$/.exec(spec.trim());
106
- return match?.[1];
107
- }
4
+ import { collectCredentialValues } from "../core/config/credentials.js";
5
+ import { collectInferredSecretValues, collectSensitiveValues } from "../core/redaction.js";
6
+ export { isInferredSecretName, MIN_INFERRED_SECRET_LENGTH } from "../core/redaction.js";
108
7
  /**
109
8
  * Every value that must be scrubbed from one task's persisted output.
110
9
  *
@@ -127,28 +26,17 @@ export function collectTaskLogSensitiveValues(input) {
127
26
  if (trimmed.length > 0)
128
27
  values.add(trimmed);
129
28
  };
130
- // (1) Declared by config — engine credentials, via the collector the prompt
131
- // path already uses, plus the embedding key it does not cover.
29
+ // (1) Declared by config — every key a connection, the embedder or the reranker can resolve.
132
30
  if (config) {
133
- for (const value of collectEngineCredentialValues(config, env))
31
+ for (const value of collectCredentialValues(config, env))
134
32
  values.add(value);
135
- addDeclared(env[envRefName(config.embedding?.apiKey) ?? "AKM_EMBED_API_KEY"]);
136
33
  }
137
34
  // (2) Declared by the task's `redact:` list — names only, never values.
138
35
  for (const name of declaredNames ?? [])
139
36
  addDeclared(env[name]);
140
- // (3) Inferred from the name shape. The only guessing tier, so the only one
141
- // with a length floor — and still subject to the value-level check that keeps
142
- // an allowlisted name from being treated as secret.
143
- for (const [name, value] of Object.entries(env)) {
144
- if (value === undefined || value.length < MIN_INFERRED_SECRET_LENGTH)
145
- continue;
146
- if (!isInferredSecretName(name))
147
- continue;
148
- if (isEnvPassthroughValueSafeToExpose(name, value))
149
- continue;
37
+ // (3) Inferred from the name shape, the one guessing tier (`collectInferredSecretValues`).
38
+ for (const value of collectInferredSecretValues(env))
150
39
  values.add(value);
151
- }
152
40
  // Expands credential-bearing URLs into their embedded components. Can yield
153
41
  // needles shorter than the floor (a URL's password), which is correct: the
154
42
  // operator's own value implied them.
@@ -4,6 +4,7 @@
4
4
  import { makeBundleRef, parseBundleRef } from "../../core/asset/asset-ref.js";
5
5
  import { COMPOSITION_INVALID_MULTI_JOB_HINT, ConfigError, NotFoundError, UsageError } from "../../core/errors.js";
6
6
  import { DURATION_UNITS, parseDuration } from "../../core/time.js";
7
+ import { warn } from "../../core/warn.js";
7
8
  import { isPortableExecutionAgentSelector } from "../../execution/source.js";
8
9
  import { buildExecution } from "../../integrations/agent/execution.js";
9
10
  import { resolveAssetPath } from "../../sources/resolve.js";
@@ -22,7 +23,7 @@ export function environmentSnapshot(environment) {
22
23
  continue;
23
24
  const value = String(raw);
24
25
  if (isInferredSecretName(key) || detectSecretShapedParams({ [key]: value }).length > 0) {
25
- throw new UsageError(`Task env.${key} is a secret-shaped literal env value. Store credentials in a secret/env binding rather than durable task source.`, "TASK_SOURCE_INVALID");
26
+ warn(`Task env.${key} looks like a credential. Task source is durable and readable; keep the value in a secret or env file and inject it at run time with \`akm secret run\` or \`akm env run\` in the task's \`run:\`. (Heuristic warning; the value is used as written.)`);
26
27
  }
27
28
  Object.defineProperty(out, key, { value, enumerable: true, configurable: false, writable: false });
28
29
  }
@@ -66,11 +67,12 @@ export function currentExecutionValues(document, context, environment) {
66
67
  : agent,
67
68
  }
68
69
  : {}),
70
+ ...(own(akm, "connection") ? { connection: akm?.connection } : {}),
71
+ ...(own(akm, "harness") ? { harness: akm?.harness } : {}),
69
72
  ...(own(akm, "engine") ? { engine: akm?.engine } : {}),
70
73
  ...(own(akm, "model") ? { model: akm?.model } : {}),
71
74
  ...(own(akm, "inference") ? { inference: akm?.inference } : {}),
72
75
  ...(own(akm, "outputSchema") ? { outputSchema: akm?.outputSchema } : {}),
73
- ...(own(akm, "tools") ? { tools: akm?.tools } : {}),
74
76
  ...(own(akm, "timeout") ? { timeout: akm?.timeout } : {}),
75
77
  workspace: context.bundleRoot,
76
78
  environment,
@@ -109,8 +111,8 @@ export function defaultTaskShell(platform) {
109
111
  }
110
112
  export function validatePreparedCommand(invocation, context) {
111
113
  const { request } = invocation;
112
- if (!request.engine.name) {
113
- throw new ConfigError(`Task ${JSON.stringify(context.taskRef)} has no resolved execution engine. Configure defaults.engine or akm.engine before running it.`, "INVALID_CONFIG_FILE");
114
+ if (!request.target.name) {
115
+ throw new ConfigError(`Task ${JSON.stringify(context.taskRef)} has no resolved connection or harness. Run \`akm setup\`, or set akm.connection or akm.harness before running it.`, "INVALID_CONFIG_FILE");
114
116
  }
115
117
  // Lowering is pure. Running it before the durable-attempt boundary proves
116
118
  // the selected target is transport-projectable; dispatch repeats the same
@@ -120,10 +122,9 @@ export function validatePreparedCommand(invocation, context) {
120
122
  }
121
123
  export function validateWorkflowRuntimeSource(file, workspaceRoot, readFile) {
122
124
  const source = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(readFile(file, workspaceRoot));
123
- const compiled = compileWorkflowSource(source, { path: file, workspaceRoot });
125
+ const compiled = compileWorkflowSource(source, { path: file });
124
126
  if (!compiled.ok) {
125
- // P4-N2's mapping (docs/plans/specs/p4-deletions-closeout.md §3.3.4): a
126
- // task-wrapped workflow target's own multi-job source is a composition
127
+ // A task-wrapped workflow target's own multi-job source is a composition
127
128
  // failure, same as freezing it directly would be; any other compile
128
129
  // failure is WORKFLOW_SOURCE_INVALID.
129
130
  const detail = compiled.errors.map((error) => `${error.path}:${error.line}: ${error.message}`).join("; ");
@@ -5,7 +5,7 @@
5
5
  * Pure task runtime projection.
6
6
  *
7
7
  * This is the only bridge from an already-parsed, already-projected task
8
- * source document (the `PreparableTaskDocument` seam, P4-N4) into executable
8
+ * source document (the `PreparableTaskDocument` seam) into executable
9
9
  * work. It performs all source/config/asset reads before the task runner
10
10
  * reserves a durable attempt and returns immutable snapshots. In particular,
11
11
  * script work contains frozen bytes and their digest, never a path that can
@@ -14,30 +14,29 @@
14
14
  * `prepareTaskV3Execution`'s three production callers are
15
15
  * `src/tasks/run/load-task.ts`, `src/tasks/scheduler-sync.ts`, and
16
16
  * `src/workflows/freeze/targets/task.ts`'s `taskDispatch`. The name and the
17
- * `TaskV3*` type family it takes stay (spec docs/plans/specs/p4-deletions-closeout.md
18
- * §0, R-R1) — only task source v4 ever reaches this function now, always via
19
- * `src/tasks/source/project-v4.ts`'s `projectTaskSourceV4()`.
17
+ * `TaskV3*` type family it takes stay; only task source v4 ever reaches this
18
+ * function now, always via `src/tasks/source/project-v4.ts`'s
19
+ * `projectTaskSourceV4()`.
20
20
  */
21
21
  import fs from "node:fs";
22
+ import path from "node:path";
22
23
  import { prepareCommandInvocation } from "../../commands/command/command-execution.js";
23
24
  import { UsageError } from "../../core/errors.js";
24
25
  import { warn } from "../../core/warn.js";
25
26
  import { base, commandEnvironmentSnapshot, currentExecutionValues, defaultTaskShell, environmentSnapshot, qualifyOwnedRef, resolvedOwnedAsset, validatePreparedCommand, validateWorkflowRuntimeSource, } from "./prepare-support.js";
26
- import { captureDirectoryIdentity, captureScriptTarget } from "./script-capture.js";
27
+ import { captureScriptTarget } from "./script-capture.js";
27
28
  /** Project one canonical task-v3 source into immutable executable work. */
28
29
  export async function prepareTaskV3Execution(document, context) {
29
30
  const environment = environmentSnapshot(document.env);
30
31
  const commandEnvironment = commandEnvironmentSnapshot(environment, context.schedulerContext);
31
32
  const common = base(document, context, environment);
32
33
  if (document.target.kind === "run") {
33
- const cwdIdentity = captureDirectoryIdentity(context.bundleRoot, document.target.workingDirectory);
34
34
  return Object.freeze({
35
35
  ...common,
36
36
  kind: "shell",
37
37
  command: document.target.run,
38
38
  shell: document.target.shell ?? defaultTaskShell(context.platform ?? process.platform),
39
- cwd: cwdIdentity.realCwd,
40
- cwdIdentity,
39
+ cwd: path.resolve(context.bundleRoot, document.target.workingDirectory ?? "."),
41
40
  });
42
41
  }
43
42
  const target = document.target.uses;
@@ -98,7 +97,7 @@ export async function prepareTaskV3Execution(document, context) {
98
97
  throw new UsageError("Script refs do not accept with.", "COMPOSITION_INVALID");
99
98
  }
100
99
  const resolved = await resolvedOwnedAsset(qualified, "script", context);
101
- // Shared with prepare-script-target.ts's prepareScriptTarget() (spec §4.3):
100
+ // Shared with prepare-script-target.ts's prepareScriptTarget():
102
101
  // one implementation of the byte/interpreter capture, not two.
103
102
  const captured = captureScriptTarget(qualified, resolved.file, resolved.bundleRoot, context.readFile ?? ((targetPath) => fs.readFileSync(targetPath)));
104
103
  return Object.freeze({
@@ -2,18 +2,15 @@
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 shared implementation of frozen-script byte/interpreter capture
6
- * (spec docs/plans/specs/p1b-model-extraction.md §4.3). Both prepare.ts's
7
- * script arm (the moved prepareTaskV3Execution) and
5
+ * The one shared implementation of frozen-script byte/interpreter capture.
6
+ * Both prepare.ts's script arm (prepareTaskV3Execution) and
8
7
  * prepare-script-target.ts's typed prepareScriptTarget() call
9
8
  * captureScriptTarget() below, so the two never drift into two copies of the
10
- * same capture logic. scriptInterpreter() and captureDirectoryIdentity() are
11
- * moved body-intact out of the pre-P1b src/tasks/runtime-v3.ts.
9
+ * same capture logic.
12
10
  */
13
11
  import { createHash } from "node:crypto";
14
12
  import path from "node:path";
15
13
  import { UsageError } from "../../core/errors.js";
16
- import { captureFrozenDirectoryIdentity } from "../../execution/directory-identity.js";
17
14
  import { isBunStandaloneMain } from "../resolve-akm-bin.js";
18
15
  const SCRIPT_INTERPRETERS = Object.freeze({
19
16
  ".sh": "sh",
@@ -77,36 +74,23 @@ export function scriptInterpreter(extension, ref, bytes) {
77
74
  }
78
75
  throw new UsageError(`Task v3 script target ${JSON.stringify(ref)} requires Bun for ${extension} execution, but this runtime cannot provide it.`, "TASK_TARGET_UNSUPPORTED");
79
76
  }
80
- export function captureDirectoryIdentity(bundleRoot, workingDirectory) {
81
- try {
82
- return captureFrozenDirectoryIdentity(bundleRoot, workingDirectory);
83
- }
84
- catch (cause) {
85
- if (cause instanceof UsageError)
86
- throw cause;
87
- throw new UsageError(`Task working directory ${JSON.stringify(workingDirectory ?? ".")} cannot be physically verified: ${cause instanceof Error ? cause.message : String(cause)}`, "TASK_SOURCE_INVALID");
88
- }
89
- }
90
77
  /**
91
- * Read a script's bytes off disk (or the caller's own read seam) and freeze
92
- * the interpreter/digest/directory-identity shape every script dispatch
93
- * needs. `ref` is used only for interpreter-selection error messages — it is
94
- * the script's own qualified ref, never a synthetic task ref. `bundleRoot` is
95
- * where directory identity is captured from (one level above the script file
96
- * itself, matching prepareTaskV3Execution's historical behavior).
78
+ * Read a script's bytes off disk (or the caller's own read seam, following a
79
+ * symlink to wherever it points) and freeze the interpreter/digest shape every
80
+ * script dispatch needs. `ref` is used only for interpreter-selection error
81
+ * messages — it is the script's own qualified ref, never a synthetic task ref.
82
+ * `bundleRoot` is the script's working directory.
97
83
  */
98
84
  export function captureScriptTarget(ref, file, bundleRoot, readFile) {
99
85
  const extension = path.extname(file).toLowerCase();
100
86
  const raw = readFile(file, bundleRoot);
101
87
  const bytes = Uint8Array.from(raw);
102
- const cwdIdentity = captureDirectoryIdentity(bundleRoot);
103
88
  return Object.freeze({
104
89
  interpreter: scriptInterpreter(extension, ref, bytes),
105
90
  extension,
106
91
  bytesBase64: Buffer.from(bytes).toString("base64"),
107
92
  byteLength: bytes.byteLength,
108
93
  sha256: createHash("sha256").update(bytes).digest("hex"),
109
- cwd: cwdIdentity.realCwd,
110
- cwdIdentity,
94
+ cwd: path.resolve(bundleRoot),
111
95
  });
112
96
  }
@@ -7,36 +7,15 @@
7
7
  * clamp every arm's result uses), and `recordTaskAttemptFailure` (the
8
8
  * catch-all for a dispatch that threw after an attempt was reserved).
9
9
  *
10
- * Moved from src/tasks/runner.ts (spec docs/plans/specs/p1b-model-extraction.md
11
- * §5.1, §9, runner.ts:970-1069). `reserveTaskAttempt` and `finishAttempt`
12
- * were module-private at head; both are exported here because run-task.ts and
10
+ * `reserveTaskAttempt` and `finishAttempt` are exported because run-task.ts and
13
11
  * every dispatch arm (run-native-task.ts, run-workflow-task.ts,
14
- * run-command-task.ts), now separate files, call them.
12
+ * run-command-task.ts) call them.
15
13
  *
16
- * F-4 (P1a advisory, spec §5.5): `SAFE_TASK_ATTEMPT_ERROR_CODES` gains
17
- * `TASK_SOURCE_INVALID` and `COMPOSITION_INVALID` — see the comment on the
18
- * set for the verified reachability path. `SAFE_TASK_ATTEMPT_ERROR_CODES` and
14
+ * `SAFE_TASK_ATTEMPT_ERROR_CODES` and
19
15
  * `safeTaskAttemptErrorCode` stay unexported: their membership is observed
20
16
  * the same way production code observes it, through
21
17
  * `recordTaskAttemptFailure`'s one externally-visible effect (the stored
22
- * `detail.error` code).
23
- *
24
- * P4 (docs/plans/specs/p4-deletions-closeout.md §4.1, row B-55): the set
25
- * additionally gains `TARGET_REF_INVALID`, `WORKFLOW_SOURCE_INVALID`,
26
- * `INPUT_BINDING_INVALID`, and `TASK_TARGET_UNSUPPORTED` — every code P4's
27
- * `INVALID_FLAG_VALUE` re-coding sweep (spec §5.2) makes reachable from the
28
- * same post-reservation dispatch catch. `TARGET_REF_INVALID`
29
- * (`execution/target-ref.ts`) and `INPUT_BINDING_INVALID`
30
- * (`workflows/freeze/task-bindings.ts`) already reach it today through the
31
- * same WORKFLOW arm as `COMPOSITION_INVALID` above — freezing a composed
32
- * child (a `tasks/<ref>` or `workflows/<ref>` step) during dispatch can
33
- * classify a malformed `uses:` or an invalid `with:` binding after the
34
- * attempt is reserved. `WORKFLOW_SOURCE_INVALID` and `TASK_TARGET_UNSUPPORTED`
35
- * get their first live throw sites in this same phase (the freeze wrapper's
36
- * P4-N2 mapping, and `prepare/script-capture.ts`'s interpreter rejections,
37
- * respectively) — added here ahead of / alongside that wiring rather than
38
- * split across two commits, since an unreachable member of an allowlist Set
39
- * is inert, not a defect.
18
+ * `detail.error` code). The comment on the set says why each code is reachable.
40
19
  */
41
20
  import { AkmError, rethrowIfTestIsolationError } from "../../core/errors.js";
42
21
  import { withStateDb } from "../../core/state-db.js";
@@ -83,19 +62,22 @@ export function finishAttempt(startedAt, observedFinishedAt) {
83
62
  * usage failures, never an unclassified internal error that might leak
84
63
  * implementation detail.
85
64
  *
86
- * F-4 (P1a advisory, spec §5.5): `TASK_SOURCE_INVALID` and
87
- * `COMPOSITION_INVALID` join the allowlist. Verified reachability: the only
88
- * caller of `recordTaskAttemptFailure` inside the runner is the
65
+ * Every code here is reachable from the post-reservation dispatch catch: the
66
+ * only caller of `recordTaskAttemptFailure` inside the runner is the
89
67
  * post-reservation catch in run-task.ts; task-source parsing happens BEFORE
90
68
  * reservation (load-task.ts), so the direct parse path never reaches it.
91
- * Both codes reach it through the WORKFLOW arm instead: a workflow task whose
92
- * plan freezes a `tasks/<ref>` step raises `TASK_SOURCE_INVALID` (via
69
+ * `TASK_SOURCE_INVALID`, `COMPOSITION_INVALID`, `TARGET_REF_INVALID` and
70
+ * `INPUT_BINDING_INVALID` reach it through the WORKFLOW arm: a workflow task
71
+ * whose plan freezes a `tasks/<ref>` step raises `TASK_SOURCE_INVALID` (via
93
72
  * `taskDispatch`'s `parseTaskSource`/`parseTaskSourceV4Document` —
94
- * `src/workflows/freeze/targets/task.ts`; `parseTaskV3Yaml` no longer exists
95
- * in `src`, P4 deleted task v3 acceptance, spec
96
- * docs/plans/specs/p4-deletions-closeout.md §3.2) or `COMPOSITION_INVALID`
97
- * (the P1a with-rejection guard) DURING dispatch, after the attempt was
98
- * already reserved. Before this widening, both were recorded as
73
+ * `src/workflows/freeze/targets/task.ts`), and freezing a composed child can
74
+ * classify a malformed `uses:` (`TARGET_REF_INVALID`,
75
+ * `execution/target-ref.ts`), an invalid `with:` binding
76
+ * (`INPUT_BINDING_INVALID`, `workflows/freeze/task-bindings.ts`) or a `with:`
77
+ * rejection (`COMPOSITION_INVALID`) DURING dispatch, after the attempt was
78
+ * already reserved. `WORKFLOW_SOURCE_INVALID` and `TASK_TARGET_UNSUPPORTED`
79
+ * are thrown by the freeze wrapper and by `prepare/script-capture.ts`'s
80
+ * interpreter rejections, respectively. Without them each would be recorded as
99
81
  * `"INTERNAL"`.
100
82
  */
101
83
  const SAFE_TASK_ATTEMPT_ERROR_CODES = new Set([
@@ -11,11 +11,16 @@
11
11
  import fs from "node:fs";
12
12
  import { detectAdapterId } from "../../core/adapter/detect-adapter.js";
13
13
  import { makeBundleRef } from "../../core/asset/asset-ref.js";
14
+ import { conceptIdFromTypeName } from "../../core/asset/resolve-ref.js";
15
+ import { resolveStashDir } from "../../core/common.js";
14
16
  import { loadConfig } from "../../core/config/config.js";
15
- import { NotFoundError } from "../../core/errors.js";
16
- import { resolveWriteTarget } from "../../core/write-source.js";
17
+ import { bundleKeyForContentRoot } from "../../core/config/config-sources.js";
18
+ import { ConfigError, NotFoundError, UsageError } from "../../core/errors.js";
19
+ import { assertBundleNotDisabled } from "../../core/write-source.js";
17
20
  import { applyInputDefaults, materializeInputFlags, validateInputs, } from "../../execution/input-contract.js";
18
- import { resolveAdapterConceptOwner } from "../../indexer/lookup/adapter-concept-owner.js";
21
+ import { resolveAdapterConceptOwner, resolveConceptOwner } from "../../indexer/lookup/adapter-concept-owner.js";
22
+ import { resolveSourceEntries } from "../../indexer/search/search-source.js";
23
+ import { resolveSourcesForOrigin } from "../../registry/origin-resolve.js";
19
24
  import { resolveAssetPath } from "../../sources/resolve.js";
20
25
  import { prepareTaskV3Execution } from "../prepare/prepare.js";
21
26
  import { scheduledTaskContextEnv } from "../scheduler-invocation.js";
@@ -24,16 +29,50 @@ import { projectTaskSourceV4 } from "../source/project-v4.js";
24
29
  import { TASK_INPUT_DIAGNOSTICS } from "../source/task-input-diagnostics.js";
25
30
  import { validateTaskConceptId, validateTaskId } from "../task-id.js";
26
31
  /**
27
- * F-3 (spec §5.4): the literal bundle-name fallback, hoisted to a named
28
- * constant — the VALUE does not change (it is user-visible data, R-09's
29
- * observable behavior). The now-deleted `runner.ts:173`'s (P4) bare
30
- * `"stash"` became this at the P1b runner.ts split.
32
+ * The literal bundle-name fallback, hoisted to a named constant. The value is
33
+ * user-visible data, so it must not change.
31
34
  */
32
35
  export const DEFAULT_BUNDLE_NAME = "stash";
33
36
  const CONFIG_FREE_TASK_RUNTIME = Object.freeze({
34
37
  configVersion: "0.9.0",
35
38
  semanticSearchMode: "off",
36
39
  });
40
+ /**
41
+ * The active source set a task read walks. A working stash that is a disabled
42
+ * configured bundle makes that set throw; it is simply not in the set, so the
43
+ * other bundles still resolve.
44
+ */
45
+ export function activeTaskSources(config) {
46
+ try {
47
+ return resolveSourceEntries(undefined, config);
48
+ }
49
+ catch (cause) {
50
+ const working = bundleKeyForContentRoot(config, resolveStashDir());
51
+ const entry = working ? config.bundles?.[working] : undefined;
52
+ if (!(cause instanceof ConfigError) || !working || !entry || entry.enabled !== false)
53
+ throw cause;
54
+ const enabled = { ...config, bundles: { ...config.bundles, [working]: { ...entry, enabled: true } } };
55
+ return resolveSourceEntries(undefined, enabled).filter((source) => source.registryId !== working);
56
+ }
57
+ }
58
+ /**
59
+ * Resolve an asset a task names in another bundle (`uses:`) through the one
60
+ * ref-to-file walk. Reading needs no write target, so a bundle of any kind
61
+ * (git, npm, website) resolves. The file is the authored path, not the symlink
62
+ * target, so the script interpreter follows the name the author gave it.
63
+ */
64
+ export function resolveBundleAsset(config, { bundle, type, name }) {
65
+ const conceptId = conceptIdFromTypeName(type, name);
66
+ const sources = activeTaskSources(config);
67
+ const match = resolveConceptOwner({ bundle, conceptId }, sources);
68
+ if (match)
69
+ return { file: match.owner.path, bundleRoot: match.source.path };
70
+ if (resolveSourcesForOrigin(bundle, sources).length === 0) {
71
+ assertBundleNotDisabled(config, bundle);
72
+ throw new UsageError(`Bundle ${JSON.stringify(bundle)} is not configured. Run \`akm bundle list\` to see available bundles.`, "INVALID_FLAG_VALUE");
73
+ }
74
+ throw new NotFoundError(`Task asset ${makeBundleRef(bundle, conceptId)} was not found.`, "ASSET_NOT_FOUND");
75
+ }
37
76
  /** Resolve, parse, and project one task-v3 asset into a frozen, executable projection. */
38
77
  export async function loadPreparedTask(id, options) {
39
78
  const bundleDir = options.bundleDir;
@@ -49,14 +88,13 @@ export async function loadPreparedTask(id, options) {
49
88
  }
50
89
  const filePath = owner.path;
51
90
  const yaml = fs.readFileSync(filePath, "utf8");
52
- const parsed = parseTaskSource({ yaml, filePath, workspaceRoot: bundleDir });
91
+ const parsed = parseTaskSource({ yaml, filePath });
53
92
  const source = projectTaskSourceV4(parsed.v4);
54
93
  const requiresCommandConfig = source.target.kind === "uses" &&
55
94
  (source.target.uses.kind === "builtin-command" || source.target.uses.kind === "command");
56
95
  const config = requiresCommandConfig ? loadConfig() : CONFIG_FREE_TASK_RUNTIME;
57
96
  const bundleName = options.bundleName ?? config.defaultBundle ?? DEFAULT_BUNDLE_NAME;
58
- // P2a Lane C, Stage 2 (spec docs/plans/specs/p2a-task-source-v4.md §5.1):
59
- // materialize akm task run's raw input flags (Stage 1,
97
+ // Stage 2: materialize akm task run's raw input flags (Stage 1,
60
98
  // src/commands/tasks/tasks-cli.ts) against the task's own declared
61
99
  // inputs: contract (empty when the document declares none, so any input
62
100
  // flag on such a task fails UNKNOWN_FLAG — there is nothing declared to
@@ -65,8 +103,8 @@ export async function loadPreparedTask(id, options) {
65
103
  // required input satisfied only by its own default (never supplied as a
66
104
  // flag) needs the SEPARATE validateInputs call below, run after defaults
67
105
  // are applied — materializeInputFlags returns {} immediately for zero
68
- // flags, before ever checking `required` (spec §5.1, input-contract.ts's
69
- // own header).
106
+ // flags, before ever checking `required` (input-contract.ts's own
107
+ // header).
70
108
  const inputContract = parsed.v4.inputs ?? {};
71
109
  const materializedInputs = materializeInputFlags(inputContract, options.inputFlags ?? [], TASK_INPUT_DIAGNOSTICS);
72
110
  const defaultedInputs = applyInputDefaults(inputContract, materializedInputs);
@@ -82,13 +120,12 @@ export async function loadPreparedTask(id, options) {
82
120
  });
83
121
  options.captureTaskInvocation(invocation);
84
122
  }
85
- // P2b Lane B (spec docs/plans/specs/p2b-input-bindings.md §4.3, B-40): a
86
- // task source v4 document's own declared `inputs:` deliver into a
123
+ // A task source v4 document's own declared `inputs:` deliver into a
87
124
  // `uses: workflows/<ref>` target's child-run params through the EXISTING
88
125
  // with-> params path (prepare.ts's workflow branch already reads
89
126
  // `document.target.with`) — task source v4 never authors `with:` on a
90
127
  // workflow target itself (task-source-v4.ts's own parser accepts `with:`
91
- // only on `uses: akm/command`, source/task-source-v4.ts:329-333), so this
128
+ // only on `uses: akm/command`), so this
92
129
  // override is purely additive for a workflow-target task.
93
130
  const deliverySource = source.target.kind === "uses" && source.target.uses.kind === "workflow"
94
131
  ? { ...source, target: { ...source.target, with: defaultedInputs } }
@@ -99,23 +136,13 @@ export async function loadPreparedTask(id, options) {
99
136
  bundleName,
100
137
  bundleRoot: bundleDir,
101
138
  config,
102
- // Agent profiles build child env from an allowlist, so freeze the closed
103
- // AKM directory context the scheduled row set before command preparation.
139
+ // Freeze the AKM directory context the scheduled row set before command preparation.
104
140
  ...(options.scheduled ? { schedulerContext: scheduledTaskContextEnv() } : {}),
105
141
  resolveAsset: async ({ bundle, type, name }) => {
106
142
  if (bundle === bundleName) {
107
143
  return { file: await resolveAssetPath(bundleDir, type, name), bundleRoot: bundleDir };
108
144
  }
109
- const resolutionConfig = requiresCommandConfig ? config : loadConfig();
110
- // `bundle` is the qualifier of an asset ref in the task, not a flag.
111
- const resolvedBundle = resolveWriteTarget(resolutionConfig, bundle, {
112
- requireWritable: false,
113
- flag: "The asset ref's bundle",
114
- });
115
- return {
116
- file: await resolveAssetPath(resolvedBundle.source.path, type, name),
117
- bundleRoot: resolvedBundle.source.path,
118
- };
145
+ return resolveBundleAsset(requiresCommandConfig ? config : loadConfig(), { bundle, type, name });
119
146
  },
120
147
  });
121
148
  }