@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.
Files changed (316) hide show
  1. package/CHANGELOG.md +397 -0
  2. package/LICENSE +21 -0
  3. package/README.md +255 -0
  4. package/dist/application/browserCaptureService.d.ts +11 -0
  5. package/dist/application/browserCaptureService.js +12 -0
  6. package/dist/application/browserCaptureService.js.map +1 -0
  7. package/dist/application/comparisonService.d.ts +56 -0
  8. package/dist/application/comparisonService.js +77 -0
  9. package/dist/application/comparisonService.js.map +1 -0
  10. package/dist/application/externalReferencePersistenceService.d.ts +75 -0
  11. package/dist/application/externalReferencePersistenceService.js +182 -0
  12. package/dist/application/externalReferencePersistenceService.js.map +1 -0
  13. package/dist/application/frontendContractEvaluationService.d.ts +49 -0
  14. package/dist/application/frontendContractEvaluationService.js +112 -0
  15. package/dist/application/frontendContractEvaluationService.js.map +1 -0
  16. package/dist/application/frontendContractPersistenceService.d.ts +56 -0
  17. package/dist/application/frontendContractPersistenceService.js +91 -0
  18. package/dist/application/frontendContractPersistenceService.js.map +1 -0
  19. package/dist/application/observationPersistence.d.ts +59 -0
  20. package/dist/application/observationPersistence.js +79 -0
  21. package/dist/application/observationPersistence.js.map +1 -0
  22. package/dist/application/projectCheckService.d.ts +3 -0
  23. package/dist/application/projectCheckService.js +169 -0
  24. package/dist/application/projectCheckService.js.map +1 -0
  25. package/dist/application/projectWorkflowService.d.ts +46 -0
  26. package/dist/application/projectWorkflowService.js +92 -0
  27. package/dist/application/projectWorkflowService.js.map +1 -0
  28. package/dist/application/referenceFidelityEvaluationService.d.ts +28 -0
  29. package/dist/application/referenceFidelityEvaluationService.js +45 -0
  30. package/dist/application/referenceFidelityEvaluationService.js.map +1 -0
  31. package/dist/artifacts/artifactReader.d.ts +19 -0
  32. package/dist/artifacts/artifactReader.js +36 -0
  33. package/dist/artifacts/artifactReader.js.map +1 -0
  34. package/dist/artifacts/artifactWriter.d.ts +25 -0
  35. package/dist/artifacts/artifactWriter.js +68 -0
  36. package/dist/artifacts/artifactWriter.js.map +1 -0
  37. package/dist/artifacts/comparisonArtifactReader.d.ts +18 -0
  38. package/dist/artifacts/comparisonArtifactReader.js +35 -0
  39. package/dist/artifacts/comparisonArtifactReader.js.map +1 -0
  40. package/dist/artifacts/comparisonArtifactWriter.d.ts +41 -0
  41. package/dist/artifacts/comparisonArtifactWriter.js +67 -0
  42. package/dist/artifacts/comparisonArtifactWriter.js.map +1 -0
  43. package/dist/artifacts/externalReferenceArtifactReader.d.ts +18 -0
  44. package/dist/artifacts/externalReferenceArtifactReader.js +35 -0
  45. package/dist/artifacts/externalReferenceArtifactReader.js.map +1 -0
  46. package/dist/artifacts/externalReferenceArtifactWriter.d.ts +44 -0
  47. package/dist/artifacts/externalReferenceArtifactWriter.js +77 -0
  48. package/dist/artifacts/externalReferenceArtifactWriter.js.map +1 -0
  49. package/dist/artifacts/frontendContractArtifactReader.d.ts +24 -0
  50. package/dist/artifacts/frontendContractArtifactReader.js +47 -0
  51. package/dist/artifacts/frontendContractArtifactReader.js.map +1 -0
  52. package/dist/artifacts/frontendContractArtifactWriter.d.ts +34 -0
  53. package/dist/artifacts/frontendContractArtifactWriter.js +70 -0
  54. package/dist/artifacts/frontendContractArtifactWriter.js.map +1 -0
  55. package/dist/artifacts/frontendContractEvaluationArtifactReader.d.ts +17 -0
  56. package/dist/artifacts/frontendContractEvaluationArtifactReader.js +34 -0
  57. package/dist/artifacts/frontendContractEvaluationArtifactReader.js.map +1 -0
  58. package/dist/artifacts/frontendContractEvaluationArtifactWriter.d.ts +32 -0
  59. package/dist/artifacts/frontendContractEvaluationArtifactWriter.js +58 -0
  60. package/dist/artifacts/frontendContractEvaluationArtifactWriter.js.map +1 -0
  61. package/dist/artifacts/types.d.ts +17 -0
  62. package/dist/artifacts/types.js +2 -0
  63. package/dist/artifacts/types.js.map +1 -0
  64. package/dist/browser/chromiumAdapter.d.ts +21 -0
  65. package/dist/browser/chromiumAdapter.js +204 -0
  66. package/dist/browser/chromiumAdapter.js.map +1 -0
  67. package/dist/browser/evidenceCapture.d.ts +62 -0
  68. package/dist/browser/evidenceCapture.js +500 -0
  69. package/dist/browser/evidenceCapture.js.map +1 -0
  70. package/dist/browser/scrollCapture.d.ts +32 -0
  71. package/dist/browser/scrollCapture.js +163 -0
  72. package/dist/browser/scrollCapture.js.map +1 -0
  73. package/dist/browser/types.d.ts +24 -0
  74. package/dist/browser/types.js +2 -0
  75. package/dist/browser/types.js.map +1 -0
  76. package/dist/cli.d.ts +8 -0
  77. package/dist/cli.js +2411 -0
  78. package/dist/cli.js.map +1 -0
  79. package/dist/domain/boundedAgentContext.d.ts +226 -0
  80. package/dist/domain/boundedAgentContext.js +355 -0
  81. package/dist/domain/boundedAgentContext.js.map +1 -0
  82. package/dist/domain/boundedAgentContextCorrelation.d.ts +74 -0
  83. package/dist/domain/boundedAgentContextCorrelation.js +441 -0
  84. package/dist/domain/boundedAgentContextCorrelation.js.map +1 -0
  85. package/dist/domain/boundedAgentContextIdentity.d.ts +26 -0
  86. package/dist/domain/boundedAgentContextIdentity.js +69 -0
  87. package/dist/domain/boundedAgentContextIdentity.js.map +1 -0
  88. package/dist/domain/boundedAgentContextProjection.d.ts +71 -0
  89. package/dist/domain/boundedAgentContextProjection.js +477 -0
  90. package/dist/domain/boundedAgentContextProjection.js.map +1 -0
  91. package/dist/domain/comparison.d.ts +220 -0
  92. package/dist/domain/comparison.js +350 -0
  93. package/dist/domain/comparison.js.map +1 -0
  94. package/dist/domain/comparisonEngine.d.ts +76 -0
  95. package/dist/domain/comparisonEngine.js +734 -0
  96. package/dist/domain/comparisonEngine.js.map +1 -0
  97. package/dist/domain/comparisonIdentity.d.ts +13 -0
  98. package/dist/domain/comparisonIdentity.js +46 -0
  99. package/dist/domain/comparisonIdentity.js.map +1 -0
  100. package/dist/domain/completion.d.ts +30 -0
  101. package/dist/domain/completion.js +22 -0
  102. package/dist/domain/completion.js.map +1 -0
  103. package/dist/domain/diagnostics.d.ts +17 -0
  104. package/dist/domain/diagnostics.js +77 -0
  105. package/dist/domain/diagnostics.js.map +1 -0
  106. package/dist/domain/evidence.d.ts +29 -0
  107. package/dist/domain/evidence.js +59 -0
  108. package/dist/domain/evidence.js.map +1 -0
  109. package/dist/domain/explicitState.d.ts +40 -0
  110. package/dist/domain/explicitState.js +54 -0
  111. package/dist/domain/explicitState.js.map +1 -0
  112. package/dist/domain/externalReference.d.ts +158 -0
  113. package/dist/domain/externalReference.js +167 -0
  114. package/dist/domain/externalReference.js.map +1 -0
  115. package/dist/domain/externalReferenceApplicability.d.ts +43 -0
  116. package/dist/domain/externalReferenceApplicability.js +52 -0
  117. package/dist/domain/externalReferenceApplicability.js.map +1 -0
  118. package/dist/domain/externalReferenceCompatibility.d.ts +40 -0
  119. package/dist/domain/externalReferenceCompatibility.js +48 -0
  120. package/dist/domain/externalReferenceCompatibility.js.map +1 -0
  121. package/dist/domain/externalReferenceFidelity.d.ts +171 -0
  122. package/dist/domain/externalReferenceFidelity.js +419 -0
  123. package/dist/domain/externalReferenceFidelity.js.map +1 -0
  124. package/dist/domain/externalReferenceIdentity.d.ts +38 -0
  125. package/dist/domain/externalReferenceIdentity.js +70 -0
  126. package/dist/domain/externalReferenceIdentity.js.map +1 -0
  127. package/dist/domain/externalReferenceImage.d.ts +35 -0
  128. package/dist/domain/externalReferenceImage.js +160 -0
  129. package/dist/domain/externalReferenceImage.js.map +1 -0
  130. package/dist/domain/externalReferenceRegionRelationships.d.ts +63 -0
  131. package/dist/domain/externalReferenceRegionRelationships.js +98 -0
  132. package/dist/domain/externalReferenceRegionRelationships.js.map +1 -0
  133. package/dist/domain/externalReferenceRegions.d.ts +65 -0
  134. package/dist/domain/externalReferenceRegions.js +105 -0
  135. package/dist/domain/externalReferenceRegions.js.map +1 -0
  136. package/dist/domain/externalReferenceRequirementIdentity.d.ts +12 -0
  137. package/dist/domain/externalReferenceRequirementIdentity.js +35 -0
  138. package/dist/domain/externalReferenceRequirementIdentity.js.map +1 -0
  139. package/dist/domain/externalReferenceRequirements.d.ts +215 -0
  140. package/dist/domain/externalReferenceRequirements.js +401 -0
  141. package/dist/domain/externalReferenceRequirements.js.map +1 -0
  142. package/dist/domain/externalReferenceRuntimeBinding.d.ts +146 -0
  143. package/dist/domain/externalReferenceRuntimeBinding.js +183 -0
  144. package/dist/domain/externalReferenceRuntimeBinding.js.map +1 -0
  145. package/dist/domain/frontendContractEvaluation.d.ts +57 -0
  146. package/dist/domain/frontendContractEvaluation.js +454 -0
  147. package/dist/domain/frontendContractEvaluation.js.map +1 -0
  148. package/dist/domain/frontendContractEvaluationArtifact.d.ts +65 -0
  149. package/dist/domain/frontendContractEvaluationArtifact.js +108 -0
  150. package/dist/domain/frontendContractEvaluationArtifact.js.map +1 -0
  151. package/dist/domain/frontendContractIdentity.d.ts +39 -0
  152. package/dist/domain/frontendContractIdentity.js +70 -0
  153. package/dist/domain/frontendContractIdentity.js.map +1 -0
  154. package/dist/domain/frontendContracts.d.ts +188 -0
  155. package/dist/domain/frontendContracts.js +260 -0
  156. package/dist/domain/frontendContracts.js.map +1 -0
  157. package/dist/domain/identity.d.ts +21 -0
  158. package/dist/domain/identity.js +47 -0
  159. package/dist/domain/identity.js.map +1 -0
  160. package/dist/domain/referenceCorrectionIdentity.d.ts +40 -0
  161. package/dist/domain/referenceCorrectionIdentity.js +77 -0
  162. package/dist/domain/referenceCorrectionIdentity.js.map +1 -0
  163. package/dist/domain/referenceCorrectionWorkflow.d.ts +160 -0
  164. package/dist/domain/referenceCorrectionWorkflow.js +165 -0
  165. package/dist/domain/referenceCorrectionWorkflow.js.map +1 -0
  166. package/dist/domain/referenceFidelityProjection.d.ts +65 -0
  167. package/dist/domain/referenceFidelityProjection.js +135 -0
  168. package/dist/domain/referenceFidelityProjection.js.map +1 -0
  169. package/dist/domain/relationships.d.ts +210 -0
  170. package/dist/domain/relationships.js +352 -0
  171. package/dist/domain/relationships.js.map +1 -0
  172. package/dist/domain/schema.d.ts +269 -0
  173. package/dist/domain/schema.js +442 -0
  174. package/dist/domain/schema.js.map +1 -0
  175. package/dist/domain/scrollEvidence.d.ts +51 -0
  176. package/dist/domain/scrollEvidence.js +134 -0
  177. package/dist/domain/scrollEvidence.js.map +1 -0
  178. package/dist/index.d.ts +114 -0
  179. package/dist/index.js +64 -0
  180. package/dist/index.js.map +1 -0
  181. package/dist/projectWorkflow/aliasCatalog.d.ts +21 -0
  182. package/dist/projectWorkflow/aliasCatalog.js +67 -0
  183. package/dist/projectWorkflow/aliasCatalog.js.map +1 -0
  184. package/dist/projectWorkflow/checkAcceptance.d.ts +25 -0
  185. package/dist/projectWorkflow/checkAcceptance.js +55 -0
  186. package/dist/projectWorkflow/checkAcceptance.js.map +1 -0
  187. package/dist/projectWorkflow/checkResult.d.ts +85 -0
  188. package/dist/projectWorkflow/checkResult.js +101 -0
  189. package/dist/projectWorkflow/checkResult.js.map +1 -0
  190. package/dist/projectWorkflow/projectConfig.d.ts +43 -0
  191. package/dist/projectWorkflow/projectConfig.js +84 -0
  192. package/dist/projectWorkflow/projectConfig.js.map +1 -0
  193. package/dist/projectWorkflow/projectDiscovery.d.ts +9 -0
  194. package/dist/projectWorkflow/projectDiscovery.js +20 -0
  195. package/dist/projectWorkflow/projectDiscovery.js.map +1 -0
  196. package/dist/projectWorkflow/projectPaths.d.ts +8 -0
  197. package/dist/projectWorkflow/projectPaths.js +23 -0
  198. package/dist/projectWorkflow/projectPaths.js.map +1 -0
  199. package/dist/request/paths.d.ts +14 -0
  200. package/dist/request/paths.js +33 -0
  201. package/dist/request/paths.js.map +1 -0
  202. package/dist/request/request.d.ts +111 -0
  203. package/dist/request/request.js +464 -0
  204. package/dist/request/request.js.map +1 -0
  205. package/dist/safety/policy.d.ts +14 -0
  206. package/dist/safety/policy.js +81 -0
  207. package/dist/safety/policy.js.map +1 -0
  208. package/dist/viewer/assets/index-CN_yb9Uf.css +1 -0
  209. package/dist/viewer/assets/index-D98S1_2d.js +9 -0
  210. package/dist/viewer/icons/icon-192.png +0 -0
  211. package/dist/viewer/icons/icon-512.png +0 -0
  212. package/dist/viewer/index.html +15 -0
  213. package/dist/viewer/manifest.webmanifest +1 -0
  214. package/dist/viewer/registerSW.js +1 -0
  215. package/dist/viewer/sw.js +1 -0
  216. package/dist/viewer/workbox-9c191d2f.js +1 -0
  217. package/dist/viewerServer/context.d.ts +48 -0
  218. package/dist/viewerServer/context.js +60 -0
  219. package/dist/viewerServer/context.js.map +1 -0
  220. package/dist/viewerServer/evidence/classify.d.ts +59 -0
  221. package/dist/viewerServer/evidence/classify.js +124 -0
  222. package/dist/viewerServer/evidence/classify.js.map +1 -0
  223. package/dist/viewerServer/evidence/comparisonView.d.ts +28 -0
  224. package/dist/viewerServer/evidence/comparisonView.js +43 -0
  225. package/dist/viewerServer/evidence/comparisonView.js.map +1 -0
  226. package/dist/viewerServer/evidence/contextSourceView.d.ts +25 -0
  227. package/dist/viewerServer/evidence/contextSourceView.js +20 -0
  228. package/dist/viewerServer/evidence/contextSourceView.js.map +1 -0
  229. package/dist/viewerServer/evidence/discovery.d.ts +31 -0
  230. package/dist/viewerServer/evidence/discovery.js +78 -0
  231. package/dist/viewerServer/evidence/discovery.js.map +1 -0
  232. package/dist/viewerServer/evidence/evaluationView.d.ts +32 -0
  233. package/dist/viewerServer/evidence/evaluationView.js +50 -0
  234. package/dist/viewerServer/evidence/evaluationView.js.map +1 -0
  235. package/dist/viewerServer/evidence/handles.d.ts +21 -0
  236. package/dist/viewerServer/evidence/handles.js +43 -0
  237. package/dist/viewerServer/evidence/handles.js.map +1 -0
  238. package/dist/viewerServer/evidence/index.d.ts +41 -0
  239. package/dist/viewerServer/evidence/index.js +82 -0
  240. package/dist/viewerServer/evidence/index.js.map +1 -0
  241. package/dist/viewerServer/evidence/limits.d.ts +27 -0
  242. package/dist/viewerServer/evidence/limits.js +28 -0
  243. package/dist/viewerServer/evidence/limits.js.map +1 -0
  244. package/dist/viewerServer/evidence/linkedEvidence.d.ts +43 -0
  245. package/dist/viewerServer/evidence/linkedEvidence.js +151 -0
  246. package/dist/viewerServer/evidence/linkedEvidence.js.map +1 -0
  247. package/dist/viewerServer/evidence/mediaResolver.d.ts +16 -0
  248. package/dist/viewerServer/evidence/mediaResolver.js +85 -0
  249. package/dist/viewerServer/evidence/mediaResolver.js.map +1 -0
  250. package/dist/viewerServer/evidence/observationView.d.ts +29 -0
  251. package/dist/viewerServer/evidence/observationView.js +46 -0
  252. package/dist/viewerServer/evidence/observationView.js.map +1 -0
  253. package/dist/viewerServer/evidence/pathSafety.d.ts +11 -0
  254. package/dist/viewerServer/evidence/pathSafety.js +31 -0
  255. package/dist/viewerServer/evidence/pathSafety.js.map +1 -0
  256. package/dist/viewerServer/evidence/projection.d.ts +55 -0
  257. package/dist/viewerServer/evidence/projection.js +152 -0
  258. package/dist/viewerServer/evidence/projection.js.map +1 -0
  259. package/dist/viewerServer/evidence/referenceView.d.ts +133 -0
  260. package/dist/viewerServer/evidence/referenceView.js +169 -0
  261. package/dist/viewerServer/evidence/referenceView.js.map +1 -0
  262. package/dist/viewerServer/httpServer.d.ts +27 -0
  263. package/dist/viewerServer/httpServer.js +381 -0
  264. package/dist/viewerServer/httpServer.js.map +1 -0
  265. package/dist/viewerServer/openBrowser.d.ts +7 -0
  266. package/dist/viewerServer/openBrowser.js +32 -0
  267. package/dist/viewerServer/openBrowser.js.map +1 -0
  268. package/dist/viewerServer/port.d.ts +16 -0
  269. package/dist/viewerServer/port.js +19 -0
  270. package/dist/viewerServer/port.js.map +1 -0
  271. package/dist/viewerServer/viewerService.d.ts +62 -0
  272. package/dist/viewerServer/viewerService.js +88 -0
  273. package/dist/viewerServer/viewerService.js.map +1 -0
  274. package/docs/ARCHITECTURE.md +1286 -0
  275. package/docs/CI_CD.md +250 -0
  276. package/docs/COMMANDS.md +972 -0
  277. package/docs/CONTRACTS.md +1856 -0
  278. package/docs/CURRENT_STATE.md +1049 -0
  279. package/docs/DEVELOPMENT.md +202 -0
  280. package/docs/DOCUMENTATION_PRESERVATION_POLICY.md +50 -0
  281. package/docs/PROJECT_DESCRIPTION.md +2221 -0
  282. package/docs/PROJECT_MILESTONES.md +2526 -0
  283. package/docs/PROJECT_OVERVIEW.md +150 -0
  284. package/docs/QUICKSTART.md +83 -0
  285. package/docs/RELEASE.md +27 -0
  286. package/docs/ROADMAP.md +641 -0
  287. package/docs/SECURITY.md +218 -0
  288. package/docs/WORKFLOWS.md +642 -0
  289. package/docs/plans/v0.8-implementation-plan.md +655 -0
  290. package/docs/plans/v0.8.1-cli-usability-patch-plan.md +505 -0
  291. package/docs/reports/v0.7-bounded-fidelity-context-prompt7.md +243 -0
  292. package/docs/reports/v0.7-implementation-completeness-documentation-reconciliation.md +497 -0
  293. package/docs/reports/v0.7-pre-release-readiness.md +337 -0
  294. package/docs/reports/v0.7-reference-binding-prompt5.md +223 -0
  295. package/docs/reports/v0.7-reference-compatibility-prompt4.md +234 -0
  296. package/docs/reports/v0.7-reference-correction-workflow-prompt8.md +222 -0
  297. package/docs/reports/v0.7-reference-fidelity-prompt6.md +216 -0
  298. package/docs/reports/v0.7-reference-foundation-prompt1.md +151 -0
  299. package/docs/reports/v0.7-reference-regions-prompt2.md +195 -0
  300. package/docs/reports/v0.7-reference-requirements-prompt3.md +217 -0
  301. package/docs/reports/v0.7-release-prep.md +423 -0
  302. package/docs/reports/v0.8-binding-fidelity-interaction-batch6.md +279 -0
  303. package/docs/reports/v0.8-bounded-context-correlation-batch7.md +233 -0
  304. package/docs/reports/v0.8-comparison-contract-inspection-batch4.md +279 -0
  305. package/docs/reports/v0.8-evidence-index-readers-batch2.md +247 -0
  306. package/docs/reports/v0.8-implementation-completeness-documentation-reconciliation.md +741 -0
  307. package/docs/reports/v0.8-integrated-viewer-acceptance-batch8.md +128 -0
  308. package/docs/reports/v0.8-observation-svg-inspection-batch3.md +223 -0
  309. package/docs/reports/v0.8-prerelease-readiness-cross-platform-security-code-rot.md +687 -0
  310. package/docs/reports/v0.8-reference-candidate-inspection-batch5.md +232 -0
  311. package/docs/reports/v0.8-viewer-runtime-pwa-batch1.md +278 -0
  312. package/docs/reports/v0.8.1-check-orchestration-prompt2.md +69 -0
  313. package/docs/reports/v0.8.1-implementation-completeness-documentation-reconciliation.md +114 -0
  314. package/docs/reports/v0.8.1-prerelease-readiness-cross-platform-security-code-rot.md +170 -0
  315. package/docs/reports/v0.8.1-project-workflow-foundation-prompt1.md +66 -0
  316. package/package.json +58 -0
@@ -0,0 +1,62 @@
1
+ import type { Page, Locator, ElementHandle } from 'playwright';
2
+ import type { EvidenceField } from '../domain/evidence.js';
3
+ import type { Diagnostic } from '../domain/diagnostics.js';
4
+ import type { NamedTarget, Viewport } from '../request/request.js';
5
+ import type { TargetEvidenceRecord, TargetLocatorAttempt, TargetResolution } from '../domain/schema.js';
6
+ /**
7
+ * Captures the v0.1 minimum page evidence (docs/PROJECT_MILESTONES.md
8
+ * "Minimum page evidence") from the already-navigated, already-ready page.
9
+ * `documentWidth`/`documentHeight` are the one explicitly *derived* pair -
10
+ * max(scroll, client) in each axis - everything else is a direct browser
11
+ * read, per the Batch 1 evidence-source model.
12
+ */
13
+ export declare function capturePageEvidence(page: Page, requestedUrl: string, viewport: Viewport): Promise<Record<string, EvidenceField<unknown>>>;
14
+ export interface TargetEvidenceCaptureResult {
15
+ targetEvidence: Record<string, TargetEvidenceRecord>;
16
+ diagnostics: Diagnostic[];
17
+ }
18
+ export interface ResolvedTargetInfo {
19
+ name: string;
20
+ attempts: TargetLocatorAttempt[];
21
+ status: TargetResolution['selectionStatus'];
22
+ selectedIndex?: number;
23
+ locator?: Locator;
24
+ handle?: ElementHandle<Element>;
25
+ unavailableReason?: string;
26
+ }
27
+ /**
28
+ * Looks up one already-resolved configured target by its stable observer
29
+ * name (case-insensitively, matching the same case-insensitive comparison
30
+ * `request.ts#normalizeRequest` already uses for target-name uniqueness) -
31
+ * never a second locator/resolution algorithm, just a lookup into the
32
+ * `resolveConfiguredTargets` result already computed once for this
33
+ * observation.
34
+ */
35
+ export declare function findResolvedTarget(resolved: readonly ResolvedTargetInfo[], name: string): ResolvedTargetInfo | undefined;
36
+ /**
37
+ * The one canonical target-resolution algorithm (Phase 1 of the v0.2 Batch 3
38
+ * three-phase design below), exported so v0.3 Batch 2 scroll-scenario
39
+ * runtime-snapshot capture can resolve configured targets exactly once and
40
+ * reuse the same live `{locator, handle}` pairs across its initial/final
41
+ * snapshots, instead of re-implementing resolution with different locator
42
+ * semantics. Callers own disposing any returned `handle`.
43
+ */
44
+ export declare function resolveConfiguredTargets(page: Page, targets: readonly NamedTarget[]): Promise<ResolvedTargetInfo[]>;
45
+ /**
46
+ * Observes every explicitly configured target from the same live page,
47
+ * honoring the frozen ordered-locator resolution contract: 0 matches tries
48
+ * the next locator; exactly 1 match selects and stops; more than 1 match is
49
+ * ambiguous and stops (never falls through); an unevaluable locator is
50
+ * unavailable and stops (never falls through). Ambiguity never triggers
51
+ * fallback.
52
+ *
53
+ * Batch 3 restructures this into three phases over one resolved set: (1)
54
+ * resolve every configured target exactly once, keeping a live
55
+ * `{locator, handle}` for each match; (2) compute bounded pairwise DOM
56
+ * containment among only the resolved configured targets, reusing those
57
+ * same handles (never re-resolving, never a second/independent resolution
58
+ * algorithm); (3) measure every resolved target and assemble its evidence,
59
+ * attaching the phase-2 containment result. Every handle is disposed once,
60
+ * after all three phases, regardless of outcome.
61
+ */
62
+ export declare function captureTargetEvidence(page: Page, targets: readonly NamedTarget[]): Promise<TargetEvidenceCaptureResult>;
@@ -0,0 +1,500 @@
1
+ import { DIAGNOSTIC_SEVERITY } from '../domain/diagnostics.js';
2
+ import { TARGET_LANDMARK_ROLES } from '../domain/schema.js';
3
+ function diagnostic(code, message, targetName) {
4
+ const base = { code, severity: DIAGNOSTIC_SEVERITY[code], message };
5
+ return targetName === undefined ? base : { ...base, targetName };
6
+ }
7
+ function browserField(value) {
8
+ return { state: 'available', source: 'browser', value };
9
+ }
10
+ function derivedField(value, derivedFrom) {
11
+ return { state: 'available', source: 'derived', value, derivedFrom };
12
+ }
13
+ function computedField(value) {
14
+ return { state: 'available', source: 'computed-browser', value };
15
+ }
16
+ function unavailableField(reason) {
17
+ return { state: 'unavailable', reason };
18
+ }
19
+ /**
20
+ * Captures the v0.1 minimum page evidence (docs/PROJECT_MILESTONES.md
21
+ * "Minimum page evidence") from the already-navigated, already-ready page.
22
+ * `documentWidth`/`documentHeight` are the one explicitly *derived* pair -
23
+ * max(scroll, client) in each axis - everything else is a direct browser
24
+ * read, per the Batch 1 evidence-source model.
25
+ */
26
+ export async function capturePageEvidence(page, requestedUrl, viewport) {
27
+ const raw = await page.evaluate(() => ({
28
+ title: document.title,
29
+ windowScrollX: window.scrollX,
30
+ windowScrollY: window.scrollY,
31
+ documentScrollWidth: document.documentElement.scrollWidth,
32
+ documentScrollHeight: document.documentElement.scrollHeight,
33
+ documentClientWidth: document.documentElement.clientWidth,
34
+ documentClientHeight: document.documentElement.clientHeight,
35
+ }));
36
+ const documentWidth = Math.max(raw.documentScrollWidth, raw.documentClientWidth);
37
+ const documentHeight = Math.max(raw.documentScrollHeight, raw.documentClientHeight);
38
+ return {
39
+ requestedUrl: browserField(requestedUrl),
40
+ finalUrl: browserField(page.url()),
41
+ title: browserField(raw.title),
42
+ viewportWidth: browserField(viewport.width),
43
+ viewportHeight: browserField(viewport.height),
44
+ devicePixelRatio: browserField(await page.evaluate(() => window.devicePixelRatio)),
45
+ documentScrollWidth: browserField(raw.documentScrollWidth),
46
+ documentScrollHeight: browserField(raw.documentScrollHeight),
47
+ documentClientWidth: browserField(raw.documentClientWidth),
48
+ documentClientHeight: browserField(raw.documentClientHeight),
49
+ documentWidth: derivedField(documentWidth, ['documentScrollWidth', 'documentClientWidth']),
50
+ documentHeight: derivedField(documentHeight, ['documentScrollHeight', 'documentClientHeight']),
51
+ windowScrollX: browserField(raw.windowScrollX),
52
+ windowScrollY: browserField(raw.windowScrollY),
53
+ };
54
+ }
55
+ /**
56
+ * Extracts only the target element's own role/name from a Playwright
57
+ * `ariaSnapshot()` string (e.g. `- button "Click me"`), never its
58
+ * descendants - bounded, target-local semantic evidence, not an
59
+ * accessibility-tree dump. A generic `- text: ...` line (no distinct ARIA
60
+ * role) or an empty snapshot both mean "no reliable role/name", not a role
61
+ * of "text".
62
+ */
63
+ function parseAriaSnapshotFirstLine(snapshot) {
64
+ const firstLine = snapshot.split('\n')[0]?.trim();
65
+ if (!firstLine)
66
+ return undefined;
67
+ // No trailing `$` anchor: an element with no accessible name still produces
68
+ // a role line with unquoted trailing content (e.g. `- banner: Site Header`,
69
+ // verified empirically against real Chromium), which must still yield the
70
+ // role even though there is no quoted, genuinely-computed accessible name
71
+ // to report - trailing unquoted text is never treated as a name.
72
+ const match = /^-\s+([A-Za-z][\w-]*)\s*(?:"([^"]*)")?:?/.exec(firstLine);
73
+ if (!match)
74
+ return undefined;
75
+ const role = match[1];
76
+ const name = match[2];
77
+ if (role === undefined || role === 'text')
78
+ return undefined;
79
+ return name !== undefined && name.length > 0 ? { role, name } : { role };
80
+ }
81
+ /** Builds the shared unresolved-target evidence record (not-found/ambiguous/unavailable) with the full ordered attempt history and no selected locator. Containment is reported separately by the caller (its own "self unresolved" reason differs from the measurement-unavailable reason used here). */
82
+ function unresolvedTargetRecord(selectionStatus, attempts, reason, containment) {
83
+ const resolution = {
84
+ selectionMethod: 'ordered-locators',
85
+ selectionStatus,
86
+ usedFallback: false,
87
+ confidence: 'none',
88
+ attempts,
89
+ };
90
+ return {
91
+ resolution: { state: 'available', source: 'derived', value: resolution, derivedFrom: ['locator-attempts'] },
92
+ tag: unavailableField(reason),
93
+ geometry: unavailableField(reason),
94
+ style: unavailableField(reason),
95
+ layout: unavailableField(reason),
96
+ visibility: unavailableField(reason),
97
+ semantics: unavailableField(reason),
98
+ semanticState: unavailableField(reason),
99
+ landmark: unavailableField(reason),
100
+ containment,
101
+ };
102
+ }
103
+ const TARGET_LANDMARK_ROLE_SET = new Set(TARGET_LANDMARK_ROLES);
104
+ /**
105
+ * Reads the resolved element's own native form-control properties and
106
+ * explicit `aria-*` attributes: bounded, target-local browser/ARIA state.
107
+ * `ariaSnapshot()`'s bracket annotations were verified empirically (real
108
+ * Chromium via the installed Playwright 1.62.1) to appear only for
109
+ * true/mixed values - they cannot distinguish an explicit false from "not
110
+ * applicable to this element", and they never expose `aria-current` at all.
111
+ * This direct property/attribute read is the investigated, honest
112
+ * alternative for exactly those two gaps; it still reads only real
113
+ * browser-native/ARIA semantics (never class names, CSS, text content, or
114
+ * source ownership). A key is present in the result only when the browser
115
+ * exposes that state as applicable to this specific element.
116
+ */
117
+ async function captureSemanticState(handle) {
118
+ return handle.evaluate((el) => {
119
+ const result = {};
120
+ const ariaDisabled = el.getAttribute('aria-disabled');
121
+ const nativeDisabled = 'disabled' in el ? Boolean(el.disabled) : false;
122
+ if (nativeDisabled || ariaDisabled !== null)
123
+ result.disabled = nativeDisabled || ariaDisabled === 'true';
124
+ const ariaExpanded = el.getAttribute('aria-expanded');
125
+ if (ariaExpanded !== null)
126
+ result.expanded = ariaExpanded === 'true';
127
+ const ariaChecked = el.getAttribute('aria-checked');
128
+ const isNativeCheckable = el instanceof HTMLInputElement && (el.type === 'checkbox' || el.type === 'radio');
129
+ if (ariaChecked !== null) {
130
+ result.checked = ariaChecked === 'mixed' ? 'mixed' : ariaChecked === 'true';
131
+ }
132
+ else if (isNativeCheckable) {
133
+ result.checked = el.indeterminate ? 'mixed' : el.checked;
134
+ }
135
+ const ariaSelected = el.getAttribute('aria-selected');
136
+ if (ariaSelected !== null)
137
+ result.selected = ariaSelected === 'true';
138
+ const ariaPressed = el.getAttribute('aria-pressed');
139
+ if (ariaPressed !== null)
140
+ result.pressed = ariaPressed === 'mixed' ? 'mixed' : ariaPressed === 'true';
141
+ const ariaCurrent = el.getAttribute('aria-current');
142
+ if (ariaCurrent !== null && ariaCurrent !== 'false' && ariaCurrent.length > 0) {
143
+ result.current = ariaCurrent === 'true' ? true : ariaCurrent;
144
+ }
145
+ return result;
146
+ });
147
+ }
148
+ /** Wraps the raw captured state: an empty object means no supported state applies to this target ("not-applicable"), never an unexplained empty available value. */
149
+ function semanticStateEvidence(raw) {
150
+ if (Object.keys(raw).length === 0) {
151
+ return { state: 'not-applicable', reason: 'no supported semantic state is exposed for this target' };
152
+ }
153
+ return { state: 'available', source: 'computed-browser', value: raw };
154
+ }
155
+ /** Derives landmark identity from the already-captured browser-exposed role only - never from locator kind or HTML tag (Section 15). */
156
+ function landmarkEvidence(role) {
157
+ if (role === undefined)
158
+ return unavailableField('no distinct accessible role is exposed for this target');
159
+ if (TARGET_LANDMARK_ROLE_SET.has(role)) {
160
+ return { state: 'available', source: 'derived', value: role, derivedFrom: ['semantics.role'] };
161
+ }
162
+ return { state: 'not-applicable', reason: `role "${role}" is not a recognized landmark role` };
163
+ }
164
+ /**
165
+ * Wraps a computed configured-target-only containment result into the
166
+ * persisted EvidenceField. `selfUnresolvedReason` covers the case where the
167
+ * current target itself never resolved (Section 18: containment is
168
+ * `unavailable`, not partial, when there is no resolved element to check
169
+ * containment for). A computed result with any `unresolvedTargetIds` is
170
+ * `partial` (already-proven relationships are preserved, never dropped);
171
+ * with none, it is `available`.
172
+ */
173
+ function containmentEvidence(computed, selfUnresolvedReason) {
174
+ if (selfUnresolvedReason !== undefined)
175
+ return { state: 'unavailable', reason: selfUnresolvedReason };
176
+ if (!computed)
177
+ return { state: 'unavailable', reason: 'containment could not be computed' };
178
+ if (computed.unresolvedTargetIds.length > 0) {
179
+ return {
180
+ state: 'partial',
181
+ source: 'browser',
182
+ value: computed,
183
+ reason: `containment could not be evaluated against: ${computed.unresolvedTargetIds.join(', ')}`,
184
+ };
185
+ }
186
+ return { state: 'available', source: 'browser', value: computed };
187
+ }
188
+ /**
189
+ * Captures the full target evidence for one resolved (single-match) target
190
+ * element, from the same live page/readiness state as the page evidence and
191
+ * screenshot: tag/geometry/style/layout/visibility (v0.1), role/name
192
+ * semantics (v0.1, via `ariaSnapshot()`), and semantic state/landmark
193
+ * (Batch 3). Takes an already-resolved `{ locator, handle }` pair - not a
194
+ * raw CSS selector, and never re-resolves - so every locator kind converges
195
+ * on this one measurement path and containment (computed once by the caller
196
+ * across every resolved target before this runs) is simply passed through.
197
+ */
198
+ async function captureResolvedTargetRecord(target, handle, attempts, selectedLocatorIndex, containment) {
199
+ const raw = await handle.evaluate((el) => {
200
+ const rect = el.getBoundingClientRect();
201
+ const computed = getComputedStyle(el);
202
+ return {
203
+ tag: el.tagName.toLowerCase(),
204
+ geometry: { x: rect.x, y: rect.y, width: rect.width, height: rect.height, right: rect.right, bottom: rect.bottom },
205
+ style: { display: computed.display, position: computed.position, overflowX: computed.overflowX, overflowY: computed.overflowY },
206
+ layout: {
207
+ scrollWidth: el.scrollWidth,
208
+ scrollHeight: el.scrollHeight,
209
+ clientWidth: el.clientWidth,
210
+ clientHeight: el.clientHeight,
211
+ scrollTop: el.scrollTop,
212
+ scrollLeft: el.scrollLeft,
213
+ },
214
+ computedVisibility: computed.visibility,
215
+ };
216
+ });
217
+ const visible = raw.style.display !== 'none' && raw.computedVisibility !== 'hidden' && raw.geometry.width > 0 && raw.geometry.height > 0;
218
+ let semantics;
219
+ let resolvedRole;
220
+ try {
221
+ const snapshot = await target.ariaSnapshot();
222
+ const parsed = parseAriaSnapshotFirstLine(snapshot);
223
+ semantics = parsed ? computedField(parsed) : unavailableField('no distinct accessible role/name is exposed for this target');
224
+ resolvedRole = parsed?.role;
225
+ }
226
+ catch (err) {
227
+ const message = err instanceof Error ? err.message : String(err);
228
+ semantics = unavailableField(`accessibility snapshot failed: ${message}`);
229
+ }
230
+ let semanticState;
231
+ try {
232
+ semanticState = semanticStateEvidence(await captureSemanticState(handle));
233
+ }
234
+ catch (err) {
235
+ const message = err instanceof Error ? err.message : String(err);
236
+ semanticState = unavailableField(`semantic-state evaluation failed: ${message}`);
237
+ }
238
+ const resolution = {
239
+ selectionMethod: 'ordered-locators',
240
+ selectionStatus: 'matched',
241
+ selectedLocatorKind: attempts[selectedLocatorIndex]?.locatorKind ?? 'css',
242
+ selectedLocatorIndex,
243
+ usedFallback: selectedLocatorIndex > 0,
244
+ confidence: 'exact',
245
+ attempts,
246
+ };
247
+ return {
248
+ record: {
249
+ resolution: { state: 'available', source: 'derived', value: resolution, derivedFrom: ['locator-attempts'] },
250
+ tag: browserField(raw.tag),
251
+ geometry: browserField(raw.geometry),
252
+ style: computedField(raw.style),
253
+ layout: browserField(raw.layout),
254
+ visibility: derivedField({ visible }, ['style.display', 'computed-visibility', 'geometry.width', 'geometry.height']),
255
+ semantics,
256
+ semanticState,
257
+ landmark: landmarkEvidence(resolvedRole),
258
+ containment,
259
+ },
260
+ visible,
261
+ };
262
+ }
263
+ /**
264
+ * A CSS quoted-string literal for an attribute selector value (`[attr="..."]`).
265
+ * Only backslash and double-quote need escaping inside a CSS quoted string;
266
+ * this keeps the configured id/data-attribute value literal - it is never
267
+ * reinterpreted as selector syntax (e.g. a value containing `#`, `.`, `[`,
268
+ * or `"` still matches exactly, it cannot escape the attribute-value
269
+ * position it was placed in).
270
+ */
271
+ function cssAttributeValueLiteral(value) {
272
+ return `"${value.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`;
273
+ }
274
+ /**
275
+ * Maps one frozen v0.2 TargetLocator to the Playwright `Locator` that
276
+ * resolves it - the single point where locator kind becomes a real browser
277
+ * query. `role`/`text` use Playwright's own semantic locators (real
278
+ * accessibility-tree/text resolution, not a hand-rolled approximation);
279
+ * `id`/`data-attribute` use an exact CSS attribute-equals selector (never
280
+ * `#id`/bare-value syntax, so the configured value can never be
281
+ * reinterpreted as selector syntax); `semantic-element` uses a plain tag
282
+ * selector from the Batch 1 frozen tag set; `css` is unchanged v0.1
283
+ * behavior. Every kind converges on the same Playwright `Locator` type, so
284
+ * cardinality/measurement downstream never branches on locator kind again.
285
+ */
286
+ function buildPlaywrightLocator(page, locator) {
287
+ switch (locator.kind) {
288
+ case 'css':
289
+ return page.locator(locator.selector);
290
+ case 'id':
291
+ return page.locator(`[id=${cssAttributeValueLiteral(locator.value)}]`);
292
+ case 'data-attribute':
293
+ return page.locator(`[${locator.attribute}=${cssAttributeValueLiteral(locator.value)}]`);
294
+ case 'semantic-element':
295
+ return page.locator(locator.tag);
296
+ case 'role':
297
+ return page.getByRole(locator.role, locator.name === undefined ? undefined : { name: locator.name, exact: true });
298
+ case 'text':
299
+ return page.getByText(locator.text, { exact: true });
300
+ }
301
+ }
302
+ /**
303
+ * Evaluates one locator against the live page: builds its real Playwright
304
+ * `Locator` and measures cardinality via `.count()` (no waiting, no
305
+ * `.first()`/`.nth(0)` shortcut that would silently resolve an ambiguous
306
+ * match). A locator that cannot be constructed or counted reliably is
307
+ * `unavailable`, never silently treated as zero matches.
308
+ */
309
+ async function evaluateLocatorAttempt(page, locator) {
310
+ try {
311
+ const playwrightLocator = buildPlaywrightLocator(page, locator);
312
+ const matchCount = await playwrightLocator.count();
313
+ if (matchCount === 0)
314
+ return { playwrightLocator, outcome: { status: 'not-found', matchCount: 0 } };
315
+ if (matchCount > 1)
316
+ return { playwrightLocator, outcome: { status: 'ambiguous', matchCount } };
317
+ return { playwrightLocator, outcome: { status: 'matched', matchCount: 1 } };
318
+ }
319
+ catch {
320
+ return { playwrightLocator: undefined, outcome: { status: 'unavailable' } };
321
+ }
322
+ }
323
+ /**
324
+ * Looks up one already-resolved configured target by its stable observer
325
+ * name (case-insensitively, matching the same case-insensitive comparison
326
+ * `request.ts#normalizeRequest` already uses for target-name uniqueness) -
327
+ * never a second locator/resolution algorithm, just a lookup into the
328
+ * `resolveConfiguredTargets` result already computed once for this
329
+ * observation.
330
+ */
331
+ export function findResolvedTarget(resolved, name) {
332
+ const lower = name.toLowerCase();
333
+ return resolved.find((info) => info.name.toLowerCase() === lower);
334
+ }
335
+ /**
336
+ * The one canonical target-resolution algorithm (Phase 1 of the v0.2 Batch 3
337
+ * three-phase design below), exported so v0.3 Batch 2 scroll-scenario
338
+ * runtime-snapshot capture can resolve configured targets exactly once and
339
+ * reuse the same live `{locator, handle}` pairs across its initial/final
340
+ * snapshots, instead of re-implementing resolution with different locator
341
+ * semantics. Callers own disposing any returned `handle`.
342
+ */
343
+ export async function resolveConfiguredTargets(page, targets) {
344
+ const infos = [];
345
+ for (const target of targets) {
346
+ const attempts = [];
347
+ let stopStatus;
348
+ let matchedIndex;
349
+ let matchedPlaywrightLocator;
350
+ for (let index = 0; index < target.locators.length; index += 1) {
351
+ const locator = target.locators[index];
352
+ const { playwrightLocator, outcome } = await evaluateLocatorAttempt(page, locator);
353
+ attempts.push({
354
+ locatorIndex: index,
355
+ locatorKind: locator.kind,
356
+ status: outcome.status,
357
+ ...(outcome.matchCount !== undefined ? { matchCount: outcome.matchCount } : {}),
358
+ });
359
+ if (outcome.status === 'matched' && playwrightLocator) {
360
+ stopStatus = 'matched';
361
+ matchedIndex = index;
362
+ matchedPlaywrightLocator = playwrightLocator;
363
+ break;
364
+ }
365
+ if (outcome.status === 'ambiguous') {
366
+ stopStatus = 'ambiguous';
367
+ break;
368
+ }
369
+ if (outcome.status === 'unavailable') {
370
+ stopStatus = 'unavailable';
371
+ break;
372
+ }
373
+ // 'not-found': fall through to the next configured locator.
374
+ }
375
+ if (stopStatus === 'matched' && matchedPlaywrightLocator && matchedIndex !== undefined) {
376
+ try {
377
+ const handles = await matchedPlaywrightLocator.elementHandles();
378
+ const handle = handles[0];
379
+ if (handle) {
380
+ infos.push({
381
+ name: target.name,
382
+ attempts,
383
+ status: 'matched',
384
+ selectedIndex: matchedIndex,
385
+ locator: matchedPlaywrightLocator,
386
+ handle: handle,
387
+ });
388
+ }
389
+ else {
390
+ infos.push({ name: target.name, attempts, status: 'not-found' });
391
+ }
392
+ }
393
+ catch (err) {
394
+ const message = err instanceof Error ? err.message : String(err);
395
+ infos.push({ name: target.name, attempts, status: 'unavailable', unavailableReason: `target evaluation failed: ${message}` });
396
+ }
397
+ }
398
+ else if (stopStatus === 'ambiguous') {
399
+ infos.push({ name: target.name, attempts, status: 'ambiguous' });
400
+ }
401
+ else if (stopStatus === 'unavailable') {
402
+ infos.push({ name: target.name, attempts, status: 'unavailable' });
403
+ }
404
+ else {
405
+ infos.push({ name: target.name, attempts, status: 'not-found' });
406
+ }
407
+ }
408
+ return infos;
409
+ }
410
+ /**
411
+ * Observes every explicitly configured target from the same live page,
412
+ * honoring the frozen ordered-locator resolution contract: 0 matches tries
413
+ * the next locator; exactly 1 match selects and stops; more than 1 match is
414
+ * ambiguous and stops (never falls through); an unevaluable locator is
415
+ * unavailable and stops (never falls through). Ambiguity never triggers
416
+ * fallback.
417
+ *
418
+ * Batch 3 restructures this into three phases over one resolved set: (1)
419
+ * resolve every configured target exactly once, keeping a live
420
+ * `{locator, handle}` for each match; (2) compute bounded pairwise DOM
421
+ * containment among only the resolved configured targets, reusing those
422
+ * same handles (never re-resolving, never a second/independent resolution
423
+ * algorithm); (3) measure every resolved target and assemble its evidence,
424
+ * attaching the phase-2 containment result. Every handle is disposed once,
425
+ * after all three phases, regardless of outcome.
426
+ */
427
+ export async function captureTargetEvidence(page, targets) {
428
+ const targetEvidence = {};
429
+ const diagnostics = [];
430
+ // Phase 1: resolve every configured target exactly once.
431
+ const infos = await resolveConfiguredTargets(page, targets);
432
+ try {
433
+ // Phase 2: bounded pairwise DOM containment among the configured targets
434
+ // only (never unconfigured ancestors), in configured target order.
435
+ const containmentByName = new Map();
436
+ for (const info of infos) {
437
+ if (info.status !== 'matched' || !info.handle)
438
+ continue;
439
+ const selfHandle = info.handle;
440
+ const containedByTargetIds = [];
441
+ const evaluatedTargetIds = [];
442
+ const unresolvedTargetIds = [];
443
+ for (const other of infos) {
444
+ if (other.name === info.name)
445
+ continue;
446
+ if (other.status === 'matched' && other.handle) {
447
+ evaluatedTargetIds.push(other.name);
448
+ const contains = await other.handle.evaluate((elOther, elSelf) => elOther !== elSelf && elOther.contains(elSelf), selfHandle);
449
+ if (contains)
450
+ containedByTargetIds.push(other.name);
451
+ }
452
+ else {
453
+ unresolvedTargetIds.push(other.name);
454
+ }
455
+ }
456
+ containmentByName.set(info.name, containmentEvidence({ containedByTargetIds, evaluatedTargetIds, unresolvedTargetIds }, undefined));
457
+ }
458
+ // Phase 3: measure resolved targets and assemble every target's evidence.
459
+ for (const info of infos) {
460
+ if (info.status === 'matched' && info.locator && info.handle && info.selectedIndex !== undefined) {
461
+ try {
462
+ const containment = containmentByName.get(info.name) ?? containmentEvidence(undefined, 'containment could not be computed');
463
+ const { record, visible } = await captureResolvedTargetRecord(info.locator, info.handle, info.attempts, info.selectedIndex, containment);
464
+ targetEvidence[info.name] = record;
465
+ if (!visible) {
466
+ diagnostics.push(diagnostic('target-hidden', `target "${info.name}" resolved but is not visible`, info.name));
467
+ }
468
+ }
469
+ catch (err) {
470
+ const message = err instanceof Error ? err.message : String(err);
471
+ const reason = `target evaluation failed: ${message}`;
472
+ targetEvidence[info.name] = unresolvedTargetRecord('unavailable', info.attempts, reason, containmentEvidence(undefined, `target itself could not be measured: ${reason}`));
473
+ diagnostics.push(diagnostic('browser-evidence-unavailable', reason, info.name));
474
+ }
475
+ continue;
476
+ }
477
+ const selfUnresolvedReason = `target itself did not resolve (status: ${info.status})`;
478
+ if (info.status === 'ambiguous') {
479
+ const lastAttempt = info.attempts[info.attempts.length - 1];
480
+ const matchCount = lastAttempt?.matchCount ?? 0;
481
+ targetEvidence[info.name] = unresolvedTargetRecord('ambiguous', info.attempts, `target locator matched ${matchCount} elements; expected exactly one`, containmentEvidence(undefined, selfUnresolvedReason));
482
+ diagnostics.push(diagnostic('target-ambiguous', `${matchCount} elements matched a locator for target "${info.name}"`, info.name));
483
+ }
484
+ else if (info.status === 'unavailable') {
485
+ const reason = info.unavailableReason ?? `target locator could not be evaluated reliably for "${info.name}"`;
486
+ targetEvidence[info.name] = unresolvedTargetRecord('unavailable', info.attempts, reason, containmentEvidence(undefined, selfUnresolvedReason));
487
+ diagnostics.push(diagnostic('browser-evidence-unavailable', reason, info.name));
488
+ }
489
+ else {
490
+ targetEvidence[info.name] = unresolvedTargetRecord('not-found', info.attempts, 'no configured locator matched an element', containmentEvidence(undefined, selfUnresolvedReason));
491
+ diagnostics.push(diagnostic('target-missing', `no locator matched an element for target "${info.name}"`, info.name));
492
+ }
493
+ }
494
+ }
495
+ finally {
496
+ await Promise.all(infos.filter((info) => info.handle).map((info) => info.handle.dispose()));
497
+ }
498
+ return { targetEvidence, diagnostics };
499
+ }
500
+ //# sourceMappingURL=evidenceCapture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidenceCapture.js","sourceRoot":"","sources":["../../src/browser/evidenceCapture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { Page } from 'playwright';
2
+ import type { Viewport } from '../request/request.js';
3
+ import type { ScrollRuntimeSnapshot } from '../domain/schema.js';
4
+ import type { ResolvedTargetInfo } from './evidenceCapture.js';
5
+ /**
6
+ * Captures one point-in-time bounded `ScrollRuntimeSnapshot` (Batch 1 frozen
7
+ * contract) from the live page, using already-resolved target handles -
8
+ * never re-resolving targets itself. Called twice by the scenario lifecycle
9
+ * (once before the scroll action, once after stabilization) against the
10
+ * exact same `resolved` set, so "which browser element is target X" is
11
+ * answered exactly once per observation's scenario capture.
12
+ */
13
+ export declare function captureScrollRuntimeSnapshot(page: Page, resolved: readonly ResolvedTargetInfo[], viewport: Viewport): Promise<ScrollRuntimeSnapshot>;
14
+ /**
15
+ * Immediate, non-smooth window scroll using the Batch 1 normalized delta.
16
+ * `behavior: 'instant'` guarantees no smooth-scroll animation regardless of
17
+ * any `scroll-behavior: smooth` the observed page's own CSS declares - the
18
+ * position change is synchronous within this one `evaluate()` call.
19
+ */
20
+ export declare function performWindowScrollBy(page: Page, deltaX: number, deltaY: number): Promise<void>;
21
+ /**
22
+ * Immediate, non-smooth scroll of one uniquely-resolved configured target
23
+ * element, using the same `behavior: 'instant'` primitive as
24
+ * {@link performWindowScrollBy} - one stabilization/execution contract for
25
+ * both action kinds, never a forked one. `element.scrollBy` is a real,
26
+ * browser-native immediate-scroll method on every `Element` (no dependency
27
+ * on the target actually being scrollable - a non-overflowing target simply
28
+ * produces no position change, which is a valid, honestly-reported outcome).
29
+ */
30
+ export declare function performTargetScrollBy(handle: NonNullable<ResolvedTargetInfo['handle']>, deltaX: number, deltaY: number): Promise<void>;
31
+ /** The Batch 1 frozen stabilization contract: exactly two `requestAnimationFrame` cycles on the live page, no timers/sleeps/network-idle substitutes. */
32
+ export declare function waitTwoAnimationFrames(page: Page): Promise<void>;