@dailephd/my-frontend-observer 0.8.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/CHANGELOG.md +397 -0
- package/LICENSE +21 -0
- package/README.md +255 -0
- package/dist/application/browserCaptureService.d.ts +11 -0
- package/dist/application/browserCaptureService.js +12 -0
- package/dist/application/browserCaptureService.js.map +1 -0
- package/dist/application/comparisonService.d.ts +56 -0
- package/dist/application/comparisonService.js +77 -0
- package/dist/application/comparisonService.js.map +1 -0
- package/dist/application/externalReferencePersistenceService.d.ts +75 -0
- package/dist/application/externalReferencePersistenceService.js +182 -0
- package/dist/application/externalReferencePersistenceService.js.map +1 -0
- package/dist/application/frontendContractEvaluationService.d.ts +49 -0
- package/dist/application/frontendContractEvaluationService.js +112 -0
- package/dist/application/frontendContractEvaluationService.js.map +1 -0
- package/dist/application/frontendContractPersistenceService.d.ts +56 -0
- package/dist/application/frontendContractPersistenceService.js +91 -0
- package/dist/application/frontendContractPersistenceService.js.map +1 -0
- package/dist/application/observationPersistence.d.ts +59 -0
- package/dist/application/observationPersistence.js +79 -0
- package/dist/application/observationPersistence.js.map +1 -0
- package/dist/application/projectCheckService.d.ts +3 -0
- package/dist/application/projectCheckService.js +169 -0
- package/dist/application/projectCheckService.js.map +1 -0
- package/dist/application/projectWorkflowService.d.ts +46 -0
- package/dist/application/projectWorkflowService.js +92 -0
- package/dist/application/projectWorkflowService.js.map +1 -0
- package/dist/application/referenceFidelityEvaluationService.d.ts +28 -0
- package/dist/application/referenceFidelityEvaluationService.js +45 -0
- package/dist/application/referenceFidelityEvaluationService.js.map +1 -0
- package/dist/artifacts/artifactReader.d.ts +19 -0
- package/dist/artifacts/artifactReader.js +36 -0
- package/dist/artifacts/artifactReader.js.map +1 -0
- package/dist/artifacts/artifactWriter.d.ts +25 -0
- package/dist/artifacts/artifactWriter.js +68 -0
- package/dist/artifacts/artifactWriter.js.map +1 -0
- package/dist/artifacts/comparisonArtifactReader.d.ts +18 -0
- package/dist/artifacts/comparisonArtifactReader.js +35 -0
- package/dist/artifacts/comparisonArtifactReader.js.map +1 -0
- package/dist/artifacts/comparisonArtifactWriter.d.ts +41 -0
- package/dist/artifacts/comparisonArtifactWriter.js +67 -0
- package/dist/artifacts/comparisonArtifactWriter.js.map +1 -0
- package/dist/artifacts/externalReferenceArtifactReader.d.ts +18 -0
- package/dist/artifacts/externalReferenceArtifactReader.js +35 -0
- package/dist/artifacts/externalReferenceArtifactReader.js.map +1 -0
- package/dist/artifacts/externalReferenceArtifactWriter.d.ts +44 -0
- package/dist/artifacts/externalReferenceArtifactWriter.js +77 -0
- package/dist/artifacts/externalReferenceArtifactWriter.js.map +1 -0
- package/dist/artifacts/frontendContractArtifactReader.d.ts +24 -0
- package/dist/artifacts/frontendContractArtifactReader.js +47 -0
- package/dist/artifacts/frontendContractArtifactReader.js.map +1 -0
- package/dist/artifacts/frontendContractArtifactWriter.d.ts +34 -0
- package/dist/artifacts/frontendContractArtifactWriter.js +70 -0
- package/dist/artifacts/frontendContractArtifactWriter.js.map +1 -0
- package/dist/artifacts/frontendContractEvaluationArtifactReader.d.ts +17 -0
- package/dist/artifacts/frontendContractEvaluationArtifactReader.js +34 -0
- package/dist/artifacts/frontendContractEvaluationArtifactReader.js.map +1 -0
- package/dist/artifacts/frontendContractEvaluationArtifactWriter.d.ts +32 -0
- package/dist/artifacts/frontendContractEvaluationArtifactWriter.js +58 -0
- package/dist/artifacts/frontendContractEvaluationArtifactWriter.js.map +1 -0
- package/dist/artifacts/types.d.ts +17 -0
- package/dist/artifacts/types.js +2 -0
- package/dist/artifacts/types.js.map +1 -0
- package/dist/browser/chromiumAdapter.d.ts +21 -0
- package/dist/browser/chromiumAdapter.js +204 -0
- package/dist/browser/chromiumAdapter.js.map +1 -0
- package/dist/browser/evidenceCapture.d.ts +62 -0
- package/dist/browser/evidenceCapture.js +500 -0
- package/dist/browser/evidenceCapture.js.map +1 -0
- package/dist/browser/scrollCapture.d.ts +32 -0
- package/dist/browser/scrollCapture.js +163 -0
- package/dist/browser/scrollCapture.js.map +1 -0
- package/dist/browser/types.d.ts +24 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.js +2411 -0
- package/dist/cli.js.map +1 -0
- package/dist/domain/boundedAgentContext.d.ts +226 -0
- package/dist/domain/boundedAgentContext.js +355 -0
- package/dist/domain/boundedAgentContext.js.map +1 -0
- package/dist/domain/boundedAgentContextCorrelation.d.ts +74 -0
- package/dist/domain/boundedAgentContextCorrelation.js +441 -0
- package/dist/domain/boundedAgentContextCorrelation.js.map +1 -0
- package/dist/domain/boundedAgentContextIdentity.d.ts +26 -0
- package/dist/domain/boundedAgentContextIdentity.js +69 -0
- package/dist/domain/boundedAgentContextIdentity.js.map +1 -0
- package/dist/domain/boundedAgentContextProjection.d.ts +71 -0
- package/dist/domain/boundedAgentContextProjection.js +477 -0
- package/dist/domain/boundedAgentContextProjection.js.map +1 -0
- package/dist/domain/comparison.d.ts +220 -0
- package/dist/domain/comparison.js +350 -0
- package/dist/domain/comparison.js.map +1 -0
- package/dist/domain/comparisonEngine.d.ts +76 -0
- package/dist/domain/comparisonEngine.js +734 -0
- package/dist/domain/comparisonEngine.js.map +1 -0
- package/dist/domain/comparisonIdentity.d.ts +13 -0
- package/dist/domain/comparisonIdentity.js +46 -0
- package/dist/domain/comparisonIdentity.js.map +1 -0
- package/dist/domain/completion.d.ts +30 -0
- package/dist/domain/completion.js +22 -0
- package/dist/domain/completion.js.map +1 -0
- package/dist/domain/diagnostics.d.ts +17 -0
- package/dist/domain/diagnostics.js +77 -0
- package/dist/domain/diagnostics.js.map +1 -0
- package/dist/domain/evidence.d.ts +29 -0
- package/dist/domain/evidence.js +59 -0
- package/dist/domain/evidence.js.map +1 -0
- package/dist/domain/explicitState.d.ts +40 -0
- package/dist/domain/explicitState.js +54 -0
- package/dist/domain/explicitState.js.map +1 -0
- package/dist/domain/externalReference.d.ts +158 -0
- package/dist/domain/externalReference.js +167 -0
- package/dist/domain/externalReference.js.map +1 -0
- package/dist/domain/externalReferenceApplicability.d.ts +43 -0
- package/dist/domain/externalReferenceApplicability.js +52 -0
- package/dist/domain/externalReferenceApplicability.js.map +1 -0
- package/dist/domain/externalReferenceCompatibility.d.ts +40 -0
- package/dist/domain/externalReferenceCompatibility.js +48 -0
- package/dist/domain/externalReferenceCompatibility.js.map +1 -0
- package/dist/domain/externalReferenceFidelity.d.ts +171 -0
- package/dist/domain/externalReferenceFidelity.js +419 -0
- package/dist/domain/externalReferenceFidelity.js.map +1 -0
- package/dist/domain/externalReferenceIdentity.d.ts +38 -0
- package/dist/domain/externalReferenceIdentity.js +70 -0
- package/dist/domain/externalReferenceIdentity.js.map +1 -0
- package/dist/domain/externalReferenceImage.d.ts +35 -0
- package/dist/domain/externalReferenceImage.js +160 -0
- package/dist/domain/externalReferenceImage.js.map +1 -0
- package/dist/domain/externalReferenceRegionRelationships.d.ts +63 -0
- package/dist/domain/externalReferenceRegionRelationships.js +98 -0
- package/dist/domain/externalReferenceRegionRelationships.js.map +1 -0
- package/dist/domain/externalReferenceRegions.d.ts +65 -0
- package/dist/domain/externalReferenceRegions.js +105 -0
- package/dist/domain/externalReferenceRegions.js.map +1 -0
- package/dist/domain/externalReferenceRequirementIdentity.d.ts +12 -0
- package/dist/domain/externalReferenceRequirementIdentity.js +35 -0
- package/dist/domain/externalReferenceRequirementIdentity.js.map +1 -0
- package/dist/domain/externalReferenceRequirements.d.ts +215 -0
- package/dist/domain/externalReferenceRequirements.js +401 -0
- package/dist/domain/externalReferenceRequirements.js.map +1 -0
- package/dist/domain/externalReferenceRuntimeBinding.d.ts +146 -0
- package/dist/domain/externalReferenceRuntimeBinding.js +183 -0
- package/dist/domain/externalReferenceRuntimeBinding.js.map +1 -0
- package/dist/domain/frontendContractEvaluation.d.ts +57 -0
- package/dist/domain/frontendContractEvaluation.js +454 -0
- package/dist/domain/frontendContractEvaluation.js.map +1 -0
- package/dist/domain/frontendContractEvaluationArtifact.d.ts +65 -0
- package/dist/domain/frontendContractEvaluationArtifact.js +108 -0
- package/dist/domain/frontendContractEvaluationArtifact.js.map +1 -0
- package/dist/domain/frontendContractIdentity.d.ts +39 -0
- package/dist/domain/frontendContractIdentity.js +70 -0
- package/dist/domain/frontendContractIdentity.js.map +1 -0
- package/dist/domain/frontendContracts.d.ts +188 -0
- package/dist/domain/frontendContracts.js +260 -0
- package/dist/domain/frontendContracts.js.map +1 -0
- package/dist/domain/identity.d.ts +21 -0
- package/dist/domain/identity.js +47 -0
- package/dist/domain/identity.js.map +1 -0
- package/dist/domain/referenceCorrectionIdentity.d.ts +40 -0
- package/dist/domain/referenceCorrectionIdentity.js +77 -0
- package/dist/domain/referenceCorrectionIdentity.js.map +1 -0
- package/dist/domain/referenceCorrectionWorkflow.d.ts +160 -0
- package/dist/domain/referenceCorrectionWorkflow.js +165 -0
- package/dist/domain/referenceCorrectionWorkflow.js.map +1 -0
- package/dist/domain/referenceFidelityProjection.d.ts +65 -0
- package/dist/domain/referenceFidelityProjection.js +135 -0
- package/dist/domain/referenceFidelityProjection.js.map +1 -0
- package/dist/domain/relationships.d.ts +210 -0
- package/dist/domain/relationships.js +352 -0
- package/dist/domain/relationships.js.map +1 -0
- package/dist/domain/schema.d.ts +269 -0
- package/dist/domain/schema.js +442 -0
- package/dist/domain/schema.js.map +1 -0
- package/dist/domain/scrollEvidence.d.ts +51 -0
- package/dist/domain/scrollEvidence.js +134 -0
- package/dist/domain/scrollEvidence.js.map +1 -0
- package/dist/index.d.ts +114 -0
- package/dist/index.js +64 -0
- package/dist/index.js.map +1 -0
- package/dist/projectWorkflow/aliasCatalog.d.ts +21 -0
- package/dist/projectWorkflow/aliasCatalog.js +67 -0
- package/dist/projectWorkflow/aliasCatalog.js.map +1 -0
- package/dist/projectWorkflow/checkAcceptance.d.ts +25 -0
- package/dist/projectWorkflow/checkAcceptance.js +55 -0
- package/dist/projectWorkflow/checkAcceptance.js.map +1 -0
- package/dist/projectWorkflow/checkResult.d.ts +85 -0
- package/dist/projectWorkflow/checkResult.js +101 -0
- package/dist/projectWorkflow/checkResult.js.map +1 -0
- package/dist/projectWorkflow/projectConfig.d.ts +43 -0
- package/dist/projectWorkflow/projectConfig.js +84 -0
- package/dist/projectWorkflow/projectConfig.js.map +1 -0
- package/dist/projectWorkflow/projectDiscovery.d.ts +9 -0
- package/dist/projectWorkflow/projectDiscovery.js +20 -0
- package/dist/projectWorkflow/projectDiscovery.js.map +1 -0
- package/dist/projectWorkflow/projectPaths.d.ts +8 -0
- package/dist/projectWorkflow/projectPaths.js +23 -0
- package/dist/projectWorkflow/projectPaths.js.map +1 -0
- package/dist/request/paths.d.ts +14 -0
- package/dist/request/paths.js +33 -0
- package/dist/request/paths.js.map +1 -0
- package/dist/request/request.d.ts +111 -0
- package/dist/request/request.js +464 -0
- package/dist/request/request.js.map +1 -0
- package/dist/safety/policy.d.ts +14 -0
- package/dist/safety/policy.js +81 -0
- package/dist/safety/policy.js.map +1 -0
- package/dist/viewer/assets/index-CN_yb9Uf.css +1 -0
- package/dist/viewer/assets/index-D98S1_2d.js +9 -0
- package/dist/viewer/icons/icon-192.png +0 -0
- package/dist/viewer/icons/icon-512.png +0 -0
- package/dist/viewer/index.html +15 -0
- package/dist/viewer/manifest.webmanifest +1 -0
- package/dist/viewer/registerSW.js +1 -0
- package/dist/viewer/sw.js +1 -0
- package/dist/viewer/workbox-9c191d2f.js +1 -0
- package/dist/viewerServer/context.d.ts +48 -0
- package/dist/viewerServer/context.js +60 -0
- package/dist/viewerServer/context.js.map +1 -0
- package/dist/viewerServer/evidence/classify.d.ts +59 -0
- package/dist/viewerServer/evidence/classify.js +124 -0
- package/dist/viewerServer/evidence/classify.js.map +1 -0
- package/dist/viewerServer/evidence/comparisonView.d.ts +28 -0
- package/dist/viewerServer/evidence/comparisonView.js +43 -0
- package/dist/viewerServer/evidence/comparisonView.js.map +1 -0
- package/dist/viewerServer/evidence/contextSourceView.d.ts +25 -0
- package/dist/viewerServer/evidence/contextSourceView.js +20 -0
- package/dist/viewerServer/evidence/contextSourceView.js.map +1 -0
- package/dist/viewerServer/evidence/discovery.d.ts +31 -0
- package/dist/viewerServer/evidence/discovery.js +78 -0
- package/dist/viewerServer/evidence/discovery.js.map +1 -0
- package/dist/viewerServer/evidence/evaluationView.d.ts +32 -0
- package/dist/viewerServer/evidence/evaluationView.js +50 -0
- package/dist/viewerServer/evidence/evaluationView.js.map +1 -0
- package/dist/viewerServer/evidence/handles.d.ts +21 -0
- package/dist/viewerServer/evidence/handles.js +43 -0
- package/dist/viewerServer/evidence/handles.js.map +1 -0
- package/dist/viewerServer/evidence/index.d.ts +41 -0
- package/dist/viewerServer/evidence/index.js +82 -0
- package/dist/viewerServer/evidence/index.js.map +1 -0
- package/dist/viewerServer/evidence/limits.d.ts +27 -0
- package/dist/viewerServer/evidence/limits.js +28 -0
- package/dist/viewerServer/evidence/limits.js.map +1 -0
- package/dist/viewerServer/evidence/linkedEvidence.d.ts +43 -0
- package/dist/viewerServer/evidence/linkedEvidence.js +151 -0
- package/dist/viewerServer/evidence/linkedEvidence.js.map +1 -0
- package/dist/viewerServer/evidence/mediaResolver.d.ts +16 -0
- package/dist/viewerServer/evidence/mediaResolver.js +85 -0
- package/dist/viewerServer/evidence/mediaResolver.js.map +1 -0
- package/dist/viewerServer/evidence/observationView.d.ts +29 -0
- package/dist/viewerServer/evidence/observationView.js +46 -0
- package/dist/viewerServer/evidence/observationView.js.map +1 -0
- package/dist/viewerServer/evidence/pathSafety.d.ts +11 -0
- package/dist/viewerServer/evidence/pathSafety.js +31 -0
- package/dist/viewerServer/evidence/pathSafety.js.map +1 -0
- package/dist/viewerServer/evidence/projection.d.ts +55 -0
- package/dist/viewerServer/evidence/projection.js +152 -0
- package/dist/viewerServer/evidence/projection.js.map +1 -0
- package/dist/viewerServer/evidence/referenceView.d.ts +133 -0
- package/dist/viewerServer/evidence/referenceView.js +169 -0
- package/dist/viewerServer/evidence/referenceView.js.map +1 -0
- package/dist/viewerServer/httpServer.d.ts +27 -0
- package/dist/viewerServer/httpServer.js +381 -0
- package/dist/viewerServer/httpServer.js.map +1 -0
- package/dist/viewerServer/openBrowser.d.ts +7 -0
- package/dist/viewerServer/openBrowser.js +32 -0
- package/dist/viewerServer/openBrowser.js.map +1 -0
- package/dist/viewerServer/port.d.ts +16 -0
- package/dist/viewerServer/port.js +19 -0
- package/dist/viewerServer/port.js.map +1 -0
- package/dist/viewerServer/viewerService.d.ts +62 -0
- package/dist/viewerServer/viewerService.js +88 -0
- package/dist/viewerServer/viewerService.js.map +1 -0
- package/docs/ARCHITECTURE.md +1286 -0
- package/docs/CI_CD.md +250 -0
- package/docs/COMMANDS.md +972 -0
- package/docs/CONTRACTS.md +1856 -0
- package/docs/CURRENT_STATE.md +1049 -0
- package/docs/DEVELOPMENT.md +202 -0
- package/docs/DOCUMENTATION_PRESERVATION_POLICY.md +50 -0
- package/docs/PROJECT_DESCRIPTION.md +2221 -0
- package/docs/PROJECT_MILESTONES.md +2526 -0
- package/docs/PROJECT_OVERVIEW.md +150 -0
- package/docs/QUICKSTART.md +83 -0
- package/docs/RELEASE.md +27 -0
- package/docs/ROADMAP.md +641 -0
- package/docs/SECURITY.md +218 -0
- package/docs/WORKFLOWS.md +642 -0
- package/docs/plans/v0.8-implementation-plan.md +655 -0
- package/docs/plans/v0.8.1-cli-usability-patch-plan.md +505 -0
- package/docs/reports/v0.7-bounded-fidelity-context-prompt7.md +243 -0
- package/docs/reports/v0.7-implementation-completeness-documentation-reconciliation.md +497 -0
- package/docs/reports/v0.7-pre-release-readiness.md +337 -0
- package/docs/reports/v0.7-reference-binding-prompt5.md +223 -0
- package/docs/reports/v0.7-reference-compatibility-prompt4.md +234 -0
- package/docs/reports/v0.7-reference-correction-workflow-prompt8.md +222 -0
- package/docs/reports/v0.7-reference-fidelity-prompt6.md +216 -0
- package/docs/reports/v0.7-reference-foundation-prompt1.md +151 -0
- package/docs/reports/v0.7-reference-regions-prompt2.md +195 -0
- package/docs/reports/v0.7-reference-requirements-prompt3.md +217 -0
- package/docs/reports/v0.7-release-prep.md +423 -0
- package/docs/reports/v0.8-binding-fidelity-interaction-batch6.md +279 -0
- package/docs/reports/v0.8-bounded-context-correlation-batch7.md +233 -0
- package/docs/reports/v0.8-comparison-contract-inspection-batch4.md +279 -0
- package/docs/reports/v0.8-evidence-index-readers-batch2.md +247 -0
- package/docs/reports/v0.8-implementation-completeness-documentation-reconciliation.md +741 -0
- package/docs/reports/v0.8-integrated-viewer-acceptance-batch8.md +128 -0
- package/docs/reports/v0.8-observation-svg-inspection-batch3.md +223 -0
- package/docs/reports/v0.8-prerelease-readiness-cross-platform-security-code-rot.md +687 -0
- package/docs/reports/v0.8-reference-candidate-inspection-batch5.md +232 -0
- package/docs/reports/v0.8-viewer-runtime-pwa-batch1.md +278 -0
- package/docs/reports/v0.8.1-check-orchestration-prompt2.md +69 -0
- package/docs/reports/v0.8.1-implementation-completeness-documentation-reconciliation.md +114 -0
- package/docs/reports/v0.8.1-prerelease-readiness-cross-platform-security-code-rot.md +170 -0
- package/docs/reports/v0.8.1-project-workflow-foundation-prompt1.md +66 -0
- package/package.json +58 -0
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
import { orderDiagnostics } from '../domain/diagnostics.js';
|
|
2
|
+
import { classifyUrl } from '../safety/policy.js';
|
|
3
|
+
import { normalizeOutputLocation } from './paths.js';
|
|
4
|
+
import { isValidExplicitStateDimensions } from '../domain/explicitState.js';
|
|
5
|
+
const DEFAULT_VIEWPORT = { width: 1280, height: 720 };
|
|
6
|
+
const DEFAULT_TIMEOUT_MS = 30000;
|
|
7
|
+
const DEFAULT_READINESS_CONDITION = 'load';
|
|
8
|
+
const DEFAULT_READINESS_TIMEOUT_MS = 10000;
|
|
9
|
+
const DEFAULT_OUTPUT_LOCATION = 'observations';
|
|
10
|
+
const VIEWPORT_MIN = 200;
|
|
11
|
+
const VIEWPORT_MAX = 3840;
|
|
12
|
+
const TIMEOUT_MIN_MS = 1000;
|
|
13
|
+
const TIMEOUT_MAX_MS = 120000;
|
|
14
|
+
const READINESS_TIMEOUT_MIN_MS = 500;
|
|
15
|
+
const MAX_TARGETS = 20;
|
|
16
|
+
const TARGET_NAME_RE = /^[A-Za-z0-9_-]{1,64}$/;
|
|
17
|
+
const MAX_SELECTOR_LENGTH = 500;
|
|
18
|
+
const MAX_LOCATORS_PER_TARGET = 5;
|
|
19
|
+
const MAX_ROLE_LENGTH = 64;
|
|
20
|
+
const MAX_ACCESSIBLE_NAME_LENGTH = 200;
|
|
21
|
+
const MAX_ID_VALUE_LENGTH = 200;
|
|
22
|
+
const DATA_ATTRIBUTE_NAME_RE = /^data-[a-z0-9-]{1,64}$/;
|
|
23
|
+
const MAX_DATA_ATTRIBUTE_VALUE_LENGTH = 500;
|
|
24
|
+
const MAX_TEXT_LENGTH = 200;
|
|
25
|
+
const SUPPORTED_SEMANTIC_ELEMENT_TAGS = new Set([
|
|
26
|
+
'header',
|
|
27
|
+
'nav',
|
|
28
|
+
'main',
|
|
29
|
+
'footer',
|
|
30
|
+
'article',
|
|
31
|
+
'section',
|
|
32
|
+
'aside',
|
|
33
|
+
'form',
|
|
34
|
+
'dialog',
|
|
35
|
+
]);
|
|
36
|
+
const SUPPORTED_LOCATOR_KINDS = new Set(['role', 'id', 'data-attribute', 'semantic-element', 'css', 'text']);
|
|
37
|
+
const SUPPORTED_SCROLL_ACTION_KINDS = new Set(['window-scroll-by', 'target-scroll-by']);
|
|
38
|
+
/**
|
|
39
|
+
* Conservative bound for a single controlled-observation scroll action. No
|
|
40
|
+
* existing repository precedent for a scroll-delta magnitude; chosen large
|
|
41
|
+
* enough to reach realistic overflow content (documents/containers well
|
|
42
|
+
* beyond one viewport) while staying far short of a pathological/runaway
|
|
43
|
+
* request - see docs/CONTRACTS.md and tests/unit/request.test.ts.
|
|
44
|
+
*/
|
|
45
|
+
export const SCROLL_DELTA_MAX_ABS = 20000;
|
|
46
|
+
function isPlainObject(value) {
|
|
47
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
48
|
+
}
|
|
49
|
+
function isInRange(value, min, max) {
|
|
50
|
+
return Number.isInteger(value) && value >= min && value <= max;
|
|
51
|
+
}
|
|
52
|
+
function isBoundedString(value, min, max) {
|
|
53
|
+
return typeof value === 'string' && value.length >= min && value.length <= max;
|
|
54
|
+
}
|
|
55
|
+
/** Validates one raw locator object against the frozen v0.2 locator-kind contract. Total: always returns either a valid TargetLocator or a list of every problem found (never throws, never short-circuits). */
|
|
56
|
+
function validateLocator(raw, targetName, index) {
|
|
57
|
+
if (!isPlainObject(raw)) {
|
|
58
|
+
return {
|
|
59
|
+
ok: false,
|
|
60
|
+
diagnostics: [{ code: 'invalid-request', severity: 'error', message: `locator at index ${index} must be an object`, targetName }],
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const kind = raw.kind;
|
|
64
|
+
if (typeof kind !== 'string' || !SUPPORTED_LOCATOR_KINDS.has(kind)) {
|
|
65
|
+
return {
|
|
66
|
+
ok: false,
|
|
67
|
+
diagnostics: [{ code: 'invalid-request', severity: 'error', message: `locator at index ${index} has an unsupported kind`, targetName }],
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
switch (kind) {
|
|
71
|
+
case 'css': {
|
|
72
|
+
if (!isBoundedString(raw.selector, 1, MAX_SELECTOR_LENGTH)) {
|
|
73
|
+
return {
|
|
74
|
+
ok: false,
|
|
75
|
+
diagnostics: [
|
|
76
|
+
{ code: 'invalid-request', severity: 'error', message: `css locator at index ${index} must have a selector 1-${MAX_SELECTOR_LENGTH} characters`, targetName },
|
|
77
|
+
],
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
return { ok: true, locator: { kind: 'css', selector: raw.selector } };
|
|
81
|
+
}
|
|
82
|
+
case 'role': {
|
|
83
|
+
if (!isBoundedString(raw.role, 1, MAX_ROLE_LENGTH)) {
|
|
84
|
+
return {
|
|
85
|
+
ok: false,
|
|
86
|
+
diagnostics: [{ code: 'invalid-request', severity: 'error', message: `role locator at index ${index} must have a role 1-${MAX_ROLE_LENGTH} characters`, targetName }],
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
if (raw.name !== undefined && !isBoundedString(raw.name, 0, MAX_ACCESSIBLE_NAME_LENGTH)) {
|
|
90
|
+
return {
|
|
91
|
+
ok: false,
|
|
92
|
+
diagnostics: [
|
|
93
|
+
{ code: 'invalid-request', severity: 'error', message: `role locator at index ${index} name must be at most ${MAX_ACCESSIBLE_NAME_LENGTH} characters`, targetName },
|
|
94
|
+
],
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
return { ok: true, locator: raw.name === undefined ? { kind: 'role', role: raw.role } : { kind: 'role', role: raw.role, name: raw.name } };
|
|
98
|
+
}
|
|
99
|
+
case 'id': {
|
|
100
|
+
if (!isBoundedString(raw.value, 1, MAX_ID_VALUE_LENGTH)) {
|
|
101
|
+
return {
|
|
102
|
+
ok: false,
|
|
103
|
+
diagnostics: [{ code: 'invalid-request', severity: 'error', message: `id locator at index ${index} must have a value 1-${MAX_ID_VALUE_LENGTH} characters`, targetName }],
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
return { ok: true, locator: { kind: 'id', value: raw.value } };
|
|
107
|
+
}
|
|
108
|
+
case 'data-attribute': {
|
|
109
|
+
if (typeof raw.attribute !== 'string' || !DATA_ATTRIBUTE_NAME_RE.test(raw.attribute)) {
|
|
110
|
+
return {
|
|
111
|
+
ok: false,
|
|
112
|
+
diagnostics: [
|
|
113
|
+
{ code: 'invalid-request', severity: 'error', message: `data-attribute locator at index ${index} must have an attribute matching ^data-[a-z0-9-]{1,64}$`, targetName },
|
|
114
|
+
],
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
if (!isBoundedString(raw.value, 1, MAX_DATA_ATTRIBUTE_VALUE_LENGTH)) {
|
|
118
|
+
return {
|
|
119
|
+
ok: false,
|
|
120
|
+
diagnostics: [
|
|
121
|
+
{
|
|
122
|
+
code: 'invalid-request',
|
|
123
|
+
severity: 'error',
|
|
124
|
+
message: `data-attribute locator at index ${index} must have a value 1-${MAX_DATA_ATTRIBUTE_VALUE_LENGTH} characters`,
|
|
125
|
+
targetName,
|
|
126
|
+
},
|
|
127
|
+
],
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
return { ok: true, locator: { kind: 'data-attribute', attribute: raw.attribute, value: raw.value } };
|
|
131
|
+
}
|
|
132
|
+
case 'semantic-element': {
|
|
133
|
+
if (typeof raw.tag !== 'string' || !SUPPORTED_SEMANTIC_ELEMENT_TAGS.has(raw.tag)) {
|
|
134
|
+
return {
|
|
135
|
+
ok: false,
|
|
136
|
+
diagnostics: [
|
|
137
|
+
{
|
|
138
|
+
code: 'invalid-request',
|
|
139
|
+
severity: 'error',
|
|
140
|
+
message: `semantic-element locator at index ${index} must have a tag in {${[...SUPPORTED_SEMANTIC_ELEMENT_TAGS].join(', ')}}`,
|
|
141
|
+
targetName,
|
|
142
|
+
},
|
|
143
|
+
],
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
return { ok: true, locator: { kind: 'semantic-element', tag: raw.tag } };
|
|
147
|
+
}
|
|
148
|
+
case 'text': {
|
|
149
|
+
if (!isBoundedString(raw.text, 1, MAX_TEXT_LENGTH)) {
|
|
150
|
+
return {
|
|
151
|
+
ok: false,
|
|
152
|
+
diagnostics: [{ code: 'invalid-request', severity: 'error', message: `text locator at index ${index} must have text 1-${MAX_TEXT_LENGTH} characters`, targetName }],
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
return { ok: true, locator: { kind: 'text', text: raw.text } };
|
|
156
|
+
}
|
|
157
|
+
default:
|
|
158
|
+
return { ok: false, diagnostics: [{ code: 'invalid-request', severity: 'error', message: `locator at index ${index} has an unsupported kind`, targetName }] };
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
function isFiniteInteger(value) {
|
|
162
|
+
return typeof value === 'number' && Number.isInteger(value);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Validates the optional v0.3 scrollScenario request shape. `configuredTargetNames`
|
|
166
|
+
* is the lowercase set of already-normalized target names so `target-scroll-by`
|
|
167
|
+
* can only reference an existing stable observer target (never a new/implicit
|
|
168
|
+
* one). Total: collects every applicable diagnostic before returning; never
|
|
169
|
+
* throws.
|
|
170
|
+
*/
|
|
171
|
+
function validateScrollScenario(raw, configuredTargetNames) {
|
|
172
|
+
if (!isPlainObject(raw)) {
|
|
173
|
+
return { ok: false, diagnostics: [{ code: 'invalid-request', severity: 'error', message: 'scrollScenario must be an object' }] };
|
|
174
|
+
}
|
|
175
|
+
const extraScenarioKeys = Object.keys(raw).filter((key) => key !== 'action');
|
|
176
|
+
if (extraScenarioKeys.length > 0) {
|
|
177
|
+
return {
|
|
178
|
+
ok: false,
|
|
179
|
+
diagnostics: [{ code: 'invalid-request', severity: 'error', message: `scrollScenario has unsupported field(s): ${extraScenarioKeys.join(', ')}` }],
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
const action = raw.action;
|
|
183
|
+
if (!isPlainObject(action)) {
|
|
184
|
+
return { ok: false, diagnostics: [{ code: 'invalid-request', severity: 'error', message: 'scrollScenario.action must be an object' }] };
|
|
185
|
+
}
|
|
186
|
+
const kind = action.kind;
|
|
187
|
+
if (typeof kind !== 'string' || !SUPPORTED_SCROLL_ACTION_KINDS.has(kind)) {
|
|
188
|
+
return {
|
|
189
|
+
ok: false,
|
|
190
|
+
diagnostics: [
|
|
191
|
+
{ code: 'invalid-request', severity: 'error', message: `scrollScenario.action.kind must be one of ${[...SUPPORTED_SCROLL_ACTION_KINDS].join(', ')}` },
|
|
192
|
+
],
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
const allowedActionKeys = kind === 'target-scroll-by' ? ['kind', 'target', 'deltaX', 'deltaY'] : ['kind', 'deltaX', 'deltaY'];
|
|
196
|
+
const extraActionKeys = Object.keys(action).filter((key) => !allowedActionKeys.includes(key));
|
|
197
|
+
if (extraActionKeys.length > 0) {
|
|
198
|
+
return {
|
|
199
|
+
ok: false,
|
|
200
|
+
diagnostics: [{ code: 'invalid-request', severity: 'error', message: `scrollScenario.action has unsupported field(s): ${extraActionKeys.join(', ')}` }],
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
const deltaDiagnostics = [];
|
|
204
|
+
if (!isFiniteInteger(action.deltaX) || Math.abs(action.deltaX) > SCROLL_DELTA_MAX_ABS) {
|
|
205
|
+
deltaDiagnostics.push({
|
|
206
|
+
code: 'invalid-request',
|
|
207
|
+
severity: 'error',
|
|
208
|
+
message: `scrollScenario.action.deltaX must be an integer in [-${SCROLL_DELTA_MAX_ABS}, ${SCROLL_DELTA_MAX_ABS}]`,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
if (!isFiniteInteger(action.deltaY) || Math.abs(action.deltaY) > SCROLL_DELTA_MAX_ABS) {
|
|
212
|
+
deltaDiagnostics.push({
|
|
213
|
+
code: 'invalid-request',
|
|
214
|
+
severity: 'error',
|
|
215
|
+
message: `scrollScenario.action.deltaY must be an integer in [-${SCROLL_DELTA_MAX_ABS}, ${SCROLL_DELTA_MAX_ABS}]`,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
if (deltaDiagnostics.length > 0) {
|
|
219
|
+
return { ok: false, diagnostics: deltaDiagnostics };
|
|
220
|
+
}
|
|
221
|
+
const deltaX = action.deltaX;
|
|
222
|
+
const deltaY = action.deltaY;
|
|
223
|
+
if (deltaX === 0 && deltaY === 0) {
|
|
224
|
+
return {
|
|
225
|
+
ok: false,
|
|
226
|
+
diagnostics: [{ code: 'invalid-request', severity: 'error', message: 'scrollScenario.action requires a non-zero deltaX or deltaY' }],
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
if (kind === 'window-scroll-by') {
|
|
230
|
+
return { ok: true, scenario: { action: { kind: 'window-scroll-by', deltaX, deltaY } } };
|
|
231
|
+
}
|
|
232
|
+
if (typeof action.target !== 'string' || action.target.length === 0) {
|
|
233
|
+
return {
|
|
234
|
+
ok: false,
|
|
235
|
+
diagnostics: [{ code: 'invalid-request', severity: 'error', message: 'scrollScenario.action.target is required for target-scroll-by' }],
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
if (!configuredTargetNames.has(action.target.toLowerCase())) {
|
|
239
|
+
return {
|
|
240
|
+
ok: false,
|
|
241
|
+
diagnostics: [
|
|
242
|
+
{ code: 'invalid-request', severity: 'error', message: 'scrollScenario.action.target must reference a configured target', targetName: action.target },
|
|
243
|
+
],
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
return { ok: true, scenario: { action: { kind: 'target-scroll-by', target: action.target, deltaX, deltaY } } };
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Total, never throws. Collects every applicable diagnostic before returning
|
|
250
|
+
* (does not short-circuit on the first violation) so callers see every
|
|
251
|
+
* problem at once, in deterministic order.
|
|
252
|
+
*/
|
|
253
|
+
export function normalizeRequest(raw) {
|
|
254
|
+
const diagnostics = [];
|
|
255
|
+
let targetUrl;
|
|
256
|
+
if (typeof raw.targetUrl !== 'string' || raw.targetUrl.length === 0) {
|
|
257
|
+
diagnostics.push({ code: 'invalid-request', severity: 'error', message: 'targetUrl is required and must be a non-empty string' });
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
targetUrl = raw.targetUrl;
|
|
261
|
+
const decision = classifyUrl(targetUrl);
|
|
262
|
+
if (!decision.allowed)
|
|
263
|
+
diagnostics.push(decision.diagnostic);
|
|
264
|
+
}
|
|
265
|
+
let viewport = DEFAULT_VIEWPORT;
|
|
266
|
+
if (raw.viewport !== undefined) {
|
|
267
|
+
const candidate = raw.viewport;
|
|
268
|
+
if (!isPlainObject(candidate) ||
|
|
269
|
+
typeof candidate.width !== 'number' ||
|
|
270
|
+
typeof candidate.height !== 'number' ||
|
|
271
|
+
!isInRange(candidate.width, VIEWPORT_MIN, VIEWPORT_MAX) ||
|
|
272
|
+
!isInRange(candidate.height, VIEWPORT_MIN, VIEWPORT_MAX)) {
|
|
273
|
+
diagnostics.push({
|
|
274
|
+
code: 'invalid-request',
|
|
275
|
+
severity: 'error',
|
|
276
|
+
message: `viewport width/height must be integers in [${VIEWPORT_MIN}, ${VIEWPORT_MAX}]`,
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
viewport = { width: candidate.width, height: candidate.height };
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
const targets = [];
|
|
284
|
+
if (raw.targets !== undefined) {
|
|
285
|
+
if (!Array.isArray(raw.targets)) {
|
|
286
|
+
diagnostics.push({ code: 'invalid-request', severity: 'error', message: 'targets must be an array' });
|
|
287
|
+
}
|
|
288
|
+
else if (raw.targets.length > MAX_TARGETS) {
|
|
289
|
+
diagnostics.push({ code: 'invalid-request', severity: 'error', message: `targets must contain at most ${MAX_TARGETS} entries` });
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
const seenNames = new Set();
|
|
293
|
+
for (const rawTargetUnknown of raw.targets) {
|
|
294
|
+
if (!isPlainObject(rawTargetUnknown) || typeof rawTargetUnknown.name !== 'string') {
|
|
295
|
+
diagnostics.push({ code: 'invalid-request', severity: 'error', message: 'each target requires a string name and either a string selector or a locators array' });
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
const rawTarget = rawTargetUnknown;
|
|
299
|
+
const name = rawTargetUnknown.name;
|
|
300
|
+
if (!TARGET_NAME_RE.test(name)) {
|
|
301
|
+
diagnostics.push({ code: 'invalid-request', severity: 'error', message: 'target name must match ^[A-Za-z0-9_-]{1,64}$', targetName: name });
|
|
302
|
+
}
|
|
303
|
+
const normalizedName = name.toLowerCase();
|
|
304
|
+
if (seenNames.has(normalizedName)) {
|
|
305
|
+
diagnostics.push({ code: 'invalid-request', severity: 'error', message: 'duplicate target name', targetName: name });
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
seenNames.add(normalizedName);
|
|
309
|
+
}
|
|
310
|
+
const hasSelector = rawTarget.selector !== undefined;
|
|
311
|
+
const hasLocators = rawTarget.locators !== undefined;
|
|
312
|
+
if (hasSelector && hasLocators) {
|
|
313
|
+
diagnostics.push({ code: 'invalid-request', severity: 'error', message: 'target must not specify both selector and locators', targetName: name });
|
|
314
|
+
continue;
|
|
315
|
+
}
|
|
316
|
+
if (hasSelector) {
|
|
317
|
+
if (typeof rawTarget.selector !== 'string' || rawTarget.selector.length === 0 || rawTarget.selector.length > MAX_SELECTOR_LENGTH) {
|
|
318
|
+
diagnostics.push({
|
|
319
|
+
code: 'invalid-request',
|
|
320
|
+
severity: 'error',
|
|
321
|
+
message: `target selector must be 1-${MAX_SELECTOR_LENGTH} characters`,
|
|
322
|
+
targetName: name,
|
|
323
|
+
});
|
|
324
|
+
continue;
|
|
325
|
+
}
|
|
326
|
+
targets.push({ name, locators: [{ kind: 'css', selector: rawTarget.selector }] });
|
|
327
|
+
continue;
|
|
328
|
+
}
|
|
329
|
+
if (hasLocators) {
|
|
330
|
+
if (!Array.isArray(rawTarget.locators) || rawTarget.locators.length === 0) {
|
|
331
|
+
diagnostics.push({ code: 'invalid-request', severity: 'error', message: 'target locators must be a non-empty array', targetName: name });
|
|
332
|
+
continue;
|
|
333
|
+
}
|
|
334
|
+
if (rawTarget.locators.length > MAX_LOCATORS_PER_TARGET) {
|
|
335
|
+
diagnostics.push({
|
|
336
|
+
code: 'invalid-request',
|
|
337
|
+
severity: 'error',
|
|
338
|
+
message: `target locators must contain at most ${MAX_LOCATORS_PER_TARGET} entries`,
|
|
339
|
+
targetName: name,
|
|
340
|
+
});
|
|
341
|
+
continue;
|
|
342
|
+
}
|
|
343
|
+
const locators = [];
|
|
344
|
+
let anyInvalid = false;
|
|
345
|
+
rawTarget.locators.forEach((rawLocator, index) => {
|
|
346
|
+
const validated = validateLocator(rawLocator, name, index);
|
|
347
|
+
if (validated.ok) {
|
|
348
|
+
locators.push(validated.locator);
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
anyInvalid = true;
|
|
352
|
+
diagnostics.push(...validated.diagnostics);
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
if (!anyInvalid) {
|
|
356
|
+
targets.push({ name, locators });
|
|
357
|
+
}
|
|
358
|
+
continue;
|
|
359
|
+
}
|
|
360
|
+
diagnostics.push({ code: 'invalid-request', severity: 'error', message: 'each target requires either a selector or a locators array', targetName: name });
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
let timeoutMs = DEFAULT_TIMEOUT_MS;
|
|
365
|
+
if (raw.timeoutMs !== undefined) {
|
|
366
|
+
if (typeof raw.timeoutMs !== 'number' || !isInRange(raw.timeoutMs, TIMEOUT_MIN_MS, TIMEOUT_MAX_MS)) {
|
|
367
|
+
diagnostics.push({
|
|
368
|
+
code: 'invalid-request',
|
|
369
|
+
severity: 'error',
|
|
370
|
+
message: `timeoutMs must be an integer in [${TIMEOUT_MIN_MS}, ${TIMEOUT_MAX_MS}]`,
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
else {
|
|
374
|
+
timeoutMs = raw.timeoutMs;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
let readinessCondition = DEFAULT_READINESS_CONDITION;
|
|
378
|
+
let readinessTimeoutMs = Math.min(DEFAULT_READINESS_TIMEOUT_MS, timeoutMs);
|
|
379
|
+
if (raw.readiness !== undefined) {
|
|
380
|
+
if (!isPlainObject(raw.readiness)) {
|
|
381
|
+
diagnostics.push({ code: 'unsupported-configuration', severity: 'error', message: 'readiness must be an object' });
|
|
382
|
+
}
|
|
383
|
+
else {
|
|
384
|
+
const readinessRaw = raw.readiness;
|
|
385
|
+
if (readinessRaw.condition !== undefined) {
|
|
386
|
+
if (readinessRaw.condition === 'load' || readinessRaw.condition === 'domcontentloaded') {
|
|
387
|
+
readinessCondition = readinessRaw.condition;
|
|
388
|
+
}
|
|
389
|
+
else {
|
|
390
|
+
diagnostics.push({
|
|
391
|
+
code: 'unsupported-configuration',
|
|
392
|
+
severity: 'error',
|
|
393
|
+
message: 'readiness.condition must be "load" or "domcontentloaded"',
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
if (readinessRaw.timeoutMs !== undefined) {
|
|
398
|
+
if (typeof readinessRaw.timeoutMs !== 'number' || !isInRange(readinessRaw.timeoutMs, READINESS_TIMEOUT_MIN_MS, timeoutMs)) {
|
|
399
|
+
diagnostics.push({
|
|
400
|
+
code: 'unsupported-configuration',
|
|
401
|
+
severity: 'error',
|
|
402
|
+
message: `readiness.timeoutMs must be an integer in [${READINESS_TIMEOUT_MIN_MS}, timeoutMs]`,
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
else {
|
|
406
|
+
readinessTimeoutMs = readinessRaw.timeoutMs;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
let outputLocation = DEFAULT_OUTPUT_LOCATION;
|
|
412
|
+
if (raw.outputLocation !== undefined) {
|
|
413
|
+
if (typeof raw.outputLocation !== 'string') {
|
|
414
|
+
diagnostics.push({ code: 'invalid-request', severity: 'error', message: 'outputLocation must be a string' });
|
|
415
|
+
}
|
|
416
|
+
else {
|
|
417
|
+
const result = normalizeOutputLocation(raw.outputLocation);
|
|
418
|
+
if (result.ok) {
|
|
419
|
+
outputLocation = result.value;
|
|
420
|
+
}
|
|
421
|
+
else {
|
|
422
|
+
diagnostics.push(result.diagnostic);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
let scrollScenario;
|
|
427
|
+
if (raw.scrollScenario !== undefined) {
|
|
428
|
+
const configuredTargetNames = new Set(targets.map((target) => target.name.toLowerCase()));
|
|
429
|
+
const validated = validateScrollScenario(raw.scrollScenario, configuredTargetNames);
|
|
430
|
+
if (validated.ok) {
|
|
431
|
+
scrollScenario = validated.scenario;
|
|
432
|
+
}
|
|
433
|
+
else {
|
|
434
|
+
diagnostics.push(...validated.diagnostics);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
let explicitState;
|
|
438
|
+
if (raw.explicitState !== undefined) {
|
|
439
|
+
const validated = isValidExplicitStateDimensions(raw.explicitState);
|
|
440
|
+
if (validated.valid) {
|
|
441
|
+
explicitState = raw.explicitState;
|
|
442
|
+
}
|
|
443
|
+
else {
|
|
444
|
+
diagnostics.push({ code: 'invalid-request', severity: 'error', message: `explicitState ${validated.reason}` });
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
if (diagnostics.length > 0 || targetUrl === undefined) {
|
|
448
|
+
return { ok: false, diagnostics: orderDiagnostics(diagnostics) };
|
|
449
|
+
}
|
|
450
|
+
return {
|
|
451
|
+
ok: true,
|
|
452
|
+
request: {
|
|
453
|
+
targetUrl,
|
|
454
|
+
viewport,
|
|
455
|
+
targets,
|
|
456
|
+
outputLocation,
|
|
457
|
+
timeoutMs,
|
|
458
|
+
readiness: { condition: readinessCondition, timeoutMs: readinessTimeoutMs },
|
|
459
|
+
...(scrollScenario ? { scrollScenario } : {}),
|
|
460
|
+
...(explicitState ? { explicitState } : {}),
|
|
461
|
+
},
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
//# sourceMappingURL=request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/request/request.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Diagnostic } from '../domain/diagnostics.js';
|
|
2
|
+
export type SafetyDecision = {
|
|
3
|
+
allowed: true;
|
|
4
|
+
} | {
|
|
5
|
+
allowed: false;
|
|
6
|
+
diagnostic: Diagnostic;
|
|
7
|
+
};
|
|
8
|
+
/** Pure classification: scheme + loopback rules only. Never performs DNS resolution or network I/O. */
|
|
9
|
+
export declare function classifyUrl(url: string): SafetyDecision;
|
|
10
|
+
export declare function classifyRedirect(fromUrl: string, toUrl: string): SafetyDecision;
|
|
11
|
+
export declare function classifySubresource(url: string): SafetyDecision;
|
|
12
|
+
/** Popups and downloads are never followed/saved in v0.1; both are non-fatal (warning) notices, not errors. */
|
|
13
|
+
export declare function classifyPopup(): Diagnostic;
|
|
14
|
+
export declare function classifyDownload(): Diagnostic;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
const ALLOWED_SCHEMES = ['http', 'https'];
|
|
2
|
+
/**
|
|
3
|
+
* v0.1 loopback allowlist: literal localhost/127.0.0.1/::1 and any 127.x.x.x
|
|
4
|
+
* form only. No DNS resolution, no arbitrary named "local dev host" support -
|
|
5
|
+
* an explicit conservative reading recorded in behavior-model.txt.
|
|
6
|
+
*/
|
|
7
|
+
function isLoopbackHost(hostname) {
|
|
8
|
+
const normalized = hostname.replace(/^\[|\]$/g, '').toLowerCase();
|
|
9
|
+
if (normalized === 'localhost' || normalized === '127.0.0.1' || normalized === '::1')
|
|
10
|
+
return true;
|
|
11
|
+
return /^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(normalized);
|
|
12
|
+
}
|
|
13
|
+
/** Pure classification: scheme + loopback rules only. Never performs DNS resolution or network I/O. */
|
|
14
|
+
export function classifyUrl(url) {
|
|
15
|
+
let parsed;
|
|
16
|
+
try {
|
|
17
|
+
parsed = new URL(url);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return {
|
|
21
|
+
allowed: false,
|
|
22
|
+
diagnostic: { code: 'invalid-request', severity: 'error', message: `malformed URL: ${url}` },
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
const scheme = parsed.protocol.replace(/:$/, '');
|
|
26
|
+
if (!ALLOWED_SCHEMES.includes(scheme)) {
|
|
27
|
+
return {
|
|
28
|
+
allowed: false,
|
|
29
|
+
diagnostic: { code: 'unsafe-url', severity: 'error', message: `scheme "${scheme}" is not allowed`, details: { url } },
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
if (parsed.username.length > 0 || parsed.password.length > 0) {
|
|
33
|
+
return {
|
|
34
|
+
allowed: false,
|
|
35
|
+
diagnostic: { code: 'unsafe-url', severity: 'error', message: 'credential-bearing URLs are rejected', details: { url } },
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
if (!isLoopbackHost(parsed.hostname)) {
|
|
39
|
+
return {
|
|
40
|
+
allowed: false,
|
|
41
|
+
diagnostic: { code: 'unsafe-url', severity: 'error', message: `host "${parsed.hostname}" is not a loopback host`, details: { url } },
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
return { allowed: true };
|
|
45
|
+
}
|
|
46
|
+
export function classifyRedirect(fromUrl, toUrl) {
|
|
47
|
+
const decision = classifyUrl(toUrl);
|
|
48
|
+
if (decision.allowed)
|
|
49
|
+
return decision;
|
|
50
|
+
return {
|
|
51
|
+
allowed: false,
|
|
52
|
+
diagnostic: {
|
|
53
|
+
code: 'prohibited-redirect',
|
|
54
|
+
severity: 'error',
|
|
55
|
+
message: 'redirect target failed safety policy',
|
|
56
|
+
details: { from: fromUrl, to: toUrl },
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
export function classifySubresource(url) {
|
|
61
|
+
const decision = classifyUrl(url);
|
|
62
|
+
if (decision.allowed)
|
|
63
|
+
return decision;
|
|
64
|
+
return {
|
|
65
|
+
allowed: false,
|
|
66
|
+
diagnostic: {
|
|
67
|
+
code: 'prohibited-subresource-request',
|
|
68
|
+
severity: 'error',
|
|
69
|
+
message: 'subresource target failed safety policy',
|
|
70
|
+
details: { url },
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/** Popups and downloads are never followed/saved in v0.1; both are non-fatal (warning) notices, not errors. */
|
|
75
|
+
export function classifyPopup() {
|
|
76
|
+
return { code: 'unsupported-configuration', severity: 'warning', message: 'popups are not followed in v0.1' };
|
|
77
|
+
}
|
|
78
|
+
export function classifyDownload() {
|
|
79
|
+
return { code: 'unsupported-configuration', severity: 'warning', message: 'downloads are not followed in v0.1' };
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/safety/policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;--bg:#0f172a;--panel:#1e293b;--border:#334155;--text:#e2e8f0;--text-dim:#94a3b8;--accent:#38bdf8;--error-bg:#450a0a;--error-border:#dc2626}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{background:var(--bg);color:var(--text);font-family:system-ui,-apple-system,Segoe UI,sans-serif}.app-shell{flex-direction:column;height:100%;display:flex}.app-shell__header{border-bottom:1px solid var(--border);justify-content:space-between;align-items:center;padding:.75rem 1rem;display:flex}.app-shell__identity{flex-direction:column;line-height:1.2;display:flex}.app-shell__title{font-size:1rem;font-weight:600}.app-shell__subtitle{color:var(--text-dim);font-size:.8rem}.status-banner{border-bottom:1px solid var(--border);justify-content:space-between;gap:1rem;padding:.4rem 1rem;font-size:.8rem;display:flex}.status-banner--loading,.status-banner--ok{color:var(--text-dim)}.status-banner--error{background:var(--error-bg);color:#fecaca;border-bottom-color:var(--error-border)}.app-shell__body{flex:1;grid-template-columns:220px 1fr 280px;min-height:0;display:grid}.app-shell__nav,.app-shell__workspace,.app-shell__details{padding:1rem;overflow:auto}.app-shell__nav{border-right:1px solid var(--border)}.app-shell__details{border-left:1px solid var(--border)}.placeholder-note{color:var(--text-dim);font-size:.85rem;line-height:1.5}.install-affordance{border:1px solid var(--border);border-radius:6px;padding:.35rem .7rem;font-size:.8rem}.install-affordance--available{background:var(--accent);color:#0f172a;border-color:var(--accent);cursor:pointer}.install-affordance--unavailable{color:var(--text-dim)}.evidence-list{flex-direction:column;gap:.4rem;margin:0;padding:0;list-style:none;display:flex}.evidence-list__truncated-note{color:var(--text-dim);font-size:.75rem}.evidence-list__item{text-align:left;background:var(--panel);border:1px solid var(--border);width:100%;color:var(--text);cursor:pointer;border-radius:6px;flex-direction:column;align-items:flex-start;gap:.15rem;padding:.4rem .5rem;font-size:.75rem;display:flex}.evidence-list__item--selected{border-color:var(--accent)}.evidence-list__family{font-weight:600}.evidence-list__id{color:var(--text-dim);font-family:monospace}.evidence-list__state{font-size:.7rem}.evidence-list__state--supported{color:#4ade80}.evidence-list__state--unsupported-version,.evidence-list__state--invalid-structure,.evidence-list__state--malformed-json,.evidence-list__state--unreadable{color:#f87171}.evidence-list__state--unrecognized-kind{color:var(--text-dim)}.evidence-list__error,.artifact-preview__error,.artifact-preview__unsupported{color:#fecaca;font-size:.85rem}.artifact-preview__summary{color:var(--text-dim);font-size:.85rem}.artifact-preview__raw{background:var(--panel);border:1px solid var(--border);white-space:pre-wrap;word-break:break-word;border-radius:6px;max-height:60vh;padding:.75rem;font-size:.7rem;overflow:auto}.evidence-details{font-size:.75rem}.evidence-details dt{color:var(--text-dim);margin-top:.5rem}.evidence-details dd{word-break:break-word;margin:.1rem 0 0}.observation-workspace{flex-direction:column;gap:.5rem;height:100%;font-size:.75rem;display:flex}.observation-workspace__toolbar{border-bottom:1px solid var(--border);gap:1rem;padding-bottom:.4rem;display:flex}.observation-workspace__toolbar label{cursor:pointer;align-items:center;gap:.3rem;display:flex}.observation-workspace__panes{flex:1;grid-template-columns:160px 1fr 260px;gap:.75rem;min-height:0;display:grid}.observation-workspace__targets,.observation-workspace__inspector{overflow:auto}.observation-workspace__visual{border:1px solid var(--border);background:#000;border-radius:6px;justify-content:center;align-items:flex-start;display:flex;overflow:auto}.target-overlay-svg{width:100%;height:auto;display:block}.target-overlay-svg__rect{fill:#38bdf81f;stroke:var(--accent);stroke-width:2px;cursor:pointer;vector-effect:non-scaling-stroke}.target-overlay-svg__rect--selected{fill:#4ade8033;stroke:#4ade80}.target-overlay-svg__rect:focus-visible{outline:2px solid #facc15}.target-overlay-svg__label{fill:#f8fafc;paint-order:stroke;stroke:#0f172a;stroke-width:3px;font-size:12px}.target-overlay-svg__relationship{stroke:#facc15;stroke-width:1.5px;stroke-dasharray:4 3;vector-effect:non-scaling-stroke}.target-list{flex-direction:column;gap:.3rem;margin:0;padding:0;list-style:none;display:flex}.target-list__item{text-align:left;background:var(--panel);border:1px solid var(--border);width:100%;color:var(--text);cursor:pointer;border-radius:6px;flex-direction:column;align-items:flex-start;padding:.3rem .45rem;font-size:.7rem;display:flex}.target-list__item--selected{border-color:#4ade80}.target-list__item--not-found,.target-list__item--ambiguous,.target-list__item--unavailable{opacity:.75}.target-list__name{font-family:monospace;font-weight:600}.target-list__status{color:var(--text-dim)}.inspector h3,.inspector h4{margin:.4rem 0 .3rem;font-size:.8rem}.inspector__fields{margin:0}.evidence-field{margin-bottom:.4rem}.evidence-field dt{color:var(--text-dim);font-size:.68rem}.evidence-field dd{word-break:break-word;margin:0}.evidence-field__source{color:var(--text-dim);font-size:.65rem}.evidence-field--unavailable dd,.evidence-field--not-applicable dd{color:var(--text-dim);font-style:italic}.relationships-section__note{color:var(--text-dim);font-size:.68rem}.relationships-section__list{margin:.3rem 0;padding:0;list-style:none}.relationships-section__unresolved{color:var(--text-dim);font-size:.68rem}.inspector__error{color:#fecaca}.target-overlay-svg__rect--highlighted{stroke:#facc15;fill:#facc1526}.comparison-workspace,.evaluation-workspace{flex-direction:column;gap:.6rem;height:100%;font-size:.75rem;display:flex;overflow:auto}.comparability-banner{border:1px solid var(--border);border-radius:6px;padding:.4rem .6rem}.comparability-banner--comparable{border-color:#4ade80}.comparability-banner--comparable-with-warnings{border-color:#facc15}.comparability-banner--incomparable{background:var(--error-bg);border-color:#f87171}.comparability-banner ul{margin:.3rem 0 0;padding-left:1rem}.comparability-reason--blocking{color:#fecaca}.comparability-reason--warning{color:#fde68a}.comparability-reason--unassessed{color:var(--text-dim)}.comparison-workspace__truncated{color:#fde68a;border:1px solid #facc15;border-radius:6px;padding:.4rem .6rem}.comparison-workspace__panes{grid-template-columns:1fr 1fr;gap:.75rem;min-height:260px;display:grid}.comparison-pane{border:1px solid var(--border);background:#000;border-radius:6px;padding:.4rem;overflow:auto}.comparison-pane__label{color:var(--text-dim);text-transform:uppercase;margin:0 0 .3rem;font-size:.7rem}.comparison-workspace__details,.evaluation-workspace__details{flex-direction:column;gap:.6rem;display:flex}.comparison-workspace__details section,.evaluation-workspace__details section{border-top:1px solid var(--border);padding-top:.4rem}.comparison-workspace__details h4,.evaluation-workspace__details h4{margin:0 0 .3rem;font-size:.75rem}.comparison-list{flex-direction:column;gap:.25rem;margin:0;padding:0;list-style:none;display:flex}.comparison-list__item{text-align:left;background:var(--panel);border:1px solid var(--border);width:100%;color:var(--text);cursor:pointer;border-radius:6px;padding:.3rem .45rem;font-size:.7rem}.comparison-list__item:disabled{cursor:default;opacity:.7}.comparison-list__meta{color:var(--text-dim);font-size:.65rem;display:block}.overall-verdict{text-align:center;border:2px solid var(--border);border-radius:8px;padding:.6rem .8rem;font-size:1rem}.overall-verdict--PASS{color:#4ade80;border-color:#4ade80}.overall-verdict--FAIL{color:#f87171;background:var(--error-bg);border-color:#f87171}.clause-list{flex-direction:column;gap:.3rem;margin:0;padding:0;list-style:none;display:flex}.clause-row{border:1px solid var(--border);border-radius:6px;padding:.3rem .45rem}.clause-row--fail{border-color:#f87171}.clause-row--pass{border-color:#4ade80}.clause-row--conflict{border-color:#fb923c}.clause-row--unavailable{border-color:var(--text-dim)}.clause-row__button{color:var(--text);text-align:left;cursor:pointer;background:0 0;border:none;flex-wrap:wrap;align-items:center;gap:.4rem;width:100%;font-size:.7rem;display:flex}.clause-row__button:disabled{cursor:default}.clause-row__id{font-family:monospace;font-weight:600}.clause-row__badge{border:1px solid var(--border);border-radius:4px;padding:.05rem .3rem;font-size:.6rem}.clause-row__badge--active{color:#4ade80;border-color:#4ade80}.clause-row__badge--superseded{color:var(--text-dim)}.clause-row__category{color:var(--text-dim);text-transform:uppercase;font-size:.6rem}.clause-row__status{margin-left:auto}.clause-row__unresolved{color:#fde68a;margin:.2rem 0 0;font-size:.65rem}.clause-row__primitive{color:var(--text-dim);word-break:break-word;margin:.2rem 0 0;font-family:monospace;font-size:.62rem}.reference-region-overlay-svg__rect--has-requirement{stroke-dasharray:4 2}.reference-workspace{flex-direction:column;gap:.6rem;height:100%;font-size:.75rem;display:flex;overflow:auto}.reference-workspace__panes{grid-template-columns:1fr 1fr;gap:.75rem;min-height:260px;display:grid}.reference-pane{border:1px solid var(--border);border-radius:6px;padding:.4rem;overflow:auto}.reference-workspace__candidate-select,.reference-workspace__evaluation-select{flex-direction:column;gap:.2rem;margin-bottom:.4rem;font-size:.7rem;display:flex}.reference-workspace__candidate-select select,.reference-workspace__evaluation-select select{background:var(--panel);color:var(--text);border:1px solid var(--border);border-radius:4px;padding:.2rem}.reference-workspace__details{flex-direction:column;gap:.6rem;display:flex}.reference-adequacy{border:1px solid var(--border);border-radius:6px;padding:.3rem .5rem;font-size:.7rem}.reference-adequacy--adequate{border-color:#4ade80}.reference-adequacy--partial{border-color:#facc15}.reference-adequacy--inadequate{border-color:#f87171}.target-overlay-svg--pannable{cursor:grab}.target-overlay-svg--pannable:active{cursor:grabbing}.zoom-controls{align-items:center;gap:.3rem;margin-bottom:.3rem;font-size:.68rem;display:flex}.zoom-controls button{background:var(--panel);color:var(--text);border:1px solid var(--border);cursor:pointer;border-radius:4px;padding:.1rem .4rem}.zoom-controls__scale{color:var(--text-dim);text-align:center;min-width:3rem}.reference-workspace__lock{align-items:center;gap:.4rem;margin-bottom:.4rem;font-size:.68rem;display:flex}.reference-workspace__lock button{background:var(--panel);color:var(--text);border:1px solid var(--border);cursor:pointer;border-radius:4px;padding:.15rem .5rem}.reference-workspace__lock button[aria-pressed=true]{color:#4ade80;border-color:#4ade80}.reference-workspace__lock button:disabled{cursor:default;opacity:.6}.reference-fidelity-panel{flex-direction:column;gap:.4rem;display:flex}.reference-fidelity-panel__toolbar button{background:var(--panel);color:var(--text);border:1px solid var(--border);cursor:pointer;border-radius:4px;padding:.25rem .6rem}.reference-fidelity-panel__toolbar button:disabled{cursor:default;opacity:.7}.reference-fidelity-panel__units{color:var(--text-dim);font-size:.62rem}.reference-fidelity-state{border:2px solid var(--border);border-radius:6px;padding:.4rem .6rem;font-size:.85rem}.reference-fidelity-state--pass{color:#4ade80;border-color:#4ade80}.reference-fidelity-state--fail{color:#f87171;background:var(--error-bg);border-color:#f87171}.reference-fidelity-state--not-evaluated{border-color:var(--text-dim);color:var(--text-dim)}.reference-workspace__independence-note{color:#fde68a;border-top:1px solid var(--border);padding-top:.3rem;font-size:.7rem}.app-shell__mode-toggle{gap:.3rem;margin-left:auto;margin-right:.5rem;display:flex}.app-shell__mode-toggle button{background:var(--panel);color:var(--text);border:1px solid var(--border);cursor:pointer;border-radius:4px;padding:.2rem .6rem;font-size:.75rem}.app-shell__mode-toggle button[aria-pressed=true]{border-color:var(--accent);color:var(--accent)}.app-shell__body--context{display:block}.app-shell__workspace--context{height:100%;padding:.75rem;overflow:auto}.context-workspace{flex-direction:column;gap:.8rem;font-size:.78rem;display:flex}.context-workspace section{border-top:1px solid var(--border);padding-top:.5rem}.context-summary-grid{grid-template-columns:max-content 1fr;gap:.2rem .8rem;font-size:.8rem;display:grid}.context-summary-grid dt{color:var(--text-dim)}.context-adequacy-badge{border:1px solid var(--border);border-radius:4px;padding:.05rem .4rem;font-weight:600;display:inline-block}.context-adequacy-badge--adequate{color:#4ade80;border-color:#4ade80}.context-adequacy-badge--partial{color:#facc15;border-color:#facc15}.context-adequacy-badge--inadequate{color:#f87171;border-color:#f87171}.context-sources{flex-direction:column;gap:.4rem;display:flex}.context-source-row{border:1px solid var(--border);border-radius:6px;flex-wrap:wrap;align-items:center;gap:.5rem;padding:.3rem .5rem;display:flex}.context-source-row__label{font-family:monospace}.context-source-row__status{border:1px solid var(--border);border-radius:4px;padding:.05rem .35rem;font-size:.7rem}.context-source-row__status--resolved{color:#4ade80;border-color:#4ade80}.context-source-row__status--ambiguous{color:#fb923c;border-color:#fb923c}.context-source-row__status--missing{border-color:var(--text-dim);color:var(--text-dim)}.context-target-source-list{margin:.3rem 0 0;padding-left:1rem;font-size:.7rem}.context-correlation-heading{color:var(--text-dim);margin:.2rem 0;font-size:.68rem}.context-correlation-row--selected{outline:1px solid var(--accent)}.context-required-loss{background:var(--error-bg);color:#fecaca;border:1px solid #f87171;border-radius:6px;padding:.4rem .6rem}.raw-evidence-viewer button{background:var(--panel);color:var(--text);border:1px solid var(--border);cursor:pointer;border-radius:4px;padding:.15rem .5rem;font-size:.68rem}
|