@rasputin-ai/core 0.7.1 → 0.7.2-beta.1

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,3 +1,3 @@
1
- # Rasputin AI SDK — Core
2
-
3
- Low-level error capture, stack parsing, source maps, and ingest transport. Most applications should use [@rasputin-ai/node](https://www.npmjs.com/package/@rasputin-ai/node), [@rasputin-ai/elysia](https://www.npmjs.com/package/@rasputin-ai/elysia), or [@rasputin-ai/browser](https://www.npmjs.com/package/@rasputin-ai/browser) instead.
1
+ # Rasputin AI SDK — Core
2
+
3
+ Low-level error capture, stack parsing, source maps, and ingest transport. Most applications should use [@rasputin-ai/node](https://www.npmjs.com/package/@rasputin-ai/node), [@rasputin-ai/elysia](https://www.npmjs.com/package/@rasputin-ai/elysia), or [@rasputin-ai/browser](https://www.npmjs.com/package/@rasputin-ai/browser) instead.
@@ -1 +1 @@
1
- {"version":3,"file":"create-client.d.ts","sourceRoot":"","sources":["../../src/create-client/create-client.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAwBhG,kFAAkF;AAClF,eAAO,MAAM,sBAAsB,YAGlC,CAAC;AAaF;;;GAGG;AACH,eAAO,MAAM,YAAY,GACxB,SAAS,eAAe,EACxB,QAAO,iBAAsB,KAC3B,cAkKF,CAAC"}
1
+ {"version":3,"file":"create-client.d.ts","sourceRoot":"","sources":["../../src/create-client/create-client.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAwBhG,kFAAkF;AAClF,eAAO,MAAM,sBAAsB,YAGlC,CAAC;AAaF;;;GAGG;AACH,eAAO,MAAM,YAAY,GACxB,SAAS,eAAe,EACxB,QAAO,iBAAsB,KAC3B,cAoKF,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Wire/runtime placeholder when a captured value was hidden. Keep in sync with `packages/~core/constants/rasputin-redacted.ts`. */
2
+ export declare const RASPUTIN_REDACTED: "[RASPUTIN_REDACTED]";
3
+ //# sourceMappingURL=rasputin-redacted.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rasputin-redacted.d.ts","sourceRoot":"","sources":["../../src/derivation/rasputin-redacted.ts"],"names":[],"mappings":"AAAA,oIAAoI;AACpI,eAAO,MAAM,iBAAiB,EAAG,qBAA8B,CAAC"}
@@ -0,0 +1,10 @@
1
+ type EnvSecretMatcher = {
2
+ redact: (text: string) => string;
3
+ needleCount: number;
4
+ };
5
+ export declare const MAX_ENV_SECRET_NEEDLE_LENGTH = 512;
6
+ export declare const collectEnvSecretValues: (env?: NodeJS.ProcessEnv) => string[];
7
+ export declare const createExactSecretMatcher: (secrets: readonly string[]) => EnvSecretMatcher;
8
+ export declare const createEnvSecretMatcher: (env?: NodeJS.ProcessEnv) => EnvSecretMatcher;
9
+ export {};
10
+ //# sourceMappingURL=redact-env-secret-values.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact-env-secret-values.d.ts","sourceRoot":"","sources":["../../src/derivation/redact-env-secret-values.ts"],"names":[],"mappings":"AAOA,KAAK,gBAAgB,GAAG;IACvB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;CACpB,CAAC;AAIF,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAsHhD,eAAO,MAAM,sBAAsB,GAAI,MAAK,MAAM,CAAC,UAAwB,KAAG,MAAM,EA4CnF,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAI,SAAS,SAAS,MAAM,EAAE,KAAG,gBAgCrE,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,MAAK,MAAM,CAAC,UAAwB,KAAG,gBAM7E,CAAC"}
package/dist/index.d.ts CHANGED
@@ -10,7 +10,9 @@ export { createIngestEvent } from './create-ingest-event/create-ingest-event';
10
10
  export type { RequestContext } from './create-ingest-event/create-ingest-event-types';
11
11
  export type { RuntimeAwaitedEvent, RuntimeCaptureCoverage, RuntimeCaptureProfile, RuntimeExecutionEvent, RuntimeExecutionKind, RuntimeExecutionMetadata, RuntimeExecutionRecorderMetrics, RuntimeExecutionRequest, RuntimeExecutionState, RuntimeExpressionObservedEvent, RuntimeFunctionCallsSuppressedEvent, RuntimeFunctionEnterEvent, RuntimeFunctionExitEvent, RuntimeFunctionThrowEvent, RuntimeHistoryLink, RuntimeProvenance, RuntimeStateSizeTruncation, RuntimeThrowLocation, } from './create-ingest-event/runtime-execution-state-types';
12
12
  export { hashInstrumentationManifest } from './derivation/hash-instrumentation-manifest';
13
+ export { RASPUTIN_REDACTED } from './derivation/rasputin-redacted';
13
14
  export { isRasputinTaggedValue, RASPUTIN_WIRE_TAG, type RasputinTaggedValue, rasputinOmitted, rasputinRedacted, rasputinTagKind, rasputinTruncated, rasputinUnavailable, rasputinUnknown, } from './derivation/rasputin-wire-tag';
15
+ export { createEnvSecretMatcher, MAX_ENV_SECRET_NEEDLE_LENGTH, } from './derivation/redact-env-secret-values';
14
16
  export { defaultSensitivePropertyNames, propertyNameIsSensitive, } from './derivation/sensitive-property-name';
15
17
  export type { InstrumentationArgIdentifier, InstrumentationManifestCallSite, InstrumentationManifestContent, InstrumentationManifestDestructure, InstrumentationManifestFunction, InstrumentationParamBinding, InstrumentationSkipReason, SourceVerification, SourceVerificationIssue, } from './instrumentation-manifest/instrumentation-manifest-types';
16
18
  export { INSTRUMENTATION_MANIFEST_SCHEMA_VERSION } from './instrumentation-manifest/instrumentation-manifest-types';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -361,6 +361,356 @@ var finalizeResolution = (resolution, stackFrames) => {
361
361
  return "exact";
362
362
  };
363
363
 
364
+ // src/derivation/rasputin-redacted.ts
365
+ var RASPUTIN_REDACTED = "[RASPUTIN_REDACTED]";
366
+
367
+ // src/derivation/sensitive-property-name.ts
368
+ var DEFAULT_SENSITIVE_PROPERTY_NAMES = [
369
+ "password",
370
+ "passwd",
371
+ "pwd",
372
+ "passphrase",
373
+ "token",
374
+ "accesstoken",
375
+ "refreshtoken",
376
+ "sessiontoken",
377
+ "authorization",
378
+ "auth",
379
+ "bearer",
380
+ "cookie",
381
+ "cookies",
382
+ "signedcookies",
383
+ "setcookie",
384
+ "secret",
385
+ "secrets",
386
+ "clientsecret",
387
+ "apikey",
388
+ "xapikey",
389
+ "credential",
390
+ "credentials",
391
+ "privatekey",
392
+ "privkey",
393
+ "pem",
394
+ "jwt",
395
+ "otp",
396
+ "totp",
397
+ "pin",
398
+ "mfacode",
399
+ "sessionid",
400
+ "sid",
401
+ "databaseurl",
402
+ "connectionstring",
403
+ "dsn",
404
+ "mongouri",
405
+ "redisurl",
406
+ "signingkey",
407
+ "encryptionkey",
408
+ "cvv",
409
+ "cvc",
410
+ "cardnumber",
411
+ "ssn",
412
+ "creditcard",
413
+ "securitycode",
414
+ "twofactorcode",
415
+ "masterkey",
416
+ "servicerolekey",
417
+ "stripekey",
418
+ "rawheaders"
419
+ ];
420
+ var DEFAULT_SENSITIVE_PROPERTY_NAME_SET = new Set(DEFAULT_SENSITIVE_PROPERTY_NAMES);
421
+ var SENSITIVE_SEGMENTS = /* @__PURE__ */ new Set([
422
+ "password",
423
+ "passwd",
424
+ "pwd",
425
+ "passphrase",
426
+ "token",
427
+ "secret",
428
+ "cookie",
429
+ "cookies",
430
+ "authorization",
431
+ "auth",
432
+ "bearer",
433
+ "credential",
434
+ "credentials",
435
+ "jwt",
436
+ "otp",
437
+ "totp",
438
+ "pin",
439
+ "sid",
440
+ "dsn",
441
+ "pem",
442
+ "privkey",
443
+ "cvv",
444
+ "cvc",
445
+ "ssn",
446
+ "secrets"
447
+ ]);
448
+ var SENSITIVE_SUFFIXES = [
449
+ "password",
450
+ "passwd",
451
+ "token",
452
+ "secret",
453
+ "apikey",
454
+ "privatekey",
455
+ "credential",
456
+ "credentials",
457
+ "cookie"
458
+ ];
459
+ var compactKey = (key) => {
460
+ let compacted = "";
461
+ for (let index = 0; index < key.length; index++) {
462
+ const code = key.charCodeAt(index);
463
+ if (code === 45 || code === 46 || code === 95) continue;
464
+ compacted += code >= 65 && code <= 90 ? String.fromCharCode(code + 32) : key[index];
465
+ }
466
+ return compacted;
467
+ };
468
+ var stripTrailingDigits = (value) => {
469
+ let end = value.length;
470
+ while (end > 0) {
471
+ const code = value.charCodeAt(end - 1);
472
+ if (code < 48 || code > 57) break;
473
+ end--;
474
+ }
475
+ return end === 0 ? value : value.slice(0, end);
476
+ };
477
+ var segmentsOf = (key) => {
478
+ const segments = [];
479
+ let current = "";
480
+ for (let index = 0; index < key.length; index++) {
481
+ const char = key[index] ?? "";
482
+ const code = key.charCodeAt(index);
483
+ if (code === 45 || code === 46 || code === 95) {
484
+ if (current) segments.push(current.toLowerCase());
485
+ current = "";
486
+ continue;
487
+ }
488
+ if (current && code >= 65 && code <= 90) {
489
+ const prev = current.charCodeAt(current.length - 1);
490
+ const prevIsLower = prev >= 97 && prev <= 122;
491
+ const next = key.charCodeAt(index + 1);
492
+ const nextIsLower = next >= 97 && next <= 122;
493
+ if (prevIsLower || nextIsLower) {
494
+ segments.push(current.toLowerCase());
495
+ current = char;
496
+ continue;
497
+ }
498
+ }
499
+ current += char;
500
+ }
501
+ if (current) segments.push(current.toLowerCase());
502
+ return segments;
503
+ };
504
+ 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";
505
+ var defaultSensitivePropertyNames = () => DEFAULT_SENSITIVE_PROPERTY_NAME_SET;
506
+ var propertyNameIsSensitive = (key) => {
507
+ const compacted = compactKey(key);
508
+ const compactForms = [compacted, stripTrailingDigits(compacted)].filter(
509
+ (value, index, values) => value.length > 0 && values.indexOf(value) === index
510
+ );
511
+ for (const form of compactForms) {
512
+ if (DEFAULT_SENSITIVE_PROPERTY_NAME_SET.has(form)) return true;
513
+ for (const suffix of SENSITIVE_SUFFIXES) {
514
+ if (form.endsWith(suffix)) return true;
515
+ }
516
+ if (form.includes("apikey") || form.includes("xapikey")) return true;
517
+ }
518
+ const segments = segmentsOf(key).map((segment) => stripTrailingDigits(segment) || segment);
519
+ for (const segment of segments) {
520
+ if (SENSITIVE_SEGMENTS.has(segment)) return true;
521
+ }
522
+ for (let index = 0; index < segments.length - 1; index++) {
523
+ const left = segments[index];
524
+ const right = segments[index + 1];
525
+ if (left && right && adjacentPairsSensitive(left, right)) return true;
526
+ }
527
+ return false;
528
+ };
529
+
530
+ // src/derivation/redact-env-secret-values.ts
531
+ var MIN_ENV_SECRET_LENGTH = 6;
532
+ var MAX_ENV_SECRET_NEEDLE_LENGTH = 512;
533
+ var COMMON_CONFIG_VALUES = /* @__PURE__ */ new Set([
534
+ "enabled",
535
+ "disabled",
536
+ "production",
537
+ "development",
538
+ "staging",
539
+ "testing",
540
+ "localhost",
541
+ "undefined"
542
+ ]);
543
+ var identityMatcher = {
544
+ redact: (text) => text,
545
+ needleCount: 0
546
+ };
547
+ var envKeyLooksSensitive = (key) => propertyNameIsSensitive(key) || key.replace(/[-._]/g, "").toLowerCase().includes("accesskey");
548
+ var isCollectableSecretValue = (value) => value.length >= MIN_ENV_SECRET_LENGTH && !COMMON_CONFIG_VALUES.has(value.toLowerCase());
549
+ var looksLikeUrl = (value) => {
550
+ const schemeEnd = value.indexOf("://");
551
+ return schemeEnd > 0 && schemeEnd < 32;
552
+ };
553
+ var urlUserinfo = (value) => {
554
+ const schemeEnd = value.indexOf("://");
555
+ if (schemeEnd <= 0) return void 0;
556
+ const rest = value.slice(schemeEnd + 3);
557
+ let authorityEnd = rest.length;
558
+ for (const marker of ["/", "?", "#"]) {
559
+ const at = rest.indexOf(marker);
560
+ if (at >= 0 && at < authorityEnd) authorityEnd = at;
561
+ }
562
+ const authority = rest.slice(0, authorityEnd);
563
+ const userinfoEnd = authority.lastIndexOf("@");
564
+ if (userinfoEnd < 0) return void 0;
565
+ const userinfo = authority.slice(0, userinfoEnd);
566
+ if (!userinfo) return void 0;
567
+ const colon = userinfo.indexOf(":");
568
+ const encodedPassword = colon < 0 ? "" : userinfo.slice(colon + 1);
569
+ if (!encodedPassword) return void 0;
570
+ let password = encodedPassword;
571
+ try {
572
+ password = decodeURIComponent(encodedPassword.replace(/\+/g, " "));
573
+ } catch {
574
+ password = encodedPassword;
575
+ }
576
+ return { password, encodedPassword, userinfo };
577
+ };
578
+ var querySecretValues = (value) => {
579
+ const queryAt = value.indexOf("?");
580
+ if (queryAt < 0) return [];
581
+ const hashAt = value.indexOf("#", queryAt + 1);
582
+ const query = hashAt < 0 ? value.slice(queryAt + 1) : value.slice(queryAt + 1, hashAt);
583
+ if (!query.includes("=")) return [];
584
+ const found = [];
585
+ const parts = query.split("&");
586
+ for (let index = 0; index < parts.length; index++) {
587
+ const part = parts[index];
588
+ if (!part) continue;
589
+ const equals = part.indexOf("=");
590
+ if (equals <= 0) continue;
591
+ const rawKey = part.slice(0, equals);
592
+ let key = rawKey;
593
+ try {
594
+ key = decodeURIComponent(rawKey.replace(/\+/g, " "));
595
+ } catch {
596
+ key = rawKey;
597
+ }
598
+ if (!propertyNameIsSensitive(key) && !propertyNameIsSensitive(rawKey)) continue;
599
+ const rawValue = part.slice(equals + 1);
600
+ if (!rawValue) continue;
601
+ found.push(rawValue);
602
+ try {
603
+ const decoded = decodeURIComponent(rawValue.replace(/\+/g, " "));
604
+ if (decoded !== rawValue) found.push(decoded);
605
+ } catch {
606
+ }
607
+ }
608
+ return found;
609
+ };
610
+ var addNeedle = (needles, value) => {
611
+ if (value.length < MIN_ENV_SECRET_LENGTH) return;
612
+ needles.add(
613
+ value.length > MAX_ENV_SECRET_NEEDLE_LENGTH ? value.slice(0, MAX_ENV_SECRET_NEEDLE_LENGTH) : value
614
+ );
615
+ };
616
+ var addWithRepresentations = (needles, value) => {
617
+ addNeedle(needles, value);
618
+ if (value.length > MAX_ENV_SECRET_NEEDLE_LENGTH) return;
619
+ try {
620
+ const encoded = encodeURIComponent(value);
621
+ if (encoded !== value) addNeedle(needles, encoded);
622
+ const plus = encoded.replace(/%20/g, "+");
623
+ if (plus !== encoded) addNeedle(needles, plus);
624
+ } catch {
625
+ }
626
+ try {
627
+ const jsonEscaped = JSON.stringify(value).slice(1, -1);
628
+ if (jsonEscaped !== value) addNeedle(needles, jsonEscaped);
629
+ } catch {
630
+ }
631
+ };
632
+ var collectEnvSecretValues = (env = process.env) => {
633
+ const needles = /* @__PURE__ */ new Set();
634
+ let keys;
635
+ try {
636
+ keys = Object.keys(env);
637
+ } catch {
638
+ return [];
639
+ }
640
+ for (let index = 0; index < keys.length; index++) {
641
+ const key = keys[index];
642
+ if (!key || key === "PWD") continue;
643
+ let value;
644
+ try {
645
+ value = env[key];
646
+ } catch {
647
+ continue;
648
+ }
649
+ if (typeof value !== "string" || value.length === 0) continue;
650
+ try {
651
+ const userinfo = urlUserinfo(value);
652
+ if (userinfo) {
653
+ addWithRepresentations(needles, userinfo.password);
654
+ if (userinfo.encodedPassword !== userinfo.password) {
655
+ addWithRepresentations(needles, userinfo.encodedPassword);
656
+ }
657
+ if (userinfo.userinfo.length >= MIN_ENV_SECRET_LENGTH) {
658
+ addWithRepresentations(needles, userinfo.userinfo);
659
+ }
660
+ }
661
+ const queryValues = querySecretValues(value);
662
+ for (let queryIndex = 0; queryIndex < queryValues.length; queryIndex++) {
663
+ const part = queryValues[queryIndex];
664
+ if (part) addWithRepresentations(needles, part);
665
+ }
666
+ if (!envKeyLooksSensitive(key) || !isCollectableSecretValue(value)) continue;
667
+ if (looksLikeUrl(value) && !userinfo && queryValues.length === 0) continue;
668
+ addWithRepresentations(needles, value);
669
+ } catch {
670
+ }
671
+ }
672
+ return [...needles];
673
+ };
674
+ var createExactSecretMatcher = (secrets) => {
675
+ const unique = [];
676
+ const exact = /* @__PURE__ */ new Set();
677
+ for (let index = 0; index < secrets.length; index++) {
678
+ const secret = secrets[index];
679
+ if (!secret || secret.length < MIN_ENV_SECRET_LENGTH || exact.has(secret)) continue;
680
+ exact.add(secret);
681
+ unique.push(secret);
682
+ }
683
+ if (unique.length === 0) return identityMatcher;
684
+ unique.sort((left, right) => right.length - left.length);
685
+ const minLen = unique[unique.length - 1]?.length ?? MIN_ENV_SECRET_LENGTH;
686
+ return {
687
+ needleCount: unique.length,
688
+ redact(text) {
689
+ try {
690
+ if (text.length < minLen) return text;
691
+ if (exact.has(text)) return RASPUTIN_REDACTED;
692
+ let result = text;
693
+ for (let index = 0; index < unique.length; index++) {
694
+ const needle = unique[index];
695
+ if (!needle || result.length < needle.length) continue;
696
+ if (result.indexOf(needle) === -1) continue;
697
+ result = result.replaceAll(needle, RASPUTIN_REDACTED);
698
+ }
699
+ return result;
700
+ } catch {
701
+ return text;
702
+ }
703
+ }
704
+ };
705
+ };
706
+ var createEnvSecretMatcher = (env = process.env) => {
707
+ try {
708
+ return createExactSecretMatcher(collectEnvSecretValues(env));
709
+ } catch {
710
+ return identityMatcher;
711
+ }
712
+ };
713
+
364
714
  // src/normalize-frames/normalize-frames.ts
365
715
  import { isAbsolute as isAbsolute2, resolve as resolve2 } from "node:path";
366
716
  import { fileURLToPath as fileURLToPath2 } from "node:url";
@@ -808,7 +1158,7 @@ var resolveSourceMaps = async (frames) => {
808
1158
 
809
1159
  // src/sdk-meta.ts
810
1160
  var SDK_NAME = "@rasputin-ai/core";
811
- var SDK_VERSION = "0.7.1";
1161
+ var SDK_VERSION = "0.7.2-beta.1";
812
1162
 
813
1163
  // src/suppression/identity-needs-message-template.ts
814
1164
  var identityNeedsMessageTemplate = (type, code) => {
@@ -1937,6 +2287,7 @@ var createClient = (options, hooks = {}) => {
1937
2287
  const activation = resolveClientActivation(options);
1938
2288
  if (!activation.enabled) return noopClient();
1939
2289
  const { ingestToken, projectApiKey, apiUrl, release } = activation;
2290
+ const redactEnvSecrets = createEnvSecretMatcher().redact;
1940
2291
  const environment = options.environment;
1941
2292
  const { ingestUrl, deployUrl } = resolveEndpointUrls(apiUrl);
1942
2293
  const repoRoot = resolveRepoRoot(options);
@@ -2008,6 +2359,7 @@ var createClient = (options, hooks = {}) => {
2008
2359
  resolution: "none",
2009
2360
  request: context?.request
2010
2361
  });
2362
+ event.message = redactEnvSecrets(event.message);
2011
2363
  const decision = suppression.decide({
2012
2364
  errorType: event.type,
2013
2365
  message: event.message,
@@ -2139,169 +2491,6 @@ var isRasputinTaggedValue = (value) => {
2139
2491
  };
2140
2492
  var rasputinTagKind = (value) => isRasputinTaggedValue(value) ? value[1] : void 0;
2141
2493
 
2142
- // src/derivation/sensitive-property-name.ts
2143
- var DEFAULT_SENSITIVE_PROPERTY_NAMES = [
2144
- "password",
2145
- "passwd",
2146
- "pwd",
2147
- "passphrase",
2148
- "token",
2149
- "accesstoken",
2150
- "refreshtoken",
2151
- "sessiontoken",
2152
- "authorization",
2153
- "auth",
2154
- "bearer",
2155
- "cookie",
2156
- "cookies",
2157
- "signedcookies",
2158
- "setcookie",
2159
- "secret",
2160
- "secrets",
2161
- "clientsecret",
2162
- "apikey",
2163
- "xapikey",
2164
- "credential",
2165
- "credentials",
2166
- "privatekey",
2167
- "privkey",
2168
- "pem",
2169
- "jwt",
2170
- "otp",
2171
- "totp",
2172
- "pin",
2173
- "mfacode",
2174
- "sessionid",
2175
- "sid",
2176
- "databaseurl",
2177
- "connectionstring",
2178
- "dsn",
2179
- "mongouri",
2180
- "redisurl",
2181
- "signingkey",
2182
- "encryptionkey",
2183
- "cvv",
2184
- "cvc",
2185
- "cardnumber",
2186
- "ssn",
2187
- "creditcard",
2188
- "securitycode",
2189
- "twofactorcode",
2190
- "masterkey",
2191
- "servicerolekey",
2192
- "stripekey",
2193
- "rawheaders"
2194
- ];
2195
- var DEFAULT_SENSITIVE_PROPERTY_NAME_SET = new Set(DEFAULT_SENSITIVE_PROPERTY_NAMES);
2196
- var SENSITIVE_SEGMENTS = /* @__PURE__ */ new Set([
2197
- "password",
2198
- "passwd",
2199
- "pwd",
2200
- "passphrase",
2201
- "token",
2202
- "secret",
2203
- "cookie",
2204
- "cookies",
2205
- "authorization",
2206
- "auth",
2207
- "bearer",
2208
- "credential",
2209
- "credentials",
2210
- "jwt",
2211
- "otp",
2212
- "totp",
2213
- "pin",
2214
- "sid",
2215
- "dsn",
2216
- "pem",
2217
- "privkey",
2218
- "cvv",
2219
- "cvc",
2220
- "ssn",
2221
- "secrets"
2222
- ]);
2223
- var SENSITIVE_SUFFIXES = [
2224
- "password",
2225
- "passwd",
2226
- "token",
2227
- "secret",
2228
- "apikey",
2229
- "privatekey",
2230
- "credential",
2231
- "credentials",
2232
- "cookie"
2233
- ];
2234
- var compactKey = (key) => {
2235
- let compacted = "";
2236
- for (let index = 0; index < key.length; index++) {
2237
- const code = key.charCodeAt(index);
2238
- if (code === 45 || code === 46 || code === 95) continue;
2239
- compacted += code >= 65 && code <= 90 ? String.fromCharCode(code + 32) : key[index];
2240
- }
2241
- return compacted;
2242
- };
2243
- var stripTrailingDigits = (value) => {
2244
- let end = value.length;
2245
- while (end > 0) {
2246
- const code = value.charCodeAt(end - 1);
2247
- if (code < 48 || code > 57) break;
2248
- end--;
2249
- }
2250
- return end === 0 ? value : value.slice(0, end);
2251
- };
2252
- var segmentsOf = (key) => {
2253
- const segments = [];
2254
- let current = "";
2255
- for (let index = 0; index < key.length; index++) {
2256
- const char = key[index] ?? "";
2257
- const code = key.charCodeAt(index);
2258
- if (code === 45 || code === 46 || code === 95) {
2259
- if (current) segments.push(current.toLowerCase());
2260
- current = "";
2261
- continue;
2262
- }
2263
- if (current && code >= 65 && code <= 90) {
2264
- const prev = current.charCodeAt(current.length - 1);
2265
- const prevIsLower = prev >= 97 && prev <= 122;
2266
- const next = key.charCodeAt(index + 1);
2267
- const nextIsLower = next >= 97 && next <= 122;
2268
- if (prevIsLower || nextIsLower) {
2269
- segments.push(current.toLowerCase());
2270
- current = char;
2271
- continue;
2272
- }
2273
- }
2274
- current += char;
2275
- }
2276
- if (current) segments.push(current.toLowerCase());
2277
- return segments;
2278
- };
2279
- 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";
2280
- var defaultSensitivePropertyNames = () => DEFAULT_SENSITIVE_PROPERTY_NAME_SET;
2281
- var propertyNameIsSensitive = (key) => {
2282
- const compacted = compactKey(key);
2283
- const compactForms = [compacted, stripTrailingDigits(compacted)].filter(
2284
- (value, index, values) => value.length > 0 && values.indexOf(value) === index
2285
- );
2286
- for (const form of compactForms) {
2287
- if (DEFAULT_SENSITIVE_PROPERTY_NAME_SET.has(form)) return true;
2288
- for (const suffix of SENSITIVE_SUFFIXES) {
2289
- if (form.endsWith(suffix)) return true;
2290
- }
2291
- if (form.includes("apikey") || form.includes("xapikey")) return true;
2292
- }
2293
- const segments = segmentsOf(key).map((segment) => stripTrailingDigits(segment) || segment);
2294
- for (const segment of segments) {
2295
- if (SENSITIVE_SEGMENTS.has(segment)) return true;
2296
- }
2297
- for (let index = 0; index < segments.length - 1; index++) {
2298
- const left = segments[index];
2299
- const right = segments[index + 1];
2300
- if (left && right && adjacentPairsSensitive(left, right)) return true;
2301
- }
2302
- return false;
2303
- };
2304
-
2305
2494
  // src/instrumentation-manifest/instrumentation-manifest-types.ts
2306
2495
  var INSTRUMENTATION_MANIFEST_SCHEMA_VERSION = 3;
2307
2496
 
@@ -2333,9 +2522,12 @@ var uploadInstrumentationManifest = async (options) => {
2333
2522
  };
2334
2523
  export {
2335
2524
  INSTRUMENTATION_MANIFEST_SCHEMA_VERSION,
2525
+ MAX_ENV_SECRET_NEEDLE_LENGTH,
2526
+ RASPUTIN_REDACTED,
2336
2527
  RASPUTIN_WIRE_TAG,
2337
2528
  announceDeploy,
2338
2529
  createClient,
2530
+ createEnvSecretMatcher,
2339
2531
  createIngestEvent,
2340
2532
  createSuppression,
2341
2533
  createTransport,
@@ -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/core";
3
- export declare const SDK_VERSION = "0.7.1";
3
+ export declare const SDK_VERSION = "0.7.2-beta.1";
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,sBAAsB,CAAC;AAC5C,eAAO,MAAM,WAAW,UAAU,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,sBAAsB,CAAC;AAC5C,eAAO,MAAM,WAAW,iBAAiB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rasputin-ai/core",
3
- "version": "0.7.1",
3
+ "version": "0.7.2-beta.1",
4
4
  "description": "Core error capture, stack parsing, and ingest transport for Rasputin AI.",
5
5
  "type": "module",
6
6
  "exports": {