@helix3/helix-cli 0.1.23-helix3.428 → 0.1.23-helix3.430

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 (27) hide show
  1. package/dist/tsconfig.build.tsbuildinfo +1 -1
  2. package/dist/vehicle/audioImport.js +6 -2
  3. package/dist/vehicle/audioImport.js.map +1 -1
  4. package/dist/vehicle/audioProvenance.js +1 -1
  5. package/dist/vehicle/audioProvenance.js.map +1 -1
  6. package/dist/vehicle/preview.js +1 -1
  7. package/dist/vehicle/preview.js.map +1 -1
  8. package/dist/visualQa/vehicle.js +51 -0
  9. package/dist/visualQa/vehicle.js.map +1 -1
  10. package/docs/vehicle-audio-import.md +4 -1
  11. package/docs/visual-qa.md +3 -1
  12. package/package.json +2 -2
  13. package/plugins/beamng-vehicle/bin/__pycache__/beamng_abs.cpython-312.pyc +0 -0
  14. package/plugins/beamng-vehicle/bin/__pycache__/beamng_audio.cpython-312.pyc +0 -0
  15. package/plugins/beamng-vehicle/bin/__pycache__/beamng_engine.cpython-312.pyc +0 -0
  16. package/plugins/beamng-vehicle/bin/__pycache__/beamng_expression.cpython-312.pyc +0 -0
  17. package/plugins/beamng-vehicle/bin/__pycache__/beamng_jbeam.cpython-312.pyc +0 -0
  18. package/plugins/beamng-vehicle/bin/__pycache__/beamng_materials.cpython-312.pyc +0 -0
  19. package/plugins/beamng-vehicle/bin/__pycache__/beamng_stock_events.cpython-312.pyc +0 -0
  20. package/plugins/beamng-vehicle/bin/__pycache__/fmod_studio.cpython-312.pyc +0 -0
  21. package/plugins/beamng-vehicle/bin/__pycache__/fsb5.cpython-312.pyc +0 -0
  22. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio.cpython-312.pyc +0 -0
  23. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_ac.cpython-312.pyc +0 -0
  24. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_beamng.cpython-312.pyc +0 -0
  25. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_fixtures.cpython-312.pyc +0 -0
  26. package/plugins/beamng-vehicle/bin/__pycache__/test_beamng_engine.cpython-312.pyc +0 -0
  27. package/plugins/beamng-vehicle/bin/__pycache__/test_sim_audio.cpython-312.pyc +0 -0
@@ -165,6 +165,57 @@ async function vehiclePass(ctx, pass) {
165
165
  const engineBundle = (process.env.HELIX_VQA_ENGINE_BUNDLE ?? '').trim();
166
166
  if (engineBundle)
167
167
  errors.push(`HELIX_VQA_ENGINE_BUNDLE=${engineBundle} was set: rendered on a local engine build, not for submission`);
168
+ // ── THE OCCUPANT IS THE PLATFORM'S REFERENCE AVATAR, NOT THE SUBMITTER'S ───────────────────────────────────────────
169
+ // Every seat is occupied by "this account's own avatar", and an account's avatar is whatever it wears. MEASURED on the
170
+ // 993 (engine 0.3.214, same build, same car): the QA accounts' default avatar seats with torso 20.5°, hands on the rim,
171
+ // crown +25 mm; the owner's account, wearing a hairstyle whose cards stand ~0.11 m over the skull, seats reclined to the
172
+ // rig's stop (35.2°), hands 131/91 mm off the rim, hair +6 mm under the lining — seven occupant FAILs for whoever
173
+ // happened to submit. A car's gate has to judge the car, and the cabin fit is sized for the platform default body, so
174
+ // the page is answered with the platform default avatar (`GET /universal-items/avatar/default`, public) for every seat.
175
+ // `HELIX_VQA_OWN_AVATAR=1` keeps the account's own avatar (how YOUR avatar fits this car; recorded, not for submission);
176
+ // `HELIX_VQA_EQUIPPED_AVATAR=<json>` states any composition (debug, to bisect an avatar defect).
177
+ const equippedOverride = (process.env.HELIX_VQA_EQUIPPED_AVATAR ?? '').trim();
178
+ const ownAvatar = /^(1|true|yes)$/i.test((process.env.HELIX_VQA_OWN_AVATAR ?? '').trim());
179
+ let occupantAvatar = { source: 'account', itemId: null };
180
+ if (equippedOverride)
181
+ errors.push(`HELIX_VQA_EQUIPPED_AVATAR=${equippedOverride} was set: the occupants wear a stated avatar, not the reference one (debug, not for submission)`);
182
+ else if (ownAvatar)
183
+ errors.push('HELIX_VQA_OWN_AVATAR=1 was set: the occupants wear this account\'s own avatar, not the platform reference (not for submission)');
184
+ facts.occupantAvatar = occupantAvatar;
185
+ if (!ownAvatar) {
186
+ let body = null;
187
+ if (equippedOverride)
188
+ body = node_fs_1.default.readFileSync(equippedOverride, 'utf8');
189
+ else {
190
+ try {
191
+ const res = await fetch(`${ctx.apiBase.replace(/\/$/, '')}/api/v1/universal-items/avatar/default`, { headers: { accept: 'application/json' } });
192
+ if (res.ok)
193
+ body = await res.text();
194
+ else
195
+ errors.push(`occupants: the platform default avatar could not be read (HTTP ${res.status}); seats were filled with this account's avatar`);
196
+ }
197
+ catch (e) {
198
+ errors.push(`occupants: the platform default avatar could not be read (${String(e?.message ?? e).slice(0, 120)}); seats were filled with this account's avatar`);
199
+ }
200
+ }
201
+ if (body !== null) {
202
+ try {
203
+ const j = JSON.parse(body);
204
+ occupantAvatar = { source: equippedOverride ? 'stated' : 'platform-default', itemId: j.itemId ?? null };
205
+ facts.occupantAvatar = occupantAvatar;
206
+ }
207
+ catch { /* the page will say */ }
208
+ const answer = body;
209
+ await b.ctx.route(/\/universal-items\/avatar\/equipped\/me(\?|$)/, async (route) => {
210
+ if (route.request().method() !== 'GET') {
211
+ await route.continue();
212
+ return;
213
+ }
214
+ const origin = route.request().headers().origin;
215
+ await route.fulfill({ status: 200, body: answer, contentType: 'application/json', headers: { 'cache-control': 'no-store', ...(origin ? { 'access-control-allow-origin': origin, 'access-control-allow-credentials': 'true', vary: 'Origin' } : { 'access-control-allow-origin': '*' }) } });
216
+ });
217
+ }
218
+ }
168
219
  if (preview && previewSink) {
169
220
  await (0, vehiclePreview_1.installVehiclePreviewRoutes)(b.ctx, preview.candidate, itemId, previewSink);
170
221
  (0, vehiclePreview_1.watchProxyModelFetches)(b.ctx, previewSink);