@congzhen/changewayguard 6.8.12
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/LICENSE +21 -0
- package/README.md +270 -0
- package/dashboard-dist/api/104.index.js +1420 -0
- package/dashboard-dist/api/104.index.js.map +1 -0
- package/dashboard-dist/api/113.index.js +496 -0
- package/dashboard-dist/api/113.index.js.map +1 -0
- package/dashboard-dist/api/18.index.js +67 -0
- package/dashboard-dist/api/18.index.js.map +1 -0
- package/dashboard-dist/api/217.index.js +44 -0
- package/dashboard-dist/api/217.index.js.map +1 -0
- package/dashboard-dist/api/222.index.js +90 -0
- package/dashboard-dist/api/222.index.js.map +1 -0
- package/dashboard-dist/api/25.index.js +3562 -0
- package/dashboard-dist/api/25.index.js.map +1 -0
- package/dashboard-dist/api/280.index.js +206 -0
- package/dashboard-dist/api/280.index.js.map +1 -0
- package/dashboard-dist/api/369.index.js +115 -0
- package/dashboard-dist/api/369.index.js.map +1 -0
- package/dashboard-dist/api/377.index.js +1176 -0
- package/dashboard-dist/api/377.index.js.map +1 -0
- package/dashboard-dist/api/411.index.js +4250 -0
- package/dashboard-dist/api/411.index.js.map +1 -0
- package/dashboard-dist/api/424.index.js +135 -0
- package/dashboard-dist/api/424.index.js.map +1 -0
- package/dashboard-dist/api/573.index.js +806 -0
- package/dashboard-dist/api/573.index.js.map +1 -0
- package/dashboard-dist/api/598.index.js +328 -0
- package/dashboard-dist/api/598.index.js.map +1 -0
- package/dashboard-dist/api/62.index.js +4151 -0
- package/dashboard-dist/api/62.index.js.map +1 -0
- package/dashboard-dist/api/67.index.js +23383 -0
- package/dashboard-dist/api/67.index.js.map +1 -0
- package/dashboard-dist/api/678.index.js +2734 -0
- package/dashboard-dist/api/678.index.js.map +1 -0
- package/dashboard-dist/api/698.index.js +1896 -0
- package/dashboard-dist/api/698.index.js.map +1 -0
- package/dashboard-dist/api/720.index.js +98 -0
- package/dashboard-dist/api/720.index.js.map +1 -0
- package/dashboard-dist/api/830.index.js +95 -0
- package/dashboard-dist/api/830.index.js.map +1 -0
- package/dashboard-dist/api/831.index.js +99 -0
- package/dashboard-dist/api/831.index.js.map +1 -0
- package/dashboard-dist/api/84.index.js +64 -0
- package/dashboard-dist/api/84.index.js.map +1 -0
- package/dashboard-dist/api/900.index.js +65 -0
- package/dashboard-dist/api/900.index.js.map +1 -0
- package/dashboard-dist/api/917.index.js +88 -0
- package/dashboard-dist/api/917.index.js.map +1 -0
- package/dashboard-dist/api/948.index.js +64 -0
- package/dashboard-dist/api/948.index.js.map +1 -0
- package/dashboard-dist/api/953.index.js +67 -0
- package/dashboard-dist/api/953.index.js.map +1 -0
- package/dashboard-dist/api/975.index.js +374 -0
- package/dashboard-dist/api/975.index.js.map +1 -0
- package/dashboard-dist/api/drizzle/sqlite/0000_short_captain_stacy.sql +70 -0
- package/dashboard-dist/api/drizzle/sqlite/0001_closed_magus.sql +10 -0
- package/dashboard-dist/api/drizzle/sqlite/0002_agent_capability_observation.sql +38 -0
- package/dashboard-dist/api/drizzle/sqlite/0003_auth_magic_link.sql +28 -0
- package/dashboard-dist/api/drizzle/sqlite/0004_static_scan_fields.sql +8 -0
- package/dashboard-dist/api/drizzle/sqlite/0005_gateway_activity.sql +24 -0
- package/dashboard-dist/api/drizzle/sqlite/0006_sour_marauders.sql +41 -0
- package/dashboard-dist/api/drizzle/sqlite/meta/0000_snapshot.json +460 -0
- package/dashboard-dist/api/drizzle/sqlite/meta/0001_snapshot.json +536 -0
- package/dashboard-dist/api/drizzle/sqlite/meta/0006_snapshot.json +1249 -0
- package/dashboard-dist/api/drizzle/sqlite/meta/_journal.json +55 -0
- package/dashboard-dist/api/index.js +27340 -0
- package/dashboard-dist/api/index.js.map +1 -0
- package/dashboard-dist/api/package.json +16 -0
- package/dashboard-dist/api/sourcemap-register.cjs +1 -0
- package/dashboard-dist/web/assets/index-CqWIeBTD.js +158 -0
- package/dashboard-dist/web/assets/index-Dw7--9q4.css +1 -0
- package/dashboard-dist/web/changeway-logo.png +0 -0
- package/dashboard-dist/web/favicon.svg +29 -0
- package/dashboard-dist/web/index.html +14 -0
- package/dashboard-dist/web/logo.svg +16 -0
- package/dist/agent/auth.d.ts +37 -0
- package/dist/agent/auth.d.ts.map +1 -0
- package/dist/agent/auth.js +151 -0
- package/dist/agent/auth.js.map +1 -0
- package/dist/agent/behavior-detector.d.ts +150 -0
- package/dist/agent/behavior-detector.d.ts.map +1 -0
- package/dist/agent/behavior-detector.js +573 -0
- package/dist/agent/behavior-detector.js.map +1 -0
- package/dist/agent/business-reporter.d.ts +114 -0
- package/dist/agent/business-reporter.d.ts.map +1 -0
- package/dist/agent/business-reporter.js +359 -0
- package/dist/agent/business-reporter.js.map +1 -0
- package/dist/agent/config-sync.d.ts +70 -0
- package/dist/agent/config-sync.d.ts.map +1 -0
- package/dist/agent/config-sync.js +133 -0
- package/dist/agent/config-sync.js.map +1 -0
- package/dist/agent/config.d.ts +97 -0
- package/dist/agent/config.d.ts.map +1 -0
- package/dist/agent/config.js +359 -0
- package/dist/agent/config.js.map +1 -0
- package/dist/agent/content-injection-scanner.d.ts +35 -0
- package/dist/agent/content-injection-scanner.d.ts.map +1 -0
- package/dist/agent/content-injection-scanner.js +270 -0
- package/dist/agent/content-injection-scanner.js.map +1 -0
- package/dist/agent/engine-log-writer.d.ts +6 -0
- package/dist/agent/engine-log-writer.d.ts.map +1 -0
- package/dist/agent/engine-log-writer.js +18 -0
- package/dist/agent/engine-log-writer.js.map +1 -0
- package/dist/agent/env.d.ts +19 -0
- package/dist/agent/env.d.ts.map +1 -0
- package/dist/agent/env.js +43 -0
- package/dist/agent/env.js.map +1 -0
- package/dist/agent/event-reporter.d.ts +87 -0
- package/dist/agent/event-reporter.d.ts.map +1 -0
- package/dist/agent/event-reporter.js +315 -0
- package/dist/agent/event-reporter.js.map +1 -0
- package/dist/agent/file-watcher.d.ts +50 -0
- package/dist/agent/file-watcher.d.ts.map +1 -0
- package/dist/agent/file-watcher.js +135 -0
- package/dist/agent/file-watcher.js.map +1 -0
- package/dist/agent/fs-utils.d.ts +22 -0
- package/dist/agent/fs-utils.d.ts.map +1 -0
- package/dist/agent/fs-utils.js +41 -0
- package/dist/agent/fs-utils.js.map +1 -0
- package/dist/agent/gateway-manager.d.ts +59 -0
- package/dist/agent/gateway-manager.d.ts.map +1 -0
- package/dist/agent/gateway-manager.js +583 -0
- package/dist/agent/gateway-manager.js.map +1 -0
- package/dist/agent/hook-types.d.ts +276 -0
- package/dist/agent/hook-types.d.ts.map +1 -0
- package/dist/agent/hook-types.js +51 -0
- package/dist/agent/hook-types.js.map +1 -0
- package/dist/agent/index.d.ts +8 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +8 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/prompt-gate.d.ts +13 -0
- package/dist/agent/prompt-gate.d.ts.map +1 -0
- package/dist/agent/prompt-gate.js +28 -0
- package/dist/agent/prompt-gate.js.map +1 -0
- package/dist/agent/prompt-input.d.ts +9 -0
- package/dist/agent/prompt-input.d.ts.map +1 -0
- package/dist/agent/prompt-input.js +158 -0
- package/dist/agent/prompt-input.js.map +1 -0
- package/dist/agent/prompt-output.d.ts +4 -0
- package/dist/agent/prompt-output.d.ts.map +1 -0
- package/dist/agent/prompt-output.js +19 -0
- package/dist/agent/prompt-output.js.map +1 -0
- package/dist/agent/runner.d.ts +23 -0
- package/dist/agent/runner.d.ts.map +1 -0
- package/dist/agent/runner.js +154 -0
- package/dist/agent/runner.js.map +1 -0
- package/dist/agent/sanitizer.d.ts +10 -0
- package/dist/agent/sanitizer.d.ts.map +1 -0
- package/dist/agent/sanitizer.js +175 -0
- package/dist/agent/sanitizer.js.map +1 -0
- package/dist/agent/scan-activity.d.ts +18 -0
- package/dist/agent/scan-activity.d.ts.map +1 -0
- package/dist/agent/scan-activity.js +32 -0
- package/dist/agent/scan-activity.js.map +1 -0
- package/dist/agent/types.d.ts +177 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +5 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/agent/workspace-scanner.d.ts +35 -0
- package/dist/agent/workspace-scanner.d.ts.map +1 -0
- package/dist/agent/workspace-scanner.js +137 -0
- package/dist/agent/workspace-scanner.js.map +1 -0
- package/dist/dashboard-launcher.d.ts +52 -0
- package/dist/dashboard-launcher.d.ts.map +1 -0
- package/dist/dashboard-launcher.js +363 -0
- package/dist/dashboard-launcher.js.map +1 -0
- package/dist/gateway/activity.d.ts +52 -0
- package/dist/gateway/activity.d.ts.map +1 -0
- package/dist/gateway/activity.js +111 -0
- package/dist/gateway/activity.js.map +1 -0
- package/dist/gateway/config.d.ts +50 -0
- package/dist/gateway/config.d.ts.map +1 -0
- package/dist/gateway/config.js +200 -0
- package/dist/gateway/config.js.map +1 -0
- package/dist/gateway/gateway/activity.d.ts +52 -0
- package/dist/gateway/gateway/activity.d.ts.map +1 -0
- package/dist/gateway/gateway/activity.js +111 -0
- package/dist/gateway/gateway/activity.js.map +1 -0
- package/dist/gateway/gateway/config.d.ts +50 -0
- package/dist/gateway/gateway/config.d.ts.map +1 -0
- package/dist/gateway/gateway/config.js +200 -0
- package/dist/gateway/gateway/config.js.map +1 -0
- package/dist/gateway/gateway/handlers/anthropic.d.ts +12 -0
- package/dist/gateway/gateway/handlers/anthropic.d.ts.map +1 -0
- package/dist/gateway/gateway/handlers/anthropic.js +254 -0
- package/dist/gateway/gateway/handlers/anthropic.js.map +1 -0
- package/dist/gateway/gateway/handlers/gemini.d.ts +12 -0
- package/dist/gateway/gateway/handlers/gemini.d.ts.map +1 -0
- package/dist/gateway/gateway/handlers/gemini.js +101 -0
- package/dist/gateway/gateway/handlers/gemini.js.map +1 -0
- package/dist/gateway/gateway/handlers/models.d.ts +4 -0
- package/dist/gateway/gateway/handlers/models.d.ts.map +1 -0
- package/dist/gateway/gateway/handlers/models.js +36 -0
- package/dist/gateway/gateway/handlers/models.js.map +1 -0
- package/dist/gateway/gateway/handlers/openai.d.ts +16 -0
- package/dist/gateway/gateway/handlers/openai.d.ts.map +1 -0
- package/dist/gateway/gateway/handlers/openai.js +254 -0
- package/dist/gateway/gateway/handlers/openai.js.map +1 -0
- package/dist/gateway/gateway/index.d.ts +27 -0
- package/dist/gateway/gateway/index.d.ts.map +1 -0
- package/dist/gateway/gateway/index.js +293 -0
- package/dist/gateway/gateway/index.js.map +1 -0
- package/dist/gateway/gateway/mapping-store.d.ts +38 -0
- package/dist/gateway/gateway/mapping-store.d.ts.map +1 -0
- package/dist/gateway/gateway/mapping-store.js +74 -0
- package/dist/gateway/gateway/mapping-store.js.map +1 -0
- package/dist/gateway/gateway/restorer.d.ts +63 -0
- package/dist/gateway/gateway/restorer.d.ts.map +1 -0
- package/dist/gateway/gateway/restorer.js +284 -0
- package/dist/gateway/gateway/restorer.js.map +1 -0
- package/dist/gateway/gateway/sanitizer.d.ts +17 -0
- package/dist/gateway/gateway/sanitizer.d.ts.map +1 -0
- package/dist/gateway/gateway/sanitizer.js +228 -0
- package/dist/gateway/gateway/sanitizer.js.map +1 -0
- package/dist/gateway/gateway/types.d.ts +53 -0
- package/dist/gateway/gateway/types.d.ts.map +1 -0
- package/dist/gateway/gateway/types.js +5 -0
- package/dist/gateway/gateway/types.js.map +1 -0
- package/dist/gateway/handlers/anthropic.d.ts +12 -0
- package/dist/gateway/handlers/anthropic.d.ts.map +1 -0
- package/dist/gateway/handlers/anthropic.js +254 -0
- package/dist/gateway/handlers/anthropic.js.map +1 -0
- package/dist/gateway/handlers/gemini.d.ts +12 -0
- package/dist/gateway/handlers/gemini.d.ts.map +1 -0
- package/dist/gateway/handlers/gemini.js +101 -0
- package/dist/gateway/handlers/gemini.js.map +1 -0
- package/dist/gateway/handlers/models.d.ts +4 -0
- package/dist/gateway/handlers/models.d.ts.map +1 -0
- package/dist/gateway/handlers/models.js +36 -0
- package/dist/gateway/handlers/models.js.map +1 -0
- package/dist/gateway/handlers/openai.d.ts +16 -0
- package/dist/gateway/handlers/openai.d.ts.map +1 -0
- package/dist/gateway/handlers/openai.js +254 -0
- package/dist/gateway/handlers/openai.js.map +1 -0
- package/dist/gateway/index.d.ts +27 -0
- package/dist/gateway/index.d.ts.map +1 -0
- package/dist/gateway/index.js +293 -0
- package/dist/gateway/index.js.map +1 -0
- package/dist/gateway/mapping-store.d.ts +38 -0
- package/dist/gateway/mapping-store.d.ts.map +1 -0
- package/dist/gateway/mapping-store.js +74 -0
- package/dist/gateway/mapping-store.js.map +1 -0
- package/dist/gateway/restorer.d.ts +63 -0
- package/dist/gateway/restorer.d.ts.map +1 -0
- package/dist/gateway/restorer.js +284 -0
- package/dist/gateway/restorer.js.map +1 -0
- package/dist/gateway/sanitizer.d.ts +17 -0
- package/dist/gateway/sanitizer.d.ts.map +1 -0
- package/dist/gateway/sanitizer.js +228 -0
- package/dist/gateway/sanitizer.js.map +1 -0
- package/dist/gateway/types.d.ts +53 -0
- package/dist/gateway/types.d.ts.map +1 -0
- package/dist/gateway/types.js +5 -0
- package/dist/gateway/types.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2084 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/index.d.ts +5 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +5 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/store.d.ts +82 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +194 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/platform-client/index.d.ts +63 -0
- package/dist/platform-client/index.d.ts.map +1 -0
- package/dist/platform-client/index.js +294 -0
- package/dist/platform-client/index.js.map +1 -0
- package/dist/platform-client/types.d.ts +109 -0
- package/dist/platform-client/types.d.ts.map +1 -0
- package/dist/platform-client/types.js +3 -0
- package/dist/platform-client/types.js.map +1 -0
- package/gateway/activity.d.ts +52 -0
- package/gateway/activity.d.ts.map +1 -0
- package/gateway/activity.js +111 -0
- package/gateway/activity.js.map +1 -0
- package/gateway/config.d.ts +50 -0
- package/gateway/config.d.ts.map +1 -0
- package/gateway/config.js +200 -0
- package/gateway/config.js.map +1 -0
- package/gateway/handlers/anthropic.d.ts +12 -0
- package/gateway/handlers/anthropic.d.ts.map +1 -0
- package/gateway/handlers/anthropic.js +254 -0
- package/gateway/handlers/anthropic.js.map +1 -0
- package/gateway/handlers/gemini.d.ts +12 -0
- package/gateway/handlers/gemini.d.ts.map +1 -0
- package/gateway/handlers/gemini.js +101 -0
- package/gateway/handlers/gemini.js.map +1 -0
- package/gateway/handlers/models.d.ts +4 -0
- package/gateway/handlers/models.d.ts.map +1 -0
- package/gateway/handlers/models.js +36 -0
- package/gateway/handlers/models.js.map +1 -0
- package/gateway/handlers/openai.d.ts +16 -0
- package/gateway/handlers/openai.d.ts.map +1 -0
- package/gateway/handlers/openai.js +254 -0
- package/gateway/handlers/openai.js.map +1 -0
- package/gateway/index.d.ts +27 -0
- package/gateway/index.d.ts.map +1 -0
- package/gateway/index.js +293 -0
- package/gateway/index.js.map +1 -0
- package/gateway/mapping-store.d.ts +38 -0
- package/gateway/mapping-store.d.ts.map +1 -0
- package/gateway/mapping-store.js +74 -0
- package/gateway/mapping-store.js.map +1 -0
- package/gateway/restorer.d.ts +63 -0
- package/gateway/restorer.d.ts.map +1 -0
- package/gateway/restorer.js +284 -0
- package/gateway/restorer.js.map +1 -0
- package/gateway/sanitizer.d.ts +17 -0
- package/gateway/sanitizer.d.ts.map +1 -0
- package/gateway/sanitizer.js +228 -0
- package/gateway/sanitizer.js.map +1 -0
- package/gateway/types.d.ts +53 -0
- package/gateway/types.d.ts.map +1 -0
- package/gateway/types.js +5 -0
- package/gateway/types.js.map +1 -0
- package/openclaw.plugin.json +86 -0
- package/package.json +74 -0
- package/samples/Untitled +1 -0
- package/samples/clean-email.txt +20 -0
- package/samples/test-document.md +53 -0
- package/samples/test-email-popup.txt +44 -0
- package/samples/test-email.txt +32 -0
- package/samples/test-webpage.html +51 -0
- package/scripts/enterprise-enroll.sh +89 -0
- package/scripts/enterprise-unenroll.sh +75 -0
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Security Gateway - Content Restorer
|
|
3
|
+
*
|
|
4
|
+
* Restores sanitized placeholders back to original values.
|
|
5
|
+
* Handles LLM corruption patterns (missing underscores, case variations).
|
|
6
|
+
*
|
|
7
|
+
* Placeholder format: __PII_<ENTITY_TYPE>_<SERIAL_ID>__
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Build a map from placeholder patterns to original values
|
|
11
|
+
* Handles variations that LLMs might produce
|
|
12
|
+
*/
|
|
13
|
+
function buildRestorationMap(mappingTable) {
|
|
14
|
+
const restorationMap = new Map();
|
|
15
|
+
for (const [placeholder, originalValue] of mappingTable.entries()) {
|
|
16
|
+
// Extract the core pattern from placeholder like __PII_EMAIL_ADDRESS_00000001__
|
|
17
|
+
const match = placeholder.match(/^__PII_([A-Z_]+)_(\d+)__$/);
|
|
18
|
+
if (!match) {
|
|
19
|
+
// Fallback: exact match only
|
|
20
|
+
restorationMap.set(new RegExp(escapeRegex(placeholder), "g"), originalValue);
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
const entityType = match[1];
|
|
24
|
+
const serialId = match[2];
|
|
25
|
+
// Create flexible pattern that handles LLM corruption:
|
|
26
|
+
// - Missing leading/trailing underscores
|
|
27
|
+
// - Case variations
|
|
28
|
+
// - Extra spaces
|
|
29
|
+
const flexiblePattern = new RegExp(`_?_?PII[_\\s]*${entityType}[_\\s]*${serialId}_?_?`, "gi");
|
|
30
|
+
restorationMap.set(flexiblePattern, originalValue);
|
|
31
|
+
}
|
|
32
|
+
return restorationMap;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Escape special regex characters
|
|
36
|
+
*/
|
|
37
|
+
function escapeRegex(str) {
|
|
38
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Restore placeholders in a string
|
|
42
|
+
*/
|
|
43
|
+
function restoreText(text, mappingTable) {
|
|
44
|
+
if (mappingTable.size === 0)
|
|
45
|
+
return text;
|
|
46
|
+
let restored = text;
|
|
47
|
+
// First pass: exact matches (fastest)
|
|
48
|
+
for (const [placeholder, originalValue] of mappingTable.entries()) {
|
|
49
|
+
if (restored.includes(placeholder)) {
|
|
50
|
+
restored = restored.split(placeholder).join(originalValue);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Second pass: flexible patterns for LLM corruption
|
|
54
|
+
const restorationMap = buildRestorationMap(mappingTable);
|
|
55
|
+
for (const [pattern, originalValue] of restorationMap.entries()) {
|
|
56
|
+
restored = restored.replace(pattern, originalValue);
|
|
57
|
+
}
|
|
58
|
+
// Third pass: handle "leaked ID suffix" pattern
|
|
59
|
+
// LLM might output: "original_value_00000001" instead of just "original_value"
|
|
60
|
+
for (const [placeholder, originalValue] of mappingTable.entries()) {
|
|
61
|
+
const match = placeholder.match(/^__PII_[A-Z_]+_(\d+)__$/);
|
|
62
|
+
if (match) {
|
|
63
|
+
const serialId = match[1];
|
|
64
|
+
// Pattern: original value followed by underscore and serial ID
|
|
65
|
+
const leakedPattern = new RegExp(escapeRegex(originalValue) + `[_\\s]*${serialId}`, "g");
|
|
66
|
+
restored = restored.replace(leakedPattern, originalValue);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return restored;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Recursively restore any value (string, object, array)
|
|
73
|
+
*/
|
|
74
|
+
function restoreValue(value, mappingTable) {
|
|
75
|
+
if (typeof value === "string") {
|
|
76
|
+
return restoreText(value, mappingTable);
|
|
77
|
+
}
|
|
78
|
+
if (Array.isArray(value)) {
|
|
79
|
+
return value.map((item) => restoreValue(item, mappingTable));
|
|
80
|
+
}
|
|
81
|
+
if (value !== null && typeof value === "object") {
|
|
82
|
+
const restored = {};
|
|
83
|
+
for (const [key, val] of Object.entries(value)) {
|
|
84
|
+
restored[key] = restoreValue(val, mappingTable);
|
|
85
|
+
}
|
|
86
|
+
return restored;
|
|
87
|
+
}
|
|
88
|
+
return value;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Restore any content (object, array, string) using the mapping table
|
|
92
|
+
*/
|
|
93
|
+
export function restore(content, mappingTable) {
|
|
94
|
+
if (mappingTable.size === 0)
|
|
95
|
+
return content;
|
|
96
|
+
return restoreValue(content, mappingTable);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Restore a JSON string
|
|
100
|
+
* Useful for SSE streaming where each chunk is a JSON string
|
|
101
|
+
*/
|
|
102
|
+
export function restoreJSON(jsonString, mappingTable) {
|
|
103
|
+
if (mappingTable.size === 0)
|
|
104
|
+
return jsonString;
|
|
105
|
+
try {
|
|
106
|
+
const parsed = JSON.parse(jsonString);
|
|
107
|
+
const restored = restore(parsed, mappingTable);
|
|
108
|
+
return JSON.stringify(restored);
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// If not valid JSON, treat as plain text
|
|
112
|
+
return restoreText(jsonString, mappingTable);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Restore SSE data line (for streaming responses)
|
|
117
|
+
* Format: "data: {...}\n"
|
|
118
|
+
*/
|
|
119
|
+
export function restoreSSELine(line, mappingTable) {
|
|
120
|
+
if (mappingTable.size === 0)
|
|
121
|
+
return line;
|
|
122
|
+
if (!line.startsWith("data: "))
|
|
123
|
+
return line;
|
|
124
|
+
const dataContent = line.slice(6); // Remove "data: " prefix
|
|
125
|
+
if (dataContent === "[DONE]")
|
|
126
|
+
return line;
|
|
127
|
+
try {
|
|
128
|
+
const parsed = JSON.parse(dataContent);
|
|
129
|
+
const restored = restore(parsed, mappingTable);
|
|
130
|
+
return `data: ${JSON.stringify(restored)}`;
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
// Fallback to text restoration
|
|
134
|
+
return `data: ${restoreText(dataContent, mappingTable)}`;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// =============================================================================
|
|
138
|
+
// Streaming Restoration with Smart Buffering
|
|
139
|
+
// =============================================================================
|
|
140
|
+
// Max placeholder length: __PII_VERIFICATION_CODE_00000001__ ≈ 40 chars
|
|
141
|
+
const MAX_PLACEHOLDER_LENGTH = 50;
|
|
142
|
+
// Pattern to match complete placeholders
|
|
143
|
+
const PLACEHOLDER_PATTERN = /__PII_[A-Z_]+_\d{8}__/g;
|
|
144
|
+
/**
|
|
145
|
+
* StreamRestorer - Stateful streaming restoration with smart buffering
|
|
146
|
+
*
|
|
147
|
+
* Only buffers when `__` is detected (potential placeholder start).
|
|
148
|
+
* Otherwise streams through immediately for best UX.
|
|
149
|
+
*/
|
|
150
|
+
export class StreamRestorer {
|
|
151
|
+
buffer = "";
|
|
152
|
+
mappingTable;
|
|
153
|
+
constructor(mappingTable) {
|
|
154
|
+
this.mappingTable = mappingTable;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Process incoming text chunk
|
|
158
|
+
* Returns text that can be safely output (already restored or confirmed non-placeholder)
|
|
159
|
+
*/
|
|
160
|
+
process(chunk) {
|
|
161
|
+
// If no mappings, pass through directly
|
|
162
|
+
if (this.mappingTable.size === 0) {
|
|
163
|
+
return chunk;
|
|
164
|
+
}
|
|
165
|
+
this.buffer += chunk;
|
|
166
|
+
return this.flush();
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Flush what we can safely output
|
|
170
|
+
* Keeps potential incomplete placeholders in buffer
|
|
171
|
+
*/
|
|
172
|
+
flush() {
|
|
173
|
+
let output = "";
|
|
174
|
+
while (this.buffer.length > 0) {
|
|
175
|
+
// Find position of `__` in buffer
|
|
176
|
+
const underscorePos = this.buffer.indexOf("__");
|
|
177
|
+
if (underscorePos === -1) {
|
|
178
|
+
// No `__` found - check if buffer ends with single `_`
|
|
179
|
+
if (this.buffer.endsWith("_")) {
|
|
180
|
+
// Keep the trailing `_` in case next chunk starts with `_`
|
|
181
|
+
output += this.buffer.slice(0, -1);
|
|
182
|
+
this.buffer = "_";
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
// Safe to output entire buffer
|
|
186
|
+
output += this.buffer;
|
|
187
|
+
this.buffer = "";
|
|
188
|
+
}
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
// Output everything before the `__`
|
|
192
|
+
if (underscorePos > 0) {
|
|
193
|
+
output += this.buffer.slice(0, underscorePos);
|
|
194
|
+
this.buffer = this.buffer.slice(underscorePos);
|
|
195
|
+
}
|
|
196
|
+
// Now buffer starts with `__`
|
|
197
|
+
// Check if we have a complete placeholder
|
|
198
|
+
PLACEHOLDER_PATTERN.lastIndex = 0;
|
|
199
|
+
const match = PLACEHOLDER_PATTERN.exec(this.buffer);
|
|
200
|
+
if (match && match.index === 0) {
|
|
201
|
+
// Found complete placeholder at start of buffer
|
|
202
|
+
const placeholder = match[0];
|
|
203
|
+
const original = this.mappingTable.get(placeholder);
|
|
204
|
+
if (original) {
|
|
205
|
+
// Restore and output
|
|
206
|
+
output += original;
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
// Not in mapping table, output as-is
|
|
210
|
+
output += placeholder;
|
|
211
|
+
}
|
|
212
|
+
this.buffer = this.buffer.slice(placeholder.length);
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
// Check if buffer could be an incomplete placeholder
|
|
216
|
+
if (this.couldBePlaceholder(this.buffer)) {
|
|
217
|
+
// Keep buffering - might be incomplete placeholder
|
|
218
|
+
if (this.buffer.length > MAX_PLACEHOLDER_LENGTH) {
|
|
219
|
+
// Too long to be a placeholder - flush the `__` and continue
|
|
220
|
+
output += "__";
|
|
221
|
+
this.buffer = this.buffer.slice(2);
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
// Wait for more data
|
|
225
|
+
break;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
// Definitely not a placeholder - output the `__`
|
|
230
|
+
output += "__";
|
|
231
|
+
this.buffer = this.buffer.slice(2);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return output;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Check if text could be the start of a placeholder
|
|
239
|
+
* Returns true if it matches the beginning of __PII_<TYPE>_<ID>__
|
|
240
|
+
*/
|
|
241
|
+
couldBePlaceholder(text) {
|
|
242
|
+
// Must start with __
|
|
243
|
+
if (!text.startsWith("__"))
|
|
244
|
+
return false;
|
|
245
|
+
// Check partial patterns
|
|
246
|
+
const partialPatterns = [
|
|
247
|
+
/^__$/,
|
|
248
|
+
/^__P$/,
|
|
249
|
+
/^__PI$/,
|
|
250
|
+
/^__PII$/,
|
|
251
|
+
/^__PII_$/,
|
|
252
|
+
/^__PII_[A-Z_]*$/,
|
|
253
|
+
/^__PII_[A-Z_]+_$/,
|
|
254
|
+
/^__PII_[A-Z_]+_\d*$/,
|
|
255
|
+
/^__PII_[A-Z_]+_\d+_?$/,
|
|
256
|
+
];
|
|
257
|
+
return partialPatterns.some(pattern => pattern.test(text));
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Finalize stream - flush any remaining buffer
|
|
261
|
+
* Call this at end of stream to ensure nothing is lost
|
|
262
|
+
*/
|
|
263
|
+
finalize() {
|
|
264
|
+
if (this.buffer.length === 0)
|
|
265
|
+
return "";
|
|
266
|
+
// Try to restore any remaining buffer
|
|
267
|
+
const result = restoreText(this.buffer, this.mappingTable);
|
|
268
|
+
this.buffer = "";
|
|
269
|
+
return result;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Check if there's pending data in buffer
|
|
273
|
+
*/
|
|
274
|
+
hasPendingData() {
|
|
275
|
+
return this.buffer.length > 0;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Create a streaming restorer for a response
|
|
280
|
+
*/
|
|
281
|
+
export function createStreamRestorer(mappingTable) {
|
|
282
|
+
return new StreamRestorer(mappingTable);
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=restorer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restorer.js","sourceRoot":"","sources":["../src/restorer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Security Gateway - Content Sanitizer
|
|
3
|
+
*
|
|
4
|
+
* Sanitizes sensitive data in a single request-response cycle.
|
|
5
|
+
* Placeholder format: __PII_<ENTITY_TYPE>_<SERIAL_ID>__
|
|
6
|
+
*/
|
|
7
|
+
import type { SanitizeResult } from "./types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Sanitize any content (messages array, object, string)
|
|
10
|
+
* Returns sanitized content and mapping table for restoration
|
|
11
|
+
*/
|
|
12
|
+
export declare function sanitize(content: unknown): SanitizeResult;
|
|
13
|
+
/**
|
|
14
|
+
* Sanitize messages array (common case for LLM APIs)
|
|
15
|
+
*/
|
|
16
|
+
export declare function sanitizeMessages(messages: unknown[]): SanitizeResult;
|
|
17
|
+
//# sourceMappingURL=sanitizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitizer.d.ts","sourceRoot":"","sources":["../src/sanitizer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,YAAY,CAAC;AA4Q/D;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,CAWzD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,cAAc,CAEpE"}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Security Gateway - Content Sanitizer
|
|
3
|
+
*
|
|
4
|
+
* Sanitizes sensitive data in a single request-response cycle.
|
|
5
|
+
* Placeholder format: __PII_<ENTITY_TYPE>_<SERIAL_ID>__
|
|
6
|
+
*/
|
|
7
|
+
// =============================================================================
|
|
8
|
+
// Detection Patterns
|
|
9
|
+
// =============================================================================
|
|
10
|
+
const ENTITY_PATTERNS = [
|
|
11
|
+
// PEM Private Keys
|
|
12
|
+
{
|
|
13
|
+
type: "PRIVATE_KEY",
|
|
14
|
+
pattern: /-----BEGIN (?:OPENSSH |RSA |EC |DSA )?PRIVATE KEY-----[\s\S]*?-----END (?:OPENSSH |RSA |EC |DSA )?PRIVATE KEY-----/g,
|
|
15
|
+
score: 0.95,
|
|
16
|
+
},
|
|
17
|
+
// Email addresses
|
|
18
|
+
{
|
|
19
|
+
type: "EMAIL_ADDRESS",
|
|
20
|
+
pattern: /[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/g,
|
|
21
|
+
score: 0.90,
|
|
22
|
+
},
|
|
23
|
+
// URLs
|
|
24
|
+
{
|
|
25
|
+
type: "URL_ADDRESS",
|
|
26
|
+
pattern: /https?:\/\/[A-Za-z0-9._~:/?#\[\]@!$&'()*+,;=%-]+/g,
|
|
27
|
+
score: 0.80,
|
|
28
|
+
},
|
|
29
|
+
// Known API key prefixes
|
|
30
|
+
{
|
|
31
|
+
type: "API_KEY",
|
|
32
|
+
pattern: /\b(?:sk-[A-Za-z0-9]{20,}|sk_(?:live|test)_[A-Za-z0-9]{20,}|pk_(?:live|test)_[A-Za-z0-9]{20,}|ghp_[A-Za-z0-9]{36,}|gho_[A-Za-z0-9]{36,}|github_pat_[A-Za-z0-9_]{22,}|AKIA[A-Z0-9]{16}|xox[baprs]-[A-Za-z0-9-]+|SG\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+|hf_[A-Za-z0-9]{30,})\b/g,
|
|
33
|
+
score: 0.90,
|
|
34
|
+
},
|
|
35
|
+
// Bearer tokens
|
|
36
|
+
{
|
|
37
|
+
type: "API_KEY",
|
|
38
|
+
pattern: /Bearer\s+[A-Za-z0-9\-_.~+/]{20,}={0,3}/g,
|
|
39
|
+
score: 0.85,
|
|
40
|
+
},
|
|
41
|
+
// Hex private keys (64 hex chars)
|
|
42
|
+
{
|
|
43
|
+
type: "PRIVATE_KEY",
|
|
44
|
+
pattern: /\b[0-9a-fA-F]{64}\b/g,
|
|
45
|
+
score: 0.75,
|
|
46
|
+
},
|
|
47
|
+
// Labeled password patterns
|
|
48
|
+
{
|
|
49
|
+
type: "PASSWORD",
|
|
50
|
+
pattern: /(?:password|passwd|pwd|pass|passcode)\s*[:=]\s*["']?(\S+)["']?/gi,
|
|
51
|
+
score: 0.80,
|
|
52
|
+
captureGroup: 1,
|
|
53
|
+
},
|
|
54
|
+
// Labeled API key patterns
|
|
55
|
+
{
|
|
56
|
+
type: "API_KEY",
|
|
57
|
+
pattern: /(?:api[_-]?key|apikey|secret[_-]?key|access[_-]?token|auth[_-]?token)\s*[:=]\s*["']?([A-Za-z0-9\-_.~+/]{16,})["']?/gi,
|
|
58
|
+
score: 0.85,
|
|
59
|
+
captureGroup: 1,
|
|
60
|
+
},
|
|
61
|
+
// Phone numbers
|
|
62
|
+
{
|
|
63
|
+
type: "PHONE_NUMBER",
|
|
64
|
+
pattern: /\+?\d{1,3}[-.\s]?\(?\d{2,4}\)?[-.\s]?\d{3,4}[-.\s]?\d{3,4}/g,
|
|
65
|
+
score: 0.70,
|
|
66
|
+
},
|
|
67
|
+
// Credit card numbers
|
|
68
|
+
{
|
|
69
|
+
type: "CREDIT_CARD",
|
|
70
|
+
pattern: /\b\d{4}[-\s]?\d{4}[-\s]?\d{4}[-\s]?\d{4}\b/g,
|
|
71
|
+
score: 0.85,
|
|
72
|
+
},
|
|
73
|
+
// Bank account numbers
|
|
74
|
+
{
|
|
75
|
+
type: "BANK_NUMBER",
|
|
76
|
+
pattern: /\b\d{12,19}\b/g,
|
|
77
|
+
score: 0.60,
|
|
78
|
+
},
|
|
79
|
+
// SSN
|
|
80
|
+
{
|
|
81
|
+
type: "SSN",
|
|
82
|
+
pattern: /\b\d{3}-\d{2}-\d{4}\b/g,
|
|
83
|
+
score: 0.85,
|
|
84
|
+
},
|
|
85
|
+
// IP addresses
|
|
86
|
+
{
|
|
87
|
+
type: "IP_ADDRESS",
|
|
88
|
+
pattern: /\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/g,
|
|
89
|
+
score: 0.70,
|
|
90
|
+
},
|
|
91
|
+
// Labeled verification codes
|
|
92
|
+
{
|
|
93
|
+
type: "VERIFICATION_CODE",
|
|
94
|
+
pattern: /(?:verification\s*code|verify\s*code|otp|2fa\s*code|auth(?:entication)?\s*code)\s*[:=\-]?\s*([A-Za-z0-9]{4,12})/gi,
|
|
95
|
+
score: 0.80,
|
|
96
|
+
captureGroup: 1,
|
|
97
|
+
},
|
|
98
|
+
];
|
|
99
|
+
function collectMatches(content) {
|
|
100
|
+
const matches = [];
|
|
101
|
+
for (const entity of ENTITY_PATTERNS) {
|
|
102
|
+
entity.pattern.lastIndex = 0;
|
|
103
|
+
let m;
|
|
104
|
+
while ((m = entity.pattern.exec(content)) !== null) {
|
|
105
|
+
let matchedText;
|
|
106
|
+
let start;
|
|
107
|
+
if (entity.captureGroup !== undefined && m[entity.captureGroup]) {
|
|
108
|
+
matchedText = m[entity.captureGroup];
|
|
109
|
+
start = m.index + m[0].indexOf(matchedText);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
matchedText = m[0];
|
|
113
|
+
start = m.index;
|
|
114
|
+
}
|
|
115
|
+
matches.push({
|
|
116
|
+
originalText: matchedText,
|
|
117
|
+
type: entity.type,
|
|
118
|
+
score: entity.score,
|
|
119
|
+
start,
|
|
120
|
+
end: start + matchedText.length,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return matches;
|
|
125
|
+
}
|
|
126
|
+
// =============================================================================
|
|
127
|
+
// Span Merging
|
|
128
|
+
// =============================================================================
|
|
129
|
+
function mergeSpans(matches) {
|
|
130
|
+
if (matches.length === 0)
|
|
131
|
+
return [];
|
|
132
|
+
matches.sort((a, b) => {
|
|
133
|
+
if (a.start !== b.start)
|
|
134
|
+
return a.start - b.start;
|
|
135
|
+
const lenDiff = (b.end - b.start) - (a.end - a.start);
|
|
136
|
+
if (lenDiff !== 0)
|
|
137
|
+
return lenDiff;
|
|
138
|
+
return b.score - a.score;
|
|
139
|
+
});
|
|
140
|
+
const merged = [];
|
|
141
|
+
let current = matches[0];
|
|
142
|
+
for (let i = 1; i < matches.length; i++) {
|
|
143
|
+
const next = matches[i];
|
|
144
|
+
if (next.start < current.end) {
|
|
145
|
+
const currentLen = current.end - current.start;
|
|
146
|
+
const nextLen = next.end - next.start;
|
|
147
|
+
if (next.score > current.score || (next.score === current.score && nextLen > currentLen)) {
|
|
148
|
+
current = next;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
merged.push(current);
|
|
153
|
+
current = next;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
merged.push(current);
|
|
157
|
+
return merged;
|
|
158
|
+
}
|
|
159
|
+
// =============================================================================
|
|
160
|
+
// Text Sanitization
|
|
161
|
+
// =============================================================================
|
|
162
|
+
function sanitizeText(text, mappingTable, typeCounters) {
|
|
163
|
+
const matches = collectMatches(text);
|
|
164
|
+
if (matches.length === 0)
|
|
165
|
+
return text;
|
|
166
|
+
const merged = mergeSpans(matches);
|
|
167
|
+
const textToPlaceholder = new Map();
|
|
168
|
+
for (const match of merged) {
|
|
169
|
+
if (!textToPlaceholder.has(match.originalText)) {
|
|
170
|
+
const counter = (typeCounters.get(match.type) ?? 0) + 1;
|
|
171
|
+
typeCounters.set(match.type, counter);
|
|
172
|
+
const paddedId = counter.toString().padStart(8, "0");
|
|
173
|
+
const placeholder = `__PII_${match.type}_${paddedId}__`;
|
|
174
|
+
textToPlaceholder.set(match.originalText, placeholder);
|
|
175
|
+
mappingTable.set(placeholder, match.originalText);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
let sanitized = text;
|
|
179
|
+
const sortedMatches = [...merged].sort((a, b) => b.start - a.start);
|
|
180
|
+
for (const match of sortedMatches) {
|
|
181
|
+
const placeholder = textToPlaceholder.get(match.originalText);
|
|
182
|
+
sanitized = sanitized.slice(0, match.start) + placeholder + sanitized.slice(match.end);
|
|
183
|
+
}
|
|
184
|
+
return sanitized;
|
|
185
|
+
}
|
|
186
|
+
// =============================================================================
|
|
187
|
+
// Recursive Sanitization
|
|
188
|
+
// =============================================================================
|
|
189
|
+
function sanitizeValue(value, mappingTable, typeCounters) {
|
|
190
|
+
if (typeof value === "string") {
|
|
191
|
+
return sanitizeText(value, mappingTable, typeCounters);
|
|
192
|
+
}
|
|
193
|
+
if (Array.isArray(value)) {
|
|
194
|
+
return value.map((item) => sanitizeValue(item, mappingTable, typeCounters));
|
|
195
|
+
}
|
|
196
|
+
if (value !== null && typeof value === "object") {
|
|
197
|
+
const sanitized = {};
|
|
198
|
+
for (const [key, val] of Object.entries(value)) {
|
|
199
|
+
sanitized[key] = sanitizeValue(val, mappingTable, typeCounters);
|
|
200
|
+
}
|
|
201
|
+
return sanitized;
|
|
202
|
+
}
|
|
203
|
+
return value;
|
|
204
|
+
}
|
|
205
|
+
// =============================================================================
|
|
206
|
+
// Public API
|
|
207
|
+
// =============================================================================
|
|
208
|
+
/**
|
|
209
|
+
* Sanitize any content (messages array, object, string)
|
|
210
|
+
* Returns sanitized content and mapping table for restoration
|
|
211
|
+
*/
|
|
212
|
+
export function sanitize(content) {
|
|
213
|
+
const mappingTable = new Map();
|
|
214
|
+
const typeCounters = new Map();
|
|
215
|
+
const sanitized = sanitizeValue(content, mappingTable, typeCounters);
|
|
216
|
+
return {
|
|
217
|
+
sanitized,
|
|
218
|
+
mappingTable,
|
|
219
|
+
redactionCount: mappingTable.size,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Sanitize messages array (common case for LLM APIs)
|
|
224
|
+
*/
|
|
225
|
+
export function sanitizeMessages(messages) {
|
|
226
|
+
return sanitize(messages);
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=sanitizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitizer.js","sourceRoot":"","sources":["../src/sanitizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Security Gateway types
|
|
3
|
+
*/
|
|
4
|
+
export type MappingTable = Map<string, string>;
|
|
5
|
+
export type SanitizeResult = {
|
|
6
|
+
sanitized: any;
|
|
7
|
+
mappingTable: MappingTable;
|
|
8
|
+
redactionCount: number;
|
|
9
|
+
};
|
|
10
|
+
export type ApiType = "anthropic" | "openai" | "gemini";
|
|
11
|
+
export type BackendConfig = {
|
|
12
|
+
baseUrl: string;
|
|
13
|
+
apiKey: string;
|
|
14
|
+
type?: ApiType;
|
|
15
|
+
pathPrefix?: string;
|
|
16
|
+
models?: string[];
|
|
17
|
+
referer?: string;
|
|
18
|
+
title?: string;
|
|
19
|
+
};
|
|
20
|
+
export type GatewayConfig = {
|
|
21
|
+
port: number;
|
|
22
|
+
backends: {
|
|
23
|
+
[name: string]: BackendConfig;
|
|
24
|
+
};
|
|
25
|
+
routing?: {
|
|
26
|
+
[path: string]: string;
|
|
27
|
+
};
|
|
28
|
+
defaultBackends?: {
|
|
29
|
+
anthropic?: string;
|
|
30
|
+
openai?: string;
|
|
31
|
+
gemini?: string;
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
export type EntityMatch = {
|
|
35
|
+
originalText: string;
|
|
36
|
+
category: string;
|
|
37
|
+
placeholder: string;
|
|
38
|
+
};
|
|
39
|
+
export type GatewayActivityEvent = {
|
|
40
|
+
id: string;
|
|
41
|
+
timestamp: string;
|
|
42
|
+
requestId: string;
|
|
43
|
+
type: "sanitize" | "restore";
|
|
44
|
+
direction: "request" | "response";
|
|
45
|
+
backend: string;
|
|
46
|
+
endpoint: string;
|
|
47
|
+
model?: string;
|
|
48
|
+
redactionCount: number;
|
|
49
|
+
categories: Record<string, number>;
|
|
50
|
+
durationMs?: number;
|
|
51
|
+
};
|
|
52
|
+
export type ActivityListener = (event: GatewayActivityEvent) => void;
|
|
53
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,MAAM,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAG/C,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,EAAE,GAAG,CAAC;IACf,YAAY,EAAE,YAAY,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAGF,MAAM,MAAM,OAAO,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAGxD,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAGF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IAEb,QAAQ,EAAE;QACR,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC;KAC/B,CAAC;IAEF,OAAO,CAAC,EAAE;QACR,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;KACxB,CAAC;IAEF,eAAe,CAAC,EAAE;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH,CAAC;AAGF,MAAM,MAAM,WAAW,GAAG;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAGF,MAAM,MAAM,oBAAoB,GAAG;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,UAAU,GAAG,SAAS,CAAC;IAC7B,SAAS,EAAE,SAAS,GAAG,UAAU,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEnC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAGF,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenGuardrails Plugin for OpenClaw
|
|
3
|
+
*
|
|
4
|
+
* Responsibilities:
|
|
5
|
+
* 1. Load credentials from disk on startup (no network)
|
|
6
|
+
* 2. Fall back to local MAC identity when no saved credentials exist
|
|
7
|
+
* 3. Detect behavioral anomalies at before_tool_call (block / alert)
|
|
8
|
+
* 4. Expose /og_status, /og_upgrade, /og_config commands
|
|
9
|
+
*/
|
|
10
|
+
import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
|
|
11
|
+
declare const openClawGuardPlugin: {
|
|
12
|
+
id: string;
|
|
13
|
+
name: string;
|
|
14
|
+
description: string;
|
|
15
|
+
register(api: OpenClawPluginApi): void;
|
|
16
|
+
unregister(): Promise<void>;
|
|
17
|
+
};
|
|
18
|
+
export default openClawGuardPlugin;
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AA2X7D,QAAA,MAAM,mBAAmB;;;;kBAKT,iBAAiB;;CAogEhC,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
|