@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.
- package/README.md +1 -1
- package/dist/index.js +8 -4
- package/dist/index.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/vehicle/addonPublished.js +5 -1
- package/dist/vehicle/addonPublished.js.map +1 -1
- package/dist/vehicle/audio.d.ts +52 -2
- package/dist/vehicle/audio.js +177 -9
- package/dist/vehicle/audio.js.map +1 -1
- package/dist/vehicle/audioDefects.d.ts +40 -0
- package/dist/vehicle/audioDefects.js +62 -0
- package/dist/vehicle/audioDefects.js.map +1 -1
- package/dist/vehicle/audioDistinct.d.ts +62 -0
- package/dist/vehicle/audioDistinct.js +479 -0
- package/dist/vehicle/audioDistinct.js.map +1 -0
- package/dist/vehicle/audioReference.d.ts +36 -0
- package/dist/vehicle/audioReference.js +176 -0
- package/dist/vehicle/audioReference.js.map +1 -0
- package/dist/vehicle/drive.js +4 -2
- package/dist/vehicle/drive.js.map +1 -1
- package/dist/vehicle/enginePolicy.d.ts +68 -0
- package/dist/vehicle/enginePolicy.js +209 -0
- package/dist/vehicle/enginePolicy.js.map +1 -0
- package/dist/vehicle/simulate.d.ts +10 -1
- package/dist/vehicle/simulate.js +7 -1
- package/dist/vehicle/simulate.js.map +1 -1
- package/dist/vehicle/validate.js +8 -1
- package/dist/vehicle/validate.js.map +1 -1
- package/docs/vehicle-simulate.md +16 -0
- package/package.json +1 -1
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_abs.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_audio.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_engine.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_expression.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_jbeam.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_materials.cpython-312.pyc +0 -0
- 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)
|