( name: string, )
| 141 | * @see https://docs.skybridge.tech/api-reference/use-call-tool |
| 142 | */ |
| 143 | export const useCallTool = < |
| 144 | ToolArgs extends CallToolArgs = null, |
| 145 | ToolResponse extends Partial<ToolResponseSignature> = Record<string, never>, |
| 146 | >( |
| 147 | name: string, |
| 148 | ) => { |
| 149 | type CombinedCallToolResponse = CallToolResponse & ToolResponse; |
| 150 | |
| 151 | const [{ status, data, error }, setCallToolState] = useState< |
| 152 | Omit< |
| 153 | CallToolState<CombinedCallToolResponse>, |
| 154 | "isIdle" | "isPending" | "isSuccess" | "isError" |
| 155 | > |
| 156 | >({ status: "idle", data: undefined, error: undefined }); |
| 157 | |
| 158 | const callIdRef = useRef(0); |
| 159 | const adaptor = getAdaptor(); |
| 160 | |
| 161 | const execute = async ( |
| 162 | toolArgs: ToolArgs, |
| 163 | ): Promise<CombinedCallToolResponse> => { |
| 164 | const callId = ++callIdRef.current; |
| 165 | setCallToolState({ status: "pending", data: undefined, error: undefined }); |
| 166 | |
| 167 | try { |
| 168 | const data = await adaptor.callTool<ToolArgs, CombinedCallToolResponse>( |
| 169 | name, |
| 170 | toolArgs, |
| 171 | ); |
| 172 | if (callId === callIdRef.current) { |
| 173 | setCallToolState({ status: "success", data, error: undefined }); |
| 174 | } |
| 175 | |
| 176 | return data; |
| 177 | } catch (error) { |
| 178 | if (callId === callIdRef.current) { |
| 179 | setCallToolState({ status: "error", data: undefined, error }); |
| 180 | } |
| 181 | throw error; |
| 182 | } |
| 183 | }; |
| 184 | |
| 185 | const callToolAsync = ((toolArgs?: ToolArgs) => { |
| 186 | if (toolArgs === undefined) { |
| 187 | return execute(null as ToolArgs); |
| 188 | } |
| 189 | return execute(toolArgs); |
| 190 | }) as CallToolAsyncFn<ToolArgs, CombinedCallToolResponse>; |
| 191 | |
| 192 | const callTool = (( |
| 193 | firstArg?: ToolArgs | SideEffects<ToolArgs, CombinedCallToolResponse>, |
| 194 | sideEffects?: SideEffects<ToolArgs, CombinedCallToolResponse>, |
| 195 | ) => { |
| 196 | let toolArgs: ToolArgs; |
| 197 | if ( |
| 198 | firstArg && |
| 199 | typeof firstArg === "object" && |
| 200 | ("onSuccess" in firstArg || |
no test coverage detected