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
@@ -49,26 +49,42 @@ export function resolveWritable(entry) {
49
49
  return entry.writable;
50
50
  return entry.type === "filesystem";
51
51
  }
52
+ /**
53
+ * Whether a resolved source is write-activated. Only the primary stash and
54
+ * sources explicitly marked `writable: true` are writable; registry-cached
55
+ * (installed, read-only) sources are never written in place because
56
+ * `akm update` overwrites them.
57
+ */
58
+ export function isSourceWriteActivated(source) {
59
+ return source.writable === true;
60
+ }
52
61
  /** The two kinds writes are defined for; scheduler state binds only to these. */
53
62
  export function isWriteCapableSourceKind(kind) {
54
63
  return kind === "filesystem" || kind === "git";
55
64
  }
65
+ /**
66
+ * Throw when `name` is a configured bundle that is disabled. Callers run it
67
+ * after a name failed to resolve against the active set, so a disabled bundle
68
+ * is reported as disabled rather than as not configured.
69
+ */
70
+ export function assertBundleNotDisabled(akmConfig, name) {
71
+ if (resolveConfiguredSources(akmConfig).some((source) => source.name === name)) {
72
+ throw new UsageError(`Bundle "${name}" is disabled.`, "INVALID_FLAG_VALUE");
73
+ }
74
+ }
56
75
  /**
57
76
  * Resolve the destination for a write: explicit `--bundle`, then
58
77
  * `defaultWriteTarget`, then the working stash (`defaultBundle`). There is no
59
78
  * fallback to the first writable source.
60
79
  */
61
80
  export function resolveWriteTarget(akmConfig, explicitTarget, options = {}) {
62
- const allConfiguredSources = resolveConfiguredSources(akmConfig);
63
81
  const configuredSources = resolveActiveConfiguredSources(akmConfig);
64
82
  const requireWritable = options.requireWritable !== false;
65
83
  const flag = options.flag ?? "--bundle";
66
84
  if (explicitTarget) {
67
85
  const match = configuredSources.find((s) => s.name === explicitTarget);
68
86
  if (!match) {
69
- if (allConfiguredSources.some((source) => source.name === explicitTarget)) {
70
- throw new UsageError(`Bundle "${explicitTarget}" is disabled.`, "INVALID_FLAG_VALUE");
71
- }
87
+ assertBundleNotDisabled(akmConfig, explicitTarget);
72
88
  throw new UsageError(`${flag} must reference a source name from your config. No source named "${explicitTarget}" is configured. Run \`akm bundle list\` to see available sources.`, "INVALID_FLAG_VALUE");
73
89
  }
74
90
  if (requireWritable && !resolveWritable({ type: match.type, writable: match.writable })) {
@@ -6,15 +6,12 @@
6
6
  * `src/workflows/ir/params.ts` (workflow parameters) into a contract-shaped
7
7
  * vocabulary both workflow params AND task source v4's `inputs:`
8
8
  * declarations consume — one validation/coercion implementation, injected
9
- * per-caller diagnostics (D3-N3). Binding boundary: `src/execution/**` must
10
- * never import `src/workflows/**` (D3-N1) — `INPUT_NAME_PATTERN` and the
9
+ * per-caller diagnostics. Binding boundary: `src/execution/**` must
10
+ * never import `src/workflows/**` — `INPUT_NAME_PATTERN` and the
11
11
  * canonical-JSON helpers are therefore defined locally rather than imported
12
- * from the workflow side (D3-N1/D3-N2), verified by
12
+ * from the workflow side, verified by
13
13
  * `tests/execution/input-contract.test.ts`'s purity/byte-equality scans.
14
14
  * Pure module: no IO, no engine imports.
15
- *
16
- * See docs/architecture/decisions/0004-task-input-contract-and-flag-coercion.md
17
- * for the full generalization history and the D3-N1/D3-N2/D3-N3 rationale.
18
15
  */
19
16
  import { createHash } from "node:crypto";
20
17
  import { validateJsonSchemaSubset } from "../core/json-schema.js";
@@ -0,0 +1,49 @@
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 place lowering notices from several sources become one list.
6
+ *
7
+ * Notices are live execution metadata only: executor, report and output paths
8
+ * merge them, result and evidence journal writers never do.
9
+ */
10
+ import { sortExecutionJson } from "./json.js";
11
+ /**
12
+ * Merge notices in first-seen order, each once. Two notices are the same when
13
+ * everything about them is, `details` included and key order aside, so two
14
+ * genuinely different structured diagnostics are not collapsed because their
15
+ * headline fields match. `undefined` when there are none.
16
+ */
17
+ export function mergeNotices(...groups) {
18
+ const merged = new Map();
19
+ for (const group of groups) {
20
+ for (const notice of group ?? []) {
21
+ const key = JSON.stringify(sortExecutionJson(notice));
22
+ if (!merged.has(key))
23
+ merged.set(key, notice);
24
+ }
25
+ }
26
+ return merged.size > 0 ? Object.freeze([...merged.values()]) : undefined;
27
+ }
28
+ const NONE = Object.freeze([]);
29
+ /**
30
+ * The notices a run's dispatches report as they go, merged when read.
31
+ * `forward` also receives each batch as it arrives.
32
+ */
33
+ export function noticeSet(forward) {
34
+ const groups = [];
35
+ const add = (notices) => {
36
+ groups.push(notices);
37
+ forward?.(notices);
38
+ };
39
+ const list = () => mergeNotices(...groups) ?? NONE;
40
+ return {
41
+ add,
42
+ list,
43
+ /** `{ notices }` for a result that carries them, `{}` when there are none. */
44
+ fields: () => {
45
+ const notices = mergeNotices(...groups);
46
+ return notices ? { notices } : {};
47
+ },
48
+ };
49
+ }
@@ -3,25 +3,14 @@
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  import { sortExecutionJson } from "./json.js";
5
5
  import { decodeExecutionSourceIdentity, } from "./source.js";
6
- export const RESOLVED_EXECUTION_SCHEMA_VERSION = 1;
7
- const COMMAND_KEYS = ["template", "argumentInput", "content", "source", "extensions"];
8
- const PERSONA_KEYS = ["content", "source", "extensions"];
9
- const ENGINE_KEYS = ["name", "kind", "platform", "settings", "extensions"];
10
- const MODEL_KEYS = ["input", "interpretation", "resolved", "extensions"];
11
- const AUTHORIZATION_KEYS = ["status", "reason", "policy"];
12
- const RUNTIME_KEYS = ["timeoutMs", "workspace", "environment", "settings", "extensions"];
13
- const NOTICE_KEYS = ["code", "severity", "adapter", "field", "message", "details"];
6
+ export const RESOLVED_EXECUTION_SCHEMA_VERSION = 2;
7
+ const COMMAND_KEYS = ["template", "argumentInput", "content", "source"];
8
+ const PERSONA_KEYS = ["content", "source"];
9
+ const TARGET_KEYS = ["name", "kind", "platform"];
10
+ const MODEL_KEYS = ["model", "alias"];
11
+ const RUNTIME_KEYS = ["timeoutMs", "workspace", "environment"];
14
12
  const IDENTITY_KEYS = ["ref", "bundle", "adapter", "file", "hash"];
15
- const OPTIONAL_REQUEST_KEYS = [
16
- "conversation",
17
- "agent",
18
- "persona",
19
- "model",
20
- "inference",
21
- "outputSchema",
22
- "tools",
23
- "extensions",
24
- ];
13
+ const OPTIONAL_REQUEST_KEYS = ["conversation", "agent", "persona", "model", "inference", "outputSchema"];
25
14
  /** Copy the own, defined fields named by `keys`; omitted stays omitted, `null` stays `null`. */
26
15
  function pick(value, keys) {
27
16
  const record = value;
@@ -46,7 +35,6 @@ export function createResolvedCommand(input) {
46
35
  ...(input.argumentInput !== undefined ? { argumentInput: input.argumentInput } : {}),
47
36
  content: input.content,
48
37
  source: decodeExecutionSourceIdentity(input.source.identity),
49
- ...(input.source.extensions ? { extensions: input.source.extensions } : {}),
50
38
  });
51
39
  }
52
40
  export function createInlineResolvedCommand(input) {
@@ -64,28 +52,27 @@ export function createResolvedPersona(source) {
64
52
  return Object.freeze({
65
53
  content: source.content,
66
54
  source: decodeExecutionSourceIdentity(source.identity),
67
- ...(source.extensions ? { extensions: source.extensions } : {}),
68
55
  });
69
56
  }
70
57
  /** Freeze one request without normalizing away optional-field presence. */
71
58
  export function createResolvedExecutionRequest(input) {
72
- if (!input.command || !input.engine || !input.authorization || !input.runtime || !input.notices) {
73
- throw new TypeError("resolved execution request requires command, engine, authorization, runtime, and notices");
59
+ if (!input.command || !input.target || !input.runtime || typeof input.modelWork !== "boolean") {
60
+ throw new TypeError("resolved execution request requires command, target, modelWork, and runtime");
74
61
  }
75
62
  const out = {
76
63
  schemaVersion: RESOLVED_EXECUTION_SCHEMA_VERSION,
77
64
  command: input.command,
78
- engine: input.engine,
79
- authorization: input.authorization,
65
+ target: input.target,
66
+ modelWork: input.modelWork,
80
67
  runtime: input.runtime,
81
- notices: input.notices,
82
68
  ...pick(input, OPTIONAL_REQUEST_KEYS),
83
69
  };
84
70
  return Object.freeze(out);
85
71
  }
86
72
  /**
87
73
  * Rehydrate a frozen JSON request after workflow resume/replay. Tolerant of
88
- * unknown keys; refuses only a request written by a newer schema.
74
+ * unknown keys; refuses a request of any other schema version: an earlier
75
+ * release's names an engine and cannot run now.
89
76
  */
90
77
  export function decodeResolvedExecutionRequest(value) {
91
78
  const input = requireRecord(value, "resolved execution request");
@@ -99,22 +86,20 @@ export function decodeResolvedExecutionRequest(value) {
99
86
  if (typeof command.template !== "string" || typeof command.content !== "string") {
100
87
  throw new TypeError("command template and content must be strings");
101
88
  }
102
- const engine = requireRecord(input.engine, "engine");
103
- if (typeof engine.name !== "string" || (engine.kind !== "agent" && engine.kind !== "sdk" && engine.kind !== "llm")) {
104
- throw new TypeError("engine.name must be a string and engine.kind must be agent, sdk, or llm");
89
+ const target = requireRecord(input.target, "target");
90
+ if (typeof target.name !== "string" || (target.kind !== "connection" && target.kind !== "harness")) {
91
+ throw new TypeError("target.name must be a string and target.kind must be connection or harness");
105
92
  }
106
- const notices = input.notices;
107
- if (!Array.isArray(notices))
108
- throw new TypeError("notices must be an array");
93
+ if (typeof input.modelWork !== "boolean")
94
+ throw new TypeError("modelWork must be a boolean");
109
95
  const request = {
110
96
  command: Object.freeze({
111
97
  ...pick(command, COMMAND_KEYS),
112
98
  source: command.source === null ? null : decodeExecutionSourceIdentity(command.source, "command.source"),
113
99
  }),
114
- engine: Object.freeze(pick(engine, ENGINE_KEYS)),
115
- authorization: Object.freeze(pick(requireRecord(input.authorization, "authorization"), AUTHORIZATION_KEYS)),
100
+ target: Object.freeze(pick(target, TARGET_KEYS)),
101
+ modelWork: input.modelWork,
116
102
  runtime: Object.freeze(pick(requireRecord(input.runtime, "runtime"), RUNTIME_KEYS)),
117
- notices: Object.freeze(notices.map((notice, index) => Object.freeze(pick(requireRecord(notice, `notices[${index}]`), NOTICE_KEYS)))),
118
103
  };
119
104
  if (Array.isArray(input.conversation)) {
120
105
  request.conversation = Object.freeze(input.conversation.map((message, index) => Object.freeze(pick(requireRecord(message, `conversation[${index}]`), ["role", "content"]))));
@@ -135,7 +120,7 @@ export function decodeResolvedExecutionRequest(value) {
135
120
  if (Object.hasOwn(input, "model") && input.model !== undefined) {
136
121
  request.model = input.model === null ? null : Object.freeze(pick(requireRecord(input.model, "model"), MODEL_KEYS));
137
122
  }
138
- for (const key of ["inference", "outputSchema", "tools", "extensions"]) {
123
+ for (const key of ["inference", "outputSchema"]) {
139
124
  if (Object.hasOwn(input, key) && input[key] !== undefined)
140
125
  request[key] = input[key];
141
126
  }
@@ -149,10 +134,9 @@ export function canonicalResolvedExecutionRequest(request) {
149
134
  ...pick(request.command, COMMAND_KEYS),
150
135
  source: request.command.source === null ? null : pick(request.command.source, IDENTITY_KEYS),
151
136
  },
152
- engine: pick(request.engine, ENGINE_KEYS),
153
- authorization: pick(request.authorization, AUTHORIZATION_KEYS),
137
+ target: pick(request.target, TARGET_KEYS),
138
+ modelWork: request.modelWork,
154
139
  runtime: pick(request.runtime, RUNTIME_KEYS),
155
- notices: request.notices.map((notice) => pick(notice, NOTICE_KEYS)),
156
140
  };
157
141
  if (request.conversation !== undefined) {
158
142
  wire.conversation = request.conversation.map((message) => ({ role: message.role, content: message.content }));
@@ -168,7 +152,7 @@ export function canonicalResolvedExecutionRequest(request) {
168
152
  if (Object.hasOwn(request, "model") && request.model !== undefined) {
169
153
  wire.model = request.model === null ? null : pick(request.model, MODEL_KEYS);
170
154
  }
171
- for (const key of ["inference", "outputSchema", "tools", "extensions"]) {
155
+ for (const key of ["inference", "outputSchema"]) {
172
156
  if (Object.hasOwn(request, key) && request[key] !== undefined)
173
157
  wire[key] = request[key];
174
158
  }
@@ -1,42 +1,34 @@
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 { cloneExecutionJson, cloneExecutionJsonObject } from "./json.js";
4
+ import { warnOnce } from "../core/warn.js";
5
+ import { cloneExecutionJsonObject } from "./json.js";
5
6
  export const EXECUTION_SOURCE_SCHEMA_VERSION = 1;
6
7
  /** Current internal adapter identifiers are lowercase kebab-case registry keys. */
7
8
  export const EXECUTION_ADAPTER_ID_PATTERN = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
8
- /**
9
- * The model-work tool policy: unattended model work (improve, the judges, index
10
- * passes, remember) may read, edit only inside the dispatch's own scratch
11
- * working directory, and run `akm search` and `akm show`; the stash stays
12
- * read-only to it. A transport grants what it can confine and refuses the policy
13
- * at build when it can confine nothing; an LLM has no tools. A request carries it
14
- * as `authorization.policy.id`, set only when its caller asks (`modelWork`): no
15
- * `tools` value names it, so an asset's own `tools:` cannot.
16
- */
17
- export const MODEL_WORK_POLICY_ID = "model-work";
9
+ /** What an asset that still says `engine:` is told, once. */
10
+ export function warnRetiredEngineKey() {
11
+ warnOnce("asset-engine-key-retired", "`engine` is retired; use `connection:` or `harness:`.");
12
+ }
13
+ /** Those settings as one layer's defaults. A setting that is absent says nothing; `null` is a real value. */
14
+ export function executionDefaultsOf(settings) {
15
+ if (!settings)
16
+ return {};
17
+ return {
18
+ ...(settings.connection !== undefined ? { connection: settings.connection } : {}),
19
+ ...(settings.harness !== undefined ? { harness: settings.harness } : {}),
20
+ ...(settings.engine !== undefined ? { engine: settings.engine } : {}),
21
+ ...(settings.model !== undefined ? { model: settings.model } : {}),
22
+ ...(settings.llm !== undefined ? { inference: cloneExecutionJsonObject(settings.llm, "inference") } : {}),
23
+ ...(settings.timeoutMs !== undefined ? { timeout: settings.timeoutMs } : {}),
24
+ };
25
+ }
18
26
  function requireRecord(value, path) {
19
27
  if (value === null || typeof value !== "object" || Array.isArray(value)) {
20
28
  throw new TypeError(`${path} must be an object`);
21
29
  }
22
30
  return value;
23
31
  }
24
- export function createAdapterExtensions(first, second, ...rest) {
25
- const entries = typeof first === "string"
26
- ? [[first, second]]
27
- : [first, ...(second === undefined ? [] : [second]), ...rest];
28
- const out = {};
29
- for (const [owner, values] of entries)
30
- out[owner] = cloneExecutionJsonObject(values, `extensions.${owner}`);
31
- return Object.freeze(out);
32
- }
33
- export function cloneAdapterExtensions(value, path) {
34
- const out = {};
35
- for (const [owner, fields] of Object.entries(requireRecord(value, path))) {
36
- out[owner] = cloneExecutionJsonObject(fields, `${path}.${owner}`);
37
- }
38
- return Object.freeze(out);
39
- }
40
32
  /** A selector or layer identifier that may cross the durable execution boundary. */
41
33
  export function requireStableExecutionSelector(value, path) {
42
34
  if (typeof value !== "string" || value.length === 0 || value.trim() !== value) {
@@ -75,7 +67,7 @@ export function cloneUnresolvedExecutionDefaults(input, path = "execution source
75
67
  const record = requireRecord(input, path);
76
68
  const present = (key) => Object.hasOwn(record, key) && record[key] !== undefined;
77
69
  const out = {};
78
- for (const key of ["agent", "engine", "model", "workspace"]) {
70
+ for (const key of ["agent", "connection", "harness", "engine", "model", "workspace"]) {
79
71
  if (!present(key))
80
72
  continue;
81
73
  const value = record[key];
@@ -90,7 +82,7 @@ export function cloneUnresolvedExecutionDefaults(input, path = "execution source
90
82
  }
91
83
  out.timeout = timeout;
92
84
  }
93
- for (const key of ["inference", "outputSchema", "runtime"]) {
85
+ for (const key of ["inference", "outputSchema"]) {
94
86
  if (!present(key))
95
87
  continue;
96
88
  out[key] = record[key] === null ? null : cloneExecutionJsonObject(record[key], `${path}.${key}`);
@@ -102,21 +94,8 @@ export function cloneUnresolvedExecutionDefaults(input, path = "execution source
102
94
  }
103
95
  out.environment = environment;
104
96
  }
105
- if (present("tools"))
106
- out.tools = cloneToolSelection(record.tools, `${path}.tools`);
107
97
  return Object.freeze(out);
108
98
  }
109
- export function cloneToolSelection(value, path = "tools") {
110
- if (value === null || typeof value === "string")
111
- return value;
112
- const cloned = cloneExecutionJson(value, path);
113
- if (Array.isArray(cloned)) {
114
- if (cloned.some((tool) => typeof tool !== "string"))
115
- throw new TypeError(`${path} array values must be strings`);
116
- return cloned;
117
- }
118
- return cloneExecutionJsonObject(cloned, path);
119
- }
120
99
  export function createAdapterRenderedExecutionSource(input) {
121
100
  const { kind, content } = input;
122
101
  if (kind !== "command" && kind !== "persona")
@@ -129,8 +108,5 @@ export function createAdapterRenderedExecutionSource(input) {
129
108
  content,
130
109
  defaults: cloneUnresolvedExecutionDefaults(input.defaults ?? {}),
131
110
  identity: createExecutionSourceIdentity(input.identity),
132
- ...(input.extensions
133
- ? { extensions: cloneAdapterExtensions(input.extensions, "execution source extensions") }
134
- : {}),
135
111
  });
136
112
  }
@@ -2,7 +2,7 @@
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  /**
5
- * The target-ref classifier (P1a Lane B, docs/plans/specs/p1a-with-rejection-classifier.md §4.1).
5
+ * The target-ref classifier.
6
6
  *
7
7
  * `classifyTargetRef` is the canonical classifier for a canonical asset ref
8
8
  * used as an execution target: `commands/<name>`, `scripts/<name>`,
@@ -20,7 +20,7 @@
20
20
  * first `/` is one of `commands`, `scripts`, `tasks`, `workflows`;
21
21
  * 5. the name segment after the first `/` is non-empty.
22
22
  *
23
- * Explicit non-goals (binding, spec §4.1): no GitHub locator grammar, no
23
+ * Explicit non-goals: no GitHub locator grammar, no
24
24
  * `akm/command` builtin special case, no resolution, no filesystem access, no
25
25
  * guessing.
26
26
  */
@@ -5,7 +5,7 @@
5
5
  * §11.5 bundle-rename startup guard.
6
6
  *
7
7
  * Renaming a workspace bundle id is a mass identity migration (every ref in the
8
- * bundle changes without any file moving) and MUST go through the future
8
+ * bundle changes without any file moving) and MUST go through the
9
9
  * explicit `akm bundle rename <old> <new>` command, which rekeys the index +
10
10
  * every ref-keyed state table atomically. If a user instead hand-edits the
11
11
  * `bundles` KEY in config.json, the durable index/state rows still carry the OLD
@@ -131,8 +131,9 @@ export function warnOnBundleRenameDrift(config = loadConfig()) {
131
131
  warn("WARNING: bundle identity drift detected. " +
132
132
  `Configured bundle(s) with no indexed content: ${renamedConfiguredIds.map((id) => `"${id}"`).join(", ")}; ` +
133
133
  `indexed content under unconfigured bundle id(s): ${renamedOldIds.map((id) => `"${id}"`).join(", ")}. ` +
134
- "This is the signature of a hand-renamed bundle id (spec §11.5). AKM will NOT silently re-mint fresh state " +
135
- "under the new id. There is no rekey command in 0.9.0: either restore the previous bundle id in config.json " +
136
- "to reattach the existing rows, or keep the new id and run `akm index --full` to re-mint under it, accepting " +
137
- "that learned state (utility, salience, outcomes, usage history) keyed to the old id is left behind.");
134
+ "This is the signature of a hand-renamed bundle id. AKM will NOT silently re-mint fresh state " +
135
+ "under the new id. To keep the learned state, restore the previous bundle id in config.json and rename it with " +
136
+ "`akm bundle rename <old> <new>`, which rekeys the config, the index and akm's state together; or keep the new " +
137
+ "id and run `akm index --full` to re-mint under it, accepting that learned state (utility, salience, outcomes, " +
138
+ "usage history) keyed to the old id is left behind.");
138
139
  }
@@ -225,7 +225,7 @@ export async function ensureIndex(stashDir, options = {}) {
225
225
  // Blocking callers (improve's planning preflight) are a sanctioned
226
226
  // materialization point and hydrate cache-backed sources as usual. The
227
227
  // background READ path (`show` auto-index) must never clone/pull/fetch at
228
- // query time (spec §14.3 / D11): it builds from already-materialized
228
+ // query time: it builds from already-materialized
229
229
  // content, and absent source caches are skipped with a warning.
230
230
  ...(blocking ? {} : { hydrateSources: false }),
231
231
  });
@@ -16,7 +16,7 @@
16
16
  * longer take any lease.
17
17
  *
18
18
  * What remains here guards actual data loss (a lost or conflicting git
19
- * commit), so per AGENTS.md `## Defensive Code` it stays — but with the same
19
+ * commit), so core principle 1's data-loss exemption keeps it — but with the same
20
20
  * fix applied: no age-based stale-reclaim. A holder is only ever reclaimed
21
21
  * once its PID is verifiably dead; a live-but-wedged holder makes an
22
22
  * acquisition attempt wait (bounded by `maxWaitMs`) or fail, never silently
@@ -12,6 +12,8 @@ import { getDbPath } from "../core/paths.js";
12
12
  import { SCRIPT_EXTENSIONS } from "../core/recognition-util.js";
13
13
  import { withStateDb } from "../core/state-db.js";
14
14
  import { isVerbose, warn, warnOnce, warnVerbose } from "../core/warn.js";
15
+ import { localEmbeddingRuntime } from "../llm/embedder.js";
16
+ import { effectiveEmbedding } from "../llm/embedders/connection.js";
15
17
  import { resolveSourcesForOrigin } from "../registry/origin-resolve.js";
16
18
  import { closeDatabase, openExistingDatabase, openIndexDatabase, openReadonlyExistingDatabase, } from "../storage/repositories/index-connection.js";
17
19
  import { deleteEntriesByBundle, deleteEntriesByDirAndBundle, deleteEntriesByDirExceptRefs, deleteEntriesByIds, deleteUsageEventsByEntryIds, findEntryIdByRef, getAllEntries, getEmbeddableEntryCount, getEntryCount, getIndexedBundleIdsByDir, getIndexedDirPathsByBundleId, relinkUsageEvents, upsertEntry, } from "../storage/repositories/index-entries-repository.js";
@@ -25,12 +27,13 @@ import { INDEX_DB_VACUUMED_EVENT, readFreelistInfo, vacuumIfReclaimable } from "
25
27
  import { assertIndexedWorkflowSourceIdentity, WorkflowSourceIdentityError } from "../workflows/source-files.js";
26
28
  import { reclassifyIndexDbContention } from "./index-db-contention.js";
27
29
  import { deriveEntryProvenance, deriveInstallations } from "./installations.js";
28
- import { indexedPathMatchesOwner, resolveAdapterConceptOwner, } from "./lookup/adapter-concept-owner.js";
30
+ import { indexedPathMatchesOwner, resolveConceptOwner } from "./lookup/adapter-concept-owner.js";
29
31
  import { generateEmbeddingsForDb } from "./materialize-embeddings.js";
30
32
  import { canUseIncrementalSkip, computeDirFingerprint, getCachedDirState, getDirIndexState, inferZeroRowReason, } from "./passes/dir-staleness.js";
31
33
  import { isWorkflowSkipWarning, withFileSize } from "./passes/metadata.js";
32
34
  import { drainDirDocuments } from "./scan/drain-dir.js";
33
35
  import { purgeOldUsageEvents, USAGE_EVENT_RETENTION_DAYS } from "./usage/usage-events.js";
36
+ import { SEMANTIC_SEARCH_META_KEY, } from "./walk/index-context.js";
34
37
  import { walkStashFlatWithStatus } from "./walk/walker.js";
35
38
  function throwIfAborted(signal) {
36
39
  if (signal?.aborted) {
@@ -104,7 +107,7 @@ function applyRemovedSources(db, sources, removedSources, isIncremental) {
104
107
  /**
105
108
  * The embedding phase (#954): generate and store vectors for every entry
106
109
  * missing one, then compute the `hasEmbeddings` fact and the semantic-search
107
- * verification off the result. `db` must have no ambient transaction open —
110
+ * verification off the result, and record it for `akm health`. `db` must have no ambient transaction open —
108
111
  * each per-batch commit is its own durable write.
109
112
  */
110
113
  export async function runEmbeddingPass(params) {
@@ -116,6 +119,15 @@ export async function runEmbeddingPass(params) {
116
119
  const semanticEntryCount = getEmbeddableEntryCount(db);
117
120
  onProgress({ phase: "finalize", message: "Verifying semantic search state." });
118
121
  const verification = verifyIndexState(db, config, semanticEntryCount, embeddingResult);
122
+ const unavailable = verification.semanticStatus === "blocked" ? embeddingResult.runtimeUnavailable : undefined;
123
+ const record = {
124
+ status: unavailable ? "unavailable" : verification.semanticStatus,
125
+ ...(unavailable ? { unavailable } : {}),
126
+ provider: verification.embeddingProvider,
127
+ ...(verification.embeddingRuntime ? { runtime: verification.embeddingRuntime } : {}),
128
+ ...(verification.ok ? {} : { reason: verification.message }),
129
+ };
130
+ setMeta(db, SEMANTIC_SEARCH_META_KEY, JSON.stringify(record));
119
131
  onProgress({ phase: "verify", message: verification.message });
120
132
  return { embeddingResult, verification };
121
133
  }
@@ -384,7 +396,6 @@ async function akmIndexReal(options) {
384
396
  // path. `secret-seam` is imported here, never from inside the cycle.
385
397
  const { storeSecretResolver } = await import("../sources/snapshot-fetchers/secret-seam.js");
386
398
  await ensureSourceCaches(config, {
387
- force: full,
388
399
  materialize: options.hydrateSources !== false,
389
400
  secrets: storeSecretResolver,
390
401
  // Same progress channel as every other phase (#954) — a
@@ -423,7 +434,7 @@ async function akmIndexReal(options) {
423
434
  mode,
424
435
  sourcesCount: sourceDirs.length,
425
436
  semanticSearchMode: config.semanticSearchMode,
426
- embeddingProvider: getEmbeddingProvider(config.embedding),
437
+ embeddingProvider: getEmbeddingProvider(effectiveEmbedding(config)),
427
438
  }),
428
439
  });
429
440
  const removedSources = findRemovedSources(db, sources);
@@ -669,9 +680,6 @@ function buildSourceScanPlans(db, allSourceEntries, isIncremental, reconcileMiss
669
680
  }
670
681
  const walked = walkStashFlatWithStatus(currentStashDir, {
671
682
  includeAllDirectories: component.adapter === "okf",
672
- ...(component.adapter === "akm" || component.adapter === "akm-workflow"
673
- ? { workflowSymlinkAdapter: component.adapter }
674
- : {}),
675
683
  });
676
684
  const dirGroups = groupFileContextsByDir(walked.files);
677
685
  const adapter = adapterForId(component.adapter);
@@ -961,7 +969,7 @@ function persistDirRecords(db, dirRecords, warnings, bundleByRoot) {
961
969
  }
962
970
  continue;
963
971
  }
964
- // Diff-persist (F4a M-core-2, spec §14.2): upsert the current file set
972
+ // Diff-persist: upsert the current file set
965
973
  // FIRST (ON CONFLICT preserving `entries.id` so embeddings / utility /
966
974
  // usage stay attached to unchanged rows), tracking every upserted
967
975
  // durable `item_ref`, then prune only the departed rows below. Replaces the old
@@ -1091,7 +1099,8 @@ function getEmbeddingProvider(embedding) {
1091
1099
  }
1092
1100
  function verifyIndexState(db, config, embeddableEntries, embeddingResult) {
1093
1101
  const embeddingCount = getEmbeddingCount(db);
1094
- const embeddingProvider = getEmbeddingProvider(config.embedding);
1102
+ const embeddingProvider = getEmbeddingProvider(effectiveEmbedding(config));
1103
+ const embeddingRuntime = embeddingProvider === "local" ? localEmbeddingRuntime() : undefined;
1095
1104
  const verification = (ok, message, semanticSearchEnabled, semanticStatus, guidance) => ({
1096
1105
  ok,
1097
1106
  message,
@@ -1100,6 +1109,7 @@ function verifyIndexState(db, config, embeddableEntries, embeddingResult) {
1100
1109
  semanticSearchMode: config.semanticSearchMode,
1101
1110
  semanticStatus,
1102
1111
  embeddingProvider,
1112
+ ...(embeddingRuntime !== undefined ? { embeddingRuntime } : {}),
1103
1113
  entryCount: embeddableEntries,
1104
1114
  embeddingCount,
1105
1115
  });
@@ -1132,10 +1142,8 @@ borrowed = false) {
1132
1142
  const sources = await resolveLookupSources();
1133
1143
  if (sources.length === 0)
1134
1144
  return { entry: null };
1135
- const bundleBySourcePath = new Map(sourceComponents(sources).map((component, index) => [path.resolve(sources[index].path), component.id]));
1136
1145
  const qualified = Boolean(ref.bundle);
1137
- const candidateSources = ref.bundle ? resolveSourcesForOrigin(ref.bundle, sources) : sources;
1138
- if (candidateSources.length === 0)
1146
+ if ((ref.bundle ? resolveSourcesForOrigin(ref.bundle, sources) : sources).length === 0)
1139
1147
  return { entry: null };
1140
1148
  let db;
1141
1149
  let indexError;
@@ -1151,42 +1159,38 @@ borrowed = false) {
1151
1159
  ...(indexError === undefined ? {} : { indexError }),
1152
1160
  });
1153
1161
  try {
1154
- for (const source of candidateSources) {
1155
- const adapterId = source.adapterId ?? detectAdapterId(source.path);
1156
- const owner = resolveAdapterConceptOwner(source.path, adapterId, ref.conceptId);
1157
- const lookupConceptId = owner?.conceptId ?? ref.conceptId;
1158
- const inputRef = makeBundleRef(qualified ? ref.bundle : undefined, lookupConceptId);
1159
- const sourceBundleId = bundleBySourcePath.get(path.resolve(source.path));
1160
- const id = db && sourceBundleId ? findEntryIdByRef(db, inputRef, sourceBundleId) : undefined;
1161
- if (id !== undefined && owner && db) {
1162
- const entry = readLookupEntry(db, id, ref.conceptId, source.path);
1163
- if (entry) {
1164
- if (owner.workflowSource) {
1165
- try {
1166
- assertIndexedWorkflowSourceIdentity(inputRef, entry.filePath, owner.workflowSource);
1167
- if (entry.adapterId !== adapterId) {
1168
- throw new WorkflowSourceIdentityError(inputRef, entry.filePath, owner.path);
1169
- }
1170
- }
1171
- catch (error) {
1172
- if (!(error instanceof WorkflowSourceIdentityError))
1173
- throw error;
1174
- warn(`${error.message} Falling back to the physical owner.`);
1175
- return resolved(null, owner);
1162
+ const match = resolveConceptOwner(ref, sources);
1163
+ if (!match)
1164
+ return resolved(null);
1165
+ const { owner, source, bundleId, adapterId } = match;
1166
+ const inputRef = makeBundleRef(qualified ? ref.bundle : undefined, owner.conceptId);
1167
+ const id = db ? findEntryIdByRef(db, inputRef, bundleId) : undefined;
1168
+ if (id !== undefined && db) {
1169
+ const entry = readLookupEntry(db, id, ref.conceptId, source.path);
1170
+ if (entry) {
1171
+ if (owner.workflowSource) {
1172
+ try {
1173
+ assertIndexedWorkflowSourceIdentity(inputRef, entry.filePath, owner.workflowSource);
1174
+ if (entry.adapterId !== adapterId) {
1175
+ throw new WorkflowSourceIdentityError(inputRef, entry.filePath, owner.path);
1176
1176
  }
1177
1177
  }
1178
- else if (entry.adapterId !== adapterId || !indexedPathMatchesOwner(entry.filePath, owner)) {
1178
+ catch (error) {
1179
+ if (!(error instanceof WorkflowSourceIdentityError))
1180
+ throw error;
1181
+ warn(`${error.message} Falling back to the physical owner.`);
1179
1182
  return resolved(null, owner);
1180
1183
  }
1181
- return resolved(entry, owner);
1182
1184
  }
1185
+ else if (entry.adapterId !== adapterId || !indexedPathMatchesOwner(entry.filePath, owner)) {
1186
+ return resolved(null, owner);
1187
+ }
1188
+ return resolved(entry, owner);
1183
1189
  }
1184
- // A physical owner with a missing/incomplete index row still owns this
1185
- // unqualified concept. Stop here so a later source cannot retarget it.
1186
- if (owner)
1187
- return resolved(null, owner);
1188
1190
  }
1189
- return resolved(null);
1191
+ // A physical owner with a missing/incomplete index row still owns this
1192
+ // concept: no later source can retarget it.
1193
+ return resolved(null, owner);
1190
1194
  }
1191
1195
  finally {
1192
1196
  if (db && !borrowed)
@@ -1290,7 +1294,7 @@ function readLookupEntry(db, id, fallbackConceptId, sourceRoot) {
1290
1294
  };
1291
1295
  }
1292
1296
  /**
1293
- * Look up a single asset by ref. Spec §6.2 — `akm show` queries this and
1297
+ * Look up a single asset by ref. `akm show` queries this and
1294
1298
  * reads the file from disk. The index is the source of truth for which
1295
1299
  * file corresponds to which ref; the indexer walks `provider.path()` for
1296
1300
  * every configured source, so this query covers all source kinds.