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
@@ -13,8 +13,7 @@ import { defaultBundleForTarget } from "../../core/mutation-target.js";
13
13
  import { canonicalizeWorkflowName, WORKFLOW_EXTENSIONS } from "../../core/recognition-util.js";
14
14
  import { warn } from "../../core/warn.js";
15
15
  import { prepareWriteTargetForMutation, resolveWriteTarget, withWriteTargetMutation } from "../../core/write-source.js";
16
- import { compileWorkflowPlan } from "../ir/compile.js";
17
- import { compileWorkflowSource } from "../source-ir/compile.js";
16
+ import { checkWorkflowPlan, compileWorkflowSource } from "../compile.js";
18
17
  const DEFAULT_WORKFLOW_TEMPLATE = renderWorkflowTemplate("New Workflow");
19
18
  export function getWorkflowTemplate() {
20
19
  return DEFAULT_WORKFLOW_TEMPLATE;
@@ -37,7 +36,7 @@ function validateWorkflowContent(content, sourcePath) {
37
36
  if (!result.ok) {
38
37
  throw new UsageError(formatWorkflowErrors(sourcePath, result.errors));
39
38
  }
40
- const compiled = compileWorkflowPlan(result.ir, slugifyWorkflowStepId(sourcePath));
39
+ const compiled = checkWorkflowPlan(result.plan);
41
40
  if (!compiled.ok) {
42
41
  throw new UsageError(formatWorkflowErrors(sourcePath, compiled.errors));
43
42
  }
@@ -98,7 +97,7 @@ export function createWorkflowAsset(input) {
98
97
  const mode = fs.existsSync(assetPath) ? fs.lstatSync(assetPath).mode & 0o777 : 0o644;
99
98
  const defaultBundle = defaultBundleForTarget(config);
100
99
  const ref = makeBundleRef(target.source.name === defaultBundle ? undefined : target.source.name, conceptId);
101
- withWriteTargetMutation(target, [assetPath], { ignored: "reject", purpose: "workflow-authoring", message: `Create ${ref}` }, () => {
100
+ withWriteTargetMutation(target, [assetPath], { purpose: "workflow-authoring", message: `Create ${ref}` }, () => {
102
101
  fs.mkdirSync(path.dirname(assetPath), { recursive: true });
103
102
  writeFileAtomic(assetPath, authoredContent.endsWith("\n") ? authoredContent : `${authoredContent}\n`, mode);
104
103
  });
@@ -154,14 +153,6 @@ function humanizeWorkflowName(name) {
154
153
  .replace(/\b\w/g, (match) => match.toUpperCase())
155
154
  .trim() || "New Workflow");
156
155
  }
157
- function slugifyWorkflowStepId(name) {
158
- return (name
159
- .split("/")
160
- .pop()
161
- ?.toLowerCase()
162
- .replace(/[^a-z0-9]+/g, "-")
163
- .replace(/^-+|-+$/g, "") || "workflow");
164
- }
165
156
  export function formatWorkflowErrors(path, errors) {
166
157
  const lines = errors.map((e) => ` ${path}:${e.line} — ${e.message}`);
167
158
  const heading = errors.length === 1 ? "Workflow has 1 error:" : `Workflow has ${errors.length} errors:`;
@@ -0,0 +1,211 @@
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
+ * The workflow compiler's front door. `.md` goes through the Markdown grammar
6
+ * (`parser.ts`), `.yml` through the GitHub-shaped YAML grammar
7
+ * (`github-yaml.ts`); both produce a {@link WorkflowPlan} directly.
8
+ *
9
+ * {@link checkWorkflowPlan} is the one cross-step pass the grammars do not
10
+ * run: every `steps.<id>` reference must name an earlier step (outputs may
11
+ * name any step), `inputs:` never name a param, and two non-fatal advisories.
12
+ */
13
+ import path from "node:path";
14
+ import { parseBuiltinCommandAction } from "../commands/command/builtin-action.js";
15
+ import { PORTABLE_ARGUMENTS_PLACEHOLDER } from "../commands/command/portable-template.js";
16
+ import { parseGithubWorkflowSource, WorkflowSourceFailure } from "./github-yaml.js";
17
+ import { parseWorkflow } from "./parser.js";
18
+ import { formatReference, parseReference } from "./program/expressions.js";
19
+ import { canonicalizeWorkflowWorkingDirectory, WorkflowSourceSemanticError } from "./source-semantics.js";
20
+ export { looksLikeGithubWorkflowSource } from "./github-yaml.js";
21
+ /** Compile by authoritative source extension. */
22
+ export function compileWorkflowSource(source, options) {
23
+ const extension = path.extname(options.path).toLowerCase();
24
+ const title = options.title ?? path.basename(options.path, path.extname(options.path));
25
+ if (extension === ".yml") {
26
+ try {
27
+ return { ok: true, plan: parseGithubWorkflowSource(source, { ...options, title }) };
28
+ }
29
+ catch (cause) {
30
+ if (cause instanceof WorkflowSourceFailure)
31
+ return { ok: false, errors: [cause.error] };
32
+ const message = cause instanceof Error ? cause.message : String(cause);
33
+ return { ok: false, errors: [{ code: "invalid-workflow-source", message, path: options.path, line: 1 }] };
34
+ }
35
+ }
36
+ if (extension !== ".md") {
37
+ return {
38
+ ok: false,
39
+ errors: [
40
+ {
41
+ code: "unsupported-workflow-extension",
42
+ message: `Workflow source ${options.path} must use .md or .yml.`,
43
+ path: options.path,
44
+ line: 1,
45
+ },
46
+ ],
47
+ };
48
+ }
49
+ const parsed = parseWorkflow(source, {
50
+ path: options.path,
51
+ title,
52
+ validateExecCwd: (value) => {
53
+ try {
54
+ return { ok: true, value: canonicalizeWorkflowWorkingDirectory(value, options.workspaceRoot) };
55
+ }
56
+ catch (cause) {
57
+ if (cause instanceof WorkflowSourceSemanticError)
58
+ return { ok: false, code: cause.code, message: cause.message };
59
+ return { ok: false, code: "working-directory-unverifiable", message: "cwd cannot be physically verified." };
60
+ }
61
+ },
62
+ });
63
+ if (parsed.ok)
64
+ return parsed;
65
+ return {
66
+ ok: false,
67
+ errors: parsed.errors.map((error) => ({
68
+ code: error.code ?? "invalid-markdown-workflow",
69
+ message: error.message,
70
+ path: options.path,
71
+ line: error.line,
72
+ })),
73
+ };
74
+ }
75
+ /**
76
+ * The display text a step contributes to `show`, search hints, and the run
77
+ * spine: its authored prose, else what its target does. Empty for a route
78
+ * step with no section.
79
+ */
80
+ export function workflowStepInstructions(step) {
81
+ const spec = step.spec;
82
+ if (!spec)
83
+ return "";
84
+ if (spec.instructions !== undefined)
85
+ return spec.instructions;
86
+ if (spec.uses === "akm/command") {
87
+ const action = parseBuiltinCommandAction(spec.with);
88
+ if (action.kind === "stored") {
89
+ return `Invoke stored command ${action.ref}${action.arguments === undefined ? "" : " with arguments"}.`;
90
+ }
91
+ if (spec.commandMode === "literal")
92
+ return action.content;
93
+ return action.content.split(PORTABLE_ARGUMENTS_PLACEHOLDER).join(action.arguments ?? "");
94
+ }
95
+ if (spec.uses !== undefined)
96
+ return `Invoke local target ${spec.uses}.`;
97
+ return "";
98
+ }
99
+ /** A route step's deterministic one-line description of its branch table. */
100
+ export function routeDescription(route) {
101
+ const branches = Object.entries(route.when).map(([match, stepId]) => `"${match}" -> ${stepId}`);
102
+ if (route.defaultStepId !== undefined)
103
+ branches.push(`default -> ${route.defaultStepId}`);
104
+ return `Route on ${route.input}: ${branches.join(", ")}.`;
105
+ }
106
+ /** Cross-step reference validation plus the non-fatal advisories. Pure. */
107
+ export function checkWorkflowPlan(plan) {
108
+ const errors = [];
109
+ const allStepIds = new Set(plan.steps.map((step) => step.stepId));
110
+ const earlierStepIds = new Set();
111
+ const check = (text, line, label, paramsAllowed) => {
112
+ const parsed = parseReference(text);
113
+ if (!parsed.ok) {
114
+ errors.push({ line, message: `${label}: ${parsed.message}` });
115
+ return;
116
+ }
117
+ if (parsed.expr.kind === "param") {
118
+ if (paramsAllowed)
119
+ return;
120
+ errors.push({
121
+ line,
122
+ message: `${label}: "${formatReference(parsed.expr)}" names a param, not a step output — params are already ` +
123
+ `attached to every unit, so declaring one as an input is redundant. "inputs:" only names step outputs ` +
124
+ `(steps.<id>.output...).`,
125
+ });
126
+ return;
127
+ }
128
+ if (earlierStepIds.has(parsed.expr.stepId))
129
+ return;
130
+ const why = allStepIds.has(parsed.expr.stepId)
131
+ ? `step "${parsed.expr.stepId}" does not come before this step — references must name an earlier step (a producer that has already run)`
132
+ : `"${parsed.expr.stepId}" is not a step in this workflow`;
133
+ errors.push({ line, message: `${label}: "${formatReference(parsed.expr)}" cannot be resolved — ${why}.` });
134
+ };
135
+ for (const step of plan.steps) {
136
+ const line = step.spec?.source.start ?? 1;
137
+ if (step.spec?.map)
138
+ check(step.spec.map.over, line, `Step "${step.stepId}" map.over`, true);
139
+ if (step.route)
140
+ check(step.route.input, line, `Step "${step.stepId}" route.input`, true);
141
+ for (const [index, reference] of (step.spec?.inputs ?? []).entries()) {
142
+ check(reference, line, `Step "${step.stepId}" inputs[${index}]`, false);
143
+ }
144
+ earlierStepIds.add(step.stepId);
145
+ }
146
+ // Outputs resolve at run completion, so they may name any declared step.
147
+ for (const [name, declaration] of Object.entries(plan.outputs ?? {})) {
148
+ const parsed = parseReference(declaration.from);
149
+ const label = `Output "${name}" from`;
150
+ if (!parsed.ok)
151
+ errors.push({ line: 1, message: `${label}: ${parsed.message}` });
152
+ else if (parsed.expr.kind === "param") {
153
+ errors.push({
154
+ line: 1,
155
+ message: `${label}: "${formatReference(parsed.expr)}" names a param, not a step output — an output projects a ` +
156
+ `STEP artifact, never a param. "outputs:" only names step outputs (steps.<id>.output...).`,
157
+ });
158
+ }
159
+ else if (!allStepIds.has(parsed.expr.stepId)) {
160
+ errors.push({
161
+ line: 1,
162
+ message: `${label}: "${formatReference(parsed.expr)}" cannot be resolved — "${parsed.expr.stepId}" is not a step in this workflow.`,
163
+ });
164
+ }
165
+ }
166
+ if (errors.length > 0)
167
+ return { ok: false, errors };
168
+ return { ok: true, warnings: workflowWarnings(plan) };
169
+ }
170
+ /**
171
+ * Advisories that never fail compilation or change the plan:
172
+ * A. a `params.<name>` reference (in `map.over`/`route.input`) to a param the
173
+ * document's `params:` block does not declare — a likely typo;
174
+ * B. `gate.max_loops` above 1 on an exec step, which is judged but never
175
+ * looped (a frozen argv cannot read the judge's feedback).
176
+ */
177
+ function workflowWarnings(plan) {
178
+ const warnings = [];
179
+ const declared = plan.paramSchemas ? new Set(Object.keys(plan.paramSchemas)) : undefined;
180
+ for (const step of plan.steps) {
181
+ const line = step.spec?.source.start ?? 1;
182
+ const maxLoops = step.gate.maxLoops;
183
+ if (maxLoops > 1 && step.spec?.exec && step.gate.criteria.length > 0) {
184
+ warnings.push({
185
+ line,
186
+ message: `Step "${step.stepId}" declares \`gate.max_loops: ${maxLoops}\` on an \`exec\` step — it runs its command ` +
187
+ `ONCE. A gate loop re-executes the step so it can address the judge's feedback, and a frozen argv cannot ` +
188
+ `read that feedback; looping would only repeat the command's side effects. The gate still evaluates and ` +
189
+ `can still fail the step.`,
190
+ });
191
+ }
192
+ if (!declared)
193
+ continue;
194
+ const scan = (text, label) => {
195
+ if (!text)
196
+ return;
197
+ const parsed = parseReference(text);
198
+ if (!parsed.ok || parsed.expr.kind !== "param" || declared.has(parsed.expr.name))
199
+ return;
200
+ warnings.push({
201
+ line,
202
+ message: `${label}: "${formatReference(parsed.expr)}" references a param not declared in \`params:\` ` +
203
+ `(declared: ${[...declared].join(", ") || "none"}) — likely a typo. An undeclared param supplied at start ` +
204
+ `still resolves at run time.`,
205
+ });
206
+ };
207
+ scan(step.spec?.map?.over, `Step "${step.stepId}" map.over`);
208
+ scan(step.route?.input, `Step "${step.stepId}" route.input`);
209
+ }
210
+ return warnings;
211
+ }
@@ -4,13 +4,7 @@
4
4
  import os from "node:os";
5
5
  import { isLoopbackEndpoint } from "../core/loopback.js";
6
6
  import { WORKFLOW_MAX_CONCURRENCY } from "./resource-limits.js";
7
- /**
8
- * Run-level ceiling on `workflow.maxConcurrency`. It is deliberately the SAME
9
- * value the frozen-plan decoder enforces on `execution.maxConcurrency` and on
10
- * per-step `map.concurrency` — a clamp above the decoder's bound would freeze
11
- * plans the decoder then rejects — so it reads the single shared constant
12
- * (`./resource-limits`) rather than repeating the literal.
13
- */
7
+ /** Run-level ceiling on `workflow.maxConcurrency` (the same bound as `map.concurrency`). */
14
8
  export const WORKFLOW_MAX_CONCURRENCY_CEILING = WORKFLOW_MAX_CONCURRENCY;
15
9
  export function cpuDerivedUnitConcurrency(cpuCount = os.cpus()?.length ?? 4) {
16
10
  return Math.min(16, Math.max(1, cpuCount - 2));
@@ -24,84 +18,29 @@ export function workflowMaxConcurrency(configured, cpuCount = os.cpus()?.length
24
18
  }
25
19
  // ── Fan-out defaults ─────────────────────────────────────────────────────────
26
20
  //
27
- // Four independent limits clamp a `map` step's real width, and the effective
28
- // value is their minimum:
29
- //
30
- // 1. the step's own `map.concurrency` (this file's default below)
31
- // 2. the run's frozen `execution.maxConcurrency` ({@link workflowMaxConcurrency})
32
- // 3. the selected LLM engine's frozen concurrency ({@link defaultLlmEngineConcurrency})
33
- // 4. the CURRENT host's CPU safety cap ({@link cpuDerivedUnitConcurrency})
34
- //
35
- // (1) and (3) both defaulted to 1 before 0.9.1, which made every fan-out serial
36
- // unless the author opted in at BOTH layers — so (2) and (4), the limits that
37
- // actually encode machine capacity, never bound anything. The defaults below
38
- // replace those two 1s. They are deliberately modest rather than "as wide as
39
- // the host allows": a `map` is independent by construction, but its units call
40
- // out to rate-limited providers and RAM-hungry agent processes, so the value
41
- // that a plan freezes should be one a laptop and a CI box can both survive.
21
+ // A `map` step's real width is the minimum of its own `map.concurrency`, the
22
+ // run's frozen `execution.maxConcurrency`, the LLM engine's frozen
23
+ // concurrency, and the host CPU cap. The defaults are modest: map units call
24
+ // rate-limited providers and RAM-hungry agents.
42
25
  /**
43
- * Default width of a `map` step that declares no `concurrency:` (0.9.1+).
44
- *
45
- * 4 is chosen over the host cap on purpose. It is a real, predictable speedup
46
- * (4× on any fan-out longer than four items) while staying below
47
- * {@link cpuDerivedUnitConcurrency} on every machine with ≥6 cores, so the
48
- * frozen number — not the host — is what an author reasons about, and a plan
49
- * frozen on a 32-core CI box behaves the same when it resumes on a laptop.
50
- *
51
- * Overridable in both directions:
52
- * - per step: `map.concurrency: <n>` (an explicit `1` still means serial),
53
- * - per install: `workflow.defaultMapConcurrency` — set it to `1` to restore
54
- * the pre-0.9.1 serial default for every workflow at once.
26
+ * Default width of a `map` step with no `concurrency:` — a predictable number
27
+ * rather than the host cap, so a plan behaves the same wherever it resumes.
28
+ * Overridden per step (`map.concurrency`) or per install
29
+ * (`workflow.defaultMapConcurrency`; `1` restores serial fan-out).
55
30
  */
56
31
  export const DEFAULT_MAP_CONCURRENCY = 4;
57
- /**
58
- * Default `engines.<name>.concurrency` for an LLM engine on a LOOPBACK
59
- * endpoint. Stays at 1, matching `getDefaultLlmConcurrency`
60
- * (`src/indexer/indexer.ts`) and AGENTS.md's "lowest common denominator — a
61
- * slow local model on a single-threaded server" rule. A local model server
62
- * (LM Studio, Ollama) holds ONE loaded model; parallel inference triggers
63
- * reload thrash and HTTP 500s, which is a hard failure, not a slow one.
64
- */
32
+ /** Default concurrency for an LLM engine on a loopback endpoint: a local model server runs one inference. */
65
33
  export const DEFAULT_LOCAL_LLM_ENGINE_CONCURRENCY = 1;
66
- /**
67
- * Default `engines.<name>.concurrency` for an LLM engine on a REMOTE endpoint.
68
- *
69
- * Deliberately equal to {@link DEFAULT_MAP_CONCURRENCY} so this limit does not
70
- * silently re-serialize a fan-out the author already asked for: the step's own
71
- * `concurrency:` stays the number that decides. Indexing's remote default is a
72
- * lower 2 because indexing fans out implicitly over the whole stash; a
73
- * workflow `map` is an explicit, bounded, author-declared fan-out, and four
74
- * concurrent completions sit far inside any hosted provider's entry tier.
75
- * Rate-limited installs set `engines.<name>.concurrency` to pin their own.
76
- */
34
+ /** Default concurrency for a remote LLM engine: equal to {@link DEFAULT_MAP_CONCURRENCY}, so it never re-serializes a map. */
77
35
  export const DEFAULT_REMOTE_LLM_ENGINE_CONCURRENCY = 4;
78
- // ── Loopback classification ──────────────────────────────────────────────────
79
- //
80
- // Everything above turns on ONE question: does this endpoint name a model
81
- // server running on THIS machine? The classifier lives in `core/loopback.ts`
82
- // (shared with the indexer's LLM pool default); the re-export keeps this
83
- // module the policy surface workflow callers and the boundary-case table in
84
- // `tests/workflows/concurrency-defaults.test.ts` import from. The check is
85
- // purely syntactic — no DNS, no interface list — so freeze produces the same
86
- // plan on a laptop, on CI, and on a machine with no network.
87
36
  export { isLoopbackEndpoint, isLoopbackHost } from "../core/loopback.js";
88
- /**
89
- * Concurrency to freeze for an LLM engine. An explicit
90
- * `engines.<name>.concurrency` always wins (clamped into the decoder's
91
- * `[1, 64]` range so a fat-fingered config cannot freeze an unloadable plan);
92
- * otherwise the endpoint decides.
93
- */
37
+ /** Concurrency to freeze for an LLM engine: an explicit `engines.<name>.concurrency` (clamped), else by endpoint. */
94
38
  export function defaultLlmEngineConcurrency(endpoint, configured) {
95
39
  if (typeof configured === "number" && Number.isFinite(configured))
96
40
  return clampMaxConcurrency(configured);
97
41
  return isLoopbackEndpoint(endpoint) ? DEFAULT_LOCAL_LLM_ENGINE_CONCURRENCY : DEFAULT_REMOTE_LLM_ENGINE_CONCURRENCY;
98
42
  }
99
- /**
100
- * Width to freeze for a `map` step that declared no `concurrency:`. `configured`
101
- * is `workflow.defaultMapConcurrency`; unset means {@link DEFAULT_MAP_CONCURRENCY}.
102
- * An explicit `map.concurrency` never reaches this function — the caller keeps
103
- * "author wrote 1" distinguishable from "author wrote nothing".
104
- */
43
+ /** Width to freeze for a `map` step with no `concurrency:` (`configured` is `workflow.defaultMapConcurrency`). */
105
44
  export function defaultMapConcurrency(configured) {
106
45
  return configured === undefined || !Number.isFinite(configured)
107
46
  ? DEFAULT_MAP_CONCURRENCY
@@ -2,26 +2,12 @@
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  /**
5
- * A child workflow run's idempotency key (spec
6
- * docs/plans/specs/p3a-plan-v5-child-freeze.md §3.4, rows A-17…A-19). Pure:
7
- * no IO, no config, no clock, no randomness — imports exactly node:crypto
8
- * and canonicalJson.
9
- *
10
- * P3a has no production caller: P3b's child executor derives this key from
11
- * the parent unit's `hashVersion` 7 input hash and passes it to
12
- * `publishChildWorkflowRun` (src/storage/repositories/workflow-runs-repository.ts,
13
- * Lane C) as the `(parent_run_id, invocation_key)` idempotency pair.
5
+ * A child workflow run's idempotency key, derived from the parent unit's input
6
+ * hash: `publishChildWorkflowRun` is idempotent on `(parent_run_id, invocation_key)`.
14
7
  */
15
8
  import { createHash } from "node:crypto";
16
9
  import { canonicalJson } from "../ir/plan-hash.js";
17
- /**
18
- * `sha256hex("akm.workflow.child-invocation\0v1\0" + canonicalJson({parentRunId, parentUnitId, unitInputHash}))`.
19
- *
20
- * The `\0v1\0` here is this helper's OWN vocabulary version, deliberately
21
- * independent of `hashVersion`: `unitInputHash` enters this preimage as an
22
- * opaque value, so this key's preimage does not change when the unit-hash
23
- * vocabulary itself bumps.
24
- */
10
+ /** `sha256hex("akm.workflow.child-invocation\0v1\0" + canonicalJson({parentRunId, parentUnitId, unitInputHash}))`. */
25
11
  export function computeChildInvocationKey(input) {
26
12
  return createHash("sha256")
27
13
  .update("akm.workflow.child-invocation\0v1\0")