@rasputin-ai/browser 0.7.2-beta.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
- # Official Rasputin AI SDK for browsers
2
-
3
- Report frontend errors to Rasputin from Vite apps.
4
-
5
- See the [browser documentation](https://rasputinai.dev/docs/browser/installation).
1
+ # Official Rasputin AI SDK for browsers
2
+
3
+ Report frontend errors to Rasputin from Vite apps.
4
+
5
+ See the [browser documentation](https://rasputinai.dev/docs/browser/installation).
@@ -16,6 +16,7 @@ type CreateBrowserTransportOptions = {
16
16
  publicKey: string;
17
17
  sdkName: string;
18
18
  sdkVersion: string;
19
+ scrubPii?: boolean;
19
20
  enabled: boolean;
20
21
  fetch?: BrowserTransportFetch;
21
22
  beforeFlush?: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"browser-transport.d.ts","sourceRoot":"","sources":["../src/browser-transport.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AAEpE,KAAK,qBAAqB,GAAG,CAC5B,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,WAAW,KACd,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAQ9C,KAAK,6BAA6B,GAAG;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,qBAAqB,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAkDF,eAAO,MAAM,sBAAsB,GAAI,SAAS,6BAA6B;qBAwDpD,kBAAkB;8BAIT,aAAa;yBA+OlB,MAAM;;oBAoBnB,6BAA6B;CAoB5C,CAAC"}
1
+ {"version":3,"file":"browser-transport.d.ts","sourceRoot":"","sources":["../src/browser-transport.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AAEpE,KAAK,qBAAqB,GAAG,CAC5B,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,WAAW,KACd,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAQ9C,KAAK,6BAA6B,GAAG;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,qBAAqB,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAkDF,eAAO,MAAM,sBAAsB,GAAI,SAAS,6BAA6B;qBAwDpD,kBAAkB;8BAIT,aAAa;yBAgPlB,MAAM;;oBAoBnB,6BAA6B;CAoB5C,CAAC"}
package/dist/index.js CHANGED
@@ -27,13 +27,6 @@ var DEFAULT_SENSITIVE_PROPERTY_NAMES = [
27
27
  "passwd",
28
28
  "pwd",
29
29
  "passphrase",
30
- "token",
31
- "accesstoken",
32
- "refreshtoken",
33
- "sessiontoken",
34
- "authorization",
35
- "auth",
36
- "bearer",
37
30
  "cookie",
38
31
  "cookies",
39
32
  "signedcookies",
@@ -41,77 +34,18 @@ var DEFAULT_SENSITIVE_PROPERTY_NAMES = [
41
34
  "secret",
42
35
  "secrets",
43
36
  "clientsecret",
44
- "apikey",
45
- "xapikey",
46
- "credential",
47
- "credentials",
48
- "privatekey",
49
- "privkey",
50
- "pem",
51
- "jwt",
52
- "otp",
53
- "totp",
54
- "pin",
55
- "mfacode",
56
- "sessionid",
57
- "sid",
58
- "databaseurl",
59
- "connectionstring",
60
- "dsn",
61
- "mongouri",
62
- "redisurl",
63
- "signingkey",
64
- "encryptionkey",
65
- "cvv",
66
- "cvc",
67
- "cardnumber",
68
- "ssn",
69
- "creditcard",
70
- "securitycode",
71
- "twofactorcode",
72
- "masterkey",
73
- "servicerolekey",
74
- "stripekey",
75
- "rawheaders"
37
+ "authorization",
38
+ "proxyauthorization",
39
+ "bearer"
76
40
  ];
77
41
  var DEFAULT_SENSITIVE_PROPERTY_NAME_SET = new Set(DEFAULT_SENSITIVE_PROPERTY_NAMES);
78
- var SENSITIVE_SEGMENTS = /* @__PURE__ */ new Set([
42
+ var SENSITIVE_SUFFIXES = [
79
43
  "password",
80
44
  "passwd",
81
- "pwd",
82
45
  "passphrase",
83
- "token",
84
- "secret",
46
+ "pwd",
85
47
  "cookie",
86
- "cookies",
87
- "authorization",
88
- "auth",
89
- "bearer",
90
- "credential",
91
- "credentials",
92
- "jwt",
93
- "otp",
94
- "totp",
95
- "pin",
96
- "sid",
97
- "dsn",
98
- "pem",
99
- "privkey",
100
- "cvv",
101
- "cvc",
102
- "ssn",
103
- "secrets"
104
- ]);
105
- var SENSITIVE_SUFFIXES = [
106
- "password",
107
- "passwd",
108
- "token",
109
- "secret",
110
- "apikey",
111
- "privatekey",
112
- "credential",
113
- "credentials",
114
- "cookie"
48
+ "cookies"
115
49
  ];
116
50
  var compactKey = (key) => {
117
51
  let compacted = "";
@@ -131,34 +65,6 @@ var stripTrailingDigits = (value) => {
131
65
  }
132
66
  return end === 0 ? value : value.slice(0, end);
133
67
  };
134
- var segmentsOf = (key) => {
135
- const segments = [];
136
- let current = "";
137
- for (let index = 0; index < key.length; index++) {
138
- const char = key[index] ?? "";
139
- const code = key.charCodeAt(index);
140
- if (code === 45 || code === 46 || code === 95) {
141
- if (current) segments.push(current.toLowerCase());
142
- current = "";
143
- continue;
144
- }
145
- if (current && code >= 65 && code <= 90) {
146
- const prev = current.charCodeAt(current.length - 1);
147
- const prevIsLower = prev >= 97 && prev <= 122;
148
- const next = key.charCodeAt(index + 1);
149
- const nextIsLower = next >= 97 && next <= 122;
150
- if (prevIsLower || nextIsLower) {
151
- segments.push(current.toLowerCase());
152
- current = char;
153
- continue;
154
- }
155
- }
156
- current += char;
157
- }
158
- if (current) segments.push(current.toLowerCase());
159
- return segments;
160
- };
161
- var adjacentPairsSensitive = (left, right) => left === "api" && right === "key" || left === "private" && right === "key" || left === "client" && right === "secret" || left === "set" && right === "cookie" || left === "database" && right === "url" || left === "connection" && right === "string" || left === "mongo" && (right === "uri" || right === "url") || left === "mongodb" && (right === "uri" || right === "url") || left === "redis" && (right === "uri" || right === "url") || left === "postgres" && (right === "uri" || right === "url") || left === "database" && right === "uri" || left === "signing" && right === "key" || left === "master" && right === "key" || left === "stripe" && right === "key" || left === "service" && right === "role" || left === "security" && right === "code" || left === "two" && right === "factor" || left === "encryption" && right === "key" || left === "session" && (right === "id" || right === "key" || right === "token") || left === "card" && right === "number" || left === "mfa" && right === "code";
162
68
  var propertyNameIsSensitive = (key) => {
163
69
  const compacted = compactKey(key);
164
70
  const compactForms = [compacted, stripTrailingDigits(compacted)].filter(
@@ -169,16 +75,6 @@ var propertyNameIsSensitive = (key) => {
169
75
  for (const suffix of SENSITIVE_SUFFIXES) {
170
76
  if (form.endsWith(suffix)) return true;
171
77
  }
172
- if (form.includes("apikey") || form.includes("xapikey")) return true;
173
- }
174
- const segments = segmentsOf(key).map((segment) => stripTrailingDigits(segment) || segment);
175
- for (const segment of segments) {
176
- if (SENSITIVE_SEGMENTS.has(segment)) return true;
177
- }
178
- for (let index = 0; index < segments.length - 1; index++) {
179
- const left = segments[index];
180
- const right = segments[index + 1];
181
- if (left && right && adjacentPairsSensitive(left, right)) return true;
182
78
  }
183
79
  return false;
184
80
  };
@@ -204,12 +100,6 @@ var toStackFrame = (frame) => {
204
100
  };
205
101
  var framesToStackFrames = (frames) => frames.slice(0, MAX_STACK_FRAMES).map(toStackFrame).filter((frame) => frame !== null);
206
102
 
207
- // ../core/src/suppression/identity-needs-message-template.ts
208
- var identityNeedsMessageTemplate = (type, code) => {
209
- if (code != null && code !== "") return false;
210
- return type === "Error";
211
- };
212
-
213
103
  // ../core/src/suppression/parameterize-message.ts
214
104
  var MAX_INPUT_LENGTH = 8192;
215
105
  var IPV4 = /^(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$/;
@@ -266,10 +156,6 @@ var RULES = [
266
156
  {
267
157
  token: "duration",
268
158
  pattern: /\b\d+(?:\.\d+)?\s?(?:ns|µs|us|ms|secs?|seconds?|mins?|minutes?|hrs?|hours?|days?)\b/giu
269
- },
270
- {
271
- token: "id",
272
- pattern: /\b(?=[a-z0-9]*[a-z])(?=[a-z0-9]*\d)[a-z0-9]{8,}\b/giu
273
159
  }
274
160
  ];
275
161
  var normalizeForIdentity = (normalized) => {
@@ -330,19 +216,22 @@ var frameBurstParts = (frames) => {
330
216
  const inApp = collapsed.filter((frame) => frame.in_app);
331
217
  const selected = (inApp.length > 0 ? inApp : collapsed).slice(0, FRAME_COUNT);
332
218
  return selected.map((frame) => {
333
- const file = preferredFile(frame);
219
+ const loc = frame.original ?? frame.generated;
334
220
  const fn = normalizeFunction(frame.function ?? frame.original?.name);
335
- return `${file}:${fn}`;
221
+ return `${loc.file}:${fn}:${loc.line ?? ""}:${loc.column ?? ""}`;
336
222
  });
337
223
  };
338
- var computeBurstKey = (errorType, message, code, frames) => {
224
+ var computeBurstKey = (errorType, message, code, frames, route, method) => {
339
225
  const parts = frameBurstParts(frames);
340
226
  const codePart = code ?? "";
341
- let key = `${errorType}\0${codePart}\0${parts.join("\0")}`;
342
- if (parts.length === 0 || identityNeedsMessageTemplate(errorType, code)) {
343
- key += `\0${parameterizeMessage(message)}`;
344
- }
345
- return key;
227
+ return [
228
+ errorType,
229
+ codePart,
230
+ method ?? "",
231
+ route ?? "",
232
+ parameterizeMessage(message),
233
+ parts.join("\0")
234
+ ].join("\0");
346
235
  };
347
236
 
348
237
  // ../core/src/suppression/create-suppression.ts
@@ -393,9 +282,12 @@ var createSuppression = (options = {}) => {
393
282
  windowStart: bucket.windowStart,
394
283
  windowEndMs,
395
284
  lastRelease: bucket.lastRelease,
285
+ lastRoute: bucket.lastRoute,
286
+ lastMethod: bucket.lastMethod,
396
287
  lastEnvironment: bucket.lastEnvironment,
397
288
  identity: bucket.identity,
398
- captureRawFrames: bucket.captureRawFrames
289
+ captureRawFrames: bucket.captureRawFrames,
290
+ burstKey: bucket.burstKey
399
291
  });
400
292
  const toSummary = (draft, identity) => ({
401
293
  count: draft.count,
@@ -403,7 +295,8 @@ var createSuppression = (options = {}) => {
403
295
  window_end: new Date(draft.windowEndMs).toISOString(),
404
296
  release: draft.lastRelease,
405
297
  environment: draft.lastEnvironment,
406
- ...identity
298
+ ...identity,
299
+ ...draft.lastRoute || draft.lastMethod ? { request: { route: draft.lastRoute, method: draft.lastMethod } } : {}
407
300
  });
408
301
  const flushSuppressed = (bucket, windowEndMs) => {
409
302
  if (bucket.suppressed <= 0) return;
@@ -414,9 +307,17 @@ var createSuppression = (options = {}) => {
414
307
  const now = input.now ?? Date.now();
415
308
  const identity = captureIdentity(input);
416
309
  const captureRawFrames = (input.rawFrames ?? []).slice(0, MAX_STACK_FRAMES);
417
- const burstKey = computeBurstKey(input.errorType, input.message, input.code, input.frames);
310
+ const burstKey = computeBurstKey(
311
+ input.errorType,
312
+ input.message,
313
+ input.code,
314
+ input.frames,
315
+ input.route,
316
+ input.method
317
+ );
418
318
  const release = input.release;
419
319
  const route = input.route ?? null;
320
+ const method = input.method ?? null;
420
321
  let bucket = burstBuckets.get(burstKey);
421
322
  if (!bucket) {
422
323
  bucket = {
@@ -425,9 +326,11 @@ var createSuppression = (options = {}) => {
425
326
  windowStart: now,
426
327
  lastRelease: release,
427
328
  lastRoute: route,
329
+ lastMethod: method,
428
330
  lastEnvironment: input.environment,
429
331
  identity,
430
- captureRawFrames
332
+ captureRawFrames,
333
+ burstKey
431
334
  };
432
335
  burstBuckets.set(burstKey, bucket);
433
336
  evictIfNeeded();
@@ -442,6 +345,7 @@ var createSuppression = (options = {}) => {
442
345
  bucket.windowStart = now;
443
346
  bucket.lastRelease = release;
444
347
  bucket.lastRoute = route;
348
+ bucket.lastMethod = method;
445
349
  bucket.lastEnvironment = input.environment;
446
350
  bucket.identity = identity;
447
351
  bucket.captureRawFrames = captureRawFrames;
@@ -451,6 +355,7 @@ var createSuppression = (options = {}) => {
451
355
  bucket.sentInWindow += 1;
452
356
  bucket.lastRelease = release;
453
357
  bucket.lastRoute = route;
358
+ bucket.lastMethod = method;
454
359
  bucket.lastEnvironment = input.environment;
455
360
  return { action: "send", priority: "repeat" };
456
361
  }
@@ -467,7 +372,8 @@ var createSuppression = (options = {}) => {
467
372
  }
468
373
  return drafts.map((draft) => ({
469
374
  summary: toSummary(draft, draft.identity),
470
- rawFrames: draft.captureRawFrames
375
+ rawFrames: draft.captureRawFrames,
376
+ burstKey: draft.burstKey
471
377
  }));
472
378
  };
473
379
  const takeSummaries = async (now = Date.now(), prepareSummary) => {
@@ -2978,6 +2884,7 @@ var createBrowserTransport = (options) => {
2978
2884
  ...summaries.length > 0 ? { summaries } : {},
2979
2885
  sdk_version: options.sdkVersion,
2980
2886
  sdk_name: options.sdkName,
2887
+ scrub_pii: options.scrubPii !== false,
2981
2888
  idempotency_key: idempotencyKey
2982
2889
  });
2983
2890
  const shrinkUnloadBody = (events, summaries, idempotencyKey) => {
@@ -3444,11 +3351,11 @@ var mapBrowserRuntimeState = (snapshot, buildId) => {
3444
3351
 
3445
3352
  // src/sdk-meta.ts
3446
3353
  var SDK_NAME = "@rasputin-ai/browser";
3447
- var SDK_VERSION = "0.7.2-beta.1";
3354
+ var SDK_VERSION = "0.8.0";
3448
3355
 
3449
3356
  // src/rasputin-init.ts
3450
- var DEFAULT_API_URL = "https://api.rasputinai.dev";
3451
3357
  var SLOT = Symbol.for("rasputin.browser.client.v1");
3358
+ var DEFAULT_API_URL = "https://api.rasputinai.dev";
3452
3359
  var emptyTransport = () => ({
3453
3360
  queued: 0,
3454
3361
  enqueued: 0,
@@ -3626,6 +3533,7 @@ var RasputinInit = (options) => {
3626
3533
  publicKey: parsed.publicKey,
3627
3534
  sdkName: SDK_NAME,
3628
3535
  sdkVersion: SDK_VERSION,
3536
+ scrubPii: internal.scrubPII !== false,
3629
3537
  enabled: ingestEnabled,
3630
3538
  fetch: internal.fetch,
3631
3539
  beforeFlush: () => enqueuePendingSummaries()
@@ -46,6 +46,14 @@ export type RasputinBrowserOptions = {
46
46
  * Observe `window` `error` and `unhandledrejection`. Default true.
47
47
  */
48
48
  installGlobalHandlers?: boolean;
49
+ /**
50
+ * When `true`, the ingest API also redacts PII such as names, emails, and
51
+ * phone numbers from stored runtime state. Authentication secrets are always
52
+ * redacted. Set to `false` to keep personal data in captured values.
53
+ *
54
+ * @default true
55
+ */
56
+ scrubPII?: boolean;
49
57
  };
50
58
  export type RasputinBrowserTransportStats = {
51
59
  queued: number;
@@ -1 +1 @@
1
- {"version":3,"file":"public-types.d.ts","sourceRoot":"","sources":["../src/public-types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"public-types.d.ts","sourceRoot":"","sources":["../src/public-types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"rasputin-init.d.ts","sourceRoot":"","sources":["../src/rasputin-init.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EACX,qBAAqB,EAGrB,sBAAsB,EAGtB,MAAM,gBAAgB,CAAC;AAmKxB;;GAEG;AACH,eAAO,MAAM,YAAY,GAAI,SAAS,sBAAsB,KAAG,qBAqJ9D,CAAC"}
1
+ {"version":3,"file":"rasputin-init.d.ts","sourceRoot":"","sources":["../src/rasputin-init.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACX,qBAAqB,EAGrB,sBAAsB,EAGtB,MAAM,gBAAgB,CAAC;AAoKxB;;GAEG;AACH,eAAO,MAAM,YAAY,GAAI,SAAS,sBAAsB,KAAG,qBAsJ9D,CAAC"}
@@ -1,4 +1,4 @@
1
1
  /** Generated by scripts/generate-sdk-meta.ts — do not edit. */
2
2
  export declare const SDK_NAME = "@rasputin-ai/browser";
3
- export declare const SDK_VERSION = "0.7.2-beta.1";
3
+ export declare const SDK_VERSION = "0.8.0";
4
4
  //# sourceMappingURL=sdk-meta.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sdk-meta.d.ts","sourceRoot":"","sources":["../src/sdk-meta.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,eAAO,MAAM,QAAQ,yBAAyB,CAAC;AAC/C,eAAO,MAAM,WAAW,iBAAiB,CAAC"}
1
+ {"version":3,"file":"sdk-meta.d.ts","sourceRoot":"","sources":["../src/sdk-meta.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,eAAO,MAAM,QAAQ,yBAAyB,CAAC;AAC/C,eAAO,MAAM,WAAW,UAAU,CAAC"}
@@ -16,13 +16,6 @@ var DEFAULT_SENSITIVE_PROPERTY_NAMES = [
16
16
  "passwd",
17
17
  "pwd",
18
18
  "passphrase",
19
- "token",
20
- "accesstoken",
21
- "refreshtoken",
22
- "sessiontoken",
23
- "authorization",
24
- "auth",
25
- "bearer",
26
19
  "cookie",
27
20
  "cookies",
28
21
  "signedcookies",
@@ -30,77 +23,18 @@ var DEFAULT_SENSITIVE_PROPERTY_NAMES = [
30
23
  "secret",
31
24
  "secrets",
32
25
  "clientsecret",
33
- "apikey",
34
- "xapikey",
35
- "credential",
36
- "credentials",
37
- "privatekey",
38
- "privkey",
39
- "pem",
40
- "jwt",
41
- "otp",
42
- "totp",
43
- "pin",
44
- "mfacode",
45
- "sessionid",
46
- "sid",
47
- "databaseurl",
48
- "connectionstring",
49
- "dsn",
50
- "mongouri",
51
- "redisurl",
52
- "signingkey",
53
- "encryptionkey",
54
- "cvv",
55
- "cvc",
56
- "cardnumber",
57
- "ssn",
58
- "creditcard",
59
- "securitycode",
60
- "twofactorcode",
61
- "masterkey",
62
- "servicerolekey",
63
- "stripekey",
64
- "rawheaders"
26
+ "authorization",
27
+ "proxyauthorization",
28
+ "bearer"
65
29
  ];
66
30
  var DEFAULT_SENSITIVE_PROPERTY_NAME_SET = new Set(DEFAULT_SENSITIVE_PROPERTY_NAMES);
67
- var SENSITIVE_SEGMENTS = /* @__PURE__ */ new Set([
31
+ var SENSITIVE_SUFFIXES = [
68
32
  "password",
69
33
  "passwd",
70
- "pwd",
71
34
  "passphrase",
72
- "token",
73
- "secret",
35
+ "pwd",
74
36
  "cookie",
75
- "cookies",
76
- "authorization",
77
- "auth",
78
- "bearer",
79
- "credential",
80
- "credentials",
81
- "jwt",
82
- "otp",
83
- "totp",
84
- "pin",
85
- "sid",
86
- "dsn",
87
- "pem",
88
- "privkey",
89
- "cvv",
90
- "cvc",
91
- "ssn",
92
- "secrets"
93
- ]);
94
- var SENSITIVE_SUFFIXES = [
95
- "password",
96
- "passwd",
97
- "token",
98
- "secret",
99
- "apikey",
100
- "privatekey",
101
- "credential",
102
- "credentials",
103
- "cookie"
37
+ "cookies"
104
38
  ];
105
39
  var compactKey = (key) => {
106
40
  let compacted = "";
@@ -120,34 +54,6 @@ var stripTrailingDigits = (value) => {
120
54
  }
121
55
  return end === 0 ? value : value.slice(0, end);
122
56
  };
123
- var segmentsOf = (key) => {
124
- const segments = [];
125
- let current = "";
126
- for (let index = 0; index < key.length; index++) {
127
- const char = key[index] ?? "";
128
- const code = key.charCodeAt(index);
129
- if (code === 45 || code === 46 || code === 95) {
130
- if (current) segments.push(current.toLowerCase());
131
- current = "";
132
- continue;
133
- }
134
- if (current && code >= 65 && code <= 90) {
135
- const prev = current.charCodeAt(current.length - 1);
136
- const prevIsLower = prev >= 97 && prev <= 122;
137
- const next = key.charCodeAt(index + 1);
138
- const nextIsLower = next >= 97 && next <= 122;
139
- if (prevIsLower || nextIsLower) {
140
- segments.push(current.toLowerCase());
141
- current = char;
142
- continue;
143
- }
144
- }
145
- current += char;
146
- }
147
- if (current) segments.push(current.toLowerCase());
148
- return segments;
149
- };
150
- var adjacentPairsSensitive = (left, right) => left === "api" && right === "key" || left === "private" && right === "key" || left === "client" && right === "secret" || left === "set" && right === "cookie" || left === "database" && right === "url" || left === "connection" && right === "string" || left === "mongo" && (right === "uri" || right === "url") || left === "mongodb" && (right === "uri" || right === "url") || left === "redis" && (right === "uri" || right === "url") || left === "postgres" && (right === "uri" || right === "url") || left === "database" && right === "uri" || left === "signing" && right === "key" || left === "master" && right === "key" || left === "stripe" && right === "key" || left === "service" && right === "role" || left === "security" && right === "code" || left === "two" && right === "factor" || left === "encryption" && right === "key" || left === "session" && (right === "id" || right === "key" || right === "token") || left === "card" && right === "number" || left === "mfa" && right === "code";
151
57
  var propertyNameIsSensitive = (key) => {
152
58
  const compacted = compactKey(key);
153
59
  const compactForms = [compacted, stripTrailingDigits(compacted)].filter(
@@ -158,16 +64,6 @@ var propertyNameIsSensitive = (key) => {
158
64
  for (const suffix of SENSITIVE_SUFFIXES) {
159
65
  if (form.endsWith(suffix)) return true;
160
66
  }
161
- if (form.includes("apikey") || form.includes("xapikey")) return true;
162
- }
163
- const segments = segmentsOf(key).map((segment) => stripTrailingDigits(segment) || segment);
164
- for (const segment of segments) {
165
- if (SENSITIVE_SEGMENTS.has(segment)) return true;
166
- }
167
- for (let index = 0; index < segments.length - 1; index++) {
168
- const left = segments[index];
169
- const right = segments[index + 1];
170
- if (left && right && adjacentPairsSensitive(left, right)) return true;
171
67
  }
172
68
  return false;
173
69
  };
@@ -772,6 +668,9 @@ function traceSegmentInternal(segments, memo, line, column, bias) {
772
668
  // ../core/src/resolve-source-maps/resolve-source-maps.ts
773
669
  var MAX_MAP_CACHE_BYTES = 8 * 1024 * 1024;
774
670
 
671
+ // ../core/src/suppression/grouping-ref-cache.ts
672
+ var GROUPING_REF_TTL_MS = 7 * 24 * 60 * 60 * 1e3;
673
+
775
674
  // ../core/src/transport/process-shutdown-hooks.ts
776
675
  var SIGNAL_EXIT_CODES = { SIGTERM: 143, SIGINT: 130 };
777
676
  var RASPUTIN_PROCESS_LISTENER = Symbol.for("rasputin.process.listener.v1");
@@ -2379,6 +2278,35 @@ var JSON_METHOD_CALLEE = "globalThis.__rasputinM";
2379
2278
  var JSON_AWAIT_CALLEE = "globalThis.__rasputinA";
2380
2279
  var JSON_ADOPT_CALLEE = "globalThis.__rasputinP";
2381
2280
  var JSON_PRODUCER_GUARD = "globalThis.__rasputinM??=function(r,f){return Reflect.apply(f,r,[].slice.call(arguments,2))};globalThis.__rasputinA??=function(v){return v};globalThis.__rasputinP??=function(p){return p};";
2281
+ var NON_PROVENANCE_ROOTS = /* @__PURE__ */ new Set([
2282
+ "String",
2283
+ "Number",
2284
+ "Boolean",
2285
+ "Object",
2286
+ "Array",
2287
+ "Error",
2288
+ "TypeError",
2289
+ "RangeError",
2290
+ "SyntaxError",
2291
+ "URIError",
2292
+ "EvalError",
2293
+ "ReferenceError",
2294
+ "Symbol",
2295
+ "BigInt",
2296
+ "Math",
2297
+ "JSON",
2298
+ "Date",
2299
+ "Promise",
2300
+ "console",
2301
+ "parseInt",
2302
+ "parseFloat",
2303
+ "isNaN",
2304
+ "isFinite",
2305
+ "encodeURIComponent",
2306
+ "decodeURIComponent",
2307
+ "encodeURI",
2308
+ "decodeURI"
2309
+ ]);
2382
2310
  var isSimpleReceiver = (expression) => {
2383
2311
  const receiver = peel(expression);
2384
2312
  return ts10.isIdentifier(receiver) || receiver.kind === ts10.SyntaxKind.ThisKeyword;
@@ -2459,35 +2387,6 @@ var isReturnedOrBoundCall = (node) => {
2459
2387
  }
2460
2388
  return false;
2461
2389
  };
2462
- var NON_PROVENANCE_ROOTS = /* @__PURE__ */ new Set([
2463
- "String",
2464
- "Number",
2465
- "Boolean",
2466
- "Object",
2467
- "Array",
2468
- "Error",
2469
- "TypeError",
2470
- "RangeError",
2471
- "SyntaxError",
2472
- "URIError",
2473
- "EvalError",
2474
- "ReferenceError",
2475
- "Symbol",
2476
- "BigInt",
2477
- "Math",
2478
- "JSON",
2479
- "Date",
2480
- "Promise",
2481
- "console",
2482
- "parseInt",
2483
- "parseFloat",
2484
- "isNaN",
2485
- "isFinite",
2486
- "encodeURIComponent",
2487
- "decodeURIComponent",
2488
- "encodeURI",
2489
- "decodeURI"
2490
- ]);
2491
2390
  var callCanCarryProvenance = (node) => {
2492
2391
  const name = methodName(node);
2493
2392
  if (name === "json" || name === "parse") return true;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rasputin-ai/browser",
3
- "version": "0.7.2-beta.1",
3
+ "version": "0.8.0",
4
4
  "description": "Official Rasputin AI SDK for browser applications.",
5
5
  "type": "module",
6
6
  "exports": {