donobu
Version:
Create browser automations with an LLM agent and replay them as Playwright scripts.
189 lines • 12.7 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TargetRuntimePluginRegistry = exports.PersistencePluginRegistry = exports.shutdownFileUploadWorkers = exports.getFileUploadAggregateStatus = exports.createDefaultToolRegistry = exports.ToolManager = exports.PluginLoader = exports.InteractionVisualizer = exports.setupDonobuStack = exports.prepareToolCallsForRerun = exports.DonobuFlowsManager = exports.distillAllowedEnvVariableNames = exports.DonobuFlow = exports.AdminApiController = exports.env = exports.VercelAiGptClient = exports.OpenAiGptClient = exports.GptClientPluginRegistry = exports.GptClient = exports.GoogleGenerativeAiGptClient = exports.fixAssertFields = exports.DonobuGptClient = exports.AnthropicGptClient = void 0;
exports.startDonobuServer = startDonobuServer;
const commander_1 = require("commander");
const v4_1 = require("zod/v4");
const envVars_1 = require("./envVars");
const init_1 = require("./init");
const AdminApiController_1 = require("./managers/AdminApiController");
const ControlPanel_1 = require("./models/ControlPanel");
const Logger_1 = require("./utils/Logger");
const PlaywrightUtils_1 = require("./utils/PlaywrightUtils");
var AnthropicGptClient_1 = require("./clients/AnthropicGptClient");
Object.defineProperty(exports, "AnthropicGptClient", { enumerable: true, get: function () { return AnthropicGptClient_1.AnthropicGptClient; } });
var DonobuGptClient_1 = require("./clients/DonobuGptClient");
Object.defineProperty(exports, "DonobuGptClient", { enumerable: true, get: function () { return DonobuGptClient_1.DonobuGptClient; } });
var GoogleGenerativeAiGptClient_1 = require("./clients/GoogleGenerativeAiGptClient");
Object.defineProperty(exports, "fixAssertFields", { enumerable: true, get: function () { return GoogleGenerativeAiGptClient_1.fixAssertFields; } });
Object.defineProperty(exports, "GoogleGenerativeAiGptClient", { enumerable: true, get: function () { return GoogleGenerativeAiGptClient_1.GoogleGenerativeAiGptClient; } });
var GptClient_1 = require("./clients/GptClient");
Object.defineProperty(exports, "GptClient", { enumerable: true, get: function () { return GptClient_1.GptClient; } });
var GptClientPlugin_1 = require("./clients/GptClientPlugin");
Object.defineProperty(exports, "GptClientPluginRegistry", { enumerable: true, get: function () { return GptClientPlugin_1.GptClientPluginRegistry; } });
var OpenAiGptClient_1 = require("./clients/OpenAiGptClient");
Object.defineProperty(exports, "OpenAiGptClient", { enumerable: true, get: function () { return OpenAiGptClient_1.OpenAiGptClient; } });
var VercelAiGptClient_1 = require("./clients/VercelAiGptClient");
Object.defineProperty(exports, "VercelAiGptClient", { enumerable: true, get: function () { return VercelAiGptClient_1.VercelAiGptClient; } });
var envVars_2 = require("./envVars");
Object.defineProperty(exports, "env", { enumerable: true, get: function () { return envVars_2.env; } });
__exportStar(require("./exceptions/DonobuException"), exports);
__exportStar(require("./exceptions/FlowIdCollisionException"), exports);
__exportStar(require("./exceptions/FlowNotFoundException"), exports);
__exportStar(require("./exceptions/GptApiKeysNotSetupException"), exports);
__exportStar(require("./exceptions/GptPlatformAuthenticationFailedException"), exports);
__exportStar(require("./exceptions/InvalidParamValueException"), exports);
__exportStar(require("./exceptions/ToolCallFailedException"), exports);
__exportStar(require("./lib/ai/cache/cache"), exports);
__exportStar(require("./lib/ai/cache/cacheLocator"), exports);
__exportStar(require("./lib/page/extendPage"), exports);
__exportStar(require("./lib/test/fixtures/browserState"), exports);
__exportStar(require("./lib/test/fixtures/gptClients"), exports);
__exportStar(require("./lib/test/testExtension"), exports);
__exportStar(require("./lib/test/utils/donobuTestStack"), exports);
var AdminApiController_2 = require("./managers/AdminApiController");
Object.defineProperty(exports, "AdminApiController", { enumerable: true, get: function () { return AdminApiController_2.AdminApiController; } });
var DonobuFlow_1 = require("./managers/DonobuFlow");
Object.defineProperty(exports, "DonobuFlow", { enumerable: true, get: function () { return DonobuFlow_1.DonobuFlow; } });
var DonobuFlowsManager_1 = require("./managers/DonobuFlowsManager");
Object.defineProperty(exports, "distillAllowedEnvVariableNames", { enumerable: true, get: function () { return DonobuFlowsManager_1.distillAllowedEnvVariableNames; } });
Object.defineProperty(exports, "DonobuFlowsManager", { enumerable: true, get: function () { return DonobuFlowsManager_1.DonobuFlowsManager; } });
Object.defineProperty(exports, "prepareToolCallsForRerun", { enumerable: true, get: function () { return DonobuFlowsManager_1.prepareToolCallsForRerun; } });
var DonobuStack_1 = require("./managers/DonobuStack");
Object.defineProperty(exports, "setupDonobuStack", { enumerable: true, get: function () { return DonobuStack_1.setupDonobuStack; } });
var InteractionVisualizer_1 = require("./managers/InteractionVisualizer");
Object.defineProperty(exports, "InteractionVisualizer", { enumerable: true, get: function () { return InteractionVisualizer_1.InteractionVisualizer; } });
var PluginLoader_1 = require("./managers/PluginLoader");
Object.defineProperty(exports, "PluginLoader", { enumerable: true, get: function () { return PluginLoader_1.PluginLoader; } });
var ToolManager_1 = require("./managers/ToolManager");
Object.defineProperty(exports, "ToolManager", { enumerable: true, get: function () { return ToolManager_1.ToolManager; } });
var ToolRegistry_1 = require("./managers/ToolRegistry");
Object.defineProperty(exports, "createDefaultToolRegistry", { enumerable: true, get: function () { return ToolRegistry_1.createDefaultToolRegistry; } });
__exportStar(require("./managers/WebTargetInspector"), exports);
__exportStar(require("./models/BrowserStorageState"), exports);
__exportStar(require("./models/CodeGenerationOptions"), exports);
__exportStar(require("./models/ControlPanel"), exports);
__exportStar(require("./models/CreateDonobuFlow"), exports);
__exportStar(require("./models/FlowMetadata"), exports);
__exportStar(require("./models/InteractableElement"), exports);
__exportStar(require("./models/ProposedToolCall"), exports);
__exportStar(require("./models/Provenance"), exports);
__exportStar(require("./models/RunConfig"), exports);
__exportStar(require("./models/SuiteMetadata"), exports);
__exportStar(require("./models/TargetConfig"), exports);
__exportStar(require("./models/TestMetadata"), exports);
__exportStar(require("./models/ToolCallResult"), exports);
__exportStar(require("./models/ToolSchema"), exports);
var fileUploadWorkerRegistry_1 = require("./persistence/files/fileUploadWorkerRegistry");
Object.defineProperty(exports, "getFileUploadAggregateStatus", { enumerable: true, get: function () { return fileUploadWorkerRegistry_1.getFileUploadAggregateStatus; } });
Object.defineProperty(exports, "shutdownFileUploadWorkers", { enumerable: true, get: function () { return fileUploadWorkerRegistry_1.shutdownFileUploadWorkers; } });
var PersistencePlugin_1 = require("./persistence/PersistencePlugin");
Object.defineProperty(exports, "PersistencePluginRegistry", { enumerable: true, get: function () { return PersistencePlugin_1.PersistencePluginRegistry; } });
var TargetRuntimePlugin_1 = require("./targets/TargetRuntimePlugin");
Object.defineProperty(exports, "TargetRuntimePluginRegistry", { enumerable: true, get: function () { return TargetRuntimePlugin_1.TargetRuntimePluginRegistry; } });
__exportStar(require("./tools/ReplayableInteraction"), exports);
__exportStar(require("./tools/Tool"), exports);
__exportStar(require("./utils/buildProvenance"), exports);
__exportStar(require("./utils/createTool"), exports);
__exportStar(require("./utils/FlowLogBuffer"), exports);
__exportStar(require("./utils/JsonSchemaUtils"), exports);
__exportStar(require("./utils/JsonUtils"), exports);
__exportStar(require("./utils/Logger"), exports);
__exportStar(require("./utils/MiscUtils"), exports);
__exportStar(require("./utils/PlaywrightUtils"), exports);
__exportStar(require("./utils/TargetUtils"), exports);
const DEFAULT_PORT = 31000;
/**
* Starts a Donobu API server at the given port. The server assumes that the
* Playwright browsers have been installed.
*/
async function startDonobuServer({ port = DEFAULT_PORT, controlPanelHost = ControlPanel_1.NoOpControlPanelFactory, environ = envVars_1.env.pick('ANTHROPIC_API_KEY', 'ANTHROPIC_MODEL_NAME', 'AWS_ACCESS_KEY_ID', 'AWS_BEDROCK_MODEL_NAME', 'AWS_SECRET_ACCESS_KEY', 'BASE64_GPT_CONFIG', 'BROWSERBASE_API_KEY', 'BROWSERBASE_PROJECT_ID', 'DONOBU_DEPLOYMENT_ENVIRONMENT', 'DONOBU_API_BASE_URL', 'DONOBU_API_KEY', 'DONOBU_PERSISTENCE_API_KEY', 'GOOGLE_GENERATIVE_AI_API_KEY', 'GOOGLE_GENERATIVE_AI_MODEL_NAME', 'OLLAMA_API_URL', 'OLLAMA_MODEL_NAME', 'OPENAI_API_KEY', 'OPENAI_API_MODEL_NAME', 'PERSISTENCE_PRIORITY'), } = {}) {
try {
const adminController = await AdminApiController_1.AdminApiController.create(environ.data.DONOBU_DEPLOYMENT_ENVIRONMENT ?? 'LOCAL', controlPanelHost, environ);
await adminController.start(port);
Logger_1.appLogger.info(`Donobu API server available on http://localhost:${port}`);
// Keep the process running until a process signal is detected.
await new Promise((resolve) => {
/**
* System signals that trigger graceful application shutdown.
*
* - SIGTERM: Termination request (typically from process managers like PM2, Docker)
* - SIGINT: Interrupt signal (typically Ctrl+C from terminal)
* - SIGHUP: Hangup signal (typically when terminal session ends)
*
* @see {@link https://nodejs.org/api/process.html#signal-events}
*/
['SIGTERM', 'SIGINT', 'SIGHUP'].forEach((signal) => {
process.on(signal, () => {
Logger_1.appLogger.info(`Received ${signal}, shutting down...`);
void adminController.stop().finally(resolve);
});
});
});
}
catch (e) {
Logger_1.appLogger.error('Exception while running server', e);
process.exit(1);
}
}
/**
* Starts the program, either ensures that the Playwright browsers are installed
* or starts the API server.
*/
async function main(args) {
const options = new commander_1.Command()
.addOption(new commander_1.Option('--port <number>', 'The port to run the API on.')
.default(DEFAULT_PORT)
.argParser((v) => {
const parsedPort = v4_1.z.coerce
.number()
.int()
.min(1)
.max(65535)
.safeParse(v);
if (!parsedPort.success) {
Logger_1.appLogger.error(`The value of '${v}' is an invalid port! ${parsedPort.error.issues[0].message}`);
process.exit(1);
}
return parsedPort.data;
}))
.option('--only-install-browsers-and-quit', 'Only install the Playwright browsers and quit.')
.parse(args)
.opts();
if (options.onlyInstallBrowsersAndQuit) {
await PlaywrightUtils_1.PlaywrightUtils.ensurePlaywrightInstallation();
}
else {
await startDonobuServer({ port: options.port });
}
}
/**
* This is the main entrypoint of the program. If you are looking for real
* business logic then see the DonobuFlow class.
*/
if (require.main === module) {
// Only install crash-on-error handlers when running as a standalone server,
// never when imported as a library (where they would hijack the host
// application's error handling).
(0, init_1.installCrashHandlers)();
(0, init_1.installShutdownHandlers)();
main(process.argv).catch((e) => {
Logger_1.appLogger.error('Unhandled error in main', e);
process.exit(1);
});
}
//# sourceMappingURL=main.js.map