@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,85 @@
1
+ import type { BaselineClause, ContractPrimitive, PerChangeClause } from '../domain/frontendContracts.js';
2
+ import type { FrontendContractEvaluationArtifact } from '../domain/frontendContractEvaluationArtifact.js';
3
+ import type { EvidenceReference } from '../domain/relationships.js';
4
+ import type { ComparisonDifferenceSubject, DifferenceKind } from '../domain/comparison.js';
5
+ import type { ReferenceCandidateFidelityEvaluation, ReferenceRequirementFidelityResult } from '../domain/externalReferenceFidelity.js';
6
+ export declare const CHECK_RESULT_SCHEMA_VERSION: "1.0.0";
7
+ export declare const CHECK_WORKFLOW_STATUSES: readonly ["PASS", "FAIL", "REVIEW_REQUIRED", "BLOCKED"];
8
+ export type CheckWorkflowStatus = (typeof CHECK_WORKFLOW_STATUSES)[number];
9
+ export declare const CHECK_MAX_ITEMS_PER_COLLECTION: 50;
10
+ export declare const CHECK_MAX_SUPPORTING_EVIDENCE_PER_ITEM: 10;
11
+ export interface CheckObservationSummary {
12
+ alias: string;
13
+ observationId: string;
14
+ requestId: string;
15
+ artifactPath: string;
16
+ }
17
+ export interface CheckComparisonSummary {
18
+ state: 'NOT_RUN' | 'BLOCKED' | 'comparable' | 'comparable-with-warnings' | 'incomparable';
19
+ comparisonId?: string;
20
+ artifactPath?: string;
21
+ differenceCount?: number;
22
+ relationshipChangeCount?: number;
23
+ diagnosticsCount?: number;
24
+ }
25
+ export interface CheckClauseProblem {
26
+ clauseId: string;
27
+ source: 'baseline' | 'change';
28
+ category?: 'requested' | 'expected-dependent' | 'protected' | 'preserved';
29
+ primitive: ContractPrimitive;
30
+ status: 'fail' | 'unavailable' | 'conflict';
31
+ reason?: string;
32
+ supportingEvidence: EvidenceReference[];
33
+ }
34
+ export interface CheckUnexpectedChange {
35
+ classification: 'unexpected';
36
+ subject: ComparisonDifferenceSubject;
37
+ differenceKind: DifferenceKind;
38
+ supportingEvidence: EvidenceReference[];
39
+ }
40
+ export interface CheckContractSummary {
41
+ configured: boolean;
42
+ state: 'NOT_CONFIGURED' | 'NOT_RUN' | 'PASS' | 'FAIL' | 'BLOCKED';
43
+ overallVerdict?: 'PASS' | 'FAIL';
44
+ evaluationId?: string;
45
+ artifactPath?: string;
46
+ failedClauses: CheckClauseProblem[];
47
+ unavailableClauses: CheckClauseProblem[];
48
+ unexpectedChanges: CheckUnexpectedChange[];
49
+ truncated: boolean;
50
+ }
51
+ export interface CheckReferenceSummary {
52
+ configured: boolean;
53
+ state: 'NOT_CONFIGURED' | 'NOT_RUN' | 'PASS' | 'FAIL' | 'BLOCKED';
54
+ referenceId?: string;
55
+ fidelityState?: 'not-evaluated' | 'pass' | 'fail';
56
+ blockedBy?: 'reference-inadequate' | 'incompatible';
57
+ failedRequirements: ReferenceRequirementFidelityResult[];
58
+ unavailableRequirements: ReferenceRequirementFidelityResult[];
59
+ truncated: boolean;
60
+ }
61
+ export interface CheckBlocker {
62
+ code: string;
63
+ message: string;
64
+ }
65
+ export interface CheckWorkflowResult {
66
+ schemaVersion: '1.0.0';
67
+ status: CheckWorkflowStatus;
68
+ baseline?: CheckObservationSummary;
69
+ candidate?: CheckObservationSummary;
70
+ comparison: CheckComparisonSummary;
71
+ contract: CheckContractSummary;
72
+ reference: CheckReferenceSummary;
73
+ blockers: CheckBlocker[];
74
+ limits: {
75
+ maxItemsPerCollection: 50;
76
+ maxSupportingEvidencePerItem: 10;
77
+ truncated: boolean;
78
+ };
79
+ }
80
+ export declare function emptyCheckResult(): CheckWorkflowResult;
81
+ /** Project canonical contract evidence without evaluating any clause. */
82
+ export declare function projectContractResult(artifact: FrontendContractEvaluationArtifact, baselineClauses: readonly BaselineClause[], changeClauses: readonly PerChangeClause[], artifactPath: string): CheckContractSummary;
83
+ /** Project canonical in-memory fidelity evidence without inferring bindings. */
84
+ export declare function projectReferenceResult(evaluation: ReferenceCandidateFidelityEvaluation): CheckReferenceSummary;
85
+ export declare function finalizeCheckStatus(result: CheckWorkflowResult): CheckWorkflowResult;
@@ -0,0 +1,101 @@
1
+ export const CHECK_RESULT_SCHEMA_VERSION = '1.0.0';
2
+ export const CHECK_WORKFLOW_STATUSES = ['PASS', 'FAIL', 'REVIEW_REQUIRED', 'BLOCKED'];
3
+ export const CHECK_MAX_ITEMS_PER_COLLECTION = 50;
4
+ export const CHECK_MAX_SUPPORTING_EVIDENCE_PER_ITEM = 10;
5
+ export function emptyCheckResult() {
6
+ return {
7
+ schemaVersion: CHECK_RESULT_SCHEMA_VERSION,
8
+ status: 'BLOCKED',
9
+ comparison: { state: 'NOT_RUN' },
10
+ contract: { configured: false, state: 'NOT_CONFIGURED', failedClauses: [], unavailableClauses: [], unexpectedChanges: [], truncated: false },
11
+ reference: { configured: false, state: 'NOT_CONFIGURED', failedRequirements: [], unavailableRequirements: [], truncated: false },
12
+ blockers: [],
13
+ limits: { maxItemsPerCollection: CHECK_MAX_ITEMS_PER_COLLECTION, maxSupportingEvidencePerItem: CHECK_MAX_SUPPORTING_EVIDENCE_PER_ITEM, truncated: false },
14
+ };
15
+ }
16
+ function boundedEvidence(evidence) {
17
+ return { value: evidence.slice(0, CHECK_MAX_SUPPORTING_EVIDENCE_PER_ITEM), truncated: evidence.length > CHECK_MAX_SUPPORTING_EVIDENCE_PER_ITEM };
18
+ }
19
+ /** Project canonical contract evidence without evaluating any clause. */
20
+ export function projectContractResult(artifact, baselineClauses, changeClauses, artifactPath) {
21
+ const clauses = new Map();
22
+ for (const clause of baselineClauses)
23
+ clauses.set(clause.clauseId, { source: 'baseline', clause });
24
+ for (const clause of changeClauses)
25
+ clauses.set(clause.clauseId, { source: 'change', clause });
26
+ let truncated = false;
27
+ const problems = [];
28
+ for (const result of artifact.clauseResults) {
29
+ if (result.status === 'pass')
30
+ continue;
31
+ const authored = clauses.get(result.clauseId);
32
+ if (authored === undefined)
33
+ continue;
34
+ const evidence = boundedEvidence(result.supportingEvidence);
35
+ truncated ||= evidence.truncated;
36
+ problems.push({
37
+ clauseId: result.clauseId,
38
+ source: authored.source,
39
+ ...(authored.source === 'change' ? { category: authored.clause.category } : {}),
40
+ primitive: authored.clause.primitive,
41
+ status: result.status,
42
+ ...('reason' in result ? { reason: result.reason } : {}),
43
+ supportingEvidence: evidence.value,
44
+ });
45
+ }
46
+ const failedAll = problems.filter((item) => item.status === 'fail');
47
+ const unavailableAll = problems.filter((item) => item.status !== 'fail');
48
+ const failedClauses = failedAll.slice(0, CHECK_MAX_ITEMS_PER_COLLECTION);
49
+ const unavailableClauses = unavailableAll.slice(0, CHECK_MAX_ITEMS_PER_COLLECTION);
50
+ truncated ||= failedAll.length > failedClauses.length || unavailableAll.length > unavailableClauses.length;
51
+ const unexpectedChanges = artifact.unexpectedChanges.slice(0, CHECK_MAX_ITEMS_PER_COLLECTION).map((change) => {
52
+ const evidence = boundedEvidence(change.supportingEvidence);
53
+ truncated ||= evidence.truncated;
54
+ return { ...change, supportingEvidence: evidence.value };
55
+ });
56
+ truncated ||= artifact.unexpectedChanges.length > unexpectedChanges.length;
57
+ const blocked = unavailableAll.length > 0;
58
+ return {
59
+ configured: true,
60
+ state: blocked ? 'BLOCKED' : artifact.overallVerdict,
61
+ overallVerdict: artifact.overallVerdict,
62
+ evaluationId: artifact.evaluationId,
63
+ artifactPath,
64
+ failedClauses,
65
+ unavailableClauses,
66
+ unexpectedChanges,
67
+ truncated,
68
+ };
69
+ }
70
+ /** Project canonical in-memory fidelity evidence without inferring bindings. */
71
+ export function projectReferenceResult(evaluation) {
72
+ const failedAll = evaluation.requirementResults.filter((item) => item.status === 'fail');
73
+ const unavailableAll = evaluation.requirementResults.filter((item) => item.status === 'unavailable');
74
+ const failedRequirements = failedAll.slice(0, CHECK_MAX_ITEMS_PER_COLLECTION);
75
+ const unavailableRequirements = unavailableAll.slice(0, CHECK_MAX_ITEMS_PER_COLLECTION);
76
+ const truncated = failedAll.length > failedRequirements.length || unavailableAll.length > unavailableRequirements.length;
77
+ const state = evaluation.state === 'not-evaluated' || unavailableAll.length > 0 ? 'BLOCKED' : evaluation.state === 'pass' ? 'PASS' : 'FAIL';
78
+ return {
79
+ configured: true,
80
+ state,
81
+ referenceId: evaluation.referenceId,
82
+ fidelityState: evaluation.state,
83
+ ...(evaluation.blockedBy === undefined ? {} : { blockedBy: evaluation.blockedBy }),
84
+ failedRequirements,
85
+ unavailableRequirements,
86
+ truncated,
87
+ };
88
+ }
89
+ export function finalizeCheckStatus(result) {
90
+ result.limits.truncated = result.contract.truncated || result.reference.truncated;
91
+ if (result.blockers.length > 0 || result.contract.state === 'BLOCKED' || result.reference.state === 'BLOCKED')
92
+ result.status = 'BLOCKED';
93
+ else if (result.contract.state === 'FAIL' || result.reference.state === 'FAIL')
94
+ result.status = 'FAIL';
95
+ else if (result.contract.configured || result.reference.configured)
96
+ result.status = 'PASS';
97
+ else
98
+ result.status = 'REVIEW_REQUIRED';
99
+ return result;
100
+ }
101
+ //# sourceMappingURL=checkResult.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkResult.js","sourceRoot":"","sources":["../../src/projectWorkflow/checkResult.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { RawNamedTarget } from '../request/request.js';
2
+ export declare const PROJECT_CONFIG_FILENAME: "frontend-observer.json";
3
+ export declare const PROJECT_CONFIG_SCHEMA_VERSION: "1.1.0";
4
+ export declare const SUPPORTED_PROJECT_CONFIG_SCHEMA_VERSIONS: readonly ["1.0.0", "1.1.0"];
5
+ export declare const OBSERVATION_ALIAS_PATTERN: RegExp;
6
+ export declare const RESERVED_OBSERVATION_ALIASES: Set<string>;
7
+ export interface FrontendObserverAcceptanceConfig {
8
+ comparisonConfigFile?: string;
9
+ contract?: {
10
+ baselineArtifact: string;
11
+ changeArtifact: string;
12
+ };
13
+ reference?: {
14
+ approvedArtifact: string;
15
+ bindingsFile?: string;
16
+ };
17
+ }
18
+ export interface FrontendObserverProjectConfig {
19
+ schemaVersion: (typeof SUPPORTED_PROJECT_CONFIG_SCHEMA_VERSIONS)[number];
20
+ url: string;
21
+ viewport: {
22
+ width: number;
23
+ height: number;
24
+ };
25
+ targets: RawNamedTarget[];
26
+ defaultBaseline: string;
27
+ acceptance?: FrontendObserverAcceptanceConfig;
28
+ }
29
+ export type ProjectConfigReadResult = {
30
+ ok: true;
31
+ config: FrontendObserverProjectConfig;
32
+ } | {
33
+ ok: false;
34
+ reason: string;
35
+ };
36
+ export declare function validateObservationAlias(alias: string, allowReserved?: boolean): {
37
+ ok: true;
38
+ } | {
39
+ ok: false;
40
+ reason: 'invalid' | 'reserved';
41
+ };
42
+ export declare function validateProjectConfig(value: unknown): ProjectConfigReadResult;
43
+ export declare function readProjectConfig(configPath: string): Promise<ProjectConfigReadResult>;
@@ -0,0 +1,84 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { normalizeRequest } from '../request/request.js';
3
+ export const PROJECT_CONFIG_FILENAME = 'frontend-observer.json';
4
+ export const PROJECT_CONFIG_SCHEMA_VERSION = '1.1.0';
5
+ export const SUPPORTED_PROJECT_CONFIG_SCHEMA_VERSIONS = ['1.0.0', '1.1.0'];
6
+ export const OBSERVATION_ALIAS_PATTERN = /^[a-z0-9][a-z0-9._-]{0,63}$/;
7
+ export const RESERVED_OBSERVATION_ALIASES = new Set(['current']);
8
+ export function validateObservationAlias(alias, allowReserved = false) {
9
+ if (!OBSERVATION_ALIAS_PATTERN.test(alias) || alias.includes('..'))
10
+ return { ok: false, reason: 'invalid' };
11
+ if (!allowReserved && RESERVED_OBSERVATION_ALIASES.has(alias))
12
+ return { ok: false, reason: 'reserved' };
13
+ return { ok: true };
14
+ }
15
+ function isObject(value) {
16
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
17
+ }
18
+ export function validateProjectConfig(value) {
19
+ if (!isObject(value))
20
+ return { ok: false, reason: 'project configuration root must be an object' };
21
+ const version = value.schemaVersion;
22
+ if (!SUPPORTED_PROJECT_CONFIG_SCHEMA_VERSIONS.includes(version))
23
+ return { ok: false, reason: `unsupported project configuration schema version: ${String(version)}` };
24
+ const allowed = new Set(['schemaVersion', 'url', 'viewport', 'targets', 'defaultBaseline', ...(version === '1.1.0' ? ['acceptance'] : [])]);
25
+ const unknown = Object.keys(value).filter((key) => !allowed.has(key));
26
+ if (unknown.length > 0)
27
+ return { ok: false, reason: `project configuration has unsupported field(s): ${unknown.join(', ')}` };
28
+ let acceptance;
29
+ if (value.acceptance !== undefined) {
30
+ if (!isObject(value.acceptance))
31
+ return { ok: false, reason: 'acceptance must be an object' };
32
+ if (Object.keys(value.acceptance).some((key) => !['comparisonConfigFile', 'contract', 'reference'].includes(key)))
33
+ return { ok: false, reason: 'acceptance has unsupported fields' };
34
+ const portable = (candidate) => {
35
+ if (typeof candidate !== 'string' || candidate.length === 0 || candidate.includes('\0') || candidate.includes('\\') || candidate.includes(':') || candidate.startsWith('/'))
36
+ return false;
37
+ return candidate.split('/').every((segment) => segment.length > 0 && segment !== '.' && segment !== '..');
38
+ };
39
+ if (value.acceptance.comparisonConfigFile !== undefined && !portable(value.acceptance.comparisonConfigFile))
40
+ return { ok: false, reason: 'comparisonConfigFile must be a portable project-relative path' };
41
+ const contract = value.acceptance.contract;
42
+ if (contract !== undefined && (!isObject(contract) || Object.keys(contract).some((key) => !['baselineArtifact', 'changeArtifact'].includes(key)) || !portable(contract.baselineArtifact) || !portable(contract.changeArtifact)))
43
+ return { ok: false, reason: 'contract requires portable baselineArtifact and changeArtifact paths' };
44
+ const reference = value.acceptance.reference;
45
+ if (reference !== undefined && (!isObject(reference) || Object.keys(reference).some((key) => !['approvedArtifact', 'bindingsFile'].includes(key)) || !portable(reference.approvedArtifact) || (reference.bindingsFile !== undefined && !portable(reference.bindingsFile))))
46
+ return { ok: false, reason: 'reference requires portable approvedArtifact and optional bindingsFile paths' };
47
+ acceptance = value.acceptance;
48
+ }
49
+ if (typeof value.defaultBaseline !== 'string')
50
+ return { ok: false, reason: 'defaultBaseline must be a string' };
51
+ const alias = validateObservationAlias(value.defaultBaseline);
52
+ if (!alias.ok)
53
+ return { ok: false, reason: alias.reason === 'reserved' ? 'defaultBaseline uses the reserved alias "current"' : 'defaultBaseline has invalid alias syntax' };
54
+ const normalized = normalizeRequest({
55
+ targetUrl: value.url,
56
+ viewport: value.viewport,
57
+ targets: value.targets,
58
+ outputLocation: '.frontend-observer/evidence/_validation',
59
+ });
60
+ if (!normalized.ok)
61
+ return { ok: false, reason: normalized.diagnostics.map((entry) => entry.message).join('; ') };
62
+ return {
63
+ ok: true,
64
+ config: {
65
+ schemaVersion: version,
66
+ url: normalized.request.targetUrl,
67
+ viewport: normalized.request.viewport,
68
+ targets: value.targets,
69
+ defaultBaseline: value.defaultBaseline,
70
+ ...(acceptance === undefined ? {} : { acceptance }),
71
+ },
72
+ };
73
+ }
74
+ export async function readProjectConfig(configPath) {
75
+ let value;
76
+ try {
77
+ value = JSON.parse(await readFile(configPath, 'utf8'));
78
+ }
79
+ catch (error) {
80
+ return { ok: false, reason: `project configuration could not be read: ${error instanceof Error ? error.message : String(error)}` };
81
+ }
82
+ return validateProjectConfig(value);
83
+ }
84
+ //# sourceMappingURL=projectConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectConfig.js","sourceRoot":"","sources":["../../src/projectWorkflow/projectConfig.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export type DiscoverProjectResult = {
2
+ ok: true;
3
+ projectRoot: string;
4
+ configPath: string;
5
+ } | {
6
+ ok: false;
7
+ reason: 'project-not-initialized';
8
+ };
9
+ export declare function discoverFrontendObserverProject(startDirectory: string): Promise<DiscoverProjectResult>;
@@ -0,0 +1,20 @@
1
+ import { access } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { PROJECT_CONFIG_FILENAME } from './projectConfig.js';
4
+ export async function discoverFrontendObserverProject(startDirectory) {
5
+ let current = path.resolve(startDirectory);
6
+ for (;;) {
7
+ const configPath = path.join(current, PROJECT_CONFIG_FILENAME);
8
+ try {
9
+ await access(configPath);
10
+ return { ok: true, projectRoot: current, configPath };
11
+ }
12
+ catch {
13
+ const parent = path.dirname(current);
14
+ if (parent === current)
15
+ return { ok: false, reason: 'project-not-initialized' };
16
+ current = parent;
17
+ }
18
+ }
19
+ }
20
+ //# sourceMappingURL=projectDiscovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectDiscovery.js","sourceRoot":"","sources":["../../src/projectWorkflow/projectDiscovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAI7D,MAAM,CAAC,KAAK,UAAU,+BAA+B,CAAC,cAAsB;IAC1E,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3C,SAAS,CAAC;QACR,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC;QAC/D,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;YACzB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,MAAM,KAAK,OAAO;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC;YAChF,OAAO,GAAG,MAAM,CAAC;QACnB,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare const PROJECT_STATE_DIRECTORY: ".frontend-observer";
2
+ export declare const ALIAS_CATALOG_FILENAME: "catalog.json";
3
+ export declare function projectConfigPath(projectRoot: string): string;
4
+ export declare function projectStateRoot(projectRoot: string): string;
5
+ export declare function aliasCatalogPath(projectRoot: string): string;
6
+ export declare function projectEvidenceRoot(projectRoot: string): string;
7
+ export declare function projectObservationsRoot(projectRoot: string): string;
8
+ export declare function observationOutputLocation(alias: string): string;
@@ -0,0 +1,23 @@
1
+ import path from 'node:path';
2
+ import { PROJECT_CONFIG_FILENAME } from './projectConfig.js';
3
+ export const PROJECT_STATE_DIRECTORY = '.frontend-observer';
4
+ export const ALIAS_CATALOG_FILENAME = 'catalog.json';
5
+ export function projectConfigPath(projectRoot) {
6
+ return path.join(projectRoot, PROJECT_CONFIG_FILENAME);
7
+ }
8
+ export function projectStateRoot(projectRoot) {
9
+ return path.join(projectRoot, PROJECT_STATE_DIRECTORY);
10
+ }
11
+ export function aliasCatalogPath(projectRoot) {
12
+ return path.join(projectStateRoot(projectRoot), ALIAS_CATALOG_FILENAME);
13
+ }
14
+ export function projectEvidenceRoot(projectRoot) {
15
+ return path.join(projectStateRoot(projectRoot), 'evidence');
16
+ }
17
+ export function projectObservationsRoot(projectRoot) {
18
+ return path.join(projectEvidenceRoot(projectRoot), 'observations');
19
+ }
20
+ export function observationOutputLocation(alias) {
21
+ return `${PROJECT_STATE_DIRECTORY}/evidence/observations/${alias}`;
22
+ }
23
+ //# sourceMappingURL=projectPaths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectPaths.js","sourceRoot":"","sources":["../../src/projectWorkflow/projectPaths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,MAAM,CAAC,MAAM,uBAAuB,GAAG,oBAA6B,CAAC;AACrE,MAAM,CAAC,MAAM,sBAAsB,GAAG,cAAuB,CAAC;AAE9D,MAAM,UAAU,iBAAiB,CAAC,WAAmB;IACnD,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE,sBAAsB,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,WAAmB;IACrD,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,WAAmB;IACzD,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,cAAc,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAa;IACrD,OAAO,GAAG,uBAAuB,0BAA0B,KAAK,EAAE,CAAC;AACrE,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { Diagnostic } from '../domain/diagnostics.js';
2
+ export type NormalizeOutputLocationResult = {
3
+ ok: true;
4
+ value: string;
5
+ } | {
6
+ ok: false;
7
+ diagnostic: Diagnostic;
8
+ };
9
+ /**
10
+ * Portable, relative, forward-slash logical path only: no drive letter, no
11
+ * leading "/", no ".." segment. Backslashes are converted to forward slashes
12
+ * before validation. Never touches the real filesystem.
13
+ */
14
+ export declare function normalizeOutputLocation(raw: string): NormalizeOutputLocationResult;
@@ -0,0 +1,33 @@
1
+ const DRIVE_LETTER_RE = /^[A-Za-z]:\//;
2
+ /**
3
+ * Portable, relative, forward-slash logical path only: no drive letter, no
4
+ * leading "/", no ".." segment. Backslashes are converted to forward slashes
5
+ * before validation. Never touches the real filesystem.
6
+ */
7
+ export function normalizeOutputLocation(raw) {
8
+ const withForwardSlashes = raw.replace(/\\/g, '/');
9
+ if (withForwardSlashes.startsWith('/') || DRIVE_LETTER_RE.test(withForwardSlashes)) {
10
+ return {
11
+ ok: false,
12
+ diagnostic: {
13
+ code: 'invalid-request',
14
+ severity: 'error',
15
+ message: 'outputLocation must be a relative, portable path (no drive letter or leading "/")',
16
+ },
17
+ };
18
+ }
19
+ const segments = withForwardSlashes.split('/');
20
+ if (segments.some((segment) => segment === '..')) {
21
+ return {
22
+ ok: false,
23
+ diagnostic: {
24
+ code: 'invalid-request',
25
+ severity: 'error',
26
+ message: 'outputLocation must not contain ".." segments',
27
+ },
28
+ };
29
+ }
30
+ const cleaned = segments.filter((segment) => segment.length > 0 && segment !== '.');
31
+ return { ok: true, value: cleaned.length > 0 ? cleaned.join('/') : '.' };
32
+ }
33
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/request/paths.ts"],"names":[],"mappings":"AAIA,MAAM,eAAe,GAAG,cAAc,CAAC;AAEvC;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,GAAW;IACjD,MAAM,kBAAkB,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAEnD,IAAI,kBAAkB,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACnF,OAAO;YACL,EAAE,EAAE,KAAK;YACT,UAAU,EAAE;gBACV,IAAI,EAAE,iBAAiB;gBACvB,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,mFAAmF;aAC7F;SACF,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/C,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,IAAI,CAAC,EAAE,CAAC;QACjD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,UAAU,EAAE;gBACV,IAAI,EAAE,iBAAiB;gBACvB,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,+CAA+C;aACzD;SACF,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,KAAK,GAAG,CAAC,CAAC;IACpF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,111 @@
1
+ import type { Diagnostic } from '../domain/diagnostics.js';
2
+ import type { ExplicitStateDimensions } from '../domain/explicitState.js';
3
+ export type TargetLocator = {
4
+ kind: 'role';
5
+ role: string;
6
+ name?: string;
7
+ } | {
8
+ kind: 'id';
9
+ value: string;
10
+ } | {
11
+ kind: 'data-attribute';
12
+ attribute: string;
13
+ value: string;
14
+ } | {
15
+ kind: 'semantic-element';
16
+ tag: string;
17
+ } | {
18
+ kind: 'css';
19
+ selector: string;
20
+ } | {
21
+ kind: 'text';
22
+ text: string;
23
+ };
24
+ export interface NamedTarget {
25
+ name: string;
26
+ locators: TargetLocator[];
27
+ }
28
+ /** Raw, not-yet-validated target shape as it may appear in a RawObservationRequest. Exactly one of `selector` (legacy) or `locators` (canonical) may be present, never both. */
29
+ export interface RawNamedTarget {
30
+ name?: unknown;
31
+ selector?: unknown;
32
+ locators?: unknown;
33
+ }
34
+ export interface Viewport {
35
+ width: number;
36
+ height: number;
37
+ }
38
+ export type ReadinessCondition = 'load' | 'domcontentloaded';
39
+ export interface ReadinessConfig {
40
+ condition: ReadinessCondition;
41
+ timeoutMs: number;
42
+ }
43
+ /**
44
+ * v0.3 Batch 1 canonical scroll-action shape. Exactly the two bounded action
45
+ * kinds below are supported; `target` on `target-scroll-by` refers to the
46
+ * existing stable observer-owned target `name` (see `NamedTarget`), never a
47
+ * CSS selector, Playwright locator, or DOM id evaluated directly.
48
+ */
49
+ export type ScrollAction = {
50
+ kind: 'window-scroll-by';
51
+ deltaX: number;
52
+ deltaY: number;
53
+ } | {
54
+ kind: 'target-scroll-by';
55
+ target: string;
56
+ deltaX: number;
57
+ deltaY: number;
58
+ };
59
+ export interface ScrollScenario {
60
+ action: ScrollAction;
61
+ }
62
+ export interface NormalizedObservationRequest {
63
+ targetUrl: string;
64
+ viewport: Viewport;
65
+ targets: NamedTarget[];
66
+ outputLocation: string;
67
+ timeoutMs: number;
68
+ readiness: ReadinessConfig;
69
+ scrollScenario?: ScrollScenario;
70
+ /**
71
+ * v0.7 Prompt 4 addition (additive, optional). Explicit, caller/config-
72
+ * supplied frontend state identity for this observation - never inferred
73
+ * by the observer from screenshot pixels, CSS, DOM, URLs, or any other
74
+ * browser-observed evidence (see domain/explicitState.ts). Used only by
75
+ * comparability/compatibility evaluation (domain/comparisonEngine.ts,
76
+ * domain/externalReferenceCompatibility.ts); omitting it preserves every
77
+ * pre-Prompt-4 observation/comparison behavior unchanged.
78
+ */
79
+ explicitState?: ExplicitStateDimensions;
80
+ }
81
+ export interface RawObservationRequest {
82
+ targetUrl?: unknown;
83
+ viewport?: unknown;
84
+ targets?: unknown;
85
+ outputLocation?: unknown;
86
+ timeoutMs?: unknown;
87
+ readiness?: unknown;
88
+ scrollScenario?: unknown;
89
+ explicitState?: unknown;
90
+ }
91
+ export type NormalizeRequestResult = {
92
+ ok: true;
93
+ request: NormalizedObservationRequest;
94
+ } | {
95
+ ok: false;
96
+ diagnostics: Diagnostic[];
97
+ };
98
+ /**
99
+ * Conservative bound for a single controlled-observation scroll action. No
100
+ * existing repository precedent for a scroll-delta magnitude; chosen large
101
+ * enough to reach realistic overflow content (documents/containers well
102
+ * beyond one viewport) while staying far short of a pathological/runaway
103
+ * request - see docs/CONTRACTS.md and tests/unit/request.test.ts.
104
+ */
105
+ export declare const SCROLL_DELTA_MAX_ABS = 20000;
106
+ /**
107
+ * Total, never throws. Collects every applicable diagnostic before returning
108
+ * (does not short-circuit on the first violation) so callers see every
109
+ * problem at once, in deterministic order.
110
+ */
111
+ export declare function normalizeRequest(raw: RawObservationRequest): NormalizeRequestResult;