@ssmeo/mcp-local-rag 0.18.6

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 (247) hide show
  1. package/LICENSE +21 -0
  2. package/README.de.md +441 -0
  3. package/README.es.md +441 -0
  4. package/README.fr.md +441 -0
  5. package/README.md +530 -0
  6. package/README.pt-BR.md +441 -0
  7. package/README.zh-CN.md +441 -0
  8. package/dist/bin/install-skills.d.ts +19 -0
  9. package/dist/bin/install-skills.d.ts.map +1 -0
  10. package/dist/bin/install-skills.js +218 -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 +96 -0
  17. package/dist/chunker/semantic-chunker.d.ts.map +1 -0
  18. package/dist/chunker/semantic-chunker.js +362 -0
  19. package/dist/chunker/semantic-chunker.js.map +1 -0
  20. package/dist/chunker/sentence-splitter.d.ts +32 -0
  21. package/dist/chunker/sentence-splitter.d.ts.map +1 -0
  22. package/dist/chunker/sentence-splitter.js +231 -0
  23. package/dist/chunker/sentence-splitter.js.map +1 -0
  24. package/dist/chunker/token-containment.d.ts +39 -0
  25. package/dist/chunker/token-containment.d.ts.map +1 -0
  26. package/dist/chunker/token-containment.js +83 -0
  27. package/dist/chunker/token-containment.js.map +1 -0
  28. package/dist/cli/common.d.ts +34 -0
  29. package/dist/cli/common.d.ts.map +1 -0
  30. package/dist/cli/common.js +121 -0
  31. package/dist/cli/common.js.map +1 -0
  32. package/dist/cli/delete.d.ts +3 -0
  33. package/dist/cli/delete.d.ts.map +1 -0
  34. package/dist/cli/delete.js +169 -0
  35. package/dist/cli/delete.js.map +1 -0
  36. package/dist/cli/file-collection.d.ts +2 -0
  37. package/dist/cli/file-collection.d.ts.map +1 -0
  38. package/dist/cli/file-collection.js +53 -0
  39. package/dist/cli/file-collection.js.map +1 -0
  40. package/dist/cli/ingest.d.ts +69 -0
  41. package/dist/cli/ingest.d.ts.map +1 -0
  42. package/dist/cli/ingest.js +323 -0
  43. package/dist/cli/ingest.js.map +1 -0
  44. package/dist/cli/list.d.ts +27 -0
  45. package/dist/cli/list.d.ts.map +1 -0
  46. package/dist/cli/list.js +207 -0
  47. package/dist/cli/list.js.map +1 -0
  48. package/dist/cli/options.d.ts +89 -0
  49. package/dist/cli/options.d.ts.map +1 -0
  50. package/dist/cli/options.js +244 -0
  51. package/dist/cli/options.js.map +1 -0
  52. package/dist/cli/query.d.ts +17 -0
  53. package/dist/cli/query.d.ts.map +1 -0
  54. package/dist/cli/query.js +194 -0
  55. package/dist/cli/query.js.map +1 -0
  56. package/dist/cli/read-neighbors.d.ts +3 -0
  57. package/dist/cli/read-neighbors.d.ts.map +1 -0
  58. package/dist/cli/read-neighbors.js +192 -0
  59. package/dist/cli/read-neighbors.js.map +1 -0
  60. package/dist/cli/status.d.ts +6 -0
  61. package/dist/cli/status.d.ts.map +1 -0
  62. package/dist/cli/status.js +78 -0
  63. package/dist/cli/status.js.map +1 -0
  64. package/dist/cli/sync.d.ts +6 -0
  65. package/dist/cli/sync.d.ts.map +1 -0
  66. package/dist/cli/sync.js +271 -0
  67. package/dist/cli/sync.js.map +1 -0
  68. package/dist/cli-main.d.ts +9 -0
  69. package/dist/cli-main.d.ts.map +1 -0
  70. package/dist/cli-main.js +60 -0
  71. package/dist/cli-main.js.map +1 -0
  72. package/dist/embedder/index.d.ts +143 -0
  73. package/dist/embedder/index.d.ts.map +1 -0
  74. package/dist/embedder/index.js +429 -0
  75. package/dist/embedder/index.js.map +1 -0
  76. package/dist/embedder/remote.d.ts +51 -0
  77. package/dist/embedder/remote.d.ts.map +1 -0
  78. package/dist/embedder/remote.js +182 -0
  79. package/dist/embedder/remote.js.map +1 -0
  80. package/dist/features/list.d.ts +37 -0
  81. package/dist/features/list.d.ts.map +1 -0
  82. package/dist/features/list.js +41 -0
  83. package/dist/features/list.js.map +1 -0
  84. package/dist/features/sync.d.ts +219 -0
  85. package/dist/features/sync.d.ts.map +1 -0
  86. package/dist/features/sync.js +461 -0
  87. package/dist/features/sync.js.map +1 -0
  88. package/dist/index.d.ts +3 -0
  89. package/dist/index.d.ts.map +1 -0
  90. package/dist/index.js +56 -0
  91. package/dist/index.js.map +1 -0
  92. package/dist/ingest/compute.d.ts +63 -0
  93. package/dist/ingest/compute.d.ts.map +1 -0
  94. package/dist/ingest/compute.js +161 -0
  95. package/dist/ingest/compute.js.map +1 -0
  96. package/dist/ingest/file.d.ts +40 -0
  97. package/dist/ingest/file.d.ts.map +1 -0
  98. package/dist/ingest/file.js +74 -0
  99. package/dist/ingest/file.js.map +1 -0
  100. package/dist/ingest/visual.d.ts +52 -0
  101. package/dist/ingest/visual.d.ts.map +1 -0
  102. package/dist/ingest/visual.js +294 -0
  103. package/dist/ingest/visual.js.map +1 -0
  104. package/dist/parser/docx-parser.d.ts +12 -0
  105. package/dist/parser/docx-parser.d.ts.map +1 -0
  106. package/dist/parser/docx-parser.js +375 -0
  107. package/dist/parser/docx-parser.js.map +1 -0
  108. package/dist/parser/html-parser.d.ts +16 -0
  109. package/dist/parser/html-parser.d.ts.map +1 -0
  110. package/dist/parser/html-parser.js +119 -0
  111. package/dist/parser/html-parser.js.map +1 -0
  112. package/dist/parser/index.d.ts +125 -0
  113. package/dist/parser/index.d.ts.map +1 -0
  114. package/dist/parser/index.js +364 -0
  115. package/dist/parser/index.js.map +1 -0
  116. package/dist/parser/pdf-extract.d.ts +49 -0
  117. package/dist/parser/pdf-extract.d.ts.map +1 -0
  118. package/dist/parser/pdf-extract.js +114 -0
  119. package/dist/parser/pdf-extract.js.map +1 -0
  120. package/dist/parser/pdf-filter.d.ts +91 -0
  121. package/dist/parser/pdf-filter.d.ts.map +1 -0
  122. package/dist/parser/pdf-filter.js +522 -0
  123. package/dist/parser/pdf-filter.js.map +1 -0
  124. package/dist/parser/title-extractor.d.ts +28 -0
  125. package/dist/parser/title-extractor.d.ts.map +1 -0
  126. package/dist/parser/title-extractor.js +105 -0
  127. package/dist/parser/title-extractor.js.map +1 -0
  128. package/dist/pdf-visual/captioner.d.ts +11 -0
  129. package/dist/pdf-visual/captioner.d.ts.map +1 -0
  130. package/dist/pdf-visual/captioner.js +48 -0
  131. package/dist/pdf-visual/captioner.js.map +1 -0
  132. package/dist/pdf-visual/captioners/fast.d.ts +7 -0
  133. package/dist/pdf-visual/captioners/fast.d.ts.map +1 -0
  134. package/dist/pdf-visual/captioners/fast.js +108 -0
  135. package/dist/pdf-visual/captioners/fast.js.map +1 -0
  136. package/dist/pdf-visual/captioners/quality.d.ts +7 -0
  137. package/dist/pdf-visual/captioners/quality.d.ts.map +1 -0
  138. package/dist/pdf-visual/captioners/quality.js +101 -0
  139. package/dist/pdf-visual/captioners/quality.js.map +1 -0
  140. package/dist/pdf-visual/captioners/shared.d.ts +81 -0
  141. package/dist/pdf-visual/captioners/shared.d.ts.map +1 -0
  142. package/dist/pdf-visual/captioners/shared.js +156 -0
  143. package/dist/pdf-visual/captioners/shared.js.map +1 -0
  144. package/dist/pdf-visual/detector.d.ts +9 -0
  145. package/dist/pdf-visual/detector.d.ts.map +1 -0
  146. package/dist/pdf-visual/detector.js +269 -0
  147. package/dist/pdf-visual/detector.js.map +1 -0
  148. package/dist/pdf-visual/index.d.ts +13 -0
  149. package/dist/pdf-visual/index.d.ts.map +1 -0
  150. package/dist/pdf-visual/index.js +53 -0
  151. package/dist/pdf-visual/index.js.map +1 -0
  152. package/dist/pdf-visual/renderer.d.ts +9 -0
  153. package/dist/pdf-visual/renderer.d.ts.map +1 -0
  154. package/dist/pdf-visual/renderer.js +186 -0
  155. package/dist/pdf-visual/renderer.js.map +1 -0
  156. package/dist/pdf-visual/types.d.ts +53 -0
  157. package/dist/pdf-visual/types.d.ts.map +1 -0
  158. package/dist/pdf-visual/types.js +17 -0
  159. package/dist/pdf-visual/types.js.map +1 -0
  160. package/dist/server/error-utils.d.ts +63 -0
  161. package/dist/server/error-utils.d.ts.map +1 -0
  162. package/dist/server/error-utils.js +124 -0
  163. package/dist/server/error-utils.js.map +1 -0
  164. package/dist/server/index.d.ts +216 -0
  165. package/dist/server/index.d.ts.map +1 -0
  166. package/dist/server/index.js +1068 -0
  167. package/dist/server/index.js.map +1 -0
  168. package/dist/server/list-scanner.d.ts +30 -0
  169. package/dist/server/list-scanner.d.ts.map +1 -0
  170. package/dist/server/list-scanner.js +50 -0
  171. package/dist/server/list-scanner.js.map +1 -0
  172. package/dist/server/tool-definitions.d.ts +8 -0
  173. package/dist/server/tool-definitions.d.ts.map +1 -0
  174. package/dist/server/tool-definitions.js +181 -0
  175. package/dist/server/tool-definitions.js.map +1 -0
  176. package/dist/server/tool-input.d.ts +37 -0
  177. package/dist/server/tool-input.d.ts.map +1 -0
  178. package/dist/server/tool-input.js +211 -0
  179. package/dist/server/tool-input.js.map +1 -0
  180. package/dist/server/types.d.ts +307 -0
  181. package/dist/server/types.d.ts.map +1 -0
  182. package/dist/server/types.js +3 -0
  183. package/dist/server/types.js.map +1 -0
  184. package/dist/server-main.d.ts +40 -0
  185. package/dist/server-main.d.ts.map +1 -0
  186. package/dist/server-main.js +254 -0
  187. package/dist/server-main.js.map +1 -0
  188. package/dist/utils/base-dirs.d.ts +145 -0
  189. package/dist/utils/base-dirs.d.ts.map +1 -0
  190. package/dist/utils/base-dirs.js +344 -0
  191. package/dist/utils/base-dirs.js.map +1 -0
  192. package/dist/utils/errors.d.ts +32 -0
  193. package/dist/utils/errors.d.ts.map +1 -0
  194. package/dist/utils/errors.js +61 -0
  195. package/dist/utils/errors.js.map +1 -0
  196. package/dist/utils/limits.d.ts +26 -0
  197. package/dist/utils/limits.d.ts.map +1 -0
  198. package/dist/utils/limits.js +28 -0
  199. package/dist/utils/limits.js.map +1 -0
  200. package/dist/utils/list-sources.d.ts +38 -0
  201. package/dist/utils/list-sources.d.ts.map +1 -0
  202. package/dist/utils/list-sources.js +40 -0
  203. package/dist/utils/list-sources.js.map +1 -0
  204. package/dist/utils/raw-data-utils.d.ts +76 -0
  205. package/dist/utils/raw-data-utils.d.ts.map +1 -0
  206. package/dist/utils/raw-data-utils.js +202 -0
  207. package/dist/utils/raw-data-utils.js.map +1 -0
  208. package/dist/utils/scan.d.ts +114 -0
  209. package/dist/utils/scan.d.ts.map +1 -0
  210. package/dist/utils/scan.js +209 -0
  211. package/dist/utils/scan.js.map +1 -0
  212. package/dist/utils/scope-match.d.ts +38 -0
  213. package/dist/utils/scope-match.d.ts.map +1 -0
  214. package/dist/utils/scope-match.js +86 -0
  215. package/dist/utils/scope-match.js.map +1 -0
  216. package/dist/utils/sensitive-path.d.ts +9 -0
  217. package/dist/utils/sensitive-path.d.ts.map +1 -0
  218. package/dist/utils/sensitive-path.js +78 -0
  219. package/dist/utils/sensitive-path.js.map +1 -0
  220. package/dist/utils/sync-path-key.d.ts +14 -0
  221. package/dist/utils/sync-path-key.d.ts.map +1 -0
  222. package/dist/utils/sync-path-key.js +27 -0
  223. package/dist/utils/sync-path-key.js.map +1 -0
  224. package/dist/utils/type-guards.d.ts +18 -0
  225. package/dist/utils/type-guards.d.ts.map +1 -0
  226. package/dist/utils/type-guards.js +34 -0
  227. package/dist/utils/type-guards.js.map +1 -0
  228. package/dist/utils/visual-profile.d.ts +10 -0
  229. package/dist/utils/visual-profile.d.ts.map +1 -0
  230. package/dist/utils/visual-profile.js +15 -0
  231. package/dist/utils/visual-profile.js.map +1 -0
  232. package/dist/vectordb/index.d.ts +132 -0
  233. package/dist/vectordb/index.d.ts.map +1 -0
  234. package/dist/vectordb/index.js +617 -0
  235. package/dist/vectordb/index.js.map +1 -0
  236. package/dist/vectordb/search-filters.d.ts +15 -0
  237. package/dist/vectordb/search-filters.d.ts.map +1 -0
  238. package/dist/vectordb/search-filters.js +129 -0
  239. package/dist/vectordb/search-filters.js.map +1 -0
  240. package/dist/vectordb/types.d.ts +194 -0
  241. package/dist/vectordb/types.d.ts.map +1 -0
  242. package/dist/vectordb/types.js +237 -0
  243. package/dist/vectordb/types.js.map +1 -0
  244. package/package.json +108 -0
  245. package/skills/mcp-local-rag/SKILL.md +234 -0
  246. package/skills/mcp-local-rag/references/cli-reference.md +190 -0
  247. package/skills/mcp-local-rag/references/html-ingestion.md +78 -0
@@ -0,0 +1,156 @@
1
+ // Profile-agnostic helpers shared by every `captioners/*` profile: the
2
+ // post-generation pipeline (control-char strip, trim, empty → `null`, length
3
+ // cap) so caption shape is independent of profile, plus the load/decode
4
+ // mechanics. The model class, prompt, processor call shape and generation
5
+ // options stay per-profile — that is where `fast` and `quality` diverge.
6
+ import { RawImage } from '@huggingface/transformers';
7
+ import { isObjectLike } from '../../utils/type-guards.js';
8
+ /**
9
+ * ONNX quantization variant shared by both captioner profiles. Pinned to the
10
+ * smallest viable variant; production has no user-facing knob.
11
+ */
12
+ const VLM_DTYPE = 'q4';
13
+ /**
14
+ * Build the `from_pretrained` option objects (processor + model) with the
15
+ * pinned dtype and resolved device. `RAG_DEVICE` passes through with no
16
+ * allowlist (see `resolveDevice`) into a closed literal union.
17
+ */
18
+ export function buildModelLoadOptions(resolvedDevice) {
19
+ const dtypeOpt = { dtype: VLM_DTYPE };
20
+ const modelOpt = {
21
+ dtype: VLM_DTYPE,
22
+ // biome-ignore lint/nursery/noUnsafeTypeAssertion: RAG_DEVICE is a deliberate un-allowlisted passthrough to a closed literal union
23
+ device: resolvedDevice,
24
+ };
25
+ return { dtypeOpt, modelOpt };
26
+ }
27
+ /**
28
+ * Not a guard: member existence says nothing about return values. The captioner
29
+ * tests replace the library, so they prove these call sites are right GIVEN
30
+ * this contract, not that the library still honors it — only `fast` runs
31
+ * against the real one, in `visual-ingest-e2e.test.ts`.
32
+ */
33
+ export function asVlmProcessor(processor) {
34
+ // biome-ignore lint/nursery/noUnsafeTypeAssertion: narrows the library's `Processor`, see above
35
+ return processor;
36
+ }
37
+ /** Present a loaded model as {@link VlmModel}. See {@link asVlmProcessor}. */
38
+ export function asVlmModel(model) {
39
+ // biome-ignore lint/nursery/noUnsafeTypeAssertion: picks `generate`'s tensor branch, see VlmModel
40
+ return model;
41
+ }
42
+ /**
43
+ * Lazy model loader shared by both profiles: owns the pending→ok/failed state
44
+ * machine and the identical load-failure wrapping. A prior failure re-throws
45
+ * the same wrapped error rather than retrying. The per-profile `load` callback
46
+ * owns the model-class choice.
47
+ */
48
+ export function createModelLoader(modelName, resolvedDevice, load) {
49
+ let loaded = null;
50
+ let state = { kind: 'pending' };
51
+ return {
52
+ async dispose() {
53
+ const model = loaded?.model;
54
+ loaded = null;
55
+ const dispose = isObjectLike(model) ? model['dispose'] : undefined;
56
+ if (typeof dispose === 'function') {
57
+ try {
58
+ await dispose.call(model);
59
+ }
60
+ catch (error) {
61
+ console.error('Error disposing captioner model:', error);
62
+ }
63
+ }
64
+ },
65
+ async ensureLoaded() {
66
+ if (state.kind === 'ok' && loaded) {
67
+ return loaded;
68
+ }
69
+ if (state.kind === 'failed') {
70
+ throw state.cause;
71
+ }
72
+ try {
73
+ loaded = await load(buildModelLoadOptions(resolvedDevice));
74
+ state = { kind: 'ok' };
75
+ return loaded;
76
+ }
77
+ catch (err) {
78
+ const original = err instanceof Error ? err : new Error(String(err));
79
+ const wrapped = new Error(`Captioner load failed (modelName=${modelName}, device=${resolvedDevice}): ${original.message}`, { cause: original });
80
+ state = { kind: 'failed', cause: wrapped };
81
+ throw wrapped;
82
+ }
83
+ },
84
+ };
85
+ }
86
+ /**
87
+ * Decode PNG bytes to a `RawImage`. `BlobPart` omits `Uint8Array<ArrayBufferLike>`
88
+ * (SharedArrayBuffer subtyping), so the bytes are copied into a view that is
89
+ * definitely backed by a plain `ArrayBuffer`. Profiles needing a fixed input
90
+ * size resize the result.
91
+ */
92
+ export async function decodePngToRawImage(pngBytes) {
93
+ const bytes = new Uint8Array(pngBytes);
94
+ const blob = new Blob([bytes], { type: 'image/png' });
95
+ return RawImage.fromBlob(blob);
96
+ }
97
+ /** Aspect ratio the Qwen image processors reject above. */
98
+ const MAX_ASPECT_RATIO = 200;
99
+ /**
100
+ * Downscale so the long edge is at most `longEdge`, preserving the aspect
101
+ * ratio, and widen a hairline crop until the processor accepts it. Alignment to
102
+ * the model's patch grid is left to the image processor. Returns the image
103
+ * untouched when it already satisfies both.
104
+ */
105
+ export async function capLongEdge(image, longEdge) {
106
+ const scale = Math.min(1, longEdge / Math.max(image.width, image.height));
107
+ const scaled = (size) => Math.max(1, Math.floor(size * scale));
108
+ // Stretching the thin side rather than padding it: at this ratio the crop
109
+ // holds no legible text either way, and a caption beats a thrown page.
110
+ const shortest = Math.ceil(Math.max(scaled(image.width), scaled(image.height)) / MAX_ASPECT_RATIO);
111
+ const width = Math.max(scaled(image.width), shortest);
112
+ const height = Math.max(scaled(image.height), shortest);
113
+ if (width === image.width && height === image.height) {
114
+ return image;
115
+ }
116
+ return image.resize(width, height);
117
+ }
118
+ /** Maximum caption length in characters; longer captions are truncated with an ellipsis. */
119
+ const MAX_CAPTION_LENGTH = 1000;
120
+ /**
121
+ * Strip C0 (U+0000–U+001F) and C1 (U+007F–U+009F) control characters from the
122
+ * input, except `\n` (U+000A) and `\t` (U+0009) which are kept verbatim.
123
+ */
124
+ function stripControlChars(input) {
125
+ let out = '';
126
+ for (let i = 0; i < input.length; i++) {
127
+ const code = input.charCodeAt(i);
128
+ if (code === 0x09 || code === 0x0a) {
129
+ out += input[i];
130
+ continue;
131
+ }
132
+ if (code <= 0x1f) {
133
+ continue;
134
+ }
135
+ if (code >= 0x7f && code <= 0x9f) {
136
+ continue;
137
+ }
138
+ out += input[i];
139
+ }
140
+ return out;
141
+ }
142
+ /**
143
+ * Apply the post-generation processing rules. Returns the final caption or
144
+ * `null` when the result is empty after stripping.
145
+ */
146
+ export function postProcess(decoded) {
147
+ const stripped = stripControlChars(decoded).trim();
148
+ if (stripped.length === 0) {
149
+ return null;
150
+ }
151
+ if (stripped.length > MAX_CAPTION_LENGTH) {
152
+ return `${stripped.slice(0, MAX_CAPTION_LENGTH)}…`;
153
+ }
154
+ return stripped;
155
+ }
156
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/pdf-visual/captioners/shared.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Document as MupdfDocument } from 'mupdf';
2
+ import type { DetectedVisualRegion } from './types.js';
3
+ interface DetectorPage {
4
+ pageNum: number;
5
+ stextJson: unknown;
6
+ }
7
+ export declare function detectVisualRegions(pages: DetectorPage[], doc: MupdfDocument): DetectedVisualRegion[];
8
+ export {};
9
+ //# sourceMappingURL=detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../src/pdf-visual/detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,OAAO,CAAA;AAItD,OAAO,KAAK,EAAE,oBAAoB,EAA8B,MAAM,YAAY,CAAA;AAmBlF,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,OAAO,CAAA;CACnB;AA6QD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,YAAY,EAAE,EACrB,GAAG,EAAE,aAAa,GACjB,oBAAoB,EAAE,CA4BxB"}
@@ -0,0 +1,269 @@
1
+ import * as mupdf from 'mupdf';
2
+ import { isRecord } from '../utils/type-guards.js';
3
+ const MIN_IMAGE_BLOCK_WIDTH = 80;
4
+ const MIN_IMAGE_BLOCK_HEIGHT = 80;
5
+ const MIN_IMAGE_BLOCK_AREA_RATIO = 0.01;
6
+ const MAX_EFFECTIVE_AREA_RATIO = 0.85;
7
+ const IMAGE_MAX_AREA_RATIO_THRESHOLD = 0.1;
8
+ const IMAGE_TOTAL_AREA_RATIO_THRESHOLD = 0.15;
9
+ const MAX_CORNER_LOGO_AREA_RATIO = 0.03;
10
+ const CORNER_LOGO_EDGE_BAND_RATIO = 0.15;
11
+ const MIN_VECTOR_WIDTH = 20;
12
+ const MIN_VECTOR_HEIGHT = 20;
13
+ const MIN_VECTOR_AREA_RATIO = 0.0005;
14
+ const VECTOR_STROKE_COUNT_THRESHOLD = 5;
15
+ const CROP_PADDING_RATIO = 0.08;
16
+ const MIN_CROP_PADDING = 12;
17
+ const GROUP_GAP = 6;
18
+ const GROUP_GAP_PAGE_RATIO = 0.01;
19
+ function areaOf(rect) {
20
+ return Math.max(0, rect[2] - rect[0]) * Math.max(0, rect[3] - rect[1]);
21
+ }
22
+ function clampRect(rect, bounds) {
23
+ return [
24
+ Math.max(bounds[0], Math.min(bounds[2], rect[0])),
25
+ Math.max(bounds[1], Math.min(bounds[3], rect[1])),
26
+ Math.max(bounds[0], Math.min(bounds[2], rect[2])),
27
+ Math.max(bounds[1], Math.min(bounds[3], rect[3])),
28
+ ];
29
+ }
30
+ function unionRects(rects) {
31
+ const first = rects[0];
32
+ if (!first) {
33
+ return null;
34
+ }
35
+ let [x0, y0, x1, y1] = first;
36
+ for (const rect of rects.slice(1)) {
37
+ x0 = Math.min(x0, rect[0]);
38
+ y0 = Math.min(y0, rect[1]);
39
+ x1 = Math.max(x1, rect[2]);
40
+ y1 = Math.max(y1, rect[3]);
41
+ }
42
+ return [x0, y0, x1, y1];
43
+ }
44
+ function padRect(rect, pageBounds) {
45
+ const xPad = Math.max(MIN_CROP_PADDING, (rect[2] - rect[0]) * CROP_PADDING_RATIO);
46
+ const yPad = Math.max(MIN_CROP_PADDING, (rect[3] - rect[1]) * CROP_PADDING_RATIO);
47
+ return clampRect([rect[0] - xPad, rect[1] - yPad, rect[2] + xPad, rect[3] + yPad], pageBounds);
48
+ }
49
+ function isFiniteNumber(value) {
50
+ return typeof value === 'number' && Number.isFinite(value);
51
+ }
52
+ function blockRect(block) {
53
+ if (!isRecord(block)) {
54
+ return null;
55
+ }
56
+ const bbox = block['bbox'];
57
+ if (!isRecord(bbox)) {
58
+ return null;
59
+ }
60
+ const { x, y, w, h } = bbox;
61
+ if (!isFiniteNumber(x) || !isFiniteNumber(y) || !isFiniteNumber(w) || !isFiniteNumber(h)) {
62
+ return null;
63
+ }
64
+ return [x, y, x + w, y + h];
65
+ }
66
+ function getBlocks(stextJson) {
67
+ if (!isRecord(stextJson)) {
68
+ return [];
69
+ }
70
+ const blocks = stextJson['blocks'];
71
+ return Array.isArray(blocks) ? blocks : [];
72
+ }
73
+ function isLikelyCornerLogo(rect, pageBounds, areaRatio) {
74
+ if (areaRatio > MAX_CORNER_LOGO_AREA_RATIO) {
75
+ return false;
76
+ }
77
+ const pageWidth = pageBounds[2] - pageBounds[0];
78
+ const pageHeight = pageBounds[3] - pageBounds[1];
79
+ const xBand = pageWidth * CORNER_LOGO_EDGE_BAND_RATIO;
80
+ const yBand = pageHeight * CORNER_LOGO_EDGE_BAND_RATIO;
81
+ const nearHorizontalEdge = rect[0] <= pageBounds[0] + xBand || rect[2] >= pageBounds[2] - xBand;
82
+ const nearVerticalEdge = rect[1] <= pageBounds[1] + yBand || rect[3] >= pageBounds[3] - yBand;
83
+ return nearHorizontalEdge && nearVerticalEdge;
84
+ }
85
+ function collectRasterRects(stextJson, pageBounds) {
86
+ const pageArea = areaOf(pageBounds);
87
+ if (pageArea <= 0) {
88
+ return [];
89
+ }
90
+ const rects = [];
91
+ for (const block of getBlocks(stextJson)) {
92
+ if (!isRecord(block) || block['type'] !== 'image') {
93
+ continue;
94
+ }
95
+ const rawRect = blockRect(block);
96
+ if (!rawRect) {
97
+ continue;
98
+ }
99
+ const rect = clampRect(rawRect, pageBounds);
100
+ const width = rect[2] - rect[0];
101
+ const height = rect[3] - rect[1];
102
+ const ratio = areaOf(rect) / pageArea;
103
+ if (width >= MIN_IMAGE_BLOCK_WIDTH &&
104
+ height >= MIN_IMAGE_BLOCK_HEIGHT &&
105
+ ratio >= MIN_IMAGE_BLOCK_AREA_RATIO &&
106
+ ratio <= MAX_EFFECTIVE_AREA_RATIO &&
107
+ !isLikelyCornerLogo(rect, pageBounds, ratio)) {
108
+ rects.push(rect);
109
+ }
110
+ }
111
+ return rects;
112
+ }
113
+ function rasterQualifies(rects, pageBounds) {
114
+ const pageArea = areaOf(pageBounds);
115
+ const ratios = rects.map((rect) => areaOf(rect) / pageArea);
116
+ return (Math.max(0, ...ratios) >= IMAGE_MAX_AREA_RATIO_THRESHOLD ||
117
+ ratios.reduce((sum, ratio) => sum + ratio, 0) >= IMAGE_TOTAL_AREA_RATIO_THRESHOLD);
118
+ }
119
+ function collectVectorStrokeRects(page, pageNum, pageBounds) {
120
+ const pageArea = areaOf(pageBounds);
121
+ const rects = [];
122
+ const device = new mupdf.Device({
123
+ strokePath(path, stroke, ctm) {
124
+ try {
125
+ const raw = path.getBounds(stroke, ctm);
126
+ if (!raw.every(Number.isFinite)) {
127
+ return;
128
+ }
129
+ const rect = clampRect([raw[0], raw[1], raw[2], raw[3]], pageBounds);
130
+ const width = rect[2] - rect[0];
131
+ const height = rect[3] - rect[1];
132
+ const ratio = areaOf(rect) / pageArea;
133
+ if (width >= MIN_VECTOR_WIDTH &&
134
+ height >= MIN_VECTOR_HEIGHT &&
135
+ ratio >= MIN_VECTOR_AREA_RATIO &&
136
+ ratio <= MAX_EFFECTIVE_AREA_RATIO) {
137
+ rects.push(rect);
138
+ }
139
+ }
140
+ catch (error) {
141
+ const message = error instanceof Error ? error.message : String(error);
142
+ console.warn(`detector: stroke bounds failed on page ${pageNum}: ${message}`);
143
+ }
144
+ },
145
+ });
146
+ try {
147
+ page.run(device, mupdf.Matrix.identity);
148
+ }
149
+ catch (error) {
150
+ const message = error instanceof Error ? error.message : String(error);
151
+ console.warn(`detector: vector scan failed on page ${pageNum}: ${message}`);
152
+ return [];
153
+ }
154
+ finally {
155
+ device.close();
156
+ }
157
+ return rects;
158
+ }
159
+ function axisGap(a0, a1, b0, b1) {
160
+ if (a1 < b0) {
161
+ return b0 - a1;
162
+ }
163
+ if (b1 < a0) {
164
+ return a0 - b1;
165
+ }
166
+ return 0;
167
+ }
168
+ /** True when two rects are within `gap` on both axes. */
169
+ function isWithinGap(left, right, gap) {
170
+ return (axisGap(left[0], left[2], right[0], right[2]) <= gap &&
171
+ axisGap(left[1], left[3], right[1], right[3]) <= gap);
172
+ }
173
+ /**
174
+ * Flood-fill from `seed`, taking every still-remaining rect that is within
175
+ * `gap` of one already in the cluster. Taken indices leave `remaining`.
176
+ */
177
+ function growCluster(seed, rects, remaining, gap) {
178
+ const indices = [seed];
179
+ for (let cursor = 0; cursor < indices.length; cursor += 1) {
180
+ const currentIndex = indices[cursor];
181
+ const current = currentIndex === undefined ? undefined : rects[currentIndex];
182
+ if (current === undefined) {
183
+ continue;
184
+ }
185
+ for (const candidateIndex of remaining) {
186
+ const candidate = rects[candidateIndex];
187
+ if (candidate !== undefined && isWithinGap(current, candidate, gap)) {
188
+ remaining.delete(candidateIndex);
189
+ indices.push(candidateIndex);
190
+ }
191
+ }
192
+ }
193
+ return indices;
194
+ }
195
+ function groupRects(rects, pageBounds) {
196
+ const gap = Math.max(GROUP_GAP, Math.min(pageBounds[2] - pageBounds[0], pageBounds[3] - pageBounds[1]) * GROUP_GAP_PAGE_RATIO);
197
+ const remaining = new Set(rects.map((_, index) => index));
198
+ const groups = [];
199
+ while (remaining.size > 0) {
200
+ const seed = remaining.values().next().value;
201
+ if (seed === undefined) {
202
+ break;
203
+ }
204
+ remaining.delete(seed);
205
+ const indices = growCluster(seed, rects, remaining, gap);
206
+ groups.push(indices.map((index) => rects[index]).filter((rect) => rect !== undefined));
207
+ }
208
+ return groups;
209
+ }
210
+ function pageRegions(pageRecord, page, pageBounds) {
211
+ const rasterRects = collectRasterRects(pageRecord.stextJson, pageBounds);
212
+ let groups;
213
+ let evidence;
214
+ if (rasterQualifies(rasterRects, pageBounds)) {
215
+ groups = groupRects(rasterRects, pageBounds);
216
+ evidence = 'raster';
217
+ }
218
+ else {
219
+ const vectorRects = collectVectorStrokeRects(page, pageRecord.pageNum, pageBounds);
220
+ if (vectorRects.length < VECTOR_STROKE_COUNT_THRESHOLD) {
221
+ return [];
222
+ }
223
+ groups = groupRects(vectorRects, pageBounds);
224
+ evidence = 'vector';
225
+ }
226
+ return groups.flatMap((group) => {
227
+ const union = unionRects(group);
228
+ if (!union) {
229
+ return [];
230
+ }
231
+ const bbox = padRect(union, pageBounds);
232
+ return [
233
+ {
234
+ pageNum: pageRecord.pageNum,
235
+ bbox,
236
+ evidence,
237
+ },
238
+ ];
239
+ });
240
+ }
241
+ export function detectVisualRegions(pages, doc) {
242
+ const pending = [];
243
+ for (const pageRecord of pages) {
244
+ let page = null;
245
+ try {
246
+ page = doc.loadPage(pageRecord.pageNum - 1);
247
+ const raw = page.getBounds();
248
+ const bounds = [raw[0], raw[1], raw[2], raw[3]];
249
+ if (areaOf(bounds) > 0) {
250
+ pending.push(...pageRegions(pageRecord, page, bounds));
251
+ }
252
+ }
253
+ catch (error) {
254
+ const message = error instanceof Error ? error.message : String(error);
255
+ console.warn(`detector: page scan failed on page ${pageRecord.pageNum}: ${message}`);
256
+ }
257
+ finally {
258
+ page?.destroy?.();
259
+ }
260
+ }
261
+ pending.sort((left, right) => left.pageNum - right.pageNum || left.bbox[1] - right.bbox[1] || left.bbox[0] - right.bbox[0]);
262
+ const nextIndex = new Map();
263
+ return pending.map((region) => {
264
+ const detectionIndex = nextIndex.get(region.pageNum) ?? 0;
265
+ nextIndex.set(region.pageNum, detectionIndex + 1);
266
+ return { ...region, detectionIndex };
267
+ });
268
+ }
269
+ //# sourceMappingURL=detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/pdf-visual/detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Document as MupdfDocument } from 'mupdf';
2
+ import type { Captioner, DetectedVisualRegion, ProcessedVisualRegion } from './types.js';
3
+ export { createCaptioner } from './captioner.js';
4
+ export { detectVisualRegions } from './detector.js';
5
+ export { renderPdfPage, renderPdfRendition } from './renderer.js';
6
+ export type { DetectedVisualRegion, ImageRendition, ProcessedVisualRegion, } from './types.js';
7
+ export { VlmError } from './types.js';
8
+ export interface ProcessVisualRegionsOptions {
9
+ captioner?: Captioner;
10
+ includeImages?: boolean;
11
+ }
12
+ export declare function processVisualRegions(regions: DetectedVisualRegion[], doc: MupdfDocument, options: ProcessVisualRegionsOptions): Promise<ProcessedVisualRegion[]>;
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pdf-visual/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,OAAO,CAAA;AAGtD,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAUxF,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AACjE,YAAY,EACV,oBAAoB,EACpB,cAAc,EACd,qBAAqB,GACtB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,MAAM,WAAW,2BAA2B;IAC1C,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,oBAAoB,EAAE,EAC/B,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAQlC"}
@@ -0,0 +1,53 @@
1
+ // `pdf-visual` region orchestration and public surface. Region processing
2
+ // isolates caption and rendition failures so one crop cannot discard another.
3
+ import { renderPdfPage, renderPdfRendition } from './renderer.js';
4
+ // Public surface re-exports. The dispatch sites in `src/cli/ingest.ts` and
5
+ // `src/server/index.ts` reach the visual-mode
6
+ // implementation exclusively through `await import('../pdf-visual/index.js')`
7
+ // so default-mode ingest does not load visual dependencies. Keeping every
8
+ // public symbol re-exported here means those sites never need to know the
9
+ // internal module layout.
10
+ // Re-export ordering below is alphabetical by source module to match Biome's
11
+ // `organizeImports` rule (`./captioner` → `./detector` → `./renderer` → `./types`).
12
+ export { createCaptioner } from './captioner.js';
13
+ export { detectVisualRegions } from './detector.js';
14
+ export { renderPdfPage, renderPdfRendition } from './renderer.js';
15
+ export { VlmError } from './types.js';
16
+ export async function processVisualRegions(regions, doc, options) {
17
+ const processed = [];
18
+ for (const region of regions) {
19
+ const caption = options.captioner ? await captionRegion(options.captioner, doc, region) : null;
20
+ const rendition = options.includeImages ? await renderRegion(doc, region) : undefined;
21
+ processed.push({ ...region, caption, ...(rendition ? { rendition } : {}) });
22
+ }
23
+ return processed;
24
+ }
25
+ /**
26
+ * Caption one region. A VLM failure or an empty caption is a warning, not an
27
+ * error: the region still contributes its position and any rendition.
28
+ */
29
+ async function captionRegion(captioner, doc, region) {
30
+ try {
31
+ const pngBytes = await renderPdfPage(doc, region.pageNum, region.bbox);
32
+ const caption = await captioner.caption(pngBytes, region.pageNum);
33
+ if (caption === null) {
34
+ console.warn(`VLM caption empty for page ${region.pageNum}, visual ${region.detectionIndex}; proceeding without caption`);
35
+ }
36
+ return caption;
37
+ }
38
+ catch {
39
+ console.warn(`VLM caption failed for page ${region.pageNum}, visual ${region.detectionIndex}; proceeding without caption`);
40
+ return null;
41
+ }
42
+ }
43
+ /** Render one region's image, warning and omitting it on failure. */
44
+ async function renderRegion(doc, region) {
45
+ try {
46
+ return await renderPdfRendition(doc, region.pageNum, region.bbox, region.evidence);
47
+ }
48
+ catch {
49
+ console.warn(`PDF rendition failed for page ${region.pageNum}, visual ${region.detectionIndex}; proceeding without image`);
50
+ return undefined;
51
+ }
52
+ }
53
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pdf-visual/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,8EAA8E;AAI9E,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAGjE,2EAA2E;AAC3E,8CAA8C;AAC9C,8EAA8E;AAC9E,0EAA0E;AAC1E,0EAA0E;AAC1E,0BAA0B;AAC1B,6EAA6E;AAC7E,oFAAoF;AACpF,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAMjE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAOrC,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAA+B,EAC/B,GAAkB,EAClB,OAAoC;IAEpC,MAAM,SAAS,GAA4B,EAAE,CAAA;IAC7C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QAC9F,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QACrF,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IAC7E,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,aAAa,CAC1B,SAAgE,EAChE,GAAkB,EAClB,MAA4B;IAE5B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;QACtE,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;QACjE,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CACV,8BAA8B,MAAM,CAAC,OAAO,YAAY,MAAM,CAAC,cAAc,8BAA8B,CAC5G,CAAA;QACH,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CACV,+BAA+B,MAAM,CAAC,OAAO,YAAY,MAAM,CAAC,cAAc,8BAA8B,CAC7G,CAAA;QACD,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,qEAAqE;AACrE,KAAK,UAAU,YAAY,CACzB,GAAkB,EAClB,MAA4B;IAE5B,IAAI,CAAC;QACH,OAAO,MAAM,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;IACpF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CACV,iCAAiC,MAAM,CAAC,OAAO,YAAY,MAAM,CAAC,cAAc,4BAA4B,CAC7G,CAAA;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Document as MupdfDocument } from 'mupdf';
2
+ import type { ImageRendition, VisualBBox, VisualEvidence, VisualImageMimeType } from './types.js';
3
+ import { VlmError } from './types.js';
4
+ export { VlmError };
5
+ export declare function renderPdfPage(doc: MupdfDocument, pageNum: number, cropRect: VisualBBox): Promise<Uint8Array>;
6
+ export declare function renderPdfRendition(doc: MupdfDocument, pageNum: number, cropRect: VisualBBox, evidence: VisualEvidence): Promise<ImageRendition>;
7
+ /** Bound a Mammoth-extracted PNG/JPEG using the same query payload limits as PDF crops. */
8
+ export declare function renderImageRendition(bytes: Uint8Array, sourceMimeType: VisualImageMimeType): ImageRendition;
9
+ //# sourceMappingURL=renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/pdf-visual/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,OAAO,CAAA;AAItD,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AACjG,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,EAAE,QAAQ,EAAE,CAAA;AAwFnB,wBAAsB,aAAa,CACjC,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,UAAU,GACnB,OAAO,CAAC,UAAU,CAAC,CAcrB;AAqDD,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,UAAU,EACpB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,cAAc,CAAC,CAqBzB;AAiCD,2FAA2F;AAC3F,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,UAAU,EACjB,cAAc,EAAE,mBAAmB,GAClC,cAAc,CAyBhB"}