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.
@@ -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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "donobu",
3
- "version": "2.17.0",
3
+ "version": "2.17.1",
4
4
  "description": "Create browser automations with an LLM agent and replay them as Playwright scripts.",
5
5
  "main": "dist/main.js",
6
6
  "module": "dist/esm/main.js",