@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.
- package/CHANGELOG.md +57 -0
- package/README.md +107 -7
- package/dist/application/projectWorkflowService.d.ts +18 -1
- package/dist/application/projectWorkflowService.js +40 -2
- package/dist/application/projectWorkflowService.js.map +1 -1
- package/dist/application/visualAnnotationContractPromotionService.d.ts +41 -0
- package/dist/application/visualAnnotationContractPromotionService.js +143 -0
- package/dist/application/visualAnnotationContractPromotionService.js.map +1 -0
- package/dist/application/visualAnnotationPersistenceService.d.ts +34 -0
- package/dist/application/visualAnnotationPersistenceService.js +68 -0
- package/dist/application/visualAnnotationPersistenceService.js.map +1 -0
- package/dist/application/visualAnnotationReferenceMaterializationService.d.ts +53 -0
- package/dist/application/visualAnnotationReferenceMaterializationService.js +194 -0
- package/dist/application/visualAnnotationReferenceMaterializationService.js.map +1 -0
- package/dist/artifacts/visualAnnotationArtifactReader.d.ts +19 -0
- package/dist/artifacts/visualAnnotationArtifactReader.js +66 -0
- package/dist/artifacts/visualAnnotationArtifactReader.js.map +1 -0
- package/dist/artifacts/visualAnnotationArtifactWriter.d.ts +42 -0
- package/dist/artifacts/visualAnnotationArtifactWriter.js +85 -0
- package/dist/artifacts/visualAnnotationArtifactWriter.js.map +1 -0
- package/dist/cli.js +464 -454
- package/dist/cli.js.map +1 -1
- package/dist/domain/visualAnnotation.d.ts +217 -0
- package/dist/domain/visualAnnotation.js +584 -0
- package/dist/domain/visualAnnotation.js.map +1 -0
- package/dist/domain/visualAnnotationIdentity.d.ts +17 -0
- package/dist/domain/visualAnnotationIdentity.js +47 -0
- package/dist/domain/visualAnnotationIdentity.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/projectWorkflow/projectPaths.d.ts +9 -0
- package/dist/projectWorkflow/projectPaths.js +21 -0
- package/dist/projectWorkflow/projectPaths.js.map +1 -1
- package/dist/viewer/assets/{index-CN_yb9Uf.css → index-BN41MI7m.css} +1 -1
- package/dist/viewer/assets/index-CkKXnlrI.js +9 -0
- package/dist/viewer/index.html +2 -2
- package/dist/viewer/sw.js +1 -1
- package/dist/viewerServer/annotationAuthoring.d.ts +64 -0
- package/dist/viewerServer/annotationAuthoring.js +230 -0
- package/dist/viewerServer/annotationAuthoring.js.map +1 -0
- package/dist/viewerServer/annotationContractPromotion.d.ts +51 -0
- package/dist/viewerServer/annotationContractPromotion.js +105 -0
- package/dist/viewerServer/annotationContractPromotion.js.map +1 -0
- package/dist/viewerServer/annotationReferenceMaterialization.d.ts +40 -0
- package/dist/viewerServer/annotationReferenceMaterialization.js +91 -0
- package/dist/viewerServer/annotationReferenceMaterialization.js.map +1 -0
- package/dist/viewerServer/authoringSecurity.d.ts +59 -0
- package/dist/viewerServer/authoringSecurity.js +112 -0
- package/dist/viewerServer/authoringSecurity.js.map +1 -0
- package/dist/viewerServer/evidence/annotationView.d.ts +28 -0
- package/dist/viewerServer/evidence/annotationView.js +43 -0
- package/dist/viewerServer/evidence/annotationView.js.map +1 -0
- package/dist/viewerServer/evidence/classify.d.ts +3 -1
- package/dist/viewerServer/evidence/classify.js +12 -0
- package/dist/viewerServer/evidence/classify.js.map +1 -1
- package/dist/viewerServer/evidence/discovery.d.ts +2 -0
- package/dist/viewerServer/evidence/discovery.js +6 -0
- package/dist/viewerServer/evidence/discovery.js.map +1 -1
- package/dist/viewerServer/evidence/handles.js +1 -0
- package/dist/viewerServer/evidence/handles.js.map +1 -1
- package/dist/viewerServer/evidence/index.d.ts +29 -0
- package/dist/viewerServer/evidence/index.js +43 -1
- package/dist/viewerServer/evidence/index.js.map +1 -1
- package/dist/viewerServer/evidence/mediaResolver.d.ts +1 -1
- package/dist/viewerServer/evidence/mediaResolver.js +28 -2
- package/dist/viewerServer/evidence/mediaResolver.js.map +1 -1
- package/dist/viewerServer/evidence/projection.d.ts +5 -1
- package/dist/viewerServer/evidence/projection.js +19 -0
- package/dist/viewerServer/evidence/projection.js.map +1 -1
- package/dist/viewerServer/httpServer.d.ts +13 -2
- package/dist/viewerServer/httpServer.js +278 -4
- package/dist/viewerServer/httpServer.js.map +1 -1
- package/dist/viewerServer/viewerService.d.ts +8 -0
- package/dist/viewerServer/viewerService.js +38 -2
- package/dist/viewerServer/viewerService.js.map +1 -1
- package/docs/ARCHITECTURE.md +108 -21
- package/docs/CI_CD.md +57 -1
- package/docs/COMMANDS.md +44 -4
- package/docs/CONTRACTS.md +78 -8
- package/docs/CURRENT_STATE.md +157 -35
- package/docs/DEVELOPMENT.md +8 -3
- package/docs/PROJECT_DESCRIPTION.md +4 -1
- package/docs/PROJECT_MILESTONES.md +4 -0
- package/docs/PROJECT_OVERVIEW.md +41 -17
- package/docs/QUICKSTART.md +52 -39
- package/docs/RELEASE.md +16 -11
- package/docs/ROADMAP.md +406 -66
- package/docs/SECURITY.md +71 -14
- package/docs/WORKFLOWS.md +151 -23
- package/docs/plans/v0.9-implementation-plan.md +1529 -0
- package/docs/reports/v0.9-architecture-retrieval.md +567 -0
- package/docs/reports/v0.9-batch1-visual-annotation-foundation.md +351 -0
- package/docs/reports/v0.9-batch2-viewer-annotation-authoring-boundary.md +438 -0
- package/docs/reports/v0.9-batch3-runtime-screenshot-annotation-authoring.md +412 -0
- package/docs/reports/v0.9-batch4-external-reference-annotation-authoring.md +452 -0
- package/docs/reports/v0.9-batch5-runtime-intent-contract-promotion.md +535 -0
- package/docs/reports/v0.9-batch6-reference-materialization.md +514 -0
- package/docs/reports/v0.9-batch7-integrated-acceptance.md +644 -0
- package/docs/reports/v0.9-demo-foundation.md +589 -0
- package/docs/reports/v0.9-final-pre-release-readiness.md +209 -0
- package/docs/reports/v0.9-final-readiness-corrections.md +530 -0
- package/docs/reports/v0.9-pre-release-readiness.md +170 -0
- package/docs/reports/v0.9-tutorial-end-to-end-acceptance.md +980 -0
- package/docs/reports/v0.9-tutorial-integration.md +731 -0
- package/package.json +2 -2
- 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.
|
|
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.
|
|
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.
|
|
29
|
-
|
|
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.
|
|
251
|
-
released; v0.
|
|
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(
|
|
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(
|
|
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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"}
|