@princeverma130104/agentguard 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +115 -31
- package/dist/guard.d.ts +51 -2
- package/dist/guard.d.ts.map +1 -1
- package/dist/guard.js +204 -39
- package/dist/guard.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/langchain.d.ts +4 -1
- package/dist/langchain.d.ts.map +1 -1
- package/dist/langchain.js +30 -12
- package/dist/langchain.js.map +1 -1
- package/dist/mastra.d.ts.map +1 -1
- package/dist/mastra.js +4 -9
- package/dist/mastra.js.map +1 -1
- package/dist/middleware.d.ts +10 -5
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +13 -48
- package/dist/middleware.js.map +1 -1
- package/dist/scanner.d.ts.map +1 -1
- package/dist/scanner.js +11 -2
- package/dist/scanner.js.map +1 -1
- package/dist/vault.d.ts +23 -3
- package/dist/vault.d.ts.map +1 -1
- package/dist/vault.js +169 -16
- package/dist/vault.js.map +1 -1
- package/package.json +5 -1
package/dist/middleware.js
CHANGED
|
@@ -10,20 +10,20 @@ exports.createRequestMiddleware = createRequestMiddleware;
|
|
|
10
10
|
exports.createResponseMiddleware = createResponseMiddleware;
|
|
11
11
|
exports.createGuardMiddleware = createGuardMiddleware;
|
|
12
12
|
const guard_1 = require("./guard");
|
|
13
|
+
const sessionIdsByRequest = new WeakMap();
|
|
13
14
|
/**
|
|
14
15
|
* Creates an Express-compatible middleware that:
|
|
15
16
|
* 1. Reads the raw request body
|
|
16
17
|
* 2. Applies AgentGuard anonymization to any string fields
|
|
17
|
-
* 3.
|
|
18
|
+
* 3. Keeps the session ID private for paired response restoration
|
|
18
19
|
*/
|
|
19
20
|
function createRequestMiddleware(guard) {
|
|
20
|
-
return async (req,
|
|
21
|
+
return async (req, _res, next) => {
|
|
21
22
|
try {
|
|
22
|
-
if (req.body
|
|
23
|
-
const
|
|
24
|
-
req.body =
|
|
25
|
-
req.
|
|
26
|
-
res.agentGuardSessionId = sessionId;
|
|
23
|
+
if (req.body !== undefined) {
|
|
24
|
+
const result = await guard.anonymizeObject(req.body);
|
|
25
|
+
req.body = result.sanitizedValue;
|
|
26
|
+
sessionIdsByRequest.set(req, result.sessionId);
|
|
27
27
|
}
|
|
28
28
|
next();
|
|
29
29
|
}
|
|
@@ -38,7 +38,7 @@ function createRequestMiddleware(guard) {
|
|
|
38
38
|
*/
|
|
39
39
|
function createResponseMiddleware(guard) {
|
|
40
40
|
return async (req, res, next) => {
|
|
41
|
-
const sessionId = req
|
|
41
|
+
const sessionId = sessionIdsByRequest.get(req);
|
|
42
42
|
if (!sessionId) {
|
|
43
43
|
next();
|
|
44
44
|
return;
|
|
@@ -46,9 +46,10 @@ function createResponseMiddleware(guard) {
|
|
|
46
46
|
if (typeof res.json === 'function') {
|
|
47
47
|
const originalJson = res.json.bind(res);
|
|
48
48
|
res.json = function (body) {
|
|
49
|
-
deanonymizeObject(body,
|
|
49
|
+
guard.deanonymizeObject(body, sessionId)
|
|
50
50
|
.then((restored) => originalJson(restored))
|
|
51
|
-
.catch(() =>
|
|
51
|
+
.catch((err) => next(err))
|
|
52
|
+
.finally(() => sessionIdsByRequest.delete(req));
|
|
52
53
|
return res;
|
|
53
54
|
};
|
|
54
55
|
}
|
|
@@ -61,45 +62,9 @@ function createResponseMiddleware(guard) {
|
|
|
61
62
|
*/
|
|
62
63
|
function createGuardMiddleware(options) {
|
|
63
64
|
const guard = new guard_1.AgentGuard(options);
|
|
64
|
-
return [
|
|
65
|
+
return Object.assign([
|
|
65
66
|
createRequestMiddleware(guard),
|
|
66
67
|
createResponseMiddleware(guard),
|
|
67
|
-
];
|
|
68
|
-
}
|
|
69
|
-
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
70
|
-
async function anonymizeObject(obj, guard, sessionId) {
|
|
71
|
-
let activeSession = sessionId;
|
|
72
|
-
const sanitized = {};
|
|
73
|
-
for (const [key, value] of Object.entries(obj)) {
|
|
74
|
-
if (typeof value === 'string') {
|
|
75
|
-
const result = await guard.anonymize(value, activeSession);
|
|
76
|
-
activeSession = result.sessionId;
|
|
77
|
-
sanitized[key] = result.sanitizedText;
|
|
78
|
-
}
|
|
79
|
-
else if (typeof value === 'object' && value !== null) {
|
|
80
|
-
const nested = await anonymizeObject(value, guard, activeSession);
|
|
81
|
-
activeSession = nested.sessionId;
|
|
82
|
-
sanitized[key] = nested.sanitized;
|
|
83
|
-
}
|
|
84
|
-
else {
|
|
85
|
-
sanitized[key] = value;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
return { sanitized, sessionId: activeSession };
|
|
89
|
-
}
|
|
90
|
-
async function deanonymizeObject(obj, guard, sessionId) {
|
|
91
|
-
const restored = {};
|
|
92
|
-
for (const [key, value] of Object.entries(obj)) {
|
|
93
|
-
if (typeof value === 'string') {
|
|
94
|
-
restored[key] = await guard.deanonymize(value, sessionId);
|
|
95
|
-
}
|
|
96
|
-
else if (typeof value === 'object' && value !== null) {
|
|
97
|
-
restored[key] = await deanonymizeObject(value, guard, sessionId);
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
restored[key] = value;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
return restored;
|
|
68
|
+
], { guard, close: () => guard.close() });
|
|
104
69
|
}
|
|
105
70
|
//# sourceMappingURL=middleware.js.map
|
package/dist/middleware.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAgCH,0DAiBC;AAMD,4DAyBC;AAMD,sDAYC;AA/FD,mCAAmD;AAanD,MAAM,mBAAmB,GAAG,IAAI,OAAO,EAAwB,CAAC;AAUhE;;;;;GAKG;AACH,SAAgB,uBAAuB,CAAC,KAAiB;IACvD,OAAO,KAAK,EACV,GAAiB,EACjB,IAAmB,EACnB,IAAkB,EACH,EAAE;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACrD,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC;gBACjC,mBAAmB,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YACjD,CAAC;YACD,IAAI,EAAE,CAAC;QACT,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,wBAAwB,CAAC,KAAiB;IACxD,OAAO,KAAK,EACV,GAAiB,EACjB,GAAkB,EAClB,IAAkB,EACH,EAAE;QACjB,MAAM,SAAS,GAAG,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QAED,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACnC,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACxC,GAAG,CAAC,IAAI,GAAG,UAAS,IAAa;gBAC/B,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC;qBACrC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;qBAC1C,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;qBAClC,OAAO,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBAClD,OAAO,GAAG,CAAC;YACb,CAAC,CAAC;QACJ,CAAC;QAED,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,qBAAqB,CAAC,OAAsB;IAC1D,MAAM,KAAK,GAAG,IAAI,kBAAU,CAAC,OAAO,CAAC,CAAC;IACtC,OAAO,MAAM,CAAC,MAAM,CAClB;QACE,uBAAuB,CAAC,KAAK,CAAC;QAC9B,wBAAwB,CAAC,KAAK,CAAC;KAIhC,EACD,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CACtC,CAAC;AACJ,CAAC"}
|
package/dist/scanner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAmC,MAAM,YAAY,CAAC;AAEzE,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,IAAI,EAAE,UAAU,CAAC;IACjB,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,UAAU,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,6DAA6D;IAC7D,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,sCAAsC;IACtC,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,cAAc,GAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,MAAM,CAAC,CAAM,GAC7D,UAAU,
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAmC,MAAM,YAAY,CAAC;AAEzE,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,IAAI,EAAE,UAAU,CAAC;IACjB,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,UAAU,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,6DAA6D;IAC7D,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,sCAAsC;IACtC,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,cAAc,GAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,MAAM,CAAC,CAAM,GAC7D,UAAU,CAiDZ;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAQ/E"}
|
package/dist/scanner.js
CHANGED
|
@@ -22,12 +22,21 @@ function scanText(text, customPatterns = {}) {
|
|
|
22
22
|
if (!pattern.global) {
|
|
23
23
|
throw new Error(`Custom ${key} pattern must use the global flag.`);
|
|
24
24
|
}
|
|
25
|
+
pattern.lastIndex = 0;
|
|
25
26
|
let match;
|
|
26
27
|
while ((match = pattern.exec(text)) !== null) {
|
|
28
|
+
if (match[0].length === 0) {
|
|
29
|
+
if (pattern.lastIndex >= text.length)
|
|
30
|
+
break;
|
|
31
|
+
pattern.lastIndex = match.index + 1;
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
27
34
|
const start = match.index;
|
|
28
35
|
// For NAME pattern, capture group 1 contains the name
|
|
29
|
-
const value = match[1]
|
|
30
|
-
|
|
36
|
+
const value = match[1] !== undefined ? match[1] : match[0];
|
|
37
|
+
if (value.length === 0)
|
|
38
|
+
continue;
|
|
39
|
+
const actualStart = match[1] !== undefined ? text.indexOf(match[1], start) : start;
|
|
31
40
|
const end = actualStart + value.length;
|
|
32
41
|
// Skip if this range is already covered by a higher-priority match
|
|
33
42
|
const overlaps = coveredRanges.some(([cs, ce]) => actualStart < ce && end > cs);
|
package/dist/scanner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AA2BH,
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"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"}
|
package/dist/vault.d.ts
CHANGED
|
@@ -1,32 +1,49 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @file vault.ts
|
|
3
|
-
* @description Redis-backed
|
|
3
|
+
* @description Redis-backed TTL-expiring token vault.
|
|
4
4
|
* Manages bidirectional (token ↔ rawValue) session mappings with TTL enforcement.
|
|
5
|
-
*
|
|
5
|
+
* Redis persistence and encryption are controlled by the Redis deployment.
|
|
6
6
|
*/
|
|
7
7
|
export interface VaultOptions {
|
|
8
8
|
/** Redis connection URL. Defaults to redis://localhost:6379 */
|
|
9
9
|
redisUrl?: string;
|
|
10
10
|
/** TTL in seconds for session data. Defaults to 900 (15 minutes). */
|
|
11
11
|
ttlSeconds?: number;
|
|
12
|
+
/** Maximum distinct values stored per session. Defaults to 10,000. */
|
|
13
|
+
maxTokensPerSession?: number;
|
|
14
|
+
/** Optional 32-byte hex key for AES-256-GCM vault encryption. */
|
|
15
|
+
vaultEncryptionKey?: string;
|
|
12
16
|
}
|
|
13
17
|
export declare class TokenVault {
|
|
14
18
|
private readonly redis;
|
|
19
|
+
private readonly encryptionKey?;
|
|
20
|
+
private readonly indexKey?;
|
|
15
21
|
readonly ttl: number;
|
|
22
|
+
readonly maxTokensPerSession: number;
|
|
16
23
|
constructor(options?: VaultOptions);
|
|
17
24
|
/** Returns the Redis key for the forward vault (token → rawValue) */
|
|
18
25
|
private vaultKey;
|
|
19
26
|
/** Returns the Redis key for the reverse index (rawValue → token) */
|
|
20
27
|
private reverseKey;
|
|
28
|
+
private counterKey;
|
|
29
|
+
private encodeSessionId;
|
|
21
30
|
/**
|
|
22
31
|
* Stores a token → rawValue mapping for the given session.
|
|
23
32
|
* Also stores the reverse mapping for deduplication lookups.
|
|
24
33
|
* Refreshes TTL on every write.
|
|
25
34
|
*/
|
|
26
35
|
store(sessionId: string, token: string, rawValue: string): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Atomically reuses an existing token or allocates a new per-type token.
|
|
38
|
+
* Prevents concurrent requests from assigning the same token to different values.
|
|
39
|
+
*/
|
|
40
|
+
getOrStore(sessionId: string, entityType: string, rawValue: string): Promise<{
|
|
41
|
+
token: string;
|
|
42
|
+
created: boolean;
|
|
43
|
+
}>;
|
|
27
44
|
/**
|
|
28
45
|
* Looks up the existing token for a given rawValue in a session.
|
|
29
|
-
* Returns
|
|
46
|
+
* Returns null if not found (i.e., first occurrence of this value).
|
|
30
47
|
*/
|
|
31
48
|
lookupToken(sessionId: string, rawValue: string): Promise<string | null>;
|
|
32
49
|
/**
|
|
@@ -47,5 +64,8 @@ export declare class TokenVault {
|
|
|
47
64
|
* Gracefully closes the Redis connection.
|
|
48
65
|
*/
|
|
49
66
|
close(): Promise<void>;
|
|
67
|
+
private valueDigest;
|
|
68
|
+
private encodeValue;
|
|
69
|
+
private decodeValue;
|
|
50
70
|
}
|
|
51
71
|
//# sourceMappingURL=vault.d.ts.map
|
package/dist/vault.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../src/vault.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../src/vault.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,YAAY;IAC3B,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iEAAiE;IACjE,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAuDD,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAS;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;gBAEzB,OAAO,GAAE,YAAiB;IA+CtC,qEAAqE;IACrE,OAAO,CAAC,QAAQ;IAIhB,qEAAqE;IACrE,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,eAAe;IAOvB;;;;OAIG;IACG,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB9E;;;OAGG;IACG,UAAU,CACd,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAyB/C;;;OAGG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAI9E;;;OAGG;IACG,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAUlE;;;OAGG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtD;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAS9B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,WAAW;CA4BpB"}
|
package/dist/vault.js
CHANGED
|
@@ -1,33 +1,126 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* @file vault.ts
|
|
4
|
-
* @description Redis-backed
|
|
4
|
+
* @description Redis-backed TTL-expiring token vault.
|
|
5
5
|
* Manages bidirectional (token ↔ rawValue) session mappings with TTL enforcement.
|
|
6
|
-
*
|
|
6
|
+
* Redis persistence and encryption are controlled by the Redis deployment.
|
|
7
7
|
*/
|
|
8
8
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
9
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.TokenVault = void 0;
|
|
13
|
+
const crypto_1 = require("crypto");
|
|
13
14
|
const ioredis_1 = __importDefault(require("ioredis"));
|
|
15
|
+
const STORE_SCRIPT = `
|
|
16
|
+
local existingToken = redis.call('HGET', KEYS[2], ARGV[2])
|
|
17
|
+
local existingValue = redis.call('HGET', KEYS[1], ARGV[1])
|
|
18
|
+
if not existingToken and not existingValue and redis.call('HLEN', KEYS[1]) >= tonumber(ARGV[5]) then
|
|
19
|
+
return redis.error_reply('AGENTGUARD_SESSION_TOKEN_LIMIT')
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
if existingValue then
|
|
23
|
+
local mappings = redis.call('HGETALL', KEYS[2])
|
|
24
|
+
for i = 1, #mappings, 2 do
|
|
25
|
+
if mappings[i + 1] == ARGV[1] and mappings[i] ~= ARGV[2] then
|
|
26
|
+
redis.call('HDEL', KEYS[2], mappings[i])
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
if existingToken and existingToken ~= ARGV[1] then
|
|
31
|
+
redis.call('HDEL', KEYS[1], existingToken)
|
|
32
|
+
end
|
|
33
|
+
redis.call('HSET', KEYS[1], ARGV[1], ARGV[3])
|
|
34
|
+
redis.call('HSET', KEYS[2], ARGV[2], ARGV[1])
|
|
35
|
+
redis.call('EXPIRE', KEYS[1], ARGV[4])
|
|
36
|
+
redis.call('EXPIRE', KEYS[2], ARGV[4])
|
|
37
|
+
redis.call('EXPIRE', KEYS[3], ARGV[4])
|
|
38
|
+
return 1
|
|
39
|
+
`;
|
|
40
|
+
const GET_OR_STORE_SCRIPT = `
|
|
41
|
+
local existing = redis.call('HGET', KEYS[2], ARGV[2])
|
|
42
|
+
if existing then
|
|
43
|
+
redis.call('EXPIRE', KEYS[1], ARGV[4])
|
|
44
|
+
redis.call('EXPIRE', KEYS[2], ARGV[4])
|
|
45
|
+
redis.call('EXPIRE', KEYS[3], ARGV[4])
|
|
46
|
+
return { existing, 0 }
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
if redis.call('HLEN', KEYS[1]) >= tonumber(ARGV[5]) then
|
|
50
|
+
return redis.error_reply('AGENTGUARD_SESSION_TOKEN_LIMIT')
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
local sequence = redis.call('HINCRBY', KEYS[3], ARGV[1], 1)
|
|
54
|
+
local token = '[' .. ARGV[1] .. '_' .. sequence .. ']'
|
|
55
|
+
while redis.call('HEXISTS', KEYS[1], token) == 1 do
|
|
56
|
+
sequence = redis.call('HINCRBY', KEYS[3], ARGV[1], 1)
|
|
57
|
+
token = '[' .. ARGV[1] .. '_' .. sequence .. ']'
|
|
58
|
+
end
|
|
59
|
+
redis.call('HSET', KEYS[1], token, ARGV[3])
|
|
60
|
+
redis.call('HSET', KEYS[2], ARGV[2], token)
|
|
61
|
+
redis.call('EXPIRE', KEYS[1], ARGV[4])
|
|
62
|
+
redis.call('EXPIRE', KEYS[2], ARGV[4])
|
|
63
|
+
redis.call('EXPIRE', KEYS[3], ARGV[4])
|
|
64
|
+
return { token, 1 }
|
|
65
|
+
`;
|
|
14
66
|
class TokenVault {
|
|
15
67
|
constructor(options = {}) {
|
|
16
|
-
this.
|
|
68
|
+
this.ttl = options.ttlSeconds ?? 900;
|
|
69
|
+
if (!Number.isSafeInteger(this.ttl) || this.ttl <= 0) {
|
|
70
|
+
throw new RangeError('ttlSeconds must be a positive safe integer.');
|
|
71
|
+
}
|
|
72
|
+
this.maxTokensPerSession = options.maxTokensPerSession ?? 10000;
|
|
73
|
+
if (!Number.isSafeInteger(this.maxTokensPerSession) || this.maxTokensPerSession <= 0) {
|
|
74
|
+
throw new RangeError('maxTokensPerSession must be a positive safe integer.');
|
|
75
|
+
}
|
|
76
|
+
if (options.vaultEncryptionKey !== undefined &&
|
|
77
|
+
!/^[a-fA-F0-9]{64}$/.test(options.vaultEncryptionKey)) {
|
|
78
|
+
throw new TypeError('vaultEncryptionKey must be exactly 64 hexadecimal characters.');
|
|
79
|
+
}
|
|
80
|
+
if (options.vaultEncryptionKey) {
|
|
81
|
+
const masterKey = Buffer.from(options.vaultEncryptionKey, 'hex');
|
|
82
|
+
this.encryptionKey = (0, crypto_1.createHmac)('sha256', masterKey)
|
|
83
|
+
.update('agentguard:vault-encryption')
|
|
84
|
+
.digest();
|
|
85
|
+
this.indexKey = (0, crypto_1.createHmac)('sha256', masterKey)
|
|
86
|
+
.update('agentguard:vault-index')
|
|
87
|
+
.digest();
|
|
88
|
+
}
|
|
89
|
+
const redisUrl = options.redisUrl ?? 'redis://localhost:6379';
|
|
90
|
+
let parsedRedisUrl;
|
|
91
|
+
try {
|
|
92
|
+
parsedRedisUrl = new URL(redisUrl);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
throw new TypeError('redisUrl must be a valid redis:// or rediss:// URL.');
|
|
96
|
+
}
|
|
97
|
+
if ((parsedRedisUrl.protocol !== 'redis:' && parsedRedisUrl.protocol !== 'rediss:') ||
|
|
98
|
+
!parsedRedisUrl.hostname) {
|
|
99
|
+
throw new TypeError('redisUrl must be a valid redis:// or rediss:// URL.');
|
|
100
|
+
}
|
|
101
|
+
this.redis = new ioredis_1.default(redisUrl, {
|
|
17
102
|
lazyConnect: true,
|
|
18
103
|
maxRetriesPerRequest: 3,
|
|
19
104
|
enableReadyCheck: true,
|
|
20
105
|
retryStrategy: (times) => Math.min(times * 100, 3000),
|
|
21
106
|
});
|
|
22
|
-
this.ttl = options.ttlSeconds ?? 900;
|
|
23
107
|
}
|
|
24
108
|
/** Returns the Redis key for the forward vault (token → rawValue) */
|
|
25
109
|
vaultKey(sessionId) {
|
|
26
|
-
return `agentguard:session:${sessionId}:vault`;
|
|
110
|
+
return `agentguard:session:${this.encodeSessionId(sessionId)}:vault`;
|
|
27
111
|
}
|
|
28
112
|
/** Returns the Redis key for the reverse index (rawValue → token) */
|
|
29
113
|
reverseKey(sessionId) {
|
|
30
|
-
return `agentguard:session:${sessionId}:reverse`;
|
|
114
|
+
return `agentguard:session:${this.encodeSessionId(sessionId)}:reverse`;
|
|
115
|
+
}
|
|
116
|
+
counterKey(sessionId) {
|
|
117
|
+
return `agentguard:session:${this.encodeSessionId(sessionId)}:counters`;
|
|
118
|
+
}
|
|
119
|
+
encodeSessionId(sessionId) {
|
|
120
|
+
if (typeof sessionId !== 'string' || sessionId.length === 0 || sessionId.length > 512) {
|
|
121
|
+
throw new TypeError('sessionId must be a non-empty string of at most 512 characters.');
|
|
122
|
+
}
|
|
123
|
+
return Buffer.from(sessionId, 'utf8').toString('base64url');
|
|
31
124
|
}
|
|
32
125
|
/**
|
|
33
126
|
* Stores a token → rawValue mapping for the given session.
|
|
@@ -35,33 +128,49 @@ class TokenVault {
|
|
|
35
128
|
* Refreshes TTL on every write.
|
|
36
129
|
*/
|
|
37
130
|
async store(sessionId, token, rawValue) {
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
131
|
+
const result = await this.redis.eval(STORE_SCRIPT, 3, this.vaultKey(sessionId), this.reverseKey(sessionId), this.counterKey(sessionId), token, this.valueDigest(rawValue), this.encodeValue(rawValue, sessionId), String(this.ttl), String(this.maxTokensPerSession));
|
|
132
|
+
if (result !== 1) {
|
|
133
|
+
throw new Error('Failed to store the vault mapping in Redis.');
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Atomically reuses an existing token or allocates a new per-type token.
|
|
138
|
+
* Prevents concurrent requests from assigning the same token to different values.
|
|
139
|
+
*/
|
|
140
|
+
async getOrStore(sessionId, entityType, rawValue) {
|
|
141
|
+
if (!/^[A-Z_]+$/.test(entityType)) {
|
|
142
|
+
throw new TypeError('entityType must contain uppercase letters and underscores only.');
|
|
143
|
+
}
|
|
144
|
+
const result = (await this.redis.eval(GET_OR_STORE_SCRIPT, 3, this.vaultKey(sessionId), this.reverseKey(sessionId), this.counterKey(sessionId), entityType, this.valueDigest(rawValue), this.encodeValue(rawValue, sessionId), String(this.ttl), String(this.maxTokensPerSession)));
|
|
145
|
+
if (!result || typeof result[0] !== 'string') {
|
|
146
|
+
throw new Error('Failed to atomically store the vault mapping in Redis.');
|
|
147
|
+
}
|
|
148
|
+
return { token: result[0], created: Number(result[1]) === 1 };
|
|
44
149
|
}
|
|
45
150
|
/**
|
|
46
151
|
* Looks up the existing token for a given rawValue in a session.
|
|
47
|
-
* Returns
|
|
152
|
+
* Returns null if not found (i.e., first occurrence of this value).
|
|
48
153
|
*/
|
|
49
154
|
async lookupToken(sessionId, rawValue) {
|
|
50
|
-
return this.redis.hget(this.reverseKey(sessionId), rawValue);
|
|
155
|
+
return this.redis.hget(this.reverseKey(sessionId), this.valueDigest(rawValue));
|
|
51
156
|
}
|
|
52
157
|
/**
|
|
53
158
|
* Retrieves the full vault map (token → rawValue) for a session.
|
|
54
159
|
* Returns an empty object if the session has expired or doesn't exist.
|
|
55
160
|
*/
|
|
56
161
|
async getVault(sessionId) {
|
|
57
|
-
|
|
162
|
+
const stored = await this.redis.hgetall(this.vaultKey(sessionId));
|
|
163
|
+
return Object.fromEntries(Object.entries(stored).map(([token, value]) => [
|
|
164
|
+
token,
|
|
165
|
+
this.decodeValue(value, sessionId),
|
|
166
|
+
]));
|
|
58
167
|
}
|
|
59
168
|
/**
|
|
60
169
|
* Explicitly deletes all session data (vault + reverse index).
|
|
61
170
|
* Call this when a session is complete to proactively free memory.
|
|
62
171
|
*/
|
|
63
172
|
async destroySession(sessionId) {
|
|
64
|
-
await this.redis.del(this.vaultKey(sessionId), this.reverseKey(sessionId));
|
|
173
|
+
await this.redis.del(this.vaultKey(sessionId), this.reverseKey(sessionId), this.counterKey(sessionId));
|
|
65
174
|
}
|
|
66
175
|
/**
|
|
67
176
|
* Returns whether the Redis connection is healthy.
|
|
@@ -81,6 +190,50 @@ class TokenVault {
|
|
|
81
190
|
async close() {
|
|
82
191
|
await this.redis.quit();
|
|
83
192
|
}
|
|
193
|
+
valueDigest(rawValue) {
|
|
194
|
+
if (!this.indexKey)
|
|
195
|
+
return rawValue;
|
|
196
|
+
return (0, crypto_1.createHmac)('sha256', this.indexKey).update(rawValue).digest('hex');
|
|
197
|
+
}
|
|
198
|
+
encodeValue(rawValue, sessionId) {
|
|
199
|
+
if (!this.encryptionKey)
|
|
200
|
+
return `ag0:${rawValue}`;
|
|
201
|
+
const iv = (0, crypto_1.randomBytes)(12);
|
|
202
|
+
const cipher = (0, crypto_1.createCipheriv)('aes-256-gcm', this.encryptionKey, iv);
|
|
203
|
+
cipher.setAAD(Buffer.from(sessionId, 'utf8'));
|
|
204
|
+
const encrypted = Buffer.concat([cipher.update(rawValue, 'utf8'), cipher.final()]);
|
|
205
|
+
return [
|
|
206
|
+
'ag1',
|
|
207
|
+
iv.toString('base64url'),
|
|
208
|
+
cipher.getAuthTag().toString('base64url'),
|
|
209
|
+
encrypted.toString('base64url'),
|
|
210
|
+
].join(':');
|
|
211
|
+
}
|
|
212
|
+
decodeValue(storedValue, sessionId) {
|
|
213
|
+
if (storedValue.startsWith('ag0:'))
|
|
214
|
+
return storedValue.slice(4);
|
|
215
|
+
if (!storedValue.startsWith('ag1:'))
|
|
216
|
+
return storedValue;
|
|
217
|
+
if (!this.encryptionKey) {
|
|
218
|
+
throw new Error('Vault data is encrypted; configure vaultEncryptionKey to read it.');
|
|
219
|
+
}
|
|
220
|
+
const [, encodedIv, encodedTag, encodedCiphertext] = storedValue.split(':');
|
|
221
|
+
if (!encodedIv || !encodedTag || encodedCiphertext === undefined) {
|
|
222
|
+
throw new Error('Vault contains an invalid encrypted value.');
|
|
223
|
+
}
|
|
224
|
+
try {
|
|
225
|
+
const decipher = (0, crypto_1.createDecipheriv)('aes-256-gcm', this.encryptionKey, Buffer.from(encodedIv, 'base64url'));
|
|
226
|
+
decipher.setAAD(Buffer.from(sessionId, 'utf8'));
|
|
227
|
+
decipher.setAuthTag(Buffer.from(encodedTag, 'base64url'));
|
|
228
|
+
return Buffer.concat([
|
|
229
|
+
decipher.update(Buffer.from(encodedCiphertext, 'base64url')),
|
|
230
|
+
decipher.final(),
|
|
231
|
+
]).toString('utf8');
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
throw new Error('Unable to decrypt vault value; verify vaultEncryptionKey.');
|
|
235
|
+
}
|
|
236
|
+
}
|
|
84
237
|
}
|
|
85
238
|
exports.TokenVault = TokenVault;
|
|
86
239
|
//# sourceMappingURL=vault.js.map
|
package/dist/vault.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vault.js","sourceRoot":"","sources":["../src/vault.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;AAEH,sDAA4B;
|
|
1
|
+
{"version":3,"file":"vault.js","sourceRoot":"","sources":["../src/vault.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@princeverma130104/agentguard",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Privacy & Context Redaction Middleware for AI Agents — detect, tokenise, and restore PII/credentials in real-time without exposing sensitive data to LLMs.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -23,18 +23,22 @@
|
|
|
23
23
|
"exports": {
|
|
24
24
|
".": {
|
|
25
25
|
"require": "./dist/index.js",
|
|
26
|
+
"default": "./dist/index.js",
|
|
26
27
|
"types": "./dist/index.d.ts"
|
|
27
28
|
},
|
|
28
29
|
"./mastra": {
|
|
29
30
|
"require": "./dist/mastra.js",
|
|
31
|
+
"default": "./dist/mastra.js",
|
|
30
32
|
"types": "./dist/mastra.d.ts"
|
|
31
33
|
},
|
|
32
34
|
"./langchain": {
|
|
33
35
|
"require": "./dist/langchain.js",
|
|
36
|
+
"default": "./dist/langchain.js",
|
|
34
37
|
"types": "./dist/langchain.d.ts"
|
|
35
38
|
},
|
|
36
39
|
"./middleware": {
|
|
37
40
|
"require": "./dist/middleware.js",
|
|
41
|
+
"default": "./dist/middleware.js",
|
|
38
42
|
"types": "./dist/middleware.d.ts"
|
|
39
43
|
}
|
|
40
44
|
},
|