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,28 @@
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 ENGINE_NAME_PATTERN_SOURCE = "^(?!akm-)[a-z][a-z0-9]*(?:-[a-z0-9]+)*$";
5
+ export const BUILTIN_IMPROVE_STRATEGY_NAMES = [
6
+ "default",
7
+ "quick",
8
+ "thorough",
9
+ "memory-focus",
10
+ "graph-refresh",
11
+ "frequent",
12
+ "consolidate",
13
+ "catchup",
14
+ "reflect-distill",
15
+ "proactive-maintenance",
16
+ ];
17
+ /** Engine capability required by each configured improve process. `null` means engine-free. */
18
+ export const IMPROVE_PROCESS_ENGINE_CAPABILITIES = {
19
+ reflect: "llm",
20
+ distill: "llm",
21
+ consolidate: "llm",
22
+ memoryInference: "llm",
23
+ graphExtraction: "llm",
24
+ extract: "llm",
25
+ validation: "llm",
26
+ triage: "runner",
27
+ proactiveMaintenance: null,
28
+ };
@@ -0,0 +1,21 @@
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
+ * True only when the user has explicitly opted into autonomous `akm improve`
6
+ * mutation.
7
+ *
8
+ * Accepts a partial config so callers holding a plain object (tests, the
9
+ * strategy resolver) do not need a fully-parsed one.
10
+ */
11
+ export function isImproveAutonomyEnabled(config) {
12
+ return config?.experimental?.improveAutonomy === true;
13
+ }
14
+ /**
15
+ * The config key an operator sets to enable a gated lane.
16
+ *
17
+ * Named rather than inlined because it is user-facing text: it goes into the
18
+ * `improve_skipped` event metadata, the `akm task doctor` output, and the
19
+ * health advisory, and those three must name the same key as the schema.
20
+ */
21
+ export const IMPROVE_AUTONOMY_CONFIG_KEY = "experimental.improveAutonomy";
@@ -0,0 +1,38 @@
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
+ * Embedding connection config (`embedding`). Extracted verbatim from the former
6
+ * `config-schema.ts` monolith — no behavior change.
7
+ */
8
+ import { z } from "zod";
9
+ import { ENV_REFERENCE_PATTERN, positiveInt } from "./primitives.js";
10
+ const EmbeddingOllamaOptionsSchema = z
11
+ .object({
12
+ num_ctx: positiveInt.optional(),
13
+ })
14
+ .passthrough();
15
+ /**
16
+ * Embedding connection config. Both `endpoint` and `model` are optional:
17
+ * - Remote: provide `endpoint` (http/https URL) + `model`.
18
+ * - Local-only: omit `endpoint`/`model`; set `localModel` (or fall back to
19
+ * {@link DEFAULT_LOCAL_MODEL}).
20
+ *
21
+ * Consumers route via `hasRemoteEndpoint()` which checks for an http(s)
22
+ * endpoint — absent fields take the local path naturally, no sentinels needed.
23
+ */
24
+ export const EmbeddingConnectionConfigSchema = z
25
+ .object({
26
+ provider: z.string().optional(),
27
+ endpoint: z.string().optional(),
28
+ model: z.string().optional(),
29
+ apiKey: z.string().regex(ENV_REFERENCE_PATTERN, `apiKey must be $VAR or \${VAR}`).optional(),
30
+ dimension: positiveInt.optional(),
31
+ localModel: z.string().min(1).optional(),
32
+ maxTokens: positiveInt.optional(),
33
+ batchSize: positiveInt.optional(),
34
+ chunkSize: positiveInt.optional(),
35
+ contextLength: positiveInt.optional(),
36
+ ollamaOptions: EmbeddingOllamaOptionsSchema.optional(),
37
+ })
38
+ .passthrough();
@@ -0,0 +1,116 @@
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
+ * OpenAI-compatible LLM connection configs + named agent/LLM engine schemas
6
+ * (`engines`). Extracted verbatim from the former `config-schema.ts` monolith —
7
+ * no behavior change.
8
+ */
9
+ import { z } from "zod";
10
+ // Harness ids come straight from the dependency-free `harnesses/ids` leaf (the
11
+ // same source `config-types.ts` re-exports them from). Importing them here
12
+ // rather than via `../config-types` keeps `schema/*` free of any edge to
13
+ // `config-types`, which type-derives from this barrel via
14
+ // `typeof import("./config-schema")` — routing through config-types would mint
15
+ // a config-schema ↔ config-types type cycle that collapses inference.
16
+ import { HARNESS_AGENT_DISPATCH_IDS, VALID_HARNESS_IDS } from "../../../integrations/harnesses/ids.js";
17
+ import { chatCompletionsEndpoint, ENV_REFERENCE_PATTERN, ExtraParamsSchema, engineName, LlmCapabilitiesSchema, ModelAliasMapSchema, nonEmptyString, positiveInt, } from "./primitives.js";
18
+ // ── Connection configs (LLM) ────────────────────────────────────────────────
19
+ /**
20
+ * OpenAI-compatible connection fields shared by named LLM engines and bounded
21
+ * internal call helpers. `model` is required at schema level — partial entries
22
+ * created by `akm config set llm.endpoint <url>` (where model is left absent)
23
+ * are normalized to `model: ""` *before* Zod sees them by the load-time
24
+ * pre-Zod migrator hook, so this strict shape gates CLI writes without
25
+ * breaking legacy load-time partial configs.
26
+ */
27
+ export const LlmConnectionConfigSchema = z
28
+ .object({
29
+ provider: z.string().optional(),
30
+ endpoint: z.string(),
31
+ model: z.string(),
32
+ apiKey: z.string().optional(),
33
+ temperature: z.number().finite().optional(),
34
+ maxTokens: positiveInt.optional(),
35
+ timeoutMs: z.union([positiveInt, z.null()]).optional(),
36
+ concurrency: positiveInt.optional(),
37
+ capabilities: LlmCapabilitiesSchema.optional(),
38
+ extraParams: ExtraParamsSchema.optional(),
39
+ contextLength: positiveInt.optional(),
40
+ enableThinking: z.boolean().optional(),
41
+ })
42
+ .passthrough();
43
+ export const LlmProfileConfigSchema = LlmConnectionConfigSchema.extend({
44
+ supportsJsonSchema: z.boolean().optional(),
45
+ }).passthrough();
46
+ // ── Agent engines ───────────────────────────────────────────────────────────
47
+ // Derives from the canonical VALID_HARNESS_IDS (#565) so the Zod gate cannot
48
+ // drift from the TS union / parse check / setup detection.
49
+ const AgentPlatformSchema = z.enum(VALID_HARNESS_IDS);
50
+ const LlmEngineSchema = z
51
+ .object({
52
+ kind: z.literal("llm"),
53
+ provider: z.string().optional(),
54
+ endpoint: chatCompletionsEndpoint,
55
+ model: nonEmptyString,
56
+ apiKey: z.string().regex(ENV_REFERENCE_PATTERN, `apiKey must be $VAR or \${VAR}`).optional(),
57
+ temperature: z.number().finite().optional(),
58
+ maxTokens: positiveInt.optional(),
59
+ timeoutMs: z.union([positiveInt, z.null()]).optional(),
60
+ concurrency: positiveInt.optional(),
61
+ supportsJsonSchema: z.boolean().optional(),
62
+ extraParams: ExtraParamsSchema.optional(),
63
+ contextLength: positiveInt.optional(),
64
+ enableThinking: z.boolean().optional(),
65
+ })
66
+ .passthrough()
67
+ .superRefine((value, ctx) => {
68
+ for (const key of ["platform", "bin", "args", "workspace", "modelAliases", "llmEngine"]) {
69
+ if (key in value)
70
+ ctx.addIssue({ code: z.ZodIssueCode.custom, path: [key], message: `${key} is not valid on an LLM engine` });
71
+ }
72
+ });
73
+ const AgentEngineSchema = z
74
+ .object({
75
+ kind: z.literal("agent"),
76
+ platform: AgentPlatformSchema.refine((platform) => HARNESS_AGENT_DISPATCH_IDS.has(platform), {
77
+ message: "platform does not support agent dispatch",
78
+ }),
79
+ bin: nonEmptyString.optional(),
80
+ args: z.array(z.string()).optional(),
81
+ workspace: nonEmptyString.optional(),
82
+ model: nonEmptyString.optional(),
83
+ timeoutMs: z.union([positiveInt, z.null()]).optional(),
84
+ modelAliases: ModelAliasMapSchema.optional(),
85
+ llmEngine: engineName.optional(),
86
+ })
87
+ .passthrough()
88
+ .superRefine((value, ctx) => {
89
+ for (const key of [
90
+ "provider",
91
+ "endpoint",
92
+ "apiKey",
93
+ "temperature",
94
+ "maxTokens",
95
+ "concurrency",
96
+ "supportsJsonSchema",
97
+ "extraParams",
98
+ "contextLength",
99
+ "enableThinking",
100
+ ]) {
101
+ if (key in value)
102
+ ctx.addIssue({ code: z.ZodIssueCode.custom, path: [key], message: `${key} is not valid on an agent engine` });
103
+ }
104
+ if (value.platform !== "opencode-sdk" && value.llmEngine !== undefined) {
105
+ ctx.addIssue({
106
+ code: z.ZodIssueCode.custom,
107
+ path: ["llmEngine"],
108
+ message: "llmEngine is only valid on opencode-sdk",
109
+ });
110
+ }
111
+ if (value.platform === "opencode-sdk" && value.args !== undefined) {
112
+ ctx.addIssue({ code: z.ZodIssueCode.custom, path: ["args"], message: "args is not valid on opencode-sdk" });
113
+ }
114
+ });
115
+ export const EngineConfigSchema = z.union([LlmEngineSchema, AgentEngineSchema]);
116
+ export const EnginesSchema = z.record(engineName, EngineConfigSchema);
@@ -0,0 +1,47 @@
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
+ * `experimental` config section — explicit opt-ins for behaviour that is not
6
+ * covered by the stability contract (D8).
7
+ *
8
+ * An entry here exists so a user can turn something ON deliberately. Every key
9
+ * defaults to OFF, and the runtime must treat "absent" and "false" identically:
10
+ * autonomy is never inferred from a partially-written config.
11
+ */
12
+ import { z } from "zod";
13
+ export const ExperimentalConfigSchema = z
14
+ .object({
15
+ /**
16
+ * Allow `akm improve` to mutate assets without review.
17
+ *
18
+ * OFF by default. Gates memory-cleanup, memory-inference writes, and triage
19
+ * `applyMode: "promote"`. Consolidation stays enabled because destructive
20
+ * operations are advisory and promotion emits a reviewable proposal.
21
+ * `akm improve` itself stays on either way — what this gates is autonomy,
22
+ * not the feature.
23
+ *
24
+ * `sync.push` is deliberately NOT gated by this key: it publishes
25
+ * already-committed content to a remote the user configured for that
26
+ * purpose, and it has its own `sync.push: false` / `--no-push` controls.
27
+ */
28
+ improveAutonomy: z.boolean().optional(),
29
+ /**
30
+ * Allow the `akm workflow` native engine to run (Q-05).
31
+ *
32
+ * OFF by default. Gates `akm workflow run` (the native step-execution
33
+ * engine) and `akm workflow brief`/`report` (the harness-neutral driver
34
+ * protocol).
35
+ *
36
+ * Deliberately NOT gated: authoring/linting the unified markdown format
37
+ * and the manual workflow CLI contract (`start`/`next`/`complete`/
38
+ * `status`/`list`/`create`/`resume`/`abandon`) remain stable regardless of
39
+ * this key.
40
+ *
41
+ * Unlike `improveAutonomy`, a gated call here REFUSES outright rather than
42
+ * degrading: a workflow step either executes or it does not, so there is
43
+ * no safe partial-execution fallback to fall back to.
44
+ */
45
+ workflowEngine: z.boolean().optional(),
46
+ })
47
+ .passthrough();
@@ -0,0 +1,31 @@
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
+ * Feedback taxonomy + `feedback` config section. Extracted verbatim from the
6
+ * former `config-schema.ts` monolith — no behavior change.
7
+ */
8
+ import { z } from "zod";
9
+ import { nonEmptyString } from "./primitives.js";
10
+ // ── Feedback failure modes (F-3 / #384) ─────────────────────────────────────
11
+ /**
12
+ * Curated taxonomy of failure modes for negative feedback.
13
+ *
14
+ * Structured failure modes enable aggregation across feedback events so the
15
+ * distill pipeline can detect that "5 assets failed for the same reason" and
16
+ * act on it — free-text strings about the same issue are not aggregatable.
17
+ */
18
+ export const FEEDBACK_FAILURE_MODES = [
19
+ "incorrect", // Factually wrong or logically flawed content
20
+ "outdated", // Correct at some point but now stale
21
+ "dangerous", // Could cause harm if followed (security, safety)
22
+ "incomplete", // Missing key steps, context, or caveats
23
+ "redundant", // Duplicates another asset without adding value
24
+ ];
25
+ // ── Feedback ────────────────────────────────────────────────────────────────
26
+ export const FeedbackConfigSchema = z
27
+ .object({
28
+ requireReason: z.boolean().optional(),
29
+ allowedFailureModes: z.array(nonEmptyString).optional(),
30
+ })
31
+ .passthrough();
@@ -0,0 +1,389 @@
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
+ * Improve profile + per-process (WI-9.6) discriminated schemas. Extracted
6
+ * verbatim from the former `config-schema.ts` monolith — no behavior change.
7
+ */
8
+ import { z } from "zod";
9
+ import { IMPROVE_PROCESS_ENGINE_CAPABILITIES } from "../engine-semantics.js";
10
+ import { engineName, LlmInvocationOverridesSchema, nonEmptyString, positiveInt } from "./primitives.js";
11
+ // ── Improve profile / process ──────────────────────────────────────────────
12
+ //
13
+ // WI-9.6 (§4.2/§10.2): each of the 9 improve processes (reflect, distill,
14
+ // consolidate, memoryInference, graphExtraction, extract, validation, triage,
15
+ // proactiveMaintenance) gets its OWN schema below — a shared base (engine,
16
+ // model, llm, enabled, timeoutMs) extended with only the fields meaningful on
17
+ // that process — replacing the prior single ImproveProcessConfigSchema reused
18
+ // via `.optional()` for all 9 keys (which accepted, and silently ignored, any
19
+ // field on any process). Field→process assignment is derived from each
20
+ // field's original "only meaningful on X" doc comment, cross-checked against
21
+ // its actual runtime consumers and the built-in strategy assets
22
+ // (src/assets/improve-strategies/*.json).
23
+ //
24
+ // `ImproveProcessConfigSchema` ITSELF STAYS (unnarrowed — the union of every
25
+ // field across every process): it backs (a) the wide `ImproveProcessConfig`
26
+ // TS type that generic dynamic-process-name code needs (getImproveProcessConfig,
27
+ // ResolvedImproveProcess.config, agent/runner.ts's cast — the process name
28
+ // isn't known at the type level there, so the type must be a supertype every
29
+ // process's narrow output is assignable to), and (b) two existing tests that
30
+ // parse fields from multiple processes against it directly with no process
31
+ // context (tests/integration/extract-command.test.ts,
32
+ // tests/config-triage-process.test.ts). Real per-config validation for
33
+ // `processes.<name>` uses the NARROW per-process schemas via
34
+ // {@link ImproveProfileProcessesSchema} below — setting a field on the wrong
35
+ // process there is now rejected (the intended §4.2 improvement).
36
+ const IMPROVE_PROCESS_BASE_FIELDS = {
37
+ engine: engineName.optional(),
38
+ model: nonEmptyString.optional(),
39
+ llm: LlmInvocationOverridesSchema.optional(),
40
+ enabled: z.boolean().optional(),
41
+ timeoutMs: z.union([positiveInt, z.null()]).optional(),
42
+ };
43
+ /** Reflect/distill/consolidate: process-level asset-type filter (see improve-strategies.ts shouldSkipRef/DEFAULT_ALLOWED_TYPES). */
44
+ const allowedTypesField = z.array(z.string().min(1)).optional();
45
+ /**
46
+ * Consolidate process: hard cap on memories processed per pass.
47
+ * Reflect/distill: max refs processed (same as profile-level `limit`).
48
+ * proactiveMaintenance: fallback when `maxPerRun` is absent.
49
+ */
50
+ const processLimitField = positiveInt.optional();
51
+ /**
52
+ * Distill process: LLM-as-judge lesson quality gate. Default ON (R3);
53
+ * fail-open — judge failure/timeout/parse errors pass through. Set
54
+ * `enabled: false` on the distill process to opt out. Also read on the
55
+ * `reflect` process (proposal-side quality gate; see reflect.ts).
56
+ */
57
+ const qualityGateField = z.object({ enabled: z.boolean().optional() }).passthrough().optional();
58
+ /** Consolidate process: gate for the M-1 (#367) contradiction-detection pass. */
59
+ const contradictionDetectionField = z.object({ enabled: z.boolean().optional() }).passthrough().optional();
60
+ /**
61
+ * WS-3b: CLS (Complementary Learning System) interleaving (step 9).
62
+ * distill/memoryInference prompts include embedding-retrieved existing adjacent
63
+ * lessons/knowledge to prevent catastrophic interference with prior generalizations.
64
+ * Default OFF. Only meaningful on `distill` and `memoryInference` processes.
65
+ */
66
+ const clsField = z
67
+ .object({
68
+ enabled: z.boolean().optional(),
69
+ // Number of adjacent lessons/knowledge to include in prompts (default 3).
70
+ adjacentCount: z.number().int().min(1).optional(),
71
+ })
72
+ .passthrough()
73
+ .optional();
74
+ /**
75
+ * WS-3b: Distill→source fidelity check (step 10). After a distill proposal,
76
+ * check it against its cited source memories; a contradiction flag forces
77
+ * human review. Default OFF. Distill process only.
78
+ */
79
+ const fidelityCheckField = z.object({ enabled: z.boolean().optional() }).passthrough().optional();
80
+ /**
81
+ * #639 — semantic value-floor filter for the `reflect` process. When
82
+ * enabled, proposals classified as "low-value" by the deterministic noise
83
+ * gate are deferred. DEFAULT OFF (absent / { enabled: false } = pre-#639
84
+ * byte-identical behaviour). Reflect process only.
85
+ */
86
+ const lowValueFilterField = z.object({ enabled: z.boolean().optional() }).passthrough().optional();
87
+ /**
88
+ * #626 — extract process: pre-LLM heuristic triage gate. When enabled, a
89
+ * deterministic scorer decides BEFORE the extraction LLM call whether a
90
+ * session carries enough signal to be worth extracting; low-signal sessions
91
+ * are skipped at zero LLM cost. Default OFF. `minScore` is the minimum total
92
+ * heuristic score to PASS (default 2). Extract process only — NOTE: unrelated
93
+ * to the `triage` PROCESS (`processes.triage`); this is a nested object under
94
+ * `processes.extract.triage` that happens to share the name.
95
+ */
96
+ const extractTriageGateField = z
97
+ .object({
98
+ enabled: z.boolean().optional(),
99
+ minScore: z.number().min(0).optional(),
100
+ })
101
+ .passthrough()
102
+ .optional();
103
+ /** Triage process: LLM-as-judge triage-apply decision engine override. */
104
+ const triageJudgmentField = z
105
+ .object({
106
+ engine: engineName.optional(),
107
+ model: nonEmptyString.optional(),
108
+ timeoutMs: z.union([positiveInt, z.null()]).optional(),
109
+ llm: LlmInvocationOverridesSchema.optional(),
110
+ })
111
+ .passthrough()
112
+ .optional();
113
+ /**
114
+ * WS-3b: Anti-collapse guards (step 8). Prevents the consolidation pipeline
115
+ * from collapsing too aggressively and losing diversity. Consolidate process
116
+ * only. Default ON since R5 (opt out via enabled: false).
117
+ * - maxGeneration: refuse to merge two assets both above this generation (default 2).
118
+ * - lexicalDiversityCheck: low n-gram diversity ⇒ raise merge threshold.
119
+ * - randomClusterFraction: occasional random (non-similar) cluster in pool (default 0.05).
120
+ * - mergeInformationFloor: LIVE gate (anti-collapse.ts:143) — NOT a
121
+ * decorative/inert knob. `false` skips the merge-information-floor
122
+ * measurement entirely (no counting, no warning) for every merge;
123
+ * true/absent (default) measures it on every merge. The MEASUREMENT's
124
+ * outcome is advisory in v1: a failing merge is counted
125
+ * (`merge_floor_violations`) and warned but never refused (promotion path:
126
+ * docs/architecture/specs/improve-collapse-churn-detector-design.md §7). In short:
127
+ * this field gates whether the check runs at all (a real code path), not
128
+ * whether a merge is allowed.
129
+ * - minSpecificityRetention: distinct-token retention floor for merges (default 0.6).
130
+ * (WS-3b step 0a `homeostaticDemotion` was removed — R4. Continuous decay is
131
+ * now part of the always-applied salience recency term.)
132
+ */
133
+ const antiCollapseField = z
134
+ .object({
135
+ enabled: z.boolean().optional(),
136
+ maxGeneration: z.number().int().min(1).optional(),
137
+ lexicalDiversityCheck: z.boolean().optional(),
138
+ randomClusterFraction: z.number().min(0).max(1).optional(),
139
+ mergeInformationFloor: z.boolean().optional(),
140
+ minSpecificityRetention: z.number().min(0).max(1).optional(),
141
+ })
142
+ .passthrough()
143
+ .optional();
144
+ const REFLECT_PROCESS_FIELDS = {
145
+ allowedTypes: allowedTypesField,
146
+ limit: processLimitField,
147
+ qualityGate: qualityGateField,
148
+ lowValueFilter: lowValueFilterField,
149
+ };
150
+ const DISTILL_PROCESS_FIELDS = {
151
+ allowedTypes: allowedTypesField,
152
+ limit: processLimitField,
153
+ qualityGate: qualityGateField,
154
+ // Skip distill entirely when reflect produced zero planned refs.
155
+ requirePlannedRefs: z.boolean().optional(),
156
+ cls: clsField,
157
+ fidelityCheck: fidelityCheckField,
158
+ };
159
+ const CONSOLIDATE_PROCESS_FIELDS = {
160
+ allowedTypes: allowedTypesField,
161
+ limit: processLimitField,
162
+ // Minimum eligible-memory pool size below which the consolidation pass skips
163
+ // entirely (emits `pool_below_min_size`). 0 disables the guard. Default 500.
164
+ minPoolSize: z.number().int().min(0).optional(),
165
+ maxChunkSize: z.number().int().min(1).max(50).optional(),
166
+ // Narrow candidate pool to memories modified within this duration window
167
+ // plus their graph neighbours. Absent = full-pool sweep.
168
+ incrementalSince: z.string().optional(),
169
+ // Graph neighbours per changed memory during incremental consolidation.
170
+ // Default 5. Only meaningful with incrementalSince.
171
+ neighborsPerChanged: z.number().int().min(1).optional(),
172
+ // Fallback p90 wall-clock time per consolidation chunk in seconds, used for
173
+ // cold-start budget estimation when no telemetry history exists. The actual
174
+ // p90 is derived from observed run durations once sufficient history
175
+ // accumulates; this value is only used on the very first run. Default 30s.
176
+ p90ChunkSecondsDefault: z.number().finite().positive().optional(),
177
+ antiCollapse: antiCollapseField,
178
+ contradictionDetection: contradictionDetectionField,
179
+ };
180
+ const MEMORY_INFERENCE_PROCESS_FIELDS = {
181
+ // Minimum pending memory count to run the pass.
182
+ minPendingCount: z.number().int().min(0).optional(),
183
+ cls: clsField,
184
+ };
185
+ /**
186
+ * GraphExtraction process fields: improve-owned graph extraction scope and
187
+ * batching. Passed to the invocation directly and never inherited from
188
+ * standalone index.graph.
189
+ */
190
+ const GRAPH_EXTRACTION_PROCESS_FIELDS = {
191
+ // #624 P2: when set, rank eligible files by utility_scores DESC and process
192
+ // only the top-N per run (incremental high-signal-first sweep). Unset =
193
+ // process all eligible (current behavior).
194
+ topN: positiveInt.optional(),
195
+ includeTypes: z.array(z.string().min(1)).min(1).optional(),
196
+ batchSize: positiveInt.optional(),
197
+ // Full-corpus scan. When true, graph extraction runs on ALL stash files
198
+ // instead of only files touched by actionable refs in the current run.
199
+ // Used by the `graph-refresh` built-in profile / a scheduled weekly task.
200
+ fullScan: z.boolean().optional(),
201
+ };
202
+ const EXTRACT_PROCESS_FIELDS = {
203
+ defaultSince: z.string().min(1).optional(),
204
+ maxTotalChars: positiveInt.optional(),
205
+ // Minimum raw session size (pre-filter inputCount) below which the extract
206
+ // LLM call is skipped (#595/#596). 0 disables the gate. Absent = default 10
207
+ // (skip only truly empty sessions).
208
+ minContentChars: z.number().int().min(0).optional(),
209
+ triage: extractTriageGateField,
210
+ // Minimum number of new (unseen, in-window) candidate sessions below which
211
+ // the extract pass skips entirely (emits an `improve_skipped` event with
212
+ // `reason: "below_min_new_sessions"`). 0 disables the guard. Default 0
213
+ // (disabled) so existing behaviour is preserved; only opted-in profiles set it.
214
+ minNewSessions: z.number().int().min(0).optional(),
215
+ // Cap on NEW sessions processed (LLM-called) per run; the rest roll to the
216
+ // next run (still unseen). 0 disables. Absent = default 25.
217
+ maxSessionsPerRun: z.number().int().min(0).optional(),
218
+ // #561 — index agent sessions as a searchable `session` asset. Absent =
219
+ // on-when-an-LLM-is-available (fail-open when offline). COST: when on, each
220
+ // processed session makes a SECOND LLM call (the session summary) on top of
221
+ // the extraction call — i.e. ~2 LLM calls/session. Set to false to halve
222
+ // per-session extract cost at the price of unsearchable sessions.
223
+ // (Unchanged/skip sessions still cost zero — the content-hash ledger gates
224
+ // both calls upstream.)
225
+ indexSessions: z.boolean().optional(),
226
+ // #561 — minimum session duration in minutes for session indexing. 0
227
+ // disables the gate. Absent = default 5.
228
+ minSessionDuration: z.number().min(0).optional(),
229
+ };
230
+ const TRIAGE_PROCESS_FIELDS = {
231
+ applyMode: z.enum(["queue", "promote"]).optional(),
232
+ policy: z.string().min(1).optional(),
233
+ maxAcceptsPerRun: positiveInt.optional(),
234
+ maxDiffLines: positiveInt.optional(),
235
+ rejectEmpty: z.boolean().optional(),
236
+ judgment: triageJudgmentField,
237
+ };
238
+ /** proactiveMaintenance process fields (Layer 2). */
239
+ const PROACTIVE_MAINTENANCE_PROCESS_FIELDS = {
240
+ // Staleness gate + rotation cooldown in days (default 30).
241
+ dueDays: z.number().int().min(0).optional(),
242
+ // Top-N bound per run (default 25). Alias for `limit`; `maxPerRun` wins
243
+ // when both are set.
244
+ maxPerRun: positiveInt.optional(),
245
+ limit: processLimitField,
246
+ };
247
+ /**
248
+ * Shared cross-process superRefine: rejects the retired `mode`/`profile`
249
+ * knobs (top-level and inside a `judgment` sub-object) in favour of `engine`.
250
+ * Applied identically to every per-process schema and to the wide
251
+ * ImproveProcessConfigSchema.
252
+ */
253
+ function checkRetiredProcessKeys(value, ctx) {
254
+ for (const key of ["mode", "profile"]) {
255
+ if (key in value) {
256
+ ctx.addIssue({ code: z.ZodIssueCode.custom, path: [key], message: `${key} is retired; use engine` });
257
+ }
258
+ }
259
+ const judgment = value.judgment;
260
+ if (judgment) {
261
+ for (const key of ["mode", "profile"]) {
262
+ if (key in judgment) {
263
+ ctx.addIssue({
264
+ code: z.ZodIssueCode.custom,
265
+ path: ["judgment", key],
266
+ message: `${key} is retired; use engine`,
267
+ });
268
+ }
269
+ }
270
+ }
271
+ }
272
+ export const ImproveProcessConfigSchema = z
273
+ .object({
274
+ ...IMPROVE_PROCESS_BASE_FIELDS,
275
+ ...REFLECT_PROCESS_FIELDS,
276
+ ...DISTILL_PROCESS_FIELDS,
277
+ ...CONSOLIDATE_PROCESS_FIELDS,
278
+ ...MEMORY_INFERENCE_PROCESS_FIELDS,
279
+ ...GRAPH_EXTRACTION_PROCESS_FIELDS,
280
+ ...EXTRACT_PROCESS_FIELDS,
281
+ ...TRIAGE_PROCESS_FIELDS,
282
+ ...PROACTIVE_MAINTENANCE_PROCESS_FIELDS,
283
+ })
284
+ .passthrough()
285
+ .superRefine(checkRetiredProcessKeys);
286
+ /** `processes.reflect` — narrow per-process schema (WI-9.6). */
287
+ export const ReflectProcessConfigSchema = z
288
+ .object({ ...IMPROVE_PROCESS_BASE_FIELDS, ...REFLECT_PROCESS_FIELDS })
289
+ .passthrough()
290
+ .superRefine(checkRetiredProcessKeys);
291
+ /** `processes.distill` — narrow per-process schema (WI-9.6). */
292
+ export const DistillProcessConfigSchema = z
293
+ .object({ ...IMPROVE_PROCESS_BASE_FIELDS, ...DISTILL_PROCESS_FIELDS })
294
+ .passthrough()
295
+ .superRefine(checkRetiredProcessKeys);
296
+ /** `processes.consolidate` — narrow per-process schema (WI-9.6). */
297
+ export const ConsolidateProcessConfigSchema = z
298
+ .object({ ...IMPROVE_PROCESS_BASE_FIELDS, ...CONSOLIDATE_PROCESS_FIELDS })
299
+ .passthrough()
300
+ .superRefine(checkRetiredProcessKeys);
301
+ /** `processes.memoryInference` — narrow per-process schema (WI-9.6). */
302
+ export const MemoryInferenceProcessConfigSchema = z
303
+ .object({ ...IMPROVE_PROCESS_BASE_FIELDS, ...MEMORY_INFERENCE_PROCESS_FIELDS })
304
+ .passthrough()
305
+ .superRefine(checkRetiredProcessKeys);
306
+ /** `processes.graphExtraction` — narrow per-process schema (WI-9.6). */
307
+ export const GraphExtractionProcessConfigSchema = z
308
+ .object({ ...IMPROVE_PROCESS_BASE_FIELDS, ...GRAPH_EXTRACTION_PROCESS_FIELDS })
309
+ .passthrough()
310
+ .superRefine(checkRetiredProcessKeys);
311
+ /** `processes.extract` — narrow per-process schema (WI-9.6). */
312
+ export const ExtractProcessConfigSchema = z
313
+ .object({ ...IMPROVE_PROCESS_BASE_FIELDS, ...EXTRACT_PROCESS_FIELDS })
314
+ .passthrough()
315
+ .superRefine(checkRetiredProcessKeys);
316
+ /** `processes.validation` — narrow per-process schema (WI-9.6); no extra fields beyond the shared base. */
317
+ export const ValidationProcessConfigSchema = z
318
+ .object({ ...IMPROVE_PROCESS_BASE_FIELDS })
319
+ .passthrough()
320
+ .superRefine(checkRetiredProcessKeys);
321
+ /** `processes.triage` — narrow per-process schema (WI-9.6). */
322
+ export const TriageProcessConfigSchema = z
323
+ .object({ ...IMPROVE_PROCESS_BASE_FIELDS, ...TRIAGE_PROCESS_FIELDS })
324
+ .passthrough()
325
+ .superRefine(checkRetiredProcessKeys);
326
+ /** `processes.proactiveMaintenance` — narrow per-process schema (WI-9.6). */
327
+ export const ProactiveMaintenanceProcessConfigSchema = z
328
+ .object({ ...IMPROVE_PROCESS_BASE_FIELDS, ...PROACTIVE_MAINTENANCE_PROCESS_FIELDS })
329
+ .passthrough()
330
+ .superRefine(checkRetiredProcessKeys);
331
+ const ImproveProfileProcessesSchema = z
332
+ .object({
333
+ reflect: ReflectProcessConfigSchema.optional(),
334
+ distill: DistillProcessConfigSchema.optional(),
335
+ consolidate: ConsolidateProcessConfigSchema.optional(),
336
+ memoryInference: MemoryInferenceProcessConfigSchema.optional(),
337
+ graphExtraction: GraphExtractionProcessConfigSchema.optional(),
338
+ extract: ExtractProcessConfigSchema.optional(),
339
+ validation: ValidationProcessConfigSchema.optional(),
340
+ triage: TriageProcessConfigSchema.optional(),
341
+ proactiveMaintenance: ProactiveMaintenanceProcessConfigSchema.optional(),
342
+ })
343
+ .passthrough()
344
+ .superRefine((val, ctx) => {
345
+ // 0.8.0 removed the duplicated `feedbackDistillation` process key — it was
346
+ // a thin wrapper around `processes.distill.enabled`. Keep the migration
347
+ // hint so a stale config gets an actionable message rather than silently
348
+ // doing nothing. Other unknown process keys remain preserved for
349
+ // cross-version compatibility, but an enabled one is rejected below because
350
+ // this version cannot execute it.
351
+ if ("feedbackDistillation" in val) {
352
+ ctx.addIssue({
353
+ code: z.ZodIssueCode.custom,
354
+ message: "feedbackDistillation was removed in 0.8.0 — use processes.distill.enabled instead. " +
355
+ "It now controls both the orchestration gate and the LLM-call gate.",
356
+ });
357
+ }
358
+ for (const [name, process] of Object.entries(val)) {
359
+ if (!(name in IMPROVE_PROCESS_ENGINE_CAPABILITIES) &&
360
+ process !== null &&
361
+ typeof process === "object" &&
362
+ process.enabled === true) {
363
+ ctx.addIssue({
364
+ code: z.ZodIssueCode.custom,
365
+ path: [name],
366
+ message: `Unknown enabled improve process "${name}"`,
367
+ });
368
+ }
369
+ }
370
+ });
371
+ export const ImproveProfileConfigSchema = z
372
+ .object({
373
+ engine: engineName.optional(),
374
+ model: nonEmptyString.optional(),
375
+ timeoutMs: z.union([positiveInt, z.null()]).optional(),
376
+ llm: LlmInvocationOverridesSchema.optional(),
377
+ description: z.string().min(1).optional(),
378
+ processes: ImproveProfileProcessesSchema.optional(),
379
+ limit: positiveInt.optional(),
380
+ sync: z
381
+ .object({
382
+ enabled: z.boolean().optional(),
383
+ push: z.boolean().optional(),
384
+ message: z.string().min(1).optional(),
385
+ })
386
+ .passthrough()
387
+ .optional(),
388
+ })
389
+ .passthrough();