@@ -416,7 +416,9 @@ CodeEditor.llm_chat_input {
416416 text-as-fallback: true;
417417}
418418.llm_chatui PushButton:hover,
419- .llm_chatui SelectButton:hover {
419+ .llm_chatui SelectButton:hover,
420+ .llm_chatui .permission_options PushButton:focus,
421+ .llm_chatui .permission_options SelectButton:focus {
420422 border-color: var(--primary);
421423}
422424.llm_conversation_opt PushButton {
@@ -482,6 +484,21 @@ DropDownList.role_ui {
482484 foreground-size: 12dp 16dp;
483485 foreground-tint: var(--icon);
484486}
487+ .tool_permission {
488+ background-color: var(--list-back);
489+ border-radius: 8dp;
490+ padding: 4dp;
491+ }
492+ .tool_permission .llm_conversation_opt {
493+ background-color: var(--back);
494+ border-radius: 4dp;
495+ }
496+ .tool_permission .permission_options {
497+ margin-top: 8dp;
498+ }
499+ .tool_permission .permission_options > PushButton {
500+ margin-right: 8dp;
501+ }
485502]]>
486503</style>
487504<Splitter lw="mp" lh="mp" orientation="vertical" splitter-partition="75%" padding="4dp">
@@ -555,14 +572,13 @@ static const char* DEFAULT_CHAT_GLOBE = R"xml(
555572)xml" ;
556573
557574static const char * DEFAULT_PERMISSION_GLOBE = R"xml(
558- <vbox class="llm_conversation tool_permission" lw="mp" lh="wc" margin-bottom="8dp">
559- <hbox class="llm_conversation_opt" lw="mp" lh="wc" background-color="var(--primary)" padding="4dp">
560- <TextView text="@string(tool_call_permission_request, Tool Call Permission Request)" font-style="bold" margin-left="4dp" />
561- </hbox>
562-
563- <vbox class="data_ui" lw="mp" lh="wc" padding="8dp" background-color="var(--tab-back)">
564- <TextView class="permission_desc" lw="mp" lh="wc" word-wrap="true" />
565- <hbox class="permission_options" lw="mp" lh="wc" margin-top="8dp" />
575+ <vbox class="llm_conversation tool_permission" lw="mp" lh="wc">
576+ <hbox class="llm_conversation_opt" lw="mp" lh="wc" padding="4dp">
577+ <TextView text="@string(tool_call_permission_request, Tool Call Permission Request)" font-style="bold" margin-left="4dp" />
578+ </hbox>
579+ <vbox class="data_ui" lw="mp" lh="wc" padding="8dp">
580+ <MarkdownView class="permission_desc" lw="mp" lh="wc" />
581+ <StackLayout class="permission_options" lw="mp" lh="wc" />
566582 </vbox>
567583</vbox>
568584)xml" ;
@@ -2400,27 +2416,29 @@ void LLMChatUI::addPermissionUI( const acp::RequestPermissionRequest& req,
24002416 UIWidget* chat =
24012417 mChatsList ->getUISceneNode ()->loadLayoutFromString ( DEFAULT_PERMISSION_GLOBE , mChatsList );
24022418
2403- UITextView * desc = chat->findByClass <UITextView >( " permission_desc" );
2419+ UIMarkdownView * desc = chat->findByClass <UIMarkdownView >( " permission_desc" );
24042420 std::string descStr =
2421+ " ##### " +
24052422 i18n ( " agent_wants_to_execute_tool_call" , " The agent wants to execute a tool call:" ) +
2406- " \n " ;
2407- descStr += i18n ( " title" , " Title" ) + " : " + req.toolCall .title + " \n " ;
2408- descStr += i18n ( " kind" , " Kind" ) + " : " + req.toolCall .kind + " \n " ;
2423+ " \n\n " ;
2424+ descStr += " ** " + i18n ( " title" , " Title" ) + " :** " + req.toolCall .title + " \n \n" ;
2425+ descStr += " ** " + i18n ( " kind" , " Kind" ) + " :** ` " + req.toolCall .kind + " ` \n \n" ;
24092426 if ( !req.toolCall .rawInput .is_null () ) {
2410- descStr += i18n ( " input" , " Input" ) + " :\n " + req.toolCall .rawInput .dump ( 2 ) + " \n " ;
2427+ descStr +=
2428+ " **" + i18n ( " input" , " Input" ) + " :**\n\n " + req.toolCall .rawInput .dump ( 2 ) + " \n " ;
24112429 }
2412- desc->setText ( descStr );
2430+ desc->loadFromString ( descStr );
24132431 UIWidget* optionsBox = chat->findByClass ( " permission_options" );
24142432 if ( !optionsBox )
24152433 return ;
24162434
24172435 bool isFirst = true ;
2436+ UIPushButton* firstBut = nullptr ;
2437+ UIPushButton* lastBut = nullptr ;
24182438 for ( const auto & opt : req.options ) {
24192439 UIPushButton* but = UIPushButton::New ();
24202440 but->setParent ( optionsBox );
24212441 but->setText ( opt.name );
2422- but->setTooltipText ( opt.kind );
2423- but->setLayoutMargin ( Rectf ( 0 , 0 , 8 , 0 ) );
24242442
24252443 auto cbCopy = cb;
24262444 auto optId = opt.optionId ;
@@ -2431,15 +2449,22 @@ void LLMChatUI::addPermissionUI( const acp::RequestPermissionRequest& req,
24312449 res.optionId = optId;
24322450 cbCopy ( res );
24332451
2434- if ( mChatInput ) {
2452+ if ( mChatInput )
24352453 mChatInput ->setFocus ();
2436- }
24372454 } );
24382455
24392456 if ( isFirst ) {
24402457 isFirst = false ;
2441- but->setFocus ();
2458+ firstBut = but;
2459+ but->runOnMainThread ( [but] { but->setFocus (); } );
24422460 }
2461+
2462+ lastBut = but;
2463+ }
2464+
2465+ if ( lastBut && firstBut != lastBut ) {
2466+ lastBut->on ( Event::OnTabNavigate,
2467+ [firstBut]( const Event* event ) { firstBut->setFocus (); } );
24432468 }
24442469
24452470 mChatScrollView ->getVerticalScrollBar ()->setValue ( 1 .0f );
0 commit comments