akm-cli 0.9.0-rc.1 → 0.9.0-rc.13

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 (587) hide show
  1. package/CHANGELOG.md +1190 -52
  2. package/README.md +62 -37
  3. package/SECURITY.md +46 -31
  4. package/dist/akm +162 -38
  5. package/dist/akm-migrate +44 -0
  6. package/dist/assets/backends/schtasks-template.xml +2 -1
  7. package/dist/assets/hints/cli-hints-full.md +268 -118
  8. package/dist/assets/hints/cli-hints-short.md +87 -24
  9. package/dist/assets/{profiles → improve-strategies}/catchup.json +3 -1
  10. package/dist/assets/{profiles → improve-strategies}/consolidate.json +3 -1
  11. package/dist/assets/{profiles → improve-strategies}/default.json +6 -7
  12. package/dist/assets/improve-strategies/frequent.json +15 -0
  13. package/dist/assets/{profiles → improve-strategies}/graph-refresh.json +4 -2
  14. package/dist/assets/{profiles → improve-strategies}/memory-focus.json +4 -1
  15. package/dist/assets/{profiles → improve-strategies}/proactive-maintenance.json +5 -5
  16. package/dist/assets/{profiles → improve-strategies}/quick.json +4 -2
  17. package/dist/assets/improve-strategies/reflect-distill.json +30 -0
  18. package/dist/assets/{profiles → improve-strategies}/thorough.json +1 -1
  19. package/dist/assets/prompts/consolidate-system.md +5 -5
  20. package/dist/assets/prompts/extract-session.md +2 -6
  21. package/dist/assets/prompts/memory-infer-user.md +2 -3
  22. package/dist/assets/prompts/reflect-llm-framed-contract.md +11 -0
  23. package/dist/assets/prompts/reflect-llm-schema-contract.md +3 -0
  24. package/dist/assets/prompts/reflect-output-repair.md +3 -0
  25. package/dist/assets/stash-skeleton/README.md +38 -10
  26. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
  27. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
  28. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
  29. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
  30. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
  38. package/dist/assets/tasks/core/extract.yml +3 -2
  39. package/dist/assets/tasks/core/improve.yml +2 -1
  40. package/dist/assets/tasks/core/index-refresh.yml +1 -0
  41. package/dist/assets/tasks/core/sync.yml +1 -0
  42. package/dist/assets/tasks/core/version-check.yml +2 -1
  43. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  44. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  45. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  46. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  47. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  48. package/dist/assets/templates/html/health.html +5 -4
  49. package/dist/assets/workflows/workflow-template.md +31 -15
  50. package/dist/cli/invocation.js +279 -0
  51. package/dist/cli/parse-args.js +5 -90
  52. package/dist/cli/retired-commands.js +78 -0
  53. package/dist/cli/shared.js +158 -48
  54. package/dist/cli-node.mjs +2 -1
  55. package/dist/cli.js +747 -293
  56. package/dist/commands/agent/agent-dispatch.js +19 -18
  57. package/dist/commands/agent/agent-support.js +0 -24
  58. package/dist/commands/agent/contribute-cli.js +43 -97
  59. package/dist/commands/completions.js +80 -23
  60. package/dist/commands/config-cli.js +44 -281
  61. package/dist/commands/env/env-binding.js +13 -9
  62. package/dist/commands/env/env-cli.js +76 -159
  63. package/dist/commands/env/env.js +12 -163
  64. package/dist/commands/env/marker-path.js +6 -0
  65. package/dist/commands/env/secret-cli.js +45 -61
  66. package/dist/commands/env/secret.js +32 -62
  67. package/dist/commands/feedback-cli.js +179 -85
  68. package/dist/commands/health/accept-rate.js +58 -0
  69. package/dist/commands/health/advisories.js +7 -8
  70. package/dist/commands/health/checks.js +279 -94
  71. package/dist/commands/health/html-report.js +197 -578
  72. package/dist/commands/health/improve-metrics.js +277 -246
  73. package/dist/commands/health/llm-usage.js +19 -19
  74. package/dist/commands/health/md-report.js +16 -7
  75. package/dist/commands/health/metrics.js +67 -32
  76. package/dist/commands/health/renderers.js +47 -0
  77. package/dist/commands/health/report-view-model.js +508 -0
  78. package/dist/commands/health/stash-exposure.js +1 -1
  79. package/dist/commands/health/surfaces.js +16 -56
  80. package/dist/commands/health/task-runs.js +3 -67
  81. package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
  82. package/dist/commands/health/types-improve.js +29 -0
  83. package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
  84. package/dist/commands/health/types-result.js +7 -0
  85. package/dist/commands/health/types-runs.js +4 -0
  86. package/dist/commands/health/types-session-log.js +4 -0
  87. package/dist/commands/health/types-windows.js +4 -0
  88. package/dist/commands/health/types.js +26 -21
  89. package/dist/commands/health/windows.js +2 -3
  90. package/dist/commands/health.js +296 -167
  91. package/dist/commands/improve/anti-collapse.js +5 -5
  92. package/dist/commands/improve/autonomy-gate.js +68 -0
  93. package/dist/commands/improve/collapse-detector.js +65 -52
  94. package/dist/commands/improve/consolidate/chunking.js +9 -7
  95. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  96. package/dist/commands/improve/consolidate/merge.js +4 -0
  97. package/dist/commands/improve/consolidate.js +454 -1354
  98. package/dist/commands/improve/content-hash.js +39 -0
  99. package/dist/commands/improve/distill/content-repair.js +4 -10
  100. package/dist/commands/improve/distill/promote-memory.js +89 -64
  101. package/dist/commands/improve/distill/quality-gate.js +118 -42
  102. package/dist/commands/improve/distill-guards.js +1 -1
  103. package/dist/commands/improve/distill-promotion-policy.js +33 -888
  104. package/dist/commands/improve/distill.js +607 -363
  105. package/dist/commands/improve/eligibility.js +165 -79
  106. package/dist/commands/improve/extract-cli.js +35 -126
  107. package/dist/commands/improve/extract-prompt.js +6 -35
  108. package/dist/commands/improve/extract.js +640 -391
  109. package/dist/commands/improve/feedback-valence.js +2 -12
  110. package/dist/commands/improve/improve-cli.js +134 -135
  111. package/dist/commands/improve/improve-result-file.js +30 -50
  112. package/dist/commands/improve/improve-run-types.js +4 -0
  113. package/dist/commands/improve/improve-strategies.js +135 -0
  114. package/dist/commands/improve/improve.js +904 -701
  115. package/dist/commands/improve/locks.js +64 -111
  116. package/dist/commands/improve/loop-stages.js +1110 -923
  117. package/dist/commands/improve/memory/derived-ref.js +124 -0
  118. package/dist/commands/improve/memory/memory-belief.js +79 -7
  119. package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
  120. package/dist/commands/improve/memory/memory-improve.js +25 -37
  121. package/dist/commands/improve/outcome-loop.js +25 -88
  122. package/dist/commands/improve/preparation.js +1034 -813
  123. package/dist/commands/improve/proactive-maintenance.js +34 -9
  124. package/dist/commands/improve/proposal-envelope.js +31 -0
  125. package/dist/commands/improve/reflect.js +983 -794
  126. package/dist/commands/improve/run-context.js +119 -0
  127. package/dist/commands/improve/salience.js +24 -127
  128. package/dist/commands/improve/session-asset.js +7 -3
  129. package/dist/commands/improve/shared.js +14 -34
  130. package/dist/commands/improve/source-identity.js +28 -0
  131. package/dist/commands/improve/triage.js +20 -17
  132. package/dist/commands/lint/base-linter.js +340 -313
  133. package/dist/commands/lint/env-key-rules.js +31 -47
  134. package/dist/commands/lint/index.js +185 -30
  135. package/dist/commands/{events.js → log.js} +28 -38
  136. package/dist/commands/migrate-cli.js +54 -0
  137. package/dist/commands/migration-tool.js +55 -0
  138. package/dist/commands/observability-cli.js +70 -208
  139. package/dist/commands/proposal/diff-format.js +50 -0
  140. package/dist/commands/proposal/drain-policies.js +0 -6
  141. package/dist/commands/proposal/drain.js +91 -40
  142. package/dist/commands/proposal/proposal-cli.js +134 -132
  143. package/dist/commands/proposal/proposal-types.js +56 -0
  144. package/dist/commands/proposal/proposal.js +83 -65
  145. package/dist/commands/proposal/propose-cli.js +88 -0
  146. package/dist/commands/proposal/propose.js +105 -88
  147. package/dist/commands/proposal/repository.js +1303 -278
  148. package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
  149. package/dist/commands/proposal/validators/proposal-validators.js +61 -12
  150. package/dist/commands/proposal/validators/proposals.js +6 -8
  151. package/dist/commands/read/curate.js +78 -73
  152. package/dist/commands/read/knowledge.js +510 -13
  153. package/dist/commands/read/registry-search.js +2 -2
  154. package/dist/commands/read/remember-cli.js +84 -15
  155. package/dist/commands/read/search-cli.js +203 -96
  156. package/dist/commands/read/search.js +126 -94
  157. package/dist/commands/read/show.js +226 -250
  158. package/dist/commands/registry-cli.js +34 -60
  159. package/dist/commands/remember.js +18 -57
  160. package/dist/commands/sources/add-cli.js +104 -49
  161. package/dist/commands/sources/bundle-cli.js +166 -0
  162. package/dist/commands/sources/bundle-config-ops.js +63 -0
  163. package/dist/commands/sources/info.js +27 -15
  164. package/dist/commands/sources/init.js +30 -40
  165. package/dist/commands/sources/installed-stashes.js +469 -172
  166. package/dist/commands/sources/schema-repair.js +10 -9
  167. package/dist/commands/sources/self-update.js +182 -121
  168. package/dist/commands/sources/source-add.js +169 -178
  169. package/dist/commands/sources/source-clone.js +144 -41
  170. package/dist/commands/sources/source-manage.js +94 -59
  171. package/dist/commands/sources/sources-cli.js +64 -205
  172. package/dist/commands/sources/stash-cli.js +91 -54
  173. package/dist/commands/sources/stash-skeleton.js +1 -1
  174. package/dist/commands/tasks/tasks-cli.js +106 -104
  175. package/dist/commands/tasks/tasks.js +445 -262
  176. package/dist/commands/workflow-cli.js +75 -228
  177. package/dist/core/action-contributors.js +1 -1
  178. package/dist/core/activation-policy.js +49 -0
  179. package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
  180. package/dist/core/adapter/adapters/akm-adapter.js +528 -0
  181. package/dist/core/adapter/adapters/akm-lint.js +392 -0
  182. package/dist/core/adapter/adapters/akm-metadata.js +387 -0
  183. package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
  184. package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
  185. package/dist/core/adapter/adapters/claude-adapter.js +61 -0
  186. package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
  187. package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
  188. package/dist/core/adapter/adapters/index.js +80 -0
  189. package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
  190. package/dist/core/adapter/adapters/okf-adapter.js +391 -0
  191. package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
  192. package/dist/core/adapter/adapters/shared.js +286 -0
  193. package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
  194. package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
  195. package/dist/core/adapter/bundle-adapter.js +4 -0
  196. package/dist/core/adapter/detect-adapter.js +17 -0
  197. package/dist/core/adapter/recognize-match.js +44 -0
  198. package/dist/core/adapter/registry.js +56 -0
  199. package/dist/core/adapter/types.js +4 -0
  200. package/dist/core/asset/akm-markdown.js +30 -0
  201. package/dist/core/asset/asset-placement.js +243 -0
  202. package/dist/core/asset/asset-ref.js +110 -79
  203. package/dist/core/asset/asset-serialize.js +20 -0
  204. package/dist/core/asset/frontmatter.js +28 -12
  205. package/dist/core/asset/markdown.js +40 -51
  206. package/dist/core/asset/resolve-ref.js +274 -0
  207. package/dist/core/asset/stash-meta.js +2 -2
  208. package/dist/core/bundle-id.js +51 -0
  209. package/dist/core/common.js +281 -86
  210. package/dist/core/config/config-io.js +42 -128
  211. package/dist/core/config/config-schema.js +233 -855
  212. package/dist/core/config/config-sources.js +162 -39
  213. package/dist/core/config/config-types.js +16 -11
  214. package/dist/core/config/config-version.js +29 -0
  215. package/dist/core/config/config-walker.js +126 -37
  216. package/dist/core/config/config.js +154 -331
  217. package/dist/core/config/deep-merge.js +41 -0
  218. package/dist/core/config/engine-semantics.js +28 -0
  219. package/dist/core/config/experimental.js +21 -0
  220. package/dist/core/config/schema/embedding.js +38 -0
  221. package/dist/core/config/schema/engines.js +116 -0
  222. package/dist/core/config/schema/experimental.js +47 -0
  223. package/dist/core/config/schema/feedback.js +31 -0
  224. package/dist/core/config/schema/improve-processes.js +389 -0
  225. package/dist/core/config/schema/improve.js +94 -0
  226. package/dist/core/config/schema/index-config.js +176 -0
  227. package/dist/core/config/schema/output.js +18 -0
  228. package/dist/core/config/schema/primitives.js +94 -0
  229. package/dist/core/config/schema/search.js +30 -0
  230. package/dist/core/config/schema/setup.js +18 -0
  231. package/dist/core/config/schema/sources-bundles.js +169 -0
  232. package/dist/core/config/schema/workflow.js +29 -0
  233. package/dist/core/env-secret-ref.js +155 -20
  234. package/dist/core/errors.js +17 -15
  235. package/dist/core/events-types.js +4 -0
  236. package/dist/core/events.js +46 -128
  237. package/dist/core/extra-params.js +62 -0
  238. package/dist/core/file-change.js +17 -0
  239. package/dist/core/file-lock.js +202 -57
  240. package/dist/core/fs-txn.js +392 -0
  241. package/dist/core/git-message.js +59 -0
  242. package/dist/core/improve-result.js +167 -0
  243. package/dist/core/lesson-lint.js +1 -17
  244. package/dist/core/logs-db.js +1 -1
  245. package/dist/core/maintenance-barrier.js +135 -0
  246. package/dist/core/migration-operation.js +44 -0
  247. package/dist/core/mutation-target.js +78 -0
  248. package/dist/core/paths.js +22 -25
  249. package/dist/core/platform.js +10 -0
  250. package/dist/core/recognition-util.js +128 -0
  251. package/dist/core/redaction.js +392 -0
  252. package/dist/core/standards/resolve-standards-context.js +36 -65
  253. package/dist/core/standards/resolve-stash-standards.js +2 -2
  254. package/dist/core/standards/resolve-type-conventions.js +5 -5
  255. package/dist/core/state/migrations.js +242 -11
  256. package/dist/core/state-db.js +98 -10
  257. package/dist/core/structured.js +1 -1
  258. package/dist/core/subprocess.js +303 -0
  259. package/dist/core/text-truncation.js +9 -5
  260. package/dist/core/time.js +20 -0
  261. package/dist/core/type-presentation.js +130 -0
  262. package/dist/core/warn.js +0 -3
  263. package/dist/core/write-source.js +834 -118
  264. package/dist/indexer/bundle-identity-guard.js +92 -0
  265. package/dist/indexer/db/graph-db.js +1 -25
  266. package/dist/indexer/db/llm-cache.js +1 -1
  267. package/dist/indexer/ensure-index.js +30 -9
  268. package/dist/indexer/graph/graph-boost.js +9 -30
  269. package/dist/indexer/graph/graph-extraction.js +41 -27
  270. package/dist/indexer/graph/graph-types.js +4 -0
  271. package/dist/indexer/index-writer-lock.js +93 -49
  272. package/dist/indexer/index-written-assets.js +100 -53
  273. package/dist/indexer/indexer.js +746 -329
  274. package/dist/indexer/init.js +18 -25
  275. package/dist/indexer/installations.js +142 -0
  276. package/dist/indexer/passes/dir-staleness.js +18 -10
  277. package/dist/indexer/passes/memory-inference.js +25 -15
  278. package/dist/indexer/passes/metadata.js +412 -243
  279. package/dist/indexer/scan/doc-to-entry.js +160 -0
  280. package/dist/indexer/scan/drain-dir.js +134 -0
  281. package/dist/indexer/search/db-search.js +292 -108
  282. package/dist/indexer/search/fts-query.js +64 -0
  283. package/dist/indexer/search/ranking-contributors.js +145 -25
  284. package/dist/indexer/search/ranking-types.js +4 -0
  285. package/dist/indexer/search/ranking.js +28 -71
  286. package/dist/indexer/search/search-attribution.js +67 -0
  287. package/dist/indexer/search/search-fields.js +18 -3
  288. package/dist/indexer/search/search-hit-enrichers.js +30 -40
  289. package/dist/indexer/search/search-source.js +157 -111
  290. package/dist/indexer/search/semantic-status.js +4 -1
  291. package/dist/indexer/usage/usage-events.js +10 -30
  292. package/dist/indexer/walk/file-context.js +3 -45
  293. package/dist/indexer/walk/matchers.js +42 -73
  294. package/dist/indexer/walk/path-resolver.js +11 -5
  295. package/dist/indexer/walk/walker.js +42 -14
  296. package/dist/integrations/agent/builder-shared.js +7 -0
  297. package/dist/integrations/agent/builders.js +5 -58
  298. package/dist/integrations/agent/config.js +3 -143
  299. package/dist/integrations/agent/detect.js +17 -2
  300. package/dist/integrations/agent/engine-resolution.js +231 -0
  301. package/dist/integrations/agent/index.js +1 -2
  302. package/dist/integrations/agent/model-aliases.js +8 -3
  303. package/dist/integrations/agent/profiles.js +6 -99
  304. package/dist/integrations/agent/prompts.js +46 -18
  305. package/dist/integrations/agent/runner-dispatch.js +78 -13
  306. package/dist/integrations/agent/runner.js +76 -208
  307. package/dist/integrations/agent/spawn.js +48 -279
  308. package/dist/integrations/harnesses/aider/agent-builder.js +9 -8
  309. package/dist/integrations/harnesses/aider/index.js +2 -12
  310. package/dist/integrations/harnesses/amazonq/agent-builder.js +10 -16
  311. package/dist/integrations/harnesses/amazonq/index.js +3 -17
  312. package/dist/integrations/harnesses/claude/agent-builder.js +2 -3
  313. package/dist/integrations/harnesses/claude/config-import.js +1 -3
  314. package/dist/integrations/harnesses/claude/index.js +1 -14
  315. package/dist/integrations/harnesses/claude/session-log.js +27 -75
  316. package/dist/integrations/harnesses/codex/agent-builder.js +8 -7
  317. package/dist/integrations/harnesses/codex/index.js +2 -13
  318. package/dist/integrations/harnesses/copilot/agent-builder.js +9 -9
  319. package/dist/integrations/harnesses/copilot/index.js +1 -13
  320. package/dist/integrations/harnesses/gemini/agent-builder.js +8 -9
  321. package/dist/integrations/harnesses/gemini/index.js +1 -13
  322. package/dist/integrations/harnesses/ids.js +24 -0
  323. package/dist/integrations/harnesses/index.js +31 -33
  324. package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
  325. package/dist/integrations/harnesses/opencode/config-import.js +1 -3
  326. package/dist/integrations/harnesses/opencode/index.js +1 -18
  327. package/dist/integrations/harnesses/opencode/session-log.js +67 -125
  328. package/dist/integrations/harnesses/opencode-sdk/harness.js +3 -17
  329. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +274 -191
  330. package/dist/integrations/harnesses/openhands/agent-builder.js +12 -10
  331. package/dist/integrations/harnesses/openhands/index.js +2 -12
  332. package/dist/integrations/harnesses/pi/agent-builder.js +11 -18
  333. package/dist/integrations/harnesses/pi/index.js +3 -16
  334. package/dist/integrations/harnesses/shared.js +17 -0
  335. package/dist/integrations/harnesses/types.js +38 -34
  336. package/dist/integrations/lockfile.js +211 -24
  337. package/dist/integrations/session-logs/index.js +24 -40
  338. package/dist/integrations/session-logs/provider-base.js +113 -0
  339. package/dist/llm/client.js +182 -110
  340. package/dist/llm/embedders/deterministic.js +2 -2
  341. package/dist/llm/embedders/remote.js +21 -9
  342. package/dist/llm/feature-gate.js +17 -57
  343. package/dist/llm/graph-extract.js +12 -13
  344. package/dist/llm/index-passes.js +8 -42
  345. package/dist/llm/memory-infer.js +144 -1
  346. package/dist/llm/metadata-enhance.js +45 -30
  347. package/dist/llm/structured-call.js +16 -8
  348. package/dist/llm/usage-persist.js +30 -5
  349. package/dist/llm/usage-telemetry.js +59 -6
  350. package/dist/output/cli-hints.js +1 -2
  351. package/dist/output/command-registry.js +27 -0
  352. package/dist/output/context.js +22 -7
  353. package/dist/output/format-exempt.js +80 -0
  354. package/dist/output/generic-render.js +251 -0
  355. package/dist/output/html-render.js +11 -16
  356. package/dist/output/render-registry.js +57 -0
  357. package/dist/output/renderers.js +15 -281
  358. package/dist/output/shapes/curate.js +10 -1
  359. package/dist/output/shapes/events.js +12 -7
  360. package/dist/output/shapes/helpers.js +58 -84
  361. package/dist/output/shapes/passthrough.js +8 -40
  362. package/dist/output/shapes/proposal/producer.js +15 -7
  363. package/dist/output/shapes/registry.js +12 -6
  364. package/dist/output/shapes.js +0 -9
  365. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  366. package/dist/output/text/bundle-show.js +7 -0
  367. package/dist/output/text/command-format.js +562 -0
  368. package/dist/output/text/env.js +1 -3
  369. package/dist/output/text/events.js +8 -7
  370. package/dist/output/text/helpers.js +15 -1375
  371. package/dist/output/text/proposal/producer.js +4 -2
  372. package/dist/output/text/proposal-format.js +202 -0
  373. package/dist/output/text/registry-commands.js +1 -2
  374. package/dist/output/text/registry.js +12 -6
  375. package/dist/output/text/show-directives.js +117 -0
  376. package/dist/output/text/show-format.js +103 -0
  377. package/dist/output/text/sync.js +5 -0
  378. package/dist/output/text/workflow-format.js +332 -0
  379. package/dist/output/text/workflow.js +1 -2
  380. package/dist/output/text.js +10 -19
  381. package/dist/registry/factory.js +4 -6
  382. package/dist/registry/origin-resolve.js +16 -27
  383. package/dist/registry/providers/skills-sh.js +3 -3
  384. package/dist/registry/providers/static-index.js +15 -25
  385. package/dist/registry/resolve.js +43 -94
  386. package/dist/registry/semver.js +43 -0
  387. package/dist/runtime.js +81 -12
  388. package/dist/scripts/akm-migrate.js +35529 -0
  389. package/dist/setup/detect.js +5 -7
  390. package/dist/setup/detected-engines.js +136 -0
  391. package/dist/setup/engine-config.js +100 -0
  392. package/dist/setup/registry-stash-loader.js +3 -3
  393. package/dist/setup/semantic-assets.js +12 -9
  394. package/dist/setup/setup.js +444 -208
  395. package/dist/setup/steps/connection-shared.js +120 -0
  396. package/dist/setup/steps/connection.js +108 -305
  397. package/dist/setup/steps/platforms.js +13 -12
  398. package/dist/setup/steps/semantic.js +15 -3
  399. package/dist/setup/steps/sources.js +21 -15
  400. package/dist/setup/steps/stashdir.js +6 -4
  401. package/dist/setup/steps/tasks.js +236 -119
  402. package/dist/setup/steps.js +3 -2
  403. package/dist/sources/freshness.js +39 -0
  404. package/dist/sources/provider-factory.js +11 -17
  405. package/dist/sources/providers/filesystem.js +2 -3
  406. package/dist/sources/providers/git-install.js +278 -34
  407. package/dist/sources/providers/git-provider.js +54 -56
  408. package/dist/sources/providers/git-stash.js +420 -91
  409. package/dist/sources/providers/git.js +2 -2
  410. package/dist/sources/providers/npm.js +16 -19
  411. package/dist/sources/providers/provider-utils.js +47 -22
  412. package/dist/sources/providers/sync-from-ref.js +3 -9
  413. package/dist/sources/providers/website.js +2 -2
  414. package/dist/sources/resolve.js +11 -10
  415. package/dist/sources/snapshot-fetchers/types.js +4 -0
  416. package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
  417. package/dist/storage/database.js +60 -4
  418. package/dist/storage/engines/sqlite-migrations.js +156 -5
  419. package/dist/storage/locations.js +1 -2
  420. package/dist/storage/repositories/canaries-repository.js +1 -1
  421. package/dist/storage/repositories/events-repository.js +51 -11
  422. package/dist/storage/repositories/improve-runs-repository.js +6 -32
  423. package/dist/storage/repositories/index-connection.js +79 -0
  424. package/dist/storage/repositories/index-db.js +4 -3
  425. package/dist/storage/repositories/index-entries-repository.js +863 -0
  426. package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
  427. package/dist/storage/repositories/index-entry-types.js +4 -0
  428. package/dist/storage/repositories/index-fts-repository.js +167 -0
  429. package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
  430. package/dist/storage/repositories/index-meta-repository.js +49 -0
  431. package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
  432. package/dist/storage/repositories/index-sql.js +12 -0
  433. package/dist/storage/repositories/index-utility-repository.js +356 -0
  434. package/dist/storage/repositories/index-vec-repository.js +250 -0
  435. package/dist/storage/repositories/outcome-repository.js +119 -0
  436. package/dist/storage/repositories/proposals-repository.js +317 -75
  437. package/dist/storage/repositories/registry-cache.js +1 -1
  438. package/dist/storage/repositories/salience-repository.js +172 -0
  439. package/dist/storage/repositories/task-history-repository.js +110 -3
  440. package/dist/storage/repositories/workflow-runs-repository.js +68 -35
  441. package/dist/tasks/backends/cron.js +169 -46
  442. package/dist/tasks/backends/exec-utils.js +76 -3
  443. package/dist/tasks/backends/index.js +6 -9
  444. package/dist/tasks/backends/launchd.js +292 -55
  445. package/dist/tasks/backends/schtasks.js +557 -70
  446. package/dist/tasks/backends/types.js +4 -0
  447. package/dist/tasks/command-executable.js +93 -0
  448. package/dist/tasks/embedded.js +56 -38
  449. package/dist/tasks/parser.js +156 -64
  450. package/dist/tasks/resolve-akm-bin.js +144 -51
  451. package/dist/tasks/runner.js +377 -209
  452. package/dist/tasks/schedule.js +108 -19
  453. package/dist/tasks/scheduler-invocation.js +296 -0
  454. package/dist/tasks/schema.js +1 -1
  455. package/dist/tasks/task-id.js +35 -0
  456. package/dist/tasks/validator.js +30 -16
  457. package/dist/workflows/authoring/authoring.js +96 -148
  458. package/dist/workflows/authoring/scope-key.js +1 -1
  459. package/dist/workflows/cli.js +0 -20
  460. package/dist/workflows/concurrency-policy.js +15 -0
  461. package/dist/workflows/exec/brief.js +25 -59
  462. package/dist/workflows/exec/frozen-judge.js +47 -0
  463. package/dist/workflows/exec/native-executor.js +157 -94
  464. package/dist/workflows/exec/report.js +365 -200
  465. package/dist/workflows/exec/run-workflow.js +46 -40
  466. package/dist/workflows/exec/scheduler.js +12 -41
  467. package/dist/workflows/exec/step-work.js +239 -205
  468. package/dist/workflows/exec/workflow-engine-gate.js +67 -0
  469. package/dist/workflows/ir/compile.js +141 -283
  470. package/dist/workflows/ir/freeze.js +233 -0
  471. package/dist/workflows/ir/plan-hash.js +40 -5
  472. package/dist/workflows/ir/schema.js +537 -1
  473. package/dist/workflows/parser.js +878 -306
  474. package/dist/workflows/program/expressions.js +20 -208
  475. package/dist/workflows/program/schema.js +7 -10
  476. package/dist/workflows/renderer.js +99 -121
  477. package/dist/workflows/resource-limits.js +22 -0
  478. package/dist/workflows/runtime/checkin.js +1 -1
  479. package/dist/workflows/runtime/plan-classifier.js +131 -0
  480. package/dist/workflows/runtime/runs.js +200 -113
  481. package/dist/workflows/runtime/unit-checkin.js +1 -1
  482. package/dist/workflows/runtime/unit-phases.js +20 -0
  483. package/dist/workflows/runtime/workflow-asset-loader.js +235 -97
  484. package/dist/workflows/schema.js +1 -11
  485. package/dist/workflows/validate-summary.js +4 -26
  486. package/dist/workflows/validator.js +52 -30
  487. package/docs/README.md +42 -78
  488. package/docs/migration/README.md +8 -0
  489. package/docs/migration/release-notes/0.6.0.md +1 -1
  490. package/docs/migration/release-notes/0.7.0.md +9 -8
  491. package/docs/migration/release-notes/0.9.0.md +158 -14
  492. package/docs/migration/v0.7-to-v0.8.md +46 -47
  493. package/docs/migration/v0.8-to-v0.9.md +844 -0
  494. package/docs/reference/README.md +12 -0
  495. package/docs/reference/data-and-telemetry.md +333 -0
  496. package/package.json +21 -17
  497. package/schemas/akm-asset-envelope.json +93 -0
  498. package/schemas/akm-config.json +4636 -0
  499. package/schemas/akm-task.json +87 -0
  500. package/{dist/schemas → schemas}/akm-workflow.json +127 -82
  501. package/dist/akm-migrate-storage +0 -38
  502. package/dist/assets/help/help-accept.md +0 -12
  503. package/dist/assets/help/help-improve.md +0 -84
  504. package/dist/assets/help/help-proposals.md +0 -17
  505. package/dist/assets/help/help-propose.md +0 -17
  506. package/dist/assets/help/help-reject.md +0 -11
  507. package/dist/assets/profiles/frequent.json +0 -13
  508. package/dist/assets/profiles/recombine-only.json +0 -21
  509. package/dist/assets/profiles/reflect-distill.json +0 -30
  510. package/dist/assets/profiles/synthesize.json +0 -15
  511. package/dist/assets/prompts/procedural-system.md +0 -44
  512. package/dist/assets/prompts/recombine-system.md +0 -40
  513. package/dist/assets/prompts/staleness-detect-system.md +0 -6
  514. package/dist/assets/tasks/core/backup.yml +0 -4
  515. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  516. package/dist/assets/templates/html/default.html +0 -78
  517. package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
  518. package/dist/assets/wiki/index-template.md +0 -12
  519. package/dist/assets/wiki/ingest-workflow-template.md +0 -83
  520. package/dist/assets/wiki/log-template.md +0 -8
  521. package/dist/assets/wiki/schema-template.md +0 -61
  522. package/dist/cli/config-migrate.js +0 -150
  523. package/dist/cli/config-validate.js +0 -39
  524. package/dist/commands/graph/graph-cli.js +0 -124
  525. package/dist/commands/graph/graph.js +0 -487
  526. package/dist/commands/improve/calibration.js +0 -161
  527. package/dist/commands/improve/dedup.js +0 -482
  528. package/dist/commands/improve/extract-watch.js +0 -140
  529. package/dist/commands/improve/hot-probation.js +0 -45
  530. package/dist/commands/improve/improve-auto-accept.js +0 -276
  531. package/dist/commands/improve/improve-profiles.js +0 -168
  532. package/dist/commands/improve/procedural.js +0 -398
  533. package/dist/commands/improve/recombine.js +0 -818
  534. package/dist/commands/improve/schema-similarity-gate.js +0 -168
  535. package/dist/commands/lint/agent-linter.js +0 -44
  536. package/dist/commands/lint/command-linter.js +0 -44
  537. package/dist/commands/lint/default-linter.js +0 -16
  538. package/dist/commands/lint/fact-linter.js +0 -39
  539. package/dist/commands/lint/knowledge-linter.js +0 -16
  540. package/dist/commands/lint/memory-linter.js +0 -61
  541. package/dist/commands/lint/registry.js +0 -41
  542. package/dist/commands/lint/skill-linter.js +0 -45
  543. package/dist/commands/lint/task-linter.js +0 -50
  544. package/dist/commands/lint/workflow-linter.js +0 -81
  545. package/dist/commands/proposal/legacy-import.js +0 -115
  546. package/dist/commands/sources/history.js +0 -196
  547. package/dist/commands/tasks/default-tasks.js +0 -186
  548. package/dist/commands/wiki-cli.js +0 -292
  549. package/dist/core/asset/asset-registry.js +0 -76
  550. package/dist/core/asset/asset-spec.js +0 -316
  551. package/dist/core/config/config-migration.js +0 -602
  552. package/dist/core/deep-merge.js +0 -38
  553. package/dist/core/eval/rank-metrics.js +0 -113
  554. package/dist/core/ripgrep/install.js +0 -163
  555. package/dist/core/ripgrep/resolve.js +0 -81
  556. package/dist/indexer/db/db.js +0 -1414
  557. package/dist/indexer/manifest.js +0 -170
  558. package/dist/indexer/passes/metadata-contributors.js +0 -31
  559. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
  560. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -25
  561. package/dist/llm/call-ai.js +0 -62
  562. package/dist/llm/memory-infer-impl.js +0 -138
  563. package/dist/output/shapes/distill.js +0 -14
  564. package/dist/output/shapes/history.js +0 -11
  565. package/dist/output/text/distill.js +0 -6
  566. package/dist/output/text/enable-disable.js +0 -8
  567. package/dist/output/text/history.js +0 -6
  568. package/dist/output/text/wiki.js +0 -16
  569. package/dist/registry/build-index.js +0 -386
  570. package/dist/schemas/akm-config.json +0 -14225
  571. package/dist/scripts/migrate-storage.js +0 -13169
  572. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -10169
  573. package/dist/scripts/migrations/v16-to-v17.js +0 -141
  574. package/dist/setup/legacy-config.js +0 -106
  575. package/dist/storage/repositories/consolidation-repository.js +0 -38
  576. package/dist/storage/repositories/recombine-repository.js +0 -213
  577. package/dist/wiki/wiki-templates.js +0 -15
  578. package/dist/wiki/wiki.js +0 -1012
  579. package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
  580. package/dist/workflows/db.js +0 -350
  581. package/dist/workflows/exec/watch.js +0 -116
  582. package/dist/workflows/program/parser.js +0 -760
  583. package/dist/workflows/program/project.js +0 -105
  584. package/docs/data-and-telemetry.md +0 -227
  585. package/docs/migration/release-notes/0.9.0-beta.60.md +0 -19
  586. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
  587. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
@@ -2,7 +2,7 @@
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
- * Native executor — executes ONE step's IR v2 subgraph (`IrStepPlan.root`) on
5
+ * Native executor — executes one frozen step subgraph (`IrStepPlan.root`) on
6
6
  * the local machine: fan-out through the scheduler, schema-validated
7
7
  * structured output through `runStructured` (core/structured.ts), per-unit
8
8
  * persistence through the serialized writer queue, and `workflow_unit_*`
@@ -74,9 +74,7 @@
74
74
  * never a silent re-dispatch — under a frozen plan the same identity must
75
75
  * reproduce the same inputs, so a mismatch means the journal (or params
76
76
  * row) was tampered with. Failed/running/missing rows dispatch live.
77
- * - Pre-release R1 journals used positional ids (`node.unit[3]`). There is
78
- * no back-compat shim: those rows simply never match a content-derived id
79
- * and are ignored (the step re-runs cleanly on top of them).
77
+ * - Rows with unrelated ids never match a content-derived id and are ignored.
80
78
  *
81
79
  * Gate loops (addendum, R2 `gate.max_loops`): when the engine re-executes a
82
80
  * step subgraph after a gate rejection, it threads the judge's feedback in as
@@ -129,22 +127,22 @@
129
127
  * - This module NEVER writes step rows: advancing the gated spine is the
130
128
  * engine loop's job (`run-workflow.ts`) via `completeWorkflowStep`.
131
129
  */
130
+ import { deepMergeConfig } from "../../core/config/deep-merge.js";
132
131
  import { ConfigError } from "../../core/errors.js";
133
132
  import { appendEvent } from "../../core/events.js";
134
133
  import { validateJsonSchemaSubset } from "../../core/json-schema.js";
134
+ import { collectSensitiveValues, isEnvPassthroughValueSafeToExpose, redactSensitiveValue } from "../../core/redaction.js";
135
135
  import { runStructured } from "../../core/structured.js";
136
136
  import { warn } from "../../core/warn.js";
137
+ import { insertEventStrict } from "../../storage/repositories/events-repository.js";
137
138
  import { withWorkflowRunsRepo } from "../../storage/repositories/workflow-runs-repository.js";
138
139
  import { LIFETIME_UNIT_CAP, scheduleUnits, UnitCapExceededError } from "./scheduler.js";
139
140
  // Shared step semantics — the ONE implementation consumed by both the engine
140
141
  // (this module + run-workflow.ts) and, from R3, the brief/report driver
141
142
  // protocol. This module dispatches; step-work.ts owns the pure decisions.
142
- import { buildArtifactSummary, computeStepWorkList, DEFAULT_UNIT_TIMEOUT_MS, projectStepOutput, reduceEmptyStep, reduceStepOutcomes, stepOutputsFromEvidence, unitOutcomeFromRow, } from "./step-work.js";
143
+ import { computeStepWorkList, reduceEmptyStep, reduceStepOutcomes, stepOutputsFromEvidence, unitOutcomeFromRow, } from "./step-work.js";
143
144
  import { enqueueUnitWrite } from "./unit-writer.js";
144
145
  import { assertGitWorkTree, cleanupUnitWorktree, createUnitWorktree } from "./worktree.js";
145
- // Re-exported for existing consumers (run-workflow.ts, tests) that import these
146
- // from native-executor; they now live in the shared step-work module.
147
- export { buildArtifactSummary, DEFAULT_UNIT_TIMEOUT_MS, projectStepOutput };
148
146
  /**
149
147
  * Mutable per-step dispatch budget: the lifetime unit cap PLUS the declared
150
148
  * run-level budget ceilings (`budget.max_units` / `budget.max_tokens`,
@@ -254,6 +252,7 @@ export async function executeStepPlan(plan, ctx) {
254
252
  runId: ctx.runId,
255
253
  params: ctx.params,
256
254
  stepOutputs: stepOutputsFromEvidence(ctx.evidence),
255
+ engines: ctx.engines ?? {},
257
256
  ...(ctx.gateLoop !== undefined ? { gateLoop: ctx.gateLoop } : {}),
258
257
  ...(ctx.gateFeedback ? { gateFeedback: ctx.gateFeedback } : {}),
259
258
  });
@@ -310,7 +309,8 @@ export async function executeStepPlan(plan, ctx) {
310
309
  // attempt in dispatchJournaledAttempt.
311
310
  let worktreeBase;
312
311
  if (willDispatch && template.isolation === "worktree") {
313
- if (template.runner === "llm") {
312
+ const engine = template.invocation ? ctx.engines?.[template.invocation.engine] : undefined;
313
+ if (engine?.kind === "llm") {
314
314
  return failedStep(dispatched, `Step "${plan.stepId}" declares isolation: worktree on an llm unit — the llm runner has no ` +
315
315
  `working directory to isolate. Use the agent or sdk runner for worktree-isolated units.`);
316
316
  }
@@ -357,6 +357,12 @@ export async function executeStepPlan(plan, ctx) {
357
357
  ...(onExceeded ? { onExceeded } : {}),
358
358
  });
359
359
  let outcomes;
360
+ const selectedEngine = template.invocation ? ctx.engines?.[template.invocation.engine] : undefined;
361
+ const selectedLlmEngine = selectedEngine?.kind === "llm"
362
+ ? selectedEngine
363
+ : selectedEngine?.kind === "agent" && selectedEngine.fallbackLlmEngine
364
+ ? ctx.engines?.[selectedEngine.fallbackLlmEngine]
365
+ : undefined;
360
366
  try {
361
367
  outcomes = await scheduleUnits(workUnits, (workUnit) => runUnit({
362
368
  plan,
@@ -372,6 +378,7 @@ export async function executeStepPlan(plan, ctx) {
372
378
  concurrency: workList.list.concurrency,
373
379
  signal,
374
380
  maxConcurrency: ctx.maxConcurrency,
381
+ ...(selectedLlmEngine?.kind === "llm" ? { llmConcurrency: selectedLlmEngine.concurrency } : {}),
375
382
  });
376
383
  }
377
384
  finally {
@@ -427,25 +434,35 @@ async function runUnit(input) {
427
434
  if (!workUnit.resolved.ok) {
428
435
  return { unitId, ok: false, failureReason: "expression_error", error: workUnit.resolved.error };
429
436
  }
437
+ if (!workUnit.engine || !workUnit.invocation) {
438
+ return {
439
+ unitId,
440
+ ok: false,
441
+ failureReason: "dispatch_error",
442
+ error: `unit "${unitId}" has no frozen engine snapshot and cannot be dispatched`,
443
+ };
444
+ }
430
445
  // The prompt (and therefore the input hash) was built once with the BASE
431
446
  // unit id by computeStepWorkList: a retry re-dispatches the SAME input, the
432
447
  // `~r<n>` suffix is journal bookkeeping only.
433
448
  const { prompt, inputHash } = workUnit.resolved;
449
+ const sensitiveValues = collectWorkflowDispatchSensitiveValues(workUnit, env);
434
450
  const request = {
435
451
  runId: ctx.runId,
436
452
  stepId: plan.stepId,
437
453
  unitId,
438
454
  nodeId: workUnit.nodeId,
439
455
  prompt,
440
- runner: workUnit.runner,
441
- ...(workUnit.profile ? { profile: workUnit.profile } : {}),
442
- ...(workUnit.model ? { model: workUnit.model } : {}),
456
+ engine: workUnit.engine,
457
+ ...(workUnit.fallbackEngine ? { fallbackEngine: workUnit.fallbackEngine } : {}),
458
+ invocation: workUnit.invocation,
443
459
  timeoutMs: workUnit.timeoutMs,
444
460
  ...(workUnit.schema ? { schema: workUnit.schema } : {}),
445
461
  ...(env ? { env } : {}),
462
+ ...(sensitiveValues.length > 0 ? { sensitiveValues } : {}),
446
463
  ...(input.signal ? { signal: input.signal } : {}),
447
464
  };
448
- // Bounded retry (IR v2 failure policy): attempt 0 journals under the base
465
+ // Bounded retry: attempt 0 journals under the base
449
466
  // journal id (`<unitId>`, or `<unitId>~l<loop>` in a gate loop — computed by
450
467
  // the shared work-list), retry attempt N under `<baseId>~r<N>`. Every attempt
451
468
  // keeps its own row. Retries only fire when the failure reason is in
@@ -560,7 +577,8 @@ async function dispatchJournaledAttempt(input) {
560
577
  parentUnitId: workUnit.isFanOut ? `${plan.stepId}.map` : null,
561
578
  phase: null,
562
579
  runner: workUnit.runner,
563
- model: workUnit.model ?? null,
580
+ engine: request.engine.name,
581
+ model: request.invocation.model,
564
582
  inputHash,
565
583
  worktreePath: worktreePath ?? null,
566
584
  startedAt: new Date().toISOString(),
@@ -573,9 +591,15 @@ async function dispatchJournaledAttempt(input) {
573
591
  ref: ctx.workflowRef,
574
592
  metadata: { runId: ctx.runId, stepId: plan.stepId, unitId: attemptId },
575
593
  });
576
- const outcome = await dispatchUnit(request, dispatcher);
577
- await enqueueUnitWrite(async () => {
578
- await withWorkflowRunsRepo((repo) => repo.finishUnit({
594
+ const outcome = redactUnitOutcome(await dispatchUnit(request, dispatcher), request.sensitiveValues ?? []);
595
+ const finishedAt = new Date().toISOString();
596
+ await enqueueUnitWrite(() => withWorkflowRunsRepo((repo) => repo.immediateTransaction((db) => {
597
+ const run = repo.getRunById(ctx.runId);
598
+ if (run?.status !== "active")
599
+ return;
600
+ if (ctx.leaseHolder !== undefined && run.engine_lease_holder !== ctx.leaseHolder)
601
+ return;
602
+ repo.finishUnit({
579
603
  runId: ctx.runId,
580
604
  unitId: attemptId,
581
605
  status: outcome.ok ? "completed" : "failed",
@@ -589,21 +613,22 @@ async function dispatchJournaledAttempt(input) {
589
613
  // Harness-native session id (P2): journaled so resume can replay the
590
614
  // harness's own context cache (e.g. `codex exec resume <id>`).
591
615
  sessionId: outcome.sessionId ?? null,
592
- finishedAt: new Date().toISOString(),
593
- }));
594
- });
595
- appendEvent({
596
- eventType: "workflow_unit_finished",
597
- ref: ctx.workflowRef,
598
- metadata: {
599
- runId: ctx.runId,
600
- stepId: plan.stepId,
601
- unitId: attemptId,
602
- status: outcome.ok ? "completed" : "failed",
603
- ...(outcome.failureReason ? { failureReason: outcome.failureReason } : {}),
604
- ...(outcome.tokens !== undefined ? { tokens: outcome.tokens } : {}),
605
- },
606
- });
616
+ finishedAt,
617
+ });
618
+ insertEventStrict(db, {
619
+ eventType: "workflow_unit_finished",
620
+ ts: finishedAt,
621
+ ref: ctx.workflowRef,
622
+ metadata: {
623
+ runId: ctx.runId,
624
+ stepId: plan.stepId,
625
+ unitId: attemptId,
626
+ status: outcome.ok ? "completed" : "failed",
627
+ ...(outcome.failureReason ? { failureReason: outcome.failureReason } : {}),
628
+ ...(outcome.tokens !== undefined ? { tokens: outcome.tokens } : {}),
629
+ },
630
+ });
631
+ })));
607
632
  // Worktree lifecycle epilogue: a CLEAN worktree (`git status --porcelain`
608
633
  // empty) is removed; a DIRTY one is retained and logged — the unit left
609
634
  // uncollected work, and its journaled worktree_path says where. Cleanup is
@@ -729,8 +754,8 @@ async function resolveEnvBindings(refs) {
729
754
  * agent → `executeRunner` → `runAgent` (per-harness AgentCommandBuilder)
730
755
  * sdk → `executeRunner` → `runOpencodeSdk`
731
756
  *
732
- * `inherit` resolves against config: the node/step profile, else
733
- * `defaults.agent` (sdk when the profile is opencode-sdk), else `defaults.llm`.
757
+ * Every v3 invocation names a frozen engine; no live profile/default fallback
758
+ * is consulted during dispatch.
734
759
  */
735
760
  /**
736
761
  * Build the platform-agnostic {@link import("../../integrations/agent/builder-shared.js").AgentDispatchRequest}
@@ -756,15 +781,14 @@ async function resolveEnvBindings(refs) {
756
781
  export function buildAgentDispatchRequest(request, prompt) {
757
782
  return {
758
783
  prompt,
759
- ...(request.model ? { model: request.model } : {}),
784
+ ...(request.invocation.model ? { model: request.invocation.model } : {}),
785
+ ...(request.invocation.model ? { modelIsExact: true } : {}),
760
786
  ...(request.schema ? { schema: request.schema } : {}),
761
787
  };
762
788
  }
763
789
  export const defaultUnitDispatcher = async (request, feedback) => {
764
- const { loadConfig } = await import("../../core/config/config.js");
765
- const config = loadConfig();
766
790
  const prompt = feedback ? `${request.prompt}\n\n${feedback}` : request.prompt;
767
- const resolved = await resolveUnitRunner(request, config);
791
+ const resolved = frozenUnitRunner(request);
768
792
  // `env` bindings can only reach a child process. The agent (CLI) runner
769
793
  // spawns one per call, and the sdk runner now injects them for real via the
770
794
  // env-keyed opencode server registry (sdk-runner.ts module doc, open seam
@@ -794,15 +818,10 @@ export const defaultUnitDispatcher = async (request, feedback) => {
794
818
  }
795
819
  if (resolved.kind === "llm") {
796
820
  const { chatCompletion, LlmCallError } = await import("../../llm/client.js");
797
- const { resolveModel } = await import("../../integrations/agent/model-aliases.js");
798
- const connection = request.model
799
- ? { ...resolved.connection, model: resolveModel(request.model, "llm", undefined, config.modelAliases) }
800
- : resolved.connection;
821
+ const connection = resolved.connection;
801
822
  try {
802
823
  const text = await chatCompletion(connection, [{ role: "user", content: prompt }], {
803
- // null = author declared `timeout: none` — cap at the max signed
804
- // 32-bit delay (setTimeout's ceiling, ~24.8 days ≈ unbounded here).
805
- timeoutMs: request.timeoutMs === null ? 2 ** 31 - 1 : request.timeoutMs,
824
+ timeoutMs: request.timeoutMs,
806
825
  ...(request.signal ? { signal: request.signal } : {}),
807
826
  // Native structured output where the connection supports it; the
808
827
  // executor's subset validator still runs downstream either way.
@@ -821,8 +840,16 @@ export const defaultUnitDispatcher = async (request, feedback) => {
821
840
  }
822
841
  }
823
842
  const { executeRunner } = await import("../../integrations/agent/runner-dispatch.js");
824
- const profile = request.model ? { ...resolved.profile, model: request.model } : resolved.profile;
825
- const result = await executeRunner({ kind: resolved.kind, profile }, prompt, {
843
+ const profile = request.invocation.model
844
+ ? { ...resolved.profile, model: request.invocation.model, modelIsExact: true }
845
+ : resolved.profile;
846
+ const result = await executeRunner(resolved.kind === "sdk"
847
+ ? {
848
+ kind: "sdk",
849
+ profile,
850
+ ...(resolved.fallbackConnection ? { fallbackConnection: resolved.fallbackConnection } : {}),
851
+ }
852
+ : { kind: "agent", profile }, prompt, {
826
853
  stdio: "captured",
827
854
  parseOutput: "text",
828
855
  timeoutMs: request.timeoutMs,
@@ -863,15 +890,44 @@ export const defaultUnitDispatcher = async (request, feedback) => {
863
890
  ...(result.usage ? { usage: result.usage } : {}),
864
891
  };
865
892
  };
893
+ function collectWorkflowDispatchSensitiveValues(workUnit, env) {
894
+ const values = new Set(Object.values(env ?? {}));
895
+ const addCredential = (engine) => {
896
+ if (!engine)
897
+ return;
898
+ if (engine.kind === "llm") {
899
+ for (const name of engine.credential?.names ?? []) {
900
+ const value = process.env[name]?.trim();
901
+ if (value)
902
+ values.add(value);
903
+ }
904
+ return;
905
+ }
906
+ for (const name of engine.envPassthrough) {
907
+ const value = process.env[name];
908
+ if (!isEnvPassthroughValueSafeToExpose(name, value) && value)
909
+ values.add(value);
910
+ }
911
+ };
912
+ addCredential(workUnit.engine);
913
+ addCredential(workUnit.fallbackEngine);
914
+ return collectSensitiveValues(values);
915
+ }
916
+ function redactUnitOutcome(outcome, sensitiveValues) {
917
+ const redacted = redactSensitiveValue(outcome, sensitiveValues);
918
+ if (outcome.failureReason !== undefined && redacted.failureReason !== outcome.failureReason) {
919
+ redacted.failureReason = "reported_failure";
920
+ }
921
+ return redacted;
922
+ }
866
923
  /**
867
924
  * Map a typed {@link import("../../llm/client.js").LlmCallErrorCode} into the
868
925
  * persisted `AgentFailureReason` taxonomy (agent/spawn.ts) — the ONLY
869
926
  * vocabulary `retry.on` accepts and the journal's `failure_reason` column
870
927
  * carries. Exhaustive over the code union (typecheck fails on drift):
871
928
  *
872
- * - `timeout` → `timeout` (wall-clock expiry; also covers
873
- * signal aborts, which chatCompletion
874
- * folds into its timeout code)
929
+ * - `timeout` → `timeout` (wall-clock expiry)
930
+ * - `aborted` → `aborted` (caller/budget cancellation)
875
931
  * - `rate_limited` → `llm_rate_limit` (HTTP 429 — the canonical transient)
876
932
  * - `parse_error` / `provider_html_error`
877
933
  * → `parse_error` (a response arrived but was not the
@@ -884,6 +940,8 @@ export const defaultUnitDispatcher = async (request, feedback) => {
884
940
  */
885
941
  export function llmFailureReasonFor(code) {
886
942
  switch (code) {
943
+ case "aborted":
944
+ return "aborted";
887
945
  case "timeout":
888
946
  return "timeout";
889
947
  case "rate_limited":
@@ -897,58 +955,63 @@ export function llmFailureReasonFor(code) {
897
955
  }
898
956
  }
899
957
  /**
900
- * Resolve the harness `resultExtractor` for an agent profile, mirroring the
901
- * platform routing of `getCommandBuilder`: the profile's explicit
902
- * `commandBuilder` wins, else its name (with the `-headless` builtin-variant
903
- * suffix stripped, same derivation as BUILTIN_BUILDERS). Unknown/custom
904
- * platforms resolve to no extractor — raw stdout passes through unchanged.
958
+ * Resolve the harness `resultExtractor` from the canonical platform frozen
959
+ * from the named engine. Unknown platforms pass raw stdout through unchanged.
905
960
  */
906
961
  async function resolveHarnessExtractor(profile) {
907
962
  const { getHarness } = await import("../../integrations/harnesses/index.js");
908
- const platform = profile.commandBuilder ?? profile.name;
909
- const harness = getHarness(platform) ?? getHarness(platform.replace(/-headless$/, ""));
963
+ const harness = getHarness(profile.platform ?? profile.name);
910
964
  return harness?.resultExtractor;
911
965
  }
912
- async function resolveUnitRunner(request, config) {
913
- const requested = request.runner;
914
- if (requested === "llm") {
915
- const connection = request.profile
916
- ? config.profiles?.llm?.[request.profile]
917
- : await requireDefaultLlm(config, request);
918
- if (!connection) {
919
- throw new ConfigError(`Workflow unit "${request.unitId}" wants llm profile "${request.profile}", which is not in profiles.llm.`, "LLM_NOT_CONFIGURED");
920
- }
921
- return { kind: "llm", connection };
922
- }
923
- const profileName = request.profile ?? config.defaults?.agent;
924
- if (profileName) {
925
- const { resolveProfileFromConfig } = await import("../../integrations/agent/config.js");
926
- const profile = resolveProfileFromConfig(profileName, config);
927
- if (!profile) {
928
- throw new ConfigError(`Workflow unit "${request.unitId}" wants agent profile "${profileName}", which cannot be resolved. ` +
929
- `Define profiles.agent."${profileName}" or set defaults.agent.`, "INVALID_CONFIG_FILE");
930
- }
931
- const inferred = profile.sdkMode ? "sdk" : "agent";
932
- if (requested !== "inherit" && requested !== inferred) {
933
- throw new ConfigError(`Workflow unit "${request.unitId}" declares runner "${requested}" but profile "${profileName}" is ${profile.sdkMode ? "an opencode-sdk (sdk) profile" : "a CLI (agent) profile"}.`, "INVALID_CONFIG_FILE");
934
- }
935
- return { kind: inferred, profile };
966
+ /** Reconstruct the existing RunnerSpec substrate from the frozen allowlist only. */
967
+ function frozenUnitRunner(request) {
968
+ const snapshot = request.engine;
969
+ if (snapshot.kind === "llm") {
970
+ return { kind: "llm", connection: materializeFrozenLlm(snapshot, request.invocation) };
936
971
  }
937
- if (requested === "inherit") {
938
- const connection = await requireDefaultLlm(config, request, /* soft */ true);
939
- if (connection)
940
- return { kind: "llm", connection };
941
- }
942
- throw new ConfigError(`Workflow unit "${request.unitId}" has no runnable backend: set defaults.agent or defaults.llm in config.json, ` +
943
- `or declare a runner/profile on the unit.`, "INVALID_CONFIG_FILE");
972
+ const profile = {
973
+ name: snapshot.name,
974
+ platform: snapshot.platform,
975
+ bin: snapshot.bin,
976
+ args: snapshot.args,
977
+ stdio: "captured",
978
+ envPassthrough: snapshot.envPassthrough,
979
+ parseOutput: "text",
980
+ ...(snapshot.workspace ? { workspace: snapshot.workspace } : {}),
981
+ ...(request.invocation?.model ? { model: request.invocation.model } : {}),
982
+ ...(request.invocation?.model ? { modelIsExact: true } : {}),
983
+ };
984
+ if (snapshot.runnerKind === "agent")
985
+ return { kind: "agent", profile };
986
+ // The catalog is supplied transitively by the work-list only for hashing; the
987
+ // SDK runner receives a frozen fallback copied into the request by its caller.
988
+ const fallback = request.fallbackEngine ? materializeFrozenLlm(request.fallbackEngine, undefined) : undefined;
989
+ return { kind: "sdk", profile, ...(fallback ? { fallbackConnection: fallback } : {}) };
944
990
  }
945
- async function requireDefaultLlm(config, request, soft = false) {
946
- const { getDefaultLlmConfig } = await import("../../core/config/config.js");
947
- const connection = getDefaultLlmConfig(config);
948
- if (!connection && !soft) {
949
- throw new ConfigError(`Workflow unit "${request.unitId}" declares runner "llm" but no default LLM is configured (defaults.llm).`, "LLM_NOT_CONFIGURED");
991
+ function materializeFrozenLlm(snapshot, invocation) {
992
+ let apiKey;
993
+ for (const name of snapshot.credential?.names ?? []) {
994
+ const candidate = process.env[name]?.trim();
995
+ if (candidate) {
996
+ apiKey = candidate;
997
+ break;
998
+ }
950
999
  }
951
- return connection ?? undefined;
1000
+ if (snapshot.credential?.required && !apiKey)
1001
+ throw new ConfigError(`Required engine credential ${snapshot.credential.names[0]} is not set.`, "INVALID_CONFIG_FILE");
1002
+ const base = {
1003
+ provider: snapshot.provider,
1004
+ endpoint: snapshot.endpoint,
1005
+ model: invocation?.model ?? snapshot.model,
1006
+ ...(snapshot.temperature !== undefined ? { temperature: snapshot.temperature } : {}),
1007
+ ...(snapshot.maxTokens !== undefined ? { maxTokens: snapshot.maxTokens } : {}),
1008
+ ...(snapshot.supportsJsonSchema !== undefined ? { supportsJsonSchema: snapshot.supportsJsonSchema } : {}),
1009
+ ...(snapshot.extraParams ? { extraParams: snapshot.extraParams } : {}),
1010
+ ...(snapshot.contextLength !== undefined ? { contextLength: snapshot.contextLength } : {}),
1011
+ ...(snapshot.enableThinking !== undefined ? { enableThinking: snapshot.enableThinking } : {}),
1012
+ ...(apiKey ? { apiKey } : {}),
1013
+ };
1014
+ return invocation?.llm ? deepMergeConfig(base, invocation.llm) : base;
952
1015
  }
953
1016
  // ── Small helpers ────────────────────────────────────────────────────────────
954
1017
  /**