@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/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
- kind: "production-state",
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
- kind: "production-default-with-override",
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
- kind: "production-default-with-override",
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
- kind: "production-default-with-override",
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
- kind: "production-default-with-override",
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
- kind: "production-default-with-override",
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
- kind: "production-default-with-override",
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
- kind: "production-default-with-override",
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
- kind: "production-default-with-override",
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
- kind: "opt-in-diagnostic",
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
- kind: "opt-in-diagnostic",
200
- values: "\"on\"",
201
- fallback: "off",
202
- effect: "REST-time scope promotion, and the park-over hold variant. Flight-time promotion is the engine's own stamp and needs no flag"
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
- kind: "opt-in-diagnostic",
208
- values: "\"resident\" / \"off\"",
209
- fallback: "off",
210
- effect: "keep screen layers resident at rest — a resident layer is a PERMANENT stacking context over the consumer's screen"
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
- kind: "opt-in-diagnostic",
216
- values: "\"shallow\"",
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 = new Set(g.map((e) => e.key)), E = () => {
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
- }, D = (e) => {
266
+ }, E = (e) => {
297
267
  let t = [];
298
- for (let [n, r] of Object.entries(e)) {
299
- if (n.includes("(retired the library no longer reads this)")) {
300
- let e = n.slice(0, n.indexOf(" (")), i = y.find((t) => t.key === e);
301
- 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.`);
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
- }, O = (e) => Math.round(e * 10) / 10, k = (e) => {
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: O(t[Math.floor(t.length / 2)]),
319
- maxGapMs: O(t[t.length - 1]),
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
- }, A = (e, t = []) => {
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: O(e[Math.floor(e.length / 2)]),
334
- maxGapMs: O(e[e.length - 1])
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(O),
338
- held: k(e),
339
- released: k(t)
303
+ longGaps: n.filter((e) => e >= 30).map(D),
304
+ held: O(e),
305
+ released: O(t)
340
306
  };
341
- }, j = (e) => e.length === 0 ? null : {
342
- maxMs: O(Math.max(...e)),
307
+ }, A = (e) => e.length === 0 ? null : {
308
+ maxMs: D(Math.max(...e)),
343
309
  over30Count: e.filter((e) => e >= 30).length
344
- }, M = (e) => {
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
- }, N = (e) => e === "PUSHING" ? "PUSH" : e === "POPPING" ? "POP" : e === "REPLACING" ? "REPLACE" : null, P = (e) => {
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
- }, F = "2", I = "@flemo/devtools resolved to its production entry: nothing was recorded. Run a development build to collect a real report.", L = () => {}, R = () => ({
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: [I]
358
+ warnings: [F]
393
359
  },
394
360
  flights: [],
395
- anomalies: [I],
361
+ anomalies: [F],
396
362
  blindSpots: [],
397
- judgingProtocol: [I]
398
- }), z = (e) => ({
399
- detach: L,
400
- report: R
401
- }), B = (e) => ({ detach: L });
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, F as REPORT_SCHEMA_VERSION, y as RETIRED_FLAGS, b as RETIRED_MARKER, a as STALL_MS, t as STUCK_STATUS_MS, B as attachDevtoolsPanel, z as attachFlightRecorder, m as captureEnvironment, M as classifyDriver, A as computeFrameStats, k as computePhaseStats, j as computePlayerGapStats, o as deriveFlightAnomalies, D as deriveOverrideWarnings, s as deriveReportAnomalies, u as detectEngine, d as isEmulationSuspected, N as kindFromStatus, P as parseTranslateX, f as sampleRafCadence, E as snapshotOverrides };
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 };
@@ -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
- /** Every `flemo:*` key the library reads, mirrored from core. */
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.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.10",
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.1",
45
+ "vite": "^8.2.2",
43
46
  "vite-plugin-dts": "^5.0.3",
44
- "vitest": "^4.1.10",
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 {};