@postalsys/email-content 0.1.8 → 0.1.10
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 +27 -17
- package/dist/.tsbuildinfo +1 -1
- package/dist/analyze.d.ts +3 -0
- package/dist/analyze.d.ts.map +1 -1
- package/dist/analyze.js +10 -4
- package/dist/analyze.js.map +1 -1
- package/dist/annotate/agreement.d.ts +99 -0
- package/dist/annotate/agreement.d.ts.map +1 -0
- package/dist/annotate/agreement.js +126 -0
- package/dist/annotate/agreement.js.map +1 -0
- package/dist/annotate/client.d.ts +7 -19
- package/dist/annotate/client.d.ts.map +1 -1
- package/dist/annotate/client.js +28 -82
- package/dist/annotate/client.js.map +1 -1
- package/dist/annotate/http.d.ts +57 -0
- package/dist/annotate/http.d.ts.map +1 -0
- package/dist/annotate/http.js +99 -0
- package/dist/annotate/http.js.map +1 -0
- package/dist/annotate/llm.d.ts +17 -0
- package/dist/annotate/llm.d.ts.map +1 -1
- package/dist/annotate/llm.js +68 -36
- package/dist/annotate/llm.js.map +1 -1
- package/dist/annotate/probabilities.d.ts +48 -0
- package/dist/annotate/probabilities.d.ts.map +1 -0
- package/dist/annotate/probabilities.js +119 -0
- package/dist/annotate/probabilities.js.map +1 -0
- package/dist/annotate/providers.d.ts +26 -0
- package/dist/annotate/providers.d.ts.map +1 -0
- package/dist/annotate/providers.js +43 -0
- package/dist/annotate/providers.js.map +1 -0
- package/dist/annotate/store.d.ts +3 -0
- package/dist/annotate/store.d.ts.map +1 -1
- package/dist/annotate/store.js +3 -2
- package/dist/annotate/store.js.map +1 -1
- package/dist/annotate/typesafe-client.d.ts +64 -0
- package/dist/annotate/typesafe-client.d.ts.map +1 -0
- package/dist/annotate/typesafe-client.js +76 -0
- package/dist/annotate/typesafe-client.js.map +1 -0
- package/dist/annotate/typesafe-prompt.d.ts +64 -0
- package/dist/annotate/typesafe-prompt.d.ts.map +1 -0
- package/dist/annotate/typesafe-prompt.js +170 -0
- package/dist/annotate/typesafe-prompt.js.map +1 -0
- package/dist/classify/rules.d.ts +7 -0
- package/dist/classify/rules.d.ts.map +1 -1
- package/dist/classify/rules.js +117 -18
- package/dist/classify/rules.js.map +1 -1
- package/dist/cli/agreement.d.ts +27 -0
- package/dist/cli/agreement.d.ts.map +1 -0
- package/dist/cli/agreement.js +153 -0
- package/dist/cli/agreement.js.map +1 -0
- package/dist/cli/annotate.d.ts.map +1 -1
- package/dist/cli/annotate.js +28 -16
- package/dist/cli/annotate.js.map +1 -1
- package/dist/cli/audit.d.ts +12 -0
- package/dist/cli/audit.d.ts.map +1 -0
- package/dist/cli/audit.js +142 -0
- package/dist/cli/audit.js.map +1 -0
- package/dist/cli/disagreements.d.ts.map +1 -1
- package/dist/cli/disagreements.js +20 -3
- package/dist/cli/disagreements.js.map +1 -1
- package/dist/cli/evaluate.d.ts.map +1 -1
- package/dist/cli/evaluate.js +31 -72
- package/dist/cli/evaluate.js.map +1 -1
- package/dist/cli/main.js +28 -2
- package/dist/cli/main.js.map +1 -1
- package/dist/corpus/analyze.d.ts.map +1 -1
- package/dist/corpus/analyze.js +4 -5
- package/dist/corpus/analyze.js.map +1 -1
- package/dist/corpus/migrations/index.d.ts.map +1 -1
- package/dist/corpus/migrations/index.js +14 -0
- package/dist/corpus/migrations/index.js.map +1 -1
- package/dist/corpus/stats.d.ts +1 -0
- package/dist/corpus/stats.d.ts.map +1 -1
- package/dist/corpus/stats.js +1 -0
- package/dist/corpus/stats.js.map +1 -1
- package/dist/detect/patterns/forward-headers.json +24 -0
- package/dist/detect/patterns/html-clients.json +27 -0
- package/dist/detect/patterns/quoted-headers.json +7 -0
- package/dist/detect/patterns/reply-headers.json +410 -0
- package/dist/detect/patterns.d.ts +2 -0
- package/dist/detect/patterns.d.ts.map +1 -1
- package/dist/detect/patterns.js +3 -0
- package/dist/detect/patterns.js.map +1 -1
- package/dist/detect/reply-header.d.ts +7 -0
- package/dist/detect/reply-header.d.ts.map +1 -1
- package/dist/detect/reply-header.js +51 -4
- package/dist/detect/reply-header.js.map +1 -1
- package/dist/detect/subject.d.ts +16 -0
- package/dist/detect/subject.d.ts.map +1 -0
- package/dist/detect/subject.js +22 -0
- package/dist/detect/subject.js.map +1 -0
- package/dist/eval/metrics.d.ts +7 -0
- package/dist/eval/metrics.d.ts.map +1 -1
- package/dist/eval/metrics.js +1 -1
- package/dist/eval/metrics.js.map +1 -1
- package/dist/eval/pattern-audit.d.ts +56 -0
- package/dist/eval/pattern-audit.d.ts.map +1 -0
- package/dist/eval/pattern-audit.js +111 -0
- package/dist/eval/pattern-audit.js.map +1 -0
- package/dist/eval/reference.d.ts +51 -0
- package/dist/eval/reference.d.ts.map +1 -0
- package/dist/eval/reference.js +96 -0
- package/dist/eval/reference.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mime/flowed.d.ts +14 -0
- package/dist/mime/flowed.d.ts.map +1 -0
- package/dist/mime/flowed.js +71 -0
- package/dist/mime/flowed.js.map +1 -0
- package/dist/mime/parse.js +2 -5
- package/dist/mime/parse.js.map +1 -1
- package/dist/segment/features.d.ts.map +1 -1
- package/dist/segment/features.js +2 -1
- package/dist/segment/features.js.map +1 -1
- package/dist/segment/html-blocks.d.ts.map +1 -1
- package/dist/segment/html-blocks.js +33 -9
- 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 -3
- package/dist/segment/text-blocks.js.map +1 -1
- package/dist/segment/types.d.ts +7 -0
- package/dist/segment/types.d.ts.map +1 -1
- package/dist/types.d.ts +3 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -2
- package/dist/types.js.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reply-header.js","sourceRoot":"","sources":["../../src/detect/reply-header.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;AAmDH,
|
|
1
|
+
{"version":3,"file":"reply-header.js","sourceRoot":"","sources":["../../src/detect/reply-header.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subject prefixes that mark a reply or a forward, shared by analyze() and the corpus scanner so
|
|
3
|
+
* the two cannot drift apart again.
|
|
4
|
+
*
|
|
5
|
+
* Forward prefixes were measured on 266 real forwards from 16 clients (test/fixtures/clients):
|
|
6
|
+
* every one used Fwd, Fw or Ed (Outlook's Estonian prefix), whatever the interface language, and
|
|
7
|
+
* 250 of them also carried In-Reply-To or References, so headers cannot tell a forward from a
|
|
8
|
+
* reply. The other entries are the prefixes Outlook and webmail clients write in other locales.
|
|
9
|
+
* A reply to a forward reads "Re: Fwd:" and is caught by REPLY_SUBJECT first, which is also why
|
|
10
|
+
* "VS" (a Finnish reply, a Norwegian forward) is listed only as a reply.
|
|
11
|
+
*/
|
|
12
|
+
export declare const REPLY_SUBJECT: RegExp;
|
|
13
|
+
export declare const FORWARD_SUBJECT: RegExp;
|
|
14
|
+
/** A forward, and not a reply to one. */
|
|
15
|
+
export declare function isForwardSubject(subject: string): boolean;
|
|
16
|
+
//# sourceMappingURL=subject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subject.d.ts","sourceRoot":"","sources":["../../src/detect/subject.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,aAAa,QAAgE,CAAC;AAE3F,eAAO,MAAM,eAAe,QAA0F,CAAC;AAEvH,yCAAyC;AACzC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEzD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Subject prefixes that mark a reply or a forward, shared by analyze() and the corpus scanner so
|
|
4
|
+
* the two cannot drift apart again.
|
|
5
|
+
*
|
|
6
|
+
* Forward prefixes were measured on 266 real forwards from 16 clients (test/fixtures/clients):
|
|
7
|
+
* every one used Fwd, Fw or Ed (Outlook's Estonian prefix), whatever the interface language, and
|
|
8
|
+
* 250 of them also carried In-Reply-To or References, so headers cannot tell a forward from a
|
|
9
|
+
* reply. The other entries are the prefixes Outlook and webmail clients write in other locales.
|
|
10
|
+
* A reply to a forward reads "Re: Fwd:" and is caught by REPLY_SUBJECT first, which is also why
|
|
11
|
+
* "VS" (a Finnish reply, a Norwegian forward) is listed only as a reply.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.FORWARD_SUBJECT = exports.REPLY_SUBJECT = void 0;
|
|
15
|
+
exports.isForwardSubject = isForwardSubject;
|
|
16
|
+
exports.REPLY_SUBJECT = /^\s*(re|aw|sv|vs|vast|antw|res|odp|ответ)\s*(\[\d+\])?\s*:/i;
|
|
17
|
+
exports.FORWARD_SUBJECT = /^\s*(fwd?|wg|tr|rv|enc|doorst|pd|vl|ed|edasi|пересл[а-я]*|转发|轉寄|転送)\s*(\[\d+\])?\s*:/i;
|
|
18
|
+
/** A forward, and not a reply to one. */
|
|
19
|
+
function isForwardSubject(subject) {
|
|
20
|
+
return !exports.REPLY_SUBJECT.test(subject) && exports.FORWARD_SUBJECT.test(subject);
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=subject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subject.js","sourceRoot":"","sources":["../../src/detect/subject.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAOH,4CAEC;AAPY,QAAA,aAAa,GAAG,6DAA6D,CAAC;AAE9E,QAAA,eAAe,GAAG,uFAAuF,CAAC;AAEvH,yCAAyC;AACzC,SAAgB,gBAAgB,CAAC,OAAe;IAC5C,OAAO,CAAC,qBAAa,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,uBAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACzE,CAAC"}
|
package/dist/eval/metrics.d.ts
CHANGED
|
@@ -22,6 +22,13 @@ export interface LabelledBlock {
|
|
|
22
22
|
hidden: boolean;
|
|
23
23
|
/** Grouping key for per segment breakdowns, for example the client or the language. */
|
|
24
24
|
group?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Whether the extraction showed any text at all, across every part it emitted. The reference
|
|
27
|
+
* covers only the part that was annotated, so without this a message whose annotated part is
|
|
28
|
+
* rightly all history reads as empty even though its new content in another part is on
|
|
29
|
+
* screen. That was 98 of the 100 empty extractions against the gpt-6-sol corpus reference.
|
|
30
|
+
*/
|
|
31
|
+
messageHasVisibleText?: boolean;
|
|
25
32
|
}
|
|
26
33
|
export interface LabelMetrics {
|
|
27
34
|
label: Label;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/eval/metrics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAU,KAAK,KAAK,EAAE,MAAM,UAAU,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,KAAK,CAAC;IACjB,SAAS,EAAE,KAAK,CAAC;IACjB,uEAAuE;IACvE,MAAM,EAAE,OAAO,CAAC;IAChB,uFAAuF;IACvF,KAAK,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/eval/metrics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAU,KAAK,KAAK,EAAE,MAAM,UAAU,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,KAAK,CAAC;IACjB,SAAS,EAAE,KAAK,CAAC;IACjB,uEAAuE;IACvE,MAAM,EAAE,OAAO,CAAC;IAChB,uFAAuF;IACvF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,YAAY;IACzB,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC7B,6DAA6D;IAC7D,eAAe,EAAE,MAAM,CAAC;IACxB,qEAAqE;IACrE,uBAAuB,EAAE,MAAM,CAAC;IAChC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wEAAwE;IACxE,gBAAgB,EAAE,MAAM,CAAC;IACzB,wBAAwB,EAAE,MAAM,CAAC;IACjC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,qEAAqE;IACrE,WAAW,EAAE,MAAM,CAAC;IACpB,2BAA2B,EAAE,MAAM,CAAC;IACpC,eAAe,EAAE,MAAM,CAAC;IACxB,gEAAgE;IAChE,YAAY,EAAE,MAAM,CAAC;IACrB,wBAAwB,EAAE,MAAM,CAAC;IACjC,wBAAwB,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,kBAAkB;IAC/B,sDAAsD;IACtD,oBAAoB,EAAE,MAAM,CAAC;IAC7B,+EAA+E;IAC/E,mBAAmB,EAAE,MAAM,CAAC;IAC5B,wEAAwE;IACxE,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mDAAmD;IACnD,kBAAkB,EAAE,MAAM,CAAC;IAC3B,2DAA2D;IAC3D,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gEAAgE;IAChE,eAAe,EAAE,MAAM,CAAC;IACxB,yFAAyF;IACzF,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,SAAS,EAAE,gBAAgB,CAAC;IAC5B,YAAY,EAAE,kBAAkB,CAAC;IACjC,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,oBAAoB,EAAE,MAAM,CAAC;QAAC,kBAAkB,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC7H;AA6ID,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,aAAa,EAAE,GAAG,gBAAgB,CA2CzE"}
|
package/dist/eval/metrics.js
CHANGED
|
@@ -115,7 +115,7 @@ function catastrophic(rows) {
|
|
|
115
115
|
if (authored.length && authored.every(block => block.hidden)) {
|
|
116
116
|
counts.allNewContentRemoved++;
|
|
117
117
|
}
|
|
118
|
-
if (!visible.length && blocks.some(block => block.charCount > 0)) {
|
|
118
|
+
if (!visible.length && blocks.some(block => block.charCount > 0) && blocks[0]?.messageHasVisibleText !== true) {
|
|
119
119
|
counts.emptyExtraction++;
|
|
120
120
|
}
|
|
121
121
|
// A footer is a signature or a disclaimer, matching the benchmark's structural check, but
|
package/dist/eval/metrics.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/eval/metrics.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/eval/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pattern precision audit.
|
|
3
|
+
*
|
|
4
|
+
* Aggregate agreement says how the extractor does overall; it cannot say which pattern to fix.
|
|
5
|
+
* This groups reference-labelled blocks by the detector evidence they carry and by the reasons
|
|
6
|
+
* behind their final decision, so a single pattern that fires on authored text stands out even
|
|
7
|
+
* when the headline numbers look fine.
|
|
8
|
+
*
|
|
9
|
+
* Two views, because they answer different questions:
|
|
10
|
+
*
|
|
11
|
+
* - Evidence: every block a pattern fired on, whatever the rules then did with it. This is the
|
|
12
|
+
* pattern's own precision, the thing a pattern file edit changes.
|
|
13
|
+
* - Reasons: every block whose final decision names a reason. This is the rule's precision, and
|
|
14
|
+
* for hiding reasons the rows that matter most, since a wrong hide is content loss.
|
|
15
|
+
*
|
|
16
|
+
* Evidence sits on the block that matched, usually the attribution line or separator itself, so
|
|
17
|
+
* the evidence view measures whether the boundary was real, not how far the region after it ran.
|
|
18
|
+
* The reason view covers the region.
|
|
19
|
+
*/
|
|
20
|
+
import { type Label } from '../types';
|
|
21
|
+
/** One reference-labelled block with what the extractor saw and decided. Never carries content. */
|
|
22
|
+
export interface AuditBlock {
|
|
23
|
+
reference: Label;
|
|
24
|
+
predicted: Label;
|
|
25
|
+
hidden: boolean;
|
|
26
|
+
chars: number;
|
|
27
|
+
evidence: readonly {
|
|
28
|
+
id: string;
|
|
29
|
+
kind: string;
|
|
30
|
+
}[];
|
|
31
|
+
reasons: readonly string[];
|
|
32
|
+
}
|
|
33
|
+
export interface AuditRow {
|
|
34
|
+
key: string;
|
|
35
|
+
/** Reference labels a hit is expected to carry, or null when the kind implies none. */
|
|
36
|
+
expected: readonly Label[] | null;
|
|
37
|
+
blocks: number;
|
|
38
|
+
chars: number;
|
|
39
|
+
/** Blocks whose reference label is in `expected`. */
|
|
40
|
+
matching: number;
|
|
41
|
+
/** Blocks precision is measured over: all of them, less those `neutral` excludes. */
|
|
42
|
+
scored: number;
|
|
43
|
+
/** Blocks the reference says the sender wrote: NEW_CONTENT or INLINE_QUOTE. */
|
|
44
|
+
authored: number;
|
|
45
|
+
/** Authored blocks the extractor hid. Each one is lost content. */
|
|
46
|
+
authoredHidden: number;
|
|
47
|
+
authoredHiddenChars: number;
|
|
48
|
+
byReference: Partial<Record<Label, number>>;
|
|
49
|
+
}
|
|
50
|
+
export interface PatternAudit {
|
|
51
|
+
blocks: number;
|
|
52
|
+
evidence: AuditRow[];
|
|
53
|
+
reasons: AuditRow[];
|
|
54
|
+
}
|
|
55
|
+
export declare function auditPatterns(blocks: readonly AuditBlock[]): PatternAudit;
|
|
56
|
+
//# sourceMappingURL=pattern-audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-audit.d.ts","sourceRoot":"","sources":["../../src/eval/pattern-audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,mGAAmG;AACnG,MAAM,WAAW,UAAU;IACvB,SAAS,EAAE,KAAK,CAAC;IACjB,SAAS,EAAE,KAAK,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,SAAS;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAClD,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,QAAQ;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,uFAAuF;IACvF,QAAQ,EAAE,SAAS,KAAK,EAAE,GAAG,IAAI,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,QAAQ,EAAE,MAAM,CAAC;IACjB,qFAAqF;IACrF,MAAM,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,QAAQ,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,YAAY;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,OAAO,EAAE,QAAQ,EAAE,CAAC;CACvB;AAoED,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,GAAG,YAAY,CAkCzE"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Pattern precision audit.
|
|
4
|
+
*
|
|
5
|
+
* Aggregate agreement says how the extractor does overall; it cannot say which pattern to fix.
|
|
6
|
+
* This groups reference-labelled blocks by the detector evidence they carry and by the reasons
|
|
7
|
+
* behind their final decision, so a single pattern that fires on authored text stands out even
|
|
8
|
+
* when the headline numbers look fine.
|
|
9
|
+
*
|
|
10
|
+
* Two views, because they answer different questions:
|
|
11
|
+
*
|
|
12
|
+
* - Evidence: every block a pattern fired on, whatever the rules then did with it. This is the
|
|
13
|
+
* pattern's own precision, the thing a pattern file edit changes.
|
|
14
|
+
* - Reasons: every block whose final decision names a reason. This is the rule's precision, and
|
|
15
|
+
* for hiding reasons the rows that matter most, since a wrong hide is content loss.
|
|
16
|
+
*
|
|
17
|
+
* Evidence sits on the block that matched, usually the attribution line or separator itself, so
|
|
18
|
+
* the evidence view measures whether the boundary was real, not how far the region after it ran.
|
|
19
|
+
* The reason view covers the region.
|
|
20
|
+
*/
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.auditPatterns = auditPatterns;
|
|
23
|
+
/**
|
|
24
|
+
* The labels a hit of each evidence kind should land on, following docs/annotation-guide.md:
|
|
25
|
+
* a boundary line belongs to the region it introduces, and a forward nested inside quoted history
|
|
26
|
+
* is REPLY_HISTORY. A quote container legitimately holds inline quotes too. Kinds that only hint
|
|
27
|
+
* are reported without a precision.
|
|
28
|
+
*/
|
|
29
|
+
const EXPECTED = {
|
|
30
|
+
'reply-anchor': ['REPLY_HISTORY'],
|
|
31
|
+
attribution: ['REPLY_HISTORY'],
|
|
32
|
+
'forward-anchor': ['FORWARDED_CONTENT', 'REPLY_HISTORY'],
|
|
33
|
+
'quote-container': ['REPLY_HISTORY', 'INLINE_QUOTE', 'FORWARDED_CONTENT'],
|
|
34
|
+
signature: ['SIGNATURE'],
|
|
35
|
+
disclaimer: ['DISCLAIMER']
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Reference labels that neither confirm nor refute a hit. A signature or disclaimer inside quoted
|
|
39
|
+
* history belongs to the history (the guide labels it by the message that attached it), so the
|
|
40
|
+
* pattern matching there is right about the shape and says nothing about the label. Without this,
|
|
41
|
+
* every sign-off pattern reads as mostly wrong simply because most sign-offs are quoted.
|
|
42
|
+
*/
|
|
43
|
+
const NEUTRAL = {
|
|
44
|
+
signature: ['REPLY_HISTORY', 'FORWARDED_CONTENT'],
|
|
45
|
+
disclaimer: ['REPLY_HISTORY', 'FORWARDED_CONTENT']
|
|
46
|
+
};
|
|
47
|
+
function isAuthored(label) {
|
|
48
|
+
return label === 'NEW_CONTENT' || label === 'INLINE_QUOTE';
|
|
49
|
+
}
|
|
50
|
+
function emptyTally(key, expected, neutral = []) {
|
|
51
|
+
return {
|
|
52
|
+
row: { key, expected, blocks: 0, chars: 0, matching: 0, scored: 0, authored: 0, authoredHidden: 0, authoredHiddenChars: 0, byReference: {} },
|
|
53
|
+
neutral
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function count({ row, neutral }, block) {
|
|
57
|
+
row.blocks++;
|
|
58
|
+
row.chars += block.chars;
|
|
59
|
+
row.byReference[block.reference] = (row.byReference[block.reference] ?? 0) + 1;
|
|
60
|
+
if (!neutral.includes(block.reference)) {
|
|
61
|
+
row.scored++;
|
|
62
|
+
if (row.expected?.includes(block.reference)) {
|
|
63
|
+
row.matching++;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (isAuthored(block.reference)) {
|
|
67
|
+
row.authored++;
|
|
68
|
+
if (block.hidden) {
|
|
69
|
+
row.authoredHidden++;
|
|
70
|
+
row.authoredHiddenChars += block.chars;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/** Worst first: lost content, then the most authored hits, then volume. */
|
|
75
|
+
function byHarm(a, b) {
|
|
76
|
+
return b.authoredHiddenChars - a.authoredHiddenChars || b.authored - a.authored || b.blocks - a.blocks || a.key.localeCompare(b.key);
|
|
77
|
+
}
|
|
78
|
+
function auditPatterns(blocks) {
|
|
79
|
+
const evidence = new Map();
|
|
80
|
+
const reasons = new Map();
|
|
81
|
+
for (const block of blocks) {
|
|
82
|
+
// A pattern that matched two lines of the same block still judged one block.
|
|
83
|
+
const seen = new Set();
|
|
84
|
+
for (const item of block.evidence) {
|
|
85
|
+
if (seen.has(item.id)) {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
seen.add(item.id);
|
|
89
|
+
let row = evidence.get(item.id);
|
|
90
|
+
if (!row) {
|
|
91
|
+
row = emptyTally(item.id, EXPECTED[item.kind] ?? null, NEUTRAL[item.kind]);
|
|
92
|
+
evidence.set(item.id, row);
|
|
93
|
+
}
|
|
94
|
+
count(row, block);
|
|
95
|
+
}
|
|
96
|
+
for (const reason of new Set(block.reasons)) {
|
|
97
|
+
// A reason is scored against the label the rules gave it: the question is whether the
|
|
98
|
+
// decision it justified was right.
|
|
99
|
+
const key = `${reason} -> ${block.predicted}`;
|
|
100
|
+
let row = reasons.get(key);
|
|
101
|
+
if (!row) {
|
|
102
|
+
row = emptyTally(key, [block.predicted]);
|
|
103
|
+
reasons.set(key, row);
|
|
104
|
+
}
|
|
105
|
+
count(row, block);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const rows = (tallies) => [...tallies.values()].map(tally => tally.row).sort(byHarm);
|
|
109
|
+
return { blocks: blocks.length, evidence: rows(evidence), reasons: rows(reasons) };
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=pattern-audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-audit.js","sourceRoot":"","sources":["../../src/eval/pattern-audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loading the stored LLM reference labels, shared by `evaluate` and `audit`.
|
|
3
|
+
*
|
|
4
|
+
* Both commands must read the same reference, or a pattern that looks precise in one report and
|
|
5
|
+
* harmful in the other is only a difference in which annotations were counted.
|
|
6
|
+
*/
|
|
7
|
+
import { type CorpusStore } from '../corpus/store';
|
|
8
|
+
import { type Label, type Segment } from '../types';
|
|
9
|
+
export interface ReferenceRow {
|
|
10
|
+
path: string;
|
|
11
|
+
block_index: number;
|
|
12
|
+
/** MIME part the block came from. Null on annotations made before it was recorded. */
|
|
13
|
+
mime_part: string | null;
|
|
14
|
+
label: Label;
|
|
15
|
+
char_count: number;
|
|
16
|
+
client: string | null;
|
|
17
|
+
lang: string | null;
|
|
18
|
+
reply_style: string | null;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Latest annotation per (path, block) for the chosen model, grouped by message, so re-annotated
|
|
22
|
+
* messages do not count twice. An explicit prompt version pins the reference to labels made under
|
|
23
|
+
* one convention; without it, the newest label per block wins, whatever prompt produced it, and
|
|
24
|
+
* messages labelled only under an older convention are still included. The annotation guide's rule
|
|
25
|
+
* that runs made under different conventions must never be silently compared is the reason the
|
|
26
|
+
* option exists; use it whenever more than one prompt version is present.
|
|
27
|
+
*/
|
|
28
|
+
export declare function loadReference(store: CorpusStore, model: string, promptVersion?: string): Map<string, ReferenceRow[]>;
|
|
29
|
+
export interface CoveringPrediction {
|
|
30
|
+
label: Label;
|
|
31
|
+
hidden: boolean;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Map a stored (part, block index) to the output segment covering it. Segments merge adjacent
|
|
35
|
+
* blocks, so a block is matched by its index falling inside a segment's block range.
|
|
36
|
+
*
|
|
37
|
+
* Keyed per MIME part, not by block index alone. Block indices are section-local, so in a multipart
|
|
38
|
+
* message with several body sections two segments legitimately start at index 0, and a flat map
|
|
39
|
+
* silently kept only the last of them. Older annotations predate the part being recorded; those
|
|
40
|
+
* fall back to the first part the output used, which is exactly the previous behaviour for the
|
|
41
|
+
* single section messages they came from.
|
|
42
|
+
*
|
|
43
|
+
* A recorded part the output never used gets no prediction. Falling back for it scored the HTML
|
|
44
|
+
* alternative's block indices against the plain text alternative's segments; check `emitted` and
|
|
45
|
+
* leave such blocks out instead.
|
|
46
|
+
*/
|
|
47
|
+
export declare function segmentLookup(...segmentLists: readonly (readonly Segment[])[]): {
|
|
48
|
+
lookup: (part: string | null, index: number) => CoveringPrediction | null;
|
|
49
|
+
emitted: (part: string | null) => boolean;
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=reference.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference.d.ts","sourceRoot":"","sources":["../../src/eval/reference.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAA4B,KAAK,KAAK,EAAE,KAAK,OAAO,EAAE,MAAM,UAAU,CAAC;AAE9E,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,sFAAsF;IACtF,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,KAAK,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,SAAK,GAAG,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CA2BhH;AAED,MAAM,WAAW,kBAAkB;IAC/B,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,GAAG,YAAY,EAAE,SAAS,CAAC,SAAS,OAAO,EAAE,CAAC,EAAE,GAAG;IAC7E,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,KAAK,kBAAkB,GAAG,IAAI,CAAC;IAC1E,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC;CAC7C,CAqCA"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Loading the stored LLM reference labels, shared by `evaluate` and `audit`.
|
|
4
|
+
*
|
|
5
|
+
* Both commands must read the same reference, or a pattern that looks precise in one report and
|
|
6
|
+
* harmful in the other is only a difference in which annotations were counted.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.loadReference = loadReference;
|
|
10
|
+
exports.segmentLookup = segmentLookup;
|
|
11
|
+
const types_1 = require("../types");
|
|
12
|
+
/**
|
|
13
|
+
* Latest annotation per (path, block) for the chosen model, grouped by message, so re-annotated
|
|
14
|
+
* messages do not count twice. An explicit prompt version pins the reference to labels made under
|
|
15
|
+
* one convention; without it, the newest label per block wins, whatever prompt produced it, and
|
|
16
|
+
* messages labelled only under an older convention are still included. The annotation guide's rule
|
|
17
|
+
* that runs made under different conventions must never be silently compared is the reason the
|
|
18
|
+
* option exists; use it whenever more than one prompt version is present.
|
|
19
|
+
*/
|
|
20
|
+
function loadReference(store, model, promptVersion = '') {
|
|
21
|
+
const versionClause = promptVersion ? ' AND r.prompt_version = ?' : '';
|
|
22
|
+
const versionClauseInner = promptVersion ? ' AND r2.prompt_version = ?' : '';
|
|
23
|
+
const params = promptVersion ? [model, promptVersion, promptVersion] : [model];
|
|
24
|
+
const reference = store.query(`SELECT a.path, a.block_index, a.mime_part, a.label, a.char_count, m.client, m.lang, m.reply_style
|
|
25
|
+
FROM annotations a
|
|
26
|
+
JOIN annotation_runs r ON r.id = a.run_id
|
|
27
|
+
JOIN messages m ON m.path = a.path
|
|
28
|
+
WHERE r.model = ? AND a.source = 'llm'${versionClause}
|
|
29
|
+
AND a.id = (SELECT MAX(a2.id) FROM annotations a2
|
|
30
|
+
JOIN annotation_runs r2 ON r2.id = a2.run_id
|
|
31
|
+
WHERE a2.path = a.path AND a2.block_index = a.block_index AND r2.model = r.model${versionClauseInner})
|
|
32
|
+
ORDER BY a.path, a.block_index`, ...params);
|
|
33
|
+
const byPath = new Map();
|
|
34
|
+
for (const row of reference) {
|
|
35
|
+
const list = byPath.get(row.path);
|
|
36
|
+
if (list) {
|
|
37
|
+
list.push(row);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
byPath.set(row.path, [row]);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return byPath;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Map a stored (part, block index) to the output segment covering it. Segments merge adjacent
|
|
47
|
+
* blocks, so a block is matched by its index falling inside a segment's block range.
|
|
48
|
+
*
|
|
49
|
+
* Keyed per MIME part, not by block index alone. Block indices are section-local, so in a multipart
|
|
50
|
+
* message with several body sections two segments legitimately start at index 0, and a flat map
|
|
51
|
+
* silently kept only the last of them. Older annotations predate the part being recorded; those
|
|
52
|
+
* fall back to the first part the output used, which is exactly the previous behaviour for the
|
|
53
|
+
* single section messages they came from.
|
|
54
|
+
*
|
|
55
|
+
* A recorded part the output never used gets no prediction. Falling back for it scored the HTML
|
|
56
|
+
* alternative's block indices against the plain text alternative's segments; check `emitted` and
|
|
57
|
+
* leave such blocks out instead.
|
|
58
|
+
*/
|
|
59
|
+
function segmentLookup(...segmentLists) {
|
|
60
|
+
const predictions = new Map();
|
|
61
|
+
for (const segment of segmentLists.flat()) {
|
|
62
|
+
const blockIndex = (0, types_1.blockIndexOf)(segment.source);
|
|
63
|
+
if (blockIndex === null) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
const part = (0, types_1.mimePartOf)(segment.source) ?? '';
|
|
67
|
+
let bucket = predictions.get(part);
|
|
68
|
+
if (!bucket) {
|
|
69
|
+
bucket = new Map();
|
|
70
|
+
predictions.set(part, bucket);
|
|
71
|
+
}
|
|
72
|
+
bucket.set(blockIndex, { label: segment.type, hidden: segment.visibility === 'hide' });
|
|
73
|
+
}
|
|
74
|
+
const ordered = new Map([...predictions].map(([part, bucket]) => [part, [...bucket.keys()].sort((a, b) => a - b)]));
|
|
75
|
+
const emitted = (part) => part === null || predictions.has(part);
|
|
76
|
+
// Segments start at a block index and run to the next one, so fill forward within the part.
|
|
77
|
+
const lookup = (part, index) => {
|
|
78
|
+
if (!emitted(part)) {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
const key = part ?? predictions.keys().next().value ?? '';
|
|
82
|
+
const starts = ordered.get(key) ?? [];
|
|
83
|
+
let best = null;
|
|
84
|
+
for (const start of starts) {
|
|
85
|
+
if (start <= index) {
|
|
86
|
+
best = start;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return best === null ? null : (predictions.get(key)?.get(best) ?? null);
|
|
93
|
+
};
|
|
94
|
+
return { lookup, emitted };
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=reference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference.js","sourceRoot":"","sources":["../../src/eval/reference.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -40,6 +40,9 @@ export interface ExplainedResult extends ExtractionResult {
|
|
|
40
40
|
primaryPart: string | null;
|
|
41
41
|
blocks: {
|
|
42
42
|
index: number;
|
|
43
|
+
/** MIME part and section-local index, the coordinates stored annotations use. */
|
|
44
|
+
mimePart: string;
|
|
45
|
+
sourceIndex: number;
|
|
43
46
|
kind: string;
|
|
44
47
|
label: string;
|
|
45
48
|
confidence: number;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,KAAK,YAAY,EAA4C,MAAM,cAAc,CAAC;AAG3F,OAAO,EAA4B,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACxF,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,OAAO,EAAqB,KAAK,gBAAgB,EAAE,KAAK,MAAM,EAAgB,MAAM,SAAS,CAAC;AAE9F,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC5D,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC5G,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC3G,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACxG,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AACtJ,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,KAAK,QAAQ,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAC3I,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvG,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAWzD,MAAM,WAAW,cAAc;IAC3B,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACvC;;;OAGG;IACH,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,gFAAgF;IAChF,gBAAgB,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IAC9C,kGAAkG;IAClG,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,eAAgB,SAAQ,gBAAgB;IACrD,qCAAqC;IACrC,WAAW,CAAC,EAAE;QACV,SAAS,EAAE,MAAM,CAAC;QAClB,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;AA4CD,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,eAAe,CAAC,CA4G1G"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,KAAK,YAAY,EAA4C,MAAM,cAAc,CAAC;AAG3F,OAAO,EAA4B,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACxF,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,OAAO,EAAqB,KAAK,gBAAgB,EAAE,KAAK,MAAM,EAAgB,MAAM,SAAS,CAAC;AAE9F,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC5D,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC5G,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC3G,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACxG,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AACtJ,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,KAAK,QAAQ,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAC3I,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvG,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAWzD,MAAM,WAAW,cAAc;IAC3B,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACvC;;;OAGG;IACH,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,gFAAgF;IAChF,gBAAgB,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IAC9C,kGAAkG;IAClG,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,eAAgB,SAAQ,gBAAgB;IACrD,qCAAqC;IACrC,WAAW,CAAC,EAAE;QACV,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,MAAM,EAAE;YACJ,KAAK,EAAE,MAAM,CAAC;YACd,iFAAiF;YACjF,QAAQ,EAAE,MAAM,CAAC;YACjB,WAAW,EAAE,MAAM,CAAC;YACpB,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;AA4CD,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,eAAe,CAAC,CA4G1G"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* format=flowed decoding that respects quote depth (RFC 3676).
|
|
3
|
+
*
|
|
4
|
+
* libmime's decoder joins any line ending in a space with the next raw line. That is right for
|
|
5
|
+
* unquoted text and wrong for quoted text, where RFC 3676 section 4.5 says a soft break only joins
|
|
6
|
+
* lines of the same quote depth, and the continuation's own quote markers are not part of the
|
|
7
|
+
* content. Roundcube writes an empty quoted line as "> " (quote marker plus stuffing), and the old
|
|
8
|
+
* decode glued the next quoted line onto it raw, turning "> Also, ..." into "> > Also, ...": depth
|
|
9
|
+
* 2 history that could never be read as an inline answer. Measured on test/fixtures/clients.
|
|
10
|
+
*
|
|
11
|
+
* Linear: every line is visited once and each paragraph is joined once.
|
|
12
|
+
*/
|
|
13
|
+
export declare function decodeFlowed(text: string, delSp?: boolean): string;
|
|
14
|
+
//# sourceMappingURL=flowed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flowed.d.ts","sourceRoot":"","sources":["../../src/mime/flowed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAmCH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,MAAM,CA+BhE"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* format=flowed decoding that respects quote depth (RFC 3676).
|
|
4
|
+
*
|
|
5
|
+
* libmime's decoder joins any line ending in a space with the next raw line. That is right for
|
|
6
|
+
* unquoted text and wrong for quoted text, where RFC 3676 section 4.5 says a soft break only joins
|
|
7
|
+
* lines of the same quote depth, and the continuation's own quote markers are not part of the
|
|
8
|
+
* content. Roundcube writes an empty quoted line as "> " (quote marker plus stuffing), and the old
|
|
9
|
+
* decode glued the next quoted line onto it raw, turning "> Also, ..." into "> > Also, ...": depth
|
|
10
|
+
* 2 history that could never be read as an inline answer. Measured on test/fixtures/clients.
|
|
11
|
+
*
|
|
12
|
+
* Linear: every line is visited once and each paragraph is joined once.
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.decodeFlowed = decodeFlowed;
|
|
16
|
+
function parseLine(raw, delSp) {
|
|
17
|
+
let depth = 0;
|
|
18
|
+
while (depth < raw.length && raw.charCodeAt(depth) === 62 /* > */) {
|
|
19
|
+
depth++;
|
|
20
|
+
}
|
|
21
|
+
let content = raw.slice(depth);
|
|
22
|
+
// Space stuffing: one space right after the quote markers, or at the start of an unquoted
|
|
23
|
+
// line, belongs to the encoding, not the text (RFC 3676 section 4.4).
|
|
24
|
+
if (content.startsWith(' ')) {
|
|
25
|
+
content = content.slice(1);
|
|
26
|
+
}
|
|
27
|
+
// A signature separator is never flowed, whatever its trailing space suggests.
|
|
28
|
+
const flowed = content.endsWith(' ') && content !== '-- ';
|
|
29
|
+
if (flowed && delSp) {
|
|
30
|
+
content = content.slice(0, -1);
|
|
31
|
+
}
|
|
32
|
+
return { depth, content, flowed };
|
|
33
|
+
}
|
|
34
|
+
function render(depth, content) {
|
|
35
|
+
if (!depth) {
|
|
36
|
+
return content;
|
|
37
|
+
}
|
|
38
|
+
const marker = '>'.repeat(depth);
|
|
39
|
+
return content ? `${marker} ${content}` : marker;
|
|
40
|
+
}
|
|
41
|
+
function decodeFlowed(text, delSp = false) {
|
|
42
|
+
const out = [];
|
|
43
|
+
let depth = -1;
|
|
44
|
+
let pieces = [];
|
|
45
|
+
let open = false;
|
|
46
|
+
const close = () => {
|
|
47
|
+
if (depth !== -1) {
|
|
48
|
+
out.push(render(depth, pieces.join('')));
|
|
49
|
+
}
|
|
50
|
+
pieces = [];
|
|
51
|
+
depth = -1;
|
|
52
|
+
open = false;
|
|
53
|
+
};
|
|
54
|
+
for (const raw of text.split(/\r?\n/)) {
|
|
55
|
+
const line = parseLine(raw, delSp);
|
|
56
|
+
// Join only a soft break followed by a line at the same depth; anything else ends the
|
|
57
|
+
// paragraph, and a flowed line at a depth change is treated as fixed.
|
|
58
|
+
if (!(open && line.depth === depth)) {
|
|
59
|
+
close();
|
|
60
|
+
depth = line.depth;
|
|
61
|
+
}
|
|
62
|
+
pieces.push(line.content);
|
|
63
|
+
open = line.flowed;
|
|
64
|
+
if (!open) {
|
|
65
|
+
close();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
close();
|
|
69
|
+
return out.join('\n');
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=flowed.js.map
|