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
@@ -125,13 +125,8 @@ export function validateStashEntry(entry) {
125
125
  result.cwd = e.cwd.trim();
126
126
  if (typeof e.fileSize === "number" && Number.isFinite(e.fileSize) && e.fileSize >= 0)
127
127
  result.fileSize = e.fileSize;
128
- if (e.wikiRole === "schema" ||
129
- e.wikiRole === "index" ||
130
- e.wikiRole === "log" ||
131
- e.wikiRole === "raw" ||
132
- e.wikiRole === "page") {
128
+ if (isWikiRole(e.wikiRole))
133
129
  result.wikiRole = e.wikiRole;
134
- }
135
130
  if (typeof e.pageKind === "string" && e.pageKind.trim().length > 0) {
136
131
  result.pageKind = e.pageKind.trim();
137
132
  }
@@ -155,12 +150,6 @@ export function validateStashEntry(entry) {
155
150
  const contradictedBy = normalizeNonEmptyStringList(e.contradictedBy);
156
151
  if (contradictedBy)
157
152
  result.contradictedBy = contradictedBy;
158
- // R5 — consolidation provenance fields must survive the whitelist too, or
159
- // stash.json-overridden merge products lose merge-following + generation
160
- // counting in the collapse detector.
161
- if (typeof e.generation === "number" && Number.isFinite(e.generation) && e.generation > 0) {
162
- result.generation = Math.floor(e.generation);
163
- }
164
153
  const currentBeliefRefs = normalizeNonEmptyStringList(e.currentBeliefRefs);
165
154
  if (currentBeliefRefs)
166
155
  result.currentBeliefRefs = currentBeliefRefs;
@@ -269,9 +258,6 @@ function normalizeIntent(value) {
269
258
  intent.output = output;
270
259
  return Object.keys(intent).length > 0 ? intent : undefined;
271
260
  }
272
- function normalizeStringListOrUndefined(value) {
273
- return normalizeNonEmptyStringList(value);
274
- }
275
261
  /**
276
262
  * Normalize a current derived-memory parent ref to its `memories/<name>`
277
263
  * conceptId for the `derived_from` column. Returns `undefined` for a non-memory
@@ -318,19 +304,19 @@ export function applyCuratedFrontmatter(entry, fmData) {
318
304
  entry.source = "frontmatter";
319
305
  entry.confidence = 0.9;
320
306
  }
321
- const tags = normalizeStringListOrUndefined(fmData.tags);
307
+ const tags = normalizeNonEmptyStringList(fmData.tags);
322
308
  if (tags)
323
309
  entry.tags = normalizeTerms(tags);
324
- const aliases = normalizeStringListOrUndefined(fmData.aliases);
310
+ const aliases = normalizeNonEmptyStringList(fmData.aliases);
325
311
  if (aliases)
326
312
  entry.aliases = normalizeTerms(aliases);
327
- const searchHints = normalizeStringListOrUndefined(fmData.searchHints);
313
+ const searchHints = normalizeNonEmptyStringList(fmData.searchHints);
328
314
  if (searchHints)
329
315
  entry.searchHints = searchHints;
330
- const usage = normalizeStringListOrUndefined(fmData.usage);
316
+ const usage = normalizeNonEmptyStringList(fmData.usage);
331
317
  if (usage)
332
318
  entry.usage = usage;
333
- const examples = normalizeStringListOrUndefined(fmData.examples);
319
+ const examples = normalizeNonEmptyStringList(fmData.examples);
334
320
  if (examples)
335
321
  entry.examples = examples;
336
322
  const run = asNonEmptyString(fmData.run);
@@ -354,19 +340,13 @@ export function applyCuratedFrontmatter(entry, fmData) {
354
340
  const beliefState = asNonEmptyString(fmData.beliefState);
355
341
  if (beliefState)
356
342
  entry.beliefState = beliefState;
357
- const supersededBy = normalizeStringListOrUndefined(fmData.supersededBy);
343
+ const supersededBy = normalizeNonEmptyStringList(fmData.supersededBy);
358
344
  if (supersededBy)
359
345
  entry.supersededBy = supersededBy;
360
- const contradictedBy = normalizeStringListOrUndefined(fmData.contradictedBy);
346
+ const contradictedBy = normalizeNonEmptyStringList(fmData.contradictedBy);
361
347
  if (contradictedBy)
362
348
  entry.contradictedBy = contradictedBy;
363
- // R5 — consolidation generation depth is captured so the collapse detector
364
- // can count over-generation assets without filesystem reads.
365
- const generation = fmData.generation;
366
- if (typeof generation === "number" && Number.isFinite(generation) && generation > 0) {
367
- entry.generation = Math.floor(generation);
368
- }
369
- const currentBeliefRefs = normalizeStringListOrUndefined(fmData.currentBeliefRefs);
349
+ const currentBeliefRefs = normalizeNonEmptyStringList(fmData.currentBeliefRefs);
370
350
  if (currentBeliefRefs)
371
351
  entry.currentBeliefRefs = currentBeliefRefs;
372
352
  // captureMode: "hot" | "background" — strict whitelist; unknown values are ignored.
@@ -384,7 +364,7 @@ export function applyCuratedFrontmatter(entry, fmData) {
384
364
  else if (typeof fmData.lessonStrength === "number" && Number.isFinite(fmData.lessonStrength)) {
385
365
  entry.lessonStrength = Math.max(0, Math.floor(fmData.lessonStrength));
386
366
  }
387
- const evidenceSources = normalizeStringListOrUndefined(fmData.evidenceSources);
367
+ const evidenceSources = normalizeNonEmptyStringList(fmData.evidenceSources);
388
368
  if (evidenceSources)
389
369
  entry.evidenceSources = evidenceSources;
390
370
  // Phase 5A / Advantage D5: capture parent ref for derived memories.
@@ -456,30 +436,22 @@ export function extractCommandParameters(template) {
456
436
  * frontmatter block and apply them to the entry. Tolerates missing or malformed values.
457
437
  */
458
438
  export function applyWikiFrontmatter(entry, fmData) {
459
- const role = fmData.wikiRole;
460
- if (role === "schema" || role === "index" || role === "log" || role === "raw" || role === "page") {
461
- entry.wikiRole = role;
462
- }
439
+ if (isWikiRole(fmData.wikiRole))
440
+ entry.wikiRole = fmData.wikiRole;
463
441
  const pageKind = fmData.pageKind;
464
442
  if (typeof pageKind === "string" && pageKind.trim().length > 0) {
465
443
  entry.pageKind = pageKind.trim();
466
444
  }
467
- const xrefs = fmData.xrefs;
468
- if (Array.isArray(xrefs)) {
469
- const filtered = xrefs
470
- .filter((x) => typeof x === "string" && x.trim().length > 0)
471
- .map((x) => x.trim());
472
- if (filtered.length > 0)
473
- entry.xrefs = filtered;
474
- }
475
- const sources = fmData.sources;
476
- if (Array.isArray(sources)) {
477
- const filtered = sources
478
- .filter((s) => typeof s === "string" && s.trim().length > 0)
479
- .map((s) => s.trim());
480
- if (filtered.length > 0)
481
- entry.sources = filtered;
482
- }
445
+ // Only lists: a bare string is not a citation list here.
446
+ const xrefs = Array.isArray(fmData.xrefs) ? normalizeNonEmptyStringList(fmData.xrefs) : undefined;
447
+ if (xrefs)
448
+ entry.xrefs = xrefs;
449
+ const sources = Array.isArray(fmData.sources) ? normalizeNonEmptyStringList(fmData.sources) : undefined;
450
+ if (sources)
451
+ entry.sources = sources;
452
+ }
453
+ function isWikiRole(value) {
454
+ return value === "schema" || value === "index" || value === "log" || value === "raw" || value === "page";
483
455
  }
484
456
  /**
485
457
  * Parse one `verified:` family value into the `IndexDocument.provenance` shape.
@@ -679,6 +651,26 @@ function parseIntentCommentLine(cleaned, metadata) {
679
651
  metadata.intent.when ??= value;
680
652
  return true;
681
653
  }
654
+ /** `@tag value` comment lines, in match order; the first matching tag wins a line. */
655
+ const COMMENT_TAGS = [
656
+ [/^@description\s+(.+)$/, (m, v) => (m.description = v.trim())],
657
+ [/^@tags?\s+(.+)$/, (m, v) => (m.tags = splitCommentList(v))],
658
+ [/^@aliases?\s+(.+)$/, (m, v) => (m.aliases = splitCommentList(v))],
659
+ [/^@searchHints?\s+(.+)$/, (m, v) => (m.searchHints = splitCommentList(v))],
660
+ [/^@usage\s+(.+)$/, (m, v) => (m.usage = [...(m.usage ?? []), v.trim()])],
661
+ [/^@examples?\s+(.+)$/, (m, v) => (m.examples = [...(m.examples ?? []), v.trim()])],
662
+ [/^@run\s+(.+)$/, (m, v) => (m.run = v.trim())],
663
+ [/^@setup\s+(.+)$/, (m, v) => (m.setup = v.trim())],
664
+ [/^@cwd\s+(.+)$/, (m, v) => (m.cwd = v.trim())],
665
+ [
666
+ /^@scope\s+(.+)$/,
667
+ (m, v) => {
668
+ const scope = parseCommentScope(v);
669
+ if (scope)
670
+ m.scope = scope;
671
+ },
672
+ ],
673
+ ];
682
674
  export function extractCommentMetadata(filePath, content) {
683
675
  if (content === undefined) {
684
676
  try {
@@ -702,56 +694,12 @@ export function extractCommentMetadata(filePath, content) {
702
694
  continue;
703
695
  if (parseIntentCommentLine(cleaned, metadata))
704
696
  continue;
705
- const descMatch = cleaned.match(/^@description\s+(.+)$/);
706
- if (descMatch) {
707
- metadata.description = descMatch[1].trim();
708
- continue;
709
- }
710
- const tagsMatch = cleaned.match(/^@tags?\s+(.+)$/);
711
- if (tagsMatch) {
712
- metadata.tags = splitCommentList(tagsMatch[1]);
713
- continue;
714
- }
715
- const aliasesMatch = cleaned.match(/^@aliases?\s+(.+)$/);
716
- if (aliasesMatch) {
717
- metadata.aliases = splitCommentList(aliasesMatch[1]);
718
- continue;
719
- }
720
- const hintsMatch = cleaned.match(/^@searchHints?\s+(.+)$/);
721
- if (hintsMatch) {
722
- metadata.searchHints = splitCommentList(hintsMatch[1]);
723
- continue;
724
- }
725
- const usageMatch = cleaned.match(/^@usage\s+(.+)$/);
726
- if (usageMatch) {
727
- metadata.usage = [...(metadata.usage ?? []), usageMatch[1].trim()];
728
- continue;
729
- }
730
- const examplesMatch = cleaned.match(/^@examples?\s+(.+)$/);
731
- if (examplesMatch) {
732
- metadata.examples = [...(metadata.examples ?? []), examplesMatch[1].trim()];
733
- continue;
734
- }
735
- const runMatch = cleaned.match(/^@run\s+(.+)$/);
736
- if (runMatch) {
737
- metadata.run = runMatch[1].trim();
738
- continue;
739
- }
740
- const setupMatch = cleaned.match(/^@setup\s+(.+)$/);
741
- if (setupMatch) {
742
- metadata.setup = setupMatch[1].trim();
743
- continue;
744
- }
745
- const cwdMatch = cleaned.match(/^@cwd\s+(.+)$/);
746
- if (cwdMatch) {
747
- metadata.cwd = cwdMatch[1].trim();
748
- continue;
749
- }
750
- const scopeMatch = cleaned.match(/^@scope\s+(.+)$/);
751
- if (scopeMatch) {
752
- const scope = parseCommentScope(scopeMatch[1]);
753
- if (scope)
754
- metadata.scope = scope;
697
+ for (const [pattern, apply] of COMMENT_TAGS) {
698
+ const match = cleaned.match(pattern);
699
+ if (match) {
700
+ apply(metadata, match[1]);
701
+ break;
702
+ }
755
703
  }
756
704
  }
757
705
  return Object.keys(metadata).length > 0 ? metadata : undefined;
@@ -760,50 +708,32 @@ export function applyCommentMetadata(entry, metadata) {
760
708
  if (!metadata)
761
709
  return;
762
710
  let usedCommentMetadata = false;
763
- if (metadata.description && !entry.description) {
764
- entry.description = metadata.description;
765
- usedCommentMetadata = true;
766
- }
767
- if (metadata.tags?.length && (!entry.tags || entry.tags.length === 0)) {
768
- entry.tags = normalizeTerms(metadata.tags);
769
- usedCommentMetadata = true;
770
- }
771
- if (metadata.aliases?.length) {
772
- entry.aliases = normalizeTerms(metadata.aliases);
773
- usedCommentMetadata = true;
774
- }
775
- if (metadata.searchHints?.length) {
776
- entry.searchHints = metadata.searchHints;
777
- usedCommentMetadata = true;
778
- }
779
- if (metadata.usage?.length) {
780
- entry.usage = metadata.usage;
781
- usedCommentMetadata = true;
782
- }
783
- if (metadata.examples?.length) {
784
- entry.examples = metadata.examples;
785
- usedCommentMetadata = true;
786
- }
787
- if (metadata.intent && Object.keys(metadata.intent).length > 0) {
788
- entry.intent = metadata.intent;
711
+ const use = (key, value) => {
712
+ entry[key] = value;
789
713
  usedCommentMetadata = true;
790
- }
791
- if (metadata.run) {
792
- entry.run = metadata.run;
793
- usedCommentMetadata = true;
794
- }
795
- if (metadata.setup) {
796
- entry.setup = metadata.setup;
797
- usedCommentMetadata = true;
798
- }
799
- if (metadata.cwd) {
800
- entry.cwd = metadata.cwd;
801
- usedCommentMetadata = true;
802
- }
803
- if (metadata.scope) {
804
- entry.scope = metadata.scope;
805
- usedCommentMetadata = true;
806
- }
714
+ };
715
+ if (metadata.description && !entry.description)
716
+ use("description", metadata.description);
717
+ if (metadata.tags?.length && (!entry.tags || entry.tags.length === 0))
718
+ use("tags", normalizeTerms(metadata.tags));
719
+ if (metadata.aliases?.length)
720
+ use("aliases", normalizeTerms(metadata.aliases));
721
+ if (metadata.searchHints?.length)
722
+ use("searchHints", metadata.searchHints);
723
+ if (metadata.usage?.length)
724
+ use("usage", metadata.usage);
725
+ if (metadata.examples?.length)
726
+ use("examples", metadata.examples);
727
+ if (metadata.intent && Object.keys(metadata.intent).length > 0)
728
+ use("intent", metadata.intent);
729
+ if (metadata.run)
730
+ use("run", metadata.run);
731
+ if (metadata.setup)
732
+ use("setup", metadata.setup);
733
+ if (metadata.cwd)
734
+ use("cwd", metadata.cwd);
735
+ if (metadata.scope)
736
+ use("scope", metadata.scope);
807
737
  if (usedCommentMetadata && entry.source !== "frontmatter" && entry.source !== "manual") {
808
738
  entry.source = "comments";
809
739
  entry.confidence = Math.max(entry.confidence ?? 0, 0.7);
@@ -813,25 +743,6 @@ function mergeAliases(existing, generated) {
813
743
  const merged = normalizeTerms([...(existing ?? []), ...generated]);
814
744
  return merged.length > 0 ? merged : undefined;
815
745
  }
816
- // ── Enrichment Completeness ─────────────────────────────────────────────────
817
- /**
818
- * Returns `true` when a stash entry already has enough LLM-quality metadata
819
- * that calling the LLM would produce no meaningful improvement.
820
- *
821
- * An entry is considered complete when ALL of the following hold:
822
- * - `description` is a non-empty string
823
- * - `tags` is a non-empty array
824
- * - `searchHints` is a non-empty array
825
- *
826
- * This predicate is used by `enhanceDirsWithLlm` to skip the LLM call for
827
- * entries that were previously enriched and already carry all three fields.
828
- */
829
- export function isEnrichmentComplete(entry) {
830
- const hasDescription = typeof entry.description === "string" && entry.description.trim().length > 0;
831
- const hasTags = Array.isArray(entry.tags) && entry.tags.length > 0;
832
- const hasSearchHints = Array.isArray(entry.searchHints) && entry.searchHints.length > 0;
833
- return hasDescription && hasTags && hasSearchHints;
834
- }
835
746
  // ── Native Markdown search projection ──────────────────────────────────────
836
747
  /**
837
748
  * Maximum native Markdown prose carried by the low-weight `content` field.
@@ -1131,36 +1042,14 @@ export function projectMarkdownContent(body, truncationInfo) {
1131
1042
  const innerBlock = findInnerFrontmatterBlock(lines);
1132
1043
  const start = innerBlock && isFrontmatterShaped(lines, innerBlock) ? innerBlock.close + 1 : 0;
1133
1044
  const projected = [];
1134
- let fence;
1135
- const htmlComment = { inComment: false };
1136
- for (let i = start; i < lines.length; i += 1) {
1137
- const rawLine = lines[i];
1138
- if (fence) {
1139
- if (isMarkdownFenceClosing(rawLine, fence))
1140
- fence = undefined;
1141
- continue;
1142
- }
1143
- // A leading fence owns the whole line, including any info string that
1144
- // resembles HTML. Comment state therefore cannot begin inside a fence.
1145
- if (!htmlComment.inComment) {
1146
- const openingFence = parseMarkdownFenceOpening(rawLine);
1147
- if (openingFence) {
1148
- fence = openingFence;
1149
- continue;
1150
- }
1151
- }
1152
- let trimmed = stripMarkdownHtmlComments(rawLine, htmlComment).trim();
1153
- const openingFence = parseMarkdownFenceOpening(trimmed);
1154
- if (openingFence) {
1155
- fence = openingFence;
1156
- continue;
1157
- }
1045
+ forEachVisibleMarkdownLine(lines, start, (_index, visible) => {
1046
+ let trimmed = visible.trim();
1158
1047
  if (!trimmed || /^(-{3,}|\*{3,}|_{3,}|=+)$/.test(trimmed))
1159
- continue;
1048
+ return;
1160
1049
  if (/^\s*\[[^\]]+\]:\s*\S+/.test(trimmed))
1161
- continue;
1050
+ return;
1162
1051
  if (/^<[^>]+>$/.test(trimmed))
1163
- continue;
1052
+ return;
1164
1053
  // Preserve human-facing labels and inline identifiers, never destinations.
1165
1054
  trimmed = stripMarkdownLinkDestinations(trimmed);
1166
1055
  trimmed = trimmed.replace(/`{1,2}([^`]+)`{1,2}/g, "$1");
@@ -1171,7 +1060,7 @@ export function projectMarkdownContent(body, truncationInfo) {
1171
1060
  trimmed = trimmed.replace(/\s+/g, " ").trim();
1172
1061
  if (trimmed)
1173
1062
  projected.push(trimmed);
1174
- }
1063
+ });
1175
1064
  const text = projected.join(" ").replace(/\s+/g, " ").trim();
1176
1065
  if (!text)
1177
1066
  return undefined;
@@ -1179,6 +1068,36 @@ export function projectMarkdownContent(body, truncationInfo) {
1179
1068
  truncationInfo.truncated = text.length > MARKDOWN_CONTENT_MAX_CHARS;
1180
1069
  return truncateUnicodeSafe(text, MARKDOWN_CONTENT_MAX_CHARS);
1181
1070
  }
1071
+ /**
1072
+ * Visit each line from `start` that lies outside fenced code, with HTML
1073
+ * comments removed (`visible`); fence lines themselves are never visited.
1074
+ */
1075
+ function forEachVisibleMarkdownLine(lines, start, visit) {
1076
+ let fence;
1077
+ const htmlComment = { inComment: false };
1078
+ for (let index = start; index < lines.length; index += 1) {
1079
+ const rawLine = lines[index];
1080
+ if (fence) {
1081
+ if (isMarkdownFenceClosing(rawLine, fence))
1082
+ fence = undefined;
1083
+ continue;
1084
+ }
1085
+ // A leading fence owns the whole line, including any info string that
1086
+ // resembles HTML. Comment state therefore cannot begin inside a fence.
1087
+ const leadingFence = htmlComment.inComment ? undefined : parseMarkdownFenceOpening(rawLine);
1088
+ if (leadingFence) {
1089
+ fence = leadingFence;
1090
+ continue;
1091
+ }
1092
+ const visible = stripMarkdownHtmlComments(rawLine, htmlComment);
1093
+ const openingFence = parseMarkdownFenceOpening(visible.trim());
1094
+ if (openingFence) {
1095
+ fence = openingFence;
1096
+ continue;
1097
+ }
1098
+ visit(index, visible);
1099
+ }
1100
+ }
1182
1101
  // Fragment text is intentionally not an IndexDocument field. IndexDocument is
1183
1102
  // an adapter/search payload boundary; this is an internal, derived index input
1184
1103
  // that is persisted separately by the entries repository for deterministic FTS
@@ -1197,6 +1116,21 @@ export function getMarkdownFragmentContent(entry) {
1197
1116
  export function hasMarkdownFragmentContent(entry) {
1198
1117
  return markdownFragmentProjectionEntries.has(entry);
1199
1118
  }
1119
+ /**
1120
+ * A copy of `entry` carrying `filePath`'s size (and its fragment projection),
1121
+ * or `entry` itself when the file cannot be stat'ed.
1122
+ */
1123
+ export function withFileSize(entry, filePath) {
1124
+ try {
1125
+ const sized = { ...entry, fileSize: fs.statSync(filePath).size };
1126
+ if (hasMarkdownFragmentContent(entry))
1127
+ setMarkdownFragmentContent(sized, getMarkdownFragmentContent(entry));
1128
+ return sized;
1129
+ }
1130
+ catch {
1131
+ return entry;
1132
+ }
1133
+ }
1200
1134
  /**
1201
1135
  * Produce a safe, structure-preserving projection for fragment indexing.
1202
1136
  * Excluded source lines are retained as blank lines so fragment locations map
@@ -1206,37 +1140,16 @@ export function hasMarkdownFragmentContent(entry) {
1206
1140
  export function projectMarkdownFragmentContent(raw) {
1207
1141
  const lines = raw.split(/\r?\n/);
1208
1142
  const parsed = parseFrontmatter(raw);
1209
- const start = parsed.frontmatter ? parsed.bodyStartLine - 1 : 0;
1210
1143
  const projected = lines.map(() => "");
1211
- let fence;
1212
- const htmlComment = { inComment: false };
1213
- for (let index = start; index < lines.length; index++) {
1214
- const rawLine = lines[index];
1215
- if (fence) {
1216
- if (isMarkdownFenceClosing(rawLine, fence))
1217
- fence = undefined;
1218
- continue;
1219
- }
1220
- if (!htmlComment.inComment) {
1221
- const opening = parseMarkdownFenceOpening(rawLine);
1222
- if (opening) {
1223
- fence = opening;
1224
- continue;
1225
- }
1226
- }
1227
- let safe = stripMarkdownHtmlComments(rawLine, htmlComment);
1228
- const opening = parseMarkdownFenceOpening(safe.trim());
1229
- if (opening) {
1230
- fence = opening;
1231
- continue;
1232
- }
1144
+ forEachVisibleMarkdownLine(lines, parsed.frontmatter ? parsed.bodyStartLine - 1 : 0, (index, visible) => {
1233
1145
  // Reference link destinations and standalone HTML are not retrieval
1234
1146
  // evidence and can contain credential-bearing URLs.
1235
- if (/^\s*\[[^\]]+\]:\s*\S+/.test(safe) || /^\s*<[^>]+>\s*$/.test(safe))
1236
- continue;
1237
- safe = stripMarkdownLinkDestinations(safe).replace(/<[^>]+>/g, " ");
1238
- projected[index] = safe.replace(/[ \t]+$/g, "");
1239
- }
1147
+ if (/^\s*\[[^\]]+\]:\s*\S+/.test(visible) || /^\s*<[^>]+>\s*$/.test(visible))
1148
+ return;
1149
+ projected[index] = stripMarkdownLinkDestinations(visible)
1150
+ .replace(/<[^>]+>/g, " ")
1151
+ .replace(/[ \t]+$/g, "");
1152
+ });
1240
1153
  const text = projected.join("\n");
1241
1154
  return text.trim() ? text : undefined;
1242
1155
  }
@@ -1350,7 +1263,7 @@ export function applyPostContributorFields(entry, file, canonicalName, dirPath)
1350
1263
  entry.tags = [...(entry.tags ?? []), ...extractDirTagsFromName(canonicalName)];
1351
1264
  entry.tags = normalizeTerms(entry.tags ?? []);
1352
1265
  entry.aliases = mergeAliases(entry.aliases, buildAliases(canonicalName, entry.tags));
1353
- // Search hints are only generated when LLM is configured (via enhanceStashWithLlm)
1266
+ // Search hints are only generated when LLM is configured (via enhanceEntriesWithLlm)
1354
1267
  // Heuristic search hints are too noisy to be useful for search quality
1355
1268
  entry.filename = path.basename(file);
1356
1269
  }
@@ -14,10 +14,3 @@ export async function ensurePrimaryIndexForRead(primarySource) {
14
14
  return false;
15
15
  return ensureIndex(primarySource.path);
16
16
  }
17
- /**
18
- * Convenience helper for callers that only need to ensure a read index from a
19
- * configured stash path and default config.
20
- */
21
- export async function ensurePrimaryIndexFromConfig(overrideStashDir, existingConfig) {
22
- return ensurePrimaryIndexForRead(resolveReadSources(overrideStashDir, existingConfig).primarySource);
23
- }
@@ -27,7 +27,7 @@
27
27
  * `basename(file)` in `applyPostContributorFields`, and `doc.path` IS that
28
28
  * file, so the value is identical.
29
29
  * - `fileSize` — never set by `recognize` NOR by the legacy flat-walk pass;
30
- * both pipelines attach it at PERSIST time (`attachFileSize`). It is therefore
30
+ * both pipelines attach it at PERSIST time (`withFileSize`). It is therefore
31
31
  * intentionally absent here and added by the persist layer, exactly as
32
32
  * before.
33
33
  *
@@ -137,9 +137,8 @@ export function indexDocumentToStashEntry(doc) {
137
137
  if (dj.wikiRole !== undefined)
138
138
  entry.wikiRole = dj.wikiRole;
139
139
  assignStringList(entry, "sources", dj.sources);
140
- if (typeof dj.generation === "number")
141
- entry.generation = dj.generation;
142
140
  assignStringList(entry, "evidenceSources", dj.evidenceSources);
141
+ assignStringList(entry, "uses", dj.uses);
143
142
  // D2 (#730): OKF v0.2 provenance promoteProposal stamps onto AKM-native
144
143
  // writes, carried via DOCUMENT_JSON_CARRIED_FIELDS (akm-adapter.ts) —
145
144
  // unpacked back to a first-class member here exactly like `sources`/
@@ -30,8 +30,8 @@ import path from "node:path";
30
30
  import { akmAdapter } from "../../core/adapter/adapters/akm-adapter.js";
31
31
  import { compareCodePoints } from "../../core/common.js";
32
32
  import { canonicalizeWorkflowName } from "../../core/recognition-util.js";
33
+ import { compileWorkflowSource } from "../../workflows/compile.js";
33
34
  import { resolveWorkflowSourceDomains, workflowNameForSourcePath } from "../../workflows/source-files.js";
34
- import { compileWorkflowSource } from "../../workflows/source-ir/compile.js";
35
35
  import { buildMetadataSkipWarning } from "../passes/metadata.js";
36
36
  import { buildFileContext } from "../walk/file-context.js";
37
37
  import { indexDocumentToStashEntry } from "./doc-to-entry.js";