@microsoft/agents-hosting 0.1.49 → 0.2.7-gd7a3e9ef95
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/activityWireCompat.d.ts +19 -0
- package/dist/src/activityWireCompat.js +49 -0
- package/dist/src/activityWireCompat.js.map +1 -0
- package/dist/src/agent-client/agentClient.d.ts +8 -2
- package/dist/src/agent-client/agentClient.js +7 -10
- package/dist/src/agent-client/agentClient.js.map +1 -1
- package/dist/src/agent-client/{expressApi.d.ts → agentResponseHandler.d.ts} +2 -1
- package/dist/src/agent-client/{expressApi.js → agentResponseHandler.js} +16 -12
- package/dist/src/agent-client/agentResponseHandler.js.map +1 -0
- package/dist/src/agent-client/index.d.ts +1 -1
- package/dist/src/agent-client/index.js +1 -1
- package/dist/src/agent-client/index.js.map +1 -1
- package/dist/src/app/agentApplication.d.ts +9 -8
- package/dist/src/app/agentApplication.js +17 -8
- package/dist/src/app/agentApplication.js.map +1 -1
- package/dist/src/app/{applicationBuilder.d.ts → agentApplicationBuilder.d.ts} +6 -6
- package/dist/src/app/{applicationBuilder.js → agentApplicationBuilder.js} +4 -4
- package/dist/src/app/agentApplicationBuilder.js.map +1 -0
- package/dist/src/app/{applicationOptions.d.ts → agentApplicationOptions.d.ts} +3 -3
- package/dist/src/app/{applicationOptions.js → agentApplicationOptions.js} +1 -1
- package/dist/src/app/agentApplicationOptions.js.map +1 -0
- package/dist/src/app/index.d.ts +4 -3
- package/dist/src/app/index.js +4 -3
- package/dist/src/app/index.js.map +1 -1
- package/dist/src/app/oauth/userIdentity.d.ts +43 -0
- package/dist/src/app/oauth/userIdentity.js +54 -0
- package/dist/src/app/oauth/userIdentity.js.map +1 -0
- package/dist/src/app/turnState.d.ts +1 -1
- package/dist/src/app/turnState.js +2 -2
- package/dist/src/app/turnState.js.map +1 -1
- package/dist/src/app/turnStateProperty.d.ts +40 -0
- package/dist/src/app/turnStateProperty.js +57 -0
- package/dist/src/app/turnStateProperty.js.map +1 -0
- package/dist/src/auth/authConfiguration.d.ts +21 -2
- package/dist/src/auth/authConfiguration.js +23 -4
- package/dist/src/auth/authConfiguration.js.map +1 -1
- package/dist/src/auth/jwt-middleware.js +2 -1
- package/dist/src/auth/jwt-middleware.js.map +1 -1
- package/dist/src/auth/msalTokenProvider.js +1 -1
- package/dist/src/auth/msalTokenProvider.js.map +1 -1
- package/dist/src/cards/cardFactory.d.ts +8 -0
- package/dist/src/cards/cardFactory.js +22 -1
- package/dist/src/cards/cardFactory.js.map +1 -1
- package/dist/src/cloudAdapter.d.ts +1 -2
- package/dist/src/cloudAdapter.js +7 -2
- package/dist/src/cloudAdapter.js.map +1 -1
- package/dist/src/connector-client/connectorClient.d.ts +3 -2
- package/dist/src/connector-client/connectorClient.js +15 -3
- package/dist/src/connector-client/connectorClient.js.map +1 -1
- package/dist/src/connector-client/index.d.ts +0 -1
- package/dist/src/connector-client/index.js +0 -1
- package/dist/src/connector-client/index.js.map +1 -1
- package/dist/src/getProductInfo.d.ts +1 -0
- package/dist/src/getProductInfo.js +11 -0
- package/dist/src/getProductInfo.js.map +1 -0
- package/dist/src/index.d.ts +2 -1
- package/dist/src/index.js +2 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/oauth/index.d.ts +3 -4
- package/dist/src/oauth/index.js +3 -4
- package/dist/src/oauth/index.js.map +1 -1
- package/dist/src/oauth/{oauthCard.d.ts → oAuthCard.d.ts} +1 -2
- package/dist/src/oauth/{oauthCard.js → oAuthCard.js} +1 -1
- package/dist/src/oauth/oAuthCard.js.map +1 -0
- package/dist/src/oauth/oAuthFlow.d.ts +47 -0
- package/dist/src/oauth/oAuthFlow.js +158 -0
- package/dist/src/oauth/oAuthFlow.js.map +1 -0
- package/dist/src/oauth/signingResource.d.ts +27 -3
- package/dist/src/oauth/tokenResponse.d.ts +29 -0
- package/dist/src/oauth/tokenResponse.js +25 -0
- package/dist/src/oauth/tokenResponse.js.map +1 -0
- package/dist/src/oauth/userTokenClient.d.ts +4 -3
- package/dist/src/oauth/userTokenClient.js +23 -13
- package/dist/src/oauth/userTokenClient.js.map +1 -1
- package/dist/src/state/agentState.d.ts +8 -3
- package/dist/src/state/agentState.js +17 -6
- package/dist/src/state/agentState.js.map +1 -1
- package/dist/src/state/agentStatePropertyAccesor.d.ts +58 -5
- package/dist/src/state/agentStatePropertyAccesor.js +6 -6
- package/dist/src/state/agentStatePropertyAccesor.js.map +1 -1
- package/package.json +3 -6
- package/src/activityWireCompat.ts +45 -0
- package/src/agent-client/agentClient.ts +21 -13
- package/src/agent-client/{expressApi.ts → agentResponseHandler.ts} +20 -12
- package/src/agent-client/index.ts +1 -1
- package/src/app/agentApplication.ts +24 -15
- package/src/app/{applicationBuilder.ts → agentApplicationBuilder.ts} +5 -5
- package/src/app/{applicationOptions.ts → agentApplicationOptions.ts} +3 -3
- package/src/app/index.ts +4 -3
- package/src/app/oauth/userIdentity.ts +78 -0
- package/src/app/turnState.ts +2 -2
- package/src/app/turnStateProperty.ts +72 -0
- package/src/auth/authConfiguration.ts +23 -4
- package/src/auth/jwt-middleware.ts +2 -1
- package/src/auth/msalTokenProvider.ts +1 -1
- package/src/cards/cardFactory.ts +26 -2
- package/src/cloudAdapter.ts +8 -4
- package/src/connector-client/connectorClient.ts +15 -5
- package/src/connector-client/index.ts +0 -1
- package/src/getProductInfo.ts +3 -0
- package/src/index.ts +2 -2
- package/src/oauth/index.ts +3 -4
- package/src/oauth/{oauthCard.ts → oAuthCard.ts} +1 -3
- package/src/oauth/oAuthFlow.ts +175 -0
- package/src/oauth/signingResource.ts +28 -3
- package/src/oauth/tokenResponse.ts +43 -0
- package/src/oauth/userTokenClient.ts +26 -16
- package/src/state/agentState.ts +25 -6
- package/src/state/agentStatePropertyAccesor.ts +65 -8
- package/dist/src/agent-client/expressApi.js.map +0 -1
- package/dist/src/app/applicationBuilder.js.map +0 -1
- package/dist/src/app/applicationOptions.js.map +0 -1
- package/dist/src/app/oauth/authenticationOptions.d.ts +0 -7
- package/dist/src/app/oauth/authenticationOptions.js +0 -7
- package/dist/src/app/oauth/authenticationOptions.js.map +0 -1
- package/dist/src/app/oauth/webChatOAuthFlowAppStyle.d.ts +0 -11
- package/dist/src/app/oauth/webChatOAuthFlowAppStyle.js +0 -85
- package/dist/src/app/oauth/webChatOAuthFlowAppStyle.js.map +0 -1
- package/dist/src/connector-client/conversationParameters.d.ts +0 -38
- package/dist/src/connector-client/conversationParameters.js +0 -7
- package/dist/src/connector-client/conversationParameters.js.map +0 -1
- package/dist/src/oauth/oauthCard.js.map +0 -1
- package/dist/src/oauth/tokenExchangeResource.d.ts +0 -17
- package/dist/src/oauth/tokenExchangeResource.js +0 -5
- package/dist/src/oauth/tokenExchangeResource.js.map +0 -1
- package/dist/src/oauth/tokenPostResource.d.ts +0 -9
- package/dist/src/oauth/tokenPostResource.js +0 -5
- package/dist/src/oauth/tokenPostResource.js.map +0 -1
- package/dist/src/oauth/webChatOAuthFlow.d.ts +0 -41
- package/dist/src/oauth/webChatOAuthFlow.js +0 -117
- package/dist/src/oauth/webChatOAuthFlow.js.map +0 -1
- package/src/app/oauth/authenticationOptions.ts +0 -8
- package/src/app/oauth/webChatOAuthFlowAppStyle.ts +0 -90
- package/src/connector-client/conversationParameters.ts +0 -40
- package/src/oauth/tokenExchangeResource.ts +0 -20
- package/src/oauth/tokenPostResource.ts +0 -12
- 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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
90
|
+
connectionName: cnxName,
|
|
91
|
+
conversation: activity.getConversationReference(),
|
|
92
|
+
relatesTo: activity.RelatesTo,
|
|
93
|
+
msAppId: appId
|
|
85
94
|
};
|
|
86
|
-
const
|
|
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
|
|
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":";AAAA,4DAA4D;AAC5D,kCAAkC;;;;;;AAElC,kDAA4C;AAG5C,sCAAiC;
|
|
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.
|
|
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.
|
|
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.
|
|
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":";AAAA;;;GAGG;;;AAIH,6CAAwC;AACxC,2EAAwE;AACxE,sCAAiC;AAEjC,MAAM,MAAM,GAAG,IAAA,cAAK,EAAC,cAAc,CAAC,CAAA;
|
|
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;;;
|
|
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.
|
|
4
|
+
"version": "0.2.7-gd7a3e9ef95",
|
|
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.
|
|
23
|
-
"@azure/msal-node": "^3.
|
|
22
|
+
"@microsoft/agents-activity": "0.2.7-gd7a3e9ef95",
|
|
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 {
|
|
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
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
const
|
|
45
|
-
logger.debug('
|
|
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
|
-
|
|
71
|
-
|
|
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
|
-
|
|
13
|
-
|
|
13
|
+
interface ConversationReferenceState {
|
|
14
|
+
conversationReference: ConversationReference
|
|
14
15
|
}
|
|
15
16
|
|
|
16
|
-
const
|
|
17
|
-
|
|
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
|
|
22
|
-
const
|
|
23
|
-
|
|
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
|
|
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 './
|
|
2
|
+
export * from './agentResponseHandler'
|