@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,38 @@
1
+ import type { ExternalReferenceImageFormat } from './externalReferenceImage.js';
2
+ import type { ReferenceRegion } from './externalReferenceRegions.js';
3
+ import type { ExternalReferenceRequirement } from './externalReferenceRequirements.js';
4
+ import type { ExternalReferenceApplicability } from './externalReferenceApplicability.js';
5
+ /**
6
+ * Pure function of {imageSha256, format, width, height, supersedesReferenceId,
7
+ * regions?} - the semantic content of the reference image, which prior
8
+ * reference (if any) it explicitly supersedes, and (v0.7 Prompt 2 addition)
9
+ * its explicitly authored reference regions when present. Never includes a
10
+ * filesystem path, output location, a captured timestamp, or a
11
+ * caller-supplied label: two imports of byte-identical image content and
12
+ * region content from different operational locations, with different
13
+ * labels, produce the same logical identity; changing the image content, its
14
+ * detected format/dimensions, the supersession target, or the region set
15
+ * (added/removed/renamed/moved/resized) changes it.
16
+ *
17
+ * `regions`/`requirements`/`applicability` are each omitted from the hashed
18
+ * view entirely when not supplied (rather than included as `null`, unlike
19
+ * `supersedes`) so that every pre-Prompt-2/3/4 call site - and every later
20
+ * call that legitimately omits one of them - keeps producing byte-identical
21
+ * identity to the earlier prompt, never a new hash purely because a
22
+ * parameter now exists. Region/requirement order is part of the semantic
23
+ * view (authored order is semantic, mirroring domain/identity.ts's `targets`
24
+ * treatment) - canonicalize sorts object keys but deliberately never
25
+ * reorders arrays. `requirements` entries already carry their own
26
+ * content-derived `requirementId` (see externalReferenceRequirementIdentity.ts),
27
+ * so changing a selected property, tolerance, or category changes both that
28
+ * requirement's own id and this artifact-level identity.
29
+ */
30
+ export declare function buildExternalReferenceRequestIdentity(imageSha256: string, format: ExternalReferenceImageFormat, width: number, height: number, supersedesReferenceId?: string, regions?: readonly ReferenceRegion[], requirements?: readonly ExternalReferenceRequirement[], applicability?: ExternalReferenceApplicability): string;
31
+ /**
32
+ * Fresh, opaque per-persisted-instance identity - never derived from a
33
+ * timestamp alone, never collides even when called twice with the same
34
+ * requestIdentity within the same millisecond. Used both for a fresh import
35
+ * and for a fresh approval of an already-imported reference (same
36
+ * referenceRequestId, a new referenceId each time something is persisted).
37
+ */
38
+ export declare function buildExternalReferenceInstanceIdentity(requestIdentity: string): string;
@@ -0,0 +1,70 @@
1
+ import { createHash, randomBytes } from 'node:crypto';
2
+ /**
3
+ * Deliberately duplicated from domain/identity.ts#canonicalize (itself
4
+ * duplicated across comparisonIdentity.ts/frontendContractIdentity.ts) rather
5
+ * than imported - each identity module owns its own private canonicalize per
6
+ * existing repository convention. Same algorithm (sorted object keys,
7
+ * order-preserving arrays).
8
+ */
9
+ function canonicalize(value) {
10
+ if (Array.isArray(value))
11
+ return value.map(canonicalize);
12
+ if (value !== null && typeof value === 'object') {
13
+ const entries = Object.entries(value)
14
+ .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
15
+ .map(([key, entryValue]) => [key, canonicalize(entryValue)]);
16
+ return Object.fromEntries(entries);
17
+ }
18
+ return value;
19
+ }
20
+ /**
21
+ * Pure function of {imageSha256, format, width, height, supersedesReferenceId,
22
+ * regions?} - the semantic content of the reference image, which prior
23
+ * reference (if any) it explicitly supersedes, and (v0.7 Prompt 2 addition)
24
+ * its explicitly authored reference regions when present. Never includes a
25
+ * filesystem path, output location, a captured timestamp, or a
26
+ * caller-supplied label: two imports of byte-identical image content and
27
+ * region content from different operational locations, with different
28
+ * labels, produce the same logical identity; changing the image content, its
29
+ * detected format/dimensions, the supersession target, or the region set
30
+ * (added/removed/renamed/moved/resized) changes it.
31
+ *
32
+ * `regions`/`requirements`/`applicability` are each omitted from the hashed
33
+ * view entirely when not supplied (rather than included as `null`, unlike
34
+ * `supersedes`) so that every pre-Prompt-2/3/4 call site - and every later
35
+ * call that legitimately omits one of them - keeps producing byte-identical
36
+ * identity to the earlier prompt, never a new hash purely because a
37
+ * parameter now exists. Region/requirement order is part of the semantic
38
+ * view (authored order is semantic, mirroring domain/identity.ts's `targets`
39
+ * treatment) - canonicalize sorts object keys but deliberately never
40
+ * reorders arrays. `requirements` entries already carry their own
41
+ * content-derived `requirementId` (see externalReferenceRequirementIdentity.ts),
42
+ * so changing a selected property, tolerance, or category changes both that
43
+ * requirement's own id and this artifact-level identity.
44
+ */
45
+ export function buildExternalReferenceRequestIdentity(imageSha256, format, width, height, supersedesReferenceId, regions, requirements, applicability) {
46
+ const semanticView = {
47
+ imageSha256,
48
+ format,
49
+ width,
50
+ height,
51
+ supersedes: supersedesReferenceId ?? null,
52
+ ...(regions !== undefined ? { regions } : {}),
53
+ ...(requirements !== undefined ? { requirements } : {}),
54
+ ...(applicability !== undefined ? { applicability } : {}),
55
+ };
56
+ const serialized = JSON.stringify(canonicalize(semanticView));
57
+ return createHash('sha256').update(serialized).digest('hex');
58
+ }
59
+ /**
60
+ * Fresh, opaque per-persisted-instance identity - never derived from a
61
+ * timestamp alone, never collides even when called twice with the same
62
+ * requestIdentity within the same millisecond. Used both for a fresh import
63
+ * and for a fresh approval of an already-imported reference (same
64
+ * referenceRequestId, a new referenceId each time something is persisted).
65
+ */
66
+ export function buildExternalReferenceInstanceIdentity(requestIdentity) {
67
+ const nonce = randomBytes(16).toString('hex');
68
+ return `${requestIdentity}-${nonce}`;
69
+ }
70
+ //# sourceMappingURL=externalReferenceIdentity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"externalReferenceIdentity.js","sourceRoot":"","sources":["../../src/domain/externalReferenceIdentity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAMtD;;;;;;GAMG;AACH,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACzD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC;aAC7D,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aAChD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,YAAY,CAAC,UAAU,CAAC,CAAU,CAAC,CAAC;QACxE,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,qCAAqC,CACnD,WAAmB,EACnB,MAAoC,EACpC,KAAa,EACb,MAAc,EACd,qBAA8B,EAC9B,OAAoC,EACpC,YAAsD,EACtD,aAA8C;IAE9C,MAAM,YAAY,GAAG;QACnB,WAAW;QACX,MAAM;QACN,KAAK;QACL,MAAM;QACN,UAAU,EAAE,qBAAqB,IAAI,IAAI;QACzC,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1D,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC;IAC9D,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,sCAAsC,CAAC,eAAuB;IAC5E,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,GAAG,eAAe,IAAI,KAAK,EAAE,CAAC;AACvC,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * v0.7 Prompt 1 external-reference image boundary. Pure, dependency-free,
3
+ * header/magic-byte-only parsing for the three formats
4
+ * EXTERNAL_REFERENCE_SUPPORTED_IMAGE_FORMATS freezes below - no image-processing
5
+ * framework, no OCR, no raster decoding, no computer vision. Every function
6
+ * here reads only bounded header bytes and never trusts a caller-declared
7
+ * file extension or MIME type.
8
+ */
9
+ export declare const EXTERNAL_REFERENCE_SUPPORTED_IMAGE_FORMATS: readonly ["png", "jpeg", "webp"];
10
+ export type ExternalReferenceImageFormat = (typeof EXTERNAL_REFERENCE_SUPPORTED_IMAGE_FORMATS)[number];
11
+ export declare function isExternalReferenceImageFormat(value: unknown): value is ExternalReferenceImageFormat;
12
+ /** Deliberately generous but bounded - reference images are design mockups/screenshots, never arbitrary large media. */
13
+ export declare const EXTERNAL_REFERENCE_MAX_IMAGE_BYTES = 20000000;
14
+ export declare const EXTERNAL_REFERENCE_MIN_DIMENSION_PX = 1;
15
+ export declare const EXTERNAL_REFERENCE_MAX_DIMENSION_PX = 8192;
16
+ /**
17
+ * Detects one of the three frozen formats from magic bytes only - never from a
18
+ * caller-supplied file extension or MIME type. Returns undefined for anything
19
+ * else, including a truncated/corrupted header of a genuinely supported
20
+ * format's signature bytes.
21
+ */
22
+ export declare function detectExternalReferenceImageFormat(bytes: Uint8Array): ExternalReferenceImageFormat | undefined;
23
+ export interface ImageDimensions {
24
+ width: number;
25
+ height: number;
26
+ }
27
+ /**
28
+ * Reads width/height from already-detected-format header bytes only - never
29
+ * decodes pixel data. Returns undefined (never a fabricated 0x0) for a
30
+ * truncated header or an unrecognized chunk layout within a genuinely
31
+ * supported container (e.g. an unrecognized WebP chunk kind).
32
+ */
33
+ export declare function readExternalReferenceImageDimensions(bytes: Uint8Array, format: ExternalReferenceImageFormat): ImageDimensions | undefined;
34
+ export declare function isValidExternalReferenceImageDimensions(dimensions: ImageDimensions): boolean;
35
+ export declare function fileExtensionForFormat(format: ExternalReferenceImageFormat): string;
@@ -0,0 +1,160 @@
1
+ /**
2
+ * v0.7 Prompt 1 external-reference image boundary. Pure, dependency-free,
3
+ * header/magic-byte-only parsing for the three formats
4
+ * EXTERNAL_REFERENCE_SUPPORTED_IMAGE_FORMATS freezes below - no image-processing
5
+ * framework, no OCR, no raster decoding, no computer vision. Every function
6
+ * here reads only bounded header bytes and never trusts a caller-declared
7
+ * file extension or MIME type.
8
+ */
9
+ export const EXTERNAL_REFERENCE_SUPPORTED_IMAGE_FORMATS = ['png', 'jpeg', 'webp'];
10
+ export function isExternalReferenceImageFormat(value) {
11
+ return typeof value === 'string' && EXTERNAL_REFERENCE_SUPPORTED_IMAGE_FORMATS.includes(value);
12
+ }
13
+ /** Deliberately generous but bounded - reference images are design mockups/screenshots, never arbitrary large media. */
14
+ export const EXTERNAL_REFERENCE_MAX_IMAGE_BYTES = 20_000_000;
15
+ export const EXTERNAL_REFERENCE_MIN_DIMENSION_PX = 1;
16
+ export const EXTERNAL_REFERENCE_MAX_DIMENSION_PX = 8192;
17
+ const PNG_SIGNATURE = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
18
+ const JPEG_SIGNATURE = [0xff, 0xd8, 0xff];
19
+ function bytesStartWith(bytes, signature) {
20
+ if (bytes.length < signature.length)
21
+ return false;
22
+ return signature.every((byte, index) => bytes[index] === byte);
23
+ }
24
+ function asciiAt(bytes, offset, length) {
25
+ if (bytes.length < offset + length)
26
+ return '';
27
+ let result = '';
28
+ for (let index = 0; index < length; index += 1) {
29
+ result += String.fromCharCode(bytes[offset + index]);
30
+ }
31
+ return result;
32
+ }
33
+ /**
34
+ * Detects one of the three frozen formats from magic bytes only - never from a
35
+ * caller-supplied file extension or MIME type. Returns undefined for anything
36
+ * else, including a truncated/corrupted header of a genuinely supported
37
+ * format's signature bytes.
38
+ */
39
+ export function detectExternalReferenceImageFormat(bytes) {
40
+ if (bytesStartWith(bytes, PNG_SIGNATURE))
41
+ return 'png';
42
+ if (bytesStartWith(bytes, JPEG_SIGNATURE))
43
+ return 'jpeg';
44
+ if (asciiAt(bytes, 0, 4) === 'RIFF' && asciiAt(bytes, 8, 4) === 'WEBP')
45
+ return 'webp';
46
+ return undefined;
47
+ }
48
+ function readUInt32BE(bytes, offset) {
49
+ return ((bytes[offset] << 24) | (bytes[offset + 1] << 16) | (bytes[offset + 2] << 8) | bytes[offset + 3]) >>> 0;
50
+ }
51
+ function readUInt16BE(bytes, offset) {
52
+ return ((bytes[offset] << 8) | bytes[offset + 1]) >>> 0;
53
+ }
54
+ function readUInt32LE(bytes, offset) {
55
+ return ((bytes[offset + 3] << 24) | (bytes[offset + 2] << 16) | (bytes[offset + 1] << 8) | bytes[offset]) >>> 0;
56
+ }
57
+ /** PNG: the IHDR chunk is always the first chunk, immediately after the 8-byte signature, with a fixed 4-byte length + "IHDR" + width + height layout. */
58
+ function readPngDimensions(bytes) {
59
+ if (bytes.length < 24)
60
+ return undefined;
61
+ if (asciiAt(bytes, 12, 4) !== 'IHDR')
62
+ return undefined;
63
+ return { width: readUInt32BE(bytes, 16), height: readUInt32BE(bytes, 20) };
64
+ }
65
+ /**
66
+ * JPEG: scan marker segments starting after the SOI (0xFFD8) for the first
67
+ * start-of-frame marker (every SOFn except the reserved/DHT/DAC 0xC4/0xC8/0xCC),
68
+ * which always carries height then width as two big-endian uint16s beginning
69
+ * 5 bytes into the segment payload. Bounded scan: stops at the end of the
70
+ * buffer rather than looping indefinitely on a truncated/malformed file.
71
+ */
72
+ function readJpegDimensions(bytes) {
73
+ let offset = 2;
74
+ while (offset + 9 < bytes.length) {
75
+ if (bytes[offset] !== 0xff) {
76
+ offset += 1;
77
+ continue;
78
+ }
79
+ const marker = bytes[offset + 1];
80
+ if (marker === 0xd8 || marker === 0x01 || (marker >= 0xd0 && marker <= 0xd7)) {
81
+ offset += 2;
82
+ continue;
83
+ }
84
+ if (marker === 0xd9)
85
+ break;
86
+ const segmentLength = readUInt16BE(bytes, offset + 2);
87
+ const isSof = marker >= 0xc0 && marker <= 0xcf && marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc;
88
+ if (isSof) {
89
+ return { height: readUInt16BE(bytes, offset + 5), width: readUInt16BE(bytes, offset + 7) };
90
+ }
91
+ if (segmentLength < 2)
92
+ return undefined;
93
+ offset += 2 + segmentLength;
94
+ }
95
+ return undefined;
96
+ }
97
+ /**
98
+ * WebP: the simple-lossy (VP8), simple-lossless (VP8L), and extended (VP8X)
99
+ * chunk layouts each encode dimensions differently. Only these three
100
+ * documented chunk shapes are parsed; anything else is honestly unsupported.
101
+ */
102
+ function readWebpDimensions(bytes) {
103
+ const chunkId = asciiAt(bytes, 12, 4);
104
+ if (chunkId === 'VP8 ') {
105
+ if (bytes.length < 30)
106
+ return undefined;
107
+ return { width: readUInt16BE(bytes, 26) & 0x3fff, height: readUInt16BE(bytes, 28) & 0x3fff };
108
+ }
109
+ if (chunkId === 'VP8L') {
110
+ if (bytes.length < 25)
111
+ return undefined;
112
+ if (bytes[20] !== 0x2f)
113
+ return undefined;
114
+ const bits = readUInt32LE(bytes, 21);
115
+ return { width: (bits & 0x3fff) + 1, height: ((bits >> 14) & 0x3fff) + 1 };
116
+ }
117
+ if (chunkId === 'VP8X') {
118
+ if (bytes.length < 30)
119
+ return undefined;
120
+ const width = ((bytes[24] | (bytes[25] << 8) | (bytes[26] << 16)) >>> 0) + 1;
121
+ const height = ((bytes[27] | (bytes[28] << 8) | (bytes[29] << 16)) >>> 0) + 1;
122
+ return { width, height };
123
+ }
124
+ return undefined;
125
+ }
126
+ /**
127
+ * Reads width/height from already-detected-format header bytes only - never
128
+ * decodes pixel data. Returns undefined (never a fabricated 0x0) for a
129
+ * truncated header or an unrecognized chunk layout within a genuinely
130
+ * supported container (e.g. an unrecognized WebP chunk kind).
131
+ */
132
+ export function readExternalReferenceImageDimensions(bytes, format) {
133
+ switch (format) {
134
+ case 'png':
135
+ return readPngDimensions(bytes);
136
+ case 'jpeg':
137
+ return readJpegDimensions(bytes);
138
+ case 'webp':
139
+ return readWebpDimensions(bytes);
140
+ }
141
+ }
142
+ export function isValidExternalReferenceImageDimensions(dimensions) {
143
+ return (Number.isInteger(dimensions.width) &&
144
+ Number.isInteger(dimensions.height) &&
145
+ dimensions.width >= EXTERNAL_REFERENCE_MIN_DIMENSION_PX &&
146
+ dimensions.height >= EXTERNAL_REFERENCE_MIN_DIMENSION_PX &&
147
+ dimensions.width <= EXTERNAL_REFERENCE_MAX_DIMENSION_PX &&
148
+ dimensions.height <= EXTERNAL_REFERENCE_MAX_DIMENSION_PX);
149
+ }
150
+ export function fileExtensionForFormat(format) {
151
+ switch (format) {
152
+ case 'png':
153
+ return 'png';
154
+ case 'jpeg':
155
+ return 'jpg';
156
+ case 'webp':
157
+ return 'webp';
158
+ }
159
+ }
160
+ //# sourceMappingURL=externalReferenceImage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"externalReferenceImage.js","sourceRoot":"","sources":["../../src/domain/externalReferenceImage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * v0.7 Prompt 2 reference-region relationship derivation. Reuses the exact
3
+ * same pure, tolerance-aware geometry predicates that
4
+ * domain/relationships.ts#deriveLayoutRelationships uses for runtime
5
+ * targets (horizontalOrderOf/verticalOrderOf/areaOverlapOf/relativeWidthOf/
6
+ * geometricFitOf/verticalSequenceOf, and the PairwiseRelationshipKind
7
+ * vocabulary/EvidenceReference type) - never a duplicated or reinterpreted
8
+ * copy of those formulas. Only the six geometry-only families apply here;
9
+ * DOM containment, scroll ownership, runtime visibility, and page-width-vs-
10
+ * viewport are runtime/browser concepts with no reference-image equivalent
11
+ * and are deliberately not reused (see docs/CONTRACTS.md).
12
+ *
13
+ * A reference relationship is a fact about the reference image's geometry
14
+ * only. It is never a design requirement, never a pass/fail verdict, and
15
+ * never claims a runtime target or source owner exists - those are later
16
+ * v0.7 prompts.
17
+ */
18
+ import type { PairwiseRelationshipKind, EvidenceReference } from './relationships.js';
19
+ import type { ReferenceRegion } from './externalReferenceRegions.js';
20
+ /** Same bound-derivation shape as relationships.ts's MAX_PAIRWISE_RELATIONSHIP_PAIRS/RECORDS, over MAX_REFERENCE_REGIONS instead of the runtime-target limit - this is a maximum capacity, never a required minimum region count. */
21
+ export declare const MAX_REFERENCE_REGION_PAIRS: number;
22
+ export declare const REFERENCE_REGION_RELATIONSHIP_FAMILY_COUNT = 6;
23
+ export declare const MAX_REFERENCE_REGION_RELATIONSHIP_RECORDS: number;
24
+ /** One derived spatial relationship between two reference regions - subjectRegion/relatedRegion are region ids, deliberately named distinctly from PairwiseLayoutRelationship's subjectTarget/relatedTarget so a reference relationship can never be mistaken for a runtime-target relationship at the type level. */
25
+ export interface ReferenceRegionRelationship {
26
+ kind: PairwiseRelationshipKind;
27
+ subjectRegion: string;
28
+ relatedRegion: string;
29
+ evidence: EvidenceReference[];
30
+ }
31
+ export declare function isValidReferenceRegionRelationship(value: unknown): value is ReferenceRegionRelationship;
32
+ /** Bounded structured relationship graph for one reference's region set - never persisted (see externalReference.ts), always re-derivable on demand from the artifact's own `regions` field. */
33
+ export interface ReferenceRegionRelationshipGraph {
34
+ referenceRequestId: string;
35
+ geometryTolerancePx: number;
36
+ regions: string[];
37
+ pairwiseRelationships: ReferenceRegionRelationship[];
38
+ }
39
+ export declare function isValidReferenceRegionRelationshipGraph(value: unknown): value is ReferenceRegionRelationshipGraph;
40
+ export interface DeriveReferenceRegionRelationshipsOptions {
41
+ geometryTolerancePx?: number;
42
+ }
43
+ export type DeriveReferenceRegionRelationshipsResult = {
44
+ ok: true;
45
+ graph: ReferenceRegionRelationshipGraph;
46
+ } | {
47
+ ok: false;
48
+ reason: string;
49
+ };
50
+ /**
51
+ * The one canonical pure derivation from an authored region set to a
52
+ * ReferenceRegionRelationshipGraph - deterministic and synchronous: same
53
+ * `regions`/`geometryTolerancePx` in, same graph out, every time. Mirrors
54
+ * `deriveLayoutRelationships`'s pairwise-loop shape exactly (earlier
55
+ * authored region is always `subjectRegion` for every family except
56
+ * `follows-vertically`, whose direction is decided by actual geometry) but
57
+ * has no `unresolvedTargets`/`pageRelationships` concept: every authored
58
+ * region that reaches this function has already passed
59
+ * `isValidReferenceRegions`, so there is no "could not resolve" case, and a
60
+ * static image has no page/viewport to derive a page-level relationship
61
+ * from.
62
+ */
63
+ export declare function deriveReferenceRegionRelationships(referenceRequestId: string, regions: readonly ReferenceRegion[], options?: DeriveReferenceRegionRelationshipsOptions): DeriveReferenceRegionRelationshipsResult;
@@ -0,0 +1,98 @@
1
+ import { PAIRWISE_RELATIONSHIP_KINDS, isValidEvidenceReference, horizontalOrderOf, verticalOrderOf, areaOverlapOf, relativeWidthOf, geometricFitOf, verticalSequenceOf, } from './relationships.js';
2
+ import { deriveReferenceRegionGeometry, MAX_REFERENCE_REGIONS } from './externalReferenceRegions.js';
3
+ function isPlainObject(value) {
4
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
5
+ }
6
+ /** Same bound-derivation shape as relationships.ts's MAX_PAIRWISE_RELATIONSHIP_PAIRS/RECORDS, over MAX_REFERENCE_REGIONS instead of the runtime-target limit - this is a maximum capacity, never a required minimum region count. */
7
+ export const MAX_REFERENCE_REGION_PAIRS = (MAX_REFERENCE_REGIONS * (MAX_REFERENCE_REGIONS - 1)) / 2;
8
+ export const REFERENCE_REGION_RELATIONSHIP_FAMILY_COUNT = 6;
9
+ export const MAX_REFERENCE_REGION_RELATIONSHIP_RECORDS = MAX_REFERENCE_REGION_PAIRS * REFERENCE_REGION_RELATIONSHIP_FAMILY_COUNT;
10
+ export function isValidReferenceRegionRelationship(value) {
11
+ if (!isPlainObject(value))
12
+ return false;
13
+ if (typeof value.kind !== 'string' || !PAIRWISE_RELATIONSHIP_KINDS.includes(value.kind))
14
+ return false;
15
+ if (typeof value.subjectRegion !== 'string' || value.subjectRegion.length === 0)
16
+ return false;
17
+ if (typeof value.relatedRegion !== 'string' || value.relatedRegion.length === 0)
18
+ return false;
19
+ if (value.subjectRegion === value.relatedRegion)
20
+ return false;
21
+ return Array.isArray(value.evidence) && value.evidence.every((entry) => isValidEvidenceReference(entry));
22
+ }
23
+ export function isValidReferenceRegionRelationshipGraph(value) {
24
+ if (!isPlainObject(value))
25
+ return false;
26
+ if (typeof value.referenceRequestId !== 'string' || value.referenceRequestId.length === 0)
27
+ return false;
28
+ if (typeof value.geometryTolerancePx !== 'number' || !Number.isFinite(value.geometryTolerancePx))
29
+ return false;
30
+ if (!Array.isArray(value.regions) || !value.regions.every((r) => typeof r === 'string' && r.length > 0))
31
+ return false;
32
+ if (new Set(value.regions).size !== value.regions.length)
33
+ return false;
34
+ const regionSet = new Set(value.regions);
35
+ if (!Array.isArray(value.pairwiseRelationships) || !value.pairwiseRelationships.every((r) => isValidReferenceRegionRelationship(r)))
36
+ return false;
37
+ if (value.pairwiseRelationships.length > MAX_REFERENCE_REGION_RELATIONSHIP_RECORDS)
38
+ return false;
39
+ for (const relationship of value.pairwiseRelationships) {
40
+ if (!regionSet.has(relationship.subjectRegion) || !regionSet.has(relationship.relatedRegion))
41
+ return false;
42
+ }
43
+ return true;
44
+ }
45
+ function regionGeometryEvidence(a, b) {
46
+ return [{ path: `regions.${a}.rectangle` }, { path: `regions.${b}.rectangle` }];
47
+ }
48
+ /**
49
+ * The one canonical pure derivation from an authored region set to a
50
+ * ReferenceRegionRelationshipGraph - deterministic and synchronous: same
51
+ * `regions`/`geometryTolerancePx` in, same graph out, every time. Mirrors
52
+ * `deriveLayoutRelationships`'s pairwise-loop shape exactly (earlier
53
+ * authored region is always `subjectRegion` for every family except
54
+ * `follows-vertically`, whose direction is decided by actual geometry) but
55
+ * has no `unresolvedTargets`/`pageRelationships` concept: every authored
56
+ * region that reaches this function has already passed
57
+ * `isValidReferenceRegions`, so there is no "could not resolve" case, and a
58
+ * static image has no page/viewport to derive a page-level relationship
59
+ * from.
60
+ */
61
+ export function deriveReferenceRegionRelationships(referenceRequestId, regions, options = {}) {
62
+ if (regions.length > MAX_REFERENCE_REGIONS) {
63
+ return { ok: false, reason: `regions has ${regions.length} entries, exceeding the ${MAX_REFERENCE_REGIONS}-region relationship-derivation bound` };
64
+ }
65
+ const geometryTolerancePx = options.geometryTolerancePx ?? 0.5;
66
+ if (!Number.isFinite(geometryTolerancePx) || geometryTolerancePx < 0) {
67
+ return { ok: false, reason: 'geometryTolerancePx must be a non-negative finite number' };
68
+ }
69
+ const entries = regions.map((region) => ({ name: region.id, geometry: deriveReferenceRegionGeometry(region.rectangle) }));
70
+ const pairwiseRelationships = [];
71
+ for (let i = 0; i < entries.length; i += 1) {
72
+ const subject = entries[i];
73
+ for (let j = i + 1; j < entries.length; j += 1) {
74
+ const related = entries[j];
75
+ const evidence = regionGeometryEvidence(subject.name, related.name);
76
+ pairwiseRelationships.push({ kind: horizontalOrderOf(subject.geometry, related.geometry, geometryTolerancePx), subjectRegion: subject.name, relatedRegion: related.name, evidence }, { kind: verticalOrderOf(subject.geometry, related.geometry, geometryTolerancePx), subjectRegion: subject.name, relatedRegion: related.name, evidence }, { kind: areaOverlapOf(subject.geometry, related.geometry, geometryTolerancePx), subjectRegion: subject.name, relatedRegion: related.name, evidence }, { kind: relativeWidthOf(subject.geometry, related.geometry, geometryTolerancePx), subjectRegion: subject.name, relatedRegion: related.name, evidence }, { kind: geometricFitOf(subject.geometry, related.geometry, geometryTolerancePx), subjectRegion: subject.name, relatedRegion: related.name, evidence });
77
+ const sequence = verticalSequenceOf(subject, related, geometryTolerancePx);
78
+ if (sequence) {
79
+ pairwiseRelationships.push({
80
+ kind: 'follows-vertically',
81
+ subjectRegion: sequence.subjectTarget,
82
+ relatedRegion: sequence.relatedTarget,
83
+ evidence: regionGeometryEvidence(sequence.subjectTarget, sequence.relatedTarget),
84
+ });
85
+ }
86
+ }
87
+ }
88
+ return {
89
+ ok: true,
90
+ graph: {
91
+ referenceRequestId,
92
+ geometryTolerancePx,
93
+ regions: entries.map((entry) => entry.name),
94
+ pairwiseRelationships,
95
+ },
96
+ };
97
+ }
98
+ //# sourceMappingURL=externalReferenceRegionRelationships.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"externalReferenceRegionRelationships.js","sourceRoot":"","sources":["../../src/domain/externalReferenceRegionRelationships.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * v0.7 Prompt 2 explicit reference-region geometry. A region is one
3
+ * user/configuration-authored rectangle in the coordinate system of an
4
+ * external reference image - origin at the image's top-left corner, x
5
+ * increasing rightward, y increasing downward, unit is reference-image
6
+ * pixels (never CSS pixels - this is a static image, not a rendered page).
7
+ * Coordinates may be fractional. This module never infers a region from
8
+ * pixel content: no OCR, no computer vision, no automatic segmentation.
9
+ *
10
+ * Only the rectangle {x, y, width, height} is canonical/authored; every
11
+ * other geometric fact (right, bottom, centerX, centerY) is a pure
12
+ * calculation over it (see deriveReferenceRegionGeometry) so that no
13
+ * redundant, potentially-drifting copy of the same fact is ever persisted.
14
+ */
15
+ /** Same character/length convention as request/request.ts's target-name pattern (`^[A-Za-z0-9_-]{1,64}$`) - reused directly, not reinvented, for the same "stable, portable, log/path-safe identifier" reason. */
16
+ export declare const REFERENCE_REGION_ID_PATTERN: RegExp;
17
+ /** Same numeric bound as request/request.ts's MAX_TARGETS (20) - a coincidentally equal, independently-owned constant: reference regions are design-authoring input, not runtime targets, so the two are not structurally coupled even though they share a value and the same "bound the O(n^2) pairwise-relationship explosion" rationale (see externalReferenceRegionRelationships.ts). */
18
+ export declare const MAX_REFERENCE_REGIONS = 20;
19
+ export interface ReferenceRegionRectangle {
20
+ x: number;
21
+ y: number;
22
+ width: number;
23
+ height: number;
24
+ }
25
+ export interface ReferenceRegion {
26
+ id: string;
27
+ rectangle: ReferenceRegionRectangle;
28
+ }
29
+ /** Pure derived geometry over one region's canonical rectangle - never persisted, always recomputed, so it can never drift from {x, y, width, height}. */
30
+ export interface ReferenceRegionGeometry {
31
+ x: number;
32
+ y: number;
33
+ width: number;
34
+ height: number;
35
+ right: number;
36
+ bottom: number;
37
+ centerX: number;
38
+ centerY: number;
39
+ }
40
+ export declare function deriveReferenceRegionGeometry(rectangle: ReferenceRegionRectangle): ReferenceRegionGeometry;
41
+ export type ReferenceRegionValidationResult = {
42
+ valid: true;
43
+ } | {
44
+ valid: false;
45
+ reason: string;
46
+ };
47
+ /**
48
+ * Structural + numeric validation of one rectangle only - does not know
49
+ * about image bounds (see isValidReferenceRegions for the boundary check,
50
+ * which needs the owning image's dimensions). Fails closed on non-finite,
51
+ * negative, or zero width/height: authored design geometry is never
52
+ * silently clamped into validity.
53
+ */
54
+ export declare function isValidReferenceRegionRectangle(value: unknown): ReferenceRegionValidationResult;
55
+ export declare function isValidReferenceRegion(value: unknown): ReferenceRegionValidationResult;
56
+ /**
57
+ * Collection-level validation: bounded count, unique IDs (case-insensitive,
58
+ * mirroring request/request.ts's target-name dedup convention), and every
59
+ * region's rectangle contained within the owning image's own dimensions -
60
+ * never silently clipped, rejected outright instead. `imageWidth`/
61
+ * `imageHeight` come from the artifact's own already-validated image
62
+ * metadata (ExternalReferenceImageReference or the approved artifact's
63
+ * sourceReference.image), never re-parsed here.
64
+ */
65
+ export declare function isValidReferenceRegions(value: unknown, imageWidth: number, imageHeight: number): ReferenceRegionValidationResult;