zigmini 0.8.0-beta.6 → 0.9.0-beta.1
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.ko.md +90 -19
- package/README.md +91 -19
- package/assets/agent/gateway-request-rules.md +3 -0
- package/assets/agent/gateway-rules.md +6 -0
- package/assets/android/zigmini.apk +0 -0
- package/assets/android/zigmini.apk.json +3 -3
- package/assets/build.json +1 -1
- package/docs/manual.ko.md +69 -1
- package/docs/manual.md +67 -1
- package/host/omo-bridge/task-control.ts +4 -0
- package/host/omo-check/patches/omo-5.1.35-compaction-idle.patch +77 -0
- package/host/omo-check/patches/omo-5.1.35-compaction-intent.patch +212 -0
- package/host/omo-check/patches/omo-5.1.35-compaction-model.patch +299 -0
- package/host/omo-check/patches/omo-5.1.35-compaction-preservation.patch +1063 -0
- package/host/omo-check/patches/omo-5.1.35-compaction-refusal.patch +83 -0
- package/host/omo-check/patches/omo-5.1.35-gateway-port.manifest.json +169 -7
- package/host/omo-check/patches/omo-5.1.35-request-rules.patch +109 -0
- package/host/omo-check/patches/omo-5.1.35-turn-stats.patch +76 -0
- package/host/omo-check/patches/omo-5.1.44-compaction-port.patch +2630 -0
- package/host/omo-check/patches/omo-5.1.44-gateway-port.manifest.json +329 -0
- package/host/omo-check/patches/omo-5.1.44-provider-port.patch +440 -0
- package/host/omo-check/patches/omo-5.1.44-rpc-port.patch +778 -0
- package/package.json +4 -1
- package/scripts/secret-rules.ts +101 -0
- package/scripts/secret-scan.allow.json +155 -0
- package/scripts/secret-scan.rules.json +30 -0
- package/src/agent-request-rules.ts +82 -0
- package/src/cli/access.ts +31 -34
- package/src/cli/launchd.ts +30 -4
- package/src/cli/main.ts +3 -43
- package/src/cli/messages.ts +160 -0
- package/src/cli/pair.ts +32 -25
- package/src/cli/setup.ts +164 -75
- package/src/decisions.ts +48 -10
- package/src/engine/compat.json +3 -3
- package/src/hub.ts +183 -47
- package/src/main.ts +60 -4
- package/src/notification-history.ts +56 -0
- package/src/omo/client.ts +28 -0
- package/src/protocol.ts +32 -2
- package/src/reply-notifications.ts +144 -0
- package/src/runtime/paths.ts +2 -0
- package/src/security-allow.ts +126 -0
- package/src/security-check.ts +559 -0
- package/src/store.ts +236 -6
- package/src/turn-stats.ts +49 -0
- package/src/work-watch.ts +36 -10
- package/src/work.ts +45 -6
- package/web/DESIGN.md +39 -0
- package/web/app.js +289 -2
- package/web/decisions.d.ts +1 -1
- package/web/decisions.js +6 -0
- package/web/diagram.d.ts +28 -0
- package/web/diagram.js +228 -0
- package/web/index.html +29 -0
- package/web/notifications.d.ts +25 -0
- package/web/notifications.js +118 -0
- package/web/security-inbox.d.ts +35 -0
- package/web/security-inbox.js +237 -0
- package/web/style.css +43 -1
- package/web/turn-stats.d.ts +26 -0
- package/web/turn-stats.js +58 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zigmini",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0-beta.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"zigmini": "bin/zigmini"
|
|
@@ -21,6 +21,9 @@
|
|
|
21
21
|
"!host/omo-check/*.ts",
|
|
22
22
|
"!host/omo-check/patches/README.md",
|
|
23
23
|
"assets/",
|
|
24
|
+
"scripts/secret-rules.ts",
|
|
25
|
+
"scripts/secret-scan.rules.json",
|
|
26
|
+
"scripts/secret-scan.allow.json",
|
|
24
27
|
"docs/manual.md",
|
|
25
28
|
"docs/manual.ko.md",
|
|
26
29
|
"LICENSE.md",
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// Shared pure matching engine for tracked files, Git objects and release artifacts.
|
|
2
|
+
export type Severity = "secret" | "personal";
|
|
3
|
+
export interface Rule {
|
|
4
|
+
readonly id: string;
|
|
5
|
+
readonly severity: Severity;
|
|
6
|
+
readonly pattern: string;
|
|
7
|
+
readonly flags?: string;
|
|
8
|
+
readonly group?: number;
|
|
9
|
+
readonly minEntropy?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface CompiledRule extends Rule { readonly regex: RegExp }
|
|
12
|
+
export interface AllowEntry {
|
|
13
|
+
readonly value?: string;
|
|
14
|
+
readonly cidr?: string;
|
|
15
|
+
readonly domain?: string;
|
|
16
|
+
/** Exact source paths, or directory prefixes ending in /; omitted for public/reserved values. */
|
|
17
|
+
readonly files?: readonly string[];
|
|
18
|
+
readonly rule?: string;
|
|
19
|
+
readonly reason: string;
|
|
20
|
+
}
|
|
21
|
+
export interface Hit { readonly rule: string; readonly severity: Severity; readonly value: string }
|
|
22
|
+
|
|
23
|
+
export function entropy(value: string): number {
|
|
24
|
+
const counts = new Map<string, number>();
|
|
25
|
+
for (const ch of value) counts.set(ch, (counts.get(ch) ?? 0) + 1);
|
|
26
|
+
let bits = 0;
|
|
27
|
+
for (const n of counts.values()) {
|
|
28
|
+
const p = n / value.length;
|
|
29
|
+
bits -= p * Math.log2(p);
|
|
30
|
+
}
|
|
31
|
+
return bits;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function compileRules(rules: readonly Rule[]): CompiledRule[] {
|
|
35
|
+
return rules.map((rule) => {
|
|
36
|
+
if (!rule.id || (rule.severity !== "secret" && rule.severity !== "personal")) throw new Error(`secret_scan_rule_invalid:${rule.id}`);
|
|
37
|
+
try {
|
|
38
|
+
return { ...rule, regex: new RegExp(rule.pattern, `${rule.flags ?? ""}g`) };
|
|
39
|
+
} catch {
|
|
40
|
+
throw new Error(`secret_scan_rule_invalid:${rule.id}`);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function validateAllow(entries: readonly AllowEntry[]): AllowEntry[] {
|
|
46
|
+
return entries.map((entry, index) => {
|
|
47
|
+
const kinds = [entry.value, entry.cidr, entry.domain].filter((kind) => kind !== undefined).length;
|
|
48
|
+
if (kinds !== 1 || typeof entry.reason !== "string" || entry.reason.trim() === "") throw new Error(`secret_scan_allow_invalid:${index}`);
|
|
49
|
+
return entry;
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function ipv4ToInt(ip: string): number | null {
|
|
54
|
+
const parts = ip.split(".");
|
|
55
|
+
if (parts.length !== 4) return null;
|
|
56
|
+
let value = 0;
|
|
57
|
+
for (const part of parts) {
|
|
58
|
+
if (!/^\d{1,3}$/.test(part) || Number(part) > 255) return null;
|
|
59
|
+
value = value * 256 + Number(part);
|
|
60
|
+
}
|
|
61
|
+
return value;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function inCidr(ip: string, cidr: string): boolean {
|
|
65
|
+
const [base, bits] = cidr.split("/");
|
|
66
|
+
const address = ipv4ToInt(ip);
|
|
67
|
+
const network = ipv4ToInt(base ?? "");
|
|
68
|
+
const prefix = Number(bits);
|
|
69
|
+
if (address === null || network === null || !Number.isInteger(prefix) || prefix < 0 || prefix > 32) return false;
|
|
70
|
+
const mask = prefix === 0 ? 0 : (0xffffffff << (32 - prefix)) >>> 0;
|
|
71
|
+
return ((address & mask) >>> 0) === ((network & mask) >>> 0);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export function isAllowed(rule: string, value: string, allow: readonly AllowEntry[], file?: string): boolean {
|
|
75
|
+
for (const entry of allow) {
|
|
76
|
+
if (entry.rule !== undefined && entry.rule !== rule) continue;
|
|
77
|
+
if (entry.files !== undefined && (file === undefined || !entry.files.some((path) => path.endsWith("/") ? file.startsWith(path) : file === path))) continue;
|
|
78
|
+
if (entry.value !== undefined && (entry.value === value || (rule === "email" && entry.value.toLowerCase() === value.toLowerCase()))) return true;
|
|
79
|
+
if (entry.cidr !== undefined && rule === "ipv4" && inCidr(value, entry.cidr)) return true;
|
|
80
|
+
if (entry.domain !== undefined && rule === "email") {
|
|
81
|
+
const host = value.slice(value.lastIndexOf("@") + 1).toLowerCase();
|
|
82
|
+
const domain = entry.domain.toLowerCase();
|
|
83
|
+
if (host === domain || host.endsWith(`.${domain}`)) return true;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function scanLine(text: string, rules: readonly CompiledRule[], allow: readonly AllowEntry[], file?: string): Hit[] {
|
|
90
|
+
const hits: Hit[] = [];
|
|
91
|
+
for (const rule of rules) {
|
|
92
|
+
for (const match of text.matchAll(rule.regex)) {
|
|
93
|
+
const value = match[rule.group ?? 0];
|
|
94
|
+
if (!value) continue;
|
|
95
|
+
if (rule.minEntropy !== undefined && entropy(value) < rule.minEntropy) continue;
|
|
96
|
+
if (isAllowed(rule.id, value, allow, file)) continue;
|
|
97
|
+
hits.push({ rule: rule.id, severity: rule.severity, value });
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return hits;
|
|
101
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
{
|
|
2
|
+
"allow": [
|
|
3
|
+
{"cidr":"127.0.0.0/8","reason":"loopback addresses are not personal"},
|
|
4
|
+
{"cidr":"0.0.0.0/32","reason":"bind-all address used in listen settings, not a host"},
|
|
5
|
+
{"cidr":"192.0.2.0/24","reason":"RFC 5737 documentation range (TEST-NET-1)"},
|
|
6
|
+
{"cidr":"198.51.100.0/24","reason":"RFC 5737 documentation range (TEST-NET-2)"},
|
|
7
|
+
{"cidr":"203.0.113.0/24","reason":"RFC 5737 documentation range (TEST-NET-3)"},
|
|
8
|
+
{"cidr":"10.0.2.0/24","reason":"Android emulator NAT range, same on every machine"},
|
|
9
|
+
{"domain":"example.com","reason":"RFC 2606 reserved example domain"},
|
|
10
|
+
{"value":"ghp_ZGWsecretSCANallowFIXTURE0000000000000","reason":"secret-scan test fixture: proves allow-listed values are not reported"},
|
|
11
|
+
{"value":"Abc_-0123456789abcdefghijklmnopqrstuvwxyzAB","reason":"synthetic enrollment token in Android test EnrollmentGuardTest.kt (alphabet sequence, not a credential)"},
|
|
12
|
+
{"value":"215776236+owen-ever@users.noreply.github.com","reason":"public repository GitHub noreply commit address, not a personal inbox"},
|
|
13
|
+
{"domain":"example.net","reason":"reserved documentation/test domain; no owner endpoint"},
|
|
14
|
+
{"domain":"example.org","reason":"reserved documentation/test domain; no owner endpoint"},
|
|
15
|
+
{"domain":"example.invalid","reason":"reserved documentation/test domain; no owner endpoint"},
|
|
16
|
+
{"domain":"invalid","reason":"reserved documentation/test domain; no owner endpoint"},
|
|
17
|
+
{"domain":"test","reason":"reserved documentation/test domain; no owner endpoint"},
|
|
18
|
+
{"value":"localhost","reason":"loopback hostname, not an owner endpoint"},
|
|
19
|
+
{"value":"192.168.0.7","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
20
|
+
{"value":"8.8.8.8","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
21
|
+
{"value":"10.0.0.1","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
22
|
+
{"value":"10.255.255.255","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
23
|
+
{"value":"172.16.0.1","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
24
|
+
{"value":"172.31.0.1","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
25
|
+
{"value":"192.168.0.1","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
26
|
+
{"value":"100.64.0.1","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
27
|
+
{"value":"100.127.0.1","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
28
|
+
{"value":"9.0.0.1","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
29
|
+
{"value":"11.0.0.1","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
30
|
+
{"value":"172.15.0.1","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
31
|
+
{"value":"172.32.0.1","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
32
|
+
{"value":"171.16.0.1","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
33
|
+
{"value":"173.16.0.1","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
34
|
+
{"value":"192.167.0.1","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
35
|
+
{"value":"192.169.0.1","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
36
|
+
{"value":"191.168.0.1","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
37
|
+
{"value":"193.168.0.1","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
38
|
+
{"value":"100.63.0.1","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
39
|
+
{"value":"100.128.0.1","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
40
|
+
{"value":"99.64.0.1","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
41
|
+
{"value":"101.64.0.1","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
42
|
+
{"value":"fc00::1","rule":"ipv6-internal","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
43
|
+
{"value":"fdff:ffff::1","rule":"ipv6-internal","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
44
|
+
{"value":"zig.tail.ts.net","rule":"internal-host","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
45
|
+
{"value":"mac.local","rule":"internal-host","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
46
|
+
{"value":"172.31.255.1","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
47
|
+
{"value":"192.168.1.10","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
48
|
+
{"value":"100.127.255.254","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
49
|
+
{"value":"10.0.0.2","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
50
|
+
{"value":"10.0.0.9","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
51
|
+
{"value":"192.168.0.8","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
52
|
+
{"value":"fd12:3456::1","rule":"ipv6-internal","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
53
|
+
{"value":"fe80::1","rule":"ipv6-internal","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
54
|
+
{"value":"zig.tail1234.ts.net","rule":"internal-host","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
55
|
+
{"value":"mac-mini.local","rule":"internal-host","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
56
|
+
{"value":"redacted","rule":"internal-url","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
57
|
+
{"value":"incorrect","rule":"authorization","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
58
|
+
{"value":"100.101.102.103","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
59
|
+
{"value":"255.255.255.0","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
60
|
+
{"value":"192.168.0.9","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
61
|
+
{"value":"192.168.0.5","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/","CHANGELOG.md"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
62
|
+
{"value":"10.0.0.7","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
63
|
+
{"value":"100.64.0.2","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
64
|
+
{"value":"100.64.0.3","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
65
|
+
{"value":"101.64.0.2","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
66
|
+
{"value":"192.168.1.20","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
67
|
+
{"value":"fd7a:115c::1","rule":"ipv6-internal","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
68
|
+
{"value":"fd7a::1","rule":"ipv6-internal","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
69
|
+
{"value":"mac.tail1234.ts.net","rule":"internal-host","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
70
|
+
{"value":"a.ts.net","rule":"internal-host","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
71
|
+
{"value":"host.docker.internal","rule":"internal-host","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
72
|
+
{"value":"h","rule":"internal-url","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
73
|
+
{"value":"10.9.9.9","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
74
|
+
{"value":"100.100.1.2","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
75
|
+
{"value":"172.31.255.255","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
76
|
+
{"value":"1.1.1.1","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
77
|
+
{"value":"2.2.2.2","rule":"ipv4","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
78
|
+
{"value":"fd00::1","rule":"ipv6-internal","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
79
|
+
{"value":"nope","rule":"authorization","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
80
|
+
{"value":"fixture-token","rule":"authorization","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
81
|
+
{"value":"hunter2","rule":"credential-assignment","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
82
|
+
{"value":"claude-token","rule":"authorization","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
83
|
+
{"value":"plain","rule":"authorization","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
84
|
+
{"value":"wrong","rule":"authorization","files":[".omo/evidence/","scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/"],"reason":"synthetic test fixture; exact value in the named tests and their recorded mutation evidence only"},
|
|
85
|
+
{"value":"host.docker.internal","rule":"internal-host","reason":"Docker built-in host alias shared by all installations, not an owner hostname"},
|
|
86
|
+
{"value":"i.internal","rule":"internal-host","files":["src/cli/access.ts",".omo/evidence/","scripts/secret-scan.allow.json","src/enroll.ts"],"reason":"NetworkInterfaceInfo boolean property access, not a hostname"},
|
|
87
|
+
{"value":"string","rule":"device-serial","reason":"TypeScript type annotation, not a device serial"},
|
|
88
|
+
{"value":"String","rule":"device-serial","reason":"Kotlin type annotation, not a device serial"},
|
|
89
|
+
{"value":"127.0.0.1","rule":"ipv4","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
90
|
+
{"value":"203.0.113.5","rule":"ipv4","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
91
|
+
{"value":"localhost","rule":"internal-url","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
92
|
+
{"value":"0.0.0.0","rule":"ipv4","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
93
|
+
{"value":"192.0.2.5","rule":"ipv4","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
94
|
+
{"value":"10.9.8.7","rule":"ipv4","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
95
|
+
{"value":"172.19.8.7","rule":"ipv4","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
96
|
+
{"value":"192.168.8.7","rule":"ipv4","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
97
|
+
{"value":"100.65.8.7","rule":"ipv4","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
98
|
+
{"value":"192.0.2.7","rule":"ipv4","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
99
|
+
{"value":"198.51.100.7","rule":"ipv4","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
100
|
+
{"value":"203.0.113.7","rule":"ipv4","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
101
|
+
{"value":"10.0.2.2","rule":"ipv4","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
102
|
+
{"value":"1.2.3.0","rule":"ipv4","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
103
|
+
{"value":"1.2.3.4","rule":"ipv4","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
104
|
+
{"value":"255.255.255.255","rule":"ipv4","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
105
|
+
{"value":"127.9.8.7","rule":"ipv4","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
106
|
+
{"value":"127.0.0.0","rule":"ipv4","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
107
|
+
{"value":"128.0.0.1","rule":"ipv4","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
108
|
+
{"value":"192.0.2.255","rule":"ipv4","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
109
|
+
{"value":"192.0.2.0","rule":"ipv4","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
110
|
+
{"value":"192.0.3.0","rule":"ipv4","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
111
|
+
{"value":"0.0.0.1","rule":"ipv4","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
112
|
+
{"value":"8.8.8.9","rule":"ipv4","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
113
|
+
{"value":"8.8.8.0","rule":"ipv4","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
114
|
+
{"value":"10.0.2.0","rule":"ipv4","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
115
|
+
{"value":"10.0.2.15","rule":"ipv4","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
116
|
+
{"value":"10.0.3.15","rule":"ipv4","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
117
|
+
{"value":"fd12::7","rule":"ipv6-internal","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
118
|
+
{"value":"fc12:3456::7","rule":"ipv6-internal","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
119
|
+
{"value":"fe80::7%en0","rule":"ipv6-internal","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
120
|
+
{"value":"fe90::7","rule":"ipv6-internal","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
121
|
+
{"value":"fea0::7","rule":"ipv6-internal","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
122
|
+
{"value":"feb0::7","rule":"ipv6-internal","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
123
|
+
{"value":"192.0.2.10","rule":"ipv4","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
124
|
+
{"value":"127.0.0.2","rule":"ipv4","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
125
|
+
{"value":"127.0.0.19","rule":"ipv4","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic test input, including address-range boundaries; exact value only in tests and their evidence"},
|
|
126
|
+
{"value":"5a45f64c493ea432","rule":"device-serial","files":[".omo/evidence/npm-distribution/task-14-npm-distribution.txt","scripts/secret-scan.allow.json"],"reason":"destroyed isolated QA gateway or fake Robolectric gateway; not an owner device or credential"},
|
|
127
|
+
{"value":"88e1ab9c9b8773d3","rule":"device-serial","files":[".omo/evidence/npm-distribution/task-15-npm-distribution.txt","scripts/secret-scan.allow.json"],"reason":"destroyed isolated QA gateway or fake Robolectric gateway; not an owner device or credential"},
|
|
128
|
+
{"value":"0b70b55904aff5f2","rule":"device-serial","files":[".omo/evidence/npm-distribution/task-15-npm-distribution.txt","scripts/secret-scan.allow.json"],"reason":"destroyed isolated QA gateway or fake Robolectric gateway; not an owner device or credential"},
|
|
129
|
+
{"value":"fc00::","rule":"ipv6-internal","files":[".omo/evidence/npm-distribution/task-16-npm-distribution.txt","scripts/secret-scan.allow.json","android/core/src/main/kotlin/dev/zigmini/core/Enrollment.kt"],"reason":"destroyed isolated QA gateway or fake Robolectric gateway; not an owner device or credential"},
|
|
130
|
+
{"value":"fe80::","rule":"ipv6-internal","files":[".omo/evidence/npm-distribution/task-16-npm-distribution.txt","scripts/secret-scan.allow.json"],"reason":"destroyed isolated QA gateway or fake Robolectric gateway; not an owner device or credential"},
|
|
131
|
+
{"value":"gw-a.local","rule":"internal-host","files":["scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/",".omo/evidence/"],"reason":"destroyed isolated QA gateway or fake Robolectric gateway; not an owner device or credential"},
|
|
132
|
+
{"value":"gw-b.local","rule":"internal-host","files":["scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/",".omo/evidence/"],"reason":"destroyed isolated QA gateway or fake Robolectric gateway; not an owner device or credential"},
|
|
133
|
+
{"value":"a1.s","rule":"authorization","files":[".omo/evidence/npm-distribution/task-16-npm-distribution.txt","scripts/secret-scan.allow.json",".omo/evidence/npm-distribution/task-19-npm-distribution.txt"],"reason":"destroyed isolated QA gateway or fake Robolectric gateway; not an owner device or credential"},
|
|
134
|
+
{"value":"b1.s","rule":"authorization","files":["scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/",".omo/evidence/"],"reason":"destroyed isolated QA gateway or fake Robolectric gateway; not an owner device or credential"},
|
|
135
|
+
{"value":"5.1.30.1","rule":"ipv4","files":["scripts/secret-scan.allow.json","test/","android/app/src/test/","android/core/src/test/",".omo/evidence/"],"reason":"four-part synthetic version from a schema comparison test, not a host"},
|
|
136
|
+
{"value":"machine.tailnet-name.ts.net","rule":"internal-host","files":[".omo/ulw-research/20260925-152742/wave-2-lane-access-control-FULL.md","scripts/secret-scan.allow.json",".omo/senpi-task/tasks/"],"reason":"explicit documentation example, not an owner endpoint"},
|
|
137
|
+
{"value":"machine.tailnet.ts.net","rule":"internal-host","files":[".omo/ulw-research/20260925-152742/wave-2-lane-access-control-FULL.md","scripts/secret-scan.allow.json",".omo/senpi-task/tasks/"],"reason":"explicit documentation example, not an owner endpoint"},
|
|
138
|
+
{"value":"192.168.0.12","rule":"ipv4","files":["docs/second-mac-check.ko.md","scripts/secret-scan.allow.json","docs/second-mac-check.md"],"reason":"explicit documentation example, not an owner endpoint"},
|
|
139
|
+
{"value":"100.64.0.0","rule":"ipv4","files":[".omo/plans/npm-distribution.md","scripts/secret-scan.allow.json"],"reason":"four-part software version in the distribution plan, not a host"},
|
|
140
|
+
{"value":"before_parking_fd9a4a5f-5b22-4ce0-8619-77d85ed90666","rule":"high-entropy-assignment","files":[".omo/evidence/parking-log-e0a3011b/real-run1.log","scripts/secret-scan.allow.json"],"reason":"before_parking UUID test marker, previously reviewed in task-5-npm-distribution.json secretVerdict; not authentication"},
|
|
141
|
+
{"value":"redacted","rule":"internal-url","reason":"redaction marker, not a reachable hostname"},
|
|
142
|
+
{"value":"zigmini@users.noreply.github.com","rule":"email","files":["docs/patch-notes-next.md","scripts/secret-scan.allow.json"],"reason":"synthetic Git author example in bug 163 documentation; not an owner inbox"},
|
|
143
|
+
{"value":"before_parking_a9b60dfc-b7a1-4f25-94f5-d9ca5786f0a7","rule":"high-entropy-assignment","files":[".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"before_parking UUID preservation-test marker; task-5 secretVerdict reviewed it as non-authentication"},
|
|
144
|
+
{"value":"redacted/.zigmini-gateway/secrets/omo-ws-token","rule":"high-entropy-assignment","files":[".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"redacted file-path placeholder, not a token"},
|
|
145
|
+
{"value":"before_parking_f9d8e423-af40-45a0-9f7c-3adc50cdf94a","rule":"high-entropy-assignment","files":[".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"before_parking UUID preservation-test marker; task-5 secretVerdict reviewed it as non-authentication"},
|
|
146
|
+
{"value":"npm-oidc-no-reply@github.com","rule":"email","files":[".omo/evidence/omo-5112-rollout-09740f57/registry-metadata.json","scripts/secret-scan.allow.json"],"reason":"public upstream npm publisher/maintainer metadata (GitHub Actions / omo-ai); not the owner inbox"},
|
|
147
|
+
{"value":"code.yeon.gyu@gmail.com","rule":"email","files":[".omo/evidence/omo-5112-rollout-09740f57/registry-metadata.json","scripts/secret-scan.allow.json"],"reason":"public upstream npm publisher/maintainer metadata (GitHub Actions / omo-ai); not the owner inbox"},
|
|
148
|
+
{"value":"d60c8f533040762fc4fc20f4a0dbb4dcf6b8466bc1f5b490ef6979afa17aa403","rule":"high-entropy-assignment","files":[".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"SHA-256 comparison digest, not auth.json or a credential; task-5 secretVerdict reviewed it"},
|
|
149
|
+
{"value":"before_parking_0e4af03e-d19f-4130-8b33-afab3f863f8f","rule":"high-entropy-assignment","files":[".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"before_parking UUID preservation-test marker; task-5 secretVerdict reviewed it as non-authentication"},
|
|
150
|
+
{"value":"10.20.30.40","rule":"ipv4","files":["test/","android/app/src/test/","android/core/src/test/",".omo/evidence/","scripts/secret-scan.allow.json"],"reason":"synthetic held-card rendering test input, not an owner endpoint"},
|
|
151
|
+
{"value":"device-id","rule":"device-serial","files":["src/security-check.ts","scripts/secret-scan.allow.json"],"reason":"public finding-kind label in the security card kind map, not a device serial"},
|
|
152
|
+
{"value":"redacted75","rule":"internal-url","reason":"exact redacted endpoint placeholder in rewritten history; not an owner host"},
|
|
153
|
+
{"value":"redacted51","rule":"internal-url","reason":"exact redacted endpoint placeholder in rewritten history; not an owner host"}
|
|
154
|
+
]
|
|
155
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"rules": [
|
|
3
|
+
{ "id": "private-key", "severity": "secret", "pattern": "-----BEGIN [A-Z0-9 ]*PRIVATE KEY-----" },
|
|
4
|
+
{ "id": "github-token", "severity": "secret", "pattern": "\\b(?:gh[pousr]_[A-Za-z0-9]{36,}|github_pat_[A-Za-z0-9_]{22,})\\b" },
|
|
5
|
+
{ "id": "npm-token", "severity": "secret", "pattern": "\\bnpm_[A-Za-z0-9]{36}\\b" },
|
|
6
|
+
{ "id": "anthropic-key", "severity": "secret", "pattern": "\\bsk-ant-[A-Za-z0-9_-]{20,}" },
|
|
7
|
+
{ "id": "openai-key", "severity": "secret", "pattern": "\\bsk-(?!ant-)(?:proj-|svcacct-|admin-)?[A-Za-z0-9_-]{20,}" },
|
|
8
|
+
{ "id": "notion-token", "severity": "secret", "pattern": "\\b(?:secret_[A-Za-z0-9]{43}|ntn_[A-Za-z0-9]{40,})\\b" },
|
|
9
|
+
{ "id": "slack-token", "severity": "secret", "pattern": "\\bxox[abposr]-[A-Za-z0-9-]{10,}" },
|
|
10
|
+
{ "id": "slack-webhook", "severity": "secret", "pattern": "https://hooks\\.slack\\.com/services/[A-Za-z0-9_/]{20,}" },
|
|
11
|
+
{ "id": "aws-access-key", "severity": "secret", "pattern": "\\b(?:AKIA|ASIA)[0-9A-Z]{16}\\b" },
|
|
12
|
+
{ "id": "jwt", "severity": "secret", "pattern": "\\beyJ[A-Za-z0-9_-]{8,}\\.eyJ[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}" },
|
|
13
|
+
{ "id": "high-entropy-assignment", "severity": "secret", "pattern": "(?:token|secret|password|passwd|api[_-]?key|auth)[A-Za-z0-9_]*[\"']?\\s*[:=]\\s*[\"'](?![/~])([A-Za-z0-9+/_=.-]{32,})[\"']", "flags": "i", "group": 1, "minEntropy": 3.5 },
|
|
14
|
+
{ "id": "email", "severity": "personal", "pattern": "\\b(?!this@|super@)[A-Za-z0-9._%+-]+@[A-Za-z0-9-]+(?:\\.[A-Za-z0-9-]+)*\\.[A-Za-z]{2,}\\b" },
|
|
15
|
+
{ "id": "ipv4", "severity": "personal", "pattern": "(?<![\\d.])(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?![\\d.])" },
|
|
16
|
+
{ "id": "user-home-path", "severity": "personal", "pattern": "/Users/(?!Shared/)[A-Za-z0-9._-]+/" },
|
|
17
|
+
{ "id": "ssh-public-key", "severity": "personal", "pattern": "(?:^|[ \\t])(?:(?:@cert-authority|@revoked)[ \\t]+)?(?:[^\\s]+[ \\t]+)?(?:ssh-(?:rsa|ed25519|dss)|ecdsa-sha2-[A-Za-z0-9-]+|sk-(?:ssh-ed25519|ecdsa-sha2-nistp256)@openssh\\.com)[ \\t]+[A-Za-z0-9+/]{20,}={0,3}" },
|
|
18
|
+
{ "id": "ipv6-internal", "severity": "personal", "pattern": "(?<![A-Za-z0-9:])(?:f[cd][0-9a-f]{2}|fe[89ab][0-9a-f]):[0-9a-f:]+(?:%[A-Za-z0-9_.-]+)?(?![A-Za-z0-9:])", "flags": "i" },
|
|
19
|
+
{ "id": "internal-host", "severity": "personal", "pattern": "(?<![A-Za-z0-9_.-])(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+(?:local|lan|internal|home\\.arpa|ts\\.net)(?=\\.(?![A-Za-z0-9_.-])|[^A-Za-z0-9_.-]|$)", "flags": "i" },
|
|
20
|
+
{ "id": "internal-url", "severity": "personal", "pattern": "\\b(?:https?|wss?|ssh|smb|ftp|redis|postgres(?:ql)?|mysql)://(?:[^\\s/@]+@)?([a-z][a-z0-9-]*):\\d{1,5}\\b", "flags": "i", "group": 1 },
|
|
21
|
+
{ "id": "adb-device", "severity": "personal", "pattern": "\\badb-[A-Za-z0-9_-]+\\._adb-tls-(?:connect|pairing)\\._tcp\\b" },
|
|
22
|
+
{ "id": "device-serial", "severity": "personal", "pattern": "\\b(?:serial(?:number|_number|_no)?|device[_-]?(?:id|serial)|UDID)[\\\"']?\\s*[:=]\\s*[\\\"']?([A-Za-z0-9][A-Za-z0-9_-]{5,})(?=[\\\"'\\s,;}]|$)", "flags": "i", "group": 1 },
|
|
23
|
+
{ "id": "tailscale-key", "severity": "secret", "pattern": "\\btskey-(?:auth|api|client|oauth)-[A-Za-z0-9_-]{10,}\\b" },
|
|
24
|
+
{ "id": "gcp-api-key", "severity": "secret", "pattern": "\\bAIza[A-Za-z0-9_-]{35}\\b" },
|
|
25
|
+
{ "id": "credential-assignment", "severity": "secret", "pattern": "\\b(?:password|passwd|client_secret|aws_secret_access_key|session_id|session_token)[\\\"']?\\s*[:=]\\s*[\\\"']?([A-Za-z0-9][A-Za-z0-9+/_=.!@#$%^&*-]{3,})(?=[\\\"'\\s,;}]|$)", "flags": "i", "group": 1 },
|
|
26
|
+
{ "id": "authorization", "severity": "secret", "pattern": "\\bauthorization[\\\"']?\\s*[:=]\\s*[\\\"']?(?:Bearer|Basic)\\s+([A-Za-z0-9_+/.=-]{4,})", "flags": "i", "group": 1 },
|
|
27
|
+
{ "id": "cookie-header", "severity": "secret", "pattern": "\\b(?:set-cookie|cookie)[\\\"']?\\s*[:=]\\s*[\\\"']?([A-Za-z0-9_.-]+=[A-Za-z0-9_+/.%=-]+(?:;[ \\t]*[A-Za-z0-9_.-]+=[A-Za-z0-9_+/.%=-]+)*)", "flags": "i", "group": 1 },
|
|
28
|
+
{ "id": "phone-number", "severity": "personal", "pattern": "(?<![A-Za-z0-9_+])(?:010[- .]?\\d{4}[- .]?\\d{4}|\\+82[- .]?(?:10[- .]?\\d{4}[- .]?\\d{4}|[1-9]\\d?[- .]?\\d{3,4}[- .]?\\d{4}))(?![A-Za-z0-9_])" }
|
|
29
|
+
]
|
|
30
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { fileURLToPath } from "node:url";
|
|
2
|
+
import { readRulesFile } from "./agent-rules.ts";
|
|
3
|
+
|
|
4
|
+
export const PACKAGE_REQUEST_RULES_FILE = fileURLToPath(new URL("../assets/agent/gateway-request-rules.md", import.meta.url));
|
|
5
|
+
export const REQUEST_RULES_TAG = "zigmini-request-rules";
|
|
6
|
+
|
|
7
|
+
export interface ProviderRequestEvent {
|
|
8
|
+
readonly payload: unknown;
|
|
9
|
+
readonly model?: { readonly api: string };
|
|
10
|
+
readonly streamKind?: "main" | "auxiliary";
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function record(value: unknown): value is Record<string, unknown> {
|
|
14
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function strings(value: unknown): value is string[] {
|
|
18
|
+
return Array.isArray(value) && value.every((item) => typeof item === "string");
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** Captured by one extension instance. Updates take effect when a new instance loads. */
|
|
22
|
+
export function loadRequestRules(file = PACKAGE_REQUEST_RULES_FILE): string {
|
|
23
|
+
return readRulesFile(file).text;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Changes only the final request payload. Never modifies the session's prompt or messages. */
|
|
27
|
+
export function applyRequestRules(event: ProviderRequestEvent, rules: string): unknown {
|
|
28
|
+
const payload = event.payload;
|
|
29
|
+
if (event.streamKind !== "main" || rules === "" || !record(payload)) return payload;
|
|
30
|
+
const block = `<${REQUEST_RULES_TAG}>\n${rules}\n</${REQUEST_RULES_TAG}>`;
|
|
31
|
+
const append = (text: string): string => text.includes(block) ? text : `${text}${text === "" ? "" : "\n\n"}${block}`;
|
|
32
|
+
switch (event.model?.api) {
|
|
33
|
+
case "openai-responses":
|
|
34
|
+
case "openai-codex-responses":
|
|
35
|
+
case "azure-openai-responses":
|
|
36
|
+
return { ...payload, instructions: append(typeof payload.instructions === "string" ? payload.instructions : "") };
|
|
37
|
+
case "openai-completions": {
|
|
38
|
+
if (!Array.isArray(payload.messages)) return payload;
|
|
39
|
+
const at = payload.messages.findIndex((message) => record(message) && (message.role === "system" || message.role === "developer"));
|
|
40
|
+
if (at < 0) return { ...payload, messages: [{ role: "system", content: block }, ...payload.messages] };
|
|
41
|
+
return {
|
|
42
|
+
...payload,
|
|
43
|
+
messages: payload.messages.map((message, index) => {
|
|
44
|
+
if (index !== at || !record(message)) return message;
|
|
45
|
+
if (typeof message.content === "string") return { ...message, content: append(message.content) };
|
|
46
|
+
if (!Array.isArray(message.content)) return message;
|
|
47
|
+
const present = message.content.some((part) => record(part) && part.type === "text" && part.text === block);
|
|
48
|
+
return present ? message : { ...message, content: [...message.content, { type: "text", text: block }] };
|
|
49
|
+
}),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
case "anthropic-messages": {
|
|
53
|
+
if (!Array.isArray(payload.system)) return { ...payload, system: append(typeof payload.system === "string" ? payload.system : "") };
|
|
54
|
+
const present = payload.system.some((part) => record(part) && part.type === "text" && part.text === block);
|
|
55
|
+
return present ? payload : { ...payload, system: [...payload.system, { type: "text", text: block }] };
|
|
56
|
+
}
|
|
57
|
+
case "claude-sdk-oauth": {
|
|
58
|
+
const system = payload.systemPrompt;
|
|
59
|
+
// SDK snapshots are durable. Keep the same prompt prefix, but do not record this request decoration.
|
|
60
|
+
if (typeof system === "string") return { ...payload, systemPrompt: { type: "custom", prompt: append(system), snapshot: false } };
|
|
61
|
+
if (strings(system)) {
|
|
62
|
+
return { ...payload, systemPrompt: { type: "custom", prompt: system.includes(block) ? system : [...system, block], snapshot: false } };
|
|
63
|
+
}
|
|
64
|
+
if (system === undefined) {
|
|
65
|
+
return { ...payload, systemPrompt: { type: "custom", prompt: block, snapshot: false } };
|
|
66
|
+
}
|
|
67
|
+
if (!record(system)) return payload;
|
|
68
|
+
if (system.type === "preset") {
|
|
69
|
+
return { ...payload, systemPrompt: { ...system, append: append(typeof system.append === "string" ? system.append : ""), snapshot: false } };
|
|
70
|
+
}
|
|
71
|
+
if (system.type === "custom" && typeof system.prompt === "string") {
|
|
72
|
+
return { ...payload, systemPrompt: { ...system, prompt: append(system.prompt), snapshot: false } };
|
|
73
|
+
}
|
|
74
|
+
if (system.type === "custom" && strings(system.prompt)) {
|
|
75
|
+
return { ...payload, systemPrompt: { ...system, prompt: system.prompt.includes(block) ? system.prompt : [...system.prompt, block], snapshot: false } };
|
|
76
|
+
}
|
|
77
|
+
return payload;
|
|
78
|
+
}
|
|
79
|
+
default:
|
|
80
|
+
return payload;
|
|
81
|
+
}
|
|
82
|
+
}
|