@forestadmin/mcp-server 1.21.0 → 1.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/server.js CHANGED
@@ -51,6 +51,8 @@ const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/streamable
51
51
  const cors_1 = __importDefault(require("cors"));
52
52
  const express_1 = __importDefault(require("express"));
53
53
  const http = __importStar(require("http"));
54
+ const ephemeral_storage_1 = __importDefault(require("./file-uploads/ephemeral-storage"));
55
+ const types_1 = require("./file-uploads/types");
54
56
  const forest_oauth_provider_1 = __importDefault(require("./forest-oauth-provider"));
55
57
  const http_client_1 = require("./http-client");
56
58
  const mcp_paths_1 = require("./mcp-paths");
@@ -63,6 +65,7 @@ const execute_action_1 = __importDefault(require("./tools/execute-action"));
63
65
  const get_action_form_1 = __importDefault(require("./tools/get-action-form"));
64
66
  const list_1 = __importDefault(require("./tools/list"));
65
67
  const list_related_1 = __importDefault(require("./tools/list-related"));
68
+ const request_action_file_upload_1 = __importDefault(require("./tools/request-action-file-upload"));
66
69
  const update_1 = __importDefault(require("./tools/update"));
67
70
  const normalize_agent_url_1 = __importDefault(require("./utils/normalize-agent-url"));
68
71
  const normalize_domain_list_1 = __importDefault(require("./utils/normalize-domain-list"));
@@ -104,6 +107,7 @@ const SAFE_ARGUMENTS_FOR_LOGGING = {
104
107
  describeCollection: ['collectionName'],
105
108
  getActionForm: ['collectionName', 'actionName', 'recordIds'],
106
109
  executeAction: ['collectionName', 'actionName', 'recordIds'],
110
+ requestActionFileUpload: ['mimeType'],
107
111
  associate: ['collectionName', 'relationName', 'parentRecordId', 'targetRecordId'],
108
112
  dissociate: ['collectionName', 'relationName', 'parentRecordId', 'targetRecordIds'],
109
113
  };
@@ -127,6 +131,21 @@ class ForestMCPServer {
127
131
  this.agentDispatcher = options?.agentDispatcher;
128
132
  this.tokenTtl = (0, token_ttl_1.default)(options?.tokenTtl, this.logger);
129
133
  this.allowedOAuthClients = (0, normalize_domain_list_1.default)(options?.allowedOAuthClients);
134
+ // Resolved in buildExpressApp, where the auth secret is known to be set.
135
+ this.fileUploadsOptions = options?.fileUploads || undefined;
136
+ // `enabledTools` is an allowlist, so declining this one feature through it would mean naming
137
+ // every other tool and opting out of everything shipped later. Dropping it from the set here
138
+ // turns the whole feature off through the machinery that already gates it: registration, the
139
+ // upload endpoint, and the paragraph executeAction adds for it.
140
+ if (options?.fileUploads === false) {
141
+ // Said aloud when the two options contradict each other: resolveEnabledTools logs every
142
+ // other enablement surprise, and a tool the caller named vanishing without a line in the
143
+ // log reads as a bug in whichever config layer loses.
144
+ if (options.enabledTools?.includes('requestActionFileUpload')) {
145
+ this.logger('Warn', 'fileUploads: false removes requestActionFileUpload even though enabledTools lists it.');
146
+ }
147
+ this.enabledTools.delete('requestActionFileUpload');
148
+ }
130
149
  // Use injected forestServerClient or create default
131
150
  this.forestServerClient = options?.forestServerClient ?? this.createDefaultForestServerClient();
132
151
  }
@@ -156,6 +175,7 @@ class ForestMCPServer {
156
175
  logger: this.logger,
157
176
  collectionNames: this.collectionNames,
158
177
  agentDispatcher: this.agentDispatcher,
178
+ fileUploads: this.fileUploads,
159
179
  };
160
180
  const allTools = [
161
181
  { name: 'describeCollection', register: () => (0, describe_collection_1.default)(mcpServer, ctx) },
@@ -168,6 +188,14 @@ class ForestMCPServer {
168
188
  { name: 'dissociate', register: () => (0, dissociate_1.default)(mcpServer, ctx) },
169
189
  { name: 'getActionForm', register: () => (0, get_action_form_1.default)(mcpServer, ctx) },
170
190
  { name: 'executeAction', register: () => (0, execute_action_1.default)(mcpServer, ctx) },
191
+ ...(this.fileUploads
192
+ ? [
193
+ {
194
+ name: 'requestActionFileUpload',
195
+ register: () => (0, request_action_file_upload_1.default)(mcpServer, ctx),
196
+ },
197
+ ]
198
+ : []),
171
199
  ];
172
200
  const enabledToolEntries = allTools.filter(tool => this.enabledTools.has(tool.name));
173
201
  const disabledToolNames = allTools
@@ -193,6 +221,7 @@ class ForestMCPServer {
193
221
  'dissociate',
194
222
  'getActionForm',
195
223
  'executeAction',
224
+ 'requestActionFileUpload',
196
225
  ];
197
226
  const enabled = new Set(options?.enabledTools ?? allToolNames);
198
227
  if (options?.enabledTools) {
@@ -292,6 +321,34 @@ class ForestMCPServer {
292
321
  */
293
322
  async buildExpressApp(baseUrl) {
294
323
  const { envSecret, authSecret } = this.ensureSecretsAreSet();
324
+ // On unless requestActionFileUpload is absent from enabledTools — dropped by the caller, or by
325
+ // the fileUploads: false branch in the constructor, which lands in the same set. Gating on
326
+ // that keeps executeAction from advertising an upload tool the server never registered.
327
+ // `!this.fileUploads` because an agent rebuilds its router on every customization refresh:
328
+ // re-initializing would hand the new app a different store than the urls already in flight.
329
+ if (this.enabledTools.has('requestActionFileUpload') && !this.fileUploads) {
330
+ // No backend given: hold the objects here. Correct for one instance only, which
331
+ // EphemeralStorage announces the first time something actually asks for a destination —
332
+ // warning at boot would tax every agent, including those with no file field at all.
333
+ if (!this.fileUploadsOptions?.storage) {
334
+ this.ephemeralStorage = new ephemeral_storage_1.default(this.logger);
335
+ }
336
+ this.fileUploads = (0, types_1.resolveFileUploads)({
337
+ ...this.fileUploadsOptions,
338
+ ...(this.ephemeralStorage && { storage: this.ephemeralStorage }),
339
+ }, authSecret, this.logger);
340
+ // Said here rather than in resolveFileUploads, which cannot tell the in-memory store from a
341
+ // provided one: the tool reports maxBytes to the model verbatim, so a value above what the
342
+ // whole store holds promises a size every upload of which is refused — with "the store is
343
+ // full", on an empty store.
344
+ if (this.ephemeralStorage &&
345
+ this.fileUploads.maxBytes > this.fileUploads.ephemeralMaxTotalBytes) {
346
+ this.logger('Warn', `fileUploads.maxBytes=${this.fileUploads.maxBytes} exceeds what the in-memory store ` +
347
+ `holds in total (${this.fileUploads.ephemeralMaxTotalBytes} bytes, ` +
348
+ 'ephemeralMaxTotalBytes), so an upload that large is always refused. Raise ' +
349
+ 'ephemeralMaxTotalBytes too, or configure a storage backend.');
350
+ }
351
+ }
295
352
  await this.fetchCollectionNames();
296
353
  const app = (0, express_1.default)();
297
354
  // Trust proxy headers when behind a reverse proxy (e.g., load balancer, nginx)
@@ -348,6 +405,19 @@ class ForestMCPServer {
348
405
  // Body parsers MUST come before OAuth handlers because the token handler
349
406
  // expects req.body to be parsed. When proxied from Koa, the body is already
350
407
  // available but Express needs to see it properly.
408
+ // Ahead of the body parsers: they would consume the stream for any content type they
409
+ // claim, and this endpoint needs the raw body. Also ahead of allowedMethods(['POST']).
410
+ if (this.ephemeralStorage && this.fileUploads) {
411
+ const uploadsPath = `${prefix}/mcp/uploads`;
412
+ this.ephemeralStorage.configure({
413
+ maxBytes: this.fileUploads.maxBytes,
414
+ maxTotalBytes: this.fileUploads.ephemeralMaxTotalBytes,
415
+ ttlSeconds: this.fileUploads.handleTtlSeconds,
416
+ issuedTtlSeconds: this.fileUploads.uploadUrlTtlSeconds,
417
+ publicBaseUrl: new URL(uploadsPath, effectiveBaseUrl).href,
418
+ });
419
+ app.use(uploadsPath, this.ephemeralStorage.createRouter());
420
+ }
351
421
  app.use(express_1.default.json());
352
422
  app.use(express_1.default.urlencoded({ extended: true }));
353
423
  // Request logging middleware - logs every request with response status
@@ -385,10 +455,11 @@ class ForestMCPServer {
385
455
  }));
386
456
  }
387
457
  app.use((0, allowedMethods_js_1.allowedMethods)(['POST']));
458
+ const resourceMetadataUrl = new URL(`/.well-known/oauth-protected-resource${mcpResourceUrl.pathname}`, effectiveBaseUrl).href;
388
459
  app.post(`${prefix}/mcp`, (0, bearerAuth_js_1.requireBearerAuth)({
389
460
  verifier: oauthProvider,
390
461
  requiredScopes: ['mcp:read'],
391
- resourceMetadataUrl: new URL(`/.well-known/oauth-protected-resource${mcpResourceUrl.pathname}`, effectiveBaseUrl).href,
462
+ resourceMetadataUrl,
392
463
  }), (req, res) => {
393
464
  this.handleMcpRequest(req, res).catch(error => {
394
465
  const mcpMethod = req.body?.method || 'unknown';
@@ -492,4 +563,4 @@ class ForestMCPServer {
492
563
  }
493
564
  }
494
565
  exports.default = ForestMCPServer;
495
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxzREFBc0Q7QUFDdEQsc0VBQXNFO0FBQ3RFLHVCQUFxQjtBQVFyQiw4RkFBbUc7QUFDbkcsNEZBQTZGO0FBQzdGLHNGQUF1RjtBQUN2RiwwR0FBb0c7QUFDcEcsa0dBQW1HO0FBQ25HLCtFQUd5RDtBQUN6RCxvRUFBb0U7QUFDcEUsMEZBQW1HO0FBQ25HLGdEQUF3QjtBQUN4QixzREFBOEI7QUFDOUIsMkNBQTZCO0FBRTdCLG9GQUEwRDtBQUMxRCwrQ0FBeUQ7QUFDekQsMkNBQWlFO0FBQ2pFLGtFQUFxRDtBQUNyRCw0REFBK0M7QUFDL0MsNERBQStDO0FBQy9DLHNGQUF3RTtBQUN4RSxvRUFBdUQ7QUFDdkQsNEVBQThEO0FBQzlELDhFQUErRDtBQUMvRCx3REFBMkM7QUFDM0Msd0VBQTBEO0FBQzFELDREQUErQztBQUMvQyxzRkFBNEQ7QUFDNUQsMEZBQWdFO0FBQ2hFLDJEQUErRTtBQUMvRSxnRkFBd0U7QUFDeEUsa0VBQWtEO0FBQ2xELHVDQUEwQztBQUU3QixRQUFBLFFBQVEsR0FBRyxpRUFBaUUsQ0FBQztBQVcxRixTQUFTLGVBQWUsQ0FBQyxLQUFlO0lBQ3RDLElBQUksS0FBSyxLQUFLLE9BQU87UUFBRSxPQUFPLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xFLElBQUksS0FBSyxLQUFLLE1BQU07UUFBRSxPQUFPLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRWhFLE9BQU8sQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDNUMsQ0FB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
566
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxzREFBc0Q7QUFDdEQsc0VBQXNFO0FBQ3RFLHVCQUFxQjtBQVNyQiw4RkFBbUc7QUFDbkcsNEZBQTZGO0FBQzdGLHNGQUF1RjtBQUN2RiwwR0FBb0c7QUFDcEcsa0dBQW1HO0FBQ25HLCtFQUd5RDtBQUN6RCxvRUFBb0U7QUFDcEUsMEZBQW1HO0FBQ25HLGdEQUF3QjtBQUN4QixzREFBOEI7QUFDOUIsMkNBQTZCO0FBRTdCLHlGQUFnRTtBQUNoRSxnREFBMEQ7QUFDMUQsb0ZBQTBEO0FBQzFELCtDQUF5RDtBQUN6RCwyQ0FBaUU7QUFDakUsa0VBQXFEO0FBQ3JELDREQUErQztBQUMvQyw0REFBK0M7QUFDL0Msc0ZBQXdFO0FBQ3hFLG9FQUF1RDtBQUN2RCw0RUFBOEQ7QUFDOUQsOEVBQStEO0FBQy9ELHdEQUEyQztBQUMzQyx3RUFBMEQ7QUFDMUQsb0dBQW9GO0FBQ3BGLDREQUErQztBQUMvQyxzRkFBNEQ7QUFDNUQsMEZBQWdFO0FBQ2hFLDJEQUErRTtBQUMvRSxnRkFBd0U7QUFDeEUsa0VBQWtEO0FBQ2xELHVDQUEwQztBQUU3QixRQUFBLFFBQVEsR0FBRyxpRUFBaUUsQ0FBQztBQVcxRixTQUFTLGVBQWUsQ0FBQyxLQUFlO0lBQ3RDLElBQUksS0FBSyxLQUFLLE9BQU87UUFBRSxPQUFPLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xFLElBQUksS0FBSyxLQUFLLE1BQU07UUFBRSxPQUFPLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRWhFLE9BQU8sQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLE9BQU8s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
@@ -1,3 +1,4 @@
1
+ import type { ResolvedFileUploads } from './file-uploads/types';
1
2
  import type { ForestServerClient } from './http-client';
2
3
  import type { InProcessAgentDispatcher } from './in-process-agent-dispatcher';
3
4
  import type { Logger } from './server';
@@ -6,5 +7,6 @@ export interface ToolContext {
6
7
  logger: Logger;
7
8
  collectionNames: string[];
8
9
  agentDispatcher?: InProcessAgentDispatcher;
10
+ fileUploads?: ResolvedFileUploads;
9
11
  }
10
12
  //# sourceMappingURL=tool-context.d.ts.map
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.default = declareExecuteActionTool;
7
7
  const zod_1 = require("zod");
8
+ const resolve_1 = __importDefault(require("../file-uploads/resolve"));
8
9
  const action_helpers_1 = require("../utils/action-helpers");
9
10
  const agent_caller_1 = require("../utils/agent-caller");
10
11
  const tool_with_logging_1 = __importDefault(require("../utils/tool-with-logging"));
@@ -28,7 +29,11 @@ Required workflow:
28
29
  2. If getActionForm returns "canExecute": false, call it again with values until "canExecute": true
29
30
  3. Only then call executeAction with the same values used in the last getActionForm call
30
31
 
31
- If you call executeAction with missing required fields, it will return an error with the missing fields instead of executing the action.`,
32
+ If you call executeAction with missing required fields, it will return an error with the missing fields instead of executing the action.${ctx.fileUploads
33
+ ? `
34
+
35
+ To fill a file field, never inline base64 file content. Call requestActionFileUpload to get an upload destination, upload the raw bytes there, and pass the returned fileHandle string as the field value.`
36
+ : ''}`,
32
37
  inputSchema: argumentShape,
33
38
  }, async (options, extra) => {
34
39
  const { rpcClient } = await (0, agent_caller_1.buildClientWithActions)(extra, forestServerClient, ctx.agentDispatcher);
@@ -45,11 +50,14 @@ If you call executeAction with missing required fields, it will return an error
45
50
  },
46
51
  logger,
47
52
  operation: async () => {
53
+ const values = options.values
54
+ ? await (0, resolve_1.default)(options.values, extra.authInfo, ctx.fileUploads)
55
+ : undefined;
48
56
  const action = await rpcClient
49
57
  .collection(options.collectionName)
50
58
  .action(options.actionName, { recordIds });
51
- if (options.values) {
52
- await action.setFields(options.values);
59
+ if (values) {
60
+ await action.setFields(values);
53
61
  }
54
62
  const result = await action.execute({ approvalRequestMessage: options.reasoning });
55
63
  if ('approvalRequested' in result) {
@@ -67,4 +75,4 @@ If you call executeAction with missing required fields, it will return an error
67
75
  });
68
76
  }, logger);
69
77
  }
70
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0ZS1hY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdG9vbHMvZXhlY3V0ZS1hY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFrQkEsMkNBNEVDO0FBM0ZELDZCQUF3QjtBQUV4Qiw0REFBb0U7QUFDcEUsd0RBQStEO0FBQy9ELG1GQUFpRTtBQUNqRSxtRkFBeUQ7QUFVekQsU0FBd0Isd0JBQXdCLENBQUMsU0FBb0IsRUFBRSxHQUFnQjtJQUNyRixNQUFNLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxHQUFHLEdBQUcsQ0FBQztJQUM1RCxNQUFNLGFBQWEsR0FBRztRQUNwQixHQUFHLElBQUEsMENBQXlCLEVBQUMsZUFBZSxDQUFDO1FBQzdDLFNBQVMsRUFBRSxPQUFDO2FBQ1QsTUFBTSxFQUFFO2FBQ1IsUUFBUSxFQUFFO2FBQ1YsUUFBUSxDQUNQLDREQUE0RDtZQUMxRCxpRkFBaUYsQ0FDcEY7S0FDSixDQUFDO0lBRUYsT0FBTyxJQUFBLDJCQUF1QixFQUM1QixTQUFTLEVBQ1QsZUFBZSxFQUNmO1FBQ0UsS0FBSyxFQUFFLG1CQUFtQjtRQUMxQixXQUFXLEVBQUU7Ozs7Ozs7eUlBT3NIO1FBQ25JLFdBQVcsRUFBRSxhQUFhO0tBQzNCLEVBQ0QsS0FBSyxFQUFFLE9BQThCLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDOUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLE1BQU0sSUFBQSxxQ0FBc0IsRUFDaEQsS0FBSyxFQUNMLGtCQUFrQixFQUNsQixHQUFHLENBQUMsZUFBZSxDQUNwQixDQUFDO1FBRUYsK0VBQStFO1FBQy9FLE1BQU0sU0FBUyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQXdCLENBQUM7UUFFbkUsT0FBTyxJQUFBLDJCQUFlLEVBQUM7WUFDckIsa0JBQWtCO1lBQ2xCLE9BQU8sRUFBRSxLQUFLO1lBQ2QsTUFBTSxFQUFFLFFBQVE7WUFDaEIsT0FBTyxFQUFFO2dCQUNQLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYztnQkFDdEMsU0FBUztnQkFDVCxLQUFLLEVBQUUseUJBQXlCLE9BQU8sQ0FBQyxVQUFVLEdBQUc7YUFDdEQ7WUFDRCxNQUFNO1lBQ04sU0FBUyxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUNwQixNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVM7cUJBQzNCLFVBQVUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDO3FCQUNsQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7Z0JBRTdDLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUNuQixNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN6QyxDQUFDO2dCQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLHNCQUFzQixFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO2dCQUVuRixJQUFJLG1CQUFtQixJQUFJLE1BQU0sRUFBRSxDQUFDO29CQUNsQyxPQUFPO3dCQUNMLE9BQU8sRUFBRTs0QkFDUDtnQ0FDRSxJQUFJLEVBQUUsTUFBTTtnQ0FDWixJQUFJLEVBQUUscUlBQXFJOzZCQUM1STt5QkFDRjtxQkFDRixDQUFDO2dCQUNKLENBQUM7Z0JBRUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN2RSxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxFQUNELE1BQU0sQ0FDUCxDQUFDO0FBQ0osQ0FBQyJ9
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0ZS1hY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdG9vbHMvZXhlY3V0ZS1hY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFtQkEsMkNBc0ZDO0FBdEdELDZCQUF3QjtBQUV4QixzRUFBZ0U7QUFDaEUsNERBQW9FO0FBQ3BFLHdEQUErRDtBQUMvRCxtRkFBaUU7QUFDakUsbUZBQXlEO0FBVXpELFNBQXdCLHdCQUF3QixDQUFDLFNBQW9CLEVBQUUsR0FBZ0I7SUFDckYsTUFBTSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsR0FBRyxHQUFHLENBQUM7SUFDNUQsTUFBTSxhQUFhLEdBQUc7UUFDcEIsR0FBRyxJQUFBLDBDQUF5QixFQUFDLGVBQWUsQ0FBQztRQUM3QyxTQUFTLEVBQUUsT0FBQzthQUNULE1BQU0sRUFBRTthQUNSLFFBQVEsRUFBRTthQUNWLFFBQVEsQ0FDUCw0REFBNEQ7WUFDMUQsaUZBQWlGLENBQ3BGO0tBQ0osQ0FBQztJQUVGLE9BQU8sSUFBQSwyQkFBdUIsRUFDNUIsU0FBUyxFQUNULGVBQWUsRUFDZjtRQUNFLEtBQUssRUFBRSxtQkFBbUI7UUFDMUIsV0FBVyxFQUFFOzs7Ozs7OzBJQVFYLEdBQUcsQ0FBQyxXQUFXO1lBQ2IsQ0FBQyxDQUFDOzsyTUFFK0w7WUFDak0sQ0FBQyxDQUFDLEVBQ04sRUFBRTtRQUNGLFdBQVcsRUFBRSxhQUFhO0tBQzNCLEVBQ0QsS0FBSyxFQUFFLE9BQThCLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDOUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLE1BQU0sSUFBQSxxQ0FBc0IsRUFDaEQsS0FBSyxFQUNMLGtCQUFrQixFQUNsQixHQUFHLENBQUMsZUFBZSxDQUNwQixDQUFDO1FBRUYsK0VBQStFO1FBQy9FLE1BQU0sU0FBUyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQXdCLENBQUM7UUFFbkUsT0FBTyxJQUFBLDJCQUFlLEVBQUM7WUFDckIsa0JBQWtCO1lBQ2xCLE9BQU8sRUFBRSxLQUFLO1lBQ2QsTUFBTSxFQUFFLFFBQVE7WUFDaEIsT0FBTyxFQUFFO2dCQUNQLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYztnQkFDdEMsU0FBUztnQkFDVCxLQUFLLEVBQUUseUJBQXlCLE9BQU8sQ0FBQyxVQUFVLEdBQUc7YUFDdEQ7WUFDRCxNQUFNO1lBQ04sU0FBUyxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUNwQixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTTtvQkFDM0IsQ0FBQyxDQUFDLE1BQU0sSUFBQSxpQkFBeUIsRUFBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQztvQkFDbEYsQ0FBQyxDQUFDLFNBQVMsQ0FBQztnQkFFZCxNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVM7cUJBQzNCLFVBQVUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDO3FCQUNsQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7Z0JBRTdDLElBQUksTUFBTSxFQUFFLENBQUM7b0JBQ1gsTUFBTSxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNqQyxDQUFDO2dCQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLHNCQUFzQixFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO2dCQUVuRixJQUFJLG1CQUFtQixJQUFJLE1BQU0sRUFBRSxDQUFDO29CQUNsQyxPQUFPO3dCQUNMLE9BQU8sRUFBRTs0QkFDUDtnQ0FDRSxJQUFJLEVBQUUsTUFBTTtnQ0FDWixJQUFJLEVBQUUscUlBQXFJOzZCQUM1STt5QkFDRjtxQkFDRixDQUFDO2dCQUNKLENBQUM7Z0JBRUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN2RSxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxFQUNELE1BQU0sQ0FDUCxDQUFDO0FBQ0osQ0FBQyJ9
@@ -4,6 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.default = declareGetActionFormTool;
7
+ const file_reference_1 = __importDefault(require("../file-uploads/file-reference"));
7
8
  const action_helpers_1 = require("../utils/action-helpers");
8
9
  const agent_caller_1 = require("../utils/agent-caller");
9
10
  const tool_with_logging_1 = __importDefault(require("../utils/tool-with-logging"));
@@ -15,6 +16,23 @@ function toAllowedValue(option) {
15
16
  }
16
17
  return { value: option, label: String(option) };
17
18
  }
19
+ // Setting a field that declares a change hook posts every field value to the agent, and a change
20
+ // hook reading `.buffer` off a handle string throws — a 500 on the very sequence executeAction's
21
+ // description prescribes. Handles are not resolved on this path on purpose (the bytes would land
22
+ // back in the model's context), so they are kept away from the agent and echoed back to the model
23
+ // instead: a required file field stays satisfiable, and the model sees its handle was received.
24
+ function splitFileReferences(values) {
25
+ const forAgent = {};
26
+ const withheld = {};
27
+ for (const [field, value] of Object.entries(values)) {
28
+ const candidates = Array.isArray(value) ? value : [value];
29
+ if (candidates.some(candidate => (0, file_reference_1.default)(candidate)))
30
+ withheld[field] = value;
31
+ else
32
+ forAgent[field] = value;
33
+ }
34
+ return { forAgent, withheld };
35
+ }
18
36
  function declareGetActionFormTool(mcpServer, ctx) {
19
37
  const { forestServerClient, logger, collectionNames } = ctx;
20
38
  const argumentShape = (0, action_helpers_1.createActionArgumentShape)(collectionNames);
@@ -45,13 +63,26 @@ The response includes:
45
63
  .collection(options.collectionName)
46
64
  .action(options.actionName, { recordIds });
47
65
  let skippedFields = [];
66
+ let withheld = {};
48
67
  if (options.values) {
49
- skippedFields = await action.tryToSetFields(options.values);
68
+ const split = splitFileReferences(options.values);
69
+ withheld = split.withheld;
70
+ skippedFields = await action.tryToSetFields(split.forAgent);
50
71
  }
51
72
  const fields = action.getFields();
73
+ // A withheld handle satisfies its field: the agent never saw it, so getValue() is undefined,
74
+ // and counting it as missing would leave canExecute false with nothing the model could send
75
+ // to fix it — a data uri is what it is told never to send, and the handle is what it just
76
+ // sent.
77
+ // An own-property check, not `in`: withheld is keyed by model-sent field names, and `in`
78
+ // walks the prototype chain — a field literally named toString would read as filled by a
79
+ // function. hasOwnProperty.call because this package's lib predates Object.hasOwn.
80
+ const valueOf = (field) => Object.prototype.hasOwnProperty.call(withheld, field.getName())
81
+ ? withheld[field.getName()]
82
+ : field.getValue();
52
83
  const requiredFields = fields
53
84
  .filter(field => field.isRequired())
54
- .filter(field => field.getValue() === undefined || field.getValue() === null)
85
+ .filter(field => valueOf(field) === undefined || valueOf(field) === null)
55
86
  .map(field => field.getName());
56
87
  const canExecute = requiredFields.length === 0;
57
88
  return {
@@ -63,12 +94,12 @@ The response includes:
63
94
  const description = field.getPlainField()?.description;
64
95
  const baseField = {
65
96
  name: field.getName(),
66
- type: field.getType(),
67
- value: field.getValue(),
97
+ type: field.getTypeName(),
98
+ value: valueOf(field),
68
99
  isRequired: field.isRequired() ?? false,
69
100
  ...(description ? { description } : {}),
70
101
  };
71
- if (field.getType() === 'Enum') {
102
+ if (field.getTypeName() === 'Enum') {
72
103
  const enumField = action.getEnumField(field.getName());
73
104
  return { ...baseField, enumValues: enumField.getOptions() ?? null };
74
105
  }
@@ -86,4 +117,4 @@ The response includes:
86
117
  };
87
118
  }, logger);
88
119
  }
89
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWFjdGlvbi1mb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rvb2xzL2dldC1hY3Rpb24tZm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQXlCQSwyQ0E0RkM7QUFsSEQsNERBQW9FO0FBQ3BFLHdEQUErRDtBQUMvRCxtRkFBaUU7QUFTakUsNkZBQTZGO0FBQzdGLFNBQVMsY0FBYyxDQUFDLE1BQWU7SUFDckMsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2xELE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBMEQsQ0FBQztRQUVwRixPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQXlCLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO0FBQ3JFLENBQUM7QUFFRCxTQUF3Qix3QkFBd0IsQ0FBQyxTQUFvQixFQUFFLEdBQWdCO0lBQ3JGLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLEdBQUcsR0FBRyxDQUFDO0lBQzVELE1BQU0sYUFBYSxHQUFHLElBQUEsMENBQXlCLEVBQUMsZUFBZSxDQUFDLENBQUM7SUFFakUsT0FBTyxJQUFBLDJCQUF1QixFQUM1QixTQUFTLEVBQ1QsZUFBZSxFQUNmO1FBQ0UsV0FBVyxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRTtRQUNuQyxLQUFLLEVBQUUsc0JBQXNCO1FBQzdCLFdBQVcsRUFBRTs7Ozs7Ozs7Ozs7OztnSUFhNkc7UUFDMUgsV0FBVyxFQUFFLGFBQWE7S0FDM0IsRUFDRCxLQUFLLEVBQUUsT0FBOEIsRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUM5QyxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxJQUFBLHFDQUFzQixFQUNo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
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWFjdGlvbi1mb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rvb2xzL2dldC1hY3Rpb24tZm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQWdEQSwyQ0EyR0M7QUF4SkQsb0ZBQWdFO0FBQ2hFLDREQUFvRTtBQUNwRSx3REFBK0Q7QUFDL0QsbUZBQWlFO0FBU2pFLDZGQUE2RjtBQUM3RixTQUFTLGNBQWMsQ0FBQyxNQUFlO0lBQ3JDLElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNsRCxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQTBELENBQUM7UUFFcEYsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUF5QixFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztBQUNyRSxDQUFDO0FBRUQsaUdBQWlHO0FBQ2pHLGlHQUFpRztBQUNqRyxpR0FBaUc7QUFDakcsa0dBQWtHO0FBQ2xHLGdHQUFnRztBQUNoRyxTQUFTLG1CQUFtQixDQUFDLE1BQStCO0lBSTFELE1BQU0sUUFBUSxHQUE0QixFQUFFLENBQUM7SUFDN0MsTUFBTSxRQUFRLEdBQTRCLEVBQUUsQ0FBQztJQUU3QyxLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ3BELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUxRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFBLHdCQUFr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
@@ -0,0 +1,4 @@
1
+ import type { ToolContext } from '../tool-context';
2
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ export default function declareRequestActionFileUploadTool(mcpServer: McpServer, ctx: ToolContext): string;
4
+ //# sourceMappingURL=request-action-file-upload.d.ts.map
@@ -0,0 +1,162 @@
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
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.default = declareRequestActionFileUploadTool;
40
+ const crypto = __importStar(require("crypto"));
41
+ const zod_1 = require("zod");
42
+ const file_reference_1 = require("../file-uploads/file-reference");
43
+ const handles_1 = require("../file-uploads/handles");
44
+ const tool_with_logging_1 = __importDefault(require("../utils/tool-with-logging"));
45
+ const MIME_TYPE_PATTERN = /^[\w.+-]+\/[\w.+-]+$/;
46
+ const SHA256_HEX_PATTERN = /^[0-9a-f]{64}$/i;
47
+ const SHA256_BASE64_PATTERN = /^[A-Za-z0-9+/]{43}=$/;
48
+ const MAX_FILENAME_LENGTH = 128;
49
+ const REQUIRED_SCOPE = 'mcp:action';
50
+ // Names the requirement rather than a menu path: the setting that satisfies it is not in the same
51
+ // place in every client, and on a managed workspace the end user may have no access to it at all.
52
+ const UPLOAD_PREREQUISITE = 'Uploading requires an outbound HTTP request from your environment. A hosted code execution ' +
53
+ 'sandbox runs on its own network and reaches only allowed hosts, so the host of uploadUrl must ' +
54
+ 'be publicly reachable — a localhost or private address never is from there — and allowed for ' +
55
+ 'outbound traffic in that environment. Where that is configured depends on the client, and on a ' +
56
+ 'managed workspace it may be an administrator setting rather than a user one. A blocked or ' +
57
+ 'unreachable request is a client configuration issue, not an expired handle: report it as such ' +
58
+ 'instead of requesting another destination.';
59
+ // The storage key delimits segments with '/', so keep a conservative charset. Truncation keeps
60
+ // the tail so the extension survives. A name made only of dots would let a backend that joins
61
+ // paths climb out of the per-upload directory.
62
+ function sanitizeFilename(filename) {
63
+ const safe = filename
64
+ .trim()
65
+ .slice(-MAX_FILENAME_LENGTH)
66
+ // Unicode-aware: ASCII \w turns `facture-été.pdf` into `facture-_t_.pdf`, so the accented
67
+ // letters vanish while the spaces and parentheses survive. Same key safety, no `/`.
68
+ .replace(/[^\p{L}\p{N}._\- ()]/gu, '_');
69
+ return !safe || /^\.+$/.test(safe) ? 'file' : safe;
70
+ }
71
+ function normalizeSha256(sha256) {
72
+ if (!sha256)
73
+ return undefined;
74
+ if (SHA256_BASE64_PATTERN.test(sha256))
75
+ return sha256;
76
+ if (SHA256_HEX_PATTERN.test(sha256))
77
+ return Buffer.from(sha256, 'hex').toString('base64');
78
+ throw new Error('sha256 must be the file digest as hex or base64.');
79
+ }
80
+ function declareRequestActionFileUploadTool(mcpServer, ctx) {
81
+ const { logger, fileUploads } = ctx;
82
+ return (0, tool_with_logging_1.default)(mcpServer, 'requestActionFileUpload', {
83
+ title: 'Request an upload destination for an action file field',
84
+ description: `Get a destination to upload a file to, then reference it in an action form field.
85
+
86
+ Call this whenever getActionForm shows a field of type "File" or "FileList". Never inline base64 file content as a field value: it would be far larger than any payload limit.
87
+
88
+ Workflow:
89
+ 1. Compute the file's sha256 and call this tool with the filename, mimeType and sha256. The digest pins the destination to that exact content — without it, on some backends anyone who reads the upload url in a log can replace the bytes before the action runs. Skip it only when you cannot compute a digest.
90
+ 2. Upload the raw bytes to the returned uploadUrl, with the returned method and every returned header. Some backends sign a pinned sha256 into a checksum header and reject the upload without it, so apply the headers as returned rather than assuming which ones matter. A pinned digest is re-verified when the action runs either way. The bytes must not pass through this tool or through your own output.
91
+ 3. Pass the returned fileHandle string as the value of the file field in executeAction.
92
+
93
+ ${UPLOAD_PREREQUISITE}
94
+
95
+ The url accepts one upload: to send different bytes, call this tool again for a fresh destination. The handle expires too, so run the upload and the action without a long pause in between.`,
96
+ inputSchema: {
97
+ filename: zod_1.z
98
+ .string()
99
+ .trim()
100
+ .min(1)
101
+ .describe('Original file name, e.g. "invoice-2026-01.pdf".'),
102
+ mimeType: zod_1.z.string().describe('Media type of the file, e.g. "application/pdf".'),
103
+ sha256: zod_1.z
104
+ .string()
105
+ .optional()
106
+ .describe('Sha256 digest of the file, hex or base64. Pins the destination to that exact ' +
107
+ 'content; compute it and pass it whenever you can.'),
108
+ },
109
+ }, async (options, extra) => {
110
+ if (!fileUploads) {
111
+ throw new Error('File uploads are not configured on this server. ' +
112
+ 'Ask the administrator to set the fileUploads option to enable action file fields.');
113
+ }
114
+ const userId = extra.authInfo?.extra?.userId;
115
+ if (userId === undefined || userId === null) {
116
+ throw new Error('Cannot request a file upload without an authenticated user');
117
+ }
118
+ // /mcp only requires mcp:read, but this mints a pre-authorized write into the host's
119
+ // storage. The route this tool replaced enforced mcp:action, so it is enforced here.
120
+ if (!extra.authInfo?.scopes?.includes(REQUIRED_SCOPE)) {
121
+ throw new Error(`Requesting a file upload requires the "${REQUIRED_SCOPE}" scope.`);
122
+ }
123
+ if (!MIME_TYPE_PATTERN.test(options.mimeType)) {
124
+ throw new Error(`"${options.mimeType}" is not a media type. Expected a type/subtype pair, e.g. application/pdf.`);
125
+ }
126
+ const sha256Base64 = normalizeSha256(options.sha256);
127
+ const safeName = sanitizeFilename(options.filename);
128
+ const key = `${fileUploads.keyPrefix}${crypto.randomUUID()}/${safeName}`;
129
+ const destination = await fileUploads.storage.createUploadUrl({
130
+ key,
131
+ mimeType: options.mimeType,
132
+ ...(sha256Base64 && { sha256: sha256Base64 }),
133
+ expiresInSeconds: fileUploads.uploadUrlTtlSeconds,
134
+ });
135
+ const handle = (0, handles_1.signUploadHandle)({
136
+ key,
137
+ name: safeName,
138
+ mimeType: options.mimeType,
139
+ userId,
140
+ ...(sha256Base64 && { sha256Base64 }),
141
+ }, fileUploads.authSecret, fileUploads.handleTtlSeconds);
142
+ return {
143
+ content: [
144
+ {
145
+ type: 'text',
146
+ text: JSON.stringify({
147
+ uploadUrl: destination.url,
148
+ method: destination.method ?? 'PUT',
149
+ headers: destination.headers ?? { 'Content-Type': options.mimeType },
150
+ expiresInSeconds: fileUploads.uploadUrlTtlSeconds,
151
+ maxBytes: fileUploads.maxBytes,
152
+ fileHandle: `${file_reference_1.UPLOADED_FILE_PREFIX}${handle}`,
153
+ // Repeated in the response so the model has the diagnosis in context at the moment
154
+ // its upload fails, not only when it first read the tool description.
155
+ prerequisite: UPLOAD_PREREQUISITE,
156
+ }),
157
+ },
158
+ ],
159
+ };
160
+ }, logger);
161
+ }
162
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1hY3Rpb24tZmlsZS11cGxvYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdG9vbHMvcmVxdWVzdC1hY3Rpb24tZmlsZS11cGxvYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1REEscURBNkdDO0FBaktELCtDQUFpQztBQUNqQyw2QkFBd0I7QUFFeEIsbUVBQXNFO0FBQ3RFLHFEQUEyRDtBQUMzRCxtRkFBaUU7QUFFakUsTUFBTSxpQkFBaUIsR0FBRyxzQkFBc0IsQ0FBQztBQUNqRCxNQUFNLGtCQUFrQixHQUFHLGlCQUFpQixDQUFDO0FBQzdDLE1BQU0scUJBQXFCLEdBQUcsc0JBQXNCLENBQUM7QUFDckQsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLENBQUM7QUFDaEMsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDO0FBRXBDLGtHQUFrRztBQUNsRyxrR0FBa0c7QUFDbEcsTUFBTSxtQkFBbUIsR0FDdkIsNkZBQTZGO0lBQzdGLGdHQUFnRztJQUNoRywrRkFBK0Y7SUFDL0YsaUdBQWlHO0lBQ2pHLDRGQUE0RjtJQUM1RixnR0FBZ0c7SUFDaEcsNENBQTRDLENBQUM7QUFRL0MsK0ZBQStGO0FBQy9GLDhGQUE4RjtBQUM5RiwrQ0FBK0M7QUFDL0MsU0FBUyxnQkFBZ0IsQ0FBQyxRQUFnQjtJQUN4QyxNQUFNLElBQUksR0FBRyxRQUFRO1NBQ2xCLElBQUksRUFBRTtTQUNOLEtBQUssQ0FBQyxDQUFDLG1CQUFtQixDQUFDO1FBQzVCLDBGQUEwRjtRQUMxRixvRkFBb0Y7U0FDbkYsT0FBTyxDQUFDLHdCQUF3QixFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBRTFDLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDckQsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLE1BQTBCO0lBQ2pELElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDOUIsSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDdEQsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQUUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFMUYsTUFBTSxJQUFJLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFFRCxTQUF3QixrQ0FBa0MsQ0FDeEQsU0FBb0IsRUFDcEIsR0FBZ0I7SUFFaEIsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxHQUFHLENBQUM7SUFFcEMsT0FBTyxJQUFBLDJCQUF1QixFQUM1QixTQUFTLEVBQ1QseUJBQXlCLEVBQ3pCO1FBQ0UsS0FBSyxFQUFFLHdEQUF3RDtRQUMvRCxXQUFXLEVBQUU7Ozs7Ozs7OztFQVNqQixtQkFBbUI7OzZMQUV3SztRQUN2TCxXQUFXLEVBQUU7WUFDWCxRQUFRLEVBQUUsT0FBQztpQkFDUixNQUFNLEVBQUU7aUJBQ1IsSUFBSSxFQUFFO2lCQUNOLEdBQUcsQ0FBQyxDQUFDLENBQUM7aUJBQ04sUUFBUSxDQUFDLGlEQUFpRCxDQUFDO1lBQzlELFFBQVEsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLGlEQUFpRCxDQUFDO1lBQ2hGLE1BQU0sRUFBRSxPQUFDO2lCQUNOLE1BQU0sRUFBRTtpQkFDUixRQUFRLEVBQUU7aUJBQ1YsUUFBUSxDQUNQLCtFQUErRTtnQkFDN0UsbURBQW1ELENBQ3REO1NBQ0o7S0FDRixFQUNELEtBQUssRUFBRSxPQUF3QyxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQ3hELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUNiLGtEQUFrRDtnQkFDaEQsbUZBQW1GLENBQ3RGLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBcUMsQ0FBQztRQUU1RSxJQUFJLE1BQU0sS0FBSyxTQUFTLElBQUksTUFBTSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzVDLE1BQU0sSUFBSSxLQUFLLENBQUMsNERBQTRELENBQUMsQ0FBQztRQUNoRixDQUFDO1FBRUQscUZBQXFGO1FBQ3JGLHFGQUFxRjtRQUNyRixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7WUFDdEQsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsY0FBYyxVQUFVLENBQUMsQ0FBQztRQUN0RixDQUFDO1FBRUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUM5QyxNQUFNLElBQUksS0FBSyxDQUNiLElBQUksT0FBTyxDQUFDLFFBQVEsNEVBQTRFLENBQ2pHLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRCxNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEQsTUFBTSxHQUFHLEdBQUcsR0FBRyxXQUFXLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUV6RSxNQUFNLFdBQVcsR0FBRyxNQUFNLFdBQVcsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDO1lBQzVELEdBQUc7WUFDSCxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7WUFDMUIsR0FBRyxDQUFDLFlBQVksSUFBSSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQztZQUM3QyxnQkFBZ0IsRUFBRSxXQUFXLENBQUMsbUJBQW1CO1NBQ2xELENBQUMsQ0FBQztRQUVILE1BQU0sTUFBTSxHQUFHLElBQUEsMEJBQWdCLEVBQzdCO1lBQ0UsR0FBRztZQUNILElBQUksRUFBRSxRQUFRO1lBQ2QsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1lBQzFCLE1BQU07WUFDTixHQUFHLENBQUMsWUFBWSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7U0FDdEMsRUFDRCxXQUFXLENBQUMsVUFBVSxFQUN0QixXQUFXLENBQUMsZ0JBQWdCLENBQzdCLENBQUM7UUFFRixPQUFPO1lBQ0wsT0FBTyxFQUFFO2dCQUNQO29CQUNFLElBQUksRUFBRSxNQUFlO29CQUNyQixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQzt3QkFDbkIsU0FBUyxFQUFFLFdBQVcsQ0FBQyxHQUFHO3dCQUMxQixNQUFNLEVBQUUsV0FBVyxDQUFDLE1BQU0sSUFBSSxLQUFLO3dCQUNuQyxPQUFPLEVBQUUsV0FBVyxDQUFDLE9BQU8sSUFBSSxFQUFFLGNBQWMsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFO3dCQUNwRSxnQkFBZ0IsRUFBRSxXQUFXLENBQUMsbUJBQW1CO3dCQUNqRCxRQUFRLEVBQUUsV0FBVyxDQUFDLFFBQVE7d0JBQzlCLFVBQVUsRUFBRSxHQUFHLHFDQUFvQixHQUFHLE1BQU0sRUFBRTt3QkFDOUMsbUZBQW1GO3dCQUNuRixzRUFBc0U7d0JBQ3RFLFlBQVksRUFBRSxtQkFBbUI7cUJBQ2xDLENBQUM7aUJBQ0g7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDLEVBQ0QsTUFBTSxDQUNQLENBQUM7QUFDSixDQUFDIn0=
@@ -0,0 +1,14 @@
1
+ import type { FileUploadsOptions } from '../file-uploads/types';
2
+ /**
3
+ * Loads the `fileUploads` options of the standalone server from a module on disk.
4
+ *
5
+ * A storage backend is an object with methods, so it cannot travel through an environment
6
+ * variable like every other standalone option. Without this, file uploads would be reachable
7
+ * only by embedding the server in an agent or by writing a custom entry point.
8
+ *
9
+ * The module default-exports the options, or a function returning them:
10
+ *
11
+ * module.exports = { storage: myS3Storage, maxBytes: 50 * 1024 * 1024 };
12
+ */
13
+ export default function loadFileUploads(modulePath?: string): Promise<FileUploadsOptions | undefined>;
14
+ //# sourceMappingURL=load-file-uploads.d.ts.map