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