@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,329 @@
1
+ /** Pi Coding Agent adapter for headless External Ralph sessions. */
2
+ import { homedir } from 'os';
3
+ import { join } from 'path';
4
+ import { ProviderAdapter, registerProvider } from './provider-adapter.mjs';
5
+ import { healthEventMatchesBinding } from './worker-health.mjs';
6
+
7
+ /**
8
+ * Version-bound direct-worker surface (roctinam/aiwg#2910, B-OG-45).
9
+ *
10
+ * Qualified against pi 1.1.0 `--help` (help/version syntax only,
11
+ * 2026-10-09; never live qualification; upgraded from the originally
12
+ * qualified 0.87.1 -- the `--help` diff at
13
+ * `.aiwg/working/s1-scratch/cli-help/pi-diff.txt` shows every flag this
14
+ * profile emits is unchanged, plus a new `--no-mcp`):
15
+ *
16
+ * pi --mode json --no-approve --no-context-files --no-extensions \
17
+ * --no-skills --no-mcp --model M --thinking E < briefPath
18
+ *
19
+ * `--mode json` forces non-interactive JSONL output regardless of TTY or
20
+ * `--print` (installed pi 1.1.0 bundle, `resolveAppMode()`: `parsed.mode
21
+ * === "json"` short-circuits to `"json"` before any print/interactive
22
+ * check), so no separate `-p/--print` flag is needed. `--no-approve`
23
+ * ("Ignore project-local files for this run") alone is NOT a complete
24
+ * isolation boundary: it sets project trust to false but does not stop
25
+ * context loading. The installed pi 1.1.0 bundle (`chunk-OIM2DMFI.js`,
26
+ * static read 2026-10-09: `agentsFiles = this.noContextFiles ? [] :
27
+ * loadProjectContextFiles(...)`) loads ancestor `AGENTS.md`/`CLAUDE.md`
28
+ * files independently of trust unless `noContextFiles` is set. The direct
29
+ * profile therefore also emits `--no-context-files`
30
+ * (`-nc`, "Disable AGENTS.md and CLAUDE.md discovery and loading"),
31
+ * `--no-extensions` (`-ne`) and `--no-skills` (`-ns`) -- the same discovery
32
+ * surfaces OMP's profile disables -- so no untrusted workspace file
33
+ * (context, extension or skill) is ever loaded into the worker. 1.1.0
34
+ * adds built-in MCP support, on by default; the direct profile also emits
35
+ * `--no-mcp` ("Disable built-in MCP support: no servers connect and no
36
+ * MCP tools", `pi --help`) for the same reason -- an unvetted MCP server
37
+ * configuration is an untrusted-workspace surface like
38
+ * extensions/skills, and the AIWG `worker-invoke` bridge remains the one
39
+ * MCP route. The direct profile never emits `--approve` ("Trust
40
+ * project-local files for this run"). There is no documented sandbox,
41
+ * approval-prompt, output-file, output-schema, step-cap or child-denial
42
+ * flag (`pi --help`, 2026-10-09): those controls stay unavailable rather
43
+ * than invented, and the final answer is extracted from the stdout JSONL
44
+ * stream (`parseOutput()`), never a `-o`-style file. There is no
45
+ * `--cwd`/`-C` flag either; the launcher's shell `cd` to the workspace is
46
+ * the only workdir binding. The brief travels on stdin, never argv:
47
+ * installed pi 1.1.0 bundle (`chunk-OIM2DMFI.js`, `readPipedStdin()` /
48
+ * `buildInitialMessage()`, static read 2026-10-09, byte-identical to the
49
+ * 0.87.1 evidence) shows piped, non-TTY stdin is trimmed and becomes the
50
+ * sole initial-message part whenever no positional message/file argument
51
+ * is given, so omitting the positional message and piping the brief is
52
+ * sufficient -- and an all-whitespace brief would trim to nothing and
53
+ * must never be sent.
54
+ */
55
+ export const PI_DIRECT_VERSION = '1.1.0';
56
+ /** Mirrors providers.pi.effortValues in model-capabilities.v1.json (hardcoded,
57
+ * not read via a repo-relative path: the installed-module loader copies this
58
+ * file to an arbitrary package root, so import.meta.url-relative reads to the
59
+ * repository are not safe here). */
60
+ export const PI_DIRECT_EFFORT_VALUES = Object.freeze(['minimal', 'low', 'medium', 'high', 'xhigh']);
61
+ /** Brief transport for the direct profile: piped stdin, never argv. */
62
+ export const PI_DIRECT_STDIN = 'brief-text';
63
+
64
+ /**
65
+ * Pi CLI versions this adapter is qualified against. `isAvailable()` fails
66
+ * closed outside this list (#2550): Pi's `--mode json` contract (stdin
67
+ * handling, JSONL framing, `agent_settled`) is verified per version by
68
+ * `npm run smoke:pi:live`, and an unqualified release must not be driven by
69
+ * an unattended loop on the strength of `pi --version` exiting 0.
70
+ */
71
+ export const PI_SUPPORTED_VERSIONS = Object.freeze(['0.85.0']);
72
+
73
+ export function normalizePiVersion(version) {
74
+ return String(version ?? '').trim().replace(/^pi\s+/i, '').replace(/^v/, '');
75
+ }
76
+
77
+ export function isSupportedPiVersion(version) {
78
+ return PI_SUPPORTED_VERSIONS.includes(normalizePiVersion(version));
79
+ }
80
+
81
+ export class PiAdapter extends ProviderAdapter {
82
+ observeHealthEvent(event, source, binding) {
83
+ if (source.kind !== 'stdout' || !event || typeof event !== 'object') return null;
84
+ if (!healthEventMatchesBinding({ sessionId: event.sessionId ?? (event.type === 'session' ? event.id : undefined) }, binding)) return null;
85
+ if (event.type === 'session') return { kind: 'setup', sessionId: event.id };
86
+ if (event.type === 'agent_start') return { kind: 'accepted' };
87
+ if (event.type === 'agent_end') {
88
+ if (event.willRetry === true || (Array.isArray(event.messages) && event.messages.some(message => message.stopReason === 'error' || message.stopReason === 'aborted'))) {
89
+ return { kind: 'error', reasonCode: 'provider-failed' };
90
+ }
91
+ // agent_end can precede retry/continuation: settlement requires Pi's
92
+ // own agent_settled event. Completed output can still be progress.
93
+ if (Array.isArray(event.messages) && event.messages.some(message => message.role === 'assistant')) {
94
+ return { kind: 'progress', key: JSON.stringify(event.messages) };
95
+ }
96
+ return { kind: 'activity' };
97
+ }
98
+ if (event.type === 'agent_settled') return { kind: 'terminal', success: true, key: 'agent_settled' };
99
+ return null;
100
+ }
101
+ getBinary() { return process.env.AIWG_PI_BIN || 'pi'; }
102
+ getName() { return 'pi'; }
103
+ getCapabilities() {
104
+ // rpcAbort is false on purpose. Pi 0.85.0 reads stdin commands only in
105
+ // `--mode rpc`; in `--mode json` it reads piped stdin as prompt text and
106
+ // blocks until EOF (readPipedStdin in dist/main.js). Opening a stdin pipe
107
+ // to send an abort frame therefore keeps the session from ever starting,
108
+ // so the launcher must leave stdin closed and cancel with the bounded
109
+ // TERM/KILL path (#2550).
110
+ return { streamJson: true, sessionResume: true, budgetControl: false,
111
+ systemPrompt: true, agentMode: false, mcpConfig: false, maxTurns: false,
112
+ rpcAbort: false };
113
+ }
114
+ async isAvailable() {
115
+ if (!await super.isAvailable()) return false;
116
+ return isSupportedPiVersion(await this.getVersion());
117
+ }
118
+ buildSessionArgs(options) {
119
+ const args = ['--mode', 'json', '--no-approve'];
120
+ if (options.model) args.push('--model', this.mapModel(options.model));
121
+ if (options.thinking) args.push('--thinking', options.thinking);
122
+ if (options.sessionId) args.push('--session', options.sessionId);
123
+ if (options.tools?.length) args.push('--tools', options.tools.join(','));
124
+ if (options.systemPrompt) args.push('--append-system-prompt', options.systemPrompt);
125
+ if (options.budget) this.warnUnsupported('budgetControl', 'Budget control');
126
+ if (options.maxTurns) this.warnUnsupported('maxTurns', 'Max turns');
127
+ if (options.mcpConfig) this.warnUnsupported('mcpConfig', 'MCP configuration');
128
+ args.push(options.prompt);
129
+ return args;
130
+ }
131
+ buildAnalysisArgs(options) { return this.buildSessionArgs(options); }
132
+
133
+ /**
134
+ * Driver-owned argv after the binary for the version-bound direct-shell
135
+ * profile. `--no-approve`, `--no-context-files`, `--no-extensions`,
136
+ * `--no-skills` and `--no-mcp` are all fixed (never `--approve`, and
137
+ * never omitted — `--no-approve` alone does not stop ancestor
138
+ * AGENTS.md/CLAUDE.md loading); model and thinking level are always
139
+ * explicit (never a CLI default or alias); the brief is validated here
140
+ * but never placed in
141
+ * argv — it travels on stdin (`stdin: 'brief-text'`). There is no
142
+ * `-C/--cwd` flag to render: the launcher's own `cd` to the workspace is
143
+ * the only binding.
144
+ *
145
+ * @param {{ selected?: { model?: unknown, effort?: { value?: unknown } }, cwd?: unknown, brief?: unknown }} invocation
146
+ * @param {unknown} _profile
147
+ * @param {unknown} _permissions
148
+ * @returns {string[]}
149
+ */
150
+ buildWorkerArgs(invocation, _profile, _permissions) {
151
+ const model = invocation?.selected?.model;
152
+ if (typeof model !== 'string' || !model || model.includes('\0')) {
153
+ throw new Error('Pi worker requires an explicit model');
154
+ }
155
+ const effort = invocation?.selected?.effort?.value ?? null;
156
+ if (effort === null || !PI_DIRECT_EFFORT_VALUES.includes(effort)) {
157
+ throw new Error('Pi worker requires an explicit qualified thinking level (never a CLI default)');
158
+ }
159
+ const cwd = invocation?.cwd;
160
+ if (typeof cwd !== 'string' || !cwd.startsWith('/') || cwd.includes('\0')) {
161
+ throw new Error('Pi worker requires an absolute workspace');
162
+ }
163
+ const brief = invocation?.brief;
164
+ // Pi's own readPipedStdin() trims the stream; an all-whitespace brief
165
+ // would resolve to no initial message at all, so it is refused here.
166
+ if (typeof brief !== 'string' || !brief.trim() || brief.includes('\0')) {
167
+ throw new Error('Pi worker requires a non-empty brief');
168
+ }
169
+ return ['--mode', 'json', '--no-approve', '--no-context-files', '--no-extensions', '--no-skills', '--no-mcp',
170
+ '--model', model, '--thinking', effort];
171
+ }
172
+
173
+ mapModel(model) { return model; }
174
+ getEnvOverrides() { return { CI: 'true', NO_COLOR: '1' }; }
175
+ /** No stdin abort in `--mode json`; see getCapabilities() (#2550). */
176
+ getAbortInput() { return null; }
177
+ getTranscriptPath(sessionId) {
178
+ if (!sessionId) return null;
179
+ if (sessionId.endsWith('.jsonl') || sessionId.includes('/')) return sessionId;
180
+ const root = process.env.PI_CODING_AGENT_SESSION_DIR;
181
+ return root ? join(root, `${sessionId}.jsonl`) : join(homedir(), '.pi', 'agent', 'sessions', `${sessionId}.jsonl`);
182
+ }
183
+ /**
184
+ * Legacy Ralph-loop contract (#2550), unchanged: parse `--mode json`
185
+ * output into Pi's own JSONL events and report settlement only.
186
+ * `settled` is an `agent_settled` event with no `agent_end` signalling
187
+ * `willRetry: true`. This is the exact shape
188
+ * `test/unit/ralph/pi-adapter.test.mjs` and the launcher depend on — it
189
+ * does NOT extract or require a final answer; see `parseDirectFinal()`
190
+ * for the strict direct-worker-profile contract that does.
191
+ *
192
+ * @param {string} stdout
193
+ * @returns {{ events: object[], settled: boolean } | null}
194
+ */
195
+ parseOutput(stdout) {
196
+ const events = [];
197
+ for (const raw of stdout.split('\n')) {
198
+ const line = raw.endsWith('\r') ? raw.slice(0, -1) : raw;
199
+ if (!line) continue;
200
+ try { events.push(JSON.parse(line)); } catch { return null; }
201
+ }
202
+ return events.length ? { events, settled: events.some(event => event.type === 'agent_settled')
203
+ && !events.some(event => event.type === 'agent_end' && event.willRetry === true) } : null;
204
+ }
205
+
206
+ /**
207
+ * Strict direct-worker-profile final: reuses `parseOutput()`'s event
208
+ * parsing, then additionally requires a non-empty extracted assistant
209
+ * answer and fails on any error signal (a standalone `error` event, an
210
+ * `agent_end` with `willRetry: true`, or an `agent_end` assistant
211
+ * message with `stopReason` `error`/`aborted`) even at exit zero. `text`
212
+ * is the last assistant message's concatenated text content across all
213
+ * `agent_end` events (a later `agent_end` can supersede an earlier one
214
+ * before `agent_settled` arrives); `text` is non-null only when
215
+ * `settled` is true. Used only by the direct worker profile
216
+ * (roctinam/aiwg#2910) and the installed-module path — never the legacy
217
+ * Ralph loop, which calls `parseOutput()` directly.
218
+ *
219
+ * @param {string} stdout
220
+ * @returns {{ events: object[], settled: boolean, text: string|null } | null}
221
+ */
222
+ parseDirectFinal(stdout) {
223
+ const events = [];
224
+ for (const raw of stdout.split('\n')) {
225
+ const line = raw.endsWith('\r') ? raw.slice(0, -1) : raw;
226
+ if (!line) continue;
227
+ try { events.push(JSON.parse(line)); } catch { return null; }
228
+ }
229
+ if (!events.length) return null;
230
+ let failed = false;
231
+ let settledEvent = false;
232
+ let text = null;
233
+ for (const event of events) {
234
+ // #2995 round 3: `agent_settled` is documented as terminal; ANY event
235
+ // observed after it (including a second agent_start) breaks that
236
+ // contract and fails the parse, exactly like Factory/Cursor's
237
+ // post-terminal check.
238
+ if (settledEvent) { failed = true; continue; }
239
+ if (event.type === 'error') failed = true;
240
+ if (event.type === 'agent_settled') { settledEvent = true; continue; }
241
+ if (event.type !== 'agent_end') continue;
242
+ // #2995 round 3: an `agent_end` with NO `messages` array at all (not
243
+ // just an explicit empty array) must CLEAR any earlier candidate
244
+ // text -- never let an earlier claim survive a later answerless
245
+ // terminal.
246
+ if (!Array.isArray(event.messages)) { text = null; continue; }
247
+ if (event.willRetry === true || event.messages.some(message => message.stopReason === 'error' || message.stopReason === 'aborted')) {
248
+ failed = true;
249
+ }
250
+ // Pi accumulates messages chronologically: the final answer is the LAST
251
+ // assistant message of the LAST agent_end. An earlier non-empty message
252
+ // must never stand in for an empty final one.
253
+ const assistant = event.messages.filter(message => message.role === 'assistant').at(-1);
254
+ if (!assistant) { text = null; continue; }
255
+ const extracted = Array.isArray(assistant.content)
256
+ ? assistant.content.filter(part => part.type === 'text').map(part => part.text).join('\n')
257
+ : (typeof assistant.text === 'string' ? assistant.text : null);
258
+ text = extracted && extracted.trim() ? extracted : null;
259
+ }
260
+ const settled = settledEvent && !failed && Boolean(text);
261
+ return { events, settled, text: settled ? text : null };
262
+ }
263
+
264
+ }
265
+
266
+ // Self-register on import for the legacy Ralph loop only. The direct worker
267
+ // profile loads through the #2885 installed loader instead (see below).
268
+ registerProvider('pi', () => new PiAdapter());
269
+
270
+ /**
271
+ * #2995: `PiAdapter.parseOutput` above is the legacy-pinned, settlement-only
272
+ * candidate parser (`test/unit/ralph/pi-adapter.test.mjs` and the legacy
273
+ * Ralph loop depend on its exact `{events,settled}` shape, with no answer
274
+ * requirement at all) — it is non-null whenever the stream parses as JSONL,
275
+ * regardless of whether the run actually settled successfully with a
276
+ * non-empty answer. The installed-module loader's `extractFinal` hook IS
277
+ * `instance.parseOutput` (src/models/worker-installation.mjs ~l.730) and
278
+ * session-launcher.mjs's gate (~l.462) throws unless that hook returns
279
+ * null for anything that is not an affirmative success — so wiring the
280
+ * legacy parser there would let an unsettled or empty-answer run pass the
281
+ * gate as a false candidate.
282
+ *
283
+ * `PiDirectAdapter` is the Claude/Hermes `-direct`-subclass pattern: only
284
+ * `parseOutput` changes, to a thin wrapper over the ALREADY-correct
285
+ * `parseDirectFinal` (above) that returns null unless `settled` is true
286
+ * AND `text` is a non-empty string — never a second, looser rule.
287
+ * `parseWorkerFinal` only needs the strict version here (no
288
+ * generic-envelope fallback): this class is never reachable through the
289
+ * legacy bare `registerProvider('pi', ...)` id above, only through the
290
+ * installed-module `register(factory)` export below, so the legacy
291
+ * group-mode contract (test/unit/ralph-external/worker-finals.test.ts)
292
+ * never sees it.
293
+ */
294
+ export class PiDirectAdapter extends PiAdapter {
295
+ // #2995 round 4 (item 3): production resolves the installed adapter by
296
+ // `adapter.id` (now `pi-direct`, item B) and src/models/
297
+ // worker-installation.mjs's `inspectWorkerInstallation` requires
298
+ // `adapter.id === instance.getName()`. `getBinary()` is untouched.
299
+ getName() { return 'pi-direct'; }
300
+
301
+ /** @param {string} stdout @returns {{events:object[],settled:true,text:string}|null} */
302
+ parseOutput(stdout) {
303
+ const final = this.parseDirectFinal(stdout);
304
+ return final && final.settled && typeof final.text === 'string' && final.text.trim() ? final : null;
305
+ }
306
+
307
+ /**
308
+ * @param {string|Uint8Array} output
309
+ * @param {Object} [options]
310
+ * @returns {Promise<import('../../../src/mission-protocol/types.js').WorkerClaims>}
311
+ */
312
+ async parseWorkerFinal(output, options = {}) {
313
+ if (options.format === 'mcp') return super.parseWorkerFinal(output, options);
314
+ const text = typeof output === 'string' ? output : Buffer.from(output).toString('utf8');
315
+ const final = this.parseOutput(text);
316
+ if (!final) throw new Error('Pi worker stream did not produce a settled, non-empty final answer');
317
+ return super.parseWorkerFinal(final.text, { ...options, format: 'json' });
318
+ }
319
+ }
320
+
321
+ /** Installed-module interface version (mirrors #2897 codex-adapter.mjs). */
322
+ export const interfaceVersion = 1;
323
+
324
+ /** Installed-module registration: exactly the one approved adapter ID. */
325
+ export function register(factory) {
326
+ factory('pi-direct', () => new PiDirectAdapter());
327
+ }
328
+
329
+ export default PiAdapter;