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 +93 -5
- package/package.json +1 -1
- package/ui-dist/assets/index-CkWXlGE4.css +1 -0
- package/ui-dist/assets/index-DHunX_bW.js +81 -0
- package/ui-dist/assets/index-DHunX_bW.js.map +1 -0
- package/ui-dist/index.html +2 -2
- package/ui-dist/assets/index-BAvWUkL4.css +0 -1
- package/ui-dist/assets/index-CJtScnuN.js +0 -81
- package/ui-dist/assets/index-CJtScnuN.js.map +0 -1
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: "
|
|
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
|
@@ -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}}
|