akm-cli 0.9.0-rc.0 → 0.9.0-rc.13

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 (598) hide show
  1. package/CHANGELOG.md +1283 -22
  2. package/README.md +62 -37
  3. package/SECURITY.md +46 -31
  4. package/dist/akm +162 -38
  5. package/dist/akm-migrate +44 -0
  6. package/dist/assets/backends/schtasks-template.xml +2 -1
  7. package/dist/assets/hints/cli-hints-full.md +268 -118
  8. package/dist/assets/hints/cli-hints-short.md +87 -24
  9. package/dist/assets/{profiles → improve-strategies}/catchup.json +3 -1
  10. package/dist/assets/{profiles → improve-strategies}/consolidate.json +3 -1
  11. package/dist/assets/{profiles → improve-strategies}/default.json +6 -7
  12. package/dist/assets/improve-strategies/frequent.json +15 -0
  13. package/dist/assets/{profiles → improve-strategies}/graph-refresh.json +4 -2
  14. package/dist/assets/{profiles → improve-strategies}/memory-focus.json +4 -1
  15. package/dist/assets/{profiles → improve-strategies}/proactive-maintenance.json +5 -5
  16. package/dist/assets/{profiles → improve-strategies}/quick.json +4 -2
  17. package/dist/assets/improve-strategies/reflect-distill.json +30 -0
  18. package/dist/assets/{profiles → improve-strategies}/thorough.json +1 -1
  19. package/dist/assets/prompts/consolidate-system.md +5 -5
  20. package/dist/assets/prompts/extract-session.md +2 -6
  21. package/dist/assets/prompts/memory-infer-user.md +2 -3
  22. package/dist/assets/prompts/reflect-llm-framed-contract.md +11 -0
  23. package/dist/assets/prompts/reflect-llm-schema-contract.md +3 -0
  24. package/dist/assets/prompts/reflect-output-repair.md +3 -0
  25. package/dist/assets/prompts/workflow-unit-preamble.md +26 -0
  26. package/dist/assets/stash-skeleton/README.md +38 -10
  27. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
  28. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
  29. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
  30. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
  38. package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
  39. package/dist/assets/tasks/core/extract.yml +3 -2
  40. package/dist/assets/tasks/core/improve.yml +2 -1
  41. package/dist/assets/tasks/core/index-refresh.yml +1 -0
  42. package/dist/assets/tasks/core/sync.yml +1 -0
  43. package/dist/assets/tasks/core/version-check.yml +2 -1
  44. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  45. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  46. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  47. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  48. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  49. package/dist/assets/templates/html/health.html +5 -4
  50. package/dist/assets/workflows/workflow-template.md +31 -15
  51. package/dist/cli/invocation.js +279 -0
  52. package/dist/cli/parse-args.js +5 -90
  53. package/dist/cli/retired-commands.js +78 -0
  54. package/dist/cli/shared.js +158 -48
  55. package/dist/cli-node.mjs +2 -1
  56. package/dist/cli.js +747 -293
  57. package/dist/commands/agent/agent-dispatch.js +19 -18
  58. package/dist/commands/agent/agent-support.js +0 -24
  59. package/dist/commands/agent/contribute-cli.js +43 -97
  60. package/dist/commands/completions.js +80 -23
  61. package/dist/commands/config-cli.js +44 -281
  62. package/dist/commands/env/env-binding.js +99 -0
  63. package/dist/commands/env/env-cli.js +84 -224
  64. package/dist/commands/env/env.js +12 -163
  65. package/dist/commands/env/marker-path.js +6 -0
  66. package/dist/commands/env/secret-cli.js +45 -61
  67. package/dist/commands/env/secret.js +32 -62
  68. package/dist/commands/feedback-cli.js +179 -85
  69. package/dist/commands/health/accept-rate.js +58 -0
  70. package/dist/commands/health/advisories.js +7 -8
  71. package/dist/commands/health/checks.js +279 -94
  72. package/dist/commands/health/html-report.js +197 -578
  73. package/dist/commands/health/improve-metrics.js +277 -246
  74. package/dist/commands/health/llm-usage.js +19 -19
  75. package/dist/commands/health/md-report.js +16 -7
  76. package/dist/commands/health/metrics.js +67 -32
  77. package/dist/commands/health/renderers.js +47 -0
  78. package/dist/commands/health/report-view-model.js +508 -0
  79. package/dist/commands/health/stash-exposure.js +1 -1
  80. package/dist/commands/health/surfaces.js +16 -56
  81. package/dist/commands/health/task-runs.js +3 -67
  82. package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
  83. package/dist/commands/health/types-improve.js +29 -0
  84. package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
  85. package/dist/commands/health/types-result.js +7 -0
  86. package/dist/commands/health/types-runs.js +4 -0
  87. package/dist/commands/health/types-session-log.js +4 -0
  88. package/dist/commands/health/types-windows.js +4 -0
  89. package/dist/commands/health/types.js +26 -21
  90. package/dist/commands/health/windows.js +2 -3
  91. package/dist/commands/health.js +296 -167
  92. package/dist/commands/improve/anti-collapse.js +5 -5
  93. package/dist/commands/improve/autonomy-gate.js +68 -0
  94. package/dist/commands/improve/collapse-detector.js +65 -52
  95. package/dist/commands/improve/consolidate/chunking.js +9 -7
  96. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  97. package/dist/commands/improve/consolidate/merge.js +4 -0
  98. package/dist/commands/improve/consolidate.js +454 -1354
  99. package/dist/commands/improve/content-hash.js +39 -0
  100. package/dist/commands/improve/distill/content-repair.js +4 -10
  101. package/dist/commands/improve/distill/promote-memory.js +89 -64
  102. package/dist/commands/improve/distill/quality-gate.js +118 -42
  103. package/dist/commands/improve/distill-guards.js +1 -1
  104. package/dist/commands/improve/distill-promotion-policy.js +33 -888
  105. package/dist/commands/improve/distill.js +607 -363
  106. package/dist/commands/improve/eligibility.js +165 -79
  107. package/dist/commands/improve/extract-cli.js +35 -126
  108. package/dist/commands/improve/extract-prompt.js +6 -35
  109. package/dist/commands/improve/extract.js +640 -391
  110. package/dist/commands/improve/feedback-valence.js +2 -12
  111. package/dist/commands/improve/improve-cli.js +134 -135
  112. package/dist/commands/improve/improve-result-file.js +30 -50
  113. package/dist/commands/improve/improve-run-types.js +4 -0
  114. package/dist/commands/improve/improve-strategies.js +135 -0
  115. package/dist/commands/improve/improve.js +904 -701
  116. package/dist/commands/improve/locks.js +64 -111
  117. package/dist/commands/improve/loop-stages.js +1110 -923
  118. package/dist/commands/improve/memory/derived-ref.js +124 -0
  119. package/dist/commands/improve/memory/memory-belief.js +79 -7
  120. package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
  121. package/dist/commands/improve/memory/memory-improve.js +25 -37
  122. package/dist/commands/improve/outcome-loop.js +25 -88
  123. package/dist/commands/improve/preparation.js +1034 -813
  124. package/dist/commands/improve/proactive-maintenance.js +34 -9
  125. package/dist/commands/improve/proposal-envelope.js +31 -0
  126. package/dist/commands/improve/reflect.js +983 -794
  127. package/dist/commands/improve/run-context.js +119 -0
  128. package/dist/commands/improve/salience.js +24 -127
  129. package/dist/commands/improve/session-asset.js +7 -3
  130. package/dist/commands/improve/shared.js +14 -34
  131. package/dist/commands/improve/source-identity.js +28 -0
  132. package/dist/commands/improve/triage.js +20 -17
  133. package/dist/commands/lint/base-linter.js +340 -313
  134. package/dist/commands/lint/env-key-rules.js +31 -47
  135. package/dist/commands/lint/index.js +185 -30
  136. package/dist/commands/{events.js → log.js} +28 -38
  137. package/dist/commands/migrate-cli.js +54 -0
  138. package/dist/commands/migration-tool.js +55 -0
  139. package/dist/commands/observability-cli.js +70 -208
  140. package/dist/commands/proposal/diff-format.js +50 -0
  141. package/dist/commands/proposal/drain-policies.js +0 -6
  142. package/dist/commands/proposal/drain.js +91 -40
  143. package/dist/commands/proposal/proposal-cli.js +134 -132
  144. package/dist/commands/proposal/proposal-types.js +56 -0
  145. package/dist/commands/proposal/proposal.js +83 -65
  146. package/dist/commands/proposal/propose-cli.js +88 -0
  147. package/dist/commands/proposal/propose.js +105 -88
  148. package/dist/commands/proposal/repository.js +1303 -278
  149. package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
  150. package/dist/commands/proposal/validators/proposal-validators.js +61 -12
  151. package/dist/commands/proposal/validators/proposals.js +6 -8
  152. package/dist/commands/read/curate.js +78 -73
  153. package/dist/commands/read/knowledge.js +510 -13
  154. package/dist/commands/read/registry-search.js +2 -2
  155. package/dist/commands/read/remember-cli.js +84 -15
  156. package/dist/commands/read/search-cli.js +203 -96
  157. package/dist/commands/read/search.js +126 -94
  158. package/dist/commands/read/show.js +226 -250
  159. package/dist/commands/registry-cli.js +34 -60
  160. package/dist/commands/remember.js +18 -57
  161. package/dist/commands/sources/add-cli.js +104 -49
  162. package/dist/commands/sources/bundle-cli.js +166 -0
  163. package/dist/commands/sources/bundle-config-ops.js +63 -0
  164. package/dist/commands/sources/info.js +27 -15
  165. package/dist/commands/sources/init.js +30 -40
  166. package/dist/commands/sources/installed-stashes.js +469 -172
  167. package/dist/commands/sources/migration-help.js +7 -4
  168. package/dist/commands/sources/schema-repair.js +10 -9
  169. package/dist/commands/sources/self-update.js +182 -121
  170. package/dist/commands/sources/source-add.js +169 -178
  171. package/dist/commands/sources/source-clone.js +144 -41
  172. package/dist/commands/sources/source-manage.js +94 -59
  173. package/dist/commands/sources/sources-cli.js +64 -205
  174. package/dist/commands/sources/stash-cli.js +91 -54
  175. package/dist/commands/sources/stash-skeleton.js +1 -1
  176. package/dist/commands/tasks/tasks-cli.js +106 -104
  177. package/dist/commands/tasks/tasks.js +445 -262
  178. package/dist/commands/workflow-cli.js +232 -121
  179. package/dist/core/action-contributors.js +1 -1
  180. package/dist/core/activation-policy.js +49 -0
  181. package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
  182. package/dist/core/adapter/adapters/akm-adapter.js +528 -0
  183. package/dist/core/adapter/adapters/akm-lint.js +392 -0
  184. package/dist/core/adapter/adapters/akm-metadata.js +387 -0
  185. package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
  186. package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
  187. package/dist/core/adapter/adapters/claude-adapter.js +61 -0
  188. package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
  189. package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
  190. package/dist/core/adapter/adapters/index.js +80 -0
  191. package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
  192. package/dist/core/adapter/adapters/okf-adapter.js +391 -0
  193. package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
  194. package/dist/core/adapter/adapters/shared.js +286 -0
  195. package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
  196. package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
  197. package/dist/core/adapter/bundle-adapter.js +4 -0
  198. package/dist/core/adapter/detect-adapter.js +17 -0
  199. package/dist/core/adapter/recognize-match.js +44 -0
  200. package/dist/core/adapter/registry.js +56 -0
  201. package/dist/core/adapter/types.js +4 -0
  202. package/dist/core/asset/akm-markdown.js +30 -0
  203. package/dist/core/asset/asset-placement.js +243 -0
  204. package/dist/core/asset/asset-ref.js +110 -79
  205. package/dist/core/asset/asset-serialize.js +20 -0
  206. package/dist/core/asset/frontmatter.js +28 -12
  207. package/dist/core/asset/markdown.js +40 -51
  208. package/dist/core/asset/resolve-ref.js +274 -0
  209. package/dist/core/asset/stash-meta.js +2 -2
  210. package/dist/core/bundle-id.js +51 -0
  211. package/dist/core/common.js +281 -86
  212. package/dist/core/config/config-io.js +42 -128
  213. package/dist/core/config/config-schema.js +233 -834
  214. package/dist/core/config/config-sources.js +162 -39
  215. package/dist/core/config/config-types.js +16 -11
  216. package/dist/core/config/config-version.js +29 -0
  217. package/dist/core/config/config-walker.js +126 -37
  218. package/dist/core/config/config.js +154 -331
  219. package/dist/core/config/deep-merge.js +41 -0
  220. package/dist/core/config/engine-semantics.js +28 -0
  221. package/dist/core/config/experimental.js +21 -0
  222. package/dist/core/config/schema/embedding.js +38 -0
  223. package/dist/core/config/schema/engines.js +116 -0
  224. package/dist/core/config/schema/experimental.js +47 -0
  225. package/dist/core/config/schema/feedback.js +31 -0
  226. package/dist/core/config/schema/improve-processes.js +389 -0
  227. package/dist/core/config/schema/improve.js +94 -0
  228. package/dist/core/config/schema/index-config.js +176 -0
  229. package/dist/core/config/schema/output.js +18 -0
  230. package/dist/core/config/schema/primitives.js +94 -0
  231. package/dist/core/config/schema/search.js +30 -0
  232. package/dist/core/config/schema/setup.js +18 -0
  233. package/dist/core/config/schema/sources-bundles.js +169 -0
  234. package/dist/core/config/schema/workflow.js +29 -0
  235. package/dist/core/env-secret-ref.js +155 -20
  236. package/dist/core/errors.js +17 -15
  237. package/dist/core/events-types.js +4 -0
  238. package/dist/core/events.js +46 -128
  239. package/dist/core/extra-params.js +62 -0
  240. package/dist/core/file-change.js +17 -0
  241. package/dist/core/file-lock.js +202 -57
  242. package/dist/core/fs-txn.js +392 -0
  243. package/dist/core/git-message.js +59 -0
  244. package/dist/core/improve-result.js +167 -0
  245. package/dist/core/json-schema.js +142 -0
  246. package/dist/core/lesson-lint.js +1 -17
  247. package/dist/core/logs-db.js +1 -1
  248. package/dist/core/maintenance-barrier.js +135 -0
  249. package/dist/core/migration-operation.js +44 -0
  250. package/dist/core/mutation-target.js +78 -0
  251. package/dist/core/paths.js +22 -25
  252. package/dist/core/platform.js +10 -0
  253. package/dist/core/recognition-util.js +128 -0
  254. package/dist/core/redaction.js +392 -0
  255. package/dist/core/standards/resolve-standards-context.js +36 -65
  256. package/dist/core/standards/resolve-stash-standards.js +2 -2
  257. package/dist/core/standards/resolve-type-conventions.js +5 -5
  258. package/dist/core/state/migrations.js +242 -11
  259. package/dist/core/state-db.js +98 -10
  260. package/dist/core/structured.js +1 -1
  261. package/dist/core/subprocess.js +303 -0
  262. package/dist/core/text-truncation.js +9 -5
  263. package/dist/core/time.js +20 -0
  264. package/dist/core/type-presentation.js +130 -0
  265. package/dist/core/warn.js +0 -3
  266. package/dist/core/write-source.js +834 -118
  267. package/dist/indexer/bundle-identity-guard.js +92 -0
  268. package/dist/indexer/db/graph-db.js +1 -25
  269. package/dist/indexer/db/llm-cache.js +1 -1
  270. package/dist/indexer/ensure-index.js +30 -9
  271. package/dist/indexer/graph/graph-boost.js +9 -30
  272. package/dist/indexer/graph/graph-extraction.js +41 -27
  273. package/dist/indexer/graph/graph-types.js +4 -0
  274. package/dist/indexer/index-writer-lock.js +93 -49
  275. package/dist/indexer/index-written-assets.js +100 -53
  276. package/dist/indexer/indexer.js +746 -329
  277. package/dist/indexer/init.js +18 -25
  278. package/dist/indexer/installations.js +142 -0
  279. package/dist/indexer/passes/dir-staleness.js +18 -10
  280. package/dist/indexer/passes/memory-inference.js +25 -15
  281. package/dist/indexer/passes/metadata.js +412 -243
  282. package/dist/indexer/scan/doc-to-entry.js +160 -0
  283. package/dist/indexer/scan/drain-dir.js +134 -0
  284. package/dist/indexer/search/db-search.js +292 -108
  285. package/dist/indexer/search/fts-query.js +64 -0
  286. package/dist/indexer/search/ranking-contributors.js +145 -25
  287. package/dist/indexer/search/ranking-types.js +4 -0
  288. package/dist/indexer/search/ranking.js +28 -71
  289. package/dist/indexer/search/search-attribution.js +67 -0
  290. package/dist/indexer/search/search-fields.js +18 -3
  291. package/dist/indexer/search/search-hit-enrichers.js +30 -40
  292. package/dist/indexer/search/search-source.js +157 -111
  293. package/dist/indexer/search/semantic-status.js +4 -1
  294. package/dist/indexer/usage/usage-events.js +10 -30
  295. package/dist/indexer/walk/file-context.js +3 -45
  296. package/dist/indexer/walk/matchers.js +42 -34
  297. package/dist/indexer/walk/path-resolver.js +11 -5
  298. package/dist/indexer/walk/walker.js +42 -14
  299. package/dist/integrations/agent/builder-shared.js +7 -0
  300. package/dist/integrations/agent/builders.js +5 -56
  301. package/dist/integrations/agent/config.js +3 -143
  302. package/dist/integrations/agent/detect.js +17 -2
  303. package/dist/integrations/agent/engine-resolution.js +231 -0
  304. package/dist/integrations/agent/index.js +1 -2
  305. package/dist/integrations/agent/model-aliases.js +16 -2
  306. package/dist/integrations/agent/profiles.js +36 -62
  307. package/dist/integrations/agent/prompts.js +46 -18
  308. package/dist/integrations/agent/runner-dispatch.js +93 -4
  309. package/dist/integrations/agent/runner.js +76 -208
  310. package/dist/integrations/agent/spawn.js +88 -196
  311. package/dist/integrations/harnesses/aider/agent-builder.js +114 -0
  312. package/dist/integrations/harnesses/aider/index.js +48 -0
  313. package/dist/integrations/harnesses/aider/result-extractor.js +53 -0
  314. package/dist/integrations/harnesses/amazonq/agent-builder.js +147 -0
  315. package/dist/integrations/harnesses/amazonq/index.js +45 -0
  316. package/dist/integrations/harnesses/amazonq/result-extractor.js +48 -0
  317. package/dist/integrations/harnesses/claude/agent-builder.js +46 -8
  318. package/dist/integrations/harnesses/claude/config-import.js +1 -3
  319. package/dist/integrations/harnesses/claude/index.js +24 -35
  320. package/dist/integrations/harnesses/claude/result-extractor.js +52 -0
  321. package/dist/integrations/harnesses/claude/session-log.js +27 -75
  322. package/dist/integrations/harnesses/codex/agent-builder.js +138 -0
  323. package/dist/integrations/harnesses/codex/index.js +52 -0
  324. package/dist/integrations/harnesses/codex/result-extractor.js +73 -0
  325. package/dist/integrations/harnesses/copilot/agent-builder.js +122 -0
  326. package/dist/integrations/harnesses/copilot/index.js +48 -0
  327. package/dist/integrations/harnesses/copilot/result-extractor.js +151 -0
  328. package/dist/integrations/harnesses/gemini/agent-builder.js +120 -0
  329. package/dist/integrations/harnesses/gemini/index.js +48 -0
  330. package/dist/integrations/harnesses/gemini/result-extractor.js +121 -0
  331. package/dist/integrations/harnesses/ids.js +24 -0
  332. package/dist/integrations/harnesses/index.js +54 -34
  333. package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
  334. package/dist/integrations/harnesses/opencode/config-import.js +1 -3
  335. package/dist/integrations/harnesses/opencode/index.js +14 -32
  336. package/dist/integrations/harnesses/opencode/session-log.js +67 -125
  337. package/dist/integrations/harnesses/opencode-sdk/harness.js +51 -0
  338. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +681 -108
  339. package/dist/integrations/harnesses/openhands/agent-builder.js +128 -0
  340. package/dist/integrations/harnesses/openhands/index.js +48 -0
  341. package/dist/integrations/harnesses/openhands/result-extractor.js +103 -0
  342. package/dist/integrations/harnesses/pi/agent-builder.js +97 -0
  343. package/dist/integrations/harnesses/pi/index.js +45 -0
  344. package/dist/integrations/harnesses/pi/result-extractor.js +135 -0
  345. package/dist/integrations/harnesses/shared.js +17 -0
  346. package/dist/integrations/harnesses/types.js +43 -32
  347. package/dist/integrations/lockfile.js +211 -24
  348. package/dist/integrations/session-logs/index.js +36 -39
  349. package/dist/integrations/session-logs/provider-base.js +113 -0
  350. package/dist/llm/client.js +182 -110
  351. package/dist/llm/embedders/deterministic.js +2 -2
  352. package/dist/llm/embedders/remote.js +21 -9
  353. package/dist/llm/feature-gate.js +17 -57
  354. package/dist/llm/graph-extract.js +12 -13
  355. package/dist/llm/index-passes.js +8 -42
  356. package/dist/llm/memory-infer.js +144 -1
  357. package/dist/llm/metadata-enhance.js +45 -30
  358. package/dist/llm/structured-call.js +16 -8
  359. package/dist/llm/usage-persist.js +30 -5
  360. package/dist/llm/usage-telemetry.js +59 -6
  361. package/dist/output/cli-hints.js +1 -2
  362. package/dist/output/command-registry.js +27 -0
  363. package/dist/output/context.js +22 -7
  364. package/dist/output/format-exempt.js +80 -0
  365. package/dist/output/generic-render.js +251 -0
  366. package/dist/output/html-render.js +11 -16
  367. package/dist/output/render-registry.js +57 -0
  368. package/dist/output/renderers.js +14 -279
  369. package/dist/output/shapes/curate.js +10 -1
  370. package/dist/output/shapes/events.js +12 -7
  371. package/dist/output/shapes/helpers.js +58 -84
  372. package/dist/output/shapes/passthrough.js +11 -39
  373. package/dist/output/shapes/proposal/producer.js +15 -7
  374. package/dist/output/shapes/registry.js +12 -6
  375. package/dist/output/shapes.js +0 -9
  376. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  377. package/dist/output/text/bundle-show.js +7 -0
  378. package/dist/output/text/command-format.js +562 -0
  379. package/dist/output/text/env.js +1 -3
  380. package/dist/output/text/events.js +8 -7
  381. package/dist/output/text/helpers.js +15 -1164
  382. package/dist/output/text/proposal/producer.js +4 -2
  383. package/dist/output/text/proposal-format.js +202 -0
  384. package/dist/output/text/registry-commands.js +1 -2
  385. package/dist/output/text/registry.js +12 -6
  386. package/dist/output/text/show-directives.js +117 -0
  387. package/dist/output/text/show-format.js +103 -0
  388. package/dist/output/text/sync.js +5 -0
  389. package/dist/output/text/workflow-format.js +332 -0
  390. package/dist/output/text/workflow.js +3 -2
  391. package/dist/output/text.js +10 -19
  392. package/dist/registry/factory.js +4 -6
  393. package/dist/registry/origin-resolve.js +16 -27
  394. package/dist/registry/providers/skills-sh.js +3 -3
  395. package/dist/registry/providers/static-index.js +15 -25
  396. package/dist/registry/resolve.js +43 -94
  397. package/dist/registry/semver.js +43 -0
  398. package/dist/runtime.js +81 -12
  399. package/dist/scripts/akm-migrate.js +35529 -0
  400. package/dist/setup/detect.js +5 -7
  401. package/dist/setup/detected-engines.js +136 -0
  402. package/dist/setup/engine-config.js +100 -0
  403. package/dist/setup/registry-stash-loader.js +3 -3
  404. package/dist/setup/semantic-assets.js +12 -9
  405. package/dist/setup/setup.js +444 -208
  406. package/dist/setup/steps/connection-shared.js +120 -0
  407. package/dist/setup/steps/connection.js +108 -305
  408. package/dist/setup/steps/platforms.js +13 -12
  409. package/dist/setup/steps/semantic.js +15 -3
  410. package/dist/setup/steps/sources.js +21 -15
  411. package/dist/setup/steps/stashdir.js +6 -4
  412. package/dist/setup/steps/tasks.js +236 -119
  413. package/dist/setup/steps.js +3 -2
  414. package/dist/sources/freshness.js +39 -0
  415. package/dist/sources/provider-factory.js +11 -17
  416. package/dist/sources/providers/filesystem.js +2 -3
  417. package/dist/sources/providers/git-install.js +278 -34
  418. package/dist/sources/providers/git-provider.js +54 -56
  419. package/dist/sources/providers/git-stash.js +420 -91
  420. package/dist/sources/providers/git.js +2 -2
  421. package/dist/sources/providers/npm.js +16 -19
  422. package/dist/sources/providers/provider-utils.js +47 -22
  423. package/dist/sources/providers/sync-from-ref.js +3 -9
  424. package/dist/sources/providers/website.js +2 -2
  425. package/dist/sources/resolve.js +11 -10
  426. package/dist/sources/snapshot-fetchers/types.js +4 -0
  427. package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
  428. package/dist/storage/database.js +60 -4
  429. package/dist/storage/engines/sqlite-migrations.js +156 -5
  430. package/dist/storage/locations.js +1 -2
  431. package/dist/storage/repositories/canaries-repository.js +1 -1
  432. package/dist/storage/repositories/events-repository.js +51 -11
  433. package/dist/storage/repositories/improve-runs-repository.js +6 -32
  434. package/dist/storage/repositories/index-connection.js +79 -0
  435. package/dist/storage/repositories/index-db.js +4 -3
  436. package/dist/storage/repositories/index-entries-repository.js +863 -0
  437. package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
  438. package/dist/storage/repositories/index-entry-types.js +4 -0
  439. package/dist/storage/repositories/index-fts-repository.js +167 -0
  440. package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
  441. package/dist/storage/repositories/index-meta-repository.js +49 -0
  442. package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
  443. package/dist/storage/repositories/index-sql.js +12 -0
  444. package/dist/storage/repositories/index-utility-repository.js +356 -0
  445. package/dist/storage/repositories/index-vec-repository.js +250 -0
  446. package/dist/storage/repositories/outcome-repository.js +119 -0
  447. package/dist/storage/repositories/proposals-repository.js +317 -75
  448. package/dist/storage/repositories/registry-cache.js +1 -1
  449. package/dist/storage/repositories/salience-repository.js +172 -0
  450. package/dist/storage/repositories/task-history-repository.js +110 -3
  451. package/dist/storage/repositories/workflow-runs-repository.js +240 -19
  452. package/dist/tasks/backends/cron.js +169 -46
  453. package/dist/tasks/backends/exec-utils.js +76 -3
  454. package/dist/tasks/backends/index.js +6 -9
  455. package/dist/tasks/backends/launchd.js +292 -55
  456. package/dist/tasks/backends/schtasks.js +557 -70
  457. package/dist/tasks/backends/types.js +4 -0
  458. package/dist/tasks/command-executable.js +93 -0
  459. package/dist/tasks/embedded.js +56 -38
  460. package/dist/tasks/parser.js +156 -64
  461. package/dist/tasks/resolve-akm-bin.js +144 -51
  462. package/dist/tasks/runner.js +377 -209
  463. package/dist/tasks/schedule.js +108 -19
  464. package/dist/tasks/scheduler-invocation.js +296 -0
  465. package/dist/tasks/schema.js +1 -1
  466. package/dist/tasks/task-id.js +35 -0
  467. package/dist/tasks/validator.js +30 -16
  468. package/dist/text-import-hook.mjs +1 -1
  469. package/dist/workflows/authoring/authoring.js +104 -43
  470. package/dist/workflows/authoring/scope-key.js +1 -1
  471. package/dist/workflows/cli.js +0 -16
  472. package/dist/workflows/concurrency-policy.js +15 -0
  473. package/dist/workflows/exec/brief.js +450 -0
  474. package/dist/workflows/exec/frozen-judge.js +47 -0
  475. package/dist/workflows/exec/native-executor.js +1038 -0
  476. package/dist/workflows/exec/param-secrets.js +115 -0
  477. package/dist/workflows/exec/report.js +1460 -0
  478. package/dist/workflows/exec/run-workflow.js +602 -0
  479. package/dist/workflows/exec/scheduler.js +71 -0
  480. package/dist/workflows/exec/step-work.js +1190 -0
  481. package/dist/workflows/exec/unit-writer.js +23 -0
  482. package/dist/workflows/exec/workflow-engine-gate.js +67 -0
  483. package/dist/workflows/exec/worktree.js +171 -0
  484. package/dist/workflows/ir/compile.js +246 -0
  485. package/dist/workflows/ir/freeze.js +233 -0
  486. package/dist/workflows/ir/params.js +54 -0
  487. package/dist/workflows/ir/plan-hash.js +68 -0
  488. package/dist/workflows/ir/schema.js +540 -0
  489. package/dist/workflows/parser.js +878 -304
  490. package/dist/workflows/program/expressions.js +181 -0
  491. package/dist/workflows/program/schema.js +51 -0
  492. package/dist/workflows/renderer.js +100 -45
  493. package/dist/workflows/resource-limits.js +22 -0
  494. package/dist/workflows/runtime/agent-identity.js +59 -14
  495. package/dist/workflows/runtime/checkin.js +1 -1
  496. package/dist/workflows/runtime/plan-classifier.js +131 -0
  497. package/dist/workflows/runtime/runs.js +376 -119
  498. package/dist/workflows/runtime/unit-checkin.js +45 -0
  499. package/dist/workflows/runtime/unit-phases.js +20 -0
  500. package/dist/workflows/runtime/workflow-asset-loader.js +241 -40
  501. package/dist/workflows/schema.js +1 -11
  502. package/dist/workflows/validate-summary.js +2 -3
  503. package/dist/workflows/validator.js +52 -30
  504. package/docs/README.md +42 -78
  505. package/docs/migration/README.md +8 -0
  506. package/docs/migration/release-notes/0.6.0.md +1 -1
  507. package/docs/migration/release-notes/0.7.0.md +9 -8
  508. package/docs/migration/release-notes/0.9.0.md +158 -14
  509. package/docs/migration/v0.7-to-v0.8.md +46 -47
  510. package/docs/migration/v0.8-to-v0.9.md +844 -0
  511. package/docs/reference/README.md +12 -0
  512. package/docs/reference/data-and-telemetry.md +333 -0
  513. package/package.json +21 -17
  514. package/schemas/akm-asset-envelope.json +93 -0
  515. package/schemas/akm-config.json +4636 -0
  516. package/schemas/akm-task.json +87 -0
  517. package/schemas/akm-workflow.json +373 -0
  518. package/dist/akm-migrate-storage +0 -38
  519. package/dist/assets/help/help-accept.md +0 -12
  520. package/dist/assets/help/help-improve.md +0 -84
  521. package/dist/assets/help/help-proposals.md +0 -17
  522. package/dist/assets/help/help-propose.md +0 -17
  523. package/dist/assets/help/help-reject.md +0 -11
  524. package/dist/assets/profiles/frequent.json +0 -13
  525. package/dist/assets/profiles/recombine-only.json +0 -21
  526. package/dist/assets/profiles/reflect-distill.json +0 -30
  527. package/dist/assets/profiles/synthesize.json +0 -15
  528. package/dist/assets/prompts/procedural-system.md +0 -44
  529. package/dist/assets/prompts/recombine-system.md +0 -40
  530. package/dist/assets/prompts/staleness-detect-system.md +0 -6
  531. package/dist/assets/tasks/core/backup.yml +0 -4
  532. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  533. package/dist/assets/templates/html/default.html +0 -78
  534. package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
  535. package/dist/assets/wiki/index-template.md +0 -12
  536. package/dist/assets/wiki/ingest-workflow-template.md +0 -83
  537. package/dist/assets/wiki/log-template.md +0 -8
  538. package/dist/assets/wiki/schema-template.md +0 -61
  539. package/dist/cli/config-migrate.js +0 -150
  540. package/dist/cli/config-validate.js +0 -39
  541. package/dist/commands/graph/graph-cli.js +0 -124
  542. package/dist/commands/graph/graph.js +0 -487
  543. package/dist/commands/improve/calibration.js +0 -161
  544. package/dist/commands/improve/dedup.js +0 -482
  545. package/dist/commands/improve/extract-watch.js +0 -140
  546. package/dist/commands/improve/hot-probation.js +0 -45
  547. package/dist/commands/improve/improve-auto-accept.js +0 -276
  548. package/dist/commands/improve/improve-profiles.js +0 -168
  549. package/dist/commands/improve/procedural.js +0 -398
  550. package/dist/commands/improve/recombine.js +0 -818
  551. package/dist/commands/improve/schema-similarity-gate.js +0 -168
  552. package/dist/commands/lint/agent-linter.js +0 -44
  553. package/dist/commands/lint/command-linter.js +0 -44
  554. package/dist/commands/lint/default-linter.js +0 -16
  555. package/dist/commands/lint/fact-linter.js +0 -39
  556. package/dist/commands/lint/knowledge-linter.js +0 -16
  557. package/dist/commands/lint/memory-linter.js +0 -61
  558. package/dist/commands/lint/registry.js +0 -41
  559. package/dist/commands/lint/skill-linter.js +0 -45
  560. package/dist/commands/lint/task-linter.js +0 -50
  561. package/dist/commands/lint/workflow-linter.js +0 -81
  562. package/dist/commands/proposal/legacy-import.js +0 -115
  563. package/dist/commands/sources/history.js +0 -196
  564. package/dist/commands/tasks/default-tasks.js +0 -186
  565. package/dist/commands/wiki-cli.js +0 -292
  566. package/dist/core/asset/asset-registry.js +0 -76
  567. package/dist/core/asset/asset-spec.js +0 -259
  568. package/dist/core/config/config-migration.js +0 -602
  569. package/dist/core/deep-merge.js +0 -38
  570. package/dist/core/eval/rank-metrics.js +0 -113
  571. package/dist/core/ripgrep/install.js +0 -163
  572. package/dist/core/ripgrep/resolve.js +0 -81
  573. package/dist/indexer/db/db.js +0 -1413
  574. package/dist/indexer/manifest.js +0 -170
  575. package/dist/indexer/passes/metadata-contributors.js +0 -31
  576. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
  577. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -49
  578. package/dist/llm/call-ai.js +0 -62
  579. package/dist/llm/memory-infer-impl.js +0 -138
  580. package/dist/output/shapes/distill.js +0 -14
  581. package/dist/output/shapes/history.js +0 -11
  582. package/dist/output/text/distill.js +0 -6
  583. package/dist/output/text/enable-disable.js +0 -8
  584. package/dist/output/text/history.js +0 -6
  585. package/dist/output/text/wiki.js +0 -16
  586. package/dist/registry/build-index.js +0 -386
  587. package/dist/scripts/migrate-storage.js +0 -19108
  588. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -9411
  589. package/dist/scripts/migrations/v16-to-v17.js +0 -141
  590. package/dist/setup/legacy-config.js +0 -106
  591. package/dist/storage/repositories/consolidation-repository.js +0 -38
  592. package/dist/storage/repositories/recombine-repository.js +0 -213
  593. package/dist/wiki/wiki-templates.js +0 -15
  594. package/dist/wiki/wiki.js +0 -1012
  595. package/dist/workflows/db.js +0 -215
  596. package/docs/data-and-telemetry.md +0 -226
  597. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
  598. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
@@ -0,0 +1,120 @@
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
+ * Gemini CLI agent command builder (P2, plan §"The adapter contract" step 2 /
6
+ * §"Capability matrix").
7
+ *
8
+ * Translates a platform-agnostic {@link AgentDispatchRequest} into the exact
9
+ * headless argv the `gemini` CLI expects. Per the capability matrix the
10
+ * headless invocation is:
11
+ *
12
+ * gemini -p "<prompt>"
13
+ *
14
+ * with `--output-format json` for structured output, `--model <m>` for model
15
+ * selection, and `--resume <id>` for resume; resume is not built here because
16
+ * `AgentDispatchRequest` carries no session id. The `GEMINI_CLI=1` identity
17
+ * env marker is likewise registry-side (`AkmHarness.identityEnv` /
18
+ * `agent-identity.ts`), not a builder concern.
19
+ *
20
+ * Platform-specific mapping decisions (all localized here, per the adapter
21
+ * contract):
22
+ *
23
+ * - **systemPrompt** — Gemini CLI has no system-prompt flag in headless mode
24
+ * (system text comes from `GEMINI.md` context files / `GEMINI_SYSTEM_MD`),
25
+ * so the system prompt is folded into the `-p` payload ahead of the task
26
+ * prompt, separated by a blank line. `assertNotFlag` still guards it so a
27
+ * `--`-prefixed system prompt cannot turn the front of the `-p` value into
28
+ * a flag.
29
+ * - **schema** — the matrix places Gemini in the "via prompt+validate" tier
30
+ * (no native `--output-schema` equivalent, unlike Codex — so no temp-file
31
+ * plumbing here), so the JSON Schema is passed through the prompt: a
32
+ * directive matching the engine's wording (`step-work.ts`
33
+ * `buildUnitPrompt`) is appended to the `-p` payload, and
34
+ * `--output-format json` is emitted so stdout is the documented JSON
35
+ * envelope the gemini result extractor normalizes. The engine's shared
36
+ * retry-until-valid loop performs the actual validation.
37
+ * - **tools** — a string/array tool policy maps to repeated
38
+ * `--allowed-tools <t>` flags (Gemini's run-without-confirmation
39
+ * allowlist). A *structured* policy object is NOT expressible as Gemini
40
+ * flags; it is deliberately dropped without widening to an auto-approve
41
+ * flag (never silently widen a restriction). With no policy at all,
42
+ * NOTHING is emitted — the matrix's headless shape is the bare
43
+ * `gemini -p "<p>"`; autonomy flags (`--yolo`, `--approval-mode`) belong in
44
+ * `profile.args` where the operator opts in explicitly.
45
+ *
46
+ * Registered: `geminiBuilder` is `GeminiHarness.agentBuilder` (`./index.ts`),
47
+ * one of the ten harnesses `HARNESS_REGISTRY` constructs
48
+ * (`harnesses/index.ts`); `agent/builders.ts` derives `BUILTIN_BUILDERS` from
49
+ * that registry, so this builder is reachable under the `"gemini"` platform
50
+ * name without any further wiring.
51
+ */
52
+ import { assertNotFlag, resolveDispatchModel, } from "../../agent/builder-shared.js";
53
+ /** Canonical harness/platform id used for model-alias resolution. */
54
+ export const GEMINI_PLATFORM = "gemini";
55
+ /**
56
+ * Split a tool policy into individual tool names for `--allowed-tools`.
57
+ * Strings are comma-separated lists; arrays are taken as-is. Structured
58
+ * policy objects return `undefined` (not expressible as Gemini flags — see
59
+ * module doc).
60
+ */
61
+ function toolPolicyEntries(tools) {
62
+ if (typeof tools === "string") {
63
+ return tools
64
+ .split(",")
65
+ .map((t) => t.trim())
66
+ .filter(Boolean);
67
+ }
68
+ if (Array.isArray(tools)) {
69
+ return tools.map((t) => t.trim()).filter(Boolean);
70
+ }
71
+ return undefined;
72
+ }
73
+ /**
74
+ * Assemble the `-p` payload: optional system prompt, the task prompt, and —
75
+ * when a schema is requested — the same schema directive the workflow
76
+ * engine's prompt assembly uses, so both dispatch paths speak one dialect.
77
+ */
78
+ function buildPromptPayload(req) {
79
+ const sections = [];
80
+ if (req.systemPrompt)
81
+ sections.push(req.systemPrompt);
82
+ sections.push(req.prompt);
83
+ if (req.schema) {
84
+ sections.push(`Respond with ONLY a JSON value matching this JSON Schema (no prose, no code fences):\n${JSON.stringify(req.schema)}`);
85
+ }
86
+ return sections.join("\n\n");
87
+ }
88
+ /**
89
+ * Gemini CLI builder.
90
+ * Command shape:
91
+ * gemini [--model <m>] [--allowed-tools <t> ...]
92
+ * [--output-format json] -p "<systemPrompt?\n\nprompt\n\nschema?>"
93
+ */
94
+ export const geminiBuilder = {
95
+ platform: GEMINI_PLATFORM,
96
+ build(profile, req) {
97
+ assertNotFlag(req.systemPrompt, "systemPrompt");
98
+ assertNotFlag(req.model, "model");
99
+ const args = [...profile.args];
100
+ if (req.model) {
101
+ const resolved = resolveDispatchModel(req, profile, GEMINI_PLATFORM);
102
+ args.push("--model", resolved);
103
+ }
104
+ if (req.tools) {
105
+ // Structured policy objects (entries === undefined) emit NO flags:
106
+ // dropping a restriction must never widen to auto-approval.
107
+ for (const tool of toolPolicyEntries(req.tools) ?? []) {
108
+ assertNotFlag(tool, "tools entry");
109
+ args.push("--allowed-tools", tool);
110
+ }
111
+ }
112
+ if (req.schema) {
113
+ // Structured unit: ask for the documented JSON envelope so the result
114
+ // extractor can pull the final message + session id deterministically.
115
+ args.push("--output-format", "json");
116
+ }
117
+ args.push("-p", buildPromptPayload(req));
118
+ return { argv: [profile.bin, ...args] };
119
+ },
120
+ };
@@ -0,0 +1,48 @@
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
+ * 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.
14
+ */
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 {
27
+ id = "gemini";
28
+ displayName = "Gemini CLI";
29
+ aliases = [];
30
+ agentBuilder = geminiBuilder;
31
+ resultExtractor = geminiResultExtractor;
32
+ // ── Workflow-engine descriptor (plan §"Capability matrix", P2) ────────────
33
+ // akm spawns the `gemini` CLI locally per unit ⇒ local-runner.
34
+ pattern = "local-runner";
35
+ // `--output-format json` emits a documented JSON envelope akm parses, then
36
+ // validates against the node schema ⇒ native-json tier.
37
+ structuredOutput = "native-json";
38
+ // The matrix's identity marker: Gemini CLI stamps GEMINI_CLI=1 only on
39
+ // processes it spawns, so it genuinely means "running under gemini" (it is
40
+ // not a user-profile config var) — but its VALUE ("1") is a bare flag, not
41
+ // a session id, so it is registered as `presenceEnv` (harness inference
42
+ // only), never `identityEnv` (whose values persist as agent_session_id).
43
+ presenceEnv = ["GEMINI_CLI"];
44
+ capabilities = caps({
45
+ agentDispatch: true,
46
+ detection: true,
47
+ });
48
+ }
@@ -0,0 +1,121 @@
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
+ function isRecord(value) {
5
+ return typeof value === "object" && value !== null && !Array.isArray(value);
6
+ }
7
+ /**
8
+ * Keys that may carry the final answer, in precedence order. `response` is
9
+ * Gemini's documented `--output-format json` envelope key.
10
+ */
11
+ const TEXT_KEYS = ["response", "result", "text", "output", "content", "message"];
12
+ /** Keys that may carry the harness-native session id, in precedence order. */
13
+ const SESSION_KEYS = ["session_id", "sessionId", "conversation_id", "conversationId", "chat_id", "chatId"];
14
+ /**
15
+ * Coerce a candidate value into text. Handles the shapes Gemini nests
16
+ * answers in: bare strings, `{content|text}` wrappers (assistant message
17
+ * objects), and arrays of `{type:"text",text}` content blocks (Gemini API
18
+ * `parts`-style lists). Depth-bounded: JSON.parse output is acyclic, but
19
+ * nesting is capped anyway so a pathological envelope cannot recurse
20
+ * unboundedly.
21
+ */
22
+ function textOf(value, depth = 0) {
23
+ if (depth > 4)
24
+ return undefined;
25
+ if (typeof value === "string")
26
+ return value;
27
+ if (Array.isArray(value)) {
28
+ const parts = [];
29
+ for (const block of value) {
30
+ const t = textOf(block, depth + 1);
31
+ if (t)
32
+ parts.push(t);
33
+ }
34
+ return parts.length > 0 ? parts.join("\n") : undefined;
35
+ }
36
+ if (isRecord(value)) {
37
+ return textOf(value.content ?? value.text, depth + 1);
38
+ }
39
+ return undefined;
40
+ }
41
+ /** Extract the final-answer text from one parsed JSON value, if any. */
42
+ function extractText(value) {
43
+ if (typeof value === "string")
44
+ return value;
45
+ if (!isRecord(value))
46
+ return undefined;
47
+ for (const key of TEXT_KEYS) {
48
+ if (!(key in value))
49
+ continue;
50
+ const text = textOf(value[key]);
51
+ if (text !== undefined)
52
+ return text;
53
+ }
54
+ return undefined;
55
+ }
56
+ /** Extract a harness-native session id from one parsed JSON value, if any. */
57
+ function extractSessionId(value) {
58
+ if (!isRecord(value))
59
+ return undefined;
60
+ for (const key of SESSION_KEYS) {
61
+ const candidate = value[key];
62
+ if (typeof candidate === "string" && candidate.length > 0)
63
+ return candidate;
64
+ }
65
+ return undefined;
66
+ }
67
+ /** JSON.parse that returns undefined instead of throwing. */
68
+ function tryParseJson(raw) {
69
+ try {
70
+ return JSON.parse(raw);
71
+ }
72
+ catch {
73
+ return undefined;
74
+ }
75
+ }
76
+ /**
77
+ * Normalize a raw gemini run result into `{ text, sessionId? }`.
78
+ * See the module doc for the three stdout shapes handled.
79
+ */
80
+ export const geminiResultExtractor = (result) => {
81
+ // The raw result's own sessionId (SDK-style paths) is the fallback; an id
82
+ // found in the output stream wins because it is fresher.
83
+ const fallbackSessionId = result.sessionId;
84
+ const raw = result.stdout.trim();
85
+ // Shape 1 — whole stdout is one JSON document (spawn may have pre-parsed
86
+ // it when the profile requested parseOutput: "json").
87
+ const whole = result.parsed !== undefined ? result.parsed : raw.length > 0 ? tryParseJson(raw) : undefined;
88
+ if (whole !== undefined) {
89
+ const sessionId = extractSessionId(whole) ?? fallbackSessionId;
90
+ // Unknown envelope (no recognized text key — includes the error-only
91
+ // variant): fall back to raw stdout so downstream embedded-JSON parsing
92
+ // and failure handling still have the full material to work with.
93
+ const text = extractText(whole) ?? raw;
94
+ return { text, ...(sessionId ? { sessionId } : {}) };
95
+ }
96
+ // Shape 2 — JSONL event stream: last text-bearing event wins; first
97
+ // session-id-bearing event supplies the id. Non-JSON lines are banner
98
+ // noise and are skipped.
99
+ let lastText;
100
+ let streamSessionId;
101
+ let sawJsonLine = false;
102
+ for (const line of raw.split("\n")) {
103
+ const trimmed = line.trim();
104
+ if (trimmed.length === 0)
105
+ continue;
106
+ const event = tryParseJson(trimmed);
107
+ if (event === undefined)
108
+ continue;
109
+ sawJsonLine = true;
110
+ streamSessionId ??= extractSessionId(event);
111
+ const text = extractText(event);
112
+ if (text !== undefined)
113
+ lastText = text;
114
+ }
115
+ if (sawJsonLine) {
116
+ const sessionId = streamSessionId ?? fallbackSessionId;
117
+ return { text: lastText ?? raw, ...(sessionId ? { sessionId } : {}) };
118
+ }
119
+ // Shape 3 — plain text passthrough.
120
+ return { text: raw, ...(fallbackSessionId ? { sessionId: fallbackSessionId } : {}) };
121
+ };
@@ -0,0 +1,24 @@
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 HARNESS_ID_TABLE = [
5
+ { id: "opencode", agentDispatch: true },
6
+ { id: "claude", agentDispatch: true },
7
+ { id: "opencode-sdk", agentDispatch: true },
8
+ { id: "codex", agentDispatch: true },
9
+ { id: "copilot", agentDispatch: true },
10
+ { id: "pi", agentDispatch: true },
11
+ { id: "gemini", agentDispatch: true },
12
+ { id: "aider", agentDispatch: true },
13
+ { id: "amazonq", agentDispatch: true },
14
+ { id: "openhands", agentDispatch: true },
15
+ ];
16
+ /**
17
+ * Canonical, ordered list of valid harness / platform ids — the
18
+ * dependency-free counterpart of `./index.ts`'s `VALID_HARNESS_IDS` (which
19
+ * remains the barrel's own derivation for its own consumers). Both are
20
+ * asserted equal at `HARNESS_REGISTRY` construction time.
21
+ */
22
+ export const VALID_HARNESS_IDS = Object.freeze(HARNESS_ID_TABLE.map((h) => h.id));
23
+ /** Harness ids whose `capabilities.agentDispatch` is `true`. */
24
+ export const HARNESS_AGENT_DISPATCH_IDS = new Set(HARNESS_ID_TABLE.filter((h) => h.agentDispatch).map((h) => h.id));
@@ -12,14 +12,26 @@
12
12
  * This module is a dependency-graph LEAF: it imports nothing from
13
13
  * `core/config`. `core/config/config-types.ts` derives `VALID_HARNESS_IDS`
14
14
  * from here, which keeps the import direction acyclic (config ← harnesses).
15
- *
16
- * Implementations (session-log readers, agent profiles) are migrated under each
17
- * harness in #563/#564; this step only owns ids + capability membership and
18
- * wires the existing call sites to consult it (behaviour-preserving).
19
15
  */
16
+ import { AiderHarness } from "./aider/index.js";
17
+ import { AmazonqHarness } from "./amazonq/index.js";
20
18
  import { ClaudeHarness } from "./claude/index.js";
19
+ import { CodexHarness } from "./codex/index.js";
20
+ import { CopilotHarness } from "./copilot/index.js";
21
+ import { GeminiHarness } from "./gemini/index.js";
22
+ import { HARNESS_ID_TABLE } from "./ids.js";
21
23
  import { OpencodeHarness } from "./opencode/index.js";
22
- import { OpencodeSdkHarness } from "./opencode-sdk/index.js";
24
+ // Import the descriptor from its LEAF module, not the per-harness barrel: the
25
+ // barrel re-exports `./sdk-runner` (which imports `core/config`, and
26
+ // `core/config/config-types` derives `VALID_HARNESS_IDS` back from this file).
27
+ // Importing the class through the barrel would form an initialization cycle
28
+ // that throws a TDZ error when the barrel is the first module loaded in a fresh
29
+ // graph (see ./opencode-sdk/harness.ts). This keeps the registry a config-leaf.
30
+ import { OpencodeSdkHarness } from "./opencode-sdk/harness.js";
31
+ import { OpenhandsHarness } from "./openhands/index.js";
32
+ import { PiHarness } from "./pi/index.js";
33
+ import { isSessionLogHarness } from "./types.js";
34
+ export { isSessionLogHarness } from "./types.js";
23
35
  // Each harness descriptor (ClaudeHarness, OpencodeHarness, OpencodeSdkHarness)
24
36
  // lives in its own per-harness directory alongside that harness's session-log
25
37
  // reader, agent builder, config importer, and/or SDK runner (#563/#564). They
@@ -33,14 +45,40 @@ import { OpencodeSdkHarness } from "./opencode-sdk/index.js";
33
45
  * `z.enum(...)`, and the `platform` union all need the literal types.
34
46
  */
35
47
  // Order is significant: VALID_HARNESS_IDS derives from this array and feeds the
36
- // committed JSON-schema enum order. Kept as [opencode, claude, opencode-sdk] to
37
- // match the pre-unification VALID_HARNESS_IDS so the generated schema does not
38
- // drift (behaviour-preserving, #562).
48
+ // committed JSON-schema enum order. The original [opencode, claude,
49
+ // opencode-sdk] prefix is preserved so the pre-unification portion of the
50
+ // generated schema enum does not reorder; the seven P2 harness adapters are
51
+ // appended after it, which extends the enum additively (schemas/akm-config.json
52
+ // is regenerated in lockstep).
39
53
  export const HARNESS_REGISTRY = Object.freeze([
40
54
  new OpencodeHarness(),
41
55
  new ClaudeHarness(),
42
56
  new OpencodeSdkHarness(),
57
+ new CodexHarness(),
58
+ new CopilotHarness(),
59
+ new PiHarness(),
60
+ new GeminiHarness(),
61
+ new AiderHarness(),
62
+ new AmazonqHarness(),
63
+ new OpenhandsHarness(),
43
64
  ]);
65
+ // Construction-time drift guard (WI-9.8 KILL 3, D.3 edge B): ./ids.ts's
66
+ // HARNESS_ID_TABLE is config's dependency-free mirror of (id, agentDispatch)
67
+ // for every registered harness, kept out of core/config's import graph so
68
+ // config doesn't have to import this (heavier) barrel. Assert they match so
69
+ // the mirror can never silently drift — a new/reordered/recapability'd
70
+ // harness that forgets to update ./ids.ts fails loudly here instead of
71
+ // quietly breaking config's platform validation.
72
+ if (HARNESS_REGISTRY.length !== HARNESS_ID_TABLE.length) {
73
+ throw new Error(`harnesses/ids.ts HARNESS_ID_TABLE has ${HARNESS_ID_TABLE.length} entries but HARNESS_REGISTRY has ${HARNESS_REGISTRY.length} — update ids.ts to match.`);
74
+ }
75
+ HARNESS_REGISTRY.forEach((h, i) => {
76
+ const expected = HARNESS_ID_TABLE[i];
77
+ if (!expected || expected.id !== h.id || expected.agentDispatch !== h.capabilities.agentDispatch) {
78
+ throw new Error(`harnesses/ids.ts HARNESS_ID_TABLE[${i}] (${expected?.id ?? "<missing>"}, agentDispatch=${expected?.agentDispatch}) ` +
79
+ `does not match HARNESS_REGISTRY[${i}] (${h.id}, agentDispatch=${h.capabilities.agentDispatch}) — update ids.ts to match.`);
80
+ }
81
+ });
44
82
  /** Lookup by canonical id. */
45
83
  export const HARNESS_BY_ID = new Map(HARNESS_REGISTRY.map((h) => [h.id, h]));
46
84
  /**
@@ -60,12 +98,17 @@ const HARNESS_BY_ANY_ID = (() => {
60
98
  })();
61
99
  /**
62
100
  * Canonical, ordered list of valid harness / platform ids. The Zod
63
- * `AgentPlatformSchema` enum, the `AgentProfileConfig` platform union, and
101
+ * `AgentPlatformSchema` enum, the agent-engine platform union, and
64
102
  * setup's `DetectedHarness` union all derive from this so they cannot drift.
65
103
  */
66
104
  export const VALID_HARNESS_IDS = Object.freeze(HARNESS_REGISTRY.map((h) => h.id));
67
- /** Harnesses that expose readable native session logs. */
68
- export const SESSION_LOG_HARNESSES = HARNESS_REGISTRY.filter((h) => h.capabilities.sessionLogs);
105
+ /**
106
+ * Harnesses that expose readable native session logs. Narrowed via the
107
+ * {@link isSessionLogHarness} type-predicate (rather than a plain boolean
108
+ * callback) so `sessionLogProvider` is known-present on every element — see
109
+ * that function's doc comment for why a plain predicate doesn't narrow here.
110
+ */
111
+ export const SESSION_LOG_HARNESSES = HARNESS_REGISTRY.filter(isSessionLogHarness);
69
112
  /** Harnesses that can be dispatched as an agent CLI / SDK. */
70
113
  export const AGENT_DISPATCH_HARNESSES = HARNESS_REGISTRY.filter((h) => h.capabilities.agentDispatch);
71
114
  /** Harnesses that can import an existing harness config into akm. */
@@ -90,29 +133,6 @@ export function getHarness(id) {
90
133
  export function normalizeHarnessId(id) {
91
134
  return HARNESS_BY_ANY_ID.get(id)?.id ?? id;
92
135
  }
93
- /**
94
- * Resolve a legacy v1 agent-profile name to its v2 platform id (#566).
95
- *
96
- * v1 agent profiles never carried an explicit `platform`; it had to be inferred
97
- * from the profile name. This is the SINGLE registry-backed resolver that
98
- * replaces both the old standalone `guessAgentPlatform()` in config-migration
99
- * and the `name.includes("claude") ? "claude" : "opencode"` heuristic in setup.
100
- * Each harness owns its own `matchesV1ProfileName()`; an unknown name matches no
101
- * harness and returns `undefined`, so the caller drops it instead of silently
102
- * defaulting to `'opencode'`.
103
- *
104
- * Harnesses are consulted most-specific-id-first (longest id wins) so a
105
- * decorated name like `"opencode-sdk-fast"` resolves to `'opencode-sdk'` rather
106
- * than being over-matched by OpenCode's `"opencode"` prefix.
107
- */
108
- const V1_RESOLUTION_ORDER = [...HARNESS_REGISTRY].sort((a, b) => b.id.length - a.id.length);
109
- export function v1ProfilePlatform(name) {
110
- for (const h of V1_RESOLUTION_ORDER) {
111
- if (h.matchesV1ProfileName(name))
112
- return h.id;
113
- }
114
- return undefined;
115
- }
116
136
  /**
117
137
  * Default agent-profile name for a detected harness id (#566).
118
138
  *
@@ -14,8 +14,7 @@
14
14
  * pre-migration `opencodeBuilder`. The builder's `platform` stays `'opencode'`
15
15
  * (the canonical harness id).
16
16
  */
17
- import { assertNotFlag } from "../../agent/builder-shared.js";
18
- import { resolveModel } from "../../agent/model-aliases.js";
17
+ import { assertNotFlag, resolveDispatchModel } from "../../agent/builder-shared.js";
19
18
  /**
20
19
  * OpenCode builder.
21
20
  * Command shape: opencode run [--system-prompt "..."] [--model <m>] "<prompt>"
@@ -28,13 +27,32 @@ export const opencodeBuilder = {
28
27
  build(profile, req) {
29
28
  assertNotFlag(req.systemPrompt, "systemPrompt");
30
29
  assertNotFlag(req.model, "model");
31
- const args = [...profile.args]; // starts with ["run"]
30
+ let configuredModel;
31
+ const args = req.model ? [] : [...profile.args];
32
+ if (req.model) {
33
+ for (let index = 0; index < profile.args.length; index += 1) {
34
+ const arg = profile.args[index];
35
+ if (arg === undefined)
36
+ continue;
37
+ if (arg === "--model") {
38
+ configuredModel = profile.args[index + 1];
39
+ index += 1;
40
+ }
41
+ else if (arg.startsWith("--model=")) {
42
+ configuredModel = arg.slice("--model=".length);
43
+ }
44
+ else {
45
+ args.push(arg);
46
+ }
47
+ }
48
+ }
32
49
  if (req.systemPrompt) {
33
50
  args.push("--system-prompt", req.systemPrompt);
34
51
  }
35
52
  if (req.model) {
36
- const resolved = resolveModel(req.model, "opencode", profile.modelAliases, profile.globalModelAliases);
37
- args.push("--model", resolved);
53
+ const resolved = resolveDispatchModel(req, profile, "opencode");
54
+ const provider = configuredModel?.split("/", 1)[0];
55
+ args.push("--model", provider && !resolved.includes("/") ? `${provider}/${resolved}` : resolved);
38
56
  }
39
57
  args.push("--");
40
58
  args.push(req.prompt);
@@ -15,9 +15,7 @@
15
15
  */
16
16
  import fs from "node:fs";
17
17
  import path from "node:path";
18
- function homeDir() {
19
- return process.env.HOME ?? process.env.USERPROFILE ?? "";
20
- }
18
+ import { homeDir } from "../shared.js";
21
19
  /**
22
20
  * Imports LLM config from an OpenCode installation.
23
21
  *
@@ -1,38 +1,13 @@
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-code'), so no alias bridge is needed.
19
- */
4
+ import { caps } from "../shared.js";
20
5
  import { BaseHarness } from "../types.js";
21
6
  import { opencodeBuilder } from "./agent-builder.js";
7
+ import { OpenCodeProvider } from "./session-log.js";
22
8
  export { opencodeBuilder } from "./agent-builder.js";
23
9
  export { openCodeImporter } from "./config-import.js";
24
10
  export { OpenCodeProvider } from "./session-log.js";
25
- function caps(c) {
26
- return {
27
- sessionLogs: false,
28
- agentDispatch: false,
29
- detection: false,
30
- configImport: false,
31
- runtimeIdentity: false,
32
- v1Migration: false,
33
- ...c,
34
- };
35
- }
36
11
  /**
37
12
  * OpenCode.
38
13
  *
@@ -45,17 +20,24 @@ export class OpencodeHarness extends BaseHarness {
45
20
  // Home-relative config dir scanned by `akm setup` (#567). OpenCode has a
46
21
  // session-log provider, so offering it as a stash source is functional.
47
22
  setupDetectionDir = ".config/opencode";
48
- // Decorated v1 profile names like "opencode-fast" still belong to OpenCode.
49
- // `v1ProfilePlatform()` resolves most-specific-id-first, so "opencode-sdk-*"
50
- // is claimed by OpencodeSdkHarness before this prefix can over-match it.
51
- v1ProfilePrefixes = ["opencode"];
52
23
  agentBuilder = opencodeBuilder;
24
+ // ── Workflow-engine descriptor (plan §"Capability matrix", P2) ────────────
25
+ // This entry is the CLI spawn path (`opencode run …`): akm launches the
26
+ // harness locally per unit ⇒ local-runner. (The SDK path is the separate
27
+ // `opencode-sdk` harness.)
28
+ pattern = "local-runner";
29
+ // The CLI path emits plain text — no JSON stream akm consumes — so the
30
+ // engine uses the prompt-injected schema + embedded-JSON extraction tier
31
+ // (the matrix's "via prompt+validate"). The SDK entry is native-json.
32
+ structuredOutput = "none";
33
+ // Session-id env marker for run attribution.
34
+ identityEnv = ["OPENCODE_SESSION_ID"];
35
+ sessionLogProvider = () => new OpenCodeProvider();
53
36
  capabilities = caps({
54
37
  sessionLogs: true,
55
38
  agentDispatch: true,
56
39
  detection: true,
57
40
  configImport: true,
58
41
  runtimeIdentity: true,
59
- v1Migration: true,
60
42
  });
61
43
  }