@forestadmin/workflow-executor 1.12.0 → 1.14.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.
Files changed (59) hide show
  1. package/README.md +4 -0
  2. package/dist/adapters/agent-client-agent-port.d.ts +1 -1
  3. package/dist/adapters/agent-client-agent-port.js +3 -3
  4. package/dist/adapters/ai-client-adapter.d.ts +5 -1
  5. package/dist/adapters/ai-client-adapter.js +4 -1
  6. package/dist/adapters/always-error-ai-model-port.d.ts +5 -1
  7. package/dist/adapters/always-error-ai-model-port.js +6 -1
  8. package/dist/adapters/server-ai-adapter.d.ts +5 -1
  9. package/dist/adapters/server-ai-adapter.js +4 -1
  10. package/dist/adapters/step-outcome-to-update-step-mapper.js +4 -1
  11. package/dist/build-workflow-executor.js +87 -2
  12. package/dist/crypto/credential-encryption.d.ts +10 -0
  13. package/dist/crypto/credential-encryption.js +75 -0
  14. package/dist/defaults.d.ts +1 -0
  15. package/dist/defaults.js +5 -2
  16. package/dist/errors.d.ts +18 -0
  17. package/dist/errors.js +50 -2
  18. package/dist/executors/mcp-step-executor.d.ts +7 -2
  19. package/dist/executors/mcp-step-executor.js +78 -14
  20. package/dist/executors/step-executor-factory.d.ts +1 -1
  21. package/dist/executors/step-executor-factory.js +24 -3
  22. package/dist/executors/trigger-record-action-step-executor.js +10 -4
  23. package/dist/http/executor-http-server.d.ts +12 -0
  24. package/dist/http/executor-http-server.js +90 -1
  25. package/dist/http/mcp-oauth-credentials.d.ts +24 -0
  26. package/dist/http/mcp-oauth-credentials.js +77 -0
  27. package/dist/index.d.ts +7 -1
  28. package/dist/index.js +10 -3
  29. package/dist/oauth/keyed-mutex.d.ts +5 -0
  30. package/dist/oauth/keyed-mutex.js +27 -0
  31. package/dist/oauth/refresh-grant.d.ts +15 -0
  32. package/dist/oauth/refresh-grant.js +112 -0
  33. package/dist/oauth/token-endpoint-url.d.ts +2 -0
  34. package/dist/oauth/token-endpoint-url.js +103 -0
  35. package/dist/oauth/token-service.d.ts +34 -0
  36. package/dist/oauth/token-service.js +172 -0
  37. package/dist/ports/agent-port.d.ts +1 -0
  38. package/dist/ports/ai-model-port.d.ts +5 -1
  39. package/dist/ports/mcp-oauth-credentials-store.d.ts +24 -0
  40. package/dist/ports/mcp-oauth-credentials-store.js +3 -0
  41. package/dist/ports/run-store.d.ts +1 -0
  42. package/dist/remote-tool-fetcher.d.ts +7 -2
  43. package/dist/remote-tool-fetcher.js +53 -6
  44. package/dist/runner.d.ts +2 -0
  45. package/dist/runner.js +3 -3
  46. package/dist/stores/database-mcp-oauth-credentials-store.d.ts +22 -0
  47. package/dist/stores/database-mcp-oauth-credentials-store.js +188 -0
  48. package/dist/stores/database-store.d.ts +1 -1
  49. package/dist/stores/database-store.js +17 -50
  50. package/dist/stores/in-memory-mcp-oauth-credentials-store.d.ts +13 -0
  51. package/dist/stores/in-memory-mcp-oauth-credentials-store.js +44 -0
  52. package/dist/stores/in-memory-store.d.ts +1 -0
  53. package/dist/stores/in-memory-store.js +6 -1
  54. package/dist/stores/schema-migrations.d.ts +19 -0
  55. package/dist/stores/schema-migrations.js +69 -0
  56. package/dist/types/validated/execution.d.ts +6 -0
  57. package/dist/types/validated/step-outcome.d.ts +10 -0
  58. package/dist/types/validated/step-outcome.js +7 -2
  59. package/package.json +4 -4
package/README.md CHANGED
@@ -152,3 +152,7 @@ FOREST_AUTH_SECRET="your-auth-secret" \
152
152
  AGENT_URL="https://your-agent-url" \
153
153
  npx @forestadmin/workflow-executor --in-memory
154
154
  ```
155
+
156
+ ### OAuth2-protected MCP
157
+
158
+ To exercise the executor's OAuth2-protected MCP path end-to-end, point it at [mcp-oauth-test-server](https://github.com/hercemer42/mcp-oauth-test-server) — a standalone OAuth2 + MCP server that can simulate refresh-token revocation/rotation, consent denial, and upstream 403s.
@@ -17,7 +17,7 @@ export default class AgentClientAgentPort implements AgentPort {
17
17
  updateRecord({ collection, id, values }: UpdateRecordQuery, user: StepUser): Promise<RecordData>;
18
18
  getRelatedData({ collection, id, relation, relatedSchema, limit, fields, filters }: GetRelatedDataQuery, user: StepUser): Promise<RecordData[]>;
19
19
  getSingleRelatedData({ collection, id, relation, relatedSchema, fields }: GetSingleRelatedDataQuery, user: StepUser): Promise<RecordData | null>;
20
- executeAction({ collection, action, id, values }: ExecuteActionQuery, { user, forestServerToken }: ActionCaller): Promise<ExecuteActionResult>;
20
+ executeAction({ collection, action, id, values, approvalMessage }: ExecuteActionQuery, { user, forestServerToken }: ActionCaller): Promise<ExecuteActionResult>;
21
21
  getActionFormInfo({ collection, action, id }: GetActionFormInfoQuery, user: StepUser): Promise<{
22
22
  hasForm: boolean;
23
23
  }>;
@@ -142,7 +142,7 @@ class AgentClientAgentPort {
142
142
  };
143
143
  });
144
144
  }
145
- async executeAction({ collection, action, id, values }, { user, forestServerToken }) {
145
+ async executeAction({ collection, action, id, values, approvalMessage }, { user, forestServerToken }) {
146
146
  return this.callAgent('executeAction', async () => {
147
147
  const client = this.createClient(user, forestServerToken);
148
148
  const recordIds = id?.length ? [id] : [];
@@ -158,7 +158,7 @@ class AgentClientAgentPort {
158
158
  }
159
159
  }
160
160
  try {
161
- const executeResult = await act.execute();
161
+ const executeResult = await act.execute({ approvalRequestMessage: approvalMessage });
162
162
  return typeof executeResult === 'object' &&
163
163
  executeResult !== null &&
164
164
  'approvalRequested' in executeResult
@@ -297,4 +297,4 @@ class AgentClientAgentPort {
297
297
  }
298
298
  }
299
299
  exports.default = AgentClientAgentPort;
300
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtY2xpZW50LWFnZW50LXBvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWRhcHRlcnMvYWdlbnQtY2xpZW50LWFnZW50LXBvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFvQkEsNERBTW1DO0FBQ25DLGdFQUF3QztBQUV4QyxzQ0FTbUI7QUFFbkIscUdBQXFHO0FBQ3JHLHNGQUFzRjtBQUN0RixTQUFTLHVCQUF1QixDQUFDLE1BQWMsRUFBRSxLQUFjO0lBQzdELElBQUksS0FBSyxZQUFZLDBDQUFpQyxFQUFFLENBQUM7UUFDdkQsT0FBTyxJQUFJLG9DQUEyQixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQsSUFBSSxLQUFLLFlBQVksd0NBQStCLEVBQUUsQ0FBQztRQUNyRCxPQUFPLElBQUksa0NBQXlCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxJQUFJLEtBQUssWUFBWSwyQ0FBa0MsRUFBRSxDQUFDO1FBQ3hELE9BQU8sSUFBSSxxQ0FBNEIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLElBQVk7SUFDL0IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxFQUFFLENBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDNUUsQ0FBQztBQUVELG1GQUFtRjtBQUNuRixvR0FBb0c7QUFDcEcscUdBQXFHO0FBQ3JHLFNBQVMsaUJBQWlCLENBQ3hCLE1BQStCLEVBQy9CLGtCQUF3QztJQUV4QyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsTUFBTTtRQUFFLE9BQU8sTUFBTSxDQUFDO0lBRS9DLE1BQU0sZUFBZSxHQUEy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
300
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtY2xpZW50LWFnZW50LXBvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWRhcHRlcnMvYWdlbnQtY2xpZW50LWFnZW50LXBvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFvQkEsNERBTW1DO0FBQ25DLGdFQUF3QztBQUV4QyxzQ0FTbUI7QUFFbkIscUdBQXFHO0FBQ3JHLHNGQUFzRjtBQUN0RixTQUFTLHVCQUF1QixDQUFDLE1BQWMsRUFBRSxLQUFjO0lBQzdELElBQUksS0FBSyxZQUFZLDBDQUFpQyxFQUFFLENBQUM7UUFDdkQsT0FBTyxJQUFJLG9DQUEyQixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQsSUFBSSxLQUFLLFlBQVksd0NBQStCLEVBQUUsQ0FBQztRQUNyRCxPQUFPLElBQUksa0NBQXlCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxJQUFJLEtBQUssWUFBWSwyQ0FBa0MsRUFBRSxDQUFDO1FBQ3hELE9BQU8sSUFBSSxxQ0FBNEIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLElBQVk7SUFDL0IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxFQUFFLENBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDNUUsQ0FBQztBQUVELG1GQUFtRjtBQUNuRixvR0FBb0c7QUFDcEcscUdBQXFHO0FBQ3JHLFNBQVMsaUJBQWlCLENBQ3hCLE1BQStCLEVBQy9CLGtCQUF3QztJQUV4QyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsTUFBTTtRQUFFLE9BQU8sTUFBTSxDQUFDO0lBRS9DLE1BQU0sZUFBZSxHQUEy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
@@ -1,10 +1,14 @@
1
1
  import type { AiModelPort, GetModelOptions } from '../ports/ai-model-port';
2
- import type { AiConfiguration, BaseChatModel, RemoteTool, ToolConfig } from '@forestadmin/ai-proxy';
2
+ import type { AiConfiguration, BaseChatModel, McpServerLoadFailure, RemoteTool, ToolConfig } from '@forestadmin/ai-proxy';
3
3
  export default class AiClientAdapter implements AiModelPort {
4
4
  private readonly aiClient;
5
5
  constructor(aiConfigurations: AiConfiguration[]);
6
6
  getModel({ aiConfigName }?: GetModelOptions): BaseChatModel;
7
7
  loadRemoteTools(configs: Record<string, ToolConfig>): Promise<RemoteTool[]>;
8
+ loadRemoteToolsWithFailures(configs: Record<string, ToolConfig>): Promise<{
9
+ tools: RemoteTool[];
10
+ failures: McpServerLoadFailure[];
11
+ }>;
8
12
  closeConnections(): Promise<void>;
9
13
  private callPort;
10
14
  }
@@ -20,6 +20,9 @@ class AiClientAdapter {
20
20
  loadRemoteTools(configs) {
21
21
  return this.callPort('loadRemoteTools', () => this.aiClient.loadRemoteTools(configs));
22
22
  }
23
+ loadRemoteToolsWithFailures(configs) {
24
+ return this.callPort('loadRemoteToolsWithFailures', () => this.aiClient.loadRemoteToolsWithFailures(configs));
25
+ }
23
26
  closeConnections() {
24
27
  return this.callPort('closeConnections', () => this.aiClient.closeConnections());
25
28
  }
@@ -35,4 +38,4 @@ class AiClientAdapter {
35
38
  }
36
39
  }
37
40
  exports.default = AiClientAdapter;
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktY2xpZW50LWFkYXB0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWRhcHRlcnMvYWktY2xpZW50LWFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxvREFBaUQ7QUFFakQsc0NBQW9FO0FBRXBFLE1BQXFCLGVBQWU7SUFHbEMsWUFBWSxnQkFBbUM7UUFDN0MsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLG1CQUFRLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxXQUFnQyxFQUFFLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRUQsUUFBUSxDQUFDLEVBQUUsWUFBWSxLQUFzQixFQUFFO1FBQzdDLElBQUksQ0FBQztZQUNILE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLEtBQUssWUFBWSw4QkFBcUI7Z0JBQUUsTUFBTSxLQUFLLENBQUM7WUFDeEQsTUFBTSxJQUFJLHlCQUFnQixDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoRCxDQUFDO0lBQ0gsQ0FBQztJQUVELGVBQWUsQ0FBQyxPQUFtQztRQUNqRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFTyxLQUFLLENBQUMsUUFBUSxDQUFJLFNBQWlCLEVBQUUsRUFBb0I7UUFDL0QsSUFBSSxDQUFDO1lBQ0gsT0FBTyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQ3BCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxLQUFLLFlBQVksOEJBQXFCO2dCQUFFLE1BQU0sS0FBSyxDQUFDO1lBQ3hELE1BQU0sSUFBSSx5QkFBZ0IsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNILENBQUM7Q0FDRjtBQWpDRCxrQ0FpQ0MifQ==
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktY2xpZW50LWFkYXB0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWRhcHRlcnMvYWktY2xpZW50LWFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFTQSxvREFBaUQ7QUFFakQsc0NBQW9FO0FBRXBFLE1BQXFCLGVBQWU7SUFHbEMsWUFBWSxnQkFBbUM7UUFDN0MsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLG1CQUFRLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxXQUFnQyxFQUFFLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRUQsUUFBUSxDQUFDLEVBQUUsWUFBWSxLQUFzQixFQUFFO1FBQzdDLElBQUksQ0FBQztZQUNILE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLEtBQUssWUFBWSw4QkFBcUI7Z0JBQUUsTUFBTSxLQUFLLENBQUM7WUFDeEQsTUFBTSxJQUFJLHlCQUFnQixDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoRCxDQUFDO0lBQ0gsQ0FBQztJQUVELGVBQWUsQ0FBQyxPQUFtQztRQUNqRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBRUQsMkJBQTJCLENBQ3pCLE9BQW1DO1FBRW5DLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLEVBQUUsQ0FDdkQsSUFBSSxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsQ0FBQyxPQUFPLENBQUMsQ0FDbkQsQ0FBQztJQUNKLENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVPLEtBQUssQ0FBQyxRQUFRLENBQUksU0FBaUIsRUFBRSxFQUFvQjtRQUMvRCxJQUFJLENBQUM7WUFDSCxPQUFPLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDcEIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLEtBQUssWUFBWSw4QkFBcUI7Z0JBQUUsTUFBTSxLQUFLLENBQUM7WUFDeEQsTUFBTSxJQUFJLHlCQUFnQixDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMvQyxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBekNELGtDQXlDQyJ9
@@ -1,8 +1,12 @@
1
1
  import type { AiModelPort } from '../ports/ai-model-port';
2
- import type { BaseChatModel, RemoteTool, ToolConfig } from '@forestadmin/ai-proxy';
2
+ import type { BaseChatModel, McpServerLoadFailure, RemoteTool, ToolConfig } from '@forestadmin/ai-proxy';
3
3
  export default class AlwaysErrorAiModelPort implements AiModelPort {
4
4
  getModel(): BaseChatModel;
5
5
  loadRemoteTools(_configs: Record<string, ToolConfig>): Promise<RemoteTool[]>;
6
+ loadRemoteToolsWithFailures(_configs: Record<string, ToolConfig>): Promise<{
7
+ tools: RemoteTool[];
8
+ failures: McpServerLoadFailure[];
9
+ }>;
6
10
  closeConnections(): Promise<void>;
7
11
  }
8
12
  //# sourceMappingURL=always-error-ai-model-port.d.ts.map
@@ -15,9 +15,14 @@ class AlwaysErrorAiModelPort {
15
15
  loadRemoteTools(_configs) {
16
16
  return Promise.resolve([]);
17
17
  }
18
+ loadRemoteToolsWithFailures(
19
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
20
+ _configs) {
21
+ return Promise.resolve({ tools: [], failures: [] });
22
+ }
18
23
  closeConnections() {
19
24
  return Promise.resolve();
20
25
  }
21
26
  }
22
27
  exports.default = AlwaysErrorAiModelPort;
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWx3YXlzLWVycm9yLWFpLW1vZGVsLXBvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWRhcHRlcnMvYWx3YXlzLWVycm9yLWFpLW1vZGVsLXBvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxzQ0FBNkM7QUFFN0MsMEZBQTBGO0FBQzFGLGdFQUFnRTtBQUNoRSxNQUFxQixzQkFBc0I7SUFDekMsUUFBUTtRQUNOLE9BQU87WUFDTCxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDaEIsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUNYLE9BQU8sQ0FBQyxNQUFNLENBQ1osSUFBSSx5QkFBZ0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxDQUM3RTthQUNKLENBQUM7U0FDeUIsQ0FBQztJQUNoQyxDQUFDO0lBRUQsNkRBQTZEO0lBQzdELGVBQWUsQ0FBQyxRQUFvQztRQUNsRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELGdCQUFnQjtRQUNkLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7Q0FDRjtBQXBCRCx5Q0FvQkMifQ==
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWx3YXlzLWVycm9yLWFpLW1vZGVsLXBvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWRhcHRlcnMvYWx3YXlzLWVycm9yLWFpLW1vZGVsLXBvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFRQSxzQ0FBNkM7QUFFN0MsMEZBQTBGO0FBQzFGLGdFQUFnRTtBQUNoRSxNQUFxQixzQkFBc0I7SUFDekMsUUFBUTtRQUNOLE9BQU87WUFDTCxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDaEIsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUNYLE9BQU8sQ0FBQyxNQUFNLENBQ1osSUFBSSx5QkFBZ0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxDQUM3RTthQUNKLENBQUM7U0FDeUIsQ0FBQztJQUNoQyxDQUFDO0lBRUQsNkRBQTZEO0lBQzdELGVBQWUsQ0FBQyxRQUFvQztRQUNsRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELDJCQUEyQjtJQUN6Qiw2REFBNkQ7SUFDN0QsUUFBb0M7UUFFcEMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0IsQ0FBQztDQUNGO0FBM0JELHlDQTJCQyJ9
@@ -1,5 +1,5 @@
1
1
  import type { AiModelPort, GetModelOptions } from '../ports/ai-model-port';
2
- import type { BaseChatModel, RemoteTool, ToolConfig } from '@forestadmin/ai-proxy';
2
+ import type { BaseChatModel, McpServerLoadFailure, RemoteTool, ToolConfig } from '@forestadmin/ai-proxy';
3
3
  export interface ServerAiAdapterOptions {
4
4
  forestServerUrl: string;
5
5
  envSecret: string;
@@ -10,6 +10,10 @@ export default class ServerAiAdapter implements AiModelPort {
10
10
  constructor(options: ServerAiAdapterOptions);
11
11
  getModel({ userId }?: GetModelOptions): BaseChatModel;
12
12
  loadRemoteTools(configs: Record<string, ToolConfig>): Promise<RemoteTool[]>;
13
+ loadRemoteToolsWithFailures(configs: Record<string, ToolConfig>): Promise<{
14
+ tools: RemoteTool[];
15
+ failures: McpServerLoadFailure[];
16
+ }>;
13
17
  closeConnections(): Promise<void>;
14
18
  private static buildProxyConfiguration;
15
19
  private callPort;
@@ -25,6 +25,9 @@ class ServerAiAdapter {
25
25
  loadRemoteTools(configs) {
26
26
  return this.callPort('loadRemoteTools', () => this.aiClient.loadRemoteTools(configs));
27
27
  }
28
+ loadRemoteToolsWithFailures(configs) {
29
+ return this.callPort('loadRemoteToolsWithFailures', () => this.aiClient.loadRemoteToolsWithFailures(configs));
30
+ }
28
31
  closeConnections() {
29
32
  return this.callPort('closeConnections', () => this.aiClient.closeConnections());
30
33
  }
@@ -64,4 +67,4 @@ class ServerAiAdapter {
64
67
  }
65
68
  }
66
69
  exports.default = ServerAiAdapter;
67
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLWFpLWFkYXB0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWRhcHRlcnMvc2VydmVyLWFpLWFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxvREFBaUQ7QUFFakQsc0NBQW9FO0FBT3BFLE1BQXFCLGVBQWU7SUFJbEMsWUFBWSxPQUErQjtRQUN6QyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksbUJBQVEsQ0FBQztZQUMzQixnQkFBZ0IsRUFBRSxDQUFDLGVBQWUsQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNyRSxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsUUFBUSxDQUFDLEVBQUUsTUFBTSxLQUFzQixFQUFFO1FBQ3ZDLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLElBQUksbUJBQVEsQ0FBQztnQkFDMUIsZ0JBQWdCLEVBQUUsQ0FBQyxlQUFlLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQzthQUNsRixDQUFDLENBQUM7WUFFSCxPQUFPLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMzQixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksS0FBSyxZQUFZLDhCQUFxQjtnQkFBRSxNQUFNLEtBQUssQ0FBQztZQUN4RCxNQUFNLElBQUkseUJBQWdCLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2hELENBQUM7SUFDSCxDQUFDO0lBRUQsZUFBZSxDQUFDLE9BQW1DO1FBQ2pELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3hGLENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVELDZGQUE2RjtJQUM3Riw4RkFBOEY7SUFDOUYsd0RBQXdEO0lBQ2hELE1BQU0sQ0FBQyx1QkFBdUIsQ0FDcEMsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUEwQixFQUN0RCxNQUFlO1FBRWYsTUFBTSxVQUFVLEdBQUcsR0FBRyxlQUFlLG9CQUFvQixDQUFDO1FBRTFELE9BQU87WUFDTCxJQUFJLEVBQUUsZUFBZTtZQUNyQixRQUFRLEVBQUUsUUFBUTtZQUNsQixLQUFLLEVBQUUsU0FBUztZQUNoQixVQUFVLEVBQUUsQ0FBQztZQUNiLGFBQWEsRUFBRTtnQkFDYixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsS0FBSyxFQUFFLENBQUMsSUFBdUIsRUFBRSxJQUFrQixFQUFFLEVBQUU7b0JBQ3JELE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDM0MsT0FBTyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztvQkFDaEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxTQUFTLENBQUMsQ0FBQztvQkFDNUMsZ0ZBQWdGO29CQUNoRixJQUFJLE1BQU0sS0FBSyxTQUFTO3dCQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO29CQUVqRSxPQUFPLEtBQUssQ0FBQyxVQUFVLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRCxDQUFDO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxRQUFRLENBQUksU0FBaUIsRUFBRSxFQUFvQjtRQUMvRCxJQUFJLENBQUM7WUFDSCxPQUFPLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDcEIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLEtBQUssWUFBWSw4QkFBcUI7Z0JBQUUsTUFBTSxLQUFLLENBQUM7WUFDeEQsTUFBTSxJQUFJLHlCQUFnQixDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMvQyxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBckVELGtDQXFFQyJ9
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLWFpLWFkYXB0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWRhcHRlcnMvc2VydmVyLWFpLWFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFTQSxvREFBaUQ7QUFFakQsc0NBQW9FO0FBT3BFLE1BQXFCLGVBQWU7SUFJbEMsWUFBWSxPQUErQjtRQUN6QyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksbUJBQVEsQ0FBQztZQUMzQixnQkFBZ0IsRUFBRSxDQUFDLGVBQWUsQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNyRSxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsUUFBUSxDQUFDLEVBQUUsTUFBTSxLQUFzQixFQUFFO1FBQ3ZDLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLElBQUksbUJBQVEsQ0FBQztnQkFDMUIsZ0JBQWdCLEVBQUUsQ0FBQyxlQUFlLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQzthQUNsRixDQUFDLENBQUM7WUFFSCxPQUFPLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMzQixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksS0FBSyxZQUFZLDhCQUFxQjtnQkFBRSxNQUFNLEtBQUssQ0FBQztZQUN4RCxNQUFNLElBQUkseUJBQWdCLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2hELENBQUM7SUFDSCxDQUFDO0lBRUQsZUFBZSxDQUFDLE9BQW1DO1FBQ2pELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3hGLENBQUM7SUFFRCwyQkFBMkIsQ0FDekIsT0FBbUM7UUFFbkMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRSxDQUN2RCxJQUFJLENBQUMsUUFBUSxDQUFDLDJCQUEyQixDQUFDLE9BQU8sQ0FBQyxDQUNuRCxDQUFDO0lBQ0osQ0FBQztJQUVELGdCQUFnQjtRQUNkLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBRUQsNkZBQTZGO0lBQzdGLDhGQUE4RjtJQUM5Rix3REFBd0Q7SUFDaEQsTUFBTSxDQUFDLHVCQUF1QixDQUNwQyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQTBCLEVBQ3RELE1BQWU7UUFFZixNQUFNLFVBQVUsR0FBRyxHQUFHLGVBQWUsb0JBQW9CLENBQUM7UUFFMUQsT0FBTztZQUNMLElBQUksRUFBRSxlQUFlO1lBQ3JCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLEtBQUssRUFBRSxTQUFTO1lBQ2hCLFVBQVUsRUFBRSxDQUFDO1lBQ2IsYUFBYSxFQUFFO2dCQUNiLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixLQUFLLEVBQUUsQ0FBQyxJQUF1QixFQUFFLElBQWtCLEVBQUUsRUFBRTtvQkFDckQsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUMzQyxPQUFPLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO29CQUNoQyxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLFNBQVMsQ0FBQyxDQUFDO29CQUM1QyxnRkFBZ0Y7b0JBQ2hGLElBQUksTUFBTSxLQUFLLFNBQVM7d0JBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7b0JBRWpFLE9BQU8sS0FBSyxDQUFDLFVBQVUsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ2pELENBQUM7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLFFBQVEsQ0FBSSxTQUFpQixFQUFFLEVBQW9CO1FBQy9ELElBQUksQ0FBQztZQUNILE9BQU8sTUFBTSxFQUFFLEVBQUUsQ0FBQztRQUNwQixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksS0FBSyxZQUFZLDhCQUFxQjtnQkFBRSxNQUFNLEtBQUssQ0FBQztZQUN4RCxNQUFNLElBQUkseUJBQWdCLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQy9DLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUE3RUQsa0NBNkVDIn0=
@@ -24,6 +24,9 @@ function toUpdateStepRequest(runId, outcome) {
24
24
  if (outcome.type === 'record' && outcome.approvalRequest !== undefined) {
25
25
  context.approvalRequest = outcome.approvalRequest;
26
26
  }
27
+ if (outcome.type === 'mcp' && outcome.awaitingInputReason !== undefined) {
28
+ context.awaitingInputReason = outcome.awaitingInputReason;
29
+ }
27
30
  const attributes = {
28
31
  done: outcome.status !== 'awaiting-input',
29
32
  context,
@@ -34,4 +37,4 @@ function toUpdateStepRequest(runId, outcome) {
34
37
  executionStatus: toExecutionStatus(outcome),
35
38
  };
36
39
  }
37
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1vdXRjb21lLXRvLXVwZGF0ZS1zdGVwLW1hcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVycy9zdGVwLW91dGNvbWUtdG8tdXBkYXRlLXN0ZXAtbWFwcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBdUJBLHNDQXlCQztBQXpDRCxTQUFTLGlCQUFpQixDQUFDLE9BQW9CO0lBQzdDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUMvQiwwRUFBMEU7UUFDMUUsaUZBQWlGO1FBQ2pGLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxJQUFJLGVBQWUsRUFBRSxDQUFDO0lBQ3RFLENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QyxPQUFPLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7QUFDN0IsQ0FBQztBQUVELG1HQUFtRztBQUNuRyxxRUFBcUU7QUFDckUsU0FBd0IsbUJBQW1CLENBQ3pDLEtBQWEsRUFDYixPQUFvQjtJQUVwQixNQUFNLE9BQU8sR0FBNEIsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3BFLElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxTQUFTO1FBQUUsT0FBTyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBRS9ELElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxXQUFXLElBQUksT0FBTyxDQUFDLGNBQWMsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN6RSxPQUFPLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUM7SUFDbEQsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLGVBQWUsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN2RSxPQUFPLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUM7SUFDcEQsQ0FBQztJQUVELE1BQU0sVUFBVSxHQUE0QjtRQUMxQyxJQUFJLEVBQUUsT0FBTyxDQUFDLE1BQU0sS0FBSyxnQkFBZ0I7UUFDekMsT0FBTztLQUNSLENBQUM7SUFFRixPQUFPO1FBQ0wsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDcEIsVUFBVSxFQUFFLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFO1FBQ3hELGVBQWUsRUFBRSxpQkFBaUIsQ0FBQyxPQUFPLENBQUM7S0FDNUMsQ0FBQztBQUNKLENBQUMifQ==
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1vdXRjb21lLXRvLXVwZGF0ZS1zdGVwLW1hcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVycy9zdGVwLW91dGNvbWUtdG8tdXBkYXRlLXN0ZXAtbWFwcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBdUJBLHNDQTZCQztBQTdDRCxTQUFTLGlCQUFpQixDQUFDLE9BQW9CO0lBQzdDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUMvQiwwRUFBMEU7UUFDMUUsaUZBQWlGO1FBQ2pGLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxJQUFJLGVBQWUsRUFBRSxDQUFDO0lBQ3RFLENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QyxPQUFPLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7QUFDN0IsQ0FBQztBQUVELG1HQUFtRztBQUNuRyxxRUFBcUU7QUFDckUsU0FBd0IsbUJBQW1CLENBQ3pDLEtBQWEsRUFDYixPQUFvQjtJQUVwQixNQUFNLE9BQU8sR0FBNEIsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3BFLElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxTQUFTO1FBQUUsT0FBTyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBRS9ELElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxXQUFXLElBQUksT0FBTyxDQUFDLGNBQWMsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN6RSxPQUFPLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUM7SUFDbEQsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLGVBQWUsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN2RSxPQUFPLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUM7SUFDcEQsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxLQUFLLElBQUksT0FBTyxDQUFDLG1CQUFtQixLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3hFLE9BQU8sQ0FBQyxtQkFBbUIsR0FBRyxPQUFPLENBQUMsbUJBQW1CLENBQUM7SUFDNUQsQ0FBQztJQUVELE1BQU0sVUFBVSxHQUE0QjtRQUMxQyxJQUFJLEVBQUUsT0FBTyxDQUFDLE1BQU0sS0FBSyxnQkFBZ0I7UUFDekMsT0FBTztLQUNSLENBQUM7SUFFRixPQUFPO1FBQ0wsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDcEIsVUFBVSxFQUFFLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFO1FBQ3hELGVBQWUsRUFBRSxpQkFBaUIsQ0FBQyxPQUFPLENBQUM7S0FDNUMsQ0FBQztBQUNKLENBQUMifQ==
@@ -1,4 +1,37 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
37
  };
@@ -14,11 +47,16 @@ const console_logger_1 = __importDefault(require("./adapters/console-logger"));
14
47
  const forest_server_workflow_port_1 = __importDefault(require("./adapters/forest-server-workflow-port"));
15
48
  const forestadmin_client_activity_log_port_factory_1 = __importDefault(require("./adapters/forestadmin-client-activity-log-port-factory"));
16
49
  const server_ai_adapter_1 = __importDefault(require("./adapters/server-ai-adapter"));
50
+ const credential_encryption_1 = __importStar(require("./crypto/credential-encryption"));
17
51
  const defaults_1 = require("./defaults");
18
52
  const executor_http_server_1 = __importDefault(require("./http/executor-http-server"));
53
+ const token_service_1 = __importDefault(require("./oauth/token-service"));
54
+ const remote_tool_fetcher_1 = __importDefault(require("./remote-tool-fetcher"));
19
55
  const runner_1 = __importDefault(require("./runner"));
20
56
  const schema_cache_1 = __importDefault(require("./schema-cache"));
57
+ const database_mcp_oauth_credentials_store_1 = __importDefault(require("./stores/database-mcp-oauth-credentials-store"));
21
58
  const database_store_1 = __importDefault(require("./stores/database-store"));
59
+ const in_memory_mcp_oauth_credentials_store_1 = __importDefault(require("./stores/in-memory-mcp-oauth-credentials-store"));
22
60
  const in_memory_store_1 = __importDefault(require("./stores/in-memory-store"));
23
61
  const FORCE_EXIT_DELAY_S = 5;
24
62
  // A bad timeout config (0, negative, non-finite) must fall back to the default rather than
@@ -29,6 +67,11 @@ function positiveOrDefault(value, fallback) {
29
67
  function buildCommonDependencies(options) {
30
68
  const forestServerUrl = options.forestServerUrl ?? defaults_1.DEFAULT_FOREST_SERVER_URL;
31
69
  const logger = options.logger ?? (0, console_logger_1.default)(options.loggerLevel ?? defaults_1.DEFAULT_LOGGER_LEVEL);
70
+ // Lazy key by design (OAuth-less executors boot without it), but surface a security-relevant
71
+ // heads-up so a missing key isn't discovered only when a deposit 503s.
72
+ if (!(0, credential_encryption_1.isExecutorEncryptionKeyConfigured)()) {
73
+ logger('Warn', 'FOREST_EXECUTOR_ENCRYPTION_KEY is not set — OAuth-protected MCP servers are unavailable (credential deposits return 503) until it is configured.');
74
+ }
32
75
  const workflowPort = new forest_server_workflow_port_1.default({
33
76
  envSecret: options.envSecret,
34
77
  forestServerUrl,
@@ -120,7 +163,15 @@ function createWorkflowExecutor(runner, server, logger, manageProcessSignals) {
120
163
  },
121
164
  async start() {
122
165
  await runner.start();
123
- await server.start();
166
+ // server.start() runs the OAuth-store migration; if it fails, don't leave the runner polling
167
+ // in the background — stop it so start() is all-or-nothing.
168
+ try {
169
+ await server.start();
170
+ }
171
+ catch (err) {
172
+ await runner.stop().catch(() => { });
173
+ throw err;
174
+ }
124
175
  // Only own the host's signals when explicitly allowed (the standalone CLI). When embedded,
125
176
  // the host process must keep control of SIGTERM/SIGINT and its own exit.
126
177
  if (manageProcessSignals) {
@@ -141,9 +192,21 @@ function createWorkflowExecutor(runner, server, logger, manageProcessSignals) {
141
192
  }
142
193
  function buildInMemoryExecutor(options) {
143
194
  const deps = buildCommonDependencies(options);
195
+ const mcpOAuthCredentialsStore = new in_memory_mcp_oauth_credentials_store_1.default();
196
+ const credentialEncryption = new credential_encryption_1.default();
197
+ // Shares the store + encryption with the deposit endpoint so runtime reads and writes (rotation)
198
+ // go through the same instance the HTTP server exposes. In-memory is dev-only: credentials live
199
+ // only for the process lifetime, but oauth2 steps work end-to-end just like the database executor.
200
+ const mcpOAuthTokenService = new token_service_1.default({
201
+ store: mcpOAuthCredentialsStore,
202
+ encryption: credentialEncryption,
203
+ logger: deps.logger,
204
+ });
205
+ const remoteToolFetcher = new remote_tool_fetcher_1.default(deps.workflowPort, deps.aiModelPort, deps.logger, mcpOAuthTokenService);
144
206
  const runner = new runner_1.default({
145
207
  ...deps,
146
208
  runStore: new in_memory_store_1.default(),
209
+ mcpOAuthTokenService,
147
210
  });
148
211
  const server = new executor_http_server_1.default({
149
212
  port: options.httpPort,
@@ -151,6 +214,10 @@ function buildInMemoryExecutor(options) {
151
214
  authSecret: options.authSecret,
152
215
  workflowPort: deps.workflowPort,
153
216
  logger: deps.logger,
217
+ mcpOAuthCredentialsStore,
218
+ credentialEncryption,
219
+ remoteToolFetcher,
220
+ oauthTokenService: mcpOAuthTokenService,
154
221
  });
155
222
  return createWorkflowExecutor(runner, server, deps.logger, options.manageProcessSignals ?? true);
156
223
  }
@@ -166,9 +233,23 @@ function buildDatabaseExecutor(options) {
166
233
  if (mergedOptions.logging === undefined)
167
234
  mergedOptions.logging = false;
168
235
  const sequelize = uri ? new sequelize_1.Sequelize(uri, mergedOptions) : new sequelize_1.Sequelize(mergedOptions);
236
+ const mcpOAuthCredentialsStore = new database_mcp_oauth_credentials_store_1.default({
237
+ sequelize,
238
+ schema: mergedOptions.schema,
239
+ });
240
+ const credentialEncryption = new credential_encryption_1.default();
241
+ // Shares the store + encryption with the deposit endpoint so runtime reads and writes (rotation)
242
+ // go through the same instance the HTTP server migrates on start.
243
+ const mcpOAuthTokenService = new token_service_1.default({
244
+ store: mcpOAuthCredentialsStore,
245
+ encryption: credentialEncryption,
246
+ logger: deps.logger,
247
+ });
248
+ const remoteToolFetcher = new remote_tool_fetcher_1.default(deps.workflowPort, deps.aiModelPort, deps.logger, mcpOAuthTokenService);
169
249
  const runner = new runner_1.default({
170
250
  ...deps,
171
251
  runStore: new database_store_1.default({ sequelize, schema: mergedOptions.schema }),
252
+ mcpOAuthTokenService,
172
253
  });
173
254
  const server = new executor_http_server_1.default({
174
255
  port: options.httpPort,
@@ -176,7 +257,11 @@ function buildDatabaseExecutor(options) {
176
257
  authSecret: options.authSecret,
177
258
  workflowPort: deps.workflowPort,
178
259
  logger: deps.logger,
260
+ mcpOAuthCredentialsStore,
261
+ credentialEncryption,
262
+ remoteToolFetcher,
263
+ oauthTokenService: mcpOAuthTokenService,
179
264
  });
180
265
  return createWorkflowExecutor(runner, server, deps.logger, options.manageProcessSignals ?? true);
181
266
  }
182
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtd29ya2Zsb3ctZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYnVpbGQtd29ya2Zsb3ctZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFvTkEsc0RBaUJDO0FBRUQsc0RBMEJDO0FBNVBELHdFQUFxRjtBQUNyRix5Q0FBc0M7QUFFdEMsaUdBQXNFO0FBQ3RFLHFGQUEyRDtBQUMzRCx1R0FBMkU7QUFDM0UsK0VBQTREO0FBQzVELHlHQUE4RTtBQUM5RSwySUFBOEc7QUFDOUcscUZBQTJEO0FBQzNELHlDQU9vQjtBQUNwQix1RkFBNkQ7QUFDN0Qsc0RBQThCO0FBQzlCLGtFQUF5QztBQUN6Qyw2RUFBb0Q7QUFDcEQsK0VBQXFEO0FBRXJELE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0FBcUM3QiwyRkFBMkY7QUFDM0YsNkZBQTZGO0FBQzdGLFNBQVMsaUJBQWlCLENBQUMsS0FBeUIsRUFBRSxRQUFnQjtJQUNwRSxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0FBQzdGLENBQUM7QUFFRCxTQUFTLHVCQUF1QixDQUFDLE9BQXdCO0lBQ3ZELE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxlQUFlLElBQUksb0NBQXlCLENBQUM7SUFDN0UsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxJQUFBLHdCQUFtQixFQUFDLE9BQU8sQ0FBQyxXQUFXLElBQUksK0JBQW9CLENBQUMsQ0FBQztJQUVsRyxNQUFNLFlBQVksR0FBRyxJQUFJLHFDQUF3QixDQUFDO1FBQ2hELFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztRQUM1QixlQUFlO1FBQ2YsTUFBTTtLQUNQLENBQUMsQ0FBQztJQUVILE1BQU0sWUFBWSxH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
267
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtd29ya2Zsb3ctZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYnVpbGQtd29ya2Zsb3ctZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE0T0Esc0RBd0NDO0FBRUQsc0RBbURDO0FBcFVELHdFQUFxRjtBQUNyRix5Q0FBc0M7QUFFdEMsaUdBQXNFO0FBQ3RFLHFGQUEyRDtBQUMzRCx1R0FBMkU7QUFDM0UsK0VBQTREO0FBQzVELHlHQUE4RTtBQUM5RSwySUFBOEc7QUFDOUcscUZBQTJEO0FBQzNELHdGQUV3QztBQUN4Qyx5Q0FPb0I7QUFDcEIsdUZBQTZEO0FBQzdELDBFQUFzRDtBQUN0RCxnRkFBc0Q7QUFDdEQsc0RBQThCO0FBQzlCLGtFQUF5QztBQUN6Qyx5SEFBNkY7QUFDN0YsNkVBQW9EO0FBQ3BELDJIQUE4RjtBQUM5RiwrRUFBcUQ7QUFFckQsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFxQzdCLDJGQUEyRjtBQUMzRiw2RkFBNkY7QUFDN0YsU0FBUyxpQkFBaUIsQ0FBQyxLQUF5QixFQUFFLFFBQWdCO0lBQ3BFLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7QUFDN0YsQ0FBQztBQUVELFNBQVMsdUJBQXVCLENBQUMsT0FBd0I7SUFDdkQsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLGVBQWUsSUFBSSxvQ0FBeUIsQ0FBQztJQUM3RSxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLElBQUEsd0JBQW1CLEVBQUMsT0FBTyxDQUFDLFdBQVcsSUFBSSwrQkFBb0IsQ0FBQyxDQUFDO0lBRWxHLDZGQUE2RjtJQUM3Rix1RUFB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
@@ -0,0 +1,10 @@
1
+ export declare function isExecutorEncryptionKeyConfigured(): boolean;
2
+ export interface EncryptedValue {
3
+ ciphertext: Buffer;
4
+ }
5
+ export default class CredentialEncryption {
6
+ encrypt(plaintext: string): EncryptedValue;
7
+ decrypt(value: Buffer): string;
8
+ private deriveKey;
9
+ }
10
+ //# sourceMappingURL=credential-encryption.d.ts.map
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isExecutorEncryptionKeyConfigured = isExecutorEncryptionKeyConfigured;
4
+ const crypto_1 = require("crypto");
5
+ const errors_1 = require("../errors");
6
+ const ENV_KEY = 'FOREST_EXECUTOR_ENCRYPTION_KEY';
7
+ // Fixed context label bound into the HKDF derivation — domain-separates this key from any other
8
+ // use of the same secret. Changing it would make every existing row undecryptable.
9
+ const HKDF_INFO = 'forest-executor:mcp-oauth-credentials';
10
+ const HKDF_DIGEST = 'sha256';
11
+ const KEY_BYTES = 32; // AES-256
12
+ const IV_BYTES = 12; // GCM standard nonce length
13
+ const AUTH_TAG_BYTES = 16;
14
+ const ALGORITHM = 'aes-256-gcm';
15
+ // Boot-time check (no derivation, no throw): is the at-rest key configured? Lets startup emit a
16
+ // warning that OAuth-protected MCP servers are unavailable until it is set. There is deliberately no
17
+ // default key — a hardcoded one would be public in this open-source package and defeat the at-rest
18
+ // encryption (a DB dump would be decryptable with the shipped key).
19
+ function isExecutorEncryptionKeyConfigured() {
20
+ return Boolean(process.env[ENV_KEY]);
21
+ }
22
+ // Concatenate byte arrays without going through Buffer.concat — keeps everything in the concrete
23
+ // Uint8Array<ArrayBuffer> domain the Node crypto types expect.
24
+ function concatBytes(parts) {
25
+ const total = parts.reduce((length, part) => length + part.length, 0);
26
+ const out = new Uint8Array(total);
27
+ let offset = 0;
28
+ for (const part of parts) {
29
+ out.set(part, offset);
30
+ offset += part.length;
31
+ }
32
+ return out;
33
+ }
34
+ // At-rest encryption for secrets the executor stores. The HKDF key (from
35
+ // FOREST_EXECUTOR_ENCRYPTION_KEY) is read lazily — an executor that stores no such secrets boots
36
+ // without it — and fails closed: a missing key throws rather than persisting or returning an
37
+ // unprotected value.
38
+ class CredentialEncryption {
39
+ encrypt(plaintext) {
40
+ const iv = (0, crypto_1.randomFillSync)(new Uint8Array(IV_BYTES));
41
+ const cipher = (0, crypto_1.createCipheriv)(ALGORITHM, this.deriveKey(), iv);
42
+ const encrypted = concatBytes([
43
+ new Uint8Array(cipher.update(plaintext, 'utf8')),
44
+ new Uint8Array(cipher.final()),
45
+ ]);
46
+ const authTag = new Uint8Array(cipher.getAuthTag());
47
+ return {
48
+ ciphertext: Buffer.from(concatBytes([iv, authTag, encrypted])),
49
+ };
50
+ }
51
+ decrypt(value) {
52
+ const bytes = new Uint8Array(value);
53
+ const iv = bytes.subarray(0, IV_BYTES);
54
+ const authTag = bytes.subarray(IV_BYTES, IV_BYTES + AUTH_TAG_BYTES);
55
+ const encrypted = bytes.subarray(IV_BYTES + AUTH_TAG_BYTES);
56
+ const decipher = (0, crypto_1.createDecipheriv)(ALGORITHM, this.deriveKey(), iv);
57
+ decipher.setAuthTag(authTag);
58
+ const decrypted = concatBytes([
59
+ new Uint8Array(decipher.update(encrypted)),
60
+ new Uint8Array(decipher.final()),
61
+ ]);
62
+ return Buffer.from(decrypted).toString('utf8');
63
+ }
64
+ deriveKey() {
65
+ const secret = process.env[ENV_KEY];
66
+ if (!secret)
67
+ throw new errors_1.ExecutorEncryptionKeyMissingError();
68
+ // Empty salt is intentional: the fixed HKDF_INFO label gives domain separation and the
69
+ // single high-entropy secret needs no salt. Wrap hkdfSync's ArrayBuffer as a concrete
70
+ // Uint8Array<ArrayBuffer> to satisfy CipherKey (Buffer's ArrayBufferLike backing does not).
71
+ return new Uint8Array((0, crypto_1.hkdfSync)(HKDF_DIGEST, secret, new Uint8Array(0), HKDF_INFO, KEY_BYTES));
72
+ }
73
+ }
74
+ exports.default = CredentialEncryption;
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlZGVudGlhbC1lbmNyeXB0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NyeXB0by9jcmVkZW50aWFsLWVuY3J5cHRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFrQkEsOEVBRUM7QUFwQkQsbUNBQW9GO0FBRXBGLHNDQUE4RDtBQUU5RCxNQUFNLE9BQU8sR0FBRyxnQ0FBZ0MsQ0FBQztBQUNqRCxnR0FBZ0c7QUFDaEcsbUZBQW1GO0FBQ25GLE1BQU0sU0FBUyxHQUFHLHVDQUF1QyxDQUFDO0FBQzFELE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQztBQUM3QixNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsQ0FBQyxVQUFVO0FBQ2hDLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxDQUFDLDRCQUE0QjtBQUNqRCxNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7QUFDMUIsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDO0FBRWhDLGdHQUFnRztBQUNoRyxxR0FBcUc7QUFDckcsbUdBQW1HO0FBQ25HLG9FQUFvRTtBQUNwRSxTQUFnQixpQ0FBaUM7SUFDL0MsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLENBQUM7QUFPRCxpR0FBaUc7QUFDakcsK0RBQStEO0FBQy9ELFNBQVMsV0FBVyxDQUFDLEtBQW1CO0lBQ3RDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0RSxNQUFNLEdBQUcsR0FBRyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFFZixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3pCLEdBQUcs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
@@ -8,4 +8,5 @@ export declare const DEFAULT_STOP_TIMEOUT_S = 30;
8
8
  export declare const DEFAULT_MAX_CHAIN_DEPTH = 50;
9
9
  export declare const DEFAULT_SCHEMA_CACHE_TTL_S: number;
10
10
  export declare const DEFAULT_LOGGER_LEVEL: LoggerLevel;
11
+ export declare const DEFAULT_OAUTH_EXPIRY_SKEW_S = 60;
11
12
  //# sourceMappingURL=defaults.d.ts.map
package/dist/defaults.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DEFAULT_LOGGER_LEVEL = exports.DEFAULT_SCHEMA_CACHE_TTL_S = exports.DEFAULT_MAX_CHAIN_DEPTH = exports.DEFAULT_STOP_TIMEOUT_S = exports.DEFAULT_AI_INVOKE_TIMEOUT_S = exports.DEFAULT_STEP_TIMEOUT_S = exports.DEFAULT_POLLING_INTERVAL_S = exports.DEFAULT_FOREST_SERVER_URL = exports.DEFAULT_HTTP_PORT = void 0;
3
+ exports.DEFAULT_OAUTH_EXPIRY_SKEW_S = exports.DEFAULT_LOGGER_LEVEL = exports.DEFAULT_SCHEMA_CACHE_TTL_S = exports.DEFAULT_MAX_CHAIN_DEPTH = exports.DEFAULT_STOP_TIMEOUT_S = exports.DEFAULT_AI_INVOKE_TIMEOUT_S = exports.DEFAULT_STEP_TIMEOUT_S = exports.DEFAULT_POLLING_INTERVAL_S = exports.DEFAULT_FOREST_SERVER_URL = exports.DEFAULT_HTTP_PORT = void 0;
4
4
  exports.DEFAULT_HTTP_PORT = 3400;
5
5
  exports.DEFAULT_FOREST_SERVER_URL = 'https://api.forestadmin.com';
6
6
  exports.DEFAULT_POLLING_INTERVAL_S = 30;
@@ -10,4 +10,7 @@ exports.DEFAULT_STOP_TIMEOUT_S = 30;
10
10
  exports.DEFAULT_MAX_CHAIN_DEPTH = 50;
11
11
  exports.DEFAULT_SCHEMA_CACHE_TTL_S = 10 * 60;
12
12
  exports.DEFAULT_LOGGER_LEVEL = 'Info';
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZGVmYXVsdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRWEsUUFBQSxpQkFBaUIsR0FBRyxJQUFJLENBQUM7QUFDekIsUUFBQSx5QkFBeUIsR0FBRyw2QkFBNkIsQ0FBQztBQUMxRCxRQUFBLDBCQUEwQixHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFBLHNCQUFzQixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEMsUUFBQSwyQkFBMkIsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBQSxzQkFBc0IsR0FBRyxFQUFFLENBQUM7QUFDNUIsUUFBQSx1QkFBdUIsR0FBRyxFQUFFLENBQUM7QUFDN0IsUUFBQSwwQkFBMEIsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3JDLFFBQUEsb0JBQW9CLEdBQWdCLE1BQU0sQ0FBQyJ9
13
+ // Refresh an OAuth access token this many seconds before it actually expires, so a token never
14
+ // goes stale mid-request between the skew check and the downstream MCP call.
15
+ exports.DEFAULT_OAUTH_EXPIRY_SKEW_S = 60;
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZGVmYXVsdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRWEsUUFBQSxpQkFBaUIsR0FBRyxJQUFJLENBQUM7QUFDekIsUUFBQSx5QkFBeUIsR0FBRyw2QkFBNkIsQ0FBQztBQUMxRCxRQUFBLDBCQUEwQixHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFBLHNCQUFzQixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEMsUUFBQSwyQkFBMkIsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBQSxzQkFBc0IsR0FBRyxFQUFFLENBQUM7QUFDNUIsUUFBQSx1QkFBdUIsR0FBRyxFQUFFLENBQUM7QUFDN0IsUUFBQSwwQkFBMEIsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3JDLFFBQUEsb0JBQW9CLEdBQWdCLE1BQU0sQ0FBQztBQUN4RCwrRkFBK0Y7QUFDL0YsNkVBQTZFO0FBQ2hFLFFBQUEsMkJBQTJCLEdBQUcsRUFBRSxDQUFDIn0=
package/dist/errors.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import type { MalformedRunInfo } from './ports/workflow-port';
2
2
  import type { RecordId } from './types/validated/collection';
3
+ import type { AwaitingInputReason } from './types/validated/step-outcome';
3
4
  import type { z } from 'zod';
4
5
  export declare function causeMessage(error: unknown): string | undefined;
5
6
  export declare function extractErrorMessage(err?: unknown): string | undefined;
@@ -115,6 +116,23 @@ export declare class McpToolInvocationError extends WorkflowExecutorError {
115
116
  export declare class ConfigurationError extends Error {
116
117
  constructor(message: string);
117
118
  }
119
+ export declare class OAuthReauthRequiredError extends WorkflowExecutorError {
120
+ readonly awaitingInputReason: AwaitingInputReason;
121
+ constructor(mcpServerId: string, awaitingInputReason?: AwaitingInputReason);
122
+ }
123
+ export declare class OAuthRefreshError extends WorkflowExecutorError {
124
+ constructor(message: string, cause?: unknown);
125
+ }
126
+ export declare class OAuthInvalidGrantError extends WorkflowExecutorError {
127
+ constructor(detail?: string);
128
+ }
129
+ export declare class InvalidTokenEndpointError extends WorkflowExecutorError {
130
+ constructor(reason: string);
131
+ }
132
+ export declare class ExecutorEncryptionKeyMissingError extends Error {
133
+ readonly code = "executor_encryption_key_missing";
134
+ constructor();
135
+ }
118
136
  export declare class RunNotFoundError extends NotFoundError {
119
137
  constructor(runId: string, cause?: unknown);
120
138
  }