ahp-inspector 1.3.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -2760,7 +2760,7 @@ var IS_CLIENT_DISPATCHABLE = {
2760
2760
  ["root/configChanged" /* RootConfigChanged */]: true,
2761
2761
  ["session/ready" /* SessionReady */]: false,
2762
2762
  ["session/creationFailed" /* SessionCreationFailed */]: false,
2763
- ["session/turnStarted" /* SessionTurnStarted */]: true,
2763
+ ["session/turnStarted" /* SessionTurnStarted */]: false,
2764
2764
  ["session/delta" /* SessionDelta */]: false,
2765
2765
  ["session/responsePart" /* SessionResponsePart */]: false,
2766
2766
  ["session/toolCallStart" /* SessionToolCallStart */]: false,
@@ -2788,13 +2788,19 @@ var IS_CLIENT_DISPATCHABLE = {
2788
2788
  ["session/inputCompleted" /* SessionInputCompleted */]: true,
2789
2789
  ["session/customizationsChanged" /* SessionCustomizationsChanged */]: false,
2790
2790
  ["session/customizationToggled" /* SessionCustomizationToggled */]: true,
2791
+ ["session/customizationUpdated" /* SessionCustomizationUpdated */]: false,
2791
2792
  ["session/truncated" /* SessionTruncated */]: true,
2792
2793
  ["session/isReadChanged" /* SessionIsReadChanged */]: true,
2793
2794
  ["session/isArchivedChanged" /* SessionIsArchivedChanged */]: true,
2794
2795
  ["session/activityChanged" /* SessionActivityChanged */]: false,
2795
- ["session/diffsChanged" /* SessionDiffsChanged */]: false,
2796
+ ["session/changesetsChanged" /* SessionChangesetsChanged */]: false,
2796
2797
  ["session/configChanged" /* SessionConfigChanged */]: true,
2797
2798
  ["session/metaChanged" /* SessionMetaChanged */]: false,
2799
+ ["changeset/statusChanged" /* ChangesetStatusChanged */]: false,
2800
+ ["changeset/fileSet" /* ChangesetFileSet */]: false,
2801
+ ["changeset/fileRemoved" /* ChangesetFileRemoved */]: false,
2802
+ ["changeset/operationsChanged" /* ChangesetOperationsChanged */]: false,
2803
+ ["changeset/cleared" /* ChangesetCleared */]: false,
2798
2804
  ["terminal/data" /* TerminalData */]: false,
2799
2805
  ["terminal/input" /* TerminalInput */]: true,
2800
2806
  ["terminal/resized" /* TerminalResized */]: true,
@@ -2808,11 +2814,39 @@ var IS_CLIENT_DISPATCHABLE = {
2808
2814
  ["terminal/commandFinished" /* TerminalCommandFinished */]: false
2809
2815
  };
2810
2816
 
2811
- // ../protocol/src/reducers.ts
2817
+ // ../protocol/src/common/reducer-helpers.ts
2812
2818
  function softAssertNever(value, log) {
2813
2819
  const msg = `Unhandled action type: ${JSON.stringify(value)}`;
2814
2820
  (log ?? console.warn)(msg);
2815
2821
  }
2822
+
2823
+ // ../protocol/src/channels-root/reducer.ts
2824
+ function rootReducer(state, action, log) {
2825
+ switch (action.type) {
2826
+ case "root/agentsChanged" /* RootAgentsChanged */:
2827
+ return { ...state, agents: action.agents };
2828
+ case "root/activeSessionsChanged" /* RootActiveSessionsChanged */:
2829
+ return { ...state, activeSessions: action.activeSessions };
2830
+ case "root/terminalsChanged" /* RootTerminalsChanged */:
2831
+ return { ...state, terminals: action.terminals };
2832
+ case "root/configChanged" /* RootConfigChanged */:
2833
+ if (!state.config) {
2834
+ return state;
2835
+ }
2836
+ return {
2837
+ ...state,
2838
+ config: {
2839
+ ...state.config,
2840
+ values: action.replace ? { ...action.config } : { ...state.config.values, ...action.config }
2841
+ }
2842
+ };
2843
+ default:
2844
+ softAssertNever(action, log);
2845
+ return state;
2846
+ }
2847
+ }
2848
+
2849
+ // ../protocol/src/channels-session/reducer.ts
2816
2850
  function tcBase(tc) {
2817
2851
  return {
2818
2852
  toolCallId: tc.toolCallId,
@@ -2973,30 +3007,6 @@ function updateResponsePart(state, turnId, partId, updater) {
2973
3007
  activeTurn: { ...activeTurn, responseParts }
2974
3008
  };
2975
3009
  }
2976
- function rootReducer(state, action, log) {
2977
- switch (action.type) {
2978
- case "root/agentsChanged" /* RootAgentsChanged */:
2979
- return { ...state, agents: action.agents };
2980
- case "root/activeSessionsChanged" /* RootActiveSessionsChanged */:
2981
- return { ...state, activeSessions: action.activeSessions };
2982
- case "root/terminalsChanged" /* RootTerminalsChanged */:
2983
- return { ...state, terminals: action.terminals };
2984
- case "root/configChanged" /* RootConfigChanged */:
2985
- if (!state.config) {
2986
- return state;
2987
- }
2988
- return {
2989
- ...state,
2990
- config: {
2991
- ...state.config,
2992
- values: action.replace ? { ...action.config } : { ...state.config.values, ...action.config }
2993
- }
2994
- };
2995
- default:
2996
- softAssertNever(action, log);
2997
- return state;
2998
- }
2999
- }
3000
3010
  function sessionReducer(state, action, log) {
3001
3011
  switch (action.type) {
3002
3012
  // ── Lifecycle ──────────────────────────────────────────────────────────
@@ -3280,26 +3290,46 @@ function sessionReducer(state, action, log) {
3280
3290
  ...state,
3281
3291
  summary: { ...state.summary, activity: action.activity }
3282
3292
  };
3283
- case "session/diffsChanged" /* SessionDiffsChanged */:
3284
- return {
3285
- ...state,
3286
- summary: { ...state.summary, diffs: action.diffs }
3287
- };
3288
- case "session/configChanged" /* SessionConfigChanged */:
3293
+ case "session/changesetsChanged" /* SessionChangesetsChanged */: {
3294
+ const { changesets: _omit, ...summaryWithoutChangesets } = state.summary;
3295
+ const newSummary = action.changesets ? { ...summaryWithoutChangesets, changesets: action.changesets } : summaryWithoutChangesets;
3296
+ return { ...state, summary: newSummary };
3297
+ }
3298
+ case "session/configChanged" /* SessionConfigChanged */: {
3289
3299
  if (!state.config) {
3300
+ if (!action.schema) {
3301
+ return state;
3302
+ }
3303
+ return {
3304
+ ...state,
3305
+ config: {
3306
+ schema: action.schema,
3307
+ values: action.config ? { ...action.config } : {}
3308
+ },
3309
+ summary: {
3310
+ ...state.summary,
3311
+ modifiedAt: Date.now()
3312
+ }
3313
+ };
3314
+ }
3315
+ const values = action.config !== void 0 ? action.replace ? { ...action.config } : { ...state.config.values, ...action.config } : state.config.values;
3316
+ const schema = action.schema ?? state.config.schema;
3317
+ if (values === state.config.values && schema === state.config.schema) {
3290
3318
  return state;
3291
3319
  }
3292
3320
  return {
3293
3321
  ...state,
3294
3322
  config: {
3295
3323
  ...state.config,
3296
- values: action.replace ? { ...action.config } : { ...state.config.values, ...action.config }
3324
+ schema,
3325
+ values
3297
3326
  },
3298
3327
  summary: {
3299
3328
  ...state.summary,
3300
3329
  modifiedAt: Date.now()
3301
3330
  }
3302
3331
  };
3332
+ }
3303
3333
  case "session/metaChanged" /* SessionMetaChanged */:
3304
3334
  return { ...state, _meta: action._meta };
3305
3335
  case "session/serverToolsChanged" /* SessionServerToolsChanged */:
@@ -3333,6 +3363,36 @@ function sessionReducer(state, action, log) {
3333
3363
  updated[idx] = { ...list[idx], enabled: action.enabled };
3334
3364
  return { ...state, customizations: updated };
3335
3365
  }
3366
+ case "session/customizationUpdated" /* SessionCustomizationUpdated */: {
3367
+ const list = state.customizations ?? [];
3368
+ const idx = list.findIndex((c) => c.customization.uri === action.customization.uri);
3369
+ if (idx < 0) {
3370
+ const inserted = {
3371
+ customization: action.customization,
3372
+ enabled: action.enabled ?? false
3373
+ };
3374
+ if (action.status !== void 0) {
3375
+ inserted.status = action.status;
3376
+ }
3377
+ if (action.statusMessage !== void 0) {
3378
+ inserted.statusMessage = action.statusMessage;
3379
+ }
3380
+ return { ...state, customizations: [...list, inserted] };
3381
+ }
3382
+ const updated = [...list];
3383
+ const next = { ...list[idx], customization: action.customization };
3384
+ if (action.enabled !== void 0) {
3385
+ next.enabled = action.enabled;
3386
+ }
3387
+ if (action.status !== void 0) {
3388
+ next.status = action.status;
3389
+ }
3390
+ if (action.statusMessage !== void 0) {
3391
+ next.statusMessage = action.statusMessage;
3392
+ }
3393
+ updated[idx] = next;
3394
+ return { ...state, customizations: updated };
3395
+ }
3336
3396
  // ── Truncation ────────────────────────────────────────────────────────
3337
3397
  case "session/truncated" /* SessionTruncated */: {
3338
3398
  let turns;
@@ -3458,6 +3518,8 @@ function sessionReducer(state, action, log) {
3458
3518
  return state;
3459
3519
  }
3460
3520
  }
3521
+
3522
+ // ../protocol/src/channels-terminal/reducer.ts
3461
3523
  function terminalReducer(state, action, log) {
3462
3524
  switch (action.type) {
3463
3525
  case "terminal/data" /* TerminalData */: {
@@ -3562,13 +3624,19 @@ var ACTION_INTRODUCED_IN = {
3562
3624
  ["session/inputCompleted" /* SessionInputCompleted */]: "0.1.0",
3563
3625
  ["session/customizationsChanged" /* SessionCustomizationsChanged */]: "0.1.0",
3564
3626
  ["session/customizationToggled" /* SessionCustomizationToggled */]: "0.1.0",
3627
+ ["session/customizationUpdated" /* SessionCustomizationUpdated */]: "0.1.0",
3565
3628
  ["session/truncated" /* SessionTruncated */]: "0.1.0",
3566
3629
  ["session/isReadChanged" /* SessionIsReadChanged */]: "0.1.0",
3567
3630
  ["session/isArchivedChanged" /* SessionIsArchivedChanged */]: "0.1.0",
3568
3631
  ["session/activityChanged" /* SessionActivityChanged */]: "0.1.0",
3569
- ["session/diffsChanged" /* SessionDiffsChanged */]: "0.1.0",
3632
+ ["session/changesetsChanged" /* SessionChangesetsChanged */]: "0.2.0",
3570
3633
  ["session/configChanged" /* SessionConfigChanged */]: "0.1.0",
3571
3634
  ["session/metaChanged" /* SessionMetaChanged */]: "0.1.0",
3635
+ ["changeset/statusChanged" /* ChangesetStatusChanged */]: "0.2.0",
3636
+ ["changeset/fileSet" /* ChangesetFileSet */]: "0.2.0",
3637
+ ["changeset/fileRemoved" /* ChangesetFileRemoved */]: "0.2.0",
3638
+ ["changeset/operationsChanged" /* ChangesetOperationsChanged */]: "0.2.0",
3639
+ ["changeset/cleared" /* ChangesetCleared */]: "0.2.0",
3572
3640
  ["root/terminalsChanged" /* RootTerminalsChanged */]: "0.1.0",
3573
3641
  ["root/configChanged" /* RootConfigChanged */]: "0.1.0",
3574
3642
  ["terminal/data" /* TerminalData */]: "0.1.0",
@@ -3583,12 +3651,6 @@ var ACTION_INTRODUCED_IN = {
3583
3651
  ["terminal/commandExecuted" /* TerminalCommandExecuted */]: "0.1.0",
3584
3652
  ["terminal/commandFinished" /* TerminalCommandFinished */]: "0.1.0"
3585
3653
  };
3586
- var NOTIFICATION_INTRODUCED_IN = {
3587
- ["notify/sessionAdded" /* SessionAdded */]: "0.1.0",
3588
- ["notify/sessionRemoved" /* SessionRemoved */]: "0.1.0",
3589
- ["notify/sessionSummaryChanged" /* SessionSummaryChanged */]: "0.1.0",
3590
- ["notify/authRequired" /* AuthRequired */]: "0.1.0"
3591
- };
3592
3654
 
3593
3655
  // ../core/src/replay.ts
3594
3656
  var ROOT_RESOURCE = "agenthost:/root";
@@ -3768,7 +3830,7 @@ function installSnapshot(ctx, value, eventIdx) {
3768
3830
  });
3769
3831
  }
3770
3832
  function applyEnvelope(ctx, envelope, eventIdx, eventTs) {
3771
- const target = inferActionTarget(envelope.action);
3833
+ const target = inferActionTarget(envelope.action, envelope.channel);
3772
3834
  if (!target) {
3773
3835
  addDiagnostic(ctx, {
3774
3836
  code: "unknown-action",
@@ -3859,7 +3921,8 @@ function recordClientIntent(ctx, event, eventIdx) {
3859
3921
  const action = isRecord(params) && isRecord(params.action) ? params.action : null;
3860
3922
  const clientSeq = isRecord(params) && typeof params.clientSeq === "number" ? params.clientSeq : null;
3861
3923
  const actionType = actionTypeOf(action);
3862
- const resource = action ? inferActionTarget(action) : null;
3924
+ const channel = isRecord(params) && typeof params.channel === "string" ? params.channel : void 0;
3925
+ const resource = action ? inferActionTarget(action, channel) : null;
3863
3926
  const intent = {
3864
3927
  eventIdx,
3865
3928
  ts: event.ts,
@@ -3917,7 +3980,7 @@ function readSnapshot(value) {
3917
3980
  };
3918
3981
  }
3919
3982
  function readActionEnvelope(value) {
3920
- if (!isRecord(value) || typeof value.serverSeq !== "number" || !isRecord(value.action)) {
3983
+ if (!isRecord(value) || typeof value.channel !== "string" || typeof value.serverSeq !== "number" || !isRecord(value.action)) {
3921
3984
  return null;
3922
3985
  }
3923
3986
  if (typeof value.action.type !== "string") {
@@ -3925,6 +3988,7 @@ function readActionEnvelope(value) {
3925
3988
  }
3926
3989
  const origin = isRecord(value.origin) && typeof value.origin.clientId === "string" && typeof value.origin.clientSeq === "number" ? { clientId: value.origin.clientId, clientSeq: value.origin.clientSeq } : void 0;
3927
3990
  return {
3991
+ channel: value.channel,
3928
3992
  action: value.action,
3929
3993
  serverSeq: value.serverSeq,
3930
3994
  origin,
@@ -3946,20 +4010,20 @@ function inferSnapshotKind(snapshot) {
3946
4010
  }
3947
4011
  return "unknown";
3948
4012
  }
3949
- function inferActionTarget(action) {
4013
+ function inferActionTarget(action, channel) {
3950
4014
  const type = actionTypeOf(action);
3951
4015
  if (!type) {
3952
4016
  return null;
3953
4017
  }
3954
4018
  if (type.startsWith("root/")) {
3955
- return { kind: "root", uri: ROOT_RESOURCE };
4019
+ return { kind: "root", uri: channel ?? ROOT_RESOURCE };
3956
4020
  }
3957
4021
  if (type.startsWith("session/")) {
3958
- const session = isRecord(action) && typeof action.session === "string" ? action.session : null;
4022
+ const session = channel ?? (isRecord(action) && typeof action.session === "string" ? action.session : null);
3959
4023
  return session ? { kind: "session", uri: session } : null;
3960
4024
  }
3961
4025
  if (type.startsWith("terminal/")) {
3962
- const terminal = isRecord(action) && typeof action.terminal === "string" ? action.terminal : null;
4026
+ const terminal = channel ?? (isRecord(action) && typeof action.terminal === "string" ? action.terminal : null);
3963
4027
  return terminal ? { kind: "terminal", uri: terminal } : null;
3964
4028
  }
3965
4029
  return null;
@@ -4124,12 +4188,14 @@ function readKnownAction(value) {
4124
4188
  }
4125
4189
  function readActionEnvelope2(value) {
4126
4190
  if (!isRecord2(value)) return null;
4191
+ if (typeof value.channel !== "string") return null;
4127
4192
  if (typeof value.serverSeq !== "number") return null;
4128
4193
  const action = asRecord(value.action);
4129
4194
  if (!action || typeof action.type !== "string") return null;
4130
4195
  const origin = isRecord2(value.origin) && typeof value.origin.clientId === "string" && typeof value.origin.clientSeq === "number" ? { clientId: value.origin.clientId, clientSeq: value.origin.clientSeq } : void 0;
4131
4196
  const known = readKnownAction(action);
4132
4197
  return {
4198
+ channel: value.channel,
4133
4199
  action: known ?? action,
4134
4200
  serverSeq: value.serverSeq,
4135
4201
  origin,
@@ -4215,7 +4281,7 @@ function summarizeResponse(view) {
4215
4281
  }
4216
4282
  function summarizeAction(view) {
4217
4283
  if (isKnownAction(view.action)) {
4218
- return summarizeKnownAction(view.action);
4284
+ return summarizeKnownAction(view.action, view.envelope?.channel ?? null);
4219
4285
  }
4220
4286
  return summarizeUnknownAction(view.action);
4221
4287
  }
@@ -4228,7 +4294,7 @@ function summarizeProtocolNotification(view) {
4228
4294
  function summarizeLog(view) {
4229
4295
  return `log ${clip(view.message ?? "details unavailable")}`;
4230
4296
  }
4231
- function summarizeKnownAction(action) {
4297
+ function summarizeKnownAction(action, channel) {
4232
4298
  switch (action.type) {
4233
4299
  case "session/delta" /* SessionDelta */:
4234
4300
  return `delta "${clip(action.content)}"`;
@@ -4237,13 +4303,13 @@ function summarizeKnownAction(action) {
4237
4303
  case "session/toolCallStart" /* SessionToolCallStart */:
4238
4304
  return `tool start ${action.toolName}${action.displayName ? ` (${clip(action.displayName, 32)})` : ""}`;
4239
4305
  case "session/toolCallDelta" /* SessionToolCallDelta */:
4240
- return `tool delta ${action.toolCallId} +${action.content.length}b`;
4306
+ return summarizeToolCallDelta(action);
4241
4307
  case "session/toolCallReady" /* SessionToolCallReady */:
4242
4308
  return `tool ready ${action.toolCallId} ${stringOrMd(action.invocationMessage, 48)}`;
4243
4309
  case "session/toolCallComplete" /* SessionToolCallComplete */:
4244
4310
  return `tool result ${action.toolCallId} success=${action.result.success}`;
4245
4311
  case "session/toolCallContentChanged" /* SessionToolCallContentChanged */:
4246
- return `tool content ${action.toolCallId} (${action.content.length} parts)`;
4312
+ return summarizeToolCallContentChanged(action);
4247
4313
  case "session/turnStarted" /* SessionTurnStarted */:
4248
4314
  return `turn start ${shortId(action.turnId)}`;
4249
4315
  case "session/turnComplete" /* SessionTurnComplete */:
@@ -4261,15 +4327,23 @@ function summarizeKnownAction(action) {
4261
4327
  case "session/reasoning" /* SessionReasoning */:
4262
4328
  return `reasoning "${clip(action.content, 60)}"`;
4263
4329
  case "session/ready" /* SessionReady */:
4264
- return `session ready ${shortId(action.session)}`;
4330
+ return channel ? `session ready ${shortId(channel)}` : "session ready";
4265
4331
  case "terminal/data" /* TerminalData */:
4266
- return `terminal data ${shortId(action.terminal)} +${action.data.length}b`;
4332
+ return channel ? `terminal data ${shortId(channel)} +${action.data.length}b` : `terminal data +${action.data.length}b`;
4267
4333
  case "terminal/commandFinished" /* TerminalCommandFinished */:
4268
4334
  return `terminal cmd done exit=${action.exitCode ?? "?"}`;
4269
4335
  default:
4270
4336
  return innerActionTypeAndDetail(toUnknownPayload(action));
4271
4337
  }
4272
4338
  }
4339
+ function summarizeToolCallDelta(action) {
4340
+ const content = typeof action.content === "string" ? action.content : null;
4341
+ return content === null ? `tool delta ${action.toolCallId}` : `tool delta ${action.toolCallId} +${content.length}b`;
4342
+ }
4343
+ function summarizeToolCallContentChanged(action) {
4344
+ const content = Array.isArray(action.content) ? action.content : null;
4345
+ return content === null ? `tool content ${action.toolCallId}` : `tool content ${action.toolCallId} (${content.length} parts)`;
4346
+ }
4273
4347
  function summarizeUnknownAction(action) {
4274
4348
  if (!action.type) return "action details unavailable";
4275
4349
  const t = action.type;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ahp-inspector",
3
- "version": "1.3.0",
3
+ "version": "1.3.1",
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-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}}