akm-cli 0.9.16 → 0.9.17-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (403) hide show
  1. package/CHANGELOG.md +2101 -0
  2. package/STABILITY.md +11 -10
  3. package/dist/akm +124 -193
  4. package/dist/akm-migrate +38 -19
  5. package/dist/assets/hints/cli-hints-full.md +6 -7
  6. package/dist/assets/improve-strategies/catchup.json +0 -3
  7. package/dist/assets/improve-strategies/consolidate.json +0 -1
  8. package/dist/assets/improve-strategies/default.json +1 -2
  9. package/dist/assets/improve-strategies/proactive-maintenance.json +1 -2
  10. package/dist/assets/improve-strategies/quick.json +1 -2
  11. package/dist/assets/improve-strategies/reflect-distill.json +1 -2
  12. package/dist/assets/improve-strategies/thorough.json +0 -3
  13. package/dist/assets/prompts/consolidate-pair.md +20 -0
  14. package/dist/assets/prompts/consolidate-system.md +4 -11
  15. package/dist/assets/prompts/retrieval-relevance-judge.md +6 -0
  16. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +20 -20
  17. package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -2
  18. package/dist/assets/templates/html/health.html +3 -5
  19. package/dist/cli/retired-commands.js +1 -1
  20. package/dist/cli/shared.js +6 -2
  21. package/dist/cli/unknown-flags.js +24 -1
  22. package/dist/cli.js +68 -10
  23. package/dist/commands/agent/agent-dispatch.js +1 -1
  24. package/dist/commands/command/command-execution.js +24 -62
  25. package/dist/commands/feedback-cli.js +0 -1
  26. package/dist/commands/health/accept-rate.js +6 -0
  27. package/dist/commands/health/archive-usage.js +92 -0
  28. package/dist/commands/health/checks.js +83 -74
  29. package/dist/commands/health/config-skew.js +38 -0
  30. package/dist/commands/health/data-dir-usage.js +25 -13
  31. package/dist/commands/health/egress.js +54 -0
  32. package/dist/commands/health/html-report.js +1 -42
  33. package/dist/commands/health/improve-metrics.js +136 -591
  34. package/dist/commands/health/md-report.js +1 -6
  35. package/dist/commands/health/plugin-staleness.js +53 -3
  36. package/dist/commands/health/renderers.js +12 -4
  37. package/dist/commands/health/report-view-model.js +14 -120
  38. package/dist/commands/health/types-improve.js +4 -19
  39. package/dist/commands/health/windows.js +64 -74
  40. package/dist/commands/health.js +145 -143
  41. package/dist/commands/improve/consolidate/chunking.js +26 -117
  42. package/dist/commands/improve/consolidate/continuity-check.js +137 -0
  43. package/dist/commands/improve/consolidate/pair-pass.js +791 -0
  44. package/dist/commands/improve/consolidate/sanitize.js +54 -149
  45. package/dist/commands/improve/consolidate.js +589 -1127
  46. package/dist/commands/improve/content-hash.js +16 -24
  47. package/dist/commands/improve/distill/content-repair.js +18 -100
  48. package/dist/commands/improve/distill-guards.js +20 -81
  49. package/dist/commands/improve/distill-promotion-policy.js +23 -243
  50. package/dist/commands/improve/distill.js +608 -1041
  51. package/dist/commands/improve/eligibility.js +126 -390
  52. package/dist/commands/improve/execution.js +8 -10
  53. package/dist/commands/improve/extract-prompt.js +1 -2
  54. package/dist/commands/improve/extract.js +487 -1046
  55. package/dist/commands/improve/feedback-valence.js +0 -25
  56. package/dist/commands/improve/improve-cli.js +75 -169
  57. package/dist/commands/improve/improve-result-file.js +10 -66
  58. package/dist/commands/improve/improve-strategies.js +52 -4
  59. package/dist/commands/improve/improve-usage-report.js +18 -64
  60. package/dist/commands/improve/improve.js +480 -1074
  61. package/dist/commands/improve/ledger.js +119 -0
  62. package/dist/commands/improve/locks.js +2 -8
  63. package/dist/commands/improve/loop-stages.js +415 -1073
  64. package/dist/commands/improve/memory/derived-ref.js +12 -77
  65. package/dist/commands/improve/memory/memory-belief.js +16 -118
  66. package/dist/commands/improve/memory/memory-improve.js +266 -14
  67. package/dist/commands/improve/outcome-loop.js +28 -156
  68. package/dist/commands/improve/planner.js +5 -15
  69. package/dist/commands/improve/preparation.js +779 -2319
  70. package/dist/commands/improve/proactive-maintenance.js +34 -101
  71. package/dist/commands/improve/reflect-noise.js +104 -280
  72. package/dist/commands/improve/reflect.js +642 -1353
  73. package/dist/commands/improve/retrieval-gate.js +127 -0
  74. package/dist/commands/improve/retrieval-scope.js +92 -0
  75. package/dist/commands/improve/salience.js +41 -240
  76. package/dist/commands/improve/session-asset.js +19 -100
  77. package/dist/commands/improve/stage.js +322 -0
  78. package/dist/commands/lint/base-linter.js +37 -15
  79. package/dist/commands/proposal/drain.js +261 -578
  80. package/dist/commands/proposal/proposal-cli.js +19 -20
  81. package/dist/commands/proposal/proposal-types.js +31 -24
  82. package/dist/commands/proposal/proposal.js +38 -8
  83. package/dist/commands/proposal/propose.js +134 -160
  84. package/dist/commands/proposal/repository.js +1097 -1394
  85. package/dist/commands/proposal/validators/proposal-quality-validators.js +71 -174
  86. package/dist/commands/proposal/validators/proposal-validators.js +1 -1
  87. package/dist/commands/proposal/validators/proposals.js +22 -89
  88. package/dist/commands/read/curate.js +105 -462
  89. package/dist/commands/read/knowledge.js +3 -2
  90. package/dist/commands/read/search-cli.js +16 -33
  91. package/dist/commands/read/search.js +17 -23
  92. package/dist/commands/read/show.js +57 -108
  93. package/dist/commands/sources/bundle-cli.js +25 -2
  94. package/dist/commands/sources/bundle-config-ops.js +4 -0
  95. package/dist/commands/sources/dangerous-env-audit.js +1 -2
  96. package/dist/commands/sources/info.js +127 -29
  97. package/dist/commands/sources/installed-stashes.js +197 -746
  98. package/dist/commands/sources/schema-repair.js +98 -129
  99. package/dist/commands/sources/source-add.js +62 -12
  100. package/dist/commands/sources/source-manage.js +9 -2
  101. package/dist/commands/sources/stash-cli.js +24 -4
  102. package/dist/commands/tasks/explain.js +10 -13
  103. package/dist/commands/tasks/tasks-cli.js +12 -13
  104. package/dist/commands/tasks/tasks.js +350 -936
  105. package/dist/commands/tasks/validate.js +26 -24
  106. package/dist/commands/workflow/plan.js +22 -29
  107. package/dist/commands/workflow-cli.js +4 -4
  108. package/dist/core/adapter/adapters/akm-adapter.js +2 -1
  109. package/dist/core/adapter/adapters/akm-lint.js +2 -3
  110. package/dist/core/adapter/adapters/akm-metadata.js +42 -12
  111. package/dist/core/adapter/adapters/akm-task-adapter.js +29 -8
  112. package/dist/core/adapter/adapters/akm-workflow-adapter.js +1 -1
  113. package/dist/core/adapter/execution-source.js +17 -29
  114. package/dist/core/asset/asset-placement.js +4 -13
  115. package/dist/core/asset/frontmatter.js +106 -1
  116. package/dist/core/asset/resolve-ref.js +1 -1
  117. package/dist/core/bundle-id.js +42 -5
  118. package/dist/core/bundle-rename.js +285 -0
  119. package/dist/core/config/config-io.js +1 -2
  120. package/dist/core/config/config-schema.js +9 -34
  121. package/dist/core/config/config-walker.js +1 -1
  122. package/dist/core/config/config.js +184 -111
  123. package/dist/core/config/engine-semantics.js +0 -2
  124. package/dist/core/config/legacy-source-shape-shim.js +38 -9
  125. package/dist/core/config/schema/embedding.js +20 -5
  126. package/dist/core/config/schema/engines.js +5 -0
  127. package/dist/core/config/schema/execution.js +1 -1
  128. package/dist/core/config/schema/experimental.js +1 -1
  129. package/dist/core/config/schema/improve-processes.js +54 -125
  130. package/dist/core/config/schema/improve.js +4 -42
  131. package/dist/core/config/schema/index-config.js +9 -48
  132. package/dist/core/config/schema/scheduler.js +12 -12
  133. package/dist/core/config/schema/search.js +6 -22
  134. package/dist/core/env-secret-ref.js +0 -1
  135. package/dist/core/errors.js +8 -9
  136. package/dist/core/file-change.js +13 -5
  137. package/dist/core/file-lock.js +76 -173
  138. package/dist/core/improve-result.js +35 -7
  139. package/dist/core/improve-types.js +0 -1
  140. package/dist/core/logs-db.js +2 -2
  141. package/dist/core/loopback.js +7 -12
  142. package/dist/core/non-task-input.js +20 -0
  143. package/dist/core/parse.js +13 -16
  144. package/dist/core/paths.js +0 -24
  145. package/dist/core/redaction.js +109 -2
  146. package/dist/core/run-lock.js +2 -5
  147. package/dist/core/spawn-env.js +1 -1
  148. package/dist/core/state/migrations.js +123 -61
  149. package/dist/core/state-db-scope.js +2 -4
  150. package/dist/core/state-db.js +126 -692
  151. package/dist/core/time.js +0 -20
  152. package/dist/core/type-presentation.js +1 -9
  153. package/dist/core/write-source.js +294 -1005
  154. package/dist/execution/input-contract.js +1 -1
  155. package/dist/execution/resolved-request.js +135 -689
  156. package/dist/execution/source.js +63 -257
  157. package/dist/execution/target-ref.js +1 -1
  158. package/dist/indexer/bundle-identity-guard.js +2 -2
  159. package/dist/indexer/db/llm-cache.js +2 -2
  160. package/dist/indexer/ensure-index.js +77 -73
  161. package/dist/indexer/index-rebuild-lock.js +3 -11
  162. package/dist/indexer/index-writer-lock.js +8 -17
  163. package/dist/indexer/index-written-assets.js +141 -154
  164. package/dist/indexer/indexer.js +400 -1124
  165. package/dist/indexer/links/declared-links.js +90 -0
  166. package/dist/indexer/materialize-embeddings.js +60 -397
  167. package/dist/indexer/passes/memory-inference.js +96 -90
  168. package/dist/indexer/passes/metadata.js +132 -219
  169. package/dist/indexer/read-preflight.js +0 -7
  170. package/dist/indexer/scan/doc-to-entry.js +2 -3
  171. package/dist/indexer/scan/drain-dir.js +1 -1
  172. package/dist/indexer/search/db-search.js +190 -590
  173. package/dist/indexer/search/fts-query.js +30 -41
  174. package/dist/indexer/search/ranking.js +28 -154
  175. package/dist/indexer/search/search-attribution.js +12 -32
  176. package/dist/indexer/search/search-fields.js +11 -15
  177. package/dist/indexer/search/search-hit-enrichers.js +54 -85
  178. package/dist/indexer/search/search-source.js +1 -4
  179. package/dist/indexer/usage/usage-events.js +36 -7
  180. package/dist/indexer/walk/walker.js +3 -4
  181. package/dist/integrations/agent/engine-fallback.js +23 -40
  182. package/dist/integrations/agent/engine-resolution.js +93 -183
  183. package/dist/integrations/agent/execution.js +507 -0
  184. package/dist/integrations/agent/model-map.js +28 -156
  185. package/dist/integrations/agent/request-lowering.js +66 -141
  186. package/dist/integrations/agent/runner-dispatch.js +143 -321
  187. package/dist/integrations/agent/runner.js +54 -14
  188. package/dist/integrations/lockfile.js +53 -101
  189. package/dist/llm/client.js +18 -6
  190. package/dist/llm/embedders/deterministic.js +2 -3
  191. package/dist/llm/embedders/profile.js +71 -0
  192. package/dist/llm/embedders/remote.js +11 -17
  193. package/dist/llm/feature-gate.js +0 -8
  194. package/dist/llm/index-passes.js +3 -5
  195. package/dist/llm/memory-infer.js +1 -2
  196. package/dist/llm/structured-call.js +5 -24
  197. package/dist/output/generic-render.js +23 -11
  198. package/dist/output/html-render.js +13 -10
  199. package/dist/output/render-registry.js +3 -32
  200. package/dist/output/shapes/helpers.js +25 -38
  201. package/dist/output/shapes/passthrough.js +1 -9
  202. package/dist/{indexer/graph/graph-types.js → output/text/bundle-rename.js} +4 -1
  203. package/dist/output/text/command-format.js +69 -31
  204. package/dist/output/text/helpers.js +1 -1
  205. package/dist/output/text/migrate.js +5 -14
  206. package/dist/output/text/proposal-format.js +48 -3
  207. package/dist/output/text/show-format.js +13 -17
  208. package/dist/output/text/workflow-format.js +0 -32
  209. package/dist/output/text.js +2 -0
  210. package/dist/registry/factory.js +4 -19
  211. package/dist/registry/network.js +66 -220
  212. package/dist/registry/providers/index.js +0 -2
  213. package/dist/registry/providers/skills-sh.js +3 -14
  214. package/dist/registry/providers/static-index.js +24 -26
  215. package/dist/registry/resolve.js +55 -131
  216. package/dist/scripts/akm-migrate-node.js +42948 -92369
  217. package/dist/scripts/akm-migrate.js +42935 -92354
  218. package/dist/setup/registry-stash-loader.js +4 -13
  219. package/dist/setup/semantic-assets.js +3 -44
  220. package/dist/setup/setup.js +1 -1
  221. package/dist/setup/steps/connection.js +5 -6
  222. package/dist/setup/steps/platforms.js +2 -2
  223. package/dist/setup/steps/tasks.js +25 -15
  224. package/dist/sources/provider-factory.js +17 -18
  225. package/dist/sources/providers/filesystem.js +2 -3
  226. package/dist/sources/providers/git-install.js +7 -1
  227. package/dist/sources/providers/git-provider.js +0 -3
  228. package/dist/sources/providers/git-stash.js +83 -21
  229. package/dist/sources/providers/npm.js +2 -4
  230. package/dist/sources/providers/provider-utils.js +5 -10
  231. package/dist/sources/providers/website.js +0 -2
  232. package/dist/sources/snapshot-fetchers/website-ingest.js +1 -1
  233. package/dist/sources/website-url.js +2 -2
  234. package/dist/storage/database.js +9 -35
  235. package/dist/storage/repositories/improve-ledger-repository.js +209 -0
  236. package/dist/storage/repositories/index-connection.js +39 -72
  237. package/dist/storage/repositories/index-entries-repository.js +131 -129
  238. package/dist/storage/repositories/index-entry-mapper.js +1 -2
  239. package/dist/storage/repositories/index-entry-schema.js +101 -268
  240. package/dist/storage/repositories/index-fts-repository.js +86 -256
  241. package/dist/storage/repositories/index-links-repository.js +143 -0
  242. package/dist/storage/repositories/index-llm-cache-repository.js +7 -9
  243. package/dist/storage/repositories/index-meta-repository.js +6 -4
  244. package/dist/storage/repositories/index-schema.js +257 -325
  245. package/dist/storage/repositories/index-utility-repository.js +8 -29
  246. package/dist/storage/repositories/index-vec-repository.js +133 -414
  247. package/dist/storage/repositories/outcome-repository.js +2 -1
  248. package/dist/storage/repositories/proposals-repository.js +104 -1
  249. package/dist/storage/repositories/registry-index-cache-repository.js +100 -0
  250. package/dist/storage/repositories/salience-repository.js +1 -19
  251. package/dist/storage/repositories/task-history-repository.js +26 -4
  252. package/dist/storage/repositories/workflow-runs-repository.js +53 -244
  253. package/dist/storage/sqlite-migrations.js +136 -0
  254. package/dist/storage/sqlite-pragmas.js +11 -9
  255. package/dist/storage/sqlite-transaction.js +170 -0
  256. package/dist/storage/state-db-integrity.js +130 -0
  257. package/dist/tasks/activation-config.js +134 -62
  258. package/dist/tasks/backends/cron.js +191 -302
  259. package/dist/tasks/backends/exec-utils.js +2 -5
  260. package/dist/tasks/backends/launchd.js +141 -748
  261. package/dist/tasks/backends/schtasks.js +119 -623
  262. package/dist/tasks/prepare/prepare-support.js +5 -15
  263. package/dist/tasks/prepare/prepare.js +0 -2
  264. package/dist/tasks/resolve-akm-bin.js +20 -79
  265. package/dist/tasks/run/attempt-lifecycle.js +0 -1
  266. package/dist/tasks/run/load-task.js +1 -1
  267. package/dist/tasks/scheduler-binding.js +20 -238
  268. package/dist/tasks/scheduler-invocation.js +136 -244
  269. package/dist/tasks/scheduler-lock.js +53 -0
  270. package/dist/tasks/scheduler-sync.js +368 -679
  271. package/dist/tasks/source/parse-task-source.js +55 -9
  272. package/dist/tasks/source/task-source-v3-frozen.js +3 -4
  273. package/dist/tasks/source/task-to-v4.js +464 -88
  274. package/dist/workflows/authoring/authoring.js +3 -12
  275. package/dist/workflows/compile.js +211 -0
  276. package/dist/workflows/concurrency-policy.js +13 -74
  277. package/dist/workflows/exec/child-invocation.js +3 -17
  278. package/dist/workflows/exec/child-workflow.js +32 -141
  279. package/dist/workflows/exec/dispatch-redaction.js +13 -53
  280. package/dist/workflows/exec/environment.js +98 -0
  281. package/dist/workflows/exec/exec-unit.js +33 -140
  282. package/dist/workflows/exec/frozen-judge.js +7 -59
  283. package/dist/workflows/exec/native-executor.js +82 -341
  284. package/dist/workflows/exec/param-secrets.js +29 -47
  285. package/dist/workflows/exec/run-workflow.js +154 -387
  286. package/dist/workflows/exec/scheduler.js +9 -36
  287. package/dist/workflows/exec/step-work.js +127 -430
  288. package/dist/workflows/exec/unit-dispatch.js +11 -63
  289. package/dist/workflows/exec/unit-writer.js +8 -52
  290. package/dist/workflows/exec/worktree.js +39 -273
  291. package/dist/workflows/freeze/child-output-references.js +4 -15
  292. package/dist/workflows/freeze/environment.js +99 -92
  293. package/dist/workflows/freeze/freeze.js +172 -0
  294. package/dist/workflows/freeze/step-values.js +19 -21
  295. package/dist/workflows/freeze/targets/child-workflow.js +23 -92
  296. package/dist/workflows/freeze/targets/command.js +10 -33
  297. package/dist/workflows/freeze/targets/script.js +5 -12
  298. package/dist/workflows/freeze/targets/shell.js +3 -6
  299. package/dist/workflows/freeze/targets/task.js +25 -80
  300. package/dist/workflows/freeze/task-bindings.js +20 -67
  301. package/dist/workflows/{source-ir/github-yaml.js → github-yaml.js} +88 -206
  302. package/dist/workflows/ir/params.js +6 -51
  303. package/dist/workflows/ir/plan-hash.js +2 -34
  304. package/dist/workflows/parser.js +140 -43
  305. package/dist/{commands/improve/consolidate/types.js → workflows/plan.js} +2 -1
  306. package/dist/workflows/renderer.js +36 -69
  307. package/dist/workflows/resource-limits.js +12 -120
  308. package/dist/workflows/runtime/agent-identity.js +8 -40
  309. package/dist/workflows/runtime/run-outputs.js +3 -6
  310. package/dist/workflows/runtime/run-plan.js +316 -0
  311. package/dist/workflows/runtime/runs.js +48 -200
  312. package/dist/workflows/runtime/workflow-asset-loader.js +24 -57
  313. package/dist/workflows/{source-ir/semantics.js → source-semantics.js} +16 -20
  314. package/dist/workflows/validate-summary.js +2 -7
  315. package/docs/integration/bundling-akm.md +49 -42
  316. package/docs/migration/README.md +1 -0
  317. package/docs/migration/release-notes/0.9.17.md +43 -0
  318. package/docs/migration/v0.9.1-to-v0.9.2.md +23 -7
  319. package/docs/reference/cli.md +232 -135
  320. package/docs/reference/configuration.md +71 -57
  321. package/docs/reference/data-and-telemetry.md +20 -21
  322. package/docs/reference/tasks.md +105 -39
  323. package/docs/reference/workflow-schema.md +14 -18
  324. package/docs/reference/workflows.md +6 -9
  325. package/package.json +1 -1
  326. package/schemas/akm-config.json +115 -738
  327. package/schemas/akm-workflow.json +1 -0
  328. package/dist/assets/improve-strategies/graph-refresh.json +0 -15
  329. package/dist/assets/prompts/contradiction-judge.md +0 -33
  330. package/dist/assets/prompts/graph-extract-system.md +0 -1
  331. package/dist/assets/prompts/graph-extract-user-prompt.md +0 -35
  332. package/dist/assets/prompts/metadata-enhance-system.md +0 -1
  333. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +0 -4
  334. package/dist/commands/health/advisories.js +0 -150
  335. package/dist/commands/health/metrics.js +0 -329
  336. package/dist/commands/health/surfaces.js +0 -102
  337. package/dist/commands/improve/anti-collapse.js +0 -83
  338. package/dist/commands/improve/collapse-detector.js +0 -432
  339. package/dist/commands/improve/consolidate/eligibility.js +0 -48
  340. package/dist/commands/improve/consolidate/merge.js +0 -149
  341. package/dist/commands/improve/distill/promote-memory.js +0 -291
  342. package/dist/commands/improve/distill/quality-gate.js +0 -337
  343. package/dist/commands/improve/eval-cases.js +0 -52
  344. package/dist/commands/improve/memory/memory-contradiction-detect.js +0 -291
  345. package/dist/commands/improve/proposal-envelope.js +0 -31
  346. package/dist/commands/improve/run-context.js +0 -123
  347. package/dist/commands/improve/shared.js +0 -31
  348. package/dist/commands/improve/source-identity.js +0 -28
  349. package/dist/commands/improve/triage.js +0 -96
  350. package/dist/commands/proposal/drain-policies.js +0 -151
  351. package/dist/commands/sources/update-transaction.js +0 -220
  352. package/dist/core/action-contributors.js +0 -28
  353. package/dist/core/config/config-version-shim.js +0 -101
  354. package/dist/core/fs-txn.js +0 -405
  355. package/dist/core/lexical-score.js +0 -25
  356. package/dist/core/maintenance-barrier.js +0 -167
  357. package/dist/execution/executable-identity.js +0 -105
  358. package/dist/execution/guarded-source.js +0 -427
  359. package/dist/indexer/db/graph-db.js +0 -444
  360. package/dist/indexer/graph/graph-boost.js +0 -427
  361. package/dist/indexer/graph/graph-dedup.js +0 -95
  362. package/dist/indexer/graph/graph-extraction.js +0 -1108
  363. package/dist/indexer/search/name-match.js +0 -35
  364. package/dist/indexer/search/ranking-contributors.js +0 -515
  365. package/dist/indexer/search/ranking-types.js +0 -4
  366. package/dist/indexer/walk/project-context.js +0 -192
  367. package/dist/integrations/agent/execution-cascade.js +0 -566
  368. package/dist/integrations/agent/execution-definitions.js +0 -202
  369. package/dist/integrations/agent/execution-lowering.js +0 -841
  370. package/dist/integrations/agent/execution-preparation.js +0 -98
  371. package/dist/integrations/agent/inline-execution.js +0 -74
  372. package/dist/llm/graph-extract.js +0 -728
  373. package/dist/llm/metadata-enhance.js +0 -96
  374. package/dist/registry/create-provider-registry.js +0 -29
  375. package/dist/registry/pinned-request-helper.js +0 -247
  376. package/dist/registry/pinned-transport.js +0 -717
  377. package/dist/sources/providers/index.js +0 -14
  378. package/dist/storage/engines/sqlite-migrations.js +0 -271
  379. package/dist/storage/repositories/canaries-repository.js +0 -107
  380. package/dist/storage/repositories/embedding-salvage-repository.js +0 -184
  381. package/dist/storage/repositories/registry-cache.js +0 -113
  382. package/dist/tasks/scheduler-sync-preview.js +0 -52
  383. package/dist/tasks/source/task-to-v3.js +0 -507
  384. package/dist/workflows/freeze/resolve-steps.js +0 -86
  385. package/dist/workflows/freeze/source-freeze.js +0 -64
  386. package/dist/workflows/ir/compile.js +0 -321
  387. package/dist/workflows/ir/environment-v4.js +0 -330
  388. package/dist/workflows/ir/freeze-v4.js +0 -153
  389. package/dist/workflows/ir/schema-v4.js +0 -745
  390. package/dist/workflows/ir/schema.js +0 -354
  391. package/dist/workflows/program/schema.js +0 -77
  392. package/dist/workflows/runtime/checkin.js +0 -57
  393. package/dist/workflows/runtime/plan-classifier.js +0 -196
  394. package/dist/workflows/runtime/unit-checkin.js +0 -45
  395. package/dist/workflows/runtime/unit-phases.js +0 -20
  396. package/dist/workflows/schema.js +0 -4
  397. package/dist/workflows/source-ir/compile.js +0 -200
  398. package/dist/workflows/source-ir/program.js +0 -50
  399. package/dist/workflows/source-ir/result.js +0 -26
  400. package/dist/workflows/source-ir/schema.js +0 -786
  401. package/dist/workflows/source-ir/triggers.js +0 -79
  402. package/dist/workflows/source-ir/uses.js +0 -40
  403. package/dist/workflows/validator.js +0 -60
@@ -1,149 +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
- export function isValidOp(op) {
5
- if (typeof op !== "object" || op === null)
6
- return false;
7
- const o = op;
8
- if (o.op === "merge") {
9
- return typeof o.primary === "string" && Array.isArray(o.secondaries);
10
- }
11
- if (o.op === "delete") {
12
- return typeof o.ref === "string";
13
- }
14
- if (o.op === "promote") {
15
- return typeof o.ref === "string" && typeof o.knowledgeRef === "string";
16
- }
17
- if (o.op === "contradict") {
18
- return typeof o.ref === "string" && typeof o.contradictedByRef === "string";
19
- }
20
- return false;
21
- }
22
- export function mergePlans(chunks, knownRefs) {
23
- const mergeOps = new Map();
24
- const deleteOps = new Map();
25
- const promoteOps = new Map();
26
- // C-3 / #382: contradict ops keyed by `ref|contradictedByRef` to deduplicate.
27
- const contradictOps = new Map();
28
- const warnings = [];
29
- for (const chunk of chunks) {
30
- for (const op of chunk) {
31
- if (op.op === "merge") {
32
- // Drop ops whose primary the LLM hallucinated (not in the loaded memory
33
- // pool). Without this guard, a hallucinated primary flows all the way to
34
- // Phase B where !memoryByRef.has(primary) fires and charges every real
35
- // secondary with merge_primary_missing — masking LLM hallucinations as
36
- // filter regressions in health metrics.
37
- if (knownRefs && !knownRefs.has(op.primary)) {
38
- warnings.push(`mergePlans: primary ${op.primary} not in loaded memory pool (LLM hallucination) — dropping op before execution.`);
39
- // Use a dedicated skip reason so dashboards can distinguish
40
- // hallucinated primaries from stale-DB regressions.
41
- // Secondaries are real refs; they are NOT charged here — they remain
42
- // available for other ops to claim.
43
- continue;
44
- }
45
- // Filter hallucinated secondaries while preserving real ones.
46
- let mergeOp = op;
47
- if (knownRefs) {
48
- const filteredSecondaries = op.secondaries.filter((sec) => {
49
- if (!knownRefs.has(sec)) {
50
- warnings.push(`mergePlans: secondary ${sec} not in loaded memory pool (LLM hallucination) — dropping from op.`);
51
- return false;
52
- }
53
- return true;
54
- });
55
- if (filteredSecondaries.length !== op.secondaries.length) {
56
- mergeOp = { ...op, secondaries: filteredSecondaries };
57
- }
58
- }
59
- if (mergeOp.secondaries.length > 1) {
60
- warnings.push(`Merge: ${mergeOp.primary} proposed multiple secondaries; retaining one secondary for review.`);
61
- mergeOp = { ...mergeOp, secondaries: mergeOp.secondaries.slice(0, 1) };
62
- }
63
- // merge wins over delete
64
- if (deleteOps.has(mergeOp.primary)) {
65
- deleteOps.delete(mergeOp.primary);
66
- }
67
- for (const sec of mergeOp.secondaries) {
68
- if (deleteOps.has(sec))
69
- deleteOps.delete(sec);
70
- }
71
- mergeOps.set(mergeOp.primary, mergeOp);
72
- }
73
- else if (op.op === "delete") {
74
- // merge and promote both win over delete. A promote is non-destructive
75
- // (creates a proposal) but the source memory is counted in `promoted`;
76
- // if a delete also fires, the ref lands in both `promoted` and
77
- // `skipReasons`, breaking the invariant by +1.
78
- if (!mergeOps.has(op.ref) && !promoteOps.has(op.ref)) {
79
- deleteOps.set(op.ref, op);
80
- }
81
- }
82
- else if (op.op === "promote") {
83
- // C-2 / #381: when both a promote and a merge target the same ref,
84
- // queue the promote FIRST rather than discarding it. The promote op
85
- // routes through createProposal (the human-gated proposal queue), so
86
- // it is non-destructive. The merge follows after the proposal is
87
- // created. This preserves the human reviewer's ability to inspect the
88
- // promotion before the source memory is merged/deleted.
89
- // AGM K*8 — retain the maximally informative consistent subset.
90
- promoteOps.set(op.ref, op);
91
- }
92
- else if (op.op === "contradict") {
93
- // Deduplicate by ref+contradictedByRef pair.
94
- const key = `${op.ref}|${op.contradictedByRef}`;
95
- if (!contradictOps.has(key)) {
96
- contradictOps.set(key, op);
97
- }
98
- }
99
- }
100
- }
101
- // Second pass: enforce merge-wins-over-delete and deduplicate secondaries.
102
- //
103
- // 1. Delete/secondary ordering bug: the per-chunk loop removes delete ops
104
- // for secondaries that were already in deleteOps, but misses the case
105
- // where the delete chunk came first. A full sweep here fixes both orders.
106
- //
107
- // 2. Cross-merge secondary dedup: if ref A is a secondary in two merge ops,
108
- // only the first (insertion-order) retains it. Without this, a successful
109
- // merge credits A to mergedSecondaries and a later merge's emitMerge-
110
- // FailureSkips also charges A to skipReasons — double-counting A while
111
- // processed has it only once.
112
- //
113
- // 3. Primary-as-secondary dedup: if ref A is a primary in one merge op and
114
- // a secondary in another, remove A from the secondary list. Both merges
115
- // would otherwise claim A (merged++ for A, then mergedSecondaries++ for A)
116
- // breaking the invariant the same way.
117
- // Also remove delete ops for any ref claimed by a promote op (handles the
118
- // case where the delete chunk appeared before the promote chunk).
119
- for (const ref of promoteOps.keys()) {
120
- deleteOps.delete(ref);
121
- }
122
- const claimedSecondaries = new Set();
123
- for (const mergeOp of mergeOps.values()) {
124
- deleteOps.delete(mergeOp.primary);
125
- mergeOp.secondaries = mergeOp.secondaries.filter((sec) => {
126
- if (mergeOps.has(sec)) {
127
- warnings.push(`Merge: secondary ${sec} is also a merge primary — removing from secondary list to avoid double-count.`);
128
- return false;
129
- }
130
- if (claimedSecondaries.has(sec)) {
131
- warnings.push(`Merge: secondary ${sec} appears in multiple merge ops — retaining in first op only.`);
132
- return false;
133
- }
134
- claimedSecondaries.add(sec);
135
- deleteOps.delete(sec);
136
- return true;
137
- });
138
- }
139
- // C-2 / #381: promote ops are ordered BEFORE merge ops so that the
140
- // human-gated proposal queue entry is created before any destructive merge.
141
- // Phase B processes ops in array order, so promote executes first.
142
- const ops = [
143
- ...promoteOps.values(),
144
- ...mergeOps.values(),
145
- ...deleteOps.values(),
146
- ...contradictOps.values(),
147
- ];
148
- return { ops, warnings };
149
- }
@@ -1,291 +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
- * Memory→knowledge promotion branch for `akm distill`.
6
- *
7
- * This is an entire second command that used to be inlined inside `akmDistill`:
8
- * when a `memory:*` ref is reinforced enough (per the deterministic stability
9
- * heuristic in `distill-promotion-policy`), distill graduates it into a
10
- * `knowledge:*` proposal instead of a lesson. The branch owns its own LLM
11
- * contradiction-merge (mem0 ADD/UPDATE/NOOP), quality gate, proposal creation,
12
- * and `distill_invoked` event emit.
13
- *
14
- * {@link promoteMemoryToKnowledge} returns the finished {@link AkmDistillResult}
15
- * when the branch fired, or `null` when the ref is not a promotion candidate —
16
- * in which case the caller falls through to the ordinary lesson/knowledge LLM
17
- * path. Logic is byte-identical to the pre-extraction inline code.
18
- */
19
- import fs from "node:fs";
20
- import { parseFrontmatter } from "../../../core/asset/frontmatter.js";
21
- import { ConfigError } from "../../../core/errors.js";
22
- import { appendEvent } from "../../../core/events.js";
23
- import { parseEmbeddedJsonResponse } from "../../../core/parse.js";
24
- import { callStructured } from "../../../llm/structured-call.js";
25
- import { isProposalSkipped } from "../../proposal/repository.js";
26
- import { assessMemoryKnowledgePromotionCandidate } from "../distill-promotion-policy.js";
27
- import { emitProposal } from "../proposal-envelope.js";
28
- import { durableImproveRef } from "../source-identity.js";
29
- import { persistOutputEncodingSalience, runLessonQualityJudge, writeQualityRejection } from "./quality-gate.js";
30
- /** Read-only classification of the deterministic promotion path and destination conflict. */
31
- export async function planMemoryKnowledgePromotion(ctx) {
32
- const durableInputRef = ctx.durableInputRef ?? ctx.inputRef;
33
- const promotion = ctx.targetKind === "lesson"
34
- ? null
35
- : assessMemoryKnowledgePromotionCandidate({
36
- inputRef: durableInputRef,
37
- assetContent: ctx.assetContent,
38
- feedbackEvents: ctx.filteredEvents.map((event) => ({
39
- ...(event.metadata !== undefined ? { metadata: event.metadata } : {}),
40
- })),
41
- });
42
- if (!(promotion?.promote && promotion.content && (ctx.targetKind === "knowledge" || ctx.targetKind === "auto"))) {
43
- return null;
44
- }
45
- const existingKnowledgePath = await ctx.lookup(durableImproveRef(promotion.knowledgeRef));
46
- let existingKnowledgeContent = null;
47
- if (existingKnowledgePath && fs.existsSync(existingKnowledgePath)) {
48
- try {
49
- existingKnowledgeContent = fs.readFileSync(existingKnowledgePath, "utf8");
50
- }
51
- catch {
52
- existingKnowledgeContent = null;
53
- }
54
- }
55
- return { promotion: promotion, existingKnowledgeContent };
56
- }
57
- /** Whether a classified promotion will actually call merge generation and/or the judge. */
58
- export function memoryKnowledgePromotionRequiresDispatch(ctx, plan) {
59
- const hasRunner = Boolean(ctx.llmRunner);
60
- return ((Boolean(plan.existingKnowledgeContent) && hasRunner) ||
61
- (ctx.strategy?.processes?.distill?.qualityGate?.enabled ?? true));
62
- }
63
- /**
64
- * Resolve the knowledge content to propose when a memory promotes to knowledge,
65
- * reconciling it with any existing knowledge file at the destination (D-1 / #369).
66
- *
67
- * When the destination already exists and an LLM is configured, follows the
68
- * mem0 ADD/UPDATE/NOOP pattern (arXiv:2504.19413 §3.2): ADD/UPDATE swap in the
69
- * merged content, NOOP short-circuits with a terminal "skipped" result. Without
70
- * an LLM the existing content is appended as reviewer-reference context so the
71
- * merge can be done by hand. Logic is byte-identical to the prior inline block.
72
- */
73
- async function resolveKnowledgePromotionContent(ctx, plan) {
74
- const durableInputRef = ctx.durableInputRef ?? ctx.inputRef;
75
- const baseContent = plan.promotion.content;
76
- const knowledgeRef = plan.promotion.knowledgeRef;
77
- let resolvedPromotionContent = baseContent;
78
- const existingKnowledgeContent = plan.existingKnowledgeContent;
79
- const runner = ctx.llmRunner;
80
- if (existingKnowledgeContent && runner) {
81
- // Existing content found: call LLM for contradiction-resolution merge.
82
- const mergePrompt = [
83
- "You are merging two versions of a knowledge document.",
84
- "Existing content is already committed; new content comes from a memory distillation run.",
85
- "Choose one of: ADD (combine both), UPDATE (replace existing with new), NOOP (keep existing unchanged).",
86
- 'Return ONLY valid JSON: {"action": "ADD"|"UPDATE"|"NOOP", "content": "<merged markdown if ADD/UPDATE, empty string if NOOP>"}',
87
- "",
88
- "## Existing knowledge content",
89
- "```",
90
- existingKnowledgeContent.slice(0, 3000),
91
- "```",
92
- "",
93
- "## New content from distillation",
94
- "```",
95
- baseContent.slice(0, 3000),
96
- "```",
97
- ].join("\n");
98
- try {
99
- const mergeResponse = await callStructured({
100
- feature: "distill",
101
- runner,
102
- ...(ctx.lease ? { lease: ctx.lease } : {}),
103
- messages: [
104
- { role: "system", content: "Return only valid JSON. No prose." },
105
- { role: "user", content: mergePrompt },
106
- ],
107
- request: {
108
- ...(ctx.signal ? { signal: ctx.signal } : {}),
109
- ...(ctx.chat ? { chat: ctx.chat } : {}),
110
- },
111
- parse: (raw) => raw ?? "",
112
- onError: () => "",
113
- fallback: "",
114
- ...(ctx.onNotices ? { onNotices: ctx.onNotices } : {}),
115
- });
116
- const mergeResult = parseEmbeddedJsonResponse(mergeResponse);
117
- if (mergeResult?.action === "NOOP") {
118
- // Existing content is authoritative — no update needed.
119
- appendEvent({
120
- eventType: "distill_invoked",
121
- // Use item_ref when resolved, otherwise the input conceptId.
122
- ref: ctx.itemRef ?? durableInputRef,
123
- metadata: {
124
- outcome: "skipped",
125
- proposalRef: knowledgeRef,
126
- message: "D-1: LLM resolved destination conflict as NOOP — existing content kept",
127
- ...ctx.eligMeta,
128
- },
129
- }, ctx.eventsCtx);
130
- return {
131
- earlyResult: {
132
- schemaVersion: 1,
133
- ok: true,
134
- outcome: "skipped",
135
- inputRef: ctx.inputRef,
136
- proposalRef: knowledgeRef,
137
- skipReason: "conflict_noop",
138
- message: "Existing knowledge content unchanged (contradiction resolution: NOOP)",
139
- },
140
- };
141
- }
142
- if (mergeResult?.action && (mergeResult.action === "ADD" || mergeResult.action === "UPDATE")) {
143
- if (mergeResult.content?.trim()) {
144
- resolvedPromotionContent = mergeResult.content;
145
- }
146
- }
147
- }
148
- catch (error) {
149
- if (error instanceof ConfigError)
150
- throw error;
151
- // LLM merge failed — fall through with the original promotion content.
152
- // The reviewer will see both versions in the proposal diff.
153
- }
154
- }
155
- else if (existingKnowledgeContent) {
156
- // No LLM configured: include existing content as context in the proposal
157
- // so the reviewer can do the contradiction resolution manually.
158
- resolvedPromotionContent = [
159
- baseContent,
160
- "",
161
- "---",
162
- "<!-- D-1 / #369: Existing knowledge content is shown below for reviewer reference. -->",
163
- "<!-- Review: decide whether to ADD (merge), UPDATE (replace), or NOOP (keep existing). -->",
164
- "",
165
- "## Existing content (for reviewer reference)",
166
- "",
167
- existingKnowledgeContent,
168
- ].join("\n");
169
- }
170
- return { resolvedContent: resolvedPromotionContent };
171
- }
172
- /**
173
- * Run the memory→knowledge promotion branch. Returns the finished distill
174
- * result when promotion fired (all paths terminal), or `null` when the ref is
175
- * not a promotion candidate and the caller should continue to the ordinary
176
- * lesson/knowledge distillation path.
177
- */
178
- export async function promoteMemoryToKnowledge(ctx, planned) {
179
- const { inputRef, assetContent, config, chat, stash, fetchSimilarLessonsFn, existingRefVocabulary, outcomeWeightEnabled, eligMeta, exclusionSetSize, filteredFeedbackCount, feedbackFullyFiltered, } = ctx;
180
- const durableInputRef = ctx.durableInputRef ?? inputRef;
181
- const promotionPlan = planned === undefined ? await planMemoryKnowledgePromotion(ctx) : planned;
182
- if (!promotionPlan)
183
- return null;
184
- const promotion = promotionPlan.promotion;
185
- // D-1 / #369: When the destination knowledge file already exists, route
186
- // through the LLM for contradiction resolution instead of silently
187
- // overwriting. Follows mem0 ADD/UPDATE/DELETE/NOOP pattern (arXiv:2504.19413 §3.2)
188
- // and A-MEM dynamic linking (arXiv:2502.12110).
189
- const merged = await resolveKnowledgePromotionContent(ctx, promotionPlan);
190
- if ("earlyResult" in merged)
191
- return merged.earlyResult;
192
- const resolvedPromotionContent = merged.resolvedContent;
193
- // Apply quality gate to fast-path knowledge promotion (Risk 4 fix).
194
- // D-5 / #388: Three-band system — review_needed band queues to proposal
195
- // queue with review_needed outcome rather than auto-rejecting.
196
- let knowledgeJudgeConfidence;
197
- if (ctx.strategy?.processes?.distill?.qualityGate?.enabled ?? true) {
198
- // D-4 / #390: retrieve top-3 similar lessons for dedup check in judge.
199
- const similarLessons = await fetchSimilarLessonsFn(resolvedPromotionContent.slice(0, 500), 3);
200
- const judgeResult = await runLessonQualityJudge(config, resolvedPromotionContent, assetContent ?? "", chat, {
201
- ...(similarLessons.length > 0 ? { similarLessons } : {}),
202
- ...(ctx.llmRunner ? { llmRunner: ctx.llmRunner } : {}),
203
- ...(ctx.lease ? { lease: ctx.lease } : {}),
204
- ...(ctx.signal ? { signal: ctx.signal } : {}),
205
- ...(ctx.onNotices ? { onNotices: ctx.onNotices } : {}),
206
- });
207
- if (!judgeResult.pass) {
208
- if (judgeResult.reviewNeeded) {
209
- // Uncertainty band (2.5–3.5): queue as review_needed instead of rejecting.
210
- return writeQualityRejection(stash, inputRef, promotion.knowledgeRef, resolvedPromotionContent, judgeResult.score, judgeResult.reason, { reviewNeeded: true }, ctx.eligibilitySource, ctx.eventsCtx);
211
- }
212
- return writeQualityRejection(stash, inputRef, promotion.knowledgeRef, resolvedPromotionContent, judgeResult.score, judgeResult.reason, {}, ctx.eligibilitySource, ctx.eventsCtx);
213
- }
214
- // Normalize 1-5 judge score to [0, 1]. Only a real passing verdict reaches
215
- // here (07 P0-2: the judge now fails CLOSED on no-LLM / timeout / parse
216
- // failure, so those return pass:false and early-return above). The score>0
217
- // guard defensively leaves confidence undefined for any non-positive score.
218
- if (judgeResult.score > 0)
219
- knowledgeJudgeConfidence = judgeResult.score / 5;
220
- }
221
- const knowledgeParsed = parseFrontmatter(resolvedPromotionContent);
222
- const proposalResult = emitProposal({ stashDir: stash, proposalsCtx: ctx.proposalsCtx }, {
223
- ref: promotion.knowledgeRef,
224
- source: "distill",
225
- // §23.6 fingerprint model-id term (WI-6.4).
226
- ...(ctx.llmRunner?.connection.model ? { modelId: ctx.llmRunner.connection.model } : {}),
227
- ...(ctx.sourceRun !== undefined ? { sourceRun: ctx.sourceRun } : {}),
228
- payload: {
229
- content: resolvedPromotionContent,
230
- ...(Object.keys(knowledgeParsed.data).length > 0 ? { frontmatter: knowledgeParsed.data } : {}),
231
- },
232
- ...(knowledgeJudgeConfidence !== undefined ? { confidence: knowledgeJudgeConfidence } : {}),
233
- // Attribution tagging: persist the eligibility lane on the proposal.
234
- ...(ctx.eligibilitySource ? { eligibilitySource: ctx.eligibilitySource } : {}),
235
- });
236
- if (isProposalSkipped(proposalResult)) {
237
- appendEvent({
238
- eventType: "distill_invoked",
239
- // Use item_ref when resolved, otherwise the input conceptId.
240
- ref: ctx.itemRef ?? durableInputRef,
241
- metadata: {
242
- outcome: "skipped",
243
- proposalRef: promotion.knowledgeRef,
244
- message: proposalResult.message,
245
- skipReason: proposalResult.reason,
246
- ...eligMeta,
247
- },
248
- }, ctx.eventsCtx);
249
- return {
250
- schemaVersion: 1,
251
- ok: true,
252
- outcome: "skipped",
253
- inputRef,
254
- proposalRef: promotion.knowledgeRef,
255
- skipReason: proposalResult.reason,
256
- message: proposalResult.message,
257
- };
258
- }
259
- const proposal = proposalResult;
260
- // G4: content-score the distilled OUTPUT so it carries a real encoding
261
- // salience (encoding_source='content') from creation.
262
- persistOutputEncodingSalience(durableImproveRef(promotion.knowledgeRef), resolvedPromotionContent, existingRefVocabulary, outcomeWeightEnabled);
263
- appendEvent({
264
- eventType: "distill_invoked",
265
- // Use item_ref when resolved, otherwise the input conceptId.
266
- ref: ctx.itemRef ?? durableInputRef,
267
- metadata: {
268
- outcome: "queued",
269
- proposalRef: promotion.knowledgeRef,
270
- proposalKind: "knowledge",
271
- proposalId: proposal.id,
272
- // R3: judge verdicts are longitudinally queryable, not just a one-shot
273
- // proposal.confidence write (normalized 1–5 score / 5).
274
- ...(knowledgeJudgeConfidence !== undefined ? { judgeConfidence: knowledgeJudgeConfidence } : {}),
275
- ...(ctx.sourceRun !== undefined ? { sourceRun: ctx.sourceRun } : {}),
276
- ...(exclusionSetSize > 0 ? { filteredFeedbackCount } : {}),
277
- ...eligMeta,
278
- },
279
- }, ctx.eventsCtx);
280
- return {
281
- schemaVersion: 1,
282
- ok: true,
283
- outcome: "queued",
284
- inputRef,
285
- proposalRef: promotion.knowledgeRef,
286
- proposalKind: "knowledge",
287
- proposalId: proposal.id,
288
- proposal,
289
- ...(exclusionSetSize > 0 ? { filteredFeedbackCount, feedbackFullyFiltered } : {}),
290
- };
291
- }