@solongate/proxy 0.81.34 → 0.81.36

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
@@ -6781,8 +6781,8 @@ var init_theme = __esm({
6781
6781
  init_config2();
6782
6782
  accent = loadConfig().accent;
6783
6783
  theme = {
6784
- accent: accent || "cyan",
6785
- accentBright: accent || "#5a8ce6",
6784
+ accent: accent || "white",
6785
+ accentBright: accent || "white",
6786
6786
  ok: "green",
6787
6787
  warn: "yellow",
6788
6788
  bad: "red",
@@ -7401,7 +7401,7 @@ function StreamLine({ e, loc, selected }) {
7401
7401
  hhmmss(e.at),
7402
7402
  " "
7403
7403
  ] }),
7404
- /* @__PURE__ */ jsx2(Text2, { color: loc ? theme.ok : "#4f6db8", children: loc ? "LOC" : "CLD" }),
7404
+ /* @__PURE__ */ jsx2(Text2, { color: loc ? theme.ok : "white", children: loc ? "LOC" : "CLD" }),
7405
7405
  /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: "] " }),
7406
7406
  /* @__PURE__ */ jsx2(Text2, { color: decisionColor(e.decision), bold: e.decision !== "ALLOW", children: e.decision.padEnd(6) }),
7407
7407
  /* @__PURE__ */ jsx2(Text2, { color: theme.accent, children: truncate2(e.tool, 12).padEnd(13) }),
@@ -7409,6 +7409,7 @@ function StreamLine({ e, loc, selected }) {
7409
7409
  /* @__PURE__ */ jsx2(Text2, { color: e.evalMs != null && e.evalMs > 500 ? theme.warn : theme.dim, children: (e.evalMs != null ? `${e.evalMs}ms` : "\u2014").padEnd(7) }),
7410
7410
  /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: truncate2(e.agent ?? "-", 11).padEnd(12) }),
7411
7411
  e.dlp ? /* @__PURE__ */ jsx2(Text2, { color: theme.bad, children: "DLP! " }) : null,
7412
+ e.burst ? /* @__PURE__ */ jsx2(Text2, { color: theme.warn, children: "RL! " }) : null,
7412
7413
  e.rule && e.decision !== "ALLOW" ? /* @__PURE__ */ jsx2(Text2, { color: theme.bad, children: truncate2(e.rule, 14) + " " }) : null,
7413
7414
  /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: e.detail })
7414
7415
  ] });
@@ -7907,9 +7908,9 @@ function LivePanel({ active: active2 }) {
7907
7908
  ] });
7908
7909
  }
7909
7910
  const titleBar = /* @__PURE__ */ jsxs2(Text2, { wrap: "truncate", children: [
7910
- /* @__PURE__ */ jsx2(Text2, { backgroundColor: "#1432A0", color: "#AAC8FA", bold: true, children: " SOLONGATE LIVE " }),
7911
- /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "#82AAF0", children: ` ${spin} up ${fmtUp(nowMs - startRef.current)} \xB7 ${hhmmss(nowMs)} \xB7 api ${latNow}ms ` }),
7912
- frozen ? /* @__PURE__ */ jsx2(Text2, { backgroundColor: "#123d1f", color: "#7bd88f", bold: true, children: " \u23F5 COPY MODE \u2014 screen frozen, select & copy freely \xB7 space resume " }) : backingOff ? /* @__PURE__ */ jsx2(Text2, { backgroundColor: "#3d2a12", color: "#ffb454", bold: true, children: " RATE LIMITED \xB7 backing off " }) : lastDeny ? /* @__PURE__ */ jsx2(Text2, { backgroundColor: "#3d1220", color: "#ff6b6b", bold: true, children: ` \u26A0 ${hhmmss(lastDeny.at)} ${lastDeny.tool} DENIED ` }) : /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "#4f6db8", children: " \u2713 clean " })
7911
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: "#1432A0", color: "white", bold: true, children: " SOLONGATE LIVE " }),
7912
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "white", children: ` ${spin} up ${fmtUp(nowMs - startRef.current)} \xB7 ${hhmmss(nowMs)} \xB7 api ${latNow}ms ` }),
7913
+ frozen ? /* @__PURE__ */ jsx2(Text2, { backgroundColor: "#123d1f", color: "#7bd88f", bold: true, children: " \u23F5 COPY MODE \u2014 screen frozen, select & copy freely \xB7 space resume " }) : backingOff ? /* @__PURE__ */ jsx2(Text2, { backgroundColor: "#3d2a12", color: "#ffb454", bold: true, children: " RATE LIMITED \xB7 backing off " }) : lastDeny ? /* @__PURE__ */ jsx2(Text2, { backgroundColor: "#3d1220", color: "#ff6b6b", bold: true, children: ` \u26A0 ${hhmmss(lastDeny.at)} ${lastDeny.tool} DENIED ` }) : /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "white", children: " \u2713 clean " })
7913
7914
  ] });
7914
7915
  if (showHelp) {
7915
7916
  return /* @__PURE__ */ jsxs2(Box2, { flexDirection: "column", paddingX: 1, children: [
@@ -7936,10 +7937,10 @@ function LivePanel({ active: active2 }) {
7936
7937
  return /* @__PURE__ */ jsxs2(Box2, { flexDirection: "column", paddingX: 1, children: [
7937
7938
  titleBar,
7938
7939
  /* @__PURE__ */ jsxs2(Text2, { wrap: "truncate", children: [
7939
- /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "#AAC8FA", bold: true, children: " ENTRY " }),
7940
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "white", bold: true, children: " ENTRY " }),
7940
7941
  /* @__PURE__ */ jsx2(Text2, { color: decisionColor(e.decision), bold: true, children: " " + e.decision }),
7941
7942
  /* @__PURE__ */ jsx2(Text2, { color: theme.accent, bold: true, children: " " + e.tool }),
7942
- /* @__PURE__ */ jsx2(Text2, { color: isLoc(e) ? theme.ok : "#4f6db8", children: " " + (isLoc(e) ? "LOC" : "CLD") }),
7943
+ /* @__PURE__ */ jsx2(Text2, { color: isLoc(e) ? theme.ok : "white", children: " " + (isLoc(e) ? "LOC" : "CLD") }),
7943
7944
  e.dlp ? /* @__PURE__ */ jsx2(Text2, { color: theme.bad, children: " DLP!" }) : null,
7944
7945
  e.burst ? /* @__PURE__ */ jsx2(Text2, { color: theme.warn, children: " BURST" }) : null,
7945
7946
  /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: " \u2190 back" })
@@ -7965,9 +7966,9 @@ function LivePanel({ active: active2 }) {
7965
7966
  /* @__PURE__ */ jsx2(PaneTitle, { label: "FULL CONTENT", extra: `${lines.length} lines${maxScroll2 ? ` \xB7 \u25BC${maxScroll2 - off} more \xB7 \u2191\u2193 scroll` : ""} \xB7 space copy \xB7 \u2190 back`, width: innerW }),
7966
7967
  /* @__PURE__ */ jsx2(Box2, { flexDirection: "column", height: bodyRows, overflow: "hidden", children: win.map((l, i) => /* @__PURE__ */ jsx2(Text2, { wrap: "truncate", children: l || " " }, off + i)) }),
7967
7968
  /* @__PURE__ */ jsxs2(Text2, { wrap: "truncate", children: [
7968
- /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "#82AAF0", bold: true, children: " ENTRY " }),
7969
- /* @__PURE__ */ jsx2(Text2, { backgroundColor: "#0b1530", color: "#4f6db8", children: ` ${e.id} ` }),
7970
- /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "#82AAF0", children: " \u2191\u2193 scroll \xB7 space copy \xB7 ? all keys \xB7 \u2190 back \xB7 esc menu " })
7969
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "white", bold: true, children: " ENTRY " }),
7970
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: "#0b1530", color: "white", children: ` ${e.id} ` }),
7971
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "white", children: " \u2191\u2193 scroll \xB7 space copy \xB7 ? all keys \xB7 \u2190 back \xB7 esc menu " })
7971
7972
  ] })
7972
7973
  ] });
7973
7974
  }
@@ -7997,12 +7998,12 @@ function LivePanel({ active: active2 }) {
7997
7998
  return /* @__PURE__ */ jsxs2(Box2, { flexDirection: "column", paddingX: 1, children: [
7998
7999
  titleBar,
7999
8000
  /* @__PURE__ */ jsxs2(Text2, { wrap: "truncate", children: [
8000
- /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "#AAC8FA", bold: true, children: ` SESSION ${detail.id.slice(0, 8)} ` }),
8001
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "white", bold: true, children: ` SESSION ${detail.id.slice(0, 8)} ` }),
8001
8002
  (() => {
8002
8003
  const st = STATUS_STYLE[sessStatus(detail.lastAt, nowMs)];
8003
8004
  return /* @__PURE__ */ jsx2(Text2, { color: st.color, bold: true, children: ` ${st.dot} ${st.label}` });
8004
8005
  })(),
8005
- /* @__PURE__ */ jsx2(Text2, { color: detail.source === "local" ? theme.ok : "#4f6db8", children: " " + detail.source.toUpperCase() }),
8006
+ /* @__PURE__ */ jsx2(Text2, { color: detail.source === "local" ? theme.ok : "white", children: " " + detail.source.toUpperCase() }),
8006
8007
  /* @__PURE__ */ jsx2(Text2, { bold: true, children: " " + truncate2(detail.isMe ? detail.agent + " (this machine)" : detail.agent, 34) }),
8007
8008
  detail.trust != null ? /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: ` trust ${detail.trust}/100` }) : null,
8008
8009
  /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: " \u2190 back" })
@@ -8038,9 +8039,9 @@ function LivePanel({ active: active2 }) {
8038
8039
  tl.map((e, i) => /* @__PURE__ */ jsx2(StreamLine, { e, loc: isLoc(e), selected: start + i === dSel }, e.id))
8039
8040
  ] }),
8040
8041
  /* @__PURE__ */ jsxs2(Text2, { wrap: "truncate", children: [
8041
- /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "#82AAF0", bold: true, children: " SESSION " }),
8042
- /* @__PURE__ */ jsx2(Text2, { backgroundColor: "#0b1530", color: "#4f6db8", children: ` ${detail.id} ` }),
8043
- /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "#82AAF0", children: " \u2191\u2193 select \xB7 enter full entry \xB7 ? all keys \xB7 \u2190 back \xB7 esc menu " })
8042
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "white", bold: true, children: " SESSION " }),
8043
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: "#0b1530", color: "white", children: ` ${detail.id} ` }),
8044
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "white", children: " \u2191\u2193 select \xB7 enter full entry \xB7 ? all keys \xB7 \u2190 back \xB7 esc menu " })
8044
8045
  ] })
8045
8046
  ] });
8046
8047
  }
@@ -8086,7 +8087,7 @@ function LivePanel({ active: active2 }) {
8086
8087
  ] }),
8087
8088
  /* @__PURE__ */ jsxs2(Box2, { flexDirection: "column", width: rightW, children: [
8088
8089
  /* @__PURE__ */ jsx2(PaneTitle, { label: "API LATENCY", extra: `now ${latNow}ms \xB7 med ${latMed}ms \xB7 amber >${Math.round(latHotAt)}ms`, width: rightW }),
8089
- /* @__PURE__ */ jsx2(ColumnChart, { series: lat, hot: lat.map((v) => v > latHotAt), height: chartH, width: rightW, color: "#82AAF0", hotColor: "#ffb454" })
8090
+ /* @__PURE__ */ jsx2(ColumnChart, { series: lat, hot: lat.map((v) => v > latHotAt), height: chartH, width: rightW, color: "white", hotColor: "#ffb454" })
8090
8091
  ] })
8091
8092
  ] }),
8092
8093
  /* @__PURE__ */ jsxs2(Box2, { height: colH, children: [
@@ -8170,9 +8171,9 @@ function LivePanel({ active: active2 }) {
8170
8171
  windowed.map((e, i) => /* @__PURE__ */ jsx2(StreamLine, { e, loc: isLoc(e), selected: clampedScroll + i === selClamped }, e.id))
8171
8172
  ] }),
8172
8173
  /* @__PURE__ */ jsxs2(Text2, { wrap: "truncate", children: [
8173
- /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "#82AAF0", bold: true, children: " LIVE " }),
8174
- /* @__PURE__ */ jsx2(Text2, { backgroundColor: "#0b1530", color: "#4f6db8", children: ` local ${localOn ? "on" : "off"} \xB7 ${localBuf.length} loc/${cloudBuf.length} cld \xB7 top ${topTools.map(([t, c2]) => `${t}\xD7${c2}`).join(" ") || "\u2014"} ` }),
8175
- /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "#82AAF0", children: ` \u2191\u2193 select \xB7 enter full entry \xB7 / search \xB7 space copy \xB7 ? all keys \xB7 esc menu \xB7 q quit ` })
8174
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "white", bold: true, children: " LIVE " }),
8175
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: "#0b1530", color: "white", children: ` local ${localOn ? "on" : "off"} \xB7 ${localBuf.length} loc/${cloudBuf.length} cld \xB7 top ${topTools.map(([t, c2]) => `${t}\xD7${c2}`).join(" ") || "\u2014"} ` }),
8176
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "white", children: ` \u2191\u2193 select \xB7 enter full entry \xB7 / search \xB7 space copy \xB7 ? all keys \xB7 esc menu \xB7 q quit ` })
8176
8177
  ] })
8177
8178
  ] });
8178
8179
  }
@@ -9258,6 +9259,7 @@ function AuditPanel({ active: active2, focused }) {
9258
9259
  /* @__PURE__ */ jsx6(Detail, { label: "agent", value: current.agent ?? "\u2014" }),
9259
9260
  /* @__PURE__ */ jsx6(Detail, { label: "session", value: current.session ?? "\u2014" }),
9260
9261
  /* @__PURE__ */ jsx6(Detail, { label: "dlp", value: current.dlp.length ? current.dlp.join(", ") : "none", color: current.dlp.length ? theme.bad : void 0 }),
9262
+ /* @__PURE__ */ jsx6(Detail, { label: "ratelimit", value: current.burst ? "BURST \u2014 over the limit for this agent" : "no", color: current.burst ? theme.bad : void 0 }),
9261
9263
  /* @__PURE__ */ jsx6(Detail, { label: "when", value: new Date(current.at).toLocaleString() + (current.evalMs != null ? ` \xB7 eval ${current.evalMs}ms` : "") }),
9262
9264
  /* @__PURE__ */ jsx6(Text6, { color: theme.dim, children: `arguments \u2014 full \xB7 ${argLines.length} lines${maxScroll ? ` \xB7 \u25BC${maxScroll - off} more \xB7 \u2191\u2193 scroll` : ""}` }),
9263
9265
  /* @__PURE__ */ jsx6(Box6, { flexDirection: "column", height: argBudget, overflow: "hidden", children: argWin.map((l, i) => /* @__PURE__ */ jsx6(Text6, { wrap: "truncate", children: l || " " }, off + i)) }),
@@ -9372,7 +9374,7 @@ function AuditPanel({ active: active2, focused }) {
9372
9374
  const maxStart = Math.max(0, pageRows.length - listRows);
9373
9375
  const start = Math.min(Math.max(0, selClamped - Math.floor((listRows - 1) / 2)), maxStart);
9374
9376
  const windowed = pageRows.slice(start, start + listRows);
9375
- const reasonW = Math.min(60, Math.max(12, cols - 67));
9377
+ const reasonW = Math.min(58, Math.max(12, cols - 71));
9376
9378
  return /* @__PURE__ */ jsx6(DataView, { loading: logsLoading && !frozen, error: source === "cloud" ? cloudQ.error : localQ.error, children: /* @__PURE__ */ jsxs6(Box6, { flexDirection: "column", children: [
9377
9379
  strip,
9378
9380
  copyBanner,
@@ -9417,7 +9419,7 @@ function AuditPanel({ active: active2, focused }) {
9417
9419
  { header: "TOOL", width: 18 },
9418
9420
  { header: "AGENT", width: 14 },
9419
9421
  { header: "REASON", width: reasonW },
9420
- { header: "DLP", width: 4 },
9422
+ { header: "SIGNAL", width: 8 },
9421
9423
  { header: "WHEN", width: 6 }
9422
9424
  ],
9423
9425
  rows: windowed.map((e, i) => rowFor(e, start + i === selClamped && focused, reasonW))
@@ -9431,13 +9433,14 @@ function AuditPanel({ active: active2, focused }) {
9431
9433
  ] }) });
9432
9434
  }
9433
9435
  function rowFor(e, active2, reasonW) {
9436
+ const sig = [e.dlp.length ? `DLP${e.dlp.length > 1 ? e.dlp.length : ""}` : "", e.burst ? "RL" : ""].filter(Boolean).join(" ");
9434
9437
  return [
9435
9438
  { value: active2 ? "\u25B8" : "", color: theme.accentBright },
9436
9439
  { value: e.decision, color: decisionColor(e.decision) },
9437
9440
  { value: truncate2(e.tool, 18), color: theme.accent },
9438
9441
  { value: truncate2(e.agent ?? "\u2014", 14), dim: true },
9439
9442
  { value: truncate2(e.reason ?? e.args ?? "\u2014", reasonW) },
9440
- { value: e.dlp.length ? String(e.dlp.length) : "0", color: e.dlp.length ? theme.bad : void 0, dim: !e.dlp.length },
9443
+ { value: sig || "\xB7", color: sig ? theme.bad : void 0, dim: !sig },
9441
9444
  { value: ago(e.at), dim: true }
9442
9445
  ];
9443
9446
  }
@@ -9848,7 +9851,7 @@ var init_App = __esm({
9848
9851
  { label: "Audit", Panel: AuditPanel },
9849
9852
  { label: "Settings", Panel: SettingsPanel }
9850
9853
  ];
9851
- BANNER_HEX = ["#1432A0", "#2850BE", "#3C6ED7", "#5A8CE6", "#82AAF0", "#AAC8FA"];
9854
+ BANNER_HEX = ["white", "white", "white", "white", "white", "white"];
9852
9855
  HELP = [
9853
9856
  ["Global", [["\u2191\u2193", "move between sections"], ["\u2192 / enter", "open a section"], ["\u2190 / esc", "back to the menu"], ["?", "this help"], ["q", "quit"]]],
9854
9857
  ["Live", [["\u2191\u2193", "select a stream row"], ["enter", "full entry content"], ["w", "whitelist the selected DENY"], ["b", "block the selected ALLOW"], ["d / x / r", "filter denies / dlp / rate-limit"], ["f", "local / cloud filter"], ["/", "search"], ["s", "sessions (\u2191\u2193 pick, enter open)"], ["space", "copy mode (freeze)"]]],
package/dist/tui/index.js CHANGED
@@ -69,8 +69,8 @@ function loadConfig() {
69
69
  // src/tui/theme.ts
70
70
  var accent = loadConfig().accent;
71
71
  var theme = {
72
- accent: accent || "cyan",
73
- accentBright: accent || "#5a8ce6",
72
+ accent: accent || "white",
73
+ accentBright: accent || "white",
74
74
  ok: "green",
75
75
  warn: "yellow",
76
76
  bad: "red",
@@ -794,7 +794,7 @@ function StreamLine({ e, loc, selected }) {
794
794
  hhmmss(e.at),
795
795
  " "
796
796
  ] }),
797
- /* @__PURE__ */ jsx2(Text2, { color: loc ? theme.ok : "#4f6db8", children: loc ? "LOC" : "CLD" }),
797
+ /* @__PURE__ */ jsx2(Text2, { color: loc ? theme.ok : "white", children: loc ? "LOC" : "CLD" }),
798
798
  /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: "] " }),
799
799
  /* @__PURE__ */ jsx2(Text2, { color: decisionColor(e.decision), bold: e.decision !== "ALLOW", children: e.decision.padEnd(6) }),
800
800
  /* @__PURE__ */ jsx2(Text2, { color: theme.accent, children: truncate(e.tool, 12).padEnd(13) }),
@@ -802,6 +802,7 @@ function StreamLine({ e, loc, selected }) {
802
802
  /* @__PURE__ */ jsx2(Text2, { color: e.evalMs != null && e.evalMs > 500 ? theme.warn : theme.dim, children: (e.evalMs != null ? `${e.evalMs}ms` : "\u2014").padEnd(7) }),
803
803
  /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: truncate(e.agent ?? "-", 11).padEnd(12) }),
804
804
  e.dlp ? /* @__PURE__ */ jsx2(Text2, { color: theme.bad, children: "DLP! " }) : null,
805
+ e.burst ? /* @__PURE__ */ jsx2(Text2, { color: theme.warn, children: "RL! " }) : null,
805
806
  e.rule && e.decision !== "ALLOW" ? /* @__PURE__ */ jsx2(Text2, { color: theme.bad, children: truncate(e.rule, 14) + " " }) : null,
806
807
  /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: e.detail })
807
808
  ] });
@@ -1346,9 +1347,9 @@ function LivePanel({ active: active2 }) {
1346
1347
  ] });
1347
1348
  }
1348
1349
  const titleBar = /* @__PURE__ */ jsxs2(Text2, { wrap: "truncate", children: [
1349
- /* @__PURE__ */ jsx2(Text2, { backgroundColor: "#1432A0", color: "#AAC8FA", bold: true, children: " SOLONGATE LIVE " }),
1350
- /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "#82AAF0", children: ` ${spin} up ${fmtUp(nowMs - startRef.current)} \xB7 ${hhmmss(nowMs)} \xB7 api ${latNow}ms ` }),
1351
- frozen ? /* @__PURE__ */ jsx2(Text2, { backgroundColor: "#123d1f", color: "#7bd88f", bold: true, children: " \u23F5 COPY MODE \u2014 screen frozen, select & copy freely \xB7 space resume " }) : backingOff ? /* @__PURE__ */ jsx2(Text2, { backgroundColor: "#3d2a12", color: "#ffb454", bold: true, children: " RATE LIMITED \xB7 backing off " }) : lastDeny ? /* @__PURE__ */ jsx2(Text2, { backgroundColor: "#3d1220", color: "#ff6b6b", bold: true, children: ` \u26A0 ${hhmmss(lastDeny.at)} ${lastDeny.tool} DENIED ` }) : /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "#4f6db8", children: " \u2713 clean " })
1350
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: "#1432A0", color: "white", bold: true, children: " SOLONGATE LIVE " }),
1351
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "white", children: ` ${spin} up ${fmtUp(nowMs - startRef.current)} \xB7 ${hhmmss(nowMs)} \xB7 api ${latNow}ms ` }),
1352
+ frozen ? /* @__PURE__ */ jsx2(Text2, { backgroundColor: "#123d1f", color: "#7bd88f", bold: true, children: " \u23F5 COPY MODE \u2014 screen frozen, select & copy freely \xB7 space resume " }) : backingOff ? /* @__PURE__ */ jsx2(Text2, { backgroundColor: "#3d2a12", color: "#ffb454", bold: true, children: " RATE LIMITED \xB7 backing off " }) : lastDeny ? /* @__PURE__ */ jsx2(Text2, { backgroundColor: "#3d1220", color: "#ff6b6b", bold: true, children: ` \u26A0 ${hhmmss(lastDeny.at)} ${lastDeny.tool} DENIED ` }) : /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "white", children: " \u2713 clean " })
1352
1353
  ] });
1353
1354
  if (showHelp) {
1354
1355
  return /* @__PURE__ */ jsxs2(Box2, { flexDirection: "column", paddingX: 1, children: [
@@ -1375,10 +1376,10 @@ function LivePanel({ active: active2 }) {
1375
1376
  return /* @__PURE__ */ jsxs2(Box2, { flexDirection: "column", paddingX: 1, children: [
1376
1377
  titleBar,
1377
1378
  /* @__PURE__ */ jsxs2(Text2, { wrap: "truncate", children: [
1378
- /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "#AAC8FA", bold: true, children: " ENTRY " }),
1379
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "white", bold: true, children: " ENTRY " }),
1379
1380
  /* @__PURE__ */ jsx2(Text2, { color: decisionColor(e.decision), bold: true, children: " " + e.decision }),
1380
1381
  /* @__PURE__ */ jsx2(Text2, { color: theme.accent, bold: true, children: " " + e.tool }),
1381
- /* @__PURE__ */ jsx2(Text2, { color: isLoc(e) ? theme.ok : "#4f6db8", children: " " + (isLoc(e) ? "LOC" : "CLD") }),
1382
+ /* @__PURE__ */ jsx2(Text2, { color: isLoc(e) ? theme.ok : "white", children: " " + (isLoc(e) ? "LOC" : "CLD") }),
1382
1383
  e.dlp ? /* @__PURE__ */ jsx2(Text2, { color: theme.bad, children: " DLP!" }) : null,
1383
1384
  e.burst ? /* @__PURE__ */ jsx2(Text2, { color: theme.warn, children: " BURST" }) : null,
1384
1385
  /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: " \u2190 back" })
@@ -1404,9 +1405,9 @@ function LivePanel({ active: active2 }) {
1404
1405
  /* @__PURE__ */ jsx2(PaneTitle, { label: "FULL CONTENT", extra: `${lines.length} lines${maxScroll2 ? ` \xB7 \u25BC${maxScroll2 - off} more \xB7 \u2191\u2193 scroll` : ""} \xB7 space copy \xB7 \u2190 back`, width: innerW }),
1405
1406
  /* @__PURE__ */ jsx2(Box2, { flexDirection: "column", height: bodyRows, overflow: "hidden", children: win.map((l, i) => /* @__PURE__ */ jsx2(Text2, { wrap: "truncate", children: l || " " }, off + i)) }),
1406
1407
  /* @__PURE__ */ jsxs2(Text2, { wrap: "truncate", children: [
1407
- /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "#82AAF0", bold: true, children: " ENTRY " }),
1408
- /* @__PURE__ */ jsx2(Text2, { backgroundColor: "#0b1530", color: "#4f6db8", children: ` ${e.id} ` }),
1409
- /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "#82AAF0", children: " \u2191\u2193 scroll \xB7 space copy \xB7 ? all keys \xB7 \u2190 back \xB7 esc menu " })
1408
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "white", bold: true, children: " ENTRY " }),
1409
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: "#0b1530", color: "white", children: ` ${e.id} ` }),
1410
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "white", children: " \u2191\u2193 scroll \xB7 space copy \xB7 ? all keys \xB7 \u2190 back \xB7 esc menu " })
1410
1411
  ] })
1411
1412
  ] });
1412
1413
  }
@@ -1436,12 +1437,12 @@ function LivePanel({ active: active2 }) {
1436
1437
  return /* @__PURE__ */ jsxs2(Box2, { flexDirection: "column", paddingX: 1, children: [
1437
1438
  titleBar,
1438
1439
  /* @__PURE__ */ jsxs2(Text2, { wrap: "truncate", children: [
1439
- /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "#AAC8FA", bold: true, children: ` SESSION ${detail.id.slice(0, 8)} ` }),
1440
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "white", bold: true, children: ` SESSION ${detail.id.slice(0, 8)} ` }),
1440
1441
  (() => {
1441
1442
  const st = STATUS_STYLE[sessStatus(detail.lastAt, nowMs)];
1442
1443
  return /* @__PURE__ */ jsx2(Text2, { color: st.color, bold: true, children: ` ${st.dot} ${st.label}` });
1443
1444
  })(),
1444
- /* @__PURE__ */ jsx2(Text2, { color: detail.source === "local" ? theme.ok : "#4f6db8", children: " " + detail.source.toUpperCase() }),
1445
+ /* @__PURE__ */ jsx2(Text2, { color: detail.source === "local" ? theme.ok : "white", children: " " + detail.source.toUpperCase() }),
1445
1446
  /* @__PURE__ */ jsx2(Text2, { bold: true, children: " " + truncate(detail.isMe ? detail.agent + " (this machine)" : detail.agent, 34) }),
1446
1447
  detail.trust != null ? /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: ` trust ${detail.trust}/100` }) : null,
1447
1448
  /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: " \u2190 back" })
@@ -1477,9 +1478,9 @@ function LivePanel({ active: active2 }) {
1477
1478
  tl.map((e, i) => /* @__PURE__ */ jsx2(StreamLine, { e, loc: isLoc(e), selected: start + i === dSel }, e.id))
1478
1479
  ] }),
1479
1480
  /* @__PURE__ */ jsxs2(Text2, { wrap: "truncate", children: [
1480
- /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "#82AAF0", bold: true, children: " SESSION " }),
1481
- /* @__PURE__ */ jsx2(Text2, { backgroundColor: "#0b1530", color: "#4f6db8", children: ` ${detail.id} ` }),
1482
- /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "#82AAF0", children: " \u2191\u2193 select \xB7 enter full entry \xB7 ? all keys \xB7 \u2190 back \xB7 esc menu " })
1481
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "white", bold: true, children: " SESSION " }),
1482
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: "#0b1530", color: "white", children: ` ${detail.id} ` }),
1483
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "white", children: " \u2191\u2193 select \xB7 enter full entry \xB7 ? all keys \xB7 \u2190 back \xB7 esc menu " })
1483
1484
  ] })
1484
1485
  ] });
1485
1486
  }
@@ -1525,7 +1526,7 @@ function LivePanel({ active: active2 }) {
1525
1526
  ] }),
1526
1527
  /* @__PURE__ */ jsxs2(Box2, { flexDirection: "column", width: rightW, children: [
1527
1528
  /* @__PURE__ */ jsx2(PaneTitle, { label: "API LATENCY", extra: `now ${latNow}ms \xB7 med ${latMed}ms \xB7 amber >${Math.round(latHotAt)}ms`, width: rightW }),
1528
- /* @__PURE__ */ jsx2(ColumnChart, { series: lat, hot: lat.map((v) => v > latHotAt), height: chartH, width: rightW, color: "#82AAF0", hotColor: "#ffb454" })
1529
+ /* @__PURE__ */ jsx2(ColumnChart, { series: lat, hot: lat.map((v) => v > latHotAt), height: chartH, width: rightW, color: "white", hotColor: "#ffb454" })
1529
1530
  ] })
1530
1531
  ] }),
1531
1532
  /* @__PURE__ */ jsxs2(Box2, { height: colH, children: [
@@ -1609,9 +1610,9 @@ function LivePanel({ active: active2 }) {
1609
1610
  windowed.map((e, i) => /* @__PURE__ */ jsx2(StreamLine, { e, loc: isLoc(e), selected: clampedScroll + i === selClamped }, e.id))
1610
1611
  ] }),
1611
1612
  /* @__PURE__ */ jsxs2(Text2, { wrap: "truncate", children: [
1612
- /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "#82AAF0", bold: true, children: " LIVE " }),
1613
- /* @__PURE__ */ jsx2(Text2, { backgroundColor: "#0b1530", color: "#4f6db8", children: ` local ${localOn ? "on" : "off"} \xB7 ${localBuf.length} loc/${cloudBuf.length} cld \xB7 top ${topTools.map(([t, c2]) => `${t}\xD7${c2}`).join(" ") || "\u2014"} ` }),
1614
- /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "#82AAF0", children: ` \u2191\u2193 select \xB7 enter full entry \xB7 / search \xB7 space copy \xB7 ? all keys \xB7 esc menu \xB7 q quit ` })
1613
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "white", bold: true, children: " LIVE " }),
1614
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: "#0b1530", color: "white", children: ` local ${localOn ? "on" : "off"} \xB7 ${localBuf.length} loc/${cloudBuf.length} cld \xB7 top ${topTools.map(([t, c2]) => `${t}\xD7${c2}`).join(" ") || "\u2014"} ` }),
1615
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "white", children: ` \u2191\u2193 select \xB7 enter full entry \xB7 / search \xB7 space copy \xB7 ? all keys \xB7 esc menu \xB7 q quit ` })
1615
1616
  ] })
1616
1617
  ] });
1617
1618
  }
@@ -2665,6 +2666,7 @@ function AuditPanel({ active: active2, focused }) {
2665
2666
  /* @__PURE__ */ jsx6(Detail, { label: "agent", value: current.agent ?? "\u2014" }),
2666
2667
  /* @__PURE__ */ jsx6(Detail, { label: "session", value: current.session ?? "\u2014" }),
2667
2668
  /* @__PURE__ */ jsx6(Detail, { label: "dlp", value: current.dlp.length ? current.dlp.join(", ") : "none", color: current.dlp.length ? theme.bad : void 0 }),
2669
+ /* @__PURE__ */ jsx6(Detail, { label: "ratelimit", value: current.burst ? "BURST \u2014 over the limit for this agent" : "no", color: current.burst ? theme.bad : void 0 }),
2668
2670
  /* @__PURE__ */ jsx6(Detail, { label: "when", value: new Date(current.at).toLocaleString() + (current.evalMs != null ? ` \xB7 eval ${current.evalMs}ms` : "") }),
2669
2671
  /* @__PURE__ */ jsx6(Text6, { color: theme.dim, children: `arguments \u2014 full \xB7 ${argLines.length} lines${maxScroll ? ` \xB7 \u25BC${maxScroll - off} more \xB7 \u2191\u2193 scroll` : ""}` }),
2670
2672
  /* @__PURE__ */ jsx6(Box6, { flexDirection: "column", height: argBudget, overflow: "hidden", children: argWin.map((l, i) => /* @__PURE__ */ jsx6(Text6, { wrap: "truncate", children: l || " " }, off + i)) }),
@@ -2779,7 +2781,7 @@ function AuditPanel({ active: active2, focused }) {
2779
2781
  const maxStart = Math.max(0, pageRows.length - listRows);
2780
2782
  const start = Math.min(Math.max(0, selClamped - Math.floor((listRows - 1) / 2)), maxStart);
2781
2783
  const windowed = pageRows.slice(start, start + listRows);
2782
- const reasonW = Math.min(60, Math.max(12, cols - 67));
2784
+ const reasonW = Math.min(58, Math.max(12, cols - 71));
2783
2785
  return /* @__PURE__ */ jsx6(DataView, { loading: logsLoading && !frozen, error: source === "cloud" ? cloudQ.error : localQ.error, children: /* @__PURE__ */ jsxs6(Box6, { flexDirection: "column", children: [
2784
2786
  strip,
2785
2787
  copyBanner,
@@ -2824,7 +2826,7 @@ function AuditPanel({ active: active2, focused }) {
2824
2826
  { header: "TOOL", width: 18 },
2825
2827
  { header: "AGENT", width: 14 },
2826
2828
  { header: "REASON", width: reasonW },
2827
- { header: "DLP", width: 4 },
2829
+ { header: "SIGNAL", width: 8 },
2828
2830
  { header: "WHEN", width: 6 }
2829
2831
  ],
2830
2832
  rows: windowed.map((e, i) => rowFor(e, start + i === selClamped && focused, reasonW))
@@ -2838,13 +2840,14 @@ function AuditPanel({ active: active2, focused }) {
2838
2840
  ] }) });
2839
2841
  }
2840
2842
  function rowFor(e, active2, reasonW) {
2843
+ const sig = [e.dlp.length ? `DLP${e.dlp.length > 1 ? e.dlp.length : ""}` : "", e.burst ? "RL" : ""].filter(Boolean).join(" ");
2841
2844
  return [
2842
2845
  { value: active2 ? "\u25B8" : "", color: theme.accentBright },
2843
2846
  { value: e.decision, color: decisionColor(e.decision) },
2844
2847
  { value: truncate(e.tool, 18), color: theme.accent },
2845
2848
  { value: truncate(e.agent ?? "\u2014", 14), dim: true },
2846
2849
  { value: truncate(e.reason ?? e.args ?? "\u2014", reasonW) },
2847
- { value: e.dlp.length ? String(e.dlp.length) : "0", color: e.dlp.length ? theme.bad : void 0, dim: !e.dlp.length },
2850
+ { value: sig || "\xB7", color: sig ? theme.bad : void 0, dim: !sig },
2848
2851
  { value: ago(e.at), dim: true }
2849
2852
  ];
2850
2853
  }
@@ -3082,7 +3085,7 @@ var SECTIONS = [
3082
3085
  { label: "Audit", Panel: AuditPanel },
3083
3086
  { label: "Settings", Panel: SettingsPanel }
3084
3087
  ];
3085
- var BANNER_HEX = ["#1432A0", "#2850BE", "#3C6ED7", "#5A8CE6", "#82AAF0", "#AAC8FA"];
3088
+ var BANNER_HEX = ["white", "white", "white", "white", "white", "white"];
3086
3089
  function Banner({ cols }) {
3087
3090
  const wide = cols >= 82;
3088
3091
  if (!wide) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solongate/proxy",
3
- "version": "0.81.34",
3
+ "version": "0.81.36",
4
4
  "description": "AI tool security proxy: protect any AI tool server with customizable policies, path/command constraints, rate limiting, and audit logging. No code changes required.",
5
5
  "type": "module",
6
6
  "bin": {