akm-cli 0.9.1 → 0.9.2-alpha.2

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 (350) hide show
  1. package/CHANGELOG.md +103 -28
  2. package/README.md +3 -1
  3. package/SECURITY.md +1 -1
  4. package/STABILITY.md +1 -1
  5. package/dist/akm +2 -2
  6. package/dist/akm-migrate +2 -2
  7. package/dist/assets/hints/cli-hints-full.md +14 -9
  8. package/dist/assets/improve-strategies/proactive-maintenance.json +1 -1
  9. package/dist/assets/improve-strategies/reflect-distill.json +1 -1
  10. package/dist/assets/models.json +35 -0
  11. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +3 -4
  12. package/dist/assets/stash-skeleton/facts/conventions/organization.md +1 -3
  13. package/dist/assets/tasks/core/extract.yml +6 -5
  14. package/dist/assets/tasks/core/improve.yml +6 -5
  15. package/dist/assets/tasks/core/index-refresh.yml +6 -5
  16. package/dist/assets/tasks/core/sync.yml +6 -5
  17. package/dist/assets/tasks/core/version-check.yml +6 -5
  18. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +6 -5
  19. package/dist/assets/tasks/improve/akm-improve-catchup.yml +6 -5
  20. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +6 -5
  21. package/dist/assets/tasks/improve/akm-improve-frequent.yml +6 -5
  22. package/dist/assets/tasks/improve/akm-improve-nightly.yml +6 -5
  23. package/dist/cli/confirm.js +2 -2
  24. package/dist/cli/parse-args.js +3 -24
  25. package/dist/cli/retired-commands.js +1 -1
  26. package/dist/cli/shared.js +2 -2
  27. package/dist/cli.js +11 -9
  28. package/dist/commands/agent/agent-dispatch.js +55 -89
  29. package/dist/commands/agent/contribute-cli.js +12 -45
  30. package/dist/commands/command/builtin-action.js +32 -0
  31. package/dist/commands/command/command-cli.js +99 -0
  32. package/dist/commands/command/command-execution.js +308 -0
  33. package/dist/commands/command/execution-source-loader.js +176 -0
  34. package/dist/commands/command/portable-template.js +60 -0
  35. package/dist/commands/config-cli.js +10 -4
  36. package/dist/commands/env/env.js +4 -2
  37. package/dist/commands/feedback-cli.js +1 -1
  38. package/dist/commands/health/checks.js +241 -29
  39. package/dist/commands/health/html-report.js +0 -14
  40. package/dist/commands/health/report-view-model.js +0 -1
  41. package/dist/commands/health/surfaces.js +6 -7
  42. package/dist/commands/health/types.js +0 -2
  43. package/dist/commands/health.js +63 -18
  44. package/dist/commands/improve/collapse-detector.js +5 -6
  45. package/dist/commands/improve/consolidate.js +251 -214
  46. package/dist/commands/improve/distill/promote-memory.js +71 -34
  47. package/dist/commands/improve/distill/quality-gate.js +17 -5
  48. package/dist/commands/improve/distill.js +232 -155
  49. package/dist/commands/improve/eligibility.js +112 -79
  50. package/dist/commands/improve/execution.js +57 -0
  51. package/dist/commands/improve/extract-cli.js +5 -5
  52. package/dist/commands/improve/extract-prompt.js +64 -22
  53. package/dist/commands/improve/extract.js +608 -360
  54. package/dist/commands/improve/improve-strategies.js +43 -14
  55. package/dist/commands/improve/improve.js +249 -29
  56. package/dist/commands/improve/loop-stages.js +11 -17
  57. package/dist/commands/improve/memory/memory-contradiction-detect.js +90 -66
  58. package/dist/commands/improve/outcome-loop.js +22 -38
  59. package/dist/commands/improve/planner.js +134 -0
  60. package/dist/commands/improve/preparation.js +730 -409
  61. package/dist/commands/improve/reflect.js +386 -223
  62. package/dist/commands/improve/run-context.js +3 -4
  63. package/dist/commands/improve/salience.js +6 -58
  64. package/dist/commands/improve/session-asset.js +12 -12
  65. package/dist/commands/lint/index.js +101 -29
  66. package/dist/commands/migrate-cli.js +11 -69
  67. package/dist/commands/migration-tool.js +6 -9
  68. package/dist/commands/models-cli.js +27 -0
  69. package/dist/commands/proposal/drain.js +258 -186
  70. package/dist/commands/proposal/proposal-cli.js +32 -10
  71. package/dist/commands/proposal/proposal.js +2 -5
  72. package/dist/commands/proposal/propose.js +192 -172
  73. package/dist/commands/proposal/repository.js +54 -91
  74. package/dist/commands/proposal/validators/proposal-validators.js +9 -7
  75. package/dist/commands/read/curate.js +53 -22
  76. package/dist/commands/read/registry-search.js +25 -9
  77. package/dist/commands/read/remember-cli.js +14 -2
  78. package/dist/commands/read/search.js +10 -4
  79. package/dist/commands/read/show.js +139 -153
  80. package/dist/commands/registry-cli.js +16 -7
  81. package/dist/commands/remember.js +33 -18
  82. package/dist/commands/sources/add-cli.js +19 -178
  83. package/dist/commands/sources/bundle-cli.js +15 -3
  84. package/dist/commands/sources/dangerous-env-audit.js +135 -0
  85. package/dist/commands/sources/info.js +2 -1
  86. package/dist/commands/sources/installed-stashes.js +901 -177
  87. package/dist/commands/sources/schema-repair.js +174 -95
  88. package/dist/commands/sources/self-update.js +30 -74
  89. package/dist/commands/sources/source-add.js +3 -5
  90. package/dist/commands/sources/sources-cli.js +2 -15
  91. package/dist/commands/sources/update-transaction.js +220 -0
  92. package/dist/commands/tasks/tasks-cli.js +3 -3
  93. package/dist/commands/tasks/tasks.js +736 -317
  94. package/dist/commands/workflow-cli.js +2 -2
  95. package/dist/core/adapter/adapters/agent-skills-adapter.js +3 -0
  96. package/dist/core/adapter/adapters/akm-adapter.js +85 -35
  97. package/dist/core/adapter/adapters/akm-lint.js +54 -39
  98. package/dist/core/adapter/adapters/akm-metadata.js +45 -45
  99. package/dist/core/adapter/adapters/akm-task-adapter.js +32 -49
  100. package/dist/core/adapter/adapters/akm-workflow-adapter.js +38 -23
  101. package/dist/core/adapter/adapters/dotenv-adapter.js +30 -1
  102. package/dist/core/adapter/adapters/generic-files-adapter.js +11 -0
  103. package/dist/core/adapter/adapters/index.js +0 -9
  104. package/dist/core/adapter/adapters/llm-wiki-adapter.js +4 -0
  105. package/dist/core/adapter/adapters/okf-adapter.js +4 -0
  106. package/dist/core/adapter/adapters/opencode-adapter.js +5 -8
  107. package/dist/core/adapter/adapters/tool-dir-shared.js +63 -6
  108. package/dist/core/adapter/adapters/website-snapshot-adapter.js +4 -0
  109. package/dist/core/adapter/execution-source.js +308 -0
  110. package/dist/core/adapter/recognize-match.js +36 -13
  111. package/dist/core/adapter/registry.js +0 -9
  112. package/dist/core/asset/stash-meta.js +94 -4
  113. package/dist/core/common.js +6 -11
  114. package/dist/core/config/config-io.js +3 -3
  115. package/dist/core/config/config-schema.js +18 -40
  116. package/dist/core/config/config-sources.js +11 -21
  117. package/dist/core/config/config-walker.js +31 -13
  118. package/dist/core/config/config.js +23 -26
  119. package/dist/core/config/schema/engines.js +8 -7
  120. package/dist/core/config/schema/improve-processes.js +29 -5
  121. package/dist/core/config/schema/index-config.js +0 -27
  122. package/dist/core/config/schema/primitives.js +1 -23
  123. package/dist/core/config/schema/sources-bundles.js +13 -16
  124. package/dist/core/errors.js +2 -0
  125. package/dist/core/events.js +68 -32
  126. package/dist/core/extra-params.js +1 -0
  127. package/dist/core/improve-result.js +315 -0
  128. package/dist/core/lesson-lint.js +0 -6
  129. package/dist/core/maintenance-barrier.js +4 -4
  130. package/dist/core/network-policy.js +152 -0
  131. package/dist/core/paths.js +1 -1
  132. package/dist/core/recognition-util.js +4 -4
  133. package/dist/core/registry-url.js +456 -0
  134. package/dist/core/state/migrations.js +161 -47
  135. package/dist/core/state-db.js +453 -80
  136. package/dist/core/system-error.js +32 -0
  137. package/dist/core/time.js +2 -12
  138. package/dist/core/write-source.js +0 -18
  139. package/dist/execution/directory-identity.js +52 -0
  140. package/dist/execution/executable-identity.js +107 -0
  141. package/dist/execution/guarded-source.js +398 -0
  142. package/dist/execution/json.js +95 -0
  143. package/dist/{commands/health/types-session-log.js → execution/limits.js} +2 -1
  144. package/dist/execution/record.js +55 -0
  145. package/dist/execution/resolved-request.js +730 -0
  146. package/dist/execution/source.js +320 -0
  147. package/dist/indexer/bundle-identity-guard.js +5 -4
  148. package/dist/indexer/db/graph-db.js +33 -0
  149. package/dist/indexer/graph/graph-boost.js +3 -4
  150. package/dist/indexer/graph/graph-extraction.js +562 -373
  151. package/dist/indexer/index-written-assets.js +78 -39
  152. package/dist/indexer/indexer.js +471 -432
  153. package/dist/indexer/installations.js +6 -0
  154. package/dist/indexer/lookup/adapter-concept-owner.js +283 -0
  155. package/dist/indexer/materialize-embeddings.js +155 -0
  156. package/dist/indexer/passes/memory-inference.js +227 -174
  157. package/dist/indexer/passes/metadata.js +263 -118
  158. package/dist/indexer/scan/doc-to-entry.js +7 -10
  159. package/dist/indexer/scan/drain-dir.js +51 -23
  160. package/dist/indexer/search/db-search.js +156 -50
  161. package/dist/indexer/search/fts-query.js +40 -40
  162. package/dist/indexer/search/ranking.js +36 -1
  163. package/dist/indexer/search/search-attribution.js +3 -1
  164. package/dist/indexer/search/search-fields.js +23 -14
  165. package/dist/indexer/search/search-hit-enrichers.js +1 -1
  166. package/dist/indexer/search/search-source.js +7 -16
  167. package/dist/indexer/search/semantic-status.js +10 -1
  168. package/dist/indexer/usage/show-usage.js +105 -0
  169. package/dist/indexer/usage/usage-events.js +7 -2
  170. package/dist/indexer/walk/matchers.js +40 -10
  171. package/dist/indexer/walk/path-resolver.js +5 -2
  172. package/dist/indexer/walk/walker.js +20 -2
  173. package/dist/integrations/agent/builder-shared.js +3 -6
  174. package/dist/integrations/agent/conversation-fallback.js +16 -0
  175. package/dist/integrations/agent/engine-resolution.js +87 -87
  176. package/dist/integrations/agent/execution-cascade.js +566 -0
  177. package/dist/integrations/agent/execution-definitions.js +211 -0
  178. package/dist/integrations/agent/execution-lowering.js +811 -0
  179. package/dist/integrations/agent/execution-preparation.js +67 -0
  180. package/dist/integrations/agent/index.js +0 -2
  181. package/dist/integrations/agent/inline-execution.js +74 -0
  182. package/dist/integrations/agent/model-map.js +515 -0
  183. package/dist/integrations/agent/persona-fallback.js +30 -0
  184. package/dist/integrations/agent/request-lowering.js +186 -0
  185. package/dist/integrations/agent/runner-dispatch.js +230 -37
  186. package/dist/integrations/agent/runner.js +12 -83
  187. package/dist/integrations/harnesses/aider/agent-builder.js +8 -0
  188. package/dist/integrations/harnesses/aider/index.js +0 -1
  189. package/dist/integrations/harnesses/amazonq/agent-builder.js +8 -0
  190. package/dist/integrations/harnesses/amazonq/index.js +0 -1
  191. package/dist/integrations/harnesses/claude/agent-builder.js +14 -1
  192. package/dist/integrations/harnesses/claude/index.js +1 -5
  193. package/dist/integrations/harnesses/claude/session-log.js +3 -33
  194. package/dist/integrations/harnesses/codex/agent-builder.js +8 -0
  195. package/dist/integrations/harnesses/codex/index.js +0 -1
  196. package/dist/integrations/harnesses/copilot/agent-builder.js +8 -0
  197. package/dist/integrations/harnesses/copilot/index.js +0 -1
  198. package/dist/integrations/harnesses/gemini/agent-builder.js +8 -0
  199. package/dist/integrations/harnesses/gemini/index.js +0 -1
  200. package/dist/integrations/harnesses/index.js +4 -44
  201. package/dist/integrations/harnesses/opencode/agent-builder.js +16 -9
  202. package/dist/integrations/harnesses/opencode/index.js +0 -2
  203. package/dist/integrations/harnesses/opencode/session-log.js +14 -204
  204. package/dist/integrations/harnesses/opencode-sdk/harness.js +12 -1
  205. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +40 -42
  206. package/dist/integrations/harnesses/openhands/agent-builder.js +8 -0
  207. package/dist/integrations/harnesses/openhands/index.js +0 -1
  208. package/dist/integrations/harnesses/pi/agent-builder.js +8 -0
  209. package/dist/integrations/harnesses/pi/index.js +0 -1
  210. package/dist/integrations/harnesses/shared.js +0 -1
  211. package/dist/integrations/harnesses/types.js +1 -3
  212. package/dist/integrations/lockfile.js +82 -79
  213. package/dist/integrations/session-logs/index.js +6 -17
  214. package/dist/integrations/session-logs/provider-base.js +1 -29
  215. package/dist/llm/client.js +10 -5
  216. package/dist/llm/embedder.js +6 -7
  217. package/dist/llm/embedders/local.js +37 -88
  218. package/dist/llm/embedders/types.js +1 -1
  219. package/dist/llm/graph-extract.js +75 -50
  220. package/dist/llm/index-passes.js +43 -5
  221. package/dist/llm/memory-infer.js +8 -6
  222. package/dist/llm/metadata-enhance.js +5 -3
  223. package/dist/llm/structured-call.js +122 -25
  224. package/dist/output/format-exempt.js +1 -1
  225. package/dist/output/render-registry.js +0 -16
  226. package/dist/output/renderers.js +12 -7
  227. package/dist/output/shapes/curate.js +1 -0
  228. package/dist/output/shapes/helpers.js +10 -2
  229. package/dist/output/shapes/passthrough.js +2 -0
  230. package/dist/output/text/command-format.js +31 -33
  231. package/dist/output/text/health-format.js +1 -29
  232. package/dist/output/text/migrate.js +6 -56
  233. package/dist/output/text/proposal-format.js +16 -1
  234. package/dist/output/text/workflow-format.js +16 -0
  235. package/dist/registry/network.js +279 -0
  236. package/dist/registry/pinned-request-helper.js +247 -0
  237. package/dist/registry/pinned-transport.js +717 -0
  238. package/dist/registry/providers/skills-sh.js +18 -6
  239. package/dist/registry/providers/static-index.js +20 -7
  240. package/dist/registry/resolve.js +53 -28
  241. package/dist/scripts/akm-migrate-node.js +19334 -52269
  242. package/dist/scripts/akm-migrate.js +19270 -51612
  243. package/dist/setup/registry-stash-loader.js +64 -20
  244. package/dist/setup/semantic-assets.js +9 -34
  245. package/dist/setup/setup.js +12 -30
  246. package/dist/setup/source-identity.js +17 -0
  247. package/dist/setup/steps/sources.js +36 -15
  248. package/dist/setup/steps/tasks.js +39 -11
  249. package/dist/sources/providers/git-provider.js +3 -3
  250. package/dist/sources/providers/npm.js +2 -2
  251. package/dist/sources/providers/provider-utils.js +4 -3
  252. package/dist/sources/providers/website.js +11 -7
  253. package/dist/sources/snapshot-fetchers/host-guard.js +9 -136
  254. package/dist/sources/snapshot-fetchers/website-ingest.js +25 -109
  255. package/dist/sources/website-url.js +73 -0
  256. package/dist/storage/engines/sqlite-migrations.js +81 -26
  257. package/dist/storage/managed-db.js +27 -24
  258. package/dist/storage/repositories/events-repository.js +3 -0
  259. package/dist/storage/repositories/index-connection.js +42 -10
  260. package/dist/storage/repositories/index-entries-repository.js +203 -229
  261. package/dist/storage/repositories/index-entry-mapper.js +8 -12
  262. package/dist/storage/repositories/index-entry-schema.js +255 -0
  263. package/dist/storage/repositories/index-fts-repository.js +64 -71
  264. package/dist/storage/repositories/index-llm-cache-repository.js +8 -13
  265. package/dist/storage/repositories/index-meta-repository.js +0 -11
  266. package/dist/storage/repositories/index-schema.js +74 -350
  267. package/dist/storage/repositories/index-utility-repository.js +12 -17
  268. package/dist/storage/repositories/index-vec-repository.js +56 -7
  269. package/dist/storage/repositories/proposals-repository.js +4 -127
  270. package/dist/storage/repositories/registry-cache.js +2 -1
  271. package/dist/storage/repositories/task-history-repository.js +20 -40
  272. package/dist/storage/repositories/workflow-runs-repository.js +228 -129
  273. package/dist/storage/sqlite-read-snapshot.js +148 -0
  274. package/dist/tasks/backends/cron.js +170 -42
  275. package/dist/tasks/backends/index.js +1 -1
  276. package/dist/tasks/backends/launchd.js +787 -202
  277. package/dist/tasks/backends/schtasks.js +282 -83
  278. package/dist/tasks/embedded.js +7 -7
  279. package/dist/tasks/frozen-script.js +50 -0
  280. package/dist/tasks/resolve-akm-bin.js +5 -1
  281. package/dist/tasks/runner.js +239 -251
  282. package/dist/tasks/runtime-v3.js +281 -0
  283. package/dist/tasks/scheduler-binding.js +272 -0
  284. package/dist/tasks/scheduler-invocation.js +57 -43
  285. package/dist/tasks/scheduler-sync.js +654 -0
  286. package/dist/tasks/source-v3.js +752 -0
  287. package/dist/tasks/standalone-script-entry.js +5 -0
  288. package/dist/tasks/task-id.js +29 -0
  289. package/dist/workflows/authoring/authoring.js +15 -32
  290. package/dist/workflows/exec/dispatch-redaction.js +14 -8
  291. package/dist/workflows/exec/exec-unit.js +7 -28
  292. package/dist/workflows/exec/frozen-judge.js +57 -89
  293. package/dist/workflows/exec/lowering-notices.js +23 -0
  294. package/dist/workflows/exec/native-executor.js +301 -458
  295. package/dist/workflows/exec/param-secrets.js +4 -3
  296. package/dist/workflows/exec/run-workflow.js +26 -32
  297. package/dist/workflows/exec/step-work.js +105 -109
  298. package/dist/workflows/exec/unit-dispatch.js +103 -27
  299. package/dist/workflows/exec/unit-writer.js +3 -3
  300. package/dist/workflows/exec/worktree.js +2 -2
  301. package/dist/workflows/ir/compile.js +86 -72
  302. package/dist/workflows/ir/environment-v4.js +328 -0
  303. package/dist/workflows/ir/freeze-v4.js +122 -0
  304. package/dist/workflows/ir/plan-hash.js +13 -7
  305. package/dist/workflows/ir/schema-v4.js +525 -0
  306. package/dist/workflows/ir/schema.js +25 -284
  307. package/dist/workflows/ir/source-freeze-v4.js +506 -0
  308. package/dist/workflows/parser.js +27 -24
  309. package/dist/workflows/program/schema.js +1 -2
  310. package/dist/workflows/renderer.js +42 -29
  311. package/dist/workflows/resource-limits.js +4 -5
  312. package/dist/workflows/runtime/agent-identity.js +11 -13
  313. package/dist/workflows/runtime/plan-classifier.js +8 -8
  314. package/dist/workflows/runtime/runs.js +27 -43
  315. package/dist/workflows/runtime/workflow-asset-loader.js +45 -205
  316. package/dist/workflows/source-files.js +373 -0
  317. package/dist/workflows/source-ir/compile.js +196 -0
  318. package/dist/workflows/source-ir/github-yaml.js +577 -0
  319. package/dist/workflows/source-ir/ordering.js +38 -0
  320. package/dist/workflows/source-ir/program.js +50 -0
  321. package/dist/workflows/source-ir/result.js +26 -0
  322. package/dist/workflows/source-ir/schema.js +772 -0
  323. package/dist/workflows/source-ir/semantics.js +242 -0
  324. package/dist/workflows/source-ir/uses.js +14 -0
  325. package/docs/README.md +2 -0
  326. package/docs/migration/README.md +3 -1
  327. package/docs/migration/release-notes/0.9.2.md +55 -0
  328. package/docs/migration/release-notes/README.md +5 -0
  329. package/docs/migration/v0.8-to-v0.9.md +76 -1077
  330. package/docs/migration/v0.9.0-troubleshooting.md +104 -516
  331. package/docs/migration/v0.9.1-to-v0.9.2.md +150 -0
  332. package/docs/reference/README.md +1 -0
  333. package/docs/reference/cli.md +230 -98
  334. package/docs/reference/configuration.md +159 -36
  335. package/docs/reference/data-and-telemetry.md +19 -1
  336. package/docs/reference/supported-formats.md +23 -3
  337. package/docs/reference/tasks.md +182 -0
  338. package/docs/reference/workflow-schema.md +91 -40
  339. package/docs/reference/workflows.md +33 -6
  340. package/package.json +10 -6
  341. package/schemas/akm-config.json +372 -224
  342. package/schemas/akm-task.json +324 -80
  343. package/schemas/akm-workflow.json +6 -9
  344. package/dist/core/migration-operation.js +0 -75
  345. package/dist/integrations/agent/model-aliases.js +0 -74
  346. package/dist/tasks/parser.js +0 -380
  347. package/dist/tasks/schema.js +0 -123
  348. package/dist/tasks/validator.js +0 -80
  349. package/dist/workflows/ir/freeze.js +0 -320
  350. package/dist/workflows/runtime/document-cache.js +0 -13
@@ -1,109 +1,353 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "$id": "https://itlackey.github.io/akm/schemas/akm-task.json",
4
- "title": "AKM Scheduled Task",
5
- "description": "Strict version-2 YAML task definition. Exactly one target is required.",
4
+ "title": "AKM Task v3",
5
+ "description": "Strict task-v3 source document. Exactly one executable selector and exactly one scheduling source are required. GitHub action refs are recognized source syntax but are not executed by AKM 0.9.2.",
6
+ "x-akm-runtimeConstraints": {
7
+ "authoritativeParser": "src/tasks/source-v3.ts",
8
+ "maxSourceUtf8Bytes": 1048576,
9
+ "maxStringUtf8Bytes": 262144,
10
+ "maxJsonDepth": 64,
11
+ "maxJsonNodes": 10000,
12
+ "canonicalRefsRequireNfc": true,
13
+ "workingDirectoryRequiresWorkspaceRoot": true
14
+ },
6
15
  "type": "object",
7
- "required": ["version", "schedule"],
16
+ "required": ["version"],
8
17
  "additionalProperties": false,
9
18
  "properties": {
10
- "version": { "const": 2 },
11
- "name": { "type": "string" },
12
- "description": { "type": "string" },
13
- "when_to_use": { "type": "string" },
14
- "tags": { "type": "array", "items": { "type": "string", "minLength": 1 } },
15
- "schedule": { "type": "string", "minLength": 1 },
16
- "enabled": { "type": "boolean" },
17
- "workflow": { "type": "string", "minLength": 1 },
18
- "prompt": { "type": "string", "minLength": 1 },
19
- "command": {
19
+ "version": { "const": 3 },
20
+ "name": { "type": "string", "maxLength": 262144 },
21
+ "uses": {
20
22
  "oneOf": [
21
- { "type": "string", "minLength": 1 },
22
- { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } }
23
+ { "const": "akm/command" },
24
+ { "$ref": "#/definitions/akmExecutableRef" },
25
+ { "$ref": "#/definitions/githubActionRef" }
23
26
  ]
24
27
  },
25
- "params": { "type": "object" },
26
- "engine": { "type": "string", "minLength": 1 },
27
- "model": { "type": "string", "minLength": 1 },
28
- "timeoutMs": {
29
- "type": ["integer", "null"],
30
- "minimum": 1,
31
- "maximum": 2147483647,
32
- "description": "Timeout in milliseconds, or null to disable it. Prompt tasks: the engine timeout. Command tasks: the subprocess timeout. Workflow tasks: the whole-run timeout — omit it to take the unattended default (DEFAULT_WORKFLOW_TASK_TIMEOUT_MS in src/tasks/runner.ts), null to run unbounded."
33
- },
34
- "maxSteps": {
35
- "type": "integer",
36
- "minimum": 1,
37
- "description": "Workflow tasks only: stop after executing this many workflow steps (`akm workflow run --max-steps`)."
38
- },
39
- "maxRetries": {
40
- "type": "integer",
41
- "minimum": 0,
42
- "maximum": 100,
43
- "description": "Workflow tasks only: retry a failed workflow step this many additional times (`akm workflow run --max-retries`)."
44
- },
45
- "llm": { "$ref": "#/definitions/llm" },
46
- "redact": {
47
- "type": "array",
48
- "maxItems": 32,
49
- "items": { "type": "string", "pattern": "^[A-Za-z_][A-Za-z0-9_]*$" },
50
- "description": "NAMES ONLY: environment variable names whose values are scrubbed from this task's persisted run log and logs.db rows. Values never appear in a task file — a task file is indexed, searchable, and printed verbatim by `akm show`, so a literal secret here would leak more widely than the redaction closes. akm already scrubs config-declared credentials and infers others from the variable name; this is the escape hatch for a secret exported under a name none of those rules recognise. A name unset at run time contributes nothing."
28
+ "run": { "$ref": "#/definitions/nonemptyLiteral" },
29
+ "with": { "$ref": "#/definitions/jsonObject" },
30
+ "env": {
31
+ "type": "object",
32
+ "maxProperties": 256,
33
+ "propertyNames": { "pattern": "^[A-Za-z_][A-Za-z0-9_]*$" },
34
+ "additionalProperties": {
35
+ "oneOf": [
36
+ { "type": "string", "maxLength": 262144 },
37
+ { "type": "number" },
38
+ { "type": "boolean" }
39
+ ]
40
+ }
41
+ },
42
+ "shell": { "enum": ["bash", "sh", "zsh", "pwsh", "powershell", "cmd"] },
43
+ "working-directory": {
44
+ "type": "string",
45
+ "minLength": 1,
46
+ "maxLength": 262144,
47
+ "pattern": "^(?![\\\\/])(?![A-Za-z]:[\\\\/])(?!.*(?:^|[\\\\/])\\.\\.(?:[\\\\/]|$))(?!.*[\\\\/]{2})(?!.*[\\\\/]$)[^\\u0000]+$"
48
+ },
49
+ "akm": {
50
+ "type": "object",
51
+ "additionalProperties": false,
52
+ "properties": {
53
+ "schedule": { "$ref": "#/definitions/nonemptyLiteral" },
54
+ "enabled": { "type": "boolean" },
55
+ "description": { "type": "string", "maxLength": 262144 },
56
+ "when_to_use": { "type": "string", "maxLength": 262144 },
57
+ "tags": {
58
+ "type": "array",
59
+ "maxItems": 1024,
60
+ "items": { "type": "string", "minLength": 1, "maxLength": 262144 }
61
+ },
62
+ "agent": { "$ref": "#/definitions/nullableSelector" },
63
+ "engine": { "$ref": "#/definitions/nullableSelector" },
64
+ "model": { "$ref": "#/definitions/nullableSelector" },
65
+ "inference": {
66
+ "oneOf": [
67
+ { "$ref": "#/definitions/jsonObject" },
68
+ { "type": "null" }
69
+ ]
70
+ },
71
+ "outputSchema": {
72
+ "description": "A JSON Schema accepted by AKM's bounded execution-schema subset, or null. Runtime byte, depth, and node limits are declared by x-akm-runtimeConstraints.",
73
+ "oneOf": [
74
+ { "$ref": "#/definitions/outputSchemaDefinition" },
75
+ { "type": "null" }
76
+ ]
77
+ },
78
+ "tools": {
79
+ "oneOf": [
80
+ { "type": "string", "maxLength": 262144 },
81
+ {
82
+ "type": "array",
83
+ "maxItems": 1024,
84
+ "items": { "type": "string", "maxLength": 262144 }
85
+ },
86
+ { "$ref": "#/definitions/jsonObject" },
87
+ { "type": "null" }
88
+ ]
89
+ },
90
+ "timeout": {
91
+ "oneOf": [
92
+ { "type": "integer", "minimum": 0, "maximum": 2147483647 },
93
+ { "type": "string", "pattern": "^\\d+[mMhHdD]$" },
94
+ { "type": "null" }
95
+ ]
96
+ },
97
+ "redact": {
98
+ "type": "array",
99
+ "maxItems": 32,
100
+ "uniqueItems": true,
101
+ "items": { "type": "string", "pattern": "^[A-Za-z_][A-Za-z0-9_]*$" }
102
+ },
103
+ "maxSteps": { "type": "integer", "minimum": 1, "maximum": 9007199254740991 },
104
+ "maxRetries": { "type": "integer", "minimum": 0, "maximum": 100 }
105
+ }
106
+ },
107
+ "on": {
108
+ "type": "object",
109
+ "minProperties": 1,
110
+ "additionalProperties": false,
111
+ "properties": {
112
+ "schedule": {
113
+ "type": "array",
114
+ "minItems": 1,
115
+ "maxItems": 64,
116
+ "items": {
117
+ "type": "object",
118
+ "required": ["cron"],
119
+ "additionalProperties": false,
120
+ "properties": {
121
+ "cron": { "$ref": "#/definitions/nonemptyLiteral" }
122
+ }
123
+ }
124
+ },
125
+ "workflow_dispatch": {
126
+ "oneOf": [
127
+ { "type": "null" },
128
+ { "type": "object", "maxProperties": 0, "additionalProperties": false }
129
+ ]
130
+ }
131
+ }
51
132
  }
52
133
  },
53
134
  "oneOf": [
54
135
  {
55
- "required": ["workflow"],
56
- "not": { "anyOf": [{ "required": ["prompt"] }, { "required": ["command"] }, { "required": ["engine"] }, { "required": ["model"] }, { "required": ["llm"] }] }
136
+ "description": "AKM's built-in anonymous/stored command action.",
137
+ "required": ["uses", "with"],
138
+ "properties": {
139
+ "uses": { "const": "akm/command" },
140
+ "with": { "$ref": "#/definitions/builtinCommandWith" }
141
+ },
142
+ "not": {
143
+ "anyOf": [
144
+ { "required": ["run"] },
145
+ { "required": ["shell"] },
146
+ { "required": ["working-directory"] }
147
+ ]
148
+ }
57
149
  },
58
150
  {
59
- "required": ["prompt"],
60
- "not": { "anyOf": [{ "required": ["workflow"] }, { "required": ["command"] }, { "required": ["params"] }, { "required": ["maxSteps"] }, { "required": ["maxRetries"] }] }
151
+ "description": "A canonical AKM executable ref or GitHub action ref.",
152
+ "required": ["uses"],
153
+ "properties": {
154
+ "uses": {
155
+ "oneOf": [
156
+ { "$ref": "#/definitions/akmExecutableRef" },
157
+ { "$ref": "#/definitions/githubActionRef" }
158
+ ]
159
+ }
160
+ },
161
+ "not": {
162
+ "anyOf": [
163
+ { "required": ["run"] },
164
+ { "required": ["shell"] },
165
+ { "required": ["working-directory"] }
166
+ ]
167
+ }
61
168
  },
62
169
  {
63
- "required": ["command"],
64
- "not": { "anyOf": [{ "required": ["workflow"] }, { "required": ["prompt"] }, { "required": ["params"] }, { "required": ["engine"] }, { "required": ["model"] }, { "required": ["llm"] }, { "required": ["maxSteps"] }, { "required": ["maxRetries"] }] }
170
+ "description": "One exact host-shell string.",
171
+ "required": ["run"],
172
+ "not": {
173
+ "anyOf": [
174
+ { "required": ["uses"] },
175
+ { "required": ["with"] }
176
+ ]
177
+ }
178
+ }
179
+ ],
180
+ "allOf": [
181
+ {
182
+ "description": "Exactly one scheduling source: akm.schedule or on.",
183
+ "oneOf": [
184
+ {
185
+ "required": ["akm"],
186
+ "properties": { "akm": { "required": ["schedule"] } },
187
+ "not": { "required": ["on"] }
188
+ },
189
+ {
190
+ "required": ["on"],
191
+ "not": {
192
+ "required": ["akm"],
193
+ "properties": { "akm": { "required": ["schedule"] } }
194
+ }
195
+ }
196
+ ]
65
197
  }
66
198
  ],
67
199
  "definitions": {
68
- "llm": {
200
+ "nonemptyLiteral": {
201
+ "type": "string",
202
+ "minLength": 1,
203
+ "maxLength": 262144,
204
+ "pattern": "^(?![\\s\\S]*\\$\\{\\{)[\\s\\S]*\\S[\\s\\S]*$"
205
+ },
206
+ "nullableSelector": {
207
+ "oneOf": [
208
+ { "type": "string", "minLength": 1, "maxLength": 262144, "pattern": ".*\\S.*" },
209
+ { "type": "null" }
210
+ ]
211
+ },
212
+ "akmExecutableRef": {
213
+ "type": "string",
214
+ "maxLength": 262144,
215
+ "pattern": "^(?:[^\\s:.#/]+//)?(?:commands|workflows|scripts)/(?!\\.{1,2}(?:/|$))[^\\s#\\\\/\\u0000]+(?:/(?!\\.{1,2}(?:/|$))[^\\s#\\\\/\\u0000]+)*$"
216
+ },
217
+ "githubActionRef": {
218
+ "type": "string",
219
+ "maxLength": 262144,
220
+ "pattern": "^(?!(?:commands|workflows|scripts)/)[A-Za-z0-9](?:[A-Za-z0-9-]{0,37}[A-Za-z0-9])?/(?!\\.{1,2}(?:/|@))[A-Za-z0-9_.-]+(?:/(?!\\.{1,2}(?:/|@))[A-Za-z0-9_.-]+)*@(?![./])(?!.*(?:@|\\.\\.|//|/\\.|\\.(?:/|$)|\\.lock(?:/|$)))[^\\s\\u0000-\\u0020\\u007f~^:?*\\[\\\\/](?:[^\\s\\u0000-\\u0020\\u007f~^:?*\\[\\\\@]*[^\\s\\u0000-\\u0020\\u007f~^:?*\\[\\\\/.@])?$"
221
+ },
222
+ "outputSchemaDefinition": {
69
223
  "type": "object",
70
- "additionalProperties": false,
224
+ "maxProperties": 256,
71
225
  "properties": {
72
- "temperature": { "type": "number" },
73
- "maxTokens": { "type": "integer", "minimum": 1 },
74
- "supportsJsonSchema": { "type": "boolean" },
75
- "extraParams": { "$ref": "#/definitions/extraParams" },
76
- "contextLength": { "type": "integer", "minimum": 1 },
77
- "enableThinking": { "type": "boolean" }
78
- }
226
+ "type": {
227
+ "oneOf": [
228
+ { "$ref": "#/definitions/outputSchemaTypeName" },
229
+ {
230
+ "type": "array",
231
+ "minItems": 1,
232
+ "maxItems": 1024,
233
+ "items": { "$ref": "#/definitions/outputSchemaTypeName" }
234
+ }
235
+ ]
236
+ },
237
+ "enum": {
238
+ "type": "array",
239
+ "minItems": 1,
240
+ "maxItems": 1024,
241
+ "items": {
242
+ "oneOf": [
243
+ { "type": "string", "maxLength": 262144 },
244
+ { "type": "number" },
245
+ { "type": "boolean" },
246
+ { "type": "null" }
247
+ ]
248
+ }
249
+ },
250
+ "properties": {
251
+ "type": "object",
252
+ "maxProperties": 256,
253
+ "propertyNames": { "maxLength": 262144 },
254
+ "additionalProperties": { "$ref": "#/definitions/outputSchemaDefinition" }
255
+ },
256
+ "required": {
257
+ "type": "array",
258
+ "maxItems": 1024,
259
+ "items": { "type": "string", "maxLength": 262144 }
260
+ },
261
+ "items": { "$ref": "#/definitions/outputSchemaDefinition" },
262
+ "additionalProperties": { "type": "boolean" },
263
+ "minItems": { "type": "integer", "minimum": 0 },
264
+ "maxItems": { "type": "integer", "minimum": 0 },
265
+ "minLength": { "type": "integer", "minimum": 0 },
266
+ "maxLength": { "type": "integer", "minimum": 0 },
267
+ "minimum": { "type": "number" },
268
+ "maximum": { "type": "number" },
269
+ "allOf": { "$ref": "#/definitions/outputSchemaArray" },
270
+ "anyOf": { "$ref": "#/definitions/outputSchemaArray" },
271
+ "oneOf": { "$ref": "#/definitions/outputSchemaArray" },
272
+ "not": { "$ref": "#/definitions/outputSchemaDefinition" },
273
+ "$ref": false,
274
+ "$defs": false,
275
+ "definitions": false,
276
+ "$anchor": false,
277
+ "$dynamicRef": false,
278
+ "$dynamicAnchor": false,
279
+ "if": false,
280
+ "then": false,
281
+ "else": false,
282
+ "const": false,
283
+ "pattern": false,
284
+ "format": false,
285
+ "patternProperties": false,
286
+ "propertyNames": false,
287
+ "additionalItems": false,
288
+ "prefixItems": false,
289
+ "contains": false,
290
+ "minContains": false,
291
+ "maxContains": false,
292
+ "uniqueItems": false,
293
+ "multipleOf": false,
294
+ "exclusiveMinimum": false,
295
+ "exclusiveMaximum": false,
296
+ "minProperties": false,
297
+ "maxProperties": false,
298
+ "dependencies": false,
299
+ "dependentRequired": false,
300
+ "dependentSchemas": false,
301
+ "unevaluatedItems": false,
302
+ "unevaluatedProperties": false,
303
+ "contentEncoding": false,
304
+ "contentMediaType": false,
305
+ "contentSchema": false
306
+ },
307
+ "additionalProperties": { "$ref": "#/definitions/jsonValue" }
308
+ },
309
+ "outputSchemaArray": {
310
+ "type": "array",
311
+ "minItems": 1,
312
+ "maxItems": 1024,
313
+ "items": { "$ref": "#/definitions/outputSchemaDefinition" }
314
+ },
315
+ "outputSchemaTypeName": {
316
+ "enum": ["string", "number", "integer", "boolean", "object", "array", "null"]
79
317
  },
80
- "extraParams": {
318
+ "builtinCommandWith": {
81
319
  "type": "object",
82
- "description": "Provider-specific request fields. Top-level AKM-owned fields are forbidden; credential-shaped keys are forbidden recursively after lowercase/non-alphanumeric normalization.",
83
- "propertyNames": {
84
- "not": {
85
- "enum": ["model", "messages", "temperature", "maxtokens", "responseformat", "stream", "streamoptions", "enablethinking", "chattemplatekwargs", "authorization", "headers", "apikey", "token", "password", "secret", "cookie", "setcookie"]
86
- }
320
+ "additionalProperties": false,
321
+ "properties": {
322
+ "ref": { "type": "string", "minLength": 1, "maxLength": 262144 },
323
+ "content": { "type": "string", "maxLength": 262144 },
324
+ "arguments": { "type": "string", "maxLength": 262144 }
87
325
  },
88
- "additionalProperties": { "$ref": "#/definitions/extraParamValue" },
89
- "x-akm-protectedTopLevelNormalizedKeys": ["model", "messages", "temperature", "maxtokens", "responseformat", "stream", "streamoptions", "enablethinking", "chattemplatekwargs"],
90
- "x-akm-recursivelyForbiddenNormalizedKeys": ["authorization", "headers", "apikey", "token", "password", "secret", "cookie", "setcookie"]
91
- },
92
- "extraParamValue": {
93
- "anyOf": [
94
- { "type": ["string", "number", "boolean", "null"] },
95
- { "type": "array", "items": { "$ref": "#/definitions/extraParamValue" } },
96
- {
97
- "type": "object",
98
- "propertyNames": {
99
- "not": {
100
- "enum": ["authorization", "headers", "apikey", "token", "password", "secret", "cookie", "setcookie"]
101
- }
102
- },
103
- "additionalProperties": { "$ref": "#/definitions/extraParamValue" },
104
- "x-akm-recursivelyForbiddenNormalizedKeys": ["authorization", "headers", "apikey", "token", "password", "secret", "cookie", "setcookie"]
105
- }
326
+ "oneOf": [
327
+ { "required": ["ref"], "not": { "required": ["content"] } },
328
+ { "required": ["content"], "not": { "required": ["ref"] } }
106
329
  ]
330
+ },
331
+ "jsonValue": {
332
+ "oneOf": [
333
+ { "type": "string", "maxLength": 262144 },
334
+ { "type": "number" },
335
+ { "type": "boolean" },
336
+ { "type": "null" },
337
+ { "$ref": "#/definitions/jsonArray" },
338
+ { "$ref": "#/definitions/jsonObject" }
339
+ ]
340
+ },
341
+ "jsonArray": {
342
+ "type": "array",
343
+ "maxItems": 1024,
344
+ "items": { "$ref": "#/definitions/jsonValue" }
345
+ },
346
+ "jsonObject": {
347
+ "type": "object",
348
+ "maxProperties": 256,
349
+ "propertyNames": { "maxLength": 262144 },
350
+ "additionalProperties": { "$ref": "#/definitions/jsonValue" }
107
351
  }
108
352
  }
109
353
  }
@@ -2,7 +2,7 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "$id": "https://itlackey.github.io/akm/schemas/akm-workflow.json",
4
4
  "title": "AKM Workflow",
5
- "description": "Unified akm workflow frontmatter (workflow-format-unification). One markdown asset: the standard AKM asset envelope (type/description/tags/when_to_use/xrefs/updated/timestamp + the OKF v0.2 machine-stamped families) plus the orchestration graph. Per-step prose instructions and gate rubrics live in the markdown body, joined to this graph by step id — see docs/reference/workflow-schema.md. Hand-authored alongside src/workflows/program/schema.ts; the enum vocabularies and patterns here are pinned against the TypeScript constants by tests/integration/workflows/schema-drift.test.ts.",
5
+ "description": "This frontmatter schema applies to and validates the Markdown (.md) workflow source: the standard AKM asset envelope plus its orchestration graph. Markdown is not the sole or only workflow source; peer GitHub-shaped .yml sources use the bounded adapter and both formats compile to source IR v1. Per-step prose instructions and gate rubrics live in the Markdown body, joined to this graph by step id. Hand-authored alongside src/workflows/program/schema.ts; see docs/reference/workflow-schema.md.",
6
6
  "type": "object",
7
7
  "required": ["steps"],
8
8
  "additionalProperties": false,
@@ -90,7 +90,8 @@
90
90
  "supports_json_schema": { "type": "boolean" },
91
91
  "extra_params": { "$ref": "#/definitions/extraParams" },
92
92
  "context_length": { "type": "integer", "minimum": 1 },
93
- "enable_thinking": { "type": "boolean" }
93
+ "enable_thinking": { "type": "boolean" },
94
+ "reasoning_effort": { "type": "string", "minLength": 1 }
94
95
  }
95
96
  },
96
97
  "extraParams": {
@@ -98,11 +99,11 @@
98
99
  "description": "Provider-specific request fields. Top-level AKM-owned fields are forbidden; credential-shaped keys are forbidden recursively after lowercase/non-alphanumeric normalization.",
99
100
  "propertyNames": {
100
101
  "not": {
101
- "enum": ["model", "messages", "temperature", "maxtokens", "responseformat", "stream", "streamoptions", "enablethinking", "chattemplatekwargs", "authorization", "headers", "apikey", "token", "password", "secret", "cookie", "setcookie"]
102
+ "enum": ["model", "messages", "temperature", "maxtokens", "responseformat", "stream", "streamoptions", "enablethinking", "reasoningeffort", "chattemplatekwargs", "authorization", "headers", "apikey", "token", "password", "secret", "cookie", "setcookie"]
102
103
  }
103
104
  },
104
105
  "additionalProperties": { "$ref": "#/definitions/extraParamValue" },
105
- "x-akm-protectedTopLevelNormalizedKeys": ["model", "messages", "temperature", "maxtokens", "responseformat", "stream", "streamoptions", "enablethinking", "chattemplatekwargs"],
106
+ "x-akm-protectedTopLevelNormalizedKeys": ["model", "messages", "temperature", "maxtokens", "responseformat", "stream", "streamoptions", "enablethinking", "reasoningeffort", "chattemplatekwargs"],
106
107
  "x-akm-recursivelyForbiddenNormalizedKeys": ["authorization", "headers", "apikey", "token", "password", "secret", "cookie", "setcookie"]
107
108
  },
108
109
  "extraParamValue": {
@@ -215,7 +216,7 @@
215
216
  },
216
217
  "exec": {
217
218
  "type": "object",
218
- "description": "Run a shell command as this unit instead of dispatching to an engine. `command` is an ARGV ARRAY and there is no shell-string form: the child is spawned directly, so shell metacharacters (`;` `|` `&&` `$(…)` `>` `*`) are inert literal argument bytes — the quoting/injection class simply does not exist. Write the interpreter explicitly (e.g. [\"bash\", \"-lc\", \"a | b\"]) when a pipeline is really wanted. stdout is the promoted step artifact with trailing newlines stripped (like shell `$(…)`); when the unit declares an `output` schema, stdout must instead be exactly one JSON value, which is validated against it. A non-zero exit fails the unit with failure reason `non_zero_exit`, honoring `retry:` and `on_error:` like any other unit. The child's environment is an ALLOWLIST by default (PATH, HOME, locale/temp vars, the Windows process-creation essentials) — widen it with `pass_env` or `inherit_env`.",
219
+ "description": "Run a shell command as this unit instead of dispatching to an engine. `command` is an ARGV ARRAY and there is no shell-string form: the child is spawned directly, so shell metacharacters (`;` `|` `&&` `$(…)` `>` `*`) are inert literal argument bytes — the quoting/injection class simply does not exist. Write the interpreter explicitly (e.g. [\"bash\", \"-lc\", \"a | b\"]) when a pipeline is really wanted. stdout is the promoted step artifact with trailing newlines stripped (like shell `$(…)`); when the unit declares an `output` schema, stdout must instead be exactly one JSON value, which is validated against it. A non-zero exit fails the unit with failure reason `non_zero_exit`, honoring `retry:` and `on_error:` like any other unit. The child's environment is an ALLOWLIST by default (PATH, HOME, locale/temp vars, the Windows process-creation essentials) — widen it only with named `env:` environment bindings or `pass_env`.",
219
220
  "required": ["command"],
220
221
  "additionalProperties": false,
221
222
  "properties": {
@@ -247,10 +248,6 @@
247
248
  "type": "string",
248
249
  "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
249
250
  }
250
- },
251
- "inherit_env": {
252
- "type": "boolean",
253
- "description": "Give the command akm's ENTIRE environment instead of the default allowlist. Opt in only when a command genuinely needs the caller's whole environment (a wrapper script, a toolchain with many ambient variables); prefer `pass_env` or `env:` bindings, which keep what the command can see explicit in the frontmatter diff. Dispatch-significant: toggling it changes the unit's input hash."
254
251
  }
255
252
  }
256
253
  },
@@ -1,75 +0,0 @@
1
- // This Source Code Form is subject to the terms of the Mozilla Public
2
- // License, v. 2.0. If a copy of the MPL was not distributed with this
3
- // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
- import crypto from "node:crypto";
5
- import path from "node:path";
6
- import { ConfigError } from "./errors.js";
7
- import { classifyPathAccess, describeInaccessiblePath } from "./path-access.js";
8
- import { getConfigPath, getDataDir } from "./paths.js";
9
- let afterPendingCheckHook;
10
- /** TEST-ONLY: run once after a clear pending-operation check. */
11
- export function _setAfterPendingOperationCheckHookForTests(hook) {
12
- afterPendingCheckHook = hook;
13
- }
14
- function installationId() {
15
- return crypto
16
- .createHash("sha256")
17
- .update(path.resolve(path.dirname(getConfigPath())))
18
- .update("\0")
19
- .update(path.resolve(getDataDir()))
20
- .digest("hex")
21
- .slice(0, 24);
22
- }
23
- export function getMigrationOperationRoot() {
24
- return path.join(getDataDir(), "backups", "migrations", installationId());
25
- }
26
- export function getMigrationRestoreJournalPath() {
27
- return path.join(getMigrationOperationRoot(), "restore-active.json");
28
- }
29
- export function getMigrationApplyJournalPath() {
30
- return path.join(getMigrationOperationRoot(), "apply-active.json");
31
- }
32
- /**
33
- * Predictable path for the config `akm migrate apply` auto-generates when no
34
- * `--config` is given and the active config still carries the pre-cutover
35
- * `stashDir`/`sources[]`/`installed[]` shape (see `config-migrate.ts`'s
36
- * `buildMigrationPlan`/`writeGeneratedTargetConfig`). Deliberately NOT the
37
- * live `config.json` — the live 0.8 file must stay byte-for-byte untouched
38
- * until `publishConfigLast` performs its normal atomic install, so the
39
- * generated draft lives here instead, next to the apply/restore sentinels.
40
- * Stable across invocations (keyed only by installation id, not a run id) so
41
- * a second `migrate apply`/`migrate status` with still no `--config` finds
42
- * the same file an operator may have hand-edited (e.g. to add `engines`)
43
- * after the first run generated it.
44
- */
45
- export function getMigrationGeneratedConfigPath() {
46
- return path.join(getMigrationOperationRoot(), "generated-config.json");
47
- }
48
- /**
49
- * Refuse canonical config/database access while a migration or restore is
50
- * mid-flight.
51
- *
52
- * This is a SAFETY gate, so "I could not tell" must fail the same way "yes"
53
- * does. `fs.existsSync` answered `false` for an unreadable journal exactly as
54
- * for an absent one (#791), which meant a permission fault on the journal
55
- * silently CLEARED the gate and let akm open the canonical databases on top of
56
- * a half-applied migration. Absence is the only answer that may open the door.
57
- */
58
- export function assertNoPendingMigrationOperation() {
59
- for (const [kind, journalPath] of [
60
- ["restore", getMigrationRestoreJournalPath()],
61
- ["migration apply", getMigrationApplyJournalPath()],
62
- ]) {
63
- const { access, code } = classifyPathAccess(journalPath);
64
- if (access === "inaccessible") {
65
- throw new ConfigError(`Cannot determine whether an AKM ${kind} recovery is pending: ${describeInaccessiblePath(journalPath, code)}. ` +
66
- "Refusing canonical config/database access — proceeding could write on top of a half-applied migration.", "DATA_DIR_UNREADABLE");
67
- }
68
- if (access === "present") {
69
- throw new ConfigError(`AKM ${kind} recovery is pending at ${journalPath}; refusing canonical config/database access until recovery completes.`, "INVALID_CONFIG_FILE");
70
- }
71
- }
72
- const hook = afterPendingCheckHook;
73
- afterPendingCheckHook = undefined;
74
- hook?.();
75
- }
@@ -1,74 +0,0 @@
1
- // This Source Code Form is subject to the terms of the Mozilla Public
2
- // License, v. 2.0. If a copy of the MPL was not distributed with this
3
- // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
- /**
5
- * Built-in alias table. Alias keys are lowercase.
6
- *
7
- * Platform model string conventions:
8
- * opencode — "<provider>/<model>" e.g. "opencode/claude-opus-4-7"
9
- * claude — bare model name e.g. "claude-opus-4-7"
10
- * (Claude Code also accepts its own built-in shorthands, but we
11
- * always resolve to the full name for determinism)
12
- */
13
- const BUILTIN_ALIASES = [
14
- {
15
- // Anthropic's Mythos-class tier above Opus — the recommended resolution
16
- // target for the `deep` workflow tier (see docs/reference/workflow-schema.md).
17
- alias: "fable",
18
- platforms: {
19
- claude: "claude-fable-5",
20
- opencode: "opencode/claude-fable-5",
21
- },
22
- },
23
- {
24
- alias: "opus",
25
- platforms: {
26
- claude: "claude-opus-4-7",
27
- opencode: "opencode/claude-opus-4-7",
28
- },
29
- },
30
- {
31
- alias: "sonnet",
32
- platforms: {
33
- claude: "claude-sonnet-4-6",
34
- opencode: "opencode/claude-sonnet-4-6",
35
- },
36
- },
37
- {
38
- alias: "haiku",
39
- platforms: {
40
- claude: "claude-haiku-4-5-20251001",
41
- opencode: "opencode/claude-haiku-4-5",
42
- },
43
- },
44
- ];
45
- /**
46
- * Resolve a model alias or exact model ID to the string the target platform
47
- * CLI expects for its --model flag.
48
- *
49
- * @param model Raw alias ("opus") or exact model ID ("claude-opus-4-7").
50
- * @param platform Builder platform name ("claude", "opencode", ...).
51
- * @param custom Profile-level aliases from config.json — take priority over globals and builtins.
52
- * @param global Config-root `modelAliases` tier table (alias → platform → model, `"*"` fallback).
53
- * @param fallbackPlatforms Additional global tier columns checked after `platform` and before `"*"`.
54
- * @returns Resolved model string, or `model` verbatim when no alias matches.
55
- */
56
- export function resolveModel(model, platform, custom, global, fallbackPlatforms = []) {
57
- const key = model.toLowerCase();
58
- if (custom?.[key])
59
- return custom[key];
60
- const tier = global?.[key];
61
- const fromGlobal = tier?.[platform] ?? fallbackPlatforms.map((fallback) => tier?.[fallback]).find(Boolean) ?? tier?.["*"];
62
- if (fromGlobal)
63
- return fromGlobal;
64
- const entry = BUILTIN_ALIASES.find((a) => a.alias === key);
65
- return entry?.platforms[platform] ?? model;
66
- }
67
- /** Resolve a direct/fallback LLM model through engine-specific, `llm`, then `*` tiers. */
68
- export function resolveLlmModel(model, engine, global) {
69
- return resolveModel(model, engine, undefined, global, ["llm"]);
70
- }
71
- /** Return all built-in alias entries (for tests and documentation). */
72
- export function listBuiltinModelAliases() {
73
- return BUILTIN_ALIASES;
74
- }