@mikashboks/capture-intelligence-core 0.2.5 → 0.2.7

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 (57) hide show
  1. package/dist/cjs/capture-envelope.d.ts +79 -0
  2. package/dist/cjs/capture-envelope.d.ts.map +1 -0
  3. package/dist/cjs/capture-envelope.js +48 -0
  4. package/dist/cjs/capture-envelope.js.map +1 -0
  5. package/dist/cjs/capture-guidance.js +3 -3
  6. package/dist/cjs/capture-guidance.js.map +1 -1
  7. package/dist/cjs/capture-trust.d.ts +1 -1
  8. package/dist/cjs/capture-trust.d.ts.map +1 -1
  9. package/dist/cjs/capture-trust.js +13 -11
  10. package/dist/cjs/capture-trust.js.map +1 -1
  11. package/dist/cjs/document-crop-arbitration.d.ts +12 -0
  12. package/dist/cjs/document-crop-arbitration.d.ts.map +1 -1
  13. package/dist/cjs/document-crop-arbitration.js +31 -18
  14. package/dist/cjs/document-crop-arbitration.js.map +1 -1
  15. package/dist/cjs/document-profiles.d.ts +23 -0
  16. package/dist/cjs/document-profiles.d.ts.map +1 -0
  17. package/dist/cjs/document-profiles.js +269 -0
  18. package/dist/cjs/document-profiles.js.map +1 -0
  19. package/dist/cjs/index.d.ts +7 -1
  20. package/dist/cjs/index.d.ts.map +1 -1
  21. package/dist/cjs/index.js +26 -3
  22. package/dist/cjs/index.js.map +1 -1
  23. package/dist/cjs/review-quality.d.ts +60 -0
  24. package/dist/cjs/review-quality.d.ts.map +1 -0
  25. package/dist/cjs/review-quality.js +203 -0
  26. package/dist/cjs/review-quality.js.map +1 -0
  27. package/dist/cjs/version.d.ts +1 -1
  28. package/dist/cjs/version.js +1 -1
  29. package/dist/esm/capture-envelope.d.ts +79 -0
  30. package/dist/esm/capture-envelope.d.ts.map +1 -0
  31. package/dist/esm/capture-envelope.js +43 -0
  32. package/dist/esm/capture-envelope.js.map +1 -0
  33. package/dist/esm/capture-guidance.js +3 -3
  34. package/dist/esm/capture-guidance.js.map +1 -1
  35. package/dist/esm/capture-trust.d.ts +1 -1
  36. package/dist/esm/capture-trust.d.ts.map +1 -1
  37. package/dist/esm/capture-trust.js +13 -11
  38. package/dist/esm/capture-trust.js.map +1 -1
  39. package/dist/esm/document-crop-arbitration.d.ts +12 -0
  40. package/dist/esm/document-crop-arbitration.d.ts.map +1 -1
  41. package/dist/esm/document-crop-arbitration.js +14 -12
  42. package/dist/esm/document-crop-arbitration.js.map +1 -1
  43. package/dist/esm/document-profiles.d.ts +23 -0
  44. package/dist/esm/document-profiles.d.ts.map +1 -0
  45. package/dist/esm/document-profiles.js +265 -0
  46. package/dist/esm/document-profiles.js.map +1 -0
  47. package/dist/esm/index.d.ts +7 -1
  48. package/dist/esm/index.d.ts.map +1 -1
  49. package/dist/esm/index.js +4 -1
  50. package/dist/esm/index.js.map +1 -1
  51. package/dist/esm/review-quality.d.ts +60 -0
  52. package/dist/esm/review-quality.d.ts.map +1 -0
  53. package/dist/esm/review-quality.js +198 -0
  54. package/dist/esm/review-quality.js.map +1 -0
  55. package/dist/esm/version.d.ts +1 -1
  56. package/dist/esm/version.js +1 -1
  57. package/package.json +1 -1
@@ -0,0 +1,60 @@
1
+ export declare const DOCUMENT_REVIEW_REGION_MIN_READABLE_WIDTH_PX = 480;
2
+ export type ReviewReason = 'pass' | 'review_checked' | 'whole_frame_blurry' | 'region_too_small' | 'region_dark' | 'region_blurry' | 'no_crop_clarity_uncertain' | 'untrusted_footprint' | 'wrong_side' | 'far' | 'not_document' | 'corners' | 'glare' | 'uncertain_document' | 'pre_review_retake';
3
+ export interface DocumentRegionBounds {
4
+ x: number;
5
+ y: number;
6
+ width: number;
7
+ height: number;
8
+ }
9
+ export interface DocumentRegionImageSize {
10
+ width: number;
11
+ height: number;
12
+ }
13
+ export interface ReviewDiagnostics {
14
+ wholeFrameLaplacianVariance?: number;
15
+ documentRegionLaplacianVariance?: number;
16
+ detectedCropPresent?: boolean;
17
+ cropProvenance?: string;
18
+ reviewReason?: ReviewReason;
19
+ }
20
+ export interface DocumentReviewQualityInput {
21
+ grey: Float32Array | Uint8Array;
22
+ width: number;
23
+ height: number;
24
+ wholeFrameSharpnessMinimum: number;
25
+ wholeFrameLaplacianVariance?: number;
26
+ wholeFrameSharpnessOk?: boolean;
27
+ initialTextReadableOk?: boolean;
28
+ initialGoodLightingOk?: boolean;
29
+ initialReviewReason?: ReviewReason;
30
+ imageAlreadyCropped?: boolean;
31
+ documentRegion?: DocumentRegionBounds | null;
32
+ documentRegionSourceSize?: DocumentRegionImageSize | null;
33
+ readableRegionWidthPx?: number | null;
34
+ cropProvenance?: string | null;
35
+ detectedCropPresent?: boolean | null;
36
+ }
37
+ export interface DocumentRegionReviewDiagnostics {
38
+ bounds: DocumentRegionBounds;
39
+ readableWidthPx: number;
40
+ sceneDark: boolean;
41
+ surroundLuma?: number;
42
+ regionDynamicRange?: number;
43
+ regionTooSmall: boolean;
44
+ regionBlurry: boolean;
45
+ }
46
+ export interface DocumentReviewQualityResult {
47
+ textReadableOk: boolean;
48
+ goodLightingOk: boolean;
49
+ reviewReason: ReviewReason;
50
+ diagnostics: ReviewDiagnostics;
51
+ region?: DocumentRegionReviewDiagnostics;
52
+ }
53
+ export interface NoCropClarityInput {
54
+ activeBase64Source?: 'original' | 'cropped' | string | null;
55
+ detectedCropPresent?: boolean | null;
56
+ hasDocumentFootprintEvidence?: boolean | null;
57
+ }
58
+ export declare function hasNoCropClarityUncertainty(input: NoCropClarityInput): boolean;
59
+ export declare function evaluateDocumentReviewQuality(input: DocumentReviewQualityInput): DocumentReviewQualityResult;
60
+ //# sourceMappingURL=review-quality.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-quality.d.ts","sourceRoot":"","sources":["../../src/review-quality.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,4CAA4C,MAAM,CAAC;AAEhE,MAAM,MAAM,YAAY,GACpB,MAAM,GACN,gBAAgB,GAChB,oBAAoB,GACpB,kBAAkB,GAClB,aAAa,GACb,eAAe,GACf,2BAA2B,GAC3B,qBAAqB,GACrB,YAAY,GACZ,KAAK,GACL,cAAc,GACd,SAAS,GACT,OAAO,GACP,oBAAoB,GACpB,mBAAmB,CAAC;AAExB,MAAM,WAAW,oBAAoB;IACnC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,+BAA+B,CAAC,EAAE,MAAM,CAAC;IACzC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,YAAY,GAAG,UAAU,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,0BAA0B,EAAE,MAAM,CAAC;IACnC,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,mBAAmB,CAAC,EAAE,YAAY,CAAC;IACnC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,cAAc,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC7C,wBAAwB,CAAC,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC1D,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,mBAAmB,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,+BAA+B;IAC9C,MAAM,EAAE,oBAAoB,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,2BAA2B;IAC1C,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,iBAAiB,CAAC;IAC/B,MAAM,CAAC,EAAE,+BAA+B,CAAC;CAC1C;AAED,MAAM,WAAW,kBAAkB;IACjC,kBAAkB,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5D,mBAAmB,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACrC,4BAA4B,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC/C;AAmKD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAM9E;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,0BAA0B,GAChC,2BAA2B,CAkG7B"}
@@ -0,0 +1,198 @@
1
+ import { SCENE_DARK_REGION_DYNAMIC_RANGE_MAX, SCENE_DARK_SURROUND_LUMA_MAX } from './types.js';
2
+ import { computeLaplacianVariance, computeLaplacianVarianceFloat } from './metrics.js';
3
+ export const DOCUMENT_REVIEW_REGION_MIN_READABLE_WIDTH_PX = 480;
4
+ function isFinitePositive(value) {
5
+ return typeof value === 'number' && Number.isFinite(value) && value > 0;
6
+ }
7
+ function clamp(value, min, max) {
8
+ return Math.min(max, Math.max(min, value));
9
+ }
10
+ function isUint8Grey(grey) {
11
+ return grey instanceof Uint8Array;
12
+ }
13
+ function getWholeFrameLaplacianVariance(grey, width, height) {
14
+ return isUint8Grey(grey)
15
+ ? computeLaplacianVariance(grey, width, height)
16
+ : computeLaplacianVarianceFloat(grey, width, height);
17
+ }
18
+ function toUint8Grey(grey) {
19
+ if (isUint8Grey(grey))
20
+ return grey;
21
+ const converted = new Uint8Array(grey.length);
22
+ for (let i = 0; i < grey.length; i++) {
23
+ converted[i] = clamp(Math.round(grey[i]), 0, 255);
24
+ }
25
+ return converted;
26
+ }
27
+ function scaleBoundsToImage(bounds, sourceSize, targetSize) {
28
+ if (!isFinitePositive(bounds.width) ||
29
+ !isFinitePositive(bounds.height) ||
30
+ !isFinitePositive(targetSize.width) ||
31
+ !isFinitePositive(targetSize.height)) {
32
+ return null;
33
+ }
34
+ const sourceWidth = isFinitePositive(sourceSize?.width) ? sourceSize.width : targetSize.width;
35
+ const sourceHeight = isFinitePositive(sourceSize?.height) ? sourceSize.height : targetSize.height;
36
+ const scaleX = targetSize.width / sourceWidth;
37
+ const scaleY = targetSize.height / sourceHeight;
38
+ const x = clamp(bounds.x * scaleX, 0, targetSize.width);
39
+ const y = clamp(bounds.y * scaleY, 0, targetSize.height);
40
+ const width = clamp(bounds.width * scaleX, 0, targetSize.width - x);
41
+ const height = clamp(bounds.height * scaleY, 0, targetSize.height - y);
42
+ if (width <= 1 || height <= 1)
43
+ return null;
44
+ return { x, y, width, height };
45
+ }
46
+ function computeSceneLightProfileFromBounds(grey, width, height, bounds) {
47
+ const x1 = clamp(Math.floor(bounds.x), 0, width);
48
+ const y1 = clamp(Math.floor(bounds.y), 0, height);
49
+ const x2 = clamp(Math.ceil(bounds.x + bounds.width), 0, width);
50
+ const y2 = clamp(Math.ceil(bounds.y + bounds.height), 0, height);
51
+ const histogram = new Uint32Array(256);
52
+ let insideCount = 0;
53
+ let outsideSum = 0;
54
+ let outsideCount = 0;
55
+ for (let y = 0; y < height; y++) {
56
+ const rowOffset = y * width;
57
+ const rowInside = y >= y1 && y < y2;
58
+ for (let x = 0; x < width; x++) {
59
+ const value = grey[rowOffset + x];
60
+ if (rowInside && x >= x1 && x < x2) {
61
+ histogram[value]++;
62
+ insideCount++;
63
+ }
64
+ else {
65
+ outsideSum += value;
66
+ outsideCount++;
67
+ }
68
+ }
69
+ }
70
+ let regionDynamicRange = 0;
71
+ if (insideCount > 0) {
72
+ const p5Target = insideCount * 0.05;
73
+ const p95Target = insideCount * 0.95;
74
+ let cumulative = 0;
75
+ let p5 = 0;
76
+ let p95 = 255;
77
+ let p5Found = false;
78
+ for (let value = 0; value < 256; value++) {
79
+ cumulative += histogram[value];
80
+ if (!p5Found && cumulative >= p5Target) {
81
+ p5 = value;
82
+ p5Found = true;
83
+ }
84
+ if (cumulative >= p95Target) {
85
+ p95 = value;
86
+ break;
87
+ }
88
+ }
89
+ regionDynamicRange = Math.max(0, p95 - p5);
90
+ }
91
+ return {
92
+ ...(outsideCount > 0 ? { surroundLuma: outsideSum / outsideCount } : {}),
93
+ regionDynamicRange,
94
+ };
95
+ }
96
+ function isSceneDark(profile) {
97
+ return (typeof profile.surroundLuma === 'number' &&
98
+ profile.surroundLuma < SCENE_DARK_SURROUND_LUMA_MAX &&
99
+ typeof profile.regionDynamicRange === 'number' &&
100
+ profile.regionDynamicRange < SCENE_DARK_REGION_DYNAMIC_RANGE_MAX);
101
+ }
102
+ function computeRegionLaplacianVariance(grey, width, height, bounds) {
103
+ const x1 = clamp(Math.floor(bounds.x), 1, Math.max(1, width - 1));
104
+ const y1 = clamp(Math.floor(bounds.y), 1, Math.max(1, height - 1));
105
+ const x2 = clamp(Math.ceil(bounds.x + bounds.width), 1, Math.max(1, width - 1));
106
+ const y2 = clamp(Math.ceil(bounds.y + bounds.height), 1, Math.max(1, height - 1));
107
+ if (x2 <= x1 || y2 <= y1)
108
+ return undefined;
109
+ let lapSum = 0;
110
+ let lapCount = 0;
111
+ for (let y = y1; y < y2; y++) {
112
+ for (let x = x1; x < x2; x++) {
113
+ const lap = -4 * grey[y * width + x] +
114
+ grey[(y - 1) * width + x] +
115
+ grey[(y + 1) * width + x] +
116
+ grey[y * width + x - 1] +
117
+ grey[y * width + x + 1];
118
+ lapSum += lap * lap;
119
+ lapCount++;
120
+ }
121
+ }
122
+ return lapCount > 0 ? lapSum / lapCount : undefined;
123
+ }
124
+ export function hasNoCropClarityUncertainty(input) {
125
+ return (input.activeBase64Source !== 'cropped' &&
126
+ input.detectedCropPresent !== true &&
127
+ input.hasDocumentFootprintEvidence !== true);
128
+ }
129
+ export function evaluateDocumentReviewQuality(input) {
130
+ const wholeFrameLaplacianVariance = input.wholeFrameLaplacianVariance ??
131
+ getWholeFrameLaplacianVariance(input.grey, input.width, input.height);
132
+ const wholeFrameSharpnessOk = input.wholeFrameSharpnessOk ??
133
+ wholeFrameLaplacianVariance >= input.wholeFrameSharpnessMinimum;
134
+ let textReadableOk = input.initialTextReadableOk ?? wholeFrameSharpnessOk;
135
+ let goodLightingOk = input.initialGoodLightingOk ?? true;
136
+ let reviewReason = input.initialReviewReason ?? (wholeFrameSharpnessOk ? 'review_checked' : 'whole_frame_blurry');
137
+ let region;
138
+ if (!input.imageAlreadyCropped && input.documentRegion) {
139
+ const analyzedRegion = scaleBoundsToImage(input.documentRegion, input.documentRegionSourceSize, { width: input.width, height: input.height });
140
+ if (analyzedRegion) {
141
+ const readableWidthPx = isFinitePositive(input.readableRegionWidthPx) && input.readableRegionWidthPx > 0
142
+ ? input.readableRegionWidthPx
143
+ : input.documentRegion.width;
144
+ const regionTooSmall = readableWidthPx > 0 && readableWidthPx < DOCUMENT_REVIEW_REGION_MIN_READABLE_WIDTH_PX;
145
+ if (regionTooSmall) {
146
+ textReadableOk = false;
147
+ reviewReason = 'region_too_small';
148
+ }
149
+ const sceneLight = computeSceneLightProfileFromBounds(toUint8Grey(input.grey), input.width, input.height, analyzedRegion);
150
+ const sceneDark = isSceneDark(sceneLight);
151
+ if (sceneDark) {
152
+ goodLightingOk = false;
153
+ reviewReason = 'region_dark';
154
+ }
155
+ const documentRegionLaplacianVariance = computeRegionLaplacianVariance(input.grey, input.width, input.height, analyzedRegion);
156
+ const regionBlurry = typeof documentRegionLaplacianVariance === 'number' &&
157
+ documentRegionLaplacianVariance < input.wholeFrameSharpnessMinimum;
158
+ if (regionBlurry) {
159
+ textReadableOk = false;
160
+ reviewReason = 'region_blurry';
161
+ }
162
+ region = {
163
+ bounds: analyzedRegion,
164
+ readableWidthPx,
165
+ sceneDark,
166
+ surroundLuma: sceneLight.surroundLuma,
167
+ regionDynamicRange: sceneLight.regionDynamicRange,
168
+ regionTooSmall,
169
+ regionBlurry,
170
+ };
171
+ return {
172
+ textReadableOk,
173
+ goodLightingOk,
174
+ reviewReason,
175
+ diagnostics: {
176
+ wholeFrameLaplacianVariance,
177
+ documentRegionLaplacianVariance,
178
+ detectedCropPresent: input.detectedCropPresent ?? Boolean(input.documentRegion),
179
+ ...(input.cropProvenance ? { cropProvenance: input.cropProvenance } : {}),
180
+ reviewReason,
181
+ },
182
+ region,
183
+ };
184
+ }
185
+ }
186
+ return {
187
+ textReadableOk,
188
+ goodLightingOk,
189
+ reviewReason,
190
+ diagnostics: {
191
+ wholeFrameLaplacianVariance,
192
+ detectedCropPresent: input.detectedCropPresent ?? Boolean(input.documentRegion),
193
+ ...(input.cropProvenance ? { cropProvenance: input.cropProvenance } : {}),
194
+ reviewReason,
195
+ },
196
+ };
197
+ }
198
+ //# sourceMappingURL=review-quality.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-quality.js","sourceRoot":"","sources":["../../src/review-quality.ts"],"names":[],"mappings":"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"}
@@ -3,5 +3,5 @@
3
3
  * version.json). Must match package.json — test-locked in
4
4
  * test/capture-guidance.test.mjs. Bump both together.
5
5
  */
6
- export declare const CAPTURE_INTELLIGENCE_CORE_VERSION = "0.2.5";
6
+ export declare const CAPTURE_INTELLIGENCE_CORE_VERSION = "0.2.7";
7
7
  //# sourceMappingURL=version.d.ts.map
@@ -3,5 +3,5 @@
3
3
  * version.json). Must match package.json — test-locked in
4
4
  * test/capture-guidance.test.mjs. Bump both together.
5
5
  */
6
- export const CAPTURE_INTELLIGENCE_CORE_VERSION = '0.2.5';
6
+ export const CAPTURE_INTELLIGENCE_CORE_VERSION = '0.2.7';
7
7
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mikashboks/capture-intelligence-core",
3
- "version": "0.2.5",
3
+ "version": "0.2.7",
4
4
  "description": "DOM-free algorithmic core for capture intelligence: document classification, edge detection, frame metrics, and quality checks",
5
5
  "type": "module",
6
6
  "main": "./dist/cjs/index.js",