@openmixer/plugin-qualify 0.18.5 → 0.19.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 +19 -730
- package/bin/plugin-qualify-sync.mjs +1 -1
- package/bin/plugin-qualify.mjs +7 -0
- package/dist/clap-qualify.d.ts +1 -1
- package/dist/compare.d.ts +311 -0
- package/dist/compare.js +502 -0
- package/dist/compare.js.map +1 -0
- package/dist/distributed-records.d.ts +0 -2
- package/dist/distributed-records.js +0 -2
- package/dist/distributed-records.js.map +1 -1
- package/dist/host-admission.d.ts +2 -2
- package/dist/host-admission.js +7 -0
- package/dist/host-admission.js.map +1 -1
- package/dist/hosting-codes.generated.d.ts +1 -0
- package/dist/hosting-codes.generated.js +1 -0
- package/dist/hosting-codes.generated.js.map +1 -1
- package/dist/hosting-suitability.d.ts +3 -1
- package/dist/hosting-suitability.js +9 -0
- package/dist/hosting-suitability.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/lv2-loader.js +6 -5
- package/dist/lv2-loader.js.map +1 -1
- package/dist/measurement/format.d.ts +15 -0
- package/dist/measurement/format.js +19 -0
- package/dist/measurement/format.js.map +1 -1
- package/dist/measurement/sweep-jsonl.js +5 -1
- package/dist/measurement/sweep-jsonl.js.map +1 -1
- package/dist/measurement-grid.js +1 -1
- package/dist/pins-file.d.ts +22 -2
- package/dist/pins-file.js +118 -17
- package/dist/pins-file.js.map +1 -1
- package/dist/qualification-record.d.ts +26 -0
- package/dist/qualification-record.js +21 -0
- package/dist/qualification-record.js.map +1 -1
- package/dist/qualify-declarations.d.ts +6 -0
- package/dist/qualify-declarations.js +8 -0
- package/dist/qualify-declarations.js.map +1 -1
- package/dist/qualify-isolated.d.ts +16 -3
- package/dist/qualify-isolated.js +31 -3
- package/dist/qualify-isolated.js.map +1 -1
- package/dist/qualify-pool.d.ts +129 -0
- package/dist/qualify-pool.js +290 -0
- package/dist/qualify-pool.js.map +1 -0
- package/dist/qualify-rejudge.js +7 -0
- package/dist/qualify-rejudge.js.map +1 -1
- package/dist/qualify-sync.d.ts +36 -1
- package/dist/qualify-sync.js +144 -20
- package/dist/qualify-sync.js.map +1 -1
- package/dist/records-package.d.ts +5 -0
- package/dist/records-package.js +25 -8
- package/dist/records-package.js.map +1 -1
- package/fixtures/clap-scan/fake.json +8 -2
- package/fixtures/probe-output/success-msi.json +2 -2
- package/package.json +3 -3
- package/src/clap-qualify.ts +1 -1
- package/src/compare.ts +699 -0
- package/src/distributed-records.ts +0 -3
- package/src/host-admission.ts +9 -2
- package/src/hosting-codes.generated.ts +1 -0
- package/src/hosting-suitability.ts +14 -0
- package/src/index.ts +1 -0
- package/src/lv2-loader.ts +5 -4
- package/src/measurement/format.ts +32 -0
- package/src/measurement/sweep-jsonl.ts +5 -1
- package/src/measurement-grid.ts +1 -1
- package/src/pins-file.ts +109 -16
- package/src/qualification-record.ts +38 -0
- package/src/qualify-declarations.ts +8 -0
- package/src/qualify-isolated.ts +31 -5
- package/src/qualify-pool.ts +318 -0
- package/src/qualify-rejudge.ts +8 -0
- package/src/qualify-sync.ts +140 -19
- package/src/records-package.ts +25 -8
- package/tools/benchmark.py +9 -3
- package/tools/compare-host.mjs +432 -0
- package/tools/compare-run.mjs +355 -0
- package/tools/descriptors.py +27 -0
- package/tools/isolated-step.mjs +3 -1
- package/tools/lilv_load.py +25 -0
- package/tools/lv2_resolve.py +3 -1
- package/tools/pool-step.mjs +186 -0
- package/tools/scan.py +16 -20
- package/tools/audit-overlap.sh +0 -250
- package/tools/commit-message-check.sh +0 -128
- package/tools/commit-message-patterns.json +0 -41
- package/tools/private-refs-check.sh +0 -90
|
@@ -51,7 +51,7 @@ log(
|
|
|
51
51
|
`memory ${s.memory === undefined ? "unbounded" : `${String(s.memory.bytes)} bytes`}`,
|
|
52
52
|
);
|
|
53
53
|
try {
|
|
54
|
-
const summary = await runSync(s, { force: parsed.args.force, wait: !parsed.args.noWait, refreshOnly: parsed.args.refreshPins, rejudge: parsed.args.rejudge, memoryOnly: parsed.args.memoryOnly, adapterOnly: parsed.args.adapterOnly, isolatedOnly: parsed.args.isolatedOnly, log });
|
|
54
|
+
const summary = await runSync(s, { force: parsed.args.force, wait: !parsed.args.noWait, refreshOnly: parsed.args.refreshPins, rejudge: parsed.args.rejudge, memoryOnly: parsed.args.memoryOnly, adapterOnly: parsed.args.adapterOnly, isolatedOnly: parsed.args.isolatedOnly, poolOnly: parsed.args.poolOnly, log });
|
|
55
55
|
if (summary !== undefined) {
|
|
56
56
|
process.stdout.write(`${summaryLine(summary)}\n`);
|
|
57
57
|
// the records counted per plugin over its offers: a CLAP plugin has a record per offer
|
package/bin/plugin-qualify.mjs
CHANGED
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
* Every named plugin, CLAP or LV2, is measured by plugin-hostd's probe runner (`plugin-hostd-probe`,
|
|
9
9
|
* named by `OMX_PROBE_RUNNER` when it is not on `PATH`), which keeps the deadline and the limits, and is
|
|
10
10
|
* judged from the probe output it writes: the verdict and the qualification record, per host profile.
|
|
11
|
+
* `plugin-qualify compare` runs the plugins through omx-clap-host, plugin-hostd, mod-host and jalv with the same checks
|
|
12
|
+
* (tools/compare-run.mjs).
|
|
11
13
|
* `--all` finds the LV2 plugins of the bundles on the LV2 path, then the CLAP plugins on the standard CLAP search path (`CLAP_PATH`, then `~/.clap`, then
|
|
12
14
|
* `/usr/lib/clap`). `plugin-qualify judge` judges probe outputs already written.
|
|
13
15
|
*/
|
|
@@ -62,6 +64,11 @@ function writePins(path, file) {
|
|
|
62
64
|
process.stderr.write(`plugin-qualify: ${file.written.length} pin${file.written.length === 1 ? "" : "s"} written to ${path}\n`);
|
|
63
65
|
}
|
|
64
66
|
|
|
67
|
+
if (process.argv[2] === "compare") {
|
|
68
|
+
const { compareMain } = await import("../tools/compare-run.mjs");
|
|
69
|
+
process.exit(await compareMain(process.argv.slice(3)));
|
|
70
|
+
}
|
|
71
|
+
|
|
65
72
|
if (process.argv[2] === "judge") {
|
|
66
73
|
const j = parseJudgeArgs(process.argv.slice(3));
|
|
67
74
|
if (!j.ok) {
|
package/dist/clap-qualify.d.ts
CHANGED
|
@@ -76,7 +76,7 @@ export interface ClapQualifyLine {
|
|
|
76
76
|
readonly cost?: ClapCostReading;
|
|
77
77
|
/**
|
|
78
78
|
* The pin (spec §11): the `.clap`'s digest by its name in its directory and the layout fingerprint
|
|
79
|
-
* the prober computed through plugin-
|
|
79
|
+
* the prober computed through plugin-db's `pin.h`, or the reason it took none.
|
|
80
80
|
*/
|
|
81
81
|
readonly integrity: IntegrityMeasurement;
|
|
82
82
|
}
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
export declare const COMPARISON_RECORD_SCHEMA = "plugin-qualify.comparison-record/1";
|
|
2
|
+
export declare const COMPARISON_SUMMARY_SCHEMA = "plugin-qualify.comparison-summary/1";
|
|
3
|
+
export declare const COMPARISON_RECORD_SUFFIX = ".comparison.json";
|
|
4
|
+
export declare const COMPARISON_SUMMARY_FILE = "comparison-summary.json";
|
|
5
|
+
/** The hosts, in the order their rows are written. */
|
|
6
|
+
export declare const COMPARE_HOSTS: readonly ["omx-clap-host", "plugin-hostd", "mod-host", "jalv"];
|
|
7
|
+
export type CompareHost = (typeof COMPARE_HOSTS)[number];
|
|
8
|
+
/** The references a published comparison is measured against: without both, a summary is not publishable. */
|
|
9
|
+
export declare const REFERENCE_HOSTS: readonly CompareHost[];
|
|
10
|
+
/** How each host is driven, and what of it can be observed. The page and the summary print these, so they are data. */
|
|
11
|
+
export interface HostTraits {
|
|
12
|
+
readonly program: string;
|
|
13
|
+
/** `protocol`: the mod-host socket protocol (`add`, `remove`); `process`: one process per plugin (jalv). */
|
|
14
|
+
readonly drive: "protocol" | "process";
|
|
15
|
+
readonly formats: readonly ("lv2" | "clap")[];
|
|
16
|
+
/** Why the plugin latency it reports is or is not observable. */
|
|
17
|
+
readonly latency: {
|
|
18
|
+
readonly observable: boolean;
|
|
19
|
+
readonly how: string;
|
|
20
|
+
};
|
|
21
|
+
readonly rt: string;
|
|
22
|
+
}
|
|
23
|
+
export declare const HOST_TRAITS: Readonly<Record<CompareHost, HostTraits>>;
|
|
24
|
+
export declare const isCompareHost: (s: string) => s is CompareHost;
|
|
25
|
+
export interface CompareArgs {
|
|
26
|
+
readonly help: boolean;
|
|
27
|
+
readonly all: boolean;
|
|
28
|
+
readonly targets: readonly string[];
|
|
29
|
+
readonly hosts: readonly CompareHost[];
|
|
30
|
+
readonly rate: number;
|
|
31
|
+
readonly quantum: number;
|
|
32
|
+
readonly cycles: number;
|
|
33
|
+
readonly soakS: number;
|
|
34
|
+
readonly windowMs: number;
|
|
35
|
+
readonly timeoutMs: number;
|
|
36
|
+
readonly out: string | undefined;
|
|
37
|
+
readonly hostClass: string | undefined;
|
|
38
|
+
readonly set: string | undefined;
|
|
39
|
+
readonly publish: boolean;
|
|
40
|
+
readonly server: string | undefined;
|
|
41
|
+
readonly limit: number;
|
|
42
|
+
readonly force: boolean;
|
|
43
|
+
readonly format: "text" | "json";
|
|
44
|
+
}
|
|
45
|
+
export declare const COMPARE_DEFAULTS: {
|
|
46
|
+
readonly rate: 48000;
|
|
47
|
+
readonly quantum: 256;
|
|
48
|
+
readonly cycles: 5;
|
|
49
|
+
readonly soakS: 10;
|
|
50
|
+
readonly windowMs: 2000;
|
|
51
|
+
readonly timeoutMs: 10000;
|
|
52
|
+
};
|
|
53
|
+
export type ParseCompare = {
|
|
54
|
+
ok: true;
|
|
55
|
+
args: CompareArgs;
|
|
56
|
+
} | {
|
|
57
|
+
ok: false;
|
|
58
|
+
error: string;
|
|
59
|
+
};
|
|
60
|
+
export declare function parseCompareArgs(argv: readonly string[]): ParseCompare;
|
|
61
|
+
export declare function compareHelpText(): string;
|
|
62
|
+
export interface HostPresence {
|
|
63
|
+
readonly host: CompareHost;
|
|
64
|
+
readonly installed: boolean;
|
|
65
|
+
readonly version: string | null;
|
|
66
|
+
/** Why it is skipped, when it is. */
|
|
67
|
+
readonly reason?: string;
|
|
68
|
+
}
|
|
69
|
+
/** The reference hosts a publishable summary lacks, by name, with the reason each is missing. */
|
|
70
|
+
export declare function missingReferences(present: readonly HostPresence[]): readonly {
|
|
71
|
+
host: CompareHost;
|
|
72
|
+
reason: string;
|
|
73
|
+
}[];
|
|
74
|
+
/** What a directory of records says of each host: it ran where a row of it ran, else the reason its rows give. */
|
|
75
|
+
export declare function presenceFromRecords(records: readonly ComparisonRecord[]): HostPresence[];
|
|
76
|
+
/** The arguments of `plugin-qualify compare summary <dir>`: the summary of the records already in a directory. */
|
|
77
|
+
export type ParseSummary = {
|
|
78
|
+
ok: true;
|
|
79
|
+
args: {
|
|
80
|
+
dir: string;
|
|
81
|
+
hostClass?: string;
|
|
82
|
+
set?: string;
|
|
83
|
+
publish: boolean;
|
|
84
|
+
help: boolean;
|
|
85
|
+
};
|
|
86
|
+
} | {
|
|
87
|
+
ok: false;
|
|
88
|
+
error: string;
|
|
89
|
+
};
|
|
90
|
+
export declare function parseSummaryArgs(argv: readonly string[]): ParseSummary;
|
|
91
|
+
export declare function summaryHelpText(): string;
|
|
92
|
+
/** Two runs are the same comparison when every condition but the machine's JACK version and real-time grant agree. */
|
|
93
|
+
export declare function sameConditions(a: ComparisonConditions, b: ComparisonConditions): boolean;
|
|
94
|
+
export type CheckResult = "pass" | "fail" | "not-observable" | "not-run";
|
|
95
|
+
export type FigureResult = "measured" | "not-observable" | "not-run";
|
|
96
|
+
export interface Check {
|
|
97
|
+
readonly result: CheckResult;
|
|
98
|
+
readonly detail?: string;
|
|
99
|
+
}
|
|
100
|
+
export interface OutputCheck extends Check {
|
|
101
|
+
readonly peak?: number;
|
|
102
|
+
readonly stimulus?: Stimulus;
|
|
103
|
+
}
|
|
104
|
+
export interface CyclesCheck extends Check {
|
|
105
|
+
readonly done: number;
|
|
106
|
+
readonly of: number;
|
|
107
|
+
}
|
|
108
|
+
export interface SoakCheck extends Check {
|
|
109
|
+
readonly seconds: number;
|
|
110
|
+
readonly peakAtEnd?: number;
|
|
111
|
+
}
|
|
112
|
+
export interface RtCheck extends Check {
|
|
113
|
+
readonly allocations?: number;
|
|
114
|
+
readonly locks?: number;
|
|
115
|
+
/** Try-locks: they never wait, so they are reported and do not fail the check. */
|
|
116
|
+
readonly trylocks?: number;
|
|
117
|
+
readonly syscalls?: number;
|
|
118
|
+
readonly cycles?: number;
|
|
119
|
+
readonly kinds?: readonly string[];
|
|
120
|
+
}
|
|
121
|
+
export interface CpuFigure {
|
|
122
|
+
readonly result: FigureResult;
|
|
123
|
+
/** utime + stime of the host's processes over the soak, in percent of one core. */
|
|
124
|
+
readonly percent?: number;
|
|
125
|
+
readonly detail?: string;
|
|
126
|
+
}
|
|
127
|
+
export interface LatencyFigure {
|
|
128
|
+
readonly result: FigureResult;
|
|
129
|
+
readonly frames?: number;
|
|
130
|
+
readonly detail?: string;
|
|
131
|
+
}
|
|
132
|
+
export interface HostChecks {
|
|
133
|
+
readonly loads: Check;
|
|
134
|
+
readonly instantiates: Check;
|
|
135
|
+
readonly output: OutputCheck;
|
|
136
|
+
readonly cycles: CyclesCheck;
|
|
137
|
+
readonly soak: SoakCheck;
|
|
138
|
+
readonly rtSafe: RtCheck;
|
|
139
|
+
readonly cpu: CpuFigure;
|
|
140
|
+
readonly latency: LatencyFigure;
|
|
141
|
+
}
|
|
142
|
+
export interface HostRow {
|
|
143
|
+
readonly host: CompareHost;
|
|
144
|
+
readonly version: string | null;
|
|
145
|
+
readonly status: "ran" | "skipped" | "not-applicable";
|
|
146
|
+
readonly reason?: string;
|
|
147
|
+
readonly checks?: HostChecks;
|
|
148
|
+
/** The step the host died at and how, when it did. */
|
|
149
|
+
readonly crash?: {
|
|
150
|
+
readonly step: string;
|
|
151
|
+
readonly signal: string;
|
|
152
|
+
};
|
|
153
|
+
/** Loaded, instantiated, survived the cycles and the soak, never crashed, and its output was not found silent. */
|
|
154
|
+
readonly runsClean?: boolean;
|
|
155
|
+
}
|
|
156
|
+
export type Stimulus = "tone" | "notes" | "none";
|
|
157
|
+
/** What tools/compare-host.mjs prints for one plugin under one host: observations, no judgment. */
|
|
158
|
+
export interface HostObservation {
|
|
159
|
+
readonly installed: boolean;
|
|
160
|
+
readonly started?: boolean;
|
|
161
|
+
/** Each add or start: ok, the reply code, or how the host ended. */
|
|
162
|
+
readonly load?: {
|
|
163
|
+
readonly ok: boolean;
|
|
164
|
+
readonly resp?: number;
|
|
165
|
+
readonly died?: string;
|
|
166
|
+
readonly detail?: string;
|
|
167
|
+
};
|
|
168
|
+
/** The plugin's ports appeared on the graph. */
|
|
169
|
+
readonly ports?: {
|
|
170
|
+
readonly audioIn: number;
|
|
171
|
+
readonly audioOut: number;
|
|
172
|
+
readonly midiIn: number;
|
|
173
|
+
};
|
|
174
|
+
readonly stimulus?: Stimulus;
|
|
175
|
+
readonly peak?: number | null;
|
|
176
|
+
/** NaN and infinite samples read on the outputs, over both windows. */
|
|
177
|
+
readonly nonFinite?: number;
|
|
178
|
+
readonly peakProblem?: string;
|
|
179
|
+
readonly cycles?: {
|
|
180
|
+
readonly done: number;
|
|
181
|
+
readonly of: number;
|
|
182
|
+
readonly died?: string;
|
|
183
|
+
readonly failedAt?: string;
|
|
184
|
+
};
|
|
185
|
+
readonly soak?: {
|
|
186
|
+
readonly seconds: number;
|
|
187
|
+
readonly alive: boolean;
|
|
188
|
+
readonly died?: string;
|
|
189
|
+
readonly peakAtEnd?: number | null;
|
|
190
|
+
};
|
|
191
|
+
readonly rt?: readonly RtReport[];
|
|
192
|
+
readonly cpu?: {
|
|
193
|
+
readonly percent: number;
|
|
194
|
+
} | {
|
|
195
|
+
readonly problem: string;
|
|
196
|
+
};
|
|
197
|
+
readonly latencyFrames?: number | null;
|
|
198
|
+
readonly died?: {
|
|
199
|
+
readonly step: string;
|
|
200
|
+
readonly signal: string;
|
|
201
|
+
};
|
|
202
|
+
readonly problem?: string;
|
|
203
|
+
}
|
|
204
|
+
/** One process's rt_watch.so report. */
|
|
205
|
+
export interface RtReport {
|
|
206
|
+
readonly pid: number;
|
|
207
|
+
readonly callbacks: number;
|
|
208
|
+
readonly cycles: number;
|
|
209
|
+
readonly armedCycles: number;
|
|
210
|
+
readonly allocations: number;
|
|
211
|
+
readonly locks: number;
|
|
212
|
+
readonly trylocks?: number;
|
|
213
|
+
readonly syscalls: number;
|
|
214
|
+
readonly kinds?: readonly string[];
|
|
215
|
+
}
|
|
216
|
+
/** A peak at or under this is silence (-100 dBFS). */
|
|
217
|
+
export declare const SILENCE = 0.00001;
|
|
218
|
+
/** The real-time verdict from the reports of the host's processes. */
|
|
219
|
+
export declare function rtCheckOf(reports: readonly RtReport[] | undefined): RtCheck;
|
|
220
|
+
/** One host's observation of one plugin as its row. */
|
|
221
|
+
export declare function hostRowOf(host: CompareHost, version: string | null, obs: HostObservation, conditions: {
|
|
222
|
+
cycles: number;
|
|
223
|
+
soakS: number;
|
|
224
|
+
}): HostRow;
|
|
225
|
+
export interface ComparisonConditions {
|
|
226
|
+
readonly rate: number;
|
|
227
|
+
readonly quantum: number;
|
|
228
|
+
readonly cycles: number;
|
|
229
|
+
readonly soakS: number;
|
|
230
|
+
readonly windowMs: number;
|
|
231
|
+
readonly timeoutMs: number;
|
|
232
|
+
readonly jack: string;
|
|
233
|
+
readonly realtime: string;
|
|
234
|
+
}
|
|
235
|
+
export interface ComparisonRecord {
|
|
236
|
+
readonly schema: typeof COMPARISON_RECORD_SCHEMA;
|
|
237
|
+
readonly plugin: {
|
|
238
|
+
readonly format: string;
|
|
239
|
+
readonly id: string;
|
|
240
|
+
readonly binary?: string;
|
|
241
|
+
};
|
|
242
|
+
readonly stimulus: Stimulus;
|
|
243
|
+
readonly conditions: ComparisonConditions;
|
|
244
|
+
readonly measuredAt: string;
|
|
245
|
+
readonly hosts: readonly HostRow[];
|
|
246
|
+
}
|
|
247
|
+
/** The record's file name: the plugin's id made safe for a file, with a hash of the whole id so two ids never meet. */
|
|
248
|
+
export declare function comparisonFileName(format: string, id: string): string;
|
|
249
|
+
export declare function comparisonRecordOf(plugin: {
|
|
250
|
+
format: string;
|
|
251
|
+
id: string;
|
|
252
|
+
binary?: string;
|
|
253
|
+
}, stimulus: Stimulus, conditions: ComparisonConditions, measuredAt: string, rows: readonly HostRow[]): ComparisonRecord;
|
|
254
|
+
/** The row of a host that does not take this plugin's format. */
|
|
255
|
+
export declare function notApplicableRow(host: CompareHost, version: string | null, format: string): HostRow;
|
|
256
|
+
/** Problems with a record's shape, empty when it is one: the records repository's check holds the same rules. */
|
|
257
|
+
export declare function comparisonRecordProblems(rec: unknown): string[];
|
|
258
|
+
export interface HostTotals {
|
|
259
|
+
readonly host: CompareHost;
|
|
260
|
+
readonly version: string | null;
|
|
261
|
+
readonly status: "ran" | "skipped";
|
|
262
|
+
readonly reason?: string;
|
|
263
|
+
/** Plugins of a format the host takes. */
|
|
264
|
+
readonly plugins: number;
|
|
265
|
+
readonly loads: number;
|
|
266
|
+
readonly instantiates: number;
|
|
267
|
+
readonly output: number;
|
|
268
|
+
readonly runsClean: number;
|
|
269
|
+
readonly rtSafe: number;
|
|
270
|
+
/** Plugins whose real-time behaviour could be watched under this host. */
|
|
271
|
+
readonly rtObserved: number;
|
|
272
|
+
readonly crashes: number;
|
|
273
|
+
readonly cpuMedianPercent: number | null;
|
|
274
|
+
readonly latencyObservable: boolean;
|
|
275
|
+
}
|
|
276
|
+
export interface Beat {
|
|
277
|
+
readonly format: string;
|
|
278
|
+
readonly id: string;
|
|
279
|
+
/** The hosts it does better than on this plugin. */
|
|
280
|
+
readonly over: readonly CompareHost[];
|
|
281
|
+
/** runs-clean: it runs clean where they do not; rt-safe: its audio thread is clean where theirs is not. */
|
|
282
|
+
readonly on: "runs-clean" | "rt-safe";
|
|
283
|
+
}
|
|
284
|
+
export interface ComparisonSummary {
|
|
285
|
+
readonly schema: typeof COMPARISON_SUMMARY_SCHEMA;
|
|
286
|
+
readonly hostClass: string | null;
|
|
287
|
+
readonly set: string | null;
|
|
288
|
+
readonly measured: string | null;
|
|
289
|
+
readonly publishable: boolean;
|
|
290
|
+
readonly missing: readonly {
|
|
291
|
+
host: CompareHost;
|
|
292
|
+
reason: string;
|
|
293
|
+
}[];
|
|
294
|
+
readonly conditions: ComparisonConditions | null;
|
|
295
|
+
readonly records: number;
|
|
296
|
+
/** Plugins every host that ran takes and ran: the like-for-like set the headline counts. */
|
|
297
|
+
readonly common: number;
|
|
298
|
+
readonly hosts: readonly HostTotals[];
|
|
299
|
+
readonly beats: Readonly<Record<string, readonly Beat[]>>;
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* The summary of a set of comparison records. `present` is what the run found installed; a host absent from every
|
|
303
|
+
* record is still listed, skipped, with its reason. Beats are counted between hosts that both ran the plugin.
|
|
304
|
+
*/
|
|
305
|
+
export declare function summarise(records: readonly ComparisonRecord[], present: readonly HostPresence[], meta: {
|
|
306
|
+
hostClass?: string;
|
|
307
|
+
set?: string;
|
|
308
|
+
publish: boolean;
|
|
309
|
+
}): ComparisonSummary;
|
|
310
|
+
/** The text table of a summary, for the terminal. */
|
|
311
|
+
export declare function summaryTable(s: ComparisonSummary): string;
|