donobu 3.19.3 → 3.20.0
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/apis/ToolsApi.d.ts.map +1 -1
- package/dist/apis/ToolsApi.js +0 -4
- package/dist/apis/ToolsApi.js.map +1 -1
- package/dist/cli/install-donobu-plugin.js +1 -1
- package/dist/cli/install-donobu-plugin.js.map +1 -1
- package/dist/envVars.d.ts +2 -8
- package/dist/envVars.d.ts.map +1 -1
- package/dist/envVars.js +5 -5
- package/dist/envVars.js.map +1 -1
- package/dist/esm/apis/ToolsApi.d.ts.map +1 -1
- package/dist/esm/apis/ToolsApi.js +0 -4
- package/dist/esm/apis/ToolsApi.js.map +1 -1
- package/dist/esm/cli/install-donobu-plugin.js +1 -1
- package/dist/esm/cli/install-donobu-plugin.js.map +1 -1
- package/dist/esm/envVars.d.ts +2 -8
- package/dist/esm/envVars.d.ts.map +1 -1
- package/dist/esm/envVars.js +5 -5
- package/dist/esm/envVars.js.map +1 -1
- package/dist/esm/lib/page/extendPage.d.ts.map +1 -1
- package/dist/esm/lib/page/extendPage.js +2 -2
- package/dist/esm/lib/page/extendPage.js.map +1 -1
- package/dist/esm/lib/test/testExtension.js +2 -2
- package/dist/esm/lib/test/testExtension.js.map +1 -1
- package/dist/esm/lib/test/utils/donobuTestStack.d.ts.map +1 -1
- package/dist/esm/lib/test/utils/donobuTestStack.js +1 -1
- package/dist/esm/lib/test/utils/donobuTestStack.js.map +1 -1
- package/dist/esm/lib/test/utils/selfHealing.d.ts.map +1 -1
- package/dist/esm/lib/test/utils/selfHealing.js +0 -2
- package/dist/esm/lib/test/utils/selfHealing.js.map +1 -1
- package/dist/esm/main.d.ts +9 -1
- package/dist/esm/main.d.ts.map +1 -1
- package/dist/esm/main.js +14 -4
- package/dist/esm/main.js.map +1 -1
- package/dist/esm/managers/AdminApiController.d.ts +1 -1
- package/dist/esm/managers/AdminApiController.d.ts.map +1 -1
- package/dist/esm/managers/AdminApiController.js.map +1 -1
- package/dist/esm/managers/DonobuFlowsManager.d.ts.map +1 -1
- package/dist/esm/managers/DonobuFlowsManager.js +2 -2
- package/dist/esm/managers/DonobuFlowsManager.js.map +1 -1
- package/dist/esm/managers/DonobuStack.d.ts +2 -16
- package/dist/esm/managers/DonobuStack.d.ts.map +1 -1
- package/dist/esm/managers/DonobuStack.js +1 -1
- package/dist/esm/managers/DonobuStack.js.map +1 -1
- package/dist/esm/managers/PluginLoader.d.ts +9 -4
- package/dist/esm/managers/PluginLoader.d.ts.map +1 -1
- package/dist/esm/managers/PluginLoader.js +24 -9
- package/dist/esm/managers/PluginLoader.js.map +1 -1
- package/dist/esm/managers/ToolManager.d.ts +5 -0
- package/dist/esm/managers/ToolManager.d.ts.map +1 -1
- package/dist/esm/managers/ToolManager.js +9 -5
- package/dist/esm/managers/ToolManager.js.map +1 -1
- package/dist/esm/persistence/PersistencePlugin.d.ts +29 -0
- package/dist/esm/persistence/PersistencePlugin.d.ts.map +1 -0
- package/dist/esm/persistence/PersistencePlugin.js +21 -0
- package/dist/esm/persistence/PersistencePlugin.js.map +1 -0
- package/dist/esm/persistence/env/EnvPersistenceRegistry.d.ts +1 -1
- package/dist/esm/persistence/env/EnvPersistenceRegistry.d.ts.map +1 -1
- package/dist/esm/persistence/env/EnvPersistenceRegistry.js +11 -15
- package/dist/esm/persistence/env/EnvPersistenceRegistry.js.map +1 -1
- package/dist/esm/persistence/flows/FlowsPersistenceRegistry.d.ts +1 -1
- package/dist/esm/persistence/flows/FlowsPersistenceRegistry.d.ts.map +1 -1
- package/dist/esm/persistence/flows/FlowsPersistenceRegistry.js +11 -15
- package/dist/esm/persistence/flows/FlowsPersistenceRegistry.js.map +1 -1
- package/dist/esm/utils/MiscUtils.js +2 -2
- package/dist/esm/utils/MiscUtils.js.map +1 -1
- package/dist/lib/page/extendPage.d.ts.map +1 -1
- package/dist/lib/page/extendPage.js +2 -2
- package/dist/lib/page/extendPage.js.map +1 -1
- package/dist/lib/test/testExtension.js +2 -2
- package/dist/lib/test/testExtension.js.map +1 -1
- package/dist/lib/test/utils/donobuTestStack.d.ts.map +1 -1
- package/dist/lib/test/utils/donobuTestStack.js +1 -1
- package/dist/lib/test/utils/donobuTestStack.js.map +1 -1
- package/dist/lib/test/utils/selfHealing.d.ts.map +1 -1
- package/dist/lib/test/utils/selfHealing.js +0 -2
- package/dist/lib/test/utils/selfHealing.js.map +1 -1
- package/dist/main.d.ts +9 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +14 -4
- package/dist/main.js.map +1 -1
- package/dist/managers/AdminApiController.d.ts +1 -1
- package/dist/managers/AdminApiController.d.ts.map +1 -1
- package/dist/managers/AdminApiController.js.map +1 -1
- package/dist/managers/DonobuFlowsManager.d.ts.map +1 -1
- package/dist/managers/DonobuFlowsManager.js +2 -2
- package/dist/managers/DonobuFlowsManager.js.map +1 -1
- package/dist/managers/DonobuStack.d.ts +2 -16
- package/dist/managers/DonobuStack.d.ts.map +1 -1
- package/dist/managers/DonobuStack.js +1 -1
- package/dist/managers/DonobuStack.js.map +1 -1
- package/dist/managers/PluginLoader.d.ts +9 -4
- package/dist/managers/PluginLoader.d.ts.map +1 -1
- package/dist/managers/PluginLoader.js +24 -9
- package/dist/managers/PluginLoader.js.map +1 -1
- package/dist/managers/ToolManager.d.ts +5 -0
- package/dist/managers/ToolManager.d.ts.map +1 -1
- package/dist/managers/ToolManager.js +9 -5
- package/dist/managers/ToolManager.js.map +1 -1
- package/dist/persistence/PersistencePlugin.d.ts +29 -0
- package/dist/persistence/PersistencePlugin.d.ts.map +1 -0
- package/dist/persistence/PersistencePlugin.js +21 -0
- package/dist/persistence/PersistencePlugin.js.map +1 -0
- package/dist/persistence/env/EnvPersistenceRegistry.d.ts +1 -1
- package/dist/persistence/env/EnvPersistenceRegistry.d.ts.map +1 -1
- package/dist/persistence/env/EnvPersistenceRegistry.js +11 -15
- package/dist/persistence/env/EnvPersistenceRegistry.js.map +1 -1
- package/dist/persistence/flows/FlowsPersistenceRegistry.d.ts +1 -1
- package/dist/persistence/flows/FlowsPersistenceRegistry.d.ts.map +1 -1
- package/dist/persistence/flows/FlowsPersistenceRegistry.js +11 -15
- package/dist/persistence/flows/FlowsPersistenceRegistry.js.map +1 -1
- package/dist/utils/MiscUtils.js +2 -2
- package/dist/utils/MiscUtils.js.map +1 -1
- package/package.json +2 -7
- package/dist/esm/persistence/env/EnvPersistenceAwsS3.d.ts +0 -31
- package/dist/esm/persistence/env/EnvPersistenceAwsS3.d.ts.map +0 -1
- package/dist/esm/persistence/env/EnvPersistenceAwsS3.js +0 -117
- package/dist/esm/persistence/env/EnvPersistenceAwsS3.js.map +0 -1
- package/dist/esm/persistence/env/EnvPersistenceGoogleCloudStorage.d.ts +0 -30
- package/dist/esm/persistence/env/EnvPersistenceGoogleCloudStorage.d.ts.map +0 -1
- package/dist/esm/persistence/env/EnvPersistenceGoogleCloudStorage.js +0 -131
- package/dist/esm/persistence/env/EnvPersistenceGoogleCloudStorage.js.map +0 -1
- package/dist/esm/persistence/flows/FlowsPersistenceAwsS3.d.ts +0 -71
- package/dist/esm/persistence/flows/FlowsPersistenceAwsS3.d.ts.map +0 -1
- package/dist/esm/persistence/flows/FlowsPersistenceAwsS3.js +0 -487
- package/dist/esm/persistence/flows/FlowsPersistenceAwsS3.js.map +0 -1
- package/dist/esm/persistence/flows/FlowsPersistenceGoogleCloudStorage.d.ts +0 -71
- package/dist/esm/persistence/flows/FlowsPersistenceGoogleCloudStorage.d.ts.map +0 -1
- package/dist/esm/persistence/flows/FlowsPersistenceGoogleCloudStorage.js +0 -444
- package/dist/esm/persistence/flows/FlowsPersistenceGoogleCloudStorage.js.map +0 -1
- package/dist/esm/tools/SolveCaptcha.d.ts +0 -19
- package/dist/esm/tools/SolveCaptcha.d.ts.map +0 -1
- package/dist/esm/tools/SolveCaptcha.js +0 -36
- package/dist/esm/tools/SolveCaptcha.js.map +0 -1
- package/dist/esm/tools/SolveMfaChallenge.d.ts +0 -45
- package/dist/esm/tools/SolveMfaChallenge.d.ts.map +0 -1
- package/dist/esm/tools/SolveMfaChallenge.js +0 -214
- package/dist/esm/tools/SolveMfaChallenge.js.map +0 -1
- package/dist/persistence/env/EnvPersistenceAwsS3.d.ts +0 -31
- package/dist/persistence/env/EnvPersistenceAwsS3.d.ts.map +0 -1
- package/dist/persistence/env/EnvPersistenceAwsS3.js +0 -117
- package/dist/persistence/env/EnvPersistenceAwsS3.js.map +0 -1
- package/dist/persistence/env/EnvPersistenceGoogleCloudStorage.d.ts +0 -30
- package/dist/persistence/env/EnvPersistenceGoogleCloudStorage.d.ts.map +0 -1
- package/dist/persistence/env/EnvPersistenceGoogleCloudStorage.js +0 -131
- package/dist/persistence/env/EnvPersistenceGoogleCloudStorage.js.map +0 -1
- package/dist/persistence/flows/FlowsPersistenceAwsS3.d.ts +0 -71
- package/dist/persistence/flows/FlowsPersistenceAwsS3.d.ts.map +0 -1
- package/dist/persistence/flows/FlowsPersistenceAwsS3.js +0 -487
- package/dist/persistence/flows/FlowsPersistenceAwsS3.js.map +0 -1
- package/dist/persistence/flows/FlowsPersistenceGoogleCloudStorage.d.ts +0 -71
- package/dist/persistence/flows/FlowsPersistenceGoogleCloudStorage.d.ts.map +0 -1
- package/dist/persistence/flows/FlowsPersistenceGoogleCloudStorage.js +0 -444
- package/dist/persistence/flows/FlowsPersistenceGoogleCloudStorage.js.map +0 -1
- package/dist/tools/SolveCaptcha.d.ts +0 -19
- package/dist/tools/SolveCaptcha.d.ts.map +0 -1
- package/dist/tools/SolveCaptcha.js +0 -36
- package/dist/tools/SolveCaptcha.js.map +0 -1
- package/dist/tools/SolveMfaChallenge.d.ts +0 -45
- package/dist/tools/SolveMfaChallenge.d.ts.map +0 -1
- package/dist/tools/SolveMfaChallenge.js +0 -214
- package/dist/tools/SolveMfaChallenge.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FlowsPersistenceGoogleCloudStorage.d.ts","sourceRoot":"","sources":["../../../../src/persistence/flows/FlowsPersistenceGoogleCloudStorage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,444 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.FlowsPersistenceGoogleCloudStorage = void 0;
|
|
4
|
-
const FlowNotFoundException_1 = require("../../exceptions/FlowNotFoundException");
|
|
5
|
-
const BrowserStorageState_1 = require("../../models/BrowserStorageState");
|
|
6
|
-
const Logger_1 = require("../../utils/Logger");
|
|
7
|
-
const MiscUtils_1 = require("../../utils/MiscUtils");
|
|
8
|
-
/**
|
|
9
|
-
* A persistence implementation that uses Google Cloud Storage.
|
|
10
|
-
*
|
|
11
|
-
* If you are running locally, be sure to have the Google Cloud CLI installed
|
|
12
|
-
* so that you can authenticate using `gcloud auth application-default login`
|
|
13
|
-
* before running Donobu.
|
|
14
|
-
*
|
|
15
|
-
* If Donobu is being run in the Google cloud, be sure that the service account
|
|
16
|
-
* in which it is being run has permissions to read and write the Google Cloud
|
|
17
|
-
* Storage bucket specified as a constructor argument.
|
|
18
|
-
*/
|
|
19
|
-
class FlowsPersistenceGoogleCloudStorage {
|
|
20
|
-
/**
|
|
21
|
-
* Dynamically imports the Google Cloud Storage library.
|
|
22
|
-
* This helps to delay loading the library until it's actually needed.
|
|
23
|
-
*/
|
|
24
|
-
static async importGoogleCloudStorage() {
|
|
25
|
-
try {
|
|
26
|
-
// Dynamic import to delay loading until needed
|
|
27
|
-
const module = await import('@google-cloud/storage');
|
|
28
|
-
return {
|
|
29
|
-
Storage: module.Storage,
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
catch (error) {
|
|
33
|
-
Logger_1.appLogger.error('Failed to import Google Cloud Storage', error);
|
|
34
|
-
throw new Error('Failed to import Google Cloud Storage library');
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
static async create(bucketName) {
|
|
38
|
-
// Only import the Google Cloud Storage library when creating an instance
|
|
39
|
-
const { Storage } = await FlowsPersistenceGoogleCloudStorage.importGoogleCloudStorage();
|
|
40
|
-
const storage = new Storage();
|
|
41
|
-
const bucket = storage.bucket(bucketName);
|
|
42
|
-
return bucket
|
|
43
|
-
.exists()
|
|
44
|
-
.then(([exists]) => {
|
|
45
|
-
if (!exists) {
|
|
46
|
-
throw new Error(`Bucket ${bucketName} does not exist.`);
|
|
47
|
-
}
|
|
48
|
-
else {
|
|
49
|
-
return bucket;
|
|
50
|
-
}
|
|
51
|
-
})
|
|
52
|
-
.then((bucket) => {
|
|
53
|
-
return new FlowsPersistenceGoogleCloudStorage(bucket);
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
constructor(bucket) {
|
|
57
|
-
this.bucket = bucket;
|
|
58
|
-
}
|
|
59
|
-
async setFlowMetadata(flowMetadata) {
|
|
60
|
-
const objectName = `${flowMetadata.id}/${FlowsPersistenceGoogleCloudStorage.METADATA_FILENAME}`;
|
|
61
|
-
await this.uploadString(objectName, JSON.stringify(flowMetadata), 'application/json');
|
|
62
|
-
// Update the name index if a name exists
|
|
63
|
-
if (flowMetadata.name) {
|
|
64
|
-
await this.updateNameIndex(flowMetadata.id, flowMetadata.name);
|
|
65
|
-
}
|
|
66
|
-
// Update runMode index
|
|
67
|
-
await this.updateRunModeIndex(flowMetadata.id, flowMetadata.runMode);
|
|
68
|
-
// Update state index
|
|
69
|
-
await this.updateStateIndex(flowMetadata.id, flowMetadata.state);
|
|
70
|
-
// Update combined runMode+state index
|
|
71
|
-
await this.updateRunModeStateIndex(flowMetadata.id, flowMetadata.runMode, flowMetadata.state);
|
|
72
|
-
}
|
|
73
|
-
async getFlowMetadataById(flowId) {
|
|
74
|
-
const objectName = `${flowId}/${FlowsPersistenceGoogleCloudStorage.METADATA_FILENAME}`;
|
|
75
|
-
const jsonData = await this.downloadString(objectName);
|
|
76
|
-
if (!jsonData) {
|
|
77
|
-
throw FlowNotFoundException_1.FlowNotFoundException.forId(flowId);
|
|
78
|
-
}
|
|
79
|
-
return JSON.parse(jsonData);
|
|
80
|
-
}
|
|
81
|
-
async getFlowMetadataByName(flowName) {
|
|
82
|
-
if (!flowName) {
|
|
83
|
-
throw FlowNotFoundException_1.FlowNotFoundException.forName(flowName);
|
|
84
|
-
}
|
|
85
|
-
const indexKey = `${FlowsPersistenceGoogleCloudStorage.NAME_INDEX_PREFIX}${encodeURIComponent(flowName)}`;
|
|
86
|
-
const flowId = await this.downloadString(indexKey);
|
|
87
|
-
if (!flowId) {
|
|
88
|
-
throw FlowNotFoundException_1.FlowNotFoundException.forName(flowName);
|
|
89
|
-
}
|
|
90
|
-
try {
|
|
91
|
-
return await this.getFlowMetadataById(flowId);
|
|
92
|
-
}
|
|
93
|
-
catch (error) {
|
|
94
|
-
// If the index points to a non-existent flow, clean up the index
|
|
95
|
-
Logger_1.appLogger.warn(`Flow referenced in name index not found: ${flowId}`, error);
|
|
96
|
-
// Delete the stale index entry
|
|
97
|
-
const indexFile = this.bucket.file(indexKey);
|
|
98
|
-
await indexFile.delete().catch((e) => {
|
|
99
|
-
Logger_1.appLogger.warn(`Failed to delete stale name index: ${indexKey}`, e);
|
|
100
|
-
});
|
|
101
|
-
throw FlowNotFoundException_1.FlowNotFoundException.forName(flowName);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
async getFlowsMetadata(query) {
|
|
105
|
-
const { limit = 20, pageToken, name, runMode, state, startedAfter, startedBefore, } = query || {};
|
|
106
|
-
const validLimit = Math.min(Math.max(1, limit), 100);
|
|
107
|
-
// Determine which index to use based on query params
|
|
108
|
-
let prefix = '';
|
|
109
|
-
let usedIndex = false;
|
|
110
|
-
if (name) {
|
|
111
|
-
// If querying by name, directly fetch that specific flow
|
|
112
|
-
try {
|
|
113
|
-
const flow = await this.getFlowMetadataByName(name);
|
|
114
|
-
// Apply other filters
|
|
115
|
-
let includeFlow = true;
|
|
116
|
-
if (runMode && flow.runMode !== runMode) {
|
|
117
|
-
includeFlow = false;
|
|
118
|
-
}
|
|
119
|
-
if (state && flow.state !== state) {
|
|
120
|
-
includeFlow = false;
|
|
121
|
-
}
|
|
122
|
-
// Apply date range filters
|
|
123
|
-
if (startedAfter !== undefined &&
|
|
124
|
-
(flow.startedAt || 0) < startedAfter) {
|
|
125
|
-
includeFlow = false;
|
|
126
|
-
}
|
|
127
|
-
if (startedBefore !== undefined &&
|
|
128
|
-
(flow.startedAt || 0) > startedBefore) {
|
|
129
|
-
includeFlow = false;
|
|
130
|
-
}
|
|
131
|
-
if (includeFlow) {
|
|
132
|
-
return { items: [flow], nextPageToken: undefined };
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
return { items: [], nextPageToken: undefined };
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
catch (_e) {
|
|
139
|
-
return { items: [], nextPageToken: undefined };
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
else if (runMode && state) {
|
|
143
|
-
// Use combined index if both runMode and state are specified
|
|
144
|
-
prefix = `${FlowsPersistenceGoogleCloudStorage.RUN_MODE_STATE_INDEX_PREFIX}${runMode}_${state}/`;
|
|
145
|
-
usedIndex = true;
|
|
146
|
-
}
|
|
147
|
-
else if (runMode) {
|
|
148
|
-
// Use runMode index
|
|
149
|
-
prefix = `${FlowsPersistenceGoogleCloudStorage.RUN_MODE_INDEX_PREFIX}${runMode}/`;
|
|
150
|
-
usedIndex = true;
|
|
151
|
-
}
|
|
152
|
-
else if (state) {
|
|
153
|
-
// Use state index
|
|
154
|
-
prefix = `${FlowsPersistenceGoogleCloudStorage.STATE_INDEX_PREFIX}${state}/`;
|
|
155
|
-
usedIndex = true;
|
|
156
|
-
}
|
|
157
|
-
// Prepare query options
|
|
158
|
-
const queryOptions = {
|
|
159
|
-
maxResults: validLimit * 2,
|
|
160
|
-
pageToken: pageToken,
|
|
161
|
-
prefix: usedIndex ? prefix : undefined,
|
|
162
|
-
};
|
|
163
|
-
// Get files based on query
|
|
164
|
-
const [files, nextQueryObj] = await this.bucket.getFiles(queryOptions);
|
|
165
|
-
// Extract flow IDs - either from index files or from metadata files
|
|
166
|
-
let flowIds = [];
|
|
167
|
-
if (usedIndex) {
|
|
168
|
-
// If using an index, extract flow IDs from index file names
|
|
169
|
-
flowIds = files.map((file) => {
|
|
170
|
-
// Extract flowId from the index file path
|
|
171
|
-
return file.name.substring(prefix.length);
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
else {
|
|
175
|
-
// If not using an index, filter to metadata files
|
|
176
|
-
const metadataFiles = files.filter((file) => file.name.endsWith(`/${FlowsPersistenceGoogleCloudStorage.METADATA_FILENAME}`));
|
|
177
|
-
// Extract flow IDs from metadata file paths
|
|
178
|
-
flowIds = metadataFiles.map((file) => {
|
|
179
|
-
return file.name.substring(0, file.name.indexOf('/'));
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
// Fetch metadata for each flow
|
|
183
|
-
let flows = [];
|
|
184
|
-
for (const flowId of flowIds) {
|
|
185
|
-
try {
|
|
186
|
-
const flowMetadata = await this.getFlowMetadataById(flowId);
|
|
187
|
-
// Apply remaining filters
|
|
188
|
-
let includeFlow = true;
|
|
189
|
-
// Apply date range filters
|
|
190
|
-
if (startedAfter !== undefined &&
|
|
191
|
-
(flowMetadata.startedAt || 0) < startedAfter) {
|
|
192
|
-
includeFlow = false;
|
|
193
|
-
}
|
|
194
|
-
if (startedBefore !== undefined &&
|
|
195
|
-
(flowMetadata.startedAt || 0) > startedBefore) {
|
|
196
|
-
includeFlow = false;
|
|
197
|
-
}
|
|
198
|
-
// Double-check the indexed fields (in case index is out of sync)
|
|
199
|
-
if (runMode && flowMetadata.runMode !== runMode) {
|
|
200
|
-
includeFlow = false;
|
|
201
|
-
}
|
|
202
|
-
if (state && flowMetadata.state !== state) {
|
|
203
|
-
includeFlow = false;
|
|
204
|
-
}
|
|
205
|
-
if (includeFlow) {
|
|
206
|
-
flows.push(flowMetadata);
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
catch (e) {
|
|
210
|
-
Logger_1.appLogger.warn(`Flow not found: ${flowId}`, e);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
// Sort by creation date (newest first)
|
|
214
|
-
flows.sort((a, b) => (b.startedAt || 0) - (a.startedAt || 0));
|
|
215
|
-
// Apply limit
|
|
216
|
-
const limitedFlows = flows.slice(0, validLimit);
|
|
217
|
-
const hasMore = flows.length > validLimit;
|
|
218
|
-
return {
|
|
219
|
-
items: limitedFlows,
|
|
220
|
-
nextPageToken: hasMore ? nextQueryObj?.pageToken : undefined,
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
|
-
async saveScreenShot(flowId, bytes) {
|
|
224
|
-
const imageType = MiscUtils_1.MiscUtils.detectImageType(bytes);
|
|
225
|
-
const mimeType = `image/${imageType}`;
|
|
226
|
-
const filename = `${new Date().toISOString()}.screenshot.${imageType}`;
|
|
227
|
-
const objectName = `${flowId}/${filename}`;
|
|
228
|
-
await this.uploadBytes(objectName, bytes, mimeType);
|
|
229
|
-
return filename;
|
|
230
|
-
}
|
|
231
|
-
async getScreenShot(flowId, screenShotId) {
|
|
232
|
-
return this.getFlowFile(flowId, screenShotId);
|
|
233
|
-
}
|
|
234
|
-
async setToolCall(flowId, toolCall) {
|
|
235
|
-
const filename = `${toolCall.startedAt}${FlowsPersistenceGoogleCloudStorage.TOOL_CALL_FILENAME_SUFFIX}`;
|
|
236
|
-
const objectName = `${flowId}/${filename}`;
|
|
237
|
-
await this.uploadString(objectName, JSON.stringify(toolCall), 'application/json');
|
|
238
|
-
}
|
|
239
|
-
async getToolCalls(flowId) {
|
|
240
|
-
const prefix = `${flowId}/`;
|
|
241
|
-
const [files] = await this.bucket.getFiles({ prefix });
|
|
242
|
-
const toolCalls = [];
|
|
243
|
-
for (const file of files) {
|
|
244
|
-
if (file.name.endsWith(FlowsPersistenceGoogleCloudStorage.TOOL_CALL_FILENAME_SUFFIX)) {
|
|
245
|
-
const [content] = await file.download();
|
|
246
|
-
const toolCall = JSON.parse(content.toString());
|
|
247
|
-
toolCalls.push(toolCall);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
if (toolCalls.length === 0) {
|
|
251
|
-
throw FlowNotFoundException_1.FlowNotFoundException.forId(flowId);
|
|
252
|
-
}
|
|
253
|
-
return toolCalls.sort((a, b) => (a.startedAt || 0) - (b.startedAt || 0));
|
|
254
|
-
}
|
|
255
|
-
async deleteToolCall(flowId, toolCallId) {
|
|
256
|
-
// Ensure we throw FlowNotFoundException if the flow is missing.
|
|
257
|
-
await this.getFlowMetadataById(flowId);
|
|
258
|
-
const prefix = `${flowId}/`;
|
|
259
|
-
const [files] = await this.bucket.getFiles({ prefix });
|
|
260
|
-
for (const file of files) {
|
|
261
|
-
if (!file.name.endsWith(FlowsPersistenceGoogleCloudStorage.TOOL_CALL_FILENAME_SUFFIX)) {
|
|
262
|
-
continue;
|
|
263
|
-
}
|
|
264
|
-
try {
|
|
265
|
-
const [content] = await file.download();
|
|
266
|
-
const toolCall = JSON.parse(content.toString());
|
|
267
|
-
if (toolCall.id === toolCallId) {
|
|
268
|
-
await file.delete();
|
|
269
|
-
return;
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
catch (error) {
|
|
273
|
-
Logger_1.appLogger.warn(`Failed to inspect tool call file ${file.name} for deletion`, error);
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
async setVideo(flowId, bytes) {
|
|
278
|
-
const objectName = `${flowId}/${FlowsPersistenceGoogleCloudStorage.VIDEO_FILENAME}`;
|
|
279
|
-
await this.uploadBytes(objectName, bytes, 'video/webm');
|
|
280
|
-
}
|
|
281
|
-
async getVideoSegment(flowId, startOffset, length) {
|
|
282
|
-
const objectName = `${flowId}/${FlowsPersistenceGoogleCloudStorage.VIDEO_FILENAME}`;
|
|
283
|
-
const file = this.bucket.file(objectName);
|
|
284
|
-
const [exists] = await file.exists();
|
|
285
|
-
if (!exists) {
|
|
286
|
-
return null;
|
|
287
|
-
}
|
|
288
|
-
const [metadata] = await file.getMetadata();
|
|
289
|
-
const totalLength = Number(metadata.size);
|
|
290
|
-
const adjustedLength = Math.min(length, totalLength - startOffset);
|
|
291
|
-
if (adjustedLength <= 0) {
|
|
292
|
-
return null;
|
|
293
|
-
}
|
|
294
|
-
try {
|
|
295
|
-
const [content] = await file.download({
|
|
296
|
-
start: startOffset,
|
|
297
|
-
end: startOffset + adjustedLength - 1,
|
|
298
|
-
});
|
|
299
|
-
return {
|
|
300
|
-
bytes: content,
|
|
301
|
-
totalLength: totalLength,
|
|
302
|
-
startOffset: startOffset,
|
|
303
|
-
};
|
|
304
|
-
}
|
|
305
|
-
catch (e) {
|
|
306
|
-
Logger_1.appLogger.error(`Error reading video segment for flowId ${flowId}: ${e}`);
|
|
307
|
-
return null;
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
async getFlowFile(flowId, fileId) {
|
|
311
|
-
const objectName = `${flowId}/${fileId}`;
|
|
312
|
-
const file = this.bucket.file(objectName);
|
|
313
|
-
const [exists] = await file.exists();
|
|
314
|
-
if (!exists) {
|
|
315
|
-
return null;
|
|
316
|
-
}
|
|
317
|
-
const [content] = await file.download();
|
|
318
|
-
return content;
|
|
319
|
-
}
|
|
320
|
-
async setFlowFile(flowId, fileId, fileBytes) {
|
|
321
|
-
const objectName = `${flowId}/${fileId}`;
|
|
322
|
-
await this.uploadBytes(objectName, fileBytes, 'application/octet-stream');
|
|
323
|
-
}
|
|
324
|
-
async setBrowserState(flowId, browserState) {
|
|
325
|
-
const serializedBrowserState = Buffer.from(JSON.stringify(browserState), 'utf-8');
|
|
326
|
-
await this.setFlowFile(flowId, FlowsPersistenceGoogleCloudStorage.BROWSER_STATE_FILENAME, serializedBrowserState);
|
|
327
|
-
}
|
|
328
|
-
async getBrowserState(flowId) {
|
|
329
|
-
const browserStateRaw = await this.getFlowFile(flowId, FlowsPersistenceGoogleCloudStorage.BROWSER_STATE_FILENAME);
|
|
330
|
-
if (browserStateRaw) {
|
|
331
|
-
return BrowserStorageState_1.BrowserStorageStateSchema.parse(JSON.parse(browserStateRaw.toString('utf-8')));
|
|
332
|
-
}
|
|
333
|
-
else {
|
|
334
|
-
return null;
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
async deleteFlow(flowId) {
|
|
338
|
-
try {
|
|
339
|
-
// Get flow metadata to find its fields for index cleanup
|
|
340
|
-
const metadata = await this.getFlowMetadataById(flowId);
|
|
341
|
-
// Delete the name index entry if name exists
|
|
342
|
-
if (metadata.name) {
|
|
343
|
-
const indexKey = `${FlowsPersistenceGoogleCloudStorage.NAME_INDEX_PREFIX}${encodeURIComponent(metadata.name)}`;
|
|
344
|
-
const indexFile = this.bucket.file(indexKey);
|
|
345
|
-
const [exists] = await indexFile.exists();
|
|
346
|
-
if (exists) {
|
|
347
|
-
await indexFile.delete();
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
// Delete runMode index
|
|
351
|
-
const runModeIndexKey = `${FlowsPersistenceGoogleCloudStorage.RUN_MODE_INDEX_PREFIX}${metadata.runMode}/${flowId}`;
|
|
352
|
-
const runModeIndexFile = this.bucket.file(runModeIndexKey);
|
|
353
|
-
const [runModeExists] = await runModeIndexFile.exists();
|
|
354
|
-
if (runModeExists) {
|
|
355
|
-
await runModeIndexFile.delete();
|
|
356
|
-
}
|
|
357
|
-
// Delete state index
|
|
358
|
-
const stateIndexKey = `${FlowsPersistenceGoogleCloudStorage.STATE_INDEX_PREFIX}${metadata.state}/${flowId}`;
|
|
359
|
-
const stateIndexFile = this.bucket.file(stateIndexKey);
|
|
360
|
-
const [stateExists] = await stateIndexFile.exists();
|
|
361
|
-
if (stateExists) {
|
|
362
|
-
await stateIndexFile.delete();
|
|
363
|
-
}
|
|
364
|
-
// Delete combined index
|
|
365
|
-
const combinedIndexKey = `${FlowsPersistenceGoogleCloudStorage.RUN_MODE_STATE_INDEX_PREFIX}${metadata.runMode}_${metadata.state}/${flowId}`;
|
|
366
|
-
const combinedIndexFile = this.bucket.file(combinedIndexKey);
|
|
367
|
-
const [combinedExists] = await combinedIndexFile.exists();
|
|
368
|
-
if (combinedExists) {
|
|
369
|
-
await combinedIndexFile.delete();
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
catch (_error) {
|
|
373
|
-
// Pass - couldn't load metadata to clean up indexes. This likely means
|
|
374
|
-
// the flow has already been deleted.
|
|
375
|
-
}
|
|
376
|
-
// Delete all flow files
|
|
377
|
-
const prefix = `${flowId}/`;
|
|
378
|
-
const [files] = await this.bucket.getFiles({ prefix });
|
|
379
|
-
if (files.length > 0) {
|
|
380
|
-
await Promise.all(files.map((file) => file.delete()));
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
async uploadString(objectName, data, contentType) {
|
|
384
|
-
const file = this.bucket.file(objectName);
|
|
385
|
-
await file.save(data, {
|
|
386
|
-
contentType,
|
|
387
|
-
metadata: { contentType },
|
|
388
|
-
});
|
|
389
|
-
}
|
|
390
|
-
async uploadBytes(objectName, bytes, contentType) {
|
|
391
|
-
const file = this.bucket.file(objectName);
|
|
392
|
-
await file.save(bytes, {
|
|
393
|
-
contentType,
|
|
394
|
-
metadata: { contentType },
|
|
395
|
-
});
|
|
396
|
-
}
|
|
397
|
-
async downloadString(objectName) {
|
|
398
|
-
const file = this.bucket.file(objectName);
|
|
399
|
-
const [exists] = await file.exists();
|
|
400
|
-
if (!exists) {
|
|
401
|
-
return null;
|
|
402
|
-
}
|
|
403
|
-
const [content] = await file.download();
|
|
404
|
-
return content.toString();
|
|
405
|
-
}
|
|
406
|
-
/**
|
|
407
|
-
* Update name-to-id index.
|
|
408
|
-
*/
|
|
409
|
-
async updateNameIndex(flowId, flowName) {
|
|
410
|
-
const indexKey = `${FlowsPersistenceGoogleCloudStorage.NAME_INDEX_PREFIX}${encodeURIComponent(flowName)}`;
|
|
411
|
-
await this.uploadString(indexKey, flowId, 'text/plain');
|
|
412
|
-
}
|
|
413
|
-
/**
|
|
414
|
-
* Update runMode-to-id index.
|
|
415
|
-
*/
|
|
416
|
-
async updateRunModeIndex(flowId, runMode) {
|
|
417
|
-
const indexKey = `${FlowsPersistenceGoogleCloudStorage.RUN_MODE_INDEX_PREFIX}${runMode}/${flowId}`;
|
|
418
|
-
await this.uploadString(indexKey, flowId, 'text/plain');
|
|
419
|
-
}
|
|
420
|
-
/**
|
|
421
|
-
* Update state-to-id index.
|
|
422
|
-
*/
|
|
423
|
-
async updateStateIndex(flowId, state) {
|
|
424
|
-
const indexKey = `${FlowsPersistenceGoogleCloudStorage.STATE_INDEX_PREFIX}${state}/${flowId}`;
|
|
425
|
-
await this.uploadString(indexKey, flowId, 'text/plain');
|
|
426
|
-
}
|
|
427
|
-
/**
|
|
428
|
-
* Update combined runMode+state-to-id index.
|
|
429
|
-
*/
|
|
430
|
-
async updateRunModeStateIndex(flowId, runMode, state) {
|
|
431
|
-
const indexKey = `${FlowsPersistenceGoogleCloudStorage.RUN_MODE_STATE_INDEX_PREFIX}${runMode}_${state}/${flowId}`;
|
|
432
|
-
await this.uploadString(indexKey, flowId, 'text/plain');
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
exports.FlowsPersistenceGoogleCloudStorage = FlowsPersistenceGoogleCloudStorage;
|
|
436
|
-
FlowsPersistenceGoogleCloudStorage.NAME_INDEX_PREFIX = '_name-index/';
|
|
437
|
-
FlowsPersistenceGoogleCloudStorage.RUN_MODE_INDEX_PREFIX = '_run-mode-index/';
|
|
438
|
-
FlowsPersistenceGoogleCloudStorage.STATE_INDEX_PREFIX = '_state-index/';
|
|
439
|
-
FlowsPersistenceGoogleCloudStorage.RUN_MODE_STATE_INDEX_PREFIX = '_run-mode-state-index/';
|
|
440
|
-
FlowsPersistenceGoogleCloudStorage.METADATA_FILENAME = 'metadata.json';
|
|
441
|
-
FlowsPersistenceGoogleCloudStorage.BROWSER_STATE_FILENAME = 'browserstate.json';
|
|
442
|
-
FlowsPersistenceGoogleCloudStorage.TOOL_CALL_FILENAME_SUFFIX = '.tool-call.json';
|
|
443
|
-
FlowsPersistenceGoogleCloudStorage.VIDEO_FILENAME = 'video.webm';
|
|
444
|
-
//# sourceMappingURL=FlowsPersistenceGoogleCloudStorage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FlowsPersistenceGoogleCloudStorage.js","sourceRoot":"","sources":["../../../../src/persistence/flows/FlowsPersistenceGoogleCloudStorage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { z } from 'zod/v4';
|
|
2
|
-
import type { ToolCallContext } from '../models/ToolCallContext';
|
|
3
|
-
import type { ToolCallResult } from '../models/ToolCallResult';
|
|
4
|
-
import { BaseGptArgsSchema, NoArgsSchema } from '../models/ToolSchema';
|
|
5
|
-
import { Tool } from './Tool';
|
|
6
|
-
/**
|
|
7
|
-
* Work in progress:
|
|
8
|
-
*
|
|
9
|
-
* For now, this tool automatically fails. It is just meant as a way for a flow
|
|
10
|
-
* to acknowledge a captcha so that we can programmatically detect if a flow hit
|
|
11
|
-
* a captcha at all. This tool is purposely not enabled by default.
|
|
12
|
-
*/
|
|
13
|
-
export declare class SolveCaptchaTool extends Tool<typeof NoArgsSchema, typeof BaseGptArgsSchema> {
|
|
14
|
-
static readonly NAME = "solveCaptcha";
|
|
15
|
-
constructor();
|
|
16
|
-
call(_context: ToolCallContext, _parameters: z.infer<typeof NoArgsSchema>): Promise<ToolCallResult>;
|
|
17
|
-
callFromGpt(context: ToolCallContext, _parameters: z.infer<typeof BaseGptArgsSchema>): Promise<ToolCallResult>;
|
|
18
|
-
}
|
|
19
|
-
//# sourceMappingURL=SolveCaptcha.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SolveCaptcha.d.ts","sourceRoot":"","sources":["../../../src/tools/SolveCaptcha.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B;;;;;;GAMG;AACH,qBAAa,gBAAiB,SAAQ,IAAI,CACxC,OAAO,YAAY,EACnB,OAAO,iBAAiB,CACzB;IACC,gBAAuB,IAAI,kBAAkB;;IAWvB,IAAI,CACxB,QAAQ,EAAE,eAAe,EACzB,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,GACxC,OAAO,CAAC,cAAc,CAAC;IAcJ,WAAW,CAC/B,OAAO,EAAE,eAAe,EACxB,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,GAC7C,OAAO,CAAC,cAAc,CAAC;CAG3B"}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SolveCaptchaTool = void 0;
|
|
4
|
-
const ToolSchema_1 = require("../models/ToolSchema");
|
|
5
|
-
const Tool_1 = require("./Tool");
|
|
6
|
-
/**
|
|
7
|
-
* Work in progress:
|
|
8
|
-
*
|
|
9
|
-
* For now, this tool automatically fails. It is just meant as a way for a flow
|
|
10
|
-
* to acknowledge a captcha so that we can programmatically detect if a flow hit
|
|
11
|
-
* a captcha at all. This tool is purposely not enabled by default.
|
|
12
|
-
*/
|
|
13
|
-
class SolveCaptchaTool extends Tool_1.Tool {
|
|
14
|
-
constructor() {
|
|
15
|
-
super(SolveCaptchaTool.NAME, `Solve a captcha or captcha-like challenge for the current webpage.`, ToolSchema_1.NoArgsSchema, ToolSchema_1.BaseGptArgsSchema);
|
|
16
|
-
}
|
|
17
|
-
async call(_context, _parameters) {
|
|
18
|
-
// TODO:
|
|
19
|
-
// 1. Classify the captcha type.
|
|
20
|
-
// 2. Grab the appropriate page values based on type.
|
|
21
|
-
// 3. Call the appropriate API https://github.com/2captcha/2captcha-javascript based on type.
|
|
22
|
-
// 4. Apply the result to the current page.
|
|
23
|
-
// 5. Return success/failure.
|
|
24
|
-
return {
|
|
25
|
-
isSuccessful: false,
|
|
26
|
-
forLlm: 'Unable to solve the challenge!',
|
|
27
|
-
metadata: null,
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
async callFromGpt(context, _parameters) {
|
|
31
|
-
return this.call(context, {});
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
exports.SolveCaptchaTool = SolveCaptchaTool;
|
|
35
|
-
SolveCaptchaTool.NAME = 'solveCaptcha';
|
|
36
|
-
//# sourceMappingURL=SolveCaptcha.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SolveCaptcha.js","sourceRoot":"","sources":["../../../src/tools/SolveCaptcha.ts"],"names":[],"mappings":";;;AAIA,qDAAuE;AACvE,iCAA8B;AAE9B;;;;;;GAMG;AACH,MAAa,gBAAiB,SAAQ,WAGrC;IAGC;QACE,KAAK,CACH,gBAAgB,CAAC,IAAI,EACrB,oEAAoE,EACpE,yBAAY,EACZ,8BAAiB,CAClB,CAAC;IACJ,CAAC;IAEe,KAAK,CAAC,IAAI,CACxB,QAAyB,EACzB,WAAyC;QAEzC,QAAQ;QACR,gCAAgC;QAChC,qDAAqD;QACrD,6FAA6F;QAC7F,2CAA2C;QAC3C,6BAA6B;QAC7B,OAAO;YACL,YAAY,EAAE,KAAK;YACnB,MAAM,EAAE,gCAAgC;YACxC,QAAQ,EAAE,IAAI;SACf,CAAC;IACJ,CAAC;IAEe,KAAK,CAAC,WAAW,CAC/B,OAAwB,EACxB,WAA8C;QAE9C,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAChC,CAAC;;AArCH,4CAsCC;AAlCwB,qBAAI,GAAG,cAAc,CAAC"}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import type { ElementHandle } from 'playwright';
|
|
2
|
-
import { z } from 'zod/v4';
|
|
3
|
-
import type { ToolCallContext } from '../models/ToolCallContext';
|
|
4
|
-
import { ReplayableInteraction } from './ReplayableInteraction';
|
|
5
|
-
export declare const SolveMfaChallengeCoreSchema: z.ZodObject<{
|
|
6
|
-
gmailClientId: z.ZodString;
|
|
7
|
-
gmailClientSecret: z.ZodString;
|
|
8
|
-
gmailRefreshToken: z.ZodString;
|
|
9
|
-
email: z.ZodString;
|
|
10
|
-
}, z.core.$strip>;
|
|
11
|
-
export declare const SelectorBasedSolveMfaChallengeSchema: z.ZodObject<{
|
|
12
|
-
gmailClientId: z.ZodString;
|
|
13
|
-
gmailClientSecret: z.ZodString;
|
|
14
|
-
gmailRefreshToken: z.ZodString;
|
|
15
|
-
email: z.ZodString;
|
|
16
|
-
selector: z.ZodObject<{
|
|
17
|
-
element: z.ZodArray<z.ZodString>;
|
|
18
|
-
frame: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
19
|
-
}, z.core.$strip>;
|
|
20
|
-
}, z.core.$strip>;
|
|
21
|
-
export declare const AnnotationBasedSolveMfaChallengeSchema: z.ZodObject<{
|
|
22
|
-
gmailClientId: z.ZodString;
|
|
23
|
-
gmailClientSecret: z.ZodString;
|
|
24
|
-
gmailRefreshToken: z.ZodString;
|
|
25
|
-
email: z.ZodString;
|
|
26
|
-
whyThisAnnotation: z.ZodString;
|
|
27
|
-
annotation: z.ZodString;
|
|
28
|
-
rationale: z.ZodString;
|
|
29
|
-
}, z.core.$strip>;
|
|
30
|
-
export declare class SolveMfaChallengeTool extends ReplayableInteraction<typeof SolveMfaChallengeCoreSchema, typeof SelectorBasedSolveMfaChallengeSchema, typeof AnnotationBasedSolveMfaChallengeSchema> {
|
|
31
|
-
static readonly NAME = "solveMfaChallenge";
|
|
32
|
-
private static readonly MAX_RETRIES;
|
|
33
|
-
private static readonly RETRY_DELAY_MS;
|
|
34
|
-
constructor();
|
|
35
|
-
invoke(context: ToolCallContext, parameters: z.infer<typeof SolveMfaChallengeCoreSchema>, handles: {
|
|
36
|
-
target: ElementHandle<HTMLElement | SVGElement>;
|
|
37
|
-
label?: ElementHandle<HTMLElement | SVGElement>;
|
|
38
|
-
}): Promise<string>;
|
|
39
|
-
private getMfaCodeFromEmails;
|
|
40
|
-
private fetchLatestMfaEmail;
|
|
41
|
-
private extractBody;
|
|
42
|
-
private extractMfaCodeWithGpt;
|
|
43
|
-
private decodeBase64Url;
|
|
44
|
-
}
|
|
45
|
-
//# sourceMappingURL=SolveMfaChallenge.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SolveMfaChallenge.d.ts","sourceRoot":"","sources":["../../../src/tools/SolveMfaChallenge.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAG3B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAGjE,OAAO,EAEL,qBAAqB,EAEtB,MAAM,yBAAyB,CAAC;AAEjC,eAAO,MAAM,2BAA2B;;;;;iBAqBtC,CAAC;AACH,eAAO,MAAM,oCAAoC;;;;;;;;;iBAG/C,CAAC;AACH,eAAO,MAAM,sCAAsC;;;;;;;;iBAGjD,CAAC;AAEH,qBAAa,qBAAsB,SAAQ,qBAAqB,CAC9D,OAAO,2BAA2B,EAClC,OAAO,oCAAoC,EAC3C,OAAO,sCAAsC,CAC9C;IACC,gBAAuB,IAAI,uBAAuB;IAClD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAK;IACxC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAS;;IAazC,MAAM,CACV,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,EACvD,OAAO,EAAE;QACP,MAAM,EAAE,aAAa,CAAC,WAAW,GAAG,UAAU,CAAC,CAAC;QAChD,KAAK,CAAC,EAAE,aAAa,CAAC,WAAW,GAAG,UAAU,CAAC,CAAC;KACjD,GACA,OAAO,CAAC,MAAM,CAAC;YAqDJ,oBAAoB;YAgDpB,mBAAmB;IAwDjC,OAAO,CAAC,WAAW;YA6BL,qBAAqB;IAwCnC,OAAO,CAAC,eAAe;CAKxB"}
|