@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/analyze.d.ts
CHANGED
|
@@ -12,13 +12,52 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import { type ConfidenceConfig } from './classify/confidence';
|
|
14
14
|
import { type HistoryDocument } from './match/history';
|
|
15
|
-
import { type
|
|
15
|
+
import { type ContentAnalysisResult, type Reason } from './types';
|
|
16
|
+
/**
|
|
17
|
+
* One structurally independent piece of a message body.
|
|
18
|
+
*
|
|
19
|
+
* A `multipart/mixed` message can carry several. The commonest shape in the working corpus,
|
|
20
|
+
* `multipart/mixed(alternative(P,H), P)` at 3.1 percent of 320,377 messages, is an authored body
|
|
21
|
+
* followed by a separately encoded gateway footer. They are not alternative renderings of each
|
|
22
|
+
* other, and choosing between them deletes one.
|
|
23
|
+
*
|
|
24
|
+
* `text` and `html` within one section *are* alternative renderings, and at most one of them
|
|
25
|
+
* reaches the output.
|
|
26
|
+
*/
|
|
27
|
+
export interface BodySection {
|
|
28
|
+
/** Plain text of this section, already transfer and charset decoded. */
|
|
29
|
+
text?: string | null;
|
|
30
|
+
/** HTML of this section, already transfer and charset decoded. */
|
|
31
|
+
html?: string | null;
|
|
32
|
+
/** MIME part ids, when the caller knows them, purely for traceability in the output. */
|
|
33
|
+
textPartId?: string;
|
|
34
|
+
htmlPartId?: string;
|
|
35
|
+
/**
|
|
36
|
+
* Where the section sits. Derived internally by `extract()`; optional for external callers, who
|
|
37
|
+
* may supply at most one `primary`. Evidence only: an appended section is classified normally,
|
|
38
|
+
* because gateways append substantive text as often as they append disclaimers.
|
|
39
|
+
*/
|
|
40
|
+
role?: 'primary' | 'appended';
|
|
41
|
+
}
|
|
16
42
|
/** A message body, in whichever representations are available. */
|
|
17
43
|
export interface MessageContent {
|
|
18
44
|
/** Plain text body, already transfer and charset decoded. */
|
|
19
45
|
text?: string | null;
|
|
20
46
|
/** HTML body, already transfer and charset decoded. */
|
|
21
47
|
html?: string | null;
|
|
48
|
+
/**
|
|
49
|
+
* Ordered body sections, when the message has more than one.
|
|
50
|
+
*
|
|
51
|
+
* Array position is the canonical order; there is deliberately no second ordering field to
|
|
52
|
+
* disagree with it. Mutually exclusive with the single `text`/`html`/`textPartId`/`htmlPartId`
|
|
53
|
+
* fields above, which are sugar for exactly one section. Supplying both is rejected rather than
|
|
54
|
+
* guessed at.
|
|
55
|
+
*
|
|
56
|
+
* This is the shared path, not an `extract()` private. Building multi section composition
|
|
57
|
+
* inside `extract()` would give the raw message entry point a capability the content first one
|
|
58
|
+
* cannot express, and the two entry points must not be able to disagree about the same message.
|
|
59
|
+
*/
|
|
60
|
+
sections?: readonly BodySection[];
|
|
22
61
|
/** Subject line. Optional, and never allowed to change a label on its own. */
|
|
23
62
|
subject?: string | null;
|
|
24
63
|
/** Sender, as a display name and/or address. Used only as signature evidence. */
|
|
@@ -31,7 +70,14 @@ export interface MessageContent {
|
|
|
31
70
|
htmlPartId?: string;
|
|
32
71
|
}
|
|
33
72
|
export interface AnalyzeOptions {
|
|
34
|
-
confidence?: ConfidenceConfig
|
|
73
|
+
confidence?: Partial<ConfidenceConfig>;
|
|
74
|
+
/**
|
|
75
|
+
* Maximum characters of body content analysed, across every section. Default 8,000,000.
|
|
76
|
+
*
|
|
77
|
+
* A circuit breaker for the content first entry point, where there is no raw message to bound.
|
|
78
|
+
* Sections past the limit are not analysed and the result carries `input_limit_exceeded`.
|
|
79
|
+
*/
|
|
80
|
+
maxContentChars?: number;
|
|
35
81
|
/**
|
|
36
82
|
* Earlier messages in the thread, nearest first. Each may be raw RFC 5322 or already split
|
|
37
83
|
* content. History is optional and only ever adds evidence.
|
|
@@ -41,19 +87,13 @@ export interface AnalyzeOptions {
|
|
|
41
87
|
historyDocuments?: readonly HistoryDocument[];
|
|
42
88
|
explain?: boolean;
|
|
43
89
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
originalAvailable: true;
|
|
52
|
-
primaryRepresentation: 'text' | 'html' | 'none';
|
|
53
|
-
extractorVersion: string;
|
|
54
|
-
historyUsed: boolean;
|
|
55
|
-
/** True when the input looked like a reply, from threading headers or a subject prefix. */
|
|
56
|
-
isReply: boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Result of analysing one message body.
|
|
92
|
+
*
|
|
93
|
+
* Extends the shared contract rather than restating it, so the two entry points cannot drift apart
|
|
94
|
+
* again. `extract()` used to build its own object and silently drop `isReply`.
|
|
95
|
+
*/
|
|
96
|
+
export interface AnalyzeResult extends ContentAnalysisResult {
|
|
57
97
|
diagnostics?: {
|
|
58
98
|
primaryPart: string | null;
|
|
59
99
|
blocks: {
|
package/dist/analyze.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../src/analyze.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../src/analyze.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,OAAO,EAA8D,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC1H,OAAO,EAMH,KAAK,eAAe,EACvB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAqD,KAAK,qBAAqB,EAAE,KAAK,MAAM,EAA8B,MAAM,SAAS,CAAC;AAEjJ;;;;;;;;;;GAUG;AACH,MAAM,WAAW,WAAW;IACxB,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,kEAAkE;IAClE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,wFAAwF;IACxF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;CACjC;AAED,kEAAkE;AAClE,MAAM,WAAW,cAAc;IAC3B,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IAClC,8EAA8E;IAC9E,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,iFAAiF;IACjF,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,2FAA2F;IAC3F,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,wFAAwF;IACxF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACvC;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC,cAAc,GAAG,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACxD,0FAA0F;IAC1F,gBAAgB,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAc,SAAQ,qBAAqB;IACxD,WAAW,CAAC,EAAE;QACV,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,MAAM,EAAE;YACJ,KAAK,EAAE,MAAM,CAAC;YACd,IAAI,EAAE,MAAM,CAAC;YACb,KAAK,EAAE,MAAM,CAAC;YACd,UAAU,EAAE,MAAM,CAAC;YACnB,OAAO,EAAE,MAAM,EAAE,CAAC;YAClB,QAAQ,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAC;gBAAC,QAAQ,EAAE,MAAM,CAAA;aAAE,EAAE,CAAC;YAC3D,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAClC,OAAO,EAAE,MAAM,CAAC;SACnB,EAAE,CAAC;KACP,CAAC;CACL;AAiBD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,EAAE,CAa1E;AA0ND,8EAA8E;AAC9E,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAkBxF;AAED;;;;;GAKG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CA8N3G"}
|
package/dist/analyze.js
CHANGED
|
@@ -15,12 +15,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
15
15
|
exports.senderTokensFrom = senderTokensFrom;
|
|
16
16
|
exports.resolveHistory = resolveHistory;
|
|
17
17
|
exports.analyze = analyze;
|
|
18
|
+
const html_1 = require("./canonical/html");
|
|
19
|
+
const patterns_1 = require("./detect/patterns");
|
|
18
20
|
const html_blocks_1 = require("./segment/html-blocks");
|
|
19
21
|
const text_blocks_1 = require("./segment/text-blocks");
|
|
20
22
|
const rules_1 = require("./classify/rules");
|
|
21
23
|
const reconcile_1 = require("./classify/reconcile");
|
|
22
24
|
const confidence_1 = require("./classify/confidence");
|
|
23
25
|
const history_1 = require("./match/history");
|
|
26
|
+
const normalize_1 = require("./match/normalize");
|
|
27
|
+
const shingle_1 = require("./match/shingle");
|
|
24
28
|
const types_1 = require("./types");
|
|
25
29
|
const REPLY_SUBJECT = /^\s*(re|aw|sv|vs|vast|antw|res|odp|ответ)\s*(\[\d+\])?\s*:/i;
|
|
26
30
|
function contentChars(blocks) {
|
|
@@ -49,16 +53,20 @@ function senderTokensFrom(from) {
|
|
|
49
53
|
}
|
|
50
54
|
return [...tokens];
|
|
51
55
|
}
|
|
52
|
-
|
|
53
|
-
|
|
56
|
+
/** Confidence assigned to anything the pipeline could not classify. Never 1, never 0. */
|
|
57
|
+
const DEGRADED_CONFIDENCE = 0.5;
|
|
58
|
+
function representationInfo(blocks, representation, degraded) {
|
|
54
59
|
return {
|
|
55
60
|
representation,
|
|
56
|
-
|
|
61
|
+
blocks,
|
|
57
62
|
contentChars: contentChars(blocks),
|
|
58
|
-
|
|
59
|
-
|
|
63
|
+
// A representation that failed to segment has no evidence, so it has no anchors either.
|
|
64
|
+
hasAnchor: degraded ? false : hasAnchor(blocks),
|
|
65
|
+
degraded
|
|
60
66
|
};
|
|
61
67
|
}
|
|
68
|
+
/** Evidence that a section arrived as a later MIME sibling rather than as the message body. */
|
|
69
|
+
const APPENDED_SECTION_EVIDENCE = { id: 'mime:appended_section', kind: 'hint', strength: 0.5 };
|
|
62
70
|
/** Merge adjacent decisions carrying the same label, so the output is regions rather than lines. */
|
|
63
71
|
function toSegments(decisions, config) {
|
|
64
72
|
const segments = [];
|
|
@@ -66,7 +74,7 @@ function toSegments(decisions, config) {
|
|
|
66
74
|
const block = decision.block;
|
|
67
75
|
const previous = segments[segments.length - 1];
|
|
68
76
|
const visibility = (0, confidence_1.visibilityFor)(decision.label, decision.confidence, config);
|
|
69
|
-
if (previous && previous.type === decision.label && previous.visibility === visibility && previous.source
|
|
77
|
+
if (previous && previous.type === decision.label && previous.visibility === visibility && (0, types_1.mimePartOf)(previous.source) === block.mimePart) {
|
|
70
78
|
previous.text = previous.text ? `${previous.text}\n${block.content}` : block.content;
|
|
71
79
|
if (block.html) {
|
|
72
80
|
previous.html = (previous.html ?? '') + block.html;
|
|
@@ -91,9 +99,12 @@ function toSegments(decisions, config) {
|
|
|
91
99
|
visibility,
|
|
92
100
|
reasons: [...decision.reasons],
|
|
93
101
|
source: {
|
|
102
|
+
kind: 'mime-part',
|
|
94
103
|
mimePart: block.mimePart,
|
|
95
104
|
representation: block.representation,
|
|
96
|
-
|
|
105
|
+
// The section-local index, not the document-global one the classifier ran on. A
|
|
106
|
+
// reader following this back wants the block's position inside its own MIME part.
|
|
107
|
+
blockIndex: block.sourceIndex ?? block.index,
|
|
97
108
|
start: block.start,
|
|
98
109
|
end: block.end,
|
|
99
110
|
...(block.domPath ? { domPath: block.domPath } : {})
|
|
@@ -102,6 +113,130 @@ function toSegments(decisions, config) {
|
|
|
102
113
|
}
|
|
103
114
|
return segments.filter(segment => segment.text.trim().length > 0);
|
|
104
115
|
}
|
|
116
|
+
function trimmedOrEmpty(value) {
|
|
117
|
+
return typeof value === 'string' && value.trim() ? value : '';
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Are two adjacent sections the same content in two representations?
|
|
121
|
+
*
|
|
122
|
+
* Some clients emit `multipart/mixed(H, P)` where they meant `multipart/alternative`: 158 messages
|
|
123
|
+
* in the working corpus, most of them in that order. Structure alone cannot tell that apart from a
|
|
124
|
+
* genuine plain text sibling next to a genuine HTML one, and guessing wrong in the merging direction
|
|
125
|
+
* deletes a section. So the question is settled by content: shingle containment either way, at the
|
|
126
|
+
* same threshold history matching uses. No match means both are kept, and the cost of that is a
|
|
127
|
+
* body that appears twice rather than one that disappears.
|
|
128
|
+
*/
|
|
129
|
+
function isSameContentAlternative(a, b) {
|
|
130
|
+
const aText = trimmedOrEmpty(a.text);
|
|
131
|
+
const aHtml = trimmedOrEmpty(a.html);
|
|
132
|
+
const bText = trimmedOrEmpty(b.text);
|
|
133
|
+
const bHtml = trimmedOrEmpty(b.html);
|
|
134
|
+
let plain;
|
|
135
|
+
let markup;
|
|
136
|
+
if (aText && !aHtml && bHtml && !bText) {
|
|
137
|
+
plain = aText;
|
|
138
|
+
markup = bHtml;
|
|
139
|
+
}
|
|
140
|
+
else if (aHtml && !aText && bText && !bHtml) {
|
|
141
|
+
plain = bText;
|
|
142
|
+
markup = aHtml;
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
const left = (0, shingle_1.buildShingleIndex)((0, normalize_1.normaliseForMatch)(plain));
|
|
148
|
+
const right = (0, shingle_1.buildShingleIndex)((0, normalize_1.normaliseForMatch)((0, html_1.stripTagsToText)(markup)));
|
|
149
|
+
if (!(0, shingle_1.isMatchable)(left) || !(0, shingle_1.isMatchable)(right)) {
|
|
150
|
+
// Too short to judge. Keeping both is the safe answer.
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
return (0, shingle_1.containment)(left, right).containment >= shingle_1.CONTAINMENT_THRESHOLD || (0, shingle_1.containment)(right, left).containment >= shingle_1.CONTAINMENT_THRESHOLD;
|
|
154
|
+
}
|
|
155
|
+
function mergeEquivalentSections(sections) {
|
|
156
|
+
const merged = [];
|
|
157
|
+
for (const section of sections) {
|
|
158
|
+
const previous = merged[merged.length - 1];
|
|
159
|
+
if (previous && isSameContentAlternative(previous, section)) {
|
|
160
|
+
merged[merged.length - 1] = {
|
|
161
|
+
text: previous.text ?? section.text ?? null,
|
|
162
|
+
html: previous.html ?? section.html ?? null,
|
|
163
|
+
...((previous.textPartId ?? section.textPartId) ? { textPartId: previous.textPartId ?? section.textPartId } : {}),
|
|
164
|
+
...((previous.htmlPartId ?? section.htmlPartId) ? { htmlPartId: previous.htmlPartId ?? section.htmlPartId } : {}),
|
|
165
|
+
...(previous.role ? { role: previous.role } : {})
|
|
166
|
+
};
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
merged.push(section);
|
|
170
|
+
}
|
|
171
|
+
return merged;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Resolve the caller's input into an ordered list of body sections.
|
|
175
|
+
*
|
|
176
|
+
* The single `text`/`html` pair is sugar for exactly one section, normalised here so that both
|
|
177
|
+
* entry points and both call shapes run the identical composition below.
|
|
178
|
+
*/
|
|
179
|
+
function normaliseSections(content) {
|
|
180
|
+
const hasLegacyContent = trimmedOrEmpty(content.text) !== '' || trimmedOrEmpty(content.html) !== '';
|
|
181
|
+
if (content.sections) {
|
|
182
|
+
if (hasLegacyContent) {
|
|
183
|
+
throw new types_1.ConfigurationError('sections', 'the only body input; supplying text or html alongside it is ambiguous', 'conflicting_body_input');
|
|
184
|
+
}
|
|
185
|
+
if (content.sections.filter(section => section.role === 'primary').length > 1) {
|
|
186
|
+
throw new types_1.ConfigurationError('sections', 'a list with at most one section whose role is "primary"', 'invalid_section_role');
|
|
187
|
+
}
|
|
188
|
+
return mergeEquivalentSections(content.sections.filter(section => trimmedOrEmpty(section.text) || trimmedOrEmpty(section.html)));
|
|
189
|
+
}
|
|
190
|
+
if (!hasLegacyContent) {
|
|
191
|
+
return [];
|
|
192
|
+
}
|
|
193
|
+
return [
|
|
194
|
+
{
|
|
195
|
+
text: content.text ?? null,
|
|
196
|
+
html: content.html ?? null,
|
|
197
|
+
...(content.textPartId ? { textPartId: content.textPartId } : {}),
|
|
198
|
+
...(content.htmlPartId ? { htmlPartId: content.htmlPartId } : {}),
|
|
199
|
+
role: 'primary'
|
|
200
|
+
}
|
|
201
|
+
];
|
|
202
|
+
}
|
|
203
|
+
/** Characters of body content analysed by default, across every section. */
|
|
204
|
+
const DEFAULT_MAX_CONTENT_CHARS = 8_000_000;
|
|
205
|
+
function validateMaxContentChars(value) {
|
|
206
|
+
if (value === undefined) {
|
|
207
|
+
return DEFAULT_MAX_CONTENT_CHARS;
|
|
208
|
+
}
|
|
209
|
+
if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 1) {
|
|
210
|
+
throw new types_1.ConfigurationError('maxContentChars', 'a positive safe integer');
|
|
211
|
+
}
|
|
212
|
+
return value;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Drop sections once the aggregate content budget is spent.
|
|
216
|
+
*
|
|
217
|
+
* Whole sections rather than a character cut: a half section would be classified against structure
|
|
218
|
+
* that is not there, and a confident wrong answer about truncated input is worse than an honest
|
|
219
|
+
* refusal. Everything the budget did allow through is analysed and returned in full, and the
|
|
220
|
+
* warning names the option so the caller can raise it.
|
|
221
|
+
*/
|
|
222
|
+
function limitSections(sections, maxContentChars, warnings) {
|
|
223
|
+
const kept = [];
|
|
224
|
+
let used = 0;
|
|
225
|
+
for (const section of sections) {
|
|
226
|
+
const size = (section.text?.length ?? 0) + (section.html?.length ?? 0);
|
|
227
|
+
if (kept.length && used + size > maxContentChars) {
|
|
228
|
+
warnings.push({ code: 'input_limit_exceeded', detail: `maxContentChars (${maxContentChars})` });
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
231
|
+
used += size;
|
|
232
|
+
kept.push(section);
|
|
233
|
+
if (used > maxContentChars) {
|
|
234
|
+
warnings.push({ code: 'input_limit_exceeded', detail: `maxContentChars (${maxContentChars})` });
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return kept;
|
|
239
|
+
}
|
|
105
240
|
/** Turn whatever the caller supplied as history into searchable documents. */
|
|
106
241
|
async function resolveHistory(options) {
|
|
107
242
|
if (options.historyDocuments?.length) {
|
|
@@ -131,26 +266,35 @@ async function resolveHistory(options) {
|
|
|
131
266
|
* segment, because showing too much is always preferable to showing nothing.
|
|
132
267
|
*/
|
|
133
268
|
async function analyze(content, options = {}) {
|
|
134
|
-
|
|
269
|
+
// Classifier assets are loaded here, outside the fail-soft block below.
|
|
270
|
+
//
|
|
271
|
+
// Detectors call `loadPatterns()` lazily, which put its "no patterns could be loaded" assertion
|
|
272
|
+
// inside the per message catch: a broken installation came back as one more degraded result
|
|
273
|
+
// among many, and every message looked like new content because nothing could be detected as
|
|
274
|
+
// history. A missing package asset is an installation defect and has to fail like one.
|
|
275
|
+
(0, patterns_1.loadPatterns)();
|
|
276
|
+
// Validated before any work. An invalid threshold is a programmer error that would otherwise
|
|
277
|
+
// repeat silently on every message, so it throws here rather than degrading a result.
|
|
278
|
+
const config = (0, confidence_1.validateConfidenceConfig)(options.confidence);
|
|
279
|
+
const maxContentChars = validateMaxContentChars(options.maxContentChars);
|
|
135
280
|
const warnings = [];
|
|
136
|
-
const
|
|
137
|
-
const html = typeof content.html === 'string' ? content.html : '';
|
|
281
|
+
const sections = limitSections(normaliseSections(content), maxContentChars, warnings);
|
|
138
282
|
const isReply = Boolean(content.inReplyTo) || (content.references?.length ?? 0) > 0 || REPLY_SUBJECT.test(content.subject ?? '');
|
|
139
283
|
const base = {
|
|
140
284
|
originalAvailable: true,
|
|
141
285
|
extractorVersion: types_1.EXTRACTOR_VERSION,
|
|
142
286
|
isReply
|
|
143
287
|
};
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
};
|
|
288
|
+
const empty = {
|
|
289
|
+
...base,
|
|
290
|
+
segments: [],
|
|
291
|
+
hiddenSegments: [],
|
|
292
|
+
overallConfidence: 1,
|
|
293
|
+
primaryRepresentation: 'none',
|
|
294
|
+
historyUsed: false
|
|
295
|
+
};
|
|
296
|
+
if (!sections.length) {
|
|
297
|
+
return { ...empty, warnings: [{ code: 'no_body_parts' }] };
|
|
154
298
|
}
|
|
155
299
|
const senderTokens = senderTokensFrom(content.from);
|
|
156
300
|
let history = [];
|
|
@@ -161,46 +305,96 @@ async function analyze(content, options = {}) {
|
|
|
161
305
|
// History is optional evidence. Failing to build it is never fatal.
|
|
162
306
|
}
|
|
163
307
|
try {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
const
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
308
|
+
// Segment every section and choose its representation, before anything is classified.
|
|
309
|
+
const segmented = [];
|
|
310
|
+
const documentBlocks = [];
|
|
311
|
+
for (const section of sections) {
|
|
312
|
+
const sectionText = typeof section.text === 'string' ? section.text : '';
|
|
313
|
+
const sectionHtml = typeof section.html === 'string' ? section.html : '';
|
|
314
|
+
let textInfo = null;
|
|
315
|
+
let htmlInfo = null;
|
|
316
|
+
if (sectionText.trim()) {
|
|
317
|
+
const blocks = (0, text_blocks_1.segmentTextBlocks)(sectionText, section.textPartId ?? 'TEXT').blocks;
|
|
318
|
+
textInfo = representationInfo(blocks, 'text', false);
|
|
319
|
+
}
|
|
320
|
+
if (sectionHtml.trim()) {
|
|
321
|
+
const htmlPartId = section.htmlPartId ?? 'HTML';
|
|
322
|
+
const result = (0, html_blocks_1.segmentHtmlBlocks)(sectionHtml, htmlPartId);
|
|
323
|
+
if (result.degraded) {
|
|
324
|
+
warnings.push({ code: 'html_parse_error', mimePart: htmlPartId });
|
|
325
|
+
}
|
|
326
|
+
htmlInfo = representationInfo(result.blocks, 'html', result.degraded);
|
|
176
327
|
}
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
primaryBlocks = segmented.blocks;
|
|
328
|
+
if (!textInfo && !htmlInfo) {
|
|
329
|
+
continue;
|
|
180
330
|
}
|
|
331
|
+
const choice = (0, reconcile_1.pickPrimary)(textInfo, htmlInfo);
|
|
332
|
+
const start = documentBlocks.length;
|
|
333
|
+
for (const block of choice.primary.blocks) {
|
|
334
|
+
// Section-local index preserved for traceability; the array position becomes the
|
|
335
|
+
// decision index, which is what the classifier indexes its own arrays with.
|
|
336
|
+
block.sourceIndex = block.index;
|
|
337
|
+
block.index = documentBlocks.length;
|
|
338
|
+
if (section.role === 'appended') {
|
|
339
|
+
block.evidence.push(APPENDED_SECTION_EVIDENCE);
|
|
340
|
+
}
|
|
341
|
+
documentBlocks.push(block);
|
|
342
|
+
}
|
|
343
|
+
segmented.push({ choice, role: section.role ?? 'primary', start, end: documentBlocks.length });
|
|
181
344
|
}
|
|
182
|
-
if (!
|
|
183
|
-
return {
|
|
184
|
-
...base,
|
|
185
|
-
segments: [],
|
|
186
|
-
hiddenSegments: [],
|
|
187
|
-
overallConfidence: 1,
|
|
188
|
-
warnings: [...warnings, { code: 'no_body_parts' }],
|
|
189
|
-
primaryRepresentation: 'none',
|
|
190
|
-
historyUsed: false
|
|
191
|
-
};
|
|
345
|
+
if (!documentBlocks.length) {
|
|
346
|
+
return { ...empty, warnings: [...warnings, { code: 'no_body_parts' }] };
|
|
192
347
|
}
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
348
|
+
// Positional features are document-global, so that an appended gateway footer cannot stop
|
|
349
|
+
// the primary section's signature from being the last thing the sender wrote.
|
|
350
|
+
for (const block of documentBlocks) {
|
|
351
|
+
block.features.indexFromEnd = documentBlocks.length - 1 - block.index;
|
|
196
352
|
}
|
|
197
|
-
|
|
198
|
-
|
|
353
|
+
const matches = history.length ? (0, history_1.matchBlocks)(documentBlocks, history) : [];
|
|
354
|
+
const decisions = (0, rules_1.classifyBlocks)(documentBlocks, {
|
|
355
|
+
config,
|
|
356
|
+
historyMatchedIndices: (0, history_1.matchedIndices)(matches),
|
|
357
|
+
historyStrongIndices: (0, history_1.strongMatchedIndices)(matches),
|
|
358
|
+
senderTokens
|
|
359
|
+
});
|
|
360
|
+
for (const section of segmented) {
|
|
361
|
+
const slice = decisions.slice(section.start, section.end);
|
|
362
|
+
if (section.choice.primary.degraded) {
|
|
363
|
+
// A degraded parse has lost exactly the structure the visibility rules depend on,
|
|
364
|
+
// so its decisions are replaced rather than trusted. Letting reply-header, quote
|
|
365
|
+
// region and footer reasoning act on its flattened projection would let it infer
|
|
366
|
+
// hidden regions from evidence it no longer has.
|
|
367
|
+
for (const decision of slice) {
|
|
368
|
+
decision.label = 'UNKNOWN';
|
|
369
|
+
decision.confidence = DEGRADED_CONFIDENCE;
|
|
370
|
+
decision.reasons = ['degraded_to_unknown'];
|
|
371
|
+
}
|
|
372
|
+
continue;
|
|
373
|
+
}
|
|
374
|
+
const secondary = section.choice.secondary;
|
|
375
|
+
const secondaryMatches = secondary ? (0, history_1.matchBlocks)(secondary.blocks, history) : [];
|
|
376
|
+
const secondaryDecisions = secondary
|
|
377
|
+
? (0, rules_1.classifyBlocks)(secondary.blocks, {
|
|
378
|
+
config,
|
|
379
|
+
historyMatchedIndices: (0, history_1.matchedIndices)(secondaryMatches),
|
|
380
|
+
historyStrongIndices: (0, history_1.strongMatchedIndices)(secondaryMatches),
|
|
381
|
+
senderTokens
|
|
382
|
+
})
|
|
383
|
+
: null;
|
|
384
|
+
(0, reconcile_1.reconcileSection)(section.choice.primary.representation, slice, secondaryDecisions);
|
|
199
385
|
}
|
|
200
|
-
const decisions = (0, reconcile_1.reconcile)(outcome);
|
|
201
386
|
const segments = toSegments(decisions, config);
|
|
387
|
+
const primary = segmented[0].choice.primary;
|
|
388
|
+
if (!segments.length) {
|
|
389
|
+
// A body part existed and yielded nothing a reader would have seen: scripts, styles,
|
|
390
|
+
// comments, a tracking pixel, or markup that could not be parsed. An empty result with
|
|
391
|
+
// no explanation is indistinguishable from content loss, so name the case. Additive,
|
|
392
|
+
// and never a substitute for returning content that does exist.
|
|
393
|
+
warnings.push({ code: 'no_visible_body_text', mimePart: decisions[0]?.block.mimePart ?? primary.representation.toUpperCase() });
|
|
394
|
+
}
|
|
202
395
|
const visible = segments.filter(segment => segment.visibility !== 'hide');
|
|
203
396
|
const hidden = segments.filter(segment => segment.visibility === 'hide');
|
|
397
|
+
const anyDegraded = segmented.some(section => section.choice.primary.degraded);
|
|
204
398
|
// Invariant: a message with body text always yields something visible.
|
|
205
399
|
const bodyHasText = decisions.some(decision => decision.block.content.trim().length > 0);
|
|
206
400
|
if (bodyHasText && !visible.length) {
|
|
@@ -214,26 +408,39 @@ async function analyze(content, options = {}) {
|
|
|
214
408
|
...base,
|
|
215
409
|
segments,
|
|
216
410
|
hiddenSegments: [],
|
|
217
|
-
overallConfidence:
|
|
411
|
+
overallConfidence: DEGRADED_CONFIDENCE,
|
|
218
412
|
warnings,
|
|
219
|
-
primaryRepresentation:
|
|
413
|
+
primaryRepresentation: primary.representation,
|
|
220
414
|
historyUsed: history.length > 0,
|
|
221
|
-
...(options.explain ? { diagnostics: buildDiagnostics(
|
|
415
|
+
...(options.explain ? { diagnostics: buildDiagnostics(documentBlocks, decisions) } : {})
|
|
222
416
|
};
|
|
223
417
|
}
|
|
224
418
|
return {
|
|
225
419
|
...base,
|
|
226
420
|
segments: visible,
|
|
227
421
|
hiddenSegments: hidden,
|
|
228
|
-
|
|
422
|
+
// A degraded section never reports full confidence, including when its projection was
|
|
423
|
+
// empty and there is nothing to report confidence about. Claiming 1 for a body the
|
|
424
|
+
// pipeline could not read would be the most misleading number in the result.
|
|
425
|
+
overallConfidence: anyDegraded ? Math.min(DEGRADED_CONFIDENCE, (0, confidence_1.overallConfidence)(segments)) : (0, confidence_1.overallConfidence)(segments),
|
|
229
426
|
warnings,
|
|
230
|
-
primaryRepresentation:
|
|
427
|
+
primaryRepresentation: primary.representation,
|
|
231
428
|
historyUsed: history.length > 0,
|
|
232
|
-
...(options.explain ? { diagnostics: buildDiagnostics(
|
|
429
|
+
...(options.explain ? { diagnostics: buildDiagnostics(documentBlocks, decisions) } : {})
|
|
233
430
|
};
|
|
234
431
|
}
|
|
235
432
|
catch (err) {
|
|
236
|
-
|
|
433
|
+
// Whatever went wrong, the caller still gets their content back, whole and visible.
|
|
434
|
+
//
|
|
435
|
+
// The source reference names the representation and part the surviving text actually came
|
|
436
|
+
// from. It used to be hardcoded to `TEXT`/`text` even when the content was HTML, which is a
|
|
437
|
+
// traceability bug of the same family as losing the content outright: a reviewer following
|
|
438
|
+
// it lands on a part that never held this text.
|
|
439
|
+
const first = sections[0];
|
|
440
|
+
const text = typeof first?.text === 'string' ? first.text : '';
|
|
441
|
+
const html = typeof first?.html === 'string' ? first.html : '';
|
|
442
|
+
const fromText = Boolean(text.trim());
|
|
443
|
+
const fallback = fromText ? text : html;
|
|
237
444
|
return {
|
|
238
445
|
...base,
|
|
239
446
|
segments: fallback.trim()
|
|
@@ -241,15 +448,22 @@ async function analyze(content, options = {}) {
|
|
|
241
448
|
{
|
|
242
449
|
type: 'UNKNOWN',
|
|
243
450
|
text: fallback,
|
|
244
|
-
confidence:
|
|
451
|
+
confidence: DEGRADED_CONFIDENCE,
|
|
245
452
|
visibility: 'show',
|
|
246
453
|
reasons: ['degraded_to_unknown'],
|
|
247
|
-
source: {
|
|
454
|
+
source: {
|
|
455
|
+
kind: 'mime-part',
|
|
456
|
+
mimePart: (fromText ? first?.textPartId : first?.htmlPartId) ?? (fromText ? 'TEXT' : 'HTML'),
|
|
457
|
+
representation: fromText ? 'text' : 'html',
|
|
458
|
+
blockIndex: 0,
|
|
459
|
+
start: 0,
|
|
460
|
+
end: fallback.length
|
|
461
|
+
}
|
|
248
462
|
}
|
|
249
463
|
]
|
|
250
464
|
: [],
|
|
251
465
|
hiddenSegments: [],
|
|
252
|
-
overallConfidence:
|
|
466
|
+
overallConfidence: DEGRADED_CONFIDENCE,
|
|
253
467
|
warnings: [...warnings, { code: 'extraction_degraded', detail: err instanceof Error ? err.message.slice(0, 200) : 'unknown' }],
|
|
254
468
|
primaryRepresentation: 'none',
|
|
255
469
|
historyUsed: history.length > 0
|
package/dist/analyze.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../src/analyze.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../src/analyze.ts"],"names":[],"mappings":"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"}
|