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
@@ -1,199 +0,0 @@
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
- * OpenCode 1 wire adapter, on `@opencode-ai/sdk` 1.2.20.
6
- *
7
- * Everything here is the V1 protocol and nothing else: the readiness line
8
- * (`opencode server listening on <url>`), the SDK client, `session.create` /
9
- * `session.prompt` / `session.abort` with the per-call `query.directory`, the
10
- * `/event` stream, and `postSessionIdPermissionsPermissionId`. `agent`,
11
- * `system` and `tools` ride on the prompt body. The shared server lifecycle
12
- * lives in `sdk-runner.ts`.
13
- */
14
- import { isRecord } from "../../../core/common.js";
15
- import { decodeRetryStatus, } from "./wire.js";
16
- const queryOf = (spec) => spec.directory ? { query: { directory: spec.directory } } : {};
17
- /**
18
- * Best-effort token usage from a prompt response. Only numeric fields the
19
- * server actually reported are copied; undefined when nothing usable is
20
- * present (older servers, test fakes).
21
- */
22
- function extractUsage(info) {
23
- const tokens = info?.tokens;
24
- if (!tokens)
25
- return undefined;
26
- const usage = {};
27
- if (typeof tokens.input === "number" && Number.isFinite(tokens.input))
28
- usage.inputTokens = tokens.input;
29
- if (typeof tokens.output === "number" && Number.isFinite(tokens.output))
30
- usage.outputTokens = tokens.output;
31
- if (typeof tokens.reasoning === "number" && Number.isFinite(tokens.reasoning)) {
32
- usage.reasoningTokens = tokens.reasoning;
33
- }
34
- return Object.keys(usage).length > 0 ? usage : undefined;
35
- }
36
- /**
37
- * Map an SDK `{ error }` result or a reply's `info.error` onto a failure
38
- * (#1015). Both are opencode NamedErrors, `{ name, data: { message } }`. An
39
- * aborted message is `aborted`, a reply cut off at the output limit is
40
- * `parse_error`, and every other error (auth, API, unknown, an HTTP error
41
- * body) is `non_zero_exit`.
42
- */
43
- function v1ErrorFailure(error) {
44
- if (!isRecord(error) || typeof error.name !== "string") {
45
- return { reason: "non_zero_exit", message: typeof error === "string" ? error : JSON.stringify(error) };
46
- }
47
- const detail = isRecord(error.data) ? error.data.message : undefined;
48
- const message = typeof detail === "string" ? `${error.name}: ${detail}` : error.name;
49
- if (error.name === "MessageAbortedError")
50
- return { reason: "aborted", message };
51
- if (error.name === "MessageOutputLengthError")
52
- return { reason: "parse_error", message };
53
- return { reason: "non_zero_exit", message };
54
- }
55
- /**
56
- * Subscribe to the server's event stream. The SDK's own `event.subscribe`
57
- * cannot be closed safely: aborting it leaves an unhandled `AbortError`
58
- * rejection (from its un-awaited `reader.cancel()`), which akm's global
59
- * handler turns into a process exit. This reader ends quietly on abort.
60
- */
61
- async function subscribeEvents(baseUrl, args) {
62
- const eventUrl = new URL("/event", baseUrl);
63
- if (args.query?.directory)
64
- eventUrl.searchParams.set("directory", args.query.directory);
65
- const response = await fetch(eventUrl, { signal: args.signal, headers: { accept: "text/event-stream" } });
66
- if (!response.ok || !response.body)
67
- throw new Error(`OpenCode event stream failed: HTTP ${response.status}`);
68
- const reader = response.body.getReader();
69
- async function* stream() {
70
- const decoder = new TextDecoder();
71
- let buffer = "";
72
- try {
73
- while (true) {
74
- const { done, value } = await reader.read();
75
- if (done)
76
- return;
77
- buffer += decoder.decode(value, { stream: true });
78
- const frames = buffer.split("\n\n");
79
- buffer = frames.pop() ?? "";
80
- for (const frame of frames) {
81
- const data = frame
82
- .split("\n")
83
- .filter((line) => line.startsWith("data:"))
84
- .map((line) => line.replace(/^data:\s*/, ""))
85
- .join("\n");
86
- if (!data)
87
- continue;
88
- try {
89
- yield JSON.parse(data);
90
- }
91
- catch {
92
- /* not JSON: not an event we act on */
93
- }
94
- }
95
- }
96
- }
97
- catch (err) {
98
- if (!args.signal.aborted)
99
- throw err;
100
- }
101
- }
102
- return { stream: stream() };
103
- }
104
- /** The SDK `createOpencodeClient`, with the quiet event reader swapped in. */
105
- async function connectV1(baseUrl) {
106
- const { createOpencodeClient } = (await import("@opencode-ai/sdk").catch(() => {
107
- throw new Error("OpenCode SDK not available. Install @opencode-ai/sdk or configure a CLI agent instead.");
108
- }));
109
- const client = createOpencodeClient({ baseUrl });
110
- client.event = { subscribe: (args) => subscribeEvents(baseUrl, args) };
111
- return client;
112
- }
113
- export const V1_ADAPTER = {
114
- major: 1,
115
- serveArgv: (bin, port) => [bin, "serve", "--hostname=127.0.0.1", `--port=${port}`],
116
- // OpenCode 1 serves unauthenticated on loopback.
117
- authorize: () => ({ env: {} }),
118
- connect: (baseUrl) => connectV1(baseUrl),
119
- async createSession(client, spec) {
120
- const created = await client.session.create({ body: { title: "akm" }, ...queryOf(spec) });
121
- return created.data?.id;
122
- },
123
- async prompt(client, sessionId, text, spec) {
124
- // Forward the exact native agent selector, system prompt and tools from the
125
- // abstract dispatch request (#564).
126
- const body = { parts: [{ type: "text", text }] };
127
- if (spec.agent)
128
- body.agent = spec.agent;
129
- if (spec.system)
130
- body.system = spec.system;
131
- if (spec.tools)
132
- body.tools = spec.tools;
133
- const prompted = await client.session.prompt({ path: { id: sessionId }, body, ...queryOf(spec) });
134
- const parts = prompted.data?.parts ?? [];
135
- // The last text part is the answer; earlier ones narrate the steps before it.
136
- const textOut = parts.filter((p) => p.type === "text").at(-1)?.text ?? "";
137
- const usage = extractUsage(prompted.data?.info);
138
- const sdkError = prompted.error ?? prompted.data?.info?.error;
139
- return {
140
- text: textOut,
141
- ...(usage ? { usage } : {}),
142
- ...(sdkError ? { failure: v1ErrorFailure(sdkError) } : {}),
143
- };
144
- },
145
- abort(client, sessionId, spec) {
146
- void client.session.abort?.({ path: { id: sessionId }, ...queryOf(spec) }).catch(() => { });
147
- },
148
- canWatch(client) {
149
- const c = client;
150
- return Boolean(c.event?.subscribe && c.postSessionIdPermissionsPermissionId);
151
- },
152
- async subscribe(client, spec, signal) {
153
- const events = client.event;
154
- if (!events)
155
- throw new Error("the client has no event surface");
156
- const { stream } = await events.subscribe.call(events, { ...queryOf(spec), signal });
157
- return stream;
158
- },
159
- decodeEvent(raw) {
160
- if (!isRecord(raw) || !isRecord(raw.properties))
161
- return undefined;
162
- const props = raw.properties;
163
- if (raw.type === "session.created" && isRecord(props.info)) {
164
- const { id, parentID } = props.info;
165
- if (typeof id !== "string")
166
- return undefined;
167
- return { kind: "session", id, ...(typeof parentID === "string" ? { parentId: parentID } : {}) };
168
- }
169
- // `action` is not in the SDK's retry type yet, but current servers send it for provider/account limits.
170
- if (raw.type === "session.status")
171
- return decodeRetryStatus(props.sessionID, props.status);
172
- // `permission.asked` (OpenCode >= 1.3) / `permission.updated` (older).
173
- if (raw.type !== "permission.asked" && raw.type !== "permission.updated")
174
- return undefined;
175
- const { id, sessionID } = props;
176
- if (typeof id !== "string" || typeof sessionID !== "string")
177
- return undefined;
178
- const patterns = Array.isArray(props.patterns) ? props.patterns : props.pattern ? [props.pattern] : [];
179
- return {
180
- kind: "permission",
181
- requestId: id,
182
- sessionId: sessionID,
183
- description: `${String(props.permission ?? props.type ?? "unknown")} (${patterns.join(", ")})`,
184
- };
185
- },
186
- async rejectPermission(client, event, spec) {
187
- const c = client;
188
- const reply = c.postSessionIdPermissionsPermissionId;
189
- if (!reply)
190
- throw new Error("the client cannot answer permission requests");
191
- const r = await reply.call(c, {
192
- path: { id: event.sessionId, permissionID: event.requestId },
193
- body: { response: "reject" },
194
- ...queryOf(spec),
195
- });
196
- if (r.error)
197
- throw new Error(JSON.stringify(r.error));
198
- },
199
- };
@@ -1,254 +0,0 @@
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
- * OpenCode 2 wire adapter, on
6
- * `@opencode/client` 2.0.26 (the promise client, generated types).
7
- *
8
- * akm owns a private `opencode serve` child (never the v2 background
9
- * `service`). What differs from OpenCode 1, verified against the 2.0.26
10
- * binary:
11
- *
12
- * - Readiness is `server listening on <url>` (no `opencode` prefix).
13
- * - The server is basic-auth protected. akm chooses the password and hands it
14
- * to the child as `OPENCODE_SERVER_PASSWORD` (and `OPENCODE_PASSWORD`,
15
- * which wins when set), so nothing is scraped from stdout; the username is
16
- * the server's default, `opencode`.
17
- * - The working directory is the session's `location.directory`, set once at
18
- * `session.create`. Later calls address the session by id.
19
- * - The agent, the tool permissions (`permissions`: action/resource/effect
20
- * rules) and the title are `session.create` fields. The prompt carries only
21
- * text, so the system text is a session instruction entry.
22
- * - `session.prompt` only enqueues. `session.wait` blocks until the session is
23
- * idle, and `session.context` then holds the turn: our user message, the
24
- * assistant messages and a closing `idle` message with the outcome.
25
- * - Cancellation is `session.interrupt`; permission requests are answered with
26
- * `permission.reply`; the event stream is global, so events are matched to
27
- * the dispatch's sessions by id.
28
- *
29
- * Config (`OPENCODE_CONFIG_CONTENT`, built by the runner) keeps the V1 shape,
30
- * which the 2.0.26 server translates (`model`, `provider`, `agent`, `permission`).
31
- */
32
- import { randomBytes } from "node:crypto";
33
- import { OpenCode } from "@opencode/client";
34
- import { isRecord, toErrorMessage } from "../../../core/common.js";
35
- import { sleep } from "../../../runtime.js";
36
- import { parseOpencodeMajor } from "../opencode/version.js";
37
- import { decodeRetryStatus, OTHER_MAJOR_REMEDY, } from "./wire.js";
38
- /** Key of the session instruction entry carrying the dispatch's system text (`^[a-z0-9][a-z0-9._-]*$`). */
39
- const SYSTEM_INSTRUCTION_KEY = "akm.system";
40
- /** The server's default basic-auth username. */
41
- const SERVER_USERNAME = "opencode";
42
- const POLL_INTERVAL_MS = 100;
43
- /**
44
- * The turn that began with the user message `userId`, once its closing `idle`
45
- * message exists; undefined while the turn is still running.
46
- */
47
- export function v2Turn(messages, userId) {
48
- const start = messages.findIndex((m) => m.id === userId);
49
- if (start < 0)
50
- return undefined;
51
- const assistants = [];
52
- for (const message of messages.slice(start + 1)) {
53
- if (message.type === "assistant")
54
- assistants.push(message);
55
- else if (message.type === "idle")
56
- return { outcome: message.outcome, assistants };
57
- }
58
- return undefined;
59
- }
60
- /**
61
- * The turn that began with the user message `userId`, when OpenCode 2 ended it
62
- * by interrupting a step instead of writing the closing `idle` message. Only
63
- * meaningful once `session.wait` has returned (the session is not running).
64
- *
65
- * Recorded from 2.0.26: when akm rejects a permission request the step fails
66
- * with `{ type: "aborted", message: "Step interrupted" }` (`finish: "error"`),
67
- * the tool call is `error` ("The user declined this tool call"),
68
- * `session.execution.interrupted` fires and the session goes idle, but no
69
- * `idle` message is written and `session.idle` is not emitted.
70
- */
71
- export function v2InterruptedTurn(messages, userId) {
72
- const start = messages.findIndex((m) => m.id === userId);
73
- if (start < 0)
74
- return undefined;
75
- const assistants = messages.slice(start + 1).filter((m) => m.type === "assistant");
76
- const last = assistants.at(-1);
77
- return last?.finish === "error" && last.error?.type === "aborted"
78
- ? { outcome: "interrupted", assistants }
79
- : undefined;
80
- }
81
- /** Decode a finished turn into the answer, the usage of every step and the failure, if any. */
82
- function v2PromptResult(turn) {
83
- const text = turn.assistants
84
- .flatMap((a) => a.content)
85
- .filter((c) => c.type === "text")
86
- .at(-1)?.text ?? "";
87
- const usage = {};
88
- const add = (key, value) => {
89
- if (typeof value === "number" && Number.isFinite(value))
90
- usage[key] = (usage[key] ?? 0) + value;
91
- };
92
- for (const a of turn.assistants) {
93
- add("inputTokens", a.tokens?.input);
94
- add("outputTokens", a.tokens?.output);
95
- add("reasoningTokens", a.tokens?.reasoning);
96
- }
97
- const failure = v2Failure(turn);
98
- return {
99
- text,
100
- ...(Object.keys(usage).length > 0 ? { usage } : {}),
101
- ...(failure ? { failure } : {}),
102
- };
103
- }
104
- function v2Failure(turn) {
105
- if (turn.outcome === "interrupted") {
106
- // Say why when the last step says so, e.g. "Step interrupted: The user declined this tool call".
107
- const last = turn.assistants.at(-1);
108
- const declined = last?.content.flatMap((c) => c.type === "tool" && c.state.status === "error" ? [c.state.error.message] : []);
109
- const detail = [last?.error?.message, ...(declined ?? [])].filter(Boolean).join(": ");
110
- return { reason: "aborted", message: `OpenCode session was interrupted${detail ? ` (${detail})` : ""}` };
111
- }
112
- const last = turn.assistants.at(-1);
113
- if (turn.outcome === "failed") {
114
- const error = [...turn.assistants].reverse().find((a) => a.error)?.error;
115
- return {
116
- reason: "non_zero_exit",
117
- message: error ? `${error.type}: ${error.message}` : "OpenCode session failed",
118
- };
119
- }
120
- // A reply cut off at the output limit has no error of its own.
121
- if (last?.finish === "length") {
122
- return { reason: "parse_error", message: "OpenCode reply was cut off at the output limit" };
123
- }
124
- return undefined;
125
- }
126
- /** Tool enable/disable map -> session permission rules. */
127
- function toolPermissions(tools) {
128
- return Object.entries(tools ?? {}).map(([action, enabled]) => ({
129
- action,
130
- resource: "*",
131
- effect: enabled ? "allow" : "deny",
132
- }));
133
- }
134
- export const V2_ADAPTER = {
135
- major: 2,
136
- serveArgv: (bin, port) => [bin, "serve", "--hostname", "127.0.0.1", "--port", String(port)],
137
- authorize() {
138
- const password = randomBytes(24).toString("base64url");
139
- return { env: { OPENCODE_SERVER_PASSWORD: password, OPENCODE_PASSWORD: password }, credentials: password };
140
- },
141
- async connect(baseUrl, credentials) {
142
- const client = OpenCode.make({
143
- baseUrl,
144
- headers: { authorization: `Basic ${Buffer.from(`${SERVER_USERNAME}:${credentials ?? ""}`).toString("base64")}` },
145
- });
146
- let version;
147
- try {
148
- version = (await client.server.info()).version;
149
- }
150
- catch (err) {
151
- throw new Error(`Could not read the OpenCode 2 server info at ${baseUrl}: ${toErrorMessage(err)}. ${OTHER_MAJOR_REMEDY}`);
152
- }
153
- // Only OpenCode 1 is refused: a newer major than akm knows runs on these adapters (`../opencode/version.ts`).
154
- if (parseOpencodeMajor(version) === 1) {
155
- throw new Error(`The server is OpenCode ${version}, not OpenCode 2. ${OTHER_MAJOR_REMEDY}`);
156
- }
157
- return client;
158
- },
159
- async createSession(client, spec) {
160
- const c = client;
161
- const permissions = toolPermissions(spec.tools);
162
- const session = await c.session.create({
163
- title: "akm",
164
- ...(spec.agent ? { agent: spec.agent } : {}),
165
- ...(spec.directory ? { location: { directory: spec.directory } } : {}),
166
- ...(permissions.length > 0 ? { permissions } : {}),
167
- });
168
- if (spec.system) {
169
- await c.session.instructions.entry.put({
170
- sessionID: session.id,
171
- key: SYSTEM_INSTRUCTION_KEY,
172
- value: spec.system,
173
- });
174
- }
175
- return session.id;
176
- },
177
- async prompt(client, sessionId, text, _spec, signal) {
178
- const c = client;
179
- const user = await c.session.prompt({ sessionID: sessionId, text }, { signal });
180
- for (;;) {
181
- await c.session.wait({ sessionID: sessionId }, { signal });
182
- const messages = await c.session.context({ sessionID: sessionId }, { signal });
183
- const turn = v2Turn(messages, user.id) ?? v2InterruptedTurn(messages, user.id);
184
- if (turn)
185
- return v2PromptResult(turn);
186
- // `wait` can return before the queued prompt starts; look again.
187
- await sleep(POLL_INTERVAL_MS);
188
- if (signal.aborted)
189
- throw new Error("OpenCode prompt cancelled");
190
- }
191
- },
192
- abort(client, sessionId) {
193
- void client.session.interrupt({ sessionID: sessionId }).catch(() => { });
194
- },
195
- async subscribe(client, _spec, signal) {
196
- const source = client.event.subscribe({ signal })[Symbol.asyncIterator]();
197
- // The stream's first event is `server.connected`: reading it proves the subscription is open.
198
- const first = await source.next();
199
- async function* stream() {
200
- try {
201
- if (!first.done)
202
- yield first.value;
203
- while (true) {
204
- const next = await source.next();
205
- if (next.done)
206
- return;
207
- yield next.value;
208
- }
209
- }
210
- catch (err) {
211
- if (!signal.aborted)
212
- throw err;
213
- }
214
- }
215
- return stream();
216
- },
217
- decodeEvent(raw) {
218
- if (!isRecord(raw) || typeof raw.type !== "string" || !isRecord(raw.data))
219
- return undefined;
220
- // Shape-checked below, field by field; the generated `V2Event` union documents what each carries.
221
- const data = raw.data;
222
- if (raw.type === "session.created") {
223
- if (typeof data.sessionID !== "string")
224
- return undefined;
225
- return {
226
- kind: "session",
227
- id: data.sessionID,
228
- ...(typeof data.parentID === "string" ? { parentId: data.parentID } : {}),
229
- };
230
- }
231
- if (raw.type === "session.status")
232
- return decodeRetryStatus(data.sessionID, data.status);
233
- if (raw.type === "permission.asked") {
234
- const { id, sessionID, action, resources } = data;
235
- if (typeof id !== "string" || typeof sessionID !== "string")
236
- return undefined;
237
- const patterns = Array.isArray(resources) ? resources : [];
238
- return {
239
- kind: "permission",
240
- requestId: id,
241
- sessionId: sessionID,
242
- description: `${String(action ?? "unknown")} (${patterns.join(", ")})`,
243
- };
244
- }
245
- return undefined;
246
- },
247
- async rejectPermission(client, event) {
248
- await client.permission.reply({
249
- sessionID: event.sessionId,
250
- requestID: event.requestId,
251
- decision: "reject",
252
- });
253
- },
254
- };
@@ -1,66 +0,0 @@
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 seam between the OpenCode SDK runner and one OpenCode major's wire
6
- * protocol (#1049).
7
- *
8
- * `sdk-runner.ts` owns everything the two majors share: the managed
9
- * `opencode serve` child (spawn, port, registry, cleanup), the child
10
- * environment, deadlines, abort handling and result shaping. A
11
- * {@link OpencodeWireAdapter} owns what differs: how to ask the binary to
12
- * serve, how to read its readiness line, how to authenticate, and how to
13
- * create a session, prompt it, abort it, watch its events and answer its
14
- * permission requests. `v1-adapter.ts` speaks OpenCode 1 through
15
- * `@opencode-ai/sdk`; `v2-adapter.ts` speaks OpenCode 2 through
16
- * `@opencode/client`.
17
- *
18
- * Selection is by detection (`../opencode/version.ts` runs `<bin> --version`
19
- * once per binary). An adapter that meets a server of the other major fails and
20
- * names the remedy ({@link otherMajorRemedy}); it never falls back to the other
21
- * protocol.
22
- */
23
- import { isRecord } from "../../../core/common.js";
24
- /** The npm client package each major's adapter imports. Setup and health check the one the engine selects. */
25
- export const OPENCODE_CLIENT_PACKAGE = {
26
- 1: "@opencode-ai/sdk",
27
- 2: "@opencode/client",
28
- };
29
- /** The sentence every wrong-major failure ends with. */
30
- export const OTHER_MAJOR_REMEDY = `Upgrade to OpenCode 2, or set this engine's "bin" to the OpenCode binary you want to run.`;
31
- /** What each major's `serve` prints once it listens; the other major's line names a wrong binary. */
32
- const READINESS_PREFIX = {
33
- 1: "opencode server listening",
34
- 2: "server listening on",
35
- };
36
- /** Judge one output line of a server started for `own`: its readiness line, the other major's, or neither. */
37
- export function parseReadiness(line, own) {
38
- const other = own === 1 ? 2 : 1;
39
- if (line.startsWith(READINESS_PREFIX[own])) {
40
- const match = line.match(/on\s+(https?:\/\/\S+)/);
41
- return match?.[1] ? { url: match[1] } : { error: `Failed to parse the OpenCode server url from: ${line}` };
42
- }
43
- if (line.startsWith(READINESS_PREFIX[other])) {
44
- return { error: `The binary is OpenCode ${other} (${line.trim()}). ${OTHER_MAJOR_REMEDY}` };
45
- }
46
- return undefined;
47
- }
48
- /**
49
- * A `session.status` payload as the runner's retry event, or undefined for any
50
- * other status. Both majors carry the same fields; `action` names the provider
51
- * and, for an account usage limit, `reason: "account_rate_limit"` (#1108).
52
- */
53
- export function decodeRetryStatus(sessionID, status) {
54
- if (typeof sessionID !== "string" || !isRecord(status) || status.type !== "retry")
55
- return undefined;
56
- const action = isRecord(status.action) ? status.action : undefined;
57
- return {
58
- kind: "retry",
59
- sessionId: sessionID,
60
- ...(typeof status.attempt === "number" ? { attempt: status.attempt } : {}),
61
- message: typeof status.message === "string" ? status.message : "OpenCode is retrying",
62
- ...(typeof status.next === "number" ? { next: status.next } : {}),
63
- ...(typeof action?.provider === "string" ? { provider: action.provider } : {}),
64
- accountLimit: action?.reason === "account_rate_limit",
65
- };
66
- }
@@ -1,120 +0,0 @@
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
- * OpenHands CLI agent command builder (P2, plan §"The adapter contract"
6
- * step 2 / §"Capability matrix").
7
- *
8
- * Translates a platform-agnostic {@link AgentDispatchRequest} into the exact
9
- * headless argv the `openhands` CLI expects. Per the capability matrix the
10
- * headless invocation is:
11
- *
12
- * openhands --headless -t "<p>" --json
13
- *
14
- * with `--json` producing the documented JSONL event stream (structured tier
15
- * "via prompt+validate"), workspace-state resume (no session-id flag), and
16
- * native MCP support.
17
- *
18
- * Platform-specific mapping decisions (all localized here, per the adapter
19
- * contract):
20
- *
21
- * - **prompt** — `--task` is the long form of the matrix's `-t` (used for
22
- * self-documenting argv, mirroring the aider builder's `--message`). Like
23
- * aider — and unlike claude/codex/pi — there is NO positional prompt and NO
24
- * `--` end-of-options separator to hide behind: the task is a *flag value*.
25
- * The glued `--task=<payload>` form is therefore used so a payload that
26
- * begins with `-`/`--` binds to the flag lexically and can never be parsed
27
- * as a separate option by the CLI's argument parser.
28
- * - **--headless / --json** — always emitted: `--headless` is what makes a
29
- * captured, unattended run possible, and `--json` switches stdout to the
30
- * JSONL event stream that `./result-extractor.ts` normalizes (the same
31
- * "dispatch is the captured path" reasoning as the Claude builder's
32
- * unconditional `--print`; both flags are the matrix's documented headless
33
- * shape).
34
- * - **systemPrompt** — OpenHands headless mode has no documented
35
- * system-prompt flag (agent behaviour is shaped by its own agent configs
36
- * and microagents). Folded into the task payload — system text first, blank
37
- * line, then the task — mirroring the aider/codex treatment.
38
- * - **model** — OpenHands does not take the model on the headless command
39
- * line; its documented configuration channel is the `LLM_MODEL` environment
40
- * variable (config.toml `[llm] model` equivalent). The alias is resolved via
41
- * `resolveModel` with this platform id and returned on `BuiltCommand.env`
42
- * (the seam exists precisely for platform-specific extras), NOT as an
43
- * invented `--model` flag that would produce a silently broken command.
44
- * - **schema** — the matrix places OpenHands in the "via prompt+validate"
45
- * tier (plan §"Structured-output normalization", tier "native-json"): no
46
- * Codex-style `--output-schema` flag exists, so NO temp schema file is
47
- * written; the JSON Schema reaches it as the instruction the shared request
48
- * lowering appends to the prompt. Downstream, the extractor pulls the
49
- * final message out of the JSONL stream and the engine's shared
50
- * retry-until-valid loop performs the actual validation.
51
- * - **tools** — deliberately unconsumed. OpenHands has no per-tool allowlist
52
- * flag; tool access is governed by its own runtime/sandbox configuration
53
- * and (natively supported) MCP config. A restrictive policy is therefore
54
- * dropped rather than approximated — never silently widened.
55
- * - **resume/session** — NOT expressible: per the matrix OpenHands resumes
56
- * from *workspace state*, not a session-id flag, so there is no flag-shaped
57
- * resume to describe. The extractor still captures a
58
- * conversation/session id opportunistically when the stream reveals one;
59
- * akm's `workflow_run_units` remains the durable source of truth either way
60
- * (plan §"Session, MCP, and identity across harnesses").
61
- * - **inference** — not translated: the shared lowering reports each field of
62
- * the request's inference as untranslated.
63
- *
64
- * Registered: `openhandsBuilder` is `OpenhandsHarness.agentBuilder`
65
- * (`./index.ts`), one of the ten harnesses `HARNESS_REGISTRY` constructs
66
- * (`harnesses/index.ts`); `agent/builders.ts` derives `BUILTIN_BUILDERS` from
67
- * that registry, so this builder is reachable under the `"openhands"`
68
- * platform name without any further wiring.
69
- */
70
- import { resolveDispatchModel } from "../../agent/builder-shared.js";
71
- import { createAgentRequestLowerer } from "../../agent/request-lowering.js";
72
- /** Canonical harness/platform id used for model-alias resolution. */
73
- export const OPENHANDS_PLATFORM = "openhands";
74
- /**
75
- * Env var OpenHands reads its LLM model from — the platform's documented
76
- * model-selection channel for headless runs (there is no headless model
77
- * flag). Exported (re-exported from `./index.ts`) so this harness's tests
78
- * share the one constant.
79
- */
80
- export const OPENHANDS_MODEL_ENV = "LLM_MODEL";
81
- /** Assemble the `--task` payload: optional system text, then the task prompt. */
82
- function buildTaskPayload(req) {
83
- const sections = [];
84
- if (req.systemPrompt)
85
- sections.push(req.systemPrompt);
86
- sections.push(req.prompt);
87
- return sections.join("\n\n");
88
- }
89
- /**
90
- * OpenHands builder.
91
- * Command shape:
92
- * openhands --headless --json --task=<[system\n\n]prompt>
93
- * with the resolved model (if any) carried on env as LLM_MODEL.
94
- */
95
- export const openhandsBuilder = {
96
- platform: OPENHANDS_PLATFORM,
97
- personaChannel: "prompt",
98
- lower: createAgentRequestLowerer({
99
- adapter: OPENHANDS_PLATFORM,
100
- personaChannel: "prompt",
101
- tools: "none",
102
- }),
103
- build(profile, req) {
104
- const args = [...profile.args];
105
- // Headless essentials (matrix shape): non-interactive run, JSONL stdout
106
- // for the extractor.
107
- args.push("--headless");
108
- args.push("--json");
109
- // Glued form: the payload is a flag VALUE (no positional prompt exists),
110
- // so `=` binding keeps a dash-leading payload from parsing as an option.
111
- args.push(`--task=${buildTaskPayload(req)}`);
112
- let env;
113
- if (req.model) {
114
- const resolved = resolveDispatchModel(req, profile, OPENHANDS_PLATFORM);
115
- // Model travels via env, not argv — OpenHands' documented channel.
116
- env = { [OPENHANDS_MODEL_ENV]: resolved };
117
- }
118
- return { argv: [profile.bin, ...args], ...(env ? { env } : {}) };
119
- },
120
- };