@openmixer/plugin-qualify 0.8.0 → 0.10.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.
Files changed (63) hide show
  1. package/README.md +58 -4
  2. package/bin/plugin-qualify.mjs +60 -25
  3. package/dist/clap-loader.d.ts +25 -1
  4. package/dist/clap-loader.js +88 -7
  5. package/dist/clap-loader.js.map +1 -1
  6. package/dist/clap-qualify.d.ts +29 -6
  7. package/dist/clap-qualify.js +77 -13
  8. package/dist/clap-qualify.js.map +1 -1
  9. package/dist/host-profiles.d.ts +14 -0
  10. package/dist/host-profiles.js +27 -1
  11. package/dist/host-profiles.js.map +1 -1
  12. package/dist/hosting-codes.d.ts +5 -2
  13. package/dist/hosting-codes.js +8 -4
  14. package/dist/hosting-codes.js.map +1 -1
  15. package/dist/hosting-suitability.d.ts +32 -3
  16. package/dist/hosting-suitability.js +35 -6
  17. package/dist/hosting-suitability.js.map +1 -1
  18. package/dist/index.d.ts +1 -0
  19. package/dist/index.js +1 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/lv2-loader.d.ts +5 -0
  22. package/dist/lv2-loader.js +30 -2
  23. package/dist/lv2-loader.js.map +1 -1
  24. package/dist/measure-host.js +2 -2
  25. package/dist/measurement/cli.d.ts +13 -0
  26. package/dist/measurement/cli.js +68 -2
  27. package/dist/measurement/cli.js.map +1 -1
  28. package/dist/measurement/format.d.ts +1 -1
  29. package/dist/measurement/vocabulary.d.ts +1 -1
  30. package/dist/measurement/vocabulary.js +1 -1
  31. package/dist/measurement/vocabulary.js.map +1 -1
  32. package/dist/pins-file.d.ts +76 -0
  33. package/dist/pins-file.js +165 -0
  34. package/dist/pins-file.js.map +1 -0
  35. package/dist/qualify-cli.d.ts +2 -0
  36. package/dist/qualify-cli.js +7 -1
  37. package/dist/qualify-cli.js.map +1 -1
  38. package/dist/qualify-declarations.d.ts +23 -4
  39. package/dist/qualify-declarations.js +19 -3
  40. package/dist/qualify-declarations.js.map +1 -1
  41. package/dist/qualify-options.js +6 -1
  42. package/dist/qualify-options.js.map +1 -1
  43. package/package.json +3 -2
  44. package/src/clap-loader.ts +99 -7
  45. package/src/clap-qualify.ts +89 -12
  46. package/src/host-profiles.ts +29 -1
  47. package/src/hosting-codes.ts +8 -4
  48. package/src/hosting-suitability.ts +61 -8
  49. package/src/index.ts +1 -0
  50. package/src/lv2-loader.ts +28 -2
  51. package/src/measure-host.ts +2 -2
  52. package/src/measurement/cli.ts +77 -2
  53. package/src/measurement/format.ts +1 -1
  54. package/src/measurement/vocabulary.ts +1 -1
  55. package/src/pins-file.ts +200 -0
  56. package/src/qualify-cli.ts +8 -1
  57. package/src/qualify-declarations.ts +21 -4
  58. package/src/qualify-options.ts +7 -1
  59. package/tools/ai-trace-commit-check.sh +114 -0
  60. package/tools/ai-trace-patterns.json +33 -0
  61. package/tools/benchmark.py +1 -1
  62. package/tools/lv2-measure.mjs +16 -0
  63. package/tools/private-refs-check.sh +90 -0
@@ -0,0 +1,165 @@
1
+ // SPDX-License-Identifier: GPL-3.0-or-later
2
+ // Copyright (C) 2026 Pau Aliagas <linuxnow@gmail.com>
3
+ /**
4
+ * The pins file `plugin-qualify --pins <file>` writes and plugin-hostd loads (`pin_file` in its settings, or its
5
+ * pin store's import): one line per qualified plugin, the SAME line as hostd's `pin_set` verb, with the
6
+ * qualification verdict as a last word.
7
+ *
8
+ * pin_set <uri> <path>=<sha256>[,<path>=<sha256>...] <scheme>:<sha256> [verdict=<word>]
9
+ *
10
+ * The digests and the layout are the prober's, raw (`IntegrityMeasurement`); nothing here computes a hash. A plugin
11
+ * whose run took no whole pin has no line: a pins file never holds a partial pin. The grammar is plugin-hostd's
12
+ * (`include/plugin-hostd/protocol.h`, PHD_PIN_*); `parsePinLine` reads a line back with the daemon's rules, so a
13
+ * writer that drifts from them is a red test and not a refused add.
14
+ */
15
+ import { resolve } from "node:path";
16
+ /** The verb the line starts with in a pins file, hostd's `PHD_VERB_PIN_SET`. */
17
+ export const PIN_VERB = "pin_set";
18
+ /** The key of the verdict word, hostd's `PHD_PIN_VERDICT_KEY`. */
19
+ export const PIN_VERDICT_KEY = "verdict=";
20
+ /** The verdict words hostd knows (`PHD_PIN_VERDICTS`). */
21
+ export const PIN_VERDICTS = ["in-process", "isolated", "refused"];
22
+ /**
23
+ * What a rating says about where the plugin may run, in hostd's words. `suitable` is qualified for a worker that other
24
+ * plugins share. `conditional` loads and is isolated. `unsuitable` is measured to fail and is `refused`. `unknown` is no
25
+ * opinion: no verdict word, and hostd treats the plugin as not qualified.
26
+ */
27
+ export function pinVerdictOf(rating) {
28
+ switch (rating) {
29
+ case "suitable":
30
+ return "in-process";
31
+ case "conditional":
32
+ return "isolated";
33
+ case "unsuitable":
34
+ return "refused";
35
+ case "unknown":
36
+ return undefined;
37
+ }
38
+ }
39
+ /** The line of one pin, or `undefined` when the integrity block is not a whole pin. A uri with whitespace in it would be read back as more words: it is refused, by name. */
40
+ export function pinLine(entry) {
41
+ const spaced = [entry.uri, ...(entry.integrity.files ?? []).map((f) => f.path)].find((w) => /\s/.test(w));
42
+ if (spaced !== undefined) {
43
+ throw new Error(`${entry.uri}: ${JSON.stringify(spaced)} has whitespace in it and cannot be a word of a pin line`);
44
+ }
45
+ const { files, layout } = entry.integrity;
46
+ if (files === undefined || files.length === 0 || layout === undefined)
47
+ return undefined;
48
+ const list = files.map((f) => `${f.path}=${f.sha256}`).join(",");
49
+ const verdict = entry.verdict === undefined ? "" : ` ${PIN_VERDICT_KEY}${entry.verdict}`;
50
+ return `${PIN_VERB} ${entry.uri} ${list} ${layout.scheme}:${layout.sha256}${verdict}`;
51
+ }
52
+ /** hostd's uri of a CLAP plugin the prober loaded: its file as it was handed, made absolute, and its id. */
53
+ export function clapPinUri(binaryPath, pluginUri) {
54
+ const id = pluginUri.startsWith("urn:clap:") ? pluginUri.slice("urn:clap:".length) : pluginUri;
55
+ return `clap:${resolve(binaryPath)}#${id}`;
56
+ }
57
+ /**
58
+ * The file: a comment that says where it came from, then one line per plugin, sorted by uri. A uri given twice keeps
59
+ * the entry whose verdict is the worse one (`refused` over `isolated` over `in-process`, no word over all), so a
60
+ * plugin found twice is never pinned more kindly than its worst measurement.
61
+ */
62
+ export function pinsFile(entries) {
63
+ const byUri = new Map();
64
+ const verdictOf = new Map();
65
+ const skipped = [];
66
+ const refused = [];
67
+ const rank = (v) => (v === undefined ? 4 : { "in-process": 1, isolated: 2, refused: 3 }[v]);
68
+ for (const entry of entries) {
69
+ let line;
70
+ try {
71
+ line = pinLine(entry);
72
+ }
73
+ catch (e) {
74
+ refused.push({ uri: entry.uri, problem: e.message });
75
+ continue;
76
+ }
77
+ if (line === undefined) {
78
+ skipped.push(entry.uri);
79
+ continue;
80
+ }
81
+ if (byUri.has(entry.uri) && rank(verdictOf.get(entry.uri)) >= rank(entry.verdict))
82
+ continue;
83
+ byUri.set(entry.uri, line);
84
+ verdictOf.set(entry.uri, entry.verdict);
85
+ }
86
+ const uris = [...byUri.keys()].sort();
87
+ const text = [
88
+ "# written by plugin-qualify --pins; plugin-hostd reads it with pin_file",
89
+ ...uris.map((u) => byUri.get(u)),
90
+ "",
91
+ ].join("\n");
92
+ return { text, written: uris, skipped: skipped.filter((u) => !byUri.has(u)), refused };
93
+ }
94
+ /**
95
+ * The entries of a CLAP pass for one host: each document of that host's profile with its pin and the verdict its
96
+ * rating says. The documents of other profiles are ignored; a pins file is for one host.
97
+ */
98
+ export function clapPinEntries(documents, host) {
99
+ return documents
100
+ .filter((d) => d.console === host)
101
+ .map((d) => {
102
+ const verdict = pinVerdictOf(d.verdict.rating);
103
+ return {
104
+ uri: clapPinUri(d.plugin.binary.path, d.plugin.uri),
105
+ integrity: d.measured.integrity,
106
+ ...(verdict === undefined ? {} : { verdict }),
107
+ };
108
+ });
109
+ }
110
+ /**
111
+ * The entries of an LV2 run: each measured plugin with a pin and the verdict row of that host. A plugin with no verdict
112
+ * row for the host is pinned without a verdict word.
113
+ */
114
+ export function measuredPinEntries(plugins, verdicts, host) {
115
+ return plugins.flatMap((p) => {
116
+ if (p.integrity === undefined)
117
+ return [];
118
+ const row = verdicts.find((v) => v.uri === p.uri && v.host === host);
119
+ const verdict = row === undefined || !row.measured ? undefined : pinVerdictOf(row.rating);
120
+ return [{ uri: p.uri, integrity: p.integrity, ...(verdict === undefined ? {} : { verdict }) }];
121
+ });
122
+ }
123
+ const HEX = /^[0-9a-f]{64}$/;
124
+ /**
125
+ * hostd's grammar for a pin line, the verb optional; `undefined` for a blank or comment line, and a thrown Error for a
126
+ * line the daemon would refuse (a path holding a separator, a path that climbs out of the bundle, a digest that is not
127
+ * 64 lowercase hex digits, a layout without a scheme, a verdict outside the vocabulary, a path named twice).
128
+ */
129
+ export function parsePinLine(line) {
130
+ const words = line.trim().split(/\s+/).filter((w) => w !== "");
131
+ if (words.length === 0 || words[0].startsWith("#"))
132
+ return undefined;
133
+ if (words[0] === PIN_VERB)
134
+ words.shift();
135
+ if (words.length !== 3 && words.length !== 4)
136
+ throw new Error(`a pin line has 3 or 4 words, not ${words.length}`);
137
+ const [uri, list, layout, verdictWord] = words;
138
+ const files = list.split(",").map((item) => {
139
+ const eq = item.lastIndexOf("=");
140
+ if (eq < 0)
141
+ throw new Error(`${item}: no =`);
142
+ const path = item.slice(0, eq);
143
+ const sha256 = item.slice(eq + 1);
144
+ if (path === "" || path.startsWith("/") || path.split("/").some((part) => part === "" || part === "..")) {
145
+ throw new Error(`${path}: not a path inside the bundle`);
146
+ }
147
+ if (!HEX.test(sha256))
148
+ throw new Error(`${path}: not a sha256`);
149
+ return { path, sha256 };
150
+ });
151
+ if (new Set(files.map((f) => f.path)).size !== files.length)
152
+ throw new Error("a path is named twice");
153
+ const colon = layout.lastIndexOf(":");
154
+ if (colon <= 0 || !HEX.test(layout.slice(colon + 1)))
155
+ throw new Error(`${layout}: not a layout pin`);
156
+ let verdict;
157
+ if (verdictWord !== undefined) {
158
+ const word = verdictWord.startsWith(PIN_VERDICT_KEY) ? verdictWord.slice(PIN_VERDICT_KEY.length) : "";
159
+ if (!PIN_VERDICTS.includes(word))
160
+ throw new Error(`${verdictWord}: not a verdict`);
161
+ verdict = word;
162
+ }
163
+ return { uri, files, layout: { scheme: layout.slice(0, colon), sha256: layout.slice(colon + 1) }, ...(verdict === undefined ? {} : { verdict }) };
164
+ }
165
+ //# sourceMappingURL=pins-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pins-file.js","sourceRoot":"","sources":["../src/pins-file.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,8 @@ export interface QualifyArgs {
10
10
  readonly rates: readonly number[];
11
11
  readonly quanta: readonly number[];
12
12
  readonly out?: string;
13
+ /** `--pins`: where the pins file is written. */
14
+ readonly pins?: string;
13
15
  readonly format: OutputFormat;
14
16
  readonly isolate: boolean;
15
17
  readonly hostSweep: boolean;
@@ -67,6 +67,9 @@ export function parseQualifyArgs(argv) {
67
67
  return { ok: false, error: `--format must be one of ${OUTPUT_FORMATS.join(", ")}` };
68
68
  }
69
69
  const out = seen.get("--out");
70
+ const pins = seen.get("--pins");
71
+ if (pins !== undefined && pins.startsWith("--"))
72
+ return { ok: false, error: "--pins needs a file name" };
70
73
  const hostProfiles = [...new Set(profileSpecs.length > 0 ? profileSpecs : [defaultOf("--host-profile")])];
71
74
  return {
72
75
  ok: true,
@@ -76,6 +79,7 @@ export function parseQualifyArgs(argv) {
76
79
  rates,
77
80
  quanta,
78
81
  ...(out === undefined ? {} : { out }),
82
+ ...(pins === undefined ? {} : { pins }),
79
83
  format: format,
80
84
  isolate: seen.has("--isolate"),
81
85
  hostSweep: !seen.has("--no-host-sweep"),
@@ -94,7 +98,9 @@ export function helpText() {
94
98
  "plugin-qualify — qualify audio plugins for real-time hosting",
95
99
  "",
96
100
  " plugin-qualify <uri|bundle-path>... exactly the named plugins; a .lv2 bundle = every plugin in it",
97
- " plugin-qualify --all every plugin lilv finds (LV2_PATH honoured)",
101
+ " plugin-qualify --all every CLAP plugin on CLAP_PATH, then ~/.clap, then /usr/lib/clap;",
102
+ " refuses (exit 2) when LV2 bundles are on the LV2 path (LV2_PATH),",
103
+ " which this entry point cannot measure",
98
104
  "",
99
105
  ...rows,
100
106
  "",
@@ -1 +1 @@
1
- {"version":3,"file":"qualify-cli.js","sourceRoot":"","sources":["../src/qualify-cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"qualify-cli.js","sourceRoot":"","sources":["../src/qualify-cli.ts"],"names":[],"mappings":"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"}
@@ -53,20 +53,32 @@ export declare const SOAK_CALIBRATION_S = 30;
53
53
  */
54
54
  export declare const CLAP_SCAN_TOOL_ENV = "OMX_CLAP_SCAN";
55
55
  export declare const CLAP_SCAN_TOOL_DEFAULT = "omx-clap-scan";
56
+ /**
57
+ * The standard CLAP search path `--all` walks, in this order: every directory `CLAP_PATH` names
58
+ * (colon-separated), then `~/.clap`, then `/usr/lib/clap`. The system directory is the same on
59
+ * every distribution and architecture; it is never the library directory (`/usr/lib64`).
60
+ */
61
+ export declare const CLAP_PATH_ENV = "CLAP_PATH";
62
+ export declare const CLAP_USER_DIR = ".clap";
63
+ export declare const CLAP_SYSTEM_DIR = "/usr/lib/clap";
56
64
  /** Seconds one run of the CLAP scanner may take over everything it was pointed at. */
57
65
  export declare const CLAP_SCAN_TIMEOUT_S = 300;
58
66
  /**
59
- * The CLAP prober (`native/clap-qualify.c`), the LV2 measurer (`native/lv2-measure.c`) and the
60
- * interposer both run under (`native/rt-interpose.c`): each located by one environment variable, else
61
- * the package's own build in `native/build/`, else the first of `NATIVE_TOOL_DIRS` that holds it.
67
+ * The CLAP prober (`native/clap-qualify.c`), the LV2 measurer (`native/lv2-measure.c`), the
68
+ * interposer both run under (`native/rt-interpose.c`) and the LV2 host probe
69
+ * (`native/lv2-host-probe.c`, a worker plugin driven through lilv as a host drives it, for a console
70
+ * that exports an LV2 plugin to test its host-facing half): each located by one environment variable,
71
+ * else the package's own build in `native/build/`, else the first of `NATIVE_TOOL_DIRS` that holds it.
62
72
  */
63
73
  export declare const CLAP_QUALIFY_TOOL_ENV = "OMX_CLAP_QUALIFY";
64
74
  export declare const LV2_MEASURE_TOOL_ENV = "OMX_LV2_MEASURE";
65
75
  export declare const RT_INTERPOSE_ENV = "OMX_RT_INTERPOSE";
76
+ export declare const LV2_HOST_PROBE_TOOL_ENV = "OMX_LV2_HOST_PROBE";
66
77
  /** The file names of the native tools, in every place they are looked for. */
67
78
  export declare const CLAP_QUALIFY_TOOL_NAME = "clap-qualify";
68
79
  export declare const LV2_MEASURE_TOOL_NAME = "lv2_measure";
69
80
  export declare const RT_INTERPOSE_NAME = "rt_interpose.so";
81
+ export declare const LV2_HOST_PROBE_TOOL_NAME = "lv2_host_probe";
70
82
  /**
71
83
  * The ONE list of the native tools the packages install, each with the setting that names it.
72
84
  * `make -C native install` installs exactly these; a test holds the Makefile to the list.
@@ -116,7 +128,7 @@ export interface HostingPolicy {
116
128
  * lives in {@link HOST_BUDGETS} (plugin-qualify §3a), not here.
117
129
  */
118
130
  export declare const DEFAULT_HOSTING_POLICY: HostingPolicy;
119
- /** What a host spends on one plugin instance (`2026-09-25-plugin-qualify.md` §3a) — the
131
+ /** What a host spends on one plugin instance — the
120
132
  * interchange's shape, since a document carries each profile's budget. */
121
133
  import type { HostBudget } from "./measurement/format.js";
122
134
  export type { HostBudget };
@@ -126,6 +138,8 @@ export type { HostBudget };
126
138
  * so it gets the same per-instance share, at 48 kHz / 128 frames. `jalv` gives each plugin its own
127
139
  * process and client, so a quarter core per instance, at 48 kHz / 256 frames. The last two are
128
140
  * declared defaults, not a measurement of anyone's board — a project brings its own profile file.
141
+ * `omx-clap-host` runs its plugins one JACK client each, called in turn on the server's one cycle,
142
+ * so it gets mod-host's share and pair.
129
143
  */
130
144
  export declare const HOST_BUDGETS: {
131
145
  readonly "openmixer-console": {
@@ -143,4 +157,9 @@ export declare const HOST_BUDGETS: {
143
157
  readonly rate: 48000;
144
158
  readonly quantum: 128;
145
159
  };
160
+ readonly "omx-clap-host": {
161
+ readonly coreFractionCeiling: 0.05;
162
+ readonly rate: 48000;
163
+ readonly quantum: 128;
164
+ };
146
165
  };
@@ -55,20 +55,32 @@ export const SOAK_CALIBRATION_S = 30;
55
55
  */
56
56
  export const CLAP_SCAN_TOOL_ENV = "OMX_CLAP_SCAN";
57
57
  export const CLAP_SCAN_TOOL_DEFAULT = "omx-clap-scan";
58
+ /**
59
+ * The standard CLAP search path `--all` walks, in this order: every directory `CLAP_PATH` names
60
+ * (colon-separated), then `~/.clap`, then `/usr/lib/clap`. The system directory is the same on
61
+ * every distribution and architecture; it is never the library directory (`/usr/lib64`).
62
+ */
63
+ export const CLAP_PATH_ENV = "CLAP_PATH";
64
+ export const CLAP_USER_DIR = ".clap";
65
+ export const CLAP_SYSTEM_DIR = "/usr/lib/clap";
58
66
  /** Seconds one run of the CLAP scanner may take over everything it was pointed at. */
59
67
  export const CLAP_SCAN_TIMEOUT_S = 300;
60
68
  /**
61
- * The CLAP prober (`native/clap-qualify.c`), the LV2 measurer (`native/lv2-measure.c`) and the
62
- * interposer both run under (`native/rt-interpose.c`): each located by one environment variable, else
63
- * the package's own build in `native/build/`, else the first of `NATIVE_TOOL_DIRS` that holds it.
69
+ * The CLAP prober (`native/clap-qualify.c`), the LV2 measurer (`native/lv2-measure.c`), the
70
+ * interposer both run under (`native/rt-interpose.c`) and the LV2 host probe
71
+ * (`native/lv2-host-probe.c`, a worker plugin driven through lilv as a host drives it, for a console
72
+ * that exports an LV2 plugin to test its host-facing half): each located by one environment variable,
73
+ * else the package's own build in `native/build/`, else the first of `NATIVE_TOOL_DIRS` that holds it.
64
74
  */
65
75
  export const CLAP_QUALIFY_TOOL_ENV = "OMX_CLAP_QUALIFY";
66
76
  export const LV2_MEASURE_TOOL_ENV = "OMX_LV2_MEASURE";
67
77
  export const RT_INTERPOSE_ENV = "OMX_RT_INTERPOSE";
78
+ export const LV2_HOST_PROBE_TOOL_ENV = "OMX_LV2_HOST_PROBE";
68
79
  /** The file names of the native tools, in every place they are looked for. */
69
80
  export const CLAP_QUALIFY_TOOL_NAME = "clap-qualify";
70
81
  export const LV2_MEASURE_TOOL_NAME = "lv2_measure";
71
82
  export const RT_INTERPOSE_NAME = "rt_interpose.so";
83
+ export const LV2_HOST_PROBE_TOOL_NAME = "lv2_host_probe";
72
84
  /**
73
85
  * The ONE list of the native tools the packages install, each with the setting that names it.
74
86
  * `make -C native install` installs exactly these; a test holds the Makefile to the list.
@@ -77,6 +89,7 @@ export const NATIVE_TOOLS = [
77
89
  { name: CLAP_QUALIFY_TOOL_NAME, env: CLAP_QUALIFY_TOOL_ENV },
78
90
  { name: LV2_MEASURE_TOOL_NAME, env: LV2_MEASURE_TOOL_ENV },
79
91
  { name: RT_INTERPOSE_NAME, env: RT_INTERPOSE_ENV },
92
+ { name: LV2_HOST_PROBE_TOOL_NAME, env: LV2_HOST_PROBE_TOOL_ENV },
80
93
  ];
81
94
  /**
82
95
  * Where the RPM and the DEB install the native tools: the libexec directory on Fedora,
@@ -116,10 +129,13 @@ export const DEFAULT_HOSTING_POLICY = {
116
129
  * so it gets the same per-instance share, at 48 kHz / 128 frames. `jalv` gives each plugin its own
117
130
  * process and client, so a quarter core per instance, at 48 kHz / 256 frames. The last two are
118
131
  * declared defaults, not a measurement of anyone's board — a project brings its own profile file.
132
+ * `omx-clap-host` runs its plugins one JACK client each, called in turn on the server's one cycle,
133
+ * so it gets mod-host's share and pair.
119
134
  */
120
135
  export const HOST_BUDGETS = {
121
136
  "openmixer-console": { coreFractionCeiling: 0.05, rate: COST_REFERENCE_RATE, quantum: QUANTUM_FRAMES },
122
137
  jalv: { coreFractionCeiling: 0.25, rate: MEASURE_BASE_RATE, quantum: 256 },
123
138
  "mod-host": { coreFractionCeiling: 0.05, rate: MEASURE_BASE_RATE, quantum: 128 },
139
+ "omx-clap-host": { coreFractionCeiling: 0.05, rate: MEASURE_BASE_RATE, quantum: 128 },
124
140
  };
125
141
  //# sourceMappingURL=qualify-declarations.js.map
@@ -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":"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"}
@@ -18,7 +18,7 @@ export const EXIT_CODE = {
18
18
  couldNotMeasure: 2,
19
19
  };
20
20
  export const QUALIFY_OPTIONS = [
21
- { flag: "--all", describe: "every plugin lilv finds (LV2_PATH honoured)" },
21
+ { flag: "--all", describe: "every CLAP plugin on the CLAP search path; refuses when LV2 bundles are on the LV2 path" },
22
22
  { flag: "--rates", value: "list", describe: "sample rates to measure at, comma-separated", default: QUALIFY_RATES.join(",") },
23
23
  { flag: "--quanta", value: "list", describe: "quanta (frames) to rate cost at, comma-separated", default: QUALIFY_QUANTA.join(",") },
24
24
  { flag: "--out", value: "dir", describe: "write one interchange JSON document per run into this directory" },
@@ -31,6 +31,11 @@ export const QUALIFY_OPTIONS = [
31
31
  describe: `judge against this host (${HOST_PROFILES.map((p) => p.id).join(", ")}, or a profile JSON file); repeat or comma-separate for one verdict per profile`,
32
32
  default: OPENMIXER_CONSOLE_PROFILE.id,
33
33
  },
34
+ {
35
+ flag: "--pins",
36
+ value: "file",
37
+ describe: "write one pin per qualified plugin to this file, with its verdict, for plugin-hostd's pin_file (the verdict is the first host profile's)",
38
+ },
34
39
  { flag: "--help", describe: "this text" },
35
40
  ];
36
41
  //# sourceMappingURL=qualify-options.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"qualify-options.js","sourceRoot":"","sources":["../src/qualify-options.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,sDAAsD;AACtD;;;GAGG;AACH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAE9E,uFAAuF;AACvF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,MAAM,CAAU,CAAC;AAGxD,+CAA+C;AAC/C,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,2CAA2C;IAC3C,YAAY,EAAE,CAAC;IACf,+DAA+D;IAC/D,gBAAgB,EAAE,CAAC;IACnB,sFAAsF;IACtF,eAAe,EAAE,CAAC;CACV,CAAC;AAYX,MAAM,CAAC,MAAM,eAAe,GAA6B;IACvD,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,6CAA6C,EAAE;IAC1E,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,6CAA6C,EAAE,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;IAC7H,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,kDAAkD,EAAE,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;IACpI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,iEAAiE,EAAE;IAC5G,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,sEAAsE,EAAE,OAAO,EAAE,MAAM,EAAE;IACxJ,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,sEAAsE,EAAE;IACvG,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,0DAA0D,EAAE;IACjG;QACE,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,4BAA4B,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,iFAAiF;QAChK,OAAO,EAAE,yBAAyB,CAAC,EAAE;KACtC;IACD,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE;CAC1C,CAAC"}
1
+ {"version":3,"file":"qualify-options.js","sourceRoot":"","sources":["../src/qualify-options.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,sDAAsD;AACtD;;;GAGG;AACH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAE9E,uFAAuF;AACvF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,MAAM,CAAU,CAAC;AAGxD,+CAA+C;AAC/C,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,2CAA2C;IAC3C,YAAY,EAAE,CAAC;IACf,+DAA+D;IAC/D,gBAAgB,EAAE,CAAC;IACnB,sFAAsF;IACtF,eAAe,EAAE,CAAC;CACV,CAAC;AAYX,MAAM,CAAC,MAAM,eAAe,GAA6B;IACvD,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,yFAAyF,EAAE;IACtH,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,6CAA6C,EAAE,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;IAC7H,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,kDAAkD,EAAE,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;IACpI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,iEAAiE,EAAE;IAC5G,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,sEAAsE,EAAE,OAAO,EAAE,MAAM,EAAE;IACxJ,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,sEAAsE,EAAE;IACvG,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,0DAA0D,EAAE;IACjG;QACE,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,4BAA4B,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,iFAAiF;QAChK,OAAO,EAAE,yBAAyB,CAAC,EAAE;KACtC;IACD;QACE,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,MAAM;QACb,QAAQ,EACN,0IAA0I;KAC7I;IACD,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE;CAC1C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openmixer/plugin-qualify",
3
- "version": "0.8.0",
3
+ "version": "0.10.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",
@@ -81,7 +81,8 @@
81
81
  "test": "vitest run src",
82
82
  "lint": "tsc -p tsconfig.lint.json",
83
83
  "test:py": "python3 -m pytest tools -q",
84
- "check:generated": "node tools/gen-python-declarations.mjs --check"
84
+ "check:generated": "node tools/gen-python-declarations.mjs --check",
85
+ "check:private-refs": "tools/private-refs-check.sh && tools/private-refs-check.sh --self-test"
85
86
  },
86
87
  "devDependencies": {
87
88
  "@types/node": "^24.9.0",
@@ -3,7 +3,8 @@
3
3
  /**
4
4
  * The CLAP implementation of the one discovery seam (`loader.ts`). A target that is a `.clap` file, or a
5
5
  * directory holding one, is scanned by `omx-clap-scan --json` (the scanner of omx-clap-host),
6
- * located by the ONE declared setting; `urn:clap:<id>` is one plugin without a scan. The
6
+ * located by the ONE declared setting; `urn:clap:<id>` is one plugin without a scan. `--all` walks
7
+ * the standard CLAP search path ({@link clapSearchPath}) through the same loader. The
7
8
  * scanner's JSON is the input: {@link clapScanDescriptors} normalises it into the interchange
8
9
  * rows. A scan that cannot be read is a {@link ClapScanError}, never an empty result.
9
10
  *
@@ -12,11 +13,20 @@
12
13
  * remote-control pages; a row keeps them, and each parameter's module, wherever the scan read them.
13
14
  */
14
15
  import { spawnSync } from "node:child_process";
15
- import { existsSync, readdirSync, statSync } from "node:fs";
16
+ import { type Dirent, existsSync, readdirSync, statSync } from "node:fs";
17
+ import { homedir } from "node:os";
16
18
  import { basename, dirname, join, resolve } from "node:path";
17
19
 
18
20
  import type { PluginLoader, PluginTarget } from "./loader.js";
19
- import { CLAP_SCAN_TIMEOUT_S, CLAP_SCAN_TOOL_DEFAULT, CLAP_SCAN_TOOL_ENV } from "./qualify-declarations.js";
21
+ import { lv2BundlesOnPath } from "./lv2-loader.js";
22
+ import {
23
+ CLAP_PATH_ENV,
24
+ CLAP_SCAN_TIMEOUT_S,
25
+ CLAP_SCAN_TOOL_DEFAULT,
26
+ CLAP_SCAN_TOOL_ENV,
27
+ CLAP_SYSTEM_DIR,
28
+ CLAP_USER_DIR,
29
+ } from "./qualify-declarations.js";
20
30
 
21
31
  /** The scanner's own name in its document — anything else is not its output. */
22
32
  const SCANNER_NAME = "omx-clap-scan";
@@ -344,11 +354,33 @@ export function clapScanTool(env: Readonly<Record<string, string | undefined>>):
344
354
  return named === undefined || named === "" ? CLAP_SCAN_TOOL_DEFAULT : named;
345
355
  }
346
356
 
357
+ /** An fs error met while walking a search directory, as the scan refusal that names the path. */
358
+ function unreadable(path: string, e: unknown): ClapScanError {
359
+ if (e instanceof ClapScanError) return e;
360
+ const code = (e as NodeJS.ErrnoException).code;
361
+ return new ClapScanError(`cannot read ${path}: ${typeof code === "string" ? code : String(e)}`);
362
+ }
363
+
364
+ /** A directory entry that is a directory, or a symlink to one; a dangling link is not, any other fs error (a loop) is thrown. */
365
+ function isDirectory(e: Dirent, p: string): boolean {
366
+ if (e.isDirectory()) return true;
367
+ if (!e.isSymbolicLink()) return false;
368
+ try {
369
+ return statSync(p).isDirectory();
370
+ } catch (err) {
371
+ if ((err as NodeJS.ErrnoException).code === "ENOENT") return false;
372
+ throw err;
373
+ }
374
+ }
375
+
347
376
  function holdsClap(dir: string): boolean {
348
- for (const e of readdirSync(dir, { withFileTypes: true })) {
349
- const p = join(dir, e.name);
350
- const isDir = e.isDirectory() || (e.isSymbolicLink() && existsSync(p) && statSync(p).isDirectory());
351
- if (isDir ? holdsClap(p) : e.name.endsWith(CLAP_SUFFIX)) return true;
377
+ try {
378
+ for (const e of readdirSync(dir, { withFileTypes: true })) {
379
+ const p = join(dir, e.name);
380
+ if (isDirectory(e, p) ? holdsClap(p) : e.name.endsWith(CLAP_SUFFIX)) return true;
381
+ }
382
+ } catch (e) {
383
+ throw unreadable(dir, e);
352
384
  }
353
385
  return false;
354
386
  }
@@ -391,3 +423,63 @@ export function clapLoader(options: ClapLoaderOptions = {}): PluginLoader {
391
423
  },
392
424
  };
393
425
  }
426
+
427
+ // --- the standard search path (`--all`) ----------------------------------------------------------
428
+
429
+ /**
430
+ * The directories `--all` walks, in order and once each: every non-empty entry of `CLAP_PATH`, then
431
+ * `~/.clap`, then `/usr/lib/clap`.
432
+ */
433
+ export function clapSearchPath(env: Readonly<Record<string, string | undefined>>, home: string): string[] {
434
+ const named = (env[CLAP_PATH_ENV] ?? "").split(":").filter((d) => d !== "");
435
+ return [...new Set([...named, join(home, CLAP_USER_DIR), CLAP_SYSTEM_DIR].map((d) => resolve(d)))];
436
+ }
437
+
438
+ export interface ClapDiscoverOptions extends ClapLoaderOptions {
439
+ /** The home directory `~/.clap` is read under; the default is the user's. */
440
+ readonly home?: string;
441
+ }
442
+
443
+ /**
444
+ * Every CLAP plugin on the standard search path, each directory resolved through {@link clapLoader}
445
+ * exactly as a named directory is. A directory that is absent or holds no `.clap` is skipped; a
446
+ * plugin id found twice keeps its first place on the path. A directory that cannot be read (a
447
+ * permission error, a symlink loop) is a {@link ClapScanError} naming it, never a partial list.
448
+ */
449
+ export function discoverClapTargets(options: ClapDiscoverOptions = {}): PluginTarget[] {
450
+ const loader = clapLoader(options);
451
+ const found = new Map<string, PluginTarget>();
452
+ for (const dir of clapSearchPath(options.env ?? process.env, options.home ?? homedir())) {
453
+ try {
454
+ if (!existsSync(dir) || !statSync(dir).isDirectory()) continue;
455
+ for (const t of loader.resolve(dir) ?? []) if (!found.has(t.uri)) found.set(t.uri, t);
456
+ } catch (e) {
457
+ throw unreadable(dir, e);
458
+ }
459
+ }
460
+ return [...found.values()];
461
+ }
462
+
463
+ export interface DiscoverAllOptions extends ClapDiscoverOptions {}
464
+
465
+ /**
466
+ * The targets of `--all`. The LV2 plugins lilv finds cannot be measured from this entry point, so
467
+ * when the LV2 search path holds any bundle the run refuses (exit 2) and names how many, rather
468
+ * than qualifying only the CLAP side and reporting everything qualified.
469
+ */
470
+ export function discoverAllTargets(options: DiscoverAllOptions = {}): PluginTarget[] {
471
+ const env = options.env ?? process.env;
472
+ let bundles: string[];
473
+ try {
474
+ bundles = lv2BundlesOnPath(env, options.home ?? homedir());
475
+ } catch (e) {
476
+ throw unreadable("the LV2 search path", e);
477
+ }
478
+ if (bundles.length > 0) {
479
+ throw new ClapScanError(
480
+ `--all cannot measure LV2 from this entry point and ${String(bundles.length)} LV2 bundle(s) are on the LV2 path ` +
481
+ `(first: ${bundles[0]}); name the plugins or bundles to qualify instead, or unset LV2_PATH to an empty directory`,
482
+ );
483
+ }
484
+ return discoverClapTargets(options);
485
+ }