@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,352 @@
|
|
|
1
|
+
import { isValidObservationArtifact } from './schema.js';
|
|
2
|
+
function isPlainObject(value) {
|
|
3
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
4
|
+
}
|
|
5
|
+
// --- Geometry tolerance -------------------------------------------------------
|
|
6
|
+
/** Suppresses insignificant geometry noise only - never a design contract, never permission for changes. */
|
|
7
|
+
export const GEOMETRY_TOLERANCE_DEFAULT_PX = 0.5;
|
|
8
|
+
export const GEOMETRY_TOLERANCE_MIN_PX = 0;
|
|
9
|
+
export const GEOMETRY_TOLERANCE_MAX_PX = 10;
|
|
10
|
+
export function isValidGeometryTolerancePx(value) {
|
|
11
|
+
return typeof value === 'number' && Number.isFinite(value) && value >= GEOMETRY_TOLERANCE_MIN_PX && value <= GEOMETRY_TOLERANCE_MAX_PX;
|
|
12
|
+
}
|
|
13
|
+
export const HORIZONTAL_ORDER_RELATIONSHIPS = ['left-of', 'right-of', 'horizontally-overlapping'];
|
|
14
|
+
export const VERTICAL_ORDER_RELATIONSHIPS = ['above', 'below', 'vertically-overlapping'];
|
|
15
|
+
export const AREA_OVERLAP_RELATIONSHIPS = ['overlaps', 'does-not-overlap'];
|
|
16
|
+
export const RELATIVE_WIDTH_RELATIONSHIPS = ['wider-than', 'narrower-than', 'equal-width-within-tolerance'];
|
|
17
|
+
export const GEOMETRIC_FIT_RELATIONSHIPS = ['fits-inside', 'does-not-fit-inside'];
|
|
18
|
+
/** Rendered-geometry sequencing only - never source DOM order (see docs/CONTRACTS.md target containment discussion). */
|
|
19
|
+
export const VERTICAL_SEQUENCE_RELATIONSHIPS = ['follows-vertically'];
|
|
20
|
+
export const PAGE_WIDTH_RELATIONSHIPS = ['document-width-fits-viewport', 'document-width-exceeds-viewport'];
|
|
21
|
+
/** Every pairwise (two-target) relationship kind this batch freezes. Deliberately bounded - not a general-purpose spatial language. */
|
|
22
|
+
export const PAIRWISE_RELATIONSHIP_KINDS = [
|
|
23
|
+
...HORIZONTAL_ORDER_RELATIONSHIPS,
|
|
24
|
+
...VERTICAL_ORDER_RELATIONSHIPS,
|
|
25
|
+
...AREA_OVERLAP_RELATIONSHIPS,
|
|
26
|
+
...RELATIVE_WIDTH_RELATIONSHIPS,
|
|
27
|
+
...GEOMETRIC_FIT_RELATIONSHIPS,
|
|
28
|
+
...VERTICAL_SEQUENCE_RELATIONSHIPS,
|
|
29
|
+
];
|
|
30
|
+
/** Every page-level (no target pair) relationship kind this batch freezes. */
|
|
31
|
+
export const PAGE_LEVEL_RELATIONSHIP_KINDS = [...PAGE_WIDTH_RELATIONSHIPS];
|
|
32
|
+
export function isValidEvidenceReference(value) {
|
|
33
|
+
return isPlainObject(value) && typeof value.path === 'string' && value.path.length > 0;
|
|
34
|
+
}
|
|
35
|
+
function isEvidenceReferenceArray(value) {
|
|
36
|
+
return Array.isArray(value) && value.every((entry) => isValidEvidenceReference(entry));
|
|
37
|
+
}
|
|
38
|
+
export function isValidPairwiseLayoutRelationship(value) {
|
|
39
|
+
if (!isPlainObject(value))
|
|
40
|
+
return false;
|
|
41
|
+
if (typeof value.kind !== 'string' || !PAIRWISE_RELATIONSHIP_KINDS.includes(value.kind))
|
|
42
|
+
return false;
|
|
43
|
+
if (typeof value.subjectTarget !== 'string' || value.subjectTarget.length === 0)
|
|
44
|
+
return false;
|
|
45
|
+
if (typeof value.relatedTarget !== 'string' || value.relatedTarget.length === 0)
|
|
46
|
+
return false;
|
|
47
|
+
if (value.subjectTarget === value.relatedTarget)
|
|
48
|
+
return false;
|
|
49
|
+
return isEvidenceReferenceArray(value.evidence);
|
|
50
|
+
}
|
|
51
|
+
export function isValidPageLevelLayoutRelationship(value) {
|
|
52
|
+
if (!isPlainObject(value))
|
|
53
|
+
return false;
|
|
54
|
+
if (typeof value.kind !== 'string' || !PAGE_LEVEL_RELATIONSHIP_KINDS.includes(value.kind))
|
|
55
|
+
return false;
|
|
56
|
+
return isEvidenceReferenceArray(value.evidence);
|
|
57
|
+
}
|
|
58
|
+
/** A configured target excluded from relationship derivation because it lacks usable geometry - never a fabricated zero-sized rectangle. */
|
|
59
|
+
export const UNRESOLVED_TARGET_REASONS = ['not-found', 'ambiguous', 'unavailable', 'hidden'];
|
|
60
|
+
export function isValidUnresolvedRelationshipTarget(value) {
|
|
61
|
+
if (!isPlainObject(value))
|
|
62
|
+
return false;
|
|
63
|
+
if (typeof value.target !== 'string' || value.target.length === 0)
|
|
64
|
+
return false;
|
|
65
|
+
return typeof value.reason === 'string' && UNRESOLVED_TARGET_REASONS.includes(value.reason);
|
|
66
|
+
}
|
|
67
|
+
export const MAX_CONFIGURED_TARGETS_FOR_RELATIONSHIPS = 20;
|
|
68
|
+
export const MAX_PAIRWISE_RELATIONSHIP_PAIRS = (MAX_CONFIGURED_TARGETS_FOR_RELATIONSHIPS * (MAX_CONFIGURED_TARGETS_FOR_RELATIONSHIPS - 1)) / 2;
|
|
69
|
+
/**
|
|
70
|
+
* A single unordered pair can carry up to one record per independent
|
|
71
|
+
* pairwise relationship family (horizontal-order, vertical-order,
|
|
72
|
+
* area-overlap, relative-width, geometric-fit, vertical-sequence - see
|
|
73
|
+
* `deriveLayoutRelationships` below), never more than one per family per
|
|
74
|
+
* pair. This is the resulting bound on `pairwiseRelationships.length`, not a
|
|
75
|
+
* second target-count configuration.
|
|
76
|
+
*/
|
|
77
|
+
export const PAIRWISE_RELATIONSHIP_FAMILY_COUNT = 6;
|
|
78
|
+
export const MAX_PAIRWISE_RELATIONSHIP_RECORDS = MAX_PAIRWISE_RELATIONSHIP_PAIRS * PAIRWISE_RELATIONSHIP_FAMILY_COUNT;
|
|
79
|
+
export function isValidLayoutRelationshipGraph(value) {
|
|
80
|
+
if (!isPlainObject(value))
|
|
81
|
+
return false;
|
|
82
|
+
if (typeof value.observationId !== 'string' || value.observationId.length === 0)
|
|
83
|
+
return false;
|
|
84
|
+
if (typeof value.requestId !== 'string' || value.requestId.length === 0)
|
|
85
|
+
return false;
|
|
86
|
+
if (typeof value.geometryTolerancePx !== 'number' || !Number.isFinite(value.geometryTolerancePx))
|
|
87
|
+
return false;
|
|
88
|
+
if (!Array.isArray(value.targets) || !value.targets.every((t) => typeof t === 'string' && t.length > 0))
|
|
89
|
+
return false;
|
|
90
|
+
if (new Set(value.targets).size !== value.targets.length)
|
|
91
|
+
return false;
|
|
92
|
+
if (!Array.isArray(value.unresolvedTargets) || !value.unresolvedTargets.every((t) => isValidUnresolvedRelationshipTarget(t)))
|
|
93
|
+
return false;
|
|
94
|
+
const targetSet = new Set(value.targets);
|
|
95
|
+
if (value.unresolvedTargets.some((t) => targetSet.has(t.target)))
|
|
96
|
+
return false;
|
|
97
|
+
if (!Array.isArray(value.pairwiseRelationships) || !value.pairwiseRelationships.every((r) => isValidPairwiseLayoutRelationship(r)))
|
|
98
|
+
return false;
|
|
99
|
+
if (value.pairwiseRelationships.length > MAX_PAIRWISE_RELATIONSHIP_RECORDS)
|
|
100
|
+
return false;
|
|
101
|
+
for (const relationship of value.pairwiseRelationships) {
|
|
102
|
+
if (!targetSet.has(relationship.subjectTarget) || !targetSet.has(relationship.relatedTarget))
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
if (!Array.isArray(value.pageRelationships) || !value.pageRelationships.every((r) => isValidPageLevelLayoutRelationship(r)))
|
|
106
|
+
return false;
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Bounded derived clipping concept (docs/PROJECT_MILESTONES.md Milestone 4).
|
|
111
|
+
* `clipped` requires both actual dimensional overflow on that axis AND a
|
|
112
|
+
* computed `overflow` value of `hidden`/`clip` on that axis - `auto`,
|
|
113
|
+
* `scroll`, and `visible` never classify as clipped solely from dimensional
|
|
114
|
+
* overflow. `unavailable` when the underlying overflow/geometry evidence
|
|
115
|
+
* cannot support a conclusion - never guessed.
|
|
116
|
+
*/
|
|
117
|
+
export const CLIPPING_STATES = ['clipped', 'not-clipped', 'unavailable'];
|
|
118
|
+
export const CLIPPING_OVERFLOW_STYLES = ['hidden', 'clip'];
|
|
119
|
+
export function isValidTargetClippingEvidence(value) {
|
|
120
|
+
if (!isPlainObject(value))
|
|
121
|
+
return false;
|
|
122
|
+
return (typeof value.horizontal === 'string' &&
|
|
123
|
+
CLIPPING_STATES.includes(value.horizontal) &&
|
|
124
|
+
typeof value.vertical === 'string' &&
|
|
125
|
+
CLIPPING_STATES.includes(value.vertical));
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Pure per-target clipping derivation from one target's own existing
|
|
129
|
+
* `layout`/`style` evidence (never a scroll scenario - normal target
|
|
130
|
+
* evidence already carries `scrollWidth`/`scrollHeight`/`clientWidth`/
|
|
131
|
+
* `clientHeight`/`overflowX`/`overflowY`). `TargetClippingEvidence` has no
|
|
132
|
+
* slot in `LayoutRelationshipGraph` (that graph is spatial/page-level only,
|
|
133
|
+
* per the frozen Batch 1 vocabulary) - this is a standalone per-target
|
|
134
|
+
* derivation for callers (e.g. a later comparison engine) that need it
|
|
135
|
+
* directly from an `ObservationArtifact`'s `targetEvidence`, one target at a
|
|
136
|
+
* time. `unavailable` (never guessed) when the underlying layout/style
|
|
137
|
+
* evidence is not itself available - this naturally covers an unresolved
|
|
138
|
+
* target without any special-casing. A resolved-but-`display:none` target
|
|
139
|
+
* naturally computes `not-clipped` too: its `scrollWidth`/`clientWidth` are
|
|
140
|
+
* both `0`, so `scrollWidth > clientWidth` is false - clipping is never
|
|
141
|
+
* inferred from hidden-ness itself.
|
|
142
|
+
*/
|
|
143
|
+
export function deriveTargetClipping(record) {
|
|
144
|
+
const layoutField = record.layout;
|
|
145
|
+
const styleField = record.style;
|
|
146
|
+
if (layoutField.state !== 'available' || styleField.state !== 'available') {
|
|
147
|
+
return { horizontal: 'unavailable', vertical: 'unavailable' };
|
|
148
|
+
}
|
|
149
|
+
const layout = layoutField.value;
|
|
150
|
+
const style = styleField.value;
|
|
151
|
+
const isClippingOverflowStyle = (value) => CLIPPING_OVERFLOW_STYLES.includes(value);
|
|
152
|
+
const horizontalOverflow = layout.scrollWidth > layout.clientWidth;
|
|
153
|
+
const verticalOverflow = layout.scrollHeight > layout.clientHeight;
|
|
154
|
+
return {
|
|
155
|
+
horizontal: horizontalOverflow && isClippingOverflowStyle(style.overflowX) ? 'clipped' : 'not-clipped',
|
|
156
|
+
vertical: verticalOverflow && isClippingOverflowStyle(style.overflowY) ? 'clipped' : 'not-clipped',
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
// --- deriveLayoutRelationships (v0.4 Batch 2 canonical derivation engine) ----
|
|
160
|
+
/**
|
|
161
|
+
* Pure tolerance-aware geometry predicates (Batch 1's frozen rules,
|
|
162
|
+
* verbatim). Every predicate is a total function over exactly one relation
|
|
163
|
+
* family, so it can never itself produce a contradictory pair of values
|
|
164
|
+
* (e.g. `left-of` and `right-of` for the same call) - the caller decides
|
|
165
|
+
* `subject`/`related` once per pair and each family is evaluated exactly
|
|
166
|
+
* once for that fixed direction.
|
|
167
|
+
*/
|
|
168
|
+
/**
|
|
169
|
+
* Exported (v0.7 Prompt 2 addition, additive-only - no formula changed) so
|
|
170
|
+
* that domain/externalReferenceRegionRelationships.ts can derive the same
|
|
171
|
+
* geometry-only relationship families for reference-image regions without
|
|
172
|
+
* duplicating these formulas. Every parameter is structurally just
|
|
173
|
+
* `{x,y,width,height,right,bottom}` - these predicates have never depended on
|
|
174
|
+
* anything runtime/browser-specific, so reusing them for a reference
|
|
175
|
+
* region's derived rectangle is exact reuse, not a reinterpretation.
|
|
176
|
+
*/
|
|
177
|
+
export function horizontalOrderOf(a, b, tolerance) {
|
|
178
|
+
if (a.right <= b.x + tolerance)
|
|
179
|
+
return 'left-of';
|
|
180
|
+
if (b.right <= a.x + tolerance)
|
|
181
|
+
return 'right-of';
|
|
182
|
+
return 'horizontally-overlapping';
|
|
183
|
+
}
|
|
184
|
+
export function verticalOrderOf(a, b, tolerance) {
|
|
185
|
+
if (a.bottom <= b.y + tolerance)
|
|
186
|
+
return 'above';
|
|
187
|
+
if (b.bottom <= a.y + tolerance)
|
|
188
|
+
return 'below';
|
|
189
|
+
return 'vertically-overlapping';
|
|
190
|
+
}
|
|
191
|
+
export function areaOverlapOf(a, b, tolerance) {
|
|
192
|
+
const overlapWidth = Math.min(a.right, b.right) - Math.max(a.x, b.x);
|
|
193
|
+
const overlapHeight = Math.min(a.bottom, b.bottom) - Math.max(a.y, b.y);
|
|
194
|
+
return overlapWidth > tolerance && overlapHeight > tolerance ? 'overlaps' : 'does-not-overlap';
|
|
195
|
+
}
|
|
196
|
+
export function relativeWidthOf(a, b, tolerance) {
|
|
197
|
+
if (a.width > b.width + tolerance)
|
|
198
|
+
return 'wider-than';
|
|
199
|
+
if (a.width < b.width - tolerance)
|
|
200
|
+
return 'narrower-than';
|
|
201
|
+
return 'equal-width-within-tolerance';
|
|
202
|
+
}
|
|
203
|
+
export function geometricFitOf(a, b, tolerance) {
|
|
204
|
+
const fits = a.x >= b.x - tolerance && a.y >= b.y - tolerance && a.right <= b.right + tolerance && a.bottom <= b.bottom + tolerance;
|
|
205
|
+
return fits ? 'fits-inside' : 'does-not-fit-inside';
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* `follows-vertically` is the one family whose vocabulary has a single
|
|
209
|
+
* value (not a total 3-way partition like the others), so it is emitted
|
|
210
|
+
* only when one target's geometry actually precedes the other's - never for
|
|
211
|
+
* both directions, never when they vertically overlap. The direction is
|
|
212
|
+
* decided by actual rendered geometry, not configured target order:
|
|
213
|
+
* `above(x, y)` and "y follows x" share the same tolerance-relative
|
|
214
|
+
* condition, so whichever of the pair is algebraically "above" the other
|
|
215
|
+
* becomes `relatedTarget` and the one that follows becomes `subjectTarget`.
|
|
216
|
+
*/
|
|
217
|
+
export function verticalSequenceOf(x, y, tolerance) {
|
|
218
|
+
if (x.geometry.bottom <= y.geometry.y + tolerance)
|
|
219
|
+
return { subjectTarget: y.name, relatedTarget: x.name };
|
|
220
|
+
if (y.geometry.bottom <= x.geometry.y + tolerance)
|
|
221
|
+
return { subjectTarget: x.name, relatedTarget: y.name };
|
|
222
|
+
return undefined;
|
|
223
|
+
}
|
|
224
|
+
function geometryEvidence(a, b) {
|
|
225
|
+
return [{ path: `targetEvidence.${a}.geometry` }, { path: `targetEvidence.${b}.geometry` }];
|
|
226
|
+
}
|
|
227
|
+
/** Maps a configured target's resolution/visibility evidence to the frozen unresolved-target reason vocabulary - never a fabricated relationship for a target that cannot honestly carry one. */
|
|
228
|
+
function classifyUnresolvedTarget(record) {
|
|
229
|
+
if (!record)
|
|
230
|
+
return 'unavailable';
|
|
231
|
+
const resolutionField = record.resolution;
|
|
232
|
+
if (resolutionField.state === 'available' || resolutionField.state === 'partial') {
|
|
233
|
+
const status = resolutionField.value.selectionStatus;
|
|
234
|
+
if (status === 'not-found')
|
|
235
|
+
return 'not-found';
|
|
236
|
+
if (status === 'ambiguous')
|
|
237
|
+
return 'ambiguous';
|
|
238
|
+
if (status === 'unavailable')
|
|
239
|
+
return 'unavailable';
|
|
240
|
+
}
|
|
241
|
+
return 'unavailable';
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* The one canonical pure derivation from an already-captured
|
|
245
|
+
* `ObservationArtifact` to a `LayoutRelationshipGraph` (real Chromium ->
|
|
246
|
+
* ObservationArtifact -> **relationship derivation** -> comparability ->
|
|
247
|
+
* comparison -> ComparisonArtifact, see docs/ARCHITECTURE.md). Deterministic
|
|
248
|
+
* and synchronous: same `observation`/`geometryTolerancePx` in, same graph
|
|
249
|
+
* out, every time - no Chromium, target re-resolution, DOM access, randomness,
|
|
250
|
+
* clock, filesystem, or network involved, and `observation` is never
|
|
251
|
+
* mutated.
|
|
252
|
+
*
|
|
253
|
+
* Scope, by construction:
|
|
254
|
+
* - only targets present in `observation.requestConfig.targets` are ever
|
|
255
|
+
* considered (bounded at the existing 20-target/190-pair request limit -
|
|
256
|
+
* never arbitrary DOM/accessibility-tree traversal);
|
|
257
|
+
* - a configured target missing usable geometry (never resolved, or
|
|
258
|
+
* resolved but reported not-visible) becomes an `unresolvedTargets` entry
|
|
259
|
+
* with an honest reason, never a fabricated zero-sized relation;
|
|
260
|
+
* - for each unordered pair of geometry-eligible targets, exactly one
|
|
261
|
+
* record per relationship family is derived, with `subjectTarget`/
|
|
262
|
+
* `relatedTarget` fixed to that pair's configured order (earlier
|
|
263
|
+
* configured target is always `subjectTarget`) for every family except
|
|
264
|
+
* `follows-vertically` (see `verticalSequenceOf`) - so
|
|
265
|
+
* `pairwiseRelationships.length` never exceeds
|
|
266
|
+
* `MAX_PAIRWISE_RELATIONSHIP_RECORDS`;
|
|
267
|
+
* - DOM containment is deliberately not re-derived here: it already exists
|
|
268
|
+
* as `targetEvidence.<name>.containment` on the observation itself (see
|
|
269
|
+
* `TargetContainment` in domain/schema.ts, explicitly documented there as
|
|
270
|
+
* "never a layout/relationship graph") and stays separate from
|
|
271
|
+
* `fits-inside`/`does-not-fit-inside`, which is geometry-only;
|
|
272
|
+
* - the page-width relationship is derived only when both
|
|
273
|
+
* `pageEvidence.documentWidth` and `pageEvidence.viewportWidth` are
|
|
274
|
+
* themselves available - never defaulted to "fits" when evidence is
|
|
275
|
+
* missing.
|
|
276
|
+
*/
|
|
277
|
+
export function deriveLayoutRelationships(observation, options = {}) {
|
|
278
|
+
const validation = isValidObservationArtifact(observation);
|
|
279
|
+
if (!validation.valid) {
|
|
280
|
+
return { ok: false, reason: `cannot derive relationships from an invalid ObservationArtifact: ${validation.reason}` };
|
|
281
|
+
}
|
|
282
|
+
const geometryTolerancePx = options.geometryTolerancePx ?? GEOMETRY_TOLERANCE_DEFAULT_PX;
|
|
283
|
+
if (!isValidGeometryTolerancePx(geometryTolerancePx)) {
|
|
284
|
+
return {
|
|
285
|
+
ok: false,
|
|
286
|
+
reason: `geometryTolerancePx must be a finite number in [${GEOMETRY_TOLERANCE_MIN_PX}, ${GEOMETRY_TOLERANCE_MAX_PX}]`,
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
const configuredNames = observation.requestConfig.targets.map((target) => target.name);
|
|
290
|
+
if (configuredNames.length > MAX_CONFIGURED_TARGETS_FOR_RELATIONSHIPS) {
|
|
291
|
+
return {
|
|
292
|
+
ok: false,
|
|
293
|
+
reason: `observation.requestConfig.targets has ${configuredNames.length} entries, exceeding the ${MAX_CONFIGURED_TARGETS_FOR_RELATIONSHIPS}-target relationship-derivation bound`,
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
const eligible = [];
|
|
297
|
+
const unresolvedTargets = [];
|
|
298
|
+
for (const name of configuredNames) {
|
|
299
|
+
const record = observation.targetEvidence[name];
|
|
300
|
+
const geometryField = record?.geometry;
|
|
301
|
+
if (!record || geometryField?.state !== 'available') {
|
|
302
|
+
unresolvedTargets.push({ target: name, reason: classifyUnresolvedTarget(record) });
|
|
303
|
+
continue;
|
|
304
|
+
}
|
|
305
|
+
const visibilityField = record.visibility;
|
|
306
|
+
if ((visibilityField.state === 'available' || visibilityField.state === 'partial') && visibilityField.value.visible === false) {
|
|
307
|
+
unresolvedTargets.push({ target: name, reason: 'hidden' });
|
|
308
|
+
continue;
|
|
309
|
+
}
|
|
310
|
+
eligible.push({ name, geometry: geometryField.value });
|
|
311
|
+
}
|
|
312
|
+
const pairwiseRelationships = [];
|
|
313
|
+
for (let i = 0; i < eligible.length; i += 1) {
|
|
314
|
+
const subject = eligible[i];
|
|
315
|
+
for (let j = i + 1; j < eligible.length; j += 1) {
|
|
316
|
+
const related = eligible[j];
|
|
317
|
+
const evidence = geometryEvidence(subject.name, related.name);
|
|
318
|
+
pairwiseRelationships.push({ kind: horizontalOrderOf(subject.geometry, related.geometry, geometryTolerancePx), subjectTarget: subject.name, relatedTarget: related.name, evidence }, { kind: verticalOrderOf(subject.geometry, related.geometry, geometryTolerancePx), subjectTarget: subject.name, relatedTarget: related.name, evidence }, { kind: areaOverlapOf(subject.geometry, related.geometry, geometryTolerancePx), subjectTarget: subject.name, relatedTarget: related.name, evidence }, { kind: relativeWidthOf(subject.geometry, related.geometry, geometryTolerancePx), subjectTarget: subject.name, relatedTarget: related.name, evidence }, { kind: geometricFitOf(subject.geometry, related.geometry, geometryTolerancePx), subjectTarget: subject.name, relatedTarget: related.name, evidence });
|
|
319
|
+
const sequence = verticalSequenceOf(subject, related, geometryTolerancePx);
|
|
320
|
+
if (sequence) {
|
|
321
|
+
pairwiseRelationships.push({
|
|
322
|
+
kind: 'follows-vertically',
|
|
323
|
+
subjectTarget: sequence.subjectTarget,
|
|
324
|
+
relatedTarget: sequence.relatedTarget,
|
|
325
|
+
evidence: geometryEvidence(sequence.subjectTarget, sequence.relatedTarget),
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
const pageRelationships = [];
|
|
331
|
+
const documentWidthField = observation.pageEvidence.documentWidth;
|
|
332
|
+
const viewportWidthField = observation.pageEvidence.viewportWidth;
|
|
333
|
+
const documentWidth = documentWidthField?.state === 'available' && typeof documentWidthField.value === 'number' ? documentWidthField.value : undefined;
|
|
334
|
+
const viewportWidth = viewportWidthField?.state === 'available' && typeof viewportWidthField.value === 'number' ? viewportWidthField.value : undefined;
|
|
335
|
+
if (documentWidth !== undefined && viewportWidth !== undefined) {
|
|
336
|
+
pageRelationships.push({
|
|
337
|
+
kind: documentWidth <= viewportWidth + geometryTolerancePx ? 'document-width-fits-viewport' : 'document-width-exceeds-viewport',
|
|
338
|
+
evidence: [{ path: 'pageEvidence.documentWidth' }, { path: 'pageEvidence.viewportWidth' }],
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
const graph = {
|
|
342
|
+
observationId: observation.observationId,
|
|
343
|
+
requestId: observation.requestId,
|
|
344
|
+
geometryTolerancePx,
|
|
345
|
+
targets: eligible.map((entry) => entry.name),
|
|
346
|
+
unresolvedTargets,
|
|
347
|
+
pairwiseRelationships,
|
|
348
|
+
pageRelationships,
|
|
349
|
+
};
|
|
350
|
+
return { ok: true, graph };
|
|
351
|
+
}
|
|
352
|
+
//# sourceMappingURL=relationships.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relationships.js","sourceRoot":"","sources":["../../src/domain/relationships.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAEzD,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,iFAAiF;AAEjF,4GAA4G;AAC5G,MAAM,CAAC,MAAM,6BAA6B,GAAG,GAAG,CAAC;AACjD,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC;AAC3C,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAE5C,MAAM,UAAU,0BAA0B,CAAC,KAAc;IACvD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,yBAAyB,IAAI,KAAK,IAAI,yBAAyB,CAAC;AACzI,CAAC;AAED,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,0BAA0B,CAAU,CAAC;AAG3G,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,wBAAwB,CAAU,CAAC;AAGlG,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,UAAU,EAAE,kBAAkB,CAAU,CAAC;AAGpF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,YAAY,EAAE,eAAe,EAAE,8BAA8B,CAAU,CAAC;AAGrH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,aAAa,EAAE,qBAAqB,CAAU,CAAC;AAG3F,wHAAwH;AACxH,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,oBAAoB,CAAU,CAAC;AAG/E,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,8BAA8B,EAAE,iCAAiC,CAAU,CAAC;AAGrH,uIAAuI;AACvI,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,GAAG,8BAA8B;IACjC,GAAG,4BAA4B;IAC/B,GAAG,0BAA0B;IAC7B,GAAG,4BAA4B;IAC/B,GAAG,2BAA2B;IAC9B,GAAG,+BAA+B;CAC1B,CAAC;AAGX,8EAA8E;AAC9E,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,GAAG,wBAAwB,CAAU,CAAC;AAQpF,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,OAAO,aAAa,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AACzF,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAc;IAC9C,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC,CAAC;AACzF,CAAC;AAUD,MAAM,UAAU,iCAAiC,CAAC,KAAc;IAC9D,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAE,2BAAiD,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7H,IAAI,OAAO,KAAK,CAAC,aAAa,KAAK,QAAQ,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9F,IAAI,OAAO,KAAK,CAAC,aAAa,KAAK,QAAQ,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9F,IAAI,KAAK,CAAC,aAAa,KAAK,KAAK,CAAC,aAAa;QAAE,OAAO,KAAK,CAAC;IAC9D,OAAO,wBAAwB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AAClD,CAAC;AAQD,MAAM,UAAU,kCAAkC,CAAC,KAAc;IAC/D,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAE,6BAAmD,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/H,OAAO,wBAAwB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AAClD,CAAC;AAED,4IAA4I;AAC5I,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,CAAU,CAAC;AAQtG,MAAM,UAAU,mCAAmC,CAAC,KAAc;IAChE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAChF,OAAO,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAK,yBAA+C,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACrH,CAAC;AAkBD,MAAM,CAAC,MAAM,wCAAwC,GAAG,EAAE,CAAC;AAC3D,MAAM,CAAC,MAAM,+BAA+B,GAC1C,CAAC,wCAAwC,GAAG,CAAC,wCAAwC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAElG;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAAC,CAAC;AACpD,MAAM,CAAC,MAAM,iCAAiC,GAAG,+BAA+B,GAAG,kCAAkC,CAAC;AAEtH,MAAM,UAAU,8BAA8B,CAAC,KAAc;IAC3D,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,OAAO,KAAK,CAAC,aAAa,KAAK,QAAQ,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9F,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtF,IAAI,OAAO,KAAK,CAAC,mBAAmB,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,mBAAmB,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/G,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/H,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,OAAmB,CAAC,CAAC,IAAI,KAAM,KAAK,CAAC,OAAoB,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACjG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,mCAAmC,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACpJ,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAAmB,CAAC,CAAC;IACrD,IAAK,KAAK,CAAC,iBAAoD,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACnH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,iCAAiC,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1J,IAAK,KAAK,CAAC,qBAAsD,CAAC,MAAM,GAAG,iCAAiC;QAAE,OAAO,KAAK,CAAC;IAC3H,KAAK,MAAM,YAAY,IAAI,KAAK,CAAC,qBAAqD,EAAE,CAAC;QACvF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,aAAa,CAAC;YAAE,OAAO,KAAK,CAAC;IAC7G,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,kCAAkC,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACnJ,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,SAAS,EAAE,aAAa,EAAE,aAAa,CAAU,CAAC;AAGlF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAU,CAAC;AAQpE,MAAM,UAAU,6BAA6B,CAAC,KAAc;IAC1D,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,CACL,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ;QACnC,eAAqC,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC;QACjE,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;QACjC,eAAqC,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAChE,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAA4B;IAC/D,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;IAClC,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC;IAChC,IAAI,WAAW,CAAC,KAAK,KAAK,WAAW,IAAI,UAAU,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;QAC1E,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;IAChE,CAAC;IACD,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC;IACjC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;IAC/B,MAAM,uBAAuB,GAAG,CAAC,KAAa,EAAW,EAAE,CAAE,wBAA8C,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5H,MAAM,kBAAkB,GAAG,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IACnE,MAAM,gBAAgB,GAAG,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;IAEnE,OAAO;QACL,UAAU,EAAE,kBAAkB,IAAI,uBAAuB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa;QACtG,QAAQ,EAAE,gBAAgB,IAAI,uBAAuB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa;KACnG,CAAC;AACJ,CAAC;AAED,gFAAgF;AAEhF;;;;;;;GAOG;AACH;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,CAAiB,EAAE,CAAiB,EAAE,SAAiB;IACvF,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS;QAAE,OAAO,SAAS,CAAC;IACjD,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS;QAAE,OAAO,UAAU,CAAC;IAClD,OAAO,0BAA0B,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,CAAiB,EAAE,CAAiB,EAAE,SAAiB;IACrF,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS;QAAE,OAAO,OAAO,CAAC;IAChD,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS;QAAE,OAAO,OAAO,CAAC;IAChD,OAAO,wBAAwB,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,CAAiB,EAAE,CAAiB,EAAE,SAAiB;IACnF,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,OAAO,YAAY,GAAG,SAAS,IAAI,aAAa,GAAG,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC;AACjG,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,CAAiB,EAAE,CAAiB,EAAE,SAAiB;IACrF,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,SAAS;QAAE,OAAO,YAAY,CAAC;IACvD,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,SAAS;QAAE,OAAO,eAAe,CAAC;IAC1D,OAAO,8BAA8B,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,CAAiB,EAAE,CAAiB,EAAE,SAAiB;IACpF,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,GAAG,SAAS,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC;IACpI,OAAO,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,qBAAqB,CAAC;AACtD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAChC,CAA6C,EAC7C,CAA6C,EAC7C,SAAiB;IAEjB,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,SAAS;QAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3G,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,SAAS;QAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3G,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,gBAAgB,CAAC,CAAS,EAAE,CAAS;IAC5C,OAAO,CAAC,EAAE,IAAI,EAAE,kBAAkB,CAAC,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,kBAAkB,CAAC,WAAW,EAAE,CAAC,CAAC;AAC9F,CAAC;AAED,iMAAiM;AACjM,SAAS,wBAAwB,CAAC,MAAwC;IACxE,IAAI,CAAC,MAAM;QAAE,OAAO,aAAa,CAAC;IAClC,MAAM,eAAe,GAAG,MAAM,CAAC,UAAU,CAAC;IAC1C,IAAI,eAAe,CAAC,KAAK,KAAK,WAAW,IAAI,eAAe,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACjF,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,eAAe,CAAC;QACrD,IAAI,MAAM,KAAK,WAAW;YAAE,OAAO,WAAW,CAAC;QAC/C,IAAI,MAAM,KAAK,WAAW;YAAE,OAAO,WAAW,CAAC;QAC/C,IAAI,MAAM,KAAK,aAAa;YAAE,OAAO,aAAa,CAAC;IACrD,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAQD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,UAAU,yBAAyB,CAAC,WAAgC,EAAE,UAA4C,EAAE;IACxH,MAAM,UAAU,GAAG,0BAA0B,CAAC,WAAW,CAAC,CAAC;IAC3D,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,oEAAoE,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;IACxH,CAAC;IAED,MAAM,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,IAAI,6BAA6B,CAAC;IACzF,IAAI,CAAC,0BAA0B,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACrD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,mDAAmD,yBAAyB,KAAK,yBAAyB,GAAG;SACtH,CAAC;IACJ,CAAC;IAED,MAAM,eAAe,GAAG,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvF,IAAI,eAAe,CAAC,MAAM,GAAG,wCAAwC,EAAE,CAAC;QACtE,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,yCAAyC,eAAe,CAAC,MAAM,2BAA2B,wCAAwC,uCAAuC;SAClL,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAiD,EAAE,CAAC;IAClE,MAAM,iBAAiB,GAAmC,EAAE,CAAC;IAE7D,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,aAAa,GAAG,MAAM,EAAE,QAAQ,CAAC;QACvC,IAAI,CAAC,MAAM,IAAI,aAAa,EAAE,KAAK,KAAK,WAAW,EAAE,CAAC;YACpD,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,wBAAwB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACnF,SAAS;QACX,CAAC;QACD,MAAM,eAAe,GAAG,MAAM,CAAC,UAAU,CAAC;QAC1C,IAAI,CAAC,eAAe,CAAC,KAAK,KAAK,WAAW,IAAI,eAAe,CAAC,KAAK,KAAK,SAAS,CAAC,IAAI,eAAe,CAAC,KAAK,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC9H,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC3D,SAAS;QACX,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,qBAAqB,GAAiC,EAAE,CAAC;IAC/D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAA+C,CAAC;QAC1E,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAA+C,CAAC;YAC1E,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YAE9D,qBAAqB,CAAC,IAAI,CACxB,EAAE,IAAI,EAAE,iBAAiB,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,mBAAmB,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,EACxJ,EAAE,IAAI,EAAE,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,mBAAmB,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,EACtJ,EAAE,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,mBAAmB,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,EACpJ,EAAE,IAAI,EAAE,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,mBAAmB,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,EACtJ,EAAE,IAAI,EAAE,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,mBAAmB,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,CACtJ,CAAC;YAEF,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC;YAC3E,IAAI,QAAQ,EAAE,CAAC;gBACb,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,oBAAoB;oBAC1B,aAAa,EAAE,QAAQ,CAAC,aAAa;oBACrC,aAAa,EAAE,QAAQ,CAAC,aAAa;oBACrC,QAAQ,EAAE,gBAAgB,CAAC,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,aAAa,CAAC;iBAC3E,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,iBAAiB,GAAkC,EAAE,CAAC;IAC5D,MAAM,kBAAkB,GAAG,WAAW,CAAC,YAAY,CAAC,aAAa,CAAC;IAClE,MAAM,kBAAkB,GAAG,WAAW,CAAC,YAAY,CAAC,aAAa,CAAC;IAClE,MAAM,aAAa,GAAG,kBAAkB,EAAE,KAAK,KAAK,WAAW,IAAI,OAAO,kBAAkB,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACvJ,MAAM,aAAa,GAAG,kBAAkB,EAAE,KAAK,KAAK,WAAW,IAAI,OAAO,kBAAkB,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACvJ,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAC/D,iBAAiB,CAAC,IAAI,CAAC;YACrB,IAAI,EAAE,aAAa,IAAI,aAAa,GAAG,mBAAmB,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,iCAAiC;YAC/H,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,4BAA4B,EAAE,EAAE,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC;SAC3F,CAAC,CAAC;IACL,CAAC;IAED,MAAM,KAAK,GAA4B;QACrC,aAAa,EAAE,WAAW,CAAC,aAAa;QACxC,SAAS,EAAE,WAAW,CAAC,SAAS;QAChC,mBAAmB;QACnB,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;QAC5C,iBAAiB;QACjB,qBAAqB;QACrB,iBAAiB;KAClB,CAAC;IAEF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
import type { EvidenceField } from './evidence.js';
|
|
2
|
+
import type { Diagnostic } from './diagnostics.js';
|
|
3
|
+
import type { CompletionState } from './completion.js';
|
|
4
|
+
import type { NormalizedObservationRequest } from '../request/request.js';
|
|
5
|
+
export declare const ARTIFACT_KIND: "my-frontend-observer/observation";
|
|
6
|
+
export declare const SCHEMA_VERSION: "1.2.0";
|
|
7
|
+
export declare const PRODUCER_NAME: "my-frontend-observer";
|
|
8
|
+
export type TargetLocatorKind = 'role' | 'id' | 'data-attribute' | 'semantic-element' | 'css' | 'text';
|
|
9
|
+
export type TargetSelectionStatus = 'matched' | 'not-found' | 'ambiguous' | 'unavailable';
|
|
10
|
+
export type TargetSelectionConfidence = 'exact' | 'none';
|
|
11
|
+
export type TargetLocatorAttemptStatus = 'not-found' | 'ambiguous' | 'matched' | 'unavailable' | 'unsupported';
|
|
12
|
+
export interface TargetLocatorAttempt {
|
|
13
|
+
locatorIndex: number;
|
|
14
|
+
locatorKind: TargetLocatorKind;
|
|
15
|
+
status: TargetLocatorAttemptStatus;
|
|
16
|
+
matchCount?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface TargetResolution {
|
|
19
|
+
selectionMethod: string;
|
|
20
|
+
selectionStatus: TargetSelectionStatus;
|
|
21
|
+
selectedLocatorKind?: TargetLocatorKind;
|
|
22
|
+
selectedLocatorIndex?: number;
|
|
23
|
+
usedFallback: boolean;
|
|
24
|
+
confidence: TargetSelectionConfidence;
|
|
25
|
+
attempts: TargetLocatorAttempt[];
|
|
26
|
+
}
|
|
27
|
+
export interface ArtifactReference {
|
|
28
|
+
path: string;
|
|
29
|
+
kind: string;
|
|
30
|
+
}
|
|
31
|
+
export interface TargetGeometry {
|
|
32
|
+
x: number;
|
|
33
|
+
y: number;
|
|
34
|
+
width: number;
|
|
35
|
+
height: number;
|
|
36
|
+
right: number;
|
|
37
|
+
bottom: number;
|
|
38
|
+
}
|
|
39
|
+
export interface TargetComputedStyle {
|
|
40
|
+
display: string;
|
|
41
|
+
position: string;
|
|
42
|
+
overflowX: string;
|
|
43
|
+
overflowY: string;
|
|
44
|
+
}
|
|
45
|
+
export interface TargetLayoutMetrics {
|
|
46
|
+
scrollWidth: number;
|
|
47
|
+
scrollHeight: number;
|
|
48
|
+
clientWidth: number;
|
|
49
|
+
clientHeight: number;
|
|
50
|
+
scrollTop: number;
|
|
51
|
+
scrollLeft: number;
|
|
52
|
+
}
|
|
53
|
+
export interface TargetVisibility {
|
|
54
|
+
visible: boolean;
|
|
55
|
+
}
|
|
56
|
+
export interface TargetSemantics {
|
|
57
|
+
role?: string;
|
|
58
|
+
name?: string;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Bounded first semantic-state family (Batch 3). Each key is present only
|
|
62
|
+
* when the browser exposes that state as applicable to this element (native
|
|
63
|
+
* form-control property or an explicit `aria-*` attribute) - an absent key
|
|
64
|
+
* means "not applicable to this element", never a guessed `false`. `checked`
|
|
65
|
+
* and `pressed` additionally support the browser's tri-state `'mixed'`
|
|
66
|
+
* value; `current` mirrors the `aria-current` value space (`true` for the
|
|
67
|
+
* bare/`"true"` form, or the specific token).
|
|
68
|
+
*/
|
|
69
|
+
export interface TargetSemanticState {
|
|
70
|
+
disabled?: boolean;
|
|
71
|
+
expanded?: boolean;
|
|
72
|
+
checked?: boolean | 'mixed';
|
|
73
|
+
selected?: boolean;
|
|
74
|
+
pressed?: boolean | 'mixed';
|
|
75
|
+
current?: true | 'page' | 'step' | 'location' | 'date' | 'time';
|
|
76
|
+
}
|
|
77
|
+
export declare const TARGET_LANDMARK_ROLES: readonly ["banner", "navigation", "main", "complementary", "contentinfo", "form", "region", "search"];
|
|
78
|
+
export type TargetLandmarkRole = (typeof TARGET_LANDMARK_ROLES)[number];
|
|
79
|
+
/** Bounded configured-target-only DOM containment (Batch 3) - not a layout/relationship graph. All arrays follow configured target order and exclude the target itself. */
|
|
80
|
+
export interface TargetContainment {
|
|
81
|
+
containedByTargetIds: string[];
|
|
82
|
+
evaluatedTargetIds: string[];
|
|
83
|
+
unresolvedTargetIds: string[];
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Batch 1 froze the wrapper (EvidenceField<T>) and the category names
|
|
87
|
+
* (resolution/geometry/style) but deliberately left geometry/style typed
|
|
88
|
+
* `unknown`, deferring the concrete rendered-evidence shapes to whichever
|
|
89
|
+
* batch actually captures them. Batch 3 fills that in and adds the
|
|
90
|
+
* remaining v0.1 target-evidence categories (tag/layout/visibility/
|
|
91
|
+
* semantics) additively: nothing in the repository constructs a
|
|
92
|
+
* TargetEvidenceRecord yet (only `{}` empty records exist in tests), so no
|
|
93
|
+
* existing caller loses a field.
|
|
94
|
+
*/
|
|
95
|
+
export interface TargetEvidenceRecord {
|
|
96
|
+
resolution: EvidenceField<TargetResolution>;
|
|
97
|
+
tag: EvidenceField<string>;
|
|
98
|
+
geometry: EvidenceField<TargetGeometry>;
|
|
99
|
+
style: EvidenceField<TargetComputedStyle>;
|
|
100
|
+
layout: EvidenceField<TargetLayoutMetrics>;
|
|
101
|
+
visibility: EvidenceField<TargetVisibility>;
|
|
102
|
+
semantics: EvidenceField<TargetSemantics>;
|
|
103
|
+
semanticState: EvidenceField<TargetSemanticState>;
|
|
104
|
+
landmark: EvidenceField<TargetLandmarkRole>;
|
|
105
|
+
containment: EvidenceField<TargetContainment>;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* v0.3 Batch 1 bounded runtime scroll/overflow evidence model. Frozen here
|
|
109
|
+
* as a contract; no browser capture populates it yet (Batch 2/3), so
|
|
110
|
+
* `scrollScenarioEvidence` on `ObservationArtifact` stays absent for every
|
|
111
|
+
* Batch-1-era observation, including one whose `requestConfig.scrollScenario`
|
|
112
|
+
* is present (see `src/browser/chromiumAdapter.ts`, which fails such a
|
|
113
|
+
* request honestly rather than pretending to execute it).
|
|
114
|
+
*/
|
|
115
|
+
export interface ScrollableMetrics {
|
|
116
|
+
scrollTop: number;
|
|
117
|
+
scrollLeft: number;
|
|
118
|
+
scrollWidth: number;
|
|
119
|
+
scrollHeight: number;
|
|
120
|
+
clientWidth: number;
|
|
121
|
+
clientHeight: number;
|
|
122
|
+
}
|
|
123
|
+
/** Distinguishes an `overflow-x`/`overflow-y` CSS declaration from actual browser-observed dimensional overflow - the two are not interchangeable (see docs/CONTRACTS.md). */
|
|
124
|
+
export interface OverflowEvidence {
|
|
125
|
+
horizontalOverflow: boolean;
|
|
126
|
+
verticalOverflow: boolean;
|
|
127
|
+
overflowX: string;
|
|
128
|
+
overflowY: string;
|
|
129
|
+
}
|
|
130
|
+
export interface WindowScrollSnapshot {
|
|
131
|
+
scrollX: number;
|
|
132
|
+
scrollY: number;
|
|
133
|
+
}
|
|
134
|
+
/** `documentElement`/`body` are omitted (not fabricated) when the browser's own scrolling/root-element representation makes them not meaningfully distinct or not observable. */
|
|
135
|
+
export interface DocumentScrollSnapshot {
|
|
136
|
+
root: ScrollableMetrics;
|
|
137
|
+
rootOverflow: OverflowEvidence;
|
|
138
|
+
documentElement?: ScrollableMetrics;
|
|
139
|
+
body?: ScrollableMetrics;
|
|
140
|
+
}
|
|
141
|
+
export type VerticalViewportRelation = 'above' | 'intersecting' | 'below';
|
|
142
|
+
/**
|
|
143
|
+
* Derived only from a target's bounding rectangle plus viewport width/height
|
|
144
|
+
* - never from source styles or locator kind. A hidden/non-rendered target
|
|
145
|
+
* (see `TargetVisibility`/`target-hidden`) must not receive normal
|
|
146
|
+
* above/below/intersecting geometry; its `viewportRelation` field on
|
|
147
|
+
* `TargetScrollRuntimeState` is `not-applicable` instead (hidden is not the
|
|
148
|
+
* same claim as offscreen).
|
|
149
|
+
*/
|
|
150
|
+
export interface ViewportRelationEvidence {
|
|
151
|
+
vertical: VerticalViewportRelation;
|
|
152
|
+
intersectsViewport: boolean;
|
|
153
|
+
fullyWithinViewport: boolean;
|
|
154
|
+
}
|
|
155
|
+
/** Bounded per-configured-target runtime scroll/overflow/viewport evidence for one snapshot (initial or final). References targets by the existing stable target `name` - never a second region identity - and never copies the full `TargetEvidenceRecord`. */
|
|
156
|
+
export interface TargetScrollRuntimeState {
|
|
157
|
+
metrics: EvidenceField<ScrollableMetrics>;
|
|
158
|
+
overflow: EvidenceField<OverflowEvidence>;
|
|
159
|
+
boundingRect: EvidenceField<TargetGeometry>;
|
|
160
|
+
viewportRelation: EvidenceField<ViewportRelationEvidence>;
|
|
161
|
+
}
|
|
162
|
+
/** One point-in-time bounded runtime snapshot (captured either before or after the one scroll action). */
|
|
163
|
+
export interface ScrollRuntimeSnapshot {
|
|
164
|
+
window: WindowScrollSnapshot;
|
|
165
|
+
document: DocumentScrollSnapshot;
|
|
166
|
+
targets: Record<string, TargetScrollRuntimeState>;
|
|
167
|
+
}
|
|
168
|
+
export interface ScrollValueChange<T> {
|
|
169
|
+
before: T;
|
|
170
|
+
after: T;
|
|
171
|
+
changed: boolean;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* `enteredViewport`/`leftViewport` are only evaluated when both the initial
|
|
175
|
+
* and final `viewportRelation` evidence are valid (never derived from a
|
|
176
|
+
* hidden-to-visible transition, which is a separate evidence concept - see
|
|
177
|
+
* docs/CONTRACTS.md).
|
|
178
|
+
*/
|
|
179
|
+
export interface TargetScrollTransition {
|
|
180
|
+
scrollTop: ScrollValueChange<number>;
|
|
181
|
+
scrollLeft: ScrollValueChange<number>;
|
|
182
|
+
boundingRectPosition: ScrollValueChange<{
|
|
183
|
+
x: number;
|
|
184
|
+
y: number;
|
|
185
|
+
}>;
|
|
186
|
+
viewportRelation: ScrollValueChange<VerticalViewportRelation>;
|
|
187
|
+
enteredViewport: boolean;
|
|
188
|
+
leftViewport: boolean;
|
|
189
|
+
}
|
|
190
|
+
/** Bounded explicit before/after change evidence for the one scroll action in this scenario - not a generic recursive diff engine. */
|
|
191
|
+
export interface ScrollScenarioTransition {
|
|
192
|
+
windowScrollX: ScrollValueChange<number>;
|
|
193
|
+
windowScrollY: ScrollValueChange<number>;
|
|
194
|
+
targets: Record<string, TargetScrollTransition>;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Conservative derived interpretation of which scrolling container actually
|
|
198
|
+
* moved. Never forces a winner: `none` when nothing relevant changed,
|
|
199
|
+
* `indeterminate` when more than one plausible owner changed or evidence is
|
|
200
|
+
* insufficient. `target` references the existing stable target `name`.
|
|
201
|
+
*/
|
|
202
|
+
export type ScrollOwnerInterpretation = {
|
|
203
|
+
kind: 'document';
|
|
204
|
+
} | {
|
|
205
|
+
kind: 'target';
|
|
206
|
+
target: string;
|
|
207
|
+
} | {
|
|
208
|
+
kind: 'none';
|
|
209
|
+
} | {
|
|
210
|
+
kind: 'indeterminate';
|
|
211
|
+
};
|
|
212
|
+
/** Top-level optional v0.3 evidence family. Present only when the request configured a `scrollScenario`; absent otherwise (never fabricated as empty/zeroed evidence). */
|
|
213
|
+
export interface ScrollScenarioEvidence {
|
|
214
|
+
initial: ScrollRuntimeSnapshot;
|
|
215
|
+
final: ScrollRuntimeSnapshot;
|
|
216
|
+
transition: ScrollScenarioTransition;
|
|
217
|
+
/** Always `source: 'derived'` with a non-empty `derivedFrom` (enforced by `isValidEvidenceField`/`isValidObservationArtifact`) - scroll ownership is an interpretation over browser-observed facts, never itself a direct browser observation. */
|
|
218
|
+
scrollOwner: EvidenceField<ScrollOwnerInterpretation>;
|
|
219
|
+
}
|
|
220
|
+
export interface ObservationArtifact {
|
|
221
|
+
artifactKind: typeof ARTIFACT_KIND;
|
|
222
|
+
schemaVersion: typeof SCHEMA_VERSION;
|
|
223
|
+
observationId: string;
|
|
224
|
+
requestId: string;
|
|
225
|
+
producer: {
|
|
226
|
+
name: typeof PRODUCER_NAME;
|
|
227
|
+
version: string;
|
|
228
|
+
};
|
|
229
|
+
browser: EvidenceField<{
|
|
230
|
+
engine: string;
|
|
231
|
+
version: string;
|
|
232
|
+
}>;
|
|
233
|
+
requestConfig: NormalizedObservationRequest;
|
|
234
|
+
provenance: {
|
|
235
|
+
capturedAt: string;
|
|
236
|
+
observationMethod: string;
|
|
237
|
+
};
|
|
238
|
+
pageEvidence: Record<string, EvidenceField<unknown>>;
|
|
239
|
+
targetEvidence: Record<string, TargetEvidenceRecord>;
|
|
240
|
+
scrollScenarioEvidence?: ScrollScenarioEvidence;
|
|
241
|
+
screenshot: EvidenceField<{
|
|
242
|
+
path: string;
|
|
243
|
+
}>;
|
|
244
|
+
completion: CompletionState;
|
|
245
|
+
diagnostics: Diagnostic[];
|
|
246
|
+
limits: {
|
|
247
|
+
truncated: boolean;
|
|
248
|
+
omittedFields: string[];
|
|
249
|
+
omittedTargets: string[];
|
|
250
|
+
};
|
|
251
|
+
artifactReferences: ArtifactReference[];
|
|
252
|
+
}
|
|
253
|
+
export type SchemaValidationResult = {
|
|
254
|
+
valid: true;
|
|
255
|
+
} | {
|
|
256
|
+
valid: false;
|
|
257
|
+
reason: string;
|
|
258
|
+
};
|
|
259
|
+
/**
|
|
260
|
+
* producer.version is read independently from package.json; it is never
|
|
261
|
+
* equal to schemaVersion by construction - the two are different fields with
|
|
262
|
+
* unrelated value spaces.
|
|
263
|
+
*/
|
|
264
|
+
export declare function getProducerInfo(): {
|
|
265
|
+
name: typeof PRODUCER_NAME;
|
|
266
|
+
version: string;
|
|
267
|
+
};
|
|
268
|
+
/** Structural validator for the frozen schema-1.2.0 ObservationArtifact contract. Treats `value` as arbitrary/unknown input. */
|
|
269
|
+
export declare function isValidObservationArtifact(value: unknown): SchemaValidationResult;
|