@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
@@ -10,7 +10,7 @@ import { QUALIFICATION_PRIVACY_SURFACES, scanQualificationPrivacy } from '../qua
10
10
  import { executeQualificationPlan, verifyQualificationArtifacts, writeQualificationEvidenceManifest } from '../qualification/runner.js';
11
11
  import { qualificationIntegrityAllowlistProblems } from '../qualification/release.js';
12
12
  import { redactText } from '../../governance/redaction.js';
13
- import { heldoutDigest, heldoutRequest, heldoutReservationMicros, heldoutReservationTokens, HeldoutError, HELDOUT_ENV_GATE, heldoutRowsInScope, planHeldoutCollection, validateHeldoutBundle } from './contract.js';
13
+ import { heldoutDigest, heldoutRequest, heldoutReservationMicros, heldoutReservationTokens, HeldoutError, HELDOUT_ENV_GATE, heldoutRowsInScope, heldoutResumeAttempts, heldoutPendingRequests, planHeldoutCollection, validateHeldoutBundle } from './contract.js';
14
14
  import { appendHeldoutSpend, appendHeldoutEvent, heldoutDirectory, heldoutEvidenceDigest, heldoutRunsRoot, readHeldoutFile, readHeldoutJournal, reconcileHeldoutBaseline, scanHeldoutSpend, writeHeldoutFile, validateHeldoutJournal, heldoutCollectionAllowance } from './journal.js';
15
15
  import { readHeldoutFrozen, sealHeldoutCalibrationPhase, validateHeldoutPhaseAccess } from './calibration.js';
16
16
  import { D17_MULTIFACT_CALIBRATION_NOT_AFTER, usesD17MultifactGenerator } from './study-generators.js';
@@ -70,13 +70,7 @@ export async function collectHeldoutStudy(options) {
70
70
  throw new HeldoutError('prior-stop');
71
71
  if (!offline && prior.runs.some(run => run.corpusDigest === a.corpusDigest && run.source === 'injected-transport'))
72
72
  throw new HeldoutError('injected-prior');
73
- const old = prior.attempts.filter(attempt => attempt.study === a.study && attempt.corpusDigest === a.corpusDigest);
74
- if (old.some(attempt => attempt.preregistrationDigest !== a.preregistrationDigest))
75
- throw new HeldoutError('changed-preregistration');
76
- const latest = new Map();
77
- for (const attempt of old)
78
- if (attempt.ordinal >= (latest.get(key(attempt))?.ordinal ?? 0))
79
- latest.set(key(attempt), attempt);
73
+ const { old, latest } = heldoutResumeAttempts(bundle, prior.attempts);
80
74
  const now = options.now ?? Date.now, sleep = options.sleep ?? delay, started = now();
81
75
  // D17-MF (#2850) is scored only through the registered D17 member calibrator: a session whose whole dispatch window
82
76
  // (start plus the preregistered session limit) does not end before the calibrator expires never starts. A seed
@@ -127,20 +121,18 @@ export async function collectHeldoutStudy(options) {
127
121
  }
128
122
  if (failed.has(row.id) || overSlice(row.slice, row.split))
129
123
  continue;
130
- const remaining = row.requests.filter(request => latest.get(`${row.id}/${request.id}`)?.result?.disposition !== 'success');
124
+ const remaining = heldoutPendingRequests(row, plan, latest);
131
125
  if (!remaining.length)
132
126
  continue;
133
127
  // Checkpoint before a subject/paired arms: enough time for every bounded attempt and interval.
134
- const pairBound = remaining.length * (1 + plan.providerFailurePolicy.maxRetries) * (plan.requestTimeoutMs + plan.minDispatchIntervalMs);
128
+ const pairBound = remaining.reduce((n, request) => n + request.attempts, 0) * (plan.requestTimeoutMs + plan.minDispatchIntervalMs);
135
129
  if (now() - started + pairBound > plan.sessionLimitMs * 0.8) {
136
130
  checkpoint = true;
137
131
  break;
138
132
  }
139
- for (const request of remaining) {
133
+ for (const { request, first } of remaining) {
140
134
  if (reason || failed.has(row.id))
141
135
  break;
142
- const previous = latest.get(`${row.id}/${request.id}`);
143
- const first = previous ? previous.ordinal + 1 : 1;
144
136
  for (let ordinal = first; ordinal <= 1 + plan.providerFailurePolicy.maxRetries; ordinal++) {
145
137
  if (options.signal?.aborted) {
146
138
  reason = 'cancelled';
@@ -250,6 +242,12 @@ export async function collectHeldoutStudy(options) {
250
242
  // No raw provider exceptions, model IDs or request IDs cross this boundary when a secret matches.
251
243
  const raw = observation;
252
244
  const metadata = wireMetadata;
245
+ // `metadata` is `jev.ts`'s observer, reading model/usage off the exact same single parse that
246
+ // produced `raw` (never a second, independent parse of the same bytes -- see jev.ts `observeParsed`).
247
+ // The two can therefore no longer disagree on a successful response; preferring `metadata` here
248
+ // only matters when `raw` is a failure (e.g. an otherwise-parseable but invalid answer), so the
249
+ // model/usage bound checks below still see the wire-observed values jev.ts's `failure()` does not
250
+ // carry.
253
251
  const observed = raw && metadata ? { ...raw, actualModel: metadata.actualModel, usage: metadata.usage } : raw;
254
252
  const completed = receipt;
255
253
  const captures = QUALIFICATION_PRIVACY_SURFACES.map(surface => ({ surface,
@@ -275,7 +273,10 @@ export async function collectHeldoutStudy(options) {
275
273
  else if (observed?.usage.costUsd !== null && observed?.usage.costUsd !== undefined && observed.usage.costUsd * 1_000_000 > reserveMicros)
276
274
  outcome = 'price-bound';
277
275
  else if (observed?.status === 'success') {
278
- if (observed.actualModel !== a.servedModel)
276
+ // A null model is unknown, not a mismatch: it must complete neither as 'ok' nor as 'served-model'.
277
+ if (observed.actualModel === null)
278
+ outcome = 'model-unknown';
279
+ else if (observed.actualModel !== a.servedModel)
279
280
  outcome = 'served-model';
280
281
  else if (observed.usage.inputTokens === null || observed.usage.outputTokens === null)
281
282
  outcome = 'usage-unknown';
@@ -260,26 +260,49 @@ export async function assertHeldoutRequestBounds(corpus, plan, approval) {
260
260
  }
261
261
  }
262
262
  }
263
- export async function planHeldoutCollection(bundle, digest) {
263
+ /** Prior observations are reusable only within the same study, corpus and preregistration. */
264
+ export function heldoutResumeAttempts(bundle, prior) {
265
+ const a = bundle.approval;
266
+ const old = prior.filter(attempt => attempt.study === a.study && attempt.corpusDigest === a.corpusDigest);
267
+ if (old.some(attempt => attempt.preregistrationDigest !== a.preregistrationDigest))
268
+ throw new HeldoutError('changed-preregistration');
269
+ const latest = new Map();
270
+ for (const attempt of old) {
271
+ const key = `${attempt.rowId}/${attempt.requestId}`, previous = latest.get(key);
272
+ if (previous?.result?.disposition !== 'success' && (attempt.result?.disposition === 'success'
273
+ || attempt.ordinal >= (previous?.ordinal ?? 0)))
274
+ latest.set(key, attempt);
275
+ }
276
+ return { old, latest };
277
+ }
278
+ /** The collector and dry-run reserve only unfinished requests, with their unspent retry allowance. */
279
+ export function heldoutPendingRequests(row, plan, latest) {
280
+ return row.requests.flatMap(request => {
281
+ const previous = latest.get(`${row.id}/${request.id}`);
282
+ const first = (previous?.ordinal ?? 0) + 1, attempts = 2 + plan.providerFailurePolicy.maxRetries - first;
283
+ return previous?.result?.disposition === 'success' || attempts <= 0 ? [] : [{ request, first, attempts }];
284
+ });
285
+ }
286
+ export async function planHeldoutCollection(bundle, digest, prior = []) {
264
287
  validateHeldoutBundle(bundle, digest);
265
288
  await assertHeldoutRequestBounds(bundle.corpus, bundle.preregistration, bundle.approval);
266
- let maximumRequestEstimateTokens = 0, tokens = 0, usdMicros = 0;
289
+ const { latest } = heldoutResumeAttempts(bundle, prior);
290
+ let maximumRequestEstimateTokens = 0, tokens = 0, usdMicros = 0, maximumAttempts = 0;
267
291
  const rows = heldoutRowsInScope(bundle);
268
292
  for (const row of rows)
269
- for (const request of row.requests) {
293
+ for (const { request, attempts } of heldoutPendingRequests(row, bundle.preregistration, latest)) {
270
294
  const planned = await heldoutRequest(bundle.corpus, bundle.preregistration, bundle.approval, row, request);
271
295
  maximumRequestEstimateTokens = Math.max(maximumRequestEstimateTokens, planned.estimatedTokens);
272
296
  const reservation = heldoutReservationMicros(bundle.approval, planned.estimatedTokens);
273
297
  if (reservation > Math.floor(bundle.approval.budget.usd * 1_000_000))
274
298
  throw new HeldoutError('approval-call-budget');
275
- const attempts = 1 + bundle.preregistration.providerFailurePolicy.maxRetries;
299
+ maximumAttempts += attempts;
276
300
  tokens += attempts * heldoutReservationTokens(bundle.preregistration, planned.estimatedTokens);
277
301
  usdMicros += attempts * reservation;
278
302
  }
279
- const attempts = rows.reduce((n, r) => n + r.requests.length, 0) * (1 + bundle.preregistration.providerFailurePolicy.maxRetries);
280
303
  const a = bundle.approval;
281
- return { calibration: structuredClone(a.calibration), rowsInScope: rows.map(row => row.id), providerCalls: 0, maximumAttempts: attempts, maximumRequestEstimateTokens, reservedTokens: tokens, reservedUsdMicros: usdMicros,
282
- fitsBeforeStop: attempts <= Math.floor(a.budget.calls * 0.8) && tokens <= Math.floor(a.budget.tokens * 0.8)
304
+ return { calibration: structuredClone(a.calibration), rowsInScope: rows.map(row => row.id), providerCalls: 0, maximumAttempts, maximumRequestEstimateTokens, reservedTokens: tokens, reservedUsdMicros: usdMicros,
305
+ fitsBeforeStop: maximumAttempts <= Math.floor(a.budget.calls * 0.8) && tokens <= Math.floor(a.budget.tokens * 0.8)
283
306
  && usdMicros <= Math.floor(Math.min(a.budget.usd, HELDOUT_CAP_USD[a.study] - a.priorStudySpendUsd, HELDOUT_PORTFOLIO_CAP_USD - a.priorPortfolioSpendUsd) * 800_000) };
284
307
  }
285
308
  /** An intentionally unapproved, unpriced form. Unknown attestations stay null, never fixture approvals. */
@@ -54,6 +54,7 @@ export * from './issue-triage/index.js';
54
54
  export * from './routing/index.js';
55
55
  export * from './interop.js';
56
56
  export * from './ask.js';
57
+ export * from './ledger.js';
57
58
  export * from './jev-credentials.js';
58
59
  export { collectHeldoutStudy, scoreHeldoutStudy } from './heldout/collector.js';
59
60
  export { heldoutDigest, heldoutExecutionDigest, planHeldoutCollection, validateHeldoutBundle, heldoutRowsInScope } from './heldout/contract.js';
@@ -38,7 +38,8 @@ const FORBIDDEN_CONTROL_FIELDS = new Set([
38
38
  'calibration', 'executor', 'backend', 'acceptance', 'artifactPin', 'actionAuthorization',
39
39
  ]);
40
40
  const SENSITIVE_LOG_KEY = /(?:raw|body|secret|token|credential|private|locator|state|authorization|password|key)/iu;
41
- const SENSITIVE_LOG_VALUE = /(?:bearer\s+\S+|secret|token|file:\/\/|\/home\/|private|[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,})/iu;
41
+ const SENSITIVE_LOG_VALUE = /(?:bearer\s+\S+|secret|token|file:\/\/|\/home\/|private)/iu;
42
+ const MAX_LOG_VALUE_LENGTH = 65_536;
42
43
  const SUPPORTED_DMN_ELEMENTS = new Set(['definitions', 'decision', 'informationRequirement', 'requiredDecision', 'decisionTable', 'input', 'inputExpression', 'output', 'rule', 'inputEntry', 'outputEntry', 'text']);
43
44
  export function decisionInteropDefaultBounds(overrides = {}) {
44
45
  return { ...DEFAULT_BOUNDS, ...overrides };
@@ -580,7 +581,11 @@ function sanitizeJson(value, path, redaction) {
580
581
  redaction.removed.push(`${path}.${key}`);
581
582
  continue;
582
583
  }
583
- result[key] = sanitizeJson(child, `${path}.${key}`, redaction);
584
+ // Keep ordinary objects while preserving __proto__ as an own JSON data key.
585
+ Object.defineProperty(result, key, {
586
+ value: sanitizeJson(child, `${path}.${key}`, redaction),
587
+ enumerable: true, writable: true, configurable: true,
588
+ });
584
589
  }
585
590
  return result;
586
591
  }
@@ -595,10 +600,16 @@ function projectOpaInput(input, allowlist, redaction) {
595
600
  for (const pointer of allowlist) {
596
601
  if (!pointer.startsWith('/'))
597
602
  throw new DecisionInteropError('opa-input-projection', 'OPA input projection allowlist entries must be JSON Pointers');
603
+ const path = pointer.slice(1).split('/').map(part => part.replace(/~1/gu, '/').replace(/~0/gu, '~'));
604
+ // Only __proto__ is forbidden in pointers; constructor/prototype are valid data keys.
605
+ // Own-property traversal and data-property writes keep ordinary projection objects safe.
606
+ if (path.some(segment => segment === '__proto__')) {
607
+ throw new DecisionInteropError('opa-input-projection', 'OPA input projection cannot contain __proto__ segments');
608
+ }
598
609
  const resolved = resolveJsonPointer(input, pointer);
599
610
  if (!resolved.found)
600
611
  continue;
601
- setProjectedValue(output, pointer.slice(1).split('/').map(part => part.replace(/~1/gu, '/').replace(/~0/gu, '~')), sanitizeJson(resolved.value, `$.input${pointer}`, redaction));
612
+ setProjectedValue(output, path, sanitizeJson(resolved.value, `$.input${pointer}`, redaction));
602
613
  }
603
614
  return output;
604
615
  }
@@ -606,17 +617,58 @@ function setProjectedValue(target, path, value) {
606
617
  let cursor = target;
607
618
  path.forEach((segment, index) => {
608
619
  if (index === path.length - 1) {
609
- cursor[segment] = value;
620
+ Object.defineProperty(cursor, segment, {
621
+ value, enumerable: true, writable: true, configurable: true,
622
+ });
610
623
  return;
611
624
  }
612
- const existing = cursor[segment];
613
- if (!existing || typeof existing !== 'object' || Array.isArray(existing))
614
- cursor[segment] = {};
625
+ const existing = Object.hasOwn(cursor, segment) ? cursor[segment] : undefined;
626
+ if (!existing || typeof existing !== 'object' || Array.isArray(existing)) {
627
+ Object.defineProperty(cursor, segment, {
628
+ value: {}, enumerable: true, writable: true, configurable: true,
629
+ });
630
+ }
615
631
  cursor = cursor[segment];
616
632
  });
617
633
  }
618
634
  function isSensitiveValue(value) {
619
- return typeof value === 'string' && SENSITIVE_LOG_VALUE.test(value);
635
+ if (typeof value !== 'string')
636
+ return false;
637
+ // Redact oversized values in full so a sensitive suffix cannot escape inspection.
638
+ if (value.length > MAX_LOG_VALUE_LENGTH)
639
+ return true;
640
+ if (SENSITIVE_LOG_VALUE.test(value))
641
+ return true;
642
+ let localLength = 0;
643
+ let domainLength = -1;
644
+ let suffixLength = -1;
645
+ for (const character of value) {
646
+ const letter = /[A-Z]/iu.test(character);
647
+ if (character === '@') {
648
+ domainLength = localLength > 0 ? 0 : -1;
649
+ suffixLength = -1;
650
+ }
651
+ else if (domainLength >= 0) {
652
+ if (/[A-Z0-9.-]/iu.test(character)) {
653
+ if (character === '.')
654
+ suffixLength = domainLength > 0 ? 0 : -1;
655
+ else if (letter && suffixLength >= 0) {
656
+ suffixLength++;
657
+ if (suffixLength >= 2)
658
+ return true;
659
+ }
660
+ else
661
+ suffixLength = -1;
662
+ domainLength++;
663
+ }
664
+ else {
665
+ domainLength = -1;
666
+ suffixLength = -1;
667
+ }
668
+ }
669
+ localLength = /[A-Z0-9._%+-]/iu.test(character) ? localLength + 1 : 0;
670
+ }
671
+ return false;
620
672
  }
621
673
  function assertUnique(values, label) {
622
674
  const seen = new Set();
@@ -1,3 +1,4 @@
1
+ import { resolveDecisionEnablement } from '../config/decision-config.js';
1
2
  import { constants } from 'node:fs';
2
3
  import { access, chmod, mkdir, readFile, rename, rm, stat, writeFile } from 'node:fs/promises';
3
4
  import os from 'node:os';
@@ -64,7 +65,8 @@ export async function lookupJevCredential(options = {}) {
64
65
  const forced = environment.AIWG_DECISION_ENABLED;
65
66
  const envToken = environment.JEV_API_KEY?.trim() || environment.AIWG_DECISION_JEV_API_KEY?.trim();
66
67
  const fileRecord = envToken && (forced === '0' || forced === '1') ? null : await readCredentialFile(options);
67
- const enabled = forced === '0' ? false : forced === '1' ? true : fileRecord?.enabled === true;
68
+ const enablement = resolveDecisionEnablement(options);
69
+ const enabled = enablement.source === 'default' ? fileRecord?.enabled === true : enablement.enabled;
68
70
  if (envToken)
69
71
  return {
70
72
  source: 'env',
@@ -78,6 +80,18 @@ export async function lookupJevCredential(options = {}) {
78
80
  return null;
79
81
  return { source: 'file', token: fileRecord.token, region: fileRecord.region, ...(fileRecord.endpoint ? { endpoint: fileRecord.endpoint } : {}), enabled };
80
82
  }
83
+ /** Offline metadata-only inspection. Never probes Jev and never returns credential bytes. */
84
+ export async function inspectJevCredential(options = {}) {
85
+ try {
86
+ const credential = await lookupJevCredential(options);
87
+ if (!credential)
88
+ return { configured: false, enabled: false, source: 'none' };
89
+ return { configured: true, enabled: credential.enabled, source: credential.source };
90
+ }
91
+ catch {
92
+ return { configured: null, enabled: null, source: 'unknown' };
93
+ }
94
+ }
81
95
  export async function resolveJevCredentialBytes(logicalRef, options = {}) {
82
96
  if (logicalRef !== JEV_CREDENTIAL_REF)
83
97
  throw new JevCredentialError('configuration');