akm-cli 0.9.16 → 0.9.17-alpha.10

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 (403) hide show
  1. package/CHANGELOG.md +2101 -0
  2. package/STABILITY.md +11 -10
  3. package/dist/akm +124 -193
  4. package/dist/akm-migrate +38 -19
  5. package/dist/assets/hints/cli-hints-full.md +6 -7
  6. package/dist/assets/improve-strategies/catchup.json +0 -3
  7. package/dist/assets/improve-strategies/consolidate.json +0 -1
  8. package/dist/assets/improve-strategies/default.json +1 -2
  9. package/dist/assets/improve-strategies/proactive-maintenance.json +1 -2
  10. package/dist/assets/improve-strategies/quick.json +1 -2
  11. package/dist/assets/improve-strategies/reflect-distill.json +1 -2
  12. package/dist/assets/improve-strategies/thorough.json +0 -3
  13. package/dist/assets/prompts/consolidate-pair.md +20 -0
  14. package/dist/assets/prompts/consolidate-system.md +4 -11
  15. package/dist/assets/prompts/retrieval-relevance-judge.md +6 -0
  16. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +20 -20
  17. package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -2
  18. package/dist/assets/templates/html/health.html +3 -5
  19. package/dist/cli/retired-commands.js +1 -1
  20. package/dist/cli/shared.js +6 -2
  21. package/dist/cli/unknown-flags.js +24 -1
  22. package/dist/cli.js +68 -10
  23. package/dist/commands/agent/agent-dispatch.js +1 -1
  24. package/dist/commands/command/command-execution.js +24 -62
  25. package/dist/commands/feedback-cli.js +0 -1
  26. package/dist/commands/health/accept-rate.js +6 -0
  27. package/dist/commands/health/archive-usage.js +92 -0
  28. package/dist/commands/health/checks.js +83 -74
  29. package/dist/commands/health/config-skew.js +38 -0
  30. package/dist/commands/health/data-dir-usage.js +25 -13
  31. package/dist/commands/health/egress.js +54 -0
  32. package/dist/commands/health/html-report.js +1 -42
  33. package/dist/commands/health/improve-metrics.js +136 -591
  34. package/dist/commands/health/md-report.js +1 -6
  35. package/dist/commands/health/plugin-staleness.js +53 -3
  36. package/dist/commands/health/renderers.js +12 -4
  37. package/dist/commands/health/report-view-model.js +14 -120
  38. package/dist/commands/health/types-improve.js +4 -19
  39. package/dist/commands/health/windows.js +64 -74
  40. package/dist/commands/health.js +145 -143
  41. package/dist/commands/improve/consolidate/chunking.js +26 -117
  42. package/dist/commands/improve/consolidate/continuity-check.js +137 -0
  43. package/dist/commands/improve/consolidate/pair-pass.js +791 -0
  44. package/dist/commands/improve/consolidate/sanitize.js +54 -149
  45. package/dist/commands/improve/consolidate.js +589 -1127
  46. package/dist/commands/improve/content-hash.js +16 -24
  47. package/dist/commands/improve/distill/content-repair.js +18 -100
  48. package/dist/commands/improve/distill-guards.js +20 -81
  49. package/dist/commands/improve/distill-promotion-policy.js +23 -243
  50. package/dist/commands/improve/distill.js +608 -1041
  51. package/dist/commands/improve/eligibility.js +126 -390
  52. package/dist/commands/improve/execution.js +8 -10
  53. package/dist/commands/improve/extract-prompt.js +1 -2
  54. package/dist/commands/improve/extract.js +487 -1046
  55. package/dist/commands/improve/feedback-valence.js +0 -25
  56. package/dist/commands/improve/improve-cli.js +75 -169
  57. package/dist/commands/improve/improve-result-file.js +10 -66
  58. package/dist/commands/improve/improve-strategies.js +52 -4
  59. package/dist/commands/improve/improve-usage-report.js +18 -64
  60. package/dist/commands/improve/improve.js +480 -1074
  61. package/dist/commands/improve/ledger.js +119 -0
  62. package/dist/commands/improve/locks.js +2 -8
  63. package/dist/commands/improve/loop-stages.js +415 -1073
  64. package/dist/commands/improve/memory/derived-ref.js +12 -77
  65. package/dist/commands/improve/memory/memory-belief.js +16 -118
  66. package/dist/commands/improve/memory/memory-improve.js +266 -14
  67. package/dist/commands/improve/outcome-loop.js +28 -156
  68. package/dist/commands/improve/planner.js +5 -15
  69. package/dist/commands/improve/preparation.js +779 -2319
  70. package/dist/commands/improve/proactive-maintenance.js +34 -101
  71. package/dist/commands/improve/reflect-noise.js +104 -280
  72. package/dist/commands/improve/reflect.js +642 -1353
  73. package/dist/commands/improve/retrieval-gate.js +127 -0
  74. package/dist/commands/improve/retrieval-scope.js +92 -0
  75. package/dist/commands/improve/salience.js +41 -240
  76. package/dist/commands/improve/session-asset.js +19 -100
  77. package/dist/commands/improve/stage.js +322 -0
  78. package/dist/commands/lint/base-linter.js +37 -15
  79. package/dist/commands/proposal/drain.js +261 -578
  80. package/dist/commands/proposal/proposal-cli.js +19 -20
  81. package/dist/commands/proposal/proposal-types.js +31 -24
  82. package/dist/commands/proposal/proposal.js +38 -8
  83. package/dist/commands/proposal/propose.js +134 -160
  84. package/dist/commands/proposal/repository.js +1097 -1394
  85. package/dist/commands/proposal/validators/proposal-quality-validators.js +71 -174
  86. package/dist/commands/proposal/validators/proposal-validators.js +1 -1
  87. package/dist/commands/proposal/validators/proposals.js +22 -89
  88. package/dist/commands/read/curate.js +105 -462
  89. package/dist/commands/read/knowledge.js +3 -2
  90. package/dist/commands/read/search-cli.js +16 -33
  91. package/dist/commands/read/search.js +17 -23
  92. package/dist/commands/read/show.js +57 -108
  93. package/dist/commands/sources/bundle-cli.js +25 -2
  94. package/dist/commands/sources/bundle-config-ops.js +4 -0
  95. package/dist/commands/sources/dangerous-env-audit.js +1 -2
  96. package/dist/commands/sources/info.js +127 -29
  97. package/dist/commands/sources/installed-stashes.js +197 -746
  98. package/dist/commands/sources/schema-repair.js +98 -129
  99. package/dist/commands/sources/source-add.js +62 -12
  100. package/dist/commands/sources/source-manage.js +9 -2
  101. package/dist/commands/sources/stash-cli.js +24 -4
  102. package/dist/commands/tasks/explain.js +10 -13
  103. package/dist/commands/tasks/tasks-cli.js +12 -13
  104. package/dist/commands/tasks/tasks.js +350 -936
  105. package/dist/commands/tasks/validate.js +26 -24
  106. package/dist/commands/workflow/plan.js +22 -29
  107. package/dist/commands/workflow-cli.js +4 -4
  108. package/dist/core/adapter/adapters/akm-adapter.js +2 -1
  109. package/dist/core/adapter/adapters/akm-lint.js +2 -3
  110. package/dist/core/adapter/adapters/akm-metadata.js +42 -12
  111. package/dist/core/adapter/adapters/akm-task-adapter.js +29 -8
  112. package/dist/core/adapter/adapters/akm-workflow-adapter.js +1 -1
  113. package/dist/core/adapter/execution-source.js +17 -29
  114. package/dist/core/asset/asset-placement.js +4 -13
  115. package/dist/core/asset/frontmatter.js +106 -1
  116. package/dist/core/asset/resolve-ref.js +1 -1
  117. package/dist/core/bundle-id.js +42 -5
  118. package/dist/core/bundle-rename.js +285 -0
  119. package/dist/core/config/config-io.js +1 -2
  120. package/dist/core/config/config-schema.js +9 -34
  121. package/dist/core/config/config-walker.js +1 -1
  122. package/dist/core/config/config.js +184 -111
  123. package/dist/core/config/engine-semantics.js +0 -2
  124. package/dist/core/config/legacy-source-shape-shim.js +38 -9
  125. package/dist/core/config/schema/embedding.js +20 -5
  126. package/dist/core/config/schema/engines.js +5 -0
  127. package/dist/core/config/schema/execution.js +1 -1
  128. package/dist/core/config/schema/experimental.js +1 -1
  129. package/dist/core/config/schema/improve-processes.js +54 -125
  130. package/dist/core/config/schema/improve.js +4 -42
  131. package/dist/core/config/schema/index-config.js +9 -48
  132. package/dist/core/config/schema/scheduler.js +12 -12
  133. package/dist/core/config/schema/search.js +6 -22
  134. package/dist/core/env-secret-ref.js +0 -1
  135. package/dist/core/errors.js +8 -9
  136. package/dist/core/file-change.js +13 -5
  137. package/dist/core/file-lock.js +76 -173
  138. package/dist/core/improve-result.js +35 -7
  139. package/dist/core/improve-types.js +0 -1
  140. package/dist/core/logs-db.js +2 -2
  141. package/dist/core/loopback.js +7 -12
  142. package/dist/core/non-task-input.js +20 -0
  143. package/dist/core/parse.js +13 -16
  144. package/dist/core/paths.js +0 -24
  145. package/dist/core/redaction.js +109 -2
  146. package/dist/core/run-lock.js +2 -5
  147. package/dist/core/spawn-env.js +1 -1
  148. package/dist/core/state/migrations.js +123 -61
  149. package/dist/core/state-db-scope.js +2 -4
  150. package/dist/core/state-db.js +126 -692
  151. package/dist/core/time.js +0 -20
  152. package/dist/core/type-presentation.js +1 -9
  153. package/dist/core/write-source.js +294 -1005
  154. package/dist/execution/input-contract.js +1 -1
  155. package/dist/execution/resolved-request.js +135 -689
  156. package/dist/execution/source.js +63 -257
  157. package/dist/execution/target-ref.js +1 -1
  158. package/dist/indexer/bundle-identity-guard.js +2 -2
  159. package/dist/indexer/db/llm-cache.js +2 -2
  160. package/dist/indexer/ensure-index.js +77 -73
  161. package/dist/indexer/index-rebuild-lock.js +3 -11
  162. package/dist/indexer/index-writer-lock.js +8 -17
  163. package/dist/indexer/index-written-assets.js +141 -154
  164. package/dist/indexer/indexer.js +400 -1124
  165. package/dist/indexer/links/declared-links.js +90 -0
  166. package/dist/indexer/materialize-embeddings.js +60 -397
  167. package/dist/indexer/passes/memory-inference.js +96 -90
  168. package/dist/indexer/passes/metadata.js +132 -219
  169. package/dist/indexer/read-preflight.js +0 -7
  170. package/dist/indexer/scan/doc-to-entry.js +2 -3
  171. package/dist/indexer/scan/drain-dir.js +1 -1
  172. package/dist/indexer/search/db-search.js +190 -590
  173. package/dist/indexer/search/fts-query.js +30 -41
  174. package/dist/indexer/search/ranking.js +28 -154
  175. package/dist/indexer/search/search-attribution.js +12 -32
  176. package/dist/indexer/search/search-fields.js +11 -15
  177. package/dist/indexer/search/search-hit-enrichers.js +54 -85
  178. package/dist/indexer/search/search-source.js +1 -4
  179. package/dist/indexer/usage/usage-events.js +36 -7
  180. package/dist/indexer/walk/walker.js +3 -4
  181. package/dist/integrations/agent/engine-fallback.js +23 -40
  182. package/dist/integrations/agent/engine-resolution.js +93 -183
  183. package/dist/integrations/agent/execution.js +507 -0
  184. package/dist/integrations/agent/model-map.js +28 -156
  185. package/dist/integrations/agent/request-lowering.js +66 -141
  186. package/dist/integrations/agent/runner-dispatch.js +143 -321
  187. package/dist/integrations/agent/runner.js +54 -14
  188. package/dist/integrations/lockfile.js +53 -101
  189. package/dist/llm/client.js +18 -6
  190. package/dist/llm/embedders/deterministic.js +2 -3
  191. package/dist/llm/embedders/profile.js +71 -0
  192. package/dist/llm/embedders/remote.js +11 -17
  193. package/dist/llm/feature-gate.js +0 -8
  194. package/dist/llm/index-passes.js +3 -5
  195. package/dist/llm/memory-infer.js +1 -2
  196. package/dist/llm/structured-call.js +5 -24
  197. package/dist/output/generic-render.js +23 -11
  198. package/dist/output/html-render.js +13 -10
  199. package/dist/output/render-registry.js +3 -32
  200. package/dist/output/shapes/helpers.js +25 -38
  201. package/dist/output/shapes/passthrough.js +1 -9
  202. package/dist/{indexer/graph/graph-types.js → output/text/bundle-rename.js} +4 -1
  203. package/dist/output/text/command-format.js +69 -31
  204. package/dist/output/text/helpers.js +1 -1
  205. package/dist/output/text/migrate.js +5 -14
  206. package/dist/output/text/proposal-format.js +48 -3
  207. package/dist/output/text/show-format.js +13 -17
  208. package/dist/output/text/workflow-format.js +0 -32
  209. package/dist/output/text.js +2 -0
  210. package/dist/registry/factory.js +4 -19
  211. package/dist/registry/network.js +66 -220
  212. package/dist/registry/providers/index.js +0 -2
  213. package/dist/registry/providers/skills-sh.js +3 -14
  214. package/dist/registry/providers/static-index.js +24 -26
  215. package/dist/registry/resolve.js +55 -131
  216. package/dist/scripts/akm-migrate-node.js +42948 -92369
  217. package/dist/scripts/akm-migrate.js +42935 -92354
  218. package/dist/setup/registry-stash-loader.js +4 -13
  219. package/dist/setup/semantic-assets.js +3 -44
  220. package/dist/setup/setup.js +1 -1
  221. package/dist/setup/steps/connection.js +5 -6
  222. package/dist/setup/steps/platforms.js +2 -2
  223. package/dist/setup/steps/tasks.js +25 -15
  224. package/dist/sources/provider-factory.js +17 -18
  225. package/dist/sources/providers/filesystem.js +2 -3
  226. package/dist/sources/providers/git-install.js +7 -1
  227. package/dist/sources/providers/git-provider.js +0 -3
  228. package/dist/sources/providers/git-stash.js +83 -21
  229. package/dist/sources/providers/npm.js +2 -4
  230. package/dist/sources/providers/provider-utils.js +5 -10
  231. package/dist/sources/providers/website.js +0 -2
  232. package/dist/sources/snapshot-fetchers/website-ingest.js +1 -1
  233. package/dist/sources/website-url.js +2 -2
  234. package/dist/storage/database.js +9 -35
  235. package/dist/storage/repositories/improve-ledger-repository.js +209 -0
  236. package/dist/storage/repositories/index-connection.js +39 -72
  237. package/dist/storage/repositories/index-entries-repository.js +131 -129
  238. package/dist/storage/repositories/index-entry-mapper.js +1 -2
  239. package/dist/storage/repositories/index-entry-schema.js +101 -268
  240. package/dist/storage/repositories/index-fts-repository.js +86 -256
  241. package/dist/storage/repositories/index-links-repository.js +143 -0
  242. package/dist/storage/repositories/index-llm-cache-repository.js +7 -9
  243. package/dist/storage/repositories/index-meta-repository.js +6 -4
  244. package/dist/storage/repositories/index-schema.js +257 -325
  245. package/dist/storage/repositories/index-utility-repository.js +8 -29
  246. package/dist/storage/repositories/index-vec-repository.js +133 -414
  247. package/dist/storage/repositories/outcome-repository.js +2 -1
  248. package/dist/storage/repositories/proposals-repository.js +104 -1
  249. package/dist/storage/repositories/registry-index-cache-repository.js +100 -0
  250. package/dist/storage/repositories/salience-repository.js +1 -19
  251. package/dist/storage/repositories/task-history-repository.js +26 -4
  252. package/dist/storage/repositories/workflow-runs-repository.js +53 -244
  253. package/dist/storage/sqlite-migrations.js +136 -0
  254. package/dist/storage/sqlite-pragmas.js +11 -9
  255. package/dist/storage/sqlite-transaction.js +170 -0
  256. package/dist/storage/state-db-integrity.js +130 -0
  257. package/dist/tasks/activation-config.js +134 -62
  258. package/dist/tasks/backends/cron.js +191 -302
  259. package/dist/tasks/backends/exec-utils.js +2 -5
  260. package/dist/tasks/backends/launchd.js +141 -748
  261. package/dist/tasks/backends/schtasks.js +119 -623
  262. package/dist/tasks/prepare/prepare-support.js +5 -15
  263. package/dist/tasks/prepare/prepare.js +0 -2
  264. package/dist/tasks/resolve-akm-bin.js +20 -79
  265. package/dist/tasks/run/attempt-lifecycle.js +0 -1
  266. package/dist/tasks/run/load-task.js +1 -1
  267. package/dist/tasks/scheduler-binding.js +20 -238
  268. package/dist/tasks/scheduler-invocation.js +136 -244
  269. package/dist/tasks/scheduler-lock.js +53 -0
  270. package/dist/tasks/scheduler-sync.js +368 -679
  271. package/dist/tasks/source/parse-task-source.js +55 -9
  272. package/dist/tasks/source/task-source-v3-frozen.js +3 -4
  273. package/dist/tasks/source/task-to-v4.js +464 -88
  274. package/dist/workflows/authoring/authoring.js +3 -12
  275. package/dist/workflows/compile.js +211 -0
  276. package/dist/workflows/concurrency-policy.js +13 -74
  277. package/dist/workflows/exec/child-invocation.js +3 -17
  278. package/dist/workflows/exec/child-workflow.js +32 -141
  279. package/dist/workflows/exec/dispatch-redaction.js +13 -53
  280. package/dist/workflows/exec/environment.js +98 -0
  281. package/dist/workflows/exec/exec-unit.js +33 -140
  282. package/dist/workflows/exec/frozen-judge.js +7 -59
  283. package/dist/workflows/exec/native-executor.js +82 -341
  284. package/dist/workflows/exec/param-secrets.js +29 -47
  285. package/dist/workflows/exec/run-workflow.js +154 -387
  286. package/dist/workflows/exec/scheduler.js +9 -36
  287. package/dist/workflows/exec/step-work.js +127 -430
  288. package/dist/workflows/exec/unit-dispatch.js +11 -63
  289. package/dist/workflows/exec/unit-writer.js +8 -52
  290. package/dist/workflows/exec/worktree.js +39 -273
  291. package/dist/workflows/freeze/child-output-references.js +4 -15
  292. package/dist/workflows/freeze/environment.js +99 -92
  293. package/dist/workflows/freeze/freeze.js +172 -0
  294. package/dist/workflows/freeze/step-values.js +19 -21
  295. package/dist/workflows/freeze/targets/child-workflow.js +23 -92
  296. package/dist/workflows/freeze/targets/command.js +10 -33
  297. package/dist/workflows/freeze/targets/script.js +5 -12
  298. package/dist/workflows/freeze/targets/shell.js +3 -6
  299. package/dist/workflows/freeze/targets/task.js +25 -80
  300. package/dist/workflows/freeze/task-bindings.js +20 -67
  301. package/dist/workflows/{source-ir/github-yaml.js → github-yaml.js} +88 -206
  302. package/dist/workflows/ir/params.js +6 -51
  303. package/dist/workflows/ir/plan-hash.js +2 -34
  304. package/dist/workflows/parser.js +140 -43
  305. package/dist/{commands/improve/consolidate/types.js → workflows/plan.js} +2 -1
  306. package/dist/workflows/renderer.js +36 -69
  307. package/dist/workflows/resource-limits.js +12 -120
  308. package/dist/workflows/runtime/agent-identity.js +8 -40
  309. package/dist/workflows/runtime/run-outputs.js +3 -6
  310. package/dist/workflows/runtime/run-plan.js +316 -0
  311. package/dist/workflows/runtime/runs.js +48 -200
  312. package/dist/workflows/runtime/workflow-asset-loader.js +24 -57
  313. package/dist/workflows/{source-ir/semantics.js → source-semantics.js} +16 -20
  314. package/dist/workflows/validate-summary.js +2 -7
  315. package/docs/integration/bundling-akm.md +49 -42
  316. package/docs/migration/README.md +1 -0
  317. package/docs/migration/release-notes/0.9.17.md +43 -0
  318. package/docs/migration/v0.9.1-to-v0.9.2.md +23 -7
  319. package/docs/reference/cli.md +232 -135
  320. package/docs/reference/configuration.md +71 -57
  321. package/docs/reference/data-and-telemetry.md +20 -21
  322. package/docs/reference/tasks.md +105 -39
  323. package/docs/reference/workflow-schema.md +14 -18
  324. package/docs/reference/workflows.md +6 -9
  325. package/package.json +1 -1
  326. package/schemas/akm-config.json +115 -738
  327. package/schemas/akm-workflow.json +1 -0
  328. package/dist/assets/improve-strategies/graph-refresh.json +0 -15
  329. package/dist/assets/prompts/contradiction-judge.md +0 -33
  330. package/dist/assets/prompts/graph-extract-system.md +0 -1
  331. package/dist/assets/prompts/graph-extract-user-prompt.md +0 -35
  332. package/dist/assets/prompts/metadata-enhance-system.md +0 -1
  333. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +0 -4
  334. package/dist/commands/health/advisories.js +0 -150
  335. package/dist/commands/health/metrics.js +0 -329
  336. package/dist/commands/health/surfaces.js +0 -102
  337. package/dist/commands/improve/anti-collapse.js +0 -83
  338. package/dist/commands/improve/collapse-detector.js +0 -432
  339. package/dist/commands/improve/consolidate/eligibility.js +0 -48
  340. package/dist/commands/improve/consolidate/merge.js +0 -149
  341. package/dist/commands/improve/distill/promote-memory.js +0 -291
  342. package/dist/commands/improve/distill/quality-gate.js +0 -337
  343. package/dist/commands/improve/eval-cases.js +0 -52
  344. package/dist/commands/improve/memory/memory-contradiction-detect.js +0 -291
  345. package/dist/commands/improve/proposal-envelope.js +0 -31
  346. package/dist/commands/improve/run-context.js +0 -123
  347. package/dist/commands/improve/shared.js +0 -31
  348. package/dist/commands/improve/source-identity.js +0 -28
  349. package/dist/commands/improve/triage.js +0 -96
  350. package/dist/commands/proposal/drain-policies.js +0 -151
  351. package/dist/commands/sources/update-transaction.js +0 -220
  352. package/dist/core/action-contributors.js +0 -28
  353. package/dist/core/config/config-version-shim.js +0 -101
  354. package/dist/core/fs-txn.js +0 -405
  355. package/dist/core/lexical-score.js +0 -25
  356. package/dist/core/maintenance-barrier.js +0 -167
  357. package/dist/execution/executable-identity.js +0 -105
  358. package/dist/execution/guarded-source.js +0 -427
  359. package/dist/indexer/db/graph-db.js +0 -444
  360. package/dist/indexer/graph/graph-boost.js +0 -427
  361. package/dist/indexer/graph/graph-dedup.js +0 -95
  362. package/dist/indexer/graph/graph-extraction.js +0 -1108
  363. package/dist/indexer/search/name-match.js +0 -35
  364. package/dist/indexer/search/ranking-contributors.js +0 -515
  365. package/dist/indexer/search/ranking-types.js +0 -4
  366. package/dist/indexer/walk/project-context.js +0 -192
  367. package/dist/integrations/agent/execution-cascade.js +0 -566
  368. package/dist/integrations/agent/execution-definitions.js +0 -202
  369. package/dist/integrations/agent/execution-lowering.js +0 -841
  370. package/dist/integrations/agent/execution-preparation.js +0 -98
  371. package/dist/integrations/agent/inline-execution.js +0 -74
  372. package/dist/llm/graph-extract.js +0 -728
  373. package/dist/llm/metadata-enhance.js +0 -96
  374. package/dist/registry/create-provider-registry.js +0 -29
  375. package/dist/registry/pinned-request-helper.js +0 -247
  376. package/dist/registry/pinned-transport.js +0 -717
  377. package/dist/sources/providers/index.js +0 -14
  378. package/dist/storage/engines/sqlite-migrations.js +0 -271
  379. package/dist/storage/repositories/canaries-repository.js +0 -107
  380. package/dist/storage/repositories/embedding-salvage-repository.js +0 -184
  381. package/dist/storage/repositories/registry-cache.js +0 -113
  382. package/dist/tasks/scheduler-sync-preview.js +0 -52
  383. package/dist/tasks/source/task-to-v3.js +0 -507
  384. package/dist/workflows/freeze/resolve-steps.js +0 -86
  385. package/dist/workflows/freeze/source-freeze.js +0 -64
  386. package/dist/workflows/ir/compile.js +0 -321
  387. package/dist/workflows/ir/environment-v4.js +0 -330
  388. package/dist/workflows/ir/freeze-v4.js +0 -153
  389. package/dist/workflows/ir/schema-v4.js +0 -745
  390. package/dist/workflows/ir/schema.js +0 -354
  391. package/dist/workflows/program/schema.js +0 -77
  392. package/dist/workflows/runtime/checkin.js +0 -57
  393. package/dist/workflows/runtime/plan-classifier.js +0 -196
  394. package/dist/workflows/runtime/unit-checkin.js +0 -45
  395. package/dist/workflows/runtime/unit-phases.js +0 -20
  396. package/dist/workflows/schema.js +0 -4
  397. package/dist/workflows/source-ir/compile.js +0 -200
  398. package/dist/workflows/source-ir/program.js +0 -50
  399. package/dist/workflows/source-ir/result.js +0 -26
  400. package/dist/workflows/source-ir/schema.js +0 -786
  401. package/dist/workflows/source-ir/triggers.js +0 -79
  402. package/dist/workflows/source-ir/uses.js +0 -40
  403. package/dist/workflows/validator.js +0 -60
@@ -3,42 +3,73 @@
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  import fs from "node:fs";
5
5
  import path from "node:path";
6
+ import dotenv from "dotenv";
6
7
  import { loadAdapterExecutionSource } from "../../commands/command/execution-source-loader.js";
7
8
  import { makeBundleRef, parseBundleRef } from "../../core/asset/asset-ref.js";
9
+ import { compareCodePoints, isWithin, toPosix } from "../../core/common.js";
8
10
  import { parseEnvRef } from "../../core/env-secret-ref.js";
9
11
  import { UsageError } from "../../core/errors.js";
10
12
  import { deriveInstallations } from "../../indexer/installations.js";
11
13
  import { resolveSourceEntries } from "../../indexer/search/search-source.js";
12
14
  import { resolveAssetPath } from "../../sources/resolve.js";
13
- import { freezeWorkflowEnvironment } from "../ir/environment-v4.js";
15
+ import { isInferredSecretName } from "../../tasks/log-redaction.js";
16
+ import { SECRET_TOKEN_RE } from "../exec/environment.js";
17
+ import { detectSecretShapedParams } from "../exec/param-secrets.js";
18
+ /**
19
+ * A step's frozen environment: literal `env:` values, `pass_env` names, then
20
+ * one value-free descriptor per `unit.env` ref (owner, key set, secret-token
21
+ * names). Values are read at dispatch (`exec/environment.ts`), never frozen.
22
+ */
14
23
  export function freezeEnvironment(source, exec, context) {
15
- const literals = Object.entries(source.env ?? {}).map(([name, value]) => Object.freeze({ kind: "literal", name, value: String(value) }));
16
- const passThrough = (exec?.passEnv ?? []).map((name) => Object.freeze({ kind: "pass-through", name }));
17
- const refs = source.unit?.env ?? [];
18
- const envRefs = freezeWorkflowEnvironment(refs, {
19
- collector: context.collector,
20
- resolveRef: (ref) => {
21
- const parsedEnv = parseEnvRef(ref);
22
- if (parsedEnv.type !== "env")
23
- throw new UsageError(`Expected an env ref; got ${ref}.`, "WORKFLOW_SOURCE_INVALID");
24
- const owned = resolveOwnedAssetSync(ref, "env", context);
25
- return { ref: owned.ref, bundle: owned.bundle, adapter: owned.adapter, root: owned.root, path: owned.file };
26
- },
24
+ const literals = Object.entries(source.env ?? {}).map(([name, raw]) => {
25
+ const value = String(raw);
26
+ // A literal is frozen into plan_json; a credential belongs in an env ref, as for task env.
27
+ if (isInferredSecretName(name) || detectSecretShapedParams({ [name]: value }).length > 0) {
28
+ throw new UsageError(`Workflow step ${source.id} env.${name} is a secret-shaped literal env value. Store credentials in an env asset (unit.env) rather than workflow source.`, "WORKFLOW_SOURCE_INVALID");
29
+ }
30
+ return Object.freeze({ kind: "literal", name, value });
27
31
  });
32
+ const passThrough = (exec?.passEnv ?? []).map((name) => Object.freeze({ kind: "pass-through", name }));
33
+ const seen = new Set();
34
+ const envRefs = [];
35
+ for (const [precedence, ref] of (source.unit?.env ?? []).entries()) {
36
+ if (parseEnvRef(ref).type !== "env") {
37
+ throw new UsageError(`Expected an env ref; got ${ref}.`, "WORKFLOW_SOURCE_INVALID");
38
+ }
39
+ const owned = resolveOwnedAssetSync(ref, "env", context);
40
+ if (seen.has(owned.ref))
41
+ continue;
42
+ seen.add(owned.ref);
43
+ const parsed = dotenv.parse(fs.readFileSync(owned.file));
44
+ const secretNames = new Set();
45
+ for (const value of Object.values(parsed)) {
46
+ for (const match of value.matchAll(SECRET_TOKEN_RE))
47
+ if (match[1])
48
+ secretNames.add(match[1]);
49
+ }
50
+ envRefs.push(Object.freeze({
51
+ kind: "env-ref",
52
+ ref: owned.ref,
53
+ owner: Object.freeze({
54
+ bundle: owned.bundle,
55
+ adapter: owned.adapter,
56
+ requestedRoot: owned.root,
57
+ requestedPath: owned.file,
58
+ relativePath: toPosix(path.relative(owned.root, owned.file)),
59
+ }),
60
+ keys: Object.keys(parsed).sort(compareCodePoints),
61
+ secretNames: [...secretNames].sort(compareCodePoints),
62
+ precedence,
63
+ }));
64
+ }
28
65
  return [...literals, ...passThrough, ...envRefs];
29
66
  }
30
- export async function guardedExecutionSource(ref, kind, context) {
67
+ /** Load a command or persona the workflow names, resolved through the workflow's own bundles. */
68
+ export async function workflowExecutionSource(ref, kind, context) {
31
69
  const owned = await resolveOwnedAsset(ref, kind === "command" ? "command" : "agent", context);
32
- captureOwned(owned, context.collector);
33
- const options = {
34
- config: context.config,
35
- fileContext: () => context.collector.fileContext(owned.root, owned.file),
36
- };
37
- const rendered = kind === "command"
38
- ? await loadAdapterExecutionSource(owned.ref, "command", options)
39
- : await loadAdapterExecutionSource(owned.ref, "persona", options);
40
- context.collector.bindIdentity(owned.file, owned.root, rendered.identity);
41
- return rendered;
70
+ return kind === "command"
71
+ ? loadAdapterExecutionSource(owned.ref, "command", { config: context.config })
72
+ : loadAdapterExecutionSource(owned.ref, "persona", { config: context.config });
42
73
  }
43
74
  export async function resolveOwnedAsset(ref, type, context) {
44
75
  return resolveOwnedAssetCore(ref, type, context, false);
@@ -46,44 +77,26 @@ export async function resolveOwnedAsset(ref, type, context) {
46
77
  export function resolveOwnedAssetSync(ref, type, context) {
47
78
  return resolveOwnedAssetCore(ref, type, context, true);
48
79
  }
49
- export function resolveOwnedAssetCore(refInput, type, context, sync) {
80
+ function resolveOwnedAssetCore(refInput, type, context, sync) {
50
81
  const parsed = parseBundleRef(refInput);
51
82
  const plural = type === "env" ? "env" : `${type}s`;
52
83
  const conceptId = parsed.conceptId.startsWith(`${plural}/`) ? parsed.conceptId : `${plural}/${parsed.conceptId}`;
53
84
  const name = conceptId.slice(plural.length + 1);
54
85
  const direct = parsed.bundle ? configuredOwner(parsed.bundle, context.config) : undefined;
55
- const sources = resolveSourceEntries(undefined, context.config);
56
- const installations = deriveInstallations(sources);
57
- const candidates = direct
58
- ? [direct]
59
- : sources.flatMap((source, index) => {
60
- const installation = installations[index];
61
- if (!installation || (parsed.bundle && installation.id !== parsed.bundle))
62
- return [];
63
- return [
64
- {
65
- bundle: installation.id,
66
- root: source.path,
67
- adapter: source.adapterId ?? installation.components[0]?.adapter ?? "akm",
68
- },
69
- ];
70
- });
86
+ const candidates = direct ? [direct] : installedOwners(parsed.bundle, context.config);
71
87
  const findSync = () => {
72
88
  for (const candidate of candidates) {
73
89
  const directory = path.join(candidate.root, plural);
74
90
  for (const extension of assetExtensions(type)) {
75
91
  const file = path.resolve(directory, `${name}${extension}`);
76
92
  if (fs.existsSync(file) && fs.statSync(file).isFile()) {
93
+ if (!isWithin(file, candidate.root)) {
94
+ throw new UsageError(`${file} resolves outside its owning root.`, "PATH_ESCAPE_VIOLATION");
95
+ }
77
96
  return { ...candidate, ref: makeBundleRef(candidate.bundle, conceptId), file };
78
97
  }
79
98
  }
80
99
  }
81
- // P4 (docs/plans/specs/p4-deletions-closeout.md §5.2, row B-11 preservation
82
- // gate): PRESERVED, not re-coded — tests/workflows/child-workflow-freeze.test.ts's
83
- // "B-11: workflows/<ref> that does not resolve fails the existing
84
- // asset-resolution failure, unchanged in code and shape" pins this exact
85
- // code by name and by its own title. Recorded deviation from §5.2's flat
86
- // "→ WORKFLOW_SOURCE_INVALID" for this file's 3 sites.
87
100
  throw new UsageError(`Workflow source target ${refInput} was not found.`, "INVALID_FLAG_VALUE");
88
101
  };
89
102
  if (sync)
@@ -101,7 +114,24 @@ export function resolveOwnedAssetCore(refInput, type, context, sync) {
101
114
  return findSync();
102
115
  })();
103
116
  }
104
- export function configuredOwner(bundle, config) {
117
+ /** Every installed bundle root (or just `bundle`'s), in installation priority order. */
118
+ function installedOwners(bundle, config) {
119
+ const sources = resolveSourceEntries(undefined, config);
120
+ const installations = deriveInstallations(sources);
121
+ return sources.flatMap((source, index) => {
122
+ const installation = installations[index];
123
+ if (!installation || (bundle && installation.id !== bundle))
124
+ return [];
125
+ return [
126
+ {
127
+ bundle: installation.id,
128
+ root: source.path,
129
+ adapter: source.adapterId ?? installation.components[0]?.adapter ?? "akm",
130
+ },
131
+ ];
132
+ });
133
+ }
134
+ function configuredOwner(bundle, config) {
105
135
  const entry = config.bundles?.[bundle];
106
136
  if (!entry || typeof entry.path !== "string")
107
137
  return undefined;
@@ -113,55 +143,32 @@ export function configuredOwner(bundle, config) {
113
143
  adapter: component?.adapter ?? "akm",
114
144
  };
115
145
  }
116
- export function assetExtensions(type) {
146
+ const SCRIPT_EXTENSIONS = [
147
+ "",
148
+ ".sh",
149
+ ".ts",
150
+ ".js",
151
+ ".py",
152
+ ".rb",
153
+ ".go",
154
+ ".pl",
155
+ ".php",
156
+ ".lua",
157
+ ".r",
158
+ ".swift",
159
+ ".kt",
160
+ ".kts",
161
+ ".ps1",
162
+ ".cmd",
163
+ ".bat",
164
+ ];
165
+ function assetExtensions(type) {
117
166
  if (type === "script")
118
- return [
119
- "",
120
- ".sh",
121
- ".ts",
122
- ".js",
123
- ".py",
124
- ".rb",
125
- ".go",
126
- ".pl",
127
- ".php",
128
- ".lua",
129
- ".r",
130
- ".swift",
131
- ".kt",
132
- ".kts",
133
- ".ps1",
134
- ".cmd",
135
- ".bat",
136
- ];
167
+ return SCRIPT_EXTENSIONS;
137
168
  if (type === "env")
138
169
  return ["", ".env"];
139
170
  return ["", ".md", ".yml"];
140
171
  }
141
- export function captureOwned(owned, collector) {
142
- trackAncestry(collector, owned.root, owned.file);
143
- const retained = collector.capture(owned.file, owned.root, { authored: true });
144
- return collector.bindIdentity(owned.file, owned.root, {
145
- ref: owned.ref,
146
- bundle: owned.bundle,
147
- adapter: owned.adapter,
148
- file: retained.relativePath,
149
- hash: retained.sha256,
150
- });
151
- }
152
- export function trackAncestry(collector, rootInput, file) {
153
- const root = path.resolve(rootInput);
154
- collector.trackDirectory(root, root);
155
- const relative = path.relative(root, path.dirname(file));
156
- if (relative.startsWith("..") || path.isAbsolute(relative)) {
157
- throw new UsageError(`${file} resolves outside its owning root.`, "PATH_ESCAPE_VIOLATION");
158
- }
159
- let current = root;
160
- for (const segment of relative === "" ? [] : relative.split(path.sep)) {
161
- current = path.join(current, segment);
162
- collector.trackDirectory(current, root);
163
- }
164
- }
165
172
  export function qualifyRef(ref, plural, asset, config) {
166
173
  const parsed = parseBundleRef(ref);
167
174
  if (parsed.bundle)
@@ -0,0 +1,172 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ /**
5
+ * Freeze a compiled workflow plan into the plan a run executes. Every step's
6
+ * authored spec resolves through the shared command/task authorities into a
7
+ * frozen `root` (engine, model, timeout, concurrency, dispatch target and
8
+ * environment descriptors); gates get their judge; the compile-only fields are
9
+ * dropped; the source file's sha256 is recorded. Nothing is published here.
10
+ */
11
+ import { createHash } from "node:crypto";
12
+ import { ConfigError, UsageError } from "../../core/errors.js";
13
+ import { warn } from "../../core/warn.js";
14
+ import { NO_ENGINE_MESSAGE_SUFFIX } from "../../integrations/agent/engine-fallback.js";
15
+ import { resolveExecution } from "../../integrations/agent/execution.js";
16
+ import { checkWorkflowPlan } from "../compile.js";
17
+ import { defaultMapConcurrency, workflowMaxConcurrency } from "../concurrency-policy.js";
18
+ import { canonicalJson } from "../ir/plan-hash.js";
19
+ import { WORKFLOW_PLAN_VERSION, } from "../plan.js";
20
+ import { classifyWorkflowStepUses } from "../source-semantics.js";
21
+ import { assertChildOutputReferences } from "./child-output-references.js";
22
+ import { qualifyRef } from "./environment.js";
23
+ import { baseUnitOf } from "./step-values.js";
24
+ import { childWorkflowDispatch } from "./targets/child-workflow.js";
25
+ import { commandDispatch, commandResult } from "./targets/command.js";
26
+ import { directScript } from "./targets/script.js";
27
+ import { directShell } from "./targets/shell.js";
28
+ import { taskDispatch } from "./targets/task.js";
29
+ /** Resolve and freeze one workflow (and, recursively, every child it composes). */
30
+ export async function freezeWorkflow(asset, config, refPath = [asset.ref]) {
31
+ const compiled = asset.plan;
32
+ const checked = checkWorkflowPlan(compiled);
33
+ if (!checked.ok) {
34
+ throw new UsageError(checked.errors.map((error) => `${asset.path}:${error.line}: ${error.message}`).join("\n"), "WORKFLOW_SOURCE_INVALID");
35
+ }
36
+ const context = {
37
+ asset,
38
+ config,
39
+ plan: compiled,
40
+ refPath,
41
+ freezeChild: (child, childRefPath) => freezeWorkflow(child, config, childRefPath),
42
+ };
43
+ let engineAnnouncement;
44
+ const steps = [];
45
+ for (const step of compiled.steps) {
46
+ const { spec, ...frozenStep } = step;
47
+ const source = { ...(spec ?? { source: { path: asset.path, start: 1, end: 1 } }), id: step.stepId };
48
+ let root;
49
+ if (!step.route) {
50
+ const resolved = await resolveStep(source, context);
51
+ engineAnnouncement ??= resolved.engineAnnouncement;
52
+ root = frozenRoot(step.stepId, source, resolved, compiled, config);
53
+ }
54
+ let frozenJudge = null;
55
+ if (step.gate.criteria.length > 0) {
56
+ const judge = resolveJudge(source, step.gate.criteria[0] ?? "", context);
57
+ if (judge) {
58
+ frozenJudge = judge.target;
59
+ engineAnnouncement ??= judge.engineAnnouncement;
60
+ }
61
+ else {
62
+ warn(`Workflow step "${step.stepId}" has completion criteria but no verification engine is available ` +
63
+ "(set workflow.judgeEngine, defaults.engine, or install an opencode-sdk binary). The step will block " +
64
+ "for `akm workflow resume` once it is reached.");
65
+ }
66
+ }
67
+ steps.push({ ...frozenStep, ...(root ? { root } : {}), gate: { ...step.gate, frozenJudge } });
68
+ }
69
+ assertChildOutputReferences(steps);
70
+ const plan = {
71
+ irVersion: WORKFLOW_PLAN_VERSION,
72
+ title: asset.title,
73
+ ...(compiled.params ? { params: compiled.params } : {}),
74
+ ...(compiled.paramSchemas ? { paramSchemas: compiled.paramSchemas } : {}),
75
+ ...(compiled.budget ? { budget: compiled.budget } : {}),
76
+ ...(compiled.outputs ? { outputs: compiled.outputs } : {}),
77
+ execution: { maxConcurrency: workflowMaxConcurrency(config.workflow?.maxConcurrency) },
78
+ sourceHash: asset.sourceHash,
79
+ steps,
80
+ };
81
+ return { plan, warnings: checked.warnings, ...(engineAnnouncement ? { engineAnnouncement } : {}) };
82
+ }
83
+ async function resolveStep(source, context) {
84
+ const baseUnit = baseUnitOf(source);
85
+ if (source.exec)
86
+ return directShell(source, baseUnit, context);
87
+ if (!source.uses)
88
+ throw new Error(`workflow step ${source.id} has neither exec nor uses`);
89
+ const target = classifyWorkflowStepUses(source.uses);
90
+ if (target.kind === "task")
91
+ return taskDispatch(source, baseUnit, target.ref, context);
92
+ if (target.kind === "workflow") {
93
+ return childWorkflowDispatch({
94
+ source,
95
+ baseUnit,
96
+ childRefInput: target.ref,
97
+ context,
98
+ via: "direct",
99
+ authoredInputs: { kind: "with", value: source.with },
100
+ });
101
+ }
102
+ // `commands/<ref>` and `scripts/<ref>` are not binding surfaces; `akm/command`'s
103
+ // `with:` is its own argument bag.
104
+ if (target.kind !== "builtin-command" && source.with !== undefined) {
105
+ const family = target.kind === "command" ? "commands" : "scripts";
106
+ throw new UsageError(`Workflow step ${source.id} cannot pass with: to ${family} target ${target.ref}; a ${target.kind} ref is not a binding surface.`, "COMPOSITION_INVALID");
107
+ }
108
+ if (target.kind === "script")
109
+ return directScript(source, baseUnit, target.ref, context);
110
+ const action = target.kind === "builtin-command"
111
+ ? source.with
112
+ : { ref: qualifyRef(target.ref, "commands", context.asset, context.config) };
113
+ return commandDispatch(source, baseUnit, action, context);
114
+ }
115
+ /** The gate judge's frozen command target, or undefined when no engine is available and none is configured. */
116
+ function resolveJudge(source, rubric, context) {
117
+ const configuredEngine = context.config.workflow?.judgeEngine;
118
+ try {
119
+ const prepared = resolveExecution({
120
+ content: rubric.trim() || "Judge workflow completion.",
121
+ config: context.config,
122
+ ...(configuredEngine ? { current: { engine: configuredEngine } } : {}),
123
+ });
124
+ return commandResult(source, { onError: "fail", source: source.source }, prepared, context);
125
+ }
126
+ catch (err) {
127
+ if (configuredEngine || !(err instanceof ConfigError && err.message.includes(NO_ENGINE_MESSAGE_SUFFIX)))
128
+ throw err;
129
+ return undefined;
130
+ }
131
+ }
132
+ function frozenRoot(stepId, source, resolved, plan, config) {
133
+ const unit = resolved.unit;
134
+ const target = resolved.target.kind === "shell"
135
+ ? {
136
+ ...resolved.target,
137
+ contentHash: createHash("sha256")
138
+ .update("akm.workflow.shell.v1\0")
139
+ .update(canonicalJson({
140
+ exec: resolved.target.exec,
141
+ environment: resolved.environment,
142
+ cwdIdentity: resolved.target.cwdIdentity,
143
+ }))
144
+ .digest("hex"),
145
+ }
146
+ : resolved.target;
147
+ const node = {
148
+ kind: "unit",
149
+ id: source.map ? `${stepId}.unit` : stepId,
150
+ instructions: resolved.instructions,
151
+ ...(source.inputs && source.inputs.length > 0 ? { inputs: [...source.inputs] } : {}),
152
+ ...(unit.output !== undefined ? { schema: unit.output } : {}),
153
+ ...(unit.retry ? { retry: { max: unit.retry.max, on: [...unit.retry.on] } } : {}),
154
+ onError: unit.onError ?? plan.defaults?.onError ?? "fail",
155
+ ...(unit.env ? { env: [...unit.env] } : {}),
156
+ isolation: unit.isolation ?? "none",
157
+ source: { ...source.source },
158
+ frozenTarget: target,
159
+ environment: [...resolved.environment],
160
+ };
161
+ if (!source.map)
162
+ return node;
163
+ return {
164
+ kind: "map",
165
+ id: `${stepId}.map`,
166
+ over: source.map.over,
167
+ template: node,
168
+ concurrency: source.map.concurrency ?? defaultMapConcurrency(config.workflow?.defaultMapConcurrency),
169
+ reducer: source.map.reducer ?? "collect",
170
+ source: { ...source.source },
171
+ };
172
+ }
@@ -4,11 +4,20 @@
4
4
  import { canonicalResolvedExecutionRequest, decodeResolvedExecutionRequest, } from "../../execution/resolved-request.js";
5
5
  import { defaultLlmEngineConcurrency } from "../concurrency-policy.js";
6
6
  import { DEFAULT_EXEC_TIMEOUT_MS } from "../resource-limits.js";
7
+ /** The unit's authored settings plus its source span and argv, before any target resolution. */
8
+ export function baseUnitOf(source) {
9
+ return {
10
+ ...(source.unit ? structuredClone(source.unit) : {}),
11
+ source: { ...source.source },
12
+ ...(source.exec ? { exec: { ...source.exec } } : {}),
13
+ };
14
+ }
15
+ /** Resolve an exec's timeout: unit `timeout:` → document `defaults.timeout` → the default. */
7
16
  export function freezeExecSpec(source, exec, context) {
8
17
  const declared = Object.hasOwn(source.unit ?? {}, "timeoutMs")
9
18
  ? source.unit?.timeoutMs
10
- : context.sourceIr.defaults && Object.hasOwn(context.sourceIr.defaults, "timeoutMs")
11
- ? context.sourceIr.defaults.timeoutMs
19
+ : context.plan.defaults && Object.hasOwn(context.plan.defaults, "timeoutMs")
20
+ ? context.plan.defaults.timeoutMs
12
21
  : undefined;
13
22
  return {
14
23
  ...exec,
@@ -28,6 +37,7 @@ export function targetConcurrency(runner, config) {
28
37
  const fallback = fallbackName ? config.engines?.[fallbackName] : undefined;
29
38
  return defaultLlmEngineConcurrency(runner.fallbackConnection.endpoint, fallback?.kind === "llm" ? fallback.concurrency : undefined);
30
39
  }
40
+ /** The request as it may be persisted: its live runtime environment removed. */
31
41
  export function durableRequest(request) {
32
42
  const wire = JSON.parse(canonicalResolvedExecutionRequest(request));
33
43
  const runtime = { ...wire.runtime };
@@ -35,9 +45,6 @@ export function durableRequest(request) {
35
45
  wire.runtime = runtime;
36
46
  return decodeResolvedExecutionRequest(wire);
37
47
  }
38
- export function executionValues(source, workspace) {
39
- return executionUnitValues(source.unit, workspace);
40
- }
41
48
  export function executionUnitValues(unit, workspace) {
42
49
  return Object.freeze({
43
50
  ...(unit && Object.hasOwn(unit, "engine") ? { engine: unit.engine } : {}),
@@ -48,21 +55,12 @@ export function executionUnitValues(unit, workspace) {
48
55
  workspace,
49
56
  });
50
57
  }
51
- /**
52
- * Step ids that appear BEFORE `stepId` in the frozen step order (A-N4) — the
53
- * SAME ordering map.over/inputs[] rely on. Shared by `targets/task.ts` (a
54
- * step's own `with:` against its composed task's declared `inputs:`) and
55
- * `targets/child-workflow.ts` (the SAME step's effective inputs, re-bound
56
- * against a composed child workflow's declared `params:`, spec A-N8) — moved
57
- * here rather than duplicated so both can import it without either importing
58
- * the other.
59
- */
60
- export function earlierStepIds(sourceIr, stepId) {
61
- const steps = sourceIr.jobs[0]?.steps ?? [];
62
- const index = steps.findIndex((step) => step.id === stepId);
63
- return new Set(index < 0 ? [] : steps.slice(0, index).map((step) => step.id));
58
+ /** Step ids declared BEFORE `stepId` — the same ordering `map.over` and `inputs:` rely on. */
59
+ export function earlierStepIds(plan, stepId) {
60
+ const index = plan.steps.findIndex((step) => step.stepId === stepId);
61
+ return new Set(index < 0 ? [] : plan.steps.slice(0, index).map((step) => step.stepId));
64
62
  }
65
- /** THIS workflow's own declared param names (A-N4) — never an outer composing task's. See {@link earlierStepIds}. */
66
- export function declaredParamNames(sourceIr) {
67
- return new Set(sourceIr.params ? Object.keys(sourceIr.params) : []);
63
+ /** THIS workflow's own declared param names — never an outer composing task's. */
64
+ export function declaredParamNames(plan) {
65
+ return new Set(plan.paramSchemas ? Object.keys(plan.paramSchemas) : (plan.params ?? []));
68
66
  }