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
@@ -2,48 +2,49 @@
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  /**
5
- * Local embedder backed by the external @huggingface/transformers package.
5
+ * Local embedder: a BERT-family embedding model run with onnxruntime-node,
6
+ * its text encoded by @huggingface/tokenizers, mean-pooled over the attention
7
+ * mask and L2-normalised.
6
8
  *
7
- * Encapsulates the transformer pipeline lifecycle as instance state on a
8
- * `LocalEmbedder` so tests can construct fresh instances without leaking
9
- * pipelines across tests. The facade in `../embedder.ts` keeps a single
10
- * shared instance for the production code path.
9
+ * Encapsulates the model's lifecycle as instance state on a `LocalEmbedder` so
10
+ * tests can construct fresh instances without leaking loaded models across
11
+ * tests. The facade in `../embedder.ts` keeps a single shared instance for the
12
+ * production code path.
11
13
  */
14
+ import fs from "node:fs";
12
15
  import path from "node:path";
13
- import { getCacheDir } from "../../core/paths.js";
14
- import { warn } from "../../core/warn.js";
16
+ import { preloadOnnxRuntimeLibrary } from "../../standalone/onnxruntime-library.js";
17
+ import { ensureLocalModelFiles } from "./local-model-files.js";
15
18
  /**
16
- * Default local transformer model for embeddings.
19
+ * Default local model for embeddings.
17
20
  * `bge-small-en-v1.5` scores higher on MTEB benchmarks than the previous
18
21
  * `all-MiniLM-L6-v2` at the same 384-dimension footprint.
19
22
  */
20
23
  export const DEFAULT_LOCAL_MODEL = "Xenova/bge-small-en-v1.5";
21
- /** Type-guard: true when the value looks like a batch Tensor (has .dims). */
22
- function isBatchTensor(v) {
23
- return (v !== null &&
24
- typeof v === "object" &&
25
- v.data instanceof Float32Array &&
26
- "dims" in v &&
27
- Array.isArray(v.dims) &&
28
- v.dims.length === 2 &&
29
- v.dims.every((dim) => Number.isInteger(dim) && dim > 0));
30
- }
31
- function isEnabledEnvironmentFlag(value) {
32
- return /^(?:1|true|yes|on)$/i.test(value?.trim() ?? "");
24
+ /** The runtime the local embedder reports once its model has loaded. */
25
+ export const LOCAL_EMBEDDING_RUNTIME = "onnxruntime-node";
26
+ /**
27
+ * The embedding runtime is not usable on this machine. `platform`: onnxruntime-node
28
+ * has no native library for it, so keyword search is all there is. `load`: it has
29
+ * one, which did not load (a missing package or addon, a `noexec` temp or cache
30
+ * directory).
31
+ */
32
+ export class LocalRuntimeUnavailableError extends Error {
33
+ kind;
34
+ constructor(message, kind) {
35
+ super(message);
36
+ this.kind = kind;
37
+ }
33
38
  }
34
- const realTransformersLoader = () => import("@huggingface/transformers");
35
- let transformersLoader = realTransformersLoader;
36
- /** TEST-ONLY. Swap the transformers module loader; pass undefined to restore. */
37
- export function _setTransformersLoaderForTests(fake) {
38
- transformersLoader = fake ?? realTransformersLoader;
39
+ let pipelineLoader = loadOnnxPipeline;
40
+ /** TEST-ONLY. Swap the model loader; pass undefined to restore. */
41
+ export function _setLocalPipelineLoaderForTests(fake) {
42
+ pipelineLoader = fake ?? loadOnnxPipeline;
39
43
  }
40
- const LOCAL_EMBEDDER_DTYPE = "fp32";
41
- const LOCAL_EMBEDDER_FALLBACK_DTYPE = "auto";
42
44
  /**
43
- * Maximum texts per batch for the local transformers pipeline. The pipeline
44
- * can run genuine batched inference over a string array; 32 is a safe default
45
- * that fits well inside most model context budgets while providing 10–50×
46
- * throughput improvement over one-at-a-time calls on the cold minority.
45
+ * Maximum texts per batch for the local model. 32 is a safe default that fits
46
+ * well inside most model context budgets while providing 10–50× throughput
47
+ * improvement over one-at-a-time calls on the cold minority.
47
48
  */
48
49
  const LOCAL_BATCH_SIZE = 32;
49
50
  /**
@@ -54,6 +55,105 @@ const LOCAL_BATCH_SIZE = 32;
54
55
  function resolveLocalModelName(overrideModel) {
55
56
  return overrideModel || DEFAULT_LOCAL_MODEL;
56
57
  }
58
+ /**
59
+ * A standalone binary built for a target with no native library (`none`) must not
60
+ * bundle the package: its addon for that platform does not exist. The bundler
61
+ * drops only the branch a build constant rules out, so the import sits in an
62
+ * `else`, not after the `throw`.
63
+ */
64
+ async function importOnnxRuntime() {
65
+ if (typeof AKM_STANDALONE_NATIVE_MODULE !== "undefined" && AKM_STANDALONE_NATIVE_MODULE === "./native/none") {
66
+ throw new Error("no native library is available for this platform");
67
+ }
68
+ else {
69
+ await preloadOnnxRuntimeLibrary();
70
+ return import("onnxruntime-node");
71
+ }
72
+ }
73
+ /**
74
+ * Whether onnxruntime-node has a native library for this machine. A standalone
75
+ * binary knows from its build (`none`). The package has one for glibc Linux
76
+ * x64/arm64, Apple-silicon macOS and Windows x64/arm64, and none for musl Linux
77
+ * or Intel macOS.
78
+ */
79
+ function hasNativeLibrary() {
80
+ if (typeof AKM_STANDALONE_NATIVE_MODULE !== "undefined")
81
+ return AKM_STANDALONE_NATIVE_MODULE !== "./native/none";
82
+ if (process.platform === "linux") {
83
+ const header = process.report?.getReport()?.header;
84
+ if (!header?.glibcVersionRuntime)
85
+ return false;
86
+ }
87
+ return ["linux-x64", "linux-arm64", "darwin-arm64", "win32-x64", "win32-arm64"].includes(`${process.platform}-${process.arch}`);
88
+ }
89
+ async function loadOnnxRuntime() {
90
+ try {
91
+ return await importOnnxRuntime();
92
+ }
93
+ catch (error) {
94
+ const msg = error instanceof Error ? error.message : String(error);
95
+ const kind = hasNativeLibrary() ? "load" : "platform";
96
+ // Only the package itself missing calls for a reinstall; a platform it ships no addon for (Intel macOS) fails on
97
+ // `../bin/napi-v6/<platform>/<arch>/onnxruntime_binding.node` and is reported below.
98
+ if (kind === "load" && /Cannot find (?:module|package) ['"]onnxruntime-node['"]/.test(msg)) {
99
+ throw new LocalRuntimeUnavailableError("Semantic search requires onnxruntime-node. Reinstall akm-cli.", kind);
100
+ }
101
+ throw new LocalRuntimeUnavailableError(`Failed to load the embedding runtime (onnxruntime-node): ${msg}. Semantic search with the local model is unavailable; keyword search still works.`, kind);
102
+ }
103
+ }
104
+ /** The mean of one text's token vectors (padding excluded), scaled to unit length. */
105
+ function meanPooled(hidden, offset, tokens, dim) {
106
+ const vector = new Float32Array(dim);
107
+ for (let token = 0; token < tokens; token++) {
108
+ for (let k = 0; k < dim; k++)
109
+ vector[k] = vector[k] + hidden[offset + token * dim + k];
110
+ }
111
+ let norm = 0;
112
+ for (let k = 0; k < dim; k++) {
113
+ vector[k] = vector[k] / tokens;
114
+ norm += vector[k] ** 2;
115
+ }
116
+ return vector.map((value) => value / Math.sqrt(norm));
117
+ }
118
+ async function loadOnnxPipeline(modelName) {
119
+ const ort = await loadOnnxRuntime();
120
+ const { Tokenizer } = await import("@huggingface/tokenizers");
121
+ const modelDir = await ensureLocalModelFiles(modelName);
122
+ const readJson = (file) => JSON.parse(fs.readFileSync(path.join(modelDir, file), "utf8"));
123
+ const tokenizerConfig = readJson("tokenizer_config.json");
124
+ const tokenizer = new Tokenizer(readJson("tokenizer.json"), tokenizerConfig);
125
+ const maxLength = typeof tokenizerConfig.model_max_length === "number" ? tokenizerConfig.model_max_length : Number.POSITIVE_INFINITY;
126
+ const session = await ort.InferenceSession.create(path.join(modelDir, "onnx", "model.onnx"), {
127
+ executionProviders: ["cpu"],
128
+ logSeverityLevel: 3,
129
+ });
130
+ return async (texts) => {
131
+ // A text longer than the model's maximum is cut to it. Shorter ones are padded
132
+ // to the longest in the batch; the mask keeps padding out of the pooling.
133
+ const encoded = texts.map((text) => tokenizer.encode(text).ids.slice(0, maxLength));
134
+ const length = Math.max(...encoded.map((row) => row.length));
135
+ const ids = new BigInt64Array(texts.length * length);
136
+ const mask = new BigInt64Array(texts.length * length);
137
+ encoded.forEach((row, i) => {
138
+ row.forEach((id, j) => {
139
+ ids[i * length + j] = BigInt(id);
140
+ mask[i * length + j] = 1n;
141
+ });
142
+ });
143
+ const dims = [texts.length, length];
144
+ const inputs = {
145
+ input_ids: new ort.Tensor("int64", ids, dims),
146
+ attention_mask: new ort.Tensor("int64", mask, dims),
147
+ token_type_ids: new ort.Tensor("int64", new BigInt64Array(texts.length * length), dims),
148
+ };
149
+ // Models that take fewer inputs (no token_type_ids) are fed only theirs.
150
+ const feeds = Object.fromEntries(session.inputNames.flatMap((name) => (inputs[name] ? [[name, inputs[name]]] : [])));
151
+ const outputs = await session.run(feeds);
152
+ const hidden = (outputs.last_hidden_state ?? outputs.token_embeddings ?? outputs.logits)?.data;
153
+ const dim = hidden.length / (texts.length * length);
154
+ return encoded.map((row, i) => meanPooled(hidden, i * length * dim, row.length, dim));
155
+ };
156
+ }
57
157
  export class LocalEmbedder {
58
158
  defaultModel;
59
159
  /**
@@ -63,6 +163,8 @@ export class LocalEmbedder {
63
163
  */
64
164
  pipelinePromise;
65
165
  pipelineModelName;
166
+ /** The runtime this embedder embeds with: set once a model has loaded, `undefined` before. */
167
+ runtime;
66
168
  constructor(defaultModel) {
67
169
  this.defaultModel = defaultModel;
68
170
  }
@@ -70,6 +172,7 @@ export class LocalEmbedder {
70
172
  reset() {
71
173
  this.pipelinePromise = undefined;
72
174
  this.pipelineModelName = undefined;
175
+ this.runtime = undefined;
73
176
  }
74
177
  async embed(text, signal) {
75
178
  if (signal?.aborted) {
@@ -79,8 +182,8 @@ export class LocalEmbedder {
79
182
  }
80
183
  /**
81
184
  * Embed a batch of texts. Processes in chunks of `LOCAL_BATCH_SIZE` (32) so
82
- * the transformers pipeline can run genuine batched inference rather than one
83
- * call per text. Each chunk is checked against the AbortSignal between calls.
185
+ * the model can run genuine batched inference rather than one call per text.
186
+ * Each chunk is checked against the AbortSignal between calls.
84
187
  *
85
188
  * `onBatch`, when given, fires once per chunk (indices into `texts` + the
86
189
  * chunk's embeddings) as it completes (#954) — parity with
@@ -100,24 +203,7 @@ export class LocalEmbedder {
100
203
  throw signal.reason instanceof Error ? signal.reason : new Error("embedding interrupted");
101
204
  }
102
205
  const chunk = texts.slice(i, i + LOCAL_BATCH_SIZE);
103
- // @huggingface/transformers 4.2 returns a single batch Tensor. Validate
104
- // that exact shape and propagate inference failures without re-executing
105
- // the same inputs through a second runtime path.
106
- const batchResult = await pipeline(chunk, {
107
- pooling: "mean",
108
- normalize: true,
109
- });
110
- if (!isBatchTensor(batchResult)) {
111
- throw new Error("unexpected pipeline return shape for batch input");
112
- }
113
- const [batch, dim] = batchResult.dims;
114
- if (batch !== chunk.length || batchResult.data.length !== batch * dim) {
115
- throw new Error("unexpected pipeline return shape for batch input");
116
- }
117
- const chunkEmbeddings = [];
118
- for (let row = 0; row < chunk.length; row++) {
119
- chunkEmbeddings.push(Array.from(batchResult.data.subarray(row * dim, (row + 1) * dim)));
120
- }
206
+ const chunkEmbeddings = (await pipeline(chunk)).map((vector) => Array.from(vector));
121
207
  results.push(...chunkEmbeddings);
122
208
  onBatch?.(Array.from({ length: chunk.length }, (_, row) => i + row), chunkEmbeddings);
123
209
  }
@@ -126,13 +212,13 @@ export class LocalEmbedder {
126
212
  /** Embed using a model name override (used by the facade for per-call model overrides). */
127
213
  async embedWithModel(text, modelName) {
128
214
  const pipeline = await this.getPipeline(modelName);
129
- const result = await pipeline(text, { pooling: "mean", normalize: true });
130
- return Array.from(result.data);
215
+ const [vector] = await pipeline([text]);
216
+ return Array.from(vector);
131
217
  }
132
218
  /**
133
- * Eagerly load (or return the cached) underlying pipeline. Used by
134
- * availability checks that want to surface model-download failures
135
- * without performing a real embed call.
219
+ * Eagerly load (or return the cached) model. Used by availability checks
220
+ * that want to surface model-download and runtime failures without
221
+ * performing a real embed call.
136
222
  */
137
223
  async getPipeline(modelName) {
138
224
  const resolvedModel = resolveLocalModelName(modelName);
@@ -142,36 +228,10 @@ export class LocalEmbedder {
142
228
  }
143
229
  if (!this.pipelinePromise) {
144
230
  this.pipelineModelName = resolvedModel;
145
- this.pipelinePromise = (async () => {
146
- // Ensure HuggingFace model cache lives in a stable location outside
147
- // node_modules so it survives package reinstalls.
148
- if (!process.env.HF_HOME) {
149
- process.env.HF_HOME = path.join(getCacheDir(), "models");
150
- }
151
- let pipeline;
152
- try {
153
- const mod = await transformersLoader();
154
- // Transformers.js 4.x defaults its filesystem cache underneath the
155
- // installed package and no longer derives it from HF_HOME. Point the
156
- // public runtime setting at our stable cache explicitly so package
157
- // reinstalls and test-sandbox HOME rotation do not re-download the
158
- // model. The exact pinned 4.2 module owns this public environment.
159
- mod.env.cacheDir = process.env.HF_HOME;
160
- if (isEnabledEnvironmentFlag(process.env.HF_HUB_OFFLINE)) {
161
- mod.env.allowRemoteModels = false;
162
- }
163
- pipeline = mod.pipeline;
164
- }
165
- catch (importError) {
166
- const msg = importError instanceof Error ? importError.message : String(importError);
167
- if (/Cannot find (?:module|package)|MODULE_NOT_FOUND|ERR_MODULE_NOT_FOUND|Cannot resolve/i.test(msg)) {
168
- throw new Error("Semantic search requires @huggingface/transformers. Reinstall akm-cli.");
169
- }
170
- throw new Error(`Failed to load embedding runtime: ${msg}. Check platform compatibility.`);
171
- }
172
- const pipelineFn = pipeline;
173
- return createLocalPipeline(pipelineFn, resolvedModel);
174
- })();
231
+ this.pipelinePromise = pipelineLoader(resolvedModel).then((pipeline) => {
232
+ this.runtime = LOCAL_EMBEDDING_RUNTIME;
233
+ return pipeline;
234
+ });
175
235
  // HI-13: Clear the cached promise on failure so the next call retries
176
236
  // instead of permanently rejecting every subsequent call with the same error.
177
237
  this.pipelinePromise.catch(() => {
@@ -182,32 +242,3 @@ export class LocalEmbedder {
182
242
  return this.pipelinePromise;
183
243
  }
184
244
  }
185
- async function createLocalPipeline(pipelineFn, modelName) {
186
- try {
187
- return await pipelineFn("feature-extraction", modelName, { dtype: LOCAL_EMBEDDER_DTYPE });
188
- }
189
- catch (error) {
190
- if (!shouldRetryWithoutExplicitDtype(error)) {
191
- throw error;
192
- }
193
- warn('Local embedding model "%s" rejected explicit dtype "%s"; retrying with explicit fallback dtype "%s".', modelName, LOCAL_EMBEDDER_DTYPE, LOCAL_EMBEDDER_FALLBACK_DTYPE);
194
- return pipelineFn("feature-extraction", modelName, { dtype: LOCAL_EMBEDDER_FALLBACK_DTYPE });
195
- }
196
- }
197
- function shouldRetryWithoutExplicitDtype(error) {
198
- const message = error instanceof Error ? error.message : String(error);
199
- return /dtype|fp32|precision|quant/i.test(message);
200
- }
201
- /**
202
- * Check whether the declared Transformers dependency can be resolved without
203
- * loading a model.
204
- */
205
- export function isTransformersAvailable() {
206
- try {
207
- import.meta.resolve("@huggingface/transformers");
208
- return true;
209
- }
210
- catch {
211
- return false;
212
- }
213
- }
@@ -9,12 +9,10 @@
9
9
  */
10
10
  import { abortableDelay, backoffDelay, fetchWithTimeout, isHttpUrl, readBodyWithByteCap } from "../../core/common.js";
11
11
  import { concurrentMap } from "../../core/concurrent.js";
12
- import { resolveSecret } from "../../core/config/config.js";
13
- import { ENV_REFERENCE_PATTERN, SECRET_STORE_REFERENCE_PATTERN } from "../../core/config/schema/primitives.js";
12
+ import { apiKeyReference, readCredential, resolveApiKey } from "../../core/config/credentials.js";
14
13
  import { defaultConcurrencyForEndpoint } from "../../core/loopback.js";
15
- import { redactErrorBody, redactSensitiveText } from "../../core/redaction.js";
14
+ import { redactErrorBody, redactSensitiveText, redactUrlCredentials } from "../../core/redaction.js";
16
15
  import { warnVerbose } from "../../core/warn.js";
17
- import { resolveSecretFromStore } from "../../sources/snapshot-fetchers/secret-seam.js";
18
16
  /**
19
17
  * Upper bound on the number of documents in one HTTP request, independent of
20
18
  * the token budget below. Overridable via `config.batchSize`. Purely a
@@ -752,9 +750,12 @@ export class RemoteEmbedder {
752
750
  }
753
751
  return results;
754
752
  }
753
+ resolveKey() {
754
+ return resolveApiKey(this.config.apiKey, embeddingSlot(this.config), this.config.endpoint ?? "");
755
+ }
755
756
  buildHeaders() {
756
757
  const headers = { "Content-Type": "application/json" };
757
- const resolvedKey = resolveSecret(this.config.apiKey, resolveSecretFromStore);
758
+ const resolvedKey = this.resolveKey();
758
759
  if (resolvedKey) {
759
760
  headers.Authorization = `Bearer ${resolvedKey}`;
760
761
  }
@@ -770,7 +771,7 @@ export class RemoteEmbedder {
770
771
  * far unredacted and uncapped, at readBodyWithByteCap's 10 MB default.
771
772
  */
772
773
  safeErrorBody(body) {
773
- const resolvedKey = resolveSecret(this.config.apiKey, resolveSecretFromStore);
774
+ const resolvedKey = this.resolveKey();
774
775
  return redactSensitiveText(redactErrorBody(body), resolvedKey ? [resolvedKey] : []);
775
776
  }
776
777
  }
@@ -813,7 +814,7 @@ export function normalizeEmbeddingEndpoint(endpoint) {
813
814
  function embeddingEndpointPathHint(endpoint) {
814
815
  const normalizedEndpoint = normalizeEmbeddingEndpoint(endpoint);
815
816
  if (normalizedEndpoint !== endpoint) {
816
- return ` Check that your endpoint includes the full embeddings path (for example "${normalizedEndpoint}", not just "${endpoint}").`;
817
+ return ` Check that your endpoint includes the full embeddings path (for example "${redactUrlCredentials(normalizedEndpoint)}", not just "${redactUrlCredentials(endpoint)}").`;
817
818
  }
818
819
  return "";
819
820
  }
@@ -842,22 +843,24 @@ function resolveOllamaOptions(config) {
842
843
  export function hasRemoteEndpoint(config) {
843
844
  return isHttpUrl(config.endpoint);
844
845
  }
846
+ /** Where the embedding key is stored: the serving connection's slot when a connection serves the model, else the embedding service's own. */
847
+ function embeddingSlot(config) {
848
+ return config.credentialName !== undefined ? { connection: config.credentialName } : { service: "embedding" };
849
+ }
845
850
  /**
846
- * Describe WHERE an `embedding.apiKey` came from, never its value — the
847
- * actionable outcome of the #953 field gap: `resolveSecret` throws on an
848
- * unresolvable `secret://` reference, so a keyless request can only mean
849
- * `embedding.apiKey` was absent from the config the run actually loaded (a
850
- * different config root, scope, or a config edited after the run started).
851
- * A default-level progress line naming the credential's SOURCE (this
852
- * helper), printed once before the first provider request, lets a field run
853
- * self-diagnose that without ever surfacing the secret itself.
851
+ * Describe WHERE the embedding key comes from, never its value: the `$VAR`
852
+ * reference in `embedding.apiKey` (or its default connection's), the key in
853
+ * `credentials.json` filed under `embedding` (or under that connection's
854
+ * name), or nothing. A keyless request can only mean neither was present in the
855
+ * config the run actually loaded (a different config root, scope, or a config
856
+ * edited after the run started). A default-level progress line naming the
857
+ * credential's SOURCE (this helper), printed once before the first provider
858
+ * request, lets a field run self-diagnose that without ever surfacing the
859
+ * secret itself (#953).
854
860
  */
855
- export function describeEmbeddingCredential(apiKey) {
856
- if (!apiKey)
857
- return "none configured";
858
- if (SECRET_STORE_REFERENCE_PATTERN.test(apiKey))
859
- return `${apiKey} (store)`;
860
- if (ENV_REFERENCE_PATTERN.test(apiKey))
861
- return `${apiKey} (env)`;
862
- return "literal apiKey";
861
+ export function describeEmbeddingCredential(config) {
862
+ const reference = apiKeyReference(config.apiKey);
863
+ if (reference)
864
+ return `${reference} (env)`;
865
+ return readCredential(embeddingSlot(config), config.endpoint ?? "") ? "credentials.json" : "none configured";
863
866
  }
@@ -6,7 +6,7 @@
6
6
  *
7
7
  * Lives next to {@link EmbeddingVector} so importers (notably `db.ts`)
8
8
  * can pull just the math without dragging in the embedder facade and its
9
- * transitive Transformers.js runtime import chain.
9
+ * transitive embedding runtime import chain.
10
10
  *
11
11
  * Returns 0 when the vectors have different dimensions — silently
12
12
  * computing on a truncated view would produce meaningless scores.
@@ -1,50 +1,44 @@
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 { cloneExecutionJsonObject } from "../execution/json.js";
5
- import { buildExecution, resolveExecution } from "../integrations/agent/execution.js";
4
+ import { SHIPPED_ALIAS } from "../core/config/model-aliases.js";
5
+ import { ConfigError } from "../core/errors.js";
6
+ import { executionDefaultsOf } from "../execution/source.js";
7
+ import { buildExecution, resolveExecution, shippedAlias } from "../integrations/agent/execution.js";
6
8
  const NO_LOWERING_NOTICES = Object.freeze([]);
7
- function own(value, key) {
8
- return value !== undefined && Object.hasOwn(value, key);
9
- }
10
- /** Adapt one index invocation layer into the shared execution vocabulary. */
11
- function indexExecutionDefaults(layer) {
12
- if (!layer)
13
- return {};
14
- return {
15
- ...(own(layer, "engine") ? { engine: layer.engine } : {}),
16
- ...(own(layer, "model") ? { model: layer.model } : {}),
17
- ...(own(layer, "timeoutMs") ? { timeout: layer.timeoutMs } : {}),
18
- ...(own(layer, "llm") && layer.llm !== undefined
19
- ? { inference: cloneExecutionJsonObject(layer.llm, "index pass LLM inference") }
20
- : {}),
21
- };
22
- }
23
9
  /**
24
- * Resolve standalone index passes from the index section only. Improve
25
- * strategies own improve-triggered calls and are intentionally not consulted.
10
+ * Resolve standalone index passes from the index section only (the index-wide
11
+ * settings, then the pass's own). Improve strategies own improve-triggered calls
12
+ * and are intentionally not consulted. No runner when the pass is off or no
13
+ * connection or harness is configured.
26
14
  */
27
15
  export function resolveIndexPassExecution(passName, config) {
28
16
  const pass = config.index?.[passName];
29
17
  if (pass?.enabled === false)
30
18
  return Object.freeze({ runner: undefined, notices: NO_LOWERING_NOTICES });
31
- const defaults = config.index?.defaults;
32
- const fallbackLlmEngine = config.defaults?.llmEngine;
33
- const selectedEngine = pass?.engine ?? defaults?.engine ?? fallbackLlmEngine;
34
- if (!selectedEngine)
35
- return Object.freeze({ runner: undefined, notices: NO_LOWERING_NOTICES });
36
- const invocationDefaults = {
37
- ...indexExecutionDefaults(defaults),
38
- ...(!own(defaults, "engine") && fallbackLlmEngine ? { engine: fallbackLlmEngine } : {}),
39
- };
40
- // Under the model-work tool policy, so an engine that cannot confine it is refused here.
41
- const prepared = resolveExecution({
42
- content: "",
43
- config,
44
- invocationDefaults,
45
- current: indexExecutionDefaults(pass),
46
- modelWork: true,
47
- });
48
- const lowered = buildExecution(prepared.request, prepared.runner);
49
- return Object.freeze({ runner: lowered.runner, notices: lowered.notices });
19
+ try {
20
+ // Under the model-work tool policy: confined where the harness can be, unrestricted (with a notice) elsewhere.
21
+ const prepared = resolveExecution({
22
+ content: "",
23
+ config,
24
+ layers: [
25
+ shippedAlias(SHIPPED_ALIAS.index),
26
+ {
27
+ id: "index",
28
+ kind: "invocation-defaults",
29
+ values: executionDefaultsOf(config.index),
30
+ },
31
+ { id: `index.${passName}`, kind: "invocation-defaults", values: executionDefaultsOf(pass) },
32
+ ],
33
+ modelWork: true,
34
+ });
35
+ const lowered = buildExecution(prepared.request, prepared.runner);
36
+ return Object.freeze({ runner: lowered.runner, notices: lowered.notices });
37
+ }
38
+ catch (error) {
39
+ if (error instanceof ConfigError && error.code === "LLM_NOT_CONFIGURED") {
40
+ return Object.freeze({ runner: undefined, notices: NO_LOWERING_NOTICES });
41
+ }
42
+ throw error;
43
+ }
50
44
  }