feat: add 'Open in new tab' button for agents (#13044)

- Add new button in agent management dropdown to open agent in new tab
- Implement token-based authentication for shared agent access
- Add translations for 9 languages (en, zh, zh-tw, de, fr, it, ru,
pt-br, vi)
- Keep existing 'Embed into webpage' functionality intact

### What problem does this PR solve?

This allows users to open agents in a separate tab to work in background
while continuing to use other parts of the application.

<img width="1920" height="1080" alt="image"
src="https://github.com/user-attachments/assets/ca1719c8-2f00-4570-a730-1321fa0bfd57"
/>
<img width="254" height="222" alt="image"
src="https://github.com/user-attachments/assets/b3dd6d9f-b7e7-46b0-83e7-f0ea86e7b156"
/>
<img width="1920" height="1080" alt="image"
src="https://github.com/user-attachments/assets/e94e99f9-9039-43f7-b2d9-862b9448630c"
/>

### Type of change

- [x] New Feature (non-breaking change which adds functionality)
This commit is contained in:
PentaFDevs
2026-02-25 06:39:02 +01:00
committed by GitHub
parent cf6fd6f115
commit 8ad47bf242
12 changed files with 33 additions and 3 deletions

View File

@@ -1,6 +1,7 @@
import CopyToClipboard from '@/components/copy-to-clipboard';
import HighLightMarkdown from '@/components/highlight-markdown';
import { SelectWithSearch } from '@/components/originui/select-with-search';
import { Button } from '@/components/ui/button';
import {
Dialog,
DialogContent,
@@ -28,6 +29,7 @@ import { useTranslate } from '@/hooks/common-hooks';
import { IModalProps } from '@/interfaces/common';
import { Routes } from '@/routes';
import { zodResolver } from '@hookform/resolvers/zod';
import { ExternalLink } from 'lucide-react';
import { memo, useCallback, useMemo } from 'react';
import { useForm, useWatch } from 'react-hook-form';
import { z } from 'zod';
@@ -146,6 +148,11 @@ function EmbedDialog({
}
}, [generateIframeSrc, values]);
const handleOpenInNewTab = useCallback(() => {
const iframeSrc = generateIframeSrc();
window.open(iframeSrc, '_blank');
}, [generateIframeSrc]);
return (
<Dialog open onOpenChange={hideModal}>
<DialogContent>
@@ -280,6 +287,14 @@ function EmbedDialog({
<HighLightMarkdown>{text}</HighLightMarkdown>
</div>
</div>
<Button
onClick={handleOpenInNewTab}
className="w-full"
variant="secondary"
>
<ExternalLink className="mr-2 h-4 w-4" />
{t('openInNewTab', { keyPrefix: 'common' })}
</Button>
<div className=" font-medium mt-4 mb-1">
{t(isAgent ? 'flow' : 'chat', { keyPrefix: 'header' })}
<span className="ml-1 inline-block">ID</span>