@microsoft/agents-copilotstudio-client 0.5.19-gc1e2ea1096 → 0.6.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/src/browser.mjs +9 -9
- package/dist/src/browser.mjs.map +4 -4
- package/dist/src/copilotStudioClient.d.ts +8 -4
- package/dist/src/copilotStudioClient.js +34 -17
- package/dist/src/copilotStudioClient.js.map +1 -1
- package/dist/src/copilotStudioWebChat.d.ts +146 -28
- package/dist/src/copilotStudioWebChat.js +157 -27
- package/dist/src/copilotStudioWebChat.js.map +1 -1
- package/dist/src/powerPlatformEnvironment.js +13 -3
- package/dist/src/powerPlatformEnvironment.js.map +1 -1
- package/package.json +3 -4
- package/src/copilotStudioClient.ts +33 -19
- package/src/copilotStudioWebChat.ts +220 -56
- package/src/powerPlatformEnvironment.ts +14 -3
|
@@ -4,6 +4,10 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { ConnectionSettings } from './connectionSettings';
|
|
6
6
|
import { Activity } from '@microsoft/agents-activity';
|
|
7
|
+
/**
|
|
8
|
+
* Client for interacting with Microsoft Copilot Studio services.
|
|
9
|
+
* Provides functionality to start conversations and send messages to Copilot Studio bots.
|
|
10
|
+
*/
|
|
7
11
|
export declare class CopilotStudioClient {
|
|
8
12
|
/** Header key for conversation ID. */
|
|
9
13
|
private static readonly conversationIdHeaderKey;
|
|
@@ -15,11 +19,11 @@ export declare class CopilotStudioClient {
|
|
|
15
19
|
private readonly settings;
|
|
16
20
|
/** The Axios instance used for HTTP requests. */
|
|
17
21
|
private readonly client;
|
|
18
|
-
/** The logger for debugging. */
|
|
19
|
-
private readonly logger;
|
|
20
22
|
/**
|
|
21
|
-
* Returns the
|
|
22
|
-
*
|
|
23
|
+
* Returns the scope URL needed to connect to Copilot Studio from the connection settings.
|
|
24
|
+
* This is used for authentication token audience configuration.
|
|
25
|
+
* @param settings Copilot Studio connection settings.
|
|
26
|
+
* @returns The scope URL for token audience.
|
|
23
27
|
*/
|
|
24
28
|
static scopeFromSettings: (settings: ConnectionSettings) => string;
|
|
25
29
|
/**
|
|
@@ -12,9 +12,14 @@ const axios_1 = __importDefault(require("axios"));
|
|
|
12
12
|
const powerPlatformEnvironment_1 = require("./powerPlatformEnvironment");
|
|
13
13
|
const agents_activity_1 = require("@microsoft/agents-activity");
|
|
14
14
|
const executeTurnRequest_1 = require("./executeTurnRequest");
|
|
15
|
-
const
|
|
15
|
+
const logger_1 = require("@microsoft/agents-activity/src/logger");
|
|
16
16
|
const package_json_1 = __importDefault(require("@microsoft/agents-copilotstudio-client/package.json"));
|
|
17
17
|
const os_1 = __importDefault(require("os"));
|
|
18
|
+
const logger = (0, logger_1.debug)('copilot-studio:client');
|
|
19
|
+
/**
|
|
20
|
+
* Client for interacting with Microsoft Copilot Studio services.
|
|
21
|
+
* Provides functionality to start conversations and send messages to Copilot Studio bots.
|
|
22
|
+
*/
|
|
18
23
|
class CopilotStudioClient {
|
|
19
24
|
/**
|
|
20
25
|
* Creates an instance of CopilotStudioClient.
|
|
@@ -28,39 +33,39 @@ class CopilotStudioClient {
|
|
|
28
33
|
this.client = axios_1.default.create();
|
|
29
34
|
this.client.defaults.headers.common.Authorization = `Bearer ${token}`;
|
|
30
35
|
this.client.defaults.headers.common['User-Agent'] = CopilotStudioClient.getProductInfo();
|
|
31
|
-
this.logger = (0, debug_1.default)('copilot-studio-client');
|
|
32
36
|
}
|
|
33
37
|
async postRequestAsync(axiosConfig) {
|
|
34
38
|
var _a, _b, _c, _d;
|
|
35
39
|
const activities = [];
|
|
36
|
-
|
|
40
|
+
logger.debug(`>>> SEND TO ${axiosConfig.url}`);
|
|
37
41
|
const response = await this.client(axiosConfig);
|
|
38
42
|
if (this.settings.useExperimentalEndpoint && !((_a = this.settings.directConnectUrl) === null || _a === void 0 ? void 0 : _a.trim())) {
|
|
39
43
|
const islandExperimentalUrl = (_b = response.headers) === null || _b === void 0 ? void 0 : _b[CopilotStudioClient.islandExperimentalUrlHeaderKey];
|
|
40
44
|
if (islandExperimentalUrl) {
|
|
41
45
|
this.settings.directConnectUrl = islandExperimentalUrl;
|
|
42
|
-
|
|
46
|
+
logger.debug(`Island Experimental URL: ${islandExperimentalUrl}`);
|
|
43
47
|
}
|
|
44
48
|
}
|
|
45
49
|
this.conversationId = (_d = (_c = response.headers) === null || _c === void 0 ? void 0 : _c[CopilotStudioClient.conversationIdHeaderKey]) !== null && _d !== void 0 ? _d : '';
|
|
46
50
|
if (this.conversationId) {
|
|
47
|
-
|
|
51
|
+
logger.debug(`Conversation ID: ${this.conversationId}`);
|
|
48
52
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
53
|
+
const sanitizedHeaders = { ...response.headers };
|
|
54
|
+
delete sanitizedHeaders['Authorization'];
|
|
55
|
+
delete sanitizedHeaders[CopilotStudioClient.conversationIdHeaderKey];
|
|
56
|
+
logger.debug('Headers received:', sanitizedHeaders);
|
|
52
57
|
const stream = response.data;
|
|
53
58
|
const reader = stream.pipeThrough(new TextDecoderStream()).getReader();
|
|
54
59
|
let result = '';
|
|
55
60
|
const results = [];
|
|
56
61
|
const processEvents = async ({ done, value }) => {
|
|
57
62
|
if (done) {
|
|
58
|
-
|
|
63
|
+
logger.debug('Stream complete');
|
|
59
64
|
result += value;
|
|
60
65
|
results.push(result);
|
|
61
66
|
return results;
|
|
62
67
|
}
|
|
63
|
-
|
|
68
|
+
logger.info('Agent is typing ...');
|
|
64
69
|
result += value;
|
|
65
70
|
return await processEvents(await reader.read());
|
|
66
71
|
};
|
|
@@ -77,15 +82,15 @@ class CopilotStudioClient {
|
|
|
77
82
|
if (!this.conversationId.trim()) {
|
|
78
83
|
// Did not get it from the header.
|
|
79
84
|
this.conversationId = (_b = (_a = act.conversation) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : '';
|
|
80
|
-
|
|
85
|
+
logger.debug(`Conversation ID: ${this.conversationId}`);
|
|
81
86
|
}
|
|
82
87
|
}
|
|
83
88
|
else {
|
|
84
|
-
|
|
89
|
+
logger.debug(`Activity type: ${act.type}`);
|
|
85
90
|
}
|
|
86
91
|
}
|
|
87
92
|
catch (e) {
|
|
88
|
-
|
|
93
|
+
logger.error('Error: ', e);
|
|
89
94
|
throw e;
|
|
90
95
|
}
|
|
91
96
|
});
|
|
@@ -100,10 +105,15 @@ class CopilotStudioClient {
|
|
|
100
105
|
*/
|
|
101
106
|
static getProductInfo() {
|
|
102
107
|
const version = `CopilotStudioClient.agents-sdk-js/${package_json_1.default.version}`;
|
|
108
|
+
let userAgent;
|
|
103
109
|
if (typeof window !== 'undefined' && window.navigator) {
|
|
104
|
-
|
|
110
|
+
userAgent = `${version} ${navigator.userAgent}`;
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
userAgent = `${version} nodejs/${process.version} ${os_1.default.platform()}-${os_1.default.arch()}/${os_1.default.release()}`;
|
|
105
114
|
}
|
|
106
|
-
|
|
115
|
+
logger.debug(`User-Agent: ${userAgent}`);
|
|
116
|
+
return userAgent;
|
|
107
117
|
}
|
|
108
118
|
/**
|
|
109
119
|
* Starts a new conversation with the Copilot Studio service.
|
|
@@ -111,6 +121,7 @@ class CopilotStudioClient {
|
|
|
111
121
|
* @returns A promise that resolves to the initial activity of the conversation.
|
|
112
122
|
*/
|
|
113
123
|
async startConversationAsync(emitStartConversationEvent = true) {
|
|
124
|
+
var _a;
|
|
114
125
|
const uriStart = (0, powerPlatformEnvironment_1.getCopilotStudioConnectionUrl)(this.settings);
|
|
115
126
|
const body = { emitStartConversationEvent };
|
|
116
127
|
const config = {
|
|
@@ -124,8 +135,10 @@ class CopilotStudioClient {
|
|
|
124
135
|
responseType: 'stream',
|
|
125
136
|
adapter: 'fetch'
|
|
126
137
|
};
|
|
138
|
+
logger.info('Starting conversation ...');
|
|
127
139
|
const values = await this.postRequestAsync(config);
|
|
128
140
|
const act = values[0];
|
|
141
|
+
logger.info(`Conversation '${(_a = act.conversation) === null || _a === void 0 ? void 0 : _a.id}' started. Received ${values.length} activities.`, values);
|
|
129
142
|
return act;
|
|
130
143
|
}
|
|
131
144
|
/**
|
|
@@ -159,7 +172,9 @@ class CopilotStudioClient {
|
|
|
159
172
|
responseType: 'stream',
|
|
160
173
|
adapter: 'fetch'
|
|
161
174
|
};
|
|
175
|
+
logger.info(`Asking question: ${question} ...`);
|
|
162
176
|
const values = await this.postRequestAsync(config);
|
|
177
|
+
logger.info(`Received ${values.length} activities.`, values);
|
|
163
178
|
return values;
|
|
164
179
|
}
|
|
165
180
|
}
|
|
@@ -169,8 +184,10 @@ CopilotStudioClient.conversationIdHeaderKey = 'x-ms-conversationid';
|
|
|
169
184
|
/** Island Header key */
|
|
170
185
|
CopilotStudioClient.islandExperimentalUrlHeaderKey = 'x-ms-d2e-experimental';
|
|
171
186
|
/**
|
|
172
|
-
* Returns the
|
|
173
|
-
*
|
|
187
|
+
* Returns the scope URL needed to connect to Copilot Studio from the connection settings.
|
|
188
|
+
* This is used for authentication token audience configuration.
|
|
189
|
+
* @param settings Copilot Studio connection settings.
|
|
190
|
+
* @returns The scope URL for token audience.
|
|
174
191
|
*/
|
|
175
192
|
CopilotStudioClient.scopeFromSettings = powerPlatformEnvironment_1.getTokenAudience;
|
|
176
193
|
//# sourceMappingURL=copilotStudioClient.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copilotStudioClient.js","sourceRoot":"","sources":["../../src/copilotStudioClient.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;AAGH,kDAAgE;AAChE,yEAA4F;AAC5F,gEAAyF;AACzF,6DAAyD;AACzD,
|
|
1
|
+
{"version":3,"file":"copilotStudioClient.js","sourceRoot":"","sources":["../../src/copilotStudioClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,61 +5,179 @@
|
|
|
5
5
|
import { Activity } from '@microsoft/agents-activity';
|
|
6
6
|
import { Observable, BehaviorSubject } from 'rxjs';
|
|
7
7
|
import { CopilotStudioClient } from './copilotStudioClient';
|
|
8
|
+
/**
|
|
9
|
+
* Configuration settings for the Copilot Studio WebChat connection.
|
|
10
|
+
* These settings control the behavior and appearance of the WebChat interface
|
|
11
|
+
* when connected to the Copilot Studio service.
|
|
12
|
+
*/
|
|
8
13
|
export interface CopilotStudioWebChatSettings {
|
|
9
14
|
/**
|
|
10
|
-
* Whether to show typing indicators in the WebChat.
|
|
11
|
-
*
|
|
15
|
+
* Whether to show typing indicators in the WebChat when the agent is processing a response.
|
|
16
|
+
* When enabled, users will see a typing indicator while waiting for the agent's reply,
|
|
17
|
+
* providing visual feedback that their message is being processed.
|
|
18
|
+
* @default false
|
|
12
19
|
*/
|
|
13
20
|
showTyping?: boolean;
|
|
14
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Represents a connection interface for integrating Copilot Studio with WebChat.
|
|
24
|
+
* This interface provides the necessary methods and observables to facilitate
|
|
25
|
+
* bidirectional communication between a WebChat client and the Copilot Studio service.
|
|
26
|
+
*
|
|
27
|
+
* The connection follows the DirectLine protocol pattern, making it compatible with
|
|
28
|
+
* Microsoft Bot Framework WebChat components.
|
|
29
|
+
*/
|
|
15
30
|
export interface CopilotStudioWebChatConnection {
|
|
16
31
|
/**
|
|
17
|
-
* An observable that emits the connection status.
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
|
|
32
|
+
* An observable that emits the current connection status as numeric values.
|
|
33
|
+
* This allows WebChat clients to monitor and react to connection state changes.
|
|
34
|
+
*
|
|
35
|
+
* Connection status values:
|
|
36
|
+
* - 0: Disconnected - No active connection to the service
|
|
37
|
+
* - 1: Connecting - Attempting to establish connection
|
|
38
|
+
* - 2: Connected - Successfully connected and ready for communication
|
|
39
|
+
*/
|
|
22
40
|
connectionStatus$: BehaviorSubject<number>;
|
|
23
41
|
/**
|
|
24
|
-
* An observable that emits incoming activities.
|
|
25
|
-
*
|
|
42
|
+
* An observable stream that emits incoming activities from the Copilot Studio service.
|
|
43
|
+
* Each activity represents a message, card, or other interactive element sent by the agent.
|
|
44
|
+
*
|
|
45
|
+
* All emitted activities include:
|
|
46
|
+
* - A timestamp indicating when the activity was received
|
|
47
|
+
* - A 'webchat:sequence-id' in their channelData for proper message ordering
|
|
48
|
+
* - Standard Bot Framework Activity properties (type, text, attachments, etc.)
|
|
26
49
|
*/
|
|
27
50
|
activity$: Observable<Partial<Activity>>;
|
|
28
51
|
/**
|
|
29
|
-
* Posts
|
|
30
|
-
*
|
|
31
|
-
*
|
|
52
|
+
* Posts a user activity to the Copilot Studio service and returns an observable
|
|
53
|
+
* that emits the activity ID once the message is successfully sent.
|
|
54
|
+
*
|
|
55
|
+
* The method validates that the activity contains meaningful content and handles
|
|
56
|
+
* the complete message flow including optional typing indicators.
|
|
32
57
|
*
|
|
33
|
-
* @param activity - The activity to
|
|
34
|
-
* @returns An observable that emits the activity ID.
|
|
58
|
+
* @param activity - The user activity to send. Must contain a non-empty text field.
|
|
59
|
+
* @returns An observable that emits the unique activity ID upon successful posting.
|
|
60
|
+
* @throws Error if the activity text is empty or if the connection is not properly initialized.
|
|
35
61
|
*/
|
|
36
62
|
postActivity(activity: Activity): Observable<string>;
|
|
37
63
|
/**
|
|
38
|
-
*
|
|
39
|
-
* This
|
|
64
|
+
* Gracefully terminates the connection to the Copilot Studio service.
|
|
65
|
+
* This method ensures proper cleanup by completing all active observables
|
|
66
|
+
* and releasing associated resources.
|
|
67
|
+
*
|
|
68
|
+
* After calling this method:
|
|
69
|
+
* - The connectionStatus$ observable will be completed
|
|
70
|
+
* - The activity$ observable will stop emitting new activities
|
|
71
|
+
* - No further activities can be posted through this connection
|
|
40
72
|
*/
|
|
41
73
|
end(): void;
|
|
42
74
|
}
|
|
43
75
|
/**
|
|
44
|
-
*
|
|
76
|
+
* A utility class that provides WebChat integration capabilities for Copilot Studio services.
|
|
77
|
+
* This class acts as a bridge between Microsoft Bot Framework WebChat and Copilot Studio,
|
|
78
|
+
* enabling seamless communication through a DirectLine-compatible interface.
|
|
79
|
+
*
|
|
80
|
+
* ## Key Features:
|
|
81
|
+
* - DirectLine protocol compatibility for easy WebChat integration
|
|
82
|
+
* - Real-time bidirectional messaging with Copilot Studio agents
|
|
83
|
+
* - Automatic conversation management and message sequencing
|
|
84
|
+
* - Optional typing indicators for enhanced user experience
|
|
85
|
+
* - Observable-based architecture for reactive programming patterns
|
|
86
|
+
*
|
|
87
|
+
* ## Usage Scenarios:
|
|
88
|
+
* - Embedding Copilot Studio agents in web applications
|
|
89
|
+
* - Creating custom chat interfaces with WebChat components
|
|
90
|
+
* - Building conversational AI experiences with Microsoft's bot ecosystem
|
|
91
|
+
*
|
|
92
|
+
* @example Basic WebChat Integration
|
|
93
|
+
* ```typescript
|
|
94
|
+
* import { CopilotStudioClient } from '@microsoft/agents-copilotstudio-client';
|
|
95
|
+
* import { CopilotStudioWebChat } from '@microsoft/agents-copilotstudio-client';
|
|
96
|
+
*
|
|
97
|
+
* // Initialize the Copilot Studio client
|
|
98
|
+
* const client = new CopilotStudioClient({
|
|
99
|
+
* botId: 'your-bot-id',
|
|
100
|
+
* tenantId: 'your-tenant-id'
|
|
101
|
+
* });
|
|
45
102
|
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
103
|
+
* // Create a WebChat-compatible connection
|
|
104
|
+
* const directLine = CopilotStudioWebChat.createConnection(client, {
|
|
105
|
+
* showTyping: true
|
|
106
|
+
* });
|
|
107
|
+
*
|
|
108
|
+
* // Integrate with WebChat
|
|
49
109
|
* window.WebChat.renderWebChat({
|
|
50
|
-
* directLine:
|
|
51
|
-
*
|
|
110
|
+
* directLine: directLine,
|
|
111
|
+
* // ... other WebChat options
|
|
112
|
+
* }, document.getElementById('webchat'));
|
|
113
|
+
* ```
|
|
114
|
+
*
|
|
115
|
+
* @example Advanced Usage with Connection Monitoring
|
|
116
|
+
* ```typescript
|
|
117
|
+
* const connection = CopilotStudioWebChat.createConnection(client);
|
|
118
|
+
*
|
|
119
|
+
* // Monitor connection status
|
|
120
|
+
* connection.connectionStatus$.subscribe(status => {
|
|
121
|
+
* switch (status) {
|
|
122
|
+
* case 0: console.log('Disconnected'); break;
|
|
123
|
+
* case 1: console.log('Connecting...'); break;
|
|
124
|
+
* case 2: console.log('Connected and ready'); break;
|
|
125
|
+
* }
|
|
126
|
+
* });
|
|
127
|
+
*
|
|
128
|
+
* // Listen for incoming activities
|
|
129
|
+
* connection.activity$.subscribe(activity => {
|
|
130
|
+
* console.log('Received activity:', activity);
|
|
131
|
+
* });
|
|
52
132
|
* ```
|
|
53
133
|
*/
|
|
54
134
|
export declare class CopilotStudioWebChat {
|
|
55
135
|
/**
|
|
56
|
-
* Creates a
|
|
57
|
-
*
|
|
58
|
-
*
|
|
136
|
+
* Creates a DirectLine-compatible connection for integrating Copilot Studio with WebChat.
|
|
137
|
+
*
|
|
138
|
+
* This method establishes a real-time communication channel between WebChat and the
|
|
139
|
+
* Copilot Studio service. The returned connection object implements the DirectLine
|
|
140
|
+
* protocol, making it fully compatible with Microsoft Bot Framework WebChat components.
|
|
141
|
+
*
|
|
142
|
+
* ## Connection Lifecycle:
|
|
143
|
+
* 1. **Initialization**: Creates observables for connection status and activity streaming
|
|
144
|
+
* 2. **Conversation Start**: Automatically initiates conversation when first activity is posted
|
|
145
|
+
* 3. **Message Flow**: Handles bidirectional message exchange with proper sequencing
|
|
146
|
+
* 4. **Cleanup**: Provides graceful connection termination
|
|
147
|
+
*
|
|
148
|
+
* ## Message Processing:
|
|
149
|
+
* - User messages are validated and sent to Copilot Studio
|
|
150
|
+
* - Agent responses are received and formatted for WebChat
|
|
151
|
+
* - All activities include timestamps and sequence IDs for proper ordering
|
|
152
|
+
* - Optional typing indicators provide visual feedback during processing
|
|
153
|
+
*
|
|
154
|
+
* @param client - A configured CopilotStudioClient instance that handles the underlying
|
|
155
|
+
* communication with the Copilot Studio service. This client should be
|
|
156
|
+
* properly authenticated and configured with the target bot details.
|
|
157
|
+
*
|
|
158
|
+
* @param settings - Optional configuration settings that control the behavior of the
|
|
159
|
+
* WebChat connection. These settings allow customization of features
|
|
160
|
+
* like typing indicators and other user experience enhancements.
|
|
161
|
+
*
|
|
162
|
+
* @returns A new CopilotStudioWebChatConnection instance that can be passed directly
|
|
163
|
+
* to WebChat's renderWebChat function as the directLine parameter. The
|
|
164
|
+
* connection is immediately ready for use and will automatically manage
|
|
165
|
+
* the conversation lifecycle.
|
|
166
|
+
*
|
|
167
|
+
* @throws Error if the provided client is not properly configured or if there are
|
|
168
|
+
* issues establishing the initial connection to the Copilot Studio service.
|
|
169
|
+
*
|
|
170
|
+
* @example
|
|
171
|
+
* ```typescript
|
|
172
|
+
* const connection = CopilotStudioWebChat.createConnection(client, {
|
|
173
|
+
* showTyping: true
|
|
174
|
+
* });
|
|
59
175
|
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
176
|
+
* // Use with WebChat
|
|
177
|
+
* window.WebChat.renderWebChat({
|
|
178
|
+
* directLine: connection
|
|
179
|
+
* }, document.getElementById('webchat'));
|
|
180
|
+
* ```
|
|
63
181
|
*/
|
|
64
182
|
static createConnection(client: CopilotStudioClient, settings?: CopilotStudioWebChatSettings): CopilotStudioWebChatConnection;
|
|
65
183
|
}
|
|
@@ -7,38 +7,128 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
7
7
|
exports.CopilotStudioWebChat = void 0;
|
|
8
8
|
const uuid_1 = require("uuid");
|
|
9
9
|
const rxjs_1 = require("rxjs");
|
|
10
|
+
const logger_1 = require("@microsoft/agents-activity/src/logger");
|
|
11
|
+
const logger = (0, logger_1.debug)('copilot-studio:webchat');
|
|
10
12
|
/**
|
|
11
|
-
*
|
|
13
|
+
* A utility class that provides WebChat integration capabilities for Copilot Studio services.
|
|
14
|
+
* This class acts as a bridge between Microsoft Bot Framework WebChat and Copilot Studio,
|
|
15
|
+
* enabling seamless communication through a DirectLine-compatible interface.
|
|
12
16
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
17
|
+
* ## Key Features:
|
|
18
|
+
* - DirectLine protocol compatibility for easy WebChat integration
|
|
19
|
+
* - Real-time bidirectional messaging with Copilot Studio agents
|
|
20
|
+
* - Automatic conversation management and message sequencing
|
|
21
|
+
* - Optional typing indicators for enhanced user experience
|
|
22
|
+
* - Observable-based architecture for reactive programming patterns
|
|
23
|
+
*
|
|
24
|
+
* ## Usage Scenarios:
|
|
25
|
+
* - Embedding Copilot Studio agents in web applications
|
|
26
|
+
* - Creating custom chat interfaces with WebChat components
|
|
27
|
+
* - Building conversational AI experiences with Microsoft's bot ecosystem
|
|
28
|
+
*
|
|
29
|
+
* @example Basic WebChat Integration
|
|
30
|
+
* ```typescript
|
|
31
|
+
* import { CopilotStudioClient } from '@microsoft/agents-copilotstudio-client';
|
|
32
|
+
* import { CopilotStudioWebChat } from '@microsoft/agents-copilotstudio-client';
|
|
33
|
+
*
|
|
34
|
+
* // Initialize the Copilot Studio client
|
|
35
|
+
* const client = new CopilotStudioClient({
|
|
36
|
+
* botId: 'your-bot-id',
|
|
37
|
+
* tenantId: 'your-tenant-id'
|
|
38
|
+
* });
|
|
39
|
+
*
|
|
40
|
+
* // Create a WebChat-compatible connection
|
|
41
|
+
* const directLine = CopilotStudioWebChat.createConnection(client, {
|
|
42
|
+
* showTyping: true
|
|
43
|
+
* });
|
|
44
|
+
*
|
|
45
|
+
* // Integrate with WebChat
|
|
16
46
|
* window.WebChat.renderWebChat({
|
|
17
|
-
* directLine:
|
|
18
|
-
*
|
|
47
|
+
* directLine: directLine,
|
|
48
|
+
* // ... other WebChat options
|
|
49
|
+
* }, document.getElementById('webchat'));
|
|
50
|
+
* ```
|
|
51
|
+
*
|
|
52
|
+
* @example Advanced Usage with Connection Monitoring
|
|
53
|
+
* ```typescript
|
|
54
|
+
* const connection = CopilotStudioWebChat.createConnection(client);
|
|
55
|
+
*
|
|
56
|
+
* // Monitor connection status
|
|
57
|
+
* connection.connectionStatus$.subscribe(status => {
|
|
58
|
+
* switch (status) {
|
|
59
|
+
* case 0: console.log('Disconnected'); break;
|
|
60
|
+
* case 1: console.log('Connecting...'); break;
|
|
61
|
+
* case 2: console.log('Connected and ready'); break;
|
|
62
|
+
* }
|
|
63
|
+
* });
|
|
64
|
+
*
|
|
65
|
+
* // Listen for incoming activities
|
|
66
|
+
* connection.activity$.subscribe(activity => {
|
|
67
|
+
* console.log('Received activity:', activity);
|
|
68
|
+
* });
|
|
19
69
|
* ```
|
|
20
70
|
*/
|
|
21
71
|
class CopilotStudioWebChat {
|
|
22
72
|
/**
|
|
23
|
-
* Creates a
|
|
24
|
-
*
|
|
25
|
-
*
|
|
73
|
+
* Creates a DirectLine-compatible connection for integrating Copilot Studio with WebChat.
|
|
74
|
+
*
|
|
75
|
+
* This method establishes a real-time communication channel between WebChat and the
|
|
76
|
+
* Copilot Studio service. The returned connection object implements the DirectLine
|
|
77
|
+
* protocol, making it fully compatible with Microsoft Bot Framework WebChat components.
|
|
78
|
+
*
|
|
79
|
+
* ## Connection Lifecycle:
|
|
80
|
+
* 1. **Initialization**: Creates observables for connection status and activity streaming
|
|
81
|
+
* 2. **Conversation Start**: Automatically initiates conversation when first activity is posted
|
|
82
|
+
* 3. **Message Flow**: Handles bidirectional message exchange with proper sequencing
|
|
83
|
+
* 4. **Cleanup**: Provides graceful connection termination
|
|
84
|
+
*
|
|
85
|
+
* ## Message Processing:
|
|
86
|
+
* - User messages are validated and sent to Copilot Studio
|
|
87
|
+
* - Agent responses are received and formatted for WebChat
|
|
88
|
+
* - All activities include timestamps and sequence IDs for proper ordering
|
|
89
|
+
* - Optional typing indicators provide visual feedback during processing
|
|
90
|
+
*
|
|
91
|
+
* @param client - A configured CopilotStudioClient instance that handles the underlying
|
|
92
|
+
* communication with the Copilot Studio service. This client should be
|
|
93
|
+
* properly authenticated and configured with the target bot details.
|
|
26
94
|
*
|
|
27
|
-
* @param
|
|
28
|
-
*
|
|
29
|
-
*
|
|
95
|
+
* @param settings - Optional configuration settings that control the behavior of the
|
|
96
|
+
* WebChat connection. These settings allow customization of features
|
|
97
|
+
* like typing indicators and other user experience enhancements.
|
|
98
|
+
*
|
|
99
|
+
* @returns A new CopilotStudioWebChatConnection instance that can be passed directly
|
|
100
|
+
* to WebChat's renderWebChat function as the directLine parameter. The
|
|
101
|
+
* connection is immediately ready for use and will automatically manage
|
|
102
|
+
* the conversation lifecycle.
|
|
103
|
+
*
|
|
104
|
+
* @throws Error if the provided client is not properly configured or if there are
|
|
105
|
+
* issues establishing the initial connection to the Copilot Studio service.
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* ```typescript
|
|
109
|
+
* const connection = CopilotStudioWebChat.createConnection(client, {
|
|
110
|
+
* showTyping: true
|
|
111
|
+
* });
|
|
112
|
+
*
|
|
113
|
+
* // Use with WebChat
|
|
114
|
+
* window.WebChat.renderWebChat({
|
|
115
|
+
* directLine: connection
|
|
116
|
+
* }, document.getElementById('webchat'));
|
|
117
|
+
* ```
|
|
30
118
|
*/
|
|
31
119
|
static createConnection(client, settings) {
|
|
120
|
+
logger.info('--> Creating connection between Copilot Studio and WebChat ...');
|
|
32
121
|
let sequence = 0;
|
|
33
|
-
let
|
|
122
|
+
let activitySubscriber;
|
|
34
123
|
let conversation;
|
|
35
124
|
const connectionStatus$ = new rxjs_1.BehaviorSubject(0);
|
|
36
|
-
const activity$ =
|
|
37
|
-
|
|
125
|
+
const activity$ = createObservable(async (subscriber) => {
|
|
126
|
+
activitySubscriber = subscriber;
|
|
38
127
|
if (connectionStatus$.value < 2) {
|
|
39
128
|
connectionStatus$.next(2);
|
|
40
129
|
return;
|
|
41
130
|
}
|
|
131
|
+
logger.debug('--> Connection established.');
|
|
42
132
|
notifyTyping();
|
|
43
133
|
const activity = await client.startConversationAsync();
|
|
44
134
|
conversation = activity.conversation;
|
|
@@ -46,14 +136,16 @@ class CopilotStudioWebChat {
|
|
|
46
136
|
notifyActivity(activity);
|
|
47
137
|
});
|
|
48
138
|
const notifyActivity = (activity) => {
|
|
49
|
-
|
|
139
|
+
const newActivity = {
|
|
50
140
|
...activity,
|
|
51
141
|
timestamp: new Date().toISOString(),
|
|
52
142
|
channelData: {
|
|
53
143
|
...activity.channelData,
|
|
54
144
|
'webchat:sequence-id': sequence++,
|
|
55
145
|
},
|
|
56
|
-
}
|
|
146
|
+
};
|
|
147
|
+
logger.debug(`Notify '${newActivity.type}' activity to WebChat:`, newActivity);
|
|
148
|
+
activitySubscriber === null || activitySubscriber === void 0 ? void 0 : activitySubscriber.next(newActivity);
|
|
57
149
|
};
|
|
58
150
|
const notifyTyping = () => {
|
|
59
151
|
if (!(settings === null || settings === void 0 ? void 0 : settings.showTyping)) {
|
|
@@ -69,39 +161,77 @@ class CopilotStudioWebChat {
|
|
|
69
161
|
activity$,
|
|
70
162
|
postActivity(activity) {
|
|
71
163
|
var _a;
|
|
164
|
+
logger.info('--> Preparing to send activity to Copilot Studio ...');
|
|
72
165
|
if (!((_a = activity.text) === null || _a === void 0 ? void 0 : _a.trim())) {
|
|
73
166
|
throw new Error('Activity text cannot be empty.');
|
|
74
167
|
}
|
|
75
|
-
if (!
|
|
76
|
-
throw new Error('Activity
|
|
168
|
+
if (!activitySubscriber) {
|
|
169
|
+
throw new Error('Activity subscriber is not initialized.');
|
|
77
170
|
}
|
|
78
|
-
return
|
|
171
|
+
return createObservable(async (subscriber) => {
|
|
79
172
|
try {
|
|
80
173
|
const id = (0, uuid_1.v4)();
|
|
174
|
+
logger.info('--> Sending activity to Copilot Studio ...');
|
|
81
175
|
notifyActivity({ ...activity, id });
|
|
82
176
|
notifyTyping();
|
|
83
177
|
const activities = await client.askQuestionAsync(activity.text);
|
|
84
178
|
for (const responseActivity of activities) {
|
|
85
179
|
notifyActivity(responseActivity);
|
|
86
180
|
}
|
|
87
|
-
|
|
88
|
-
|
|
181
|
+
subscriber.next(id);
|
|
182
|
+
subscriber.complete();
|
|
183
|
+
logger.info('--> Activity received correctly from Copilot Studio.');
|
|
89
184
|
}
|
|
90
185
|
catch (error) {
|
|
91
|
-
|
|
186
|
+
logger.error('Error sending Activity to Copilot Studio:', error);
|
|
187
|
+
subscriber.error(error);
|
|
92
188
|
}
|
|
93
189
|
});
|
|
94
190
|
},
|
|
95
191
|
end() {
|
|
192
|
+
logger.info('--> Ending connection between Copilot Studio and WebChat ...');
|
|
96
193
|
connectionStatus$.complete();
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
activityObserver = undefined;
|
|
194
|
+
if (activitySubscriber) {
|
|
195
|
+
activitySubscriber.complete();
|
|
196
|
+
activitySubscriber = undefined;
|
|
101
197
|
}
|
|
102
198
|
},
|
|
103
199
|
};
|
|
104
200
|
}
|
|
105
201
|
}
|
|
106
202
|
exports.CopilotStudioWebChat = CopilotStudioWebChat;
|
|
203
|
+
/**
|
|
204
|
+
* Creates an RxJS Observable that wraps an asynchronous function execution.
|
|
205
|
+
*
|
|
206
|
+
* This utility function provides a clean way to convert async/await patterns
|
|
207
|
+
* into Observable streams, enabling integration with reactive programming patterns
|
|
208
|
+
* used throughout the WebChat connection implementation.
|
|
209
|
+
*
|
|
210
|
+
* The created Observable handles promise resolution and rejection automatically,
|
|
211
|
+
* converting them to appropriate next/error signals for subscribers.
|
|
212
|
+
*
|
|
213
|
+
* @template T - The type of value that the observable will emit
|
|
214
|
+
* @param fn - An asynchronous function that receives a Subscriber and performs
|
|
215
|
+
* the desired async operation. The function should call subscriber.next()
|
|
216
|
+
* with results and subscriber.complete() when finished.
|
|
217
|
+
* @returns A new Observable that executes the provided function and emits its results
|
|
218
|
+
*
|
|
219
|
+
* @example
|
|
220
|
+
* ```typescript
|
|
221
|
+
* const dataObservable = createObservable<string>(async (subscriber) => {
|
|
222
|
+
* try {
|
|
223
|
+
* const result = await fetchData();
|
|
224
|
+
* subscriber.next(result);
|
|
225
|
+
* subscriber.complete();
|
|
226
|
+
* } catch (error) {
|
|
227
|
+
* subscriber.error(error);
|
|
228
|
+
* }
|
|
229
|
+
* });
|
|
230
|
+
* ```
|
|
231
|
+
*/
|
|
232
|
+
function createObservable(fn) {
|
|
233
|
+
return new rxjs_1.Observable((subscriber) => {
|
|
234
|
+
Promise.resolve(fn(subscriber)).catch((error) => subscriber.error(error));
|
|
235
|
+
});
|
|
236
|
+
}
|
|
107
237
|
//# sourceMappingURL=copilotStudioWebChat.js.map
|