@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.
Files changed (104) hide show
  1. package/README.md +205 -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 +275 -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/classify/rules.d.ts +7 -0
  20. package/dist/classify/rules.d.ts.map +1 -1
  21. package/dist/classify/rules.js +58 -0
  22. package/dist/classify/rules.js.map +1 -1
  23. package/dist/cli/annotate.d.ts.map +1 -1
  24. package/dist/cli/annotate.js +6 -3
  25. package/dist/cli/annotate.js.map +1 -1
  26. package/dist/cli/args.d.ts +14 -0
  27. package/dist/cli/args.d.ts.map +1 -1
  28. package/dist/cli/args.js +48 -1
  29. package/dist/cli/args.js.map +1 -1
  30. package/dist/cli/benchmark.d.ts +39 -0
  31. package/dist/cli/benchmark.d.ts.map +1 -1
  32. package/dist/cli/benchmark.js +179 -66
  33. package/dist/cli/benchmark.js.map +1 -1
  34. package/dist/cli/corpus.d.ts.map +1 -1
  35. package/dist/cli/corpus.js +13 -8
  36. package/dist/cli/corpus.js.map +1 -1
  37. package/dist/cli/disagreements.d.ts.map +1 -1
  38. package/dist/cli/disagreements.js +7 -4
  39. package/dist/cli/disagreements.js.map +1 -1
  40. package/dist/cli/evaluate.d.ts.map +1 -1
  41. package/dist/cli/evaluate.js +34 -10
  42. package/dist/cli/evaluate.js.map +1 -1
  43. package/dist/cli/extract.d.ts.map +1 -1
  44. package/dist/cli/extract.js +8 -3
  45. package/dist/cli/extract.js.map +1 -1
  46. package/dist/cli/main.js +8 -0
  47. package/dist/cli/main.js.map +1 -1
  48. package/dist/corpus/scanner.d.ts +9 -1
  49. package/dist/corpus/scanner.d.ts.map +1 -1
  50. package/dist/corpus/scanner.js +52 -13
  51. package/dist/corpus/scanner.js.map +1 -1
  52. package/dist/corpus/store.d.ts +29 -2
  53. package/dist/corpus/store.d.ts.map +1 -1
  54. package/dist/corpus/store.js +45 -2
  55. package/dist/corpus/store.js.map +1 -1
  56. package/dist/detect/patterns.d.ts +29 -0
  57. package/dist/detect/patterns.d.ts.map +1 -1
  58. package/dist/detect/patterns.js +80 -6
  59. package/dist/detect/patterns.js.map +1 -1
  60. package/dist/detect/reply-header.d.ts +14 -0
  61. package/dist/detect/reply-header.d.ts.map +1 -1
  62. package/dist/detect/reply-header.js +80 -37
  63. package/dist/detect/reply-header.js.map +1 -1
  64. package/dist/eval/oracle.d.ts +80 -0
  65. package/dist/eval/oracle.d.ts.map +1 -0
  66. package/dist/eval/oracle.js +250 -0
  67. package/dist/eval/oracle.js.map +1 -0
  68. package/dist/index.d.ts +6 -3
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +94 -56
  71. package/dist/index.js.map +1 -1
  72. package/dist/match/history.d.ts +12 -0
  73. package/dist/match/history.d.ts.map +1 -1
  74. package/dist/match/history.js +16 -0
  75. package/dist/match/history.js.map +1 -1
  76. package/dist/mime/model.d.ts +28 -3
  77. package/dist/mime/model.d.ts.map +1 -1
  78. package/dist/mime/model.js +41 -1
  79. package/dist/mime/model.js.map +1 -1
  80. package/dist/mime/parse.d.ts.map +1 -1
  81. package/dist/mime/parse.js +19 -2
  82. package/dist/mime/parse.js.map +1 -1
  83. package/dist/mime/select.d.ts +71 -0
  84. package/dist/mime/select.d.ts.map +1 -0
  85. package/dist/mime/select.js +198 -0
  86. package/dist/mime/select.js.map +1 -0
  87. package/dist/segment/html-blocks.d.ts +1 -1
  88. package/dist/segment/html-blocks.d.ts.map +1 -1
  89. package/dist/segment/html-blocks.js +77 -8
  90. package/dist/segment/html-blocks.js.map +1 -1
  91. package/dist/segment/text-blocks.d.ts.map +1 -1
  92. package/dist/segment/text-blocks.js +18 -1
  93. package/dist/segment/text-blocks.js.map +1 -1
  94. package/dist/segment/types.d.ts +14 -0
  95. package/dist/segment/types.d.ts.map +1 -1
  96. package/dist/types.d.ts +132 -11
  97. package/dist/types.d.ts.map +1 -1
  98. package/dist/types.js +37 -3
  99. package/dist/types.js.map +1 -1
  100. package/dist/util/worker-pool.d.ts +21 -0
  101. package/dist/util/worker-pool.d.ts.map +1 -1
  102. package/dist/util/worker-pool.js +61 -13
  103. package/dist/util/worker-pool.js.map +1 -1
  104. 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 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,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
- 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,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
- 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, {
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: 0.5,
411
+ overallConfidence: DEGRADED_CONFIDENCE,
218
412
  warnings,
219
- primaryRepresentation: outcome.primary.representation,
413
+ primaryRepresentation: primary.representation,
220
414
  historyUsed: history.length > 0,
221
- ...(options.explain ? { diagnostics: buildDiagnostics(primaryBlocks, decisions) } : {})
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
- overallConfidence: (0, confidence_1.overallConfidence)(segments),
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: outcome.primary.representation,
427
+ primaryRepresentation: primary.representation,
231
428
  historyUsed: history.length > 0,
232
- ...(options.explain ? { diagnostics: buildDiagnostics(primaryBlocks, decisions) } : {})
429
+ ...(options.explain ? { diagnostics: buildDiagnostics(documentBlocks, decisions) } : {})
233
430
  };
234
431
  }
235
432
  catch (err) {
236
- const fallback = text || html;
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: 0.5,
451
+ confidence: DEGRADED_CONFIDENCE,
245
452
  visibility: 'show',
246
453
  reasons: ['degraded_to_unknown'],
247
- source: { mimePart: 'TEXT', representation: 'text', blockIndex: 0, start: 0, end: fallback.length }
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: 0.5,
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
@@ -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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"}