akm-cli 0.9.0-rc.0 → 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 (598) hide show
  1. package/CHANGELOG.md +1283 -22
  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/prompts/workflow-unit-preamble.md +26 -0
  26. package/dist/assets/stash-skeleton/README.md +38 -10
  27. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
  28. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
  29. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
  30. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
  38. package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
  39. package/dist/assets/tasks/core/extract.yml +3 -2
  40. package/dist/assets/tasks/core/improve.yml +2 -1
  41. package/dist/assets/tasks/core/index-refresh.yml +1 -0
  42. package/dist/assets/tasks/core/sync.yml +1 -0
  43. package/dist/assets/tasks/core/version-check.yml +2 -1
  44. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  45. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  46. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  47. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  48. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  49. package/dist/assets/templates/html/health.html +5 -4
  50. package/dist/assets/workflows/workflow-template.md +31 -15
  51. package/dist/cli/invocation.js +279 -0
  52. package/dist/cli/parse-args.js +5 -90
  53. package/dist/cli/retired-commands.js +78 -0
  54. package/dist/cli/shared.js +158 -48
  55. package/dist/cli-node.mjs +2 -1
  56. package/dist/cli.js +747 -293
  57. package/dist/commands/agent/agent-dispatch.js +19 -18
  58. package/dist/commands/agent/agent-support.js +0 -24
  59. package/dist/commands/agent/contribute-cli.js +43 -97
  60. package/dist/commands/completions.js +80 -23
  61. package/dist/commands/config-cli.js +44 -281
  62. package/dist/commands/env/env-binding.js +99 -0
  63. package/dist/commands/env/env-cli.js +84 -224
  64. package/dist/commands/env/env.js +12 -163
  65. package/dist/commands/env/marker-path.js +6 -0
  66. package/dist/commands/env/secret-cli.js +45 -61
  67. package/dist/commands/env/secret.js +32 -62
  68. package/dist/commands/feedback-cli.js +179 -85
  69. package/dist/commands/health/accept-rate.js +58 -0
  70. package/dist/commands/health/advisories.js +7 -8
  71. package/dist/commands/health/checks.js +279 -94
  72. package/dist/commands/health/html-report.js +197 -578
  73. package/dist/commands/health/improve-metrics.js +277 -246
  74. package/dist/commands/health/llm-usage.js +19 -19
  75. package/dist/commands/health/md-report.js +16 -7
  76. package/dist/commands/health/metrics.js +67 -32
  77. package/dist/commands/health/renderers.js +47 -0
  78. package/dist/commands/health/report-view-model.js +508 -0
  79. package/dist/commands/health/stash-exposure.js +1 -1
  80. package/dist/commands/health/surfaces.js +16 -56
  81. package/dist/commands/health/task-runs.js +3 -67
  82. package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
  83. package/dist/commands/health/types-improve.js +29 -0
  84. package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
  85. package/dist/commands/health/types-result.js +7 -0
  86. package/dist/commands/health/types-runs.js +4 -0
  87. package/dist/commands/health/types-session-log.js +4 -0
  88. package/dist/commands/health/types-windows.js +4 -0
  89. package/dist/commands/health/types.js +26 -21
  90. package/dist/commands/health/windows.js +2 -3
  91. package/dist/commands/health.js +296 -167
  92. package/dist/commands/improve/anti-collapse.js +5 -5
  93. package/dist/commands/improve/autonomy-gate.js +68 -0
  94. package/dist/commands/improve/collapse-detector.js +65 -52
  95. package/dist/commands/improve/consolidate/chunking.js +9 -7
  96. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  97. package/dist/commands/improve/consolidate/merge.js +4 -0
  98. package/dist/commands/improve/consolidate.js +454 -1354
  99. package/dist/commands/improve/content-hash.js +39 -0
  100. package/dist/commands/improve/distill/content-repair.js +4 -10
  101. package/dist/commands/improve/distill/promote-memory.js +89 -64
  102. package/dist/commands/improve/distill/quality-gate.js +118 -42
  103. package/dist/commands/improve/distill-guards.js +1 -1
  104. package/dist/commands/improve/distill-promotion-policy.js +33 -888
  105. package/dist/commands/improve/distill.js +607 -363
  106. package/dist/commands/improve/eligibility.js +165 -79
  107. package/dist/commands/improve/extract-cli.js +35 -126
  108. package/dist/commands/improve/extract-prompt.js +6 -35
  109. package/dist/commands/improve/extract.js +640 -391
  110. package/dist/commands/improve/feedback-valence.js +2 -12
  111. package/dist/commands/improve/improve-cli.js +134 -135
  112. package/dist/commands/improve/improve-result-file.js +30 -50
  113. package/dist/commands/improve/improve-run-types.js +4 -0
  114. package/dist/commands/improve/improve-strategies.js +135 -0
  115. package/dist/commands/improve/improve.js +904 -701
  116. package/dist/commands/improve/locks.js +64 -111
  117. package/dist/commands/improve/loop-stages.js +1110 -923
  118. package/dist/commands/improve/memory/derived-ref.js +124 -0
  119. package/dist/commands/improve/memory/memory-belief.js +79 -7
  120. package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
  121. package/dist/commands/improve/memory/memory-improve.js +25 -37
  122. package/dist/commands/improve/outcome-loop.js +25 -88
  123. package/dist/commands/improve/preparation.js +1034 -813
  124. package/dist/commands/improve/proactive-maintenance.js +34 -9
  125. package/dist/commands/improve/proposal-envelope.js +31 -0
  126. package/dist/commands/improve/reflect.js +983 -794
  127. package/dist/commands/improve/run-context.js +119 -0
  128. package/dist/commands/improve/salience.js +24 -127
  129. package/dist/commands/improve/session-asset.js +7 -3
  130. package/dist/commands/improve/shared.js +14 -34
  131. package/dist/commands/improve/source-identity.js +28 -0
  132. package/dist/commands/improve/triage.js +20 -17
  133. package/dist/commands/lint/base-linter.js +340 -313
  134. package/dist/commands/lint/env-key-rules.js +31 -47
  135. package/dist/commands/lint/index.js +185 -30
  136. package/dist/commands/{events.js → log.js} +28 -38
  137. package/dist/commands/migrate-cli.js +54 -0
  138. package/dist/commands/migration-tool.js +55 -0
  139. package/dist/commands/observability-cli.js +70 -208
  140. package/dist/commands/proposal/diff-format.js +50 -0
  141. package/dist/commands/proposal/drain-policies.js +0 -6
  142. package/dist/commands/proposal/drain.js +91 -40
  143. package/dist/commands/proposal/proposal-cli.js +134 -132
  144. package/dist/commands/proposal/proposal-types.js +56 -0
  145. package/dist/commands/proposal/proposal.js +83 -65
  146. package/dist/commands/proposal/propose-cli.js +88 -0
  147. package/dist/commands/proposal/propose.js +105 -88
  148. package/dist/commands/proposal/repository.js +1303 -278
  149. package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
  150. package/dist/commands/proposal/validators/proposal-validators.js +61 -12
  151. package/dist/commands/proposal/validators/proposals.js +6 -8
  152. package/dist/commands/read/curate.js +78 -73
  153. package/dist/commands/read/knowledge.js +510 -13
  154. package/dist/commands/read/registry-search.js +2 -2
  155. package/dist/commands/read/remember-cli.js +84 -15
  156. package/dist/commands/read/search-cli.js +203 -96
  157. package/dist/commands/read/search.js +126 -94
  158. package/dist/commands/read/show.js +226 -250
  159. package/dist/commands/registry-cli.js +34 -60
  160. package/dist/commands/remember.js +18 -57
  161. package/dist/commands/sources/add-cli.js +104 -49
  162. package/dist/commands/sources/bundle-cli.js +166 -0
  163. package/dist/commands/sources/bundle-config-ops.js +63 -0
  164. package/dist/commands/sources/info.js +27 -15
  165. package/dist/commands/sources/init.js +30 -40
  166. package/dist/commands/sources/installed-stashes.js +469 -172
  167. package/dist/commands/sources/migration-help.js +7 -4
  168. package/dist/commands/sources/schema-repair.js +10 -9
  169. package/dist/commands/sources/self-update.js +182 -121
  170. package/dist/commands/sources/source-add.js +169 -178
  171. package/dist/commands/sources/source-clone.js +144 -41
  172. package/dist/commands/sources/source-manage.js +94 -59
  173. package/dist/commands/sources/sources-cli.js +64 -205
  174. package/dist/commands/sources/stash-cli.js +91 -54
  175. package/dist/commands/sources/stash-skeleton.js +1 -1
  176. package/dist/commands/tasks/tasks-cli.js +106 -104
  177. package/dist/commands/tasks/tasks.js +445 -262
  178. package/dist/commands/workflow-cli.js +232 -121
  179. package/dist/core/action-contributors.js +1 -1
  180. package/dist/core/activation-policy.js +49 -0
  181. package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
  182. package/dist/core/adapter/adapters/akm-adapter.js +528 -0
  183. package/dist/core/adapter/adapters/akm-lint.js +392 -0
  184. package/dist/core/adapter/adapters/akm-metadata.js +387 -0
  185. package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
  186. package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
  187. package/dist/core/adapter/adapters/claude-adapter.js +61 -0
  188. package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
  189. package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
  190. package/dist/core/adapter/adapters/index.js +80 -0
  191. package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
  192. package/dist/core/adapter/adapters/okf-adapter.js +391 -0
  193. package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
  194. package/dist/core/adapter/adapters/shared.js +286 -0
  195. package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
  196. package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
  197. package/dist/core/adapter/bundle-adapter.js +4 -0
  198. package/dist/core/adapter/detect-adapter.js +17 -0
  199. package/dist/core/adapter/recognize-match.js +44 -0
  200. package/dist/core/adapter/registry.js +56 -0
  201. package/dist/core/adapter/types.js +4 -0
  202. package/dist/core/asset/akm-markdown.js +30 -0
  203. package/dist/core/asset/asset-placement.js +243 -0
  204. package/dist/core/asset/asset-ref.js +110 -79
  205. package/dist/core/asset/asset-serialize.js +20 -0
  206. package/dist/core/asset/frontmatter.js +28 -12
  207. package/dist/core/asset/markdown.js +40 -51
  208. package/dist/core/asset/resolve-ref.js +274 -0
  209. package/dist/core/asset/stash-meta.js +2 -2
  210. package/dist/core/bundle-id.js +51 -0
  211. package/dist/core/common.js +281 -86
  212. package/dist/core/config/config-io.js +42 -128
  213. package/dist/core/config/config-schema.js +233 -834
  214. package/dist/core/config/config-sources.js +162 -39
  215. package/dist/core/config/config-types.js +16 -11
  216. package/dist/core/config/config-version.js +29 -0
  217. package/dist/core/config/config-walker.js +126 -37
  218. package/dist/core/config/config.js +154 -331
  219. package/dist/core/config/deep-merge.js +41 -0
  220. package/dist/core/config/engine-semantics.js +28 -0
  221. package/dist/core/config/experimental.js +21 -0
  222. package/dist/core/config/schema/embedding.js +38 -0
  223. package/dist/core/config/schema/engines.js +116 -0
  224. package/dist/core/config/schema/experimental.js +47 -0
  225. package/dist/core/config/schema/feedback.js +31 -0
  226. package/dist/core/config/schema/improve-processes.js +389 -0
  227. package/dist/core/config/schema/improve.js +94 -0
  228. package/dist/core/config/schema/index-config.js +176 -0
  229. package/dist/core/config/schema/output.js +18 -0
  230. package/dist/core/config/schema/primitives.js +94 -0
  231. package/dist/core/config/schema/search.js +30 -0
  232. package/dist/core/config/schema/setup.js +18 -0
  233. package/dist/core/config/schema/sources-bundles.js +169 -0
  234. package/dist/core/config/schema/workflow.js +29 -0
  235. package/dist/core/env-secret-ref.js +155 -20
  236. package/dist/core/errors.js +17 -15
  237. package/dist/core/events-types.js +4 -0
  238. package/dist/core/events.js +46 -128
  239. package/dist/core/extra-params.js +62 -0
  240. package/dist/core/file-change.js +17 -0
  241. package/dist/core/file-lock.js +202 -57
  242. package/dist/core/fs-txn.js +392 -0
  243. package/dist/core/git-message.js +59 -0
  244. package/dist/core/improve-result.js +167 -0
  245. package/dist/core/json-schema.js +142 -0
  246. package/dist/core/lesson-lint.js +1 -17
  247. package/dist/core/logs-db.js +1 -1
  248. package/dist/core/maintenance-barrier.js +135 -0
  249. package/dist/core/migration-operation.js +44 -0
  250. package/dist/core/mutation-target.js +78 -0
  251. package/dist/core/paths.js +22 -25
  252. package/dist/core/platform.js +10 -0
  253. package/dist/core/recognition-util.js +128 -0
  254. package/dist/core/redaction.js +392 -0
  255. package/dist/core/standards/resolve-standards-context.js +36 -65
  256. package/dist/core/standards/resolve-stash-standards.js +2 -2
  257. package/dist/core/standards/resolve-type-conventions.js +5 -5
  258. package/dist/core/state/migrations.js +242 -11
  259. package/dist/core/state-db.js +98 -10
  260. package/dist/core/structured.js +1 -1
  261. package/dist/core/subprocess.js +303 -0
  262. package/dist/core/text-truncation.js +9 -5
  263. package/dist/core/time.js +20 -0
  264. package/dist/core/type-presentation.js +130 -0
  265. package/dist/core/warn.js +0 -3
  266. package/dist/core/write-source.js +834 -118
  267. package/dist/indexer/bundle-identity-guard.js +92 -0
  268. package/dist/indexer/db/graph-db.js +1 -25
  269. package/dist/indexer/db/llm-cache.js +1 -1
  270. package/dist/indexer/ensure-index.js +30 -9
  271. package/dist/indexer/graph/graph-boost.js +9 -30
  272. package/dist/indexer/graph/graph-extraction.js +41 -27
  273. package/dist/indexer/graph/graph-types.js +4 -0
  274. package/dist/indexer/index-writer-lock.js +93 -49
  275. package/dist/indexer/index-written-assets.js +100 -53
  276. package/dist/indexer/indexer.js +746 -329
  277. package/dist/indexer/init.js +18 -25
  278. package/dist/indexer/installations.js +142 -0
  279. package/dist/indexer/passes/dir-staleness.js +18 -10
  280. package/dist/indexer/passes/memory-inference.js +25 -15
  281. package/dist/indexer/passes/metadata.js +412 -243
  282. package/dist/indexer/scan/doc-to-entry.js +160 -0
  283. package/dist/indexer/scan/drain-dir.js +134 -0
  284. package/dist/indexer/search/db-search.js +292 -108
  285. package/dist/indexer/search/fts-query.js +64 -0
  286. package/dist/indexer/search/ranking-contributors.js +145 -25
  287. package/dist/indexer/search/ranking-types.js +4 -0
  288. package/dist/indexer/search/ranking.js +28 -71
  289. package/dist/indexer/search/search-attribution.js +67 -0
  290. package/dist/indexer/search/search-fields.js +18 -3
  291. package/dist/indexer/search/search-hit-enrichers.js +30 -40
  292. package/dist/indexer/search/search-source.js +157 -111
  293. package/dist/indexer/search/semantic-status.js +4 -1
  294. package/dist/indexer/usage/usage-events.js +10 -30
  295. package/dist/indexer/walk/file-context.js +3 -45
  296. package/dist/indexer/walk/matchers.js +42 -34
  297. package/dist/indexer/walk/path-resolver.js +11 -5
  298. package/dist/indexer/walk/walker.js +42 -14
  299. package/dist/integrations/agent/builder-shared.js +7 -0
  300. package/dist/integrations/agent/builders.js +5 -56
  301. package/dist/integrations/agent/config.js +3 -143
  302. package/dist/integrations/agent/detect.js +17 -2
  303. package/dist/integrations/agent/engine-resolution.js +231 -0
  304. package/dist/integrations/agent/index.js +1 -2
  305. package/dist/integrations/agent/model-aliases.js +16 -2
  306. package/dist/integrations/agent/profiles.js +36 -62
  307. package/dist/integrations/agent/prompts.js +46 -18
  308. package/dist/integrations/agent/runner-dispatch.js +93 -4
  309. package/dist/integrations/agent/runner.js +76 -208
  310. package/dist/integrations/agent/spawn.js +88 -196
  311. package/dist/integrations/harnesses/aider/agent-builder.js +114 -0
  312. package/dist/integrations/harnesses/aider/index.js +48 -0
  313. package/dist/integrations/harnesses/aider/result-extractor.js +53 -0
  314. package/dist/integrations/harnesses/amazonq/agent-builder.js +147 -0
  315. package/dist/integrations/harnesses/amazonq/index.js +45 -0
  316. package/dist/integrations/harnesses/amazonq/result-extractor.js +48 -0
  317. package/dist/integrations/harnesses/claude/agent-builder.js +46 -8
  318. package/dist/integrations/harnesses/claude/config-import.js +1 -3
  319. package/dist/integrations/harnesses/claude/index.js +24 -35
  320. package/dist/integrations/harnesses/claude/result-extractor.js +52 -0
  321. package/dist/integrations/harnesses/claude/session-log.js +27 -75
  322. package/dist/integrations/harnesses/codex/agent-builder.js +138 -0
  323. package/dist/integrations/harnesses/codex/index.js +52 -0
  324. package/dist/integrations/harnesses/codex/result-extractor.js +73 -0
  325. package/dist/integrations/harnesses/copilot/agent-builder.js +122 -0
  326. package/dist/integrations/harnesses/copilot/index.js +48 -0
  327. package/dist/integrations/harnesses/copilot/result-extractor.js +151 -0
  328. package/dist/integrations/harnesses/gemini/agent-builder.js +120 -0
  329. package/dist/integrations/harnesses/gemini/index.js +48 -0
  330. package/dist/integrations/harnesses/gemini/result-extractor.js +121 -0
  331. package/dist/integrations/harnesses/ids.js +24 -0
  332. package/dist/integrations/harnesses/index.js +54 -34
  333. package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
  334. package/dist/integrations/harnesses/opencode/config-import.js +1 -3
  335. package/dist/integrations/harnesses/opencode/index.js +14 -32
  336. package/dist/integrations/harnesses/opencode/session-log.js +67 -125
  337. package/dist/integrations/harnesses/opencode-sdk/harness.js +51 -0
  338. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +681 -108
  339. package/dist/integrations/harnesses/openhands/agent-builder.js +128 -0
  340. package/dist/integrations/harnesses/openhands/index.js +48 -0
  341. package/dist/integrations/harnesses/openhands/result-extractor.js +103 -0
  342. package/dist/integrations/harnesses/pi/agent-builder.js +97 -0
  343. package/dist/integrations/harnesses/pi/index.js +45 -0
  344. package/dist/integrations/harnesses/pi/result-extractor.js +135 -0
  345. package/dist/integrations/harnesses/shared.js +17 -0
  346. package/dist/integrations/harnesses/types.js +43 -32
  347. package/dist/integrations/lockfile.js +211 -24
  348. package/dist/integrations/session-logs/index.js +36 -39
  349. package/dist/integrations/session-logs/provider-base.js +113 -0
  350. package/dist/llm/client.js +182 -110
  351. package/dist/llm/embedders/deterministic.js +2 -2
  352. package/dist/llm/embedders/remote.js +21 -9
  353. package/dist/llm/feature-gate.js +17 -57
  354. package/dist/llm/graph-extract.js +12 -13
  355. package/dist/llm/index-passes.js +8 -42
  356. package/dist/llm/memory-infer.js +144 -1
  357. package/dist/llm/metadata-enhance.js +45 -30
  358. package/dist/llm/structured-call.js +16 -8
  359. package/dist/llm/usage-persist.js +30 -5
  360. package/dist/llm/usage-telemetry.js +59 -6
  361. package/dist/output/cli-hints.js +1 -2
  362. package/dist/output/command-registry.js +27 -0
  363. package/dist/output/context.js +22 -7
  364. package/dist/output/format-exempt.js +80 -0
  365. package/dist/output/generic-render.js +251 -0
  366. package/dist/output/html-render.js +11 -16
  367. package/dist/output/render-registry.js +57 -0
  368. package/dist/output/renderers.js +14 -279
  369. package/dist/output/shapes/curate.js +10 -1
  370. package/dist/output/shapes/events.js +12 -7
  371. package/dist/output/shapes/helpers.js +58 -84
  372. package/dist/output/shapes/passthrough.js +11 -39
  373. package/dist/output/shapes/proposal/producer.js +15 -7
  374. package/dist/output/shapes/registry.js +12 -6
  375. package/dist/output/shapes.js +0 -9
  376. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  377. package/dist/output/text/bundle-show.js +7 -0
  378. package/dist/output/text/command-format.js +562 -0
  379. package/dist/output/text/env.js +1 -3
  380. package/dist/output/text/events.js +8 -7
  381. package/dist/output/text/helpers.js +15 -1164
  382. package/dist/output/text/proposal/producer.js +4 -2
  383. package/dist/output/text/proposal-format.js +202 -0
  384. package/dist/output/text/registry-commands.js +1 -2
  385. package/dist/output/text/registry.js +12 -6
  386. package/dist/output/text/show-directives.js +117 -0
  387. package/dist/output/text/show-format.js +103 -0
  388. package/dist/output/text/sync.js +5 -0
  389. package/dist/output/text/workflow-format.js +332 -0
  390. package/dist/output/text/workflow.js +3 -2
  391. package/dist/output/text.js +10 -19
  392. package/dist/registry/factory.js +4 -6
  393. package/dist/registry/origin-resolve.js +16 -27
  394. package/dist/registry/providers/skills-sh.js +3 -3
  395. package/dist/registry/providers/static-index.js +15 -25
  396. package/dist/registry/resolve.js +43 -94
  397. package/dist/registry/semver.js +43 -0
  398. package/dist/runtime.js +81 -12
  399. package/dist/scripts/akm-migrate.js +35529 -0
  400. package/dist/setup/detect.js +5 -7
  401. package/dist/setup/detected-engines.js +136 -0
  402. package/dist/setup/engine-config.js +100 -0
  403. package/dist/setup/registry-stash-loader.js +3 -3
  404. package/dist/setup/semantic-assets.js +12 -9
  405. package/dist/setup/setup.js +444 -208
  406. package/dist/setup/steps/connection-shared.js +120 -0
  407. package/dist/setup/steps/connection.js +108 -305
  408. package/dist/setup/steps/platforms.js +13 -12
  409. package/dist/setup/steps/semantic.js +15 -3
  410. package/dist/setup/steps/sources.js +21 -15
  411. package/dist/setup/steps/stashdir.js +6 -4
  412. package/dist/setup/steps/tasks.js +236 -119
  413. package/dist/setup/steps.js +3 -2
  414. package/dist/sources/freshness.js +39 -0
  415. package/dist/sources/provider-factory.js +11 -17
  416. package/dist/sources/providers/filesystem.js +2 -3
  417. package/dist/sources/providers/git-install.js +278 -34
  418. package/dist/sources/providers/git-provider.js +54 -56
  419. package/dist/sources/providers/git-stash.js +420 -91
  420. package/dist/sources/providers/git.js +2 -2
  421. package/dist/sources/providers/npm.js +16 -19
  422. package/dist/sources/providers/provider-utils.js +47 -22
  423. package/dist/sources/providers/sync-from-ref.js +3 -9
  424. package/dist/sources/providers/website.js +2 -2
  425. package/dist/sources/resolve.js +11 -10
  426. package/dist/sources/snapshot-fetchers/types.js +4 -0
  427. package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
  428. package/dist/storage/database.js +60 -4
  429. package/dist/storage/engines/sqlite-migrations.js +156 -5
  430. package/dist/storage/locations.js +1 -2
  431. package/dist/storage/repositories/canaries-repository.js +1 -1
  432. package/dist/storage/repositories/events-repository.js +51 -11
  433. package/dist/storage/repositories/improve-runs-repository.js +6 -32
  434. package/dist/storage/repositories/index-connection.js +79 -0
  435. package/dist/storage/repositories/index-db.js +4 -3
  436. package/dist/storage/repositories/index-entries-repository.js +863 -0
  437. package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
  438. package/dist/storage/repositories/index-entry-types.js +4 -0
  439. package/dist/storage/repositories/index-fts-repository.js +167 -0
  440. package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
  441. package/dist/storage/repositories/index-meta-repository.js +49 -0
  442. package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
  443. package/dist/storage/repositories/index-sql.js +12 -0
  444. package/dist/storage/repositories/index-utility-repository.js +356 -0
  445. package/dist/storage/repositories/index-vec-repository.js +250 -0
  446. package/dist/storage/repositories/outcome-repository.js +119 -0
  447. package/dist/storage/repositories/proposals-repository.js +317 -75
  448. package/dist/storage/repositories/registry-cache.js +1 -1
  449. package/dist/storage/repositories/salience-repository.js +172 -0
  450. package/dist/storage/repositories/task-history-repository.js +110 -3
  451. package/dist/storage/repositories/workflow-runs-repository.js +240 -19
  452. package/dist/tasks/backends/cron.js +169 -46
  453. package/dist/tasks/backends/exec-utils.js +76 -3
  454. package/dist/tasks/backends/index.js +6 -9
  455. package/dist/tasks/backends/launchd.js +292 -55
  456. package/dist/tasks/backends/schtasks.js +557 -70
  457. package/dist/tasks/backends/types.js +4 -0
  458. package/dist/tasks/command-executable.js +93 -0
  459. package/dist/tasks/embedded.js +56 -38
  460. package/dist/tasks/parser.js +156 -64
  461. package/dist/tasks/resolve-akm-bin.js +144 -51
  462. package/dist/tasks/runner.js +377 -209
  463. package/dist/tasks/schedule.js +108 -19
  464. package/dist/tasks/scheduler-invocation.js +296 -0
  465. package/dist/tasks/schema.js +1 -1
  466. package/dist/tasks/task-id.js +35 -0
  467. package/dist/tasks/validator.js +30 -16
  468. package/dist/text-import-hook.mjs +1 -1
  469. package/dist/workflows/authoring/authoring.js +104 -43
  470. package/dist/workflows/authoring/scope-key.js +1 -1
  471. package/dist/workflows/cli.js +0 -16
  472. package/dist/workflows/concurrency-policy.js +15 -0
  473. package/dist/workflows/exec/brief.js +450 -0
  474. package/dist/workflows/exec/frozen-judge.js +47 -0
  475. package/dist/workflows/exec/native-executor.js +1038 -0
  476. package/dist/workflows/exec/param-secrets.js +115 -0
  477. package/dist/workflows/exec/report.js +1460 -0
  478. package/dist/workflows/exec/run-workflow.js +602 -0
  479. package/dist/workflows/exec/scheduler.js +71 -0
  480. package/dist/workflows/exec/step-work.js +1190 -0
  481. package/dist/workflows/exec/unit-writer.js +23 -0
  482. package/dist/workflows/exec/workflow-engine-gate.js +67 -0
  483. package/dist/workflows/exec/worktree.js +171 -0
  484. package/dist/workflows/ir/compile.js +246 -0
  485. package/dist/workflows/ir/freeze.js +233 -0
  486. package/dist/workflows/ir/params.js +54 -0
  487. package/dist/workflows/ir/plan-hash.js +68 -0
  488. package/dist/workflows/ir/schema.js +540 -0
  489. package/dist/workflows/parser.js +878 -304
  490. package/dist/workflows/program/expressions.js +181 -0
  491. package/dist/workflows/program/schema.js +51 -0
  492. package/dist/workflows/renderer.js +100 -45
  493. package/dist/workflows/resource-limits.js +22 -0
  494. package/dist/workflows/runtime/agent-identity.js +59 -14
  495. package/dist/workflows/runtime/checkin.js +1 -1
  496. package/dist/workflows/runtime/plan-classifier.js +131 -0
  497. package/dist/workflows/runtime/runs.js +376 -119
  498. package/dist/workflows/runtime/unit-checkin.js +45 -0
  499. package/dist/workflows/runtime/unit-phases.js +20 -0
  500. package/dist/workflows/runtime/workflow-asset-loader.js +241 -40
  501. package/dist/workflows/schema.js +1 -11
  502. package/dist/workflows/validate-summary.js +2 -3
  503. package/dist/workflows/validator.js +52 -30
  504. package/docs/README.md +42 -78
  505. package/docs/migration/README.md +8 -0
  506. package/docs/migration/release-notes/0.6.0.md +1 -1
  507. package/docs/migration/release-notes/0.7.0.md +9 -8
  508. package/docs/migration/release-notes/0.9.0.md +158 -14
  509. package/docs/migration/v0.7-to-v0.8.md +46 -47
  510. package/docs/migration/v0.8-to-v0.9.md +844 -0
  511. package/docs/reference/README.md +12 -0
  512. package/docs/reference/data-and-telemetry.md +333 -0
  513. package/package.json +21 -17
  514. package/schemas/akm-asset-envelope.json +93 -0
  515. package/schemas/akm-config.json +4636 -0
  516. package/schemas/akm-task.json +87 -0
  517. package/schemas/akm-workflow.json +373 -0
  518. package/dist/akm-migrate-storage +0 -38
  519. package/dist/assets/help/help-accept.md +0 -12
  520. package/dist/assets/help/help-improve.md +0 -84
  521. package/dist/assets/help/help-proposals.md +0 -17
  522. package/dist/assets/help/help-propose.md +0 -17
  523. package/dist/assets/help/help-reject.md +0 -11
  524. package/dist/assets/profiles/frequent.json +0 -13
  525. package/dist/assets/profiles/recombine-only.json +0 -21
  526. package/dist/assets/profiles/reflect-distill.json +0 -30
  527. package/dist/assets/profiles/synthesize.json +0 -15
  528. package/dist/assets/prompts/procedural-system.md +0 -44
  529. package/dist/assets/prompts/recombine-system.md +0 -40
  530. package/dist/assets/prompts/staleness-detect-system.md +0 -6
  531. package/dist/assets/tasks/core/backup.yml +0 -4
  532. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  533. package/dist/assets/templates/html/default.html +0 -78
  534. package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
  535. package/dist/assets/wiki/index-template.md +0 -12
  536. package/dist/assets/wiki/ingest-workflow-template.md +0 -83
  537. package/dist/assets/wiki/log-template.md +0 -8
  538. package/dist/assets/wiki/schema-template.md +0 -61
  539. package/dist/cli/config-migrate.js +0 -150
  540. package/dist/cli/config-validate.js +0 -39
  541. package/dist/commands/graph/graph-cli.js +0 -124
  542. package/dist/commands/graph/graph.js +0 -487
  543. package/dist/commands/improve/calibration.js +0 -161
  544. package/dist/commands/improve/dedup.js +0 -482
  545. package/dist/commands/improve/extract-watch.js +0 -140
  546. package/dist/commands/improve/hot-probation.js +0 -45
  547. package/dist/commands/improve/improve-auto-accept.js +0 -276
  548. package/dist/commands/improve/improve-profiles.js +0 -168
  549. package/dist/commands/improve/procedural.js +0 -398
  550. package/dist/commands/improve/recombine.js +0 -818
  551. package/dist/commands/improve/schema-similarity-gate.js +0 -168
  552. package/dist/commands/lint/agent-linter.js +0 -44
  553. package/dist/commands/lint/command-linter.js +0 -44
  554. package/dist/commands/lint/default-linter.js +0 -16
  555. package/dist/commands/lint/fact-linter.js +0 -39
  556. package/dist/commands/lint/knowledge-linter.js +0 -16
  557. package/dist/commands/lint/memory-linter.js +0 -61
  558. package/dist/commands/lint/registry.js +0 -41
  559. package/dist/commands/lint/skill-linter.js +0 -45
  560. package/dist/commands/lint/task-linter.js +0 -50
  561. package/dist/commands/lint/workflow-linter.js +0 -81
  562. package/dist/commands/proposal/legacy-import.js +0 -115
  563. package/dist/commands/sources/history.js +0 -196
  564. package/dist/commands/tasks/default-tasks.js +0 -186
  565. package/dist/commands/wiki-cli.js +0 -292
  566. package/dist/core/asset/asset-registry.js +0 -76
  567. package/dist/core/asset/asset-spec.js +0 -259
  568. package/dist/core/config/config-migration.js +0 -602
  569. package/dist/core/deep-merge.js +0 -38
  570. package/dist/core/eval/rank-metrics.js +0 -113
  571. package/dist/core/ripgrep/install.js +0 -163
  572. package/dist/core/ripgrep/resolve.js +0 -81
  573. package/dist/indexer/db/db.js +0 -1413
  574. package/dist/indexer/manifest.js +0 -170
  575. package/dist/indexer/passes/metadata-contributors.js +0 -31
  576. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
  577. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -49
  578. package/dist/llm/call-ai.js +0 -62
  579. package/dist/llm/memory-infer-impl.js +0 -138
  580. package/dist/output/shapes/distill.js +0 -14
  581. package/dist/output/shapes/history.js +0 -11
  582. package/dist/output/text/distill.js +0 -6
  583. package/dist/output/text/enable-disable.js +0 -8
  584. package/dist/output/text/history.js +0 -6
  585. package/dist/output/text/wiki.js +0 -16
  586. package/dist/registry/build-index.js +0 -386
  587. package/dist/scripts/migrate-storage.js +0 -19108
  588. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -9411
  589. package/dist/scripts/migrations/v16-to-v17.js +0 -141
  590. package/dist/setup/legacy-config.js +0 -106
  591. package/dist/storage/repositories/consolidation-repository.js +0 -38
  592. package/dist/storage/repositories/recombine-repository.js +0 -213
  593. package/dist/wiki/wiki-templates.js +0 -15
  594. package/dist/wiki/wiki.js +0 -1012
  595. package/dist/workflows/db.js +0 -215
  596. package/docs/data-and-telemetry.md +0 -226
  597. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
  598. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
@@ -28,8 +28,69 @@
28
28
  * (X2) can wrap `executeRunner` without changing this contract.
29
29
  */
30
30
  import { assertNever } from "../../core/assert.js";
31
- import { runOpencodeSdk } from "../harnesses/opencode-sdk/index.js";
31
+ import { collectSensitiveValues, isEnvPassthroughValueSafeToExpose, redactSensitiveText, redactSensitiveValue, } from "../../core/redaction.js";
32
+ import { closeServer as disposeOpencodeSdkServers, runOpencodeSdk } from "../harnesses/opencode-sdk/sdk-runner.js";
33
+ import { materializeLlmConnection } from "./engine-resolution.js";
34
+ import { materializeLlmRunnerConnection } from "./runner.js";
32
35
  import { runAgent } from "./spawn.js";
36
+ /**
37
+ * Release every long-lived resource the dispatch runners CACHE for reuse, so a
38
+ * one-shot process (the CLI) can exit cleanly once dispatching is done.
39
+ *
40
+ * The `sdk` runner keeps a per-material registry of `opencode serve` CHILD
41
+ * PROCESSES (see `opencode-sdk/sdk-runner.ts`), started lazily and reused
42
+ * across units within a process. Each live child is an OS handle that keeps
43
+ * Bun's event loop open — and the registry's own teardown is wired ONLY to
44
+ * `process.once('exit')`, which never fires while such a child holds the loop
45
+ * open. That is a deadlock: a successful `akm workflow run` that dispatched via
46
+ * the SDK path would hang the CLI (owner finding 4) because the process is
47
+ * never idle enough for the exit hook to run and close the children it is
48
+ * waiting on.
49
+ *
50
+ * The CLI composition root and workflow engine call this in `finally` blocks to
51
+ * drain the registry deterministically before relying on the event loop. Started
52
+ * servers close synchronously; in-flight starts are awaited and closed on
53
+ * arrival. When no SDK server was started this is an idempotent no-op.
54
+ */
55
+ export async function disposeDispatchResources() {
56
+ await disposeOpencodeSdkServers();
57
+ }
58
+ /** Collect every materialized value that can reach one runner dispatch. */
59
+ export function collectDispatchSensitiveValues(spec, opts, envSource = opts.envSource ?? process.env) {
60
+ const values = new Set();
61
+ const add = (value) => {
62
+ if (value !== undefined && value.length > 0)
63
+ values.add(value);
64
+ };
65
+ const addConnection = (connection) => add(connection?.apiKey);
66
+ if (spec.kind === "llm")
67
+ addConnection(spec.connection);
68
+ if (spec.kind === "sdk")
69
+ addConnection(spec.fallbackConnection);
70
+ if (spec.kind !== "llm") {
71
+ for (const value of Object.values(spec.profile.env ?? {}))
72
+ add(value);
73
+ for (const name of spec.profile.envPassthrough) {
74
+ const value = envSource[name];
75
+ if (!isEnvPassthroughValueSafeToExpose(name, value))
76
+ add(value);
77
+ }
78
+ }
79
+ for (const [name, value] of Object.entries(opts.env ?? {})) {
80
+ if (!isEnvPassthroughValueSafeToExpose(name, value))
81
+ add(value);
82
+ }
83
+ return collectSensitiveValues(values);
84
+ }
85
+ function redactResult(result, sensitiveValues) {
86
+ return {
87
+ ...result,
88
+ stdout: redactSensitiveText(result.stdout, sensitiveValues),
89
+ stderr: redactSensitiveText(result.stderr, sensitiveValues),
90
+ ...(result.error !== undefined ? { error: redactSensitiveText(result.error, sensitiveValues) } : {}),
91
+ ...(result.parsed !== undefined ? { parsed: redactSensitiveValue(result.parsed, sensitiveValues) } : {}),
92
+ };
93
+ }
33
94
  /**
34
95
  * Dispatch a {@link RunnerSpec} to its runner and return the raw
35
96
  * {@link AgentRunResult}. `opts` is the {@link RunAgentOptions} for the profile
@@ -37,23 +98,51 @@ import { runAgent } from "./spawn.js";
37
98
  * its exact option set (incl. any `timeoutMs` the caller chose to apply).
38
99
  */
39
100
  export async function executeRunner(spec, prompt, opts, seams = {}) {
101
+ const withSpecOptions = (timeoutMs, workspace) => ({
102
+ ...opts,
103
+ ...(Object.hasOwn(opts, "timeoutMs") ? {} : timeoutMs !== undefined ? { timeoutMs } : {}),
104
+ ...(opts.cwd === undefined && workspace ? { cwd: workspace } : {}),
105
+ });
106
+ let result;
107
+ const dispatchSensitiveValues = [];
40
108
  switch (spec.kind) {
41
109
  case "llm": {
42
110
  if (!seams.llm) {
43
111
  throw new Error("executeRunner: an `llm` runner requires a `seams.llm` handler (no default LLM dispatch).");
44
112
  }
45
- return seams.llm(spec, prompt);
113
+ const connection = materializeLlmRunnerConnection(spec);
114
+ if (connection.apiKey)
115
+ dispatchSensitiveValues.push(connection.apiKey);
116
+ result = await seams.llm({ ...spec, connection }, prompt, withSpecOptions(spec.timeoutMs));
117
+ break;
46
118
  }
47
119
  case "agent": {
48
120
  const run = seams.runAgent ?? runAgent;
49
- return run(spec.profile, prompt, opts);
121
+ result = await run(spec.profile, prompt, withSpecOptions(spec.timeoutMs, spec.profile.workspace));
122
+ break;
50
123
  }
51
124
  case "sdk": {
52
125
  const run = seams.runSdk ?? runOpencodeSdk;
53
- return run(spec.profile, prompt, opts);
126
+ const fallbackConnection = spec.fallbackConnection
127
+ ? materializeLlmConnection({
128
+ engine: spec.engine ?? "unnamed-sdk-fallback",
129
+ connection: spec.fallbackConnection,
130
+ ...(spec.fallbackCredential ? { credential: spec.fallbackCredential } : {}),
131
+ timeoutMs: spec.fallbackTimeoutMs !== undefined
132
+ ? spec.fallbackTimeoutMs
133
+ : Object.hasOwn(spec.fallbackConnection, "timeoutMs")
134
+ ? (spec.fallbackConnection.timeoutMs ?? null)
135
+ : null,
136
+ })
137
+ : undefined;
138
+ if (fallbackConnection?.apiKey)
139
+ dispatchSensitiveValues.push(fallbackConnection.apiKey);
140
+ result = await run(spec.profile, prompt, withSpecOptions(spec.timeoutMs, spec.profile.workspace), fallbackConnection);
141
+ break;
54
142
  }
55
143
  default:
56
144
  // Exhaustiveness arm: a 4th RunnerSpec kind becomes a compile error here.
57
145
  return assertNever(spec);
58
146
  }
147
+ return redactResult(result, [...collectDispatchSensitiveValues(spec, opts), ...dispatchSensitiveValues]);
59
148
  }
@@ -2,230 +2,98 @@
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
  import { ConfigError } from "../../core/errors.js";
5
- import { warn } from "../../core/warn.js";
6
- // ── RunnerSpec capability predicates (H1) ───────────────────────────────────
7
- // The `RunnerSpec` union is dispatched ad-hoc across the improve slice. These
8
- // predicates co-locate the capability questions with the union definition so
9
- // callers stop hand-inlining `kind !== "llm"` (which couples the call site to
10
- // the exact shape of the union). They are typed as TypeScript type guards so
11
- // narrowing flows through to the `connection` / `profile` accessors.
12
- /** The in-tree LLM HTTP runner (`chatCompletion`); has no filesystem access. */
5
+ import { materializeLlmConnection, resolveEngine, resolveLlmEngineUse, } from "./engine-resolution.js";
6
+ import { resolveModel } from "./model-aliases.js";
7
+ /** Resolve the current credential value for one frozen LLM runner at dispatch. */
8
+ export function materializeLlmRunnerConnection(runner) {
9
+ const connectionWithLegacyTimeout = runner.connection;
10
+ const timeoutMs = runner.timeoutMs !== undefined
11
+ ? runner.timeoutMs
12
+ : Object.hasOwn(connectionWithLegacyTimeout, "timeoutMs")
13
+ ? (connectionWithLegacyTimeout.timeoutMs ?? null)
14
+ : null;
15
+ return materializeLlmConnection({
16
+ engine: runner.engine ?? "unnamed",
17
+ connection: runner.connection,
18
+ ...(runner.credential ? { credential: runner.credential } : {}),
19
+ timeoutMs,
20
+ });
21
+ }
13
22
  export function runnerIsLlm(runner) {
14
23
  return runner.kind === "llm";
15
24
  }
16
- /**
17
- * Whether this runner can honour the file-write contract. Agent CLI + OpenCode
18
- * SDK runners both have filesystem access; the direct LLM HTTP runner does NOT
19
- * (see `src/llm/call-ai.ts`). Equivalent to `!runnerIsLlm(runner)` but names
20
- * the capability the callers actually care about.
21
- */
22
25
  export function runnerSupportsFileWrite(runner) {
23
26
  return runner.kind !== "llm";
24
27
  }
25
- function resolveEffectiveMode(entry, profileName, config) {
26
- if (entry.mode)
27
- return entry.mode;
28
- // Infer from profile pool when profile is specified
29
- if (profileName) {
30
- if (config.profiles?.llm?.[profileName])
31
- return "llm";
32
- const agentProfile = config.profiles?.agent?.[profileName];
33
- if (agentProfile) {
34
- return agentProfile.platform === "opencode-sdk" ? "sdk" : "agent";
35
- }
36
- }
37
- // Fall back to defaults
38
- if (config.defaults?.llm)
39
- return "llm";
40
- if (config.defaults?.agent)
41
- return "agent";
42
- return "llm";
43
- }
44
- function resolveProfileName(entry, mode, config) {
45
- if (entry.profile)
46
- return entry.profile;
47
- if (mode === "llm") {
48
- const defaultName = config.defaults?.llm;
49
- if (defaultName)
50
- return defaultName;
51
- throw new ConfigError(`No LLM profile configured. Set defaults.llm in config or specify profile in the process entry.`, "LLM_NOT_CONFIGURED", "Run `akm setup` or define a profile under `profiles.llm` and set `defaults.llm`.");
52
- }
53
- const defaultName = config.defaults?.agent;
54
- if (defaultName)
55
- return defaultName;
56
- throw new ConfigError(`No agent profile configured. Set defaults.agent in config or specify profile in the process entry.`, "INVALID_CONFIG_FILE", "Run `akm setup` to configure an agent profile, or add one under `profiles.agent`.");
57
- }
58
- function buildLlmRunnerSpec(profileName, timeoutMs, config) {
59
- const profile = config.profiles?.llm?.[profileName];
60
- if (!profile) {
61
- throw new ConfigError(`LLM profile "${profileName}" not found in profiles.llm.`, "LLM_NOT_CONFIGURED", `Available profiles: ${Object.keys(config.profiles?.llm ?? {}).join(", ") || "none"}. Run \`akm setup\` to configure.`);
62
- }
28
+ /** Resolve the configured LLM default without ever consulting retired profiles. */
29
+ export function resolveDefaultLlmRunner(config, timeoutMs) {
30
+ const resolved = resolveLlmEngineUse(config, [], { optional: true });
31
+ if (!resolved)
32
+ return null;
63
33
  return {
64
34
  kind: "llm",
65
- connection: profile,
66
- ...(typeof timeoutMs === "number" ? { timeoutMs } : {}),
67
- };
68
- }
69
- function buildAgentRunnerSpec(kind, profileName, timeoutMs, config) {
70
- const profileConfig = config.profiles?.agent?.[profileName];
71
- if (!profileConfig) {
72
- throw new ConfigError(`Agent profile "${profileName}" not found in profiles.agent.`, "INVALID_CONFIG_FILE", `Available profiles: ${Object.keys(config.profiles?.agent ?? {}).join(", ") || "none"}. Run \`akm setup\` to configure.`);
73
- }
74
- // Validate mode/platform consistency
75
- if (kind === "sdk" && profileConfig.platform !== "opencode-sdk") {
76
- throw new ConfigError(`Mode "sdk" requires platform "opencode-sdk", but profiles.agent["${profileName}"].platform is "${profileConfig.platform}".`, "INVALID_CONFIG_FILE");
77
- }
78
- if (kind === "agent" && profileConfig.platform === "opencode-sdk") {
79
- throw new ConfigError(`Mode "agent" requires platform "opencode" or "claude", but profiles.agent["${profileName}"].platform is "opencode-sdk".`, "INVALID_CONFIG_FILE");
80
- }
81
- const agentProfile = {
82
- name: profileName,
83
- bin: profileConfig.bin ?? profileName,
84
- args: profileConfig.args ?? [],
85
- stdio: "captured",
86
- envPassthrough: [],
87
- parseOutput: "text",
88
- ...(profileConfig.model ? { model: profileConfig.model } : {}),
89
- ...(profileConfig.workspace ? { workspace: profileConfig.workspace } : {}),
90
- };
91
- return {
92
- kind,
93
- profile: agentProfile,
94
- ...(typeof timeoutMs === "number" ? { timeoutMs } : {}),
35
+ engine: resolved.engine,
36
+ connection: resolved.connection,
37
+ ...(resolved.credential ? { credential: resolved.credential } : {}),
38
+ ...(timeoutMs !== undefined ? { timeoutMs } : { timeoutMs: resolved.timeoutMs }),
95
39
  };
96
40
  }
97
- /**
98
- * Resolve the runner used for "validation" passes on the `improve` section
99
- * (Advantage D3 / Phase 4B — third model tier).
100
- *
101
- * Look-up order:
102
- * 1. `profiles.improve.default.processes.validation` (preferred — lets users
103
- * wire a lower-cost classifier model for staleness detection, confidence
104
- * scoring, and lesson classification).
105
- * 2. `defaults.llm` as a final fallback so callers always get a usable
106
- * runner when any LLM is configured.
107
- *
108
- * Returns `null` when neither is configured (callers may then skip the
109
- * validation pass rather than throwing).
110
- */
111
- /**
112
- * Shared resolution path for the `validation` and `triage judgment` tiers,
113
- * both of which take a `{ mode?, profile?, timeoutMs? }`-shaped block, attempt
114
- * to resolve it via {@link resolveImproveProcessRunnerFromProfile}, and
115
- * otherwise fall back to an `llm` runner built from `defaults.llm`.
116
- *
117
- * @param block the `{ mode?, profile?, timeoutMs? }` subset to resolve.
118
- * @param config the active AKM config.
119
- * @param opts.fallbackTimeoutMs timeout applied to the `defaults.llm` fallback
120
- * runner (validation passes `undefined`; triage forwards `block.timeoutMs`).
121
- * @param opts.suppressLlmFallbackForExplicitMode when `true` and the block
122
- * explicitly sets `mode: "agent"` or `"sdk"`, do NOT silently fall back
123
- * to `defaults.llm` if the profile resolver returns `null` or throws —
124
- * return `null` instead and emit a `warn(...)` (see FIX 8). Validation
125
- * passes `false` to preserve its always-fallback behavior.
126
- */
127
- function resolveProcessRunnerWithLlmFallback(block, config, opts) {
128
- const explicitNonLlmMode = block?.mode === "agent" || block?.mode === "sdk";
129
- if (block && (block.mode || block.profile)) {
130
- try {
131
- const spec = resolveImproveProcessRunnerFromProfile(block, config);
132
- if (spec)
133
- return spec;
41
+ /** Resolve a triage judgment using judgment -> triage -> strategy -> defaults.llmEngine precedence. */
42
+ export function resolveTriageJudgmentRunner(judgment, config, triage, strategy) {
43
+ const layers = [strategy ?? {}, triage ?? {}, judgment ?? {}];
44
+ const selectedEngine = judgment?.engine ?? triage?.engine ?? strategy?.engine ?? config.defaults?.llmEngine;
45
+ if (selectedEngine) {
46
+ const runner = resolveEngine(selectedEngine, config);
47
+ if (runner.kind === "llm") {
48
+ const resolved = resolveLlmEngineUse(config, layers);
49
+ return {
50
+ kind: "llm",
51
+ engine: resolved.engine,
52
+ connection: resolved.connection,
53
+ ...(resolved.credential ? { credential: resolved.credential } : {}),
54
+ timeoutMs: resolved.timeoutMs,
55
+ };
134
56
  }
135
- catch {
136
- // Fall through to defaults.llm below (unless suppressed for explicit modes).
137
- }
138
- // FIX 8: an EXPLICIT agent/sdk request must not be silently downgraded to
139
- // llm. When the profile resolver could not produce a runner, surface the
140
- // misconfiguration and let callers skip this tier rather than substituting
141
- // an llm judge.
142
- if (opts.suppressLlmFallbackForExplicitMode && explicitNonLlmMode) {
143
- warn(`[akm] Could not resolve the "${block?.mode}" judgment profile; ` +
144
- `skipping the judgment tier instead of falling back to an llm judge. ` +
145
- `Check profiles.agent and the judgment profile/mode configuration.`);
146
- return null;
147
- }
148
- }
149
- const defaultLlm = config.defaults?.llm;
150
- if (defaultLlm) {
151
- try {
152
- return buildLlmRunnerSpec(defaultLlm, opts.fallbackTimeoutMs, config);
153
- }
154
- catch {
155
- return null;
57
+ const effectiveLlmOverrides = [...layers].reverse().find((layer) => layer.llm !== undefined)?.llm;
58
+ if (effectiveLlmOverrides) {
59
+ throw new ConfigError(`Triage judgment engine "${selectedEngine}" is an agent engine and cannot receive llm overrides.`, "INVALID_CONFIG_FILE");
156
60
  }
61
+ const model = [...layers].reverse().find((layer) => layer.model !== undefined)?.model;
62
+ const profile = model
63
+ ? {
64
+ ...runner.profile,
65
+ model: resolveModel(model, runner.profile.platform ?? runner.profile.name, runner.profile.modelAliases, runner.profile.globalModelAliases),
66
+ modelIsExact: true,
67
+ }
68
+ : runner.profile;
69
+ const timeoutLayer = [...layers].reverse().find((layer) => Object.hasOwn(layer, "timeoutMs"));
70
+ return {
71
+ ...runner,
72
+ profile,
73
+ ...(timeoutLayer ? { timeoutMs: timeoutLayer.timeoutMs ?? null } : {}),
74
+ };
157
75
  }
158
76
  return null;
159
77
  }
160
- /**
161
- * Build the tool-less HTTP runner from `defaults.llm`, or `null` when unset.
162
- * The unattended-improve reflect pin (meta-review 07 Chain-G / P1.3) uses this
163
- * as the mandatory downgrade target when config would otherwise hand reflect a
164
- * tool-capable (agent/SDK) runner in a scheduled run. Throws ConfigError when
165
- * `defaults.llm` names a profile that does not exist.
166
- */
167
- export function resolveDefaultLlmRunner(config, timeoutMs) {
168
- const name = config.defaults?.llm;
169
- if (!name)
170
- return null;
171
- return buildLlmRunnerSpec(name, timeoutMs, config);
172
- }
173
- export function resolveValidationRunner(config) {
174
- const validation = config.profiles?.improve?.default?.processes?.validation;
175
- const block = validation && validation.enabled !== false ? validation : undefined;
176
- return resolveProcessRunnerWithLlmFallback(block, config, {
177
- fallbackTimeoutMs: undefined,
178
- suppressLlmFallbackForExplicitMode: false,
179
- });
78
+ export function resolveImproveProcessLlmUse(config, strategy, processName, options = {}) {
79
+ const process = strategy?.processes?.[processName];
80
+ const layers = strategy ? [strategy, process ?? {}] : [];
81
+ return options.optional
82
+ ? resolveLlmEngineUse(config, layers, { optional: true })
83
+ : resolveLlmEngineUse(config, layers);
180
84
  }
181
- /**
182
- * Resolve the runner for the triage judgment tier (Proposal-Queue Triage,
183
- * Phase 3). The `judgment` block is a `{ mode?, profile?, timeoutMs? }` subset
184
- * compatible with {@link ImproveProcessConfig}, so it resolves through the same
185
- * {@link resolveImproveProcessRunnerFromProfile} path.
186
- *
187
- * Mirrors {@link resolveValidationRunner}'s `defaults.llm` fallback only for
188
- * the unset/`llm` case: when the block sets neither `mode` nor `profile` (so
189
- * the profile resolver returns `null`) or `mode: "llm"`, fall back to an `llm`
190
- * runner built from `defaults.llm` so `judgment.mode: llm` defaults are honored
191
- * (§14). However (FIX 8) when the caller EXPLICITLY sets `mode: "agent"` or
192
- * `"sdk"` and the profile resolver returns `null` or throws, do NOT downgrade
193
- * to an llm judge — return `null` (callers skip the judgment tier and emit
194
- * `triage_deferred`) and emit a `warn(...)`. Returns `null` when nothing is
195
- * configured.
196
- */
197
- export function resolveTriageJudgmentRunner(judgment, config) {
198
- return resolveProcessRunnerWithLlmFallback(judgment, config, {
199
- fallbackTimeoutMs: judgment?.timeoutMs,
200
- suppressLlmFallbackForExplicitMode: true,
201
- });
202
- }
203
- export function resolveRunner(mode, profileName, config) {
204
- if (mode === "llm")
205
- return buildLlmRunnerSpec(profileName, undefined, config);
206
- return buildAgentRunnerSpec(mode, profileName, undefined, config);
207
- }
208
- /**
209
- * Resolve a RunnerSpec from an improve-profile process entry. Returns `null`
210
- * when the entry is absent or provides no overrides — callers should fall
211
- * back to the default per-process runner resolution path.
212
- */
213
- export function resolveImproveProcessRunnerFromProfile(processConfig, config) {
214
- if (!processConfig)
85
+ /** Resolve the LLM runner selected by an improve strategy and process without reading credentials. */
86
+ export function resolveImproveProcessRunner(strategy, processName, config) {
87
+ if (!strategy)
215
88
  return null;
216
- const { mode: explicitMode, profile, timeoutMs } = processConfig;
217
- if (!explicitMode && !profile)
89
+ const resolved = resolveImproveProcessLlmUse(config, strategy, processName, { optional: true });
90
+ if (!resolved)
218
91
  return null;
219
- const mode = explicitMode ?? resolveEffectiveMode(processConfig, profile, config);
220
- const profileName = profile ?? resolveProfileName(processConfig, mode, config);
221
- if (mode === "llm") {
222
- return buildLlmRunnerSpec(profileName, timeoutMs, config);
223
- }
224
- if (mode === "agent" || mode === "sdk") {
225
- return buildAgentRunnerSpec(mode, profileName, timeoutMs, config);
226
- }
227
- return null;
92
+ return {
93
+ kind: "llm",
94
+ engine: resolved.engine,
95
+ connection: resolved.connection,
96
+ ...(resolved.credential ? { credential: resolved.credential } : {}),
97
+ timeoutMs: resolved.timeoutMs,
98
+ };
228
99
  }
229
- // Re-export `isProcessEnabled` from feature-gate.ts so callers that previously
230
- // imported it from runner.ts continue to work.
231
- export { isProcessEnabled } from "../../llm/feature-gate.js";