@postalsys/email-content 0.0.5 → 0.1.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 +205 -17
- package/dist/.tsbuildinfo +1 -1
- package/dist/analyze.d.ts +55 -15
- package/dist/analyze.d.ts.map +1 -1
- package/dist/analyze.js +275 -61
- package/dist/analyze.js.map +1 -1
- package/dist/canonical/html.d.ts +21 -2
- package/dist/canonical/html.d.ts.map +1 -1
- package/dist/canonical/html.js +213 -14
- package/dist/canonical/html.js.map +1 -1
- package/dist/classify/confidence.d.ts +12 -0
- package/dist/classify/confidence.d.ts.map +1 -1
- package/dist/classify/confidence.js +54 -4
- package/dist/classify/confidence.js.map +1 -1
- package/dist/classify/reconcile.d.ts +25 -17
- package/dist/classify/reconcile.d.ts.map +1 -1
- package/dist/classify/reconcile.js +52 -20
- package/dist/classify/reconcile.js.map +1 -1
- package/dist/classify/rules.d.ts +7 -0
- package/dist/classify/rules.d.ts.map +1 -1
- package/dist/classify/rules.js +58 -0
- package/dist/classify/rules.js.map +1 -1
- package/dist/cli/annotate.d.ts.map +1 -1
- package/dist/cli/annotate.js +6 -3
- package/dist/cli/annotate.js.map +1 -1
- package/dist/cli/args.d.ts +14 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +48 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/benchmark.d.ts +39 -0
- package/dist/cli/benchmark.d.ts.map +1 -1
- package/dist/cli/benchmark.js +179 -66
- package/dist/cli/benchmark.js.map +1 -1
- package/dist/cli/corpus.d.ts.map +1 -1
- package/dist/cli/corpus.js +13 -8
- package/dist/cli/corpus.js.map +1 -1
- package/dist/cli/disagreements.d.ts.map +1 -1
- package/dist/cli/disagreements.js +7 -4
- package/dist/cli/disagreements.js.map +1 -1
- package/dist/cli/evaluate.d.ts.map +1 -1
- package/dist/cli/evaluate.js +34 -10
- package/dist/cli/evaluate.js.map +1 -1
- package/dist/cli/extract.d.ts.map +1 -1
- package/dist/cli/extract.js +8 -3
- package/dist/cli/extract.js.map +1 -1
- package/dist/cli/main.js +8 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/corpus/scanner.d.ts +9 -1
- package/dist/corpus/scanner.d.ts.map +1 -1
- package/dist/corpus/scanner.js +52 -13
- package/dist/corpus/scanner.js.map +1 -1
- package/dist/corpus/store.d.ts +29 -2
- package/dist/corpus/store.d.ts.map +1 -1
- package/dist/corpus/store.js +45 -2
- package/dist/corpus/store.js.map +1 -1
- package/dist/detect/patterns.d.ts +29 -0
- package/dist/detect/patterns.d.ts.map +1 -1
- package/dist/detect/patterns.js +80 -6
- package/dist/detect/patterns.js.map +1 -1
- package/dist/detect/reply-header.d.ts +14 -0
- package/dist/detect/reply-header.d.ts.map +1 -1
- package/dist/detect/reply-header.js +80 -37
- package/dist/detect/reply-header.js.map +1 -1
- package/dist/eval/oracle.d.ts +80 -0
- package/dist/eval/oracle.d.ts.map +1 -0
- package/dist/eval/oracle.js +250 -0
- package/dist/eval/oracle.js.map +1 -0
- package/dist/index.d.ts +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +94 -56
- package/dist/index.js.map +1 -1
- package/dist/match/history.d.ts +12 -0
- package/dist/match/history.d.ts.map +1 -1
- package/dist/match/history.js +16 -0
- package/dist/match/history.js.map +1 -1
- package/dist/mime/model.d.ts +28 -3
- package/dist/mime/model.d.ts.map +1 -1
- package/dist/mime/model.js +41 -1
- package/dist/mime/model.js.map +1 -1
- package/dist/mime/parse.d.ts.map +1 -1
- package/dist/mime/parse.js +19 -2
- package/dist/mime/parse.js.map +1 -1
- package/dist/mime/select.d.ts +71 -0
- package/dist/mime/select.d.ts.map +1 -0
- package/dist/mime/select.js +198 -0
- package/dist/mime/select.js.map +1 -0
- package/dist/segment/html-blocks.d.ts +1 -1
- package/dist/segment/html-blocks.d.ts.map +1 -1
- package/dist/segment/html-blocks.js +77 -8
- package/dist/segment/html-blocks.js.map +1 -1
- package/dist/segment/text-blocks.d.ts.map +1 -1
- package/dist/segment/text-blocks.js +18 -1
- package/dist/segment/text-blocks.js.map +1 -1
- package/dist/segment/types.d.ts +14 -0
- package/dist/segment/types.d.ts.map +1 -1
- package/dist/types.d.ts +132 -11
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +37 -3
- package/dist/types.js.map +1 -1
- package/dist/util/worker-pool.d.ts +21 -0
- package/dist/util/worker-pool.d.ts.map +1 -1
- package/dist/util/worker-pool.js +61 -13
- package/dist/util/worker-pool.js.map +1 -1
- package/package.json +4 -2
package/dist/cli/benchmark.js
CHANGED
|
@@ -8,17 +8,26 @@
|
|
|
8
8
|
*
|
|
9
9
|
* The catastrophic checks here are structural and need no labels, so they can run over hundreds of
|
|
10
10
|
* thousands of messages. They are a floor, not a substitute for the labelled evaluation in Phase 4.
|
|
11
|
+
*
|
|
12
|
+
* Whether the input had content is decided by `src/eval/oracle.ts`, which re-parses the message and
|
|
13
|
+
* never touches the extraction selection path. Deriving it from the output instead, which is what
|
|
14
|
+
* this file used to do, made the headline catastrophic counter unable to see total content loss.
|
|
11
15
|
*/
|
|
12
16
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
13
17
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
14
18
|
};
|
|
15
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.checkMessage = checkMessage;
|
|
16
21
|
exports.benchmarkCommand = benchmarkCommand;
|
|
17
22
|
const node_fs_1 = __importDefault(require("node:fs"));
|
|
18
23
|
const node_path_1 = __importDefault(require("node:path"));
|
|
19
24
|
const index_1 = require("../index");
|
|
25
|
+
const parse_1 = require("../mime/parse");
|
|
20
26
|
const store_1 = require("../corpus/store");
|
|
27
|
+
const oracle_1 = require("../eval/oracle");
|
|
28
|
+
const types_1 = require("../types");
|
|
21
29
|
const args_1 = require("./args");
|
|
30
|
+
/** Reasons that count as a structural anchor for hiding content. */
|
|
22
31
|
const ANCHOR_REASONS = new Set([
|
|
23
32
|
'preceded_by_reply_header',
|
|
24
33
|
'preceded_by_forward_header',
|
|
@@ -27,6 +36,104 @@ const ANCHOR_REASONS = new Set([
|
|
|
27
36
|
'matched_parent_message',
|
|
28
37
|
'matched_thread_ancestor'
|
|
29
38
|
]);
|
|
39
|
+
/**
|
|
40
|
+
* Run the structural gate over one raw message.
|
|
41
|
+
*
|
|
42
|
+
* Exported so the committed fixture gate and its tests exercise exactly the code the corpus run
|
|
43
|
+
* uses, rather than a re-implementation that could drift from it.
|
|
44
|
+
*/
|
|
45
|
+
async function checkMessage(raw) {
|
|
46
|
+
// Independent parse. The extractor's own view of the message is never consulted here.
|
|
47
|
+
const parsed = await (0, parse_1.parseMessage)(raw);
|
|
48
|
+
const inventory = (0, oracle_1.inventoryVisibleInput)(parsed);
|
|
49
|
+
const groups = (0, oracle_1.requiredCoverageGroups)(parsed);
|
|
50
|
+
const result = await (0, index_1.extract)(raw);
|
|
51
|
+
const visible = result.segments;
|
|
52
|
+
const hidden = result.hiddenSegments;
|
|
53
|
+
const visibleChars = visible.reduce((sum, segment) => sum + segment.text.length, 0);
|
|
54
|
+
const hiddenChars = hidden.reduce((sum, segment) => sum + segment.text.length, 0);
|
|
55
|
+
const warnings = result.warnings.map(warning => warning.code);
|
|
56
|
+
const partsOf = (segments) => new Set(segments.map(segment => (0, types_1.mimePartOf)(segment.source)).filter((part) => part !== null));
|
|
57
|
+
const coverage = (0, oracle_1.coverageOf)(groups, partsOf(visible), partsOf(hidden));
|
|
58
|
+
return {
|
|
59
|
+
missingCoverageGroups: coverage.missing.length,
|
|
60
|
+
alternativesNotEmitted: coverage.alternativesNotEmitted.length,
|
|
61
|
+
coverageHiddenOnly: coverage.hiddenOnly.length,
|
|
62
|
+
inputVisibleChars: inventory.visibleChars,
|
|
63
|
+
visibleChars,
|
|
64
|
+
hiddenChars,
|
|
65
|
+
labels: [...visible, ...hidden].map(segment => segment.type),
|
|
66
|
+
warnings,
|
|
67
|
+
emptyFromNonEmpty: inventory.hasVisibleText && visibleChars + hiddenChars === 0,
|
|
68
|
+
everythingHidden: inventory.hasVisibleText && visibleChars === 0,
|
|
69
|
+
onlyFooterVisible: visible.length > 0 && visible.every(segment => segment.type === 'SIGNATURE' || segment.type === 'DISCLAIMER'),
|
|
70
|
+
hiddenWithoutAnchor: hidden.some(segment => !segment.reasons.some(reason => ANCHOR_REASONS.has(reason))),
|
|
71
|
+
forwardedHidden: hidden.some(segment => segment.type === 'FORWARDED_CONTENT'),
|
|
72
|
+
degradedWithEmptyOutput: warnings.includes('html_parse_error') && visibleChars + hiddenChars === 0
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function newCounters() {
|
|
76
|
+
return {
|
|
77
|
+
messages: 0,
|
|
78
|
+
errors: 0,
|
|
79
|
+
nonEmptyInputs: 0,
|
|
80
|
+
emptyFromNonEmpty: 0,
|
|
81
|
+
missingCoverageGroups: 0,
|
|
82
|
+
messagesMissingCoverage: 0,
|
|
83
|
+
alternativesNotEmitted: 0,
|
|
84
|
+
coverageHiddenOnly: 0,
|
|
85
|
+
everythingHidden: 0,
|
|
86
|
+
onlySignatureVisible: 0,
|
|
87
|
+
hiddenWithoutAnchor: 0,
|
|
88
|
+
forwardedHidden: 0,
|
|
89
|
+
degradedWithEmptyOutput: 0,
|
|
90
|
+
hiddenChars: 0,
|
|
91
|
+
visibleChars: 0,
|
|
92
|
+
labels: new Map(),
|
|
93
|
+
warnings: new Map(),
|
|
94
|
+
durations: []
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
function record(counters, check) {
|
|
98
|
+
counters.messages++;
|
|
99
|
+
counters.visibleChars += check.visibleChars;
|
|
100
|
+
counters.hiddenChars += check.hiddenChars;
|
|
101
|
+
if (check.inputVisibleChars > 0) {
|
|
102
|
+
counters.nonEmptyInputs++;
|
|
103
|
+
}
|
|
104
|
+
for (const label of check.labels) {
|
|
105
|
+
counters.labels.set(label, (counters.labels.get(label) ?? 0) + 1);
|
|
106
|
+
}
|
|
107
|
+
// Per message, not per occurrence: a per warning tally divided by the message count is not a
|
|
108
|
+
// percentage of anything, which is the bug the old hidden-without-anchor rate had.
|
|
109
|
+
for (const code of new Set(check.warnings)) {
|
|
110
|
+
counters.warnings.set(code, (counters.warnings.get(code) ?? 0) + 1);
|
|
111
|
+
}
|
|
112
|
+
counters.missingCoverageGroups += check.missingCoverageGroups;
|
|
113
|
+
counters.alternativesNotEmitted += check.alternativesNotEmitted;
|
|
114
|
+
counters.coverageHiddenOnly += check.coverageHiddenOnly;
|
|
115
|
+
if (check.missingCoverageGroups > 0) {
|
|
116
|
+
counters.messagesMissingCoverage++;
|
|
117
|
+
}
|
|
118
|
+
if (check.emptyFromNonEmpty) {
|
|
119
|
+
counters.emptyFromNonEmpty++;
|
|
120
|
+
}
|
|
121
|
+
if (check.everythingHidden) {
|
|
122
|
+
counters.everythingHidden++;
|
|
123
|
+
}
|
|
124
|
+
if (check.onlyFooterVisible) {
|
|
125
|
+
counters.onlySignatureVisible++;
|
|
126
|
+
}
|
|
127
|
+
if (check.hiddenWithoutAnchor) {
|
|
128
|
+
counters.hiddenWithoutAnchor++;
|
|
129
|
+
}
|
|
130
|
+
if (check.forwardedHidden) {
|
|
131
|
+
counters.forwardedHidden++;
|
|
132
|
+
}
|
|
133
|
+
if (check.degradedWithEmptyOutput) {
|
|
134
|
+
counters.degradedWithEmptyOutput++;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
30
137
|
function percentile(values, fraction) {
|
|
31
138
|
if (!values.length) {
|
|
32
139
|
return 0;
|
|
@@ -34,99 +141,85 @@ function percentile(values, fraction) {
|
|
|
34
141
|
const index = Math.min(values.length - 1, Math.max(0, Math.floor(values.length * fraction)));
|
|
35
142
|
return values[index] ?? 0;
|
|
36
143
|
}
|
|
37
|
-
|
|
144
|
+
/** Resolve the list of message files to run, either from a directory or from the corpus database. */
|
|
145
|
+
function resolveInputs(args) {
|
|
146
|
+
const dir = (0, args_1.flagOptionalString)(args, 'dir');
|
|
147
|
+
if (dir) {
|
|
148
|
+
if (!node_fs_1.default.existsSync(dir)) {
|
|
149
|
+
return { error: `no such directory: ${dir}`, code: 2 };
|
|
150
|
+
}
|
|
151
|
+
const files = node_fs_1.default
|
|
152
|
+
.readdirSync(dir)
|
|
153
|
+
.filter(name => name.endsWith('.eml'))
|
|
154
|
+
.sort()
|
|
155
|
+
.map(name => node_path_1.default.join(dir, name));
|
|
156
|
+
return { files, label: `dir=${dir}` };
|
|
157
|
+
}
|
|
38
158
|
const dbPath = (0, args_1.flagString)(args, 'db', 'data/corpus.sqlite');
|
|
39
159
|
if (!node_fs_1.default.existsSync(dbPath)) {
|
|
40
|
-
|
|
41
|
-
return 2;
|
|
160
|
+
return { error: `no corpus database at ${dbPath}. Run "corpus scan" first, or pass --dir.`, code: 2 };
|
|
42
161
|
}
|
|
43
|
-
const limit = (0, args_1.
|
|
162
|
+
const limit = (0, args_1.flagPositiveInt)(args, 'sample', 2000);
|
|
44
163
|
const traffic = (0, args_1.flagString)(args, 'traffic', 'human');
|
|
45
164
|
const onlyReplies = (0, args_1.flagString)(args, 'replies', 'true') !== 'false';
|
|
46
165
|
const store = new store_1.CorpusStore(dbPath);
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
166
|
+
try {
|
|
167
|
+
// Only a run that finished cleanly. An interrupted or failed run holds partial output that
|
|
168
|
+
// looks exactly like a small corpus, and reading it as a baseline approves a release against
|
|
169
|
+
// whatever fraction of the messages happened to finish.
|
|
170
|
+
const root = store.latestCompletedRun()?.root;
|
|
171
|
+
if (!root) {
|
|
172
|
+
return { error: 'no completed scan run found', code: 2 };
|
|
173
|
+
}
|
|
174
|
+
// Ordering by path keeps the selection deterministic for a given database and filter.
|
|
175
|
+
const where = ["f.status = 'ok'"];
|
|
176
|
+
if (traffic !== 'all') {
|
|
177
|
+
where.push(`m.traffic = '${traffic.replace(/'/g, '')}'`);
|
|
178
|
+
}
|
|
179
|
+
if (onlyReplies) {
|
|
180
|
+
where.push('m.is_reply = 1');
|
|
181
|
+
}
|
|
182
|
+
const rows = store.query(`SELECT m.path AS path FROM messages m JOIN files f ON f.path = m.path WHERE ${where.join(' AND ')} ORDER BY m.path LIMIT ?`, limit);
|
|
183
|
+
return { files: rows.map(row => node_path_1.default.join(root, row.path)), label: `traffic=${traffic}, replies-only=${onlyReplies}` };
|
|
52
184
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
if (traffic !== 'all') {
|
|
56
|
-
where.push(`m.traffic = '${traffic.replace(/'/g, '')}'`);
|
|
185
|
+
finally {
|
|
186
|
+
store.close();
|
|
57
187
|
}
|
|
58
|
-
|
|
59
|
-
|
|
188
|
+
}
|
|
189
|
+
async function benchmarkCommand(args) {
|
|
190
|
+
const inputs = resolveInputs(args);
|
|
191
|
+
if ('error' in inputs) {
|
|
192
|
+
process.stderr.write(`${inputs.error}\n`);
|
|
193
|
+
return inputs.code;
|
|
60
194
|
}
|
|
61
|
-
|
|
62
|
-
store.close();
|
|
63
|
-
if (!rows.length) {
|
|
195
|
+
if (!inputs.files.length) {
|
|
64
196
|
process.stderr.write('no matching messages\n');
|
|
65
197
|
return 1;
|
|
66
198
|
}
|
|
67
|
-
const counters =
|
|
68
|
-
messages: 0,
|
|
69
|
-
errors: 0,
|
|
70
|
-
emptyFromNonEmpty: 0,
|
|
71
|
-
everythingHidden: 0,
|
|
72
|
-
onlySignatureVisible: 0,
|
|
73
|
-
hiddenWithoutAnchor: 0,
|
|
74
|
-
forwardedHidden: 0,
|
|
75
|
-
hiddenChars: 0,
|
|
76
|
-
visibleChars: 0,
|
|
77
|
-
labels: new Map(),
|
|
78
|
-
durations: []
|
|
79
|
-
};
|
|
199
|
+
const counters = newCounters();
|
|
80
200
|
const rssStart = process.memoryUsage.rss();
|
|
81
201
|
let rssPeak = rssStart;
|
|
82
202
|
const started = Date.now();
|
|
83
|
-
for (const
|
|
203
|
+
for (const file of inputs.files) {
|
|
84
204
|
let raw;
|
|
85
205
|
try {
|
|
86
|
-
raw = node_fs_1.default.readFileSync(
|
|
206
|
+
raw = node_fs_1.default.readFileSync(file);
|
|
87
207
|
}
|
|
88
208
|
catch {
|
|
89
209
|
counters.errors++;
|
|
90
210
|
continue;
|
|
91
211
|
}
|
|
92
212
|
const t0 = process.hrtime.bigint();
|
|
93
|
-
let
|
|
213
|
+
let check;
|
|
94
214
|
try {
|
|
95
|
-
|
|
215
|
+
check = await checkMessage(raw);
|
|
96
216
|
}
|
|
97
217
|
catch {
|
|
98
218
|
counters.errors++;
|
|
99
219
|
continue;
|
|
100
220
|
}
|
|
101
221
|
counters.durations.push(Number(process.hrtime.bigint() - t0) / 1e6);
|
|
102
|
-
counters
|
|
103
|
-
const visible = result.segments;
|
|
104
|
-
const hidden = result.hiddenSegments;
|
|
105
|
-
const visibleChars = visible.reduce((sum, segment) => sum + segment.text.length, 0);
|
|
106
|
-
const hiddenChars = hidden.reduce((sum, segment) => sum + segment.text.length, 0);
|
|
107
|
-
counters.visibleChars += visibleChars;
|
|
108
|
-
counters.hiddenChars += hiddenChars;
|
|
109
|
-
for (const segment of [...visible, ...hidden]) {
|
|
110
|
-
counters.labels.set(segment.type, (counters.labels.get(segment.type) ?? 0) + 1);
|
|
111
|
-
}
|
|
112
|
-
const hadContent = visibleChars + hiddenChars > 0;
|
|
113
|
-
if (hadContent && visibleChars === 0) {
|
|
114
|
-
counters.everythingHidden++;
|
|
115
|
-
}
|
|
116
|
-
if (hadContent && !visible.length) {
|
|
117
|
-
counters.emptyFromNonEmpty++;
|
|
118
|
-
}
|
|
119
|
-
if (visible.length > 0 && visible.every(segment => segment.type === 'SIGNATURE' || segment.type === 'DISCLAIMER')) {
|
|
120
|
-
counters.onlySignatureVisible++;
|
|
121
|
-
}
|
|
122
|
-
for (const segment of hidden) {
|
|
123
|
-
if (!segment.reasons.some(reason => ANCHOR_REASONS.has(reason))) {
|
|
124
|
-
counters.hiddenWithoutAnchor++;
|
|
125
|
-
}
|
|
126
|
-
if (segment.type === 'FORWARDED_CONTENT') {
|
|
127
|
-
counters.forwardedHidden++;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
222
|
+
record(counters, check);
|
|
130
223
|
if (counters.messages % 250 === 0) {
|
|
131
224
|
rssPeak = Math.max(rssPeak, process.memoryUsage.rss());
|
|
132
225
|
}
|
|
@@ -136,12 +229,12 @@ async function benchmarkCommand(args) {
|
|
|
136
229
|
counters.durations.sort((a, b) => a - b);
|
|
137
230
|
const out = [];
|
|
138
231
|
const pct = (value) => `${((100 * value) / Math.max(1, counters.messages)).toFixed(2)}%`;
|
|
139
|
-
out.push(`sample: ${counters.messages} messages (
|
|
232
|
+
out.push(`sample: ${counters.messages} messages (${inputs.label})`);
|
|
140
233
|
out.push(`errors: ${counters.errors}`);
|
|
141
234
|
out.push('');
|
|
142
235
|
out.push('THROUGHPUT');
|
|
143
236
|
out.push(` total ${(elapsed / 1000).toFixed(1)}s`);
|
|
144
|
-
out.push(` rate ${((counters.messages / elapsed) * 1000).toFixed(0)} messages/s (single threaded)`);
|
|
237
|
+
out.push(` rate ${((counters.messages / Math.max(1, elapsed)) * 1000).toFixed(0)} messages/s (single threaded)`);
|
|
145
238
|
out.push(` per message p50 ${percentile(counters.durations, 0.5).toFixed(2)} ms`);
|
|
146
239
|
out.push(` per message p90 ${percentile(counters.durations, 0.9).toFixed(2)} ms`);
|
|
147
240
|
out.push(` per message p99 ${percentile(counters.durations, 0.99).toFixed(2)} ms`);
|
|
@@ -150,6 +243,7 @@ async function benchmarkCommand(args) {
|
|
|
150
243
|
out.push('');
|
|
151
244
|
out.push('CONTENT');
|
|
152
245
|
const totalChars = counters.visibleChars + counters.hiddenChars;
|
|
246
|
+
out.push(` non empty inputs ${counters.nonEmptyInputs} (${pct(counters.nonEmptyInputs)})`);
|
|
153
247
|
out.push(` visible characters ${counters.visibleChars.toLocaleString('en-US')} (${((100 * counters.visibleChars) / Math.max(1, totalChars)).toFixed(1)}%)`);
|
|
154
248
|
out.push(` hidden characters ${counters.hiddenChars.toLocaleString('en-US')} (${((100 * counters.hiddenChars) / Math.max(1, totalChars)).toFixed(1)}%)`);
|
|
155
249
|
out.push('');
|
|
@@ -157,6 +251,13 @@ async function benchmarkCommand(args) {
|
|
|
157
251
|
for (const [label, count] of [...counters.labels].sort((a, b) => b[1] - a[1])) {
|
|
158
252
|
out.push(` ${label.padEnd(18)} ${String(count).padStart(7)}`);
|
|
159
253
|
}
|
|
254
|
+
if (counters.warnings.size) {
|
|
255
|
+
out.push('');
|
|
256
|
+
out.push('MESSAGES BY WARNING');
|
|
257
|
+
for (const [code, count] of [...counters.warnings].sort((a, b) => b[1] - a[1])) {
|
|
258
|
+
out.push(` ${code.padEnd(34)} ${String(count).padStart(7)} (${pct(count)})`);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
160
261
|
out.push('');
|
|
161
262
|
out.push('CATASTROPHIC CHECKS (structural, no labels required)');
|
|
162
263
|
out.push(` empty extraction from non empty message ${counters.emptyFromNonEmpty} (${pct(counters.emptyFromNonEmpty)})`);
|
|
@@ -164,9 +265,21 @@ async function benchmarkCommand(args) {
|
|
|
164
265
|
out.push(` only a footer left visible ${counters.onlySignatureVisible} (${pct(counters.onlySignatureVisible)})`);
|
|
165
266
|
out.push(` hidden without a structural anchor ${counters.hiddenWithoutAnchor} (${pct(counters.hiddenWithoutAnchor)})`);
|
|
166
267
|
out.push(` forwarded content hidden ${counters.forwardedHidden} (${pct(counters.forwardedHidden)})`);
|
|
268
|
+
out.push(` degraded HTML with empty output ${counters.degradedWithEmptyOutput} (${pct(counters.degradedWithEmptyOutput)})`);
|
|
269
|
+
out.push(` messages missing a MIME coverage group ${counters.messagesMissingCoverage} (${pct(counters.messagesMissingCoverage)})`);
|
|
270
|
+
out.push('');
|
|
271
|
+
out.push('MIME COVERAGE (informational, not failures)');
|
|
272
|
+
out.push(` missing required groups ${counters.missingCoverageGroups}`);
|
|
273
|
+
out.push(` alternative members not emitted ${counters.alternativesNotEmitted}`);
|
|
274
|
+
out.push(` groups represented only by hidden text ${counters.coverageHiddenOnly}`);
|
|
167
275
|
process.stdout.write(`${out.join('\n')}\n`);
|
|
168
276
|
// A non zero exit makes this usable as a regression gate.
|
|
169
|
-
const failed = counters.emptyFromNonEmpty +
|
|
277
|
+
const failed = counters.emptyFromNonEmpty +
|
|
278
|
+
counters.everythingHidden +
|
|
279
|
+
counters.hiddenWithoutAnchor +
|
|
280
|
+
counters.forwardedHidden +
|
|
281
|
+
counters.degradedWithEmptyOutput +
|
|
282
|
+
counters.messagesMissingCoverage;
|
|
170
283
|
return failed === 0 ? 0 : 1;
|
|
171
284
|
}
|
|
172
285
|
//# sourceMappingURL=benchmark.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../../src/cli/benchmark.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../../src/cli/benchmark.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/corpus.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"corpus.d.ts","sourceRoot":"","sources":["../../src/cli/corpus.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,
|
|
1
|
+
{"version":3,"file":"corpus.d.ts","sourceRoot":"","sources":["../../src/cli/corpus.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,EAAiF,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AA2IxH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAY9F"}
|
package/dist/cli/corpus.js
CHANGED
|
@@ -47,6 +47,17 @@ async function scan(args) {
|
|
|
47
47
|
return 2;
|
|
48
48
|
}
|
|
49
49
|
const dbPath = (0, args_1.flagString)(args, 'db', DEFAULT_DB);
|
|
50
|
+
// Every option is read before anything is printed or opened, so an invalid one fails without a
|
|
51
|
+
// half started run and without a database file to clean up afterwards.
|
|
52
|
+
const options = {
|
|
53
|
+
sample: (0, args_1.flagNonNegativeInt)(args, 'sample', 0),
|
|
54
|
+
seed: (0, args_1.flagString)(args, 'seed', 'default'),
|
|
55
|
+
concurrency: (0, args_1.flagNonNegativeInt)(args, 'concurrency', 0) || undefined,
|
|
56
|
+
resume: (0, args_1.flagBool)(args, 'resume', true),
|
|
57
|
+
maxFileBytes: (0, args_1.flagPositiveInt)(args, 'max-file-mb', 32) * 1024 * 1024,
|
|
58
|
+
timeoutMs: (0, args_1.flagPositiveInt)(args, 'timeout', 30000),
|
|
59
|
+
batchSize: (0, args_1.flagPositiveInt)(args, 'batch', 500)
|
|
60
|
+
};
|
|
50
61
|
const isTty = process.stderr.isTTY;
|
|
51
62
|
let lastLength = 0;
|
|
52
63
|
process.stderr.write(`Scanning ${node_path_1.default.resolve(root)}\n`);
|
|
@@ -54,13 +65,7 @@ async function scan(args) {
|
|
|
54
65
|
const summary = await (0, scanner_1.scanCorpus)({
|
|
55
66
|
root,
|
|
56
67
|
dbPath,
|
|
57
|
-
|
|
58
|
-
seed: (0, args_1.flagString)(args, 'seed', 'default'),
|
|
59
|
-
concurrency: (0, args_1.flagNumber)(args, 'concurrency', 0) || undefined,
|
|
60
|
-
resume: (0, args_1.flagBool)(args, 'resume', true),
|
|
61
|
-
maxFileBytes: (0, args_1.flagNumber)(args, 'max-file-mb', 32) * 1024 * 1024,
|
|
62
|
-
timeoutMs: (0, args_1.flagNumber)(args, 'timeout', 30000),
|
|
63
|
-
batchSize: (0, args_1.flagNumber)(args, 'batch', 500),
|
|
68
|
+
...options,
|
|
64
69
|
onProgress: progress => {
|
|
65
70
|
const line = renderProgress(progress);
|
|
66
71
|
if (isTty) {
|
|
@@ -92,7 +97,7 @@ function stats(args) {
|
|
|
92
97
|
process.stdout.write(`${JSON.stringify(computed, null, 2)}\n`);
|
|
93
98
|
return 0;
|
|
94
99
|
}
|
|
95
|
-
const root = store.
|
|
100
|
+
const root = store.latestCompletedRun()?.root ?? 'unknown';
|
|
96
101
|
const report = (0, stats_1.renderReport)(computed, root);
|
|
97
102
|
const out = (0, args_1.flagOptionalString)(args, 'out');
|
|
98
103
|
if (out) {
|
package/dist/cli/corpus.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"corpus.js","sourceRoot":"","sources":["../../src/cli/corpus.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;
|
|
1
|
+
{"version":3,"file":"corpus.js","sourceRoot":"","sources":["../../src/cli/corpus.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"disagreements.d.ts","sourceRoot":"","sources":["../../src/cli/disagreements.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAUH,OAAO,
|
|
1
|
+
{"version":3,"file":"disagreements.d.ts","sourceRoot":"","sources":["../../src/cli/disagreements.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAUH,OAAO,EAAmD,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AA2C1F,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CA6F5E"}
|
|
@@ -63,16 +63,19 @@ async function disagreementsCommand(args) {
|
|
|
63
63
|
process.stderr.write(`unknown direction: ${direction}. Use one of ${Object.keys(DIRECTIONS).join(', ')}\n`);
|
|
64
64
|
return 2;
|
|
65
65
|
}
|
|
66
|
-
const limit = (0, args_1.
|
|
67
|
-
const context = (0, args_1.
|
|
66
|
+
const limit = (0, args_1.flagPositiveInt)(args, 'limit', 20);
|
|
67
|
+
const context = (0, args_1.flagNonNegativeInt)(args, 'context', 2);
|
|
68
68
|
const store = new store_1.CorpusStore(dbPath);
|
|
69
|
-
|
|
69
|
+
// Only a run that finished cleanly. An interrupted or failed run holds partial output that
|
|
70
|
+
// looks exactly like a small corpus, and reading it as a baseline approves a release against
|
|
71
|
+
// whatever fraction of the messages happened to finish.
|
|
72
|
+
const root = store.latestCompletedRun()?.root;
|
|
70
73
|
if (!root) {
|
|
71
74
|
process.stderr.write('no completed scan run found\n');
|
|
72
75
|
store.close();
|
|
73
76
|
return 2;
|
|
74
77
|
}
|
|
75
|
-
const runFilter = (0, args_1.
|
|
78
|
+
const runFilter = (0, args_1.flagNonNegativeInt)(args, 'run', 0);
|
|
76
79
|
const rows = store.query(`SELECT path, block_index, representation, label, confidence, baseline_label, baseline_conf, baseline_reasons, char_count
|
|
77
80
|
FROM annotations
|
|
78
81
|
WHERE ${clause} ${runFilter ? 'AND run_id = ' + runFilter : ''}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"disagreements.js","sourceRoot":"","sources":["../../src/cli/disagreements.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;;;AAqDH,
|
|
1
|
+
{"version":3,"file":"disagreements.js","sourceRoot":"","sources":["../../src/cli/disagreements.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../src/cli/evaluate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAUH,OAAO,
|
|
1
|
+
{"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../src/cli/evaluate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAUH,OAAO,EAA4C,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AAgFnF,wBAAsB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CA+KvE"}
|
package/dist/cli/evaluate.js
CHANGED
|
@@ -88,9 +88,12 @@ async function evaluateCommand(args) {
|
|
|
88
88
|
const model = (0, args_1.flagString)(args, 'model', 'gpt-5.6-sol');
|
|
89
89
|
const useHistory = (0, args_1.flagBool)(args, 'history', false);
|
|
90
90
|
const groupBy = (0, args_1.flagString)(args, 'group-by', 'client');
|
|
91
|
-
const limit = (0, args_1.
|
|
91
|
+
const limit = (0, args_1.flagNonNegativeInt)(args, 'limit', 0);
|
|
92
92
|
const store = new store_1.CorpusStore(dbPath);
|
|
93
|
-
|
|
93
|
+
// Only a run that finished cleanly. An interrupted or failed run holds partial output that
|
|
94
|
+
// looks exactly like a small corpus, and reading it as a baseline approves a release against
|
|
95
|
+
// whatever fraction of the messages happened to finish.
|
|
96
|
+
const root = store.latestCompletedRun()?.root;
|
|
94
97
|
if (!root) {
|
|
95
98
|
process.stderr.write('no completed scan run found\n');
|
|
96
99
|
store.close();
|
|
@@ -98,7 +101,7 @@ async function evaluateCommand(args) {
|
|
|
98
101
|
}
|
|
99
102
|
// Latest annotation per (path, block) for the chosen model, so re-annotated messages do not
|
|
100
103
|
// count twice.
|
|
101
|
-
const reference = store.query(`SELECT a.path, a.block_index, a.label, a.char_count, m.client, m.lang, m.reply_style
|
|
104
|
+
const reference = store.query(`SELECT a.path, a.block_index, a.mime_part, a.label, a.char_count, m.client, m.lang, m.reply_style
|
|
102
105
|
FROM annotations a
|
|
103
106
|
JOIN annotation_runs r ON r.id = a.run_id
|
|
104
107
|
JOIN messages m ON m.path = a.path
|
|
@@ -161,15 +164,36 @@ async function evaluateCommand(args) {
|
|
|
161
164
|
}
|
|
162
165
|
// Map every reference block to the prediction covering it. Segments merge adjacent blocks,
|
|
163
166
|
// so a block is matched by its index falling inside a segment's block range.
|
|
167
|
+
//
|
|
168
|
+
// Keyed per MIME part, not by block index alone. Block indices are section-local, so in a
|
|
169
|
+
// multipart message with several body sections two segments legitimately start at index 0,
|
|
170
|
+
// and a flat map silently kept only the last of them. Older annotations predate the part
|
|
171
|
+
// being recorded; those fall back to a single unnamed bucket, which is exactly the previous
|
|
172
|
+
// behaviour for the single section messages they came from.
|
|
164
173
|
const predictions = new Map();
|
|
174
|
+
const bucketFor = (part) => {
|
|
175
|
+
let bucket = predictions.get(part);
|
|
176
|
+
if (!bucket) {
|
|
177
|
+
bucket = new Map();
|
|
178
|
+
predictions.set(part, bucket);
|
|
179
|
+
}
|
|
180
|
+
return bucket;
|
|
181
|
+
};
|
|
165
182
|
for (const segment of [...result.segments, ...result.hiddenSegments]) {
|
|
166
|
-
|
|
183
|
+
const blockIndex = (0, types_1.blockIndexOf)(segment.source);
|
|
184
|
+
if (blockIndex !== null) {
|
|
185
|
+
bucketFor((0, types_1.mimePartOf)(segment.source) ?? '').set(blockIndex, { label: segment.type, hidden: segment.visibility === 'hide' });
|
|
186
|
+
}
|
|
167
187
|
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
const lookup = (index) => {
|
|
188
|
+
const ordered = new Map([...predictions].map(([part, bucket]) => [part, [...bucket.keys()].sort((a, b) => a - b)]));
|
|
189
|
+
// Segments start at a block index and run to the next one, so fill forward within the part.
|
|
190
|
+
const lookup = (part, index) => {
|
|
191
|
+
// An annotation with no recorded part matches whichever part the output actually used,
|
|
192
|
+
// which for a single section message is the only one there is.
|
|
193
|
+
const key = part !== null && predictions.has(part) ? part : (predictions.keys().next().value ?? '');
|
|
194
|
+
const starts = ordered.get(key) ?? [];
|
|
171
195
|
let best = null;
|
|
172
|
-
for (const start of
|
|
196
|
+
for (const start of starts) {
|
|
173
197
|
if (start <= index) {
|
|
174
198
|
best = start;
|
|
175
199
|
}
|
|
@@ -177,12 +201,12 @@ async function evaluateCommand(args) {
|
|
|
177
201
|
break;
|
|
178
202
|
}
|
|
179
203
|
}
|
|
180
|
-
return best === null ? null : (predictions.get(best) ?? null);
|
|
204
|
+
return best === null ? null : (predictions.get(key)?.get(best) ?? null);
|
|
181
205
|
};
|
|
182
206
|
const first = references[0];
|
|
183
207
|
const group = groupBy === 'lang' ? (first?.lang ?? 'unknown') : groupBy === 'reply-style' ? (first?.reply_style ?? 'unknown') : (first?.client ?? 'unknown');
|
|
184
208
|
for (const item of references) {
|
|
185
|
-
const prediction = lookup(item.block_index);
|
|
209
|
+
const prediction = lookup(item.mime_part, item.block_index);
|
|
186
210
|
rows.push({
|
|
187
211
|
path: relPath,
|
|
188
212
|
blockIndex: item.block_index,
|