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
@@ -107,7 +107,7 @@ const GATE_OUTCOMES = {
107
107
  "auto-rejected": true,
108
108
  };
109
109
  function validatePresentMetadata(meta) {
110
- const stringFields = ["sourceRun", "beforeHash", "backupContent"];
110
+ const stringFields = ["sourceRun", "beforeHash", "beforeHashNormalized", "backupContent"];
111
111
  for (const field of stringFields) {
112
112
  if (Object.hasOwn(meta, field) && typeof meta[field] !== "string")
113
113
  invalidPresentField(field);
@@ -168,6 +168,50 @@ function validatePresentMetadata(meta) {
168
168
  if (Object.hasOwn(meta, "eligibilitySource") && typeof meta.eligibilitySource !== "string") {
169
169
  invalidPresentField("eligibilitySource");
170
170
  }
171
+ if (Object.hasOwn(meta, "promotionSource") && typeof meta.promotionSource !== "string") {
172
+ invalidPresentField("promotionSource");
173
+ }
174
+ if (Object.hasOwn(meta, "promotionSourceHash") && typeof meta.promotionSourceHash !== "string") {
175
+ invalidPresentField("promotionSourceHash");
176
+ }
177
+ if (Object.hasOwn(meta, "retirement")) {
178
+ const retirement = meta.retirement;
179
+ if (typeof retirement !== "object" ||
180
+ retirement === null ||
181
+ typeof retirement.retiredRef !== "string" ||
182
+ typeof retirement.successorRef !== "string" ||
183
+ typeof retirement.cosine !== "number" ||
184
+ !Number.isFinite(retirement.cosine) ||
185
+ (retirement.judgeLabel !== "duplicate" &&
186
+ retirement.judgeLabel !== "subsumed" &&
187
+ retirement.judgeLabel !== "supersedes") ||
188
+ typeof retirement.judgeReason !== "string" ||
189
+ typeof retirement.retiredContentHash !== "string" ||
190
+ typeof retirement.successorContentHash !== "string" ||
191
+ (retirement.reason !== "duplicate" && retirement.reason !== "subsumed" && retirement.reason !== "superseded")) {
192
+ invalidPresentField("retirement");
193
+ }
194
+ }
195
+ if (Object.hasOwn(meta, "retiredArchive")) {
196
+ const archive = meta.retiredArchive;
197
+ if (typeof archive !== "object" ||
198
+ archive === null ||
199
+ !Array.isArray(archive.dirs) ||
200
+ archive.dirs.length === 0 ||
201
+ archive.dirs.some((dir) => typeof dir !== "string" || dir.length === 0)) {
202
+ invalidPresentField("retiredArchive");
203
+ }
204
+ }
205
+ if (Object.hasOwn(meta, "retireAcceptIntent")) {
206
+ const intent = meta.retireAcceptIntent;
207
+ if (typeof intent !== "object" ||
208
+ intent === null ||
209
+ typeof intent.assetPath !== "string" ||
210
+ intent.assetPath.length === 0 ||
211
+ typeof intent.backupContent !== "string") {
212
+ invalidPresentField("retireAcceptIntent");
213
+ }
214
+ }
171
215
  }
172
216
  /**
173
217
  * Convert a raw `ProposalRow` to the public `Proposal` shape.
@@ -224,6 +268,7 @@ export function proposalRowToProposal(row) {
224
268
  changes,
225
269
  ...(proposedTarget !== undefined ? { proposedTarget } : {}),
226
270
  ...(typeof meta.beforeHash === "string" ? { beforeHash: meta.beforeHash } : {}),
271
+ ...(typeof meta.beforeHashNormalized === "string" ? { beforeHashNormalized: meta.beforeHashNormalized } : {}),
227
272
  ...(meta.review !== undefined ? { review: meta.review } : {}),
228
273
  ...(typeof meta.confidence === "number" ? { confidence: meta.confidence } : {}),
229
274
  ...(meta.gateDecision !== undefined ? { gateDecision: meta.gateDecision } : {}),
@@ -232,6 +277,13 @@ export function proposalRowToProposal(row) {
232
277
  ...(typeof meta.eligibilitySource === "string"
233
278
  ? { eligibilitySource: meta.eligibilitySource }
234
279
  : {}),
280
+ ...(typeof meta.promotionSource === "string" ? { promotionSource: meta.promotionSource } : {}),
281
+ ...(typeof meta.promotionSourceHash === "string" ? { promotionSourceHash: meta.promotionSourceHash } : {}),
282
+ ...(meta.retirement !== undefined ? { retirement: meta.retirement } : {}),
283
+ ...(meta.retiredArchive !== undefined ? { retiredArchive: meta.retiredArchive } : {}),
284
+ ...(meta.retireAcceptIntent !== undefined
285
+ ? { retireAcceptIntent: meta.retireAcceptIntent }
286
+ : {}),
235
287
  };
236
288
  }
237
289
  /**
@@ -274,6 +326,8 @@ export function proposalToRowValues(proposal, stashDir) {
274
326
  metaObj.proposedTarget = currentProposalTarget(proposal.proposedTarget);
275
327
  if (proposal.beforeHash !== undefined)
276
328
  metaObj.beforeHash = proposal.beforeHash;
329
+ if (proposal.beforeHashNormalized !== undefined)
330
+ metaObj.beforeHashNormalized = proposal.beforeHashNormalized;
277
331
  if (proposal.sourceRun !== undefined)
278
332
  metaObj.sourceRun = proposal.sourceRun;
279
333
  if (proposal.review !== undefined)
@@ -288,6 +342,16 @@ export function proposalToRowValues(proposal, stashDir) {
288
342
  metaObj.acceptedTarget = proposal.acceptedTarget;
289
343
  if (proposal.eligibilitySource !== undefined)
290
344
  metaObj.eligibilitySource = proposal.eligibilitySource;
345
+ if (proposal.promotionSource !== undefined)
346
+ metaObj.promotionSource = proposal.promotionSource;
347
+ if (proposal.promotionSourceHash !== undefined)
348
+ metaObj.promotionSourceHash = proposal.promotionSourceHash;
349
+ if (proposal.retirement !== undefined)
350
+ metaObj.retirement = proposal.retirement;
351
+ if (proposal.retiredArchive !== undefined)
352
+ metaObj.retiredArchive = proposal.retiredArchive;
353
+ if (proposal.retireAcceptIntent !== undefined)
354
+ metaObj.retireAcceptIntent = proposal.retireAcceptIntent;
291
355
  validatePresentMetadata(metaObj);
292
356
  return {
293
357
  id: proposal.id,
@@ -382,6 +446,10 @@ export function getStateProposal(db, id, stashDir) {
382
446
  const row = (stashDir ? db.prepare(sql).get(id, stashDir) : db.prepare(sql).get(id));
383
447
  return row ? proposalRowToProposal(row) : undefined;
384
448
  }
449
+ /** `(ref, source)` of every proposal, any status, in one stash: no payload is read. */
450
+ export function listProposalRefSources(db, stashDir) {
451
+ return db.prepare("SELECT ref, source FROM proposals WHERE stash_dir = ?").all(stashDir);
452
+ }
385
453
  /**
386
454
  * Find PENDING proposal ids in one stash whose id starts with `idPrefix`.
387
455
  * Backs the UUID-prefix form of `akm proposal show/accept/... <prefix>` —
@@ -399,3 +467,38 @@ export function listStateProposalIdsByPrefix(db, stashDir, idPrefix) {
399
467
  .all(stashDir, `${escaped}%`);
400
468
  return rows.map((r) => r.id);
401
469
  }
470
+ /**
471
+ * Preview counterpart of {@link renameProposalsBundleRef} for `akm bundle
472
+ * rename --dry-run`: the same two `WHERE` predicates, read-only.
473
+ */
474
+ export function countProposalsForBundleRename(db, oldBundleId) {
475
+ const prefix = `${escapeLikePattern(oldBundleId)}//`;
476
+ const refs = db.prepare(`SELECT COUNT(*) AS n FROM proposals WHERE ref LIKE ? ESCAPE '\\'`).get(`${prefix}%`).n;
477
+ const targets = db
478
+ .prepare(`SELECT COUNT(*) AS n FROM proposals WHERE json_extract(metadata_json, '$.proposedTarget.source') = ?`)
479
+ .get(oldBundleId).n;
480
+ return { refs, targets };
481
+ }
482
+ /**
483
+ * Rewrite every proposal that names `oldBundleId` from `akm bundle rename`
484
+ * (D6): the fully-qualified `ref` column (`<bundle>//conceptId` — an
485
+ * unqualified legacy `ref` resolves against `defaultBundle` at use time and
486
+ * never names a bundle explicitly, so it is left alone), and
487
+ * `metadata_json.proposedTarget.source`, which names the write-target bundle
488
+ * a still-pending proposal would apply to (`resolveRecordedProposalTarget`,
489
+ * `commands/proposal/repository.ts`). Returns how many rows of each were
490
+ * rewritten.
491
+ */
492
+ export function renameProposalsBundleRef(db, oldBundleId, newBundleId) {
493
+ const prefix = `${escapeLikePattern(oldBundleId)}//`;
494
+ return db.transaction(() => {
495
+ const refs = Number(db
496
+ .prepare(`UPDATE proposals SET ref = ? || substr(ref, ?) WHERE ref LIKE ? ESCAPE '\\'`)
497
+ .run(newBundleId, oldBundleId.length + 1, `${prefix}%`).changes);
498
+ const targets = Number(db
499
+ .prepare(`UPDATE proposals SET metadata_json = json_set(metadata_json, '$.proposedTarget.source', ?)
500
+ WHERE json_extract(metadata_json, '$.proposedTarget.source') = ?`)
501
+ .run(newBundleId, oldBundleId).changes);
502
+ return { refs, targets };
503
+ })();
504
+ }
@@ -1,6 +1,10 @@
1
1
  // This Source Code Form is subject to the terms of the Mozilla Public
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ import { rethrowIfTestIsolationError } from "../../core/errors.js";
5
+ import { formatRegistryError } from "../../core/registry-url.js";
6
+ import { warn } from "../../core/warn.js";
7
+ import { closeDatabase, openIndexDatabase } from "./index-connection.js";
4
8
  /**
5
9
  * Upsert a registry index cache entry in index.db.
6
10
  *
@@ -44,3 +48,99 @@ export function getRegistryIndexCache(db, registryUrl, maxAgeMs = 3_600_000 /* 1
44
48
  return undefined;
45
49
  return { indexJson: row.index_json, etag: row.etag, lastModified: row.last_modified };
46
50
  }
51
+ /**
52
+ * Open the cache DB (a failed open yields `db = undefined`; the bun-test
53
+ * isolation guard is re-thrown), run `fn`, and close the DB only after `fn`
54
+ * has fully settled — the callbacks are async, and closing earlier would tear
55
+ * the DB down mid-write.
56
+ */
57
+ export async function withRegistryCacheDb(fn) {
58
+ let db;
59
+ try {
60
+ db = openIndexDatabase();
61
+ }
62
+ catch (err) {
63
+ rethrowIfTestIsolationError(err);
64
+ db = undefined;
65
+ }
66
+ try {
67
+ return await fn(db);
68
+ }
69
+ finally {
70
+ if (db) {
71
+ try {
72
+ closeDatabase(db);
73
+ }
74
+ catch {
75
+ /* ignore */
76
+ }
77
+ }
78
+ }
79
+ }
80
+ /**
81
+ * Returns a fresh cache hit when present, otherwise fetches live (writing the
82
+ * result back best-effort), and falls back to a stale cache row when the
83
+ * fetch fails.
84
+ */
85
+ export async function fetchCachedJson(opts) {
86
+ const { cacheKey, ttlMs, parseCache, fetchFresh } = opts;
87
+ return withRegistryCacheDb(async (db) => {
88
+ let dbCacheResult;
89
+ try {
90
+ if (db) {
91
+ dbCacheResult = getRegistryIndexCache(db, cacheKey, ttlMs);
92
+ }
93
+ }
94
+ catch (err) {
95
+ // Never mask the bun-test isolation guard as "DB unavailable" — see
96
+ // rethrowIfTestIsolationError in src/core/errors.ts.
97
+ rethrowIfTestIsolationError(err);
98
+ // index.db read failed (pre-migration install or test env) — fall through
99
+ }
100
+ if (dbCacheResult) {
101
+ const cached = parseCache(dbCacheResult.indexJson, { stale: false });
102
+ if (cached !== undefined) {
103
+ return cached;
104
+ }
105
+ }
106
+ try {
107
+ const { value, cacheJson } = await fetchFresh();
108
+ if (db) {
109
+ try {
110
+ upsertRegistryIndexCache(db, cacheKey, cacheJson);
111
+ }
112
+ catch {
113
+ /* best-effort */
114
+ }
115
+ }
116
+ return value;
117
+ }
118
+ catch (err) {
119
+ // Fetch failed — use stale DB cache if available.
120
+ if (dbCacheResult) {
121
+ const stale = parseCache(dbCacheResult.indexJson, { stale: true });
122
+ if (stale !== undefined)
123
+ return stale;
124
+ }
125
+ // No in-TTL row — consult the cache PAST its TTL before giving up: a
126
+ // briefly unreachable registry should degrade to the last-known index,
127
+ // loudly, not hard-fail the command.
128
+ try {
129
+ const expiredRow = db ? getRegistryIndexCache(db, cacheKey, Number.POSITIVE_INFINITY) : undefined;
130
+ if (expiredRow) {
131
+ const stale = parseCache(expiredRow.indexJson, { stale: true });
132
+ if (stale !== undefined) {
133
+ warn(`Registry fetch failed (${formatRegistryError(err)}); ` +
134
+ "serving the last cached index, which is past its refresh interval.");
135
+ return stale;
136
+ }
137
+ }
138
+ }
139
+ catch (cacheErr) {
140
+ rethrowIfTestIsolationError(cacheErr);
141
+ // cache read failed — fall through to the original fetch error
142
+ }
143
+ throw err;
144
+ }
145
+ });
146
+ }
@@ -58,23 +58,6 @@ export function getAssetSalience(db, ref) {
58
58
  // Bun SQLite returns null (not undefined) when no row found.
59
59
  return row == null ? undefined : row;
60
60
  }
61
- /**
62
- * Load ALL rank scores from the asset_salience table (full-stash query).
63
- *
64
- * Used by the forgetting-safety report (plan §WS-1 step 7) to compute stash-wide
65
- * rank positions rather than pool-relative positions. Returns an empty Map when the
66
- * table is empty (first WS-1 run = no pre-existing rows).
67
- *
68
- * Order is unspecified; callers must sort before assigning 1-indexed positions.
69
- */
70
- export function getAllRankScores(db) {
71
- const rows = db.prepare("SELECT asset_ref, rank_score FROM asset_salience").all();
72
- const result = new Map();
73
- for (const row of rows) {
74
- result.set(row.asset_ref, row.rank_score);
75
- }
76
- return result;
77
- }
78
61
  // ── Plasticity helpers ────────────────────────────────────────────────────────
79
62
  /**
80
63
  * Increment `consecutive_no_ops` for an asset. Called after a no-op reflect/distill.
@@ -84,8 +67,7 @@ export function getAllRankScores(db) {
84
67
  * Invariant: recordNoOp must never originate rank_score semantics. If the asset has
85
68
  * no salience row yet (persistence's best-effort try/catch may have swallowed an
86
69
  * error), we do nothing — a no-op counter is meaningless without a rank_score row,
87
- * and a synthetic INSERT would fabricate a rank_score=0 entry that could produce
88
- * false catastrophic-forgetting signals in buildRankChangeReport.
70
+ * and a synthetic INSERT would fabricate a rank_score=0 entry with nothing behind it.
89
71
  */
90
72
  export function recordNoOp(db, ref) {
91
73
  db.prepare(`UPDATE asset_salience SET consecutive_no_ops = consecutive_no_ops + 1, updated_at = ? WHERE asset_ref = ?`).run(Date.now(), ref);
@@ -11,6 +11,7 @@
11
11
  */
12
12
  import { isRecord } from "../../core/common.js";
13
13
  import { warnOnce } from "../../core/warn.js";
14
+ import { escapeLikePattern } from "../like-pattern.js";
14
15
  function metadataError(message) {
15
16
  throw new Error(`invalid task_history metadata_json: ${message}`);
16
17
  }
@@ -63,9 +64,9 @@ export function decodeTaskHistoryMetadata(input) {
63
64
  if (typeof parsed.durationMs !== "number")
64
65
  metadataError("durationMs must be a number");
65
66
  const detail = "detail" in parsed ? parsed.detail : null;
66
- if (parsed.engine !== undefined && parsed.engine !== null && typeof parsed.engine !== "string") {
67
- metadataError("engine must be a string or null");
68
- }
67
+ // A malformed `engine` (wrong type) is dropped like any other unrecognized
68
+ // field rather than rejecting the whole row over a non-essential value.
69
+ const engine = parsed.engine === null || typeof parsed.engine === "string" ? parsed.engine : undefined;
69
70
  if (parsed.targetVocab !== undefined && parsed.targetVocab !== 2) {
70
71
  warnOnce(`task-history-target-vocab:${String(parsed.targetVocab)}`, `task_history row has targetVocab ${String(parsed.targetVocab)}, newer than this akm's 2 — falling back to ` +
71
72
  "the legacy target_kind mapping rather than rejecting the row.");
@@ -83,7 +84,7 @@ export function decodeTaskHistoryMetadata(input) {
83
84
  metadataVersion: 2,
84
85
  durationMs: parsed.durationMs,
85
86
  detail: cleanDetail,
86
- ...(parsed.engine !== undefined ? { engine: parsed.engine } : {}),
87
+ ...(engine !== undefined ? { engine } : {}),
87
88
  ...(parsed.targetVocab === 2 ? { targetVocab: 2 } : {}),
88
89
  };
89
90
  }
@@ -207,3 +208,24 @@ export function queryCompletedTaskIntervals(db, since, until) {
207
208
  : "SELECT started_at, completed_at FROM task_history WHERE task_id = 'akm-improve' AND started_at >= ? AND completed_at IS NOT NULL ORDER BY started_at";
208
209
  return (until ? db.prepare(sql).all(since, until) : db.prepare(sql).all(since));
209
210
  }
211
+ /**
212
+ * Preview counterpart of {@link renameTaskHistoryTargetRefs} for `akm bundle
213
+ * rename --dry-run`: the same `WHERE` predicate, read-only.
214
+ */
215
+ export function countTaskHistoryTargetRefs(db, oldBundleId) {
216
+ const prefix = `${escapeLikePattern(oldBundleId)}//`;
217
+ return db.prepare(`SELECT COUNT(*) AS n FROM task_history WHERE target_ref LIKE ? ESCAPE '\\'`).get(`${prefix}%`).n;
218
+ }
219
+ /**
220
+ * Rewrite every `task_history.target_ref` naming `oldBundleId` (a workflow
221
+ * run's fully-qualified `<bundle>//conceptId` target) to `newBundleId`
222
+ * (`akm bundle rename`, D6). A row whose `target_ref` is unset or not
223
+ * bundle-qualified is not matched by the `LIKE` prefix and is left alone.
224
+ * Returns the number of rows rewritten.
225
+ */
226
+ export function renameTaskHistoryTargetRefs(db, oldBundleId, newBundleId) {
227
+ const prefix = `${escapeLikePattern(oldBundleId)}//`;
228
+ return Number(db
229
+ .prepare(`UPDATE task_history SET target_ref = ? || substr(target_ref, ?) WHERE target_ref LIKE ? ESCAPE '\\'`)
230
+ .run(newBundleId, oldBundleId.length + 1, `${prefix}%`).changes);
231
+ }