guardrail-ship 1.0.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 (119) hide show
  1. package/dist/index.d.ts +7 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +7 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/mock-implementation.d.ts +1 -0
  6. package/dist/mock-implementation.d.ts.map +1 -0
  7. package/dist/mock-implementation.js +2 -0
  8. package/dist/mock-implementation.js.map +1 -0
  9. package/dist/mockproof/__tests__/import-graph-scanner.test.d.ts +5 -0
  10. package/dist/mockproof/__tests__/import-graph-scanner.test.d.ts.map +1 -0
  11. package/dist/mockproof/__tests__/import-graph-scanner.test.js +92 -0
  12. package/dist/mockproof/__tests__/import-graph-scanner.test.js.map +1 -0
  13. package/dist/mockproof/import-graph-scanner.d.ts +93 -0
  14. package/dist/mockproof/import-graph-scanner.d.ts.map +1 -0
  15. package/dist/mockproof/import-graph-scanner.js +411 -0
  16. package/dist/mockproof/import-graph-scanner.js.map +1 -0
  17. package/dist/mockproof/index.d.ts +10 -0
  18. package/dist/mockproof/index.d.ts.map +1 -0
  19. package/dist/mockproof/index.js +10 -0
  20. package/dist/mockproof/index.js.map +1 -0
  21. package/dist/reality-mode/auth-enforcer.d.ts +13 -0
  22. package/dist/reality-mode/auth-enforcer.d.ts.map +1 -0
  23. package/dist/reality-mode/auth-enforcer.js +90 -0
  24. package/dist/reality-mode/auth-enforcer.js.map +1 -0
  25. package/dist/reality-mode/explorer/critical-flows.d.ts +71 -0
  26. package/dist/reality-mode/explorer/critical-flows.d.ts.map +1 -0
  27. package/dist/reality-mode/explorer/critical-flows.js +463 -0
  28. package/dist/reality-mode/explorer/critical-flows.js.map +1 -0
  29. package/dist/reality-mode/explorer/flow-parser.d.ts +52 -0
  30. package/dist/reality-mode/explorer/flow-parser.d.ts.map +1 -0
  31. package/dist/reality-mode/explorer/flow-parser.js +250 -0
  32. package/dist/reality-mode/explorer/flow-parser.js.map +1 -0
  33. package/dist/reality-mode/explorer/index.d.ts +11 -0
  34. package/dist/reality-mode/explorer/index.d.ts.map +1 -0
  35. package/dist/reality-mode/explorer/index.js +11 -0
  36. package/dist/reality-mode/explorer/index.js.map +1 -0
  37. package/dist/reality-mode/explorer/runtime-explorer.d.ts +35 -0
  38. package/dist/reality-mode/explorer/runtime-explorer.d.ts.map +1 -0
  39. package/dist/reality-mode/explorer/runtime-explorer.js +688 -0
  40. package/dist/reality-mode/explorer/runtime-explorer.js.map +1 -0
  41. package/dist/reality-mode/explorer/surface-discovery.d.ts +60 -0
  42. package/dist/reality-mode/explorer/surface-discovery.d.ts.map +1 -0
  43. package/dist/reality-mode/explorer/surface-discovery.js +357 -0
  44. package/dist/reality-mode/explorer/surface-discovery.js.map +1 -0
  45. package/dist/reality-mode/explorer/types.d.ts +275 -0
  46. package/dist/reality-mode/explorer/types.d.ts.map +1 -0
  47. package/dist/reality-mode/explorer/types.js +8 -0
  48. package/dist/reality-mode/explorer/types.js.map +1 -0
  49. package/dist/reality-mode/fake-success-detector.d.ts +10 -0
  50. package/dist/reality-mode/fake-success-detector.d.ts.map +1 -0
  51. package/dist/reality-mode/fake-success-detector.js +76 -0
  52. package/dist/reality-mode/fake-success-detector.js.map +1 -0
  53. package/dist/reality-mode/index.d.ts +14 -0
  54. package/dist/reality-mode/index.d.ts.map +1 -0
  55. package/dist/reality-mode/index.js +14 -0
  56. package/dist/reality-mode/index.js.map +1 -0
  57. package/dist/reality-mode/reality-scanner.d.ts +48 -0
  58. package/dist/reality-mode/reality-scanner.d.ts.map +1 -0
  59. package/dist/reality-mode/reality-scanner.js +516 -0
  60. package/dist/reality-mode/reality-scanner.js.map +1 -0
  61. package/dist/reality-mode/report-generator.d.ts +11 -0
  62. package/dist/reality-mode/report-generator.d.ts.map +1 -0
  63. package/dist/reality-mode/report-generator.js +233 -0
  64. package/dist/reality-mode/report-generator.js.map +1 -0
  65. package/dist/reality-mode/traffic-classifier.d.ts +14 -0
  66. package/dist/reality-mode/traffic-classifier.d.ts.map +1 -0
  67. package/dist/reality-mode/traffic-classifier.js +131 -0
  68. package/dist/reality-mode/traffic-classifier.js.map +1 -0
  69. package/dist/reality-mode/types.d.ts +90 -0
  70. package/dist/reality-mode/types.d.ts.map +1 -0
  71. package/dist/reality-mode/types.js +2 -0
  72. package/dist/reality-mode/types.js.map +1 -0
  73. package/dist/ship-badge/__tests__/ship-badge-generator.test.d.ts +5 -0
  74. package/dist/ship-badge/__tests__/ship-badge-generator.test.d.ts.map +1 -0
  75. package/dist/ship-badge/__tests__/ship-badge-generator.test.js +146 -0
  76. package/dist/ship-badge/__tests__/ship-badge-generator.test.js.map +1 -0
  77. package/dist/ship-badge/index.d.ts +9 -0
  78. package/dist/ship-badge/index.d.ts.map +1 -0
  79. package/dist/ship-badge/index.js +9 -0
  80. package/dist/ship-badge/index.js.map +1 -0
  81. package/dist/ship-badge/ship-badge-generator.d.ts +136 -0
  82. package/dist/ship-badge/ship-badge-generator.d.ts.map +1 -0
  83. package/dist/ship-badge/ship-badge-generator.js +681 -0
  84. package/dist/ship-badge/ship-badge-generator.js.map +1 -0
  85. package/package.json +20 -0
  86. package/src/index.ts +7 -0
  87. package/src/mock-implementation.ts +0 -0
  88. package/src/mockproof/__tests__/import-graph-scanner.test.ts +115 -0
  89. package/src/mockproof/import-graph-scanner.d.ts +93 -0
  90. package/src/mockproof/import-graph-scanner.d.ts.map +1 -0
  91. package/src/mockproof/import-graph-scanner.js +482 -0
  92. package/src/mockproof/import-graph-scanner.ts +540 -0
  93. package/src/mockproof/index.ts +18 -0
  94. package/src/reality-mode/auth-enforcer.ts +97 -0
  95. package/src/reality-mode/explorer/critical-flows.ts +504 -0
  96. package/src/reality-mode/explorer/flow-parser.ts +293 -0
  97. package/src/reality-mode/explorer/index.ts +22 -0
  98. package/src/reality-mode/explorer/runtime-explorer.ts +715 -0
  99. package/src/reality-mode/explorer/surface-discovery.ts +498 -0
  100. package/src/reality-mode/explorer/templates/example-flows/auth-flow.yaml +41 -0
  101. package/src/reality-mode/explorer/templates/example-flows/checkout-flow.yaml +66 -0
  102. package/src/reality-mode/explorer/templates/example-flows/contact-form.yaml +43 -0
  103. package/src/reality-mode/explorer/templates/github-action.yml +132 -0
  104. package/src/reality-mode/explorer/types.ts +356 -0
  105. package/src/reality-mode/fake-success-detector.ts +89 -0
  106. package/src/reality-mode/index.ts +19 -0
  107. package/src/reality-mode/reality-scanner.d.ts +123 -0
  108. package/src/reality-mode/reality-scanner.d.ts.map +1 -0
  109. package/src/reality-mode/reality-scanner.js +526 -0
  110. package/src/reality-mode/reality-scanner.ts +576 -0
  111. package/src/reality-mode/report-generator.ts +253 -0
  112. package/src/reality-mode/traffic-classifier.ts +169 -0
  113. package/src/reality-mode/types.ts +95 -0
  114. package/src/ship-badge/__tests__/ship-badge-generator.test.ts +162 -0
  115. package/src/ship-badge/index.ts +16 -0
  116. package/src/ship-badge/ship-badge-generator.d.ts +136 -0
  117. package/src/ship-badge/ship-badge-generator.d.ts.map +1 -0
  118. package/src/ship-badge/ship-badge-generator.js +779 -0
  119. package/src/ship-badge/ship-badge-generator.ts +873 -0
@@ -0,0 +1,275 @@
1
+ /**
2
+ * Reality Explorer Types
3
+ *
4
+ * Types for the comprehensive app exploration system that actually
5
+ * tests everything - buttons, forms, modals, auth flows, etc.
6
+ */
7
+ export interface DiscoveredRoute {
8
+ path: string;
9
+ method: "GET" | "POST" | "PUT" | "DELETE";
10
+ source: "link" | "router" | "api-call" | "redirect";
11
+ requiresAuth: boolean;
12
+ visited: boolean;
13
+ status?: number;
14
+ error?: string;
15
+ }
16
+ export interface DiscoveredElement {
17
+ id: string;
18
+ selector: string;
19
+ type: "button" | "link" | "input" | "form" | "modal-trigger" | "dropdown" | "tab" | "accordion";
20
+ text: string;
21
+ page: string;
22
+ isDestructive: boolean;
23
+ tested: boolean;
24
+ result?: ElementTestResult;
25
+ }
26
+ export interface DiscoveredForm {
27
+ id: string;
28
+ selector: string;
29
+ page: string;
30
+ action?: string;
31
+ method: string;
32
+ fields: FormField[];
33
+ submitButton?: string;
34
+ tested: boolean;
35
+ result?: FormTestResult;
36
+ }
37
+ export interface FormField {
38
+ name: string;
39
+ type: string;
40
+ required: boolean;
41
+ selector: string;
42
+ placeholder?: string;
43
+ pattern?: string;
44
+ }
45
+ export interface DiscoveredAPI {
46
+ url: string;
47
+ method: string;
48
+ calledFrom: string;
49
+ status?: number;
50
+ responseTime?: number;
51
+ error?: string;
52
+ }
53
+ export interface AppSurface {
54
+ routes: DiscoveredRoute[];
55
+ elements: DiscoveredElement[];
56
+ forms: DiscoveredForm[];
57
+ apis: DiscoveredAPI[];
58
+ timestamp: string;
59
+ }
60
+ export interface ElementTestResult {
61
+ success: boolean;
62
+ action: "click" | "hover" | "focus";
63
+ beforeState: PageState;
64
+ afterState: PageState;
65
+ changes: StateChange[];
66
+ errors: CapturedError[];
67
+ networkCalls: NetworkCall[];
68
+ duration: number;
69
+ screenshot?: string;
70
+ }
71
+ export interface FormTestResult {
72
+ success: boolean;
73
+ fieldsFilledCount: number;
74
+ submitAttempted: boolean;
75
+ submitSucceeded: boolean;
76
+ validationErrors: string[];
77
+ networkCalls: NetworkCall[];
78
+ errors: CapturedError[];
79
+ duration: number;
80
+ screenshot?: string;
81
+ }
82
+ export interface PageState {
83
+ url: string;
84
+ title: string;
85
+ modalsOpen: number;
86
+ loadingIndicators: number;
87
+ errorMessages: string[];
88
+ domHash: string;
89
+ }
90
+ export interface StateChange {
91
+ type: "url" | "modal" | "dom" | "console" | "network";
92
+ description: string;
93
+ significance: "major" | "minor" | "none";
94
+ }
95
+ export interface CapturedError {
96
+ type: "console" | "network" | "uncaught" | "react-boundary";
97
+ message: string;
98
+ stack?: string;
99
+ url?: string;
100
+ timestamp: number;
101
+ }
102
+ export interface NetworkCall {
103
+ url: string;
104
+ method: string;
105
+ status: number;
106
+ duration: number;
107
+ requestBody?: string;
108
+ responsePreview?: string;
109
+ error?: string;
110
+ }
111
+ export interface CriticalFlow {
112
+ id: string;
113
+ name: string;
114
+ description: string;
115
+ steps: FlowStep[];
116
+ assertions: FlowAssertion[];
117
+ required: boolean;
118
+ }
119
+ export interface FlowStep {
120
+ action: "navigate" | "click" | "fill" | "wait" | "assert";
121
+ target?: string;
122
+ value?: string;
123
+ timeout?: number;
124
+ }
125
+ export interface FlowAssertion {
126
+ type: "url-contains" | "element-visible" | "element-hidden" | "cookie-exists" | "localstorage-has" | "network-success" | "no-errors";
127
+ value: string;
128
+ critical: boolean;
129
+ }
130
+ export interface FlowResult {
131
+ flow: CriticalFlow;
132
+ success: boolean;
133
+ stepsCompleted: number;
134
+ stepsTotal: number;
135
+ assertionsPassed: number;
136
+ assertionsTotal: number;
137
+ failedAt?: string;
138
+ errors: CapturedError[];
139
+ duration: number;
140
+ trace?: string;
141
+ video?: string;
142
+ }
143
+ export interface CoverageMetrics {
144
+ routes: {
145
+ discovered: number;
146
+ visited: number;
147
+ successful: number;
148
+ blocked: number;
149
+ percentage: number;
150
+ };
151
+ elements: {
152
+ discovered: number;
153
+ tested: number;
154
+ successful: number;
155
+ skippedDestructive: number;
156
+ percentage: number;
157
+ };
158
+ forms: {
159
+ discovered: number;
160
+ tested: number;
161
+ successful: number;
162
+ blockedByAuth: number;
163
+ percentage: number;
164
+ };
165
+ apis: {
166
+ discovered: number;
167
+ called: number;
168
+ successful: number;
169
+ failed: number;
170
+ percentage: number;
171
+ };
172
+ flows: {
173
+ total: number;
174
+ passed: number;
175
+ failed: number;
176
+ skipped: number;
177
+ percentage: number;
178
+ };
179
+ }
180
+ export interface RealityScore {
181
+ overall: number;
182
+ breakdown: {
183
+ coverage: number;
184
+ functionality: number;
185
+ stability: number;
186
+ ux: number;
187
+ };
188
+ grade: "A" | "B" | "C" | "D" | "F";
189
+ verdict: "ship-it" | "needs-work" | "broken";
190
+ }
191
+ export interface ExplorerConfig {
192
+ baseUrl: string;
193
+ maxPages: number;
194
+ maxActionsPerPage: number;
195
+ timeout: number;
196
+ headless: boolean;
197
+ auth?: {
198
+ loginUrl: string;
199
+ credentials: {
200
+ emailField: string;
201
+ passwordField: string;
202
+ email: string;
203
+ password: string;
204
+ };
205
+ successIndicator: string;
206
+ };
207
+ allowDestructive: boolean;
208
+ destructivePatterns: string[];
209
+ outputDir: string;
210
+ captureVideo: boolean;
211
+ captureTrace: boolean;
212
+ captureScreenshots: boolean;
213
+ flows?: CriticalFlow[];
214
+ }
215
+ export interface ExplorerReport {
216
+ summary: {
217
+ score: RealityScore;
218
+ coverage: CoverageMetrics;
219
+ duration: number;
220
+ timestamp: string;
221
+ };
222
+ surface: AppSurface;
223
+ results: {
224
+ routes: RouteResult[];
225
+ elements: ElementResult[];
226
+ forms: FormResult[];
227
+ flows: FlowResult[];
228
+ };
229
+ failures: {
230
+ critical: FailureReport[];
231
+ warnings: FailureReport[];
232
+ };
233
+ recommendations: Recommendation[];
234
+ artifacts: {
235
+ traces: string[];
236
+ videos: string[];
237
+ screenshots: string[];
238
+ };
239
+ }
240
+ export interface RouteResult {
241
+ route: DiscoveredRoute;
242
+ status: "success" | "error" | "blocked" | "skipped";
243
+ responseTime?: number;
244
+ errors: CapturedError[];
245
+ }
246
+ export interface ElementResult {
247
+ element: DiscoveredElement;
248
+ status: "success" | "error" | "no-change" | "skipped";
249
+ result?: ElementTestResult;
250
+ }
251
+ export interface FormResult {
252
+ form: DiscoveredForm;
253
+ status: "success" | "validation-error" | "submit-error" | "blocked" | "skipped";
254
+ result?: FormTestResult;
255
+ }
256
+ export interface FailureReport {
257
+ id: string;
258
+ type: "route" | "element" | "form" | "flow" | "api";
259
+ severity: "critical" | "warning";
260
+ title: string;
261
+ description: string;
262
+ location: string;
263
+ rootCause?: string;
264
+ reproduction: string[];
265
+ screenshot?: string;
266
+ trace?: string;
267
+ }
268
+ export interface Recommendation {
269
+ priority: "high" | "medium" | "low";
270
+ category: "functionality" | "auth" | "ux" | "performance" | "stability";
271
+ title: string;
272
+ description: string;
273
+ fix?: string;
274
+ }
275
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/reality-mode/explorer/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;IAC1C,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;IACpD,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EACA,QAAQ,GACR,MAAM,GACN,OAAO,GACP,MAAM,GACN,eAAe,GACf,UAAU,GACV,KAAK,GACL,WAAW,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,IAAI,EAAE,aAAa,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;IACpC,WAAW,EAAE,SAAS,CAAC;IACvB,UAAU,EAAE,SAAS,CAAC;IACtB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,KAAK,GAAG,OAAO,GAAG,KAAK,GAAG,SAAS,GAAG,SAAS,CAAC;IACtD,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;CAC1C;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,gBAAgB,CAAC;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EACA,cAAc,GACd,iBAAiB,GACjB,gBAAgB,GAChB,eAAe,GACf,kBAAkB,GAClB,iBAAiB,GACjB,WAAW,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE;QACN,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,QAAQ,EAAE;QACR,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,IAAI,EAAE;QACJ,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE;QACT,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;IACF,KAAK,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IACnC,OAAO,EAAE,SAAS,GAAG,YAAY,GAAG,QAAQ,CAAC;CAC9C;AAMD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAGlB,IAAI,CAAC,EAAE;QACL,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE;YACX,UAAU,EAAE,MAAM,CAAC;YACnB,aAAa,EAAE,MAAM,CAAC;YACtB,KAAK,EAAE,MAAM,CAAC;YACd,QAAQ,EAAE,MAAM,CAAC;SAClB,CAAC;QACF,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IAGF,gBAAgB,EAAE,OAAO,CAAC;IAC1B,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAG9B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,kBAAkB,EAAE,OAAO,CAAC;IAG5B,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;CACxB;AAMD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE;QACP,KAAK,EAAE,YAAY,CAAC;QACpB,QAAQ,EAAE,eAAe,CAAC;QAC1B,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAEF,OAAO,EAAE,UAAU,CAAC;IAEpB,OAAO,EAAE;QACP,MAAM,EAAE,WAAW,EAAE,CAAC;QACtB,QAAQ,EAAE,aAAa,EAAE,CAAC;QAC1B,KAAK,EAAE,UAAU,EAAE,CAAC;QACpB,KAAK,EAAE,UAAU,EAAE,CAAC;KACrB,CAAC;IAEF,QAAQ,EAAE;QACR,QAAQ,EAAE,aAAa,EAAE,CAAC;QAC1B,QAAQ,EAAE,aAAa,EAAE,CAAC;KAC3B,CAAC;IAEF,eAAe,EAAE,cAAc,EAAE,CAAC;IAElC,SAAS,EAAE;QACT,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,WAAW,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,eAAe,CAAC;IACvB,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IACpD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,SAAS,CAAC;IACtD,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC5B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,EACF,SAAS,GACT,kBAAkB,GAClB,cAAc,GACd,SAAS,GACT,SAAS,CAAC;IACd,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;IACpD,QAAQ,EAAE,UAAU,GAAG,SAAS,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACpC,QAAQ,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,GAAG,aAAa,GAAG,WAAW,CAAC;IACxE,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Reality Explorer Types
3
+ *
4
+ * Types for the comprehensive app exploration system that actually
5
+ * tests everything - buttons, forms, modals, auth flows, etc.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/reality-mode/explorer/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,10 @@
1
+ import { ReplayStep, FakeSuccessResult } from "./types";
2
+ export declare class FakeSuccessDetector {
3
+ /**
4
+ * Analyze a replay to find "Fake Success" patterns
5
+ * i.e., User clicked "Save" -> UI showed success -> No backend write happened
6
+ */
7
+ detect(replay: ReplayStep[]): FakeSuccessResult[];
8
+ private getSubsequentSteps;
9
+ }
10
+ //# sourceMappingURL=fake-success-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake-success-detector.d.ts","sourceRoot":"","sources":["../../src/reality-mode/fake-success-detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAExD,qBAAa,mBAAmB;IAC9B;;;OAGG;IACH,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,iBAAiB,EAAE;IA6DjD,OAAO,CAAC,kBAAkB;CAoB3B"}
@@ -0,0 +1,76 @@
1
+ export class FakeSuccessDetector {
2
+ /**
3
+ * Analyze a replay to find "Fake Success" patterns
4
+ * i.e., User clicked "Save" -> UI showed success -> No backend write happened
5
+ */
6
+ detect(replay) {
7
+ const results = [];
8
+ const saveActionPatterns = [
9
+ /save/i,
10
+ /update/i,
11
+ /create/i,
12
+ /submit/i,
13
+ /confirm/i,
14
+ /send/i,
15
+ /pay/i,
16
+ ];
17
+ // Iterate through replay to find "Write" actions
18
+ for (let i = 0; i < replay.length; i++) {
19
+ const step = replay[i];
20
+ if (!step || step.type !== "action" || !step.data?.selector)
21
+ continue;
22
+ const selector = step.data.selector;
23
+ const isWriteAction = saveActionPatterns.some((p) => p.test(selector));
24
+ if (isWriteAction) {
25
+ // Look ahead for network activity (next 5 seconds or until next action)
26
+ const subsequentSteps = this.getSubsequentSteps(replay, i, 5000);
27
+ const writeRequests = subsequentSteps.filter((s) => s.type === "request" &&
28
+ ["POST", "PUT", "PATCH", "DELETE"].includes(s.data.method));
29
+ if (writeRequests.length === 0) {
30
+ // No write request found!
31
+ // But maybe it's a client-side only app?
32
+ // Or maybe the request happened but we missed it?
33
+ // Or maybe it's "Fake Success".
34
+ results.push({
35
+ isFake: true,
36
+ score: 0,
37
+ evidence: [
38
+ `Clicked "${selector}" but no POST/PUT/PATCH/DELETE request followed.`,
39
+ ],
40
+ actionStep: step,
41
+ });
42
+ }
43
+ else {
44
+ // Write request found. Check if it looked real.
45
+ // (TrafficClassifier handles the quality of the request/response)
46
+ results.push({
47
+ isFake: false,
48
+ score: 100,
49
+ evidence: [
50
+ `Clicked "${selector}" triggered ${writeRequests.length} write request(s).`,
51
+ ],
52
+ actionStep: step,
53
+ });
54
+ }
55
+ }
56
+ }
57
+ return results;
58
+ }
59
+ getSubsequentSteps(replay, startIndex, timeWindow) {
60
+ const steps = [];
61
+ const startStep = replay[startIndex];
62
+ if (!startStep)
63
+ return steps;
64
+ const startTime = startStep.timestamp;
65
+ for (let i = startIndex + 1; i < replay.length; i++) {
66
+ const step = replay[i];
67
+ if (!step)
68
+ break;
69
+ if (step.timestamp - startStep.timestamp > timeWindow)
70
+ break;
71
+ steps.push(step);
72
+ }
73
+ return steps;
74
+ }
75
+ }
76
+ //# sourceMappingURL=fake-success-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake-success-detector.js","sourceRoot":"","sources":["../../src/reality-mode/fake-success-detector.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,mBAAmB;IAC9B;;;OAGG;IACH,MAAM,CAAC,MAAoB;QACzB,MAAM,OAAO,GAAwB,EAAE,CAAC;QACxC,MAAM,kBAAkB,GAAG;YACzB,OAAO;YACP,SAAS;YACT,SAAS;YACT,SAAS;YACT,UAAU;YACV,OAAO;YACP,MAAM;SACP,CAAC;QAEF,iDAAiD;QACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ;gBAAE,SAAS;YAEtE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;YACpC,MAAM,aAAa,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAEvE,IAAI,aAAa,EAAE,CAAC;gBAClB,wEAAwE;gBACxE,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;gBACjE,MAAM,aAAa,GAAG,eAAe,CAAC,MAAM,CAC1C,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,KAAK,SAAS;oBACpB,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAC7D,CAAC;gBAEF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC/B,0BAA0B;oBAC1B,yCAAyC;oBACzC,kDAAkD;oBAClD,gCAAgC;oBAEhC,OAAO,CAAC,IAAI,CAAC;wBACX,MAAM,EAAE,IAAI;wBACZ,KAAK,EAAE,CAAC;wBACR,QAAQ,EAAE;4BACR,YAAY,QAAQ,kDAAkD;yBACvE;wBACD,UAAU,EAAE,IAAI;qBACjB,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,gDAAgD;oBAChD,kEAAkE;oBAClE,OAAO,CAAC,IAAI,CAAC;wBACX,MAAM,EAAE,KAAK;wBACb,KAAK,EAAE,GAAG;wBACV,QAAQ,EAAE;4BACR,YAAY,QAAQ,eAAe,aAAa,CAAC,MAAM,oBAAoB;yBAC5E;wBACD,UAAU,EAAE,IAAI;qBACjB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,kBAAkB,CACxB,MAAoB,EACpB,UAAkB,EAClB,UAAkB;QAElB,MAAM,KAAK,GAAiB,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QACrC,IAAI,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC;QAE7B,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;QAEtC,KAAK,IAAI,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,CAAC,IAAI;gBAAE,MAAM;YACjB,IAAI,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,SAAS,GAAG,UAAU;gBAAE,MAAM;YAC7D,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Reality Mode - Runtime Fake Detection
3
+ *
4
+ * "Stop shipping pretend features. Guardrail runs your app and catches the lies."
5
+ *
6
+ * A literal "flight recorder" for fake apps.
7
+ */
8
+ export { RealityScanner, realityScanner, DEFAULT_FAKE_PATTERNS, } from "./reality-scanner";
9
+ export * from "./types";
10
+ export { ReportGenerator } from "./report-generator";
11
+ export { TrafficClassifier } from "./traffic-classifier";
12
+ export { FakeSuccessDetector } from "./fake-success-detector";
13
+ export { AuthEnforcer } from "./auth-enforcer";
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reality-mode/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,cAAc,EACd,cAAc,EACd,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAE3B,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Reality Mode - Runtime Fake Detection
3
+ *
4
+ * "Stop shipping pretend features. Guardrail runs your app and catches the lies."
5
+ *
6
+ * A literal "flight recorder" for fake apps.
7
+ */
8
+ export { RealityScanner, realityScanner, DEFAULT_FAKE_PATTERNS, } from "./reality-scanner";
9
+ export * from "./types";
10
+ export { ReportGenerator } from "./report-generator";
11
+ export { TrafficClassifier } from "./traffic-classifier";
12
+ export { FakeSuccessDetector } from "./fake-success-detector";
13
+ export { AuthEnforcer } from "./auth-enforcer";
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reality-mode/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,cAAc,EACd,cAAc,EACd,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAE3B,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Reality Mode - Runtime Fake Detection
3
+ *
4
+ * "Stop shipping pretend features. Guardrail runs your app and catches the lies."
5
+ *
6
+ * This module spins up the app, intercepts network calls, clicks through the UI,
7
+ * and detects:
8
+ * - Calls to localhost, jsonplaceholder, staging domains, ngrok
9
+ * - Routes returning demo/placeholder responses
10
+ * - Silent fallback success patterns
11
+ * - Mock billing and fake invoice IDs
12
+ *
13
+ * The killer feature: a "flight recorder" replay showing exactly what happened.
14
+ */
15
+ import { FakePattern, ReplayStep, RealityModeResult, RealityModeConfig } from "./types";
16
+ export declare const FAKE_DOMAIN_PATTERNS: RegExp[];
17
+ export declare const FAKE_RESPONSE_PATTERNS: {
18
+ pattern: RegExp;
19
+ name: string;
20
+ }[];
21
+ export declare const SILENT_FALLBACK_PATTERNS: {
22
+ pattern: RegExp;
23
+ name: string;
24
+ }[];
25
+ export declare const DEFAULT_FAKE_PATTERNS: FakePattern[];
26
+ export declare class RealityScanner {
27
+ private config;
28
+ private trafficClassifier;
29
+ private fakeSuccessDetector;
30
+ private authEnforcer;
31
+ constructor(config?: Partial<RealityModeConfig>);
32
+ /**
33
+ * Generate Playwright test code for Reality Mode scanning
34
+ */
35
+ generatePlaywrightTest(config: {
36
+ baseUrl: string;
37
+ clickPaths: string[][];
38
+ outputDir: string;
39
+ }): string;
40
+ /**
41
+ * Post-process the replay to apply advanced detection logic
42
+ */
43
+ processReplay(replay: ReplayStep[], authViolations?: any[]): RealityModeResult;
44
+ generateReport(result: RealityModeResult): string;
45
+ generateDefaultClickPaths(): string[][];
46
+ }
47
+ export declare const realityScanner: RealityScanner;
48
+ //# sourceMappingURL=reality-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reality-scanner.d.ts","sourceRoot":"","sources":["../../src/reality-mode/reality-scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH,OAAO,EACL,WAAW,EAKX,UAAU,EACV,iBAAiB,EACjB,iBAAiB,EAGlB,MAAM,SAAS,CAAC;AAGjB,eAAO,MAAM,oBAAoB,UAgBhC,CAAC;AAEF,eAAO,MAAM,sBAAsB;;;GAmBlC,CAAC;AAEF,eAAO,MAAM,wBAAwB;;;GAUpC,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,WAAW,EA8E9C,CAAC;AAEF,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,YAAY,CAAe;gBAEvB,MAAM,GAAE,OAAO,CAAC,iBAAiB,CAAM;IAgBnD;;OAEG;IACH,sBAAsB,CAAC,MAAM,EAAE;QAC7B,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC;QACvB,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,MAAM;IAwMV;;OAEG;IACH,aAAa,CACX,MAAM,EAAE,UAAU,EAAE,EACpB,cAAc,GAAE,GAAG,EAAO,GACzB,iBAAiB;IAgJpB,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM;IAKjD,yBAAyB,IAAI,MAAM,EAAE,EAAE;CAwBxC;AAED,eAAO,MAAM,cAAc,gBAAuB,CAAC"}