@forestadmin/workflow-executor 1.23.5 → 1.23.7
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 +28 -0
- package/dist/adapters/ai-client-adapter.d.ts +2 -1
- package/dist/adapters/ai-client-adapter.js +10 -3
- package/dist/adapters/pretty-logger.js +6 -2
- package/dist/adapters/server-ai-adapter.d.ts +3 -0
- package/dist/adapters/server-ai-adapter.js +8 -1
- package/dist/adapters/to-ai-proxy-logger.d.ts +4 -0
- package/dist/adapters/to-ai-proxy-logger.js +30 -0
- package/dist/build-workflow-executor.js +3 -3
- package/dist/remote-tool-fetcher.js +39 -22
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -166,6 +166,34 @@ When your workflows use OAuth-protected MCP connectors, the executor stores each
|
|
|
166
166
|
|
|
167
167
|
---
|
|
168
168
|
|
|
169
|
+
## When an MCP step fails to load its tools
|
|
170
|
+
|
|
171
|
+
The executor names the reason at `Error`, so it is in your logs at the default level:
|
|
172
|
+
|
|
173
|
+
```json
|
|
174
|
+
{
|
|
175
|
+
"level": "Error",
|
|
176
|
+
"message": "MCP servers failed to load tools",
|
|
177
|
+
"requestedMcpServerId": "39",
|
|
178
|
+
"mcpServerName": "acme-crm",
|
|
179
|
+
"failures": [
|
|
180
|
+
{ "server": "acme-crm", "kind": "connection", "error": "connect ECONNREFUSED 10.0.4.12:8080" }
|
|
181
|
+
]
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
`kind` tells you where to look:
|
|
186
|
+
|
|
187
|
+
- `auth` — the server rejected the credential (HTTP 401). On an OAuth2 connector the executor refreshes the token and retries once on its own, so this line concerns static credentials; an OAuth2 connector that recovered logs `MCP tools loaded after refreshing the credential` at `Info`, and one that cannot pauses the run for re-authentication instead.
|
|
188
|
+
- `connection` — unreachable, refused, or slower than the 15s per-server load timeout.
|
|
189
|
+
- `unknown` — the server answered but the load failed anyway, including HTTP 403 (the credential is valid but lacks the permission, which no refresh can fix) and an integration this build does not support; the `error` text carries the reason.
|
|
190
|
+
|
|
191
|
+
A server that answers but exposes no tools is not a failure: you get an empty tool list and no error.
|
|
192
|
+
|
|
193
|
+
Set `LOG_LEVEL=Debug` to add one line per server with its tool count and load time, which is how you find the connector that is slowing a step down.
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
169
197
|
## Testing only
|
|
170
198
|
|
|
171
199
|
The following modes skip the database requirement but are **not suitable for production** — state is lost on restart.
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { AiModelPort, GetModelOptions } from '../ports/ai-model-port';
|
|
2
|
+
import type { Logger } from '../ports/logger-port';
|
|
2
3
|
import type { AiConfiguration, BaseChatModel, McpServerLoadFailure, RemoteTool, ToolConfig } from '@forestadmin/ai-proxy';
|
|
3
4
|
export default class AiClientAdapter implements AiModelPort {
|
|
4
5
|
private readonly aiClient;
|
|
5
|
-
constructor(aiConfigurations: AiConfiguration[]);
|
|
6
|
+
constructor(aiConfigurations: AiConfiguration[], logger?: Logger);
|
|
6
7
|
getModel({ aiConfigName }?: GetModelOptions): BaseChatModel;
|
|
7
8
|
loadRemoteTools(configs: Record<string, ToolConfig>): Promise<RemoteTool[]>;
|
|
8
9
|
loadRemoteToolsWithFailures(configs: Record<string, ToolConfig>): Promise<{
|
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
const ai_proxy_1 = require("@forestadmin/ai-proxy");
|
|
4
7
|
const errors_1 = require("../errors");
|
|
8
|
+
const to_ai_proxy_logger_1 = __importDefault(require("./to-ai-proxy-logger"));
|
|
5
9
|
class AiClientAdapter {
|
|
6
|
-
constructor(aiConfigurations) {
|
|
10
|
+
constructor(aiConfigurations, logger) {
|
|
7
11
|
const withRetries = aiConfigurations.map(c => ({ maxRetries: 2, ...c }));
|
|
8
|
-
this.aiClient = new ai_proxy_1.AiClient({
|
|
12
|
+
this.aiClient = new ai_proxy_1.AiClient({
|
|
13
|
+
aiConfigurations: withRetries,
|
|
14
|
+
logger: logger ? (0, to_ai_proxy_logger_1.default)(logger) : undefined,
|
|
15
|
+
});
|
|
9
16
|
}
|
|
10
17
|
getModel({ aiConfigName } = {}) {
|
|
11
18
|
try {
|
|
@@ -38,4 +45,4 @@ class AiClientAdapter {
|
|
|
38
45
|
}
|
|
39
46
|
}
|
|
40
47
|
exports.default = AiClientAdapter;
|
|
41
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktY2xpZW50LWFkYXB0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWRhcHRlcnMvYWktY2xpZW50LWFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFVQSxvREFBaUQ7QUFFakQsc0NBQW9FO0FBQ3BFLDhFQUFtRDtBQUVuRCxNQUFxQixlQUFlO0lBR2xDLFlBQVksZ0JBQW1DLEVBQUUsTUFBZTtRQUM5RCxNQUFNLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksbUJBQVEsQ0FBQztZQUMzQixnQkFBZ0IsRUFBRSxXQUFnQztZQUNsRCxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFBLDRCQUFlLEVBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7U0FDckQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFFBQVEsQ0FBQyxFQUFFLFlBQVksS0FBc0IsRUFBRTtRQUM3QyxJQUFJLENBQUM7WUFDSCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxLQUFLLFlBQVksOEJBQXFCO2dCQUFFLE1BQU0sS0FBSyxDQUFDO1lBQ3hELE1BQU0sSUFBSSx5QkFBZ0IsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDaEQsQ0FBQztJQUNILENBQUM7SUFFRCxlQUFlLENBQUMsT0FBbUM7UUFDakQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVELDJCQUEyQixDQUN6QixPQUFtQztRQUVuQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsNkJBQTZCLEVBQUUsR0FBRyxFQUFFLENBQ3ZELElBQUksQ0FBQyxRQUFRLENBQUMsMkJBQTJCLENBQUMsT0FBTyxDQUFDLENBQ25ELENBQUM7SUFDSixDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFTyxLQUFLLENBQUMsUUFBUSxDQUFJLFNBQWlCLEVBQUUsRUFBb0I7UUFDL0QsSUFBSSxDQUFDO1lBQ0gsT0FBTyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQ3BCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxLQUFLLFlBQVksOEJBQXFCO2dCQUFFLE1BQU0sS0FBSyxDQUFDO1lBQ3hELE1BQU0sSUFBSSx5QkFBZ0IsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNILENBQUM7Q0FDRjtBQTVDRCxrQ0E0Q0MifQ==
|
|
@@ -13,7 +13,11 @@ const LABEL = {
|
|
|
13
13
|
Error: picocolors_1.default.red('error'),
|
|
14
14
|
};
|
|
15
15
|
function formatContext(context) {
|
|
16
|
-
|
|
16
|
+
// Callers build a fixed context shape and leave the fields they have nothing for undefined,
|
|
17
|
+
// which JSON.stringify would render as the literal `undefined`.
|
|
18
|
+
const parts = Object.entries(context)
|
|
19
|
+
.filter(([, value]) => value !== undefined)
|
|
20
|
+
.map(([key, value]) => `${key}=${JSON.stringify(value)}`);
|
|
17
21
|
if (parts.length === 0)
|
|
18
22
|
return '';
|
|
19
23
|
return picocolors_1.default.dim(parts.join(' '));
|
|
@@ -41,4 +45,4 @@ function createPrettyLogger(minLevel = 'Info') {
|
|
|
41
45
|
console.info(line);
|
|
42
46
|
};
|
|
43
47
|
}
|
|
44
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldHR5LWxvZ2dlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVycy9wcmV0dHktbG9nZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBbUNBLHFDQVlDO0FBN0NELDREQUE0QjtBQUU1QixNQUFNLEtBQUssR0FBa0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztBQUVoRSxNQUFNLEtBQUssR0FBZ0M7SUFDekMsS0FBSyxFQUFFLG9CQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN2QixJQUFJLEVBQUUsb0JBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLElBQUksRUFBRSxvQkFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFDeEIsS0FBSyxFQUFFLG9CQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztDQUN2QixDQUFDO0FBRUYsU0FBUyxhQUFhLENBQUMsT0FBZ0M7SUFDckQsNEZBQTRGO0lBQzVGLGdFQUFnRTtJQUNoRSxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztTQUNsQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUM7U0FDMUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzVELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFFbEMsT0FBTyxvQkFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUVELFNBQVMsTUFBTSxDQUFDLEtBQWtCLEVBQUUsT0FBZSxFQUFFLE9BQWdDO0lBQ25GLE1BQU0sU0FBUyxHQUFHLG9CQUFFLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUUxQyxPQUFPLFVBQVU7UUFDZixDQUFDLENBQUMsR0FBRyxTQUFTLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLE9BQU8sSUFBSSxVQUFVLEVBQUU7UUFDekQsQ0FBQyxDQUFDLEdBQUcsU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUNoRCxDQUFDO0FBRUQsMEVBQTBFO0FBQzFFLHdGQUF3RjtBQUN4RixTQUF3QixrQkFBa0IsQ0FBQyxXQUF3QixNQUFNO0lBQ3ZFLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFekMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUU7UUFDakMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLFFBQVE7WUFBRSxPQUFPO1FBRTVDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQztRQUVuRCxJQUFJLEtBQUssS0FBSyxPQUFPO1lBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN0QyxJQUFJLEtBQUssS0FBSyxNQUFNO1lBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzs7WUFDekMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixDQUFDLENBQUM7QUFDSixDQUFDIn0=
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import type { AiModelPort, GetModelOptions } from '../ports/ai-model-port';
|
|
2
|
+
import type { Logger } from '../ports/logger-port';
|
|
2
3
|
import type { BaseChatModel, McpServerLoadFailure, RemoteTool, ToolConfig } from '@forestadmin/ai-proxy';
|
|
3
4
|
export interface ServerAiAdapterOptions {
|
|
4
5
|
forestServerUrl: string;
|
|
5
6
|
envSecret: string;
|
|
7
|
+
logger?: Logger;
|
|
6
8
|
}
|
|
7
9
|
export default class ServerAiAdapter implements AiModelPort {
|
|
8
10
|
private readonly options;
|
|
11
|
+
private readonly aiProxyLogger?;
|
|
9
12
|
private readonly aiClient;
|
|
10
13
|
constructor(options: ServerAiAdapterOptions);
|
|
11
14
|
getModel({ userId }?: GetModelOptions): BaseChatModel;
|
|
@@ -1,18 +1,25 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
const ai_proxy_1 = require("@forestadmin/ai-proxy");
|
|
4
7
|
const errors_1 = require("../errors");
|
|
8
|
+
const to_ai_proxy_logger_1 = __importDefault(require("./to-ai-proxy-logger"));
|
|
5
9
|
class ServerAiAdapter {
|
|
6
10
|
constructor(options) {
|
|
7
11
|
this.options = options;
|
|
12
|
+
this.aiProxyLogger = options.logger ? (0, to_ai_proxy_logger_1.default)(options.logger) : undefined;
|
|
8
13
|
this.aiClient = new ai_proxy_1.AiClient({
|
|
9
14
|
aiConfigurations: [ServerAiAdapter.buildProxyConfiguration(options)],
|
|
15
|
+
logger: this.aiProxyLogger,
|
|
10
16
|
});
|
|
11
17
|
}
|
|
12
18
|
getModel({ userId } = {}) {
|
|
13
19
|
try {
|
|
14
20
|
const client = new ai_proxy_1.AiClient({
|
|
15
21
|
aiConfigurations: [ServerAiAdapter.buildProxyConfiguration(this.options, userId)],
|
|
22
|
+
logger: this.aiProxyLogger,
|
|
16
23
|
});
|
|
17
24
|
return client.getModel();
|
|
18
25
|
}
|
|
@@ -67,4 +74,4 @@ class ServerAiAdapter {
|
|
|
67
74
|
}
|
|
68
75
|
}
|
|
69
76
|
exports.default = ServerAiAdapter;
|
|
70
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLWFpLWFkYXB0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWRhcHRlcnMvc2VydmVyLWFpLWFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFXQSxvREFBaUQ7QUFFakQsc0NBQW9FO0FBQ3BFLDhFQUFtRDtBQVFuRCxNQUFxQixlQUFlO0lBS2xDLFlBQVksT0FBK0I7UUFDekMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFBLDRCQUFlLEVBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDbEYsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLG1CQUFRLENBQUM7WUFDM0IsZ0JBQWdCLEVBQUUsQ0FBQyxlQUFlLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDcEUsTUFBTSxFQUFFLElBQUksQ0FBQyxhQUFhO1NBQzNCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxRQUFRLENBQUMsRUFBRSxNQUFNLEtBQXNCLEVBQUU7UUFDdkMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxtQkFBUSxDQUFDO2dCQUMxQixnQkFBZ0IsRUFBRSxDQUFDLGVBQWUsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUNqRixNQUFNLEVBQUUsSUFBSSxDQUFDLGFBQWE7YUFDM0IsQ0FBQyxDQUFDO1lBRUgsT0FBTyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDM0IsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLEtBQUssWUFBWSw4QkFBcUI7Z0JBQUUsTUFBTSxLQUFLLENBQUM7WUFDeEQsTUFBTSxJQUFJLHlCQUFnQixDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoRCxDQUFDO0lBQ0gsQ0FBQztJQUVELGVBQWUsQ0FBQyxPQUFtQztRQUNqRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBRUQsMkJBQTJCLENBQ3pCLE9BQW1DO1FBRW5DLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLEVBQUUsQ0FDdkQsSUFBSSxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsQ0FBQyxPQUFPLENBQUMsQ0FDbkQsQ0FBQztJQUNKLENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVELDZGQUE2RjtJQUM3Riw4RkFBOEY7SUFDOUYsd0RBQXdEO0lBQ2hELE1BQU0sQ0FBQyx1QkFBdUIsQ0FDcEMsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUEwQixFQUN0RCxNQUFlO1FBRWYsTUFBTSxVQUFVLEdBQUcsR0FBRyxlQUFlLG9CQUFvQixDQUFDO1FBRTFELE9BQU87WUFDTCxJQUFJLEVBQUUsZUFBZTtZQUNyQixRQUFRLEVBQUUsUUFBUTtZQUNsQixLQUFLLEVBQUUsU0FBUztZQUNoQixVQUFVLEVBQUUsQ0FBQztZQUNiLGFBQWEsRUFBRTtnQkFDYixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsS0FBSyxFQUFFLENBQUMsSUFBdUIsRUFBRSxJQUFrQixFQUFFLEVBQUU7b0JBQ3JELE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDM0MsT0FBTyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztvQkFDaEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxTQUFTLENBQUMsQ0FBQztvQkFDNUMsZ0ZBQWdGO29CQUNoRixJQUFJLE1BQU0sS0FBSyxTQUFTO3dCQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO29CQUVqRSxPQUFPLEtBQUssQ0FBQyxVQUFVLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRCxDQUFDO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxRQUFRLENBQUksU0FBaUIsRUFBRSxFQUFvQjtRQUMvRCxJQUFJLENBQUM7WUFDSCxPQUFPLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDcEIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLEtBQUssWUFBWSw4QkFBcUI7Z0JBQUUsTUFBTSxLQUFLLENBQUM7WUFDeEQsTUFBTSxJQUFJLHlCQUFnQixDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMvQyxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBakZELGtDQWlGQyJ9
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Logger, LoggerLevel } from '../ports/logger-port';
|
|
2
|
+
export type AiProxyLogger = (level: LoggerLevel, message: string, error?: Error) => void;
|
|
3
|
+
export default function toAiProxyLogger(logger: Logger): AiProxyLogger;
|
|
4
|
+
//# sourceMappingURL=to-ai-proxy-logger.d.ts.map
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = toAiProxyLogger;
|
|
4
|
+
const errors_1 = require("../errors");
|
|
5
|
+
// An Error's own properties are non-enumerable, so forwarding it as the context would emit the line
|
|
6
|
+
// with the cause silently stripped — flatten it the way the rest of the executor logs causes.
|
|
7
|
+
function toAiProxyLogger(logger) {
|
|
8
|
+
return (level, message, error) => {
|
|
9
|
+
// ai-proxy logs from inside its catch blocks before recording the failure it caught, so a host
|
|
10
|
+
// logger that throws here would abort a whole tool load instead of one server's.
|
|
11
|
+
try {
|
|
12
|
+
if (error === undefined || error === null) {
|
|
13
|
+
logger(level, message);
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const { cause } = error;
|
|
17
|
+
logger(level, message, {
|
|
18
|
+
error: (0, errors_1.extractErrorMessage)(error),
|
|
19
|
+
// `extractErrorMessage` only short-circuits on undefined, so a null cause would print
|
|
20
|
+
// the string "null" — the artifact the pretty logger drops undefined keys to avoid.
|
|
21
|
+
cause: cause == null ? undefined : (0, errors_1.extractErrorMessage)(cause),
|
|
22
|
+
stack: error instanceof Error ? error.stack : undefined,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// A broken logger must not become control flow.
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG8tYWktcHJveHktbG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FkYXB0ZXJzL3RvLWFpLXByb3h5LWxvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVNBLGtDQXdCQztBQS9CRCxzQ0FBZ0Q7QUFLaEQsb0dBQW9HO0FBQ3BHLDhGQUE4RjtBQUM5RixTQUF3QixlQUFlLENBQUMsTUFBYztJQUNwRCxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUMvQiwrRkFBK0Y7UUFDL0YsaUZBQWlGO1FBQ2pGLElBQUksQ0FBQztZQUNILElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQzFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBRXZCLE9BQU87WUFDVCxDQUFDO1lBRUQsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLEtBQTRCLENBQUM7WUFFL0MsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUU7Z0JBQ3JCLEtBQUssRUFBRSxJQUFBLDRCQUFtQixFQUFDLEtBQUssQ0FBQztnQkFDakMsc0ZBQXNGO2dCQUN0RixvRkFBb0Y7Z0JBQ3BGLEtBQUssRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUEsNEJBQW1CLEVBQUMsS0FBSyxDQUFDO2dCQUM3RCxLQUFLLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUzthQUN4RCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsZ0RBQWdEO1FBQ2xELENBQUM7SUFDSCxDQUFDLENBQUM7QUFDSixDQUFDIn0=
|
|
@@ -56,10 +56,10 @@ function buildCommonDependencies(options) {
|
|
|
56
56
|
aiModelPort = new always_error_ai_model_port_1.default();
|
|
57
57
|
}
|
|
58
58
|
else if (options.aiConfigurations?.length) {
|
|
59
|
-
aiModelPort = new ai_client_adapter_1.default(options.aiConfigurations);
|
|
59
|
+
aiModelPort = new ai_client_adapter_1.default(options.aiConfigurations, logger);
|
|
60
60
|
}
|
|
61
61
|
else {
|
|
62
|
-
aiModelPort = new server_ai_adapter_1.default({ forestServerUrl, envSecret: options.envSecret });
|
|
62
|
+
aiModelPort = new server_ai_adapter_1.default({ forestServerUrl, envSecret: options.envSecret, logger });
|
|
63
63
|
}
|
|
64
64
|
// A TTL of 0/negative/non-finite would silently make the cache always-stale, so fall back.
|
|
65
65
|
const schemaCache = new schema_cache_1.default(positiveOrDefault(options.schemaCacheTtlS, defaults_1.DEFAULT_SCHEMA_CACHE_TTL_S));
|
|
@@ -231,4 +231,4 @@ function buildDatabaseExecutor(options) {
|
|
|
231
231
|
});
|
|
232
232
|
return createWorkflowExecutor(runner, server, deps.logger, options.manageProcessSignals ?? true);
|
|
233
233
|
}
|
|
234
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
234
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtd29ya2Zsb3ctZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYnVpbGQtd29ya2Zsb3ctZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFtUEEsc0RBd0NDO0FBRUQsc0RBbURDO0FBM1VELHdFQUFxRjtBQUNyRix5Q0FBc0M7QUFFdEMsaUdBQXNFO0FBQ3RFLHFGQUEyRDtBQUMzRCx1R0FBMkU7QUFDM0UsK0VBQTREO0FBQzVELHlHQUE4RTtBQUM5RSwySUFBOEc7QUFDOUcscUZBQTJEO0FBQzNELDJGQUFrRTtBQUNsRSx5Q0FPb0I7QUFDcEIsdUZBQTZEO0FBQzdELDBFQUFzRDtBQUN0RCxnRkFBc0Q7QUFDdEQsc0RBQThCO0FBQzlCLGtFQUF5QztBQUN6Qyx5SEFBNkY7QUFDN0YsNkVBQW9EO0FBQ3BELDJIQUE4RjtBQUM5RiwrRUFBcUQ7QUFFckQsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUE4QzdCLDJGQUEyRjtBQUMzRiw2RkFBNkY7QUFDN0YsU0FBUyxpQkFBaUIsQ0FBQyxLQUF5QixFQUFFLFFBQWdCO0lBQ3BFLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7QUFDN0YsQ0FBQztBQUVELFNBQVMsdUJBQXVCLENBQUMsT0FBd0I7SUFDdkQsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLGVBQWUsSUFBSSxvQ0FBeUIsQ0FBQztJQUM3RSxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLElBQUEsd0JBQW1CLEVBQUMsT0FBTyxDQUFDLFdBQVcsSUFBSSwrQkFBb0IsQ0FBQyxDQUFDO0lBRWxHLDZGQUE2RjtJQUM3Rix1RUFBdUU7SUFDdkUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFB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
|
|
@@ -4,6 +4,9 @@ exports.scopeConfigsToServer = scopeConfigsToServer;
|
|
|
4
4
|
const ai_proxy_1 = require("@forestadmin/ai-proxy");
|
|
5
5
|
const errors_1 = require("./errors");
|
|
6
6
|
const OAUTH2_AUTH_TYPE = 'oauth2';
|
|
7
|
+
function hasAuthFailure(failures) {
|
|
8
|
+
return failures.some(failure => failure.kind === 'auth');
|
|
9
|
+
}
|
|
7
10
|
// Match by config.id, not by Record key: server names can collide across configs.
|
|
8
11
|
function scopeConfigsToServer(configs, mcpServerId) {
|
|
9
12
|
return Object.fromEntries(Object.entries(configs).filter(([, cfg]) => cfg.id === mcpServerId));
|
|
@@ -33,8 +36,8 @@ class RemoteToolFetcher {
|
|
|
33
36
|
if (readAuthType(scoped[mcpServerName]) === OAUTH2_AUTH_TYPE) {
|
|
34
37
|
return this.fetchOAuthTools(scoped, mcpServerName, mcpServerId, userId);
|
|
35
38
|
}
|
|
36
|
-
const tools = await this.aiModelPort.
|
|
37
|
-
const loadFailed = this.errorOnPartialLoadFailure(
|
|
39
|
+
const { tools, failures } = await this.aiModelPort.loadRemoteToolsWithFailures(scoped);
|
|
40
|
+
const loadFailed = this.errorOnPartialLoadFailure(failures, mcpServerId, mcpServerName);
|
|
38
41
|
return { tools, mcpServerName, loadFailed };
|
|
39
42
|
}
|
|
40
43
|
// OAuth2 path: acquire a per-user access token, inject it as a Bearer header, then list tools.
|
|
@@ -51,22 +54,34 @@ class RemoteToolFetcher {
|
|
|
51
54
|
configs: scoped,
|
|
52
55
|
tokensByMcpServerName: Object.fromEntries(Object.keys(scoped).map(name => [name, bearer])),
|
|
53
56
|
}) ?? scoped;
|
|
54
|
-
|
|
55
|
-
return { tools, hasAuthFailure: failures.some(failure => failure.kind === 'auth') };
|
|
57
|
+
return this.aiModelPort.loadRemoteToolsWithFailures(injected);
|
|
56
58
|
};
|
|
59
|
+
// The reload hook is handed to the caller for its own post-401 retry, so it cannot widen its
|
|
60
|
+
// return type; it reports the retry's outcome here instead.
|
|
61
|
+
let reloadFailed;
|
|
57
62
|
const reloadWithFreshAuth = async () => {
|
|
58
63
|
const attempt = await attemptLoad(true);
|
|
59
|
-
if (attempt.
|
|
64
|
+
if (hasAuthFailure(attempt.failures))
|
|
60
65
|
throw new errors_1.OAuthReauthRequiredError(mcpServerId);
|
|
61
|
-
this.errorOnPartialLoadFailure(
|
|
66
|
+
reloadFailed = this.errorOnPartialLoadFailure(attempt.failures, mcpServerId, mcpServerName);
|
|
67
|
+
// The rejected credential was already logged at Error. Without this the default level shows
|
|
68
|
+
// the failure and never says it recovered.
|
|
69
|
+
if (!reloadFailed) {
|
|
70
|
+
this.logger('Info', 'MCP tools loaded after refreshing the credential', {
|
|
71
|
+
requestedMcpServerId: mcpServerId,
|
|
72
|
+
mcpServerName,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
62
75
|
return attempt.tools;
|
|
63
76
|
};
|
|
64
77
|
const initial = await attemptLoad(false);
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
const loadFailed =
|
|
69
|
-
|
|
78
|
+
const hasRejectedToken = hasAuthFailure(initial.failures);
|
|
79
|
+
// The retry supersedes a rejected cached token, so its outcome is the one that counts.
|
|
80
|
+
const tools = hasRejectedToken ? await reloadWithFreshAuth() : initial.tools;
|
|
81
|
+
const loadFailed = hasRejectedToken
|
|
82
|
+
? reloadFailed
|
|
83
|
+
: this.errorOnPartialLoadFailure(initial.failures, mcpServerId, mcpServerName);
|
|
84
|
+
return { tools, mcpServerName, reloadWithFreshAuth, loadFailed };
|
|
70
85
|
}
|
|
71
86
|
// Distinguish "no configs at all" (deployment misconfig) from "configs exist but none match"
|
|
72
87
|
// (orchestrator/executor drift on server id) — both yield zero tools, but ops need to know
|
|
@@ -81,23 +96,25 @@ class RemoteToolFetcher {
|
|
|
81
96
|
? 'MCP step targets a server but orchestrator returned no MCP configs'
|
|
82
97
|
: 'MCP step targets a server not advertised by the orchestrator', { requestedMcpServerId: mcpServerId, mcpServerName, availableMcpServerIds });
|
|
83
98
|
}
|
|
84
|
-
//
|
|
85
|
-
//
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
const loadedMcpServerIds = new Set(tools.map(t => t.mcpServerId));
|
|
89
|
-
const failedConfigNames = Object.entries(scoped)
|
|
90
|
-
.filter(([, cfg]) => !loadedMcpServerIds.has(cfg.id))
|
|
91
|
-
.map(([name]) => name);
|
|
92
|
-
if (failedConfigNames.length === 0)
|
|
99
|
+
// Inferring failure from absent tools would flag a healthy server that exposes none, and could
|
|
100
|
+
// never name a cause.
|
|
101
|
+
errorOnPartialLoadFailure(failures, mcpServerId, mcpServerName) {
|
|
102
|
+
if (failures.length === 0)
|
|
93
103
|
return false;
|
|
94
104
|
this.logger('Error', 'MCP servers failed to load tools', {
|
|
95
105
|
requestedMcpServerId: mcpServerId,
|
|
96
106
|
mcpServerName,
|
|
97
|
-
|
|
107
|
+
failures: failures.map(failure => ({
|
|
108
|
+
server: failure.server,
|
|
109
|
+
kind: failure.kind,
|
|
110
|
+
// Read the way the bridge does: a `fetch failed` keeps its ECONNREFUSED, and a wrapped
|
|
111
|
+
// infra error with an empty message still names something.
|
|
112
|
+
error: (0, errors_1.extractErrorMessage)(failure.error),
|
|
113
|
+
cause: (0, errors_1.causeMessage)(failure.error),
|
|
114
|
+
})),
|
|
98
115
|
});
|
|
99
116
|
return true;
|
|
100
117
|
}
|
|
101
118
|
}
|
|
102
119
|
exports.default = RemoteToolFetcher;
|
|
103
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
120
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLXRvb2wtZmV0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yZW1vdGUtdG9vbC1mZXRjaGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBaUJBLG9EQUtDO0FBaEJELG9EQUEwRDtBQUUxRCxxQ0FBdUY7QUFFdkYsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUM7QUFFbEMsU0FBUyxjQUFjLENBQUMsUUFBZ0M7SUFDdEQsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQsa0ZBQWtGO0FBQ2xGLFNBQWdCLG9CQUFvQixDQUNsQyxPQUFtQyxFQUNuQyxXQUFtQjtJQUVuQixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQztBQUNqRyxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsTUFBOEI7SUFDbEQsT0FBUSxNQUE0QyxFQUFFLFFBQVEsQ0FBQztBQUNqRSxDQUFDO0FBY0QsTUFBcUIsaUJBQWlCO0lBTXBDLFlBQ0UsWUFBMEIsRUFDMUIsV0FBd0IsRUFDeEIsTUFBYyxFQUNkLGlCQUFvQztRQUVwQyx5RkFBeUY7UUFDekYsd0ZBQXdGO1FBQ3hGLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsMEVBQTBFLENBQUMsQ0FBQztRQUM5RixDQUFDO1FBRUQsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFN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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forestadmin/workflow-executor",
|
|
3
|
-
"version": "1.23.
|
|
3
|
+
"version": "1.23.7",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"bin": {
|
|
6
6
|
"forest-workflow-executor": "dist/cli.js"
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"@forestadmin/agent-client": "1.13.0",
|
|
33
|
-
"@forestadmin/ai-proxy": "1.12.
|
|
33
|
+
"@forestadmin/ai-proxy": "1.12.5",
|
|
34
34
|
"@forestadmin/forestadmin-client": "1.41.3",
|
|
35
35
|
"@koa/bodyparser": "^6.1.0",
|
|
36
36
|
"@koa/router": "^15.6.0",
|