@forestadmin/agent 1.88.0 → 1.89.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/embedded-workflow-executor.js +14 -9
- package/dist/types.d.ts +16 -5
- package/dist/types.js +1 -1
- package/package.json +3 -3
|
@@ -88,6 +88,11 @@ class EmbeddedWorkflowExecutor {
|
|
|
88
88
|
throw new Error('addWorkflowExecutor: `inMemory` and `database` are mutually exclusive. The in-memory run ' +
|
|
89
89
|
'store persists nothing; drop one of the two options.');
|
|
90
90
|
}
|
|
91
|
+
const { ai } = embedOptions;
|
|
92
|
+
if (ai && (!ai.provider || !ai.model || !ai.apiKey)) {
|
|
93
|
+
throw new Error('addWorkflowExecutor: `ai` requires `provider`, `model` and `apiKey` together. ' +
|
|
94
|
+
'Omit `ai` entirely to use Forest’s AI server.');
|
|
95
|
+
}
|
|
91
96
|
const port = embedOptions.port ?? DEFAULT_EMBEDDED_EXECUTOR_PORT;
|
|
92
97
|
this.config = { ...embedOptions, port };
|
|
93
98
|
return `http://127.0.0.1:${port}`;
|
|
@@ -100,7 +105,8 @@ class EmbeddedWorkflowExecutor {
|
|
|
100
105
|
const { config } = this;
|
|
101
106
|
if (!config)
|
|
102
107
|
return;
|
|
103
|
-
const
|
|
108
|
+
const { inMemory, database, agentUrl: configAgentUrl, port, ai, encryptionKey, ...tuning } = config;
|
|
109
|
+
const agentUrl = configAgentUrl ?? this.deriveAgentUrl(standaloneServerHost, standaloneServerPort);
|
|
104
110
|
if (!agentUrl) {
|
|
105
111
|
throw new Error('Embedded workflow executor: unable to derive the agent URL. It is only auto-derived when ' +
|
|
106
112
|
'the agent runs on its own server (mountOnStandaloneServer). When mounting on Express, ' +
|
|
@@ -108,26 +114,25 @@ class EmbeddedWorkflowExecutor {
|
|
|
108
114
|
}
|
|
109
115
|
const { buildDatabaseExecutor, buildInMemoryExecutor } = await this.importPackage();
|
|
110
116
|
const commonOptions = {
|
|
117
|
+
...tuning,
|
|
111
118
|
envSecret: this.options.envSecret,
|
|
112
119
|
authSecret: this.options.authSecret,
|
|
113
120
|
forestServerUrl: this.options.forestServerUrl,
|
|
114
121
|
agentUrl,
|
|
115
|
-
httpPort:
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
executorEncryptionKey: config.encryptionKey,
|
|
122
|
+
httpPort: port,
|
|
123
|
+
executorEncryptionKey: encryptionKey,
|
|
124
|
+
...(ai && { aiConfigurations: [{ name: 'default', ...ai }] }),
|
|
119
125
|
logger: (level, message, context) => this.options.logger(level, formatLog(message, context)),
|
|
120
126
|
// Embedded: the host process owns SIGTERM/SIGINT; the executor must not exit it. agent.stop()
|
|
121
127
|
// drains the executor explicitly.
|
|
122
128
|
manageProcessSignals: false,
|
|
123
129
|
};
|
|
124
|
-
if (
|
|
130
|
+
if (inMemory) {
|
|
125
131
|
this.options.logger('Warn', formatLog('Using an in-memory run store: workflow runs are kept in memory and lost on restart. ' +
|
|
126
132
|
'Pass a `database` to addWorkflowExecutor() to persist them in production.'));
|
|
127
133
|
this.executor = buildInMemoryExecutor(commonOptions);
|
|
128
134
|
}
|
|
129
135
|
else {
|
|
130
|
-
const { database } = config;
|
|
131
136
|
if (!database) {
|
|
132
137
|
throw new Error('Embedded workflow executor requires a database to persist run state. Pass `database` ' +
|
|
133
138
|
'to addWorkflowExecutor(), or use `inMemory: true`.');
|
|
@@ -138,7 +143,7 @@ class EmbeddedWorkflowExecutor {
|
|
|
138
143
|
});
|
|
139
144
|
}
|
|
140
145
|
await this.executor.start();
|
|
141
|
-
this.options.logger('Info', `Embedded workflow executor started (loopback port ${
|
|
146
|
+
this.options.logger('Info', `Embedded workflow executor started (loopback port ${port})`);
|
|
142
147
|
}
|
|
143
148
|
async stop() {
|
|
144
149
|
await this.executor?.stop();
|
|
@@ -170,4 +175,4 @@ class EmbeddedWorkflowExecutor {
|
|
|
170
175
|
}
|
|
171
176
|
}
|
|
172
177
|
exports.default = EmbeddedWorkflowExecutor;
|
|
173
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
178
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1iZWRkZWQtd29ya2Zsb3ctZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZW1iZWRkZWQtd29ya2Zsb3ctZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQSxnREFBd0I7QUFFeEIsK0RBQStEO0FBQy9ELE1BQU0sOEJBQThCLEdBQUcsSUFBSSxDQUFDO0FBRTVDOzs7O0dBSUc7QUFDSCxTQUFTLFNBQVMsQ0FBQyxPQUFlLEVBQUUsT0FBaUM7SUFDbkUsSUFBSSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyx1QkFBdUIsT0FBTyxFQUFFLENBQUM7SUFFM0YsSUFBSSxDQUFDO1FBQ0gsT0FBTyx1QkFBdUIsT0FBTyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUNyRSxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyx1QkFBdUIsT0FBTywyQkFBMkIsQ0FBQztJQUNuRSxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLElBQWE7SUFDdEMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxJQUFJO1FBQUUsT0FBTyxXQUFXLENBQUM7SUFFckUsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDakQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFxQix3QkFBd0I7SUFJM0MsWUFBNkIsT0FBaUM7UUFBakMsWUFBTyxHQUFQLE9BQU8sQ0FBMEI7UUFIdEQsV0FBTSxHQUE2RCxJQUFJLENBQUM7UUFDeEUsYUFB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
|
package/dist/types.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { CompositeId, Logger, LoggerLevel } from '@forestadmin/datasource-toolkit';
|
|
2
2
|
import type { ForestAdminClient } from '@forestadmin/forestadmin-client';
|
|
3
|
+
import type { WorkflowExecutorTuningOptions } from '@forestadmin/workflow-executor';
|
|
3
4
|
import type { IncomingMessage, ServerResponse } from 'http';
|
|
4
5
|
/** Options to configure behavior of an agent's forestadmin driver */
|
|
5
6
|
export type AgentOptions = {
|
|
@@ -59,7 +60,7 @@ export type AgentOptions = {
|
|
|
59
60
|
* Options for an embedded workflow executor, started in the same process as the agent
|
|
60
61
|
* through `agent.addWorkflowExecutor()`.
|
|
61
62
|
*/
|
|
62
|
-
export type WorkflowExecutorEmbedOptions = {
|
|
63
|
+
export type WorkflowExecutorEmbedOptions = Omit<WorkflowExecutorTuningOptions, 'loggerLevel'> & {
|
|
63
64
|
/**
|
|
64
65
|
* Use an in-memory run store instead of a database. No database is required, but runs are lost
|
|
65
66
|
* when the process restarts, so it is not meant for production. Mutually exclusive with
|
|
@@ -87,10 +88,20 @@ export type WorkflowExecutorEmbedOptions = {
|
|
|
87
88
|
* Defaults to `3400`.
|
|
88
89
|
*/
|
|
89
90
|
port?: number;
|
|
90
|
-
/**
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
91
|
+
/**
|
|
92
|
+
* Bring your own AI provider instead of Forest's AI server. All three fields are required
|
|
93
|
+
* together; omit `ai` entirely to keep using Forest's server.
|
|
94
|
+
*/
|
|
95
|
+
ai?: {
|
|
96
|
+
provider: 'anthropic' | 'openai';
|
|
97
|
+
model: string;
|
|
98
|
+
apiKey: string;
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* HKDF secret encrypting OAuth-protected MCP connector credentials at rest. Only needed if you
|
|
102
|
+
* use OAuth-protected MCP connectors; without it their credential deposits return 503. Embed-time
|
|
103
|
+
* equivalent of the standalone `FOREST_EXECUTOR_ENCRYPTION_KEY` env var.
|
|
104
|
+
*/
|
|
94
105
|
encryptionKey?: string;
|
|
95
106
|
};
|
|
96
107
|
export type AgentOptionsWithDefaults = Readonly<Required<AgentOptions>>;
|
package/dist/types.js
CHANGED
|
@@ -22,4 +22,4 @@ var RouteType;
|
|
|
22
22
|
RouteType[RouteType["Authentication"] = 3] = "Authentication";
|
|
23
23
|
RouteType[RouteType["PrivateRoute"] = 4] = "PrivateRoute";
|
|
24
24
|
})(RouteType || (exports.RouteType = RouteType = {}));
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBMkdBLElBQVksUUFVWDtBQVZELFdBQVksUUFBUTtJQUNsQixxREFBZ0IsQ0FBQTtJQUNoQix5REFBa0IsQ0FBQTtJQUNsQixtREFBZSxDQUFBO0lBQ2YsaURBQWMsQ0FBQTtJQUNkLDJEQUFtQixDQUFBO0lBQ25CLCtEQUFxQixDQUFBO0lBQ3JCLHVFQUF5QixDQUFBO0lBQ3pCLG1EQUFlLENBQUE7SUFDZixxQ0FBUSxDQUFBO0FBQ1YsQ0FBQyxFQVZXLFFBQVEsd0JBQVIsUUFBUSxRQVVuQjtBQUVELElBQVksU0FPWDtBQVBELFdBQVksU0FBUztJQUNuQixpR0FBaUc7SUFDakcsMkRBQWlCLENBQUE7SUFDakIseURBQWdCLENBQUE7SUFDaEIsdURBQWUsQ0FBQTtJQUNmLDZEQUFrQixDQUFBO0lBQ2xCLHlEQUFnQixDQUFBO0FBQ2xCLENBQUMsRUFQVyxTQUFTLHlCQUFULFNBQVMsUUFPcEIifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forestadmin/agent",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.89.0",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"license": "GPL-3.0",
|
|
6
6
|
"publishConfig": {
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"devDependencies": {
|
|
50
50
|
"@fastify/express": "^1.1.0",
|
|
51
51
|
"@forestadmin/datasource-sql": "1.17.11",
|
|
52
|
-
"@forestadmin/workflow-executor": "1.
|
|
52
|
+
"@forestadmin/workflow-executor": "1.21.0",
|
|
53
53
|
"@nestjs/common": "^11.1.24",
|
|
54
54
|
"@nestjs/core": "^11.1.24",
|
|
55
55
|
"@nestjs/platform-express": "^11.1.24",
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
},
|
|
73
73
|
"peerDependencies": {
|
|
74
74
|
"@fastify/express": "^1.1.0 || ^2.0.0 || ^3.0.0 || ^4.0.0",
|
|
75
|
-
"@forestadmin/workflow-executor": "1.
|
|
75
|
+
"@forestadmin/workflow-executor": "1.21.0"
|
|
76
76
|
},
|
|
77
77
|
"peerDependenciesMeta": {
|
|
78
78
|
"@fastify/express": {
|