import { z } from 'zod' import { UUID } from 'crypto' import * as React from 'react' export interface ToolUseContext { messageId: UUID agentId?: string safeMode?: boolean } export interface ValidationResult { result: boolean message?: string errorCode?: number meta?: any } export interface Tool< TInput extends z.ZodObject = z.ZodObject, TOutput = any, > { name: string description?: () => Promise inputSchema: TInput inputJSONSchema?: Record prompt: (options?: { safeMode?: boolean }) => Promise userFacingName?: () => string isEnabled: () => Promise isReadOnly: () => boolean isConcurrencySafe: () => boolean needsPermissions: (input?: z.infer) => boolean validateInput?: ( input: z.infer, context?: ToolUseContext, ) => Promise renderResultForAssistant: (output: TOutput) => string renderToolUseMessage: ( input: z.infer, options: { verbose: boolean }, ) => string renderToolUseRejectedMessage: () => React.ReactElement renderToolResultMessage?: (output: TOutput) => React.ReactElement call: ( input: z.infer, context: ToolUseContext, ) => AsyncGenerator< { type: 'result'; data: TOutput; resultForAssistant?: string }, void, unknown > } export type { ToolUseContext, ValidationResult }