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
@@ -1,141 +0,0 @@
1
- #!/usr/bin/env bun
2
- // @bun
3
-
4
- // scripts/migrations/v16-to-v17.ts
5
- import { Database } from "bun:sqlite";
6
- import fs from "fs";
7
- import path from "path";
8
- function parseArgs(argv) {
9
- const args = {};
10
- for (let i = 0;i < argv.length; i += 1) {
11
- const token = argv[i];
12
- if (token === "--backup") {
13
- args.backup = argv[++i];
14
- } else if (token === "--target") {
15
- args.target = argv[++i];
16
- } else if (token === "--help" || token === "-h") {
17
- printHelpAndExit(0);
18
- } else if (token?.startsWith("--")) {
19
- console.error(`unknown flag: ${token}`);
20
- printHelpAndExit(2);
21
- }
22
- }
23
- if (!args.backup || !args.target) {
24
- console.error("--backup and --target are both required");
25
- printHelpAndExit(2);
26
- }
27
- return args;
28
- }
29
- function printHelpAndExit(code) {
30
- console.error([
31
- "Usage: bun scripts/migrations/v16-to-v17.ts --backup <path> --target <path>",
32
- "",
33
- " --backup Path to a backup directory (or backup index.db) written by",
34
- " AKM before the v16\u2192v17 upgrade.",
35
- " --target Path to the current, live index.db. Rows are inserted in",
36
- " place; back this file up yourself if you want a safety net.",
37
- "",
38
- "Exit codes: 0 success, 2 usage error, 1 runtime failure."
39
- ].join(`
40
- `));
41
- process.exit(code);
42
- }
43
- function resolveDbPath(input, label) {
44
- if (!fs.existsSync(input)) {
45
- throw new Error(`${label} path does not exist: ${input}`);
46
- }
47
- const stat = fs.statSync(input);
48
- if (stat.isFile())
49
- return input;
50
- if (stat.isDirectory()) {
51
- const candidate = path.join(input, "index.db");
52
- if (!fs.existsSync(candidate)) {
53
- throw new Error(`${label} directory does not contain index.db: ${input}`);
54
- }
55
- return candidate;
56
- }
57
- throw new Error(`${label} path is neither a file nor a directory: ${input}`);
58
- }
59
- function reconcileUsageEvents(backup, target) {
60
- const summary = { rowsInspected: 0, rowsInserted: 0, rowsSkipped: 0 };
61
- const hasTable = backup.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='usage_events'").get();
62
- if (!hasTable) {
63
- console.error("[v16-to-v17] backup has no usage_events table; nothing to reconcile");
64
- return summary;
65
- }
66
- const targetCols = target.prepare("PRAGMA table_info(usage_events)").all().map((c) => c.name);
67
- const backupCols = backup.prepare("PRAGMA table_info(usage_events)").all().map((c) => c.name);
68
- const sharedCols = backupCols.filter((c) => targetCols.includes(c) && c !== "id");
69
- if (sharedCols.length === 0) {
70
- console.error("[v16-to-v17] backup and target usage_events share no columns; refusing to insert");
71
- return summary;
72
- }
73
- const selectAll = backup.prepare(`SELECT ${sharedCols.join(", ")} FROM usage_events`);
74
- const probe = target.prepare(`SELECT 1 FROM usage_events
75
- WHERE created_at = ?
76
- AND event_type = ?
77
- AND COALESCE(entry_ref, '') = COALESCE(?, '')
78
- AND COALESCE(query, '') = COALESCE(?, '')
79
- LIMIT 1`);
80
- const insert = target.prepare(`INSERT INTO usage_events (${sharedCols.join(", ")}) VALUES (${sharedCols.map(() => "?").join(", ")})`);
81
- const insertTx = target.transaction((rows2) => {
82
- for (const row of rows2) {
83
- summary.rowsInspected += 1;
84
- const created = row.created_at ?? null;
85
- const type = row.event_type ?? null;
86
- const ref = row.entry_ref ?? null;
87
- const query = row.query ?? null;
88
- if (!created || !type) {
89
- summary.rowsSkipped += 1;
90
- continue;
91
- }
92
- const exists = probe.get(created, type, ref, query);
93
- if (exists) {
94
- summary.rowsSkipped += 1;
95
- continue;
96
- }
97
- insert.run(...sharedCols.map((c) => row[c] ?? null));
98
- summary.rowsInserted += 1;
99
- }
100
- });
101
- const rows = selectAll.all();
102
- insertTx(rows);
103
- return summary;
104
- }
105
- function main() {
106
- const argv = process.argv.slice(2);
107
- const args = parseArgs(argv);
108
- const backupPath = resolveDbPath(args.backup, "--backup");
109
- const targetPath = resolveDbPath(args.target, "--target");
110
- if (path.resolve(backupPath) === path.resolve(targetPath)) {
111
- console.error("--backup and --target resolve to the same file; refusing to operate on a single DB");
112
- process.exit(2);
113
- }
114
- const start = Date.now();
115
- const backup = new Database(backupPath, { readonly: true });
116
- const target = new Database(targetPath);
117
- try {
118
- target.exec("PRAGMA foreign_keys = ON");
119
- target.exec("PRAGMA busy_timeout = 5000");
120
- const usageSummary = reconcileUsageEvents(backup, target);
121
- const out = {
122
- from: "v16",
123
- to: "v17",
124
- tablesReconciled: ["usage_events"],
125
- rowsInspected: usageSummary.rowsInspected,
126
- rowsInserted: usageSummary.rowsInserted,
127
- rowsSkipped: usageSummary.rowsSkipped,
128
- durationMs: Date.now() - start
129
- };
130
- console.log(JSON.stringify(out, null, 2));
131
- } finally {
132
- backup.close();
133
- target.close();
134
- }
135
- }
136
- try {
137
- main();
138
- } catch (err) {
139
- console.error(err instanceof Error ? err.message : String(err));
140
- process.exit(1);
141
- }
@@ -1,106 +0,0 @@
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
- import { getDefaultLlmConfig } from "../core/config/config.js";
5
- import { warn } from "../core/warn.js";
6
- import { v1ProfilePlatform } from "../integrations/harnesses/index.js";
7
- /** Read the currently-configured LLM connection from a loaded config. */
8
- export function getCurrentLlm(config) {
9
- return getDefaultLlmConfig(config);
10
- }
11
- /** Read a synthesised legacy-shape agent block from the new-shape AkmConfig. */
12
- export function getCurrentAgentBlock(config) {
13
- if (!config.profiles?.agent && !config.defaults?.agent)
14
- return undefined;
15
- const block = {};
16
- if (config.defaults?.agent)
17
- block.default = config.defaults.agent;
18
- if (config.profiles?.agent) {
19
- const profiles = {};
20
- for (const [name, raw] of Object.entries(config.profiles.agent)) {
21
- profiles[name] = {
22
- ...(raw.platform === "opencode-sdk" ? { sdkMode: true } : {}),
23
- ...(raw.model ? { model: raw.model } : {}),
24
- ...(raw.bin ? { bin: raw.bin } : {}),
25
- ...(raw.args ? { args: raw.args } : {}),
26
- };
27
- }
28
- block.profiles = profiles;
29
- }
30
- return block;
31
- }
32
- /** Apply an LLM connection patch onto the new-shape config. */
33
- export function applyLegacyLlm(config, llm) {
34
- if (!llm) {
35
- // Clear the default LLM profile.
36
- const name = config.defaults?.llm ?? "default";
37
- const remaining = { ...(config.profiles?.llm ?? {}) };
38
- delete remaining[name];
39
- return {
40
- profiles: { ...(config.profiles ?? {}), llm: remaining },
41
- defaults: { ...(config.defaults ?? {}), llm: undefined },
42
- };
43
- }
44
- const name = config.defaults?.llm ?? "default";
45
- return {
46
- profiles: {
47
- ...(config.profiles ?? {}),
48
- llm: { ...(config.profiles?.llm ?? {}), [name]: llm },
49
- },
50
- defaults: { ...(config.defaults ?? {}), llm: name },
51
- };
52
- }
53
- /** Apply a legacy-shape agent block onto the new-shape config. */
54
- export function applyLegacyAgent(config, agent) {
55
- if (!agent) {
56
- return {
57
- profiles: { ...(config.profiles ?? {}), agent: undefined },
58
- defaults: { ...(config.defaults ?? {}), agent: undefined },
59
- };
60
- }
61
- const v2Profiles = { ...(config.profiles?.agent ?? {}) };
62
- for (const [name, profile] of Object.entries(agent.profiles ?? {})) {
63
- // #566: resolve the platform via the harness registry instead of the old
64
- // `name.includes("claude") ? "claude" : "opencode"` heuristic, which
65
- // silently mapped Cursor/Copilot/any new harness to "opencode". An explicit
66
- // sdkMode flag still wins; otherwise we ask the registry. A name the
67
- // registry does not recognize is surfaced (warn) rather than silently
68
- // misclassified, then kept as a best-effort "opencode" profile so the user
69
- // does not lose a profile they explicitly configured.
70
- let platform;
71
- if (profile.sdkMode) {
72
- platform = "opencode-sdk";
73
- }
74
- else {
75
- const resolved = v1ProfilePlatform(name);
76
- if (resolved) {
77
- platform = resolved;
78
- }
79
- else {
80
- warn(`[akm setup] Agent profile "${name}" did not match any known harness; ` +
81
- `defaulting its platform to "opencode". Set its platform explicitly in config if this is wrong.`);
82
- platform = "opencode";
83
- }
84
- }
85
- v2Profiles[name] = {
86
- platform,
87
- ...(profile.bin ? { bin: profile.bin } : {}),
88
- ...(profile.args ? { args: profile.args } : {}),
89
- ...(profile.model ? { model: profile.model } : {}),
90
- };
91
- }
92
- return {
93
- profiles: { ...(config.profiles ?? {}), agent: v2Profiles },
94
- defaults: { ...(config.defaults ?? {}), agent: agent.default },
95
- };
96
- }
97
- /** Deep-ish clone of an LLM connection config (capabilities + extraParams). */
98
- export function cloneLlmConfig(llm) {
99
- if (!llm)
100
- return undefined;
101
- return {
102
- ...llm,
103
- ...(llm.capabilities ? { capabilities: { ...llm.capabilities } } : {}),
104
- ...(llm.extraParams ? { extraParams: { ...llm.extraParams } } : {}),
105
- };
106
- }
@@ -1,38 +0,0 @@
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
- * Bulk-fetch the judged-state cache for a set of entry keys in one query.
6
- * Returns a Map keyed by entry_key so the consolidate pool-selection loop can
7
- * do O(1) "has this memory been judged at this content hash?" lookups.
8
- * Empty input → empty map (no query issued).
9
- */
10
- export function getConsolidationJudgedMap(db, entryKeys) {
11
- const out = new Map();
12
- if (entryKeys.length === 0)
13
- return out;
14
- // SQLite has a ~999 param ceiling; chunk if a caller ever exceeds that.
15
- const CHUNK = 500;
16
- for (let i = 0; i < entryKeys.length; i += CHUNK) {
17
- const chunk = entryKeys.slice(i, i + CHUNK);
18
- const placeholders = chunk.map(() => "?").join(",");
19
- const rows = db
20
- .prepare(`SELECT * FROM consolidation_judged WHERE entry_key IN (${placeholders})`)
21
- .all(...chunk);
22
- for (const row of rows)
23
- out.set(row.entry_key, row);
24
- }
25
- return out;
26
- }
27
- /**
28
- * Record (or update) the judged state for one memory. INSERT-OR-REPLACE so the
29
- * row always reflects the most recent judge of that entry_key. Called once per
30
- * memory the consolidate LLM saw in a successfully-judged chunk.
31
- */
32
- export function upsertConsolidationJudged(db, input) {
33
- db.prepare(`
34
- INSERT OR REPLACE INTO consolidation_judged
35
- (entry_key, content_hash, judged_at, outcome)
36
- VALUES (?, ?, ?, ?)
37
- `).run(input.entryKey, input.contentHash, input.judgedAt, input.outcome);
38
- }
@@ -1,213 +0,0 @@
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
- * Record an induction of a recombine hypothesis and return the new consecutive
6
- * count. INSERT … ON CONFLICT increments the streak, but the `last_run` guard
7
- * makes a repeated call within the SAME run idempotent (no double-increment if
8
- * the same ref appears twice in one run). On insert the streak starts at 1.
9
- */
10
- export function recordRecombineInduction(db, input) {
11
- const row = db
12
- .prepare(`
13
- INSERT INTO recombine_hypotheses
14
- (hypothesis_ref, signature, member_key, consecutive_count, first_seen_at, last_seen_at, last_run)
15
- VALUES (?, ?, ?, 1, ?, ?, ?)
16
- ON CONFLICT(hypothesis_ref) DO UPDATE SET
17
- consecutive_count = consecutive_count + (CASE WHEN last_run IS excluded.last_run THEN 0 ELSE 1 END),
18
- last_seen_at = excluded.last_seen_at,
19
- last_run = excluded.last_run,
20
- signature = excluded.signature,
21
- member_key = excluded.member_key
22
- RETURNING consecutive_count
23
- `)
24
- .get(input.hypothesisRef, input.signature, input.memberKey, input.seenAt, input.seenAt, input.run);
25
- return row?.consecutive_count ?? 0;
26
- }
27
- /**
28
- * #633 — find an existing pending (non-promoted) hypothesis row whose cluster
29
- * is the SAME generalization as a newly-induced one, matched by SIGNATURE plus
30
- * a Jaccard membership-overlap test, rather than an exact member-set hash.
31
- *
32
- * In a growing stash any added/removed memory changes the exact member set, so
33
- * the ref hash (and member_key) shift every run → a fresh row at count=1 → the
34
- * streak never reaches `confirmThreshold` and nothing ever promotes. Matching
35
- * on overlap lets a drifting-but-stable cluster keep accumulating under one row.
36
- *
37
- * Returns the matched row with the HIGHEST overlap (ties broken by most-recent
38
- * `last_seen_at`), or `undefined` when none clears `minOverlap`. Already-promoted
39
- * rows are ignored so a confirmed lesson is not reopened by a later induction.
40
- *
41
- * @param memberKey the candidate cluster's membership fingerprint
42
- * (sorted member entryKeys joined by `|`).
43
- * @param minOverlap Jaccard threshold in [0,1]; a candidate matches when
44
- * |A∩B| / |A∪B| >= minOverlap.
45
- */
46
- export function findMatchingRecombineHypothesis(db, input) {
47
- const candidateMembers = new Set(input.memberKey.split("|").filter((m) => m.length > 0));
48
- if (candidateMembers.size === 0)
49
- return undefined;
50
- const rows = db
51
- .prepare("SELECT * FROM recombine_hypotheses WHERE signature = ? AND promoted_at IS NULL ORDER BY last_seen_at DESC")
52
- .all(input.signature);
53
- let best;
54
- let bestOverlap = -1;
55
- for (const row of rows) {
56
- const rowMembers = row.member_key.split("|").filter((m) => m.length > 0);
57
- if (rowMembers.length === 0)
58
- continue;
59
- let intersection = 0;
60
- for (const m of rowMembers) {
61
- if (candidateMembers.has(m))
62
- intersection += 1;
63
- }
64
- const union = candidateMembers.size + rowMembers.length - intersection;
65
- const overlap = union === 0 ? 0 : intersection / union;
66
- // rows are ordered last_seen_at DESC, so a strict `>` keeps the most-recent
67
- // row on ties.
68
- if (overlap >= input.minOverlap && overlap > bestOverlap) {
69
- best = row;
70
- bestOverlap = overlap;
71
- }
72
- }
73
- return best;
74
- }
75
- /**
76
- * Fetch a single recombine hypothesis row, or `undefined` when the ref has
77
- * never been induced. Normalizes bun:sqlite null → undefined like
78
- * {@link getExtractedSession}.
79
- */
80
- export function getRecombineHypothesis(db, hypothesisRef) {
81
- const row = db
82
- .prepare("SELECT * FROM recombine_hypotheses WHERE hypothesis_ref = ?")
83
- .get(hypothesisRef);
84
- return row ?? undefined;
85
- }
86
- /**
87
- * Mark a hypothesis promoted: stamp `promoted_at` and reset the consecutive
88
- * count to 0, so it must re-accumulate a full confirmation streak before it can
89
- * promote again. The `promoted_at` non-null state is the double-promotion guard.
90
- */
91
- export function markRecombineHypothesisPromoted(db, hypothesisRef, promotedAt) {
92
- db.prepare("UPDATE recombine_hypotheses SET promoted_at = ?, consecutive_count = 0 WHERE hypothesis_ref = ?").run(promotedAt, hypothesisRef);
93
- }
94
- /**
95
- * #658 — does any current-run cluster match this hypothesis row under the SAME
96
- * signature + Jaccard-overlap rule used for re-induction? A match means the
97
- * cluster genuinely re-formed this run (it was merely cap-displaced out of the
98
- * processed top-`maxClustersPerRun` slice), so its streak must NOT be reset.
99
- */
100
- function hypothesisMatchesAnyPresentCluster(row, presentClusters, minOverlap) {
101
- const rowMembers = row.member_key.split("|").filter((m) => m.length > 0);
102
- if (rowMembers.length === 0)
103
- return false;
104
- const rowSet = new Set(rowMembers);
105
- for (const cluster of presentClusters) {
106
- if (cluster.signature !== row.signature)
107
- continue;
108
- const clusterMembers = cluster.memberKey.split("|").filter((m) => m.length > 0);
109
- if (clusterMembers.length === 0)
110
- continue;
111
- let intersection = 0;
112
- for (const m of clusterMembers) {
113
- if (rowSet.has(m))
114
- intersection += 1;
115
- }
116
- const union = rowSet.size + clusterMembers.length - intersection;
117
- const overlap = union === 0 ? 0 : intersection / union;
118
- if (overlap >= minOverlap)
119
- return true;
120
- }
121
- return false;
122
- }
123
- /**
124
- * Decay-to-zero every NON-promoted hypothesis NOT re-induced in the current run.
125
- *
126
- * A generalization that stops being supported by the corpus has lost its
127
- * confirmation streak, so we hard-reset `consecutive_count` to 0 (the
128
- * alternative — `count - 1` floored at 0 — tolerates a single noisy run but
129
- * blurs the "consecutive" semantics; hard-reset is the conservative choice).
130
- *
131
- * Only rows whose `hypothesis_ref` is NOT in `seenRefs` AND whose `last_run` is
132
- * NOT the current run are decayed. Already-promoted rows are left alone.
133
- *
134
- * #658 — CAP-AWARE decay. The recombine pass only re-inducts (and thus marks
135
- * `seen`) the top-`maxClustersPerRun` clusters, but a cluster genuinely
136
- * re-forms every run even when it is displaced below that cap. Resetting such a
137
- * row treats a SCHEDULING miss as a SUBSTANCE miss and traps the hypothesis
138
- * below `confirmThreshold` forever. When `opts.presentClusters` is supplied, a
139
- * row is SPARED from decay if it Jaccard-matches any present cluster (same
140
- * signature, overlap >= `opts.minOverlap`) — i.e. its cluster re-formed this run
141
- * but was cap-displaced. This does NOT advance the streak (only re-induction in
142
- * the processed slice does that, via {@link recordRecombineInduction}), so the
143
- * recurrence bar for promotion is unchanged; it only stops the cap from
144
- * manufacturing artificial misses. Omitting `presentClusters` preserves the
145
- * pre-#658 hard-reset-after-one-miss behaviour exactly.
146
- *
147
- * Returns the number of rows reset.
148
- */
149
- export function decayUnseenRecombineHypotheses(db, currentRun, seenRefs, opts) {
150
- // #658 — when cap-aware sparing is requested, fold the cap-displaced rows into
151
- // the "seen" exclusion set: the underlying reset SQL already protects every
152
- // ref it is given, so sparing == treating a spared row exactly like a seen
153
- // row for this sweep (its count is left untouched, never advanced).
154
- let effectiveSeen = seenRefs;
155
- if (opts && opts.presentClusters.length > 0) {
156
- const candidates = db
157
- .prepare("SELECT hypothesis_ref, signature, member_key FROM recombine_hypotheses WHERE promoted_at IS NULL AND (last_run IS NULL OR last_run != ?) AND consecutive_count != 0")
158
- .all(currentRun);
159
- const seenSet = new Set(seenRefs);
160
- for (const row of candidates) {
161
- if (seenSet.has(row.hypothesis_ref))
162
- continue;
163
- if (hypothesisMatchesAnyPresentCluster(row, opts.presentClusters, opts.minOverlap)) {
164
- seenSet.add(row.hypothesis_ref);
165
- }
166
- }
167
- effectiveSeen = [...seenSet];
168
- }
169
- return decayUnseenRecombineHypothesesInner(db, currentRun, effectiveSeen);
170
- }
171
- /**
172
- * The raw reset sweep shared by the cap-aware wrapper above. Resets every
173
- * non-promoted row from a prior run whose ref is NOT in `seenRefs`. Kept private
174
- * so the param-ceiling chunking logic lives in one place.
175
- */
176
- function decayUnseenRecombineHypothesesInner(db, currentRun, seenRefs) {
177
- // Reset every eligible row, then exclude the seen refs in chunks to respect
178
- // the ~999 SQLite param ceiling. With no seen refs we reset all non-promoted
179
- // rows from prior runs in a single statement.
180
- if (seenRefs.length === 0) {
181
- const res = db
182
- .prepare("UPDATE recombine_hypotheses SET consecutive_count = 0 WHERE promoted_at IS NULL AND (last_run IS NULL OR last_run != ?) AND consecutive_count != 0")
183
- .run(currentRun);
184
- return Number(res.changes);
185
- }
186
- // A single NOT IN keeps the exclusion atomic (a chunked NOT IN would let a ref
187
- // excluded by one chunk still be reset by another chunk's statement). The
188
- // recombine pass caps RE-INDUCED clusters at `maxClustersPerRun` (a handful) —
189
- // but with #658 cap-aware sparing the caller folds every cap-displaced
190
- // (present-but-unprocessed) hypothesis into `effectiveSeen` too, so on a large
191
- // stash `seenRefs` here can carry MANY spared refs, not just the handful that
192
- // were processed. We cap defensively at ~900 (under SQLite's ~999 param
193
- // ceiling): if `effectiveSeen` somehow exceeds it we fall back to resetting all
194
- // eligible rows — which re-introduces the cap-displacement trap for THAT run
195
- // (spared rows get decayed because the NOT IN protection is dropped). That is a
196
- // rare, bounded degradation; a stash with >900 simultaneously-spared
197
- // hypotheses is far beyond current scale.
198
- if (seenRefs.length > 900) {
199
- const res = db
200
- .prepare("UPDATE recombine_hypotheses SET consecutive_count = 0 WHERE promoted_at IS NULL AND (last_run IS NULL OR last_run != ?) AND consecutive_count != 0")
201
- .run(currentRun);
202
- return Number(res.changes);
203
- }
204
- const placeholders = seenRefs.map(() => "?").join(",");
205
- const res = db
206
- .prepare(`UPDATE recombine_hypotheses SET consecutive_count = 0
207
- WHERE promoted_at IS NULL
208
- AND (last_run IS NULL OR last_run != ?)
209
- AND consecutive_count != 0
210
- AND hypothesis_ref NOT IN (${placeholders})`)
211
- .run(currentRun, ...seenRefs);
212
- return Number(res.changes);
213
- }
@@ -1,15 +0,0 @@
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
- import indexTemplate from "../assets/wiki/index-template.md" with { type: "text" };
5
- import logTemplate from "../assets/wiki/log-template.md" with { type: "text" };
6
- import schemaTemplate from "../assets/wiki/schema-template.md" with { type: "text" };
7
- export function buildSchemaMd(wikiName) {
8
- return schemaTemplate.replaceAll("{{WIKI_NAME}}", wikiName);
9
- }
10
- export function buildIndexMd(wikiName) {
11
- return indexTemplate.replaceAll("{{WIKI_NAME}}", wikiName);
12
- }
13
- export function buildLogMd(wikiName) {
14
- return logTemplate.replaceAll("{{WIKI_NAME}}", wikiName);
15
- }