@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,169 @@
1
+ import { join } from 'node:path';
2
+ import { stat } from 'node:fs/promises';
3
+ import { classifyManifest } from './classify.js';
4
+ import { decodeArtifactHandle } from './handles.js';
5
+ import { resolveContainedDir } from './pathSafety.js';
6
+ import { discoverManifests } from './discovery.js';
7
+ import { encodeArtifactHandle } from './handles.js';
8
+ import { MAX_INDEX_RECORDS } from './limits.js';
9
+ import { deriveReferenceRegionRelationships } from '../../domain/externalReferenceRegionRelationships.js';
10
+ import { deriveReferenceRequirementAdequacy } from '../../domain/externalReferenceRequirements.js';
11
+ import { evaluateReferenceCandidateCompatibility } from '../../domain/externalReferenceCompatibility.js';
12
+ import { isValidReferenceRuntimeBindingDeclarations, evaluateReferenceRuntimeBindings } from '../../domain/externalReferenceRuntimeBinding.js';
13
+ import { deriveCoordinateScale, evaluateReferenceCandidateFidelity } from '../../domain/externalReferenceFidelity.js';
14
+ async function loadDirAndClassify(root, handle) {
15
+ const decoded = decodeArtifactHandle(handle);
16
+ if (!decoded.ok)
17
+ return { ok: false, reason: 'unknown-handle' };
18
+ const dir = resolveContainedDir(root, decoded.relativeDir);
19
+ if (dir === undefined)
20
+ return { ok: false, reason: 'unknown-handle' };
21
+ try {
22
+ const dirInfo = await stat(dir);
23
+ if (!dirInfo.isDirectory())
24
+ return { ok: false, reason: 'unknown-handle' };
25
+ }
26
+ catch {
27
+ return { ok: false, reason: 'unknown-handle' };
28
+ }
29
+ const classified = await classifyManifest(join(dir, 'manifest.json'));
30
+ return { ok: true, decoded, classified };
31
+ }
32
+ /**
33
+ * Batch 5's one additive server-side computation for a selected external
34
+ * reference on its own (no candidate yet): derives the reference's own
35
+ * region-relationship graph (`deriveReferenceRegionRelationships`) and
36
+ * requirement adequacy (`deriveReferenceRequirementAdequacy`) - both pure
37
+ * functions over the artifact's own already-persisted `regions`/
38
+ * `requirements`, never persisted themselves, never a second derivation
39
+ * engine. Mirrors observationView.ts's server-side-derivation pattern
40
+ * (Batch 3) rather than re-deriving in the browser.
41
+ */
42
+ export async function getReferenceView(root, handle) {
43
+ const loaded = await loadDirAndClassify(root, handle);
44
+ if (!loaded.ok)
45
+ return loaded;
46
+ const { classified } = loaded;
47
+ if (classified.supportState !== 'supported')
48
+ return { ok: false, reason: 'not-currently-loadable' };
49
+ if (classified.family !== 'external-reference-imported' && classified.family !== 'external-reference-approved') {
50
+ return { ok: false, reason: 'not-a-reference' };
51
+ }
52
+ const artifact = classified.artifact;
53
+ const regions = artifact.regions ?? [];
54
+ const requirements = artifact.requirements ?? [];
55
+ let regionRelationships;
56
+ if (regions.length > 0) {
57
+ const derived = deriveReferenceRegionRelationships(artifact.referenceRequestId, regions);
58
+ regionRelationships = derived.ok ? derived.graph : undefined;
59
+ }
60
+ const requirementAdequacy = requirements.length > 0 || regions.length > 0 ? deriveReferenceRequirementAdequacy(regions, requirements) : undefined;
61
+ return { ok: true, regionRelationships, requirementAdequacy };
62
+ }
63
+ function candidateReferencesMatch(ref, candidate) {
64
+ return ref.observationId === candidate.observationId && ref.requestId === candidate.requestId && ref.producer.version === candidate.producer.version && ref.observationSchemaVersion === candidate.schemaVersion;
65
+ }
66
+ /**
67
+ * Shared handle-decode -> contained-dir-resolve -> re-classify resolution
68
+ * for a (reference, candidate) pair, reused by every Batch 5/6 route that
69
+ * needs both - never duplicated per route.
70
+ */
71
+ async function resolveReferenceAndCandidate(root, referenceHandle, candidateHandle) {
72
+ const referenceLoaded = await loadDirAndClassify(root, referenceHandle);
73
+ if (!referenceLoaded.ok)
74
+ return { ok: false, reason: 'unknown-reference-handle' };
75
+ if (referenceLoaded.classified.supportState !== 'supported')
76
+ return { ok: false, reason: 'not-currently-loadable' };
77
+ if (referenceLoaded.classified.family !== 'external-reference-imported' && referenceLoaded.classified.family !== 'external-reference-approved') {
78
+ return { ok: false, reason: 'not-a-reference' };
79
+ }
80
+ const reference = referenceLoaded.classified.artifact;
81
+ const candidateLoaded = await loadDirAndClassify(root, candidateHandle);
82
+ if (!candidateLoaded.ok)
83
+ return { ok: false, reason: 'unknown-candidate-handle' };
84
+ if (candidateLoaded.classified.supportState !== 'supported')
85
+ return { ok: false, reason: 'not-currently-loadable' };
86
+ if (candidateLoaded.classified.family !== 'observation')
87
+ return { ok: false, reason: 'not-an-observation' };
88
+ const candidate = candidateLoaded.classified.artifact;
89
+ return { ok: true, reference, candidate };
90
+ }
91
+ /**
92
+ * Batch 5's reference/candidate computation: evaluates page/state-level
93
+ * compatibility through the existing canonical
94
+ * `evaluateReferenceCandidateCompatibility` (never a second, viewer-owned
95
+ * compatibility model), and separately lists every existing
96
+ * `FrontendContractEvaluationArtifact` whose own persisted `after` reference
97
+ * exactly identifies this candidate (frozen plan/task §29) - for the caller
98
+ * to offer as an explicit, never-auto-selected optional context. Batch 6
99
+ * additionally exposes `coordinateMapping` - the exact result of the
100
+ * existing canonical `deriveCoordinateScale(reference)` (exported from
101
+ * `externalReferenceFidelity.ts`, never a second scale/aspect-ratio
102
+ * implementation) - purely a function of the reference (independent of the
103
+ * candidate), used only to gate view-lock eligibility client-side. Neither
104
+ * `evaluateReferenceRuntimeBindings` nor `evaluateReferenceCandidateFidelity`
105
+ * is called anywhere in this function.
106
+ */
107
+ export async function getReferenceCandidateView(root, referenceHandle, candidateHandle) {
108
+ const resolved = await resolveReferenceAndCandidate(root, referenceHandle, candidateHandle);
109
+ if (!resolved.ok)
110
+ return resolved;
111
+ const { reference, candidate } = resolved;
112
+ const compatibility = evaluateReferenceCandidateCompatibility(reference, candidate);
113
+ const coordinateMapping = deriveCoordinateScale(reference);
114
+ const discovery = await discoverManifests(root);
115
+ const evaluationHandles = [];
116
+ for (const manifest of discovery.manifests.slice(0, MAX_INDEX_RECORDS)) {
117
+ const classified = await classifyManifest(manifest.absolutePath);
118
+ if (classified.supportState !== 'supported' || classified.family !== 'contract-evaluation')
119
+ continue;
120
+ if (candidateReferencesMatch(classified.artifact.after, candidate)) {
121
+ evaluationHandles.push(encodeArtifactHandle('contract-evaluation', manifest.relativeDir));
122
+ }
123
+ }
124
+ return { ok: true, compatibility, evaluationHandles, coordinateMapping };
125
+ }
126
+ /**
127
+ * Batch 6: validates the session's explicit binding declarations against
128
+ * THIS specific reference (`isValidReferenceRuntimeBindingDeclarations` -
129
+ * region existence depends on the selected reference, so this can only
130
+ * happen here, never at CLI startup) and, if valid, calls the existing
131
+ * canonical `evaluateReferenceRuntimeBindings` exactly once - never a second
132
+ * binding engine, never a client-side re-verification via geometry/name.
133
+ */
134
+ export async function getReferenceBindings(root, referenceHandle, candidateHandle, declarations) {
135
+ const resolved = await resolveReferenceAndCandidate(root, referenceHandle, candidateHandle);
136
+ if (!resolved.ok)
137
+ return resolved;
138
+ const { reference, candidate } = resolved;
139
+ const declarationsValidation = isValidReferenceRuntimeBindingDeclarations(declarations, reference);
140
+ if (!declarationsValidation.valid)
141
+ return { ok: false, reason: 'invalid-bindings', detail: declarationsValidation.reason };
142
+ const result = evaluateReferenceRuntimeBindings(reference, candidate, declarations);
143
+ if (!result.ok)
144
+ return { ok: false, reason: 'invalid-bindings', detail: result.reason };
145
+ return { ok: true, evaluation: result.evaluation };
146
+ }
147
+ /**
148
+ * Batch 6's one on-demand server-side computation for the explicit
149
+ * "Evaluate Fidelity" action: calls the existing canonical
150
+ * `evaluateReferenceCandidateFidelity` exactly once, using the exact same
151
+ * session binding declarations `getReferenceBindings` uses (so the two
152
+ * always structurally agree for the same inputs, being the same pure
153
+ * function applied to the same arguments - never two divergent binding
154
+ * results). Never persists the result; ephemeral per request.
155
+ */
156
+ export async function getReferenceFidelity(root, referenceHandle, candidateHandle, declarations) {
157
+ const resolved = await resolveReferenceAndCandidate(root, referenceHandle, candidateHandle);
158
+ if (!resolved.ok)
159
+ return resolved;
160
+ const { reference, candidate } = resolved;
161
+ const declarationsValidation = isValidReferenceRuntimeBindingDeclarations(declarations, reference);
162
+ if (!declarationsValidation.valid)
163
+ return { ok: false, reason: 'invalid-bindings', detail: declarationsValidation.reason };
164
+ const result = evaluateReferenceCandidateFidelity(reference, candidate, declarations);
165
+ if (!result.ok)
166
+ return { ok: false, reason: 'invalid-bindings', detail: result.reason };
167
+ return { ok: true, evaluation: result.evaluation };
168
+ }
169
+ //# sourceMappingURL=referenceView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"referenceView.js","sourceRoot":"","sources":["../../../src/viewerServer/evidence/referenceView.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { type Server } from 'node:http';
2
+ import type { ContextSessionState } from './context.js';
3
+ import type { ViewerAliasMetadata } from './viewerService.js';
4
+ /** Batch 1 viewer protocol identity: the shape of GET /api/status. Bumped independently of package/schema versions if the status contract itself changes. */
5
+ export declare const VIEWER_PROTOCOL_VERSION = "1.0.0";
6
+ export interface ViewerServerState {
7
+ /** The explicit, caller-supplied local evidence root this viewer session represents. Never interpreted as Observer evidence in Batch 1. */
8
+ root: string;
9
+ /** v0.8 Batch 6: explicit, session-only binding declarations loaded once at CLI startup from an optional `--bindings-file`. Not yet validated against any specific reference - see `referenceView.ts`. */
10
+ bindingDeclarations: readonly unknown[];
11
+ /** v0.8 Batch 7: explicit, session-only bounded-agent-context state loaded once at CLI startup from an optional `--context-file`. Defaults to `{status:'none'}` - see `context.ts`. */
12
+ context: ContextSessionState;
13
+ aliasMetadata?: ViewerAliasMetadata;
14
+ }
15
+ export interface CreateViewerServerOptions {
16
+ /** Absolute path to the built viewer static assets (index.html, JS/CSS bundles, manifest, icons). */
17
+ assetsRoot: string;
18
+ state: ViewerServerState;
19
+ }
20
+ /**
21
+ * Builds (but does not start listening on) the loopback-only viewer HTTP
22
+ * server. Read-only: serves only the built viewer application shell plus one
23
+ * minimal status endpoint. Never serves the evidence root as a generic
24
+ * static directory, never accepts write methods, and fails closed on any
25
+ * path that would resolve outside `assetsRoot`.
26
+ */
27
+ export declare function createViewerServer(options: CreateViewerServerOptions): Server;
@@ -0,0 +1,381 @@
1
+ import { createServer } from 'node:http';
2
+ import { createReadStream } from 'node:fs';
3
+ import { readFile, stat } from 'node:fs/promises';
4
+ import { extname, join, normalize, resolve, sep } from 'node:path';
5
+ import { getProducerInfo } from '../domain/schema.js';
6
+ import { buildEvidenceIndexMetadata, loadArtifactByHandle } from './evidence/index.js';
7
+ import { resolveMedia } from './evidence/mediaResolver.js';
8
+ import { getObservationRelationships } from './evidence/observationView.js';
9
+ import { getComparisonView } from './evidence/comparisonView.js';
10
+ import { getEvaluationView } from './evidence/evaluationView.js';
11
+ import { getReferenceView, getReferenceCandidateView, getReferenceBindings, getReferenceFidelity } from './evidence/referenceView.js';
12
+ import { resolveContextSources } from './evidence/contextSourceView.js';
13
+ /** Batch 1 viewer protocol identity: the shape of GET /api/status. Bumped independently of package/schema versions if the status contract itself changes. */
14
+ export const VIEWER_PROTOCOL_VERSION = '1.0.0';
15
+ const MIME_TYPES = {
16
+ '.html': 'text/html; charset=utf-8',
17
+ '.js': 'text/javascript; charset=utf-8',
18
+ '.mjs': 'text/javascript; charset=utf-8',
19
+ '.css': 'text/css; charset=utf-8',
20
+ '.json': 'application/json; charset=utf-8',
21
+ '.webmanifest': 'application/manifest+json; charset=utf-8',
22
+ '.svg': 'image/svg+xml',
23
+ '.png': 'image/png',
24
+ '.ico': 'image/x-icon',
25
+ '.woff2': 'font/woff2',
26
+ };
27
+ function mimeTypeFor(path) {
28
+ return MIME_TYPES[extname(path).toLowerCase()] ?? 'application/octet-stream';
29
+ }
30
+ /**
31
+ * Resolves a requested URL pathname against the built viewer asset root,
32
+ * refusing to leave that root under any circumstance (encoded traversal,
33
+ * `..` segments, absolute-looking segments). Returns `undefined` when the
34
+ * request cannot possibly map to a safe on-disk path - callers must treat
35
+ * that as "not found", never attempt a fallback read.
36
+ */
37
+ function resolveAssetPath(assetsRoot, pathname) {
38
+ let decoded;
39
+ try {
40
+ decoded = decodeURIComponent(pathname);
41
+ }
42
+ catch {
43
+ return undefined;
44
+ }
45
+ const normalized = normalize(decoded).replace(/^([/\\])+/, '');
46
+ const candidate = resolve(assetsRoot, normalized);
47
+ const rootWithSep = assetsRoot.endsWith(sep) ? assetsRoot : assetsRoot + sep;
48
+ if (candidate !== assetsRoot && !candidate.startsWith(rootWithSep)) {
49
+ return undefined;
50
+ }
51
+ return candidate;
52
+ }
53
+ /**
54
+ * Builds (but does not start listening on) the loopback-only viewer HTTP
55
+ * server. Read-only: serves only the built viewer application shell plus one
56
+ * minimal status endpoint. Never serves the evidence root as a generic
57
+ * static directory, never accepts write methods, and fails closed on any
58
+ * path that would resolve outside `assetsRoot`.
59
+ */
60
+ export function createViewerServer(options) {
61
+ const { assetsRoot, state } = options;
62
+ return createServer((req, res) => {
63
+ void handleRequest(req, res, assetsRoot, state);
64
+ });
65
+ }
66
+ async function handleRequest(req, res, assetsRoot, state) {
67
+ const method = req.method ?? 'GET';
68
+ if (method !== 'GET' && method !== 'HEAD') {
69
+ res.writeHead(405, { 'content-type': 'text/plain; charset=utf-8', allow: 'GET, HEAD' });
70
+ res.end('method not allowed');
71
+ return;
72
+ }
73
+ let pathname;
74
+ try {
75
+ pathname = new URL(req.url ?? '/', 'http://viewer.local').pathname;
76
+ }
77
+ catch {
78
+ res.writeHead(400, { 'content-type': 'text/plain; charset=utf-8' });
79
+ res.end('bad request');
80
+ return;
81
+ }
82
+ if (pathname === '/api/status') {
83
+ const body = JSON.stringify({
84
+ ok: true,
85
+ viewerProtocolVersion: VIEWER_PROTOCOL_VERSION,
86
+ producer: getProducerInfo(),
87
+ root: state.root,
88
+ });
89
+ res.writeHead(200, { 'content-type': 'application/json; charset=utf-8', 'cache-control': 'no-store' });
90
+ res.end(method === 'HEAD' ? undefined : body);
91
+ return;
92
+ }
93
+ if (pathname === '/api/index') {
94
+ const result = await buildEvidenceIndexMetadata(state.root, state.aliasMetadata?.observationAliasesByRelativeDir ?? {});
95
+ const body = JSON.stringify({ ok: true, records: result.records, truncated: result.truncated });
96
+ res.writeHead(200, { 'content-type': 'application/json; charset=utf-8', 'cache-control': 'no-store' });
97
+ res.end(method === 'HEAD' ? undefined : body);
98
+ return;
99
+ }
100
+ const artifactMatch = /^\/api\/artifacts\/([^/]+)$/.exec(pathname);
101
+ if (artifactMatch) {
102
+ const handle = decodeURIComponentSafe(artifactMatch[1]);
103
+ if (handle === undefined) {
104
+ writeJsonError(res, method, 400, 'malformed artifact handle');
105
+ return;
106
+ }
107
+ const result = await loadArtifactByHandle(state.root, handle);
108
+ if (!result.ok) {
109
+ const status = result.reason === 'unknown-handle' ? 404 : 409;
110
+ const body = result.reason === 'unknown-handle' ? { ok: false, error: 'unknown viewer artifact handle' } : { ok: false, error: 'artifact is not currently loadable', metadata: result.metadata };
111
+ writeJsonBody(res, method, status, body);
112
+ return;
113
+ }
114
+ writeJsonBody(res, method, 200, { ok: true, handle: result.detail.handle, family: result.detail.family, artifact: result.detail.artifact });
115
+ return;
116
+ }
117
+ const mediaMatch = /^\/api\/media\/([^/]+)\/([^/]+)$/.exec(pathname);
118
+ if (mediaMatch) {
119
+ const handle = decodeURIComponentSafe(mediaMatch[1]);
120
+ const role = decodeURIComponentSafe(mediaMatch[2]);
121
+ if (handle === undefined || role === undefined) {
122
+ writeJsonError(res, method, 400, 'malformed media request');
123
+ return;
124
+ }
125
+ const resolution = await resolveMedia(state.root, handle, role);
126
+ if (!resolution.ok) {
127
+ writeJsonError(res, method, 404, resolution.reason);
128
+ return;
129
+ }
130
+ await streamFile(resolution.absolutePath, resolution.mimeType, res, method);
131
+ return;
132
+ }
133
+ const relationshipsMatch = /^\/api\/observations\/([^/]+)\/relationships$/.exec(pathname);
134
+ if (relationshipsMatch) {
135
+ const handle = decodeURIComponentSafe(relationshipsMatch[1]);
136
+ if (handle === undefined) {
137
+ writeJsonError(res, method, 400, 'malformed observation handle');
138
+ return;
139
+ }
140
+ const result = await getObservationRelationships(state.root, handle);
141
+ if (!result.ok) {
142
+ const status = result.reason === 'unknown-handle' ? 404 : 409;
143
+ const error = result.reason === 'unknown-handle'
144
+ ? 'unknown viewer artifact handle'
145
+ : result.reason === 'not-an-observation'
146
+ ? 'relationships are only defined for observation evidence'
147
+ : result.reason === 'not-currently-loadable'
148
+ ? 'observation is not currently loadable'
149
+ : `relationship derivation failed: ${result.detail}`;
150
+ writeJsonBody(res, method, status, { ok: false, error });
151
+ return;
152
+ }
153
+ writeJsonBody(res, method, 200, { ok: true, graph: result.graph });
154
+ return;
155
+ }
156
+ const comparisonViewMatch = /^\/api\/comparisons\/([^/]+)\/view$/.exec(pathname);
157
+ if (comparisonViewMatch) {
158
+ const handle = decodeURIComponentSafe(comparisonViewMatch[1]);
159
+ if (handle === undefined) {
160
+ writeJsonError(res, method, 400, 'malformed comparison handle');
161
+ return;
162
+ }
163
+ const result = await getComparisonView(state.root, handle);
164
+ if (!result.ok) {
165
+ const status = result.reason === 'unknown-handle' ? 404 : 409;
166
+ const error = result.reason === 'unknown-handle' ? 'unknown viewer artifact handle' : result.reason === 'not-a-comparison' ? 'view is only defined for comparison evidence' : 'comparison is not currently loadable';
167
+ writeJsonBody(res, method, status, { ok: false, error });
168
+ return;
169
+ }
170
+ writeJsonBody(res, method, 200, { ok: true, before: result.before, after: result.after });
171
+ return;
172
+ }
173
+ const evaluationViewMatch = /^\/api\/evaluations\/([^/]+)\/view$/.exec(pathname);
174
+ if (evaluationViewMatch) {
175
+ const handle = decodeURIComponentSafe(evaluationViewMatch[1]);
176
+ if (handle === undefined) {
177
+ writeJsonError(res, method, 400, 'malformed evaluation handle');
178
+ return;
179
+ }
180
+ const result = await getEvaluationView(state.root, handle);
181
+ if (!result.ok) {
182
+ const status = result.reason === 'unknown-handle' ? 404 : 409;
183
+ const error = result.reason === 'unknown-handle' ? 'unknown viewer artifact handle' : result.reason === 'not-an-evaluation' ? 'view is only defined for contract-evaluation evidence' : 'evaluation is not currently loadable';
184
+ writeJsonBody(res, method, status, { ok: false, error });
185
+ return;
186
+ }
187
+ writeJsonBody(res, method, 200, { ok: true, comparison: result.comparison, baseline: result.baseline, change: result.change, before: result.before, after: result.after });
188
+ return;
189
+ }
190
+ const referenceViewMatch = /^\/api\/references\/([^/]+)\/view$/.exec(pathname);
191
+ if (referenceViewMatch) {
192
+ const handle = decodeURIComponentSafe(referenceViewMatch[1]);
193
+ if (handle === undefined) {
194
+ writeJsonError(res, method, 400, 'malformed reference handle');
195
+ return;
196
+ }
197
+ const result = await getReferenceView(state.root, handle);
198
+ if (!result.ok) {
199
+ const status = result.reason === 'unknown-handle' ? 404 : 409;
200
+ const error = result.reason === 'unknown-handle' ? 'unknown viewer artifact handle' : result.reason === 'not-a-reference' ? 'view is only defined for external-reference evidence' : 'reference is not currently loadable';
201
+ writeJsonBody(res, method, status, { ok: false, error });
202
+ return;
203
+ }
204
+ writeJsonBody(res, method, 200, { ok: true, regionRelationships: result.regionRelationships ?? null, requirementAdequacy: result.requirementAdequacy ?? null });
205
+ return;
206
+ }
207
+ const referenceCandidateViewMatch = /^\/api\/references\/([^/]+)\/candidate\/([^/]+)\/view$/.exec(pathname);
208
+ if (referenceCandidateViewMatch) {
209
+ const referenceHandle = decodeURIComponentSafe(referenceCandidateViewMatch[1]);
210
+ const candidateHandle = decodeURIComponentSafe(referenceCandidateViewMatch[2]);
211
+ if (referenceHandle === undefined || candidateHandle === undefined) {
212
+ writeJsonError(res, method, 400, 'malformed reference/candidate request');
213
+ return;
214
+ }
215
+ const result = await getReferenceCandidateView(state.root, referenceHandle, candidateHandle);
216
+ if (!result.ok) {
217
+ const status = result.reason === 'unknown-reference-handle' || result.reason === 'unknown-candidate-handle' ? 404 : 409;
218
+ const error = result.reason === 'unknown-reference-handle'
219
+ ? 'unknown viewer reference handle'
220
+ : result.reason === 'unknown-candidate-handle'
221
+ ? 'unknown viewer candidate handle'
222
+ : result.reason === 'not-a-reference'
223
+ ? 'the first handle is not external-reference evidence'
224
+ : result.reason === 'not-an-observation'
225
+ ? 'the second handle is not observation evidence'
226
+ : 'reference or candidate is not currently loadable';
227
+ writeJsonBody(res, method, status, { ok: false, error });
228
+ return;
229
+ }
230
+ writeJsonBody(res, method, 200, { ok: true, compatibility: result.compatibility, evaluationHandles: result.evaluationHandles, coordinateMapping: result.coordinateMapping });
231
+ return;
232
+ }
233
+ const referenceBindingsMatch = /^\/api\/references\/([^/]+)\/candidate\/([^/]+)\/bindings$/.exec(pathname);
234
+ if (referenceBindingsMatch) {
235
+ const referenceHandle = decodeURIComponentSafe(referenceBindingsMatch[1]);
236
+ const candidateHandle = decodeURIComponentSafe(referenceBindingsMatch[2]);
237
+ if (referenceHandle === undefined || candidateHandle === undefined) {
238
+ writeJsonError(res, method, 400, 'malformed reference/candidate binding request');
239
+ return;
240
+ }
241
+ const result = await getReferenceBindings(state.root, referenceHandle, candidateHandle, state.bindingDeclarations);
242
+ if (!result.ok) {
243
+ const status = result.reason === 'unknown-reference-handle' || result.reason === 'unknown-candidate-handle' ? 404 : result.reason === 'invalid-bindings' ? 422 : 409;
244
+ const error = result.reason === 'unknown-reference-handle'
245
+ ? 'unknown viewer reference handle'
246
+ : result.reason === 'unknown-candidate-handle'
247
+ ? 'unknown viewer candidate handle'
248
+ : result.reason === 'not-a-reference'
249
+ ? 'the first handle is not external-reference evidence'
250
+ : result.reason === 'not-an-observation'
251
+ ? 'the second handle is not observation evidence'
252
+ : result.reason === 'invalid-bindings'
253
+ ? `the session's binding declarations are invalid for this reference: ${result.detail}`
254
+ : 'reference or candidate is not currently loadable';
255
+ writeJsonBody(res, method, status, { ok: false, error });
256
+ return;
257
+ }
258
+ writeJsonBody(res, method, 200, { ok: true, evaluation: result.evaluation });
259
+ return;
260
+ }
261
+ const referenceFidelityMatch = /^\/api\/references\/([^/]+)\/candidate\/([^/]+)\/fidelity$/.exec(pathname);
262
+ if (referenceFidelityMatch) {
263
+ const referenceHandle = decodeURIComponentSafe(referenceFidelityMatch[1]);
264
+ const candidateHandle = decodeURIComponentSafe(referenceFidelityMatch[2]);
265
+ if (referenceHandle === undefined || candidateHandle === undefined) {
266
+ writeJsonError(res, method, 400, 'malformed reference/candidate fidelity request');
267
+ return;
268
+ }
269
+ const result = await getReferenceFidelity(state.root, referenceHandle, candidateHandle, state.bindingDeclarations);
270
+ if (!result.ok) {
271
+ const status = result.reason === 'unknown-reference-handle' || result.reason === 'unknown-candidate-handle' ? 404 : result.reason === 'invalid-bindings' ? 422 : 409;
272
+ const error = result.reason === 'unknown-reference-handle'
273
+ ? 'unknown viewer reference handle'
274
+ : result.reason === 'unknown-candidate-handle'
275
+ ? 'unknown viewer candidate handle'
276
+ : result.reason === 'not-a-reference'
277
+ ? 'the first handle is not external-reference evidence'
278
+ : result.reason === 'not-an-observation'
279
+ ? 'the second handle is not observation evidence'
280
+ : result.reason === 'invalid-bindings'
281
+ ? `the session's binding declarations are invalid for this reference: ${result.detail}`
282
+ : 'reference or candidate is not currently loadable';
283
+ writeJsonBody(res, method, status, { ok: false, error });
284
+ return;
285
+ }
286
+ writeJsonBody(res, method, 200, { ok: true, evaluation: result.evaluation });
287
+ return;
288
+ }
289
+ if (pathname === '/api/context') {
290
+ if (state.context.status === 'none') {
291
+ writeJsonBody(res, method, 200, { ok: true, status: 'none' });
292
+ return;
293
+ }
294
+ if (state.context.status === 'unsupported-version') {
295
+ writeJsonBody(res, method, 200, { ok: true, status: 'unsupported-version', foundSchemaVersion: state.context.foundSchemaVersion });
296
+ return;
297
+ }
298
+ const sourceResolution = await resolveContextSources(state.root, state.context.artifact.sources);
299
+ writeJsonBody(res, method, 200, { ok: true, status: 'valid', artifact: state.context.artifact, sourceResolution });
300
+ return;
301
+ }
302
+ if (pathname.startsWith('/api/')) {
303
+ writeJsonError(res, method, 404, 'unknown viewer API route');
304
+ return;
305
+ }
306
+ const isAssetLikePath = extname(pathname) !== '';
307
+ const candidatePath = resolveAssetPath(assetsRoot, pathname === '/' ? '/index.html' : pathname);
308
+ if (candidatePath !== undefined) {
309
+ const served = await tryServeFile(candidatePath, res, method);
310
+ if (served)
311
+ return;
312
+ if (isAssetLikePath) {
313
+ res.writeHead(404, { 'content-type': 'text/plain; charset=utf-8' });
314
+ res.end('not found');
315
+ return;
316
+ }
317
+ }
318
+ // SPA fallback for unknown, non-asset viewer routes (e.g. future client-side navigation): serve the shell itself rather than a bare 404.
319
+ const indexPath = join(assetsRoot, 'index.html');
320
+ const servedIndex = await tryServeFile(indexPath, res, method);
321
+ if (!servedIndex) {
322
+ res.writeHead(503, { 'content-type': 'text/plain; charset=utf-8' });
323
+ res.end('viewer assets are not built - run the package build before starting the viewer');
324
+ }
325
+ }
326
+ function decodeURIComponentSafe(value) {
327
+ try {
328
+ return decodeURIComponent(value);
329
+ }
330
+ catch {
331
+ return undefined;
332
+ }
333
+ }
334
+ function writeJsonBody(res, method, status, body) {
335
+ res.writeHead(status, { 'content-type': 'application/json; charset=utf-8', 'cache-control': 'no-store' });
336
+ res.end(method === 'HEAD' ? undefined : JSON.stringify(body));
337
+ }
338
+ function writeJsonError(res, method, status, error) {
339
+ writeJsonBody(res, method, status, { ok: false, error });
340
+ }
341
+ /** Streams one already-resolved, already-contained media file. Never used for arbitrary paths - callers must have gone through mediaResolver.ts's handle/role validation first. */
342
+ async function streamFile(absolutePath, mimeType, res, method) {
343
+ let size;
344
+ try {
345
+ size = (await stat(absolutePath)).size;
346
+ }
347
+ catch {
348
+ writeJsonError(res, method, 404, 'media file not found on disk');
349
+ return;
350
+ }
351
+ res.writeHead(200, { 'content-type': mimeType, 'content-length': size, 'cache-control': 'no-store' });
352
+ if (method === 'HEAD') {
353
+ res.end();
354
+ return;
355
+ }
356
+ await new Promise((resolvePromise, reject) => {
357
+ const stream = createReadStream(absolutePath);
358
+ stream.on('error', reject);
359
+ stream.on('end', resolvePromise);
360
+ stream.pipe(res);
361
+ });
362
+ }
363
+ async function tryServeFile(path, res, method) {
364
+ try {
365
+ const info = await stat(path);
366
+ if (!info.isFile())
367
+ return false;
368
+ const body = await readFile(path);
369
+ res.writeHead(200, {
370
+ 'content-type': mimeTypeFor(path),
371
+ 'content-length': body.byteLength,
372
+ 'cache-control': path.endsWith('index.html') ? 'no-cache' : 'public, max-age=31536000, immutable',
373
+ });
374
+ res.end(method === 'HEAD' ? undefined : body);
375
+ return true;
376
+ }
377
+ catch {
378
+ return false;
379
+ }
380
+ }
381
+ //# sourceMappingURL=httpServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpServer.js","sourceRoot":"","sources":["../../src/viewerServer/httpServer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Best-effort convenience only: opens the platform default browser at `url`
3
+ * using OS-native commands (no dependency). Failure here must never affect
4
+ * viewer server startup success - callers treat a rejected promise as
5
+ * non-fatal and continue with the server already running.
6
+ */
7
+ export declare function openInDefaultBrowser(url: string): Promise<void>;