@simulatte/doppler 0.1.5 → 0.1.7

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 (392) hide show
  1. package/CHANGELOG.md +126 -0
  2. package/README.md +25 -17
  3. package/package.json +20 -4
  4. package/src/adapters/adapter-registry.js +12 -1
  5. package/src/adapters/lora-loader.js +23 -6
  6. package/src/bridge/extension-client.d.ts +5 -0
  7. package/src/bridge/extension-client.js +40 -0
  8. package/src/bridge/index.d.ts +2 -1
  9. package/src/bridge/index.js +6 -4
  10. package/src/browser/browser-converter.js +26 -1
  11. package/src/browser/file-picker.js +6 -0
  12. package/src/browser/safetensors-parser-browser.js +84 -1
  13. package/src/browser/shard-io-browser.js +2 -2
  14. package/src/browser/tensor-source-download.js +8 -2
  15. package/src/browser/tensor-source-http.d.ts +1 -0
  16. package/src/browser/tensor-source-http.js +5 -1
  17. package/src/client/doppler-api.browser.js +20 -4
  18. package/src/client/doppler-api.js +19 -3
  19. package/src/client/doppler-provider/generation.js +12 -0
  20. package/src/client/doppler-provider/model-manager.d.ts +10 -0
  21. package/src/client/doppler-provider/model-manager.js +91 -19
  22. package/src/client/doppler-provider/source-runtime.d.ts +2 -1
  23. package/src/client/doppler-provider/source-runtime.js +132 -13
  24. package/src/client/doppler-registry.json +8 -7
  25. package/src/config/backward-registry-loader.js +17 -2
  26. package/src/config/execution-v0-contract-check.js +113 -15
  27. package/src/config/kernel-path-contract-check.js +57 -29
  28. package/src/config/kernel-path-loader.js +5 -36
  29. package/src/config/kernels/kernel-ref-digests.js +39 -39
  30. package/src/config/kernels/registry.js +14 -1
  31. package/src/config/kernels/registry.json +49 -7
  32. package/src/config/loader.d.ts +1 -1
  33. package/src/config/loader.js +43 -4
  34. package/src/config/merge-contract-check.js +59 -4
  35. package/src/config/merge-helpers.js +128 -7
  36. package/src/config/merge.d.ts +1 -0
  37. package/src/config/merge.js +28 -0
  38. package/src/config/param-validator.js +47 -2
  39. package/src/config/presets/kernel-paths/{gemma2-q4k-dequant-f32a.json → gemma2-q4k-dequant-f32a-nosubgroups.json} +3 -3
  40. package/src/config/presets/kernel-paths/gemma3-f16-fused-f32a-online-streamingprefill.json +223 -0
  41. package/src/config/presets/kernel-paths/{gemma3-q4k-dequant-f32a.json → gemma3-q4k-dequant-f32a-nosubgroups.json} +3 -3
  42. package/src/config/presets/kernel-paths/registry.json +29 -8
  43. package/src/config/presets/models/gemma2.json +2 -2
  44. package/src/config/presets/models/qwen3.json +9 -2
  45. package/src/config/presets/models/transformer.json +5 -0
  46. package/src/config/presets/runtime/experiments/bench/gemma3-bench-q4k.json +1 -1
  47. package/src/config/presets/runtime/experiments/debug/gemma3-debug-q4k.json +1 -1
  48. package/src/config/presets/runtime/experiments/verify/gemma3-verify.json +1 -1
  49. package/src/config/presets/runtime/kernels/dequant-f16-q4k.json +6 -13
  50. package/src/config/presets/runtime/kernels/dequant-f32-q4k.json +6 -13
  51. package/src/config/presets/runtime/kernels/embeddinggemma-q4k-dequant-f32a.json +37 -0
  52. package/src/config/presets/runtime/kernels/fused-q4k.json +6 -13
  53. package/src/config/presets/runtime/kernels/gemma2-q4k-dequant-f16a.json +33 -0
  54. package/src/config/presets/runtime/kernels/gemma2-q4k-dequant-f32a-nosubgroups.json +33 -0
  55. package/src/config/presets/runtime/kernels/gemma2-q4k-fused-f32a.json +33 -0
  56. package/src/config/presets/runtime/kernels/safe-q4k.json +6 -13
  57. package/src/config/presets/runtime/platform/metal-apple-q4k.json +1 -1
  58. package/src/config/required-inference-fields-contract-check.js +6 -0
  59. package/src/config/runtime.js +6 -1
  60. package/src/config/schema/debug.schema.d.ts +5 -0
  61. package/src/config/schema/doppler.schema.js +16 -21
  62. package/src/config/schema/inference-defaults.schema.js +6 -3
  63. package/src/config/schema/inference.schema.d.ts +9 -0
  64. package/src/config/schema/kernel-path.schema.d.ts +11 -1
  65. package/src/config/schema/kernel-thresholds.schema.js +12 -4
  66. package/src/config/schema/manifest.schema.d.ts +8 -1
  67. package/src/config/schema/manifest.schema.js +19 -3
  68. package/src/config/training-defaults.js +30 -22
  69. package/src/converter/conversion-plan.js +94 -9
  70. package/src/converter/core.d.ts +7 -0
  71. package/src/converter/core.js +14 -9
  72. package/src/converter/execution-v0-manifest.js +4 -1
  73. package/src/converter/index.d.ts +1 -0
  74. package/src/converter/index.js +1 -0
  75. package/src/converter/manifest-inference.js +43 -12
  76. package/src/converter/parsers/diffusion.js +0 -3
  77. package/src/converter/quantization-info.js +35 -15
  78. package/src/converter/rope-config.js +42 -0
  79. package/src/converter/shard-packer.d.ts +1 -1
  80. package/src/converter/shard-packer.js +4 -1
  81. package/src/debug/config.js +123 -11
  82. package/src/debug/signals.js +7 -1
  83. package/src/debug/tensor.d.ts +2 -0
  84. package/src/debug/tensor.js +13 -2
  85. package/src/distribution/p2p-control-plane.js +52 -12
  86. package/src/distribution/p2p-observability.js +43 -7
  87. package/src/distribution/p2p-webrtc-browser.js +20 -0
  88. package/src/distribution/shard-delivery.js +77 -26
  89. package/src/formats/gguf/types.js +33 -16
  90. package/src/formats/rdrr/groups.d.ts +12 -4
  91. package/src/formats/rdrr/groups.js +3 -6
  92. package/src/formats/rdrr/parsing.js +39 -2
  93. package/src/formats/rdrr/types.d.ts +2 -1
  94. package/src/gpu/command-recorder.js +86 -61
  95. package/src/gpu/device.d.ts +1 -0
  96. package/src/gpu/device.js +131 -19
  97. package/src/gpu/kernel-tuner/benchmarks.js +326 -316
  98. package/src/gpu/kernel-tuner/cache.js +71 -4
  99. package/src/gpu/kernel-tuner/tuner.js +22 -4
  100. package/src/gpu/kernels/attention.js +113 -34
  101. package/src/gpu/kernels/backward/adam.js +62 -58
  102. package/src/gpu/kernels/backward/attention_backward.js +257 -169
  103. package/src/gpu/kernels/backward/conv2d_backward.js +14 -1
  104. package/src/gpu/kernels/bias_add.wgsl +8 -6
  105. package/src/gpu/kernels/bias_add_f16.wgsl +8 -5
  106. package/src/gpu/kernels/cast.js +191 -149
  107. package/src/gpu/kernels/check-stop.js +33 -44
  108. package/src/gpu/kernels/conv2d.js +27 -17
  109. package/src/gpu/kernels/conv2d.wgsl +7 -8
  110. package/src/gpu/kernels/conv2d_f16.wgsl +7 -8
  111. package/src/gpu/kernels/cross_entropy_loss.js +21 -15
  112. package/src/gpu/kernels/depthwise_conv2d.js +37 -26
  113. package/src/gpu/kernels/depthwise_conv2d.wgsl +6 -9
  114. package/src/gpu/kernels/depthwise_conv2d_f16.wgsl +6 -9
  115. package/src/gpu/kernels/dequant.js +178 -126
  116. package/src/gpu/kernels/energy.d.ts +3 -21
  117. package/src/gpu/kernels/energy.js +111 -88
  118. package/src/gpu/kernels/feature-check.js +1 -1
  119. package/src/gpu/kernels/fused_ffn.js +84 -65
  120. package/src/gpu/kernels/fused_matmul_residual.js +56 -33
  121. package/src/gpu/kernels/fused_matmul_rmsnorm.js +62 -45
  122. package/src/gpu/kernels/gather.js +33 -15
  123. package/src/gpu/kernels/gelu.js +19 -11
  124. package/src/gpu/kernels/grouped_pointwise_conv2d.js +34 -23
  125. package/src/gpu/kernels/grouped_pointwise_conv2d.wgsl +6 -9
  126. package/src/gpu/kernels/grouped_pointwise_conv2d_f16.wgsl +6 -9
  127. package/src/gpu/kernels/groupnorm.js +34 -23
  128. package/src/gpu/kernels/kv-quantize.js +5 -2
  129. package/src/gpu/kernels/layernorm.js +35 -19
  130. package/src/gpu/kernels/logit-merge.js +5 -3
  131. package/src/gpu/kernels/matmul.js +83 -39
  132. package/src/gpu/kernels/modulate.js +23 -15
  133. package/src/gpu/kernels/moe.js +221 -175
  134. package/src/gpu/kernels/pixel_shuffle.js +22 -14
  135. package/src/gpu/kernels/pixel_shuffle.wgsl +4 -5
  136. package/src/gpu/kernels/pixel_shuffle_f16.wgsl +4 -5
  137. package/src/gpu/kernels/relu.js +31 -10
  138. package/src/gpu/kernels/relu.wgsl +2 -1
  139. package/src/gpu/kernels/relu_f16.wgsl +2 -1
  140. package/src/gpu/kernels/repeat_channels.js +25 -17
  141. package/src/gpu/kernels/repeat_channels.wgsl +4 -5
  142. package/src/gpu/kernels/repeat_channels_f16.wgsl +4 -5
  143. package/src/gpu/kernels/residual.js +69 -23
  144. package/src/gpu/kernels/residual.wgsl +6 -3
  145. package/src/gpu/kernels/residual_f16.wgsl +2 -1
  146. package/src/gpu/kernels/residual_f16_vec4.wgsl +2 -1
  147. package/src/gpu/kernels/residual_vec4.wgsl +2 -1
  148. package/src/gpu/kernels/rmsnorm.js +96 -28
  149. package/src/gpu/kernels/rmsnorm.wgsl +14 -6
  150. package/src/gpu/kernels/rmsnorm_f16.wgsl +10 -2
  151. package/src/gpu/kernels/rope.d.ts +2 -0
  152. package/src/gpu/kernels/rope.js +14 -1
  153. package/src/gpu/kernels/rope.wgsl +56 -40
  154. package/src/gpu/kernels/sample.js +27 -38
  155. package/src/gpu/kernels/sana_linear_attention.js +19 -12
  156. package/src/gpu/kernels/sana_linear_attention_apply.wgsl +4 -5
  157. package/src/gpu/kernels/sana_linear_attention_apply_f16.wgsl +4 -5
  158. package/src/gpu/kernels/sana_linear_attention_summary.wgsl +4 -0
  159. package/src/gpu/kernels/sana_linear_attention_summary_f16.wgsl +4 -0
  160. package/src/gpu/kernels/scale.js +18 -11
  161. package/src/gpu/kernels/shader-cache.js +4 -2
  162. package/src/gpu/kernels/silu.d.ts +1 -0
  163. package/src/gpu/kernels/silu.js +148 -82
  164. package/src/gpu/kernels/silu.wgsl +19 -9
  165. package/src/gpu/kernels/silu_f16.wgsl +19 -9
  166. package/src/gpu/kernels/softmax.js +44 -25
  167. package/src/gpu/kernels/split_qkv.js +23 -13
  168. package/src/gpu/kernels/transpose.js +31 -10
  169. package/src/gpu/kernels/transpose.wgsl +6 -5
  170. package/src/gpu/kernels/upsample2d.js +22 -13
  171. package/src/gpu/kernels/upsample2d.wgsl +6 -9
  172. package/src/gpu/kernels/upsample2d_f16.wgsl +6 -9
  173. package/src/gpu/kernels/utils.js +35 -13
  174. package/src/gpu/partitioned-buffer-pool.js +10 -2
  175. package/src/gpu/perf-guards.js +2 -9
  176. package/src/gpu/profiler.js +27 -22
  177. package/src/gpu/readback-utils.d.ts +16 -0
  178. package/src/gpu/readback-utils.js +41 -0
  179. package/src/gpu/submit-tracker.js +13 -0
  180. package/src/gpu/uniform-cache.d.ts +1 -0
  181. package/src/gpu/uniform-cache.js +30 -9
  182. package/src/hotswap/intent-bundle.js +6 -0
  183. package/src/hotswap/manifest.d.ts +10 -1
  184. package/src/hotswap/manifest.js +12 -2
  185. package/src/hotswap/runtime.js +30 -8
  186. package/src/index-browser.d.ts +44 -0
  187. package/src/index-browser.js +14 -0
  188. package/src/inference/browser-harness-contract-helpers.d.ts +5 -0
  189. package/src/inference/browser-harness-contract-helpers.js +28 -0
  190. package/src/inference/browser-harness-diffusion-energy-suites.d.ts +2 -0
  191. package/src/inference/browser-harness-diffusion-energy-suites.js +269 -0
  192. package/src/inference/browser-harness-model-helpers.d.ts +16 -0
  193. package/src/inference/browser-harness-model-helpers.js +217 -0
  194. package/src/inference/browser-harness-report-helpers.d.ts +7 -0
  195. package/src/inference/browser-harness-report-helpers.js +42 -0
  196. package/src/inference/browser-harness-runtime-helpers.d.ts +61 -0
  197. package/src/inference/browser-harness-runtime-helpers.js +415 -0
  198. package/src/inference/browser-harness-suite-helpers.d.ts +28 -0
  199. package/src/inference/browser-harness-suite-helpers.js +268 -0
  200. package/src/inference/browser-harness-text-helpers.d.ts +27 -0
  201. package/src/inference/browser-harness-text-helpers.js +788 -0
  202. package/src/inference/browser-harness.d.ts +6 -0
  203. package/src/inference/browser-harness.js +130 -1950
  204. package/src/inference/kv-cache/base.js +140 -94
  205. package/src/inference/kv-cache/tiered.js +5 -3
  206. package/src/inference/moe-router.js +88 -56
  207. package/src/inference/multi-model-network.js +5 -3
  208. package/src/inference/network-evolution.d.ts +11 -2
  209. package/src/inference/network-evolution.js +20 -21
  210. package/src/inference/pipelines/context.d.ts +3 -0
  211. package/src/inference/pipelines/context.js +142 -2
  212. package/src/inference/pipelines/diffusion/helpers.js +7 -2
  213. package/src/inference/pipelines/diffusion/pipeline.js +17 -7
  214. package/src/inference/pipelines/diffusion/sd3-transformer.js +10 -10
  215. package/src/inference/pipelines/diffusion/text-encoder-gpu.d.ts +5 -0
  216. package/src/inference/pipelines/diffusion/text-encoder-gpu.js +27 -15
  217. package/src/inference/pipelines/diffusion/vae.js +3 -7
  218. package/src/inference/pipelines/energy/pipeline.js +27 -21
  219. package/src/inference/pipelines/energy/quintel.d.ts +5 -0
  220. package/src/inference/pipelines/energy/quintel.js +11 -0
  221. package/src/inference/pipelines/energy-head/row-head-pipeline.js +17 -13
  222. package/src/inference/pipelines/structured/json-head-pipeline.js +26 -11
  223. package/src/inference/pipelines/text/attention/projections.js +151 -101
  224. package/src/inference/pipelines/text/attention/record.js +73 -10
  225. package/src/inference/pipelines/text/attention/run.js +73 -10
  226. package/src/inference/pipelines/text/chat-format.js +25 -1
  227. package/src/inference/pipelines/text/config.d.ts +4 -0
  228. package/src/inference/pipelines/text/config.js +71 -5
  229. package/src/inference/pipelines/text/embed.js +2 -8
  230. package/src/inference/pipelines/text/execution-plan.js +64 -50
  231. package/src/inference/pipelines/text/execution-v0-contract-helpers.d.ts +59 -0
  232. package/src/inference/pipelines/text/execution-v0-contract-helpers.js +937 -0
  233. package/src/inference/pipelines/text/execution-v0-runtime-builders.d.ts +15 -0
  234. package/src/inference/pipelines/text/execution-v0-runtime-builders.js +279 -0
  235. package/src/inference/pipelines/text/execution-v0.js +78 -1002
  236. package/src/inference/pipelines/text/ffn/standard.js +3 -0
  237. package/src/inference/pipelines/text/generator-steps.d.ts +46 -0
  238. package/src/inference/pipelines/text/generator-steps.js +298 -207
  239. package/src/inference/pipelines/text/generator.js +6 -23
  240. package/src/inference/pipelines/text/init.d.ts +4 -0
  241. package/src/inference/pipelines/text/init.js +134 -29
  242. package/src/inference/pipelines/text/kernel-path-auto-select.js +2 -0
  243. package/src/inference/pipelines/text/kernel-trace.d.ts +2 -0
  244. package/src/inference/pipelines/text/kernel-trace.js +6 -0
  245. package/src/inference/pipelines/text/layer.js +14 -9
  246. package/src/inference/pipelines/text/linear-attention.d.ts +10 -0
  247. package/src/inference/pipelines/text/linear-attention.js +80 -6
  248. package/src/inference/pipelines/text/logits/gpu.js +10 -5
  249. package/src/inference/pipelines/text/logits/index.js +10 -11
  250. package/src/inference/pipelines/text/logits/utils.d.ts +7 -0
  251. package/src/inference/pipelines/text/logits/utils.js +9 -0
  252. package/src/inference/pipelines/text/lora-apply.js +50 -32
  253. package/src/inference/pipelines/text/model-load.js +279 -104
  254. package/src/inference/pipelines/text/moe-cache.js +5 -4
  255. package/src/inference/pipelines/text/moe-cpu-gptoss.js +74 -69
  256. package/src/inference/pipelines/text/moe-cpu.js +42 -38
  257. package/src/inference/pipelines/text/moe-gpu.js +110 -86
  258. package/src/inference/pipelines/text/ops.js +90 -90
  259. package/src/inference/pipelines/text/probes.js +9 -9
  260. package/src/inference/pipelines/text/weights.js +17 -7
  261. package/src/inference/pipelines/text.js +17 -1
  262. package/src/inference/speculative.d.ts +2 -2
  263. package/src/inference/speculative.js +4 -18
  264. package/src/inference/test-harness.d.ts +1 -1
  265. package/src/inference/test-harness.js +15 -5
  266. package/src/inference/tokenizer.d.ts +0 -5
  267. package/src/inference/tokenizer.js +4 -23
  268. package/src/inference/tokenizers/bpe.js +9 -0
  269. package/src/inference/tokenizers/bundled.js +176 -33
  270. package/src/inference/tokenizers/sentencepiece.js +12 -0
  271. package/src/loader/doppler-loader.js +38 -22
  272. package/src/loader/dtype-utils.js +3 -44
  273. package/src/loader/embedding-loader.js +7 -3
  274. package/src/loader/experts/expert-cache.js +13 -6
  275. package/src/loader/experts/expert-loader.js +10 -6
  276. package/src/loader/final-weights-loader.js +8 -4
  277. package/src/loader/layer-loader.js +2 -1
  278. package/src/loader/loader-state.js +2 -2
  279. package/src/loader/memory-monitor.js +8 -0
  280. package/src/loader/multi-model-loader.d.ts +14 -0
  281. package/src/loader/multi-model-loader.js +70 -24
  282. package/src/loader/shard-cache.js +81 -12
  283. package/src/loader/shard-resolver.js +25 -3
  284. package/src/loader/tensors/tensor-loader.js +209 -144
  285. package/src/loader/tensors/tensor-reader.js +76 -19
  286. package/src/loader/weight-downcast.js +1 -1
  287. package/src/memory/buffer-pool.d.ts +9 -1
  288. package/src/memory/buffer-pool.js +109 -44
  289. package/src/memory/unified-detect.js +1 -1
  290. package/src/rules/inference/kernel-path.rules.json +24 -8
  291. package/src/rules/rule-registry.js +25 -1
  292. package/src/rules/tooling/command-runtime.rules.json +18 -0
  293. package/src/storage/backends/opfs-store.js +68 -24
  294. package/src/storage/downloader.js +364 -83
  295. package/src/storage/index.d.ts +3 -0
  296. package/src/storage/index.js +3 -0
  297. package/src/storage/preflight.d.ts +2 -2
  298. package/src/storage/preflight.js +24 -2
  299. package/src/storage/quickstart-downloader.js +11 -5
  300. package/src/storage/registry.js +10 -4
  301. package/src/storage/reports.js +1 -1
  302. package/src/storage/shard-manager.d.ts +15 -1
  303. package/src/storage/shard-manager.js +51 -3
  304. package/src/storage/source-artifact-store.d.ts +52 -0
  305. package/src/storage/source-artifact-store.js +234 -0
  306. package/src/tooling/command-api-constants.d.ts +9 -0
  307. package/src/tooling/command-api-constants.js +9 -0
  308. package/src/tooling/command-api-family-normalizers.d.ts +9 -0
  309. package/src/tooling/command-api-family-normalizers.js +343 -0
  310. package/src/tooling/command-api-helpers.d.ts +25 -0
  311. package/src/tooling/command-api-helpers.js +262 -0
  312. package/src/tooling/command-api.d.ts +27 -1
  313. package/src/tooling/command-api.js +26 -473
  314. package/src/tooling/command-envelope.js +4 -1
  315. package/src/tooling/command-runner-shared.js +52 -18
  316. package/src/tooling/lean-execution-contract.js +150 -3
  317. package/src/tooling/node-browser-command-runner.d.ts +4 -0
  318. package/src/tooling/node-browser-command-runner.js +218 -273
  319. package/src/tooling/node-command-runner.js +44 -3
  320. package/src/tooling/node-converter.js +27 -1
  321. package/src/tooling/node-source-runtime.d.ts +1 -1
  322. package/src/tooling/node-source-runtime.js +84 -3
  323. package/src/tooling/node-webgpu.js +30 -105
  324. package/src/tooling/opfs-cache.js +21 -4
  325. package/src/tooling/runtime-input-composition.d.ts +38 -0
  326. package/src/tooling/runtime-input-composition.js +86 -0
  327. package/src/tooling/source-runtime-bundle.d.ts +40 -5
  328. package/src/tooling/source-runtime-bundle.js +261 -34
  329. package/src/tooling/source-runtime-materializer.d.ts +6 -0
  330. package/src/tooling/source-runtime-materializer.js +93 -0
  331. package/src/training/attention-backward.js +32 -17
  332. package/src/training/autograd.js +80 -52
  333. package/src/training/checkpoint-watch.d.ts +8 -0
  334. package/src/training/checkpoint-watch.js +139 -0
  335. package/src/training/checkpoint.d.ts +6 -1
  336. package/src/training/checkpoint.js +46 -7
  337. package/src/training/clip.js +2 -1
  338. package/src/training/datasets/token-batch.js +20 -8
  339. package/src/training/distillation/artifacts.d.ts +71 -0
  340. package/src/training/distillation/artifacts.js +132 -0
  341. package/src/training/distillation/checkpoint-watch.d.ts +10 -0
  342. package/src/training/distillation/checkpoint-watch.js +58 -0
  343. package/src/training/distillation/dataset.d.ts +59 -0
  344. package/src/training/distillation/dataset.js +337 -0
  345. package/src/training/distillation/eval.d.ts +34 -0
  346. package/src/training/distillation/eval.js +310 -0
  347. package/src/training/distillation/index.d.ts +29 -0
  348. package/src/training/distillation/index.js +29 -0
  349. package/src/training/distillation/runtime.d.ts +20 -0
  350. package/src/training/distillation/runtime.js +121 -0
  351. package/src/training/distillation/scoreboard.d.ts +6 -0
  352. package/src/training/distillation/scoreboard.js +8 -0
  353. package/src/training/distillation/stage-a.d.ts +45 -0
  354. package/src/training/distillation/stage-a.js +338 -0
  355. package/src/training/distillation/stage-b.d.ts +24 -0
  356. package/src/training/distillation/stage-b.js +20 -0
  357. package/src/training/distillation/student-fixture.d.ts +22 -0
  358. package/src/training/distillation/student-fixture.js +846 -0
  359. package/src/training/distillation/suite-data.d.ts +45 -0
  360. package/src/training/distillation/suite-data.js +189 -0
  361. package/src/training/index.d.ts +10 -0
  362. package/src/training/index.js +10 -0
  363. package/src/training/lora-pipeline.d.ts +40 -0
  364. package/src/training/lora-pipeline.js +793 -0
  365. package/src/training/lora.js +26 -12
  366. package/src/training/loss.js +5 -6
  367. package/src/training/objectives/cross_entropy.js +2 -5
  368. package/src/training/objectives/distill_kd.js +4 -8
  369. package/src/training/objectives/distill_triplet.js +4 -8
  370. package/src/training/objectives/ul_stage2_base.js +4 -8
  371. package/src/training/operator-artifacts.d.ts +62 -0
  372. package/src/training/operator-artifacts.js +140 -0
  373. package/src/training/operator-command.d.ts +5 -0
  374. package/src/training/operator-command.js +455 -0
  375. package/src/training/operator-eval.d.ts +48 -0
  376. package/src/training/operator-eval.js +230 -0
  377. package/src/training/operator-scoreboard.d.ts +5 -0
  378. package/src/training/operator-scoreboard.js +44 -0
  379. package/src/training/optimizer.js +19 -7
  380. package/src/training/runner.d.ts +52 -0
  381. package/src/training/runner.js +31 -5
  382. package/src/training/suite.d.ts +112 -0
  383. package/src/training/suite.js +24 -984
  384. package/src/training/tensor-factory.d.ts +9 -0
  385. package/src/training/tensor-factory.js +13 -0
  386. package/src/training/trainer.js +3 -5
  387. package/src/training/ul_dataset.js +3 -5
  388. package/src/training/workloads.d.ts +164 -0
  389. package/src/training/workloads.js +530 -0
  390. package/src/version.js +1 -1
  391. package/tools/convert-safetensors-node.js +22 -16
  392. package/tools/doppler-cli.js +179 -63
@@ -1,13 +1,20 @@
1
1
  import { isPlainObject } from '../utils/plain-object.js';
2
- import { selectRuleValue } from '../rules/rule-registry.js';
3
-
4
- const TOOLING_COMMAND_SET = ['convert', 'debug', 'bench', 'verify'];
5
- const TOOLING_SURFACE_SET = ['browser', 'node'];
6
- const TOOLING_SUITE_SET = ['kernels', 'inference', 'training', 'bench', 'debug', 'diffusion', 'energy'];
7
- const TOOLING_INTENT_SET = ['verify', 'investigate', 'calibrate'];
8
- const VERIFY_SUITES = ['kernels', 'inference', 'training', 'diffusion', 'energy'];
9
- const TRAINING_STAGE_SET = ['stage1_joint', 'stage2_base', 'stage_a', 'stage_b'];
10
- const TRAINING_COMMAND_SCHEMA_VERSION = 1;
2
+ import {
3
+ TOOLING_COMMAND_SET,
4
+ TOOLING_SURFACE_SET,
5
+ TOOLING_SUITE_SET,
6
+ VERIFY_SUITES,
7
+ TRAINING_COMMAND_SCHEMA_VERSION,
8
+ } from './command-api-constants.js';
9
+ import {
10
+ asOptionalString,
11
+ assertCommand,
12
+ } from './command-api-helpers.js';
13
+ import {
14
+ normalizeConvert,
15
+ normalizeTrainingOperatorCommand,
16
+ normalizeSuiteCommand,
17
+ } from './command-api-family-normalizers.js';
11
18
 
12
19
  export const TOOLING_COMMANDS = Object.freeze([...TOOLING_COMMAND_SET]);
13
20
  export const TOOLING_SURFACES = Object.freeze([...TOOLING_SURFACE_SET]);
@@ -15,468 +22,6 @@ export const TOOLING_SUITES = Object.freeze([...TOOLING_SUITE_SET]);
15
22
  export const TOOLING_VERIFY_SUITES = Object.freeze([...VERIFY_SUITES]);
16
23
  export const TOOLING_TRAINING_COMMAND_SCHEMA_VERSION = TRAINING_COMMAND_SCHEMA_VERSION;
17
24
 
18
- function asOptionalString(value, label) {
19
- if (value === undefined || value === null || value === '') return null;
20
- if (typeof value !== 'string') {
21
- throw new Error(`tooling command: ${label} must be a string when provided.`);
22
- }
23
- const trimmed = value.trim();
24
- return trimmed || null;
25
- }
26
-
27
- function asOptionalBoolean(value, label) {
28
- if (value === undefined || value === null) return null;
29
- if (typeof value !== 'boolean') {
30
- throw new Error(`tooling command: ${label} must be a boolean when provided.`);
31
- }
32
- return value;
33
- }
34
-
35
- function asOptionalObject(value, label) {
36
- if (value === undefined || value === null) return null;
37
- if (!isPlainObject(value)) {
38
- throw new Error(`tooling command: ${label} must be an object when provided.`);
39
- }
40
- return value;
41
- }
42
-
43
- function asOptionalStringArray(value, label) {
44
- if (value === undefined || value === null) return null;
45
- if (!Array.isArray(value)) {
46
- throw new Error(`tooling command: ${label} must be an array of strings when provided.`);
47
- }
48
- const normalized = value.map((entry, index) => {
49
- if (typeof entry !== 'string') {
50
- throw new Error(`tooling command: ${label}[${index}] must be a string.`);
51
- }
52
- const trimmed = entry.trim();
53
- if (!trimmed) {
54
- throw new Error(`tooling command: ${label}[${index}] must not be empty.`);
55
- }
56
- return trimmed;
57
- });
58
- return normalized.length > 0 ? normalized : null;
59
- }
60
-
61
- function asOptionalPositiveInteger(value, label) {
62
- if (value === undefined || value === null || value === '') return null;
63
- const parsed = Number(value);
64
- if (!Number.isInteger(parsed) || parsed < 1) {
65
- throw new Error(`tooling command: ${label} must be a positive integer when provided.`);
66
- }
67
- return parsed;
68
- }
69
-
70
- function asOptionalTrainingStage(value, label) {
71
- const stage = asOptionalString(value, label);
72
- if (!stage) return null;
73
- if (!TRAINING_STAGE_SET.includes(stage)) {
74
- throw new Error(`tooling command: ${label} must be one of ${TRAINING_STAGE_SET.join(', ')}.`);
75
- }
76
- return stage;
77
- }
78
-
79
- function asOptionalForceResumeReason(value, label) {
80
- const reason = asOptionalString(value, label);
81
- if (!reason) return null;
82
- return reason;
83
- }
84
-
85
- function assertCommand(value) {
86
- const command = asOptionalString(value, 'command');
87
- if (!command) {
88
- throw new Error('tooling command: command is required.');
89
- }
90
- if (!TOOLING_COMMAND_SET.includes(command)) {
91
- throw new Error(`tooling command: unsupported command "${command}".`);
92
- }
93
- return command;
94
- }
95
-
96
- function assertSuite(value, command) {
97
- const suite = asOptionalString(value, 'suite');
98
- if (!suite) {
99
- throw new Error(`tooling command: suite is required for "${command}".`);
100
- }
101
- if (!TOOLING_SUITE_SET.includes(suite)) {
102
- throw new Error(`tooling command: unsupported suite "${suite}".`);
103
- }
104
- return suite;
105
- }
106
-
107
- function resolveCommandRuntimeContract(command) {
108
- const runtimeContract = selectRuleValue('tooling', 'commandRuntime', 'runtimeContract', { command });
109
- if (!isPlainObject(runtimeContract)) {
110
- throw new Error(`tooling command: missing runtime contract metadata for "${command}".`);
111
- }
112
-
113
- const suite = runtimeContract.suite == null
114
- ? null
115
- : asOptionalString(runtimeContract.suite, `runtime contract suite for "${command}"`);
116
- if (suite && !TOOLING_SUITE_SET.includes(suite)) {
117
- throw new Error(`tooling command: runtime contract suite "${suite}" is not supported.`);
118
- }
119
-
120
- const intent = runtimeContract.intent == null
121
- ? null
122
- : asOptionalString(runtimeContract.intent, `runtime contract intent for "${command}"`);
123
- if (intent && !TOOLING_INTENT_SET.includes(intent)) {
124
- throw new Error(`tooling command: runtime contract intent "${intent}" is not supported.`);
125
- }
126
-
127
- return {
128
- suite,
129
- intent,
130
- };
131
- }
132
-
133
- function asOptionalCacheMode(value, label) {
134
- const cacheMode = asOptionalString(value, label);
135
- if (!cacheMode) return null;
136
- if (cacheMode !== 'cold' && cacheMode !== 'warm') {
137
- throw new Error(`${label} must be "cold" or "warm"`);
138
- }
139
- return cacheMode;
140
- }
141
-
142
- function asOptionalLoadMode(value, label) {
143
- const loadMode = asOptionalString(value, label);
144
- if (!loadMode) return null;
145
- if (loadMode !== 'opfs' && loadMode !== 'http' && loadMode !== 'memory') {
146
- throw new Error(`${label} must be "opfs", "http", or "memory"`);
147
- }
148
- return loadMode;
149
- }
150
-
151
- function assertModelId(value, command, suite) {
152
- const modelId = asOptionalString(value, 'modelId');
153
- if (!modelId) {
154
- throw new Error(
155
- `tooling command: modelId is required for command "${command}" (suite "${suite}").`
156
- );
157
- }
158
- return modelId;
159
- }
160
-
161
- function normalizeConvertExecution(value) {
162
- const execution = asOptionalObject(value, 'convertPayload.execution');
163
- if (!execution) return null;
164
-
165
- const workerCountPolicy = asOptionalString(
166
- execution.workerCountPolicy,
167
- 'convertPayload.execution.workerCountPolicy'
168
- );
169
- if (workerCountPolicy && workerCountPolicy !== 'cap' && workerCountPolicy !== 'error') {
170
- throw new Error(
171
- 'tooling command: convertPayload.execution.workerCountPolicy must be "cap" or "error" when provided.'
172
- );
173
- }
174
-
175
- return {
176
- ...execution,
177
- workers: asOptionalPositiveInteger(
178
- execution.workers,
179
- 'convertPayload.execution.workers'
180
- ),
181
- workerCountPolicy,
182
- maxInFlightJobs: asOptionalPositiveInteger(
183
- execution.maxInFlightJobs,
184
- 'convertPayload.execution.maxInFlightJobs'
185
- ),
186
- rowChunkRows: asOptionalPositiveInteger(
187
- execution.rowChunkRows,
188
- 'convertPayload.execution.rowChunkRows'
189
- ),
190
- rowChunkMinTensorBytes: asOptionalPositiveInteger(
191
- execution.rowChunkMinTensorBytes,
192
- 'convertPayload.execution.rowChunkMinTensorBytes'
193
- ),
194
- useGpuCast: asOptionalBoolean(
195
- execution.useGpuCast,
196
- 'convertPayload.execution.useGpuCast'
197
- ),
198
- gpuCastMinTensorBytes: asOptionalPositiveInteger(
199
- execution.gpuCastMinTensorBytes,
200
- 'convertPayload.execution.gpuCastMinTensorBytes'
201
- ),
202
- };
203
- }
204
-
205
- function normalizeConvertPayload(value) {
206
- const payload = asOptionalObject(value, 'convertPayload');
207
- if (!payload) {
208
- throw new Error(
209
- 'tooling command: convert requires convertPayload.converterConfig.'
210
- );
211
- }
212
- const converterConfig = asOptionalObject(
213
- payload.converterConfig,
214
- 'convertPayload.converterConfig'
215
- );
216
- if (!converterConfig) {
217
- throw new Error(
218
- 'tooling command: convert requires convertPayload.converterConfig.'
219
- );
220
- }
221
- return {
222
- ...payload,
223
- converterConfig,
224
- execution: normalizeConvertExecution(payload.execution),
225
- };
226
- }
227
-
228
- function normalizeConvert(raw) {
229
- const inputDir = asOptionalString(raw.inputDir, 'inputDir');
230
- const outputDir = asOptionalString(raw.outputDir, 'outputDir');
231
- const modelId = asOptionalString(raw.modelId, 'modelId');
232
- const payload = normalizeConvertPayload(raw.convertPayload);
233
-
234
- if (!inputDir) {
235
- throw new Error(
236
- 'tooling command: convert requires inputDir.'
237
- );
238
- }
239
- if (modelId) {
240
- throw new Error(
241
- 'tooling command: convert does not accept modelId. Set convertPayload.converterConfig.output.modelBaseId.'
242
- );
243
- }
244
-
245
- return {
246
- command: 'convert',
247
- suite: null,
248
- intent: null,
249
- modelId: null,
250
- trainingTests: null,
251
- trainingStage: null,
252
- trainingConfig: null,
253
- stage1Artifact: null,
254
- stage1ArtifactHash: null,
255
- ulArtifactDir: null,
256
- stageAArtifact: null,
257
- stageAArtifactHash: null,
258
- distillArtifactDir: null,
259
- teacherModelId: null,
260
- studentModelId: null,
261
- distillDatasetId: null,
262
- distillDatasetPath: null,
263
- distillLanguagePair: null,
264
- distillSourceLangs: null,
265
- distillTargetLangs: null,
266
- distillPairAllowlist: null,
267
- strictPairContract: null,
268
- distillShardIndex: null,
269
- distillShardCount: null,
270
- resumeFrom: null,
271
- forceResume: null,
272
- forceResumeReason: null,
273
- forceResumeSource: null,
274
- checkpointOperator: null,
275
- trainingSchemaVersion: null,
276
- trainingBenchSteps: null,
277
- checkpointEvery: null,
278
- workloadType: asOptionalString(raw.workloadType, 'workloadType'),
279
- modelUrl: asOptionalString(raw.modelUrl, 'modelUrl'),
280
- cacheMode: asOptionalCacheMode(raw.cacheMode, 'cacheMode'),
281
- loadMode: asOptionalLoadMode(raw.loadMode, 'loadMode'),
282
- runtimePreset: asOptionalString(raw.runtimePreset, 'runtimePreset'),
283
- runtimeConfigUrl: asOptionalString(raw.runtimeConfigUrl, 'runtimeConfigUrl'),
284
- runtimeConfig: asOptionalObject(raw.runtimeConfig, 'runtimeConfig'),
285
- inputDir,
286
- outputDir,
287
- convertPayload: payload,
288
- captureOutput: false,
289
- keepPipeline: false,
290
- report: asOptionalObject(raw.report, 'report'),
291
- timestamp: raw.timestamp ?? null,
292
- searchParams: raw.searchParams ?? null,
293
- };
294
- }
295
-
296
- function normalizeSuiteCommand(raw, command) {
297
- const runtimeContract = resolveCommandRuntimeContract(command);
298
- let suite = runtimeContract.suite;
299
- if (!suite) {
300
- suite = assertSuite(raw.suite, command);
301
- if (!VERIFY_SUITES.includes(suite)) {
302
- throw new Error(
303
- `tooling command: "${command}" suite must be one of ${VERIFY_SUITES.join(', ')}.`
304
- );
305
- }
306
- }
307
-
308
- const modelUrl = asOptionalString(raw.modelUrl, 'modelUrl');
309
- const trainingTests = asOptionalStringArray(raw.trainingTests, 'trainingTests');
310
- const trainingStage = asOptionalTrainingStage(raw.trainingStage, 'trainingStage');
311
- const trainingConfig = asOptionalObject(raw.trainingConfig, 'trainingConfig');
312
- const stage1Artifact = asOptionalString(raw.stage1Artifact, 'stage1Artifact');
313
- const stage1ArtifactHash = asOptionalString(raw.stage1ArtifactHash, 'stage1ArtifactHash');
314
- const ulArtifactDir = asOptionalString(raw.ulArtifactDir, 'ulArtifactDir');
315
- const stageAArtifact = asOptionalString(raw.stageAArtifact, 'stageAArtifact');
316
- const stageAArtifactHash = asOptionalString(raw.stageAArtifactHash, 'stageAArtifactHash');
317
- const distillArtifactDir = asOptionalString(raw.distillArtifactDir, 'distillArtifactDir');
318
- const teacherModelId = asOptionalString(raw.teacherModelId, 'teacherModelId');
319
- const studentModelId = asOptionalString(raw.studentModelId, 'studentModelId');
320
- const distillDatasetId = asOptionalString(raw.distillDatasetId, 'distillDatasetId');
321
- const distillDatasetPath = asOptionalString(raw.distillDatasetPath, 'distillDatasetPath');
322
- const distillLanguagePair = asOptionalString(raw.distillLanguagePair, 'distillLanguagePair');
323
- const distillSourceLangs = asOptionalStringArray(raw.distillSourceLangs, 'distillSourceLangs');
324
- const distillTargetLangs = asOptionalStringArray(raw.distillTargetLangs, 'distillTargetLangs');
325
- const distillPairAllowlist = asOptionalStringArray(raw.distillPairAllowlist, 'distillPairAllowlist');
326
- const strictPairContract = asOptionalBoolean(raw.strictPairContract, 'strictPairContract');
327
- const distillShardIndex = asOptionalPositiveInteger(raw.distillShardIndex, 'distillShardIndex');
328
- const distillShardCount = asOptionalPositiveInteger(raw.distillShardCount, 'distillShardCount');
329
- const resumeFrom = asOptionalString(raw.resumeFrom, 'resumeFrom');
330
- const forceResume = asOptionalBoolean(raw.forceResume, 'forceResume');
331
- const forceResumeReason = asOptionalForceResumeReason(raw.forceResumeReason, 'forceResumeReason');
332
- const forceResumeSource = asOptionalString(raw.forceResumeSource, 'forceResumeSource');
333
- const checkpointOperator = asOptionalString(raw.checkpointOperator, 'checkpointOperator');
334
- const trainingSchemaVersionInput = asOptionalPositiveInteger(
335
- raw.trainingSchemaVersion,
336
- 'trainingSchemaVersion'
337
- );
338
- const trainingBenchSteps = asOptionalPositiveInteger(raw.trainingBenchSteps, 'trainingBenchSteps');
339
- const checkpointEvery = asOptionalPositiveInteger(raw.checkpointEvery, 'checkpointEvery');
340
- const workloadType = asOptionalString(raw.workloadType, 'workloadType');
341
- const isTrainingBenchWorkload = command === 'bench' && suite === 'bench' && workloadType === 'training';
342
- const allowsTrainingFields = suite === 'training' || isTrainingBenchWorkload;
343
- if (!allowsTrainingFields && (
344
- trainingTests
345
- || trainingStage
346
- || trainingConfig
347
- || stage1Artifact
348
- || stage1ArtifactHash
349
- || ulArtifactDir
350
- || stageAArtifact
351
- || stageAArtifactHash
352
- || distillArtifactDir
353
- || teacherModelId
354
- || studentModelId
355
- || distillDatasetId
356
- || distillDatasetPath
357
- || distillLanguagePair
358
- || distillSourceLangs
359
- || distillTargetLangs
360
- || distillPairAllowlist
361
- || strictPairContract !== null
362
- || distillShardIndex
363
- || distillShardCount
364
- || resumeFrom
365
- || forceResume !== null
366
- || forceResumeReason
367
- || forceResumeSource
368
- || checkpointOperator
369
- || trainingSchemaVersionInput
370
- || trainingBenchSteps
371
- || checkpointEvery
372
- )) {
373
- throw new Error(
374
- 'tooling command: training-only fields require suite="training" or bench workloadType="training".'
375
- );
376
- }
377
- if (forceResumeReason && forceResume !== true) {
378
- throw new Error(
379
- 'tooling command: forceResumeReason requires forceResume=true.'
380
- );
381
- }
382
- if (forceResumeSource && forceResume !== true) {
383
- throw new Error(
384
- 'tooling command: forceResumeSource requires forceResume=true.'
385
- );
386
- }
387
- if (checkpointOperator && forceResume !== true) {
388
- throw new Error(
389
- 'tooling command: checkpointOperator requires forceResume=true.'
390
- );
391
- }
392
- const trainingSchemaVersion = allowsTrainingFields
393
- ? (trainingSchemaVersionInput ?? TRAINING_COMMAND_SCHEMA_VERSION)
394
- : null;
395
- if (trainingSchemaVersionInput != null && trainingSchemaVersionInput !== TRAINING_COMMAND_SCHEMA_VERSION) {
396
- throw new Error(
397
- `tooling command: trainingSchemaVersion must be ${TRAINING_COMMAND_SCHEMA_VERSION}.`
398
- );
399
- }
400
- if (
401
- distillShardIndex != null
402
- && distillShardCount != null
403
- && distillShardIndex > distillShardCount
404
- ) {
405
- throw new Error('tooling command: distillShardIndex must be <= distillShardCount.');
406
- }
407
-
408
- const requiresModel = suite !== 'kernels' && !isTrainingBenchWorkload;
409
- const hasTrainingSource = allowsTrainingFields && (
410
- !!modelUrl
411
- || !!trainingStage
412
- || !!stage1Artifact
413
- || !!stageAArtifact
414
- || !!trainingConfig?.ul?.stage
415
- || !!trainingConfig?.distill?.stage
416
- || !!trainingConfig?.dataset
417
- || !!trainingConfig?.distill?.datasetId
418
- || !!trainingConfig?.distill?.datasetPath
419
- || !!teacherModelId
420
- || !!studentModelId
421
- || !!distillDatasetPath
422
- );
423
- const modelId = (requiresModel && !hasTrainingSource)
424
- ? assertModelId(raw.modelId, command, suite)
425
- : asOptionalString(raw.modelId, 'modelId');
426
-
427
- return {
428
- command,
429
- suite,
430
- intent: runtimeContract.intent,
431
- modelId,
432
- trainingTests,
433
- trainingStage,
434
- trainingConfig,
435
- stage1Artifact,
436
- stage1ArtifactHash,
437
- ulArtifactDir,
438
- stageAArtifact,
439
- stageAArtifactHash,
440
- distillArtifactDir,
441
- teacherModelId,
442
- studentModelId,
443
- distillDatasetId,
444
- distillDatasetPath,
445
- distillLanguagePair,
446
- distillSourceLangs,
447
- distillTargetLangs,
448
- distillPairAllowlist,
449
- strictPairContract: allowsTrainingFields ? strictPairContract : null,
450
- distillShardIndex,
451
- distillShardCount,
452
- resumeFrom,
453
- forceResume: allowsTrainingFields
454
- ? (forceResume == null ? null : forceResume === true)
455
- : null,
456
- forceResumeReason: allowsTrainingFields ? forceResumeReason : null,
457
- forceResumeSource: allowsTrainingFields ? forceResumeSource : null,
458
- checkpointOperator: allowsTrainingFields ? checkpointOperator : null,
459
- trainingSchemaVersion,
460
- trainingBenchSteps,
461
- checkpointEvery: allowsTrainingFields ? checkpointEvery : null,
462
- workloadType,
463
- modelUrl,
464
- cacheMode: asOptionalCacheMode(raw.cacheMode, 'cacheMode'),
465
- loadMode: asOptionalLoadMode(raw.loadMode, 'loadMode'),
466
- runtimePreset: asOptionalString(raw.runtimePreset, 'runtimePreset'),
467
- runtimeConfigUrl: asOptionalString(raw.runtimeConfigUrl, 'runtimeConfigUrl'),
468
- runtimeConfig: asOptionalObject(raw.runtimeConfig, 'runtimeConfig'),
469
- inputDir: null,
470
- outputDir: null,
471
- convertPayload: null,
472
- captureOutput: asOptionalBoolean(raw.captureOutput, 'captureOutput') ?? false,
473
- keepPipeline: asOptionalBoolean(raw.keepPipeline, 'keepPipeline') ?? false,
474
- report: asOptionalObject(raw.report, 'report'),
475
- timestamp: raw.timestamp ?? null,
476
- searchParams: raw.searchParams ?? null,
477
- };
478
- }
479
-
480
25
  export function normalizeToolingCommandRequest(input) {
481
26
  if (!isPlainObject(input)) {
482
27
  throw new Error('tooling command: request must be an object.');
@@ -485,6 +30,9 @@ export function normalizeToolingCommandRequest(input) {
485
30
  if (command === 'convert') {
486
31
  return normalizeConvert(input);
487
32
  }
33
+ if (command === 'lora' || command === 'distill') {
34
+ return normalizeTrainingOperatorCommand(input, command);
35
+ }
488
36
  return normalizeSuiteCommand(input, command);
489
37
  }
490
38
 
@@ -514,8 +62,13 @@ export function ensureCommandSupportedOnSurface(commandRequest, surface) {
514
62
  throw new Error(`tooling command: unsupported surface "${surface}".`);
515
63
  }
516
64
 
517
- // All commands are contractually available on both surfaces.
518
- // Surface-specific capability checks happen in the runners.
65
+ if (
66
+ normalizedSurface === 'browser'
67
+ && (request.command === 'lora' || request.command === 'distill')
68
+ ) {
69
+ throw new Error(`tooling command: ${request.command} is currently Node-only and must fail closed on browser.`);
70
+ }
71
+
519
72
  return {
520
73
  request,
521
74
  surface: normalizedSurface,
@@ -146,7 +146,10 @@ export function createToolingSuccessEnvelope({
146
146
 
147
147
  export function createToolingErrorEnvelope(error, context = {}) {
148
148
  const normalized = normalizeToToolingCommandError(error, context);
149
- const surface = asNonEmptyString(context?.surface);
149
+ const surface = asNonEmptyString(context?.surface)
150
+ || asNonEmptyString(normalized?.details?.surface)
151
+ || asNonEmptyString(error?.surface)
152
+ || null;
150
153
  const request = isPlainObject(context?.request) ? context.request : null;
151
154
  return {
152
155
  ok: false,
@@ -1,5 +1,5 @@
1
1
  import { buildRuntimeContractPatch } from './command-api.js';
2
- import { mergeRuntimeValues } from '../config/runtime-merge.js';
2
+ import { applyOrderedRuntimeInputs } from './runtime-input-composition.js';
3
3
 
4
4
  function cloneRuntimeConfig(runtimeConfig) {
5
5
  if (runtimeConfig == null) return runtimeConfig;
@@ -9,6 +9,46 @@ function cloneRuntimeConfig(runtimeConfig) {
9
9
  return JSON.parse(JSON.stringify(runtimeConfig));
10
10
  }
11
11
 
12
+ function assertCalibrateRuntimeCompatibility(request, runtimeConfig) {
13
+ if (request?.intent !== 'calibrate') {
14
+ return;
15
+ }
16
+
17
+ const shared = runtimeConfig?.shared ?? {};
18
+ const debug = shared.debug ?? {};
19
+ const benchmarkRun = shared.benchmark?.run ?? {};
20
+ const violations = [];
21
+
22
+ if (debug.trace?.enabled === true) {
23
+ violations.push('runtime.shared.debug.trace.enabled');
24
+ }
25
+ if (debug.pipeline?.enabled === true) {
26
+ violations.push('runtime.shared.debug.pipeline.enabled');
27
+ }
28
+ if (Array.isArray(debug.probes) && debug.probes.length > 0) {
29
+ violations.push('runtime.shared.debug.probes');
30
+ }
31
+ if (debug.profiler?.enabled === true) {
32
+ violations.push('runtime.shared.debug.profiler.enabled');
33
+ }
34
+ if (benchmarkRun.debug === true) {
35
+ violations.push('runtime.shared.benchmark.run.debug');
36
+ }
37
+ if (benchmarkRun.profile === true) {
38
+ violations.push('runtime.shared.benchmark.run.profile');
39
+ }
40
+ if (benchmarkRun.captureMemoryTimeSeries === true) {
41
+ violations.push('runtime.shared.benchmark.run.captureMemoryTimeSeries');
42
+ }
43
+
44
+ if (violations.length > 0) {
45
+ throw new Error(
46
+ `tooling command: calibrate intent forbids investigation instrumentation (${violations.join(', ')}). ` +
47
+ 'Disable those runtime config fields or use the debug command instead.'
48
+ );
49
+ }
50
+ }
51
+
12
52
  function resetRuntimeState(runtimeBridge) {
13
53
  if (!runtimeBridge?.setRuntimeConfig) {
14
54
  throw new Error('runtime bridge must provide setRuntimeConfig().');
@@ -22,12 +62,6 @@ function resetRuntimeState(runtimeBridge) {
22
62
  runtimeBridge.setRuntimeConfig(null);
23
63
  }
24
64
 
25
- function mergeRuntimePatch(runtimeBridge, patch) {
26
- if (!patch) return;
27
- const mergedRuntime = mergeRuntimeValues(runtimeBridge.getRuntimeConfig(), patch);
28
- runtimeBridge.setRuntimeConfig(mergedRuntime);
29
- }
30
-
31
65
  function snapshotRuntimeState(runtimeBridge) {
32
66
  return {
33
67
  runtimeConfig: cloneRuntimeConfig(runtimeBridge.getRuntimeConfig()),
@@ -73,17 +107,17 @@ function restoreRuntimeState(runtimeBridge, snapshot) {
73
107
 
74
108
  export async function applyRuntimeInputs(request, runtimeBridge, options = {}) {
75
109
  resetRuntimeState(runtimeBridge);
76
-
77
- if (request.runtimePreset) {
78
- await runtimeBridge.applyRuntimePreset(request.runtimePreset, options);
79
- }
80
-
81
- if (request.runtimeConfigUrl) {
82
- await runtimeBridge.applyRuntimeConfigFromUrl(request.runtimeConfigUrl, options);
83
- }
84
-
85
- mergeRuntimePatch(runtimeBridge, request.runtimeConfig);
86
- mergeRuntimePatch(runtimeBridge, buildRuntimeContractPatch(request));
110
+ await applyOrderedRuntimeInputs(runtimeBridge, {
111
+ configChain: request.configChain ?? null,
112
+ runtimePreset: request.runtimePreset ?? null,
113
+ runtimeConfigUrl: request.runtimeConfigUrl ?? null,
114
+ runtimeConfig: request.runtimeConfig ?? null,
115
+ runtimeContractPatch: buildRuntimeContractPatch(request),
116
+ }, {
117
+ applyRuntimePreset: runtimeBridge.applyRuntimePreset?.bind(runtimeBridge),
118
+ applyRuntimeConfigFromUrl: runtimeBridge.applyRuntimeConfigFromUrl?.bind(runtimeBridge),
119
+ }, options);
120
+ assertCalibrateRuntimeCompatibility(request, runtimeBridge.getRuntimeConfig());
87
121
  }
88
122
 
89
123
  export async function runWithRuntimeIsolation(runtimeBridge, run) {