@dailephd/my-frontend-observer 0.8.1 → 0.9.0

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 (107) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/README.md +107 -7
  3. package/dist/application/projectWorkflowService.d.ts +18 -1
  4. package/dist/application/projectWorkflowService.js +40 -2
  5. package/dist/application/projectWorkflowService.js.map +1 -1
  6. package/dist/application/visualAnnotationContractPromotionService.d.ts +41 -0
  7. package/dist/application/visualAnnotationContractPromotionService.js +143 -0
  8. package/dist/application/visualAnnotationContractPromotionService.js.map +1 -0
  9. package/dist/application/visualAnnotationPersistenceService.d.ts +34 -0
  10. package/dist/application/visualAnnotationPersistenceService.js +68 -0
  11. package/dist/application/visualAnnotationPersistenceService.js.map +1 -0
  12. package/dist/application/visualAnnotationReferenceMaterializationService.d.ts +53 -0
  13. package/dist/application/visualAnnotationReferenceMaterializationService.js +194 -0
  14. package/dist/application/visualAnnotationReferenceMaterializationService.js.map +1 -0
  15. package/dist/artifacts/visualAnnotationArtifactReader.d.ts +19 -0
  16. package/dist/artifacts/visualAnnotationArtifactReader.js +66 -0
  17. package/dist/artifacts/visualAnnotationArtifactReader.js.map +1 -0
  18. package/dist/artifacts/visualAnnotationArtifactWriter.d.ts +42 -0
  19. package/dist/artifacts/visualAnnotationArtifactWriter.js +85 -0
  20. package/dist/artifacts/visualAnnotationArtifactWriter.js.map +1 -0
  21. package/dist/cli.js +464 -454
  22. package/dist/cli.js.map +1 -1
  23. package/dist/domain/visualAnnotation.d.ts +217 -0
  24. package/dist/domain/visualAnnotation.js +584 -0
  25. package/dist/domain/visualAnnotation.js.map +1 -0
  26. package/dist/domain/visualAnnotationIdentity.d.ts +17 -0
  27. package/dist/domain/visualAnnotationIdentity.js +47 -0
  28. package/dist/domain/visualAnnotationIdentity.js.map +1 -0
  29. package/dist/index.d.ts +11 -0
  30. package/dist/index.js +6 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/projectWorkflow/projectPaths.d.ts +9 -0
  33. package/dist/projectWorkflow/projectPaths.js +21 -0
  34. package/dist/projectWorkflow/projectPaths.js.map +1 -1
  35. package/dist/viewer/assets/{index-CN_yb9Uf.css → index-BN41MI7m.css} +1 -1
  36. package/dist/viewer/assets/index-CkKXnlrI.js +9 -0
  37. package/dist/viewer/index.html +2 -2
  38. package/dist/viewer/sw.js +1 -1
  39. package/dist/viewerServer/annotationAuthoring.d.ts +64 -0
  40. package/dist/viewerServer/annotationAuthoring.js +230 -0
  41. package/dist/viewerServer/annotationAuthoring.js.map +1 -0
  42. package/dist/viewerServer/annotationContractPromotion.d.ts +51 -0
  43. package/dist/viewerServer/annotationContractPromotion.js +105 -0
  44. package/dist/viewerServer/annotationContractPromotion.js.map +1 -0
  45. package/dist/viewerServer/annotationReferenceMaterialization.d.ts +40 -0
  46. package/dist/viewerServer/annotationReferenceMaterialization.js +91 -0
  47. package/dist/viewerServer/annotationReferenceMaterialization.js.map +1 -0
  48. package/dist/viewerServer/authoringSecurity.d.ts +59 -0
  49. package/dist/viewerServer/authoringSecurity.js +112 -0
  50. package/dist/viewerServer/authoringSecurity.js.map +1 -0
  51. package/dist/viewerServer/evidence/annotationView.d.ts +28 -0
  52. package/dist/viewerServer/evidence/annotationView.js +43 -0
  53. package/dist/viewerServer/evidence/annotationView.js.map +1 -0
  54. package/dist/viewerServer/evidence/classify.d.ts +3 -1
  55. package/dist/viewerServer/evidence/classify.js +12 -0
  56. package/dist/viewerServer/evidence/classify.js.map +1 -1
  57. package/dist/viewerServer/evidence/discovery.d.ts +2 -0
  58. package/dist/viewerServer/evidence/discovery.js +6 -0
  59. package/dist/viewerServer/evidence/discovery.js.map +1 -1
  60. package/dist/viewerServer/evidence/handles.js +1 -0
  61. package/dist/viewerServer/evidence/handles.js.map +1 -1
  62. package/dist/viewerServer/evidence/index.d.ts +29 -0
  63. package/dist/viewerServer/evidence/index.js +43 -1
  64. package/dist/viewerServer/evidence/index.js.map +1 -1
  65. package/dist/viewerServer/evidence/mediaResolver.d.ts +1 -1
  66. package/dist/viewerServer/evidence/mediaResolver.js +28 -2
  67. package/dist/viewerServer/evidence/mediaResolver.js.map +1 -1
  68. package/dist/viewerServer/evidence/projection.d.ts +5 -1
  69. package/dist/viewerServer/evidence/projection.js +19 -0
  70. package/dist/viewerServer/evidence/projection.js.map +1 -1
  71. package/dist/viewerServer/httpServer.d.ts +13 -2
  72. package/dist/viewerServer/httpServer.js +278 -4
  73. package/dist/viewerServer/httpServer.js.map +1 -1
  74. package/dist/viewerServer/viewerService.d.ts +8 -0
  75. package/dist/viewerServer/viewerService.js +38 -2
  76. package/dist/viewerServer/viewerService.js.map +1 -1
  77. package/docs/ARCHITECTURE.md +108 -21
  78. package/docs/CI_CD.md +57 -1
  79. package/docs/COMMANDS.md +44 -4
  80. package/docs/CONTRACTS.md +78 -8
  81. package/docs/CURRENT_STATE.md +157 -35
  82. package/docs/DEVELOPMENT.md +8 -3
  83. package/docs/PROJECT_DESCRIPTION.md +4 -1
  84. package/docs/PROJECT_MILESTONES.md +4 -0
  85. package/docs/PROJECT_OVERVIEW.md +41 -17
  86. package/docs/QUICKSTART.md +52 -39
  87. package/docs/RELEASE.md +16 -11
  88. package/docs/ROADMAP.md +406 -66
  89. package/docs/SECURITY.md +71 -14
  90. package/docs/WORKFLOWS.md +151 -23
  91. package/docs/plans/v0.9-implementation-plan.md +1529 -0
  92. package/docs/reports/v0.9-architecture-retrieval.md +567 -0
  93. package/docs/reports/v0.9-batch1-visual-annotation-foundation.md +351 -0
  94. package/docs/reports/v0.9-batch2-viewer-annotation-authoring-boundary.md +438 -0
  95. package/docs/reports/v0.9-batch3-runtime-screenshot-annotation-authoring.md +412 -0
  96. package/docs/reports/v0.9-batch4-external-reference-annotation-authoring.md +452 -0
  97. package/docs/reports/v0.9-batch5-runtime-intent-contract-promotion.md +535 -0
  98. package/docs/reports/v0.9-batch6-reference-materialization.md +514 -0
  99. package/docs/reports/v0.9-batch7-integrated-acceptance.md +644 -0
  100. package/docs/reports/v0.9-demo-foundation.md +589 -0
  101. package/docs/reports/v0.9-final-pre-release-readiness.md +209 -0
  102. package/docs/reports/v0.9-final-readiness-corrections.md +530 -0
  103. package/docs/reports/v0.9-pre-release-readiness.md +170 -0
  104. package/docs/reports/v0.9-tutorial-end-to-end-acceptance.md +980 -0
  105. package/docs/reports/v0.9-tutorial-integration.md +731 -0
  106. package/package.json +2 -2
  107. package/dist/viewer/assets/index-D98S1_2d.js +0 -9
@@ -0,0 +1,584 @@
1
+ /**
2
+ * v0.9 Batch 1 visual-annotation artifact family (frozen by
3
+ * docs/plans/v0.9-implementation-plan.md sections 3 and 4). A visual
4
+ * annotation is structured human intent drawn over exactly one existing
5
+ * source: a runtime observation screenshot (viewport CSS pixels) or an
6
+ * external reference image (reference-image pixels). The two coordinate and
7
+ * identity domains are never collapsed.
8
+ *
9
+ * This module owns the types, the one canonical structural validator
10
+ * (`isValidVisualAnnotationArtifact`, used by both the writer and the
11
+ * reader), and the one pure deterministic overlay renderer
12
+ * (`renderVisualAnnotationOverlaySvg`). It never reads the filesystem, never
13
+ * resolves whether an associated target/region exists in another artifact,
14
+ * never promotes intent into a contract, and never materializes reference
15
+ * regions/requirements - those belong to later v0.9 batches.
16
+ *
17
+ * Observations and external references remain immutable evidence: this
18
+ * module adds no field to ObservationArtifact, ExternalReferenceArtifact,
19
+ * ComparisonArtifact, or any contract artifact.
20
+ */
21
+ import { PRODUCER_NAME, SCHEMA_VERSION as OBSERVATION_SCHEMA_VERSION } from './schema.js';
22
+ import { EXTERNAL_REFERENCE_SCHEMA_VERSION } from './externalReference.js';
23
+ import { PAIRWISE_RELATIONSHIP_KINDS, PAGE_LEVEL_RELATIONSHIP_KINDS } from './relationships.js';
24
+ import { isAuthoredChangeScopeCategory, isValidExpectedDependentMode, isValidContractPrimitive } from './frontendContracts.js';
25
+ import { isValidReferenceRegions } from './externalReferenceRegions.js';
26
+ import { isValidRawReferenceRequirement } from './externalReferenceRequirements.js';
27
+ function isPlainObject(value) {
28
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
29
+ }
30
+ function isNonEmptyString(value) {
31
+ return typeof value === 'string' && value.length > 0;
32
+ }
33
+ function isFiniteNumber(value) {
34
+ return typeof value === 'number' && Number.isFinite(value);
35
+ }
36
+ /** Rejects extra keys beyond the given allowlist, keeping every annotation shape closed rather than an open bag of fields. */
37
+ function hasOnlyKeys(value, allowedKeys) {
38
+ return Object.keys(value).every((key) => allowedKeys.includes(key));
39
+ }
40
+ function isPresent(value, key) {
41
+ return key in value && value[key] !== undefined;
42
+ }
43
+ /**
44
+ * A single portable path segment: no separators, no drive/stream colon, no
45
+ * NUL, never "." or "..". Used for the runtime screenshot reference (same
46
+ * bare-filename convention as observation `screenshot.path` and
47
+ * external-reference `image.path`) and for `annotationId`, which names the
48
+ * artifact's own directory.
49
+ */
50
+ function isSafeBareSegment(value) {
51
+ if (!isNonEmptyString(value))
52
+ return false;
53
+ if (value === '.' || value === '..')
54
+ return false;
55
+ return !value.includes('/') && !value.includes('\\') && !value.includes(':') && !value.includes(String.fromCharCode(0));
56
+ }
57
+ const SHA256_HEX_PATTERN = /^[0-9a-f]{64}$/;
58
+ export const VISUAL_ANNOTATION_ARTIFACT_KIND = 'my-frontend-observer/visual-annotation';
59
+ export const VISUAL_ANNOTATION_SCHEMA_VERSION = '1.0.0';
60
+ export const MAX_VISUAL_ANNOTATION_ITEMS = 100;
61
+ export const MAX_VISUAL_ANNOTATION_NOTE_LENGTH = 2000;
62
+ /** The one owned derived overlay filename (frozen plan section 3.12). */
63
+ export const VISUAL_ANNOTATION_OVERLAY_PATH = 'annotation-overlay.svg';
64
+ const VALID = { valid: true };
65
+ function invalid(reason) {
66
+ return { valid: false, reason };
67
+ }
68
+ function validateCoordinateSpace(value, expectedKind) {
69
+ if (!isPlainObject(value) || !hasOnlyKeys(value, ['kind', 'width', 'height']))
70
+ return invalid('source.coordinateSpace must be { kind, width, height }');
71
+ if (value.kind !== expectedKind)
72
+ return invalid(`source.coordinateSpace.kind must be "${expectedKind}" for this source kind`);
73
+ if (!isFiniteNumber(value.width) || value.width <= 0)
74
+ return invalid('source.coordinateSpace.width must be a finite number greater than 0');
75
+ if (!isFiniteNumber(value.height) || value.height <= 0)
76
+ return invalid('source.coordinateSpace.height must be a finite number greater than 0');
77
+ return VALID;
78
+ }
79
+ function validateSource(value) {
80
+ if (!isPlainObject(value))
81
+ return invalid('source must be an object');
82
+ if (value.kind === 'runtime-observation') {
83
+ if (!hasOnlyKeys(value, ['kind', 'observationId', 'requestId', 'observationSchemaVersion', 'screenshot', 'coordinateSpace'])) {
84
+ return invalid('runtime-observation source contains unsupported fields');
85
+ }
86
+ if (!isNonEmptyString(value.observationId))
87
+ return invalid('source.observationId must be a non-empty string');
88
+ if (!isNonEmptyString(value.requestId))
89
+ return invalid('source.requestId must be a non-empty string');
90
+ if (value.observationSchemaVersion !== OBSERVATION_SCHEMA_VERSION)
91
+ return invalid(`source.observationSchemaVersion must be "${OBSERVATION_SCHEMA_VERSION}"`);
92
+ if (!isPlainObject(value.screenshot) || !hasOnlyKeys(value.screenshot, ['path']) || !isSafeBareSegment(value.screenshot.path)) {
93
+ return invalid('source.screenshot.path must be a safe bare artifact-relative filename');
94
+ }
95
+ return validateCoordinateSpace(value.coordinateSpace, 'runtime-css-px');
96
+ }
97
+ if (value.kind === 'external-reference') {
98
+ if (!hasOnlyKeys(value, ['kind', 'referenceId', 'referenceRequestId', 'referenceSchemaVersion', 'lifecycle', 'imageOwnerReferenceId', 'imageSha256', 'coordinateSpace'])) {
99
+ return invalid('external-reference source contains unsupported fields');
100
+ }
101
+ if (!isNonEmptyString(value.referenceId))
102
+ return invalid('source.referenceId must be a non-empty string');
103
+ if (!isNonEmptyString(value.referenceRequestId))
104
+ return invalid('source.referenceRequestId must be a non-empty string');
105
+ if (value.referenceSchemaVersion !== EXTERNAL_REFERENCE_SCHEMA_VERSION)
106
+ return invalid(`source.referenceSchemaVersion must be "${EXTERNAL_REFERENCE_SCHEMA_VERSION}"`);
107
+ if (value.lifecycle !== 'imported' && value.lifecycle !== 'approved')
108
+ return invalid('source.lifecycle must be "imported" or "approved"');
109
+ if (!isNonEmptyString(value.imageOwnerReferenceId))
110
+ return invalid('source.imageOwnerReferenceId must be a non-empty string');
111
+ // Mirrors the external-reference lifecycle model: an imported reference owns its own image;
112
+ // an approved reference never owns a copy and points back to the imported artifact that does.
113
+ if (value.lifecycle === 'imported' && value.imageOwnerReferenceId !== value.referenceId) {
114
+ return invalid('source.imageOwnerReferenceId must equal source.referenceId for an "imported" reference');
115
+ }
116
+ if (value.lifecycle === 'approved' && value.imageOwnerReferenceId === value.referenceId) {
117
+ return invalid('source.imageOwnerReferenceId must name the owning imported reference, not the approved reference itself');
118
+ }
119
+ if (typeof value.imageSha256 !== 'string' || !SHA256_HEX_PATTERN.test(value.imageSha256)) {
120
+ return invalid('source.imageSha256 must be a lowercase 64-character SHA-256 hex digest');
121
+ }
122
+ return validateCoordinateSpace(value.coordinateSpace, 'reference-image-px');
123
+ }
124
+ return invalid('source.kind must be "runtime-observation" or "external-reference"');
125
+ }
126
+ /**
127
+ * Saved annotation geometry must lie inside its source frame (inclusive
128
+ * edges). Never clamped, rounded, or scaled by devicePixelRatio. This rule
129
+ * applies to annotation geometry only - existing runtime target evidence may
130
+ * still legitimately extend outside the captured viewport.
131
+ */
132
+ function validateCoordinate(x, y, frame, label) {
133
+ if (!isFiniteNumber(x))
134
+ return invalid(`${label}.x must be a finite number`);
135
+ if (!isFiniteNumber(y))
136
+ return invalid(`${label}.y must be a finite number`);
137
+ if (x < 0 || x > frame.width)
138
+ return invalid(`${label}.x must be within 0..${frame.width}`);
139
+ if (y < 0 || y > frame.height)
140
+ return invalid(`${label}.y must be within 0..${frame.height}`);
141
+ return VALID;
142
+ }
143
+ function validatePointObject(value, frame, label) {
144
+ if (!isPlainObject(value) || !hasOnlyKeys(value, ['x', 'y']))
145
+ return invalid(`${label} must be { x, y }`);
146
+ return validateCoordinate(value.x, value.y, frame, label);
147
+ }
148
+ function validateMark(value, frame, label) {
149
+ if (!isPlainObject(value))
150
+ return invalid(`${label} must be an object`);
151
+ switch (value.kind) {
152
+ case 'point':
153
+ if (!hasOnlyKeys(value, ['kind', 'x', 'y']))
154
+ return invalid(`${label} (point) contains unsupported fields`);
155
+ return validateCoordinate(value.x, value.y, frame, label);
156
+ case 'rectangle': {
157
+ if (!hasOnlyKeys(value, ['kind', 'x', 'y', 'width', 'height']))
158
+ return invalid(`${label} (rectangle) contains unsupported fields`);
159
+ const origin = validateCoordinate(value.x, value.y, frame, label);
160
+ if (!origin.valid)
161
+ return origin;
162
+ if (!isFiniteNumber(value.width) || value.width <= 0)
163
+ return invalid(`${label}.width must be a finite number greater than 0`);
164
+ if (!isFiniteNumber(value.height) || value.height <= 0)
165
+ return invalid(`${label}.height must be a finite number greater than 0`);
166
+ if (value.x + value.width > frame.width)
167
+ return invalid(`${label} right edge must not exceed ${frame.width}`);
168
+ if (value.y + value.height > frame.height)
169
+ return invalid(`${label} bottom edge must not exceed ${frame.height}`);
170
+ return VALID;
171
+ }
172
+ case 'line':
173
+ case 'arrow': {
174
+ if (!hasOnlyKeys(value, ['kind', 'start', 'end']))
175
+ return invalid(`${label} (${value.kind}) contains unsupported fields`);
176
+ const start = validatePointObject(value.start, frame, `${label}.start`);
177
+ if (!start.valid)
178
+ return start;
179
+ return validatePointObject(value.end, frame, `${label}.end`);
180
+ }
181
+ case 'note': {
182
+ if (!hasOnlyKeys(value, ['kind', 'anchor', 'text']))
183
+ return invalid(`${label} (note) contains unsupported fields`);
184
+ const anchor = validatePointObject(value.anchor, frame, `${label}.anchor`);
185
+ if (!anchor.valid)
186
+ return anchor;
187
+ if (!isNonEmptyString(value.text))
188
+ return invalid(`${label}.text must be a non-empty string`);
189
+ if (value.text.length > MAX_VISUAL_ANNOTATION_NOTE_LENGTH)
190
+ return invalid(`${label}.text must be at most ${MAX_VISUAL_ANNOTATION_NOTE_LENGTH} characters`);
191
+ return VALID;
192
+ }
193
+ default:
194
+ return invalid(`${label}.kind must be one of point, rectangle, line, arrow, note`);
195
+ }
196
+ }
197
+ /**
198
+ * Structured association shape only. Whether the named target/region exists
199
+ * in the source artifact is resolved by later viewer/application integration,
200
+ * never here, and never inferred from geometry or names.
201
+ */
202
+ function validateRuntimeAssociation(value, label) {
203
+ if (value.kind === 'runtime-target') {
204
+ if (!hasOnlyKeys(value, ['kind', 'target']))
205
+ return invalid(`${label} (runtime-target) contains unsupported fields`);
206
+ if (!isNonEmptyString(value.target))
207
+ return invalid(`${label}.target must be a non-empty string`);
208
+ return VALID;
209
+ }
210
+ if (value.kind === 'runtime-relationship') {
211
+ if (!hasOnlyKeys(value, ['kind', 'relationshipKind', 'subjectTarget', 'relatedTarget']))
212
+ return invalid(`${label} (runtime-relationship) contains unsupported fields`);
213
+ const relationshipKind = value.relationshipKind;
214
+ const hasSubject = isPresent(value, 'subjectTarget');
215
+ const hasRelated = isPresent(value, 'relatedTarget');
216
+ if (typeof relationshipKind === 'string' && PAIRWISE_RELATIONSHIP_KINDS.includes(relationshipKind)) {
217
+ // Mirrors PairwiseLayoutRelationship: two distinct, non-empty target identities.
218
+ if (!isNonEmptyString(value.subjectTarget) || !isNonEmptyString(value.relatedTarget)) {
219
+ return invalid(`${label} pairwise relationship requires non-empty subjectTarget and relatedTarget`);
220
+ }
221
+ if (value.subjectTarget === value.relatedTarget)
222
+ return invalid(`${label} pairwise relationship requires two distinct targets`);
223
+ return VALID;
224
+ }
225
+ if (typeof relationshipKind === 'string' && PAGE_LEVEL_RELATIONSHIP_KINDS.includes(relationshipKind)) {
226
+ // Mirrors PageLevelLayoutRelationship: a page-level relationship has no target pair.
227
+ if (hasSubject || hasRelated)
228
+ return invalid(`${label} page-level relationship must not carry subjectTarget/relatedTarget`);
229
+ return VALID;
230
+ }
231
+ return invalid(`${label}.relationshipKind must be an existing pairwise or page-level relationship kind`);
232
+ }
233
+ return invalid(`${label}.kind "${String(value.kind)}" is not a runtime association`);
234
+ }
235
+ function validateReferenceAssociation(value, label) {
236
+ if (value.kind === 'reference-region') {
237
+ if (!hasOnlyKeys(value, ['kind', 'regionId']))
238
+ return invalid(`${label} (reference-region) contains unsupported fields`);
239
+ if (!isNonEmptyString(value.regionId))
240
+ return invalid(`${label}.regionId must be a non-empty string`);
241
+ return VALID;
242
+ }
243
+ if (value.kind === 'reference-relationship') {
244
+ if (!hasOnlyKeys(value, ['kind', 'subjectRegion', 'relatedRegion', 'relationship']))
245
+ return invalid(`${label} (reference-relationship) contains unsupported fields`);
246
+ if (!isNonEmptyString(value.subjectRegion) || !isNonEmptyString(value.relatedRegion)) {
247
+ return invalid(`${label} requires non-empty subjectRegion and relatedRegion`);
248
+ }
249
+ if (value.subjectRegion === value.relatedRegion)
250
+ return invalid(`${label} requires two distinct region ids`);
251
+ if (typeof value.relationship !== 'string' || !PAIRWISE_RELATIONSHIP_KINDS.includes(value.relationship)) {
252
+ return invalid(`${label}.relationship must be an existing pairwise relationship kind`);
253
+ }
254
+ return VALID;
255
+ }
256
+ return invalid(`${label}.kind "${String(value.kind)}" is not a reference association`);
257
+ }
258
+ const CHANGE_OPERATIONS = ['move', 'resize', 'remove', 'preserve'];
259
+ function validateIntent(value, source, label) {
260
+ if (!isPlainObject(value))
261
+ return invalid(`${label} must be an object`);
262
+ const isRuntime = source.kind === 'runtime-observation';
263
+ switch (value.kind) {
264
+ case 'inspect':
265
+ if (!hasOnlyKeys(value, ['kind']))
266
+ return invalid(`${label} (inspect) contains unsupported fields`);
267
+ return VALID;
268
+ case 'change': {
269
+ if (!isRuntime)
270
+ return invalid(`${label} "change" intent is valid only for a runtime-observation source`);
271
+ if (!hasOnlyKeys(value, ['kind', 'operation', 'category', 'expectedDependentMode', 'contractPrimitive'])) {
272
+ return invalid(`${label} (change) contains unsupported fields`);
273
+ }
274
+ if (typeof value.operation !== 'string' || !CHANGE_OPERATIONS.includes(value.operation)) {
275
+ return invalid(`${label}.operation must be one of ${CHANGE_OPERATIONS.join(', ')}`);
276
+ }
277
+ // Existing canonical authored vocabulary: 'unexpected' is not a member and can never be authored.
278
+ if (!isAuthoredChangeScopeCategory(value.category))
279
+ return invalid(`${label}.category must be an authored change-scope category`);
280
+ const hasMode = isPresent(value, 'expectedDependentMode');
281
+ if (value.category === 'expected-dependent') {
282
+ if (!hasMode || !isValidExpectedDependentMode(value.expectedDependentMode)) {
283
+ return invalid(`${label}.expectedDependentMode is required and must be valid when category is "expected-dependent"`);
284
+ }
285
+ }
286
+ else if (hasMode) {
287
+ return invalid(`${label}.expectedDependentMode must be absent unless category is "expected-dependent"`);
288
+ }
289
+ const hasPrimitive = isPresent(value, 'contractPrimitive');
290
+ if (value.operation === 'remove') {
291
+ // The current contract vocabulary has no target-absent primitive; never fabricate an equivalent.
292
+ if (hasPrimitive)
293
+ return invalid(`${label} "remove" must not carry a contractPrimitive (not promotable by the current canonical contract vocabulary)`);
294
+ }
295
+ else if (hasPrimitive && !isValidContractPrimitive(value.contractPrimitive)) {
296
+ return invalid(`${label}.contractPrimitive is not a valid ContractPrimitive`);
297
+ }
298
+ return VALID;
299
+ }
300
+ case 'reference-region': {
301
+ if (isRuntime)
302
+ return invalid(`${label} "reference-region" intent is valid only for an external-reference source`);
303
+ if (!hasOnlyKeys(value, ['kind', 'mode', 'region']))
304
+ return invalid(`${label} (reference-region) contains unsupported fields`);
305
+ if (value.mode !== 'create' && value.mode !== 'refine')
306
+ return invalid(`${label}.mode must be "create" or "refine"`);
307
+ const regionValidation = isValidReferenceRegions([value.region], source.coordinateSpace.width, source.coordinateSpace.height);
308
+ if (!regionValidation.valid)
309
+ return invalid(`${label}.region: ${regionValidation.reason}`);
310
+ return VALID;
311
+ }
312
+ case 'reference-requirement': {
313
+ if (isRuntime)
314
+ return invalid(`${label} "reference-requirement" intent is valid only for an external-reference source`);
315
+ if (!hasOnlyKeys(value, ['kind', 'requirement']))
316
+ return invalid(`${label} (reference-requirement) contains unsupported fields`);
317
+ const requirementValidation = isValidRawReferenceRequirement(value.requirement);
318
+ if (!requirementValidation.valid)
319
+ return invalid(`${label}.requirement: ${requirementValidation.reason}`);
320
+ return VALID;
321
+ }
322
+ case 'asset-sensitive':
323
+ if (isRuntime)
324
+ return invalid(`${label} "asset-sensitive" intent is valid only for an external-reference source`);
325
+ if (!hasOnlyKeys(value, ['kind', 'regionId']))
326
+ return invalid(`${label} (asset-sensitive) contains unsupported fields`);
327
+ if (isPresent(value, 'regionId') && !isNonEmptyString(value.regionId))
328
+ return invalid(`${label}.regionId must be a non-empty string when present`);
329
+ return VALID;
330
+ default:
331
+ return invalid(`${label}.kind must be one of inspect, change, reference-region, reference-requirement, asset-sensitive`);
332
+ }
333
+ }
334
+ function validateInterpretation(value, source, label) {
335
+ if (!isPlainObject(value))
336
+ return invalid(`${label} must be an object`);
337
+ switch (value.state) {
338
+ case 'uninterpreted':
339
+ if (!hasOnlyKeys(value, ['state']) || isPresent(value, 'intent') || isPresent(value, 'confirmedAt')) {
340
+ return invalid(`${label} "uninterpreted" must not carry intent or confirmedAt`);
341
+ }
342
+ return VALID;
343
+ case 'candidate':
344
+ if (!hasOnlyKeys(value, ['state', 'intent']) || isPresent(value, 'confirmedAt'))
345
+ return invalid(`${label} "candidate" must carry only intent`);
346
+ return validateIntent(value.intent, source, `${label}.intent`);
347
+ case 'confirmed':
348
+ if (!hasOnlyKeys(value, ['state', 'intent', 'confirmedAt']))
349
+ return invalid(`${label} "confirmed" contains unsupported fields`);
350
+ if (!isNonEmptyString(value.confirmedAt))
351
+ return invalid(`${label}.confirmedAt must be a non-empty string`);
352
+ return validateIntent(value.intent, source, `${label}.intent`);
353
+ default:
354
+ return invalid(`${label}.state must be one of uninterpreted, candidate, confirmed`);
355
+ }
356
+ }
357
+ function validateItem(value, source, label) {
358
+ if (!isPlainObject(value))
359
+ return invalid(`${label} must be an object`);
360
+ if (!hasOnlyKeys(value, ['annotationItemId', 'mark', 'association', 'interpretation']))
361
+ return invalid(`${label} contains unsupported fields`);
362
+ if (!isNonEmptyString(value.annotationItemId))
363
+ return invalid(`${label}.annotationItemId must be a non-empty string`);
364
+ const markValidation = validateMark(value.mark, source.coordinateSpace, `${label}.mark`);
365
+ if (!markValidation.valid)
366
+ return markValidation;
367
+ if (isPresent(value, 'association')) {
368
+ const association = value.association;
369
+ if (!isPlainObject(association))
370
+ return invalid(`${label}.association must be an object`);
371
+ const associationValidation = source.kind === 'runtime-observation'
372
+ ? validateRuntimeAssociation(association, `${label}.association`)
373
+ : validateReferenceAssociation(association, `${label}.association`);
374
+ if (!associationValidation.valid)
375
+ return associationValidation;
376
+ }
377
+ return validateInterpretation(value.interpretation, source, `${label}.interpretation`);
378
+ }
379
+ /**
380
+ * Validates the semantic annotation content (one source plus its bounded,
381
+ * uniquely identified items) against the source's own coordinate domain.
382
+ * This is the content half of `isValidVisualAnnotationArtifact`, exposed so
383
+ * the persistence service can refuse invalid input before deriving identity
384
+ * or rendering - it is the same validation, never a second rule set.
385
+ */
386
+ export function isValidVisualAnnotationContent(source, items) {
387
+ const sourceValidation = validateSource(source);
388
+ if (!sourceValidation.valid)
389
+ return sourceValidation;
390
+ const validSource = source;
391
+ if (!Array.isArray(items))
392
+ return invalid('items must be an array');
393
+ if (items.length > MAX_VISUAL_ANNOTATION_ITEMS)
394
+ return invalid(`items must contain at most ${MAX_VISUAL_ANNOTATION_ITEMS} entries`);
395
+ const seenItemIds = new Set();
396
+ for (let index = 0; index < items.length; index += 1) {
397
+ const itemValidation = validateItem(items[index], validSource, `items[${index}]`);
398
+ if (!itemValidation.valid)
399
+ return itemValidation;
400
+ const itemId = items[index].annotationItemId;
401
+ if (seenItemIds.has(itemId))
402
+ return invalid(`duplicate annotationItemId "${itemId}"`);
403
+ seenItemIds.add(itemId);
404
+ }
405
+ return VALID;
406
+ }
407
+ const ARTIFACT_KEYS = [
408
+ 'artifactKind',
409
+ 'schemaVersion',
410
+ 'annotationRequestId',
411
+ 'annotationId',
412
+ 'supersedesAnnotationId',
413
+ 'producer',
414
+ 'source',
415
+ 'items',
416
+ 'overlay',
417
+ 'provenance',
418
+ ];
419
+ /**
420
+ * Structural validator for VisualAnnotationArtifact. The single gate used by
421
+ * both the writer and the reader (artifacts/visualAnnotationArtifactWriter.ts
422
+ * / visualAnnotationArtifactReader.ts) - never a second validator. Fails
423
+ * closed on an unsupported schemaVersion, cross-domain associations/intents,
424
+ * out-of-frame geometry, and overlay metadata that disagrees with the source
425
+ * frame. It never reads overlay bytes (the reader verifies the digest).
426
+ */
427
+ export function isValidVisualAnnotationArtifact(value) {
428
+ if (!isPlainObject(value))
429
+ return invalid('artifact must be an object');
430
+ if (value.artifactKind !== VISUAL_ANNOTATION_ARTIFACT_KIND)
431
+ return invalid('artifactKind mismatch');
432
+ if (value.schemaVersion !== VISUAL_ANNOTATION_SCHEMA_VERSION)
433
+ return invalid('schemaVersion mismatch');
434
+ if (!hasOnlyKeys(value, ARTIFACT_KEYS))
435
+ return invalid('artifact contains unsupported fields');
436
+ if (!isNonEmptyString(value.annotationRequestId))
437
+ return invalid('annotationRequestId must be a non-empty string');
438
+ if (!isSafeBareSegment(value.annotationId))
439
+ return invalid('annotationId must be a non-empty single path segment');
440
+ if (isPresent(value, 'supersedesAnnotationId')) {
441
+ if (!isNonEmptyString(value.supersedesAnnotationId))
442
+ return invalid('supersedesAnnotationId must be a non-empty string when present');
443
+ if (value.supersedesAnnotationId === value.annotationId)
444
+ return invalid('supersedesAnnotationId must not equal annotationId');
445
+ }
446
+ if (!isPlainObject(value.producer) ||
447
+ !hasOnlyKeys(value.producer, ['name', 'version']) ||
448
+ value.producer.name !== PRODUCER_NAME ||
449
+ !isNonEmptyString(value.producer.version)) {
450
+ return invalid('producer must be { name: "my-frontend-observer", version: string }');
451
+ }
452
+ const contentValidation = isValidVisualAnnotationContent(value.source, value.items);
453
+ if (!contentValidation.valid)
454
+ return contentValidation;
455
+ const source = value.source;
456
+ const overlay = value.overlay;
457
+ if (!isPlainObject(overlay) || !hasOnlyKeys(overlay, ['path', 'format', 'width', 'height', 'sha256']))
458
+ return invalid('overlay must be { path, format, width, height, sha256 }');
459
+ if (overlay.path !== VISUAL_ANNOTATION_OVERLAY_PATH)
460
+ return invalid(`overlay.path must be exactly "${VISUAL_ANNOTATION_OVERLAY_PATH}"`);
461
+ if (overlay.format !== 'svg')
462
+ return invalid('overlay.format must be exactly "svg"');
463
+ if (overlay.width !== source.coordinateSpace.width || overlay.height !== source.coordinateSpace.height) {
464
+ return invalid('overlay.width/height must exactly match source.coordinateSpace dimensions');
465
+ }
466
+ if (typeof overlay.sha256 !== 'string' || !SHA256_HEX_PATTERN.test(overlay.sha256))
467
+ return invalid('overlay.sha256 must be a lowercase 64-character SHA-256 hex digest');
468
+ const provenance = value.provenance;
469
+ if (!isPlainObject(provenance) || !hasOnlyKeys(provenance, ['createdAt', 'origin']))
470
+ return invalid('provenance must be { createdAt, origin }');
471
+ if (!isNonEmptyString(provenance.createdAt))
472
+ return invalid('provenance.createdAt must be a non-empty string');
473
+ if (provenance.origin !== 'viewer')
474
+ return invalid('provenance.origin must be exactly "viewer"');
475
+ return VALID;
476
+ }
477
+ // --- Deterministic overlay SVG --------------------------------------------------------------------
478
+ /** Fixed style constants: independent of annotation state, OS, theme, and locale. */
479
+ const OVERLAY_STROKE_COLOR = '#ff2d55';
480
+ const OVERLAY_STROKE_WIDTH = 2;
481
+ const OVERLAY_POINT_RADIUS = 6;
482
+ const OVERLAY_NOTE_ANCHOR_RADIUS = 4;
483
+ const OVERLAY_NOTE_TEXT_OFFSET = 8;
484
+ const OVERLAY_NOTE_FONT_SIZE = 14;
485
+ const OVERLAY_NOTE_FONT_FAMILY = 'sans-serif';
486
+ const OVERLAY_ARROWHEAD_LENGTH = 12;
487
+ const OVERLAY_ARROWHEAD_HALF_WIDTH = 6;
488
+ const STROKE_ATTRIBUTES = `fill="none" stroke="${OVERLAY_STROKE_COLOR}" stroke-width="${OVERLAY_STROKE_WIDTH}"`;
489
+ const FILL_ATTRIBUTES = `fill="${OVERLAY_STROKE_COLOR}" stroke="none"`;
490
+ /** Locale-independent shortest round-trip number formatting; never emits "-0". */
491
+ function formatNumber(value) {
492
+ return Object.is(value, -0) ? '0' : String(value);
493
+ }
494
+ /**
495
+ * XML-escapes user-controlled text so it always remains inert character data.
496
+ * Characters that are not allowed in XML 1.0 documents are replaced with
497
+ * U+FFFD in the overlay only (the manifest keeps the authored text verbatim
498
+ * and remains authoritative).
499
+ */
500
+ function isXmlDisallowedCodeUnit(code) {
501
+ if (code < 0x20)
502
+ return code !== 0x09 && code !== 0x0a && code !== 0x0d;
503
+ return code === 0xfffe || code === 0xffff;
504
+ }
505
+ function escapeXmlText(text) {
506
+ let allowed = '';
507
+ for (let index = 0; index < text.length; index += 1) {
508
+ allowed += isXmlDisallowedCodeUnit(text.charCodeAt(index)) ? '�' : text.charAt(index);
509
+ }
510
+ return allowed
511
+ .replace(/&/g, '&amp;')
512
+ .replace(/</g, '&lt;')
513
+ .replace(/>/g, '&gt;')
514
+ .replace(/"/g, '&quot;')
515
+ .replace(/'/g, '&apos;');
516
+ }
517
+ function renderArrowhead(start, end) {
518
+ const dx = end.x - start.x;
519
+ const dy = end.y - start.y;
520
+ const length = Math.sqrt(dx * dx + dy * dy);
521
+ if (length === 0)
522
+ return undefined;
523
+ const ux = dx / length;
524
+ const uy = dy / length;
525
+ const baseX = end.x - ux * OVERLAY_ARROWHEAD_LENGTH;
526
+ const baseY = end.y - uy * OVERLAY_ARROWHEAD_LENGTH;
527
+ const leftX = baseX - uy * OVERLAY_ARROWHEAD_HALF_WIDTH;
528
+ const leftY = baseY + ux * OVERLAY_ARROWHEAD_HALF_WIDTH;
529
+ const rightX = baseX + uy * OVERLAY_ARROWHEAD_HALF_WIDTH;
530
+ const rightY = baseY - ux * OVERLAY_ARROWHEAD_HALF_WIDTH;
531
+ const points = [
532
+ [end.x, end.y],
533
+ [leftX, leftY],
534
+ [rightX, rightY],
535
+ ]
536
+ .map(([px, py]) => `${formatNumber(px)},${formatNumber(py)}`)
537
+ .join(' ');
538
+ return `<polygon points="${points}" ${FILL_ATTRIBUTES}/>`;
539
+ }
540
+ function renderMark(mark) {
541
+ switch (mark.kind) {
542
+ case 'point':
543
+ return [`<circle cx="${formatNumber(mark.x)}" cy="${formatNumber(mark.y)}" r="${OVERLAY_POINT_RADIUS}" ${STROKE_ATTRIBUTES}/>`];
544
+ case 'rectangle':
545
+ return [
546
+ `<rect x="${formatNumber(mark.x)}" y="${formatNumber(mark.y)}" width="${formatNumber(mark.width)}" height="${formatNumber(mark.height)}" ${STROKE_ATTRIBUTES}/>`,
547
+ ];
548
+ case 'line':
549
+ case 'arrow': {
550
+ const line = `<line x1="${formatNumber(mark.start.x)}" y1="${formatNumber(mark.start.y)}" x2="${formatNumber(mark.end.x)}" y2="${formatNumber(mark.end.y)}" ${STROKE_ATTRIBUTES}/>`;
551
+ if (mark.kind === 'line')
552
+ return [line];
553
+ const head = renderArrowhead(mark.start, mark.end);
554
+ return head === undefined ? [line] : [line, head];
555
+ }
556
+ case 'note':
557
+ return [
558
+ `<circle cx="${formatNumber(mark.anchor.x)}" cy="${formatNumber(mark.anchor.y)}" r="${OVERLAY_NOTE_ANCHOR_RADIUS}" ${FILL_ATTRIBUTES}/>`,
559
+ `<text x="${formatNumber(mark.anchor.x + OVERLAY_NOTE_TEXT_OFFSET)}" y="${formatNumber(mark.anchor.y - OVERLAY_NOTE_TEXT_OFFSET)}" font-family="${OVERLAY_NOTE_FONT_FAMILY}" font-size="${OVERLAY_NOTE_FONT_SIZE}" ${FILL_ATTRIBUTES}>${escapeXmlText(mark.text)}</text>`,
560
+ ];
561
+ }
562
+ }
563
+ /**
564
+ * The one pure deterministic overlay renderer. Output depends only on the
565
+ * source frame dimensions and the marks, in exact persisted `items` order -
566
+ * never on interpretation state, timestamps, random ids, environment, locale,
567
+ * or filesystem content. Contains only system-generated SVG elements (no
568
+ * script, foreignObject, external references, marker ids, CSS imports, or
569
+ * event handlers) and never embeds the source screenshot/reference image.
570
+ * Callers must pass content already accepted by
571
+ * `isValidVisualAnnotationContent`.
572
+ */
573
+ export function renderVisualAnnotationOverlaySvg(source, items) {
574
+ const width = formatNumber(source.coordinateSpace.width);
575
+ const height = formatNumber(source.coordinateSpace.height);
576
+ const lines = [`<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}" viewBox="0 0 ${width} ${height}">`];
577
+ for (const item of items) {
578
+ for (const element of renderMark(item.mark))
579
+ lines.push(` ${element}`);
580
+ }
581
+ lines.push('</svg>');
582
+ return `${lines.join('\n')}\n`;
583
+ }
584
+ //# sourceMappingURL=visualAnnotation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visualAnnotation.js","sourceRoot":"","sources":["../../src/domain/visualAnnotation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { VisualAnnotationItem, VisualAnnotationSource } from './visualAnnotation.js';
2
+ /**
3
+ * Pure function of {source, items, supersedes} - the canonical source
4
+ * identity and coordinate domain/dimensions, every item's mark, association,
5
+ * and interpretation (in authored array order), and the explicitly
6
+ * superseded annotation (if any). Never includes createdAt, an output
7
+ * location, cwd, project root, a mutable alias, a viewer port or HTTP
8
+ * handle, a temporary path, the overlay digest, or annotationId: saving
9
+ * identical semantic content twice produces the same request identity.
10
+ */
11
+ export declare function buildVisualAnnotationRequestIdentity(source: VisualAnnotationSource, items: readonly VisualAnnotationItem[], supersedesAnnotationId?: string): string;
12
+ /**
13
+ * Fresh, opaque per-persisted-instance identity - never derived from a
14
+ * timestamp, never collides even when called twice with the same
15
+ * annotationRequestId within the same millisecond.
16
+ */
17
+ export declare function buildVisualAnnotationInstanceIdentity(annotationRequestId: string): string;