donobu 2.17.0 → 2.17.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/dist/assets/generated/parameter-schemas.json +33 -33
- package/dist/assets/generated/version +1 -1
- package/dist/esm/assets/generated/parameter-schemas.json +33 -33
- package/dist/esm/assets/generated/version +1 -1
- package/dist/esm/managers/InteractionVisualizer.d.ts +8 -30
- package/dist/esm/managers/InteractionVisualizer.d.ts.map +1 -1
- package/dist/esm/managers/InteractionVisualizer.js +132 -204
- package/dist/esm/managers/InteractionVisualizer.js.map +1 -1
- package/dist/esm/managers/PageInspector.d.ts.map +1 -1
- package/dist/esm/managers/PageInspector.js +30 -32
- package/dist/esm/managers/PageInspector.js.map +1 -1
- package/dist/esm/tools/SolveMfaChallenge.d.ts +32 -0
- package/dist/esm/tools/SolveMfaChallenge.d.ts.map +1 -0
- package/dist/esm/tools/SolveMfaChallenge.js +185 -0
- package/dist/esm/tools/SolveMfaChallenge.js.map +1 -0
- package/dist/managers/InteractionVisualizer.d.ts +8 -30
- package/dist/managers/InteractionVisualizer.d.ts.map +1 -1
- package/dist/managers/InteractionVisualizer.js +132 -204
- package/dist/managers/InteractionVisualizer.js.map +1 -1
- package/dist/managers/PageInspector.d.ts.map +1 -1
- package/dist/managers/PageInspector.js +30 -32
- package/dist/managers/PageInspector.js.map +1 -1
- package/dist/tools/SolveMfaChallenge.d.ts +32 -0
- package/dist/tools/SolveMfaChallenge.d.ts.map +1 -0
- package/dist/tools/SolveMfaChallenge.js +185 -0
- package/dist/tools/SolveMfaChallenge.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Locator } from 'playwright';
|
|
2
|
+
import { ToolCallContext } from '../models/ToolCallContext';
|
|
3
|
+
import { ReplayableInteraction, AnnotationBasedParameters, SelectorBasedParameters } from './ReplayableInteraction';
|
|
4
|
+
export interface SolveMfaChallengeToolCoreParameters {
|
|
5
|
+
/**
|
|
6
|
+
* The Gmail client ID.
|
|
7
|
+
*/
|
|
8
|
+
gmailClientId: string;
|
|
9
|
+
/**
|
|
10
|
+
* The Gmail client secret.
|
|
11
|
+
*/
|
|
12
|
+
gmailClientSecret: string;
|
|
13
|
+
/**
|
|
14
|
+
* The Gmail refresh token.
|
|
15
|
+
*/
|
|
16
|
+
gmailRefreshToken: string;
|
|
17
|
+
}
|
|
18
|
+
export interface SelectorBasedSolveMfaChallengeToolParameters extends SelectorBasedParameters, SolveMfaChallengeToolCoreParameters {
|
|
19
|
+
}
|
|
20
|
+
export interface AnnotationBasedSolveMfaChallengeToolParameters extends AnnotationBasedParameters, SolveMfaChallengeToolCoreParameters {
|
|
21
|
+
}
|
|
22
|
+
export declare class SolveMfaChallengeTool extends ReplayableInteraction<SolveMfaChallengeToolCoreParameters, SelectorBasedSolveMfaChallengeToolParameters, AnnotationBasedSolveMfaChallengeToolParameters> {
|
|
23
|
+
static readonly NAME = "solveMfaChallenge";
|
|
24
|
+
private static readonly MAX_RETRIES;
|
|
25
|
+
private static readonly RETRY_DELAY_MS;
|
|
26
|
+
constructor();
|
|
27
|
+
invoke(context: ToolCallContext, parameters: SolveMfaChallengeToolCoreParameters, element: Locator): Promise<string>;
|
|
28
|
+
private getMfaCodeFromEmails;
|
|
29
|
+
private getLatestEmailBody;
|
|
30
|
+
private extractMfaCodeWithGpt;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=SolveMfaChallenge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SolveMfaChallenge.d.ts","sourceRoot":"","sources":["../../src/tools/SolveMfaChallenge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,uBAAuB,EACxB,MAAM,yBAAyB,CAAC;AAMjC,MAAM,WAAW,mCAAmC;IAClD;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAE1B;;OAEG;IACH,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,4CACf,SAAQ,uBAAuB,EAC7B,mCAAmC;CAAG;AAE1C,MAAM,WAAW,8CACf,SAAQ,yBAAyB,EAC/B,mCAAmC;CAAG;AAE1C,qBAAa,qBAAsB,SAAQ,qBAAqB,CAC9D,mCAAmC,EACnC,4CAA4C,EAC5C,8CAA8C,CAC/C;IACC,gBAAuB,IAAI,uBAAuB;IAClD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAM;IACzC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAQ;;IAYxC,MAAM,CACV,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,mCAAmC,EAC/C,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,MAAM,CAAC;YAuCJ,oBAAoB;YA6CpB,kBAAkB;YA+ElB,qBAAqB;CAuDpC"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SolveMfaChallengeTool = void 0;
|
|
4
|
+
const ReplayableInteraction_1 = require("./ReplayableInteraction");
|
|
5
|
+
const MiscUtils_1 = require("../utils/MiscUtils");
|
|
6
|
+
const googleapis_1 = require("googleapis");
|
|
7
|
+
const Logger_1 = require("../utils/Logger");
|
|
8
|
+
class SolveMfaChallengeTool extends ReplayableInteraction_1.ReplayableInteraction {
|
|
9
|
+
constructor() {
|
|
10
|
+
super(SolveMfaChallengeTool.NAME, 'Scan Gmail-based emails for MFA verification codes and automatically input them into the specified field.', 'SelectorBasedSolveMfaChallengeToolParameters', 'AnnotationBasedSolveMfaChallengeToolParameters', true);
|
|
11
|
+
}
|
|
12
|
+
async invoke(context, parameters, element) {
|
|
13
|
+
const waitTimeSeconds = 60;
|
|
14
|
+
// Extract the MFA code from emails
|
|
15
|
+
const mfaCode = await this.getMfaCodeFromEmails(context, parameters, waitTimeSeconds);
|
|
16
|
+
if (!mfaCode) {
|
|
17
|
+
throw new Error('Could not find MFA code in emails after multiple attempts');
|
|
18
|
+
}
|
|
19
|
+
// Input the MFA code into the element
|
|
20
|
+
for (const char of mfaCode) {
|
|
21
|
+
await element.press(char, {
|
|
22
|
+
delay: MiscUtils_1.MiscUtils.generateHumanLikeKeyPressDurationInMs(char),
|
|
23
|
+
timeout: 3000,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
// Submit the form if necessary
|
|
27
|
+
try {
|
|
28
|
+
const char = 'Enter';
|
|
29
|
+
await element.press(char, {
|
|
30
|
+
delay: MiscUtils_1.MiscUtils.generateHumanLikeKeyPressDurationInMs(char),
|
|
31
|
+
timeout: 3000,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
catch (_error) {
|
|
35
|
+
// Some MFA systems automatically submit themselves, so if we have
|
|
36
|
+
// gotten this far, do not fail if the 'Enter' key fails to land.
|
|
37
|
+
}
|
|
38
|
+
return `Successfully retrieved and inputted MFA code: ${mfaCode}`;
|
|
39
|
+
}
|
|
40
|
+
async getMfaCodeFromEmails(context, parameters, waitTimeSeconds = 60) {
|
|
41
|
+
const startTime = Date.now();
|
|
42
|
+
const endTime = startTime + waitTimeSeconds * 1000;
|
|
43
|
+
let attempt = 0;
|
|
44
|
+
while (Date.now() < endTime &&
|
|
45
|
+
attempt < SolveMfaChallengeTool.MAX_RETRIES) {
|
|
46
|
+
attempt++;
|
|
47
|
+
Logger_1.appLogger.info(`Attempt ${attempt} of ${SolveMfaChallengeTool.MAX_RETRIES} to find MFA code in emails`);
|
|
48
|
+
try {
|
|
49
|
+
// Get the latest emails for the user
|
|
50
|
+
const emailBody = await this.getLatestEmailBody(parameters);
|
|
51
|
+
if (emailBody) {
|
|
52
|
+
// Use the GPT client to extract the MFA code
|
|
53
|
+
const mfaCode = await this.extractMfaCodeWithGpt(context, emailBody);
|
|
54
|
+
if (mfaCode) {
|
|
55
|
+
Logger_1.appLogger.info(`Successfully found MFA code: ${mfaCode}`);
|
|
56
|
+
return mfaCode;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Wait before retrying
|
|
60
|
+
await new Promise((resolve) => {
|
|
61
|
+
setTimeout(resolve, SolveMfaChallengeTool.RETRY_DELAY_MS);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
Logger_1.appLogger.error(`Error finding MFA code in emails`, error);
|
|
66
|
+
// Continue retrying
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
async getLatestEmailBody(parameters) {
|
|
72
|
+
try {
|
|
73
|
+
// Create OAuth client
|
|
74
|
+
const oAuth2Client = new googleapis_1.google.auth.OAuth2(parameters.gmailClientId, parameters.gmailClientSecret);
|
|
75
|
+
oAuth2Client.setCredentials({
|
|
76
|
+
refresh_token: parameters.gmailRefreshToken,
|
|
77
|
+
});
|
|
78
|
+
const gmail = googleapis_1.google.gmail({ version: 'v1', auth: oAuth2Client });
|
|
79
|
+
// Build search query
|
|
80
|
+
let query = 'subject:(verification code OR security code OR authentication code OR verification OR confirm OR code)';
|
|
81
|
+
// Add time filter to only get recent emails (last 5 minutes)
|
|
82
|
+
const fiveMinutesAgo = new Date(Date.now() - 5 * 60 * 1000);
|
|
83
|
+
const formattedDate = fiveMinutesAgo.toISOString().split('T')[0]; // YYYY-MM-DD format
|
|
84
|
+
query = `${query} after:${formattedDate}`;
|
|
85
|
+
// Get latest messages
|
|
86
|
+
const res = await gmail.users.messages.list({
|
|
87
|
+
userId: 'me',
|
|
88
|
+
q: query,
|
|
89
|
+
maxResults: 5,
|
|
90
|
+
});
|
|
91
|
+
if (!res.data.messages || res.data.messages.length === 0) {
|
|
92
|
+
Logger_1.appLogger.info('No matching emails found');
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
// Get the latest email content
|
|
96
|
+
const message = res.data.messages[0];
|
|
97
|
+
const email = await gmail.users.messages.get({
|
|
98
|
+
userId: 'me',
|
|
99
|
+
id: message.id,
|
|
100
|
+
format: 'full',
|
|
101
|
+
});
|
|
102
|
+
// Extract email body
|
|
103
|
+
const parts = email.data.payload?.parts;
|
|
104
|
+
let body = '';
|
|
105
|
+
if (parts) {
|
|
106
|
+
// Try to find plain text part first
|
|
107
|
+
const textPart = parts.find((part) => part.mimeType === 'text/plain');
|
|
108
|
+
if (textPart && textPart.body?.data) {
|
|
109
|
+
body = Buffer.from(textPart.body.data, 'base64').toString('utf-8');
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
// Fall back to HTML part if no plain text
|
|
113
|
+
const htmlPart = parts.find((part) => part.mimeType === 'text/html');
|
|
114
|
+
if (htmlPart && htmlPart.body?.data) {
|
|
115
|
+
body = Buffer.from(htmlPart.body.data, 'base64').toString('utf-8');
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
else if (email.data.payload?.body?.data) {
|
|
120
|
+
// Handle case where email has no parts
|
|
121
|
+
body = Buffer.from(email.data.payload.body.data, 'base64').toString('utf-8');
|
|
122
|
+
}
|
|
123
|
+
if (!body) {
|
|
124
|
+
Logger_1.appLogger.warn('Email found but body could not be decoded');
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
return body;
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
Logger_1.appLogger.error('Error getting email body:', error);
|
|
131
|
+
throw error;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
async extractMfaCodeWithGpt(context, emailBody) {
|
|
135
|
+
// Use GPT to extract the MFA code from the email body
|
|
136
|
+
const systemMessage = {
|
|
137
|
+
type: 'system',
|
|
138
|
+
text: `You are a tool that extracts MFA (Multi-Factor Authentication) verification codes from emails.
|
|
139
|
+
Your task is to identify and extract ONLY the verification code from the email.
|
|
140
|
+
Common formats include 6-digit numbers, 8-digit numbers, or combinations of numbers and letters.
|
|
141
|
+
If multiple potential codes exist, choose the most likely one based on context (usually near phrases like "verification code", "security code", etc.)
|
|
142
|
+
Return ONLY the code with no additional text, punctuation, or explanation.
|
|
143
|
+
If no code can be found, respond with "NO_CODE_FOUND".`,
|
|
144
|
+
};
|
|
145
|
+
const userMessage = {
|
|
146
|
+
type: 'user',
|
|
147
|
+
items: [
|
|
148
|
+
{
|
|
149
|
+
type: 'text',
|
|
150
|
+
text: `Extract the verification code from this email:
|
|
151
|
+
\`\`\`
|
|
152
|
+
${emailBody}
|
|
153
|
+
\`\`\``,
|
|
154
|
+
},
|
|
155
|
+
],
|
|
156
|
+
};
|
|
157
|
+
try {
|
|
158
|
+
const response = await context.gptClient.getMessage([
|
|
159
|
+
systemMessage,
|
|
160
|
+
userMessage,
|
|
161
|
+
]);
|
|
162
|
+
const extractedCode = response.text.trim();
|
|
163
|
+
if (extractedCode === 'NO_CODE_FOUND') {
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
// Basic validation - at least one digit, reasonable length
|
|
167
|
+
if (/\d/.test(extractedCode) &&
|
|
168
|
+
extractedCode.length >= 4 &&
|
|
169
|
+
extractedCode.length <= 12) {
|
|
170
|
+
return extractedCode;
|
|
171
|
+
}
|
|
172
|
+
Logger_1.appLogger.warn(`GPT extracted an invalid code: ${extractedCode}`);
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
Logger_1.appLogger.error('Error using GPT to extract MFA code:', error);
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
exports.SolveMfaChallengeTool = SolveMfaChallengeTool;
|
|
182
|
+
SolveMfaChallengeTool.NAME = 'solveMfaChallenge';
|
|
183
|
+
SolveMfaChallengeTool.MAX_RETRIES = 10;
|
|
184
|
+
SolveMfaChallengeTool.RETRY_DELAY_MS = 6000;
|
|
185
|
+
//# sourceMappingURL=SolveMfaChallenge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SolveMfaChallenge.js","sourceRoot":"","sources":["../../src/tools/SolveMfaChallenge.ts"],"names":[],"mappings":"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"}
|