@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.
- package/build/adapters/jestAdapter.js +23 -5
- package/build/adapters/mochaAdapter.js +7 -1
- package/build/adapters/playwrightAdapter.js +3 -1
- package/build/adapters/pytestAdapter.js +14 -3
- package/build/commands/localDevTestChangesCommand.js +1 -0
- package/build/commands/recommendTestsAndExecuteCommand.js +5 -6
- package/build/commands/testThisEndpointCommand.js +16 -4
- package/build/index.js +34 -4
- package/build/playwright/blueprintDigest.js +28 -7
- package/build/playwright/registerPlaywrightTools.js +33 -28
- package/build/playwright/traceRecordingPrompt.js +9 -2
- package/build/prompts/code-reuse.js +95 -29
- package/build/prompts/fix-error-prompt.d.ts +9 -1
- package/build/prompts/fix-error-prompt.js +31 -28
- package/build/prompts/local-dev/local-dev-plan.d.ts +3 -0
- package/build/prompts/local-dev/local-dev-plan.js +3 -1
- package/build/prompts/local-dev/local-dev-prompts.d.ts +1 -1
- package/build/prompts/local-dev/local-dev-prompts.js +30 -3
- package/build/prompts/modularization/integration-test-modularization.js +13 -6
- package/build/prompts/modularization/ui-test-modularization.js +1 -1
- package/build/prompts/personas.js +1 -1
- package/build/prompts/pom-aware-code-reuse.js +7 -9
- package/build/prompts/reuse-hand-off.d.ts +64 -0
- package/build/prompts/reuse-hand-off.js +130 -0
- package/build/prompts/shared-helper-policy.d.ts +88 -2
- package/build/prompts/shared-helper-policy.js +145 -11
- package/build/prompts/sut-setup/modes/adaptWorkflowPrompt.js +1 -1
- package/build/prompts/sut-setup/modes/dockerComposePrompt.js +1 -1
- package/build/prompts/sut-setup/shared.d.ts +4 -1
- package/build/prompts/sut-setup/shared.js +2 -2
- package/build/prompts/test-maintenance/actionsInstructions.d.ts +19 -11
- package/build/prompts/test-maintenance/actionsInstructions.js +47 -26
- package/build/prompts/test-maintenance/drift-analysis-prompt.js +3 -2
- package/build/prompts/test-maintenance/driftAnalysisSections.js +5 -3
- package/build/prompts/test-maintenance/driftAnalysisShared.js +4 -2
- package/build/prompts/test-maintenance/uiDriftAnalysisSections.js +7 -4
- package/build/prompts/test-recommendation/recommendationSections.js +19 -8
- package/build/prompts/test-recommendation/registerRecommendTestsPrompt.js +5 -2
- package/build/prompts/test-recommendation/test-recommendation-prompt.js +10 -7
- package/build/prompts/testbot/testbot-prompts.js +123 -55
- package/build/recommendation/answers.js +18 -9
- package/build/recommendation/pullRequestText.js +1 -1
- package/build/recommendation/registerPlan.js +31 -17
- package/build/recommendation/subjectStep.d.ts +8 -10
- package/build/recommendation/subjectStep.js +17 -16
- package/build/recommendation/types.d.ts +71 -17
- package/build/recommendation/types.js +9 -15
- package/build/recommendation/verifierContracts.d.ts +7 -3
- package/build/recommendation/verifierContracts.js +8 -4
- package/build/recommendation/verifiers/changedFile.js +11 -13
- package/build/recommendation/verifiers/citedPath.d.ts +8 -0
- package/build/recommendation/verifiers/citedPath.js +16 -2
- package/build/recommendation/verifiers/coverage.d.ts +2 -2
- package/build/recommendation/verifiers/coverage.js +190 -134
- package/build/recommendation/verifiers/defects.js +56 -16
- package/build/recommendation/verifiers/deliveredMatchesPlan.d.ts +7 -1
- package/build/recommendation/verifiers/deliveredMatchesPlan.js +28 -14
- package/build/recommendation/verifiers/endpointGrounded.js +14 -8
- package/build/recommendation/verifiers/existingCoverage.d.ts +6 -0
- package/build/recommendation/verifiers/existingCoverage.js +30 -21
- package/build/recommendation/verifiers/expectedOutcome.js +17 -8
- package/build/recommendation/verifiers/expectedValueSourced.js +54 -43
- package/build/recommendation/verifiers/issueTraceability.d.ts +5 -0
- package/build/recommendation/verifiers/issueTraceability.js +64 -7
- package/build/recommendation/verifiers/removedElementGuarded.js +19 -11
- package/build/recommendation/verifiers/reportedCategory.js +9 -4
- package/build/recommendation/verifiers/requirementSourced.js +34 -21
- package/build/recommendation/verifiers/screenRoute.js +15 -10
- package/build/recommendation/verifiers/statedDifference.js +15 -8
- package/build/recommendation/verifiers/uiElementGrounded.js +50 -16
- package/build/resources/analysisResources.js +7 -3
- package/build/resources/progressResource.js +4 -2
- package/build/resources/sutSetupResource.js +20 -2
- package/build/resources/testbotResource.js +19 -1
- package/build/services/AnalyticsService.js +3 -1
- package/build/services/ScenarioGenerationService.js +5 -5
- package/build/services/TestDiscoveryService.js +21 -5
- package/build/services/TestExecutionService.js +63 -21
- package/build/services/TestGenerationService.d.ts +1 -1
- package/build/services/TestGenerationService.js +43 -24
- package/build/skills/enhanceAssertionsSkill.d.ts +45 -0
- package/build/skills/enhanceAssertionsSkill.js +103 -0
- package/build/skills/fixTestImportErrorsSkill.d.ts +2 -2
- package/build/skills/fixTestImportErrorsSkill.js +2 -2
- package/build/skills/skillFiles.d.ts +38 -0
- package/build/skills/skillFiles.js +94 -0
- package/build/skills/validateAssertionAlignmentSkill.d.ts +34 -0
- package/build/skills/validateAssertionAlignmentSkill.js +59 -0
- package/build/tool-phases.js +4 -0
- package/build/tools/auth/loginTool.js +3 -1
- package/build/tools/auth/logoutTool.js +3 -1
- package/build/tools/code-refactor/alignAssertionsTool.d.ts +2 -0
- package/build/tools/code-refactor/alignAssertionsTool.js +51 -0
- package/build/tools/code-refactor/assertion-state.d.ts +1 -1
- package/build/tools/code-refactor/assertion-state.js +1 -1
- package/build/tools/code-refactor/assertionOperations.d.ts +44 -0
- package/build/tools/code-refactor/assertionOperations.js +82 -0
- package/build/tools/code-refactor/assertionSkillTools.d.ts +3 -0
- package/build/tools/code-refactor/assertionSkillTools.js +86 -0
- package/build/tools/code-refactor/codeReuseTool.js +27 -3
- package/build/tools/code-refactor/enhanceAssertionsTool.js +19 -83
- package/build/tools/code-refactor/gate-markers.d.ts +51 -0
- package/build/tools/code-refactor/gate-markers.js +95 -0
- package/build/tools/code-refactor/retrofit-state.d.ts +3 -1
- package/build/tools/code-refactor/retrofit-state.js +44 -2
- package/build/tools/code-refactor/reuse-outcome.d.ts +23 -1
- package/build/tools/code-refactor/reuse-outcome.js +36 -13
- package/build/tools/code-refactor/reuse-state.d.ts +90 -16
- package/build/tools/code-refactor/reuse-state.js +191 -61
- package/build/tools/code-refactor/utils-verify-gates.d.ts +4 -0
- package/build/tools/code-refactor/utils-verify-gates.js +252 -27
- package/build/tools/code-refactor/verify-gates.d.ts +15 -1
- package/build/tools/code-refactor/verify-gates.js +36 -4
- package/build/tools/enrichTestWithMocksTool.d.ts +1 -1
- package/build/tools/enrichTestWithMocksTool.js +9 -5
- package/build/tools/executeSkyrampTestTool.d.ts +22 -1
- package/build/tools/executeSkyrampTestTool.js +571 -271
- package/build/tools/execution-video-state.js +1 -1
- package/build/tools/fixErrorTool.js +5 -6
- package/build/tools/generate-tests/batchMockGenerationTool.js +1 -1
- package/build/tools/generate-tests/generateBatchScenarioRestTool.js +114 -73
- package/build/tools/generate-tests/generateContractRestTool.js +34 -16
- package/build/tools/generate-tests/generateE2ERestTool.d.ts +1 -0
- package/build/tools/generate-tests/generateE2ERestTool.js +9 -1
- package/build/tools/generate-tests/generateIntegrationRestTool.js +22 -7
- package/build/tools/generate-tests/generateMockRestTool.js +3 -1
- package/build/tools/generate-tests/generateUIRestTool.d.ts +2 -0
- package/build/tools/generate-tests/generateUIRestTool.js +11 -2
- package/build/tools/generate-tests/loadTestSchema.js +1 -3
- package/build/tools/generate-tests/planGuard.js +6 -3
- package/build/tools/generate-tests/scenarioFileIdentity.js +4 -1
- package/build/tools/generate-tests/scenarioLint.js +17 -5
- package/build/tools/generate-tests/trace-reuse-guard.js +5 -2
- package/build/tools/generateEnrichedIntegrationTestTool.js +9 -3
- package/build/tools/one-click/oneClickTool.js +3 -1
- package/build/tools/preflightMockCheckTool.js +23 -7
- package/build/tools/runExistingTestsTool.d.ts +1 -1
- package/build/tools/runExistingTestsTool.js +43 -21
- package/build/tools/submitReportTool.d.ts +51 -12
- package/build/tools/submitReportTool.js +860 -161
- package/build/tools/test-management/actionsTool.js +210 -51
- package/build/tools/test-management/analyzeChangesTool.d.ts +4 -5
- package/build/tools/test-management/analyzeChangesTool.js +127 -68
- package/build/tools/test-management/analyzeTestHealthTool.js +35 -13
- package/build/tools/test-management/registerTestPlanTool.d.ts +44 -34
- package/build/tools/test-management/registerTestPlanTool.js +255 -111
- package/build/tools/test-management/resolveScreenTool.js +33 -9
- package/build/tools/trace/startTraceCollectionTool.js +3 -1
- package/build/tools/trace/stopTraceCollectionTool.js +41 -5
- package/build/tools/verifyTestDependenciesTool.d.ts +3 -0
- package/build/tools/verifyTestDependenciesTool.js +54 -0
- package/build/tools/workspace/initScanWorkspaceTool.js +9 -3
- package/build/tools/workspace/initializeWorkspaceTool.js +3 -1
- package/build/types/AssertionOutcome.d.ts +1 -1
- package/build/types/EnhanceType.d.ts +6 -0
- package/build/types/EnhanceType.js +1 -0
- package/build/types/ExternalTestExecution.d.ts +2 -2
- package/build/types/RepositoryAnalysis.d.ts +0 -40
- package/build/types/ReuseOutcome.d.ts +96 -4
- package/build/types/ReuseOutcome.js +16 -0
- package/build/types/StepMethod.js +20 -6
- package/build/types/TestAnalysis.d.ts +10 -2
- package/build/types/TestExecution.d.ts +45 -0
- package/build/types/TestRecommendation.d.ts +1 -1
- package/build/types/TestRecommendation.js +4 -1
- package/build/types/TestTypes.d.ts +13 -0
- package/build/types/TestTypes.js +34 -3
- package/build/types/TestbotPromptOptions.d.ts +9 -1
- package/build/types/TestbotReport.d.ts +45 -9
- package/build/utils/AnalysisStateManager.d.ts +137 -27
- package/build/utils/AnalysisStateManager.js +227 -43
- package/build/utils/assertion-verify/api-shared-lints.js +34 -16
- package/build/utils/assertion-verify/metrics.js +39 -6
- package/build/utils/assertion-verify/ui-lints.js +4 -2
- package/build/utils/branchDiff.js +47 -12
- package/build/utils/canonicalJson.js +3 -1
- package/build/utils/dartRouteExtractor.js +36 -7
- package/build/utils/fixAttempts.d.ts +26 -0
- package/build/utils/fixAttempts.js +109 -0
- package/build/utils/frontendSelectors.js +23 -4
- package/build/utils/generatedTestRecord.d.ts +19 -0
- package/build/utils/generatedTestRecord.js +61 -0
- package/build/utils/gitStaging.js +7 -2
- package/build/utils/initAgent.js +26 -6
- package/build/utils/language-helper.js +39 -45
- package/build/utils/pathMatching.js +2 -1
- package/build/utils/pathSignatures.js +6 -2
- package/build/utils/planMatchKeys.d.ts +2 -2
- package/build/utils/planMatchKeys.js +20 -14
- package/build/utils/pom-catalog-parse.js +7 -2
- package/build/utils/pom-scope/import-expansion.js +6 -1
- package/build/utils/pom-scope/index.js +50 -12
- package/build/utils/pom-scope/scoring.js +13 -3
- package/build/utils/pom-scope/selector-extractor.js +16 -3
- package/build/utils/pom-scope/strip.d.ts +8 -0
- package/build/utils/pom-scope/strip.js +238 -0
- package/build/utils/pom-scope/testIdDiscovery.js +14 -2
- package/build/utils/pom-verify/__fixtures__/af-style/asset-list.page.d.ts +1 -1
- package/build/utils/pom-verify/__fixtures__/af-style/asset-list.page.js +4 -2
- package/build/utils/pom-verify/__fixtures__/af-style/report.iframe.page.js +3 -1
- package/build/utils/pom-verify/__fixtures__/af-style/workflow-footer.page.js +3 -1
- package/build/utils/pom-verify/bindings.js +5 -1
- package/build/utils/pom-verify/calls.js +9 -2
- package/build/utils/pom-verify/verify.js +27 -5
- package/build/utils/pr-comment-parser.js +20 -7
- package/build/utils/proxy-terminal.d.ts +19 -1
- package/build/utils/proxy-terminal.js +346 -21
- package/build/utils/removedUiElements.js +1 -1
- package/build/utils/reportLanguage.js +35 -7
- package/build/utils/reportVerification.d.ts +14 -8
- package/build/utils/reportVerification.js +19 -19
- package/build/utils/repositorySlug.d.ts +32 -0
- package/build/utils/repositorySlug.js +77 -0
- package/build/utils/reuseRouting.js +6 -2
- package/build/utils/runSerialized.d.ts +3 -0
- package/build/utils/runSerialized.js +39 -0
- package/build/utils/screenRoutes.js +74 -18
- package/build/utils/sourceRouteExtractor.js +13 -6
- package/build/utils/telemetry.d.ts +1 -0
- package/build/utils/telemetry.js +8 -5
- package/build/utils/testDependencyPolicy.d.ts +9 -0
- package/build/utils/testDependencyPolicy.js +788 -0
- package/build/utils/testExecutionRecord.d.ts +90 -0
- package/build/utils/testExecutionRecord.js +267 -0
- package/build/utils/testFileClassification.js +3 -1
- package/build/utils/trace-parser.js +62 -14
- package/build/utils/urlPath.js +3 -1
- package/build/utils/utils-verify/action-key.d.ts +4 -0
- package/build/utils/utils-verify/action-key.js +2 -2
- package/build/utils/utils-verify/allow.d.ts +122 -3
- package/build/utils/utils-verify/allow.js +146 -21
- package/build/utils/utils-verify/body-reach.d.ts +120 -0
- package/build/utils/utils-verify/body-reach.js +335 -0
- package/build/utils/utils-verify/call-sites.d.ts +6 -1
- package/build/utils/utils-verify/call-sites.js +72 -8
- package/build/utils/utils-verify/delivered-imports.d.ts +43 -0
- package/build/utils/utils-verify/delivered-imports.js +84 -0
- package/build/utils/utils-verify/fixed-sleep.d.ts +96 -0
- package/build/utils/utils-verify/fixed-sleep.js +461 -0
- package/build/utils/utils-verify/in-house.d.ts +93 -0
- package/build/utils/utils-verify/in-house.js +719 -0
- package/build/utils/utils-verify/incumbent.d.ts +3 -0
- package/build/utils/utils-verify/incumbent.js +75 -0
- package/build/utils/utils-verify/index.d.ts +1 -0
- package/build/utils/utils-verify/index.js +1 -0
- package/build/utils/utils-verify/language-spec.d.ts +26 -10
- package/build/utils/utils-verify/language-spec.js +217 -20
- package/build/utils/utils-verify/locate.d.ts +26 -0
- package/build/utils/utils-verify/locate.js +125 -23
- package/build/utils/utils-verify/module-name.d.ts +40 -0
- package/build/utils/utils-verify/module-name.js +98 -0
- package/build/utils/utils-verify/parse.d.ts +46 -6
- package/build/utils/utils-verify/parse.js +176 -38
- package/build/utils/utils-verify/retrofit-equivalence.d.ts +5 -0
- package/build/utils/utils-verify/retrofit-equivalence.js +4 -2
- package/build/utils/utils-verify/stage.d.ts +5 -0
- package/build/utils/utils-verify/stage.js +47 -2
- package/build/utils/utils-verify/status-once.d.ts +62 -0
- package/build/utils/utils-verify/status-once.js +207 -0
- package/build/utils/utils-verify/typecheck.d.ts +61 -0
- package/build/utils/utils-verify/typecheck.js +338 -0
- package/build/utils/utils-verify/verify.d.ts +76 -1
- package/build/utils/utils-verify/verify.js +516 -44
- package/build/utils/versions.d.ts +3 -3
- package/build/utils/versions.js +1 -1
- package/build/utils/workspaceAuth.js +107 -37
- package/build/workspace/queryParamResolution.js +11 -4
- package/build/workspace/workspace.js +7 -7
- package/node_modules/playwright/ThirdPartyNotices.txt +19 -19
- package/node_modules/playwright/lib/mcp/skyramp/assertTool.js +8 -2
- package/node_modules/playwright/lib/mcp/skyramp/common/cssValue.js +87 -0
- package/node_modules/playwright/lib/mcp/skyramp/loadTraceTool.js +31 -0
- package/node_modules/playwright/lib/mcp/skyramp/skyRampImport.js +3 -0
- package/node_modules/playwright/lib/mcp/skyramp/traceRecordingBackend.js +181 -15
- package/node_modules/playwright/lib/mcp/test/skyRampExport.js +24 -0
- package/node_modules/playwright/lib/transform/babelBundleImpl.js +2353 -190
- package/node_modules/playwright/node_modules/playwright-core/ThirdPartyNotices.txt +62 -34
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/.package-lock.json +72 -41
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/@hono/node-server/dist/serve-static.js +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/@hono/node-server/dist/serve-static.mjs +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/@hono/node-server/package.json +2 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/README.md +16 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/index.js +4 -20
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/read.js +17 -17
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/json.js +60 -32
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/raw.js +3 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/text.js +3 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/urlencoded.js +16 -20
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/utils.js +18 -16
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/LICENSE +22 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/README.md +71 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/dist/index.d.ts +46 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/dist/index.js +176 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/dist/index.js.map +1 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/package.json +52 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/package.json +23 -10
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/CHANGELOG.md +21 -14
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/isObject.d.ts +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/package.json +6 -7
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/tsconfig.json +1 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/index.js +266 -45
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/lib/schemes.js +9 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/lib/utils.js +396 -92
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/package.json +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/component-safe-serialization.test.js +163 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/equal.test.js +31 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/fixtures/uri-js-parse.json +2 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/ipv6-canonical.test.js +34 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/ipv6-validation.test.js +124 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/malformed-percent.test.js +77 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/malformed-urn.test.js +61 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/parse.test.js +7 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/query-fragment-normalization.test.js +33 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/reserved-path-normalization.test.js +109 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/scheme-validation.test.js +124 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/security-normalization.test.js +101 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/security.test.js +301 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/urn-full-input.test.js +29 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/websocket-query-preservation.test.js +24 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hasown/CHANGELOG.md +7 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hasown/index.d.ts +0 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hasown/package.json +4 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/client/client.js +30 -16
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/client/utils.js +4 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/context.js +32 -13
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/accepts/accepts.js +36 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/proxy/index.js +4 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/ssg/ssg.js +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/ssg/utils.js +30 -10
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/streaming/sse.js +5 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/hono-base.js +10 -8
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/base.js +44 -23
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/components.js +25 -26
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/context.js +5 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/dom/render.js +2 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/dom/server.js +5 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/hooks/index.js +16 -13
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/intrinsic-element/components.js +3 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/streaming.js +4 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/cache/index.js +103 -8
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/compress/index.js +5 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/cors/index.js +17 -14
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/csrf/index.js +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/etag/digest.js +47 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/etag/index.js +7 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/jwk/jwk.js +9 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/jwt/jwt.js +9 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/language/language.js +10 -6
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/method-not-allowed/index.js +90 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/pretty-json/index.js +3 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/secure-headers/secure-headers.js +16 -7
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/request.js +20 -13
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/linear-router/router.js +7 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/pattern-router/router.js +3 -9
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/reg-exp-router/node.js +65 -59
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/reg-exp-router/router.js +71 -128
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/reg-exp-router/trie.js +14 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/trie-router/node.js +47 -70
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/trie-router/router.js +3 -11
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/utils.js +27 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router.js +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/accept.js +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/body.js +21 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/cookie.js +4 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/ipaddr.js +5 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/stream.js +12 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/url.js +19 -11
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/client/client.js +30 -16
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/client/utils.js +4 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/context.js +32 -13
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/accepts/accepts.js +36 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/proxy/index.js +4 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/ssg/ssg.js +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/ssg/utils.js +30 -10
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/streaming/sse.js +5 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/hono-base.js +10 -8
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/base.js +41 -23
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/components.js +26 -27
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/context.js +6 -6
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/dom/render.js +2 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/dom/server.js +5 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/hooks/index.js +16 -13
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/intrinsic-element/components.js +4 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/streaming.js +5 -6
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/cache/index.js +103 -8
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/compress/index.js +5 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/cors/index.js +17 -14
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/csrf/index.js +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/etag/digest.js +47 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/etag/index.js +7 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/jwk/jwk.js +9 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/jwt/jwt.js +9 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/language/language.js +10 -6
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/method-not-allowed/index.js +68 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/pretty-json/index.js +3 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/secure-headers/secure-headers.js +16 -7
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/request.js +21 -14
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/linear-router/router.js +7 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/pattern-router/router.js +3 -9
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/reg-exp-router/node.js +61 -58
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/reg-exp-router/router.js +77 -129
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/reg-exp-router/trie.js +14 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/trie-router/node.js +47 -70
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/trie-router/router.js +3 -11
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/utils.js +5 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router.js +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/adapter/aws-lambda/types.d.ts +9 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/client/types.d.ts +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/context.d.ts +6 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/hono-base.d.ts +4 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/base.d.ts +7 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/dom/index.d.ts +5 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/dom/intrinsic-element/components.d.ts +2 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/dom/server.d.ts +5 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/hooks/index.d.ts +8 -6
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/index.d.ts +5 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/cache/index.d.ts +6 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/combine/index.d.ts +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/cors/index.d.ts +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/jsx-renderer/index.d.ts +2 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/jwk/jwk.d.ts +2 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/jwt/jwt.d.ts +2 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/method-not-allowed/index.d.ts +49 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/secure-headers/permissions-policy.d.ts +3 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/reg-exp-router/node.d.ts +4 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/reg-exp-router/trie.d.ts +2 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/trie-router/node.d.ts +1 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/trie-router/router.d.ts +0 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/utils.d.ts +1 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router.d.ts +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/utils/headers.d.ts +2 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/utils/url.d.ts +5 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/accept.js +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/body.js +21 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/cookie.js +5 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/ipaddr.js +5 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/stream.js +12 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/url.js +17 -10
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/package.json +11 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/README.md +173 -143
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/address-error.d.ts +11 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/address-error.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/common.d.ts +49 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/common.js +79 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/common.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv4.d.ts +78 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv4.js +119 -24
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv4.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv6.d.ts +151 -10
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv6.js +316 -90
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv6.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v4/constants.d.ts +12 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v4/constants.js +45 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v4/constants.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v6/constants.d.ts +14 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v6/constants.js +50 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v6/constants.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/package.json +6 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/.github/THREAT_MODEL.md +3 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/CHANGELOG.md +26 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/README.md +19 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/dist/qs.js +25 -25
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/eslint.config.mjs +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/lib/parse.js +16 -6
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/lib/stringify.js +23 -8
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/lib/utils.js +57 -11
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/package.json +8 -7
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/test/parse.js +419 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/test/stringify.js +317 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/test/utils.js +206 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/CHANGELOG.md +10 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/README.md +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/index.js +5 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/package.json +10 -10
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/test/index.js +16 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/index.js +8 -18
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/LICENSE +22 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/README.md +71 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/dist/index.d.ts +46 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/dist/index.js +176 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/dist/index.js.map +1 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/package.json +52 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/package.json +9 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/package-lock.json +72 -41
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/.package-lock.json +6 -6
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/brace-expansion/README.md +23 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/brace-expansion/index.js +265 -86
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/brace-expansion/package.json +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/README.md +173 -143
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/address-error.d.ts +11 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/address-error.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/common.d.ts +49 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/common.js +79 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/common.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv4.d.ts +78 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv4.js +119 -24
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv4.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv6.d.ts +151 -10
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv6.js +316 -90
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv6.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v4/constants.d.ts +12 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v4/constants.js +45 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v4/constants.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v6/constants.d.ts +14 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v6/constants.js +50 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v6/constants.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/package.json +6 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/package-lock.json +6 -6
- package/node_modules/playwright/node_modules/playwright-core/lib/cli/program.js +18 -9
- package/node_modules/playwright/node_modules/playwright-core/lib/mcpBundleImpl/index.js +47 -47
- package/node_modules/playwright/node_modules/playwright-core/lib/server/codegen/skyramp/jsonlReader.js +3 -0
- package/node_modules/playwright/node_modules/playwright-core/lib/server/recorder/recorderRunner.js +42 -0
- package/node_modules/playwright/node_modules/playwright-core/lib/utilsBundleImpl/index.js +121 -121
- package/node_modules/playwright/node_modules/playwright-core/lib/vite/traceViewer/{index.B7KbSQcC.js → index.BAkLd5DX.js} +1 -1
- package/node_modules/playwright/node_modules/playwright-core/lib/vite/traceViewer/index.html +1 -1
- package/node_modules/playwright/node_modules/playwright-core/package.json +1 -1
- package/node_modules/playwright/node_modules/playwright-core/src/cli/program.ts +31 -9
- package/node_modules/playwright/node_modules/playwright-core/src/server/codegen/skyramp/jsonlReader.ts +1 -0
- package/node_modules/playwright/node_modules/playwright-core/src/server/recorder/recorderRunner.ts +57 -1
- package/node_modules/playwright/package.json +2 -2
- package/package.json +7 -6
- package/plugin/prompts/code-reuse/hand-off.md +30 -0
- package/plugin/prompts/generate-tests/generation.md +1 -1
- package/plugin/prompts/plan-tests.md +14 -14
- package/plugin/prompts/testbot-task1.md +4 -2
- package/plugin/skills/enhance-assertions/SKILL.md +25 -0
- package/plugin/skills/enhance-assertions/reference/contract.md +51 -0
- package/plugin/skills/enhance-assertions/reference/integration.md +58 -0
- package/plugin/skills/enhance-assertions/reference/shared-rules.md +220 -0
- package/plugin/skills/enhance-assertions/reference/ui.md +373 -0
- package/plugin/skills/fix-test-import-errors/SKILL.md +44 -50
- package/plugin/skills/validate-assertion-alignment-post-execution/SKILL.md +32 -0
- package/plugin/skills/validate-assertion-alignment-post-execution/reference/checks.md +44 -0
- package/plugin/skills/validate-assertion-alignment-post-execution/reference/evidence.md +47 -0
- package/build/prompts/enhance-assertions/contractProviderAssertionsPrompt.d.ts +0 -2
- package/build/prompts/enhance-assertions/contractProviderAssertionsPrompt.js +0 -29
- package/build/prompts/enhance-assertions/integrationAssertionsPrompt.d.ts +0 -2
- package/build/prompts/enhance-assertions/integrationAssertionsPrompt.js +0 -36
- package/build/prompts/enhance-assertions/sharedAssertionRules.d.ts +0 -16
- package/build/prompts/enhance-assertions/sharedAssertionRules.js +0 -284
- package/build/prompts/enhance-assertions/uiAssertionsPrompt.d.ts +0 -2
- package/build/prompts/enhance-assertions/uiAssertionsPrompt.js +0 -388
- 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;
|