donobu 2.3.0 → 2.4.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/README.md +14 -0
- package/dist/apis/SpecialFlowsApi.d.ts +7 -1
- package/dist/apis/SpecialFlowsApi.js +41 -29
- package/dist/apis/SpecialFlowsApi.js.map +1 -1
- package/dist/apis/ToolsApi.d.ts +1 -1
- package/dist/apis/ToolsApi.js +1 -1
- package/dist/apis/ToolsApi.js.map +1 -1
- package/dist/assets/control-panel.js +3 -3
- package/dist/assets/generated/parameter-schemas.json +4 -4
- package/dist/assets/generated/version +1 -1
- package/dist/clients/AnthropicAwsBedrockGptClient.js +1 -1
- package/dist/clients/AnthropicAwsBedrockGptClient.js.map +1 -1
- package/dist/clients/AnthropicGptClient.js +1 -1
- package/dist/clients/AnthropicGptClient.js.map +1 -1
- package/dist/clients/GoogleGptClient.js +3 -3
- package/dist/clients/GoogleGptClient.js.map +1 -1
- package/dist/clients/GptClient.d.ts +1 -1
- package/dist/clients/OpenAiGptClient.js +1 -1
- package/dist/clients/OpenAiGptClient.js.map +1 -1
- package/dist/clients/VercelAiGptClient.js +1 -1
- package/dist/clients/VercelAiGptClient.js.map +1 -1
- package/dist/esm/apis/SpecialFlowsApi.d.ts +7 -1
- package/dist/esm/apis/SpecialFlowsApi.js +41 -29
- package/dist/esm/apis/SpecialFlowsApi.js.map +1 -1
- package/dist/esm/apis/ToolsApi.d.ts +1 -1
- package/dist/esm/apis/ToolsApi.js +1 -1
- package/dist/esm/apis/ToolsApi.js.map +1 -1
- package/dist/esm/assets/control-panel.js +3 -3
- package/dist/esm/assets/generated/parameter-schemas.json +4 -4
- package/dist/esm/assets/generated/version +1 -1
- package/dist/esm/clients/AnthropicAwsBedrockGptClient.js +1 -1
- package/dist/esm/clients/AnthropicAwsBedrockGptClient.js.map +1 -1
- package/dist/esm/clients/AnthropicGptClient.js +1 -1
- package/dist/esm/clients/AnthropicGptClient.js.map +1 -1
- package/dist/esm/clients/GoogleGptClient.js +3 -3
- package/dist/esm/clients/GoogleGptClient.js.map +1 -1
- package/dist/esm/clients/GptClient.d.ts +1 -1
- package/dist/esm/clients/OpenAiGptClient.js +1 -1
- package/dist/esm/clients/OpenAiGptClient.js.map +1 -1
- package/dist/esm/clients/VercelAiGptClient.js +1 -1
- package/dist/esm/clients/VercelAiGptClient.js.map +1 -1
- package/dist/esm/main.d.ts +6 -6
- package/dist/esm/main.js +50 -39
- package/dist/esm/main.js.map +1 -1
- package/dist/esm/managers/AdminApiController.js +12 -25
- package/dist/esm/managers/AdminApiController.js.map +1 -1
- package/dist/esm/managers/CodeGenerator.d.ts +8 -0
- package/dist/esm/managers/CodeGenerator.js +25 -9
- package/dist/esm/managers/CodeGenerator.js.map +1 -1
- package/dist/esm/managers/DonobuFlow.js +4 -2
- package/dist/esm/managers/DonobuFlow.js.map +1 -1
- package/dist/esm/managers/DonobuFlowsManager.js +16 -7
- package/dist/esm/managers/DonobuFlowsManager.js.map +1 -1
- package/dist/esm/managers/DonobuMcpServer.d.ts +24 -0
- package/dist/esm/managers/DonobuMcpServer.js +146 -0
- package/dist/esm/managers/DonobuMcpServer.js.map +1 -0
- package/dist/esm/managers/DonobuStack.d.ts +19 -0
- package/dist/esm/managers/DonobuStack.js +29 -0
- package/dist/esm/managers/DonobuStack.js.map +1 -0
- package/dist/esm/managers/ToolManager.d.ts +1 -2
- package/dist/esm/managers/ToolManager.js +14 -14
- package/dist/esm/managers/ToolManager.js.map +1 -1
- package/dist/esm/models/BrowserFramework.d.ts +8 -15
- package/dist/esm/models/BrowserFramework.js +74 -96
- package/dist/esm/models/BrowserFramework.js.map +1 -1
- package/dist/esm/models/CustomTool.d.ts +1 -1
- package/dist/esm/persistence/DonobuSqliteDb.js +3 -2
- package/dist/esm/persistence/DonobuSqliteDb.js.map +1 -1
- package/dist/esm/test.d.ts +2 -15
- package/dist/esm/test.js +37 -54
- package/dist/esm/test.js.map +1 -1
- package/dist/esm/tools/CustomToolRunnerTool.js +5 -5
- package/dist/esm/tools/CustomToolRunnerTool.js.map +1 -1
- package/dist/esm/tools/GoToGoogleMapsStreetViewTool.js +9 -11
- package/dist/esm/tools/GoToGoogleMapsStreetViewTool.js.map +1 -1
- package/dist/esm/tools/Tool.d.ts +2 -2
- package/dist/esm/tools/Tool.js +4 -4
- package/dist/esm/tools/Tool.js.map +1 -1
- package/dist/esm/utils/PlaywrightUtils.js +0 -2
- package/dist/esm/utils/PlaywrightUtils.js.map +1 -1
- package/dist/main.d.ts +6 -6
- package/dist/main.js +50 -39
- package/dist/main.js.map +1 -1
- package/dist/managers/AdminApiController.js +12 -25
- package/dist/managers/AdminApiController.js.map +1 -1
- package/dist/managers/CodeGenerator.d.ts +8 -0
- package/dist/managers/CodeGenerator.js +25 -9
- package/dist/managers/CodeGenerator.js.map +1 -1
- package/dist/managers/DonobuFlow.js +4 -2
- package/dist/managers/DonobuFlow.js.map +1 -1
- package/dist/managers/DonobuFlowsManager.js +16 -7
- package/dist/managers/DonobuFlowsManager.js.map +1 -1
- package/dist/managers/DonobuMcpServer.d.ts +24 -0
- package/dist/managers/DonobuMcpServer.js +146 -0
- package/dist/managers/DonobuMcpServer.js.map +1 -0
- package/dist/managers/DonobuStack.d.ts +19 -0
- package/dist/managers/DonobuStack.js +29 -0
- package/dist/managers/DonobuStack.js.map +1 -0
- package/dist/managers/ToolManager.d.ts +1 -2
- package/dist/managers/ToolManager.js +14 -14
- package/dist/managers/ToolManager.js.map +1 -1
- package/dist/models/BrowserFramework.d.ts +8 -15
- package/dist/models/BrowserFramework.js +74 -96
- package/dist/models/BrowserFramework.js.map +1 -1
- package/dist/models/CustomTool.d.ts +1 -1
- package/dist/persistence/DonobuSqliteDb.js +3 -2
- package/dist/persistence/DonobuSqliteDb.js.map +1 -1
- package/dist/test.d.ts +2 -15
- package/dist/test.js +37 -54
- package/dist/test.js.map +1 -1
- package/dist/tools/CustomToolRunnerTool.js +5 -5
- package/dist/tools/CustomToolRunnerTool.js.map +1 -1
- package/dist/tools/GoToGoogleMapsStreetViewTool.js +9 -11
- package/dist/tools/GoToGoogleMapsStreetViewTool.js.map +1 -1
- package/dist/tools/Tool.d.ts +2 -2
- package/dist/tools/Tool.js +4 -4
- package/dist/tools/Tool.js.map +1 -1
- package/dist/utils/PlaywrightUtils.js +0 -2
- package/dist/utils/PlaywrightUtils.js.map +1 -1
- package/package.json +1 -1
- package/dist/apis/GptResourcesApi.d.ts +0 -20
- package/dist/apis/GptResourcesApi.js +0 -53
- package/dist/apis/GptResourcesApi.js.map +0 -1
- package/dist/apis/KeysApi.d.ts +0 -25
- package/dist/apis/KeysApi.js +0 -64
- package/dist/apis/KeysApi.js.map +0 -1
- package/dist/assets/Donobu.entitlements.plist +0 -28
- package/dist/clients/GoogleGptClient2.d.ts +0 -18
- package/dist/clients/GoogleGptClient2.js +0 -237
- package/dist/clients/GoogleGptClient2.js.map +0 -1
- package/dist/donobu.fixtures.d.ts +0 -57
- package/dist/donobu.fixtures.js +0 -167
- package/dist/donobu.fixtures.js.map +0 -1
- package/dist/esm/apis/GptResourcesApi.d.ts +0 -20
- package/dist/esm/apis/GptResourcesApi.js +0 -53
- package/dist/esm/apis/GptResourcesApi.js.map +0 -1
- package/dist/esm/apis/KeysApi.d.ts +0 -25
- package/dist/esm/apis/KeysApi.js +0 -64
- package/dist/esm/apis/KeysApi.js.map +0 -1
- package/dist/esm/assets/Donobu.entitlements.plist +0 -28
- package/dist/esm/donobu.fixtures.d.ts +0 -57
- package/dist/esm/donobu.fixtures.js +0 -167
- package/dist/esm/donobu.fixtures.js.map +0 -1
- package/dist/esm/exceptions/GptResourceNotFoundException.d.ts +0 -8
- package/dist/esm/exceptions/GptResourceNotFoundException.js +0 -16
- package/dist/esm/exceptions/GptResourceNotFoundException.js.map +0 -1
- package/dist/esm/managers/FlowsPersistence.d.ts +0 -79
- package/dist/esm/managers/FlowsPersistence.js +0 -3
- package/dist/esm/managers/FlowsPersistence.js.map +0 -1
- package/dist/esm/managers/FlowsPersistenceAwsS3.d.ts +0 -48
- package/dist/esm/managers/FlowsPersistenceAwsS3.js +0 -284
- package/dist/esm/managers/FlowsPersistenceAwsS3.js.map +0 -1
- package/dist/esm/managers/FlowsPersistenceFactory.d.ts +0 -9
- package/dist/esm/managers/FlowsPersistenceFactory.js +0 -3
- package/dist/esm/managers/FlowsPersistenceFactory.js.map +0 -1
- package/dist/esm/managers/FlowsPersistenceFactoryImpl.d.ts +0 -57
- package/dist/esm/managers/FlowsPersistenceFactoryImpl.js +0 -119
- package/dist/esm/managers/FlowsPersistenceFactoryImpl.js.map +0 -1
- package/dist/esm/managers/FlowsPersistenceFactoryPreset.d.ts +0 -12
- package/dist/esm/managers/FlowsPersistenceFactoryPreset.js +0 -25
- package/dist/esm/managers/FlowsPersistenceFactoryPreset.js.map +0 -1
- package/dist/esm/managers/FlowsPersistenceFilesystem.d.ts +0 -33
- package/dist/esm/managers/FlowsPersistenceFilesystem.js +0 -180
- package/dist/esm/managers/FlowsPersistenceFilesystem.js.map +0 -1
- package/dist/esm/managers/FlowsPersistenceGoogleCloudStorage.d.ts +0 -40
- package/dist/esm/managers/FlowsPersistenceGoogleCloudStorage.js +0 -209
- package/dist/esm/managers/FlowsPersistenceGoogleCloudStorage.js.map +0 -1
- package/dist/esm/managers/FlowsPersistenceSupabase.d.ts +0 -33
- package/dist/esm/managers/FlowsPersistenceSupabase.js +0 -152
- package/dist/esm/managers/FlowsPersistenceSupabase.js.map +0 -1
- package/dist/esm/managers/FlowsPersistenceVolatile.d.ts +0 -30
- package/dist/esm/managers/FlowsPersistenceVolatile.js +0 -103
- package/dist/esm/managers/FlowsPersistenceVolatile.js.map +0 -1
- package/dist/esm/managers/GptPlatformApiKeysManager.d.ts +0 -36
- package/dist/esm/managers/GptPlatformApiKeysManager.js +0 -3
- package/dist/esm/managers/GptPlatformApiKeysManager.js.map +0 -1
- package/dist/esm/managers/GptPlatformApiKeysManagerFilesystem.d.ts +0 -29
- package/dist/esm/managers/GptPlatformApiKeysManagerFilesystem.js +0 -136
- package/dist/esm/managers/GptPlatformApiKeysManagerFilesystem.js.map +0 -1
- package/dist/esm/managers/GptPlatformApiKeysManagerVolatile.d.ts +0 -35
- package/dist/esm/managers/GptPlatformApiKeysManagerVolatile.js +0 -51
- package/dist/esm/managers/GptPlatformApiKeysManagerVolatile.js.map +0 -1
- package/dist/esm/managers/GptResourcesManager.d.ts +0 -39
- package/dist/esm/managers/GptResourcesManager.js +0 -130
- package/dist/esm/managers/GptResourcesManager.js.map +0 -1
- package/dist/esm/managers/SelectorGenerator.d.ts +0 -8
- package/dist/esm/managers/SelectorGenerator.js +0 -15
- package/dist/esm/managers/SelectorGenerator.js.map +0 -1
- package/dist/esm/models/ElementSelectorForReplay.d.ts +0 -14
- package/dist/esm/models/ElementSelectorForReplay.js +0 -3
- package/dist/esm/models/ElementSelectorForReplay.js.map +0 -1
- package/dist/esm/models/GptResource.d.ts +0 -33
- package/dist/esm/models/GptResource.js +0 -3
- package/dist/esm/models/GptResource.js.map +0 -1
- package/dist/esm/persistence/AgentsPersistenceFilesystem.d.ts +0 -15
- package/dist/esm/persistence/AgentsPersistenceFilesystem.js +0 -48
- package/dist/esm/persistence/AgentsPersistenceFilesystem.js.map +0 -1
- package/dist/esm/persistence/GptConfigsPersistenceFilesystem.d.ts +0 -16
- package/dist/esm/persistence/GptConfigsPersistenceFilesystem.js +0 -54
- package/dist/esm/persistence/GptConfigsPersistenceFilesystem.js.map +0 -1
- package/dist/esm/persistence/GptResourcesPersistence.d.ts +0 -11
- package/dist/esm/persistence/GptResourcesPersistence.js +0 -3
- package/dist/esm/persistence/GptResourcesPersistence.js.map +0 -1
- package/dist/esm/persistence/GptResourcesPersistenceFilesystem.d.ts +0 -20
- package/dist/esm/persistence/GptResourcesPersistenceFilesystem.js +0 -79
- package/dist/esm/persistence/GptResourcesPersistenceFilesystem.js.map +0 -1
- package/dist/esm/persistence/GptResourcesPersistenceVolatile.d.ts +0 -14
- package/dist/esm/persistence/GptResourcesPersistenceVolatile.js +0 -32
- package/dist/esm/persistence/GptResourcesPersistenceVolatile.js.map +0 -1
- package/dist/esm/testfixtures.d.ts +0 -66
- package/dist/esm/testfixtures.js +0 -288
- package/dist/esm/testfixtures.js.map +0 -1
- package/dist/esm/tools/AssertTextVisibility.d.ts +0 -19
- package/dist/esm/tools/AssertTextVisibility.js +0 -32
- package/dist/esm/tools/AssertTextVisibility.js.map +0 -1
- package/dist/esm/tools/ClickButtonTool.d.ts +0 -14
- package/dist/esm/tools/ClickButtonTool.js +0 -36
- package/dist/esm/tools/ClickButtonTool.js.map +0 -1
- package/dist/esm/tools/NavigateToWebpageTool.d.ts +0 -20
- package/dist/esm/tools/NavigateToWebpageTool.js +0 -40
- package/dist/esm/tools/NavigateToWebpageTool.js.map +0 -1
- package/dist/esm/utils/DirectoryUtils.d.ts +0 -11
- package/dist/esm/utils/DirectoryUtils.js +0 -37
- package/dist/esm/utils/DirectoryUtils.js.map +0 -1
- package/dist/exceptions/GptResourceNotFoundException.d.ts +0 -8
- package/dist/exceptions/GptResourceNotFoundException.js +0 -16
- package/dist/exceptions/GptResourceNotFoundException.js.map +0 -1
- package/dist/managers/FlowsPersistence.d.ts +0 -79
- package/dist/managers/FlowsPersistence.js +0 -3
- package/dist/managers/FlowsPersistence.js.map +0 -1
- package/dist/managers/FlowsPersistenceAwsS3.d.ts +0 -48
- package/dist/managers/FlowsPersistenceAwsS3.js +0 -284
- package/dist/managers/FlowsPersistenceAwsS3.js.map +0 -1
- package/dist/managers/FlowsPersistenceFactory.d.ts +0 -9
- package/dist/managers/FlowsPersistenceFactory.js +0 -3
- package/dist/managers/FlowsPersistenceFactory.js.map +0 -1
- package/dist/managers/FlowsPersistenceFactoryImpl.d.ts +0 -57
- package/dist/managers/FlowsPersistenceFactoryImpl.js +0 -119
- package/dist/managers/FlowsPersistenceFactoryImpl.js.map +0 -1
- package/dist/managers/FlowsPersistenceFactoryPreset.d.ts +0 -12
- package/dist/managers/FlowsPersistenceFactoryPreset.js +0 -25
- package/dist/managers/FlowsPersistenceFactoryPreset.js.map +0 -1
- package/dist/managers/FlowsPersistenceFilesystem.d.ts +0 -33
- package/dist/managers/FlowsPersistenceFilesystem.js +0 -180
- package/dist/managers/FlowsPersistenceFilesystem.js.map +0 -1
- package/dist/managers/FlowsPersistenceGoogleCloudStorage.d.ts +0 -40
- package/dist/managers/FlowsPersistenceGoogleCloudStorage.js +0 -209
- package/dist/managers/FlowsPersistenceGoogleCloudStorage.js.map +0 -1
- package/dist/managers/FlowsPersistenceSupabase.d.ts +0 -33
- package/dist/managers/FlowsPersistenceSupabase.js +0 -152
- package/dist/managers/FlowsPersistenceSupabase.js.map +0 -1
- package/dist/managers/FlowsPersistenceVolatile.d.ts +0 -30
- package/dist/managers/FlowsPersistenceVolatile.js +0 -103
- package/dist/managers/FlowsPersistenceVolatile.js.map +0 -1
- package/dist/managers/GptPlatformApiKeysManager.d.ts +0 -36
- package/dist/managers/GptPlatformApiKeysManager.js +0 -3
- package/dist/managers/GptPlatformApiKeysManager.js.map +0 -1
- package/dist/managers/GptPlatformApiKeysManagerFilesystem.d.ts +0 -29
- package/dist/managers/GptPlatformApiKeysManagerFilesystem.js +0 -136
- package/dist/managers/GptPlatformApiKeysManagerFilesystem.js.map +0 -1
- package/dist/managers/GptPlatformApiKeysManagerVolatile.d.ts +0 -35
- package/dist/managers/GptPlatformApiKeysManagerVolatile.js +0 -51
- package/dist/managers/GptPlatformApiKeysManagerVolatile.js.map +0 -1
- package/dist/managers/GptResourcesManager.d.ts +0 -44
- package/dist/managers/GptResourcesManager.js +0 -180
- package/dist/managers/GptResourcesManager.js.map +0 -1
- package/dist/managers/SelectorGenerator.d.ts +0 -8
- package/dist/managers/SelectorGenerator.js +0 -15
- package/dist/managers/SelectorGenerator.js.map +0 -1
- package/dist/models/BaseToolParam.d.ts +0 -9
- package/dist/models/BaseToolParam.js +0 -3
- package/dist/models/BaseToolParam.js.map +0 -1
- package/dist/models/BaseToolParameters.d.ts +0 -9
- package/dist/models/BaseToolParameters.js +0 -3
- package/dist/models/BaseToolParameters.js.map +0 -1
- package/dist/models/DonobuAnnotated.d.ts +0 -23
- package/dist/models/DonobuAnnotated.js +0 -12
- package/dist/models/DonobuAnnotated.js.map +0 -1
- package/dist/models/ElementSelectorForReplay.d.ts +0 -14
- package/dist/models/ElementSelectorForReplay.js +0 -3
- package/dist/models/ElementSelectorForReplay.js.map +0 -1
- package/dist/models/GptResource.d.ts +0 -33
- package/dist/models/GptResource.js +0 -3
- package/dist/models/GptResource.js.map +0 -1
- package/dist/persistence/AgentsPersistenceFilesystem.d.ts +0 -15
- package/dist/persistence/AgentsPersistenceFilesystem.js +0 -48
- package/dist/persistence/AgentsPersistenceFilesystem.js.map +0 -1
- package/dist/persistence/GptConfigsPersistenceFilesystem.d.ts +0 -16
- package/dist/persistence/GptConfigsPersistenceFilesystem.js +0 -54
- package/dist/persistence/GptConfigsPersistenceFilesystem.js.map +0 -1
- package/dist/persistence/GptResourcesPersistence.d.ts +0 -11
- package/dist/persistence/GptResourcesPersistence.js +0 -3
- package/dist/persistence/GptResourcesPersistence.js.map +0 -1
- package/dist/persistence/GptResourcesPersistenceFilesystem.d.ts +0 -20
- package/dist/persistence/GptResourcesPersistenceFilesystem.js +0 -79
- package/dist/persistence/GptResourcesPersistenceFilesystem.js.map +0 -1
- package/dist/persistence/GptResourcesPersistenceVolatile.d.ts +0 -14
- package/dist/persistence/GptResourcesPersistenceVolatile.js +0 -32
- package/dist/persistence/GptResourcesPersistenceVolatile.js.map +0 -1
- package/dist/testfixtures.d.ts +0 -66
- package/dist/testfixtures.js +0 -288
- package/dist/testfixtures.js.map +0 -1
- package/dist/tools/AssertTextVisibility.d.ts +0 -19
- package/dist/tools/AssertTextVisibility.js +0 -32
- package/dist/tools/AssertTextVisibility.js.map +0 -1
- package/dist/tools/ClickButtonTool.d.ts +0 -14
- package/dist/tools/ClickButtonTool.js +0 -36
- package/dist/tools/ClickButtonTool.js.map +0 -1
- package/dist/tools/NavigateToWebpage.d.ts +0 -19
- package/dist/tools/NavigateToWebpage.js +0 -25
- package/dist/tools/NavigateToWebpage.js.map +0 -1
- package/dist/tools/NavigateToWebpageTool.d.ts +0 -20
- package/dist/tools/NavigateToWebpageTool.js +0 -40
- package/dist/tools/NavigateToWebpageTool.js.map +0 -1
- package/dist/utils/DirectoryUtils.d.ts +0 -11
- package/dist/utils/DirectoryUtils.js +0 -37
- package/dist/utils/DirectoryUtils.js.map +0 -1
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.FlowsPersistenceFilesystem = void 0;
|
|
7
|
-
const promises_1 = __importDefault(require("fs/promises"));
|
|
8
|
-
const path_1 = __importDefault(require("path"));
|
|
9
|
-
const FlowNotFoundException_1 = require("../exceptions/FlowNotFoundException");
|
|
10
|
-
const Logger_1 = require("../utils/Logger");
|
|
11
|
-
const JsonUtils_1 = require("../utils/JsonUtils");
|
|
12
|
-
/**
|
|
13
|
-
* A persistence implementation that uses the filesystem.
|
|
14
|
-
*/
|
|
15
|
-
class FlowsPersistenceFilesystem {
|
|
16
|
-
static METADATA_FILENAME = 'metadata.json';
|
|
17
|
-
static BROWSER_STATE_FILENAME = 'browserstate.json';
|
|
18
|
-
static SCREENSHOT_FILENAME_SUFFIX = '.screenshot.png';
|
|
19
|
-
static TOOL_CALL_FILENAME_SUFFIX = '.tool-call.json';
|
|
20
|
-
static VIDEO_FILENAME = 'video.webm';
|
|
21
|
-
flowsDirectory;
|
|
22
|
-
constructor(baseFlowsDirectory) {
|
|
23
|
-
this.flowsDirectory = path_1.default.join(baseFlowsDirectory, 'flows');
|
|
24
|
-
// Ensure directory exists
|
|
25
|
-
promises_1.default.mkdir(this.flowsDirectory, { recursive: true }).catch((err) => {
|
|
26
|
-
Logger_1.Logger.appLogger.error('Failed to create flows directory', err);
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
async saveMetadata(flowMetadata) {
|
|
30
|
-
const flowDir = this.getFlowDirectory(flowMetadata.id);
|
|
31
|
-
await promises_1.default.mkdir(flowDir, { recursive: true });
|
|
32
|
-
const filePath = path_1.default.join(flowDir, FlowsPersistenceFilesystem.METADATA_FILENAME);
|
|
33
|
-
await promises_1.default.writeFile(filePath, JSON.stringify(flowMetadata, null, 2));
|
|
34
|
-
}
|
|
35
|
-
async getMetadataByFlowId(flowId) {
|
|
36
|
-
const filePath = path_1.default.join(this.getFlowDirectory(flowId), FlowsPersistenceFilesystem.METADATA_FILENAME);
|
|
37
|
-
try {
|
|
38
|
-
const content = await promises_1.default.readFile(filePath, 'utf-8');
|
|
39
|
-
return JSON.parse(content);
|
|
40
|
-
}
|
|
41
|
-
catch (_e) {
|
|
42
|
-
throw FlowNotFoundException_1.FlowNotFoundException.forId(flowId);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
async getMetadataByFlowName(flowName) {
|
|
46
|
-
const flows = (await this.getFlows()).filter((flow) => flow.name === flowName);
|
|
47
|
-
if (flows.length > 0) {
|
|
48
|
-
return flows[0];
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
throw FlowNotFoundException_1.FlowNotFoundException.forName(flowName);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
async savePngScreenShot(flowId, bytes) {
|
|
55
|
-
const filename = `${new Date().toISOString()}${FlowsPersistenceFilesystem.SCREENSHOT_FILENAME_SUFFIX}`;
|
|
56
|
-
const screenShotPath = path_1.default.join(this.getFlowDirectory(flowId), filename);
|
|
57
|
-
await promises_1.default.writeFile(screenShotPath, bytes);
|
|
58
|
-
return filename;
|
|
59
|
-
}
|
|
60
|
-
async saveToolCall(flowId, toolCall) {
|
|
61
|
-
const filePath = path_1.default.join(this.getFlowDirectory(flowId), `${toolCall.startedAt}${FlowsPersistenceFilesystem.TOOL_CALL_FILENAME_SUFFIX}`);
|
|
62
|
-
await promises_1.default.writeFile(filePath, JSON.stringify(toolCall, null, 2));
|
|
63
|
-
}
|
|
64
|
-
async getToolCalls(flowId) {
|
|
65
|
-
const flowDir = this.getFlowDirectory(flowId);
|
|
66
|
-
try {
|
|
67
|
-
const files = await promises_1.default.readdir(flowDir);
|
|
68
|
-
const toolCallFiles = files.filter((file) => file.endsWith(FlowsPersistenceFilesystem.TOOL_CALL_FILENAME_SUFFIX));
|
|
69
|
-
const toolCalls = await Promise.all(toolCallFiles.sort().map(async (file) => {
|
|
70
|
-
const content = await promises_1.default.readFile(path_1.default.join(flowDir, file), 'utf-8');
|
|
71
|
-
return JSON.parse(content);
|
|
72
|
-
}));
|
|
73
|
-
return toolCalls.sort((a, b) => a.startedAt.localeCompare(b.startedAt));
|
|
74
|
-
}
|
|
75
|
-
catch (_e) {
|
|
76
|
-
throw FlowNotFoundException_1.FlowNotFoundException.forId(flowId);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
async getFlows() {
|
|
80
|
-
const flowDirs = await this.getAllFlowDirectories();
|
|
81
|
-
const metadataFiles = await Promise.all(flowDirs.map(async (dir) => {
|
|
82
|
-
try {
|
|
83
|
-
const content = await promises_1.default.readFile(path_1.default.join(dir, FlowsPersistenceFilesystem.METADATA_FILENAME), 'utf-8');
|
|
84
|
-
return JSON.parse(content);
|
|
85
|
-
}
|
|
86
|
-
catch {
|
|
87
|
-
return null;
|
|
88
|
-
}
|
|
89
|
-
}));
|
|
90
|
-
return metadataFiles.filter((metadata) => metadata !== null);
|
|
91
|
-
}
|
|
92
|
-
async setVideo(flowId, bytes) {
|
|
93
|
-
const videoPath = path_1.default.join(this.getFlowDirectory(flowId), FlowsPersistenceFilesystem.VIDEO_FILENAME);
|
|
94
|
-
await promises_1.default.writeFile(videoPath, bytes);
|
|
95
|
-
}
|
|
96
|
-
async getVideoSegment(flowId, startOffset, length) {
|
|
97
|
-
try {
|
|
98
|
-
await this.getMetadataByFlowId(flowId);
|
|
99
|
-
const videoPath = path_1.default.join(this.getFlowDirectory(flowId), FlowsPersistenceFilesystem.VIDEO_FILENAME);
|
|
100
|
-
const stats = await promises_1.default.stat(videoPath);
|
|
101
|
-
const totalLength = stats.size;
|
|
102
|
-
const adjustedLength = Math.min(length, totalLength - startOffset);
|
|
103
|
-
const buffer = Buffer.alloc(adjustedLength);
|
|
104
|
-
const fileHandle = await promises_1.default.open(videoPath, 'r');
|
|
105
|
-
try {
|
|
106
|
-
await fileHandle.read(buffer, 0, adjustedLength, startOffset);
|
|
107
|
-
return {
|
|
108
|
-
bytes: buffer,
|
|
109
|
-
totalLength: totalLength,
|
|
110
|
-
startOffset: startOffset,
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
finally {
|
|
114
|
-
await fileHandle.close();
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
catch {
|
|
118
|
-
return null;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
async getFlowFile(flowId, fileId) {
|
|
122
|
-
try {
|
|
123
|
-
await this.getMetadataByFlowId(flowId);
|
|
124
|
-
const filePath = path_1.default.join(this.getFlowDirectory(flowId), fileId);
|
|
125
|
-
return await promises_1.default.readFile(filePath);
|
|
126
|
-
}
|
|
127
|
-
catch {
|
|
128
|
-
return null;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
async setFlowFile(flowId, fileId, fileBytes) {
|
|
132
|
-
const filePath = path_1.default.join(this.getFlowDirectory(flowId), fileId);
|
|
133
|
-
await promises_1.default.writeFile(filePath, fileBytes);
|
|
134
|
-
}
|
|
135
|
-
async setBrowserState(flowId, browserState) {
|
|
136
|
-
const serializedBrowserState = Buffer.from(JSON.stringify(browserState), 'utf-8');
|
|
137
|
-
await this.setFlowFile(flowId, FlowsPersistenceFilesystem.BROWSER_STATE_FILENAME, serializedBrowserState);
|
|
138
|
-
}
|
|
139
|
-
async getBrowserState(flowId) {
|
|
140
|
-
const browserStateRaw = await this.getFlowFile(flowId, FlowsPersistenceFilesystem.BROWSER_STATE_FILENAME);
|
|
141
|
-
if (browserStateRaw) {
|
|
142
|
-
const browserState = JsonUtils_1.JsonUtils.jsonStringToJsonObject(browserStateRaw.toString('utf-8'));
|
|
143
|
-
if (browserState) {
|
|
144
|
-
return browserState;
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
throw new Error(`Cannot load malformed browser state from flow ${flowId}`);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
return null;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
async deleteFlow(flowId) {
|
|
155
|
-
const flowDirectory = this.getFlowDirectory(flowId);
|
|
156
|
-
await promises_1.default.rm(flowDirectory, { recursive: true, force: true });
|
|
157
|
-
}
|
|
158
|
-
getFlowDirectory(flowId) {
|
|
159
|
-
if (!flowId) {
|
|
160
|
-
throw FlowNotFoundException_1.FlowNotFoundException.forId(flowId);
|
|
161
|
-
}
|
|
162
|
-
return path_1.default.join(this.flowsDirectory, flowId);
|
|
163
|
-
}
|
|
164
|
-
async getAllFlowDirectories() {
|
|
165
|
-
try {
|
|
166
|
-
const entries = await promises_1.default.readdir(this.flowsDirectory, {
|
|
167
|
-
withFileTypes: true,
|
|
168
|
-
});
|
|
169
|
-
return entries
|
|
170
|
-
.filter((entry) => entry.isDirectory())
|
|
171
|
-
.map((entry) => path_1.default.join(this.flowsDirectory, entry.name));
|
|
172
|
-
}
|
|
173
|
-
catch (error) {
|
|
174
|
-
Logger_1.Logger.appLogger.error('Failed to find flow root directory', error);
|
|
175
|
-
throw error;
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
exports.FlowsPersistenceFilesystem = FlowsPersistenceFilesystem;
|
|
180
|
-
//# sourceMappingURL=FlowsPersistenceFilesystem.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FlowsPersistenceFilesystem.js","sourceRoot":"","sources":["../../src/managers/FlowsPersistenceFilesystem.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { FlowsPersistence } from './FlowsPersistence';
|
|
2
|
-
import { FlowMetadata } from '../models/FlowMetadata';
|
|
3
|
-
import { ToolCall } from '../models/ToolCall';
|
|
4
|
-
import { VideoSegment } from '../models/VideoSegment';
|
|
5
|
-
import { BrowserStorageState } from '../models/BrowserState';
|
|
6
|
-
/**
|
|
7
|
-
* A persistence implementation that uses Google Cloud Storage.
|
|
8
|
-
* If you are running locally, be sure to have the Google Cloud CLI installed
|
|
9
|
-
* so that you can authenticate using `gcloud auth init` before running Donobu.
|
|
10
|
-
* If Donobu is being run in the Google cloud, be sure that the service account
|
|
11
|
-
* in which it is being run has permissions to read and write the Google Cloud
|
|
12
|
-
* Storage bucket specified as a constructor argument.
|
|
13
|
-
*/
|
|
14
|
-
export declare class FlowsPersistenceGoogleCloudStorage implements FlowsPersistence {
|
|
15
|
-
private readonly bucket;
|
|
16
|
-
private static readonly METADATA_FILENAME;
|
|
17
|
-
private static readonly BROWSER_STATE_FILENAME;
|
|
18
|
-
private static readonly SCREENSHOT_FILENAME_SUFFIX;
|
|
19
|
-
private static readonly TOOL_CALL_FILENAME_SUFFIX;
|
|
20
|
-
private static readonly VIDEO_FILENAME;
|
|
21
|
-
static create(bucketName: string): Promise<FlowsPersistenceGoogleCloudStorage>;
|
|
22
|
-
private constructor();
|
|
23
|
-
saveMetadata(flowMetadata: FlowMetadata): Promise<void>;
|
|
24
|
-
getMetadataByFlowId(flowId: string): Promise<FlowMetadata>;
|
|
25
|
-
getMetadataByFlowName(flowName: string): Promise<FlowMetadata>;
|
|
26
|
-
savePngScreenShot(flowId: string, bytes: Buffer): Promise<string>;
|
|
27
|
-
saveToolCall(flowId: string, toolCall: ToolCall): Promise<void>;
|
|
28
|
-
getToolCalls(flowId: string): Promise<ToolCall[]>;
|
|
29
|
-
getFlows(): Promise<FlowMetadata[]>;
|
|
30
|
-
setVideo(flowId: string, bytes: Buffer): Promise<void>;
|
|
31
|
-
getVideoSegment(flowId: string, startOffset: number, length: number): Promise<VideoSegment | null>;
|
|
32
|
-
getFlowFile(flowId: string, fileId: string): Promise<Buffer | null>;
|
|
33
|
-
setFlowFile(flowId: string, fileId: string, fileBytes: Buffer): Promise<void>;
|
|
34
|
-
setBrowserState(flowId: string, browserState: BrowserStorageState): Promise<void>;
|
|
35
|
-
getBrowserState(flowId: string): Promise<BrowserStorageState | null>;
|
|
36
|
-
deleteFlow(flowId: string): Promise<void>;
|
|
37
|
-
private uploadString;
|
|
38
|
-
private uploadBytes;
|
|
39
|
-
private downloadString;
|
|
40
|
-
}
|
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.FlowsPersistenceGoogleCloudStorage = void 0;
|
|
4
|
-
const storage_1 = require("@google-cloud/storage");
|
|
5
|
-
const FlowNotFoundException_1 = require("../exceptions/FlowNotFoundException");
|
|
6
|
-
const Logger_1 = require("../utils/Logger");
|
|
7
|
-
const JsonUtils_1 = require("../utils/JsonUtils");
|
|
8
|
-
/**
|
|
9
|
-
* A persistence implementation that uses Google Cloud Storage.
|
|
10
|
-
* If you are running locally, be sure to have the Google Cloud CLI installed
|
|
11
|
-
* so that you can authenticate using `gcloud auth init` before running Donobu.
|
|
12
|
-
* If Donobu is being run in the Google cloud, be sure that the service account
|
|
13
|
-
* in which it is being run has permissions to read and write the Google Cloud
|
|
14
|
-
* Storage bucket specified as a constructor argument.
|
|
15
|
-
*/
|
|
16
|
-
class FlowsPersistenceGoogleCloudStorage {
|
|
17
|
-
bucket;
|
|
18
|
-
static METADATA_FILENAME = 'metadata.json';
|
|
19
|
-
static BROWSER_STATE_FILENAME = 'browserstate.json';
|
|
20
|
-
static SCREENSHOT_FILENAME_SUFFIX = '.screenshot.png';
|
|
21
|
-
static TOOL_CALL_FILENAME_SUFFIX = '.tool-call.json';
|
|
22
|
-
static VIDEO_FILENAME = 'video.webm';
|
|
23
|
-
static async create(bucketName) {
|
|
24
|
-
const storage = new storage_1.Storage();
|
|
25
|
-
const bucket = storage.bucket(bucketName);
|
|
26
|
-
return bucket
|
|
27
|
-
.exists()
|
|
28
|
-
.then(([exists]) => {
|
|
29
|
-
if (!exists) {
|
|
30
|
-
throw new Error(`Bucket ${bucketName} does not exist.`);
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
return bucket;
|
|
34
|
-
}
|
|
35
|
-
})
|
|
36
|
-
.then((bucket) => {
|
|
37
|
-
return new FlowsPersistenceGoogleCloudStorage(bucket);
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
constructor(bucket) {
|
|
41
|
-
this.bucket = bucket;
|
|
42
|
-
}
|
|
43
|
-
async saveMetadata(flowMetadata) {
|
|
44
|
-
const objectName = `${flowMetadata.id}/${FlowsPersistenceGoogleCloudStorage.METADATA_FILENAME}`;
|
|
45
|
-
await this.uploadString(objectName, JSON.stringify(flowMetadata), 'application/json');
|
|
46
|
-
}
|
|
47
|
-
async getMetadataByFlowId(flowId) {
|
|
48
|
-
const objectName = `${flowId}/${FlowsPersistenceGoogleCloudStorage.METADATA_FILENAME}`;
|
|
49
|
-
const jsonData = await this.downloadString(objectName);
|
|
50
|
-
if (!jsonData) {
|
|
51
|
-
throw FlowNotFoundException_1.FlowNotFoundException.forId(flowId);
|
|
52
|
-
}
|
|
53
|
-
return JSON.parse(jsonData);
|
|
54
|
-
}
|
|
55
|
-
async getMetadataByFlowName(flowName) {
|
|
56
|
-
const flows = (await this.getFlows()).filter((flow) => flow.name === flowName);
|
|
57
|
-
if (flows.length > 0) {
|
|
58
|
-
return flows[0];
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
throw FlowNotFoundException_1.FlowNotFoundException.forName(flowName);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
async savePngScreenShot(flowId, bytes) {
|
|
65
|
-
const filename = `${new Date().toISOString()}${FlowsPersistenceGoogleCloudStorage.SCREENSHOT_FILENAME_SUFFIX}`;
|
|
66
|
-
const objectName = `${flowId}/${filename}`;
|
|
67
|
-
await this.uploadBytes(objectName, bytes, 'image/png');
|
|
68
|
-
return filename;
|
|
69
|
-
}
|
|
70
|
-
async saveToolCall(flowId, toolCall) {
|
|
71
|
-
const filename = `${toolCall.startedAt}${FlowsPersistenceGoogleCloudStorage.TOOL_CALL_FILENAME_SUFFIX}`;
|
|
72
|
-
const objectName = `${flowId}/${filename}`;
|
|
73
|
-
await this.uploadString(objectName, JSON.stringify(toolCall), 'application/json');
|
|
74
|
-
}
|
|
75
|
-
async getToolCalls(flowId) {
|
|
76
|
-
const prefix = `${flowId}/`;
|
|
77
|
-
const [files] = await this.bucket.getFiles({ prefix });
|
|
78
|
-
const toolCalls = [];
|
|
79
|
-
for (const file of files) {
|
|
80
|
-
if (file.name.endsWith(FlowsPersistenceGoogleCloudStorage.TOOL_CALL_FILENAME_SUFFIX)) {
|
|
81
|
-
const [content] = await file.download();
|
|
82
|
-
const toolCall = JSON.parse(content.toString());
|
|
83
|
-
toolCalls.push(toolCall);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
if (toolCalls.length === 0) {
|
|
87
|
-
throw FlowNotFoundException_1.FlowNotFoundException.forId(flowId);
|
|
88
|
-
}
|
|
89
|
-
return toolCalls.sort((a, b) => a.startedAt.localeCompare(b.startedAt));
|
|
90
|
-
}
|
|
91
|
-
async getFlows() {
|
|
92
|
-
const [files] = await this.bucket.getFiles();
|
|
93
|
-
const flowIds = new Set();
|
|
94
|
-
for (const file of files) {
|
|
95
|
-
if (file.name.endsWith(`/${FlowsPersistenceGoogleCloudStorage.METADATA_FILENAME}`)) {
|
|
96
|
-
const flowId = file.name.substring(0, file.name.indexOf('/'));
|
|
97
|
-
flowIds.add(flowId);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
const flows = [];
|
|
101
|
-
for (const flowId of flowIds) {
|
|
102
|
-
try {
|
|
103
|
-
flows.push(await this.getMetadataByFlowId(flowId));
|
|
104
|
-
}
|
|
105
|
-
catch (e) {
|
|
106
|
-
Logger_1.Logger.appLogger.warn(`Flow not found: ${flowId}`, e);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
return flows;
|
|
110
|
-
}
|
|
111
|
-
async setVideo(flowId, bytes) {
|
|
112
|
-
const objectName = `${flowId}/${FlowsPersistenceGoogleCloudStorage.VIDEO_FILENAME}`;
|
|
113
|
-
await this.uploadBytes(objectName, bytes, 'video/webm');
|
|
114
|
-
}
|
|
115
|
-
async getVideoSegment(flowId, startOffset, length) {
|
|
116
|
-
const objectName = `${flowId}/${FlowsPersistenceGoogleCloudStorage.VIDEO_FILENAME}`;
|
|
117
|
-
const file = this.bucket.file(objectName);
|
|
118
|
-
const [exists] = await file.exists();
|
|
119
|
-
if (!exists) {
|
|
120
|
-
return null;
|
|
121
|
-
}
|
|
122
|
-
const [metadata] = await file.getMetadata();
|
|
123
|
-
const totalLength = Number(metadata.size);
|
|
124
|
-
const adjustedLength = Math.min(length, totalLength - startOffset);
|
|
125
|
-
if (adjustedLength <= 0) {
|
|
126
|
-
return null;
|
|
127
|
-
}
|
|
128
|
-
try {
|
|
129
|
-
const [content] = await file.download({
|
|
130
|
-
start: startOffset,
|
|
131
|
-
end: startOffset + adjustedLength - 1,
|
|
132
|
-
});
|
|
133
|
-
return {
|
|
134
|
-
bytes: content,
|
|
135
|
-
totalLength: totalLength,
|
|
136
|
-
startOffset: startOffset,
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
catch (e) {
|
|
140
|
-
Logger_1.Logger.appLogger.error(`Error reading video segment for flowId ${flowId}: ${e}`);
|
|
141
|
-
return null;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
async getFlowFile(flowId, fileId) {
|
|
145
|
-
const objectName = `${flowId}/${fileId}`;
|
|
146
|
-
const file = this.bucket.file(objectName);
|
|
147
|
-
const [exists] = await file.exists();
|
|
148
|
-
if (!exists) {
|
|
149
|
-
return null;
|
|
150
|
-
}
|
|
151
|
-
const [content] = await file.download();
|
|
152
|
-
return content;
|
|
153
|
-
}
|
|
154
|
-
async setFlowFile(flowId, fileId, fileBytes) {
|
|
155
|
-
const objectName = `${flowId}/${fileId}`;
|
|
156
|
-
await this.uploadBytes(objectName, fileBytes, 'application/octet-stream');
|
|
157
|
-
}
|
|
158
|
-
async setBrowserState(flowId, browserState) {
|
|
159
|
-
const serializedBrowserState = Buffer.from(JSON.stringify(browserState), 'utf-8');
|
|
160
|
-
await this.setFlowFile(flowId, FlowsPersistenceGoogleCloudStorage.BROWSER_STATE_FILENAME, serializedBrowserState);
|
|
161
|
-
}
|
|
162
|
-
async getBrowserState(flowId) {
|
|
163
|
-
const browserStateRaw = await this.getFlowFile(flowId, FlowsPersistenceGoogleCloudStorage.BROWSER_STATE_FILENAME);
|
|
164
|
-
if (browserStateRaw) {
|
|
165
|
-
const browserState = JsonUtils_1.JsonUtils.jsonStringToJsonObject(browserStateRaw.toString('utf-8'));
|
|
166
|
-
if (browserState) {
|
|
167
|
-
return browserState;
|
|
168
|
-
}
|
|
169
|
-
else {
|
|
170
|
-
throw new Error(`Cannot load malformed browser state from flow ${flowId}`);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
return null;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
async deleteFlow(flowId) {
|
|
178
|
-
const prefix = `${flowId}/`;
|
|
179
|
-
const [files] = await this.bucket.getFiles({ prefix });
|
|
180
|
-
if (files.length > 0) {
|
|
181
|
-
await Promise.all(files.map((file) => file.delete()));
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
async uploadString(objectName, data, contentType) {
|
|
185
|
-
const file = this.bucket.file(objectName);
|
|
186
|
-
await file.save(data, {
|
|
187
|
-
contentType,
|
|
188
|
-
metadata: { contentType },
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
async uploadBytes(objectName, bytes, contentType) {
|
|
192
|
-
const file = this.bucket.file(objectName);
|
|
193
|
-
await file.save(bytes, {
|
|
194
|
-
contentType,
|
|
195
|
-
metadata: { contentType },
|
|
196
|
-
});
|
|
197
|
-
}
|
|
198
|
-
async downloadString(objectName) {
|
|
199
|
-
const file = this.bucket.file(objectName);
|
|
200
|
-
const [exists] = await file.exists();
|
|
201
|
-
if (!exists) {
|
|
202
|
-
return null;
|
|
203
|
-
}
|
|
204
|
-
const [content] = await file.download();
|
|
205
|
-
return content.toString();
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
exports.FlowsPersistenceGoogleCloudStorage = FlowsPersistenceGoogleCloudStorage;
|
|
209
|
-
//# sourceMappingURL=FlowsPersistenceGoogleCloudStorage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FlowsPersistenceGoogleCloudStorage.js","sourceRoot":"","sources":["../../src/managers/FlowsPersistenceGoogleCloudStorage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { FlowMetadata } from '../models/FlowMetadata';
|
|
2
|
-
import { ToolCall } from '../models/ToolCall';
|
|
3
|
-
import { VideoSegment } from '../models/VideoSegment';
|
|
4
|
-
import { FlowsPersistence } from './FlowsPersistence';
|
|
5
|
-
import { SupabaseClient } from '../clients/SupabaseClient';
|
|
6
|
-
import { BrowserStorageState } from '../models/BrowserState';
|
|
7
|
-
/**
|
|
8
|
-
* A persistence implementation that uses Supabase for storage via
|
|
9
|
-
* its PostgREST endpoints. This implementation assumes that row-Level Security (RLS) is enabled and
|
|
10
|
-
* enforced by Supabase.
|
|
11
|
-
*/
|
|
12
|
-
export declare class FlowsPersistenceSupabase implements FlowsPersistence {
|
|
13
|
-
private readonly supabaseHttpClient;
|
|
14
|
-
private static readonly FLOW_METADATA_TABLE;
|
|
15
|
-
private static readonly BROWSER_STATE_FILENAME;
|
|
16
|
-
private static readonly TOOL_CALLS_TABLE;
|
|
17
|
-
private static readonly FLOW_FILES_TABLE;
|
|
18
|
-
constructor(supabaseHttpClient: SupabaseClient);
|
|
19
|
-
saveMetadata(flowMetadata: FlowMetadata): Promise<void>;
|
|
20
|
-
getMetadataByFlowId(flowId: string): Promise<FlowMetadata>;
|
|
21
|
-
getMetadataByFlowName(flowName: string): Promise<FlowMetadata>;
|
|
22
|
-
savePngScreenShot(flowId: string, bytes: Buffer): Promise<string>;
|
|
23
|
-
saveToolCall(flowId: string, toolCall: ToolCall): Promise<void>;
|
|
24
|
-
getToolCalls(flowId: string): Promise<ToolCall[]>;
|
|
25
|
-
getFlows(): Promise<FlowMetadata[]>;
|
|
26
|
-
setVideo(flowId: string, bytes: Buffer): Promise<void>;
|
|
27
|
-
getVideoSegment(flowId: string, startOffset: number, length: number): Promise<VideoSegment | null>;
|
|
28
|
-
getFlowFile(flowId: string, fileId: string): Promise<Buffer | null>;
|
|
29
|
-
setFlowFile(flowId: string, fileId: string, fileBytes: Buffer): Promise<void>;
|
|
30
|
-
setBrowserState(flowId: string, browserState: BrowserStorageState): Promise<void>;
|
|
31
|
-
getBrowserState(flowId: string): Promise<BrowserStorageState | null>;
|
|
32
|
-
deleteFlow(flowId: string): Promise<void>;
|
|
33
|
-
}
|
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.FlowsPersistenceSupabase = void 0;
|
|
4
|
-
const FlowNotFoundException_1 = require("../exceptions/FlowNotFoundException");
|
|
5
|
-
const JsonUtils_1 = require("../utils/JsonUtils");
|
|
6
|
-
/**
|
|
7
|
-
* A persistence implementation that uses Supabase for storage via
|
|
8
|
-
* its PostgREST endpoints. This implementation assumes that row-Level Security (RLS) is enabled and
|
|
9
|
-
* enforced by Supabase.
|
|
10
|
-
*/
|
|
11
|
-
class FlowsPersistenceSupabase {
|
|
12
|
-
supabaseHttpClient;
|
|
13
|
-
static FLOW_METADATA_TABLE = 'flowmetadatav1';
|
|
14
|
-
static BROWSER_STATE_FILENAME = 'browserstate.json';
|
|
15
|
-
static TOOL_CALLS_TABLE = 'toolcallsv1';
|
|
16
|
-
static FLOW_FILES_TABLE = 'flowfilesv1';
|
|
17
|
-
constructor(supabaseHttpClient) {
|
|
18
|
-
this.supabaseHttpClient = supabaseHttpClient;
|
|
19
|
-
}
|
|
20
|
-
async saveMetadata(flowMetadata) {
|
|
21
|
-
const startedAtEpochMs = flowMetadata.startedAt
|
|
22
|
-
? new Date(flowMetadata.startedAt).getTime()
|
|
23
|
-
: new Date().getTime();
|
|
24
|
-
const root = {
|
|
25
|
-
id: flowMetadata.id,
|
|
26
|
-
startedat: startedAtEpochMs,
|
|
27
|
-
jsonrecord: flowMetadata,
|
|
28
|
-
};
|
|
29
|
-
await this.supabaseHttpClient.executeMethod(`rest/v1/${FlowsPersistenceSupabase.FLOW_METADATA_TABLE}?on_conflict=id`, 'POST', JSON.stringify(root));
|
|
30
|
-
}
|
|
31
|
-
async getMetadataByFlowId(flowId) {
|
|
32
|
-
const response = await this.supabaseHttpClient.executeGet(`rest/v1/${FlowsPersistenceSupabase.FLOW_METADATA_TABLE}?id=eq.${flowId}`);
|
|
33
|
-
if (!response) {
|
|
34
|
-
throw FlowNotFoundException_1.FlowNotFoundException.forId(flowId);
|
|
35
|
-
}
|
|
36
|
-
const records = JSON.parse(response);
|
|
37
|
-
if (records.length === 0) {
|
|
38
|
-
throw FlowNotFoundException_1.FlowNotFoundException.forId(flowId);
|
|
39
|
-
}
|
|
40
|
-
return records[0].jsonrecord;
|
|
41
|
-
}
|
|
42
|
-
async getMetadataByFlowName(flowName) {
|
|
43
|
-
const flows = (await this.getFlows()).filter((flow) => flow.name === flowName);
|
|
44
|
-
if (flows.length > 0) {
|
|
45
|
-
return flows[0];
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
throw FlowNotFoundException_1.FlowNotFoundException.forName(flowName);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
async savePngScreenShot(flowId, bytes) {
|
|
52
|
-
const fileId = `${new Date().toISOString()}.screenshot.png`;
|
|
53
|
-
await this.setFlowFile(flowId, fileId, bytes);
|
|
54
|
-
return fileId;
|
|
55
|
-
}
|
|
56
|
-
async saveToolCall(flowId, toolCall) {
|
|
57
|
-
const startedAtEpochMs = new Date(toolCall.startedAt).getTime();
|
|
58
|
-
const root = {
|
|
59
|
-
id: toolCall.id,
|
|
60
|
-
flowid: flowId,
|
|
61
|
-
startedat: startedAtEpochMs,
|
|
62
|
-
jsonrecord: toolCall,
|
|
63
|
-
};
|
|
64
|
-
await this.supabaseHttpClient.executeMethod(`rest/v1/${FlowsPersistenceSupabase.TOOL_CALLS_TABLE}`, 'POST', JSON.stringify(root));
|
|
65
|
-
}
|
|
66
|
-
async getToolCalls(flowId) {
|
|
67
|
-
const response = await this.supabaseHttpClient.executeGet(`rest/v1/${FlowsPersistenceSupabase.TOOL_CALLS_TABLE}?flowid=eq.${flowId}`);
|
|
68
|
-
if (!response) {
|
|
69
|
-
await this.getMetadataByFlowId(flowId); // Verify flow exists
|
|
70
|
-
return [];
|
|
71
|
-
}
|
|
72
|
-
const records = JSON.parse(response);
|
|
73
|
-
const toolCalls = records
|
|
74
|
-
.map((record) => record.jsonrecord)
|
|
75
|
-
.sort((a, b) => new Date(a.startedAt).getTime() - new Date(b.startedAt).getTime());
|
|
76
|
-
return toolCalls;
|
|
77
|
-
}
|
|
78
|
-
async getFlows() {
|
|
79
|
-
const response = await this.supabaseHttpClient.executeGet(`rest/v1/${FlowsPersistenceSupabase.FLOW_METADATA_TABLE}`);
|
|
80
|
-
if (!response) {
|
|
81
|
-
return [];
|
|
82
|
-
}
|
|
83
|
-
const records = JSON.parse(response);
|
|
84
|
-
return records.map((record) => record.jsonrecord);
|
|
85
|
-
}
|
|
86
|
-
async setVideo(flowId, bytes) {
|
|
87
|
-
await this.setFlowFile(flowId, 'video.webm', bytes);
|
|
88
|
-
}
|
|
89
|
-
async getVideoSegment(flowId, startOffset, length) {
|
|
90
|
-
const video = await this.getFlowFile(flowId, 'video.webm');
|
|
91
|
-
if (!video) {
|
|
92
|
-
return null;
|
|
93
|
-
}
|
|
94
|
-
const totalLength = video.length;
|
|
95
|
-
const adjustedLength = Math.min(length, totalLength - startOffset);
|
|
96
|
-
if (adjustedLength <= 0) {
|
|
97
|
-
return null;
|
|
98
|
-
}
|
|
99
|
-
const segment = video.subarray(startOffset, startOffset + adjustedLength);
|
|
100
|
-
return {
|
|
101
|
-
bytes: segment,
|
|
102
|
-
totalLength: totalLength,
|
|
103
|
-
startOffset: startOffset,
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
async getFlowFile(flowId, fileId) {
|
|
107
|
-
const response = await this.supabaseHttpClient.executeGet(`rest/v1/${FlowsPersistenceSupabase.FLOW_FILES_TABLE}?flowid=eq.${flowId}&id=eq.${encodeURIComponent(fileId)}&select=data`);
|
|
108
|
-
if (!response) {
|
|
109
|
-
await this.getMetadataByFlowId(flowId); // Verify flow exists
|
|
110
|
-
return null;
|
|
111
|
-
}
|
|
112
|
-
const records = JSON.parse(response);
|
|
113
|
-
if (records.length === 0) {
|
|
114
|
-
return null;
|
|
115
|
-
}
|
|
116
|
-
return Buffer.from(records[0].data, 'base64');
|
|
117
|
-
}
|
|
118
|
-
async setFlowFile(flowId, fileId, fileBytes) {
|
|
119
|
-
const root = {
|
|
120
|
-
id: fileId,
|
|
121
|
-
flowid: flowId,
|
|
122
|
-
data: fileBytes.toString('base64'),
|
|
123
|
-
};
|
|
124
|
-
await this.supabaseHttpClient.executeMethod(`rest/v1/${FlowsPersistenceSupabase.FLOW_FILES_TABLE}?on_conflict=id`, 'POST', JSON.stringify(root));
|
|
125
|
-
}
|
|
126
|
-
async setBrowserState(flowId, browserState) {
|
|
127
|
-
const serializedBrowserState = Buffer.from(JSON.stringify(browserState), 'utf-8');
|
|
128
|
-
await this.setFlowFile(flowId, FlowsPersistenceSupabase.BROWSER_STATE_FILENAME, serializedBrowserState);
|
|
129
|
-
}
|
|
130
|
-
async getBrowserState(flowId) {
|
|
131
|
-
const browserStateRaw = await this.getFlowFile(flowId, FlowsPersistenceSupabase.BROWSER_STATE_FILENAME);
|
|
132
|
-
if (browserStateRaw) {
|
|
133
|
-
const browserState = JsonUtils_1.JsonUtils.jsonStringToJsonObject(browserStateRaw.toString('utf-8'));
|
|
134
|
-
if (browserState) {
|
|
135
|
-
return browserState;
|
|
136
|
-
}
|
|
137
|
-
else {
|
|
138
|
-
throw new Error(`Cannot load malformed browser state from flow ${flowId}`);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
return null;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
async deleteFlow(flowId) {
|
|
146
|
-
await this.supabaseHttpClient.executeMethod(`rest/v1/${FlowsPersistenceSupabase.TOOL_CALLS_TABLE}?flowid=eq.${flowId}`, 'DELETE');
|
|
147
|
-
await this.supabaseHttpClient.executeMethod(`rest/v1/${FlowsPersistenceSupabase.FLOW_FILES_TABLE}?flowid=eq.${flowId}`, 'DELETE');
|
|
148
|
-
await this.supabaseHttpClient.executeMethod(`rest/v1/${FlowsPersistenceSupabase.FLOW_METADATA_TABLE}?id=eq.${flowId}`, 'DELETE');
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
exports.FlowsPersistenceSupabase = FlowsPersistenceSupabase;
|
|
152
|
-
//# sourceMappingURL=FlowsPersistenceSupabase.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FlowsPersistenceSupabase.js","sourceRoot":"","sources":["../../src/managers/FlowsPersistenceSupabase.ts"],"names":[],"mappings":"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"}
|