akm-cli 0.9.17-alpha.2 → 0.9.17-alpha.4

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 (343) hide show
  1. package/CHANGELOG.md +756 -0
  2. package/dist/akm +94 -196
  3. package/dist/cli/shared.js +6 -2
  4. package/dist/cli.js +22 -9
  5. package/dist/commands/agent/agent-dispatch.js +1 -1
  6. package/dist/commands/command/command-execution.js +24 -62
  7. package/dist/commands/feedback-cli.js +0 -1
  8. package/dist/commands/health/accept-rate.js +2 -2
  9. package/dist/commands/health/checks.js +30 -75
  10. package/dist/commands/health/config-skew.js +38 -0
  11. package/dist/commands/health/egress.js +54 -0
  12. package/dist/commands/health/html-report.js +0 -38
  13. package/dist/commands/health/improve-metrics.js +123 -562
  14. package/dist/commands/health/plugin-staleness.js +53 -3
  15. package/dist/commands/health/renderers.js +12 -4
  16. package/dist/commands/health/report-view-model.js +11 -106
  17. package/dist/commands/health/types-improve.js +4 -19
  18. package/dist/commands/health/windows.js +64 -73
  19. package/dist/commands/health.js +122 -143
  20. package/dist/commands/improve/consolidate/chunking.js +25 -100
  21. package/dist/commands/improve/consolidate/sanitize.js +54 -149
  22. package/dist/commands/improve/consolidate.js +538 -1075
  23. package/dist/commands/improve/content-hash.js +16 -24
  24. package/dist/commands/improve/distill/content-repair.js +18 -100
  25. package/dist/commands/improve/distill-guards.js +20 -81
  26. package/dist/commands/improve/distill-promotion-policy.js +23 -243
  27. package/dist/commands/improve/distill.js +608 -1075
  28. package/dist/commands/improve/eligibility.js +126 -400
  29. package/dist/commands/improve/execution.js +3 -5
  30. package/dist/commands/improve/extract.js +487 -1046
  31. package/dist/commands/improve/feedback-valence.js +0 -25
  32. package/dist/commands/improve/improve-cli.js +29 -166
  33. package/dist/commands/improve/improve-result-file.js +10 -66
  34. package/dist/commands/improve/improve-strategies.js +12 -7
  35. package/dist/commands/improve/improve-usage-report.js +18 -64
  36. package/dist/commands/improve/improve.js +443 -1063
  37. package/dist/commands/improve/ledger.js +114 -0
  38. package/dist/commands/improve/locks.js +2 -8
  39. package/dist/commands/improve/loop-stages.js +459 -1172
  40. package/dist/commands/improve/memory/derived-ref.js +12 -77
  41. package/dist/commands/improve/memory/memory-belief.js +14 -118
  42. package/dist/commands/improve/memory/memory-improve.js +4 -3
  43. package/dist/commands/improve/outcome-loop.js +28 -156
  44. package/dist/commands/improve/planner.js +5 -10
  45. package/dist/commands/improve/preparation.js +851 -2339
  46. package/dist/commands/improve/proactive-maintenance.js +34 -101
  47. package/dist/commands/improve/reflect-noise.js +104 -280
  48. package/dist/commands/improve/reflect.js +621 -1367
  49. package/dist/commands/improve/salience.js +46 -232
  50. package/dist/commands/improve/session-asset.js +19 -100
  51. package/dist/commands/improve/stage.js +323 -0
  52. package/dist/commands/proposal/drain.js +251 -644
  53. package/dist/commands/proposal/proposal-cli.js +3 -18
  54. package/dist/commands/proposal/proposal-types.js +20 -41
  55. package/dist/commands/proposal/proposal.js +1 -2
  56. package/dist/commands/proposal/propose.js +134 -160
  57. package/dist/commands/proposal/repository.js +502 -1487
  58. package/dist/commands/proposal/validators/proposal-quality-validators.js +71 -174
  59. package/dist/commands/proposal/validators/proposal-validators.js +1 -1
  60. package/dist/commands/proposal/validators/proposals.js +13 -89
  61. package/dist/commands/read/curate.js +63 -413
  62. package/dist/commands/read/search-cli.js +16 -33
  63. package/dist/commands/read/search.js +17 -23
  64. package/dist/commands/read/show.js +2 -13
  65. package/dist/commands/sources/bundle-cli.js +25 -2
  66. package/dist/commands/sources/bundle-config-ops.js +7 -0
  67. package/dist/commands/sources/dangerous-env-audit.js +1 -2
  68. package/dist/commands/sources/info.js +2 -11
  69. package/dist/commands/sources/installed-stashes.js +197 -746
  70. package/dist/commands/sources/schema-repair.js +98 -129
  71. package/dist/commands/sources/source-add.js +62 -12
  72. package/dist/commands/sources/stash-cli.js +1 -1
  73. package/dist/commands/tasks/explain.js +10 -13
  74. package/dist/commands/tasks/tasks-cli.js +9 -8
  75. package/dist/commands/tasks/tasks.js +326 -930
  76. package/dist/commands/tasks/validate.js +42 -21
  77. package/dist/commands/workflow/plan.js +22 -29
  78. package/dist/commands/workflow-cli.js +4 -4
  79. package/dist/core/adapter/adapters/akm-adapter.js +0 -1
  80. package/dist/core/adapter/adapters/akm-lint.js +2 -3
  81. package/dist/core/adapter/adapters/akm-metadata.js +11 -12
  82. package/dist/core/adapter/adapters/akm-workflow-adapter.js +1 -1
  83. package/dist/core/adapter/execution-source.js +17 -29
  84. package/dist/core/asset/resolve-ref.js +1 -1
  85. package/dist/core/bundle-id.js +42 -5
  86. package/dist/core/bundle-rename.js +291 -0
  87. package/dist/core/config/config-io.js +1 -2
  88. package/dist/core/config/config-schema.js +1 -33
  89. package/dist/core/config/config-walker.js +1 -1
  90. package/dist/core/config/config.js +163 -68
  91. package/dist/core/config/legacy-source-shape-shim.js +38 -9
  92. package/dist/core/config/schema/embedding.js +20 -5
  93. package/dist/core/config/schema/engines.js +5 -0
  94. package/dist/core/config/schema/execution.js +1 -1
  95. package/dist/core/config/schema/experimental.js +1 -1
  96. package/dist/core/config/schema/improve-processes.js +21 -95
  97. package/dist/core/config/schema/improve.js +4 -42
  98. package/dist/core/config/schema/scheduler.js +12 -12
  99. package/dist/core/config/schema/search.js +6 -22
  100. package/dist/core/env-secret-ref.js +0 -1
  101. package/dist/core/errors.js +8 -9
  102. package/dist/core/file-lock.js +76 -173
  103. package/dist/core/logs-db.js +2 -2
  104. package/dist/core/paths.js +0 -27
  105. package/dist/core/redaction.js +109 -2
  106. package/dist/core/run-lock.js +2 -5
  107. package/dist/core/spawn-env.js +1 -1
  108. package/dist/core/state/migrations.js +108 -61
  109. package/dist/core/state-db-scope.js +2 -4
  110. package/dist/core/state-db.js +126 -692
  111. package/dist/core/type-presentation.js +1 -9
  112. package/dist/core/write-source.js +293 -1012
  113. package/dist/execution/input-contract.js +1 -1
  114. package/dist/execution/resolved-request.js +135 -689
  115. package/dist/execution/source.js +63 -257
  116. package/dist/execution/target-ref.js +1 -1
  117. package/dist/indexer/bundle-identity-guard.js +2 -2
  118. package/dist/indexer/db/graph-db.js +106 -46
  119. package/dist/indexer/ensure-index.js +44 -85
  120. package/dist/indexer/graph/graph-extraction.js +340 -562
  121. package/dist/indexer/graph/graph-related.js +130 -0
  122. package/dist/indexer/index-rebuild-lock.js +3 -11
  123. package/dist/indexer/index-writer-lock.js +8 -17
  124. package/dist/indexer/index-written-assets.js +139 -151
  125. package/dist/indexer/indexer.js +524 -846
  126. package/dist/indexer/materialize-embeddings.js +60 -397
  127. package/dist/indexer/passes/memory-inference.js +81 -90
  128. package/dist/indexer/passes/metadata.js +132 -200
  129. package/dist/indexer/read-preflight.js +0 -7
  130. package/dist/indexer/scan/doc-to-entry.js +1 -3
  131. package/dist/indexer/scan/drain-dir.js +1 -1
  132. package/dist/indexer/search/db-search.js +181 -590
  133. package/dist/indexer/search/fts-query.js +30 -41
  134. package/dist/indexer/search/ranking.js +28 -154
  135. package/dist/indexer/search/search-attribution.js +12 -32
  136. package/dist/indexer/search/search-fields.js +11 -15
  137. package/dist/indexer/search/search-hit-enrichers.js +54 -85
  138. package/dist/indexer/search/search-source.js +1 -4
  139. package/dist/indexer/usage/usage-events.js +2 -7
  140. package/dist/integrations/agent/engine-fallback.js +23 -40
  141. package/dist/integrations/agent/engine-resolution.js +93 -183
  142. package/dist/integrations/agent/execution.js +507 -0
  143. package/dist/integrations/agent/model-map.js +28 -156
  144. package/dist/integrations/agent/request-lowering.js +66 -141
  145. package/dist/integrations/agent/runner-dispatch.js +143 -321
  146. package/dist/integrations/agent/runner.js +54 -14
  147. package/dist/integrations/lockfile.js +53 -101
  148. package/dist/llm/embedders/deterministic.js +2 -3
  149. package/dist/llm/embedders/profile.js +71 -0
  150. package/dist/llm/embedders/remote.js +10 -15
  151. package/dist/llm/graph-extract.js +3 -12
  152. package/dist/llm/index-passes.js +3 -5
  153. package/dist/llm/memory-infer.js +1 -2
  154. package/dist/llm/metadata-enhance.js +1 -2
  155. package/dist/llm/structured-call.js +5 -24
  156. package/dist/output/generic-render.js +23 -11
  157. package/dist/output/html-render.js +13 -10
  158. package/dist/output/render-registry.js +3 -32
  159. package/dist/output/shapes/helpers.js +2 -34
  160. package/dist/output/shapes/passthrough.js +1 -9
  161. package/dist/{indexer/search/ranking-types.js → output/text/bundle-rename.js} +4 -1
  162. package/dist/output/text/command-format.js +60 -23
  163. package/dist/output/text/helpers.js +1 -1
  164. package/dist/output/text/migrate.js +5 -14
  165. package/dist/output/text/proposal-format.js +1 -2
  166. package/dist/output/text/workflow-format.js +0 -32
  167. package/dist/output/text.js +2 -0
  168. package/dist/registry/factory.js +4 -19
  169. package/dist/registry/network.js +66 -220
  170. package/dist/registry/providers/index.js +0 -2
  171. package/dist/registry/providers/skills-sh.js +3 -14
  172. package/dist/registry/providers/static-index.js +24 -26
  173. package/dist/registry/resolve.js +55 -131
  174. package/dist/scripts/akm-migrate-node.js +43937 -93313
  175. package/dist/scripts/akm-migrate.js +43697 -93071
  176. package/dist/setup/registry-stash-loader.js +4 -13
  177. package/dist/setup/semantic-assets.js +3 -44
  178. package/dist/setup/setup.js +1 -1
  179. package/dist/setup/steps/tasks.js +25 -15
  180. package/dist/sources/provider-factory.js +17 -18
  181. package/dist/sources/providers/filesystem.js +2 -3
  182. package/dist/sources/providers/git-install.js +7 -1
  183. package/dist/sources/providers/git-provider.js +0 -3
  184. package/dist/sources/providers/git-stash.js +0 -17
  185. package/dist/sources/providers/npm.js +2 -4
  186. package/dist/sources/providers/provider-utils.js +5 -10
  187. package/dist/sources/providers/website.js +0 -2
  188. package/dist/sources/snapshot-fetchers/website-ingest.js +1 -1
  189. package/dist/sources/website-url.js +2 -2
  190. package/dist/storage/database.js +9 -35
  191. package/dist/storage/repositories/improve-ledger-repository.js +168 -0
  192. package/dist/storage/repositories/index-connection.js +34 -70
  193. package/dist/storage/repositories/index-entries-repository.js +69 -111
  194. package/dist/storage/repositories/index-entry-mapper.js +1 -2
  195. package/dist/storage/repositories/index-entry-schema.js +83 -269
  196. package/dist/storage/repositories/index-fts-repository.js +86 -256
  197. package/dist/storage/repositories/index-llm-cache-repository.js +17 -0
  198. package/dist/storage/repositories/index-meta-repository.js +6 -4
  199. package/dist/storage/repositories/index-schema.js +192 -220
  200. package/dist/storage/repositories/index-utility-repository.js +8 -29
  201. package/dist/storage/repositories/index-vec-repository.js +133 -414
  202. package/dist/storage/repositories/outcome-repository.js +2 -1
  203. package/dist/storage/repositories/proposals-repository.js +35 -0
  204. package/dist/storage/repositories/registry-index-cache-repository.js +100 -0
  205. package/dist/storage/repositories/task-history-repository.js +26 -4
  206. package/dist/storage/repositories/workflow-runs-repository.js +53 -244
  207. package/dist/storage/sqlite-migrations.js +136 -0
  208. package/dist/storage/sqlite-pragmas.js +11 -9
  209. package/dist/storage/sqlite-transaction.js +170 -0
  210. package/dist/storage/state-db-integrity.js +34 -27
  211. package/dist/tasks/activation-config.js +134 -62
  212. package/dist/tasks/backends/cron.js +129 -277
  213. package/dist/tasks/backends/exec-utils.js +2 -5
  214. package/dist/tasks/backends/launchd.js +125 -745
  215. package/dist/tasks/backends/schtasks.js +101 -620
  216. package/dist/tasks/prepare/prepare-support.js +5 -15
  217. package/dist/tasks/prepare/prepare.js +0 -2
  218. package/dist/tasks/resolve-akm-bin.js +20 -79
  219. package/dist/tasks/run/attempt-lifecycle.js +0 -1
  220. package/dist/tasks/scheduler-binding.js +18 -238
  221. package/dist/tasks/scheduler-invocation.js +52 -52
  222. package/dist/tasks/scheduler-lock.js +53 -0
  223. package/dist/tasks/scheduler-sync.js +363 -679
  224. package/dist/tasks/source/parse-task-source.js +160 -10
  225. package/dist/tasks/source/task-source-v3-frozen.js +3 -4
  226. package/dist/tasks/source/task-to-v4.js +2 -2
  227. package/dist/workflows/authoring/authoring.js +3 -12
  228. package/dist/workflows/compile.js +211 -0
  229. package/dist/workflows/concurrency-policy.js +13 -74
  230. package/dist/workflows/exec/child-invocation.js +3 -17
  231. package/dist/workflows/exec/child-workflow.js +32 -141
  232. package/dist/workflows/exec/dispatch-redaction.js +13 -53
  233. package/dist/workflows/exec/environment.js +98 -0
  234. package/dist/workflows/exec/exec-unit.js +33 -140
  235. package/dist/workflows/exec/frozen-judge.js +7 -59
  236. package/dist/workflows/exec/native-executor.js +82 -341
  237. package/dist/workflows/exec/param-secrets.js +29 -47
  238. package/dist/workflows/exec/run-workflow.js +154 -387
  239. package/dist/workflows/exec/scheduler.js +9 -36
  240. package/dist/workflows/exec/step-work.js +127 -430
  241. package/dist/workflows/exec/unit-dispatch.js +11 -63
  242. package/dist/workflows/exec/unit-writer.js +8 -52
  243. package/dist/workflows/exec/worktree.js +39 -273
  244. package/dist/workflows/freeze/child-output-references.js +4 -15
  245. package/dist/workflows/freeze/environment.js +99 -92
  246. package/dist/workflows/freeze/freeze.js +172 -0
  247. package/dist/workflows/freeze/step-values.js +19 -21
  248. package/dist/workflows/freeze/targets/child-workflow.js +23 -92
  249. package/dist/workflows/freeze/targets/command.js +10 -33
  250. package/dist/workflows/freeze/targets/script.js +5 -12
  251. package/dist/workflows/freeze/targets/shell.js +3 -6
  252. package/dist/workflows/freeze/targets/task.js +25 -80
  253. package/dist/workflows/freeze/task-bindings.js +20 -67
  254. package/dist/workflows/{source-ir/github-yaml.js → github-yaml.js} +88 -206
  255. package/dist/workflows/ir/params.js +6 -51
  256. package/dist/workflows/ir/plan-hash.js +2 -34
  257. package/dist/workflows/parser.js +140 -43
  258. package/dist/{commands/improve/consolidate/types.js → workflows/plan.js} +2 -1
  259. package/dist/workflows/renderer.js +36 -69
  260. package/dist/workflows/resource-limits.js +12 -120
  261. package/dist/workflows/runtime/agent-identity.js +8 -40
  262. package/dist/workflows/runtime/run-outputs.js +3 -6
  263. package/dist/workflows/runtime/run-plan.js +316 -0
  264. package/dist/workflows/runtime/runs.js +48 -200
  265. package/dist/workflows/runtime/workflow-asset-loader.js +24 -57
  266. package/dist/workflows/{source-ir/semantics.js → source-semantics.js} +16 -20
  267. package/dist/workflows/validate-summary.js +2 -7
  268. package/docs/integration/bundling-akm.md +49 -42
  269. package/docs/migration/README.md +1 -0
  270. package/docs/migration/release-notes/0.9.17.md +41 -0
  271. package/docs/migration/v0.9.1-to-v0.9.2.md +19 -7
  272. package/docs/reference/cli.md +182 -125
  273. package/docs/reference/configuration.md +49 -56
  274. package/docs/reference/data-and-telemetry.md +19 -20
  275. package/docs/reference/tasks.md +86 -38
  276. package/docs/reference/workflow-schema.md +14 -18
  277. package/docs/reference/workflows.md +6 -9
  278. package/package.json +1 -1
  279. package/schemas/akm-config.json +87 -406
  280. package/dist/commands/health/advisories.js +0 -150
  281. package/dist/commands/health/metrics.js +0 -329
  282. package/dist/commands/health/surfaces.js +0 -102
  283. package/dist/commands/improve/anti-collapse.js +0 -83
  284. package/dist/commands/improve/collapse-detector.js +0 -432
  285. package/dist/commands/improve/consolidate/eligibility.js +0 -48
  286. package/dist/commands/improve/consolidate/merge.js +0 -146
  287. package/dist/commands/improve/distill/promote-memory.js +0 -329
  288. package/dist/commands/improve/distill/quality-gate.js +0 -500
  289. package/dist/commands/improve/memory/memory-contradiction-detect.js +0 -291
  290. package/dist/commands/improve/proposal-envelope.js +0 -31
  291. package/dist/commands/improve/run-context.js +0 -123
  292. package/dist/commands/improve/shared.js +0 -21
  293. package/dist/commands/improve/source-identity.js +0 -28
  294. package/dist/commands/improve/triage.js +0 -96
  295. package/dist/commands/proposal/drain-policies.js +0 -151
  296. package/dist/commands/sources/update-transaction.js +0 -220
  297. package/dist/core/action-contributors.js +0 -28
  298. package/dist/core/config/config-version-shim.js +0 -101
  299. package/dist/core/config/retired-experimental-keys-shim.js +0 -62
  300. package/dist/core/fs-txn.js +0 -405
  301. package/dist/core/lexical-score.js +0 -25
  302. package/dist/core/maintenance-barrier.js +0 -167
  303. package/dist/execution/executable-identity.js +0 -105
  304. package/dist/execution/guarded-source.js +0 -427
  305. package/dist/indexer/graph/graph-boost.js +0 -427
  306. package/dist/indexer/graph/graph-dedup.js +0 -95
  307. package/dist/indexer/search/name-match.js +0 -35
  308. package/dist/indexer/search/ranking-contributors.js +0 -515
  309. package/dist/indexer/walk/project-context.js +0 -192
  310. package/dist/integrations/agent/execution-cascade.js +0 -566
  311. package/dist/integrations/agent/execution-definitions.js +0 -202
  312. package/dist/integrations/agent/execution-lowering.js +0 -841
  313. package/dist/integrations/agent/execution-preparation.js +0 -98
  314. package/dist/integrations/agent/inline-execution.js +0 -74
  315. package/dist/registry/create-provider-registry.js +0 -29
  316. package/dist/registry/pinned-request-helper.js +0 -247
  317. package/dist/registry/pinned-transport.js +0 -717
  318. package/dist/sources/providers/index.js +0 -14
  319. package/dist/storage/engines/sqlite-migrations.js +0 -271
  320. package/dist/storage/repositories/canaries-repository.js +0 -107
  321. package/dist/storage/repositories/embedding-salvage-repository.js +0 -184
  322. package/dist/storage/repositories/registry-cache.js +0 -113
  323. package/dist/tasks/scheduler-sync-preview.js +0 -52
  324. package/dist/workflows/freeze/resolve-steps.js +0 -86
  325. package/dist/workflows/freeze/source-freeze.js +0 -64
  326. package/dist/workflows/ir/compile.js +0 -321
  327. package/dist/workflows/ir/environment-v4.js +0 -330
  328. package/dist/workflows/ir/freeze-v4.js +0 -153
  329. package/dist/workflows/ir/schema-v4.js +0 -745
  330. package/dist/workflows/ir/schema.js +0 -354
  331. package/dist/workflows/program/schema.js +0 -78
  332. package/dist/workflows/runtime/checkin.js +0 -57
  333. package/dist/workflows/runtime/plan-classifier.js +0 -196
  334. package/dist/workflows/runtime/unit-checkin.js +0 -45
  335. package/dist/workflows/runtime/unit-phases.js +0 -20
  336. package/dist/workflows/schema.js +0 -4
  337. package/dist/workflows/source-ir/compile.js +0 -200
  338. package/dist/workflows/source-ir/program.js +0 -50
  339. package/dist/workflows/source-ir/result.js +0 -26
  340. package/dist/workflows/source-ir/schema.js +0 -786
  341. package/dist/workflows/source-ir/triggers.js +0 -79
  342. package/dist/workflows/source-ir/uses.js +0 -40
  343. package/dist/workflows/validator.js +0 -60
@@ -0,0 +1,291 @@
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
+ * `akm bundle rename <old> <new>` (D6) — the one command allowed to change a
6
+ * bundle's key. A bundle id is a mass identity prefix: every durable ref this
7
+ * tool minted (`entries.item_ref`/`bundle_id`, `proposals.ref`, a pending
8
+ * proposal's `proposedTarget.source`, a workflow task_history row's
9
+ * `target_ref`, `scheduler.enabled[].ref`) carries it, and a hand-edited
10
+ * `bundles` key strands all of it (see `src/indexer/bundle-identity-guard.ts`
11
+ * §11.5). This module is the rekey transaction that guard's docstring points
12
+ * to.
13
+ *
14
+ * Rewritten: the config `bundles` key, `defaultBundle`/`defaultWriteTarget`
15
+ * when they name the old id, every `scheduler.enabled[].ref` with the old
16
+ * `//` prefix, the lockfile entry id, and the index/state rows above.
17
+ *
18
+ * Reported, never rewritten: refs inside bundle CONTENT (xrefs,
19
+ * `supersededBy`, task `uses:`) — rewriting a bundle's own files is
20
+ * `akm mv`/editing territory, not a config-identity rename. `--dry-run`
21
+ * (and every real run) lists the indexed files that still spell the old
22
+ * `<old>//` prefix so the operator can follow up.
23
+ *
24
+ * Left behind on purpose: `usage_events`/`asset_salience`/`asset_outcome`
25
+ * keyed by the old bundle prefix (learned utility/outcome history) — outside
26
+ * this item's scope; `warnOnBundleRenameDrift` already documents this class
27
+ * of gap and `akm index --full` re-mints under the new id.
28
+ */
29
+ import fs from "node:fs";
30
+ import { readLockfile, renameLockEntry } from "../integrations/lockfile.js";
31
+ import { closeDatabase, openIndexDatabase, openReadonlyExistingDatabase, } from "../storage/repositories/index-connection.js";
32
+ import { getFilePathsByBundle, renameEntriesBundleId } from "../storage/repositories/index-entries-repository.js";
33
+ import { renameLlmCacheAssetRefs } from "../storage/repositories/index-llm-cache-repository.js";
34
+ import { countProposalsForBundleRename, renameProposalsBundleRef } from "../storage/repositories/proposals-repository.js";
35
+ import { countTaskHistoryTargetRefs, renameTaskHistoryTargetRefs, } from "../storage/repositories/task-history-repository.js";
36
+ import { selectBackend } from "../tasks/backends/index.js";
37
+ import { bundleRefToString, parseBundleRef } from "./asset/asset-ref.js";
38
+ import { validateExplicitBundleName } from "./bundle-id.js";
39
+ import { loadConfig, mutateConfig } from "./config/config.js";
40
+ import { NotFoundError, UsageError } from "./errors.js";
41
+ import { getDbPath } from "./paths.js";
42
+ import { getStateDbPath, withStateDb } from "./state-db.js";
43
+ /** Throws if `newId` cannot become `oldId`'s new key. Re-run under the config lock at apply time. */
44
+ function validateRename(config, oldId, newId) {
45
+ if (!config.bundles?.[oldId]) {
46
+ throw new NotFoundError(`No configured bundle named "${oldId}".`, "SOURCE_NOT_FOUND");
47
+ }
48
+ if (oldId === newId) {
49
+ throw new UsageError(`"${oldId}" and "${newId}" are the same bundle name.`, "INVALID_FLAG_VALUE");
50
+ }
51
+ const withoutOld = { ...(config.bundles ?? {}) };
52
+ delete withoutOld[oldId];
53
+ validateExplicitBundleName(withoutOld, newId);
54
+ }
55
+ function bundleOfRef(ref) {
56
+ try {
57
+ return parseBundleRef(ref).bundle;
58
+ }
59
+ catch {
60
+ return undefined;
61
+ }
62
+ }
63
+ function schedulerRefsToRewrite(config, oldId) {
64
+ return (config.scheduler?.enabled ?? []).filter((ref) => bundleOfRef(ref) === oldId);
65
+ }
66
+ function renameBundleInConfig(config, oldId, newId) {
67
+ validateRename(config, oldId, newId);
68
+ const bundles = {};
69
+ for (const [key, entry] of Object.entries(config.bundles ?? {})) {
70
+ bundles[key === oldId ? newId : key] = entry;
71
+ }
72
+ const enabled = config.scheduler?.enabled;
73
+ const scheduler = enabled === undefined
74
+ ? config.scheduler
75
+ : {
76
+ ...config.scheduler,
77
+ enabled: enabled.map((ref) => bundleOfRef(ref) === oldId ? bundleRefToString({ ...parseBundleRef(ref), bundle: newId }) : ref),
78
+ };
79
+ return {
80
+ ...config,
81
+ bundles,
82
+ ...(config.defaultBundle === oldId ? { defaultBundle: newId } : {}),
83
+ ...(config.defaultWriteTarget === oldId ? { defaultWriteTarget: newId } : {}),
84
+ ...(scheduler ? { scheduler } : {}),
85
+ };
86
+ }
87
+ /** Indexed files (already read into `filePaths`) whose content still spells `<oldId>//`, best-effort. */
88
+ function filesStillMentioning(filePaths, oldId) {
89
+ const needle = `${oldId}//`;
90
+ const hits = [];
91
+ for (const filePath of filePaths) {
92
+ try {
93
+ if (fs.readFileSync(filePath, "utf8").includes(needle))
94
+ hits.push(filePath);
95
+ }
96
+ catch {
97
+ // Best-effort: a since-removed or unreadable file is skipped, not fatal —
98
+ // this scan is a report, not a correctness requirement.
99
+ }
100
+ }
101
+ return hits;
102
+ }
103
+ /** True when an installed binding's invocation names `bundleId` — either as a `task run` entry's `--bundle <id>` argument, or as a `workflow run <id>//…` ref. */
104
+ function invocationNamesBundle(invocation, bundleId) {
105
+ if (!invocation)
106
+ return false;
107
+ for (let i = 0; i < invocation.length; i++) {
108
+ const token = invocation[i];
109
+ if (token === bundleId && invocation[i - 1] === "--bundle")
110
+ return true;
111
+ if (token?.startsWith(`${bundleId}//`))
112
+ return true;
113
+ }
114
+ return false;
115
+ }
116
+ /**
117
+ * Installed native scheduler rows whose invocation names `oldId`, best-effort
118
+ * (a backend whose listing throws reports none — this is a preview, not a
119
+ * correctness requirement).
120
+ */
121
+ async function nativeSchedulerRowsNamingBundle(sched, oldId) {
122
+ try {
123
+ return (await sched.list())
124
+ .filter((entry) => invocationNamesBundle(entry.invocation, oldId))
125
+ .map((entry) => entry.invocation?.join(" ") ?? entry.id);
126
+ }
127
+ catch {
128
+ return [];
129
+ }
130
+ }
131
+ /**
132
+ * Build the rename plan — every count and ref this rename would touch — by
133
+ * reading, never writing. Shared by `--dry-run` and a real run so the two
134
+ * can never disagree about what was reported vs. what happened.
135
+ */
136
+ async function buildPlan(config, oldId, newId, sched) {
137
+ const schedulerRefs = schedulerRefsToRewrite(config, oldId);
138
+ const lockPresent = readLockfile().some((entry) => entry.id === oldId);
139
+ const nativeSchedulerRows = await nativeSchedulerRowsNamingBundle(sched, oldId);
140
+ let indexEntries = 0;
141
+ let contentRefs = [];
142
+ const readIndexDb = openReadonlyExistingDatabase(getDbPath());
143
+ if (readIndexDb) {
144
+ try {
145
+ const filePaths = getFilePathsByBundle(readIndexDb, oldId);
146
+ indexEntries = filePaths.length;
147
+ contentRefs = filesStillMentioning(filePaths, oldId);
148
+ }
149
+ finally {
150
+ closeDatabase(readIndexDb);
151
+ }
152
+ }
153
+ let proposalRefs = 0;
154
+ let proposalTargets = 0;
155
+ let taskHistoryRefs = 0;
156
+ if (fs.existsSync(getStateDbPath())) {
157
+ withStateDb((db) => {
158
+ const counts = countProposalsForBundleRename(db, oldId);
159
+ proposalRefs = counts.refs;
160
+ proposalTargets = counts.targets;
161
+ taskHistoryRefs = countTaskHistoryTargetRefs(db, oldId);
162
+ });
163
+ }
164
+ return {
165
+ oldId,
166
+ newId,
167
+ config: {
168
+ defaultBundleChanges: config.defaultBundle === oldId,
169
+ defaultWriteTargetChanges: config.defaultWriteTarget === oldId,
170
+ schedulerRefs,
171
+ },
172
+ lock: { present: lockPresent },
173
+ index: { entries: indexEntries },
174
+ state: { proposalRefs, proposalTargets, taskHistoryRefs },
175
+ contentRefs,
176
+ nativeSchedulerRows,
177
+ };
178
+ }
179
+ function taskSyncErrorMessage(cause) {
180
+ return cause instanceof Error ? cause.message : String(cause);
181
+ }
182
+ /**
183
+ * Remove every installed native row still naming `oldId`, best-effort,
184
+ * before the sync below installs the new-named ones. Without this, a plain
185
+ * `akmTasksSync(deps, newId)` alone cannot clean the old rows up: a task
186
+ * binding's native id depends only on the task id, so the OLD row and the
187
+ * new one it should become collide on that id, and `installedRowScope`
188
+ * (scheduler-sync.ts) attributes a row by the bundle NAME it was installed
189
+ * under — the physical-path check only confirms a name match, it never
190
+ * substitutes for one — so the sync reports the old row as another bundle's
191
+ * and leaves the new binding out instead of replacing it. A workflow binding's native id
192
+ * depends on its fully-qualified ref instead, so old and new never collide
193
+ * at all and the old row would otherwise be left installed forever. Both
194
+ * fail the same way this function fixes: uninstall the exact native rows
195
+ * `nativeSchedulerRowsNamingBundle` already found, by their native id, so
196
+ * the sync that follows starts from a clean slate.
197
+ */
198
+ async function removeStaleNativeSchedulerRows(sched, oldId) {
199
+ let installed;
200
+ try {
201
+ installed = await sched.list();
202
+ }
203
+ catch {
204
+ return;
205
+ }
206
+ for (const entry of installed) {
207
+ if (!invocationNamesBundle(entry.invocation, oldId))
208
+ continue;
209
+ try {
210
+ await sched.uninstall(entry.nativeId ?? entry.id);
211
+ }
212
+ catch {
213
+ // Best-effort: a row this process can't remove is left for the
214
+ // operator's own `akm task sync` to reconcile, same as every other
215
+ // per-item failure the sync itself reports rather than throws.
216
+ }
217
+ }
218
+ }
219
+ /**
220
+ * Rename a configured bundle's key everywhere akm itself persists it. With
221
+ * `dryRun: true`, only {@link buildPlan} runs — nothing is written, matching
222
+ * a `applied: false` result the caller renders as the plan. `deps.backend`
223
+ * lets a caller (tests) inject a fake scheduler backend instead of the real
224
+ * OS one `selectBackend()` would otherwise pick. `deps.syncTasks` is how the
225
+ * caller runs the post-rename `akmTasksSync` — `src/core` sits below
226
+ * `src/commands` (see `src/core/improve-types.ts`'s note on the same
227
+ * direction), so this module never imports `akmTasksSync` itself; the real
228
+ * caller (`akm bundle rename`'s command handler) always supplies it, and is
229
+ * required so a missing wire-up is a type error, not a silently skipped sync.
230
+ */
231
+ export async function renameBundle(oldId, newId, options = {}, deps) {
232
+ const config = loadConfig();
233
+ validateRename(config, oldId, newId);
234
+ const sched = deps.backend ?? selectBackend();
235
+ const plan = await buildPlan(config, oldId, newId, sched);
236
+ if (options.dryRun)
237
+ return { ...plan, applied: false };
238
+ // Config: the bundles key, defaultBundle/defaultWriteTarget, and every
239
+ // scheduler.enabled[].ref with the old `//` prefix — all under one write
240
+ // (validated again inside the config lock).
241
+ mutateConfig((current) => renameBundleInConfig(current, oldId, newId));
242
+ // Lockfile: the resolved-install entry id (no-op for a bundle with none,
243
+ // e.g. a plain filesystem bundle).
244
+ await renameLockEntry(oldId, newId);
245
+ // Index: bundle_id/item_ref on every entry row (see index-entries-repository's
246
+ // renameEntriesBundleId docstring for why no FTS/vector rebuild is needed),
247
+ // and the metadata-enrichment LLM cache keyed by the same canonical
248
+ // item_ref — in the SAME write, so a rename can never land between the two
249
+ // and leave the cache stranded under the old prefix (the next `akm index`'s
250
+ // clearStaleCacheEntries would then delete it, forcing a full re-enrich).
251
+ const readIndexDb = openReadonlyExistingDatabase(getDbPath());
252
+ if (readIndexDb) {
253
+ closeDatabase(readIndexDb);
254
+ const writeIndexDb = openIndexDatabase(getDbPath());
255
+ try {
256
+ renameEntriesBundleId(writeIndexDb, oldId, newId);
257
+ renameLlmCacheAssetRefs(writeIndexDb, oldId, newId);
258
+ }
259
+ finally {
260
+ closeDatabase(writeIndexDb);
261
+ }
262
+ }
263
+ // State: proposals.ref, a pending proposal's proposedTarget.source, and
264
+ // workflow task_history.target_ref.
265
+ if (fs.existsSync(getStateDbPath())) {
266
+ withStateDb((db) => {
267
+ renameProposalsBundleRef(db, oldId, newId);
268
+ renameTaskHistoryTargetRefs(db, oldId, newId);
269
+ });
270
+ }
271
+ // Scheduler: remove native rows still naming `<old>//` (see
272
+ // removeStaleNativeSchedulerRows for why a plain sync alone can't do
273
+ // this), then re-sync so a scheduled run's invocation stops naming the
274
+ // old bundle the moment the rename applies, instead of waiting on the
275
+ // operator to run `akm task sync` by hand. Reported, never thrown:
276
+ // config/index/state above are already renamed by this point, so a sync
277
+ // problem must not make the rename itself look like it failed. `ok` is
278
+ // false both when the sync call throws and when it comes back with
279
+ // `result.failures` — a binding that failed to prepare has already lost
280
+ // its old native row above and is not scheduled until a retry.
281
+ let taskSync;
282
+ try {
283
+ await removeStaleNativeSchedulerRows(sched, oldId);
284
+ const result = await deps.syncTasks(newId, sched);
285
+ taskSync = { ok: result.failures.length === 0, result };
286
+ }
287
+ catch (cause) {
288
+ taskSync = { ok: false, error: taskSyncErrorMessage(cause) };
289
+ }
290
+ return { ...plan, applied: true, taskSync };
291
+ }
@@ -124,8 +124,7 @@ function isTimestampedConfigBackup(name) {
124
124
  * Keep the `keep` most-recently-modified entries of `dir` that `select`
125
125
  * admits and remove the rest. Best-effort: an unreadable dir is a no-op, an
126
126
  * unreadable entry sorts oldest (pruned first), and a failed removal is
127
- * retried by the next call. Shared by the config backups above and the task
128
- * migration snapshots (#897).
127
+ * retried by the next call.
129
128
  */
130
129
  export function pruneToNewest(dir, keep, select) {
131
130
  let entries;
@@ -39,8 +39,6 @@
39
39
  * enforced at save time via `superRefine` on the top-level schema.
40
40
  */
41
41
  import { z } from "zod";
42
- import { bundleRefToString, parseBundleRef } from "../asset/asset-ref.js";
43
- import { warnOnce } from "../warn.js";
44
42
  import { BUILTIN_IMPROVE_STRATEGY_NAMES, IMPROVE_PROCESS_ENGINE_CAPABILITIES } from "./engine-semantics.js";
45
43
  import { EmbeddingConnectionConfigSchema } from "./schema/embedding.js";
46
44
  import { EnginesSchema } from "./schema/engines.js";
@@ -66,7 +64,7 @@ export { ConsolidateProcessConfigSchema, DistillProcessConfigSchema, ExtractProc
66
64
  export { IndexConfigSchema, IndexPassConfigSchema } from "./schema/index-config.js";
67
65
  export { OutputConfigSchema } from "./schema/output.js";
68
66
  export { CURRENT_CONFIG_VERSION, LlmInvocationOverridesSchema } from "./schema/primitives.js";
69
- export { SchedulerActivationSchema, SchedulerConfigSchema } from "./schema/scheduler.js";
67
+ export { SchedulerConfigSchema } from "./schema/scheduler.js";
70
68
  export { SearchConfigSchema } from "./schema/search.js";
71
69
  export { SetupConfigSchema } from "./schema/setup.js";
72
70
  export { BundleConfigEntrySchema, BundlesConfigSchema, RegistryConfigEntrySchema, SourceConfigEntrySchema, } from "./schema/sources-bundles.js";
@@ -143,11 +141,6 @@ const RETIRED_SOURCE_SHAPE_KEY_MESSAGES = {
143
141
  };
144
142
  export const AkmConfigSchema = AkmConfigBaseSchema.superRefine((config, ctx) => {
145
143
  const raw = config;
146
- for (const key of ["profiles", "llm", "agent", "features", "stashes", "modelAliases", "bindings", "writable"]) {
147
- if (key in raw) {
148
- warnOnce(`config:retired-key:${key}`, `Config key "${key}" is retired in 0.9 and is ignored; configure engines/improve.strategies/bundles.<id> instead.`);
149
- }
150
- }
151
144
  // Only the current source shape enters the runtime. There is no config
152
145
  // compatibility path; `bundles` + `defaultBundle` fully supersede these keys.
153
146
  for (const key of ["stashDir", "sources", "installed"]) {
@@ -200,31 +193,6 @@ export const AkmConfigSchema = AkmConfigBaseSchema.superRefine((config, ctx) =>
200
193
  });
201
194
  }
202
195
  }
203
- const activationKeys = new Set();
204
- for (const [index, activation] of (config.scheduler?.enabled ?? []).entries()) {
205
- try {
206
- const parsed = parseBundleRef(activation.ref);
207
- if (!parsed.bundle || parsed.fragment !== undefined || bundleRefToString(parsed) !== activation.ref) {
208
- throw new Error("not canonical");
209
- }
210
- const key = `${activation.kind}\0${activation.ref}`;
211
- if (activationKeys.has(key)) {
212
- ctx.addIssue({
213
- code: z.ZodIssueCode.custom,
214
- path: ["scheduler", "enabled", index],
215
- message: "duplicates an earlier scheduler activation",
216
- });
217
- }
218
- activationKeys.add(key);
219
- }
220
- catch {
221
- ctx.addIssue({
222
- code: z.ZodIssueCode.custom,
223
- path: ["scheduler", "enabled", index, "ref"],
224
- message: "must be one canonical fully-qualified ref without a fragment",
225
- });
226
- }
227
- }
228
196
  for (const key of ["llm", "agent", "improve"]) {
229
197
  if (config.defaults && key in config.defaults) {
230
198
  ctx.addIssue({
@@ -78,7 +78,7 @@ function unwrap(schema) {
78
78
  * AkmConfig schema. Returns `undefined` if any path segment doesn't match a
79
79
  * known schema field.
80
80
  */
81
- function resolveSchemaAt(path, config, raw) {
81
+ export function resolveSchemaAt(path, config, raw) {
82
82
  let schema = AkmConfigBaseSchema;
83
83
  let existing = config;
84
84
  for (const [index, segment] of path.entries()) {