ahp-inspector 1.3.1 → 1.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/index.js CHANGED
@@ -205,15 +205,37 @@ var ParseOverflowError = class extends Error {
205
205
  this.name = "ParseOverflowError";
206
206
  }
207
207
  };
208
+ function utf8ByteLength(s) {
209
+ let bytes = 0;
210
+ for (let i = 0; i < s.length; i++) {
211
+ const c = s.charCodeAt(i);
212
+ if (c < 128) bytes += 1;
213
+ else if (c < 2048) bytes += 2;
214
+ else if (c >= 55296 && c <= 56319) {
215
+ bytes += 4;
216
+ i++;
217
+ } else bytes += 3;
218
+ }
219
+ return bytes;
220
+ }
208
221
  var LineSplitter = class {
209
222
  buf = "";
210
223
  bomConsumed = false;
224
+ onOversized;
225
+ // Tolerant-mode state: true while discarding bytes of an oversized line
226
+ // until we find its terminating newline.
227
+ skipping = false;
228
+ skipBytesAccumulated = 0;
229
+ constructor(options) {
230
+ this.onOversized = options?.onOversizedLineSkipped;
231
+ }
211
232
  /**
212
233
  * Push a chunk; returns zero or more complete lines (without trailing
213
234
  * `\n` or `\r`). Holds any partial trailing line for the next call.
214
235
  *
215
236
  * @throws {ParseOverflowError} when the internal buffer would exceed
216
- * {@link MAX_BUF_BYTES} before a newline is seen.
237
+ * {@link MAX_BUF_BYTES} before a newline is seen AND tolerant mode
238
+ * (`onOversizedLineSkipped`) is not configured.
217
239
  */
218
240
  push(chunk) {
219
241
  let s = chunk;
@@ -221,6 +243,22 @@ var LineSplitter = class {
221
243
  if (s.charCodeAt(0) === 65279) s = s.slice(1);
222
244
  this.bomConsumed = true;
223
245
  }
246
+ if (this.skipping) {
247
+ const nlIdx = s.indexOf("\n");
248
+ if (nlIdx === -1) {
249
+ this.skipBytesAccumulated += utf8ByteLength(s);
250
+ return [];
251
+ }
252
+ let end = nlIdx;
253
+ const terminatorBytes = end > 0 && s.charCodeAt(end - 1) === 13 ? 2 : 1;
254
+ if (terminatorBytes === 2) end--;
255
+ this.skipBytesAccumulated += utf8ByteLength(s.slice(0, end));
256
+ this.onOversized?.(this.skipBytesAccumulated, terminatorBytes);
257
+ this.skipBytesAccumulated = 0;
258
+ this.skipping = false;
259
+ s = s.slice(nlIdx + 1);
260
+ if (s.length === 0) return [];
261
+ }
224
262
  s = this.buf + s;
225
263
  const out = [];
226
264
  let start = 0;
@@ -236,6 +274,11 @@ var LineSplitter = class {
236
274
  const tail = s.slice(start);
237
275
  if (tail.length > MAX_BUF_BYTES) {
238
276
  this.buf = "";
277
+ if (this.onOversized) {
278
+ this.skipping = true;
279
+ this.skipBytesAccumulated = utf8ByteLength(tail);
280
+ return out;
281
+ }
239
282
  throw new ParseOverflowError(
240
283
  `LineSplitter tail buffer exceeded ${MAX_BUF_BYTES} bytes without a newline`
241
284
  );
@@ -252,6 +295,22 @@ var LineSplitter = class {
252
295
  reset() {
253
296
  this.buf = "";
254
297
  this.bomConsumed = false;
298
+ this.skipping = false;
299
+ this.skipBytesAccumulated = 0;
300
+ }
301
+ /**
302
+ * Signal that the caller has reached end-of-input (e.g. initial bulk read
303
+ * complete, file truncated to current size). In tolerant mode, if we are
304
+ * still discarding an oversized line that never received a terminating
305
+ * newline, fire the callback now with the accumulated byte count and
306
+ * clear skip state. No-op when not skipping.
307
+ */
308
+ endOfInput() {
309
+ if (!this.skipping) return;
310
+ const dropped = this.skipBytesAccumulated;
311
+ this.skipping = false;
312
+ this.skipBytesAccumulated = 0;
313
+ if (dropped > 0) this.onOversized?.(dropped, 0);
255
314
  }
256
315
  /** Flush any remaining buffered bytes as a final line. Idempotent. */
257
316
  flush() {
@@ -4753,12 +4812,17 @@ var StateReplayIndex = class {
4753
4812
  };
4754
4813
 
4755
4814
  // ../server/src/app-state.ts
4815
+ function formatBytes(n) {
4816
+ if (n < 1024) return `${n} B`;
4817
+ if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KiB`;
4818
+ if (n < 1024 * 1024 * 1024) return `${(n / (1024 * 1024)).toFixed(1)} MiB`;
4819
+ return `${(n / (1024 * 1024 * 1024)).toFixed(2)} GiB`;
4820
+ }
4756
4821
  async function createAppState(opts) {
4757
4822
  const handle = await opts.host.openLog(opts.file);
4758
4823
  const store = new EventStore();
4759
4824
  const stateReplay = new StateReplayIndex(store, 25);
4760
4825
  const correlator = new Correlator(store);
4761
- const splitter = new LineSplitter();
4762
4826
  const decoder = new TextDecoder("utf-8");
4763
4827
  const inferDir = opts.directionInference ?? (() => "c2s");
4764
4828
  const handlePath = handle.path ?? handle.id;
@@ -4778,7 +4842,13 @@ async function createAppState(opts) {
4778
4842
  let initialReadLoadedBytes = 0;
4779
4843
  let initialReadTotalBytes;
4780
4844
  let initialReadPhase = "idle";
4845
+ const watchErrors = [];
4846
+ const MAX_STICKY_WATCH_ERRORS = 50;
4781
4847
  function emit(payload) {
4848
+ if (payload.kind === "watch-error") {
4849
+ watchErrors.push(payload);
4850
+ if (watchErrors.length > MAX_STICKY_WATCH_ERRORS) watchErrors.shift();
4851
+ }
4782
4852
  for (const l of listeners) {
4783
4853
  try {
4784
4854
  l(payload);
@@ -4786,6 +4856,16 @@ async function createAppState(opts) {
4786
4856
  }
4787
4857
  }
4788
4858
  }
4859
+ const splitter = new LineSplitter({
4860
+ onOversizedLineSkipped: (bytesDropped, terminatorBytes) => {
4861
+ byteOffset += bytesDropped + terminatorBytes;
4862
+ emit({
4863
+ kind: "watch-error",
4864
+ code: "oversized-line",
4865
+ message: `Skipped an oversized JSONL line (${formatBytes(bytesDropped)}). The viewer cannot parse lines larger than ${formatBytes(MAX_BUF_BYTES)} (typically a tool result with embedded base64 payload). Subsequent events in this log will still load.`
4866
+ });
4867
+ }
4868
+ });
4789
4869
  function currentLoadProgress(phase = initialReadPhase) {
4790
4870
  const totalBytes = initialReadTotalBytes;
4791
4871
  const percent = totalBytes !== void 0 && totalBytes > 0 ? Math.min(100, Math.round(initialReadLoadedBytes / totalBytes * 100)) : void 0;
@@ -4885,6 +4965,7 @@ async function createAppState(opts) {
4885
4965
  onInitialReadComplete(info) {
4886
4966
  initialReadLoadedBytes = info.loadedBytes;
4887
4967
  initialReadTotalBytes = info.totalBytes;
4968
+ splitter.endOfInput();
4888
4969
  emitLoadProgress("complete");
4889
4970
  },
4890
4971
  onChunk(chunk, _byteOffset) {
@@ -4895,9 +4976,9 @@ async function createAppState(opts) {
4895
4976
  lines = splitter.push(text);
4896
4977
  } catch (err) {
4897
4978
  emit({
4898
- kind: "error",
4899
- code: "parse-overflow",
4900
- message: err.message
4979
+ kind: "watch-error",
4980
+ code: "read-error",
4981
+ message: `Failed to parse log chunk: ${err.message}`
4901
4982
  });
4902
4983
  return;
4903
4984
  }
@@ -4930,6 +5011,7 @@ async function createAppState(opts) {
4930
5011
  lastSeenServerSeq = null;
4931
5012
  initialReadLoadedBytes = 0;
4932
5013
  initialReadTotalBytes = void 0;
5014
+ watchErrors.length = 0;
4933
5015
  emitLoadProgress("idle");
4934
5016
  emit({ kind: "rotation", newSize: info.newSize, reason: info.reason });
4935
5017
  },
@@ -4958,6 +5040,12 @@ async function createAppState(opts) {
4958
5040
  },
4959
5041
  subscribe(l) {
4960
5042
  listeners.add(l);
5043
+ for (const w of watchErrors) {
5044
+ try {
5045
+ l(w);
5046
+ } catch {
5047
+ }
5048
+ }
4961
5049
  return () => {
4962
5050
  listeners.delete(l);
4963
5051
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ahp-inspector",
3
- "version": "1.3.1",
3
+ "version": "1.4.0",
4
4
  "type": "module",
5
5
  "description": "Local-first viewer for VS Code Agent Host Protocol (AHP) JSONL logs.",
6
6
  "keywords": [
@@ -0,0 +1 @@
1
+ ._GzYRV{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word;line-height:1.2}._3eOF8{margin-right:5px;font-weight:700}._3eOF8+._3eOF8{margin-left:-5px}._1MFti{cursor:pointer}._f10Tu{-webkit-user-select:none;user-select:none;margin-right:5px;font-size:1.2em}._1UmXx:after{content:"▸"}._1LId0:after{content:"▾"}._1pNG9{margin-right:5px}._1pNG9:after{content:"...";font-size:.8em}._2IvMF{background:#eee}._2bkNM{margin:0;padding:0 10px}._1BXBN{margin:0;padding:0}._1MGIk{color:#000;margin-right:5px;font-weight:600}._3uHL6{color:#000}._2T6PJ,._1Gho6{color:#df113a}._vGjyY{color:#2a3f3c}._1bQdo{color:#0b75f5}._3zQKs{color:#469038}._1xvuR{color:#43413d}._oLqym,._2AXVT,._2KJWg{color:#000}._11RoI{background:#002b36}._17H2C,._3QHg2,._3fDAz{color:#fdf6e3}._2bSDX{color:#fdf6e3;margin-right:5px;font-weight:bolder}._gsbQL{color:#fdf6e3}._LaAZe,._GTKgm{color:#81b5ac}._Chy1W{color:#cb4b16}._2bveF{color:#d33682}._2vRm-{color:#ae81ff}._1prJR{color:#268bd2}:root,[data-theme=dark]{--color-scheme:dark;--space-0:0;--space-1:4px;--space-2:8px;--space-3:12px;--space-4:16px;--space-5:24px;--space-6:32px;--space-8:48px;--row-height:28px;--font-sans:"Inter Variable", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;--font-mono:"JetBrains Mono Variable", ui-monospace, "SF Mono", Menlo, Consolas, monospace;--text-row-size:13px;--text-row-line:20px;--text-ui-size:13px;--text-ui-muted-size:12px;--text-heading-size:16px;--text-body-size:14px;--weight-regular:400;--weight-semibold:600;--color-bg:#0e1116;--color-surface:#161a21;--color-surface-raised:#1c2129;--color-border:#262c36;--color-border-strong:#39414e;--color-accent:#7aa2f7;--color-accent-foreground:#0e1116;--color-text:#e6e9ef;--color-text-muted:#a4adbe;--color-text-subtle:#6b7385;--color-text-disabled:#4b5263;--color-success:#7dcfa4;--color-warning:#e0af68;--color-destructive:#f7768e;--color-info:#7dcfff;--dir-c2s:#7aa2f7;--dir-s2c:#bb9af7;--dir-internal:#a4adbe;--kind-request:#7aa2f7;--kind-response:#7dcfa4;--kind-notification:#e0af68;--kind-action:#bb9af7;--kind-error:#f7768e;--kind-parse-error:#f7768e;--action-text:#7dcfa4;--action-tool-call:#7aa2f7;--action-tool-result:#9ece6a;--action-status:#a4adbe;--action-unknown:#6b7385;--latency-fast:#3a4a3f;--latency-normal:#3a4252;--latency-slow:#5a4a2e;--latency-critical:#5a2e36;--color-search-match-bg:#3a3520;--color-search-match-fg:#e6e9ef;--color-chip-bg:var(--color-surface-raised);--color-chip-bg-active:var(--color-border);--color-chip-border:var(--color-border-strong);--color-chip-fg:var(--color-text);--color-chip-fg-muted:var(--color-text-muted);--color-chip-dismiss:var(--color-text-muted);--color-group-header-bg:#1a1f27;--color-group-header-fg:var(--color-text);--color-group-header-meta:var(--color-text-muted);--color-gap-banner-bg:color-mix(in srgb, var(--color-warning) 14%, var(--color-bg));--color-gap-banner-fg:var(--color-warning);--color-auth-fail-rail:var(--color-destructive);--color-auth-fail-banner-bg:color-mix(in srgb, var(--color-destructive) 14%, var(--color-bg));--color-json-bg:var(--color-surface);--color-json-key:var(--color-accent);--color-json-string:var(--color-success);--color-json-number:var(--color-warning);--color-json-boolean:var(--color-info);--color-json-null:var(--color-text-subtle);--color-json-punctuation:var(--color-text-muted);--row-group-header-height:24px;--row-banner-height:20px;--filter-bar-height:40px;--filter-chips-height:32px;--candidate-row-height:36px;--color-confidence-high:var(--color-success);--color-confidence-medium:var(--color-warning);--color-confidence-low:var(--color-text-subtle);--color-status-paused-fg:var(--color-accent);--color-status-paused-bg:color-mix(in srgb, var(--color-accent) 15%, var(--color-surface));--color-pill-bg:var(--color-surface-raised);--color-pill-fg:var(--color-text);--color-pill-border:var(--color-border-strong);--color-banner-rotation-bg:color-mix(in srgb, var(--color-warning) 12%, var(--color-bg));--color-banner-rotation-fg:var(--color-warning);--color-banner-watch-error-bg:color-mix(in srgb, var(--color-destructive) 12%, var(--color-bg));--color-banner-watch-error-fg:var(--color-destructive);--shadow-menu:0 8px 24px color-mix(in srgb, var(--color-bg) 70%, transparent);--shadow-panel:-12px 0 28px color-mix(in srgb, var(--color-bg) 28%, transparent);--shadow-drawer:-18px 0 42px color-mix(in srgb, var(--color-bg) 56%, transparent);--focus-ring:var(--color-accent);--row-selected-bg:color-mix(in srgb, var(--color-accent) 16%, var(--color-bg));--row-hover-bg:color-mix(in srgb, var(--color-accent) 8%, var(--color-bg));--overlay-backdrop:color-mix(in srgb, var(--color-bg) 68%, transparent);--drawer-border:1px solid var(--color-border-strong);--effect-scanline-opacity:0;--effect-grid-opacity:0;--effect-noise-opacity:0;--effect-glow:none;--effect-glow-strong:none;--effect-crt-glass-opacity:0;--effect-crt-frame-opacity:0;--effect-crt-fringe-opacity:0;--effect-crt-fringe-spread:0;--effect-crt-vignette-stop:100%;--effect-crt-signal-jitter:0;--effect-crt-glitch-boost:1;--selection-bg:color-mix(in srgb, var(--color-accent) 34%, var(--color-bg));--selection-fg:var(--color-text)}[data-theme=light]{--color-scheme:light;--space-0:0;--space-1:4px;--space-2:8px;--space-3:12px;--space-4:16px;--space-5:24px;--space-6:32px;--space-8:48px;--row-height:28px;--font-sans:"Inter Variable", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;--font-mono:"JetBrains Mono Variable", ui-monospace, "SF Mono", Menlo, Consolas, monospace;--text-row-size:13px;--text-row-line:20px;--text-ui-size:13px;--text-ui-muted-size:12px;--text-heading-size:16px;--text-body-size:14px;--weight-regular:400;--weight-semibold:600;--color-bg:#f7f8fb;--color-surface:#fff;--color-surface-raised:#f0f3f8;--color-border:#d6dbe5;--color-border-strong:#aeb7c6;--color-accent:#245fc7;--color-accent-foreground:#fff;--color-text:#18202c;--color-text-muted:#5b6575;--color-text-subtle:#7a8494;--color-text-disabled:#a8b0bd;--color-success:#16734a;--color-warning:#9a5b00;--color-destructive:#c11f3d;--color-info:#006d9c;--dir-c2s:#245fc7;--dir-s2c:#7852b8;--dir-internal:#5b6575;--kind-request:#245fc7;--kind-response:#16734a;--kind-notification:#9a5b00;--kind-action:#7852b8;--kind-error:#c11f3d;--kind-parse-error:#c11f3d;--action-text:#16734a;--action-tool-call:#245fc7;--action-tool-result:#4f7d10;--action-status:#5b6575;--action-unknown:#7a8494;--latency-fast:#dff1e7;--latency-normal:#e3eaf5;--latency-slow:#f8ebd5;--latency-critical:#f7dce3;--color-search-match-bg:#fff0a8;--color-search-match-fg:#18202c;--color-chip-bg:var(--color-surface-raised);--color-chip-bg-active:#dfe8f8;--color-chip-border:var(--color-border-strong);--color-chip-fg:var(--color-text);--color-chip-fg-muted:var(--color-text-muted);--color-chip-dismiss:var(--color-text-muted);--color-group-header-bg:#edf1f7;--color-group-header-fg:var(--color-text);--color-group-header-meta:var(--color-text-muted);--color-gap-banner-bg:color-mix(in srgb, var(--color-warning) 12%, var(--color-bg));--color-gap-banner-fg:var(--color-warning);--color-auth-fail-rail:var(--color-destructive);--color-auth-fail-banner-bg:color-mix(in srgb, var(--color-destructive) 10%, var(--color-bg));--color-json-bg:var(--color-surface);--color-json-key:var(--color-accent);--color-json-string:var(--color-success);--color-json-number:var(--color-warning);--color-json-boolean:var(--color-info);--color-json-null:var(--color-text-subtle);--color-json-punctuation:var(--color-text-muted);--row-group-header-height:24px;--row-banner-height:20px;--filter-bar-height:40px;--filter-chips-height:32px;--color-confidence-high:var(--color-success);--color-confidence-medium:var(--color-warning);--color-confidence-low:var(--color-text-subtle);--color-status-paused-fg:var(--color-accent);--color-status-paused-bg:color-mix(in srgb, var(--color-accent) 12%, var(--color-surface));--color-pill-bg:var(--color-surface-raised);--color-pill-fg:var(--color-text);--color-pill-border:var(--color-border-strong);--color-banner-rotation-bg:color-mix(in srgb, var(--color-warning) 10%, var(--color-bg));--color-banner-rotation-fg:var(--color-warning);--color-banner-watch-error-bg:color-mix(in srgb, var(--color-destructive) 10%, var(--color-bg));--color-banner-watch-error-fg:var(--color-destructive);--shadow-menu:0 8px 24px color-mix(in srgb, var(--color-border-strong) 34%, transparent);--shadow-panel:-10px 0 26px color-mix(in srgb, var(--color-border-strong) 18%, transparent);--shadow-drawer:-18px 0 42px color-mix(in srgb, var(--color-border-strong) 32%, transparent);--focus-ring:var(--color-accent);--row-selected-bg:color-mix(in srgb, var(--color-accent) 12%, var(--color-bg));--row-hover-bg:color-mix(in srgb, var(--color-accent) 6%, var(--color-bg));--overlay-backdrop:color-mix(in srgb, var(--color-text) 28%, transparent);--drawer-border:1px solid var(--color-border-strong);--effect-scanline-opacity:0;--effect-grid-opacity:0;--effect-noise-opacity:0;--effect-glow:none;--effect-glow-strong:none;--effect-crt-glass-opacity:0;--effect-crt-frame-opacity:0;--effect-crt-fringe-opacity:0;--effect-crt-fringe-spread:0;--effect-crt-vignette-stop:100%;--effect-crt-signal-jitter:0;--effect-crt-glitch-boost:1;--selection-bg:color-mix(in srgb, var(--color-accent) 26%, var(--color-bg));--selection-fg:var(--color-text)}[data-theme=hacker]{--color-scheme:dark;--space-0:0;--space-1:4px;--space-2:8px;--space-3:12px;--space-4:16px;--space-5:24px;--space-6:32px;--space-8:48px;--row-height:28px;--font-sans:"Inter Variable", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;--font-mono:"JetBrains Mono Variable", ui-monospace, "SF Mono", Menlo, Consolas, monospace;--text-row-size:13px;--text-row-line:20px;--text-ui-size:13px;--text-ui-muted-size:12px;--text-heading-size:16px;--text-body-size:14px;--weight-regular:400;--weight-semibold:600;--color-bg:#020704;--color-surface:#06120a;--color-surface-raised:#0a1b10;--color-border:#12351d;--color-border-strong:#1f6b34;--color-accent:#39ff88;--color-accent-foreground:#020704;--color-text:#d6ffe2;--color-text-muted:#79d994;--color-text-subtle:#3c8f55;--color-text-disabled:#245633;--color-success:#39ff88;--color-warning:#d7ff57;--color-destructive:#ff4f7b;--color-info:#54f7ff;--dir-c2s:#39ff88;--dir-s2c:#54f7ff;--dir-internal:#79d994;--kind-request:#39ff88;--kind-response:#54f7ff;--kind-notification:#d7ff57;--kind-action:#b86cff;--kind-error:#ff4f7b;--kind-parse-error:#ff4f7b;--action-text:#39ff88;--action-tool-call:#54f7ff;--action-tool-result:#d7ff57;--action-status:#79d994;--action-unknown:#3c8f55;--latency-fast:#0c2414;--latency-normal:#102833;--latency-slow:#2f3210;--latency-critical:#3a1220;--color-search-match-bg:#254512;--color-search-match-fg:#d6ffe2;--color-chip-bg:var(--color-surface-raised);--color-chip-bg-active:#12351d;--color-chip-border:var(--color-border-strong);--color-chip-fg:var(--color-text);--color-chip-fg-muted:var(--color-text-muted);--color-chip-dismiss:var(--color-text-muted);--color-group-header-bg:#07160c;--color-group-header-fg:var(--color-text);--color-group-header-meta:var(--color-text-muted);--color-gap-banner-bg:color-mix(in srgb, var(--color-warning) 14%, var(--color-bg));--color-gap-banner-fg:var(--color-warning);--color-auth-fail-rail:var(--color-destructive);--color-auth-fail-banner-bg:color-mix(in srgb, var(--color-destructive) 14%, var(--color-bg));--color-json-bg:var(--color-surface);--color-json-key:var(--color-accent);--color-json-string:#d7ff57;--color-json-number:#54f7ff;--color-json-boolean:#b86cff;--color-json-null:var(--color-text-subtle);--color-json-punctuation:var(--color-text-muted);--row-group-header-height:24px;--row-banner-height:20px;--filter-bar-height:40px;--filter-chips-height:32px;--color-confidence-high:var(--color-success);--color-confidence-medium:var(--color-warning);--color-confidence-low:var(--color-text-subtle);--color-status-paused-fg:var(--color-accent);--color-status-paused-bg:color-mix(in srgb, var(--color-accent) 18%, var(--color-surface));--color-pill-bg:var(--color-surface-raised);--color-pill-fg:var(--color-text);--color-pill-border:var(--color-border-strong);--color-banner-rotation-bg:color-mix(in srgb, var(--color-warning) 14%, var(--color-bg));--color-banner-rotation-fg:var(--color-warning);--color-banner-watch-error-bg:color-mix(in srgb, var(--color-destructive) 14%, var(--color-bg));--color-banner-watch-error-fg:var(--color-destructive);--shadow-menu:0 0 22px color-mix(in srgb, var(--color-accent) 28%, transparent);--shadow-panel:-10px 0 30px color-mix(in srgb, var(--color-accent) 12%, transparent);--shadow-drawer:-18px 0 48px color-mix(in srgb, var(--color-accent) 24%, transparent);--focus-ring:var(--color-accent);--row-selected-bg:color-mix(in srgb, var(--color-accent) 18%, var(--color-bg));--row-hover-bg:color-mix(in srgb, var(--color-accent) 9%, var(--color-bg));--overlay-backdrop:color-mix(in srgb, var(--color-bg) 76%, transparent);--drawer-border:1px solid var(--color-border-strong);--effect-scanline-opacity:.22;--effect-grid-opacity:.12;--effect-noise-opacity:.085;--effect-glow:0 0 10px color-mix(in srgb, var(--color-accent) 34%, transparent);--effect-glow-strong:0 0 18px color-mix(in srgb, var(--color-accent) 48%, transparent);--effect-crt-glass-opacity:.72;--effect-crt-frame-opacity:.94;--effect-crt-fringe-opacity:.34;--effect-crt-fringe-spread:18px;--effect-crt-vignette-stop:64%;--effect-crt-signal-jitter:1.5px;--effect-crt-glitch-boost:1.08;--selection-bg:color-mix(in srgb, var(--color-accent) 38%, var(--color-bg));--selection-fg:var(--color-text)}@font-face{font-family:Inter Variable;src:url(/fonts/inter/InterVariable.woff2)format("woff2-variations");font-weight:100 900;font-style:normal;font-display:swap}@font-face{font-family:JetBrains Mono Variable;src:url(/fonts/jetbrains-mono/JetBrainsMono-Variable.woff2)format("woff2-variations");font-weight:100 800;font-style:normal;font-display:swap}html,body,#root{height:100%;margin:0}body{background:var(--color-bg);color:var(--color-text);font-family:var(--font-sans);font-size:var(--text-ui-size);line-height:20px;font-weight:var(--weight-regular);-webkit-font-smoothing:antialiased;color-scheme:var(--color-scheme)}.mono,.ts,.latency,.id,.method,.preview{font-family:var(--font-mono)}.ts,.latency,.id,.method,.preview{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.ts,.latency{font-variant-numeric:tabular-nums}:focus{outline:none}:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px}@keyframes spin{to{transform:rotate(360deg)}}.spin{animation:1s linear infinite spin}@media (prefers-reduced-motion:reduce){.spin{animation:none}}.detail-rail{width:320px}@media (max-width:1023.98px){.detail-rail{display:none}}.ahp-json-container{color:var(--color-text)}.ahp-json-child{margin-left:var(--space-4)}.ahp-json-children{margin:0;padding:0;list-style:none}.ahp-json-label,.ahp-json-clickable-label{color:var(--color-json-key)}.ahp-json-clickable-label{cursor:pointer}.ahp-json-string{color:var(--color-json-string)}.ahp-json-number{color:var(--color-json-number)}.ahp-json-boolean{color:var(--color-json-boolean)}.ahp-json-null,.ahp-json-other{color:var(--color-json-null)}.ahp-json-punctuation,.ahp-json-expander,.ahp-json-collapsed{color:var(--color-json-punctuation)}.ahp-json-expander{cursor:pointer;-webkit-user-select:none;user-select:none;width:1.5ch;display:inline-block}.ahp-json-expander:before{content:"+"}.ahp-json-expander[aria-expanded=true]:before{content:"-"}.ahp-json-collapsed{cursor:pointer}.ahp-json-collapsed:before{content:"..."}.state-inspector{border-top:1px solid var(--color-border);border-bottom:1px solid var(--color-border);padding:var(--space-3);background:color-mix(in srgb, var(--color-surface-raised) 54%, var(--color-surface));color:var(--color-text);font-family:var(--font-sans);font-size:var(--text-ui-size)}.state-inspector-header{justify-content:space-between;align-items:center;gap:var(--space-3);display:flex}.state-inspector h3,.state-inspector p{margin:0}.state-inspector h3{font-size:var(--text-ui-size);font-weight:var(--weight-semibold)}.state-inspector-header p,.state-summary-warning,.state-resource-meta,.state-section-label{color:var(--color-text-muted);font-size:var(--text-ui-muted-size)}.state-inspector-body{gap:var(--space-3);margin-top:var(--space-3);display:grid}.state-action-button,.state-secondary-button,.state-tab,.state-resource-option{font-family:var(--font-sans);font-size:var(--text-ui-size)}.state-action-button,.state-secondary-button{border:1px solid var(--color-border-strong);background:var(--color-surface-raised);color:var(--color-text);cursor:pointer;border-radius:6px}.state-action-button{padding:var(--space-2) var(--space-3);flex:none}.state-secondary-button{padding:var(--space-1) var(--space-2)}.state-inline-status{align-items:center;gap:var(--space-2);color:var(--color-text-muted);display:flex}.state-error,.state-empty{border:1px solid var(--color-border);padding:var(--space-2) var(--space-3);background:var(--color-surface);border-radius:8px}.state-error p{margin:0 0 var(--space-2);color:var(--color-destructive)}.state-metadata-summary dl,.state-summary-grid{gap:var(--space-1) var(--space-3);grid-template-columns:max-content minmax(0,1fr);margin:0;display:grid}.state-metadata-summary dt,.state-summary-grid dt{color:var(--color-text-muted)}.state-metadata-summary dd,.state-summary-grid dd{text-overflow:ellipsis;white-space:nowrap;min-width:0;margin:0;overflow:hidden}.state-confidence{align-items:center;gap:var(--space-2);min-width:0;display:flex}.state-confidence-label{color:var(--color-text-muted);font-size:var(--text-ui-muted-size)}.state-confidence-pill{padding:0 var(--space-2);font-weight:var(--weight-semibold);border:1px solid;border-radius:999px}.state-confidence-caution{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--color-text-muted);font-size:var(--text-ui-muted-size);overflow:hidden}.state-resource-selector{gap:var(--space-1);border:0;min-width:0;margin:0;padding:0;display:grid}.state-section-label{text-transform:uppercase;letter-spacing:.06em}.state-resource-list{gap:var(--space-1);display:grid}.state-resource-option{gap:var(--space-2);width:100%;min-width:0;padding:var(--space-2);border:1px solid var(--color-border);background:var(--color-surface);color:var(--color-text);text-align:left;border-radius:8px;grid-template-columns:minmax(0,1fr) max-content;align-items:center;display:grid}.state-resource-option[aria-pressed=true]{border-color:var(--color-accent);background:color-mix(in srgb, var(--color-accent) 12%, var(--color-surface))}.state-resource-option:not(.state-resource-option-disabled){cursor:pointer}.state-resource-option-disabled{opacity:.72}.state-resource-main{gap:var(--space-2);align-items:baseline;min-width:0;display:flex}.state-resource-kind{color:var(--color-accent);font-weight:var(--weight-semibold);text-transform:uppercase;flex:none}.state-resource-uri{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-family:var(--font-mono);overflow:hidden}.state-resource-meta{gap:var(--space-2);white-space:nowrap;flex:none;display:flex}.state-resource-unavailable{color:var(--color-text-subtle);font-size:var(--text-ui-muted-size)}[data-confidence=complete]{color:var(--color-success)}[data-confidence=partial]{color:var(--color-warning)}[data-confidence=unknown]{color:var(--color-text-subtle)}.state-view-shell{border:1px solid var(--color-border);background:var(--color-surface);border-radius:8px;flex-direction:column;min-height:240px;max-height:480px;display:flex;overflow:hidden}.state-view-header{justify-content:space-between;align-items:center;gap:var(--space-3);padding:var(--space-2) var(--space-3);border-bottom:1px solid var(--color-border);flex:none;display:flex}.state-tabs{border-bottom:1px solid var(--color-border);flex:none;display:flex}.state-tab{border:0;border-right:1px solid var(--color-border);color:var(--color-text-muted);cursor:pointer;padding:var(--space-2) var(--space-3);background:0 0}.state-tab[aria-selected=true]{color:var(--color-text);background:color-mix(in srgb, var(--color-accent) 10%, var(--color-surface));box-shadow:inset 0 -2px 0 var(--color-accent)}.state-copy-menu{flex:none;position:relative}.state-view-actions{align-items:center;gap:var(--space-2);flex:none;display:flex}.state-copy-button{align-items:center;gap:var(--space-1);border:1px solid var(--color-border-strong);background:var(--color-surface-raised);color:var(--color-text);cursor:pointer;font-family:var(--font-sans);font-size:var(--text-ui-muted-size);padding:var(--space-1) var(--space-2);border-radius:4px;display:flex}.state-copy-menu-list{top:calc(100% + var(--space-1));z-index:70;border:1px solid var(--color-border-strong);background:var(--color-surface-raised);min-width:210px;box-shadow:var(--shadow-menu);border-radius:4px;position:absolute;right:0;overflow:hidden}.state-copy-menu-item{width:100%;color:var(--color-text);cursor:pointer;font-family:var(--font-sans);font-size:var(--text-ui-muted-size);padding:var(--space-2) var(--space-3);text-align:left;background:0 0;border:0;display:block}.state-copy-menu-item:hover,.state-copy-menu-item:focus-visible{background:var(--row-hover-bg)}.state-tabpanel{flex:1;min-height:0;display:flex;overflow:auto}.state-summary-view{align-content:start;gap:var(--space-3);width:100%;padding:var(--space-3);display:grid}.state-shape-details{gap:var(--space-1);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}.state-shape-details li{border:1px solid var(--color-border);padding:0 var(--space-2);background:var(--color-surface-raised);color:var(--color-text-muted);font-family:var(--font-mono);font-size:var(--text-ui-muted-size);border-radius:999px}.state-diagnostics{gap:var(--space-2);border:1px solid var(--color-border);padding:var(--space-2) var(--space-3);background:var(--color-surface);border-radius:8px;display:grid}.state-diagnostics-header{gap:var(--space-2);flex-wrap:wrap;align-items:baseline;display:flex}.state-diagnostics-header h4,.state-diagnostic-group h5{color:var(--color-text);font-size:var(--text-ui-size);margin:0}.state-diagnostics-header span,.state-diagnostics-empty{color:var(--color-text-muted);font-size:var(--text-ui-muted-size)}.state-diagnostics-empty{margin:0}.state-diagnostics-groups{gap:var(--space-2);display:grid}.state-diagnostic-group{gap:var(--space-1);display:grid}.state-diagnostic-group ul{gap:var(--space-1);padding:0;padding-right:var(--space-1);max-height:240px;margin:0;list-style:none;display:grid;overflow-y:auto}.state-diagnostic-group li{gap:var(--space-1);border-left:2px solid var(--color-border-strong);padding-left:var(--space-2);overflow-wrap:anywhere;word-break:break-word;display:grid}.state-diagnostic-meta{gap:var(--space-2);color:var(--color-text-muted);font-family:var(--font-mono);font-size:var(--text-ui-muted-size);flex-wrap:wrap;display:flex}.state-diagnostic-message{white-space:pre-wrap;overflow-wrap:anywhere;color:var(--color-text)}.pinned-state-panel{gap:var(--space-2);border:1px solid var(--color-border);padding:var(--space-2) var(--space-3);background:var(--color-surface);border-radius:8px;display:grid}.pinned-state-header{justify-content:space-between;align-items:flex-start;gap:var(--space-3);display:flex}.pinned-state-header h4{color:var(--color-text);font-size:var(--text-ui-size);margin:0}.pinned-state-header p,.pinned-state-empty{color:var(--color-text-muted);font-size:var(--text-ui-muted-size);margin:0}.pinned-state-list{gap:var(--space-2);margin:0;padding:0;list-style:none;display:grid}.pinned-state-card{gap:var(--space-2);border:1px solid var(--color-border-strong);padding:var(--space-2);background:var(--color-surface-raised);box-shadow:var(--shadow-menu);border-radius:8px;display:grid}.pinned-state-meta{gap:var(--space-2);min-width:0;color:var(--color-text-muted);font-size:var(--text-ui-muted-size);flex-wrap:wrap;display:flex}.pinned-state-actions{justify-content:flex-end;display:flex}.state-comparison{gap:var(--space-2);border:1px solid var(--color-border);padding:var(--space-2);background:var(--color-surface-raised);color:var(--color-text);font-family:var(--font-sans);border-radius:8px;display:grid}.state-comparison-header{justify-content:space-between;align-items:flex-start;gap:var(--space-3);display:flex}.state-comparison-header h4{color:var(--color-text);font-size:var(--text-ui-size);margin:0}.state-comparison-points{gap:var(--space-2);display:grid}.state-comparison-points>div{gap:var(--space-1);border:1px solid var(--color-border);min-width:0;padding:var(--space-2);background:var(--color-surface);border-radius:6px;display:grid}.state-comparison-paths{gap:var(--space-1);display:grid}.state-comparison-paths ul{gap:var(--space-1);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}.state-comparison-paths li{border:1px solid var(--color-border);padding:0 var(--space-2);background:var(--color-surface);color:var(--color-accent);font-family:var(--font-mono);font-size:var(--text-ui-muted-size);border-radius:999px}.state-comparison-paths p,.state-comparison-warning,.state-comparison-empty{font-size:var(--text-ui-muted-size);margin:0}.state-comparison-warning{color:var(--color-warning)}.state-comparison-empty{color:var(--color-text-muted)}[data-severity=info]{color:var(--color-info)}[data-severity=warning]{color:var(--color-warning)}[data-severity=error]{color:var(--color-destructive)}.app-shell{min-width:0;overflow:hidden}.crt-display-surface{height:100%}[data-theme=hacker] .crt-filter-defs,.crt-filter-defs{pointer-events:none;width:0;height:0;position:absolute;overflow:hidden}[data-theme=hacker] .crt-display-surface{filter:saturate(1.08)contrast(1.06);box-shadow:inset 0 0 0 2px color-mix(in srgb, var(--color-accent) 26%, transparent), inset 0 18px 36px color-mix(in srgb, var(--color-accent) 16%, transparent), inset 0 -24px 44px color-mix(in srgb, var(--color-bg) 98%, transparent), inset 22px 0 46px color-mix(in srgb, var(--color-bg) 92%, transparent), inset -22px 0 46px color-mix(in srgb, var(--color-bg) 92%, transparent), inset 0 0 140px color-mix(in srgb, var(--color-bg) 96%, transparent), 0 0 0 18px color-mix(in srgb, var(--color-bg) 92%, transparent), 0 0 60px color-mix(in srgb, var(--color-accent) 12%, transparent);border-radius:36px;animation:11s ease-in-out infinite ahp-crt-surface-drift;position:relative;overflow:visible}.app-main,.timeline-pane,.timeline-list-shell{min-width:0}.crt-display-surface>.app-shell{z-index:1;position:relative}[data-theme=hacker] .crt-display-surface>.app-shell{isolation:isolate;text-shadow:0 0 1px color-mix(in srgb, var(--color-text) 64%, transparent), 0 0 7px color-mix(in srgb, var(--color-accent) 30%, transparent), .6px 0 0 color-mix(in srgb, var(--color-info) 28%, transparent), -.6px 0 0 color-mix(in srgb, var(--color-destructive) 20%, transparent);animation:4.8s step-end infinite ahp-crt-phosphor-shift}[data-theme=hacker] .crt-display-surface>.app-shell:before,[data-theme=hacker] .crt-display-surface>.app-shell:after{content:"";pointer-events:none;position:absolute;inset:0}[data-theme=hacker] .crt-display-surface>.app-shell:before{z-index:1300;background:linear-gradient(to bottom, transparent 0, color-mix(in srgb, var(--color-bg) 34%, transparent) 52%, transparent 100%), linear-gradient(to bottom, transparent 0 21%, color-mix(in srgb, var(--color-bg) 32%, transparent) 24%, transparent 31% 68%, color-mix(in srgb, var(--color-bg) 26%, transparent) 72%, transparent 78% 100%), linear-gradient(90deg, color-mix(in srgb, var(--color-info) 22%, transparent), color-mix(in srgb, var(--color-accent) 8%, transparent), color-mix(in srgb, var(--kind-action) 18%, transparent));mix-blend-mode:normal;opacity:.27;background-size:100% 3px,100% 29px,4px 100%;animation:8s linear infinite ahp-crt-foreground-grid}[data-theme=hacker] .crt-display-surface>.app-shell:after{z-index:1301;background:linear-gradient(180deg, transparent 0 36%, color-mix(in srgb, var(--color-info) 7%, transparent) 43%, color-mix(in srgb, var(--color-accent) 18%, transparent) 49%, color-mix(in srgb, var(--color-bg) 28%, transparent) 52%, transparent 61% 100%), repeating-linear-gradient(118deg, transparent 0 13px, color-mix(in srgb, var(--color-accent) 10%, transparent) 13px 14px, transparent 14px 31px);mix-blend-mode:screen;opacity:var(--effect-noise-opacity);background-position:0 -260px,0 0;background-size:100% 220px,180px 180px;animation:5.6s linear infinite ahp-crt-foreground-sweep,.19s step-end infinite ahp-crt-flicker}.crt-curvature-canvas{display:none}[data-theme=hacker] .crt-curvature-canvas{z-index:3;border-radius:inherit;mix-blend-mode:screen;opacity:.92;pointer-events:none;width:100%;height:100%;display:block;position:absolute;inset:0}.detail-rail{box-shadow:var(--shadow-panel)}.detail-drawer-backdrop{z-index:2000;background:var(--overlay-backdrop);justify-content:flex-end;display:flex;position:fixed;inset:0}.detail-drawer{background:var(--color-surface);border-left:var(--drawer-border);width:min(88vw,720px);height:100%;box-shadow:var(--shadow-drawer);flex-direction:column;display:flex;position:relative}.detail-drawer>[data-testid=detail-panel]{flex:1}.detail-drawer-close{top:var(--space-2);right:var(--space-2);z-index:2;min-width:44px;min-height:44px;padding:0 var(--space-3);background:var(--color-chip-bg-active);border:1px solid var(--color-chip-border);color:var(--color-chip-fg);cursor:pointer;font-family:var(--font-sans);font-weight:var(--weight-semibold);border-radius:6px;position:absolute}.filter-bar{align-content:center}.timeline-list-shell [role=row]{min-width:max-content}@media (min-width:1400px){.detail-drawer-backdrop{display:none}}@media (max-width:1399.98px){.app-main .detail-rail{display:none}}@media (max-width:767.98px){.detail-drawer{width:100vw}.filter-bar{flex-wrap:nowrap;overflow-x:auto}}@media (min-width:768px) and (max-width:1199.98px){.filter-bar{height:auto}}@media (min-width:1200px){.filter-bar{flex-wrap:nowrap}}::selection{background:var(--selection-bg);color:var(--selection-fg)}.timeline-list-shell [role=row]:hover{background:var(--row-hover-bg)}[data-theme=hacker] body:before,[data-theme=hacker] body:after{content:"";z-index:0;pointer-events:none;position:fixed;inset:0}[data-theme=hacker] body:before{background:repeating-linear-gradient(to bottom, color-mix(in srgb, var(--color-accent) 100%, transparent) 0, color-mix(in srgb, var(--color-accent) 100%, transparent) 1px, transparent 1px, transparent 3px);opacity:var(--effect-scanline-opacity);animation:12s linear infinite ahp-scanline-drift}[data-theme=hacker] body:after{background:linear-gradient(color-mix(in srgb, var(--color-accent) 100%, transparent) 1px, transparent 1px), linear-gradient(90deg, color-mix(in srgb, var(--color-accent) 100%, transparent) 1px, transparent 1px), radial-gradient(circle at 50% 50%, transparent var(--effect-crt-vignette-stop), color-mix(in srgb, var(--color-bg) 96%, transparent) 100%), repeating-radial-gradient(circle at 18% 28%, color-mix(in srgb, var(--color-accent) 18%, transparent) 0 1px, transparent 1px 4px);opacity:var(--effect-grid-opacity);background-size:32px 32px,32px 32px,100% 100%,6px 6px;animation:7.2s step-end infinite ahp-crt-signal-beat}[data-theme=hacker] .crt-display-surface:before,[data-theme=hacker] .crt-display-surface:after{content:"";border-radius:inherit;pointer-events:none;position:absolute;inset:0}[data-theme=hacker] .crt-display-surface:before{background:radial-gradient(ellipse at 50% -16%, color-mix(in srgb, var(--color-accent) 30%, transparent) 0, color-mix(in srgb, var(--color-accent) 10%, transparent) 18%, transparent 46%), radial-gradient(ellipse at 50% 116%, color-mix(in srgb, var(--color-bg) 96%, transparent) 0, transparent 44%), radial-gradient(circle at 50% 45%, color-mix(in srgb, var(--color-accent) 8%, transparent) 0, transparent var(--effect-crt-vignette-stop), color-mix(in srgb, var(--color-bg) 98%, transparent) 100%), linear-gradient(180deg, color-mix(in srgb, var(--color-accent) 10%, transparent), transparent 24%, transparent 76%, color-mix(in srgb, var(--color-bg) 92%, transparent));opacity:calc(var(--effect-crt-frame-opacity) * var(--effect-crt-glass-opacity))}[data-theme=hacker] .crt-display-surface:after{background:radial-gradient(ellipse at -8% 50%, color-mix(in srgb, var(--color-info) 52%, transparent) 0, transparent 32%), radial-gradient(ellipse at 108% 50%, color-mix(in srgb, var(--kind-action) 48%, transparent) 0, transparent 32%), radial-gradient(ellipse at left center, color-mix(in srgb, var(--color-info) 78%, transparent) 0, transparent var(--effect-crt-fringe-spread)), radial-gradient(ellipse at right center, color-mix(in srgb, var(--kind-action) 68%, transparent) 0, transparent var(--effect-crt-fringe-spread)), linear-gradient(90deg, color-mix(in srgb, var(--color-info) 38%, transparent), transparent 18%, transparent 82%, color-mix(in srgb, var(--kind-action) 38%, transparent));mix-blend-mode:screen;opacity:var(--effect-crt-fringe-opacity);animation:9s steps(2,end) infinite ahp-crt-fringe-jitter}[data-theme=hacker] #root{z-index:1;box-shadow:inset 0 0 120px color-mix(in srgb, var(--color-accent) 10%, transparent);position:relative}[data-theme=hacker] header,[data-theme=hacker] .detail-rail,[data-theme=hacker] .detail-drawer,[data-theme=hacker] [data-testid=filter-bar]{box-shadow:var(--effect-glow)}[data-theme=hacker] [data-selected=true]{box-shadow:inset 0 0 0 1px var(--color-border-strong), var(--effect-glow)}@keyframes ahp-scanline-drift{0%{background-position-y:0}to{background-position-y:32px}}@keyframes ahp-crt-surface-drift{0%,to{opacity:1}50%{opacity:.985}}@keyframes ahp-crt-signal-beat{0%,42%,44%,to{filter:brightness();transform:translate(0)scaleY(1)}43%{transform:translateX(var(--effect-crt-signal-jitter)) scaleY(var(--effect-crt-glitch-boost));filter:brightness(var(--effect-crt-glitch-boost))}}@keyframes ahp-crt-fringe-jitter{0%,to{transform:translate(0)}52%{transform:translateX(calc(var(--effect-crt-signal-jitter) * -1))}}@keyframes ahp-crt-phosphor-shift{0%,76%,to{text-shadow:0 0 1px color-mix(in srgb, var(--color-text) 64%, transparent), 0 0 7px color-mix(in srgb, var(--color-accent) 30%, transparent), .6px 0 0 color-mix(in srgb, var(--color-info) 28%, transparent), -.6px 0 0 color-mix(in srgb, var(--color-destructive) 20%, transparent)}77%{text-shadow:0 0 2px color-mix(in srgb, var(--color-text) 72%, transparent), 0 0 11px color-mix(in srgb, var(--color-accent) 40%, transparent), 1.25px 0 0 color-mix(in srgb, var(--color-info) 34%, transparent), -1px 0 0 color-mix(in srgb, var(--color-destructive) 28%, transparent)}78%{text-shadow:0 0 1px color-mix(in srgb, var(--color-text) 58%, transparent), 0 0 5px color-mix(in srgb, var(--color-accent) 24%, transparent), .35px 0 0 color-mix(in srgb, var(--color-info) 24%, transparent), -.35px 0 0 color-mix(in srgb, var(--color-destructive) 16%, transparent)}}@keyframes ahp-crt-foreground-grid{0%{background-position:0 0,0 0,0 0}to{background-position:0 24px,0 -37px,4px 0}}@keyframes ahp-crt-foreground-sweep{0%{background-position:0 -260px,0 0}to{background-position:0 calc(100% + 260px),180px 0}}@keyframes ahp-crt-flicker{0%,to{opacity:calc(var(--effect-noise-opacity) * .84)}22%{opacity:calc(var(--effect-noise-opacity) * 1.12)}58%{opacity:calc(var(--effect-noise-opacity) * .72)}79%{opacity:calc(var(--effect-noise-opacity) * 1.26)}}@media (prefers-reduced-motion:reduce){[data-theme=hacker] body:before,[data-theme=hacker] body:after,[data-theme=hacker] .crt-display-surface,[data-theme=hacker] .crt-display-surface:before,[data-theme=hacker] .crt-display-surface:after,[data-theme=hacker] .crt-display-surface>.app-shell,[data-theme=hacker] .crt-display-surface>.app-shell:before,[data-theme=hacker] .crt-display-surface>.app-shell:after,[data-theme=hacker] #root,[data-theme=hacker] [data-selected=true]{transition:none;animation:none}[data-theme=hacker] .crt-curvature-canvas{opacity:.78}}