@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,432 @@
1
+ /**
2
+ * Codex CLI Provider Adapter for External Ralph Loop
3
+ *
4
+ * Provides support for OpenAI's Codex CLI as a provider for
5
+ * autonomous task execution in Ralph loops.
6
+ *
7
+ * Codex CLI differences from Claude:
8
+ * - Binary: `codex` instead of `claude`
9
+ * - Headless flag: `--dangerously-bypass-approvals-and-sandbox` (full dangerous mode)
10
+ * - Requires `--skip-git-repo-check` for temp/non-git working directories
11
+ * - No stream-json output format (text only)
12
+ * - No session resume capability
13
+ * - No --agent flag
14
+ * - No --mcp-config flag
15
+ * - No --append-system-prompt flag (inject into main prompt)
16
+ * - No --max-budget-usd flag
17
+ * - Model: generic aliases map to the GPT-5.6 tier ladder (sol / terra / luna)
18
+ *
19
+ * @implements Plan: Multi-Provider Support for External Ralph Loop
20
+ */
21
+
22
+ import { ProviderAdapter, registerProvider } from './provider-adapter.mjs';
23
+ import { classifyWorkerHealthFailure, healthEventMatchesBinding } from './worker-health.mjs';
24
+
25
+ /**
26
+ * Model mapping from generic names to Codex-specific models.
27
+ *
28
+ * Tier-equivalent mapping (observed in Codex model/list, 2026-09-21):
29
+ * premium = gpt-5.6-sol, standard = gpt-5.6-terra, economy = gpt-5.6-luna.
30
+ * The flagship gpt-6-astra is never selected by an alias; pass it explicitly
31
+ * (e.g., --model gpt-6-astra) when the user elects it.
32
+ */
33
+ const MODEL_MAP = {
34
+ 'opus': 'gpt-5.6-sol',
35
+ 'sonnet': 'gpt-5.6-terra',
36
+ 'haiku': 'gpt-5.6-luna',
37
+ };
38
+
39
+ /**
40
+ * Version-bound direct-worker surface (roctinam/aiwg#2897, B-OG-07).
41
+ *
42
+ * Qualified against codex-cli 0.161.0 `--help`/`exec --help` (help/version
43
+ * syntax only, 2026-10-09; never live qualification):
44
+ *
45
+ * codex --no-daemon exec --ignore-user-config -m M \
46
+ * -c model_reasoning_effort="E" -s S -C W -c approval_policy="never" \
47
+ * --skip-git-repo-check -o F --json - < briefPath
48
+ *
49
+ * `--no-daemon` is a root-level flag and `--ignore-user-config` is an
50
+ * `exec`-level flag (root `--help` lists no `--ignore-user-config`;
51
+ * `exec --help` does). `-C/--cd`, `-a/--ask-for-approval` and
52
+ * `-s/--sandbox` are also root-level (there is no `-a` on `exec --help`;
53
+ * approval travels as the `-c approval_policy` override). `-m/--model`
54
+ * is global;
55
+ * `--skip-git-repo-check`, `--json` (JSONL thread/turn/item/error events),
56
+ * `-o/--output-last-message` and `--output-schema` belong to `exec`.
57
+ * `--ignore-user-config` skips `$CODEX_HOME/config.toml`; auth still
58
+ * resolves via `CODEX_HOME` (per root `--help`), so `CODEX_HOME` (or `HOME`
59
+ * for its default location) stays on the env allowlist and nothing else
60
+ * does. `codex mcp-server --help` still prints the root help on 0.161.0, so
61
+ * native MCP stays version-blocked; the AIWG `worker-invoke` bridge remains
62
+ * the MCP route. There is no `--effort` flag: effort travels only as the
63
+ * `-c model_reasoning_effort` config override, emitted as one argv token
64
+ * with TOML `"E"` quoting and no shell layer (`JSON.stringify`, never
65
+ * `'"E"'`). There is no qualified step-cap flag and no per-call subagent
66
+ * disable. The brief travels on stdin (`-` prompt argument, `< briefPath`);
67
+ * it never enters argv, `-c` values or the environment, which also keeps
68
+ * leading-dash briefs out of option parsing.
69
+ *
70
+ * Installed-module shape: static `interfaceVersion` and `register` exports
71
+ * so the #2885 installed loader can approve this file by digest under
72
+ * `installed:codex` (mirroring #2911 openhuman-adapter.mjs). The bottom
73
+ * self-registration targets the legacy Ralph-loop registry only; the direct
74
+ * worker profile loads through the installed loader.
75
+ */
76
+ export const CODEX_SUPPORTED_VERSIONS = Object.freeze(['0.161.0']);
77
+ export const CODEX_DIRECT_EFFORT_VALUES = Object.freeze(['minimal', 'low', 'medium', 'high', 'xhigh']);
78
+ export const CODEX_DIRECT_SANDBOX_MODES = Object.freeze(['read-only', 'workspace-write']);
79
+ /** Non-prompting execution only: a requested `on-request` is refused. */
80
+ export const CODEX_DIRECT_APPROVAL_POLICIES = Object.freeze(['never']);
81
+ /** Brief transport for the direct profile: piped stdin, never argv. */
82
+ export const CODEX_DIRECT_STDIN = 'brief-text';
83
+ /** Generic Ralph-loop aliases resolve to the stale gpt-5.6 ladder; the
84
+ * direct profile requires an exact observed API model instead. */
85
+ const CODEX_GENERIC_ALIASES = Object.freeze(['opus', 'sonnet', 'haiku']);
86
+
87
+ /**
88
+ * Summarize one `exec --json` stdout capture: event kinds, correlated
89
+ * thread/turn identities and any model the stream reports. `threadBound`
90
+ * requires `thread.started` plus `turn.started` with a single thread id
91
+ * across all carrying events and every completed turn previously started.
92
+ * `modelMismatch` is true when the stream names a model and the requested
93
+ * pin is not among them (an observed substitution must stop/review, never
94
+ * qualify). Used by the direct-worker conformance tests (CX04b) to detect
95
+ * a model substitution from a real `exec --json` run against the fixture.
96
+ * @param {unknown} stdout
97
+ * @param {unknown} requestedModel
98
+ */
99
+ export function summarizeCodexStream(stdout, requestedModel) {
100
+ const kinds = [];
101
+ const threadIds = new Set();
102
+ const startedTurns = new Set();
103
+ const completedTurns = new Set();
104
+ const observedModels = new Set();
105
+ let malformed = 0;
106
+ for (const line of String(stdout ?? '').split('\n')) {
107
+ const trimmed = line.trim();
108
+ if (!trimmed) continue;
109
+ let event;
110
+ try {
111
+ event = JSON.parse(trimmed);
112
+ } catch {
113
+ malformed += 1;
114
+ continue;
115
+ }
116
+ if (!event || typeof event !== 'object' || typeof event.type !== 'string') {
117
+ malformed += 1;
118
+ continue;
119
+ }
120
+ kinds.push(event.type);
121
+ if (typeof event.thread_id === 'string' && event.thread_id) threadIds.add(event.thread_id);
122
+ if (typeof event.turn_id === 'string' && event.turn_id) {
123
+ if (event.type === 'turn.started') startedTurns.add(event.turn_id);
124
+ if (event.type === 'turn.completed' || event.type === 'turn.failed') completedTurns.add(event.turn_id);
125
+ }
126
+ if (typeof event.model === 'string' && event.model) observedModels.add(event.model);
127
+ }
128
+ const models = [...observedModels];
129
+ return {
130
+ kinds,
131
+ threadIds: [...threadIds],
132
+ startedTurns: [...startedTurns],
133
+ completedTurns: [...completedTurns],
134
+ observedModels: models,
135
+ observedModel: models.length === 1 ? models[0] : null,
136
+ malformed,
137
+ threadBound: kinds.includes('thread.started') && kinds.includes('turn.started')
138
+ && threadIds.size === 1 && [...completedTurns].every(id => startedTurns.has(id)),
139
+ terminalObserved: kinds.includes('turn.completed') || kinds.includes('turn.failed'),
140
+ modelMismatch: models.length > 0 && (typeof requestedModel !== 'string' || !observedModels.has(requestedModel)),
141
+ };
142
+ }
143
+
144
+ export class CodexAdapter extends ProviderAdapter {
145
+ observeHealthEvent(event, source, binding) {
146
+ if (source.kind !== 'stdout' || !event || typeof event !== 'object') return null;
147
+ if (!healthEventMatchesBinding({ sessionId: event.thread_id }, binding)) return null;
148
+ if (event.type === 'thread.started' && typeof event.thread_id === 'string') return { kind: 'setup', sessionId: event.thread_id };
149
+ if (event.type === 'turn.started') return { kind: 'accepted', key: event.turn_id };
150
+ if (event.type === 'item.completed') {
151
+ const item = event.item;
152
+ if (!item || typeof item !== 'object') return null;
153
+ if (item.type === 'error' || item.status === 'failed' || (Number.isInteger(item.exit_code) && item.exit_code !== 0)) {
154
+ return classifyWorkerHealthFailure({ type: 'error', message: item.message }, { source, provider: 'codex' })
155
+ ?? { kind: 'error', reasonCode: 'tool-failed' };
156
+ }
157
+ if (typeof item.id === 'string' && ['agent_message', 'command_execution', 'file_change', 'mcp_tool_call', 'web_search'].includes(item.type)) {
158
+ return { kind: 'progress', key: item.id };
159
+ }
160
+ }
161
+ if (event.type === 'item.started' || event.type === 'item.updated') return { kind: 'activity' };
162
+ if (event.type === 'turn.completed') return { kind: 'terminal', success: true, key: event.turn_id ?? 'turn.completed' };
163
+ if (event.type === 'error' || event.type === 'turn.failed') {
164
+ // A standalone `error` event fails the run exactly like `turn.failed`:
165
+ // the observer treats fatal errors as non-terminal-proof, so a later
166
+ // `turn.completed` with exit 0 cannot paper over them.
167
+ return { ...classifyWorkerHealthFailure({ type: 'error', message: event.message ?? event.error?.message }, { source, provider: 'codex' }),
168
+ fatal: true };
169
+ }
170
+ return null;
171
+ }
172
+ /** @returns {string} */
173
+ getBinary() {
174
+ return 'codex';
175
+ }
176
+
177
+ /** @returns {string} */
178
+ getName() {
179
+ return 'codex';
180
+ }
181
+
182
+ /**
183
+ * Codex has limited capabilities compared to Claude.
184
+ * @returns {import('./provider-adapter.mjs').ProviderCapabilities}
185
+ */
186
+ getCapabilities() {
187
+ return {
188
+ streamJson: false,
189
+ sessionResume: false,
190
+ budgetControl: false,
191
+ systemPrompt: false,
192
+ agentMode: false,
193
+ mcpConfig: false,
194
+ maxTurns: false,
195
+ };
196
+ }
197
+
198
+ /**
199
+ * Driver-owned argv after the binary for the version-bound direct-shell
200
+ * profile. Every control is explicit: `--ignore-user-config` (user
201
+ * config.toml skipped, auth still via `CODEX_HOME`), exact observed
202
+ * model, explicit effort as one `-c model_reasoning_effort="E"` token
203
+ * (TOML `"E"` quoting via `JSON.stringify`; there is no shell in argv),
204
+ * explicit sandbox/approval (`never` only), the conductor workdir as
205
+ * `-C`, the final file as `-o`, the JSONL event stream as `--json` and
206
+ * `-` as the prompt argument so the brief arrives on stdin
207
+ * (`stdin: 'brief-text'`). Permission flags from the legacy Ralph loop
208
+ * (`--dangerously-bypass-approvals-and-sandbox`), guessed step caps and
209
+ * silent alias/default inheritance are never emitted. The brief is
210
+ * validated here but never placed in argv.
211
+ *
212
+ * @param {{ selected?: { model?: unknown, effort?: { value?: unknown } }, cwd?: unknown, brief?: unknown, finalPath?: unknown }} invocation
213
+ * @param {unknown} _profile
214
+ * @param {{ sandbox?: unknown, approval?: unknown }} [permissions]
215
+ * @returns {string[]}
216
+ */
217
+ buildWorkerArgs(invocation, _profile, permissions) {
218
+ const model = invocation?.selected?.model;
219
+ if (typeof model !== 'string' || !model || model.includes('\0')) {
220
+ throw new Error('Codex worker requires an explicit model');
221
+ }
222
+ if (CODEX_GENERIC_ALIASES.includes(model.toLowerCase())) {
223
+ throw new Error(`Codex worker requires an exact observed model, not the generic alias '${model}'`);
224
+ }
225
+ const effort = invocation?.selected?.effort?.value ?? null;
226
+ if (effort === null || !CODEX_DIRECT_EFFORT_VALUES.includes(effort)) {
227
+ throw new Error('Codex worker requires an explicit qualified effort (never a CLI default)');
228
+ }
229
+ const sandbox = permissions?.sandbox ?? 'workspace-write';
230
+ if (!CODEX_DIRECT_SANDBOX_MODES.includes(sandbox)) {
231
+ throw new Error(`Codex worker sandbox is not a qualified direct mode: ${String(sandbox)}`);
232
+ }
233
+ const approval = permissions?.approval ?? 'never';
234
+ if (!CODEX_DIRECT_APPROVAL_POLICIES.includes(approval)) {
235
+ throw new Error(`Codex worker approval is not a qualified direct policy: ${String(approval)}`);
236
+ }
237
+ const cwd = invocation?.cwd;
238
+ if (typeof cwd !== 'string' || !cwd.startsWith('/') || cwd.includes('\0')) {
239
+ throw new Error('Codex worker requires an absolute workspace');
240
+ }
241
+ const finalPath = invocation?.finalPath;
242
+ if (typeof finalPath !== 'string' || !finalPath.startsWith('/') || finalPath.includes('\0')) {
243
+ throw new Error('Codex worker requires an absolute final-output path');
244
+ }
245
+ const brief = invocation?.brief;
246
+ if (typeof brief !== 'string' || !brief || brief.includes('\0')) {
247
+ throw new Error('Codex worker requires a non-empty brief');
248
+ }
249
+ return [
250
+ '--no-daemon',
251
+ 'exec',
252
+ '--ignore-user-config',
253
+ '-m', model,
254
+ '-c', `model_reasoning_effort=${JSON.stringify(effort)}`,
255
+ '-s', sandbox,
256
+ '-C', cwd,
257
+ '-c', `approval_policy=${JSON.stringify(approval)}`,
258
+ '--skip-git-repo-check',
259
+ '-o', finalPath,
260
+ '--json',
261
+ '-',
262
+ ];
263
+ }
264
+
265
+ /**
266
+ * `exec --json` has no stdin abort channel and stdin carries the brief to
267
+ * EOF, so cancellation stays with owned process control.
268
+ * @returns {null}
269
+ */
270
+ getAbortInput() {
271
+ return null;
272
+ }
273
+
274
+ /**
275
+ * Build args for the main headless session.
276
+ *
277
+ * Codex uses `--full-auto` for headless operation and has a different
278
+ * argument structure than Claude.
279
+ *
280
+ * @param {import('./provider-adapter.mjs').SessionArgs} options
281
+ * @returns {string[]}
282
+ */
283
+ buildSessionArgs(options) {
284
+ const args = [
285
+ // Codex requires the 'exec' subcommand for non-interactive (headless) use.
286
+ 'exec',
287
+ // SECURITY: bypass ALL confirmation prompts and sandboxing.
288
+ // Required for headless operation in temp directories (UAT, daemon tasks).
289
+ // Equivalent to Claude's --dangerously-skip-permissions.
290
+ '--dangerously-bypass-approvals-and-sandbox',
291
+ // Allow running outside a git repository (temp dirs used by UAT and daemon).
292
+ '--skip-git-repo-check',
293
+ ];
294
+
295
+ // Model selection (map generic to Codex-specific)
296
+ if (options.model) {
297
+ args.push('--model', this.mapModel(options.model));
298
+ }
299
+
300
+ // Budget control not supported - warn if requested
301
+ if (options.budget) {
302
+ this.warnUnsupported('budgetControl', 'Budget control (--max-budget-usd)');
303
+ }
304
+
305
+ // Max turns not supported
306
+ if (options.maxTurns) {
307
+ this.warnUnsupported('maxTurns', 'Max turns (--max-turns)');
308
+ }
309
+
310
+ // Session ID not supported - each iteration is a fresh session
311
+ if (options.sessionId) {
312
+ this.warnUnsupported('sessionResume', 'Session resume (--session-id)');
313
+ }
314
+
315
+ // MCP configuration not supported
316
+ if (options.mcpConfig) {
317
+ this.warnUnsupported('mcpConfig', 'MCP configuration (--mcp-config)');
318
+ }
319
+
320
+ // System prompt: Codex doesn't support --append-system-prompt,
321
+ // so we prepend it to the main prompt
322
+ let prompt = options.prompt;
323
+ if (options.systemPrompt) {
324
+ prompt = `[System Context]\n${options.systemPrompt}\n\n[Task]\n${prompt}`;
325
+ }
326
+
327
+ // The prompt itself (must be last)
328
+ args.push(prompt);
329
+
330
+ return args;
331
+ }
332
+
333
+ /**
334
+ * Build args for short analysis calls (spawnSync).
335
+ *
336
+ * Codex analysis calls use the same basic pattern but with
337
+ * Codex-specific flags.
338
+ *
339
+ * @param {import('./provider-adapter.mjs').AnalysisArgs} options
340
+ * @returns {string[]}
341
+ */
342
+ buildAnalysisArgs(options) {
343
+ const args = [
344
+ 'exec',
345
+ '--dangerously-bypass-approvals-and-sandbox',
346
+ '--skip-git-repo-check',
347
+ ];
348
+
349
+ // Model selection
350
+ if (options.model) {
351
+ args.push('--model', this.mapModel(options.model));
352
+ }
353
+
354
+ // Agent flag not supported by Codex - inject agent context into prompt
355
+ if (options.agent) {
356
+ // Silently skip - agent context will be in the prompt itself
357
+ }
358
+
359
+ // The analysis prompt (must be last)
360
+ args.push(options.prompt);
361
+
362
+ return args;
363
+ }
364
+
365
+ /**
366
+ * Map generic model names to Codex-specific models.
367
+ *
368
+ * Mirrors the catalog roles used by tools/agents/providers/codex.mjs:
369
+ * opus → gpt-5.6-sol
370
+ * sonnet → gpt-5.6-terra
371
+ * haiku → gpt-5.6-luna
372
+ *
373
+ * @param {string} genericModel
374
+ * @returns {string}
375
+ */
376
+ mapModel(genericModel) {
377
+ const mapped = MODEL_MAP[genericModel.toLowerCase()];
378
+ if (mapped) return mapped;
379
+ // Pass through if already a Codex model name or unknown
380
+ return genericModel;
381
+ }
382
+
383
+ /**
384
+ * Environment overrides for headless Codex sessions.
385
+ * @returns {Object<string, string>}
386
+ */
387
+ getEnvOverrides() {
388
+ return {
389
+ CI: 'true',
390
+ };
391
+ }
392
+
393
+ /**
394
+ * Codex does not store session transcripts in a known location.
395
+ * @returns {null}
396
+ */
397
+ getTranscriptPath() {
398
+ return null;
399
+ }
400
+
401
+ /**
402
+ * Parse Codex output - Codex returns plain text, not stream-json.
403
+ * We still try to extract JSON from the output for analysis results.
404
+ *
405
+ * @param {string} stdout
406
+ * @returns {Object|null}
407
+ */
408
+ parseOutput(stdout) {
409
+ // Codex output is plain text. Try to find embedded JSON.
410
+ try {
411
+ const jsonMatch = stdout.match(/\{[\s\S]*\}/);
412
+ if (!jsonMatch) return null;
413
+ return JSON.parse(jsonMatch[0]);
414
+ } catch {
415
+ return null;
416
+ }
417
+ }
418
+ }
419
+
420
+ // Self-register on import for the legacy Ralph loop only. The direct worker
421
+ // profile loads through the #2885 installed loader instead (see below).
422
+ registerProvider('codex', () => new CodexAdapter());
423
+
424
+ /** Installed-module interface version (mirrors #2911 openhuman-adapter.mjs). */
425
+ export const interfaceVersion = 1;
426
+
427
+ /** Installed-module registration: exactly the one approved adapter ID. */
428
+ export function register(factory) {
429
+ factory('codex', () => new CodexAdapter());
430
+ }
431
+
432
+ export default CodexAdapter;