@openmixer/plugin-qualify 0.13.0 → 0.14.1
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 +34 -0
- package/dist/hosting-codes.d.ts +15 -89
- package/dist/hosting-codes.generated.d.ts +76 -0
- package/dist/hosting-codes.generated.js +84 -0
- package/dist/hosting-codes.generated.js.map +1 -0
- package/dist/hosting-codes.js +10 -87
- package/dist/hosting-codes.js.map +1 -1
- package/dist/qualify-declarations.d.ts +26 -0
- package/dist/qualify-declarations.js +26 -0
- package/dist/qualify-declarations.js.map +1 -1
- package/package.json +3 -3
- package/src/hosting-codes.generated.ts +84 -0
- package/src/hosting-codes.ts +12 -178
- package/src/qualify-declarations.ts +29 -0
- package/tools/_declarations.py +11 -0
- package/tools/audit-overlap.sh +250 -0
- package/tools/clap-core-tsdir.d.mts +16 -0
- package/tools/clap-core-tsdir.mjs +93 -0
- package/tools/descriptors.py +382 -0
- package/tools/gen-hosting-codes.d.mts +8 -0
- package/tools/gen-hosting-codes.mjs +92 -0
- package/tools/gen-python-declarations.mjs +13 -1
- package/tools/scan.py +260 -4
package/README.md
CHANGED
|
@@ -193,6 +193,40 @@ names the options it ran under, `featureOptions`:
|
|
|
193
193
|
The defaults are the measurement as it has always been, so a verdict reached under them does not
|
|
194
194
|
move. `lv2_measure --help` lists the same flags.
|
|
195
195
|
|
|
196
|
+
## Scanned descriptors
|
|
197
|
+
|
|
198
|
+
Both scanners also write what each plugin states about itself as a scanned descriptor: one JSON file per
|
|
199
|
+
plugin in omx-contract's descriptor words (identity, controls, ports, what it needs from a host, whether it
|
|
200
|
+
reports latency), held to omx-contract's descriptor schema before it is written. A descriptor holds no
|
|
201
|
+
measurement and no verdict; those are the qualification record's.
|
|
202
|
+
|
|
203
|
+
The files go into the descriptor directory, the key `descriptor_dir`:
|
|
204
|
+
|
|
205
|
+
| | where |
|
|
206
|
+
| --- | --- |
|
|
207
|
+
| named | `--descriptor-dir <dir>` |
|
|
208
|
+
| a user (the default) | `$XDG_STATE_HOME/omx/descriptors`, else `~/.local/state/omx/descriptors` |
|
|
209
|
+
| a system service | `/var/lib/omx/descriptors` (`--system`) |
|
|
210
|
+
|
|
211
|
+
Each file is named `<id>@<version>-<sha256 first 12>.json`: the CLAP id or the LV2 URI, the version the
|
|
212
|
+
plugin states (`unversioned` when it states none) and the SHA-256 of its binary (the `.clap`, or the LV2
|
|
213
|
+
bundle's `lv2:binary`), with every character other than letters, digits, `.`, `_` and `-` written `_`. The hash
|
|
214
|
+
keys which file describes which binary: a changed binary is a new file, and the old one stays as history.
|
|
215
|
+
|
|
216
|
+
```
|
|
217
|
+
tools/scan.py --out catalog.json # LV2: the catalog, and the descriptors beside it
|
|
218
|
+
tools/scan.py --descriptor-dir ./descriptors urn:my:plugin # one plugin, into a directory of your own
|
|
219
|
+
native/build/clap-qualify --json ./my-fx.clap | tools/descriptors.py clap --descriptor-dir ./descriptors
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
`scan.py --no-descriptors` writes the catalog only. A descriptor the schema refuses is not written and is
|
|
223
|
+
reported as `contract.file.invalid`, omx-contract's code; a plugin whose binary cannot be read is
|
|
224
|
+
`qualify.descriptor.binary-unhashed`; a directory that cannot be written is `qualify.descriptor.dir-unwritable`;
|
|
225
|
+
no schema found is `qualify.descriptor.schema-missing`. Any of them makes the run exit `2`, and the other
|
|
226
|
+
plugins are still written. The schema is the omx-contract package plugin-qualify depends on, else
|
|
227
|
+
`/usr/share/omx-contract/omx-contract.schema.json`; `OMX_CONTRACT_SCHEMA` names another one, for a test. The
|
|
228
|
+
writer needs Python's `jsonschema` (`python3-jsonschema`).
|
|
229
|
+
|
|
196
230
|
## What the verdicts mean
|
|
197
231
|
|
|
198
232
|
- **suitable**: every dimension was measured and passed. Safe to run inside the engine's own
|
package/dist/hosting-codes.d.ts
CHANGED
|
@@ -1,91 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
2
|
+
* The hosting verdict's message codes. Codes, never prose: the surface renders the operator's
|
|
3
|
+
* locale.
|
|
4
|
+
*
|
|
5
|
+
* omx-clap-core declares every hosting code: one `HOSTING_<DIMENSION>_CODES` table per dimension,
|
|
6
|
+
* in the TypeScript modules its package installs under `pkg-config --variable=tsdir omx-clap-core`
|
|
7
|
+
* (BUILDING.md). {@link HOSTING_CODE} is those tables flattened into one `key: code` map, written
|
|
8
|
+
* as plain data into `hosting-codes.generated.ts` by `tools/gen-hosting-codes.mjs` at build time:
|
|
9
|
+
* a code omx-clap-core does not declare cannot be named here, and this module reads no file and
|
|
10
|
+
* imports no `node:` module, so every public subpath that reaches it bundles for a browser.
|
|
11
|
+
* `src/contract-vocabulary-conformance.test.ts` holds the generated map to omx-clap-core's real
|
|
12
|
+
* modules, either way.
|
|
6
13
|
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
* omx-clap-core's hosting codes, by key, across its two TypeScript modules — hand-kept here
|
|
12
|
-
* (not derived from a static import: the source is a runtime-resolved install directory, not an
|
|
13
|
-
* npm dependency) and held to the real modules by
|
|
14
|
-
* `src/contract-vocabulary-conformance.test.ts`, which turns red on any drift either way.
|
|
15
|
-
*/
|
|
16
|
-
export interface HostingCodeTable {
|
|
17
|
-
readonly clapExtensionsNotCovered: "hosting.clap.extensions-not-covered";
|
|
18
|
-
readonly clapFormatNotHosted: "hosting.clap.format-not-hosted";
|
|
19
|
-
readonly clapHeadlessFailed: "hosting.clap.headless-failed";
|
|
20
|
-
readonly clapLatencyMismatch: "hosting.clap.latency-mismatch";
|
|
21
|
-
readonly clapNoteInput: "hosting.clap.note-input";
|
|
22
|
-
readonly clapProcessError: "hosting.clap.process-error";
|
|
23
|
-
readonly clapThreadViolation: "hosting.clap.thread-violation";
|
|
24
|
-
readonly clapUnqualified: "hosting.clap.unqualified";
|
|
25
|
-
readonly costAboveCeiling: "hosting.cost.above-ceiling";
|
|
26
|
-
readonly costFieldsMissing: "hosting.cost.fields-missing";
|
|
27
|
-
readonly costSpiky: "hosting.cost.spiky-tail";
|
|
28
|
-
readonly costUnmeasured: "hosting.cost.unmeasured-at-rate-and-quantum";
|
|
29
|
-
readonly costWithinCeiling: "hosting.cost.within-ceiling";
|
|
30
|
-
readonly featuresAtomInUnfed: "hosting.features.atom-in-unfed";
|
|
31
|
-
readonly featuresDisqualifying: "hosting.features.host-not-provided";
|
|
32
|
-
readonly featuresMidiIn: "hosting.features.midi-in-fed-empty";
|
|
33
|
-
readonly featuresMissing: "hosting.features.missing";
|
|
34
|
-
readonly featuresPortsUnreadable: "hosting.features.ports-unreadable";
|
|
35
|
-
readonly featuresProvided: "hosting.features.all-provided";
|
|
36
|
-
readonly featuresUnscanned: "hosting.features.scan-predates-field";
|
|
37
|
-
readonly idleHoldRefused: "hosting.idle.hold-refused";
|
|
38
|
-
readonly latencyNonconforming: "hosting.latency.nonconforming";
|
|
39
|
-
readonly latencyParameterDependent: "hosting.latency.parameter-dependent";
|
|
40
|
-
readonly latencyResolved: "hosting.latency.resolved";
|
|
41
|
-
readonly latencyUnmeasured: "hosting.latency.unmeasured";
|
|
42
|
-
readonly outputNonFinite: "hosting.output.non-finite";
|
|
43
|
-
readonly overrideIsolated: "hosting.override.curator-isolated";
|
|
44
|
-
readonly patchBusy: "hosting.patch.busy";
|
|
45
|
-
readonly patchNotWritable: "hosting.patch.not-writable";
|
|
46
|
-
readonly patchTooLarge: "hosting.patch.too-large";
|
|
47
|
-
readonly presetNotFound: "hosting.preset.not-found";
|
|
48
|
-
readonly hostProvenanceDiffers: "hosting.provenance.host-differs";
|
|
49
|
-
readonly sweepControlDidNotFire: "hosting.provenance.sweep-control-did-not-fire";
|
|
50
|
-
readonly disabled: "hosting.disabled";
|
|
51
|
-
readonly linked: "hosting.linked";
|
|
52
|
-
readonly noRealisation: "hosting.no-realisation";
|
|
53
|
-
readonly realisedInProcess: "hosting.realised.in-process";
|
|
54
|
-
readonly unjudged: "hosting.unjudged";
|
|
55
|
-
readonly rtSafetyClean: "hosting.rt-safety.clean-under-sweep";
|
|
56
|
-
readonly rtSafetyNotReproducible: "hosting.rt-safety.not-reproducible";
|
|
57
|
-
readonly rtSafetyNotesClean: "hosting.rt-safety.clean-under-notes";
|
|
58
|
-
readonly rtSafetyNotesUnmeasured: "hosting.rt-safety.notes-unmeasured";
|
|
59
|
-
readonly rtSafetyNotesViolations: "hosting.rt-safety.violations-under-notes";
|
|
60
|
-
readonly rtSafetyUnmeasured: "hosting.rt-safety.unmeasured";
|
|
61
|
-
readonly rtSafetyViolations: "hosting.rt-safety.violations-in-run";
|
|
62
|
-
readonly stabilityBelowFloor: "hosting.stability.cycles-below-floor";
|
|
63
|
-
readonly stabilityCrashUnattributed: "hosting.stability.crash-unattributed";
|
|
64
|
-
readonly stabilityCrashedAttributed: "hosting.stability.crashed-attributed-plugin";
|
|
65
|
-
readonly stabilityCrashedLive: "hosting.stability.crashed-live-on-this-rig";
|
|
66
|
-
readonly stabilityLinksGuiToolkit: "hosting.stability.links-gui-toolkit";
|
|
67
|
-
readonly stabilitySoakFailedAtRate: "hosting.stability.soak-failed-at-rate";
|
|
68
|
-
readonly stabilitySoaked: "hosting.stability.soaked";
|
|
69
|
-
readonly stabilitySpawnsThreads: "hosting.stability.spawns-threads";
|
|
70
|
-
readonly stabilityUnmeasured: "hosting.stability.unmeasured";
|
|
71
|
-
readonly stabilityUnsoaked: "hosting.stability.unsoaked";
|
|
72
|
-
readonly stateNotACopy: "hosting.state.not-a-copy";
|
|
73
|
-
readonly statePathOnAudio: "hosting.state.path-on-audio";
|
|
74
|
-
readonly statePathOutside: "hosting.state.path-outside";
|
|
75
|
-
readonly statePathSymlink: "hosting.state.path-symlink";
|
|
76
|
-
readonly statePathTooLong: "hosting.state.path-too-long";
|
|
77
|
-
readonly statePathUnmakeable: "hosting.state.path-unmakeable";
|
|
78
|
-
readonly stateUnreadable: "hosting.state.unreadable";
|
|
79
|
-
readonly topologyAmbisonicConfig: "hosting.topology.ambisonic-config";
|
|
80
|
-
readonly topologyChannelMapUnknown: "hosting.topology.channel-map-unknown";
|
|
81
|
-
readonly topologyInstrument: "hosting.topology.instrument";
|
|
82
|
-
readonly topologyMatched: "hosting.topology.matched";
|
|
83
|
-
readonly topologyNoAudioInput: "hosting.topology.no-audio-input";
|
|
84
|
-
readonly topologyNoAudioOutput: "hosting.topology.no-audio-output";
|
|
85
|
-
readonly topologyPortTooWide: "hosting.topology.port-too-wide";
|
|
86
|
-
readonly topologyPortWithoutChannels: "hosting.topology.port-without-channels";
|
|
87
|
-
readonly topologyTooManyPorts: "hosting.topology.too-many-ports";
|
|
88
|
-
readonly topologyWiderThanStrip: "hosting.topology.wider-than-strip";
|
|
89
|
-
readonly workerNonconforming: "hosting.worker.nonconforming";
|
|
90
|
-
}
|
|
91
|
-
export declare const HOSTING_CODE: HostingCodeTable;
|
|
14
|
+
import { HOSTING_CODE } from "./hosting-codes.generated.js";
|
|
15
|
+
export { HOSTING_CODE };
|
|
16
|
+
/** {@link HOSTING_CODE}'s type: each key's literal code. */
|
|
17
|
+
export type HostingCodeTable = typeof HOSTING_CODE;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/** omx-clap-core's hosting codes, by key: every `HOSTING_<DIMENSION>_CODES` table, flattened. */
|
|
2
|
+
export declare const HOSTING_CODE: Readonly<{
|
|
3
|
+
readonly clapExtensionsNotCovered: "hosting.clap.extensions-not-covered";
|
|
4
|
+
readonly clapFormatNotHosted: "hosting.clap.format-not-hosted";
|
|
5
|
+
readonly clapHeadlessFailed: "hosting.clap.headless-failed";
|
|
6
|
+
readonly clapLatencyMismatch: "hosting.clap.latency-mismatch";
|
|
7
|
+
readonly clapNoteInput: "hosting.clap.note-input";
|
|
8
|
+
readonly clapProcessError: "hosting.clap.process-error";
|
|
9
|
+
readonly clapThreadViolation: "hosting.clap.thread-violation";
|
|
10
|
+
readonly clapUnqualified: "hosting.clap.unqualified";
|
|
11
|
+
readonly costAboveCeiling: "hosting.cost.above-ceiling";
|
|
12
|
+
readonly costFieldsMissing: "hosting.cost.fields-missing";
|
|
13
|
+
readonly costSpiky: "hosting.cost.spiky-tail";
|
|
14
|
+
readonly costUnmeasured: "hosting.cost.unmeasured-at-rate-and-quantum";
|
|
15
|
+
readonly costWithinCeiling: "hosting.cost.within-ceiling";
|
|
16
|
+
readonly featuresAtomInUnfed: "hosting.features.atom-in-unfed";
|
|
17
|
+
readonly featuresDisqualifying: "hosting.features.host-not-provided";
|
|
18
|
+
readonly featuresMidiIn: "hosting.features.midi-in-fed-empty";
|
|
19
|
+
readonly featuresMissing: "hosting.features.missing";
|
|
20
|
+
readonly featuresPortsUnreadable: "hosting.features.ports-unreadable";
|
|
21
|
+
readonly featuresProvided: "hosting.features.all-provided";
|
|
22
|
+
readonly featuresUnscanned: "hosting.features.scan-predates-field";
|
|
23
|
+
readonly latencyNonconforming: "hosting.latency.nonconforming";
|
|
24
|
+
readonly latencyParameterDependent: "hosting.latency.parameter-dependent";
|
|
25
|
+
readonly latencyResolved: "hosting.latency.resolved";
|
|
26
|
+
readonly latencyUnmeasured: "hosting.latency.unmeasured";
|
|
27
|
+
readonly outputNonFinite: "hosting.output.non-finite";
|
|
28
|
+
readonly overrideIsolated: "hosting.override.curator-isolated";
|
|
29
|
+
readonly patchBusy: "hosting.patch.busy";
|
|
30
|
+
readonly patchNotWritable: "hosting.patch.not-writable";
|
|
31
|
+
readonly patchTooLarge: "hosting.patch.too-large";
|
|
32
|
+
readonly presetNotFound: "hosting.preset.not-found";
|
|
33
|
+
readonly hostProvenanceDiffers: "hosting.provenance.host-differs";
|
|
34
|
+
readonly sweepControlDidNotFire: "hosting.provenance.sweep-control-did-not-fire";
|
|
35
|
+
readonly disabled: "hosting.disabled";
|
|
36
|
+
readonly linked: "hosting.linked";
|
|
37
|
+
readonly noRealisation: "hosting.no-realisation";
|
|
38
|
+
readonly realisedInProcess: "hosting.realised.in-process";
|
|
39
|
+
readonly unjudged: "hosting.unjudged";
|
|
40
|
+
readonly rtSafetyClean: "hosting.rt-safety.clean-under-sweep";
|
|
41
|
+
readonly rtSafetyNotReproducible: "hosting.rt-safety.not-reproducible";
|
|
42
|
+
readonly rtSafetyNotesClean: "hosting.rt-safety.clean-under-notes";
|
|
43
|
+
readonly rtSafetyNotesUnmeasured: "hosting.rt-safety.notes-unmeasured";
|
|
44
|
+
readonly rtSafetyNotesViolations: "hosting.rt-safety.violations-under-notes";
|
|
45
|
+
readonly rtSafetyUnmeasured: "hosting.rt-safety.unmeasured";
|
|
46
|
+
readonly rtSafetyViolations: "hosting.rt-safety.violations-in-run";
|
|
47
|
+
readonly stabilityBelowFloor: "hosting.stability.cycles-below-floor";
|
|
48
|
+
readonly stabilityCrashUnattributed: "hosting.stability.crash-unattributed";
|
|
49
|
+
readonly stabilityCrashedAttributed: "hosting.stability.crashed-attributed-plugin";
|
|
50
|
+
readonly stabilityCrashedLive: "hosting.stability.crashed-live-on-this-rig";
|
|
51
|
+
readonly stabilityLinksGuiToolkit: "hosting.stability.links-gui-toolkit";
|
|
52
|
+
readonly stabilitySoakFailedAtRate: "hosting.stability.soak-failed-at-rate";
|
|
53
|
+
readonly stabilitySoaked: "hosting.stability.soaked";
|
|
54
|
+
readonly stabilitySpawnsThreads: "hosting.stability.spawns-threads";
|
|
55
|
+
readonly stabilityUnmeasured: "hosting.stability.unmeasured";
|
|
56
|
+
readonly stabilityUnsoaked: "hosting.stability.unsoaked";
|
|
57
|
+
readonly stateNotACopy: "hosting.state.not-a-copy";
|
|
58
|
+
readonly statePathOnAudio: "hosting.state.path-on-audio";
|
|
59
|
+
readonly statePathOutside: "hosting.state.path-outside";
|
|
60
|
+
readonly statePathSymlink: "hosting.state.path-symlink";
|
|
61
|
+
readonly statePathTooLong: "hosting.state.path-too-long";
|
|
62
|
+
readonly statePathUnmakeable: "hosting.state.path-unmakeable";
|
|
63
|
+
readonly stateUnreadable: "hosting.state.unreadable";
|
|
64
|
+
readonly topologyAmbisonicConfig: "hosting.topology.ambisonic-config";
|
|
65
|
+
readonly topologyChannelMapUnknown: "hosting.topology.channel-map-unknown";
|
|
66
|
+
readonly topologyInstrument: "hosting.topology.instrument";
|
|
67
|
+
readonly topologyMatched: "hosting.topology.matched";
|
|
68
|
+
readonly topologyNoAudioInput: "hosting.topology.no-audio-input";
|
|
69
|
+
readonly topologyNoAudioOutput: "hosting.topology.no-audio-output";
|
|
70
|
+
readonly topologyPortTooWide: "hosting.topology.port-too-wide";
|
|
71
|
+
readonly topologyPortWithoutChannels: "hosting.topology.port-without-channels";
|
|
72
|
+
readonly topologyTooManyPorts: "hosting.topology.too-many-ports";
|
|
73
|
+
readonly topologyWiderThanStrip: "hosting.topology.wider-than-strip";
|
|
74
|
+
readonly workerNonconforming: "hosting.worker.nonconforming";
|
|
75
|
+
readonly idleHoldRefused: "hosting.idle.hold-refused";
|
|
76
|
+
}>;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
2
|
+
// Copyright (C) 2026 Pau Aliagas <linuxnow@gmail.com>
|
|
3
|
+
//
|
|
4
|
+
// GENERATED by tools/gen-hosting-codes.mjs from omx-clap-core's hosting tables — do not hand-edit.
|
|
5
|
+
//
|
|
6
|
+
// Regenerate: node tools/gen-hosting-codes.mjs --write
|
|
7
|
+
// Verify: node tools/gen-hosting-codes.mjs --check
|
|
8
|
+
/** omx-clap-core's hosting codes, by key: every `HOSTING_<DIMENSION>_CODES` table, flattened. */
|
|
9
|
+
export const HOSTING_CODE = Object.freeze({
|
|
10
|
+
"clapExtensionsNotCovered": "hosting.clap.extensions-not-covered",
|
|
11
|
+
"clapFormatNotHosted": "hosting.clap.format-not-hosted",
|
|
12
|
+
"clapHeadlessFailed": "hosting.clap.headless-failed",
|
|
13
|
+
"clapLatencyMismatch": "hosting.clap.latency-mismatch",
|
|
14
|
+
"clapNoteInput": "hosting.clap.note-input",
|
|
15
|
+
"clapProcessError": "hosting.clap.process-error",
|
|
16
|
+
"clapThreadViolation": "hosting.clap.thread-violation",
|
|
17
|
+
"clapUnqualified": "hosting.clap.unqualified",
|
|
18
|
+
"costAboveCeiling": "hosting.cost.above-ceiling",
|
|
19
|
+
"costFieldsMissing": "hosting.cost.fields-missing",
|
|
20
|
+
"costSpiky": "hosting.cost.spiky-tail",
|
|
21
|
+
"costUnmeasured": "hosting.cost.unmeasured-at-rate-and-quantum",
|
|
22
|
+
"costWithinCeiling": "hosting.cost.within-ceiling",
|
|
23
|
+
"featuresAtomInUnfed": "hosting.features.atom-in-unfed",
|
|
24
|
+
"featuresDisqualifying": "hosting.features.host-not-provided",
|
|
25
|
+
"featuresMidiIn": "hosting.features.midi-in-fed-empty",
|
|
26
|
+
"featuresMissing": "hosting.features.missing",
|
|
27
|
+
"featuresPortsUnreadable": "hosting.features.ports-unreadable",
|
|
28
|
+
"featuresProvided": "hosting.features.all-provided",
|
|
29
|
+
"featuresUnscanned": "hosting.features.scan-predates-field",
|
|
30
|
+
"latencyNonconforming": "hosting.latency.nonconforming",
|
|
31
|
+
"latencyParameterDependent": "hosting.latency.parameter-dependent",
|
|
32
|
+
"latencyResolved": "hosting.latency.resolved",
|
|
33
|
+
"latencyUnmeasured": "hosting.latency.unmeasured",
|
|
34
|
+
"outputNonFinite": "hosting.output.non-finite",
|
|
35
|
+
"overrideIsolated": "hosting.override.curator-isolated",
|
|
36
|
+
"patchBusy": "hosting.patch.busy",
|
|
37
|
+
"patchNotWritable": "hosting.patch.not-writable",
|
|
38
|
+
"patchTooLarge": "hosting.patch.too-large",
|
|
39
|
+
"presetNotFound": "hosting.preset.not-found",
|
|
40
|
+
"hostProvenanceDiffers": "hosting.provenance.host-differs",
|
|
41
|
+
"sweepControlDidNotFire": "hosting.provenance.sweep-control-did-not-fire",
|
|
42
|
+
"disabled": "hosting.disabled",
|
|
43
|
+
"linked": "hosting.linked",
|
|
44
|
+
"noRealisation": "hosting.no-realisation",
|
|
45
|
+
"realisedInProcess": "hosting.realised.in-process",
|
|
46
|
+
"unjudged": "hosting.unjudged",
|
|
47
|
+
"rtSafetyClean": "hosting.rt-safety.clean-under-sweep",
|
|
48
|
+
"rtSafetyNotReproducible": "hosting.rt-safety.not-reproducible",
|
|
49
|
+
"rtSafetyNotesClean": "hosting.rt-safety.clean-under-notes",
|
|
50
|
+
"rtSafetyNotesUnmeasured": "hosting.rt-safety.notes-unmeasured",
|
|
51
|
+
"rtSafetyNotesViolations": "hosting.rt-safety.violations-under-notes",
|
|
52
|
+
"rtSafetyUnmeasured": "hosting.rt-safety.unmeasured",
|
|
53
|
+
"rtSafetyViolations": "hosting.rt-safety.violations-in-run",
|
|
54
|
+
"stabilityBelowFloor": "hosting.stability.cycles-below-floor",
|
|
55
|
+
"stabilityCrashUnattributed": "hosting.stability.crash-unattributed",
|
|
56
|
+
"stabilityCrashedAttributed": "hosting.stability.crashed-attributed-plugin",
|
|
57
|
+
"stabilityCrashedLive": "hosting.stability.crashed-live-on-this-rig",
|
|
58
|
+
"stabilityLinksGuiToolkit": "hosting.stability.links-gui-toolkit",
|
|
59
|
+
"stabilitySoakFailedAtRate": "hosting.stability.soak-failed-at-rate",
|
|
60
|
+
"stabilitySoaked": "hosting.stability.soaked",
|
|
61
|
+
"stabilitySpawnsThreads": "hosting.stability.spawns-threads",
|
|
62
|
+
"stabilityUnmeasured": "hosting.stability.unmeasured",
|
|
63
|
+
"stabilityUnsoaked": "hosting.stability.unsoaked",
|
|
64
|
+
"stateNotACopy": "hosting.state.not-a-copy",
|
|
65
|
+
"statePathOnAudio": "hosting.state.path-on-audio",
|
|
66
|
+
"statePathOutside": "hosting.state.path-outside",
|
|
67
|
+
"statePathSymlink": "hosting.state.path-symlink",
|
|
68
|
+
"statePathTooLong": "hosting.state.path-too-long",
|
|
69
|
+
"statePathUnmakeable": "hosting.state.path-unmakeable",
|
|
70
|
+
"stateUnreadable": "hosting.state.unreadable",
|
|
71
|
+
"topologyAmbisonicConfig": "hosting.topology.ambisonic-config",
|
|
72
|
+
"topologyChannelMapUnknown": "hosting.topology.channel-map-unknown",
|
|
73
|
+
"topologyInstrument": "hosting.topology.instrument",
|
|
74
|
+
"topologyMatched": "hosting.topology.matched",
|
|
75
|
+
"topologyNoAudioInput": "hosting.topology.no-audio-input",
|
|
76
|
+
"topologyNoAudioOutput": "hosting.topology.no-audio-output",
|
|
77
|
+
"topologyPortTooWide": "hosting.topology.port-too-wide",
|
|
78
|
+
"topologyPortWithoutChannels": "hosting.topology.port-without-channels",
|
|
79
|
+
"topologyTooManyPorts": "hosting.topology.too-many-ports",
|
|
80
|
+
"topologyWiderThanStrip": "hosting.topology.wider-than-strip",
|
|
81
|
+
"workerNonconforming": "hosting.worker.nonconforming",
|
|
82
|
+
"idleHoldRefused": "hosting.idle.hold-refused",
|
|
83
|
+
});
|
|
84
|
+
//# sourceMappingURL=hosting-codes.generated.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosting-codes.generated.js","sourceRoot":"","sources":["../src/hosting-codes.generated.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,sDAAsD;AACtD,EAAE;AACF,mGAAmG;AACnG,EAAE;AACF,uDAAuD;AACvD,uDAAuD;AAEvD,iGAAiG;AACjG,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;IACxC,0BAA0B,EAAE,qCAAqC;IACjE,qBAAqB,EAAE,gCAAgC;IACvD,oBAAoB,EAAE,8BAA8B;IACpD,qBAAqB,EAAE,+BAA+B;IACtD,eAAe,EAAE,yBAAyB;IAC1C,kBAAkB,EAAE,4BAA4B;IAChD,qBAAqB,EAAE,+BAA+B;IACtD,iBAAiB,EAAE,0BAA0B;IAC7C,kBAAkB,EAAE,4BAA4B;IAChD,mBAAmB,EAAE,6BAA6B;IAClD,WAAW,EAAE,yBAAyB;IACtC,gBAAgB,EAAE,6CAA6C;IAC/D,mBAAmB,EAAE,6BAA6B;IAClD,qBAAqB,EAAE,gCAAgC;IACvD,uBAAuB,EAAE,oCAAoC;IAC7D,gBAAgB,EAAE,oCAAoC;IACtD,iBAAiB,EAAE,0BAA0B;IAC7C,yBAAyB,EAAE,mCAAmC;IAC9D,kBAAkB,EAAE,+BAA+B;IACnD,mBAAmB,EAAE,sCAAsC;IAC3D,sBAAsB,EAAE,+BAA+B;IACvD,2BAA2B,EAAE,qCAAqC;IAClE,iBAAiB,EAAE,0BAA0B;IAC7C,mBAAmB,EAAE,4BAA4B;IACjD,iBAAiB,EAAE,2BAA2B;IAC9C,kBAAkB,EAAE,mCAAmC;IACvD,WAAW,EAAE,oBAAoB;IACjC,kBAAkB,EAAE,4BAA4B;IAChD,eAAe,EAAE,yBAAyB;IAC1C,gBAAgB,EAAE,0BAA0B;IAC5C,uBAAuB,EAAE,iCAAiC;IAC1D,wBAAwB,EAAE,+CAA+C;IACzE,UAAU,EAAE,kBAAkB;IAC9B,QAAQ,EAAE,gBAAgB;IAC1B,eAAe,EAAE,wBAAwB;IACzC,mBAAmB,EAAE,6BAA6B;IAClD,UAAU,EAAE,kBAAkB;IAC9B,eAAe,EAAE,qCAAqC;IACtD,yBAAyB,EAAE,oCAAoC;IAC/D,oBAAoB,EAAE,qCAAqC;IAC3D,yBAAyB,EAAE,oCAAoC;IAC/D,yBAAyB,EAAE,0CAA0C;IACrE,oBAAoB,EAAE,8BAA8B;IACpD,oBAAoB,EAAE,qCAAqC;IAC3D,qBAAqB,EAAE,sCAAsC;IAC7D,4BAA4B,EAAE,sCAAsC;IACpE,4BAA4B,EAAE,6CAA6C;IAC3E,sBAAsB,EAAE,4CAA4C;IACpE,0BAA0B,EAAE,qCAAqC;IACjE,2BAA2B,EAAE,uCAAuC;IACpE,iBAAiB,EAAE,0BAA0B;IAC7C,wBAAwB,EAAE,kCAAkC;IAC5D,qBAAqB,EAAE,8BAA8B;IACrD,mBAAmB,EAAE,4BAA4B;IACjD,eAAe,EAAE,0BAA0B;IAC3C,kBAAkB,EAAE,6BAA6B;IACjD,kBAAkB,EAAE,4BAA4B;IAChD,kBAAkB,EAAE,4BAA4B;IAChD,kBAAkB,EAAE,6BAA6B;IACjD,qBAAqB,EAAE,+BAA+B;IACtD,iBAAiB,EAAE,0BAA0B;IAC7C,yBAAyB,EAAE,mCAAmC;IAC9D,2BAA2B,EAAE,sCAAsC;IACnE,oBAAoB,EAAE,6BAA6B;IACnD,iBAAiB,EAAE,0BAA0B;IAC7C,sBAAsB,EAAE,iCAAiC;IACzD,uBAAuB,EAAE,kCAAkC;IAC3D,qBAAqB,EAAE,gCAAgC;IACvD,6BAA6B,EAAE,wCAAwC;IACvE,sBAAsB,EAAE,iCAAiC;IACzD,wBAAwB,EAAE,mCAAmC;IAC7D,qBAAqB,EAAE,8BAA8B;IACrD,iBAAiB,EAAE,2BAA2B;CACtC,CAAC,CAAC"}
|
package/dist/hosting-codes.js
CHANGED
|
@@ -4,92 +4,15 @@
|
|
|
4
4
|
* The hosting verdict's message codes. Codes, never prose: the surface renders the operator's
|
|
5
5
|
* locale.
|
|
6
6
|
*
|
|
7
|
-
* omx-clap-core declares every hosting code
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
7
|
+
* omx-clap-core declares every hosting code: one `HOSTING_<DIMENSION>_CODES` table per dimension,
|
|
8
|
+
* in the TypeScript modules its package installs under `pkg-config --variable=tsdir omx-clap-core`
|
|
9
|
+
* (BUILDING.md). {@link HOSTING_CODE} is those tables flattened into one `key: code` map, written
|
|
10
|
+
* as plain data into `hosting-codes.generated.ts` by `tools/gen-hosting-codes.mjs` at build time:
|
|
11
|
+
* a code omx-clap-core does not declare cannot be named here, and this module reads no file and
|
|
12
|
+
* imports no `node:` module, so every public subpath that reaches it bundles for a browser.
|
|
13
|
+
* `src/contract-vocabulary-conformance.test.ts` holds the generated map to omx-clap-core's real
|
|
14
|
+
* modules, either way.
|
|
15
15
|
*/
|
|
16
|
-
import {
|
|
17
|
-
|
|
18
|
-
import { join } from "node:path";
|
|
19
|
-
import { fileURLToPath } from "node:url";
|
|
20
|
-
/** The two TypeScript modules omx-clap-core's `tsdir` carries, each a `HOSTING_<DIMENSION>_CODES` source. */
|
|
21
|
-
const CLAP_CORE_TS_MODULES = ["omx-clap-core-vocabulary.js", "omx-clap-core-hosting.js"];
|
|
22
|
-
/** This package's own root, resolved from this module so it follows wherever it is installed. */
|
|
23
|
-
const PACKAGE_ROOT = fileURLToPath(new URL("..", import.meta.url));
|
|
24
|
-
/** `native/fetch-deps.sh`'s own checkout of omx-clap-core, for a build with no omx-clap-core-devel installed. */
|
|
25
|
-
const DEPS_TS_DIR = join(PACKAGE_ROOT, "native/deps/omx-clap-core/ts");
|
|
26
|
-
/** Where `make install` of omx-clap-host puts them (BUILDING.md), for a run with no `pkg-config` binary at all. */
|
|
27
|
-
const DEFAULT_SYSTEM_TS_DIR = "/usr/share/omx-clap-core/ts";
|
|
28
|
-
/** `pkg-config --variable=tsdir omx-clap-core`, or `undefined` where pkg-config or the package is absent. */
|
|
29
|
-
function pkgConfigTsDir(env) {
|
|
30
|
-
try {
|
|
31
|
-
const out = execFileSync(env.PKG_CONFIG ?? "pkg-config", ["--variable=tsdir", "omx-clap-core"], {
|
|
32
|
-
encoding: "utf8",
|
|
33
|
-
stdio: ["ignore", "pipe", "ignore"],
|
|
34
|
-
}).trim();
|
|
35
|
-
return out === "" ? undefined : out;
|
|
36
|
-
}
|
|
37
|
-
catch {
|
|
38
|
-
return undefined;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Where omx-clap-core's TypeScript modules are looked for, in order: `OMX_CLAP_CORE_TSDIR` when
|
|
43
|
-
* set (and only that), else `pkg-config --variable=tsdir omx-clap-core`, else the checkout
|
|
44
|
-
* `native/fetch-deps.sh` stages, else the path `make install` of omx-clap-host uses by default —
|
|
45
|
-
* a packaged plugin-qualify's runtime has no `pkg-config` binary to ask.
|
|
46
|
-
*/
|
|
47
|
-
export function clapCoreTsDirCandidates(env = process.env) {
|
|
48
|
-
const set = env.OMX_CLAP_CORE_TSDIR;
|
|
49
|
-
if (set !== undefined && set !== "")
|
|
50
|
-
return [set];
|
|
51
|
-
const fromPkgConfig = pkgConfigTsDir(env);
|
|
52
|
-
return [...(fromPkgConfig === undefined ? [] : [fromPkgConfig]), DEPS_TS_DIR, DEFAULT_SYSTEM_TS_DIR];
|
|
53
|
-
}
|
|
54
|
-
function locateClapCoreTsDir() {
|
|
55
|
-
const candidates = clapCoreTsDirCandidates();
|
|
56
|
-
const dir = candidates.find((d) => CLAP_CORE_TS_MODULES.every((m) => existsSync(join(d, m))));
|
|
57
|
-
if (dir === undefined) {
|
|
58
|
-
throw new Error(`omx-clap-core's TypeScript modules (${CLAP_CORE_TS_MODULES.join(", ")}) were not found in any of: ` +
|
|
59
|
-
`${candidates.join(", ")}. Install omx-clap-core-devel (pkg-config omx-clap-core), set ` +
|
|
60
|
-
"OMX_CLAP_CORE_TSDIR to its tsdir, or run native/fetch-deps.sh.");
|
|
61
|
-
}
|
|
62
|
-
return dir;
|
|
63
|
-
}
|
|
64
|
-
/** True for an export name that is one of omx-clap-core's hosting tables. */
|
|
65
|
-
export function isHostingTableName(name) {
|
|
66
|
-
return /^HOSTING_[A-Z0-9_]+_CODES$/.test(name);
|
|
67
|
-
}
|
|
68
|
-
async function loadHostingTables() {
|
|
69
|
-
const dir = locateClapCoreTsDir();
|
|
70
|
-
const tables = {};
|
|
71
|
-
for (const name of CLAP_CORE_TS_MODULES) {
|
|
72
|
-
// The modules are self-contained ES modules in a directory with no package.json: Node 18 reads such a .js as
|
|
73
|
-
// CommonJS and refuses `export`, so the source is imported as a data: module, which is a module on every Node.
|
|
74
|
-
const source = readFileSync(join(dir, name), "utf8");
|
|
75
|
-
const mod = await import(`data:text/javascript;base64,${Buffer.from(source).toString("base64")}`);
|
|
76
|
-
for (const [exportName, table] of Object.entries(mod)) {
|
|
77
|
-
if (isHostingTableName(exportName))
|
|
78
|
-
tables[exportName] = table;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
return tables;
|
|
82
|
-
}
|
|
83
|
-
function flatten(tables) {
|
|
84
|
-
const table = {};
|
|
85
|
-
for (const [name, entries] of Object.entries(tables)) {
|
|
86
|
-
for (const [key, entry] of Object.entries(entries)) {
|
|
87
|
-
if (key in table)
|
|
88
|
-
throw new Error(`omx-clap-core declares the hosting key ${key} twice (${name})`);
|
|
89
|
-
table[key] = entry.code;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
return Object.freeze(table);
|
|
93
|
-
}
|
|
94
|
-
export const HOSTING_CODE = flatten(await loadHostingTables());
|
|
16
|
+
import { HOSTING_CODE } from "./hosting-codes.generated.js";
|
|
17
|
+
export { HOSTING_CODE };
|
|
95
18
|
//# sourceMappingURL=hosting-codes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hosting-codes.js","sourceRoot":"","sources":["../src/hosting-codes.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,sDAAsD;AACtD;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"hosting-codes.js","sourceRoot":"","sources":["../src/hosting-codes.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,sDAAsD;AACtD;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D,OAAO,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -117,6 +117,32 @@ export declare const LV2_HOSTING_BLOCK_FRAMES = 512;
|
|
|
117
117
|
export declare const LV2_HOSTING_LIFECYCLES = 30;
|
|
118
118
|
export declare const LV2_HOSTING_REPEATS = 3;
|
|
119
119
|
export declare const LV2_HOSTING_TIMEOUT_S = 240;
|
|
120
|
+
/**
|
|
121
|
+
* The scanned descriptors (owner spec 6.6 and 6.9): both scanners write one file per plugin into the
|
|
122
|
+
* directory the key `descriptor_dir` names, `<id>@<version>-<binary sha256 first DESCRIPTOR_HASH_PREFIX>.json`.
|
|
123
|
+
* With no directory named it is `$XDG_STATE_HOME/<DESCRIPTOR_DIR_STATE_SUBDIR>`, else
|
|
124
|
+
* `~/.local/state/<DESCRIPTOR_DIR_STATE_SUBDIR>`; a system service's is `DESCRIPTOR_DIR_SYSTEM`.
|
|
125
|
+
*/
|
|
126
|
+
export declare const DESCRIPTOR_DIR_KEY = "descriptor_dir";
|
|
127
|
+
export declare const DESCRIPTOR_DIR_STATE_SUBDIR = "omx/descriptors";
|
|
128
|
+
export declare const DESCRIPTOR_DIR_SYSTEM = "/var/lib/omx/descriptors";
|
|
129
|
+
export declare const DESCRIPTOR_HASH_PREFIX = 12;
|
|
130
|
+
/**
|
|
131
|
+
* The one descriptor schema both scanners hold a file to: omx-contract's, named by `DESCRIPTOR_SCHEMA_ENV`
|
|
132
|
+
* when set (a test, or a checkout pointing at another contract), else the omx-contract package this one
|
|
133
|
+
* depends on, else `DESCRIPTOR_SCHEMA_INSTALLED`. A written descriptor requires `DESCRIPTOR_SCHEMA_FLOOR`.
|
|
134
|
+
*/
|
|
135
|
+
export declare const DESCRIPTOR_SCHEMA_ENV = "OMX_CONTRACT_SCHEMA";
|
|
136
|
+
export declare const DESCRIPTOR_SCHEMA_INSTALLED = "/usr/share/omx-contract/omx-contract.schema.json";
|
|
137
|
+
export declare const DESCRIPTOR_SCHEMA_FLOOR = ">= 3.0.0";
|
|
138
|
+
/**
|
|
139
|
+
* Why a scanned descriptor is not written. A file the schema refuses is omx-contract's own
|
|
140
|
+
* `contract.file.invalid`; the others are the scanners' own.
|
|
141
|
+
*/
|
|
142
|
+
export declare const DESCRIPTOR_CODE_SCHEMA = "contract.file.invalid";
|
|
143
|
+
export declare const DESCRIPTOR_CODE_SCHEMA_MISSING = "qualify.descriptor.schema-missing";
|
|
144
|
+
export declare const DESCRIPTOR_CODE_BINARY_UNHASHED = "qualify.descriptor.binary-unhashed";
|
|
145
|
+
export declare const DESCRIPTOR_CODE_DIR_UNWRITABLE = "qualify.descriptor.dir-unwritable";
|
|
120
146
|
/** Every threshold, so none is baked into the code. */
|
|
121
147
|
export interface HostingPolicy {
|
|
122
148
|
/** Minimum instantiate/destroy lifecycles. The operator's §14.4 ruling: 1000. */
|
|
@@ -122,6 +122,32 @@ export const LV2_HOSTING_BLOCK_FRAMES = 512;
|
|
|
122
122
|
export const LV2_HOSTING_LIFECYCLES = 30;
|
|
123
123
|
export const LV2_HOSTING_REPEATS = 3;
|
|
124
124
|
export const LV2_HOSTING_TIMEOUT_S = 240;
|
|
125
|
+
/**
|
|
126
|
+
* The scanned descriptors (owner spec 6.6 and 6.9): both scanners write one file per plugin into the
|
|
127
|
+
* directory the key `descriptor_dir` names, `<id>@<version>-<binary sha256 first DESCRIPTOR_HASH_PREFIX>.json`.
|
|
128
|
+
* With no directory named it is `$XDG_STATE_HOME/<DESCRIPTOR_DIR_STATE_SUBDIR>`, else
|
|
129
|
+
* `~/.local/state/<DESCRIPTOR_DIR_STATE_SUBDIR>`; a system service's is `DESCRIPTOR_DIR_SYSTEM`.
|
|
130
|
+
*/
|
|
131
|
+
export const DESCRIPTOR_DIR_KEY = "descriptor_dir";
|
|
132
|
+
export const DESCRIPTOR_DIR_STATE_SUBDIR = "omx/descriptors";
|
|
133
|
+
export const DESCRIPTOR_DIR_SYSTEM = "/var/lib/omx/descriptors";
|
|
134
|
+
export const DESCRIPTOR_HASH_PREFIX = 12;
|
|
135
|
+
/**
|
|
136
|
+
* The one descriptor schema both scanners hold a file to: omx-contract's, named by `DESCRIPTOR_SCHEMA_ENV`
|
|
137
|
+
* when set (a test, or a checkout pointing at another contract), else the omx-contract package this one
|
|
138
|
+
* depends on, else `DESCRIPTOR_SCHEMA_INSTALLED`. A written descriptor requires `DESCRIPTOR_SCHEMA_FLOOR`.
|
|
139
|
+
*/
|
|
140
|
+
export const DESCRIPTOR_SCHEMA_ENV = "OMX_CONTRACT_SCHEMA";
|
|
141
|
+
export const DESCRIPTOR_SCHEMA_INSTALLED = "/usr/share/omx-contract/omx-contract.schema.json";
|
|
142
|
+
export const DESCRIPTOR_SCHEMA_FLOOR = ">= 3.0.0";
|
|
143
|
+
/**
|
|
144
|
+
* Why a scanned descriptor is not written. A file the schema refuses is omx-contract's own
|
|
145
|
+
* `contract.file.invalid`; the others are the scanners' own.
|
|
146
|
+
*/
|
|
147
|
+
export const DESCRIPTOR_CODE_SCHEMA = "contract.file.invalid";
|
|
148
|
+
export const DESCRIPTOR_CODE_SCHEMA_MISSING = "qualify.descriptor.schema-missing";
|
|
149
|
+
export const DESCRIPTOR_CODE_BINARY_UNHASHED = "qualify.descriptor.binary-unhashed";
|
|
150
|
+
export const DESCRIPTOR_CODE_DIR_UNWRITABLE = "qualify.descriptor.dir-unwritable";
|
|
125
151
|
/**
|
|
126
152
|
* Defaults. The cycle floor is the operator's ruling of 2026-09-05 (§14.4, option c) and the
|
|
127
153
|
* soak is §3's default show length. The per-instance cost ceiling is the HOST's budget and
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qualify-declarations.js","sourceRoot":"","sources":["../src/qualify-declarations.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"qualify-declarations.js","sourceRoot":"","sources":["../src/qualify-declarations.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,sDAAsD;AACtD,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE7E;;;;GAIG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAEzC;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AAEnC,kFAAkF;AAClF,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAEvC;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,CAAC;AAE5C,yHAAyH;AACzH,MAAM,CAAC,MAAM,aAAa,GAAsB,kBAAkB,CAAC;AAEnE,iJAAiJ;AACjJ,MAAM,CAAC,MAAM,cAAc,GAAsB,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC;AAEpG,wGAAwG;AACxG,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAEnC,0FAA0F;AAC1F,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC;AAElC,8FAA8F;AAC9F,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AAEjC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,CAAC;AAChC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAElC;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AACrC,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEvC,sGAAsG;AACtG,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAErC;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,eAAe,CAAC;AAClD,MAAM,CAAC,MAAM,sBAAsB,GAAG,eAAe,CAAC;AAEtD;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,WAAW,CAAC;AACzC,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC;AACrC,MAAM,CAAC,MAAM,eAAe,GAAG,eAAe,CAAC;AAC/C,0IAA0I;AAC1I,MAAM,CAAC,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAEzD;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,kBAAkB,CAAC;AACnD,MAAM,CAAC,MAAM,oBAAoB,GAAG,oBAAoB,CAAC;AAEzD,sFAAsF;AACtF,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEvC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,kBAAkB,CAAC;AACxD,MAAM,CAAC,MAAM,oBAAoB,GAAG,iBAAiB,CAAC;AACtD,MAAM,CAAC,MAAM,gBAAgB,GAAG,kBAAkB,CAAC;AACnD,MAAM,CAAC,MAAM,uBAAuB,GAAG,oBAAoB,CAAC;AAE5D,8EAA8E;AAC9E,MAAM,CAAC,MAAM,sBAAsB,GAAG,cAAc,CAAC;AACrD,MAAM,CAAC,MAAM,qBAAqB,GAAG,aAAa,CAAC;AACnD,MAAM,CAAC,MAAM,iBAAiB,GAAG,iBAAiB,CAAC;AACnD,MAAM,CAAC,MAAM,wBAAwB,GAAG,gBAAgB,CAAC;AAEzD;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAA+D;IACtF,EAAE,IAAI,EAAE,sBAAsB,EAAE,GAAG,EAAE,qBAAqB,EAAE;IAC5D,EAAE,IAAI,EAAE,qBAAqB,EAAE,GAAG,EAAE,oBAAoB,EAAE;IAC1D,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,gBAAgB,EAAE;IAClD,EAAE,IAAI,EAAE,wBAAwB,EAAE,GAAG,EAAE,uBAAuB,EAAE;CACjE,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAsB,CAAC,6BAA6B,EAAE,yBAAyB,CAAC,CAAC;AAE9G,2GAA2G;AAC3G,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AACrC,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAErC,yFAAyF;AACzF,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAE1C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAC5C,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AACzC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AACrC,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;AACnD,MAAM,CAAC,MAAM,2BAA2B,GAAG,iBAAiB,CAAC;AAC7D,MAAM,CAAC,MAAM,qBAAqB,GAAG,0BAA0B,CAAC;AAChE,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAEzC;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,qBAAqB,CAAC;AAC3D,MAAM,CAAC,MAAM,2BAA2B,GAAG,kDAAkD,CAAC;AAC9F,MAAM,CAAC,MAAM,uBAAuB,GAAG,UAAU,CAAC;AAElD;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,uBAAuB,CAAC;AAC9D,MAAM,CAAC,MAAM,8BAA8B,GAAG,mCAAmC,CAAC;AAClF,MAAM,CAAC,MAAM,+BAA+B,GAAG,oCAAoC,CAAC;AACpF,MAAM,CAAC,MAAM,8BAA8B,GAAG,mCAAmC,CAAC;AAsBlF;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAkB;IACnD,UAAU,EAAE,IAAI;IAChB,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE;IACxB,oBAAoB,EAAE,CAAC;IACvB,cAAc,EAAE,EAAE;CACnB,CAAC;AAOF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,mBAAmB,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,cAAc,EAAE;IACtG,IAAI,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,GAAG,EAAE;IAC1E,UAAU,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,GAAG,EAAE;IAChF,eAAe,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,GAAG,EAAE;CAC9B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openmixer/plugin-qualify",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.1",
|
|
4
4
|
"description": "Qualify audio plugins for real-time hosting: scan, offline latency and cost measurement, a mod-host hosting sweep, and a fail-closed rating.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "GPL-3.0-or-later",
|
|
@@ -77,12 +77,12 @@
|
|
|
77
77
|
"LICENSE"
|
|
78
78
|
],
|
|
79
79
|
"scripts": {
|
|
80
|
-
"build": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.json",
|
|
80
|
+
"build": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && node tools/gen-hosting-codes.mjs --build && tsc -p tsconfig.json",
|
|
81
81
|
"prepare": "npm run build",
|
|
82
82
|
"test": "vitest run src",
|
|
83
83
|
"lint": "tsc -p tsconfig.lint.json",
|
|
84
84
|
"test:py": "python3 -m pytest tools -q",
|
|
85
|
-
"check:generated": "node tools/gen-python-declarations.mjs --check",
|
|
85
|
+
"check:generated": "node tools/gen-python-declarations.mjs --check && node tools/gen-hosting-codes.mjs --check",
|
|
86
86
|
"check:private-refs": "tools/private-refs-check.sh && tools/private-refs-check.sh --self-test"
|
|
87
87
|
},
|
|
88
88
|
"devDependencies": {
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
2
|
+
// Copyright (C) 2026 Pau Aliagas <linuxnow@gmail.com>
|
|
3
|
+
//
|
|
4
|
+
// GENERATED by tools/gen-hosting-codes.mjs from omx-clap-core's hosting tables — do not hand-edit.
|
|
5
|
+
//
|
|
6
|
+
// Regenerate: node tools/gen-hosting-codes.mjs --write
|
|
7
|
+
// Verify: node tools/gen-hosting-codes.mjs --check
|
|
8
|
+
|
|
9
|
+
/** omx-clap-core's hosting codes, by key: every `HOSTING_<DIMENSION>_CODES` table, flattened. */
|
|
10
|
+
export const HOSTING_CODE = Object.freeze({
|
|
11
|
+
"clapExtensionsNotCovered": "hosting.clap.extensions-not-covered",
|
|
12
|
+
"clapFormatNotHosted": "hosting.clap.format-not-hosted",
|
|
13
|
+
"clapHeadlessFailed": "hosting.clap.headless-failed",
|
|
14
|
+
"clapLatencyMismatch": "hosting.clap.latency-mismatch",
|
|
15
|
+
"clapNoteInput": "hosting.clap.note-input",
|
|
16
|
+
"clapProcessError": "hosting.clap.process-error",
|
|
17
|
+
"clapThreadViolation": "hosting.clap.thread-violation",
|
|
18
|
+
"clapUnqualified": "hosting.clap.unqualified",
|
|
19
|
+
"costAboveCeiling": "hosting.cost.above-ceiling",
|
|
20
|
+
"costFieldsMissing": "hosting.cost.fields-missing",
|
|
21
|
+
"costSpiky": "hosting.cost.spiky-tail",
|
|
22
|
+
"costUnmeasured": "hosting.cost.unmeasured-at-rate-and-quantum",
|
|
23
|
+
"costWithinCeiling": "hosting.cost.within-ceiling",
|
|
24
|
+
"featuresAtomInUnfed": "hosting.features.atom-in-unfed",
|
|
25
|
+
"featuresDisqualifying": "hosting.features.host-not-provided",
|
|
26
|
+
"featuresMidiIn": "hosting.features.midi-in-fed-empty",
|
|
27
|
+
"featuresMissing": "hosting.features.missing",
|
|
28
|
+
"featuresPortsUnreadable": "hosting.features.ports-unreadable",
|
|
29
|
+
"featuresProvided": "hosting.features.all-provided",
|
|
30
|
+
"featuresUnscanned": "hosting.features.scan-predates-field",
|
|
31
|
+
"latencyNonconforming": "hosting.latency.nonconforming",
|
|
32
|
+
"latencyParameterDependent": "hosting.latency.parameter-dependent",
|
|
33
|
+
"latencyResolved": "hosting.latency.resolved",
|
|
34
|
+
"latencyUnmeasured": "hosting.latency.unmeasured",
|
|
35
|
+
"outputNonFinite": "hosting.output.non-finite",
|
|
36
|
+
"overrideIsolated": "hosting.override.curator-isolated",
|
|
37
|
+
"patchBusy": "hosting.patch.busy",
|
|
38
|
+
"patchNotWritable": "hosting.patch.not-writable",
|
|
39
|
+
"patchTooLarge": "hosting.patch.too-large",
|
|
40
|
+
"presetNotFound": "hosting.preset.not-found",
|
|
41
|
+
"hostProvenanceDiffers": "hosting.provenance.host-differs",
|
|
42
|
+
"sweepControlDidNotFire": "hosting.provenance.sweep-control-did-not-fire",
|
|
43
|
+
"disabled": "hosting.disabled",
|
|
44
|
+
"linked": "hosting.linked",
|
|
45
|
+
"noRealisation": "hosting.no-realisation",
|
|
46
|
+
"realisedInProcess": "hosting.realised.in-process",
|
|
47
|
+
"unjudged": "hosting.unjudged",
|
|
48
|
+
"rtSafetyClean": "hosting.rt-safety.clean-under-sweep",
|
|
49
|
+
"rtSafetyNotReproducible": "hosting.rt-safety.not-reproducible",
|
|
50
|
+
"rtSafetyNotesClean": "hosting.rt-safety.clean-under-notes",
|
|
51
|
+
"rtSafetyNotesUnmeasured": "hosting.rt-safety.notes-unmeasured",
|
|
52
|
+
"rtSafetyNotesViolations": "hosting.rt-safety.violations-under-notes",
|
|
53
|
+
"rtSafetyUnmeasured": "hosting.rt-safety.unmeasured",
|
|
54
|
+
"rtSafetyViolations": "hosting.rt-safety.violations-in-run",
|
|
55
|
+
"stabilityBelowFloor": "hosting.stability.cycles-below-floor",
|
|
56
|
+
"stabilityCrashUnattributed": "hosting.stability.crash-unattributed",
|
|
57
|
+
"stabilityCrashedAttributed": "hosting.stability.crashed-attributed-plugin",
|
|
58
|
+
"stabilityCrashedLive": "hosting.stability.crashed-live-on-this-rig",
|
|
59
|
+
"stabilityLinksGuiToolkit": "hosting.stability.links-gui-toolkit",
|
|
60
|
+
"stabilitySoakFailedAtRate": "hosting.stability.soak-failed-at-rate",
|
|
61
|
+
"stabilitySoaked": "hosting.stability.soaked",
|
|
62
|
+
"stabilitySpawnsThreads": "hosting.stability.spawns-threads",
|
|
63
|
+
"stabilityUnmeasured": "hosting.stability.unmeasured",
|
|
64
|
+
"stabilityUnsoaked": "hosting.stability.unsoaked",
|
|
65
|
+
"stateNotACopy": "hosting.state.not-a-copy",
|
|
66
|
+
"statePathOnAudio": "hosting.state.path-on-audio",
|
|
67
|
+
"statePathOutside": "hosting.state.path-outside",
|
|
68
|
+
"statePathSymlink": "hosting.state.path-symlink",
|
|
69
|
+
"statePathTooLong": "hosting.state.path-too-long",
|
|
70
|
+
"statePathUnmakeable": "hosting.state.path-unmakeable",
|
|
71
|
+
"stateUnreadable": "hosting.state.unreadable",
|
|
72
|
+
"topologyAmbisonicConfig": "hosting.topology.ambisonic-config",
|
|
73
|
+
"topologyChannelMapUnknown": "hosting.topology.channel-map-unknown",
|
|
74
|
+
"topologyInstrument": "hosting.topology.instrument",
|
|
75
|
+
"topologyMatched": "hosting.topology.matched",
|
|
76
|
+
"topologyNoAudioInput": "hosting.topology.no-audio-input",
|
|
77
|
+
"topologyNoAudioOutput": "hosting.topology.no-audio-output",
|
|
78
|
+
"topologyPortTooWide": "hosting.topology.port-too-wide",
|
|
79
|
+
"topologyPortWithoutChannels": "hosting.topology.port-without-channels",
|
|
80
|
+
"topologyTooManyPorts": "hosting.topology.too-many-ports",
|
|
81
|
+
"topologyWiderThanStrip": "hosting.topology.wider-than-strip",
|
|
82
|
+
"workerNonconforming": "hosting.worker.nonconforming",
|
|
83
|
+
"idleHoldRefused": "hosting.idle.hold-refused",
|
|
84
|
+
} as const);
|