akm-cli 0.9.0-rc.8 → 0.9.0

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 (450) hide show
  1. package/CHANGELOG.md +1063 -44
  2. package/README.md +51 -25
  3. package/SECURITY.md +14 -1
  4. package/STABILITY.md +497 -0
  5. package/dist/akm +148 -35
  6. package/dist/{akm-migrate-storage → akm-migrate} +6 -9
  7. package/dist/assets/hints/cli-hints-full.md +223 -95
  8. package/dist/assets/hints/cli-hints-short.md +85 -22
  9. package/dist/assets/improve-strategies/default.json +1 -1
  10. package/dist/assets/improve-strategies/reflect-distill.json +1 -1
  11. package/dist/assets/prompts/memory-infer-user.md +2 -3
  12. package/dist/assets/stash-skeleton/README.md +6 -5
  13. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +2 -0
  14. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +2 -0
  15. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +2 -0
  16. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +2 -0
  17. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +2 -0
  18. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +2 -0
  19. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +2 -0
  20. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +2 -0
  21. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +2 -0
  22. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +2 -0
  23. package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -0
  24. package/dist/assets/stash-skeleton/facts/conventions/organization.md +20 -9
  25. package/dist/assets/tasks/core/extract.yml +1 -1
  26. package/dist/assets/tasks/core/version-check.yml +1 -1
  27. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  28. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  29. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  30. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  31. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  32. package/dist/assets/templates/html/health.html +1 -3
  33. package/dist/assets/workflows/workflow-template.md +32 -15
  34. package/dist/cli/invocation.js +40 -15
  35. package/dist/cli/parse-args.js +0 -22
  36. package/dist/cli/retired-commands.js +121 -0
  37. package/dist/cli/shared.js +154 -22
  38. package/dist/cli/unknown-flags.js +236 -0
  39. package/dist/cli-node.mjs +2 -1
  40. package/dist/cli.js +696 -258
  41. package/dist/commands/agent/agent-dispatch.js +14 -3
  42. package/dist/commands/agent/contribute-cli.js +73 -88
  43. package/dist/commands/completions.js +79 -22
  44. package/dist/commands/config-cli.js +17 -150
  45. package/dist/commands/env/env-cli.js +59 -143
  46. package/dist/commands/env/env.js +12 -163
  47. package/dist/commands/env/marker-path.js +6 -0
  48. package/dist/commands/env/secret-cli.js +36 -66
  49. package/dist/commands/env/secret.js +24 -57
  50. package/dist/commands/feedback-cli.js +141 -87
  51. package/dist/commands/health/accept-rate.js +58 -0
  52. package/dist/commands/health/advisories.js +3 -4
  53. package/dist/commands/health/checks.js +85 -23
  54. package/dist/commands/health/html-report.js +7 -10
  55. package/dist/commands/health/improve-metrics.js +25 -83
  56. package/dist/commands/health/md-report.js +5 -9
  57. package/dist/commands/health/metrics.js +62 -20
  58. package/dist/commands/health/renderers.js +47 -0
  59. package/dist/commands/health/report-view-model.js +4 -5
  60. package/dist/commands/health/stash-exposure.js +1 -1
  61. package/dist/commands/health/surfaces.js +3 -48
  62. package/dist/commands/health/task-runs.js +3 -67
  63. package/dist/commands/health/types-improve.js +7 -0
  64. package/dist/commands/health.js +99 -28
  65. package/dist/commands/improve/anti-collapse.js +2 -2
  66. package/dist/commands/improve/autonomy-gate.js +68 -0
  67. package/dist/commands/improve/collapse-detector.js +41 -40
  68. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  69. package/dist/commands/improve/consolidate/merge.js +4 -0
  70. package/dist/commands/improve/consolidate.js +140 -1000
  71. package/dist/commands/improve/distill/promote-memory.js +12 -12
  72. package/dist/commands/improve/distill/quality-gate.js +6 -6
  73. package/dist/commands/improve/distill.js +58 -69
  74. package/dist/commands/improve/eligibility.js +105 -57
  75. package/dist/commands/improve/extract-cli.js +14 -133
  76. package/dist/commands/improve/improve-cli.js +98 -114
  77. package/dist/commands/improve/improve-result-file.js +1 -28
  78. package/dist/commands/improve/improve-strategies.js +8 -5
  79. package/dist/commands/improve/improve.js +128 -91
  80. package/dist/commands/improve/loop-stages.js +182 -20
  81. package/dist/commands/improve/memory/derived-ref.js +45 -43
  82. package/dist/commands/improve/memory/memory-belief.js +1 -1
  83. package/dist/commands/improve/memory/memory-contradiction-detect.js +4 -12
  84. package/dist/commands/improve/memory/memory-improve.js +6 -5
  85. package/dist/commands/improve/outcome-loop.js +22 -65
  86. package/dist/commands/improve/preparation.js +114 -123
  87. package/dist/commands/improve/proactive-maintenance.js +2 -5
  88. package/dist/commands/improve/reflect.js +56 -160
  89. package/dist/commands/improve/salience.js +11 -122
  90. package/dist/commands/improve/source-identity.js +10 -38
  91. package/dist/commands/lint/base-linter.js +20 -124
  92. package/dist/commands/lint/env-key-rules.js +31 -47
  93. package/dist/commands/lint/index.js +249 -43
  94. package/dist/commands/{events.js → log.js} +33 -38
  95. package/dist/commands/migrate-cli.js +92 -12
  96. package/dist/commands/migration-tool.js +46 -0
  97. package/dist/commands/observability-cli.js +70 -209
  98. package/dist/commands/proposal/drain.js +101 -29
  99. package/dist/commands/proposal/proposal-cli.js +76 -48
  100. package/dist/commands/proposal/proposal.js +54 -18
  101. package/dist/commands/proposal/propose-cli.js +88 -0
  102. package/dist/commands/proposal/propose.js +23 -15
  103. package/dist/commands/proposal/repository.js +701 -278
  104. package/dist/commands/proposal/validators/proposal-quality-validators.js +2 -8
  105. package/dist/commands/proposal/validators/proposal-validators.js +55 -7
  106. package/dist/commands/proposal/validators/proposals.js +4 -7
  107. package/dist/commands/read/curate.js +34 -53
  108. package/dist/commands/read/knowledge.js +150 -95
  109. package/dist/commands/read/registry-search.js +2 -2
  110. package/dist/commands/read/remember-cli.js +42 -15
  111. package/dist/commands/read/search-cli.js +180 -78
  112. package/dist/commands/read/search.js +58 -43
  113. package/dist/commands/read/show.js +197 -141
  114. package/dist/commands/registry-cli.js +12 -51
  115. package/dist/commands/remember.js +14 -57
  116. package/dist/commands/sources/add-cli.js +100 -31
  117. package/dist/commands/sources/bundle-cli.js +166 -0
  118. package/dist/commands/sources/bundle-config-ops.js +7 -2
  119. package/dist/commands/sources/info.js +18 -5
  120. package/dist/commands/sources/init.js +12 -12
  121. package/dist/commands/sources/installed-stashes.js +382 -98
  122. package/dist/commands/sources/schema-repair.js +3 -2
  123. package/dist/commands/sources/self-update.js +131 -38
  124. package/dist/commands/sources/source-add.js +72 -17
  125. package/dist/commands/sources/source-clone.js +129 -45
  126. package/dist/commands/sources/source-manage.js +43 -23
  127. package/dist/commands/sources/sources-cli.js +57 -208
  128. package/dist/commands/sources/stash-cli.js +46 -53
  129. package/dist/commands/tasks/tasks-cli.js +91 -97
  130. package/dist/commands/tasks/tasks.js +276 -421
  131. package/dist/commands/workflow-cli.js +175 -450
  132. package/dist/core/adapter/adapters/akm-adapter.js +47 -28
  133. package/dist/core/adapter/adapters/akm-lint.js +42 -27
  134. package/dist/core/adapter/adapters/akm-metadata.js +15 -44
  135. package/dist/core/adapter/adapters/akm-task-adapter.js +15 -13
  136. package/dist/core/adapter/adapters/akm-workflow-adapter.js +55 -71
  137. package/dist/core/adapter/adapters/dotenv-adapter.js +1 -1
  138. package/dist/core/adapter/adapters/generic-files-adapter.js +2 -0
  139. package/dist/core/adapter/adapters/index.js +6 -6
  140. package/dist/core/adapter/adapters/llm-wiki-adapter.js +14 -8
  141. package/dist/core/adapter/adapters/okf-adapter.js +187 -19
  142. package/dist/core/adapter/adapters/shared.js +3 -19
  143. package/dist/core/adapter/adapters/tool-dir-shared.js +8 -3
  144. package/dist/core/adapter/adapters/website-snapshot-adapter.js +1 -0
  145. package/dist/core/adapter/detect-adapter.js +17 -0
  146. package/dist/core/adapter/recognize-match.js +6 -4
  147. package/dist/core/adapter/validate-context.js +214 -0
  148. package/dist/core/asset/akm-markdown.js +63 -0
  149. package/dist/core/asset/asset-placement.js +20 -6
  150. package/dist/core/asset/asset-ref.js +11 -9
  151. package/dist/core/asset/frontmatter-lint.js +30 -0
  152. package/dist/core/asset/frontmatter.js +37 -9
  153. package/dist/core/asset/markdown.js +40 -51
  154. package/dist/core/asset/resolve-ref.js +89 -18
  155. package/dist/core/asset/stash-meta.js +1 -1
  156. package/dist/core/bundle-id.js +51 -0
  157. package/dist/core/common.js +152 -38
  158. package/dist/core/config/config-io.js +12 -1
  159. package/dist/core/config/config-schema.js +35 -8
  160. package/dist/core/config/config-sources.js +55 -11
  161. package/dist/core/config/config-walker.js +25 -9
  162. package/dist/core/config/config.js +9 -48
  163. package/dist/core/config/experimental.js +21 -0
  164. package/dist/core/config/schema/embedding.js +5 -1
  165. package/dist/core/config/schema/experimental.js +30 -0
  166. package/dist/core/config/schema/improve-processes.js +0 -6
  167. package/dist/core/config/schema/improve.js +21 -3
  168. package/dist/core/config/schema/index-config.js +8 -15
  169. package/dist/core/config/schema/output.js +4 -1
  170. package/dist/core/config/schema/setup.js +9 -18
  171. package/dist/core/config/schema/sources-bundles.js +49 -33
  172. package/dist/core/config/schema/workflow.js +3 -3
  173. package/dist/core/env-secret-ref.js +76 -46
  174. package/dist/core/errors.js +18 -12
  175. package/dist/core/events.js +46 -128
  176. package/dist/core/file-change.js +6 -5
  177. package/dist/core/fs-txn.js +83 -7
  178. package/dist/core/git-message.js +2 -2
  179. package/dist/core/improve-result.js +1 -100
  180. package/dist/core/lesson-lint.js +1 -17
  181. package/dist/core/logs-db.js +2 -1
  182. package/dist/core/migration-operation.js +16 -0
  183. package/dist/core/mutation-target.js +78 -0
  184. package/dist/core/parse.js +4 -1
  185. package/dist/core/paths.js +17 -20
  186. package/dist/core/recognition-util.js +12 -14
  187. package/dist/core/redaction.js +34 -0
  188. package/dist/core/standards/resolve-standards-context.js +2 -14
  189. package/dist/core/standards/resolve-stash-standards.js +2 -2
  190. package/dist/core/standards/resolve-type-conventions.js +2 -2
  191. package/dist/core/state/migrations.js +41 -18
  192. package/dist/core/state-db.js +5 -14
  193. package/dist/core/structured.js +1 -1
  194. package/dist/core/subprocess.js +6 -4
  195. package/dist/core/text-truncation.js +9 -5
  196. package/dist/core/type-presentation.js +3 -3
  197. package/dist/core/warn.js +0 -3
  198. package/dist/core/write-source.js +771 -95
  199. package/dist/indexer/bundle-identity-guard.js +3 -2
  200. package/dist/indexer/db/graph-db.js +0 -24
  201. package/dist/indexer/ensure-index.js +1 -0
  202. package/dist/indexer/graph/graph-boost.js +9 -34
  203. package/dist/indexer/graph/graph-extraction.js +8 -5
  204. package/dist/indexer/index-writer-lock.js +53 -17
  205. package/dist/indexer/index-written-assets.js +16 -22
  206. package/dist/indexer/indexer.js +497 -239
  207. package/dist/indexer/installations.js +14 -96
  208. package/dist/indexer/passes/dir-staleness.js +16 -9
  209. package/dist/indexer/passes/memory-inference.js +11 -9
  210. package/dist/indexer/passes/metadata.js +113 -47
  211. package/dist/indexer/scan/doc-to-entry.js +38 -1
  212. package/dist/indexer/scan/drain-dir.js +13 -23
  213. package/dist/indexer/search/db-search.js +99 -54
  214. package/dist/indexer/search/fts-query.js +47 -24
  215. package/dist/indexer/search/ranking-contributors.js +42 -20
  216. package/dist/indexer/search/ranking.js +18 -99
  217. package/dist/indexer/search/search-fields.js +7 -2
  218. package/dist/indexer/search/search-source.js +82 -93
  219. package/dist/indexer/usage/usage-events.js +0 -89
  220. package/dist/indexer/walk/file-context.js +2 -1
  221. package/dist/indexer/walk/matchers.js +30 -43
  222. package/dist/indexer/walk/path-resolver.js +7 -2
  223. package/dist/indexer/walk/walker.js +38 -12
  224. package/dist/integrations/agent/builders.js +0 -6
  225. package/dist/integrations/agent/config.js +2 -2
  226. package/dist/integrations/agent/detect.js +49 -19
  227. package/dist/integrations/agent/engine-fallback.js +76 -0
  228. package/dist/integrations/agent/profiles.js +14 -0
  229. package/dist/integrations/agent/prompts.js +12 -8
  230. package/dist/integrations/agent/runner-dispatch.js +4 -2
  231. package/dist/integrations/agent/runner.js +0 -1
  232. package/dist/integrations/agent/spawn.js +5 -6
  233. package/dist/integrations/github.js +1 -1
  234. package/dist/integrations/harnesses/aider/agent-builder.js +6 -4
  235. package/dist/integrations/harnesses/amazonq/agent-builder.js +7 -4
  236. package/dist/integrations/harnesses/claude/session-log.js +0 -10
  237. package/dist/integrations/harnesses/codex/agent-builder.js +5 -2
  238. package/dist/integrations/harnesses/copilot/agent-builder.js +5 -3
  239. package/dist/integrations/harnesses/gemini/agent-builder.js +5 -3
  240. package/dist/integrations/harnesses/index.js +3 -7
  241. package/dist/integrations/harnesses/opencode/agent-builder.js +21 -2
  242. package/dist/integrations/harnesses/opencode/session-log.js +0 -15
  243. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +13 -4
  244. package/dist/integrations/harnesses/openhands/agent-builder.js +9 -6
  245. package/dist/integrations/harnesses/pi/agent-builder.js +6 -4
  246. package/dist/integrations/lockfile.js +101 -6
  247. package/dist/integrations/session-logs/index.js +3 -28
  248. package/dist/llm/client.js +136 -100
  249. package/dist/llm/embedders/remote.js +13 -5
  250. package/dist/llm/feature-gate.js +4 -12
  251. package/dist/llm/graph-extract.js +5 -11
  252. package/dist/llm/memory-infer.js +144 -1
  253. package/dist/llm/metadata-enhance.js +5 -7
  254. package/dist/llm/structured-call.js +1 -1
  255. package/dist/llm/usage-persist.js +26 -5
  256. package/dist/llm/usage-telemetry.js +25 -2
  257. package/dist/output/cli-hints.js +1 -2
  258. package/dist/output/context.js +22 -7
  259. package/dist/output/format-exempt.js +80 -0
  260. package/dist/output/generic-render.js +259 -0
  261. package/dist/output/render-registry.js +57 -0
  262. package/dist/output/renderers.js +14 -36
  263. package/dist/output/shapes/curate.js +10 -1
  264. package/dist/output/shapes/events.js +12 -7
  265. package/dist/output/shapes/helpers.js +56 -83
  266. package/dist/output/shapes/migrate.js +8 -0
  267. package/dist/output/shapes/passthrough.js +7 -41
  268. package/dist/output/shapes/proposal/producer.js +15 -7
  269. package/dist/output/shapes.js +2 -9
  270. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  271. package/dist/output/text/bundle-show.js +7 -0
  272. package/dist/output/text/command-format.js +164 -96
  273. package/dist/output/text/env.js +1 -3
  274. package/dist/output/text/events.js +8 -7
  275. package/dist/output/text/health-format.js +103 -0
  276. package/dist/output/text/health.js +7 -0
  277. package/dist/output/text/helpers.js +10 -8
  278. package/dist/output/text/lint-format.js +43 -0
  279. package/dist/output/text/{save.js → lint.js} +2 -2
  280. package/dist/output/text/migrate.js +88 -0
  281. package/dist/output/text/proposal/producer.js +4 -2
  282. package/dist/output/text/proposal-format.js +44 -72
  283. package/dist/output/text/registry-commands.js +1 -2
  284. package/dist/output/text/show-directives.js +15 -7
  285. package/dist/output/text/status-list.js +32 -0
  286. package/dist/output/text/sync.js +5 -0
  287. package/dist/output/text/workflow-format.js +24 -203
  288. package/dist/output/text/workflow.js +1 -7
  289. package/dist/output/text.js +16 -17
  290. package/dist/registry/factory.js +4 -6
  291. package/dist/registry/origin-resolve.js +16 -27
  292. package/dist/registry/providers/skills-sh.js +3 -3
  293. package/dist/registry/providers/static-index.js +13 -23
  294. package/dist/registry/resolve.js +42 -7
  295. package/dist/registry/semver.js +34 -84
  296. package/dist/runtime.js +2 -23
  297. package/dist/scripts/akm-migrate-node.js +60290 -0
  298. package/dist/scripts/akm-migrate.js +59628 -0
  299. package/dist/setup/detect.js +42 -15
  300. package/dist/setup/registry-stash-loader.js +2 -2
  301. package/dist/setup/setup.js +236 -136
  302. package/dist/setup/steps/connection.js +7 -9
  303. package/dist/setup/steps/platforms.js +9 -9
  304. package/dist/setup/steps/semantic.js +15 -3
  305. package/dist/setup/steps/sources.js +12 -13
  306. package/dist/setup/steps/stashdir.js +2 -3
  307. package/dist/setup/steps/tasks.js +237 -120
  308. package/dist/sources/freshness.js +1 -1
  309. package/dist/sources/provider-factory.js +11 -17
  310. package/dist/sources/providers/filesystem.js +2 -3
  311. package/dist/sources/providers/git-install.js +278 -34
  312. package/dist/sources/providers/git-provider.js +25 -23
  313. package/dist/sources/providers/git-stash.js +395 -106
  314. package/dist/sources/providers/git.js +2 -2
  315. package/dist/sources/providers/npm.js +16 -19
  316. package/dist/sources/providers/provider-utils.js +7 -4
  317. package/dist/sources/providers/sync-from-ref.js +3 -9
  318. package/dist/sources/providers/website.js +6 -1
  319. package/dist/sources/resolve.js +6 -5
  320. package/dist/sources/snapshot-fetchers/bluesky.js +146 -0
  321. package/dist/sources/snapshot-fetchers/content-extract.js +566 -0
  322. package/dist/sources/snapshot-fetchers/fetcher-util.js +41 -0
  323. package/dist/sources/snapshot-fetchers/github.js +100 -0
  324. package/dist/sources/snapshot-fetchers/host-guard.js +291 -0
  325. package/dist/sources/snapshot-fetchers/registry.js +17 -1
  326. package/dist/sources/snapshot-fetchers/robots.js +348 -0
  327. package/dist/sources/snapshot-fetchers/rss.js +282 -0
  328. package/dist/sources/snapshot-fetchers/secret-seam.js +42 -0
  329. package/dist/sources/snapshot-fetchers/website-ingest.js +566 -268
  330. package/dist/sources/snapshot-fetchers/x.js +910 -0
  331. package/dist/storage/database.js +7 -0
  332. package/dist/storage/engines/sqlite-migrations.js +23 -111
  333. package/dist/storage/managed-db.js +2 -2
  334. package/dist/storage/repositories/canaries-repository.js +1 -1
  335. package/dist/storage/repositories/events-repository.js +27 -11
  336. package/dist/storage/repositories/improve-runs-repository.js +6 -12
  337. package/dist/storage/repositories/index-connection.js +17 -6
  338. package/dist/storage/repositories/index-entries-repository.js +151 -240
  339. package/dist/storage/repositories/index-entry-mapper.js +15 -11
  340. package/dist/storage/repositories/index-fts-repository.js +5 -2
  341. package/dist/storage/repositories/index-llm-cache-repository.js +0 -1
  342. package/dist/storage/repositories/index-meta-repository.js +2 -3
  343. package/dist/storage/repositories/index-schema.js +10 -25
  344. package/dist/storage/repositories/index-utility-repository.js +15 -28
  345. package/dist/storage/repositories/index-vec-repository.js +6 -1
  346. package/dist/storage/repositories/outcome-repository.js +119 -0
  347. package/dist/storage/repositories/proposals-repository.js +296 -59
  348. package/dist/storage/repositories/registry-cache.js +19 -0
  349. package/dist/storage/repositories/salience-repository.js +172 -0
  350. package/dist/storage/repositories/task-history-repository.js +15 -13
  351. package/dist/storage/repositories/workflow-runs-repository.js +52 -40
  352. package/dist/tasks/backends/cron.js +105 -15
  353. package/dist/tasks/backends/index.js +1 -1
  354. package/dist/tasks/backends/launchd.js +85 -38
  355. package/dist/tasks/backends/schtasks.js +135 -15
  356. package/dist/tasks/embedded.js +56 -40
  357. package/dist/tasks/parser.js +7 -157
  358. package/dist/tasks/resolve-akm-bin.js +137 -59
  359. package/dist/tasks/runner.js +79 -42
  360. package/dist/tasks/scheduler-invocation.js +220 -10
  361. package/dist/tasks/schema.js +24 -1
  362. package/dist/tasks/task-id.js +1 -3
  363. package/dist/tasks/validator.js +20 -6
  364. package/dist/workflows/authoring/authoring.js +94 -143
  365. package/dist/workflows/authoring/scope-key.js +1 -1
  366. package/dist/workflows/exec/frozen-judge.js +28 -2
  367. package/dist/workflows/exec/native-executor.js +77 -57
  368. package/dist/workflows/exec/param-secrets.js +9 -9
  369. package/dist/workflows/exec/run-workflow.js +133 -79
  370. package/dist/workflows/exec/step-work.js +219 -346
  371. package/dist/{migrate-storage-node.mjs → workflows/exec/unit-dispatch.js} +1 -5
  372. package/dist/workflows/ir/compile.js +141 -270
  373. package/dist/workflows/ir/freeze.js +40 -30
  374. package/dist/workflows/ir/params.js +135 -11
  375. package/dist/workflows/ir/plan-hash.js +1 -1
  376. package/dist/workflows/ir/schema.js +25 -26
  377. package/dist/workflows/parser.js +872 -307
  378. package/dist/workflows/program/expressions.js +20 -208
  379. package/dist/workflows/program/schema.js +7 -10
  380. package/dist/workflows/renderer.js +95 -68
  381. package/dist/workflows/resource-limits.js +2 -0
  382. package/dist/workflows/runtime/checkin.js +3 -3
  383. package/dist/workflows/runtime/plan-classifier.js +16 -75
  384. package/dist/workflows/runtime/runs.js +186 -127
  385. package/dist/workflows/runtime/unit-checkin.js +1 -1
  386. package/dist/workflows/runtime/unit-phases.js +2 -2
  387. package/dist/workflows/runtime/workflow-asset-loader.js +232 -83
  388. package/dist/workflows/schema.js +1 -11
  389. package/dist/workflows/validate-summary.js +30 -36
  390. package/dist/workflows/validator.js +21 -62
  391. package/docs/README.md +68 -0
  392. package/docs/migration/README.md +8 -0
  393. package/docs/migration/release-notes/0.7.0.md +11 -11
  394. package/docs/migration/release-notes/0.9.0.md +208 -27
  395. package/docs/migration/v0.7-to-v0.8.md +46 -47
  396. package/docs/migration/v0.8-to-v0.9.md +564 -208
  397. package/docs/migration/v0.9.0-troubleshooting.md +561 -0
  398. package/docs/reference/README.md +12 -0
  399. package/docs/reference/cli.md +2253 -0
  400. package/docs/reference/configuration.md +358 -0
  401. package/docs/reference/data-and-telemetry.md +105 -42
  402. package/docs/reference/workflows.md +647 -0
  403. package/package.json +22 -11
  404. package/schemas/akm-asset-envelope.json +93 -0
  405. package/schemas/akm-config.json +81 -128
  406. package/schemas/akm-workflow.json +74 -73
  407. package/dist/assets/tasks/core/backup.yml +0 -5
  408. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  409. package/dist/cli/config-migrate.js +0 -1806
  410. package/dist/cli/config-validate.js +0 -41
  411. package/dist/commands/backup-cli.js +0 -56
  412. package/dist/commands/bundle/bundle-cli.js +0 -68
  413. package/dist/commands/bundle/bundle.js +0 -219
  414. package/dist/commands/graph/graph-cli.js +0 -124
  415. package/dist/commands/graph/graph.js +0 -489
  416. package/dist/commands/improve/extract-watch.js +0 -140
  417. package/dist/commands/mv-cli.js +0 -1221
  418. package/dist/commands/sources/history.js +0 -201
  419. package/dist/commands/tasks/default-tasks.js +0 -186
  420. package/dist/core/migration-backup.js +0 -1234
  421. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -95
  422. package/dist/llm/memory-infer-impl.js +0 -138
  423. package/dist/migrate/legacy/config-source-migration.js +0 -223
  424. package/dist/migrate/legacy/content-migration.js +0 -305
  425. package/dist/migrate/legacy/legacy-layout.js +0 -779
  426. package/dist/migrate/legacy/legacy-paths.js +0 -25
  427. package/dist/migrate/legacy/legacy-stash-json.js +0 -72
  428. package/dist/migrate/legacy/proposal-fs-import.js +0 -168
  429. package/dist/migrate/legacy/task-target-ref-migration.js +0 -272
  430. package/dist/migrate/legacy/three-db-cutover.js +0 -841
  431. package/dist/migrate/legacy/workflow-migrations-bodies.js +0 -52
  432. package/dist/migrate/legacy/workflow-migrations-frozen.js +0 -21
  433. package/dist/migrate/legacy-ref-grammar.js +0 -214
  434. package/dist/output/shapes/distill.js +0 -14
  435. package/dist/output/shapes/history.js +0 -11
  436. package/dist/output/text/distill.js +0 -6
  437. package/dist/output/text/enable-disable.js +0 -8
  438. package/dist/output/text/history.js +0 -6
  439. package/dist/registry/build-index.js +0 -382
  440. package/dist/schemas/akm-config.json +0 -4704
  441. package/dist/schemas/akm-task.json +0 -87
  442. package/dist/schemas/akm-workflow.json +0 -372
  443. package/dist/scripts/migrate-storage.js +0 -3816
  444. package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
  445. package/dist/workflows/cli.js +0 -53
  446. package/dist/workflows/exec/brief.js +0 -481
  447. package/dist/workflows/exec/report.js +0 -1460
  448. package/dist/workflows/exec/watch.js +0 -116
  449. package/dist/workflows/program/parser.js +0 -813
  450. package/dist/workflows/program/project.js +0 -104
@@ -9,17 +9,14 @@
9
9
  *
10
10
  * Resolution order:
11
11
  *
12
- * 1. `$AKM_BIN` (explicit override; takes precedence everywhere).
13
- * 2. `process.execPath` alone for a Bun standalone executable.
14
- * 3. `process.execPath` + the resolved CLI script works when running
15
- * from a development checkout (`bun /repo/src/cli.ts`) and from a
16
- * compiled install (`bun /opt/akm/dist/cli.js`).
17
- * 4. `which akm` / `where akm` — last resort when the binary is on PATH
18
- * but neither override applies.
12
+ * 1. `process.execPath` alone for a Bun standalone executable.
13
+ * 2. Absolute Node plus the public `dist/akm` package launcher.
14
+ * 3. Absolute runtime plus the source/build CLI entry, classified as a
15
+ * checkout that requires explicit `--rebind` for scheduler writes.
19
16
  *
20
17
  * Returns the argv array the scheduler should execute (e.g.
21
- * `["/usr/local/bin/bun", "/repo/dist/cli.js"]`). The caller appends
22
- * subcommand args (`"tasks", "run", "<id>"`).
18
+ * `["/usr/local/bin/node", "/repo/dist/cli-node.mjs"]`). The caller appends
19
+ * subcommand args (`"task", "run", "<id>"`).
23
20
  */
24
21
  import { spawnSync } from "node:child_process";
25
22
  import fs from "node:fs";
@@ -29,74 +26,155 @@ import { ConfigError } from "../core/errors.js";
29
26
  import { mainPath as runtimeMainPath } from "../runtime.js";
30
27
  export function resolveAkmInvocation(options = {}) {
31
28
  const env = options.env ?? process.env;
32
- const override = env.AKM_BIN?.trim();
33
- if (override) {
34
- return { argv: [override], via: "AKM_BIN" };
35
- }
36
29
  const runtime = options.runtime ?? (process.versions.bun ? "bun" : "node");
37
30
  const execPath = options.execPath ?? process.execPath;
38
31
  const mainPath = options.mainPath ?? runtimeMainPath;
39
32
  const isStandaloneMain = mainPath?.startsWith("/$bunfs/") || (mainPath !== undefined && /^[A-Za-z]:[\\/]~BUN[\\/]/i.test(mainPath));
40
33
  if (runtime === "bun" && isStandaloneMain && execPath) {
41
- return { argv: [execPath], via: "execPath" };
34
+ return { argv: [absoluteInvocationPath(execPath)], via: "standalone", kind: "standalone", eligible: true };
35
+ }
36
+ const launcherPath = options.launcherPath ?? env.AKM_LAUNCHER_PATH?.trim();
37
+ const nodePath = options.nodePath ?? env.AKM_LAUNCHER_NODE?.trim() ?? (runtime === "node" ? execPath : undefined);
38
+ if (launcherPath && nodePath && isPublicPackageLauncher(launcherPath)) {
39
+ const checkout = isCheckoutLauncher(launcherPath);
40
+ let npmGlobalRoot;
41
+ if (!checkout) {
42
+ try {
43
+ npmGlobalRoot = (options.resolveNpmGlobalRoot ?? ((node) => resolveNpmGlobalRoot(node, env)))(nodePath);
44
+ }
45
+ catch {
46
+ // An unprovable package installation is intentionally ineligible.
47
+ }
48
+ }
49
+ const npmGlobal = !checkout && packageBelongsToNpmGlobalRoot(launcherPath, npmGlobalRoot);
50
+ const kind = checkout ? "checkout" : npmGlobal ? "npm" : "package-local";
51
+ return {
52
+ argv: [absoluteInvocationPath(nodePath), absoluteInvocationPath(launcherPath)],
53
+ via: kind,
54
+ kind,
55
+ eligible: npmGlobal,
56
+ };
57
+ }
58
+ const checkoutEntry = resolveCheckoutEntry(options.cliEntryUrl ?? import.meta.url, runtime, mainPath);
59
+ if (checkoutEntry && execPath) {
60
+ return {
61
+ argv: [absoluteInvocationPath(execPath), absoluteInvocationPath(checkoutEntry)],
62
+ via: "checkout",
63
+ kind: "checkout",
64
+ eligible: false,
65
+ };
42
66
  }
43
- const cliPath = resolveCliEntry(options.cliEntryUrl ?? import.meta.url);
44
- if (cliPath && execPath) {
45
- const entry = runtime === "node" ? resolveNodeCliEntry(cliPath) : cliPath;
46
- if (entry)
47
- return { argv: [execPath, entry], via: "execPath" };
67
+ throw new ConfigError("Cannot resolve absolute path to the akm binary for scheduler registration.", "INVALID_CONFIG_FILE", "Run the npm-global launcher or a standalone akm executable.");
68
+ }
69
+ function resolveCheckoutEntry(moduleUrl, runtime, mainPath) {
70
+ try {
71
+ const modulePath = fileURLToPath(moduleUrl);
72
+ const parent = path.dirname(path.dirname(modulePath));
73
+ if (runtime === "node") {
74
+ const wrapper = path.join(parent, "cli-node.mjs");
75
+ if (fs.existsSync(wrapper))
76
+ return wrapper;
77
+ if (mainPath) {
78
+ if (path.basename(mainPath) === "cli-node.mjs" && fs.existsSync(mainPath))
79
+ return mainPath;
80
+ const siblingWrapper = path.join(path.dirname(mainPath), "cli-node.mjs");
81
+ if (fs.existsSync(siblingWrapper))
82
+ return siblingWrapper;
83
+ }
84
+ return undefined;
85
+ }
86
+ const extension = path.extname(modulePath);
87
+ const candidate = path.join(parent, `cli${extension}`);
88
+ if (fs.existsSync(candidate))
89
+ return candidate;
90
+ const alternate = path.join(parent, extension === ".ts" ? "cli.js" : "cli.ts");
91
+ return fs.existsSync(alternate) ? alternate : undefined;
48
92
  }
49
- const whichBin = findOnPath("akm", env);
50
- if (whichBin) {
51
- return { argv: [whichBin], via: "which" };
93
+ catch {
94
+ return runtime === "bun" ? mainPath : undefined;
52
95
  }
53
- throw new ConfigError("Cannot resolve absolute path to the akm binary for scheduler registration.", "INVALID_CONFIG_FILE", "Set AKM_BIN to the absolute path of the akm binary, or ensure `akm` is on PATH.");
54
96
  }
55
- function resolveNodeCliEntry(cliPath) {
56
- const wrapper = path.join(path.dirname(cliPath), "cli-node.mjs");
57
- return fs.existsSync(wrapper) ? wrapper : undefined;
97
+ function absoluteInvocationPath(value) {
98
+ return path.win32.isAbsolute(value) || path.posix.isAbsolute(value) ? value : path.resolve(value);
58
99
  }
59
- /**
60
- * From the URL of a module inside `src/tasks/` figure out the CLI entry.
61
- *
62
- * • dev `…/src/tasks/resolve-akm-bin.ts` → `…/src/cli.ts`
63
- * • build `…/dist/tasks/resolve-akm-bin.js` → `…/dist/cli.js`
64
- */
65
- function resolveCliEntry(moduleUrl) {
66
- let modulePath;
100
+ function isPublicPackageLauncher(file) {
101
+ return (path.basename(file).toLowerCase() === "akm" &&
102
+ path.basename(path.dirname(file)).toLowerCase() === "dist" &&
103
+ fs.existsSync(file));
104
+ }
105
+ function isCheckoutLauncher(file) {
106
+ let launcher = path.resolve(file);
67
107
  try {
68
- modulePath = fileURLToPath(moduleUrl);
108
+ launcher = fs.realpathSync(file);
69
109
  }
70
110
  catch {
71
- return undefined;
111
+ // The caller gets a missing-path diagnostic from doctor.
72
112
  }
73
- const dir = path.dirname(modulePath); // .../tasks
74
- const parent = path.dirname(dir); // .../src or .../dist
75
- const ext = path.extname(modulePath); // .ts | .js
76
- const candidate = path.join(parent, `cli${ext}`);
77
- if (fs.existsSync(candidate))
78
- return candidate;
79
- // Fallback: try the other extension.
80
- const alt = path.join(parent, ext === ".ts" ? "cli.js" : "cli.ts");
81
- if (fs.existsSync(alt))
82
- return alt;
83
- return undefined;
113
+ const packageRoot = path.dirname(path.dirname(launcher));
114
+ return fs.existsSync(path.join(packageRoot, ".git"));
84
115
  }
85
- function findOnPath(bin, env) {
86
- const tool = process.platform === "win32" ? "where" : "which";
116
+ function packageBelongsToNpmGlobalRoot(launcherPath, npmGlobalRoot) {
117
+ if (!npmGlobalRoot)
118
+ return false;
87
119
  try {
88
- const out = spawnSync(tool, [bin], { encoding: "utf8", env });
89
- if (out.status === 0 && typeof out.stdout === "string") {
90
- const first = out.stdout
91
- .split(/\r?\n/)
92
- .map((s) => s.trim())
93
- .find(Boolean);
94
- if (first && fs.existsSync(first))
95
- return first;
96
- }
120
+ const packageRoot = path.dirname(path.dirname(fs.realpathSync(launcherPath)));
121
+ const globalRoot = fs.realpathSync(npmGlobalRoot);
122
+ const metadata = JSON.parse(fs.readFileSync(path.join(packageRoot, "package.json"), "utf8"));
123
+ return metadata.name === "akm-cli" && samePath(path.dirname(packageRoot), globalRoot);
97
124
  }
98
125
  catch {
99
- // ignore — caller will throw a ConfigError
126
+ return false;
127
+ }
128
+ }
129
+ function samePath(left, right) {
130
+ const normalize = (value) => {
131
+ const resolved = path.resolve(value);
132
+ return process.platform === "win32" ? resolved.toLowerCase() : resolved;
133
+ };
134
+ return normalize(left) === normalize(right);
135
+ }
136
+ function resolveNpmGlobalRoot(nodePath, env) {
137
+ const npmCli = resolveAssociatedNpmCli(nodePath);
138
+ if (!npmCli)
139
+ return undefined;
140
+ const result = spawnSync(absoluteInvocationPath(nodePath), [npmCli, "root", "--global"], {
141
+ encoding: "utf8",
142
+ env,
143
+ stdio: ["ignore", "pipe", "ignore"],
144
+ timeout: 5_000,
145
+ windowsHide: true,
146
+ });
147
+ if (result.status !== 0)
148
+ return undefined;
149
+ const lines = result.stdout.trim().split(/\r?\n/);
150
+ if (lines.length !== 1 || !lines[0] || !path.isAbsolute(lines[0]))
151
+ return undefined;
152
+ return lines[0];
153
+ }
154
+ function resolveAssociatedNpmCli(nodePath) {
155
+ const nodeDirs = new Set([path.dirname(absoluteInvocationPath(nodePath))]);
156
+ try {
157
+ nodeDirs.add(path.dirname(fs.realpathSync(nodePath)));
158
+ }
159
+ catch {
160
+ // The scheduler binding will separately report a missing Node path.
161
+ }
162
+ for (const binDir of nodeDirs) {
163
+ const candidates = [
164
+ ...(process.platform === "win32" ? [] : [path.join(binDir, "npm")]),
165
+ path.join(binDir, "node_modules", "npm", "bin", "npm-cli.js"),
166
+ path.join(path.dirname(binDir), "lib", "node_modules", "npm", "bin", "npm-cli.js"),
167
+ ];
168
+ for (const candidate of candidates) {
169
+ try {
170
+ const resolved = fs.realpathSync(candidate);
171
+ if (fs.statSync(resolved).isFile())
172
+ return resolved;
173
+ }
174
+ catch {
175
+ // Try the next layout associated with this Node installation.
176
+ }
177
+ }
100
178
  }
101
179
  return undefined;
102
180
  }
@@ -2,7 +2,7 @@
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
- * `akm tasks run <id>` — what cron / launchd / schtasks invoke at the
5
+ * `akm task run <id>` — what cron / launchd / schtasks invoke at the
6
6
  * scheduled moment.
7
7
  *
8
8
  * Responsibilities:
@@ -15,7 +15,7 @@
15
15
  * 3. Skip disabled tasks only when the invocation is scheduler-generated;
16
16
  * explicit manual runs are allowed for catch-up and testing.
17
17
  * 4. Dispatch by target kind:
18
- * • workflow → `startWorkflowRun(ref, params)`
18
+ * • workflow → `runWorkflowSteps({ target: ref, params })`
19
19
  * • prompt → `executeRunner(engine, prompt, { stdio: "captured" })`
20
20
  * 5. Capture stdout / stderr as structured rows in logs.db (task_logs) and,
21
21
  * transitionally, as a flat text tail at `<cacheDir>/tasks/logs/<id>/<ts>.log`
@@ -30,20 +30,23 @@ import os from "node:os";
30
30
  import path from "node:path";
31
31
  import { shouldSkipUnactivatedTask } from "../core/activation-policy.js";
32
32
  import { assertNever } from "../core/assert.js";
33
+ import { placementSpecFor } from "../core/asset/asset-placement.js";
33
34
  import { parseRefInput } from "../core/asset/resolve-ref.js";
34
35
  import { loadConfig } from "../core/config/config.js";
35
36
  import { AkmError, NotFoundError, rethrowIfTestIsolationError } from "../core/errors.js";
36
37
  import { buildTaskRunId, insertTaskLogLines, openLogsDatabase, } from "../core/logs-db.js";
37
38
  import { getTaskLogDir } from "../core/paths.js";
39
+ import { redactCredentialPatterns } from "../core/redaction.js";
38
40
  import { withStateDb } from "../core/state-db.js";
39
41
  import { runManagedSubprocess } from "../core/subprocess.js";
42
+ import { fallbackAnnouncement, NO_ENGINE_MESSAGE_SUFFIX, NO_ENGINE_REMEDY, withEngineFallback, } from "../integrations/agent/engine-fallback.js";
40
43
  import { resolveEngine, resolveLlmEngineUse } from "../integrations/agent/engine-resolution.js";
41
44
  import { resolveModel } from "../integrations/agent/model-aliases.js";
42
45
  import { executeRunner } from "../integrations/agent/runner-dispatch.js";
43
46
  import { chatCompletion } from "../llm/client.js";
44
47
  import { resolveAssetPath } from "../sources/resolve.js";
45
48
  import { decodeTaskHistoryMetadata, finalizeTaskHistoryAttempt, getTaskHistory, queryTaskHistory, reserveTaskHistoryAttempt, upsertTaskHistory, } from "../storage/repositories/task-history-repository.js";
46
- import { startWorkflowRun } from "../workflows/runtime/runs.js";
49
+ import { runWorkflowSteps } from "../workflows/exec/run-workflow.js";
47
50
  import { findBareAkmExecutableIndex } from "./command-executable.js";
48
51
  import { parseTaskDocument } from "./parser.js";
49
52
  import { resolveAkmInvocation } from "./resolve-akm-bin.js";
@@ -51,7 +54,7 @@ import { validateTaskId } from "./task-id.js";
51
54
  export const INVALID_TASK_ATTEMPT_ID = "_invalid-task-id";
52
55
  export async function runTask(id, options) {
53
56
  const runAgentImpl = options.runAgentImpl;
54
- const startWorkflowRunImpl = options.startWorkflowRunImpl ?? startWorkflowRun;
57
+ const runWorkflowStepsImpl = options.runWorkflowStepsImpl ?? runWorkflowSteps;
55
58
  const now = options.now ?? (() => new Date());
56
59
  const requestedStartedAt = now();
57
60
  try {
@@ -98,7 +101,7 @@ export async function runTask(id, options) {
98
101
  log: logPath,
99
102
  target: disabledTarget,
100
103
  };
101
- const disabledLine = `[akm tasks] task "${id}" is disabled — skipping run.`;
104
+ const disabledLine = `[akm task] task "${id}" is disabled — skipping run.`;
102
105
  persistRunLog({
103
106
  taskId: id,
104
107
  startedAtIso: startedIso,
@@ -116,7 +119,7 @@ export async function runTask(id, options) {
116
119
  logPath,
117
120
  startedAt,
118
121
  now,
119
- startWorkflowRunImpl,
122
+ runWorkflowStepsImpl,
120
123
  historyReserved: attempt.historyReserved,
121
124
  });
122
125
  }
@@ -165,7 +168,7 @@ async function runCommandTask(input) {
165
168
  const { cmd } = task.target;
166
169
  const spawnCmd = resolveNestedAkmCommand(cmd);
167
170
  const timeoutMs = task.timeoutMs !== undefined ? task.timeoutMs : null;
168
- const header = `[akm tasks] task=${task.id} kind=command cmd=${cmd.join(" ")}`;
171
+ const header = `[akm task] task=${task.id} kind=command cmd=${cmd.join(" ")}`;
169
172
  const logLines = [header];
170
173
  const dbLines = [{ line: header }];
171
174
  let exitCode = null;
@@ -246,7 +249,7 @@ function resolveNestedAkmCommand(cmd) {
246
249
  }
247
250
  // ── workflow target ─────────────────────────────────────────────────────────
248
251
  async function runWorkflowTask(input) {
249
- const { task, logPath, startedAt, now, startWorkflowRunImpl, historyReserved } = input;
252
+ const { task, logPath, startedAt, now, runWorkflowStepsImpl, historyReserved } = input;
250
253
  if (task.target.kind !== "workflow")
251
254
  throw new Error("invariant: workflow target");
252
255
  const ref = parseRefInput(task.target.ref);
@@ -254,9 +257,18 @@ async function runWorkflowTask(input) {
254
257
  throw new NotFoundError(`Task "${task.id}" workflow target must be a workflow ref (got "${task.target.ref}").`, "WORKFLOW_NOT_FOUND");
255
258
  }
256
259
  let detail;
260
+ let gateError;
257
261
  let error;
262
+ // The prompt path logs the engine-fallback announcement; a workflow-backed
263
+ // task must leave the same trace rather than silently using a chosen engine.
264
+ let runWarnings = [];
258
265
  try {
259
- detail = await startWorkflowRunImpl(task.target.ref, task.target.params);
266
+ const execution = await runWorkflowStepsImpl({ target: task.target.ref, params: task.target.params });
267
+ detail = execution.run;
268
+ runWarnings = execution.warnings ?? [];
269
+ if (execution.gateRejection) {
270
+ gateError = `Verification rejected step "${execution.gateRejection.stepId}": ${execution.gateRejection.feedback}`;
271
+ }
260
272
  }
261
273
  catch (e) {
262
274
  if (e instanceof AkmError && e.kind === "config")
@@ -264,8 +276,13 @@ async function runWorkflowTask(input) {
264
276
  error = e instanceof Error ? e : new Error(String(e));
265
277
  }
266
278
  const finishedAt = finishAttempt(startedAt, now());
267
- const status = error ? "failed" : mapWorkflowStatus(detail?.run.status);
268
- const log = renderWorkflowLog({ task, detail, error });
279
+ const status = error || gateError ? "failed" : mapWorkflowStatus(detail?.status);
280
+ const log = renderWorkflowLog({
281
+ task,
282
+ detail,
283
+ error: error ?? (gateError ? new Error(gateError) : undefined),
284
+ warnings: runWarnings,
285
+ });
269
286
  persistRunLog({
270
287
  taskId: task.id,
271
288
  startedAtIso: startedAt.toISOString(),
@@ -283,8 +300,8 @@ async function runWorkflowTask(input) {
283
300
  log: logPath,
284
301
  target: { kind: "workflow", ref: task.target.ref },
285
302
  detail: {
286
- runId: detail?.run.id,
287
- ...(error ? { error: error.message } : {}),
303
+ runId: detail?.id,
304
+ ...(error ? { error: error.message } : gateError ? { error: gateError } : {}),
288
305
  },
289
306
  };
290
307
  appendHistory(result, historyReserved);
@@ -297,10 +314,8 @@ async function runWorkflowTask(input) {
297
314
  }
298
315
  /**
299
316
  * Map the workflow runtime's status into the task-runner status space.
300
- * Workflows can legitimately remain `active` after `startWorkflowRun`
301
- * returns (multi-step workflows pause for user input); recording them as
302
- * "completed" would be misleading. We preserve "active" as a first-class
303
- * task status with exit code 0 — the OS scheduler treats it as success.
317
+ * A workflow normally reaches completed or failed in one orchestration call.
318
+ * Active remains representable for explicit engine stops such as a gate.
304
319
  *
305
320
  * The parameter is typed as the runtime's `WorkflowRunStatus` union (plus the
306
321
  * `undefined` that `detail?.run.status` can produce when no detail is present).
@@ -326,11 +341,13 @@ function mapWorkflowStatus(status) {
326
341
  }
327
342
  function renderWorkflowLog(input) {
328
343
  const dbLines = [
329
- { line: `[akm tasks] task=${input.task.id} kind=workflow ref=${input.task.target.ref}` },
344
+ { line: `[akm task] task=${input.task.id} kind=workflow ref=${input.task.target.ref}` },
330
345
  ];
346
+ for (const warning of input.warnings ?? [])
347
+ dbLines.push({ level: "warn", line: warning });
331
348
  if (input.detail) {
332
- dbLines.push({ line: `run_id=${input.detail.run.id} status=${input.detail.run.status}` });
333
- dbLines.push({ line: `workflow_title=${input.detail.run.workflowTitle}` });
349
+ dbLines.push({ line: `run_id=${input.detail.id} status=${input.detail.status}` });
350
+ dbLines.push({ line: `workflow_title=${input.detail.workflowTitle}` });
334
351
  }
335
352
  if (input.error) {
336
353
  dbLines.push({ level: "error", line: `error=${input.error.message}` });
@@ -343,10 +360,15 @@ async function runPromptTask(input) {
343
360
  if (task.target.kind !== "prompt")
344
361
  throw new Error("invariant: prompt target");
345
362
  const promptTarget = task.target;
346
- const config = loadConfig();
363
+ // Same implicit opencode-sdk fallback the workflow freeze boundary applies,
364
+ // so a scheduled prompt task on an engine-less install behaves identically.
365
+ const { config, fallbackEngineName } = withEngineFallback(loadConfig());
347
366
  const engineName = promptTarget.engine ?? config.defaults?.engine;
367
+ // `promptTarget.engine` outranks `defaults.engine`, so the fallback is only
368
+ // reportable when it is the engine actually selected.
369
+ const engineAnnouncement = fallbackAnnouncement(fallbackEngineName, engineName);
348
370
  if (!engineName)
349
- throw new NotFoundError(`Task "${task.id}" has no selected engine.`, "ASSET_NOT_FOUND");
371
+ throw new NotFoundError(`Task "${task.id}" ${NO_ENGINE_MESSAGE_SUFFIX} ${NO_ENGINE_REMEDY}`, "ASSET_NOT_FOUND");
350
372
  let runner = resolveEngine(engineName, config);
351
373
  if (runner.kind === "llm") {
352
374
  const resolved = resolveLlmEngineUse(config, [
@@ -402,7 +424,7 @@ async function runPromptTask(input) {
402
424
  },
403
425
  });
404
426
  const finishedAt = finishAttempt(startedAt, now());
405
- const log = renderPromptLog({ task, engineName, result });
427
+ const log = renderPromptLog({ task, engineName, result, engineAnnouncement });
406
428
  persistRunLog({
407
429
  taskId: task.id,
408
430
  startedAtIso: startedAt.toISOString(),
@@ -443,16 +465,26 @@ async function resolvePromptText(task, stashDir) {
443
465
  }
444
466
  // asset
445
467
  const ref = parseRefInput(src.ref);
468
+ // D11 — see the matching guard in validator.ts: `resolveAssetPath`
469
+ // (src/sources/resolve.ts) is placement-dir-only and cannot route an
470
+ // opaque adapter conceptId, which `parseRefInput` now otherwise accepts.
471
+ if (placementSpecFor(ref.type) === undefined) {
472
+ throw new NotFoundError(`Task "${task.id}" prompt asset ref "${src.ref}" is not an AKM-placed asset — adapter-owned (opaque) prompt sources are not resolvable as task inputs yet.`, "ASSET_NOT_FOUND");
473
+ }
446
474
  const assetPath = await resolveAssetPath(stashDir, ref.type, ref.name);
447
475
  return fs.readFileSync(assetPath, "utf8");
448
476
  }
449
477
  function renderPromptLog(input) {
450
478
  const lines = [];
451
479
  const dbLines = [];
452
- const header = `[akm tasks] task=${input.task.id} kind=prompt engine=${input.engineName}`;
480
+ const header = `[akm task] task=${input.task.id} kind=prompt engine=${input.engineName}`;
453
481
  const summary = `ok=${input.result.ok} exit_code=${input.result.exitCode ?? "null"} duration_ms=${input.result.durationMs}`;
454
482
  lines.push(header, summary);
455
483
  dbLines.push({ line: header }, { level: input.result.ok ? "info" : "error", line: summary });
484
+ if (input.engineAnnouncement) {
485
+ lines.push(input.engineAnnouncement);
486
+ dbLines.push({ level: "warn", line: input.engineAnnouncement });
487
+ }
456
488
  if (!input.result.ok) {
457
489
  const failure = `reason=${input.result.reason ?? ""} error=${input.result.error ?? ""}`;
458
490
  lines.push(failure);
@@ -495,14 +527,21 @@ function streamLines(text, stream, level) {
495
527
  * task_history keeps resolving for humans and older consumers) plus
496
528
  * structured rows in logs.db keyed by `buildTaskRunId(taskId, startedAt)`.
497
529
  *
530
+ * Both sinks are pattern-redacted (`redactCredentialPatterns`) before being
531
+ * written — task output is raw command/agent/LLM text that can echo a
532
+ * credential-bearing URL (e.g. a Discord webhook) nothing upstream expects to
533
+ * scrub.
534
+ *
498
535
  * The DB write is best-effort, mirroring {@link appendHistory}: an unwritable
499
536
  * logs.db must never fail a task run.
500
537
  */
501
538
  function persistRunLog(input) {
539
+ const fileText = redactCredentialPatterns(input.fileText);
540
+ const dbLines = input.dbLines.map((entry) => ({ ...entry, line: redactCredentialPatterns(entry.line) }));
502
541
  if (input.logPath) {
503
542
  try {
504
543
  fs.mkdirSync(path.dirname(input.logPath), { recursive: true });
505
- fs.writeFileSync(input.logPath, input.fileText);
544
+ fs.writeFileSync(input.logPath, fileText);
506
545
  }
507
546
  catch (error) {
508
547
  rethrowIfTestIsolationError(error);
@@ -516,7 +555,7 @@ function persistRunLog(input) {
516
555
  taskId: input.taskId,
517
556
  runId: buildTaskRunId(input.taskId, input.startedAtIso),
518
557
  ts: input.finishedAtIso,
519
- lines: input.dbLines,
558
+ lines: dbLines,
520
559
  });
521
560
  }
522
561
  finally {
@@ -597,7 +636,7 @@ export function recordTaskAttemptFailure(input) {
597
636
  const finishedAtIso = finishedAt.toISOString();
598
637
  const errorCode = safeTaskAttemptErrorCode(input.failure);
599
638
  const logPath = resolveTaskLogPath(input.logDir, taskId, startedAtIso);
600
- const line = `[akm tasks] status=failed reason=${input.reason} code=${errorCode}`;
639
+ const line = `[akm task] status=failed reason=${input.reason} code=${errorCode}`;
601
640
  const result = {
602
641
  id: taskId,
603
642
  status: "failed",
@@ -650,19 +689,13 @@ function appendHistory(result, historyReserved = false) {
650
689
  }
651
690
  export function readTaskHistory(options = {}) {
652
691
  return withStateDb((db) => {
653
- let rows;
692
+ if (options.limit === 0)
693
+ return [];
654
694
  if (options.id) {
655
695
  const row = getTaskHistory(db, options.id);
656
- rows = row ? [taskHistoryRowToResult(row)] : [];
657
- }
658
- else {
659
- rows = queryTaskHistory(db, {}).map(taskHistoryRowToResult);
660
- }
661
- rows.sort((a, b) => (a.startedAt < b.startedAt ? 1 : -1));
662
- if (options.limit !== undefined && options.limit >= 0) {
663
- return rows.slice(0, options.limit);
696
+ return row ? [taskHistoryRowToResult(row)] : [];
664
697
  }
665
- return rows;
698
+ return queryTaskHistory(db, options.limit !== undefined && options.limit > 0 ? { limit: options.limit } : {}).map(taskHistoryRowToResult);
666
699
  });
667
700
  }
668
701
  /**
@@ -676,19 +709,23 @@ function taskHistoryRowToResult(row) {
676
709
  : row.target_kind === "command"
677
710
  ? { kind: "command" }
678
711
  : row.target_kind === "prompt"
679
- ? meta.metadataVersion === 2
680
- ? { kind: "prompt", engine: meta.engine ?? null }
681
- : { kind: "prompt", engine: null, ...(meta.legacyProfile ? { legacyProfile: meta.legacyProfile } : {}) }
712
+ ? meta.metadataVersion === 1
713
+ ? {
714
+ kind: "prompt",
715
+ engine: null,
716
+ ...(meta.legacyProfile !== undefined ? { legacyProfile: meta.legacyProfile } : {}),
717
+ }
718
+ : { kind: "prompt", engine: meta.engine ?? null }
682
719
  : { kind: "unknown" };
683
720
  return {
684
721
  id: row.task_id,
685
722
  status: row.status,
686
723
  startedAt: row.started_at,
687
724
  finishedAt: row.completed_at ?? row.failed_at ?? row.started_at,
688
- durationMs: meta.durationMs ?? 0,
725
+ durationMs: meta.durationMs,
689
726
  log: row.log_path ?? "",
690
727
  target,
691
- ...(meta.detail !== undefined && meta.detail !== null ? { detail: meta.detail } : {}),
728
+ ...(meta.detail ? { detail: meta.detail } : {}),
692
729
  };
693
730
  }
694
731
  /**