@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,247 @@
1
+ import fs from 'node:fs';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import { fork } from 'node:child_process';
5
+ import { createHash, randomBytes, randomUUID } from 'node:crypto';
6
+ import { fileURLToPath } from 'node:url';
7
+ import { importImpl } from '../../_resolve-impl.mjs';
8
+ import {
9
+ createRuleDeploymentInputPool,
10
+ describeRuleDeploymentInputPool,
11
+ disposeRuleDeploymentInputPool,
12
+ adoptRuleDeploymentPlan,
13
+ commitRuleDeploymentPlan,
14
+ disposeRuleDeploymentPlan,
15
+ } from './rule-delivery.mjs';
16
+
17
+ const { trackTemporaryDirectory } = await importImpl(import.meta.url, 'utils/temporary-directory.js');
18
+ const { signalChild } = await importImpl(import.meta.url, 'process/signal-child.mjs');
19
+ const DEFAULT_WORKER = fileURLToPath(new URL('./provider-prepare-worker.mjs', import.meta.url));
20
+ const CHECKOUT_NEEDS_TS_TRANSFORM = !fs.existsSync(fileURLToPath(new URL('../../../dist/src', import.meta.url)));
21
+ const PLAN_LIMIT = 256 * 1024 * 1024;
22
+
23
+ const defaultTransaction = {
24
+ createPool: createRuleDeploymentInputPool,
25
+ describePool: describeRuleDeploymentInputPool,
26
+ disposePool: disposeRuleDeploymentInputPool,
27
+ adopt: adoptRuleDeploymentPlan,
28
+ commit: commitRuleDeploymentPlan,
29
+ disposePlan: disposeRuleDeploymentPlan,
30
+ isStale: error => error?.code === 'AIWG_RULE_DEPLOYMENT_STALE',
31
+ };
32
+
33
+ function exactKeys(value, keys) {
34
+ return value && typeof value === 'object' && !Array.isArray(value) &&
35
+ JSON.stringify(Object.keys(value).sort()) === JSON.stringify([...keys].sort());
36
+ }
37
+
38
+ function validateJob(job, expectedOrder) {
39
+ if (!job || job.order !== expectedOrder || !Number.isSafeInteger(job.order) ||
40
+ typeof job.provider !== 'string' || !job.provider || typeof job.target !== 'string' || !path.isAbsolute(job.target) ||
41
+ !Array.isArray(job.args) || job.args.some(value => typeof value !== 'string')) {
42
+ throw new Error(`Invalid provider preparation job at order ${expectedOrder}`);
43
+ }
44
+ }
45
+
46
+ function readPlan(response, expectedPath) {
47
+ if (!exactKeys(response.plan, ['path', 'size', 'sha256']) || response.plan.path !== expectedPath ||
48
+ !Number.isSafeInteger(response.plan.size) || response.plan.size < 2 || response.plan.size > PLAN_LIMIT ||
49
+ !/^[a-f0-9]{64}$/.test(response.plan.sha256)) throw new Error('Invalid provider preparation plan descriptor');
50
+ const stat = fs.lstatSync(expectedPath);
51
+ if (!stat.isFile() || stat.isSymbolicLink() || stat.size !== response.plan.size) throw new Error('Invalid provider preparation plan file');
52
+ const body = fs.readFileSync(expectedPath);
53
+ if (body.length !== response.plan.size || createHash('sha256').update(body).digest('hex') !== response.plan.sha256) {
54
+ throw new Error('Provider preparation plan digest mismatch');
55
+ }
56
+ return JSON.parse(body.toString('utf8'));
57
+ }
58
+
59
+ function prepareInChild({ job, attempt, sessionRoot, poolDescriptor, workerPath, workerEnv, activeChildren, timeoutMs }) {
60
+ const scratch = path.join(sessionRoot, `${job.order}-${attempt}-${randomUUID()}`);
61
+ fs.mkdirSync(scratch, { mode: 0o700 });
62
+ const capability = randomBytes(32).toString('hex');
63
+ const jobId = randomUUID();
64
+ const expectedPlan = path.join(scratch, 'plan.json');
65
+ return new Promise((resolve, reject) => {
66
+ const child = fork(workerPath, [], {
67
+ cwd: process.cwd(),
68
+ env: { ...process.env, ...workerEnv },
69
+ stdio: ['ignore', 'ignore', 'pipe', 'ipc'],
70
+ serialization: 'json',
71
+ execArgv: CHECKOUT_NEEDS_TS_TRANSFORM ? ['--import', 'tsx'] : [],
72
+ });
73
+ activeChildren.add(child);
74
+ const stderr = [];
75
+ let stderrBytes = 0;
76
+ child.stderr?.on('data', chunk => {
77
+ const retained = chunk.subarray(0, Math.max(0, 1024 * 1024 - stderrBytes));
78
+ if (retained.length) { stderr.push(Buffer.from(retained)); stderrBytes += retained.length; }
79
+ });
80
+ let settled = false;
81
+ let outcome;
82
+ let killTimer;
83
+ let timedOut = false;
84
+ const finish = () => {
85
+ if (settled) return;
86
+ settled = true;
87
+ clearTimeout(timer);
88
+ clearTimeout(killTimer);
89
+ activeChildren.delete(child);
90
+ if (child.connected) { try { child.disconnect(); } catch {} }
91
+ if (outcome?.error) reject(outcome.error); else if (outcome) resolve(outcome.value);
92
+ else reject(new Error(`Provider preparation worker exited ${child.exitCode ?? 'without status'} for ${job.provider}${stderrBytes ? `: ${Buffer.concat(stderr).toString('utf8').trim()}` : ''}`));
93
+ };
94
+ const stop = error => {
95
+ if (settled) return;
96
+ outcome = { error };
97
+ try { signalChild(child, 'SIGTERM'); } catch {}
98
+ if (!killTimer) {
99
+ killTimer = setTimeout(() => { try { signalChild(child, 'SIGKILL'); } catch {} }, 2_000);
100
+ killTimer.unref?.();
101
+ }
102
+ };
103
+ const timer = setTimeout(() => {
104
+ timedOut = true;
105
+ stop(new Error(`Provider preparation timed out for ${job.provider}`));
106
+ }, timeoutMs);
107
+ timer.unref?.();
108
+ child.once('error', error => {
109
+ // A spawn failure has no operating-system child to reap. Every error
110
+ // after a pid is assigned still waits for the exit event below.
111
+ if (!child.pid) { outcome = { error }; finish(); }
112
+ else stop(error);
113
+ });
114
+ // Settle only after the operating system reports process exit. This keeps
115
+ // every worker in activeChildren until it is confirmed gone, including workers
116
+ // that send a response and retain an unexpected live handle.
117
+ child.once('exit', (code, signal) => {
118
+ if (outcome?.value && (code !== 0 || signal)) {
119
+ outcome = { error: new Error(`Provider preparation worker exited ${signal || code || 'without status'} after responding for ${job.provider}`) };
120
+ }
121
+ if (!outcome) outcome = { error: new Error(`${timedOut ? 'Provider preparation timed out' : `Provider preparation worker exited ${code ?? 'without status'}`} for ${job.provider}${stderrBytes ? `: ${Buffer.concat(stderr).toString('utf8').trim()}` : ''}`) };
122
+ finish();
123
+ });
124
+ child.once('message', response => {
125
+ try {
126
+ if (timedOut) throw new Error(`Provider preparation timed out for ${job.provider}`);
127
+ if (!exactKeys(response, response?.type === 'error'
128
+ ? ['version', 'type', 'capability', 'jobId', 'error']
129
+ : ['version', 'type', 'capability', 'jobId', 'plan']) ||
130
+ response.version !== 1 || response.capability !== capability || response.jobId !== jobId) {
131
+ throw new Error('Invalid provider preparation worker response');
132
+ }
133
+ if (response.type === 'error') {
134
+ if (!exactKeys(response.error, ['message']) || typeof response.error.message !== 'string') throw new Error('Invalid provider preparation worker error');
135
+ throw new Error(`${job.provider}: ${response.error.message}`);
136
+ }
137
+ if (response.type !== 'prepared') throw new Error('Invalid provider preparation worker response type');
138
+ outcome = { value: { detached: readPlan(response, expectedPlan), scratch, attempt } };
139
+ // Closing the IPC channel lets the single-request worker exit normally;
140
+ // the exit handler above confirms termination before exposing its plan.
141
+ if (child.connected) { try { child.disconnect(); } catch {} }
142
+ } catch (error) { stop(error); }
143
+ });
144
+ child.send({ version: 1, type: 'prepare', capability, jobId, order: job.order, attempt, provider: job.provider,
145
+ target: job.target, args: job.args, scratch, inputPool: poolDescriptor }, error => { if (error) stop(error); });
146
+ });
147
+ }
148
+
149
+ /** Prepare provider projections in at most two subprocesses. The returned
150
+ * session owns every stage and promotes them only through ordered commit(). */
151
+ export async function prepareProviderDeployments({
152
+ srcRoot,
153
+ jobs,
154
+ maxConcurrency = 2,
155
+ workerPath = DEFAULT_WORKER,
156
+ workerEnv = {},
157
+ timeoutMs = 120_000,
158
+ transaction = defaultTransaction,
159
+ onSessionRoot,
160
+ signal = signalChild,
161
+ }) {
162
+ if (typeof srcRoot !== 'string' || !path.isAbsolute(srcRoot) || !Array.isArray(jobs) || !jobs.length) throw new Error('Invalid provider preparation request');
163
+ jobs.forEach(validateJob);
164
+ const concurrency = Math.max(1, Math.min(2, Number.isSafeInteger(maxConcurrency) ? maxConcurrency : 2, jobs.length));
165
+ const sessionRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'aiwg-provider-prepare-'));
166
+ const removeSession = trackTemporaryDirectory(sessionRoot);
167
+ onSessionRoot?.(sessionRoot);
168
+ const activeChildren = new Set();
169
+ let pool;
170
+ let poolDescriptor;
171
+ try {
172
+ pool = transaction.createPool(srcRoot);
173
+ poolDescriptor = transaction.describePool(pool);
174
+ } catch (error) {
175
+ if (pool) transaction.disposePool(pool);
176
+ removeSession();
177
+ throw error;
178
+ }
179
+ const prepared = new Array(jobs.length);
180
+ let next = 0;
181
+ let closed = false;
182
+ let nextCommit = 0;
183
+ const stopChildren = async () => {
184
+ const children = [...activeChildren];
185
+ await Promise.all(children.map(child => new Promise(resolve => {
186
+ if (child.exitCode !== null || child.signalCode !== null) return resolve();
187
+ if (!Number.isSafeInteger(child.pid) || child.pid <= 0) return resolve();
188
+ const hardKill = setTimeout(() => { try { signal(child, 'SIGKILL'); } catch {} }, 2_000);
189
+ hardKill.unref?.();
190
+ child.once('exit', () => { clearTimeout(hardKill); resolve(); });
191
+ try { signal(child, 'SIGTERM'); } catch { /* escalation and exit confirmation remain required */ }
192
+ })));
193
+ };
194
+ const cleanup = async () => {
195
+ if (closed) return;
196
+ closed = true;
197
+ await stopChildren();
198
+ for (const item of prepared) if (item?.plan && !item.committed) transaction.disposePlan(item.plan);
199
+ transaction.disposePool(pool);
200
+ removeSession();
201
+ };
202
+ const prepareOne = async (index, attempt = 0) => {
203
+ const raw = await prepareInChild({ job: jobs[index], attempt, sessionRoot, poolDescriptor, workerPath, workerEnv, activeChildren, timeoutMs });
204
+ const plan = transaction.adopt(raw.detached, {
205
+ scratch: raw.scratch,
206
+ target: jobs[index].target,
207
+ inputPool: pool,
208
+ cleanup: () => fs.rmSync(raw.scratch, { recursive: true, force: true }),
209
+ });
210
+ return { ...raw, plan, committed: false };
211
+ };
212
+ try {
213
+ await Promise.all(Array.from({ length: concurrency }, async () => {
214
+ for (;;) {
215
+ const index = next++;
216
+ if (index >= jobs.length) return;
217
+ prepared[index] = await prepareOne(index);
218
+ }
219
+ }));
220
+ } catch (error) {
221
+ await cleanup();
222
+ throw error;
223
+ }
224
+ return {
225
+ get providers() { return jobs.map(job => job.provider); },
226
+ async commit(index) {
227
+ if (closed) throw new Error('Provider preparation session is closed');
228
+ if (index !== nextCommit) throw new Error(`Provider plans must commit in order: expected ${nextCommit}, received ${index}`);
229
+ let item = prepared[index];
230
+ try {
231
+ let report;
232
+ try { report = transaction.commit(item.plan); }
233
+ catch (error) {
234
+ if (!transaction.isStale(error) || item.attempt >= 1) throw error;
235
+ item = prepared[index] = await prepareOne(index, item.attempt + 1);
236
+ report = transaction.commit(item.plan);
237
+ }
238
+ item.committed = true;
239
+ nextCommit++;
240
+ return report;
241
+ } catch (error) {
242
+ throw error;
243
+ }
244
+ },
245
+ async dispose() { await cleanup(); },
246
+ };
247
+ }
@@ -0,0 +1,84 @@
1
+ #!/usr/bin/env node
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import { createHash } from 'node:crypto';
5
+ import { main as deployProvider, parseArgs } from '../deploy-agents.mjs';
6
+ import { retainPreparationChannel } from './provider-prepare-channel.mjs';
7
+ import {
8
+ importRuleDeploymentInputPool,
9
+ disposeRuleDeploymentInputPool,
10
+ installRuleDeploymentPreparationHook,
11
+ } from './rule-delivery.mjs';
12
+
13
+ function exactKeys(value, keys) {
14
+ return value && typeof value === 'object' && !Array.isArray(value) &&
15
+ JSON.stringify(Object.keys(value).sort()) === JSON.stringify([...keys].sort());
16
+ }
17
+
18
+ function validRequest(request) {
19
+ return exactKeys(request, ['version', 'type', 'capability', 'jobId', 'order', 'attempt', 'provider', 'target', 'args', 'scratch', 'inputPool']) &&
20
+ request.version === 1 && request.type === 'prepare' && /^[a-f0-9]{64}$/.test(request.capability) &&
21
+ typeof request.jobId === 'string' && Number.isSafeInteger(request.order) && request.order >= 0 &&
22
+ (request.attempt === 0 || request.attempt === 1) && typeof request.provider === 'string' && request.provider &&
23
+ typeof request.target === 'string' && path.isAbsolute(request.target) && typeof request.scratch === 'string' && path.isAbsolute(request.scratch) &&
24
+ Array.isArray(request.args) && request.args.every(value => typeof value === 'string');
25
+ }
26
+
27
+ function publish(message) {
28
+ return new Promise(resolve => {
29
+ if (!process.connected) return resolve();
30
+ process.send(message, () => resolve());
31
+ });
32
+ }
33
+
34
+ process.once('message', async request => {
35
+ retainPreparationChannel();
36
+ if (!validRequest(request)) {
37
+ await publish({ version: 1, type: 'error', capability: request?.capability || '', jobId: request?.jobId || '', error: { message: 'Invalid provider preparation request' } });
38
+ try { process.disconnect(); } catch {}
39
+ return;
40
+ }
41
+ let pool;
42
+ let clearHook = () => {};
43
+ let response;
44
+ try {
45
+ const stat = fs.lstatSync(request.scratch);
46
+ if (!stat.isDirectory() || stat.isSymbolicLink() || fs.readdirSync(request.scratch).length) throw new Error('Invalid provider preparation scratch directory');
47
+ const parsed = parseArgs(request.args);
48
+ if (parsed.provider !== request.provider || path.resolve(parsed.target) !== path.resolve(request.target)) {
49
+ throw new Error('Provider preparation request does not match its deployment arguments');
50
+ }
51
+ pool = importRuleDeploymentInputPool(request.inputPool);
52
+ let detached;
53
+ clearHook = installRuleDeploymentPreparationHook({
54
+ scratch: request.scratch,
55
+ inputPool: pool,
56
+ accept: plan => {
57
+ if (detached) throw new Error('Provider attempted more than one transactional preparation');
58
+ detached = plan;
59
+ },
60
+ });
61
+ await deployProvider(request.args);
62
+ if (!detached) throw new Error('Provider did not produce a transactional preparation plan');
63
+ if (detached.target !== path.resolve(request.target)) throw new Error('Provider preparation target mismatch');
64
+ const body = Buffer.from(JSON.stringify(detached));
65
+ const planPath = path.join(request.scratch, 'plan.json');
66
+ const fd = fs.openSync(planPath, 'wx', 0o600);
67
+ try { fs.writeFileSync(fd, body); fs.fsyncSync(fd); } finally { fs.closeSync(fd); }
68
+ response = {
69
+ version: 1,
70
+ type: 'prepared',
71
+ capability: request.capability,
72
+ jobId: request.jobId,
73
+ plan: { path: planPath, size: body.length, sha256: createHash('sha256').update(body).digest('hex') },
74
+ };
75
+ } catch (error) {
76
+ response = { version: 1, type: 'error', capability: request.capability, jobId: request.jobId,
77
+ error: { message: error instanceof Error ? error.message : String(error) } };
78
+ } finally {
79
+ clearHook();
80
+ if (pool) disposeRuleDeploymentInputPool(pool);
81
+ }
82
+ await publish(response);
83
+ try { process.disconnect(); } catch {}
84
+ });