akm-cli 0.10.261013-beta → 0.10.261015-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 (479) hide show
  1. package/CHANGELOG.md +539 -3
  2. package/README.md +14 -0
  3. package/SECURITY.md +12 -11
  4. package/STABILITY.md +45 -49
  5. package/dist/assets/hints/cli-hints-full.md +15 -12
  6. package/dist/assets/opencode/akm-plugin.js +177 -0
  7. package/dist/assets/stash-skeleton/README.md +1 -1
  8. package/dist/assets/tasks/core/improve.yml +1 -1
  9. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +1 -1
  10. package/dist/assets/ui/config.js +27 -10
  11. package/dist/assets/workflows/workflow-template.md +2 -2
  12. package/dist/cli/clack.js +3 -1
  13. package/dist/cli/selection.js +33 -0
  14. package/dist/cli/shared.js +14 -1
  15. package/dist/cli/unknown-flags.js +6 -37
  16. package/dist/cli.js +69 -48
  17. package/dist/commands/agent/agent-dispatch.js +17 -25
  18. package/dist/commands/agent/contribute-cli.js +9 -8
  19. package/dist/commands/command/command-cli.js +4 -8
  20. package/dist/commands/command/command-execution.js +25 -39
  21. package/dist/commands/completions.js +1 -1
  22. package/dist/commands/config-cli.js +14 -5
  23. package/dist/commands/env/child-env.js +12 -14
  24. package/dist/commands/env/env-cli.js +2 -2
  25. package/dist/commands/env/secret-cli.js +2 -2
  26. package/dist/commands/health/checks.js +10 -849
  27. package/dist/commands/health/connections-and-harnesses-check.js +109 -0
  28. package/dist/commands/health/egress.js +3 -3
  29. package/dist/commands/health/html-report.js +9 -10
  30. package/dist/commands/health/plugin-staleness.js +18 -11
  31. package/dist/commands/health/report-view-model.js +16 -12
  32. package/dist/commands/health/semantic-search-check.js +85 -0
  33. package/dist/commands/health/type-directory-check.js +0 -3
  34. package/dist/commands/health.js +30 -42
  35. package/dist/commands/improve/consolidate/pair-pass.js +10 -25
  36. package/dist/commands/improve/consolidate.js +10 -15
  37. package/dist/commands/improve/distill.js +5 -15
  38. package/dist/commands/improve/eligibility.js +1 -1
  39. package/dist/commands/improve/execution.js +37 -40
  40. package/dist/commands/improve/extract-cli.js +6 -11
  41. package/dist/commands/improve/extract-prompt.js +2 -2
  42. package/dist/commands/improve/extract.js +67 -97
  43. package/dist/commands/improve/improve-cli.js +22 -128
  44. package/dist/commands/improve/improve-report.js +1 -1
  45. package/dist/commands/improve/improve-strategies.js +25 -108
  46. package/dist/commands/improve/improve.js +10 -14
  47. package/dist/commands/improve/loop-stages.js +3 -0
  48. package/dist/commands/improve/memory/memory-improve.js +1 -1
  49. package/dist/commands/improve/preparation.js +8 -13
  50. package/dist/commands/improve/reflect.js +203 -332
  51. package/dist/commands/improve/retrieval-scope.js +1 -1
  52. package/dist/commands/improve/session-asset.js +3 -2
  53. package/dist/commands/improve/stage.js +87 -115
  54. package/dist/commands/lint/base-linter.js +3 -3
  55. package/dist/commands/lint/index.js +2 -2
  56. package/dist/commands/models-cli.js +103 -63
  57. package/dist/commands/proposal/drain.js +26 -39
  58. package/dist/commands/proposal/proposal-cli.js +14 -18
  59. package/dist/commands/proposal/propose-cli.js +4 -2
  60. package/dist/commands/proposal/propose.js +37 -64
  61. package/dist/commands/proposal/repository.js +17 -17
  62. package/dist/commands/proposal/validators/proposal-validators.js +2 -2
  63. package/dist/commands/read/curate.js +10 -6
  64. package/dist/commands/read/registry-search.js +2 -48
  65. package/dist/commands/read/search-cli.js +1 -8
  66. package/dist/commands/read/search.js +5 -6
  67. package/dist/commands/read/show.js +2 -4
  68. package/dist/commands/remember.js +25 -40
  69. package/dist/commands/sources/bundle-config-ops.js +2 -2
  70. package/dist/commands/sources/info.js +12 -1
  71. package/dist/commands/sources/init.js +1 -1
  72. package/dist/commands/sources/installed-stashes.js +2 -2
  73. package/dist/commands/sources/migration-help.js +1 -1
  74. package/dist/commands/sources/plugin-upgrade.js +8 -15
  75. package/dist/commands/sources/schema-repair.js +4 -8
  76. package/dist/commands/sources/source-add.js +2 -2
  77. package/dist/commands/sources/source-manage.js +4 -4
  78. package/dist/commands/targets.js +175 -0
  79. package/dist/commands/tasks/explain.js +103 -68
  80. package/dist/commands/tasks/tasks-cli.js +9 -11
  81. package/dist/commands/tasks/tasks.js +37 -41
  82. package/dist/commands/ui/api.js +11 -3
  83. package/dist/commands/ui/redact.js +1 -27
  84. package/dist/commands/ui/workspace-actions.js +1 -1
  85. package/dist/commands/workflow/plan.js +1 -1
  86. package/dist/commands/workflow-cli.js +3 -4
  87. package/dist/core/adapter/adapters/agent-skills-adapter.js +10 -11
  88. package/dist/core/adapter/adapters/akm-adapter.js +33 -38
  89. package/dist/core/adapter/adapters/akm-lint.js +7 -8
  90. package/dist/core/adapter/adapters/akm-task-adapter.js +3 -3
  91. package/dist/core/adapter/adapters/akm-workflow-adapter.js +5 -5
  92. package/dist/core/adapter/adapters/claude-adapter.js +1 -1
  93. package/dist/core/adapter/adapters/dotenv-adapter.js +3 -3
  94. package/dist/core/adapter/adapters/generic-files-adapter.js +5 -5
  95. package/dist/core/adapter/adapters/index.js +3 -4
  96. package/dist/core/adapter/adapters/llm-wiki-adapter.js +12 -14
  97. package/dist/core/adapter/adapters/okf-adapter.js +8 -10
  98. package/dist/core/adapter/adapters/opencode-adapter.js +1 -1
  99. package/dist/core/adapter/adapters/shared.js +3 -3
  100. package/dist/core/adapter/adapters/tool-dir-shared.js +7 -25
  101. package/dist/core/adapter/adapters/website-snapshot-adapter.js +3 -3
  102. package/dist/core/adapter/detect-adapter.js +1 -1
  103. package/dist/core/adapter/execution-source.js +13 -35
  104. package/dist/core/adapter/registry.js +1 -1
  105. package/dist/core/adapter/validate-context.js +2 -4
  106. package/dist/core/asset/asset-placement.js +1 -1
  107. package/dist/core/asset/asset-ref.js +3 -3
  108. package/dist/core/closest-match.js +37 -0
  109. package/dist/core/common.js +33 -5
  110. package/dist/core/config/config-io.js +26 -18
  111. package/dist/core/config/config-schema.js +19 -106
  112. package/dist/core/config/config-sources.js +3 -3
  113. package/dist/core/config/config-types.js +4 -4
  114. package/dist/core/config/config-walker.js +50 -77
  115. package/dist/core/config/config.js +385 -93
  116. package/dist/core/config/convert-engine-references.js +114 -0
  117. package/dist/core/config/convert-engines-shared.js +40 -0
  118. package/dist/core/config/convert-engines.js +300 -0
  119. package/dist/core/config/convert-models-overlay.js +137 -0
  120. package/dist/core/config/credentials.js +304 -0
  121. package/dist/core/config/engine-semantics.js +3 -3
  122. package/dist/core/config/migrate-keys.js +222 -0
  123. package/dist/core/config/model-aliases.js +37 -0
  124. package/dist/core/config/models-file.js +34 -0
  125. package/dist/core/config/retired-engines.js +53 -0
  126. package/dist/core/config/schema/connections.js +41 -0
  127. package/dist/core/config/schema/embedding.js +2 -2
  128. package/dist/core/config/schema/harnesses.js +41 -0
  129. package/dist/core/config/schema/improve-processes.js +9 -28
  130. package/dist/core/config/schema/improve.js +36 -1
  131. package/dist/core/config/schema/index-config.js +18 -20
  132. package/dist/core/config/schema/primitives.js +41 -22
  133. package/dist/core/config/schema/search.js +6 -11
  134. package/dist/core/config/schema/sources-bundles.js +7 -7
  135. package/dist/core/config/schema/workflow.js +2 -6
  136. package/dist/core/config/unusable-entries.js +66 -0
  137. package/dist/core/content-safety.js +3 -6
  138. package/dist/core/endpoint-url.js +47 -0
  139. package/dist/core/errors.js +9 -15
  140. package/dist/core/extra-params.js +3 -3
  141. package/dist/core/improve-result.js +8 -9
  142. package/dist/core/json-schema.js +1 -1
  143. package/dist/core/lesson-lint.js +1 -1
  144. package/dist/core/llm-inference.js +80 -0
  145. package/dist/core/npm-package.js +89 -0
  146. package/dist/core/parse.js +2 -2
  147. package/dist/core/paths.js +32 -4
  148. package/dist/core/recognition-util.js +8 -10
  149. package/dist/core/redaction.js +78 -52
  150. package/dist/core/state/migrations.js +17 -22
  151. package/dist/core/structured.js +2 -68
  152. package/dist/core/subprocess.js +63 -22
  153. package/dist/core/tar.js +116 -0
  154. package/dist/core/type-presentation.js +10 -14
  155. package/dist/execution/input-contract.js +3 -6
  156. package/dist/execution/notices.js +49 -0
  157. package/dist/execution/resolved-request.js +24 -40
  158. package/dist/execution/source.js +21 -45
  159. package/dist/execution/target-ref.js +2 -2
  160. package/dist/indexer/bundle-identity-guard.js +6 -5
  161. package/dist/indexer/ensure-index.js +1 -1
  162. package/dist/indexer/index-writer-lock.js +1 -1
  163. package/dist/indexer/indexer.js +19 -6
  164. package/dist/indexer/installations.js +11 -14
  165. package/dist/indexer/materialize-embeddings.js +20 -16
  166. package/dist/indexer/passes/memory-inference.js +21 -50
  167. package/dist/indexer/passes/metadata.js +5 -5
  168. package/dist/indexer/scan/doc-to-entry.js +1 -1
  169. package/dist/indexer/scan/drain-dir.js +6 -8
  170. package/dist/indexer/search/db-search.js +9 -7
  171. package/dist/indexer/search/search-source.js +40 -22
  172. package/dist/indexer/usage/usage-events.js +2 -3
  173. package/dist/indexer/walk/index-context.js +2 -1
  174. package/dist/indexer/walk/matchers.js +3 -11
  175. package/dist/indexer/walk/walker.js +14 -4
  176. package/dist/integrations/agent/akm-read-tools.js +81 -0
  177. package/dist/integrations/agent/config.js +1 -1
  178. package/dist/integrations/agent/detect.js +32 -36
  179. package/dist/integrations/agent/execution.js +130 -428
  180. package/dist/integrations/agent/index.js +1 -1
  181. package/dist/integrations/agent/profiles.js +24 -28
  182. package/dist/integrations/agent/prompts.js +17 -30
  183. package/dist/integrations/agent/request-lowering.js +67 -101
  184. package/dist/integrations/agent/resolution.js +332 -0
  185. package/dist/integrations/agent/runner-dispatch.js +154 -178
  186. package/dist/integrations/agent/runner.js +20 -72
  187. package/dist/integrations/agent/runtime-port.js +4 -0
  188. package/dist/integrations/agent/runtime.js +10 -0
  189. package/dist/integrations/agent/spawn.js +65 -190
  190. package/dist/integrations/harnesses/aider/index.js +19 -39
  191. package/dist/integrations/harnesses/amazonq/index.js +17 -32
  192. package/dist/integrations/harnesses/claude/index.js +59 -28
  193. package/dist/integrations/harnesses/claude/session-log.js +7 -5
  194. package/dist/integrations/harnesses/codex/index.js +19 -31
  195. package/dist/integrations/harnesses/copilot/index.js +17 -35
  196. package/dist/integrations/harnesses/gemini/index.js +18 -34
  197. package/dist/integrations/harnesses/harness.js +36 -0
  198. package/dist/integrations/harnesses/index.js +20 -51
  199. package/dist/integrations/harnesses/opencode/agent-builder.js +132 -100
  200. package/dist/integrations/harnesses/opencode/index.js +11 -33
  201. package/dist/integrations/harnesses/opencode/roots.js +50 -0
  202. package/dist/integrations/harnesses/opencode/runtime/binary.js +139 -0
  203. package/dist/integrations/harnesses/opencode/runtime/command.js +152 -0
  204. package/dist/integrations/harnesses/opencode/runtime/index.js +181 -0
  205. package/dist/integrations/harnesses/opencode/session-log-v1.js +15 -7
  206. package/dist/integrations/harnesses/opencode/session-log-v2.js +72 -48
  207. package/dist/integrations/harnesses/opencode/session-log.js +58 -137
  208. package/dist/integrations/harnesses/opencode/version.js +34 -53
  209. package/dist/integrations/harnesses/openhands/index.js +13 -37
  210. package/dist/integrations/harnesses/pi/index.js +21 -32
  211. package/dist/integrations/lockfile.js +1 -1
  212. package/dist/integrations/session-logs/index.js +11 -31
  213. package/dist/llm/client.js +93 -111
  214. package/dist/llm/embedder.js +19 -34
  215. package/dist/llm/embedders/connection.js +31 -0
  216. package/dist/llm/embedders/local-model-files.js +56 -0
  217. package/dist/llm/embedders/local.js +111 -115
  218. package/dist/llm/embedders/onnx-runtime.js +121 -0
  219. package/dist/llm/embedders/remote.js +26 -24
  220. package/dist/llm/embedders/types.js +1 -1
  221. package/dist/llm/index-passes.js +33 -39
  222. package/dist/llm/memory-infer.js +67 -77
  223. package/dist/llm/model-list.js +35 -0
  224. package/dist/llm/rerank-client.js +8 -14
  225. package/dist/llm/structured-call.js +45 -99
  226. package/dist/llm/structured.js +60 -0
  227. package/dist/output/renderers.js +2 -7
  228. package/dist/output/shapes/helpers.js +18 -42
  229. package/dist/output/shapes/passthrough.js +1 -0
  230. package/dist/output/shapes.js +1 -7
  231. package/dist/output/text/command-format.js +29 -37
  232. package/dist/output/text/health-format.js +8 -2
  233. package/dist/output/text/helpers.js +1 -1
  234. package/dist/output/text/migrate.js +12 -0
  235. package/dist/output/text/models.js +3 -2
  236. package/dist/output/text/registry-commands.js +1 -2
  237. package/dist/output/text/show-format.js +0 -2
  238. package/dist/output/text/targets-table.js +70 -0
  239. package/dist/output/text/workflow-format.js +7 -8
  240. package/dist/output/text.js +1 -1
  241. package/dist/registry/providers/skills-sh.js +1 -28
  242. package/dist/registry/providers/static-index.js +1 -71
  243. package/dist/runtime.js +6 -2
  244. package/dist/scripts/akm-migrate-node.js +5197 -4193
  245. package/dist/scripts/akm-migrate.js +5197 -4193
  246. package/dist/setup/detect.js +28 -273
  247. package/dist/setup/endpoint.js +36 -0
  248. package/dist/setup/semantic-assets.js +18 -21
  249. package/dist/setup/setup-flags.js +77 -0
  250. package/dist/setup/setup-plan.js +144 -0
  251. package/dist/setup/setup.js +184 -354
  252. package/dist/setup/steps/connection-shared.js +49 -101
  253. package/dist/setup/steps/connection.js +121 -524
  254. package/dist/setup/steps/embeddings.js +168 -0
  255. package/dist/setup/steps/harnesses.js +118 -0
  256. package/dist/setup/steps/platforms.js +2 -81
  257. package/dist/setup/steps.js +10 -0
  258. package/dist/setup/summary.js +67 -0
  259. package/dist/sources/freshness.js +16 -21
  260. package/dist/sources/providers/git-provider.js +2 -9
  261. package/dist/sources/providers/provider-utils.js +1 -5
  262. package/dist/sources/snapshot-fetchers/robots.js +11 -12
  263. package/dist/sources/snapshot-fetchers/website-ingest.js +8 -15
  264. package/dist/storage/database.js +17 -57
  265. package/dist/storage/repositories/improve-ledger-repository.js +1 -1
  266. package/dist/storage/repositories/improve-runs-repository.js +0 -13
  267. package/dist/storage/repositories/index-entries-repository.js +2 -2
  268. package/dist/storage/repositories/workflow-runs-repository.js +8 -15
  269. package/dist/storage/sqlite-read-snapshot.js +33 -29
  270. package/dist/tasks/log-redaction.js +7 -119
  271. package/dist/tasks/prepare/prepare-support.js +5 -5
  272. package/dist/tasks/prepare/prepare.js +5 -5
  273. package/dist/tasks/prepare/script-capture.js +3 -5
  274. package/dist/tasks/run/attempt-lifecycle.js +17 -35
  275. package/dist/tasks/run/load-task.js +8 -13
  276. package/dist/tasks/run/run-command-task.js +15 -10
  277. package/dist/tasks/run/run-native-task.js +8 -13
  278. package/dist/tasks/run/run-task.js +5 -8
  279. package/dist/tasks/run/run-workflow-task.js +12 -19
  280. package/dist/tasks/run/task-history.js +9 -17
  281. package/dist/tasks/run/task-log.js +1 -5
  282. package/dist/tasks/scheduler-invocation.js +13 -18
  283. package/dist/tasks/source/bounded-document.js +31 -76
  284. package/dist/tasks/source/project-v4.js +5 -3
  285. package/dist/tasks/source/task-input-diagnostics.js +3 -4
  286. package/dist/tasks/source/task-source-v4.js +47 -68
  287. package/dist/tasks/source-v3.js +2 -5
  288. package/dist/tasks/task-run-reserved-flags.js +1 -2
  289. package/dist/workflows/authoring/authoring.js +2 -7
  290. package/dist/workflows/concurrency-policy.js +4 -4
  291. package/dist/workflows/exec/child-workflow.js +0 -2
  292. package/dist/workflows/exec/dispatch-redaction.js +14 -83
  293. package/dist/workflows/exec/environment.js +2 -3
  294. package/dist/workflows/exec/exec-unit.js +10 -59
  295. package/dist/workflows/exec/frozen-judge.js +10 -26
  296. package/dist/workflows/exec/native-executor.js +56 -45
  297. package/dist/workflows/exec/run-workflow.js +7 -24
  298. package/dist/workflows/exec/step-work.js +9 -14
  299. package/dist/workflows/exec/unit-dispatch.js +6 -13
  300. package/dist/workflows/freeze/freeze.js +14 -32
  301. package/dist/workflows/freeze/step-values.js +5 -11
  302. package/dist/workflows/freeze/targets/command.js +3 -6
  303. package/dist/workflows/freeze/task-bindings.js +0 -1
  304. package/dist/workflows/parser.js +44 -34
  305. package/dist/workflows/plan.js +3 -1
  306. package/dist/workflows/renderer.js +6 -5
  307. package/dist/workflows/resource-limits.js +2 -2
  308. package/dist/workflows/runtime/run-plan.js +2 -1
  309. package/dist/workflows/runtime/runs.js +14 -9
  310. package/docs/README.md +10 -16
  311. package/docs/architecture/README.md +2 -37
  312. package/docs/architecture/adapters.md +2 -2
  313. package/docs/architecture/akm-core-principles.md +257 -118
  314. package/docs/architecture/architecture.md +282 -98
  315. package/docs/architecture/improvement.md +8 -2
  316. package/docs/architecture/internals/classification.md +1 -3
  317. package/docs/architecture/internals/fresh-host-rebuild-runbook.md +7 -6
  318. package/docs/architecture/internals/health-advisories.md +35 -74
  319. package/docs/architecture/internals/improve-workflow.md +27 -26
  320. package/docs/architecture/internals/indexing.md +3 -3
  321. package/docs/architecture/internals/storage-locations.md +46 -12
  322. package/docs/architecture/persisted-data-compat.md +9 -6
  323. package/docs/architecture/specs/okf-support.md +9 -11
  324. package/docs/architecture/specs/ref.md +7 -9
  325. package/docs/architecture/testing/testing-workflow.md +173 -42
  326. package/docs/architecture/workflow-engine.md +17 -14
  327. package/docs/guides/README.md +0 -1
  328. package/docs/guides/author-bundles.md +1 -3
  329. package/docs/guides/author-workflows.md +61 -73
  330. package/docs/guides/bundles.md +4 -5
  331. package/docs/guides/discover-and-load.md +1 -1
  332. package/docs/guides/getting-started.md +51 -3
  333. package/docs/guides/improve-the-library.md +10 -4
  334. package/docs/guides/recipes/headless-install.md +21 -21
  335. package/docs/guides/run-workflows.md +6 -9
  336. package/docs/guides/scheduling.md +2 -2
  337. package/docs/guides/use-with-any-agent.md +20 -22
  338. package/docs/integration/bundling-akm.md +19 -9
  339. package/docs/maintainers/README.md +0 -3
  340. package/docs/migration/README.md +10 -3
  341. package/docs/migration/release-notes/0.10.0.md +81 -16
  342. package/docs/migration/release-notes/0.6.0.md +1 -1
  343. package/docs/migration/release-notes/0.7.0.md +1 -1
  344. package/docs/migration/release-notes/0.9.0.md +1 -1
  345. package/docs/migration/release-notes/README.md +1 -1
  346. package/docs/migration/v0.9-to-v0.10.md +312 -59
  347. package/docs/migration/v0.9.1-to-v0.9.2.md +6 -5
  348. package/docs/posts/config-v2-lessons-16.md +1 -1
  349. package/docs/posts/llm-mode-reflect-13.md +1 -1
  350. package/docs/posts/release-0.6.0.md +11 -11
  351. package/docs/posts/release-0.8.0.md +4 -4
  352. package/docs/posts/workflows-vaults-09.md +1 -1
  353. package/docs/reference/README.md +1 -1
  354. package/docs/reference/asset-types.md +2 -2
  355. package/docs/reference/cli.md +367 -279
  356. package/docs/reference/configuration.md +591 -557
  357. package/docs/reference/data-and-telemetry.md +8 -5
  358. package/docs/reference/env-and-secrets.md +11 -5
  359. package/docs/reference/refs.md +3 -20
  360. package/docs/reference/registry.md +6 -27
  361. package/docs/reference/supported-formats.md +1 -1
  362. package/docs/reference/tasks.md +11 -8
  363. package/docs/reference/ui-api.md +11 -6
  364. package/docs/reference/workflow-schema.md +106 -134
  365. package/docs/reference/workflows.md +4 -6
  366. package/package.json +9 -14
  367. package/schemas/akm-config.json +1696 -2922
  368. package/schemas/akm-task.json +2 -0
  369. package/schemas/akm-workflow.json +36 -9
  370. package/ROADMAP.md +0 -112
  371. package/dist/assets/models.json +0 -35
  372. package/dist/commands/health/engine-usage.js +0 -45
  373. package/dist/core/config/schema/engines.js +0 -160
  374. package/dist/core/config/schema/execution.js +0 -23
  375. package/dist/core/spawn-env.js +0 -268
  376. package/dist/integrations/agent/builder-shared.js +0 -33
  377. package/dist/integrations/agent/builders.js +0 -43
  378. package/dist/integrations/agent/engine-fallback.js +0 -59
  379. package/dist/integrations/agent/engine-resolution.js +0 -335
  380. package/dist/integrations/agent/model-map.js +0 -475
  381. package/dist/integrations/harnesses/aider/agent-builder.js +0 -107
  382. package/dist/integrations/harnesses/aider/result-extractor.js +0 -53
  383. package/dist/integrations/harnesses/amazonq/agent-builder.js +0 -138
  384. package/dist/integrations/harnesses/amazonq/result-extractor.js +0 -48
  385. package/dist/integrations/harnesses/claude/agent-builder.js +0 -106
  386. package/dist/integrations/harnesses/claude/config-import.js +0 -67
  387. package/dist/integrations/harnesses/claude/result-extractor.js +0 -67
  388. package/dist/integrations/harnesses/codex/agent-builder.js +0 -150
  389. package/dist/integrations/harnesses/codex/result-extractor.js +0 -110
  390. package/dist/integrations/harnesses/copilot/agent-builder.js +0 -117
  391. package/dist/integrations/harnesses/copilot/result-extractor.js +0 -178
  392. package/dist/integrations/harnesses/gemini/agent-builder.js +0 -114
  393. package/dist/integrations/harnesses/gemini/result-extractor.js +0 -149
  394. package/dist/integrations/harnesses/opencode/config-import.js +0 -149
  395. package/dist/integrations/harnesses/opencode/model-config.js +0 -33
  396. package/dist/integrations/harnesses/opencode/model-work-agent.js +0 -115
  397. package/dist/integrations/harnesses/opencode/session-log-types.js +0 -12
  398. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -44
  399. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +0 -1052
  400. package/dist/integrations/harnesses/opencode-sdk/v1-adapter.js +0 -199
  401. package/dist/integrations/harnesses/opencode-sdk/v2-adapter.js +0 -254
  402. package/dist/integrations/harnesses/opencode-sdk/wire.js +0 -66
  403. package/dist/integrations/harnesses/openhands/agent-builder.js +0 -120
  404. package/dist/integrations/harnesses/openhands/result-extractor.js +0 -135
  405. package/dist/integrations/harnesses/pi/agent-builder.js +0 -89
  406. package/dist/integrations/harnesses/pi/result-extractor.js +0 -168
  407. package/dist/integrations/harnesses/shared.js +0 -18
  408. package/dist/integrations/harnesses/types.js +0 -55
  409. package/dist/llm/feature-gate.js +0 -115
  410. package/dist/output/shapes/models-list.js +0 -16
  411. package/dist/output/shapes/registry-search.js +0 -10
  412. package/dist/setup/detected-engines.js +0 -136
  413. package/dist/setup/engine-config.js +0 -97
  414. package/dist/setup/harness-config-import.js +0 -47
  415. package/dist/setup/providers.js +0 -14
  416. package/dist/setup/steps/semantic.js +0 -39
  417. package/dist/workflows/exec/lowering-notices.js +0 -23
  418. package/docs/architecture/0.10-process-rules.md +0 -832
  419. package/docs/architecture/akm-architecture-decision-history.md +0 -2055
  420. package/docs/architecture/comparisons/claude-code-vs-akm-workflows-full.md +0 -544
  421. package/docs/architecture/decisions/0001-no-interpolation-attached-structured-context.md +0 -72
  422. package/docs/architecture/decisions/0002-unit-reuse-and-input-hash-scope.md +0 -142
  423. package/docs/architecture/decisions/0003-child-env-allowlist-and-provenance.md +0 -187
  424. package/docs/architecture/decisions/0004-task-input-contract-and-flag-coercion.md +0 -97
  425. package/docs/architecture/decisions/0005-task-result-vocabulary-and-legacy-read-mapping.md +0 -108
  426. package/docs/architecture/decisions/0006-task-source-version-routing.md +0 -124
  427. package/docs/architecture/decisions/0007-workflow-composition-bounds.md +0 -83
  428. package/docs/architecture/decisions/0008-task-binding-normalization.md +0 -88
  429. package/docs/architecture/decisions/0009-child-run-publication-column-parity.md +0 -80
  430. package/docs/architecture/decisions/0010-driver-protocol-cut.md +0 -36
  431. package/docs/architecture/decisions/0011-engine-run-loop-invariants.md +0 -125
  432. package/docs/architecture/decisions/README.md +0 -62
  433. package/docs/architecture/internals/functional-contract-patterns.md +0 -340
  434. package/docs/architecture/internals/registry-network-boundary.md +0 -57
  435. package/docs/architecture/internals/search.md +0 -248
  436. package/docs/architecture/reviews/env-secret-access.md +0 -319
  437. package/docs/architecture/runtime-boundary-design.md +0 -153
  438. package/docs/architecture/specs/0.9.0-close-out-plan.md +0 -361
  439. package/docs/architecture/specs/0.9.0-decisions.md +0 -532
  440. package/docs/architecture/specs/0.9.0-docs-code-drift-register.md +0 -745
  441. package/docs/architecture/specs/0.9.0-open-items-register.md +0 -135
  442. package/docs/architecture/specs/0.9.0-public-api-issue-backlog.md +0 -740
  443. package/docs/architecture/specs/0.9.0-release-surface-review.md +0 -636
  444. package/docs/architecture/specs/agent-command-engine-model-design.md +0 -513
  445. package/docs/architecture/specs/akm-0.9.0-bundle-adapter-spec.md +0 -501
  446. package/docs/architecture/specs/akm-0.9.0-ref-grammar-decision.md +0 -291
  447. package/docs/architecture/specs/akm-format-neutral-bundle-workspace-spec.md +0 -2059
  448. package/docs/architecture/specs/di-seams-plan.md +0 -539
  449. package/docs/architecture/specs/driver-protocol-keep-or-cut.md +0 -275
  450. package/docs/architecture/specs/fact-asset-type.md +0 -142
  451. package/docs/architecture/specs/improve-collapse-churn-detector-design.md +0 -634
  452. package/docs/architecture/specs/reviews/task-workflow-unification/README.md +0 -72
  453. package/docs/architecture/specs/reviews/task-workflow-unification/findings-consolidated.md +0 -152
  454. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-alternatives.md +0 -352
  455. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-bunqueue.md +0 -300
  456. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-openworkflow.md +0 -402
  457. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-1.md +0 -758
  458. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-2.md +0 -645
  459. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-3.md +0 -602
  460. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-adversarial.md +0 -27
  461. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-architecture.md +0 -27
  462. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-coverage.md +0 -74
  463. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-security.md +0 -15
  464. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-adversarial.md +0 -132
  465. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-verification.md +0 -147
  466. package/docs/architecture/specs/stash-conventions-code-spec.md +0 -275
  467. package/docs/architecture/specs/stash-organization-conventions.md +0 -377
  468. package/docs/architecture/specs/task-workflow-format-unification.md +0 -721
  469. package/docs/architecture/specs/workflow-engine-buy-vs-build.md +0 -231
  470. package/docs/architecture/specs/workflow-format-unification.md +0 -432
  471. package/docs/architecture/testing/manual-testing-checklist.md +0 -3379
  472. package/docs/architecture/testing/okf-v0.2-conformance-runbook.md +0 -924
  473. package/docs/architecture/testing/task-workflow-manual-tests.md +0 -1702
  474. package/docs/guides/claude-code-vs-akm-workflows.md +0 -29
  475. package/docs/guides/knowledge-management.md +0 -18
  476. package/docs/maintainers/curate-workmap.md +0 -335
  477. package/docs/migration/v0.5-to-v0.6.md +0 -759
  478. package/docs/migration/v0.7-to-v0.8.md +0 -1378
  479. package/docs/plans/0.9.2-agent-command-workflow-plan.md +0 -423
@@ -2,42 +2,24 @@
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
- * GitHub Copilot CLI harness (P2 integration, plan §"The adapter contract").
6
- *
7
- * Per-harness barrel gathering the Copilot CLI integration surfaces:
8
- * - agent command builder → ./agent-builder.ts (copilotBuilder)
9
- * - result extractor → ./result-extractor.ts (copilotResultExtractor)
10
- *
11
- * It also defines {@link CopilotHarness}, the {@link AkmHarness} descriptor
12
- * that `HARNESS_REGISTRY` registers. This is the LOCAL Copilot CLI
13
- * (`copilot -p …`); the cloud "Copilot coding agent" is a separate, future
14
- * descriptor.
5
+ * GitHub Copilot CLI (`copilot`), the local headless CLI and not the cloud coding
6
+ * agent. `-p` runs one prompt; `--allow-all-tools` is what lets it run without
7
+ * asking for approval at each tool.
15
8
  */
16
- import { caps } from "../shared.js";
17
- import { BaseHarness } from "../types.js";
18
- import { copilotBuilder } from "./agent-builder.js";
19
- import { copilotResultExtractor } from "./result-extractor.js";
20
- export { COPILOT_PLATFORM, copilotBuilder } from "./agent-builder.js";
21
- export { copilotResultExtractor } from "./result-extractor.js";
22
- /**
23
- * GitHub Copilot CLI (local headless CLI, not the cloud coding agent).
24
- *
25
- * Canonical id is `'copilot'`; no alias or distinct runtime identity.
26
- */
27
- export class CopilotHarness extends BaseHarness {
9
+ import { withoutModelFlag, } from "../harness.js";
10
+ export class CopilotHarness {
28
11
  id = "copilot";
29
12
  displayName = "GitHub Copilot CLI";
30
- agentBuilder = copilotBuilder;
31
- profile = { bin: "copilot", args: [], envPassthrough: ["GH_TOKEN", "GITHUB_TOKEN"] };
32
- resultExtractor = copilotResultExtractor;
33
- // ── Workflow-engine descriptor (plan §"Capability matrix", P2) ────────────
34
- // Session-id env marker only. The matrix's other candidates (GH_TOKEN,
35
- // bare COPILOT_* presence vars) are credential/presence flags that would
36
- // stamp identity onto manual runs, so they are deliberately NOT registered
37
- // (see `AkmHarness.identityEnv`).
38
- identityEnv = ["COPILOT_SESSION_ID"];
39
- capabilities = caps({
40
- agentDispatch: true,
41
- detection: true,
42
- });
13
+ profile = { bin: "copilot", args: [] };
14
+ systemPrompt = false;
15
+ nativeAgent = false;
16
+ confinable = false;
17
+ build({ bin, args }, req) {
18
+ const argv = [bin, ...(req.model ? withoutModelFlag(args) : args)];
19
+ if (req.model)
20
+ argv.push("--model", req.model);
21
+ if (req.prompt !== undefined)
22
+ argv.push("--allow-all-tools", "-p", req.prompt);
23
+ return { argv };
24
+ }
43
25
  }
@@ -2,42 +2,26 @@
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
- * Gemini CLI harness (P2 integration, plan §"The adapter contract").
6
- *
7
- * Per-harness barrel gathering the Gemini CLI integration surfaces:
8
- * - agent command builder → ./agent-builder.ts (geminiBuilder)
9
- * - result extractor → ./result-extractor.ts (geminiResultExtractor)
10
- *
11
- * It also defines {@link GeminiHarness}, the {@link AkmHarness} descriptor
12
- * that `HARNESS_REGISTRY` registers. Dispatch-only: no native session-log
13
- * reader or config importer yet.
5
+ * Gemini CLI (`gemini`). `-p` runs one prompt headless. Autonomy flags
6
+ * (`--yolo`, `--approval-mode`) belong in the config's `args`, where the user opts in.
14
7
  */
15
- import { caps } from "../shared.js";
16
- import { BaseHarness } from "../types.js";
17
- import { geminiBuilder } from "./agent-builder.js";
18
- import { geminiResultExtractor } from "./result-extractor.js";
19
- export { GEMINI_PLATFORM, geminiBuilder } from "./agent-builder.js";
20
- export { geminiResultExtractor } from "./result-extractor.js";
21
- /**
22
- * Gemini CLI.
23
- *
24
- * Canonical id is `'gemini'`; no alias or distinct runtime identity.
25
- */
26
- export class GeminiHarness extends BaseHarness {
8
+ import { withoutModelFlag, } from "../harness.js";
9
+ export class GeminiHarness {
27
10
  id = "gemini";
28
11
  displayName = "Gemini CLI";
29
- agentBuilder = geminiBuilder;
30
- profile = { bin: "gemini", args: [], envPassthrough: ["GEMINI_API_KEY", "GOOGLE_API_KEY"] };
31
- resultExtractor = geminiResultExtractor;
32
- // ── Workflow-engine descriptor (plan §"Capability matrix", P2) ────────────
33
- // The matrix's identity marker: Gemini CLI stamps GEMINI_CLI=1 only on
34
- // processes it spawns, so it genuinely means "running under gemini" (it is
35
- // not a user-profile config var) — but its VALUE ("1") is a bare flag, not
36
- // a session id, so it is registered as `presenceEnv` (harness inference
37
- // only), never `identityEnv` (whose values persist as agent_session_id).
12
+ profile = { bin: "gemini", args: [] };
13
+ // GEMINI_CLI=1 is stamped only on processes Gemini CLI spawns, so it means "running under
14
+ // gemini"; its value is a bare flag, not a session id.
38
15
  presenceEnv = ["GEMINI_CLI"];
39
- capabilities = caps({
40
- agentDispatch: true,
41
- detection: true,
42
- });
16
+ systemPrompt = false;
17
+ nativeAgent = false;
18
+ confinable = false;
19
+ build({ bin, args }, req) {
20
+ const argv = [bin, ...(req.model ? withoutModelFlag(args) : args)];
21
+ if (req.model)
22
+ argv.push("--model", req.model);
23
+ if (req.prompt !== undefined)
24
+ argv.push("-p", req.prompt);
25
+ return { argv };
26
+ }
43
27
  }
@@ -0,0 +1,36 @@
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 model the config's own `args` select, as `--model X` or `--model=X` (the
6
+ * last one wins).
7
+ */
8
+ export function modelFromArgs(args) {
9
+ let model;
10
+ for (let index = 0; index < args.length; index += 1) {
11
+ const arg = args[index];
12
+ if (arg === "--model")
13
+ model = args[index + 1];
14
+ else if (arg?.startsWith("--model="))
15
+ model = arg.slice("--model=".length);
16
+ }
17
+ return model;
18
+ }
19
+ /** `args` without any `--model X` or `--model=X`, for a builder that adds the request's model itself, so it is passed once. */
20
+ export function withoutModelFlag(args) {
21
+ const kept = [];
22
+ for (let index = 0; index < args.length; index += 1) {
23
+ const arg = args[index];
24
+ if (arg === undefined)
25
+ continue;
26
+ if (arg === "--model")
27
+ index += 1;
28
+ else if (!arg.startsWith("--model="))
29
+ kept.push(arg);
30
+ }
31
+ return kept;
32
+ }
33
+ /** `args` less a leading `subcommand` the builder writes itself, so an authored one is not doubled. */
34
+ export function withoutLeading(args, subcommand) {
35
+ return args[0] === subcommand ? args.slice(1) : [...args];
36
+ }
@@ -11,8 +11,7 @@
11
11
  *
12
12
  * Adding a harness: create `./<id>/index.ts`, add its class here. Removing:
13
13
  * delete both. This module must stay free of runtime `core/config` imports
14
- * (config derives `VALID_HARNESS_IDS` from here), so a harness's heavy runner
15
- * (e.g. `opencode-sdk/sdk-runner.ts`) is imported by its caller, not here.
14
+ * (config derives `VALID_HARNESS_IDS` from here).
16
15
  */
17
16
  import { AiderHarness } from "./aider/index.js";
18
17
  import { AmazonqHarness } from "./amazonq/index.js";
@@ -21,28 +20,21 @@ import { CodexHarness } from "./codex/index.js";
21
20
  import { CopilotHarness } from "./copilot/index.js";
22
21
  import { GeminiHarness } from "./gemini/index.js";
23
22
  import { OpencodeHarness } from "./opencode/index.js";
24
- import { OpencodeSdkHarness } from "./opencode-sdk/index.js";
25
23
  import { OpenhandsHarness } from "./openhands/index.js";
26
24
  import { PiHarness } from "./pi/index.js";
27
- import { isSessionLogHarness } from "./types.js";
28
- export { isSessionLogHarness } from "./types.js";
29
25
  /**
30
- * The single registration point.
31
- *
32
- * Typed `as const` (not `AkmHarness[]`) so each entry keeps its literal `id`,
33
- * which lets `VALID_HARNESS_IDS` stay a literal tuple — `HarnessId`,
34
- * `z.enum(...)`, and the `platform` union all need the literal types.
26
+ * The registered harnesses, with each entry keeping its literal `id` so that
27
+ * `VALID_HARNESS_IDS` can stay a literal tuple (`HarnessId`, `z.enum(...)` and
28
+ * the `platform` union all need the literal types).
35
29
  */
36
30
  // Order is significant: VALID_HARNESS_IDS derives from this array and feeds the
37
- // committed JSON-schema enum order. The original [opencode, claude,
38
- // opencode-sdk] prefix is preserved so the pre-unification portion of the
39
- // generated schema enum does not reorder; the seven P2 harness adapters are
40
- // appended after it, which extends the enum additively (schemas/akm-config.json
41
- // is regenerated in lockstep).
42
- export const HARNESS_REGISTRY = Object.freeze([
31
+ // committed JSON-schema enum order. The original [opencode, claude] prefix is
32
+ // preserved so the pre-unification portion of the generated schema enum does not
33
+ // reorder; the seven P2 harness adapters are appended after it, which extends the
34
+ // enum additively (schemas/akm-config.json is regenerated in lockstep).
35
+ const REGISTERED = [
43
36
  new OpencodeHarness(),
44
37
  new ClaudeHarness(),
45
- new OpencodeSdkHarness(),
46
38
  new CodexHarness(),
47
39
  new CopilotHarness(),
48
40
  new PiHarness(),
@@ -50,49 +42,26 @@ export const HARNESS_REGISTRY = Object.freeze([
50
42
  new AiderHarness(),
51
43
  new AmazonqHarness(),
52
44
  new OpenhandsHarness(),
53
- ]);
45
+ ];
46
+ /** The single registration point. */
47
+ export const HARNESS_REGISTRY = Object.freeze([...REGISTERED]);
54
48
  /** Lookup by the one supported harness id. */
55
49
  export const HARNESS_BY_ID = new Map(HARNESS_REGISTRY.map((h) => [h.id, h]));
56
50
  /**
57
51
  * Canonical, ordered list of valid harness / platform ids. The Zod
58
- * `AgentPlatformSchema` enum, the agent-engine platform union, and
52
+ * `AgentPlatformSchema` enum, the harness platform union, and
59
53
  * setup's `DetectedHarness` union all derive from this so they cannot drift.
60
54
  */
61
- export const VALID_HARNESS_IDS = Object.freeze(HARNESS_REGISTRY.map((h) => h.id));
62
- /**
63
- * Harnesses that expose readable native session logs. Narrowed via the
64
- * {@link isSessionLogHarness} type-predicate (rather than a plain boolean
65
- * callback) so `sessionLogProvider` is known-present on every element — see
66
- * that function's doc comment for why a plain predicate doesn't narrow here.
67
- */
68
- export const SESSION_LOG_HARNESSES = HARNESS_REGISTRY.filter(isSessionLogHarness);
69
- /** Harnesses that can be dispatched as an agent CLI / SDK. */
70
- export const AGENT_DISPATCH_HARNESSES = HARNESS_REGISTRY.filter((h) => h.capabilities.agentDispatch);
71
- const idsWith = (flag) => new Set(HARNESS_REGISTRY.filter(flag).map((h) => h.id));
72
- /** Harness ids whose `capabilities.agentDispatch` is `true`. */
73
- export const HARNESS_AGENT_DISPATCH_IDS = idsWith((h) => h.capabilities.agentDispatch);
74
- /** Harness ids that confine the model-work tool policy, so unattended model work may run on them. */
75
- export const HARNESS_MODEL_WORK_IDS = idsWith((h) => h.capabilities.modelWork);
76
- /** Harness ids that can run a named native agent, so an engine may name a default `agent`. */
77
- export const HARNESS_NATIVE_AGENT_IDS = idsWith((h) => h.capabilities.nativeAgent);
55
+ export const VALID_HARNESS_IDS = Object.freeze(REGISTERED.map((h) => h.id));
56
+ /** The platforms a `harnesses` entry may name: every harness in the registry. */
57
+ export const HARNESS_CONFIG_PLATFORMS = VALID_HARNESS_IDS;
58
+ /** Harnesses that expose readable native session logs. */
59
+ export const SESSION_LOG_HARNESSES = HARNESS_REGISTRY.filter((h) => h.sessionLogProvider !== undefined);
60
+ /** Harness ids that can run a named native agent, so a harness may name a default `agent`. */
61
+ export const HARNESS_NATIVE_AGENT_IDS = new Set(HARNESS_REGISTRY.filter((h) => h.nativeAgent).map((h) => h.id));
78
62
  /**
79
63
  * Resolve an exact harness id to its descriptor, or `undefined` if unknown.
80
64
  */
81
65
  export function getHarness(id) {
82
66
  return HARNESS_BY_ID.get(id);
83
67
  }
84
- /**
85
- * Default agent-profile name for a detected harness id (#566).
86
- *
87
- * Used by `akm setup`'s headless/recommended-config path so a newly added
88
- * dispatch-capable harness gets a usable default profile name (its canonical
89
- * id) instead of falling through a hardcoded if-chain with no default. Returns
90
- * `undefined` for `"none"` or any id that is unknown / not agent-dispatch
91
- * capable.
92
- */
93
- export function defaultProfileName(detected) {
94
- const h = HARNESS_BY_ID.get(detected);
95
- if (!h?.capabilities.agentDispatch)
96
- return undefined;
97
- return h.id;
98
- }
@@ -2,120 +2,152 @@
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
- * OpenCode agent command builder (migrated from `agent/builders.ts`, #564).
5
+ * OpenCode command builder: the `opencode run` CLI of the opencode harness
6
+ * (#1244), for both majors, treated like the Claude and Codex CLIs. The user's
7
+ * OpenCode owns its config, logins and sessions; akm hands it a prompt and reads
8
+ * the reply from stdout.
6
9
  *
7
- * Translates a platform-agnostic {@link AgentDispatchRequest} into the exact
8
- * argv the `opencode` CLI expects. This is the OpenCode-specific slice of the
9
- * builder strategy; the shared infrastructure (`AgentCommandBuilder`,
10
- * `getCommandBuilder`, the default builder, flag/tool helpers) stays in
11
- * `agent/builders.ts`, which imports this builder back into `BUILTIN_BUILDERS`.
10
+ * The prompt goes on stdin: `opencode run` alters an argv message (quotes change,
11
+ * inner quotes are escaped) and a prompt that starts with `-` could be taken for
12
+ * a flag; stdin is read verbatim. akm closes it after the write, which the CLI
13
+ * needs: with stdin open it waits for more input.
12
14
  *
13
- * The builder's `platform` stays `'opencode'` (the canonical harness id). The
14
- * one thing that depends on the OpenCode major (`./version.ts`, one cached
15
- * `--version` run per binary) is `--standalone`, added on OpenCode 2 only; the
16
- * OpenCode 1 argv is byte-identical to the pre-OpenCode-2 builder's.
15
+ * Agent work adds nothing: `opencode run`, the authored args as written, `--model` when akm
16
+ * names one, `--agent` when the asset names one, and the prompt on stdin. The run is the
17
+ * user's own, on their OpenCode as they have it set up.
18
+ *
19
+ * Model work is akm's own process. It sets `OPENCODE_DISABLE_FREE_MODELS` (OpenCode 2.1.2 and
20
+ * later, where the variable first appears): with no usable provider, OpenCode 2 would
21
+ * otherwise send akm's data to its hosted free model. The variable deletes every zero-cost
22
+ * model of the `opencode` and `opencode-go` providers, so it has no place on agent work,
23
+ * where it would override a model the user chose. On OpenCode 2 model work also gets
24
+ * `--standalone`, which keeps the run to one process that ends with it (the default attaches
25
+ * to a background service that outlives the CLI, is shared across users on one port, ignores
26
+ * inline config and replays killed sessions at every start), and `--title`, which names the
27
+ * session and spares the second model request that would otherwise generate a title.
28
+ *
29
+ * A binary whose version cannot be read runs model work as OpenCode 1, with one warning that says so.
30
+ *
31
+ * Model work drops the config's `args`, keeping the model they name, as the
32
+ * Claude and Codex shells do. On OpenCode 2 it runs as {@link MODEL_WORK_AGENT},
33
+ * an agent defined inline for the run whose tools are limited to reading and
34
+ * searching, added to the user's own inline config; OpenCode 1 cannot be
35
+ * restricted and runs it unrestricted, with a one-line warning.
17
36
  */
18
- import { modelFromArgs, resolveDispatchModel, } from "../../agent/builder-shared.js";
19
- import { createAgentRequestLowerer } from "../../agent/request-lowering.js";
20
- import { MODEL_WORK_AGENT_INFERENCE, opencodeInferenceConfig } from "./model-config.js";
21
- import { MODEL_WORK_OPENCODE_AGENT, modelWorkOpencodeConfig, modelWorkPluginEnv } from "./model-work-agent.js";
22
- import { detectOpencodeMajor } from "./version.js";
37
+ import { asRecord, parseJsonc } from "../../../core/common.js";
38
+ import { warnOnce } from "../../../core/warn.js";
39
+ import { modelFromArgs, withoutLeading, withoutModelFlag, } from "../harness.js";
40
+ import { detectOpencodeMajor, isOpencode2 } from "./version.js";
41
+ /** The agent OpenCode 2 runs akm's model work as, limited to reading and searching; the name also marks those sessions in the user's history (`./session-log-v2.ts`). */
42
+ export const MODEL_WORK_AGENT = "akm-model-work";
23
43
  /**
24
- * OpenCode 2's `run` attaches to a shared background service by default,
25
- * starting it when absent and leaving it running after the run; `--standalone`
26
- * runs a private server that exits with the run (and reads the
27
- * `OPENCODE_CONFIG_CONTENT` model work travels in, which the service ignores).
28
- * OpenCode 1 has no such flag. An engine whose own `args` name `--server`
29
- * chose that server, so it gets no `--standalone`. `--auto` is never passed:
30
- * a non-interactive run rejects a permission request, on both majors.
44
+ * The agent's definition, in OpenCode 2's native shape, passed inline so it merges over the user's config and is
45
+ * never written anywhere. Its permission rules are default-deny with the reading tools allowed after it (the last
46
+ * matching rule wins; measured on OpenCode 2.1.2): `*` denied removes every tool, one a plugin registers that akm has
47
+ * never heard of included, and the allows give back `read`, `glob` and `grep` and, when the akm plugin is installed,
48
+ * `akm_search`, `akm_show` and `akm_curate`. Nothing else is allowed. This limits the tools; a plugin's own `setup`
49
+ * and hooks still run.
31
50
  */
32
- const STANDALONE_FLAG = "--standalone";
33
- function standalone(major, flags) {
34
- if (major !== 2)
35
- return [];
36
- const chosen = flags.some((arg) => arg === STANDALONE_FLAG || arg === "--server" || arg.startsWith("--server="));
37
- return chosen ? [] : [STANDALONE_FLAG];
38
- }
51
+ const MODEL_WORK_AGENT_DEFINITION = {
52
+ mode: "primary",
53
+ permissions: [
54
+ { action: "*", resource: "*", effect: "deny" },
55
+ ...["read", "glob", "grep", "akm_search", "akm_show", "akm_curate"].map((action) => ({
56
+ action,
57
+ resource: "*",
58
+ effect: "allow",
59
+ })),
60
+ ],
61
+ };
62
+ const CONFIG_CONTENT_ENV = "OPENCODE_CONFIG_CONTENT";
39
63
  /**
40
- * The flags before the `--` separator of an ordinary dispatch: the engine's
41
- * `args` (without any `--model` when the request names one), then `--agent`
42
- * and `--model`. Both majors spell these the same way.
64
+ * The inline config model work runs with: the user's own `OPENCODE_CONFIG_CONTENT` as it is, with akm's agent set on
65
+ * `agents.akm-model-work`, the one key akm's definition wins. OpenCode 2 reads that native `agents` map over the
66
+ * legacy `agent` one, so a same-named entry the user keeps in `agent` is left out rather than left to conflict. The
67
+ * child's value is built from the parent's, so a provider, model or key the user keeps only there stays. It is read as
68
+ * OpenCode reads it, as JSONC (comments and trailing commas), and written back as JSON; content that reads only once
69
+ * its `{env:NAME}` references are replaced (one written outside a string) is read the way OpenCode replaces them
70
+ * ({@link withEnvReferences}). Content that is not valid JSONC holding an object either way is left out, with one
71
+ * warning.
43
72
  */
44
- function ordinaryFlags(profile, req) {
45
- const args = req.model ? [] : [...profile.args];
46
- if (req.model) {
47
- for (let index = 0; index < profile.args.length; index += 1) {
48
- const arg = profile.args[index];
49
- if (arg === undefined)
50
- continue;
51
- if (arg === "--model") {
52
- index += 1;
53
- }
54
- else if (!arg.startsWith("--model=")) {
55
- args.push(arg);
56
- }
57
- }
73
+ function modelWorkConfig() {
74
+ const content = process.env[CONFIG_CONTENT_ENV]?.trim();
75
+ const user = content ? userConfig(content) : undefined;
76
+ if (content && !user) {
77
+ warnOnce("opencode-config-content", `${CONFIG_CONTENT_ENV} is not valid JSONC holding an object, so OpenCode model work runs without it.`);
78
+ }
79
+ const config = {
80
+ ...user,
81
+ agents: { ...asRecord(user?.agents), [MODEL_WORK_AGENT]: MODEL_WORK_AGENT_DEFINITION },
82
+ };
83
+ const legacy = asRecord(user?.agent);
84
+ if (legacy && Object.hasOwn(legacy, MODEL_WORK_AGENT)) {
85
+ const { [MODEL_WORK_AGENT]: _replaced, ...others } = legacy;
86
+ config.agent = others;
58
87
  }
59
- if (req.agent) {
60
- args.push("--agent", req.agent);
88
+ return JSON.stringify(config);
89
+ }
90
+ function userConfig(content) {
91
+ return jsoncObject(content) ?? jsoncObject(withEnvReferences(content));
92
+ }
93
+ function jsoncObject(content) {
94
+ try {
95
+ return asRecord(parseJsonc(content));
61
96
  }
62
- if (req.model) {
63
- args.push("--model", resolveDispatchModel(req, profile, "opencode"));
97
+ catch {
98
+ return undefined;
64
99
  }
65
- return args;
66
100
  }
67
101
  /**
68
- * OpenCode builder: `opencode run [--standalone] [--agent <name>] [--model <m>] -- "<prompt>"`
69
- * (`--standalone` on OpenCode 2 only).
70
- *
71
- * `opencode run` has no system-prompt option (1.18.25 prints its usage and
72
- * exits 1 on `--system-prompt`), so the shared lowerer composes a persona
73
- * into the prompt.
74
- *
75
- * Tool policy is omitted: opencode manages tool access through its own agent
76
- * config files, not via CLI flags. The one exception is the model-work tool
77
- * policy: the builder injects its confined agent through
78
- * `OPENCODE_CONFIG_CONTENT` and selects it with `--agent`. That command is
79
- * akm's own: the engine's `args` are left out, because one such as `--attach`
80
- * or `--dir` would move the run out of the injected config or the scratch
81
- * working directory. Only the model they name is kept.
82
- *
83
- * Model work's agent carries the request's inference options
84
- * (`./model-config.ts`). Any other dispatch injects nothing and carries none, so
85
- * the model's own opencode config applies: set inference there.
102
+ * `{env:NAME}` replaced as OpenCode replaces it in this variable before it parses it (`ConfigVariable.substitute`):
103
+ * by the variable's value, or nothing when it is unset or empty, as written where the result reads as JSONC, else
104
+ * escaped as the inside of a JSON string. A `{file:path}` is left for the OpenCode akm runs, which replaces it against
105
+ * its own directory, as it would in-process.
86
106
  */
107
+ function withEnvReferences(content) {
108
+ const replaced = (escaped) => content.replace(/\{env:([^}]+)\}/g, (_, name) => {
109
+ const value = process.env[name] || "";
110
+ return escaped ? JSON.stringify(value).slice(1, -1) : value;
111
+ });
112
+ const raw = replaced(false);
113
+ try {
114
+ parseJsonc(raw);
115
+ return raw;
116
+ }
117
+ catch {
118
+ return replaced(true);
119
+ }
120
+ }
121
+ const NO_FREE_MODELS = { OPENCODE_DISABLE_FREE_MODELS: "1" };
87
122
  export const opencodeBuilder = {
88
- platform: "opencode",
89
- personaChannel: "prompt",
90
- lower: createAgentRequestLowerer({
91
- adapter: "opencode",
92
- personaChannel: "prompt",
93
- tools: "none",
94
- inference: MODEL_WORK_AGENT_INFERENCE,
95
- }),
96
- build(profile, req) {
97
- const major = detectOpencodeMajor(profile.bin).major;
98
- if (req.modelWork) {
99
- const model = req.model ?? modelFromArgs(profile.args);
100
- const { agentOptions } = opencodeInferenceConfig(req.inference, true);
101
- return {
102
- argv: [
103
- profile.bin,
104
- "run",
105
- ...standalone(major, []),
106
- "--agent",
107
- MODEL_WORK_OPENCODE_AGENT,
108
- ...(model ? ["--model", model] : []),
109
- "--",
110
- req.prompt,
111
- ],
112
- env: {
113
- ...modelWorkPluginEnv(),
114
- OPENCODE_CONFIG_CONTENT: JSON.stringify(modelWorkOpencodeConfig(agentOptions)),
115
- },
116
- };
123
+ build({ bin, args }, req) {
124
+ const agent = req.agent ? ["--agent", req.agent] : [];
125
+ const model = req.model ? ["--model", req.model] : [];
126
+ if (req.prompt === undefined) {
127
+ // An interactive launch is the TUI, which `run` (headless) is not.
128
+ const authored = withoutLeading(args, "run");
129
+ return { argv: [bin, ...(req.model ? withoutModelFlag(authored) : authored), ...agent, ...model] };
130
+ }
131
+ if (!req.modelWork) {
132
+ return { argv: [bin, ...(req.model ? withoutModelFlag(args) : args), ...agent, ...model], stdin: req.prompt };
133
+ }
134
+ const oc2 = isOpencode2(bin);
135
+ if (!oc2 && detectOpencodeMajor(bin).reportedMajor === undefined) {
136
+ warnOnce(`opencode-version-unreadable:${bin}`, `Could not read the version of ${bin}, so akm runs its model work as OpenCode 1: no --standalone (an OpenCode 2 would attach to its shared background service) and unrestricted. Check \`${bin} --version\`.`);
137
+ }
138
+ if (!oc2) {
139
+ warnOnce("opencode-1-model-work", "OpenCode 1 cannot restrict its tools, so model work on it runs unrestricted, in a scratch directory. OpenCode 2 limits its tools to reading and searching.");
117
140
  }
118
- const flags = ordinaryFlags(profile, req);
119
- return { argv: [profile.bin, ...flags, ...standalone(major, flags), "--", req.prompt] };
141
+ const named = req.model ?? modelFromArgs(args);
142
+ return {
143
+ argv: [
144
+ bin,
145
+ "run",
146
+ ...(oc2 ? ["--standalone", "--title", "akm", "--agent", MODEL_WORK_AGENT] : []),
147
+ ...(named ? ["--model", named] : []),
148
+ ],
149
+ env: { ...NO_FREE_MODELS, ...(oc2 ? { [CONFIG_CONTENT_ENV]: modelWorkConfig() } : {}) },
150
+ stdin: req.prompt,
151
+ };
120
152
  },
121
153
  };
@@ -1,55 +1,33 @@
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
- /**
5
- * OpenCode harness (#564).
6
- *
7
- * Per-harness barrel that gathers the OpenCode integration surfaces previously
8
- * scattered across the codebase:
9
- * - session-log reader → ./session-log.ts (OpenCodeProvider)
10
- * - agent command builder → ./agent-builder.ts (opencodeBuilder)
11
- * - config importer → ./config-import.ts (openCodeImporter)
12
- *
13
- * It also defines {@link OpencodeHarness}, the {@link AkmHarness} descriptor
14
- * that `HARNESS_REGISTRY` registers.
15
- *
16
- * id normalization: OpenCode's canonical id (`'opencode'`) is also its runtime
17
- * identity and session-log provider name — there is no historical split (unlike
18
- * Claude Code's 'claude' vs 'claude'), so no alias bridge is needed.
19
- */
20
- import { OPENCODE_ENV_PASSTHROUGH } from "../../../core/spawn-env.js";
21
- import { caps } from "../shared.js";
22
- import { BaseHarness } from "../types.js";
23
4
  import { opencodeBuilder } from "./agent-builder.js";
24
- import { openCodeImporter } from "./config-import.js";
25
5
  import { OpenCodeProvider } from "./session-log.js";
6
+ import { isOpencode2, OPENCODE_BIN } from "./version.js";
26
7
  export { opencodeBuilder } from "./agent-builder.js";
27
- export { openCodeImporter } from "./config-import.js";
28
8
  export { OpenCodeProvider } from "./session-log.js";
29
9
  /**
30
10
  * OpenCode.
31
11
  *
32
12
  * Canonical id is `'opencode'`; it has no distinct runtime identity or alias.
33
13
  */
34
- export class OpencodeHarness extends BaseHarness {
14
+ export class OpencodeHarness {
35
15
  id = "opencode";
36
16
  displayName = "OpenCode";
37
17
  // Home-relative config dir scanned by `akm setup` (#567). OpenCode has a
38
18
  // session-log provider, so offering it as a stash source is functional.
39
19
  setupDetectionDir = ".config/opencode";
40
- agentBuilder = opencodeBuilder;
41
- configImporter = openCodeImporter;
42
- profile = { bin: "opencode", args: ["run"], envPassthrough: OPENCODE_ENV_PASSTHROUGH };
20
+ build = opencodeBuilder.build;
21
+ profile = { bin: OPENCODE_BIN, args: ["run"] };
43
22
  // ── Workflow-engine descriptor (plan §"Capability matrix", P2) ────────────
44
23
  // Session-id env marker for run attribution.
45
24
  identityEnv = ["OPENCODE_SESSION_ID"];
46
25
  sessionLogProvider = () => new OpenCodeProvider();
47
- capabilities = caps({
48
- sessionLogs: true,
49
- agentDispatch: true,
50
- detection: true,
51
- modelWork: true,
52
- nativeAgent: true,
53
- configImport: true,
54
- });
26
+ systemPrompt = false;
27
+ nativeAgent = true;
28
+ // Model work has its tools limited to reading and searching on OpenCode 2 only: its CLI takes an agent defined
29
+ // inline for the run (./agent-builder.ts), OpenCode 1's cannot be restricted and runs it unrestricted, with a warning.
30
+ // Lowering asks for the limited run either way; setup asks whether the installed OpenCode can give it.
31
+ confinable = true;
32
+ confinableInstalled = (bin) => isOpencode2(bin);
55
33
  }