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,233 @@
1
+ export class ReportGenerator {
2
+ generateHtml(result) {
3
+ let verdictDisplay = "GO";
4
+ let verdictColor = "#10b981"; // Green
5
+ let verdictIcon = "✅";
6
+ if (result.verdict === "fake") {
7
+ verdictDisplay = "NO-GO";
8
+ verdictColor = "#ef4444"; // Red
9
+ verdictIcon = "🛑";
10
+ }
11
+ else if (result.verdict === "suspicious") {
12
+ verdictDisplay = "WARN";
13
+ verdictColor = "#f59e0b"; // Amber
14
+ verdictIcon = "⚠️";
15
+ }
16
+ return `<!DOCTYPE html>
17
+ <html lang="en">
18
+ <head>
19
+ <meta charset="UTF-8">
20
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
21
+ <title>Reality Mode Report</title>
22
+ <style>
23
+ body { font-family: -apple-system, system-ui, sans-serif; margin: 0; padding: 0; background: #f9fafb; color: #1f2937; }
24
+ .container { max-width: 1000px; margin: 0 auto; padding: 2rem; }
25
+ .header { background: white; padding: 2rem; border-radius: 0.5rem; box-shadow: 0 1px 3px rgba(0,0,0,0.1); margin-bottom: 2rem; }
26
+ .verdict { font-size: 2.5rem; font-weight: 800; color: ${verdictColor}; display: flex; align-items: center; gap: 0.75rem; letter-spacing: -0.025em; }
27
+ .score-badge { background: ${verdictColor}; color: white; padding: 0.25rem 0.75rem; border-radius: 9999px; font-size: 1rem; font-weight: bold; }
28
+ .section { background: white; padding: 1.5rem; border-radius: 0.5rem; box-shadow: 0 1px 3px rgba(0,0,0,0.1); margin-bottom: 1.5rem; }
29
+ .section-title { font-size: 1.25rem; font-weight: bold; margin-bottom: 1rem; border-bottom: 1px solid #e5e7eb; padding-bottom: 0.5rem; }
30
+ .detection { border: 1px solid #e5e7eb; border-radius: 0.375rem; padding: 1rem; margin-bottom: 1rem; border-left: 4px solid #ef4444; }
31
+ .detection.warning { border-left-color: #f59e0b; }
32
+ .detection-title { font-weight: bold; display: flex; justify-content: space-between; align-items: center; }
33
+ .evidence { background: #f3f4f6; padding: 0.75rem; border-radius: 0.25rem; margin-top: 0.5rem; font-family: monospace; font-size: 0.875rem; overflow-x: auto; }
34
+ .summary-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1rem; }
35
+ .summary-item { background: #f3f4f6; padding: 1rem; border-radius: 0.375rem; text-align: center; }
36
+ .summary-value { font-size: 1.5rem; font-weight: bold; }
37
+ .summary-label { color: #6b7280; font-size: 0.875rem; }
38
+ .replay-step { border-left: 2px solid #d1d5db; padding-left: 1rem; margin-bottom: 1rem; position: relative; }
39
+ .replay-step::before { content: ''; position: absolute; left: -5px; top: 0; width: 8px; height: 8px; border-radius: 50%; background: #9ca3af; }
40
+ .replay-step.request::before { background: #3b82f6; }
41
+ .replay-step.action::before { background: #10b981; }
42
+ .replay-step.detection::before { background: #ef4444; }
43
+ .timestamp { color: #9ca3af; font-size: 0.75rem; }
44
+ .failure-chip { display: inline-flex; align-items: center; background: #fee2e2; color: #991b1b; padding: 0.125rem 0.5rem; border-radius: 0.25rem; font-size: 0.75rem; font-weight: bold; margin-right: 0.5rem; text-transform: uppercase; letter-spacing: 0.05em; }
45
+ .failure-chip.auth { background: #fef3c7; color: #92400e; } /* Amber for Auth */
46
+ .failure-chip.schema { background: #e0e7ff; color: #1e40af; } /* Blue for Schema */
47
+ </style>
48
+ </head>
49
+ <body>
50
+ <div class="container">
51
+ <div class="header">
52
+ <div style="display: flex; justify-content: space-between; align-items: center;">
53
+ <div>
54
+ <h1 style="margin: 0 0 0.5rem 0; font-size: 1rem; color: #6b7280; text-transform: uppercase;">Reality Check</h1>
55
+ <div class="verdict">${verdictIcon} ${verdictDisplay}</div>
56
+ </div>
57
+ <div class="score-badge">Score: ${result.score}/100</div>
58
+ </div>
59
+ <p style="margin-top: 1rem; color: #6b7280;">Generated: ${result.timestamp}</p>
60
+ </div>
61
+
62
+ <div class="section">
63
+ <h2 class="section-title">Summary</h2>
64
+ <div class="summary-grid">
65
+ <div class="summary-item">
66
+ <div class="summary-value">${result.summary.totalRequests}</div>
67
+ <div class="summary-label">Total Requests</div>
68
+ </div>
69
+ <div class="summary-item">
70
+ <div class="summary-value">${result.summary.fakeRequests}</div>
71
+ <div class="summary-label">Fake/Mock Requests</div>
72
+ </div>
73
+ <div class="summary-item">
74
+ <div class="summary-value">${result.summary.criticalIssues}</div>
75
+ <div class="summary-label">Critical Issues</div>
76
+ </div>
77
+ <div class="summary-item">
78
+ <div class="summary-value">${result.summary.warnings}</div>
79
+ <div class="summary-label">Warnings</div>
80
+ </div>
81
+ </div>
82
+ </div>
83
+
84
+ ${this.renderDetections(result)}
85
+ ${this.renderFakeSuccess(result)}
86
+ ${this.renderTrafficAnalysis(result)}
87
+ ${this.renderAuthViolations(result)}
88
+
89
+ <div class="section">
90
+ <h2 class="section-title">Flight Recorder Replay</h2>
91
+ <div class="replay-log">
92
+ ${result.replay.map((step) => this.renderReplayStep(step)).join("")}
93
+ </div>
94
+ </div>
95
+ </div>
96
+ </body>
97
+ </html>`;
98
+ }
99
+ getBrandedChip(text) {
100
+ const t = text.toLowerCase();
101
+ if (t.includes("mock backend"))
102
+ return '<span class="failure-chip">MOCK BACKEND</span>';
103
+ if (t.includes("fake success"))
104
+ return '<span class="failure-chip">FAKE SUCCESS</span>';
105
+ if (t.includes("no-wire"))
106
+ return '<span class="failure-chip">NO-WIRE UI</span>';
107
+ if (t.includes("auth mirage"))
108
+ return '<span class="failure-chip auth">AUTH MIRAGE</span>';
109
+ if (t.includes("schema drift") || t.includes("missing wiring"))
110
+ return '<span class="failure-chip schema">SCHEMA DRIFT</span>';
111
+ return "";
112
+ }
113
+ renderDetections(result) {
114
+ if (result.detections.length === 0)
115
+ return "";
116
+ return `
117
+ <div class="section">
118
+ <h2 class="section-title">Issues Detected</h2>
119
+ ${result.detections
120
+ .map((d) => `
121
+ <div class="detection ${d.pattern.severity === "warning" ? "warning" : ""}">
122
+ <div class="detection-title">
123
+ <span>${this.getBrandedChip(d.pattern.name)} ${d.pattern.name}</span>
124
+ <span style="font-size: 0.75rem; text-transform: uppercase; color: #6b7280;">${d.pattern.severity}</span>
125
+ </div>
126
+ <p>${d.pattern.description}</p>
127
+ <div class="evidence">
128
+ ${d.evidence}<br>
129
+ ${d.request ? `URL: ${d.request.url}` : ""}
130
+ ${d.response ? `URL: ${d.response.url}` : ""}
131
+ </div>
132
+ </div>
133
+ `)
134
+ .join("")}
135
+ </div>`;
136
+ }
137
+ renderFakeSuccess(result) {
138
+ const fakes = result.fakeSuccessAnalysis?.filter((f) => f.isFake) || [];
139
+ if (fakes.length === 0)
140
+ return "";
141
+ return `
142
+ <div class="section">
143
+ <h2 class="section-title">🚨 Fake Success Detected</h2>
144
+ <p style="color: #ef4444; margin-bottom: 1rem;">Actions appeared to succeed but triggered no backend persistence.</p>
145
+ ${fakes
146
+ .map((f) => `
147
+ <div class="detection">
148
+ <div class="detection-title"><span class="failure-chip">FAKE SUCCESS</span> Action Failed Persistence</div>
149
+ <div class="evidence">${f.evidence.join("<br>")}</div>
150
+ </div>
151
+ `)
152
+ .join("")}
153
+ </div>`;
154
+ }
155
+ renderTrafficAnalysis(result) {
156
+ const red = result.trafficAnalysis?.filter((t) => t.verdict === "red") || [];
157
+ const yellow = result.trafficAnalysis?.filter((t) => t.verdict === "yellow") || [];
158
+ const issues = [...red, ...yellow];
159
+ if (issues.length === 0)
160
+ return "";
161
+ return `
162
+ <div class="section">
163
+ <h2 class="section-title">Traffic Analysis Issues</h2>
164
+ ${issues
165
+ .map((t) => `
166
+ <div class="detection ${t.verdict === "yellow" ? "warning" : ""}">
167
+ <div class="detection-title">
168
+ <span>${this.getBrandedChip(t.reasons.join(" "))} Traffic Analysis: ${t.verdict.toUpperCase()}</span>
169
+ </div>
170
+ <div class="evidence">${t.reasons.join("<br>")}</div>
171
+ </div>
172
+ `)
173
+ .join("")}
174
+ </div>`;
175
+ }
176
+ renderAuthViolations(result) {
177
+ if (!result.authViolations || result.authViolations.length === 0)
178
+ return "";
179
+ return `
180
+ <div class="section">
181
+ <h2 class="section-title">🔐 Auth Violations</h2>
182
+ ${result.authViolations
183
+ .map((v) => `
184
+ <div class="detection">
185
+ <div class="detection-title">
186
+ <span><span class="failure-chip auth">AUTH MIRAGE</span> ${v.type}</span>
187
+ </div>
188
+ <div class="evidence">
189
+ Route: ${v.route}<br>
190
+ Status: ${v.status} (Expected 401/403/Redirect)
191
+ </div>
192
+ </div>
193
+ `)
194
+ .join("")}
195
+ </div>`;
196
+ }
197
+ renderReplayStep(step) {
198
+ let content = "";
199
+ let className = "replay-step";
200
+ if (step.type === "request") {
201
+ className += " request";
202
+ content = `<strong>Request:</strong> ${step.data.method} ${step.data.url}`;
203
+ }
204
+ else if (step.type === "response") {
205
+ className += " request"; // group with request visually
206
+ content = `<strong>Response:</strong> ${step.data.status} ${step.data.url}`;
207
+ }
208
+ else if (step.type === "action") {
209
+ className += " action";
210
+ content = `<strong>Action:</strong> ${step.data.type} ${step.data.selector || step.data.url}`;
211
+ }
212
+ else if (step.type === "console") {
213
+ className += " console";
214
+ const isError = step.data.type === "error";
215
+ const color = isError ? "#ef4444" : "#6b7280";
216
+ content = `<strong style="color: ${color}">Console ${step.data.type}:</strong> <span style="font-family: monospace">${step.data.text}</span>`;
217
+ }
218
+ if (step.detections && step.detections.length > 0) {
219
+ className += " detection";
220
+ content += `<div style="color: #ef4444; font-size: 0.875rem; margin-top: 0.25rem;">⚠️ Issue detected here</div>`;
221
+ }
222
+ if (step.screenshot) {
223
+ content += `<div style="margin-top: 0.5rem;"><img src="./${step.screenshot}" style="max-width: 100%; border: 1px solid #ddd; border-radius: 4px; max-height: 300px; cursor: pointer;" onclick="this.style.maxHeight='none'" loading="lazy" alt="Step Screenshot"></div>`;
224
+ }
225
+ return `
226
+ <div class="${className}">
227
+ <div class="timestamp">${(new Date(step.timestamp || 0).toISOString().split("T")[1] || "").slice(0, -1)}</div>
228
+ <div>${content}</div>
229
+ </div>
230
+ `;
231
+ }
232
+ }
233
+ //# sourceMappingURL=report-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-generator.js","sourceRoot":"","sources":["../../src/reality-mode/report-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { InterceptedRequest, InterceptedResponse, FakePattern, TrafficClassification } from "./types";
2
+ export declare class TrafficClassifier {
3
+ private fakePatterns;
4
+ constructor(patterns: FakePattern[]);
5
+ /**
6
+ * Classify a single network interaction (request + response)
7
+ */
8
+ classify(request: InterceptedRequest, response?: InterceptedResponse): TrafficClassification;
9
+ /**
10
+ * Analyze consistency across multiple runs (stateful check)
11
+ */
12
+ classifyConsistency(currentResponse: InterceptedResponse, previousResponse?: InterceptedResponse): TrafficClassification;
13
+ }
14
+ //# sourceMappingURL=traffic-classifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traffic-classifier.d.ts","sourceRoot":"","sources":["../../src/reality-mode/traffic-classifier.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,EACX,qBAAqB,EAEtB,MAAM,SAAS,CAAC;AAEjB,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,YAAY,CAAgB;gBAExB,QAAQ,EAAE,WAAW,EAAE;IAInC;;OAEG;IACH,QAAQ,CACN,OAAO,EAAE,kBAAkB,EAC3B,QAAQ,CAAC,EAAE,mBAAmB,GAC7B,qBAAqB;IA6GxB;;OAEG;IACH,mBAAmB,CACjB,eAAe,EAAE,mBAAmB,EACpC,gBAAgB,CAAC,EAAE,mBAAmB,GACrC,qBAAqB;CAgCzB"}
@@ -0,0 +1,131 @@
1
+ export class TrafficClassifier {
2
+ fakePatterns;
3
+ constructor(patterns) {
4
+ this.fakePatterns = patterns;
5
+ }
6
+ /**
7
+ * Classify a single network interaction (request + response)
8
+ */
9
+ classify(request, response) {
10
+ const reasons = [];
11
+ let score = 100;
12
+ let verdict = "green";
13
+ // 1. Check for Red Flags (Fake Patterns)
14
+ for (const pattern of this.fakePatterns) {
15
+ if (pattern.detect(request)) {
16
+ score -= pattern.severity === "critical" ? 100 : 20;
17
+ reasons.push(`Mock Backend: Request matches ${pattern.name} (${pattern.description})`);
18
+ }
19
+ if (response && pattern.detect(response)) {
20
+ score -= pattern.severity === "critical" ? 100 : 20;
21
+ reasons.push(`Mock Backend: Response matches ${pattern.name} (${pattern.description})`);
22
+ }
23
+ }
24
+ if (score <= 50) {
25
+ return { verdict: "red", reasons, score: Math.max(0, score) };
26
+ }
27
+ // 2. Check for Yellow Flags (Suspicious)
28
+ // Suspicious: API returns "success" but no data
29
+ if (response && response.body) {
30
+ try {
31
+ const body = JSON.parse(response.body);
32
+ if (body.success === true &&
33
+ !body.data &&
34
+ Object.keys(body).length <= 2) {
35
+ score -= 10;
36
+ reasons.push("Potential No-Wire UI: API returns generic success with no data");
37
+ }
38
+ }
39
+ catch (e) {
40
+ // Ignore parsing errors
41
+ }
42
+ }
43
+ // Suspicious: URL looks like a dev/staging environment but we are running in "production" mode?
44
+ // (Assuming we are looking for production credibility)
45
+ if (request.url.includes("localhost") ||
46
+ request.url.includes("127.0.0.1")) {
47
+ // If we are testing local, this is fine. If testing prod, it's red.
48
+ // Context matters. For now, let's treat localhost as "yellow" unless explicitly allowed.
49
+ // Actually, reality-scanner treats localhost as a fake pattern (critical) in default patterns.
50
+ // So it's already caught above.
51
+ }
52
+ // Suspicious: Non-standard status codes
53
+ if (response && response.status >= 400) {
54
+ // 404/500 on API endpoints -> Red flag (Missing Wiring)
55
+ if (response.url.includes("/api/") ||
56
+ response.url.includes("/graphql") ||
57
+ response.url.includes("/trpc")) {
58
+ score -= 40;
59
+ reasons.push(`Missing Wiring: API Error ${response.status} on ${response.url}`);
60
+ if (response.status === 404)
61
+ verdict = "red";
62
+ }
63
+ else if (response.status === 418 || response.status === 999) {
64
+ score -= 30;
65
+ reasons.push(`Mock Backend: Suspicious HTTP status code ${response.status}`);
66
+ }
67
+ else {
68
+ // Other errors (e.g. 401/403 are handled by AuthEnforcer, but still suspicious if unintended)
69
+ score -= 10;
70
+ reasons.push(`Schema Drift: HTTP Error ${response.status}`);
71
+ }
72
+ }
73
+ // 3. Green Signals (Real Data)
74
+ if (response && response.body) {
75
+ // IDs looking like UUIDs or MongoDB IDs or integer sequences
76
+ if (/"id":\s*["'][a-f0-9-]{36}["']/i.test(response.body)) {
77
+ // UUID found - likely real
78
+ // Boost score slightly if it was lowered by minor things
79
+ if (score < 100)
80
+ score += 5;
81
+ }
82
+ if (/"created_at":\s*["']\d{4}-\d{2}-\d{2}/i.test(response.body)) {
83
+ // ISO Date found
84
+ if (score < 100)
85
+ score += 5;
86
+ }
87
+ }
88
+ // Final Verdict
89
+ if (score < 60)
90
+ verdict = "red";
91
+ else if (score < 90)
92
+ verdict = "yellow";
93
+ else
94
+ verdict = "green";
95
+ return {
96
+ verdict,
97
+ reasons,
98
+ score: Math.min(100, Math.max(0, score)),
99
+ };
100
+ }
101
+ /**
102
+ * Analyze consistency across multiple runs (stateful check)
103
+ */
104
+ classifyConsistency(currentResponse, previousResponse) {
105
+ if (!previousResponse) {
106
+ return { verdict: "green", reasons: ["First run"], score: 100 };
107
+ }
108
+ // Exact body match is suspicious for dynamic data (timestamps, nonces)
109
+ if (currentResponse.body &&
110
+ currentResponse.body === previousResponse.body) {
111
+ // Check if the body looks like it SHOULD have dynamic data
112
+ if (currentResponse.body.includes("timestamp") ||
113
+ currentResponse.body.includes("created_at") ||
114
+ currentResponse.body.includes("nonce")) {
115
+ return {
116
+ verdict: "yellow",
117
+ reasons: [
118
+ "Response body identical across runs despite containing timestamps",
119
+ ],
120
+ score: 70,
121
+ };
122
+ }
123
+ }
124
+ return {
125
+ verdict: "green",
126
+ reasons: ["Data varies or is static static-content"],
127
+ score: 100,
128
+ };
129
+ }
130
+ }
131
+ //# sourceMappingURL=traffic-classifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traffic-classifier.js","sourceRoot":"","sources":["../../src/reality-mode/traffic-classifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ export interface FakePattern {
2
+ id: string;
3
+ name: string;
4
+ description: string;
5
+ severity: "critical" | "warning" | "info";
6
+ detect: (request: InterceptedRequest | InterceptedResponse) => boolean;
7
+ }
8
+ export interface InterceptedRequest {
9
+ type: "request";
10
+ url: string;
11
+ method: string;
12
+ headers: Record<string, string>;
13
+ body?: string;
14
+ timestamp: number;
15
+ }
16
+ export interface InterceptedResponse {
17
+ type: "response";
18
+ url: string;
19
+ status: number;
20
+ headers: Record<string, string>;
21
+ body?: string;
22
+ timestamp: number;
23
+ }
24
+ export interface UserAction {
25
+ type: "click" | "input" | "navigation" | "scroll";
26
+ selector?: string;
27
+ value?: string;
28
+ url?: string;
29
+ timestamp: number;
30
+ screenshot?: string;
31
+ }
32
+ export interface FakeDetection {
33
+ pattern: FakePattern;
34
+ request?: InterceptedRequest;
35
+ response?: InterceptedResponse;
36
+ action?: UserAction;
37
+ timestamp: number;
38
+ evidence: string;
39
+ }
40
+ export interface ReplayStep {
41
+ timestamp: number;
42
+ type: "request" | "response" | "action";
43
+ data: any;
44
+ detections: FakeDetection[];
45
+ screenshot?: string;
46
+ }
47
+ export type TrafficVerdict = "green" | "yellow" | "red";
48
+ export interface TrafficClassification {
49
+ verdict: TrafficVerdict;
50
+ reasons: string[];
51
+ score: number;
52
+ }
53
+ export interface FakeSuccessResult {
54
+ isFake: boolean;
55
+ score: number;
56
+ evidence: string[];
57
+ actionStep?: ReplayStep;
58
+ }
59
+ export interface RealityModeResult {
60
+ verdict: "real" | "fake" | "suspicious";
61
+ score: number;
62
+ detections: FakeDetection[];
63
+ replay: ReplayStep[];
64
+ trafficAnalysis: TrafficClassification[];
65
+ fakeSuccessAnalysis: FakeSuccessResult[];
66
+ authViolations?: {
67
+ route: string;
68
+ status: number;
69
+ type: string;
70
+ }[];
71
+ summary: {
72
+ totalRequests: number;
73
+ fakeRequests: number;
74
+ totalActions: number;
75
+ criticalIssues: number;
76
+ warnings: number;
77
+ };
78
+ timestamp: string;
79
+ duration: number;
80
+ }
81
+ export interface RealityModeConfig {
82
+ baseUrl: string;
83
+ timeout: number;
84
+ patterns: FakePattern[];
85
+ clickPaths: string[][];
86
+ screenshotOnDetection: boolean;
87
+ headless: boolean;
88
+ checkAuth: boolean;
89
+ }
90
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/reality-mode/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/reality-mode/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for Ship Badge Generator
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=ship-badge-generator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ship-badge-generator.test.d.ts","sourceRoot":"","sources":["../../../src/ship-badge/__tests__/ship-badge-generator.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}