/**
* get_object tool implementation
* Retrieves the content of an object from storage
*/
import { z } from "zod";
import { ProviderManager } from "../providers/manager.js";
import { createToolSuccessResponse, createToolErrorResponse } from "../utils/response-formatter.js";
/**
* Schema for get_object tool
*/
export const getObjectSchema = {
bucket: z.string().describe("The name of the bucket containing the object"),
key: z.string().describe("The object key (full path) to retrieve"),
max_size: z.number().optional().describe("Maximum content size to read in bytes (default: 10MB). Larger files will be truncated."),
};
/**
* Get metadata for get_object tool
*/
export function getGetObjectMetadata(sourceId: string, maxSize?: number) {
const toolName = sourceId === "default" ? "get_object" : `get_object_${sourceId}`;
return {
name: toolName,
title: `Get Object (${sourceId})`,
description: `Retrieve the content of an object from the '${sourceId}' source. Text files are returned as plain text, binary files as base64.${maxSize ? ` Max size: ${maxSize} bytes` : " Default max size: 10MB"}`,
schema: getObjectSchema,
annotations: {
title: `get_object (${sourceId})`,
readOnlyHint: true,
destructiveHint: false,
idempotentHint: true,
openWorldHint: false,
},
};
}
/**
* Create get_object tool handler for a specific source
*/
export function createGetObjectToolHandler(sourceId?: string, defaultMaxSize?: number) {
return async (args: any, _extra: any) => {
const { bucket, key, max_size } = args as {
bucket: string;
key: string;
max_size?: number;
};
try {
const provider = ProviderManager.getCurrentProvider(sourceId);
const result = await provider.getObject(bucket, key, {
maxSize: max_size || defaultMaxSize || 10 * 1024 * 1024, // 10MB default
});
return createToolSuccessResponse({
...result,
source_id: sourceId || "default",
});
} catch (error) {
return createToolErrorResponse((error as Error).message, "GET_OBJECT_ERROR");
}
};
}