@@ -188,6 +188,7 @@ interface TerminalViewportProps {
188188 runtimeEnv ?: Record < string , string > ;
189189 onSessionExited : ( ) => void ;
190190 onAddTerminalContext : ( selection : TerminalContextSelection ) => void ;
191+ onPreviewUrl ?: ( ( url : string ) => void ) | undefined ;
191192 focusRequestId : number ;
192193 autoFocus : boolean ;
193194 resizeEpoch : number ;
@@ -202,6 +203,7 @@ function TerminalViewport({
202203 runtimeEnv,
203204 onSessionExited,
204205 onAddTerminalContext,
206+ onPreviewUrl,
205207 focusRequestId,
206208 autoFocus,
207209 resizeEpoch,
@@ -212,6 +214,7 @@ function TerminalViewport({
212214 const fitAddonRef = useRef < FitAddon | null > ( null ) ;
213215 const onSessionExitedRef = useRef ( onSessionExited ) ;
214216 const onAddTerminalContextRef = useRef ( onAddTerminalContext ) ;
217+ const onPreviewUrlRef = useRef ( onPreviewUrl ) ;
215218 const terminalLabelRef = useRef ( terminalLabel ) ;
216219 const hasHandledExitRef = useRef ( false ) ;
217220 const selectionPointerRef = useRef < { x : number ; y : number } | null > ( null ) ;
@@ -228,6 +231,10 @@ function TerminalViewport({
228231 onAddTerminalContextRef . current = onAddTerminalContext ;
229232 } , [ onAddTerminalContext ] ) ;
230233
234+ useEffect ( ( ) => {
235+ onPreviewUrlRef . current = onPreviewUrl ;
236+ } , [ onPreviewUrl ] ) ;
237+
231238 useEffect ( ( ) => {
232239 terminalLabelRef . current = terminalLabel ;
233240 } , [ terminalLabel ] ) ;
@@ -393,12 +400,17 @@ function TerminalViewport({
393400 if ( ! latestTerminal ) return ;
394401
395402 if ( match . kind === "url" ) {
396- void api . shell . openExternal ( match . text ) . catch ( ( error ) => {
397- writeSystemMessage (
398- latestTerminal ,
399- error instanceof Error ? error . message : "Unable to open link" ,
400- ) ;
401- } ) ;
403+ const previewHandler = onPreviewUrlRef . current ;
404+ if ( previewHandler ) {
405+ previewHandler ( match . text ) ;
406+ } else {
407+ void api . shell . openExternal ( match . text ) . catch ( ( error ) => {
408+ writeSystemMessage (
409+ latestTerminal ,
410+ error instanceof Error ? error . message : "Unable to open link" ,
411+ ) ;
412+ } ) ;
413+ }
402414 return ;
403415 }
404416
@@ -662,6 +674,7 @@ interface ThreadTerminalDrawerProps {
662674 onCloseTerminal : ( terminalId : string ) => void ;
663675 onHeightChange : ( height : number ) => void ;
664676 onAddTerminalContext : ( selection : TerminalContextSelection ) => void ;
677+ onPreviewUrl ?: ( ( url : string ) => void ) | undefined ;
665678}
666679
667680interface TerminalActionButtonProps {
@@ -712,6 +725,7 @@ export default function ThreadTerminalDrawer({
712725 onCloseTerminal,
713726 onHeightChange,
714727 onAddTerminalContext,
728+ onPreviewUrl,
715729} : ThreadTerminalDrawerProps ) {
716730 const [ drawerHeight , setDrawerHeight ] = useState ( ( ) => clampDrawerHeight ( height ) ) ;
717731 const [ resizeEpoch , setResizeEpoch ] = useState ( 0 ) ;
@@ -1013,6 +1027,7 @@ export default function ThreadTerminalDrawer({
10131027 { ...( runtimeEnv ? { runtimeEnv } : { } ) }
10141028 onSessionExited = { ( ) => onCloseTerminal ( terminalId ) }
10151029 onAddTerminalContext = { onAddTerminalContext }
1030+ onPreviewUrl = { onPreviewUrl }
10161031 focusRequestId = { focusRequestId }
10171032 autoFocus = { terminalId === resolvedActiveTerminalId }
10181033 resizeEpoch = { resizeEpoch }
@@ -1033,6 +1048,7 @@ export default function ThreadTerminalDrawer({
10331048 { ...( runtimeEnv ? { runtimeEnv } : { } ) }
10341049 onSessionExited = { ( ) => onCloseTerminal ( resolvedActiveTerminalId ) }
10351050 onAddTerminalContext = { onAddTerminalContext }
1051+ onPreviewUrl = { onPreviewUrl }
10361052 focusRequestId = { focusRequestId }
10371053 autoFocus
10381054 resizeEpoch = { resizeEpoch }
0 commit comments