akm-cli 0.9.0-rc.1 → 0.9.0-rc.13

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 (587) hide show
  1. package/CHANGELOG.md +1190 -52
  2. package/README.md +62 -37
  3. package/SECURITY.md +46 -31
  4. package/dist/akm +162 -38
  5. package/dist/akm-migrate +44 -0
  6. package/dist/assets/backends/schtasks-template.xml +2 -1
  7. package/dist/assets/hints/cli-hints-full.md +268 -118
  8. package/dist/assets/hints/cli-hints-short.md +87 -24
  9. package/dist/assets/{profiles → improve-strategies}/catchup.json +3 -1
  10. package/dist/assets/{profiles → improve-strategies}/consolidate.json +3 -1
  11. package/dist/assets/{profiles → improve-strategies}/default.json +6 -7
  12. package/dist/assets/improve-strategies/frequent.json +15 -0
  13. package/dist/assets/{profiles → improve-strategies}/graph-refresh.json +4 -2
  14. package/dist/assets/{profiles → improve-strategies}/memory-focus.json +4 -1
  15. package/dist/assets/{profiles → improve-strategies}/proactive-maintenance.json +5 -5
  16. package/dist/assets/{profiles → improve-strategies}/quick.json +4 -2
  17. package/dist/assets/improve-strategies/reflect-distill.json +30 -0
  18. package/dist/assets/{profiles → improve-strategies}/thorough.json +1 -1
  19. package/dist/assets/prompts/consolidate-system.md +5 -5
  20. package/dist/assets/prompts/extract-session.md +2 -6
  21. package/dist/assets/prompts/memory-infer-user.md +2 -3
  22. package/dist/assets/prompts/reflect-llm-framed-contract.md +11 -0
  23. package/dist/assets/prompts/reflect-llm-schema-contract.md +3 -0
  24. package/dist/assets/prompts/reflect-output-repair.md +3 -0
  25. package/dist/assets/stash-skeleton/README.md +38 -10
  26. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
  27. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
  28. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
  29. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
  30. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
  38. package/dist/assets/tasks/core/extract.yml +3 -2
  39. package/dist/assets/tasks/core/improve.yml +2 -1
  40. package/dist/assets/tasks/core/index-refresh.yml +1 -0
  41. package/dist/assets/tasks/core/sync.yml +1 -0
  42. package/dist/assets/tasks/core/version-check.yml +2 -1
  43. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  44. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  45. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  46. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  47. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  48. package/dist/assets/templates/html/health.html +5 -4
  49. package/dist/assets/workflows/workflow-template.md +31 -15
  50. package/dist/cli/invocation.js +279 -0
  51. package/dist/cli/parse-args.js +5 -90
  52. package/dist/cli/retired-commands.js +78 -0
  53. package/dist/cli/shared.js +158 -48
  54. package/dist/cli-node.mjs +2 -1
  55. package/dist/cli.js +747 -293
  56. package/dist/commands/agent/agent-dispatch.js +19 -18
  57. package/dist/commands/agent/agent-support.js +0 -24
  58. package/dist/commands/agent/contribute-cli.js +43 -97
  59. package/dist/commands/completions.js +80 -23
  60. package/dist/commands/config-cli.js +44 -281
  61. package/dist/commands/env/env-binding.js +13 -9
  62. package/dist/commands/env/env-cli.js +76 -159
  63. package/dist/commands/env/env.js +12 -163
  64. package/dist/commands/env/marker-path.js +6 -0
  65. package/dist/commands/env/secret-cli.js +45 -61
  66. package/dist/commands/env/secret.js +32 -62
  67. package/dist/commands/feedback-cli.js +179 -85
  68. package/dist/commands/health/accept-rate.js +58 -0
  69. package/dist/commands/health/advisories.js +7 -8
  70. package/dist/commands/health/checks.js +279 -94
  71. package/dist/commands/health/html-report.js +197 -578
  72. package/dist/commands/health/improve-metrics.js +277 -246
  73. package/dist/commands/health/llm-usage.js +19 -19
  74. package/dist/commands/health/md-report.js +16 -7
  75. package/dist/commands/health/metrics.js +67 -32
  76. package/dist/commands/health/renderers.js +47 -0
  77. package/dist/commands/health/report-view-model.js +508 -0
  78. package/dist/commands/health/stash-exposure.js +1 -1
  79. package/dist/commands/health/surfaces.js +16 -56
  80. package/dist/commands/health/task-runs.js +3 -67
  81. package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
  82. package/dist/commands/health/types-improve.js +29 -0
  83. package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
  84. package/dist/commands/health/types-result.js +7 -0
  85. package/dist/commands/health/types-runs.js +4 -0
  86. package/dist/commands/health/types-session-log.js +4 -0
  87. package/dist/commands/health/types-windows.js +4 -0
  88. package/dist/commands/health/types.js +26 -21
  89. package/dist/commands/health/windows.js +2 -3
  90. package/dist/commands/health.js +296 -167
  91. package/dist/commands/improve/anti-collapse.js +5 -5
  92. package/dist/commands/improve/autonomy-gate.js +68 -0
  93. package/dist/commands/improve/collapse-detector.js +65 -52
  94. package/dist/commands/improve/consolidate/chunking.js +9 -7
  95. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  96. package/dist/commands/improve/consolidate/merge.js +4 -0
  97. package/dist/commands/improve/consolidate.js +454 -1354
  98. package/dist/commands/improve/content-hash.js +39 -0
  99. package/dist/commands/improve/distill/content-repair.js +4 -10
  100. package/dist/commands/improve/distill/promote-memory.js +89 -64
  101. package/dist/commands/improve/distill/quality-gate.js +118 -42
  102. package/dist/commands/improve/distill-guards.js +1 -1
  103. package/dist/commands/improve/distill-promotion-policy.js +33 -888
  104. package/dist/commands/improve/distill.js +607 -363
  105. package/dist/commands/improve/eligibility.js +165 -79
  106. package/dist/commands/improve/extract-cli.js +35 -126
  107. package/dist/commands/improve/extract-prompt.js +6 -35
  108. package/dist/commands/improve/extract.js +640 -391
  109. package/dist/commands/improve/feedback-valence.js +2 -12
  110. package/dist/commands/improve/improve-cli.js +134 -135
  111. package/dist/commands/improve/improve-result-file.js +30 -50
  112. package/dist/commands/improve/improve-run-types.js +4 -0
  113. package/dist/commands/improve/improve-strategies.js +135 -0
  114. package/dist/commands/improve/improve.js +904 -701
  115. package/dist/commands/improve/locks.js +64 -111
  116. package/dist/commands/improve/loop-stages.js +1110 -923
  117. package/dist/commands/improve/memory/derived-ref.js +124 -0
  118. package/dist/commands/improve/memory/memory-belief.js +79 -7
  119. package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
  120. package/dist/commands/improve/memory/memory-improve.js +25 -37
  121. package/dist/commands/improve/outcome-loop.js +25 -88
  122. package/dist/commands/improve/preparation.js +1034 -813
  123. package/dist/commands/improve/proactive-maintenance.js +34 -9
  124. package/dist/commands/improve/proposal-envelope.js +31 -0
  125. package/dist/commands/improve/reflect.js +983 -794
  126. package/dist/commands/improve/run-context.js +119 -0
  127. package/dist/commands/improve/salience.js +24 -127
  128. package/dist/commands/improve/session-asset.js +7 -3
  129. package/dist/commands/improve/shared.js +14 -34
  130. package/dist/commands/improve/source-identity.js +28 -0
  131. package/dist/commands/improve/triage.js +20 -17
  132. package/dist/commands/lint/base-linter.js +340 -313
  133. package/dist/commands/lint/env-key-rules.js +31 -47
  134. package/dist/commands/lint/index.js +185 -30
  135. package/dist/commands/{events.js → log.js} +28 -38
  136. package/dist/commands/migrate-cli.js +54 -0
  137. package/dist/commands/migration-tool.js +55 -0
  138. package/dist/commands/observability-cli.js +70 -208
  139. package/dist/commands/proposal/diff-format.js +50 -0
  140. package/dist/commands/proposal/drain-policies.js +0 -6
  141. package/dist/commands/proposal/drain.js +91 -40
  142. package/dist/commands/proposal/proposal-cli.js +134 -132
  143. package/dist/commands/proposal/proposal-types.js +56 -0
  144. package/dist/commands/proposal/proposal.js +83 -65
  145. package/dist/commands/proposal/propose-cli.js +88 -0
  146. package/dist/commands/proposal/propose.js +105 -88
  147. package/dist/commands/proposal/repository.js +1303 -278
  148. package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
  149. package/dist/commands/proposal/validators/proposal-validators.js +61 -12
  150. package/dist/commands/proposal/validators/proposals.js +6 -8
  151. package/dist/commands/read/curate.js +78 -73
  152. package/dist/commands/read/knowledge.js +510 -13
  153. package/dist/commands/read/registry-search.js +2 -2
  154. package/dist/commands/read/remember-cli.js +84 -15
  155. package/dist/commands/read/search-cli.js +203 -96
  156. package/dist/commands/read/search.js +126 -94
  157. package/dist/commands/read/show.js +226 -250
  158. package/dist/commands/registry-cli.js +34 -60
  159. package/dist/commands/remember.js +18 -57
  160. package/dist/commands/sources/add-cli.js +104 -49
  161. package/dist/commands/sources/bundle-cli.js +166 -0
  162. package/dist/commands/sources/bundle-config-ops.js +63 -0
  163. package/dist/commands/sources/info.js +27 -15
  164. package/dist/commands/sources/init.js +30 -40
  165. package/dist/commands/sources/installed-stashes.js +469 -172
  166. package/dist/commands/sources/schema-repair.js +10 -9
  167. package/dist/commands/sources/self-update.js +182 -121
  168. package/dist/commands/sources/source-add.js +169 -178
  169. package/dist/commands/sources/source-clone.js +144 -41
  170. package/dist/commands/sources/source-manage.js +94 -59
  171. package/dist/commands/sources/sources-cli.js +64 -205
  172. package/dist/commands/sources/stash-cli.js +91 -54
  173. package/dist/commands/sources/stash-skeleton.js +1 -1
  174. package/dist/commands/tasks/tasks-cli.js +106 -104
  175. package/dist/commands/tasks/tasks.js +445 -262
  176. package/dist/commands/workflow-cli.js +75 -228
  177. package/dist/core/action-contributors.js +1 -1
  178. package/dist/core/activation-policy.js +49 -0
  179. package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
  180. package/dist/core/adapter/adapters/akm-adapter.js +528 -0
  181. package/dist/core/adapter/adapters/akm-lint.js +392 -0
  182. package/dist/core/adapter/adapters/akm-metadata.js +387 -0
  183. package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
  184. package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
  185. package/dist/core/adapter/adapters/claude-adapter.js +61 -0
  186. package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
  187. package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
  188. package/dist/core/adapter/adapters/index.js +80 -0
  189. package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
  190. package/dist/core/adapter/adapters/okf-adapter.js +391 -0
  191. package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
  192. package/dist/core/adapter/adapters/shared.js +286 -0
  193. package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
  194. package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
  195. package/dist/core/adapter/bundle-adapter.js +4 -0
  196. package/dist/core/adapter/detect-adapter.js +17 -0
  197. package/dist/core/adapter/recognize-match.js +44 -0
  198. package/dist/core/adapter/registry.js +56 -0
  199. package/dist/core/adapter/types.js +4 -0
  200. package/dist/core/asset/akm-markdown.js +30 -0
  201. package/dist/core/asset/asset-placement.js +243 -0
  202. package/dist/core/asset/asset-ref.js +110 -79
  203. package/dist/core/asset/asset-serialize.js +20 -0
  204. package/dist/core/asset/frontmatter.js +28 -12
  205. package/dist/core/asset/markdown.js +40 -51
  206. package/dist/core/asset/resolve-ref.js +274 -0
  207. package/dist/core/asset/stash-meta.js +2 -2
  208. package/dist/core/bundle-id.js +51 -0
  209. package/dist/core/common.js +281 -86
  210. package/dist/core/config/config-io.js +42 -128
  211. package/dist/core/config/config-schema.js +233 -855
  212. package/dist/core/config/config-sources.js +162 -39
  213. package/dist/core/config/config-types.js +16 -11
  214. package/dist/core/config/config-version.js +29 -0
  215. package/dist/core/config/config-walker.js +126 -37
  216. package/dist/core/config/config.js +154 -331
  217. package/dist/core/config/deep-merge.js +41 -0
  218. package/dist/core/config/engine-semantics.js +28 -0
  219. package/dist/core/config/experimental.js +21 -0
  220. package/dist/core/config/schema/embedding.js +38 -0
  221. package/dist/core/config/schema/engines.js +116 -0
  222. package/dist/core/config/schema/experimental.js +47 -0
  223. package/dist/core/config/schema/feedback.js +31 -0
  224. package/dist/core/config/schema/improve-processes.js +389 -0
  225. package/dist/core/config/schema/improve.js +94 -0
  226. package/dist/core/config/schema/index-config.js +176 -0
  227. package/dist/core/config/schema/output.js +18 -0
  228. package/dist/core/config/schema/primitives.js +94 -0
  229. package/dist/core/config/schema/search.js +30 -0
  230. package/dist/core/config/schema/setup.js +18 -0
  231. package/dist/core/config/schema/sources-bundles.js +169 -0
  232. package/dist/core/config/schema/workflow.js +29 -0
  233. package/dist/core/env-secret-ref.js +155 -20
  234. package/dist/core/errors.js +17 -15
  235. package/dist/core/events-types.js +4 -0
  236. package/dist/core/events.js +46 -128
  237. package/dist/core/extra-params.js +62 -0
  238. package/dist/core/file-change.js +17 -0
  239. package/dist/core/file-lock.js +202 -57
  240. package/dist/core/fs-txn.js +392 -0
  241. package/dist/core/git-message.js +59 -0
  242. package/dist/core/improve-result.js +167 -0
  243. package/dist/core/lesson-lint.js +1 -17
  244. package/dist/core/logs-db.js +1 -1
  245. package/dist/core/maintenance-barrier.js +135 -0
  246. package/dist/core/migration-operation.js +44 -0
  247. package/dist/core/mutation-target.js +78 -0
  248. package/dist/core/paths.js +22 -25
  249. package/dist/core/platform.js +10 -0
  250. package/dist/core/recognition-util.js +128 -0
  251. package/dist/core/redaction.js +392 -0
  252. package/dist/core/standards/resolve-standards-context.js +36 -65
  253. package/dist/core/standards/resolve-stash-standards.js +2 -2
  254. package/dist/core/standards/resolve-type-conventions.js +5 -5
  255. package/dist/core/state/migrations.js +242 -11
  256. package/dist/core/state-db.js +98 -10
  257. package/dist/core/structured.js +1 -1
  258. package/dist/core/subprocess.js +303 -0
  259. package/dist/core/text-truncation.js +9 -5
  260. package/dist/core/time.js +20 -0
  261. package/dist/core/type-presentation.js +130 -0
  262. package/dist/core/warn.js +0 -3
  263. package/dist/core/write-source.js +834 -118
  264. package/dist/indexer/bundle-identity-guard.js +92 -0
  265. package/dist/indexer/db/graph-db.js +1 -25
  266. package/dist/indexer/db/llm-cache.js +1 -1
  267. package/dist/indexer/ensure-index.js +30 -9
  268. package/dist/indexer/graph/graph-boost.js +9 -30
  269. package/dist/indexer/graph/graph-extraction.js +41 -27
  270. package/dist/indexer/graph/graph-types.js +4 -0
  271. package/dist/indexer/index-writer-lock.js +93 -49
  272. package/dist/indexer/index-written-assets.js +100 -53
  273. package/dist/indexer/indexer.js +746 -329
  274. package/dist/indexer/init.js +18 -25
  275. package/dist/indexer/installations.js +142 -0
  276. package/dist/indexer/passes/dir-staleness.js +18 -10
  277. package/dist/indexer/passes/memory-inference.js +25 -15
  278. package/dist/indexer/passes/metadata.js +412 -243
  279. package/dist/indexer/scan/doc-to-entry.js +160 -0
  280. package/dist/indexer/scan/drain-dir.js +134 -0
  281. package/dist/indexer/search/db-search.js +292 -108
  282. package/dist/indexer/search/fts-query.js +64 -0
  283. package/dist/indexer/search/ranking-contributors.js +145 -25
  284. package/dist/indexer/search/ranking-types.js +4 -0
  285. package/dist/indexer/search/ranking.js +28 -71
  286. package/dist/indexer/search/search-attribution.js +67 -0
  287. package/dist/indexer/search/search-fields.js +18 -3
  288. package/dist/indexer/search/search-hit-enrichers.js +30 -40
  289. package/dist/indexer/search/search-source.js +157 -111
  290. package/dist/indexer/search/semantic-status.js +4 -1
  291. package/dist/indexer/usage/usage-events.js +10 -30
  292. package/dist/indexer/walk/file-context.js +3 -45
  293. package/dist/indexer/walk/matchers.js +42 -73
  294. package/dist/indexer/walk/path-resolver.js +11 -5
  295. package/dist/indexer/walk/walker.js +42 -14
  296. package/dist/integrations/agent/builder-shared.js +7 -0
  297. package/dist/integrations/agent/builders.js +5 -58
  298. package/dist/integrations/agent/config.js +3 -143
  299. package/dist/integrations/agent/detect.js +17 -2
  300. package/dist/integrations/agent/engine-resolution.js +231 -0
  301. package/dist/integrations/agent/index.js +1 -2
  302. package/dist/integrations/agent/model-aliases.js +8 -3
  303. package/dist/integrations/agent/profiles.js +6 -99
  304. package/dist/integrations/agent/prompts.js +46 -18
  305. package/dist/integrations/agent/runner-dispatch.js +78 -13
  306. package/dist/integrations/agent/runner.js +76 -208
  307. package/dist/integrations/agent/spawn.js +48 -279
  308. package/dist/integrations/harnesses/aider/agent-builder.js +9 -8
  309. package/dist/integrations/harnesses/aider/index.js +2 -12
  310. package/dist/integrations/harnesses/amazonq/agent-builder.js +10 -16
  311. package/dist/integrations/harnesses/amazonq/index.js +3 -17
  312. package/dist/integrations/harnesses/claude/agent-builder.js +2 -3
  313. package/dist/integrations/harnesses/claude/config-import.js +1 -3
  314. package/dist/integrations/harnesses/claude/index.js +1 -14
  315. package/dist/integrations/harnesses/claude/session-log.js +27 -75
  316. package/dist/integrations/harnesses/codex/agent-builder.js +8 -7
  317. package/dist/integrations/harnesses/codex/index.js +2 -13
  318. package/dist/integrations/harnesses/copilot/agent-builder.js +9 -9
  319. package/dist/integrations/harnesses/copilot/index.js +1 -13
  320. package/dist/integrations/harnesses/gemini/agent-builder.js +8 -9
  321. package/dist/integrations/harnesses/gemini/index.js +1 -13
  322. package/dist/integrations/harnesses/ids.js +24 -0
  323. package/dist/integrations/harnesses/index.js +31 -33
  324. package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
  325. package/dist/integrations/harnesses/opencode/config-import.js +1 -3
  326. package/dist/integrations/harnesses/opencode/index.js +1 -18
  327. package/dist/integrations/harnesses/opencode/session-log.js +67 -125
  328. package/dist/integrations/harnesses/opencode-sdk/harness.js +3 -17
  329. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +274 -191
  330. package/dist/integrations/harnesses/openhands/agent-builder.js +12 -10
  331. package/dist/integrations/harnesses/openhands/index.js +2 -12
  332. package/dist/integrations/harnesses/pi/agent-builder.js +11 -18
  333. package/dist/integrations/harnesses/pi/index.js +3 -16
  334. package/dist/integrations/harnesses/shared.js +17 -0
  335. package/dist/integrations/harnesses/types.js +38 -34
  336. package/dist/integrations/lockfile.js +211 -24
  337. package/dist/integrations/session-logs/index.js +24 -40
  338. package/dist/integrations/session-logs/provider-base.js +113 -0
  339. package/dist/llm/client.js +182 -110
  340. package/dist/llm/embedders/deterministic.js +2 -2
  341. package/dist/llm/embedders/remote.js +21 -9
  342. package/dist/llm/feature-gate.js +17 -57
  343. package/dist/llm/graph-extract.js +12 -13
  344. package/dist/llm/index-passes.js +8 -42
  345. package/dist/llm/memory-infer.js +144 -1
  346. package/dist/llm/metadata-enhance.js +45 -30
  347. package/dist/llm/structured-call.js +16 -8
  348. package/dist/llm/usage-persist.js +30 -5
  349. package/dist/llm/usage-telemetry.js +59 -6
  350. package/dist/output/cli-hints.js +1 -2
  351. package/dist/output/command-registry.js +27 -0
  352. package/dist/output/context.js +22 -7
  353. package/dist/output/format-exempt.js +80 -0
  354. package/dist/output/generic-render.js +251 -0
  355. package/dist/output/html-render.js +11 -16
  356. package/dist/output/render-registry.js +57 -0
  357. package/dist/output/renderers.js +15 -281
  358. package/dist/output/shapes/curate.js +10 -1
  359. package/dist/output/shapes/events.js +12 -7
  360. package/dist/output/shapes/helpers.js +58 -84
  361. package/dist/output/shapes/passthrough.js +8 -40
  362. package/dist/output/shapes/proposal/producer.js +15 -7
  363. package/dist/output/shapes/registry.js +12 -6
  364. package/dist/output/shapes.js +0 -9
  365. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  366. package/dist/output/text/bundle-show.js +7 -0
  367. package/dist/output/text/command-format.js +562 -0
  368. package/dist/output/text/env.js +1 -3
  369. package/dist/output/text/events.js +8 -7
  370. package/dist/output/text/helpers.js +15 -1375
  371. package/dist/output/text/proposal/producer.js +4 -2
  372. package/dist/output/text/proposal-format.js +202 -0
  373. package/dist/output/text/registry-commands.js +1 -2
  374. package/dist/output/text/registry.js +12 -6
  375. package/dist/output/text/show-directives.js +117 -0
  376. package/dist/output/text/show-format.js +103 -0
  377. package/dist/output/text/sync.js +5 -0
  378. package/dist/output/text/workflow-format.js +332 -0
  379. package/dist/output/text/workflow.js +1 -2
  380. package/dist/output/text.js +10 -19
  381. package/dist/registry/factory.js +4 -6
  382. package/dist/registry/origin-resolve.js +16 -27
  383. package/dist/registry/providers/skills-sh.js +3 -3
  384. package/dist/registry/providers/static-index.js +15 -25
  385. package/dist/registry/resolve.js +43 -94
  386. package/dist/registry/semver.js +43 -0
  387. package/dist/runtime.js +81 -12
  388. package/dist/scripts/akm-migrate.js +35529 -0
  389. package/dist/setup/detect.js +5 -7
  390. package/dist/setup/detected-engines.js +136 -0
  391. package/dist/setup/engine-config.js +100 -0
  392. package/dist/setup/registry-stash-loader.js +3 -3
  393. package/dist/setup/semantic-assets.js +12 -9
  394. package/dist/setup/setup.js +444 -208
  395. package/dist/setup/steps/connection-shared.js +120 -0
  396. package/dist/setup/steps/connection.js +108 -305
  397. package/dist/setup/steps/platforms.js +13 -12
  398. package/dist/setup/steps/semantic.js +15 -3
  399. package/dist/setup/steps/sources.js +21 -15
  400. package/dist/setup/steps/stashdir.js +6 -4
  401. package/dist/setup/steps/tasks.js +236 -119
  402. package/dist/setup/steps.js +3 -2
  403. package/dist/sources/freshness.js +39 -0
  404. package/dist/sources/provider-factory.js +11 -17
  405. package/dist/sources/providers/filesystem.js +2 -3
  406. package/dist/sources/providers/git-install.js +278 -34
  407. package/dist/sources/providers/git-provider.js +54 -56
  408. package/dist/sources/providers/git-stash.js +420 -91
  409. package/dist/sources/providers/git.js +2 -2
  410. package/dist/sources/providers/npm.js +16 -19
  411. package/dist/sources/providers/provider-utils.js +47 -22
  412. package/dist/sources/providers/sync-from-ref.js +3 -9
  413. package/dist/sources/providers/website.js +2 -2
  414. package/dist/sources/resolve.js +11 -10
  415. package/dist/sources/snapshot-fetchers/types.js +4 -0
  416. package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
  417. package/dist/storage/database.js +60 -4
  418. package/dist/storage/engines/sqlite-migrations.js +156 -5
  419. package/dist/storage/locations.js +1 -2
  420. package/dist/storage/repositories/canaries-repository.js +1 -1
  421. package/dist/storage/repositories/events-repository.js +51 -11
  422. package/dist/storage/repositories/improve-runs-repository.js +6 -32
  423. package/dist/storage/repositories/index-connection.js +79 -0
  424. package/dist/storage/repositories/index-db.js +4 -3
  425. package/dist/storage/repositories/index-entries-repository.js +863 -0
  426. package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
  427. package/dist/storage/repositories/index-entry-types.js +4 -0
  428. package/dist/storage/repositories/index-fts-repository.js +167 -0
  429. package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
  430. package/dist/storage/repositories/index-meta-repository.js +49 -0
  431. package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
  432. package/dist/storage/repositories/index-sql.js +12 -0
  433. package/dist/storage/repositories/index-utility-repository.js +356 -0
  434. package/dist/storage/repositories/index-vec-repository.js +250 -0
  435. package/dist/storage/repositories/outcome-repository.js +119 -0
  436. package/dist/storage/repositories/proposals-repository.js +317 -75
  437. package/dist/storage/repositories/registry-cache.js +1 -1
  438. package/dist/storage/repositories/salience-repository.js +172 -0
  439. package/dist/storage/repositories/task-history-repository.js +110 -3
  440. package/dist/storage/repositories/workflow-runs-repository.js +68 -35
  441. package/dist/tasks/backends/cron.js +169 -46
  442. package/dist/tasks/backends/exec-utils.js +76 -3
  443. package/dist/tasks/backends/index.js +6 -9
  444. package/dist/tasks/backends/launchd.js +292 -55
  445. package/dist/tasks/backends/schtasks.js +557 -70
  446. package/dist/tasks/backends/types.js +4 -0
  447. package/dist/tasks/command-executable.js +93 -0
  448. package/dist/tasks/embedded.js +56 -38
  449. package/dist/tasks/parser.js +156 -64
  450. package/dist/tasks/resolve-akm-bin.js +144 -51
  451. package/dist/tasks/runner.js +377 -209
  452. package/dist/tasks/schedule.js +108 -19
  453. package/dist/tasks/scheduler-invocation.js +296 -0
  454. package/dist/tasks/schema.js +1 -1
  455. package/dist/tasks/task-id.js +35 -0
  456. package/dist/tasks/validator.js +30 -16
  457. package/dist/workflows/authoring/authoring.js +96 -148
  458. package/dist/workflows/authoring/scope-key.js +1 -1
  459. package/dist/workflows/cli.js +0 -20
  460. package/dist/workflows/concurrency-policy.js +15 -0
  461. package/dist/workflows/exec/brief.js +25 -59
  462. package/dist/workflows/exec/frozen-judge.js +47 -0
  463. package/dist/workflows/exec/native-executor.js +157 -94
  464. package/dist/workflows/exec/report.js +365 -200
  465. package/dist/workflows/exec/run-workflow.js +46 -40
  466. package/dist/workflows/exec/scheduler.js +12 -41
  467. package/dist/workflows/exec/step-work.js +239 -205
  468. package/dist/workflows/exec/workflow-engine-gate.js +67 -0
  469. package/dist/workflows/ir/compile.js +141 -283
  470. package/dist/workflows/ir/freeze.js +233 -0
  471. package/dist/workflows/ir/plan-hash.js +40 -5
  472. package/dist/workflows/ir/schema.js +537 -1
  473. package/dist/workflows/parser.js +878 -306
  474. package/dist/workflows/program/expressions.js +20 -208
  475. package/dist/workflows/program/schema.js +7 -10
  476. package/dist/workflows/renderer.js +99 -121
  477. package/dist/workflows/resource-limits.js +22 -0
  478. package/dist/workflows/runtime/checkin.js +1 -1
  479. package/dist/workflows/runtime/plan-classifier.js +131 -0
  480. package/dist/workflows/runtime/runs.js +200 -113
  481. package/dist/workflows/runtime/unit-checkin.js +1 -1
  482. package/dist/workflows/runtime/unit-phases.js +20 -0
  483. package/dist/workflows/runtime/workflow-asset-loader.js +235 -97
  484. package/dist/workflows/schema.js +1 -11
  485. package/dist/workflows/validate-summary.js +4 -26
  486. package/dist/workflows/validator.js +52 -30
  487. package/docs/README.md +42 -78
  488. package/docs/migration/README.md +8 -0
  489. package/docs/migration/release-notes/0.6.0.md +1 -1
  490. package/docs/migration/release-notes/0.7.0.md +9 -8
  491. package/docs/migration/release-notes/0.9.0.md +158 -14
  492. package/docs/migration/v0.7-to-v0.8.md +46 -47
  493. package/docs/migration/v0.8-to-v0.9.md +844 -0
  494. package/docs/reference/README.md +12 -0
  495. package/docs/reference/data-and-telemetry.md +333 -0
  496. package/package.json +21 -17
  497. package/schemas/akm-asset-envelope.json +93 -0
  498. package/schemas/akm-config.json +4636 -0
  499. package/schemas/akm-task.json +87 -0
  500. package/{dist/schemas → schemas}/akm-workflow.json +127 -82
  501. package/dist/akm-migrate-storage +0 -38
  502. package/dist/assets/help/help-accept.md +0 -12
  503. package/dist/assets/help/help-improve.md +0 -84
  504. package/dist/assets/help/help-proposals.md +0 -17
  505. package/dist/assets/help/help-propose.md +0 -17
  506. package/dist/assets/help/help-reject.md +0 -11
  507. package/dist/assets/profiles/frequent.json +0 -13
  508. package/dist/assets/profiles/recombine-only.json +0 -21
  509. package/dist/assets/profiles/reflect-distill.json +0 -30
  510. package/dist/assets/profiles/synthesize.json +0 -15
  511. package/dist/assets/prompts/procedural-system.md +0 -44
  512. package/dist/assets/prompts/recombine-system.md +0 -40
  513. package/dist/assets/prompts/staleness-detect-system.md +0 -6
  514. package/dist/assets/tasks/core/backup.yml +0 -4
  515. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  516. package/dist/assets/templates/html/default.html +0 -78
  517. package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
  518. package/dist/assets/wiki/index-template.md +0 -12
  519. package/dist/assets/wiki/ingest-workflow-template.md +0 -83
  520. package/dist/assets/wiki/log-template.md +0 -8
  521. package/dist/assets/wiki/schema-template.md +0 -61
  522. package/dist/cli/config-migrate.js +0 -150
  523. package/dist/cli/config-validate.js +0 -39
  524. package/dist/commands/graph/graph-cli.js +0 -124
  525. package/dist/commands/graph/graph.js +0 -487
  526. package/dist/commands/improve/calibration.js +0 -161
  527. package/dist/commands/improve/dedup.js +0 -482
  528. package/dist/commands/improve/extract-watch.js +0 -140
  529. package/dist/commands/improve/hot-probation.js +0 -45
  530. package/dist/commands/improve/improve-auto-accept.js +0 -276
  531. package/dist/commands/improve/improve-profiles.js +0 -168
  532. package/dist/commands/improve/procedural.js +0 -398
  533. package/dist/commands/improve/recombine.js +0 -818
  534. package/dist/commands/improve/schema-similarity-gate.js +0 -168
  535. package/dist/commands/lint/agent-linter.js +0 -44
  536. package/dist/commands/lint/command-linter.js +0 -44
  537. package/dist/commands/lint/default-linter.js +0 -16
  538. package/dist/commands/lint/fact-linter.js +0 -39
  539. package/dist/commands/lint/knowledge-linter.js +0 -16
  540. package/dist/commands/lint/memory-linter.js +0 -61
  541. package/dist/commands/lint/registry.js +0 -41
  542. package/dist/commands/lint/skill-linter.js +0 -45
  543. package/dist/commands/lint/task-linter.js +0 -50
  544. package/dist/commands/lint/workflow-linter.js +0 -81
  545. package/dist/commands/proposal/legacy-import.js +0 -115
  546. package/dist/commands/sources/history.js +0 -196
  547. package/dist/commands/tasks/default-tasks.js +0 -186
  548. package/dist/commands/wiki-cli.js +0 -292
  549. package/dist/core/asset/asset-registry.js +0 -76
  550. package/dist/core/asset/asset-spec.js +0 -316
  551. package/dist/core/config/config-migration.js +0 -602
  552. package/dist/core/deep-merge.js +0 -38
  553. package/dist/core/eval/rank-metrics.js +0 -113
  554. package/dist/core/ripgrep/install.js +0 -163
  555. package/dist/core/ripgrep/resolve.js +0 -81
  556. package/dist/indexer/db/db.js +0 -1414
  557. package/dist/indexer/manifest.js +0 -170
  558. package/dist/indexer/passes/metadata-contributors.js +0 -31
  559. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
  560. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -25
  561. package/dist/llm/call-ai.js +0 -62
  562. package/dist/llm/memory-infer-impl.js +0 -138
  563. package/dist/output/shapes/distill.js +0 -14
  564. package/dist/output/shapes/history.js +0 -11
  565. package/dist/output/text/distill.js +0 -6
  566. package/dist/output/text/enable-disable.js +0 -8
  567. package/dist/output/text/history.js +0 -6
  568. package/dist/output/text/wiki.js +0 -16
  569. package/dist/registry/build-index.js +0 -386
  570. package/dist/schemas/akm-config.json +0 -14225
  571. package/dist/scripts/migrate-storage.js +0 -13169
  572. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -10169
  573. package/dist/scripts/migrations/v16-to-v17.js +0 -141
  574. package/dist/setup/legacy-config.js +0 -106
  575. package/dist/storage/repositories/consolidation-repository.js +0 -38
  576. package/dist/storage/repositories/recombine-repository.js +0 -213
  577. package/dist/wiki/wiki-templates.js +0 -15
  578. package/dist/wiki/wiki.js +0 -1012
  579. package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
  580. package/dist/workflows/db.js +0 -350
  581. package/dist/workflows/exec/watch.js +0 -116
  582. package/dist/workflows/program/parser.js +0 -760
  583. package/dist/workflows/program/project.js +0 -105
  584. package/docs/data-and-telemetry.md +0 -227
  585. package/docs/migration/release-notes/0.9.0-beta.60.md +0 -19
  586. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
  587. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
@@ -0,0 +1,119 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ /**
5
+ * `RunContext` — the shared, run-scoped carrier for the three improve verbs
6
+ * (revise = reflect, learn = extract/distill/inference, consolidate = the
7
+ * memory-tier ops; D17). WI-7.5–7.8 decompose the improve god-functions into
8
+ * named passes that thread a `RunContext` instead of long positional argument
9
+ * lists.
10
+ *
11
+ * ## The D6 read-once seam
12
+ *
13
+ * `readAsset` is a memoizing file-read seam whose memo is **NEVER run-wide**
14
+ * (D6 / top-risk #7: a run-wide memo would serve prep-time bytes after a mid-run
15
+ * write). The guarantee is structural here, not merely conventional:
16
+ *
17
+ * - The **base** context returned by {@link createRunContext} has NO active
18
+ * memo. `readAsset` on it always reads through to disk, so it can never go
19
+ * stale — the safe default.
20
+ * - {@link RunContext.withFreshAssetMemo} mints a sibling context that shares
21
+ * every run-scoped carrier but owns a FRESH, empty memo. Memoization is
22
+ * therefore opt-in per scope:
23
+ * * prep's stage-body passes share ONE memo, forked only AFTER the
24
+ * mutating pre-loop passes have written their ops to disk, then
25
+ * discarded at stage end;
26
+ * * reflect and distill each fork their own memo per verb invocation, so
27
+ * their reads still happen at invoke time (not prep time).
28
+ * - Within a memo scope, {@link RunContext.writeAsset} writes through to disk
29
+ * AND refreshes the memo, and {@link RunContext.noteAssetWrite} drops a memo
30
+ * entry for a path written out-of-band, so a subsequent `readAsset` of the
31
+ * same path returns POST-write bytes (e.g. the distill in-loop salience
32
+ * stamp at `distill.ts:816`).
33
+ *
34
+ * The contract is pinned by `tests/commands/improve/run-context.test.ts`.
35
+ *
36
+ * This module deliberately mints only the carrier + seam. Adoption at the verb
37
+ * call sites lands in WI-7.5 (reflect/distill), WI-7.6 (preparation), and
38
+ * WI-7.7 (akmImprove/extract). It does NOT change `EventsContext` shape and does
39
+ * NOT thread a db handle into `ProposalsContext` (D14).
40
+ */
41
+ import fs from "node:fs";
42
+ import path from "node:path";
43
+ import { resolveStashDir } from "../../core/common.js";
44
+ import { chatCompletion } from "../../llm/client.js";
45
+ /**
46
+ * Build a `RunContext` over the given carriers with the supplied memo (or `null`
47
+ * for the non-memoizing base context). Kept private so the only way to obtain a
48
+ * memoizing context is {@link RunContext.withFreshAssetMemo}.
49
+ */
50
+ function buildRunContext(carriers, memo) {
51
+ const memoKey = (filePath) => path.resolve(filePath);
52
+ return {
53
+ stashDir: carriers.stashDir,
54
+ config: carriers.config,
55
+ eventsCtx: carriers.eventsCtx,
56
+ proposalsCtx: carriers.proposalsCtx,
57
+ chat: carriers.chat,
58
+ getLlmConfig: carriers.getLlmConfig,
59
+ sourceRun: carriers.sourceRun,
60
+ dryRun: carriers.dryRun,
61
+ signal: carriers.signal,
62
+ now: carriers.now,
63
+ readAsset(filePath) {
64
+ if (!memo)
65
+ return carriers.readFile(filePath);
66
+ const key = memoKey(filePath);
67
+ const cached = memo.get(key);
68
+ if (cached !== undefined)
69
+ return cached;
70
+ const bytes = carriers.readFile(filePath);
71
+ memo.set(key, bytes);
72
+ return bytes;
73
+ },
74
+ writeAsset(filePath, content) {
75
+ carriers.writeFile(filePath, content);
76
+ memo?.set(memoKey(filePath), content);
77
+ },
78
+ noteAssetWrite(filePath) {
79
+ memo?.delete(memoKey(filePath));
80
+ },
81
+ withFreshAssetMemo() {
82
+ return buildRunContext(carriers, new Map());
83
+ },
84
+ };
85
+ }
86
+ /**
87
+ * Create the base `RunContext` for an improve run. Its `readAsset` is
88
+ * non-memoizing (always fresh); call {@link RunContext.withFreshAssetMemo} to
89
+ * enter a memoized pass/invocation scope.
90
+ */
91
+ export function createRunContext(init) {
92
+ const carriers = {
93
+ stashDir: init.stashDir,
94
+ config: init.config,
95
+ eventsCtx: init.eventsCtx,
96
+ proposalsCtx: init.proposalsCtx,
97
+ chat: init.chat ?? chatCompletion,
98
+ getLlmConfig: init.getLlmConfig,
99
+ sourceRun: init.sourceRun,
100
+ dryRun: init.dryRun,
101
+ signal: init.signal,
102
+ now: init.now ?? Date.now,
103
+ readFile: init.io?.readFile ?? ((filePath) => fs.readFileSync(filePath, "utf8")),
104
+ writeFile: init.io?.writeFile ?? ((filePath, content) => fs.writeFileSync(filePath, content, "utf8")),
105
+ };
106
+ return buildRunContext(carriers, null);
107
+ }
108
+ /**
109
+ * Resolve the run's stash directory at the improve builder boundary: the
110
+ * explicit `options.stashDir` when the caller passed one, else the ambient
111
+ * resolveStashDir() fallback. WI-9.10d: this is the SINGLE resolveStashDir
112
+ * call site on the improve path — the verb entries call THIS instead of
113
+ * resolveStashDir directly, so the ambient read lives only in the builder
114
+ * module. (The CLI-wide resolveStashDir sweep for non-improve commands is a
115
+ * deferred follow-on — see the chunk-9 ledger WI-9.10d entry.)
116
+ */
117
+ export function resolveRunStashDir(explicitStashDir) {
118
+ return explicitStashDir ?? resolveStashDir();
119
+ }
@@ -45,8 +45,10 @@
45
45
  *
46
46
  * @module salience
47
47
  */
48
- import { makeAssetRef } from "../../core/asset/asset-ref.js";
49
- import { getAllEntries, getUtilityScoresByIds } from "../../indexer/db/db.js";
48
+ import path from "node:path";
49
+ import { conceptIdFromTypeName } from "../../core/asset/resolve-ref.js";
50
+ import { getAllEntries } from "../../storage/repositories/index-entries-repository.js";
51
+ import { getUtilityScoresByIds } from "../../storage/repositories/index-utility-repository.js";
50
52
  import { WARM_START_CAP } from "./outcome-loop.js";
51
53
  // ── One day in ms ─────────────────────────────────────────────────────────────
52
54
  const DAY_MS = 86_400_000;
@@ -207,7 +209,7 @@ export function computeSalience(inputs) {
207
209
  // When `outcomeWeightEnabled` is true/absent (DEFAULT ON since the G2
208
210
  // saturation cap landed): use WS-2 weights (w_e=0.25, w_o=0.15, w_r=0.60)
209
211
  // so the prediction-error outcome signal actually shapes rankScore — this
210
- // is the R1 loop-closure from docs/design/improve-self-learning-analysis.md.
212
+ // is the R1 loop-closure.
211
213
  //
212
214
  // When `outcomeWeightEnabled` is explicitly false (operator opt-out via
213
215
  // `improve.salience.outcomeWeightEnabled: false`): fall back to the WS-1
@@ -233,132 +235,21 @@ export function computeSalience(inputs) {
233
235
  const rankScore = Math.min(1, Math.max(0, rawRankScore));
234
236
  return { encoding, outcome, retrieval, rankScore, encodingSource };
235
237
  }
238
+ // ── state.db persistence ─────────────────────────────────────────────────────
239
+ //
240
+ // The three sub-scores live in state.db::asset_salience. Raw SQL now lives in
241
+ // storage/repositories/salience-repository.ts (#672 part 2) — extracted
242
+ // verbatim, only relocated behind the repository boundary. Re-exported here so
243
+ // existing importers of this module resolve unchanged. Migrations live in
244
+ // state-db.ts (migration 009).
245
+ export { getAllRankScores, getAssetSalience, getConsecutiveNoOps, recordNoOp, resetConsecutiveNoOps, upsertAssetSalience, } from "../../storage/repositories/salience-repository.js";
236
246
  /**
237
247
  * Does this row carry a genuine content-derived `encoding_salience` (#644)?
238
248
  *
239
- * Returns true when the provenance flag is `"content"`. For legacy rows
240
- * (`encoding_source === null`, written before migration 015) we apply a
241
- * conservative heuristic: treat the stored value as content-derived only when it
242
- * does NOT equal the pure type-weight stub for the asset's type — because before
243
- * the #644 fix every run overwrote real scores with the stub, a value that still
244
- * differs from the stub must have been content-written and never re-clobbered.
245
- * When the type cannot be determined (no `type` given) a null-provenance row is
246
- * treated as a stub (the safe default).
247
- */
248
- export function isContentEncodingRow(row, type) {
249
- if (row.encoding_source === "content")
250
- return true;
251
- if (row.encoding_source === "type-stub")
252
- return false;
253
- // Legacy NULL provenance: differ-from-stub heuristic.
254
- if (!type)
255
- return false;
256
- const stub = DEFAULT_TYPE_ENCODING_WEIGHTS[type] ?? DEFAULT_ENCODING_SALIENCE;
257
- return Math.abs(row.encoding_salience - stub) > 1e-9;
258
- }
259
- /**
260
- * Upsert salience scores for one asset into state.db.
261
- *
262
- * Idempotent: safe to call every run; updates the outcome / retrieval / rank
263
- * columns on conflict.
264
- *
265
- * #644 — encoding provenance guard: the `encoding_salience` + `encoding_source`
266
- * columns are NOT lowered from a real content-derived score to a type-weight
267
- * stub. When the stored row is `encoding_source = 'content'` and the incoming
268
- * vector is a `type-stub` fallback, the stored encoding score and its provenance
269
- * are preserved (only the other sub-scores and `rank_score` advance). A `content`
270
- * write always wins; a `type-stub` write only seeds a row that has no content
271
- * score yet. This stops the improve loop's type-weight fallback re-asserting the
272
- * stub over a distill-written score on every run.
273
- *
274
- * NOTE: when the guard preserves the stored encoding score, the incoming
275
- * `vector.rankScore` (computed from the stub encoding) is still written. Callers
276
- * that want the rank_score to reflect the preserved content score should pass the
277
- * stored content score back in as `inputs.encodingSalience` to `computeSalience`
278
- * — which the improve loop does. The guard here is the defensive backstop.
249
+ * Unknown provenance is not treated as content-derived.
279
250
  */
280
- export function upsertAssetSalience(db, ref, vector, now) {
281
- const ts = now ?? Date.now();
282
- db.prepare(`INSERT INTO asset_salience
283
- (asset_ref, encoding_salience, outcome_salience, retrieval_salience, rank_score, consecutive_no_ops, updated_at, encoding_source)
284
- VALUES (?, ?, ?, ?, ?, 0, ?, ?)
285
- ON CONFLICT(asset_ref) DO UPDATE SET
286
- -- #644: never lower a real content-derived score to a type-weight stub.
287
- -- Keep the stored encoding score + provenance when the stored row is
288
- -- 'content' and the incoming write is a 'type-stub' fallback.
289
- encoding_salience = CASE
290
- WHEN asset_salience.encoding_source = 'content' AND excluded.encoding_source = 'type-stub'
291
- THEN asset_salience.encoding_salience
292
- ELSE excluded.encoding_salience
293
- END,
294
- encoding_source = CASE
295
- WHEN asset_salience.encoding_source = 'content' AND excluded.encoding_source = 'type-stub'
296
- THEN asset_salience.encoding_source
297
- ELSE excluded.encoding_source
298
- END,
299
- outcome_salience = excluded.outcome_salience,
300
- retrieval_salience = excluded.retrieval_salience,
301
- rank_score = excluded.rank_score,
302
- updated_at = excluded.updated_at`).run(ref, vector.encoding, vector.outcome, vector.retrieval, vector.rankScore, ts, vector.encodingSource ?? "type-stub");
303
- }
304
- /**
305
- * Load the salience row for one asset, or undefined if not yet computed.
306
- */
307
- export function getAssetSalience(db, ref) {
308
- const row = db
309
- .prepare(`SELECT asset_ref, encoding_salience, outcome_salience, retrieval_salience,
310
- rank_score, consecutive_no_ops, updated_at, encoding_source
311
- FROM asset_salience WHERE asset_ref = ?`)
312
- .get(ref);
313
- // Bun SQLite returns null (not undefined) when no row found.
314
- return row == null ? undefined : row;
315
- }
316
- /**
317
- * Load ALL rank scores from the asset_salience table (full-stash query).
318
- *
319
- * Used by the forgetting-safety report (plan §WS-1 step 7) to compute stash-wide
320
- * rank positions rather than pool-relative positions. Returns an empty Map when the
321
- * table is empty (first WS-1 run = no pre-existing rows).
322
- *
323
- * Order is unspecified; callers must sort before assigning 1-indexed positions.
324
- */
325
- export function getAllRankScores(db) {
326
- const rows = db.prepare("SELECT asset_ref, rank_score FROM asset_salience").all();
327
- const result = new Map();
328
- for (const row of rows) {
329
- result.set(row.asset_ref, row.rank_score);
330
- }
331
- return result;
332
- }
333
- // ── Plasticity helpers ────────────────────────────────────────────────────────
334
- /**
335
- * Increment `consecutive_no_ops` for an asset. Called after a no-op reflect/distill.
336
- * Has NO effect on `rank_score` — the plasticity counter only dampens consolidation
337
- * selection, not retrieval ranking. See plan §WS-1 step 8.
338
- *
339
- * Invariant: recordNoOp must never originate rank_score semantics. If the asset has
340
- * no salience row yet (persistence's best-effort try/catch may have swallowed an
341
- * error), we do nothing — a no-op counter is meaningless without a rank_score row,
342
- * and a synthetic INSERT would fabricate a rank_score=0 entry that could produce
343
- * false catastrophic-forgetting signals in buildRankChangeReport.
344
- */
345
- export function recordNoOp(db, ref) {
346
- db.prepare(`UPDATE asset_salience SET consecutive_no_ops = consecutive_no_ops + 1, updated_at = ? WHERE asset_ref = ?`).run(Date.now(), ref);
347
- // If changes === 0 the asset has no salience row yet — leave the table unchanged.
348
- }
349
- /**
350
- * Reset `consecutive_no_ops` to 0 when an asset produces an accepted change.
351
- * Call after a successful proposal acceptance or detected mutation.
352
- */
353
- export function resetConsecutiveNoOps(db, ref) {
354
- db.prepare(`UPDATE asset_salience SET consecutive_no_ops = 0, updated_at = ? WHERE asset_ref = ?`).run(Date.now(), ref);
355
- }
356
- /**
357
- * Return the `consecutive_no_ops` count for one asset. 0 when unknown.
358
- */
359
- export function getConsecutiveNoOps(db, ref) {
360
- const row = db.prepare(`SELECT consecutive_no_ops FROM asset_salience WHERE asset_ref = ?`).get(ref);
361
- return row?.consecutive_no_ops ?? 0;
251
+ export function isContentEncodingRow(row) {
252
+ return row.encoding_source === "content";
362
253
  }
363
254
  // ── Consolidation-selection dampener constants ────────────────────────────────
364
255
  //
@@ -424,15 +315,21 @@ export function buildRankChangeReport(oldRanks, newRanks, oldTopN = 200, forgett
424
315
  * @param indexDb - An open read-capable index database connection.
425
316
  * @param refs - The set of asset refs to look up.
426
317
  */
427
- export function getLastUseMsByRef(indexDb, refs) {
318
+ export function getLastUseMsByRef(indexDb, refs, stashDir) {
428
319
  const result = new Map();
429
320
  if (refs.length === 0)
430
321
  return result;
431
322
  const refSet = new Set(refs);
432
323
  const allEntries = getAllEntries(indexDb);
324
+ const selectedRoot = stashDir ? path.resolve(stashDir) : undefined;
433
325
  const idToRef = new Map();
434
326
  for (const indexed of allEntries) {
435
- const ref = makeAssetRef(indexed.entry.type, indexed.entry.name);
327
+ if (selectedRoot && path.resolve(indexed.stashDir) !== selectedRoot)
328
+ continue;
329
+ // In-memory correlation key, NOT a durable write: it must match the caller's
330
+ // `refs` (the `ImproveEligibleRef.ref`, now the SHORT conceptId — Chunk-8
331
+ // WI-8.5c flipped the candidate-ref spelling to match the display flip).
332
+ const ref = conceptIdFromTypeName(indexed.entry.type, indexed.entry.name);
436
333
  if (refSet.has(ref))
437
334
  idToRef.set(indexed.id, ref);
438
335
  }
@@ -23,8 +23,9 @@
23
23
  */
24
24
  import fs from "node:fs";
25
25
  import path from "node:path";
26
+ import { stashDirFor } from "../../core/asset/asset-placement.js";
26
27
  import { assembleAsset } from "../../core/asset/asset-serialize.js";
27
- import { TYPE_DIRS } from "../../core/asset/asset-spec.js";
28
+ import { conceptIdFromTypeName } from "../../core/asset/resolve-ref.js";
28
29
  import { normalizeHarnessId } from "../../integrations/harnesses/index.js";
29
30
  /**
30
31
  * JSON Schema for the session-summary LLM call. Strict so providers that
@@ -218,7 +219,7 @@ export function buildSessionAssetContent(data, summary) {
218
219
  }
219
220
  /** Resolve `<stash>/sessions/<harness>/<session-id>.md`. */
220
221
  export function resolveSessionAssetPath(stashDir, harness, sessionId) {
221
- const dir = TYPE_DIRS.session ?? "sessions";
222
+ const dir = stashDirFor("session") ?? "sessions";
222
223
  return path.join(stashDir, dir, normalizeHarnessId(harness), `${sessionId}.md`);
223
224
  }
224
225
  /**
@@ -242,7 +243,10 @@ export async function writeSessionAsset(data, stashDir, generate) {
242
243
  return {
243
244
  written: true,
244
245
  filePath,
245
- ref: `session:${normalizeHarnessId(harness)}/${sessionId}`,
246
+ // Canonical 0.9.0 conceptId (`sessions/<harness>/<id>`, D-R3) — the same
247
+ // spelling the xrefs / usage-event readers now expect. Historical
248
+ // `session:<harness>/<id>` rows persist un-migrated and are tolerated.
249
+ ref: conceptIdFromTypeName("session", `${normalizeHarnessId(harness)}/${sessionId}`),
246
250
  logPath: data.ref.filePath,
247
251
  };
248
252
  }
@@ -1,10 +1,20 @@
1
1
  // This Source Code Form is subject to the terms of the Mozilla Public
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
- import { getDefaultLlmConfig, getImproveProcessConfig } from "../../core/config/config.js";
5
- import { warn } from "../../core/warn.js";
6
- import { resolveImproveProcessRunnerFromProfile, runnerIsLlm } from "../../integrations/agent/runner.js";
7
- import { chatCompletion } from "../../llm/client.js";
4
+ /**
5
+ * Small pure helpers shared across the improve command family. Extracted to
6
+ * delete byte-identical duplication that previously lived inline in the
7
+ * per-process passes (the whole-corpus synthesis pass removed in 0.9.0 and
8
+ * the procedural-compilation pass removed in 0.9.0). Keep this file free of
9
+ * I/O and of any improve-specific state — these are leaf utilities.
10
+ */
11
+ /**
12
+ * Cap on how many prior rejected proposals for a ref are injected as
13
+ * Reflexion-style verbal-RL context so the LLM avoids regenerating refusals.
14
+ * Shared by both the revise (reflect) and learn (distill) verbs, which
15
+ * previously declared this constant independently.
16
+ */
17
+ export const MAX_REJECTED_PROPOSALS = 3;
8
18
  /** Normalize an unknown thrown value to a human-readable message string. */
9
19
  export function errMessage(e) {
10
20
  return e instanceof Error ? e.message : String(e);
@@ -19,33 +29,3 @@ export function refSlug(ref) {
19
29
  .toLowerCase()
20
30
  .slice(0, 60);
21
31
  }
22
- /**
23
- * Resolve the production LLM seam for an improve process (`recombine` /
24
- * `procedural`). Returns a function that issues one bounded chatCompletion per
25
- * call, or `undefined` when no LLM is configured (the pass then makes no
26
- * calls). Previously copied verbatim in recombine.ts and procedural.ts.
27
- *
28
- * When `opts.activeProfile` is supplied, its per-process runner override wins
29
- * over the `default` profile so `akm improve --profile <name>` selects the
30
- * profile's model; absent falls back to `default`.
31
- */
32
- export function resolveImproveLlmFn(config, opts) {
33
- const processConfig = getImproveProcessConfig(config, opts.processKey, opts.activeProfile);
34
- const runnerSpec = resolveImproveProcessRunnerFromProfile(processConfig, config);
35
- const llmConfig = runnerSpec && runnerIsLlm(runnerSpec) ? runnerSpec.connection : getDefaultLlmConfig(config);
36
- if (!llmConfig)
37
- return undefined;
38
- return async (prompt) => {
39
- const messages = [
40
- { role: "system", content: opts.systemPrompt },
41
- { role: "user", content: prompt },
42
- ];
43
- try {
44
- return await chatCompletion(llmConfig, messages, { signal: opts.signal, enableThinking: false });
45
- }
46
- catch (e) {
47
- warn(`${opts.tag} LLM call failed: ${String(e)}`);
48
- return null;
49
- }
50
- };
51
- }
@@ -0,0 +1,28 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ // ── Durable improve-state keys ───────────────────────────────────────────────
5
+ //
6
+ // Every improve ref uses the current grammar (a short conceptId), and the durable
7
+ // state key is the resolved index entry's `item_ref` when the planner supplied
8
+ // one, else the conceptId `ref` itself (`preparation.ts`
9
+ // `salienceWriteKey`/`outcomeWriteKey` = `itemRef ?? ref`).
10
+ /**
11
+ * The durable improve-state key for a ref with no resolved `item_ref` — the
12
+ * conceptId `ref` itself.
13
+ */
14
+ export function durableImproveRef(ref) {
15
+ return ref;
16
+ }
17
+ /** Return the conceptId portion of a durable improve-state key. */
18
+ export function bareImproveRef(ref) {
19
+ const boundary = ref.indexOf("//");
20
+ return boundary >= 0 ? ref.slice(boundary + 2) : ref;
21
+ }
22
+ /**
23
+ * The single durable improve-state key used by both readers and writers.
24
+ * Indexed entries use item_ref; direct or provenance-free refs use conceptId.
25
+ */
26
+ export function improveStateReadRefs(ref, itemRef) {
27
+ return [itemRef ?? ref];
28
+ }
@@ -14,7 +14,23 @@ const MARKER_RE = /\b(error|failed|fix(?:ed)?|root cause|turns out|because|decid
14
14
  const EDIT_COMMIT_RE = /\b(Edit|Write|MultiEdit|git commit|diff)\b/i;
15
15
  // A substantive turn is an assistant or tool turn whose text is non-trivial.
16
16
  const SUBSTANTIVE_MIN_CHARS = 40;
17
- export function scoreSessionTriage(data, minScore, options) {
17
+ /**
18
+ * Pure heuristic scorer. Operates only on `data.events`. Each sub-signal is
19
+ * normalized to a small bounded contribution; `score` is their sum and
20
+ * `pass = score >= minScore`.
21
+ *
22
+ * Sub-signals:
23
+ * - markers: presence of decision/outcome/error keywords across event text
24
+ * (capped, narrative-lesson signal).
25
+ * - toolDensity: bounded contribution from tool-use events.
26
+ * - editCommit: bounded contribution from edit/write/commit events.
27
+ * - substantiveRatio: scaled fraction of non-trivial assistant+tool turns,
28
+ * filtering pure short Q&A.
29
+ *
30
+ * toolDensity + editCommit alone can clear DEFAULT_TRIAGE_MIN_SCORE so
31
+ * high-action / no-narrative sessions are KEPT.
32
+ */
33
+ export function scoreSessionTriage(data, minScore) {
18
34
  const events = data.events;
19
35
  const total = events.length;
20
36
  // (a) markers — count word-bounded marker hits across all event text, capped.
@@ -57,18 +73,7 @@ export function scoreSessionTriage(data, minScore, options) {
57
73
  const subscores = { markers, toolDensity, editCommit, substantiveRatio };
58
74
  const score = markers + toolDensity + editCommit + substantiveRatio;
59
75
  // Base gate: score must clear the floor.
60
- let pass = score >= minScore;
61
- // #641 procedural-aware floor (opt-in, DEFAULT OFF).
62
- // When enabled, a session that clears the score gate must ALSO have at least
63
- // one narrative marker (markers >= 1) OR meaningful edit/commit signal
64
- // (editCommit >= 0.5). Pure read-only Q&A sessions that pass only via
65
- // toolDensity + substantiveRatio are rejected as low-signal.
66
- if (pass && options?.proceduralAwareFloor === true) {
67
- const hasProceduralSignal = markers >= 1 || editCommit >= 0.5;
68
- if (!hasProceduralSignal) {
69
- pass = false;
70
- }
71
- }
76
+ const pass = score >= minScore;
72
77
  return {
73
78
  pass,
74
79
  score,
@@ -78,7 +83,7 @@ export function scoreSessionTriage(data, minScore, options) {
78
83
  }
79
84
  /**
80
85
  * Resolve the effective triage config from the extract process config. Mirrors
81
- * the minContentChars / schemaSimilarity resolution style in akmExtract.
86
+ * the minContentChars resolution style in akmExtract.
82
87
  *
83
88
  * Default-off: `enabled` is FALSE unless `triage.enabled === true`. `minScore`
84
89
  * defaults to {@link DEFAULT_TRIAGE_MIN_SCORE}.
@@ -87,7 +92,5 @@ export function resolveTriageConfig(extractProcess) {
87
92
  const triage = extractProcess?.triage;
88
93
  const enabled = triage?.enabled === true;
89
94
  const minScore = typeof triage?.minScore === "number" ? triage.minScore : DEFAULT_TRIAGE_MIN_SCORE;
90
- // #641: default-off — only true when explicitly set to true.
91
- const proceduralAwareFloor = triage?.proceduralAwareFloor === true;
92
- return { enabled, minScore, proceduralAwareFloor };
95
+ return { enabled, minScore };
93
96
  }