@microsoft/agents-hosting 0.1.49 → 0.2.8-g3bf5832077

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 (137) hide show
  1. package/dist/src/activityWireCompat.d.ts +19 -0
  2. package/dist/src/activityWireCompat.js +49 -0
  3. package/dist/src/activityWireCompat.js.map +1 -0
  4. package/dist/src/agent-client/agentClient.d.ts +8 -2
  5. package/dist/src/agent-client/agentClient.js +7 -10
  6. package/dist/src/agent-client/agentClient.js.map +1 -1
  7. package/dist/src/agent-client/{expressApi.d.ts → agentResponseHandler.d.ts} +2 -1
  8. package/dist/src/agent-client/{expressApi.js → agentResponseHandler.js} +16 -12
  9. package/dist/src/agent-client/agentResponseHandler.js.map +1 -0
  10. package/dist/src/agent-client/index.d.ts +1 -1
  11. package/dist/src/agent-client/index.js +1 -1
  12. package/dist/src/agent-client/index.js.map +1 -1
  13. package/dist/src/app/agentApplication.d.ts +9 -8
  14. package/dist/src/app/agentApplication.js +17 -8
  15. package/dist/src/app/agentApplication.js.map +1 -1
  16. package/dist/src/app/{applicationBuilder.d.ts → agentApplicationBuilder.d.ts} +6 -6
  17. package/dist/src/app/{applicationBuilder.js → agentApplicationBuilder.js} +4 -4
  18. package/dist/src/app/agentApplicationBuilder.js.map +1 -0
  19. package/dist/src/app/{applicationOptions.d.ts → agentApplicationOptions.d.ts} +3 -3
  20. package/dist/src/app/{applicationOptions.js → agentApplicationOptions.js} +1 -1
  21. package/dist/src/app/agentApplicationOptions.js.map +1 -0
  22. package/dist/src/app/index.d.ts +4 -3
  23. package/dist/src/app/index.js +4 -3
  24. package/dist/src/app/index.js.map +1 -1
  25. package/dist/src/app/oauth/userIdentity.d.ts +43 -0
  26. package/dist/src/app/oauth/userIdentity.js +54 -0
  27. package/dist/src/app/oauth/userIdentity.js.map +1 -0
  28. package/dist/src/app/turnState.d.ts +1 -1
  29. package/dist/src/app/turnState.js +2 -2
  30. package/dist/src/app/turnState.js.map +1 -1
  31. package/dist/src/app/turnStateProperty.d.ts +40 -0
  32. package/dist/src/app/turnStateProperty.js +57 -0
  33. package/dist/src/app/turnStateProperty.js.map +1 -0
  34. package/dist/src/auth/authConfiguration.d.ts +21 -2
  35. package/dist/src/auth/authConfiguration.js +23 -4
  36. package/dist/src/auth/authConfiguration.js.map +1 -1
  37. package/dist/src/auth/jwt-middleware.js +2 -1
  38. package/dist/src/auth/jwt-middleware.js.map +1 -1
  39. package/dist/src/auth/msalTokenProvider.js +1 -1
  40. package/dist/src/auth/msalTokenProvider.js.map +1 -1
  41. package/dist/src/cards/cardFactory.d.ts +8 -0
  42. package/dist/src/cards/cardFactory.js +22 -1
  43. package/dist/src/cards/cardFactory.js.map +1 -1
  44. package/dist/src/cloudAdapter.d.ts +1 -2
  45. package/dist/src/cloudAdapter.js +7 -2
  46. package/dist/src/cloudAdapter.js.map +1 -1
  47. package/dist/src/connector-client/connectorClient.d.ts +3 -2
  48. package/dist/src/connector-client/connectorClient.js +15 -3
  49. package/dist/src/connector-client/connectorClient.js.map +1 -1
  50. package/dist/src/connector-client/index.d.ts +0 -1
  51. package/dist/src/connector-client/index.js +0 -1
  52. package/dist/src/connector-client/index.js.map +1 -1
  53. package/dist/src/getProductInfo.d.ts +1 -0
  54. package/dist/src/getProductInfo.js +11 -0
  55. package/dist/src/getProductInfo.js.map +1 -0
  56. package/dist/src/index.d.ts +2 -1
  57. package/dist/src/index.js +2 -1
  58. package/dist/src/index.js.map +1 -1
  59. package/dist/src/oauth/index.d.ts +3 -4
  60. package/dist/src/oauth/index.js +3 -4
  61. package/dist/src/oauth/index.js.map +1 -1
  62. package/dist/src/oauth/{oauthCard.d.ts → oAuthCard.d.ts} +1 -2
  63. package/dist/src/oauth/{oauthCard.js → oAuthCard.js} +1 -1
  64. package/dist/src/oauth/oAuthCard.js.map +1 -0
  65. package/dist/src/oauth/oAuthFlow.d.ts +47 -0
  66. package/dist/src/oauth/oAuthFlow.js +158 -0
  67. package/dist/src/oauth/oAuthFlow.js.map +1 -0
  68. package/dist/src/oauth/signingResource.d.ts +27 -3
  69. package/dist/src/oauth/tokenResponse.d.ts +29 -0
  70. package/dist/src/oauth/tokenResponse.js +25 -0
  71. package/dist/src/oauth/tokenResponse.js.map +1 -0
  72. package/dist/src/oauth/userTokenClient.d.ts +4 -3
  73. package/dist/src/oauth/userTokenClient.js +23 -13
  74. package/dist/src/oauth/userTokenClient.js.map +1 -1
  75. package/dist/src/state/agentState.d.ts +8 -3
  76. package/dist/src/state/agentState.js +17 -6
  77. package/dist/src/state/agentState.js.map +1 -1
  78. package/dist/src/state/agentStatePropertyAccesor.d.ts +58 -5
  79. package/dist/src/state/agentStatePropertyAccesor.js +6 -6
  80. package/dist/src/state/agentStatePropertyAccesor.js.map +1 -1
  81. package/package.json +3 -6
  82. package/src/activityWireCompat.ts +45 -0
  83. package/src/agent-client/agentClient.ts +21 -13
  84. package/src/agent-client/{expressApi.ts → agentResponseHandler.ts} +20 -12
  85. package/src/agent-client/index.ts +1 -1
  86. package/src/app/agentApplication.ts +24 -15
  87. package/src/app/{applicationBuilder.ts → agentApplicationBuilder.ts} +5 -5
  88. package/src/app/{applicationOptions.ts → agentApplicationOptions.ts} +3 -3
  89. package/src/app/index.ts +4 -3
  90. package/src/app/oauth/userIdentity.ts +78 -0
  91. package/src/app/turnState.ts +2 -2
  92. package/src/app/turnStateProperty.ts +72 -0
  93. package/src/auth/authConfiguration.ts +23 -4
  94. package/src/auth/jwt-middleware.ts +2 -1
  95. package/src/auth/msalTokenProvider.ts +1 -1
  96. package/src/cards/cardFactory.ts +26 -2
  97. package/src/cloudAdapter.ts +8 -4
  98. package/src/connector-client/connectorClient.ts +15 -5
  99. package/src/connector-client/index.ts +0 -1
  100. package/src/getProductInfo.ts +3 -0
  101. package/src/index.ts +2 -2
  102. package/src/oauth/index.ts +3 -4
  103. package/src/oauth/{oauthCard.ts → oAuthCard.ts} +1 -3
  104. package/src/oauth/oAuthFlow.ts +175 -0
  105. package/src/oauth/signingResource.ts +28 -3
  106. package/src/oauth/tokenResponse.ts +43 -0
  107. package/src/oauth/userTokenClient.ts +26 -16
  108. package/src/state/agentState.ts +25 -6
  109. package/src/state/agentStatePropertyAccesor.ts +65 -8
  110. package/dist/src/agent-client/expressApi.js.map +0 -1
  111. package/dist/src/app/applicationBuilder.js.map +0 -1
  112. package/dist/src/app/applicationOptions.js.map +0 -1
  113. package/dist/src/app/oauth/authenticationOptions.d.ts +0 -7
  114. package/dist/src/app/oauth/authenticationOptions.js +0 -7
  115. package/dist/src/app/oauth/authenticationOptions.js.map +0 -1
  116. package/dist/src/app/oauth/webChatOAuthFlowAppStyle.d.ts +0 -11
  117. package/dist/src/app/oauth/webChatOAuthFlowAppStyle.js +0 -85
  118. package/dist/src/app/oauth/webChatOAuthFlowAppStyle.js.map +0 -1
  119. package/dist/src/connector-client/conversationParameters.d.ts +0 -38
  120. package/dist/src/connector-client/conversationParameters.js +0 -7
  121. package/dist/src/connector-client/conversationParameters.js.map +0 -1
  122. package/dist/src/oauth/oauthCard.js.map +0 -1
  123. package/dist/src/oauth/tokenExchangeResource.d.ts +0 -17
  124. package/dist/src/oauth/tokenExchangeResource.js +0 -5
  125. package/dist/src/oauth/tokenExchangeResource.js.map +0 -1
  126. package/dist/src/oauth/tokenPostResource.d.ts +0 -9
  127. package/dist/src/oauth/tokenPostResource.js +0 -5
  128. package/dist/src/oauth/tokenPostResource.js.map +0 -1
  129. package/dist/src/oauth/webChatOAuthFlow.d.ts +0 -41
  130. package/dist/src/oauth/webChatOAuthFlow.js +0 -117
  131. package/dist/src/oauth/webChatOAuthFlow.js.map +0 -1
  132. package/src/app/oauth/authenticationOptions.ts +0 -8
  133. package/src/app/oauth/webChatOAuthFlowAppStyle.ts +0 -90
  134. package/src/connector-client/conversationParameters.ts +0 -40
  135. package/src/oauth/tokenExchangeResource.ts +0 -20
  136. package/src/oauth/tokenPostResource.ts +0 -12
  137. package/src/oauth/webChatOAuthFlow.ts +0 -123
@@ -8,7 +8,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
8
8
  exports.UserTokenClient = void 0;
9
9
  const axios_1 = __importDefault(require("axios"));
10
10
  const logger_1 = require("../logger");
11
- const logger = (0, logger_1.debug)('agents:userTokenClient');
11
+ const activityWireCompat_1 = require("../activityWireCompat");
12
+ const tokenResponse_1 = require("./tokenResponse");
13
+ const getProductInfo_1 = require("../getProductInfo");
14
+ const logger = (0, logger_1.debug)('agents:user-token-client');
12
15
  /**
13
16
  * Client for managing user tokens.
14
17
  */
@@ -22,7 +25,8 @@ class UserTokenClient {
22
25
  const axiosInstance = axios_1.default.create({
23
26
  baseURL,
24
27
  headers: {
25
- Accept: 'application/json'
28
+ Accept: 'application/json',
29
+ 'User-Agent': (0, getProductInfo_1.getProductInfo)(),
26
30
  }
27
31
  });
28
32
  axiosInstance.defaults.headers.common.Authorization = `Bearer ${token}`;
@@ -41,13 +45,16 @@ class UserTokenClient {
41
45
  try {
42
46
  const params = { connectionName, channelId, userId, code };
43
47
  const response = await this.client.get('/api/usertoken/GetToken', { params });
44
- return response.data;
48
+ return { ...response.data, status: tokenResponse_1.TokenRequestStatus.Success };
45
49
  }
46
50
  catch (error) {
47
51
  if (((_a = error.response) === null || _a === void 0 ? void 0 : _a.status) !== 404) {
48
52
  logger.error(error);
49
53
  }
50
- return null;
54
+ return {
55
+ status: tokenResponse_1.TokenRequestStatus.Failed,
56
+ token: undefined
57
+ };
51
58
  }
52
59
  }
53
60
  /**
@@ -61,11 +68,13 @@ class UserTokenClient {
61
68
  try {
62
69
  const params = { userId, connectionName, channelId };
63
70
  const response = await this.client.delete('/api/usertoken/SignOut', { params });
64
- return response.data;
71
+ if (response.status !== 200) {
72
+ throw new Error('Failed to sign out');
73
+ }
65
74
  }
66
75
  catch (error) {
67
76
  logger.error(error);
68
- return null;
77
+ throw new Error('Failed to sign out');
69
78
  }
70
79
  }
71
80
  /**
@@ -78,12 +87,13 @@ class UserTokenClient {
78
87
  async getSignInResource(appId, cnxName, activity) {
79
88
  try {
80
89
  const tokenExchangeState = {
81
- ConnectionName: cnxName,
82
- Conversation: activity.getConversationReference(),
83
- RelatesTo: activity.RelatesTo,
84
- MsAppId: appId
90
+ connectionName: cnxName,
91
+ conversation: activity.getConversationReference(),
92
+ relatesTo: activity.RelatesTo,
93
+ msAppId: appId
85
94
  };
86
- const state = Buffer.from(JSON.stringify(tokenExchangeState)).toString('base64');
95
+ const tokenExchangeStateNormalized = (0, activityWireCompat_1.normalizeTokenExchangeState)(tokenExchangeState);
96
+ const state = Buffer.from(JSON.stringify(tokenExchangeStateNormalized)).toString('base64');
87
97
  const params = { state };
88
98
  const response = await this.client.get('/api/botsignin/GetSignInResource', { params });
89
99
  return response.data;
@@ -105,11 +115,11 @@ class UserTokenClient {
105
115
  try {
106
116
  const params = { userId, connectionName, channelId };
107
117
  const response = await this.client.post('/api/usertoken/exchange', tokenExchangeRequest, { params });
108
- return response.data;
118
+ return { ...response.data, status: tokenResponse_1.TokenRequestStatus.Success };
109
119
  }
110
120
  catch (error) {
111
121
  logger.error(error);
112
- return null;
122
+ return { status: tokenResponse_1.TokenRequestStatus.Failed, token: undefined };
113
123
  }
114
124
  }
115
125
  }
@@ -1 +1 @@
1
- {"version":3,"file":"userTokenClient.js","sourceRoot":"","sources":["../../../src/oauth/userTokenClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"userTokenClient.js","sourceRoot":"","sources":["../../../src/oauth/userTokenClient.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,10 @@ export interface CachedAgentState {
11
11
  };
12
12
  hash: string;
13
13
  }
14
+ export interface CustomKey {
15
+ channelId: string;
16
+ conversationId: string;
17
+ }
14
18
  /**
15
19
  * Manages the state of an Agent.
16
20
  */
@@ -36,14 +40,15 @@ export declare class AgentState {
36
40
  * @param force Whether to force loading the state.
37
41
  * @returns A promise that resolves to the loaded state.
38
42
  */
39
- load(context: TurnContext, force?: boolean): Promise<any>;
43
+ load(context: TurnContext, force?: boolean, customKey?: CustomKey): Promise<any>;
40
44
  /**
41
45
  * Saves the state to storage.
42
46
  * @param context The turn context.
43
47
  * @param force Whether to force saving the state.
44
48
  * @returns A promise that resolves when the save operation is complete.
45
49
  */
46
- saveChanges(context: TurnContext, force?: boolean): Promise<void>;
50
+ saveChanges(context: TurnContext, force?: boolean, customKey?: CustomKey): Promise<void>;
51
+ private getStorageOrCustomKey;
47
52
  /**
48
53
  * Clears the state from the turn context.
49
54
  * @param context The turn context.
@@ -55,7 +60,7 @@ export declare class AgentState {
55
60
  * @param context The turn context.
56
61
  * @returns A promise that resolves when the delete operation is complete.
57
62
  */
58
- delete(context: TurnContext): Promise<void>;
63
+ delete(context: TurnContext, customKey?: CustomKey): Promise<void>;
59
64
  /**
60
65
  * Gets the state from the turn context.
61
66
  * @param context The turn context.
@@ -51,10 +51,10 @@ class AgentState {
51
51
  * @param force Whether to force loading the state.
52
52
  * @returns A promise that resolves to the loaded state.
53
53
  */
54
- async load(context, force = false) {
54
+ async load(context, force = false, customKey) {
55
55
  const cached = context.turnState.get(this.stateKey);
56
56
  if (force || !cached || !cached.state) {
57
- const key = await this.storageKey(context);
57
+ const key = await this.getStorageOrCustomKey(customKey, context);
58
58
  logger.info(`Reading storage with key ${key}`);
59
59
  const storedItem = await this.storage.read([key]);
60
60
  const state = storedItem[key] || {};
@@ -70,7 +70,7 @@ class AgentState {
70
70
  * @param force Whether to force saving the state.
71
71
  * @returns A promise that resolves when the save operation is complete.
72
72
  */
73
- async saveChanges(context, force = false) {
73
+ async saveChanges(context, force = false, customKey) {
74
74
  let cached = context.turnState.get(this.stateKey);
75
75
  if (force || (cached && cached.hash !== this.calculateChangeHash(cached === null || cached === void 0 ? void 0 : cached.state))) {
76
76
  if (!cached) {
@@ -78,7 +78,7 @@ class AgentState {
78
78
  }
79
79
  cached.state.eTag = '*';
80
80
  const changes = {};
81
- const key = await this.storageKey(context);
81
+ const key = await this.getStorageOrCustomKey(customKey, context);
82
82
  changes[key] = cached.state;
83
83
  logger.info(`Writing storage with key ${key}`);
84
84
  await this.storage.write(changes);
@@ -86,6 +86,17 @@ class AgentState {
86
86
  context.turnState.set(this.stateKey, cached);
87
87
  }
88
88
  }
89
+ async getStorageOrCustomKey(customKey, context) {
90
+ let key;
91
+ if (customKey && customKey.channelId && customKey.conversationId) {
92
+ // TODO check ConversationState.ts line 40. This line below should follow the same pattern
93
+ key = `${customKey.channelId}/conversations/${customKey.conversationId}`;
94
+ }
95
+ else {
96
+ key = await this.storageKey(context);
97
+ }
98
+ return key;
99
+ }
89
100
  /**
90
101
  * Clears the state from the turn context.
91
102
  * @param context The turn context.
@@ -100,11 +111,11 @@ class AgentState {
100
111
  * @param context The turn context.
101
112
  * @returns A promise that resolves when the delete operation is complete.
102
113
  */
103
- async delete(context) {
114
+ async delete(context, customKey) {
104
115
  if (context.turnState.has(this.stateKey)) {
105
116
  context.turnState.delete(this.stateKey);
106
117
  }
107
- const key = await this.storageKey(context);
118
+ const key = await this.getStorageOrCustomKey(customKey, context);
108
119
  logger.info(`Deleting storage with key ${key}`);
109
120
  await this.storage.delete([key]);
110
121
  }
@@ -1 +1 @@
1
- {"version":3,"file":"agentState.js","sourceRoot":"","sources":["../../../src/state/agentState.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agentState.js","sourceRoot":"","sources":["../../../src/state/agentState.ts"],"names":[],"mappings":"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"}
@@ -3,11 +3,64 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { TurnContext } from '../turnContext';
6
- import { AgentState } from './agentState';
6
+ import { AgentState, CustomKey } from './agentState';
7
+ export interface StatePropertyAccessor<T = any> {
8
+ /**
9
+ * Deletes the persisted property from its backing storage object.
10
+ *
11
+ * @remarks
12
+ * The properties backing storage object SHOULD be loaded into memory on first access.
13
+ *
14
+ * ```JavaScript
15
+ * await myProperty.delete(context);
16
+ * ```
17
+ * @param context Context for the current turn of conversation with the user.
18
+ */
19
+ delete(context: TurnContext): Promise<void>;
20
+ /**
21
+ * Reads a persisted property from its backing storage object.
22
+ *
23
+ * @remarks
24
+ * The properties backing storage object SHOULD be loaded into memory on first access.
25
+ *
26
+ * If the property does not currently exist on the storage object and a `defaultValue` has been
27
+ * specified, a clone of the `defaultValue` SHOULD be copied to the storage object. If a
28
+ * `defaultValue` has not been specified then a value of `undefined` SHOULD be returned.
29
+ *
30
+ * ```JavaScript
31
+ * const value = await myProperty.get(context, { count: 0 });
32
+ * ```
33
+ * @param context Context for the current turn of conversation with the user.
34
+ */
35
+ get(context: TurnContext): Promise<T | undefined>;
36
+ /**
37
+ * Reads a persisted property from its backing storage object.
38
+ *
39
+ * @param context Context for the current turn of conversation with the user.
40
+ * @param defaultValue (Optional) default value to copy to the backing storage object if the property isn't found.
41
+ */
42
+ get(context: TurnContext, defaultValue: T): Promise<T>;
43
+ /**
44
+ * Assigns a new value to the properties backing storage object.
45
+ *
46
+ * @remarks
47
+ * The properties backing storage object SHOULD be loaded into memory on first access.
48
+ *
49
+ * Depending on the state systems implementation, an additional step may be required to
50
+ * persist the actual changes to disk.
51
+ *
52
+ * ```JavaScript
53
+ * await myProperty.set(context, value);
54
+ * ```
55
+ * @param context Context for the current turn of conversation with the user.
56
+ * @param value Value to assign.
57
+ */
58
+ set(context: TurnContext, value: T): Promise<void>;
59
+ }
7
60
  /**
8
61
  * Provides access to an Agent state property.
9
62
  */
10
- export declare class AgentStatePropertyAccessor<T = any> {
63
+ export declare class AgentStatePropertyAccessor<T = any> implements StatePropertyAccessor<T> {
11
64
  protected readonly state: AgentState;
12
65
  readonly name: string;
13
66
  /**
@@ -21,19 +74,19 @@ export declare class AgentStatePropertyAccessor<T = any> {
21
74
  * @param context The turn context.
22
75
  * @returns A promise that resolves when the delete operation is complete.
23
76
  */
24
- delete(context: TurnContext): Promise<void>;
77
+ delete(context: TurnContext, customKey?: CustomKey): Promise<void>;
25
78
  /**
26
79
  * Gets the value of the property from the state.
27
80
  * @param context The turn context.
28
81
  * @param defaultValue The default value to return if the property is not found.
29
82
  * @returns A promise that resolves to the value of the property.
30
83
  */
31
- get(context: TurnContext, defaultValue?: T): Promise<T>;
84
+ get(context: TurnContext, defaultValue?: T, customKey?: CustomKey): Promise<T>;
32
85
  /**
33
86
  * Sets the value of the property in the state.
34
87
  * @param context The turn context.
35
88
  * @param value The value to set.
36
89
  * @returns A promise that resolves when the set operation is complete.
37
90
  */
38
- set(context: TurnContext, value: T): Promise<void>;
91
+ set(context: TurnContext, value: T, customKey?: CustomKey): Promise<void>;
39
92
  }
@@ -23,8 +23,8 @@ class AgentStatePropertyAccessor {
23
23
  * @param context The turn context.
24
24
  * @returns A promise that resolves when the delete operation is complete.
25
25
  */
26
- async delete(context) {
27
- const obj = await this.state.load(context);
26
+ async delete(context, customKey) {
27
+ const obj = await this.state.load(context, false, customKey);
28
28
  if (Object.prototype.hasOwnProperty.call(obj, this.name)) {
29
29
  delete obj[this.name];
30
30
  }
@@ -35,8 +35,8 @@ class AgentStatePropertyAccessor {
35
35
  * @param defaultValue The default value to return if the property is not found.
36
36
  * @returns A promise that resolves to the value of the property.
37
37
  */
38
- async get(context, defaultValue) {
39
- const obj = await this.state.load(context);
38
+ async get(context, defaultValue, customKey) {
39
+ const obj = await this.state.load(context, false, customKey);
40
40
  if (!Object.prototype.hasOwnProperty.call(obj, this.name) && defaultValue !== undefined) {
41
41
  const clone = typeof defaultValue === 'object' || Array.isArray(defaultValue)
42
42
  ? JSON.parse(JSON.stringify(defaultValue))
@@ -51,8 +51,8 @@ class AgentStatePropertyAccessor {
51
51
  * @param value The value to set.
52
52
  * @returns A promise that resolves when the set operation is complete.
53
53
  */
54
- async set(context, value) {
55
- const obj = await this.state.load(context);
54
+ async set(context, value, customKey) {
55
+ const obj = await this.state.load(context, false, customKey);
56
56
  obj[this.name] = value;
57
57
  }
58
58
  }
@@ -1 +1 @@
1
- {"version":3,"file":"agentStatePropertyAccesor.js","sourceRoot":"","sources":["../../../src/state/agentStatePropertyAccesor.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAKH;;GAEG;AACH,MAAa,0BAA0B;IACrC;;;;OAIG;IACH,YAAgC,KAAiB,EAAkB,IAAY;QAA/C,UAAK,GAAL,KAAK,CAAY;QAAkB,SAAI,GAAJ,IAAI,CAAQ;IAAI,CAAC;IAEpF;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAE,OAAoB;QAChC,MAAM,GAAG,GAAQ,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC/C,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzD,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACvB,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,GAAG,CAAE,OAAoB,EAAE,YAAgB;QAC/C,MAAM,GAAG,GAAQ,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC/C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YACxF,MAAM,KAAK,GACT,OAAO,YAAY,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;gBAC7D,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;gBAC1C,CAAC,CAAC,YAAY,CAAA;YAClB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAA;QACxB,CAAC;QAED,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACvB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,GAAG,CAAE,OAAoB,EAAE,KAAQ;QACvC,MAAM,GAAG,GAAQ,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC/C,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAA;IACxB,CAAC;CACF;AAjDD,gEAiDC"}
1
+ {"version":3,"file":"agentStatePropertyAccesor.js","sourceRoot":"","sources":["../../../src/state/agentStatePropertyAccesor.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AA8DH;;GAEG;AACH,MAAa,0BAA0B;IACrC;;;;OAIG;IACH,YAAgC,KAAiB,EAAkB,IAAY;QAA/C,UAAK,GAAL,KAAK,CAAY;QAAkB,SAAI,GAAJ,IAAI,CAAQ;IAAI,CAAC;IAEpF;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAE,OAAoB,EAAE,SAAqB;QACvD,MAAM,GAAG,GAAQ,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;QACjE,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzD,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACvB,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,GAAG,CAAE,OAAoB,EAAE,YAAgB,EAAE,SAAqB;QACtE,MAAM,GAAG,GAAQ,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;QACjE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YACxF,MAAM,KAAK,GACT,OAAO,YAAY,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;gBAC7D,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;gBAC1C,CAAC,CAAC,YAAY,CAAA;YAClB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAA;QACxB,CAAC;QAED,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACvB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,GAAG,CAAE,OAAoB,EAAE,KAAQ,EAAE,SAAqB;QAC9D,MAAM,GAAG,GAAQ,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;QACjE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAA;IACxB,CAAC;CACF;AAjDD,gEAiDC"}
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": "0.1.49",
4
+ "version": "0.2.8-g3bf5832077",
5
5
  "homepage": "https://github.com/microsoft/Agents-for-js",
6
6
  "repository": {
7
7
  "type": "git",
@@ -19,16 +19,13 @@
19
19
  "main": "dist/src/index.js",
20
20
  "types": "dist/src/index.d.ts",
21
21
  "dependencies": {
22
- "@microsoft/agents-activity": "0.1.49",
23
- "@azure/msal-node": "^3.4.1",
22
+ "@microsoft/agents-activity": "0.2.8-g3bf5832077",
23
+ "@azure/msal-node": "^3.5.1",
24
24
  "jsonwebtoken": "^9.0.2",
25
25
  "jwks-rsa": "^3.2.0",
26
26
  "axios": "^1.8.2",
27
27
  "debug": "^4.3.7"
28
28
  },
29
- "devDependencies": {
30
- "@types/express": "^5.0.1"
31
- },
32
29
  "license": "MIT",
33
30
  "files": [
34
31
  "README.md",
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @private
3
+ * Normalizes an incoming payload by converting the `bot` property in `relatesTo` to `agent`.
4
+ * This ensures compatibility with the activity wire protocol.
5
+ *
6
+ * @param payload - The incoming payload object to normalize.
7
+ * @returns The normalized payload object with `bot` replaced by `agent` in `relatesTo`.
8
+ */
9
+ export function normalizeIncomingActivity (payload: any): object {
10
+ if (payload['relatesTo'] && payload['relatesTo']['bot']) {
11
+ const relatesTo = payload['relatesTo']
12
+ const ov = relatesTo['bot']
13
+ delete relatesTo['bot']
14
+ relatesTo['agent'] = ov
15
+ }
16
+ return payload
17
+ }
18
+
19
+ /**
20
+ * @private
21
+ * Normalizes an outgoing payload by converting the `agent` property in `relatesTo` to `bot`.
22
+ * This ensures compatibility with the activity wire protocol.
23
+ *
24
+ * @param payload - The outgoing payload object to normalize.
25
+ * @returns The normalized payload object with `agent` replaced by `bot` in `relatesTo`.
26
+ */
27
+ export function normalizeOutgoingActivity (payload: any): object {
28
+ if (payload['relatesTo'] && payload['relatesTo']['agent']) {
29
+ const relatesTo = payload['relatesTo']
30
+ const ov = relatesTo['agent']
31
+ delete relatesTo['agent']
32
+ relatesTo['bot'] = ov
33
+ }
34
+ return payload
35
+ }
36
+
37
+ export function normalizeTokenExchangeState (payload: any): object {
38
+ if (payload['conversation'] && payload['conversation']['agent']) {
39
+ const conversation = payload['conversation']
40
+ const ov = conversation['agent']
41
+ delete conversation['agent']
42
+ conversation['bot'] = ov
43
+ }
44
+ return payload
45
+ }
@@ -1,8 +1,9 @@
1
1
  import { AuthConfiguration, MsalTokenProvider } from '../auth'
2
- import { Activity, RoleTypes } from '@microsoft/agents-activity'
2
+ import { Activity, ConversationReference, RoleTypes } from '@microsoft/agents-activity'
3
3
  import { v4 } from 'uuid'
4
4
  import { debug } from '../logger'
5
- import { MemoryStorage, StoreItem } from '../storage'
5
+ import { ConversationState } from '../state'
6
+ import { TurnContext } from '../turnContext'
6
7
 
7
8
  const logger = debug('agents:agent-client')
8
9
 
@@ -12,6 +13,11 @@ export interface AgentClientConfig {
12
13
  serviceUrl: string
13
14
  }
14
15
 
16
+ export interface ConversationData {
17
+ nameRequested: boolean
18
+ conversationReference: ConversationReference
19
+ }
20
+
15
21
  export class AgentClient {
16
22
  agentClientConfig: AgentClientConfig
17
23
 
@@ -19,7 +25,7 @@ export class AgentClient {
19
25
  this.agentClientConfig = this.loadAgentClientConfig(agentConfigKey)
20
26
  }
21
27
 
22
- public async postActivity (activity: Activity, authConfig: AuthConfiguration): Promise<string> {
28
+ public async postActivity (activity: Activity, authConfig: AuthConfiguration, conversationState: ConversationState, context: TurnContext): Promise<string> {
23
29
  const activityCopy = activity.clone()
24
30
  activityCopy.serviceUrl = this.agentClientConfig.serviceUrl
25
31
  activityCopy.recipient = { ...activityCopy.recipient, role: RoleTypes.Skill }
@@ -35,20 +41,21 @@ export class AgentClient {
35
41
  }
36
42
  activityCopy.conversation!.id = v4()
37
43
 
38
- const memory = MemoryStorage.getSingleInstance()
39
- const changes: StoreItem = {} as StoreItem
40
- changes[activityCopy.conversation!.id] = {
41
- conversationReference: activity.getConversationReference()
42
- }
43
- await memory.write(changes)
44
- const memoryChanges = JSON.stringify(changes)
45
- logger.debug('memoryChanges: ', memoryChanges)
44
+ const conversationDataAccessor = conversationState.createProperty<ConversationData>(activityCopy.conversation!.id)
45
+ const convRef = await conversationDataAccessor.set(context,
46
+ { conversationReference: activity.getConversationReference(), nameRequested: false },
47
+ { channelId: activityCopy.channelId!, conversationId: activityCopy.conversation!.id }
48
+ )
49
+
50
+ const stateChanges = JSON.stringify(convRef)
51
+ logger.debug('stateChanges: ', stateChanges)
46
52
 
47
53
  const authProvider = new MsalTokenProvider()
48
54
  const token = await authProvider.getAccessToken(authConfig, this.agentClientConfig.clientId)
49
55
 
50
56
  logger.debug('agent request: ', activityCopy)
51
57
 
58
+ await conversationState.saveChanges(context, false, { channelId: activityCopy.channelId!, conversationId: activityCopy.conversation!.id })
52
59
  const response = await fetch(this.agentClientConfig.endPoint, {
53
60
  method: 'POST',
54
61
  headers: {
@@ -59,6 +66,7 @@ export class AgentClient {
59
66
  body: JSON.stringify(activityCopy)
60
67
  })
61
68
  if (!response.ok) {
69
+ await conversationDataAccessor.delete(context, { channelId: activityCopy.channelId!, conversationId: activityCopy.conversation!.id })
62
70
  throw new Error(`Failed to post activity to agent: ${response.statusText}`)
63
71
  }
64
72
  return response.statusText
@@ -67,8 +75,8 @@ export class AgentClient {
67
75
  private loadAgentClientConfig (agentName: string): AgentClientConfig {
68
76
  if (agentName) {
69
77
  if (process.env[`${agentName}_endpoint`] !== undefined &&
70
- process.env[`${agentName}_clientId`] !== undefined &&
71
- process.env[`${agentName}_serviceUrl`] !== undefined) {
78
+ process.env[`${agentName}_clientId`] !== undefined &&
79
+ process.env[`${agentName}_serviceUrl`] !== undefined) {
72
80
  return {
73
81
  endPoint: process.env[`${agentName}_endpoint`]!,
74
82
  clientId: process.env[`${agentName}_clientId`]!,
@@ -1,34 +1,42 @@
1
- import { Activity, ActivityTypes } from '@microsoft/agents-activity'
1
+ import { Activity, ActivityTypes, ConversationReference } from '@microsoft/agents-activity'
2
2
  import { ActivityHandler } from '../activityHandler'
3
3
  import { CloudAdapter } from '../cloudAdapter'
4
4
  import { Request, Response, Application } from 'express'
5
- import { MemoryStorage } from '../storage'
6
5
  import { TurnContext } from '../turnContext'
7
6
  import { v4 } from 'uuid'
7
+ import { normalizeIncomingActivity } from '../activityWireCompat'
8
8
  import { debug } from '../logger'
9
+ import { ConversationState } from '../state'
9
10
 
10
11
  const logger = debug('agents:agent-client')
11
12
 
12
- export const configureResponseController = (app: Application, adapter: CloudAdapter, agent: ActivityHandler) => {
13
- app.post('/api/botresponse/v3/conversations/:conversationId/activities/:activityId', handleResponse(adapter, agent))
13
+ interface ConversationReferenceState {
14
+ conversationReference: ConversationReference
14
15
  }
15
16
 
16
- const handleResponse = (adapter: CloudAdapter, handler: ActivityHandler) => async (req: Request, res: Response) => {
17
- const activity = Activity.fromObject(req.body!)
17
+ export const configureResponseController = (app: Application, adapter: CloudAdapter, agent: ActivityHandler, conversationState: ConversationState) => {
18
+ app.post('/api/agentresponse/v3/conversations/:conversationId/activities/:activityId', handleResponse(adapter, agent, conversationState))
19
+ }
20
+
21
+ const handleResponse = (adapter: CloudAdapter, handler: ActivityHandler, conversationState: ConversationState) => async (req: Request, res: Response) => {
22
+ const incoming = normalizeIncomingActivity(req.body!)
23
+ const activity = Activity.fromObject(incoming)
18
24
 
19
25
  logger.debug('received response: ', activity)
20
26
 
21
- const requestData = await MemoryStorage.getSingleInstance().read([req.params!.conversationId])
22
- const conversationReference = requestData[req.params!.conversationId].conversationReference
23
- logger.debug('memoryChanges: ', requestData)
27
+ const myTurnContext = new TurnContext(adapter, activity)
28
+ const conversationDataAccessor = conversationState.createProperty<ConversationReferenceState>(req.params!.conversationId)
29
+ const conversationRefState = await conversationDataAccessor.get(myTurnContext, undefined, { channelId: activity.channelId!, conversationId: req.params!.conversationId })
24
30
 
31
+ const conversationRef = JSON.stringify(conversationRefState.conversationReference)
32
+ console.log('conversationRef', conversationRef)
25
33
  const callback = async (turnContext: TurnContext) => {
26
- activity.applyConversationReference(conversationReference)
34
+ activity.applyConversationReference(conversationRefState.conversationReference)
27
35
  turnContext.activity.id = req.params!.activityId
28
36
 
29
37
  let response
30
38
  if (activity.type === ActivityTypes.EndOfConversation) {
31
- await MemoryStorage.getSingleInstance().delete([activity.conversation!.id])
39
+ await conversationDataAccessor.delete(turnContext, { channelId: activity.channelId!, conversationId: activity.conversation!.id })
32
40
 
33
41
  applyActivityToTurnContext(turnContext, activity)
34
42
  await handler.run(turnContext)
@@ -40,7 +48,7 @@ const handleResponse = (adapter: CloudAdapter, handler: ActivityHandler) => asyn
40
48
  res.status(200).send(response)
41
49
  }
42
50
 
43
- await adapter.continueConversation(conversationReference, callback, true)
51
+ await adapter.continueConversation(conversationRefState.conversationReference, callback, true)
44
52
  }
45
53
 
46
54
  const applyActivityToTurnContext = (turnContext : TurnContext, activity : Activity) => {
@@ -1,2 +1,2 @@
1
1
  export * from './agentClient'
2
- export * from './expressApi'
2
+ export * from './agentResponseHandler'