akm-cli 0.9.0-beta.9 → 0.9.0-rc.1

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 (381) hide show
  1. package/CHANGELOG.md +715 -0
  2. package/README.md +12 -4
  3. package/dist/akm +38 -0
  4. package/dist/akm-migrate-storage +38 -0
  5. package/dist/assets/help/help-improve.md +9 -6
  6. package/dist/assets/hints/cli-hints-full.md +6 -5
  7. package/dist/assets/profiles/default.json +9 -4
  8. package/dist/assets/profiles/frequent.json +1 -1
  9. package/dist/assets/profiles/memory-focus.json +1 -1
  10. package/dist/assets/profiles/proactive-maintenance.json +25 -0
  11. package/dist/assets/profiles/quick.json +1 -1
  12. package/dist/assets/profiles/recombine-only.json +21 -0
  13. package/dist/assets/profiles/reflect-distill.json +30 -0
  14. package/dist/assets/profiles/synthesize.json +15 -0
  15. package/dist/assets/profiles/thorough.json +1 -1
  16. package/dist/assets/prompts/consolidate-system.md +23 -0
  17. package/dist/assets/prompts/contradiction-judge.md +33 -0
  18. package/dist/assets/prompts/distill-knowledge-system.md +22 -0
  19. package/dist/assets/prompts/distill-lesson-system.md +36 -0
  20. package/dist/assets/prompts/extract-session.md +11 -3
  21. package/dist/assets/prompts/graph-extract-system.md +1 -0
  22. package/dist/assets/prompts/graph-extract-user-prompt.md +1 -1
  23. package/dist/assets/prompts/memory-infer-system.md +1 -0
  24. package/dist/assets/prompts/memory-infer-user.md +5 -0
  25. package/dist/assets/prompts/metadata-enhance-system.md +1 -0
  26. package/dist/assets/prompts/procedural-system.md +44 -0
  27. package/dist/assets/prompts/recombine-system.md +40 -0
  28. package/dist/assets/prompts/staleness-detect-system.md +6 -0
  29. package/dist/assets/prompts/validate-summary-judge.md +1 -0
  30. package/dist/assets/prompts/workflow-unit-preamble.md +26 -0
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +38 -0
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +38 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +39 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +40 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +43 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +38 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +43 -0
  38. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +40 -0
  39. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +43 -0
  40. package/dist/assets/templates/html/health.html +281 -111
  41. package/dist/assets/wiki/ingest-workflow-template.md +45 -16
  42. package/dist/assets/wiki/schema-template.md +4 -4
  43. package/dist/cli/clack.js +56 -0
  44. package/dist/cli/config-migrate.js +7 -1
  45. package/dist/cli/confirm.js +1 -1
  46. package/dist/cli/parse-args.js +46 -1
  47. package/dist/cli/shared.js +28 -0
  48. package/dist/cli.js +25 -21
  49. package/dist/commands/agent/agent-dispatch.js +3 -2
  50. package/dist/commands/agent/agent-support.js +0 -7
  51. package/dist/commands/agent/contribute-cli.js +26 -7
  52. package/dist/commands/config-cli.js +26 -13
  53. package/dist/commands/env/child-env.js +47 -0
  54. package/dist/commands/env/env-binding.js +95 -0
  55. package/dist/commands/env/env-cli.js +228 -292
  56. package/dist/commands/env/env.js +14 -67
  57. package/dist/commands/env/secret-cli.js +140 -138
  58. package/dist/commands/feedback-cli.js +156 -155
  59. package/dist/commands/graph/graph-cli.js +5 -13
  60. package/dist/commands/graph/graph.js +3 -3
  61. package/dist/commands/health/advisories.js +151 -0
  62. package/dist/commands/health/checks.js +103 -16
  63. package/dist/commands/health/html-report.js +447 -81
  64. package/dist/commands/health/improve-metrics.js +771 -0
  65. package/dist/commands/health/llm-usage.js +65 -0
  66. package/dist/commands/health/md-report.js +103 -0
  67. package/dist/commands/health/metrics.js +278 -0
  68. package/dist/commands/health/stash-exposure.js +46 -0
  69. package/dist/commands/health/surfaces.js +216 -0
  70. package/dist/commands/health/task-runs.js +135 -0
  71. package/dist/commands/health/types.js +26 -0
  72. package/dist/commands/health/windows.js +195 -0
  73. package/dist/commands/health.js +91 -1091
  74. package/dist/commands/improve/anti-collapse.js +170 -0
  75. package/dist/commands/improve/calibration.js +161 -0
  76. package/dist/commands/improve/collapse-detector.js +421 -0
  77. package/dist/commands/improve/consolidate/chunking.js +141 -0
  78. package/dist/commands/improve/consolidate/eligibility.js +64 -0
  79. package/dist/commands/improve/consolidate/merge.js +145 -0
  80. package/dist/commands/improve/consolidate/sanitize.js +231 -0
  81. package/dist/commands/{lint.js → improve/consolidate/types.js} +1 -1
  82. package/dist/commands/improve/consolidate.js +1295 -1277
  83. package/dist/commands/improve/dedup.js +482 -0
  84. package/dist/commands/improve/distill/content-repair.js +202 -0
  85. package/dist/commands/improve/distill/promote-memory.js +229 -0
  86. package/dist/commands/improve/distill/quality-gate.js +236 -0
  87. package/dist/commands/improve/distill-guards.js +127 -0
  88. package/dist/commands/improve/distill-promotion-policy.js +826 -167
  89. package/dist/commands/improve/distill.js +228 -605
  90. package/dist/commands/improve/eligibility.js +434 -0
  91. package/dist/commands/improve/encoding-salience.js +205 -0
  92. package/dist/commands/improve/extract-cli.js +179 -59
  93. package/dist/commands/improve/extract-prompt.js +54 -3
  94. package/dist/commands/improve/extract-watch.js +140 -0
  95. package/dist/commands/improve/extract.js +409 -43
  96. package/dist/commands/improve/feedback-valence.js +54 -0
  97. package/dist/commands/improve/hot-probation.js +45 -0
  98. package/dist/commands/improve/improve-auto-accept.js +157 -10
  99. package/dist/commands/improve/improve-cli.js +115 -73
  100. package/dist/commands/improve/improve-profiles.js +28 -8
  101. package/dist/commands/improve/improve-result-file.js +15 -25
  102. package/dist/commands/improve/improve-session.js +58 -0
  103. package/dist/commands/improve/improve.js +485 -2764
  104. package/dist/commands/improve/locks.js +154 -0
  105. package/dist/commands/improve/loop-stages.js +1100 -0
  106. package/dist/commands/improve/memory/memory-belief.js +14 -15
  107. package/dist/commands/improve/memory/memory-contradiction-detect.js +83 -60
  108. package/dist/commands/improve/memory/memory-improve.js +27 -27
  109. package/dist/commands/improve/outcome-loop.js +270 -0
  110. package/dist/commands/improve/preparation.js +2002 -0
  111. package/dist/commands/improve/proactive-maintenance.js +37 -35
  112. package/dist/commands/improve/procedural.js +398 -0
  113. package/dist/commands/improve/recombine.js +818 -0
  114. package/dist/commands/improve/reflect-noise.js +0 -0
  115. package/dist/commands/improve/reflect.js +206 -45
  116. package/dist/commands/improve/salience.js +455 -0
  117. package/dist/commands/improve/schema-similarity-gate.js +168 -0
  118. package/dist/commands/improve/shared.js +51 -0
  119. package/dist/commands/improve/triage.js +93 -0
  120. package/dist/commands/lint/agent-linter.js +19 -24
  121. package/dist/commands/lint/base-linter.js +173 -60
  122. package/dist/commands/lint/command-linter.js +19 -24
  123. package/dist/commands/lint/env-key-rules.js +38 -1
  124. package/dist/commands/lint/fact-linter.js +39 -0
  125. package/dist/commands/lint/index.js +31 -13
  126. package/dist/commands/lint/memory-linter.js +1 -1
  127. package/dist/commands/lint/registry.js +7 -2
  128. package/dist/commands/lint/task-linter.js +3 -3
  129. package/dist/commands/lint/workflow-linter.js +26 -1
  130. package/dist/commands/observability-cli.js +4 -4
  131. package/dist/commands/proposal/drain-policies.js +13 -4
  132. package/dist/commands/proposal/drain.js +45 -51
  133. package/dist/commands/proposal/legacy-import.js +115 -0
  134. package/dist/commands/proposal/proposal-cli.js +24 -34
  135. package/dist/commands/proposal/proposal.js +2 -1
  136. package/dist/commands/proposal/propose.js +8 -3
  137. package/dist/commands/proposal/repository.js +829 -0
  138. package/dist/commands/proposal/validators/proposal-quality-validators.js +9 -8
  139. package/dist/commands/proposal/validators/proposals.js +93 -895
  140. package/dist/commands/read/curate.js +410 -111
  141. package/dist/commands/read/knowledge.js +10 -3
  142. package/dist/commands/read/remember-cli.js +133 -138
  143. package/dist/commands/read/search-cli.js +15 -8
  144. package/dist/commands/read/search.js +22 -11
  145. package/dist/commands/read/show.js +106 -14
  146. package/dist/commands/registry-cli.js +76 -87
  147. package/dist/commands/remember.js +11 -12
  148. package/dist/commands/sources/add-cli.js +91 -95
  149. package/dist/commands/sources/history.js +1 -1
  150. package/dist/commands/sources/init.js +66 -18
  151. package/dist/commands/sources/installed-stashes.js +11 -3
  152. package/dist/commands/sources/migration-help.js +7 -4
  153. package/dist/commands/sources/schema-repair.js +44 -46
  154. package/dist/commands/sources/self-update.js +2 -2
  155. package/dist/commands/sources/source-add.js +7 -3
  156. package/dist/commands/sources/sources-cli.js +3 -3
  157. package/dist/commands/sources/stash-cli.js +19 -39
  158. package/dist/commands/sources/stash-skeleton.js +57 -8
  159. package/dist/commands/tasks/default-tasks.js +15 -2
  160. package/dist/commands/tasks/tasks-cli.js +20 -29
  161. package/dist/commands/tasks/tasks.js +39 -11
  162. package/dist/commands/wiki-cli.js +23 -38
  163. package/dist/commands/workflow-cli.js +291 -13
  164. package/dist/core/asset/asset-registry.js +3 -1
  165. package/dist/core/asset/asset-spec.js +79 -5
  166. package/dist/core/asset/frontmatter.js +188 -167
  167. package/dist/core/asset/markdown.js +8 -0
  168. package/dist/core/authoring-rules.js +92 -0
  169. package/dist/core/common.js +4 -23
  170. package/dist/core/concurrent.js +10 -1
  171. package/dist/core/config/config-io.js +10 -1
  172. package/dist/core/config/config-migration.js +18 -40
  173. package/dist/core/config/config-schema.js +403 -62
  174. package/dist/core/config/config-types.js +3 -3
  175. package/dist/core/config/config.js +67 -22
  176. package/dist/core/deep-merge.js +38 -0
  177. package/dist/core/errors.js +1 -0
  178. package/dist/core/eval/rank-metrics.js +113 -0
  179. package/dist/core/events.js +4 -7
  180. package/dist/core/improve-types.js +47 -8
  181. package/dist/core/json-schema.js +142 -0
  182. package/dist/core/logs-db.js +14 -75
  183. package/dist/core/parse.js +36 -16
  184. package/dist/core/paths.js +18 -18
  185. package/dist/core/standards/resolve-standards-context.js +87 -0
  186. package/dist/core/standards/resolve-stash-standards.js +99 -0
  187. package/dist/core/standards/resolve-type-conventions.js +66 -0
  188. package/dist/core/state/migrations.js +770 -0
  189. package/dist/core/state-db.js +132 -1126
  190. package/dist/core/structured.js +69 -0
  191. package/dist/core/time.js +53 -0
  192. package/dist/core/warn.js +21 -0
  193. package/dist/core/write-source.js +37 -0
  194. package/dist/indexer/db/db.js +261 -770
  195. package/dist/indexer/db/entry-mapper.js +41 -0
  196. package/dist/indexer/db/graph-db.js +129 -86
  197. package/dist/indexer/db/llm-cache.js +2 -2
  198. package/dist/indexer/db/schema.js +516 -0
  199. package/dist/indexer/ensure-index.js +36 -92
  200. package/dist/indexer/feedback/utility-policy.js +75 -0
  201. package/dist/indexer/graph/graph-boost.js +51 -41
  202. package/dist/indexer/graph/graph-extraction.js +207 -4
  203. package/dist/indexer/index-writer-lock.js +18 -11
  204. package/dist/indexer/index-written-assets.js +105 -0
  205. package/dist/indexer/indexer.js +182 -204
  206. package/dist/indexer/passes/dir-staleness.js +114 -0
  207. package/dist/indexer/passes/memory-inference.js +13 -5
  208. package/dist/indexer/passes/metadata.js +20 -0
  209. package/dist/indexer/read-preflight.js +23 -0
  210. package/dist/indexer/search/db-search.js +89 -13
  211. package/dist/indexer/search/fts-query.js +51 -0
  212. package/dist/indexer/search/ranking-contributors.js +95 -9
  213. package/dist/indexer/search/ranking.js +79 -3
  214. package/dist/indexer/search/search-fields.js +6 -0
  215. package/dist/indexer/search/search-source.js +32 -21
  216. package/dist/indexer/search/semantic-status.js +4 -0
  217. package/dist/indexer/walk/matchers.js +48 -0
  218. package/dist/indexer/walk/walker.js +21 -13
  219. package/dist/integrations/agent/builders.js +41 -13
  220. package/dist/integrations/agent/config.js +20 -59
  221. package/dist/integrations/agent/detect.js +9 -0
  222. package/dist/integrations/agent/index.js +3 -19
  223. package/dist/integrations/agent/model-aliases.js +16 -2
  224. package/dist/integrations/agent/profiles.js +79 -6
  225. package/dist/integrations/agent/prompts.js +75 -9
  226. package/dist/integrations/agent/runner-dispatch.js +83 -0
  227. package/dist/integrations/agent/runner.js +13 -9
  228. package/dist/integrations/agent/spawn.js +206 -81
  229. package/dist/integrations/harnesses/aider/agent-builder.js +113 -0
  230. package/dist/integrations/harnesses/aider/index.js +58 -0
  231. package/dist/integrations/harnesses/aider/result-extractor.js +53 -0
  232. package/dist/integrations/harnesses/amazonq/agent-builder.js +153 -0
  233. package/dist/integrations/harnesses/amazonq/index.js +59 -0
  234. package/dist/integrations/harnesses/amazonq/result-extractor.js +48 -0
  235. package/dist/integrations/harnesses/claude/agent-builder.js +46 -7
  236. package/dist/integrations/harnesses/claude/index.js +27 -23
  237. package/dist/integrations/harnesses/claude/result-extractor.js +52 -0
  238. package/dist/integrations/harnesses/claude/session-log.js +10 -0
  239. package/dist/integrations/harnesses/codex/agent-builder.js +137 -0
  240. package/dist/integrations/harnesses/codex/index.js +63 -0
  241. package/dist/integrations/harnesses/codex/result-extractor.js +73 -0
  242. package/dist/integrations/harnesses/copilot/agent-builder.js +122 -0
  243. package/dist/integrations/harnesses/copilot/index.js +60 -0
  244. package/dist/integrations/harnesses/copilot/result-extractor.js +151 -0
  245. package/dist/integrations/harnesses/gemini/agent-builder.js +121 -0
  246. package/dist/integrations/harnesses/gemini/index.js +60 -0
  247. package/dist/integrations/harnesses/gemini/result-extractor.js +121 -0
  248. package/dist/integrations/harnesses/index.js +28 -7
  249. package/dist/integrations/harnesses/opencode/agent-builder.js +1 -1
  250. package/dist/integrations/harnesses/opencode/index.js +17 -16
  251. package/dist/integrations/harnesses/opencode/session-log.js +173 -3
  252. package/dist/integrations/harnesses/opencode-sdk/harness.js +65 -0
  253. package/dist/integrations/harnesses/opencode-sdk/index.js +10 -34
  254. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +642 -71
  255. package/dist/integrations/harnesses/openhands/agent-builder.js +126 -0
  256. package/dist/integrations/harnesses/openhands/index.js +58 -0
  257. package/dist/integrations/harnesses/openhands/result-extractor.js +103 -0
  258. package/dist/integrations/harnesses/pi/agent-builder.js +104 -0
  259. package/dist/integrations/harnesses/pi/index.js +58 -0
  260. package/dist/integrations/harnesses/pi/result-extractor.js +135 -0
  261. package/dist/integrations/harnesses/types.js +8 -0
  262. package/dist/integrations/session-logs/index.js +40 -11
  263. package/dist/llm/call-ai.js +2 -2
  264. package/dist/llm/client.js +34 -11
  265. package/dist/llm/embedder.js +67 -4
  266. package/dist/llm/embedders/cache.js +3 -1
  267. package/dist/llm/embedders/deterministic.js +66 -0
  268. package/dist/llm/embedders/local.js +73 -3
  269. package/dist/llm/feature-gate.js +16 -15
  270. package/dist/llm/graph-extract.js +67 -44
  271. package/dist/llm/memory-infer-impl.js +138 -0
  272. package/dist/llm/memory-infer.js +1 -127
  273. package/dist/llm/metadata-enhance.js +44 -31
  274. package/dist/llm/structured-call.js +49 -0
  275. package/dist/migrate-storage-node.mjs +8 -0
  276. package/dist/output/context.js +5 -5
  277. package/dist/output/renderers.js +87 -15
  278. package/dist/output/shapes/curate.js +14 -2
  279. package/dist/output/shapes/helpers.js +0 -3
  280. package/dist/output/shapes/passthrough.js +6 -1
  281. package/dist/output/text/helpers.js +241 -2
  282. package/dist/output/text/workflow.js +4 -1
  283. package/dist/registry/providers/skills-sh.js +21 -147
  284. package/dist/registry/providers/static-index.js +15 -157
  285. package/dist/registry/resolve.js +27 -9
  286. package/dist/runtime.js +25 -1
  287. package/dist/schemas/akm-config.json +14225 -0
  288. package/dist/schemas/akm-workflow.json +328 -0
  289. package/dist/scripts/migrate-storage.js +2743 -8390
  290. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +1652 -607
  291. package/dist/setup/detect.js +9 -0
  292. package/dist/setup/legacy-config.js +106 -0
  293. package/dist/setup/prompt.js +57 -0
  294. package/dist/setup/providers.js +14 -0
  295. package/dist/setup/registry-stash-loader.js +12 -0
  296. package/dist/setup/semantic-assets.js +124 -0
  297. package/dist/setup/setup.js +52 -1614
  298. package/dist/setup/steps/connection.js +734 -0
  299. package/dist/setup/steps/output.js +31 -0
  300. package/dist/setup/steps/platforms.js +124 -0
  301. package/dist/setup/steps/semantic.js +27 -0
  302. package/dist/setup/steps/sources.js +222 -0
  303. package/dist/setup/steps/stashdir.js +42 -0
  304. package/dist/setup/steps/tasks.js +152 -0
  305. package/dist/sources/include.js +6 -2
  306. package/dist/sources/providers/filesystem.js +0 -1
  307. package/dist/sources/providers/git-install.js +210 -0
  308. package/dist/sources/providers/git-provider.js +234 -0
  309. package/dist/sources/providers/git-stash.js +248 -0
  310. package/dist/sources/providers/git.js +10 -661
  311. package/dist/sources/providers/npm.js +2 -6
  312. package/dist/sources/providers/provider-utils.js +13 -7
  313. package/dist/sources/providers/sync-from-ref.js +9 -1
  314. package/dist/sources/providers/website.js +9 -5
  315. package/dist/sources/website-ingest.js +187 -29
  316. package/dist/sources/wiki-fetchers/registry.js +53 -0
  317. package/dist/sources/wiki-fetchers/youtube.js +239 -0
  318. package/dist/storage/database.js +45 -10
  319. package/dist/storage/managed-db.js +82 -0
  320. package/dist/storage/repositories/canaries-repository.js +107 -0
  321. package/dist/storage/repositories/consolidation-repository.js +38 -0
  322. package/dist/storage/repositories/embeddings-repository.js +72 -0
  323. package/dist/storage/repositories/events-repository.js +187 -0
  324. package/dist/storage/repositories/extract-sessions-repository.js +96 -0
  325. package/dist/storage/repositories/improve-runs-repository.js +146 -0
  326. package/dist/storage/repositories/index-db.js +14 -8
  327. package/dist/storage/repositories/proposals-repository.js +220 -0
  328. package/dist/storage/repositories/recombine-repository.js +213 -0
  329. package/dist/storage/repositories/registry-cache.js +93 -0
  330. package/dist/storage/repositories/registry-index-cache-repository.js +46 -0
  331. package/dist/storage/repositories/task-history-repository.js +93 -0
  332. package/dist/storage/repositories/workflow-runs-repository.js +189 -1
  333. package/dist/storage/sqlite-pragmas.js +146 -0
  334. package/dist/tasks/backends/cron.js +1 -1
  335. package/dist/tasks/backends/index.js +9 -0
  336. package/dist/tasks/backends/launchd.js +1 -1
  337. package/dist/tasks/backends/schtasks.js +1 -1
  338. package/dist/tasks/{resolveAkmBin.js → resolve-akm-bin.js} +2 -2
  339. package/dist/tasks/runner.js +15 -13
  340. package/dist/text-import-hook.mjs +1 -1
  341. package/dist/wiki/wiki.js +52 -11
  342. package/dist/workflows/authoring/authoring.js +123 -10
  343. package/dist/workflows/authoring/workflow-program-template.yaml +31 -0
  344. package/dist/workflows/cli.js +5 -0
  345. package/dist/workflows/db.js +138 -4
  346. package/dist/workflows/exec/brief.js +484 -0
  347. package/dist/workflows/exec/native-executor.js +975 -0
  348. package/dist/workflows/exec/param-secrets.js +115 -0
  349. package/dist/workflows/exec/report.js +1295 -0
  350. package/dist/workflows/exec/run-workflow.js +596 -0
  351. package/dist/workflows/exec/scheduler.js +100 -0
  352. package/dist/workflows/exec/step-work.js +1156 -0
  353. package/dist/workflows/exec/unit-writer.js +23 -0
  354. package/dist/workflows/exec/watch.js +116 -0
  355. package/dist/workflows/exec/worktree.js +171 -0
  356. package/dist/workflows/ir/compile.js +388 -0
  357. package/dist/workflows/ir/params.js +54 -0
  358. package/dist/workflows/ir/plan-hash.js +33 -0
  359. package/dist/workflows/ir/schema.js +4 -0
  360. package/dist/workflows/parser.js +3 -1
  361. package/dist/workflows/program/expressions.js +369 -0
  362. package/dist/workflows/program/parser.js +760 -0
  363. package/dist/workflows/program/project.js +105 -0
  364. package/dist/workflows/program/schema.js +54 -0
  365. package/dist/workflows/renderer.js +82 -5
  366. package/dist/workflows/runtime/agent-identity.js +59 -14
  367. package/dist/workflows/runtime/runs.js +248 -153
  368. package/dist/workflows/runtime/unit-checkin.js +45 -0
  369. package/dist/workflows/runtime/workflow-asset-loader.js +188 -0
  370. package/dist/workflows/validate-summary.js +26 -10
  371. package/dist/workflows/validator.js +1 -1
  372. package/docs/README.md +69 -18
  373. package/docs/data-and-telemetry.md +7 -5
  374. package/docs/migration/release-notes/0.7.0.md +1 -1
  375. package/docs/migration/release-notes/0.9.0-beta.60.md +19 -0
  376. package/docs/migration/release-notes/0.9.0.md +39 -0
  377. package/package.json +10 -10
  378. package/dist/assets/tasks/core/update-stashes.yml +0 -4
  379. package/dist/commands/db-cli.js +0 -23
  380. package/dist/indexer/db/db-backup.js +0 -376
  381. package/dist/indexer/passes/staleness-detect.js +0 -488
@@ -0,0 +1,105 @@
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
+ * Renderer name for YAML workflow programs. Lives in this leaf module (not
6
+ * `../renderer.ts`) so the indexer matcher can name it without importing the
7
+ * renderer module and its registration side effects.
8
+ */
9
+ export const WORKFLOW_PROGRAM_RENDERER_NAME = "workflow-program-yaml";
10
+ /** File extensions that mark a workflow asset as a YAML program. */
11
+ const WORKFLOW_PROGRAM_PATH_RE = /\.ya?ml$/i;
12
+ /** True when a workflow asset path holds a YAML program (vs. markdown). */
13
+ export function isWorkflowProgramPath(filePath) {
14
+ return WORKFLOW_PROGRAM_PATH_RE.test(filePath);
15
+ }
16
+ /**
17
+ * The instruction text a step contributes to the flat step projection.
18
+ * Unit and map steps carry their unit's RAW instruction template; route
19
+ * steps have no unit, so a deterministic description of the routing table
20
+ * stands in (the spine still needs a non-empty instructions string).
21
+ */
22
+ export function programStepInstructions(step) {
23
+ if (step.unit)
24
+ return step.unit.instructions;
25
+ if (step.map)
26
+ return step.map.unit.instructions;
27
+ if (step.route) {
28
+ const branches = step.route.branches.map((b) => `"${b.match}" -> ${b.stepId}`);
29
+ if (step.route.defaultStepId !== undefined)
30
+ branches.push(`default -> ${step.route.defaultStepId}`);
31
+ return `Route on ${step.route.input}: ${branches.join(", ")}.`;
32
+ }
33
+ return "";
34
+ }
35
+ /**
36
+ * Project the program's steps into flat `WorkflowStepDefinition`s.
37
+ *
38
+ * `gate.criteria` MUST project into `completionCriteria`: `startWorkflowRun`
39
+ * persists this projection as the step rows' `completion_json`, which is what
40
+ * `completeWorkflowStep` reads to run the summary-validation gate (fail-open
41
+ * when empty). Dropping the criteria here silently disarms every YAML gate.
42
+ */
43
+ export function projectProgramStepDefinitions(program) {
44
+ return program.steps.map((step, index) => ({
45
+ id: step.id,
46
+ title: step.title ?? step.id,
47
+ instructions: programStepInstructions(step),
48
+ ...(step.gate && step.gate.criteria.length > 0 ? { completionCriteria: [...step.gate.criteria] } : {}),
49
+ sequenceIndex: index,
50
+ }));
51
+ }
52
+ /** Project the `params` block into the flat `WorkflowParameter` list. */
53
+ export function projectProgramParameters(program) {
54
+ if (!program.params)
55
+ return undefined;
56
+ const parameters = Object.entries(program.params).map(([name, schema]) => {
57
+ const description = schema.description;
58
+ return {
59
+ name,
60
+ ...(typeof description === "string" && description !== "" ? { description } : {}),
61
+ };
62
+ });
63
+ return parameters.length > 0 ? parameters : undefined;
64
+ }
65
+ /**
66
+ * Compact, show-facing orchestration summary for one program step, reusing
67
+ * the existing `WorkflowStepOrchestrationSummary` shape. Field mapping:
68
+ * `runner`/`model`/`timeoutMs` merge the run-level `defaults` exactly like
69
+ * the compiler does (per-unit wins), `fanOut.over` carries the raw `${{ … }}`
70
+ * expression, and `route` carries the explicit input + branch table.
71
+ * Returns undefined when the step declares nothing worth summarizing.
72
+ */
73
+ export function summarizeProgramStepOrchestration(step, defaults) {
74
+ const unit = step.unit ?? step.map?.unit;
75
+ const runner = unit?.runner ?? defaults?.runner;
76
+ const model = unit?.model ?? defaults?.model;
77
+ const timeoutMs = unit?.timeoutMs !== undefined ? unit.timeoutMs : defaults?.timeoutMs;
78
+ const summary = {
79
+ ...(runner !== undefined ? { runner } : {}),
80
+ ...(unit?.profile !== undefined ? { profile: unit.profile } : {}),
81
+ ...(model !== undefined ? { model } : {}),
82
+ ...(timeoutMs !== undefined ? { timeoutMs } : {}),
83
+ ...(step.map
84
+ ? {
85
+ fanOut: {
86
+ over: step.map.over,
87
+ ...(step.map.concurrency !== undefined ? { concurrency: step.map.concurrency } : {}),
88
+ reducer: step.map.reducer ?? "collect",
89
+ },
90
+ }
91
+ : {}),
92
+ ...(unit?.output !== undefined || step.output !== undefined ? { hasSchema: true } : {}),
93
+ ...(unit?.env !== undefined ? { env: [...unit.env] } : {}),
94
+ ...(step.route
95
+ ? {
96
+ route: {
97
+ input: step.route.input,
98
+ branches: step.route.branches.map((b) => ({ match: b.match, stepId: b.stepId })),
99
+ ...(step.route.defaultStepId !== undefined ? { defaultStepId: step.route.defaultStepId } : {}),
100
+ },
101
+ }
102
+ : {}),
103
+ };
104
+ return Object.keys(summary).length > 0 ? summary : undefined;
105
+ }
@@ -0,0 +1,54 @@
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 const WORKFLOW_PROGRAM_VERSION = 1;
5
+ /** Execution backend for a unit. `inherit` defers to the run-level default. */
6
+ export const PROGRAM_RUNNER_KINDS = ["llm", "agent", "sdk", "inherit"];
7
+ /** How a map step folds its per-item unit results into the step artifact. */
8
+ export const PROGRAM_REDUCERS = ["collect", "vote"];
9
+ /** Failure policy: fail the step on first unit failure, or record and go on. */
10
+ export const PROGRAM_ON_ERROR = ["fail", "continue"];
11
+ /** Filesystem isolation for file-mutating units (enforcement is R2). */
12
+ export const PROGRAM_ISOLATION_KINDS = ["none", "worktree"];
13
+ /**
14
+ * `retry.on` vocabulary — exactly the persisted `AgentFailureReason` taxonomy
15
+ * from `src/integrations/agent/spawn.ts`. The `satisfies` clause fails the
16
+ * typecheck if spawn.ts adds/renames a reason without this list (and the JSON
17
+ * Schema, via the drift test) being updated.
18
+ */
19
+ const RETRY_REASON_SET = {
20
+ timeout: true,
21
+ spawn_failed: true,
22
+ non_zero_exit: true,
23
+ parse_error: true,
24
+ cooldown: true,
25
+ llm_rate_limit: true,
26
+ llm_content_filter: true,
27
+ llm_invalid_json: true,
28
+ content_policy_reject: true,
29
+ unsupported_type: true,
30
+ no_change: true,
31
+ aborted: true,
32
+ };
33
+ export const PROGRAM_RETRY_REASONS = Object.keys(RETRY_REASON_SET);
34
+ /**
35
+ * Step ids: `[A-Za-z_][A-Za-z0-9_-]*` (also pinned in the JSON Schema).
36
+ *
37
+ * This is EXACTLY the `<ident>` grammar `readIdent` accepts in
38
+ * `program/expressions.ts` for `${{ steps.<id>.output }}` references: a
39
+ * letter/underscore first char, then letters/digits/underscores/dashes, and
40
+ * NO dots (the expression parser treats `.` as the `.output` path separator,
41
+ * so a dotted id could never be addressed). Keeping step ids inside the
42
+ * addressable grammar guarantees every step can be referenced from map
43
+ * inputs, routes, and unit templates without renaming.
44
+ *
45
+ * Forbidding dots additionally keeps the engine's internal gate-row node id
46
+ * `<stepId>.gate` collision-free: no user step id can contain a dot, so it can
47
+ * never equal another step's `<stepId>.gate` synthetic id.
48
+ */
49
+ export const PROGRAM_STEP_ID_PATTERN = /^[A-Za-z_][A-Za-z0-9_-]*$/;
50
+ /**
51
+ * Param names must be `${{ params.<ident> }}`-addressable, so they are plain
52
+ * identifiers (no dots/dashes).
53
+ */
54
+ export const PROGRAM_PARAM_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
@@ -2,18 +2,28 @@
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  /**
5
- * Show + indexing renderer for workflow assets.
5
+ * Show + indexing renderers for workflow assets.
6
6
  *
7
- * Reads the markdown via `parseWorkflow` and projects the validated
8
- * `WorkflowDocument` down to the public `ShowResponse` shape (which still
9
- * uses the flat `WorkflowStepDefinition` type for backwards compatibility)
10
- * and into search hints for the indexer.
7
+ * Two formats, one asset type:
8
+ *
9
+ * - `workflow-md` — reads the classic linear markdown via `parseWorkflow`
10
+ * and projects the validated `WorkflowDocument` down to the public
11
+ * `ShowResponse` shape (which still uses the flat
12
+ * `WorkflowStepDefinition` type for backwards compatibility) and into
13
+ * search hints for the indexer.
14
+ * - `workflow-program-yaml` — reads a YAML workflow *program* (redesign
15
+ * addendum, R1) via `parseWorkflowProgram` and projects it through
16
+ * `program/project.ts`, including a compact orchestration summary per
17
+ * step (runner/model, `fanOut.over` expression, route table).
11
18
  */
12
19
  import { makeAssetRef } from "../core/asset/asset-ref.js";
13
20
  import { UsageError } from "../core/errors.js";
14
21
  import { registerMetadataContributor } from "../indexer/passes/metadata-contributors.js";
15
22
  import { parseWorkflow } from "./parser.js";
23
+ import { parseWorkflowProgram } from "./program/parser.js";
24
+ import { programStepInstructions, projectProgramParameters, summarizeProgramStepOrchestration, WORKFLOW_PROGRAM_RENDERER_NAME, } from "./program/project.js";
16
25
  import { cacheWorkflowDocument } from "./runtime/document-cache.js";
26
+ export { WORKFLOW_PROGRAM_RENDERER_NAME };
17
27
  function shellQuote(value) {
18
28
  return `'${value.replace(/'/g, `'\\''`)}'`;
19
29
  }
@@ -59,6 +69,43 @@ export const workflowMdRenderer = {
59
69
  };
60
70
  },
61
71
  };
72
+ function loadProgram(ctx) {
73
+ const result = parseWorkflowProgram(ctx.content(), { path: ctx.relPath });
74
+ if (result.ok)
75
+ return result.program;
76
+ const summary = result.errors.map((e) => `${ctx.relPath}:${e.line} — ${e.message}`).join("\n");
77
+ throw new UsageError(`Workflow has errors:\n${summary}`);
78
+ }
79
+ /** Show renderer for YAML workflow programs — mirrors `workflowMdRenderer`. */
80
+ export const workflowProgramRenderer = {
81
+ name: WORKFLOW_PROGRAM_RENDERER_NAME,
82
+ buildShowResponse(ctx) {
83
+ const name = deriveName(ctx);
84
+ const program = loadProgram(ctx);
85
+ const ref = makeAssetRef("workflow", name, ctx.origin);
86
+ const parameters = projectProgramParameters(program);
87
+ return {
88
+ type: "workflow",
89
+ name,
90
+ path: ctx.absPath,
91
+ action: buildWorkflowAction(ref),
92
+ description: program.description,
93
+ workflowTitle: program.name,
94
+ ...(parameters ? { parameters: parameters.map((p) => p.name), workflowParameters: parameters } : {}),
95
+ steps: program.steps.map((step, index) => {
96
+ const orchestration = summarizeProgramStepOrchestration(step, program.defaults);
97
+ return {
98
+ id: step.id,
99
+ title: step.title ?? step.id,
100
+ instructions: programStepInstructions(step),
101
+ ...(step.gate ? { completionCriteria: [...step.gate.criteria] } : {}),
102
+ sequenceIndex: index,
103
+ ...(orchestration ? { orchestration } : {}),
104
+ };
105
+ }),
106
+ };
107
+ },
108
+ };
62
109
  registerMetadataContributor({
63
110
  name: "workflow-document-metadata",
64
111
  appliesTo: ({ rendererName }) => rendererName === "workflow-md",
@@ -84,3 +131,33 @@ registerMetadataContributor({
84
131
  cacheWorkflowDocument(entry, doc);
85
132
  },
86
133
  });
134
+ registerMetadataContributor({
135
+ name: "workflow-program-metadata",
136
+ appliesTo: ({ rendererName }) => rendererName === WORKFLOW_PROGRAM_RENDERER_NAME,
137
+ contribute(entry, { renderContext }) {
138
+ // Parse failures throw, which the metadata pass turns into a
139
+ // skip-with-warning — broken programs never land in the index, mirroring
140
+ // markdown workflows. No workflow_documents cache row is written: YAML
141
+ // programs are re-parsed from disk by the runtime loader.
142
+ const program = loadProgram(renderContext);
143
+ const hints = new Set(entry.searchHints ?? []);
144
+ hints.add(program.name);
145
+ for (const step of program.steps) {
146
+ hints.add(step.id);
147
+ if (step.title)
148
+ hints.add(step.title);
149
+ hints.add(programStepInstructions(step));
150
+ for (const criterion of step.gate?.criteria ?? []) {
151
+ hints.add(criterion);
152
+ }
153
+ }
154
+ entry.searchHints = Array.from(hints).filter(Boolean);
155
+ if (!entry.description && program.description) {
156
+ entry.description = program.description;
157
+ }
158
+ const parameters = projectProgramParameters(program);
159
+ if (parameters?.length) {
160
+ entry.parameters = parameters;
161
+ }
162
+ },
163
+ });
@@ -11,14 +11,42 @@
11
11
  * already exposes via the environment.
12
12
  *
13
13
  * Resolution is best-effort and environment-driven:
14
- * - harness: AKM_AGENT_HARNESS, else inferred from a known harness env var.
14
+ * - harness: AKM_AGENT_HARNESS, else inferred from a harness session-id
15
+ * env var (`identityEnv`), else from a harness presence flag
16
+ * (`presenceEnv`).
15
17
  * - sessionId: AKM_SESSION_ID, else the harness-native session env var.
18
+ * Presence flags NEVER contribute a session id — their values
19
+ * (`CODEX_SANDBOX=seatbelt`, `GEMINI_CLI=1`) are modes/flags,
20
+ * not sessions, and must not be persisted as agent_session_id.
16
21
  *
17
22
  * Explicit values passed to `startWorkflowRun` always win over the environment.
18
23
  *
24
+ * The harness-native markers are DERIVED from `HARNESS_REGISTRY` (plan §"Kill
25
+ * registry drift", P2): each harness declares its session-id env vars via
26
+ * `identityEnv` and its presence-only flags via `presenceEnv`, so adding a
27
+ * harness never touches this module. Only the `AKM_*` explicit-override vars
28
+ * are non-registry (they are akm's own, not any harness's) and stay hardcoded
29
+ * here.
30
+ *
19
31
  * @module workflows/agent-identity
20
32
  */
21
- import { denormalizeRuntimeIdentity } from "../../integrations/harnesses/index.js";
33
+ import { denormalizeRuntimeIdentity, HARNESS_REGISTRY } from "../../integrations/harnesses/index.js";
34
+ /**
35
+ * Derive a marker table from one registry env-var field, ordered by canonical
36
+ * id. The sort keeps the pre-derivation precedence byte-identical ('claude'
37
+ * before 'opencode' — the old if/else chain's order) and independent of
38
+ * `HARNESS_REGISTRY` declaration order, which is pinned for JSON-schema enum
39
+ * stability, not detection precedence.
40
+ */
41
+ function deriveMarkers(pick) {
42
+ return HARNESS_REGISTRY.filter((h) => (pick(h)?.length ?? 0) > 0)
43
+ .map((h) => ({ harnessId: h.id, envKeys: pick(h) ?? [] }))
44
+ .sort((a, b) => a.harnessId.localeCompare(b.harnessId));
45
+ }
46
+ /** Session-id-bearing markers — usable for BOTH harness inference and sessionId. */
47
+ const SESSION_MARKERS = deriveMarkers((h) => h.identityEnv);
48
+ /** Presence-only flags — harness inference ONLY; their values are never a session id. */
49
+ const PRESENCE_MARKERS = deriveMarkers((h) => h.presenceEnv);
22
50
  function firstNonEmpty(env, keys) {
23
51
  for (const key of keys) {
24
52
  const value = env[key];
@@ -37,20 +65,37 @@ export function resolveAgentIdentity(env = process.env) {
37
65
  // Explicit override always wins.
38
66
  let harness = firstNonEmpty(env, ["AKM_AGENT_HARNESS"]);
39
67
  if (!harness) {
40
- // Infer the harness from a harness-specific *session* env var. We only
41
- // infer when a concrete session id is present: the bare "this process is
42
- // Claude Code" flag does not mean a given run is owned by an agent session,
43
- // so it must not silently stamp identity onto manual CLI invocations.
44
- if (firstNonEmpty(env, ["CLAUDE_SESSION_ID"])) {
45
- // Runtime identity for Claude Code is "claude-code" (vs the canonical
46
- // config id "claude"). Derived from the unified registry's bridge (#562)
47
- // so the persisted runtime string can't drift still emits "claude-code".
48
- harness = denormalizeRuntimeIdentity("claude");
68
+ // Infer the harness from a harness-specific *session* env var first
69
+ // (registry `identityEnv` markers). A concrete session id is the
70
+ // strongest evidence of the immediate driver, so it outranks any
71
+ // presence flag e.g. opencode launched inside a codex sandbox
72
+ // (OPENCODE_SESSION_ID + CODEX_SANDBOX) attributes to opencode.
73
+ for (const marker of SESSION_MARKERS) {
74
+ if (firstNonEmpty(env, marker.envKeys)) {
75
+ // Report the harness's RUNTIME identity (e.g. canonical 'claude' →
76
+ // 'claude-code') via the registry's #562 bridge so the persisted
77
+ // runtime string can't drift.
78
+ harness = denormalizeRuntimeIdentity(marker.harnessId);
79
+ break;
80
+ }
49
81
  }
50
- else if (firstNonEmpty(env, ["OPENCODE_SESSION_ID"])) {
51
- harness = denormalizeRuntimeIdentity("opencode");
82
+ }
83
+ if (!harness) {
84
+ // Fall back to presence-only flags (registry `presenceEnv`). These are
85
+ // stamped by the harness on its OWN child processes (CODEX_SANDBOX,
86
+ // GEMINI_CLI=1), so they cannot mis-attribute manual CLI invocations —
87
+ // but they carry no session id, so sessionId stays null below.
88
+ for (const marker of PRESENCE_MARKERS) {
89
+ if (firstNonEmpty(env, marker.envKeys)) {
90
+ harness = denormalizeRuntimeIdentity(marker.harnessId);
91
+ break;
92
+ }
52
93
  }
53
94
  }
54
- const sessionId = firstNonEmpty(env, ["AKM_SESSION_ID", "CLAUDE_SESSION_ID", "OPENCODE_SESSION_ID"]);
95
+ // Session id: the explicit AKM override first, then the session-id-bearing
96
+ // registry markers in the same precedence order as harness inference (so
97
+ // harness and session id agree when multiple harness env vars are present).
98
+ // Presence flags are deliberately excluded — their values are not sessions.
99
+ const sessionId = firstNonEmpty(env, ["AKM_SESSION_ID", ...SESSION_MARKERS.flatMap((m) => [...m.envKeys])]);
55
100
  return { harness, sessionId };
56
101
  }