@postalsys/email-content 0.0.4 → 0.1.0

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 (96) hide show
  1. package/README.md +207 -17
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/analyze.d.ts +55 -15
  4. package/dist/analyze.d.ts.map +1 -1
  5. package/dist/analyze.js +264 -61
  6. package/dist/analyze.js.map +1 -1
  7. package/dist/canonical/html.d.ts +21 -2
  8. package/dist/canonical/html.d.ts.map +1 -1
  9. package/dist/canonical/html.js +213 -14
  10. package/dist/canonical/html.js.map +1 -1
  11. package/dist/classify/confidence.d.ts +12 -0
  12. package/dist/classify/confidence.d.ts.map +1 -1
  13. package/dist/classify/confidence.js +54 -4
  14. package/dist/classify/confidence.js.map +1 -1
  15. package/dist/classify/reconcile.d.ts +25 -17
  16. package/dist/classify/reconcile.d.ts.map +1 -1
  17. package/dist/classify/reconcile.js +52 -20
  18. package/dist/classify/reconcile.js.map +1 -1
  19. package/dist/cli/annotate.d.ts.map +1 -1
  20. package/dist/cli/annotate.js +6 -3
  21. package/dist/cli/annotate.js.map +1 -1
  22. package/dist/cli/args.d.ts +14 -0
  23. package/dist/cli/args.d.ts.map +1 -1
  24. package/dist/cli/args.js +48 -1
  25. package/dist/cli/args.js.map +1 -1
  26. package/dist/cli/benchmark.d.ts +39 -0
  27. package/dist/cli/benchmark.d.ts.map +1 -1
  28. package/dist/cli/benchmark.js +179 -66
  29. package/dist/cli/benchmark.js.map +1 -1
  30. package/dist/cli/corpus.d.ts.map +1 -1
  31. package/dist/cli/corpus.js +13 -8
  32. package/dist/cli/corpus.js.map +1 -1
  33. package/dist/cli/disagreements.d.ts.map +1 -1
  34. package/dist/cli/disagreements.js +7 -4
  35. package/dist/cli/disagreements.js.map +1 -1
  36. package/dist/cli/evaluate.d.ts.map +1 -1
  37. package/dist/cli/evaluate.js +34 -10
  38. package/dist/cli/evaluate.js.map +1 -1
  39. package/dist/cli/extract.d.ts.map +1 -1
  40. package/dist/cli/extract.js +8 -3
  41. package/dist/cli/extract.js.map +1 -1
  42. package/dist/cli/main.js +8 -0
  43. package/dist/cli/main.js.map +1 -1
  44. package/dist/corpus/scanner.d.ts +9 -1
  45. package/dist/corpus/scanner.d.ts.map +1 -1
  46. package/dist/corpus/scanner.js +52 -13
  47. package/dist/corpus/scanner.js.map +1 -1
  48. package/dist/corpus/store.d.ts +33 -2
  49. package/dist/corpus/store.d.ts.map +1 -1
  50. package/dist/corpus/store.js +64 -4
  51. package/dist/corpus/store.js.map +1 -1
  52. package/dist/detect/patterns.d.ts +29 -0
  53. package/dist/detect/patterns.d.ts.map +1 -1
  54. package/dist/detect/patterns.js +80 -6
  55. package/dist/detect/patterns.js.map +1 -1
  56. package/dist/detect/reply-header.d.ts +14 -0
  57. package/dist/detect/reply-header.d.ts.map +1 -1
  58. package/dist/detect/reply-header.js +80 -37
  59. package/dist/detect/reply-header.js.map +1 -1
  60. package/dist/eval/oracle.d.ts +80 -0
  61. package/dist/eval/oracle.d.ts.map +1 -0
  62. package/dist/eval/oracle.js +250 -0
  63. package/dist/eval/oracle.js.map +1 -0
  64. package/dist/index.d.ts +6 -3
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +94 -56
  67. package/dist/index.js.map +1 -1
  68. package/dist/mime/model.d.ts +28 -3
  69. package/dist/mime/model.d.ts.map +1 -1
  70. package/dist/mime/model.js +41 -1
  71. package/dist/mime/model.js.map +1 -1
  72. package/dist/mime/parse.d.ts.map +1 -1
  73. package/dist/mime/parse.js +19 -2
  74. package/dist/mime/parse.js.map +1 -1
  75. package/dist/mime/select.d.ts +71 -0
  76. package/dist/mime/select.d.ts.map +1 -0
  77. package/dist/mime/select.js +198 -0
  78. package/dist/mime/select.js.map +1 -0
  79. package/dist/segment/html-blocks.d.ts +1 -1
  80. package/dist/segment/html-blocks.d.ts.map +1 -1
  81. package/dist/segment/html-blocks.js +77 -8
  82. package/dist/segment/html-blocks.js.map +1 -1
  83. package/dist/segment/text-blocks.d.ts.map +1 -1
  84. package/dist/segment/text-blocks.js +18 -1
  85. package/dist/segment/text-blocks.js.map +1 -1
  86. package/dist/segment/types.d.ts +14 -0
  87. package/dist/segment/types.d.ts.map +1 -1
  88. package/dist/types.d.ts +132 -11
  89. package/dist/types.d.ts.map +1 -1
  90. package/dist/types.js +37 -3
  91. package/dist/types.js.map +1 -1
  92. package/dist/util/worker-pool.d.ts +21 -0
  93. package/dist/util/worker-pool.d.ts.map +1 -1
  94. package/dist/util/worker-pool.js +61 -13
  95. package/dist/util/worker-pool.js.map +1 -1
  96. package/package.json +6 -5
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 Reason, type Segment, type Warning } from './types';
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
- export interface AnalyzeResult {
45
- /** Segments the client should render, in document order. */
46
- segments: Segment[];
47
- /** Segments the client may hide or collapse. Retained in full so nothing is ever lost. */
48
- hiddenSegments: Segment[];
49
- overallConfidence: number;
50
- warnings: Warning[];
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: {
@@ -1 +1 @@
1
- {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../src/analyze.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,OAAO,EAAwD,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACpH,OAAO,EAAsF,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC3I,OAAO,EAAqB,KAAK,MAAM,EAAE,KAAK,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,SAAS,CAAC;AAErF,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,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,gBAAgB,CAAC;IAC9B;;;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,MAAM,WAAW,aAAa;IAC1B,4DAA4D;IAC5D,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,0FAA0F;IAC1F,cAAc,EAAE,OAAO,EAAE,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,iBAAiB,EAAE,IAAI,CAAC;IACxB,qBAAqB,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAChD,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;IACrB,2FAA2F;IAC3F,OAAO,EAAE,OAAO,CAAC;IACjB,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;AAoED,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,CAuI3G"}
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,EAAsF,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAG3I,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,CAmN3G"}
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
- function buildRepresentation(blocks, representation, config, history, senderTokens) {
53
- const matches = history.length ? (0, history_1.matchBlocks)(blocks, history) : [];
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
- decisions: (0, rules_1.classifyBlocks)(blocks, { config, historyMatchedIndices: (0, history_1.matchedIndices)(matches), senderTokens }),
61
+ blocks,
57
62
  contentChars: contentChars(blocks),
58
- hasAnchor: hasAnchor(blocks),
59
- matches
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.mimePart === block.mimePart) {
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
- blockIndex: block.index,
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
- const config = options.confidence ?? confidence_1.DEFAULT_CONFIDENCE;
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 text = typeof content.text === 'string' ? content.text : '';
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
- if (!text.trim() && !html.trim()) {
145
- return {
146
- ...base,
147
- segments: [],
148
- hiddenSegments: [],
149
- overallConfidence: 1,
150
- warnings: [{ code: 'no_body_parts' }],
151
- primaryRepresentation: 'none',
152
- historyUsed: false
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,85 @@ async function analyze(content, options = {}) {
161
305
  // History is optional evidence. Failing to build it is never fatal.
162
306
  }
163
307
  try {
164
- let textResult = null;
165
- let htmlResult = null;
166
- let primaryBlocks = [];
167
- if (text.trim()) {
168
- const segmented = (0, text_blocks_1.segmentTextBlocks)(text, content.textPartId ?? 'TEXT');
169
- textResult = buildRepresentation(segmented.blocks, 'text', config, history, senderTokens);
170
- primaryBlocks = segmented.blocks;
171
- }
172
- if (html.trim()) {
173
- const segmented = (0, html_blocks_1.segmentHtmlBlocks)(html, content.htmlPartId ?? 'HTML');
174
- if (segmented.degraded) {
175
- warnings.push({ code: 'html_parse_error' });
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
- htmlResult = buildRepresentation(segmented.blocks, 'html', config, history, senderTokens);
178
- if (!textResult) {
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 (!textResult && !htmlResult) {
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
- const outcome = (0, reconcile_1.pickPrimary)(textResult, htmlResult);
194
- if (outcome.primary === htmlResult && htmlResult) {
195
- primaryBlocks = htmlResult.decisions.map(decision => decision.block);
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
- else if (textResult) {
198
- primaryBlocks = textResult.decisions.map(decision => decision.block);
353
+ const matches = history.length ? (0, history_1.matchBlocks)(documentBlocks, history) : [];
354
+ const decisions = (0, rules_1.classifyBlocks)(documentBlocks, { config, historyMatchedIndices: (0, history_1.matchedIndices)(matches), senderTokens });
355
+ for (const section of segmented) {
356
+ const slice = decisions.slice(section.start, section.end);
357
+ if (section.choice.primary.degraded) {
358
+ // A degraded parse has lost exactly the structure the visibility rules depend on,
359
+ // so its decisions are replaced rather than trusted. Letting reply-header, quote
360
+ // region and footer reasoning act on its flattened projection would let it infer
361
+ // hidden regions from evidence it no longer has.
362
+ for (const decision of slice) {
363
+ decision.label = 'UNKNOWN';
364
+ decision.confidence = DEGRADED_CONFIDENCE;
365
+ decision.reasons = ['degraded_to_unknown'];
366
+ }
367
+ continue;
368
+ }
369
+ const secondary = section.choice.secondary;
370
+ const secondaryDecisions = secondary
371
+ ? (0, rules_1.classifyBlocks)(secondary.blocks, { config, historyMatchedIndices: (0, history_1.matchedIndices)((0, history_1.matchBlocks)(secondary.blocks, history)), senderTokens })
372
+ : null;
373
+ (0, reconcile_1.reconcileSection)(section.choice.primary.representation, slice, secondaryDecisions);
199
374
  }
200
- const decisions = (0, reconcile_1.reconcile)(outcome);
201
375
  const segments = toSegments(decisions, config);
376
+ const primary = segmented[0].choice.primary;
377
+ if (!segments.length) {
378
+ // A body part existed and yielded nothing a reader would have seen: scripts, styles,
379
+ // comments, a tracking pixel, or markup that could not be parsed. An empty result with
380
+ // no explanation is indistinguishable from content loss, so name the case. Additive,
381
+ // and never a substitute for returning content that does exist.
382
+ warnings.push({ code: 'no_visible_body_text', mimePart: decisions[0]?.block.mimePart ?? primary.representation.toUpperCase() });
383
+ }
202
384
  const visible = segments.filter(segment => segment.visibility !== 'hide');
203
385
  const hidden = segments.filter(segment => segment.visibility === 'hide');
386
+ const anyDegraded = segmented.some(section => section.choice.primary.degraded);
204
387
  // Invariant: a message with body text always yields something visible.
205
388
  const bodyHasText = decisions.some(decision => decision.block.content.trim().length > 0);
206
389
  if (bodyHasText && !visible.length) {
@@ -214,26 +397,39 @@ async function analyze(content, options = {}) {
214
397
  ...base,
215
398
  segments,
216
399
  hiddenSegments: [],
217
- overallConfidence: 0.5,
400
+ overallConfidence: DEGRADED_CONFIDENCE,
218
401
  warnings,
219
- primaryRepresentation: outcome.primary.representation,
402
+ primaryRepresentation: primary.representation,
220
403
  historyUsed: history.length > 0,
221
- ...(options.explain ? { diagnostics: buildDiagnostics(primaryBlocks, decisions) } : {})
404
+ ...(options.explain ? { diagnostics: buildDiagnostics(documentBlocks, decisions) } : {})
222
405
  };
223
406
  }
224
407
  return {
225
408
  ...base,
226
409
  segments: visible,
227
410
  hiddenSegments: hidden,
228
- overallConfidence: (0, confidence_1.overallConfidence)(segments),
411
+ // A degraded section never reports full confidence, including when its projection was
412
+ // empty and there is nothing to report confidence about. Claiming 1 for a body the
413
+ // pipeline could not read would be the most misleading number in the result.
414
+ overallConfidence: anyDegraded ? Math.min(DEGRADED_CONFIDENCE, (0, confidence_1.overallConfidence)(segments)) : (0, confidence_1.overallConfidence)(segments),
229
415
  warnings,
230
- primaryRepresentation: outcome.primary.representation,
416
+ primaryRepresentation: primary.representation,
231
417
  historyUsed: history.length > 0,
232
- ...(options.explain ? { diagnostics: buildDiagnostics(primaryBlocks, decisions) } : {})
418
+ ...(options.explain ? { diagnostics: buildDiagnostics(documentBlocks, decisions) } : {})
233
419
  };
234
420
  }
235
421
  catch (err) {
236
- const fallback = text || html;
422
+ // Whatever went wrong, the caller still gets their content back, whole and visible.
423
+ //
424
+ // The source reference names the representation and part the surviving text actually came
425
+ // from. It used to be hardcoded to `TEXT`/`text` even when the content was HTML, which is a
426
+ // traceability bug of the same family as losing the content outright: a reviewer following
427
+ // it lands on a part that never held this text.
428
+ const first = sections[0];
429
+ const text = typeof first?.text === 'string' ? first.text : '';
430
+ const html = typeof first?.html === 'string' ? first.html : '';
431
+ const fromText = Boolean(text.trim());
432
+ const fallback = fromText ? text : html;
237
433
  return {
238
434
  ...base,
239
435
  segments: fallback.trim()
@@ -241,15 +437,22 @@ async function analyze(content, options = {}) {
241
437
  {
242
438
  type: 'UNKNOWN',
243
439
  text: fallback,
244
- confidence: 0.5,
440
+ confidence: DEGRADED_CONFIDENCE,
245
441
  visibility: 'show',
246
442
  reasons: ['degraded_to_unknown'],
247
- source: { mimePart: 'TEXT', representation: 'text', blockIndex: 0, start: 0, end: fallback.length }
443
+ source: {
444
+ kind: 'mime-part',
445
+ mimePart: (fromText ? first?.textPartId : first?.htmlPartId) ?? (fromText ? 'TEXT' : 'HTML'),
446
+ representation: fromText ? 'text' : 'html',
447
+ blockIndex: 0,
448
+ start: 0,
449
+ end: fallback.length
450
+ }
248
451
  }
249
452
  ]
250
453
  : [],
251
454
  hiddenSegments: [],
252
- overallConfidence: 0.5,
455
+ overallConfidence: DEGRADED_CONFIDENCE,
253
456
  warnings: [...warnings, { code: 'extraction_degraded', detail: err instanceof Error ? err.message.slice(0, 200) : 'unknown' }],
254
457
  primaryRepresentation: 'none',
255
458
  historyUsed: history.length > 0
@@ -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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"}
@@ -7,14 +7,33 @@
7
7
  * hints this module looks for are literal class and id names, so a scan over the source is both
8
8
  * cheaper and more faithful than a DOM query, which would silently normalise malformed markup.
9
9
  */
10
- /** Decode HTML entities. Unknown entities are left as written rather than dropped. */
10
+ /**
11
+ * Decode HTML entities. Unknown entities are left as written rather than dropped.
12
+ *
13
+ * Both alternatives are length bounded so the pass stays linear on hostile input: a numeric
14
+ * reference longer than twelve digits cannot name a code point, and an unbounded `+` there would
15
+ * backtrack across the whole run of digits that follows an unterminated `&#`.
16
+ */
11
17
  export declare function decodeEntities(input: string): string;
12
18
  /**
13
19
  * Cheap text projection of an HTML body.
14
20
  *
15
21
  * Good enough for language estimation, marker detection and length statistics. It is not a
16
22
  * replacement for the extraction pipeline's DOM walk, and it deliberately keeps blank lines so that
17
- * paragraph structure survives.
23
+ * paragraph structure survives. It is emphatically **not** a sanitiser: it produces a non executing
24
+ * textual view, and says nothing about whether the source markup is safe to render.
25
+ *
26
+ * Written as a character scanner rather than a chain of regular expressions because the obvious
27
+ * `/<[^>]*>/g` form is quadratic on unmatched `<`: every one of them rescans to end of input looking
28
+ * for a closing delimiter that is not there. Measured at 5.8 seconds on 128k `<` characters, and
29
+ * doubling the input quadrupled it. This is the projection the malformed HTML fallback uses, so it
30
+ * is reached by exactly the input that triggers the quadratic case.
31
+ *
32
+ * Every code unit is visited a constant number of times. A construct that never closes is charged
33
+ * to the input it covers: the scanned window is emitted as visible text and the cursor moves past
34
+ * it, rather than resuming one character later and reading the same suffix again. Emitting it keeps
35
+ * the projection on the safe side of the project's asymmetry, and matches what the previous regular
36
+ * expression did with an unterminated trailing tag.
18
37
  */
19
38
  export declare function stripTagsToText(html: string): string;
20
39
  /** Structural hints found in an HTML body, keyed by the id used in html-clients.json. */