@solongate/proxy 0.81.44 → 0.81.45

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
@@ -7534,6 +7534,7 @@ function LivePanel({ active: active2 }) {
7534
7534
  const [detailScroll, setDetailScroll] = useState2(0);
7535
7535
  const [inspect, setInspect] = useState2(null);
7536
7536
  const [inspectScroll, setInspectScroll] = useState2(0);
7537
+ const [layersScroll, setLayersScroll] = useState2(0);
7537
7538
  const inspectFromRef = useRef2("stream");
7538
7539
  const seenRef = useRef2(/* @__PURE__ */ new Set());
7539
7540
  const lastLocalTs = useRef2(0);
@@ -7933,6 +7934,14 @@ function LivePanel({ active: active2 }) {
7933
7934
  else if (key.pageDown) setInspectScroll((n) => n + 10);
7934
7935
  return;
7935
7936
  }
7937
+ if (mode === "layers") {
7938
+ if (key.leftArrow || input === "l") setMode("stream");
7939
+ else if (key.upArrow) setLayersScroll((n) => Math.max(0, n - 1));
7940
+ else if (key.downArrow) setLayersScroll((n) => n + 1);
7941
+ else if (key.pageUp) setLayersScroll((n) => Math.max(0, n - 10));
7942
+ else if (key.pageDown) setLayersScroll((n) => n + 10);
7943
+ return;
7944
+ }
7936
7945
  if (mode === "detail") {
7937
7946
  const maxD = Math.max(0, detailEntries.length - 1);
7938
7947
  if (key.leftArrow) {
@@ -7982,6 +7991,9 @@ function LivePanel({ active: active2 }) {
7982
7991
  } else if (input === "s") {
7983
7992
  setPickIdx(0);
7984
7993
  setMode("pick");
7994
+ } else if (input === "l") {
7995
+ setLayersScroll(0);
7996
+ setMode("layers");
7985
7997
  } else if (input === "w") void doAction("whitelist");
7986
7998
  else if (input === "b") void doAction("block");
7987
7999
  else if (input === "d") toggleSignal("deny");
@@ -8101,6 +8113,87 @@ function LivePanel({ active: active2 }) {
8101
8113
  ] })
8102
8114
  ] });
8103
8115
  }
8116
+ if (mode === "layers") {
8117
+ const modeColor4 = (m) => m === "block" || m === "on" ? theme.ok : m === "detect" ? theme.warn : theme.dim;
8118
+ const barW = Math.max(10, Math.min(40, innerW - 30));
8119
+ const burstsInBuf = mergedAll.filter((e) => e.burst).length;
8120
+ const dlpInBuf = mergedAll.filter((e) => e.dlp).length;
8121
+ const allHits = ins.dlpByPattern ?? [];
8122
+ const maxHit = allHits[0]?.count ?? 1;
8123
+ const L = [];
8124
+ const push2 = (el) => L.push(/* @__PURE__ */ jsx2(Box2, { children: el }, L.length));
8125
+ const blank = () => push2(/* @__PURE__ */ jsx2(Text2, { children: " " }));
8126
+ const section = (label, m, note) => push2(
8127
+ /* @__PURE__ */ jsxs2(Text2, { wrap: "truncate", children: [
8128
+ /* @__PURE__ */ jsxs2(Text2, { bold: true, color: theme.accentBright, children: [
8129
+ "\u258E",
8130
+ label.padEnd(10)
8131
+ ] }),
8132
+ /* @__PURE__ */ jsx2(Text2, { bold: true, color: modeColor4(m), children: (m ?? "?").padEnd(8) }),
8133
+ note ? /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: note }) : null
8134
+ ] })
8135
+ );
8136
+ const kv = (k, v) => push2(
8137
+ /* @__PURE__ */ jsxs2(Text2, { wrap: "truncate", children: [
8138
+ /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: (" " + k).padEnd(16) }),
8139
+ v
8140
+ ] })
8141
+ );
8142
+ section("RATELIMIT", rl?.mode, rl?.mode === "block" ? "over-limit calls are DENIED" : rl?.mode === "detect" ? "over-limit calls are observed & flagged rl:yes" : "no limit enforcement");
8143
+ kv("limits", /* @__PURE__ */ jsx2(Text2, { children: rl?.perMinute || rl?.perHour || rl?.perDay ? `${rl?.perMinute || "\u2014"}/min \xB7 ${rl?.perHour || "\u2014"}/hour \xB7 ${rl?.perDay || "\u2014"}/day` : "none configured" }));
8144
+ kv("load now", /* @__PURE__ */ jsx2(Text2, { children: `${minuteNow} calls in the last 60s` }));
8145
+ if (rl?.perMinute) push2(/* @__PURE__ */ jsx2(HBar, { label: " load/min", value: minuteNow, max: rl.perMinute, width: barW, color: minuteNow > rl.perMinute ? theme.bad : theme.accent }));
8146
+ kv("bursts", /* @__PURE__ */ jsx2(Text2, { color: burstsInBuf ? theme.warn : theme.dim, children: `${burstsInBuf} flagged in the live buffer` }));
8147
+ blank();
8148
+ section("DLP", dl?.mode, dl?.mode === "block" ? "secrets in arguments are DENIED + redacted" : dl?.mode === "detect" ? "secrets observed & flagged dlp:yes, output redacted" : "no secret scanning");
8149
+ kv("hits", /* @__PURE__ */ jsx2(Text2, { color: dlpInBuf ? theme.bad : theme.dim, children: `${dlpInBuf} flagged in the live buffer` }));
8150
+ const builtin = dl?.patterns ?? [];
8151
+ kv("builtin", /* @__PURE__ */ jsx2(Text2, { children: builtin.length ? `${builtin.length} patterns enabled` : "none enabled" }));
8152
+ for (const line of wrapLines(builtin.join(" \xB7 "), Math.max(20, innerW - 18))) push2(/* @__PURE__ */ jsx2(Text2, { wrap: "truncate", color: theme.dim, children: " " + line }));
8153
+ const custom = dl?.custom ?? [];
8154
+ kv("custom", /* @__PURE__ */ jsx2(Text2, { children: custom.length ? `${custom.length} patterns` : "none" }));
8155
+ for (const c2 of custom)
8156
+ push2(
8157
+ /* @__PURE__ */ jsxs2(Text2, { wrap: "truncate", children: [
8158
+ /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: " " }),
8159
+ /* @__PURE__ */ jsx2(Text2, { color: theme.accent, children: truncate2(c2.name ?? "custom", 24).padEnd(25) }),
8160
+ /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: truncate2(c2.re ?? "", Math.max(10, innerW - 44)) })
8161
+ ] })
8162
+ );
8163
+ kv("pattern hits", /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: allHits.length ? "last 7 days" : "none in the last 7 days" }));
8164
+ for (const h of allHits) push2(/* @__PURE__ */ jsx2(HBar, { label: " " + truncate2(h.pattern, 10), value: h.count, max: maxHit, width: barW, color: theme.bad }));
8165
+ blank();
8166
+ section("GHOST", gh?.mode, gh?.mode === "on" ? "matching paths are hidden from agents" : "no hidden paths");
8167
+ const ghostPats = gh?.patterns ?? [];
8168
+ kv("patterns", /* @__PURE__ */ jsx2(Text2, { children: ghostPats.length ? `${ghostPats.length}` : "none" }));
8169
+ for (const line of wrapLines(ghostPats.join(" \xB7 "), Math.max(20, innerW - 18))) push2(/* @__PURE__ */ jsx2(Text2, { wrap: "truncate", color: theme.dim, children: " " + line }));
8170
+ blank();
8171
+ section("GUARD", guard.data ? guard.data.up_to_date ? "ok" : "stale" : "?", "the PreToolUse hook enforcing all of the above");
8172
+ kv(
8173
+ "hooks",
8174
+ guard.data ? /* @__PURE__ */ jsx2(Text2, { color: guard.data.up_to_date ? theme.ok : theme.warn, children: `v${guard.data.installed ?? "?"}${guard.data.up_to_date ? " (latest)" : ` \u2192 v${guard.data.latest} available`} \xB7 ${guard.data.device_count} device${guard.data.device_count === 1 ? "" : "s"}` }) : /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: "loading\u2026" })
8175
+ );
8176
+ kv("local eval", ring ? /* @__PURE__ */ jsx2(Text2, { color: theme.ok, children: `avg ${ring.avgMs}ms over ${ring.count} recent calls` }) : /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: "no local ring in cwd" }));
8177
+ const bodyRows = Math.max(4, rows - 5);
8178
+ const maxLScroll = Math.max(0, L.length - bodyRows);
8179
+ const lOff = Math.min(layersScroll, maxLScroll);
8180
+ const win = L.slice(lOff, lOff + bodyRows);
8181
+ return /* @__PURE__ */ jsxs2(Box2, { flexDirection: "column", paddingX: 1, children: [
8182
+ titleBar,
8183
+ /* @__PURE__ */ jsxs2(Text2, { wrap: "truncate", children: [
8184
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "white", bold: true, children: " LAYERS " }),
8185
+ /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: " security layers, limits and patterns \xB7 insights window: last 7 days" }),
8186
+ /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: " \u2190 back" })
8187
+ ] }),
8188
+ /* @__PURE__ */ jsx2(PaneTitle, { label: "LAYERS", extra: `${insights.data ? "" : spin + " loading \xB7 "}${maxLScroll ? `\u25BC${maxLScroll - lOff} more \xB7 \u2191\u2193 scroll \xB7 ` : ""}l or \u2190 back`, width: innerW }),
8189
+ /* @__PURE__ */ jsx2(Box2, { flexDirection: "column", height: bodyRows, overflow: "hidden", children: win }),
8190
+ /* @__PURE__ */ jsxs2(Text2, { wrap: "truncate", children: [
8191
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "white", bold: true, children: " LAYERS " }),
8192
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: "#0b1530", color: "white", children: " rate limit \xB7 dlp \xB7 ghost \xB7 guard " }),
8193
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "white", children: " \u2191\u2193 scroll \xB7 ? all keys \xB7 \u2190 back \xB7 esc menu " })
8194
+ ] })
8195
+ ] });
8196
+ }
8104
8197
  if (mode === "detail" && detail) {
8105
8198
  const d = detailEntries;
8106
8199
  const allow = d.filter((e) => e.decision === "ALLOW").length;
@@ -8220,7 +8313,7 @@ function LivePanel({ active: active2 }) {
8220
8313
  ] }),
8221
8314
  /* @__PURE__ */ jsxs2(Box2, { height: colH, children: [
8222
8315
  /* @__PURE__ */ jsxs2(Box2, { flexDirection: "column", width: colW, marginRight: 2, overflow: "hidden", children: [
8223
- /* @__PURE__ */ jsx2(PaneTitle, { label: "LAYERS", width: colW }),
8316
+ /* @__PURE__ */ jsx2(PaneTitle, { label: "LAYERS", extra: "l = inspect", width: colW }),
8224
8317
  /* @__PURE__ */ jsxs2(Text2, { wrap: "truncate", children: [
8225
8318
  /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: "RATELIMIT ".padEnd(10) }),
8226
8319
  /* @__PURE__ */ jsx2(Text2, { color: rl?.mode === "block" ? theme.ok : rl?.mode === "detect" ? theme.warn : theme.dim, children: (rl?.mode ?? "?").padEnd(7) }),
@@ -8253,7 +8346,8 @@ function LivePanel({ active: active2 }) {
8253
8346
  " "
8254
8347
  ] }),
8255
8348
  /* @__PURE__ */ jsx2(Text2, { color: st.color, children: st.label.padEnd(7) }),
8256
- /* @__PURE__ */ jsx2(Text2, { color: theme.accentBright, children: truncate2(r.isMe ? "this machine" : r.agent, 12).padEnd(13) }),
8349
+ /* @__PURE__ */ jsx2(Text2, { color: theme.accentBright, children: truncate2(r.agent, r.isMe ? 9 : 12).padEnd(r.isMe ? 10 : 13) }),
8350
+ r.isMe ? /* @__PURE__ */ jsx2(Text2, { color: theme.ok, children: "me " }) : null,
8257
8351
  /* @__PURE__ */ jsxs2(Text2, { children: [
8258
8352
  String(r.calls).padStart(4),
8259
8353
  "c "
@@ -8348,6 +8442,7 @@ var init_Live = __esm({
8348
8442
  ["f", "source filter: all \u2192 local \u2192 cloud"],
8349
8443
  ["/", "live search (tool, agent, command\u2026) \xB7 enter done"],
8350
8444
  ["s", "session picker"],
8445
+ ["l", "layers detail (rate limit \xB7 dlp \xB7 ghost \xB7 guard)"],
8351
8446
  ["e", "export visible rows \u2192 ~/.solongate/live-export.jsonl"],
8352
8447
  ["space", "copy mode: freeze screen for mouse selection"],
8353
8448
  ["esc", "back to menu"],
package/dist/tui/index.js CHANGED
@@ -920,6 +920,7 @@ var LIVE_HELP = [
920
920
  ["f", "source filter: all \u2192 local \u2192 cloud"],
921
921
  ["/", "live search (tool, agent, command\u2026) \xB7 enter done"],
922
922
  ["s", "session picker"],
923
+ ["l", "layers detail (rate limit \xB7 dlp \xB7 ghost \xB7 guard)"],
923
924
  ["e", "export visible rows \u2192 ~/.solongate/live-export.jsonl"],
924
925
  ["space", "copy mode: freeze screen for mouse selection"],
925
926
  ["esc", "back to menu"],
@@ -970,6 +971,7 @@ function LivePanel({ active: active2 }) {
970
971
  const [detailScroll, setDetailScroll] = useState2(0);
971
972
  const [inspect, setInspect] = useState2(null);
972
973
  const [inspectScroll, setInspectScroll] = useState2(0);
974
+ const [layersScroll, setLayersScroll] = useState2(0);
973
975
  const inspectFromRef = useRef2("stream");
974
976
  const seenRef = useRef2(/* @__PURE__ */ new Set());
975
977
  const lastLocalTs = useRef2(0);
@@ -1369,6 +1371,14 @@ function LivePanel({ active: active2 }) {
1369
1371
  else if (key.pageDown) setInspectScroll((n) => n + 10);
1370
1372
  return;
1371
1373
  }
1374
+ if (mode === "layers") {
1375
+ if (key.leftArrow || input === "l") setMode("stream");
1376
+ else if (key.upArrow) setLayersScroll((n) => Math.max(0, n - 1));
1377
+ else if (key.downArrow) setLayersScroll((n) => n + 1);
1378
+ else if (key.pageUp) setLayersScroll((n) => Math.max(0, n - 10));
1379
+ else if (key.pageDown) setLayersScroll((n) => n + 10);
1380
+ return;
1381
+ }
1372
1382
  if (mode === "detail") {
1373
1383
  const maxD = Math.max(0, detailEntries.length - 1);
1374
1384
  if (key.leftArrow) {
@@ -1418,6 +1428,9 @@ function LivePanel({ active: active2 }) {
1418
1428
  } else if (input === "s") {
1419
1429
  setPickIdx(0);
1420
1430
  setMode("pick");
1431
+ } else if (input === "l") {
1432
+ setLayersScroll(0);
1433
+ setMode("layers");
1421
1434
  } else if (input === "w") void doAction("whitelist");
1422
1435
  else if (input === "b") void doAction("block");
1423
1436
  else if (input === "d") toggleSignal("deny");
@@ -1537,6 +1550,87 @@ function LivePanel({ active: active2 }) {
1537
1550
  ] })
1538
1551
  ] });
1539
1552
  }
1553
+ if (mode === "layers") {
1554
+ const modeColor2 = (m) => m === "block" || m === "on" ? theme.ok : m === "detect" ? theme.warn : theme.dim;
1555
+ const barW = Math.max(10, Math.min(40, innerW - 30));
1556
+ const burstsInBuf = mergedAll.filter((e) => e.burst).length;
1557
+ const dlpInBuf = mergedAll.filter((e) => e.dlp).length;
1558
+ const allHits = ins.dlpByPattern ?? [];
1559
+ const maxHit = allHits[0]?.count ?? 1;
1560
+ const L = [];
1561
+ const push = (el) => L.push(/* @__PURE__ */ jsx2(Box2, { children: el }, L.length));
1562
+ const blank = () => push(/* @__PURE__ */ jsx2(Text2, { children: " " }));
1563
+ const section = (label, m, note) => push(
1564
+ /* @__PURE__ */ jsxs2(Text2, { wrap: "truncate", children: [
1565
+ /* @__PURE__ */ jsxs2(Text2, { bold: true, color: theme.accentBright, children: [
1566
+ "\u258E",
1567
+ label.padEnd(10)
1568
+ ] }),
1569
+ /* @__PURE__ */ jsx2(Text2, { bold: true, color: modeColor2(m), children: (m ?? "?").padEnd(8) }),
1570
+ note ? /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: note }) : null
1571
+ ] })
1572
+ );
1573
+ const kv = (k, v) => push(
1574
+ /* @__PURE__ */ jsxs2(Text2, { wrap: "truncate", children: [
1575
+ /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: (" " + k).padEnd(16) }),
1576
+ v
1577
+ ] })
1578
+ );
1579
+ section("RATELIMIT", rl?.mode, rl?.mode === "block" ? "over-limit calls are DENIED" : rl?.mode === "detect" ? "over-limit calls are observed & flagged rl:yes" : "no limit enforcement");
1580
+ kv("limits", /* @__PURE__ */ jsx2(Text2, { children: rl?.perMinute || rl?.perHour || rl?.perDay ? `${rl?.perMinute || "\u2014"}/min \xB7 ${rl?.perHour || "\u2014"}/hour \xB7 ${rl?.perDay || "\u2014"}/day` : "none configured" }));
1581
+ kv("load now", /* @__PURE__ */ jsx2(Text2, { children: `${minuteNow} calls in the last 60s` }));
1582
+ if (rl?.perMinute) push(/* @__PURE__ */ jsx2(HBar, { label: " load/min", value: minuteNow, max: rl.perMinute, width: barW, color: minuteNow > rl.perMinute ? theme.bad : theme.accent }));
1583
+ kv("bursts", /* @__PURE__ */ jsx2(Text2, { color: burstsInBuf ? theme.warn : theme.dim, children: `${burstsInBuf} flagged in the live buffer` }));
1584
+ blank();
1585
+ section("DLP", dl?.mode, dl?.mode === "block" ? "secrets in arguments are DENIED + redacted" : dl?.mode === "detect" ? "secrets observed & flagged dlp:yes, output redacted" : "no secret scanning");
1586
+ kv("hits", /* @__PURE__ */ jsx2(Text2, { color: dlpInBuf ? theme.bad : theme.dim, children: `${dlpInBuf} flagged in the live buffer` }));
1587
+ const builtin = dl?.patterns ?? [];
1588
+ kv("builtin", /* @__PURE__ */ jsx2(Text2, { children: builtin.length ? `${builtin.length} patterns enabled` : "none enabled" }));
1589
+ for (const line of wrapLines(builtin.join(" \xB7 "), Math.max(20, innerW - 18))) push(/* @__PURE__ */ jsx2(Text2, { wrap: "truncate", color: theme.dim, children: " " + line }));
1590
+ const custom = dl?.custom ?? [];
1591
+ kv("custom", /* @__PURE__ */ jsx2(Text2, { children: custom.length ? `${custom.length} patterns` : "none" }));
1592
+ for (const c2 of custom)
1593
+ push(
1594
+ /* @__PURE__ */ jsxs2(Text2, { wrap: "truncate", children: [
1595
+ /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: " " }),
1596
+ /* @__PURE__ */ jsx2(Text2, { color: theme.accent, children: truncate(c2.name ?? "custom", 24).padEnd(25) }),
1597
+ /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: truncate(c2.re ?? "", Math.max(10, innerW - 44)) })
1598
+ ] })
1599
+ );
1600
+ kv("pattern hits", /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: allHits.length ? "last 7 days" : "none in the last 7 days" }));
1601
+ for (const h of allHits) push(/* @__PURE__ */ jsx2(HBar, { label: " " + truncate(h.pattern, 10), value: h.count, max: maxHit, width: barW, color: theme.bad }));
1602
+ blank();
1603
+ section("GHOST", gh?.mode, gh?.mode === "on" ? "matching paths are hidden from agents" : "no hidden paths");
1604
+ const ghostPats = gh?.patterns ?? [];
1605
+ kv("patterns", /* @__PURE__ */ jsx2(Text2, { children: ghostPats.length ? `${ghostPats.length}` : "none" }));
1606
+ for (const line of wrapLines(ghostPats.join(" \xB7 "), Math.max(20, innerW - 18))) push(/* @__PURE__ */ jsx2(Text2, { wrap: "truncate", color: theme.dim, children: " " + line }));
1607
+ blank();
1608
+ section("GUARD", guard.data ? guard.data.up_to_date ? "ok" : "stale" : "?", "the PreToolUse hook enforcing all of the above");
1609
+ kv(
1610
+ "hooks",
1611
+ guard.data ? /* @__PURE__ */ jsx2(Text2, { color: guard.data.up_to_date ? theme.ok : theme.warn, children: `v${guard.data.installed ?? "?"}${guard.data.up_to_date ? " (latest)" : ` \u2192 v${guard.data.latest} available`} \xB7 ${guard.data.device_count} device${guard.data.device_count === 1 ? "" : "s"}` }) : /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: "loading\u2026" })
1612
+ );
1613
+ kv("local eval", ring ? /* @__PURE__ */ jsx2(Text2, { color: theme.ok, children: `avg ${ring.avgMs}ms over ${ring.count} recent calls` }) : /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: "no local ring in cwd" }));
1614
+ const bodyRows = Math.max(4, rows - 5);
1615
+ const maxLScroll = Math.max(0, L.length - bodyRows);
1616
+ const lOff = Math.min(layersScroll, maxLScroll);
1617
+ const win = L.slice(lOff, lOff + bodyRows);
1618
+ return /* @__PURE__ */ jsxs2(Box2, { flexDirection: "column", paddingX: 1, children: [
1619
+ titleBar,
1620
+ /* @__PURE__ */ jsxs2(Text2, { wrap: "truncate", children: [
1621
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "white", bold: true, children: " LAYERS " }),
1622
+ /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: " security layers, limits and patterns \xB7 insights window: last 7 days" }),
1623
+ /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: " \u2190 back" })
1624
+ ] }),
1625
+ /* @__PURE__ */ jsx2(PaneTitle, { label: "LAYERS", extra: `${insights.data ? "" : spin + " loading \xB7 "}${maxLScroll ? `\u25BC${maxLScroll - lOff} more \xB7 \u2191\u2193 scroll \xB7 ` : ""}l or \u2190 back`, width: innerW }),
1626
+ /* @__PURE__ */ jsx2(Box2, { flexDirection: "column", height: bodyRows, overflow: "hidden", children: win }),
1627
+ /* @__PURE__ */ jsxs2(Text2, { wrap: "truncate", children: [
1628
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "white", bold: true, children: " LAYERS " }),
1629
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: "#0b1530", color: "white", children: " rate limit \xB7 dlp \xB7 ghost \xB7 guard " }),
1630
+ /* @__PURE__ */ jsx2(Text2, { backgroundColor: BG, color: "white", children: " \u2191\u2193 scroll \xB7 ? all keys \xB7 \u2190 back \xB7 esc menu " })
1631
+ ] })
1632
+ ] });
1633
+ }
1540
1634
  if (mode === "detail" && detail) {
1541
1635
  const d = detailEntries;
1542
1636
  const allow = d.filter((e) => e.decision === "ALLOW").length;
@@ -1656,7 +1750,7 @@ function LivePanel({ active: active2 }) {
1656
1750
  ] }),
1657
1751
  /* @__PURE__ */ jsxs2(Box2, { height: colH, children: [
1658
1752
  /* @__PURE__ */ jsxs2(Box2, { flexDirection: "column", width: colW, marginRight: 2, overflow: "hidden", children: [
1659
- /* @__PURE__ */ jsx2(PaneTitle, { label: "LAYERS", width: colW }),
1753
+ /* @__PURE__ */ jsx2(PaneTitle, { label: "LAYERS", extra: "l = inspect", width: colW }),
1660
1754
  /* @__PURE__ */ jsxs2(Text2, { wrap: "truncate", children: [
1661
1755
  /* @__PURE__ */ jsx2(Text2, { color: theme.dim, children: "RATELIMIT ".padEnd(10) }),
1662
1756
  /* @__PURE__ */ jsx2(Text2, { color: rl?.mode === "block" ? theme.ok : rl?.mode === "detect" ? theme.warn : theme.dim, children: (rl?.mode ?? "?").padEnd(7) }),
@@ -1689,7 +1783,8 @@ function LivePanel({ active: active2 }) {
1689
1783
  " "
1690
1784
  ] }),
1691
1785
  /* @__PURE__ */ jsx2(Text2, { color: st.color, children: st.label.padEnd(7) }),
1692
- /* @__PURE__ */ jsx2(Text2, { color: theme.accentBright, children: truncate(r.isMe ? "this machine" : r.agent, 12).padEnd(13) }),
1786
+ /* @__PURE__ */ jsx2(Text2, { color: theme.accentBright, children: truncate(r.agent, r.isMe ? 9 : 12).padEnd(r.isMe ? 10 : 13) }),
1787
+ r.isMe ? /* @__PURE__ */ jsx2(Text2, { color: theme.ok, children: "me " }) : null,
1693
1788
  /* @__PURE__ */ jsxs2(Text2, { children: [
1694
1789
  String(r.calls).padStart(4),
1695
1790
  "c "
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solongate/proxy",
3
- "version": "0.81.44",
3
+ "version": "0.81.45",
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": {