akm-cli 0.9.17-alpha.3 → 0.9.17-alpha.5

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 (346) hide show
  1. package/CHANGELOG.md +760 -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/lint/base-linter.js +19 -5
  53. package/dist/commands/proposal/drain.js +251 -644
  54. package/dist/commands/proposal/proposal-cli.js +3 -18
  55. package/dist/commands/proposal/proposal-types.js +20 -41
  56. package/dist/commands/proposal/proposal.js +1 -2
  57. package/dist/commands/proposal/propose.js +134 -160
  58. package/dist/commands/proposal/repository.js +502 -1487
  59. package/dist/commands/proposal/validators/proposal-quality-validators.js +71 -174
  60. package/dist/commands/proposal/validators/proposal-validators.js +1 -1
  61. package/dist/commands/proposal/validators/proposals.js +13 -89
  62. package/dist/commands/read/curate.js +63 -413
  63. package/dist/commands/read/search-cli.js +16 -33
  64. package/dist/commands/read/search.js +17 -23
  65. package/dist/commands/read/show.js +2 -13
  66. package/dist/commands/sources/bundle-cli.js +25 -2
  67. package/dist/commands/sources/bundle-config-ops.js +4 -0
  68. package/dist/commands/sources/dangerous-env-audit.js +1 -2
  69. package/dist/commands/sources/info.js +2 -11
  70. package/dist/commands/sources/installed-stashes.js +197 -746
  71. package/dist/commands/sources/schema-repair.js +98 -129
  72. package/dist/commands/sources/source-add.js +62 -12
  73. package/dist/commands/sources/source-manage.js +9 -2
  74. package/dist/commands/sources/stash-cli.js +1 -1
  75. package/dist/commands/tasks/explain.js +10 -13
  76. package/dist/commands/tasks/tasks-cli.js +9 -8
  77. package/dist/commands/tasks/tasks.js +326 -930
  78. package/dist/commands/tasks/validate.js +42 -21
  79. package/dist/commands/workflow/plan.js +22 -29
  80. package/dist/commands/workflow-cli.js +4 -4
  81. package/dist/core/adapter/adapters/akm-adapter.js +0 -1
  82. package/dist/core/adapter/adapters/akm-lint.js +2 -3
  83. package/dist/core/adapter/adapters/akm-metadata.js +11 -12
  84. package/dist/core/adapter/adapters/akm-workflow-adapter.js +1 -1
  85. package/dist/core/adapter/execution-source.js +17 -29
  86. package/dist/core/asset/asset-placement.js +4 -13
  87. package/dist/core/asset/resolve-ref.js +1 -1
  88. package/dist/core/bundle-id.js +42 -5
  89. package/dist/core/bundle-rename.js +291 -0
  90. package/dist/core/config/config-io.js +1 -2
  91. package/dist/core/config/config-schema.js +1 -33
  92. package/dist/core/config/config-walker.js +1 -1
  93. package/dist/core/config/config.js +163 -68
  94. package/dist/core/config/legacy-source-shape-shim.js +38 -9
  95. package/dist/core/config/schema/embedding.js +20 -5
  96. package/dist/core/config/schema/engines.js +5 -0
  97. package/dist/core/config/schema/execution.js +1 -1
  98. package/dist/core/config/schema/experimental.js +1 -1
  99. package/dist/core/config/schema/improve-processes.js +21 -95
  100. package/dist/core/config/schema/improve.js +4 -42
  101. package/dist/core/config/schema/scheduler.js +12 -12
  102. package/dist/core/config/schema/search.js +6 -22
  103. package/dist/core/env-secret-ref.js +0 -1
  104. package/dist/core/errors.js +8 -9
  105. package/dist/core/file-lock.js +76 -173
  106. package/dist/core/logs-db.js +2 -2
  107. package/dist/core/paths.js +0 -27
  108. package/dist/core/redaction.js +109 -2
  109. package/dist/core/run-lock.js +2 -5
  110. package/dist/core/spawn-env.js +1 -1
  111. package/dist/core/state/migrations.js +108 -61
  112. package/dist/core/state-db-scope.js +2 -4
  113. package/dist/core/state-db.js +126 -692
  114. package/dist/core/type-presentation.js +1 -9
  115. package/dist/core/write-source.js +293 -1012
  116. package/dist/execution/input-contract.js +1 -1
  117. package/dist/execution/resolved-request.js +135 -689
  118. package/dist/execution/source.js +63 -257
  119. package/dist/execution/target-ref.js +1 -1
  120. package/dist/indexer/bundle-identity-guard.js +2 -2
  121. package/dist/indexer/db/graph-db.js +106 -46
  122. package/dist/indexer/ensure-index.js +44 -85
  123. package/dist/indexer/graph/graph-extraction.js +340 -562
  124. package/dist/indexer/graph/graph-related.js +130 -0
  125. package/dist/indexer/index-rebuild-lock.js +3 -11
  126. package/dist/indexer/index-writer-lock.js +8 -17
  127. package/dist/indexer/index-written-assets.js +139 -151
  128. package/dist/indexer/indexer.js +524 -846
  129. package/dist/indexer/materialize-embeddings.js +60 -397
  130. package/dist/indexer/passes/memory-inference.js +81 -90
  131. package/dist/indexer/passes/metadata.js +132 -200
  132. package/dist/indexer/read-preflight.js +0 -7
  133. package/dist/indexer/scan/doc-to-entry.js +1 -3
  134. package/dist/indexer/scan/drain-dir.js +1 -1
  135. package/dist/indexer/search/db-search.js +181 -590
  136. package/dist/indexer/search/fts-query.js +30 -41
  137. package/dist/indexer/search/ranking.js +28 -154
  138. package/dist/indexer/search/search-attribution.js +12 -32
  139. package/dist/indexer/search/search-fields.js +11 -15
  140. package/dist/indexer/search/search-hit-enrichers.js +54 -85
  141. package/dist/indexer/search/search-source.js +1 -4
  142. package/dist/indexer/usage/usage-events.js +2 -7
  143. package/dist/integrations/agent/engine-fallback.js +23 -40
  144. package/dist/integrations/agent/engine-resolution.js +93 -183
  145. package/dist/integrations/agent/execution.js +507 -0
  146. package/dist/integrations/agent/model-map.js +28 -156
  147. package/dist/integrations/agent/request-lowering.js +66 -141
  148. package/dist/integrations/agent/runner-dispatch.js +143 -321
  149. package/dist/integrations/agent/runner.js +54 -14
  150. package/dist/integrations/lockfile.js +53 -101
  151. package/dist/llm/embedders/deterministic.js +2 -3
  152. package/dist/llm/embedders/profile.js +71 -0
  153. package/dist/llm/embedders/remote.js +10 -15
  154. package/dist/llm/graph-extract.js +3 -12
  155. package/dist/llm/index-passes.js +3 -5
  156. package/dist/llm/memory-infer.js +1 -2
  157. package/dist/llm/metadata-enhance.js +1 -2
  158. package/dist/llm/structured-call.js +5 -24
  159. package/dist/output/generic-render.js +23 -11
  160. package/dist/output/html-render.js +13 -10
  161. package/dist/output/render-registry.js +3 -32
  162. package/dist/output/shapes/helpers.js +2 -34
  163. package/dist/output/shapes/passthrough.js +1 -9
  164. package/dist/{indexer/search/ranking-types.js → output/text/bundle-rename.js} +4 -1
  165. package/dist/output/text/command-format.js +60 -23
  166. package/dist/output/text/helpers.js +1 -1
  167. package/dist/output/text/migrate.js +5 -14
  168. package/dist/output/text/proposal-format.js +1 -2
  169. package/dist/output/text/workflow-format.js +0 -32
  170. package/dist/output/text.js +2 -0
  171. package/dist/registry/factory.js +4 -19
  172. package/dist/registry/network.js +66 -220
  173. package/dist/registry/providers/index.js +0 -2
  174. package/dist/registry/providers/skills-sh.js +3 -14
  175. package/dist/registry/providers/static-index.js +24 -26
  176. package/dist/registry/resolve.js +55 -131
  177. package/dist/scripts/akm-migrate-node.js +43940 -93320
  178. package/dist/scripts/akm-migrate.js +43700 -93078
  179. package/dist/setup/registry-stash-loader.js +4 -13
  180. package/dist/setup/semantic-assets.js +3 -44
  181. package/dist/setup/setup.js +1 -1
  182. package/dist/setup/steps/tasks.js +25 -15
  183. package/dist/sources/provider-factory.js +17 -18
  184. package/dist/sources/providers/filesystem.js +2 -3
  185. package/dist/sources/providers/git-install.js +7 -1
  186. package/dist/sources/providers/git-provider.js +0 -3
  187. package/dist/sources/providers/git-stash.js +0 -17
  188. package/dist/sources/providers/npm.js +2 -4
  189. package/dist/sources/providers/provider-utils.js +5 -10
  190. package/dist/sources/providers/website.js +0 -2
  191. package/dist/sources/snapshot-fetchers/website-ingest.js +1 -1
  192. package/dist/sources/website-url.js +2 -2
  193. package/dist/storage/database.js +9 -35
  194. package/dist/storage/repositories/improve-ledger-repository.js +168 -0
  195. package/dist/storage/repositories/index-connection.js +34 -70
  196. package/dist/storage/repositories/index-entries-repository.js +69 -111
  197. package/dist/storage/repositories/index-entry-mapper.js +1 -2
  198. package/dist/storage/repositories/index-entry-schema.js +83 -269
  199. package/dist/storage/repositories/index-fts-repository.js +86 -256
  200. package/dist/storage/repositories/index-llm-cache-repository.js +17 -0
  201. package/dist/storage/repositories/index-meta-repository.js +6 -4
  202. package/dist/storage/repositories/index-schema.js +192 -220
  203. package/dist/storage/repositories/index-utility-repository.js +8 -29
  204. package/dist/storage/repositories/index-vec-repository.js +133 -414
  205. package/dist/storage/repositories/outcome-repository.js +2 -1
  206. package/dist/storage/repositories/proposals-repository.js +35 -0
  207. package/dist/storage/repositories/registry-index-cache-repository.js +100 -0
  208. package/dist/storage/repositories/task-history-repository.js +26 -4
  209. package/dist/storage/repositories/workflow-runs-repository.js +53 -244
  210. package/dist/storage/sqlite-migrations.js +136 -0
  211. package/dist/storage/sqlite-pragmas.js +11 -9
  212. package/dist/storage/sqlite-transaction.js +170 -0
  213. package/dist/storage/state-db-integrity.js +34 -27
  214. package/dist/tasks/activation-config.js +134 -62
  215. package/dist/tasks/backends/cron.js +129 -277
  216. package/dist/tasks/backends/exec-utils.js +2 -5
  217. package/dist/tasks/backends/launchd.js +125 -745
  218. package/dist/tasks/backends/schtasks.js +101 -620
  219. package/dist/tasks/prepare/prepare-support.js +5 -15
  220. package/dist/tasks/prepare/prepare.js +0 -2
  221. package/dist/tasks/resolve-akm-bin.js +20 -79
  222. package/dist/tasks/run/attempt-lifecycle.js +0 -1
  223. package/dist/tasks/scheduler-binding.js +18 -238
  224. package/dist/tasks/scheduler-invocation.js +52 -52
  225. package/dist/tasks/scheduler-lock.js +53 -0
  226. package/dist/tasks/scheduler-sync.js +361 -751
  227. package/dist/tasks/source/parse-task-source.js +160 -10
  228. package/dist/tasks/source/task-source-v3-frozen.js +3 -4
  229. package/dist/tasks/source/task-to-v4.js +2 -2
  230. package/dist/workflows/authoring/authoring.js +3 -12
  231. package/dist/workflows/compile.js +211 -0
  232. package/dist/workflows/concurrency-policy.js +13 -74
  233. package/dist/workflows/exec/child-invocation.js +3 -17
  234. package/dist/workflows/exec/child-workflow.js +32 -141
  235. package/dist/workflows/exec/dispatch-redaction.js +13 -53
  236. package/dist/workflows/exec/environment.js +98 -0
  237. package/dist/workflows/exec/exec-unit.js +33 -140
  238. package/dist/workflows/exec/frozen-judge.js +7 -59
  239. package/dist/workflows/exec/native-executor.js +82 -341
  240. package/dist/workflows/exec/param-secrets.js +29 -47
  241. package/dist/workflows/exec/run-workflow.js +154 -387
  242. package/dist/workflows/exec/scheduler.js +9 -36
  243. package/dist/workflows/exec/step-work.js +127 -430
  244. package/dist/workflows/exec/unit-dispatch.js +11 -63
  245. package/dist/workflows/exec/unit-writer.js +8 -52
  246. package/dist/workflows/exec/worktree.js +39 -273
  247. package/dist/workflows/freeze/child-output-references.js +4 -15
  248. package/dist/workflows/freeze/environment.js +99 -92
  249. package/dist/workflows/freeze/freeze.js +172 -0
  250. package/dist/workflows/freeze/step-values.js +19 -21
  251. package/dist/workflows/freeze/targets/child-workflow.js +23 -92
  252. package/dist/workflows/freeze/targets/command.js +10 -33
  253. package/dist/workflows/freeze/targets/script.js +5 -12
  254. package/dist/workflows/freeze/targets/shell.js +3 -6
  255. package/dist/workflows/freeze/targets/task.js +25 -80
  256. package/dist/workflows/freeze/task-bindings.js +20 -67
  257. package/dist/workflows/{source-ir/github-yaml.js → github-yaml.js} +88 -206
  258. package/dist/workflows/ir/params.js +6 -51
  259. package/dist/workflows/ir/plan-hash.js +2 -34
  260. package/dist/workflows/parser.js +140 -43
  261. package/dist/{commands/improve/consolidate/types.js → workflows/plan.js} +2 -1
  262. package/dist/workflows/renderer.js +36 -69
  263. package/dist/workflows/resource-limits.js +12 -120
  264. package/dist/workflows/runtime/agent-identity.js +8 -40
  265. package/dist/workflows/runtime/run-outputs.js +3 -6
  266. package/dist/workflows/runtime/run-plan.js +316 -0
  267. package/dist/workflows/runtime/runs.js +48 -200
  268. package/dist/workflows/runtime/workflow-asset-loader.js +24 -57
  269. package/dist/workflows/{source-ir/semantics.js → source-semantics.js} +16 -20
  270. package/dist/workflows/validate-summary.js +2 -7
  271. package/docs/integration/bundling-akm.md +49 -42
  272. package/docs/migration/README.md +1 -0
  273. package/docs/migration/release-notes/0.9.17.md +41 -0
  274. package/docs/migration/v0.9.1-to-v0.9.2.md +19 -7
  275. package/docs/reference/cli.md +182 -125
  276. package/docs/reference/configuration.md +49 -56
  277. package/docs/reference/data-and-telemetry.md +19 -20
  278. package/docs/reference/tasks.md +86 -38
  279. package/docs/reference/workflow-schema.md +14 -18
  280. package/docs/reference/workflows.md +6 -9
  281. package/package.json +1 -1
  282. package/schemas/akm-config.json +87 -406
  283. package/dist/commands/health/advisories.js +0 -150
  284. package/dist/commands/health/metrics.js +0 -329
  285. package/dist/commands/health/surfaces.js +0 -102
  286. package/dist/commands/improve/anti-collapse.js +0 -83
  287. package/dist/commands/improve/collapse-detector.js +0 -432
  288. package/dist/commands/improve/consolidate/eligibility.js +0 -48
  289. package/dist/commands/improve/consolidate/merge.js +0 -146
  290. package/dist/commands/improve/distill/promote-memory.js +0 -329
  291. package/dist/commands/improve/distill/quality-gate.js +0 -500
  292. package/dist/commands/improve/memory/memory-contradiction-detect.js +0 -291
  293. package/dist/commands/improve/proposal-envelope.js +0 -31
  294. package/dist/commands/improve/run-context.js +0 -123
  295. package/dist/commands/improve/shared.js +0 -21
  296. package/dist/commands/improve/source-identity.js +0 -28
  297. package/dist/commands/improve/triage.js +0 -96
  298. package/dist/commands/proposal/drain-policies.js +0 -151
  299. package/dist/commands/sources/update-transaction.js +0 -220
  300. package/dist/core/action-contributors.js +0 -28
  301. package/dist/core/config/config-version-shim.js +0 -101
  302. package/dist/core/config/retired-experimental-keys-shim.js +0 -62
  303. package/dist/core/fs-txn.js +0 -405
  304. package/dist/core/lexical-score.js +0 -25
  305. package/dist/core/maintenance-barrier.js +0 -167
  306. package/dist/execution/executable-identity.js +0 -105
  307. package/dist/execution/guarded-source.js +0 -441
  308. package/dist/indexer/graph/graph-boost.js +0 -427
  309. package/dist/indexer/graph/graph-dedup.js +0 -95
  310. package/dist/indexer/search/name-match.js +0 -35
  311. package/dist/indexer/search/ranking-contributors.js +0 -515
  312. package/dist/indexer/walk/project-context.js +0 -192
  313. package/dist/integrations/agent/execution-cascade.js +0 -566
  314. package/dist/integrations/agent/execution-definitions.js +0 -202
  315. package/dist/integrations/agent/execution-lowering.js +0 -841
  316. package/dist/integrations/agent/execution-preparation.js +0 -98
  317. package/dist/integrations/agent/inline-execution.js +0 -74
  318. package/dist/registry/create-provider-registry.js +0 -29
  319. package/dist/registry/pinned-request-helper.js +0 -247
  320. package/dist/registry/pinned-transport.js +0 -717
  321. package/dist/sources/providers/index.js +0 -14
  322. package/dist/storage/engines/sqlite-migrations.js +0 -271
  323. package/dist/storage/repositories/canaries-repository.js +0 -107
  324. package/dist/storage/repositories/embedding-salvage-repository.js +0 -184
  325. package/dist/storage/repositories/registry-cache.js +0 -113
  326. package/dist/tasks/scheduler-sync-preview.js +0 -52
  327. package/dist/workflows/freeze/resolve-steps.js +0 -86
  328. package/dist/workflows/freeze/source-freeze.js +0 -64
  329. package/dist/workflows/ir/compile.js +0 -321
  330. package/dist/workflows/ir/environment-v4.js +0 -330
  331. package/dist/workflows/ir/freeze-v4.js +0 -153
  332. package/dist/workflows/ir/schema-v4.js +0 -745
  333. package/dist/workflows/ir/schema.js +0 -354
  334. package/dist/workflows/program/schema.js +0 -78
  335. package/dist/workflows/runtime/checkin.js +0 -57
  336. package/dist/workflows/runtime/plan-classifier.js +0 -196
  337. package/dist/workflows/runtime/unit-checkin.js +0 -45
  338. package/dist/workflows/runtime/unit-phases.js +0 -20
  339. package/dist/workflows/schema.js +0 -4
  340. package/dist/workflows/source-ir/compile.js +0 -200
  341. package/dist/workflows/source-ir/program.js +0 -50
  342. package/dist/workflows/source-ir/result.js +0 -26
  343. package/dist/workflows/source-ir/schema.js +0 -786
  344. package/dist/workflows/source-ir/triggers.js +0 -79
  345. package/dist/workflows/source-ir/uses.js +0 -40
  346. 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()) {