@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.
@@ -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. Attaches the session ID to the request for downstream deanonymization
18
+ * 3. Keeps the session ID private for paired response restoration
18
19
  */
19
20
  function createRequestMiddleware(guard) {
20
- return async (req, res, next) => {
21
+ return async (req, _res, next) => {
21
22
  try {
22
- if (req.body && typeof req.body === 'object') {
23
- const { sanitized, sessionId } = await anonymizeObject(req.body, guard);
24
- req.body = sanitized;
25
- req.agentGuardSessionId = sessionId;
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.agentGuardSessionId;
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, guard, sessionId)
49
+ guard.deanonymizeObject(body, sessionId)
50
50
  .then((restored) => originalJson(restored))
51
- .catch(() => originalJson(body));
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
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"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"}
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"}
@@ -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,CAyCZ;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAQ/E"}
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] ?? match[0];
30
- const actualStart = match[1] ? text.indexOf(match[1], start) : start;
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);
@@ -1 +1 @@
1
- {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AA2BH,4BA4CC;AAKD,kDAQC;AAlFD,yCAAyE;AAoBzE;;;;GAIG;AACH,SAAgB,QAAQ,CACtB,IAAY,EACZ,iBAA4D,EAAE;IAE9D,MAAM,QAAQ,GAAqB,EAAE,CAAC;IACtC,MAAM,aAAa,GAA4B,EAAE,CAAC;IAElD,KAAK,MAAM,GAAG,IAAI,wBAAa,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,2BAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QACnE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,UAAU,GAAG,oCAAoC,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,KAA6B,CAAC;QAElC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YAC1B,sDAAsD;YACtD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACrE,MAAM,GAAG,GAAG,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;YAEvC,mEAAmE;YACnE,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CACjC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,WAAW,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE,CAC3C,CAAC;YACF,IAAI,QAAQ;gBAAE,SAAS;YAEvB,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,GAAG;gBACT,KAAK;gBACL,UAAU,EAAE,WAAW;gBACvB,QAAQ,EAAE,GAAG;aACd,CAAC,CAAC;YACH,aAAa,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,4DAA4D;IAC5D,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IAErD,OAAO;QACL,QAAQ;QACR,gBAAgB,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;KACtC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CAAC,MAAkB;IACpD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC1C,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
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 ephemeral token vault.
3
+ * @description Redis-backed TTL-expiring token vault.
4
4
  * Manages bidirectional (token ↔ rawValue) session mappings with TTL enforcement.
5
- * Raw PII is NEVER written to disk — all data lives in Redis in-memory store only.
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 undefined if not found (i.e., first occurrence of this value).
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
@@ -1 +1 @@
1
- {"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../src/vault.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,YAAY;IAC3B,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;gBAET,OAAO,GAAE,YAAiB;IAUtC,qEAAqE;IACrE,OAAO,CAAC,QAAQ;IAIhB,qEAAqE;IACrE,OAAO,CAAC,UAAU;IAIlB;;;;OAIG;IACG,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS9E;;;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;IAIlE;;;OAGG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAItD;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAS9B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
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 ephemeral token vault.
4
+ * @description Redis-backed TTL-expiring token vault.
5
5
  * Manages bidirectional (token ↔ rawValue) session mappings with TTL enforcement.
6
- * Raw PII is NEVER written to disk — all data lives in Redis in-memory store only.
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.redis = new ioredis_1.default(options.redisUrl || 'redis://localhost:6379', {
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 pipeline = this.redis.pipeline();
39
- pipeline.hset(this.vaultKey(sessionId), token, rawValue);
40
- pipeline.hset(this.reverseKey(sessionId), rawValue, token);
41
- pipeline.expire(this.vaultKey(sessionId), this.ttl);
42
- pipeline.expire(this.reverseKey(sessionId), this.ttl);
43
- await pipeline.exec();
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 undefined if not found (i.e., first occurrence of this value).
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
- return this.redis.hgetall(this.vaultKey(sessionId)) ?? {};
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;AAS5B,MAAa,UAAU;IAIrB,YAAY,UAAwB,EAAE;QACpC,IAAI,CAAC,KAAK,GAAG,IAAI,iBAAK,CAAC,OAAO,CAAC,QAAQ,IAAI,wBAAwB,EAAE;YACnE,WAAW,EAAE,IAAI;YACjB,oBAAoB,EAAE,CAAC;YACvB,gBAAgB,EAAE,IAAI;YACtB,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,EAAE,IAAI,CAAC;SACtD,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,UAAU,IAAI,GAAG,CAAC;IACvC,CAAC;IAED,qEAAqE;IAC7D,QAAQ,CAAC,SAAiB;QAChC,OAAO,sBAAsB,SAAS,QAAQ,CAAC;IACjD,CAAC;IAED,qEAAqE;IAC7D,UAAU,CAAC,SAAiB;QAClC,OAAO,sBAAsB,SAAS,UAAU,CAAC;IACnD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,SAAiB,EAAE,KAAa,EAAE,QAAgB;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACvC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QACzD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC3D,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACpD,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACtD,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,QAAgB;QACnD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC/D,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ,CAAC,SAAiB;QAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5D,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc,CAAC,SAAiB;QACpC,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACvC,OAAO,MAAM,KAAK,MAAM,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;CACF;AAhFD,gCAgFC"}
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.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
  },