@vosjs/studio-core 0.27.0 → 0.29.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/dist/index.d.ts CHANGED
@@ -417,6 +417,47 @@ interface RecordingMeta {
417
417
  * has no script and carries none.
418
418
  */
419
419
  steps?: StepSpan[];
420
+ /**
421
+ * The recorder did not land where it was asked: a sign-in, an identity
422
+ * provider, a 401/403, or a redirect to somewhere else. Present only when
423
+ * the take was recorded ANYWAY, so whoever reads it later (a digest, an
424
+ * agent cutting the footage) knows the picture may be the wrong page.
425
+ * `asked`/`landed` are origin + path, never a query or hash.
426
+ */
427
+ wall?: {
428
+ kind: 'status' | 'idp' | 'signin' | 'redirect';
429
+ asked: string;
430
+ landed: string;
431
+ };
432
+ /**
433
+ * Sensitive-looking text the recorder saw IN the frame: an email address,
434
+ * something shaped like a key, a card number. The KIND and the place, never
435
+ * the string. Each is listed once, at the first step it was visible
436
+ * (`step` -1 = as the page opened); `seen` counts the scans that saw it.
437
+ * `rect` is viewport CSS px. Absent on a recorder that does not look.
438
+ */
439
+ exposures?: {
440
+ step: number;
441
+ kind: 'email' | 'key' | 'card' | 'card-tail';
442
+ selector: string;
443
+ rect: {
444
+ x: number;
445
+ y: number;
446
+ w: number;
447
+ h: number;
448
+ };
449
+ seen: number;
450
+ }[];
451
+ /**
452
+ * What the script asked the recorder to hide before the camera rolled, and
453
+ * how many elements each selector reached. `hits: 0` is a mask that hid
454
+ * nothing, so whatever it was for may be showing.
455
+ */
456
+ masks?: {
457
+ selector: string;
458
+ as: 'blur' | 'text';
459
+ hits: number;
460
+ }[];
420
461
  }
421
462
  /**
422
463
  * A span's tie to an actions.json step: metadata for `vos plan
@@ -3001,6 +3042,16 @@ interface DigestTakeFacts {
3001
3042
  hasSystemAudio: boolean;
3002
3043
  hasCursor: boolean;
3003
3044
  windowFocusedFrac: number | null;
3045
+ /**
3046
+ * The recorder did not land where it was asked (a sign-in, a redirect) and
3047
+ * the take was recorded anyway: the footage may be the wrong page. null
3048
+ * when it landed where it was asked, or the recorder does not check.
3049
+ */
3050
+ wall: RecordingMeta['wall'] | null;
3051
+ /** Sensitive-looking text the recorder saw in the frame (kind + place, never the string). */
3052
+ exposures: NonNullable<RecordingMeta['exposures']>;
3053
+ /** Masks the script asked for, with how many elements each reached. */
3054
+ masks: NonNullable<RecordingMeta['masks']>;
3004
3055
  }
3005
3056
  interface Digest {
3006
3057
  digestVersion: number;
package/dist/index.js CHANGED
@@ -8708,7 +8708,10 @@ function buildDigest(input) {
8708
8708
  hasMic: Boolean(doc.source.micKey) || meta.hasMic === true,
8709
8709
  hasSystemAudio: meta.hasAudio === true,
8710
8710
  hasCursor: doc.source.cursor.length > 0,
8711
- windowFocusedFrac: meta.windowFocusedFrac ?? null
8711
+ windowFocusedFrac: meta.windowFocusedFrac ?? null,
8712
+ wall: meta.wall ?? null,
8713
+ exposures: meta.exposures ?? [],
8714
+ masks: meta.masks ?? []
8712
8715
  },
8713
8716
  units: {
8714
8717
  source: "seconds of footage",