@solongate/proxy 0.81.73 → 0.81.75

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
@@ -9376,7 +9376,7 @@ function DlpPanel({ focused }) {
9376
9376
  });
9377
9377
  const note = (key, text) => lines.push({ node: /* @__PURE__ */ jsx5(Text5, { color: theme.dim, wrap: "truncate", children: text }, key), entry: -1 });
9378
9378
  let ei = 0;
9379
- header("h:builtin", "built-in secret patterns", "space toggles");
9379
+ header("h:builtin", "built-in secret patterns", "space toggles on/off");
9380
9380
  available.forEach((p) => {
9381
9381
  const on = enabled.has(p);
9382
9382
  const isCur = focused && ei === selC;
@@ -9391,7 +9391,8 @@ function DlpPanel({ focused }) {
9391
9391
  });
9392
9392
  });
9393
9393
  header("h:custom", "custom patterns", "a add \xB7 d remove");
9394
- if ((dlp?.custom.length ?? 0) === 0) note("n:custom", " (none \u2014 press a to add a name + regex)");
9394
+ note("n:custom-help", " same glob syntax as ghost, * = any chars, e.g. sk-* AKIA* *PRIVATE KEY*");
9395
+ if ((dlp?.custom.length ?? 0) === 0) note("n:custom", " (none \u2014 press a to add a name + pattern)");
9395
9396
  (dlp?.custom ?? []).forEach((c2, i) => {
9396
9397
  const isCur = focused && ei === selC;
9397
9398
  const idx = ei++;
@@ -9405,7 +9406,8 @@ function DlpPanel({ focused }) {
9405
9406
  });
9406
9407
  });
9407
9408
  header("h:ghost", "ghost \u2014 hidden paths", `${ghostOn ? "ON" : "off"} (g) \xB7 r add route \xB7 d remove`);
9408
- if (ghostPats.length === 0) note("n:ghost", " (none \u2014 g turns ghost on, r adds a path to hide, e.g. **/.env)");
9409
+ note("n:ghost-help", " glob path, * = any chars, e.g. */.env *.pem */secrets/* *secret*");
9410
+ if (ghostPats.length === 0) note("n:ghost", " (none \u2014 g turns ghost on, r adds a path to hide)");
9409
9411
  ghostPats.forEach((p, i) => {
9410
9412
  const isCur = focused && ei === selC;
9411
9413
  const idx = ei++;
@@ -9418,8 +9420,8 @@ function DlpPanel({ focused }) {
9418
9420
  entry: idx
9419
9421
  });
9420
9422
  });
9421
- const editRows = adding === "re" ? 2 : adding ? 1 : 0;
9422
- const headerRows = 3 + editRows + (status ? 1 : 0);
9423
+ const editRows = adding ? 1 : 0;
9424
+ const headerRows = 2 + editRows + (status ? 1 : 0);
9423
9425
  const budget = Math.max(3, rows - headerRows - 1);
9424
9426
  const selLine = Math.max(0, lines.findIndex((l) => l.entry === selC));
9425
9427
  const maxStart = Math.max(0, lines.length - budget);
@@ -9434,71 +9436,41 @@ function DlpPanel({ focused }) {
9434
9436
  /* @__PURE__ */ jsx5(Text5, { color: theme.dim, children: dlp.mode === "off" ? " (scanning disabled)" : dlp.mode === "detect" ? " (flag dlp:yes, redact output)" : " (deny + redact secrets)" }),
9435
9437
  dirty ? /* @__PURE__ */ jsx5(Text5, { color: theme.warn, children: " \u25CF unsaved (s save \xB7 x discard)" }) : null
9436
9438
  ] }),
9437
- /* @__PURE__ */ jsx5(Text5, { color: theme.dim, wrap: "truncate", children: focused ? "\u2191\u2193 move \xB7 space on/off \xB7 m mode \xB7 a add pattern \xB7 r add route \xB7 d remove \xB7 g ghost \xB7 s save" : "press \u2192 to edit" }),
9438
- /* @__PURE__ */ jsxs5(Text5, { color: theme.dim, wrap: "truncate", children: [
9439
- "legend ",
9440
- /* @__PURE__ */ jsx5(Text5, { color: theme.ok, children: "\u25CF" }),
9441
- " on \xB7 ",
9442
- /* @__PURE__ */ jsx5(Text5, { color: theme.dim, children: "\u25CB" }),
9443
- " off \xB7 ",
9444
- /* @__PURE__ */ jsx5(Text5, { color: theme.accentBright, children: "\u25B8" }),
9445
- " cursor",
9446
- moreAbove ? /* @__PURE__ */ jsx5(Text5, { children: ` \u25B2${moreAbove}` }) : null,
9447
- moreBelow ? /* @__PURE__ */ jsx5(Text5, { children: ` \u25BC${moreBelow}` }) : null
9448
- ] }),
9449
- adding ? /* @__PURE__ */ jsxs5(Box5, { flexDirection: "column", children: [
9450
- /* @__PURE__ */ jsxs5(Box5, { children: [
9451
- /* @__PURE__ */ jsx5(Text5, { color: theme.warn, children: adding === "name" ? "new pattern name: " : adding === "re" ? `regex for "${newName}": ` : "ghost route (glob path to hide, e.g. **/.env): " }),
9452
- /* @__PURE__ */ jsx5(
9453
- TextInput3,
9454
- {
9455
- value: input,
9456
- onChange: setInput,
9457
- onSubmit: (v) => {
9458
- const t = v.trim();
9459
- if (adding === "name") {
9460
- if (!t) return setAdding(null);
9461
- setNewName(t);
9462
- setInput("");
9463
- setAdding("re");
9464
- } else if (adding === "re") {
9465
- if (t && dlp) mutate({ ...dlp, custom: [...dlp.custom, { name: newName, re: t }] });
9466
- setAdding(null);
9467
- } else {
9468
- if (t && !ghostPats.includes(t)) {
9469
- setGhostPats((ps) => [...ps, t]);
9470
- setDirty(true);
9471
- setStatus(null);
9472
- }
9473
- setAdding(null);
9439
+ /* @__PURE__ */ jsx5(Text5, { color: theme.dim, wrap: "truncate", children: focused ? `\u2191\u2193 move \xB7 space on/off \xB7 m mode \xB7 a add pattern \xB7 r add route \xB7 d remove \xB7 g ghost \xB7 s save${moreAbove ? ` \xB7 \u25B2${moreAbove}` : ""}${moreBelow ? ` \xB7 \u25BC${moreBelow}` : ""}` : "press \u2192 to edit" }),
9440
+ adding ? /* @__PURE__ */ jsx5(Box5, { flexDirection: "column", children: /* @__PURE__ */ jsxs5(Box5, { children: [
9441
+ /* @__PURE__ */ jsx5(Text5, { color: theme.warn, children: adding === "name" ? "new pattern name: " : adding === "re" ? `pattern for "${newName}" (glob, * = any chars, e.g. sk-* AKIA*): ` : "ghost path to hide (glob, * = any chars, e.g. */.env *.pem): " }),
9442
+ /* @__PURE__ */ jsx5(
9443
+ TextInput3,
9444
+ {
9445
+ value: input,
9446
+ onChange: setInput,
9447
+ onSubmit: (v) => {
9448
+ const t = v.trim();
9449
+ if (adding === "name") {
9450
+ if (!t) return setAdding(null);
9451
+ setNewName(t);
9452
+ setInput("");
9453
+ setAdding("re");
9454
+ } else if (adding === "re") {
9455
+ if (t && dlp) mutate({ ...dlp, custom: [...dlp.custom, { name: newName, re: t }] });
9456
+ setAdding(null);
9457
+ } else {
9458
+ if (t && !ghostPats.includes(t)) {
9459
+ setGhostPats((ps) => [...ps, t]);
9460
+ setDirty(true);
9461
+ setStatus(null);
9474
9462
  }
9463
+ setAdding(null);
9475
9464
  }
9476
9465
  }
9477
- )
9478
- ] }),
9479
- adding === "re" ? /* @__PURE__ */ jsx5(RegexTest, { re: input }) : null
9480
- ] }) : null,
9466
+ }
9467
+ )
9468
+ ] }) }) : null,
9481
9469
  /* @__PURE__ */ jsx5(Box5, { marginTop: 1, flexDirection: "column", height: budget, overflow: "hidden", children: win.map((l) => l.node) }),
9482
9470
  status ? /* @__PURE__ */ jsx5(Text5, { color: status.startsWith("\u2717") ? theme.bad : theme.ok, wrap: "truncate", children: status }) : null
9483
9471
  ] }) : null });
9484
9472
  }
9485
- function RegexTest({ re }) {
9486
- if (!re.trim()) return /* @__PURE__ */ jsx5(Text5, { color: theme.dim, children: " regex: type a pattern\u2026" });
9487
- let rx = null;
9488
- let err2 = "";
9489
- try {
9490
- rx = new RegExp(re);
9491
- } catch (e) {
9492
- err2 = e instanceof Error ? e.message : String(e);
9493
- }
9494
- if (!rx) return /* @__PURE__ */ jsx5(Text5, { color: theme.bad, children: ` \u2717 invalid: ${err2.slice(0, 50)}` });
9495
- const hits = SAMPLES.filter((s) => rx.test(s));
9496
- return /* @__PURE__ */ jsxs5(Text5, { wrap: "truncate", children: [
9497
- /* @__PURE__ */ jsx5(Text5, { color: theme.ok, children: " \u2713 valid" }),
9498
- /* @__PURE__ */ jsx5(Text5, { color: theme.dim, children: hits.length ? ` matches ${hits.length}/${SAMPLES.length} samples: ${hits.map((h) => h.slice(0, 8)).join(", ")}` : " (no sample match \u2014 will only catch your custom secrets)" })
9499
- ] });
9500
- }
9501
- var MODES2, SAMPLES;
9473
+ var MODES2;
9502
9474
  var init_Dlp = __esm({
9503
9475
  "src/tui/panels/Dlp.tsx"() {
9504
9476
  "use strict";
@@ -9507,7 +9479,6 @@ var init_Dlp = __esm({
9507
9479
  init_hooks();
9508
9480
  init_theme();
9509
9481
  MODES2 = ["off", "detect", "block"];
9510
- SAMPLES = ["AKIA1234567890ABCD00", "sk-ant-api03-xxxxxxxx", "ghp_16chars0000000000000000000000000000", "password=hunter2", "Bearer eyJhbGciOi"];
9511
9482
  }
9512
9483
  });
9513
9484
 
@@ -11165,7 +11136,7 @@ var init_App = __esm({
11165
11136
  ["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)"]]],
11166
11137
  ["Policies", [["\u2191\u2193", "browse / select"], ["a", "activate (pin) selected policy"], ["x", "deactivate \u2014 no active policy"], ["enter", "open rules \u2192 open a rule"], ["space", "toggle a rule on/off"], ["e", "flip effect"], ["n", "new rule"], ["d", "delete rule"], ["m", "flip mode"], ["D", "dry-run the draft"], ["s", "save"], ["x", "discard"]]],
11167
11138
  ["Rate limit", [["\u2191\u2193", "field"], ["\u2190\u2192", "adjust (shift = \xB110)"], ["s", "save"]]],
11168
- ["DLP", [["\u2191\u2193", "move"], ["space", "toggle a built-in pattern on/off"], ["m", "cycle mode"], ["a", "add custom pattern (name \u2192 regex)"], ["r", "add a ghost route (path to hide)"], ["d", "remove custom / route"], ["g", "ghost on/off"], ["s", "save \xB7 x discard"]]],
11139
+ ["DLP", [["\u2191\u2193", "move"], ["space", "toggle a built-in pattern on/off"], ["m", "cycle mode"], ["a", "add custom pattern (name \u2192 glob, * = any chars)"], ["r", "add a ghost route (glob path to hide)"], ["d", "remove custom / route"], ["g", "ghost on/off"], ["s", "save \xB7 x discard"]]],
11169
11140
  ["Audit", [["v", "logs \u2194 sessions"], ["s", "source: cloud \u2194 local"], ["\u2190 \u2192", "prev / next page (500 each)"], ["\u2191\u2193", "select (list scrolls)"], ["enter", "full entry / session logs"], ["f / g", "decision / signal filter"], ["t / n / /", "tool / agent / search"], ["x / X", "delete entry / ALL (press twice)"], ["c", "clear filters"]]],
11170
11141
  ["Settings", [["\u2191\u2193", "move"], ["enter / space", "toggle \xB7 edit \xB7 add"], ["e", "webhook events"], ["d d", "delete"], ["r", "refresh"]]],
11171
11142
  ["Accounts", [["a", "switch account (view another account logged in on this device)"], ["", "the header shows which account you are viewing; guard/logging keep the active key"]]]
package/dist/tui/index.js CHANGED
@@ -2424,7 +2424,7 @@ function DlpPanel({ focused }) {
2424
2424
  });
2425
2425
  const note = (key, text) => lines.push({ node: /* @__PURE__ */ jsx5(Text5, { color: theme.dim, wrap: "truncate", children: text }, key), entry: -1 });
2426
2426
  let ei = 0;
2427
- header("h:builtin", "built-in secret patterns", "space toggles");
2427
+ header("h:builtin", "built-in secret patterns", "space toggles on/off");
2428
2428
  available.forEach((p) => {
2429
2429
  const on = enabled.has(p);
2430
2430
  const isCur = focused && ei === selC;
@@ -2439,7 +2439,8 @@ function DlpPanel({ focused }) {
2439
2439
  });
2440
2440
  });
2441
2441
  header("h:custom", "custom patterns", "a add \xB7 d remove");
2442
- if ((dlp?.custom.length ?? 0) === 0) note("n:custom", " (none \u2014 press a to add a name + regex)");
2442
+ note("n:custom-help", " same glob syntax as ghost, * = any chars, e.g. sk-* AKIA* *PRIVATE KEY*");
2443
+ if ((dlp?.custom.length ?? 0) === 0) note("n:custom", " (none \u2014 press a to add a name + pattern)");
2443
2444
  (dlp?.custom ?? []).forEach((c2, i) => {
2444
2445
  const isCur = focused && ei === selC;
2445
2446
  const idx = ei++;
@@ -2453,7 +2454,8 @@ function DlpPanel({ focused }) {
2453
2454
  });
2454
2455
  });
2455
2456
  header("h:ghost", "ghost \u2014 hidden paths", `${ghostOn ? "ON" : "off"} (g) \xB7 r add route \xB7 d remove`);
2456
- if (ghostPats.length === 0) note("n:ghost", " (none \u2014 g turns ghost on, r adds a path to hide, e.g. **/.env)");
2457
+ note("n:ghost-help", " glob path, * = any chars, e.g. */.env *.pem */secrets/* *secret*");
2458
+ if (ghostPats.length === 0) note("n:ghost", " (none \u2014 g turns ghost on, r adds a path to hide)");
2457
2459
  ghostPats.forEach((p, i) => {
2458
2460
  const isCur = focused && ei === selC;
2459
2461
  const idx = ei++;
@@ -2466,8 +2468,8 @@ function DlpPanel({ focused }) {
2466
2468
  entry: idx
2467
2469
  });
2468
2470
  });
2469
- const editRows = adding === "re" ? 2 : adding ? 1 : 0;
2470
- const headerRows = 3 + editRows + (status ? 1 : 0);
2471
+ const editRows = adding ? 1 : 0;
2472
+ const headerRows = 2 + editRows + (status ? 1 : 0);
2471
2473
  const budget = Math.max(3, rows - headerRows - 1);
2472
2474
  const selLine = Math.max(0, lines.findIndex((l) => l.entry === selC));
2473
2475
  const maxStart = Math.max(0, lines.length - budget);
@@ -2482,71 +2484,40 @@ function DlpPanel({ focused }) {
2482
2484
  /* @__PURE__ */ jsx5(Text5, { color: theme.dim, children: dlp.mode === "off" ? " (scanning disabled)" : dlp.mode === "detect" ? " (flag dlp:yes, redact output)" : " (deny + redact secrets)" }),
2483
2485
  dirty ? /* @__PURE__ */ jsx5(Text5, { color: theme.warn, children: " \u25CF unsaved (s save \xB7 x discard)" }) : null
2484
2486
  ] }),
2485
- /* @__PURE__ */ jsx5(Text5, { color: theme.dim, wrap: "truncate", children: focused ? "\u2191\u2193 move \xB7 space on/off \xB7 m mode \xB7 a add pattern \xB7 r add route \xB7 d remove \xB7 g ghost \xB7 s save" : "press \u2192 to edit" }),
2486
- /* @__PURE__ */ jsxs5(Text5, { color: theme.dim, wrap: "truncate", children: [
2487
- "legend ",
2488
- /* @__PURE__ */ jsx5(Text5, { color: theme.ok, children: "\u25CF" }),
2489
- " on \xB7 ",
2490
- /* @__PURE__ */ jsx5(Text5, { color: theme.dim, children: "\u25CB" }),
2491
- " off \xB7 ",
2492
- /* @__PURE__ */ jsx5(Text5, { color: theme.accentBright, children: "\u25B8" }),
2493
- " cursor",
2494
- moreAbove ? /* @__PURE__ */ jsx5(Text5, { children: ` \u25B2${moreAbove}` }) : null,
2495
- moreBelow ? /* @__PURE__ */ jsx5(Text5, { children: ` \u25BC${moreBelow}` }) : null
2496
- ] }),
2497
- adding ? /* @__PURE__ */ jsxs5(Box5, { flexDirection: "column", children: [
2498
- /* @__PURE__ */ jsxs5(Box5, { children: [
2499
- /* @__PURE__ */ jsx5(Text5, { color: theme.warn, children: adding === "name" ? "new pattern name: " : adding === "re" ? `regex for "${newName}": ` : "ghost route (glob path to hide, e.g. **/.env): " }),
2500
- /* @__PURE__ */ jsx5(
2501
- TextInput3,
2502
- {
2503
- value: input,
2504
- onChange: setInput,
2505
- onSubmit: (v) => {
2506
- const t = v.trim();
2507
- if (adding === "name") {
2508
- if (!t) return setAdding(null);
2509
- setNewName(t);
2510
- setInput("");
2511
- setAdding("re");
2512
- } else if (adding === "re") {
2513
- if (t && dlp) mutate({ ...dlp, custom: [...dlp.custom, { name: newName, re: t }] });
2514
- setAdding(null);
2515
- } else {
2516
- if (t && !ghostPats.includes(t)) {
2517
- setGhostPats((ps) => [...ps, t]);
2518
- setDirty(true);
2519
- setStatus(null);
2520
- }
2521
- setAdding(null);
2487
+ /* @__PURE__ */ jsx5(Text5, { color: theme.dim, wrap: "truncate", children: focused ? `\u2191\u2193 move \xB7 space on/off \xB7 m mode \xB7 a add pattern \xB7 r add route \xB7 d remove \xB7 g ghost \xB7 s save${moreAbove ? ` \xB7 \u25B2${moreAbove}` : ""}${moreBelow ? ` \xB7 \u25BC${moreBelow}` : ""}` : "press \u2192 to edit" }),
2488
+ adding ? /* @__PURE__ */ jsx5(Box5, { flexDirection: "column", children: /* @__PURE__ */ jsxs5(Box5, { children: [
2489
+ /* @__PURE__ */ jsx5(Text5, { color: theme.warn, children: adding === "name" ? "new pattern name: " : adding === "re" ? `pattern for "${newName}" (glob, * = any chars, e.g. sk-* AKIA*): ` : "ghost path to hide (glob, * = any chars, e.g. */.env *.pem): " }),
2490
+ /* @__PURE__ */ jsx5(
2491
+ TextInput3,
2492
+ {
2493
+ value: input,
2494
+ onChange: setInput,
2495
+ onSubmit: (v) => {
2496
+ const t = v.trim();
2497
+ if (adding === "name") {
2498
+ if (!t) return setAdding(null);
2499
+ setNewName(t);
2500
+ setInput("");
2501
+ setAdding("re");
2502
+ } else if (adding === "re") {
2503
+ if (t && dlp) mutate({ ...dlp, custom: [...dlp.custom, { name: newName, re: t }] });
2504
+ setAdding(null);
2505
+ } else {
2506
+ if (t && !ghostPats.includes(t)) {
2507
+ setGhostPats((ps) => [...ps, t]);
2508
+ setDirty(true);
2509
+ setStatus(null);
2522
2510
  }
2511
+ setAdding(null);
2523
2512
  }
2524
2513
  }
2525
- )
2526
- ] }),
2527
- adding === "re" ? /* @__PURE__ */ jsx5(RegexTest, { re: input }) : null
2528
- ] }) : null,
2514
+ }
2515
+ )
2516
+ ] }) }) : null,
2529
2517
  /* @__PURE__ */ jsx5(Box5, { marginTop: 1, flexDirection: "column", height: budget, overflow: "hidden", children: win.map((l) => l.node) }),
2530
2518
  status ? /* @__PURE__ */ jsx5(Text5, { color: status.startsWith("\u2717") ? theme.bad : theme.ok, wrap: "truncate", children: status }) : null
2531
2519
  ] }) : null });
2532
2520
  }
2533
- var SAMPLES = ["AKIA1234567890ABCD00", "sk-ant-api03-xxxxxxxx", "ghp_16chars0000000000000000000000000000", "password=hunter2", "Bearer eyJhbGciOi"];
2534
- function RegexTest({ re }) {
2535
- if (!re.trim()) return /* @__PURE__ */ jsx5(Text5, { color: theme.dim, children: " regex: type a pattern\u2026" });
2536
- let rx = null;
2537
- let err = "";
2538
- try {
2539
- rx = new RegExp(re);
2540
- } catch (e) {
2541
- err = e instanceof Error ? e.message : String(e);
2542
- }
2543
- if (!rx) return /* @__PURE__ */ jsx5(Text5, { color: theme.bad, children: ` \u2717 invalid: ${err.slice(0, 50)}` });
2544
- const hits = SAMPLES.filter((s) => rx.test(s));
2545
- return /* @__PURE__ */ jsxs5(Text5, { wrap: "truncate", children: [
2546
- /* @__PURE__ */ jsx5(Text5, { color: theme.ok, children: " \u2713 valid" }),
2547
- /* @__PURE__ */ jsx5(Text5, { color: theme.dim, children: hits.length ? ` matches ${hits.length}/${SAMPLES.length} samples: ${hits.map((h) => h.slice(0, 8)).join(", ")}` : " (no sample match \u2014 will only catch your custom secrets)" })
2548
- ] });
2549
- }
2550
2521
 
2551
2522
  // src/tui/panels/Audit.tsx
2552
2523
  import { Box as Box6, Text as Text6, useInput as useInput5 } from "ink";
@@ -4130,7 +4101,7 @@ var HELP = [
4130
4101
  ["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)"]]],
4131
4102
  ["Policies", [["\u2191\u2193", "browse / select"], ["a", "activate (pin) selected policy"], ["x", "deactivate \u2014 no active policy"], ["enter", "open rules \u2192 open a rule"], ["space", "toggle a rule on/off"], ["e", "flip effect"], ["n", "new rule"], ["d", "delete rule"], ["m", "flip mode"], ["D", "dry-run the draft"], ["s", "save"], ["x", "discard"]]],
4132
4103
  ["Rate limit", [["\u2191\u2193", "field"], ["\u2190\u2192", "adjust (shift = \xB110)"], ["s", "save"]]],
4133
- ["DLP", [["\u2191\u2193", "move"], ["space", "toggle a built-in pattern on/off"], ["m", "cycle mode"], ["a", "add custom pattern (name \u2192 regex)"], ["r", "add a ghost route (path to hide)"], ["d", "remove custom / route"], ["g", "ghost on/off"], ["s", "save \xB7 x discard"]]],
4104
+ ["DLP", [["\u2191\u2193", "move"], ["space", "toggle a built-in pattern on/off"], ["m", "cycle mode"], ["a", "add custom pattern (name \u2192 glob, * = any chars)"], ["r", "add a ghost route (glob path to hide)"], ["d", "remove custom / route"], ["g", "ghost on/off"], ["s", "save \xB7 x discard"]]],
4134
4105
  ["Audit", [["v", "logs \u2194 sessions"], ["s", "source: cloud \u2194 local"], ["\u2190 \u2192", "prev / next page (500 each)"], ["\u2191\u2193", "select (list scrolls)"], ["enter", "full entry / session logs"], ["f / g", "decision / signal filter"], ["t / n / /", "tool / agent / search"], ["x / X", "delete entry / ALL (press twice)"], ["c", "clear filters"]]],
4135
4106
  ["Settings", [["\u2191\u2193", "move"], ["enter / space", "toggle \xB7 edit \xB7 add"], ["e", "webhook events"], ["d d", "delete"], ["r", "refresh"]]],
4136
4107
  ["Accounts", [["a", "switch account (view another account logged in on this device)"], ["", "the header shows which account you are viewing; guard/logging keep the active key"]]]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solongate/proxy",
3
- "version": "0.81.73",
3
+ "version": "0.81.75",
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": {