@aiwg/cli 2026.10.1 → 2026.10.4

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 (361) hide show
  1. package/README.md +2 -2
  2. package/agentic/code/providers/capability-matrix.yaml +270 -0
  3. package/agentic/code/providers/model-capabilities.v1.json +3183 -24
  4. package/bin/aiwg.mjs +135 -47
  5. package/dist/src/a2a/codecs.js +9 -0
  6. package/dist/src/agents/grounding/knowledge-base.js +54 -6
  7. package/dist/src/artifacts/browser-export.js +6 -0
  8. package/dist/src/artifacts/checksum-manifest.js +1 -0
  9. package/dist/src/artifacts/citation-parser.js +173 -92
  10. package/dist/src/artifacts/citation-table-schema.js +59 -0
  11. package/dist/src/artifacts/cli.js +57 -18
  12. package/dist/src/artifacts/corpus-tools/snapshot.js +1 -1
  13. package/dist/src/artifacts/corpus-tools/vision-extract.js +107 -15
  14. package/dist/src/artifacts/corpus-views/ref-parser.js +3 -1
  15. package/dist/src/artifacts/corpus-views/renderers.js +3 -3
  16. package/dist/src/artifacts/discovery-eval.js +6 -4
  17. package/dist/src/artifacts/fortemi-core-query-adapter.js +36 -3
  18. package/dist/src/artifacts/fortemi-core-sync.js +166 -40
  19. package/dist/src/artifacts/framework-capabilities.js +171 -0
  20. package/dist/src/artifacts/framework-index-paths.js +73 -0
  21. package/dist/src/artifacts/framework-source-digest.js +75 -0
  22. package/dist/src/artifacts/index-builder.js +285 -131
  23. package/dist/src/artifacts/index-files.js +132 -18
  24. package/dist/src/artifacts/index-preparation.js +65 -0
  25. package/dist/src/artifacts/index-refresh.js +576 -0
  26. package/dist/src/artifacts/index-worker.mjs +9 -0
  27. package/dist/src/artifacts/prebuilt-build-lock.js +47 -4
  28. package/dist/src/artifacts/prebuilt-deployment.js +46 -0
  29. package/dist/src/artifacts/prebuilt-relations.js +80 -0
  30. package/dist/src/artifacts/query-engine.js +410 -88
  31. package/dist/src/artifacts/relations-builder.js +168 -0
  32. package/dist/src/artifacts/relations.js +148 -0
  33. package/dist/src/artifacts/repair.js +9 -4
  34. package/dist/src/artifacts/stats.js +5 -2
  35. package/dist/src/artifacts/types.js +30 -10
  36. package/dist/src/artifacts/watcher.js +1 -1
  37. package/dist/src/auth/credential-store.js +2 -1
  38. package/dist/src/catalog/cli.d.mts +5 -0
  39. package/dist/src/channel/manager.d.mts +20 -0
  40. package/dist/src/channel/manager.mjs +78 -12
  41. package/dist/src/cli/child-process-result.js +40 -0
  42. package/dist/src/cli/command-log.js +2 -3
  43. package/dist/src/cli/env.js +38 -16
  44. package/dist/src/cli/flag-parsing.js +236 -0
  45. package/dist/src/cli/handlers/artifacts.js +3 -0
  46. package/dist/src/cli/handlers/auth.js +3 -0
  47. package/dist/src/cli/handlers/decision.js +218 -5
  48. package/dist/src/cli/handlers/diagnose.js +13 -5
  49. package/dist/src/cli/handlers/effect.js +4 -2
  50. package/dist/src/cli/handlers/evidence.js +3 -0
  51. package/dist/src/cli/handlers/feedback.js +14 -5
  52. package/dist/src/cli/handlers/help.js +1 -0
  53. package/dist/src/cli/handlers/index.js +3 -1
  54. package/dist/src/cli/handlers/init.js +248 -30
  55. package/dist/src/cli/handlers/lint.js +5 -0
  56. package/dist/src/cli/handlers/mc.js +23 -0
  57. package/dist/src/cli/handlers/models.js +169 -10
  58. package/dist/src/cli/handlers/ralph-launcher.js +2 -0
  59. package/dist/src/cli/handlers/ralph.js +3 -0
  60. package/dist/src/cli/handlers/refresh.js +28 -0
  61. package/dist/src/cli/handlers/regenerate.js +14 -0
  62. package/dist/src/cli/handlers/resource-versions.js +3 -0
  63. package/dist/src/cli/handlers/rules.js +195 -0
  64. package/dist/src/cli/handlers/run.js +4 -0
  65. package/dist/src/cli/handlers/runtime-info.js +25 -11
  66. package/dist/src/cli/handlers/script-runner.js +19 -8
  67. package/dist/src/cli/handlers/session.js +406 -62
  68. package/dist/src/cli/handlers/sessions.js +243 -76
  69. package/dist/src/cli/handlers/setup-manifest.js +474 -79
  70. package/dist/src/cli/handlers/setup.js +180 -39
  71. package/dist/src/cli/handlers/steward.js +11 -0
  72. package/dist/src/cli/handlers/subcommands.js +60 -3
  73. package/dist/src/cli/handlers/team.js +18 -8
  74. package/dist/src/cli/handlers/uhp.js +3 -0
  75. package/dist/src/cli/handlers/use.js +307 -55
  76. package/dist/src/cli/handlers/utilities.js +125 -26
  77. package/dist/src/cli/handlers/version.js +8 -0
  78. package/dist/src/cli/prompt-utils.js +72 -0
  79. package/dist/src/cli/provider-resolution.js +11 -0
  80. package/dist/src/cli/router.js +15 -1
  81. package/dist/src/cli/services/deployment-verification.js +19 -9
  82. package/dist/src/cli/services/provider-prepare-coordinator.js +24 -0
  83. package/dist/src/cli/skill-usage.js +2 -3
  84. package/dist/src/config/aiwg-config.js +349 -35
  85. package/dist/src/config/cli.js +256 -23
  86. package/dist/src/config/decision-config.js +106 -0
  87. package/dist/src/config/dispatch-thresholds-runtime.d.mts +8 -0
  88. package/dist/src/config/dispatch-thresholds-runtime.mjs +38 -0
  89. package/dist/src/config/gitignore.js +50 -0
  90. package/dist/src/config/index-graph-overrides.js +36 -0
  91. package/dist/src/config/project-artifacts-health.d.mts +37 -0
  92. package/dist/src/config/project-artifacts-health.mjs +14 -3
  93. package/dist/src/config/project-artifacts-runtime.d.mts +16 -0
  94. package/dist/src/config/user-config-dir.d.mts +9 -0
  95. package/dist/src/config/user-config.js +38 -11
  96. package/dist/src/config/user-registry.js +23 -15
  97. package/dist/src/config/user-state.js +7 -0
  98. package/dist/src/decision/adapters/jev.js +75 -27
  99. package/dist/src/decision/ask.js +203 -43
  100. package/dist/src/decision/context-live-qualification.js +2 -2
  101. package/dist/src/decision/driver.js +14 -7
  102. package/dist/src/decision/ensemble/aggregate.js +23 -10
  103. package/dist/src/decision/ensemble-study/multifact-study.js +6 -2
  104. package/dist/src/decision/entry.js +25 -6
  105. package/dist/src/decision/graph-live-qualification.js +1 -1
  106. package/dist/src/decision/graph-run.js +9 -0
  107. package/dist/src/decision/heldout/collector.js +15 -14
  108. package/dist/src/decision/heldout/contract.js +30 -7
  109. package/dist/src/decision/index.js +1 -0
  110. package/dist/src/decision/interop.js +60 -8
  111. package/dist/src/decision/jev-credentials.js +15 -1
  112. package/dist/src/decision/ledger.js +942 -0
  113. package/dist/src/decision/offload-activation.js +137 -0
  114. package/dist/src/decision/offload.js +550 -0
  115. package/dist/src/decision/qualification/load.js +4 -6
  116. package/dist/src/decision/savings.js +28 -0
  117. package/dist/src/decision/validate.js +6 -3
  118. package/dist/src/effects/dispatch-verifier.js +252 -0
  119. package/dist/src/effects/index.js +1 -0
  120. package/dist/src/effects/types.js +5 -1
  121. package/dist/src/effects/verifiers/git.js +2 -1
  122. package/dist/src/effects/verifiers/tracker.js +26 -14
  123. package/dist/src/extensions/commands/definitions.js +19 -0
  124. package/dist/src/extensions/project-local-remove.js +36 -1
  125. package/dist/src/features/installer.js +2 -2
  126. package/dist/src/flow/graph-metadata.js +5 -0
  127. package/dist/src/gates/providers/loader.js +64 -18
  128. package/dist/src/installation/manager-command.d.mts +18 -0
  129. package/dist/src/installation/manager-command.mjs +15 -3
  130. package/dist/src/installation/manager.d.mts +49 -0
  131. package/dist/src/installation/manager.mjs +95 -5
  132. package/dist/src/issues/cli.js +4 -4
  133. package/dist/src/issues/local.js +24 -5
  134. package/dist/src/jobs/runner.js +1 -1
  135. package/dist/src/lint/cli.js +27 -1
  136. package/dist/src/lint/loader.js +2 -1
  137. package/dist/src/lint/reporters.js +25 -1
  138. package/dist/src/lint/rule-activation.js +43 -0
  139. package/dist/src/lint/runner.js +137 -62
  140. package/dist/src/mcp/adapters/codex-runtime.js +366 -56
  141. package/dist/src/mcp/claude-install.d.mts +4 -0
  142. package/dist/src/mcp/claude-install.mjs +41 -0
  143. package/dist/src/mcp/cli.d.mts +1 -0
  144. package/dist/src/mcp/cli.mjs +620 -85
  145. package/dist/src/mcp/config-file.d.mts +28 -0
  146. package/dist/src/mcp/config-file.mjs +279 -0
  147. package/dist/src/mcp/config-layers.d.mts +36 -0
  148. package/dist/src/mcp/config-layers.mjs +348 -0
  149. package/dist/src/mcp/credentials.d.mts +51 -0
  150. package/dist/src/mcp/credentials.mjs +484 -0
  151. package/dist/src/mcp/grok-build-config.d.mts +6 -0
  152. package/dist/src/mcp/grok-build-config.mjs +17 -27
  153. package/dist/src/mcp/helpers.mjs +109 -4
  154. package/dist/src/mcp/muse-native-config.d.mts +13 -0
  155. package/dist/src/mcp/muse-native-config.mjs +1 -0
  156. package/dist/src/mcp/omp-config.d.mts +4 -0
  157. package/dist/src/mcp/omp-config.mjs +50 -29
  158. package/dist/src/mcp/profiles.js +97 -23
  159. package/dist/src/mcp/profiles.mjs +99 -27
  160. package/dist/src/mcp/registry.js +248 -131
  161. package/dist/src/mcp/registry.mjs +169 -100
  162. package/dist/src/mcp/server-config.d.mts +3 -0
  163. package/dist/src/mcp/server-config.mjs +89 -0
  164. package/dist/src/mcp/server.mjs +127 -82
  165. package/dist/src/mcp/test-simple.mjs +2 -1
  166. package/dist/src/mcp/toml-editor.d.mts +4 -0
  167. package/dist/src/mcp/toml-string.d.mts +1 -0
  168. package/dist/src/mcp/toml-string.mjs +9 -0
  169. package/dist/src/mcp/toml-strip-mcp.d.mts +1 -0
  170. package/dist/src/mcp/toml-strip-mcp.mjs +135 -0
  171. package/dist/src/mcp/tool-filters.d.mts +46 -0
  172. package/dist/src/mcp/tool-filters.mjs +357 -0
  173. package/dist/src/mcp/tools/agentic-sandbox.mjs +3 -1
  174. package/dist/src/mcp/tools/decision.mjs +22 -3
  175. package/dist/src/mcp/tools/discovery.mjs +62 -55
  176. package/dist/src/mcp/tools/orchestration.mjs +50 -2
  177. package/dist/src/mcp/tools/subsystems.mjs +39 -8
  178. package/dist/src/mcp/tools/worker-invoke.mjs +2856 -0
  179. package/dist/src/mcp/tools/worker-shell-control.mjs +289 -0
  180. package/dist/src/mcp/tools/worker-stdin-runtime.mjs +79 -0
  181. package/dist/src/memory/project-registry.js +2 -2
  182. package/dist/src/mission-protocol/codecs.js +647 -1
  183. package/dist/src/mission-protocol/types.js +110 -0
  184. package/dist/src/mission-protocol/worker-status.js +2 -0
  185. package/dist/src/models/config-loader.js +76 -14
  186. package/dist/src/models/grok-build-models.js +93 -41
  187. package/dist/src/models/model-capabilities.v1.json +3183 -24
  188. package/dist/src/models/model-discovery.js +931 -67
  189. package/dist/src/models/provider-policy.js +719 -11
  190. package/dist/src/models/qualification-digest.d.mts +2 -0
  191. package/dist/src/models/qualification-digest.mjs +17 -0
  192. package/dist/src/models/resolver.js +261 -0
  193. package/dist/src/models/worker-direct-readiness.js +550 -0
  194. package/dist/src/models/worker-dispatch-offer.js +169 -0
  195. package/dist/src/models/worker-health-readiness.js +144 -0
  196. package/dist/src/models/worker-installation.d.mts +39 -0
  197. package/dist/src/models/worker-installation.mjs +986 -0
  198. package/dist/src/models/wrapper-route.js +18 -0
  199. package/dist/src/ops/registry.js +9 -14
  200. package/dist/src/plugins/standalone-packager.js +4 -3
  201. package/dist/src/process/bounded-child-process.d.mts +84 -0
  202. package/dist/src/process/bounded-child-process.mjs +430 -0
  203. package/dist/src/process/cli-command.d.mts +16 -0
  204. package/dist/src/process/cli-command.mjs +75 -0
  205. package/dist/src/process/signal-child.d.mts +6 -0
  206. package/dist/src/process/signal-child.mjs +7 -0
  207. package/dist/src/providers/capability-matrix.js +8 -0
  208. package/dist/src/providers/capability-matrix.yaml +270 -0
  209. package/dist/src/providers/deployed-skill-roots.js +20 -0
  210. package/dist/src/providers/grok-build-acp.js +3 -2
  211. package/dist/src/providers/grok-build-headless.js +53 -23
  212. package/dist/src/providers/grok-build-inspect.js +1 -0
  213. package/dist/src/providers/omp-agent.d.mts +8 -0
  214. package/dist/src/providers/omp-diagnostics.d.mts +1 -0
  215. package/dist/src/providers/omp-paths.d.mts +13 -0
  216. package/dist/src/providers/provider-definitions.js +9 -1
  217. package/dist/src/providers/provider-definitions.mjs +9 -2
  218. package/dist/src/providers/skill-ownership.d.mts +9 -0
  219. package/dist/src/providers/skill-ownership.mjs +88 -0
  220. package/dist/src/rules/activation.d.mts +21 -0
  221. package/dist/src/rules/activation.mjs +62 -0
  222. package/dist/src/rules/inline-budget.d.mts +26 -0
  223. package/dist/src/rules/inline-budget.mjs +66 -0
  224. package/dist/src/rules/inventory.js +129 -0
  225. package/dist/src/rules/pin-state.js +73 -0
  226. package/dist/src/rules/pins.d.mts +14 -0
  227. package/dist/src/rules/pins.mjs +112 -0
  228. package/dist/src/rules/rule-frontmatter.schema.json +197 -0
  229. package/dist/src/serve/executor-registry.js +16 -24
  230. package/dist/src/serve/fleet-mission-conductor.js +9 -0
  231. package/dist/src/serve/mission-conductor.js +47 -12
  232. package/dist/src/serve/shared-host-scheduler.js +2 -0
  233. package/dist/src/serve/worker-invocation.js +558 -0
  234. package/dist/src/serve/worker-stdin-frame.d.mts +10 -0
  235. package/dist/src/serve/worker-stdin-frame.mjs +107 -0
  236. package/dist/src/sessions/adapter-registry.js +49 -0
  237. package/dist/src/sessions/adapters/claude.js +39 -54
  238. package/dist/src/sessions/adapters/codex.js +82 -67
  239. package/dist/src/sessions/adapters/copilot.js +4 -4
  240. package/dist/src/sessions/adapters/cursor.js +40 -57
  241. package/dist/src/sessions/adapters/deepseek-harness.js +15 -12
  242. package/dist/src/sessions/adapters/factory.js +31 -27
  243. package/dist/src/sessions/adapters/generic.js +43 -9
  244. package/dist/src/sessions/adapters/grok-build.js +11 -11
  245. package/dist/src/sessions/adapters/grokbot-locator.js +111 -0
  246. package/dist/src/sessions/adapters/grokbot.js +434 -24
  247. package/dist/src/sessions/adapters/hermes.js +27 -29
  248. package/dist/src/sessions/adapters/muse-workspace-scan.js +128 -0
  249. package/dist/src/sessions/adapters/muse.js +200 -104
  250. package/dist/src/sessions/adapters/omp.js +28 -14
  251. package/dist/src/sessions/adapters/openclaw.js +89 -79
  252. package/dist/src/sessions/adapters/opencode.js +27 -24
  253. package/dist/src/sessions/adapters/openhuman.js +18 -60
  254. package/dist/src/sessions/adapters/pi.js +30 -14
  255. package/dist/src/sessions/adapters/warp.js +3 -3
  256. package/dist/src/sessions/adapters/windsurf.js +19 -48
  257. package/dist/src/sessions/batch-contracts.js +25 -5
  258. package/dist/src/sessions/batch-import.js +72 -51
  259. package/dist/src/sessions/candidates.js +47 -11
  260. package/dist/src/sessions/contracts.js +75 -2
  261. package/dist/src/sessions/coverage-preflight.js +134 -0
  262. package/dist/src/sessions/discovery.js +3 -0
  263. package/dist/src/sessions/export-plan.js +4 -3
  264. package/dist/src/sessions/grok-build-cli.js +67 -5
  265. package/dist/src/sessions/import-exclusions.js +72 -0
  266. package/dist/src/sessions/import-lease.js +34 -18
  267. package/dist/src/sessions/import-limits.js +37 -0
  268. package/dist/src/sessions/importer.js +84 -46
  269. package/dist/src/sessions/index.js +2 -0
  270. package/dist/src/sessions/lifecycle.js +45 -0
  271. package/dist/src/sessions/policy.js +133 -25
  272. package/dist/src/sessions/readers.js +106 -53
  273. package/dist/src/sessions/refresh.js +106 -0
  274. package/dist/src/sessions/repository.js +199 -63
  275. package/dist/src/sessions/workspace-discovery.js +315 -88
  276. package/dist/src/sessions/workspace-matching.js +107 -0
  277. package/dist/src/skills/adapters/clawhub.js +10 -8
  278. package/dist/src/skills/adapters/openclaw.js +10 -7
  279. package/dist/src/skills/importer.js +1 -0
  280. package/dist/src/smiths/context-pipeline/aiwg-md.js +11 -0
  281. package/dist/src/smiths/context-pipeline/claude-hook.js +3 -26
  282. package/dist/src/smiths/context-pipeline/finalization.js +6 -5
  283. package/dist/src/smiths/context-pipeline/generator.js +21 -4
  284. package/dist/src/smiths/context-pipeline/parallelism-section.js +195 -14
  285. package/dist/src/smiths/context-pipeline/workspace-context.js +116 -9
  286. package/dist/src/smiths/hook-bridge/codex-translator.js +6 -5
  287. package/dist/src/smiths/mcpsmith/example.js +1 -1
  288. package/dist/src/smiths/mcpsmith/generator.js +1 -1
  289. package/dist/src/smiths/toolsmith/runtime-discovery.d.mts +10 -0
  290. package/dist/src/smiths/toolsmith/runtime-discovery.mjs +85 -31
  291. package/dist/src/storage/backends/fs.js +18 -76
  292. package/dist/src/storage/backends/logseq.js +68 -7
  293. package/dist/src/storage/backends/obsidian.js +1 -0
  294. package/dist/src/storage/fortemi-qualification-receipt.js +2 -2
  295. package/dist/src/testing/generators/test-code-generator.js +57 -30
  296. package/dist/src/tracker/forge-http.js +2 -1
  297. package/dist/src/uhp/client.js +11 -1
  298. package/dist/src/uhp/mission.js +5 -0
  299. package/dist/src/update/checker.d.mts +2 -0
  300. package/dist/src/update/checker.mjs +5 -5
  301. package/dist/src/update/notifier.mjs +54 -2
  302. package/dist/src/update/service.d.mts +22 -0
  303. package/dist/src/utils/contained-filesystem.d.mts +37 -0
  304. package/dist/src/utils/contained-filesystem.mjs +683 -0
  305. package/dist/src/utils/temporary-directory.js +36 -0
  306. package/dist/src/writing/example-generator.js +1 -1
  307. package/dist/src/writing/fidelity.js +18 -1
  308. package/package.json +32 -2
  309. package/schemas/mission-v1.schema.json +2429 -0
  310. package/schemas/models/model-catalog.v1.schema.json +301 -0
  311. package/schemas/models/model-config-compatibility.v1.schema.json +281 -0
  312. package/schemas/models/model-policy.v1.schema.json +14 -0
  313. package/schemas/models/provider-model-capabilities.v1.schema.json +1072 -0
  314. package/tools/_resolve-impl.mjs +39 -2
  315. package/tools/agents/deploy-agents.mjs +64 -23
  316. package/tools/agents/providers/base.mjs +153 -166
  317. package/tools/agents/providers/claude.mjs +8 -24
  318. package/tools/agents/providers/codex.mjs +18 -11
  319. package/tools/agents/providers/cursor.mjs +19 -18
  320. package/tools/agents/providers/grok-build.mjs +3 -1
  321. package/tools/agents/providers/grokbot.mjs +11 -12
  322. package/tools/agents/providers/hermes.mjs +62 -49
  323. package/tools/agents/providers/omp.mjs +5 -2
  324. package/tools/agents/providers/openclaw-translator.mjs +19 -5
  325. package/tools/agents/providers/openclaw.mjs +9 -4
  326. package/tools/agents/providers/pi.mjs +5 -0
  327. package/tools/agents/providers/provider-prepare-channel.mjs +5 -0
  328. package/tools/agents/providers/provider-prepare-coordinator.mjs +247 -0
  329. package/tools/agents/providers/provider-prepare-worker.mjs +84 -0
  330. package/tools/agents/providers/rule-delivery.mjs +1270 -0
  331. package/tools/agents/providers/warp.mjs +20 -26
  332. package/tools/cli/decision-offload-report.mjs +40 -0
  333. package/tools/cli/workspace-status.mjs +862 -0
  334. package/tools/plugin/package-plugins.mjs +186 -8
  335. package/tools/plugin/plugin-links.mjs +114 -0
  336. package/tools/providers/antigravity-transport.mjs +3 -1
  337. package/tools/providers/deepseek-harness-transport.mjs +360 -0
  338. package/tools/providers/omp-transport.mjs +194 -0
  339. package/tools/ralph-external/lib/claude-adapter.mjs +389 -0
  340. package/tools/ralph-external/lib/codex-adapter.mjs +432 -0
  341. package/tools/ralph-external/lib/consecutive-failure-circuit-breaker.mjs +1748 -0
  342. package/tools/ralph-external/lib/deepseek-harness-adapter.mjs +397 -0
  343. package/tools/ralph-external/lib/factory-adapter.mjs +503 -0
  344. package/tools/ralph-external/lib/launcher-recovery-evidence.mjs +55 -0
  345. package/tools/ralph-external/lib/muse-adapter.mjs +364 -0
  346. package/tools/ralph-external/lib/omp-adapter.mjs +315 -0
  347. package/tools/ralph-external/lib/opencode-adapter.mjs +575 -0
  348. package/tools/ralph-external/lib/openhuman-adapter.mjs +75 -0
  349. package/tools/ralph-external/lib/pi-adapter.mjs +329 -0
  350. package/tools/ralph-external/lib/provider-adapter.mjs +748 -0
  351. package/tools/ralph-external/lib/recovery-probe.mjs +72 -0
  352. package/tools/ralph-external/lib/session-environment.mjs +28 -0
  353. package/tools/ralph-external/lib/systemd-client.mjs +49 -0
  354. package/tools/ralph-external/lib/worker-health.mjs +439 -0
  355. package/tools/ralph-external/lib/worker-isolation.mjs +717 -0
  356. package/tools/ralph-external/lib/worker-overflow.mjs +50 -0
  357. package/tools/ralph-external/process-monitor.mjs +1017 -0
  358. package/tools/ralph-external/session-launcher.mjs +5057 -0
  359. package/tools/scripts/resource-preflight.mjs +541 -0
  360. package/tools/skills/deploy-skills-codex.mjs +2 -1
  361. package/vscode-extension/schemas/aiwg.config.v1.json +2916 -0
@@ -0,0 +1,364 @@
1
+ /**
2
+ * Muse Code (`muse`) provider adapter for headless External Ralph sessions.
3
+ *
4
+ * Drives `muse exec` — Meta's documented headless surface — with JSONL events
5
+ * (`--json`), headless resume (`--session-id`), and transcript/export
6
+ * (`muse export`) support. Optional and post-experimental per
7
+ * `docs/architecture/adr-muse-provider-target.md` ("Headless Ralph"): no
8
+ * `muse exec` contract is assumed beyond what is evidenced below, and the
9
+ * adapter disables entirely via `AIWG_MUSE_RALPH_ENABLED=0` without affecting
10
+ * `aiwg use --provider muse` (the deploy/writer path lives in `src/` and
11
+ * never consults this registry).
12
+ *
13
+ * Flag evidence (all Meta docs at https://dev.meta.ai/docs/muse-code/
14
+ * unless noted):
15
+ * - `muse exec [OPTIONS] [PROMPT]` — headless entrypoint; "takes one
16
+ * prompt, runs it to completion, and exits" (extending). The prompt is
17
+ * positional and must come last. Options are parsed by `exec`, not by
18
+ * the `muse` root — flags placed before the sub-command are silently
19
+ * ignored — so every adapter-built argv starts with `exec`.
20
+ * - `--json` — "emit JSONL events" (extending; configuration lists it as
21
+ * headless-only).
22
+ * - `--prompt-file <path>` — headless-only (configuration).
23
+ * - `--max-model-steps <n>` — headless-only, "cap the run" (configuration).
24
+ * - `--session-id <uuid>` — "To continue an interrupted job
25
+ * non-interactively, use `exec` with the session id":
26
+ * `muse exec --session-id <uuid> "Continue the task."` (extending).
27
+ * There is no headless resume flag; re-passing the id continues the
28
+ * session. `muse resume` is interactive-only.
29
+ * - `--model <id>`, `--reasoning-effort <level>` — common to both launch
30
+ * surfaces (configuration).
31
+ * - `--approval-mode <mode>` — common to both; "`muse exec` accepts both
32
+ * approval flags" (configuration). Opt-in only: the adapter sets NO
33
+ * approval posture by default (#230 out of scope: `--yolo` defaults).
34
+ * - `muse export --session <uuid> --out <path>` — offline,
35
+ * byte-deterministic transcript projection; `--last` and `--redacted`
36
+ * skip the picker / redact payload strings (cookbook:
37
+ * audit-agent-sessions). Export "never modifies the log".
38
+ * - Exit codes: 0 = turn completes, 1 = fails or is cancelled (including a
39
+ * `--max-model-steps` limit), 2 = usage error, 130/143 on SIGINT/SIGTERM
40
+ * (extending).
41
+ * - Sandbox: Muse Code ships an OS-enforced sandbox (bubblewrap/seccomp +
42
+ * namespaces on Linux, seatbelt on macOS) that is ON by default; `--yolo`
43
+ * disables approval AND sandboxing — "use it only on trusted code in a
44
+ * disposable, isolated container" (extending). The adapter never passes
45
+ * `--yolo`. See docs/providers/muse-ralph-exec.md for the CI sandbox
46
+ * (bubblewrap/user-namespace) requirements this implies.
47
+ *
48
+ * Verified against an installed Muse Code 1.4.0 (2026-09-25):
49
+ * - `--json` emits one record envelope per line: `{schema_version, id,
50
+ * stream, sequence, recorded_at, record_type, durability, causation_id,
51
+ * payload_type, payload_schema_version, payload}` — the same envelope as
52
+ * the native session log. `run.output.delta` carries streamed `text`;
53
+ * the run ends with `run.terminal.<state>` whose payload carries
54
+ * `terminal` (`completed`/`failed`), the final `text`, and a `reason`
55
+ * on failure. `parseOutput()` reads exactly those fields.
56
+ * - Exit codes 0 (completed), 1 (run failed, e.g. an unknown model:
57
+ * "model `x` does not exist or you lack access"), 2 (usage error).
58
+ * - `--session-id <uuid>` pins the new session's id (the native log lands
59
+ * in `$XDG_DATA_HOME/muse/sessions/YYYY/MM/DD/<uuid>/`), and re-passing
60
+ * the same id continues that session with its context.
61
+ * - A prompt starting with `-` is parsed as an option (exit 2) unless it
62
+ * follows `--`, so the positional prompt is always preceded by `--`.
63
+ * - Plain mode (no `--json`) prints only the final answer text on stdout.
64
+ *
65
+ * Not assumed:
66
+ * - Transcript paths. The native log root is evidenced, but its layout is
67
+ * internal (retained frames, omission markers), so `getTranscriptPath()`
68
+ * returns null and transcripts come from `muse export`, the documented
69
+ * projection.
70
+ * - A pinned CLI version. Unlike pi, no qualified-version list exists yet;
71
+ * `isAvailable()` checks only that `muse --version` exits 0.
72
+ *
73
+ * @issue #230
74
+ */
75
+
76
+ import { ProviderAdapter, registerProvider } from './provider-adapter.mjs';
77
+ import { classifyWorkerHealthFailure, healthEventMatchesBinding } from './worker-health.mjs';
78
+ import path from 'node:path';
79
+ import { readFileSync } from 'node:fs';
80
+
81
+ const museEffortValues = JSON.parse(readFileSync(new URL('../../../agentic/code/providers/model-capabilities.v1.json', import.meta.url), 'utf8')).providers.muse.effortValues;
82
+
83
+ // Syntax inspected only; neither help nor echo qualifies authenticated execution.
84
+ export const MUSE_DIRECT_VERSION = '1.4.4-R5419.1';
85
+
86
+ /** Quota observations are candidates, not a retry/admission decision. Unknown
87
+ * scope/reset stay null; the caller binds the account/quota domain separately. */
88
+ export function museQuotaEvidence(payload) {
89
+ const failure = classifyWorkerHealthFailure({ type: 'error', message: payload?.reason }, { provider: 'muse' });
90
+ if (failure?.reasonCode !== 'RATE_LIMIT') return null;
91
+ const text = typeof payload.reason === 'string' ? payload.reason : '';
92
+ const reset = typeof payload.reset_at === 'string' ? payload.reset_at
93
+ : /reset(?:[_ -]at)?["\s:=]+(\d{4}-\d\d-\d\dT[\d:.]+Z)/i.exec(text)?.[1];
94
+ return { reasonCode: failure.reasonCode,
95
+ quotaScope: typeof payload.quota_scope === 'string' && /^[a-zA-Z0-9_.:-]{1,128}$/.test(payload.quota_scope) ? payload.quota_scope : null,
96
+ resetAt: reset && Number.isFinite(Date.parse(reset)) ? new Date(reset).toISOString() : null,
97
+ retryAfterSeconds: failure.retryAfterSeconds ?? null };
98
+ }
99
+
100
+ /**
101
+ * Whether the muse exec Ralph adapter is registered. Enabled by default;
102
+ * set `AIWG_MUSE_RALPH_ENABLED` to `0`, `false`, `no`, or `off` to disable
103
+ * the adapter without affecting `aiwg use --provider muse`.
104
+ *
105
+ * @returns {boolean}
106
+ */
107
+ export function isMuseRalphEnabled() {
108
+ const raw = String(process.env.AIWG_MUSE_RALPH_ENABLED ?? '').trim().toLowerCase();
109
+ return !['0', 'false', 'no', 'off'].includes(raw);
110
+ }
111
+
112
+ export class MuseAdapter extends ProviderAdapter {
113
+ observeHealthEvent(event, source, binding) {
114
+ if (source.kind === 'stderr' || !event || typeof event !== 'object' || event.record_type !== 'event') return null;
115
+ if (event.stream?.kind !== 'session' || typeof event.stream.id !== 'string') return null;
116
+ const payload = event.payload;
117
+ if (!payload || typeof payload !== 'object' || typeof payload.run_id !== 'string' || !payload.run_id) return null;
118
+ if (!healthEventMatchesBinding({ sessionId: event.stream.id, runId: payload.run_id }, binding)) return null;
119
+ // Native session records require an already bound session and run. Reading
120
+ // a log from the same provider does not authorize unrelated session traffic.
121
+ if (source.kind === 'session-log' && (!binding.sessionId || event.stream.id !== binding.sessionId
122
+ || !binding.runId || payload.run_id !== binding.runId)) return null;
123
+ if (event.payload_type === 'run.lifecycle.started' && payload.kind === 'run_started') {
124
+ return { kind: 'accepted', sessionId: event.stream.id, runId: payload.run_id, key: event.id };
125
+ }
126
+ // A terminal/delta cannot establish a new session/run binding.
127
+ if (!binding.sessionId || !binding.runId) return null;
128
+ if (event.payload_type === 'run.output.delta' && payload.kind === 'run_output_delta' && typeof payload.text === 'string') {
129
+ return { kind: 'activity', key: event.id };
130
+ }
131
+ if (event.payload_type === 'run.terminal.completed' && payload.kind === 'run_terminal' && payload.terminal === 'completed') {
132
+ return { kind: 'terminal', success: true, key: event.id };
133
+ }
134
+ if (event.payload_type === 'run.terminal.failed' && payload.kind === 'run_terminal' && payload.terminal === 'failed') {
135
+ return { ...classifyWorkerHealthFailure({ type: 'error', message: payload.reason }, { source, provider: 'muse' }),
136
+ ...museQuotaEvidence(payload), fatal: true };
137
+ }
138
+ return null;
139
+ }
140
+ getBinary() {
141
+ return process.env.AIWG_MUSE_BIN || 'muse';
142
+ }
143
+
144
+ getName() {
145
+ return 'muse';
146
+ }
147
+
148
+ /** Direct group path, separate from legacy session defaults. Policy is checked
149
+ * by resolveWorkerPlan/prepareWorkerInvocation, including contributor/ultra
150
+ * denial. Never map an explicit model away or fall back to a CLI default.
151
+ * The host binds the schema's absolute path in the existing control mapping
152
+ * and includes its bytes in installation.runtimeFiles for qualification. */
153
+ buildWorkerArgs(invocation, profile, permissions) {
154
+ const { selected, cwd, briefPath, health } = invocation;
155
+ const model = selected?.model, effort = selected?.effort?.value;
156
+ if (typeof model !== 'string' || !model || model.includes('\0')) throw new Error('Muse requires an explicit resolved model');
157
+ if (typeof effort !== 'string' || !museEffortValues.includes(effort)) throw new Error('Muse requires a declared explicit resolved effort');
158
+ for (const value of [cwd, briefPath]) {
159
+ if (typeof value !== 'string' || !path.isAbsolute(value) || value.includes('\0') || value.split(path.sep).includes('..')) {
160
+ throw new Error('Muse requires absolute workspace and prompt-file paths');
161
+ }
162
+ }
163
+ let schema;
164
+ try { schema = JSON.parse(profile.controls.structuredOutput.mapping); } catch { /* unavailable mapping blocks */ }
165
+ if (!Array.isArray(schema) || schema.length !== 2 || schema[0] !== '--output-schema'
166
+ || typeof schema[1] !== 'string' || !path.isAbsolute(schema[1]) || schema[1].includes('\0') || schema[1].split(path.sep).includes('..')) {
167
+ throw new Error('Muse requires a host-bound output-schema control mapping');
168
+ }
169
+ if (!permissions || !['read-only', 'workspace-write', 'external'].includes(permissions.sandbox)
170
+ || !Number.isSafeInteger(health?.maxSteps) || health.maxSteps < 1) throw new Error('Muse requires bounded steps and sandbox authority');
171
+ // Trust is a host-owned, qualification-bound control, like the schema.
172
+ // Brief contents and CLI defaults cannot opt into workspace instructions.
173
+ let trust;
174
+ try { trust = JSON.parse(profile.controls.trust.mapping); } catch { /* fail closed below */ }
175
+ if (!Array.isArray(trust) || !(trust.length === 0 || trust.length === 1 && trust[0] === '--trust-workspace')) {
176
+ throw new Error('Muse requires an explicit host-controlled workspace trust mapping');
177
+ }
178
+ const args = ['exec', '--json', '--provider', 'meta', '--model', model, '--reasoning-effort', effort,
179
+ '--workspace', cwd, ...trust, '--approval-mode', 'never', '--approval-judge', 'off', '--max-model-steps', String(health.maxSteps),
180
+ ...schema, '--prompt-file', briefPath];
181
+ if (permissions.sandbox === 'read-only') args.push('--disable-write', '--disable-shell');
182
+ return args;
183
+ }
184
+
185
+ getCapabilities() {
186
+ return {
187
+ streamJson: true, // --json (evidenced: JSONL events on stdout)
188
+ sessionResume: true, // --session-id (evidenced: headless resume)
189
+ budgetControl: false, // no --max-budget-usd equivalent documented
190
+ systemPrompt: false, // no --append-system-prompt documented for exec
191
+ agentMode: false, // no --agent flag documented
192
+ mcpConfig: false, // MCP lives in ~/.config/muse/settings.json; no exec flag
193
+ // maxTurns maps to --max-model-steps (evidenced, headless-only); the
194
+ // capability name follows the base-class contract, the argv does not
195
+ // invent a --max-turns flag muse would reject with exit code 2.
196
+ maxTurns: true,
197
+ };
198
+ }
199
+
200
+ /**
201
+ * Build argv for a headless session: `muse exec [OPTIONS] [PROMPT]`.
202
+ * The prompt is positional and always last (evidenced). No approval
203
+ * posture is set unless the caller opts in via `approvalMode` — `--yolo`
204
+ * is never emitted (#230 out of scope).
205
+ *
206
+ * @param {import('./provider-adapter.mjs').SessionArgs & {
207
+ * reasoningEffort?: string, approvalMode?: string, promptFile?: string
208
+ * }} options
209
+ * @returns {string[]}
210
+ */
211
+ buildSessionArgs(options, { json = true } = {}) {
212
+ // Sub-command-first: options are parsed by `exec`, never by the root.
213
+ const args = json ? ['exec', '--json'] : ['exec'];
214
+
215
+ // Session pin / headless resume (evidenced).
216
+ if (options.sessionId) args.push('--session-id', options.sessionId);
217
+
218
+ // Model and reasoning depth (evidenced, common to both surfaces).
219
+ const model = options.model ? this.mapModel(options.model) : null;
220
+ if (model) args.push('--model', model);
221
+ if (options.reasoningEffort) args.push('--reasoning-effort', options.reasoningEffort);
222
+
223
+ // Step cap (evidenced, headless-only). The capability is `maxTurns`;
224
+ // muse's flag is --max-model-steps, so translate rather than warn.
225
+ if (options.maxTurns) args.push('--max-model-steps', String(options.maxTurns));
226
+
227
+ // Approval posture is operator opt-in only (evidenced flag, no default).
228
+ if (options.approvalMode) args.push('--approval-mode', options.approvalMode);
229
+
230
+ if (options.budget) this.warnUnsupported('budgetControl', 'Budget control');
231
+ if (options.systemPrompt) this.warnUnsupported('systemPrompt', 'System prompt');
232
+ if (options.agent) this.warnUnsupported('agentMode', 'Agent mode');
233
+ if (options.mcpConfig) this.warnUnsupported('mcpConfig', 'MCP configuration');
234
+
235
+ if (options.promptFile) {
236
+ args.push('--prompt-file', options.promptFile);
237
+ } else {
238
+ // The prompt itself (positional, must be last). `--` stops option
239
+ // parsing so a prompt that starts with `-` is not read as a flag.
240
+ args.push('--', options.prompt);
241
+ }
242
+
243
+ return args;
244
+ }
245
+
246
+ /**
247
+ * Build argv for short analysis calls (spawnSync). Same headless surface
248
+ * as sessions, but without `--json`: analysis consumers parse the reply
249
+ * text, and `parseOutput()` extracts no text from JSONL events.
250
+ *
251
+ * @param {import('./provider-adapter.mjs').AnalysisArgs} options
252
+ * @returns {string[]}
253
+ */
254
+ buildAnalysisArgs(options) {
255
+ return this.buildSessionArgs(options, { json: false });
256
+ }
257
+
258
+ /**
259
+ * Build argv for the transcript/export path: `muse export`.
260
+ * Offline and byte-deterministic per Meta docs; never modifies the log.
261
+ *
262
+ * @param {{ sessionId?: string, out?: string, redacted?: boolean, last?: boolean }} options
263
+ * @returns {string[]}
264
+ */
265
+ buildExportArgs(options = {}) {
266
+ const args = ['export'];
267
+ if (options.last) {
268
+ args.push('--last');
269
+ } else if (options.sessionId) {
270
+ args.push('--session', options.sessionId);
271
+ }
272
+ if (options.redacted) args.push('--redacted');
273
+ if (options.out) args.push('--out', options.out);
274
+ return args;
275
+ }
276
+
277
+ /**
278
+ * The CLI accepts `--model <id>` with a Meta provider catalog id
279
+ * (observed: `muse-spark-1.3`, the current model, plus
280
+ * `muse-spark-1.3-contributor`, `muse-spark-1.2`, and
281
+ * `muse-spark-1.2-contributor`). Only Muse ids pass through. Generic or
282
+ * other-provider names (Ralph defaults to Claude names) map to null so no
283
+ * `--model` flag is emitted and muse uses its configured default.
284
+ *
285
+ * @param {string} genericModel
286
+ * @returns {string|null}
287
+ */
288
+ mapModel(genericModel) {
289
+ return /^muse-/i.test(genericModel) ? genericModel : null;
290
+ }
291
+
292
+ getEnvOverrides() {
293
+ return { CI: 'true', NO_COLOR: '1' };
294
+ }
295
+
296
+ /** No evidenced stdin command channel for `muse exec`; no abort frame. */
297
+ getAbortInput() {
298
+ return null;
299
+ }
300
+
301
+ /**
302
+ * ADR fail-closed path policy: no native session-log root is assumed, so
303
+ * there is no transcript path to return. Use `buildExportArgs()` to
304
+ * produce a `muse export` document instead.
305
+ *
306
+ * @returns {null}
307
+ */
308
+ getTranscriptPath() {
309
+ return null;
310
+ }
311
+
312
+ /**
313
+ * Parse `muse exec --json` output. Returns the events, the final answer
314
+ * text, and settlement from the `run.terminal.<state>` record: `settled`
315
+ * is true only for `completed`, false for any other terminal state, and
316
+ * null when the stream ended without a terminal record. One malformed
317
+ * line rejects the whole stream (fail closed).
318
+ *
319
+ * @param {string} stdout
320
+ * @returns {{ events: object[], text: string|null, settled: boolean|null,
321
+ * terminal: string|null, reason: string|null } | null}
322
+ */
323
+ parseOutput(stdout) {
324
+ if (typeof stdout !== 'string' || Buffer.byteLength(stdout) > 10485760) return null;
325
+ const events = [];
326
+ for (const raw of stdout.split('\n')) {
327
+ const line = raw.endsWith('\r') ? raw.slice(0, -1) : raw;
328
+ if (!line) continue;
329
+ try {
330
+ events.push(JSON.parse(line));
331
+ } catch {
332
+ return null;
333
+ }
334
+ }
335
+ if (!events.length) return null;
336
+ let deltas = '';
337
+ let terminal = null;
338
+ for (const event of events) {
339
+ const type = typeof event?.payload_type === 'string' ? event.payload_type : '';
340
+ const payload = event?.payload ?? {};
341
+ if (type === 'run.output.delta' && typeof payload.text === 'string') deltas += payload.text;
342
+ if (terminal) return null; // double final or output after terminal
343
+ if (type.startsWith('run.terminal.')) {
344
+ if (!['run.terminal.completed', 'run.terminal.failed'].includes(type)
345
+ || payload.terminal !== type.slice('run.terminal.'.length)) return null;
346
+ terminal = payload;
347
+ }
348
+ }
349
+ const state = typeof terminal?.terminal === 'string' ? terminal.terminal : null;
350
+ const finalText = typeof terminal?.text === 'string' && terminal.text ? terminal.text : deltas;
351
+ return {
352
+ events,
353
+ text: finalText || null,
354
+ settled: state === null ? null : state === 'completed',
355
+ terminal: state,
356
+ reason: typeof terminal?.reason === 'string' ? terminal.reason : null,
357
+ ...(terminal && museQuotaEvidence(terminal) ? { quota: museQuotaEvidence(terminal) } : {}),
358
+ };
359
+ }
360
+ }
361
+
362
+ registerProvider('muse', () => new MuseAdapter());
363
+
364
+ export default MuseAdapter;