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
@@ -20,7 +20,6 @@
20
20
  * no-stale-age-window rationale.
21
21
  */
22
22
  import { releaseLock } from "../core/file-lock.js";
23
- import { tryWithMaintenanceStartBarrier, withMaintenanceStartBarrier } from "../core/maintenance-barrier.js";
24
23
  import { getIndexRebuildLockPath } from "../core/paths.js";
25
24
  import { formatLockHolderPid, tryAcquireRunLock } from "../core/run-lock.js";
26
25
  import { warn, warnVerbose } from "../core/warn.js";
@@ -49,21 +48,14 @@ export function tryAcquireIndexRebuildLock(skipIfLocked) {
49
48
  `(${info.reason}); that process is no longer running.`);
50
49
  },
51
50
  });
51
+ const result = acquire();
52
+ if (result.state === "acquired")
53
+ return result;
52
54
  if (skipIfLocked) {
53
- const result = tryWithMaintenanceStartBarrier(acquire);
54
- if (!result) {
55
- warn("[index] maintenance barrier held; skipping (--skip-if-locked)");
56
- return { state: "skipped", holder: { pid: null, startedAt: null, launcherPid: null } };
57
- }
58
- if (result.state === "acquired")
59
- return result;
60
55
  warn(`[index] another index run holds the lock (PID ${formatLockHolderPid(result.holder)}, started ${result.holder.startedAt}); ` +
61
56
  "skipping (--skip-if-locked)");
62
57
  return { state: "skipped", holder: result.holder };
63
58
  }
64
- const result = withMaintenanceStartBarrier(acquire);
65
- if (result.state === "acquired")
66
- return result;
67
59
  warn(`[index] another index run is active (pid ${formatLockHolderPid(result.holder)}, started ${result.holder.startedAt}); ` +
68
60
  "this run will contend with it — pass --skip-if-locked for scheduled runs");
69
61
  return { state: "contended", holder: result.holder };
@@ -25,8 +25,8 @@
25
25
  import { AsyncLocalStorage } from "node:async_hooks";
26
26
  import fs from "node:fs";
27
27
  import path from "node:path";
28
+ import { TransientError } from "../core/errors.js";
28
29
  import { createLockPayload, probeLock, reclaimStaleLock, releaseLock, tryAcquireLockSync, } from "../core/file-lock.js";
29
- import { tryAcquireMaintenanceBarrier } from "../core/maintenance-barrier.js";
30
30
  import { getDbPath, getIndexWriterLockPath } from "../core/paths.js";
31
31
  import { warn } from "../core/warn.js";
32
32
  import { sleepSync } from "../runtime.js";
@@ -92,21 +92,12 @@ function createLease(lockPath, ownership) {
92
92
  }
93
93
  function tryAcquireAssetMutationLease(lockPath, purpose) {
94
94
  while (true) {
95
- const releaseBarrier = tryAcquireMaintenanceBarrier();
96
- if (!releaseBarrier)
95
+ const ownership = tryAcquireLockSync(lockPath, buildPayload(purpose));
96
+ if (ownership)
97
+ return createLease(lockPath, ownership);
98
+ const probe = probeLock(lockPath);
99
+ if (probe.state !== "stale" || !reclaimStaleLock(lockPath, probe))
97
100
  return undefined;
98
- try {
99
- const ownership = tryAcquireLockSync(lockPath, buildPayload(purpose));
100
- if (ownership)
101
- return createLease(lockPath, ownership);
102
- // No `staleAfterMs`: only a verifiably dead holder is ever reclaimed.
103
- const probe = probeLock(lockPath);
104
- if (probe.state !== "stale" || !reclaimStaleLock(lockPath, probe))
105
- return undefined;
106
- }
107
- finally {
108
- releaseBarrier();
109
- }
110
101
  }
111
102
  }
112
103
  export async function acquireAssetMutationLease(options) {
@@ -129,7 +120,7 @@ export async function acquireAssetMutationLease(options) {
129
120
  // attempt, so a caller with maxWaitMs:0 still gets one chance at a free lock
130
121
  // instead of throwing before it ever tries.
131
122
  if (maxWaitMs >= 0 && Date.now() - startedAt >= maxWaitMs) {
132
- throw new Error(`timed out waiting for asset mutation lease for ${options.purpose}`);
123
+ throw new TransientError(`timed out waiting for asset mutation lease for ${options.purpose}`, "ASSET_MUTATION_LEASE_HELD");
133
124
  }
134
125
  const waitedMs = Date.now() - startedAt;
135
126
  if (waitedMs - lastWaitNoticeMs >= 15000) {
@@ -180,7 +171,7 @@ export function withAssetMutationLeaseSync(purpose, run) {
180
171
  if (!lease) {
181
172
  const waitedMs = Date.now() - startedAt;
182
173
  if (waitedMs >= maxWaitMs) {
183
- throw new Error(`timed out waiting for asset mutation lease for ${purpose}`);
174
+ throw new TransientError(`timed out waiting for asset mutation lease for ${purpose}`, "ASSET_MUTATION_LEASE_HELD");
184
175
  }
185
176
  // #956: the sync path used to wait up to 10 minutes with zero
186
177
  // progress feedback. Mirror the async path's 15s onWait cadence, but
@@ -15,9 +15,8 @@
15
15
  * This is NOT a general reindex. It upserts exactly the files the caller just
16
16
  * wrote: frontmatter/metadata via the shared matcher pipeline, the canonical
17
17
  * row with its transactionally owned FTS projection, and vectors for changed
18
- * entry IDs when semantic search is enabled. Index-time LLM passes, graph
19
- * extraction, `builtAt`, and the per-dir walk cache remain full-index
20
- * responsibilities.
18
+ * entry IDs when semantic search is enabled. `builtAt` and the per-dir walk
19
+ * cache remain full-index responsibilities.
21
20
  */
22
21
  import fs from "node:fs";
23
22
  import path from "node:path";
@@ -33,9 +32,8 @@ import { closeDatabase, openExistingDatabase } from "../storage/repositories/ind
33
32
  import { deleteEntriesByIds, getEntryCount, upsertEntry } from "../storage/repositories/index-entries-repository.js";
34
33
  import { deriveEntryProvenance, deriveInstallations } from "./installations.js";
35
34
  import { generateEmbeddingsForDb, publishTargetedEmbeddingMeta } from "./materialize-embeddings.js";
36
- import { getMarkdownFragmentContent, hasMarkdownFragmentContent, setMarkdownFragmentContent, } from "./passes/metadata.js";
35
+ import { withFileSize } from "./passes/metadata.js";
37
36
  import { drainDirDocuments } from "./scan/drain-dir.js";
38
- import { buildSearchText } from "./search/search-fields.js";
39
37
  import { buildFileContext } from "./walk/file-context.js";
40
38
  /**
41
39
  * Busy-timeout (ms) for write-path index upserts. A real write — unlike the
@@ -66,161 +64,150 @@ export const WRITE_PATH_INDEX_BUSY_TIMEOUT_MS = 5_000;
66
64
  */
67
65
  export async function indexWrittenAssets(stashDir, filePaths, options = {}) {
68
66
  try {
69
- return await (async () => {
70
- // #956: a live `akm index` rebuild holds index.db under one long
71
- // transaction (persistDirRecords), which this fast path's own 5s
72
- // busy_timeout would just contend with pointlessly. Interactive
73
- // commands (remember, import, extract session assets) must never wait
74
- // on it — skip the inline upsert/embedding entirely; the write itself
75
- // (file + commit) has already succeeded by the time this runs, and the
76
- // rebuild in progress will pick up the change on its own.
77
- const rebuildProbe = probeLock(getIndexRebuildLockPath());
78
- if (rebuildProbe.state === "held") {
79
- // #956: name the launcher pid alongside the holder pid when known —
80
- // every process listing and task log shows the launcher's pid, not
81
- // the bun/node child's.
82
- const holderLabel = formatLockHolderPid({
83
- pid: rebuildProbe.holderPid,
84
- launcherPid: rebuildProbe.launcherPid ?? null,
85
- });
86
- warn(`index rebuild in progress (pid ${holderLabel}); the next index pass will index ${filePaths.join(", ")}`);
87
- return true;
88
- }
89
- const dbPath = getDbPath();
90
- // `true` here means "the index is in the state the caller expects" — and
91
- // `acceptProposal` advances its journal to `index-finalized` on the
92
- // strength of it. Only a genuinely ABSENT index earns that answer: an
93
- // index we cannot read has NOT been updated, so it falls through to
94
- // `openExistingDatabase` and surfaces as the honest `false` (#791).
95
- if (isPathAbsent(dbPath))
96
- return true;
97
- // The full walk never descends into dot-directories (for example `.meta/`)
98
- // — mirror that dot-segment skip here so this fast path indexes exactly
99
- // what a full run would. Sensitive/
100
- // infra abstention is the adapter's job now (see the `akmAdapter` note
101
- // below), not a path pre-filter.
102
- const files = filePaths.filter((f) => {
103
- const rel = path.relative(stashDir, f);
104
- return !rel.split(/[\\/]+/).some((segment) => segment.startsWith("."));
67
+ // #956: a live `akm index` rebuild holds index.db under one long
68
+ // transaction (persistDirRecords), which this fast path's own 5s
69
+ // busy_timeout would just contend with pointlessly. Interactive
70
+ // commands (remember, import, extract session assets) must never wait
71
+ // on it — skip the inline upsert/embedding entirely; the write itself
72
+ // (file + commit) has already succeeded by the time this runs, and the
73
+ // rebuild in progress will pick up the change on its own.
74
+ const rebuildProbe = probeLock(getIndexRebuildLockPath());
75
+ if (rebuildProbe.state === "held") {
76
+ // #956: name the launcher pid alongside the holder pid when known —
77
+ // every process listing and task log shows the launcher's pid, not
78
+ // the bun/node child's.
79
+ const holderLabel = formatLockHolderPid({
80
+ pid: rebuildProbe.holderPid,
81
+ launcherPid: rebuildProbe.launcherPid ?? null,
105
82
  });
106
- if (files.length === 0)
107
- return true;
108
- // Generate metadata BEFORE opening the DB so the write window stays
109
- // short. One drain call per file keeps the entry↔path pairing exact and
110
- // reuses the full-index recognize engine (F4a M-core-2 item 5): broken
111
- // workflows drop, valid workflow docs are cached for the side-table upsert.
112
- const component = deriveInstallations([
113
- { path: stashDir, writable: true, ...(options.bundleId ? { registryId: options.bundleId } : {}) },
114
- ])[0]?.components[0];
115
- if (!component)
116
- throw new Error(`Could not derive bundle provenance for ${stashDir}`);
117
- const pairs = [];
118
- const unindexable = new Set();
119
- const rejectedConceptIds = new Set();
120
- for (const file of files) {
121
- if (!fs.existsSync(file)) {
122
- let authoredDanglingSymlink = false;
123
- try {
124
- authoredDanglingSymlink = fs.lstatSync(file).isSymbolicLink();
125
- }
126
- catch {
127
- // A genuinely absent path has no source identity to preflight.
128
- }
129
- if (!authoredDanglingSymlink) {
130
- unindexable.add(file);
131
- continue;
132
- }
83
+ warn(`index rebuild in progress (pid ${holderLabel}); the next index pass will index ${filePaths.join(", ")}`);
84
+ return true;
85
+ }
86
+ const dbPath = getDbPath();
87
+ // `true` here means "the index is in the state the caller expects" — and
88
+ // `acceptProposal` advances its journal to `index-finalized` on the
89
+ // strength of it. Only a genuinely ABSENT index earns that answer: an
90
+ // index we cannot read has NOT been updated, so it falls through to
91
+ // `openExistingDatabase` and surfaces as the honest `false` (#791).
92
+ if (isPathAbsent(dbPath))
93
+ return true;
94
+ // The full walk never descends into dot-directories (for example `.meta/`)
95
+ // — mirror that dot-segment skip here so this fast path indexes exactly
96
+ // what a full run would. Sensitive/
97
+ // infra abstention is the adapter's job now (see the `akmAdapter` note
98
+ // below), not a path pre-filter.
99
+ const files = filePaths.filter((f) => {
100
+ const rel = path.relative(stashDir, f);
101
+ return !rel.split(/[\\/]+/).some((segment) => segment.startsWith("."));
102
+ });
103
+ if (files.length === 0)
104
+ return true;
105
+ // Generate metadata BEFORE opening the DB so the write window stays
106
+ // short. One drain call per file keeps the entry↔path pairing exact and
107
+ // reuses the full-index recognize engine (F4a M-core-2 item 5): broken
108
+ // workflows drop, valid workflow docs are cached for the side-table upsert.
109
+ const component = deriveInstallations([
110
+ { path: stashDir, writable: true, ...(options.bundleId ? { registryId: options.bundleId } : {}) },
111
+ ])[0]?.components[0];
112
+ if (!component)
113
+ throw new Error(`Could not derive bundle provenance for ${stashDir}`);
114
+ const pairs = [];
115
+ const unindexable = new Set();
116
+ const rejectedConceptIds = new Set();
117
+ for (const file of files) {
118
+ if (!fs.existsSync(file)) {
119
+ let authoredDanglingSymlink = false;
120
+ try {
121
+ authoredDanglingSymlink = fs.lstatSync(file).isSymbolicLink();
122
+ }
123
+ catch {
124
+ // A genuinely absent path has no source identity to preflight.
133
125
  }
134
- const ctx = buildFileContext(stashDir, file);
135
- // Hardcoded `akmAdapter` on purpose (owner ruling 2026-07-21): this
136
- // write-path fast path only ever runs for assets a first-class akm
137
- // mutation command just wrote into a managed akm source, so the akm
138
- // adapter is always the right recognizer here — no per-component
139
- // dispatch needed.
140
- const drained = drainDirDocuments(akmAdapter, component, [ctx]);
141
- for (const rejectedPath of drained.rejectedPaths)
142
- unindexable.add(rejectedPath);
143
- for (const conceptId of drained.rejectedConceptIds)
144
- rejectedConceptIds.add(conceptId);
145
- const entry = drained.entries[0];
146
- // A broken workflow drains to zero entries and is treated as
147
- // unindexable; valid peer sources have already compiled to source IR.
148
- const conceptId = drained.conceptIdByFile.get(ctx.absPath);
149
- if (entry && conceptId)
150
- pairs.push({ file, entry, conceptId, contentHash: drained.hashByFile.get(ctx.absPath) });
151
- else
126
+ if (!authoredDanglingSymlink) {
152
127
  unindexable.add(file);
153
- }
154
- const db = openExistingDatabase(dbPath);
155
- try {
156
- db.exec(`PRAGMA busy_timeout = ${WRITE_PATH_INDEX_BUSY_TIMEOUT_MS}`);
157
- if (getEntryCount(db) === 0)
158
- return true;
159
- const targetEntryIds = new Set();
160
- let mutated = false;
161
- db.transaction(() => {
162
- const unindexableEntryIds = new Set();
163
- for (const file of unindexable) {
164
- const rows = db
165
- .prepare(`SELECT id FROM entries
166
- WHERE file_path = ?
167
- AND bundle_id = ?
168
- AND adapter_id = ?`)
169
- .all(file, component.id, component.adapter);
170
- for (const row of rows)
171
- unindexableEntryIds.add(row.id);
172
- }
173
- for (const conceptId of rejectedConceptIds) {
174
- const itemRef = `${component.id}//${conceptId}`;
175
- const rows = db
176
- .prepare(`SELECT id FROM entries
177
- WHERE bundle_id = ? AND adapter_id = ?
178
- AND type = 'workflow'
179
- AND (concept_id = ? OR item_ref = ?)`)
180
- .all(component.id, component.adapter, conceptId, itemRef);
181
- for (const row of rows)
182
- unindexableEntryIds.add(row.id);
183
- }
184
- deleteEntriesByIds(db, [...unindexableEntryIds]);
185
- mutated ||= unindexableEntryIds.size > 0;
186
- for (const { file, entry, conceptId, contentHash } of pairs) {
187
- let entryWithSize = entry;
188
- try {
189
- entryWithSize = { ...entry, fileSize: fs.statSync(file).size };
190
- if (hasMarkdownFragmentContent(entry)) {
191
- setMarkdownFragmentContent(entryWithSize, getMarkdownFragmentContent(entry));
192
- }
193
- }
194
- catch {
195
- // stat raced a delete — index without the size, like the full walk does.
196
- }
197
- // Real provenance (F4a M-core-2 item 5): populate item_ref/content_hash
198
- // via the SAME derivation the full-index writer uses, so a write-path
199
- // row is never a NULL-item_ref straggler.
200
- const provenance = deriveEntryProvenance({ bundleId: component.id, componentId: component.id, adapterId: component.adapter }, entry.type, entry.name, conceptId);
201
- // A materialized file has one current owner. If a targeted write is
202
- // the ownership handoff (for example an explicitly named bundle
203
- // replacing an earlier path-derived bootstrap identity), remove the
204
- // superseded physical-path row before publishing the canonical ref.
205
- const supersededIds = db
206
- .prepare("SELECT id FROM entries WHERE file_path = ? AND item_ref <> ?")
207
- .all(file, provenance.itemRef);
208
- deleteEntriesByIds(db, supersededIds.map((row) => row.id));
209
- targetEntryIds.add(upsertEntry(db, file, entryWithSize, buildSearchText(entry), provenance, contentHash));
210
- mutated = true;
211
- }
212
- })();
213
- if (mutated) {
214
- const config = loadConfig();
215
- await generateEmbeddingsForDb(db, config, () => { }, undefined, [...targetEntryIds]);
216
- publishTargetedEmbeddingMeta(db, config);
128
+ continue;
217
129
  }
218
130
  }
219
- finally {
220
- closeDatabase(db);
131
+ const ctx = buildFileContext(stashDir, file);
132
+ // Hardcoded `akmAdapter` on purpose (owner ruling 2026-07-21): this
133
+ // write-path fast path only ever runs for assets a first-class akm
134
+ // mutation command just wrote into a managed akm source, so the akm
135
+ // adapter is always the right recognizer here — no per-component
136
+ // dispatch needed.
137
+ const drained = drainDirDocuments(akmAdapter, component, [ctx]);
138
+ for (const rejectedPath of drained.rejectedPaths)
139
+ unindexable.add(rejectedPath);
140
+ for (const conceptId of drained.rejectedConceptIds)
141
+ rejectedConceptIds.add(conceptId);
142
+ const entry = drained.entries[0];
143
+ // A broken workflow drains to zero entries and is treated as
144
+ // unindexable; valid peer sources have already compiled to source IR.
145
+ const conceptId = drained.conceptIdByFile.get(ctx.absPath);
146
+ if (entry && conceptId)
147
+ pairs.push({ file, entry, conceptId, contentHash: drained.hashByFile.get(ctx.absPath) });
148
+ else
149
+ unindexable.add(file);
150
+ }
151
+ const db = openExistingDatabase(dbPath);
152
+ try {
153
+ db.exec(`PRAGMA busy_timeout = ${WRITE_PATH_INDEX_BUSY_TIMEOUT_MS}`);
154
+ if (getEntryCount(db) === 0)
155
+ return true;
156
+ const targetEntryIds = new Set();
157
+ let mutated = false;
158
+ db.transaction(() => {
159
+ const unindexableEntryIds = new Set();
160
+ for (const file of unindexable) {
161
+ const rows = db
162
+ .prepare(`SELECT id FROM entries
163
+ WHERE file_path = ?
164
+ AND bundle_id = ?
165
+ AND adapter_id = ?`)
166
+ .all(file, component.id, component.adapter);
167
+ for (const row of rows)
168
+ unindexableEntryIds.add(row.id);
169
+ }
170
+ for (const conceptId of rejectedConceptIds) {
171
+ const itemRef = `${component.id}//${conceptId}`;
172
+ const rows = db
173
+ .prepare(`SELECT id FROM entries
174
+ WHERE bundle_id = ? AND adapter_id = ?
175
+ AND type = 'workflow'
176
+ AND (concept_id = ? OR item_ref = ?)`)
177
+ .all(component.id, component.adapter, conceptId, itemRef);
178
+ for (const row of rows)
179
+ unindexableEntryIds.add(row.id);
180
+ }
181
+ deleteEntriesByIds(db, [...unindexableEntryIds]);
182
+ mutated ||= unindexableEntryIds.size > 0;
183
+ for (const { file, entry, conceptId, contentHash } of pairs) {
184
+ const entryWithSize = withFileSize(entry, file);
185
+ // Real provenance (F4a M-core-2 item 5): populate item_ref/content_hash
186
+ // via the SAME derivation the full-index writer uses, so a write-path
187
+ // row is never a NULL-item_ref straggler.
188
+ const provenance = deriveEntryProvenance({ bundleId: component.id, componentId: component.id, adapterId: component.adapter }, entry.type, entry.name, conceptId);
189
+ // A materialized file has one current owner. If a targeted write is
190
+ // the ownership handoff (for example an explicitly named bundle
191
+ // replacing an earlier path-derived bootstrap identity), remove the
192
+ // superseded physical-path row before publishing the canonical ref.
193
+ const supersededIds = db
194
+ .prepare("SELECT id FROM entries WHERE file_path = ? AND item_ref <> ?")
195
+ .all(file, provenance.itemRef);
196
+ deleteEntriesByIds(db, supersededIds.map((row) => row.id));
197
+ targetEntryIds.add(upsertEntry(db, file, entryWithSize, provenance, contentHash));
198
+ mutated = true;
199
+ }
200
+ })();
201
+ if (mutated) {
202
+ const config = loadConfig();
203
+ await generateEmbeddingsForDb(db, config, () => { }, undefined, [...targetEntryIds]);
204
+ publishTargetedEmbeddingMeta(db, config);
221
205
  }
222
- return true;
223
- })();
206
+ }
207
+ finally {
208
+ closeDatabase(db);
209
+ }
210
+ return true;
224
211
  }
225
212
  catch (error) {
226
213
  // A permission fault is the one failure the next full index will NOT heal,