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
@@ -1,86 +0,0 @@
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
- import { ConfigError, UsageError } from "../../core/errors.js";
5
- import { prepareInlineExecution } from "../../integrations/agent/inline-execution.js";
6
- import { sourceStepProgramUnit, sourceStepRef } from "../source-ir/program.js";
7
- import { classifyWorkflowStepUses } from "../source-ir/semantics.js";
8
- import { qualifyRef } from "./environment.js";
9
- import { childWorkflowDispatch } from "./targets/child-workflow.js";
10
- import { commandDispatch, commandResult, inlineDispatch } from "./targets/command.js";
11
- import { directScript } from "./targets/script.js";
12
- import { directShell } from "./targets/shell.js";
13
- import { taskDispatch } from "./targets/task.js";
14
- export async function resolveStep(source, context) {
15
- const baseUnit = sourceStepProgramUnit(source);
16
- if (source.exec || source.run !== undefined)
17
- return directShell(source, baseUnit, context);
18
- if (!source.uses)
19
- return inlineDispatch(source, baseUnit, context);
20
- const target = classifyWorkflowStepUses(source.uses);
21
- if (target.kind === "task")
22
- return taskDispatch(source, baseUnit, target.ref, context);
23
- // A direct `uses: workflows/<ref>` step (spec docs/plans/specs/
24
- // p3a-plan-v5-child-freeze.md §4.2, row B-01/B-04). `with:` on this target
25
- // IS a valid binding surface (A-N8) — unlike scripts/commands below,
26
- // `rejectNonTaskBindingWith` must NOT be extended to it.
27
- if (target.kind === "workflow") {
28
- return childWorkflowDispatch({
29
- source,
30
- baseUnit,
31
- childRefInput: target.ref,
32
- context,
33
- via: "direct",
34
- authoredInputs: { kind: "with", value: source.with },
35
- });
36
- }
37
- if (target.kind === "script") {
38
- rejectNonTaskBindingWith(source, target.ref, "script");
39
- return directScript(source, baseUnit, target.ref, context);
40
- }
41
- if (target.kind === "command" || target.kind === "builtin-command") {
42
- if (target.kind === "command")
43
- rejectNonTaskBindingWith(source, target.ref, "command");
44
- const action = target.kind === "builtin-command"
45
- ? source.with
46
- : { ref: qualifyRef(target.ref, "commands", context.asset, context.config) };
47
- return commandDispatch(source, baseUnit, action, context);
48
- }
49
- throw new UsageError(`Workflow target ${source.uses} is not executable in 0.9.2.`, "WORKFLOW_SOURCE_INVALID");
50
- }
51
- /**
52
- * A-N5 (spec docs/plans/specs/p2b-input-bindings.md §1.7): `commands/<ref>`
53
- * and `scripts/<ref>` are not binding surfaces — a `with:` authored on either
54
- * now fails closed instead of being silently dropped (the same defect P1a
55
- * closed for `tasks/<ref>`, now repeated for these two targets, B-22/B-23).
56
- * `akm/command`'s `with:` is its own argument bag
57
- * (`parseBuiltinCommandAction`) and never routes through here.
58
- */
59
- function rejectNonTaskBindingWith(source, ref, kind) {
60
- if (source.with === undefined)
61
- return;
62
- const family = kind === "command" ? "commands" : "scripts";
63
- throw new UsageError(`Workflow step ${source.id} cannot pass with: to ${family} target ${ref}; a ${kind} ref is not a binding surface.`, "COMPOSITION_INVALID");
64
- }
65
- const NO_ENGINE_AVAILABLE_MESSAGE = "the fixed opencode-sdk fallback is unavailable";
66
- function isNoEngineAvailable(err) {
67
- return err instanceof ConfigError && err.message.includes(NO_ENGINE_AVAILABLE_MESSAGE);
68
- }
69
- export function resolveJudge(source, context) {
70
- const configuredEngine = context.config.workflow?.judgeEngine;
71
- const content = source.gate?.rubric?.trim() ?? "Judge workflow completion.";
72
- try {
73
- const prepared = prepareInlineExecution({
74
- content,
75
- config: context.config,
76
- invocationKind: "workflow",
77
- ...(configuredEngine ? { current: { engine: configuredEngine } } : {}),
78
- });
79
- return commandResult(source, { onError: "fail", source: sourceStepRef(source) }, prepared, context);
80
- }
81
- catch (err) {
82
- if (configuredEngine || !isNoEngineAvailable(err))
83
- throw err;
84
- return undefined;
85
- }
86
- }
@@ -1,64 +0,0 @@
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
- import { COMPOSITION_INVALID_MULTI_JOB_HINT, UsageError } from "../../core/errors.js";
5
- import { warn } from "../../core/warn.js";
6
- import { compileWorkflowSource } from "../source-ir/compile.js";
7
- import { resolveJudge, resolveStep } from "./resolve-steps.js";
8
- /**
9
- * Resolve every authored target through the shared command/task authorities
10
- * before v4 publication.
11
- *
12
- * `composition` and `freezeChild` (spec docs/plans/specs/
13
- * p3a-plan-v5-child-freeze.md §4.1/§4.3) thread the recursive
14
- * child-workflow-freeze state down into every step's `ResolutionContext`;
15
- * `ir/freeze-v4.ts`'s `compileResolveFreezeWorkflowV4` is this function's
16
- * ONLY caller (directly — P4 deleted the `ir/source-freeze-v4.ts` shim that
17
- * used to sit on this edge) and supplies both — the root default
18
- * composition, or the composition
19
- * `targets/child-workflow.ts` built for a recursive child freeze.
20
- */
21
- export async function resolveWorkflowSourceV4(asset, workflowSource, config, collector, composition, freezeChild) {
22
- const compiled = compileWorkflowSource(workflowSource.content, { path: asset.path, workspaceRoot: asset.sourcePath });
23
- if (!compiled.ok) {
24
- // P4-N2 (docs/plans/specs/p4-deletions-closeout.md §3.3.4): a compile
25
- // result whose single error is the adapter's multi-job rejection
26
- // surfaces as COMPOSITION_INVALID — one authoritative composition
27
- // policy; every other compile failure (a YAML syntax error, an
28
- // unsupported trigger, …) is WORKFLOW_SOURCE_INVALID. Never blanket-recode.
29
- const isMultiJob = compiled.errors.length === 1 && compiled.errors[0]?.code === "multi-job-unsupported";
30
- const code = isMultiJob ? "COMPOSITION_INVALID" : "WORKFLOW_SOURCE_INVALID";
31
- throw new UsageError(`Workflow source cannot be frozen: ${compiled.errors.map((error) => error.message).join("; ")}`, code, isMultiJob ? COMPOSITION_INVALID_MULTI_JOB_HINT : undefined);
32
- }
33
- const context = { asset, config, collector, sourceIr: compiled.ir, composition, freezeChild };
34
- const units = new Map();
35
- const judges = new Map();
36
- let engineAnnouncement;
37
- const sourceSteps = compiled.ir.jobs[0]?.steps ?? [];
38
- for (const sourceStep of sourceSteps) {
39
- if (!sourceStep.route) {
40
- const resolved = await resolveStep(sourceStep, context);
41
- units.set(sourceStep.id, Object.freeze(resolved));
42
- engineAnnouncement ??= resolved.engineAnnouncement;
43
- }
44
- if (sourceStep.gate?.rubric?.trim()) {
45
- const judge = resolveJudge(sourceStep, context);
46
- if (judge === undefined) {
47
- warn(`Workflow step "${sourceStep.id}" has completion criteria but no verification engine is available ` +
48
- "(set workflow.judgeEngine, defaults.engine, or install an opencode-sdk binary). The step will block " +
49
- "for `akm workflow resume` once it is reached.");
50
- continue;
51
- }
52
- if (judge.target.kind !== "command")
53
- throw new Error(`workflow judge ${sourceStep.id} did not resolve to a command target`);
54
- judges.set(sourceStep.id, judge.target);
55
- engineAnnouncement ??= judge.engineAnnouncement;
56
- }
57
- }
58
- return Object.freeze({
59
- sourceIr: compiled.ir,
60
- units,
61
- judges,
62
- ...(engineAnnouncement ? { engineAnnouncement } : {}),
63
- });
64
- }
@@ -1,321 +0,0 @@
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
- * Frontend -> unresolved workflow plan compiler (workflow-format-unification).
6
- *
7
- * ONE frontend now: {@link compileWorkflowPlan} lowers adapter-neutral source
8
- * IR into the current unresolved plan draft. Markdown and YAML never reach a
9
- * format-specific runtime compiler. This pass owns the
10
- * semantic rules the parser deliberately does not check:
11
- *
12
- * - every reference string (`map.over` / `route.input` / `inputs[]`) parses
13
- * against the CLOSED two-root grammar (`program/expressions.ts`);
14
- * - `steps.<id>` references name an EARLIER step (a producer that has
15
- * already run when the reference resolves);
16
- * - `inputs:` entries must reference a STEP OUTPUT, never `params.*` — params
17
- * are already attached to every unit unconditionally, so naming one as a
18
- * declared input would be redundant.
19
- *
20
- * Node-id convention (stable, unique within a plan):
21
- * step root → `<stepId>` (unit) or `<stepId>.map` (map)
22
- * map unit → `<stepId>.unit` (template instantiated per item)
23
- * gate → `<stepId>.gate`
24
- *
25
- * Returns accumulated `WorkflowError`s rather than throwing. Pure and
26
- * deterministic: the same document always compiles to the same plan.
27
- */
28
- import { compareCodePoints } from "../../core/common.js";
29
- import { formatReference, parseReference } from "../program/expressions.js";
30
- import { projectExecCore } from "../program/schema.js";
31
- import { sourceStepInstructions, sourceStepProgramUnit, sourceStepRef } from "../source-ir/program.js";
32
- import { decodeWorkflowSourceIrV1, } from "../source-ir/schema.js";
33
- /**
34
- * Compile source IR into a frozen-plan-ready graph.
35
- * `title` is the run-level display title (the asset's canonical name — the
36
- * format carries no authored title). Assumes the document came out of
37
- * `parseWorkflow` ok (structure already valid).
38
- */
39
- export function compileWorkflowPlan(input, title, resolvedUnits = new Map()) {
40
- const sourceIr = decodeWorkflowSourceIrV1(input);
41
- const errors = [];
42
- // The decoder guarantees exactly one job (P4 §3.3, docs/plans/specs/
43
- // p4-deletions-closeout.md, row B-43) — a 2+-job document is rejected at
44
- // the adapter boundary and never reaches this compiler.
45
- const sourceSteps = sourceIr.jobs[0]?.steps ?? [];
46
- const allStepIds = new Set(sourceSteps.map((step) => step.id));
47
- const earlierStepIds = new Set();
48
- const steps = [];
49
- sourceSteps.forEach((step, sequenceIndex) => {
50
- const check = { allStepIds, earlierStepIds, errors };
51
- if (step.map) {
52
- checkReferenceField(step.map.over, { ...check, line: step.source.start, label: `Step "${step.id}" map.over` });
53
- }
54
- if (step.route) {
55
- checkReferenceField(step.route.input, {
56
- ...check,
57
- line: step.source.start,
58
- label: `Step "${step.id}" route.input`,
59
- });
60
- }
61
- for (const [index, reference] of (step.inputs ?? []).entries()) {
62
- checkInputReference(reference, index, {
63
- ...check,
64
- line: step.source.start,
65
- label: `Step "${step.id}" inputs`,
66
- });
67
- }
68
- steps.push(compileStep(step, sequenceIndex, sourceIr.defaults, resolvedUnits.get(step.id)));
69
- earlierStepIds.add(step.id);
70
- });
71
- // P3b (spec §4.2, rows B-06/B-07): `outputs:` references are validated
72
- // against the FULL step id set (never `earlierStepIds` — resolution happens
73
- // at RUN COMPLETION, after every step has run, so an output may legitimately
74
- // name any declared step regardless of its position).
75
- for (const [name, declaration] of Object.entries(sourceIr.outputs ?? {})) {
76
- checkOutputReference(name, declaration.from, { errors, allStepIds, line: sourceIr.source.start });
77
- }
78
- if (errors.length > 0)
79
- return { ok: false, errors };
80
- const paramNames = sourceIr.params ? Object.keys(sourceIr.params) : [];
81
- return {
82
- ok: true,
83
- warnings: collectWorkflowWarnings(sourceIr),
84
- plan: {
85
- title,
86
- ...(paramNames.length > 0 ? { params: paramNames } : {}),
87
- ...(sourceIr.params && paramNames.length > 0
88
- ? { paramSchemas: sourceIr.params }
89
- : {}),
90
- ...(sourceIr.outputs ? { outputs: sortedOutputs(sourceIr.outputs) } : {}),
91
- ...(sourceIr.budget
92
- ? {
93
- budget: {
94
- ...(sourceIr.budget.maxTokens !== undefined ? { maxTokens: sourceIr.budget.maxTokens } : {}),
95
- ...(sourceIr.budget.maxUnits !== undefined ? { maxUnits: sourceIr.budget.maxUnits } : {}),
96
- },
97
- }
98
- : {}),
99
- steps,
100
- },
101
- };
102
- }
103
- /**
104
- * Re-key `outputs:` into canonical wire order (code-point-ascending by name)
105
- * — the order {@link decodeWorkflowOutputs} in `ir/schema-v4.ts` requires,
106
- * mirroring how `freeze/task-bindings.ts`'s `finalizeBindings` sorts
107
- * `inputBindings` before freezing. The source parser preserves AUTHOR order
108
- * (P3b spec §4.2 places no ordering requirement on authoring), so this is the
109
- * one place that must impose it.
110
- */
111
- function sortedOutputs(outputs) {
112
- const sorted = {};
113
- for (const name of Object.keys(outputs).sort(compareCodePoints)) {
114
- sorted[name] = outputs[name];
115
- }
116
- return sorted;
117
- }
118
- function compileStep(step, sequenceIndex, defaults, resolved) {
119
- const gate = {
120
- kind: "gate",
121
- id: `${step.id}.gate`,
122
- stepId: step.id,
123
- // The body `### gate` rubric is carried through as the ONE criterion string
124
- // — the judge receives the whole section byte-exact (spec §2.4). A step
125
- // with no rubric needs no verification (criteria: []).
126
- criteria: step.gate?.rubric?.trim() ? [step.gate.rubric] : [],
127
- ...(step.gate?.maxLoops !== undefined ? { maxLoops: step.gate.maxLoops } : {}),
128
- };
129
- let root;
130
- if (step.route === undefined) {
131
- const unit = resolved?.unit ?? sourceStepProgramUnit(step);
132
- const instructionsText = resolved?.instructions ?? sourceStepInstructions(step);
133
- if (step.map) {
134
- root = {
135
- kind: "map",
136
- id: `${step.id}.map`,
137
- over: step.map.over,
138
- template: compileUnit(unit, `${step.id}.unit`, instructionsText, defaults, step.inputs, sourceStepRef(step)),
139
- ...(step.map.concurrency !== undefined ? { concurrency: step.map.concurrency } : {}),
140
- reducer: step.map.reducer ?? "collect",
141
- source: step.source,
142
- };
143
- }
144
- else {
145
- root = compileUnit(unit, step.id, instructionsText, defaults, step.inputs, sourceStepRef(step));
146
- }
147
- }
148
- return {
149
- stepId: step.id,
150
- title: step.id,
151
- sequenceIndex,
152
- ...(root ? { root } : {}),
153
- ...(step.route
154
- ? {
155
- route: {
156
- input: step.route.input,
157
- when: Object.fromEntries(step.route.branches.map((b) => [b.match, b.stepId])),
158
- ...(step.route.defaultStepId !== undefined ? { defaultStepId: step.route.defaultStepId } : {}),
159
- },
160
- }
161
- : {}),
162
- ...(step.output !== undefined ? { outputSchema: step.output } : {}),
163
- gate,
164
- };
165
- }
166
- /**
167
- * Lower one source unit into the unresolved structural plan. Instructions are
168
- * ALWAYS the step's body prose, byte-exact — never templated, never scanned
169
- * for reference syntax. Engine/model/timeout settings remain on the parsed
170
- * override bag until the single freeze boundary.
171
- */
172
- function compileUnit(unit, id, instructions, defaults, inputs, source) {
173
- return {
174
- kind: "unit",
175
- id,
176
- instructions,
177
- ...(inputs && inputs.length > 0 ? { inputs: [...inputs] } : {}),
178
- // Shared projection: named pass-through scope is carried conditionally;
179
- // whole-process environment inheritance is not an authoring surface.
180
- ...(unit.exec ? { exec: projectExecCore(unit.exec) } : {}),
181
- ...(unit.output !== undefined ? { schema: unit.output } : {}),
182
- ...(unit.retry ? { retry: { max: unit.retry.max, on: [...unit.retry.on] } } : {}),
183
- onError: unit.onError ?? defaults?.onError ?? "fail",
184
- ...(unit.env ? { env: [...unit.env] } : {}),
185
- ...(unit.isolation !== undefined ? { isolation: unit.isolation } : {}),
186
- ...(source ? { source } : {}),
187
- };
188
- }
189
- /** Validate a whole-value reference field (`map.over`, `route.input`). */
190
- function checkReferenceField(text, check) {
191
- const parsed = parseReference(text);
192
- if (!parsed.ok) {
193
- check.errors.push({ line: check.line, message: `${check.label}: ${parsed.message}` });
194
- return;
195
- }
196
- if (parsed.expr.kind === "stepOutput" && !check.earlierStepIds.has(parsed.expr.stepId)) {
197
- const why = check.allStepIds.has(parsed.expr.stepId)
198
- ? `step "${parsed.expr.stepId}" does not come before this step — references must name an earlier step (a producer that has already run)`
199
- : `"${parsed.expr.stepId}" is not a step in this workflow`;
200
- check.errors.push({
201
- line: check.line,
202
- message: `${check.label}: "${formatReference(parsed.expr)}" cannot be resolved — ${why}.`,
203
- });
204
- }
205
- }
206
- /** Validate one `inputs[]` entry: must be a step-output reference to an earlier step. */
207
- function checkInputReference(text, index, check) {
208
- const parsed = parseReference(text);
209
- if (!parsed.ok) {
210
- check.errors.push({ line: check.line, message: `${check.label}[${index}]: ${parsed.message}` });
211
- return;
212
- }
213
- if (parsed.expr.kind === "param") {
214
- check.errors.push({
215
- line: check.line,
216
- message: `${check.label}[${index}]: "${formatReference(parsed.expr)}" names a param, not a step output — ` +
217
- `params are already attached to every unit, so declaring one as an input is redundant. "inputs:" only ` +
218
- `names step outputs (steps.<id>.output...).`,
219
- });
220
- return;
221
- }
222
- if (!check.earlierStepIds.has(parsed.expr.stepId)) {
223
- const why = check.allStepIds.has(parsed.expr.stepId)
224
- ? `step "${parsed.expr.stepId}" does not come before this step — references must name an earlier step (a producer that has already run)`
225
- : `"${parsed.expr.stepId}" is not a step in this workflow`;
226
- check.errors.push({
227
- line: check.line,
228
- message: `${check.label}[${index}]: "${formatReference(parsed.expr)}" cannot be resolved — ${why}.`,
229
- });
230
- }
231
- }
232
- /**
233
- * Validate one `outputs.<name>.from` reference (P3b, spec §4.2, rows
234
- * B-06/B-07): it must parse, it must name a STEP output — never a param (an
235
- * output projects a step artifact; a param is already on the run row) — and
236
- * that step must be DECLARED somewhere in the document. Unlike
237
- * {@link checkInputReference}, the named step need not be EARLIER: an output
238
- * resolves at run completion, after every step has already run.
239
- */
240
- function checkOutputReference(name, text, check) {
241
- const parsed = parseReference(text);
242
- if (!parsed.ok) {
243
- check.errors.push({ line: check.line, message: `Output "${name}" from: ${parsed.message}` });
244
- return;
245
- }
246
- if (parsed.expr.kind === "param") {
247
- check.errors.push({
248
- line: check.line,
249
- message: `Output "${name}" from: "${formatReference(parsed.expr)}" names a param, not a step output — an output ` +
250
- `projects a STEP artifact, never a param. "outputs:" only names step outputs (steps.<id>.output...).`,
251
- });
252
- return;
253
- }
254
- if (!check.allStepIds.has(parsed.expr.stepId)) {
255
- check.errors.push({
256
- line: check.line,
257
- message: `Output "${name}" from: "${formatReference(parsed.expr)}" cannot be resolved — "${parsed.expr.stepId}" is ` +
258
- `not a step in this workflow.`,
259
- });
260
- }
261
- }
262
- // ── Non-fatal warnings ───────────────────────────────────────────────────────
263
- /**
264
- * Collect the document's non-fatal WARNINGS — advisories that never fail
265
- * compilation, never change the frozen plan or its hash, and are surfaced as
266
- * `workflow-warning` entries in `akm lint`'s separate `warnings` channel
267
- * (human + JSON output, via `core/adapter/adapters/akm-lint.ts#
268
- * workflowCompileWarnings`) and as `warn()` lines at `workflow run`.
269
- *
270
- * A. A `params.<name>` reference (in `map.over`/`route.input`) to an
271
- * UNDECLARED param, but ONLY when the document declares a `params:`
272
- * block — a likely typo. Prose can no longer carry param references at
273
- * all (it is never scanned), so this warning's surface shrinks to the
274
- * two whole-value fields that can legally contain one.
275
- * B. `gate.max_loops` above 1 on an `exec` step. The engine judges such a
276
- * step but never loops it (`exec/step-work.ts#effectiveGateMaxLoops`):
277
- * a frozen argv cannot read the judge's feedback, so a second loop would
278
- * only re-run the identical command — and its side effects. The declared
279
- * budget is not silently different from what runs; say so.
280
- */
281
- export function collectWorkflowWarnings(input) {
282
- const sourceIr = decodeWorkflowSourceIrV1(input);
283
- const warnings = [];
284
- const declaredParams = sourceIr.params ? new Set(Object.keys(sourceIr.params)) : undefined;
285
- for (const job of sourceIr.jobs) {
286
- for (const step of job.steps) {
287
- const maxLoops = step.gate?.maxLoops ?? 1;
288
- const execUnit = step.exec ?? step.run;
289
- if (maxLoops > 1 && execUnit && step.gate?.rubric?.trim()) {
290
- warnings.push({
291
- line: step.source.start,
292
- message: `Step "${step.id}" declares \`gate.max_loops: ${maxLoops}\` on an \`exec\` step — it runs its command ` +
293
- `ONCE. A gate loop re-executes the step so it can address the judge's feedback, and a frozen argv cannot ` +
294
- `read that feedback; looping would only repeat the command's side effects. The gate still evaluates and ` +
295
- `can still fail the step.`,
296
- });
297
- }
298
- if (declaredParams) {
299
- const declaredList = [...declaredParams].join(", ");
300
- const scan = (text, label) => {
301
- if (!text)
302
- return;
303
- const parsed = parseReference(text);
304
- if (!parsed.ok || parsed.expr.kind !== "param" || declaredParams.has(parsed.expr.name))
305
- return;
306
- warnings.push({
307
- line: step.source.start,
308
- message: `${label}: "${formatReference(parsed.expr)}" references a param not declared in \`params:\` ` +
309
- `(declared: ${declaredList || "none"}) — likely a typo. An undeclared param supplied at start still ` +
310
- `resolves at run time.`,
311
- });
312
- };
313
- if (step.map)
314
- scan(step.map.over, `Step "${step.id}" map.over`);
315
- if (step.route)
316
- scan(step.route.input, `Step "${step.id}" route.input`);
317
- }
318
- }
319
- }
320
- return warnings;
321
- }