@rasputin-ai/browser 0.7.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.
@@ -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.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.1";
3
+ export declare const SDK_VERSION = "0.8.0";
4
4
  //# sourceMappingURL=sdk-meta.d.ts.map
@@ -10,6 +10,64 @@ var compactRuntimeFunctionId = (moduleIndex, planIndex) => `${moduleIndex}.${pla
10
10
  // ../core/src/create-ingest-event/truncate-ingest-message.ts
11
11
  var MAX_MESSAGE_BYTES = 8 * 1024;
12
12
 
13
+ // ../core/src/derivation/sensitive-property-name.ts
14
+ var DEFAULT_SENSITIVE_PROPERTY_NAMES = [
15
+ "password",
16
+ "passwd",
17
+ "pwd",
18
+ "passphrase",
19
+ "cookie",
20
+ "cookies",
21
+ "signedcookies",
22
+ "setcookie",
23
+ "secret",
24
+ "secrets",
25
+ "clientsecret",
26
+ "authorization",
27
+ "proxyauthorization",
28
+ "bearer"
29
+ ];
30
+ var DEFAULT_SENSITIVE_PROPERTY_NAME_SET = new Set(DEFAULT_SENSITIVE_PROPERTY_NAMES);
31
+ var SENSITIVE_SUFFIXES = [
32
+ "password",
33
+ "passwd",
34
+ "passphrase",
35
+ "pwd",
36
+ "cookie",
37
+ "cookies"
38
+ ];
39
+ var compactKey = (key) => {
40
+ let compacted = "";
41
+ for (let index = 0; index < key.length; index++) {
42
+ const code = key.charCodeAt(index);
43
+ if (code === 45 || code === 46 || code === 95) continue;
44
+ compacted += code >= 65 && code <= 90 ? String.fromCharCode(code + 32) : key[index];
45
+ }
46
+ return compacted;
47
+ };
48
+ var stripTrailingDigits = (value) => {
49
+ let end = value.length;
50
+ while (end > 0) {
51
+ const code = value.charCodeAt(end - 1);
52
+ if (code < 48 || code > 57) break;
53
+ end--;
54
+ }
55
+ return end === 0 ? value : value.slice(0, end);
56
+ };
57
+ var propertyNameIsSensitive = (key) => {
58
+ const compacted = compactKey(key);
59
+ const compactForms = [compacted, stripTrailingDigits(compacted)].filter(
60
+ (value, index, values) => value.length > 0 && values.indexOf(value) === index
61
+ );
62
+ for (const form of compactForms) {
63
+ if (DEFAULT_SENSITIVE_PROPERTY_NAME_SET.has(form)) return true;
64
+ for (const suffix of SENSITIVE_SUFFIXES) {
65
+ if (form.endsWith(suffix)) return true;
66
+ }
67
+ }
68
+ return false;
69
+ };
70
+
13
71
  // ../core/src/source-identity/source-identity.ts
14
72
  import { createHash } from "node:crypto";
15
73
  import { existsSync, readFileSync } from "node:fs";
@@ -610,6 +668,9 @@ function traceSegmentInternal(segments, memo, line, column, bias) {
610
668
  // ../core/src/resolve-source-maps/resolve-source-maps.ts
611
669
  var MAX_MAP_CACHE_BYTES = 8 * 1024 * 1024;
612
670
 
671
+ // ../core/src/suppression/grouping-ref-cache.ts
672
+ var GROUPING_REF_TTL_MS = 7 * 24 * 60 * 60 * 1e3;
673
+
613
674
  // ../core/src/transport/process-shutdown-hooks.ts
614
675
  var SIGNAL_EXIT_CODES = { SIGTERM: 143, SIGINT: 130 };
615
676
  var RASPUTIN_PROCESS_LISTENER = Symbol.for("rasputin.process.listener.v1");
@@ -685,168 +746,6 @@ var runtimeStateUnavailable = Symbol.for(
685
746
  "rasputin.runtime-state.unavailable"
686
747
  );
687
748
 
688
- // ../core/src/derivation/sensitive-property-name.ts
689
- var DEFAULT_SENSITIVE_PROPERTY_NAMES = [
690
- "password",
691
- "passwd",
692
- "pwd",
693
- "passphrase",
694
- "token",
695
- "accesstoken",
696
- "refreshtoken",
697
- "sessiontoken",
698
- "authorization",
699
- "auth",
700
- "bearer",
701
- "cookie",
702
- "cookies",
703
- "signedcookies",
704
- "setcookie",
705
- "secret",
706
- "secrets",
707
- "clientsecret",
708
- "apikey",
709
- "xapikey",
710
- "credential",
711
- "credentials",
712
- "privatekey",
713
- "privkey",
714
- "pem",
715
- "jwt",
716
- "otp",
717
- "totp",
718
- "pin",
719
- "mfacode",
720
- "sessionid",
721
- "sid",
722
- "databaseurl",
723
- "connectionstring",
724
- "dsn",
725
- "mongouri",
726
- "redisurl",
727
- "signingkey",
728
- "encryptionkey",
729
- "cvv",
730
- "cvc",
731
- "cardnumber",
732
- "ssn",
733
- "creditcard",
734
- "securitycode",
735
- "twofactorcode",
736
- "masterkey",
737
- "servicerolekey",
738
- "stripekey",
739
- "rawheaders"
740
- ];
741
- var DEFAULT_SENSITIVE_PROPERTY_NAME_SET = new Set(DEFAULT_SENSITIVE_PROPERTY_NAMES);
742
- var SENSITIVE_SEGMENTS = /* @__PURE__ */ new Set([
743
- "password",
744
- "passwd",
745
- "pwd",
746
- "passphrase",
747
- "token",
748
- "secret",
749
- "cookie",
750
- "cookies",
751
- "authorization",
752
- "auth",
753
- "bearer",
754
- "credential",
755
- "credentials",
756
- "jwt",
757
- "otp",
758
- "totp",
759
- "pin",
760
- "sid",
761
- "dsn",
762
- "pem",
763
- "privkey",
764
- "cvv",
765
- "cvc",
766
- "ssn",
767
- "secrets"
768
- ]);
769
- var SENSITIVE_SUFFIXES = [
770
- "password",
771
- "passwd",
772
- "token",
773
- "secret",
774
- "apikey",
775
- "privatekey",
776
- "credential",
777
- "credentials",
778
- "cookie"
779
- ];
780
- var compactKey = (key) => {
781
- let compacted = "";
782
- for (let index = 0; index < key.length; index++) {
783
- const code = key.charCodeAt(index);
784
- if (code === 45 || code === 46 || code === 95) continue;
785
- compacted += code >= 65 && code <= 90 ? String.fromCharCode(code + 32) : key[index];
786
- }
787
- return compacted;
788
- };
789
- var stripTrailingDigits = (value) => {
790
- let end = value.length;
791
- while (end > 0) {
792
- const code = value.charCodeAt(end - 1);
793
- if (code < 48 || code > 57) break;
794
- end--;
795
- }
796
- return end === 0 ? value : value.slice(0, end);
797
- };
798
- var segmentsOf = (key) => {
799
- const segments = [];
800
- let current = "";
801
- for (let index = 0; index < key.length; index++) {
802
- const char = key[index] ?? "";
803
- const code = key.charCodeAt(index);
804
- if (code === 45 || code === 46 || code === 95) {
805
- if (current) segments.push(current.toLowerCase());
806
- current = "";
807
- continue;
808
- }
809
- if (current && code >= 65 && code <= 90) {
810
- const prev = current.charCodeAt(current.length - 1);
811
- const prevIsLower = prev >= 97 && prev <= 122;
812
- const next = key.charCodeAt(index + 1);
813
- const nextIsLower = next >= 97 && next <= 122;
814
- if (prevIsLower || nextIsLower) {
815
- segments.push(current.toLowerCase());
816
- current = char;
817
- continue;
818
- }
819
- }
820
- current += char;
821
- }
822
- if (current) segments.push(current.toLowerCase());
823
- return segments;
824
- };
825
- 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";
826
- var propertyNameIsSensitive = (key) => {
827
- const compacted = compactKey(key);
828
- const compactForms = [compacted, stripTrailingDigits(compacted)].filter(
829
- (value, index, values) => value.length > 0 && values.indexOf(value) === index
830
- );
831
- for (const form of compactForms) {
832
- if (DEFAULT_SENSITIVE_PROPERTY_NAME_SET.has(form)) return true;
833
- for (const suffix of SENSITIVE_SUFFIXES) {
834
- if (form.endsWith(suffix)) return true;
835
- }
836
- if (form.includes("apikey") || form.includes("xapikey")) return true;
837
- }
838
- const segments = segmentsOf(key).map((segment) => stripTrailingDigits(segment) || segment);
839
- for (const segment of segments) {
840
- if (SENSITIVE_SEGMENTS.has(segment)) return true;
841
- }
842
- for (let index = 0; index < segments.length - 1; index++) {
843
- const left = segments[index];
844
- const right = segments[index + 1];
845
- if (left && right && adjacentPairsSensitive(left, right)) return true;
846
- }
847
- return false;
848
- };
849
-
850
749
  // ../recorder/src/function-plan.ts
851
750
  var encodeFunctionPlan = (source) => {
852
751
  const locator = sourceLocatorFromFile(source.filePath);
@@ -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.1",
3
+ "version": "0.8.0",
4
4
  "description": "Official Rasputin AI SDK for browser applications.",
5
5
  "type": "module",
6
6
  "exports": {