@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,2 @@
1
+ /** Canonical JSON binding with a sha256: prefix; shared by TS and runtime ESM. */
2
+ export function qualificationDigest(value: unknown): string;
@@ -0,0 +1,17 @@
1
+ import { createHash } from 'node:crypto';
2
+
3
+ // One encoding for persisted TS bindings, runtime ESM edits and installation
4
+ // scopes. Use code-unit key order, never locale-dependent collation. Optional
5
+ // object properties follow JSON omission semantics; array order is significant.
6
+ export function qualificationDigest(value) {
7
+ const normalize = item => {
8
+ if (Array.isArray(item)) return item.map(normalize);
9
+ if (item && typeof item === 'object') {
10
+ return Object.fromEntries(Object.keys(item).sort()
11
+ .filter(key => item[key] !== undefined)
12
+ .map(key => [key, normalize(item[key])]));
13
+ }
14
+ return item;
15
+ };
16
+ return `sha256:${createHash('sha256').update(JSON.stringify(normalize(value))).digest('hex')}`;
17
+ }
@@ -6,6 +6,11 @@
6
6
  * @architecture @.aiwg/architecture/enhanced-model-selection-design.md
7
7
  */
8
8
  import { ConfigLoader } from './config-loader.js';
9
+ import { WORKER_DISPATCH_ENABLE_COMMAND, WORKER_DISPATCH_READINESS_COMMAND } from './worker-dispatch-offer.js';
10
+ import { resolveWorkerGroupInstallation, resolveParallelism, validateWorkerGroupQualifications, validateWorkerGroupReferences, validateWorkerBudgetEnforcement, workerActivationDigests, workerConfigDigest, } from '../config/aiwg-config.js';
11
+ import { qualifyWorkerInvocationProfile, validateWorkerPolicyRoute, validateWorkerModelObservation, hasOperatorWorkerNativeRenderer, hasSelectionRelevantConflicts, workerContextHeadroom, workerModelKey, isCanonicalWorkerModelKey, WorkerSelectionPolicySchema, validateWorkerCatalogDiscovery, } from './provider-policy.js';
12
+ import { MODEL_WRAPPERS } from './provider-models.js';
13
+ import { routeModelTier } from './router.js';
9
14
  /**
10
15
  * Resolves models for agents using tier system
11
16
  */
@@ -20,6 +25,11 @@ export class ModelResolver {
20
25
  };
21
26
  this.loader = new ConfigLoader(projectPath);
22
27
  }
28
+ /** Reload current files through the origin-aware loader on every worker plan. */
29
+ async resolveWorker(request, input) {
30
+ const models = await this.loader.load(input.config.parallelism);
31
+ return resolveWorkerPlan({ ...input, models, modelDigests: this.loader.getInputDigests() }, request);
32
+ }
23
33
  /**
24
34
  * Resolve model for an agent
25
35
  *
@@ -242,4 +252,255 @@ export class ModelResolver {
242
252
  this.loader.clearCache();
243
253
  }
244
254
  }
255
+ const matchesChoice = (tuple, choice) => tuple.group === choice.group && tuple.member === choice.member && tuple.model === choice.model && tuple.effort === choice.effort;
256
+ function findWorkerModelRow(rows, model) {
257
+ const matches = rows?.filter(row => row.id === model || row.apiModelId === model) ?? [];
258
+ return matches.length === 1 ? matches[0] : undefined;
259
+ }
260
+ /** Pure S1 resolution. No probing, launch, activation, admission, or writes.
261
+ * Recheck against freshly loaded snapshots before preparing an invocation. */
262
+ export function resolveWorkerPlan(snapshot, request) {
263
+ let parallelism = snapshot.config.parallelism ?? {};
264
+ const policy = snapshot.models.defaults.workerSelection;
265
+ const digests = {
266
+ ...snapshot.modelDigests,
267
+ configDigest: workerActivationDigests(snapshot.config).configDigest,
268
+ resolvedModelsDigest: workerConfigDigest(snapshot.models),
269
+ catalogDigest: workerConfigDigest(snapshot.catalog),
270
+ profileDigest: workerConfigDigest([snapshot.registry, snapshot.installations]),
271
+ constraintsDigest: workerConfigDigest(snapshot.constraints),
272
+ };
273
+ const plan = {
274
+ mode: parallelism.worker_mode ?? 'direct', status: 'blocked', role: null, selected: null,
275
+ eligible: [], alternatives: [], exclusions: [], diagnostics: [], digests,
276
+ policy: structuredClone(policy), origins: structuredClone(snapshot.models.workerPolicyOrigins),
277
+ choice: null, capacity: 'conductor-guidance-only', ceilings: {},
278
+ };
279
+ const diagnostic = (code, pointer, message) => ({ code, pointer, message });
280
+ const block = (code, pointer, message) => {
281
+ plan.diagnostics.push(diagnostic(code, pointer, message));
282
+ };
283
+ if (!parallelism.worker_dispatch) {
284
+ plan.status = 'disabled';
285
+ block('OG_CONFIG_REFERENCE', '/parallelism/worker_dispatch', `Direct worker dispatch is off (parallelism.worker_dispatch). Enable with \`${WORKER_DISPATCH_ENABLE_COMMAND}\` `
286
+ + `(then check readiness with \`${WORKER_DISPATCH_READINESS_COMMAND}\`).`);
287
+ return plan;
288
+ }
289
+ const now = new Date(request.now);
290
+ if (!Number.isFinite(now.getTime()))
291
+ block('OG_CONFIG_REFERENCE', '/request/now', 'A valid current clock is required');
292
+ if (!request.context || typeof request.context.estimator !== 'string')
293
+ block('OG_CONFIG_REFERENCE', '/request/context', 'A named, bounded context estimate is required');
294
+ if (snapshot.constraints?.revokedModels?.some(key => !isCanonicalWorkerModelKey(key)))
295
+ block('OG_CONFIG_REFERENCE', '/constraints/revokedModels', 'Revocations require canonical inference model keys');
296
+ if (request.expectedDigests && (Object.keys(request.expectedDigests).length !== Object.keys(digests).length
297
+ || Object.entries(digests).some(([key, value]) => request.expectedDigests[key] !== value))) {
298
+ block('OG_CONFIG_REFERENCE', '/request/expectedDigests', 'Current input digests changed; resolve again');
299
+ }
300
+ if (Object.values(snapshot.modelDigests).length !== 3 || Object.values(digests).some(value => !/^sha256:[a-f0-9]{64}$/.test(value))) {
301
+ block('OG_CONFIG_REFERENCE', '/models', 'Current loader input digests are required');
302
+ }
303
+ if (plan.mode === 'managed') {
304
+ const activation = parallelism.activation;
305
+ if (!activation || ['configDigest', 'projectModelsDigest', 'userModelsDigest', 'builtinModelsDigest'].some(key => activation[key] !== digests[key])) {
306
+ block('OG_CONFIG_REFERENCE', '/parallelism/activation', 'Managed activation is missing or stale');
307
+ }
308
+ block('OG_ADAPTER_UNQUALIFIED', '/parallelism/worker_mode', 'Managed activation/admission runtime is deferred to S2+');
309
+ }
310
+ if (!policy)
311
+ block('OG_CONFIG_REFERENCE', '/defaults/workerSelection', 'Current merged worker policy is required');
312
+ const catalogErrors = validateWorkerCatalogDiscovery(snapshot.catalog.discovery);
313
+ if (catalogErrors.length)
314
+ block('OG_ADAPTER_UNQUALIFIED', '/catalog/discovery', catalogErrors.join('; '));
315
+ if (plan.diagnostics.length || !policy)
316
+ return plan;
317
+ const policyShape = WorkerSelectionPolicySchema.safeParse(policy);
318
+ if (!policyShape.success) {
319
+ block('OG_CONFIG_REFERENCE', '/defaults/workerSelection', policyShape.error.message);
320
+ return plan;
321
+ }
322
+ for (const message of validateWorkerGroupReferences(parallelism, policy))
323
+ block('OG_CONFIG_REFERENCE', '/parallelism', message);
324
+ if (plan.diagnostics.length)
325
+ return plan;
326
+ parallelism = resolveParallelism(parallelism, snapshot.config.providers?.[0]);
327
+ const ceilingLayers = [parallelism.budgets?.perRun, parallelism.budgets?.perTask,
328
+ { maxAttempts: parallelism.retry?.maxAttempts ?? 3 }, snapshot.constraints?.ceilings, request.ceilings];
329
+ for (const key of ['tokens', 'costUsd', 'wallSeconds', 'maxAttempts']) {
330
+ const values = ceilingLayers.map(layer => layer?.[key]).filter((value) => value !== undefined);
331
+ if (values.some(value => !Number.isFinite(value) || value < 0 || key !== 'costUsd' && !Number.isSafeInteger(value))) {
332
+ block('OG_CONFIG_REFERENCE', `/request/ceilings/${key}`, 'Ceilings must be finite nonnegative values; counts must be integers');
333
+ }
334
+ else if (values.length)
335
+ plan.ceilings[key] = Math.min(...values);
336
+ }
337
+ if (plan.ceilings.maxAttempts === 0)
338
+ block('OG_BUDGET_UNMEASURABLE', '/request/ceilings/maxAttempts', 'No task attempts remain');
339
+ const qualifiedRoles = {};
340
+ for (const [groupId, group] of Object.entries(parallelism.groups ?? {})) {
341
+ for (const member of group.members) {
342
+ const observed = findWorkerModelRow(snapshot.catalog.discovery?.instances?.[member.cli]?.models, member.model)?.worker;
343
+ qualifiedRoles[`${groupId}/${member.id}`] = observed?.qualification.status === 'qualified'
344
+ ? observed.qualification.roles.filter(role => policy.roleGuidance?.[role]?.groups.includes(groupId)) : [];
345
+ }
346
+ }
347
+ plan.diagnostics.push(...validateWorkerGroupQualifications(parallelism, qualifiedRoles).map(diagnostic => ({
348
+ ...diagnostic, message: `${diagnostic.message}. Run aiwg doctor --probe-workers --qualify.`,
349
+ })));
350
+ const taskRole = request.taskClass ? policy.taskClasses?.[request.taskClass] : undefined;
351
+ const role = request.role ?? taskRole;
352
+ plan.role = role ?? null;
353
+ if (request.taskClass && (!taskRole || request.role && taskRole !== request.role))
354
+ block('OG_CONFIG_REFERENCE', '/request/taskClass', 'Unknown task class or conflicting role');
355
+ const guidance = role ? policy.roleGuidance?.[role] : undefined;
356
+ if (!role || !guidance)
357
+ block('OG_CONFIG_REFERENCE', '/defaults/workerSelection/roleGuidance', 'Requested role has no guidance');
358
+ if (request.member && !request.group)
359
+ block('OG_CONFIG_REFERENCE', '/request/member', 'Group-local member pins require a group');
360
+ if (request.group && !guidance?.groups.includes(request.group))
361
+ block('OG_CONFIG_REFERENCE', '/request/group', 'Group is outside role guidance');
362
+ if ([request.maxParallel, snapshot.constraints?.maxParallel].some(value => value !== undefined && (!Number.isSafeInteger(value) || value < 0)))
363
+ block('OG_CONFIG_REFERENCE', '/request/maxParallel', 'Capacity ceilings must be nonnegative integers');
364
+ if (request.requireDifferentFamily && (!request.reviewOf || validateWorkerModelObservation(request.reviewOf).length
365
+ || hasSelectionRelevantConflicts(request.reviewOf) || !request.reviewOf.family || request.reviewOf.family === 'unknown')) {
366
+ block('OG_MODEL_UNAPPROVED', '/request/reviewOf', 'Required review needs unambiguous observed source lineage');
367
+ }
368
+ if (plan.diagnostics.length || !role || !guidance)
369
+ return plan;
370
+ const wrapperPin = snapshot.models.agentOverrides[MODEL_WRAPPERS[role]]?.['model-override'];
371
+ const groups = request.group ? [request.group] : guidance.groups;
372
+ for (const groupId of groups) {
373
+ const group = parallelism.groups[groupId];
374
+ const permissions = { ...group.execution, transport: group.execution?.transport ?? 'shell' };
375
+ const transport = permissions.transport;
376
+ // Priority is guidance only. Preserve declaration order for ties; fallback order stays explicit.
377
+ const members = group.members.map((member, index) => ({ member, index })).sort((a, b) => (a.member.priority ?? 100) - (b.member.priority ?? 100) || a.index - b.index);
378
+ for (const { member } of members) {
379
+ const binding = snapshot.installations[member.cli];
380
+ const discovery = snapshot.catalog.discovery?.instances?.[member.cli];
381
+ const row = findWorkerModelRow(discovery?.models, member.model);
382
+ const observation = row?.worker;
383
+ const efforts = request.effort !== undefined ? [request.effort]
384
+ : [...new Set([guidance.initialEffort, ...guidance.effortLadder])];
385
+ for (const effort of efforts) {
386
+ const tuple = { group: groupId, member: member.id, model: member.model, effort };
387
+ const reasons = [];
388
+ const deny = (code, pointer, message) => { reasons.push(diagnostic(code, pointer, message)); };
389
+ const pointer = `/parallelism/groups/${groupId}/members/${member.id}`;
390
+ if (request.transport !== undefined && request.transport !== transport)
391
+ deny('OG_POLICY_RELAXATION', '/request/transport', 'Requested transport differs from resolved group permissions');
392
+ if (member.enabled === false || parallelism.clis?.[member.cli]?.enabled === false)
393
+ deny('OG_CONFIG_REFERENCE', pointer, 'Member or installation is disabled');
394
+ if (!member.roles.includes(role))
395
+ deny('OG_CONFIG_REFERENCE', pointer, 'Member does not cover requested role');
396
+ const pinMismatch = request.member && request.member !== member.id || request.model && request.model !== member.model || wrapperPin && wrapperPin !== member.model;
397
+ const substitution = request.substitution && matchesChoice(tuple, request.substitution) && request.substitution.rationale.trim();
398
+ if (pinMismatch && !substitution)
399
+ deny('OG_PIN_MISMATCH', pointer, 'Exact request or wrapper pin requires explicit substitution');
400
+ if (!observation || !binding || !row?.llmProvider || !row.apiModelId)
401
+ deny('OG_ADAPTER_UNQUALIFIED', pointer, 'Missing exact model, inference provider, observation or current installation evidence. Run aiwg doctor --probe-workers --qualify.');
402
+ if (observation && binding && row?.llmProvider && row.apiModelId) {
403
+ const shapeErrors = validateWorkerModelObservation(observation);
404
+ if (shapeErrors.length) {
405
+ deny('OG_ADAPTER_UNQUALIFIED', '/worker', shapeErrors.join('; '));
406
+ plan.exclusions.push({ ...tuple, diagnostics: reasons });
407
+ continue;
408
+ }
409
+ if (observation.cliId !== member.cli || observation.runtimeVersion !== binding.cliVersion
410
+ || observation.accountScope !== binding.accountScope || observation.endpointFingerprint !== binding.endpointFingerprint
411
+ || discovery?.accountBinding !== binding.accountScope || discovery?.runtimeVersion !== binding.cliVersion
412
+ || parallelism.clis?.[member.cli]?.accountScope && parallelism.clis[member.cli].accountScope !== binding.accountScope) {
413
+ deny('OG_ADAPTER_UNQUALIFIED', pointer, 'Catalog and current installation scope differ');
414
+ }
415
+ reasons.push(...validateWorkerPolicyRoute({ policy, role, inferenceProvider: row.llmProvider, apiModelId: row.apiModelId,
416
+ selectedModel: member.model, effort, identityEvidence: binding.identityEvidence, observation,
417
+ wrapperPin, ...(substitution ? { substitution: request.substitution } : {}), dataClass: request.dataClass, now, context: request.context }));
418
+ if (request.requireDifferentFamily && (observation.family === 'unknown' || observation.family === request.reviewOf.family))
419
+ deny('OG_MODEL_UNAPPROVED', '/worker/family', 'Required review must use a different observed family');
420
+ try {
421
+ const { adapter } = resolveWorkerGroupInstallation(parallelism, member.cli, snapshot.registry);
422
+ const configuredProfile = parallelism.clis?.[member.cli]?.invocationProfile;
423
+ if (configuredProfile && configuredProfile !== binding.profile)
424
+ throw new Error('Configured invocation profile changed');
425
+ const configuredServer = parallelism.clis?.[member.cli]?.mcpServerRef;
426
+ if (transport === 'mcp' && configuredServer && configuredServer !== binding.mcp?.serverRef)
427
+ throw new Error('Configured MCP server changed');
428
+ if (!hasOperatorWorkerNativeRenderer(adapter) && (adapter.capabilities.modelPin === 'unsupported' || !adapter.capabilities.nativeFallbackControllable))
429
+ throw new Error('Exact model or fallback control is unqualified; qualify an adapter with these controls');
430
+ if (policy.guards?.denySelfDelegation !== false && !adapter.capabilities.nestedAgentsControllable)
431
+ throw new Error('Child-agent control is unqualified. Review models.json defaults.workerSelection.guards.denySelfDelegation; false permits uncontrolled child agents without qualifying their behavior.');
432
+ if (binding.identityEvidence === 'backend-attested' && adapter.capabilities.modelPin !== 'observed')
433
+ throw new Error('Requested-only mapping cannot attest backend identity');
434
+ if (!hasOperatorWorkerNativeRenderer(adapter) && group.execution?.sandbox && !adapter.capabilities.sandboxModes.includes(group.execution.sandbox))
435
+ throw new Error('Requested sandbox mode is unqualified');
436
+ qualifyWorkerInvocationProfile(adapter, { profile: binding.profile, transport, cliVersion: binding.cliVersion,
437
+ policy, permissions, effort, boundary: binding.boundary,
438
+ requiredControls: request.requiredControls, mcp: binding.mcp });
439
+ const { maxAttempts: _maxAttempts, ...budgetLimits } = plan.ceilings;
440
+ const budgetDimensions = { tokens: 'tokens', cost: 'costUsd', 'wall-time': 'wallSeconds' };
441
+ const enforceable = adapter.capabilities.hardBudget.map(key => budgetDimensions[key]);
442
+ for (const message of validateWorkerBudgetEnforcement({ ...parallelism.budgets, perTask: budgetLimits }, enforceable))
443
+ deny('OG_BUDGET_UNMEASURABLE', '/parallelism/budgets', message);
444
+ }
445
+ catch (error) {
446
+ deny('OG_ADAPTER_UNQUALIFIED', pointer, String(error));
447
+ }
448
+ let key;
449
+ try {
450
+ key = workerModelKey(row.llmProvider, row.apiModelId);
451
+ }
452
+ catch {
453
+ plan.exclusions.push({ ...tuple, diagnostics: reasons });
454
+ continue;
455
+ }
456
+ if (snapshot.constraints?.revokedModels?.includes(key))
457
+ deny('OG_MODEL_UNAPPROVED', '/constraints/revokedModels', 'Current model revocation');
458
+ if (snapshot.constraints?.unavailableMembers?.includes(`${groupId}/${member.id}`))
459
+ deny('OG_ADAPTER_UNQUALIFIED', pointer, 'Member is currently unavailable');
460
+ const premium = ['premium', 'max-quality'].includes(guidance.tier) || observation.pricing.costClass === 'premium';
461
+ // Worker candidates always invoke a model; deterministic/routine hints must not bypass premium authority.
462
+ const authority = routeModelTier({ ...request.authority, deterministic: false, routine: false,
463
+ defaultTier: guidance.tier === 'economy' ? 1 : 2, requestedPremium: premium || request.authority?.requestedPremium });
464
+ if (authority.requiresConfirmation)
465
+ deny('OG_MODEL_UNAPPROVED', '/request/authority', `${authority.rationale.join('; ')}; agents may pass --authorize-premium only after the human explicitly confirmed the premium escalation (escalation-discipline rule)`);
466
+ const installation = parallelism.clis?.[member.cli];
467
+ const caps = [parallelism.max_parallel_subagents, group.maxParallel, parallelism.admission?.groupCaps?.[groupId],
468
+ parallelism.admission?.memberCaps?.[`${groupId}/${member.id}`], parallelism.admission?.cliCaps?.[member.cli],
469
+ parallelism.admission?.modelCaps?.[key], installation && parallelism.admission?.quotaCaps?.[installation.quotaScope],
470
+ snapshot.constraints?.maxParallel, request.maxParallel].filter((value) => value !== undefined);
471
+ const effectiveMaxParallel = caps.length ? Math.min(...caps) : null;
472
+ if (effectiveMaxParallel === 0)
473
+ deny('OG_ADAPTER_UNQUALIFIED', '/constraints/maxParallel', 'Current capacity ceiling is zero');
474
+ if (!reasons.some(reason => reason.blocking !== false))
475
+ plan.eligible.push({ ...tuple, cli: member.cli,
476
+ inferenceProvider: row.llmProvider, modelKey: key, family: observation.family, identityEvidence: binding.identityEvidence,
477
+ profile: binding.profile, transport,
478
+ permissions: structuredClone(permissions), context: workerContextHeadroom(request.context, observation),
479
+ observedAt: observation.observedAt, verifiedAt: observation.verifiedAt, observationRef: observation.recordId,
480
+ effectiveMaxParallel, diagnostics: reasons });
481
+ }
482
+ if (reasons.some(reason => reason.blocking !== false))
483
+ plan.exclusions.push({ ...tuple, diagnostics: reasons });
484
+ }
485
+ }
486
+ }
487
+ if (request.choice) {
488
+ if (!request.choice.rationale.trim())
489
+ block('OG_CONFIG_REFERENCE', '/request/choice/rationale', 'Conductor choice requires a rationale');
490
+ plan.selected = plan.eligible.find(tuple => matchesChoice(tuple, request.choice)) ?? null;
491
+ if (!plan.selected)
492
+ block('OG_MODEL_UNAPPROVED', '/request/choice', 'Conductor choice is outside the eligible set');
493
+ }
494
+ else
495
+ plan.selected = plan.eligible[0] ?? null;
496
+ if (plan.diagnostics.length)
497
+ plan.selected = null;
498
+ if (plan.selected) {
499
+ plan.status = 'eligible';
500
+ plan.choice = { source: request.choice ? 'conductor' : 'default', rationale: request.choice?.rationale ?? 'Role group order, member priority/declaration order, then qualified effort ladder',
501
+ ...(request.substitution && matchesChoice(plan.selected, request.substitution) ? { substitution: structuredClone(request.substitution) } : {}) };
502
+ }
503
+ plan.alternatives = plan.eligible.filter(tuple => tuple !== plan.selected);
504
+ return plan;
505
+ }
245
506
  //# sourceMappingURL=resolver.js.map