@skyramp/mcp 0.4.1 → 0.4.2-rc.1

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 (543) hide show
  1. package/build/adapters/jestAdapter.js +23 -5
  2. package/build/adapters/mochaAdapter.js +7 -1
  3. package/build/adapters/playwrightAdapter.js +3 -1
  4. package/build/adapters/pytestAdapter.js +14 -3
  5. package/build/commands/localDevTestChangesCommand.js +1 -0
  6. package/build/commands/recommendTestsAndExecuteCommand.js +5 -6
  7. package/build/commands/testThisEndpointCommand.js +16 -4
  8. package/build/index.js +34 -4
  9. package/build/playwright/blueprintDigest.js +28 -7
  10. package/build/playwright/registerPlaywrightTools.js +33 -28
  11. package/build/playwright/traceRecordingPrompt.js +9 -2
  12. package/build/prompts/code-reuse.js +95 -29
  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 +3 -1
  17. package/build/prompts/local-dev/local-dev-prompts.d.ts +1 -1
  18. package/build/prompts/local-dev/local-dev-prompts.js +30 -3
  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 +88 -2
  26. package/build/prompts/shared-helper-policy.js +145 -11
  27. package/build/prompts/sut-setup/modes/adaptWorkflowPrompt.js +1 -1
  28. package/build/prompts/sut-setup/modes/dockerComposePrompt.js +1 -1
  29. package/build/prompts/sut-setup/shared.d.ts +4 -1
  30. package/build/prompts/sut-setup/shared.js +2 -2
  31. package/build/prompts/test-maintenance/actionsInstructions.d.ts +19 -11
  32. package/build/prompts/test-maintenance/actionsInstructions.js +47 -26
  33. package/build/prompts/test-maintenance/drift-analysis-prompt.js +3 -2
  34. package/build/prompts/test-maintenance/driftAnalysisSections.js +5 -3
  35. package/build/prompts/test-maintenance/driftAnalysisShared.js +4 -2
  36. package/build/prompts/test-maintenance/uiDriftAnalysisSections.js +7 -4
  37. package/build/prompts/test-recommendation/recommendationSections.js +19 -8
  38. package/build/prompts/test-recommendation/registerRecommendTestsPrompt.js +5 -2
  39. package/build/prompts/test-recommendation/test-recommendation-prompt.js +10 -7
  40. package/build/prompts/testbot/testbot-prompts.js +123 -55
  41. package/build/recommendation/answers.js +18 -9
  42. package/build/recommendation/pullRequestText.js +1 -1
  43. package/build/recommendation/registerPlan.js +31 -17
  44. package/build/recommendation/subjectStep.d.ts +8 -10
  45. package/build/recommendation/subjectStep.js +17 -16
  46. package/build/recommendation/types.d.ts +71 -17
  47. package/build/recommendation/types.js +9 -15
  48. package/build/recommendation/verifierContracts.d.ts +7 -3
  49. package/build/recommendation/verifierContracts.js +8 -4
  50. package/build/recommendation/verifiers/changedFile.js +11 -13
  51. package/build/recommendation/verifiers/citedPath.d.ts +8 -0
  52. package/build/recommendation/verifiers/citedPath.js +16 -2
  53. package/build/recommendation/verifiers/coverage.d.ts +2 -2
  54. package/build/recommendation/verifiers/coverage.js +190 -134
  55. package/build/recommendation/verifiers/defects.js +56 -16
  56. package/build/recommendation/verifiers/deliveredMatchesPlan.d.ts +7 -1
  57. package/build/recommendation/verifiers/deliveredMatchesPlan.js +28 -14
  58. package/build/recommendation/verifiers/endpointGrounded.js +14 -8
  59. package/build/recommendation/verifiers/existingCoverage.d.ts +6 -0
  60. package/build/recommendation/verifiers/existingCoverage.js +30 -21
  61. package/build/recommendation/verifiers/expectedOutcome.js +17 -8
  62. package/build/recommendation/verifiers/expectedValueSourced.js +54 -43
  63. package/build/recommendation/verifiers/issueTraceability.d.ts +5 -0
  64. package/build/recommendation/verifiers/issueTraceability.js +64 -7
  65. package/build/recommendation/verifiers/removedElementGuarded.js +19 -11
  66. package/build/recommendation/verifiers/reportedCategory.js +9 -4
  67. package/build/recommendation/verifiers/requirementSourced.js +34 -21
  68. package/build/recommendation/verifiers/screenRoute.js +15 -10
  69. package/build/recommendation/verifiers/statedDifference.js +15 -8
  70. package/build/recommendation/verifiers/uiElementGrounded.js +50 -16
  71. package/build/resources/analysisResources.js +7 -3
  72. package/build/resources/progressResource.js +4 -2
  73. package/build/resources/sutSetupResource.js +20 -2
  74. package/build/resources/testbotResource.js +19 -1
  75. package/build/services/AnalyticsService.js +3 -1
  76. package/build/services/ScenarioGenerationService.js +5 -5
  77. package/build/services/TestDiscoveryService.js +21 -5
  78. package/build/services/TestExecutionService.js +63 -21
  79. package/build/services/TestGenerationService.d.ts +1 -1
  80. package/build/services/TestGenerationService.js +43 -24
  81. package/build/skills/enhanceAssertionsSkill.d.ts +45 -0
  82. package/build/skills/enhanceAssertionsSkill.js +103 -0
  83. package/build/skills/fixTestImportErrorsSkill.d.ts +2 -2
  84. package/build/skills/fixTestImportErrorsSkill.js +2 -2
  85. package/build/skills/skillFiles.d.ts +38 -0
  86. package/build/skills/skillFiles.js +94 -0
  87. package/build/skills/validateAssertionAlignmentSkill.d.ts +34 -0
  88. package/build/skills/validateAssertionAlignmentSkill.js +59 -0
  89. package/build/tool-phases.js +4 -0
  90. package/build/tools/auth/loginTool.js +3 -1
  91. package/build/tools/auth/logoutTool.js +3 -1
  92. package/build/tools/code-refactor/alignAssertionsTool.d.ts +2 -0
  93. package/build/tools/code-refactor/alignAssertionsTool.js +51 -0
  94. package/build/tools/code-refactor/assertion-state.d.ts +1 -1
  95. package/build/tools/code-refactor/assertion-state.js +1 -1
  96. package/build/tools/code-refactor/assertionOperations.d.ts +44 -0
  97. package/build/tools/code-refactor/assertionOperations.js +82 -0
  98. package/build/tools/code-refactor/assertionSkillTools.d.ts +3 -0
  99. package/build/tools/code-refactor/assertionSkillTools.js +86 -0
  100. package/build/tools/code-refactor/codeReuseTool.js +27 -3
  101. package/build/tools/code-refactor/enhanceAssertionsTool.js +19 -83
  102. package/build/tools/code-refactor/gate-markers.d.ts +51 -0
  103. package/build/tools/code-refactor/gate-markers.js +95 -0
  104. package/build/tools/code-refactor/retrofit-state.d.ts +3 -1
  105. package/build/tools/code-refactor/retrofit-state.js +44 -2
  106. package/build/tools/code-refactor/reuse-outcome.d.ts +23 -1
  107. package/build/tools/code-refactor/reuse-outcome.js +36 -13
  108. package/build/tools/code-refactor/reuse-state.d.ts +90 -16
  109. package/build/tools/code-refactor/reuse-state.js +191 -61
  110. package/build/tools/code-refactor/utils-verify-gates.d.ts +4 -0
  111. package/build/tools/code-refactor/utils-verify-gates.js +252 -27
  112. package/build/tools/code-refactor/verify-gates.d.ts +15 -1
  113. package/build/tools/code-refactor/verify-gates.js +36 -4
  114. package/build/tools/enrichTestWithMocksTool.d.ts +1 -1
  115. package/build/tools/enrichTestWithMocksTool.js +9 -5
  116. package/build/tools/executeSkyrampTestTool.d.ts +22 -1
  117. package/build/tools/executeSkyrampTestTool.js +571 -271
  118. package/build/tools/execution-video-state.js +1 -1
  119. package/build/tools/fixErrorTool.js +5 -6
  120. package/build/tools/generate-tests/batchMockGenerationTool.js +1 -1
  121. package/build/tools/generate-tests/generateBatchScenarioRestTool.js +114 -73
  122. package/build/tools/generate-tests/generateContractRestTool.js +34 -16
  123. package/build/tools/generate-tests/generateE2ERestTool.d.ts +1 -0
  124. package/build/tools/generate-tests/generateE2ERestTool.js +9 -1
  125. package/build/tools/generate-tests/generateIntegrationRestTool.js +22 -7
  126. package/build/tools/generate-tests/generateMockRestTool.js +3 -1
  127. package/build/tools/generate-tests/generateUIRestTool.d.ts +2 -0
  128. package/build/tools/generate-tests/generateUIRestTool.js +11 -2
  129. package/build/tools/generate-tests/loadTestSchema.js +1 -3
  130. package/build/tools/generate-tests/planGuard.js +6 -3
  131. package/build/tools/generate-tests/scenarioFileIdentity.js +4 -1
  132. package/build/tools/generate-tests/scenarioLint.js +17 -5
  133. package/build/tools/generate-tests/trace-reuse-guard.js +5 -2
  134. package/build/tools/generateEnrichedIntegrationTestTool.js +9 -3
  135. package/build/tools/one-click/oneClickTool.js +3 -1
  136. package/build/tools/preflightMockCheckTool.js +23 -7
  137. package/build/tools/runExistingTestsTool.d.ts +1 -1
  138. package/build/tools/runExistingTestsTool.js +43 -21
  139. package/build/tools/submitReportTool.d.ts +51 -12
  140. package/build/tools/submitReportTool.js +860 -161
  141. package/build/tools/test-management/actionsTool.js +210 -51
  142. package/build/tools/test-management/analyzeChangesTool.d.ts +4 -5
  143. package/build/tools/test-management/analyzeChangesTool.js +127 -68
  144. package/build/tools/test-management/analyzeTestHealthTool.js +35 -13
  145. package/build/tools/test-management/registerTestPlanTool.d.ts +44 -34
  146. package/build/tools/test-management/registerTestPlanTool.js +255 -111
  147. package/build/tools/test-management/resolveScreenTool.js +33 -9
  148. package/build/tools/trace/startTraceCollectionTool.js +3 -1
  149. package/build/tools/trace/stopTraceCollectionTool.js +41 -5
  150. package/build/tools/verifyTestDependenciesTool.d.ts +3 -0
  151. package/build/tools/verifyTestDependenciesTool.js +54 -0
  152. package/build/tools/workspace/initScanWorkspaceTool.js +9 -3
  153. package/build/tools/workspace/initializeWorkspaceTool.js +3 -1
  154. package/build/types/AssertionOutcome.d.ts +1 -1
  155. package/build/types/EnhanceType.d.ts +6 -0
  156. package/build/types/EnhanceType.js +1 -0
  157. package/build/types/ExternalTestExecution.d.ts +2 -2
  158. package/build/types/RepositoryAnalysis.d.ts +0 -40
  159. package/build/types/ReuseOutcome.d.ts +96 -4
  160. package/build/types/ReuseOutcome.js +16 -0
  161. package/build/types/StepMethod.js +20 -6
  162. package/build/types/TestAnalysis.d.ts +10 -2
  163. package/build/types/TestExecution.d.ts +45 -0
  164. package/build/types/TestRecommendation.d.ts +1 -1
  165. package/build/types/TestRecommendation.js +4 -1
  166. package/build/types/TestTypes.d.ts +13 -0
  167. package/build/types/TestTypes.js +34 -3
  168. package/build/types/TestbotPromptOptions.d.ts +9 -1
  169. package/build/types/TestbotReport.d.ts +45 -9
  170. package/build/utils/AnalysisStateManager.d.ts +137 -27
  171. package/build/utils/AnalysisStateManager.js +227 -43
  172. package/build/utils/assertion-verify/api-shared-lints.js +34 -16
  173. package/build/utils/assertion-verify/metrics.js +39 -6
  174. package/build/utils/assertion-verify/ui-lints.js +4 -2
  175. package/build/utils/branchDiff.js +47 -12
  176. package/build/utils/canonicalJson.js +3 -1
  177. package/build/utils/dartRouteExtractor.js +36 -7
  178. package/build/utils/fixAttempts.d.ts +26 -0
  179. package/build/utils/fixAttempts.js +109 -0
  180. package/build/utils/frontendSelectors.js +23 -4
  181. package/build/utils/generatedTestRecord.d.ts +19 -0
  182. package/build/utils/generatedTestRecord.js +61 -0
  183. package/build/utils/gitStaging.js +7 -2
  184. package/build/utils/initAgent.js +26 -6
  185. package/build/utils/language-helper.js +39 -45
  186. package/build/utils/pathMatching.js +2 -1
  187. package/build/utils/pathSignatures.js +6 -2
  188. package/build/utils/planMatchKeys.d.ts +2 -2
  189. package/build/utils/planMatchKeys.js +20 -14
  190. package/build/utils/pom-catalog-parse.js +7 -2
  191. package/build/utils/pom-scope/import-expansion.js +6 -1
  192. package/build/utils/pom-scope/index.js +50 -12
  193. package/build/utils/pom-scope/scoring.js +13 -3
  194. package/build/utils/pom-scope/selector-extractor.js +16 -3
  195. package/build/utils/pom-scope/strip.d.ts +8 -0
  196. package/build/utils/pom-scope/strip.js +238 -0
  197. package/build/utils/pom-scope/testIdDiscovery.js +14 -2
  198. package/build/utils/pom-verify/__fixtures__/af-style/asset-list.page.d.ts +1 -1
  199. package/build/utils/pom-verify/__fixtures__/af-style/asset-list.page.js +4 -2
  200. package/build/utils/pom-verify/__fixtures__/af-style/report.iframe.page.js +3 -1
  201. package/build/utils/pom-verify/__fixtures__/af-style/workflow-footer.page.js +3 -1
  202. package/build/utils/pom-verify/bindings.js +5 -1
  203. package/build/utils/pom-verify/calls.js +9 -2
  204. package/build/utils/pom-verify/verify.js +27 -5
  205. package/build/utils/pr-comment-parser.js +20 -7
  206. package/build/utils/proxy-terminal.d.ts +19 -1
  207. package/build/utils/proxy-terminal.js +346 -21
  208. package/build/utils/removedUiElements.js +1 -1
  209. package/build/utils/reportLanguage.js +35 -7
  210. package/build/utils/reportVerification.d.ts +14 -8
  211. package/build/utils/reportVerification.js +19 -19
  212. package/build/utils/repositorySlug.d.ts +32 -0
  213. package/build/utils/repositorySlug.js +77 -0
  214. package/build/utils/reuseRouting.js +6 -2
  215. package/build/utils/runSerialized.d.ts +3 -0
  216. package/build/utils/runSerialized.js +39 -0
  217. package/build/utils/screenRoutes.js +74 -18
  218. package/build/utils/sourceRouteExtractor.js +13 -6
  219. package/build/utils/telemetry.d.ts +1 -0
  220. package/build/utils/telemetry.js +8 -5
  221. package/build/utils/testDependencyPolicy.d.ts +9 -0
  222. package/build/utils/testDependencyPolicy.js +788 -0
  223. package/build/utils/testExecutionRecord.d.ts +90 -0
  224. package/build/utils/testExecutionRecord.js +267 -0
  225. package/build/utils/testFileClassification.js +3 -1
  226. package/build/utils/trace-parser.js +62 -14
  227. package/build/utils/urlPath.js +3 -1
  228. package/build/utils/utils-verify/action-key.d.ts +4 -0
  229. package/build/utils/utils-verify/action-key.js +2 -2
  230. package/build/utils/utils-verify/allow.d.ts +122 -3
  231. package/build/utils/utils-verify/allow.js +146 -21
  232. package/build/utils/utils-verify/body-reach.d.ts +120 -0
  233. package/build/utils/utils-verify/body-reach.js +335 -0
  234. package/build/utils/utils-verify/call-sites.d.ts +6 -1
  235. package/build/utils/utils-verify/call-sites.js +72 -8
  236. package/build/utils/utils-verify/delivered-imports.d.ts +43 -0
  237. package/build/utils/utils-verify/delivered-imports.js +84 -0
  238. package/build/utils/utils-verify/fixed-sleep.d.ts +96 -0
  239. package/build/utils/utils-verify/fixed-sleep.js +461 -0
  240. package/build/utils/utils-verify/in-house.d.ts +93 -0
  241. package/build/utils/utils-verify/in-house.js +719 -0
  242. package/build/utils/utils-verify/incumbent.d.ts +3 -0
  243. package/build/utils/utils-verify/incumbent.js +75 -0
  244. package/build/utils/utils-verify/index.d.ts +1 -0
  245. package/build/utils/utils-verify/index.js +1 -0
  246. package/build/utils/utils-verify/language-spec.d.ts +26 -10
  247. package/build/utils/utils-verify/language-spec.js +217 -20
  248. package/build/utils/utils-verify/locate.d.ts +26 -0
  249. package/build/utils/utils-verify/locate.js +125 -23
  250. package/build/utils/utils-verify/module-name.d.ts +40 -0
  251. package/build/utils/utils-verify/module-name.js +98 -0
  252. package/build/utils/utils-verify/parse.d.ts +46 -6
  253. package/build/utils/utils-verify/parse.js +176 -38
  254. package/build/utils/utils-verify/retrofit-equivalence.d.ts +5 -0
  255. package/build/utils/utils-verify/retrofit-equivalence.js +4 -2
  256. package/build/utils/utils-verify/stage.d.ts +5 -0
  257. package/build/utils/utils-verify/stage.js +47 -2
  258. package/build/utils/utils-verify/status-once.d.ts +62 -0
  259. package/build/utils/utils-verify/status-once.js +207 -0
  260. package/build/utils/utils-verify/typecheck.d.ts +61 -0
  261. package/build/utils/utils-verify/typecheck.js +338 -0
  262. package/build/utils/utils-verify/verify.d.ts +76 -1
  263. package/build/utils/utils-verify/verify.js +516 -44
  264. package/build/utils/versions.d.ts +3 -3
  265. package/build/utils/versions.js +1 -1
  266. package/build/utils/workspaceAuth.js +107 -37
  267. package/build/workspace/queryParamResolution.js +11 -4
  268. package/build/workspace/workspace.js +7 -7
  269. package/node_modules/playwright/ThirdPartyNotices.txt +19 -19
  270. package/node_modules/playwright/lib/mcp/skyramp/assertTool.js +8 -2
  271. package/node_modules/playwright/lib/mcp/skyramp/common/cssValue.js +87 -0
  272. package/node_modules/playwright/lib/mcp/skyramp/loadTraceTool.js +31 -0
  273. package/node_modules/playwright/lib/mcp/skyramp/skyRampImport.js +3 -0
  274. package/node_modules/playwright/lib/mcp/skyramp/traceRecordingBackend.js +181 -15
  275. package/node_modules/playwright/lib/mcp/test/skyRampExport.js +24 -0
  276. package/node_modules/playwright/lib/transform/babelBundleImpl.js +2353 -190
  277. package/node_modules/playwright/node_modules/playwright-core/ThirdPartyNotices.txt +62 -34
  278. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/.package-lock.json +72 -41
  279. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/@hono/node-server/dist/serve-static.js +1 -1
  280. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/@hono/node-server/dist/serve-static.mjs +1 -1
  281. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/@hono/node-server/package.json +2 -2
  282. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/README.md +16 -1
  283. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/index.js +4 -20
  284. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/read.js +17 -17
  285. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/json.js +60 -32
  286. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/raw.js +3 -3
  287. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/text.js +3 -3
  288. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/urlencoded.js +16 -20
  289. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/utils.js +18 -16
  290. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/LICENSE +22 -0
  291. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/README.md +71 -0
  292. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/dist/index.d.ts +46 -0
  293. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/dist/index.js +176 -0
  294. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/dist/index.js.map +1 -0
  295. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/package.json +52 -0
  296. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/package.json +23 -10
  297. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/CHANGELOG.md +21 -14
  298. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/isObject.d.ts +1 -1
  299. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/package.json +6 -7
  300. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/tsconfig.json +1 -0
  301. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/index.js +266 -45
  302. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/lib/schemes.js +9 -4
  303. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/lib/utils.js +396 -92
  304. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/package.json +1 -1
  305. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/component-safe-serialization.test.js +163 -0
  306. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/equal.test.js +31 -3
  307. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/fixtures/uri-js-parse.json +2 -0
  308. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/ipv6-canonical.test.js +34 -0
  309. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/ipv6-validation.test.js +124 -0
  310. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/malformed-percent.test.js +77 -0
  311. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/malformed-urn.test.js +61 -0
  312. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/parse.test.js +7 -3
  313. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/query-fragment-normalization.test.js +33 -0
  314. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/reserved-path-normalization.test.js +109 -0
  315. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/scheme-validation.test.js +124 -0
  316. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/security-normalization.test.js +101 -0
  317. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/security.test.js +301 -3
  318. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/urn-full-input.test.js +29 -0
  319. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/websocket-query-preservation.test.js +24 -0
  320. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hasown/CHANGELOG.md +7 -0
  321. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hasown/index.d.ts +0 -1
  322. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hasown/package.json +4 -5
  323. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/client/client.js +30 -16
  324. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/client/utils.js +4 -1
  325. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/context.js +32 -13
  326. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/accepts/accepts.js +36 -2
  327. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/proxy/index.js +4 -0
  328. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/ssg/ssg.js +1 -1
  329. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/ssg/utils.js +30 -10
  330. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/streaming/sse.js +5 -4
  331. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/hono-base.js +10 -8
  332. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/base.js +44 -23
  333. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/components.js +25 -26
  334. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/context.js +5 -5
  335. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/dom/render.js +2 -0
  336. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/dom/server.js +5 -1
  337. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/hooks/index.js +16 -13
  338. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/intrinsic-element/components.js +3 -3
  339. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/streaming.js +4 -5
  340. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/cache/index.js +103 -8
  341. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/compress/index.js +5 -0
  342. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/cors/index.js +17 -14
  343. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/csrf/index.js +1 -1
  344. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/etag/digest.js +47 -1
  345. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/etag/index.js +7 -4
  346. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/jwk/jwk.js +9 -4
  347. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/jwt/jwt.js +9 -4
  348. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/language/language.js +10 -6
  349. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/method-not-allowed/index.js +90 -0
  350. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/pretty-json/index.js +3 -1
  351. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/secure-headers/secure-headers.js +16 -7
  352. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/request.js +20 -13
  353. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/linear-router/router.js +7 -2
  354. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/pattern-router/router.js +3 -9
  355. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/reg-exp-router/node.js +65 -59
  356. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/reg-exp-router/router.js +71 -128
  357. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/reg-exp-router/trie.js +14 -5
  358. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/trie-router/node.js +47 -70
  359. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/trie-router/router.js +3 -11
  360. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/utils.js +27 -0
  361. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router.js +1 -1
  362. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/accept.js +1 -1
  363. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/body.js +21 -3
  364. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/cookie.js +4 -3
  365. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/ipaddr.js +5 -3
  366. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/stream.js +12 -3
  367. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/url.js +19 -11
  368. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/client/client.js +30 -16
  369. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/client/utils.js +4 -1
  370. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/context.js +32 -13
  371. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/accepts/accepts.js +36 -2
  372. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/proxy/index.js +4 -0
  373. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/ssg/ssg.js +1 -1
  374. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/ssg/utils.js +30 -10
  375. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/streaming/sse.js +5 -4
  376. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/hono-base.js +10 -8
  377. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/base.js +41 -23
  378. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/components.js +26 -27
  379. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/context.js +6 -6
  380. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/dom/render.js +2 -0
  381. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/dom/server.js +5 -1
  382. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/hooks/index.js +16 -13
  383. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/intrinsic-element/components.js +4 -4
  384. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/streaming.js +5 -6
  385. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/cache/index.js +103 -8
  386. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/compress/index.js +5 -0
  387. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/cors/index.js +17 -14
  388. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/csrf/index.js +1 -1
  389. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/etag/digest.js +47 -1
  390. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/etag/index.js +7 -4
  391. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/jwk/jwk.js +9 -4
  392. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/jwt/jwt.js +9 -4
  393. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/language/language.js +10 -6
  394. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/method-not-allowed/index.js +68 -0
  395. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/pretty-json/index.js +3 -1
  396. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/secure-headers/secure-headers.js +16 -7
  397. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/request.js +21 -14
  398. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/linear-router/router.js +7 -2
  399. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/pattern-router/router.js +3 -9
  400. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/reg-exp-router/node.js +61 -58
  401. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/reg-exp-router/router.js +77 -129
  402. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/reg-exp-router/trie.js +14 -5
  403. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/trie-router/node.js +47 -70
  404. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/trie-router/router.js +3 -11
  405. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/utils.js +5 -0
  406. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router.js +1 -1
  407. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/adapter/aws-lambda/types.d.ts +9 -0
  408. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/client/types.d.ts +1 -1
  409. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/context.d.ts +6 -2
  410. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/hono-base.d.ts +4 -3
  411. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/base.d.ts +7 -2
  412. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/dom/index.d.ts +5 -5
  413. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/dom/intrinsic-element/components.d.ts +2 -2
  414. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/dom/server.d.ts +5 -5
  415. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/hooks/index.d.ts +8 -6
  416. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/index.d.ts +5 -5
  417. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/cache/index.d.ts +6 -4
  418. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/combine/index.d.ts +1 -1
  419. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/cors/index.d.ts +1 -1
  420. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/jsx-renderer/index.d.ts +2 -2
  421. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/jwk/jwk.d.ts +2 -0
  422. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/jwt/jwt.d.ts +2 -0
  423. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/method-not-allowed/index.d.ts +49 -0
  424. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/secure-headers/permissions-policy.d.ts +3 -3
  425. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/reg-exp-router/node.d.ts +4 -1
  426. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/reg-exp-router/trie.d.ts +2 -1
  427. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/trie-router/node.d.ts +1 -2
  428. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/trie-router/router.d.ts +0 -1
  429. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/utils.d.ts +1 -0
  430. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router.d.ts +1 -1
  431. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/utils/headers.d.ts +2 -2
  432. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/utils/url.d.ts +5 -0
  433. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/accept.js +1 -1
  434. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/body.js +21 -3
  435. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/cookie.js +5 -4
  436. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/ipaddr.js +5 -3
  437. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/stream.js +12 -3
  438. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/url.js +17 -10
  439. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/package.json +11 -4
  440. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/README.md +173 -143
  441. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/address-error.d.ts +11 -0
  442. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/address-error.js.map +1 -1
  443. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/common.d.ts +49 -0
  444. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/common.js +79 -4
  445. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/common.js.map +1 -1
  446. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv4.d.ts +78 -5
  447. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv4.js +119 -24
  448. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv4.js.map +1 -1
  449. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv6.d.ts +151 -10
  450. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv6.js +316 -90
  451. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv6.js.map +1 -1
  452. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v4/constants.d.ts +12 -0
  453. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v4/constants.js +45 -2
  454. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v4/constants.js.map +1 -1
  455. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v6/constants.d.ts +14 -0
  456. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v6/constants.js +50 -3
  457. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v6/constants.js.map +1 -1
  458. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/package.json +6 -4
  459. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/.github/THREAT_MODEL.md +3 -3
  460. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/CHANGELOG.md +26 -0
  461. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/README.md +19 -1
  462. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/dist/qs.js +25 -25
  463. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/eslint.config.mjs +1 -1
  464. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/lib/parse.js +16 -6
  465. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/lib/stringify.js +23 -8
  466. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/lib/utils.js +57 -11
  467. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/package.json +8 -7
  468. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/test/parse.js +419 -0
  469. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/test/stringify.js +317 -0
  470. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/test/utils.js +206 -0
  471. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/CHANGELOG.md +10 -0
  472. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/README.md +1 -1
  473. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/index.js +5 -2
  474. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/package.json +10 -10
  475. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/test/index.js +16 -0
  476. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/index.js +8 -18
  477. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/LICENSE +22 -0
  478. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/README.md +71 -0
  479. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/dist/index.d.ts +46 -0
  480. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/dist/index.js +176 -0
  481. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/dist/index.js.map +1 -0
  482. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/package.json +52 -0
  483. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/package.json +9 -5
  484. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/package-lock.json +72 -41
  485. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/.package-lock.json +6 -6
  486. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/brace-expansion/README.md +23 -1
  487. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/brace-expansion/index.js +265 -86
  488. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/brace-expansion/package.json +1 -1
  489. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/README.md +173 -143
  490. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/address-error.d.ts +11 -0
  491. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/address-error.js.map +1 -1
  492. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/common.d.ts +49 -0
  493. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/common.js +79 -4
  494. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/common.js.map +1 -1
  495. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv4.d.ts +78 -5
  496. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv4.js +119 -24
  497. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv4.js.map +1 -1
  498. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv6.d.ts +151 -10
  499. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv6.js +316 -90
  500. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv6.js.map +1 -1
  501. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v4/constants.d.ts +12 -0
  502. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v4/constants.js +45 -2
  503. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v4/constants.js.map +1 -1
  504. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v6/constants.d.ts +14 -0
  505. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v6/constants.js +50 -3
  506. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v6/constants.js.map +1 -1
  507. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/package.json +6 -4
  508. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/package-lock.json +6 -6
  509. package/node_modules/playwright/node_modules/playwright-core/lib/cli/program.js +18 -9
  510. package/node_modules/playwright/node_modules/playwright-core/lib/mcpBundleImpl/index.js +47 -47
  511. package/node_modules/playwright/node_modules/playwright-core/lib/server/codegen/skyramp/jsonlReader.js +3 -0
  512. package/node_modules/playwright/node_modules/playwright-core/lib/server/recorder/recorderRunner.js +42 -0
  513. package/node_modules/playwright/node_modules/playwright-core/lib/utilsBundleImpl/index.js +121 -121
  514. package/node_modules/playwright/node_modules/playwright-core/lib/vite/traceViewer/{index.B7KbSQcC.js → index.BAkLd5DX.js} +1 -1
  515. package/node_modules/playwright/node_modules/playwright-core/lib/vite/traceViewer/index.html +1 -1
  516. package/node_modules/playwright/node_modules/playwright-core/package.json +1 -1
  517. package/node_modules/playwright/node_modules/playwright-core/src/cli/program.ts +31 -9
  518. package/node_modules/playwright/node_modules/playwright-core/src/server/codegen/skyramp/jsonlReader.ts +1 -0
  519. package/node_modules/playwright/node_modules/playwright-core/src/server/recorder/recorderRunner.ts +57 -1
  520. package/node_modules/playwright/package.json +2 -2
  521. package/package.json +7 -6
  522. package/plugin/prompts/code-reuse/hand-off.md +30 -0
  523. package/plugin/prompts/generate-tests/generation.md +1 -1
  524. package/plugin/prompts/plan-tests.md +14 -14
  525. package/plugin/prompts/testbot-task1.md +4 -2
  526. package/plugin/skills/enhance-assertions/SKILL.md +25 -0
  527. package/plugin/skills/enhance-assertions/reference/contract.md +51 -0
  528. package/plugin/skills/enhance-assertions/reference/integration.md +58 -0
  529. package/plugin/skills/enhance-assertions/reference/shared-rules.md +220 -0
  530. package/plugin/skills/enhance-assertions/reference/ui.md +373 -0
  531. package/plugin/skills/fix-test-import-errors/SKILL.md +44 -50
  532. package/plugin/skills/validate-assertion-alignment-post-execution/SKILL.md +32 -0
  533. package/plugin/skills/validate-assertion-alignment-post-execution/reference/checks.md +44 -0
  534. package/plugin/skills/validate-assertion-alignment-post-execution/reference/evidence.md +47 -0
  535. package/build/prompts/enhance-assertions/contractProviderAssertionsPrompt.d.ts +0 -2
  536. package/build/prompts/enhance-assertions/contractProviderAssertionsPrompt.js +0 -29
  537. package/build/prompts/enhance-assertions/integrationAssertionsPrompt.d.ts +0 -2
  538. package/build/prompts/enhance-assertions/integrationAssertionsPrompt.js +0 -36
  539. package/build/prompts/enhance-assertions/sharedAssertionRules.d.ts +0 -16
  540. package/build/prompts/enhance-assertions/sharedAssertionRules.js +0 -284
  541. package/build/prompts/enhance-assertions/uiAssertionsPrompt.d.ts +0 -2
  542. package/build/prompts/enhance-assertions/uiAssertionsPrompt.js +0 -388
  543. package/node_modules/playwright/node_modules/playwright-core/.DS_Store +0 -0
@@ -0,0 +1,96 @@
1
+ import { type UtilsLanguage } from "./language-spec.js";
2
+ /**
3
+ * A fixed sleep inside a shared helper — a wait for a duration rather than for a
4
+ * condition, written into the module every test imports.
5
+ *
6
+ * The substance-floor row of the code-reuse plan measures whether a shared helper
7
+ * holds a whole step or something one scenario's narrative needs. A sleep is the
8
+ * form that costs every later caller: it is inherited by every test that imports the
9
+ * helper, it converts a wrong result into a slow one, and it is invisible at the call
10
+ * site. Run 9 (gha-2026-09-18-integration-238cc734) produced both of its shapes from
11
+ * ONE build — a browser `signIn` carrying `waitForTimeout(1500)`, and a Python
12
+ * `get_order` whose ten-attempt retry loop sleeps five seconds an attempt — beside a
13
+ * clean `signIn` of the same name on the same repository. Same model, same commit:
14
+ * the prompt rule holds in some runs and not others, which is a rule without a gate.
15
+ *
16
+ * The bare wait is the smaller half. A retry loop whose backoff is a sleep hides the
17
+ * duration BEHIND an iteration count, so a rule written for the bare form alone would
18
+ * read `time.sleep(sleep_time)` as five seconds and miss the fifty this one costs.
19
+ * Both are found here, and the loop's multiplier is reported with the finding.
20
+ *
21
+ * SCOPE — the header-bearing Skyramp module, and nothing else. The caller reaches
22
+ * this through `locateUtilsFiles`, which recognises a module by the `Generated by
23
+ * Skyramp on …` header, so a repository's own helper and a page object are out of
24
+ * reach by construction. That is deliberate in both directions: an in-house module
25
+ * may not be modified beyond being added to (SKYR-4483), and the POM path treats a
26
+ * customer method's internal `waitForTimeout` as a REASON TO PREFER it (see
27
+ * `pom-aware-code-reuse`, STEP 2b) — a rule that flagged sleeps anywhere would
28
+ * contradict that prompt.
29
+ */
30
+ export interface HelperSleep {
31
+ /** 1-based line in the FILE. */
32
+ line: number;
33
+ /** The call as the agent reads it: the source line(s) it spans, whitespace collapsed. */
34
+ text: string;
35
+ /** What one call waits, in milliseconds — resolved from a numeric literal or from
36
+ * a parameter's numeric default. `undefined` when neither is readable; the finding
37
+ * still stands, because a sleep of an unknown length is not a shorter one. */
38
+ ms?: number;
39
+ /** Present when the sleep sits inside one or more loops, which multiply it.
40
+ * `depth` is how many enclose it; `iterations` is the PRODUCT of their bounds, and
41
+ * is `undefined` as soon as one of them is a condition rather than a count. */
42
+ loop?: {
43
+ iterations?: number;
44
+ depth: number;
45
+ };
46
+ }
47
+ /**
48
+ * What a Python module binds to a sleep function, read from its imports.
49
+ *
50
+ * The bare form cannot be matched by SPELLING. `def run(sleep): return sleep(5)`
51
+ * invokes a callback and was reported as a blocking sleep, and a module that never
52
+ * imports one was too — a false blocking finding on a correct file. The inverse was
53
+ * also true and is not something spelling could have caught: `from time import sleep
54
+ * as pause` binds the sleep to `pause`, and `pause(2)` was missed entirely.
55
+ *
56
+ * So the names come from the module rather than from a list: whatever `time` and
57
+ * `asyncio` are imported AS, and whatever their `sleep` is imported AS.
58
+ */
59
+ export interface SleepBindings {
60
+ /** Names that call a sleep directly: `sleep`, or its `as` alias. */
61
+ bare: Set<string>;
62
+ /** Qualifiers whose `.sleep` is a sleep: `time`, `asyncio`, or an alias. */
63
+ qualified: Set<string>;
64
+ }
65
+ export declare function pythonSleepBindings(content: string): SleepBindings;
66
+ /** `1500` → `1.5s`, `50000` → `50s`. Seconds throughout: a reviewer compares a helper's
67
+ * cost against a test's runtime, not against a frame. */
68
+ export declare function describeSleepMs(ms: number): string;
69
+ /**
70
+ * Every fixed sleep in one helper body.
71
+ *
72
+ * `body` is the raw source lines, `scan` the same lines with comments and string
73
+ * CONTENTS blanked (offsets preserved) — so a commented-out wait and a wait quoted
74
+ * inside a fill() are neither of them calls. Structure is read from `scan`; the text
75
+ * the agent is shown comes from `body`.
76
+ */
77
+ export declare function fixedSleepsIn(body: string[], scan: string[], language: UtilsLanguage, params: string[], startLine: number, bindings?: SleepBindings): HelperSleep[];
78
+ /** The whole finding for one helper: every sleep it holds, what each costs, and what
79
+ * the loop around one of them multiplies it by. ONE finding per helper — so one
80
+ * `reuse-verify: allow` marker documents a helper's timing decision rather than
81
+ * needing one line per call. */
82
+ export declare function describeFixedSleeps(sleeps: HelperSleep[]): string;
83
+ /** What every call of the helper costs at worst, loops multiplied in. `undefined`
84
+ * when any sleep's duration — or any loop's bound — could not be read: a total that
85
+ * silently omitted one would understate the cost, and understating it is how the
86
+ * finding gets argued down. */
87
+ export declare function totalMs(sleeps: HelperSleep[]): number | undefined;
88
+ /**
89
+ * What to do INSTEAD, named in the finding itself.
90
+ *
91
+ * A finding an agent cannot act on burns verify rounds and is then documented away,
92
+ * which is the outcome this gate exists to avoid. So the text never says "remove the
93
+ * sleep": it names the wait that replaces it, and rules out the fix the model reaches
94
+ * for first — a shorter sleep, which is the same defect at a smaller number.
95
+ */
96
+ export declare function fixedSleepReplacement(family: "api" | "browser", language: UtilsLanguage): string;
@@ -0,0 +1,461 @@
1
+ import { playwrightSpelling } from "./language-spec.js";
2
+ import { HELPER_ASSERTION_POLICIES } from "../../prompts/shared-helper-policy.js";
3
+ export function pythonSleepBindings(content) {
4
+ const bare = new Set();
5
+ const qualified = new Set();
6
+ for (const m of content.matchAll(/^\s*from\s+(time|asyncio)\s+import\s+([^\n#]+)/gm))
7
+ for (const raw of m[2].replace(/[()]/g, "").split(",")) {
8
+ const [name, alias] = raw.trim().split(/\s+as\s+/);
9
+ if (name === "sleep")
10
+ bare.add(alias?.trim() || "sleep");
11
+ }
12
+ for (const m of content.matchAll(/^\s*import\s+(time|asyncio)(?:\s+as\s+([A-Za-z_]\w*))?\s*$/gm))
13
+ qualified.add(m[2] ?? m[1]);
14
+ return { bare, qualified };
15
+ }
16
+ /** The sleep call shapes to look for in one FILE — Python's depend on what that
17
+ * file imports, so the table is built per file rather than declared once. */
18
+ function formsFor(language, bindings) {
19
+ if (language !== "python")
20
+ return FORMS[language];
21
+ const forms = [
22
+ // Playwright for Python — milliseconds, like its JavaScript spelling.
23
+ { re: /\.wait_for_timeout\s*\(/g, arg: 0, unit: "ms" },
24
+ ];
25
+ // Seconds, in every Python form.
26
+ const qualified = [...bindings.qualified];
27
+ if (qualified.length > 0)
28
+ forms.push({
29
+ re: new RegExp(`(?<![\\w.])(?:${qualified.join("|")})\\.sleep\\s*\\(`, "g"),
30
+ arg: 0,
31
+ unit: "s",
32
+ });
33
+ // `time.sleep(…)` / `asyncio.sleep(…)` written without an `import` this pass can
34
+ // see — a fully qualified call names its module, so no binding is needed to read it.
35
+ forms.push({
36
+ re: /(?<![\w.])(?:time|asyncio)\.sleep\s*\(/g,
37
+ arg: 0,
38
+ unit: "s",
39
+ });
40
+ if (bindings.bare.size > 0)
41
+ forms.push({
42
+ re: new RegExp(`(?<![\\w.])(?:${[...bindings.bare].join("|")})\\s*\\(`, "g"),
43
+ arg: 0,
44
+ unit: "s",
45
+ });
46
+ return forms;
47
+ }
48
+ const FORMS = {
49
+ python: [],
50
+ typescript: [
51
+ { re: /\.waitForTimeout\s*\(/g, arg: 0, unit: "ms" },
52
+ // `timers/promises`' setTimeout, and a module-local `sleep`/`delay` helper —
53
+ // awaited, because only an awaited promise makes the caller wait.
54
+ {
55
+ re: /(?<![\w.])await\s+(?:setTimeout|sleep|delay)\s*\(/g,
56
+ arg: 0,
57
+ unit: "ms",
58
+ },
59
+ // `await new Promise((resolve) => setTimeout(resolve, 1000))` — the idiom that
60
+ // spells a sleep where no API offers one. The delay is the second argument.
61
+ {
62
+ re: /(?<![\w.])setTimeout\s*\(/g,
63
+ arg: 1,
64
+ unit: "ms",
65
+ inPromise: true,
66
+ },
67
+ ],
68
+ javascript: [],
69
+ };
70
+ FORMS.javascript = FORMS.typescript;
71
+ /** `1500` → `1.5s`, `50000` → `50s`. Seconds throughout: a reviewer compares a helper's
72
+ * cost against a test's runtime, not against a frame. */
73
+ export function describeSleepMs(ms) {
74
+ return `${Number((ms / 1000).toFixed(3))}s`;
75
+ }
76
+ /**
77
+ * Every fixed sleep in one helper body.
78
+ *
79
+ * `body` is the raw source lines, `scan` the same lines with comments and string
80
+ * CONTENTS blanked (offsets preserved) — so a commented-out wait and a wait quoted
81
+ * inside a fill() are neither of them calls. Structure is read from `scan`; the text
82
+ * the agent is shown comes from `body`.
83
+ */
84
+ export function fixedSleepsIn(body, scan, language, params, startLine, bindings = { bare: new Set(), qualified: new Set() }) {
85
+ const src = scan.join("\n");
86
+ // A parameter shadows a module binding: `run(sleep)` calling `sleep(5)` invokes
87
+ // what its caller passed, whatever the module imported.
88
+ const shadowed = new Set(params.map(paramNameOf).filter(Boolean));
89
+ const lineStarts = lineStartOffsets(src);
90
+ const promises = language === "python" ? [] : promiseSpans(src);
91
+ // Which loops repeat which stretch of source, computed ONCE for the body. A sleep
92
+ // is inside a loop when its offset lies in that loop's span — see loopSpans.
93
+ const loops = loopSpans(src, scan, language, params);
94
+ const found = new Map();
95
+ for (const form of formsFor(language, bindings)) {
96
+ for (const m of src.matchAll(form.re)) {
97
+ const open = m.index + m[0].length - 1;
98
+ if (form.inPromise && !promises.some(([a, b]) => open > a && open < b))
99
+ continue;
100
+ // A DECLARATION is not a call: `def sleep(seconds)` names a helper, it does
101
+ // not wait, and reporting it is a false BLOCKING finding on a correct file —
102
+ // the one outcome this gate must not produce. Only the bare Python form is
103
+ // exposed to this; every other form requires a `.` or an `await` before it,
104
+ // which a declaration cannot carry. Checked here rather than by blanking the
105
+ // signature span: `signatureLines` reads the sole `(` of a bare-arrow helper
106
+ // (`const settle = async page => { await page.waitForTimeout(250); }`) as its
107
+ // parameter list, so blanking that span would blank the sleep itself.
108
+ if (/\bdef$/.test(src.slice(0, m.index).trimEnd()))
109
+ continue;
110
+ // The called name, when the form matched a bare one.
111
+ const called = /^([A-Za-z_$][\w$]*)\s*\($/.exec(m[0]);
112
+ if (called && shadowed.has(called[1]))
113
+ continue;
114
+ const awaited = /^await\s+([A-Za-z_$][\w$]*)\s*\($/.exec(m[0]);
115
+ if (awaited && shadowed.has(awaited[1]))
116
+ continue;
117
+ const close = closeOf(src, open);
118
+ if (close === -1)
119
+ continue;
120
+ const args = splitArgs(src.slice(open + 1, close));
121
+ const raw = args[form.arg];
122
+ const value = raw === undefined ? undefined : resolveNumber(raw, params);
123
+ const first = lineOf(lineStarts, m.index);
124
+ const last = lineOf(lineStarts, close);
125
+ found.set(m.index, {
126
+ line: startLine + first,
127
+ text: body
128
+ .slice(first, last + 1)
129
+ .join(" ")
130
+ .trim()
131
+ .replace(/\s+/g, " "),
132
+ ms: value === undefined
133
+ ? undefined
134
+ : value * (form.unit === "s" ? 1000 : 1),
135
+ loop: enclosedBy(loops, m.index),
136
+ });
137
+ }
138
+ }
139
+ return [...found.entries()].sort((a, b) => a[0] - b[0]).map(([, s]) => s);
140
+ }
141
+ /** The whole finding for one helper: every sleep it holds, what each costs, and what
142
+ * the loop around one of them multiplies it by. ONE finding per helper — so one
143
+ * `reuse-verify: allow` marker documents a helper's timing decision rather than
144
+ * needing one line per call. */
145
+ export function describeFixedSleeps(sleeps) {
146
+ const each = sleeps.map((s) => {
147
+ const where = s.loop ? `, inside ${describeLoop(s.loop)}` : "";
148
+ const cost = s.ms === undefined
149
+ ? " — a wait for a duration this pass cannot read"
150
+ : ` — ${describeSleepMs(s.ms)} per call`;
151
+ return `\`${s.text}\` (line ${s.line})${where}${cost}`;
152
+ });
153
+ // The total is what a LOOP or a second sleep adds to what each line already says;
154
+ // for one bare wait it would only restate the duration.
155
+ const total = sleeps.length === 1 && !sleeps[0].loop ? undefined : totalMs(sleeps);
156
+ return (each.join("; ") +
157
+ (total === undefined
158
+ ? ""
159
+ : ` — up to ${describeSleepMs(total)} inside one helper`));
160
+ }
161
+ /** `a loop of up to 10 iterations` / `2 nested loops of up to 100 iterations in
162
+ * total` / `a loop` when the bound is a condition. */
163
+ function describeLoop(loop) {
164
+ const what = loop.depth === 1 ? "a loop" : `${loop.depth} nested loops`;
165
+ return loop.iterations === undefined
166
+ ? what
167
+ : `${what} of up to ${loop.iterations} iterations${loop.depth === 1 ? "" : " in total"}`;
168
+ }
169
+ /** What every call of the helper costs at worst, loops multiplied in. `undefined`
170
+ * when any sleep's duration — or any loop's bound — could not be read: a total that
171
+ * silently omitted one would understate the cost, and understating it is how the
172
+ * finding gets argued down. */
173
+ export function totalMs(sleeps) {
174
+ let sum = 0;
175
+ for (const s of sleeps) {
176
+ if (s.ms === undefined)
177
+ return undefined;
178
+ if (s.loop && s.loop.iterations === undefined)
179
+ return undefined;
180
+ sum += s.ms * (s.loop?.iterations ?? 1);
181
+ }
182
+ return sum;
183
+ }
184
+ /**
185
+ * Which loops repeat which stretch of the helper body.
186
+ *
187
+ * Read as SPANS rather than by walking lines outward from the sleep. The walk was
188
+ * wrong in four separate ways, each found after the last was fixed: it missed a
189
+ * Prettier-wrapped header (the depth-lowering line is only `) {`), it counted a loop
190
+ * that had already CLOSED before the sleep, it saw one of two loops opening on a
191
+ * single line, and it stopped at the innermost of a nest. All four are the same
192
+ * defect — a loop's extent is not a property of the lines around it — so the extent
193
+ * is now computed directly and the question becomes whether the sleep's offset falls
194
+ * inside it.
195
+ */
196
+ function loopSpans(src, scan, language, params) {
197
+ return language === "python"
198
+ ? pythonLoopSpans(scan, params)
199
+ : braceLoopSpans(src, params);
200
+ }
201
+ /** Every loop whose span holds `offset`, folded into one bound. One unreadable
202
+ * bound makes the product unknown rather than partial — a total that understates
203
+ * the cost is how the finding gets argued down. */
204
+ function enclosedBy(loops, offset) {
205
+ const inside = loops.filter((l) => offset > l.from && offset < l.to);
206
+ if (inside.length === 0)
207
+ return undefined;
208
+ return {
209
+ iterations: inside.some((l) => l.iterations === undefined)
210
+ ? undefined
211
+ : inside.reduce((a, l) => a * l.iterations, 1),
212
+ depth: inside.length,
213
+ };
214
+ }
215
+ function braceLoopSpans(src, params) {
216
+ const out = [];
217
+ for (const m of src.matchAll(/(?<![\w$.])(?:for|while)\s*\(/g)) {
218
+ const paren = m.index + m[0].length - 1;
219
+ const close = closeOf(src, paren);
220
+ if (close === -1)
221
+ continue;
222
+ const body = bodyAfter(src, close + 1);
223
+ if (!body)
224
+ continue;
225
+ // The header is read from its own span, so a wrapped one reads the same as a
226
+ // one-line one and two headers on a line each read their own bound.
227
+ out.push({
228
+ iterations: braceIterations(src.slice(m.index, close + 1), params),
229
+ ...body,
230
+ });
231
+ }
232
+ for (const m of src.matchAll(/(?<![\w$.])do\s*\{/g)) {
233
+ const brace = m.index + m[0].length - 1;
234
+ const end = matchingBrace(src, brace);
235
+ if (end !== -1)
236
+ out.push({ iterations: undefined, from: brace, to: end });
237
+ }
238
+ return out;
239
+ }
240
+ /** The statement a loop header repeats: a braced block, or one statement ending at
241
+ * the next top-level `;`. */
242
+ function bodyAfter(src, i) {
243
+ let k = i;
244
+ while (k < src.length && /\s/.test(src[k]))
245
+ k++;
246
+ if (k >= src.length)
247
+ return undefined;
248
+ if (src[k] === "{") {
249
+ const end = matchingBrace(src, k);
250
+ return end === -1 ? undefined : { from: k, to: end };
251
+ }
252
+ let depth = 0;
253
+ for (let j = k; j < src.length; j++) {
254
+ const c = src[j];
255
+ if ("([{".includes(c))
256
+ depth++;
257
+ else if (")]}".includes(c))
258
+ depth--;
259
+ else if (c === ";" && depth === 0)
260
+ return { from: i, to: j };
261
+ }
262
+ return { from: i, to: src.length };
263
+ }
264
+ function matchingBrace(src, open) {
265
+ let depth = 0;
266
+ for (let i = open; i < src.length; i++) {
267
+ if (src[i] === "{")
268
+ depth++;
269
+ else if (src[i] === "}" && --depth === 0)
270
+ return i;
271
+ }
272
+ return -1;
273
+ }
274
+ /** Python has no braces: a loop repeats the lines indented past its header, or the
275
+ * single statement written after the colon on the header's own line. */
276
+ function pythonLoopSpans(scan, params) {
277
+ const starts = lineStartOffsets(scan.join("\n"));
278
+ const out = [];
279
+ for (let i = 0; i < scan.length; i++) {
280
+ const m = /^(\s*)(?:async\s+)?(?:for|while)\b/.exec(scan[i]);
281
+ if (!m)
282
+ continue;
283
+ const iterations = pythonIterations(scan[i], params);
284
+ const lineEnd = starts[i] + scan[i].length;
285
+ const colon = scan[i].indexOf(":");
286
+ if (colon !== -1 && scan[i].slice(colon + 1).trim() !== "") {
287
+ out.push({ iterations, from: starts[i] + colon, to: lineEnd });
288
+ continue;
289
+ }
290
+ const indent = m[1].length;
291
+ let last = i;
292
+ for (let j = i + 1; j < scan.length; j++) {
293
+ if (scan[j].trim() === "")
294
+ continue;
295
+ if (indentOf(scan[j]) <= indent)
296
+ break;
297
+ last = j;
298
+ }
299
+ if (last === i)
300
+ continue;
301
+ out.push({
302
+ iterations,
303
+ from: lineEnd,
304
+ to: starts[last] + scan[last].length,
305
+ });
306
+ }
307
+ return out;
308
+ }
309
+ /** `for idx in range(max_retries):` → the bound, when it is one number. A two- or
310
+ * three-argument range, an iterable, and a `while` all read as unbounded. */
311
+ function pythonIterations(line, params) {
312
+ const m = /\brange\s*\(\s*([^),]+)\s*\)/.exec(line);
313
+ return m ? wholeIterations(resolveNumber(m[1], params)) : undefined;
314
+ }
315
+ /** A loop runs a whole number of times. A non-integer bound (`i < 2.5`, which runs
316
+ * three times) is left unknown rather than reported as itself: reporting 2.5 would
317
+ * understate the total this module documents itself as never understating. A
318
+ * DURATION may still be fractional — `asyncio.sleep(0.5)` is ordinary. */
319
+ function wholeIterations(n) {
320
+ return n !== undefined && Number.isInteger(n) ? n : undefined;
321
+ }
322
+ /**
323
+ * `for (let i = 0; i < 6; i++)` → the bound. `<=` counts one more.
324
+ *
325
+ * The CANONICAL form only — one counter, started at zero, stepped by one, compared
326
+ * against the bound. Reading the comparison alone made `for (let i = -10; i < 6; i++)`
327
+ * count 6 where it runs 16, and `i += 2` count the same where it runs half as often.
328
+ * Anything else (a `for…of`, a non-zero start, a step that is not one) leaves the
329
+ * count unknown, which withholds the total rather than understating it — the
330
+ * invariant `totalMs` states. The sleep is still found; only its arithmetic is.
331
+ */
332
+ function braceIterations(line, params) {
333
+ const m = /(?<![\w$.])for\s*\(\s*(?:let|var|const)?\s*([A-Za-z_$][\w$]*)\s*=\s*0\s*;\s*\1\s*(<=?)\s*([^;]+?)\s*;\s*(?:\1\s*\+\+|\+\+\s*\1|\1\s*\+=\s*1)\s*\)/.exec(line);
334
+ if (!m)
335
+ return undefined;
336
+ const n = wholeIterations(resolveNumber(m[3], params));
337
+ return n === undefined ? undefined : m[2] === "<=" ? n + 1 : n;
338
+ }
339
+ /** A numeric literal, or a parameter whose DEFAULT is one (`sleep_time=5`,
340
+ * `retries: number = 10`). Anything else is unreadable — never guessed at. */
341
+ function resolveNumber(text, params) {
342
+ const t = text.trim();
343
+ if (/^\d+(?:\.\d+)?$/.test(t))
344
+ return Number(t);
345
+ if (!/^[A-Za-z_$][\w$]*$/.test(t))
346
+ return undefined;
347
+ for (const p of params) {
348
+ const m = /^([A-Za-z_$][\w$]*)\s*\??\s*(?::[^=]*)?=\s*(.+)$/.exec(p.trim());
349
+ if (m && m[1] === t && /^\d+(?:\.\d+)?$/.test(m[2].trim()))
350
+ return Number(m[2].trim());
351
+ }
352
+ return undefined;
353
+ }
354
+ /** Spans of every `new Promise(` in the source, as [open, close] offsets.
355
+ *
356
+ * The type argument is optional and is skipped: `new Promise<void>(…)` is what a
357
+ * strict TypeScript file writes, and reading only the bare form let the idiomatic
358
+ * spelling of a promise-wrapped sleep through the gate entirely. `[^()]*` spans a
359
+ * nested generic (`Promise<Record<string, number>>`) and cannot run past the
360
+ * constructor's own parenthesis. */
361
+ function promiseSpans(src) {
362
+ const out = [];
363
+ for (const m of src.matchAll(/(?<![\w$.])new\s+Promise\s*(?:<[^()]*>\s*)?\(/g)) {
364
+ const open = m.index + m[0].length - 1;
365
+ const close = closeOf(src, open);
366
+ if (close !== -1)
367
+ out.push([open, close]);
368
+ }
369
+ return out;
370
+ }
371
+ /** The `)` matching the `(` at `open`, or -1. `src` has its string contents blanked,
372
+ * so a parenthesis inside a literal never counts. */
373
+ function closeOf(src, open) {
374
+ let depth = 0;
375
+ for (let i = open; i < src.length; i++) {
376
+ if (src[i] === "(")
377
+ depth++;
378
+ else if (src[i] === ")" && --depth === 0)
379
+ return i;
380
+ }
381
+ return -1;
382
+ }
383
+ /** An argument list split on TOP-LEVEL commas: a comma inside a nested call, an
384
+ * object or an array does not separate arguments. */
385
+ function splitArgs(text) {
386
+ const out = [];
387
+ let depth = 0;
388
+ let cur = "";
389
+ for (const ch of text) {
390
+ if ("([{".includes(ch))
391
+ depth++;
392
+ else if (")]}".includes(ch))
393
+ depth--;
394
+ if (ch === "," && depth === 0) {
395
+ out.push(cur);
396
+ cur = "";
397
+ continue;
398
+ }
399
+ cur += ch;
400
+ }
401
+ out.push(cur);
402
+ return out.map((a) => a.trim()).filter((a, i) => i === 0 || a !== "");
403
+ }
404
+ /** The name a declared parameter introduces: `page: Page` → `page`,
405
+ * `sleep_time=5` → `sleep_time`, `...rest` → `rest`, `*args` → `args`. */
406
+ function paramNameOf(param) {
407
+ return (/^[\s*.]*([A-Za-z_$][\w$]*)/.exec(param.replace(/^\.\.\./, ""))?.[1] ?? "");
408
+ }
409
+ function indentOf(line) {
410
+ return line.length - line.trimStart().length;
411
+ }
412
+ function lineStartOffsets(src) {
413
+ const out = [0];
414
+ for (let i = 0; i < src.length; i++)
415
+ if (src[i] === "\n")
416
+ out.push(i + 1);
417
+ return out;
418
+ }
419
+ /** 0-based line index holding `offset`. */
420
+ function lineOf(starts, offset) {
421
+ let lo = 0;
422
+ let hi = starts.length - 1;
423
+ while (lo < hi) {
424
+ const mid = (lo + hi + 1) >> 1;
425
+ if (starts[mid] <= offset)
426
+ lo = mid;
427
+ else
428
+ hi = mid - 1;
429
+ }
430
+ return lo;
431
+ }
432
+ /**
433
+ * What to do INSTEAD, named in the finding itself.
434
+ *
435
+ * A finding an agent cannot act on burns verify rounds and is then documented away,
436
+ * which is the outcome this gate exists to avoid. So the text never says "remove the
437
+ * sleep": it names the wait that replaces it, and rules out the fix the model reaches
438
+ * for first — a shorter sleep, which is the same defect at a smaller number.
439
+ */
440
+ export function fixedSleepReplacement(family, language) {
441
+ // The presence matchers are READ from the policy rather than spelled here. Spelled,
442
+ // the text offered `toBeEnabled`, which that policy REFUSES for a shared helper: an
443
+ // agent following the fix literally would clear `fixed-sleep` in one round and raise
444
+ // `body-assertion` in the next, against a budget of three. A list the gate keeps of
445
+ // its own is a list that drifts from the one the gate enforces.
446
+ if (family !== "browser")
447
+ return "Wait on the RESOURCE'S OWN state: re-read it and assert the field the change lands in, or use the API's own readiness signal. If one scenario genuinely needs to poll, the polling belongs in THAT test, not in the module every test imports. Never a shorter sleep — that is the same wait at a smaller number";
448
+ // A Python browser helper told to call `toBeVisible` receives a name Playwright for
449
+ // Python does not have, which makes a BLOCKING finding non-actionable. The matchers
450
+ // differ only in spelling, so they come from the policy through playwrightSpelling;
451
+ // the network wait differs in SHAPE — Python has no `waitForResponse` call, only the
452
+ // `expect_response` context manager — so snake-casing it produced a call that does
453
+ // not exist, and it is named per language instead.
454
+ const presence = HELPER_ASSERTION_POLICIES.browser.permittedMatchers
455
+ .map((m) => `\`.${playwrightSpelling(m, language)}()\``)
456
+ .join(" / ");
457
+ const NEVER = "Never a shorter sleep — that is the same wait at a smaller number";
458
+ return language === "python"
459
+ ? `Wait for the CONDITION the sleep stands in for: \`expect(<locator>)\` with ${presence}, \`page.wait_for_url(<pattern>)\`, or \`page.wait_for_load_state()\`; for a network wait, wrap the action that triggers it in \`with page.expect_response(<url>):\` — Playwright Python's response wait is a context manager, not a call. In an \`async def\` helper use the async API throughout: \`await\` each call, and \`async with\` the context manager. ${NEVER}`
460
+ : `Wait for the CONDITION the sleep stands in for: \`await expect(<locator>)\` with ${presence}, \`page.waitForResponse(<url>)\`, \`page.waitForURL(<pattern>)\`, or \`page.waitForLoadState()\`. ${NEVER}`;
461
+ }
@@ -0,0 +1,93 @@
1
+ import { type UtilsHelper } from "./parse.js";
2
+ import type { UtilsLanguageSpec } from "./language-spec.js";
3
+ import type { UtilsViolation } from "./verify.js";
4
+ /**
5
+ * The repository's own helper modules — files the customer wrote — as far as a verify
6
+ * pass can see them: the modules the delivered spec imports that are tracked at HEAD
7
+ * and carry no Skyramp header.
8
+ *
9
+ * "Tracked at HEAD" is what makes a module in-house here. A module this run created
10
+ * is not at HEAD; a Skyramp module from an earlier run is, but carries the header and
11
+ * is the utils verifier's. Nothing here routes on who wrote a file beyond that: a
12
+ * helper at HEAD keeps its own conventions, whoever wrote it, and the checks below
13
+ * ask only whether the spec's calls resolve and whether this run's changes to the
14
+ * module were additive.
15
+ */
16
+ export interface InHouseModule {
17
+ /** Canonical absolute path. */
18
+ file: string;
19
+ /** Repository-relative, posix — what `git show HEAD:<relPath>` reads. */
20
+ relPath: string;
21
+ }
22
+ export declare function locateInHouseModules(params: {
23
+ testFile: string;
24
+ spec: UtilsLanguageSpec;
25
+ cwd?: string;
26
+ }): Promise<InHouseModule[]>;
27
+ /** The number of arguments a helper accepts: from the position of its last required
28
+ * parameter to its total, a rest parameter opening the top. A parameter with a
29
+ * default, an optional `x?`, or a Python `*args`/`**kw` is not required — but a
30
+ * required one AFTER a defaulted one still has to be reached positionally, so the
31
+ * minimum is its position, not the count of required parameters. `undefined` when
32
+ * the signature could not be read. */
33
+ export declare function argumentRange(helper: Pick<UtilsHelper, "params">): {
34
+ min: number;
35
+ max: number;
36
+ } | undefined;
37
+ export interface InHouseResolution {
38
+ /** Imported names the module defines as readable helpers, checked or not. */
39
+ resolved: string[];
40
+ /** Imported names the module exports in a form this cannot read — a class, a
41
+ * re-export, a constant. Not a violation: the run is told, not blocked. */
42
+ unverifiable: string[];
43
+ violations: UtilsViolation[];
44
+ }
45
+ /**
46
+ * Resolve — verify step 9. The imported name exists in the module's source, and each
47
+ * call passes an argument count between the definition's required count and its
48
+ * total. A range, not an exact count: every helper in the pilot's module has
49
+ * defaulted parameters, and an exact count rejects them all.
50
+ *
51
+ * `stem` is the module's basename without extension, which is how the language
52
+ * spec reads the spec's imports of it.
53
+ */
54
+ export declare function resolveInHouseCalls(specContent: string, moduleContent: string, stem: string, spec: UtilsLanguageSpec, file?: string): InHouseResolution;
55
+ export interface AdditiveResult {
56
+ /** Whether HEAD's copy of the module could be read and compared. `false` is
57
+ * reported, never read as "nothing changed". */
58
+ ran: boolean;
59
+ violations: UtilsViolation[];
60
+ /** Helpers in the working copy that HEAD does not hold — what this run added. */
61
+ added: string[];
62
+ /** HEAD helpers that gained a defaulted parameter and nothing else. */
63
+ widened: string[];
64
+ /** An added helper whose action sequence a HEAD helper already performs: the
65
+ * duplicate the extension exists to avoid, now inside the customer's file. */
66
+ duplicates: {
67
+ added: string;
68
+ existing: string;
69
+ }[];
70
+ }
71
+ /**
72
+ * Additive only — verify step 11. Every change this run made to an in-house module
73
+ * adds a helper, or adds a parameter that carries a default. Anything else is
74
+ * refused: a helper removed or renamed, a body changed, a parameter added with no
75
+ * default, a line outside every helper deleted or edited.
76
+ *
77
+ * The widening rule is checked, not trusted: with each added parameter's name
78
+ * replaced by its default in the new body, and the added parameters dropped from
79
+ * the signature, the helper must read as it did at HEAD. That is what "the default
80
+ * is what the helper sends today" means, and it is decidable from the two texts.
81
+ *
82
+ * Compared on HEAD versus the working tree, so it holds at the verify call and again
83
+ * at the submit-time re-derivation. Fails open: a module HEAD does not hold, or a
84
+ * git that cannot be asked, reports `ran: false` with no violations.
85
+ */
86
+ export declare function additiveChanges(file: string, root: string, spec: UtilsLanguageSpec): Promise<AdditiveResult>;
87
+ /** Formatting whitespace outside string literals dropped, `'` normalised to `"` (a
88
+ * template literal keeps its backticks), Prettier's trailing commas removed — two spellings of one code compare equal, and
89
+ * a changed string content still compares unequal. Whitespace that SEPARATES two
90
+ * identifier characters is a token boundary, not formatting: it is kept as one
91
+ * space, so `await Promise` and `awaitPromise` stay two different texts.
92
+ * Whitespace inside a regex literal is not recognised as significant. */
93
+ export declare function squash(text: string): string;