@microsoft/agents-hosting 1.8.1 → 1.9.0-beta.18.g6b8111bba5

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 (101) hide show
  1. package/README.md +179 -9
  2. package/dist/package.json +4 -4
  3. package/dist/src/app/agentApplication.d.ts +3 -3
  4. package/dist/src/app/agentApplication.js +6 -16
  5. package/dist/src/app/agentApplication.js.map +1 -1
  6. package/dist/src/app/agentApplicationOptions.d.ts +6 -0
  7. package/dist/src/app/auth/authorization.d.ts +54 -0
  8. package/dist/src/app/auth/authorization.js +63 -2
  9. package/dist/src/app/auth/authorization.js.map +1 -1
  10. package/dist/src/app/auth/authorizationManager.d.ts +0 -8
  11. package/dist/src/app/auth/authorizationManager.js +104 -178
  12. package/dist/src/app/auth/authorizationManager.js.map +1 -1
  13. package/dist/src/auth/authConfiguration.d.ts +10 -3
  14. package/dist/src/auth/authConfiguration.js +292 -259
  15. package/dist/src/auth/authConfiguration.js.map +1 -1
  16. package/dist/src/auth/delegatedTokenCredential.d.ts +29 -0
  17. package/dist/src/auth/delegatedTokenCredential.js +49 -0
  18. package/dist/src/auth/delegatedTokenCredential.js.map +1 -0
  19. package/dist/src/auth/msal/msalTokenCredential.js +1 -1
  20. package/dist/src/auth/msal/msalTokenCredential.js.map +1 -1
  21. package/dist/src/auth/settings.d.ts +8 -70
  22. package/dist/src/auth/settings.js +5 -67
  23. package/dist/src/auth/settings.js.map +1 -1
  24. package/dist/src/cloudAdapter.d.ts +5 -0
  25. package/dist/src/cloudAdapter.js +13 -103
  26. package/dist/src/cloudAdapter.js.map +1 -1
  27. package/dist/src/configuration/botFrameworkEnvironmentCompatibility.d.ts +23 -0
  28. package/dist/src/configuration/botFrameworkEnvironmentCompatibility.js +183 -0
  29. package/dist/src/configuration/botFrameworkEnvironmentCompatibility.js.map +1 -0
  30. package/dist/src/configuration/configuration.d.ts +83 -0
  31. package/dist/src/configuration/configuration.js +836 -0
  32. package/dist/src/configuration/configuration.js.map +1 -0
  33. package/dist/src/configuration/configurationSource.d.ts +57 -0
  34. package/dist/src/configuration/configurationSource.js +7 -0
  35. package/dist/src/configuration/configurationSource.js.map +1 -0
  36. package/dist/src/configuration/environmentConfiguration.d.ts +14 -0
  37. package/dist/src/configuration/environmentConfiguration.js +271 -0
  38. package/dist/src/configuration/environmentConfiguration.js.map +1 -0
  39. package/dist/src/configuration/index.d.ts +7 -0
  40. package/dist/src/configuration/index.js +14 -0
  41. package/dist/src/configuration/index.js.map +1 -0
  42. package/dist/src/configuration/jsonFileConfigurationSource.d.ts +15 -0
  43. package/dist/src/configuration/jsonFileConfigurationSource.js +58 -0
  44. package/dist/src/configuration/jsonFileConfigurationSource.js.map +1 -0
  45. package/dist/src/createCloudAdapter.d.ts +30 -5
  46. package/dist/src/createCloudAdapter.js +17 -10
  47. package/dist/src/createCloudAdapter.js.map +1 -1
  48. package/dist/src/errorHelper.js +90 -2
  49. package/dist/src/errorHelper.js.map +1 -1
  50. package/dist/src/index.d.ts +1 -0
  51. package/dist/src/index.js +1 -0
  52. package/dist/src/index.js.map +1 -1
  53. package/dist/src/outboundHostValidator.d.ts +4 -1
  54. package/dist/src/outboundHostValidator.js +25 -48
  55. package/dist/src/outboundHostValidator.js.map +1 -1
  56. package/dist/src/storage/fileStorage.d.ts +5 -2
  57. package/dist/src/storage/fileStorage.js +41 -3
  58. package/dist/src/storage/fileStorage.js.map +1 -1
  59. package/dist/src/storage/index.d.ts +1 -0
  60. package/dist/src/storage/index.js +1 -0
  61. package/dist/src/storage/index.js.map +1 -1
  62. package/dist/src/storage/memoryStorage.d.ts +4 -2
  63. package/dist/src/storage/memoryStorage.js +32 -6
  64. package/dist/src/storage/memoryStorage.js.map +1 -1
  65. package/dist/src/storage/storage.d.ts +14 -1
  66. package/dist/src/storage/storageExpiry.d.ts +6 -0
  67. package/dist/src/storage/storageExpiry.js +20 -0
  68. package/dist/src/storage/storageExpiry.js.map +1 -0
  69. package/dist/src/utils/env.d.ts +43 -0
  70. package/dist/src/utils/env.js +42 -6
  71. package/dist/src/utils/env.js.map +1 -1
  72. package/dist/src/utils.d.ts +1 -0
  73. package/dist/src/utils.js +10 -1
  74. package/dist/src/utils.js.map +1 -1
  75. package/package.json +4 -4
  76. package/src/app/agentApplication.ts +11 -14
  77. package/src/app/agentApplicationOptions.ts +7 -0
  78. package/src/app/auth/authorization.ts +67 -2
  79. package/src/app/auth/authorizationManager.ts +126 -204
  80. package/src/auth/authConfiguration.ts +415 -260
  81. package/src/auth/delegatedTokenCredential.ts +49 -0
  82. package/src/auth/msal/msalTokenCredential.ts +1 -1
  83. package/src/auth/settings.ts +5 -82
  84. package/src/cloudAdapter.ts +38 -113
  85. package/src/configuration/botFrameworkEnvironmentCompatibility.ts +245 -0
  86. package/src/configuration/configuration.ts +1076 -0
  87. package/src/configuration/configurationSource.ts +76 -0
  88. package/src/configuration/environmentConfiguration.ts +377 -0
  89. package/src/configuration/index.ts +19 -0
  90. package/src/configuration/jsonFileConfigurationSource.ts +74 -0
  91. package/src/createCloudAdapter.ts +52 -9
  92. package/src/errorHelper.ts +110 -2
  93. package/src/index.ts +1 -0
  94. package/src/outboundHostValidator.ts +37 -44
  95. package/src/storage/fileStorage.ts +43 -5
  96. package/src/storage/index.ts +1 -0
  97. package/src/storage/memoryStorage.ts +34 -8
  98. package/src/storage/storage.ts +15 -1
  99. package/src/storage/storageExpiry.ts +21 -0
  100. package/src/utils/env.ts +63 -0
  101. package/src/utils.ts +10 -0
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { Storage, StoreItem } from './storage';
5
+ import { Storage, StoreItem, StorageWriteOptions } from './storage';
6
6
  /**
7
7
  * A simple in-memory storage provider that implements the Storage interface.
8
8
  *
@@ -20,6 +20,7 @@ import { Storage, StoreItem } from './storage';
20
20
  export declare class MemoryStorage implements Storage {
21
21
  private memory;
22
22
  private static instance;
23
+ private expirations;
23
24
  /**
24
25
  * Counter used to generate unique eTags for stored items
25
26
  */
@@ -64,7 +65,7 @@ export declare class MemoryStorage implements Storage {
64
65
  * has the same eTag. If an item has an eTag of '*' or no eTag, it will
65
66
  * always be written regardless of the current state.
66
67
  */
67
- write(changes: StoreItem): Promise<void>;
68
+ write(changes: StoreItem, options?: StorageWriteOptions): Promise<void>;
68
69
  /**
69
70
  * Deletes storage items from memory.
70
71
  *
@@ -87,4 +88,5 @@ export declare class MemoryStorage implements Storage {
87
88
  * @private
88
89
  */
89
90
  private saveItem;
91
+ private isExpired;
90
92
  }
@@ -8,6 +8,7 @@ exports.MemoryStorage = void 0;
8
8
  const agents_telemetry_1 = require("@microsoft/agents-telemetry");
9
9
  const agents_activity_1 = require("@microsoft/agents-activity");
10
10
  const observability_1 = require("../observability");
11
+ const storageExpiry_1 = require("./storageExpiry");
11
12
  const agents_telemetry_2 = require("@microsoft/agents-telemetry");
12
13
  const errorHelper_1 = require("../errorHelper");
13
14
  const logger = (0, agents_telemetry_2.debug)('agents:memory-storage');
@@ -33,6 +34,7 @@ class MemoryStorage {
33
34
  */
34
35
  constructor(memory = {}) {
35
36
  this.memory = memory;
37
+ this.expirations = {};
36
38
  /**
37
39
  * Counter used to generate unique eTags for stored items
38
40
  */
@@ -70,6 +72,12 @@ class MemoryStorage {
70
72
  const data = {};
71
73
  for (const key of keys) {
72
74
  logger.debug(`Reading key: ${key}`);
75
+ if (this.isExpired(key)) {
76
+ logger.info('Item expired, deleting from memory', { key: (0, agents_telemetry_1.redactString)(key, true) });
77
+ delete this.memory[key];
78
+ delete this.expirations[key];
79
+ continue;
80
+ }
73
81
  const item = this.memory[key];
74
82
  if (item) {
75
83
  data[key] = JSON.parse(item);
@@ -91,22 +99,29 @@ class MemoryStorage {
91
99
  * has the same eTag. If an item has an eTag of '*' or no eTag, it will
92
100
  * always be written regardless of the current state.
93
101
  */
94
- async write(changes) {
102
+ async write(changes, options) {
95
103
  return (0, agents_telemetry_1.trace)(observability_1.StorageTraceDefinitions.write, async ({ record }) => {
96
- if (!changes || changes.length === 0) {
104
+ const keys = changes ? Object.keys(changes) : [];
105
+ if (!changes || keys.length === 0) {
97
106
  throw agents_activity_1.ExceptionHelper.generateException(ReferenceError, errorHelper_1.Errors.StorageWriteChangesRequired);
98
107
  }
99
- record({ keyCount: changes.length });
108
+ const expiresAt = (0, storageExpiry_1.getStorageWriteExpiry)(options);
109
+ record({ keyCount: keys.length });
100
110
  for (const [key, newItem] of Object.entries(changes)) {
101
111
  logger.debug(`Writing key: ${key}`);
112
+ if (this.isExpired(key)) {
113
+ logger.info('Item expired, deleting from memory', { key: (0, agents_telemetry_1.redactString)(key, true) });
114
+ delete this.memory[key];
115
+ delete this.expirations[key];
116
+ }
102
117
  const oldItemStr = this.memory[key];
103
118
  if (!oldItemStr || newItem.eTag === '*' || !newItem.eTag) {
104
- this.saveItem(key, newItem);
119
+ this.saveItem(key, newItem, expiresAt);
105
120
  }
106
121
  else {
107
122
  const oldItem = JSON.parse(oldItemStr);
108
123
  if (newItem.eTag === oldItem.eTag) {
109
- this.saveItem(key, newItem);
124
+ this.saveItem(key, newItem, expiresAt);
110
125
  }
111
126
  else {
112
127
  throw agents_activity_1.ExceptionHelper.generateException(Error, errorHelper_1.Errors.StorageETagConflict, undefined, { key });
@@ -127,6 +142,7 @@ class MemoryStorage {
127
142
  logger.debug(`Deleting keys: ${keys.join(', ')}`);
128
143
  for (const key of keys) {
129
144
  delete this.memory[key];
145
+ delete this.expirations[key];
130
146
  }
131
147
  });
132
148
  }
@@ -144,9 +160,19 @@ class MemoryStorage {
144
160
  *
145
161
  * @private
146
162
  */
147
- saveItem(key, item) {
163
+ saveItem(key, item, expiresAt) {
148
164
  const clone = Object.assign({}, item, { eTag: (this.etag++).toString() });
149
165
  this.memory[key] = JSON.stringify(clone);
166
+ if (expiresAt === undefined) {
167
+ delete this.expirations[key];
168
+ }
169
+ else {
170
+ this.expirations[key] = expiresAt;
171
+ }
172
+ }
173
+ isExpired(key) {
174
+ const expiresAt = this.expirations[key];
175
+ return expiresAt !== undefined && expiresAt <= Date.now();
150
176
  }
151
177
  }
152
178
  exports.MemoryStorage = MemoryStorage;
@@ -1 +1 @@
1
- {"version":3,"file":"memoryStorage.js","sourceRoot":"","sources":["../../../src/storage/memoryStorage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memoryStorage.js","sourceRoot":"","sources":["../../../src/storage/memoryStorage.ts"],"names":[],"mappings":"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"}
@@ -45,6 +45,19 @@ export interface StoreItems {
45
45
  */
46
46
  [key: string]: any;
47
47
  }
48
+ /**
49
+ * Options for writing items to storage.
50
+ */
51
+ export interface StorageWriteOptions {
52
+ /**
53
+ * Optional time to live, in seconds, for written items.
54
+ *
55
+ * @remarks
56
+ * When set, storage providers should stop returning the written items after
57
+ * this duration has elapsed. Values must be finite numbers greater than zero.
58
+ */
59
+ ttl?: number;
60
+ }
48
61
  /**
49
62
  * A factory function to generate storage keys based on the conversation context.
50
63
  *
@@ -84,7 +97,7 @@ export interface Storage {
84
97
  * @returns A promise that resolves when the write operation is complete
85
98
  * @throws If the changes object is empty or undefined, or if an eTag conflict occurs and optimistic concurrency is enabled
86
99
  */
87
- write: (changes: StoreItem) => Promise<void>;
100
+ write: (changes: StoreItem, options?: StorageWriteOptions) => Promise<void>;
88
101
  /**
89
102
  * Deletes store items from storage.
90
103
  *
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { StorageWriteOptions } from './storage';
6
+ export declare function getStorageWriteExpiry(options?: StorageWriteOptions): number | undefined;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright (c) Microsoft Corporation. All rights reserved.
4
+ * Licensed under the MIT License.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.getStorageWriteExpiry = getStorageWriteExpiry;
8
+ const agents_activity_1 = require("@microsoft/agents-activity");
9
+ const errorHelper_1 = require("../errorHelper");
10
+ function getStorageWriteExpiry(options) {
11
+ const ttl = options === null || options === void 0 ? void 0 : options.ttl;
12
+ if (ttl === undefined) {
13
+ return undefined;
14
+ }
15
+ if (!Number.isFinite(ttl) || ttl <= 0) {
16
+ throw agents_activity_1.ExceptionHelper.generateException(RangeError, errorHelper_1.Errors.InvalidStorageTtl);
17
+ }
18
+ return Date.now() + ttl * 1000;
19
+ }
20
+ //# sourceMappingURL=storageExpiry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storageExpiry.js","sourceRoot":"","sources":["../../../src/storage/storageExpiry.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,gEAA4D;AAC5D,gDAAuC;AAEvC,+BAAuC,OAA6B;IAClE,MAAM,GAAG,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,GAAG,CAAA;IACxB,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,iCAAe,CAAC,iBAAiB,CAAC,UAAU,EAAE,oBAAM,CAAC,iBAAiB,CAAC,CAAA;IAC/E,CAAC;IAED,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,CAAA;AAChC,CAAC"}
@@ -6,6 +6,48 @@
6
6
  * authentication, and connector-client modules. Keeping them internal lets us
7
7
  * normalize behavior across the package without growing the public API.
8
8
  */
9
+ export interface LoadEnv {
10
+ [upperKey: string]: {
11
+ key: string;
12
+ value: any;
13
+ };
14
+ }
15
+ type ParserSettings<K extends string> = {
16
+ [key in K]: (value: string) => {
17
+ key?: string;
18
+ value?: any;
19
+ } | undefined;
20
+ };
21
+ /**
22
+ * Indexes non-empty environment values case-insensitively while preserving
23
+ * their original key spelling.
24
+ */
25
+ export declare function loadEnvSettings(callback: (key: string, value: string) => void, environment?: NodeJS.ProcessEnv): LoadEnv;
26
+ /**
27
+ * Creates a case-insensitive parser for a fixed set of environment keys.
28
+ */
29
+ export declare function envParser<K extends string>(settings: ParserSettings<K> & ThisType<ParserSettings<K>>): {
30
+ keys: K[];
31
+ parse(key: K, value: string): {
32
+ key?: undefined;
33
+ value?: undefined;
34
+ } | {
35
+ key: string;
36
+ value: any;
37
+ };
38
+ };
39
+ export declare const envParserUtils: {
40
+ bypass: (value: string) => {
41
+ value: string;
42
+ };
43
+ redirect: <Parser extends ReturnType<typeof envParser>>(parser: Parser, key: Parameters<Parser['parse']>[0]) => (value: string) => {
44
+ key?: undefined;
45
+ value?: undefined;
46
+ } | {
47
+ key: string;
48
+ value: any;
49
+ };
50
+ };
9
51
  /**
10
52
  * Parses an environment-variable string into a boolean.
11
53
  *
@@ -48,3 +90,4 @@ export declare function parseIntEnv(value: string | undefined, fallback: number)
48
90
  * @param maxDistance - Maximum edit distance to consider a match (default 2).
49
91
  */
50
92
  export declare function suggestClosest(input: string, candidates: readonly string[], maxDistance?: number): string | undefined;
93
+ export {};
@@ -2,17 +2,53 @@
2
2
  // Copyright (c) Microsoft Corporation. All rights reserved.
3
3
  // Licensed under the MIT License.
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.envParserUtils = void 0;
6
+ exports.loadEnvSettings = loadEnvSettings;
7
+ exports.envParser = envParser;
5
8
  exports.parseBooleanEnv = parseBooleanEnv;
6
9
  exports.parseIntEnv = parseIntEnv;
7
10
  exports.suggestClosest = suggestClosest;
8
11
  /**
9
- * Internal helpers for parsing environment-variable strings into typed values.
10
- *
11
- * These helpers are intentionally NOT exported from the package's public
12
- * `index.ts`; they are an internal utility shared between the adapter,
13
- * authentication, and connector-client modules. Keeping them internal lets us
14
- * normalize behavior across the package without growing the public API.
12
+ * Indexes non-empty environment values case-insensitively while preserving
13
+ * their original key spelling.
14
+ */
15
+ function loadEnvSettings(callback, environment = process.env) {
16
+ const env = {};
17
+ for (const [envKey, envValue] of Object.entries(environment)) {
18
+ if (!(envValue === null || envValue === void 0 ? void 0 : envValue.trim())) {
19
+ continue;
20
+ }
21
+ env[envKey.toUpperCase()] = { key: envKey, value: envValue };
22
+ callback(envKey, envValue);
23
+ }
24
+ return env;
25
+ }
26
+ /**
27
+ * Creates a case-insensitive parser for a fixed set of environment keys.
15
28
  */
29
+ function envParser(settings) {
30
+ const keys = Object.keys(settings);
31
+ const upperKeys = keys.reduce((acc, key) => {
32
+ acc[key.toUpperCase()] = key;
33
+ return acc;
34
+ }, {});
35
+ return {
36
+ keys,
37
+ parse(key, value) {
38
+ var _a;
39
+ const match = upperKeys[key.toUpperCase()];
40
+ if (!match) {
41
+ return {};
42
+ }
43
+ const result = settings[match](value);
44
+ return { key: (_a = result === null || result === void 0 ? void 0 : result.key) !== null && _a !== void 0 ? _a : match, value: result === null || result === void 0 ? void 0 : result.value };
45
+ }
46
+ };
47
+ }
48
+ exports.envParserUtils = {
49
+ bypass: (value) => ({ value }),
50
+ redirect: (parser, key) => (value) => parser.parse(key, value)
51
+ };
16
52
  /**
17
53
  * Parses an environment-variable string into a boolean.
18
54
  *
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/utils/env.ts"],"names":[],"mappings":";AAAA,4DAA4D;AAC5D,kCAAkC;;;;;AAElC;;;;;;;GAOG;AAEH;;;;;;;;;;;;GAYG;AACH,yBAAiC,KAAyB;IACxD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACzC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACpC,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,IAAI,CAAA;IAC1C,IAAI,CAAC,KAAK,EAAE;QAAE,OAAO,SAAS,CAAA;IAC9B,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,KAAK,CAAA;IAC5C,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;;;;;GAOG;AACH,qBAA6B,KAAyB,EAAE,QAAgB;IACtE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,QAAQ,CAAA;IAC/D,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAClC,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAA;AACjD,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBACE,KAAa,EACb,UAA6B,EAC7B,WAAW,GAAG,CAAC;IAEf,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAA;IAC5B,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAA;IAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IAC1E,IAAI,IAAoD,CAAA;IACxD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC,CAAA;QACjD,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChD,IAAI,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAA;YACvC,IAAI,CAAC,KAAK,CAAC;gBAAE,MAAK;QACpB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,CAAA;AACnB,CAAC;AAED,uFAAuF;AACvF,SAAS,WAAW,CAAE,CAAS,EAAE,CAAS;IACxC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAA;IACrB,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,MAAM,CAAA;IACnC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,MAAM,CAAA;IACnC,MAAM,GAAG,GAAG,IAAI,KAAK,CAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;QAChB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;YACnB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC5B,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;YAC1C,IAAI,GAAG,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;AACtB,CAAC"}
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/utils/env.ts"],"names":[],"mappings":";AAAA,4DAA4D;AAC5D,kCAAkC;;;;;;;;AAmBlC;;;GAGG;AACH,yBACE,QAA8C,EAC9C,WAAW,GAAsB,OAAO,CAAC,GAAG;IAE5C,MAAM,GAAG,GAAY,EAAE,CAAA;IACvB,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7D,IAAI,EAAC,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,EAAE,CAAA,EAAE,CAAC;YACtB,SAAQ;QACV,CAAC;QAED,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAA;QAC5D,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAC5B,CAAC;IAED,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;GAEG;AACH,mBACE,QAAyD;IAEzD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAQ,CAAA;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACzC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,GAAG,CAAA;QAC5B,OAAO,GAAG,CAAA;IACZ,CAAC,EAAE,EAAuB,CAAC,CAAA;IAE3B,OAAO;QACL,IAAI;QACJ,KAAK,CAAE,GAAM,EAAE,KAAa;;YAC1B,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAA;YAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,EAAE,CAAA;YACX,CAAC;YAED,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAA;YACrC,OAAO,EAAE,GAAG,QAAE,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,GAAG,mCAAI,KAAK,EAAE,KAAK,EAAE,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,KAAK,EAAE,CAAA;QAC5D,CAAC;KACF,CAAA;AACH,CAAC;AAEY,QAAA,cAAc,GAAG;IAC5B,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;IACtC,QAAQ,EAAE,CACR,MAAc,EACd,GAAmC,EACnC,EAAE,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC;CACjD,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,yBAAiC,KAAyB;IACxD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACzC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACpC,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,IAAI,CAAA;IAC1C,IAAI,CAAC,KAAK,EAAE;QAAE,OAAO,SAAS,CAAA;IAC9B,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,KAAK,CAAA;IAC5C,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;;;;;GAOG;AACH,qBAA6B,KAAyB,EAAE,QAAgB;IACtE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,QAAQ,CAAA;IAC/D,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAClC,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAA;AACjD,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBACE,KAAa,EACb,UAA6B,EAC7B,WAAW,GAAG,CAAC;IAEf,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAA;IAC5B,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAA;IAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IAC1E,IAAI,IAAoD,CAAA;IACxD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC,CAAA;QACjD,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChD,IAAI,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAA;YACvC,IAAI,CAAC,KAAK,CAAC;gBAAE,MAAK;QACpB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,CAAA;AACnB,CAAC;AAED,uFAAuF;AACvF,SAAS,WAAW,CAAE,CAAS,EAAE,CAAS;IACxC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAA;IACrB,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,MAAM,CAAA;IACnC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,MAAM,CAAA;IACnC,MAAM,GAAG,GAAG,IAAI,KAAK,CAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;QAChB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;YACnB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC5B,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;YAC1C,IAAI,GAAG,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;AACtB,CAAC"}
@@ -8,3 +8,4 @@
8
8
  * @returns A new object with all undefined values removed
9
9
  */
10
10
  export declare const prune: <T extends Record<string, any>>(obj: T) => T;
11
+ export declare const mergeDefined: <T extends Record<string, any>>(...layers: readonly (Partial<T> | undefined)[]) => T;
package/dist/src/utils.js CHANGED
@@ -4,7 +4,7 @@
4
4
  * Licensed under the MIT License.
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.prune = void 0;
7
+ exports.mergeDefined = exports.prune = void 0;
8
8
  /**
9
9
  * Utility function to prune undefined values from an object. This is useful for cleaning up configuration objects before logging or processing, ensuring that only defined values are included.
10
10
  * @param obj The object to prune
@@ -15,4 +15,13 @@ const prune = (obj) => {
15
15
  return Object.fromEntries(entries);
16
16
  };
17
17
  exports.prune = prune;
18
+ const mergeDefined = (...layers) => {
19
+ const result = {};
20
+ for (const layer of layers) {
21
+ if (layer)
22
+ Object.assign(result, (0, exports.prune)(layer));
23
+ }
24
+ return result;
25
+ };
26
+ exports.mergeDefined = mergeDefined;
18
27
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH;;;;GAIG;AACI,MAAM,KAAK,GAAG,CAAgC,GAAM,EAAE,EAAE;IAC7D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAA;IAC9E,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAM,CAAA;AACzC,CAAC,CAAA;AAHY,QAAA,KAAK,GAAL,KAAK,CAGjB"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH;;;;GAIG;AACI,MAAM,KAAK,GAAG,CAAgC,GAAM,EAAE,EAAE;IAC7D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAA;IAC9E,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAM,CAAA;AACzC,CAAC,CAAA;AAHY,QAAA,KAAK,GAAL,KAAK,CAGjB;AAEM,MAAM,YAAY,GAAG,CAC1B,GAAG,MAA2C,EAC3C,EAAE;IACL,MAAM,MAAM,GAAe,EAAE,CAAA;IAC7B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK;YAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAA,QAAA,KAAK,EAAC,KAAK,CAAC,CAAC,CAAA;IAChD,CAAC;IACD,OAAO,MAAW,CAAA;AACpB,CAAC,CAAA;AARY,QAAA,YAAY,GAAZ,YAAY,CAQxB"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "@microsoft/agents-hosting",
4
- "version": "1.8.1",
4
+ "version": "1.9.0-beta.18.g6b8111bba5",
5
5
  "homepage": "https://github.com/microsoft/Agents-for-js",
6
6
  "repository": {
7
7
  "type": "git",
@@ -20,9 +20,9 @@
20
20
  "types": "dist/src/index.d.ts",
21
21
  "dependencies": {
22
22
  "@azure/core-auth": "1.10.1",
23
- "@azure/msal-node": "5.1.5",
24
- "@microsoft/agents-activity": "1.8.1",
25
- "@microsoft/agents-telemetry": "1.8.1",
23
+ "@azure/msal-node": "5.6.0",
24
+ "@microsoft/agents-activity": "1.9.0-beta.18.g6b8111bba5",
25
+ "@microsoft/agents-telemetry": "1.9.0-beta.18.g6b8111bba5",
26
26
  "jsonwebtoken": "9.0.3",
27
27
  "jwks-rsa": "4.0.1",
28
28
  "zod": "3.25.75"
@@ -148,7 +148,12 @@ export class AgentApplication<TState extends TurnState> {
148
148
  if (this._options.adapter) {
149
149
  this._adapter = this._options.adapter
150
150
  } else {
151
- this._adapter = new CloudAdapter()
151
+ this._adapter = new CloudAdapter(
152
+ undefined,
153
+ undefined,
154
+ undefined,
155
+ { configurationContext: this._options.configurationContext }
156
+ )
152
157
  }
153
158
 
154
159
  this._adapter.setAgentName(this._options.agentName)
@@ -208,7 +213,7 @@ export class AgentApplication<TState extends TurnState> {
208
213
  * Gets the authorization instance for the application.
209
214
  *
210
215
  * @returns The authorization instance.
211
- * @throws Error if no authentication options were configured.
216
+ * @throws Error if no authorization handlers were resolved.
212
217
  */
213
218
  public get authorization (): Authorization {
214
219
  if (this._authorizationManager.handlers.length === 0) {
@@ -495,7 +500,7 @@ export class AgentApplication<TState extends TurnState> {
495
500
  *
496
501
  * @param handler - The handler function to be called after successful sign-in.
497
502
  * @returns The current instance of the application.
498
- * @throws Error if authentication options were not configured.
503
+ * @throws Error if no authorization handlers were resolved.
499
504
  *
500
505
  * @remarks
501
506
  * This method allows you to perform actions after a user has successfully authenticated.
@@ -510,11 +515,7 @@ export class AgentApplication<TState extends TurnState> {
510
515
  *
511
516
  */
512
517
  public onSignInSuccess (handler: (context: TurnContext, state: TurnState, id?: string) => Promise<void>): this {
513
- if (this.options.authorization) {
514
- this.authorization.onSignInSuccess(handler)
515
- } else {
516
- throw ExceptionHelper.generateException(Error, Errors.AuthorizationOptionNotAvailable)
517
- }
518
+ this.authorization.onSignInSuccess(handler)
518
519
  return this
519
520
  }
520
521
 
@@ -523,7 +524,7 @@ export class AgentApplication<TState extends TurnState> {
523
524
  *
524
525
  * @param handler - The handler function to be called after a failed sign-in attempt.
525
526
  * @returns The current instance of the application.
526
- * @throws Error if authentication options were not configured.
527
+ * @throws Error if no authorization handlers were resolved.
527
528
  *
528
529
  * @remarks
529
530
  * This method allows you to handle cases where a user fails to authenticate,
@@ -538,11 +539,7 @@ export class AgentApplication<TState extends TurnState> {
538
539
  *
539
540
  */
540
541
  public onSignInFailure (handler: (context: TurnContext, state: TurnState, id?: string) => Promise<void>): this {
541
- if (this.options.authorization) {
542
- this.authorization.onSignInFailure(handler)
543
- } else {
544
- throw ExceptionHelper.generateException(Error, Errors.AuthorizationOptionNotAvailable)
545
- }
542
+ this.authorization.onSignInFailure(handler)
546
543
  return this
547
544
  }
548
545
 
@@ -13,6 +13,7 @@ import { HeaderPropagationDefinition } from '../headerPropagation'
13
13
  import { AuthorizationOptions } from './auth/types'
14
14
  import { Connections } from '../auth/connections'
15
15
  import { ProactiveOptions } from './proactive'
16
+ import { ConfigurationContext } from '../configuration/configuration'
16
17
 
17
18
  /**
18
19
  * Typing timer settings for a specific channel or the global default.
@@ -52,6 +53,12 @@ export interface TypingOptions extends TypingTimingOptions {
52
53
  * custom state management specific to your agent's needs.
53
54
  */
54
55
  export interface AgentApplicationOptions<TState extends TurnState> {
56
+ /**
57
+ * Optional host-scoped external configuration used by the application's
58
+ * default adapter and authorization handlers.
59
+ */
60
+ configurationContext?: ConfigurationContext;
61
+
55
62
  /**
56
63
  * The adapter used for handling bot interactions with various messaging platforms.
57
64
  * This adapter manages the communication layer between your agent and the Bot Framework.
@@ -3,21 +3,25 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { debug } from '@microsoft/agents-telemetry'
6
+ import { TokenCredential } from '@azure/core-auth'
7
7
  import { ExceptionHelper } from '@microsoft/agents-activity'
8
+ import { debug } from '@microsoft/agents-telemetry'
9
+ import { DelegatedTokenCredential } from '../../auth/delegatedTokenCredential'
10
+ import { Errors } from '../../errorHelper'
8
11
  import { TokenResponse } from '../../oauth'
9
12
  import { TurnContext } from '../../turnContext'
10
13
  import { TurnState } from '../turnState'
11
14
  import { AuthorizationManager } from './authorizationManager'
12
15
  import { AuthorizationHandlerTokenOptions } from './types'
13
- import { Errors } from '../../errorHelper'
14
16
 
15
17
  const logger = debug('agents:authorization')
16
18
 
17
19
  export interface Authorization {
18
20
  getToken(context: TurnContext, authHandlerId: string): Promise<TokenResponse>
21
+ getTokenAsTokenCredential?(context: TurnContext, authHandlerId: string): TokenCredential
19
22
  exchangeToken(context: TurnContext, scopes: string[], authHandlerId: string): Promise<TokenResponse>
20
23
  exchangeToken(context: TurnContext, authHandlerId: string, options?: AuthorizationHandlerTokenOptions): Promise<TokenResponse>
24
+ exchangeTokenAsTokenCredential?(context: TurnContext, authHandlerId: string, options?: AuthorizationHandlerTokenOptions): TokenCredential
21
25
  signOut(context: TurnContext, state: TurnState, authHandlerId?: string): Promise<void>
22
26
  onSignInSuccess(handler: (context: TurnContext, state: TurnState, authHandlerId?: string) => Promise<void>): void
23
27
  onSignInFailure(handler: (context: TurnContext, state: TurnState, authHandlerId?: string, errorMessage?: string) => Promise<void>): void
@@ -75,6 +79,31 @@ export class UserAuthorization implements Authorization {
75
79
  return { token }
76
80
  }
77
81
 
82
+ /**
83
+ * Creates a token credential backed by the current turn's user token.
84
+ *
85
+ * @param context - The context object for the current turn.
86
+ * @param authHandlerId - ID of the auth handler to use.
87
+ * @returns A {@link TokenCredential} that resolves to the current turn's user token.
88
+ * @throws {Error} If the auth handler is not configured.
89
+ *
90
+ * @remarks
91
+ * The returned credential is scoped to this `context` and should only be used during the
92
+ * current turn. Do not cache it or pass it to a client that outlives the turn; create a new
93
+ * credential in each turn instead.
94
+ *
95
+ * @example
96
+ * ```typescript
97
+ * const credential = auth.getTokenAsTokenCredential(context, 'microsoft');
98
+ * const client = new SomeAzureClient(endpoint, credential);
99
+ * ```
100
+ *
101
+ * @public
102
+ */
103
+ public getTokenAsTokenCredential (context: TurnContext, authHandlerId: string): TokenCredential {
104
+ return new DelegatedTokenCredential(async () => await this.getToken(context, authHandlerId))
105
+ }
106
+
78
107
  /**
79
108
  * @deprecated
80
109
  * Exchanges a token for a new token with different scopes.
@@ -153,6 +182,42 @@ export class UserAuthorization implements Authorization {
153
182
  throw ExceptionHelper.generateException(Error, Errors.InvalidExchangeTokenParameters)
154
183
  }
155
184
 
185
+ /**
186
+ * Creates a token credential that exchanges the user token for requested scopes during the current turn.
187
+ *
188
+ * @param context - The context object for the current turn.
189
+ * @param authHandlerId - ID of the auth handler to use.
190
+ * @param options - Optional token options. If `connection` and `scopes` are NOT provided, the auth handler's
191
+ * configured `obo` options are used. Provide `options` only to override them for a specific credential.
192
+ * @returns A {@link TokenCredential} that exchanges the current turn's user token for the requested scopes.
193
+ * @throws {Error} If the auth handler is not configured.
194
+ *
195
+ * @remarks
196
+ * The returned credential is scoped to this `context` and should only be used during the current turn.
197
+ * Do not cache it or pass it to a client that outlives the turn; create a new credential in each turn instead.
198
+ * Scopes requested from the credential (via `TokenCredential.getToken`) are combined with `options.scopes`,
199
+ * and duplicate scopes are removed.
200
+ *
201
+ * @example
202
+ * ```typescript
203
+ * const credential = auth.exchangeTokenAsTokenCredential(
204
+ * context,
205
+ * 'microsoft',
206
+ * { connection: 'oboConnection', scopes: ['https://graph.microsoft.com/.default'] }
207
+ * );
208
+ * const client = new SomeAzureClient(endpoint, credential);
209
+ * ```
210
+ *
211
+ * @public
212
+ */
213
+ public exchangeTokenAsTokenCredential (context: TurnContext, authHandlerId: string, options?: AuthorizationHandlerTokenOptions): TokenCredential {
214
+ return new DelegatedTokenCredential(async (scopes) => {
215
+ const scopeSet = new Set([...scopes, ...(options?.scopes ?? [])])
216
+ const mergedScopes = Array.from(scopeSet)
217
+ return await this.exchangeToken(context, authHandlerId, { connection: options?.connection, scopes: mergedScopes })
218
+ })
219
+ }
220
+
156
221
  /**
157
222
  * Signs out the current user.
158
223
  *