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,60 @@
1
+ /**
2
+ * App Surface Discovery
3
+ *
4
+ * Discovers all testable elements in the app:
5
+ * - Routes (from links, router config, redirects)
6
+ * - Interactive elements (buttons, links, tabs, accordions)
7
+ * - Forms (with their fields and validation)
8
+ * - API endpoints (from network interception)
9
+ */
10
+ import type { Page } from "@playwright/test";
11
+ import type { AppSurface, DiscoveredRoute, DiscoveredAPI } from "./types";
12
+ export declare class SurfaceDiscovery {
13
+ private surface;
14
+ private visitedUrls;
15
+ private discoveredSelectors;
16
+ private baseUrl;
17
+ constructor(baseUrl: string);
18
+ /**
19
+ * Main discovery entry point - crawls the page and discovers everything
20
+ */
21
+ discoverPage(page: Page): Promise<AppSurface>;
22
+ /**
23
+ * Discover all navigable routes from the current page
24
+ */
25
+ private discoverRoutes;
26
+ /**
27
+ * Discover all interactive elements on the page
28
+ */
29
+ private discoverElements;
30
+ /**
31
+ * Discover all forms on the page
32
+ */
33
+ private discoverForms;
34
+ /**
35
+ * Add an API call discovered via network interception
36
+ */
37
+ addDiscoveredAPI(api: DiscoveredAPI): void;
38
+ /**
39
+ * Add a route discovered via redirect or API call
40
+ */
41
+ addDiscoveredRoute(route: DiscoveredRoute): void;
42
+ /**
43
+ * Build a stable selector for an element
44
+ */
45
+ private buildSelector;
46
+ /**
47
+ * Get the current surface
48
+ */
49
+ getSurface(): AppSurface;
50
+ /**
51
+ * Get discovery stats
52
+ */
53
+ getStats(): {
54
+ routes: number;
55
+ elements: number;
56
+ forms: number;
57
+ apis: number;
58
+ };
59
+ }
60
+ //# sourceMappingURL=surface-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface-discovery.d.ts","sourceRoot":"","sources":["../../../src/reality-mode/explorer/surface-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAmC7C,OAAO,KAAK,EACV,UAAU,EACV,eAAe,EAGf,aAAa,EAEd,MAAM,SAAS,CAAC;AAyBjB,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAMb;IAEF,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,MAAM;IAI3B;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC;IAkBnD;;OAEG;YACW,cAAc;IAsE5B;;OAEG;YACW,gBAAgB;IAiK9B;;OAEG;YACW,aAAa;IA4E3B;;OAEG;IACH,gBAAgB,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI;IAU1C;;OAEG;IACH,kBAAkB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAOhD;;OAEG;IACH,OAAO,CAAC,aAAa;IAiBrB;;OAEG;IACH,UAAU,IAAI,UAAU;IAIxB;;OAEG;IACH,QAAQ,IAAI;QACV,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd;CAQF"}
@@ -0,0 +1,357 @@
1
+ /**
2
+ * App Surface Discovery
3
+ *
4
+ * Discovers all testable elements in the app:
5
+ * - Routes (from links, router config, redirects)
6
+ * - Interactive elements (buttons, links, tabs, accordions)
7
+ * - Forms (with their fields and validation)
8
+ * - API endpoints (from network interception)
9
+ */
10
+ // Patterns that indicate destructive actions
11
+ const DESTRUCTIVE_PATTERNS = [
12
+ /delete/i,
13
+ /remove/i,
14
+ /destroy/i,
15
+ /cancel.*subscription/i,
16
+ /deactivate/i,
17
+ /terminate/i,
18
+ /close.*account/i,
19
+ /reset.*all/i,
20
+ ];
21
+ // Patterns that indicate auth-required routes
22
+ const AUTH_ROUTE_PATTERNS = [
23
+ /\/admin/i,
24
+ /\/dashboard/i,
25
+ /\/settings/i,
26
+ /\/profile/i,
27
+ /\/account/i,
28
+ /\/billing/i,
29
+ /\/api\/.*private/i,
30
+ ];
31
+ export class SurfaceDiscovery {
32
+ surface = {
33
+ routes: [],
34
+ elements: [],
35
+ forms: [],
36
+ apis: [],
37
+ timestamp: new Date().toISOString(),
38
+ };
39
+ visitedUrls = new Set();
40
+ discoveredSelectors = new Set();
41
+ baseUrl;
42
+ constructor(baseUrl) {
43
+ this.baseUrl = baseUrl;
44
+ }
45
+ /**
46
+ * Main discovery entry point - crawls the page and discovers everything
47
+ */
48
+ async discoverPage(page) {
49
+ const currentUrl = page.url();
50
+ // Discover routes from links
51
+ await this.discoverRoutes(page);
52
+ // Discover interactive elements
53
+ await this.discoverElements(page, currentUrl);
54
+ // Discover forms
55
+ await this.discoverForms(page, currentUrl);
56
+ // API discovery happens via network interception (setup separately)
57
+ this.surface.timestamp = new Date().toISOString();
58
+ return this.surface;
59
+ }
60
+ /**
61
+ * Discover all navigable routes from the current page
62
+ */
63
+ async discoverRoutes(page) {
64
+ // Get all links
65
+ const links = await page.$$eval("a[href]", (anchors) => anchors.map((a) => ({
66
+ href: a.getAttribute("href") || "",
67
+ text: a.textContent?.trim() || "",
68
+ })));
69
+ for (const link of links) {
70
+ const href = link.href;
71
+ // Skip external links, anchors, javascript
72
+ if (!href ||
73
+ href.startsWith("#") ||
74
+ href.startsWith("javascript:") ||
75
+ href.startsWith("mailto:") ||
76
+ href.startsWith("tel:")) {
77
+ continue;
78
+ }
79
+ // Normalize URL
80
+ let fullUrl;
81
+ try {
82
+ fullUrl = new URL(href, this.baseUrl).pathname;
83
+ }
84
+ catch {
85
+ continue;
86
+ }
87
+ // Check if already discovered
88
+ if (this.visitedUrls.has(fullUrl))
89
+ continue;
90
+ this.visitedUrls.add(fullUrl);
91
+ const route = {
92
+ path: fullUrl,
93
+ method: "GET",
94
+ source: "link",
95
+ requiresAuth: AUTH_ROUTE_PATTERNS.some((p) => p.test(fullUrl)),
96
+ visited: false,
97
+ };
98
+ this.surface.routes.push(route);
99
+ }
100
+ // Also check for Next.js/React Router links
101
+ const routerLinks = await page.$$eval('[data-href], [href^="/"]', (elements) => elements.map((el) => ({
102
+ href: el.getAttribute("data-href") || el.getAttribute("href") || "",
103
+ })));
104
+ for (const link of routerLinks) {
105
+ const path = link.href;
106
+ if (!path || this.visitedUrls.has(path))
107
+ continue;
108
+ this.visitedUrls.add(path);
109
+ this.surface.routes.push({
110
+ path,
111
+ method: "GET",
112
+ source: "router",
113
+ requiresAuth: AUTH_ROUTE_PATTERNS.some((p) => p.test(path)),
114
+ visited: false,
115
+ });
116
+ }
117
+ }
118
+ /**
119
+ * Discover all interactive elements on the page
120
+ */
121
+ async discoverElements(page, currentPage) {
122
+ // Buttons
123
+ const buttons = await page.$$eval('button, [role="button"], input[type="submit"], input[type="button"]', (elements) => elements.map((el, idx) => ({
124
+ tag: el.tagName.toLowerCase(),
125
+ text: el.textContent?.trim() || el.getAttribute("value") || "",
126
+ id: el.id || "",
127
+ className: el.className || "",
128
+ type: el.getAttribute("type") || "",
129
+ ariaLabel: el.getAttribute("aria-label") || "",
130
+ dataTestId: el.getAttribute("data-testid") || "",
131
+ disabled: el.disabled,
132
+ idx,
133
+ })));
134
+ for (const btn of buttons) {
135
+ if (btn.disabled)
136
+ continue;
137
+ const selector = this.buildSelector(btn);
138
+ if (this.discoveredSelectors.has(selector))
139
+ continue;
140
+ this.discoveredSelectors.add(selector);
141
+ const text = btn.text || btn.ariaLabel || btn.dataTestId || `Button ${btn.idx}`;
142
+ const isDestructive = DESTRUCTIVE_PATTERNS.some((p) => p.test(text));
143
+ this.surface.elements.push({
144
+ id: `btn-${this.surface.elements.length}`,
145
+ selector,
146
+ type: "button",
147
+ text,
148
+ page: currentPage,
149
+ isDestructive,
150
+ tested: false,
151
+ });
152
+ }
153
+ // Modal triggers
154
+ const modalTriggers = await page.$$eval('[data-toggle="modal"], [aria-haspopup="dialog"], [aria-controls*="modal"]', (elements) => elements.map((el, idx) => ({
155
+ tag: el.tagName.toLowerCase(),
156
+ text: el.textContent?.trim() || "",
157
+ id: el.id || "",
158
+ ariaLabel: el.getAttribute("aria-label") || "",
159
+ dataTestId: el.getAttribute("data-testid") || "",
160
+ idx,
161
+ })));
162
+ for (const trigger of modalTriggers) {
163
+ const selector = this.buildSelector(trigger);
164
+ if (this.discoveredSelectors.has(selector))
165
+ continue;
166
+ this.discoveredSelectors.add(selector);
167
+ this.surface.elements.push({
168
+ id: `modal-${this.surface.elements.length}`,
169
+ selector,
170
+ type: "modal-trigger",
171
+ text: trigger.text || trigger.ariaLabel || "Modal trigger",
172
+ page: currentPage,
173
+ isDestructive: false,
174
+ tested: false,
175
+ });
176
+ }
177
+ // Dropdowns
178
+ const dropdowns = await page.$$eval('[role="combobox"], [aria-haspopup="listbox"], select, [data-dropdown]', (elements) => elements.map((el, idx) => ({
179
+ tag: el.tagName.toLowerCase(),
180
+ text: el.textContent?.trim().slice(0, 50) || "",
181
+ id: el.id || "",
182
+ ariaLabel: el.getAttribute("aria-label") || "",
183
+ idx,
184
+ })));
185
+ for (const dropdown of dropdowns) {
186
+ const selector = this.buildSelector(dropdown);
187
+ if (this.discoveredSelectors.has(selector))
188
+ continue;
189
+ this.discoveredSelectors.add(selector);
190
+ this.surface.elements.push({
191
+ id: `dropdown-${this.surface.elements.length}`,
192
+ selector,
193
+ type: "dropdown",
194
+ text: dropdown.ariaLabel || dropdown.text || "Dropdown",
195
+ page: currentPage,
196
+ isDestructive: false,
197
+ tested: false,
198
+ });
199
+ }
200
+ // Tabs
201
+ const tabs = await page.$$eval('[role="tab"], [data-tab], .tab', (elements) => elements.map((el, idx) => ({
202
+ tag: el.tagName.toLowerCase(),
203
+ text: el.textContent?.trim() || "",
204
+ id: el.id || "",
205
+ ariaLabel: el.getAttribute("aria-label") || "",
206
+ idx,
207
+ })));
208
+ for (const tab of tabs) {
209
+ const selector = this.buildSelector(tab);
210
+ if (this.discoveredSelectors.has(selector))
211
+ continue;
212
+ this.discoveredSelectors.add(selector);
213
+ this.surface.elements.push({
214
+ id: `tab-${this.surface.elements.length}`,
215
+ selector,
216
+ type: "tab",
217
+ text: tab.text || tab.ariaLabel || "Tab",
218
+ page: currentPage,
219
+ isDestructive: false,
220
+ tested: false,
221
+ });
222
+ }
223
+ // Accordions
224
+ const accordions = await page.$$eval("[data-accordion], [aria-expanded], details > summary", (elements) => elements.map((el, idx) => ({
225
+ tag: el.tagName.toLowerCase(),
226
+ text: el.textContent?.trim().slice(0, 50) || "",
227
+ id: el.id || "",
228
+ ariaLabel: el.getAttribute("aria-label") || "",
229
+ idx,
230
+ })));
231
+ for (const accordion of accordions) {
232
+ const selector = this.buildSelector(accordion);
233
+ if (this.discoveredSelectors.has(selector))
234
+ continue;
235
+ this.discoveredSelectors.add(selector);
236
+ this.surface.elements.push({
237
+ id: `accordion-${this.surface.elements.length}`,
238
+ selector,
239
+ type: "accordion",
240
+ text: accordion.text || "Accordion",
241
+ page: currentPage,
242
+ isDestructive: false,
243
+ tested: false,
244
+ });
245
+ }
246
+ }
247
+ /**
248
+ * Discover all forms on the page
249
+ */
250
+ async discoverForms(page, currentPage) {
251
+ const forms = await page.$$eval("form", (formElements) => formElements.map((form, idx) => {
252
+ const fields = [];
253
+ // Get all input fields
254
+ form
255
+ .querySelectorAll("input, textarea, select")
256
+ .forEach((field, fieldIdx) => {
257
+ const input = field;
258
+ fields.push({
259
+ name: input.name || input.id || `field-${fieldIdx}`,
260
+ type: input.type || field.tagName.toLowerCase(),
261
+ required: input.required,
262
+ placeholder: input.placeholder || "",
263
+ pattern: input.pattern || "",
264
+ selector: input.id ? `#${input.id}` : `[name="${input.name}"]`,
265
+ });
266
+ });
267
+ // Find submit button
268
+ const submitBtn = form.querySelector('button[type="submit"], input[type="submit"]');
269
+ return {
270
+ id: form.id || `form-${idx}`,
271
+ action: form.action || "",
272
+ method: form.method?.toUpperCase() || "POST",
273
+ fields,
274
+ submitSelector: submitBtn
275
+ ? submitBtn.id
276
+ ? `#${submitBtn.id}`
277
+ : 'button[type="submit"]'
278
+ : undefined,
279
+ idx,
280
+ };
281
+ }));
282
+ for (const formData of forms) {
283
+ const selector = formData.id
284
+ ? `#${formData.id}`
285
+ : `form:nth-of-type(${formData.idx + 1})`;
286
+ const form = {
287
+ id: `form-${this.surface.forms.length}`,
288
+ selector,
289
+ page: currentPage,
290
+ action: formData.action,
291
+ method: formData.method,
292
+ fields: formData.fields.map((f) => ({
293
+ name: f.name,
294
+ type: f.type,
295
+ required: f.required,
296
+ selector: f.selector,
297
+ placeholder: f.placeholder,
298
+ pattern: f.pattern,
299
+ })),
300
+ submitButton: formData.submitSelector,
301
+ tested: false,
302
+ };
303
+ this.surface.forms.push(form);
304
+ }
305
+ }
306
+ /**
307
+ * Add an API call discovered via network interception
308
+ */
309
+ addDiscoveredAPI(api) {
310
+ // Avoid duplicates
311
+ const exists = this.surface.apis.some((a) => a.url === api.url && a.method === api.method);
312
+ if (!exists) {
313
+ this.surface.apis.push(api);
314
+ }
315
+ }
316
+ /**
317
+ * Add a route discovered via redirect or API call
318
+ */
319
+ addDiscoveredRoute(route) {
320
+ if (!this.visitedUrls.has(route.path)) {
321
+ this.visitedUrls.add(route.path);
322
+ this.surface.routes.push(route);
323
+ }
324
+ }
325
+ /**
326
+ * Build a stable selector for an element
327
+ */
328
+ buildSelector(el) {
329
+ // Prefer stable selectors
330
+ if (el.dataTestId)
331
+ return `[data-testid="${el.dataTestId}"]`;
332
+ if (el.id)
333
+ return `#${el.id}`;
334
+ if (el.ariaLabel)
335
+ return `[aria-label="${el.ariaLabel}"]`;
336
+ // Fallback to nth-of-type
337
+ return `${el.tag || "button"}:nth-of-type(${(el.idx || 0) + 1})`;
338
+ }
339
+ /**
340
+ * Get the current surface
341
+ */
342
+ getSurface() {
343
+ return this.surface;
344
+ }
345
+ /**
346
+ * Get discovery stats
347
+ */
348
+ getStats() {
349
+ return {
350
+ routes: this.surface.routes.length,
351
+ elements: this.surface.elements.length,
352
+ forms: this.surface.forms.length,
353
+ apis: this.surface.apis.length,
354
+ };
355
+ }
356
+ }
357
+ //# sourceMappingURL=surface-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface-discovery.js","sourceRoot":"","sources":["../../../src/reality-mode/explorer/surface-discovery.ts"],"names":[],"mappings":"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"}