@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
@@ -1,15 +1,82 @@
1
1
  import { createHash } from 'node:crypto';
2
- import { createReadStream } from 'node:fs';
3
2
  import { open, readFile } from 'node:fs/promises';
4
- import { createInterface } from 'node:readline';
5
- import { SessionContractError } from './contracts.js';
3
+ import { assertSessionResourceLimit, schemaIssueDetail, SessionContractError } from './contracts.js';
4
+ import { assertImportByteLimit, DEFAULT_IMPORT_BYTE_LIMITS } from './import-limits.js';
6
5
  import { authorizeSourceFile } from './policy.js';
7
6
  export const DEFAULT_READER_LIMITS = Object.freeze({
8
7
  maxRecords: 1_000_000,
9
- maxRecordBytes: 8 * 1024 * 1024,
10
- maxTotalBytes: 1024 * 1024 * 1024,
8
+ ...DEFAULT_IMPORT_BYTE_LIMITS,
11
9
  maxNestingDepth: 64,
12
10
  });
11
+ const JSONL_READ_CHUNK_BYTES = 1024 * 1024;
12
+ export async function* streamJsonLines(path, options = {}) {
13
+ const startOffset = options.start ?? 0;
14
+ if (!Number.isSafeInteger(startOffset) || startOffset < 0)
15
+ throw new RangeError('start must be a nonnegative safe integer');
16
+ if (options.end !== undefined && options.end !== Infinity
17
+ && (!Number.isSafeInteger(options.end) || options.end < 0))
18
+ throw new RangeError('end must be a nonnegative safe integer or Infinity');
19
+ if (options.end !== undefined && options.end < startOffset)
20
+ throw new RangeError('end must not precede start');
21
+ // Reuse raw storage across the full source instead of allocating a new MiB
22
+ // buffer per read. Only incomplete line fragments outlive the current read.
23
+ const storage = Buffer.allocUnsafe(JSONL_READ_CHUNK_BYTES);
24
+ const input = await open(path, 'r');
25
+ let position = startOffset;
26
+ let parts = [];
27
+ let length = 0;
28
+ let total = 0;
29
+ try {
30
+ while (options.end === undefined || position <= options.end) {
31
+ const wanted = options.end === undefined ? storage.length
32
+ : Math.min(storage.length, options.end - position + 1);
33
+ const { bytesRead } = await input.read(storage, 0, wanted, position);
34
+ if (bytesRead === 0)
35
+ break;
36
+ position += bytesRead;
37
+ const buffer = storage.subarray(0, bytesRead);
38
+ let start = 0;
39
+ while (start < buffer.length) {
40
+ const newline = buffer.indexOf(10, start);
41
+ const end = newline === -1 ? buffer.length : newline + 1;
42
+ const segment = buffer.subarray(start, end);
43
+ if (options.limits) {
44
+ const recordBytes = length + segment.length;
45
+ const totalBytes = (options.start ?? 0) + total + segment.length;
46
+ // For an incomplete segment, report the first byte known to exceed
47
+ // the limit instead of making diagnostics depend on read-buffer size.
48
+ assertImportByteLimit('maxRecordBytes', options.limits, newline === -1 && recordBytes > options.limits.maxRecordBytes
49
+ ? options.limits.maxRecordBytes + 1 : recordBytes);
50
+ assertImportByteLimit('maxTotalBytes', options.limits, newline === -1 && options.limits.maxTotalBytes !== 0 && totalBytes > options.limits.maxTotalBytes
51
+ ? options.limits.maxTotalBytes + 1 : totalBytes);
52
+ }
53
+ // Bound the raw bytes before copying or decoding a record. Only LF
54
+ // separates records; CRLF and Unicode separators remain JSON input.
55
+ parts.push(segment);
56
+ length += segment.length;
57
+ total += segment.length;
58
+ start = end;
59
+ if (newline !== -1) {
60
+ const line = (parts.length === 1 ? parts[0] : Buffer.concat(parts, length)).toString('utf8');
61
+ const byteLength = length;
62
+ parts = [];
63
+ length = 0;
64
+ yield { line, byteLength };
65
+ }
66
+ }
67
+ // Earlier fragments already own their bytes. The last fragment is the
68
+ // only view into storage, which the next read will overwrite.
69
+ if (parts.length > 0)
70
+ parts[parts.length - 1] = Buffer.from(parts[parts.length - 1]);
71
+ }
72
+ if (length > 0) {
73
+ yield { line: (parts.length === 1 ? parts[0] : Buffer.concat(parts, length)).toString('utf8'), byteLength: length };
74
+ }
75
+ }
76
+ finally {
77
+ await input.close();
78
+ }
79
+ }
13
80
  export async function readBoundedJsonLines(authorization, options) {
14
81
  const stream = await streamBoundedJsonLines(authorization, options);
15
82
  const records = [];
@@ -28,50 +95,36 @@ export async function streamBoundedJsonLines(authorization, options) {
28
95
  const limits = { ...DEFAULT_READER_LIMITS, ...options.limits };
29
96
  const start = parseCursor(options.cursor);
30
97
  if (start > allowed.size)
31
- throw new SessionContractError('SCHEMA_DRIFT', 'reader cursor is beyond source size');
98
+ throw new SessionContractError('SCHEMA_DRIFT', 'reader cursor is beyond source size', schemaIssueDetail('cursor'));
32
99
  let offset = start;
33
100
  let total = 0;
34
101
  let count = 0;
35
102
  let incompleteTail = false;
36
103
  const iterate = async function* () {
37
- const input = createReadStream(allowed.canonicalPath, { start, encoding: 'utf8' });
38
- const lines = createInterface({ input, crlfDelay: Infinity });
39
- try {
40
- for await (const line of lines) {
41
- const bytes = Buffer.byteLength(line) + 1;
42
- if (bytes > limits.maxRecordBytes || total + bytes > limits.maxTotalBytes
43
- || count + 1 > limits.maxRecords) {
44
- throw new SessionContractError('RESOURCE_LIMIT_EXCEEDED', 'bounded session reader limit exceeded');
45
- }
46
- if (line.trim() === '') {
47
- offset += bytes;
48
- total += bytes;
49
- continue;
50
- }
51
- let value;
52
- try {
53
- value = JSON.parse(line);
54
- }
55
- catch {
56
- if (options.consistency === 'provisional') {
57
- incompleteTail = true;
58
- break;
59
- }
60
- throw new SessionContractError('SCHEMA_DRIFT', 'malformed JSONL record in consistent source');
61
- }
62
- if (jsonDepth(value) > limits.maxNestingDepth) {
63
- throw new SessionContractError('RESOURCE_LIMIT_EXCEEDED', 'JSON nesting depth exceeds reader limit');
64
- }
65
- const record = { value, sequence: count, byteOffset: offset, byteLength: bytes };
66
- count += 1;
104
+ for await (const { line, byteLength: bytes } of streamJsonLines(allowed.canonicalPath, { start, limits })) {
105
+ assertSessionResourceLimit('maxRecords', limits.maxRecords, count + 1);
106
+ if (line.trim() === '') {
67
107
  offset += bytes;
68
108
  total += bytes;
69
- yield record;
109
+ continue;
70
110
  }
71
- }
72
- finally {
73
- lines.close();
74
- input.destroy();
111
+ let value;
112
+ try {
113
+ value = JSON.parse(line);
114
+ }
115
+ catch {
116
+ if (options.consistency === 'provisional') {
117
+ incompleteTail = true;
118
+ break;
119
+ }
120
+ throw new SessionContractError('SCHEMA_DRIFT', 'malformed JSONL record in consistent source', schemaIssueDetail('<root>', 'invalid_json'));
121
+ }
122
+ assertSessionResourceLimit('maxNestingDepth', limits.maxNestingDepth, jsonDepth(value));
123
+ const record = { value, sequence: count, byteOffset: offset, byteLength: bytes };
124
+ count += 1;
125
+ offset += bytes;
126
+ total += bytes;
127
+ yield record;
75
128
  }
76
129
  };
77
130
  return {
@@ -83,30 +136,30 @@ export async function streamBoundedJsonLines(authorization, options) {
83
136
  [Symbol.asyncIterator]: iterate,
84
137
  };
85
138
  }
139
+ // Single-document JSON and text exports cannot be incrementally normalized.
140
+ export const MAX_BUFFERED_SOURCE_BYTES = 64 * 1024 * 1024;
86
141
  export async function readBoundedJson(authorization, limitsInput) {
87
142
  const allowed = await authorizeSourceFile(authorization);
88
143
  const limits = { ...DEFAULT_READER_LIMITS, ...limitsInput };
89
- if (allowed.size > limits.maxTotalBytes || allowed.size > limits.maxRecordBytes) {
90
- throw new SessionContractError('RESOURCE_LIMIT_EXCEEDED', 'bounded JSON source limit exceeded');
91
- }
144
+ assertImportByteLimit('maxTotalBytes', limits, allowed.size);
145
+ assertImportByteLimit('maxRecordBytes', limits, allowed.size);
146
+ assertSessionResourceLimit('maxBufferedSourceBytes', MAX_BUFFERED_SOURCE_BYTES, allowed.size);
92
147
  let value;
93
148
  try {
94
149
  value = JSON.parse(await readFile(allowed.canonicalPath, 'utf8'));
95
150
  }
96
151
  catch {
97
- throw new SessionContractError('SCHEMA_DRIFT', 'malformed JSON source');
98
- }
99
- if (jsonDepth(value) > limits.maxNestingDepth) {
100
- throw new SessionContractError('RESOURCE_LIMIT_EXCEEDED', 'JSON nesting depth exceeds reader limit');
152
+ throw new SessionContractError('SCHEMA_DRIFT', 'malformed JSON source', schemaIssueDetail('<root>', 'invalid_json'));
101
153
  }
154
+ assertSessionResourceLimit('maxNestingDepth', limits.maxNestingDepth, jsonDepth(value));
102
155
  return { value, bytesRead: allowed.size };
103
156
  }
104
157
  export async function readBoundedText(authorization, limitsInput) {
105
158
  const allowed = await authorizeSourceFile(authorization);
106
159
  const limits = { ...DEFAULT_READER_LIMITS, ...limitsInput };
107
- if (allowed.size > limits.maxTotalBytes || allowed.size > limits.maxRecordBytes) {
108
- throw new SessionContractError('RESOURCE_LIMIT_EXCEEDED', 'bounded text source limit exceeded');
109
- }
160
+ assertImportByteLimit('maxTotalBytes', limits, allowed.size);
161
+ assertImportByteLimit('maxRecordBytes', limits, allowed.size);
162
+ assertSessionResourceLimit('maxBufferedSourceBytes', MAX_BUFFERED_SOURCE_BYTES, allowed.size);
110
163
  return {
111
164
  value: await readFile(allowed.canonicalPath, 'utf8'),
112
165
  bytesRead: allowed.size,
@@ -136,7 +189,7 @@ export async function fingerprintSourcePrefix(authorization, length, skipPrefixB
136
189
  const allowed = await authorizeSourceFile(authorization);
137
190
  if (!Number.isSafeInteger(length) || length < 0 || length > allowed.size
138
191
  || !Number.isSafeInteger(skipPrefixBytes) || skipPrefixBytes < 0 || skipPrefixBytes > allowed.size) {
139
- throw new SessionContractError('SCHEMA_DRIFT', 'checkpoint source position is beyond the current source size');
192
+ throw new SessionContractError('SCHEMA_DRIFT', 'checkpoint source position is beyond the current source size', schemaIssueDetail('cursor'));
140
193
  }
141
194
  const handle = await open(allowed.canonicalPath, 'r');
142
195
  const hash = createHash('sha256');
@@ -165,7 +218,7 @@ function parseCursor(cursor) {
165
218
  if (cursor === undefined || cursor === '')
166
219
  return 0;
167
220
  if (!/^\d+$/.test(cursor))
168
- throw new SessionContractError('SCHEMA_DRIFT', 'invalid reader cursor');
221
+ throw new SessionContractError('SCHEMA_DRIFT', 'invalid reader cursor', schemaIssueDetail('cursor'));
169
222
  return Number(cursor);
170
223
  }
171
224
  function jsonDepth(value, depth = 0) {
@@ -0,0 +1,106 @@
1
+ import { existsSync, realpathSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { requireFeaturePackage } from '../features/runtime.js';
4
+ import { readAiwgConfig } from '../config/aiwg-config.js';
5
+ import { createSessionAdapterRegistry } from './adapter-registry.js';
6
+ import { resolveImportExclusions } from './import-exclusions.js';
7
+ import { resolveImportLimits } from './import-limits.js';
8
+ import { acquireImportLease } from './import-lease.js';
9
+ import { SessionRepository } from './repository.js';
10
+ import { importDiscoveryManifest } from './batch-import.js';
11
+ import { defaultDiscoveryManifestPath, discoverWorkspaceHistories, readDiscoveryManifest, writeDiscoveryManifest, } from './workspace-discovery.js';
12
+ export function sessionRefreshAvailable() {
13
+ try {
14
+ const Database = requireFeaturePackage('better-sqlite3');
15
+ const probe = new Database(':memory:');
16
+ probe.close();
17
+ return true;
18
+ }
19
+ catch {
20
+ return false;
21
+ }
22
+ }
23
+ /** Refresh an existing catalog without inferring or granting provider access. */
24
+ export async function refreshSessionCatalog(workspace, full, waitMs, signal, workspaceAliases = [], flags = {}) {
25
+ const canonicalWorkspace = realpathSync(workspace);
26
+ const config = await readAiwgConfig(canonicalWorkspace);
27
+ const limits = resolveImportLimits(config?.sessions?.import, flags);
28
+ const exclude = resolveImportExclusions(config?.sessions?.import, flags.exclude);
29
+ const database = path.join(workspace, '.aiwg/sessions/catalog.sqlite');
30
+ const manifests = [];
31
+ if (!full) {
32
+ const paths = new Set([
33
+ defaultDiscoveryManifestPath(canonicalWorkspace),
34
+ ...(config?.sessions?.discovery_manifests ?? []).map(file => path.resolve(canonicalWorkspace, file)),
35
+ ]);
36
+ let found = false;
37
+ for (const manifestPath of paths) {
38
+ if (!existsSync(manifestPath))
39
+ continue;
40
+ const previous = await readDiscoveryManifest(manifestPath);
41
+ if (previous.workspaceId !== canonicalWorkspace)
42
+ throw new Error('discovery manifest workspace mismatch');
43
+ found = true;
44
+ const authorizedRoots = previous.authorizedRoots ?? {};
45
+ if (!previous.authorizedRoots) {
46
+ for (const source of previous.sources) {
47
+ const roots = authorizedRoots[source.provider] ??= [];
48
+ if (!roots.includes(source.authorizedRoot))
49
+ roots.push(source.authorizedRoot);
50
+ }
51
+ }
52
+ const providers = Object.keys(authorizedRoots)
53
+ .filter(provider => authorizedRoots[provider]?.length);
54
+ if (!providers.length)
55
+ continue;
56
+ const manifest = await discoverWorkspaceHistories({
57
+ workspace: canonicalWorkspace,
58
+ workspaceAliases: [workspace, ...workspaceAliases],
59
+ expectedProviders: providers,
60
+ authorizedRoots,
61
+ registry: createSessionAdapterRegistry(limits),
62
+ exclude,
63
+ knownSources: previous.sources,
64
+ });
65
+ manifests.push({ path: manifestPath, manifest });
66
+ }
67
+ if (!found)
68
+ return 'no authorized discovery manifest';
69
+ if (!manifests.length)
70
+ return 'no authorized provider roots';
71
+ }
72
+ const lease = await acquireImportLease(database, `index-refresh-${process.pid}`, { waitMs });
73
+ try {
74
+ const repository = new SessionRepository(database);
75
+ try {
76
+ if (full)
77
+ repository.reindex();
78
+ else {
79
+ const receipts = [];
80
+ for (const entry of manifests) {
81
+ const prior = repository.getBatchImportRunForManifest(entry.manifest.manifestId, canonicalWorkspace);
82
+ if (prior?.status === 'complete')
83
+ continue;
84
+ // Persist the exact discovered batch before its confirmed import.
85
+ await writeDiscoveryManifest(entry.path, entry.manifest);
86
+ const receipt = await importDiscoveryManifest({ manifest: entry.manifest, repository, signal, limits, exclude });
87
+ if (receipt.totals.pending) {
88
+ throw new Error(`session import incomplete: ${receipt.totals.rejected} rejected, ${receipt.totals.pending} pending`);
89
+ }
90
+ receipts.push(receipt);
91
+ }
92
+ if (!receipts.length)
93
+ return 'unchanged';
94
+ return receipts.length === 1 ? receipts[0] : receipts;
95
+ }
96
+ }
97
+ finally {
98
+ repository.close();
99
+ }
100
+ }
101
+ finally {
102
+ await lease.release();
103
+ }
104
+ return undefined;
105
+ }
106
+ //# sourceMappingURL=refresh.js.map