@helix3/helix-cli 0.1.22-helix3.413 → 0.1.22-helix3.416

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 (37) hide show
  1. package/README.md +1 -1
  2. package/dist/index.js +8 -4
  3. package/dist/index.js.map +1 -1
  4. package/dist/tsconfig.build.tsbuildinfo +1 -1
  5. package/dist/vehicle/addonPublished.js +5 -1
  6. package/dist/vehicle/addonPublished.js.map +1 -1
  7. package/dist/vehicle/audio.d.ts +52 -2
  8. package/dist/vehicle/audio.js +177 -9
  9. package/dist/vehicle/audio.js.map +1 -1
  10. package/dist/vehicle/audioDefects.d.ts +40 -0
  11. package/dist/vehicle/audioDefects.js +62 -0
  12. package/dist/vehicle/audioDefects.js.map +1 -1
  13. package/dist/vehicle/audioDistinct.d.ts +62 -0
  14. package/dist/vehicle/audioDistinct.js +479 -0
  15. package/dist/vehicle/audioDistinct.js.map +1 -0
  16. package/dist/vehicle/audioReference.d.ts +36 -0
  17. package/dist/vehicle/audioReference.js +176 -0
  18. package/dist/vehicle/audioReference.js.map +1 -0
  19. package/dist/vehicle/drive.js +4 -2
  20. package/dist/vehicle/drive.js.map +1 -1
  21. package/dist/vehicle/enginePolicy.d.ts +68 -0
  22. package/dist/vehicle/enginePolicy.js +209 -0
  23. package/dist/vehicle/enginePolicy.js.map +1 -0
  24. package/dist/vehicle/simulate.d.ts +10 -1
  25. package/dist/vehicle/simulate.js +7 -1
  26. package/dist/vehicle/simulate.js.map +1 -1
  27. package/dist/vehicle/validate.js +8 -1
  28. package/dist/vehicle/validate.js.map +1 -1
  29. package/docs/vehicle-simulate.md +16 -0
  30. package/package.json +1 -1
  31. package/plugins/beamng-vehicle/bin/__pycache__/beamng_abs.cpython-312.pyc +0 -0
  32. package/plugins/beamng-vehicle/bin/__pycache__/beamng_audio.cpython-312.pyc +0 -0
  33. package/plugins/beamng-vehicle/bin/__pycache__/beamng_engine.cpython-312.pyc +0 -0
  34. package/plugins/beamng-vehicle/bin/__pycache__/beamng_expression.cpython-312.pyc +0 -0
  35. package/plugins/beamng-vehicle/bin/__pycache__/beamng_jbeam.cpython-312.pyc +0 -0
  36. package/plugins/beamng-vehicle/bin/__pycache__/beamng_materials.cpython-312.pyc +0 -0
  37. package/plugins/beamng-vehicle/bin/__pycache__/test_beamng_engine.cpython-312.pyc +0 -0
package/README.md CHANGED
@@ -53,7 +53,7 @@ The token is stored in `~/.helix/credentials.json` (mode `600`). It's sent as
53
53
  | `helix continuum publish-glb <mesh.glb> --title <t> [--package-type asset\|character] [--offer marketplace\|world --price-lix <n> --content-rating <rating>]` | Seal a Package first; optional offer makes it ownable. See [Package-first GLB publication](#package-first-glb-publication). |
54
54
  | `helix continuum make-item --package-id <id> --package-version <v> --manifest-cid <cid> --content-rating <rating> [--offer marketplace\|world --price-lix <n>]` | Project one exact sealed Package Version into an Item, with an optional first offer. |
55
55
  | `helix continuum publish-owned-item <item-id> --package-id <id> --package-version <v> --manifest-cid <cid> --content-rating <rating> --accept-rating-attestation` | Publish an existing personal Item from its unchanged public sealed Package pin. Offers are separate. |
56
- | `helix vehicle audio-check <dir\|package.json\|item-id> [--json]` | Proves every sound the runtime will select resolves, is PCM WAV and is audible (pre-publish on local files, or read-back on a published item). |
56
+ | `helix vehicle audio-check <dir\|package.json\|item-id> [--reference <clip>]... [--json]` | Proves every sound the runtime will select resolves, is PCM WAV and is audible (pre-publish on local files, or read-back on a published item), and that no two roles share one recording (shift up = shift down, an exhaust rung = an engine rung) and the rev limiter is a short crack the runtime can retrigger. `--reference <clip>` (repeatable; `slot=clip` for a slot) compares the idle voice's centroid and firing roughness with a real-car recording. |
57
57
  | `helix vehicle addon check <dir> [--json]` | Add-on fit gate for local source and host compatibility, including the web customizer's meshless guard (`ADDON_CUSTOMIZER_REFUSES`: a part with no `model.glb` must be a verified tune-only/sound-only definition). |
58
58
  | `helix vehicle addon check --item <addOnId>... / --host <vehicleId>... [--json]` | Published mode (public reads, no sign-in): reads each add-on Item's exact Package pin and runs exactly what the web customizer runs; `--host` checks every add-on on the car's rail. Exit `1` = the customizer would refuse a part, with its message. |
59
59
  | `helix item list-slots [--json]` | Print the Character-Creator vocabulary a wearable declares: the cosmetic slot tags, and the genders. |
package/dist/index.js CHANGED
@@ -624,7 +624,7 @@ vehicleCommand
624
624
  console.log((0, validate_1.formatVehicleIssues)(result.issues));
625
625
  if (result.simulation) {
626
626
  const { formatSimulationReport } = await Promise.resolve().then(() => __importStar(require('./vehicle/simulate')));
627
- console.log(formatSimulationReport(result.simulation).split('\n').map((line) => ` ${line}`).join('\n'));
627
+ console.log(formatSimulationReport(result.simulation, { withPolicy: false }).split('\n').map((line) => ` ${line}`).join('\n'));
628
628
  }
629
629
  if (provisional > 0)
630
630
  console.log(` ${provisional} audio row${provisional === 1 ? '' : 's'} backed by a local WAV: seal the WAV in the Vehicle Package before making its Item; \`helix vehicle audio-check\` proves ${provisional === 1 ? 'it plays' : 'they play'}`);
@@ -813,13 +813,17 @@ vehicleCommand
813
813
  .command('audio-check')
814
814
  .description('Prove every sound a vehicle declares will actually play: each engine-ladder rung and slot sample the runtime selects must resolve (a local WAV '
815
815
  + 'beside the package before publish, or HTTP 200 with the exact declared bytes and sha256 after), be PCM WAV, and be audible (not silence). '
816
- + 'It also measures what each sound is made of: clipping, DC offset, a resampled-copy ladder rung, one fixed formant stack or fixed tone shared by every rung, and an exactly periodic synthetic horn (each reported with its measured value and a fix). '
816
+ + 'It also measures what each sound is made of: clipping, DC offset, a resampled-copy ladder rung, one fixed formant stack or fixed tone shared by every rung, near-duplicate sounds across roles (shift up = shift down, an exhaust rung = an engine rung), a rev-limiter clip too long to stutter (the runtime re-fires it every 60 ms), and an exactly periodic synthetic horn (each reported with its measured value and a fix). '
817
817
  + 'Pass a package directory / package JSON for the pre-seal check, or a published vehicle item id for the read-back check. Exit 0 = every sample plays')
818
818
  .argument('<dir|package.json|item-id>', 'package directory or file (pre-seal), or a published vehicle item UUID (read-back)')
819
+ .option('--reference <clip>', 'a recording of the REAL car to compare the idle voice with: a WAV (or anything ffmpeg reads) of the engine idling; `slot=clip` compares that slot instead (e.g. horn=horn.wav, startup=start.wav). Repeat for several clips (the median is used). Spectral centroid and firing roughness are measured identically on both sides; WARN beyond 2.5x, error beyond 10x (field recordings differ by 2-4x between takes of one car)', (value, previous) => [...previous, value], [])
819
820
  .option('--json', 'print the machine-readable report')
820
821
  .action(async (target, opts) => {
821
822
  try {
822
823
  const audio = await Promise.resolve().then(() => __importStar(require('./vehicle/audio')));
824
+ const { loadReferenceClips } = await Promise.resolve().then(() => __importStar(require('./vehicle/audioReference')));
825
+ const reference = opts.reference?.length ? { bySlot: loadReferenceClips(opts.reference).bySlot } : undefined;
826
+ const options = reference ? { reference } : {};
823
827
  let report;
824
828
  if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(target)) {
825
829
  const creds = (0, config_1.loadCredentials)();
@@ -831,7 +835,7 @@ vehicleCommand
831
835
  const pkg = (body.item ?? body).properties?.vehiclePackage;
832
836
  if (!pkg)
833
837
  throw new Error(`item ${target} carries no properties.vehiclePackage (is it a vehicle?)`);
834
- report = await audio.checkAudioReadBack(pkg);
838
+ report = await audio.checkAudioReadBack(pkg, undefined, undefined, options);
835
839
  }
836
840
  else {
837
841
  const path = (0, node_path_1.resolve)(target);
@@ -839,7 +843,7 @@ vehicleCommand
839
843
  const isDir = statSync(path).isDirectory();
840
844
  const { readVehicleDir } = await Promise.resolve().then(() => __importStar(require('./vehicle/publish')));
841
845
  const pkg = isDir ? readVehicleDir(path).pkg : (0, validate_1.readJsonFile)(path);
842
- report = await audio.checkAudioLocal(pkg, isDir ? path : (0, node_path_1.resolve)(path, '..'));
846
+ report = await audio.checkAudioLocal(pkg, isDir ? path : (0, node_path_1.resolve)(path, '..'), undefined, undefined, options);
843
847
  }
844
848
  printVehicleJsonOr(opts.json, report, () => console.log(audio.formatAudioReport(report)));
845
849
  if (!report.ok)