akm-cli 0.10.261012-beta → 0.10.261014-beta

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 (518) hide show
  1. package/CHANGELOG.md +710 -3
  2. package/README.md +15 -0
  3. package/SECURITY.md +11 -10
  4. package/STABILITY.md +47 -51
  5. package/dist/assets/hints/cli-hints-full.md +21 -19
  6. package/dist/assets/hints/cli-hints-short.md +3 -4
  7. package/dist/assets/opencode/akm-plugin.js +177 -0
  8. package/dist/assets/stash-skeleton/README.md +1 -1
  9. package/dist/assets/tasks/core/improve.yml +1 -1
  10. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +1 -1
  11. package/dist/assets/ui/config.js +27 -10
  12. package/dist/assets/workflows/workflow-template.md +2 -2
  13. package/dist/cli/clack.js +3 -1
  14. package/dist/cli/selection.js +33 -0
  15. package/dist/cli/shared.js +14 -1
  16. package/dist/cli/unknown-flags.js +6 -37
  17. package/dist/cli.js +69 -48
  18. package/dist/commands/agent/agent-dispatch.js +17 -25
  19. package/dist/commands/agent/contribute-cli.js +9 -8
  20. package/dist/commands/command/command-cli.js +4 -8
  21. package/dist/commands/command/command-execution.js +25 -39
  22. package/dist/commands/command/execution-source-loader.js +10 -14
  23. package/dist/commands/completions.js +1 -1
  24. package/dist/commands/config-cli.js +14 -5
  25. package/dist/commands/env/child-env.js +12 -14
  26. package/dist/commands/env/env-binding.js +47 -58
  27. package/dist/commands/env/env-cli.js +22 -24
  28. package/dist/commands/env/env.js +10 -58
  29. package/dist/commands/env/secret-cli.js +11 -29
  30. package/dist/commands/env/secret.js +3 -10
  31. package/dist/commands/health/checks.js +10 -849
  32. package/dist/commands/health/connections-and-harnesses-check.js +109 -0
  33. package/dist/commands/health/egress.js +3 -3
  34. package/dist/commands/health/html-report.js +9 -10
  35. package/dist/commands/health/plugin-staleness.js +18 -11
  36. package/dist/commands/health/report-view-model.js +16 -12
  37. package/dist/commands/health/scheduler-binary.js +1 -1
  38. package/dist/commands/health/semantic-search-check.js +85 -0
  39. package/dist/commands/health/type-directory-check.js +0 -3
  40. package/dist/commands/health.js +30 -42
  41. package/dist/commands/improve/consolidate/pair-pass.js +10 -25
  42. package/dist/commands/improve/consolidate.js +10 -15
  43. package/dist/commands/improve/distill.js +5 -17
  44. package/dist/commands/improve/eligibility.js +1 -3
  45. package/dist/commands/improve/execution.js +37 -40
  46. package/dist/commands/improve/extract-cli.js +6 -11
  47. package/dist/commands/improve/extract-prompt.js +2 -2
  48. package/dist/commands/improve/extract.js +67 -97
  49. package/dist/commands/improve/improve-cli.js +22 -128
  50. package/dist/commands/improve/improve-report.js +1 -1
  51. package/dist/commands/improve/improve-strategies.js +25 -108
  52. package/dist/commands/improve/improve.js +10 -14
  53. package/dist/commands/improve/loop-stages.js +3 -0
  54. package/dist/commands/improve/memory/memory-improve.js +1 -1
  55. package/dist/commands/improve/preparation.js +8 -13
  56. package/dist/commands/improve/reflect.js +203 -332
  57. package/dist/commands/improve/retrieval-scope.js +1 -1
  58. package/dist/commands/improve/session-asset.js +3 -2
  59. package/dist/commands/improve/stage.js +87 -115
  60. package/dist/commands/lint/base-linter.js +3 -3
  61. package/dist/commands/lint/env-key-rules.js +7 -6
  62. package/dist/commands/lint/index.js +3 -3
  63. package/dist/commands/models-cli.js +103 -63
  64. package/dist/commands/proposal/drain.js +26 -39
  65. package/dist/commands/proposal/proposal-cli.js +14 -18
  66. package/dist/commands/proposal/propose-cli.js +4 -2
  67. package/dist/commands/proposal/propose.js +37 -64
  68. package/dist/commands/proposal/repository.js +17 -17
  69. package/dist/commands/proposal/validators/proposal-validators.js +3 -6
  70. package/dist/commands/read/curate.js +10 -6
  71. package/dist/commands/read/registry-search.js +2 -48
  72. package/dist/commands/read/search-cli.js +1 -8
  73. package/dist/commands/read/search.js +5 -6
  74. package/dist/commands/read/show.js +6 -29
  75. package/dist/commands/remember.js +25 -40
  76. package/dist/commands/sources/add-cli.js +8 -63
  77. package/dist/commands/sources/bundle-cli.js +8 -9
  78. package/dist/commands/sources/bundle-config-ops.js +2 -2
  79. package/dist/commands/sources/info.js +12 -1
  80. package/dist/commands/sources/init.js +1 -1
  81. package/dist/commands/sources/installed-stashes.js +119 -63
  82. package/dist/commands/sources/migration-help.js +1 -1
  83. package/dist/commands/sources/plugin-upgrade.js +8 -15
  84. package/dist/commands/sources/schema-repair.js +4 -10
  85. package/dist/commands/sources/source-add.js +2 -2
  86. package/dist/commands/sources/source-clone.js +31 -7
  87. package/dist/commands/sources/source-manage.js +4 -4
  88. package/dist/commands/targets.js +175 -0
  89. package/dist/commands/tasks/explain.js +104 -69
  90. package/dist/commands/tasks/tasks-cli.js +9 -11
  91. package/dist/commands/tasks/tasks.js +75 -97
  92. package/dist/commands/ui/api.js +11 -3
  93. package/dist/commands/ui/redact.js +5 -31
  94. package/dist/commands/ui/workspace-actions.js +1 -1
  95. package/dist/commands/workflow/plan.js +48 -9
  96. package/dist/commands/workflow-cli.js +40 -45
  97. package/dist/core/adapter/adapters/agent-skills-adapter.js +10 -11
  98. package/dist/core/adapter/adapters/akm-adapter.js +36 -41
  99. package/dist/core/adapter/adapters/akm-lint.js +10 -12
  100. package/dist/core/adapter/adapters/akm-metadata.js +2 -2
  101. package/dist/core/adapter/adapters/akm-task-adapter.js +8 -9
  102. package/dist/core/adapter/adapters/akm-workflow-adapter.js +5 -5
  103. package/dist/core/adapter/adapters/claude-adapter.js +1 -1
  104. package/dist/core/adapter/adapters/dotenv-adapter.js +7 -6
  105. package/dist/core/adapter/adapters/generic-files-adapter.js +5 -5
  106. package/dist/core/adapter/adapters/index.js +3 -4
  107. package/dist/core/adapter/adapters/llm-wiki-adapter.js +12 -14
  108. package/dist/core/adapter/adapters/okf-adapter.js +8 -10
  109. package/dist/core/adapter/adapters/opencode-adapter.js +1 -1
  110. package/dist/core/adapter/adapters/shared.js +3 -3
  111. package/dist/core/adapter/adapters/tool-dir-shared.js +7 -25
  112. package/dist/core/adapter/adapters/website-snapshot-adapter.js +3 -3
  113. package/dist/core/adapter/detect-adapter.js +1 -1
  114. package/dist/core/adapter/execution-source.js +13 -35
  115. package/dist/core/adapter/registry.js +1 -1
  116. package/dist/core/adapter/validate-context.js +2 -4
  117. package/dist/core/asset/asset-placement.js +1 -1
  118. package/dist/core/asset/asset-ref.js +3 -3
  119. package/dist/core/asset/resolve-ref.js +5 -0
  120. package/dist/core/bundle-rename.js +12 -4
  121. package/dist/core/closest-match.js +37 -0
  122. package/dist/core/common.js +37 -57
  123. package/dist/core/config/config-io.js +26 -18
  124. package/dist/core/config/config-schema.js +19 -106
  125. package/dist/core/config/config-sources.js +3 -3
  126. package/dist/core/config/config-types.js +4 -4
  127. package/dist/core/config/config-walker.js +50 -77
  128. package/dist/core/config/config.js +438 -109
  129. package/dist/core/config/convert-engine-references.js +114 -0
  130. package/dist/core/config/convert-engines-shared.js +40 -0
  131. package/dist/core/config/convert-engines.js +300 -0
  132. package/dist/core/config/convert-models-overlay.js +137 -0
  133. package/dist/core/config/credentials.js +304 -0
  134. package/dist/core/config/engine-semantics.js +3 -3
  135. package/dist/core/config/migrate-keys.js +222 -0
  136. package/dist/core/config/model-aliases.js +37 -0
  137. package/dist/core/config/models-file.js +34 -0
  138. package/dist/core/config/retired-engines.js +53 -0
  139. package/dist/core/config/schema/connections.js +41 -0
  140. package/dist/core/config/schema/embedding.js +2 -2
  141. package/dist/core/config/schema/harnesses.js +41 -0
  142. package/dist/core/config/schema/improve-processes.js +9 -28
  143. package/dist/core/config/schema/improve.js +36 -1
  144. package/dist/core/config/schema/index-config.js +18 -20
  145. package/dist/core/config/schema/primitives.js +42 -17
  146. package/dist/core/config/schema/search.js +6 -11
  147. package/dist/core/config/schema/sources-bundles.js +9 -9
  148. package/dist/core/config/schema/workflow.js +2 -6
  149. package/dist/core/config/unusable-entries.js +66 -0
  150. package/dist/core/content-safety.js +3 -6
  151. package/dist/core/endpoint-url.js +47 -0
  152. package/dist/core/env-secret-ref.js +84 -73
  153. package/dist/core/errors.js +10 -16
  154. package/dist/core/extra-params.js +3 -3
  155. package/dist/core/improve-result.js +8 -9
  156. package/dist/core/json-schema.js +1 -1
  157. package/dist/core/lesson-lint.js +1 -1
  158. package/dist/core/llm-inference.js +80 -0
  159. package/dist/core/parse.js +2 -2
  160. package/dist/core/paths.js +33 -10
  161. package/dist/core/recognition-util.js +8 -10
  162. package/dist/core/redaction.js +94 -55
  163. package/dist/core/ref-token.js +82 -0
  164. package/dist/core/secret-value.js +14 -0
  165. package/dist/core/state/migrations.js +17 -22
  166. package/dist/core/structured.js +2 -68
  167. package/dist/core/subprocess.js +63 -22
  168. package/dist/core/type-presentation.js +10 -14
  169. package/dist/core/write-source.js +20 -4
  170. package/dist/execution/input-contract.js +3 -6
  171. package/dist/execution/notices.js +49 -0
  172. package/dist/execution/resolved-request.js +24 -40
  173. package/dist/execution/source.js +21 -45
  174. package/dist/execution/target-ref.js +2 -2
  175. package/dist/indexer/bundle-identity-guard.js +6 -5
  176. package/dist/indexer/ensure-index.js +1 -1
  177. package/dist/indexer/index-writer-lock.js +1 -1
  178. package/dist/indexer/indexer.js +46 -42
  179. package/dist/indexer/installations.js +12 -22
  180. package/dist/indexer/lookup/adapter-concept-owner.js +40 -14
  181. package/dist/indexer/materialize-embeddings.js +20 -16
  182. package/dist/indexer/passes/memory-inference.js +21 -50
  183. package/dist/indexer/passes/metadata.js +5 -5
  184. package/dist/indexer/scan/doc-to-entry.js +1 -1
  185. package/dist/indexer/scan/drain-dir.js +9 -11
  186. package/dist/indexer/search/db-search.js +9 -7
  187. package/dist/indexer/search/search-source.js +42 -22
  188. package/dist/indexer/usage/usage-events.js +2 -3
  189. package/dist/indexer/walk/index-context.js +2 -1
  190. package/dist/indexer/walk/matchers.js +3 -11
  191. package/dist/indexer/walk/path-resolver.js +13 -68
  192. package/dist/indexer/walk/walker.js +32 -26
  193. package/dist/integrations/agent/akm-read-tools.js +81 -0
  194. package/dist/integrations/agent/config.js +1 -1
  195. package/dist/integrations/agent/detect.js +32 -36
  196. package/dist/integrations/agent/execution.js +130 -428
  197. package/dist/integrations/agent/index.js +1 -1
  198. package/dist/integrations/agent/profiles.js +24 -28
  199. package/dist/integrations/agent/prompts.js +17 -30
  200. package/dist/integrations/agent/request-lowering.js +67 -101
  201. package/dist/integrations/agent/resolution.js +332 -0
  202. package/dist/integrations/agent/runner-dispatch.js +156 -181
  203. package/dist/integrations/agent/runner.js +20 -70
  204. package/dist/integrations/agent/runtime-port.js +4 -0
  205. package/dist/integrations/agent/runtime.js +10 -0
  206. package/dist/integrations/agent/spawn.js +65 -190
  207. package/dist/integrations/harnesses/aider/index.js +19 -39
  208. package/dist/integrations/harnesses/amazonq/index.js +17 -32
  209. package/dist/integrations/harnesses/claude/index.js +59 -28
  210. package/dist/integrations/harnesses/claude/session-log.js +7 -5
  211. package/dist/integrations/harnesses/codex/index.js +19 -31
  212. package/dist/integrations/harnesses/copilot/index.js +17 -35
  213. package/dist/integrations/harnesses/gemini/index.js +18 -34
  214. package/dist/integrations/harnesses/harness.js +36 -0
  215. package/dist/integrations/harnesses/index.js +20 -51
  216. package/dist/integrations/harnesses/opencode/agent-builder.js +132 -100
  217. package/dist/integrations/harnesses/opencode/index.js +11 -33
  218. package/dist/integrations/harnesses/opencode/roots.js +50 -0
  219. package/dist/integrations/harnesses/opencode/runtime/binary.js +206 -0
  220. package/dist/integrations/harnesses/opencode/runtime/command.js +152 -0
  221. package/dist/integrations/harnesses/opencode/runtime/index.js +177 -0
  222. package/dist/integrations/harnesses/opencode/runtime/tar.js +107 -0
  223. package/dist/integrations/harnesses/opencode/session-log-v1.js +15 -7
  224. package/dist/integrations/harnesses/opencode/session-log-v2.js +72 -48
  225. package/dist/integrations/harnesses/opencode/session-log.js +58 -137
  226. package/dist/integrations/harnesses/opencode/version.js +34 -53
  227. package/dist/integrations/harnesses/openhands/index.js +13 -37
  228. package/dist/integrations/harnesses/pi/index.js +21 -32
  229. package/dist/integrations/lockfile.js +1 -1
  230. package/dist/integrations/session-logs/index.js +11 -31
  231. package/dist/llm/client.js +93 -111
  232. package/dist/llm/embedder.js +19 -34
  233. package/dist/llm/embedders/connection.js +31 -0
  234. package/dist/llm/embedders/local-model-files.js +56 -0
  235. package/dist/llm/embedders/local.js +146 -115
  236. package/dist/llm/embedders/remote.js +26 -23
  237. package/dist/llm/embedders/types.js +1 -1
  238. package/dist/llm/index-passes.js +33 -39
  239. package/dist/llm/memory-infer.js +67 -77
  240. package/dist/llm/model-list.js +35 -0
  241. package/dist/llm/rerank-client.js +8 -14
  242. package/dist/llm/structured-call.js +45 -99
  243. package/dist/llm/structured.js +60 -0
  244. package/dist/output/renderers.js +2 -8
  245. package/dist/output/shapes/helpers.js +18 -44
  246. package/dist/output/shapes/passthrough.js +1 -0
  247. package/dist/output/shapes.js +1 -7
  248. package/dist/output/text/command-format.js +41 -39
  249. package/dist/output/text/health-format.js +8 -2
  250. package/dist/output/text/helpers.js +1 -1
  251. package/dist/output/text/migrate.js +12 -0
  252. package/dist/output/text/models.js +3 -2
  253. package/dist/output/text/registry-commands.js +1 -2
  254. package/dist/output/text/show-directives.js +16 -28
  255. package/dist/output/text/show-format.js +0 -2
  256. package/dist/output/text/targets-table.js +70 -0
  257. package/dist/output/text/workflow-format.js +44 -15
  258. package/dist/output/text.js +1 -1
  259. package/dist/registry/providers/skills-sh.js +1 -28
  260. package/dist/registry/providers/static-index.js +1 -71
  261. package/dist/runtime.js +6 -2
  262. package/dist/scripts/akm-migrate-node.js +47095 -44905
  263. package/dist/scripts/akm-migrate.js +46946 -44755
  264. package/dist/setup/detect.js +28 -273
  265. package/dist/setup/endpoint.js +36 -0
  266. package/dist/setup/semantic-assets.js +13 -19
  267. package/dist/setup/setup-flags.js +77 -0
  268. package/dist/setup/setup-plan.js +144 -0
  269. package/dist/setup/setup.js +134 -358
  270. package/dist/setup/steps/connection-shared.js +49 -101
  271. package/dist/setup/steps/connection.js +121 -524
  272. package/dist/setup/steps/embeddings.js +151 -0
  273. package/dist/setup/steps/harnesses.js +118 -0
  274. package/dist/setup/steps/platforms.js +2 -81
  275. package/dist/setup/steps/tasks.js +1 -2
  276. package/dist/setup/steps.js +10 -0
  277. package/dist/setup/summary.js +67 -0
  278. package/dist/sources/freshness.js +16 -21
  279. package/dist/sources/providers/git-provider.js +2 -9
  280. package/dist/sources/providers/provider-utils.js +13 -5
  281. package/dist/sources/resolve.js +12 -16
  282. package/dist/sources/snapshot-fetchers/robots.js +11 -12
  283. package/dist/sources/snapshot-fetchers/secret-seam.js +2 -4
  284. package/dist/sources/snapshot-fetchers/website-ingest.js +8 -15
  285. package/dist/sources/snapshot-fetchers/x.js +1 -1
  286. package/dist/standalone/onnxruntime-library.js +52 -0
  287. package/dist/storage/repositories/improve-ledger-repository.js +1 -1
  288. package/dist/storage/repositories/improve-runs-repository.js +0 -13
  289. package/dist/storage/repositories/index-entries-repository.js +2 -2
  290. package/dist/storage/repositories/proposals-repository.js +2 -2
  291. package/dist/storage/repositories/task-history-repository.js +2 -2
  292. package/dist/storage/repositories/workflow-runs-repository.js +44 -129
  293. package/dist/storage/sqlite-read-snapshot.js +33 -29
  294. package/dist/tasks/embedded.js +1 -1
  295. package/dist/tasks/log-redaction.js +7 -119
  296. package/dist/tasks/prepare/prepare-support.js +8 -7
  297. package/dist/tasks/prepare/prepare.js +8 -9
  298. package/dist/tasks/prepare/script-capture.js +9 -25
  299. package/dist/tasks/run/attempt-lifecycle.js +17 -35
  300. package/dist/tasks/run/load-task.js +54 -27
  301. package/dist/tasks/run/run-command-task.js +15 -10
  302. package/dist/tasks/run/run-native-task.js +8 -21
  303. package/dist/tasks/run/run-task.js +5 -8
  304. package/dist/tasks/run/run-workflow-task.js +14 -21
  305. package/dist/tasks/run/task-history.js +9 -17
  306. package/dist/tasks/run/task-log.js +1 -5
  307. package/dist/tasks/scheduler-invocation.js +13 -18
  308. package/dist/tasks/scheduler-sync.js +0 -1
  309. package/dist/tasks/source/bounded-document.js +31 -117
  310. package/dist/tasks/source/parse-task-source.js +0 -1
  311. package/dist/tasks/source/project-v4.js +5 -3
  312. package/dist/tasks/source/task-input-diagnostics.js +3 -4
  313. package/dist/tasks/source/task-source-v4.js +48 -72
  314. package/dist/tasks/source-v3.js +2 -5
  315. package/dist/tasks/task-run-reserved-flags.js +1 -2
  316. package/dist/workflows/authoring/authoring.js +2 -7
  317. package/dist/workflows/compile.js +1 -15
  318. package/dist/workflows/concurrency-policy.js +4 -4
  319. package/dist/workflows/exec/child-workflow.js +1 -4
  320. package/dist/workflows/exec/dispatch-redaction.js +35 -86
  321. package/dist/workflows/exec/environment.js +13 -77
  322. package/dist/workflows/exec/exec-unit.js +14 -55
  323. package/dist/workflows/exec/frozen-judge.js +26 -28
  324. package/dist/workflows/exec/native-executor.js +126 -71
  325. package/dist/workflows/exec/run-workflow.js +38 -42
  326. package/dist/workflows/exec/step-work.js +13 -17
  327. package/dist/workflows/exec/unit-dispatch.js +7 -21
  328. package/dist/workflows/freeze/environment.js +14 -119
  329. package/dist/workflows/freeze/freeze.js +14 -33
  330. package/dist/workflows/freeze/step-values.js +6 -13
  331. package/dist/workflows/freeze/targets/child-workflow.js +3 -5
  332. package/dist/workflows/freeze/targets/command.js +9 -15
  333. package/dist/workflows/freeze/targets/shell.js +0 -3
  334. package/dist/workflows/freeze/task-bindings.js +0 -1
  335. package/dist/workflows/parser.js +50 -59
  336. package/dist/workflows/plan.js +8 -2
  337. package/dist/workflows/renderer.js +83 -9
  338. package/dist/workflows/resource-limits.js +2 -2
  339. package/dist/workflows/runtime/run-plan.js +38 -23
  340. package/dist/workflows/runtime/runs.js +55 -93
  341. package/dist/workflows/runtime/workflow-asset-loader.js +55 -86
  342. package/dist/workflows/source-files.js +7 -19
  343. package/docs/README.md +10 -16
  344. package/docs/architecture/README.md +2 -37
  345. package/docs/architecture/adapters.md +2 -2
  346. package/docs/architecture/akm-core-principles.md +256 -118
  347. package/docs/architecture/architecture.md +283 -99
  348. package/docs/architecture/improvement.md +8 -2
  349. package/docs/architecture/internals/classification.md +1 -3
  350. package/docs/architecture/internals/fresh-host-rebuild-runbook.md +7 -6
  351. package/docs/architecture/internals/health-advisories.md +35 -74
  352. package/docs/architecture/internals/improve-workflow.md +27 -26
  353. package/docs/architecture/internals/indexing.md +3 -3
  354. package/docs/architecture/internals/storage-locations.md +48 -15
  355. package/docs/architecture/persisted-data-compat.md +10 -6
  356. package/docs/architecture/specs/okf-support.md +9 -11
  357. package/docs/architecture/specs/ref.md +7 -9
  358. package/docs/architecture/testing/testing-workflow.md +172 -52
  359. package/docs/architecture/workflow-engine.md +51 -34
  360. package/docs/guides/README.md +0 -1
  361. package/docs/guides/author-bundles.md +15 -20
  362. package/docs/guides/author-workflows.md +93 -71
  363. package/docs/guides/bundles.md +20 -16
  364. package/docs/guides/discover-and-load.md +1 -1
  365. package/docs/guides/getting-started.md +49 -3
  366. package/docs/guides/improve-the-library.md +10 -4
  367. package/docs/guides/recipes/headless-install.md +11 -16
  368. package/docs/guides/run-workflows.md +29 -20
  369. package/docs/guides/scheduling.md +2 -2
  370. package/docs/guides/use-with-any-agent.md +20 -22
  371. package/docs/integration/bundling-akm.md +19 -9
  372. package/docs/maintainers/README.md +2 -6
  373. package/docs/maintainers/release-checklist.md +73 -126
  374. package/docs/migration/README.md +10 -3
  375. package/docs/migration/release-notes/0.10.0.md +81 -16
  376. package/docs/migration/release-notes/0.6.0.md +1 -1
  377. package/docs/migration/release-notes/0.7.0.md +1 -1
  378. package/docs/migration/release-notes/0.9.0.md +1 -1
  379. package/docs/migration/release-notes/README.md +1 -1
  380. package/docs/migration/v0.9-to-v0.10.md +300 -60
  381. package/docs/migration/v0.9.1-to-v0.9.2.md +6 -5
  382. package/docs/posts/config-v2-lessons-16.md +1 -1
  383. package/docs/posts/llm-mode-reflect-13.md +1 -1
  384. package/docs/posts/release-0.6.0.md +11 -11
  385. package/docs/posts/release-0.8.0.md +4 -4
  386. package/docs/posts/workflows-vaults-09.md +1 -1
  387. package/docs/reference/README.md +1 -1
  388. package/docs/reference/asset-types.md +2 -2
  389. package/docs/reference/cli.md +477 -388
  390. package/docs/reference/configuration.md +569 -550
  391. package/docs/reference/data-and-telemetry.md +9 -6
  392. package/docs/reference/env-and-secrets.md +72 -15
  393. package/docs/reference/refs.md +3 -20
  394. package/docs/reference/registry.md +12 -38
  395. package/docs/reference/supported-formats.md +1 -1
  396. package/docs/reference/tasks.md +22 -11
  397. package/docs/reference/ui-api.md +14 -9
  398. package/docs/reference/workflow-schema.md +199 -154
  399. package/docs/reference/workflows.md +4 -6
  400. package/package.json +9 -11
  401. package/schemas/akm-config.json +1696 -2922
  402. package/schemas/akm-task.json +4 -4
  403. package/schemas/akm-workflow.json +36 -9
  404. package/ROADMAP.md +0 -112
  405. package/dist/assets/models.json +0 -35
  406. package/dist/commands/health/engine-usage.js +0 -45
  407. package/dist/commands/sources/dangerous-env-audit.js +0 -134
  408. package/dist/core/activation-policy.js +0 -67
  409. package/dist/core/config/schema/engines.js +0 -160
  410. package/dist/core/config/schema/execution.js +0 -23
  411. package/dist/core/spawn-env.js +0 -268
  412. package/dist/execution/directory-identity.js +0 -78
  413. package/dist/integrations/agent/builder-shared.js +0 -33
  414. package/dist/integrations/agent/builders.js +0 -43
  415. package/dist/integrations/agent/engine-fallback.js +0 -59
  416. package/dist/integrations/agent/engine-resolution.js +0 -333
  417. package/dist/integrations/agent/model-map.js +0 -475
  418. package/dist/integrations/harnesses/aider/agent-builder.js +0 -107
  419. package/dist/integrations/harnesses/aider/result-extractor.js +0 -53
  420. package/dist/integrations/harnesses/amazonq/agent-builder.js +0 -138
  421. package/dist/integrations/harnesses/amazonq/result-extractor.js +0 -48
  422. package/dist/integrations/harnesses/claude/agent-builder.js +0 -106
  423. package/dist/integrations/harnesses/claude/config-import.js +0 -67
  424. package/dist/integrations/harnesses/claude/result-extractor.js +0 -67
  425. package/dist/integrations/harnesses/codex/agent-builder.js +0 -150
  426. package/dist/integrations/harnesses/codex/result-extractor.js +0 -110
  427. package/dist/integrations/harnesses/copilot/agent-builder.js +0 -117
  428. package/dist/integrations/harnesses/copilot/result-extractor.js +0 -178
  429. package/dist/integrations/harnesses/gemini/agent-builder.js +0 -114
  430. package/dist/integrations/harnesses/gemini/result-extractor.js +0 -149
  431. package/dist/integrations/harnesses/opencode/config-import.js +0 -149
  432. package/dist/integrations/harnesses/opencode/model-config.js +0 -33
  433. package/dist/integrations/harnesses/opencode/model-work-agent.js +0 -115
  434. package/dist/integrations/harnesses/opencode/session-log-types.js +0 -12
  435. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -44
  436. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +0 -1052
  437. package/dist/integrations/harnesses/opencode-sdk/v1-adapter.js +0 -199
  438. package/dist/integrations/harnesses/opencode-sdk/v2-adapter.js +0 -254
  439. package/dist/integrations/harnesses/opencode-sdk/wire.js +0 -66
  440. package/dist/integrations/harnesses/openhands/agent-builder.js +0 -120
  441. package/dist/integrations/harnesses/openhands/result-extractor.js +0 -135
  442. package/dist/integrations/harnesses/pi/agent-builder.js +0 -89
  443. package/dist/integrations/harnesses/pi/result-extractor.js +0 -168
  444. package/dist/integrations/harnesses/shared.js +0 -18
  445. package/dist/integrations/harnesses/types.js +0 -55
  446. package/dist/llm/feature-gate.js +0 -115
  447. package/dist/output/shapes/models-list.js +0 -16
  448. package/dist/output/shapes/registry-search.js +0 -10
  449. package/dist/setup/detected-engines.js +0 -136
  450. package/dist/setup/engine-config.js +0 -97
  451. package/dist/setup/harness-config-import.js +0 -47
  452. package/dist/setup/providers.js +0 -14
  453. package/dist/setup/steps/semantic.js +0 -39
  454. package/dist/workflows/authoring/scope-key.js +0 -79
  455. package/dist/workflows/exec/lowering-notices.js +0 -23
  456. package/dist/workflows/source-semantics.js +0 -110
  457. package/docs/architecture/0.10-process-rules.md +0 -832
  458. package/docs/architecture/akm-architecture-decision-history.md +0 -2055
  459. package/docs/architecture/comparisons/claude-code-vs-akm-workflows-full.md +0 -550
  460. package/docs/architecture/decisions/0001-no-interpolation-attached-structured-context.md +0 -72
  461. package/docs/architecture/decisions/0002-unit-reuse-and-input-hash-scope.md +0 -142
  462. package/docs/architecture/decisions/0003-child-env-allowlist-and-provenance.md +0 -189
  463. package/docs/architecture/decisions/0004-task-input-contract-and-flag-coercion.md +0 -97
  464. package/docs/architecture/decisions/0005-task-result-vocabulary-and-legacy-read-mapping.md +0 -108
  465. package/docs/architecture/decisions/0006-task-source-version-routing.md +0 -124
  466. package/docs/architecture/decisions/0007-workflow-composition-bounds.md +0 -83
  467. package/docs/architecture/decisions/0008-task-binding-normalization.md +0 -88
  468. package/docs/architecture/decisions/0009-child-run-publication-column-parity.md +0 -80
  469. package/docs/architecture/decisions/0010-driver-protocol-cut.md +0 -36
  470. package/docs/architecture/decisions/0011-engine-run-loop-invariants.md +0 -125
  471. package/docs/architecture/decisions/README.md +0 -62
  472. package/docs/architecture/internals/functional-contract-patterns.md +0 -340
  473. package/docs/architecture/internals/registry-network-boundary.md +0 -57
  474. package/docs/architecture/internals/search.md +0 -248
  475. package/docs/architecture/reviews/env-secret-access.md +0 -319
  476. package/docs/architecture/runtime-boundary-design.md +0 -153
  477. package/docs/architecture/specs/0.9.0-close-out-plan.md +0 -361
  478. package/docs/architecture/specs/0.9.0-decisions.md +0 -532
  479. package/docs/architecture/specs/0.9.0-docs-code-drift-register.md +0 -745
  480. package/docs/architecture/specs/0.9.0-open-items-register.md +0 -135
  481. package/docs/architecture/specs/0.9.0-public-api-issue-backlog.md +0 -740
  482. package/docs/architecture/specs/0.9.0-release-surface-review.md +0 -636
  483. package/docs/architecture/specs/agent-command-engine-model-design.md +0 -513
  484. package/docs/architecture/specs/akm-0.9.0-bundle-adapter-spec.md +0 -501
  485. package/docs/architecture/specs/akm-0.9.0-ref-grammar-decision.md +0 -291
  486. package/docs/architecture/specs/akm-format-neutral-bundle-workspace-spec.md +0 -2059
  487. package/docs/architecture/specs/di-seams-plan.md +0 -539
  488. package/docs/architecture/specs/driver-protocol-keep-or-cut.md +0 -275
  489. package/docs/architecture/specs/fact-asset-type.md +0 -142
  490. package/docs/architecture/specs/improve-collapse-churn-detector-design.md +0 -634
  491. package/docs/architecture/specs/reviews/task-workflow-unification/README.md +0 -72
  492. package/docs/architecture/specs/reviews/task-workflow-unification/findings-consolidated.md +0 -152
  493. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-alternatives.md +0 -352
  494. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-bunqueue.md +0 -300
  495. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-openworkflow.md +0 -402
  496. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-1.md +0 -758
  497. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-2.md +0 -645
  498. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-3.md +0 -602
  499. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-adversarial.md +0 -27
  500. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-architecture.md +0 -27
  501. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-coverage.md +0 -74
  502. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-security.md +0 -15
  503. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-adversarial.md +0 -132
  504. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-verification.md +0 -147
  505. package/docs/architecture/specs/stash-conventions-code-spec.md +0 -275
  506. package/docs/architecture/specs/stash-organization-conventions.md +0 -377
  507. package/docs/architecture/specs/task-workflow-format-unification.md +0 -721
  508. package/docs/architecture/specs/workflow-engine-buy-vs-build.md +0 -231
  509. package/docs/architecture/specs/workflow-format-unification.md +0 -432
  510. package/docs/architecture/testing/manual-testing-checklist.md +0 -3411
  511. package/docs/architecture/testing/okf-v0.2-conformance-runbook.md +0 -924
  512. package/docs/architecture/testing/task-workflow-manual-tests.md +0 -1720
  513. package/docs/guides/claude-code-vs-akm-workflows.md +0 -29
  514. package/docs/guides/knowledge-management.md +0 -18
  515. package/docs/maintainers/curate-workmap.md +0 -335
  516. package/docs/migration/v0.5-to-v0.6.md +0 -759
  517. package/docs/migration/v0.7-to-v0.8.md +0 -1378
  518. package/docs/plans/0.9.2-agent-command-workflow-plan.md +0 -423
@@ -19,6 +19,7 @@ import { withStateDbTelemetry } from "../../core/state-db.js";
19
19
  import { systemErrorCode } from "../../core/system-error.js";
20
20
  import { presentationFor } from "../../core/type-presentation.js";
21
21
  import { embed } from "../../llm/embedder.js";
22
+ import { effectiveEmbedding } from "../../llm/embedders/connection.js";
22
23
  import { applyEmbeddingTemplate, resolveEmbeddingProfile } from "../../llm/embedders/profile.js";
23
24
  import { normalizeEmbeddingEndpoint } from "../../llm/embedders/remote.js";
24
25
  import { assertIndexPathReadable, closeDatabase, openExistingDatabase, openReadonlyExistingDatabase, } from "../../storage/repositories/index-connection.js";
@@ -400,7 +401,7 @@ export function applyEntryFilters(items, opts) {
400
401
  const scopeFiltered = filters
401
402
  ? sourceFiltered.filter((item) => entryMatchesScope(item.entry.scope, filters))
402
403
  : sourceFiltered;
403
- // Proposed-quality filter (v1 spec §4.2): exclude `quality: "proposed"`
404
+ // Proposed-quality filter: exclude `quality: "proposed"`
404
405
  // entries unless the caller opts in.
405
406
  const qualityFiltered = opts.includeProposed
406
407
  ? scopeFiltered
@@ -469,7 +470,8 @@ function startVectorChannel(db, query, config, filterCandidates) {
469
470
  // a live warning instead of silently skipping with no signal.
470
471
  if (getEmbeddingCount(db) === 0)
471
472
  return Promise.resolve({ neighbors: null });
472
- const timeoutMs = config.embedding?.queryTimeoutMs ?? DEFAULT_QUERY_EMBED_TIMEOUT_MS;
473
+ const embedding = effectiveEmbedding(config);
474
+ const timeoutMs = embedding?.queryTimeoutMs ?? DEFAULT_QUERY_EMBED_TIMEOUT_MS;
473
475
  const controller = new AbortController();
474
476
  let timer;
475
477
  const timeout = new Promise((_, reject) => {
@@ -478,8 +480,8 @@ function startVectorChannel(db, query, config, filterCandidates) {
478
480
  reject(new Error(`Query embedding timed out after ${timeoutMs}ms`));
479
481
  }, timeoutMs);
480
482
  });
481
- const queryText = applyEmbeddingTemplate(resolveEmbeddingProfile(config.embedding).queryTemplate, query);
482
- return Promise.race([embed(queryText, config.embedding, controller.signal), timeout])
483
+ const queryText = applyEmbeddingTemplate(resolveEmbeddingProfile(embedding).queryTemplate, query);
484
+ return Promise.race([embed(queryText, embedding, controller.signal), timeout])
483
485
  .then((vector) => ({ neighbors: searchVec(db, vector, CHANNEL_DEPTH, undefined, filterCandidates) }))
484
486
  .catch((error) => ({ neighbors: null, warning: buildVectorFallbackWarning(config, error) }))
485
487
  .finally(() => clearTimeout(timer));
@@ -489,7 +491,7 @@ function buildVectorFallbackWarning(config, error) {
489
491
  const reason = classifyVectorFailure(error);
490
492
  const target = endpoint
491
493
  ? `embedding endpoint ${endpoint}`
492
- : config.embedding?.endpoint
494
+ : effectiveEmbedding(config)?.endpoint
493
495
  ? "configured embedding endpoint"
494
496
  : "local embedding model";
495
497
  const unavailable = reason === "connection failed" ? `cannot reach ${target}` : `${target} is unavailable`;
@@ -500,7 +502,7 @@ function buildVectorFallbackWarning(config, error) {
500
502
  * or fragments into a warning. Invalid authored values fail closed.
501
503
  */
502
504
  function safeEmbeddingEndpoint(config) {
503
- const endpoint = config.embedding?.endpoint;
505
+ const endpoint = effectiveEmbedding(config)?.endpoint;
504
506
  if (!endpoint)
505
507
  return undefined;
506
508
  try {
@@ -564,7 +566,7 @@ export async function buildDbHit(input) {
564
566
  score: input.score,
565
567
  ...(input.whyMatched ? { whyMatched: input.whyMatched } : {}),
566
568
  ...(estimatedTokens !== undefined ? { estimatedTokens } : {}),
567
- // Surface optional quality (v1 spec §4.2). Omitted when entry has
569
+ // Surface optional quality. Omitted when entry has
568
570
  // no `quality` field so payloads stay compact for the common case.
569
571
  ...(input.entry.quality ? { quality: input.entry.quality } : {}),
570
572
  ...(input.entry.beliefState ? { beliefState: input.entry.beliefState } : {}),
@@ -13,6 +13,20 @@ import { lockContentRootFor } from "../../integrations/lockfile.js";
13
13
  import { resolveSourceProviderFactory } from "../../sources/provider-factory.js";
14
14
  import { ensureWebsiteMirror } from "../../sources/snapshot-fetchers/website-ingest.js";
15
15
  // ── Resolution ──────────────────────────────────────────────────────────────
16
+ /**
17
+ * The working stash read besides the configured bundles: an explicit argument,
18
+ * else `AKM_BUNDLE_DIR`, else the platform default stash when no `defaultBundle`
19
+ * is configured. With a `defaultBundle` and no override there is none, because
20
+ * the configured bundle is the working stash. Throws as `resolveStashDir` does
21
+ * when the directory is missing.
22
+ */
23
+ export function implicitStashDir(config, overrideStashDir) {
24
+ if (overrideStashDir !== undefined)
25
+ return path.resolve(overrideStashDir);
26
+ if (process.env.AKM_BUNDLE_DIR?.trim())
27
+ return resolveStashDir();
28
+ return config.defaultBundle ? undefined : resolveStashDir();
29
+ }
16
30
  /**
17
31
  * Build the ordered list of stash sources, walking every configured stash
18
32
  * once. Iteration order:
@@ -29,21 +43,16 @@ import { ensureWebsiteMirror } from "../../sources/snapshot-fetchers/website-ing
29
43
  export function resolveSourceEntries(overrideStashDir, existingConfig) {
30
44
  const config = existingConfig ?? loadConfig();
31
45
  const configuredEntries = bundlesToSourceEntries(config) ?? [];
32
- const envOverride = process.env.AKM_BUNDLE_DIR?.trim();
33
- const implicitStashDir = overrideStashDir !== undefined
34
- ? path.resolve(overrideStashDir)
35
- : envOverride
36
- ? resolveStashDir()
37
- : config.defaultBundle
38
- ? undefined
39
- : resolveStashDir();
40
- const implicitConfiguredBundle = implicitStashDir ? bundleKeyForContentRoot(config, implicitStashDir) : undefined;
46
+ const implicitStash = implicitStashDir(config, overrideStashDir);
47
+ const implicitConfiguredBundle = implicitStash ? bundleKeyForContentRoot(config, implicitStash) : undefined;
41
48
  if (implicitConfiguredBundle && !isBundleEnabled(config, implicitConfiguredBundle)) {
42
49
  throw new ConfigError(`The requested working source is disabled as bundle ${JSON.stringify(implicitConfiguredBundle)}.`, "INVALID_CONFIG_FILE");
43
50
  }
44
51
  // Explicit and environment overrides stay first. Without either override,
45
52
  // the configured default enters through the validated loop below.
46
- const sources = implicitStashDir ? [{ path: implicitStashDir, writable: true, isDefault: true }] : [];
53
+ const sources = implicitStash
54
+ ? [{ path: implicitStash, writable: true, isDefault: true, type: "filesystem" }]
55
+ : [];
47
56
  const sourceIdentity = (dir) => {
48
57
  const resolved = path.resolve(dir);
49
58
  try {
@@ -53,7 +62,7 @@ export function resolveSourceEntries(overrideStashDir, existingConfig) {
53
62
  return resolved;
54
63
  }
55
64
  };
56
- const seen = new Set(implicitStashDir ? [sourceIdentity(implicitStashDir)] : []);
65
+ const seen = new Set(implicitStash ? [sourceIdentity(implicitStash)] : []);
57
66
  const addSource = (dir, registryId, writable, type, adapterId, unresolved = false, isDefault = false) => {
58
67
  const resolved = path.resolve(dir);
59
68
  const identity = sourceIdentity(resolved);
@@ -65,7 +74,7 @@ export function resolveSourceEntries(overrideStashDir, existingConfig) {
65
74
  // identity-less and a user-named primary source ("name": "my-stash")
66
75
  // would validate but match zero entries when filtering.
67
76
  const existing = sources.find((source) => sourceIdentity(source.path) === identity);
68
- if (existing && existing.type === undefined) {
77
+ if (existing && existing.registryId === undefined) {
69
78
  if (registryId)
70
79
  existing.registryId = registryId;
71
80
  if (isDefault)
@@ -92,7 +101,7 @@ export function resolveSourceEntries(overrideStashDir, existingConfig) {
92
101
  ...(unresolved ? { unresolved: true } : {}),
93
102
  });
94
103
  };
95
- // 0.9.0 shape (spec §10.1 / D-R5): resolve from `bundles` + `defaultBundle`.
104
+ // Resolve from `bundles` + `defaultBundle`.
96
105
  // `bundlesToSourceEntries` returns the configured default first, then map
97
106
  // insertion order. Each entry is validated before insertion so a component
98
107
  // root can never escape its provider's materialized content root.
@@ -102,7 +111,7 @@ export function resolveSourceEntries(overrideStashDir, existingConfig) {
102
111
  const component = bundleComponentConfig(config.bundles?.[entry.name ?? ""]);
103
112
  const contentRoot = resolveEntryContentDir(entry);
104
113
  if (contentRoot == null) {
105
- const unresolvedPath = path.join(getUnresolvedSourcesDir(implicitStashDir ?? process.cwd()), entry.name ?? entry.type);
114
+ const unresolvedPath = path.join(getUnresolvedSourcesDir(implicitStash ?? process.cwd()), entry.name ?? entry.type);
106
115
  addSource(unresolvedPath, entry.name, component?.writable ?? resolveWritable(entry), entry.type, component?.adapter, true, entry.name === config.defaultBundle);
107
116
  continue;
108
117
  }
@@ -124,9 +133,7 @@ export function resolveSourceEntries(overrideStashDir, existingConfig) {
124
133
  *
125
134
  * Single source of truth: each provider owns its own path. We instantiate the
126
135
  * registered {@link import("../../sources/provider.js").SourceProvider} for the entry
127
- * and call `provider.path()`. This replaces the old per-kind switch ladder
128
- * (filesystem path / git cache / website cache) that lived here in 0.6.0 —
129
- * see spec §10 step 4 and §7 "Removed from 0.6.0".
136
+ * and call `provider.path()`.
130
137
  *
131
138
  * The git case still does one extra step: the provider returns the cloned
132
139
  * repo dir, but the indexer walks the `content/` subdirectory inside it.
@@ -238,20 +245,23 @@ function isSuspiciousStashRoot(dir) {
238
245
  * `resolveSourceEntries()` so the content directories pass the
239
246
  * `isValidDirectory()` check.
240
247
  *
241
- * `materialize` (default `true`) is the query-time safety valve (spec §14.3 /
242
- * D11): the sanctioned materialization callers (`akm index`, source
248
+ * Sources are never refreshed here: `sync()` is called without `force`, so a
249
+ * source is fetched only when it has never been materialized on this host.
250
+ * `akm bundle update` is what refreshes one.
251
+ *
252
+ * `materialize` (default `true`) is the query-time safety valve: the sanctioned
253
+ * materialization callers (`akm index`, source
243
254
  * add/update/sync, improve's blocking preflight) pass it truthy and clone/pull/
244
255
  * fetch as needed. A READ command's inline auto-index passes `materialize:
245
256
  * false` — network is FORBIDDEN at query time, so instead of `sync()` we only
246
257
  * check whether each cache-backed source is already materialized: a present
247
- * cache is served as-is (last-known-good; no TTL pull either), while an absent
258
+ * cache is served as-is (last-known-good), while an absent
248
259
  * or partially-staged cache makes that source UNAVAILABLE for the read and is
249
260
  * skipped with one warning naming the remedy. The rest of the command still
250
261
  * resolves.
251
262
  */
252
263
  export async function ensureSourceCaches(config, options) {
253
264
  const cfg = config ?? loadConfig();
254
- const force = options?.force === true;
255
265
  const materialize = options?.materialize !== false;
256
266
  const onProgress = options?.onProgress ?? (() => { });
257
267
  // Polymorphic refresh: walk every enabled source through its registered
@@ -285,6 +295,16 @@ export async function ensureSourceCaches(config, options) {
285
295
  // and writes continue using the lock root.
286
296
  continue;
287
297
  }
298
+ if (entry.type === "npm") {
299
+ // A configured npm bundle with no lock entry has no walkable path (its
300
+ // provider path is the package spec), and nothing marks it materialized,
301
+ // so syncing it here would hit the npm registry on every index run and
302
+ // still leave it unindexed. `akm bundle update` installs it and writes
303
+ // the lock entry.
304
+ warn(`Warning: npm source "${entry.name}" is not installed; skipping it. ` +
305
+ `Run \`akm bundle update ${entry.name}\` to install it.`);
306
+ continue;
307
+ }
288
308
  const factory = resolveSourceProviderFactory(entry.type);
289
309
  if (!factory)
290
310
  continue;
@@ -316,7 +336,7 @@ export async function ensureSourceCaches(config, options) {
316
336
  // `toSync` only ever holds providers whose `.sync` passed the check
317
337
  // above; the optional-chain here is just to satisfy the type (the
318
338
  // narrowing does not survive the array round-trip).
319
- await provider.sync?.({ force, secrets: options?.secrets, ensureWebsiteMirror });
339
+ await provider.sync?.({ secrets: options?.secrets, ensureWebsiteMirror });
320
340
  }
321
341
  catch (err) {
322
342
  warn(`Warning: failed to refresh ${provider.kind} source "${provider.name}": ${err instanceof Error ? err.message : String(err)}`);
@@ -14,9 +14,8 @@ const USAGE_EVENT_SOURCES = new Set(["user", "improve", "task", "audit", "unknow
14
14
  * Resolve subprocess provenance without treating an invalid value as user
15
15
  * demand.
16
16
  *
17
- * `fallback` (spec docs/plans/specs/p1b-model-extraction.md §5.2, F-1) is what
18
- * an unset/empty ambient value resolves to — it defaults to `"user"`, which
19
- * reproduces every pre-P1b call site byte-for-byte (P-07). A caller that
17
+ * `fallback` is what an unset/empty ambient value resolves to — it defaults to `"user"`.
18
+ * A caller that
20
19
  * already knows the invocation's provenance (the task runner, threading its
21
20
  * `ExecutionProvenanceContext`) passes its resolved value as the fallback
22
21
  * instead, so a recognized ambient `AKM_EVENT_SOURCE` still wins everywhere it
@@ -1,4 +1,5 @@
1
1
  // This Source Code Form is subject to the terms of the Mozilla Public
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
- export {};
4
+ /** The `index_meta` key holding the last index run's {@link SemanticSearchRecord}. */
5
+ export const SEMANTIC_SEARCH_META_KEY = "semanticSearch";
@@ -118,7 +118,6 @@ const ARGUMENTS_PLACEHOLDER_RE = /\$ARGUMENTS/;
118
118
  const NUMERIC_PLACEHOLDER_RE = /\$[123](?!\d|[.,]\d)/;
119
119
  const SMART_MD_FACTS = {
120
120
  workflow: { type: "workflow", specificity: 19 },
121
- toolsAgent: { type: "agent", specificity: 20 },
122
121
  command: { type: "command", specificity: 18 },
123
122
  modelAgent: { type: "agent", specificity: 8 },
124
123
  knowledge: { type: "knowledge", specificity: 5 },
@@ -213,22 +212,15 @@ function classifyBySmartMd(ctx) {
213
212
  const body = ctx.content();
214
213
  const fm = ctx.frontmatter();
215
214
  // Recognition is frontmatter `type: workflow` or residence under `workflows/`
216
- // (workflow-format-unification, spec §2.5) — no content sniffing. The
215
+ // — no content sniffing. The
217
216
  // directory rule is `classifyByDirectory`/`classifyByParentDirHint`'s job;
218
217
  // this only catches a workflow living OUTSIDE `workflows/` that still
219
218
  // declares its type explicitly.
220
219
  if (fm && fm.type === "workflow") {
221
220
  return SMART_MD_FACTS.workflow;
222
221
  }
223
- if (fm) {
224
- // `tools` is the one authoring key for an agent's tool grant. Recognition
225
- // covers only the key the renderer honors.
226
- if ("tools" in fm) {
227
- return SMART_MD_FACTS.toolsAgent;
228
- }
229
- if ("agent" in fm) {
230
- return SMART_MD_FACTS.command;
231
- }
222
+ if (fm && "agent" in fm) {
223
+ return SMART_MD_FACTS.command;
232
224
  }
233
225
  // `$ARGUMENTS` is unambiguous, so it keeps its long-standing precedence: a
234
226
  // command dropped under `knowledge/` is still found as a command. A skill's
@@ -1,55 +1,15 @@
1
1
  // This Source Code Form is subject to the terms of the Mozilla Public
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
- import fs from "node:fs";
5
- import path from "node:path";
6
- import { assetPathForName, stashDirFor } from "../../core/asset/asset-placement.js";
7
- import { parseRefInput } from "../../core/asset/resolve-ref.js";
8
- import { isWithin } from "../../core/common.js";
9
- import { resolveSourcesForOrigin } from "../../registry/origin-resolve.js";
4
+ import { conceptIdFromTypeName, parseRefInput } from "../../core/asset/resolve-ref.js";
10
5
  import { lookup } from "../indexer.js";
11
6
  import { deriveInstallations } from "../installations.js";
7
+ import { resolveConceptOwner } from "../lookup/adapter-concept-owner.js";
12
8
  import { resolveSourceEntries } from "../search/search-source.js";
13
9
  function normalizeRef(ref) {
14
10
  // String inputs use the current `[bundle//]conceptId` grammar.
15
11
  return typeof ref === "string" ? parseRefInput(ref) : ref;
16
12
  }
17
- function buildDiskCandidates(sourcePath, ref, preserveDirectNameFallback) {
18
- const placementStashDir = stashDirFor(ref.type);
19
- // Opaque adapter conceptIds are index-resolved. Core cannot infer their
20
- // adapter-owned serialization or path extension before indexing.
21
- if (placementStashDir === undefined)
22
- return [];
23
- const typeDir = path.join(sourcePath, placementStashDir);
24
- const candidates = [
25
- assetPathForName(ref.type, typeDir, ref.name),
26
- path.join(sourcePath, ref.type, `${ref.name}.md`),
27
- path.join(sourcePath, ref.type, ref.name),
28
- ];
29
- if (preserveDirectNameFallback) {
30
- candidates.push(path.join(sourcePath, `${ref.name}.md`), path.join(sourcePath, ref.name));
31
- }
32
- return candidates;
33
- }
34
- function resolveDirectoryEntry(filePath, directoryIndexNames) {
35
- let stat;
36
- try {
37
- stat = fs.statSync(filePath);
38
- }
39
- catch {
40
- return null;
41
- }
42
- if (stat.isFile())
43
- return filePath;
44
- if (!stat.isDirectory())
45
- return null;
46
- for (const indexName of directoryIndexNames) {
47
- const candidate = path.join(filePath, indexName);
48
- if (fs.existsSync(candidate) && fs.statSync(candidate).isFile())
49
- return candidate;
50
- }
51
- return null;
52
- }
53
13
  async function resolveViaIndex(ref) {
54
14
  try {
55
15
  const entry = await lookup(ref);
@@ -60,32 +20,17 @@ async function resolveViaIndex(ref) {
60
20
  }
61
21
  }
62
22
  function resolveViaDisk(ref, options) {
63
- let sources = resolveSourceEntries(options.stashDir);
64
- if (options.honorOrigin !== false) {
65
- sources = resolveSourcesForOrigin(ref.origin, sources);
66
- }
67
- const directoryIndexNames = options.directoryIndexNames ?? ["SKILL.md"];
68
- const preserveDirectNameFallback = options.preserveDirectNameFallback ?? true;
69
- const installations = deriveInstallations(sources);
70
- for (const [index, source] of sources.entries()) {
71
- const bundleId = installations[index]?.id;
72
- if (options.writableBundleIds && (!bundleId || !options.writableBundleIds.has(bundleId)))
73
- continue;
74
- const candidates = buildDiskCandidates(source.path, ref, preserveDirectNameFallback);
75
- for (const candidate of candidates) {
76
- if (!fs.existsSync(candidate))
77
- continue;
78
- const resolved = resolveDirectoryEntry(candidate, directoryIndexNames);
79
- if (!resolved)
80
- continue;
81
- const resolvedRoot = fs.realpathSync(source.path);
82
- const realTarget = fs.realpathSync(resolved);
83
- if (!isWithin(realTarget, resolvedRoot))
84
- continue;
85
- return realTarget;
86
- }
87
- }
88
- return null;
23
+ const allSources = resolveSourceEntries(options.stashDir);
24
+ const installations = deriveInstallations(allSources);
25
+ const sources = options.writableBundleIds
26
+ ? allSources.filter((_, index) => {
27
+ const bundleId = installations[index]?.id;
28
+ return bundleId !== undefined && options.writableBundleIds?.has(bundleId);
29
+ })
30
+ : allSources;
31
+ const bundle = options.honorOrigin !== false ? ref.origin : undefined;
32
+ return (resolveConceptOwner({ bundle, conceptId: conceptIdFromTypeName(ref.type, ref.name) }, sources)?.owner.realPath ??
33
+ null);
89
34
  }
90
35
  export async function resolveAssetPath(ref, options = {}) {
91
36
  const parsed = normalizeRef(ref);
@@ -11,7 +11,6 @@
11
11
  import fs from "node:fs";
12
12
  import path from "node:path";
13
13
  import { isRelevantAssetFile } from "../../core/asset/asset-placement.js";
14
- import { WORKFLOW_EXTENSIONS } from "../../core/recognition-util.js";
15
14
  import { spawnSync } from "../../runtime.js";
16
15
  import { buildFileContext } from "./file-context.js";
17
16
  const ALWAYS_SKIP_DIRS = new Set([".git"]);
@@ -60,7 +59,8 @@ export function walkStash(typeRoot, assetType) {
60
59
  * Unlike walkStash(), this does NOT filter by asset type or require files to
61
60
  * live under type-specific directories. Matchers decide what each file is.
62
61
  *
63
- * If the directory is a git repo, uses `git ls-files` to respect .gitignore.
62
+ * If the directory is a git repo, uses `git ls-files` to respect .gitignore,
63
+ * except that git-ignored files under `env/` and `secrets/` are still walked.
64
64
  * Otherwise falls back to a manual walk that skips .git, node_modules, bin,
65
65
  * .cache, dot-directories, and the legacy metadata sidecar.
66
66
  */
@@ -78,7 +78,8 @@ export function walkStashFlatWithStatus(stashRoot, options = {}) {
78
78
  return walkStashManual(stashRoot, options);
79
79
  }
80
80
  /**
81
- * Walk using `git ls-files` to respect .gitignore.
81
+ * Walk using `git ls-files` to respect .gitignore (ignored `env/` and
82
+ * `secrets/` files excepted).
82
83
  * Returns null if the directory is not a git repo or git fails.
83
84
  */
84
85
  function walkStashGit(stashRoot, options) {
@@ -101,12 +102,20 @@ function walkStashGit(stashRoot, options) {
101
102
  ? deletedResult.stdout.toString("utf8")
102
103
  : String(deletedResult.stdout ?? "");
103
104
  const deletedFiles = new Set(deletedStdout.split("\0").filter(Boolean));
105
+ // `akm bundle create` git-ignores `env/` and `secrets/` so credentials are
106
+ // never committed, but they are still bundle assets. List the ignored files
107
+ // under those two directories as well; the adapters index key names only.
108
+ const ignoredResult = spawnSync(["git", "ls-files", "--others", "--ignored", "--exclude-standard", "-z", "--", "env/", "secrets/"], { cwd: stashRoot });
109
+ if (!ignoredResult.success)
110
+ return null;
111
+ const ignoredStdout = Buffer.isBuffer(ignoredResult.stdout)
112
+ ? ignoredResult.stdout.toString("utf8")
113
+ : String(ignoredResult.stdout ?? "");
104
114
  // Data-hygiene filename skips: the legacy metadata sidecar (never indexed as
105
115
  // content — Chunk-8 folds it into the bundle format) plus git dot-files.
106
116
  const SKIP_FILES = new Set([".stash.json", ".gitignore", ".gitattributes"]);
107
117
  const stdout = Buffer.isBuffer(result.stdout) ? result.stdout.toString("utf8") : String(result.stdout ?? "");
108
- const files = stdout
109
- .split("\0")
118
+ const files = [...stdout.split("\0"), ...ignoredStdout.split("\0")]
110
119
  .filter((f) => f.length > 0)
111
120
  .filter((f) => !deletedFiles.has(f))
112
121
  .filter((f) => !f.startsWith("..") && !path.isAbsolute(f))
@@ -124,13 +133,11 @@ function walkStashGit(stashRoot, options) {
124
133
  for (const relFile of files) {
125
134
  const absPath = path.join(stashRoot, relFile);
126
135
  try {
127
- // lstat, not stat: a tracked symlink must not be dereferenced. statSync
128
- // follows the link, so a target outside stashRoot would be read and
129
- // indexed. The manual walk below already skips symlinks for exactly this
130
- // reason; the two walkers have to agree regardless of whether the stash
131
- // happens to sit inside a git repo.
136
+ // A file that is a symlink to a file anywhere is indexed like any other
137
+ // file: installing a bundle is the trust decision. git lists a symlinked
138
+ // directory as one entry, so directory symlinks are never descended.
132
139
  const stat = fs.lstatSync(absPath);
133
- if (stat.isFile() || (stat.isSymbolicLink() && isOwnedWorkflowSymlink(stashRoot, absPath, options))) {
140
+ if (stat.isFile() || (stat.isSymbolicLink() && isFileOrFileSymlink(absPath))) {
134
141
  results.push(buildFileContext(stashRoot, absPath));
135
142
  }
136
143
  }
@@ -191,8 +198,11 @@ export function walkMarkdownFiles(root) {
191
198
  }
192
199
  for (const entry of entries) {
193
200
  const full = path.join(current, entry.name);
194
- if (entry.isSymbolicLink())
201
+ if (entry.isSymbolicLink()) {
202
+ if (entry.name.toLowerCase().endsWith(".md") && isFileOrFileSymlink(full))
203
+ files.push(full);
195
204
  continue;
205
+ }
196
206
  if (entry.isDirectory()) {
197
207
  stack.push(full);
198
208
  }
@@ -225,11 +235,10 @@ function walkStashManual(stashRoot, options) {
225
235
  continue;
226
236
  const fullPath = path.join(current, entry.name);
227
237
  if (entry.isSymbolicLink()) {
228
- // Native workflow components arbitrate file symlinks explicitly in the
229
- // drain before reading them. Directory symlinks remain unfollowed.
230
- if (isOwnedWorkflowSymlink(stashRoot, fullPath, options)) {
238
+ // A file symlink is indexed like any other file; a directory symlink
239
+ // is never descended (no cycles).
240
+ if (isFileOrFileSymlink(fullPath))
231
241
  results.push(buildFileContext(stashRoot, fullPath));
232
- }
233
242
  continue;
234
243
  }
235
244
  if (entry.isDirectory()) {
@@ -245,15 +254,12 @@ function walkStashManual(stashRoot, options) {
245
254
  }
246
255
  return { files: results, complete };
247
256
  }
248
- function isOwnedWorkflowSymlink(stashRoot, candidatePath, options) {
249
- const adapterId = options.workflowSymlinkAdapter;
250
- if (!adapterId)
251
- return false;
252
- const relativePath = path.relative(path.resolve(stashRoot), path.resolve(candidatePath)).replaceAll("\\", "/");
253
- if (!relativePath || relativePath.startsWith("../") || path.posix.isAbsolute(relativePath))
254
- return false;
255
- if (adapterId === "akm" && !relativePath.startsWith("workflows/"))
257
+ /** True for a regular file, or a symlink whose target is a regular file. */
258
+ export function isFileOrFileSymlink(filePath) {
259
+ try {
260
+ return fs.statSync(filePath).isFile();
261
+ }
262
+ catch {
256
263
  return false;
257
- const extension = path.posix.extname(relativePath).toLowerCase();
258
- return WORKFLOW_EXTENSIONS.includes(extension);
264
+ }
259
265
  }
@@ -0,0 +1,81 @@
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
+ * akm's read-only tools for agent work, in harness-neutral form (#1244): the
6
+ * `akm` capability. A harness adapts each one to its own tool API; the tool runs
7
+ * in akm's process and returns what `akm --detail agent <command> --format json`
8
+ * would print.
9
+ */
10
+ import { renderOutput } from "../../cli/shared.js";
11
+ import { akmSearch } from "../../commands/read/search.js";
12
+ import { runCurate } from "../../commands/read/search-cli.js";
13
+ import { akmShowUnified } from "../../commands/read/show.js";
14
+ import { loadConfig } from "../../core/config/config.js";
15
+ import { withQuiet } from "../../core/warn.js";
16
+ import { resolveUsageEventSource } from "../../indexer/usage/usage-events.js";
17
+ import { resolveOutputMode } from "../../output/context.js";
18
+ import { stdoutText } from "../../output/stdout.js";
19
+ /** The usage-event source a tool call records: the run's own, validated; the default only for a run with none. */
20
+ const sourceOf = (context) => context?.eventSource === undefined ? undefined : resolveUsageEventSource({ AKM_EVENT_SOURCE: context.eventSource });
21
+ const str = (value) => typeof value === "string" && value.trim() !== "" ? value.trim() : undefined;
22
+ const positiveInt = (value) => typeof value === "number" && Number.isInteger(value) && value > 0 ? value : undefined;
23
+ /** Run one read command the way the CLI does with `--detail agent --format json`, quietly. */
24
+ function asCli(command, compute) {
25
+ return withQuiet(async () => {
26
+ const mode = resolveOutputMode(["--detail", "agent", "--format", "json"], loadConfig().output ?? {});
27
+ return stdoutText(renderOutput(command, await compute(mode), { ...mode, format: "json" }));
28
+ });
29
+ }
30
+ function required(input, key) {
31
+ const value = str(input[key]);
32
+ if (!value)
33
+ throw new Error(`"${key}" is required`);
34
+ return value;
35
+ }
36
+ export const AKM_READ_TOOLS = [
37
+ {
38
+ name: "akm_curate",
39
+ description: "Find the akm assets (skills, knowledge, memories, workflows) that best fit a task. Read one with akm_show before relying on it.",
40
+ inputSchema: {
41
+ type: "object",
42
+ properties: {
43
+ query: { type: "string", description: "The task or question" },
44
+ type: { type: "string", description: "Optional asset type filter" },
45
+ limit: { type: "integer", minimum: 1 },
46
+ },
47
+ required: ["query"],
48
+ },
49
+ run: (input, context) => asCli("curate", (mode) => runCurate({
50
+ query: required(input, "query"),
51
+ type: str(input.type),
52
+ limit: positiveInt(input.limit) === undefined ? undefined : String(input.limit),
53
+ eventSource: sourceOf(context),
54
+ }, mode)),
55
+ },
56
+ {
57
+ name: "akm_search",
58
+ description: "Search akm assets by name or keyword.",
59
+ inputSchema: {
60
+ type: "object",
61
+ properties: {
62
+ query: { type: "string" },
63
+ type: { type: "string", description: "Optional asset type filter" },
64
+ limit: { type: "integer", minimum: 1 },
65
+ },
66
+ required: ["query"],
67
+ },
68
+ run: (input, context) => asCli("search", () => akmSearch({
69
+ query: required(input, "query"),
70
+ type: str(input.type),
71
+ limit: positiveInt(input.limit),
72
+ eventSource: sourceOf(context),
73
+ })),
74
+ },
75
+ {
76
+ name: "akm_show",
77
+ description: "Read one akm asset by its ref, as returned by akm_curate or akm_search.",
78
+ inputSchema: { type: "object", properties: { ref: { type: "string" } }, required: ["ref"] },
79
+ run: (input, context) => asCli("show", () => akmShowUnified({ ref: required(input, "ref"), eventSource: sourceOf(context) })),
80
+ },
81
+ ];
@@ -3,5 +3,5 @@
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  /** Default agent CLI timeout; null means agents run until they finish. */
5
5
  export const DEFAULT_AGENT_TIMEOUT_MS = null;
6
- /** Default hard timeout for a direct LLM call, and the bound on model work on every runner kind, when no engine/use override exists. */
6
+ /** Default hard timeout for model work (a call on a connection, or model work on a harness) when neither the request nor the connection's or harness's `timeoutMs` sets one. Agent work has none. */
7
7
  export const DEFAULT_LLM_TIMEOUT_MS = 600_000;