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.
Files changed (233) hide show
  1. package/LICENSE +21 -0
  2. package/README.de.md +416 -0
  3. package/README.es.md +416 -0
  4. package/README.fr.md +416 -0
  5. package/README.md +491 -0
  6. package/README.pt-BR.md +416 -0
  7. package/README.zh-CN.md +416 -0
  8. package/dist/bin/install-skills.d.ts +20 -0
  9. package/dist/bin/install-skills.d.ts.map +1 -0
  10. package/dist/bin/install-skills.js +195 -0
  11. package/dist/bin/install-skills.js.map +1 -0
  12. package/dist/chunker/index.d.ts +24 -0
  13. package/dist/chunker/index.d.ts.map +1 -0
  14. package/dist/chunker/index.js +2 -0
  15. package/dist/chunker/index.js.map +1 -0
  16. package/dist/chunker/semantic-chunker.d.ts +97 -0
  17. package/dist/chunker/semantic-chunker.d.ts.map +1 -0
  18. package/dist/chunker/semantic-chunker.js +294 -0
  19. package/dist/chunker/semantic-chunker.js.map +1 -0
  20. package/dist/chunker/sentence-splitter.d.ts +28 -0
  21. package/dist/chunker/sentence-splitter.d.ts.map +1 -0
  22. package/dist/chunker/sentence-splitter.js +219 -0
  23. package/dist/chunker/sentence-splitter.js.map +1 -0
  24. package/dist/cli/common.d.ts +65 -0
  25. package/dist/cli/common.d.ts.map +1 -0
  26. package/dist/cli/common.js +138 -0
  27. package/dist/cli/common.js.map +1 -0
  28. package/dist/cli/delete.d.ts +8 -0
  29. package/dist/cli/delete.d.ts.map +1 -0
  30. package/dist/cli/delete.js +173 -0
  31. package/dist/cli/delete.js.map +1 -0
  32. package/dist/cli/file-collection.d.ts +2 -0
  33. package/dist/cli/file-collection.d.ts.map +1 -0
  34. package/dist/cli/file-collection.js +53 -0
  35. package/dist/cli/file-collection.js.map +1 -0
  36. package/dist/cli/ingest.d.ts +100 -0
  37. package/dist/cli/ingest.d.ts.map +1 -0
  38. package/dist/cli/ingest.js +363 -0
  39. package/dist/cli/ingest.js.map +1 -0
  40. package/dist/cli/list.d.ts +35 -0
  41. package/dist/cli/list.d.ts.map +1 -0
  42. package/dist/cli/list.js +210 -0
  43. package/dist/cli/list.js.map +1 -0
  44. package/dist/cli/options.d.ts +100 -0
  45. package/dist/cli/options.d.ts.map +1 -0
  46. package/dist/cli/options.js +241 -0
  47. package/dist/cli/options.js.map +1 -0
  48. package/dist/cli/query.d.ts +24 -0
  49. package/dist/cli/query.d.ts.map +1 -0
  50. package/dist/cli/query.js +191 -0
  51. package/dist/cli/query.js.map +1 -0
  52. package/dist/cli/read-neighbors.d.ts +11 -0
  53. package/dist/cli/read-neighbors.d.ts.map +1 -0
  54. package/dist/cli/read-neighbors.js +224 -0
  55. package/dist/cli/read-neighbors.js.map +1 -0
  56. package/dist/cli/status.d.ts +8 -0
  57. package/dist/cli/status.d.ts.map +1 -0
  58. package/dist/cli/status.js +80 -0
  59. package/dist/cli/status.js.map +1 -0
  60. package/dist/cli/sync.d.ts +8 -0
  61. package/dist/cli/sync.d.ts.map +1 -0
  62. package/dist/cli/sync.js +244 -0
  63. package/dist/cli/sync.js.map +1 -0
  64. package/dist/cli-main.d.ts +12 -0
  65. package/dist/cli-main.d.ts.map +1 -0
  66. package/dist/cli-main.js +63 -0
  67. package/dist/cli-main.js.map +1 -0
  68. package/dist/embedder/index.d.ts +85 -0
  69. package/dist/embedder/index.d.ts.map +1 -0
  70. package/dist/embedder/index.js +284 -0
  71. package/dist/embedder/index.js.map +1 -0
  72. package/dist/features/list.d.ts +37 -0
  73. package/dist/features/list.d.ts.map +1 -0
  74. package/dist/features/list.js +40 -0
  75. package/dist/features/list.js.map +1 -0
  76. package/dist/features/sync.d.ts +207 -0
  77. package/dist/features/sync.d.ts.map +1 -0
  78. package/dist/features/sync.js +380 -0
  79. package/dist/features/sync.js.map +1 -0
  80. package/dist/index.d.ts +3 -0
  81. package/dist/index.d.ts.map +1 -0
  82. package/dist/index.js +53 -0
  83. package/dist/index.js.map +1 -0
  84. package/dist/ingest/compute.d.ts +86 -0
  85. package/dist/ingest/compute.d.ts.map +1 -0
  86. package/dist/ingest/compute.js +177 -0
  87. package/dist/ingest/compute.js.map +1 -0
  88. package/dist/ingest/file.d.ts +27 -0
  89. package/dist/ingest/file.d.ts.map +1 -0
  90. package/dist/ingest/file.js +67 -0
  91. package/dist/ingest/file.js.map +1 -0
  92. package/dist/ingest/visual.d.ts +45 -0
  93. package/dist/ingest/visual.d.ts.map +1 -0
  94. package/dist/ingest/visual.js +234 -0
  95. package/dist/ingest/visual.js.map +1 -0
  96. package/dist/parser/docx-parser.d.ts +12 -0
  97. package/dist/parser/docx-parser.d.ts.map +1 -0
  98. package/dist/parser/docx-parser.js +328 -0
  99. package/dist/parser/docx-parser.js.map +1 -0
  100. package/dist/parser/html-parser.d.ts +18 -0
  101. package/dist/parser/html-parser.d.ts.map +1 -0
  102. package/dist/parser/html-parser.js +102 -0
  103. package/dist/parser/html-parser.js.map +1 -0
  104. package/dist/parser/index.d.ts +214 -0
  105. package/dist/parser/index.d.ts.map +1 -0
  106. package/dist/parser/index.js +454 -0
  107. package/dist/parser/index.js.map +1 -0
  108. package/dist/parser/pdf-extract.d.ts +81 -0
  109. package/dist/parser/pdf-extract.d.ts.map +1 -0
  110. package/dist/parser/pdf-extract.js +112 -0
  111. package/dist/parser/pdf-extract.js.map +1 -0
  112. package/dist/parser/pdf-filter.d.ts +117 -0
  113. package/dist/parser/pdf-filter.d.ts.map +1 -0
  114. package/dist/parser/pdf-filter.js +528 -0
  115. package/dist/parser/pdf-filter.js.map +1 -0
  116. package/dist/parser/title-extractor.d.ts +69 -0
  117. package/dist/parser/title-extractor.d.ts.map +1 -0
  118. package/dist/parser/title-extractor.js +145 -0
  119. package/dist/parser/title-extractor.js.map +1 -0
  120. package/dist/pdf-visual/captioner.d.ts +16 -0
  121. package/dist/pdf-visual/captioner.d.ts.map +1 -0
  122. package/dist/pdf-visual/captioner.js +63 -0
  123. package/dist/pdf-visual/captioner.js.map +1 -0
  124. package/dist/pdf-visual/captioners/fast.d.ts +7 -0
  125. package/dist/pdf-visual/captioners/fast.d.ts.map +1 -0
  126. package/dist/pdf-visual/captioners/fast.js +103 -0
  127. package/dist/pdf-visual/captioners/fast.js.map +1 -0
  128. package/dist/pdf-visual/captioners/quality.d.ts +7 -0
  129. package/dist/pdf-visual/captioners/quality.d.ts.map +1 -0
  130. package/dist/pdf-visual/captioners/quality.js +127 -0
  131. package/dist/pdf-visual/captioners/quality.js.map +1 -0
  132. package/dist/pdf-visual/captioners/shared.d.ts +44 -0
  133. package/dist/pdf-visual/captioners/shared.d.ts.map +1 -0
  134. package/dist/pdf-visual/captioners/shared.js +104 -0
  135. package/dist/pdf-visual/captioners/shared.js.map +1 -0
  136. package/dist/pdf-visual/detector.d.ts +9 -0
  137. package/dist/pdf-visual/detector.d.ts.map +1 -0
  138. package/dist/pdf-visual/detector.js +234 -0
  139. package/dist/pdf-visual/detector.js.map +1 -0
  140. package/dist/pdf-visual/index.d.ts +13 -0
  141. package/dist/pdf-visual/index.d.ts.map +1 -0
  142. package/dist/pdf-visual/index.js +45 -0
  143. package/dist/pdf-visual/index.js.map +1 -0
  144. package/dist/pdf-visual/renderer.d.ts +9 -0
  145. package/dist/pdf-visual/renderer.d.ts.map +1 -0
  146. package/dist/pdf-visual/renderer.js +177 -0
  147. package/dist/pdf-visual/renderer.js.map +1 -0
  148. package/dist/pdf-visual/types.d.ts +62 -0
  149. package/dist/pdf-visual/types.d.ts.map +1 -0
  150. package/dist/pdf-visual/types.js +32 -0
  151. package/dist/pdf-visual/types.js.map +1 -0
  152. package/dist/server/error-utils.d.ts +79 -0
  153. package/dist/server/error-utils.d.ts.map +1 -0
  154. package/dist/server/error-utils.js +148 -0
  155. package/dist/server/error-utils.js.map +1 -0
  156. package/dist/server/index.d.ts +258 -0
  157. package/dist/server/index.d.ts.map +1 -0
  158. package/dist/server/index.js +1104 -0
  159. package/dist/server/index.js.map +1 -0
  160. package/dist/server/list-scanner.d.ts +52 -0
  161. package/dist/server/list-scanner.d.ts.map +1 -0
  162. package/dist/server/list-scanner.js +72 -0
  163. package/dist/server/list-scanner.js.map +1 -0
  164. package/dist/server/tool-definitions.d.ts +8 -0
  165. package/dist/server/tool-definitions.d.ts.map +1 -0
  166. package/dist/server/tool-definitions.js +181 -0
  167. package/dist/server/tool-definitions.js.map +1 -0
  168. package/dist/server/tool-input.d.ts +37 -0
  169. package/dist/server/tool-input.d.ts.map +1 -0
  170. package/dist/server/tool-input.js +216 -0
  171. package/dist/server/tool-input.js.map +1 -0
  172. package/dist/server/types.d.ts +331 -0
  173. package/dist/server/types.d.ts.map +1 -0
  174. package/dist/server/types.js +3 -0
  175. package/dist/server/types.js.map +1 -0
  176. package/dist/server-main.d.ts +46 -0
  177. package/dist/server-main.d.ts.map +1 -0
  178. package/dist/server-main.js +242 -0
  179. package/dist/server-main.js.map +1 -0
  180. package/dist/utils/base-dirs.d.ts +212 -0
  181. package/dist/utils/base-dirs.d.ts.map +1 -0
  182. package/dist/utils/base-dirs.js +422 -0
  183. package/dist/utils/base-dirs.js.map +1 -0
  184. package/dist/utils/errors.d.ts +24 -0
  185. package/dist/utils/errors.d.ts.map +1 -0
  186. package/dist/utils/errors.js +53 -0
  187. package/dist/utils/errors.js.map +1 -0
  188. package/dist/utils/limits.d.ts +26 -0
  189. package/dist/utils/limits.d.ts.map +1 -0
  190. package/dist/utils/limits.js +28 -0
  191. package/dist/utils/limits.js.map +1 -0
  192. package/dist/utils/list-sources.d.ts +47 -0
  193. package/dist/utils/list-sources.d.ts.map +1 -0
  194. package/dist/utils/list-sources.js +50 -0
  195. package/dist/utils/list-sources.js.map +1 -0
  196. package/dist/utils/raw-data-utils.d.ts +131 -0
  197. package/dist/utils/raw-data-utils.d.ts.map +1 -0
  198. package/dist/utils/raw-data-utils.js +255 -0
  199. package/dist/utils/raw-data-utils.js.map +1 -0
  200. package/dist/utils/scan.d.ts +126 -0
  201. package/dist/utils/scan.d.ts.map +1 -0
  202. package/dist/utils/scan.js +221 -0
  203. package/dist/utils/scan.js.map +1 -0
  204. package/dist/utils/scope-match.d.ts +43 -0
  205. package/dist/utils/scope-match.d.ts.map +1 -0
  206. package/dist/utils/scope-match.js +87 -0
  207. package/dist/utils/scope-match.js.map +1 -0
  208. package/dist/utils/sensitive-path.d.ts +23 -0
  209. package/dist/utils/sensitive-path.d.ts.map +1 -0
  210. package/dist/utils/sensitive-path.js +91 -0
  211. package/dist/utils/sensitive-path.js.map +1 -0
  212. package/dist/utils/sync-path-key.d.ts +20 -0
  213. package/dist/utils/sync-path-key.d.ts.map +1 -0
  214. package/dist/utils/sync-path-key.js +33 -0
  215. package/dist/utils/sync-path-key.js.map +1 -0
  216. package/dist/vectordb/index.d.ts +168 -0
  217. package/dist/vectordb/index.d.ts.map +1 -0
  218. package/dist/vectordb/index.js +619 -0
  219. package/dist/vectordb/index.js.map +1 -0
  220. package/dist/vectordb/search-filters.d.ts +39 -0
  221. package/dist/vectordb/search-filters.d.ts.map +1 -0
  222. package/dist/vectordb/search-filters.js +136 -0
  223. package/dist/vectordb/search-filters.js.map +1 -0
  224. package/dist/vectordb/types.d.ts +196 -0
  225. package/dist/vectordb/types.d.ts.map +1 -0
  226. package/dist/vectordb/types.js +224 -0
  227. package/dist/vectordb/types.js.map +1 -0
  228. package/package.json +105 -0
  229. package/skills/mcp-local-rag/SKILL.md +308 -0
  230. package/skills/mcp-local-rag/references/cli-reference.md +175 -0
  231. package/skills/mcp-local-rag/references/html-ingestion.md +78 -0
  232. package/skills/mcp-local-rag/references/query-optimization.md +57 -0
  233. 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":"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"}
@@ -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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"}