abb-opencode-local-rag 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.
- package/LICENSE +21 -0
- package/README.de.md +416 -0
- package/README.es.md +416 -0
- package/README.fr.md +416 -0
- package/README.md +491 -0
- package/README.pt-BR.md +416 -0
- package/README.zh-CN.md +416 -0
- package/dist/bin/install-skills.d.ts +20 -0
- package/dist/bin/install-skills.d.ts.map +1 -0
- package/dist/bin/install-skills.js +195 -0
- package/dist/bin/install-skills.js.map +1 -0
- package/dist/chunker/index.d.ts +24 -0
- package/dist/chunker/index.d.ts.map +1 -0
- package/dist/chunker/index.js +2 -0
- package/dist/chunker/index.js.map +1 -0
- package/dist/chunker/semantic-chunker.d.ts +97 -0
- package/dist/chunker/semantic-chunker.d.ts.map +1 -0
- package/dist/chunker/semantic-chunker.js +294 -0
- package/dist/chunker/semantic-chunker.js.map +1 -0
- package/dist/chunker/sentence-splitter.d.ts +28 -0
- package/dist/chunker/sentence-splitter.d.ts.map +1 -0
- package/dist/chunker/sentence-splitter.js +219 -0
- package/dist/chunker/sentence-splitter.js.map +1 -0
- package/dist/cli/common.d.ts +65 -0
- package/dist/cli/common.d.ts.map +1 -0
- package/dist/cli/common.js +138 -0
- package/dist/cli/common.js.map +1 -0
- package/dist/cli/delete.d.ts +8 -0
- package/dist/cli/delete.d.ts.map +1 -0
- package/dist/cli/delete.js +173 -0
- package/dist/cli/delete.js.map +1 -0
- package/dist/cli/file-collection.d.ts +2 -0
- package/dist/cli/file-collection.d.ts.map +1 -0
- package/dist/cli/file-collection.js +53 -0
- package/dist/cli/file-collection.js.map +1 -0
- package/dist/cli/ingest.d.ts +100 -0
- package/dist/cli/ingest.d.ts.map +1 -0
- package/dist/cli/ingest.js +363 -0
- package/dist/cli/ingest.js.map +1 -0
- package/dist/cli/list.d.ts +35 -0
- package/dist/cli/list.d.ts.map +1 -0
- package/dist/cli/list.js +210 -0
- package/dist/cli/list.js.map +1 -0
- package/dist/cli/options.d.ts +100 -0
- package/dist/cli/options.d.ts.map +1 -0
- package/dist/cli/options.js +241 -0
- package/dist/cli/options.js.map +1 -0
- package/dist/cli/query.d.ts +24 -0
- package/dist/cli/query.d.ts.map +1 -0
- package/dist/cli/query.js +191 -0
- package/dist/cli/query.js.map +1 -0
- package/dist/cli/read-neighbors.d.ts +11 -0
- package/dist/cli/read-neighbors.d.ts.map +1 -0
- package/dist/cli/read-neighbors.js +224 -0
- package/dist/cli/read-neighbors.js.map +1 -0
- package/dist/cli/status.d.ts +8 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +80 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/sync.d.ts +8 -0
- package/dist/cli/sync.d.ts.map +1 -0
- package/dist/cli/sync.js +244 -0
- package/dist/cli/sync.js.map +1 -0
- package/dist/cli-main.d.ts +12 -0
- package/dist/cli-main.d.ts.map +1 -0
- package/dist/cli-main.js +63 -0
- package/dist/cli-main.js.map +1 -0
- package/dist/embedder/index.d.ts +85 -0
- package/dist/embedder/index.d.ts.map +1 -0
- package/dist/embedder/index.js +284 -0
- package/dist/embedder/index.js.map +1 -0
- package/dist/features/list.d.ts +37 -0
- package/dist/features/list.d.ts.map +1 -0
- package/dist/features/list.js +40 -0
- package/dist/features/list.js.map +1 -0
- package/dist/features/sync.d.ts +207 -0
- package/dist/features/sync.d.ts.map +1 -0
- package/dist/features/sync.js +380 -0
- package/dist/features/sync.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/ingest/compute.d.ts +86 -0
- package/dist/ingest/compute.d.ts.map +1 -0
- package/dist/ingest/compute.js +177 -0
- package/dist/ingest/compute.js.map +1 -0
- package/dist/ingest/file.d.ts +27 -0
- package/dist/ingest/file.d.ts.map +1 -0
- package/dist/ingest/file.js +67 -0
- package/dist/ingest/file.js.map +1 -0
- package/dist/ingest/visual.d.ts +45 -0
- package/dist/ingest/visual.d.ts.map +1 -0
- package/dist/ingest/visual.js +234 -0
- package/dist/ingest/visual.js.map +1 -0
- package/dist/parser/docx-parser.d.ts +12 -0
- package/dist/parser/docx-parser.d.ts.map +1 -0
- package/dist/parser/docx-parser.js +328 -0
- package/dist/parser/docx-parser.js.map +1 -0
- package/dist/parser/html-parser.d.ts +18 -0
- package/dist/parser/html-parser.d.ts.map +1 -0
- package/dist/parser/html-parser.js +102 -0
- package/dist/parser/html-parser.js.map +1 -0
- package/dist/parser/index.d.ts +214 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +454 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/pdf-extract.d.ts +81 -0
- package/dist/parser/pdf-extract.d.ts.map +1 -0
- package/dist/parser/pdf-extract.js +112 -0
- package/dist/parser/pdf-extract.js.map +1 -0
- package/dist/parser/pdf-filter.d.ts +117 -0
- package/dist/parser/pdf-filter.d.ts.map +1 -0
- package/dist/parser/pdf-filter.js +528 -0
- package/dist/parser/pdf-filter.js.map +1 -0
- package/dist/parser/title-extractor.d.ts +69 -0
- package/dist/parser/title-extractor.d.ts.map +1 -0
- package/dist/parser/title-extractor.js +145 -0
- package/dist/parser/title-extractor.js.map +1 -0
- package/dist/pdf-visual/captioner.d.ts +16 -0
- package/dist/pdf-visual/captioner.d.ts.map +1 -0
- package/dist/pdf-visual/captioner.js +63 -0
- package/dist/pdf-visual/captioner.js.map +1 -0
- package/dist/pdf-visual/captioners/fast.d.ts +7 -0
- package/dist/pdf-visual/captioners/fast.d.ts.map +1 -0
- package/dist/pdf-visual/captioners/fast.js +103 -0
- package/dist/pdf-visual/captioners/fast.js.map +1 -0
- package/dist/pdf-visual/captioners/quality.d.ts +7 -0
- package/dist/pdf-visual/captioners/quality.d.ts.map +1 -0
- package/dist/pdf-visual/captioners/quality.js +127 -0
- package/dist/pdf-visual/captioners/quality.js.map +1 -0
- package/dist/pdf-visual/captioners/shared.d.ts +44 -0
- package/dist/pdf-visual/captioners/shared.d.ts.map +1 -0
- package/dist/pdf-visual/captioners/shared.js +104 -0
- package/dist/pdf-visual/captioners/shared.js.map +1 -0
- package/dist/pdf-visual/detector.d.ts +9 -0
- package/dist/pdf-visual/detector.d.ts.map +1 -0
- package/dist/pdf-visual/detector.js +234 -0
- package/dist/pdf-visual/detector.js.map +1 -0
- package/dist/pdf-visual/index.d.ts +13 -0
- package/dist/pdf-visual/index.d.ts.map +1 -0
- package/dist/pdf-visual/index.js +45 -0
- package/dist/pdf-visual/index.js.map +1 -0
- package/dist/pdf-visual/renderer.d.ts +9 -0
- package/dist/pdf-visual/renderer.d.ts.map +1 -0
- package/dist/pdf-visual/renderer.js +177 -0
- package/dist/pdf-visual/renderer.js.map +1 -0
- package/dist/pdf-visual/types.d.ts +62 -0
- package/dist/pdf-visual/types.d.ts.map +1 -0
- package/dist/pdf-visual/types.js +32 -0
- package/dist/pdf-visual/types.js.map +1 -0
- package/dist/server/error-utils.d.ts +79 -0
- package/dist/server/error-utils.d.ts.map +1 -0
- package/dist/server/error-utils.js +148 -0
- package/dist/server/error-utils.js.map +1 -0
- package/dist/server/index.d.ts +258 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +1104 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/list-scanner.d.ts +52 -0
- package/dist/server/list-scanner.d.ts.map +1 -0
- package/dist/server/list-scanner.js +72 -0
- package/dist/server/list-scanner.js.map +1 -0
- package/dist/server/tool-definitions.d.ts +8 -0
- package/dist/server/tool-definitions.d.ts.map +1 -0
- package/dist/server/tool-definitions.js +181 -0
- package/dist/server/tool-definitions.js.map +1 -0
- package/dist/server/tool-input.d.ts +37 -0
- package/dist/server/tool-input.d.ts.map +1 -0
- package/dist/server/tool-input.js +216 -0
- package/dist/server/tool-input.js.map +1 -0
- package/dist/server/types.d.ts +331 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +3 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server-main.d.ts +46 -0
- package/dist/server-main.d.ts.map +1 -0
- package/dist/server-main.js +242 -0
- package/dist/server-main.js.map +1 -0
- package/dist/utils/base-dirs.d.ts +212 -0
- package/dist/utils/base-dirs.d.ts.map +1 -0
- package/dist/utils/base-dirs.js +422 -0
- package/dist/utils/base-dirs.js.map +1 -0
- package/dist/utils/errors.d.ts +24 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +53 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/limits.d.ts +26 -0
- package/dist/utils/limits.d.ts.map +1 -0
- package/dist/utils/limits.js +28 -0
- package/dist/utils/limits.js.map +1 -0
- package/dist/utils/list-sources.d.ts +47 -0
- package/dist/utils/list-sources.d.ts.map +1 -0
- package/dist/utils/list-sources.js +50 -0
- package/dist/utils/list-sources.js.map +1 -0
- package/dist/utils/raw-data-utils.d.ts +131 -0
- package/dist/utils/raw-data-utils.d.ts.map +1 -0
- package/dist/utils/raw-data-utils.js +255 -0
- package/dist/utils/raw-data-utils.js.map +1 -0
- package/dist/utils/scan.d.ts +126 -0
- package/dist/utils/scan.d.ts.map +1 -0
- package/dist/utils/scan.js +221 -0
- package/dist/utils/scan.js.map +1 -0
- package/dist/utils/scope-match.d.ts +43 -0
- package/dist/utils/scope-match.d.ts.map +1 -0
- package/dist/utils/scope-match.js +87 -0
- package/dist/utils/scope-match.js.map +1 -0
- package/dist/utils/sensitive-path.d.ts +23 -0
- package/dist/utils/sensitive-path.d.ts.map +1 -0
- package/dist/utils/sensitive-path.js +91 -0
- package/dist/utils/sensitive-path.js.map +1 -0
- package/dist/utils/sync-path-key.d.ts +20 -0
- package/dist/utils/sync-path-key.d.ts.map +1 -0
- package/dist/utils/sync-path-key.js +33 -0
- package/dist/utils/sync-path-key.js.map +1 -0
- package/dist/vectordb/index.d.ts +168 -0
- package/dist/vectordb/index.d.ts.map +1 -0
- package/dist/vectordb/index.js +619 -0
- package/dist/vectordb/index.js.map +1 -0
- package/dist/vectordb/search-filters.d.ts +39 -0
- package/dist/vectordb/search-filters.d.ts.map +1 -0
- package/dist/vectordb/search-filters.js +136 -0
- package/dist/vectordb/search-filters.js.map +1 -0
- package/dist/vectordb/types.d.ts +196 -0
- package/dist/vectordb/types.d.ts.map +1 -0
- package/dist/vectordb/types.js +224 -0
- package/dist/vectordb/types.js.map +1 -0
- package/package.json +105 -0
- package/skills/mcp-local-rag/SKILL.md +308 -0
- package/skills/mcp-local-rag/references/cli-reference.md +175 -0
- package/skills/mcp-local-rag/references/html-ingestion.md +78 -0
- package/skills/mcp-local-rag/references/query-optimization.md +57 -0
- package/skills/mcp-local-rag/references/result-refinement.md +56 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
// Shared per-page PDF extraction for the parser module.
|
|
2
|
+
//
|
|
3
|
+
// Lifts the per-page `toStructuredText` + header/footer-filtering loop out of
|
|
4
|
+
// `DocumentParser` so both `parsePdf` and `parsePdfPages` consume one helper.
|
|
5
|
+
// The two callers differ ONLY in the `stextOptions` they pass:
|
|
6
|
+
// - `parsePdf` passes `'preserve-whitespace'`;
|
|
7
|
+
// - `parsePdfPages` passes `'preserve-whitespace,preserve-images'` so mupdf
|
|
8
|
+
// emits `block.type === 'image'` entries for the downstream
|
|
9
|
+
// visual-candidate detector.
|
|
10
|
+
import { filterPageBoundaryLayouts, } from './pdf-filter.js';
|
|
11
|
+
/**
|
|
12
|
+
* Per-page extraction shared by `parsePdf` and `parsePdfPages`.
|
|
13
|
+
*
|
|
14
|
+
* Takes an already-open mupdf `Document` and:
|
|
15
|
+
* - reads `info:Title` once,
|
|
16
|
+
* - iterates pages calling `toStructuredText(stextOptions)`,
|
|
17
|
+
* - builds `PageData` items (only `block.type === 'text'` lines),
|
|
18
|
+
* - runs `filterPageBoundarySentences` to drop semantic headers/footers,
|
|
19
|
+
* - derives `page1FontHint` from page 1's largest-font lines.
|
|
20
|
+
*
|
|
21
|
+
* The two callers differ ONLY in `stextOptions`: `parsePdf` passes
|
|
22
|
+
* `'preserve-whitespace'`;
|
|
23
|
+
* `parsePdfPages` passes `'preserve-whitespace,preserve-images'` so mupdf
|
|
24
|
+
* emits `block.type === 'image'` entries for the downstream visual-candidate
|
|
25
|
+
* detector.
|
|
26
|
+
*
|
|
27
|
+
* Lifecycle: this helper does NOT call `doc.destroy()` — disposal stays
|
|
28
|
+
* with the caller.
|
|
29
|
+
*/
|
|
30
|
+
export async function extractPdfPages(doc, embedder, stextOptions) {
|
|
31
|
+
const numPages = doc.countPages();
|
|
32
|
+
const metadataTitle = doc.getMetaData('info:Title') || undefined;
|
|
33
|
+
const pageDataList = [];
|
|
34
|
+
const stextJsonList = [];
|
|
35
|
+
for (let i = 0; i < numPages; i++) {
|
|
36
|
+
const page = doc.loadPage(i);
|
|
37
|
+
try {
|
|
38
|
+
const bounds = page.getBounds(); // [x0, y0, x1, y1]
|
|
39
|
+
const pageHeight = bounds[3] - bounds[1];
|
|
40
|
+
let json;
|
|
41
|
+
const stext = page.toStructuredText(stextOptions);
|
|
42
|
+
try {
|
|
43
|
+
json = JSON.parse(stext.asJSON());
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
stext.destroy?.();
|
|
47
|
+
}
|
|
48
|
+
const items = [];
|
|
49
|
+
for (let blockOrdinal = 0; blockOrdinal < json.blocks.length; blockOrdinal++) {
|
|
50
|
+
const block = json.blocks[blockOrdinal];
|
|
51
|
+
if (block?.type !== 'text' || !block.lines)
|
|
52
|
+
continue;
|
|
53
|
+
for (let lineOrdinal = 0; lineOrdinal < block.lines.length; lineOrdinal++) {
|
|
54
|
+
const line = block.lines[lineOrdinal];
|
|
55
|
+
if (!line)
|
|
56
|
+
continue;
|
|
57
|
+
const bbox = line.bbox;
|
|
58
|
+
items.push({
|
|
59
|
+
text: line.text.replace(/\t/g, ' '),
|
|
60
|
+
x: line.x,
|
|
61
|
+
// Invert Y only for the legacy boundary detector; bbox remains in MuPDF coordinates.
|
|
62
|
+
y: pageHeight - line.y,
|
|
63
|
+
fontSize: line.font.size,
|
|
64
|
+
hasEOL: true,
|
|
65
|
+
...(line.font.name !== undefined ? { fontName: line.font.name } : {}),
|
|
66
|
+
...(line.font.weight !== undefined ? { fontWeight: line.font.weight } : {}),
|
|
67
|
+
blockOrdinal,
|
|
68
|
+
lineOrdinal,
|
|
69
|
+
bbox: bbox
|
|
70
|
+
? [bbox.x, bbox.y, bbox.x + bbox.w, bbox.y + bbox.h]
|
|
71
|
+
: [line.x, line.y, line.x, line.y],
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
pageDataList.push({
|
|
76
|
+
pageNum: i + 1,
|
|
77
|
+
items,
|
|
78
|
+
pageHeight,
|
|
79
|
+
});
|
|
80
|
+
stextJsonList.push(json);
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
page.destroy?.();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Apply sentence-level header/footer filtering while retaining each survivor's layout data.
|
|
87
|
+
const filteredPages = await filterPageBoundaryLayouts(pageDataList, embedder);
|
|
88
|
+
// Extract largest-font lines from page 1 for title hint.
|
|
89
|
+
// Concatenate all consecutive lines with the largest font size (covers multi-line titles).
|
|
90
|
+
const page1Items = pageDataList[0]?.items ?? [];
|
|
91
|
+
const maxFontSize = page1Items.reduce((max, item) => Math.max(max, item.fontSize), 0);
|
|
92
|
+
const titleLines = [];
|
|
93
|
+
if (maxFontSize > 0) {
|
|
94
|
+
for (const item of page1Items) {
|
|
95
|
+
if (item.fontSize === maxFontSize) {
|
|
96
|
+
titleLines.push(item.text.trim());
|
|
97
|
+
}
|
|
98
|
+
else if (titleLines.length > 0) {
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const page1FontHint = titleLines.length > 0 ? { text: titleLines.join(' '), fontSize: maxFontSize } : undefined;
|
|
104
|
+
const pages = pageDataList.map((p, idx) => ({
|
|
105
|
+
pageNum: p.pageNum,
|
|
106
|
+
text: filteredPages[idx]?.text ?? '',
|
|
107
|
+
textFragments: filteredPages[idx]?.textFragments ?? [],
|
|
108
|
+
stextJson: stextJsonList[idx],
|
|
109
|
+
}));
|
|
110
|
+
return { pages, metadataTitle, page1FontHint };
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=pdf-extract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-extract.js","sourceRoot":"","sources":["../../src/parser/pdf-extract.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,EAAE;AACF,8EAA8E;AAC9E,8EAA8E;AAC9E,+DAA+D;AAC/D,iDAAiD;AACjD,8EAA8E;AAC9E,gEAAgE;AAChE,iCAAiC;AAGjC,OAAO,EAGL,yBAAyB,GAE1B,MAAM,iBAAiB,CAAA;AAwDxB;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAkB,EAClB,QAA2B,EAC3B,YAAoB;IAEpB,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,EAAE,CAAA;IACjC,MAAM,aAAa,GAAG,GAAG,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,SAAS,CAAA;IAEhE,MAAM,YAAY,GAAe,EAAE,CAAA;IACnC,MAAM,aAAa,GAAgB,EAAE,CAAA;IACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;QAC5B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA,CAAC,mBAAmB;YACnD,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;YACxC,IAAI,IAAe,CAAA;YACnB,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAA;YACjD,IAAI,CAAC;gBACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAc,CAAA;YAChD,CAAC;oBAAS,CAAC;gBACT,KAAK,CAAC,OAAO,EAAE,EAAE,CAAA;YACnB,CAAC;YAED,MAAM,KAAK,GAAsB,EAAE,CAAA;YACnC,KAAK,IAAI,YAAY,GAAG,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,CAAC;gBAC7E,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;gBACvC,IAAI,KAAK,EAAE,IAAI,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK;oBAAE,SAAQ;gBACpD,KAAK,IAAI,WAAW,GAAG,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC;oBAC1E,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;oBACrC,IAAI,CAAC,IAAI;wBAAE,SAAQ;oBACnB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;oBACtB,KAAK,CAAC,IAAI,CAAC;wBACT,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;wBACnC,CAAC,EAAE,IAAI,CAAC,CAAC;wBACT,qFAAqF;wBACrF,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC,CAAC;wBACtB,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;wBACxB,MAAM,EAAE,IAAI;wBACZ,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACrE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC3E,YAAY;wBACZ,WAAW;wBACX,IAAI,EAAE,IAAI;4BACR,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;4BACpD,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;qBACrC,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;YAED,YAAY,CAAC,IAAI,CAAC;gBAChB,OAAO,EAAE,CAAC,GAAG,CAAC;gBACd,KAAK;gBACL,UAAU;aACX,CAAC,CAAA;YACF,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC1B,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,EAAE,EAAE,CAAA;QAClB,CAAC;IACH,CAAC;IAED,4FAA4F;IAC5F,MAAM,aAAa,GAAG,MAAM,yBAAyB,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAA;IAE7E,yDAAyD;IACzD,2FAA2F;IAC3F,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,CAAA;IAC/C,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA;IACrF,MAAM,UAAU,GAAa,EAAE,CAAA;IAC/B,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACpB,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;gBAClC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;YACnC,CAAC;iBAAM,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjC,MAAK;YACP,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,aAAa,GACjB,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;IAE3F,MAAM,KAAK,GAAoB,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QAC3D,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,EAAE;QACpC,aAAa,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,aAAa,IAAI,EAAE;QACtD,SAAS,EAAE,aAAa,CAAC,GAAG,CAAc;KAC3C,CAAC,CAAC,CAAA;IAEH,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,CAAA;AAChD,CAAC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import type { EmbedderInterface } from '../chunker/semantic-chunker.js';
|
|
2
|
+
export type { EmbedderInterface };
|
|
3
|
+
/**
|
|
4
|
+
* Text item with position information from PDF
|
|
5
|
+
*/
|
|
6
|
+
interface TextItemWithPosition {
|
|
7
|
+
text: string;
|
|
8
|
+
x: number;
|
|
9
|
+
y: number;
|
|
10
|
+
fontSize: number;
|
|
11
|
+
hasEOL: boolean;
|
|
12
|
+
fontName?: string;
|
|
13
|
+
fontWeight?: string;
|
|
14
|
+
blockOrdinal?: number;
|
|
15
|
+
lineOrdinal?: number;
|
|
16
|
+
bbox?: [number, number, number, number];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Page data containing positioned text items
|
|
20
|
+
*/
|
|
21
|
+
export interface PageData {
|
|
22
|
+
pageNum: number;
|
|
23
|
+
items: TextItemWithPosition[];
|
|
24
|
+
pageHeight?: number;
|
|
25
|
+
}
|
|
26
|
+
export interface FilteredTextFragment {
|
|
27
|
+
pageNum: number;
|
|
28
|
+
blockOrdinal: number;
|
|
29
|
+
lineOrdinal: number;
|
|
30
|
+
fragmentOrdinal: number;
|
|
31
|
+
bbox: [number, number, number, number];
|
|
32
|
+
text: string;
|
|
33
|
+
pageTextStart: number;
|
|
34
|
+
pageTextEnd: number;
|
|
35
|
+
}
|
|
36
|
+
export interface FilteredPageLayout {
|
|
37
|
+
text: string;
|
|
38
|
+
textFragments: FilteredTextFragment[];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Join filtered pages into text
|
|
42
|
+
*
|
|
43
|
+
* @param pages - Filtered page data
|
|
44
|
+
* @returns Joined text with proper line breaks
|
|
45
|
+
*/
|
|
46
|
+
export declare function joinFilteredPages(pages: PageData[]): string;
|
|
47
|
+
/**
|
|
48
|
+
* Configuration for sentence-level pattern detection
|
|
49
|
+
*/
|
|
50
|
+
interface SentencePatternConfig {
|
|
51
|
+
/** Similarity threshold for pattern detection (default: 0.85) */
|
|
52
|
+
similarityThreshold: number;
|
|
53
|
+
/** Minimum pages required for pattern detection (default: 3) */
|
|
54
|
+
minPages: number;
|
|
55
|
+
/** Number of pages to sample from center for pattern detection (default: 5) */
|
|
56
|
+
samplePages: number;
|
|
57
|
+
/** Block attribute hints for boosted threshold (from detectBlockAttributeCandidates) */
|
|
58
|
+
blockHints?: BlockAttributeHints;
|
|
59
|
+
/** Boosted similarity threshold when block hints match (default: 0.75) */
|
|
60
|
+
boostedThreshold?: number;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Hints for block-level header/footer detection based on font attributes
|
|
64
|
+
*/
|
|
65
|
+
export interface BlockAttributeHints {
|
|
66
|
+
medianFontSize: number;
|
|
67
|
+
headerCandidateYs: Set<number>;
|
|
68
|
+
footerCandidateYs: Set<number>;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Detect candidate header/footer lines based on font size and Y position
|
|
72
|
+
*
|
|
73
|
+
* Stage 1 of the 2-stage header/footer detection:
|
|
74
|
+
* 1. Sample center pages (same logic as detectSentencePatterns)
|
|
75
|
+
* 2. Calculate median font size from all items across sampled pages
|
|
76
|
+
* 3. Identify header candidates: fontSize < medianFontSize * 0.7 AND y > pageHeight * 0.9
|
|
77
|
+
* 4. Identify footer candidates: fontSize < medianFontSize * 0.7 AND y < pageHeight * 0.1
|
|
78
|
+
*
|
|
79
|
+
* @param pages - Array of page data
|
|
80
|
+
* @param config - Configuration options (minPages, samplePages)
|
|
81
|
+
* @returns Block attribute hints with candidate Y positions
|
|
82
|
+
*/
|
|
83
|
+
export declare function detectBlockAttributeCandidates(pages: PageData[], config?: Partial<Pick<SentencePatternConfig, 'minPages' | 'samplePages'>>): BlockAttributeHints;
|
|
84
|
+
/**
|
|
85
|
+
* Result of sentence-level pattern detection
|
|
86
|
+
*/
|
|
87
|
+
interface SentencePatternResult {
|
|
88
|
+
/** Whether first sentences should be removed (detected as header) */
|
|
89
|
+
removeFirstSentence: boolean;
|
|
90
|
+
/** Whether last sentences should be removed (detected as footer) */
|
|
91
|
+
removeLastSentence: boolean;
|
|
92
|
+
/** Median similarity of first sentences */
|
|
93
|
+
headerSimilarity: number;
|
|
94
|
+
/** Median similarity of last sentences */
|
|
95
|
+
footerSimilarity: number;
|
|
96
|
+
}
|
|
97
|
+
export declare function detectSentencePatterns(pages: PageData[], embedder: EmbedderInterface, config?: Partial<SentencePatternConfig>): Promise<SentencePatternResult>;
|
|
98
|
+
/**
|
|
99
|
+
* Filter page boundary sentences and return per-page filtered text
|
|
100
|
+
*
|
|
101
|
+
* This is the main entry point for sentence-level header/footer filtering.
|
|
102
|
+
* It detects and removes repeating sentence patterns at page boundaries.
|
|
103
|
+
* Returns an array of filtered text per page, preserving page boundaries.
|
|
104
|
+
*
|
|
105
|
+
* Use this instead of joinFilteredPages when embedder is available.
|
|
106
|
+
*
|
|
107
|
+
* @param pages - Array of page data
|
|
108
|
+
* @param embedder - Embedder for generating embeddings
|
|
109
|
+
* @param config - Configuration options
|
|
110
|
+
* @returns Array of filtered text strings, one per page
|
|
111
|
+
*/
|
|
112
|
+
export declare function filterPageBoundarySentences(pages: PageData[], embedder: EmbedderInterface, config?: Partial<SentencePatternConfig>): Promise<string[]>;
|
|
113
|
+
/**
|
|
114
|
+
* Filter page boundaries while retaining native provenance for every survivor.
|
|
115
|
+
*/
|
|
116
|
+
export declare function filterPageBoundaryLayouts(pages: PageData[], embedder: EmbedderInterface, config?: Partial<SentencePatternConfig>): Promise<FilteredPageLayout[]>;
|
|
117
|
+
//# sourceMappingURL=pdf-filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-filter.d.ts","sourceRoot":"","sources":["../../src/parser/pdf-filter.ts"],"names":[],"mappings":"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"}
|