@@ -1741,36 +1741,97 @@ export const ToolInput = memo(function ToolInput({
17411741 ) : null
17421742 } ) ( ) }
17431743
1744- { requiresOAuth && oauthConfig && (
1745- < div className = 'relative min-w-0 space-y-[6px]' >
1746- < div className = 'font-medium text-[13px] text-[var(--text-primary)]' >
1747- Account < span className = 'ml-0.5' > *</ span >
1748- </ div >
1749- < div className = 'w-full min-w-0' >
1750- < ToolCredentialSelector
1751- value = { tool . params ?. credential || '' }
1752- onChange = { ( value : string ) =>
1753- handleParamChange ( toolIndex , 'credential' , value )
1754- }
1755- provider = { oauthConfig . provider as OAuthProvider }
1756- requiredScopes = {
1757- toolBlock ?. subBlocks ?. find ( ( sb ) => sb . id === 'credential' )
1758- ?. requiredScopes ||
1759- getCanonicalScopesForProvider ( oauthConfig . provider )
1760- }
1761- serviceId = { oauthConfig . provider }
1762- disabled = { disabled }
1763- />
1764- </ div >
1765- </ div >
1766- ) }
1767-
17681744 { ( ( ) => {
17691745 const renderedElements : React . ReactNode [ ] = [ ]
17701746
1747+ const showOAuth =
1748+ requiresOAuth && oauthConfig && tool . params ?. authMethod !== 'bot_token'
1749+
1750+ const renderOAuthAccount = ( ) : React . ReactNode => {
1751+ if ( ! showOAuth || ! oauthConfig ) return null
1752+ const credentialSubBlock = toolBlock ?. subBlocks ?. find (
1753+ ( s ) => s . type === 'oauth-input'
1754+ )
1755+ return (
1756+ < div key = 'oauth-account' className = 'relative min-w-0 space-y-[6px]' >
1757+ < div className = 'font-medium text-[13px] text-[var(--text-primary)]' >
1758+ { credentialSubBlock ?. title || 'Account' } { ' ' }
1759+ < span className = 'ml-0.5' > *</ span >
1760+ </ div >
1761+ < div className = 'w-full min-w-0' >
1762+ < ToolCredentialSelector
1763+ value = { tool . params ?. credential || '' }
1764+ onChange = { ( value : string ) =>
1765+ handleParamChange ( toolIndex , 'credential' , value )
1766+ }
1767+ provider = { oauthConfig . provider as OAuthProvider }
1768+ requiredScopes = {
1769+ credentialSubBlock ?. requiredScopes ||
1770+ getCanonicalScopesForProvider ( oauthConfig . provider )
1771+ }
1772+ serviceId = { oauthConfig . provider }
1773+ disabled = { disabled }
1774+ />
1775+ </ div >
1776+ </ div >
1777+ )
1778+ }
1779+
1780+ const renderSubBlock = ( sb : BlockSubBlockConfig ) : React . ReactNode => {
1781+ const effectiveParamId = sb . id
1782+ const canonicalId = toolCanonicalIndex ?. canonicalIdBySubBlockId [ sb . id ]
1783+ const canonicalGroup = canonicalId
1784+ ? toolCanonicalIndex ?. groupsById [ canonicalId ]
1785+ : undefined
1786+ const hasCanonicalPair = isCanonicalPair ( canonicalGroup )
1787+ const canonicalMode =
1788+ canonicalGroup && hasCanonicalPair
1789+ ? resolveCanonicalMode (
1790+ canonicalGroup ,
1791+ { operation : tool . operation , ...tool . params } ,
1792+ toolScopedOverrides
1793+ )
1794+ : undefined
1795+
1796+ const canonicalToggleProp =
1797+ hasCanonicalPair && canonicalMode && canonicalId
1798+ ? {
1799+ mode : canonicalMode ,
1800+ onToggle : ( ) => {
1801+ const nextMode = canonicalMode === 'advanced' ? 'basic' : 'advanced'
1802+ collaborativeSetBlockCanonicalMode (
1803+ blockId ,
1804+ `${ tool . type } :${ canonicalId } ` ,
1805+ nextMode
1806+ )
1807+ } ,
1808+ }
1809+ : undefined
1810+
1811+ const sbWithTitle = sb . title
1812+ ? sb
1813+ : { ...sb , title : formatParameterLabel ( effectiveParamId ) }
1814+
1815+ return (
1816+ < ToolSubBlockRenderer
1817+ key = { sb . id }
1818+ blockId = { blockId }
1819+ subBlockId = { subBlockId }
1820+ toolIndex = { toolIndex }
1821+ subBlock = { sbWithTitle }
1822+ effectiveParamId = { effectiveParamId }
1823+ toolParams = { tool . params }
1824+ onParamChange = { handleParamChange }
1825+ disabled = { disabled }
1826+ canonicalToggle = { canonicalToggleProp }
1827+ />
1828+ )
1829+ }
1830+
17711831 if ( useSubBlocks && displaySubBlocks . length > 0 ) {
1832+ const allBlockSubBlocks = toolBlock ?. subBlocks || [ ]
17721833 const coveredParamIds = new Set (
1773- displaySubBlocks . flatMap ( ( sb ) => {
1834+ allBlockSubBlocks . flatMap ( ( sb ) => {
17741835 const ids = [ sb . id ]
17751836 if ( sb . canonicalParamId ) ids . push ( sb . canonicalParamId )
17761837 const cId = toolCanonicalIndex ?. canonicalIdBySubBlockId [ sb . id ]
@@ -1785,57 +1846,45 @@ export const ToolInput = memo(function ToolInput({
17851846 } )
17861847 )
17871848
1788- displaySubBlocks . forEach ( ( sb ) => {
1789- const effectiveParamId = sb . id
1790- const canonicalId = toolCanonicalIndex ?. canonicalIdBySubBlockId [ sb . id ]
1791- const canonicalGroup = canonicalId
1792- ? toolCanonicalIndex ?. groupsById [ canonicalId ]
1793- : undefined
1794- const hasCanonicalPair = isCanonicalPair ( canonicalGroup )
1795- const canonicalMode =
1796- canonicalGroup && hasCanonicalPair
1797- ? resolveCanonicalMode (
1798- canonicalGroup ,
1799- { operation : tool . operation , ...tool . params } ,
1800- toolScopedOverrides
1801- )
1802- : undefined
1803-
1804- const canonicalToggleProp =
1805- hasCanonicalPair && canonicalMode && canonicalId
1806- ? {
1807- mode : canonicalMode ,
1808- onToggle : ( ) => {
1809- const nextMode =
1810- canonicalMode === 'advanced' ? 'basic' : 'advanced'
1811- collaborativeSetBlockCanonicalMode (
1812- blockId ,
1813- `${ tool . type } :${ canonicalId } ` ,
1814- nextMode
1815- )
1816- } ,
1817- }
1818- : undefined
1849+ type RenderItem =
1850+ | { kind : 'subblock' ; sb : BlockSubBlockConfig }
1851+ | { kind : 'oauth' }
18191852
1820- const sbWithTitle = sb . title
1821- ? sb
1822- : { ...sb , title : formatParameterLabel ( effectiveParamId ) }
1853+ const renderOrder : RenderItem [ ] = displaySubBlocks . map ( ( sb ) => ( {
1854+ kind : 'subblock' as const ,
1855+ sb,
1856+ } ) )
18231857
1824- renderedElements . push (
1825- < ToolSubBlockRenderer
1826- key = { sb . id }
1827- blockId = { blockId }
1828- subBlockId = { subBlockId }
1829- toolIndex = { toolIndex }
1830- subBlock = { sbWithTitle }
1831- effectiveParamId = { effectiveParamId }
1832- toolParams = { tool . params }
1833- onParamChange = { handleParamChange }
1834- disabled = { disabled }
1835- canonicalToggle = { canonicalToggleProp }
1836- />
1858+ if ( showOAuth ) {
1859+ const credentialIdx = allBlockSubBlocks . findIndex (
1860+ ( sb ) => sb . type === 'oauth-input'
18371861 )
1838- } )
1862+ if ( credentialIdx >= 0 ) {
1863+ const sbPositions = new Map ( allBlockSubBlocks . map ( ( sb , i ) => [ sb . id , i ] ) )
1864+ const insertAt = renderOrder . findIndex (
1865+ ( item ) =>
1866+ item . kind === 'subblock' &&
1867+ ( sbPositions . get ( item . sb . id ) ?? Number . POSITIVE_INFINITY ) >
1868+ credentialIdx
1869+ )
1870+ if ( insertAt === - 1 ) {
1871+ renderOrder . push ( { kind : 'oauth' } )
1872+ } else {
1873+ renderOrder . splice ( insertAt , 0 , { kind : 'oauth' } )
1874+ }
1875+ } else {
1876+ renderOrder . unshift ( { kind : 'oauth' } )
1877+ }
1878+ }
1879+
1880+ for ( const item of renderOrder ) {
1881+ if ( item . kind === 'oauth' ) {
1882+ const el = renderOAuthAccount ( )
1883+ if ( el ) renderedElements . push ( el )
1884+ } else {
1885+ renderedElements . push ( renderSubBlock ( item . sb ) )
1886+ }
1887+ }
18391888
18401889 const uncoveredParams = displayParams . filter (
18411890 ( param ) =>
@@ -1873,6 +1922,11 @@ export const ToolInput = memo(function ToolInput({
18731922 )
18741923 }
18751924
1925+ {
1926+ const el = renderOAuthAccount ( )
1927+ if ( el ) renderedElements . push ( el )
1928+ }
1929+
18761930 const filteredParams = displayParams . filter ( ( param ) =>
18771931 evaluateParameterCondition ( param , tool )
18781932 )
0 commit comments