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,135 +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 result extractor (P2, plan §"The adapter contract" step 3 /
6
- * §"Structured-output normalization", tier "native-json").
7
- *
8
- * Normalizes one raw {@link AgentRunResult} from a headless
9
- * `openhands --headless --json` run into `{ text, sessionId? }` — the
10
- * {@link AgentResultExtraction} seam. The engine's shared schema-validation /
11
- * retry-until-valid loop runs *after* this; the extractor only strips
12
- * transport framing.
13
- *
14
- * With `--json` OpenHands emits ONE JSON event per stdout line — its
15
- * action/observation event stream, e.g.:
16
- *
17
- * {"id":0,"source":"user","action":"message","args":{"content":"<task>"},"message":"<task>"}
18
- * {"id":1,"source":"agent","action":"run","args":{"command":"ls"},"message":"Running command: ls"}
19
- * {"id":2,"source":"agent","observation":"run","content":"README.md","message":"Command `ls` executed."}
20
- * {"id":3,"source":"agent","action":"message","args":{"content":"<answer>"},"message":"<answer>"}
21
- * {"id":4,"source":"agent","action":"finish","args":{"final_thought":"<answer>","outputs":{}},"message":"..."}
22
- *
23
- * Extraction rules ("parse JSONL final message" per the capability matrix):
24
- * - text: the LAST agent-sourced *message-bearing* event wins. Only two
25
- * event kinds carry the agent's answer: `action:"message"`
26
- * (`args.content`, falling back to the top-level `message` mirror) and
27
- * `action:"finish"` (`args.final_thought`/`args.thought`, falling back to
28
- * `message`). User echoes, observations, and tool actions (`run`, `edit`,
29
- * …, whose `message` is progress noise like "Running command: ls") never
30
- * contribute.
31
- * - sessionId: the FIRST id-bearing event supplies it (`session_id`,
32
- * `sessionId`, `sid`, `conversation_id`), falling back to any sessionId
33
- * the spawn layer already attached. Stored opportunistically on the unit
34
- * row; per the matrix OpenHands resume is workspace-state, so akm never
35
- * depends on it (plan §"Session, MCP, and identity across harnesses").
36
- *
37
- * Also handled, so version churn stays contained in this one file (per the
38
- * adapter contract):
39
- * - a single whole-stdout JSON document (or a spawn-layer `result.parsed`
40
- * value) is interpreted with the same rules;
41
- * - plain text (no `--json`, or an unrecognized envelope) passes through
42
- * trimmed — the engine's embedded-JSON parsing still runs downstream for
43
- * schema units;
44
- * - non-JSON banner lines interleaved in the stream are skipped.
45
- *
46
- * Registered: `openhandsResultExtractor` is `OpenhandsHarness.resultExtractor`
47
- * (`./index.ts`); the engine resolves it via `getHarness()` in
48
- * `workflows/exec/native-executor.ts` to normalize agent-unit stdout before
49
- * schema validation.
50
- */
51
- import { asNonEmptyString, isRecord, tryParseJson } from "../../../core/common.js";
52
- /** Keys that may carry the harness-native session id, in precedence order. */
53
- const SESSION_KEYS = ["session_id", "sessionId", "sid", "conversation_id"];
54
- /**
55
- * Extract the agent's answer text from one parsed OpenHands event, if the
56
- * event is one of the two message-bearing kinds (see module doc). Everything
57
- * else — user echoes, observations, tool actions — yields undefined.
58
- */
59
- function extractAgentText(event) {
60
- // Only agent-authored events count; a missing `source` is tolerated for
61
- // finish/message actions from older serializations, but an explicit
62
- // non-agent source (user echo, environment) never contributes.
63
- if (event.source !== undefined && event.source !== "agent")
64
- return undefined;
65
- if (typeof event.action !== "string")
66
- return undefined;
67
- const args = isRecord(event.args) ? event.args : undefined;
68
- if (event.action === "message") {
69
- return asNonEmptyString(args?.content) ?? asNonEmptyString(event.message);
70
- }
71
- if (event.action === "finish") {
72
- return asNonEmptyString(args?.final_thought) ?? asNonEmptyString(args?.thought) ?? asNonEmptyString(event.message);
73
- }
74
- return undefined;
75
- }
76
- /** Extract a harness-native session id from one parsed JSON value, if any. */
77
- function extractSessionId(event) {
78
- for (const key of SESSION_KEYS) {
79
- const candidate = asNonEmptyString(event[key]);
80
- if (candidate)
81
- return candidate;
82
- }
83
- return undefined;
84
- }
85
- /**
86
- * Normalize a raw openhands run result into `{ text, sessionId? }`.
87
- * See the module doc for the stdout shapes handled.
88
- */
89
- export const openhandsResultExtractor = (result) => {
90
- // The raw result's own sessionId (SDK-style paths) is the fallback; an id
91
- // found in the output stream wins because it is fresher.
92
- const fallbackSessionId = result.sessionId;
93
- const raw = result.stdout.trim();
94
- // Shape 1 — whole stdout is one JSON document (spawn may have pre-parsed it
95
- // when the profile requested parseOutput: "json"). A multi-event JSONL
96
- // stream never parses as a single document, so this cannot shadow shape 2.
97
- const whole = result.parsed !== undefined ? result.parsed : raw.length > 0 ? tryParseJson(raw) : undefined;
98
- if (whole !== undefined) {
99
- if (typeof whole === "string") {
100
- return { text: whole, ...(fallbackSessionId ? { sessionId: fallbackSessionId } : {}) };
101
- }
102
- if (isRecord(whole)) {
103
- const sessionId = extractSessionId(whole) ?? fallbackSessionId;
104
- // Unknown envelope (no agent message): fall back to raw stdout so
105
- // downstream embedded-JSON parsing still has material to work with.
106
- const text = extractAgentText(whole) ?? raw;
107
- return { text, ...(sessionId ? { sessionId } : {}) };
108
- }
109
- }
110
- // Shape 2 — JSONL event stream (`--json`): last message-bearing agent event
111
- // wins; first id-bearing event supplies the session id. Non-JSON banner
112
- // lines are skipped.
113
- let lastText;
114
- let streamSessionId;
115
- let sawJsonLine = false;
116
- for (const line of raw.split("\n")) {
117
- const trimmed = line.trim();
118
- if (trimmed.length === 0)
119
- continue;
120
- const event = tryParseJson(trimmed);
121
- if (event === undefined || !isRecord(event))
122
- continue;
123
- sawJsonLine = true;
124
- streamSessionId ??= extractSessionId(event);
125
- const text = extractAgentText(event);
126
- if (text !== undefined)
127
- lastText = text;
128
- }
129
- if (sawJsonLine) {
130
- const sessionId = streamSessionId ?? fallbackSessionId;
131
- return { text: lastText ?? raw, ...(sessionId ? { sessionId } : {}) };
132
- }
133
- // Shape 3 — plain text passthrough.
134
- return { text: raw, ...(fallbackSessionId ? { sessionId: fallbackSessionId } : {}) };
135
- };
@@ -1,89 +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
- * Pi coding-agent CLI 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 `pi` CLI expects. Per the capability matrix the headless
10
- * invocation is:
11
- *
12
- * pi -p "<prompt>"
13
- *
14
- * with `--mode json` for structured (JSONL) output, `--model <m>` for model
15
- * selection, and `-c`/`-r`/`--session <id>` for resume — not built here
16
- * because `AgentDispatchRequest` carries no session id (akm's
17
- * `workflow_run_units` is the durable resume source of truth).
18
- *
19
- * Platform-specific mapping decisions (all localized here, per the adapter
20
- * contract):
21
- *
22
- * - **prompt** — `-p` is Pi's non-interactive print mode (same convention as
23
- * Claude Code's `--print`); the prompt is the trailing positional message.
24
- * The `--` end-of-options separator precedes it, mirroring the claude/codex
25
- * builders, so a prompt whose text begins with `-`/`--` can never be parsed
26
- * as flags.
27
- * - **systemPrompt** — passed via `--system-prompt` (Pi follows the Claude
28
- * Code flag conventions).
29
- * - **schema** — the matrix places Pi in the "via prompt+validate" tier (no
30
- * native `--output-schema` equivalent, unlike Codex), so the JSON Schema
31
- * reaches it as the instruction the shared request lowering appends to the
32
- * prompt, and `--mode json` is emitted so stdout is the documented JSONL
33
- * event stream that `./result-extractor.ts` normalizes. The engine's shared
34
- * retry-until-valid loop performs the actual validation. Without a schema
35
- * the argv matches the matrix's bare headless shape (`pi -p "<p>"`) and the
36
- * extractor's plain-text path applies.
37
- * - **tools** — deliberately unconsumed. Pi manages tool access through its
38
- * own config/extension system (the matrix lists MCP as "extensions only");
39
- * there is no documented per-tool allowlist flag, and inventing one would
40
- * produce a silently broken command. A restrictive policy is therefore
41
- * dropped rather than approximated — never silently widened.
42
- * - **inference** — not translated: the shared lowering reports each field of
43
- * the request's inference as untranslated.
44
- *
45
- * Registered: `piBuilder` is `PiHarness.agentBuilder` (`./index.ts`), one of
46
- * the ten harnesses `HARNESS_REGISTRY` constructs (`harnesses/index.ts`);
47
- * `agent/builders.ts` derives `BUILTIN_BUILDERS` from that registry, so this
48
- * builder is reachable under the `"pi"` platform name without any further
49
- * wiring. The `PI_SESSION_ID` identity-env marker is declared alongside it
50
- * (`./index.ts`).
51
- */
52
- import { resolveDispatchModel } from "../../agent/builder-shared.js";
53
- import { createAgentRequestLowerer } from "../../agent/request-lowering.js";
54
- /** Canonical harness/platform id used for model-alias resolution. */
55
- export const PI_PLATFORM = "pi";
56
- /**
57
- * Pi builder.
58
- * Command shape:
59
- * pi [--system-prompt "..."] [--model <m>] [--mode json] -p -- "<prompt>"
60
- */
61
- export const piBuilder = {
62
- platform: PI_PLATFORM,
63
- personaChannel: "native",
64
- lower: createAgentRequestLowerer({
65
- adapter: PI_PLATFORM,
66
- personaChannel: "native",
67
- tools: "none",
68
- }),
69
- build(profile, req) {
70
- const args = [...profile.args];
71
- if (req.systemPrompt) {
72
- args.push("--system-prompt", req.systemPrompt);
73
- }
74
- if (req.model) {
75
- const resolved = resolveDispatchModel(req, profile, PI_PLATFORM);
76
- args.push("--model", resolved);
77
- }
78
- if (req.schema) {
79
- // Structured unit: JSONL event stream on stdout — the pi result
80
- // extractor's documented input (prompt+validate tier).
81
- args.push("--mode", "json");
82
- }
83
- // -p = non-interactive print mode; prompt is the trailing positional.
84
- args.push("-p");
85
- args.push("--");
86
- args.push(req.prompt);
87
- return { argv: [profile.bin, ...args] };
88
- },
89
- };
@@ -1,168 +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
- * Pi coding-agent CLI result extractor (P2, plan §"The adapter contract"
6
- * step 3 / §"Structured-output normalization", tier "native-json").
7
- *
8
- * Normalizes one raw {@link AgentRunResult} from a headless `pi` run into
9
- * `{ text, sessionId? }` — the {@link AgentResultExtraction} seam. The
10
- * engine's shared schema-validation / retry-until-valid loop runs *after*
11
- * this; the extractor only strips transport framing.
12
- *
13
- * With `--mode json` (the capability matrix's structured mode) Pi emits ONE
14
- * JSON event per stdout line — the agent-session event stream, e.g.:
15
- *
16
- * {"type":"session_start","session_id":"<id>"}
17
- * {"type":"agent_start"}
18
- * {"type":"message_start","message":{"role":"assistant","content":[]}}
19
- * {"type":"message_end","message":{"role":"assistant","content":[{"type":"text","text":"<text>"}]}}
20
- * {"type":"agent_end","messages":[{"role":"assistant","content":[...]}]}
21
- *
22
- * Extraction rules:
23
- * - text: the LAST assistant text-bearing event wins (`message_end` bodies;
24
- * an `agent_end` transcript's final assistant message; tolerant flat
25
- * `role:"assistant"` events). User-role echoes / tool events never
26
- * contribute. Assistant content blocks are flattened; non-text blocks
27
- * (thinking, tool use) are skipped.
28
- * - sessionId: the FIRST session-id-bearing event supplies it (snake_case /
29
- * camelCase variants, plus `id` on `session*`-typed events), falling back
30
- * to any sessionId the spawn layer already attached. Stored
31
- * opportunistically on the unit row for `--session <id>` resume; akm
32
- * never depends on it (plan §"Session, MCP, and identity").
33
- *
34
- * Also handled, so version churn stays contained in this one file (per the
35
- * adapter contract):
36
- * - a single whole-stdout JSON document (or a spawn-layer `result.parsed`
37
- * value) is interpreted with the same rules;
38
- * - plain text (no `--mode json`, or an unrecognized envelope) passes
39
- * through trimmed — the engine's embedded-JSON parsing still runs
40
- * downstream for schema units;
41
- * - non-JSON banner lines interleaved in the stream are skipped.
42
- *
43
- * Registered: `piResultExtractor` is `PiHarness.resultExtractor`
44
- * (`./index.ts`); the engine resolves it via `getHarness()` in
45
- * `workflows/exec/native-executor.ts` to normalize agent-unit stdout before
46
- * schema validation.
47
- */
48
- import { isRecord, tryParseJson } from "../../../core/common.js";
49
- /** Keys that may carry the harness-native session id, in precedence order. */
50
- const SESSION_KEYS = ["session_id", "sessionId", "session"];
51
- /**
52
- * Coerce a candidate value into text. Handles the shapes Pi nests assistant
53
- * answers in: bare strings, arrays of content blocks, and `{content|text}`
54
- * wrappers. Blocks without a `content`/`text` string (thinking, tool-use)
55
- * contribute nothing. Depth-bounded: JSON.parse output is acyclic, but
56
- * nesting is capped anyway so a pathological envelope cannot recurse
57
- * unboundedly.
58
- */
59
- function textOf(value, depth = 0) {
60
- if (depth > 4)
61
- return undefined;
62
- if (typeof value === "string")
63
- return value;
64
- if (Array.isArray(value)) {
65
- const parts = [];
66
- for (const block of value) {
67
- const t = textOf(block, depth + 1);
68
- if (t)
69
- parts.push(t);
70
- }
71
- return parts.length > 0 ? parts.join("\n") : undefined;
72
- }
73
- if (isRecord(value)) {
74
- return textOf(value.content ?? value.text, depth + 1);
75
- }
76
- return undefined;
77
- }
78
- /** Extract the text of one assistant-authored message record, if it is one. */
79
- function assistantMessageText(message) {
80
- if (!isRecord(message) || message.role !== "assistant")
81
- return undefined;
82
- return textOf(message.content ?? message.text);
83
- }
84
- /**
85
- * Extract assistant text from one parsed JSON event/value:
86
- * `message` envelopes (`message_start`/`message_end`), `messages` transcripts
87
- * (`agent_end` — last assistant entry wins), and tolerant flat
88
- * `role:"assistant"` events.
89
- */
90
- function extractAssistantText(event) {
91
- const fromEnvelope = assistantMessageText(event.message);
92
- if (fromEnvelope !== undefined)
93
- return fromEnvelope;
94
- const transcript = event.messages;
95
- if (Array.isArray(transcript)) {
96
- for (let i = transcript.length - 1; i >= 0; i--) {
97
- const text = assistantMessageText(transcript[i]);
98
- if (text !== undefined)
99
- return text;
100
- }
101
- return undefined;
102
- }
103
- return assistantMessageText(event);
104
- }
105
- /** Extract a harness-native session id from one parsed JSON value, if any. */
106
- function extractSessionId(event) {
107
- for (const key of SESSION_KEYS) {
108
- const candidate = event[key];
109
- if (typeof candidate === "string" && candidate.length > 0)
110
- return candidate;
111
- }
112
- // Session-lifecycle events may carry the id under a bare `id` key.
113
- if (typeof event.type === "string" && event.type.startsWith("session") && typeof event.id === "string" && event.id) {
114
- return event.id;
115
- }
116
- return undefined;
117
- }
118
- /**
119
- * Normalize a raw pi run result into `{ text, sessionId? }`.
120
- * See the module doc for the stdout shapes handled.
121
- */
122
- export const piResultExtractor = (result) => {
123
- // The raw result's own sessionId (SDK-style paths) is the fallback; an id
124
- // found in the output stream wins because it is fresher.
125
- const fallbackSessionId = result.sessionId;
126
- const raw = result.stdout.trim();
127
- // Shape 1 — whole stdout is one JSON document (spawn may have pre-parsed it
128
- // when the profile requested parseOutput: "json"). A multi-event JSONL
129
- // stream never parses as a single document, so this cannot shadow shape 2.
130
- const whole = result.parsed !== undefined ? result.parsed : raw.length > 0 ? tryParseJson(raw) : undefined;
131
- if (whole !== undefined) {
132
- if (typeof whole === "string") {
133
- return { text: whole, ...(fallbackSessionId ? { sessionId: fallbackSessionId } : {}) };
134
- }
135
- if (isRecord(whole)) {
136
- const sessionId = extractSessionId(whole) ?? fallbackSessionId;
137
- // Unknown envelope (no assistant text): fall back to raw stdout so
138
- // downstream embedded-JSON parsing still has material to work with.
139
- const text = extractAssistantText(whole) ?? textOf(whole) ?? raw;
140
- return { text, ...(sessionId ? { sessionId } : {}) };
141
- }
142
- }
143
- // Shape 2 — JSONL event stream (`--mode json`): last assistant text-bearing
144
- // event wins; first session-id-bearing event supplies the id. Non-JSON
145
- // banner lines are skipped.
146
- let lastText;
147
- let streamSessionId;
148
- let sawJsonLine = false;
149
- for (const line of raw.split("\n")) {
150
- const trimmed = line.trim();
151
- if (trimmed.length === 0)
152
- continue;
153
- const event = tryParseJson(trimmed);
154
- if (event === undefined || !isRecord(event))
155
- continue;
156
- sawJsonLine = true;
157
- streamSessionId ??= extractSessionId(event);
158
- const text = extractAssistantText(event);
159
- if (text !== undefined && text.length > 0)
160
- lastText = text;
161
- }
162
- if (sawJsonLine) {
163
- const sessionId = streamSessionId ?? fallbackSessionId;
164
- return { text: lastText ?? raw, ...(sessionId ? { sessionId } : {}) };
165
- }
166
- // Shape 3 — plain text passthrough.
167
- return { text: raw, ...(fallbackSessionId ? { sessionId: fallbackSessionId } : {}) };
168
- };
@@ -1,18 +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
- export function caps(c) {
5
- return {
6
- sessionLogs: false,
7
- agentDispatch: false,
8
- detection: false,
9
- configImport: false,
10
- modelWork: false,
11
- nativeAgent: false,
12
- ...c,
13
- };
14
- }
15
- /** Home directory used for filesystem-only harness config detection. */
16
- export function homeDir() {
17
- return process.env.HOME ?? process.env.USERPROFILE ?? "";
18
- }
@@ -1,55 +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
- * Type-guard narrowing a harness to {@link SessionLogCapableHarness}.
6
- *
7
- * `Array.prototype.filter`'s type-predicate overload requires the predicate's
8
- * inferred type to extend the array's element type — a plain
9
- * `(h: AkmHarness) => h is SessionLogCapableHarness` predicate fails that
10
- * constraint against `HARNESS_REGISTRY`'s element type (the union of the ten
11
- * concrete harness classes, each with literal `id`s narrower than
12
- * `SessionLogCapableHarness`'s `id: string`), so `.filter` would silently fall
13
- * back to its non-narrowing overload. Generic over the input `H` and
14
- * intersecting it into the predicate (`H & SessionLogCapableHarness`) keeps
15
- * the result always a subtype of `H`, so the constraint holds regardless of
16
- * what concrete harness type(s) `H` resolves to — this is what lets
17
- * `HARNESS_REGISTRY.filter(isSessionLogHarness)` (in `./index.ts`) actually
18
- * narrow to a type where `sessionLogProvider` is known-present, retiring the
19
- * load-time throw that used to guard this in `session-logs/index.ts`.
20
- */
21
- export function isSessionLogHarness(h) {
22
- return h.capabilities.sessionLogs;
23
- }
24
- /**
25
- * Shared base for harness descriptors (#566).
26
- *
27
- * Provides shared optional descriptor fields for concrete harnesses.
28
- *
29
- * Deliberately implements {@link AkmHarnessCommon}, NOT the discriminated
30
- * `AkmHarness` union (WI-9.7, H1): `AkmHarnessCommon` excludes `capabilities`
31
- * and `sessionLogProvider`, the two fields whose pairing the union enforces.
32
- * A base class shared by both branches cannot itself satisfy either specific
33
- * union member — `capabilities` stays declared `abstract` at the (widened)
34
- * `HarnessCapabilities` union type here, and each subclass narrows it to a
35
- * literal `sessionLogs: true`/`false` variant via `caps({...})`.
36
- * `sessionLogProvider` is intentionally NOT declared here at all (not even
37
- * optional): the 7 non-session-log subclasses simply never declare it, which
38
- * satisfies `NonSessionLogHarness`'s `sessionLogProvider?: undefined` (an
39
- * absent optional property satisfies an `undefined`-typed optional); had this
40
- * class declared it as `sessionLogProvider?: () => SessionLogHarness`
41
- * instead, every non-session-log subclass would inherit that (function |
42
- * undefined) type and fail to satisfy `NonSessionLogHarness` at the
43
- * `HARNESS_REGISTRY` `satisfies` check. The three session-log subclasses
44
- * (Claude, Codex, OpenCode) declare their own required `sessionLogProvider`.
45
- */
46
- export class BaseHarness {
47
- setupDetectionDir;
48
- agentBuilder;
49
- profile;
50
- configImporter;
51
- executionLowerer;
52
- identityEnv;
53
- presenceEnv;
54
- resultExtractor;
55
- }
@@ -1,115 +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
- import { DEFAULT_LLM_TIMEOUT_MS } from "../integrations/agent/config.js";
5
- /**
6
- * For each feature key, return the effective enabled state by reading the
7
- * 0.9.0 config shape.
8
- */
9
- const FEATURE_LOCATION = {
10
- memory_inference: (cfg) => cfg.index?.memory?.enabled ?? true,
11
- // #951: a real implementation of the dead `curate_rerank` key removed in
12
- // 0.8.0. Off by default — it requires a `search.curateRerank.endpoint` a
13
- // caller must explicitly configure.
14
- curate_rerank: (cfg) => Boolean(cfg.search?.curateRerank?.enabled),
15
- // Always on at the LLM-wrapper level. Enablement is decided ONCE at the
16
- // extract entry point (`akmExtract`): the `extract.enabled` process toggle
17
- // gates extract as a STAGE of `akm improve` (the active improve strategy, per
18
- // #593/#594), while an explicit `akm extract` command always runs. Gating the
19
- // inner LLM calls on `default.processes.extract.enabled` here was a footgun —
20
- // dropping extract from the daily improve strategy silently disabled the
21
- // standalone `akm extract` command. (cfg unused — kept for resolver signature.)
22
- session_extraction: (_cfg) => true,
23
- };
24
- /**
25
- * Pure predicate: is the named feature gate enabled in `config`?
26
- *
27
- * Reads from the unified 0.9.0 config shape.
28
- */
29
- export function isLlmFeatureEnabled(config, feature, improveEnabled) {
30
- if (!config)
31
- return false;
32
- // Improve resolves enablement from its selected strategy and passes the
33
- // decision in. This module does not own a second improve config lookup.
34
- if (improveEnabled !== undefined)
35
- return improveEnabled;
36
- const resolver = FEATURE_LOCATION[feature];
37
- if (!resolver)
38
- return false;
39
- return resolver(config);
40
- }
41
- /**
42
- * Run `fn()` only if `isLlmFeatureEnabled(config, feature)` is `true`. On
43
- * disablement, throw, or timeout, return `fallback` (or — if it is a
44
- * thunk — the value produced by calling it). The timeout aborts the signal
45
- * `fn` receives, so the work it started stops too.
46
- */
47
- export async function tryLlmFeature(feature, config, fn, fallback, opts) {
48
- const resolveFallback = async () => typeof fallback === "function" ? await fallback() : fallback;
49
- if (!isLlmFeatureEnabled(config, feature, opts?.enabled)) {
50
- opts?.onFallback?.({ feature, reason: "disabled" });
51
- return resolveFallback();
52
- }
53
- const timeoutMs = opts && Object.hasOwn(opts, "timeoutMs") ? (opts.timeoutMs ?? null) : DEFAULT_LLM_TIMEOUT_MS;
54
- try {
55
- if (timeoutMs === null || timeoutMs <= 0) {
56
- return await fn(new AbortController().signal);
57
- }
58
- return await runWithTimeout(fn, timeoutMs, feature);
59
- }
60
- catch (err) {
61
- const error = err instanceof Error ? err : new Error(String(err));
62
- const reason = error instanceof LlmFeatureTimeoutError ? "timeout" : "error";
63
- opts?.onFallback?.({ feature, reason, error });
64
- return resolveFallback();
65
- }
66
- }
67
- /**
68
- * Section-agnostic process gate that maps process identifiers to their current
69
- * config locations.
70
- *
71
- * For unknown (section, processName) pairs the result is `false`.
72
- */
73
- export function isProcessEnabled(section, processName, config) {
74
- if (!config)
75
- return false;
76
- // Index passes are first-class 0.9 entries.
77
- if (section === "index") {
78
- if (processName === "memory_inference" || processName === "memoryInference") {
79
- return isLlmFeatureEnabled(config, "memory_inference");
80
- }
81
- }
82
- return false;
83
- }
84
- /** Specific error class so call sites and the wrapper can tell timeouts apart from generic throws. */
85
- export class LlmFeatureTimeoutError extends Error {
86
- feature;
87
- timeoutMs;
88
- constructor(feature, timeoutMs) {
89
- super(`LLM feature "${feature}" timed out after ${timeoutMs}ms.`);
90
- this.name = "LlmFeatureTimeoutError";
91
- this.feature = feature;
92
- this.timeoutMs = timeoutMs;
93
- Object.setPrototypeOf(this, new.target.prototype);
94
- }
95
- }
96
- async function runWithTimeout(fn, timeoutMs, feature) {
97
- let timer;
98
- const controller = new AbortController();
99
- try {
100
- return await new Promise((resolve, reject) => {
101
- timer = setTimeout(() => {
102
- const timedOut = new LlmFeatureTimeoutError(feature, timeoutMs);
103
- controller.abort(timedOut);
104
- reject(timedOut);
105
- }, timeoutMs);
106
- Promise.resolve()
107
- .then(() => fn(controller.signal))
108
- .then(resolve, reject);
109
- });
110
- }
111
- finally {
112
- if (timer)
113
- clearTimeout(timer);
114
- }
115
- }
@@ -1,16 +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
- export const modelsListShapes = [
5
- {
6
- command: "models-list",
7
- handler: (result) => {
8
- const r = result;
9
- return {
10
- ...r,
11
- shape: r.shape ?? "models-list",
12
- schemaVersion: r.schemaVersion ?? 1,
13
- };
14
- },
15
- },
16
- ];
@@ -1,10 +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
- import { shapeRegistrySearchOutput } from "./helpers.js";
5
- export const registrySearchShapes = [
6
- {
7
- command: "registry-search",
8
- handler: (result, detail) => shapeRegistrySearchOutput(result, detail),
9
- },
10
- ];