@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
package/CHANGELOG.md CHANGED
@@ -2,6 +2,63 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## 0.9.0 - 2026-09-21
6
+
7
+ v0.9, Human Visual Annotation and Design-Intent Capture. Structured visual
8
+ annotation through the existing viewer. Drawing is evidence, not meaning:
9
+ association, confirmation, promotion, materialization, activation and approval
10
+ each remain separate, explicit steps.
11
+
12
+ - Added the `VisualAnnotationArtifact` evidence family (schema `1.0.0`) with
13
+ deterministic identity, an atomic writer, a canonical reader, a persistence
14
+ service, and a derived annotation overlay SVG. Every save is an immutable
15
+ revision with stale-parent conflict detection.
16
+ - Added runtime observation annotation in runtime CSS pixels and external
17
+ reference annotation in reference-image pixels, with five mark kinds (point,
18
+ rectangle, line, arrow and note), Select and Pan modes, zoom, and keyboard
19
+ selection.
20
+ - Added explicit associations in each source domain: a runtime target, a
21
+ runtime relationship, or a reference region. Where a mark is drawn never
22
+ decides what it is about.
23
+ - Added candidate and confirmed interpretation. Changing a confirmed meaning
24
+ withdraws its confirmation.
25
+ - Added runtime operations `inspect`, `move`, `resize`, `remove` and
26
+ `preserve`, and authored categories `requested`, `expected-dependent`,
27
+ `protected` and `preserved`. `unexpected` is concluded by comparison, never
28
+ authored.
29
+ - Added promotion of selected confirmed runtime `move`, `resize` and
30
+ `preserve` intent into a canonical per-change frontend contract. Promotion
31
+ does not activate the contract; project activation is a separate, optional,
32
+ explicit choice. Confirmed `remove` intent stays non-promotable because the
33
+ contract vocabulary has no target-absent primitive, and `inspect` is never a
34
+ clause.
35
+ - Added reference-region create and refine intent, and property, relationship
36
+ and measurement reference requirements.
37
+ - Added materialization of selected confirmed reference intent into a new
38
+ imported external-reference revision that supersedes its source. The source
39
+ reference is never modified, and the new revision is not approved
40
+ automatically.
41
+ - Added a project-aware local authoring boundary: a 32-byte in-memory session
42
+ capability, strict Host and Origin checks, JSON-only bounded request bodies,
43
+ and one serialized write queue. `view --root` stays read-only.
44
+ - Added three authoring routes: `POST /api/annotations`,
45
+ `POST /api/annotations/:handle/promote-contract`, and
46
+ `POST /api/annotations/:handle/materialize-reference`. The viewer protocol
47
+ is now `1.3.0`.
48
+ - Added viewer discovery of visual annotations, a source-resolving annotation
49
+ view route, and a verified, script-blocking overlay media role.
50
+ - Evidence discovery now skips writer temporary `.tmp-*` directories.
51
+ - Fixed viewer shutdown stalling while a browser or service worker held a
52
+ connection open. Closing the viewer now also ends active connections.
53
+ - Added an integrated real-Chromium acceptance suite and a packed installed
54
+ v0.9 annotation smoke to the cross-platform pre-release readiness workflow.
55
+ - The repository gained a deterministic demo and four tutorials under
56
+ `examples/v09-demo/`, proved end to end with the external tool
57
+ `@dailephd/my-dev-kit-lab@0.4.9`. The demo is repository material only: it is
58
+ not in the npm package, and my-dev-kit-lab is not an Observer dependency.
59
+ - Final pre-release readiness passed on Windows, Linux and macOS against one
60
+ exact candidate package, including all four tutorials.
61
+
5
62
  ## 0.8.1 - 2026-09-15
6
63
 
7
64
  Project workflow release for `my-frontend-observer`.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # my-frontend-observer
2
2
 
3
- ## Common project workflow (v0.8.1)
3
+ ## Common project workflow (v0.9.0)
4
4
 
5
5
  ```powershell
6
6
  my-frontend-observer init --url http://127.0.0.1:3000 --target app=#app
@@ -17,16 +17,20 @@ my-frontend-observer view
17
17
  `1`, `2`, or `3` for `PASS`, `FAIL`, `REVIEW_REQUIRED`, or `BLOCKED`.
18
18
  Canonical hashes remain available in viewer details and persisted provenance,
19
19
  but are not normal workflow command inputs. The existing low-level commands
20
- remain supported. v0.8.1 is the current published release.
20
+ remain supported. v0.9.0 is the current published release.
21
+
22
+ v0.9.0 adds the structured visual annotation workflow described below.
21
23
 
22
24
  `my-frontend-observer` is the local-first rendered browser/runtime evidence
23
25
  producer in the my-dev-kit ecosystem. Its durable product purpose is defined
24
- in [docs/PROJECT_DESCRIPTION.md](docs/PROJECT_DESCRIPTION.md).
26
+ in [docs/PROJECT_DESCRIPTION.md](docs/PROJECT_DESCRIPTION.md). Whole-ecosystem
27
+ composition is documented in the [my-dev-kit ecosystem guide](https://github.com/dailephd/my-dev-kit/blob/main/docs/ECOSYSTEM_DEVELOPMENT_WORKFLOWS.md), including the [command-surface compatibility map](https://github.com/dailephd/my-dev-kit/blob/main/docs/ECOSYSTEM_DEVELOPMENT_WORKFLOWS.md#915-command-surface-compatibility-map).
25
28
 
26
29
  ## Current status
27
30
 
28
- `v0.8.1`, Project Workflow CLI and Human-Readable Evidence Aliases, is the
29
- current published release. It builds on `v0.8.0`, Interactive Local Observation
31
+ `v0.9.0`, Human Visual Annotation and Design-Intent Capture, is the current
32
+ published release. It builds on `v0.8.1`, Project Workflow CLI and
33
+ Human-Readable Evidence Aliases, `v0.8.0`, Interactive Local Observation
30
34
  Viewer, and `v0.7.0`, End-to-End Coding-Agent Frontend Change
31
35
  Review, `v0.6.0`, Bounded Agent Context and Native my-dev-kit Ecosystem
32
36
  Integration, and `v0.5.0`, Executable Frontend Contracts and Explicit Change
@@ -210,6 +214,102 @@ my-frontend-observer view --root observations --port 4319 --no-open
210
214
 
211
215
  (From a source checkout, use `node dist/cli.js view ...` instead.)
212
216
 
217
+ ### Visual annotation (v0.9.0)
218
+
219
+ v0.9.0 adds structured visual annotation to the project-aware viewer. The
220
+ model rests on a few deliberate separations:
221
+
222
+ - Drawing is evidence, not meaning. A mark on its own says nothing about what
223
+ should change.
224
+ - Association is explicit. You choose what a mark is about.
225
+ - Confirmation is explicit. A candidate meaning is only a proposal until you
226
+ confirm it.
227
+ - Promotion and materialization are selected actions. Nothing is promoted or
228
+ materialized just because it was confirmed.
229
+ - Promotion does not activate a contract, and materialization does not approve
230
+ a reference. Those remain separate, explicit decisions.
231
+
232
+ The capabilities:
233
+
234
+ - **Runtime screenshot annotation**: draw points, rectangles, lines, arrows,
235
+ and notes on an observation screenshot. Geometry is stored in runtime CSS
236
+ pixels.
237
+ - **External-reference annotation**: draw the same marks on an imported or
238
+ approved design reference. Geometry is stored in reference-image pixels.
239
+ - **Explicit association**: a mark is linked to a runtime target, a runtime
240
+ relationship, a reference region, or a reference relationship only when you
241
+ choose it. Drawing over something never creates an association.
242
+ - **Candidate and confirmed intent**: you choose a structured intent (for
243
+ example "move header right" or "create region hero"), review the exact
244
+ candidate structure, and confirm it explicitly. Editing a confirmed item
245
+ withdraws the confirmation.
246
+ - **Immutable saves**: each save writes a new `VisualAnnotationArtifact`
247
+ (schema `1.0.0`). A revision supersedes its parent and never rewrites it.
248
+ - **Runtime contract promotion**: selected confirmed runtime intent can be
249
+ promoted into a normal per-change frontend contract. Activating that
250
+ contract for `check` is a separate explicit choice.
251
+ - **Reference materialization**: selected confirmed reference regions and
252
+ requirements can be materialized into a new imported external-reference
253
+ revision that supersedes the source. The source reference is never changed,
254
+ and the new revision is not approved automatically.
255
+
256
+ Authoring is available only in the project-aware viewer:
257
+
258
+ ```powershell
259
+ # Project-aware: annotation authoring enabled for this project.
260
+ my-frontend-observer view
261
+
262
+ # Standalone: always read-only, even for annotation evidence.
263
+ my-frontend-observer view --root .frontend-observer/evidence
264
+ ```
265
+
266
+ There is no separate annotation command. Observer still never edits target
267
+ source, never approves a baseline or reference on its own, and never adds a
268
+ new PASS/FAIL rule for annotations. The existing contract and reference
269
+ evaluators remain the only source of verdicts. See
270
+ [docs/WORKFLOWS.md](docs/WORKFLOWS.md) and
271
+ [docs/SECURITY.md](docs/SECURITY.md) for the full workflow and the local write
272
+ boundary.
273
+
274
+ ## Demo and tutorials
275
+
276
+ Explaining annotation, contracts, and references against a real application is
277
+ hard, because a real application changes for reasons unrelated to the lesson.
278
+ The repository therefore keeps a small deterministic demo application in
279
+ [examples/v09-demo/](examples/v09-demo/README.md). Every region is named and
280
+ every state difference is deliberate, so the same state always renders the
281
+ same geometry at the canonical 1440x900 viewport.
282
+
283
+ Four v0.9 tutorial scenarios live in `examples/v09-demo/tutorials/`. They are
284
+ recorded by the external tool `@dailephd/my-dev-kit-lab@0.4.9`, which drives
285
+ the real Observer viewer in Chromium against a disposable project built from
286
+ the demo. Observer itself has no tutorial command and does not depend on the
287
+ lab.
288
+
289
+ A contributor builds Observer, generates a per-run target contract, then
290
+ validates and runs a scenario:
291
+
292
+ ```powershell
293
+ npm run build
294
+ node examples/v09-demo/scripts/generate-tutorial-target.mjs `
295
+ --scenario observer-v09-annotation-basics `
296
+ --out .my-dev-kit-workflow/adhoc/target-contract.json
297
+ npx --yes @dailephd/my-dev-kit-lab@0.4.9 tutorial validate `
298
+ --scenario examples/v09-demo/tutorials/01-annotation-basics.json `
299
+ --target-contract .my-dev-kit-workflow/adhoc/target-contract.json --json
300
+ npx --yes @dailephd/my-dev-kit-lab@0.4.9 tutorial run `
301
+ --scenario examples/v09-demo/tutorials/01-annotation-basics.json `
302
+ --target-contract .my-dev-kit-workflow/adhoc/target-contract.json `
303
+ --out <an output directory you choose outside the repository> --json
304
+ ```
305
+
306
+ A run writes a WebM video, screenshots, SRT and VTT subtitles, a Markdown
307
+ tutorial, and a manifest into the output directory you choose. None of that is
308
+ committed. The demo and tutorial sources are repository examples only. They
309
+ are not included in the npm package. See
310
+ [examples/v09-demo/README.md](examples/v09-demo/README.md) for the full
311
+ contributor workflow.
312
+
213
313
  ## License
214
314
 
215
315
  MIT. See [LICENSE](LICENSE).
@@ -247,8 +347,8 @@ Planning authorities:
247
347
  intent and responsibility boundaries.
248
348
  - [Project Milestones](docs/PROJECT_MILESTONES.md): complete ordered capability
249
349
  design and cross-milestone rules.
250
- - [ROADMAP](docs/ROADMAP.md): version-level requirements; v0.1-v0.8 are
251
- released; v0.9+ remain future.
350
+ - [ROADMAP](docs/ROADMAP.md): version-level requirements; v0.1-v0.9.0 are
351
+ released; v0.10 remains future.
252
352
  - [Current State](docs/CURRENT_STATE.md): retained scaffold and release state.
253
353
 
254
354
  No sibling ecosystem repository is a runtime dependency of the retained
@@ -38,9 +38,26 @@ export type CaptureNamedObservationResult = {
38
38
  } | WorkflowFailure;
39
39
  export declare function captureNamedObservation(input: CaptureNamedObservationInput): Promise<CaptureNamedObservationResult>;
40
40
  export declare function captureCurrentObservation(projectRoot: string): Promise<CaptureNamedObservationResult>;
41
- export declare function loadProjectViewerState(projectRoot: string): Promise<{
41
+ export declare function loadProjectViewerState(projectRootInput: string): Promise<{
42
42
  ok: true;
43
+ projectRoot: string;
43
44
  root: string;
44
45
  aliases: Readonly<Record<string, string>>;
45
46
  } | WorkflowFailure>;
47
+ export type ActivateProjectChangeContractResult = {
48
+ ok: true;
49
+ } | {
50
+ ok: false;
51
+ code: 'not-configured' | 'project-config-invalid' | 'project-state-write-failure';
52
+ reason: string;
53
+ };
54
+ /**
55
+ * v0.9 Batch 5: explicitly activates an already-persisted change contract for
56
+ * project `check` by updating exactly `acceptance.contract.changeArtifact`.
57
+ * Allowed only when the project already configures `acceptance.contract`:
58
+ * the block is never created, the baseline artifact and every other field are
59
+ * carried over verbatim from the on-disk configuration, the full updated
60
+ * configuration is validated before writing, and the write is atomic.
61
+ */
62
+ export declare function activateProjectChangeContract(projectRootInput: string, changeArtifactPath: string): Promise<ActivateProjectChangeContractResult>;
46
63
  export {};
@@ -77,7 +77,8 @@ async function captureObservation(input, allowReserved) {
77
77
  }
78
78
  export async function captureNamedObservation(input) { return captureObservation(input, false); }
79
79
  export async function captureCurrentObservation(projectRoot) { return captureObservation({ projectRoot, alias: 'current', replace: true }, true); }
80
- export async function loadProjectViewerState(projectRoot) {
80
+ export async function loadProjectViewerState(projectRootInput) {
81
+ const projectRoot = path.resolve(projectRootInput);
81
82
  const config = await readProjectConfig(projectConfigPath(projectRoot));
82
83
  if (!config.ok)
83
84
  return { ok: false, code: 'project-config-invalid', message: config.reason };
@@ -87,6 +88,43 @@ export async function loadProjectViewerState(projectRoot) {
87
88
  const aliases = {};
88
89
  for (const [alias, record] of Object.entries(catalog.catalog.observations))
89
90
  aliases[record.relativeArtifactDir] = alias;
90
- return { ok: true, root: projectEvidenceRoot(projectRoot), aliases };
91
+ return { ok: true, projectRoot, root: projectEvidenceRoot(projectRoot), aliases };
92
+ }
93
+ /**
94
+ * v0.9 Batch 5: explicitly activates an already-persisted change contract for
95
+ * project `check` by updating exactly `acceptance.contract.changeArtifact`.
96
+ * Allowed only when the project already configures `acceptance.contract`:
97
+ * the block is never created, the baseline artifact and every other field are
98
+ * carried over verbatim from the on-disk configuration, the full updated
99
+ * configuration is validated before writing, and the write is atomic.
100
+ */
101
+ export async function activateProjectChangeContract(projectRootInput, changeArtifactPath) {
102
+ const projectRoot = path.resolve(projectRootInput);
103
+ const configPath = projectConfigPath(projectRoot);
104
+ let raw;
105
+ try {
106
+ raw = JSON.parse(await readFile(configPath, 'utf8'));
107
+ }
108
+ catch (error) {
109
+ return { ok: false, code: 'project-config-invalid', reason: `project configuration could not be read: ${error instanceof Error ? error.message : String(error)}` };
110
+ }
111
+ const current = validateProjectConfig(raw);
112
+ if (!current.ok)
113
+ return { ok: false, code: 'project-config-invalid', reason: current.reason };
114
+ if (current.config.acceptance?.contract === undefined) {
115
+ return { ok: false, code: 'not-configured', reason: 'Project contract acceptance is not configured; the new contract was persisted but is not active for check.' };
116
+ }
117
+ const rawConfig = raw;
118
+ const updated = { ...rawConfig, acceptance: { ...rawConfig.acceptance, contract: { ...rawConfig.acceptance.contract, changeArtifact: changeArtifactPath } } };
119
+ const validated = validateProjectConfig(updated);
120
+ if (!validated.ok)
121
+ return { ok: false, code: 'project-config-invalid', reason: `updated project configuration would be invalid: ${validated.reason}` };
122
+ try {
123
+ await atomicTextWrite(configPath, `${JSON.stringify(updated, null, 2)}\n`);
124
+ }
125
+ catch (error) {
126
+ return { ok: false, code: 'project-state-write-failure', reason: `project configuration could not be written: ${error instanceof Error ? error.message : String(error)}` };
127
+ }
128
+ return { ok: true };
91
129
  }
92
130
  //# sourceMappingURL=projectWorkflowService.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"projectWorkflowService.js","sourceRoot":"","sources":["../../src/application/projectWorkflowService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"projectWorkflowService.js","sourceRoot":"","sources":["../../src/application/projectWorkflowService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { ObservationArtifact } from '../domain/schema.js';
2
+ import type { VisualAnnotationArtifact, VisualAnnotationItem } from '../domain/visualAnnotation.js';
3
+ export interface PromoteVisualAnnotationContractOptions {
4
+ annotation: VisualAnnotationArtifact;
5
+ sourceObservation: ObservationArtifact;
6
+ selectedItemIds: readonly string[];
7
+ activeBaselineIds: readonly string[];
8
+ outputLocation: string;
9
+ cwd?: string;
10
+ }
11
+ export type PromoteVisualAnnotationContractFailureCode = 'invalid-annotation' | 'unsupported-source' | 'source-mismatch' | 'invalid-selection' | 'persistence-failed';
12
+ export type PromoteVisualAnnotationContractResult = {
13
+ ok: true;
14
+ contractId: string;
15
+ contractRequestId: string;
16
+ artifactRoot: string;
17
+ manifestPath: string;
18
+ clauseCount: number;
19
+ } | {
20
+ ok: false;
21
+ code: PromoteVisualAnnotationContractFailureCode;
22
+ reason: string;
23
+ };
24
+ /** Maximum number of selected items accepted in one promotion (the annotation itself is bounded to 100 items). */
25
+ export declare const MAX_PROMOTION_ITEM_IDS = 100;
26
+ /** Why one selected item cannot become a canonical contract clause, or undefined when it can. */
27
+ export declare function contractPromotionBlockReason(item: VisualAnnotationItem): string | undefined;
28
+ /**
29
+ * v0.9 Batch 5: the one canonical annotation-to-contract use case. It turns
30
+ * explicitly selected, confirmed, canonically promotable runtime change items
31
+ * of one saved visual annotation into one ordinary `PerChangeContract`,
32
+ * built only with the existing contract identity builders and persisted
33
+ * exactly once through `persistPerChangeContract`.
34
+ *
35
+ * The whole promotion is refused if any selected item is not promotable
36
+ * (never a partial contract). Clause order follows `selectedItemIds`.
37
+ * `activeBaselineIds` are supplied by the caller from explicitly configured
38
+ * baseline-contract evidence only. The annotation is never evaluated here -
39
+ * the existing contract evaluator remains the only PASS/FAIL authority.
40
+ */
41
+ export declare function promoteVisualAnnotationContract(options: PromoteVisualAnnotationContractOptions): Promise<PromoteVisualAnnotationContractResult>;
@@ -0,0 +1,143 @@
1
+ import { isValidVisualAnnotationArtifact } from '../domain/visualAnnotation.js';
2
+ import { CONTRACT_ARTIFACT_KIND, CONTRACT_SCHEMA_VERSION, isValidContractPrimitive } from '../domain/frontendContracts.js';
3
+ import { buildClauseIdentity, buildFrontendContractInstanceIdentity, buildFrontendContractRequestIdentity } from '../domain/frontendContractIdentity.js';
4
+ import { persistPerChangeContract } from './frontendContractPersistenceService.js';
5
+ /** Maximum number of selected items accepted in one promotion (the annotation itself is bounded to 100 items). */
6
+ export const MAX_PROMOTION_ITEM_IDS = 100;
7
+ function fail(code, reason) {
8
+ return { ok: false, code, reason };
9
+ }
10
+ const MOVE_PROPERTIES = new Set(['x', 'y']);
11
+ const RESIZE_PROPERTIES = new Set(['width', 'height']);
12
+ const PRESERVE_PROPERTIES = new Set(['x', 'y', 'width', 'height']);
13
+ /**
14
+ * The bounded v0.9 promotion mapping check: a confirmed change primitive must
15
+ * be one of the first annotation mappings AND its subject must equal the
16
+ * item's explicit association. Anything else is refused, never coerced.
17
+ */
18
+ function primitiveMatchesAssociation(operation, primitive, association) {
19
+ switch (operation) {
20
+ case 'move':
21
+ case 'resize': {
22
+ if (association.kind !== 'runtime-target')
23
+ return false;
24
+ if (primitive.kind !== 'property-increases' && primitive.kind !== 'property-decreases')
25
+ return false;
26
+ if (primitive.minimumDeltaPx !== undefined)
27
+ return false;
28
+ const allowed = operation === 'move' ? MOVE_PROPERTIES : RESIZE_PROPERTIES;
29
+ return primitive.target === association.target && allowed.has(primitive.property);
30
+ }
31
+ case 'preserve':
32
+ if (association.kind === 'runtime-target') {
33
+ return primitive.kind === 'property-unchanged-within-tolerance' && primitive.target === association.target && PRESERVE_PROPERTIES.has(primitive.property);
34
+ }
35
+ return (primitive.kind === 'relationship-unchanged' &&
36
+ primitive.relationshipKind === association.relationshipKind &&
37
+ primitive.subjectTarget === association.subjectTarget &&
38
+ primitive.relatedTarget === association.relatedTarget);
39
+ default:
40
+ return false;
41
+ }
42
+ }
43
+ /** Why one selected item cannot become a canonical contract clause, or undefined when it can. */
44
+ export function contractPromotionBlockReason(item) {
45
+ const { interpretation } = item;
46
+ if (interpretation.state === 'uninterpreted')
47
+ return 'the item has no interpretation';
48
+ if (interpretation.state === 'candidate')
49
+ return 'the item interpretation is a candidate, not confirmed';
50
+ const intent = interpretation.intent;
51
+ if (intent.kind === 'inspect')
52
+ return 'inspect intent is informational and never a contract clause';
53
+ if (intent.kind !== 'change')
54
+ return `"${intent.kind}" intent is not runtime change intent`;
55
+ if (intent.operation === 'remove')
56
+ return 'remove is not canonically promotable: the current frontend-contract vocabulary has no target-absent primitive';
57
+ if (intent.contractPrimitive === undefined || !isValidContractPrimitive(intent.contractPrimitive))
58
+ return 'the confirmed change intent has no valid contract primitive';
59
+ if (item.association === undefined)
60
+ return 'the item has no explicit structured association';
61
+ if (item.association.kind !== 'runtime-target' && item.association.kind !== 'runtime-relationship')
62
+ return 'the item association is not runtime evidence';
63
+ if (!primitiveMatchesAssociation(intent.operation, intent.contractPrimitive, item.association))
64
+ return 'the contract primitive does not match the explicit association and operation';
65
+ return undefined;
66
+ }
67
+ function observationMatchesSource(annotation, observation) {
68
+ const source = annotation.source;
69
+ if (source.kind !== 'runtime-observation')
70
+ return false;
71
+ const screenshot = observation.screenshot;
72
+ return (observation.observationId === source.observationId &&
73
+ observation.requestId === source.requestId &&
74
+ observation.schemaVersion === source.observationSchemaVersion &&
75
+ (screenshot.state === 'available' || screenshot.state === 'partial') &&
76
+ screenshot.value.path === source.screenshot.path &&
77
+ observation.requestConfig.viewport.width === source.coordinateSpace.width &&
78
+ observation.requestConfig.viewport.height === source.coordinateSpace.height);
79
+ }
80
+ /**
81
+ * v0.9 Batch 5: the one canonical annotation-to-contract use case. It turns
82
+ * explicitly selected, confirmed, canonically promotable runtime change items
83
+ * of one saved visual annotation into one ordinary `PerChangeContract`,
84
+ * built only with the existing contract identity builders and persisted
85
+ * exactly once through `persistPerChangeContract`.
86
+ *
87
+ * The whole promotion is refused if any selected item is not promotable
88
+ * (never a partial contract). Clause order follows `selectedItemIds`.
89
+ * `activeBaselineIds` are supplied by the caller from explicitly configured
90
+ * baseline-contract evidence only. The annotation is never evaluated here -
91
+ * the existing contract evaluator remains the only PASS/FAIL authority.
92
+ */
93
+ export async function promoteVisualAnnotationContract(options) {
94
+ const { annotation, sourceObservation, selectedItemIds, activeBaselineIds } = options;
95
+ const validation = isValidVisualAnnotationArtifact(annotation);
96
+ if (!validation.valid)
97
+ return fail('invalid-annotation', `visual annotation is invalid: ${validation.reason}`);
98
+ if (annotation.source.kind !== 'runtime-observation')
99
+ return fail('unsupported-source', 'only runtime-observation annotations can be promoted into a frontend change contract');
100
+ if (!observationMatchesSource(annotation, sourceObservation))
101
+ return fail('source-mismatch', 'the supplied observation is not the exact canonical source of this annotation');
102
+ if (selectedItemIds.length === 0)
103
+ return fail('invalid-selection', 'select at least one confirmed annotation item to promote');
104
+ if (selectedItemIds.length > MAX_PROMOTION_ITEM_IDS)
105
+ return fail('invalid-selection', `at most ${MAX_PROMOTION_ITEM_IDS} items can be promoted at once`);
106
+ if (new Set(selectedItemIds).size !== selectedItemIds.length)
107
+ return fail('invalid-selection', 'selected annotation item ids must be unique');
108
+ const itemsById = new Map(annotation.items.map((item) => [item.annotationItemId, item]));
109
+ const clauses = [];
110
+ for (const itemId of selectedItemIds) {
111
+ const item = itemsById.get(itemId);
112
+ if (item === undefined)
113
+ return fail('invalid-selection', `selected annotation item "${itemId}" does not exist in this annotation`);
114
+ const blocked = contractPromotionBlockReason(item);
115
+ if (blocked !== undefined)
116
+ return fail('invalid-selection', `annotation item "${itemId}" cannot be promoted: ${blocked}`);
117
+ const intent = item.interpretation.intent;
118
+ const primitive = intent.contractPrimitive;
119
+ clauses.push({
120
+ clauseId: buildClauseIdentity(primitive),
121
+ category: intent.category,
122
+ ...(intent.expectedDependentMode === undefined ? {} : { expectedDependentMode: intent.expectedDependentMode }),
123
+ primitive,
124
+ supportingEvidence: [{ path: `visualAnnotation.${annotation.annotationId}.source` }, { path: `visualAnnotation.${annotation.annotationId}.items.${item.annotationItemId}` }],
125
+ });
126
+ }
127
+ const contractRequestId = buildFrontendContractRequestIdentity(annotation.source.observationId, clauses.map((clause) => ({ primitive: clause.primitive })), []);
128
+ const contractId = buildFrontendContractInstanceIdentity(contractRequestId);
129
+ const contract = {
130
+ artifactKind: CONTRACT_ARTIFACT_KIND,
131
+ schemaVersion: CONTRACT_SCHEMA_VERSION,
132
+ contractClass: 'change',
133
+ contractId,
134
+ contractRequestId,
135
+ activeBaselineIds: [...activeBaselineIds],
136
+ clauses,
137
+ };
138
+ const persisted = await persistPerChangeContract(contract, { outputLocation: options.outputLocation, ...(options.cwd === undefined ? {} : { cwd: options.cwd }) });
139
+ if (!persisted.ok)
140
+ return fail('persistence-failed', persisted.diagnostics.map((d) => d.message).join('; '));
141
+ return { ok: true, contractId, contractRequestId, artifactRoot: persisted.artifactRoot, manifestPath: persisted.manifestPath, clauseCount: clauses.length };
142
+ }
143
+ //# sourceMappingURL=visualAnnotationContractPromotionService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visualAnnotationContractPromotionService.js","sourceRoot":"","sources":["../../src/application/visualAnnotationContractPromotionService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { Diagnostic } from '../domain/diagnostics.js';
2
+ import type { VisualAnnotationItem, VisualAnnotationSource } from '../domain/visualAnnotation.js';
3
+ import type { WriteVisualAnnotationArtifactOptions } from '../artifacts/visualAnnotationArtifactWriter.js';
4
+ export interface PersistVisualAnnotationOptions {
5
+ source: VisualAnnotationSource;
6
+ items: VisualAnnotationItem[];
7
+ outputLocation: string;
8
+ cwd?: WriteVisualAnnotationArtifactOptions['cwd'];
9
+ /** Canonical annotationId of the previous artifact this save explicitly revises. Carried forward verbatim; lineage is not resolved here. */
10
+ supersedesAnnotationId?: string;
11
+ }
12
+ export type ApplicationPersistVisualAnnotationResult = {
13
+ ok: true;
14
+ annotationId: string;
15
+ annotationRequestId: string;
16
+ artifactRoot: string;
17
+ manifestPath: string;
18
+ overlayPath: string;
19
+ } | {
20
+ ok: false;
21
+ diagnostics: Diagnostic[];
22
+ };
23
+ /**
24
+ * The one canonical Batch 1 application use case for saving a visual
25
+ * annotation: validates source/items through the canonical annotation domain,
26
+ * normalizes the portable output location, derives the deterministic request
27
+ * identity and a fresh instance identity, renders the deterministic overlay
28
+ * and its SHA-256, and persists exactly once through the canonical writer.
29
+ *
30
+ * It never reads a viewer alias, resolves another artifact, checks revision
31
+ * lineage, checks whether an associated target/region exists, promotes a
32
+ * contract, materializes a reference, or modifies project configuration.
33
+ */
34
+ export declare function persistVisualAnnotation(options: PersistVisualAnnotationOptions): Promise<ApplicationPersistVisualAnnotationResult>;
@@ -0,0 +1,68 @@
1
+ import { DIAGNOSTIC_SEVERITY } from '../domain/diagnostics.js';
2
+ import { getProducerInfo } from '../domain/schema.js';
3
+ import { VISUAL_ANNOTATION_ARTIFACT_KIND, VISUAL_ANNOTATION_SCHEMA_VERSION, VISUAL_ANNOTATION_OVERLAY_PATH, isValidVisualAnnotationContent, renderVisualAnnotationOverlaySvg, } from '../domain/visualAnnotation.js';
4
+ import { buildVisualAnnotationRequestIdentity, buildVisualAnnotationInstanceIdentity } from '../domain/visualAnnotationIdentity.js';
5
+ import { normalizeOutputLocation } from '../request/paths.js';
6
+ import { writeVisualAnnotationArtifact, computeVisualAnnotationOverlaySha256 } from '../artifacts/visualAnnotationArtifactWriter.js';
7
+ function failure(code, message) {
8
+ return { ok: false, diagnostics: [{ code, severity: DIAGNOSTIC_SEVERITY[code], message }] };
9
+ }
10
+ /**
11
+ * The one canonical Batch 1 application use case for saving a visual
12
+ * annotation: validates source/items through the canonical annotation domain,
13
+ * normalizes the portable output location, derives the deterministic request
14
+ * identity and a fresh instance identity, renders the deterministic overlay
15
+ * and its SHA-256, and persists exactly once through the canonical writer.
16
+ *
17
+ * It never reads a viewer alias, resolves another artifact, checks revision
18
+ * lineage, checks whether an associated target/region exists, promotes a
19
+ * contract, materializes a reference, or modifies project configuration.
20
+ */
21
+ export async function persistVisualAnnotation(options) {
22
+ const contentValidation = isValidVisualAnnotationContent(options.source, options.items);
23
+ if (!contentValidation.valid)
24
+ return failure('invalid-request', `invalid visual annotation: ${contentValidation.reason}`);
25
+ if (options.supersedesAnnotationId !== undefined && options.supersedesAnnotationId.length === 0) {
26
+ return failure('invalid-request', 'supersedesAnnotationId must be a non-empty string when supplied');
27
+ }
28
+ const normalizedOutput = normalizeOutputLocation(options.outputLocation);
29
+ if (!normalizedOutput.ok)
30
+ return { ok: false, diagnostics: [normalizedOutput.diagnostic] };
31
+ const { source, items } = options;
32
+ const annotationRequestId = buildVisualAnnotationRequestIdentity(source, items, options.supersedesAnnotationId);
33
+ const annotationId = buildVisualAnnotationInstanceIdentity(annotationRequestId);
34
+ const overlaySha256 = computeVisualAnnotationOverlaySha256(renderVisualAnnotationOverlaySvg(source, items));
35
+ const artifact = {
36
+ artifactKind: VISUAL_ANNOTATION_ARTIFACT_KIND,
37
+ schemaVersion: VISUAL_ANNOTATION_SCHEMA_VERSION,
38
+ annotationRequestId,
39
+ annotationId,
40
+ ...(options.supersedesAnnotationId === undefined ? {} : { supersedesAnnotationId: options.supersedesAnnotationId }),
41
+ producer: getProducerInfo(),
42
+ source,
43
+ items,
44
+ overlay: {
45
+ path: VISUAL_ANNOTATION_OVERLAY_PATH,
46
+ format: 'svg',
47
+ width: source.coordinateSpace.width,
48
+ height: source.coordinateSpace.height,
49
+ sha256: overlaySha256,
50
+ },
51
+ provenance: {
52
+ createdAt: new Date().toISOString(),
53
+ origin: 'viewer',
54
+ },
55
+ };
56
+ const persisted = await writeVisualAnnotationArtifact(artifact, normalizedOutput.value, options.cwd === undefined ? {} : { cwd: options.cwd });
57
+ if (!persisted.ok)
58
+ return { ok: false, diagnostics: persisted.diagnostics };
59
+ return {
60
+ ok: true,
61
+ annotationId,
62
+ annotationRequestId,
63
+ artifactRoot: persisted.artifactRoot,
64
+ manifestPath: persisted.manifestPath,
65
+ overlayPath: persisted.overlayPath,
66
+ };
67
+ }
68
+ //# sourceMappingURL=visualAnnotationPersistenceService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visualAnnotationPersistenceService.js","sourceRoot":"","sources":["../../src/application/visualAnnotationPersistenceService.ts"],"names":[],"mappings":"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"}