akm-cli 0.10.261012-beta → 0.10.261014-beta

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 (518) hide show
  1. package/CHANGELOG.md +710 -3
  2. package/README.md +15 -0
  3. package/SECURITY.md +11 -10
  4. package/STABILITY.md +47 -51
  5. package/dist/assets/hints/cli-hints-full.md +21 -19
  6. package/dist/assets/hints/cli-hints-short.md +3 -4
  7. package/dist/assets/opencode/akm-plugin.js +177 -0
  8. package/dist/assets/stash-skeleton/README.md +1 -1
  9. package/dist/assets/tasks/core/improve.yml +1 -1
  10. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +1 -1
  11. package/dist/assets/ui/config.js +27 -10
  12. package/dist/assets/workflows/workflow-template.md +2 -2
  13. package/dist/cli/clack.js +3 -1
  14. package/dist/cli/selection.js +33 -0
  15. package/dist/cli/shared.js +14 -1
  16. package/dist/cli/unknown-flags.js +6 -37
  17. package/dist/cli.js +69 -48
  18. package/dist/commands/agent/agent-dispatch.js +17 -25
  19. package/dist/commands/agent/contribute-cli.js +9 -8
  20. package/dist/commands/command/command-cli.js +4 -8
  21. package/dist/commands/command/command-execution.js +25 -39
  22. package/dist/commands/command/execution-source-loader.js +10 -14
  23. package/dist/commands/completions.js +1 -1
  24. package/dist/commands/config-cli.js +14 -5
  25. package/dist/commands/env/child-env.js +12 -14
  26. package/dist/commands/env/env-binding.js +47 -58
  27. package/dist/commands/env/env-cli.js +22 -24
  28. package/dist/commands/env/env.js +10 -58
  29. package/dist/commands/env/secret-cli.js +11 -29
  30. package/dist/commands/env/secret.js +3 -10
  31. package/dist/commands/health/checks.js +10 -849
  32. package/dist/commands/health/connections-and-harnesses-check.js +109 -0
  33. package/dist/commands/health/egress.js +3 -3
  34. package/dist/commands/health/html-report.js +9 -10
  35. package/dist/commands/health/plugin-staleness.js +18 -11
  36. package/dist/commands/health/report-view-model.js +16 -12
  37. package/dist/commands/health/scheduler-binary.js +1 -1
  38. package/dist/commands/health/semantic-search-check.js +85 -0
  39. package/dist/commands/health/type-directory-check.js +0 -3
  40. package/dist/commands/health.js +30 -42
  41. package/dist/commands/improve/consolidate/pair-pass.js +10 -25
  42. package/dist/commands/improve/consolidate.js +10 -15
  43. package/dist/commands/improve/distill.js +5 -17
  44. package/dist/commands/improve/eligibility.js +1 -3
  45. package/dist/commands/improve/execution.js +37 -40
  46. package/dist/commands/improve/extract-cli.js +6 -11
  47. package/dist/commands/improve/extract-prompt.js +2 -2
  48. package/dist/commands/improve/extract.js +67 -97
  49. package/dist/commands/improve/improve-cli.js +22 -128
  50. package/dist/commands/improve/improve-report.js +1 -1
  51. package/dist/commands/improve/improve-strategies.js +25 -108
  52. package/dist/commands/improve/improve.js +10 -14
  53. package/dist/commands/improve/loop-stages.js +3 -0
  54. package/dist/commands/improve/memory/memory-improve.js +1 -1
  55. package/dist/commands/improve/preparation.js +8 -13
  56. package/dist/commands/improve/reflect.js +203 -332
  57. package/dist/commands/improve/retrieval-scope.js +1 -1
  58. package/dist/commands/improve/session-asset.js +3 -2
  59. package/dist/commands/improve/stage.js +87 -115
  60. package/dist/commands/lint/base-linter.js +3 -3
  61. package/dist/commands/lint/env-key-rules.js +7 -6
  62. package/dist/commands/lint/index.js +3 -3
  63. package/dist/commands/models-cli.js +103 -63
  64. package/dist/commands/proposal/drain.js +26 -39
  65. package/dist/commands/proposal/proposal-cli.js +14 -18
  66. package/dist/commands/proposal/propose-cli.js +4 -2
  67. package/dist/commands/proposal/propose.js +37 -64
  68. package/dist/commands/proposal/repository.js +17 -17
  69. package/dist/commands/proposal/validators/proposal-validators.js +3 -6
  70. package/dist/commands/read/curate.js +10 -6
  71. package/dist/commands/read/registry-search.js +2 -48
  72. package/dist/commands/read/search-cli.js +1 -8
  73. package/dist/commands/read/search.js +5 -6
  74. package/dist/commands/read/show.js +6 -29
  75. package/dist/commands/remember.js +25 -40
  76. package/dist/commands/sources/add-cli.js +8 -63
  77. package/dist/commands/sources/bundle-cli.js +8 -9
  78. package/dist/commands/sources/bundle-config-ops.js +2 -2
  79. package/dist/commands/sources/info.js +12 -1
  80. package/dist/commands/sources/init.js +1 -1
  81. package/dist/commands/sources/installed-stashes.js +119 -63
  82. package/dist/commands/sources/migration-help.js +1 -1
  83. package/dist/commands/sources/plugin-upgrade.js +8 -15
  84. package/dist/commands/sources/schema-repair.js +4 -10
  85. package/dist/commands/sources/source-add.js +2 -2
  86. package/dist/commands/sources/source-clone.js +31 -7
  87. package/dist/commands/sources/source-manage.js +4 -4
  88. package/dist/commands/targets.js +175 -0
  89. package/dist/commands/tasks/explain.js +104 -69
  90. package/dist/commands/tasks/tasks-cli.js +9 -11
  91. package/dist/commands/tasks/tasks.js +75 -97
  92. package/dist/commands/ui/api.js +11 -3
  93. package/dist/commands/ui/redact.js +5 -31
  94. package/dist/commands/ui/workspace-actions.js +1 -1
  95. package/dist/commands/workflow/plan.js +48 -9
  96. package/dist/commands/workflow-cli.js +40 -45
  97. package/dist/core/adapter/adapters/agent-skills-adapter.js +10 -11
  98. package/dist/core/adapter/adapters/akm-adapter.js +36 -41
  99. package/dist/core/adapter/adapters/akm-lint.js +10 -12
  100. package/dist/core/adapter/adapters/akm-metadata.js +2 -2
  101. package/dist/core/adapter/adapters/akm-task-adapter.js +8 -9
  102. package/dist/core/adapter/adapters/akm-workflow-adapter.js +5 -5
  103. package/dist/core/adapter/adapters/claude-adapter.js +1 -1
  104. package/dist/core/adapter/adapters/dotenv-adapter.js +7 -6
  105. package/dist/core/adapter/adapters/generic-files-adapter.js +5 -5
  106. package/dist/core/adapter/adapters/index.js +3 -4
  107. package/dist/core/adapter/adapters/llm-wiki-adapter.js +12 -14
  108. package/dist/core/adapter/adapters/okf-adapter.js +8 -10
  109. package/dist/core/adapter/adapters/opencode-adapter.js +1 -1
  110. package/dist/core/adapter/adapters/shared.js +3 -3
  111. package/dist/core/adapter/adapters/tool-dir-shared.js +7 -25
  112. package/dist/core/adapter/adapters/website-snapshot-adapter.js +3 -3
  113. package/dist/core/adapter/detect-adapter.js +1 -1
  114. package/dist/core/adapter/execution-source.js +13 -35
  115. package/dist/core/adapter/registry.js +1 -1
  116. package/dist/core/adapter/validate-context.js +2 -4
  117. package/dist/core/asset/asset-placement.js +1 -1
  118. package/dist/core/asset/asset-ref.js +3 -3
  119. package/dist/core/asset/resolve-ref.js +5 -0
  120. package/dist/core/bundle-rename.js +12 -4
  121. package/dist/core/closest-match.js +37 -0
  122. package/dist/core/common.js +37 -57
  123. package/dist/core/config/config-io.js +26 -18
  124. package/dist/core/config/config-schema.js +19 -106
  125. package/dist/core/config/config-sources.js +3 -3
  126. package/dist/core/config/config-types.js +4 -4
  127. package/dist/core/config/config-walker.js +50 -77
  128. package/dist/core/config/config.js +438 -109
  129. package/dist/core/config/convert-engine-references.js +114 -0
  130. package/dist/core/config/convert-engines-shared.js +40 -0
  131. package/dist/core/config/convert-engines.js +300 -0
  132. package/dist/core/config/convert-models-overlay.js +137 -0
  133. package/dist/core/config/credentials.js +304 -0
  134. package/dist/core/config/engine-semantics.js +3 -3
  135. package/dist/core/config/migrate-keys.js +222 -0
  136. package/dist/core/config/model-aliases.js +37 -0
  137. package/dist/core/config/models-file.js +34 -0
  138. package/dist/core/config/retired-engines.js +53 -0
  139. package/dist/core/config/schema/connections.js +41 -0
  140. package/dist/core/config/schema/embedding.js +2 -2
  141. package/dist/core/config/schema/harnesses.js +41 -0
  142. package/dist/core/config/schema/improve-processes.js +9 -28
  143. package/dist/core/config/schema/improve.js +36 -1
  144. package/dist/core/config/schema/index-config.js +18 -20
  145. package/dist/core/config/schema/primitives.js +42 -17
  146. package/dist/core/config/schema/search.js +6 -11
  147. package/dist/core/config/schema/sources-bundles.js +9 -9
  148. package/dist/core/config/schema/workflow.js +2 -6
  149. package/dist/core/config/unusable-entries.js +66 -0
  150. package/dist/core/content-safety.js +3 -6
  151. package/dist/core/endpoint-url.js +47 -0
  152. package/dist/core/env-secret-ref.js +84 -73
  153. package/dist/core/errors.js +10 -16
  154. package/dist/core/extra-params.js +3 -3
  155. package/dist/core/improve-result.js +8 -9
  156. package/dist/core/json-schema.js +1 -1
  157. package/dist/core/lesson-lint.js +1 -1
  158. package/dist/core/llm-inference.js +80 -0
  159. package/dist/core/parse.js +2 -2
  160. package/dist/core/paths.js +33 -10
  161. package/dist/core/recognition-util.js +8 -10
  162. package/dist/core/redaction.js +94 -55
  163. package/dist/core/ref-token.js +82 -0
  164. package/dist/core/secret-value.js +14 -0
  165. package/dist/core/state/migrations.js +17 -22
  166. package/dist/core/structured.js +2 -68
  167. package/dist/core/subprocess.js +63 -22
  168. package/dist/core/type-presentation.js +10 -14
  169. package/dist/core/write-source.js +20 -4
  170. package/dist/execution/input-contract.js +3 -6
  171. package/dist/execution/notices.js +49 -0
  172. package/dist/execution/resolved-request.js +24 -40
  173. package/dist/execution/source.js +21 -45
  174. package/dist/execution/target-ref.js +2 -2
  175. package/dist/indexer/bundle-identity-guard.js +6 -5
  176. package/dist/indexer/ensure-index.js +1 -1
  177. package/dist/indexer/index-writer-lock.js +1 -1
  178. package/dist/indexer/indexer.js +46 -42
  179. package/dist/indexer/installations.js +12 -22
  180. package/dist/indexer/lookup/adapter-concept-owner.js +40 -14
  181. package/dist/indexer/materialize-embeddings.js +20 -16
  182. package/dist/indexer/passes/memory-inference.js +21 -50
  183. package/dist/indexer/passes/metadata.js +5 -5
  184. package/dist/indexer/scan/doc-to-entry.js +1 -1
  185. package/dist/indexer/scan/drain-dir.js +9 -11
  186. package/dist/indexer/search/db-search.js +9 -7
  187. package/dist/indexer/search/search-source.js +42 -22
  188. package/dist/indexer/usage/usage-events.js +2 -3
  189. package/dist/indexer/walk/index-context.js +2 -1
  190. package/dist/indexer/walk/matchers.js +3 -11
  191. package/dist/indexer/walk/path-resolver.js +13 -68
  192. package/dist/indexer/walk/walker.js +32 -26
  193. package/dist/integrations/agent/akm-read-tools.js +81 -0
  194. package/dist/integrations/agent/config.js +1 -1
  195. package/dist/integrations/agent/detect.js +32 -36
  196. package/dist/integrations/agent/execution.js +130 -428
  197. package/dist/integrations/agent/index.js +1 -1
  198. package/dist/integrations/agent/profiles.js +24 -28
  199. package/dist/integrations/agent/prompts.js +17 -30
  200. package/dist/integrations/agent/request-lowering.js +67 -101
  201. package/dist/integrations/agent/resolution.js +332 -0
  202. package/dist/integrations/agent/runner-dispatch.js +156 -181
  203. package/dist/integrations/agent/runner.js +20 -70
  204. package/dist/integrations/agent/runtime-port.js +4 -0
  205. package/dist/integrations/agent/runtime.js +10 -0
  206. package/dist/integrations/agent/spawn.js +65 -190
  207. package/dist/integrations/harnesses/aider/index.js +19 -39
  208. package/dist/integrations/harnesses/amazonq/index.js +17 -32
  209. package/dist/integrations/harnesses/claude/index.js +59 -28
  210. package/dist/integrations/harnesses/claude/session-log.js +7 -5
  211. package/dist/integrations/harnesses/codex/index.js +19 -31
  212. package/dist/integrations/harnesses/copilot/index.js +17 -35
  213. package/dist/integrations/harnesses/gemini/index.js +18 -34
  214. package/dist/integrations/harnesses/harness.js +36 -0
  215. package/dist/integrations/harnesses/index.js +20 -51
  216. package/dist/integrations/harnesses/opencode/agent-builder.js +132 -100
  217. package/dist/integrations/harnesses/opencode/index.js +11 -33
  218. package/dist/integrations/harnesses/opencode/roots.js +50 -0
  219. package/dist/integrations/harnesses/opencode/runtime/binary.js +206 -0
  220. package/dist/integrations/harnesses/opencode/runtime/command.js +152 -0
  221. package/dist/integrations/harnesses/opencode/runtime/index.js +177 -0
  222. package/dist/integrations/harnesses/opencode/runtime/tar.js +107 -0
  223. package/dist/integrations/harnesses/opencode/session-log-v1.js +15 -7
  224. package/dist/integrations/harnesses/opencode/session-log-v2.js +72 -48
  225. package/dist/integrations/harnesses/opencode/session-log.js +58 -137
  226. package/dist/integrations/harnesses/opencode/version.js +34 -53
  227. package/dist/integrations/harnesses/openhands/index.js +13 -37
  228. package/dist/integrations/harnesses/pi/index.js +21 -32
  229. package/dist/integrations/lockfile.js +1 -1
  230. package/dist/integrations/session-logs/index.js +11 -31
  231. package/dist/llm/client.js +93 -111
  232. package/dist/llm/embedder.js +19 -34
  233. package/dist/llm/embedders/connection.js +31 -0
  234. package/dist/llm/embedders/local-model-files.js +56 -0
  235. package/dist/llm/embedders/local.js +146 -115
  236. package/dist/llm/embedders/remote.js +26 -23
  237. package/dist/llm/embedders/types.js +1 -1
  238. package/dist/llm/index-passes.js +33 -39
  239. package/dist/llm/memory-infer.js +67 -77
  240. package/dist/llm/model-list.js +35 -0
  241. package/dist/llm/rerank-client.js +8 -14
  242. package/dist/llm/structured-call.js +45 -99
  243. package/dist/llm/structured.js +60 -0
  244. package/dist/output/renderers.js +2 -8
  245. package/dist/output/shapes/helpers.js +18 -44
  246. package/dist/output/shapes/passthrough.js +1 -0
  247. package/dist/output/shapes.js +1 -7
  248. package/dist/output/text/command-format.js +41 -39
  249. package/dist/output/text/health-format.js +8 -2
  250. package/dist/output/text/helpers.js +1 -1
  251. package/dist/output/text/migrate.js +12 -0
  252. package/dist/output/text/models.js +3 -2
  253. package/dist/output/text/registry-commands.js +1 -2
  254. package/dist/output/text/show-directives.js +16 -28
  255. package/dist/output/text/show-format.js +0 -2
  256. package/dist/output/text/targets-table.js +70 -0
  257. package/dist/output/text/workflow-format.js +44 -15
  258. package/dist/output/text.js +1 -1
  259. package/dist/registry/providers/skills-sh.js +1 -28
  260. package/dist/registry/providers/static-index.js +1 -71
  261. package/dist/runtime.js +6 -2
  262. package/dist/scripts/akm-migrate-node.js +47095 -44905
  263. package/dist/scripts/akm-migrate.js +46946 -44755
  264. package/dist/setup/detect.js +28 -273
  265. package/dist/setup/endpoint.js +36 -0
  266. package/dist/setup/semantic-assets.js +13 -19
  267. package/dist/setup/setup-flags.js +77 -0
  268. package/dist/setup/setup-plan.js +144 -0
  269. package/dist/setup/setup.js +134 -358
  270. package/dist/setup/steps/connection-shared.js +49 -101
  271. package/dist/setup/steps/connection.js +121 -524
  272. package/dist/setup/steps/embeddings.js +151 -0
  273. package/dist/setup/steps/harnesses.js +118 -0
  274. package/dist/setup/steps/platforms.js +2 -81
  275. package/dist/setup/steps/tasks.js +1 -2
  276. package/dist/setup/steps.js +10 -0
  277. package/dist/setup/summary.js +67 -0
  278. package/dist/sources/freshness.js +16 -21
  279. package/dist/sources/providers/git-provider.js +2 -9
  280. package/dist/sources/providers/provider-utils.js +13 -5
  281. package/dist/sources/resolve.js +12 -16
  282. package/dist/sources/snapshot-fetchers/robots.js +11 -12
  283. package/dist/sources/snapshot-fetchers/secret-seam.js +2 -4
  284. package/dist/sources/snapshot-fetchers/website-ingest.js +8 -15
  285. package/dist/sources/snapshot-fetchers/x.js +1 -1
  286. package/dist/standalone/onnxruntime-library.js +52 -0
  287. package/dist/storage/repositories/improve-ledger-repository.js +1 -1
  288. package/dist/storage/repositories/improve-runs-repository.js +0 -13
  289. package/dist/storage/repositories/index-entries-repository.js +2 -2
  290. package/dist/storage/repositories/proposals-repository.js +2 -2
  291. package/dist/storage/repositories/task-history-repository.js +2 -2
  292. package/dist/storage/repositories/workflow-runs-repository.js +44 -129
  293. package/dist/storage/sqlite-read-snapshot.js +33 -29
  294. package/dist/tasks/embedded.js +1 -1
  295. package/dist/tasks/log-redaction.js +7 -119
  296. package/dist/tasks/prepare/prepare-support.js +8 -7
  297. package/dist/tasks/prepare/prepare.js +8 -9
  298. package/dist/tasks/prepare/script-capture.js +9 -25
  299. package/dist/tasks/run/attempt-lifecycle.js +17 -35
  300. package/dist/tasks/run/load-task.js +54 -27
  301. package/dist/tasks/run/run-command-task.js +15 -10
  302. package/dist/tasks/run/run-native-task.js +8 -21
  303. package/dist/tasks/run/run-task.js +5 -8
  304. package/dist/tasks/run/run-workflow-task.js +14 -21
  305. package/dist/tasks/run/task-history.js +9 -17
  306. package/dist/tasks/run/task-log.js +1 -5
  307. package/dist/tasks/scheduler-invocation.js +13 -18
  308. package/dist/tasks/scheduler-sync.js +0 -1
  309. package/dist/tasks/source/bounded-document.js +31 -117
  310. package/dist/tasks/source/parse-task-source.js +0 -1
  311. package/dist/tasks/source/project-v4.js +5 -3
  312. package/dist/tasks/source/task-input-diagnostics.js +3 -4
  313. package/dist/tasks/source/task-source-v4.js +48 -72
  314. package/dist/tasks/source-v3.js +2 -5
  315. package/dist/tasks/task-run-reserved-flags.js +1 -2
  316. package/dist/workflows/authoring/authoring.js +2 -7
  317. package/dist/workflows/compile.js +1 -15
  318. package/dist/workflows/concurrency-policy.js +4 -4
  319. package/dist/workflows/exec/child-workflow.js +1 -4
  320. package/dist/workflows/exec/dispatch-redaction.js +35 -86
  321. package/dist/workflows/exec/environment.js +13 -77
  322. package/dist/workflows/exec/exec-unit.js +14 -55
  323. package/dist/workflows/exec/frozen-judge.js +26 -28
  324. package/dist/workflows/exec/native-executor.js +126 -71
  325. package/dist/workflows/exec/run-workflow.js +38 -42
  326. package/dist/workflows/exec/step-work.js +13 -17
  327. package/dist/workflows/exec/unit-dispatch.js +7 -21
  328. package/dist/workflows/freeze/environment.js +14 -119
  329. package/dist/workflows/freeze/freeze.js +14 -33
  330. package/dist/workflows/freeze/step-values.js +6 -13
  331. package/dist/workflows/freeze/targets/child-workflow.js +3 -5
  332. package/dist/workflows/freeze/targets/command.js +9 -15
  333. package/dist/workflows/freeze/targets/shell.js +0 -3
  334. package/dist/workflows/freeze/task-bindings.js +0 -1
  335. package/dist/workflows/parser.js +50 -59
  336. package/dist/workflows/plan.js +8 -2
  337. package/dist/workflows/renderer.js +83 -9
  338. package/dist/workflows/resource-limits.js +2 -2
  339. package/dist/workflows/runtime/run-plan.js +38 -23
  340. package/dist/workflows/runtime/runs.js +55 -93
  341. package/dist/workflows/runtime/workflow-asset-loader.js +55 -86
  342. package/dist/workflows/source-files.js +7 -19
  343. package/docs/README.md +10 -16
  344. package/docs/architecture/README.md +2 -37
  345. package/docs/architecture/adapters.md +2 -2
  346. package/docs/architecture/akm-core-principles.md +256 -118
  347. package/docs/architecture/architecture.md +283 -99
  348. package/docs/architecture/improvement.md +8 -2
  349. package/docs/architecture/internals/classification.md +1 -3
  350. package/docs/architecture/internals/fresh-host-rebuild-runbook.md +7 -6
  351. package/docs/architecture/internals/health-advisories.md +35 -74
  352. package/docs/architecture/internals/improve-workflow.md +27 -26
  353. package/docs/architecture/internals/indexing.md +3 -3
  354. package/docs/architecture/internals/storage-locations.md +48 -15
  355. package/docs/architecture/persisted-data-compat.md +10 -6
  356. package/docs/architecture/specs/okf-support.md +9 -11
  357. package/docs/architecture/specs/ref.md +7 -9
  358. package/docs/architecture/testing/testing-workflow.md +172 -52
  359. package/docs/architecture/workflow-engine.md +51 -34
  360. package/docs/guides/README.md +0 -1
  361. package/docs/guides/author-bundles.md +15 -20
  362. package/docs/guides/author-workflows.md +93 -71
  363. package/docs/guides/bundles.md +20 -16
  364. package/docs/guides/discover-and-load.md +1 -1
  365. package/docs/guides/getting-started.md +49 -3
  366. package/docs/guides/improve-the-library.md +10 -4
  367. package/docs/guides/recipes/headless-install.md +11 -16
  368. package/docs/guides/run-workflows.md +29 -20
  369. package/docs/guides/scheduling.md +2 -2
  370. package/docs/guides/use-with-any-agent.md +20 -22
  371. package/docs/integration/bundling-akm.md +19 -9
  372. package/docs/maintainers/README.md +2 -6
  373. package/docs/maintainers/release-checklist.md +73 -126
  374. package/docs/migration/README.md +10 -3
  375. package/docs/migration/release-notes/0.10.0.md +81 -16
  376. package/docs/migration/release-notes/0.6.0.md +1 -1
  377. package/docs/migration/release-notes/0.7.0.md +1 -1
  378. package/docs/migration/release-notes/0.9.0.md +1 -1
  379. package/docs/migration/release-notes/README.md +1 -1
  380. package/docs/migration/v0.9-to-v0.10.md +300 -60
  381. package/docs/migration/v0.9.1-to-v0.9.2.md +6 -5
  382. package/docs/posts/config-v2-lessons-16.md +1 -1
  383. package/docs/posts/llm-mode-reflect-13.md +1 -1
  384. package/docs/posts/release-0.6.0.md +11 -11
  385. package/docs/posts/release-0.8.0.md +4 -4
  386. package/docs/posts/workflows-vaults-09.md +1 -1
  387. package/docs/reference/README.md +1 -1
  388. package/docs/reference/asset-types.md +2 -2
  389. package/docs/reference/cli.md +477 -388
  390. package/docs/reference/configuration.md +569 -550
  391. package/docs/reference/data-and-telemetry.md +9 -6
  392. package/docs/reference/env-and-secrets.md +72 -15
  393. package/docs/reference/refs.md +3 -20
  394. package/docs/reference/registry.md +12 -38
  395. package/docs/reference/supported-formats.md +1 -1
  396. package/docs/reference/tasks.md +22 -11
  397. package/docs/reference/ui-api.md +14 -9
  398. package/docs/reference/workflow-schema.md +199 -154
  399. package/docs/reference/workflows.md +4 -6
  400. package/package.json +9 -11
  401. package/schemas/akm-config.json +1696 -2922
  402. package/schemas/akm-task.json +4 -4
  403. package/schemas/akm-workflow.json +36 -9
  404. package/ROADMAP.md +0 -112
  405. package/dist/assets/models.json +0 -35
  406. package/dist/commands/health/engine-usage.js +0 -45
  407. package/dist/commands/sources/dangerous-env-audit.js +0 -134
  408. package/dist/core/activation-policy.js +0 -67
  409. package/dist/core/config/schema/engines.js +0 -160
  410. package/dist/core/config/schema/execution.js +0 -23
  411. package/dist/core/spawn-env.js +0 -268
  412. package/dist/execution/directory-identity.js +0 -78
  413. package/dist/integrations/agent/builder-shared.js +0 -33
  414. package/dist/integrations/agent/builders.js +0 -43
  415. package/dist/integrations/agent/engine-fallback.js +0 -59
  416. package/dist/integrations/agent/engine-resolution.js +0 -333
  417. package/dist/integrations/agent/model-map.js +0 -475
  418. package/dist/integrations/harnesses/aider/agent-builder.js +0 -107
  419. package/dist/integrations/harnesses/aider/result-extractor.js +0 -53
  420. package/dist/integrations/harnesses/amazonq/agent-builder.js +0 -138
  421. package/dist/integrations/harnesses/amazonq/result-extractor.js +0 -48
  422. package/dist/integrations/harnesses/claude/agent-builder.js +0 -106
  423. package/dist/integrations/harnesses/claude/config-import.js +0 -67
  424. package/dist/integrations/harnesses/claude/result-extractor.js +0 -67
  425. package/dist/integrations/harnesses/codex/agent-builder.js +0 -150
  426. package/dist/integrations/harnesses/codex/result-extractor.js +0 -110
  427. package/dist/integrations/harnesses/copilot/agent-builder.js +0 -117
  428. package/dist/integrations/harnesses/copilot/result-extractor.js +0 -178
  429. package/dist/integrations/harnesses/gemini/agent-builder.js +0 -114
  430. package/dist/integrations/harnesses/gemini/result-extractor.js +0 -149
  431. package/dist/integrations/harnesses/opencode/config-import.js +0 -149
  432. package/dist/integrations/harnesses/opencode/model-config.js +0 -33
  433. package/dist/integrations/harnesses/opencode/model-work-agent.js +0 -115
  434. package/dist/integrations/harnesses/opencode/session-log-types.js +0 -12
  435. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -44
  436. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +0 -1052
  437. package/dist/integrations/harnesses/opencode-sdk/v1-adapter.js +0 -199
  438. package/dist/integrations/harnesses/opencode-sdk/v2-adapter.js +0 -254
  439. package/dist/integrations/harnesses/opencode-sdk/wire.js +0 -66
  440. package/dist/integrations/harnesses/openhands/agent-builder.js +0 -120
  441. package/dist/integrations/harnesses/openhands/result-extractor.js +0 -135
  442. package/dist/integrations/harnesses/pi/agent-builder.js +0 -89
  443. package/dist/integrations/harnesses/pi/result-extractor.js +0 -168
  444. package/dist/integrations/harnesses/shared.js +0 -18
  445. package/dist/integrations/harnesses/types.js +0 -55
  446. package/dist/llm/feature-gate.js +0 -115
  447. package/dist/output/shapes/models-list.js +0 -16
  448. package/dist/output/shapes/registry-search.js +0 -10
  449. package/dist/setup/detected-engines.js +0 -136
  450. package/dist/setup/engine-config.js +0 -97
  451. package/dist/setup/harness-config-import.js +0 -47
  452. package/dist/setup/providers.js +0 -14
  453. package/dist/setup/steps/semantic.js +0 -39
  454. package/dist/workflows/authoring/scope-key.js +0 -79
  455. package/dist/workflows/exec/lowering-notices.js +0 -23
  456. package/dist/workflows/source-semantics.js +0 -110
  457. package/docs/architecture/0.10-process-rules.md +0 -832
  458. package/docs/architecture/akm-architecture-decision-history.md +0 -2055
  459. package/docs/architecture/comparisons/claude-code-vs-akm-workflows-full.md +0 -550
  460. package/docs/architecture/decisions/0001-no-interpolation-attached-structured-context.md +0 -72
  461. package/docs/architecture/decisions/0002-unit-reuse-and-input-hash-scope.md +0 -142
  462. package/docs/architecture/decisions/0003-child-env-allowlist-and-provenance.md +0 -189
  463. package/docs/architecture/decisions/0004-task-input-contract-and-flag-coercion.md +0 -97
  464. package/docs/architecture/decisions/0005-task-result-vocabulary-and-legacy-read-mapping.md +0 -108
  465. package/docs/architecture/decisions/0006-task-source-version-routing.md +0 -124
  466. package/docs/architecture/decisions/0007-workflow-composition-bounds.md +0 -83
  467. package/docs/architecture/decisions/0008-task-binding-normalization.md +0 -88
  468. package/docs/architecture/decisions/0009-child-run-publication-column-parity.md +0 -80
  469. package/docs/architecture/decisions/0010-driver-protocol-cut.md +0 -36
  470. package/docs/architecture/decisions/0011-engine-run-loop-invariants.md +0 -125
  471. package/docs/architecture/decisions/README.md +0 -62
  472. package/docs/architecture/internals/functional-contract-patterns.md +0 -340
  473. package/docs/architecture/internals/registry-network-boundary.md +0 -57
  474. package/docs/architecture/internals/search.md +0 -248
  475. package/docs/architecture/reviews/env-secret-access.md +0 -319
  476. package/docs/architecture/runtime-boundary-design.md +0 -153
  477. package/docs/architecture/specs/0.9.0-close-out-plan.md +0 -361
  478. package/docs/architecture/specs/0.9.0-decisions.md +0 -532
  479. package/docs/architecture/specs/0.9.0-docs-code-drift-register.md +0 -745
  480. package/docs/architecture/specs/0.9.0-open-items-register.md +0 -135
  481. package/docs/architecture/specs/0.9.0-public-api-issue-backlog.md +0 -740
  482. package/docs/architecture/specs/0.9.0-release-surface-review.md +0 -636
  483. package/docs/architecture/specs/agent-command-engine-model-design.md +0 -513
  484. package/docs/architecture/specs/akm-0.9.0-bundle-adapter-spec.md +0 -501
  485. package/docs/architecture/specs/akm-0.9.0-ref-grammar-decision.md +0 -291
  486. package/docs/architecture/specs/akm-format-neutral-bundle-workspace-spec.md +0 -2059
  487. package/docs/architecture/specs/di-seams-plan.md +0 -539
  488. package/docs/architecture/specs/driver-protocol-keep-or-cut.md +0 -275
  489. package/docs/architecture/specs/fact-asset-type.md +0 -142
  490. package/docs/architecture/specs/improve-collapse-churn-detector-design.md +0 -634
  491. package/docs/architecture/specs/reviews/task-workflow-unification/README.md +0 -72
  492. package/docs/architecture/specs/reviews/task-workflow-unification/findings-consolidated.md +0 -152
  493. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-alternatives.md +0 -352
  494. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-bunqueue.md +0 -300
  495. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-openworkflow.md +0 -402
  496. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-1.md +0 -758
  497. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-2.md +0 -645
  498. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-3.md +0 -602
  499. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-adversarial.md +0 -27
  500. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-architecture.md +0 -27
  501. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-coverage.md +0 -74
  502. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-security.md +0 -15
  503. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-adversarial.md +0 -132
  504. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-verification.md +0 -147
  505. package/docs/architecture/specs/stash-conventions-code-spec.md +0 -275
  506. package/docs/architecture/specs/stash-organization-conventions.md +0 -377
  507. package/docs/architecture/specs/task-workflow-format-unification.md +0 -721
  508. package/docs/architecture/specs/workflow-engine-buy-vs-build.md +0 -231
  509. package/docs/architecture/specs/workflow-format-unification.md +0 -432
  510. package/docs/architecture/testing/manual-testing-checklist.md +0 -3411
  511. package/docs/architecture/testing/okf-v0.2-conformance-runbook.md +0 -924
  512. package/docs/architecture/testing/task-workflow-manual-tests.md +0 -1720
  513. package/docs/guides/claude-code-vs-akm-workflows.md +0 -29
  514. package/docs/guides/knowledge-management.md +0 -18
  515. package/docs/maintainers/curate-workmap.md +0 -335
  516. package/docs/migration/v0.5-to-v0.6.md +0 -759
  517. package/docs/migration/v0.7-to-v0.8.md +0 -1378
  518. package/docs/plans/0.9.2-agent-command-workflow-plan.md +0 -423
@@ -18,10 +18,9 @@
18
18
  */
19
19
  import memoryInferSystemPrompt from "../assets/prompts/memory-infer-system.md" with { type: "text" };
20
20
  import memoryInferUserPrompt from "../assets/prompts/memory-infer-user.md" with { type: "text" };
21
- import { toErrorMessage } from "../core/common.js";
21
+ import { effectiveRequestFields } from "../core/llm-inference.js";
22
22
  import { parseEmbeddedJsonResponse } from "../core/parse.js";
23
23
  import { warn } from "../core/warn.js";
24
- import { runnerLlmConnection } from "../integrations/agent/runner.js";
25
24
  import { callStructured } from "./structured-call.js";
26
25
  const SYSTEM_PROMPT = memoryInferSystemPrompt;
27
26
  const USER_PROMPT_PREFIX = memoryInferUserPrompt;
@@ -40,8 +39,7 @@ export function isMemoryInferNoChange(value) {
40
39
  }
41
40
  /**
42
41
  * Strict JSON Schema for the derived-memory payload. Sent as `response_format`
43
- * unless the engine sets `supportsJsonSchema: false`; the client drops it once
44
- * for a provider that rejects it.
42
+ * and the client drops it once for a provider that rejects it.
45
43
  *
46
44
  * Every property is required (a strict provider refuses otherwise), so the
47
45
  * explicit no-change decision is `noChange: true` with the other fields empty.
@@ -61,6 +59,51 @@ export const DERIVED_MEMORY_JSON_SCHEMA = {
61
59
  required: ["noChange", "title", "description", "content", "tags", "searchHints"],
62
60
  additionalProperties: false,
63
61
  };
62
+ /** The temperature a connection's request fields set, if any. */
63
+ function configuredTemperature(runner) {
64
+ const temperature = runner.kind === "connection" ? effectiveRequestFields(runner.request, runner.inference).temperature : undefined;
65
+ return typeof temperature === "number" ? temperature : undefined;
66
+ }
67
+ /** Read the model's reply: a draft, an explicit no-change decision, or `undefined` for one that is unusable. */
68
+ function parseDerivedMemory(raw) {
69
+ if (!raw)
70
+ return undefined;
71
+ const parsed = parseEmbeddedJsonResponse(raw);
72
+ if (!parsed) {
73
+ warn("memory inference: invalid JSON response from LLM; skipping memory.");
74
+ return undefined;
75
+ }
76
+ // Only a literal boolean `true` is a decision; anything else falls through
77
+ // to the complete-payload checks, so a malformed reply is never restraint.
78
+ if (parsed.noChange === true)
79
+ return MEMORY_INFER_NO_CHANGE;
80
+ const title = typeof parsed.title === "string" ? parsed.title.trim() : "";
81
+ const description = typeof parsed.description === "string" ? parsed.description.trim() : "";
82
+ const content = typeof parsed.content === "string" ? parsed.content.trim() : "";
83
+ const tags = Array.isArray(parsed.tags)
84
+ ? parsed.tags
85
+ .filter((t) => typeof t === "string")
86
+ .map((t) => t.trim())
87
+ .filter(Boolean)
88
+ .slice(0, 8)
89
+ : [];
90
+ const searchHints = Array.isArray(parsed.searchHints)
91
+ ? parsed.searchHints
92
+ .filter((h) => typeof h === "string")
93
+ .map((h) => h.trim())
94
+ .filter(Boolean)
95
+ .slice(0, 6)
96
+ : [];
97
+ if (!title || !description || !content || tags.length === 0 || searchHints.length === 0) {
98
+ warn("memory inference: incomplete derived memory payload from LLM; skipping memory.");
99
+ return undefined;
100
+ }
101
+ if ([title, description, content, ...tags, ...searchHints].some((value) => PROMPT_PLACEHOLDERS.has(value.toLowerCase()))) {
102
+ warn("memory inference: prompt placeholder response from LLM; skipping memory.");
103
+ return undefined;
104
+ }
105
+ return { title, description, tags, searchHints, content };
106
+ }
64
107
  /**
65
108
  * Compress a single memory into one derived memory via the configured LLM.
66
109
  * `body` is the pass's effective input (a `Source context:` section, then the
@@ -68,92 +111,39 @@ export const DERIVED_MEMORY_JSON_SCHEMA = {
68
111
  *
69
112
  * Returns the draft, or {@link MEMORY_INFER_NO_CHANGE} when the model explicitly
70
113
  * decides the memory needs no derived memory. Returns `undefined` on any failure
71
- * (timeout, invalid JSON, empty or incomplete response, HTML, abort, disabled
72
- * pass), which is never the same thing as no-change. Errors are logged via `warn()` but never thrown — a failed split for one memory
73
- * must not abort the rest of the index pass.
74
- *
75
- * Routes through `callStructured({ feature: "memory_inference", ... })` so the
76
- * feature gate, error classification, and onFallback hook are honoured uniformly
77
- * (Fix C5).
114
+ * (timeout, invalid JSON, empty or incomplete response, HTML, abort), which is
115
+ * never the same thing as no-change. Failures are logged via `warn()` but never
116
+ * thrown — a failed split for one memory must not abort the rest of the index
117
+ * pass. Whether the pass runs at all is the pass's decision, not this helper's.
78
118
  */
79
- export async function compressMemoryToDerivedMemory(llmRunner, body, signal, akmConfig, onFallback, telemetry, onRetryAttempt, onNotices) {
119
+ export async function compressMemoryToDerivedMemory(llmRunner, body, signal, telemetry, onRetryAttempt, onNotices) {
80
120
  const trimmedBody = body.trim();
81
121
  if (!trimmedBody)
82
122
  return undefined;
83
- const userPrompt = `${USER_PROMPT_PREFIX}${trimmedBody}`;
84
- // Memory inference is always gated: no config closes the gate instead of
85
- // taking callStructured's ungated path for direct callers.
86
- if (!akmConfig) {
87
- onFallback?.({ feature: "memory_inference", reason: "disabled" });
88
- return undefined;
89
- }
90
- return callStructured({
91
- feature: "memory_inference",
92
- akmConfig,
123
+ const outcome = await callStructured({
93
124
  runner: llmRunner,
94
125
  messages: [
95
126
  { role: "system", content: SYSTEM_PROMPT },
96
- { role: "user", content: userPrompt },
127
+ { role: "user", content: `${USER_PROMPT_PREFIX}${trimmedBody}` },
97
128
  ],
98
129
  request: {
99
- // The engine's or the process's configured temperature; 0.1 only when neither sets one.
100
- temperature: runnerLlmConnection(llmRunner)?.temperature ?? 0.1,
101
- ...(Object.hasOwn(llmRunner, "timeoutMs") ? { timeoutMs: llmRunner.timeoutMs } : {}),
130
+ // The connection's or the process's configured temperature; 0.1 only when neither sets one.
131
+ temperature: configuredTemperature(llmRunner) ?? 0.1,
102
132
  signal,
103
133
  responseSchema: DERIVED_MEMORY_JSON_SCHEMA,
104
134
  onRetryAttempt,
105
135
  },
106
136
  onNotices,
107
- parse: (raw) => {
108
- if (!raw)
109
- return undefined;
110
- const parsed = parseEmbeddedJsonResponse(raw);
111
- if (!parsed) {
112
- warn("memory inference: invalid JSON response from LLM; skipping memory.");
113
- return undefined;
114
- }
115
- // Only a literal boolean `true` is a decision; anything else falls through
116
- // to the complete-payload checks, so a malformed reply is never restraint.
117
- if (parsed.noChange === true)
118
- return MEMORY_INFER_NO_CHANGE;
119
- const title = typeof parsed.title === "string" ? parsed.title.trim() : "";
120
- const description = typeof parsed.description === "string" ? parsed.description.trim() : "";
121
- const content = typeof parsed.content === "string" ? parsed.content.trim() : "";
122
- const tags = Array.isArray(parsed.tags)
123
- ? parsed.tags
124
- .filter((t) => typeof t === "string")
125
- .map((t) => t.trim())
126
- .filter(Boolean)
127
- .slice(0, 8)
128
- : [];
129
- const searchHints = Array.isArray(parsed.searchHints)
130
- ? parsed.searchHints
131
- .filter((h) => typeof h === "string")
132
- .map((h) => h.trim())
133
- .filter(Boolean)
134
- .slice(0, 6)
135
- : [];
136
- if (!title || !description || !content || tags.length === 0 || searchHints.length === 0) {
137
- warn("memory inference: incomplete derived memory payload from LLM; skipping memory.");
138
- return undefined;
139
- }
140
- if ([title, description, content, ...tags, ...searchHints].some((value) => PROMPT_PLACEHOLDERS.has(value.toLowerCase()))) {
141
- warn("memory inference: prompt placeholder response from LLM; skipping memory.");
142
- return undefined;
143
- }
144
- return { title, description, tags, searchHints, content };
145
- },
146
- onError: (cls, err) => {
147
- if (cls === "html") {
148
- if (telemetry)
149
- telemetry.htmlErrorCount = (telemetry.htmlErrorCount ?? 0) + 1;
150
- warn(`memory inference: provider returned HTML instead of JSON; skipping memory: ${toErrorMessage(err)}`);
151
- return undefined;
152
- }
153
- warn(`memory inference failed: ${toErrorMessage(err)}`);
154
- return undefined;
155
- },
156
- fallback: undefined,
157
- onFallback,
158
137
  });
138
+ if (outcome.ok)
139
+ return parseDerivedMemory(outcome.raw);
140
+ if (outcome.result?.llmErrorCode === "provider_html_error") {
141
+ if (telemetry)
142
+ telemetry.htmlErrorCount = (telemetry.htmlErrorCount ?? 0) + 1;
143
+ warn(`memory inference: provider returned HTML instead of JSON; skipping memory: ${outcome.error}`);
144
+ }
145
+ else {
146
+ warn(`memory inference failed: ${outcome.error}`);
147
+ }
148
+ return undefined;
159
149
  }
@@ -0,0 +1,35 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ /**
5
+ * The models an OpenAI-compatible endpoint serves: one `GET <base>/models`, with
6
+ * the connection's key when it has one. `akm setup` (the connection, its local-server
7
+ * detection and an embedding endpoint) and `akm models` list models this way, so
8
+ * what they show agrees. `akm health` asks only whether the endpoint answers, with
9
+ * its own request (`probeLlmEndpoint` in `client.ts`), and reads no list.
10
+ */
11
+ import { openAiOperationUrl } from "../core/endpoint-url.js";
12
+ const LIST_TIMEOUT_MS = 3_000;
13
+ /** The model ids the endpoint lists, in the order it lists them. Never throws; a failure says why. */
14
+ export async function listEndpointModels(connection, timeoutMs = LIST_TIMEOUT_MS) {
15
+ try {
16
+ const response = await fetch(openAiOperationUrl(connection.endpoint, "models"), {
17
+ headers: connection.apiKey ? { authorization: `Bearer ${connection.apiKey}` } : {},
18
+ signal: AbortSignal.timeout(timeoutMs),
19
+ });
20
+ if (!response.ok)
21
+ return { ok: false, error: `HTTP ${response.status}` };
22
+ const body = (await response.json());
23
+ if (!Array.isArray(body.data))
24
+ return { ok: false, error: "the response has no model list" };
25
+ const ids = body.data.flatMap((entry) => typeof entry?.id === "string" && entry.id ? [entry.id] : []);
26
+ return { ok: true, models: [...new Set(ids)] };
27
+ }
28
+ catch (err) {
29
+ return { ok: false, error: err instanceof Error ? err.message : String(err) };
30
+ }
31
+ }
32
+ /** Whether a model id names an embedding model rather than a chat model. */
33
+ export function isEmbeddingModel(id) {
34
+ return /embed|nomic|minilm|bge/i.test(id);
35
+ }
@@ -25,10 +25,8 @@
25
25
  * `core/config/schema/search.ts` for why.
26
26
  */
27
27
  import { fetchWithTimeout, readBodyWithByteCap } from "../core/common.js";
28
- import { resolveSecret } from "../core/config/config.js";
29
- import { isApiKeyReference } from "../core/config/schema/primitives.js";
30
- import { redactErrorBody, redactSensitiveText } from "../core/redaction.js";
31
- import { resolveSecretFromStore } from "../sources/snapshot-fetchers/secret-seam.js";
28
+ import { resolveApiKey } from "../core/config/credentials.js";
29
+ import { redactErrorBody, redactSensitiveText, redactUrlCredentials } from "../core/redaction.js";
32
30
  const DEFAULT_RERANK_TIMEOUT_MS = 10_000;
33
31
  export class RerankCallError extends Error {
34
32
  code;
@@ -44,10 +42,8 @@ export class RerankCallError extends Error {
44
42
  * didn't return a score for keeps its original relative order, appended
45
43
  * after every scored document (never dropped).
46
44
  *
47
- * Throws {@link RerankCallError} on any transport/parse failure — callers
48
- * that want a graceful fallback should use `tryLlmFeature("curate_rerank", ...)`
49
- * (`llm/feature-gate.ts`), matching every other bounded in-tree LLM/rerank
50
- * call site.
45
+ * Throws {@link RerankCallError} on any transport/parse failure — a caller
46
+ * that wants a graceful fallback catches it.
51
47
  */
52
48
  export async function rerankDocuments(config, query, documents) {
53
49
  if (!config.endpoint) {
@@ -55,9 +51,7 @@ export async function rerankDocuments(config, query, documents) {
55
51
  }
56
52
  if (documents.length === 0)
57
53
  return [];
58
- const resolvedKey = config.apiKey && isApiKeyReference(config.apiKey)
59
- ? resolveSecret(config.apiKey, resolveSecretFromStore)
60
- : config.apiKey;
54
+ const resolvedKey = resolveApiKey(config.apiKey, { service: "curateRerank" }, config.endpoint);
61
55
  const headers = { "Content-Type": "application/json" };
62
56
  if (resolvedKey)
63
57
  headers.Authorization = `Bearer ${resolvedKey}`;
@@ -81,7 +75,7 @@ export async function rerankDocuments(config, query, documents) {
81
75
  if (!response.ok) {
82
76
  const rawBody = await readBodyWithByteCap(response).catch(() => "");
83
77
  const safeBody = redactSensitiveText(redactErrorBody(rawBody), resolvedKey ? [resolvedKey] : []);
84
- throw new RerankCallError(`Rerank request failed (${response.status}) ${config.endpoint}: ${safeBody}`, "provider_error");
78
+ throw new RerankCallError(`Rerank request failed (${response.status}) ${redactUrlCredentials(config.endpoint)}: ${safeBody}`, "provider_error");
85
79
  }
86
80
  const rawBody = await readBodyWithByteCap(response);
87
81
  let json;
@@ -89,10 +83,10 @@ export async function rerankDocuments(config, query, documents) {
89
83
  json = JSON.parse(rawBody);
90
84
  }
91
85
  catch {
92
- throw new RerankCallError(`Rerank response was not valid JSON ${config.endpoint}: ${redactSensitiveText(redactErrorBody(rawBody), resolvedKey ? [resolvedKey] : [])}`, "parse_error");
86
+ throw new RerankCallError(`Rerank response was not valid JSON ${redactUrlCredentials(config.endpoint)}: ${redactSensitiveText(redactErrorBody(rawBody), resolvedKey ? [resolvedKey] : [])}`, "parse_error");
93
87
  }
94
88
  if (!Array.isArray(json.results)) {
95
- throw new RerankCallError(`Rerank response from ${config.endpoint} has no "results" array.`, "parse_error");
89
+ throw new RerankCallError(`Rerank response from ${redactUrlCredentials(config.endpoint)} has no "results" array.`, "parse_error");
96
90
  }
97
91
  const scored = new Map();
98
92
  for (const entry of json.results) {
@@ -1,34 +1,29 @@
1
1
  // This Source Code Form is subject to the terms of the Mozilla Public
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
- import { ConfigError } from "../core/errors.js";
5
- import { DEFAULT_LLM_TIMEOUT_MS } from "../integrations/agent/config.js";
6
- import { buildExecution, resolveExecution } from "../integrations/agent/execution.js";
7
- import { runExecution } from "../integrations/agent/runner-dispatch.js";
8
- import { isContextSizeError, LlmCallError } from "./client.js";
9
- import { isLlmFeatureEnabled, tryLlmFeature, } from "./feature-gate.js";
10
4
  /**
11
- * Classify a thrown LLM error into one of the three buckets. This is the single
12
- * home for the `isContextSizeError -> html -> other` ladder that was previously
13
- * inlined at every call site.
5
+ * `callStructured()` — one model call on any runner kind.
6
+ *
7
+ * It resolves the call once (the runner's target, model and timeout, the call's
8
+ * own settings), lowers it for the runner's transport, dispatches it, and
9
+ * returns the reply text or the failure. A provider's failure (transport error,
10
+ * timeout, abort, a harness that exits non-zero) is a failed outcome, the same
11
+ * for every caller; only a configuration failure throws, because it is not the
12
+ * provider's and no fallback can repair it.
13
+ *
14
+ * What stays per-caller: reading the reply (the structured loop, `llm/structured.ts`),
15
+ * and what a failed outcome means for that caller.
14
16
  */
15
- export function classifyLlmError(err) {
16
- const message = err instanceof Error ? err.message : String(err);
17
- if (isContextSizeError(message))
18
- return "context_limit";
19
- if (err instanceof LlmCallError && err.code === "provider_html_error")
20
- return "html";
21
- return "other";
22
- }
17
+ import { ConfigError } from "../core/errors.js";
18
+ import { buildExecution, currentLayer, resolveExecution } from "../integrations/agent/execution.js";
19
+ import { runExecution } from "../integrations/agent/runner-dispatch.js";
23
20
  function own(value, key) {
24
21
  return value !== undefined && Object.hasOwn(value, key);
25
22
  }
26
23
  /**
27
24
  * @internal Exact request-to-cascade projection, exported for presence-semantics contracts.
28
- * Model work is bounded: with no timeout from the request or the runner, it
29
- * gets {@link DEFAULT_LLM_TIMEOUT_MS} on every runner kind.
30
25
  */
31
- export function resolveStructuredCurrent(current, request, runner) {
26
+ export function resolveStructuredCurrent(current, request) {
32
27
  const out = current ? { ...current } : {};
33
28
  const requestHasInference = own(request, "temperature") || own(request, "maxTokens") || own(request, "enableThinking");
34
29
  const baseInference = current?.inference && typeof current.inference === "object" && !Array.isArray(current.inference)
@@ -51,9 +46,6 @@ export function resolveStructuredCurrent(current, request, runner) {
51
46
  }
52
47
  if (own(request, "timeoutMs"))
53
48
  out.timeout = request?.timeoutMs ?? null;
54
- else if (runner && !Object.hasOwn(runner, "timeoutMs") && !own(current, "timeout")) {
55
- out.timeout = DEFAULT_LLM_TIMEOUT_MS;
56
- }
57
49
  return Object.keys(out).length > 0 ? out : undefined;
58
50
  }
59
51
  function requireTerminalUserMessage(messages) {
@@ -66,92 +58,46 @@ function requireTerminalUserMessage(messages) {
66
58
  conversation: messages.slice(0, -1).map((message) => ({ role: message.role, content: message.content })),
67
59
  };
68
60
  }
69
- function dispatchFailure(result) {
70
- const message = result.error ?? result.stderr ?? result.reason ?? "dispatch failed";
71
- const error = result.llmErrorCode ? new LlmCallError(message, result.llmErrorCode) : new Error(message);
72
- return Object.assign(error, { reason: result.reason, result });
73
- }
74
- /** The runner's failure reason (`timeout`, `aborted`, …) a failed dispatch threw with, whatever its kind. */
75
- export function dispatchFailureReason(err) {
76
- return err instanceof Error ? err.reason : undefined;
61
+ /** Timeout and abort come from the dispatch's own reason, whatever the runner's kind. */
62
+ function failed(error, result) {
63
+ const reason = result?.reason;
64
+ return {
65
+ ok: false,
66
+ reason: reason === "timeout" || reason === "aborted" ? reason : "error",
67
+ error,
68
+ ...(result ? { result } : {}),
69
+ };
77
70
  }
78
- /** The failed dispatch's own result (an agent's exit code and stderr, say), whatever its kind. */
79
- export function dispatchFailureResult(err) {
80
- return err instanceof Error ? err.result : undefined;
71
+ /** A dispatch's result as the reply it produced or the failure it reports. */
72
+ export function outcomeOf(result) {
73
+ return result.ok
74
+ ? { ok: true, raw: result.stdout }
75
+ : failed(result.error ?? result.stderr ?? result.reason ?? "dispatch failed", result);
81
76
  }
82
77
  export async function callStructured(opts) {
83
- const { feature, akmConfig, enabled, messages, request, parse, onError, fallback, onFallback } = opts;
84
- // A disabled feature owns a true no-work path: it does not need a runner,
85
- // messages, authorization, lowering, or provider state. Some commands keep
86
- // their runner optional precisely because a disabled feature must fall back
87
- // before execution planning begins.
88
- if (akmConfig !== undefined && !isLlmFeatureEnabled(akmConfig, feature, enabled)) {
89
- return tryLlmFeature(feature, akmConfig, async () => fallback, fallback, {
90
- ...(own(request, "timeoutMs") ? { timeoutMs: request?.timeoutMs } : {}),
91
- ...(enabled !== undefined ? { enabled } : {}),
92
- onFallback,
93
- });
94
- }
95
- const runner = opts.runner;
96
- if (!runner)
97
- throw new TypeError("callStructured requires a resolved runner");
98
- const terminal = requireTerminalUserMessage(messages);
99
- // `gateSignal` aborts when the feature gate's timeout fires, so the dispatch stops with it.
100
- // Every structured call is unattended model work, so it runs under the model-work tool policy.
101
- const prepareInvocation = () => {
78
+ const { runner, messages, request } = opts;
79
+ try {
80
+ const terminal = requireTerminalUserMessage(messages);
81
+ // Every structured call is unattended model work, so it runs under the model-work tool policy.
102
82
  const prepared = resolveExecution({
103
83
  content: terminal.content,
104
84
  conversation: terminal.conversation,
105
85
  runner,
106
- current: resolveStructuredCurrent(opts.current, request, runner),
86
+ layers: [currentLayer(resolveStructuredCurrent(opts.current, request) ?? {})],
107
87
  modelWork: true,
108
88
  });
109
89
  const lowered = buildExecution(prepared.request, prepared.runner);
110
90
  opts.onNotices?.(lowered.notices);
111
- return async (gateSignal) => {
112
- const signal = request?.signal && gateSignal ? AbortSignal.any([request.signal, gateSignal]) : (request?.signal ?? gateSignal);
113
- const runOptions = { ...request?.runOptions, ...(signal ? { signal } : {}) };
114
- const result = await runExecution(lowered, {
115
- ...(request?.chat ? { chat: request.chat } : {}),
116
- ...(request?.runSdk ? { runSdk: request.runSdk } : {}),
117
- ...(request?.onRetryAttempt ? { onRetryAttempt: request.onRetryAttempt } : {}),
118
- ...(Object.keys(runOptions).length > 0 ? { runOptions } : {}),
119
- });
120
- if (!result.ok)
121
- throw dispatchFailure(result);
122
- return parse(result.stdout);
123
- };
124
- };
125
- // UNGATED: run the chat+parse directly. Errors propagate — no `onError`
126
- // funnel — matching the pre-gate behaviour of direct callers.
127
- if (akmConfig === undefined) {
128
- return prepareInvocation()();
91
+ const result = await runExecution(lowered, {
92
+ ...(request?.chat ? { chat: request.chat } : {}),
93
+ ...(request?.onRetryAttempt ? { onRetryAttempt: request.onRetryAttempt } : {}),
94
+ ...(request?.signal ? { signal: request.signal } : {}),
95
+ });
96
+ return outcomeOf(result);
97
+ }
98
+ catch (err) {
99
+ if (err instanceof ConfigError)
100
+ throw err;
101
+ return failed(err instanceof Error ? err.message : String(err));
129
102
  }
130
- // On an enabled path, preparation/lowering happen OUTSIDE tryLlmFeature so
131
- // authorization and invalid-config failures remain hard failures instead of
132
- // being mistaken for provider fallbacks.
133
- const invoke = prepareInvocation();
134
- // GATED: run through `tryLlmFeature`. A throw inside is classified ONCE and
135
- // routed to `onError`; `tryLlmFeature` returns `fallback` on disablement/timeout.
136
- const outcome = await tryLlmFeature(feature, akmConfig, async (gateSignal) => {
137
- try {
138
- return { kind: "value", value: await invoke(gateSignal) };
139
- }
140
- catch (err) {
141
- // Credential materialization remains dispatch-owned, so a missing
142
- // required symbolic credential can surface here. Preserve config
143
- // failures as hard pre-provider errors instead of sending them through
144
- // a leaf's provider/runtime fallback policy.
145
- if (err instanceof ConfigError)
146
- return { kind: "config-error", error: err };
147
- return { kind: "value", value: onError(classifyLlmError(err), err) };
148
- }
149
- }, { kind: "value", value: fallback }, {
150
- ...(own(request, "timeoutMs") ? { timeoutMs: request?.timeoutMs } : {}),
151
- ...(enabled !== undefined ? { enabled } : {}),
152
- onFallback,
153
- });
154
- if (outcome.kind === "config-error")
155
- throw outcome.error;
156
- return outcome.value;
157
103
  }
@@ -0,0 +1,60 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ /**
5
+ * The one corrective loop for a model call whose reply must have a shape:
6
+ * dispatch, parse, and, when the parser refuses the reply, one more dispatch that
7
+ * carries what was wrong. Whoever dispatches decides how the correction reaches
8
+ * the model (appended to the prompt, or as the next turns of the conversation);
9
+ * whoever parses decides what a good reply is.
10
+ *
11
+ * Only a refused reply is corrected. A dispatch that fails, in transport or by
12
+ * timeout, ends the loop with that failure as the dispatch reported it: the
13
+ * transports own their retries, and a command is never run twice to fix its
14
+ * output (`attempts: 1`).
15
+ */
16
+ import { parseEmbeddedJsonResponse } from "../core/parse.js";
17
+ /** The reply was refused by the parser, as against the dispatch failing. */
18
+ export function isRefused(result) {
19
+ return !result.ok && "errors" in result;
20
+ }
21
+ /** The default instruction for a refused reply. */
22
+ export function correctionText(refusal) {
23
+ if ((refusal.reason ?? "parse_error") === "parse_error") {
24
+ return "Your previous response contained no parseable JSON. Respond with ONLY a JSON value that matches the requested schema — no prose, no code fences.";
25
+ }
26
+ return `Your previous JSON response failed validation:\n- ${refusal.errors.join("\n- ")}\nRespond again with ONLY a corrected JSON value.`;
27
+ }
28
+ export async function structuredLoop(options) {
29
+ const attempts = Math.max(1, options.attempts ?? 2);
30
+ const correct = options.correct ?? correctionText;
31
+ let correction;
32
+ for (let attempt = 1;; attempt += 1) {
33
+ const dispatched = await options.dispatch(correction);
34
+ if (!dispatched.ok)
35
+ return { ...dispatched, attempts: attempt };
36
+ const raw = dispatched.raw;
37
+ const parsed = options.parse(raw);
38
+ if (parsed.ok)
39
+ return { ok: true, value: parsed.value, raw, attempts: attempt };
40
+ if (attempt >= attempts) {
41
+ return { ok: false, reason: parsed.reason ?? "parse_error", errors: parsed.errors, raw, attempts: attempt };
42
+ }
43
+ correction = { text: correct(parsed), reply: raw };
44
+ }
45
+ }
46
+ /**
47
+ * A parser for a reply that is JSON, perhaps in prose or code fences: the JSON
48
+ * found in it, held to `validate`. A reply with no JSON in it is a `parse_error`;
49
+ * JSON that fails `validate` is a `validation_error`.
50
+ */
51
+ export function jsonParser(validate) {
52
+ return (raw) => {
53
+ const candidate = parseEmbeddedJsonResponse(raw);
54
+ if (candidate === undefined) {
55
+ return { ok: false, errors: ["no JSON structure found in response"], reason: "parse_error" };
56
+ }
57
+ const verdict = validate(candidate);
58
+ return verdict.ok ? verdict : { ...verdict, reason: verdict.reason ?? "validation_error" };
59
+ };
60
+ }
@@ -204,20 +204,14 @@ const agentMdRenderer = {
204
204
  buildShowResponse(ctx) {
205
205
  const name = deriveName(ctx);
206
206
  const parsedMd = parseFrontmatter(ctx.content());
207
- const toolPolicy = parsedMd.data.tools;
208
207
  const modelHint = typeof parsedMd.data.model === "string" ? parsedMd.data.model : undefined;
209
208
  return {
210
209
  type: "agent",
211
210
  name,
212
211
  path: ctx.absPath,
213
- action: "Dispatch using the prompt below verbatim. Use modelHint and toolPolicy if present.",
212
+ action: "Dispatch using the prompt below verbatim. Use modelHint if present.",
214
213
  description: asNonEmptyString(parsedMd.data.description),
215
214
  prompt: parsedMd.content,
216
- // `tools` is self-declared frontmatter. The provenance CEILING that decides
217
- // whether this self-declared policy is honoured is applied at the show
218
- // layer (`akmShowUnified`), which knows whether the source is the operator's
219
- // own writable stash vs a read-only third-party source (07 P1-D).
220
- ...(toolPolicy !== undefined ? { toolPolicy } : {}),
221
215
  ...(modelHint !== undefined ? { modelHint } : {}),
222
216
  };
223
217
  },
@@ -240,7 +234,7 @@ const knowledgeMdRenderer = {
240
234
  };
241
235
  // ── 4c. lesson-md ────────────────────────────────────────────────────────────
242
236
  /**
243
- * Renderer for the `lesson` asset type (v1 spec §13).
237
+ * Renderer for the `lesson` asset type.
244
238
  *
245
239
  * Lessons are markdown files with required `description` and `when_to_use`
246
240
  * frontmatter. The renderer projects both fields explicitly so consumers can