agent-web-interface 4.2.0 → 4.4.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 (265) hide show
  1. package/dist/src/browser/connection-utils.d.ts +48 -0
  2. package/dist/src/browser/connection-utils.d.ts.map +1 -0
  3. package/dist/src/browser/connection-utils.js +129 -0
  4. package/dist/src/browser/connection-utils.js.map +1 -0
  5. package/dist/src/browser/index.d.ts +3 -1
  6. package/dist/src/browser/index.d.ts.map +1 -1
  7. package/dist/src/browser/index.js +2 -1
  8. package/dist/src/browser/index.js.map +1 -1
  9. package/dist/src/browser/session-manager.d.ts +1 -89
  10. package/dist/src/browser/session-manager.d.ts.map +1 -1
  11. package/dist/src/browser/session-manager.js +1 -116
  12. package/dist/src/browser/session-manager.js.map +1 -1
  13. package/dist/src/browser/session-manager.types.d.ts +90 -0
  14. package/dist/src/browser/session-manager.types.d.ts.map +1 -0
  15. package/dist/src/browser/session-manager.types.js +7 -0
  16. package/dist/src/browser/session-manager.types.js.map +1 -0
  17. package/dist/src/form/constraint-extraction.d.ts +31 -0
  18. package/dist/src/form/constraint-extraction.d.ts.map +1 -0
  19. package/dist/src/form/constraint-extraction.js +110 -0
  20. package/dist/src/form/constraint-extraction.js.map +1 -0
  21. package/dist/src/form/field-extractor.d.ts.map +1 -1
  22. package/dist/src/form/field-extractor.js +3 -444
  23. package/dist/src/form/field-extractor.js.map +1 -1
  24. package/dist/src/form/field-state-extractor.d.ts +22 -0
  25. package/dist/src/form/field-state-extractor.d.ts.map +1 -0
  26. package/dist/src/form/field-state-extractor.js +55 -0
  27. package/dist/src/form/field-state-extractor.js.map +1 -0
  28. package/dist/src/form/form-actions.d.ts +45 -0
  29. package/dist/src/form/form-actions.d.ts.map +1 -0
  30. package/dist/src/form/form-actions.js +108 -0
  31. package/dist/src/form/form-actions.js.map +1 -0
  32. package/dist/src/form/form-detector.d.ts +0 -36
  33. package/dist/src/form/form-detector.d.ts.map +1 -1
  34. package/dist/src/form/form-detector.js +11 -376
  35. package/dist/src/form/form-detector.js.map +1 -1
  36. package/dist/src/form/input-clustering.d.ts +15 -0
  37. package/dist/src/form/input-clustering.d.ts.map +1 -0
  38. package/dist/src/form/input-clustering.js +61 -0
  39. package/dist/src/form/input-clustering.js.map +1 -0
  40. package/dist/src/form/intent-inference.d.ts +28 -0
  41. package/dist/src/form/intent-inference.d.ts.map +1 -0
  42. package/dist/src/form/intent-inference.js +137 -0
  43. package/dist/src/form/intent-inference.js.map +1 -0
  44. package/dist/src/form/purpose-inference.d.ts +50 -0
  45. package/dist/src/form/purpose-inference.d.ts.map +1 -0
  46. package/dist/src/form/purpose-inference.js +313 -0
  47. package/dist/src/form/purpose-inference.js.map +1 -0
  48. package/dist/src/form/submit-detection.d.ts +36 -0
  49. package/dist/src/form/submit-detection.d.ts.map +1 -0
  50. package/dist/src/form/submit-detection.js +101 -0
  51. package/dist/src/form/submit-detection.js.map +1 -0
  52. package/dist/src/form/types.d.ts +2 -2
  53. package/dist/src/index.js +65 -48
  54. package/dist/src/index.js.map +1 -1
  55. package/dist/src/observation/observation-accumulator.d.ts +1 -1
  56. package/dist/src/observation/observation-accumulator.js +1 -1
  57. package/dist/src/observation/observer-script.d.ts +1 -1
  58. package/dist/src/observation/observer-script.d.ts.map +1 -1
  59. package/dist/src/observation/observer-script.js +129 -7
  60. package/dist/src/observation/observer-script.js.map +1 -1
  61. package/dist/src/query/disambiguation.d.ts +18 -0
  62. package/dist/src/query/disambiguation.d.ts.map +1 -0
  63. package/dist/src/query/disambiguation.js +123 -0
  64. package/dist/src/query/disambiguation.js.map +1 -0
  65. package/dist/src/query/fuzzy-match.d.ts +17 -0
  66. package/dist/src/query/fuzzy-match.d.ts.map +1 -0
  67. package/dist/src/query/fuzzy-match.js +34 -0
  68. package/dist/src/query/fuzzy-match.js.map +1 -0
  69. package/dist/src/query/index.d.ts +3 -0
  70. package/dist/src/query/index.d.ts.map +1 -1
  71. package/dist/src/query/index.js +6 -0
  72. package/dist/src/query/index.js.map +1 -1
  73. package/dist/src/query/query-engine.d.ts +0 -35
  74. package/dist/src/query/query-engine.d.ts.map +1 -1
  75. package/dist/src/query/query-engine.js +9 -309
  76. package/dist/src/query/query-engine.js.map +1 -1
  77. package/dist/src/query/scoring.d.ts +52 -0
  78. package/dist/src/query/scoring.d.ts.map +1 -0
  79. package/dist/src/query/scoring.js +162 -0
  80. package/dist/src/query/scoring.js.map +1 -0
  81. package/dist/src/server/mcp-server.d.ts.map +1 -1
  82. package/dist/src/server/mcp-server.js +29 -1
  83. package/dist/src/server/mcp-server.js.map +1 -1
  84. package/dist/src/snapshot/element-resolver.d.ts +50 -18
  85. package/dist/src/snapshot/element-resolver.d.ts.map +1 -1
  86. package/dist/src/snapshot/element-resolver.js +180 -101
  87. package/dist/src/snapshot/element-resolver.js.map +1 -1
  88. package/dist/src/snapshot/extractors/ax-extractor.d.ts +1 -1
  89. package/dist/src/snapshot/extractors/ax-extractor.d.ts.map +1 -1
  90. package/dist/src/snapshot/extractors/ax-extractor.js +4 -1
  91. package/dist/src/snapshot/extractors/ax-extractor.js.map +1 -1
  92. package/dist/src/snapshot/extractors/index.d.ts +1 -1
  93. package/dist/src/snapshot/extractors/index.d.ts.map +1 -1
  94. package/dist/src/snapshot/extractors/index.js +1 -1
  95. package/dist/src/snapshot/extractors/index.js.map +1 -1
  96. package/dist/src/snapshot/extractors/region-resolver.d.ts.map +1 -1
  97. package/dist/src/snapshot/extractors/region-resolver.js +8 -0
  98. package/dist/src/snapshot/extractors/region-resolver.js.map +1 -1
  99. package/dist/src/snapshot/extractors/types.d.ts +8 -0
  100. package/dist/src/snapshot/extractors/types.d.ts.map +1 -1
  101. package/dist/src/snapshot/extractors/types.js +16 -0
  102. package/dist/src/snapshot/extractors/types.js.map +1 -1
  103. package/dist/src/snapshot/frame-context.d.ts +68 -0
  104. package/dist/src/snapshot/frame-context.d.ts.map +1 -0
  105. package/dist/src/snapshot/frame-context.js +131 -0
  106. package/dist/src/snapshot/frame-context.js.map +1 -0
  107. package/dist/src/snapshot/heading-index.d.ts +28 -0
  108. package/dist/src/snapshot/heading-index.d.ts.map +1 -0
  109. package/dist/src/snapshot/heading-index.js +108 -0
  110. package/dist/src/snapshot/heading-index.js.map +1 -0
  111. package/dist/src/snapshot/index.d.ts +5 -3
  112. package/dist/src/snapshot/index.d.ts.map +1 -1
  113. package/dist/src/snapshot/index.js +3 -2
  114. package/dist/src/snapshot/index.js.map +1 -1
  115. package/dist/src/snapshot/kind-mapping.d.ts +30 -0
  116. package/dist/src/snapshot/kind-mapping.d.ts.map +1 -0
  117. package/dist/src/snapshot/kind-mapping.js +114 -0
  118. package/dist/src/snapshot/kind-mapping.js.map +1 -0
  119. package/dist/src/snapshot/node-filter.d.ts +31 -0
  120. package/dist/src/snapshot/node-filter.d.ts.map +1 -0
  121. package/dist/src/snapshot/node-filter.js +137 -0
  122. package/dist/src/snapshot/node-filter.js.map +1 -0
  123. package/dist/src/snapshot/node-synthesizer.d.ts +62 -0
  124. package/dist/src/snapshot/node-synthesizer.d.ts.map +1 -0
  125. package/dist/src/snapshot/node-synthesizer.js +185 -0
  126. package/dist/src/snapshot/node-synthesizer.js.map +1 -0
  127. package/dist/src/snapshot/snapshot-compiler.d.ts +2 -36
  128. package/dist/src/snapshot/snapshot-compiler.d.ts.map +1 -1
  129. package/dist/src/snapshot/snapshot-compiler.js +28 -520
  130. package/dist/src/snapshot/snapshot-compiler.js.map +1 -1
  131. package/dist/src/snapshot/snapshot.types.d.ts +7 -2
  132. package/dist/src/snapshot/snapshot.types.d.ts.map +1 -1
  133. package/dist/src/snapshot/snapshot.types.js +9 -0
  134. package/dist/src/snapshot/snapshot.types.js.map +1 -1
  135. package/dist/src/state/actionables-filter.d.ts +5 -0
  136. package/dist/src/state/actionables-filter.d.ts.map +1 -1
  137. package/dist/src/state/actionables-filter.js +22 -3
  138. package/dist/src/state/actionables-filter.js.map +1 -1
  139. package/dist/src/state/diff-engine.js +3 -3
  140. package/dist/src/state/diff-engine.js.map +1 -1
  141. package/dist/src/state/element-registry.d.ts.map +1 -1
  142. package/dist/src/state/element-registry.js +6 -4
  143. package/dist/src/state/element-registry.js.map +1 -1
  144. package/dist/src/state/hash-utils.d.ts +24 -0
  145. package/dist/src/state/hash-utils.d.ts.map +1 -0
  146. package/dist/src/state/hash-utils.js +41 -0
  147. package/dist/src/state/hash-utils.js.map +1 -0
  148. package/dist/src/state/layer-detector.d.ts.map +1 -1
  149. package/dist/src/state/layer-detector.js +15 -286
  150. package/dist/src/state/layer-detector.js.map +1 -1
  151. package/dist/src/state/layer-detectors/drawer-detector.d.ts +32 -0
  152. package/dist/src/state/layer-detectors/drawer-detector.d.ts.map +1 -0
  153. package/dist/src/state/layer-detectors/drawer-detector.js +96 -0
  154. package/dist/src/state/layer-detectors/drawer-detector.js.map +1 -0
  155. package/dist/src/state/layer-detectors/index.d.ts +10 -0
  156. package/dist/src/state/layer-detectors/index.d.ts.map +1 -0
  157. package/dist/src/state/layer-detectors/index.js +10 -0
  158. package/dist/src/state/layer-detectors/index.js.map +1 -0
  159. package/dist/src/state/layer-detectors/modal-detector.d.ts +30 -0
  160. package/dist/src/state/layer-detectors/modal-detector.d.ts.map +1 -0
  161. package/dist/src/state/layer-detectors/modal-detector.js +127 -0
  162. package/dist/src/state/layer-detectors/modal-detector.js.map +1 -0
  163. package/dist/src/state/layer-detectors/popover-detector.d.ts +20 -0
  164. package/dist/src/state/layer-detectors/popover-detector.d.ts.map +1 -0
  165. package/dist/src/state/layer-detectors/popover-detector.js +76 -0
  166. package/dist/src/state/layer-detectors/popover-detector.js.map +1 -0
  167. package/dist/src/state/layer-detectors/toast-detector.d.ts +24 -0
  168. package/dist/src/state/layer-detectors/toast-detector.d.ts.map +1 -0
  169. package/dist/src/state/layer-detectors/toast-detector.js +48 -0
  170. package/dist/src/state/layer-detectors/toast-detector.js.map +1 -0
  171. package/dist/src/state/region-mapping.d.ts +13 -0
  172. package/dist/src/state/region-mapping.d.ts.map +1 -0
  173. package/dist/src/state/region-mapping.js +25 -0
  174. package/dist/src/state/region-mapping.js.map +1 -0
  175. package/dist/src/state/state-manager.d.ts.map +1 -1
  176. package/dist/src/state/state-manager.js +8 -192
  177. package/dist/src/state/state-manager.js.map +1 -1
  178. package/dist/src/state/state-renderer.d.ts.map +1 -1
  179. package/dist/src/state/state-renderer.js +16 -2
  180. package/dist/src/state/state-renderer.js.map +1 -1
  181. package/dist/src/state/types.d.ts +8 -4
  182. package/dist/src/state/types.d.ts.map +1 -1
  183. package/dist/src/state/url-sanitization.d.ts +22 -0
  184. package/dist/src/state/url-sanitization.d.ts.map +1 -0
  185. package/dist/src/state/url-sanitization.js +60 -0
  186. package/dist/src/state/url-sanitization.js.map +1 -0
  187. package/dist/src/state/value-masking.d.ts +36 -0
  188. package/dist/src/state/value-masking.d.ts.map +1 -0
  189. package/dist/src/state/value-masking.js +86 -0
  190. package/dist/src/state/value-masking.js.map +1 -0
  191. package/dist/src/tools/action-context.d.ts +60 -0
  192. package/dist/src/tools/action-context.d.ts.map +1 -0
  193. package/dist/src/tools/action-context.js +78 -0
  194. package/dist/src/tools/action-context.js.map +1 -0
  195. package/dist/src/tools/action-stabilization.d.ts +48 -0
  196. package/dist/src/tools/action-stabilization.d.ts.map +1 -0
  197. package/dist/src/tools/action-stabilization.js +87 -0
  198. package/dist/src/tools/action-stabilization.js.map +1 -0
  199. package/dist/src/tools/browser-tools.d.ts +8 -146
  200. package/dist/src/tools/browser-tools.d.ts.map +1 -1
  201. package/dist/src/tools/browser-tools.js +13 -689
  202. package/dist/src/tools/browser-tools.js.map +1 -1
  203. package/dist/src/tools/canvas-tools.d.ts +32 -0
  204. package/dist/src/tools/canvas-tools.d.ts.map +1 -0
  205. package/dist/src/tools/canvas-tools.js +370 -0
  206. package/dist/src/tools/canvas-tools.js.map +1 -0
  207. package/dist/src/tools/effect-tracker.d.ts +25 -0
  208. package/dist/src/tools/effect-tracker.d.ts.map +1 -0
  209. package/dist/src/tools/effect-tracker.js +69 -0
  210. package/dist/src/tools/effect-tracker.js.map +1 -0
  211. package/dist/src/tools/execute-action.d.ts +1 -31
  212. package/dist/src/tools/execute-action.d.ts.map +1 -1
  213. package/dist/src/tools/execute-action.js +7 -276
  214. package/dist/src/tools/execute-action.js.map +1 -1
  215. package/dist/src/tools/form-tools.d.ts +4 -6
  216. package/dist/src/tools/form-tools.d.ts.map +1 -1
  217. package/dist/src/tools/form-tools.js +10 -42
  218. package/dist/src/tools/form-tools.js.map +1 -1
  219. package/dist/src/tools/index.d.ts +6 -4
  220. package/dist/src/tools/index.d.ts.map +1 -1
  221. package/dist/src/tools/index.js +21 -10
  222. package/dist/src/tools/index.js.map +1 -1
  223. package/dist/src/tools/interaction-tools.d.ts +46 -0
  224. package/dist/src/tools/interaction-tools.d.ts.map +1 -0
  225. package/dist/src/tools/interaction-tools.js +138 -0
  226. package/dist/src/tools/interaction-tools.js.map +1 -0
  227. package/dist/src/tools/navigation-detection.d.ts +31 -0
  228. package/dist/src/tools/navigation-detection.d.ts.map +1 -0
  229. package/dist/src/tools/navigation-detection.js +46 -0
  230. package/dist/src/tools/navigation-detection.js.map +1 -0
  231. package/dist/src/tools/navigation-tools.d.ts +57 -0
  232. package/dist/src/tools/navigation-tools.d.ts.map +1 -0
  233. package/dist/src/tools/navigation-tools.js +178 -0
  234. package/dist/src/tools/navigation-tools.js.map +1 -0
  235. package/dist/src/tools/observation-tools.d.ts +53 -0
  236. package/dist/src/tools/observation-tools.d.ts.map +1 -0
  237. package/dist/src/tools/observation-tools.js +247 -0
  238. package/dist/src/tools/observation-tools.js.map +1 -0
  239. package/dist/src/tools/response-builder.js +2 -2
  240. package/dist/src/tools/response-builder.js.map +1 -1
  241. package/dist/src/tools/stale-element-retry.d.ts +37 -0
  242. package/dist/src/tools/stale-element-retry.d.ts.map +1 -0
  243. package/dist/src/tools/stale-element-retry.js +68 -0
  244. package/dist/src/tools/stale-element-retry.js.map +1 -0
  245. package/dist/src/tools/state-manager-registry.d.ts +26 -0
  246. package/dist/src/tools/state-manager-registry.d.ts.map +1 -0
  247. package/dist/src/tools/state-manager-registry.js +39 -0
  248. package/dist/src/tools/state-manager-registry.js.map +1 -0
  249. package/dist/src/tools/tool-context.d.ts +53 -0
  250. package/dist/src/tools/tool-context.d.ts.map +1 -0
  251. package/dist/src/tools/tool-context.js +119 -0
  252. package/dist/src/tools/tool-context.js.map +1 -0
  253. package/dist/src/tools/tool-result.types.d.ts +16 -1
  254. package/dist/src/tools/tool-result.types.d.ts.map +1 -1
  255. package/dist/src/tools/tool-result.types.js +11 -0
  256. package/dist/src/tools/tool-result.types.js.map +1 -1
  257. package/dist/src/tools/tool-schemas.d.ts +358 -146
  258. package/dist/src/tools/tool-schemas.d.ts.map +1 -1
  259. package/dist/src/tools/tool-schemas.js +142 -19
  260. package/dist/src/tools/tool-schemas.js.map +1 -1
  261. package/dist/src/tools/viewport-tools.d.ts +36 -0
  262. package/dist/src/tools/viewport-tools.d.ts.map +1 -0
  263. package/dist/src/tools/viewport-tools.js +105 -0
  264. package/dist/src/tools/viewport-tools.js.map +1 -0
  265. package/package.json +1 -1
@@ -5,6 +5,10 @@
5
5
  * Only return actionables from the active (topmost) layer.
6
6
  */
7
7
  import { computeEid } from './element-identity.js';
8
+ import { detectModal } from './layer-detectors/modal-detector.js';
9
+ import { detectDrawer } from './layer-detectors/drawer-detector.js';
10
+ import { detectPopover } from './layer-detectors/popover-detector.js';
11
+ import { detectToast } from './layer-detectors/toast-detector.js';
8
12
  // ============================================================================
9
13
  // Layer Detection
10
14
  // ============================================================================
@@ -41,6 +45,12 @@ export function detectLayers(snapshot) {
41
45
  const popoverMatch = detectPopover(node);
42
46
  if (popoverMatch) {
43
47
  candidates.push(popoverMatch);
48
+ continue;
49
+ }
50
+ // Toast detection (lowest priority overlay)
51
+ const toastMatch = detectToast(node);
52
+ if (toastMatch) {
53
+ candidates.push(toastMatch);
44
54
  }
45
55
  }
46
56
  // Sort by z-index (highest first), filter low confidence
@@ -57,8 +67,11 @@ export function detectLayers(snapshot) {
57
67
  isModal: layer.isModal,
58
68
  });
59
69
  }
60
- // Determine active layer (topmost)
61
- const active = stack[stack.length - 1].type;
70
+ // Determine active layer (topmost non-toast layer)
71
+ // Toast layers are non-blocking and should never become the active layer.
72
+ // Main is always at index 0, so the filtered stack is never empty.
73
+ const nonToastStack = stack.filter((l) => l.type !== 'toast');
74
+ const active = nonToastStack[nonToastStack.length - 1].type;
62
75
  // Find focused element
63
76
  const focusEid = detectFocusedElement(snapshot);
64
77
  return {
@@ -69,290 +82,6 @@ export function detectLayers(snapshot) {
69
82
  };
70
83
  }
71
84
  // ============================================================================
72
- // Modal Detection
73
- // ============================================================================
74
- /**
75
- * Detect if node is a modal layer.
76
- *
77
- * Patterns:
78
- * - role="dialog" or role="alertdialog" + aria-modal="true"
79
- * - <dialog open>
80
- * - High z-index (>1000) with dialog role
81
- * - React/Vue portal containers with modal content
82
- *
83
- * @param node - Node to check
84
- * @returns Layer candidate or null
85
- */
86
- function detectModal(node) {
87
- const attrs = node.attributes;
88
- const role = node.attributes?.role;
89
- // Pattern 1: role="dialog" or role="alertdialog" + aria-modal="true"
90
- if ((role === 'dialog' || role === 'alertdialog') && attrs?.['aria-modal'] === 'true') {
91
- return {
92
- type: 'modal',
93
- rootEid: computeEid(node, 'modal'),
94
- zIndex: node.layout.zIndex ?? 0,
95
- isModal: true,
96
- confidence: 1.0,
97
- };
98
- }
99
- // Pattern 2: <dialog> element with open attribute
100
- if (node.kind === 'dialog' && attrs?.open === true) {
101
- return {
102
- type: 'modal',
103
- rootEid: computeEid(node, 'modal'),
104
- zIndex: node.layout.zIndex ?? 0,
105
- isModal: true,
106
- confidence: 0.95,
107
- };
108
- }
109
- // Pattern 3: alertdialog without aria-modal (still modal by nature)
110
- if (role === 'alertdialog') {
111
- return {
112
- type: 'modal',
113
- rootEid: computeEid(node, 'modal'),
114
- zIndex: node.layout.zIndex ?? 0,
115
- isModal: true,
116
- confidence: 0.9,
117
- };
118
- }
119
- // Pattern 4: High z-index dialog (>1000)
120
- if (role === 'dialog' && (node.layout.zIndex ?? 0) > 1000) {
121
- return {
122
- type: 'modal',
123
- rootEid: computeEid(node, 'modal'),
124
- zIndex: node.layout.zIndex ?? 0,
125
- isModal: true,
126
- confidence: 0.8,
127
- };
128
- }
129
- // Pattern 5: Portal container detection (React/Vue/Angular)
130
- // Common portal container patterns
131
- if (isPortalContainer(node, attrs)) {
132
- return {
133
- type: 'modal',
134
- rootEid: computeEid(node, 'modal'),
135
- zIndex: node.layout.zIndex ?? 0,
136
- isModal: true,
137
- confidence: 0.75,
138
- };
139
- }
140
- return null;
141
- }
142
- /**
143
- * Check if node is a portal container (React/Vue/Angular patterns).
144
- *
145
- * @param node - Node to check
146
- * @param attrs - Node attributes
147
- * @returns True if portal container
148
- */
149
- function isPortalContainer(node, attrs) {
150
- const zIndex = node.layout.zIndex ?? 0;
151
- // Must have high z-index
152
- if (zIndex < 100) {
153
- return false;
154
- }
155
- // Check for common portal container attributes/classes
156
- const className = attrs?.class ?? attrs?.className;
157
- if (typeof className === 'string') {
158
- const portalPatterns = [
159
- 'modal',
160
- 'dialog',
161
- 'overlay',
162
- 'portal',
163
- 'ReactModal',
164
- 'MuiModal',
165
- 'chakra-modal',
166
- 'ant-modal',
167
- 'el-dialog', // Element UI
168
- 'v-dialog', // Vuetify
169
- ];
170
- const lowerClassName = className.toLowerCase();
171
- if (portalPatterns.some((p) => lowerClassName.includes(p.toLowerCase()))) {
172
- return true;
173
- }
174
- }
175
- // Check for data attributes indicating portal
176
- const dataPortal = attrs?.['data-portal'];
177
- const dataOverlay = attrs?.['data-overlay'];
178
- const dataModal = attrs?.['data-modal'];
179
- if (dataPortal === true || dataOverlay === true || dataModal === true) {
180
- return true;
181
- }
182
- // Check for aria-hidden siblings pattern (portal often has aria-hidden on root)
183
- // This is detected by high z-index + covering most of viewport
184
- const bbox = node.layout.bbox;
185
- if (bbox && zIndex > 500) {
186
- // If element covers significant viewport area with high z-index
187
- if (bbox.w > 200 && bbox.h > 200) {
188
- return true;
189
- }
190
- }
191
- return false;
192
- }
193
- // ============================================================================
194
- // Drawer Detection
195
- // ============================================================================
196
- /**
197
- * Detect if node is a drawer layer.
198
- *
199
- * Patterns:
200
- * - role="complementary" or role="navigation" + edge-positioned + high z-index
201
- * - Slide-in panel patterns from UI libraries
202
- *
203
- * @param node - Node to check
204
- * @returns Layer candidate or null
205
- */
206
- function detectDrawer(node) {
207
- const role = node.attributes?.role;
208
- const zIndex = node.layout.zIndex ?? 0;
209
- const attrs = node.attributes;
210
- // Must have moderate z-index for overlay drawer
211
- if (zIndex <= 50) {
212
- return null;
213
- }
214
- // Pattern 1: Complementary role with high z-index
215
- if (role === 'complementary' && zIndex > 100) {
216
- return {
217
- type: 'drawer',
218
- rootEid: computeEid(node, 'drawer'),
219
- zIndex,
220
- isModal: false,
221
- confidence: 0.7,
222
- };
223
- }
224
- // Pattern 2: Navigation role with high z-index + edge position
225
- if (role === 'navigation' && zIndex > 100) {
226
- const bbox = node.layout.bbox;
227
- if (bbox && isEdgePositioned(bbox)) {
228
- return {
229
- type: 'drawer',
230
- rootEid: computeEid(node, 'drawer'),
231
- zIndex,
232
- isModal: false,
233
- confidence: 0.75,
234
- };
235
- }
236
- }
237
- // Pattern 3: Common drawer class patterns
238
- const className = attrs?.class ?? attrs?.className;
239
- if (typeof className === 'string' && zIndex > 50) {
240
- const drawerPatterns = [
241
- 'drawer',
242
- 'sidebar',
243
- 'side-nav',
244
- 'sidenav',
245
- 'offcanvas',
246
- 'slide-in',
247
- 'MuiDrawer',
248
- 'ant-drawer',
249
- 'el-drawer',
250
- 'v-navigation-drawer',
251
- ];
252
- const lowerClassName = className.toLowerCase();
253
- if (drawerPatterns.some((p) => lowerClassName.includes(p.toLowerCase()))) {
254
- return {
255
- type: 'drawer',
256
- rootEid: computeEid(node, 'drawer'),
257
- zIndex,
258
- isModal: false,
259
- confidence: 0.7,
260
- };
261
- }
262
- }
263
- return null;
264
- }
265
- /**
266
- * Check if bounding box is edge-positioned (left or right edge).
267
- *
268
- * @param bbox - Bounding box {x, y, w, h}
269
- * @returns True if positioned at edge
270
- */
271
- function isEdgePositioned(bbox) {
272
- // Left edge: x near 0
273
- if (bbox.x < 10) {
274
- return true;
275
- }
276
- // Right edge: x + width near typical viewport widths
277
- // This is a heuristic - ideally we'd have viewport width
278
- const rightEdge = bbox.x + bbox.w;
279
- if (rightEdge > 1200 && bbox.x > 800) {
280
- return true;
281
- }
282
- return false;
283
- }
284
- // ============================================================================
285
- // Popover Detection
286
- // ============================================================================
287
- /**
288
- * Detect if node is a popover layer.
289
- *
290
- * Patterns:
291
- * - role="menu", "listbox", "tooltip", "dialog" (non-modal) + z-index > 100
292
- * - Dropdown/popup class patterns
293
- *
294
- * @param node - Node to check
295
- * @returns Layer candidate or null
296
- */
297
- function detectPopover(node) {
298
- const role = node.attributes?.role;
299
- const zIndex = node.layout.zIndex ?? 0;
300
- const attrs = node.attributes;
301
- if (zIndex <= 100) {
302
- return null;
303
- }
304
- // Pattern 1: Standard popover roles
305
- const popoverRoles = ['menu', 'listbox', 'tooltip', 'tree'];
306
- if (role && popoverRoles.includes(role)) {
307
- return {
308
- type: 'popover',
309
- rootEid: computeEid(node, 'popover'),
310
- zIndex,
311
- isModal: false,
312
- confidence: 0.8,
313
- };
314
- }
315
- // Pattern 2: Non-modal dialog (popup)
316
- if (role === 'dialog' && attrs?.['aria-modal'] !== 'true') {
317
- return {
318
- type: 'popover',
319
- rootEid: computeEid(node, 'popover'),
320
- zIndex,
321
- isModal: false,
322
- confidence: 0.6,
323
- };
324
- }
325
- // Pattern 3: Common popover/dropdown class patterns
326
- const className = attrs?.class ?? attrs?.className;
327
- if (typeof className === 'string') {
328
- const popoverPatterns = [
329
- 'dropdown',
330
- 'popover',
331
- 'popup',
332
- 'tooltip',
333
- 'menu',
334
- 'autocomplete',
335
- 'suggestions',
336
- 'MuiPopover',
337
- 'MuiMenu',
338
- 'ant-dropdown',
339
- 'el-dropdown',
340
- 'el-popover',
341
- ];
342
- const lowerClassName = className.toLowerCase();
343
- if (popoverPatterns.some((p) => lowerClassName.includes(p.toLowerCase()))) {
344
- return {
345
- type: 'popover',
346
- rootEid: computeEid(node, 'popover'),
347
- zIndex,
348
- isModal: false,
349
- confidence: 0.65,
350
- };
351
- }
352
- }
353
- return null;
354
- }
355
- // ============================================================================
356
85
  // Focused Element Detection
357
86
  // ============================================================================
358
87
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"layer-detector.js","sourceRoot":"","sources":["../../../src/state/layer-detector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"layer-detector.js","sourceRoot":"","sources":["../../../src/state/layer-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Drawer Detector
3
+ *
4
+ * Detect drawer layers in the snapshot.
5
+ * Patterns: role="complementary" or "navigation" + edge-positioned + high z-index.
6
+ */
7
+ import type { ReadableNode } from '../../snapshot/snapshot.types.js';
8
+ import type { LayerCandidate } from '../types.js';
9
+ /**
10
+ * Detect if node is a drawer layer.
11
+ *
12
+ * Patterns:
13
+ * - role="complementary" or role="navigation" + edge-positioned + high z-index
14
+ * - Slide-in panel patterns from UI libraries
15
+ *
16
+ * @param node - Node to check
17
+ * @returns Layer candidate or null
18
+ */
19
+ export declare function detectDrawer(node: ReadableNode): LayerCandidate | null;
20
+ /**
21
+ * Check if bounding box is edge-positioned (left or right edge).
22
+ *
23
+ * @param bbox - Bounding box {x, y, w, h}
24
+ * @returns True if positioned at edge
25
+ */
26
+ export declare function isEdgePositioned(bbox: {
27
+ x: number;
28
+ y: number;
29
+ w: number;
30
+ h: number;
31
+ }): boolean;
32
+ //# sourceMappingURL=drawer-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drawer-detector.d.ts","sourceRoot":"","sources":["../../../../src/state/layer-detectors/drawer-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,cAAc,GAAG,IAAI,CAgEtE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAc9F"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Drawer Detector
3
+ *
4
+ * Detect drawer layers in the snapshot.
5
+ * Patterns: role="complementary" or "navigation" + edge-positioned + high z-index.
6
+ */
7
+ import { computeEid } from '../element-identity.js';
8
+ /**
9
+ * Detect if node is a drawer layer.
10
+ *
11
+ * Patterns:
12
+ * - role="complementary" or role="navigation" + edge-positioned + high z-index
13
+ * - Slide-in panel patterns from UI libraries
14
+ *
15
+ * @param node - Node to check
16
+ * @returns Layer candidate or null
17
+ */
18
+ export function detectDrawer(node) {
19
+ const role = node.attributes?.role;
20
+ const zIndex = node.layout.zIndex ?? 0;
21
+ const attrs = node.attributes;
22
+ // Must have moderate z-index for overlay drawer
23
+ if (zIndex <= 50) {
24
+ return null;
25
+ }
26
+ // Pattern 1: Complementary role with high z-index
27
+ if (role === 'complementary' && zIndex > 100) {
28
+ return {
29
+ type: 'drawer',
30
+ rootEid: computeEid(node, 'drawer'),
31
+ zIndex,
32
+ isModal: false,
33
+ confidence: 0.7,
34
+ };
35
+ }
36
+ // Pattern 2: Navigation role with high z-index + edge position
37
+ if (role === 'navigation' && zIndex > 100) {
38
+ const bbox = node.layout.bbox;
39
+ if (bbox && isEdgePositioned(bbox)) {
40
+ return {
41
+ type: 'drawer',
42
+ rootEid: computeEid(node, 'drawer'),
43
+ zIndex,
44
+ isModal: false,
45
+ confidence: 0.75,
46
+ };
47
+ }
48
+ }
49
+ // Pattern 3: Common drawer class patterns
50
+ const className = attrs?.class ?? attrs?.className;
51
+ if (typeof className === 'string' && zIndex > 50) {
52
+ const drawerPatterns = [
53
+ 'drawer',
54
+ 'sidebar',
55
+ 'side-nav',
56
+ 'sidenav',
57
+ 'offcanvas',
58
+ 'slide-in',
59
+ 'MuiDrawer',
60
+ 'ant-drawer',
61
+ 'el-drawer',
62
+ 'v-navigation-drawer',
63
+ ];
64
+ const lowerClassName = className.toLowerCase();
65
+ if (drawerPatterns.some((p) => lowerClassName.includes(p.toLowerCase()))) {
66
+ return {
67
+ type: 'drawer',
68
+ rootEid: computeEid(node, 'drawer'),
69
+ zIndex,
70
+ isModal: false,
71
+ confidence: 0.7,
72
+ };
73
+ }
74
+ }
75
+ return null;
76
+ }
77
+ /**
78
+ * Check if bounding box is edge-positioned (left or right edge).
79
+ *
80
+ * @param bbox - Bounding box {x, y, w, h}
81
+ * @returns True if positioned at edge
82
+ */
83
+ export function isEdgePositioned(bbox) {
84
+ // Left edge: x near 0
85
+ if (bbox.x < 10) {
86
+ return true;
87
+ }
88
+ // Right edge: x + width near typical viewport widths
89
+ // This is a heuristic - ideally we'd have viewport width
90
+ const rightEdge = bbox.x + bbox.w;
91
+ if (rightEdge > 1200 && bbox.x > 800) {
92
+ return true;
93
+ }
94
+ return false;
95
+ }
96
+ //# sourceMappingURL=drawer-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drawer-detector.js","sourceRoot":"","sources":["../../../../src/state/layer-detectors/drawer-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,IAAkB;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC;IACnC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAiD,CAAC;IAErE,gDAAgD;IAChD,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,kDAAkD;IAClD,IAAI,IAAI,KAAK,eAAe,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;QAC7C,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC;YACnC,MAAM;YACN,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,GAAG;SAChB,CAAC;IACJ,CAAC;IAED,+DAA+D;IAC/D,IAAI,IAAI,KAAK,YAAY,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QAC9B,IAAI,IAAI,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,OAAO;gBACL,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC;gBACnC,MAAM;gBACN,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,IAAI;aACjB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,MAAM,SAAS,GAAG,KAAK,EAAE,KAAK,IAAI,KAAK,EAAE,SAAS,CAAC;IACnD,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,MAAM,GAAG,EAAE,EAAE,CAAC;QACjD,MAAM,cAAc,GAAG;YACrB,QAAQ;YACR,SAAS;YACT,UAAU;YACV,SAAS;YACT,WAAW;YACX,UAAU;YACV,WAAW;YACX,YAAY;YACZ,WAAW;YACX,qBAAqB;SACtB,CAAC;QAEF,MAAM,cAAc,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QAC/C,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC;YACzE,OAAO;gBACL,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC;gBACnC,MAAM;gBACN,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,GAAG;aAChB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAoD;IACnF,sBAAsB;IACtB,IAAI,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qDAAqD;IACrD,yDAAyD;IACzD,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAClC,IAAI,SAAS,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Layer Detectors
3
+ *
4
+ * Individual layer detection functions for modal, drawer, popover, and toast patterns.
5
+ */
6
+ export { detectModal, isPortalContainer } from './modal-detector.js';
7
+ export { detectDrawer, isEdgePositioned } from './drawer-detector.js';
8
+ export { detectPopover } from './popover-detector.js';
9
+ export { detectToast, TOAST_ROLES } from './toast-detector.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/state/layer-detectors/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Layer Detectors
3
+ *
4
+ * Individual layer detection functions for modal, drawer, popover, and toast patterns.
5
+ */
6
+ export { detectModal, isPortalContainer } from './modal-detector.js';
7
+ export { detectDrawer, isEdgePositioned } from './drawer-detector.js';
8
+ export { detectPopover } from './popover-detector.js';
9
+ export { detectToast, TOAST_ROLES } from './toast-detector.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/state/layer-detectors/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Modal Detector
3
+ *
4
+ * Detect modal layers in the snapshot.
5
+ * Patterns: role="dialog" + aria-modal, <dialog open>, portal containers.
6
+ */
7
+ import type { ReadableNode } from '../../snapshot/snapshot.types.js';
8
+ import type { LayerCandidate } from '../types.js';
9
+ /**
10
+ * Detect if node is a modal layer.
11
+ *
12
+ * Patterns:
13
+ * - role="dialog" or role="alertdialog" + aria-modal="true"
14
+ * - <dialog open>
15
+ * - High z-index (>1000) with dialog role
16
+ * - React/Vue portal containers with modal content
17
+ *
18
+ * @param node - Node to check
19
+ * @returns Layer candidate or null
20
+ */
21
+ export declare function detectModal(node: ReadableNode): LayerCandidate | null;
22
+ /**
23
+ * Check if node is a portal container (React/Vue/Angular patterns).
24
+ *
25
+ * @param node - Node to check
26
+ * @param attrs - Node attributes
27
+ * @returns True if portal container
28
+ */
29
+ export declare function isPortalContainer(node: ReadableNode, attrs: Record<string, unknown> | undefined): boolean;
30
+ //# sourceMappingURL=modal-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modal-detector.d.ts","sourceRoot":"","sources":["../../../../src/state/layer-detectors/modal-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,cAAc,GAAG,IAAI,CA6DrE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACzC,OAAO,CAkDT"}