@microsoft/agents-telemetry 1.7.2 → 1.8.0-beta.34.g5d543f96c0

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.
Files changed (42) hide show
  1. package/README.md +25 -5
  2. package/dist/cjs/package.json +4 -3
  3. package/dist/cjs/src/index.cjs +3 -1
  4. package/dist/cjs/src/index.cjs.map +1 -1
  5. package/dist/cjs/src/index.d.cts +8 -1
  6. package/dist/cjs/src/observability/constants.d.ts +7 -0
  7. package/dist/cjs/src/observability/constants.js +9 -0
  8. package/dist/cjs/src/observability/constants.js.map +1 -1
  9. package/dist/cjs/src/observability/trace.js +37 -25
  10. package/dist/cjs/src/observability/trace.js.map +1 -1
  11. package/dist/cjs/src/types.d.ts +17 -1
  12. package/dist/cjs/src/utils/noop.js +1 -0
  13. package/dist/cjs/src/utils/noop.js.map +1 -1
  14. package/dist/cjs/src/utils/record.d.ts +20 -0
  15. package/dist/cjs/src/utils/record.js +61 -0
  16. package/dist/cjs/src/utils/record.js.map +1 -0
  17. package/dist/cjs/src/utils/redact.d.ts +15 -0
  18. package/dist/cjs/src/utils/redact.js +62 -0
  19. package/dist/cjs/src/utils/redact.js.map +1 -1
  20. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  21. package/dist/esm/src/index.cjs +3 -1
  22. package/dist/esm/src/index.cjs.map +1 -1
  23. package/dist/esm/src/index.d.cts +8 -1
  24. package/dist/esm/src/index.d.mts +8 -1
  25. package/dist/esm/src/index.mjs +1 -1
  26. package/dist/esm/src/index.mjs.map +1 -1
  27. package/dist/esm/src/observability/constants.d.ts +7 -0
  28. package/dist/esm/src/observability/constants.js +9 -0
  29. package/dist/esm/src/observability/constants.js.map +1 -1
  30. package/dist/esm/src/observability/trace.js +37 -25
  31. package/dist/esm/src/observability/trace.js.map +1 -1
  32. package/dist/esm/src/types.d.ts +17 -1
  33. package/dist/esm/src/utils/noop.js +1 -0
  34. package/dist/esm/src/utils/noop.js.map +1 -1
  35. package/dist/esm/src/utils/record.d.ts +20 -0
  36. package/dist/esm/src/utils/record.js +57 -0
  37. package/dist/esm/src/utils/record.js.map +1 -0
  38. package/dist/esm/src/utils/redact.d.ts +15 -0
  39. package/dist/esm/src/utils/redact.js +60 -0
  40. package/dist/esm/src/utils/redact.js.map +1 -1
  41. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  42. package/package.json +4 -3
@@ -7,6 +7,7 @@ import { attempt } from '../utils/attempt.js';
7
7
  import { isSpanDisabled } from './category.js';
8
8
  import { SpanNames } from './constants.js';
9
9
  import { noopContext } from '../utils/noop.js';
10
+ import { cloneRecordValue, mergeRecordValues } from '../utils/record.js';
10
11
  import { Errors } from '../errorHelper.js';
11
12
  /**
12
13
  * Creates the trace helper bound to the package tracer.
@@ -19,6 +20,9 @@ export function traceFactory(otel) {
19
20
  const validSpanNames = new Set(Object.values(SpanNames));
20
21
  const tracer = otel.trace.getTracer('@microsoft/agents-telemetry');
21
22
  const trace = function trace(target, callback) {
23
+ return runTrace(target, callback);
24
+ };
25
+ function runTrace(target, callback, parentSpan) {
22
26
  if (!target) {
23
27
  throw ExceptionHelper.generateException(Error, Errors.TraceDefinitionRequired);
24
28
  }
@@ -26,29 +30,37 @@ export function traceFactory(otel) {
26
30
  throw ExceptionHelper.generateException(Error, Errors.UnrecognizedSpanName, undefined, { spanName: target.name });
27
31
  }
28
32
  if (isSpanDisabled(target.name)) {
29
- return noopContext(callback);
30
- }
31
- const record = createRecord(target);
32
- if (!callback) {
33
- // TODO: if parent/child span connections are needed, we could expose a 'child' function that internally connects them.
34
- const span = tracer.startSpan(target.name);
35
- const flow = start(otel, target, span, record);
36
- return {
37
- record: flow.record,
38
- actions: flow.actions,
39
- fail: flow.fail,
40
- end: flow.end
41
- };
33
+ return callback ? noopContext(callback) : noopContext();
42
34
  }
43
- return tracer.startActiveSpan(target.name, span => {
44
- const flow = start(otel, target, span, record);
45
- return attempt({
46
- try: () => callback({ record: flow.record, actions: flow.actions }),
47
- catch: (error) => { throw flow.fail(error); },
48
- finally: flow.end
35
+ const execute = () => {
36
+ const record = createRecord(target);
37
+ if (!callback) {
38
+ const span = tracer.startSpan(target.name);
39
+ const flow = start(otel, target, span, record);
40
+ const child = ((definition, childCallback) => runTrace(definition, childCallback, span));
41
+ return {
42
+ record: flow.record,
43
+ actions: flow.actions,
44
+ child,
45
+ fail: flow.fail,
46
+ end: flow.end
47
+ };
48
+ }
49
+ return tracer.startActiveSpan(target.name, span => {
50
+ const flow = start(otel, target, span, record);
51
+ return attempt({
52
+ try: () => callback({ record: flow.record, actions: flow.actions }),
53
+ catch: (error) => { throw flow.fail(error); },
54
+ finally: flow.end
55
+ });
49
56
  });
50
- });
51
- };
57
+ };
58
+ if (!parentSpan) {
59
+ return execute();
60
+ }
61
+ const parentContext = otel.trace.setSpan(otel.context.active(), parentSpan);
62
+ return otel.context.with(parentContext, execute);
63
+ }
52
64
  trace.define = definition => definition;
53
65
  return trace;
54
66
  }
@@ -56,14 +68,14 @@ export function traceFactory(otel) {
56
68
  * Creates the mutable record stored for a trace execution.
57
69
  *
58
70
  * @remarks
59
- * - Updates use `Object.assign`, so nested objects are replaced rather than deeply merged.
71
+ * - Plain objects are recursively merged.
72
+ * - Arrays are copied and replaced.
60
73
  */
61
74
  function createRecord(target) {
62
- const state = target.record ? { ...target.record } : {};
75
+ const state = target.record ? cloneRecordValue(target.record) : {};
63
76
  return {
64
77
  set(values) {
65
- // TODO: use deep-merge strategy for Object and Array
66
- Object.assign(state, values);
78
+ mergeRecordValues(state, values);
67
79
  },
68
80
  get() {
69
81
  return state;
@@ -1 +1 @@
1
- {"version":3,"file":"trace.js","sourceRoot":"","sources":["../../../../src/observability/trace.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trace.js","sourceRoot":"","sources":["../../../../src/observability/trace.ts"],"names":[],"mappings":"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"}
@@ -32,7 +32,8 @@ export type SpanName = typeof SpanNames[keyof typeof SpanNames];
32
32
  * Mutable state container used while a trace is active.
33
33
  *
34
34
  * @remarks
35
- * - `set()` performs a shallow merge.
35
+ * - `set()` recursively merges plain objects.
36
+ * - Arrays are copied and replaced.
36
37
  * - `get()` returns the latest snapshot stored for the span.
37
38
  */
38
39
  export interface TraceRecord<TRecord extends object> {
@@ -43,6 +44,13 @@ export interface TraceRecord<TRecord extends object> {
43
44
  * Context passed to traced callbacks.
44
45
  */
45
46
  export interface TraceContext<TRecord extends object, TActions extends object> {
47
+ /**
48
+ * Updates the record values collected for the span.
49
+ *
50
+ * @remarks
51
+ * - Plain objects are recursively merged.
52
+ * - Arrays are copied and replaced.
53
+ */
46
54
  record(values: Partial<TRecord>): void;
47
55
  actions: TActions;
48
56
  }
@@ -65,10 +73,18 @@ export interface TraceEndContext<TRecord extends object> {
65
73
  duration: number;
66
74
  error?: unknown;
67
75
  }
76
+ /**
77
+ * Starts a child span parented to an active managed span.
78
+ */
79
+ export interface TraceChildFunction {
80
+ <TRecord extends object, TActions extends object>(definition: TraceDefinition<TRecord, TActions>): TraceManagedContext<TRecord, TActions>;
81
+ <TRecord extends object, TActions extends object, TReturn>(definition: TraceDefinition<TRecord, TActions>, callback: TraceCallback<TRecord, TActions, TReturn>): TReturn;
82
+ }
68
83
  /**
69
84
  * Handle returned when a trace is created without a callback.
70
85
  */
71
86
  export interface TraceManagedContext<TRecord extends object, TActions extends object> extends TraceContext<TRecord, TActions> {
87
+ child: TraceChildFunction;
72
88
  end(): void;
73
89
  fail<T extends unknown>(error: T): T;
74
90
  }
@@ -31,6 +31,7 @@ export function noopContext(callback) {
31
31
  const managedContext = {
32
32
  record: context.record,
33
33
  actions: context.actions,
34
+ child: ((_definition, callback) => noopContext(callback)),
34
35
  end: noopFn,
35
36
  fail(error) {
36
37
  return error;
@@ -1 +1 @@
1
- {"version":3,"file":"noop.js","sourceRoot":"","sources":["../../../../src/utils/noop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,MAAM,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA;AAEvB;;GAEG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,MAAM,EAAE,QAAQ;IACjD,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAA;AAC9B,CAAkB,CAAA;AAElB,SAAS,CAAC,MAAM,GAAG,UAAU,CAAC,EAAE,CAAC,UAAU,CAAA;AAE3C;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO;QACL,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACrC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;KACjC,CAAA;AACH,CAAC;AAOD,MAAM,UAAU,WAAW,CAA4D,QAAoD;IACzI,MAAM,OAAO,GAAG,IAAI,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAa,CAAA;IAChE,MAAM,OAAO,GAAoC;QAC/C,MAAM,EAAE,MAAM;QACd,OAAO;KACR,CAAA;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC1B,CAAC;IAED,MAAM,cAAc,GAA2C;QAC7D,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,GAAG,EAAE,MAAM;QACX,IAAI,CAAqB,KAAQ;YAC/B,OAAO,KAAK,CAAA;QACd,CAAC;KACF,CAAA;IAED,OAAO,cAAc,CAAA;AACvB,CAAC"}
1
+ {"version":3,"file":"noop.js","sourceRoot":"","sources":["../../../../src/utils/noop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,MAAM,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA;AAEvB;;GAEG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,MAAM,EAAE,QAAQ;IACjD,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAA;AAC9B,CAAkB,CAAA;AAElB,SAAS,CAAC,MAAM,GAAG,UAAU,CAAC,EAAE,CAAC,UAAU,CAAA;AAE3C;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO;QACL,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACrC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;KACjC,CAAA;AACH,CAAC;AAOD,MAAM,UAAU,WAAW,CAA4D,QAAoD;IACzI,MAAM,OAAO,GAAG,IAAI,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAa,CAAA;IAChE,MAAM,OAAO,GAAoC;QAC/C,MAAM,EAAE,MAAM;QACd,OAAO;KACR,CAAA;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC1B,CAAC;IAED,MAAM,cAAc,GAA2C;QAC7D,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAuB;QAC/E,GAAG,EAAE,MAAM;QACX,IAAI,CAAqB,KAAQ;YAC/B,OAAO,KAAK,CAAA;QACd,CAAC;KACF,CAAA;IAED,OAAO,cAAc,CAAA;AACvB,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ /**
6
+ * Recursively merges record values into the target state.
7
+ *
8
+ * @remarks
9
+ * - Plain objects are recursively merged.
10
+ * - Arrays are copied and replaced.
11
+ */
12
+ export declare function mergeRecordValues(target: Record<string, unknown>, values: Record<string, unknown>): void;
13
+ /**
14
+ * Clones record values while preserving non-plain objects by reference.
15
+ *
16
+ * @remarks
17
+ * - Plain objects and arrays are cloned.
18
+ * - Non-plain objects are kept by reference.
19
+ */
20
+ export declare function cloneRecordValue<T>(value: T): T;
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ /**
6
+ * Recursively merges record values into the target state.
7
+ *
8
+ * @remarks
9
+ * - Plain objects are recursively merged.
10
+ * - Arrays are copied and replaced.
11
+ */
12
+ export function mergeRecordValues(target, values) {
13
+ Object.entries(values).forEach(([key, value]) => {
14
+ const current = target[key];
15
+ if (isPlainObject(current) && isPlainObject(value)) {
16
+ const merged = { ...current };
17
+ mergeRecordValues(merged, value);
18
+ target[key] = merged;
19
+ return;
20
+ }
21
+ target[key] = cloneRecordValue(value);
22
+ });
23
+ }
24
+ /**
25
+ * Clones record values while preserving non-plain objects by reference.
26
+ *
27
+ * @remarks
28
+ * - Plain objects and arrays are cloned.
29
+ * - Non-plain objects are kept by reference.
30
+ */
31
+ export function cloneRecordValue(value) {
32
+ if (Array.isArray(value)) {
33
+ return value.map(item => cloneRecordValue(item));
34
+ }
35
+ if (isPlainObject(value)) {
36
+ const result = {};
37
+ Object.entries(value).forEach(([key, child]) => {
38
+ result[key] = cloneRecordValue(child);
39
+ });
40
+ return result;
41
+ }
42
+ return value;
43
+ }
44
+ /**
45
+ * Checks whether a value is a plain object that can be recursively merged.
46
+ *
47
+ * @remarks
48
+ * Arrays and class instances are not considered plain objects.
49
+ */
50
+ function isPlainObject(value) {
51
+ if (Object.prototype.toString.call(value) !== '[object Object]') {
52
+ return false;
53
+ }
54
+ const prototype = Object.getPrototypeOf(value);
55
+ return prototype === Object.prototype || prototype === null;
56
+ }
57
+ //# sourceMappingURL=record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record.js","sourceRoot":"","sources":["../../../../src/utils/record.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAE,MAA+B,EAAE,MAA+B;IACjG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAC9C,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;QAE3B,IAAI,aAAa,CAAC,OAAO,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACnD,MAAM,MAAM,GAAG,EAAE,GAAG,OAAO,EAAE,CAAA;YAC7B,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;YAChC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAA;YACpB,OAAM;QACR,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAK,KAAQ;IAC3C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAM,CAAA;IACvD,CAAC;IAED,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,MAAM,GAA4B,EAAE,CAAA;QAC1C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YAC7C,MAAM,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAA;QACvC,CAAC,CAAC,CAAA;QACF,OAAO,MAAW,CAAA;IACpB,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;GAKG;AACH,SAAS,aAAa,CAAE,KAAc;IACpC,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,iBAAiB,EAAE,CAAC;QAChE,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;IAC9C,OAAO,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,CAAA;AAC7D,CAAC"}
@@ -21,3 +21,18 @@ export declare function redactUrl(value: string | undefined): string | undefined
21
21
  * @returns The redacted scopes string, which includes an indication of how many scopes were redacted. If the input value is undefined, it will be returned as undefined.
22
22
  */
23
23
  export declare function redactScopes(scopes: string[] | undefined): string | undefined;
24
+ /**
25
+ * Returns a stable, non-reversible identifier for diagnostic correlation.
26
+ * @param conversationId The conversation ID to pseudonymize.
27
+ * @param key Optional secret used to keep pseudonyms stable across restarts.
28
+ * @returns A pseudonymized conversation ID, or undefined when no ID is supplied.
29
+ */
30
+ export declare function pseudonymizeConversationId(conversationId: string | undefined, key?: string): string | undefined;
31
+ /**
32
+ * Creates a redacted copy of an object for diagnostic logging.
33
+ * Conversation IDs, activity text, and URL-valued properties are redacted while all other values are preserved.
34
+ * @param value The value to sanitize for diagnostics.
35
+ * @param diagnosticsPseudonymKey Optional secret used to keep conversation pseudonyms stable across restarts.
36
+ * @returns A non-mutating, redacted copy of the value.
37
+ */
38
+ export declare function redactDiagnosticObject(value: unknown, diagnosticsPseudonymKey?: string): unknown;
@@ -2,8 +2,12 @@
2
2
  * Copyright (c) Microsoft Corporation. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
+ import { hmac } from '@noble/hashes/hmac';
6
+ import { sha256 } from '@noble/hashes/sha2';
7
+ import { bytesToHex, utf8ToBytes } from '@noble/hashes/utils';
5
8
  const REDACTED_VALUE = '<redacted>';
6
9
  const REDACTION_PEEK_LENGTH = 2;
10
+ let processLocalKey;
7
11
  /**
8
12
  * Redacts a string value, optionally allowing a peek at the beginning of the string for context.
9
13
  * @param value The string value to redact.
@@ -51,4 +55,60 @@ export function redactScopes(scopes) {
51
55
  const count = scopes.length;
52
56
  return `${REDACTED_VALUE} (${count} ${count === 1 ? 'scope' : 'scopes'})`;
53
57
  }
58
+ /**
59
+ * Returns a stable, non-reversible identifier for diagnostic correlation.
60
+ * @param conversationId The conversation ID to pseudonymize.
61
+ * @param key Optional secret used to keep pseudonyms stable across restarts.
62
+ * @returns A pseudonymized conversation ID, or undefined when no ID is supplied.
63
+ */
64
+ export function pseudonymizeConversationId(conversationId, key) {
65
+ if (!(conversationId === null || conversationId === void 0 ? void 0 : conversationId.trim())) {
66
+ return undefined;
67
+ }
68
+ const trimmedKey = key === null || key === void 0 ? void 0 : key.trim();
69
+ const hmacKey = trimmedKey
70
+ ? utf8ToBytes(trimmedKey)
71
+ : (processLocalKey !== null && processLocalKey !== void 0 ? processLocalKey : (processLocalKey = createProcessLocalKey()));
72
+ const digest = hmac(sha256, hmacKey, utf8ToBytes(conversationId));
73
+ return `cid_${bytesToHex(digest).slice(0, 32)}`;
74
+ }
75
+ function createProcessLocalKey() {
76
+ const key = new Uint8Array(32);
77
+ globalThis.crypto.getRandomValues(key);
78
+ return key;
79
+ }
80
+ /**
81
+ * Creates a redacted copy of an object for diagnostic logging.
82
+ * Conversation IDs, activity text, and URL-valued properties are redacted while all other values are preserved.
83
+ * @param value The value to sanitize for diagnostics.
84
+ * @param diagnosticsPseudonymKey Optional secret used to keep conversation pseudonyms stable across restarts.
85
+ * @returns A non-mutating, redacted copy of the value.
86
+ */
87
+ export function redactDiagnosticObject(value, diagnosticsPseudonymKey) {
88
+ return redactValue(value, [], diagnosticsPseudonymKey);
89
+ }
90
+ function redactValue(value, path, diagnosticsPseudonymKey) {
91
+ var _a, _b;
92
+ if (typeof value === 'string') {
93
+ const propertyName = (_a = path.at(-1)) === null || _a === void 0 ? void 0 : _a.toLowerCase();
94
+ const parentPropertyName = (_b = path.at(-2)) === null || _b === void 0 ? void 0 : _b.toLowerCase();
95
+ if (propertyName === 'conversationid' || (propertyName === 'id' && parentPropertyName === 'conversation')) {
96
+ return pseudonymizeConversationId(value, diagnosticsPseudonymKey);
97
+ }
98
+ if (propertyName === 'text' || propertyName === 'activitytext') {
99
+ return redactString(value, true);
100
+ }
101
+ if ((propertyName === null || propertyName === void 0 ? void 0 : propertyName.includes('url')) || propertyName === 'uri' || propertyName === 'href') {
102
+ return redactUrl(value);
103
+ }
104
+ return value;
105
+ }
106
+ if (Array.isArray(value)) {
107
+ return value.map(item => redactValue(item, path, diagnosticsPseudonymKey));
108
+ }
109
+ if (value && typeof value === 'object') {
110
+ return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, redactValue(item, [...path, key], diagnosticsPseudonymKey)]));
111
+ }
112
+ return value;
113
+ }
54
114
  //# sourceMappingURL=redact.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"redact.js","sourceRoot":"","sources":["../../../../src/utils/redact.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,cAAc,GAAG,YAAY,CAAA;AACnC,MAAM,qBAAqB,GAAG,CAAC,CAAA;AAE/B;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAE,KAAyB,EAAE,OAAgB,KAAK;IAC5E,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,OAAO,IAAI,IAAI,KAAK,CAAC,MAAM,GAAG,qBAAqB,GAAG,CAAC;QACrD,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,qBAAqB,CAAC,GAAG,cAAc,EAAE;QAC7D,CAAC,CAAC,cAAc,CAAA;AACpB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAE,KAAyB;IAClD,IAAI,CAAC,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,EAAE,CAAA,EAAE,CAAC;QACnB,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAA;QAC1B,MAAM,YAAY,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAE5D,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,GAAG,CAAC,MAAM,CAAA;QACnB,CAAC;QAED,OAAO,GAAG,GAAG,CAAC,MAAM,IAAI,cAAc,KAAK,YAAY,CAAC,MAAM,YAAY,CAAA;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,cAAc,CAAA;IACvB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAE,MAA4B;IACxD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAA;IAC3B,OAAO,GAAG,cAAc,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAA;AAC3E,CAAC"}
1
+ {"version":3,"file":"redact.js","sourceRoot":"","sources":["../../../../src/utils/redact.ts"],"names":[],"mappings":"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"}