residoo 0.4.12 → 0.4.14

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/README.md CHANGED
@@ -47,6 +47,26 @@ scanned here left your machine; residoo makes no network calls.
47
47
  > trufflehog/betterleaks' verification postures, in
48
48
  > [docs/comparison.md](docs/comparison.md).
49
49
 
50
+ ## Benchmark: measured, not claimed
51
+
52
+ A reproducible benchmark against 8 real competing tools, on a synthetic-but-
53
+ pattern-true corpus (72 Claude Code sessions, 45 planted credentials, zero
54
+ real secrets), with live egress monitoring so "no network calls" is
55
+ observed, not just documented. Re-run against every meaningful release,
56
+ most recently v0.4.14:
57
+
58
+ | | residoo | best of the rest |
59
+ |---|---|---|
60
+ | Distinct credentials found (all claimed classes) | **45/45 (100%)** | agentsweep 33/42 (79%) |
61
+ | Precision (false positives) | **100%** (0 of 55 flags wrong) | gitleaks, whatileaked, trufflehog also 100% |
62
+ | Network egress during the scan | **none-observed** | 3 of 8 tools attempt real outbound calls in their *default* mode (trufflehog: 50 connection attempts to github.com, slack.com, api.anthropic.com, gitlab.com, npmjs.org) |
63
+
64
+ No single blended score, on purpose: a blend would hide exactly the class-
65
+ level differences (base64-wrapped, split-across-lines, JSON-nested) the
66
+ benchmark exists to measure. Full per-class breakdown, fairness rules, and
67
+ reproduction steps: [bench/](bench/). Self-run, pending independent
68
+ reproduction; everything needed to rerun it ships in this repo.
69
+
50
70
  ## What it does
51
71
 
52
72
  - Scans your local AI-agent session transcripts for 50 high-confidence
@@ -265,7 +285,7 @@ As a GitHub Action (this repo doubles as a composite action):
265
285
  ```yaml
266
286
  steps:
267
287
  - uses: actions/checkout@v4
268
- - uses: dandovdub/residoo@v0.4.12
288
+ - uses: dandovdub/residoo@v0.4.14
269
289
  ```
270
290
 
271
291
  As a pre-commit hook:
@@ -273,7 +293,7 @@ As a pre-commit hook:
273
293
  ```yaml
274
294
  repos:
275
295
  - repo: https://github.com/dandovdub/residoo
276
- rev: v0.4.12
296
+ rev: v0.4.14
277
297
  hooks:
278
298
  - id: residoo
279
299
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "residoo",
3
- "version": "0.4.12",
3
+ "version": "0.4.14",
4
4
  "description": "Find secrets leaking through your AI coding agent's session history. Zero network calls in the scan path, zero dependencies.",
5
5
  "license": "MIT",
6
6
  "author": "CloudRoam (https://cloudroam.io)",
package/src/patterns.js CHANGED
@@ -67,8 +67,16 @@ const PATTERNS = [
67
67
  re: /\beyJ[A-Za-z0-9_-]{10,2000}\.eyJ[A-Za-z0-9_-]{10,20000}\.[A-Za-z0-9_-]{10,2000}\b/g },
68
68
  { id: "connection_string_with_password", label: "Database connection string with embedded password", confidence: "high",
69
69
  re: /\b(postgres(?:ql)?|mysql|mongodb(?:\+srv)?):\/\/[^\s:@\/]{1,255}:[^\s@\/]{3,255}@[^\s\/]{1,255}/g },
70
+ // \b alone missed a real shape: transcript text that embeds a literal
71
+ // newline as a JSON string escape ("\n", two characters: backslash then
72
+ // the letter n) leaves that trailing "n" glued directly to the "A" of
73
+ // "Authorization" with no actual whitespace between them on the scanned
74
+ // line, and \b never fires between two word characters. (?<=\\n) is the
75
+ // fix: it also accepts the position right after a literal "\n" escape as
76
+ // a valid left edge, alongside \b's normal boundary — found via this
77
+ // project's own benchmark (bench/RESULTS.md), not a hypothetical.
70
78
  { id: "bearer_header", label: "Authorization: Bearer header with a real-looking token", confidence: "medium",
71
- re: /\bauthorization["']?\s*[:=]\s*["']?bearer\s+[A-Za-z0-9._-]{16,1000}/gi },
79
+ re: /(?:\b|(?<=\\n))authorization["']?\s*[:=]\s*["']?bearer\s+[A-Za-z0-9._-]{16,1000}/gi },
72
80
  { id: "refresh_token_field", label: "refresh_token field", confidence: "medium",
73
81
  re: /"refresh_token"\s*:\s*"[^"\s]{20,4000}"/gi },
74
82
  { id: "access_token_field", label: "access_token field", confidence: "medium",