@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 +36 -65
- package/dist/tui/index.js +35 -64
- package/package.json +1 -1
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
|
-
|
|
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
|
-
|
|
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
|
|
9422
|
-
const headerRows =
|
|
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 ?
|
|
9438
|
-
/* @__PURE__ */
|
|
9439
|
-
"
|
|
9440
|
-
/* @__PURE__ */ jsx5(
|
|
9441
|
-
|
|
9442
|
-
|
|
9443
|
-
|
|
9444
|
-
|
|
9445
|
-
|
|
9446
|
-
|
|
9447
|
-
|
|
9448
|
-
|
|
9449
|
-
|
|
9450
|
-
|
|
9451
|
-
|
|
9452
|
-
|
|
9453
|
-
|
|
9454
|
-
|
|
9455
|
-
|
|
9456
|
-
|
|
9457
|
-
|
|
9458
|
-
|
|
9459
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
2470
|
-
const headerRows =
|
|
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 ?
|
|
2486
|
-
/* @__PURE__ */
|
|
2487
|
-
"
|
|
2488
|
-
/* @__PURE__ */ jsx5(
|
|
2489
|
-
|
|
2490
|
-
|
|
2491
|
-
|
|
2492
|
-
|
|
2493
|
-
|
|
2494
|
-
|
|
2495
|
-
|
|
2496
|
-
|
|
2497
|
-
|
|
2498
|
-
|
|
2499
|
-
|
|
2500
|
-
|
|
2501
|
-
|
|
2502
|
-
|
|
2503
|
-
|
|
2504
|
-
|
|
2505
|
-
|
|
2506
|
-
|
|
2507
|
-
|
|
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
|
-
|
|
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
|
|
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.
|
|
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": {
|