@forestadmin/workflow-executor 1.13.0 → 1.15.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 (61) hide show
  1. package/README.md +18 -0
  2. package/dist/adapters/ai-client-adapter.d.ts +5 -1
  3. package/dist/adapters/ai-client-adapter.js +4 -1
  4. package/dist/adapters/always-error-ai-model-port.d.ts +5 -1
  5. package/dist/adapters/always-error-ai-model-port.js +6 -1
  6. package/dist/adapters/server-ai-adapter.d.ts +5 -1
  7. package/dist/adapters/server-ai-adapter.js +4 -1
  8. package/dist/adapters/step-outcome-to-update-step-mapper.js +4 -1
  9. package/dist/build-workflow-executor.js +87 -2
  10. package/dist/crypto/credential-encryption.d.ts +10 -0
  11. package/dist/crypto/credential-encryption.js +75 -0
  12. package/dist/defaults.d.ts +1 -0
  13. package/dist/defaults.js +5 -2
  14. package/dist/errors.d.ts +22 -0
  15. package/dist/errors.js +59 -2
  16. package/dist/executors/load-related-record-step-executor.d.ts +4 -9
  17. package/dist/executors/load-related-record-step-executor.js +164 -97
  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/http/executor-http-server.d.ts +12 -0
  23. package/dist/http/executor-http-server.js +90 -1
  24. package/dist/http/mcp-oauth-credentials.d.ts +24 -0
  25. package/dist/http/mcp-oauth-credentials.js +77 -0
  26. package/dist/http/step-serializer.js +5 -2
  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/ai-model-port.d.ts +5 -1
  38. package/dist/ports/mcp-oauth-credentials-store.d.ts +24 -0
  39. package/dist/ports/mcp-oauth-credentials-store.js +3 -0
  40. package/dist/ports/run-store.d.ts +1 -0
  41. package/dist/remote-tool-fetcher.d.ts +7 -2
  42. package/dist/remote-tool-fetcher.js +53 -6
  43. package/dist/runner.d.ts +2 -0
  44. package/dist/runner.js +3 -3
  45. package/dist/stores/database-mcp-oauth-credentials-store.d.ts +22 -0
  46. package/dist/stores/database-mcp-oauth-credentials-store.js +188 -0
  47. package/dist/stores/database-store.d.ts +1 -1
  48. package/dist/stores/database-store.js +17 -50
  49. package/dist/stores/in-memory-mcp-oauth-credentials-store.d.ts +13 -0
  50. package/dist/stores/in-memory-mcp-oauth-credentials-store.js +44 -0
  51. package/dist/stores/in-memory-store.d.ts +1 -0
  52. package/dist/stores/in-memory-store.js +6 -1
  53. package/dist/stores/schema-migrations.d.ts +19 -0
  54. package/dist/stores/schema-migrations.js +69 -0
  55. package/dist/types/step-execution-data.d.ts +2 -1
  56. package/dist/types/validated/execution.d.ts +15 -6
  57. package/dist/types/validated/step-definition.d.ts +9 -6
  58. package/dist/types/validated/step-definition.js +4 -4
  59. package/dist/types/validated/step-outcome.d.ts +10 -0
  60. package/dist/types/validated/step-outcome.js +7 -2
  61. package/package.json +4 -4
@@ -15,10 +15,11 @@ Important rules:
15
15
  - Select only the tool directly relevant to the request.
16
16
  - Final answer is definitive, you won't receive any other input from the user.`;
17
17
  class McpStepExecutor extends base_step_executor_1.default {
18
- constructor(context, remoteTools, mcpServerName) {
18
+ constructor(context, remoteTools, mcpServerName, reloadWithFreshAuth) {
19
19
  super(context);
20
20
  this.remoteTools = remoteTools;
21
21
  this.mcpServerName = mcpServerName;
22
+ this.reloadWithFreshAuth = reloadWithFreshAuth;
22
23
  }
23
24
  getExtraLogContext() {
24
25
  return {
@@ -47,12 +48,43 @@ class McpStepExecutor extends base_step_executor_1.default {
47
48
  return null;
48
49
  }
49
50
  async doExecute() {
50
- // Branch A -- Re-entry after pending execution found in RunStore
51
+ try {
52
+ return await this.runStep();
53
+ }
54
+ catch (error) {
55
+ // An unrefreshable OAuth credential pauses the step for re-authentication rather than failing
56
+ // it. Clear the write-ahead marker so the resumed step is not rejected as interrupted.
57
+ if (error instanceof errors_1.OAuthReauthRequiredError) {
58
+ await this.clearReauthPauseState();
59
+ return this.buildOutcomeResult({
60
+ status: 'awaiting-input',
61
+ awaitingInputReason: error.awaitingInputReason,
62
+ });
63
+ }
64
+ throw error;
65
+ }
66
+ }
67
+ // Keep a confirmation-flow record's approved pendingData (clear only the marker) so resume replays
68
+ // it; delete a pendingData-less record, which would otherwise mis-route resume into confirmation.
69
+ async clearReauthPauseState() {
70
+ const existing = await this.findPendingExecution('mcp');
71
+ if (!existing)
72
+ return;
73
+ if (existing.pendingData) {
74
+ await this.context.runStore.saveStepExecution(this.context.runId, {
75
+ ...existing,
76
+ idempotencyPhase: undefined,
77
+ });
78
+ }
79
+ else {
80
+ await this.context.runStore.deleteStepExecution(this.context.runId, this.context.stepIndex);
81
+ }
82
+ }
83
+ async runStep() {
51
84
  const pending = await this.patchAndReloadPendingData(this.context.incomingPendingData);
52
85
  if (pending) {
53
86
  return this.handleConfirmationFlow(pending, execution => this.executeToolAndPersist(execution.pendingData, execution));
54
87
  }
55
- // Branches B & C -- First call
56
88
  const tools = this.requireTools();
57
89
  const { toolName, args } = await this.selectTool(tools);
58
90
  const selectedTool = tools.find(t => t.base.name === toolName);
@@ -60,10 +92,8 @@ class McpStepExecutor extends base_step_executor_1.default {
60
92
  throw new errors_1.McpToolNotFoundError(toolName);
61
93
  const target = { name: toolName, sourceId: selectedTool.sourceId, input: args };
62
94
  if (this.context.stepDefinition.executionType === step_definition_1.StepExecutionMode.FullyAutomated) {
63
- // Branch B -- direct execution
64
95
  return this.executeToolAndPersist(target);
65
96
  }
66
- // Branch C -- Awaiting confirmation
67
97
  await this.context.runStore.saveStepExecution(this.context.runId, {
68
98
  type: 'mcp',
69
99
  stepIndex: this.context.stepIndex,
@@ -83,14 +113,7 @@ class McpStepExecutor extends base_step_executor_1.default {
83
113
  collectionId: this.context.collectionId,
84
114
  recordId: this.context.baseRecordRef.recordId,
85
115
  }, {
86
- operation: async () => {
87
- try {
88
- return await tool.base.invoke(target.input);
89
- }
90
- catch (cause) {
91
- throw new errors_1.McpToolInvocationError(target.name, cause);
92
- }
93
- },
116
+ operation: () => this.invokeWithReauthRetry(tool, target),
94
117
  beforeCall: () => this.context.runStore.saveStepExecution(this.context.runId, {
95
118
  ...existingExecution,
96
119
  type: 'mcp',
@@ -140,6 +163,47 @@ class McpStepExecutor extends base_step_executor_1.default {
140
163
  }
141
164
  return this.buildOutcomeResult({ status: 'success' });
142
165
  }
166
+ // No-op for bearer/none steps (no reloadWithFreshAuth). For an OAuth2 step, a 401 on the call means
167
+ // the token was rejected after listing tools succeeded: force one refresh, rebuild the tool, retry
168
+ // once. A second 401 pauses the step for re-authentication.
169
+ async invokeWithReauthRetry(tool, target) {
170
+ try {
171
+ return await tool.base.invoke(target.input);
172
+ }
173
+ catch (cause) {
174
+ if (!this.reloadWithFreshAuth || !(0, ai_proxy_1.isMcpAuthError)(cause)) {
175
+ throw new errors_1.McpToolInvocationError(target.name, cause);
176
+ }
177
+ let refreshedTools;
178
+ try {
179
+ refreshedTools = await this.reloadWithFreshAuth();
180
+ }
181
+ catch (refreshError) {
182
+ // A non-auth refresh failure means nothing ran (the first call was a rejected 401), so clear
183
+ // the write-ahead marker to keep the step retryable; OAuthReauthRequiredError still pauses.
184
+ if (!(refreshError instanceof errors_1.OAuthReauthRequiredError)) {
185
+ await this.clearReauthPauseState();
186
+ }
187
+ throw refreshError;
188
+ }
189
+ const refreshedTool = refreshedTools.find(t => t.base.name === target.name && t.sourceId === target.sourceId);
190
+ if (!refreshedTool) {
191
+ // The 401 first call never ran and the reload yielded no tool (empty on a connection
192
+ // failure), so clear the marker to keep the step retryable rather than wedged.
193
+ await this.clearReauthPauseState();
194
+ throw new errors_1.McpToolNotFoundError(target.name);
195
+ }
196
+ try {
197
+ return await refreshedTool.base.invoke(target.input);
198
+ }
199
+ catch (retryCause) {
200
+ if ((0, ai_proxy_1.isMcpAuthError)(retryCause)) {
201
+ throw new errors_1.OAuthReauthRequiredError(this.context.stepDefinition.mcpServerId);
202
+ }
203
+ throw new errors_1.McpToolInvocationError(target.name, retryCause);
204
+ }
205
+ }
206
+ }
143
207
  async formatToolResult(tool, toolResult) {
144
208
  if (toolResult === null || toolResult === undefined)
145
209
  return null;
@@ -185,4 +249,4 @@ class McpStepExecutor extends base_step_executor_1.default {
185
249
  }
186
250
  }
187
251
  exports.default = McpStepExecutor;
188
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWNwLXN0ZXAtZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXhlY3V0b3JzL21jcC1zdGVwLWV4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBTUEsb0RBQTJGO0FBQzNGLDZCQUF3QjtBQUV4QixzQ0FLbUI7QUFDbkIsOEVBQW9EO0FBQ3BELHdFQUF1RTtBQUV2RSxNQUFNLHNCQUFzQixHQUFHOzs7OzsrRUFLZ0QsQ0FBQztBQUVoRixNQUFxQixlQUFnQixTQUFRLDRCQUFtQztJQUs5RSxZQUNFLE9BQTRDLEVBQzVDLFdBQWtDLEVBQ2xDLGFBQXNCO1FBRXRCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO0lBQ3JDLENBQUM7SUFFa0Isa0JBQWtCO1FBQ25DLE9BQU87WUFDTCxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsV0FBVztZQUNwRCxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7U0FDbEMsQ0FBQztJQUNKLENBQUM7SUFFUyxrQkFBa0IsQ0FBQyxPQUc1QjtRQUNDLE9BQU87WUFDTCxXQUFXLEVBQUU7Z0JBQ1gsSUFBSSxFQUFFLEtBQUs7Z0JBQ1gsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTTtnQkFDM0IsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUztnQkFDakMsR0FBRyxPQUFPO2FBQ1g7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVrQixLQUFLLENBQUMsZ0JBQWdCO1FBQ3ZDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUF1QixLQUFLLENBQUMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsRUFBRSxnQkFBZ0IsS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUMxQyxPQUFPLElBQUks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
252
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWNwLXN0ZXAtZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXhlY3V0b3JzL21jcC1zdGVwLWV4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBTUEsb0RBSytCO0FBQy9CLDZCQUF3QjtBQUV4QixzQ0FNbUI7QUFDbkIsOEVBQW9EO0FBQ3BELHdFQUF1RTtBQUV2RSxNQUFNLHNCQUFzQixHQUFHOzs7OzsrRUFLZ0QsQ0FBQztBQUVoRixNQUFxQixlQUFnQixTQUFRLDRCQUFtQztJQU85RSxZQUNFLE9BQTRDLEVBQzVDLFdBQWtDLEVBQ2xDLGFBQXNCLEVBQ3RCLG1CQUFpRDtRQUVqRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUM7SUFDakQsQ0FBQztJQUVrQixrQkFBa0I7UUFDbkMsT0FBTztZQUNMLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxXQUFXO1lBQ3BELGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtTQUNsQyxDQUFDO0lBQ0osQ0FBQztJQUVTLGtCQUFrQixDQUFDLE9BSTVCO1FBQ0MsT0FBTztZQUNMLFdBQVcsRUFBRTtnQkFDWCxJQUFJLEVBQUUsS0FBSztnQkFDWCxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNO2dCQUMzQixTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTO2dCQUNqQyxHQUFHLE9BQU87YUFDWDtTQUNGLENBQUM7SUFDSixDQUFDO0lBRWtCLEtBQUssQ0FBQyxnQkFBZ0I7UUFDdkMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQXVCLEtBQUssQ0FBQyxDQUFDO1FBRTlFLElBQUks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
@@ -18,7 +18,7 @@ export interface StepContextConfig {
18
18
  aiInvokeTimeoutS?: number;
19
19
  }
20
20
  export default class StepExecutorFactory {
21
- static create(step: AvailableStepExecution, contextConfig: StepContextConfig, activityLogPort: ActivityLogPort, fetchRemoteTools: (mcpServerId: string) => Promise<FetchRemoteToolsResult>, incomingPendingData?: unknown, forestServerToken?: string): Promise<IStepExecutor>;
21
+ static create(step: AvailableStepExecution, contextConfig: StepContextConfig, activityLogPort: ActivityLogPort, fetchRemoteTools: (mcpServerId: string, userId: number) => Promise<FetchRemoteToolsResult>, incomingPendingData?: unknown, forestServerToken?: string): Promise<IStepExecutor>;
22
22
  private static buildContext;
23
23
  }
24
24
  //# sourceMappingURL=step-executor-factory.d.ts.map
@@ -33,8 +33,8 @@ class StepExecutorFactory {
33
33
  return new load_related_record_step_executor_1.default(context);
34
34
  case step_definition_1.StepType.Mcp: {
35
35
  const mcpContext = context;
36
- const { tools, mcpServerName } = await fetchRemoteTools(mcpContext.stepDefinition.mcpServerId);
37
- return new mcp_step_executor_1.default(mcpContext, tools, mcpServerName);
36
+ const { tools, mcpServerName, reloadWithFreshAuth } = await fetchRemoteTools(mcpContext.stepDefinition.mcpServerId, step.user.id);
37
+ return new mcp_step_executor_1.default(mcpContext, tools, mcpServerName, reloadWithFreshAuth);
38
38
  }
39
39
  case step_definition_1.StepType.Guidance:
40
40
  return new guidance_step_executor_1.default(context);
@@ -43,6 +43,27 @@ class StepExecutorFactory {
43
43
  }
44
44
  }
45
45
  catch (error) {
46
+ // Re-auth required while loading tools is an expected pause, not a failure: emit awaiting-input
47
+ // with the typed reason so the user can reconnect, rather than erroring the step.
48
+ if (error instanceof errors_1.OAuthReauthRequiredError) {
49
+ contextConfig.logger('Info', 'MCP step paused for OAuth re-authentication', {
50
+ runId: step.runId,
51
+ stepId: step.stepId,
52
+ stepIndex: step.stepIndex,
53
+ awaitingInputReason: error.awaitingInputReason,
54
+ });
55
+ return {
56
+ execute: async () => ({
57
+ stepOutcome: {
58
+ type: 'mcp',
59
+ stepId: step.stepId,
60
+ stepIndex: step.stepIndex,
61
+ status: 'awaiting-input',
62
+ awaitingInputReason: error.awaitingInputReason,
63
+ },
64
+ }),
65
+ };
66
+ }
46
67
  contextConfig.logger('Error', 'Step execution failed unexpectedly', {
47
68
  runId: step.runId,
48
69
  stepId: step.stepId,
@@ -100,4 +121,4 @@ class StepExecutorFactory {
100
121
  }
101
122
  }
102
123
  exports.default = StepExecutorFactory;
103
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1leGVjdXRvci1mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2V4ZWN1dG9ycy9zdGVwLWV4ZWN1dG9yLWZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUF3QkEsc0NBS21CO0FBQ25CLHlFQUFnRDtBQUNoRCxrRUFBeUM7QUFDekMsc0VBQTRDO0FBQzVDLHdGQUE4RDtBQUM5RCxzRkFBNEQ7QUFDNUQsNEdBQWdGO0FBQ2hGLDRFQUFrRDtBQUNsRCw0RkFBaUU7QUFDakUsZ0hBQW9GO0FBQ3BGLGdHQUFxRTtBQUNyRSx3RUFBOEQ7QUFDOUQsa0VBQXdFO0FBYXhFLE1BQXFCLG1CQUFtQjtJQUN0QyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FDakIsSUFBNEIsRUFDNUIsYUFBZ0MsRUFDaEMsZUFBZ0MsRUFDaEMsZ0JBQTBFLEVBQzFFLG1CQUE2QixFQUM3QixpQkFBMEI7UUFFMUIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUMsWUFBWSxDQUM5QyxJQUFJLEVBQ0osYUFBYSxFQUNiLGVBQWUsRUFDZixtQkFBbUIsRUFDbkIsaUJBQWlCLENBQ2xCLENBQUM7WUFFRixRQUFRLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2pDLEtBQUssMEJBQVEsQ0FBQyxTQUFTO29CQUNyQixPQUFPLElBQUksaUNBQXFCLENBQUMsT0FBb0QsQ0FBQyxDQUFDO2dCQUN6RixLQUFLLDBCQUFRLENBQUMsVUFBVTtvQkFDdEIsT0FBTyxJQUFJLG1DQUFzQixDQUFDLE9BQXFELENBQUMsQ0FBQztnQkFDM0YsS0FBSywwQkFBUSxDQUFDLFlBQVk7b0JBQ3hCLE9BQU8sSUFBSSxxQ0FBd0IsQ0FDakMsT0FBdUQsQ0FDeEQsQ0FBQztnQkFDSixLQUFLLDBCQUFRLENBQUMsYUFBYTtvQkFDekIsT0FBTyxJQUFJLDZDQUErQixDQUN4QyxPQUF3RCxDQUN6RCxD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
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1leGVjdXRvci1mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2V4ZWN1dG9ycy9zdGVwLWV4ZWN1dG9yLWZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUF3QkEsc0NBTW1CO0FBQ25CLHlFQUFnRDtBQUNoRCxrRUFBeUM7QUFDekMsc0VBQTRDO0FBQzVDLHdGQUE4RDtBQUM5RCxzRkFBNEQ7QUFDNUQsNEdBQWdGO0FBQ2hGLDRFQUFrRDtBQUNsRCw0RkFBaUU7QUFDakUsZ0hBQW9GO0FBQ3BGLGdHQUFxRTtBQUNyRSx3RUFBOEQ7QUFDOUQsa0VBQXdFO0FBYXhFLE1BQXFCLG1CQUFtQjtJQUN0QyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FDakIsSUFBNEIsRUFDNUIsYUFBZ0MsRUFDaEMsZUFBZ0MsRUFDaEMsZ0JBQTBGLEVBQzFGLG1CQUE2QixFQUM3QixpQkFBMEI7UUFFMUIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUMsWUFBWSxDQUM5QyxJQUFJLEVBQ0osYUFBYSxFQUNiLGVBQWUsRUFDZixtQkFBbUIsRUFDbkIsaUJBQWlCLENBQ2xCLENBQUM7WUFFRixRQUFRLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2pDLEtBQUssMEJBQVEsQ0FBQyxTQUFTO29CQUNyQixPQUFPLElBQUksaUNBQXFCLENBQUMsT0FBb0QsQ0FBQyxDQUFDO2dCQUN6RixLQUFLLDBCQUFRLENBQUMsVUFBVTtvQkFDdEIsT0FBTyxJQUFJLG1DQUFzQixDQUFDLE9BQXFELENBQUMsQ0FBQztnQkFDM0YsS0FBSywwQkFBUSxDQUFDLFlBQVk7b0JBQ3hCLE9BQU8sSUFBSSxxQ0FBd0IsQ0FDakMsT0FBdUQsQ0FDeEQsQ0FBQztnQkFDSixLQUFLLDBCQUFRLENBQUMsYUFBYTtvQkFDekIsT0FBTyxJQUFJLDZDQUErQixDQUN4QyxPQUF3RCxDQUN6RCxD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
@@ -1,5 +1,9 @@
1
+ import type CredentialEncryption from '../crypto/credential-encryption';
2
+ import type OAuthTokenService from '../oauth/token-service';
1
3
  import type { Logger } from '../ports/logger-port';
4
+ import type { McpOAuthCredentialsStore } from '../ports/mcp-oauth-credentials-store';
2
5
  import type { WorkflowPort } from '../ports/workflow-port';
6
+ import type RemoteToolFetcher from '../remote-tool-fetcher';
3
7
  import type Runner from '../runner';
4
8
  import http from 'http';
5
9
  export interface ExecutorHttpServerOptions {
@@ -8,11 +12,16 @@ export interface ExecutorHttpServerOptions {
8
12
  authSecret: string;
9
13
  workflowPort: WorkflowPort;
10
14
  logger?: Logger;
15
+ mcpOAuthCredentialsStore: McpOAuthCredentialsStore;
16
+ credentialEncryption: CredentialEncryption;
17
+ remoteToolFetcher: RemoteToolFetcher;
18
+ oauthTokenService?: OAuthTokenService;
11
19
  }
12
20
  export default class ExecutorHttpServer {
13
21
  private readonly app;
14
22
  private readonly options;
15
23
  private readonly logger;
24
+ private readonly mcpOAuthCredentialsStore;
16
25
  private server;
17
26
  constructor(options: ExecutorHttpServerOptions);
18
27
  start(): Promise<void>;
@@ -21,5 +30,8 @@ export default class ExecutorHttpServer {
21
30
  private hasRunAccessMiddleware;
22
31
  private handleGetRun;
23
32
  private handleTrigger;
33
+ private handleDepositCredentials;
34
+ private handleDeleteCredentials;
35
+ private handleListMcpTools;
24
36
  }
25
37
  //# sourceMappingURL=executor-http-server.d.ts.map
@@ -10,6 +10,7 @@ const koa_1 = __importDefault(require("koa"));
10
10
  const koa_jwt_1 = __importDefault(require("koa-jwt"));
11
11
  const bearer_claims_1 = require("./bearer-claims");
12
12
  const http_errors_1 = require("./http-errors");
13
+ const mcp_oauth_credentials_1 = require("./mcp-oauth-credentials");
13
14
  const step_serializer_1 = __importDefault(require("./step-serializer"));
14
15
  const console_logger_1 = __importDefault(require("../adapters/console-logger"));
15
16
  const errors_1 = require("../errors");
@@ -20,6 +21,7 @@ class ExecutorHttpServer {
20
21
  this.server = null;
21
22
  this.options = options;
22
23
  this.logger = options.logger ?? (0, console_logger_1.default)();
24
+ this.mcpOAuthCredentialsStore = options.mcpOAuthCredentialsStore;
23
25
  this.app = new koa_1.default();
24
26
  this.app.use(async (ctx, next) => {
25
27
  ctx.set('X-Executor-Version', version);
@@ -97,10 +99,17 @@ class ExecutorHttpServer {
97
99
  // Trigger handles its own authz by comparing bearer user with step.user.
98
100
  router.get('/runs/:runId', this.hasRunAccessMiddleware.bind(this), this.handleGetRun.bind(this));
99
101
  router.post('/runs/:runId/trigger', this.handleTrigger.bind(this));
102
+ const { mcpOAuthCredentialsStore: credentialsStore, credentialEncryption, remoteToolFetcher, } = this.options;
103
+ // Design-time tool listing for the MCP-server details page: resolve the caller's vault
104
+ // credential, refresh, and list the oauth2 server's tools — no workflow run involved.
105
+ router.get('/list-mcp-tools', ctx => this.handleListMcpTools(ctx, remoteToolFetcher));
106
+ router.post('/mcp-oauth-credentials', ctx => this.handleDepositCredentials(ctx, credentialsStore, credentialEncryption));
107
+ router.delete('/mcp-oauth-credentials/:mcpServerId', ctx => this.handleDeleteCredentials(ctx, credentialsStore));
100
108
  this.app.use(router.routes());
101
109
  this.app.use(router.allowedMethods());
102
110
  }
103
111
  async start() {
112
+ await this.mcpOAuthCredentialsStore.init(this.logger);
104
113
  return new Promise((resolve, reject) => {
105
114
  this.server = http_1.default.createServer(this.app.callback());
106
115
  this.server.once('error', reject);
@@ -161,6 +170,86 @@ class ExecutorHttpServer {
161
170
  ctx.status = 200;
162
171
  ctx.body = { triggered: true };
163
172
  }
173
+ async handleDepositCredentials(ctx, store, encryption) {
174
+ const userId = ctx.state.user.id;
175
+ const parsed = mcp_oauth_credentials_1.depositCredentialsBodySchema.safeParse(ctx.request.body ?? {});
176
+ if (!parsed.success) {
177
+ const details = parsed.error.issues
178
+ .map(issue => `${issue.path.join('.') || 'body'}: ${issue.message}`)
179
+ .join('; ');
180
+ throw new http_errors_1.BadRequestHttpError(`Invalid request body — ${details}`);
181
+ }
182
+ try {
183
+ await store.upsert((0, mcp_oauth_credentials_1.buildMcpOAuthCredentialInput)({ body: parsed.data, userId, encryption }));
184
+ }
185
+ catch (err) {
186
+ // The frontend must tell this missing-key config error apart from a generic failure (to route
187
+ // the user to an admin rather than retry), so it returns a typed { code } the middleware won't.
188
+ if (err instanceof errors_1.ExecutorEncryptionKeyMissingError) {
189
+ ctx.status = 503;
190
+ ctx.body = { code: err.code };
191
+ return;
192
+ }
193
+ throw err;
194
+ }
195
+ // Evict any cached access token so a reconnect/re-deposit takes effect immediately, instead of
196
+ // serving the token minted from the previous credential until it expires (mirrors delete).
197
+ this.options.oauthTokenService?.evict(userId, parsed.data.mcpServerId);
198
+ ctx.status = 200;
199
+ ctx.body = { stored: true };
200
+ }
201
+ async handleDeleteCredentials(ctx, store) {
202
+ const userId = ctx.state.user.id;
203
+ await store.delete(userId, ctx.params.mcpServerId);
204
+ // Evict any in-process cached access token so the disconnect is immediate, not deferred until
205
+ // the cached token expires (the row is gone, but the runtime would otherwise still serve it).
206
+ this.options.oauthTokenService?.evict(userId, ctx.params.mcpServerId);
207
+ ctx.status = 204;
208
+ }
209
+ // Design-time tool listing: resolve the caller's vault credential for the target oauth2 server,
210
+ // refresh + inject the Bearer, and return the server's tool definitions. user_id comes from the
211
+ // validated JWT, so a caller only ever lists with their own stored credential. A missing/dead
212
+ // credential surfaces as a typed needs-oauth-reauth response (not a generic error or empty list)
213
+ // so the details page can prompt a reconnect — mirroring the run path's awaiting-input reason.
214
+ async handleListMcpTools(ctx, fetcher) {
215
+ const userId = ctx.state.user.id;
216
+ const { mcpServerId } = ctx.query;
217
+ if (typeof mcpServerId !== 'string' || mcpServerId.length === 0) {
218
+ throw new http_errors_1.BadRequestHttpError('Missing required query parameter "mcpServerId"');
219
+ }
220
+ try {
221
+ const { tools, mcpServerName, loadFailed } = await fetcher.fetch(mcpServerId, userId);
222
+ // A dead or misrouted server otherwise renders as an (indistinguishable) empty tool list, so
223
+ // surface it — mirroring the run path, which errors rather than executing against no tools.
224
+ if (!mcpServerName) {
225
+ throw new http_errors_1.NotFoundHttpError(`No MCP server is configured for id "${mcpServerId}"`);
226
+ }
227
+ if (loadFailed) {
228
+ throw new http_errors_1.ServiceUnavailableHttpError('The MCP server could not be reached to list its tools');
229
+ }
230
+ ctx.status = 200;
231
+ ctx.body = {
232
+ tools: tools.map(tool => ({ name: tool.base.name, description: tool.base.description })),
233
+ };
234
+ }
235
+ catch (err) {
236
+ // Set the body directly so the error middleware (which would map this to a generic 400 and
237
+ // drop the typed reason) doesn't touch it — the frontend needs the reason to prompt reconnect.
238
+ if (err instanceof errors_1.OAuthReauthRequiredError) {
239
+ ctx.status = 409;
240
+ ctx.body = { awaitingInputReason: err.awaitingInputReason, mcpServerId };
241
+ return;
242
+ }
243
+ // Key-missing is an operator misconfig, not re-consent-resolvable: return the same typed 503
244
+ // the deposit endpoint uses so the details page shows the admin message, not a generic error.
245
+ if (err instanceof errors_1.ExecutorEncryptionKeyMissingError) {
246
+ ctx.status = 503;
247
+ ctx.body = { code: err.code };
248
+ return;
249
+ }
250
+ throw err;
251
+ }
252
+ }
164
253
  }
165
254
  exports.default = ExecutorHttpServer;
166
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0b3ItaHR0cC1zZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaHR0cC9leGVjdXRvci1odHRwLXNlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUtBLGlFQUF5QztBQUN6Qyx5REFBaUM7QUFDakMsZ0RBQXdCO0FBQ3hCLDhDQUFzQjtBQUN0QixzREFBNkI7QUFFN0IsbURBQXdFO0FBQ3hFLCtDQUt1QjtBQUN2Qix3RUFBcUQ7QUFDckQsZ0ZBQTZEO0FBQzdELHNDQUFnRDtBQUVoRCx5R0FBeUc7QUFDekcsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBd0IsQ0FBQztBQVV6RSxNQUFxQixrQkFBa0I7SUFNckMsWUFBWSxPQUFrQztRQUZ0QyxXQUFNLEdBQWtCLElBQUksQ0FBQztRQUduQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksSUFBQSx3QkFBbUIsR0FBRSxDQUFDO1FBQ3RELElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxhQUFHLEVBQUUsQ0FBQztRQUVyQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQy9CLEdBQUcsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDdkMsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUNmLENBQUMsQ0FBQyxDQUFDO1FBRUgsdUZBQXVGO1FBQ3ZGLDRGQUE0RjtRQUM1RixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQy9CLElBQUksQ0FBQztnQkFDSCxNQUFNLElBQUksRUFBRSxDQUFDO1lBQ2YsQ0FBQztZQUFDLE9BQU8sR0FBWSxFQUFFLENBQUM7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
255
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0b3ItaHR0cC1zZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaHR0cC9leGVjdXRvci1odHRwLXNlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQVNBLGlFQUF5QztBQUN6Qyx5REFBaUM7QUFDakMsZ0RBQXdCO0FBQ3hCLDhDQUFzQjtBQUN0QixzREFBNkI7QUFFN0IsbURBQXdFO0FBQ3hFLCtDQU91QjtBQUN2QixtRUFHaUM7QUFDakMsd0VBQXFEO0FBQ3JELGdGQUE2RDtBQUM3RCxzQ0FJbUI7QUFFbkIseUdBQXlHO0FBQ3pHLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQXdCLENBQUM7QUFnQnpFLE1BQXFCLGtCQUFrQjtJQU9yQyxZQUFZLE9BQWtDO1FBRnRDLFdBQU0sR0FBa0IsSUFBSSxDQUFDO1FBR25DLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxJQUFBLHdCQUFtQixHQUFFLENBQUM7UUFDdEQsSUFBSSxDQUFDLHdCQUF3QixHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQztRQUNqRSxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksYUFBRyxFQUFFLENBQUM7UUFFckIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUMvQixHQUFHLENBQUMsR0FBRyxDQUFDLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFDZixDQUFDLENBQUMsQ0FBQztRQUVILHVGQUF1RjtRQUN2Riw0RkFBNEY7UUFDNUYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUMvQixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLEVBQUUsQ0FBQztZQUNmLENBQUM7WUFBQyxPQUFPLEdBQVksRUFBRSxDQUFDO2dCQUN0QixNQUFNLFNBQVMsR0FBRyxJQUFBLHlCQUFXLEVBQUMsR0FBRyxDQUFDLENBQUM7Z0JBRW5DLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDZixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRTt3QkFDM0MsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNO3dCQUNsQixJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUk7d0JBQ2QsS0FBSyxFQUFFLElBQUEsNEJBQW1CLEVBQUMsR0FBRyxDQUFDO3dCQUMvQixLQUFLLEVBQUUsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUztxQkFDcEQsQ0FBQyxDQUFDO29CQUNILEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO29CQUNqQixHQUFHLENBQUMsSUFBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLENBQUM7b0JBRTlDLE9BQU87Z0JBQ1QsQ0FBQztnQkFFRCxJQUFJLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDbEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUscUJBQXFCLEVBQUU7d0JBQzFDLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTt3QkFDbEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO3dCQUNkLE1BQU0sRUFBRSxTQUFTLENBQUMsTUFBTTt3QkFDeEIsS0FBSyxFQUFFLElBQUEsNEJBQW1CLEVBQUMsU0FBUyxDQUFDLEtBQUssSUFBSSxTQUFTLENBQUM7d0JBQ3hELGtGQUFrRjt3QkFDbEYsbUZBQW1GO3dCQUNuRixLQUFLLEVBQ0gsQ0FBQyxTQUFTLENBQUMsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQzs0QkFDdEUsU0FBUyxDQUFDLEtBQUs7cUJBQ2xCLENBQUMsQ0FBQztnQkFDTCxDQUFDO2dCQUVELEdBQUcsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztnQkFDOUIsR0FBRyxDQUFDLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDOUMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsNEZBQTRGO1FBQzVGLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDL0IsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEtBQUssSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNuRCxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7Z0JBQ3RDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFDckUsR0FBRyxDQUFDLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDO2dCQUVyQixPQUFPO1lBQ1QsQ0FBQztZQUVELE1BQU0sSUFBSSxFQUFFLENBQUM7UUFDZixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUEsb0JBQVUsR0FBRSxDQUFDLENBQUM7UUFFM0IsMkRBQTJEO1FBQzNELDZGQUE2RjtRQUM3RixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FDVixJQUFBLGlCQUFNLEVBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsc0JBQXNCLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQzdGLENBQUM7UUFFRiwyRkFBMkY7UUFDM0YsMkZBQTJGO1FBQzNGLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDL0IsTUFBTSxNQUFNLEdBQUcsa0NBQWtCLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFNUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDcEIsd0ZBQXdGO2dCQUN4RiwwRkFBMEY7Z0JBQzFGLHFGQUFxRjtnQkFDckYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsaUNBQWlDLEVBQUU7b0JBQ3JELE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTtvQkFDbEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO29CQUNkLE1BQU0sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2lCQUNuRixDQUFDLENBQUM7Z0JBRUgsTUFBTSxJQUFJLG1DQUFxQixFQUFFLENBQUM7WUFDcEMsQ0FBQztZQUVELEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUV2RCxNQUFNLElBQUksRUFBRSxDQUFDO1FBQ2YsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLE1BQU0sR0FBRyxJQUFJLGdCQUFNLEVBQUUsQ0FBQztRQUU1Qiw4REFBOEQ7UUFDOUQseUVBQXlFO1FBQ3pFLE1BQU0sQ0FBQyxHQUFHLENBQ1IsY0FBYyxFQUNkLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQ3RDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUM3QixDQUFDO1FBQ0YsTUFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRW5FLE1BQU0sRUFDSix3QkFBd0IsRUFBRSxnQkFBZ0IsRUFDMUMsb0JBQW9CLEVBQ3BCLGlCQUFpQixHQUNsQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFFakIsdUZBQXVGO1FBQ3ZGLHNGQUFzRjtRQUN0RixNQUFNLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7UUFFdEYsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUMxQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsR0FBRyxFQUFFLGdCQUFnQixFQUFFLG9CQUFvQixDQUFDLENBQzNFLENBQUM7UUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLHFDQUFxQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQ3pELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUMsQ0FDcEQsQ0FBQztRQUVGLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxLQUFLLENBQUMsS0FBSztRQUNULE1BQU0sSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFdEQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyQyxJQUFJLENBQUMsTUFBTSxHQUFHLGNBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSTtRQUNSLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDakIsT0FBTyxFQUFFLENBQUM7Z0JBRVYsT0FBTztZQUNULENBQUM7WUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDdEIsSUFBSSxHQUFHLEVBQUUsQ0FBQztvQkFDUixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2QsQ0FBQztxQkFBTSxDQUFDO29CQUNOLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO29CQUNuQixPQUFPLEVBQUUsQ0FBQztnQkFDWixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVPLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxHQUFnQixFQUFFLElBQWM7UUFDbkUsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFvQixDQUFDO1FBQzVDLElBQUksT0FBZ0IsQ0FBQztRQUVyQixJQUFJLENBQUM7WUFDSCxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakYsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRTtnQkFDakQsS0FBSyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSztnQkFDdkIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNO2dCQUNsQixJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUk7Z0JBQ2QsS0FBSyxFQUFFLElBQUEsNEJBQW1CLEVBQUMsR0FBRyxDQUFDO2dCQUMvQixLQUFLLEVBQUUsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUzthQUNwRCxDQUFDLENBQUM7WUFFSCxrRUFBa0U7WUFDbEUsTUFBTSxJQUFJLHlDQUEyQixDQUFDLHFCQUFxQixFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDL0UsQ0FBQztRQUVELElBQUksQ0FBQyxPQUFPO1lBQUUsTUFBTSxJQUFJLGdDQUFrQixFQUFFLENBQUM7UUFFN0MsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUNmLENBQUM7SUFFTyxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQWdCO1FBQ3pDLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvRSxHQUFHLENBQUMsSUFBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMseUJBQW9CLENBQUMsRUFBRSxDQUFDO0lBQ3hELENBQUM7SUFFTyxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQWdCO1FBQzFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO1FBQzdCLHVEQUF1RDtRQUN2RCxNQUFNLFlBQVksR0FBSSxHQUFHLENBQUMsS0FBSyxDQUFDLElBQXFCLENBQUMsRUFBRSxDQUFDO1FBRXpELE1BQU0sV0FBVyxHQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBa0MsRUFBRSxXQUFXLENBQUM7UUFFakYsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7UUFFNUUsR0FBRyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFDakIsR0FBRyxDQUFDLElBQUksR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRU8sS0FBSyxDQUFDLHdCQUF3QixDQUNwQyxHQUFnQixFQUNoQixLQUErQixFQUMvQixVQUFnQztRQUVoQyxNQUFNLE1BQU0sR0FBSSxHQUFHLENBQUMsS0FBSyxDQUFDLElBQXFCLENBQUMsRUFBRSxDQUFDO1FBQ25ELE1BQU0sTUFBTSxHQUFHLG9EQUE0QixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztRQUU5RSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3BCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTTtpQkFDaEMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxNQUFNLEtBQUssS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO2lCQUNuRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFZCxNQUFNLElBQUksaUNBQW1CLENBQUMsMEJBQTBCLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFBLG9EQUE0QixFQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5RixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLDhGQUE4RjtZQUM5RixnR0FBZ0c7WUFDaEcsSUFBSSxHQUFHLFlBQVksMENBQWlDLEVBQUUsQ0FBQztnQkFDckQsR0FBRyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7Z0JBQ2pCLEdBQUcsQ0FBQyxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUU5QixPQUFPO1lBQ1QsQ0FBQztZQUVELE1BQU0sR0FBRyxDQUFDO1FBQ1osQ0FBQztRQUVELCtGQUErRjtRQUMvRiwyRkFBMkY7UUFDM0YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdkUsR0FBRyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFDakIsR0FBRyxDQUFDLElBQUksR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRU8sS0FBSyxDQUFDLHVCQUF1QixDQUNuQyxHQUFnQixFQUNoQixLQUErQjtRQUUvQixNQUFNLE1BQU0sR0FBSSxHQUFHLENBQUMsS0FBSyxDQUFDLElBQXFCLENBQUMsRUFBRSxDQUFDO1FBRW5ELE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuRCw4RkFBOEY7UUFDOUYsOEZBQThGO1FBQzlGLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3RFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO0lBQ25CLENBQUM7SUFFRCxnR0FBZ0c7SUFDaEcsZ0dBQWdHO0lBQ2hHLDhGQUE4RjtJQUM5RixpR0FBaUc7SUFDakcsK0ZBQStGO0lBQ3ZGLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxHQUFnQixFQUFFLE9BQTBCO1FBQzNFLE1BQU0sTUFBTSxHQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBcUIsQ0FBQyxFQUFFLENBQUM7UUFDbkQsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7UUFFbEMsSUFBSSxPQUFPLFdBQVcsS0FBSyxRQUFRLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNoRSxNQUFNLElBQUksaUNBQW1CLENBQUMsZ0RBQWdELENBQUMsQ0FBQztRQUNsRixDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLEdBQUcsTUFBTSxPQUFPLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV0Riw2RkFBNkY7WUFDN0YsNEZBQTRGO1lBQzVGLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDbkIsTUFBTSxJQUFJLCtCQUFpQixDQUFDLHVDQUF1QyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1lBQ3JGLENBQUM7WUFFRCxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUNmLE1BQU0sSUFBSSx5Q0FBMkIsQ0FDbkMsdURBQXVELENBQ3hELENBQUM7WUFDSixDQUFDO1lBRUQsR0FBRyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7WUFDakIsR0FBRyxDQUFDLElBQUksR0FBRztnQkFDVCxLQUFLLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQzthQUN6RixDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYiwyRkFBMkY7WUFDM0YsK0ZBQStGO1lBQy9GLElBQUksR0FBRyxZQUFZLGlDQUF3QixFQUFFLENBQUM7Z0JBQzVDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO2dCQUNqQixHQUFHLENBQUMsSUFBSSxHQUFHLEVBQUUsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxDQUFDO2dCQUV6RSxPQUFPO1lBQ1QsQ0FBQztZQUVELDZGQUE2RjtZQUM3Riw4RkFBOEY7WUFDOUYsSUFBSSxHQUFHLFlBQVksMENBQWlDLEVBQUUsQ0FBQztnQkFDckQsR0FBRyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7Z0JBQ2pCLEdBQUcsQ0FBQyxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUU5QixPQUFPO1lBQ1QsQ0FBQztZQUVELE1BQU0sR0FBRyxDQUFDO1FBQ1osQ0FBQztJQUNILENBQUM7Q0FDRjtBQTFURCxxQ0EwVEMifQ==
@@ -0,0 +1,24 @@
1
+ import type CredentialEncryption from '../crypto/credential-encryption';
2
+ import type { McpOAuthCredentialInput } from '../ports/mcp-oauth-credentials-store';
3
+ import { z } from 'zod';
4
+ export declare const depositCredentialsBodySchema: z.ZodObject<{
5
+ mcpServerId: z.ZodString;
6
+ refreshToken: z.ZodString;
7
+ clientId: z.ZodOptional<z.ZodString>;
8
+ clientSecret: z.ZodOptional<z.ZodString>;
9
+ clientSecretExpiresAt: z.ZodOptional<z.ZodString>;
10
+ tokenEndpoint: z.ZodString;
11
+ tokenEndpointAuthMethod: z.ZodOptional<z.ZodEnum<{
12
+ client_secret_post: "client_secret_post";
13
+ client_secret_basic: "client_secret_basic";
14
+ none: "none";
15
+ }>>;
16
+ scopes: z.ZodOptional<z.ZodString>;
17
+ }, z.core.$strict>;
18
+ export type DepositCredentialsBody = z.infer<typeof depositCredentialsBodySchema>;
19
+ export declare function buildMcpOAuthCredentialInput({ body, userId, encryption, }: {
20
+ body: DepositCredentialsBody;
21
+ userId: number;
22
+ encryption: CredentialEncryption;
23
+ }): McpOAuthCredentialInput;
24
+ //# sourceMappingURL=mcp-oauth-credentials.d.ts.map
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.depositCredentialsBodySchema = void 0;
7
+ exports.buildMcpOAuthCredentialInput = buildMcpOAuthCredentialInput;
8
+ const zod_1 = require("zod");
9
+ const token_endpoint_url_1 = __importDefault(require("../oauth/token-endpoint-url"));
10
+ // String lengths mirror the DB column limits, so oversized values are rejected here at the boundary
11
+ // rather than at insert. .strict() matters for security: it blocks a body-supplied user id, since
12
+ // identity comes only from the JWT.
13
+ exports.depositCredentialsBodySchema = zod_1.z
14
+ .object({
15
+ mcpServerId: zod_1.z.string().min(1).max(255),
16
+ refreshToken: zod_1.z.string().min(1),
17
+ clientId: zod_1.z.string().min(1).max(255).optional(),
18
+ clientSecret: zod_1.z.string().min(1).optional(),
19
+ clientSecretExpiresAt: zod_1.z
20
+ .string()
21
+ .refine(value => !Number.isNaN(Date.parse(value)), { message: 'must be a parseable date' })
22
+ .optional(),
23
+ tokenEndpoint: zod_1.z
24
+ .string()
25
+ .min(1)
26
+ .max(2048)
27
+ .superRefine((value, ctx) => {
28
+ // The executor POSTs the refresh grant here, so reject SSRF-prone endpoints at deposit
29
+ // rather than discovering them at refresh time.
30
+ try {
31
+ (0, token_endpoint_url_1.default)(value);
32
+ }
33
+ catch (error) {
34
+ ctx.addIssue({
35
+ code: zod_1.z.ZodIssueCode.custom,
36
+ message: error instanceof Error ? error.message : 'invalid token endpoint',
37
+ });
38
+ }
39
+ }),
40
+ // Restrict to the methods the refresh grant implements, so an unsupported/typo'd one is rejected
41
+ // here rather than silently mis-authenticating at refresh time ('none' = public client).
42
+ tokenEndpointAuthMethod: zod_1.z
43
+ .enum(['client_secret_basic', 'client_secret_post', 'none'])
44
+ .optional(),
45
+ scopes: zod_1.z.string().max(2048).optional(),
46
+ })
47
+ .strict()
48
+ .superRefine((body, ctx) => {
49
+ // RFC 6749 requires client_id alongside client_secret; a secret with no id can never
50
+ // authenticate, so reject it here instead of persisting an unusable credential.
51
+ if (body.clientSecret && !body.clientId) {
52
+ ctx.addIssue({
53
+ code: zod_1.z.ZodIssueCode.custom,
54
+ path: ['clientId'],
55
+ message: 'clientId is required when clientSecret is provided',
56
+ });
57
+ }
58
+ });
59
+ // Translates a validated deposit body into the at-rest record: encrypts the refresh token (and
60
+ // client secret when present) and maps optional fields to their nullable columns. encrypt() throws
61
+ // ExecutorEncryptionKeyMissingError when the key is unset; the caller maps that to a 503.
62
+ function buildMcpOAuthCredentialInput({ body, userId, encryption, }) {
63
+ const refreshToken = encryption.encrypt(body.refreshToken);
64
+ const clientSecret = body.clientSecret ? encryption.encrypt(body.clientSecret) : null;
65
+ return {
66
+ userId,
67
+ mcpServerId: body.mcpServerId,
68
+ refreshTokenEnc: refreshToken.ciphertext,
69
+ clientId: body.clientId ?? null,
70
+ clientSecretEnc: clientSecret?.ciphertext ?? null,
71
+ clientSecretExpiresAt: body.clientSecretExpiresAt ? new Date(body.clientSecretExpiresAt) : null,
72
+ tokenEndpoint: body.tokenEndpoint,
73
+ tokenEndpointAuthMethod: body.tokenEndpointAuthMethod ?? null,
74
+ scopes: body.scopes ?? null,
75
+ };
76
+ }
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWNwLW9hdXRoLWNyZWRlbnRpYWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2h0dHAvbWNwLW9hdXRoLWNyZWRlbnRpYWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQTZEQSxvRUF1QkM7QUFqRkQsNkJBQXdCO0FBRXhCLHFGQUFrRTtBQUVsRSxvR0FBb0c7QUFDcEcsa0dBQWtHO0FBQ2xHLG9DQUFvQztBQUN2QixRQUFBLDRCQUE0QixHQUFHLE9BQUM7S0FDMUMsTUFBTSxDQUFDO0lBQ04sV0FBVyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztJQUN2QyxZQUFZLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDL0IsUUFBUSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRTtJQUMvQyxZQUFZLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDMUMscUJBQXFCLEVBQUUsT0FBQztTQUNyQixNQUFNLEVBQUU7U0FDUixNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLENBQUM7U0FDMUYsUUFBUSxFQUFFO0lBQ2IsYUFBYSxFQUFFLE9BQUM7U0FDYixNQUFNLEVBQUU7U0FDUixHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ04sR0FBRyxDQUFDLElBQUksQ0FBQztTQUNULFdBQVcsQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLEVB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
@@ -12,9 +12,12 @@ function serializeStepForWire(step) {
12
12
  case 'trigger-action':
13
13
  return { ...step, selectedRecordRef: serializeRecordRef(step.selectedRecordRef) };
14
14
  case 'load-related-record': {
15
+ // Omit selectedRecordRef when absent — serializing undefined throws.
15
16
  const result = {
16
17
  ...step,
17
- selectedRecordRef: serializeRecordRef(step.selectedRecordRef),
18
+ ...(step.selectedRecordRef && {
19
+ selectedRecordRef: serializeRecordRef(step.selectedRecordRef),
20
+ }),
18
21
  };
19
22
  if (step.pendingData) {
20
23
  const { availableRecordIds, suggestedRecord } = step.pendingData;
@@ -44,4 +47,4 @@ function serializeStepForWire(step) {
44
47
  return step;
45
48
  }
46
49
  }
47
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1zZXJpYWxpemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2h0dHAvc3RlcC1zZXJpYWxpemVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBU0EsdUNBNENDO0FBbERELDJFQUFxRTtBQUVyRSxTQUFTLGtCQUFrQixDQUFDLEdBQWM7SUFDeEMsT0FBTyxFQUFFLEdBQUcsR0FBRyxFQUFFLFFBQVEsRUFBRSxJQUFBLHdDQUFpQixFQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO0FBQy9ELENBQUM7QUFFRCxTQUF3QixvQkFBb0IsQ0FBQyxJQUF1QjtJQUNsRSxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixLQUFLLGFBQWEsQ0FBQztRQUNuQixLQUFLLGVBQWUsQ0FBQztRQUNyQixLQUFLLGdCQUFnQjtZQUNuQixPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztRQUVwRixLQUFLLHFCQUFxQixDQUFDLENBQUMsQ0FBQztZQUMzQixNQUFNLE1BQU0sR0FBNEI7Z0JBQ3RDLEdBQUcsSUFBSTtnQkFDUCxpQkFBaUIsRUFBRSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUM7YUFDOUQsQ0FBQztZQUVGLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNyQixNQUFNLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztnQkFFakUsTUFBTSxDQUFDLFdBQVcsR0FBRztvQkFDbkIsR0FBRyxJQUFJLENBQUMsV0FBVztvQkFDbkIsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQzt3QkFDL0MsR0FBRyxDQUFDO3dCQUNKLFFBQVEsRUFBRSxJQUFBLHdDQUFpQixFQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7cUJBQ3hDLENBQUMsQ0FBQztvQkFDSCxHQUFHLENBQUMsZUFBZSxJQUFJO3dCQUNyQixlQUFlLEVBQUU7NEJBQ2YsR0FBRyxlQUFlOzRCQUNsQixRQUFRLEVBQUUsSUFBQSx3Q0FBaUIsRUFBQyxlQUFlLENBQUMsUUFBUSxDQUFDO3lCQUN0RDtxQkFDRixDQUFDO2lCQUNILENBQUM7WUFDSixDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQzdELE1BQU0sQ0FBQyxlQUFlLEdBQUc7b0JBQ3ZCLEdBQUcsSUFBSSxDQUFDLGVBQWU7b0JBQ3ZCLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQztpQkFDeEQsQ0FBQztZQUNKLENBQUM7WUFFRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQ7WUFDRSxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0FBQ0gsQ0FBQyJ9
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1zZXJpYWxpemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2h0dHAvc3RlcC1zZXJpYWxpemVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBU0EsdUNBK0NDO0FBckRELDJFQUFxRTtBQUVyRSxTQUFTLGtCQUFrQixDQUFDLEdBQWM7SUFDeEMsT0FBTyxFQUFFLEdBQUcsR0FBRyxFQUFFLFFBQVEsRUFBRSxJQUFBLHdDQUFpQixFQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO0FBQy9ELENBQUM7QUFFRCxTQUF3QixvQkFBb0IsQ0FBQyxJQUF1QjtJQUNsRSxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixLQUFLLGFBQWEsQ0FBQztRQUNuQixLQUFLLGVBQWUsQ0FBQztRQUNyQixLQUFLLGdCQUFnQjtZQUNuQixPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztRQUVwRixLQUFLLHFCQUFxQixDQUFDLENBQUMsQ0FBQztZQUMzQixxRUFBcUU7WUFDckUsTUFBTSxNQUFNLEdBQTRCO2dCQUN0QyxHQUFHLElBQUk7Z0JBQ1AsR0FBRyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsSUFBSTtvQkFDNUIsaUJBQWlCLEVBQUUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO2lCQUM5RCxDQUFDO2FBQ0gsQ0FBQztZQUVGLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNyQixNQUFNLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztnQkFFakUsTUFBTSxDQUFDLFdBQVcsR0FBRztvQkFDbkIsR0FBRyxJQUFJLENBQUMsV0FBVztvQkFDbkIsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQzt3QkFDL0MsR0FBRyxDQUFDO3dCQUNKLFFBQVEsRUFBRSxJQUFBLHdDQUFpQixFQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7cUJBQ3hDLENBQUMsQ0FBQztvQkFDSCxHQUFHLENBQUMsZUFBZSxJQUFJO3dCQUNyQixlQUFlLEVBQUU7NEJBQ2YsR0FBRyxlQUFlOzRCQUNsQixRQUFRLEVBQUUsSUFBQSx3Q0FBaUIsRUFBQyxlQUFlLENBQUMsUUFBUSxDQUFDO3lCQUN0RDtxQkFDRixDQUFDO2lCQUNILENBQUM7WUFDSixDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQzdELE1BQU0sQ0FBQyxlQUFlLEdBQUc7b0JBQ3ZCLEdBQUcsSUFBSSxDQUFDLGVBQWU7b0JBQ3ZCLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQztpQkFDeEQsQ0FBQztZQUNKLENBQUM7WUFFRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQ7WUFDRSxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0FBQ0gsQ0FBQyJ9
package/dist/index.d.ts CHANGED
@@ -9,7 +9,7 @@ export type { WorkflowPort } from './ports/workflow-port';
9
9
  export type { RunStore } from './ports/run-store';
10
10
  export type { Logger } from './ports/logger-port';
11
11
  export { default as ConsoleLogger } from './adapters/console-logger';
12
- export { WorkflowExecutorError, MissingToolCallError, MalformedToolCallError, RecordNotFoundError, NoRecordsError, NoReadableFieldsError, NoResolvedFieldsError, NoWritableFieldsError, NoActionsError, NoRelationshipFieldsError, RelatedRecordNotFoundError, InvalidAIResponseError, InvalidAiRequestError, RelationNotFoundError, FieldNotFoundError, ActionNotFoundError, StepStateError, NoMcpToolsError, McpToolNotFoundError, McpToolInvocationError, AgentPortError, WorkflowPortError, RunStorePortError, AiModelPortError, AgentProbeError, ConfigurationError, InvalidPreRecordedArgsError, UnsupportedStepTypeError, UnsupportedActionFormError, InvalidStepDefinitionError, DomainValidationError, } from './errors';
12
+ export { WorkflowExecutorError, MissingToolCallError, MalformedToolCallError, RecordNotFoundError, NoRecordsError, NoReadableFieldsError, NoResolvedFieldsError, NoWritableFieldsError, NoActionsError, NoRelationshipFieldsError, RelatedRecordNotFoundError, InvalidAIResponseError, InvalidAiRequestError, RelationNotFoundError, FieldNotFoundError, ActionNotFoundError, StepStateError, NoMcpToolsError, McpToolNotFoundError, McpToolInvocationError, AgentPortError, WorkflowPortError, RunStorePortError, AiModelPortError, AgentProbeError, ConfigurationError, ExecutorEncryptionKeyMissingError, InvalidPreRecordedArgsError, UnsupportedStepTypeError, UnsupportedActionFormError, InvalidStepDefinitionError, DomainValidationError, } from './errors';
13
13
  export { default as BaseStepExecutor } from './executors/base-step-executor';
14
14
  export { default as ConditionStepExecutor } from './executors/condition-step-executor';
15
15
  export { default as ReadRecordStepExecutor } from './executors/read-record-step-executor';
@@ -30,6 +30,12 @@ export { default as SchemaResolver } from './schema-resolver';
30
30
  export { default as InMemoryStore } from './stores/in-memory-store';
31
31
  export { default as DatabaseStore } from './stores/database-store';
32
32
  export type { DatabaseStoreOptions } from './stores/database-store';
33
+ export { default as DatabaseMcpOAuthCredentialsStore } from './stores/database-mcp-oauth-credentials-store';
34
+ export type { DatabaseMcpOAuthCredentialsStoreOptions } from './stores/database-mcp-oauth-credentials-store';
35
+ export { default as InMemoryMcpOAuthCredentialsStore } from './stores/in-memory-mcp-oauth-credentials-store';
36
+ export type { McpOAuthCredentialsStore, McpOAuthCredentialInput, StoredMcpOAuthCredential, } from './ports/mcp-oauth-credentials-store';
37
+ export { default as CredentialEncryption } from './crypto/credential-encryption';
38
+ export type { EncryptedValue } from './crypto/credential-encryption';
33
39
  export { buildDatabaseRunStore, buildInMemoryRunStore } from './stores/build-run-store';
34
40
  export { buildInMemoryExecutor, buildDatabaseExecutor } from './build-workflow-executor';
35
41
  export { runCli } from './cli-core';