@flemo/devtools 0.3.0 → 0.4.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/README.md +77 -300
- package/dist/index.mjs +280 -314
- package/dist/noop.mjs +53 -87
- package/dist/overrides.d.ts +6 -1
- package/package.json +7 -7
- package/dist/__tests__/overridesRegistry.test.d.ts +0 -1
package/dist/noop.mjs
CHANGED
|
@@ -112,112 +112,82 @@ var e = 30, t = 1e4, n = 50, r = 120, i = 100, a = 48, o = (e) => {
|
|
|
112
112
|
values: "a pixel height",
|
|
113
113
|
fallback: "(the panel's default height)",
|
|
114
114
|
effect: "the drawer height this panel was last dragged to"
|
|
115
|
-
}], _ = [
|
|
115
|
+
}], _ = [], v = [..._, ...g], y = [
|
|
116
116
|
{
|
|
117
117
|
key: "flemo:sixty",
|
|
118
118
|
storage: "session",
|
|
119
|
-
|
|
120
|
-
values: "\"high\" / a streak count",
|
|
121
|
-
fallback: "(learned)",
|
|
122
|
-
effect: "steady-60 desktop verdict seed — owned by steadySixtyCadence.ts"
|
|
119
|
+
retiredWith: "the steady-60 verdict seed, now document-scoped module state (2026-08-31)"
|
|
123
120
|
},
|
|
124
121
|
{
|
|
125
122
|
key: "flemo:settle-gate",
|
|
126
123
|
storage: "session",
|
|
127
|
-
|
|
128
|
-
values: "\"on\" / \"off\"",
|
|
129
|
-
fallback: "touch WebKit + touch Blink + desktop macOS WebKit + steady-60 desktop",
|
|
130
|
-
effect: "render-settle entry gate, shared by the engine's routing and the binding"
|
|
124
|
+
retiredWith: "the engine diagnostic surface (2026-08-31)"
|
|
131
125
|
},
|
|
132
126
|
{
|
|
133
127
|
key: "flemo:arrivalhold",
|
|
134
128
|
storage: "session",
|
|
135
|
-
|
|
136
|
-
values: "\"off\"",
|
|
137
|
-
fallback: "on",
|
|
138
|
-
effect: "the whole in-flight hold set (arrival, response, invisible animations, images)"
|
|
129
|
+
retiredWith: "the engine diagnostic surface (2026-08-31)"
|
|
139
130
|
},
|
|
140
131
|
{
|
|
141
132
|
key: "flemo:deskflip",
|
|
142
133
|
storage: "session",
|
|
143
|
-
|
|
144
|
-
values: "\"on\" / \"off\"",
|
|
145
|
-
fallback: "desktop macOS WebKit",
|
|
146
|
-
effect: "atomic release flip: the hold attribute flips on the DOM inside the readiness rAF"
|
|
134
|
+
retiredWith: "the engine diagnostic surface (2026-08-31)"
|
|
147
135
|
},
|
|
148
136
|
{
|
|
149
137
|
key: "flemo:deskhead",
|
|
150
138
|
storage: "session",
|
|
151
|
-
|
|
152
|
-
values: "\"on\" / \"off\"",
|
|
153
|
-
fallback: "desktop macOS WebKit",
|
|
154
|
-
effect: "desktop flat-head keyframes; arming it retires the desktop birth anchor"
|
|
139
|
+
retiredWith: "the engine diagnostic surface (2026-08-31)"
|
|
155
140
|
},
|
|
156
141
|
{
|
|
157
142
|
key: "flemo:creep",
|
|
158
143
|
storage: "session",
|
|
159
|
-
|
|
160
|
-
values: "\"on\" / \"off\"",
|
|
161
|
-
fallback: "touch WebKit",
|
|
162
|
-
effect: "creep head: its end keyframe carries a hair of motion, so the compositor is already carrying the animation at the boundary"
|
|
144
|
+
retiredWith: "the engine diagnostic surface (2026-08-31)"
|
|
163
145
|
},
|
|
164
146
|
{
|
|
165
147
|
key: "flemo:relcommit",
|
|
166
148
|
storage: "session",
|
|
167
|
-
|
|
168
|
-
values: "\"defer\" / \"sync\"",
|
|
169
|
-
fallback: "touch WebKit",
|
|
170
|
-
effect: "the release's reconcile lands next frame instead of synchronously"
|
|
149
|
+
retiredWith: "the engine diagnostic surface (2026-08-31)"
|
|
171
150
|
},
|
|
172
151
|
{
|
|
173
152
|
key: "flemo:imgoffload",
|
|
174
153
|
storage: "session",
|
|
175
|
-
|
|
176
|
-
values: "\"on\" / \"off\"",
|
|
177
|
-
fallback: "on — the offloader decides per image, from the source's own size",
|
|
178
|
-
effect: "image decode offloader: an oversized source is fetched and downscaled in a worker so its decode never lands in a paint"
|
|
154
|
+
retiredWith: "the engine diagnostic surface (2026-08-31)"
|
|
179
155
|
},
|
|
180
156
|
{
|
|
181
157
|
key: "flemo:governed",
|
|
182
158
|
storage: "session",
|
|
183
|
-
|
|
184
|
-
values: "\"on\" / \"off\"",
|
|
185
|
-
fallback: "legacy Android Blink (an old browser, not a slow device)",
|
|
186
|
-
effect: "the governed head kit on touch Blink — a flat head covering a compiled flight's opening. The auto-detection reads browser AGE, so a modern-but-weak phone falls through it; this is how such a device gets measured"
|
|
159
|
+
retiredWith: "the engine diagnostic surface (2026-08-31)"
|
|
187
160
|
},
|
|
188
161
|
{
|
|
189
162
|
key: "flemo:imghold",
|
|
190
163
|
storage: "session",
|
|
191
|
-
|
|
192
|
-
values: "\"on\" / \"off\"",
|
|
193
|
-
fallback: "off",
|
|
194
|
-
effect: "flight-scoped <img> reveal hold"
|
|
164
|
+
retiredWith: "the image reveal hold, whose only arming path it was (2026-08-31)"
|
|
195
165
|
},
|
|
196
166
|
{
|
|
197
167
|
key: "flemo:preraster",
|
|
198
168
|
storage: "session",
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
169
|
+
retiredWith: "the REST-time scope promotion, whose only arming path it was (2026-08-31)"
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
key: "flemo:parkhead",
|
|
173
|
+
storage: "session",
|
|
174
|
+
retiredWith: "the engine diagnostic surface — the park head is unconditional (2026-08-31)"
|
|
203
175
|
},
|
|
204
176
|
{
|
|
205
177
|
key: "flemo:layers",
|
|
206
178
|
storage: "session",
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
179
|
+
retiredWith: "the resident-layer experiment (2026-08-31)"
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
key: "flemo:morph",
|
|
183
|
+
storage: "session",
|
|
184
|
+
retiredWith: "the morph decision trace (2026-08-31)"
|
|
211
185
|
},
|
|
212
186
|
{
|
|
213
187
|
key: "flemo:freeze",
|
|
214
188
|
storage: "session",
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
fallback: "off",
|
|
218
|
-
effect: "keep the direct prev screen live instead of freezing it"
|
|
219
|
-
}
|
|
220
|
-
], v = [..._, ...g], y = [
|
|
189
|
+
retiredWith: "the shallow-freeze experiment (2026-08-31)"
|
|
190
|
+
},
|
|
221
191
|
{
|
|
222
192
|
key: "flemo:motion-driver",
|
|
223
193
|
storage: "local",
|
|
@@ -276,7 +246,7 @@ var e = 30, t = 1e4, n = 50, r = 120, i = 100, a = 48, o = (e) => {
|
|
|
276
246
|
} catch {
|
|
277
247
|
return null;
|
|
278
248
|
}
|
|
279
|
-
}, C = new Set(v.map((e) => e.key)), w = new Set(y.map((e) => e.key)), T =
|
|
249
|
+
}, C = new Set(v.map((e) => e.key)), w = new Set(y.map((e) => e.key)), T = () => {
|
|
280
250
|
let e = {}, t = x("session"), n = x("local");
|
|
281
251
|
for (let r of v) {
|
|
282
252
|
let i = S(r.storage === "session" ? t : n, r.key);
|
|
@@ -293,19 +263,15 @@ var e = 30, t = 1e4, n = 50, r = 120, i = 100, a = 48, o = (e) => {
|
|
|
293
263
|
}
|
|
294
264
|
} catch {}
|
|
295
265
|
return e;
|
|
296
|
-
},
|
|
266
|
+
}, E = (e) => {
|
|
297
267
|
let t = [];
|
|
298
|
-
for (let [n, r] of Object.entries(e)) {
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
continue;
|
|
303
|
-
}
|
|
304
|
-
let e = v.find((e) => n === e.key || n.startsWith(`${e.key} `));
|
|
305
|
-
!e || T.has(e.key) || (e.kind === "opt-in-diagnostic" ? t.push(`${n}=${r} — opt-in diagnostic active (${e.effect}); behavior differs from stock. Possible left-over A/B toggle from an earlier debugging session.`) : e.kind === "production-default-with-override" && t.push(`${n}=${r} — production default overridden for this session (${e.effect}). Stock behavior here is ${e.fallback}.`));
|
|
268
|
+
for (let [n, r] of Object.entries(e)) if (n.includes("(retired — the library no longer reads this)")) {
|
|
269
|
+
let e = n.slice(0, n.indexOf(" (")), i = y.find((t) => t.key === e);
|
|
270
|
+
t.push(`${n}=${r} — RETIRED residue: this key went with ${i?.retiredWith ?? "a removed feature"}. The library never reads it, so it cannot explain anything you are seeing. Safe to delete; it is listed only so it does not read as an unexplained lead.`);
|
|
271
|
+
continue;
|
|
306
272
|
}
|
|
307
273
|
return t;
|
|
308
|
-
},
|
|
274
|
+
}, D = (e) => Math.round(e * 10) / 10, O = (e) => {
|
|
309
275
|
if (e.length === 0) return {
|
|
310
276
|
count: 0,
|
|
311
277
|
medianGapMs: 0,
|
|
@@ -315,11 +281,11 @@ var e = 30, t = 1e4, n = 50, r = 120, i = 100, a = 48, o = (e) => {
|
|
|
315
281
|
let t = [...e].sort((e, t) => e - t);
|
|
316
282
|
return {
|
|
317
283
|
count: e.length,
|
|
318
|
-
medianGapMs:
|
|
319
|
-
maxGapMs:
|
|
284
|
+
medianGapMs: D(t[Math.floor(t.length / 2)]),
|
|
285
|
+
maxGapMs: D(t[t.length - 1]),
|
|
320
286
|
over30Count: e.filter((e) => e >= 30).length
|
|
321
287
|
};
|
|
322
|
-
},
|
|
288
|
+
}, k = (e, t = []) => {
|
|
323
289
|
let n = [...e, ...t];
|
|
324
290
|
return {
|
|
325
291
|
...n.length === 0 ? {
|
|
@@ -330,21 +296,21 @@ var e = 30, t = 1e4, n = 50, r = 120, i = 100, a = 48, o = (e) => {
|
|
|
330
296
|
let e = [...n].sort((e, t) => e - t);
|
|
331
297
|
return {
|
|
332
298
|
count: n.length,
|
|
333
|
-
medianGapMs:
|
|
334
|
-
maxGapMs:
|
|
299
|
+
medianGapMs: D(e[Math.floor(e.length / 2)]),
|
|
300
|
+
maxGapMs: D(e[e.length - 1])
|
|
335
301
|
};
|
|
336
302
|
})(),
|
|
337
|
-
longGaps: n.filter((e) => e >= 30).map(
|
|
338
|
-
held:
|
|
339
|
-
released:
|
|
303
|
+
longGaps: n.filter((e) => e >= 30).map(D),
|
|
304
|
+
held: O(e),
|
|
305
|
+
released: O(t)
|
|
340
306
|
};
|
|
341
|
-
},
|
|
342
|
-
maxMs:
|
|
307
|
+
}, A = (e) => e.length === 0 ? null : {
|
|
308
|
+
maxMs: D(Math.max(...e)),
|
|
343
309
|
over30Count: e.filter((e) => e >= 30).length
|
|
344
|
-
},
|
|
310
|
+
}, j = (e) => {
|
|
345
311
|
let t = e.playerSuppression || e.playerAdvance;
|
|
346
312
|
return t && e.compiledAnimation ? "mixed" : t ? "player" : e.compiledAnimation ? "compiled" : "unknown";
|
|
347
|
-
},
|
|
313
|
+
}, M = (e) => e === "PUSHING" ? "PUSH" : e === "POPPING" ? "POP" : e === "REPLACING" ? "REPLACE" : null, N = (e) => {
|
|
348
314
|
let t = /^matrix3d\(([^)]+)\)$/.exec(e.trim());
|
|
349
315
|
if (t) {
|
|
350
316
|
let e = t[1].split(",").map((e) => Number(e.trim()));
|
|
@@ -356,7 +322,7 @@ var e = 30, t = 1e4, n = 50, r = 120, i = 100, a = 48, o = (e) => {
|
|
|
356
322
|
return e.length === 6 && Number.isFinite(e[4]) ? e[4] : null;
|
|
357
323
|
}
|
|
358
324
|
return null;
|
|
359
|
-
},
|
|
325
|
+
}, P = "2", F = "@flemo/devtools resolved to its production entry: nothing was recorded. Run a development build to collect a real report.", I = () => {}, L = () => ({
|
|
360
326
|
generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
361
327
|
version: "inert",
|
|
362
328
|
environment: {
|
|
@@ -389,15 +355,15 @@ var e = 30, t = 1e4, n = 50, r = 120, i = 100, a = 48, o = (e) => {
|
|
|
389
355
|
},
|
|
390
356
|
overrides: {
|
|
391
357
|
active: {},
|
|
392
|
-
warnings: [
|
|
358
|
+
warnings: [F]
|
|
393
359
|
},
|
|
394
360
|
flights: [],
|
|
395
|
-
anomalies: [
|
|
361
|
+
anomalies: [F],
|
|
396
362
|
blindSpots: [],
|
|
397
|
-
judgingProtocol: [
|
|
398
|
-
}),
|
|
399
|
-
detach:
|
|
400
|
-
report:
|
|
401
|
-
}),
|
|
363
|
+
judgingProtocol: [F]
|
|
364
|
+
}), R = (e) => ({
|
|
365
|
+
detach: I,
|
|
366
|
+
report: L
|
|
367
|
+
}), z = (e) => ({ detach: I });
|
|
402
368
|
//#endregion
|
|
403
|
-
export { c as BLIND_SPOTS, _ as CORE_FLAGS, g as DEVTOOLS_OWNED_FLAGS, v as FLAG_REGISTRY, e as LONG_GAP_MS, i as MID_FLIGHT_TASK_MS, n as OPENING_WINDOW_LEAD_MS, r as OPENING_WINDOW_TAIL_MS, h as PANEL_HEIGHT_KEY,
|
|
369
|
+
export { c as BLIND_SPOTS, _ as CORE_FLAGS, g as DEVTOOLS_OWNED_FLAGS, v as FLAG_REGISTRY, e as LONG_GAP_MS, i as MID_FLIGHT_TASK_MS, n as OPENING_WINDOW_LEAD_MS, r as OPENING_WINDOW_TAIL_MS, h as PANEL_HEIGHT_KEY, P as REPORT_SCHEMA_VERSION, y as RETIRED_FLAGS, b as RETIRED_MARKER, a as STALL_MS, t as STUCK_STATUS_MS, z as attachDevtoolsPanel, R as attachFlightRecorder, m as captureEnvironment, j as classifyDriver, k as computeFrameStats, O as computePhaseStats, A as computePlayerGapStats, o as deriveFlightAnomalies, E as deriveOverrideWarnings, s as deriveReportAnomalies, u as detectEngine, d as isEmulationSuspected, M as kindFromStatus, N as parseTranslateX, f as sampleRafCadence, T as snapshotOverrides };
|
package/dist/overrides.d.ts
CHANGED
|
@@ -23,7 +23,12 @@ export interface FlagDescriptor {
|
|
|
23
23
|
* recorder generating its own false lead.
|
|
24
24
|
*/
|
|
25
25
|
export declare const DEVTOOLS_OWNED_FLAGS: readonly FlagDescriptor[];
|
|
26
|
-
/**
|
|
26
|
+
/**
|
|
27
|
+
* Every `flemo:*` key the library reads. EMPTY since 2026-08-31: the engine's
|
|
28
|
+
* diagnostic surface was removed from the shipped package outright, so a
|
|
29
|
+
* session key can no longer change what a flight does. The array stays as the
|
|
30
|
+
* shape a report reads, and so this file keeps saying so out loud.
|
|
31
|
+
*/
|
|
27
32
|
export declare const CORE_FLAGS: readonly FlagDescriptor[];
|
|
28
33
|
export declare const FLAG_REGISTRY: readonly FlagDescriptor[];
|
|
29
34
|
/**
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flemo/devtools",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
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",
|
|
@@ -34,17 +34,17 @@
|
|
|
34
34
|
"homepage": "https://flemo.dev",
|
|
35
35
|
"license": "MIT",
|
|
36
36
|
"devDependencies": {
|
|
37
|
+
"@flemo/core": "2.2.0",
|
|
38
|
+
"@flemo/eslint-config": "0.0.0",
|
|
39
|
+
"@flemo/tsconfig": "0.0.0",
|
|
37
40
|
"@types/node": "^24.13.1",
|
|
38
|
-
"@vitest/coverage-v8": "^4.1.
|
|
41
|
+
"@vitest/coverage-v8": "^4.1.11",
|
|
39
42
|
"eslint": "^9.39.5",
|
|
40
43
|
"jsdom": "^29.1.1",
|
|
41
44
|
"typescript": "^6.0.3",
|
|
42
|
-
"vite": "^8.2.
|
|
45
|
+
"vite": "^8.2.2",
|
|
43
46
|
"vite-plugin-dts": "^5.0.3",
|
|
44
|
-
"vitest": "^4.1.
|
|
45
|
-
"@flemo/core": "1.30.0",
|
|
46
|
-
"@flemo/eslint-config": "0.0.0",
|
|
47
|
-
"@flemo/tsconfig": "0.0.0"
|
|
47
|
+
"vitest": "^4.1.11"
|
|
48
48
|
},
|
|
49
49
|
"publishConfig": {
|
|
50
50
|
"access": "public"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|