@skyramp/mcp 0.4.1 → 0.4.2-rc.2

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 (583) hide show
  1. package/build/commands/localDevTestChangesCommand.js +2 -1
  2. package/build/commands/recommendTestsAndExecuteCommand.js +15 -7
  3. package/build/commands/testThisEndpointCommand.js +35 -6
  4. package/build/execution/wrapperConfig.d.ts +56 -0
  5. package/build/execution/wrapperConfig.js +155 -0
  6. package/build/index.js +40 -10
  7. package/build/playwright/blueprintDigest.js +28 -7
  8. package/build/playwright/registerPlaywrightTools.js +47 -28
  9. package/build/playwright/traceExportStore.d.ts +22 -0
  10. package/build/playwright/traceExportStore.js +81 -0
  11. package/build/playwright/traceRecordingPrompt.js +11 -3
  12. package/build/prompts/code-reuse.js +118 -49
  13. package/build/prompts/fix-error-prompt.d.ts +9 -1
  14. package/build/prompts/fix-error-prompt.js +31 -28
  15. package/build/prompts/local-dev/local-dev-plan.d.ts +3 -0
  16. package/build/prompts/local-dev/local-dev-plan.js +8 -23
  17. package/build/prompts/local-dev/local-dev-prompts.d.ts +1 -1
  18. package/build/prompts/local-dev/local-dev-prompts.js +31 -4
  19. package/build/prompts/modularization/integration-test-modularization.js +13 -6
  20. package/build/prompts/modularization/ui-test-modularization.js +1 -1
  21. package/build/prompts/personas.js +1 -1
  22. package/build/prompts/pom-aware-code-reuse.js +7 -9
  23. package/build/prompts/reuse-hand-off.d.ts +64 -0
  24. package/build/prompts/reuse-hand-off.js +130 -0
  25. package/build/prompts/shared-helper-policy.d.ts +124 -2
  26. package/build/prompts/shared-helper-policy.js +178 -12
  27. package/build/prompts/startTraceCollectionPrompts.js +1 -1
  28. package/build/prompts/sut-setup/modes/adaptWorkflowPrompt.js +7 -8
  29. package/build/prompts/sut-setup/modes/dockerComposePrompt.js +1 -1
  30. package/build/prompts/sut-setup/shared.d.ts +4 -1
  31. package/build/prompts/sut-setup/shared.js +6 -4
  32. package/build/prompts/test-maintenance/actionsInstructions.d.ts +19 -11
  33. package/build/prompts/test-maintenance/actionsInstructions.js +47 -26
  34. package/build/prompts/test-maintenance/drift-analysis-prompt.d.ts +16 -8
  35. package/build/prompts/test-maintenance/drift-analysis-prompt.js +93 -38
  36. package/build/prompts/test-maintenance/driftAnalysisSections.js +5 -3
  37. package/build/prompts/test-maintenance/driftAnalysisShared.js +4 -2
  38. package/build/prompts/test-maintenance/uiDriftAnalysisSections.js +8 -5
  39. package/build/prompts/test-recommendation/recommendationSections.js +19 -8
  40. package/build/prompts/test-recommendation/recommendationShared.d.ts +1 -1
  41. package/build/prompts/test-recommendation/recommendationShared.js +0 -1
  42. package/build/prompts/test-recommendation/registerRecommendTestsPrompt.js +5 -2
  43. package/build/prompts/test-recommendation/test-recommendation-prompt.js +10 -7
  44. package/build/prompts/testbot/testbot-prompts.js +133 -63
  45. package/build/recommendation/answers.js +18 -9
  46. package/build/recommendation/pullRequestText.js +1 -1
  47. package/build/recommendation/registerPlan.js +31 -17
  48. package/build/recommendation/subjectStep.d.ts +8 -10
  49. package/build/recommendation/subjectStep.js +17 -16
  50. package/build/recommendation/types.d.ts +71 -17
  51. package/build/recommendation/types.js +9 -15
  52. package/build/recommendation/verifierContracts.d.ts +7 -3
  53. package/build/recommendation/verifierContracts.js +8 -4
  54. package/build/recommendation/verifiers/changedFile.js +11 -13
  55. package/build/recommendation/verifiers/citedPath.d.ts +8 -0
  56. package/build/recommendation/verifiers/citedPath.js +16 -2
  57. package/build/recommendation/verifiers/coverage.d.ts +2 -2
  58. package/build/recommendation/verifiers/coverage.js +190 -134
  59. package/build/recommendation/verifiers/defects.js +56 -16
  60. package/build/recommendation/verifiers/deliveredMatchesPlan.d.ts +7 -1
  61. package/build/recommendation/verifiers/deliveredMatchesPlan.js +28 -14
  62. package/build/recommendation/verifiers/endpointGrounded.js +14 -8
  63. package/build/recommendation/verifiers/existingCoverage.d.ts +6 -0
  64. package/build/recommendation/verifiers/existingCoverage.js +30 -21
  65. package/build/recommendation/verifiers/expectedOutcome.js +17 -8
  66. package/build/recommendation/verifiers/expectedValueSourced.js +54 -43
  67. package/build/recommendation/verifiers/issueTraceability.d.ts +5 -0
  68. package/build/recommendation/verifiers/issueTraceability.js +64 -7
  69. package/build/recommendation/verifiers/removedElementGuarded.js +19 -11
  70. package/build/recommendation/verifiers/reportedCategory.js +9 -4
  71. package/build/recommendation/verifiers/requirementSourced.js +34 -21
  72. package/build/recommendation/verifiers/screenRoute.js +15 -10
  73. package/build/recommendation/verifiers/statedDifference.js +15 -8
  74. package/build/recommendation/verifiers/uiElementGrounded.js +50 -16
  75. package/build/resources/analysisResources.js +7 -3
  76. package/build/resources/progressResource.js +4 -2
  77. package/build/resources/sutSetupResource.js +20 -2
  78. package/build/resources/testbotResource.js +19 -1
  79. package/build/services/AnalyticsService.js +3 -1
  80. package/build/services/ScenarioGenerationService.js +5 -5
  81. package/build/services/TestDiscoveryService.js +53 -9
  82. package/build/services/TestExecutionService.js +63 -21
  83. package/build/services/TestGenerationService.d.ts +1 -1
  84. package/build/services/TestGenerationService.js +43 -24
  85. package/build/skills/enhanceAssertionsSkill.d.ts +45 -0
  86. package/build/skills/enhanceAssertionsSkill.js +103 -0
  87. package/build/skills/fixTestImportErrorsSkill.d.ts +2 -2
  88. package/build/skills/fixTestImportErrorsSkill.js +2 -2
  89. package/build/skills/runTestSkill.d.ts +6 -0
  90. package/build/skills/runTestSkill.js +17 -0
  91. package/build/skills/skillFiles.d.ts +38 -0
  92. package/build/skills/skillFiles.js +94 -0
  93. package/build/skills/validateAssertionAlignmentSkill.d.ts +34 -0
  94. package/build/skills/validateAssertionAlignmentSkill.js +59 -0
  95. package/build/tool-phases.js +4 -1
  96. package/build/tools/auth/loginTool.js +3 -1
  97. package/build/tools/auth/logoutTool.js +3 -1
  98. package/build/tools/budgetExcuse.d.ts +15 -0
  99. package/build/tools/budgetExcuse.js +113 -0
  100. package/build/tools/code-refactor/alignAssertionsTool.d.ts +2 -0
  101. package/build/tools/code-refactor/alignAssertionsTool.js +51 -0
  102. package/build/tools/code-refactor/assertion-state.d.ts +1 -1
  103. package/build/tools/code-refactor/assertion-state.js +1 -1
  104. package/build/tools/code-refactor/assertionOperations.d.ts +44 -0
  105. package/build/tools/code-refactor/assertionOperations.js +82 -0
  106. package/build/tools/code-refactor/assertionSkillTools.d.ts +3 -0
  107. package/build/tools/code-refactor/assertionSkillTools.js +86 -0
  108. package/build/tools/code-refactor/codeReuseTool.js +27 -3
  109. package/build/tools/code-refactor/enhanceAssertionsTool.js +19 -83
  110. package/build/tools/code-refactor/gate-markers.d.ts +51 -0
  111. package/build/tools/code-refactor/gate-markers.js +95 -0
  112. package/build/tools/code-refactor/retrofit-state.d.ts +3 -1
  113. package/build/tools/code-refactor/retrofit-state.js +44 -2
  114. package/build/tools/code-refactor/reuse-outcome.d.ts +23 -1
  115. package/build/tools/code-refactor/reuse-outcome.js +36 -13
  116. package/build/tools/code-refactor/reuse-state.d.ts +90 -16
  117. package/build/tools/code-refactor/reuse-state.js +191 -61
  118. package/build/tools/code-refactor/utils-verify-gates.d.ts +4 -0
  119. package/build/tools/code-refactor/utils-verify-gates.js +269 -30
  120. package/build/tools/code-refactor/verify-gates.d.ts +15 -1
  121. package/build/tools/code-refactor/verify-gates.js +36 -4
  122. package/build/tools/enrichTestWithMocksTool.d.ts +1 -1
  123. package/build/tools/enrichTestWithMocksTool.js +9 -5
  124. package/build/tools/executeSkyrampTestTool.d.ts +118 -48
  125. package/build/tools/executeSkyrampTestTool.js +998 -372
  126. package/build/tools/execution-video-state.js +1 -1
  127. package/build/tools/fixErrorTool.js +5 -6
  128. package/build/tools/generate-tests/batchMockGenerationTool.js +1 -1
  129. package/build/tools/generate-tests/generateBatchScenarioRestTool.js +114 -73
  130. package/build/tools/generate-tests/generateContractRestTool.js +34 -16
  131. package/build/tools/generate-tests/generateE2ERestTool.d.ts +1 -0
  132. package/build/tools/generate-tests/generateE2ERestTool.js +9 -1
  133. package/build/tools/generate-tests/generateIntegrationRestTool.js +22 -7
  134. package/build/tools/generate-tests/generateMockRestTool.js +3 -1
  135. package/build/tools/generate-tests/generateUIRestTool.d.ts +2 -0
  136. package/build/tools/generate-tests/generateUIRestTool.js +11 -2
  137. package/build/tools/generate-tests/loadTestSchema.js +1 -3
  138. package/build/tools/generate-tests/planGuard.js +6 -3
  139. package/build/tools/generate-tests/scenarioFileIdentity.js +4 -1
  140. package/build/tools/generate-tests/scenarioLint.js +17 -5
  141. package/build/tools/generate-tests/trace-reuse-guard.js +5 -2
  142. package/build/tools/generateEnrichedIntegrationTestTool.js +9 -3
  143. package/build/tools/one-click/oneClickTool.js +3 -1
  144. package/build/tools/preflightMockCheckTool.js +23 -7
  145. package/build/tools/submitReportTool.d.ts +51 -12
  146. package/build/tools/submitReportTool.js +988 -161
  147. package/build/tools/test-management/actionsTool.js +241 -51
  148. package/build/tools/test-management/analyzeChangesTool.d.ts +8 -9
  149. package/build/tools/test-management/analyzeChangesTool.js +127 -68
  150. package/build/tools/test-management/analyzeTestHealthTool.d.ts +0 -11
  151. package/build/tools/test-management/analyzeTestHealthTool.js +42 -76
  152. package/build/tools/test-management/registerTestPlanTool.d.ts +44 -34
  153. package/build/tools/test-management/registerTestPlanTool.js +255 -111
  154. package/build/tools/test-management/resolveScreenTool.js +33 -9
  155. package/build/tools/test-management/testsOwedBeforeRun.d.ts +28 -0
  156. package/build/tools/test-management/testsOwedBeforeRun.js +53 -0
  157. package/build/tools/trace/startTraceCollectionTool.js +3 -1
  158. package/build/tools/trace/stopTraceCollectionTool.js +42 -6
  159. package/build/tools/verifyTestDependenciesTool.d.ts +3 -0
  160. package/build/tools/verifyTestDependenciesTool.js +54 -0
  161. package/build/tools/workspace/initScanWorkspaceTool.js +9 -3
  162. package/build/tools/workspace/initializeWorkspaceTool.js +3 -1
  163. package/build/types/AssertionOutcome.d.ts +1 -1
  164. package/build/types/EnhanceType.d.ts +6 -0
  165. package/build/types/EnhanceType.js +1 -0
  166. package/build/types/RepositoryAnalysis.d.ts +32 -72
  167. package/build/types/ReuseOutcome.d.ts +100 -7
  168. package/build/types/ReuseOutcome.js +16 -0
  169. package/build/types/StepMethod.js +20 -6
  170. package/build/types/TestAnalysis.d.ts +10 -2
  171. package/build/types/TestExecution.d.ts +45 -0
  172. package/build/types/TestRecommendation.d.ts +1 -1
  173. package/build/types/TestRecommendation.js +4 -1
  174. package/build/types/TestTypes.d.ts +16 -0
  175. package/build/types/TestTypes.js +40 -3
  176. package/build/types/TestbotPromptOptions.d.ts +9 -1
  177. package/build/types/TestbotReport.d.ts +45 -9
  178. package/build/utils/AnalysisStateManager.d.ts +137 -34
  179. package/build/utils/AnalysisStateManager.js +228 -44
  180. package/build/utils/assertion-verify/api-shared-lints.js +34 -16
  181. package/build/utils/assertion-verify/metrics.js +39 -6
  182. package/build/utils/assertion-verify/ui-lints.js +4 -2
  183. package/build/utils/branchDiff.js +47 -12
  184. package/build/utils/canonicalJson.js +3 -1
  185. package/build/utils/connectionErrors.d.ts +10 -0
  186. package/build/utils/connectionErrors.js +10 -0
  187. package/build/utils/dartRouteExtractor.js +36 -7
  188. package/build/utils/fixAttempts.d.ts +26 -0
  189. package/build/utils/fixAttempts.js +109 -0
  190. package/build/utils/frontendSelectors.js +23 -4
  191. package/build/utils/generatedTestRecord.d.ts +19 -0
  192. package/build/utils/generatedTestRecord.js +61 -0
  193. package/build/utils/gitStaging.js +7 -2
  194. package/build/utils/initAgent.js +26 -6
  195. package/build/utils/language-helper.js +60 -45
  196. package/build/utils/pathMatching.js +2 -1
  197. package/build/utils/pathSignatures.js +6 -2
  198. package/build/utils/planMatchKeys.d.ts +2 -2
  199. package/build/utils/planMatchKeys.js +20 -14
  200. package/build/utils/pom-catalog-parse.js +7 -2
  201. package/build/utils/pom-scope/import-expansion.js +6 -1
  202. package/build/utils/pom-scope/index.js +50 -12
  203. package/build/utils/pom-scope/scoring.js +13 -3
  204. package/build/utils/pom-scope/selector-extractor.js +16 -3
  205. package/build/utils/pom-scope/strip.d.ts +8 -0
  206. package/build/utils/pom-scope/strip.js +238 -0
  207. package/build/utils/pom-scope/testIdDiscovery.js +14 -2
  208. package/build/utils/pom-verify/__fixtures__/af-style/asset-list.page.d.ts +1 -1
  209. package/build/utils/pom-verify/__fixtures__/af-style/asset-list.page.js +4 -2
  210. package/build/utils/pom-verify/__fixtures__/af-style/report.iframe.page.js +3 -1
  211. package/build/utils/pom-verify/__fixtures__/af-style/workflow-footer.page.js +3 -1
  212. package/build/utils/pom-verify/bindings.js +5 -1
  213. package/build/utils/pom-verify/calls.js +9 -2
  214. package/build/utils/pom-verify/verify.js +27 -5
  215. package/build/utils/pr-comment-parser.js +20 -7
  216. package/build/utils/progress.d.ts +1 -1
  217. package/build/utils/progress.js +1 -1
  218. package/build/utils/proxy-terminal.d.ts +19 -1
  219. package/build/utils/proxy-terminal.js +346 -21
  220. package/build/utils/rebaselineSnapshots.d.ts +1 -1
  221. package/build/utils/rebaselineSnapshots.js +6 -16
  222. package/build/utils/removedUiElements.js +1 -1
  223. package/build/utils/reportLanguage.js +35 -7
  224. package/build/utils/reportVerification.d.ts +14 -8
  225. package/build/utils/reportVerification.js +19 -19
  226. package/build/utils/repositorySlug.d.ts +32 -0
  227. package/build/utils/repositorySlug.js +77 -0
  228. package/build/utils/reuseRouting.d.ts +10 -0
  229. package/build/utils/reuseRouting.js +21 -2
  230. package/build/utils/runContextGauge.d.ts +27 -0
  231. package/build/utils/runContextGauge.js +181 -0
  232. package/build/utils/runSerialized.d.ts +3 -0
  233. package/build/utils/runSerialized.js +39 -0
  234. package/build/utils/screenRoutes.js +74 -18
  235. package/build/utils/skyrampMdContent.d.ts +1 -1
  236. package/build/utils/skyrampMdContent.js +1 -1
  237. package/build/utils/skyrampSdkVersion.d.ts +9 -0
  238. package/build/utils/skyrampSdkVersion.js +16 -0
  239. package/build/utils/sourceRouteExtractor.js +13 -6
  240. package/build/utils/telemetry.d.ts +1 -0
  241. package/build/utils/telemetry.js +8 -5
  242. package/build/utils/testDependencyPolicy.d.ts +9 -0
  243. package/build/utils/testDependencyPolicy.js +809 -0
  244. package/build/utils/testExecutionRecord.d.ts +94 -0
  245. package/build/utils/testExecutionRecord.js +269 -0
  246. package/build/utils/testFileClassification.d.ts +8 -0
  247. package/build/utils/testFileClassification.js +39 -4
  248. package/build/utils/trace-parser.js +62 -14
  249. package/build/utils/urlPath.js +3 -1
  250. package/build/utils/utils-verify/action-key.d.ts +46 -0
  251. package/build/utils/utils-verify/action-key.js +120 -38
  252. package/build/utils/utils-verify/action-sites.d.ts +32 -0
  253. package/build/utils/utils-verify/action-sites.js +202 -0
  254. package/build/utils/utils-verify/allow.d.ts +122 -3
  255. package/build/utils/utils-verify/allow.js +146 -21
  256. package/build/utils/utils-verify/body-reach.d.ts +120 -0
  257. package/build/utils/utils-verify/body-reach.js +333 -0
  258. package/build/utils/utils-verify/call-sites.d.ts +31 -7
  259. package/build/utils/utils-verify/call-sites.js +80 -13
  260. package/build/utils/utils-verify/delivered-imports.d.ts +43 -0
  261. package/build/utils/utils-verify/delivered-imports.js +84 -0
  262. package/build/utils/utils-verify/fixed-sleep.d.ts +96 -0
  263. package/build/utils/utils-verify/fixed-sleep.js +461 -0
  264. package/build/utils/utils-verify/in-house.d.ts +93 -0
  265. package/build/utils/utils-verify/in-house.js +719 -0
  266. package/build/utils/utils-verify/incumbent.d.ts +3 -0
  267. package/build/utils/utils-verify/incumbent.js +75 -0
  268. package/build/utils/utils-verify/index.d.ts +2 -0
  269. package/build/utils/utils-verify/index.js +2 -0
  270. package/build/utils/utils-verify/language-spec.d.ts +51 -10
  271. package/build/utils/utils-verify/language-spec.js +232 -21
  272. package/build/utils/utils-verify/locate.d.ts +26 -0
  273. package/build/utils/utils-verify/locate.js +125 -23
  274. package/build/utils/utils-verify/module-name.d.ts +40 -0
  275. package/build/utils/utils-verify/module-name.js +98 -0
  276. package/build/utils/utils-verify/parse.d.ts +56 -7
  277. package/build/utils/utils-verify/parse.js +195 -40
  278. package/build/utils/utils-verify/retrofit-equivalence.d.ts +5 -0
  279. package/build/utils/utils-verify/retrofit-equivalence.js +4 -2
  280. package/build/utils/utils-verify/stage.d.ts +5 -0
  281. package/build/utils/utils-verify/stage.js +47 -2
  282. package/build/utils/utils-verify/status-once.d.ts +62 -0
  283. package/build/utils/utils-verify/status-once.js +207 -0
  284. package/build/utils/utils-verify/typecheck.d.ts +61 -0
  285. package/build/utils/utils-verify/typecheck.js +338 -0
  286. package/build/utils/utils-verify/verify.d.ts +79 -3
  287. package/build/utils/utils-verify/verify.js +531 -61
  288. package/build/utils/versions.d.ts +3 -3
  289. package/build/utils/versions.js +1 -1
  290. package/build/utils/workspaceAuth.js +107 -37
  291. package/build/workspace/queryParamResolution.js +11 -4
  292. package/build/workspace/workspace.d.ts +72 -52
  293. package/build/workspace/workspace.js +19 -15
  294. package/node_modules/playwright/ThirdPartyNotices.txt +19 -19
  295. package/node_modules/playwright/lib/mcp/skyramp/assertTool.js +8 -2
  296. package/node_modules/playwright/lib/mcp/skyramp/common/cssValue.js +87 -0
  297. package/node_modules/playwright/lib/mcp/skyramp/loadTraceTool.js +31 -0
  298. package/node_modules/playwright/lib/mcp/skyramp/skyRampImport.js +3 -0
  299. package/node_modules/playwright/lib/mcp/skyramp/traceRecordingBackend.js +181 -15
  300. package/node_modules/playwright/lib/mcp/test/skyRampExport.js +24 -0
  301. package/node_modules/playwright/lib/transform/babelBundleImpl.js +2353 -190
  302. package/node_modules/playwright/node_modules/playwright-core/ThirdPartyNotices.txt +62 -34
  303. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/.package-lock.json +72 -41
  304. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/@hono/node-server/dist/serve-static.js +1 -1
  305. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/@hono/node-server/dist/serve-static.mjs +1 -1
  306. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/@hono/node-server/package.json +2 -2
  307. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/README.md +16 -1
  308. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/index.js +4 -20
  309. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/read.js +17 -17
  310. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/json.js +60 -32
  311. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/raw.js +3 -3
  312. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/text.js +3 -3
  313. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/urlencoded.js +16 -20
  314. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/utils.js +18 -16
  315. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/LICENSE +22 -0
  316. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/README.md +71 -0
  317. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/dist/index.d.ts +46 -0
  318. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/dist/index.js +176 -0
  319. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/dist/index.js.map +1 -0
  320. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/package.json +52 -0
  321. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/package.json +23 -10
  322. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/CHANGELOG.md +21 -14
  323. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/isObject.d.ts +1 -1
  324. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/package.json +6 -7
  325. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/tsconfig.json +1 -0
  326. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/index.js +266 -45
  327. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/lib/schemes.js +9 -4
  328. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/lib/utils.js +396 -92
  329. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/package.json +1 -1
  330. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/component-safe-serialization.test.js +163 -0
  331. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/equal.test.js +31 -3
  332. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/fixtures/uri-js-parse.json +2 -0
  333. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/ipv6-canonical.test.js +34 -0
  334. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/ipv6-validation.test.js +124 -0
  335. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/malformed-percent.test.js +77 -0
  336. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/malformed-urn.test.js +61 -0
  337. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/parse.test.js +7 -3
  338. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/query-fragment-normalization.test.js +33 -0
  339. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/reserved-path-normalization.test.js +109 -0
  340. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/scheme-validation.test.js +124 -0
  341. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/security-normalization.test.js +101 -0
  342. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/security.test.js +301 -3
  343. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/urn-full-input.test.js +29 -0
  344. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/websocket-query-preservation.test.js +24 -0
  345. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hasown/CHANGELOG.md +7 -0
  346. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hasown/index.d.ts +0 -1
  347. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hasown/package.json +4 -5
  348. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/client/client.js +30 -16
  349. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/client/utils.js +4 -1
  350. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/context.js +32 -13
  351. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/accepts/accepts.js +36 -2
  352. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/proxy/index.js +4 -0
  353. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/ssg/ssg.js +1 -1
  354. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/ssg/utils.js +30 -10
  355. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/streaming/sse.js +5 -4
  356. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/hono-base.js +10 -8
  357. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/base.js +44 -23
  358. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/components.js +25 -26
  359. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/context.js +5 -5
  360. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/dom/render.js +2 -0
  361. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/dom/server.js +5 -1
  362. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/hooks/index.js +16 -13
  363. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/intrinsic-element/components.js +3 -3
  364. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/streaming.js +4 -5
  365. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/cache/index.js +103 -8
  366. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/compress/index.js +5 -0
  367. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/cors/index.js +17 -14
  368. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/csrf/index.js +1 -1
  369. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/etag/digest.js +47 -1
  370. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/etag/index.js +7 -4
  371. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/jwk/jwk.js +9 -4
  372. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/jwt/jwt.js +9 -4
  373. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/language/language.js +10 -6
  374. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/method-not-allowed/index.js +90 -0
  375. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/pretty-json/index.js +3 -1
  376. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/secure-headers/secure-headers.js +16 -7
  377. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/request.js +20 -13
  378. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/linear-router/router.js +7 -2
  379. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/pattern-router/router.js +3 -9
  380. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/reg-exp-router/node.js +65 -59
  381. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/reg-exp-router/router.js +71 -128
  382. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/reg-exp-router/trie.js +14 -5
  383. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/trie-router/node.js +47 -70
  384. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/trie-router/router.js +3 -11
  385. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/utils.js +27 -0
  386. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router.js +1 -1
  387. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/accept.js +1 -1
  388. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/body.js +21 -3
  389. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/cookie.js +4 -3
  390. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/ipaddr.js +5 -3
  391. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/stream.js +12 -3
  392. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/url.js +19 -11
  393. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/client/client.js +30 -16
  394. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/client/utils.js +4 -1
  395. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/context.js +32 -13
  396. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/accepts/accepts.js +36 -2
  397. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/proxy/index.js +4 -0
  398. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/ssg/ssg.js +1 -1
  399. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/ssg/utils.js +30 -10
  400. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/streaming/sse.js +5 -4
  401. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/hono-base.js +10 -8
  402. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/base.js +41 -23
  403. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/components.js +26 -27
  404. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/context.js +6 -6
  405. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/dom/render.js +2 -0
  406. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/dom/server.js +5 -1
  407. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/hooks/index.js +16 -13
  408. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/intrinsic-element/components.js +4 -4
  409. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/streaming.js +5 -6
  410. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/cache/index.js +103 -8
  411. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/compress/index.js +5 -0
  412. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/cors/index.js +17 -14
  413. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/csrf/index.js +1 -1
  414. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/etag/digest.js +47 -1
  415. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/etag/index.js +7 -4
  416. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/jwk/jwk.js +9 -4
  417. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/jwt/jwt.js +9 -4
  418. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/language/language.js +10 -6
  419. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/method-not-allowed/index.js +68 -0
  420. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/pretty-json/index.js +3 -1
  421. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/secure-headers/secure-headers.js +16 -7
  422. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/request.js +21 -14
  423. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/linear-router/router.js +7 -2
  424. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/pattern-router/router.js +3 -9
  425. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/reg-exp-router/node.js +61 -58
  426. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/reg-exp-router/router.js +77 -129
  427. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/reg-exp-router/trie.js +14 -5
  428. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/trie-router/node.js +47 -70
  429. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/trie-router/router.js +3 -11
  430. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/utils.js +5 -0
  431. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router.js +1 -1
  432. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/adapter/aws-lambda/types.d.ts +9 -0
  433. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/client/types.d.ts +1 -1
  434. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/context.d.ts +6 -2
  435. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/hono-base.d.ts +4 -3
  436. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/base.d.ts +7 -2
  437. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/dom/index.d.ts +5 -5
  438. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/dom/intrinsic-element/components.d.ts +2 -2
  439. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/dom/server.d.ts +5 -5
  440. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/hooks/index.d.ts +8 -6
  441. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/index.d.ts +5 -5
  442. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/cache/index.d.ts +6 -4
  443. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/combine/index.d.ts +1 -1
  444. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/cors/index.d.ts +1 -1
  445. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/jsx-renderer/index.d.ts +2 -2
  446. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/jwk/jwk.d.ts +2 -0
  447. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/jwt/jwt.d.ts +2 -0
  448. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/method-not-allowed/index.d.ts +49 -0
  449. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/secure-headers/permissions-policy.d.ts +3 -3
  450. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/reg-exp-router/node.d.ts +4 -1
  451. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/reg-exp-router/trie.d.ts +2 -1
  452. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/trie-router/node.d.ts +1 -2
  453. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/trie-router/router.d.ts +0 -1
  454. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/utils.d.ts +1 -0
  455. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router.d.ts +1 -1
  456. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/utils/headers.d.ts +2 -2
  457. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/utils/url.d.ts +5 -0
  458. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/accept.js +1 -1
  459. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/body.js +21 -3
  460. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/cookie.js +5 -4
  461. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/ipaddr.js +5 -3
  462. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/stream.js +12 -3
  463. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/url.js +17 -10
  464. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/package.json +11 -4
  465. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/README.md +173 -143
  466. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/address-error.d.ts +11 -0
  467. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/address-error.js.map +1 -1
  468. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/common.d.ts +49 -0
  469. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/common.js +79 -4
  470. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/common.js.map +1 -1
  471. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv4.d.ts +78 -5
  472. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv4.js +119 -24
  473. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv4.js.map +1 -1
  474. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv6.d.ts +151 -10
  475. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv6.js +316 -90
  476. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv6.js.map +1 -1
  477. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v4/constants.d.ts +12 -0
  478. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v4/constants.js +45 -2
  479. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v4/constants.js.map +1 -1
  480. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v6/constants.d.ts +14 -0
  481. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v6/constants.js +50 -3
  482. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v6/constants.js.map +1 -1
  483. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/package.json +6 -4
  484. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/.github/THREAT_MODEL.md +3 -3
  485. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/CHANGELOG.md +26 -0
  486. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/README.md +19 -1
  487. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/dist/qs.js +25 -25
  488. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/eslint.config.mjs +1 -1
  489. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/lib/parse.js +16 -6
  490. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/lib/stringify.js +23 -8
  491. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/lib/utils.js +57 -11
  492. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/package.json +8 -7
  493. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/test/parse.js +419 -0
  494. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/test/stringify.js +317 -0
  495. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/test/utils.js +206 -0
  496. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/CHANGELOG.md +10 -0
  497. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/README.md +1 -1
  498. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/index.js +5 -2
  499. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/package.json +10 -10
  500. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/test/index.js +16 -0
  501. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/index.js +8 -18
  502. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/LICENSE +22 -0
  503. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/README.md +71 -0
  504. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/dist/index.d.ts +46 -0
  505. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/dist/index.js +176 -0
  506. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/dist/index.js.map +1 -0
  507. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/package.json +52 -0
  508. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/package.json +9 -5
  509. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/package-lock.json +72 -41
  510. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/.package-lock.json +6 -6
  511. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/brace-expansion/README.md +23 -1
  512. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/brace-expansion/index.js +265 -86
  513. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/brace-expansion/package.json +1 -1
  514. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/README.md +173 -143
  515. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/address-error.d.ts +11 -0
  516. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/address-error.js.map +1 -1
  517. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/common.d.ts +49 -0
  518. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/common.js +79 -4
  519. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/common.js.map +1 -1
  520. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv4.d.ts +78 -5
  521. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv4.js +119 -24
  522. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv4.js.map +1 -1
  523. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv6.d.ts +151 -10
  524. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv6.js +316 -90
  525. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv6.js.map +1 -1
  526. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v4/constants.d.ts +12 -0
  527. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v4/constants.js +45 -2
  528. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v4/constants.js.map +1 -1
  529. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v6/constants.d.ts +14 -0
  530. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v6/constants.js +50 -3
  531. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v6/constants.js.map +1 -1
  532. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/package.json +6 -4
  533. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/package-lock.json +6 -6
  534. package/node_modules/playwright/node_modules/playwright-core/lib/cli/program.js +18 -9
  535. package/node_modules/playwright/node_modules/playwright-core/lib/mcpBundleImpl/index.js +47 -47
  536. package/node_modules/playwright/node_modules/playwright-core/lib/server/codegen/skyramp/jsonlReader.js +3 -0
  537. package/node_modules/playwright/node_modules/playwright-core/lib/server/recorder/recorderRunner.js +42 -0
  538. package/node_modules/playwright/node_modules/playwright-core/lib/utilsBundleImpl/index.js +121 -121
  539. package/node_modules/playwright/node_modules/playwright-core/lib/vite/traceViewer/{index.B7KbSQcC.js → index.BAkLd5DX.js} +1 -1
  540. package/node_modules/playwright/node_modules/playwright-core/lib/vite/traceViewer/index.html +1 -1
  541. package/node_modules/playwright/node_modules/playwright-core/package.json +1 -1
  542. package/node_modules/playwright/node_modules/playwright-core/src/cli/program.ts +31 -9
  543. package/node_modules/playwright/node_modules/playwright-core/src/server/codegen/skyramp/jsonlReader.ts +1 -0
  544. package/node_modules/playwright/node_modules/playwright-core/src/server/recorder/recorderRunner.ts +57 -1
  545. package/node_modules/playwright/package.json +2 -2
  546. package/package.json +7 -6
  547. package/plugin/prompts/code-reuse/hand-off.md +30 -0
  548. package/plugin/prompts/generate-tests/generation.md +1 -1
  549. package/plugin/prompts/plan-tests.md +14 -14
  550. package/plugin/prompts/testbot-task1.md +2 -2
  551. package/plugin/skills/enhance-assertions/SKILL.md +25 -0
  552. package/plugin/skills/enhance-assertions/reference/contract.md +51 -0
  553. package/plugin/skills/enhance-assertions/reference/integration.md +58 -0
  554. package/plugin/skills/enhance-assertions/reference/shared-rules.md +220 -0
  555. package/plugin/skills/enhance-assertions/reference/ui.md +373 -0
  556. package/plugin/skills/fix-test-import-errors/SKILL.md +45 -50
  557. package/plugin/skills/run-test/SKILL.md +16 -0
  558. package/plugin/skills/validate-assertion-alignment-post-execution/SKILL.md +32 -0
  559. package/plugin/skills/validate-assertion-alignment-post-execution/reference/checks.md +44 -0
  560. package/plugin/skills/validate-assertion-alignment-post-execution/reference/evidence.md +47 -0
  561. package/build/adapters/jestAdapter.d.ts +0 -14
  562. package/build/adapters/jestAdapter.js +0 -113
  563. package/build/adapters/mochaAdapter.d.ts +0 -13
  564. package/build/adapters/mochaAdapter.js +0 -87
  565. package/build/adapters/playwrightAdapter.d.ts +0 -17
  566. package/build/adapters/playwrightAdapter.js +0 -182
  567. package/build/adapters/pytestAdapter.d.ts +0 -15
  568. package/build/adapters/pytestAdapter.js +0 -108
  569. package/build/prompts/enhance-assertions/contractProviderAssertionsPrompt.d.ts +0 -2
  570. package/build/prompts/enhance-assertions/contractProviderAssertionsPrompt.js +0 -29
  571. package/build/prompts/enhance-assertions/integrationAssertionsPrompt.d.ts +0 -2
  572. package/build/prompts/enhance-assertions/integrationAssertionsPrompt.js +0 -36
  573. package/build/prompts/enhance-assertions/sharedAssertionRules.d.ts +0 -16
  574. package/build/prompts/enhance-assertions/sharedAssertionRules.js +0 -284
  575. package/build/prompts/enhance-assertions/uiAssertionsPrompt.d.ts +0 -2
  576. package/build/prompts/enhance-assertions/uiAssertionsPrompt.js +0 -388
  577. package/build/tools/runExistingTestsTool.d.ts +0 -138
  578. package/build/tools/runExistingTestsTool.js +0 -644
  579. package/build/types/ExternalTestExecution.d.ts +0 -67
  580. package/build/types/ExternalTestExecution.js +0 -8
  581. package/build/workspace/testSuites.d.ts +0 -20
  582. package/build/workspace/testSuites.js +0 -17
  583. package/node_modules/playwright/node_modules/playwright-core/.DS_Store +0 -0
@@ -81,12 +81,12 @@ This project incorporates components from the projects listed below. The origina
81
81
  - ansi-styles@5.2.0 (https://github.com/chalk/ansi-styles)
82
82
  - anymatch@3.1.3 (https://github.com/micromatch/anymatch)
83
83
  - bail@2.0.2 (https://github.com/wooorm/bail)
84
- - baseline-browser-mapping@2.10.43 (https://github.com/web-platform-dx/baseline-browser-mapping)
84
+ - baseline-browser-mapping@2.11.21 (https://github.com/web-platform-dx/baseline-browser-mapping)
85
85
  - binary-extensions@2.2.0 (https://github.com/sindresorhus/binary-extensions)
86
86
  - braces@3.0.3 (https://github.com/micromatch/braces)
87
- - browserslist@4.28.6 (https://github.com/browserslist/browserslist)
87
+ - browserslist@4.28.9 (https://github.com/browserslist/browserslist)
88
88
  - buffer-from@1.1.2 (https://github.com/LinusU/buffer-from)
89
- - caniuse-lite@1.0.30001805 (https://github.com/browserslist/caniuse-lite)
89
+ - caniuse-lite@1.0.30001810 (https://github.com/browserslist/caniuse-lite)
90
90
  - chalk@4.1.2 (https://github.com/chalk/chalk)
91
91
  - character-entities@2.0.2 (https://github.com/wooorm/character-entities)
92
92
  - chokidar@3.6.0 (https://github.com/paulmillr/chokidar)
@@ -100,7 +100,7 @@ This project incorporates components from the projects listed below. The origina
100
100
  - decode-named-character-reference@1.2.0 (https://github.com/wooorm/decode-named-character-reference)
101
101
  - dequal@2.0.3 (https://github.com/lukeed/dequal)
102
102
  - devlop@1.1.0 (https://github.com/wooorm/devlop)
103
- - electron-to-chromium@1.5.389 (https://github.com/Kilian/electron-to-chromium)
103
+ - electron-to-chromium@1.5.423 (https://github.com/Kilian/electron-to-chromium)
104
104
  - enquirer@2.3.6 (https://github.com/enquirer/enquirer)
105
105
  - escalade@3.2.0 (https://github.com/lukeed/escalade)
106
106
  - escape-string-regexp@2.0.0 (https://github.com/sindresorhus/escape-string-regexp)
@@ -152,7 +152,7 @@ This project incorporates components from the projects listed below. The origina
152
152
  - micromark@4.0.2 (https://github.com/micromark/micromark/tree/main/packages/micromark)
153
153
  - micromatch@4.0.8 (https://github.com/micromatch/micromatch)
154
154
  - ms@2.1.3 (https://github.com/vercel/ms)
155
- - node-releases@2.0.51 (https://github.com/chicoxyzzy/node-releases)
155
+ - node-releases@2.0.54 (https://github.com/chicoxyzzy/node-releases)
156
156
  - normalize-path@3.0.0 (https://github.com/jonschlinkert/normalize-path)
157
157
  - picocolors@1.1.1 (https://github.com/alexeyraspopov/picocolors)
158
158
  - picomatch@2.3.2 (https://github.com/micromatch/picomatch)
@@ -173,7 +173,7 @@ This project incorporates components from the projects listed below. The origina
173
173
  - undici-types@7.16.0 (https://github.com/nodejs/undici)
174
174
  - unified@11.0.5 (https://github.com/unifiedjs/unified)
175
175
  - unist-util-stringify-position@4.0.0 (https://github.com/syntax-tree/unist-util-stringify-position)
176
- - update-browserslist-db@1.2.3 (https://github.com/browserslist/update-db)
176
+ - update-browserslist-db@1.3.2 (https://github.com/browserslist/update-db)
177
177
  - vfile-message@4.0.3 (https://github.com/vfile/vfile-message)
178
178
  - vfile@6.0.3 (https://github.com/vfile/vfile)
179
179
  - yallist@3.1.1 (https://github.com/isaacs/yallist)
@@ -2198,7 +2198,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2198
2198
  =========================================
2199
2199
  END OF bail@2.0.2 AND INFORMATION
2200
2200
 
2201
- %% baseline-browser-mapping@2.10.43 NOTICES AND INFORMATION BEGIN HERE
2201
+ %% baseline-browser-mapping@2.11.21 NOTICES AND INFORMATION BEGIN HERE
2202
2202
  =========================================
2203
2203
  Apache License
2204
2204
  Version 2.0, January 2004
@@ -2402,7 +2402,7 @@ Apache License
2402
2402
  See the License for the specific language governing permissions and
2403
2403
  limitations under the License.
2404
2404
  =========================================
2405
- END OF baseline-browser-mapping@2.10.43 AND INFORMATION
2405
+ END OF baseline-browser-mapping@2.11.21 AND INFORMATION
2406
2406
 
2407
2407
  %% binary-extensions@2.2.0 NOTICES AND INFORMATION BEGIN HERE
2408
2408
  =========================================
@@ -2444,7 +2444,7 @@ THE SOFTWARE.
2444
2444
  =========================================
2445
2445
  END OF braces@3.0.3 AND INFORMATION
2446
2446
 
2447
- %% browserslist@4.28.6 NOTICES AND INFORMATION BEGIN HERE
2447
+ %% browserslist@4.28.9 NOTICES AND INFORMATION BEGIN HERE
2448
2448
  =========================================
2449
2449
  The MIT License (MIT)
2450
2450
 
@@ -2467,7 +2467,7 @@ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
2467
2467
  IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
2468
2468
  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2469
2469
  =========================================
2470
- END OF browserslist@4.28.6 AND INFORMATION
2470
+ END OF browserslist@4.28.9 AND INFORMATION
2471
2471
 
2472
2472
  %% buffer-from@1.1.2 NOTICES AND INFORMATION BEGIN HERE
2473
2473
  =========================================
@@ -2495,7 +2495,7 @@ SOFTWARE.
2495
2495
  =========================================
2496
2496
  END OF buffer-from@1.1.2 AND INFORMATION
2497
2497
 
2498
- %% caniuse-lite@1.0.30001805 NOTICES AND INFORMATION BEGIN HERE
2498
+ %% caniuse-lite@1.0.30001810 NOTICES AND INFORMATION BEGIN HERE
2499
2499
  =========================================
2500
2500
  Attribution 4.0 International
2501
2501
 
@@ -2893,7 +2893,7 @@ public licenses.
2893
2893
 
2894
2894
  Creative Commons may be contacted at creativecommons.org.
2895
2895
  =========================================
2896
- END OF caniuse-lite@1.0.30001805 AND INFORMATION
2896
+ END OF caniuse-lite@1.0.30001810 AND INFORMATION
2897
2897
 
2898
2898
  %% chalk@4.1.2 NOTICES AND INFORMATION BEGIN HERE
2899
2899
  =========================================
@@ -3208,7 +3208,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
3208
3208
  =========================================
3209
3209
  END OF devlop@1.1.0 AND INFORMATION
3210
3210
 
3211
- %% electron-to-chromium@1.5.389 NOTICES AND INFORMATION BEGIN HERE
3211
+ %% electron-to-chromium@1.5.423 NOTICES AND INFORMATION BEGIN HERE
3212
3212
  =========================================
3213
3213
  Copyright 2018 Kilian Valkhof
3214
3214
 
@@ -3216,7 +3216,7 @@ Permission to use, copy, modify, and/or distribute this software for any purpose
3216
3216
 
3217
3217
  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3218
3218
  =========================================
3219
- END OF electron-to-chromium@1.5.389 AND INFORMATION
3219
+ END OF electron-to-chromium@1.5.423 AND INFORMATION
3220
3220
 
3221
3221
  %% enquirer@2.3.6 NOTICES AND INFORMATION BEGIN HERE
3222
3222
  =========================================
@@ -4472,7 +4472,7 @@ SOFTWARE.
4472
4472
  =========================================
4473
4473
  END OF ms@2.1.3 AND INFORMATION
4474
4474
 
4475
- %% node-releases@2.0.51 NOTICES AND INFORMATION BEGIN HERE
4475
+ %% node-releases@2.0.54 NOTICES AND INFORMATION BEGIN HERE
4476
4476
  =========================================
4477
4477
  The MIT License
4478
4478
 
@@ -4496,7 +4496,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
4496
4496
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
4497
4497
  THE SOFTWARE.
4498
4498
  =========================================
4499
- END OF node-releases@2.0.51 AND INFORMATION
4499
+ END OF node-releases@2.0.54 AND INFORMATION
4500
4500
 
4501
4501
  %% normalize-path@3.0.0 NOTICES AND INFORMATION BEGIN HERE
4502
4502
  =========================================
@@ -4990,11 +4990,11 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
4990
4990
  =========================================
4991
4991
  END OF unist-util-stringify-position@4.0.0 AND INFORMATION
4992
4992
 
4993
- %% update-browserslist-db@1.2.3 NOTICES AND INFORMATION BEGIN HERE
4993
+ %% update-browserslist-db@1.3.2 NOTICES AND INFORMATION BEGIN HERE
4994
4994
  =========================================
4995
4995
  The MIT License (MIT)
4996
4996
 
4997
- Copyright 2022 Andrey Sitnik <andrey@sitnik.ru> and other contributors
4997
+ Copyright 2022 Andrey Sitnik <andrey@sitnik.es> and other contributors
4998
4998
 
4999
4999
  Permission is hereby granted, free of charge, to any person obtaining a copy of
5000
5000
  this software and associated documentation files (the "Software"), to deal in
@@ -5013,7 +5013,7 @@ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
5013
5013
  IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
5014
5014
  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
5015
5015
  =========================================
5016
- END OF update-browserslist-db@1.2.3 AND INFORMATION
5016
+ END OF update-browserslist-db@1.3.2 AND INFORMATION
5017
5017
 
5018
5018
  %% vfile-message@4.0.3 NOTICES AND INFORMATION BEGIN HERE
5019
5019
  =========================================
@@ -36,13 +36,19 @@ const assertToolSchema = {
36
36
  '"visible" checks the element is visible,',
37
37
  `"count" counts elements sharing the referenced element's role (or exact text)`,
38
38
  "across the page, e.g. ref one option of an open dropdown to assert the number of options.",
39
+ '"css" checks a computed style property (property "background-color", expected "rgb(37, 99, 235)"; a 3- or 6-digit #hex colour is accepted and recorded as the computed rgb),',
40
+ '"class" checks the element carries a class ("expected" = one class name),',
41
+ '"attribute" checks an attribute value ("property" = the attribute name, "expected" = its value).',
42
+ "Use css/class/attribute for a colour, style or class change the PR makes: a screenshot baseline created on this run cannot fail on it.",
43
+ 'css/class/attribute are read with the pointer moved OFF the element, so a value that exists only on hover is never recorded; unlike "count", they cannot be asserted on an option of a menu that closes when the pointer leaves it.',
39
44
  "To assert an element is absent or not visible, use `browser_assert_hidden`."
40
45
  ].join(" "),
41
46
  inputSchema: import_mcpBundle.z.object({
42
- type: import_mcpBundle.z.enum(["text", "value", "checked", "disabled", "visible", "count"]).describe(`Type of assertion: "text" for text content, "value" for input field value, "checked" for checkbox/radio state, "disabled" for disabled/enabled state ("false" asserts the element is enabled), "visible" for element visibility, "count" for the number of elements with the referenced element's role`),
47
+ type: import_mcpBundle.z.enum(["text", "value", "checked", "disabled", "visible", "count", "css", "class", "attribute"]).describe(`Type of assertion: "text" for text content, "value" for input field value, "checked" for checkbox/radio state, "disabled" for disabled/enabled state ("false" asserts the element is enabled), "visible" for element visibility, "count" for the number of elements with the referenced element's role, "css" for a computed style property, "class" for a class the element carries, "attribute" for an attribute value`),
43
48
  ref: import_mcpBundle.z.string().describe('Element reference from the latest snapshot. For "count", reference one exemplar element (e.g. one option in an open dropdown).'),
44
49
  element: import_mcpBundle.z.string().describe("Human-readable description of the element being asserted"),
45
- expected: import_mcpBundle.z.string().optional().describe('Expected text or value ("text"/"value"), "true"/"false" ("checked"/"disabled", default "true"; "disabled" with "false" asserts enabled), the expected element count ("count"). Not used for "visible".'),
50
+ property: import_mcpBundle.z.string().optional().describe('For "css": the CSS property (e.g. "background-color", "flex-direction"). For "attribute": the attribute name (e.g. "aria-expanded", "data-state"). Not used by other types.'),
51
+ expected: import_mcpBundle.z.string().optional().describe('Expected text or value ("text"/"value"), "true"/"false" ("checked"/"disabled", default "true"; "disabled" with "false" asserts enabled), the expected element count ("count"), the computed style value ("css"; a 3- or 6-digit #hex colour is converted to rgb), one class name ("class"), the attribute value ("attribute"). Not used for "visible".'),
46
52
  substring: import_mcpBundle.z.boolean().optional().default(true).describe("For text assertions: match as substring (true) or exact match (false)")
47
53
  }),
48
54
  type: "readOnly"
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var cssValue_exports = {};
20
+ __export(cssValue_exports, {
21
+ normalizeCssValue: () => normalizeCssValue
22
+ });
23
+ module.exports = __toCommonJS(cssValue_exports);
24
+ const CASE_SENSITIVE_IDENT_PROPERTIES = /* @__PURE__ */ new Set([
25
+ "animation",
26
+ "animation-name",
27
+ "animation-timeline",
28
+ "transition",
29
+ "transition-property",
30
+ "will-change",
31
+ "grid",
32
+ "grid-area",
33
+ "grid-row",
34
+ "grid-column",
35
+ "grid-row-start",
36
+ "grid-row-end",
37
+ "grid-column-start",
38
+ "grid-column-end",
39
+ "grid-template-areas",
40
+ "grid-template-rows",
41
+ "grid-template-columns",
42
+ "grid-template",
43
+ "counter-increment",
44
+ "counter-reset",
45
+ "counter-set",
46
+ "list-style",
47
+ "list-style-type",
48
+ "container-name",
49
+ "container",
50
+ "view-transition-name",
51
+ "view-transition-class",
52
+ "anchor-name",
53
+ "position-anchor",
54
+ "position-try",
55
+ "position-try-fallbacks",
56
+ "font-palette",
57
+ "scroll-timeline",
58
+ "scroll-timeline-name",
59
+ "view-timeline",
60
+ "view-timeline-name",
61
+ "timeline-scope",
62
+ "page"
63
+ ]);
64
+ function foldCaseKeepingDashedIdents(value) {
65
+ return value.replace(/[^\s,()]+/g, (token) => token.startsWith("--") ? token : token.toLowerCase());
66
+ }
67
+ function normalizeCssValue(value, property) {
68
+ const trimmed = value.trim();
69
+ if (/["']|url\(|var\(/i.test(trimmed))
70
+ return trimmed;
71
+ const prop = property?.trim().toLowerCase();
72
+ if (prop && (prop.startsWith("--") || CASE_SENSITIVE_IDENT_PROPERTIES.has(prop)))
73
+ return trimmed.replace(/\s+/g, " ").replace(/,\s*/g, ", ");
74
+ const v = foldCaseKeepingDashedIdents(trimmed.replace(/\s+/g, " "));
75
+ const hex = v.match(/^#([0-9a-f]{3}|[0-9a-f]{6})$/);
76
+ if (!hex)
77
+ return v.replace(/,\s*/g, ", ");
78
+ const h = hex[1].length === 3 ? hex[1].split("").map((c) => c + c).join("") : hex[1];
79
+ const r = parseInt(h.slice(0, 2), 16);
80
+ const g = parseInt(h.slice(2, 4), 16);
81
+ const b = parseInt(h.slice(4, 6), 16);
82
+ return `rgb(${r}, ${g}, ${b})`;
83
+ }
84
+ // Annotate the CommonJS export names for ESM import in node:
85
+ 0 && (module.exports = {
86
+ normalizeCssValue
87
+ });
@@ -31,6 +31,7 @@ module.exports = __toCommonJS(loadTraceTool_exports);
31
31
  var import_mcpBundle = require("playwright-core/lib/mcpBundle");
32
32
  var import_utils = require("playwright-core/lib/utils");
33
33
  var import_tool = require("../sdk/tool");
34
+ var import_cssValue = require("./common/cssValue");
34
35
  var import_mouseActions = require("./common/mouseActions");
35
36
  const loadTraceSchema = {
36
37
  name: "skyramp_load_trace",
@@ -106,6 +107,12 @@ function describeStep(action, index) {
106
107
  detail += ` = ${JSON.stringify(a.text)}`;
107
108
  else if (a.name === "assertValue" && a.value !== void 0)
108
109
  detail += ` = ${JSON.stringify(a.value)}`;
110
+ else if (a.name === "assertCSS")
111
+ detail += ` ${a.cssName} = ${JSON.stringify(a.cssValue)}`;
112
+ else if (a.name === "assertClass")
113
+ detail += ` .${a.className}`;
114
+ else if (a.name === "assertAttribute")
115
+ detail += ` [${a.attrName}=${JSON.stringify(a.attrValue)}]`;
109
116
  else if (a.name === "press" && a.key !== void 0)
110
117
  detail += ` ${a.key}`;
111
118
  else if (a.name === "visualSnapshot")
@@ -358,6 +365,30 @@ async function performClientAction(page, actionInContext) {
358
365
  throw new Error(`assertValue failed: expected ${JSON.stringify(action.value)}, got ${JSON.stringify(actual)}`);
359
366
  return;
360
367
  }
368
+ // SKYR-4462: appearance assertions read the live element. Class and
369
+ // attribute match codegen's toHaveClass / toHaveAttribute exactly; the css
370
+ // replay normalises both sides (see common/cssValue), so it is more lenient
371
+ // than the generated toHaveCSS, which compares the computed string as is.
372
+ // The recorder writes the computed value, so the two agree on every
373
+ // recorded trace; the difference shows only on a hand-edited cssValue.
374
+ case "assertCSS": {
375
+ const actual = (await locator.evaluate((el, prop) => getComputedStyle(el).getPropertyValue(prop), String(action.cssName), opts)).trim();
376
+ if ((0, import_cssValue.normalizeCssValue)(actual, String(action.cssName)) !== (0, import_cssValue.normalizeCssValue)(String(action.cssValue), String(action.cssName)))
377
+ throw new Error(`assertCSS failed: expected ${action.cssName} ${JSON.stringify(action.cssValue)}, got ${JSON.stringify(actual)}`);
378
+ return;
379
+ }
380
+ case "assertClass": {
381
+ const classes = await locator.evaluate((el) => Array.from(el.classList), void 0, opts);
382
+ if (!classes.includes(String(action.className)))
383
+ throw new Error(`assertClass failed: expected class ${JSON.stringify(action.className)}, got [${classes.join(" ")}]`);
384
+ return;
385
+ }
386
+ case "assertAttribute": {
387
+ const actual = await locator.evaluate((el, attr) => el.getAttribute(attr), String(action.attrName), opts);
388
+ if (actual !== action.attrValue)
389
+ throw new Error(`assertAttribute failed: expected ${action.attrName}=${JSON.stringify(action.attrValue)}, got ${JSON.stringify(actual)}`);
390
+ return;
391
+ }
361
392
  case "assertChecked": {
362
393
  const checked = await locator.isChecked(opts);
363
394
  if (checked !== !!action.checked)
@@ -67,6 +67,9 @@ const ACTION_NAMES = /* @__PURE__ */ new Set([
67
67
  "assertSnapshot",
68
68
  "visualSnapshot",
69
69
  "assertTableCell",
70
+ "assertCSS",
71
+ "assertClass",
72
+ "assertAttribute",
70
73
  "dragTo",
71
74
  "dragAndDrop",
72
75
  "diagramNodeAdd",
@@ -53,6 +53,7 @@ var import_resultCode = require("./resultCode");
53
53
  var import_mouseActionTool = require("./mouseActionTool");
54
54
  var import_visualSnapshotTool = require("./visualSnapshotTool");
55
55
  var import_gojsTool = require("./gojsTool");
56
+ var import_cssValue = require("./common/cssValue");
56
57
  var import_visualSnapshot = require("./common/visualSnapshot");
57
58
  var import_tableAssertTool = require("./tableAssertTool");
58
59
  var import_tableSelectorBuilder = require("./tableSelectorBuilder");
@@ -80,6 +81,9 @@ function dropDynamicParentChain(chain) {
80
81
  const m = /^locator\(['"]#(.+)['"]\)$/.exec(chain);
81
82
  return m && (0, import_dynamicId.isDynamicId)(m[1]) ? null : chain;
82
83
  }
84
+ const LIVE_READ_TIMEOUT_MS = 5e3;
85
+ const MAX_ANCESTOR_HOVERS = 8;
86
+ const ANCESTOR_WALK_BUDGET_MS = 1e4;
83
87
  class TraceRecordingBackend {
84
88
  // per-type baseline filename counter
85
89
  constructor(options) {
@@ -872,6 +876,24 @@ Continue recording with browser_* tools, then call skyramp_export_zip to write t
872
876
  if (typeof a.disabled !== "boolean")
873
877
  return null;
874
878
  return { toolName: "browser_assert", code: `assertDisabled:${a.selector}:${a.disabled}`, args: { type: "disabled", selector: a.selector, disabled: a.disabled } };
879
+ // SKYR-4462: appearance assertions loaded from a trace keep their fields so
880
+ // load-and-continue exports them again; a line missing its property or
881
+ // value would seed a matcher with a hole in it and is dropped instead.
882
+ case "assertCSS": {
883
+ if (typeof a.selector !== "string" || !a.selector || typeof a.cssName !== "string" || !a.cssName.trim() || typeof a.cssValue !== "string" || !a.cssValue.trim())
884
+ return null;
885
+ return { toolName: "browser_assert", code: `assertCSS:${a.selector}:${a.cssName.trim()}:${a.cssValue}`, args: { type: "css", selector: a.selector, property: a.cssName.trim(), expected: a.cssValue } };
886
+ }
887
+ case "assertClass": {
888
+ if (typeof a.selector !== "string" || !a.selector || typeof a.className !== "string" || !a.className.trim())
889
+ return null;
890
+ return { toolName: "browser_assert", code: `assertClass:${a.selector}:${a.className.trim()}`, args: { type: "class", selector: a.selector, expected: a.className.trim() } };
891
+ }
892
+ case "assertAttribute": {
893
+ if (typeof a.selector !== "string" || !a.selector || typeof a.attrName !== "string" || !a.attrName.trim() || typeof a.attrValue !== "string")
894
+ return null;
895
+ return { toolName: "browser_assert", code: `assertAttribute:${a.selector}:${a.attrName.trim()}:${a.attrValue}`, args: { type: "attribute", selector: a.selector, property: a.attrName.trim(), expected: a.attrValue } };
896
+ }
875
897
  case "assertCount":
876
898
  if (typeof a.count !== "number" || !Number.isInteger(a.count) || a.count < 0)
877
899
  return null;
@@ -1276,13 +1298,25 @@ Linked GoJS nodes ${params.fromKey} \u2192 ${params.toKey} (${params.fromPort}\u
1276
1298
  }
1277
1299
  /**
1278
1300
  * Handle browser_assert by using browser_hover to resolve the ref to a
1279
- * proper Playwright selector (testid > role > text), then verify the
1280
- * assertion against the snapshot data.
1301
+ * proper Playwright selector (testid > role > text), then verify
1302
+ * text/value/checked/disabled/visible/count against the snapshot data, and
1303
+ * css/class/attribute against the live element (getComputedStyle / classList
1304
+ * / getAttribute, read with the pointer moved off the element). Only passing
1305
+ * assertions are recorded.
1281
1306
  */
1282
1307
  async _handleAssert(params) {
1283
1308
  const timestamp = Date.now();
1284
1309
  if (!params.expected && (params.type === "text" || params.type === "value" || params.type === "count"))
1285
1310
  return { content: [{ type: "text", text: '### Error\n"expected" parameter is required.' }], isError: true };
1311
+ if ((params.type === "css" || params.type === "class") && !params.expected?.trim())
1312
+ return { content: [{ type: "text", text: '### Error\n"expected" parameter is required and must not be blank.' }], isError: true };
1313
+ if (params.type === "attribute" && params.expected === void 0)
1314
+ return { content: [{ type: "text", text: '### Error\n"expected" parameter is required (an empty string is a valid attribute value).' }], isError: true };
1315
+ if ((params.type === "css" || params.type === "attribute") && !params.property?.trim())
1316
+ return { content: [{ type: "text", text: `### Error
1317
+ For "${params.type}" assertions, "property" (the ${params.type === "css" ? "CSS property" : "attribute name"}) is required.` }], isError: true };
1318
+ if (params.type === "class" && /\s/.test(params.expected.trim()))
1319
+ return { content: [{ type: "text", text: '### Error\nFor "class" assertions, "expected" is one class name; call once per class.' }], isError: true };
1286
1320
  if (params.type === "count" && !/^\d+$/.test(params.expected))
1287
1321
  return { content: [{ type: "text", text: '### Error\nFor "count" assertions, "expected" must be a non-negative integer.' }], isError: true };
1288
1322
  if ((params.type === "checked" || params.type === "disabled") && params.expected !== void 0 && params.expected !== "true" && params.expected !== "false")
@@ -1329,17 +1363,101 @@ Could not parse locator: ${locatorExpr}` }], isError: true };
1329
1363
  const elementText = textMatch?.[1] || "";
1330
1364
  const valueMatch = refLine.match(/\]:\s*(.+)$/);
1331
1365
  const elementValue = valueMatch?.[1]?.trim() || "";
1332
- if (parsed.locator.kind === "text") {
1333
- const improved = await this._improveTextSelector(snapLines, params.ref, parsed);
1334
- if (improved) {
1335
- traceDebug(`Improved ambiguous text selector to: ${improved.selector}`);
1336
- parsed = improved;
1337
- }
1338
- }
1339
1366
  let passed = false;
1340
1367
  let details = "";
1341
1368
  let countSelector = "";
1342
- if (params.type === "text") {
1369
+ let liveValue;
1370
+ let unhoverMove;
1371
+ if (params.type === "css" || params.type === "class" || params.type === "attribute") {
1372
+ const tab = this._browserBackend.context?.currentTab();
1373
+ if (!tab)
1374
+ return { content: [{ type: "text", text: "### Assertion Failed\nNo active page." }], isError: true };
1375
+ const notReady = await this._requireLoadedPage(tab, "domcontentloaded");
1376
+ if (notReady)
1377
+ return notReady;
1378
+ if (parsed.locator.kind === "text") {
1379
+ const improved = await this._improveTextSelector(snapLines, params.ref, parsed);
1380
+ if (improved) {
1381
+ traceDebug(`Improved ambiguous text selector before live read: ${improved.selector}`);
1382
+ parsed = improved;
1383
+ }
1384
+ }
1385
+ const live = tab.page.locator(parsed.selector);
1386
+ const kind = params.type;
1387
+ const name = kind === "class" ? "" : params.property.trim();
1388
+ const read = () => live.evaluate((el, a) => {
1389
+ const e = el;
1390
+ const r = e.getBoundingClientRect();
1391
+ const hovered = e.matches(":hover");
1392
+ let value = null;
1393
+ let unknownProperty = false;
1394
+ if (a.kind === "css") {
1395
+ const css = globalThis.CSS;
1396
+ const supported = a.name.startsWith("--") || !css?.supports || css.supports(a.name, "initial");
1397
+ if (!supported)
1398
+ unknownProperty = true;
1399
+ else
1400
+ value = getComputedStyle(e).getPropertyValue(a.name).trim();
1401
+ } else if (a.kind === "class") {
1402
+ value = Array.from(e.classList).join(" ");
1403
+ } else {
1404
+ value = e.getAttribute(a.name);
1405
+ }
1406
+ return { value, hovered, unknownProperty, rect: { left: r.left, top: r.top, right: r.right, bottom: r.bottom }, vw: window.innerWidth, vh: window.innerHeight };
1407
+ }, { kind, name }, { timeout: LIVE_READ_TIMEOUT_MS });
1408
+ try {
1409
+ let reading = await read();
1410
+ if (reading.hovered) {
1411
+ const { rect, vw, vh } = reading;
1412
+ const clamp = (v, lo, hi) => Math.min(Math.max(v, lo), hi);
1413
+ const midX = clamp((rect.left + rect.right) / 2, 1, vw - 1);
1414
+ const midY = clamp((rect.top + rect.bottom) / 2, 1, vh - 1);
1415
+ const target = rect.bottom + 8 < vh ? { x: midX, y: rect.bottom + 8 } : rect.top - 8 >= 0 ? { x: midX, y: rect.top - 8 } : rect.right + 8 < vw ? { x: rect.right + 8, y: midY } : rect.left - 8 >= 0 ? { x: rect.left - 8, y: midY } : null;
1416
+ if (target) {
1417
+ let moved = true;
1418
+ await tab.page.mouse.move(target.x, target.y).catch((e) => {
1419
+ moved = false;
1420
+ traceDebug(`un-hover move failed: ${e.message}`);
1421
+ });
1422
+ reading = await read();
1423
+ if (moved && !reading.hovered)
1424
+ unhoverMove = target;
1425
+ }
1426
+ if (reading.hovered)
1427
+ return { content: [{ type: "text", text: `### Error
1428
+ Could not read the un-hovered state of "${params.element}": the pointer could not be moved off it (it fills the viewport, or the move failed). A :hover-dependent value would be recorded wrongly \u2014 assert a property the hover does not change, or use a wider element.` }], isError: true };
1429
+ }
1430
+ if (kind === "css") {
1431
+ if (reading.unknownProperty)
1432
+ return { content: [{ type: "text", text: `### Error
1433
+ "${name}" is not a CSS property this browser knows; check the spelling (e.g. "flex-direction", "background-color").` }], isError: true };
1434
+ const actual = reading.value ?? "";
1435
+ passed = (0, import_cssValue.normalizeCssValue)(actual, name) === (0, import_cssValue.normalizeCssValue)(params.expected, name);
1436
+ liveValue = actual;
1437
+ details = passed ? `CSS assertion passed: "${params.element}" has ${name}: ${actual}.` : `CSS assertion FAILED: "${params.element}" has ${name}: ${actual || "(empty)"}, expected ${params.expected}.`;
1438
+ } else if (kind === "class") {
1439
+ const className = params.expected.trim();
1440
+ const classes = (reading.value ?? "").split(" ").filter(Boolean);
1441
+ passed = classes.includes(className);
1442
+ details = passed ? `Class assertion passed: "${params.element}" carries class "${className}".` : `Class assertion FAILED: "${params.element}" has classes [${classes.join(" ")}], expected "${className}".`;
1443
+ } else {
1444
+ const actual = reading.value;
1445
+ passed = actual !== null && actual === params.expected;
1446
+ liveValue = actual ?? void 0;
1447
+ details = passed ? `Attribute assertion passed: "${params.element}" has ${name}="${actual}".` : `Attribute assertion FAILED: "${params.element}" has ${name}=${actual === null ? "(absent)" : `"${actual}"`}, expected "${params.expected}".`;
1448
+ }
1449
+ } catch (e) {
1450
+ const msg = String(e?.message ?? e);
1451
+ if (/strict mode violation/i.test(msg))
1452
+ return { content: [{ type: "text", text: `### Error
1453
+ Target ${parsed.selector} matches multiple elements, so the ${kind} read is ambiguous. Use a more specific target (a data-testid, or role + exact name). ${msg.split("\n")[0]}` }], isError: true };
1454
+ if (e?.name === "TimeoutError")
1455
+ return { content: [{ type: "text", text: `### Error
1456
+ "${params.element}" (${parsed.selector}) did not resolve within ${LIVE_READ_TIMEOUT_MS} ms. Re-snapshot and retry with a fresh ref.` }], isError: true };
1457
+ return { content: [{ type: "text", text: `### Error
1458
+ Could not read ${kind} of "${params.element}": ${msg}` }], isError: true };
1459
+ }
1460
+ } else if (params.type === "text") {
1343
1461
  passed = elementText.includes(params.expected) || elementValue.includes(params.expected);
1344
1462
  details = passed ? `Text assertion passed: "${params.element}" contains "${params.expected}".` : `Text assertion FAILED: "${params.element}" has text "${elementText}"${elementValue ? ` / value "${elementValue}"` : ""}, expected "${params.expected}".`;
1345
1463
  } else if (params.type === "value") {
@@ -1399,6 +1517,13 @@ Could not count "${refRole}" elements: ${e.message}` }], isError: true };
1399
1517
  if (tautological) {
1400
1518
  traceDebug(`Skipped tautological assertion: selector already matches "${recordedExpected}"`);
1401
1519
  } else {
1520
+ if (parsed.locator.kind === "text" && params.type !== "count" && params.type !== "css" && params.type !== "class" && params.type !== "attribute") {
1521
+ const improved = await this._improveTextSelector(snapLines, params.ref, parsed);
1522
+ if (improved) {
1523
+ traceDebug(`Improved ambiguous text selector to: ${improved.selector}`);
1524
+ parsed = improved;
1525
+ }
1526
+ }
1402
1527
  let assertName;
1403
1528
  let args;
1404
1529
  let code;
@@ -1432,13 +1557,30 @@ Could not count "${refRole}" elements: ${e.message}` }], isError: true };
1432
1557
  args = { type: "value", ref: params.ref, selector: parsed.selector, expected: recordedExpected };
1433
1558
  code = `assertValue:${parsed.selector}:${recordedExpected}`;
1434
1559
  break;
1560
+ case "css":
1561
+ assertName = "assertCSS";
1562
+ args = { type: "css", ref: params.ref, selector: parsed.selector, property: params.property.trim(), expected: liveValue ?? params.expected };
1563
+ code = `assertCSS:${parsed.selector}:${params.property.trim()}:${liveValue ?? params.expected}`;
1564
+ break;
1565
+ case "class":
1566
+ assertName = "assertClass";
1567
+ args = { type: "class", ref: params.ref, selector: parsed.selector, expected: params.expected.trim() };
1568
+ code = `assertClass:${parsed.selector}:${params.expected.trim()}`;
1569
+ break;
1570
+ case "attribute":
1571
+ assertName = "assertAttribute";
1572
+ args = { type: "attribute", ref: params.ref, selector: parsed.selector, property: params.property.trim(), expected: liveValue ?? params.expected };
1573
+ code = `assertAttribute:${parsed.selector}:${params.property.trim()}:${liveValue ?? params.expected}`;
1574
+ break;
1435
1575
  default:
1436
1576
  assertName = "assertText";
1437
1577
  args = { type: "text", ref: params.ref, selector: parsed.selector, expected: recordedExpected, substring: params.substring };
1438
1578
  code = `assertText:${parsed.selector}:${recordedExpected}:${params.substring}`;
1439
1579
  break;
1440
1580
  }
1441
- this._trackedActions.push({ toolName: "browser_assert", args, code, timestamp });
1581
+ if (unhoverMove)
1582
+ this._trackedActions.push({ toolName: "browser_mouse_action", args: { name: "mouse.move", position: unhoverMove }, code: "", timestamp: timestamp - 1, pageAlias: this._currentPageAlias });
1583
+ this._trackedActions.push({ toolName: "browser_assert", args, code, timestamp, pageAlias: this._currentPageAlias });
1442
1584
  traceDebug(`Assert: ${assertName} with selector ${args.selector}`);
1443
1585
  }
1444
1586
  }
@@ -1670,7 +1812,7 @@ ${text}` }], isError: true });
1670
1812
  let details;
1671
1813
  if (passed) {
1672
1814
  details = `Hidden assertion passed: "${params.element}" is absent or not visible.`;
1673
- this._trackedActions.push({ toolName: "browser_assert", args: { type: "hidden", selector, locator }, code: `assertHidden:${selector}`, timestamp });
1815
+ this._trackedActions.push({ toolName: "browser_assert", args: { type: "hidden", selector, locator }, code: `assertHidden:${selector}`, timestamp, pageAlias: this._currentPageAlias });
1674
1816
  traceDebug(`Assert: assertHidden with selector ${selector}`);
1675
1817
  } else {
1676
1818
  const count = await tab.page.locator(selector).count().catch(() => -1);
@@ -1730,7 +1872,10 @@ ${details}` }] };
1730
1872
  */
1731
1873
  async _improveTextSelector(snapLines, ref, original) {
1732
1874
  const textBody = original.locator.body;
1733
- const occurrences = snapLines.filter((l) => l.includes(textBody)).length;
1875
+ const occurrences = snapLines.filter((l) => {
1876
+ const lineText = TraceRecordingBackend._snapshotLineText(l);
1877
+ return lineText !== null && lineText.includes(textBody);
1878
+ }).length;
1734
1879
  if (occurrences <= 1)
1735
1880
  return null;
1736
1881
  traceDebug(`Text "${textBody}" appears ${occurrences} times in snapshot \u2014 looking for parent test-id`);
@@ -1738,16 +1883,24 @@ ${details}` }] };
1738
1883
  const refIdx = snapLines.findIndex((l) => l.includes(refPattern));
1739
1884
  if (refIdx < 0)
1740
1885
  return null;
1741
- const refIndent = snapLines[refIdx].match(/^(\s*)/)?.[1]?.length ?? 0;
1886
+ let currentIndent = snapLines[refIdx].match(/^(\s*)/)?.[1]?.length ?? 0;
1887
+ const deadline = Date.now() + ANCESTOR_WALK_BUDGET_MS;
1888
+ let hovers = 0;
1742
1889
  for (let i = refIdx - 1; i >= 0; i--) {
1743
1890
  const line = snapLines[i];
1744
1891
  const indent = line.match(/^(\s*)/)?.[1]?.length ?? 0;
1745
- if (indent >= refIndent)
1892
+ if (indent >= currentIndent)
1746
1893
  continue;
1747
1894
  const ancestorRefMatch = line.match(/\[ref=(\w+)\]/);
1748
1895
  if (!ancestorRefMatch)
1749
1896
  continue;
1897
+ if (hovers >= MAX_ANCESTOR_HOVERS || Date.now() >= deadline) {
1898
+ traceDebug(`Ancestor walk stopped after ${hovers} hovers \u2014 depth or time budget reached`);
1899
+ break;
1900
+ }
1750
1901
  const ancestorRef = ancestorRefMatch[1];
1902
+ currentIndent = indent;
1903
+ hovers++;
1751
1904
  try {
1752
1905
  const ancestorHover = await this._browserBackend.callTool("browser_hover", {
1753
1906
  element: "parent element",
@@ -1782,6 +1935,19 @@ ${details}` }] };
1782
1935
  }
1783
1936
  return null;
1784
1937
  }
1938
+ /**
1939
+ * Text value of an aria-snapshot line, in either form the renderer emits:
1940
+ * `- generic "foo" [ref=e1]` (quoted accessible name) or
1941
+ * `- generic [ref=e1]: foo` (colon-delimited text for nodes with no name).
1942
+ * Returns null for a line that carries no text.
1943
+ */
1944
+ static _snapshotLineText(line) {
1945
+ const quoted = line.match(/^\s*-\s*\w+\s+"([^"]*)"/);
1946
+ if (quoted)
1947
+ return quoted[1];
1948
+ const colon = line.match(/\[ref=\w+\](?:\s*\[[^\]]*\])*\s*:\s*(.+?)\s*$/);
1949
+ return colon?.[1]?.trim() || null;
1950
+ }
1785
1951
  static {
1786
1952
  /** Extract selector and locator info from a snapshot line for assertion tracking. */
1787
1953
  // Roles that map to valid Playwright getByRole() selectors.