@mikashboks/capture-intelligence-core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/dist/cjs/__fixtures__/address-flow.fixtures.d.ts +35 -0
  2. package/dist/cjs/__fixtures__/address-flow.fixtures.d.ts.map +1 -0
  3. package/dist/cjs/__fixtures__/address-flow.fixtures.js +186 -0
  4. package/dist/cjs/__fixtures__/address-flow.fixtures.js.map +1 -0
  5. package/dist/cjs/__fixtures__/metadata-review.fixtures.d.ts +11 -0
  6. package/dist/cjs/__fixtures__/metadata-review.fixtures.d.ts.map +1 -0
  7. package/dist/cjs/__fixtures__/metadata-review.fixtures.js +69 -0
  8. package/dist/cjs/__fixtures__/metadata-review.fixtures.js.map +1 -0
  9. package/dist/cjs/address-proof.d.ts +33 -0
  10. package/dist/cjs/address-proof.d.ts.map +1 -0
  11. package/dist/cjs/address-proof.js +97 -0
  12. package/dist/cjs/address-proof.js.map +1 -0
  13. package/dist/cjs/document-classifier.d.ts +19 -0
  14. package/dist/cjs/document-classifier.d.ts.map +1 -0
  15. package/dist/cjs/document-classifier.js +213 -0
  16. package/dist/cjs/document-classifier.js.map +1 -0
  17. package/dist/cjs/flow-routing.d.ts +7 -0
  18. package/dist/cjs/flow-routing.d.ts.map +1 -0
  19. package/dist/cjs/flow-routing.js +45 -0
  20. package/dist/cjs/flow-routing.js.map +1 -0
  21. package/dist/cjs/index.d.ts +25 -0
  22. package/dist/cjs/index.d.ts.map +1 -0
  23. package/dist/cjs/index.js +83 -0
  24. package/dist/cjs/index.js.map +1 -0
  25. package/dist/cjs/metadata-review.d.ts +10 -0
  26. package/dist/cjs/metadata-review.d.ts.map +1 -0
  27. package/dist/cjs/metadata-review.js +93 -0
  28. package/dist/cjs/metadata-review.js.map +1 -0
  29. package/dist/cjs/metrics.d.ts +115 -0
  30. package/dist/cjs/metrics.d.ts.map +1 -0
  31. package/dist/cjs/metrics.js +302 -0
  32. package/dist/cjs/metrics.js.map +1 -0
  33. package/dist/cjs/quality-checks.d.ts +170 -0
  34. package/dist/cjs/quality-checks.d.ts.map +1 -0
  35. package/dist/cjs/quality-checks.js +417 -0
  36. package/dist/cjs/quality-checks.js.map +1 -0
  37. package/dist/cjs/sobel.d.ts +61 -0
  38. package/dist/cjs/sobel.d.ts.map +1 -0
  39. package/dist/cjs/sobel.js +179 -0
  40. package/dist/cjs/sobel.js.map +1 -0
  41. package/dist/cjs/types.d.ts +98 -0
  42. package/dist/cjs/types.d.ts.map +1 -0
  43. package/dist/cjs/types.js +38 -0
  44. package/dist/cjs/types.js.map +1 -0
  45. package/dist/esm/__fixtures__/address-flow.fixtures.d.ts +35 -0
  46. package/dist/esm/__fixtures__/address-flow.fixtures.d.ts.map +1 -0
  47. package/dist/esm/__fixtures__/address-flow.fixtures.js +183 -0
  48. package/dist/esm/__fixtures__/address-flow.fixtures.js.map +1 -0
  49. package/dist/esm/__fixtures__/metadata-review.fixtures.d.ts +11 -0
  50. package/dist/esm/__fixtures__/metadata-review.fixtures.d.ts.map +1 -0
  51. package/dist/esm/__fixtures__/metadata-review.fixtures.js +66 -0
  52. package/dist/esm/__fixtures__/metadata-review.fixtures.js.map +1 -0
  53. package/dist/esm/address-proof.d.ts +33 -0
  54. package/dist/esm/address-proof.d.ts.map +1 -0
  55. package/dist/esm/address-proof.js +86 -0
  56. package/dist/esm/address-proof.js.map +1 -0
  57. package/dist/esm/document-classifier.d.ts +19 -0
  58. package/dist/esm/document-classifier.d.ts.map +1 -0
  59. package/dist/esm/document-classifier.js +209 -0
  60. package/dist/esm/document-classifier.js.map +1 -0
  61. package/dist/esm/flow-routing.d.ts +7 -0
  62. package/dist/esm/flow-routing.d.ts.map +1 -0
  63. package/dist/esm/flow-routing.js +41 -0
  64. package/dist/esm/flow-routing.js.map +1 -0
  65. package/dist/esm/index.d.ts +25 -0
  66. package/dist/esm/index.d.ts.map +1 -0
  67. package/dist/esm/index.js +19 -0
  68. package/dist/esm/index.js.map +1 -0
  69. package/dist/esm/metadata-review.d.ts +10 -0
  70. package/dist/esm/metadata-review.d.ts.map +1 -0
  71. package/dist/esm/metadata-review.js +90 -0
  72. package/dist/esm/metadata-review.js.map +1 -0
  73. package/dist/esm/metrics.d.ts +115 -0
  74. package/dist/esm/metrics.d.ts.map +1 -0
  75. package/dist/esm/metrics.js +291 -0
  76. package/dist/esm/metrics.js.map +1 -0
  77. package/dist/esm/quality-checks.d.ts +170 -0
  78. package/dist/esm/quality-checks.d.ts.map +1 -0
  79. package/dist/esm/quality-checks.js +400 -0
  80. package/dist/esm/quality-checks.js.map +1 -0
  81. package/dist/esm/sobel.d.ts +61 -0
  82. package/dist/esm/sobel.d.ts.map +1 -0
  83. package/dist/esm/sobel.js +173 -0
  84. package/dist/esm/sobel.js.map +1 -0
  85. package/dist/esm/types.d.ts +98 -0
  86. package/dist/esm/types.d.ts.map +1 -0
  87. package/dist/esm/types.js +35 -0
  88. package/dist/esm/types.js.map +1 -0
  89. package/package.json +65 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sobel.js","sourceRoot":"","sources":["../../src/sobel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Capture Intelligence Core — shared types, constants, and thresholds.
3
+ *
4
+ * All types are DOM-free. No HTMLElement, HTMLCanvasElement, HTMLVideoElement,
5
+ * HTMLImageElement, or any browser API references.
6
+ */
7
+ export declare const CamState: {
8
+ readonly SEARCHING: 0;
9
+ readonly DETECTED: 1;
10
+ readonly STABILIZING: 2;
11
+ readonly CAPTURING: 3;
12
+ readonly DONE: 4;
13
+ };
14
+ export type CamStateValue = (typeof CamState)[keyof typeof CamState];
15
+ export interface FrameMetrics {
16
+ brightness: number;
17
+ blurScore: number;
18
+ edgeEnergy: number;
19
+ frameDiff: number;
20
+ docAreaRatio: number;
21
+ docAspectRatio: number;
22
+ docCenterOffset: number;
23
+ edgeCoverage: number;
24
+ }
25
+ export interface DocumentReviewProfile {
26
+ aspectTargets: number[];
27
+ threshold: number;
28
+ expectedOrientation?: 'portrait' | 'landscape' | 'square' | 'either';
29
+ }
30
+ export interface DocumentLikelihoodResult {
31
+ isLikelyDoc: boolean;
32
+ confidence: number;
33
+ glareDetected: boolean;
34
+ }
35
+ export interface CropRect {
36
+ x: number;
37
+ y: number;
38
+ w: number;
39
+ h: number;
40
+ }
41
+ export interface DocumentCropResult {
42
+ crop: CropRect | null;
43
+ cornersOk: boolean | null;
44
+ }
45
+ export interface OverlayRegion {
46
+ x1: number;
47
+ y1: number;
48
+ x2: number;
49
+ y2: number;
50
+ }
51
+ export type OverlayVariant = 'card' | 'passport' | 'a4';
52
+ export type QualityCheckResults = Record<string, boolean>;
53
+ export interface FaceBoundingBox {
54
+ x: number;
55
+ y: number;
56
+ width: number;
57
+ height: number;
58
+ }
59
+ export interface DetectedFace {
60
+ boundingBox: FaceBoundingBox;
61
+ }
62
+ export type ReviewOrientation = 'portrait' | 'landscape' | 'square';
63
+ export interface MetadataReviewIssue {
64
+ key: string;
65
+ message: string;
66
+ severity: 'error' | 'warning';
67
+ }
68
+ export interface MetadataReviewResult {
69
+ passed: boolean;
70
+ issues: MetadataReviewIssue[];
71
+ orientation: ReviewOrientation;
72
+ isDocument: boolean;
73
+ }
74
+ export type ReviewMode = 'document' | 'address-document' | 'front-door' | 'selfie';
75
+ export type QualityBucket = 'document_front' | 'document_back' | 'selfie' | 'address_document' | 'address_front_door';
76
+ export interface ReviewDecisionOptions {
77
+ reviewMode: ReviewMode;
78
+ pendingMessage?: string;
79
+ failMessage?: string;
80
+ }
81
+ export declare const CAM_ANALYSIS_W = 160;
82
+ export declare const CAM_ANALYSIS_H = 120;
83
+ export declare const CAM_BRIGHTNESS_MIN = 28;
84
+ export declare const CAM_BRIGHTNESS_MAX = 248;
85
+ export declare const CAM_BLUR_THRESHOLD = 30;
86
+ export declare const CAM_EDGE_THRESHOLD = 7;
87
+ export declare const CAM_STABLE_FRAMES_NEEDED = 5;
88
+ export declare const CAM_FRAME_DIFF_THRESHOLD = 15;
89
+ export declare const CAM_EDGE_PIXEL_THRESHOLD = 60;
90
+ export declare const CAM_EDGE_COVERAGE_THRESHOLD = 0.02;
91
+ export declare const CAM_DOC_CENTER_OFFSET_MAX = 0.25;
92
+ export declare const DOC_GALLERY_FAILURE_THRESHOLD = 1;
93
+ export declare const DOC_SUBMIT_ANYWAY_FAILURE_THRESHOLD = 2;
94
+ export declare const SELFIE_SUBMIT_ANYWAY_FAILURE_THRESHOLD = 2;
95
+ export declare const ADDRESS_SUBMIT_ANYWAY_FAILURE_THRESHOLD = 2;
96
+ export declare const PICO_ANALYSIS_W = 240;
97
+ export declare const PICO_ANALYSIS_H = 180;
98
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ /**
3
+ * Capture Intelligence Core — shared types, constants, and thresholds.
4
+ *
5
+ * All types are DOM-free. No HTMLElement, HTMLCanvasElement, HTMLVideoElement,
6
+ * HTMLImageElement, or any browser API references.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.PICO_ANALYSIS_H = exports.PICO_ANALYSIS_W = exports.ADDRESS_SUBMIT_ANYWAY_FAILURE_THRESHOLD = exports.SELFIE_SUBMIT_ANYWAY_FAILURE_THRESHOLD = exports.DOC_SUBMIT_ANYWAY_FAILURE_THRESHOLD = exports.DOC_GALLERY_FAILURE_THRESHOLD = exports.CAM_DOC_CENTER_OFFSET_MAX = exports.CAM_EDGE_COVERAGE_THRESHOLD = exports.CAM_EDGE_PIXEL_THRESHOLD = exports.CAM_FRAME_DIFF_THRESHOLD = exports.CAM_STABLE_FRAMES_NEEDED = exports.CAM_EDGE_THRESHOLD = exports.CAM_BLUR_THRESHOLD = exports.CAM_BRIGHTNESS_MAX = exports.CAM_BRIGHTNESS_MIN = exports.CAM_ANALYSIS_H = exports.CAM_ANALYSIS_W = exports.CamState = void 0;
10
+ /* -- Auto-capture state machine ------------------------------------------- */
11
+ exports.CamState = {
12
+ SEARCHING: 0,
13
+ DETECTED: 1,
14
+ STABILIZING: 2,
15
+ CAPTURING: 3,
16
+ DONE: 4,
17
+ };
18
+ /* -- Analysis canvas thresholds ------------------------------------------- */
19
+ exports.CAM_ANALYSIS_W = 160;
20
+ exports.CAM_ANALYSIS_H = 120;
21
+ exports.CAM_BRIGHTNESS_MIN = 28;
22
+ exports.CAM_BRIGHTNESS_MAX = 248;
23
+ exports.CAM_BLUR_THRESHOLD = 30;
24
+ exports.CAM_EDGE_THRESHOLD = 7;
25
+ exports.CAM_STABLE_FRAMES_NEEDED = 5; // ~0.33s at 15fps
26
+ exports.CAM_FRAME_DIFF_THRESHOLD = 15;
27
+ exports.CAM_EDGE_PIXEL_THRESHOLD = 60;
28
+ exports.CAM_EDGE_COVERAGE_THRESHOLD = 0.02;
29
+ exports.CAM_DOC_CENTER_OFFSET_MAX = 0.25;
30
+ /* -- Retry escalation thresholds ------------------------------------------ */
31
+ exports.DOC_GALLERY_FAILURE_THRESHOLD = 1;
32
+ exports.DOC_SUBMIT_ANYWAY_FAILURE_THRESHOLD = 2;
33
+ exports.SELFIE_SUBMIT_ANYWAY_FAILURE_THRESHOLD = 2;
34
+ exports.ADDRESS_SUBMIT_ANYWAY_FAILURE_THRESHOLD = 2;
35
+ /* -- Pico.js analysis dimensions ------------------------------------------ */
36
+ exports.PICO_ANALYSIS_W = 240;
37
+ exports.PICO_ANALYSIS_H = 180;
38
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,+EAA+E;AAElE,QAAA,QAAQ,GAAG;IACtB,SAAS,EAAE,CAAC;IACZ,QAAQ,EAAE,CAAC;IACX,WAAW,EAAE,CAAC;IACd,SAAS,EAAE,CAAC;IACZ,IAAI,EAAE,CAAC;CACC,CAAC;AA+GX,+EAA+E;AAElE,QAAA,cAAc,GAAG,GAAG,CAAC;AACrB,QAAA,cAAc,GAAG,GAAG,CAAC;AACrB,QAAA,kBAAkB,GAAG,EAAE,CAAC;AACxB,QAAA,kBAAkB,GAAG,GAAG,CAAC;AACzB,QAAA,kBAAkB,GAAG,EAAE,CAAC;AACxB,QAAA,kBAAkB,GAAG,CAAC,CAAC;AACvB,QAAA,wBAAwB,GAAG,CAAC,CAAC,CAAC,kBAAkB;AAChD,QAAA,wBAAwB,GAAG,EAAE,CAAC;AAC9B,QAAA,wBAAwB,GAAG,EAAE,CAAC;AAC9B,QAAA,2BAA2B,GAAG,IAAI,CAAC;AACnC,QAAA,yBAAyB,GAAG,IAAI,CAAC;AAE9C,+EAA+E;AAElE,QAAA,6BAA6B,GAAG,CAAC,CAAC;AAClC,QAAA,mCAAmC,GAAG,CAAC,CAAC;AACxC,QAAA,sCAAsC,GAAG,CAAC,CAAC;AAC3C,QAAA,uCAAuC,GAAG,CAAC,CAAC;AAEzD,+EAA+E;AAElE,QAAA,eAAe,GAAG,GAAG,CAAC;AACtB,QAAA,eAAe,GAAG,GAAG,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { AddressMethod, AddressMethodStartBehavior, AddressStepState } from '../address-proof.js';
2
+ import type { FlowStepDefinition } from '../flow-routing.js';
3
+ export interface AddressMethodContractFixture {
4
+ id: string;
5
+ allowedMethods: unknown;
6
+ expectedSanitized: AddressMethod[];
7
+ expectedStartBehavior?: AddressMethodStartBehavior;
8
+ selectedMethod?: AddressMethod | null;
9
+ expectedEffectiveMethod?: AddressMethod | null;
10
+ expectedRecommendedMethod?: AddressMethod | null;
11
+ }
12
+ export interface AddressCompletionContractFixture {
13
+ id: string;
14
+ allowedMethods: unknown;
15
+ address: AddressStepState;
16
+ expectedComplete: boolean;
17
+ }
18
+ export interface FlowRoutingContractFixture {
19
+ id: string;
20
+ currentStepId: string;
21
+ skipType?: string;
22
+ expectedNextStepId?: string;
23
+ expectedPreviousStepId?: string;
24
+ }
25
+ export declare const sharedStructuredAddressFixture: {
26
+ district: string;
27
+ chiefdom: string;
28
+ town: string;
29
+ line1: string;
30
+ };
31
+ export declare const addressMethodContractFixtures: AddressMethodContractFixture[];
32
+ export declare const addressCompletionContractFixtures: AddressCompletionContractFixture[];
33
+ export declare const flowRoutingContractSteps: FlowStepDefinition[];
34
+ export declare const flowRoutingContractFixtures: FlowRoutingContractFixture[];
35
+ //# sourceMappingURL=address-flow.fixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"address-flow.fixtures.d.ts","sourceRoot":"","sources":["../../../src/__fixtures__/address-flow.fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,0BAA0B,EAC1B,gBAAgB,EACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,MAAM,WAAW,4BAA4B;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,OAAO,CAAC;IACxB,iBAAiB,EAAE,aAAa,EAAE,CAAC;IACnC,qBAAqB,CAAC,EAAE,0BAA0B,CAAC;IACnD,cAAc,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACtC,uBAAuB,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/C,yBAAyB,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;CAClD;AAED,MAAM,WAAW,gCAAgC;IAC/C,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,eAAO,MAAM,8BAA8B;;;;;CAKmC,CAAC;AAE/E,eAAO,MAAM,6BAA6B,EAAE,4BAA4B,EAuFvE,CAAC;AAEF,eAAO,MAAM,iCAAiC,EAAE,gCAAgC,EAiD/E,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,kBAAkB,EAOxD,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,0BAA0B,EA6BnE,CAAC"}
@@ -0,0 +1,183 @@
1
+ export const sharedStructuredAddressFixture = {
2
+ district: 'Western Area Urban',
3
+ chiefdom: 'Freetown',
4
+ town: 'Freetown',
5
+ line1: '12 Wilkinson Road',
6
+ };
7
+ export const addressMethodContractFixtures = [
8
+ {
9
+ id: 'fallback-order-preserves-supported-methods',
10
+ allowedMethods: ['front_door_photo', 'front_door_photo', 'bogus', 'typed_address'],
11
+ expectedSanitized: ['front_door_photo', 'typed_address'],
12
+ expectedStartBehavior: {
13
+ kind: 'manual_choice',
14
+ effectiveMethod: null,
15
+ recommendedMethod: 'front_door_photo',
16
+ },
17
+ selectedMethod: null,
18
+ expectedEffectiveMethod: null,
19
+ expectedRecommendedMethod: 'front_door_photo',
20
+ },
21
+ {
22
+ id: 'missing-methods-default-to-canonical-order',
23
+ allowedMethods: undefined,
24
+ expectedSanitized: ['address_document', 'front_door_photo', 'typed_address'],
25
+ expectedStartBehavior: {
26
+ kind: 'manual_choice',
27
+ effectiveMethod: null,
28
+ recommendedMethod: 'address_document',
29
+ },
30
+ selectedMethod: null,
31
+ expectedEffectiveMethod: null,
32
+ expectedRecommendedMethod: 'address_document',
33
+ },
34
+ {
35
+ id: 'invalid-only-methods-fall-back-to-default-order',
36
+ allowedMethods: ['bogus'],
37
+ expectedSanitized: ['address_document', 'front_door_photo', 'typed_address'],
38
+ expectedStartBehavior: {
39
+ kind: 'manual_choice',
40
+ effectiveMethod: null,
41
+ recommendedMethod: 'address_document',
42
+ },
43
+ selectedMethod: null,
44
+ expectedEffectiveMethod: null,
45
+ expectedRecommendedMethod: 'address_document',
46
+ },
47
+ {
48
+ id: 'typed-only-address-skips-directly-to-form',
49
+ allowedMethods: ['typed_address'],
50
+ expectedSanitized: ['typed_address'],
51
+ expectedStartBehavior: {
52
+ kind: 'skip_to_form',
53
+ effectiveMethod: 'typed_address',
54
+ recommendedMethod: null,
55
+ },
56
+ selectedMethod: null,
57
+ expectedEffectiveMethod: 'typed_address',
58
+ expectedRecommendedMethod: null,
59
+ },
60
+ {
61
+ id: 'single-proof-method-auto-selects-proof-capture',
62
+ allowedMethods: ['front_door_photo'],
63
+ expectedSanitized: ['front_door_photo'],
64
+ expectedStartBehavior: {
65
+ kind: 'auto_select_proof',
66
+ effectiveMethod: 'front_door_photo',
67
+ recommendedMethod: 'front_door_photo',
68
+ },
69
+ selectedMethod: null,
70
+ expectedEffectiveMethod: 'front_door_photo',
71
+ expectedRecommendedMethod: 'front_door_photo',
72
+ },
73
+ {
74
+ id: 'invalid-explicit-selection-does-not-get-auto-inferred',
75
+ allowedMethods: ['typed_address'],
76
+ expectedSanitized: ['typed_address'],
77
+ selectedMethod: 'front_door_photo',
78
+ expectedEffectiveMethod: null,
79
+ expectedRecommendedMethod: null,
80
+ },
81
+ {
82
+ id: 'manual-choice-prefers-address-document-over-typed-address',
83
+ allowedMethods: ['typed_address', 'address_document'],
84
+ expectedSanitized: ['address_document', 'typed_address'],
85
+ expectedStartBehavior: {
86
+ kind: 'manual_choice',
87
+ effectiveMethod: null,
88
+ recommendedMethod: 'address_document',
89
+ },
90
+ selectedMethod: 'typed_address',
91
+ expectedEffectiveMethod: 'typed_address',
92
+ expectedRecommendedMethod: 'address_document',
93
+ },
94
+ ];
95
+ export const addressCompletionContractFixtures = [
96
+ {
97
+ id: 'typed-address-completes-with-structured-fields-only',
98
+ allowedMethods: ['typed_address'],
99
+ address: {
100
+ ...sharedStructuredAddressFixture,
101
+ method: 'typed_address',
102
+ proofUri: null,
103
+ coordinates: null,
104
+ },
105
+ expectedComplete: true,
106
+ },
107
+ {
108
+ id: 'address-document-requires-proof-upload',
109
+ allowedMethods: ['address_document'],
110
+ address: {
111
+ ...sharedStructuredAddressFixture,
112
+ method: 'address_document',
113
+ proofUri: null,
114
+ coordinates: null,
115
+ },
116
+ expectedComplete: false,
117
+ },
118
+ {
119
+ id: 'front-door-photo-requires-gps-coordinates',
120
+ allowedMethods: ['front_door_photo'],
121
+ address: {
122
+ ...sharedStructuredAddressFixture,
123
+ method: 'front_door_photo',
124
+ proofUri: 'file://front-door.jpg',
125
+ coordinates: null,
126
+ },
127
+ expectedComplete: false,
128
+ },
129
+ {
130
+ id: 'front-door-photo-completes-with-proof-and-gps',
131
+ allowedMethods: ['front_door_photo'],
132
+ address: {
133
+ ...sharedStructuredAddressFixture,
134
+ method: 'front_door_photo',
135
+ proofUri: 'file://front-door.jpg',
136
+ coordinates: {
137
+ lat: 8.48,
138
+ lng: -13.23,
139
+ accuracy: 12,
140
+ },
141
+ },
142
+ expectedComplete: true,
143
+ },
144
+ ];
145
+ export const flowRoutingContractSteps = [
146
+ { id: 'welcome' },
147
+ { id: 'address-proof-start' },
148
+ { id: 'address-input', type: 'address-form' },
149
+ { id: 'address-proof-photo', type: 'address-proof' },
150
+ { id: 'check-address-proof', type: 'address-proof' },
151
+ { id: 'loading' },
152
+ ];
153
+ export const flowRoutingContractFixtures = [
154
+ {
155
+ id: 'proof-capture-mode-skips-address-form',
156
+ currentStepId: 'address-proof-start',
157
+ skipType: 'address-form',
158
+ expectedNextStepId: 'address-proof-photo',
159
+ expectedPreviousStepId: 'welcome',
160
+ },
161
+ {
162
+ id: 'typed-address-mode-skips-proof-capture-segment',
163
+ currentStepId: 'address-input',
164
+ skipType: 'address-proof',
165
+ expectedNextStepId: 'loading',
166
+ expectedPreviousStepId: 'address-proof-start',
167
+ },
168
+ {
169
+ id: 'back-navigation-returns-to-method-selection-when-form-is-skipped',
170
+ currentStepId: 'address-proof-photo',
171
+ skipType: 'address-form',
172
+ expectedNextStepId: 'check-address-proof',
173
+ expectedPreviousStepId: 'address-proof-start',
174
+ },
175
+ {
176
+ id: 'skip-resolution-works-even-when-current-step-is-in-the-skipped-type',
177
+ currentStepId: 'address-proof-photo',
178
+ skipType: 'address-proof',
179
+ expectedNextStepId: 'loading',
180
+ expectedPreviousStepId: 'address-input',
181
+ },
182
+ ];
183
+ //# sourceMappingURL=address-flow.fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"address-flow.fixtures.js","sourceRoot":"","sources":["../../../src/__fixtures__/address-flow.fixtures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { MetadataReviewInput } from '../metadata-review.js';
2
+ import type { MetadataReviewResult } from '../types.js';
3
+ export interface MetadataReviewFixture {
4
+ id: string;
5
+ input: MetadataReviewInput;
6
+ expected: Pick<MetadataReviewResult, 'passed' | 'orientation' | 'isDocument'> & {
7
+ issueKeys: string[];
8
+ };
9
+ }
10
+ export declare const metadataReviewFixtures: MetadataReviewFixture[];
11
+ //# sourceMappingURL=metadata-review.fixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata-review.fixtures.d.ts","sourceRoot":"","sources":["../../../src/__fixtures__/metadata-review.fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,mBAAmB,CAAC;IAC3B,QAAQ,EAAE,IAAI,CAAC,oBAAoB,EAAE,QAAQ,GAAG,aAAa,GAAG,YAAY,CAAC,GAAG;QAC9E,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AAED,eAAO,MAAM,sBAAsB,EAAE,qBAAqB,EAgEzD,CAAC"}
@@ -0,0 +1,66 @@
1
+ export const metadataReviewFixtures = [
2
+ {
3
+ id: 'passport-square-fails-shape-check',
4
+ input: {
5
+ type: 'document',
6
+ width: 1000,
7
+ height: 1000,
8
+ documentType: 'PASSPORT',
9
+ fileSize: 180_000,
10
+ },
11
+ expected: {
12
+ passed: false,
13
+ orientation: 'square',
14
+ isDocument: false,
15
+ issueKeys: ['bad_aspect'],
16
+ },
17
+ },
18
+ {
19
+ id: 'portrait-id-warns-for-rotation-only',
20
+ input: {
21
+ type: 'document',
22
+ width: 720,
23
+ height: 1280,
24
+ documentType: 'NATIONAL_ID',
25
+ fileSize: 260_000,
26
+ },
27
+ expected: {
28
+ passed: true,
29
+ orientation: 'portrait',
30
+ isDocument: true,
31
+ issueKeys: ['document_rotated'],
32
+ },
33
+ },
34
+ {
35
+ id: 'compressed-landscape-selfie-warns-without-failing',
36
+ input: {
37
+ type: 'selfie',
38
+ width: 1280,
39
+ height: 720,
40
+ fileSize: 10_000,
41
+ },
42
+ expected: {
43
+ passed: true,
44
+ orientation: 'landscape',
45
+ isDocument: false,
46
+ issueKeys: ['selfie_landscape', 'low_detail'],
47
+ },
48
+ },
49
+ {
50
+ id: 'tiny-document-fails-immediately',
51
+ input: {
52
+ type: 'document',
53
+ width: 180,
54
+ height: 120,
55
+ documentType: 'DRIVERS_LICENSE',
56
+ fileSize: 20_000,
57
+ },
58
+ expected: {
59
+ passed: false,
60
+ orientation: 'landscape',
61
+ isDocument: false,
62
+ issueKeys: ['too_small'],
63
+ },
64
+ },
65
+ ];
66
+ //# sourceMappingURL=metadata-review.fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata-review.fixtures.js","sourceRoot":"","sources":["../../../src/__fixtures__/metadata-review.fixtures.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,MAAM,sBAAsB,GAA4B;IAC7D;QACE,EAAE,EAAE,mCAAmC;QACvC,KAAK,EAAE;YACL,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,IAAI;YACZ,YAAY,EAAE,UAAU;YACxB,QAAQ,EAAE,OAAO;SAClB;QACD,QAAQ,EAAE;YACR,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,QAAQ;YACrB,UAAU,EAAE,KAAK;YACjB,SAAS,EAAE,CAAC,YAAY,CAAC;SAC1B;KACF;IACD;QACE,EAAE,EAAE,qCAAqC;QACzC,KAAK,EAAE;YACL,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,IAAI;YACZ,YAAY,EAAE,aAAa;YAC3B,QAAQ,EAAE,OAAO;SAClB;QACD,QAAQ,EAAE;YACR,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,UAAU;YACvB,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,CAAC,kBAAkB,CAAC;SAChC;KACF;IACD;QACE,EAAE,EAAE,mDAAmD;QACvD,KAAK,EAAE;YACL,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,GAAG;YACX,QAAQ,EAAE,MAAM;SACjB;QACD,QAAQ,EAAE;YACR,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,WAAW;YACxB,UAAU,EAAE,KAAK;YACjB,SAAS,EAAE,CAAC,kBAAkB,EAAE,YAAY,CAAC;SAC9C;KACF;IACD;QACE,EAAE,EAAE,iCAAiC;QACrC,KAAK,EAAE;YACL,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,GAAG;YACX,YAAY,EAAE,iBAAiB;YAC/B,QAAQ,EAAE,MAAM;SACjB;QACD,QAAQ,EAAE;YACR,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,WAAW;YACxB,UAAU,EAAE,KAAK;YACjB,SAAS,EAAE,CAAC,WAAW,CAAC;SACzB;KACF;CACF,CAAC"}
@@ -0,0 +1,33 @@
1
+ export declare const ADDRESS_METHOD_ORDER: readonly ["address_document", "front_door_photo", "typed_address"];
2
+ export type AddressMethod = (typeof ADDRESS_METHOD_ORDER)[number];
3
+ export type AddressProofMode = Exclude<AddressMethod, 'typed_address'>;
4
+ export interface AddressCoordinatesLike {
5
+ latitude?: number | null;
6
+ longitude?: number | null;
7
+ lat?: number | null;
8
+ lng?: number | null;
9
+ accuracy?: number | null;
10
+ }
11
+ export interface AddressStepState {
12
+ district?: string | null;
13
+ chiefdom?: string | null;
14
+ town?: string | null;
15
+ line1?: string | null;
16
+ method?: AddressMethod | null;
17
+ proofUri?: string | null;
18
+ coordinates?: AddressCoordinatesLike | null;
19
+ }
20
+ export interface AddressMethodStartBehavior {
21
+ kind: 'skip_to_form' | 'auto_select_proof' | 'manual_choice';
22
+ effectiveMethod: AddressMethod | null;
23
+ recommendedMethod: AddressMethod | null;
24
+ }
25
+ export declare function isAddressMethod(value: unknown): value is AddressMethod;
26
+ export declare function sanitizeAllowedAddressMethods(raw: unknown): AddressMethod[];
27
+ export declare function getRecommendedAddressMethod(methods: unknown): AddressMethod | null;
28
+ export declare function getAddressMethodStartBehavior(methods: unknown): AddressMethodStartBehavior;
29
+ export declare function getEffectiveAddressMethod(selectedMethod: AddressMethod | null | undefined, methods: unknown): AddressMethod | null;
30
+ export declare function hasAddressProofCoordinates(coordinates?: AddressCoordinatesLike | null): coordinates is AddressCoordinatesLike;
31
+ export declare function hasStructuredAddress(address?: AddressStepState | null): boolean;
32
+ export declare function isAddressStepComplete(address: AddressStepState | null | undefined, methods: unknown): boolean;
33
+ //# sourceMappingURL=address-proof.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"address-proof.d.ts","sourceRoot":"","sources":["../../src/address-proof.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,oEAIvB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAClE,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;AAEvE,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAC;CAC7C;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,cAAc,GAAG,mBAAmB,GAAG,eAAe,CAAC;IAC7D,eAAe,EAAE,aAAa,GAAG,IAAI,CAAC;IACtC,iBAAiB,EAAE,aAAa,GAAG,IAAI,CAAC;CACzC;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAMtE;AAED,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,EAAE,CAS3E;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,GAAG,aAAa,GAAG,IAAI,CAGlF;AAED,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,OAAO,GAAG,0BAA0B,CA2B1F;AAED,wBAAgB,yBAAyB,CACvC,cAAc,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,EAChD,OAAO,EAAE,OAAO,GACf,aAAa,GAAG,IAAI,CAQtB;AAED,wBAAgB,0BAA0B,CACxC,WAAW,CAAC,EAAE,sBAAsB,GAAG,IAAI,GAC1C,WAAW,IAAI,sBAAsB,CASvC;AAED,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,IAAI,GAAG,OAAO,CAW/E;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,EAC5C,OAAO,EAAE,OAAO,GACf,OAAO,CAoBT"}
@@ -0,0 +1,86 @@
1
+ export const ADDRESS_METHOD_ORDER = [
2
+ 'address_document',
3
+ 'front_door_photo',
4
+ 'typed_address',
5
+ ];
6
+ export function isAddressMethod(value) {
7
+ return (value === 'address_document' ||
8
+ value === 'front_door_photo' ||
9
+ value === 'typed_address');
10
+ }
11
+ export function sanitizeAllowedAddressMethods(raw) {
12
+ if (!Array.isArray(raw) || raw.length === 0) {
13
+ return [...ADDRESS_METHOD_ORDER];
14
+ }
15
+ const requestedMethods = new Set(raw.filter(isAddressMethod));
16
+ const allowedMethods = ADDRESS_METHOD_ORDER.filter(method => requestedMethods.has(method));
17
+ return allowedMethods.length > 0 ? allowedMethods : [...ADDRESS_METHOD_ORDER];
18
+ }
19
+ export function getRecommendedAddressMethod(methods) {
20
+ const allowedMethods = sanitizeAllowedAddressMethods(methods);
21
+ return allowedMethods.find(method => method !== 'typed_address') ?? null;
22
+ }
23
+ export function getAddressMethodStartBehavior(methods) {
24
+ const allowedMethods = sanitizeAllowedAddressMethods(methods);
25
+ const proofMethods = allowedMethods.filter((method) => method !== 'typed_address');
26
+ if (proofMethods.length === 0) {
27
+ return {
28
+ kind: 'skip_to_form',
29
+ effectiveMethod: allowedMethods.includes('typed_address') ? 'typed_address' : null,
30
+ recommendedMethod: null,
31
+ };
32
+ }
33
+ if (proofMethods.length === 1 && !allowedMethods.includes('typed_address')) {
34
+ return {
35
+ kind: 'auto_select_proof',
36
+ effectiveMethod: proofMethods[0],
37
+ recommendedMethod: proofMethods[0],
38
+ };
39
+ }
40
+ return {
41
+ kind: 'manual_choice',
42
+ effectiveMethod: null,
43
+ recommendedMethod: getRecommendedAddressMethod(allowedMethods),
44
+ };
45
+ }
46
+ export function getEffectiveAddressMethod(selectedMethod, methods) {
47
+ const allowedMethods = sanitizeAllowedAddressMethods(methods);
48
+ if (selectedMethod) {
49
+ return allowedMethods.includes(selectedMethod) ? selectedMethod : null;
50
+ }
51
+ return getAddressMethodStartBehavior(allowedMethods).effectiveMethod;
52
+ }
53
+ export function hasAddressProofCoordinates(coordinates) {
54
+ if (!coordinates || typeof coordinates !== 'object') {
55
+ return false;
56
+ }
57
+ const latitude = coordinates.latitude ?? coordinates.lat;
58
+ const longitude = coordinates.longitude ?? coordinates.lng;
59
+ return typeof latitude === 'number' && typeof longitude === 'number';
60
+ }
61
+ export function hasStructuredAddress(address) {
62
+ if (!address) {
63
+ return false;
64
+ }
65
+ return Boolean(address.district &&
66
+ address.chiefdom &&
67
+ address.town?.trim() &&
68
+ address.line1?.trim());
69
+ }
70
+ export function isAddressStepComplete(address, methods) {
71
+ const effectiveMethod = getEffectiveAddressMethod(address?.method ?? null, methods);
72
+ if (!effectiveMethod || !hasStructuredAddress(address)) {
73
+ return false;
74
+ }
75
+ if (effectiveMethod === 'typed_address') {
76
+ return true;
77
+ }
78
+ if (!address?.proofUri) {
79
+ return false;
80
+ }
81
+ if (effectiveMethod === 'front_door_photo' && !hasAddressProofCoordinates(address.coordinates)) {
82
+ return false;
83
+ }
84
+ return true;
85
+ }
86
+ //# sourceMappingURL=address-proof.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"address-proof.js","sourceRoot":"","sources":["../../src/address-proof.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Document likelihood classifier -- 5-signal Bayesian heuristic.
3
+ *
4
+ * DOM-free: operates on raw greyscale (Uint8Array) and RGBA (Uint8ClampedArray)
5
+ * pixel data. No Canvas, no HTMLImageElement.
6
+ */
7
+ import type { DocumentLikelihoodResult, DocumentReviewProfile } from './types.js';
8
+ export declare function getDocumentReviewProfile(documentType: string | null | undefined): DocumentReviewProfile;
9
+ /**
10
+ * Determine whether a greyscale + RGBA image looks like a document.
11
+ *
12
+ * @param grey - Greyscale pixel array (w * h, one byte per pixel)
13
+ * @param imgData - RGBA pixel array (w * h * 4 bytes)
14
+ * @param w - Image width in pixels
15
+ * @param h - Image height in pixels
16
+ * @param documentType - Optional document type hint for aspect-ratio matching
17
+ */
18
+ export declare function checkDocumentLikelihood(grey: Uint8Array, imgData: Uint8ClampedArray, w: number, h: number, documentType?: string | null): DocumentLikelihoodResult;
19
+ //# sourceMappingURL=document-classifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-classifier.d.ts","sourceRoot":"","sources":["../../src/document-classifier.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AA6BlF,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACtC,qBAAqB,CA+CvB;AAID;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,iBAAiB,EAC1B,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAC3B,wBAAwB,CAgI1B"}