@prompteryx/mcp-server 1.0.1
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 +271 -0
- package/dist/auth/api-key-auth.d.ts +51 -0
- package/dist/auth/api-key-auth.d.ts.map +1 -0
- package/dist/auth/api-key-auth.js +50 -0
- package/dist/auth/api-key-auth.js.map +1 -0
- package/dist/auth/usage-enforcer.d.ts +40 -0
- package/dist/auth/usage-enforcer.d.ts.map +1 -0
- package/dist/auth/usage-enforcer.js +134 -0
- package/dist/auth/usage-enforcer.js.map +1 -0
- package/dist/execution/cloud-executor.d.ts +16 -0
- package/dist/execution/cloud-executor.d.ts.map +1 -0
- package/dist/execution/cloud-executor.js +225 -0
- package/dist/execution/cloud-executor.js.map +1 -0
- package/dist/execution/integration-executor.d.ts +18 -0
- package/dist/execution/integration-executor.d.ts.map +1 -0
- package/dist/execution/integration-executor.js +101 -0
- package/dist/execution/integration-executor.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/workflow-resources.d.ts +16 -0
- package/dist/resources/workflow-resources.d.ts.map +1 -0
- package/dist/resources/workflow-resources.js +79 -0
- package/dist/resources/workflow-resources.js.map +1 -0
- package/dist/server.d.ts +28 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +104 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/ai-browser-tools.d.ts +21 -0
- package/dist/tools/ai-browser-tools.d.ts.map +1 -0
- package/dist/tools/ai-browser-tools.js +88 -0
- package/dist/tools/ai-browser-tools.js.map +1 -0
- package/dist/tools/browser-session-manager.d.ts +75 -0
- package/dist/tools/browser-session-manager.d.ts.map +1 -0
- package/dist/tools/browser-session-manager.js +206 -0
- package/dist/tools/browser-session-manager.js.map +1 -0
- package/dist/tools/browser-tools.d.ts +20 -0
- package/dist/tools/browser-tools.d.ts.map +1 -0
- package/dist/tools/browser-tools.js +270 -0
- package/dist/tools/browser-tools.js.map +1 -0
- package/dist/tools/data-tools.d.ts +9 -0
- package/dist/tools/data-tools.d.ts.map +1 -0
- package/dist/tools/data-tools.js +110 -0
- package/dist/tools/data-tools.js.map +1 -0
- package/dist/tools/integration-tools.d.ts +29 -0
- package/dist/tools/integration-tools.d.ts.map +1 -0
- package/dist/tools/integration-tools.js +214 -0
- package/dist/tools/integration-tools.js.map +1 -0
- package/dist/tools/workflow-builder-tools.d.ts +20 -0
- package/dist/tools/workflow-builder-tools.d.ts.map +1 -0
- package/dist/tools/workflow-builder-tools.js +95 -0
- package/dist/tools/workflow-builder-tools.js.map +1 -0
- package/dist/tools/workflow-tools.d.ts +16 -0
- package/dist/tools/workflow-tools.d.ts.map +1 -0
- package/dist/tools/workflow-tools.js +128 -0
- package/dist/tools/workflow-tools.js.map +1 -0
- package/dist/utils/node-config-loader.d.ts +54 -0
- package/dist/utils/node-config-loader.d.ts.map +1 -0
- package/dist/utils/node-config-loader.js +105 -0
- package/dist/utils/node-config-loader.js.map +1 -0
- package/dist/utils/output-formatter.d.ts +37 -0
- package/dist/utils/output-formatter.d.ts.map +1 -0
- package/dist/utils/output-formatter.js +62 -0
- package/dist/utils/output-formatter.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser Automation Tools
|
|
3
|
+
*
|
|
4
|
+
* 20+ MCP tools that wrap Playwright browser actions.
|
|
5
|
+
* Each tool maps to node types in lib/node-executor.ts.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { enforceUsageLimits, recordUsage, formatUsageRemaining } from '../auth/usage-enforcer.js';
|
|
9
|
+
import { executeBrowserAction } from '../execution/cloud-executor.js';
|
|
10
|
+
import { formatError } from '../utils/output-formatter.js';
|
|
11
|
+
function withUsageCheck(ctx, category, fn) {
|
|
12
|
+
return async () => {
|
|
13
|
+
const check = enforceUsageLimits(ctx.getAuth(), category, ctx.executionMode);
|
|
14
|
+
if (!check.allowed) {
|
|
15
|
+
return formatError(check.reason, undefined, { usageRemaining: formatUsageRemaining(ctx.getAuth()) });
|
|
16
|
+
}
|
|
17
|
+
return fn();
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
async function ensurePage(ctx) {
|
|
21
|
+
if (ctx.executionMode === 'cloud') {
|
|
22
|
+
const session = await ctx.sessionManager.getOrCreateCloudPage(ctx.cloudConfig());
|
|
23
|
+
return session.page;
|
|
24
|
+
}
|
|
25
|
+
const session = await ctx.sessionManager.getOrCreateLocalPage({
|
|
26
|
+
electronUrl: 'http://localhost:61337',
|
|
27
|
+
chromeProfile: process.env.PROMPTERYX_CHROME_PROFILE,
|
|
28
|
+
});
|
|
29
|
+
return session.page;
|
|
30
|
+
}
|
|
31
|
+
export function registerBrowserTools(server, ctx) {
|
|
32
|
+
// browser_navigate
|
|
33
|
+
server.tool('browser_navigate', 'Navigate to a URL. Returns page title and final URL after any redirects.', { url: z.string().describe('The URL to navigate to'), waitUntil: z.enum(['load', 'domcontentloaded', 'networkidle']).optional().describe('When to consider navigation complete') }, async (params) => {
|
|
34
|
+
const check = enforceUsageLimits(ctx.getAuth(), 'browser', ctx.executionMode);
|
|
35
|
+
if (!check.allowed)
|
|
36
|
+
return formatError(check.reason);
|
|
37
|
+
const page = await ensurePage(ctx);
|
|
38
|
+
const result = await executeBrowserAction(page, 'navigate', params);
|
|
39
|
+
// Include debug URL on first navigation
|
|
40
|
+
if (ctx.sessionManager.activeSession?.debugUrl) {
|
|
41
|
+
const debugUrl = ctx.sessionManager.activeSession.debugUrl;
|
|
42
|
+
if (result.content[0]?.type === 'text' && result.content[0].text) {
|
|
43
|
+
const data = JSON.parse(result.content[0].text);
|
|
44
|
+
data.debugUrl = debugUrl;
|
|
45
|
+
result.content[0].text = JSON.stringify(data, null, 2);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return result;
|
|
49
|
+
});
|
|
50
|
+
// browser_click
|
|
51
|
+
server.tool('browser_click', 'Click an element on the page using a CSS selector.', {
|
|
52
|
+
selector: z.string().describe('CSS selector of the element to click'),
|
|
53
|
+
button: z.enum(['left', 'right', 'middle']).optional().describe('Mouse button'),
|
|
54
|
+
clickCount: z.number().optional().describe('Number of clicks (2 for double-click)'),
|
|
55
|
+
}, async (params) => {
|
|
56
|
+
const check = enforceUsageLimits(ctx.getAuth(), 'browser', ctx.executionMode);
|
|
57
|
+
if (!check.allowed)
|
|
58
|
+
return formatError(check.reason);
|
|
59
|
+
const page = await ensurePage(ctx);
|
|
60
|
+
return executeBrowserAction(page, 'click', params);
|
|
61
|
+
});
|
|
62
|
+
// browser_fill
|
|
63
|
+
server.tool('browser_fill', 'Clear and fill an input field with text. Clears existing content first.', {
|
|
64
|
+
selector: z.string().describe('CSS selector of the input field'),
|
|
65
|
+
value: z.string().describe('Text to fill into the field'),
|
|
66
|
+
}, async (params) => {
|
|
67
|
+
const check = enforceUsageLimits(ctx.getAuth(), 'browser', ctx.executionMode);
|
|
68
|
+
if (!check.allowed)
|
|
69
|
+
return formatError(check.reason);
|
|
70
|
+
const page = await ensurePage(ctx);
|
|
71
|
+
return executeBrowserAction(page, 'fill', params);
|
|
72
|
+
});
|
|
73
|
+
// browser_type
|
|
74
|
+
server.tool('browser_type', 'Type text character by character (simulates real typing). Unlike fill, does not clear existing content.', {
|
|
75
|
+
selector: z.string().describe('CSS selector of the element'),
|
|
76
|
+
text: z.string().describe('Text to type'),
|
|
77
|
+
delay: z.number().optional().describe('Delay between keystrokes in ms (default: 50)'),
|
|
78
|
+
}, async (params) => {
|
|
79
|
+
const check = enforceUsageLimits(ctx.getAuth(), 'browser', ctx.executionMode);
|
|
80
|
+
if (!check.allowed)
|
|
81
|
+
return formatError(check.reason);
|
|
82
|
+
const page = await ensurePage(ctx);
|
|
83
|
+
return executeBrowserAction(page, 'type', params);
|
|
84
|
+
});
|
|
85
|
+
// browser_press_key
|
|
86
|
+
server.tool('browser_press_key', 'Press a keyboard key (Enter, Tab, Escape, ArrowDown, etc.).', {
|
|
87
|
+
key: z.string().describe('Key to press (e.g. "Enter", "Tab", "Escape", "ArrowDown", "Control+a")'),
|
|
88
|
+
selector: z.string().optional().describe('Optional: focus this element first'),
|
|
89
|
+
}, async (params) => {
|
|
90
|
+
const check = enforceUsageLimits(ctx.getAuth(), 'browser', ctx.executionMode);
|
|
91
|
+
if (!check.allowed)
|
|
92
|
+
return formatError(check.reason);
|
|
93
|
+
const page = await ensurePage(ctx);
|
|
94
|
+
return executeBrowserAction(page, 'press_key', params);
|
|
95
|
+
});
|
|
96
|
+
// browser_select
|
|
97
|
+
server.tool('browser_select', 'Select an option from a dropdown/select element.', {
|
|
98
|
+
selector: z.string().describe('CSS selector of the select element'),
|
|
99
|
+
value: z.union([z.string(), z.array(z.string())]).describe('Value(s) to select'),
|
|
100
|
+
}, async (params) => {
|
|
101
|
+
const check = enforceUsageLimits(ctx.getAuth(), 'browser', ctx.executionMode);
|
|
102
|
+
if (!check.allowed)
|
|
103
|
+
return formatError(check.reason);
|
|
104
|
+
const page = await ensurePage(ctx);
|
|
105
|
+
return executeBrowserAction(page, 'select', params);
|
|
106
|
+
});
|
|
107
|
+
// browser_check
|
|
108
|
+
server.tool('browser_check', 'Check or uncheck a checkbox.', {
|
|
109
|
+
selector: z.string().describe('CSS selector of the checkbox'),
|
|
110
|
+
uncheck: z.boolean().optional().describe('Set to true to uncheck instead of check'),
|
|
111
|
+
}, async (params) => {
|
|
112
|
+
const check = enforceUsageLimits(ctx.getAuth(), 'browser', ctx.executionMode);
|
|
113
|
+
if (!check.allowed)
|
|
114
|
+
return formatError(check.reason);
|
|
115
|
+
const page = await ensurePage(ctx);
|
|
116
|
+
return executeBrowserAction(page, 'check', params);
|
|
117
|
+
});
|
|
118
|
+
// browser_hover
|
|
119
|
+
server.tool('browser_hover', 'Hover over an element to reveal tooltips, menus, or other hover effects.', { selector: z.string().describe('CSS selector of the element to hover over') }, async (params) => {
|
|
120
|
+
const check = enforceUsageLimits(ctx.getAuth(), 'browser', ctx.executionMode);
|
|
121
|
+
if (!check.allowed)
|
|
122
|
+
return formatError(check.reason);
|
|
123
|
+
const page = await ensurePage(ctx);
|
|
124
|
+
return executeBrowserAction(page, 'hover', params);
|
|
125
|
+
});
|
|
126
|
+
// browser_scroll
|
|
127
|
+
server.tool('browser_scroll', 'Scroll the page or scroll to a specific element.', {
|
|
128
|
+
selector: z.string().optional().describe('CSS selector to scroll into view'),
|
|
129
|
+
deltaX: z.number().optional().describe('Horizontal scroll pixels (for mouse wheel)'),
|
|
130
|
+
deltaY: z.number().optional().describe('Vertical scroll pixels (default: 300, negative scrolls up)'),
|
|
131
|
+
}, async (params) => {
|
|
132
|
+
const check = enforceUsageLimits(ctx.getAuth(), 'browser', ctx.executionMode);
|
|
133
|
+
if (!check.allowed)
|
|
134
|
+
return formatError(check.reason);
|
|
135
|
+
const page = await ensurePage(ctx);
|
|
136
|
+
return executeBrowserAction(page, 'scroll', params);
|
|
137
|
+
});
|
|
138
|
+
// browser_extract_text
|
|
139
|
+
server.tool('browser_extract_text', 'Extract the visible text content of an element.', { selector: z.string().describe('CSS selector of the element') }, async (params) => {
|
|
140
|
+
const check = enforceUsageLimits(ctx.getAuth(), 'browser', ctx.executionMode);
|
|
141
|
+
if (!check.allowed)
|
|
142
|
+
return formatError(check.reason);
|
|
143
|
+
const page = await ensurePage(ctx);
|
|
144
|
+
return executeBrowserAction(page, 'extract_text', params);
|
|
145
|
+
});
|
|
146
|
+
// browser_extract_attribute
|
|
147
|
+
server.tool('browser_extract_attribute', 'Get an HTML attribute value from an element (e.g. href, src, value, data-*).', {
|
|
148
|
+
selector: z.string().describe('CSS selector of the element'),
|
|
149
|
+
attribute: z.string().describe('Attribute name (e.g. "href", "src", "value", "data-id")'),
|
|
150
|
+
}, async (params) => {
|
|
151
|
+
const check = enforceUsageLimits(ctx.getAuth(), 'browser', ctx.executionMode);
|
|
152
|
+
if (!check.allowed)
|
|
153
|
+
return formatError(check.reason);
|
|
154
|
+
const page = await ensurePage(ctx);
|
|
155
|
+
return executeBrowserAction(page, 'extract_attribute', params);
|
|
156
|
+
});
|
|
157
|
+
// browser_screenshot
|
|
158
|
+
server.tool('browser_screenshot', 'Take a screenshot of the current page or a specific element. Returns the image directly.', {
|
|
159
|
+
selector: z.string().optional().describe('CSS selector to screenshot (default: full page viewport)'),
|
|
160
|
+
fullPage: z.boolean().optional().describe('Capture the full scrollable page'),
|
|
161
|
+
}, async (params) => {
|
|
162
|
+
const check = enforceUsageLimits(ctx.getAuth(), 'browser', ctx.executionMode);
|
|
163
|
+
if (!check.allowed)
|
|
164
|
+
return formatError(check.reason);
|
|
165
|
+
const page = await ensurePage(ctx);
|
|
166
|
+
return executeBrowserAction(page, 'screenshot', params);
|
|
167
|
+
});
|
|
168
|
+
// browser_evaluate
|
|
169
|
+
server.tool('browser_evaluate', 'Execute JavaScript code in the browser page context. Returns the result.', { script: z.string().describe('JavaScript code to execute in the page') }, async (params) => {
|
|
170
|
+
const check = enforceUsageLimits(ctx.getAuth(), 'browser', ctx.executionMode);
|
|
171
|
+
if (!check.allowed)
|
|
172
|
+
return formatError(check.reason);
|
|
173
|
+
const page = await ensurePage(ctx);
|
|
174
|
+
return executeBrowserAction(page, 'evaluate', params);
|
|
175
|
+
});
|
|
176
|
+
// browser_wait
|
|
177
|
+
server.tool('browser_wait', 'Wait for a selector to appear, a timeout, or navigation to complete.', {
|
|
178
|
+
selector: z.string().optional().describe('CSS selector to wait for'),
|
|
179
|
+
state: z.enum(['visible', 'hidden', 'attached', 'detached']).optional().describe('Desired state of the selector (default: visible)'),
|
|
180
|
+
milliseconds: z.number().optional().describe('Fixed wait time in milliseconds'),
|
|
181
|
+
navigation: z.boolean().optional().describe('Wait for page navigation/load'),
|
|
182
|
+
loadState: z.enum(['load', 'domcontentloaded', 'networkidle']).optional().describe('Load state to wait for'),
|
|
183
|
+
}, async (params) => {
|
|
184
|
+
const check = enforceUsageLimits(ctx.getAuth(), 'browser', ctx.executionMode);
|
|
185
|
+
if (!check.allowed)
|
|
186
|
+
return formatError(check.reason);
|
|
187
|
+
const page = await ensurePage(ctx);
|
|
188
|
+
return executeBrowserAction(page, 'wait', params);
|
|
189
|
+
});
|
|
190
|
+
// browser_get_page_info
|
|
191
|
+
server.tool('browser_get_page_info', 'Get current page URL and title.', {}, async () => {
|
|
192
|
+
const check = enforceUsageLimits(ctx.getAuth(), 'browser', ctx.executionMode);
|
|
193
|
+
if (!check.allowed)
|
|
194
|
+
return formatError(check.reason);
|
|
195
|
+
const page = await ensurePage(ctx);
|
|
196
|
+
return executeBrowserAction(page, 'get_page_info', {});
|
|
197
|
+
});
|
|
198
|
+
// browser_drag_drop
|
|
199
|
+
server.tool('browser_drag_drop', 'Drag an element and drop it onto another element.', {
|
|
200
|
+
source: z.string().describe('CSS selector of the element to drag'),
|
|
201
|
+
target: z.string().describe('CSS selector of the drop target'),
|
|
202
|
+
}, async (params) => {
|
|
203
|
+
const check = enforceUsageLimits(ctx.getAuth(), 'browser', ctx.executionMode);
|
|
204
|
+
if (!check.allowed)
|
|
205
|
+
return formatError(check.reason);
|
|
206
|
+
const page = await ensurePage(ctx);
|
|
207
|
+
return executeBrowserAction(page, 'drag_drop', params);
|
|
208
|
+
});
|
|
209
|
+
// browser_set_files
|
|
210
|
+
server.tool('browser_set_files', 'Upload file(s) to a file input element.', {
|
|
211
|
+
selector: z.string().describe('CSS selector of the file input'),
|
|
212
|
+
files: z.array(z.string()).describe('Array of file paths to upload'),
|
|
213
|
+
}, async (params) => {
|
|
214
|
+
const check = enforceUsageLimits(ctx.getAuth(), 'browser', ctx.executionMode);
|
|
215
|
+
if (!check.allowed)
|
|
216
|
+
return formatError(check.reason);
|
|
217
|
+
const page = await ensurePage(ctx);
|
|
218
|
+
return executeBrowserAction(page, 'set_files', params);
|
|
219
|
+
});
|
|
220
|
+
// browser_get_cookies
|
|
221
|
+
server.tool('browser_get_cookies', 'Get all cookies for the current page.', {}, async () => {
|
|
222
|
+
const check = enforceUsageLimits(ctx.getAuth(), 'browser', ctx.executionMode);
|
|
223
|
+
if (!check.allowed)
|
|
224
|
+
return formatError(check.reason);
|
|
225
|
+
const page = await ensurePage(ctx);
|
|
226
|
+
return executeBrowserAction(page, 'get_cookies', {});
|
|
227
|
+
});
|
|
228
|
+
// browser_set_cookies
|
|
229
|
+
server.tool('browser_set_cookies', 'Set cookies on the browser context.', {
|
|
230
|
+
cookies: z.array(z.object({
|
|
231
|
+
name: z.string(),
|
|
232
|
+
value: z.string(),
|
|
233
|
+
domain: z.string().optional(),
|
|
234
|
+
path: z.string().optional(),
|
|
235
|
+
httpOnly: z.boolean().optional(),
|
|
236
|
+
secure: z.boolean().optional(),
|
|
237
|
+
})).describe('Array of cookie objects to set'),
|
|
238
|
+
}, async (params) => {
|
|
239
|
+
const check = enforceUsageLimits(ctx.getAuth(), 'browser', ctx.executionMode);
|
|
240
|
+
if (!check.allowed)
|
|
241
|
+
return formatError(check.reason);
|
|
242
|
+
const page = await ensurePage(ctx);
|
|
243
|
+
return executeBrowserAction(page, 'set_cookies', params);
|
|
244
|
+
});
|
|
245
|
+
// browser_pdf
|
|
246
|
+
server.tool('browser_pdf', 'Generate a PDF of the current page.', {
|
|
247
|
+
format: z.enum(['A4', 'Letter', 'Legal', 'Tabloid']).optional().describe('Page format (default: A4)'),
|
|
248
|
+
printBackground: z.boolean().optional().describe('Include background graphics (default: true)'),
|
|
249
|
+
}, async (params) => {
|
|
250
|
+
const check = enforceUsageLimits(ctx.getAuth(), 'browser', ctx.executionMode);
|
|
251
|
+
if (!check.allowed)
|
|
252
|
+
return formatError(check.reason);
|
|
253
|
+
const page = await ensurePage(ctx);
|
|
254
|
+
return executeBrowserAction(page, 'pdf', params);
|
|
255
|
+
});
|
|
256
|
+
// browser_close
|
|
257
|
+
server.tool('browser_close', 'Close the browser session and release resources. Reports cloud minutes used.', {}, async () => {
|
|
258
|
+
const { minutesUsed } = await ctx.sessionManager.close();
|
|
259
|
+
if (minutesUsed > 0 && ctx.executionMode === 'cloud') {
|
|
260
|
+
await recordUsage(ctx.apiKey, ctx.apiUrl, { cloudBrowserMinutes: minutesUsed });
|
|
261
|
+
}
|
|
262
|
+
return {
|
|
263
|
+
content: [{
|
|
264
|
+
type: 'text',
|
|
265
|
+
text: JSON.stringify({ success: true, sessionClosed: true, cloudMinutesUsed: minutesUsed }),
|
|
266
|
+
}],
|
|
267
|
+
};
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=browser-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-tools.js","sourceRoot":"","sources":["../../src/tools/browser-tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,oBAAoB,EAAqB,MAAM,2BAA2B,CAAC;AAErH,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAW3D,SAAS,cAAc,CACrB,GAAwB,EACxB,QAAsB,EACtB,EAAsB;IAEtB,OAAO,KAAK,IAAI,EAAE;QAChB,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;QAC7E,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,WAAW,CAAC,KAAK,CAAC,MAAO,EAAE,SAAS,EAAE,EAAE,cAAc,EAAE,oBAAoB,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QACxG,CAAC;QACD,OAAO,EAAE,EAAE,CAAC;IACd,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,GAAwB;IAChD,IAAI,GAAG,CAAC,aAAa,KAAK,OAAO,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,oBAAoB,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QACjF,OAAO,OAAO,CAAC,IAAI,CAAC;IACtB,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,oBAAoB,CAAC;QAC5D,WAAW,EAAE,wBAAwB;QACrC,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB;KACrD,CAAC,CAAC;IACH,OAAO,OAAO,CAAC,IAAI,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,GAAwB;IAE9E,mBAAmB;IACnB,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,0EAA0E,EAC1E,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,kBAAkB,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC,EAAE,EAClL,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;QAC9E,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO,WAAW,CAAC,KAAK,CAAC,MAAO,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QACpE,wCAAwC;QACxC,IAAI,GAAG,CAAC,cAAc,CAAC,aAAa,EAAE,QAAQ,EAAE,CAAC;YAC/C,MAAM,QAAQ,GAAG,GAAG,CAAC,cAAc,CAAC,aAAa,CAAC,QAAQ,CAAC;YAC3D,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBACjE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAChD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBACzB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CACF,CAAC;IAEF,gBAAgB;IAChB,MAAM,CAAC,IAAI,CACT,eAAe,EACf,oDAAoD,EACpD;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;QACrE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QAC/E,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;KACpF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;QAC9E,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO,WAAW,CAAC,KAAK,CAAC,MAAO,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC,CACF,CAAC;IAEF,eAAe;IACf,MAAM,CAAC,IAAI,CACT,cAAc,EACd,yEAAyE,EACzE;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QAChE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;KAC1D,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;QAC9E,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO,WAAW,CAAC,KAAK,CAAC,MAAO,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC,CACF,CAAC;IAEF,eAAe;IACf,MAAM,CAAC,IAAI,CACT,cAAc,EACd,yGAAyG,EACzG;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QAC5D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QACzC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;KACtF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;QAC9E,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO,WAAW,CAAC,KAAK,CAAC,MAAO,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC,CACF,CAAC;IAEF,oBAAoB;IACpB,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,6DAA6D,EAC7D;QACE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wEAAwE,CAAC;QAClG,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;KAC/E,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;QAC9E,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO,WAAW,CAAC,KAAK,CAAC,MAAO,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,oBAAoB,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IACzD,CAAC,CACF,CAAC;IAEF,iBAAiB;IACjB,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,kDAAkD,EAClD;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;QACnE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC;KACjF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;QAC9E,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO,WAAW,CAAC,KAAK,CAAC,MAAO,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,oBAAoB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACtD,CAAC,CACF,CAAC;IAEF,gBAAgB;IAChB,MAAM,CAAC,IAAI,CACT,eAAe,EACf,8BAA8B,EAC9B;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QAC7D,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;KACpF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;QAC9E,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO,WAAW,CAAC,KAAK,CAAC,MAAO,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC,CACF,CAAC;IAEF,gBAAgB;IAChB,MAAM,CAAC,IAAI,CACT,eAAe,EACf,0EAA0E,EAC1E,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC,EAAE,EAC9E,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;QAC9E,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO,WAAW,CAAC,KAAK,CAAC,MAAO,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC,CACF,CAAC;IAEF,iBAAiB;IACjB,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,kDAAkD,EAClD;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;QAC5E,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;QACpF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4DAA4D,CAAC;KACrG,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;QAC9E,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO,WAAW,CAAC,KAAK,CAAC,MAAO,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,oBAAoB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACtD,CAAC,CACF,CAAC;IAEF,uBAAuB;IACvB,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,iDAAiD,EACjD,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,EAChE,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;QAC9E,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO,WAAW,CAAC,KAAK,CAAC,MAAO,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,oBAAoB,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;IAC5D,CAAC,CACF,CAAC;IAEF,4BAA4B;IAC5B,MAAM,CAAC,IAAI,CACT,2BAA2B,EAC3B,8EAA8E,EAC9E;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QAC5D,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;KAC1F,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;QAC9E,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO,WAAW,CAAC,KAAK,CAAC,MAAO,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,oBAAoB,CAAC,IAAI,EAAE,mBAAmB,EAAE,MAAM,CAAC,CAAC;IACjE,CAAC,CACF,CAAC;IAEF,qBAAqB;IACrB,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,0FAA0F,EAC1F;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0DAA0D,CAAC;QACpG,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;KAC9E,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;QAC9E,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO,WAAW,CAAC,KAAK,CAAC,MAAO,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,oBAAoB,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;IAC1D,CAAC,CACF,CAAC;IAEF,mBAAmB;IACnB,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,0EAA0E,EAC1E,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC,EAAE,EACzE,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;QAC9E,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO,WAAW,CAAC,KAAK,CAAC,MAAO,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,oBAAoB,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IACxD,CAAC,CACF,CAAC;IAEF,eAAe;IACf,MAAM,CAAC,IAAI,CACT,cAAc,EACd,sEAAsE,EACtE;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QACpE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;QACpI,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QAC/E,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;QAC5E,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,kBAAkB,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;KAC7G,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;QAC9E,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO,WAAW,CAAC,KAAK,CAAC,MAAO,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC,CACF,CAAC;IAEF,wBAAwB;IACxB,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,iCAAiC,EACjC,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;QAC9E,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO,WAAW,CAAC,KAAK,CAAC,MAAO,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,oBAAoB,CAAC,IAAI,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC;IACzD,CAAC,CACF,CAAC;IAEF,oBAAoB;IACpB,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,mDAAmD,EACnD;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;QAClE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;KAC/D,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;QAC9E,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO,WAAW,CAAC,KAAK,CAAC,MAAO,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,oBAAoB,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IACzD,CAAC,CACF,CAAC;IAEF,oBAAoB;IACpB,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,yCAAyC,EACzC;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;QAC/D,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,+BAA+B,CAAC;KACrE,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;QAC9E,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO,WAAW,CAAC,KAAK,CAAC,MAAO,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,oBAAoB,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IACzD,CAAC,CACF,CAAC;IAEF,sBAAsB;IACtB,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,uCAAuC,EACvC,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;QAC9E,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO,WAAW,CAAC,KAAK,CAAC,MAAO,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,oBAAoB,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC,CACF,CAAC;IAEF,sBAAsB;IACtB,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,qCAAqC,EACrC;QACE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;YACxB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;YAChB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;YACjB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC7B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC3B,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;YAChC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;SAC/B,CAAC,CAAC,CAAC,QAAQ,CAAC,gCAAgC,CAAC;KAC/C,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;QAC9E,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO,WAAW,CAAC,KAAK,CAAC,MAAO,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,oBAAoB,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC,CACF,CAAC;IAEF,cAAc;IACd,MAAM,CAAC,IAAI,CACT,aAAa,EACb,qCAAqC,EACrC;QACE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QACrG,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;KAChG,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;QAC9E,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO,WAAW,CAAC,KAAK,CAAC,MAAO,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,oBAAoB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC,CACF,CAAC;IAEF,gBAAgB;IAChB,MAAM,CAAC,IAAI,CACT,eAAe,EACf,8EAA8E,EAC9E,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QACzD,IAAI,WAAW,GAAG,CAAC,IAAI,GAAG,CAAC,aAAa,KAAK,OAAO,EAAE,CAAC;YACrD,MAAM,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,mBAAmB,EAAE,WAAW,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC;iBAC5F,CAAC;SACH,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data Transformation Tools
|
|
3
|
+
*
|
|
4
|
+
* Lightweight data manipulation tools that run locally
|
|
5
|
+
* with zero cost and zero API calls.
|
|
6
|
+
*/
|
|
7
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
export declare function registerDataTools(server: McpServer): void;
|
|
9
|
+
//# sourceMappingURL=data-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-tools.d.ts","sourceRoot":"","sources":["../../src/tools/data-tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,QAmIlD"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data Transformation Tools
|
|
3
|
+
*
|
|
4
|
+
* Lightweight data manipulation tools that run locally
|
|
5
|
+
* with zero cost and zero API calls.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { formatSuccess, formatError } from '../utils/output-formatter.js';
|
|
9
|
+
export function registerDataTools(server) {
|
|
10
|
+
server.tool('transform_json', 'Parse, query, or transform JSON data. Supports JSONPath-like access.', {
|
|
11
|
+
data: z.any().describe('JSON data to transform'),
|
|
12
|
+
path: z.string().optional().describe('Dot-notation path to extract (e.g. "results.0.name")'),
|
|
13
|
+
operation: z.enum(['parse', 'stringify', 'keys', 'values', 'flatten', 'pick']).optional().describe('Transformation to apply'),
|
|
14
|
+
fields: z.array(z.string()).optional().describe('Fields to pick (for "pick" operation)'),
|
|
15
|
+
}, async ({ data, path, operation, fields }) => {
|
|
16
|
+
try {
|
|
17
|
+
let parsed = typeof data === 'string' ? JSON.parse(data) : data;
|
|
18
|
+
if (path) {
|
|
19
|
+
const parts = path.split('.');
|
|
20
|
+
for (const p of parts) {
|
|
21
|
+
if (parsed == null)
|
|
22
|
+
break;
|
|
23
|
+
parsed = parsed[p];
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
switch (operation) {
|
|
27
|
+
case 'stringify':
|
|
28
|
+
return formatSuccess({ result: JSON.stringify(parsed, null, 2) });
|
|
29
|
+
case 'keys':
|
|
30
|
+
return formatSuccess({ result: Object.keys(parsed ?? {}) });
|
|
31
|
+
case 'values':
|
|
32
|
+
return formatSuccess({ result: Object.values(parsed ?? {}) });
|
|
33
|
+
case 'flatten':
|
|
34
|
+
if (Array.isArray(parsed)) {
|
|
35
|
+
return formatSuccess({ result: parsed.flat(Infinity) });
|
|
36
|
+
}
|
|
37
|
+
return formatSuccess({ result: parsed });
|
|
38
|
+
case 'pick':
|
|
39
|
+
if (fields && typeof parsed === 'object') {
|
|
40
|
+
const picked = {};
|
|
41
|
+
for (const f of fields)
|
|
42
|
+
picked[f] = parsed[f];
|
|
43
|
+
return formatSuccess({ result: picked });
|
|
44
|
+
}
|
|
45
|
+
return formatSuccess({ result: parsed });
|
|
46
|
+
default:
|
|
47
|
+
return formatSuccess({ result: parsed });
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
return formatError(`JSON transform failed: ${err.message}`);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
server.tool('generate_uuid', 'Generate a random UUID v4.', {}, async () => {
|
|
55
|
+
const uuid = crypto.randomUUID();
|
|
56
|
+
return formatSuccess({ uuid });
|
|
57
|
+
});
|
|
58
|
+
server.tool('base64_encode', 'Encode text to Base64.', { text: z.string().describe('Text to encode') }, async ({ text }) => {
|
|
59
|
+
return formatSuccess({ result: Buffer.from(text).toString('base64') });
|
|
60
|
+
});
|
|
61
|
+
server.tool('base64_decode', 'Decode Base64 to text.', { data: z.string().describe('Base64 string to decode') }, async ({ data }) => {
|
|
62
|
+
try {
|
|
63
|
+
return formatSuccess({ result: Buffer.from(data, 'base64').toString('utf-8') });
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
return formatError(`Decode failed: ${err.message}`);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
server.tool('format_date', 'Format a date string or timestamp.', {
|
|
70
|
+
date: z.union([z.string(), z.number()]).optional().describe('Date string, timestamp, or omit for now'),
|
|
71
|
+
format: z.string().optional().describe('Output format (default: ISO 8601)'),
|
|
72
|
+
timezone: z.string().optional().describe('IANA timezone (e.g. "America/New_York")'),
|
|
73
|
+
}, async ({ date, timezone }) => {
|
|
74
|
+
try {
|
|
75
|
+
const d = date ? new Date(date) : new Date();
|
|
76
|
+
if (isNaN(d.getTime()))
|
|
77
|
+
return formatError('Invalid date');
|
|
78
|
+
const options = {
|
|
79
|
+
year: 'numeric', month: '2-digit', day: '2-digit',
|
|
80
|
+
hour: '2-digit', minute: '2-digit', second: '2-digit',
|
|
81
|
+
...(timezone ? { timeZone: timezone } : {}),
|
|
82
|
+
};
|
|
83
|
+
return formatSuccess({
|
|
84
|
+
iso: d.toISOString(),
|
|
85
|
+
formatted: d.toLocaleString('en-GB', options),
|
|
86
|
+
timestamp: d.getTime(),
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
return formatError(`Date formatting failed: ${err.message}`);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
server.tool('math_operation', 'Perform a math operation.', {
|
|
94
|
+
expression: z.string().describe('Math expression to evaluate (e.g. "2 + 3 * 4")'),
|
|
95
|
+
}, async ({ expression }) => {
|
|
96
|
+
try {
|
|
97
|
+
// Simple safe eval using Function constructor (no access to globals)
|
|
98
|
+
const sanitized = expression.replace(/[^0-9+\-*/.()%\s]/g, '');
|
|
99
|
+
if (sanitized !== expression) {
|
|
100
|
+
return formatError('Expression contains invalid characters. Only numbers and +, -, *, /, %, (, ) are allowed.');
|
|
101
|
+
}
|
|
102
|
+
const result = new Function(`return (${sanitized})`)();
|
|
103
|
+
return formatSuccess({ expression, result });
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
return formatError(`Math error: ${err.message}`);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=data-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-tools.js","sourceRoot":"","sources":["../../src/tools/data-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration Tools (Dynamic Registry)
|
|
3
|
+
*
|
|
4
|
+
* Auto-generates MCP tools from NODE_CONFIGS integration entries.
|
|
5
|
+
* When new integration nodes are added to the platform, they
|
|
6
|
+
* automatically appear as MCP tools—no MCP code changes needed.
|
|
7
|
+
*
|
|
8
|
+
* Only registers tools for services where the user has valid credentials.
|
|
9
|
+
*/
|
|
10
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
11
|
+
import type { AuthContext } from '../auth/api-key-auth.js';
|
|
12
|
+
interface IntegrationToolsContext {
|
|
13
|
+
getAuth: () => AuthContext;
|
|
14
|
+
apiKey: string;
|
|
15
|
+
apiUrl: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Registers integration tools dynamically.
|
|
19
|
+
*
|
|
20
|
+
* This is called once during server setup. It registers tools based on:
|
|
21
|
+
* 1. Available integration configs from the platform
|
|
22
|
+
* 2. User's connected OAuth credentials
|
|
23
|
+
*
|
|
24
|
+
* For the MCP protocol, tools are registered statically at connection
|
|
25
|
+
* init, so we scope to all service types the user has credentials for.
|
|
26
|
+
*/
|
|
27
|
+
export declare function registerIntegrationTools(server: McpServer, ctx: IntegrationToolsContext): Promise<number>;
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=integration-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration-tools.d.ts","sourceRoot":"","sources":["../../src/tools/integration-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,WAAW,EAAqB,MAAM,yBAAyB,CAAC;AAW9E,UAAU,uBAAuB;IAC/B,OAAO,EAAE,MAAM,WAAW,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAiDD;;;;;;;;;GASG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,uBAAuB,GAC3B,OAAO,CAAC,MAAM,CAAC,CA8DjB"}
|