playwright-intelligence-engine 0.0.0-stage → 2.0.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/LICENSE +191 -0
- package/README.md +229 -3
- package/bin/pw-intel.js +37 -0
- package/dist/authoring/author.d.ts +83 -0
- package/dist/authoring/author.d.ts.map +1 -0
- package/dist/authoring/generation-contract.d.ts +90 -0
- package/dist/authoring/generation-contract.d.ts.map +1 -0
- package/dist/authoring/hybrid-author.d.ts +6 -0
- package/dist/authoring/hybrid-author.d.ts.map +1 -0
- package/dist/authoring/index.d.ts +7 -0
- package/dist/authoring/index.d.ts.map +1 -0
- package/dist/authoring/llm-author.d.ts +28 -0
- package/dist/authoring/llm-author.d.ts.map +1 -0
- package/dist/authoring/naming/index.d.ts +4 -0
- package/dist/authoring/naming/index.d.ts.map +1 -0
- package/dist/authoring/naming/name-plan.d.ts +45 -0
- package/dist/authoring/naming/name-plan.d.ts.map +1 -0
- package/dist/authoring/naming/name-planner.d.ts +25 -0
- package/dist/authoring/naming/name-planner.d.ts.map +1 -0
- package/dist/authoring/naming/naming-linter.d.ts +20 -0
- package/dist/authoring/naming/naming-linter.d.ts.map +1 -0
- package/dist/authoring/template-author.d.ts +6 -0
- package/dist/authoring/template-author.d.ts.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/collectors/collector-interface.d.ts +7 -0
- package/dist/collectors/collector-interface.d.ts.map +1 -0
- package/dist/collectors/environment-collector.d.ts +12 -0
- package/dist/collectors/environment-collector.d.ts.map +1 -0
- package/dist/collectors/error-collector.d.ts +18 -0
- package/dist/collectors/error-collector.d.ts.map +1 -0
- package/dist/collectors/git-diff-collector.d.ts +20 -0
- package/dist/collectors/git-diff-collector.d.ts.map +1 -0
- package/dist/collectors/live-browser-collector.d.ts +45 -0
- package/dist/collectors/live-browser-collector.d.ts.map +1 -0
- package/dist/collectors/network-collector.d.ts +28 -0
- package/dist/collectors/network-collector.d.ts.map +1 -0
- package/dist/collectors/static-ast-collector.d.ts +32 -0
- package/dist/collectors/static-ast-collector.d.ts.map +1 -0
- package/dist/collectors/trace-collector.d.ts +12 -0
- package/dist/collectors/trace-collector.d.ts.map +1 -0
- package/dist/config/project-config.d.ts +33 -0
- package/dist/config/project-config.d.ts.map +1 -0
- package/dist/core/errors/engine-errors.d.ts +34 -0
- package/dist/core/errors/engine-errors.d.ts.map +1 -0
- package/dist/core/types/diagnostic-context.d.ts +151 -0
- package/dist/core/types/diagnostic-context.d.ts.map +1 -0
- package/dist/core/types/repair-evidence.d.ts +56 -0
- package/dist/core/types/repair-evidence.d.ts.map +1 -0
- package/dist/core/version.d.ts +13 -0
- package/dist/core/version.d.ts.map +1 -0
- package/dist/diagnostics/diagnostic-contract.d.ts +52 -0
- package/dist/diagnostics/diagnostic-contract.d.ts.map +1 -0
- package/dist/diagnostics/diagnostic-report.d.ts +11 -0
- package/dist/diagnostics/diagnostic-report.d.ts.map +1 -0
- package/dist/diagnostics/evidence-correlator.d.ts +22 -0
- package/dist/diagnostics/evidence-correlator.d.ts.map +1 -0
- package/dist/diagnostics/external-failure-evidence.d.ts +18 -0
- package/dist/diagnostics/external-failure-evidence.d.ts.map +1 -0
- package/dist/diagnostics/failure-category.d.ts +4 -0
- package/dist/diagnostics/failure-category.d.ts.map +1 -0
- package/dist/diagnostics/failure-classifier.d.ts +58 -0
- package/dist/diagnostics/failure-classifier.d.ts.map +1 -0
- package/dist/evaluation/evaluation-scorecard.d.ts +72 -0
- package/dist/evaluation/evaluation-scorecard.d.ts.map +1 -0
- package/dist/evaluation/repository-inspector.d.ts +21 -0
- package/dist/evaluation/repository-inspector.d.ts.map +1 -0
- package/dist/evaluation/repository-runner.d.ts +24 -0
- package/dist/evaluation/repository-runner.d.ts.map +1 -0
- package/dist/evidence/evidence-model.d.ts +88 -0
- package/dist/evidence/evidence-model.d.ts.map +1 -0
- package/dist/evidence/evidence-normalizer.d.ts +19 -0
- package/dist/evidence/evidence-normalizer.d.ts.map +1 -0
- package/dist/evidence/evidence-redactor.d.ts +37 -0
- package/dist/evidence/evidence-redactor.d.ts.map +1 -0
- package/dist/framework/config-adapter.d.ts +28 -0
- package/dist/framework/config-adapter.d.ts.map +1 -0
- package/dist/gate/index.d.ts +21 -0
- package/dist/gate/index.d.ts.map +1 -0
- package/dist/gate/oracle.d.ts +26 -0
- package/dist/gate/oracle.d.ts.map +1 -0
- package/dist/gate/quality.d.ts +27 -0
- package/dist/gate/quality.d.ts.map +1 -0
- package/dist/gate/safety.d.ts +28 -0
- package/dist/gate/safety.d.ts.map +1 -0
- package/dist/generator/architecture-generator.d.ts +55 -0
- package/dist/generator/architecture-generator.d.ts.map +1 -0
- package/dist/generator/assertion-quality-gate.d.ts +18 -0
- package/dist/generator/assertion-quality-gate.d.ts.map +1 -0
- package/dist/generator/candidate-writer.d.ts +34 -0
- package/dist/generator/candidate-writer.d.ts.map +1 -0
- package/dist/generator/test-generator.d.ts +26 -0
- package/dist/generator/test-generator.d.ts.map +1 -0
- package/dist/governance/audit-log.d.ts +23 -0
- package/dist/governance/audit-log.d.ts.map +1 -0
- package/dist/governance/governance-policy.d.ts +24 -0
- package/dist/governance/governance-policy.d.ts.map +1 -0
- package/dist/governance/team-dashboard.d.ts +51 -0
- package/dist/governance/team-dashboard.d.ts.map +1 -0
- package/dist/governance/workflow-audit.d.ts +13 -0
- package/dist/governance/workflow-audit.d.ts.map +1 -0
- package/dist/index.d.ts +90 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20318 -0
- package/dist/integrations/ci-summary.d.ts +14 -0
- package/dist/integrations/ci-summary.d.ts.map +1 -0
- package/dist/integrations/playwright-report-adapter.d.ts +22 -0
- package/dist/integrations/playwright-report-adapter.d.ts.map +1 -0
- package/dist/integrations/quality-gate.d.ts +35 -0
- package/dist/integrations/quality-gate.d.ts.map +1 -0
- package/dist/integrations/sarif-report.d.ts +48 -0
- package/dist/integrations/sarif-report.d.ts.map +1 -0
- package/dist/intelligence/autonomous-repair-workflow.d.ts +31 -0
- package/dist/intelligence/autonomous-repair-workflow.d.ts.map +1 -0
- package/dist/intelligence/business-intent.d.ts +58 -0
- package/dist/intelligence/business-intent.d.ts.map +1 -0
- package/dist/intelligence/evidence-bundle.d.ts +364 -0
- package/dist/intelligence/evidence-bundle.d.ts.map +1 -0
- package/dist/intelligence/failure-clustering.d.ts +38 -0
- package/dist/intelligence/failure-clustering.d.ts.map +1 -0
- package/dist/intelligence/generation-agent.d.ts +120 -0
- package/dist/intelligence/generation-agent.d.ts.map +1 -0
- package/dist/intelligence/generation-verifier.d.ts +151 -0
- package/dist/intelligence/generation-verifier.d.ts.map +1 -0
- package/dist/intelligence/llm-proposal.d.ts +377 -0
- package/dist/intelligence/llm-proposal.d.ts.map +1 -0
- package/dist/intelligence/locator-disambiguation-engine.d.ts +38 -0
- package/dist/intelligence/locator-disambiguation-engine.d.ts.map +1 -0
- package/dist/intelligence/model-contract.d.ts +86 -0
- package/dist/intelligence/model-contract.d.ts.map +1 -0
- package/dist/intelligence/model-provider.d.ts +75 -0
- package/dist/intelligence/model-provider.d.ts.map +1 -0
- package/dist/intelligence/project-intelligence.d.ts +22 -0
- package/dist/intelligence/project-intelligence.d.ts.map +1 -0
- package/dist/intelligence/repair-agent.d.ts +46 -0
- package/dist/intelligence/repair-agent.d.ts.map +1 -0
- package/dist/intelligence/repository-profile.d.ts +131 -0
- package/dist/intelligence/repository-profile.d.ts.map +1 -0
- package/dist/intelligence/suite-intelligence.d.ts +59 -0
- package/dist/intelligence/suite-intelligence.d.ts.map +1 -0
- package/dist/intelligence/test-intelligence.d.ts +44 -0
- package/dist/intelligence/test-intelligence.d.ts.map +1 -0
- package/dist/intelligence/trace-proposal-workflow.d.ts +30 -0
- package/dist/intelligence/trace-proposal-workflow.d.ts.map +1 -0
- package/dist/intelligence/verified-llm-repair-workflow.d.ts +21 -0
- package/dist/intelligence/verified-llm-repair-workflow.d.ts.map +1 -0
- package/dist/intelligence/workflow-planner.d.ts +278 -0
- package/dist/intelligence/workflow-planner.d.ts.map +1 -0
- package/dist/mcp/server.d.ts +32 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/memory/stability-ledger.d.ts +46 -0
- package/dist/memory/stability-ledger.d.ts.map +1 -0
- package/dist/perception/app-model.d.ts +55 -0
- package/dist/perception/app-model.d.ts.map +1 -0
- package/dist/perception/crawler.d.ts +18 -0
- package/dist/perception/crawler.d.ts.map +1 -0
- package/dist/perception/index.d.ts +3 -0
- package/dist/perception/index.d.ts.map +1 -0
- package/dist/repair/approval-service.d.ts +139 -0
- package/dist/repair/approval-service.d.ts.map +1 -0
- package/dist/repair/assertion-hasher.d.ts +62 -0
- package/dist/repair/assertion-hasher.d.ts.map +1 -0
- package/dist/repair/ast-patcher.d.ts +36 -0
- package/dist/repair/ast-patcher.d.ts.map +1 -0
- package/dist/repair/browser-operation-executor.d.ts +27 -0
- package/dist/repair/browser-operation-executor.d.ts.map +1 -0
- package/dist/repair/diff-allowlist.d.ts +74 -0
- package/dist/repair/diff-allowlist.d.ts.map +1 -0
- package/dist/repair/intent-validator.d.ts +157 -0
- package/dist/repair/intent-validator.d.ts.map +1 -0
- package/dist/repair/repair-operations.d.ts +40 -0
- package/dist/repair/repair-operations.d.ts.map +1 -0
- package/dist/repair/repair-planner.d.ts +98 -0
- package/dist/repair/repair-planner.d.ts.map +1 -0
- package/dist/repair/repair-workflow.d.ts +42 -0
- package/dist/repair/repair-workflow.d.ts.map +1 -0
- package/dist/repair/safe-operation-compiler.d.ts +15 -0
- package/dist/repair/safe-operation-compiler.d.ts.map +1 -0
- package/dist/repair/source-mapper.d.ts +19 -0
- package/dist/repair/source-mapper.d.ts.map +1 -0
- package/dist/repair/statement-patcher.d.ts +75 -0
- package/dist/repair/statement-patcher.d.ts.map +1 -0
- package/dist/repair/verification-gates.d.ts +25 -0
- package/dist/repair/verification-gates.d.ts.map +1 -0
- package/dist/repair/workflow-plan.d.ts +35 -0
- package/dist/repair/workflow-plan.d.ts.map +1 -0
- package/dist/repair/workspace-promoter.d.ts +43 -0
- package/dist/repair/workspace-promoter.d.ts.map +1 -0
- package/dist/reproduce/diagnostic-rerunner.d.ts +40 -0
- package/dist/reproduce/diagnostic-rerunner.d.ts.map +1 -0
- package/dist/reproduce/direct-browser-investigator.d.ts +41 -0
- package/dist/reproduce/direct-browser-investigator.d.ts.map +1 -0
- package/dist/reproduce/interactive-workflow-runner.d.ts +43 -0
- package/dist/reproduce/interactive-workflow-runner.d.ts.map +1 -0
- package/dist/sandbox/dependency-strategy.d.ts +45 -0
- package/dist/sandbox/dependency-strategy.d.ts.map +1 -0
- package/dist/sandbox/execution-runner.d.ts +81 -0
- package/dist/sandbox/execution-runner.d.ts.map +1 -0
- package/dist/sandbox/worktree-manager.d.ts +51 -0
- package/dist/sandbox/worktree-manager.d.ts.map +1 -0
- package/dist/selector/abstention-policy.d.ts +34 -0
- package/dist/selector/abstention-policy.d.ts.map +1 -0
- package/dist/selector/candidate-extractor.d.ts +71 -0
- package/dist/selector/candidate-extractor.d.ts.map +1 -0
- package/dist/selector/live-locator-verifier.d.ts +28 -0
- package/dist/selector/live-locator-verifier.d.ts.map +1 -0
- package/dist/selector/repair-candidate-ranker.d.ts +10 -0
- package/dist/selector/repair-candidate-ranker.d.ts.map +1 -0
- package/dist/selector/selector-scorer.d.ts +43 -0
- package/dist/selector/selector-scorer.d.ts.map +1 -0
- package/dist/trace/adapters/adapter-registry.d.ts +18 -0
- package/dist/trace/adapters/adapter-registry.d.ts.map +1 -0
- package/dist/trace/adapters/trace-adapter.d.ts +21 -0
- package/dist/trace/adapters/trace-adapter.d.ts.map +1 -0
- package/dist/trace/adapters/unknown-adapter.d.ts +10 -0
- package/dist/trace/adapters/unknown-adapter.d.ts.map +1 -0
- package/dist/trace/adapters/v10-adapter.d.ts +10 -0
- package/dist/trace/adapters/v10-adapter.d.ts.map +1 -0
- package/dist/trace/adapters/v4-adapter.d.ts +11 -0
- package/dist/trace/adapters/v4-adapter.d.ts.map +1 -0
- package/dist/trace/adapters/v8-adapter.d.ts +10 -0
- package/dist/trace/adapters/v8-adapter.d.ts.map +1 -0
- package/dist/trace/adapters/v9-adapter.d.ts +10 -0
- package/dist/trace/adapters/v9-adapter.d.ts.map +1 -0
- package/dist/trace/archive-reader.d.ts +44 -0
- package/dist/trace/archive-reader.d.ts.map +1 -0
- package/dist/trace/snapshot-resolver.d.ts +55 -0
- package/dist/trace/snapshot-resolver.d.ts.map +1 -0
- package/dist/trace/trace-parser.d.ts +50 -0
- package/dist/trace/trace-parser.d.ts.map +1 -0
- package/dist/trace/version-detector.d.ts +20 -0
- package/dist/trace/version-detector.d.ts.map +1 -0
- package/package.json +76 -6
- package/skills/README.md +20 -0
- package/skills/pie-failure-investigation/SKILL.md +16 -0
- package/skills/pie-quality-engineer/SKILL.md +66 -0
- package/skills/pie-release-readiness/SKILL.md +22 -0
- package/skills/pie-repair-review/SKILL.md +21 -0
- package/skills/pie-trace-to-repair/SKILL.md +35 -0
- package/src/authoring/author.ts +81 -0
- package/src/authoring/generation-contract.ts +283 -0
- package/src/authoring/hybrid-author.ts +115 -0
- package/src/authoring/index.ts +7 -0
- package/src/authoring/llm-author.ts +282 -0
- package/src/authoring/naming/index.ts +4 -0
- package/src/authoring/naming/name-plan.ts +28 -0
- package/src/authoring/naming/name-planner.ts +339 -0
- package/src/authoring/naming/naming-linter.ts +292 -0
- package/src/authoring/template-author.ts +39 -0
- package/src/cli/index.ts +1172 -0
- package/src/collectors/collector-interface.ts +8 -0
- package/src/collectors/environment-collector.ts +103 -0
- package/src/collectors/error-collector.ts +177 -0
- package/src/collectors/git-diff-collector.ts +190 -0
- package/src/collectors/live-browser-collector.ts +412 -0
- package/src/collectors/network-collector.ts +90 -0
- package/src/collectors/static-ast-collector.ts +226 -0
- package/src/collectors/trace-collector.ts +66 -0
- package/src/config/project-config.ts +114 -0
- package/src/core/errors/engine-errors.ts +90 -0
- package/src/core/types/diagnostic-context.ts +94 -0
- package/src/core/types/repair-evidence.ts +45 -0
- package/src/core/version.ts +25 -0
- package/src/diagnostics/diagnostic-contract.ts +79 -0
- package/src/diagnostics/diagnostic-report.ts +204 -0
- package/src/diagnostics/evidence-correlator.ts +117 -0
- package/src/diagnostics/external-failure-evidence.ts +72 -0
- package/src/diagnostics/failure-category.ts +40 -0
- package/src/diagnostics/failure-classifier.ts +701 -0
- package/src/evaluation/evaluation-scorecard.ts +198 -0
- package/src/evaluation/repository-inspector.ts +143 -0
- package/src/evaluation/repository-runner.ts +197 -0
- package/src/evidence/evidence-model.ts +76 -0
- package/src/evidence/evidence-normalizer.ts +322 -0
- package/src/evidence/evidence-redactor.ts +218 -0
- package/src/framework/config-adapter.ts +131 -0
- package/src/gate/index.ts +43 -0
- package/src/gate/oracle.ts +69 -0
- package/src/gate/quality.ts +101 -0
- package/src/gate/safety.ts +94 -0
- package/src/generator/architecture-generator.ts +582 -0
- package/src/generator/assertion-quality-gate.ts +88 -0
- package/src/generator/candidate-writer.ts +288 -0
- package/src/generator/test-generator.ts +52 -0
- package/src/governance/audit-log.ts +115 -0
- package/src/governance/governance-policy.ts +72 -0
- package/src/governance/team-dashboard.ts +189 -0
- package/src/governance/workflow-audit.ts +72 -0
- package/src/index.ts +107 -0
- package/src/integrations/ci-summary.ts +37 -0
- package/src/integrations/playwright-report-adapter.ts +173 -0
- package/src/integrations/quality-gate.ts +95 -0
- package/src/integrations/sarif-report.ts +110 -0
- package/src/intelligence/autonomous-repair-workflow.ts +139 -0
- package/src/intelligence/business-intent.ts +163 -0
- package/src/intelligence/evidence-bundle.ts +300 -0
- package/src/intelligence/failure-clustering.ts +134 -0
- package/src/intelligence/generation-agent.ts +561 -0
- package/src/intelligence/generation-verifier.ts +1115 -0
- package/src/intelligence/llm-proposal.ts +519 -0
- package/src/intelligence/locator-disambiguation-engine.ts +331 -0
- package/src/intelligence/model-contract.ts +205 -0
- package/src/intelligence/model-provider.ts +348 -0
- package/src/intelligence/project-intelligence.ts +140 -0
- package/src/intelligence/repair-agent.ts +297 -0
- package/src/intelligence/repository-profile.ts +796 -0
- package/src/intelligence/suite-intelligence.ts +305 -0
- package/src/intelligence/test-intelligence.ts +136 -0
- package/src/intelligence/trace-proposal-workflow.ts +318 -0
- package/src/intelligence/verified-llm-repair-workflow.ts +48 -0
- package/src/intelligence/workflow-planner.ts +966 -0
- package/src/mcp/server.ts +970 -0
- package/src/memory/stability-ledger.ts +243 -0
- package/src/perception/app-model.ts +32 -0
- package/src/perception/crawler.ts +263 -0
- package/src/perception/index.ts +3 -0
- package/src/repair/approval-service.ts +541 -0
- package/src/repair/assertion-hasher.ts +386 -0
- package/src/repair/ast-patcher.ts +223 -0
- package/src/repair/browser-operation-executor.ts +263 -0
- package/src/repair/diff-allowlist.ts +612 -0
- package/src/repair/intent-validator.ts +761 -0
- package/src/repair/repair-operations.ts +65 -0
- package/src/repair/repair-planner.ts +467 -0
- package/src/repair/repair-workflow.ts +241 -0
- package/src/repair/safe-operation-compiler.ts +68 -0
- package/src/repair/source-mapper.ts +156 -0
- package/src/repair/statement-patcher.ts +544 -0
- package/src/repair/verification-gates.ts +46 -0
- package/src/repair/workflow-plan.ts +59 -0
- package/src/repair/workspace-promoter.ts +313 -0
- package/src/reproduce/diagnostic-rerunner.ts +287 -0
- package/src/reproduce/direct-browser-investigator.ts +208 -0
- package/src/reproduce/interactive-workflow-runner.ts +828 -0
- package/src/sandbox/dependency-strategy.ts +215 -0
- package/src/sandbox/execution-runner.ts +408 -0
- package/src/sandbox/worktree-manager.ts +287 -0
- package/src/selector/abstention-policy.ts +175 -0
- package/src/selector/candidate-extractor.ts +343 -0
- package/src/selector/live-locator-verifier.ts +139 -0
- package/src/selector/repair-candidate-ranker.ts +92 -0
- package/src/selector/selector-scorer.ts +344 -0
- package/src/trace/adapters/adapter-registry.ts +49 -0
- package/src/trace/adapters/trace-adapter.ts +28 -0
- package/src/trace/adapters/unknown-adapter.ts +50 -0
- package/src/trace/adapters/v10-adapter.ts +39 -0
- package/src/trace/adapters/v4-adapter.ts +31 -0
- package/src/trace/adapters/v8-adapter.ts +42 -0
- package/src/trace/adapters/v9-adapter.ts +39 -0
- package/src/trace/archive-reader.ts +246 -0
- package/src/trace/snapshot-resolver.ts +308 -0
- package/src/trace/trace-parser.ts +467 -0
- package/src/trace/version-detector.ts +81 -0
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { LocatorPlan } from '../selector/candidate-extractor.js';
|
|
2
|
+
import { LiveLocatorVerifier, LiveVerificationResult } from '../selector/live-locator-verifier.js';
|
|
3
|
+
import { RepairOperation, validateRepairOperation } from './repair-operations.js';
|
|
4
|
+
import { compileSafeRepairOperation } from './safe-operation-compiler.js';
|
|
5
|
+
|
|
6
|
+
export type BrowserOperationStatus = 'VERIFIED' | 'FAILED' | 'ABSTAINED';
|
|
7
|
+
|
|
8
|
+
export interface BrowserOperationExecutionInput {
|
|
9
|
+
pageOrFrame: any;
|
|
10
|
+
operation: unknown;
|
|
11
|
+
targetPlan?: LocatorPlan | undefined;
|
|
12
|
+
replacementPlan?: LocatorPlan | undefined;
|
|
13
|
+
overlayPlan?: LocatorPlan | undefined;
|
|
14
|
+
allowInteraction?: boolean | undefined;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface BrowserOperationExecutionResult {
|
|
18
|
+
status: BrowserOperationStatus;
|
|
19
|
+
kind: RepairOperation['kind'];
|
|
20
|
+
action: 'verify' | 'click' | 'none';
|
|
21
|
+
verification?: LiveVerificationResult | undefined;
|
|
22
|
+
evidence: string[];
|
|
23
|
+
reason?: string | undefined;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function failed(kind: RepairOperation['kind'], action: BrowserOperationExecutionResult['action'], reason: string): BrowserOperationExecutionResult {
|
|
27
|
+
return { status: 'FAILED', kind, action, evidence: [], reason };
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function abstained(kind: RepairOperation['kind'], reason: string): BrowserOperationExecutionResult {
|
|
31
|
+
return { status: 'ABSTAINED', kind, action: 'none', evidence: [], reason };
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async function verifyPlan(pageOrFrame: any, kind: RepairOperation['kind'], plan: LocatorPlan, label: string): Promise<BrowserOperationExecutionResult> {
|
|
35
|
+
const verification = await LiveLocatorVerifier.verify(pageOrFrame, plan);
|
|
36
|
+
if (!verification.isUnique || !verification.isVisible || !verification.isEnabled) {
|
|
37
|
+
return {
|
|
38
|
+
status: 'FAILED',
|
|
39
|
+
kind,
|
|
40
|
+
action: 'verify',
|
|
41
|
+
verification,
|
|
42
|
+
evidence: [`${label} locator: ${verification.expression}`, `Matches: ${verification.count}`, `Visible: ${verification.isVisible}`, `Enabled: ${verification.isEnabled}`],
|
|
43
|
+
reason: verification.reason ?? `${label} locator is not unique and actionable`,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
status: 'VERIFIED',
|
|
48
|
+
kind,
|
|
49
|
+
action: 'verify',
|
|
50
|
+
verification,
|
|
51
|
+
evidence: [`${label} locator verified uniquely and actionable`, `Expression: ${verification.expression}`],
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async function executeStableWaitOperation(
|
|
56
|
+
pageOrFrame: any,
|
|
57
|
+
operation: RepairOperation & { kind: 'replace_unstable_wait_with_state_wait' },
|
|
58
|
+
targetPlan: LocatorPlan | undefined,
|
|
59
|
+
): Promise<BrowserOperationExecutionResult> {
|
|
60
|
+
const supportedStates = new Set(['domcontentloaded', 'load', 'networkidle']);
|
|
61
|
+
const supportedSteps = new Set(['target_visible', 'target_enabled']);
|
|
62
|
+
const steps = operation.steps ?? [];
|
|
63
|
+
|
|
64
|
+
if (
|
|
65
|
+
steps.length === 0 ||
|
|
66
|
+
steps.some((step) =>
|
|
67
|
+
(step.startsWith('load_state:') && !supportedStates.has(step.slice('load_state:'.length))) ||
|
|
68
|
+
(!step.startsWith('load_state:') && !supportedSteps.has(step)),
|
|
69
|
+
)
|
|
70
|
+
) {
|
|
71
|
+
return abstained(
|
|
72
|
+
operation.kind,
|
|
73
|
+
'Only load_state:domcontentloaded, load_state:load, load_state:networkidle, target_visible, and target_enabled steps are executable',
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const requiresTarget = steps.some((step) => supportedSteps.has(step));
|
|
78
|
+
if (requiresTarget && !targetPlan) {
|
|
79
|
+
return abstained(operation.kind, 'A typed targetPlan is required for target state waits');
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const evidence: string[] = [];
|
|
83
|
+
try {
|
|
84
|
+
for (const step of steps) {
|
|
85
|
+
if (step.startsWith('load_state:')) {
|
|
86
|
+
const state = step.slice('load_state:'.length);
|
|
87
|
+
if (typeof pageOrFrame.waitForLoadState !== 'function') {
|
|
88
|
+
return failed(operation.kind, 'verify', 'Page does not expose waitForLoadState()');
|
|
89
|
+
}
|
|
90
|
+
await pageOrFrame.waitForLoadState(state);
|
|
91
|
+
evidence.push(`Load state reached: ${state}`);
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const locator = LiveLocatorVerifier.locate(pageOrFrame, targetPlan!);
|
|
96
|
+
if (typeof locator.waitFor === 'function') {
|
|
97
|
+
await locator.waitFor({ state: 'visible', timeout: 5000 });
|
|
98
|
+
}
|
|
99
|
+
const verification = await LiveLocatorVerifier.verify(pageOrFrame, targetPlan!);
|
|
100
|
+
if (!verification.isUnique || !verification.isVisible || (step === 'target_enabled' && !verification.isEnabled)) {
|
|
101
|
+
return {
|
|
102
|
+
status: 'FAILED',
|
|
103
|
+
kind: operation.kind,
|
|
104
|
+
action: 'verify',
|
|
105
|
+
verification,
|
|
106
|
+
evidence,
|
|
107
|
+
reason: verification.reason ?? `Target did not satisfy ${step}`,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
evidence.push(`Target state verified: ${step}`);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return { status: 'VERIFIED', kind: operation.kind, action: 'verify', evidence };
|
|
114
|
+
} catch (error) {
|
|
115
|
+
return failed(operation.kind, 'verify', `State wait failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
async function executeComboboxFlowOperation(
|
|
120
|
+
pageOrFrame: any,
|
|
121
|
+
operation: RepairOperation & { kind: 'replace_select_with_combobox_flow' },
|
|
122
|
+
targetPlan: LocatorPlan | undefined,
|
|
123
|
+
allowInteraction: boolean | undefined,
|
|
124
|
+
): Promise<BrowserOperationExecutionResult> {
|
|
125
|
+
const steps = operation.steps ?? [];
|
|
126
|
+
const supportedSteps = new Set(['target_visible', 'target_enabled', 'open']);
|
|
127
|
+
const optionSteps = steps.filter((step) => step.startsWith('option:'));
|
|
128
|
+
const invalid = steps.some((step) => !supportedSteps.has(step) && !step.startsWith('option:'));
|
|
129
|
+
if (steps.length === 0 || invalid || optionSteps.some((step) => step.slice('option:'.length).trim().length === 0)) {
|
|
130
|
+
return abstained(
|
|
131
|
+
operation.kind,
|
|
132
|
+
'Combobox flows allow only target_visible, target_enabled, open, and option:<visible label> steps',
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
if (!targetPlan) return abstained(operation.kind, 'A typed targetPlan is required for combobox verification');
|
|
136
|
+
|
|
137
|
+
const hasInteraction = steps.some((step) => step === 'open' || step.startsWith('option:'));
|
|
138
|
+
if (hasInteraction && allowInteraction !== true) {
|
|
139
|
+
return abstained(operation.kind, 'Combobox interaction requires explicit allowInteraction: true');
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const targetVerification = await LiveLocatorVerifier.verify(pageOrFrame, targetPlan);
|
|
143
|
+
if (!targetVerification.isUnique || !targetVerification.isVisible || !targetVerification.isEnabled) {
|
|
144
|
+
return {
|
|
145
|
+
status: 'FAILED',
|
|
146
|
+
kind: operation.kind,
|
|
147
|
+
action: 'verify',
|
|
148
|
+
verification: targetVerification,
|
|
149
|
+
evidence: [`Combobox target: ${targetVerification.expression}`, `Matches: ${targetVerification.count}`],
|
|
150
|
+
reason: targetVerification.reason ?? 'Combobox target is not unique and actionable',
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const evidence = [`Combobox target verified: ${targetVerification.expression}`];
|
|
155
|
+
const target = LiveLocatorVerifier.locate(pageOrFrame, targetPlan);
|
|
156
|
+
for (const step of steps) {
|
|
157
|
+
if (step === 'target_visible' || step === 'target_enabled') {
|
|
158
|
+
evidence.push(`Combobox target state verified: ${step}`);
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
if (step === 'open') {
|
|
162
|
+
await target.click();
|
|
163
|
+
evidence.push('Combobox opened');
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
const label = step.slice('option:'.length).trim();
|
|
167
|
+
const optionPlan: LocatorPlan = { kind: 'getByRole', role: 'option', options: { name: label, exact: true } };
|
|
168
|
+
const optionVerification = await verifyPlan(pageOrFrame, operation.kind, optionPlan, `Combobox option '${label}'`);
|
|
169
|
+
if (optionVerification.status !== 'VERIFIED') return optionVerification;
|
|
170
|
+
await LiveLocatorVerifier.locate(pageOrFrame, optionPlan).click();
|
|
171
|
+
evidence.push(`Combobox option selected: ${label}`);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return { status: 'VERIFIED', kind: operation.kind, action: hasInteraction ? 'click' : 'verify', evidence };
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Executes only the browser-safe subset of allowlisted repair operations.
|
|
179
|
+
* It accepts typed LocatorPlans rather than evaluating model-generated strings.
|
|
180
|
+
* Source mutation remains a separate AST/worktree/approval lifecycle.
|
|
181
|
+
*/
|
|
182
|
+
export async function executeBrowserOperation(input: BrowserOperationExecutionInput): Promise<BrowserOperationExecutionResult> {
|
|
183
|
+
const validation = validateRepairOperation(input.operation);
|
|
184
|
+
if (!validation.isValid || !validation.operation) {
|
|
185
|
+
return abstained('abstain', validation.reason ?? 'Invalid repair operation');
|
|
186
|
+
}
|
|
187
|
+
const operation = validation.operation;
|
|
188
|
+
if (!input.pageOrFrame) return failed(operation.kind, 'none', 'A live Page or Frame instance is required');
|
|
189
|
+
if (operation.kind === 'abstain') return abstained(operation.kind, operation.reason ?? 'Proposal requested abstention');
|
|
190
|
+
|
|
191
|
+
if (operation.kind === 'replace_locator') {
|
|
192
|
+
if (!input.replacementPlan) return abstained(operation.kind, 'A typed replacementPlan is required for browser verification');
|
|
193
|
+
return verifyPlan(input.pageOrFrame, operation.kind, input.replacementPlan, 'Replacement');
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
if (operation.kind === 'add_frame_scope') {
|
|
197
|
+
if (!input.targetPlan) return abstained(operation.kind, 'A typed targetPlan is required for frame verification');
|
|
198
|
+
const compiled = compileSafeRepairOperation(operation);
|
|
199
|
+
if (compiled.readiness !== 'READY_FOR_ISOLATED_VERIFICATION') return abstained(operation.kind, compiled.reason);
|
|
200
|
+
if (typeof input.pageOrFrame.frameLocator !== 'function') return failed(operation.kind, 'verify', 'Page does not expose frameLocator()');
|
|
201
|
+
const frame = input.pageOrFrame.frameLocator(operation.frameLocator!);
|
|
202
|
+
return verifyPlan(frame, operation.kind, input.targetPlan, 'Frame target');
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
if (operation.kind === 'add_shadow_scope') {
|
|
206
|
+
const compiled = compileSafeRepairOperation(operation);
|
|
207
|
+
if (compiled.readiness !== 'READY_FOR_ISOLATED_VERIFICATION') return abstained(operation.kind, compiled.reason);
|
|
208
|
+
if (typeof input.pageOrFrame.locator !== 'function') return failed(operation.kind, 'verify', 'Page does not expose locator()');
|
|
209
|
+
let scoped = input.pageOrFrame;
|
|
210
|
+
for (const selector of operation.shadowPath!) scoped = scoped.locator(selector);
|
|
211
|
+
const verification = await LiveLocatorVerifier.verify(scoped, { kind: 'locator', selector: '*' });
|
|
212
|
+
if (!verification.isUnique || !verification.isVisible || !verification.isEnabled) {
|
|
213
|
+
return {
|
|
214
|
+
status: 'FAILED',
|
|
215
|
+
kind: operation.kind,
|
|
216
|
+
action: 'verify',
|
|
217
|
+
verification,
|
|
218
|
+
evidence: [`Shadow path: ${operation.shadowPath!.join(' > ')}`, `Matches: ${verification.count}`],
|
|
219
|
+
reason: verification.reason ?? 'Shadow-scoped target is not unique and actionable',
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
return {
|
|
223
|
+
status: 'VERIFIED',
|
|
224
|
+
kind: operation.kind,
|
|
225
|
+
action: 'verify',
|
|
226
|
+
verification,
|
|
227
|
+
evidence: [`Shadow path verified: ${operation.shadowPath!.join(' > ')}`],
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
if (operation.kind === 'dismiss_overlay') {
|
|
232
|
+
if (!input.overlayPlan) return abstained(operation.kind, 'A typed overlayPlan is required for browser execution');
|
|
233
|
+
if (input.allowInteraction !== true) return abstained(operation.kind, 'Overlay interaction requires explicit allowInteraction: true');
|
|
234
|
+
const verification = await verifyPlan(input.pageOrFrame, operation.kind, input.overlayPlan, 'Overlay');
|
|
235
|
+
if (verification.status !== 'VERIFIED' || !verification.verification) return verification;
|
|
236
|
+
const locator = LiveLocatorVerifier.locate(input.pageOrFrame, input.overlayPlan);
|
|
237
|
+
try {
|
|
238
|
+
await locator.click();
|
|
239
|
+
return { ...verification, action: 'click', evidence: [...verification.evidence, 'Overlay dismissal click completed'] };
|
|
240
|
+
} catch (error) {
|
|
241
|
+
return failed(operation.kind, 'click', `Overlay dismissal failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
if (operation.kind === 'replace_unstable_wait_with_state_wait') {
|
|
246
|
+
return executeStableWaitOperation(
|
|
247
|
+
input.pageOrFrame,
|
|
248
|
+
operation as RepairOperation & { kind: 'replace_unstable_wait_with_state_wait' },
|
|
249
|
+
input.targetPlan,
|
|
250
|
+
);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
if (operation.kind === 'replace_select_with_combobox_flow') {
|
|
254
|
+
return executeComboboxFlowOperation(
|
|
255
|
+
input.pageOrFrame,
|
|
256
|
+
operation as RepairOperation & { kind: 'replace_select_with_combobox_flow' },
|
|
257
|
+
input.targetPlan,
|
|
258
|
+
input.allowInteraction,
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
return abstained(operation.kind, `Operation '${operation.kind}' remains proposal-only until its business semantics are explicitly modeled`);
|
|
263
|
+
}
|