@flemo/devtools 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -186,13 +186,13 @@ var e = 30, t = 1e4, n = 50, r = 120, i = 100, a = (e) => {
186
186
  key: "flemo:layers",
187
187
  storage: "session",
188
188
  kind: "opt-in-diagnostic",
189
- description: "resident screen layers at rest (armed by ?flemo-layers=)"
189
+ description: "resident screen layers at rest"
190
190
  },
191
191
  {
192
192
  key: "flemo:freeze",
193
193
  storage: "session",
194
194
  kind: "opt-in-diagnostic",
195
- description: "keep the direct prev screen live (armed by ?flemo-freeze=)"
195
+ description: "keep the direct prev screen live"
196
196
  },
197
197
  {
198
198
  key: "flemo:preraster",
@@ -403,20 +403,20 @@ var e = 30, t = 1e4, n = 50, r = 120, i = 100, a = (e) => {
403
403
  for (let t of e.imagesTracked) t.hasAttribute(L) && e.imagesHeld.add(t);
404
404
  }, G = (e, t) => {
405
405
  e.releasedFrames += 1;
406
- let n = !1;
406
+ let n = !1, r = !1;
407
407
  for (let t of e.elements) {
408
- let r = e.clocks.get(t);
409
- if (r) {
410
- r.playState === "paused" && (e.pausedAfterRelease = !0);
411
- let i = typeof r.currentTime == "number" ? r.currentTime : null;
412
- if (i !== null) {
408
+ let i = e.clocks.get(t);
409
+ if (i) {
410
+ i.playState === "paused" && (e.pausedAfterRelease = !0), i.playState !== "finished" && (r = !0);
411
+ let a = typeof i.currentTime == "number" ? i.currentTime : null;
412
+ if (a !== null) {
413
413
  let r = e.lastClock.get(t);
414
- r !== void 0 && i !== r && (n = !0), e.lastClock.set(t, i);
414
+ r !== void 0 && a !== r && (n = !0), e.lastClock.set(t, a);
415
415
  }
416
416
  }
417
- let i = t.style;
418
- if (i && i.animation !== "") {
419
- let r = `${i.transform}/${i.opacity}`;
417
+ let a = t.style;
418
+ if (a && a.animation !== "") {
419
+ let r = `${a.transform}/${a.opacity}`;
420
420
  e.lastPose.get(t) !== r && (n = !0);
421
421
  }
422
422
  }
@@ -425,6 +425,10 @@ var e = 30, t = 1e4, n = 50, r = 120, i = 100, a = (e) => {
425
425
  e.stallRunMs = 0;
426
426
  return;
427
427
  }
428
+ if (!r && e.clocks.size > 0) {
429
+ e.tailFrames += 1, e.stallRunMs = 0;
430
+ return;
431
+ }
428
432
  e.stalledFrames += 1, e.stallRunMs += t, e.stallRunMs > e.longestStallMs && (e.longestStallMs = e.stallRunMs);
429
433
  }
430
434
  }, K = (e) => {
@@ -507,6 +511,7 @@ var e = 30, t = 1e4, n = 50, r = 120, i = 100, a = (e) => {
507
511
  clocks: /* @__PURE__ */ new Map(),
508
512
  lastClock: /* @__PURE__ */ new Map(),
509
513
  releasedFrames: 0,
514
+ tailFrames: 0,
510
515
  stalledFrames: 0,
511
516
  stallRunMs: 0,
512
517
  longestStallMs: 0,
@@ -582,7 +587,8 @@ var e = 30, t = 1e4, n = 50, r = 120, i = 100, a = (e) => {
582
587
  stalledFrames: i.stalledFrames,
583
588
  longestStallMs: z(i.longestStallMs),
584
589
  pausedAfterRelease: i.pausedAfterRelease,
585
- holdReassertedAtMs: i.holdReassertedAtMs
590
+ holdReassertedAtMs: i.holdReassertedAtMs,
591
+ tailFrames: i.tailFrames
586
592
  },
587
593
  images: H(i),
588
594
  ...a ? { playerGaps: a } : {},
@@ -708,7 +714,8 @@ var e = 30, t = 1e4, n = 50, r = 120, i = 100, a = (e) => {
708
714
  stalledFrames: r.stalledFrames,
709
715
  longestStallMs: z(r.longestStallMs),
710
716
  pausedAfterRelease: r.pausedAfterRelease,
711
- holdReassertedAtMs: r.holdReassertedAtMs
717
+ holdReassertedAtMs: r.holdReassertedAtMs,
718
+ tailFrames: r.tailFrames
712
719
  },
713
720
  images: H(r),
714
721
  longTasks: [],
package/dist/noop.mjs CHANGED
@@ -181,13 +181,13 @@ var e = 30, t = 1e4, n = 50, r = 120, i = 100, a = 48, o = (e) => {
181
181
  key: "flemo:layers",
182
182
  storage: "session",
183
183
  kind: "opt-in-diagnostic",
184
- description: "resident screen layers at rest (armed by ?flemo-layers=)"
184
+ description: "resident screen layers at rest"
185
185
  },
186
186
  {
187
187
  key: "flemo:freeze",
188
188
  storage: "session",
189
189
  kind: "opt-in-diagnostic",
190
- description: "keep the direct prev screen live (armed by ?flemo-freeze=)"
190
+ description: "keep the direct prev screen live"
191
191
  },
192
192
  {
193
193
  key: "flemo:preraster",
package/dist/types.d.ts CHANGED
@@ -85,6 +85,15 @@ export interface MotionProgress {
85
85
  pausedAfterRelease: boolean;
86
86
  /** Offset from t0 at which a hold was re-asserted AFTER the release. */
87
87
  holdReassertedAtMs: number | null;
88
+ /**
89
+ * Released frames sampled AFTER every tracked animation reported "finished".
90
+ * The motion is over there and the pose is legitimately still; the flight is
91
+ * simply not closed yet. Counted separately because folding them into
92
+ * `stalledFrames` made a ~50ms "stall" fire on EVERY healthy flight — a
93
+ * constant that masks the real ones (measured on plen, 2026-08-20: 10 of 10
94
+ * flights, always exactly 3 frames).
95
+ */
96
+ tailFrames: number;
88
97
  }
89
98
  /**
90
99
  * Images inside the flight's participants. A still-loading <img> that
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flemo/devtools",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Zero-config flight recorder for flemo screen transitions: captures per-flight driver routing, frame pacing, long tasks, landing residues, active debug overrides, and environment/observation-trap fingerprints into one JSON report readable by humans and coding agents.",
5
5
  "main": "./dist/index.mjs",
6
6
  "module": "./dist/index.mjs",