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,7 +1,6 @@
1
1
  // This Source Code Form is subject to the terms of the Mozilla Public
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
- import { randomBytes } from "node:crypto";
5
4
  import fs from "node:fs";
6
5
  import path from "node:path";
7
6
  import { fileURLToPath } from "node:url";
@@ -12,14 +11,9 @@ import { getConfigDir } from "../../core/paths.js";
12
11
  import { warnOnce } from "../../core/warn.js";
13
12
  import { cloneExecutionJsonObject } from "../../execution/json.js";
14
13
  /**
15
- * Installed and operator-owned model intent aliases (#802 / WP2).
16
- *
17
- * The common cascade consumes this loader/expansion API for current runtime
18
- * execution callers. A recognized alias expands once into exact model and
19
- * inference defaults at its selecting layer; engine lowerers consume that
20
- * resolved request and never reinterpret the alias. The independent API also
21
- * remains usable by WP6/WP7 source and freeze adapters without hard-coding
22
- * provider mappings.
14
+ * Installed and operator-owned model intent aliases (#802). `resolveExecution`
15
+ * expands a recognized alias once, into an exact model and inference defaults
16
+ * at the layer that chose it; harness builders never reinterpret it.
23
17
  */
24
18
  export const MODEL_MAP_VERSION = 1;
25
19
  let standaloneInstalledModelMapText;
@@ -221,9 +215,8 @@ function mergeProfiles(base, overlay) {
221
215
  }
222
216
  /**
223
217
  * Derive the `{ model, inference }` a model-map profile borrows from a
224
- * configured engine (#946). Shared verbatim by
225
- * `execution-definitions.ts`'s own execution-defaults derivation
226
- * (`engineDefaults`) so the two paths cannot silently diverge. `model` is
218
+ * configured engine (#946). `resolveExecution` derives an engine's own
219
+ * defaults with the same function, so the two cannot diverge. `model` is
227
220
  * copied verbatim from the engine's own config value; it must already be
228
221
  * meaningful for the model-map column's platform (akm does not translate
229
222
  * between an engine's connection and an agent platform's own provider
@@ -374,51 +367,29 @@ function modelMapFileError(label, filePath, action) {
374
367
  return new ConfigError(`${label} could not be ${action}: ${filePath}.`, "INVALID_CONFIG_FILE", `Ensure ${filePath} is a readable regular file owned by the expected user.`);
375
368
  }
376
369
  /**
377
- * Read through a nonblocking, no-follow descriptor and enforce the config-size
378
- * ceiling before parsing. `optional` recognizes only a true lstat ENOENT as
379
- * absence; dangling links and every non-regular type are configuration errors.
370
+ * Read one models.json. `optional` treats absence (including a dangling
371
+ * symlink) as "no file"; anything that is not a regular file is refused
372
+ * rather than read, so a FIFO cannot hang the CLI.
380
373
  */
381
374
  function readModelMapFile(filePath, label, optional) {
382
- let targetStat;
375
+ let stat;
383
376
  try {
384
- targetStat = fs.statSync(filePath);
377
+ stat = fs.statSync(filePath);
385
378
  }
386
379
  catch (error) {
387
380
  if (optional && error?.code === "ENOENT")
388
381
  return undefined;
389
382
  throw modelMapFileError(label, filePath, optional ? "inspected" : "found");
390
383
  }
391
- if (!targetStat.isFile()) {
384
+ if (!stat.isFile()) {
392
385
  throw new ConfigError(`Unable to read ${label.toLowerCase()} because it is not a readable regular file: ${filePath}.`, "INVALID_CONFIG_FILE", "Replace it with a readable regular models.json file, or a symlink to one.");
393
386
  }
394
- const nonblock = process.platform !== "win32" && typeof fs.constants.O_NONBLOCK === "number" ? fs.constants.O_NONBLOCK : 0;
395
- let fd;
396
387
  try {
397
- fd = fs.openSync(filePath, fs.constants.O_RDONLY | nonblock);
398
- const openedStat = fs.fstatSync(fd);
399
- if (!sameFileIdentity(targetStat, openedStat)) {
400
- throw new ConfigError(`${label} changed while it was being opened: ${filePath}.`, "INVALID_CONFIG_FILE", "Retry after ensuring no other process is replacing models.json.");
401
- }
402
- const text = fs.readFileSync(fd, "utf8");
403
- fs.closeSync(fd);
404
- fd = undefined;
405
- return text;
388
+ return fs.readFileSync(filePath, "utf8");
406
389
  }
407
- catch (error) {
408
- if (error instanceof ConfigError)
409
- throw error;
390
+ catch {
410
391
  throw modelMapFileError(label, filePath, "read");
411
392
  }
412
- finally {
413
- if (fd !== undefined) {
414
- try {
415
- fs.closeSync(fd);
416
- }
417
- catch {
418
- // The actionable read error above remains authoritative.
419
- }
420
- }
421
- }
422
393
  }
423
394
  /** Resolve the one authoritative external-asset location for this runtime. */
424
395
  export function installedModelMapPaths(moduleUrl = import.meta.url) {
@@ -465,139 +436,40 @@ export function loadModelMap(options = {}) {
465
436
  return Object.freeze({ map: mergeModelMapLayers(installed, user, options.engines), userPath, userStatus });
466
437
  }
467
438
  function targetExistsError(target, detail) {
468
- return new UsageError(`${detail}: ${target}`, "RESOURCE_ALREADY_EXISTS", "Move the existing target aside, then retry. Use --overwrite only for a stable regular file you intend to replace.");
469
- }
470
- function copyIoError(target, action, hint) {
471
- return new ConfigError(`Unable to ${action} user models.json at ${target}.`, "INVALID_CONFIG_FILE", hint ?? "Check the configuration directory ownership and permissions, then retry.");
472
- }
473
- function inspectCopyTarget(target) {
474
- try {
475
- return fs.lstatSync(target);
476
- }
477
- catch (error) {
478
- if (error?.code === "ENOENT")
479
- return undefined;
480
- throw copyIoError(target, "inspect");
481
- }
439
+ return new UsageError(`${detail}: ${target}`, "RESOURCE_ALREADY_EXISTS", "Move the existing target aside, then retry. Use --overwrite only for a regular file you intend to replace.");
482
440
  }
483
- function sameFileIdentity(left, right) {
484
- if (!left.isFile() || !right.isFile())
485
- return false;
486
- if (left.dev !== 0 || left.ino !== 0 || right.dev !== 0 || right.ino !== 0) {
487
- return left.dev === right.dev && left.ino === right.ino;
488
- }
489
- return left.mode === right.mode && left.size === right.size && left.mtimeMs === right.mtimeMs;
490
- }
491
- function syncCopyDirectory(directory) {
492
- if (process.platform === "win32")
493
- return;
494
- let fd;
495
- try {
496
- fd = fs.openSync(directory, fs.constants.O_RDONLY);
497
- fs.fsyncSync(fd);
498
- fs.closeSync(fd);
499
- fd = undefined;
500
- }
501
- catch (error) {
502
- const code = error?.code;
503
- if (code !== "EINVAL" && code !== "ENOTSUP")
504
- throw error;
505
- }
506
- finally {
507
- if (fd !== undefined) {
508
- try {
509
- fs.closeSync(fd);
510
- }
511
- catch {
512
- // A preceding sync/open failure is more useful than a cleanup failure.
513
- }
514
- }
515
- }
516
- }
517
- function stageDefaultModelMap(target, text) {
518
- const stage = `${target}.copy.${process.pid}.${randomBytes(8).toString("hex")}`;
519
- try {
520
- writeFileAtomic(stage, text, 0o600);
521
- return stage;
522
- }
523
- catch {
524
- throw copyIoError(target, "write a staged copy of");
525
- }
441
+ function copyIoError(target, action) {
442
+ return new ConfigError(`Unable to ${action} user models.json at ${target}.`, "INVALID_CONFIG_FILE", "Check the configuration directory ownership and permissions, then retry.");
526
443
  }
527
- /** Explicitly copy validated installed bytes into the normal config directory. */
444
+ /** `akm models copy-defaults`: copy the validated installed map into the config directory. */
528
445
  export function copyDefaultModelMap(options = {}) {
529
446
  const text = readInstalledModelMapText(options);
530
447
  mergeModelMapLayers(parseModelMapLayer(text, "installed models.json"));
531
448
  const target = userModelMapPath(options.env);
449
+ let existing;
532
450
  try {
533
- fs.mkdirSync(path.dirname(target), { recursive: true, mode: 0o700 });
451
+ existing = fs.lstatSync(target);
534
452
  }
535
- catch {
536
- throw copyIoError(target, "create the configuration directory for");
453
+ catch (error) {
454
+ if (error?.code !== "ENOENT")
455
+ throw copyIoError(target, "inspect");
537
456
  }
538
- const existing = inspectCopyTarget(target);
539
457
  if (existing && !existing.isFile()) {
540
458
  throw targetExistsError(target, "Refusing to replace a non-regular models.json target");
541
459
  }
542
- if (existing && options.overwrite !== true) {
460
+ if (existing && options.overwrite !== true)
543
461
  throw targetExistsError(target, "User models.json already exists");
544
- }
545
- const stage = stageDefaultModelMap(target, text);
546
- let stagePresent = true;
547
462
  try {
548
- if (existing === undefined) {
549
- try {
550
- // Hard-link publication is an atomic no-replace operation: EEXIST
551
- // means a racing creator won, and their bytes remain untouched.
552
- fs.linkSync(stage, target);
553
- }
554
- catch (error) {
555
- if (error?.code === "EEXIST") {
556
- throw targetExistsError(target, "User models.json was created while defaults were being prepared");
557
- }
558
- throw copyIoError(target, "publish");
559
- }
560
- try {
561
- fs.unlinkSync(stage);
562
- stagePresent = false;
563
- }
564
- catch {
565
- // The target was already published atomically. Cleanup is best-effort
566
- // from this point forward; `finally` retries without turning a
567
- // successful copy into a false failure.
568
- }
569
- }
570
- else {
571
- const current = inspectCopyTarget(target);
572
- if (!current || !sameFileIdentity(existing, current)) {
573
- throw targetExistsError(target, "User models.json changed while defaults were being prepared");
574
- }
575
- try {
576
- // rename replaces the directory entry itself; it never follows a
577
- // symlink inserted after the final identity check.
578
- fs.renameSync(stage, target);
579
- stagePresent = false;
580
- }
581
- catch {
582
- throw copyIoError(target, "replace");
583
- }
584
- }
463
+ fs.mkdirSync(path.dirname(target), { recursive: true, mode: 0o700 });
585
464
  }
586
- finally {
587
- if (stagePresent) {
588
- try {
589
- fs.unlinkSync(stage);
590
- }
591
- catch {
592
- // Best-effort cleanup; the target was never published from this path.
593
- }
594
- }
465
+ catch {
466
+ throw copyIoError(target, "create the configuration directory for");
595
467
  }
596
468
  try {
597
- syncCopyDirectory(path.dirname(target));
469
+ writeFileAtomic(target, text, 0o600);
598
470
  }
599
471
  catch {
600
- throw copyIoError(target, "durably publish", `The target may already exist at ${target}; inspect it before retrying because directory durability could not be confirmed.`);
472
+ throw copyIoError(target, "write");
601
473
  }
602
474
  return { path: target, copied: true, overwritten: existing !== undefined };
603
475
  }
@@ -4,184 +4,109 @@
4
4
  import { ConfigError } from "../../core/errors.js";
5
5
  import { composeConversationFallbackPrompt } from "./conversation-fallback.js";
6
6
  import { composePersonaFallbackPrompt } from "./persona-fallback.js";
7
- function own(value, key) {
8
- return Object.hasOwn(value, key);
9
- }
10
- function hasToolSelection(value) {
11
- if (value === null)
7
+ /** A tool selection that actually names tools (not omitted, null, or empty). */
8
+ export function hasToolSelection(value) {
9
+ if (value === null || value === undefined)
12
10
  return false;
13
- if (typeof value === "string")
14
- return value.length > 0;
15
- if (Array.isArray(value))
11
+ if (typeof value === "string" || Array.isArray(value))
16
12
  return value.length > 0;
17
13
  return Object.keys(value).length > 0;
18
14
  }
19
15
  function translatesTools(mode, value) {
20
- if (!hasToolSelection(value))
21
- return true;
22
16
  if (mode === "all")
23
17
  return true;
24
- if (mode === "flat")
25
- return typeof value === "string" || Array.isArray(value);
26
- if (mode === "sdk") {
27
- return (typeof value === "string" ||
28
- Array.isArray(value) ||
29
- (value !== null && Object.values(value).every((entry) => typeof entry === "boolean")));
30
- }
31
- return false;
18
+ if (typeof value === "string" || Array.isArray(value))
19
+ return mode === "flat" || mode === "sdk";
20
+ return mode === "sdk" && value !== null && Object.values(value).every((entry) => typeof entry === "boolean");
32
21
  }
33
- function notice(adapter, field) {
34
- return Object.freeze({
22
+ /** The notice for a request field a transport does not carry; dispatch continues. */
23
+ export function untranslated(adapter, field) {
24
+ return {
35
25
  code: "untranslated-field",
36
26
  severity: "warning",
37
27
  adapter,
38
28
  field,
39
29
  message: `The ${adapter} lowerer does not translate resolved field ${field}; dispatch will continue optimistically.`,
40
- });
41
- }
42
- function conversationFallbackNotice(adapter) {
43
- return Object.freeze({
44
- code: "conversation-prompt-composed",
45
- severity: "warning",
46
- adapter,
47
- field: "conversation",
48
- message: `The ${adapter} transport has no native multi-message channel; AKM composed the conversation prefix into one deterministic JSON prompt block.`,
49
- });
50
- }
51
- function selectedExtensionPaths(request) {
52
- const out = [];
53
- if (own(request, "extensions"))
54
- out.push("extensions");
55
- if (own(request.command, "extensions"))
56
- out.push("command.extensions");
57
- const persona = own(request, "persona") ? request.persona : undefined;
58
- if (persona && own(persona, "extensions"))
59
- out.push("persona.extensions");
60
- if (own(request.engine, "extensions"))
61
- out.push("engine.extensions");
62
- if (own(request.runtime, "extensions"))
63
- out.push("runtime.extensions");
64
- return out;
30
+ };
65
31
  }
66
- function sortedUnique(values) {
67
- return Object.freeze([...new Set(values)].sort());
32
+ /** Request fields carrying adapter-owned extensions, which no transport translates. */
33
+ export function extensionFields(request) {
34
+ return [
35
+ ...(request.extensions ? ["extensions"] : []),
36
+ ...(request.command.extensions ? ["command.extensions"] : []),
37
+ ...(request.persona?.extensions ? ["persona.extensions"] : []),
38
+ ...(request.engine.extensions ? ["engine.extensions"] : []),
39
+ ...(request.runtime.extensions ? ["runtime.extensions"] : []),
40
+ ];
68
41
  }
69
42
  /**
70
- * Build one harness-owned structural lowerer. Each harness registers the
71
- * function it gets back beside its argv builder; no global model/provider
72
- * capability table participates in dispatch.
43
+ * Build one harness's request builder: map a resolved request onto the
44
+ * harness-neutral {@link AgentDispatchRequest} its argv builder consumes,
45
+ * composing into the prompt what the harness has no channel for.
73
46
  */
74
47
  export function createAgentRequestLowerer(options) {
75
48
  const supportedInference = new Set(options.inference ?? []);
76
49
  return (_profile, request) => {
77
- const translated = new Set(["command.content", "engine"]);
78
- for (const field of ["timeoutMs", "workspace", "environment"]) {
79
- if (own(request.runtime, field))
80
- translated.add(`runtime.${field}`);
81
- }
82
- const untranslated = new Set();
83
50
  const notices = [];
84
- const reject = (field) => {
85
- untranslated.add(field);
86
- notices.push(notice(options.adapter, field));
51
+ const skip = (field) => {
52
+ notices.push(untranslated(options.adapter, field));
87
53
  };
88
54
  let prompt = request.command.content;
89
- if (own(request, "conversation")) {
90
- translated.add("conversation");
91
- if (request.conversation && request.conversation.length > 0) {
92
- prompt = composeConversationFallbackPrompt(request.conversation, prompt);
93
- notices.push(conversationFallbackNotice(options.adapter));
94
- }
55
+ if (request.conversation && request.conversation.length > 0) {
56
+ prompt = composeConversationFallbackPrompt(request.conversation, prompt);
57
+ notices.push({
58
+ code: "conversation-prompt-composed",
59
+ severity: "warning",
60
+ adapter: options.adapter,
61
+ field: "conversation",
62
+ message: `The ${options.adapter} transport has no native multi-message channel; AKM composed the conversation prefix into one deterministic JSON prompt block.`,
63
+ });
95
64
  }
96
- let systemPrompt;
97
- const persona = own(request, "persona") ? request.persona : undefined;
98
- const agent = own(request, "agent") ? request.agent : undefined;
99
- let nativeAgent;
100
- if (persona) {
101
- if (options.personaChannel === "native") {
102
- systemPrompt = persona.content;
103
- translated.add("persona");
104
- }
65
+ const dispatch = { prompt };
66
+ if (request.persona) {
67
+ if (options.personaChannel === "native")
68
+ dispatch.systemPrompt = request.persona.content;
105
69
  else {
106
- const composed = composePersonaFallbackPrompt(persona.content, prompt, options.adapter);
70
+ const composed = composePersonaFallbackPrompt(request.persona.content, prompt, options.adapter);
107
71
  prompt = composed.prompt;
108
72
  notices.push(...composed.notices);
109
- translated.add("persona");
110
73
  }
111
- if (typeof agent === "string")
112
- translated.add("agent");
113
74
  }
114
- else if (typeof agent === "string") {
75
+ else if (typeof request.agent === "string") {
115
76
  if (!options.nativeAgentSelector) {
116
- throw new ConfigError(`The ${options.adapter} transport cannot consume native agent selector ${JSON.stringify(agent)}.`, "INVALID_CONFIG_FILE");
117
- }
118
- nativeAgent = agent;
119
- translated.add("agent");
120
- }
121
- else if (own(request, "agent")) {
122
- translated.add("agent");
123
- }
124
- const dispatch = { prompt };
125
- if (nativeAgent !== undefined)
126
- dispatch.agent = nativeAgent;
127
- if (systemPrompt !== undefined)
128
- dispatch.systemPrompt = systemPrompt;
129
- if (own(request, "model")) {
130
- translated.add("model");
131
- if (request.model) {
132
- dispatch.model = request.model.resolved;
77
+ throw new ConfigError(`The ${options.adapter} transport cannot consume native agent selector ${JSON.stringify(request.agent)}.`, "INVALID_CONFIG_FILE");
133
78
  }
79
+ dispatch.agent = request.agent;
134
80
  }
135
- if (own(request, "inference")) {
136
- dispatch.inference = request.inference;
137
- const inference = request.inference;
138
- if (inference && Object.keys(inference).length > 0) {
139
- for (const key of Object.keys(inference).sort()) {
140
- const field = `inference.${key}`;
141
- if (supportedInference.has(key))
142
- translated.add(field);
143
- else
144
- reject(field);
145
- }
146
- if (typeof inference.effort === "string")
147
- dispatch.effort = inference.effort;
148
- }
149
- else {
150
- translated.add("inference");
81
+ dispatch.prompt = prompt;
82
+ if (request.model)
83
+ dispatch.model = request.model.resolved;
84
+ if (Object.hasOwn(request, "inference")) {
85
+ dispatch.inference = request.inference ?? null;
86
+ for (const key of Object.keys(request.inference ?? {}).sort()) {
87
+ if (!supportedInference.has(key))
88
+ skip(`inference.${key}`);
151
89
  }
90
+ if (typeof request.inference?.effort === "string")
91
+ dispatch.effort = request.inference.effort;
152
92
  }
153
- if (own(request, "outputSchema")) {
154
- if (request.outputSchema === null || options.outputSchema)
155
- translated.add("outputSchema");
156
- else
157
- reject("outputSchema");
158
- if (request.outputSchema)
159
- dispatch.schema = request.outputSchema;
93
+ if (request.outputSchema) {
94
+ if (!options.outputSchema)
95
+ skip("outputSchema");
96
+ dispatch.schema = request.outputSchema;
160
97
  }
161
- if (own(request, "tools")) {
162
- const tools = request.tools;
163
- if (translatesTools(options.tools, tools))
164
- translated.add("tools");
165
- else {
98
+ if (request.tools !== undefined) {
99
+ // An explicit empty selection still reaches the builder (e.g. an empty allowlist).
100
+ if (hasToolSelection(request.tools) && !translatesTools(options.tools, request.tools)) {
166
101
  throw new ConfigError(`The ${options.adapter} transport cannot enforce the resolved tool policy.`, "INVALID_CONFIG_FILE");
167
102
  }
168
- dispatch.tools = tools;
169
- }
170
- if (own(request.runtime, "settings")) {
171
- const settings = request.runtime.settings;
172
- if (settings === null || Object.keys(settings).length === 0)
173
- translated.add("runtime.settings");
174
- else
175
- reject("runtime.settings");
103
+ dispatch.tools = request.tools;
176
104
  }
177
- for (const field of selectedExtensionPaths(request))
178
- reject(field);
179
- return Object.freeze({
180
- prompt,
181
- dispatch: Object.freeze(dispatch),
182
- translatedFields: sortedUnique(translated),
183
- untranslatedFields: sortedUnique(untranslated),
184
- notices: Object.freeze(notices),
185
- });
105
+ const settings = request.runtime.settings;
106
+ if (settings && Object.keys(settings).length > 0)
107
+ skip("runtime.settings");
108
+ for (const field of extensionFields(request))
109
+ skip(field);
110
+ return { prompt, dispatch, notices };
186
111
  };
187
112
  }