@minded-ai/mindedjs 1.0.117 → 1.0.118-beta-2
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/agent.js +17 -7
- package/dist/agent.js.map +1 -1
- package/dist/browserTask/README.md +419 -0
- package/dist/browserTask/browserAgent.py +632 -0
- package/dist/browserTask/captcha_isolated.png +0 -0
- package/dist/browserTask/executeBrowserTask.d.ts +5 -0
- package/dist/browserTask/executeBrowserTask.d.ts.map +1 -1
- package/dist/browserTask/executeBrowserTask.js +64 -1
- package/dist/browserTask/executeBrowserTask.js.map +1 -1
- package/dist/browserTask/executeBrowserTask.ts +79 -0
- package/dist/browserTask/requirements.txt +8 -0
- package/dist/browserTask/setup.sh +144 -0
- package/dist/checkpointer/checkpointSaverFactory.js +17 -7
- package/dist/checkpointer/checkpointSaverFactory.js.map +1 -1
- package/dist/cli/index.js +17 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/lambdaHandlerTemplate.d.ts.map +1 -1
- package/dist/edges/createDirectEdge.d.ts.map +1 -1
- package/dist/edges/createLogicalRouter.d.ts.map +1 -1
- package/dist/edges/createLogicalRouter.js +17 -7
- package/dist/edges/createLogicalRouter.js.map +1 -1
- package/dist/edges/createPromptRouter.d.ts.map +1 -1
- package/dist/edges/edgeFactory.d.ts.map +1 -1
- package/dist/index.js +17 -7
- package/dist/index.js.map +1 -1
- package/dist/interfaces/zendesk.js +17 -7
- package/dist/interfaces/zendesk.js.map +1 -1
- package/dist/internalTools/appActionRunnerTool.d.ts.map +1 -1
- package/dist/internalTools/appActionRunnerTool.js +17 -7
- package/dist/internalTools/appActionRunnerTool.js.map +1 -1
- package/dist/internalTools/documentExtraction/documentExtraction.js +17 -7
- package/dist/internalTools/documentExtraction/documentExtraction.js.map +1 -1
- package/dist/internalTools/libraryActionRunnerTool.d.ts.map +1 -1
- package/dist/internalTools/retell.js +17 -7
- package/dist/internalTools/retell.js.map +1 -1
- package/dist/internalTools/sendPlaceholderMessage.js +17 -7
- package/dist/internalTools/sendPlaceholderMessage.js.map +1 -1
- package/dist/internalTools/timer.js +17 -7
- package/dist/internalTools/timer.js.map +1 -1
- package/dist/llm/createLlmInstance.d.ts.map +1 -1
- package/dist/nodes/addAppToolNode.d.ts.map +1 -1
- package/dist/nodes/addBrowserTaskNode.d.ts.map +1 -1
- package/dist/nodes/addBrowserTaskNode.js +39 -18
- package/dist/nodes/addBrowserTaskNode.js.map +1 -1
- package/dist/nodes/addBrowserTaskRunNode.d.ts.map +1 -1
- package/dist/nodes/addBrowserTaskRunNode.js +27 -16
- package/dist/nodes/addBrowserTaskRunNode.js.map +1 -1
- package/dist/nodes/addHumanInTheLoopNode.d.ts.map +1 -1
- package/dist/nodes/addJumpToNode.d.ts.map +1 -1
- package/dist/nodes/addJunctionNode.d.ts.map +1 -1
- package/dist/nodes/addPromptNode.d.ts.map +1 -1
- package/dist/nodes/addToolNode.d.ts.map +1 -1
- package/dist/nodes/addToolRunNode.d.ts.map +1 -1
- package/dist/nodes/addTriggerNode.d.ts.map +1 -1
- package/dist/nodes/nodeFactory.d.ts.map +1 -1
- package/dist/platform/mindedCheckpointSaver.js +17 -7
- package/dist/platform/mindedCheckpointSaver.js.map +1 -1
- package/dist/platform/mindedConnection.d.ts.map +1 -1
- package/dist/platform/mindedConnection.js +17 -7
- package/dist/platform/mindedConnection.js.map +1 -1
- package/dist/platform/mindedConnectionTypes.d.ts +29 -1
- package/dist/platform/mindedConnectionTypes.d.ts.map +1 -1
- package/dist/platform/mindedConnectionTypes.js +2 -0
- package/dist/platform/mindedConnectionTypes.js.map +1 -1
- package/dist/platform/piiGateway/gateway.js +17 -7
- package/dist/platform/piiGateway/gateway.js.map +1 -1
- package/dist/platform/utils/parseAttachments.d.ts.map +1 -1
- package/dist/playbooks/playbooks.js +17 -7
- package/dist/playbooks/playbooks.js.map +1 -1
- package/dist/toolsLibrary/classifier.d.ts.map +1 -1
- package/dist/toolsLibrary/index.js +17 -7
- package/dist/toolsLibrary/index.js.map +1 -1
- package/dist/toolsLibrary/parseDocument.d.ts +3 -3
- package/dist/types/Flows.types.d.ts +4 -0
- package/dist/types/Flows.types.d.ts.map +1 -1
- package/dist/types/Flows.types.js.map +1 -1
- package/dist/types/LangGraph.types.d.ts.map +1 -1
- package/dist/utils/extractStateMemoryResponse.d.ts.map +1 -1
- package/dist/utils/history.d.ts.map +1 -1
- package/dist/utils/wait.d.ts.map +1 -1
- package/dist/voice/voiceSession.js +17 -7
- package/dist/voice/voiceSession.js.map +1 -1
- package/package.json +1 -1
- package/src/browserTask/executeBrowserTask.ts +87 -0
- package/src/nodes/addBrowserTaskNode.ts +25 -12
- package/src/nodes/addBrowserTaskRunNode.ts +26 -14
- package/src/platform/mindedConnectionTypes.ts +32 -1
- package/src/types/Flows.types.ts +2 -0
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
import { logger } from '../utils/logger';
|
|
2
|
+
import { mindedConnection } from '../platform/mindedConnection';
|
|
3
|
+
import {
|
|
4
|
+
mindedConnectionSocketMessageType,
|
|
5
|
+
CreateBrowserSessionResponse,
|
|
6
|
+
InvokeBrowserTaskResponse,
|
|
7
|
+
CreateBrowserSessionRequest,
|
|
8
|
+
} from '../platform/mindedConnectionTypes';
|
|
2
9
|
|
|
3
10
|
// Browser Use Cloud API configuration
|
|
4
11
|
const BROWSER_USE_API_BASE_URL = 'https://api.browser-use.com/api/v1';
|
|
@@ -211,3 +218,83 @@ export const waitForCompletion = async (taskId: string, maxWaitTime: number = 30
|
|
|
211
218
|
});
|
|
212
219
|
throw new Error('Timeout waiting for task completion');
|
|
213
220
|
};
|
|
221
|
+
|
|
222
|
+
// Socket-based browser task functions
|
|
223
|
+
export const createBrowserSession = async (proxy?: string): Promise<CreateBrowserSessionResponse> => {
|
|
224
|
+
logger.debug({ msg: 'Creating browser session via socket', proxy });
|
|
225
|
+
|
|
226
|
+
try {
|
|
227
|
+
const response = await mindedConnection.awaitEmit<CreateBrowserSessionRequest, CreateBrowserSessionResponse>(
|
|
228
|
+
mindedConnectionSocketMessageType.CREATE_BROWSER_SESSION,
|
|
229
|
+
{
|
|
230
|
+
type: mindedConnectionSocketMessageType.CREATE_BROWSER_SESSION,
|
|
231
|
+
proxy,
|
|
232
|
+
},
|
|
233
|
+
30000, // 30 seconds timeout
|
|
234
|
+
);
|
|
235
|
+
|
|
236
|
+
if (response.error) {
|
|
237
|
+
logger.error({ msg: 'Failed to create browser session', error: response.error });
|
|
238
|
+
throw new Error(response.error);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
logger.debug({
|
|
242
|
+
msg: 'Browser session created successfully',
|
|
243
|
+
sessionId: response.sessionId,
|
|
244
|
+
hasLiveUrl: !!response.liveViewUrl,
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
return response;
|
|
248
|
+
} catch (error) {
|
|
249
|
+
logger.error({ msg: 'Error creating browser session', error });
|
|
250
|
+
throw error;
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
export const invokeBrowserTask = async (
|
|
255
|
+
sessionId: string,
|
|
256
|
+
cdpUrl: string,
|
|
257
|
+
task: string,
|
|
258
|
+
keepAlive?: boolean,
|
|
259
|
+
hooks?: { name: string }[],
|
|
260
|
+
): Promise<InvokeBrowserTaskResponse> => {
|
|
261
|
+
logger.debug({
|
|
262
|
+
msg: 'Invoking browser task via socket',
|
|
263
|
+
sessionId,
|
|
264
|
+
taskLength: task.length,
|
|
265
|
+
keepAlive,
|
|
266
|
+
hooksCount: hooks?.length || 0,
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
try {
|
|
270
|
+
const response = await mindedConnection.awaitEmit<any, InvokeBrowserTaskResponse>(
|
|
271
|
+
mindedConnectionSocketMessageType.INVOKE_BROWSER_TASK,
|
|
272
|
+
{
|
|
273
|
+
sessionId,
|
|
274
|
+
cdpUrl,
|
|
275
|
+
task,
|
|
276
|
+
keepAlive,
|
|
277
|
+
hooks,
|
|
278
|
+
},
|
|
279
|
+
120000, // 2 minutes timeout
|
|
280
|
+
);
|
|
281
|
+
|
|
282
|
+
if (response.error) {
|
|
283
|
+
logger.error({ msg: 'Failed to invoke browser task', error: response.error });
|
|
284
|
+
throw new Error(response.error);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
logger.debug({
|
|
288
|
+
msg: 'Browser task completed successfully',
|
|
289
|
+
sessionId,
|
|
290
|
+
hasResult: !!response.result,
|
|
291
|
+
stepCount: response.steps?.length || 0,
|
|
292
|
+
recordingCount: response.recordings?.length || 0,
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
return response;
|
|
296
|
+
} catch (error) {
|
|
297
|
+
logger.error({ msg: 'Error invoking browser task', error });
|
|
298
|
+
throw error;
|
|
299
|
+
}
|
|
300
|
+
};
|
|
@@ -7,7 +7,7 @@ import { createHistoryStep } from '../utils/history';
|
|
|
7
7
|
import { AIMessage, SystemMessage } from '@langchain/core/messages';
|
|
8
8
|
import { v4 as uuidv4 } from 'uuid';
|
|
9
9
|
import { Agent } from '../agent';
|
|
10
|
-
import {
|
|
10
|
+
import { createBrowserSession } from '../browserTask/executeBrowserTask';
|
|
11
11
|
import { tool as langchainTool } from '@langchain/core/tools';
|
|
12
12
|
import { z } from 'zod';
|
|
13
13
|
import { LLMProviders } from '../types/LLM.types';
|
|
@@ -146,20 +146,29 @@ ${Object.keys(inputParams).length > 0 ? `# Input parameters:\n${JSON.stringify(i
|
|
|
146
146
|
${state.memory ? `# Task context:\n${JSON.stringify(state.memory)}\n\n` : ''}
|
|
147
147
|
`;
|
|
148
148
|
|
|
149
|
-
// Create
|
|
150
|
-
const
|
|
151
|
-
logger.debug({ msg: 'Browser task created', taskId });
|
|
149
|
+
// Create browser session using socket
|
|
150
|
+
const session = await createBrowserSession(node.proxy);
|
|
152
151
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
152
|
+
if (!session.sessionId || !session.cdpUrl) {
|
|
153
|
+
throw new Error('Failed to create browser session: missing session details');
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Determine keepAlive based on NODE_ENV
|
|
157
|
+
const keepAlive = process.env.NODE_ENV !== 'production';
|
|
158
|
+
|
|
159
|
+
logger.debug({
|
|
160
|
+
msg: 'Browser session created',
|
|
161
|
+
sessionId: session.sessionId,
|
|
162
|
+
hasLiveUrl: !!session.liveViewUrl,
|
|
163
|
+
keepAlive,
|
|
164
|
+
nodeEnv: process.env.NODE_ENV,
|
|
165
|
+
});
|
|
156
166
|
|
|
157
|
-
// Update the tool call with
|
|
167
|
+
// Update the tool call with session info and prompt
|
|
158
168
|
const updatedToolCall = {
|
|
159
169
|
...toolCall,
|
|
160
170
|
args: {
|
|
161
171
|
...inputParams,
|
|
162
|
-
taskId,
|
|
163
172
|
prompt: fullPrompt,
|
|
164
173
|
},
|
|
165
174
|
};
|
|
@@ -172,8 +181,11 @@ ${state.memory ? `# Task context:\n${JSON.stringify(state.memory)}\n\n` : ''}
|
|
|
172
181
|
mindedMetadata: {
|
|
173
182
|
nodeType: NodeType.BROWSER_TASK,
|
|
174
183
|
nodeDisplayName: node.displayName,
|
|
175
|
-
|
|
176
|
-
|
|
184
|
+
sessionId: session.sessionId,
|
|
185
|
+
cdpUrl: session.cdpUrl,
|
|
186
|
+
liveUrl: session.liveViewUrl,
|
|
187
|
+
keepAlive,
|
|
188
|
+
hooks: node.hooks || [],
|
|
177
189
|
},
|
|
178
190
|
},
|
|
179
191
|
});
|
|
@@ -183,7 +195,7 @@ ${state.memory ? `# Task context:\n${JSON.stringify(state.memory)}\n\n` : ''}
|
|
|
183
195
|
type: NodeType.BROWSER_TASK,
|
|
184
196
|
nodeId: node.name,
|
|
185
197
|
nodeDisplayName: node.displayName,
|
|
186
|
-
raw: { taskId, liveUrl:
|
|
198
|
+
raw: { taskId: session.sessionId, liveUrl: session.liveViewUrl, inputParams },
|
|
187
199
|
messageIds: [toolCallingMessage.id!],
|
|
188
200
|
}),
|
|
189
201
|
messages: [toolCallingMessage],
|
|
@@ -211,6 +223,7 @@ ${state.memory ? `# Task context:\n${JSON.stringify(state.memory)}\n\n` : ''}
|
|
|
211
223
|
nodeType: NodeType.BROWSER_TASK,
|
|
212
224
|
nodeDisplayName: node.displayName,
|
|
213
225
|
error: error.message,
|
|
226
|
+
hooks: node.hooks || [],
|
|
214
227
|
},
|
|
215
228
|
},
|
|
216
229
|
});
|
|
@@ -7,7 +7,7 @@ import { logger } from '../utils/logger';
|
|
|
7
7
|
import { createHistoryStep } from '../utils/history';
|
|
8
8
|
import { HistoryStep } from '../types/Agent.types';
|
|
9
9
|
import { v4 as uuidv4 } from 'uuid';
|
|
10
|
-
import {
|
|
10
|
+
import { invokeBrowserTask } from '../browserTask/executeBrowserTask';
|
|
11
11
|
|
|
12
12
|
type AddBrowserTaskRunNodeParams = {
|
|
13
13
|
graph: PreCompiledGraph;
|
|
@@ -26,23 +26,33 @@ export const addBrowserTaskRunNode = async ({ graph, browserTaskNode, attachedTo
|
|
|
26
26
|
if (!toolCallObj.tool_calls) {
|
|
27
27
|
throw new Error('Tool call not found');
|
|
28
28
|
}
|
|
29
|
+
const toolCallMindedMetadata = toolCallObj.additional_kwargs?.mindedMetadata;
|
|
29
30
|
const toolCall = toolCallObj.tool_calls[0];
|
|
30
|
-
const {
|
|
31
|
+
const { prompt, ...inputParams } = toolCall.args;
|
|
32
|
+
const { sessionId, cdpUrl, keepAlive, hooks } = toolCallMindedMetadata;
|
|
31
33
|
try {
|
|
32
|
-
if (!
|
|
33
|
-
throw new Error('
|
|
34
|
+
if (!sessionId || !cdpUrl || !prompt) {
|
|
35
|
+
throw new Error('Missing required parameters: sessionId, cdpUrl, or prompt');
|
|
34
36
|
}
|
|
35
37
|
|
|
36
|
-
//
|
|
37
|
-
const
|
|
38
|
-
|
|
38
|
+
// Invoke browser task via socket
|
|
39
|
+
const result = await invokeBrowserTask(sessionId, cdpUrl, prompt, keepAlive, hooks);
|
|
40
|
+
|
|
41
|
+
logger.debug({
|
|
42
|
+
msg: 'Browser task completed',
|
|
43
|
+
sessionId,
|
|
44
|
+
hasResult: !!result.result,
|
|
45
|
+
stepCount: result.steps?.length || 0,
|
|
46
|
+
recordingCount: result.recordings?.length || 0,
|
|
47
|
+
});
|
|
39
48
|
|
|
40
49
|
// Create tool message with the result
|
|
41
50
|
const toolMessage = new ToolMessage({
|
|
42
51
|
id: uuidv4(),
|
|
43
52
|
content: JSON.stringify({
|
|
44
|
-
result:
|
|
45
|
-
steps:
|
|
53
|
+
result: result.result || 'Task completed successfully',
|
|
54
|
+
steps: result.steps || [],
|
|
55
|
+
recordings: result.recordings || [],
|
|
46
56
|
inputParams: inputParams,
|
|
47
57
|
}),
|
|
48
58
|
name: 'browser-task',
|
|
@@ -52,8 +62,9 @@ export const addBrowserTaskRunNode = async ({ graph, browserTaskNode, attachedTo
|
|
|
52
62
|
mindedMetadata: {
|
|
53
63
|
nodeType: NodeType.BROWSER_TASK,
|
|
54
64
|
nodeDisplayName: browserTaskNode.displayName,
|
|
55
|
-
|
|
56
|
-
steps:
|
|
65
|
+
sessionId,
|
|
66
|
+
steps: result.steps,
|
|
67
|
+
recordings: result.recordings,
|
|
57
68
|
inputParams: inputParams,
|
|
58
69
|
},
|
|
59
70
|
},
|
|
@@ -69,7 +80,8 @@ export const addBrowserTaskRunNode = async ({ graph, browserTaskNode, attachedTo
|
|
|
69
80
|
mindedMetadata: {
|
|
70
81
|
...toolCallObj.additional_kwargs?.mindedMetadata,
|
|
71
82
|
nodeDisplayName: browserTaskNode.displayName,
|
|
72
|
-
steps:
|
|
83
|
+
steps: result.steps,
|
|
84
|
+
recordings: result.recordings,
|
|
73
85
|
status: 'completed',
|
|
74
86
|
},
|
|
75
87
|
update: true, // This triggers the message reducer to update the existing message
|
|
@@ -82,7 +94,7 @@ export const addBrowserTaskRunNode = async ({ graph, browserTaskNode, attachedTo
|
|
|
82
94
|
type: NodeType.BROWSER_TASK,
|
|
83
95
|
nodeId: browserTaskNode.name,
|
|
84
96
|
nodeDisplayName: browserTaskNode.displayName,
|
|
85
|
-
raw:
|
|
97
|
+
raw: result,
|
|
86
98
|
messageIds: [],
|
|
87
99
|
}),
|
|
88
100
|
};
|
|
@@ -102,7 +114,7 @@ export const addBrowserTaskRunNode = async ({ graph, browserTaskNode, attachedTo
|
|
|
102
114
|
mindedMetadata: {
|
|
103
115
|
nodeType: NodeType.BROWSER_TASK,
|
|
104
116
|
nodeDisplayName: browserTaskNode.displayName,
|
|
105
|
-
|
|
117
|
+
sessionId,
|
|
106
118
|
error: error.message,
|
|
107
119
|
inputParams: inputParams,
|
|
108
120
|
},
|
|
@@ -39,7 +39,9 @@ export enum mindedConnectionSocketMessageType {
|
|
|
39
39
|
TIMER_TRIGGER = 'timer-trigger',
|
|
40
40
|
RETELL_CALL = 'retell-call',
|
|
41
41
|
RETELL_GET_CALL = 'retell-get-call',
|
|
42
|
-
SDK_VERSION_MISMATCH = 'sdk-version-mismatch',
|
|
42
|
+
SDK_VERSION_MISMATCH = 'sdk-version-mismatch', // Browser Task
|
|
43
|
+
CREATE_BROWSER_SESSION = 'create-browser-session',
|
|
44
|
+
INVOKE_BROWSER_TASK = 'invoke-browser-task',
|
|
43
45
|
}
|
|
44
46
|
|
|
45
47
|
export type mindedConnectionSocketMessageTypeMap = {
|
|
@@ -69,6 +71,8 @@ export type mindedConnectionSocketMessageTypeMap = {
|
|
|
69
71
|
[mindedConnectionSocketMessageType.RETELL_GET_CALL]: RetellGetCall;
|
|
70
72
|
[mindedConnectionSocketMessageType.SDK_VERSION_MISMATCH]: SdkVersionMismatchMessage;
|
|
71
73
|
[mindedConnectionSocketMessageType.UPDATE_STATE]: UpdateStateRequest;
|
|
74
|
+
[mindedConnectionSocketMessageType.CREATE_BROWSER_SESSION]: CreateBrowserSessionRequest;
|
|
75
|
+
[mindedConnectionSocketMessageType.INVOKE_BROWSER_TASK]: InvokeBrowserTaskRequest;
|
|
72
76
|
};
|
|
73
77
|
|
|
74
78
|
export interface BasemindedConnectionSocketMessage {
|
|
@@ -244,3 +248,30 @@ export interface UpdateStateRequest extends BasemindedConnectionSocketMessage {
|
|
|
244
248
|
sessionId: string;
|
|
245
249
|
state: Partial<typeof stateAnnotation.State>;
|
|
246
250
|
}
|
|
251
|
+
|
|
252
|
+
// Browser Task Messages
|
|
253
|
+
export interface CreateBrowserSessionRequest extends BasemindedConnectionSocketMessage {
|
|
254
|
+
type: mindedConnectionSocketMessageType.CREATE_BROWSER_SESSION;
|
|
255
|
+
proxy?: string; // 2-digit country code like 'IL'
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
export interface CreateBrowserSessionResponse extends BaseSdkConnectionSocketMessageResponseCallbackAck {
|
|
259
|
+
sessionId?: string;
|
|
260
|
+
cdpUrl?: string;
|
|
261
|
+
liveViewUrl?: string;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
export interface InvokeBrowserTaskRequest extends BasemindedConnectionSocketMessage {
|
|
265
|
+
type: mindedConnectionSocketMessageType.INVOKE_BROWSER_TASK;
|
|
266
|
+
cdpUrl: string;
|
|
267
|
+
task: string;
|
|
268
|
+
sessionId: string;
|
|
269
|
+
keepAlive?: boolean;
|
|
270
|
+
hooks?: { name: string }[]; // Array of hooks to be passed to the browser-use lambda
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
export interface InvokeBrowserTaskResponse extends BaseSdkConnectionSocketMessageResponseCallbackAck {
|
|
274
|
+
result?: any;
|
|
275
|
+
steps?: any[];
|
|
276
|
+
recordings?: any[];
|
|
277
|
+
}
|
package/src/types/Flows.types.ts
CHANGED
|
@@ -112,6 +112,8 @@ export interface BrowserTaskNode extends BaseNode {
|
|
|
112
112
|
}[];
|
|
113
113
|
autoTrigger?: boolean;
|
|
114
114
|
defaultPayload?: string;
|
|
115
|
+
proxy?: string; // 2-digit country code like 'IL'
|
|
116
|
+
hooks?: { name: string }[]; // Array of hooks to be passed to the browser-use lambda
|
|
115
117
|
}
|
|
116
118
|
|
|
117
119
|
export type TriggerNode = AppTriggerNode | WebhookTriggerNode | ManualTriggerNode | VoiceTriggerNode | InterfaceTriggerNode;
|