@solongate/proxy 0.82.94 → 0.82.96

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.
@@ -1239,7 +1239,9 @@ async function collectChecks() {
1239
1239
  checks.push(
1240
1240
  rlBlock ? { name: "rate limit", ok: true, detail: `block \xB7 ${rlWindows(rlBlock)}` } : rlObserve ? { name: "rate limit", ok: true, detail: `detect \xB7 ${rlWindows(rlObserve)} \xB7 flags bursts, never blocks` } : { name: "rate limit", ok: "warn", detail: "off" }
1241
1241
  );
1242
- checks.push({ name: "dlp", ok: sec?.dlpBlock ? true : "warn", detail: sec?.dlpBlock ? `block \xB7 ${sec.dlpBlock.patterns.length} patterns` : sec?.dlpRedact ? "redact" : "off" });
1242
+ checks.push(
1243
+ sec?.dlpBlock ? { name: "dlp", ok: true, detail: `block \xB7 ${sec.dlpBlock.patterns.length} patterns` } : sec?.dlpRedact ? { name: "dlp", ok: true, detail: `detect \xB7 ${sec.dlpRedact.patterns.length} patterns \xB7 masks secrets, never blocks` } : { name: "dlp", ok: "warn", detail: "off" }
1244
+ );
1243
1245
  checks.push({ name: "self-protection", ok: active2.self_protection_enabled ? true : "warn", detail: active2.self_protection_enabled ? "on" : "off" });
1244
1246
  } catch (e) {
1245
1247
  checks.push({ name: "api", ok: false, detail: "unreachable: " + (e instanceof Error ? e.message : String(e)) });
package/dist/index.js CHANGED
@@ -11326,7 +11326,9 @@ async function collectChecks() {
11326
11326
  checks.push(
11327
11327
  rlBlock ? { name: "rate limit", ok: true, detail: `block \xB7 ${rlWindows(rlBlock)}` } : rlObserve ? { name: "rate limit", ok: true, detail: `detect \xB7 ${rlWindows(rlObserve)} \xB7 flags bursts, never blocks` } : { name: "rate limit", ok: "warn", detail: "off" }
11328
11328
  );
11329
- checks.push({ name: "dlp", ok: sec?.dlpBlock ? true : "warn", detail: sec?.dlpBlock ? `block \xB7 ${sec.dlpBlock.patterns.length} patterns` : sec?.dlpRedact ? "redact" : "off" });
11329
+ checks.push(
11330
+ sec?.dlpBlock ? { name: "dlp", ok: true, detail: `block \xB7 ${sec.dlpBlock.patterns.length} patterns` } : sec?.dlpRedact ? { name: "dlp", ok: true, detail: `detect \xB7 ${sec.dlpRedact.patterns.length} patterns \xB7 masks secrets, never blocks` } : { name: "dlp", ok: "warn", detail: "off" }
11331
+ );
11330
11332
  checks.push({ name: "self-protection", ok: active2.self_protection_enabled ? true : "warn", detail: active2.self_protection_enabled ? "on" : "off" });
11331
11333
  } catch (e) {
11332
11334
  checks.push({ name: "api", ok: false, detail: "unreachable: " + (e instanceof Error ? e.message : String(e)) });
package/dist/tui/index.js CHANGED
@@ -4355,7 +4355,9 @@ async function collectChecks() {
4355
4355
  checks.push(
4356
4356
  rlBlock ? { name: "rate limit", ok: true, detail: `block \xB7 ${rlWindows(rlBlock)}` } : rlObserve ? { name: "rate limit", ok: true, detail: `detect \xB7 ${rlWindows(rlObserve)} \xB7 flags bursts, never blocks` } : { name: "rate limit", ok: "warn", detail: "off" }
4357
4357
  );
4358
- checks.push({ name: "dlp", ok: sec?.dlpBlock ? true : "warn", detail: sec?.dlpBlock ? `block \xB7 ${sec.dlpBlock.patterns.length} patterns` : sec?.dlpRedact ? "redact" : "off" });
4358
+ checks.push(
4359
+ sec?.dlpBlock ? { name: "dlp", ok: true, detail: `block \xB7 ${sec.dlpBlock.patterns.length} patterns` } : sec?.dlpRedact ? { name: "dlp", ok: true, detail: `detect \xB7 ${sec.dlpRedact.patterns.length} patterns \xB7 masks secrets, never blocks` } : { name: "dlp", ok: "warn", detail: "off" }
4360
+ );
4359
4361
  checks.push({ name: "self-protection", ok: active2.self_protection_enabled ? true : "warn", detail: active2.self_protection_enabled ? "on" : "off" });
4360
4362
  } catch (e) {
4361
4363
  checks.push({ name: "api", ok: false, detail: "unreachable: " + (e instanceof Error ? e.message : String(e)) });
@@ -6536,7 +6536,7 @@ import { resolve, join, dirname, isAbsolute } from "node:path";
6536
6536
  import { homedir } from "node:os";
6537
6537
  import { gunzipSync } from "node:zlib";
6538
6538
  import { createHash } from "node:crypto";
6539
- var HOOK_VERSION = 67;
6539
+ var HOOK_VERSION = 68;
6540
6540
  function localLogsOnly(security) {
6541
6541
  if (security && typeof security === "object") {
6542
6542
  const l = security.localLogs;
@@ -7955,6 +7955,10 @@ function securityLayerCheck(toolName, args, cfg, agentKey) {
7955
7955
  if (!cfg)
7956
7956
  return null;
7957
7957
  try {
7958
+ const q = cfg.guestQuota;
7959
+ if (q && q.exhausted) {
7960
+ return `Guest allowance used up (${q.limit} tool calls). Create an account at https://auth.solongate.com to carry on \u2014 your project, its policy and everything recorded carry over, and this device keeps working. To stop guarding this machine instead: solongate \u2192 Settings \u2192 guard \u2192 d.`;
7961
+ }
7958
7962
  if (cfg.dlpBlock) {
7959
7963
  const hit = dlpScan(args, cfg.dlpBlock);
7960
7964
  if (hit)
package/hooks/guard.mjs CHANGED
@@ -32,7 +32,7 @@ import { createHash } from 'node:crypto';
32
32
  // the installed hook self-updates when the cloud version is higher (see
33
33
  // maybeSelfUpdate). This is what makes guard fixes propagate without a manual
34
34
  // reinstall — the same trust model as the OPA WASM this hook already runs.
35
- const HOOK_VERSION = 67;
35
+ const HOOK_VERSION = 68;
36
36
 
37
37
  // True when local log storage is ON. In that mode logs are kept LOCAL ONLY and
38
38
  // nothing is sent to the cloud audit log.
@@ -1765,6 +1765,15 @@ function rateLimitCheck(agentKey, limits) {
1765
1765
  function securityLayerCheck(toolName, args, cfg, agentKey) {
1766
1766
  if (!cfg) return null;
1767
1767
  try {
1768
+ // Guest allowance. A guest account is a trial, so past its allowance every
1769
+ // call is denied without exception rather than quietly running unguarded:
1770
+ // an agent that believes it is protected and is not is worse off than one
1771
+ // that is stopped and told why. Checked first, so no other layer can let a
1772
+ // call through after the allowance is gone.
1773
+ const q = cfg.guestQuota;
1774
+ if (q && q.exhausted) {
1775
+ return `Guest allowance used up (${q.limit} tool calls). Create an account at https://auth.solongate.com to carry on — your project, its policy and everything recorded carry over, and this device keeps working. To stop guarding this machine instead: solongate → Settings → guard → d.`;
1776
+ }
1768
1777
  if (cfg.dlpBlock) {
1769
1778
  const hit = dlpScan(args, cfg.dlpBlock);
1770
1779
  if (hit) return 'Security layer (DLP): blocked - arguments contain a ' + hit +
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solongate/proxy",
3
- "version": "0.82.94",
3
+ "version": "0.82.96",
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": {