browser-debugger-cli 0.6.9 → 0.6.11

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 (259) hide show
  1. package/README.md +10 -0
  2. package/dist/commands/cdp.js +1 -1
  3. package/dist/commands/cdp.js.map +1 -1
  4. package/dist/commands/cleanup.js +1 -1
  5. package/dist/commands/cleanup.js.map +1 -1
  6. package/dist/commands/console.d.ts +4 -28
  7. package/dist/commands/console.d.ts.map +1 -1
  8. package/dist/commands/console.js +82 -192
  9. package/dist/commands/console.js.map +1 -1
  10. package/dist/commands/details.d.ts.map +1 -1
  11. package/dist/commands/details.js +27 -8
  12. package/dist/commands/details.js.map +1 -1
  13. package/dist/commands/dom/DomElementResolver.d.ts +25 -9
  14. package/dist/commands/dom/DomElementResolver.d.ts.map +1 -1
  15. package/dist/commands/dom/DomElementResolver.js +65 -17
  16. package/dist/commands/dom/DomElementResolver.js.map +1 -1
  17. package/dist/commands/dom/__tests__/screenshotResize.unit.test.d.ts +2 -0
  18. package/dist/commands/dom/__tests__/screenshotResize.unit.test.d.ts.map +1 -0
  19. package/dist/commands/dom/__tests__/screenshotResize.unit.test.js +184 -0
  20. package/dist/commands/dom/__tests__/screenshotResize.unit.test.js.map +1 -0
  21. package/dist/commands/dom/a11y.d.ts.map +1 -1
  22. package/dist/commands/dom/a11y.js +9 -9
  23. package/dist/commands/dom/a11y.js.map +1 -1
  24. package/dist/commands/dom/evalHelpers.d.ts.map +1 -1
  25. package/dist/commands/dom/evalHelpers.js +10 -7
  26. package/dist/commands/dom/evalHelpers.js.map +1 -1
  27. package/dist/commands/dom/formFillHelpers.d.ts +2 -1
  28. package/dist/commands/dom/formFillHelpers.d.ts.map +1 -1
  29. package/dist/commands/dom/formFillHelpers.js +22 -20
  30. package/dist/commands/dom/formFillHelpers.js.map +1 -1
  31. package/dist/commands/dom/formInteraction.d.ts.map +1 -1
  32. package/dist/commands/dom/formInteraction.js +26 -10
  33. package/dist/commands/dom/formInteraction.js.map +1 -1
  34. package/dist/commands/dom/formSubmitHelpers.d.ts +2 -1
  35. package/dist/commands/dom/formSubmitHelpers.d.ts.map +1 -1
  36. package/dist/commands/dom/formSubmitHelpers.js.map +1 -1
  37. package/dist/commands/dom/helpers.d.ts +47 -4
  38. package/dist/commands/dom/helpers.d.ts.map +1 -1
  39. package/dist/commands/dom/helpers.js +406 -21
  40. package/dist/commands/dom/helpers.js.map +1 -1
  41. package/dist/commands/dom/index.d.ts +1 -1
  42. package/dist/commands/dom/index.d.ts.map +1 -1
  43. package/dist/commands/dom/index.js +414 -151
  44. package/dist/commands/dom/index.js.map +1 -1
  45. package/dist/commands/dom/reactEventHelpers.d.ts +4 -4
  46. package/dist/commands/dom/reactEventHelpers.d.ts.map +1 -1
  47. package/dist/commands/dom/reactEventHelpers.js +11 -11
  48. package/dist/commands/dom/screenshotResize.d.ts +81 -0
  49. package/dist/commands/dom/screenshotResize.d.ts.map +1 -0
  50. package/dist/commands/dom/screenshotResize.js +103 -0
  51. package/dist/commands/dom/screenshotResize.js.map +1 -0
  52. package/dist/commands/helpJson.d.ts +20 -0
  53. package/dist/commands/helpJson.d.ts.map +1 -1
  54. package/dist/commands/helpJson.js +48 -39
  55. package/dist/commands/helpJson.js.map +1 -1
  56. package/dist/commands/network/har.d.ts.map +1 -1
  57. package/dist/commands/network/har.js +3 -2
  58. package/dist/commands/network/har.js.map +1 -1
  59. package/dist/commands/network/list.d.ts +0 -8
  60. package/dist/commands/network/list.d.ts.map +1 -1
  61. package/dist/commands/network/list.js +134 -208
  62. package/dist/commands/network/list.js.map +1 -1
  63. package/dist/commands/network/shared.d.ts.map +1 -1
  64. package/dist/commands/network/shared.js +6 -0
  65. package/dist/commands/network/shared.js.map +1 -1
  66. package/dist/commands/optionBehaviors.d.ts +26 -0
  67. package/dist/commands/optionBehaviors.d.ts.map +1 -0
  68. package/dist/commands/optionBehaviors.js +184 -0
  69. package/dist/commands/optionBehaviors.js.map +1 -0
  70. package/dist/commands/peek.d.ts +2 -4
  71. package/dist/commands/peek.d.ts.map +1 -1
  72. package/dist/commands/peek.js +109 -97
  73. package/dist/commands/peek.js.map +1 -1
  74. package/dist/commands/shared/CommandRunner.js +1 -1
  75. package/dist/commands/shared/CommandRunner.js.map +1 -1
  76. package/dist/commands/shared/dataFetcher.d.ts +58 -0
  77. package/dist/commands/shared/dataFetcher.d.ts.map +1 -0
  78. package/dist/commands/shared/dataFetcher.js +98 -0
  79. package/dist/commands/shared/dataFetcher.js.map +1 -0
  80. package/dist/commands/shared/followMode.d.ts +50 -0
  81. package/dist/commands/shared/followMode.d.ts.map +1 -0
  82. package/dist/commands/shared/followMode.js +58 -0
  83. package/dist/commands/shared/followMode.js.map +1 -0
  84. package/dist/commands/shared/optionTypes.d.ts +18 -4
  85. package/dist/commands/shared/optionTypes.d.ts.map +1 -1
  86. package/dist/commands/shared/startHelpers.d.ts.map +1 -1
  87. package/dist/commands/shared/startHelpers.js +6 -5
  88. package/dist/commands/shared/startHelpers.js.map +1 -1
  89. package/dist/commands/shared/validation.d.ts +0 -45
  90. package/dist/commands/shared/validation.d.ts.map +1 -1
  91. package/dist/commands/shared/validation.js +65 -107
  92. package/dist/commands/shared/validation.js.map +1 -1
  93. package/dist/commands/status.d.ts.map +1 -1
  94. package/dist/commands/status.js +18 -9
  95. package/dist/commands/status.js.map +1 -1
  96. package/dist/commands/stop.d.ts.map +1 -1
  97. package/dist/commands/stop.js +15 -4
  98. package/dist/commands/stop.js.map +1 -1
  99. package/dist/commands/tail.d.ts +2 -7
  100. package/dist/commands/tail.d.ts.map +1 -1
  101. package/dist/commands/tail.js +67 -79
  102. package/dist/commands/tail.js.map +1 -1
  103. package/dist/commands/types.d.ts +11 -5
  104. package/dist/commands/types.d.ts.map +1 -1
  105. package/dist/connection/cdp.d.ts.map +1 -1
  106. package/dist/connection/cdp.js +5 -3
  107. package/dist/connection/cdp.js.map +1 -1
  108. package/dist/connection/diagnostics.d.ts +9 -0
  109. package/dist/connection/diagnostics.d.ts.map +1 -1
  110. package/dist/connection/diagnostics.js +14 -1
  111. package/dist/connection/diagnostics.js.map +1 -1
  112. package/dist/connection/errors.d.ts +0 -7
  113. package/dist/connection/errors.d.ts.map +1 -1
  114. package/dist/connection/errors.js +0 -7
  115. package/dist/connection/errors.js.map +1 -1
  116. package/dist/connection/handlers.d.ts +1 -8
  117. package/dist/connection/handlers.d.ts.map +1 -1
  118. package/dist/connection/handlers.js.map +1 -1
  119. package/dist/connection/launcher/binaryResolver.d.ts.map +1 -1
  120. package/dist/connection/launcher/binaryResolver.js +3 -15
  121. package/dist/connection/launcher/binaryResolver.js.map +1 -1
  122. package/dist/connection/launcher/preferencesLoader.d.ts.map +1 -1
  123. package/dist/connection/launcher/preferencesLoader.js +2 -1
  124. package/dist/connection/launcher/preferencesLoader.js.map +1 -1
  125. package/dist/connection/launcher.d.ts.map +1 -1
  126. package/dist/connection/launcher.js +5 -16
  127. package/dist/connection/launcher.js.map +1 -1
  128. package/dist/connection/pageReadiness.d.ts.map +1 -1
  129. package/dist/connection/pageReadiness.js +13 -16
  130. package/dist/connection/pageReadiness.js.map +1 -1
  131. package/dist/connection/typed-cdp.d.ts +3 -5
  132. package/dist/connection/typed-cdp.d.ts.map +1 -1
  133. package/dist/connection/typed-cdp.js +1 -1
  134. package/dist/connection/typed-cdp.js.map +1 -1
  135. package/dist/daemon/handlers/BaseHandler.d.ts.map +1 -1
  136. package/dist/daemon/handlers/BaseHandler.js +1 -1
  137. package/dist/daemon/handlers/BaseHandler.js.map +1 -1
  138. package/dist/daemon/handlers/QueryHandlers.d.ts.map +1 -1
  139. package/dist/daemon/handlers/QueryHandlers.js +1 -1
  140. package/dist/daemon/handlers/QueryHandlers.js.map +1 -1
  141. package/dist/daemon/handlers/SessionHandlers.d.ts.map +1 -1
  142. package/dist/daemon/handlers/SessionHandlers.js +1 -1
  143. package/dist/daemon/handlers/SessionHandlers.js.map +1 -1
  144. package/dist/daemon/handlers/responseHandler.d.ts.map +1 -1
  145. package/dist/daemon/handlers/responseHandler.js +10 -0
  146. package/dist/daemon/handlers/responseHandler.js.map +1 -1
  147. package/dist/daemon/ipcServer.js +1 -1
  148. package/dist/daemon/ipcServer.js.map +1 -1
  149. package/dist/daemon/launcher.d.ts.map +1 -1
  150. package/dist/daemon/launcher.js +3 -2
  151. package/dist/daemon/launcher.js.map +1 -1
  152. package/dist/daemon/lifecycle/signalHandlers.d.ts.map +1 -1
  153. package/dist/daemon/lifecycle/signalHandlers.js +1 -1
  154. package/dist/daemon/lifecycle/signalHandlers.js.map +1 -1
  155. package/dist/daemon/lifecycle/workerCleanup.d.ts.map +1 -1
  156. package/dist/daemon/lifecycle/workerCleanup.js +4 -3
  157. package/dist/daemon/lifecycle/workerCleanup.js.map +1 -1
  158. package/dist/daemon/lifecycle/workerConfig.d.ts.map +1 -1
  159. package/dist/daemon/lifecycle/workerConfig.js +1 -1
  160. package/dist/daemon/lifecycle/workerConfig.js.map +1 -1
  161. package/dist/daemon/lifecycle/workerIpc.d.ts.map +1 -1
  162. package/dist/daemon/lifecycle/workerIpc.js +1 -1
  163. package/dist/daemon/lifecycle/workerIpc.js.map +1 -1
  164. package/dist/daemon/server/JsonlParser.d.ts.map +1 -1
  165. package/dist/daemon/server/JsonlParser.js +1 -1
  166. package/dist/daemon/server/JsonlParser.js.map +1 -1
  167. package/dist/daemon/startSession.d.ts.map +1 -1
  168. package/dist/daemon/startSession.js +1 -1
  169. package/dist/daemon/startSession.js.map +1 -1
  170. package/dist/daemon/worker/TelemetryStore.d.ts +2 -1
  171. package/dist/daemon/worker/TelemetryStore.d.ts.map +1 -1
  172. package/dist/daemon/worker/TelemetryStore.js +4 -0
  173. package/dist/daemon/worker/TelemetryStore.js.map +1 -1
  174. package/dist/daemon/worker/plugins.d.ts.map +1 -1
  175. package/dist/daemon/worker/plugins.js +9 -2
  176. package/dist/daemon/worker/plugins.js.map +1 -1
  177. package/dist/index.js +23 -7
  178. package/dist/index.js.map +1 -1
  179. package/dist/ipc/utils/errors.js +1 -1
  180. package/dist/ipc/utils/errors.js.map +1 -1
  181. package/dist/session/QueryCacheManager.d.ts.map +1 -1
  182. package/dist/session/QueryCacheManager.js +1 -1
  183. package/dist/session/QueryCacheManager.js.map +1 -1
  184. package/dist/session/chrome.js +1 -1
  185. package/dist/session/chrome.js.map +1 -1
  186. package/dist/session/cleanup.js +5 -5
  187. package/dist/session/cleanup.js.map +1 -1
  188. package/dist/session/lock.js +1 -1
  189. package/dist/session/lock.js.map +1 -1
  190. package/dist/session/metadata.d.ts.map +1 -1
  191. package/dist/session/metadata.js +1 -1
  192. package/dist/session/metadata.js.map +1 -1
  193. package/dist/session/pid.js +1 -1
  194. package/dist/session/pid.js.map +1 -1
  195. package/dist/telemetry/dom.d.ts.map +1 -1
  196. package/dist/telemetry/dom.js +1 -1
  197. package/dist/telemetry/dom.js.map +1 -1
  198. package/dist/telemetry/filterPresets.d.ts.map +1 -1
  199. package/dist/telemetry/filterPresets.js +5 -2
  200. package/dist/telemetry/filterPresets.js.map +1 -1
  201. package/dist/telemetry/navigation.d.ts.map +1 -1
  202. package/dist/telemetry/navigation.js +7 -0
  203. package/dist/telemetry/navigation.js.map +1 -1
  204. package/dist/telemetry/network.d.ts +12 -1
  205. package/dist/telemetry/network.d.ts.map +1 -1
  206. package/dist/telemetry/network.js +117 -1
  207. package/dist/telemetry/network.js.map +1 -1
  208. package/dist/types.d.ts +148 -0
  209. package/dist/types.d.ts.map +1 -1
  210. package/dist/types.js +33 -1
  211. package/dist/types.js.map +1 -1
  212. package/dist/ui/OutputBuilder.d.ts +2 -44
  213. package/dist/ui/OutputBuilder.d.ts.map +1 -1
  214. package/dist/ui/OutputBuilder.js +71 -103
  215. package/dist/ui/OutputBuilder.js.map +1 -1
  216. package/dist/ui/errors/CommandError.d.ts +0 -2
  217. package/dist/ui/errors/CommandError.d.ts.map +1 -1
  218. package/dist/ui/errors/CommandError.js.map +1 -1
  219. package/dist/ui/formatters/dom.d.ts +10 -30
  220. package/dist/ui/formatters/dom.d.ts.map +1 -1
  221. package/dist/ui/formatters/dom.js +13 -36
  222. package/dist/ui/formatters/dom.js.map +1 -1
  223. package/dist/ui/logging/logger.d.ts +1 -1
  224. package/dist/ui/logging/logger.d.ts.map +1 -1
  225. package/dist/ui/logging/logger.js +1 -1
  226. package/dist/ui/logging/logger.js.map +1 -1
  227. package/dist/ui/messages/dom.d.ts +14 -0
  228. package/dist/ui/messages/dom.d.ts.map +1 -0
  229. package/dist/ui/messages/dom.js +28 -0
  230. package/dist/ui/messages/dom.js.map +1 -0
  231. package/dist/ui/messages/errors.d.ts +83 -0
  232. package/dist/ui/messages/errors.d.ts.map +1 -1
  233. package/dist/ui/messages/errors.js +171 -0
  234. package/dist/ui/messages/errors.js.map +1 -1
  235. package/dist/utils/async.d.ts +10 -0
  236. package/dist/utils/async.d.ts.map +1 -0
  237. package/dist/utils/async.js +12 -0
  238. package/dist/utils/async.js.map +1 -0
  239. package/dist/utils/atomicFile.js +1 -1
  240. package/dist/utils/atomicFile.js.map +1 -1
  241. package/dist/utils/errorMapping.d.ts.map +1 -1
  242. package/dist/utils/errorMapping.js +4 -1
  243. package/dist/utils/errorMapping.js.map +1 -1
  244. package/dist/utils/exitCodes.d.ts +17 -16
  245. package/dist/utils/exitCodes.d.ts.map +1 -1
  246. package/dist/utils/exitCodes.js +86 -16
  247. package/dist/utils/exitCodes.js.map +1 -1
  248. package/dist/utils/suggestions.d.ts +19 -0
  249. package/dist/utils/suggestions.d.ts.map +1 -0
  250. package/dist/utils/suggestions.js +34 -0
  251. package/dist/utils/suggestions.js.map +1 -0
  252. package/dist/utils/taskMappings.d.ts.map +1 -1
  253. package/dist/utils/taskMappings.js +35 -0
  254. package/dist/utils/taskMappings.js.map +1 -1
  255. package/dist/utils/typeGuards.d.ts +11 -4
  256. package/dist/utils/typeGuards.d.ts.map +1 -1
  257. package/dist/utils/typeGuards.js +1 -17
  258. package/dist/utils/typeGuards.js.map +1 -1
  259. package/package.json +4 -4
@@ -5,7 +5,9 @@
5
5
  * - Numeric indices (referencing cached query results)
6
6
  * - CSS selectors (used directly)
7
7
  *
8
- * Handles cache validation, staleness detection, and consistent error handling.
8
+ * Handles cache validation, staleness detection, and automatic refresh.
9
+ * When cache is stale due to navigation, automatically re-runs the original
10
+ * query to provide seamless "just works" experience.
9
11
  *
10
12
  * @example
11
13
  * ```typescript
@@ -32,7 +34,7 @@ export interface ElementTargetSuccess {
32
34
  success: true;
33
35
  /** CSS selector to use */
34
36
  selector: string;
35
- /** 1-based index for selector (if resolved from cached query) */
37
+ /** 0-based index for selector (if resolved from cached query) */
36
38
  index?: number | undefined;
37
39
  }
38
40
  /**
@@ -56,7 +58,8 @@ export type ElementTargetResult = ElementTargetSuccess | ElementTargetFailure;
56
58
  /**
57
59
  * Singleton resolver for DOM element access patterns.
58
60
  *
59
- * Centralizes element resolution with cache validation and consistent error handling.
61
+ * Centralizes element resolution with cache validation, automatic refresh,
62
+ * and consistent error handling.
60
63
  */
61
64
  export declare class DomElementResolver {
62
65
  private static instance;
@@ -67,6 +70,16 @@ export declare class DomElementResolver {
67
70
  * @param cacheManager - Query cache manager (defaults to singleton)
68
71
  */
69
72
  constructor(cacheManager?: QueryCacheManager);
73
+ /**
74
+ * Refresh stale cache by re-running the original query.
75
+ *
76
+ * Called automatically when cache validation fails due to navigation.
77
+ * Re-queries using the stored selector and updates the cache with fresh results.
78
+ *
79
+ * @param selector - Original CSS selector from stale cache
80
+ * @returns Fresh query result
81
+ */
82
+ private refreshCache;
70
83
  /**
71
84
  * Get the singleton instance.
72
85
  *
@@ -84,10 +97,12 @@ export declare class DomElementResolver {
84
97
  * - A CSS selector string (used directly)
85
98
  * - A numeric index (resolved from cached query results)
86
99
  *
87
- * Validates cache staleness by checking navigationId against current page state.
100
+ * Automatically refreshes stale cache by re-running the original query.
101
+ * This provides a "just works" experience where navigation doesn't break
102
+ * index-based access.
88
103
  *
89
104
  * @param selectorOrIndex - CSS selector or numeric index from query results
90
- * @param explicitIndex - Optional explicit --index flag value (1-based)
105
+ * @param explicitIndex - Optional explicit --index flag value (0-based)
91
106
  * @returns Resolution result with selector and optional index
92
107
  *
93
108
  * @example
@@ -103,11 +118,12 @@ export declare class DomElementResolver {
103
118
  /**
104
119
  * Get nodeId for a cached index.
105
120
  *
106
- * Validates cache staleness and throws CommandError if invalid.
121
+ * Automatically refreshes stale cache by re-running the original query.
122
+ * Throws CommandError only if refresh fails or index is out of range after refresh.
107
123
  *
108
124
  * @param index - Zero-based index from query results
109
125
  * @returns Node with nodeId from cache
110
- * @throws CommandError if cache missing, stale, index out of range, or node not found
126
+ * @throws CommandError if cache missing, index out of range after refresh, or node not found
111
127
  *
112
128
  * @example
113
129
  * ```typescript
@@ -121,10 +137,10 @@ export declare class DomElementResolver {
121
137
  /**
122
138
  * Get the count of cached elements.
123
139
  *
124
- * Validates cache and returns element count, or throws if cache is invalid.
140
+ * Automatically refreshes stale cache by re-running the original query.
125
141
  *
126
142
  * @returns Number of cached elements
127
- * @throws CommandError if cache is missing or stale
143
+ * @throws CommandError if cache is missing or refresh fails
128
144
  */
129
145
  getElementCount(): Promise<number>;
130
146
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"DomElementResolver.d.ts","sourceRoot":"","sources":["../../../src/commands/dom/DomElementResolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAInE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,2BAA2B;IAC3B,OAAO,EAAE,IAAI,CAAC;IACd,0BAA0B;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,wBAAwB;IACxB,OAAO,EAAE,KAAK,CAAC;IACf,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,oBAAoB,GAAG,oBAAoB,CAAC;AAE9E;;;;GAIG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAmC;IAC1D,OAAO,CAAC,YAAY,CAAoB;IAExC;;;;OAIG;gBACS,YAAY,CAAC,EAAE,iBAAiB;IAI5C;;;;OAIG;IACH,MAAM,CAAC,WAAW,IAAI,kBAAkB;IAKxC;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B;;;;;;;;;;;;;;;;;;;;;OAqBG;IACG,OAAO,CAAC,eAAe,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAwC5F;;;;;;;;;;;;;;OAcG;IACG,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAmCnE;;;;;;;OAOG;IACG,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAcxC;;;;;OAKG;IACH,cAAc,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO;CAGjD"}
1
+ {"version":3,"file":"DomElementResolver.d.ts","sourceRoot":"","sources":["../../../src/commands/dom/DomElementResolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAQnE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,2BAA2B;IAC3B,OAAO,EAAE,IAAI,CAAC;IACd,0BAA0B;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,wBAAwB;IACxB,OAAO,EAAE,KAAK,CAAC;IACf,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,oBAAoB,GAAG,oBAAoB,CAAC;AAE9E;;;;;GAKG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAmC;IAC1D,OAAO,CAAC,YAAY,CAAoB;IAExC;;;;OAIG;gBACS,YAAY,CAAC,EAAE,iBAAiB;IAI5C;;;;;;;;OAQG;YACW,YAAY;IAkB1B;;;;OAIG;IACH,MAAM,CAAC,WAAW,IAAI,kBAAkB;IAKxC;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACG,OAAO,CAAC,eAAe,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAiD5F;;;;;;;;;;;;;;;OAeG;IACG,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAqCnE;;;;;;;OAOG;IACG,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAoBxC;;;;;OAKG;IACH,cAAc,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO;CAGjD"}
@@ -5,7 +5,9 @@
5
5
  * - Numeric indices (referencing cached query results)
6
6
  * - CSS selectors (used directly)
7
7
  *
8
- * Handles cache validation, staleness detection, and consistent error handling.
8
+ * Handles cache validation, staleness detection, and automatic refresh.
9
+ * When cache is stale due to navigation, automatically re-runs the original
10
+ * query to provide seamless "just works" experience.
9
11
  *
10
12
  * @example
11
13
  * ```typescript
@@ -25,11 +27,15 @@
25
27
  */
26
28
  import { QueryCacheManager } from '../../session/QueryCacheManager.js';
27
29
  import { CommandError } from '../../ui/errors/index.js';
30
+ import { createLogger } from '../../ui/logging/index.js';
31
+ import { elementAtIndexNotFoundError, indexOutOfRangeError } from '../../ui/messages/errors.js';
28
32
  import { EXIT_CODES } from '../../utils/exitCodes.js';
33
+ const log = createLogger('dom');
29
34
  /**
30
35
  * Singleton resolver for DOM element access patterns.
31
36
  *
32
- * Centralizes element resolution with cache validation and consistent error handling.
37
+ * Centralizes element resolution with cache validation, automatic refresh,
38
+ * and consistent error handling.
33
39
  */
34
40
  export class DomElementResolver {
35
41
  static instance = null;
@@ -42,6 +48,28 @@ export class DomElementResolver {
42
48
  constructor(cacheManager) {
43
49
  this.cacheManager = cacheManager ?? QueryCacheManager.getInstance();
44
50
  }
51
+ /**
52
+ * Refresh stale cache by re-running the original query.
53
+ *
54
+ * Called automatically when cache validation fails due to navigation.
55
+ * Re-queries using the stored selector and updates the cache with fresh results.
56
+ *
57
+ * @param selector - Original CSS selector from stale cache
58
+ * @returns Fresh query result
59
+ */
60
+ async refreshCache(selector) {
61
+ log.debug(`Cache stale, auto-refreshing query "${selector}"`);
62
+ const { queryDOMElements } = await import('../../commands/dom/helpers.js');
63
+ const result = await queryDOMElements(selector);
64
+ const navigationId = await this.cacheManager.getCurrentNavigationId();
65
+ const resultWithNavId = {
66
+ ...result,
67
+ ...(navigationId !== null && { navigationId }),
68
+ };
69
+ await this.cacheManager.set(resultWithNavId);
70
+ this.cacheManager.invalidateNavigationCache();
71
+ log.debug(`Cache refreshed: found ${result.count} elements`);
72
+ }
45
73
  /**
46
74
  * Get the singleton instance.
47
75
  *
@@ -64,10 +92,12 @@ export class DomElementResolver {
64
92
  * - A CSS selector string (used directly)
65
93
  * - A numeric index (resolved from cached query results)
66
94
  *
67
- * Validates cache staleness by checking navigationId against current page state.
95
+ * Automatically refreshes stale cache by re-running the original query.
96
+ * This provides a "just works" experience where navigation doesn't break
97
+ * index-based access.
68
98
  *
69
99
  * @param selectorOrIndex - CSS selector or numeric index from query results
70
- * @param explicitIndex - Optional explicit --index flag value (1-based)
100
+ * @param explicitIndex - Optional explicit --index flag value (0-based)
71
101
  * @returns Resolution result with selector and optional index
72
102
  *
73
103
  * @example
@@ -82,7 +112,12 @@ export class DomElementResolver {
82
112
  async resolve(selectorOrIndex, explicitIndex) {
83
113
  const isNumericIndex = /^\d+$/.test(selectorOrIndex);
84
114
  if (isNumericIndex) {
85
- const validation = await this.cacheManager.validate();
115
+ let validation = await this.cacheManager.validate();
116
+ // Auto-refresh: if cache is stale but has selector, re-run query
117
+ if (!validation.valid && validation.cache?.selector) {
118
+ await this.refreshCache(validation.cache.selector);
119
+ validation = await this.cacheManager.validate();
120
+ }
86
121
  if (!validation.valid || !validation.cache) {
87
122
  return {
88
123
  success: false,
@@ -97,8 +132,10 @@ export class DomElementResolver {
97
132
  return {
98
133
  success: false,
99
134
  error: `Index ${index} out of range (found ${cachedQuery.nodes.length} nodes from query "${cachedQuery.selector}")`,
100
- exitCode: EXIT_CODES.INVALID_ARGUMENTS,
101
- suggestion: `Use an index between 0 and ${cachedQuery.nodes.length - 1}`,
135
+ exitCode: EXIT_CODES.STALE_CACHE,
136
+ suggestion: cachedQuery.nodes.length === 0
137
+ ? `No elements found after refresh. The selector "${cachedQuery.selector}" may no longer match any elements.`
138
+ : `Use an index between 0 and ${cachedQuery.nodes.length - 1}`,
102
139
  };
103
140
  }
104
141
  return {
@@ -116,11 +153,12 @@ export class DomElementResolver {
116
153
  /**
117
154
  * Get nodeId for a cached index.
118
155
  *
119
- * Validates cache staleness and throws CommandError if invalid.
156
+ * Automatically refreshes stale cache by re-running the original query.
157
+ * Throws CommandError only if refresh fails or index is out of range after refresh.
120
158
  *
121
159
  * @param index - Zero-based index from query results
122
160
  * @returns Node with nodeId from cache
123
- * @throws CommandError if cache missing, stale, index out of range, or node not found
161
+ * @throws CommandError if cache missing, index out of range after refresh, or node not found
124
162
  *
125
163
  * @example
126
164
  * ```typescript
@@ -129,32 +167,42 @@ export class DomElementResolver {
129
167
  * ```
130
168
  */
131
169
  async getNodeIdForIndex(index) {
132
- const validation = await this.cacheManager.validate();
170
+ let validation = await this.cacheManager.validate();
171
+ // Auto-refresh: if cache is stale but has selector, re-run query
172
+ if (!validation.valid && validation.cache?.selector) {
173
+ await this.refreshCache(validation.cache.selector);
174
+ validation = await this.cacheManager.validate();
175
+ }
133
176
  if (!validation.valid || !validation.cache) {
134
177
  throw new CommandError(validation.error ?? 'No cached query results found', validation.suggestion ? { suggestion: validation.suggestion } : {}, EXIT_CODES.INVALID_ARGUMENTS);
135
178
  }
136
179
  const cachedQuery = validation.cache;
137
180
  if (index < 0 || index >= cachedQuery.nodes.length) {
138
- throw new CommandError(`Index ${index} out of range (found ${cachedQuery.nodes.length} nodes from query "${cachedQuery.selector}")`, {
139
- suggestion: `Use an index between 0 and ${cachedQuery.nodes.length - 1}`,
140
- }, EXIT_CODES.INVALID_ARGUMENTS);
181
+ const err = indexOutOfRangeError(index, cachedQuery.nodes.length - 1);
182
+ throw new CommandError(err.message, { suggestion: err.suggestion }, EXIT_CODES.STALE_CACHE);
141
183
  }
142
184
  const targetNode = cachedQuery.nodes[index];
143
185
  if (!targetNode) {
144
- throw new CommandError(`Element at index ${index} not found`, {}, EXIT_CODES.RESOURCE_NOT_FOUND);
186
+ const err = elementAtIndexNotFoundError(index, cachedQuery.selector);
187
+ throw new CommandError(err.message, { suggestion: err.suggestion }, EXIT_CODES.RESOURCE_NOT_FOUND);
145
188
  }
146
189
  return targetNode;
147
190
  }
148
191
  /**
149
192
  * Get the count of cached elements.
150
193
  *
151
- * Validates cache and returns element count, or throws if cache is invalid.
194
+ * Automatically refreshes stale cache by re-running the original query.
152
195
  *
153
196
  * @returns Number of cached elements
154
- * @throws CommandError if cache is missing or stale
197
+ * @throws CommandError if cache is missing or refresh fails
155
198
  */
156
199
  async getElementCount() {
157
- const validation = await this.cacheManager.validate();
200
+ let validation = await this.cacheManager.validate();
201
+ // Auto-refresh: if cache is stale but has selector, re-run query
202
+ if (!validation.valid && validation.cache?.selector) {
203
+ await this.refreshCache(validation.cache.selector);
204
+ validation = await this.cacheManager.validate();
205
+ }
158
206
  if (!validation.valid || !validation.cache) {
159
207
  throw new CommandError(validation.error ?? 'No cached query results found', validation.suggestion ? { suggestion: validation.suggestion } : {}, EXIT_CODES.INVALID_ARGUMENTS);
160
208
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DomElementResolver.js","sourceRoot":"","sources":["../../../src/commands/dom/DomElementResolver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DomElementResolver.js","sourceRoot":"","sources":["../../../src/commands/dom/DomElementResolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC5F,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;AAkChC;;;;;GAKG;AACH,MAAM,OAAO,kBAAkB;IACrB,MAAM,CAAC,QAAQ,GAA8B,IAAI,CAAC;IAClD,YAAY,CAAoB;IAExC;;;;OAIG;IACH,YAAY,YAAgC;QAC1C,IAAI,CAAC,YAAY,GAAG,YAAY,IAAI,iBAAiB,CAAC,WAAW,EAAE,CAAC;IACtE,CAAC;IAED;;;;;;;;OAQG;IACK,KAAK,CAAC,YAAY,CAAC,QAAgB;QACzC,GAAG,CAAC,KAAK,CAAC,uCAAuC,QAAQ,GAAG,CAAC,CAAC;QAE9D,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAEhD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,sBAAsB,EAAE,CAAC;QACtE,MAAM,eAAe,GAAG;YACtB,GAAG,MAAM;YACT,GAAG,CAAC,YAAY,KAAK,IAAI,IAAI,EAAE,YAAY,EAAE,CAAC;SAC/C,CAAC;QAEF,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC7C,IAAI,CAAC,YAAY,CAAC,yBAAyB,EAAE,CAAC;QAE9C,GAAG,CAAC,KAAK,CAAC,0BAA0B,MAAM,CAAC,KAAK,WAAW,CAAC,CAAC;IAC/D,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,WAAW;QAChB,kBAAkB,CAAC,QAAQ,KAAK,IAAI,kBAAkB,EAAE,CAAC;QACzD,OAAO,kBAAkB,CAAC,QAAQ,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,aAAa;QAClB,kBAAkB,CAAC,QAAQ,GAAG,IAAI,CAAC;IACrC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,KAAK,CAAC,OAAO,CAAC,eAAuB,EAAE,aAAsB;QAC3D,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAErD,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;YAEpD,iEAAiE;YACjE,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC;gBACpD,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACnD,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;YAClD,CAAC;YAED,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBAC3C,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,UAAU,CAAC,KAAK,IAAI,+BAA+B;oBAC1D,QAAQ,EAAE,UAAU,CAAC,iBAAiB;oBACtC,UAAU,EAAE,UAAU,CAAC,UAAU;iBAClC,CAAC;YACJ,CAAC;YAED,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC;YACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;YAC5C,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBACnD,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,SAAS,KAAK,wBAAwB,WAAW,CAAC,KAAK,CAAC,MAAM,sBAAsB,WAAW,CAAC,QAAQ,IAAI;oBACnH,QAAQ,EAAE,UAAU,CAAC,WAAW;oBAChC,UAAU,EACR,WAAW,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;wBAC5B,CAAC,CAAC,kDAAkD,WAAW,CAAC,QAAQ,qCAAqC;wBAC7G,CAAC,CAAC,8BAA8B,WAAW,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;iBACnE,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,WAAW,CAAC,QAAQ;gBAC9B,KAAK,EAAE,KAAK,GAAG,CAAC;aACjB,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,eAAe;YACzB,KAAK,EAAE,aAAa;SACrB,CAAC;IACJ,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,iBAAiB,CAAC,KAAa;QACnC,IAAI,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;QAEpD,iEAAiE;QACjE,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC;YACpD,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACnD,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;QAClD,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YAC3C,MAAM,IAAI,YAAY,CACpB,UAAU,CAAC,KAAK,IAAI,+BAA+B,EACnD,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,EAClE,UAAU,CAAC,iBAAiB,CAC7B,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC;QAErC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACnD,MAAM,GAAG,GAAG,oBAAoB,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACtE,MAAM,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;QAC9F,CAAC;QAED,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,GAAG,GAAG,2BAA2B,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;YACrE,MAAM,IAAI,YAAY,CACpB,GAAG,CAAC,OAAO,EACX,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,EAC9B,UAAU,CAAC,kBAAkB,CAC9B,CAAC;QACJ,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,eAAe;QACnB,IAAI,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;QAEpD,iEAAiE;QACjE,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC;YACpD,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACnD,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;QAClD,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YAC3C,MAAM,IAAI,YAAY,CACpB,UAAU,CAAC,KAAK,IAAI,+BAA+B,EACnD,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,EAClE,UAAU,CAAC,iBAAiB,CAC7B,CAAC;QACJ,CAAC;QAED,OAAO,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;IACvC,CAAC;IAED;;;;;OAKG;IACH,cAAc,CAAC,eAAuB;QACpC,OAAO,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACvC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=screenshotResize.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screenshotResize.unit.test.d.ts","sourceRoot":"","sources":["../../../../src/commands/dom/__tests__/screenshotResize.unit.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,184 @@
1
+ import assert from 'node:assert/strict';
2
+ import { describe, it } from 'node:test';
3
+ import { calculateImageTokens, calculateResizeScale, isTallPage, shouldResize, calculateFinalDimensions, calculateActualDimensions, MAX_EDGE_PX, PIXELS_PER_TOKEN, TALL_PAGE_THRESHOLD, } from '../../../commands/dom/screenshotResize.js';
4
+ void describe('calculateImageTokens', () => {
5
+ void it('calculates tokens using width × height / 750 formula', () => {
6
+ assert.equal(calculateImageTokens(1092, 1092), Math.ceil((1092 * 1092) / 750));
7
+ });
8
+ void it('returns ~1590 tokens for Anthropic recommended 1092x1092', () => {
9
+ const tokens = calculateImageTokens(1092, 1092);
10
+ assert.ok(tokens >= 1589 && tokens <= 1591, `Expected ~1590, got ${tokens}`);
11
+ });
12
+ void it('returns ~2770 tokens for 1920x1080 viewport', () => {
13
+ const tokens = calculateImageTokens(1920, 1080);
14
+ assert.ok(tokens >= 2760 && tokens <= 2780, `Expected ~2770, got ${tokens}`);
15
+ });
16
+ void it('handles zero dimensions', () => {
17
+ assert.equal(calculateImageTokens(0, 0), 0);
18
+ assert.equal(calculateImageTokens(1000, 0), 0);
19
+ assert.equal(calculateImageTokens(0, 1000), 0);
20
+ });
21
+ void it('rounds up (ceil) for fractional results', () => {
22
+ const tokens = calculateImageTokens(100, 100);
23
+ assert.equal(tokens, Math.ceil(10000 / 750));
24
+ assert.equal(tokens, 14);
25
+ });
26
+ });
27
+ void describe('calculateResizeScale', () => {
28
+ void it('returns 1 when both dimensions are within limit', () => {
29
+ assert.equal(calculateResizeScale(1000, 1000), 1);
30
+ assert.equal(calculateResizeScale(MAX_EDGE_PX, 500), 1);
31
+ assert.equal(calculateResizeScale(500, MAX_EDGE_PX), 1);
32
+ });
33
+ void it('returns 1 when exactly at max edge', () => {
34
+ assert.equal(calculateResizeScale(MAX_EDGE_PX, MAX_EDGE_PX), 1);
35
+ });
36
+ void it('scales down when width exceeds limit', () => {
37
+ const scale = calculateResizeScale(3136, 1000);
38
+ assert.ok(scale < 1, 'Scale should be less than 1');
39
+ assert.equal(scale, MAX_EDGE_PX / 3136);
40
+ });
41
+ void it('scales down when height exceeds limit', () => {
42
+ const scale = calculateResizeScale(1000, 3136);
43
+ assert.ok(scale < 1, 'Scale should be less than 1');
44
+ assert.equal(scale, MAX_EDGE_PX / 3136);
45
+ });
46
+ void it('uses longest edge for scale calculation', () => {
47
+ const scale1 = calculateResizeScale(3000, 2000);
48
+ const scale2 = calculateResizeScale(2000, 3000);
49
+ assert.equal(scale1, scale2, 'Scale should be same regardless of orientation');
50
+ assert.equal(scale1, MAX_EDGE_PX / 3000);
51
+ });
52
+ void it('produces correct scale for Wikipedia-style tall page', () => {
53
+ const scale = calculateResizeScale(1866, 37833);
54
+ const expectedScale = MAX_EDGE_PX / 37833;
55
+ assert.ok(Math.abs(scale - expectedScale) < 0.0001, `Expected ${expectedScale}, got ${scale}`);
56
+ });
57
+ });
58
+ void describe('isTallPage', () => {
59
+ void it('returns false for square pages', () => {
60
+ assert.equal(isTallPage(1000, 1000), false);
61
+ });
62
+ void it('returns false for normal aspect ratios', () => {
63
+ assert.equal(isTallPage(1920, 1080), false);
64
+ assert.equal(isTallPage(1920, 3000), false);
65
+ assert.equal(isTallPage(1920, 5760), false);
66
+ });
67
+ void it('returns true when aspect ratio exceeds threshold', () => {
68
+ assert.equal(isTallPage(1000, 3001), true);
69
+ assert.equal(isTallPage(1920, 6000), true);
70
+ });
71
+ void it('uses threshold of 3:1', () => {
72
+ assert.equal(TALL_PAGE_THRESHOLD, 3);
73
+ assert.equal(isTallPage(1000, 3000), false);
74
+ assert.equal(isTallPage(1000, 3001), true);
75
+ });
76
+ void it('handles zero width gracefully', () => {
77
+ assert.equal(isTallPage(0, 1000), false);
78
+ });
79
+ void it('detects Wikipedia-style tall pages', () => {
80
+ assert.equal(isTallPage(1866, 37833), true);
81
+ });
82
+ });
83
+ void describe('shouldResize', () => {
84
+ void it('returns false when dimensions are within limit', () => {
85
+ assert.equal(shouldResize(1000, 1000, false), false);
86
+ assert.equal(shouldResize(MAX_EDGE_PX, MAX_EDGE_PX, false), false);
87
+ });
88
+ void it('returns true when width exceeds limit', () => {
89
+ assert.equal(shouldResize(2000, 1000, false), true);
90
+ });
91
+ void it('returns true when height exceeds limit', () => {
92
+ assert.equal(shouldResize(1000, 2000, false), true);
93
+ });
94
+ void it('respects noResize flag', () => {
95
+ assert.equal(shouldResize(5000, 5000, true), false);
96
+ assert.equal(shouldResize(5000, 5000, false), true);
97
+ });
98
+ void it('checks longest edge, not total pixels', () => {
99
+ assert.equal(shouldResize(1568, 1568, false), false);
100
+ assert.equal(shouldResize(1569, 1, false), true);
101
+ });
102
+ });
103
+ void describe('calculateFinalDimensions', () => {
104
+ void it('returns original dimensions when scale is 1', () => {
105
+ const result = calculateFinalDimensions(1920, 1080, 1);
106
+ assert.deepEqual(result, { width: 1920, height: 1080 });
107
+ });
108
+ void it('scales dimensions proportionally', () => {
109
+ const result = calculateFinalDimensions(2000, 1000, 0.5);
110
+ assert.deepEqual(result, { width: 1000, height: 500 });
111
+ });
112
+ void it('rounds to nearest integer', () => {
113
+ const result = calculateFinalDimensions(1000, 1000, 0.333);
114
+ assert.equal(result.width, 333);
115
+ assert.equal(result.height, 333);
116
+ });
117
+ void it('produces max edge of 1568 when scaling oversized image', () => {
118
+ const scale = calculateResizeScale(3136, 2000);
119
+ const result = calculateFinalDimensions(3136, 2000, scale);
120
+ assert.equal(result.width, MAX_EDGE_PX);
121
+ assert.ok(result.height <= MAX_EDGE_PX);
122
+ });
123
+ });
124
+ void describe('calculateActualDimensions', () => {
125
+ void it('returns same dimensions for 1x display', () => {
126
+ const result = calculateActualDimensions(1920, 1080, 1);
127
+ assert.deepEqual(result, { width: 1920, height: 1080 });
128
+ });
129
+ void it('doubles dimensions for 2x Retina display', () => {
130
+ const result = calculateActualDimensions(1920, 1080, 2);
131
+ assert.deepEqual(result, { width: 3840, height: 2160 });
132
+ });
133
+ void it('handles fractional DPR', () => {
134
+ const result = calculateActualDimensions(1000, 1000, 1.5);
135
+ assert.deepEqual(result, { width: 1500, height: 1500 });
136
+ });
137
+ void it('rounds to nearest integer', () => {
138
+ const result = calculateActualDimensions(100, 100, 1.333);
139
+ assert.equal(result.width, 133);
140
+ assert.equal(result.height, 133);
141
+ });
142
+ });
143
+ void describe('constants', () => {
144
+ void it('MAX_EDGE_PX matches Anthropic recommendation', () => {
145
+ assert.equal(MAX_EDGE_PX, 1568);
146
+ });
147
+ void it('PIXELS_PER_TOKEN matches Claude Vision formula', () => {
148
+ assert.equal(PIXELS_PER_TOKEN, 750);
149
+ });
150
+ void it('TALL_PAGE_THRESHOLD is 3:1 aspect ratio', () => {
151
+ assert.equal(TALL_PAGE_THRESHOLD, 3);
152
+ });
153
+ });
154
+ void describe('integration: end-to-end resize calculation', () => {
155
+ void it('correctly handles normal page on 2x display', () => {
156
+ const cssWidth = 1920;
157
+ const cssHeight = 1080;
158
+ const dpr = 2;
159
+ const needsResize = shouldResize(cssWidth, cssHeight, false);
160
+ assert.equal(needsResize, true);
161
+ const scale = calculateResizeScale(cssWidth, cssHeight);
162
+ const finalCss = calculateFinalDimensions(cssWidth, cssHeight, scale);
163
+ const actual = calculateActualDimensions(finalCss.width, finalCss.height, dpr);
164
+ const tokens = calculateImageTokens(actual.width, actual.height);
165
+ assert.ok(finalCss.width <= MAX_EDGE_PX);
166
+ assert.ok(finalCss.height <= MAX_EDGE_PX);
167
+ assert.ok(tokens < 10000, `Tokens should be reasonable, got ${tokens}`);
168
+ });
169
+ void it('correctly handles tall page detection and fallback', () => {
170
+ const cssWidth = 1866;
171
+ const cssHeight = 37833;
172
+ const tall = isTallPage(cssWidth, cssHeight);
173
+ assert.equal(tall, true);
174
+ const viewportWidth = 1400;
175
+ const viewportHeight = 900;
176
+ const scale = calculateResizeScale(viewportWidth, viewportHeight);
177
+ assert.equal(scale, 1, 'Viewport within MAX_EDGE_PX should not need resize');
178
+ });
179
+ void it('token calculation matches expected for Anthropic sweet spot', () => {
180
+ const tokens = calculateImageTokens(1092, 1092);
181
+ assert.ok(tokens >= 1500 && tokens <= 1700, `Expected ~1590 tokens, got ${tokens}`);
182
+ });
183
+ });
184
+ //# sourceMappingURL=screenshotResize.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screenshotResize.unit.test.js","sourceRoot":"","sources":["../../../../src/commands/dom/__tests__/screenshotResize.unit.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"a11y.d.ts","sourceRoot":"","sources":["../../../src/commands/dom/a11y.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0LzC;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CA2D1D"}
1
+ {"version":3,"file":"a11y.d.ts","sourceRoot":"","sources":["../../../src/commands/dom/a11y.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+LzC;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CA2D1D"}
@@ -15,7 +15,7 @@ import { jsonOption } from '../../commands/shared/commonOptions.js';
15
15
  import { collectA11yTree, queryA11yTree, parseQueryPattern, resolveA11yNode, } from '../../telemetry/a11y.js';
16
16
  import { CommandError } from '../../ui/errors/index.js';
17
17
  import { formatA11yTree, formatA11yQueryResult, formatA11yNodeWithContext, } from '../../ui/formatters/a11y.js';
18
- import { elementNotFoundError } from '../../ui/messages/errors.js';
18
+ import { elementNotFoundError, invalidQueryPatternError, noA11yNodesFoundError, elementNotAccessibleError, } from '../../ui/messages/errors.js';
19
19
  import { EXIT_CODES } from '../../utils/exitCodes.js';
20
20
  /**
21
21
  * Handle bdg dom a11y tree command
@@ -59,18 +59,14 @@ async function handleA11yQuery(pattern, options) {
59
59
  await runCommand(async () => {
60
60
  const queryPattern = parseQueryPattern(pattern);
61
61
  if (!queryPattern.role && !queryPattern.name && !queryPattern.description) {
62
- throw new CommandError('Query pattern must specify at least one field', {
63
- suggestion: 'Try: bdg dom a11y query "role:button" or "name:Submit"',
64
- note: `Received: "${pattern}"`,
65
- }, EXIT_CODES.INVALID_ARGUMENTS);
62
+ const err = invalidQueryPatternError(pattern);
63
+ throw new CommandError(err.message, { suggestion: err.suggestion }, EXIT_CODES.INVALID_ARGUMENTS);
66
64
  }
67
65
  const tree = await collectA11yTree();
68
66
  const result = queryA11yTree(tree, queryPattern);
69
67
  if (result.count === 0) {
70
- throw new CommandError('No nodes found matching pattern', {
71
- suggestion: 'Try a broader query or use "bdg dom a11y tree" to see all elements',
72
- note: `Pattern: ${JSON.stringify(queryPattern)}`,
73
- }, EXIT_CODES.RESOURCE_NOT_FOUND);
68
+ const err = noA11yNodesFoundError(pattern);
69
+ throw new CommandError(err.message, { suggestion: err.suggestion }, EXIT_CODES.RESOURCE_NOT_FOUND);
74
70
  }
75
71
  return { success: true, data: result };
76
72
  }, options, formatA11yQueryResult);
@@ -113,6 +109,10 @@ async function handleA11yDescribe(selectorOrIndex, options) {
113
109
  node = await resolveA11yNode(selectorOrIndex);
114
110
  }
115
111
  if (!node) {
112
+ if (isNumericIndex) {
113
+ const err = elementNotAccessibleError(parseInt(selectorOrIndex, 10));
114
+ throw new CommandError(err.message, { suggestion: err.suggestion }, EXIT_CODES.STALE_CACHE);
115
+ }
116
116
  throw new CommandError(elementNotFoundError(selectorOrIndex), {}, EXIT_CODES.RESOURCE_NOT_FOUND);
117
117
  }
118
118
  let domContext = null;
@@ -1 +1 @@
1
- {"version":3,"file":"a11y.js","sourceRoot":"","sources":["../../../src/commands/dom/a11y.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"a11y.js","sourceRoot":"","sources":["../../../src/commands/dom/a11y.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAMhE,OAAO,EACL,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD;;;;;;;GAOG;AACH,KAAK,UAAU,cAAc,CAAC,OAA+B;IAC3D,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,cAAc,CAAC,KAAK,IAAI,EAAE;YAC9B,MAAM,IAAI,GAAG,MAAM,eAAe,EAAE,CAAC;YACrC,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;gBACrC,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,eAAe,EAAE,CAAC;IACrC,MAAM,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;AAClG,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,KAAK,UAAU,eAAe,CAAC,OAAe,EAAE,OAAgC;IAC9E,MAAM,UAAU,CACd,KAAK,IAAI,EAAE;QACT,MAAM,YAAY,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAEhD,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;YAC1E,MAAM,GAAG,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;YAC9C,MAAM,IAAI,YAAY,CACpB,GAAG,CAAC,OAAO,EACX,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,EAC9B,UAAU,CAAC,iBAAiB,CAC7B,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,eAAe,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAEjD,IAAI,MAAM,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;YAC3C,MAAM,IAAI,YAAY,CACpB,GAAG,CAAC,OAAO,EACX,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,EAC9B,UAAU,CAAC,kBAAkB,CAC9B,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACzC,CAAC,EACD,OAAO,EACP,qBAAqB,CACtB,CAAC;AACJ,CAAC;AAUD;;;;;;;;;;;;;;;;;;GAkBG;AACH,KAAK,UAAU,kBAAkB,CAC/B,eAAuB,EACvB,OAAmC;IAEnC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,WAAW,EAAE,CAAC;IAClD,MAAM,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;IAEhE;;OAEG;IACH,KAAK,UAAU,iBAAiB;QAC9B,IAAI,IAAqB,CAAC;QAC1B,IAAI,MAA0B,CAAC;QAE/B,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,QAAQ,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;YAC5C,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC3D,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;YAC3B,IAAI,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,MAAM,eAAe,CAAC,eAAe,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,GAAG,GAAG,yBAAyB,CAAC,QAAQ,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC;gBACrE,MAAM,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;YAC9F,CAAC;YACD,MAAM,IAAI,YAAY,CACpB,oBAAoB,CAAC,eAAe,CAAC,EACrC,EAAE,EACF,UAAU,CAAC,kBAAkB,CAC9B,CAAC;QACJ,CAAC;QAED,IAAI,UAAU,GAAsB,IAAI,CAAC;QACzC,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,IAAI,MAAM,CAAC;QAClD,IAAI,SAAS,EAAE,CAAC;YACd,UAAU,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC9B,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,cAAc,CAAC,iBAAiB,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,UAAU,CACd,KAAK,IAAI,EAAE;QACT,MAAM,IAAI,GAAG,MAAM,iBAAiB,EAAE,CAAC;QACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACjC,CAAC,EACD,OAAO,EACP,yBAAyB,CAC1B,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAe;IAClD,MAAM,IAAI,GAAG,MAAM;SAChB,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,oDAAoD,CAAC;SACjE,QAAQ,CACP,UAAU,EACV,sGAAsG,CACvG;SACA,uBAAuB,EAAE;SACzB,MAAM,CAAC,KAAK,EAAE,MAA0B,EAAE,OAAmC,EAAE,EAAE;QAChF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,aAAa,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACrE,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAEpE,IAAI,cAAc,IAAI,aAAa,EAAE,CAAC;YACpC,MAAM,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;aAAM,IAAI,cAAc,EAAE,CAAC;YAC1B,MAAM,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,MAAM,eAAe,CAAC,SAAS,MAAM,GAAG,EAAE,OAAO,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,sDAAsD,CAAC;SACnE,SAAS,CAAC,UAAU,EAAE,CAAC;SACvB,MAAM,CAAC,KAAK,EAAE,OAA+B,EAAE,EAAE;QAChD,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,iFAAiF,CAAC;SAC9F,QAAQ,CACP,WAAW,EACX,0FAA0F,CAC3F;SACA,SAAS,CAAC,UAAU,EAAE,CAAC;SACvB,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,OAAgC,EAAE,EAAE;QAClE,MAAM,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,wDAAwD,CAAC;SACrE,QAAQ,CACP,mBAAmB,EACnB,0EAA0E,CAC3E;SACA,SAAS,CAAC,UAAU,EAAE,CAAC;SACvB,MAAM,CAAC,KAAK,EAAE,eAAuB,EAAE,OAAmC,EAAE,EAAE;QAC7E,MAAM,kBAAkB,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"evalHelpers.d.ts","sourceRoot":"","sources":["../../../src/commands/dom/evalHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAuDlF;;;;;GAKG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAU9C;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,IAAI,eAAe,CAY7D;AAED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB/F;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,aAAa,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,CA6B5C"}
1
+ {"version":3,"file":"evalHelpers.d.ts","sourceRoot":"","sources":["../../../src/commands/dom/evalHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AA4DlF;;;;;GAKG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAU9C;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,IAAI,eAAe,CAa7D;AAED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB/F;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,aAAa,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,CA0B5C"}
@@ -1,7 +1,7 @@
1
1
  import { readSessionMetadata } from '../../session/metadata.js';
2
2
  import { readPid } from '../../session/pid.js';
3
3
  import { CommandError } from '../../ui/errors/index.js';
4
- import { sessionNotActiveError } from '../../ui/messages/errors.js';
4
+ import { sessionNotActiveError, sessionMetadataMissingError, sessionTargetNotFoundError, scriptExecutionError, } from '../../ui/messages/errors.js';
5
5
  import { EXIT_CODES } from '../../utils/exitCodes.js';
6
6
  import { fetchCDPTargetById } from '../../utils/http.js';
7
7
  import { isProcessAlive } from '../../utils/process.js';
@@ -66,7 +66,8 @@ export function validateActiveSession() {
66
66
  export function getValidatedSessionMetadata() {
67
67
  const metadata = readSessionMetadata();
68
68
  if (!metadata?.targetId || !metadata.webSocketDebuggerUrl) {
69
- throw new CommandError('No target information in session metadata', { note: 'Session may have been started with an older version' }, EXIT_CODES.SESSION_FILE_ERROR);
69
+ const err = sessionMetadataMissingError('targetId or webSocketDebuggerUrl');
70
+ throw new CommandError(err.message, { suggestion: err.suggestion }, EXIT_CODES.SESSION_FILE_ERROR);
70
71
  }
71
72
  return metadata;
72
73
  }
@@ -82,11 +83,13 @@ export function getValidatedSessionMetadata() {
82
83
  */
83
84
  export async function verifyTargetExists(metadata, port) {
84
85
  if (!metadata.targetId) {
85
- throw new CommandError('Session metadata missing targetId', { suggestion: 'Start a new session with: bdg <url>' }, EXIT_CODES.RESOURCE_NOT_FOUND);
86
+ const err = sessionMetadataMissingError('targetId');
87
+ throw new CommandError(err.message, { suggestion: err.suggestion }, EXIT_CODES.RESOURCE_NOT_FOUND);
86
88
  }
87
89
  const target = await fetchCDPTargetById(metadata.targetId, port);
88
90
  if (!target) {
89
- throw new CommandError('Session target not found (tab may have been closed)', { suggestion: 'Start a new session with: bdg <url>' }, EXIT_CODES.RESOURCE_NOT_FOUND);
91
+ const err = sessionTargetNotFoundError();
92
+ throw new CommandError(err.message, { suggestion: err.suggestion }, EXIT_CODES.RESOURCE_NOT_FOUND);
90
93
  }
91
94
  }
92
95
  /**
@@ -105,13 +108,13 @@ export async function executeScript(cdp, script) {
105
108
  });
106
109
  if (!isRuntimeEvaluateResult(response)) {
107
110
  throw new CommandError('Invalid CDP Runtime.evaluate response structure', {
108
- note: 'CDP response did not match expected format',
109
- suggestion: 'This may indicate a CDP protocol version mismatch',
111
+ suggestion: 'CDP response did not match expected format. This may indicate a CDP protocol version mismatch',
110
112
  }, EXIT_CODES.CDP_CONNECTION_FAILURE);
111
113
  }
112
114
  if (response.exceptionDetails) {
113
115
  const errorMsg = response.exceptionDetails.exception?.description ?? 'Unknown error executing script';
114
- throw new CommandError(errorMsg, { note: 'Script execution failed in browser context' }, EXIT_CODES.SOFTWARE_ERROR);
116
+ const err = scriptExecutionError(errorMsg);
117
+ throw new CommandError(err.message, { suggestion: err.suggestion }, EXIT_CODES.SOFTWARE_ERROR);
115
118
  }
116
119
  return response;
117
120
  }