akm-cli 0.9.16 → 0.9.17-alpha.10

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 (403) hide show
  1. package/CHANGELOG.md +2101 -0
  2. package/STABILITY.md +11 -10
  3. package/dist/akm +124 -193
  4. package/dist/akm-migrate +38 -19
  5. package/dist/assets/hints/cli-hints-full.md +6 -7
  6. package/dist/assets/improve-strategies/catchup.json +0 -3
  7. package/dist/assets/improve-strategies/consolidate.json +0 -1
  8. package/dist/assets/improve-strategies/default.json +1 -2
  9. package/dist/assets/improve-strategies/proactive-maintenance.json +1 -2
  10. package/dist/assets/improve-strategies/quick.json +1 -2
  11. package/dist/assets/improve-strategies/reflect-distill.json +1 -2
  12. package/dist/assets/improve-strategies/thorough.json +0 -3
  13. package/dist/assets/prompts/consolidate-pair.md +20 -0
  14. package/dist/assets/prompts/consolidate-system.md +4 -11
  15. package/dist/assets/prompts/retrieval-relevance-judge.md +6 -0
  16. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +20 -20
  17. package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -2
  18. package/dist/assets/templates/html/health.html +3 -5
  19. package/dist/cli/retired-commands.js +1 -1
  20. package/dist/cli/shared.js +6 -2
  21. package/dist/cli/unknown-flags.js +24 -1
  22. package/dist/cli.js +68 -10
  23. package/dist/commands/agent/agent-dispatch.js +1 -1
  24. package/dist/commands/command/command-execution.js +24 -62
  25. package/dist/commands/feedback-cli.js +0 -1
  26. package/dist/commands/health/accept-rate.js +6 -0
  27. package/dist/commands/health/archive-usage.js +92 -0
  28. package/dist/commands/health/checks.js +83 -74
  29. package/dist/commands/health/config-skew.js +38 -0
  30. package/dist/commands/health/data-dir-usage.js +25 -13
  31. package/dist/commands/health/egress.js +54 -0
  32. package/dist/commands/health/html-report.js +1 -42
  33. package/dist/commands/health/improve-metrics.js +136 -591
  34. package/dist/commands/health/md-report.js +1 -6
  35. package/dist/commands/health/plugin-staleness.js +53 -3
  36. package/dist/commands/health/renderers.js +12 -4
  37. package/dist/commands/health/report-view-model.js +14 -120
  38. package/dist/commands/health/types-improve.js +4 -19
  39. package/dist/commands/health/windows.js +64 -74
  40. package/dist/commands/health.js +145 -143
  41. package/dist/commands/improve/consolidate/chunking.js +26 -117
  42. package/dist/commands/improve/consolidate/continuity-check.js +137 -0
  43. package/dist/commands/improve/consolidate/pair-pass.js +791 -0
  44. package/dist/commands/improve/consolidate/sanitize.js +54 -149
  45. package/dist/commands/improve/consolidate.js +589 -1127
  46. package/dist/commands/improve/content-hash.js +16 -24
  47. package/dist/commands/improve/distill/content-repair.js +18 -100
  48. package/dist/commands/improve/distill-guards.js +20 -81
  49. package/dist/commands/improve/distill-promotion-policy.js +23 -243
  50. package/dist/commands/improve/distill.js +608 -1041
  51. package/dist/commands/improve/eligibility.js +126 -390
  52. package/dist/commands/improve/execution.js +8 -10
  53. package/dist/commands/improve/extract-prompt.js +1 -2
  54. package/dist/commands/improve/extract.js +487 -1046
  55. package/dist/commands/improve/feedback-valence.js +0 -25
  56. package/dist/commands/improve/improve-cli.js +75 -169
  57. package/dist/commands/improve/improve-result-file.js +10 -66
  58. package/dist/commands/improve/improve-strategies.js +52 -4
  59. package/dist/commands/improve/improve-usage-report.js +18 -64
  60. package/dist/commands/improve/improve.js +480 -1074
  61. package/dist/commands/improve/ledger.js +119 -0
  62. package/dist/commands/improve/locks.js +2 -8
  63. package/dist/commands/improve/loop-stages.js +415 -1073
  64. package/dist/commands/improve/memory/derived-ref.js +12 -77
  65. package/dist/commands/improve/memory/memory-belief.js +16 -118
  66. package/dist/commands/improve/memory/memory-improve.js +266 -14
  67. package/dist/commands/improve/outcome-loop.js +28 -156
  68. package/dist/commands/improve/planner.js +5 -15
  69. package/dist/commands/improve/preparation.js +779 -2319
  70. package/dist/commands/improve/proactive-maintenance.js +34 -101
  71. package/dist/commands/improve/reflect-noise.js +104 -280
  72. package/dist/commands/improve/reflect.js +642 -1353
  73. package/dist/commands/improve/retrieval-gate.js +127 -0
  74. package/dist/commands/improve/retrieval-scope.js +92 -0
  75. package/dist/commands/improve/salience.js +41 -240
  76. package/dist/commands/improve/session-asset.js +19 -100
  77. package/dist/commands/improve/stage.js +322 -0
  78. package/dist/commands/lint/base-linter.js +37 -15
  79. package/dist/commands/proposal/drain.js +261 -578
  80. package/dist/commands/proposal/proposal-cli.js +19 -20
  81. package/dist/commands/proposal/proposal-types.js +31 -24
  82. package/dist/commands/proposal/proposal.js +38 -8
  83. package/dist/commands/proposal/propose.js +134 -160
  84. package/dist/commands/proposal/repository.js +1097 -1394
  85. package/dist/commands/proposal/validators/proposal-quality-validators.js +71 -174
  86. package/dist/commands/proposal/validators/proposal-validators.js +1 -1
  87. package/dist/commands/proposal/validators/proposals.js +22 -89
  88. package/dist/commands/read/curate.js +105 -462
  89. package/dist/commands/read/knowledge.js +3 -2
  90. package/dist/commands/read/search-cli.js +16 -33
  91. package/dist/commands/read/search.js +17 -23
  92. package/dist/commands/read/show.js +57 -108
  93. package/dist/commands/sources/bundle-cli.js +25 -2
  94. package/dist/commands/sources/bundle-config-ops.js +4 -0
  95. package/dist/commands/sources/dangerous-env-audit.js +1 -2
  96. package/dist/commands/sources/info.js +127 -29
  97. package/dist/commands/sources/installed-stashes.js +197 -746
  98. package/dist/commands/sources/schema-repair.js +98 -129
  99. package/dist/commands/sources/source-add.js +62 -12
  100. package/dist/commands/sources/source-manage.js +9 -2
  101. package/dist/commands/sources/stash-cli.js +24 -4
  102. package/dist/commands/tasks/explain.js +10 -13
  103. package/dist/commands/tasks/tasks-cli.js +12 -13
  104. package/dist/commands/tasks/tasks.js +350 -936
  105. package/dist/commands/tasks/validate.js +26 -24
  106. package/dist/commands/workflow/plan.js +22 -29
  107. package/dist/commands/workflow-cli.js +4 -4
  108. package/dist/core/adapter/adapters/akm-adapter.js +2 -1
  109. package/dist/core/adapter/adapters/akm-lint.js +2 -3
  110. package/dist/core/adapter/adapters/akm-metadata.js +42 -12
  111. package/dist/core/adapter/adapters/akm-task-adapter.js +29 -8
  112. package/dist/core/adapter/adapters/akm-workflow-adapter.js +1 -1
  113. package/dist/core/adapter/execution-source.js +17 -29
  114. package/dist/core/asset/asset-placement.js +4 -13
  115. package/dist/core/asset/frontmatter.js +106 -1
  116. package/dist/core/asset/resolve-ref.js +1 -1
  117. package/dist/core/bundle-id.js +42 -5
  118. package/dist/core/bundle-rename.js +285 -0
  119. package/dist/core/config/config-io.js +1 -2
  120. package/dist/core/config/config-schema.js +9 -34
  121. package/dist/core/config/config-walker.js +1 -1
  122. package/dist/core/config/config.js +184 -111
  123. package/dist/core/config/engine-semantics.js +0 -2
  124. package/dist/core/config/legacy-source-shape-shim.js +38 -9
  125. package/dist/core/config/schema/embedding.js +20 -5
  126. package/dist/core/config/schema/engines.js +5 -0
  127. package/dist/core/config/schema/execution.js +1 -1
  128. package/dist/core/config/schema/experimental.js +1 -1
  129. package/dist/core/config/schema/improve-processes.js +54 -125
  130. package/dist/core/config/schema/improve.js +4 -42
  131. package/dist/core/config/schema/index-config.js +9 -48
  132. package/dist/core/config/schema/scheduler.js +12 -12
  133. package/dist/core/config/schema/search.js +6 -22
  134. package/dist/core/env-secret-ref.js +0 -1
  135. package/dist/core/errors.js +8 -9
  136. package/dist/core/file-change.js +13 -5
  137. package/dist/core/file-lock.js +76 -173
  138. package/dist/core/improve-result.js +35 -7
  139. package/dist/core/improve-types.js +0 -1
  140. package/dist/core/logs-db.js +2 -2
  141. package/dist/core/loopback.js +7 -12
  142. package/dist/core/non-task-input.js +20 -0
  143. package/dist/core/parse.js +13 -16
  144. package/dist/core/paths.js +0 -24
  145. package/dist/core/redaction.js +109 -2
  146. package/dist/core/run-lock.js +2 -5
  147. package/dist/core/spawn-env.js +1 -1
  148. package/dist/core/state/migrations.js +123 -61
  149. package/dist/core/state-db-scope.js +2 -4
  150. package/dist/core/state-db.js +126 -692
  151. package/dist/core/time.js +0 -20
  152. package/dist/core/type-presentation.js +1 -9
  153. package/dist/core/write-source.js +294 -1005
  154. package/dist/execution/input-contract.js +1 -1
  155. package/dist/execution/resolved-request.js +135 -689
  156. package/dist/execution/source.js +63 -257
  157. package/dist/execution/target-ref.js +1 -1
  158. package/dist/indexer/bundle-identity-guard.js +2 -2
  159. package/dist/indexer/db/llm-cache.js +2 -2
  160. package/dist/indexer/ensure-index.js +77 -73
  161. package/dist/indexer/index-rebuild-lock.js +3 -11
  162. package/dist/indexer/index-writer-lock.js +8 -17
  163. package/dist/indexer/index-written-assets.js +141 -154
  164. package/dist/indexer/indexer.js +400 -1124
  165. package/dist/indexer/links/declared-links.js +90 -0
  166. package/dist/indexer/materialize-embeddings.js +60 -397
  167. package/dist/indexer/passes/memory-inference.js +96 -90
  168. package/dist/indexer/passes/metadata.js +132 -219
  169. package/dist/indexer/read-preflight.js +0 -7
  170. package/dist/indexer/scan/doc-to-entry.js +2 -3
  171. package/dist/indexer/scan/drain-dir.js +1 -1
  172. package/dist/indexer/search/db-search.js +190 -590
  173. package/dist/indexer/search/fts-query.js +30 -41
  174. package/dist/indexer/search/ranking.js +28 -154
  175. package/dist/indexer/search/search-attribution.js +12 -32
  176. package/dist/indexer/search/search-fields.js +11 -15
  177. package/dist/indexer/search/search-hit-enrichers.js +54 -85
  178. package/dist/indexer/search/search-source.js +1 -4
  179. package/dist/indexer/usage/usage-events.js +36 -7
  180. package/dist/indexer/walk/walker.js +3 -4
  181. package/dist/integrations/agent/engine-fallback.js +23 -40
  182. package/dist/integrations/agent/engine-resolution.js +93 -183
  183. package/dist/integrations/agent/execution.js +507 -0
  184. package/dist/integrations/agent/model-map.js +28 -156
  185. package/dist/integrations/agent/request-lowering.js +66 -141
  186. package/dist/integrations/agent/runner-dispatch.js +143 -321
  187. package/dist/integrations/agent/runner.js +54 -14
  188. package/dist/integrations/lockfile.js +53 -101
  189. package/dist/llm/client.js +18 -6
  190. package/dist/llm/embedders/deterministic.js +2 -3
  191. package/dist/llm/embedders/profile.js +71 -0
  192. package/dist/llm/embedders/remote.js +11 -17
  193. package/dist/llm/feature-gate.js +0 -8
  194. package/dist/llm/index-passes.js +3 -5
  195. package/dist/llm/memory-infer.js +1 -2
  196. package/dist/llm/structured-call.js +5 -24
  197. package/dist/output/generic-render.js +23 -11
  198. package/dist/output/html-render.js +13 -10
  199. package/dist/output/render-registry.js +3 -32
  200. package/dist/output/shapes/helpers.js +25 -38
  201. package/dist/output/shapes/passthrough.js +1 -9
  202. package/dist/{indexer/graph/graph-types.js → output/text/bundle-rename.js} +4 -1
  203. package/dist/output/text/command-format.js +69 -31
  204. package/dist/output/text/helpers.js +1 -1
  205. package/dist/output/text/migrate.js +5 -14
  206. package/dist/output/text/proposal-format.js +48 -3
  207. package/dist/output/text/show-format.js +13 -17
  208. package/dist/output/text/workflow-format.js +0 -32
  209. package/dist/output/text.js +2 -0
  210. package/dist/registry/factory.js +4 -19
  211. package/dist/registry/network.js +66 -220
  212. package/dist/registry/providers/index.js +0 -2
  213. package/dist/registry/providers/skills-sh.js +3 -14
  214. package/dist/registry/providers/static-index.js +24 -26
  215. package/dist/registry/resolve.js +55 -131
  216. package/dist/scripts/akm-migrate-node.js +42948 -92369
  217. package/dist/scripts/akm-migrate.js +42935 -92354
  218. package/dist/setup/registry-stash-loader.js +4 -13
  219. package/dist/setup/semantic-assets.js +3 -44
  220. package/dist/setup/setup.js +1 -1
  221. package/dist/setup/steps/connection.js +5 -6
  222. package/dist/setup/steps/platforms.js +2 -2
  223. package/dist/setup/steps/tasks.js +25 -15
  224. package/dist/sources/provider-factory.js +17 -18
  225. package/dist/sources/providers/filesystem.js +2 -3
  226. package/dist/sources/providers/git-install.js +7 -1
  227. package/dist/sources/providers/git-provider.js +0 -3
  228. package/dist/sources/providers/git-stash.js +83 -21
  229. package/dist/sources/providers/npm.js +2 -4
  230. package/dist/sources/providers/provider-utils.js +5 -10
  231. package/dist/sources/providers/website.js +0 -2
  232. package/dist/sources/snapshot-fetchers/website-ingest.js +1 -1
  233. package/dist/sources/website-url.js +2 -2
  234. package/dist/storage/database.js +9 -35
  235. package/dist/storage/repositories/improve-ledger-repository.js +209 -0
  236. package/dist/storage/repositories/index-connection.js +39 -72
  237. package/dist/storage/repositories/index-entries-repository.js +131 -129
  238. package/dist/storage/repositories/index-entry-mapper.js +1 -2
  239. package/dist/storage/repositories/index-entry-schema.js +101 -268
  240. package/dist/storage/repositories/index-fts-repository.js +86 -256
  241. package/dist/storage/repositories/index-links-repository.js +143 -0
  242. package/dist/storage/repositories/index-llm-cache-repository.js +7 -9
  243. package/dist/storage/repositories/index-meta-repository.js +6 -4
  244. package/dist/storage/repositories/index-schema.js +257 -325
  245. package/dist/storage/repositories/index-utility-repository.js +8 -29
  246. package/dist/storage/repositories/index-vec-repository.js +133 -414
  247. package/dist/storage/repositories/outcome-repository.js +2 -1
  248. package/dist/storage/repositories/proposals-repository.js +104 -1
  249. package/dist/storage/repositories/registry-index-cache-repository.js +100 -0
  250. package/dist/storage/repositories/salience-repository.js +1 -19
  251. package/dist/storage/repositories/task-history-repository.js +26 -4
  252. package/dist/storage/repositories/workflow-runs-repository.js +53 -244
  253. package/dist/storage/sqlite-migrations.js +136 -0
  254. package/dist/storage/sqlite-pragmas.js +11 -9
  255. package/dist/storage/sqlite-transaction.js +170 -0
  256. package/dist/storage/state-db-integrity.js +130 -0
  257. package/dist/tasks/activation-config.js +134 -62
  258. package/dist/tasks/backends/cron.js +191 -302
  259. package/dist/tasks/backends/exec-utils.js +2 -5
  260. package/dist/tasks/backends/launchd.js +141 -748
  261. package/dist/tasks/backends/schtasks.js +119 -623
  262. package/dist/tasks/prepare/prepare-support.js +5 -15
  263. package/dist/tasks/prepare/prepare.js +0 -2
  264. package/dist/tasks/resolve-akm-bin.js +20 -79
  265. package/dist/tasks/run/attempt-lifecycle.js +0 -1
  266. package/dist/tasks/run/load-task.js +1 -1
  267. package/dist/tasks/scheduler-binding.js +20 -238
  268. package/dist/tasks/scheduler-invocation.js +136 -244
  269. package/dist/tasks/scheduler-lock.js +53 -0
  270. package/dist/tasks/scheduler-sync.js +368 -679
  271. package/dist/tasks/source/parse-task-source.js +55 -9
  272. package/dist/tasks/source/task-source-v3-frozen.js +3 -4
  273. package/dist/tasks/source/task-to-v4.js +464 -88
  274. package/dist/workflows/authoring/authoring.js +3 -12
  275. package/dist/workflows/compile.js +211 -0
  276. package/dist/workflows/concurrency-policy.js +13 -74
  277. package/dist/workflows/exec/child-invocation.js +3 -17
  278. package/dist/workflows/exec/child-workflow.js +32 -141
  279. package/dist/workflows/exec/dispatch-redaction.js +13 -53
  280. package/dist/workflows/exec/environment.js +98 -0
  281. package/dist/workflows/exec/exec-unit.js +33 -140
  282. package/dist/workflows/exec/frozen-judge.js +7 -59
  283. package/dist/workflows/exec/native-executor.js +82 -341
  284. package/dist/workflows/exec/param-secrets.js +29 -47
  285. package/dist/workflows/exec/run-workflow.js +154 -387
  286. package/dist/workflows/exec/scheduler.js +9 -36
  287. package/dist/workflows/exec/step-work.js +127 -430
  288. package/dist/workflows/exec/unit-dispatch.js +11 -63
  289. package/dist/workflows/exec/unit-writer.js +8 -52
  290. package/dist/workflows/exec/worktree.js +39 -273
  291. package/dist/workflows/freeze/child-output-references.js +4 -15
  292. package/dist/workflows/freeze/environment.js +99 -92
  293. package/dist/workflows/freeze/freeze.js +172 -0
  294. package/dist/workflows/freeze/step-values.js +19 -21
  295. package/dist/workflows/freeze/targets/child-workflow.js +23 -92
  296. package/dist/workflows/freeze/targets/command.js +10 -33
  297. package/dist/workflows/freeze/targets/script.js +5 -12
  298. package/dist/workflows/freeze/targets/shell.js +3 -6
  299. package/dist/workflows/freeze/targets/task.js +25 -80
  300. package/dist/workflows/freeze/task-bindings.js +20 -67
  301. package/dist/workflows/{source-ir/github-yaml.js → github-yaml.js} +88 -206
  302. package/dist/workflows/ir/params.js +6 -51
  303. package/dist/workflows/ir/plan-hash.js +2 -34
  304. package/dist/workflows/parser.js +140 -43
  305. package/dist/{commands/improve/consolidate/types.js → workflows/plan.js} +2 -1
  306. package/dist/workflows/renderer.js +36 -69
  307. package/dist/workflows/resource-limits.js +12 -120
  308. package/dist/workflows/runtime/agent-identity.js +8 -40
  309. package/dist/workflows/runtime/run-outputs.js +3 -6
  310. package/dist/workflows/runtime/run-plan.js +316 -0
  311. package/dist/workflows/runtime/runs.js +48 -200
  312. package/dist/workflows/runtime/workflow-asset-loader.js +24 -57
  313. package/dist/workflows/{source-ir/semantics.js → source-semantics.js} +16 -20
  314. package/dist/workflows/validate-summary.js +2 -7
  315. package/docs/integration/bundling-akm.md +49 -42
  316. package/docs/migration/README.md +1 -0
  317. package/docs/migration/release-notes/0.9.17.md +43 -0
  318. package/docs/migration/v0.9.1-to-v0.9.2.md +23 -7
  319. package/docs/reference/cli.md +232 -135
  320. package/docs/reference/configuration.md +71 -57
  321. package/docs/reference/data-and-telemetry.md +20 -21
  322. package/docs/reference/tasks.md +105 -39
  323. package/docs/reference/workflow-schema.md +14 -18
  324. package/docs/reference/workflows.md +6 -9
  325. package/package.json +1 -1
  326. package/schemas/akm-config.json +115 -738
  327. package/schemas/akm-workflow.json +1 -0
  328. package/dist/assets/improve-strategies/graph-refresh.json +0 -15
  329. package/dist/assets/prompts/contradiction-judge.md +0 -33
  330. package/dist/assets/prompts/graph-extract-system.md +0 -1
  331. package/dist/assets/prompts/graph-extract-user-prompt.md +0 -35
  332. package/dist/assets/prompts/metadata-enhance-system.md +0 -1
  333. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +0 -4
  334. package/dist/commands/health/advisories.js +0 -150
  335. package/dist/commands/health/metrics.js +0 -329
  336. package/dist/commands/health/surfaces.js +0 -102
  337. package/dist/commands/improve/anti-collapse.js +0 -83
  338. package/dist/commands/improve/collapse-detector.js +0 -432
  339. package/dist/commands/improve/consolidate/eligibility.js +0 -48
  340. package/dist/commands/improve/consolidate/merge.js +0 -149
  341. package/dist/commands/improve/distill/promote-memory.js +0 -291
  342. package/dist/commands/improve/distill/quality-gate.js +0 -337
  343. package/dist/commands/improve/eval-cases.js +0 -52
  344. package/dist/commands/improve/memory/memory-contradiction-detect.js +0 -291
  345. package/dist/commands/improve/proposal-envelope.js +0 -31
  346. package/dist/commands/improve/run-context.js +0 -123
  347. package/dist/commands/improve/shared.js +0 -31
  348. package/dist/commands/improve/source-identity.js +0 -28
  349. package/dist/commands/improve/triage.js +0 -96
  350. package/dist/commands/proposal/drain-policies.js +0 -151
  351. package/dist/commands/sources/update-transaction.js +0 -220
  352. package/dist/core/action-contributors.js +0 -28
  353. package/dist/core/config/config-version-shim.js +0 -101
  354. package/dist/core/fs-txn.js +0 -405
  355. package/dist/core/lexical-score.js +0 -25
  356. package/dist/core/maintenance-barrier.js +0 -167
  357. package/dist/execution/executable-identity.js +0 -105
  358. package/dist/execution/guarded-source.js +0 -427
  359. package/dist/indexer/db/graph-db.js +0 -444
  360. package/dist/indexer/graph/graph-boost.js +0 -427
  361. package/dist/indexer/graph/graph-dedup.js +0 -95
  362. package/dist/indexer/graph/graph-extraction.js +0 -1108
  363. package/dist/indexer/search/name-match.js +0 -35
  364. package/dist/indexer/search/ranking-contributors.js +0 -515
  365. package/dist/indexer/search/ranking-types.js +0 -4
  366. package/dist/indexer/walk/project-context.js +0 -192
  367. package/dist/integrations/agent/execution-cascade.js +0 -566
  368. package/dist/integrations/agent/execution-definitions.js +0 -202
  369. package/dist/integrations/agent/execution-lowering.js +0 -841
  370. package/dist/integrations/agent/execution-preparation.js +0 -98
  371. package/dist/integrations/agent/inline-execution.js +0 -74
  372. package/dist/llm/graph-extract.js +0 -728
  373. package/dist/llm/metadata-enhance.js +0 -96
  374. package/dist/registry/create-provider-registry.js +0 -29
  375. package/dist/registry/pinned-request-helper.js +0 -247
  376. package/dist/registry/pinned-transport.js +0 -717
  377. package/dist/sources/providers/index.js +0 -14
  378. package/dist/storage/engines/sqlite-migrations.js +0 -271
  379. package/dist/storage/repositories/canaries-repository.js +0 -107
  380. package/dist/storage/repositories/embedding-salvage-repository.js +0 -184
  381. package/dist/storage/repositories/registry-cache.js +0 -113
  382. package/dist/tasks/scheduler-sync-preview.js +0 -52
  383. package/dist/tasks/source/task-to-v3.js +0 -507
  384. package/dist/workflows/freeze/resolve-steps.js +0 -86
  385. package/dist/workflows/freeze/source-freeze.js +0 -64
  386. package/dist/workflows/ir/compile.js +0 -321
  387. package/dist/workflows/ir/environment-v4.js +0 -330
  388. package/dist/workflows/ir/freeze-v4.js +0 -153
  389. package/dist/workflows/ir/schema-v4.js +0 -745
  390. package/dist/workflows/ir/schema.js +0 -354
  391. package/dist/workflows/program/schema.js +0 -77
  392. package/dist/workflows/runtime/checkin.js +0 -57
  393. package/dist/workflows/runtime/plan-classifier.js +0 -196
  394. package/dist/workflows/runtime/unit-checkin.js +0 -45
  395. package/dist/workflows/runtime/unit-phases.js +0 -20
  396. package/dist/workflows/schema.js +0 -4
  397. package/dist/workflows/source-ir/compile.js +0 -200
  398. package/dist/workflows/source-ir/program.js +0 -50
  399. package/dist/workflows/source-ir/result.js +0 -26
  400. package/dist/workflows/source-ir/schema.js +0 -786
  401. package/dist/workflows/source-ir/triggers.js +0 -79
  402. package/dist/workflows/source-ir/uses.js +0 -40
  403. package/dist/workflows/validator.js +0 -60
@@ -612,8 +612,9 @@ export async function writeMarkdownAsset(options) {
612
612
  // no longer trigger reindexes, so keeping the index current is the writer's
613
613
  // job. Demoted files reindex under their own containing root (usually the
614
614
  // write target itself; the working stash when writing to a --target) so
615
- // `--belief current` filtering and the beliefState ranking demotion take
616
- // effect without waiting for the next full index.
615
+ // `--belief current` filtering takes effect without waiting for the next
616
+ // full index. (alpha.4 removed belief weights from ranking; `--belief` is
617
+ // the only reader of `beliefState` today.)
617
618
  const demotedInTargetRoot = demotedByRoot.get(source.path) ?? [];
618
619
  demotedByRoot.delete(source.path);
619
620
  await indexWrittenAssets(source.path, [result.path, ...demotedInTargetRoot], { bundleId: resolved.ref.origin });
@@ -76,36 +76,24 @@ export const searchCommand = defineJsonCommand({
76
76
  description: "Memory belief filter: all|current|historical. current keeps active memory beliefs; historical keeps contradicted/superseded/archived memory beliefs.",
77
77
  default: "all",
78
78
  },
79
- // Declared as the POSITIVE name with `default: true` so citty's native
80
- // `--no-<name>` negation (it strips a leading `--no-` from ANY token and
81
- // negates the remainder BEFORE consulting the declared-args table — see
82
- // node_modules/citty/dist/index.mjs) does the work, the same pattern
83
- // `sync --push/--no-push` uses. A flag DECLARED as `no-project-context`
84
- // can never be negated: `--no-project-context` parses as "negate
85
- // `project-context`", a name nothing declared, leaving the real key at
86
- // its default `false` forever (F1/A1).
87
- "project-context": {
88
- type: "boolean",
89
- default: true,
90
- description: "Automatic project-context ranking boost: assets whose name/tags/aliases match the current working " +
91
- "directory's project get a small score boost, and this search's usage also feeds the scoped-utility " +
92
- "ranking signal. Default: on. Use --no-project-context to disable BOTH the project-context boost and " +
93
- "the scoped-utility signal for this search only.",
94
- },
95
79
  "include-sessions": {
96
80
  type: "boolean",
97
81
  description: "Include session assets (excluded from default search results via config.search.defaultExcludeTypes).",
98
82
  default: false,
99
83
  },
100
- // Declared as the POSITIVE name with `default: true` for the same reason
101
- // as `project-context` above — never declare a flag whose NAME starts
102
- // with `no-`.
84
+ // Declared as the POSITIVE name with `default: true` so citty's native
85
+ // `--no-<name>` negation (it strips a leading `--no-` from ANY token and
86
+ // negates the remainder BEFORE consulting the declared-args table — see
87
+ // node_modules/citty/dist/index.mjs) does the work, the same pattern
88
+ // `sync --push/--no-push` uses. A flag DECLARED as `no-track-usage` could
89
+ // never be negated: `--no-track-usage` parses as "negate `track-usage`",
90
+ // a name nothing declared, leaving the real key at its default forever
91
+ // (F1/A1).
103
92
  "track-usage": {
104
93
  type: "boolean",
105
94
  default: true,
106
- description: "A successful search updates ranking signals (usage-events telemetry and the MemRL utility-score bump " +
107
- "used to prioritize future results). Default: on. Use --no-track-usage to run a read-only search that " +
108
- "does not influence future ranking.",
95
+ description: "A successful search records usage-events telemetry. Default: on. Use --no-track-usage to run a " +
96
+ "search that records nothing.",
109
97
  },
110
98
  },
111
99
  async run({ args }) {
@@ -120,7 +108,6 @@ export const searchCommand = defineJsonCommand({
120
108
  const filters = parseScopeFilterFlags(filterTokens, "--filter");
121
109
  const includeProposed = args["include-proposed"] === true;
122
110
  const belief = parseBeliefFilterMode(typeof args.belief === "string" ? args.belief : undefined);
123
- const disableProjectContext = args["project-context"] === false;
124
111
  const skipLogging = args["track-usage"] === false;
125
112
  const includeSessions = args["include-sessions"];
126
113
  const assets = args.assets === true;
@@ -134,8 +121,6 @@ export const searchCommand = defineJsonCommand({
134
121
  includeProposed,
135
122
  belief,
136
123
  includeSessions,
137
- disableProjectContext,
138
- disableScopedUtility: disableProjectContext,
139
124
  skipLogging,
140
125
  assets,
141
126
  eventSource: resolveUsageEventSource(),
@@ -170,14 +155,13 @@ export const curateCommand = defineJsonCommand({
170
155
  "one curate call.",
171
156
  },
172
157
  // Declared as the POSITIVE name with `default: true` — see the
173
- // `project-context` comment on `searchCommand` above for why a flag NAME
158
+ // `track-usage` comment on `searchCommand` above for why a flag NAME
174
159
  // must never start with `no-`.
175
160
  "track-usage": {
176
161
  type: "boolean",
177
162
  default: true,
178
- description: "A successful curate updates ranking signals (usage-events telemetry for the curated items and the " +
179
- "underlying search). Default: on. Use --no-track-usage to run a read-only curate that does not " +
180
- "influence future ranking.",
163
+ description: "A successful curate records usage-events telemetry for the curated items. Default: on. Use " +
164
+ "--no-track-usage to run a curate that records nothing.",
181
165
  },
182
166
  },
183
167
  async run({ args }) {
@@ -302,14 +286,13 @@ export const showCommand = defineJsonCommand({
302
286
  description: "Exact context budget in characters. Requires --context lead; mutually exclusive with --max-tokens.",
303
287
  },
304
288
  // Declared as the POSITIVE name with `default: true` — see the
305
- // `project-context` comment on `searchCommand` above for why a flag NAME
289
+ // `track-usage` comment on `searchCommand` above for why a flag NAME
306
290
  // must never start with `no-`.
307
291
  "track-usage": {
308
292
  type: "boolean",
309
293
  default: true,
310
- description: "A successful show updates ranking signals (usage-events telemetry, including the search-selection " +
311
- "linkage when this show follows a recent search). Default: on. Use --no-track-usage to run a " +
312
- "read-only show that does not influence future ranking.",
294
+ description: "A successful show records usage-events telemetry, including the search-selection linkage when this " +
295
+ "show follows a recent search. Default: on. Use --no-track-usage to run a show that records nothing.",
313
296
  },
314
297
  },
315
298
  async run({ args }) {
@@ -14,22 +14,20 @@
14
14
  import { getSources, loadConfig } from "../../core/config/config.js";
15
15
  import { rethrowIfTestIsolationError, UsageError } from "../../core/errors.js";
16
16
  import { appendEvent } from "../../core/events.js";
17
+ import { redactCredentialPatterns } from "../../core/redaction.js";
18
+ import { withStateDbTelemetry } from "../../core/state-db.js";
17
19
  import { resolveReadSources } from "../../indexer/read-preflight.js";
18
20
  import { searchLocal } from "../../indexer/search/db-search.js";
19
21
  import { getSearchHitAttribution, usageEventAttributionMetadata, } from "../../indexer/search/search-attribution.js";
20
- import { getEntryIdByFilePath, getItemRefById } from "../../storage/repositories/index-entries-repository.js";
21
- // Eagerly import source providers to trigger self-registration before the
22
- // indexer or path-resolution code runs.
23
- import "../../sources/providers/index.js";
24
- import { withStateDbTelemetry } from "../../core/state-db.js";
25
22
  import { insertUsageEvent } from "../../indexer/usage/usage-events.js";
26
23
  import { TELEMETRY_BUSY_TIMEOUT_MS, withIndexDb } from "../../storage/repositories/index-db.js";
24
+ import { getEntryIdByFilePath, getItemRefById } from "../../storage/repositories/index-entries-repository.js";
27
25
  import { searchRegistry } from "./registry-search.js";
28
26
  const DEFAULT_LIMIT = 20;
29
27
  function duplicateConceptWarnings(hits, defaultBundle) {
30
28
  const ownersByConcept = new Map();
31
29
  for (const hit of hits) {
32
- const displayRef = (hit.parentRef ?? hit.ref).split("#", 1)[0] ?? hit.ref;
30
+ const displayRef = hit.ref.split("#", 1)[0] ?? hit.ref;
33
31
  const boundary = displayRef.indexOf("//");
34
32
  const conceptId = boundary >= 0 ? displayRef.slice(boundary + 2) : displayRef;
35
33
  const owner = hit.origin ?? defaultBundle ?? "working-bundle";
@@ -47,7 +45,6 @@ function duplicateConceptWarnings(hits, defaultBundle) {
47
45
  export async function akmSearch(input) {
48
46
  const t0 = Date.now();
49
47
  const query = input.query.trim();
50
- const normalizedQuery = query.toLowerCase();
51
48
  const searchType = input.type ?? "any";
52
49
  const limit = normalizeLimit(input.limit);
53
50
  const parsedSource = parseSearchSource(input.source ?? "local");
@@ -110,7 +107,7 @@ export async function akmSearch(input) {
110
107
  const localResult = source === "registry"
111
108
  ? undefined
112
109
  : await searchLocal({
113
- query: normalizedQuery,
110
+ query,
114
111
  searchType,
115
112
  limit,
116
113
  stashDir,
@@ -126,8 +123,6 @@ export async function akmSearch(input) {
126
123
  // would leak hits from sources the caller did not request.
127
124
  restrictToSources: namedSourceName !== undefined,
128
125
  includeExcludedTypes: input.includeSessions === true,
129
- disableProjectContext: input.disableProjectContext === true,
130
- disableScopedUtility: input.disableScopedUtility === true,
131
126
  });
132
127
  const registryResult = source === "local"
133
128
  ? undefined
@@ -249,7 +244,13 @@ function resolveEntryIds(db, hits) {
249
244
  * Per-entry events are recorded only for stash hits because registry hits
250
245
  * have no local entry_id to reference.
251
246
  */
252
- function logSearchEvent(query, response, mode = "keyword", eventSource = "user", attributionProjection = "full") {
247
+ function logSearchEvent(rawQuery, response, mode = "keyword", eventSource = "user", attributionProjection = "full") {
248
+ // Credentials pasted into a query (e.g. by the Claude Code hook that
249
+ // curates every user prompt) must never reach state.db verbatim — see
250
+ // `redactCredentialPatterns`. Redacted once here so every persistence call
251
+ // below (events.metadata_json via appendEvent, usage_events.query via
252
+ // insertUsageEvent) gets the same scrubbed text.
253
+ const query = redactCredentialPatterns(rawQuery);
253
254
  // Emit a structured event to events.jsonl so workflow-trace consumers
254
255
  // detect akm search invocations without relying on stdout scraping.
255
256
  const stashHits = response.hits.filter((h) => h.type !== "registry");
@@ -296,18 +297,11 @@ function logSearchEvent(query, response, mode = "keyword", eventSource = "user",
296
297
  source: eventSource,
297
298
  });
298
299
  }, TELEMETRY_BUSY_TIMEOUT_MS);
299
- // No live utility_scores/utility_scores_scoped write here (#862): a
300
- // search result is an impression, not a signal that the asset was
301
- // useful. Rewarding every returned hit created a feedback loop where
302
- // merely appearing in results inflated future ranking — assets
303
- // surfaced because they'd surfaced before, not because a user acted
304
- // on them. Retrieval counts are still recorded above via
305
- // insertUsageEvent (search_count) and rolled into utility_scores by
306
- // the offline `recomputeUtilityScores` pass (`akm index`), which uses
307
- // the show/search *select rate* — a ratio that requires an actual
308
- // `show`/select event, not raw impressions. Explicit signal comes
309
- // from `akm feedback` (applyFeedbackToUtilityScore) and from
310
- // selection (recordShowUsage / the `select` event derived from it).
300
+ // No live utility_scores write here (#862): a search result is an
301
+ // impression, not a signal that the asset was useful. Retrieval
302
+ // counts are recorded above via insertUsageEvent (search_count) and
303
+ // rolled into utility_scores by the offline `recomputeUtilityScores`
304
+ // pass (`akm index`).
311
305
  }, { busyTimeoutMs: TELEMETRY_BUSY_TIMEOUT_MS });
312
306
  }
313
307
  catch (err) {
@@ -24,33 +24,25 @@ import { makeBundleRef, parseBundleRef } from "../../core/asset/asset-ref.js";
24
24
  import { parseFrontmatter } from "../../core/asset/frontmatter.js";
25
25
  import { extractSection, markdownFragmentSlugs } from "../../core/asset/markdown.js";
26
26
  import { buildMarkdownLeadContext, fragmentForSelector, MARKDOWN_FRAGMENT_CONTEXT_DEFAULT_MAX_CHARS, } from "../../core/asset/markdown-fragments.js";
27
- import { displayRef, typeNameFromConceptId } from "../../core/asset/resolve-ref.js";
27
+ import { displayRef, displayRefForConceptId, typeNameFromConceptId } from "../../core/asset/resolve-ref.js";
28
28
  import { META_DIR, parseMetaRef, readMetaFile } from "../../core/asset/stash-meta.js";
29
29
  import { asNonEmptyString, isWithin } from "../../core/common.js";
30
- import { getIndexPassConfig, loadConfig } from "../../core/config/config.js";
30
+ import { loadConfig } from "../../core/config/config.js";
31
31
  import { NotFoundError, rethrowIfDataDirUnreadable, rethrowIfTestIsolationError, UsageError } from "../../core/errors.js";
32
32
  import { appendEvent } from "../../core/events.js";
33
33
  import { SCRIPT_EXTENSIONS } from "../../core/recognition-util.js";
34
34
  import { presentationFor } from "../../core/type-presentation.js";
35
35
  import { warn, warnOnce } from "../../core/warn.js";
36
- import { hasGraphData } from "../../indexer/db/graph-db.js";
37
- import { listRelatedPathsForFile } from "../../indexer/graph/graph-boost.js";
38
- import { extractGraphForSingleFile } from "../../indexer/graph/graph-extraction.js";
39
36
  import { lookupBundleRef, lookupBundleRefWithResolution } from "../../indexer/indexer.js";
40
37
  import { projectMarkdownFragmentContent } from "../../indexer/passes/metadata.js";
41
38
  import { ensurePrimaryIndexForRead, resolveReadSources } from "../../indexer/read-preflight.js";
42
39
  import { buildEditHint, findSourceForPath, isEditable, resolveSourceEntries, } from "../../indexer/search/search-source.js";
43
40
  import { recentShowCount, recordShowUsage } from "../../indexer/usage/show-usage.js";
44
41
  import { buildFileContext, buildRenderContext, getRenderer, } from "../../indexer/walk/file-context.js";
45
- import { resolveIndexPassExecution } from "../../llm/index-passes.js";
46
42
  import { resolveSourcesForOrigin } from "../../registry/origin-resolve.js";
47
- import { resolveStorageLocations } from "../../storage/locations.js";
48
- import { closeDatabase, openExistingDatabase } from "../../storage/repositories/index-connection.js";
49
- import { TELEMETRY_BUSY_TIMEOUT_MS, withIndexDb } from "../../storage/repositories/index-db.js";
43
+ import { withIndexDb } from "../../storage/repositories/index-db.js";
50
44
  import { getIndexedMarkdownFragment } from "../../storage/repositories/index-fts-repository.js";
51
- import { computeBodyHash } from "../../storage/repositories/index-llm-cache-repository.js";
52
- // Eagerly import source providers to trigger self-registration.
53
- import "../../sources/providers/index.js";
45
+ import { readEntryLinks } from "../../storage/repositories/index-links-repository.js";
54
46
  import { getCurrentWorkflowScopeKey } from "../../workflows/authoring/scope-key.js";
55
47
  import { buildWorkflowAction } from "../../workflows/renderer.js";
56
48
  import { getActiveWorkflowRun } from "../../workflows/runtime/runs.js";
@@ -326,12 +318,13 @@ export async function showLocal(input) {
326
318
  response.type = indexedEntry.type;
327
319
  response.name = indexedEntry.name;
328
320
  const isPrimaryStash = source?.isDefault === true;
321
+ const displayDefaultBundle = config.defaultBundle ?? (isPrimaryStash ? indexedEntry.bundleId : undefined);
329
322
  const canonicalRef = displayRef({
330
323
  type: indexedEntry.type,
331
324
  name: presentedName,
332
325
  conceptId: indexedEntry.conceptId,
333
326
  bundleId: indexedEntry.bundleId,
334
- }, config.defaultBundle ?? (isPrimaryStash ? indexedEntry.bundleId : undefined));
327
+ }, displayDefaultBundle);
335
328
  if (parsed.fragment && indexedFragment) {
336
329
  const selectedFragmentId = indexedFragment.fragments[indexedFragment.ordinal].fragmentId;
337
330
  const selectedRef = `${canonicalRef}#${selectedFragmentId}`;
@@ -390,33 +383,12 @@ export async function showLocal(input) {
390
383
  origin: source?.registryId ?? null,
391
384
  editable,
392
385
  ...(!editable ? { editHint: buildEditHint(canonicalRef) } : {}),
393
- related: (() => {
394
- try {
395
- return withIndexDb((db) => {
396
- const related = listRelatedPathsForFile(sourceStashDir, assetPath, 5, db);
397
- return { total: related.length, hits: related };
398
- });
399
- }
400
- catch (err) {
401
- rethrowIfTestIsolationError(err);
402
- rethrowIfDataDirUnreadable(err);
403
- return { total: 0, hits: [] };
404
- }
405
- })(),
386
+ ...showLinks(indexedEntry.itemRef, displayDefaultBundle),
406
387
  };
407
388
  const activeRun = await getActiveWorkflowRun(getCurrentWorkflowScopeKey());
408
389
  if (activeRun) {
409
390
  fullResponse.activeRun = activeRun;
410
391
  }
411
- // #624-P3: opt-in inline graph extraction. Default OFF — when the flag is
412
- // unset this whole block is skipped (no hasGraphData check, no LLM call), so
413
- // behavior is byte-identical to today. When ON, it extracts graph data for an
414
- // ungraphed asset, but ONLY when a model is configured (model-available
415
- // guard) and ALWAYS bounded by a 30s timeout so `show` can never hang. Any
416
- // timeout/model-unavailable/error path returns the response unchanged.
417
- if (getIndexPassConfig(config.index, "graph")?.lazyGraphExtraction === true) {
418
- await maybeExtractGraphInline(config, sourceStashDir, assetPath);
419
- }
420
392
  if (input.detail === "brief") {
421
393
  return buildBriefResponse(fullResponse, assetPath);
422
394
  }
@@ -425,6 +397,56 @@ export async function showLocal(input) {
425
397
  }
426
398
  return fullResponse;
427
399
  }
400
+ /** Refs listed per kind of declared link; `total` still counts them all (one memory is named by 1,437 others). */
401
+ const LINKS_PER_KIND = 10;
402
+ /**
403
+ * The declared links (#935) of an indexed asset, grouped by kind: outgoing in
404
+ * authored order, incoming by ref, and unresolved tokens as authored. Empty
405
+ * parts are omitted, and the field when nothing links either way.
406
+ */
407
+ function showLinks(itemRef, defaultBundle) {
408
+ let rows;
409
+ try {
410
+ rows = withIndexDb((db) => readEntryLinks(db, itemRef));
411
+ }
412
+ catch (err) {
413
+ rethrowIfTestIsolationError(err);
414
+ rethrowIfDataDirUnreadable(err);
415
+ return {};
416
+ }
417
+ const outgoing = [];
418
+ const unresolved = [];
419
+ for (const row of rows.outgoing) {
420
+ if (row.conceptId === undefined)
421
+ unresolved.push({ kind: row.kind, ref: row.raw ?? "" });
422
+ else
423
+ outgoing.push({ kind: row.kind, ref: displayRefForConceptId(row.conceptId, row.bundleId, defaultBundle) });
424
+ }
425
+ const incoming = rows.incoming.map((row) => ({
426
+ kind: row.kind,
427
+ ref: displayRefForConceptId(row.conceptId ?? "", row.bundleId, defaultBundle),
428
+ }));
429
+ const links = {
430
+ ...groupLinks("outgoing", outgoing),
431
+ ...groupLinks("incoming", incoming),
432
+ ...groupLinks("unresolved", unresolved),
433
+ };
434
+ return Object.keys(links).length > 0 ? { links } : {};
435
+ }
436
+ function groupLinks(part, rows) {
437
+ if (rows.length === 0)
438
+ return {};
439
+ const groups = {};
440
+ for (const kind of [...new Set(rows.map((row) => row.kind))].sort())
441
+ groups[kind] = { total: 0, refs: [] };
442
+ for (const { kind, ref } of rows) {
443
+ const group = groups[kind];
444
+ group.total++;
445
+ if (group.refs.length < LINKS_PER_KIND)
446
+ group.refs.push(ref);
447
+ }
448
+ return { [part]: groups };
449
+ }
428
450
  /**
429
451
  * Warn and ignore body fragments for namespaces whose authored bytes are
430
452
  * sensitive. `warnOnce`-keyed on the exact ref: `akmShowUnified` calls this
@@ -473,79 +495,6 @@ function findUnrecognizedScriptSource(assetParts, sources) {
473
495
  }
474
496
  return undefined;
475
497
  }
476
- /**
477
- * #624-P3 — opt-in inline graph extraction for `akm show`. Best-effort and
478
- * timeout-bounded: never throws, never hangs, never mutates the response.
479
- *
480
- * Preconditions (caller already checked the flag): a model must be configured
481
- * (model-available guard via {@link resolveIndexPassExecution}) and the asset
482
- * must be ungraphed ({@link hasGraphData}). Extraction races a 30s timeout so
483
- * `show` cannot block on a slow provider; any timeout/error/missing-model path
484
- * is swallowed and `show` returns its already-assembled response unchanged.
485
- */
486
- async function maybeExtractGraphInline(config, sourceStashDir, assetPath) {
487
- try {
488
- // Resolve readiness and the symbolic runner once. The inline dispatch must
489
- // consume this same snapshot even if models.json changes while show runs.
490
- const graphExecution = resolveIndexPassExecution("graph", config);
491
- if (!graphExecution.runner)
492
- return;
493
- const emittedNoticeKeys = new Set();
494
- const reportNotices = (notices) => {
495
- for (const notice of notices) {
496
- const key = JSON.stringify(notice);
497
- if (emittedNoticeKeys.has(key))
498
- continue;
499
- emittedNoticeKeys.add(key);
500
- const field = typeof notice.field === "string" ? ` field=${notice.field}` : "";
501
- warn(`[akm] lazy graph extraction notice ${notice.code} adapter=${notice.adapter}${field}: ${notice.message}`);
502
- }
503
- };
504
- reportNotices(graphExecution.notices);
505
- let alreadyGraphed = false;
506
- let bodyHash;
507
- try {
508
- const raw = fs.readFileSync(assetPath, "utf8");
509
- bodyHash = computeBodyHash(parseFrontmatter(raw).content.trim());
510
- }
511
- catch {
512
- return; // file gone/unreadable ⇒ nothing to extract
513
- }
514
- withIndexDb((db) => {
515
- alreadyGraphed = hasGraphData(db, sourceStashDir, assetPath);
516
- }, { busyTimeoutMs: TELEMETRY_BUSY_TIMEOUT_MS });
517
- if (alreadyGraphed)
518
- return;
519
- // Open the db for the async extraction ourselves: `withIndexDb` is
520
- // synchronous and would close the connection the instant the async fn
521
- // returns its Promise (before extraction completes). Close it explicitly
522
- // after the race settles instead.
523
- const db = openExistingDatabase(resolveStorageLocations().indexDb);
524
- let timer;
525
- const timeout = new Promise((resolve) => {
526
- timer = setTimeout(resolve, 30_000);
527
- });
528
- try {
529
- await Promise.race([
530
- extractGraphForSingleFile(db, sourceStashDir, assetPath, bodyHash, {
531
- config,
532
- llmRunner: graphExecution.runner,
533
- onNotices: reportNotices,
534
- }),
535
- timeout,
536
- ]);
537
- }
538
- finally {
539
- if (timer)
540
- clearTimeout(timer);
541
- closeDatabase(db);
542
- }
543
- }
544
- catch (err) {
545
- rethrowIfTestIsolationError(err);
546
- // Any other failure: silently return the unchanged show response.
547
- }
548
- }
549
498
  /**
550
499
  * Minimal `show`: ref → indexer lookup → file contents. Used by callers that
551
500
  * just need the raw file (e.g. clone, write-source) and don't want the full
@@ -24,9 +24,11 @@
24
24
  * `proposal-new` shape). `show` is a new shape, `bundle-show`.
25
25
  */
26
26
  import { defineGroupCommand, defineJsonCommand, output } from "../../cli/shared.js";
27
+ import { renameBundle } from "../../core/bundle-rename.js";
27
28
  import { NotFoundError, TransientError, UsageError } from "../../core/errors.js";
28
29
  import { appendEvent } from "../../core/events.js";
29
30
  import { warn } from "../../core/warn.js";
31
+ import { akmTasksSync } from "../tasks/tasks.js";
30
32
  import { addCommand } from "./add-cli.js";
31
33
  import { akmInit } from "./init.js";
32
34
  import { akmListSources, akmRemove, akmUpdate } from "./installed-stashes.js";
@@ -182,9 +184,29 @@ const updateCommand = defineJsonCommand({
182
184
  output("update", result);
183
185
  },
184
186
  });
187
+ const renameCommand = defineJsonCommand({
188
+ meta: {
189
+ name: "rename",
190
+ description: "Rename a configured bundle's key everywhere akm persists it (config, lock, index, and its own proposals/task history). Content inside the bundle that still spells the old ref is reported, not rewritten.",
191
+ },
192
+ args: {
193
+ old: { type: "positional", description: "Current bundle name", required: true },
194
+ new: { type: "positional", description: "New bundle name (must be a legal, unused slug)", required: true },
195
+ "dry-run": {
196
+ type: "boolean",
197
+ description: "Show the rename plan without writing anything",
198
+ default: false,
199
+ },
200
+ },
201
+ async run({ args }) {
202
+ const result = await renameBundle(args.old, args.new, { dryRun: args["dry-run"] }, {
203
+ syncTasks: (newId, backend) => akmTasksSync({ backend }, newId),
204
+ });
205
+ output("bundle-rename", result);
206
+ },
207
+ });
185
208
  export function isSkippableBundleUpdateLock(error) {
186
- return (error instanceof TransientError &&
187
- ["INDEX_DB_CONTENDED", "STATE_DB_CONTENDED", "MAINTENANCE_BARRIER_BUSY"].includes(error.code));
209
+ return error instanceof TransientError && ["INDEX_DB_CONTENDED", "STATE_DB_CONTENDED"].includes(error.code);
188
210
  }
189
211
  export const bundleCommand = defineGroupCommand({
190
212
  meta: {
@@ -198,5 +220,6 @@ export const bundleCommand = defineGroupCommand({
198
220
  show: showCommand,
199
221
  remove: removeCommand,
200
222
  update: updateCommand,
223
+ rename: renameCommand,
201
224
  },
202
225
  });
@@ -92,6 +92,10 @@ export function bundleKeyForUrl(config, url) {
92
92
  * caller's `preferredName` when it is a legal slug, else slug the seed locator
93
93
  * (path/url) — the shared {@link deriveBundleId} rule (D-R5), made unique against
94
94
  * the currently-configured bundle keys.
95
+ *
96
+ * Every add path validates an explicit `--name` with
97
+ * {@link validateExplicitBundleName} before calling in (an illegal or taken
98
+ * name fails loudly), so a `preferredName` that reaches here is returned as is.
95
99
  */
96
100
  export function nextBundleKey(bundles, preferredName, seedLocator) {
97
101
  return deriveBundleId(preferredName, seedLocator, new Set(Object.keys(bundles)));
@@ -66,8 +66,7 @@ function collectDangerousKeyFindings(installedStashRoot, checkEnvForDangerousKey
66
66
  }
67
67
  return allFindings;
68
68
  }
69
- /** Scan only; callers that already obtained approval use this for a final materialization fence. */
70
- export function scanStashForDangerousKeys(installedStashRoot) {
69
+ function scanStashForDangerousKeys(installedStashRoot) {
71
70
  const scanner = scannerOverride ??
72
71
  ((envPath, relPath) => scanEnvKeyNames(fs.readFileSync(envPath, "utf8"))
73
72
  .filter(isDangerousEnvKey)