@mikashboks/capture-intelligence-core 0.1.24 → 0.2.1

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-guidance.d.ts +106 -0
  2. package/dist/cjs/capture-guidance.d.ts.map +1 -0
  3. package/dist/cjs/capture-guidance.js +398 -0
  4. package/dist/cjs/capture-guidance.js.map +1 -0
  5. package/dist/cjs/index.d.ts +8 -3
  6. package/dist/cjs/index.d.ts.map +1 -1
  7. package/dist/cjs/index.js +35 -3
  8. package/dist/cjs/index.js.map +1 -1
  9. package/dist/cjs/metrics.d.ts +30 -0
  10. package/dist/cjs/metrics.d.ts.map +1 -1
  11. package/dist/cjs/metrics.js +80 -0
  12. package/dist/cjs/metrics.js.map +1 -1
  13. package/dist/cjs/mrz-parser.d.ts +71 -0
  14. package/dist/cjs/mrz-parser.d.ts.map +1 -0
  15. package/dist/cjs/mrz-parser.js +160 -0
  16. package/dist/cjs/mrz-parser.js.map +1 -0
  17. package/dist/cjs/quality-checks.d.ts +5 -2
  18. package/dist/cjs/quality-checks.d.ts.map +1 -1
  19. package/dist/cjs/quality-checks.js +24 -3
  20. package/dist/cjs/quality-checks.js.map +1 -1
  21. package/dist/cjs/types.d.ts +18 -0
  22. package/dist/cjs/types.d.ts.map +1 -1
  23. package/dist/cjs/types.js +12 -1
  24. package/dist/cjs/types.js.map +1 -1
  25. package/dist/cjs/version.d.ts +7 -0
  26. package/dist/cjs/version.d.ts.map +1 -0
  27. package/dist/cjs/version.js +10 -0
  28. package/dist/cjs/version.js.map +1 -0
  29. package/dist/esm/capture-guidance.d.ts +106 -0
  30. package/dist/esm/capture-guidance.d.ts.map +1 -0
  31. package/dist/esm/capture-guidance.js +390 -0
  32. package/dist/esm/capture-guidance.js.map +1 -0
  33. package/dist/esm/index.d.ts +8 -3
  34. package/dist/esm/index.d.ts.map +1 -1
  35. package/dist/esm/index.js +6 -2
  36. package/dist/esm/index.js.map +1 -1
  37. package/dist/esm/metrics.d.ts +30 -0
  38. package/dist/esm/metrics.d.ts.map +1 -1
  39. package/dist/esm/metrics.js +79 -1
  40. package/dist/esm/metrics.js.map +1 -1
  41. package/dist/esm/mrz-parser.d.ts +71 -0
  42. package/dist/esm/mrz-parser.d.ts.map +1 -0
  43. package/dist/esm/mrz-parser.js +156 -0
  44. package/dist/esm/mrz-parser.js.map +1 -0
  45. package/dist/esm/quality-checks.d.ts +5 -2
  46. package/dist/esm/quality-checks.d.ts.map +1 -1
  47. package/dist/esm/quality-checks.js +24 -3
  48. package/dist/esm/quality-checks.js.map +1 -1
  49. package/dist/esm/types.d.ts +18 -0
  50. package/dist/esm/types.d.ts.map +1 -1
  51. package/dist/esm/types.js +11 -0
  52. package/dist/esm/types.js.map +1 -1
  53. package/dist/esm/version.d.ts +7 -0
  54. package/dist/esm/version.d.ts.map +1 -0
  55. package/dist/esm/version.js +7 -0
  56. package/dist/esm/version.js.map +1 -0
  57. package/package.json +1 -1
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Capture guidance — the shared semantic layer tying a guidance reason code
3
+ * to its traffic-light state, directional action, and presented copy.
4
+ *
5
+ * This is the cross-client home of the vocabulary first shipped in the web
6
+ * SDK's `capture-guidance-signal.ts`. The web SDK's local table must stay
7
+ * byte-identical to the `'self'` persona here (pinned by a parity test in
8
+ * `sdks/web-ui-sdk`); React Native clients (agent-kyc-app) consume this
9
+ * module directly with the `'agent'` persona.
10
+ *
11
+ * Persona rule: `'self'` is the end customer holding their own phone
12
+ * (kyc-mobile). `'agent'` is a trained field operator capturing on behalf of
13
+ * a customer — same semantics, third-person copy, faster damping.
14
+ */
15
+ import type { OverlayVariant } from './types.js';
16
+ import type { DocumentPlacementReason } from './document-placement.js';
17
+ export type CaptureGuidanceState = 'looking' | 'adjust' | 'ready';
18
+ /**
19
+ * Every non-'none' value MUST have a matching directional glyph in each
20
+ * client (web Overlay arrow CSS / RN GuidanceArrow component). Condition-only
21
+ * situations (blur/dark/glare) present as state 'adjust' with action 'none'.
22
+ */
23
+ export type CaptureGuidanceAction = 'none' | 'closer' | 'back' | 'left' | 'right' | 'up' | 'down' | 'center';
24
+ export type CaptureGuidancePersona = 'self' | 'agent';
25
+ export type CaptureGuidanceReasonCode = 'searching' | 'camera_preparing' | 'hold_still' | 'almost_ready' | 'document_found' | 'auto_safe' | 'review_safe' | 'manual_ready' | 'taking_photo' | 'too_small' | 'too_large_or_cutoff' | 'off_center' | 'nudge_left' | 'nudge_right' | 'nudge_up' | 'nudge_down' | 'too_dark' | 'glare' | 'blurry' | 'flatten_document' | 'wrong_side' | 'mrz_band_closer' | 'mrz_band_lines' | 'readable_text_closer' | 'back_text_closer' | 'passport_code_lines_bottom' | 'keep_passport_page_in_frame' | 'keep_document_in_frame' | 'show_page_and_code' | 'burst_abort' | 'selfie_searching' | 'selfie_multiple_faces' | 'selfie_too_dark' | 'selfie_too_bright' | 'selfie_cropped' | 'selfie_too_small' | 'selfie_too_large' | 'selfie_off_center' | 'selfie_blurry' | 'selfie_hold_still' | 'selfie_ready' | 'unclassified';
26
+ export type ResolvedCaptureGuidanceReasonCode = Exclude<CaptureGuidanceReasonCode, 'unclassified'>;
27
+ export declare const MANUAL_CAPTURE_READY_FEEDBACK = "Tap button to take photo";
28
+ export declare const GOOD_HOLD_STILL_FEEDBACK = "Good. Hold still";
29
+ export declare const TAKING_PHOTO_META = "Hold still\u2026";
30
+ export declare const INITIAL_DOCUMENT_FEEDBACK = "Put your document inside the box";
31
+ export declare const AUTO_CAPTURE_BURST_ABORT_FEEDBACK = "No clear photo yet. Hold still.";
32
+ export declare const WRONG_SIDE_TURN_OVER_FEEDBACK = "This looks like the back of the card. Turn it over.";
33
+ export declare function getDocumentSubjectLabel(overlayVariant: OverlayVariant): string;
34
+ export declare function getTiltAwayFromLightGuidance(overlayVariant: OverlayVariant): string;
35
+ export declare function getMoveToMiddleFeedback(overlayVariant: OverlayVariant): string;
36
+ export interface CaptureGuidanceSignalEntry {
37
+ reasonCode: ResolvedCaptureGuidanceReasonCode;
38
+ /** Pre-isReady state; isReady=true always promotes to 'ready'. */
39
+ state: CaptureGuidanceState;
40
+ action: CaptureGuidanceAction;
41
+ text: (overlayVariant: OverlayVariant, persona?: CaptureGuidancePersona) => string;
42
+ }
43
+ export interface PresentedCaptureGuidanceSignal {
44
+ text: string;
45
+ state: CaptureGuidanceState;
46
+ action: CaptureGuidanceAction;
47
+ reasonCode: CaptureGuidanceReasonCode;
48
+ }
49
+ export declare const CAPTURE_GUIDANCE_SIGNAL_TABLE: Record<ResolvedCaptureGuidanceReasonCode, CaptureGuidanceSignalEntry>;
50
+ export declare function resolveCaptureGuidanceSignal(reasonCode: ResolvedCaptureGuidanceReasonCode, isReady: boolean, overlayVariant?: OverlayVariant, persona?: CaptureGuidancePersona): PresentedCaptureGuidanceSignal;
51
+ /**
52
+ * Map a document placement failure to its guidance reason code. `ok` maps to
53
+ * the hold-still family because a passing placement frame is, by definition,
54
+ * waiting on stability/sharpness rather than a correction.
55
+ */
56
+ export declare const DOCUMENT_PLACEMENT_GUIDANCE_REASON: Record<DocumentPlacementReason, ResolvedCaptureGuidanceReasonCode>;
57
+ export declare function mapSelfieIssueToGuidanceReason(issueKey: string): ResolvedCaptureGuidanceReasonCode | null;
58
+ /**
59
+ * Presentation damping for live guidance. Dwell times are wall-clock floors a
60
+ * presented signal holds before a replacement renders; confirm frames are the
61
+ * consecutive analysis frames a NEW corrective signal must persist before it
62
+ * is allowed on screen at all. Frame counts assume each client's own analysis
63
+ * cadence (web ~15fps video loop; RN ~1.5-2fps snapshot loop), which is why
64
+ * the agent profile uses smaller frame counts, not just smaller dwells.
65
+ */
66
+ export interface CaptureGuidanceDampingProfile {
67
+ /** Normal corrective guidance (dark / blur / glare / placement). */
68
+ correctiveMinDwellMs: number;
69
+ correctiveConfirmFrames: number;
70
+ /** Distance reversals (closer<->back) flip-flop easily; damp harder. */
71
+ distanceReversalMinDwellMs: number;
72
+ distanceReversalConfirmFrames: number;
73
+ /** Once a ready state has been shown, corrections may swap faster. */
74
+ postReadyMinDwellMs: number;
75
+ postReadyConfirmFrames: number;
76
+ /** Urgent signals (glare/dark/blur) keep the screen at least this long. */
77
+ urgentMinDisplayMs: number;
78
+ /** Consecutive glare frames required before glare guidance latches. */
79
+ glareConfirmFrames: number;
80
+ }
81
+ export declare const CAPTURE_GUIDANCE_DAMPING_PROFILES: Record<CaptureGuidancePersona, CaptureGuidanceDampingProfile>;
82
+ export type CaptureSignalKind = 'ready' | 'review' | 'fail';
83
+ /**
84
+ * Vibration patterns per signal kind. Invariant (test-locked): ready stays
85
+ * the strongest pattern — it is the one signal that must cut through when the
86
+ * user's eyes are on the document, not the screen.
87
+ */
88
+ export declare const CAPTURE_SIGNAL_VIBRATION_PATTERNS: Record<CaptureSignalKind, number | number[]>;
89
+ /** Cooldown for the ready haptic+chime pair; boundary thrash never spams. */
90
+ export declare const READY_SIGNAL_COOLDOWN_MS = 2500;
91
+ /** How long the stored frame is held on screen as capture confirmation. */
92
+ export declare const CAPTURE_CONFIRMATION_HOLD_MS = 750;
93
+ /** Two-note ready chime (web parity: 660→880 Hz, 100ms apart). */
94
+ export declare const READY_CHIME_NOTES: ReadonlyArray<{
95
+ frequencyHz: number;
96
+ startOffsetMs: number;
97
+ durationMs: number;
98
+ }>;
99
+ export declare const READY_CHIME_GAIN = 0.12;
100
+ /**
101
+ * After the selfie manual-fallback timer expires onto a hard-block reason,
102
+ * the shutter holds through ONE bounded extension of this length, then
103
+ * unlocks permanently. Mirrors web selfie-detection semantics.
104
+ */
105
+ export declare const SELFIE_MANUAL_FALLBACK_HARD_BLOCK_EXTENSION_MS = 8000;
106
+ //# sourceMappingURL=capture-guidance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture-guidance.d.ts","sourceRoot":"","sources":["../../src/capture-guidance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,398 @@
1
+ "use strict";
2
+ /**
3
+ * Capture guidance — the shared semantic layer tying a guidance reason code
4
+ * to its traffic-light state, directional action, and presented copy.
5
+ *
6
+ * This is the cross-client home of the vocabulary first shipped in the web
7
+ * SDK's `capture-guidance-signal.ts`. The web SDK's local table must stay
8
+ * byte-identical to the `'self'` persona here (pinned by a parity test in
9
+ * `sdks/web-ui-sdk`); React Native clients (agent-kyc-app) consume this
10
+ * module directly with the `'agent'` persona.
11
+ *
12
+ * Persona rule: `'self'` is the end customer holding their own phone
13
+ * (kyc-mobile). `'agent'` is a trained field operator capturing on behalf of
14
+ * a customer — same semantics, third-person copy, faster damping.
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.SELFIE_MANUAL_FALLBACK_HARD_BLOCK_EXTENSION_MS = exports.READY_CHIME_GAIN = exports.READY_CHIME_NOTES = exports.CAPTURE_CONFIRMATION_HOLD_MS = exports.READY_SIGNAL_COOLDOWN_MS = exports.CAPTURE_SIGNAL_VIBRATION_PATTERNS = exports.CAPTURE_GUIDANCE_DAMPING_PROFILES = exports.DOCUMENT_PLACEMENT_GUIDANCE_REASON = exports.CAPTURE_GUIDANCE_SIGNAL_TABLE = exports.WRONG_SIDE_TURN_OVER_FEEDBACK = exports.AUTO_CAPTURE_BURST_ABORT_FEEDBACK = exports.INITIAL_DOCUMENT_FEEDBACK = exports.TAKING_PHOTO_META = exports.GOOD_HOLD_STILL_FEEDBACK = exports.MANUAL_CAPTURE_READY_FEEDBACK = void 0;
18
+ exports.getDocumentSubjectLabel = getDocumentSubjectLabel;
19
+ exports.getTiltAwayFromLightGuidance = getTiltAwayFromLightGuidance;
20
+ exports.getMoveToMiddleFeedback = getMoveToMiddleFeedback;
21
+ exports.resolveCaptureGuidanceSignal = resolveCaptureGuidanceSignal;
22
+ exports.mapSelfieIssueToGuidanceReason = mapSelfieIssueToGuidanceReason;
23
+ /* -- Canonical copy constants (self persona = web kyc-mobile verbatim) ----- */
24
+ exports.MANUAL_CAPTURE_READY_FEEDBACK = 'Tap button to take photo';
25
+ exports.GOOD_HOLD_STILL_FEEDBACK = 'Good. Hold still';
26
+ // Shown while an armed capture decision is pending and during the burst.
27
+ // Deliberately NOT "Taking photo now": the armed capture can still abort, and
28
+ // announcing a photo that may never exist proved trust-destroying in
29
+ // production replays. The stored photo is confirmed by the freeze-flash at
30
+ // actual capture time instead.
31
+ exports.TAKING_PHOTO_META = 'Hold still…';
32
+ exports.INITIAL_DOCUMENT_FEEDBACK = 'Put your document inside the box';
33
+ exports.AUTO_CAPTURE_BURST_ABORT_FEEDBACK = 'No clear photo yet. Hold still.';
34
+ // Wrong-side negative evidence (I05): a confirmed MRZ band on a card FRONT
35
+ // step can only be the back of the card. Persona-neutral by design — the
36
+ // instruction is about the card, not the holder.
37
+ exports.WRONG_SIDE_TURN_OVER_FEEDBACK = 'This looks like the back of the card. Turn it over.';
38
+ function getDocumentSubjectLabel(overlayVariant) {
39
+ if (overlayVariant === 'passport')
40
+ return 'passport photo page';
41
+ return 'document';
42
+ }
43
+ function getTiltAwayFromLightGuidance(overlayVariant) {
44
+ return `Tilt ${getDocumentSubjectLabel(overlayVariant)} away from light`;
45
+ }
46
+ function getMoveToMiddleFeedback(overlayVariant) {
47
+ if (overlayVariant === 'passport')
48
+ return 'Move passport photo page to the middle';
49
+ return 'Move document to the middle';
50
+ }
51
+ const selfOnly = (text) => (_overlayVariant, _persona = 'self') => text;
52
+ const byPersona = (self, agent) => (_overlayVariant, persona = 'self') => persona === 'agent' ? agent : self;
53
+ exports.CAPTURE_GUIDANCE_SIGNAL_TABLE = {
54
+ searching: {
55
+ reasonCode: 'searching',
56
+ state: 'looking',
57
+ action: 'none',
58
+ text: byPersona(exports.INITIAL_DOCUMENT_FEEDBACK, 'Put the document inside the box'),
59
+ },
60
+ camera_preparing: {
61
+ reasonCode: 'camera_preparing',
62
+ state: 'adjust',
63
+ action: 'none',
64
+ text: selfOnly('Preparing camera...'),
65
+ },
66
+ hold_still: {
67
+ reasonCode: 'hold_still',
68
+ state: 'adjust',
69
+ action: 'none',
70
+ text: selfOnly(exports.GOOD_HOLD_STILL_FEEDBACK),
71
+ },
72
+ almost_ready: {
73
+ reasonCode: 'almost_ready',
74
+ state: 'adjust',
75
+ action: 'none',
76
+ text: selfOnly(exports.GOOD_HOLD_STILL_FEEDBACK),
77
+ },
78
+ document_found: {
79
+ reasonCode: 'document_found',
80
+ state: 'adjust',
81
+ action: 'none',
82
+ text: selfOnly(exports.GOOD_HOLD_STILL_FEEDBACK),
83
+ },
84
+ auto_safe: {
85
+ reasonCode: 'auto_safe',
86
+ state: 'adjust',
87
+ action: 'none',
88
+ text: selfOnly(exports.GOOD_HOLD_STILL_FEEDBACK),
89
+ },
90
+ review_safe: {
91
+ reasonCode: 'review_safe',
92
+ state: 'adjust',
93
+ action: 'none',
94
+ text: selfOnly(exports.GOOD_HOLD_STILL_FEEDBACK),
95
+ },
96
+ manual_ready: {
97
+ reasonCode: 'manual_ready',
98
+ state: 'ready',
99
+ action: 'none',
100
+ text: selfOnly(exports.MANUAL_CAPTURE_READY_FEEDBACK),
101
+ },
102
+ taking_photo: {
103
+ reasonCode: 'taking_photo',
104
+ state: 'ready',
105
+ action: 'none',
106
+ text: selfOnly(exports.TAKING_PHOTO_META),
107
+ },
108
+ too_small: {
109
+ reasonCode: 'too_small',
110
+ state: 'adjust',
111
+ action: 'closer',
112
+ text: selfOnly('Bring phone closer'),
113
+ },
114
+ too_large_or_cutoff: {
115
+ reasonCode: 'too_large_or_cutoff',
116
+ state: 'adjust',
117
+ action: 'back',
118
+ text: selfOnly('Move phone back. Show all 4 corners'),
119
+ },
120
+ off_center: {
121
+ reasonCode: 'off_center',
122
+ state: 'adjust',
123
+ action: 'center',
124
+ text: overlayVariant => getMoveToMiddleFeedback(overlayVariant),
125
+ },
126
+ nudge_left: {
127
+ reasonCode: 'nudge_left',
128
+ state: 'adjust',
129
+ action: 'left',
130
+ text: selfOnly('Move left'),
131
+ },
132
+ nudge_right: {
133
+ reasonCode: 'nudge_right',
134
+ state: 'adjust',
135
+ action: 'right',
136
+ text: selfOnly('Move right'),
137
+ },
138
+ nudge_up: {
139
+ reasonCode: 'nudge_up',
140
+ state: 'adjust',
141
+ action: 'up',
142
+ text: selfOnly('Move up'),
143
+ },
144
+ nudge_down: {
145
+ reasonCode: 'nudge_down',
146
+ state: 'adjust',
147
+ action: 'down',
148
+ text: selfOnly('Move down'),
149
+ },
150
+ too_dark: {
151
+ reasonCode: 'too_dark',
152
+ state: 'adjust',
153
+ action: 'none',
154
+ text: selfOnly('Find better light'),
155
+ },
156
+ glare: {
157
+ reasonCode: 'glare',
158
+ state: 'adjust',
159
+ action: 'none',
160
+ text: overlayVariant => getTiltAwayFromLightGuidance(overlayVariant),
161
+ },
162
+ blurry: {
163
+ reasonCode: 'blurry',
164
+ state: 'adjust',
165
+ action: 'none',
166
+ text: selfOnly('Hold still. Photo is blurry'),
167
+ },
168
+ flatten_document: {
169
+ reasonCode: 'flatten_document',
170
+ state: 'adjust',
171
+ action: 'none',
172
+ text: selfOnly('Tilt to flatten the document'),
173
+ },
174
+ // No directional glyph exists for "flip the card" — condition-style 'none'
175
+ // is deliberate so the urgent copy carries the whole instruction.
176
+ wrong_side: {
177
+ reasonCode: 'wrong_side',
178
+ state: 'adjust',
179
+ action: 'none',
180
+ text: selfOnly(exports.WRONG_SIDE_TURN_OVER_FEEDBACK),
181
+ },
182
+ mrz_band_closer: {
183
+ reasonCode: 'mrz_band_closer',
184
+ state: 'adjust',
185
+ action: 'closer',
186
+ text: selfOnly('Bring phone closer so the passport code is clear'),
187
+ },
188
+ mrz_band_lines: {
189
+ reasonCode: 'mrz_band_lines',
190
+ state: 'adjust',
191
+ action: 'none',
192
+ text: selfOnly('Show the two passport code lines'),
193
+ },
194
+ readable_text_closer: {
195
+ reasonCode: 'readable_text_closer',
196
+ state: 'adjust',
197
+ action: 'closer',
198
+ text: selfOnly('Bring phone closer so the text is clear'),
199
+ },
200
+ back_text_closer: {
201
+ reasonCode: 'back_text_closer',
202
+ state: 'adjust',
203
+ action: 'closer',
204
+ text: selfOnly('Bring phone closer so the code is clear'),
205
+ },
206
+ passport_code_lines_bottom: {
207
+ reasonCode: 'passport_code_lines_bottom',
208
+ state: 'adjust',
209
+ action: 'none',
210
+ text: selfOnly('Show the two code lines at the bottom'),
211
+ },
212
+ keep_passport_page_in_frame: {
213
+ reasonCode: 'keep_passport_page_in_frame',
214
+ state: 'adjust',
215
+ action: 'none',
216
+ text: selfOnly('Keep the passport photo page in frame'),
217
+ },
218
+ keep_document_in_frame: {
219
+ reasonCode: 'keep_document_in_frame',
220
+ state: 'adjust',
221
+ action: 'none',
222
+ text: selfOnly('Keep the document in frame'),
223
+ },
224
+ show_page_and_code: {
225
+ reasonCode: 'show_page_and_code',
226
+ state: 'adjust',
227
+ action: 'none',
228
+ text: selfOnly('Show the passport photo page and code'),
229
+ },
230
+ burst_abort: {
231
+ reasonCode: 'burst_abort',
232
+ state: 'adjust',
233
+ action: 'none',
234
+ text: selfOnly(exports.AUTO_CAPTURE_BURST_ABORT_FEEDBACK),
235
+ },
236
+ selfie_searching: {
237
+ reasonCode: 'selfie_searching',
238
+ state: 'looking',
239
+ action: 'none',
240
+ text: byPersona('Show your face in the oval', "Put the customer's face in the oval"),
241
+ },
242
+ selfie_multiple_faces: {
243
+ reasonCode: 'selfie_multiple_faces',
244
+ state: 'adjust',
245
+ action: 'none',
246
+ text: byPersona('Only one face in the photo', 'One face only'),
247
+ },
248
+ selfie_too_dark: {
249
+ reasonCode: 'selfie_too_dark',
250
+ state: 'adjust',
251
+ action: 'none',
252
+ text: selfOnly('Find more light'),
253
+ },
254
+ selfie_too_bright: {
255
+ reasonCode: 'selfie_too_bright',
256
+ state: 'adjust',
257
+ action: 'none',
258
+ text: selfOnly('Move away from bright light'),
259
+ },
260
+ selfie_cropped: {
261
+ reasonCode: 'selfie_cropped',
262
+ state: 'adjust',
263
+ action: 'back',
264
+ text: byPersona('Move phone back', 'Keep the full face inside the oval'),
265
+ },
266
+ selfie_too_small: {
267
+ reasonCode: 'selfie_too_small',
268
+ state: 'adjust',
269
+ action: 'closer',
270
+ text: byPersona('Move phone closer', 'Move closer. Fill the oval.'),
271
+ },
272
+ selfie_too_large: {
273
+ reasonCode: 'selfie_too_large',
274
+ state: 'adjust',
275
+ action: 'back',
276
+ text: byPersona('Move phone back', 'Move back a little'),
277
+ },
278
+ selfie_off_center: {
279
+ reasonCode: 'selfie_off_center',
280
+ state: 'adjust',
281
+ action: 'center',
282
+ text: byPersona('Center your face', 'Center the face in the oval'),
283
+ },
284
+ selfie_blurry: {
285
+ reasonCode: 'selfie_blurry',
286
+ state: 'adjust',
287
+ action: 'none',
288
+ text: selfOnly('Hold steady — too blurry'),
289
+ },
290
+ selfie_hold_still: {
291
+ reasonCode: 'selfie_hold_still',
292
+ state: 'adjust',
293
+ action: 'none',
294
+ text: selfOnly('Hold still…'),
295
+ },
296
+ selfie_ready: {
297
+ reasonCode: 'selfie_ready',
298
+ state: 'ready',
299
+ action: 'none',
300
+ text: byPersona('Ready — tap to take selfie', 'Ready — tap to capture'),
301
+ },
302
+ };
303
+ /* -- Resolution ------------------------------------------------------------ */
304
+ function resolveCaptureGuidanceSignal(reasonCode, isReady, overlayVariant = 'card', persona = 'self') {
305
+ const entry = exports.CAPTURE_GUIDANCE_SIGNAL_TABLE[reasonCode];
306
+ return {
307
+ text: entry.text(overlayVariant, persona),
308
+ state: isReady ? 'ready' : entry.state,
309
+ action: entry.action,
310
+ reasonCode: entry.reasonCode,
311
+ };
312
+ }
313
+ /* -- Producer-side reason mapping ------------------------------------------ */
314
+ /**
315
+ * Map a document placement failure to its guidance reason code. `ok` maps to
316
+ * the hold-still family because a passing placement frame is, by definition,
317
+ * waiting on stability/sharpness rather than a correction.
318
+ */
319
+ exports.DOCUMENT_PLACEMENT_GUIDANCE_REASON = {
320
+ too_small: 'too_small',
321
+ too_large: 'too_large_or_cutoff',
322
+ off_center: 'off_center',
323
+ edge_tight: 'too_large_or_cutoff',
324
+ ok: 'hold_still',
325
+ };
326
+ /**
327
+ * Map live/static selfie assessment issue keys to guidance reason codes.
328
+ * Tolerant of both dialects in use today (web selfie-detection assessment
329
+ * reasons and the RN MLKit face-detection issue keys).
330
+ */
331
+ const SELFIE_ISSUE_GUIDANCE_REASON = {
332
+ no_face: 'selfie_searching',
333
+ multiple_faces: 'selfie_multiple_faces',
334
+ face_too_dark: 'selfie_too_dark',
335
+ face_too_bright: 'selfie_too_bright',
336
+ face_cropped: 'selfie_cropped',
337
+ face_cut_off: 'selfie_cropped',
338
+ face_too_small: 'selfie_too_small',
339
+ face_too_large: 'selfie_too_large',
340
+ face_off_center: 'selfie_off_center',
341
+ face_blurry: 'selfie_blurry',
342
+ face_ready: 'selfie_hold_still',
343
+ };
344
+ function mapSelfieIssueToGuidanceReason(issueKey) {
345
+ return SELFIE_ISSUE_GUIDANCE_REASON[issueKey] ?? null;
346
+ }
347
+ exports.CAPTURE_GUIDANCE_DAMPING_PROFILES = {
348
+ // Web kyc-mobile values, verbatim (auto-capture.ts dwell tiers).
349
+ self: {
350
+ correctiveMinDwellMs: 3000,
351
+ correctiveConfirmFrames: 6,
352
+ distanceReversalMinDwellMs: 4500,
353
+ distanceReversalConfirmFrames: 10,
354
+ postReadyMinDwellMs: 1500,
355
+ postReadyConfirmFrames: 3,
356
+ urgentMinDisplayMs: 1500,
357
+ glareConfirmFrames: 3,
358
+ },
359
+ // Trained repeat operators tolerate faster swaps; cadence is also ~10x
360
+ // slower (snapshot loop), so frame counts shrink with it.
361
+ agent: {
362
+ correctiveMinDwellMs: 1500,
363
+ correctiveConfirmFrames: 2,
364
+ distanceReversalMinDwellMs: 2500,
365
+ distanceReversalConfirmFrames: 3,
366
+ postReadyMinDwellMs: 750,
367
+ postReadyConfirmFrames: 1,
368
+ urgentMinDisplayMs: 1000,
369
+ glareConfirmFrames: 2,
370
+ },
371
+ };
372
+ /**
373
+ * Vibration patterns per signal kind. Invariant (test-locked): ready stays
374
+ * the strongest pattern — it is the one signal that must cut through when the
375
+ * user's eyes are on the document, not the screen.
376
+ */
377
+ exports.CAPTURE_SIGNAL_VIBRATION_PATTERNS = {
378
+ ready: [40, 60, 90],
379
+ review: 50,
380
+ fail: [30, 50, 30],
381
+ };
382
+ /** Cooldown for the ready haptic+chime pair; boundary thrash never spams. */
383
+ exports.READY_SIGNAL_COOLDOWN_MS = 2500;
384
+ /** How long the stored frame is held on screen as capture confirmation. */
385
+ exports.CAPTURE_CONFIRMATION_HOLD_MS = 750;
386
+ /** Two-note ready chime (web parity: 660→880 Hz, 100ms apart). */
387
+ exports.READY_CHIME_NOTES = [
388
+ { frequencyHz: 660, startOffsetMs: 0, durationMs: 120 },
389
+ { frequencyHz: 880, startOffsetMs: 100, durationMs: 160 },
390
+ ];
391
+ exports.READY_CHIME_GAIN = 0.12;
392
+ /**
393
+ * After the selfie manual-fallback timer expires onto a hard-block reason,
394
+ * the shutter holds through ONE bounded extension of this length, then
395
+ * unlocks permanently. Mirrors web selfie-detection semantics.
396
+ */
397
+ exports.SELFIE_MANUAL_FALLBACK_HARD_BLOCK_EXTENSION_MS = 8000;
398
+ //# sourceMappingURL=capture-guidance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture-guidance.js","sourceRoot":"","sources":["../../src/capture-guidance.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;;AAyFH,0DAGC;AAED,oEAEC;AAED,0DAGC;AA6RD,oEAaC;AAuCD,wEAIC;AAlXD,gFAAgF;AAEnE,QAAA,6BAA6B,GAAG,0BAA0B,CAAC;AAC3D,QAAA,wBAAwB,GAAG,kBAAkB,CAAC;AAC3D,yEAAyE;AACzE,8EAA8E;AAC9E,qEAAqE;AACrE,2EAA2E;AAC3E,+BAA+B;AAClB,QAAA,iBAAiB,GAAG,aAAa,CAAC;AAClC,QAAA,yBAAyB,GAAG,kCAAkC,CAAC;AAC/D,QAAA,iCAAiC,GAAG,iCAAiC,CAAC;AACnF,2EAA2E;AAC3E,yEAAyE;AACzE,iDAAiD;AACpC,QAAA,6BAA6B,GAAG,qDAAqD,CAAC;AAEnG,SAAgB,uBAAuB,CAAC,cAA8B;IACpE,IAAI,cAAc,KAAK,UAAU;QAAE,OAAO,qBAAqB,CAAC;IAChE,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAgB,4BAA4B,CAAC,cAA8B;IACzE,OAAO,QAAQ,uBAAuB,CAAC,cAAc,CAAC,kBAAkB,CAAC;AAC3E,CAAC;AAED,SAAgB,uBAAuB,CAAC,cAA8B;IACpE,IAAI,cAAc,KAAK,UAAU;QAAE,OAAO,wCAAwC,CAAC;IACnF,OAAO,6BAA6B,CAAC;AACvC,CAAC;AAmBD,MAAM,QAAQ,GACZ,CAAC,IAAY,EAAE,EAAE,CACjB,CAAC,eAA+B,EAAE,WAAmC,MAAM,EAAE,EAAE,CAC7E,IAAI,CAAC;AAET,MAAM,SAAS,GACb,CAAC,IAAY,EAAE,KAAa,EAAE,EAAE,CAChC,CAAC,eAA+B,EAAE,UAAkC,MAAM,EAAE,EAAE,CAC5E,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAE1B,QAAA,6BAA6B,GAGtC;IACF,SAAS,EAAE;QACT,UAAU,EAAE,WAAW;QACvB,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,SAAS,CAAC,iCAAyB,EAAE,iCAAiC,CAAC;KAC9E;IACD,gBAAgB,EAAE;QAChB,UAAU,EAAE,kBAAkB;QAC9B,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,QAAQ,CAAC,qBAAqB,CAAC;KACtC;IACD,UAAU,EAAE;QACV,UAAU,EAAE,YAAY;QACxB,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,QAAQ,CAAC,gCAAwB,CAAC;KACzC;IACD,YAAY,EAAE;QACZ,UAAU,EAAE,cAAc;QAC1B,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,QAAQ,CAAC,gCAAwB,CAAC;KACzC;IACD,cAAc,EAAE;QACd,UAAU,EAAE,gBAAgB;QAC5B,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,QAAQ,CAAC,gCAAwB,CAAC;KACzC;IACD,SAAS,EAAE;QACT,UAAU,EAAE,WAAW;QACvB,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,QAAQ,CAAC,gCAAwB,CAAC;KACzC;IACD,WAAW,EAAE;QACX,UAAU,EAAE,aAAa;QACzB,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,QAAQ,CAAC,gCAAwB,CAAC;KACzC;IACD,YAAY,EAAE;QACZ,UAAU,EAAE,cAAc;QAC1B,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,QAAQ,CAAC,qCAA6B,CAAC;KAC9C;IACD,YAAY,EAAE;QACZ,UAAU,EAAE,cAAc;QAC1B,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,QAAQ,CAAC,yBAAiB,CAAC;KAClC;IACD,SAAS,EAAE;QACT,UAAU,EAAE,WAAW;QACvB,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,QAAQ,CAAC,oBAAoB,CAAC;KACrC;IACD,mBAAmB,EAAE;QACnB,UAAU,EAAE,qBAAqB;QACjC,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,QAAQ,CAAC,qCAAqC,CAAC;KACtD;IACD,UAAU,EAAE;QACV,UAAU,EAAE,YAAY;QACxB,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,cAAc,CAAC,EAAE,CAAC,uBAAuB,CAAC,cAAc,CAAC;KAChE;IACD,UAAU,EAAE;QACV,UAAU,EAAE,YAAY;QACxB,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,QAAQ,CAAC,WAAW,CAAC;KAC5B;IACD,WAAW,EAAE;QACX,UAAU,EAAE,aAAa;QACzB,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC;KAC7B;IACD,QAAQ,EAAE;QACR,UAAU,EAAE,UAAU;QACtB,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,IAAI;QACZ,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC;KAC1B;IACD,UAAU,EAAE;QACV,UAAU,EAAE,YAAY;QACxB,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,QAAQ,CAAC,WAAW,CAAC;KAC5B;IACD,QAAQ,EAAE;QACR,UAAU,EAAE,UAAU;QACtB,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,QAAQ,CAAC,mBAAmB,CAAC;KACpC;IACD,KAAK,EAAE;QACL,UAAU,EAAE,OAAO;QACnB,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,cAAc,CAAC,EAAE,CAAC,4BAA4B,CAAC,cAAc,CAAC;KACrE;IACD,MAAM,EAAE;QACN,UAAU,EAAE,QAAQ;QACpB,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,QAAQ,CAAC,6BAA6B,CAAC;KAC9C;IACD,gBAAgB,EAAE;QAChB,UAAU,EAAE,kBAAkB;QAC9B,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,QAAQ,CAAC,8BAA8B,CAAC;KAC/C;IACD,2EAA2E;IAC3E,kEAAkE;IAClE,UAAU,EAAE;QACV,UAAU,EAAE,YAAY;QACxB,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,QAAQ,CAAC,qCAA6B,CAAC;KAC9C;IACD,eAAe,EAAE;QACf,UAAU,EAAE,iBAAiB;QAC7B,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,QAAQ,CAAC,kDAAkD,CAAC;KACnE;IACD,cAAc,EAAE;QACd,UAAU,EAAE,gBAAgB;QAC5B,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,QAAQ,CAAC,kCAAkC,CAAC;KACnD;IACD,oBAAoB,EAAE;QACpB,UAAU,EAAE,sBAAsB;QAClC,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,QAAQ,CAAC,yCAAyC,CAAC;KAC1D;IACD,gBAAgB,EAAE;QAChB,UAAU,EAAE,kBAAkB;QAC9B,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,QAAQ,CAAC,yCAAyC,CAAC;KAC1D;IACD,0BAA0B,EAAE;QAC1B,UAAU,EAAE,4BAA4B;QACxC,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,QAAQ,CAAC,uCAAuC,CAAC;KACxD;IACD,2BAA2B,EAAE;QAC3B,UAAU,EAAE,6BAA6B;QACzC,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,QAAQ,CAAC,uCAAuC,CAAC;KACxD;IACD,sBAAsB,EAAE;QACtB,UAAU,EAAE,wBAAwB;QACpC,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,QAAQ,CAAC,4BAA4B,CAAC;KAC7C;IACD,kBAAkB,EAAE;QAClB,UAAU,EAAE,oBAAoB;QAChC,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,QAAQ,CAAC,uCAAuC,CAAC;KACxD;IACD,WAAW,EAAE;QACX,UAAU,EAAE,aAAa;QACzB,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,QAAQ,CAAC,yCAAiC,CAAC;KAClD;IACD,gBAAgB,EAAE;QAChB,UAAU,EAAE,kBAAkB;QAC9B,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,SAAS,CAAC,4BAA4B,EAAE,qCAAqC,CAAC;KACrF;IACD,qBAAqB,EAAE;QACrB,UAAU,EAAE,uBAAuB;QACnC,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,SAAS,CAAC,4BAA4B,EAAE,eAAe,CAAC;KAC/D;IACD,eAAe,EAAE;QACf,UAAU,EAAE,iBAAiB;QAC7B,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,QAAQ,CAAC,iBAAiB,CAAC;KAClC;IACD,iBAAiB,EAAE;QACjB,UAAU,EAAE,mBAAmB;QAC/B,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,QAAQ,CAAC,6BAA6B,CAAC;KAC9C;IACD,cAAc,EAAE;QACd,UAAU,EAAE,gBAAgB;QAC5B,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,SAAS,CAAC,iBAAiB,EAAE,oCAAoC,CAAC;KACzE;IACD,gBAAgB,EAAE;QAChB,UAAU,EAAE,kBAAkB;QAC9B,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,SAAS,CAAC,mBAAmB,EAAE,6BAA6B,CAAC;KACpE;IACD,gBAAgB,EAAE;QAChB,UAAU,EAAE,kBAAkB;QAC9B,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,SAAS,CAAC,iBAAiB,EAAE,oBAAoB,CAAC;KACzD;IACD,iBAAiB,EAAE;QACjB,UAAU,EAAE,mBAAmB;QAC/B,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,SAAS,CAAC,kBAAkB,EAAE,6BAA6B,CAAC;KACnE;IACD,aAAa,EAAE;QACb,UAAU,EAAE,eAAe;QAC3B,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,QAAQ,CAAC,0BAA0B,CAAC;KAC3C;IACD,iBAAiB,EAAE;QACjB,UAAU,EAAE,mBAAmB;QAC/B,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,QAAQ,CAAC,aAAa,CAAC;KAC9B;IACD,YAAY,EAAE;QACZ,UAAU,EAAE,cAAc;QAC1B,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,SAAS,CAAC,4BAA4B,EAAE,wBAAwB,CAAC;KACxE;CACF,CAAC;AAEF,gFAAgF;AAEhF,SAAgB,4BAA4B,CAC1C,UAA6C,EAC7C,OAAgB,EAChB,iBAAiC,MAAM,EACvC,UAAkC,MAAM;IAExC,MAAM,KAAK,GAAG,qCAA6B,CAAC,UAAU,CAAC,CAAC;IACxD,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC;QACzC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK;QACtC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAC;AACJ,CAAC;AAED,gFAAgF;AAEhF;;;;GAIG;AACU,QAAA,kCAAkC,GAG3C;IACF,SAAS,EAAE,WAAW;IACtB,SAAS,EAAE,qBAAqB;IAChC,UAAU,EAAE,YAAY;IACxB,UAAU,EAAE,qBAAqB;IACjC,EAAE,EAAE,YAAY;CACjB,CAAC;AAEF;;;;GAIG;AACH,MAAM,4BAA4B,GAAsD;IACtF,OAAO,EAAE,kBAAkB;IAC3B,cAAc,EAAE,uBAAuB;IACvC,aAAa,EAAE,iBAAiB;IAChC,eAAe,EAAE,mBAAmB;IACpC,YAAY,EAAE,gBAAgB;IAC9B,YAAY,EAAE,gBAAgB;IAC9B,cAAc,EAAE,kBAAkB;IAClC,cAAc,EAAE,kBAAkB;IAClC,eAAe,EAAE,mBAAmB;IACpC,WAAW,EAAE,eAAe;IAC5B,UAAU,EAAE,mBAAmB;CAChC,CAAC;AAEF,SAAgB,8BAA8B,CAC5C,QAAgB;IAEhB,OAAO,4BAA4B,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;AACxD,CAAC;AA4BY,QAAA,iCAAiC,GAG1C;IACF,iEAAiE;IACjE,IAAI,EAAE;QACJ,oBAAoB,EAAE,IAAI;QAC1B,uBAAuB,EAAE,CAAC;QAC1B,0BAA0B,EAAE,IAAI;QAChC,6BAA6B,EAAE,EAAE;QACjC,mBAAmB,EAAE,IAAI;QACzB,sBAAsB,EAAE,CAAC;QACzB,kBAAkB,EAAE,IAAI;QACxB,kBAAkB,EAAE,CAAC;KACtB;IACD,uEAAuE;IACvE,0DAA0D;IAC1D,KAAK,EAAE;QACL,oBAAoB,EAAE,IAAI;QAC1B,uBAAuB,EAAE,CAAC;QAC1B,0BAA0B,EAAE,IAAI;QAChC,6BAA6B,EAAE,CAAC;QAChC,mBAAmB,EAAE,GAAG;QACxB,sBAAsB,EAAE,CAAC;QACzB,kBAAkB,EAAE,IAAI;QACxB,kBAAkB,EAAE,CAAC;KACtB;CACF,CAAC;AAMF;;;;GAIG;AACU,QAAA,iCAAiC,GAAiD;IAC7F,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IACnB,MAAM,EAAE,EAAE;IACV,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;CACnB,CAAC;AAEF,6EAA6E;AAChE,QAAA,wBAAwB,GAAG,IAAI,CAAC;AAE7C,2EAA2E;AAC9D,QAAA,4BAA4B,GAAG,GAAG,CAAC;AAEhD,kEAAkE;AACrD,QAAA,iBAAiB,GAIzB;IACH,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE;IACvD,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE;CAC1D,CAAC;AAEW,QAAA,gBAAgB,GAAG,IAAI,CAAC;AAErC;;;;GAIG;AACU,QAAA,8CAA8C,GAAG,IAAI,CAAC"}
@@ -8,7 +8,7 @@
8
8
  * objects, numeric values). Zero browser dependencies.
9
9
  */
10
10
  export type { CamStateValue, FrameMetrics, CaptureAreaRange, CaptureGeometryProfile, DocumentReviewProfile, DocumentLikelihoodResult, CropRect, DocumentCropResult, OverlayRegion, OverlayVariant, QualityCheckResults, FaceBoundingBox, DetectedFace, MetadataReviewIssue, MetadataReviewResult, ReviewOrientation, ReviewMode, QualityBucket, ReviewDecisionOptions, } from './types.js';
11
- export { CamState, CAM_ANALYSIS_W, CAM_ANALYSIS_H, CAM_BRIGHTNESS_MIN, CAM_BRIGHTNESS_MAX, CAM_BLUR_THRESHOLD, CAM_EDGE_THRESHOLD, CAM_STABLE_FRAMES_NEEDED, CAM_FRAME_DIFF_THRESHOLD, CAM_EDGE_PIXEL_THRESHOLD, CAM_EDGE_COVERAGE_THRESHOLD, CAM_DOC_CENTER_OFFSET_MAX, CAPTURE_DOCUMENT_SHARPNESS_MIN, CAPTURE_DOCUMENT_MANUAL_FALLBACK_SECS, CAPTURE_DOCUMENT_AREA_MIN, CAPTURE_DOCUMENT_EDGE_READY_MULTIPLIER, DOC_GALLERY_FAILURE_THRESHOLD, DOC_SUBMIT_ANYWAY_FAILURE_THRESHOLD, SELFIE_SUBMIT_ANYWAY_FAILURE_THRESHOLD, ADDRESS_SUBMIT_ANYWAY_FAILURE_THRESHOLD, PICO_ANALYSIS_W, PICO_ANALYSIS_H, } from './types.js';
11
+ export { CamState, CAM_ANALYSIS_W, CAM_ANALYSIS_H, CAM_BRIGHTNESS_MIN, SCENE_DARK_SURROUND_LUMA_MAX, SCENE_DARK_REGION_DYNAMIC_RANGE_MAX, CAM_BRIGHTNESS_MAX, CAM_BLUR_THRESHOLD, CAM_EDGE_THRESHOLD, CAM_STABLE_FRAMES_NEEDED, CAM_FRAME_DIFF_THRESHOLD, CAM_EDGE_PIXEL_THRESHOLD, CAM_EDGE_COVERAGE_THRESHOLD, CAM_DOC_CENTER_OFFSET_MAX, CAPTURE_DOCUMENT_SHARPNESS_MIN, CAPTURE_DOCUMENT_MANUAL_FALLBACK_SECS, CAPTURE_DOCUMENT_AREA_MIN, CAPTURE_DOCUMENT_EDGE_READY_MULTIPLIER, DOC_GALLERY_FAILURE_THRESHOLD, DOC_SUBMIT_ANYWAY_FAILURE_THRESHOLD, SELFIE_SUBMIT_ANYWAY_FAILURE_THRESHOLD, ADDRESS_SUBMIT_ANYWAY_FAILURE_THRESHOLD, PICO_ANALYSIS_W, PICO_ANALYSIS_H, } from './types.js';
12
12
  export type { AddressMethod, AddressProofMode, AddressCoordinatesLike, AddressStepState, AddressMethodStartBehavior, } from './address-proof.js';
13
13
  export { ADDRESS_METHOD_ORDER, isAddressMethod, sanitizeAllowedAddressMethods, getRecommendedAddressMethod, getAddressMethodStartBehavior, getEffectiveAddressMethod, hasAddressProofCoordinates, hasStructuredAddress, isAddressStepComplete, } from './address-proof.js';
14
14
  export type { KycMobileContractIssue, KycMobileContractIssueCode, KycMobileWorkflowConfigContract, } from './kyc-mobile-contract.js';
@@ -26,14 +26,19 @@ export type { CapturePlacementShape, DocumentPlacementInput, DocumentPlacementDe
26
26
  export { CAPTURE_READY_AREA_MIN_BY_SHAPE, RELAXED_CAPTURE_READY_AREA_MIN_BY_SHAPE, CAPTURE_READY_AREA_MAX_BY_SHAPE, CAPTURE_READY_CENTER_MAX_BY_SHAPE, CAPTURE_READY_SAFE_INSET_MIN, evaluateDocumentPlacement, } from './document-placement.js';
27
27
  export type { EdgeEnergyProfile } from './sobel.js';
28
28
  export { rgbaToGreyscale, rgbaToGreyscalePico, computeEdgeEnergyProfile, detectDocumentCropFromGrey, } from './sobel.js';
29
- export type { EdgeAnalysisResult } from './metrics.js';
30
- export { rgbaToGreyInPlace, computeBrightness, computeLaplacianVariance, computeLaplacianVarianceFloat, computeEdgeEnergy, detectDocumentRect, computeFrameDiff, analyzeFrame, looksLikeDocument, } from './metrics.js';
29
+ export type { EdgeAnalysisResult, SceneLightProfile } from './metrics.js';
30
+ export { rgbaToGreyInPlace, computeBrightness, computeSceneLightProfile, isSceneDark, computeLaplacianVariance, computeLaplacianVarianceFloat, computeEdgeEnergy, detectDocumentRect, computeFrameDiff, analyzeFrame, looksLikeDocument, } from './metrics.js';
31
31
  export type { MrzBandDetectionInput, MrzBandDetectionResult, MrzBandBoundingBox, } from './mrz-band-detector.js';
32
32
  export { detectPassportMrzBand, MRZ_HORIZONTAL_GRADIENT_THRESHOLD, MRZ_ROW_DENSITY_RATIO_THRESHOLD, MRZ_MIN_BAND_HEIGHT, MRZ_MAX_BAND_HEIGHT, MRZ_MIN_BAND_WIDTH_FRAC, MRZ_MIN_BAND_ASPECT, MRZ_MAX_BAND_ASPECT, MRZ_SEARCH_TOP_FRAC, MRZ_DENSITY_SCORE_SATURATION, } from './mrz-band-detector.js';
33
33
  export type { MrzDocumentFormat, MrzCheckDigitField, MrzCheckDigitResult, MrzValidationResult, MrzAutocorrection, MrzParsedFields, MrzParserDetail, MrzParseOptions, MrzParseResult, } from './mrz-check-digits.js';
34
34
  export { getMrzCharacterValue, computeMrzCheckDigit, normalizeMrzLines, parseMrzText, validateMrzCheckDigits, } from './mrz-check-digits.js';
35
+ export type { MrzFormat, MrzRejectionReason, MrzFields, MrzCheckDigits, MrzParseAccepted, MrzParseRejected, MrzParseResult as Icao9303MrzParseResult, } from './mrz-parser.js';
36
+ export { MRZ_TD3_LINE_LENGTH, MRZ_TD1_LINE_LENGTH, parseMrzLines } from './mrz-parser.js';
35
37
  export type { DocumentMrzPolicy, DocumentMrzPolicyInput, MrzExpectation, MrzPlacement, } from './mrz-policy.js';
36
38
  export { resolveDocumentMrzPolicy } from './mrz-policy.js';
39
+ export type { CaptureGuidanceState, CaptureGuidanceAction, CaptureGuidancePersona, CaptureGuidanceReasonCode, ResolvedCaptureGuidanceReasonCode, CaptureGuidanceSignalEntry, PresentedCaptureGuidanceSignal, CaptureGuidanceDampingProfile, CaptureSignalKind, } from './capture-guidance.js';
40
+ export { CAPTURE_GUIDANCE_SIGNAL_TABLE, resolveCaptureGuidanceSignal, DOCUMENT_PLACEMENT_GUIDANCE_REASON, mapSelfieIssueToGuidanceReason, CAPTURE_GUIDANCE_DAMPING_PROFILES, CAPTURE_SIGNAL_VIBRATION_PATTERNS, READY_SIGNAL_COOLDOWN_MS, CAPTURE_CONFIRMATION_HOLD_MS, READY_CHIME_NOTES, READY_CHIME_GAIN, SELFIE_MANUAL_FALLBACK_HARD_BLOCK_EXTENSION_MS, MANUAL_CAPTURE_READY_FEEDBACK, GOOD_HOLD_STILL_FEEDBACK, TAKING_PHOTO_META, INITIAL_DOCUMENT_FEEDBACK, AUTO_CAPTURE_BURST_ABORT_FEEDBACK, WRONG_SIDE_TURN_OVER_FEEDBACK, getDocumentSubjectLabel, getTiltAwayFromLightGuidance, getMoveToMiddleFeedback, } from './capture-guidance.js';
41
+ export { CAPTURE_INTELLIGENCE_CORE_VERSION } from './version.js';
37
42
  export type { QualityFailureState, DocumentQualityInput, DocumentQualityResult, SelfieQualityInput, } from './quality-checks.js';
38
43
  export { getQualityBucket, getSubmitAnywayThreshold, createQualityFailureState, countFailedReview, shouldShowSubmitAnyway, hasHardBlockingQualityFailure, isRetryEscapableDocumentCornerFailure, getReviewModeFromDocumentType, runDocumentQualityChecks, runSelfieQualityChecks, checkFaceInImage, isFaceCentered, evaluateDocumentFailure, evaluateSelfieFailure, evaluateReviewFailure, getNextButtonDisabledReason, getOverrideButtonText, getOverrideBannerMessage, } from './quality-checks.js';
39
44
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}