@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,75 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import path from 'node:path';
3
+
4
+ // Share PATH/PATHEXT lookup with callers that can launch arbitrary batch files.
5
+ function* executableCandidates(command, searchPath, pathExt, preferNative = false, cwd = process.cwd()) {
6
+ const candidates = path.isAbsolute(command)
7
+ ? [command]
8
+ : /[\\/]/.test(command)
9
+ ? [path.resolve(cwd, ...command.split(/[\\/]/))]
10
+ : searchPath.split(';').filter(Boolean).map(dir => path.join(dir, command));
11
+ for (const candidate of candidates) {
12
+ const pathExtensions = pathExt.split(';').filter(Boolean).map(ext => ext.toLowerCase());
13
+ const extension = path.extname(candidate).toLowerCase();
14
+ const extensions = extension && (pathExtensions.includes(extension) || existsSync(candidate))
15
+ ? ['']
16
+ : pathExtensions;
17
+ if (preferNative) {
18
+ extensions.sort((a, b) => Number(!/\.(?:exe|com)$/i.test(a)) - Number(!/\.(?:exe|com)$/i.test(b)));
19
+ }
20
+ for (const extension of extensions) {
21
+ const executable = `${candidate}${extension}`;
22
+ if (existsSync(executable)) yield executable;
23
+ }
24
+ }
25
+ }
26
+
27
+ export function resolveExecutable(
28
+ command,
29
+ platform = process.platform,
30
+ searchPath = process.env.PATH ?? '',
31
+ pathExt = process.env.PATHEXT ?? '.COM;.EXE;.BAT;.CMD',
32
+ cwd = process.cwd(),
33
+ ) {
34
+ if (platform !== 'win32') return command;
35
+ for (const executable of executableCandidates(command, searchPath, pathExt, true, cwd)) {
36
+ return executable;
37
+ }
38
+ return command;
39
+ }
40
+
41
+ // npm's Windows shims cannot be spawned directly without a shell. Resolve only
42
+ // their standard Node invocation; never evaluate batch contents or shell args.
43
+ export function cliCommand(
44
+ command,
45
+ args,
46
+ platform = process.platform,
47
+ searchPath = process.env.PATH ?? '',
48
+ pathExt = process.env.PATHEXT ?? '.COM;.EXE;.BAT;.CMD',
49
+ cwd = process.cwd(),
50
+ ) {
51
+ if (platform !== 'win32') return [command, args];
52
+ for (const shim of executableCandidates(command, searchPath, pathExt, false, cwd)) {
53
+ if (!/\.(?:cmd|bat)$/i.test(shim)) return [shim, args];
54
+ const contents = readFileSync(shim, 'utf8');
55
+ const entry = contents.match(
56
+ /^\s*(?:endLocal & goto #_undefined_# 2>NUL \|\| title %COMSPEC% & )?(?:set PATHEXT=%PATHEXT:;.JS;=;% & )?"%_prog%"\s+((?:(?:"[^"\r\n&|<>^%]*"|[^\s"&|<>^%]+)\s+)*)"%dp0%\\([^"\r\n]+)"\s+%\*\s*$/m,
57
+ );
58
+ // Node distributions bundle npm/npx launchers with named entry variables
59
+ // rather than cmd-shim's _prog invocation. Resolve their local JS entry.
60
+ const bundled = !entry && /^(?:npm|npx)\.cmd$/i.test(path.basename(shim))
61
+ ? contents.match(/^SET "(NPM|NPX)_CLI_JS=%~dp0\\(node_modules\\npm\\bin\\(?:npm|npx)-cli\.js)"\s*$/im)
62
+ : null;
63
+ if (!entry && (!bundled || !contents.includes(`"%NODE_EXE%" "%${bundled[1]}_CLI_JS%" %*`))) {
64
+ throw new Error(`Unsupported Windows CLI shim: ${shim}`);
65
+ }
66
+ const nodeArgs = entry
67
+ ? Array.from(entry[1].matchAll(/"([^"]*)"|([^\s"]+)/g), match => match[1] ?? match[2])
68
+ : [];
69
+ const script = path.resolve(path.dirname(shim), ...(entry ? entry[2] : bundled[2]).split('\\'));
70
+ if (!existsSync(script)) throw new Error(`Missing Windows CLI entry point: ${script}`);
71
+ const localNode = path.join(path.dirname(shim), 'node.exe');
72
+ return [existsSync(localNode) ? localNode : process.execPath, [...nodeArgs, script, ...args]];
73
+ }
74
+ return [command, args];
75
+ }
@@ -0,0 +1,6 @@
1
+ import type { ChildProcess } from 'node:child_process';
2
+
3
+ export function signalChild(
4
+ child: Pick<ChildProcess, 'pid' | 'kill'> | null | undefined,
5
+ signal?: NodeJS.Signals | number,
6
+ ): boolean;
@@ -0,0 +1,7 @@
1
+ /** Signal only a child that acquired a real PID. Failed spawns can retain a
2
+ * native handle with PID zero until their asynchronous error event arrives.
3
+ * Keep native return/throw behavior so callers retain their stop semantics. */
4
+ export function signalChild(child, signal) {
5
+ if (!Number.isSafeInteger(child?.pid) || child.pid <= 0) return false;
6
+ return !!child.kill(signal);
7
+ }
@@ -82,6 +82,14 @@ export function getProviderCapabilities(providerKey) {
82
82
  }
83
83
  return undefined;
84
84
  }
85
+ /**
86
+ * Get the S0 route-feasibility row for a provider by key or alias.
87
+ * Returns undefined when the matrix carries no row (e.g. registry-only
88
+ * `generic`, which is not a matrix provider).
89
+ */
90
+ export function getRouteFeasibility(providerKey) {
91
+ return getProviderCapabilities(providerKey)?.route_feasibility;
92
+ }
85
93
  export function getAgentCapabilities(providerKey, agentType = 'default') {
86
94
  const caps = getProviderCapabilities(providerKey);
87
95
  if (!caps?.agent_capabilities)
@@ -15,6 +15,22 @@ version: "1.0"
15
15
  providers:
16
16
  claude-code:
17
17
  display_name: Claude Code
18
+ aliases:
19
+ - claude
20
+ route_feasibility:
21
+ scope: in
22
+ identity: runtime-configured-only
23
+ evidence: H
24
+ channel: "claude -p --output-format stream-json --verbose; terminal result extraction"
25
+ fanout: unknown
26
+ probe_budget: { status: authorized, calls: 3, tokens: 30000, authorized_by: operator, authorized_at: "2026-10-07", hosts: [titan, noodle] }
27
+ coverage:
28
+ profile_issue: "roctinam/aiwg#2900"
29
+ source_date: "2026-10-08"
30
+ live_qualified: false
31
+ sources:
32
+ - "host-help: claude 2.1.295 on titan (--version/--help only)"
33
+ - "tools/ralph-external/lib/claude-adapter.mjs"
18
34
  status: stable
19
35
  daemon_tier: unsupported
20
36
  daemon_pty_adapter: false
@@ -77,6 +93,20 @@ providers:
77
93
 
78
94
  codex:
79
95
  display_name: OpenAI Codex
96
+ route_feasibility:
97
+ scope: in
98
+ identity: runtime-configured-only
99
+ evidence: H
100
+ channel: "codex debug models + exec --json -o F thread/turn/item/error event stream"
101
+ fanout: unknown
102
+ probe_budget: { status: authorized, calls: 3, tokens: 50000, authorized_by: operator, authorized_at: "2026-10-07", hosts: [titan, noodle] }
103
+ coverage:
104
+ profile_issue: "roctinam/aiwg#2897"
105
+ source_date: "2026-10-08"
106
+ live_qualified: false
107
+ sources:
108
+ - "host-help: codex-cli 0.161.0 on titan (--version/--help only); `codex mcp-server --help` still prints root help"
109
+ - "tools/ralph-external/lib/codex-adapter.mjs"
80
110
  aliases:
81
111
  - openai
82
112
  status: stable
@@ -146,6 +176,21 @@ providers:
146
176
 
147
177
  copilot:
148
178
  display_name: GitHub Copilot
179
+ aliases:
180
+ - github-copilot
181
+ route_feasibility:
182
+ scope: in
183
+ identity: runtime-configured-only
184
+ evidence: D
185
+ channel: "copilot -p --output-format json; scoped --allow-tool permissions"
186
+ fanout: unknown
187
+ probe_budget: { status: authorized, calls: 3, tokens: 30000, authorized_by: operator, authorized_at: "2026-10-07", hosts: [titan, noodle] }
188
+ coverage:
189
+ profile_issue: "roctinam/aiwg#2901"
190
+ source_date: "2026-10-08"
191
+ live_qualified: false
192
+ sources:
193
+ - "https://docs.github.com/en/copilot/reference/copilot-cli-reference/cli-programmatic-reference"
149
194
  status: stable
150
195
  daemon_tier: unsupported
151
196
  daemon_pty_adapter: false
@@ -181,6 +226,21 @@ providers:
181
226
 
182
227
  factory:
183
228
  display_name: Factory AI
229
+ aliases:
230
+ - factory-ai
231
+ route_feasibility:
232
+ scope: in
233
+ identity: runtime-configured-only
234
+ evidence: R
235
+ channel: "droid exec --output-format stream-json; terminal parser to qualify"
236
+ fanout: unknown
237
+ probe_budget: { status: authorized, calls: 3, tokens: 30000, authorized_by: operator, authorized_at: "2026-10-07", hosts: [titan, noodle] }
238
+ coverage:
239
+ profile_issue: "roctinam/aiwg#2902"
240
+ source_date: "2026-10-07"
241
+ live_qualified: false
242
+ sources:
243
+ - "tools/ralph-external/lib/factory-adapter.mjs"
184
244
  status: stable
185
245
  # droid CLI runs headless via `droid exec`; AIWG daemon provides persistence layer
186
246
  daemon_tier: unsupported
@@ -217,6 +277,20 @@ providers:
217
277
 
218
278
  cursor:
219
279
  display_name: Cursor IDE
280
+ route_feasibility:
281
+ scope: in
282
+ identity: runtime-configured-only
283
+ evidence: D
284
+ channel: "agent -p --output-format json; sandbox/permission profile to qualify"
285
+ fanout: unknown
286
+ probe_budget: { status: authorized, calls: 3, tokens: 30000, authorized_by: operator, authorized_at: "2026-10-07", hosts: [titan, noodle] }
287
+ coverage:
288
+ profile_issue: "roctinam/aiwg#2903"
289
+ source_date: "2026-10-08"
290
+ live_qualified: false
291
+ sources:
292
+ - "https://cursor.com/docs/cli/overview"
293
+ - "https://cursor.com/docs/cli/reference/output-format"
220
294
  status: stable
221
295
  # Cursor requires a display server (VS Code extension host) — daemon not supported
222
296
  daemon_tier: unsupported
@@ -253,6 +327,20 @@ providers:
253
327
 
254
328
  opencode:
255
329
  display_name: OpenCode
330
+ route_feasibility:
331
+ scope: in
332
+ identity: runtime-configured-only
333
+ evidence: R
334
+ channel: "opencode run --format json; JSONL framing to qualify"
335
+ fanout: unknown
336
+ probe_budget: { status: authorized, calls: 3, tokens: 30000, authorized_by: operator, authorized_at: "2026-10-07", hosts: [titan, noodle] }
337
+ coverage:
338
+ profile_issue: "roctinam/aiwg#2904"
339
+ source_date: "2026-10-07"
340
+ live_qualified: false
341
+ sources:
342
+ - "tools/ralph-external/lib/opencode-adapter.mjs"
343
+ - "https://opencode.ai/docs/cli/"
256
344
  status: stable
257
345
  daemon_tier: unsupported
258
346
  daemon_pty_adapter: false
@@ -288,6 +376,19 @@ providers:
288
376
 
289
377
  warp:
290
378
  display_name: Warp Terminal
379
+ route_feasibility:
380
+ scope: in
381
+ identity: runtime-configured-only
382
+ evidence: D
383
+ channel: "oz agent run --prompt/--model/--cwd/--profile; stdout capture"
384
+ fanout: unknown
385
+ probe_budget: { status: authorized, calls: 3, tokens: 30000, authorized_by: operator, authorized_at: "2026-10-07", hosts: [titan, noodle] }
386
+ coverage:
387
+ profile_issue: "roctinam/aiwg#2905"
388
+ source_date: "2026-10-08"
389
+ live_qualified: false
390
+ sources:
391
+ - "https://docs.warp.dev/agents/cli/oz-cli/"
291
392
  status: stable
292
393
  daemon_tier: unsupported
293
394
  daemon_pty_adapter: false
@@ -324,6 +425,28 @@ providers:
324
425
 
325
426
  windsurf:
326
427
  display_name: Devin Desktop
428
+ aliases:
429
+ - devin
430
+ - devin-desktop
431
+ - devin-local
432
+ - cascade
433
+ route_feasibility:
434
+ scope: out
435
+ identity: unavailable
436
+ evidence: R
437
+ channel: "none - no verified headless Desktop worker command; recheck B-OG-47"
438
+ fanout: unknown
439
+ probe_budget: { status: authorized, calls: 1, tokens: 0, authorized_by: operator, authorized_at: "2026-10-07", hosts: [titan, noodle] }
440
+ coverage:
441
+ profile_issue: null
442
+ source_date: "2026-10-08"
443
+ live_qualified: false
444
+ sources:
445
+ - "src/providers/provider-definitions.ts#windsurf"
446
+ - "https://docs.devin.ai/cli/reference/commands.md"
447
+ - "https://docs.devin.ai/_llms/en/desktop.md"
448
+ exclusion_gap: "Devin Desktop documents no headless worker command and no worker-serving MCP tool; its MCP settings configure clients, IDE startup is not inference."
449
+ recheck: "Rechecked 2026-10-08: Desktop unchanged, still OUT. Devin CLI documents `devin -p/--print`, `--model`, `--prompt-file`, `--permission-mode` and `--sandbox` (no JSON output or effort flag found; `devin acp` is ACP, `devin mcp` manages client servers). Devin CLI stays a distinct future-provider surface, not a windsurf alias, until registry support exists."
327
450
  status: stable
328
451
  # Devin Desktop uses the Windsurf compatibility surface and requires a VS Code host — daemon not supported
329
452
  daemon_tier: unsupported
@@ -361,6 +484,25 @@ providers:
361
484
 
362
485
  grokbot:
363
486
  display_name: Grok Bot
487
+ route_feasibility:
488
+ scope: out
489
+ identity: unavailable
490
+ evidence: R
491
+ channel: "none - desktop CreateAgent is not a headless subprocess contract; recheck B-OG-47"
492
+ fanout: unknown
493
+ probe_budget: { status: authorized, calls: 1, tokens: 0, authorized_by: operator, authorized_at: "2026-10-07", hosts: [titan, noodle] }
494
+ coverage:
495
+ profile_issue: null
496
+ source_date: "2026-10-08"
497
+ live_qualified: false
498
+ sources:
499
+ - "src/providers/provider-definitions.ts#grokbot"
500
+ - "https://docs.x.ai/grok-bot/overview.md"
501
+ - "https://docs.x.ai/grok-bot/skills-routines-and-automations.md"
502
+ - "https://docs.x.ai/grok-bot/computer-and-apps.md"
503
+ - "https://docs.x.ai/grok-bot/faq.md"
504
+ exclusion_gap: "Grok Bot runs Bots on xAI-hosted computers driven from desktop/mobile chat, routines and connectors; no documented local CLI, headless subprocess or worker-serving MCP tool."
505
+ recheck: "Rechecked 2026-10-08 against the official Grok Bot docs: no change, still OUT. Third-party bridges are not official interfaces and were not evaluated; desktop CreateAgent names are never synthesized into a command."
364
506
  status: stable
365
507
  # Multi-agent desktop assistant runtime. Distinct from Cursor IDE and from
366
508
  # xAI Grok Build / API. Native skill root is operator-configured via
@@ -403,6 +545,19 @@ providers:
403
545
 
404
546
  grok-build:
405
547
  display_name: Grok Build
548
+ route_feasibility:
549
+ scope: in
550
+ identity: runtime-configured-only
551
+ evidence: R
552
+ channel: "grok -p --output-format streaming-json; bounded parser + model/effort pinning"
553
+ fanout: unknown
554
+ probe_budget: { status: authorized, calls: 3, tokens: 30000, authorized_by: operator, authorized_at: "2026-10-07", hosts: [titan, noodle] }
555
+ coverage:
556
+ profile_issue: "roctinam/aiwg#2906"
557
+ source_date: "2026-10-07"
558
+ live_qualified: false
559
+ sources:
560
+ - "src/providers/grok-build-headless.ts"
406
561
  status: experimental
407
562
  # xAI Grok Build CLI/TUI. Distinct from Grok Bot (`grokbot`).
408
563
  # #2577: fixture-backed native subagents and background tasks; see
@@ -448,6 +603,20 @@ providers:
448
603
 
449
604
  hermes:
450
605
  display_name: Hermes
606
+ route_feasibility:
607
+ scope: in
608
+ identity: runtime-configured-only
609
+ evidence: H
610
+ channel: "hermes -z plain final + --usage-file; session-filtered log binding"
611
+ fanout: unknown
612
+ probe_budget: { status: authorized, calls: 3, tokens: 30000, authorized_by: operator, authorized_at: "2026-10-07", hosts: [titan, noodle] }
613
+ coverage:
614
+ profile_issue: "roctinam/aiwg#2912"
615
+ source_date: "2026-10-07"
616
+ live_qualified: false
617
+ sources:
618
+ - "host-help: hermes 0.20.6 on titan (2026-10-07 observation; not rechecked in this pass)"
619
+ - "/usr/local/lib/hermes-agent/mcp_serve.py"
451
620
  status: stable
452
621
  daemon_tier: unsupported
453
622
  daemon_pty_adapter: false
@@ -488,6 +657,22 @@ providers:
488
657
 
489
658
  muse:
490
659
  display_name: Muse Code
660
+ route_feasibility:
661
+ scope: in
662
+ identity: runtime-configured-only
663
+ evidence: H
664
+ channel: "model-catalog JSON + exec --json invocation-bound session logs"
665
+ fanout: unknown
666
+ probe_budget: { status: authorized, calls: 3, tokens: 30000, authorized_by: operator, authorized_at: "2026-10-07", hosts: [titan, noodle] }
667
+ coverage:
668
+ profile_issue: "roctinam/aiwg#2898"
669
+ source_date: "2026-10-08"
670
+ live_qualified: false
671
+ sources:
672
+ - "host-help: Muse Code 1.4.4 (1.4.4-R5419.1) on titan (--version/--help only)"
673
+ - "tools/ralph-external/lib/muse-adapter.mjs"
674
+ - "test/fixtures/providers/muse/direct-manifest.json (synthetic only; strict finals/live controls remain unqualified)"
675
+ - "docs/providers/muse-ralph-exec.md (manual smoke run and S1 blockers)"
491
676
  status: stable
492
677
  # Meta's terminal/CI coding agent (Muse Spark-powered). Explicitly not a
493
678
  # model-API surface: Glimmer/Image/Voice are out of scope.
@@ -534,6 +719,19 @@ providers:
534
719
 
535
720
  openclaw:
536
721
  display_name: OpenClaw
722
+ route_feasibility:
723
+ scope: in
724
+ identity: runtime-configured-only
725
+ evidence: D
726
+ channel: "openclaw agent exec --json; workspace/settings mapping to qualify"
727
+ fanout: unknown
728
+ probe_budget: { status: authorized, calls: 3, tokens: 30000, authorized_by: operator, authorized_at: "2026-10-07", hosts: [titan, noodle] }
729
+ coverage:
730
+ profile_issue: "roctinam/aiwg#2907"
731
+ source_date: "2026-10-08"
732
+ live_qualified: false
733
+ sources:
734
+ - "https://docs.openclaw.ai/cli/agent"
537
735
  status: stable
538
736
  daemon_tier: unsupported
539
737
  daemon_pty_adapter: false
@@ -567,6 +765,25 @@ providers:
567
765
 
568
766
  openhuman:
569
767
  display_name: OpenHuman
768
+ aliases:
769
+ - tinyhumansai
770
+ route_feasibility:
771
+ scope: in
772
+ identity: runtime-configured-only
773
+ evidence: D
774
+ channel: "openhuman-core --model M call --method openhuman.agent_chat --params-stdin; conductor-framed params JSON on stdin to EOF, final JSON stdout, no event stream"
775
+ fanout: unknown
776
+ probe_budget: { status: proposed, calls: 3, tokens: 30000 }
777
+ coverage:
778
+ profile_issue: "roctinam/aiwg#2911"
779
+ source_date: "2026-10-08"
780
+ live_qualified: false
781
+ sources:
782
+ - "https://github.com/tinyhumansai/openhuman/blob/216ea322a3c1269dada70751ac5c08eac7dc7596/crates/openhuman-core/src/core/cli.rs"
783
+ - "https://github.com/tinyhumansai/openhuman/blob/216ea322a3c1269dada70751ac5c08eac7dc7596/crates/openhuman-core/src/agent/schemas.rs"
784
+ - "https://github.com/tinyhumansai/openhuman/blob/216ea322a3c1269dada70751ac5c08eac7dc7596/crates/openhuman-core/src/mcp/server/tools/specs.rs"
785
+ - "https://github.com/tinyhumansai/openhuman/releases/tag/v0.64.14"
786
+ recheck: "Rechecked 2026-10-08 and promoted into S1 (doc/source-only, unqualified): `openhuman-core --model M call --method openhuman.agent_chat --params-stdin` reads the `message`, `model_override` and `cwd` params as JSON from stdin until EOF, runs one in-process agent turn and prints the JSON result on stdout; the conductor frames the params from the brief so prompt text never enters argv. Profile pinned to 0.64.14; live qualification is an open S1 blocker (not installed on an authorized host, budget proposed). Effort, step cap, approval/sandbox mapping and child fan-out are unknown. Native `openhuman-core mcp` `agent.run_subagent` takes only `agent_id`/`prompt` (no model, effort or workspace pin) and may nest subagents, so it is not a qualifying worker MCP tool."
570
787
  status: experimental
571
788
  # tinyhumansai/openhuman — OSS personal-AI runtime (Rust core + Tauri shell).
572
789
  # AIWG-convention-aware out of the box (.agents/, AGENTS.md, .claude/, .codex/).
@@ -605,6 +822,20 @@ providers:
605
822
 
606
823
  antigravity:
607
824
  display_name: Google Antigravity CLI
825
+ route_feasibility:
826
+ scope: in
827
+ identity: runtime-configured-only
828
+ evidence: R
829
+ channel: "agy -p stream-json per provider-contract; fixture-qualified flags only"
830
+ fanout: unknown
831
+ probe_budget: { status: authorized, calls: 3, tokens: 30000, authorized_by: operator, authorized_at: "2026-10-07", hosts: [titan, noodle] }
832
+ coverage:
833
+ profile_issue: "roctinam/aiwg#2908"
834
+ source_date: "2026-10-07"
835
+ live_qualified: false
836
+ sources:
837
+ - "agentic/code/providers/antigravity/provider-contract.v1.json"
838
+ - "https://antigravity.google/docs/cli/headless/"
608
839
  aliases:
609
840
  - agy
610
841
  status: experimental
@@ -650,6 +881,19 @@ providers:
650
881
 
651
882
  deepseek-harness:
652
883
  display_name: DeepSeek Harness
884
+ route_feasibility:
885
+ scope: in
886
+ identity: runtime-configured-only
887
+ evidence: R
888
+ channel: "dsh --profile headless + validated Cordis route patch; no guessed --model flag"
889
+ fanout: unknown
890
+ probe_budget: { status: authorized, calls: 3, tokens: 30000, authorized_by: operator, authorized_at: "2026-10-07", hosts: [titan, noodle] }
891
+ coverage:
892
+ profile_issue: "roctinam/aiwg#2909"
893
+ source_date: "2026-10-07"
894
+ live_qualified: false
895
+ sources:
896
+ - "tools/ralph-external/lib/deepseek-harness-adapter.mjs"
653
897
  aliases:
654
898
  - dsh
655
899
  status: experimental
@@ -692,6 +936,19 @@ providers:
692
936
 
693
937
  pi:
694
938
  display_name: Pi Coding Agent
939
+ route_feasibility:
940
+ scope: in
941
+ identity: runtime-configured-only
942
+ evidence: R
943
+ channel: "pi --mode json --model/--thinking/--tools; closed stdin, no RPC abort"
944
+ fanout: unknown
945
+ probe_budget: { status: authorized, calls: 3, tokens: 30000, authorized_by: operator, authorized_at: "2026-10-07", hosts: [titan, noodle] }
946
+ coverage:
947
+ profile_issue: "roctinam/aiwg#2910"
948
+ source_date: "2026-10-07"
949
+ live_qualified: false
950
+ sources:
951
+ - "tools/ralph-external/lib/pi-adapter.mjs"
695
952
  aliases:
696
953
  - pi-coding-agent
697
954
  status: experimental
@@ -733,6 +990,19 @@ providers:
733
990
 
734
991
  omp:
735
992
  display_name: Oh My Pi
993
+ route_feasibility:
994
+ scope: in
995
+ identity: runtime-configured-only
996
+ evidence: R
997
+ channel: "omp --mode json --model/--thinking/--profile; --no-tools for text-only"
998
+ fanout: unknown
999
+ probe_budget: { status: authorized, calls: 3, tokens: 30000, authorized_by: operator, authorized_at: "2026-10-07", hosts: [titan, noodle] }
1000
+ coverage:
1001
+ profile_issue: "roctinam/aiwg#2910"
1002
+ source_date: "2026-10-07"
1003
+ live_qualified: false
1004
+ sources:
1005
+ - "tools/ralph-external/lib/omp-adapter.mjs"
736
1006
  aliases:
737
1007
  - oh-my-pi
738
1008
  status: experimental
@@ -0,0 +1,20 @@
1
+ import path from 'node:path';
2
+ import { getProviderArtifactPathStrings, getProviderKernelSkillPath } from './provider-definitions.js';
3
+ import { resolveGrokbotSkillsDir } from './grokbot-paths.js';
4
+ /** All shared-copier tiers, including adapter mirrors. */
5
+ export function deployedSkillRoots(target, provider) {
6
+ const roots = [(getProviderArtifactPathStrings(provider) ?? getProviderArtifactPathStrings('claude'))?.skills,
7
+ getProviderKernelSkillPath(provider) || getProviderKernelSkillPath('claude')];
8
+ if (provider === 'muse')
9
+ roots.push('.agents/.aiwg/skills');
10
+ if (provider === 'grok-build')
11
+ roots.push('.grok/.aiwg/skills');
12
+ if (provider === 'grokbot') {
13
+ const root = resolveGrokbotSkillsDir();
14
+ if (root)
15
+ roots.push(root, path.join(root, '.aiwg', 'skills'));
16
+ }
17
+ return [...new Set(roots.filter((root) => Boolean(root))
18
+ .map(root => path.isAbsolute(root) ? root : path.join(target, root)))];
19
+ }
20
+ //# sourceMappingURL=deployed-skill-roots.js.map
@@ -1,4 +1,5 @@
1
1
  /** Grok Build ACP stdio client. Separate from one-shot headless execution. */
2
+ import { signalChild } from '../process/signal-child.mjs';
2
3
  import { spawn } from 'node:child_process';
3
4
  import { redactGrokOutput } from './grok-build-headless.js';
4
5
  export class GrokAcpClient {
@@ -182,9 +183,9 @@ export class GrokAcpClient {
182
183
  this.terminated = true;
183
184
  this.failAll(new Error('Grok ACP connection closed'));
184
185
  this.child.stdin.end();
185
- if (!this.child.kill('SIGTERM'))
186
+ if (!signalChild(this.child, 'SIGTERM'))
186
187
  return;
187
- const forceTimer = setTimeout(() => this.child.kill('SIGKILL'), 2_000);
188
+ const forceTimer = setTimeout(() => signalChild(this.child, 'SIGKILL'), 2_000);
188
189
  forceTimer.unref();
189
190
  this.child.once('close', () => clearTimeout(forceTimer));
190
191
  }
@@ -1,8 +1,13 @@
1
1
  /** Bounded Grok Build headless transport. The caller owns task authorization. */
2
+ import { signalChild } from '../process/signal-child.mjs';
2
3
  import { spawn } from 'node:child_process';
3
4
  const MAX_TIMEOUT_MS = 10 * 60_000;
4
5
  const DEFAULT_TIMEOUT_MS = 2 * 60_000;
5
6
  const DEFAULT_MAX_OUTPUT = 8 * 1024 * 1024;
7
+ // grok 1.0.50 --output-format streaming-json: ACP session updates.
8
+ // See docs/providers/grok-build-cli-evidence.md; json is a separate result object.
9
+ const STREAM_EVENT_TYPES = new Set(['text', 'thought', 'tool_call', 'tool_call_update',
10
+ 'usage', 'plan', 'available_commands', 'end', 'error']);
6
11
  export function redactGrokOutput(value, env = process.env) {
7
12
  let redacted = value
8
13
  .replace(/\b(Bearer\s+)[A-Za-z0-9._~+/-]+/gi, '$1[REDACTED]')
@@ -20,20 +25,22 @@ function scrubEvent(event, env) {
20
25
  return JSON.parse(redactGrokOutput(JSON.stringify(event), env));
21
26
  }
22
27
  function isTerminal(event) {
23
- return ['result', 'error', 'complete', 'completed'].includes(String(event.type ?? event.event ?? ''));
28
+ return event.type === 'end' || event.type === 'error';
24
29
  }
25
30
  function isError(event) {
26
- return event.is_error === true || event.error !== undefined || ['error', 'failed'].includes(String(event.type ?? event.event ?? ''));
31
+ return event.type === 'error' || event.is_error === true || event.error != null
32
+ || (event.type === 'end' && event.stopReason !== 'end_turn')
33
+ || (['tool_call', 'tool_call_update'].includes(String(event.type)) && event.status === 'failed');
27
34
  }
28
35
  function stopProcess(child) {
29
- if (child.pid && process.platform !== 'win32') {
36
+ if (Number.isSafeInteger(child.pid) && child.pid > 0 && process.platform !== 'win32') {
30
37
  try {
31
38
  process.kill(-child.pid, 'SIGTERM');
32
39
  return;
33
40
  }
34
41
  catch { /* process already exited */ }
35
42
  }
36
- child.kill('SIGTERM');
43
+ signalChild(child, 'SIGTERM');
37
44
  }
38
45
  export async function runGrokHeadless(options) {
39
46
  if (!options.prompt.trim())
@@ -44,7 +51,7 @@ export async function runGrokHeadless(options) {
44
51
  const timeoutMs = Math.min(Math.max(options.timeoutMs ?? DEFAULT_TIMEOUT_MS, 1), MAX_TIMEOUT_MS);
45
52
  const maxBytes = Math.min(Math.max(options.maxOutputBytes ?? DEFAULT_MAX_OUTPUT, 1024), DEFAULT_MAX_OUTPUT);
46
53
  const env = options.env ?? process.env;
47
- const args = [...(options.prefixArgs ?? []), '--no-auto-update', ...(options.disableSubagents ? ['--no-subagents'] : []), '-p', options.prompt, '--output-format', format];
54
+ const args = [...(options.prefixArgs ?? []), ...(options.disableSubagents ? ['--no-subagents'] : []), '-p', options.prompt, '--output-format', format];
48
55
  return new Promise((resolve, reject) => {
49
56
  const child = spawn(options.command ?? 'grok', args, {
50
57
  cwd: options.cwd,
@@ -88,7 +95,9 @@ export async function runGrokHeadless(options) {
88
95
  if (format === 'json') {
89
96
  try {
90
97
  const parsed = JSON.parse(cleanStdout);
91
- if (isError(parsed))
98
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)
99
+ || typeof parsed.text !== 'string' || isError(parsed)
100
+ || parsed.stopReason !== 'end_turn')
92
101
  throw new Error('Grok Build returned a JSON error result');
93
102
  events.push(parsed);
94
103
  }
@@ -105,7 +114,41 @@ export async function runGrokHeadless(options) {
105
114
  if (options.signal?.aborted)
106
115
  abort();
107
116
  child.on('error', error => finish(new Error(`Grok Build headless launch failed: ${error.message}`)));
117
+ const acceptEvent = (event) => {
118
+ if (settled)
119
+ return;
120
+ if (!event || typeof event !== 'object' || Array.isArray(event)
121
+ || typeof event.type !== 'string' || !STREAM_EVENT_TYPES.has(event.type)) {
122
+ finish(new Error('Invalid Grok Build streaming-json event'));
123
+ return;
124
+ }
125
+ // ACP end is always last. Failure is latched across the whole stream.
126
+ if (terminalSeen) {
127
+ finish(new Error('Grok Build event after terminal event'));
128
+ return;
129
+ }
130
+ const safe = scrubEvent(event, env);
131
+ events.push(safe);
132
+ options.onEvent?.(safe);
133
+ if (isError(safe))
134
+ terminalError = true;
135
+ if (isTerminal(safe)) {
136
+ terminalSeen = true;
137
+ // Some builds leave background work attached after end. Allow a
138
+ // short drain, then terminate the process group.
139
+ drainTimer ??= setTimeout(() => {
140
+ if (pending.trim()) {
141
+ finish(new Error('Invalid trailing Grok Build streaming-json event'));
142
+ return;
143
+ }
144
+ stopProcess(child);
145
+ finish(undefined, terminalError ? 1 : 0);
146
+ }, 300);
147
+ }
148
+ };
108
149
  child.stdout.on('data', (chunk) => {
150
+ if (settled)
151
+ return;
109
152
  bytes += chunk.length;
110
153
  if (bytes > maxBytes) {
111
154
  finish(new Error(`Grok Build headless output exceeded ${maxBytes} bytes`));
@@ -130,17 +173,9 @@ export async function runGrokHeadless(options) {
130
173
  finish(new Error('Invalid Grok Build streaming-json event'));
131
174
  return;
132
175
  }
133
- const safe = scrubEvent(event, env);
134
- events.push(safe);
135
- options.onEvent?.(safe);
136
- if (isError(safe))
137
- terminalError = true;
138
- if (isTerminal(safe)) {
139
- terminalSeen = true;
140
- // Some provider builds leave background work attached after the
141
- // result. Allow a short drain, then terminate the process group.
142
- drainTimer ??= setTimeout(() => { stopProcess(child); finish(undefined, terminalError ? 1 : 0); }, 300);
143
- }
176
+ acceptEvent(event);
177
+ if (settled)
178
+ return;
144
179
  }
145
180
  });
146
181
  child.stderr.on('data', (chunk) => {
@@ -151,12 +186,7 @@ export async function runGrokHeadless(options) {
151
186
  child.on('close', code => {
152
187
  if (format === 'streaming-json' && pending.trim()) {
153
188
  try {
154
- const event = scrubEvent(JSON.parse(pending), env);
155
- events.push(event);
156
- if (isError(event))
157
- terminalError = true;
158
- if (isTerminal(event))
159
- terminalSeen = true;
189
+ acceptEvent(JSON.parse(pending));
160
190
  }
161
191
  catch {
162
192
  finish(new Error('Invalid trailing Grok Build streaming-json event'));