feat(agent-v2): connect roster to generated contracts

This commit is contained in:
yyh
2026-06-04 16:05:50 +08:00
parent 35e21de9f8
commit 009c6adc8f
35 changed files with 1482 additions and 1149 deletions

View File

@ -1,72 +0,0 @@
import { fireEvent, render, screen } from '@testing-library/react'
import { AgentDetailPage } from '../pages/agent-detail-page'
describe('AgentDetailPage', () => {
it('renders configurable memory settings', () => {
render(<AgentDetailPage section="configure" />)
expect(screen.getByRole('region', { name: 'agentV2.agentDetail.sections.configure' })).toBeInTheDocument()
expect(screen.getByRole('heading', { name: 'agentV2.agentDetail.memorySettings.title' })).toBeInTheDocument()
expect(screen.getByRole('button', { name: /agentV2\.agentDetail\.memorySettings\.strategies\.medium\.label/ })).toHaveAttribute('aria-pressed', 'true')
expect(screen.getByRole('button', { name: /agentV2\.agentDetail\.memorySettings\.isolation\.perApp\.label/ })).toHaveAttribute('aria-pressed', 'true')
expect(screen.getByRole('button', { name: /agentV2\.agentDetail\.memorySettings\.export\.download/ })).toBeInTheDocument()
})
it('switches memory strategy and isolation choices', () => {
render(<AgentDetailPage section="configure" />)
const economyStrategy = screen.getByRole('button', {
name: /agentV2\.agentDetail\.memorySettings\.strategies\.economy\.label/,
})
const perRunIsolation = screen.getByRole('button', {
name: /agentV2\.agentDetail\.memorySettings\.isolation\.perRun\.label/,
})
fireEvent.click(economyStrategy)
fireEvent.click(perRunIsolation)
expect(economyStrategy).toHaveAttribute('aria-pressed', 'true')
expect(perRunIsolation).toHaveAttribute('aria-pressed', 'true')
expect(screen.getByRole('button', {
name: /agentV2\.agentDetail\.memorySettings\.strategies\.medium\.label/,
})).toHaveAttribute('aria-pressed', 'false')
expect(screen.getByRole('button', {
name: /agentV2\.agentDetail\.memorySettings\.isolation\.perApp\.label/,
})).toHaveAttribute('aria-pressed', 'false')
})
it('renders the logs skeleton with filters and table rows', () => {
render(<AgentDetailPage section="logs" />)
expect(screen.getByRole('region', { name: 'agentV2.agentDetail.sections.logs' })).toBeInTheDocument()
expect(screen.getByRole('heading', { name: 'agentV2.agentDetail.logs.title' })).toBeInTheDocument()
expect(screen.getByRole('combobox', {
name: 'agentV2.agentDetail.logs.filters.status.label',
})).toHaveTextContent('agentV2.agentDetail.logs.filters.status.all')
expect(screen.getByRole('combobox', {
name: 'agentV2.agentDetail.logs.filters.period.label',
})).toHaveTextContent('agentV2.agentDetail.logs.filters.period.last7days')
expect(screen.getByRole('textbox', {
name: 'agentV2.agentDetail.logs.filters.search.label',
})).toBeInTheDocument()
expect(screen.getByRole('columnheader', { name: 'agentV2.agentDetail.logs.table.startTime' })).toBeInTheDocument()
expect(screen.getByText('run_8f4e21')).toBeInTheDocument()
expect(screen.getByRole('navigation', { name: 'Pagination' })).toBeInTheDocument()
})
it('renders the monitoring layout with metric cards', () => {
render(<AgentDetailPage section="monitoring" />)
expect(screen.getByRole('region', { name: 'agentV2.agentDetail.sections.monitoring' })).toBeInTheDocument()
expect(screen.getByText('agentV2.agentDetail.monitoring.title')).toBeInTheDocument()
expect(screen.getByText('agentV2.agentDetail.monitoring.metrics.totalRuns.title')).toBeInTheDocument()
expect(screen.getByText('agentV2.agentDetail.monitoring.metrics.activeUsers.title')).toBeInTheDocument()
expect(screen.getByText('agentV2.agentDetail.monitoring.metrics.tokenUsage.title')).toBeInTheDocument()
expect(screen.getByText('agentV2.agentDetail.monitoring.metrics.avgInteractions.title')).toBeInTheDocument()
expect(screen.getByRole('combobox', {
name: 'agentV2.agentDetail.monitoring.timeRangeLabel',
})).toHaveTextContent('agentV2.agentDetail.monitoring.timeRanges.last7days')
expect(screen.getAllByLabelText(/agentV2\.agentDetail\.monitoring\.metrics\..*\.explanation/)).toHaveLength(4)
})
})

View File

@ -1,86 +0,0 @@
import { toast } from '@langgenius/dify-ui/toast'
import { fireEvent, render, screen } from '@testing-library/react'
import { AgentDetailLayout } from '../layout'
vi.mock('@langgenius/dify-ui/toast', () => ({
toast: {
success: vi.fn(),
},
}))
vi.mock('@/hooks/use-document-title', () => ({
default: vi.fn(),
}))
describe('AgentDetailLayout', () => {
beforeEach(() => {
vi.clearAllMocks()
})
it('renders the detail shell without feature data', () => {
render(
<AgentDetailLayout agentId="agent-1">
<section aria-label="content" />
</AgentDetailLayout>,
)
expect(screen.getByRole('heading', { name: 'agentV2.agentDetail.title' })).toBeInTheDocument()
expect(screen.getByText(/agentV2\.agentDetail\.subtitle/)).toBeInTheDocument()
expect(screen.getByRole('button', { name: 'agentV2.agentDetail.publish' })).toBeEnabled()
expect(screen.getByLabelText('content')).toBeInTheDocument()
})
it('shows publish menu actions from the publish button', async () => {
render(
<AgentDetailLayout agentId="agent-1">
<section aria-label="content" />
</AgentDetailLayout>,
)
fireEvent.click(screen.getByRole('button', { name: 'agentV2.agentDetail.publish' }))
expect(await screen.findByText('agentV2.agentDetail.publishMenu.publishUpdate')).toBeInTheDocument()
expect(screen.getByText('agentV2.agentDetail.publishMenu.publishUpdateDescription')).toBeInTheDocument()
expect(screen.getByText('agentV2.agentDetail.publishMenu.saveAsNewAgent')).toBeInTheDocument()
expect(screen.getByText('agentV2.agentDetail.publishMenu.saveAsNewAgentDescription')).toBeInTheDocument()
})
it('shows success toast when publish menu actions are clicked', async () => {
render(
<AgentDetailLayout agentId="agent-1">
<section aria-label="content" />
</AgentDetailLayout>,
)
fireEvent.click(screen.getByRole('button', { name: 'agentV2.agentDetail.publish' }))
fireEvent.click(await screen.findByText('agentV2.agentDetail.publishMenu.publishUpdate'))
expect(toast.success).toHaveBeenCalledWith('common.api.success')
fireEvent.click(screen.getByRole('button', { name: 'agentV2.agentDetail.publish' }))
fireEvent.click(await screen.findByText('agentV2.agentDetail.publishMenu.saveAsNewAgent'))
expect(toast.success).toHaveBeenCalledTimes(2)
expect(toast.success).toHaveBeenLastCalledWith('common.api.success')
})
it('opens mock version history from the history button', () => {
render(
<AgentDetailLayout agentId="agent-1">
<section aria-label="content" />
</AgentDetailLayout>,
)
fireEvent.click(screen.getByRole('button', { name: 'workflow.common.versionHistory' }))
expect(screen.getByText('workflow.versionHistory.title')).toBeInTheDocument()
expect(screen.getByText('workflow.versionHistory.currentDraft')).toBeInTheDocument()
expect(screen.getByText('v1.4.0 Handoff rules')).toBeInTheDocument()
expect(screen.getByText('Aligned escalation handoff rules and response boundaries.')).toBeInTheDocument()
expect(screen.getByText('workflow.versionHistory.latest')).toBeInTheDocument()
fireEvent.click(screen.getByRole('button', { name: 'common.operation.close' }))
expect(screen.queryByText('workflow.versionHistory.title')).not.toBeInTheDocument()
})
})

View File

@ -1,75 +0,0 @@
import type { ReactNode } from 'react'
import type { Mock } from 'vitest'
import { fireEvent, render, screen } from '@testing-library/react'
import { createStore, Provider as JotaiProvider } from 'jotai'
import { useGotoAnythingOpen } from '@/app/components/goto-anything/atoms'
import { usePathname, useRouter } from '@/next/navigation'
import { AgentDetailSection, AgentDetailTop } from '../navigation'
vi.mock('@/next/navigation', async (importOriginal) => {
const actual = await importOriginal<typeof import('@/next/navigation')>()
return {
...actual,
usePathname: vi.fn(),
useRouter: vi.fn(),
}
})
function GotoAnythingOpenProbe() {
const open = useGotoAnythingOpen()
return <div data-testid="goto-anything-open">{String(open)}</div>
}
const renderWithGotoAnythingStore = (ui: ReactNode) => {
const store = createStore()
return render(
<JotaiProvider store={store}>
{ui}
</JotaiProvider>,
)
}
describe('Agent detail navigation', () => {
beforeEach(() => {
vi.clearAllMocks()
;(useRouter as Mock).mockReturnValue({ back: vi.fn() })
})
it('renders roster breadcrumb controls', () => {
renderWithGotoAnythingStore(<AgentDetailTop />)
expect(screen.getByRole('link', { name: 'common.mainNav.home' })).toHaveAttribute('href', '/')
expect(screen.getByRole('link', { name: 'common.menus.roster' })).toHaveAttribute('href', '/roster')
expect(screen.getByRole('button', { name: 'app.gotoAnything.searchTitle' })).toBeInTheDocument()
})
it('opens goto anything through atom state', () => {
renderWithGotoAnythingStore(
<>
<AgentDetailTop />
<GotoAnythingOpenProbe />
</>,
)
expect(screen.getByTestId('goto-anything-open')).toHaveTextContent('false')
fireEvent.click(screen.getByRole('button', { name: 'app.gotoAnything.searchTitle' }))
expect(screen.getByTestId('goto-anything-open')).toHaveTextContent('true')
})
it('renders agent detail tabs from the route agent id', () => {
;(usePathname as Mock).mockReturnValue('/roster/agent-1/logs')
render(<AgentDetailSection />)
expect(screen.getByRole('navigation', { name: 'agentV2.agentDetail.navigationLabel' })).toBeInTheDocument()
expect(screen.getByRole('link', { name: 'agentV2.agentDetail.sections.configure' })).toHaveAttribute('href', '/roster/agent-1/configure')
expect(screen.getByRole('link', { name: 'agentV2.agentDetail.sections.access' })).toHaveAttribute('href', '/roster/agent-1/access')
expect(screen.getByRole('link', { name: 'agentV2.agentDetail.sections.logs' })).toHaveAttribute('href', '/roster/agent-1/logs')
expect(screen.queryByRole('link', { name: 'agentV2.agentDetail.sections.annotation' })).not.toBeInTheDocument()
expect(screen.getByRole('link', { name: 'agentV2.agentDetail.sections.monitoring' })).toHaveAttribute('href', '/roster/agent-1/monitoring')
})
})

View File

@ -1,83 +0,0 @@
import type { Mock } from 'vitest'
import { fireEvent, render, screen } from '@testing-library/react'
import { usePathname, useRouter } from '@/next/navigation'
import { AgentDetailPage } from '../page'
vi.mock('echarts-for-react', () => ({
default: () => <div data-testid="agent-monitoring-chart" />,
}))
vi.mock('@/next/navigation', async (importOriginal) => {
const actual = await importOriginal<typeof import('@/next/navigation')>()
return {
...actual,
usePathname: vi.fn(),
useRouter: vi.fn(),
}
})
describe('AgentDetailPage', () => {
const push = vi.fn()
beforeEach(() => {
vi.clearAllMocks()
;(usePathname as Mock).mockReturnValue('/roster/agent-1/access')
;(useRouter as Mock).mockReturnValue({ push })
})
it('renders the logs skeleton with filters and table rows', () => {
render(<AgentDetailPage agentId="agent-1" section="logs" />)
expect(screen.getByRole('region', { name: 'agentV2.agentDetail.sections.logs' })).toBeInTheDocument()
expect(screen.getByRole('heading', { name: 'agentV2.agentDetail.logs.title' })).toBeInTheDocument()
expect(screen.getByRole('combobox', {
name: 'agentV2.agentDetail.logs.filters.status.label',
})).toHaveTextContent('agentV2.agentDetail.logs.filters.status.all')
expect(screen.getByRole('combobox', {
name: 'agentV2.agentDetail.logs.filters.period.label',
})).toHaveTextContent('agentV2.agentDetail.logs.filters.period.last7days')
expect(screen.getByRole('textbox', {
name: 'agentV2.agentDetail.logs.filters.search.label',
})).toBeInTheDocument()
expect(screen.getByRole('columnheader', { name: 'agentV2.agentDetail.logs.table.startTime' })).toBeInTheDocument()
expect(screen.getByText('run_8f4e21')).toBeInTheDocument()
expect(screen.getByRole('navigation', { name: 'Pagination' })).toBeInTheDocument()
})
it('renders the monitoring layout with metric cards', () => {
render(<AgentDetailPage agentId="agent-1" section="monitoring" />)
expect(screen.getByRole('region', { name: 'agentV2.agentDetail.sections.monitoring' })).toBeInTheDocument()
expect(screen.getByText('agentV2.agentDetail.monitoring.title')).toBeInTheDocument()
expect(screen.getByRole('combobox', {
name: 'agentV2.agentDetail.monitoring.timeRangeLabel',
})).toHaveTextContent('agentV2.agentDetail.monitoring.timeRanges.today')
expect(screen.getByRole('combobox', {
name: 'agentV2.agentDetail.monitoring.sourceLabel',
})).toHaveTextContent('agentV2.agentDetail.access.entries.webapp.name')
expect(screen.getByText('agentV2.agentDetail.monitoring.metrics.totalConversations.title')).toBeInTheDocument()
expect(screen.getByText('agentV2.agentDetail.monitoring.metrics.activeUsers.title')).toBeInTheDocument()
expect(screen.getByText('agentV2.agentDetail.monitoring.metrics.avgSessionInteractions.title')).toBeInTheDocument()
expect(screen.getByText('agentV2.agentDetail.monitoring.metrics.tokenOutputSpeed.title')).toBeInTheDocument()
expect(screen.getByText('agentV2.agentDetail.monitoring.metrics.userSatisfactionRate.title')).toBeInTheDocument()
expect(screen.getByText('agentV2.agentDetail.monitoring.metrics.tokenUsage.title')).toBeInTheDocument()
expect(screen.getByText('agentV2.agentDetail.monitoring.metrics.totalMessages.title')).toBeInTheDocument()
expect(screen.getAllByLabelText(/agentV2\.agentDetail\.monitoring\.metrics\..*\.explanation/)).toHaveLength(7)
expect(screen.getAllByTestId('agent-monitoring-chart')).toHaveLength(7)
})
it('routes access actions to the target tab', async () => {
render(<AgentDetailPage agentId="agent-1" section="access" />)
expect(screen.getByRole('region', { name: 'agentV2.agentDetail.sections.access' })).toBeInTheDocument()
expect(screen.getByRole('heading', { name: 'agentV2.agentDetail.access.title' })).toBeInTheDocument()
expect(screen.getByText('agentV2.agentDetail.access.entries.webapp.name')).toBeInTheDocument()
fireEvent.click(screen.getAllByRole('button', {
name: /agentV2\.agentDetail\.access\.moreActions/,
})[0]!)
fireEvent.click(await screen.findByText('agentV2.agentDetail.sections.logs'))
expect(push).toHaveBeenCalledWith('/roster/agent-1/logs')
})
})

View File

@ -1,20 +0,0 @@
import { render, screen } from '@testing-library/react'
import RosterPage from '../page'
vi.mock('@/hooks/use-document-title', () => ({
default: vi.fn(),
}))
describe('RosterPage', () => {
it('renders the agent roster shell without fetching feature data', () => {
render(<RosterPage />)
expect(screen.getByRole('heading', { name: 'common.menus.roster', level: 1 })).toBeInTheDocument()
expect(screen.getByRole('heading', { name: 'agentV2.roster.title', level: 2 })).toBeInTheDocument()
expect(screen.getByRole('navigation', { name: 'agentV2.roster.sidebarLabel' })).toBeInTheDocument()
expect(screen.getByPlaceholderText('agentV2.roster.searchPlaceholder')).toBeInTheDocument()
expect(screen.getByText('Iris - Clarification Drafter')).toBeInTheDocument()
expect(screen.getByText('Aiko - Document Translator')).toBeInTheDocument()
expect(screen.getAllByRole('link', { name: /agentV2\.roster\.editAgent/ })[0]).toHaveAttribute('href', '/roster/iris/configure')
})
})

View File

@ -0,0 +1,163 @@
'use client'
import type { AgentRosterResponse } from '@dify/contracts/api/console/agents/types.gen'
import { Button } from '@langgenius/dify-ui/button'
import { cn } from '@langgenius/dify-ui/cn'
import { useTranslation } from 'react-i18next'
import Link from '@/next/link'
import { ArchiveAgentButton } from './archive-agent-button'
import { EditAgentDialog } from './edit-agent-dialog'
type AgentRosterListProps = {
agents: AgentRosterResponse[]
hasMore: boolean
isEmptySearch: boolean
isError: boolean
isFetching: boolean
isFetchingNextPage: boolean
isPending: boolean
onLoadMore: () => void
}
const getSourceLabelKey = (source: AgentRosterResponse['source']) => `roster.sources.${source}` as const
const skeletonRows = ['primary', 'secondary', 'tertiary'] as const
function AgentRosterSkeleton() {
return (
<>
{skeletonRows.map(row => (
<div key={row} className="flex min-h-20 animate-pulse flex-col gap-3 rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-on-panel-item-bg p-3 shadow-xs shadow-shadow-shadow-3 sm:flex-row sm:items-center">
<div className="size-10 rounded-lg bg-state-base-hover" />
<div className="min-w-0 flex-1 space-y-2">
<div className="h-4 w-56 rounded bg-state-base-hover" />
<div className="h-3 w-96 max-w-full rounded bg-state-base-hover" />
</div>
<div className="h-7 w-36 rounded bg-state-base-hover" />
</div>
))}
</>
)
}
function AgentRosterEmptyState({ isSearch }: { isSearch: boolean }) {
const { t } = useTranslation('agentV2')
return (
<div className="rounded-lg border border-components-panel-border bg-components-panel-on-panel-item-bg px-4 py-10 text-center shadow-xs">
<div className="mx-auto flex size-10 items-center justify-center rounded-full bg-state-base-hover text-text-tertiary">
<span aria-hidden className="i-custom-vender-solid-mediaAndDevices-robot size-5" />
</div>
<p className="mt-3 system-sm-semibold text-text-primary">
{isSearch ? t('roster.emptySearch') : t('roster.empty')}
</p>
<p className="mt-1 system-xs-regular text-text-tertiary">
{isSearch ? t('roster.emptySearchDescription') : t('roster.emptyDescription')}
</p>
</div>
)
}
function AgentRosterItem({
agent,
}: {
agent: AgentRosterResponse
}) {
const { t: tAgentV2 } = useTranslation('agentV2')
const version = agent.active_config_snapshot?.version
return (
<article className="group flex min-h-20 min-w-0 flex-col gap-3 rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-on-panel-item-bg p-3 shadow-xs shadow-shadow-shadow-3 transition-colors hover:bg-components-panel-on-panel-item-bg-hover sm:flex-row sm:items-center">
<Link
href={`/roster/${agent.id}/configure`}
className="flex min-w-0 flex-1 flex-col gap-3 rounded-lg focus-visible:ring-2 focus-visible:ring-state-accent-solid focus-visible:outline-hidden sm:flex-row sm:items-center"
>
<div
className={cn(
'flex size-10 shrink-0 items-center justify-center rounded-lg text-text-primary-on-surface shadow-xs shadow-shadow-shadow-3',
!agent.icon_background && 'bg-text-accent',
)}
style={agent.icon_background ? { backgroundColor: agent.icon_background } : undefined}
>
{agent.icon_type === 'emoji' && agent.icon
? <span aria-hidden className="text-lg leading-none">{agent.icon}</span>
: <span aria-hidden className="i-custom-vender-solid-mediaAndDevices-robot size-5" />}
</div>
<div className="min-w-0 flex-1">
<div className="flex min-w-0 items-center gap-2">
<h2 className="truncate system-md-semibold text-text-primary">
{agent.name}
</h2>
{version != null && (
<span className="shrink-0 rounded-md bg-components-badge-bg-dimm px-1.5 py-0.5 system-2xs-semibold-uppercase text-text-tertiary">
{version}
</span>
)}
</div>
{agent.description && (
<p className="mt-1 truncate system-sm-regular text-text-tertiary">
{agent.description}
</p>
)}
</div>
<div className="hidden min-w-32 items-center gap-2 xl:flex">
<span aria-hidden className="i-ri-git-branch-line size-3.5 text-text-tertiary" />
<span className="rounded-md border-[0.5px] border-components-panel-border bg-components-badge-bg-dimm px-2 py-1 system-xs-medium text-text-secondary">
{tAgentV2(getSourceLabelKey(agent.source))}
</span>
</div>
<div className="hidden w-40 shrink-0 text-right system-xs-regular text-text-tertiary lg:block">
<span className={agent.status === 'active' ? 'text-text-success' : 'text-text-tertiary'}>
{tAgentV2(`roster.status.${agent.status}`)}
</span>
{agent.updated_at && <div className="truncate">{agent.updated_at}</div>}
</div>
</Link>
<div className="flex w-full shrink-0 items-center justify-end gap-2 sm:w-auto sm:pl-2">
<EditAgentDialog agent={agent} />
<ArchiveAgentButton agentId={agent.id} agentName={agent.name} />
</div>
</article>
)
}
export function AgentRosterList({
agents,
hasMore,
isEmptySearch,
isError,
isFetching,
isFetchingNextPage,
isPending,
onLoadMore,
}: AgentRosterListProps) {
const { t } = useTranslation('agentV2')
return (
<div className="space-y-2" aria-busy={isFetching || undefined}>
{isPending && <AgentRosterSkeleton />}
{!isPending && isError && (
<div className="rounded-lg border border-components-panel-border bg-components-panel-on-panel-item-bg px-4 py-8 text-center shadow-xs">
<p className="system-sm-medium text-text-secondary">{t('roster.loadingError')}</p>
</div>
)}
{!isPending && !isError && agents.length === 0 && (
<AgentRosterEmptyState isSearch={isEmptySearch} />
)}
{!isPending && !isError && agents.map(agent => (
<AgentRosterItem key={agent.id} agent={agent} />
))}
{!isPending && !isError && hasMore && (
<div className="flex justify-center pt-1">
<Button
loading={isFetchingNextPage}
disabled={isFetchingNextPage}
onClick={onLoadMore}
>
{t('roster.loadMore')}
</Button>
</div>
)}
</div>
)
}

View File

@ -0,0 +1,92 @@
'use client'
import {
AlertDialog,
AlertDialogActions,
AlertDialogCancelButton,
AlertDialogConfirmButton,
AlertDialogContent,
AlertDialogDescription,
AlertDialogTitle,
AlertDialogTrigger,
} from '@langgenius/dify-ui/alert-dialog'
import { Button } from '@langgenius/dify-ui/button'
import { toast } from '@langgenius/dify-ui/toast'
import { useMutation } from '@tanstack/react-query'
import { useState } from 'react'
import { useTranslation } from 'react-i18next'
import { consoleQuery } from '@/service/client'
type ArchiveAgentButtonProps = {
agentId: string
agentName: string
}
export function ArchiveAgentButton({
agentId,
agentName,
}: ArchiveAgentButtonProps) {
const { t } = useTranslation()
const { t: tAgentV2 } = useTranslation('agentV2')
const [open, setOpen] = useState(false)
const archiveAgentMutation = useMutation(consoleQuery.agents.byAgentId.delete.mutationOptions())
const handleArchive = () => {
if (archiveAgentMutation.isPending)
return
archiveAgentMutation.mutate({
params: {
agent_id: agentId,
},
}, {
onSuccess: () => {
toast.success(tAgentV2('roster.archiveSuccess'))
setOpen(false)
},
onError: () => {
toast.error(tAgentV2('roster.archiveFailed'))
},
})
}
return (
<AlertDialog open={open} onOpenChange={setOpen}>
<AlertDialogTrigger
render={(
<Button
size="small"
variant="secondary"
tone="destructive"
className="gap-1"
aria-label={tAgentV2('roster.archiveAgent', { name: agentName })}
/>
)}
>
<span aria-hidden className="i-ri-archive-line size-3.5" />
{tAgentV2('roster.archive')}
</AlertDialogTrigger>
<AlertDialogContent>
<div className="flex flex-col gap-2 px-6 pt-6 pb-4">
<AlertDialogTitle className="w-full truncate title-2xl-semi-bold text-text-primary">
{tAgentV2('roster.archiveDialog.title', { name: agentName })}
</AlertDialogTitle>
<AlertDialogDescription className="w-full system-md-regular wrap-break-word whitespace-pre-wrap text-text-tertiary">
{tAgentV2('roster.archiveDialog.description')}
</AlertDialogDescription>
</div>
<AlertDialogActions>
<AlertDialogCancelButton disabled={archiveAgentMutation.isPending}>
{t('operation.cancel', { ns: 'common' })}
</AlertDialogCancelButton>
<AlertDialogConfirmButton
loading={archiveAgentMutation.isPending}
onClick={handleArchive}
>
{t('operation.confirm', { ns: 'common' })}
</AlertDialogConfirmButton>
</AlertDialogActions>
</AlertDialogContent>
</AlertDialog>
)
}

View File

@ -0,0 +1,103 @@
'use client'
import { Button } from '@langgenius/dify-ui/button'
import { Dialog, DialogCloseButton, DialogContent, DialogDescription, DialogTitle, DialogTrigger } from '@langgenius/dify-ui/dialog'
import { FieldControl, FieldError, FieldLabel, FieldRoot } from '@langgenius/dify-ui/field'
import { Form } from '@langgenius/dify-ui/form'
import { Textarea } from '@langgenius/dify-ui/textarea'
import { toast } from '@langgenius/dify-ui/toast'
import { useMutation } from '@tanstack/react-query'
import { useState } from 'react'
import { useTranslation } from 'react-i18next'
import { consoleQuery } from '@/service/client'
type AgentFormValues = {
description?: string
name?: string
}
export function CreateAgentDialog() {
const { t } = useTranslation()
const { t: tAgentV2 } = useTranslation('agentV2')
const [open, setOpen] = useState(false)
const createAgentMutation = useMutation(consoleQuery.agents.post.mutationOptions())
const handleSubmit = (formValues: AgentFormValues) => {
const trimmedName = formValues.name?.trim() ?? ''
if (!trimmedName || createAgentMutation.isPending)
return
createAgentMutation.mutate({
body: {
name: trimmedName,
description: formValues.description?.trim() ?? '',
},
}, {
onSuccess: () => {
toast.success(tAgentV2('roster.createSuccess'))
setOpen(false)
},
onError: () => {
toast.error(tAgentV2('roster.createFailed'))
},
})
}
return (
<Dialog open={open} onOpenChange={setOpen}>
<DialogTrigger render={<Button variant="primary" className="min-w-40 gap-1.5" />}>
<span aria-hidden className="i-ri-add-line size-4" />
{tAgentV2('roster.createAgent')}
</DialogTrigger>
<DialogContent>
<DialogCloseButton />
<DialogTitle className="title-2xl-semi-bold text-text-primary">
{tAgentV2('roster.createDialog.title')}
</DialogTitle>
<DialogDescription className="mt-1 system-sm-regular text-text-tertiary">
{tAgentV2('roster.createDialog.description')}
</DialogDescription>
<Form<AgentFormValues>
className="mt-5 space-y-4"
onFormSubmit={handleSubmit}
>
<FieldRoot name="name">
<FieldLabel>
{tAgentV2('roster.createForm.nameLabel')}
</FieldLabel>
<FieldControl
autoComplete="off"
maxLength={255}
placeholder={tAgentV2('roster.createForm.namePlaceholder')}
required
/>
<FieldError match="valueMissing">
{tAgentV2('roster.createForm.nameRequired')}
</FieldError>
</FieldRoot>
<FieldRoot name="description">
<FieldLabel>
{tAgentV2('roster.createForm.descriptionLabel')}
</FieldLabel>
<Textarea
autoComplete="off"
placeholder={tAgentV2('roster.createForm.descriptionPlaceholder')}
/>
</FieldRoot>
<div className="flex justify-end gap-2 pt-2">
<Button type="button" onClick={() => setOpen(false)} disabled={createAgentMutation.isPending}>
{t('operation.cancel', { ns: 'common' })}
</Button>
<Button
type="submit"
variant="primary"
loading={createAgentMutation.isPending}
>
{t('operation.create', { ns: 'common' })}
</Button>
</div>
</Form>
</DialogContent>
</Dialog>
)
}

View File

@ -0,0 +1,123 @@
'use client'
import type { AgentRosterResponse } from '@dify/contracts/api/console/agents/types.gen'
import { Button } from '@langgenius/dify-ui/button'
import { Dialog, DialogCloseButton, DialogContent, DialogDescription, DialogTitle, DialogTrigger } from '@langgenius/dify-ui/dialog'
import { FieldControl, FieldError, FieldLabel, FieldRoot } from '@langgenius/dify-ui/field'
import { Form } from '@langgenius/dify-ui/form'
import { Textarea } from '@langgenius/dify-ui/textarea'
import { toast } from '@langgenius/dify-ui/toast'
import { useMutation } from '@tanstack/react-query'
import { useState } from 'react'
import { useTranslation } from 'react-i18next'
import { consoleQuery } from '@/service/client'
type EditAgentDialogProps = {
agent: AgentRosterResponse
}
type AgentFormValues = {
description?: string
name?: string
}
export function EditAgentDialog({
agent,
}: EditAgentDialogProps) {
const { t } = useTranslation()
const { t: tAgentV2 } = useTranslation('agentV2')
const [open, setOpen] = useState(false)
const updateAgentMutation = useMutation(consoleQuery.agents.byAgentId.patch.mutationOptions())
const handleSubmit = (formValues: AgentFormValues) => {
const trimmedName = formValues.name?.trim() ?? ''
if (!trimmedName || updateAgentMutation.isPending)
return
updateAgentMutation.mutate({
params: {
agent_id: agent.id,
},
body: {
name: trimmedName,
description: formValues.description?.trim() ?? '',
},
}, {
onSuccess: () => {
toast.success(tAgentV2('roster.updateSuccess'))
setOpen(false)
},
onError: () => {
toast.error(tAgentV2('roster.updateFailed'))
},
})
}
return (
<Dialog open={open} onOpenChange={setOpen}>
<DialogTrigger
render={(
<Button
size="small"
className="gap-1"
aria-label={tAgentV2('roster.editAgent', { name: agent.name })}
/>
)}
>
<span aria-hidden className="i-ri-edit-line size-3.5" />
{t('operation.edit', { ns: 'common' })}
</DialogTrigger>
<DialogContent>
<DialogCloseButton />
<DialogTitle className="title-2xl-semi-bold text-text-primary">
{tAgentV2('roster.editDialog.title')}
</DialogTitle>
<DialogDescription className="mt-1 system-sm-regular text-text-tertiary">
{tAgentV2('roster.editDialog.description')}
</DialogDescription>
<Form<AgentFormValues>
className="mt-5 space-y-4"
onFormSubmit={handleSubmit}
>
<FieldRoot name="name">
<FieldLabel>
{tAgentV2('roster.createForm.nameLabel')}
</FieldLabel>
<FieldControl
autoComplete="off"
defaultValue={agent.name}
maxLength={255}
placeholder={tAgentV2('roster.createForm.namePlaceholder')}
required
/>
<FieldError match="valueMissing">
{tAgentV2('roster.createForm.nameRequired')}
</FieldError>
</FieldRoot>
<FieldRoot name="description">
<FieldLabel>
{tAgentV2('roster.createForm.descriptionLabel')}
</FieldLabel>
<Textarea
autoComplete="off"
defaultValue={agent.description}
placeholder={tAgentV2('roster.createForm.descriptionPlaceholder')}
/>
</FieldRoot>
<div className="flex justify-end gap-2 pt-2">
<Button type="button" onClick={() => setOpen(false)} disabled={updateAgentMutation.isPending}>
{t('operation.cancel', { ns: 'common' })}
</Button>
<Button
type="submit"
variant="primary"
loading={updateAgentMutation.isPending}
>
{t('operation.save', { ns: 'common' })}
</Button>
</div>
</Form>
</DialogContent>
</Dialog>
)
}

View File

@ -0,0 +1,38 @@
'use client'
import { useTranslation } from 'react-i18next'
import SearchInput from '@/app/components/base/search-input'
import { CreateAgentDialog } from './create-agent-dialog'
type RosterToolbarProps = {
keyword: string
totalAgents: number
onKeywordChange: (value: string) => void
}
export function RosterToolbar({
keyword,
totalAgents,
onKeywordChange,
}: RosterToolbarProps) {
const { t } = useTranslation('agentV2')
return (
<div className="mt-4 flex flex-wrap items-center gap-3">
<SearchInput
aria-label={t('roster.searchLabel')}
className="w-82 max-w-full"
name="agent-search"
placeholder={t('roster.searchPlaceholder')}
value={keyword}
onChange={onKeywordChange}
/>
<div className="system-sm-regular text-text-tertiary">
{t('roster.agentCount', { count: totalAgents })}
</div>
<div className="ml-auto flex min-w-0 items-center gap-2">
<CreateAgentDialog />
</div>
</div>
)
}

View File

@ -1,279 +1,100 @@
'use client'
import { Button } from '@langgenius/dify-ui/button'
import { cn } from '@langgenius/dify-ui/cn'
import { keepPreviousData, useInfiniteQuery } from '@tanstack/react-query'
import { useDebounce } from 'ahooks'
import { debounce, parseAsString, useQueryState } from 'nuqs'
import { useTranslation } from 'react-i18next'
import useDocumentTitle from '@/hooks/use-document-title'
import Link from '@/next/link'
import { consoleQuery } from '@/service/client'
import { AgentRosterList } from './components/agent-roster-list'
import { RosterToolbar } from './components/roster-toolbar'
const rosterItems = [
{
id: 'iris',
name: 'Iris',
role: 'Clarification Drafter',
description: 'Go through supplier clarification questions based on list of tenders',
version: 'v5',
model: 'claude-opus-4.7',
workflowUsage: '4',
updatedAt: '2d',
colorClassName: 'from-[#6C3CF6] to-[#4B2DDB]',
tool: 'tender-analyze',
},
{
id: 'nadia',
name: 'Nadia',
role: 'Compliance Reviewer',
description: 'Checks tender responses against mandatory requirements and red flags',
version: 'v3',
model: 'claude-opus-4.7',
workflowUsage: '4',
updatedAt: '6d',
colorClassName: 'from-[#D4479B] to-[#B93685]',
tool: 'compliance-che',
},
{
id: 'marko',
name: 'Marko',
role: 'Pricing Analyst',
description: 'Normalizes supplier pricing across currencies and payment terms',
version: 'v3',
model: 'claude-sonnet-4.7',
workflowUsage: '0',
updatedAt: '11d',
colorClassName: 'from-[#F59E0B] to-[#D97706]',
tool: 'fx-normalizer',
},
{
id: 'aiko',
name: 'Aiko',
role: 'Document Translator',
description: 'Translates supplier responses into the tender language for evaluators',
version: 'v2',
model: 'claude-haiku-4.5',
workflowUsage: '0',
updatedAt: '1mo',
colorClassName: 'from-[#4BA9C9] to-[#2A7F9E]',
tool: 'multilingual-t',
draft: true,
},
]
const rosterNavItems = [
{ labelKey: 'roster.sidebar.agents', count: 4, icon: 'i-custom-vender-solid-mediaAndDevices-robot' },
{ labelKey: 'roster.sidebar.humans', count: 8, icon: 'i-ri-group-line' },
] as const
const filterItems = [
'roster.filters.all',
'roster.filters.inUse',
'roster.filters.drafts',
] as const
const ROSTER_PAGE_SIZE = 30
export default function RosterPage() {
const { t } = useTranslation()
const { t: tAgentV2 } = useTranslation('agentV2')
const [keyword, setKeyword] = useQueryState('keyword', parseAsString.withDefault('').withOptions({
limitUrlUpdates: debounce(300),
}))
const debouncedKeyword = useDebounce(keyword.trim(), { wait: 300 })
const rosterQueryInput = {
limit: ROSTER_PAGE_SIZE,
...(debouncedKeyword ? { keyword: debouncedKeyword } : {}),
}
const {
data: rosterPages,
isPending,
isFetching,
isFetchingNextPage,
fetchNextPage,
hasNextPage,
error,
} = useInfiniteQuery({
...consoleQuery.agents.get.infiniteOptions({
input: pageParam => ({
query: {
...rosterQueryInput,
page: Number(pageParam),
},
}),
getNextPageParam: lastPage => lastPage.has_more ? lastPage.page + 1 : undefined,
initialPageParam: 1,
placeholderData: keepPreviousData,
}),
})
const rosterItems = rosterPages?.pages.flatMap(page => page.data) ?? []
const totalAgents = rosterPages?.pages[0]?.total ?? 0
useDocumentTitle(t('menus.roster', { ns: 'common' }))
return (
<main className="flex h-full min-w-0 overflow-hidden bg-background-section">
<aside className="flex w-62 shrink-0 flex-col border-r border-divider-subtle bg-background-body px-3 py-6">
<h1 className="px-2 title-2xl-semi-bold text-text-primary">
{t('menus.roster', { ns: 'common' })}
</h1>
<nav className="mt-5 space-y-1" aria-label={tAgentV2('roster.sidebarLabel')}>
{rosterNavItems.map((item, index) => {
const active = index === 0
return (
<button
key={item.labelKey}
type="button"
aria-current={active ? 'page' : undefined}
className={[
'flex h-11 w-full items-center gap-2 rounded-xl px-3 text-left transition-colors focus-visible:ring-2 focus-visible:ring-state-accent-solid focus-visible:outline-hidden',
active
? 'bg-state-accent-hover text-text-accent'
: 'text-text-secondary hover:bg-state-base-hover',
].join(' ')}
>
<span aria-hidden className={`${item.icon} size-4 shrink-0`} />
<span className="min-w-0 flex-1 truncate system-sm-semibold">
{tAgentV2(item.labelKey)}
</span>
<span className="flex h-5 min-w-5 items-center justify-center rounded-full bg-components-badge-bg-dimm px-1.5 system-xs-medium text-text-tertiary">
{item.count}
</span>
</button>
)
})}
</nav>
<div className="mt-auto rounded-xl border border-components-panel-border bg-components-panel-on-panel-item-bg px-5 py-4 text-center shadow-xs">
<div className="mx-auto mb-2 flex w-fit -space-x-2">
{['N', 'M', 'A'].map(initial => (
<span key={initial} className="flex size-6 items-center justify-center rounded-full border border-components-panel-on-panel-item-bg bg-text-accent system-xs-semibold text-text-primary-on-surface">
{initial}
</span>
))}
</div>
<p className="system-xs-medium text-text-tertiary">
{tAgentV2('roster.marketplaceCta')}
</p>
</div>
</aside>
<section className="min-w-0 flex-1 overflow-auto px-8 py-8">
<header className="max-w-5xl">
<div className="flex flex-wrap items-center gap-2">
<h2 className="title-2xl-semi-bold text-text-primary">
<main className="flex h-0 min-w-0 grow flex-col overflow-y-auto bg-background-body">
<div className="sticky top-0 z-10 bg-background-body px-8 pt-4 pb-3">
<header className="flex min-w-0 flex-col gap-2">
<div className="flex min-w-0 items-center gap-2">
<h1 className="truncate text-[18px]/[21.6px] font-semibold text-text-primary">
{tAgentV2('roster.title')}
</h2>
</h1>
<a
href="https://docs.dify.ai/"
target="_blank"
rel="noreferrer"
className="inline-flex items-center gap-1 rounded-md system-xs-semibold text-text-accent hover:underline focus-visible:ring-2 focus-visible:ring-state-accent-solid focus-visible:outline-hidden"
className="inline-flex shrink-0 items-center gap-1 rounded-md system-xs-semibold text-text-accent hover:underline focus-visible:ring-2 focus-visible:ring-state-accent-solid focus-visible:outline-hidden"
>
{tAgentV2('roster.learnMore')}
<span aria-hidden className="i-ri-arrow-right-up-line size-3" />
</a>
</div>
<p className="mt-3 max-w-3xl system-sm-regular text-text-tertiary">
<p className="max-w-3xl system-sm-regular text-text-tertiary">
{tAgentV2('roster.description')}
</p>
</header>
<div className="mt-6 flex flex-wrap items-center gap-3 border-t border-divider-subtle pt-6">
<label className="relative block w-82 max-w-full">
<span className="sr-only">{tAgentV2('roster.searchLabel')}</span>
<span aria-hidden className="pointer-events-none absolute top-1/2 left-3 i-ri-search-line size-4 -translate-y-1/2 text-text-tertiary" />
<input
type="search"
name="agent-search"
autoComplete="off"
readOnly
className="h-9 w-full rounded-lg border border-components-panel-border bg-components-input-bg-normal pr-3 pl-9 system-sm-regular text-text-secondary outline-hidden focus-visible:ring-2 focus-visible:ring-state-accent-solid"
placeholder={tAgentV2('roster.searchPlaceholder')}
/>
</label>
<div className="flex h-9 items-center rounded-lg border border-components-panel-border bg-components-panel-on-panel-item-bg p-0.5 shadow-xs">
{filterItems.map((filter, index) => (
<button
key={filter}
type="button"
aria-pressed={index === 0}
className={[
'h-8 rounded-md px-3 system-sm-semibold transition-colors focus-visible:ring-2 focus-visible:ring-state-accent-solid focus-visible:outline-hidden',
index === 0
? 'bg-state-base-hover text-text-secondary shadow-xs'
: 'text-text-tertiary hover:text-text-secondary',
].join(' ')}
>
{tAgentV2(filter)}
</button>
))}
</div>
<div className="ml-auto flex min-w-0 items-center gap-2">
<Button className="gap-1.5" disabled>
<span aria-hidden className="i-custom-vender-solid-mediaAndDevices-robot size-4" />
{tAgentV2('roster.connectOwnAgent')}
<span className="rounded bg-components-badge-bg-dimm px-1 system-2xs-semibold-uppercase text-text-tertiary">
{tAgentV2('roster.soon')}
</span>
</Button>
<Button variant="primary" className="min-w-40 gap-1.5" disabled>
<span aria-hidden className="i-ri-add-line size-4" />
{tAgentV2('roster.createAgent')}
</Button>
<Button className="px-2.5" aria-label={tAgentV2('roster.listView')}>
<span aria-hidden className="i-ri-list-unordered size-4" />
</Button>
<Button className="px-2.5" aria-label={tAgentV2('roster.gridView')}>
<span aria-hidden className="i-ri-grid-line size-4" />
</Button>
</div>
</div>
<RosterToolbar
keyword={keyword}
totalAgents={totalAgents}
onKeywordChange={(value) => {
void setKeyword(value)
}}
/>
</div>
<div className="mt-5 space-y-3">
{rosterItems.map(item => (
<article
key={item.id}
className={[
'flex min-h-19 min-w-0 items-center gap-4 rounded-xl border bg-components-panel-on-panel-item-bg px-4 py-3 shadow-xs',
item.draft
? 'border-text-warning/35 bg-util-colors-warning-warning-50/40'
: 'border-components-panel-border',
].join(' ')}
>
<div className={`flex size-12 shrink-0 items-center justify-center rounded-full bg-linear-to-br ${item.colorClassName} text-text-primary-on-surface shadow-xs ring-2 ring-components-panel-on-panel-item-bg`}>
<span aria-hidden className="i-custom-vender-solid-mediaAndDevices-robot size-5" />
</div>
<div className="min-w-65 flex-1">
<div className="flex min-w-0 items-center gap-2">
<h3 className="truncate system-md-semibold text-text-primary">
{item.name}
{' '}
-
{' '}
{item.role}
</h3>
<span className="shrink-0 system-xs-regular text-text-tertiary">{item.version}</span>
{item.draft && (
<span className="shrink-0 rounded border border-text-warning/40 bg-util-colors-warning-warning-50 px-1.5 system-2xs-semibold-uppercase text-text-warning">
{tAgentV2('roster.draft')}
</span>
)}
</div>
<p className="mt-1 truncate system-sm-regular text-text-tertiary">
{item.description}
</p>
</div>
<div className="hidden min-w-44 items-center gap-2 xl:flex">
<span aria-hidden className="i-ri-sparkling-line size-3.5 text-text-tertiary" />
<span className="code-sm-regular text-text-secondary">{item.model}</span>
</div>
<div className="hidden min-w-37 items-center gap-2 2xl:flex">
<span className="rounded-md border border-util-colors-violet-violet-200 bg-util-colors-violet-violet-50 px-2 py-1 code-sm-semibold text-util-colors-violet-violet-700">
{item.tool}
</span>
</div>
<div className="hidden w-35.5 shrink-0 text-right system-xs-regular text-text-tertiary lg:block">
{Number(item.workflowUsage) > 0
? tAgentV2('roster.usedInWorkflows', { count: Number(item.workflowUsage) })
: tAgentV2('roster.unused')}
<div>{tAgentV2('roster.updated', { time: item.updatedAt })}</div>
</div>
<div className="flex shrink-0 items-center gap-2">
<Link
href={`/roster/${item.id}/configure`}
aria-label={tAgentV2('roster.editAgent', { name: item.name })}
className={cn(
'inline-flex h-6 items-center justify-center gap-1 rounded-md border border-components-button-secondary-border bg-components-button-secondary-bg px-2 text-xs font-medium text-components-button-secondary-text shadow-xs backdrop-blur-[5px]',
'hover:border-components-button-secondary-border-hover hover:bg-components-button-secondary-bg-hover',
'focus-visible:ring-2 focus-visible:ring-state-accent-solid focus-visible:outline-hidden',
)}
>
<span aria-hidden className="i-ri-edit-line size-3.5" />
{t('operation.edit', { ns: 'common' })}
</Link>
<Button
size="small"
variant="secondary-accent"
className="gap-1"
aria-label={tAgentV2('roster.inviteAgent', { name: item.name })}
disabled
>
<span aria-hidden className="i-ri-add-circle-fill size-3.5" />
{tAgentV2('roster.invite')}
</Button>
<Button size="small" className="px-1.5" aria-label={tAgentV2('roster.moreActions', { name: item.name })}>
<span aria-hidden className="i-ri-more-fill size-4" />
</Button>
</div>
</article>
))}
</div>
</section>
<div className="px-8 pb-8">
<AgentRosterList
agents={rosterItems}
hasMore={!!hasNextPage}
isEmptySearch={!!debouncedKeyword}
isError={!!error}
isFetching={isFetching}
isFetchingNextPage={isFetchingNextPage}
isPending={isPending}
onLoadMore={() => fetchNextPage()}
/>
</div>
</main>
)
}

View File

@ -25,13 +25,8 @@
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
"agentDetail.monitoring.timeRangeLabel": "Time range",
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
@ -50,29 +45,43 @@
"agentDetail.subtitle": "معرف الوكيل: {{agentId}}",
"agentDetail.title": "الوكيل",
"agentDetail.type": "وكيل",
"roster.connectOwnAgent": "Connect to Your Own Agent",
"roster.agentCount": "{{count}} agents",
"roster.archive": "Archive",
"roster.archiveAgent": "Archive {{name}}",
"roster.archiveDialog.description": "This agent will be removed from the active roster list.",
"roster.archiveDialog.title": "Archive {{name}}?",
"roster.archiveFailed": "Failed to archive agent.",
"roster.archiveSuccess": "Agent archived.",
"roster.createAgent": "Create agent",
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
"roster.draft": "Draft",
"roster.createDialog.description": "Create a reusable agent in this workspace roster.",
"roster.createDialog.title": "Create agent",
"roster.createFailed": "Failed to create agent.",
"roster.createForm.descriptionLabel": "Description",
"roster.createForm.descriptionPlaceholder": "Describe what this agent does…",
"roster.createForm.nameLabel": "Name",
"roster.createForm.namePlaceholder": "Enter agent name…",
"roster.createForm.nameRequired": "Name is required.",
"roster.createSuccess": "Agent created.",
"roster.description": "Agents saved to this workspace are listed here. Create, search, edit, and archive roster agents from one place.",
"roster.editAgent": "تعديل {{name}}",
"roster.filters.all": "All 4",
"roster.filters.drafts": "Drafts",
"roster.filters.inUse": "In use",
"roster.gridView": "Grid view",
"roster.invite": "Invite",
"roster.inviteAgent": "دعوة {{name}}",
"roster.editDialog.description": "Update the roster name and description for this agent.",
"roster.editDialog.title": "Edit agent",
"roster.empty": "No agents yet",
"roster.emptyDescription": "Agents saved to this workspace will appear here.",
"roster.emptySearch": "No matching agents",
"roster.emptySearchDescription": "Try another agent name.",
"roster.learnMore": "Learn more",
"roster.listView": "List view",
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
"roster.moreActions": "إجراءات إضافية لـ {{name}}",
"roster.loadMore": "Load more",
"roster.loadingError": "Failed to load agents. Refresh and try again.",
"roster.searchLabel": "Search agents",
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
"roster.sidebar.agents": "Agents",
"roster.sidebar.humans": "Humans",
"roster.sidebarLabel": "Roster sections",
"roster.soon": "Soon",
"roster.searchPlaceholder": "Search agents by name…",
"roster.sources.agent_app": "Agent app",
"roster.sources.imported": "Imported",
"roster.sources.system": "System",
"roster.sources.workflow": "Workflow",
"roster.status.active": "Active",
"roster.status.archived": "Archived",
"roster.title": "Agent Roster",
"roster.unused": "Unused",
"roster.updated": "updated {{time}} ago",
"roster.usedInWorkflows": "Used in {{count}} workflows"
"roster.updateFailed": "Failed to update agent. Check the fields and try again.",
"roster.updateSuccess": "Agent updated."
}

View File

@ -25,13 +25,8 @@
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
"agentDetail.monitoring.timeRangeLabel": "Time range",
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
@ -50,29 +45,43 @@
"agentDetail.subtitle": "Agent-ID: {{agentId}}",
"agentDetail.title": "Agent",
"agentDetail.type": "AGENT",
"roster.connectOwnAgent": "Connect to Your Own Agent",
"roster.agentCount": "{{count}} agents",
"roster.archive": "Archive",
"roster.archiveAgent": "Archive {{name}}",
"roster.archiveDialog.description": "This agent will be removed from the active roster list.",
"roster.archiveDialog.title": "Archive {{name}}?",
"roster.archiveFailed": "Failed to archive agent.",
"roster.archiveSuccess": "Agent archived.",
"roster.createAgent": "Create agent",
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
"roster.draft": "Draft",
"roster.createDialog.description": "Create a reusable agent in this workspace roster.",
"roster.createDialog.title": "Create agent",
"roster.createFailed": "Failed to create agent.",
"roster.createForm.descriptionLabel": "Description",
"roster.createForm.descriptionPlaceholder": "Describe what this agent does…",
"roster.createForm.nameLabel": "Name",
"roster.createForm.namePlaceholder": "Enter agent name…",
"roster.createForm.nameRequired": "Name is required.",
"roster.createSuccess": "Agent created.",
"roster.description": "Agents saved to this workspace are listed here. Create, search, edit, and archive roster agents from one place.",
"roster.editAgent": "{{name}} bearbeiten",
"roster.filters.all": "All 4",
"roster.filters.drafts": "Drafts",
"roster.filters.inUse": "In use",
"roster.gridView": "Grid view",
"roster.invite": "Invite",
"roster.inviteAgent": "{{name}} einladen",
"roster.editDialog.description": "Update the roster name and description for this agent.",
"roster.editDialog.title": "Edit agent",
"roster.empty": "No agents yet",
"roster.emptyDescription": "Agents saved to this workspace will appear here.",
"roster.emptySearch": "No matching agents",
"roster.emptySearchDescription": "Try another agent name.",
"roster.learnMore": "Learn more",
"roster.listView": "List view",
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
"roster.moreActions": "Weitere Aktionen für {{name}}",
"roster.loadMore": "Load more",
"roster.loadingError": "Failed to load agents. Refresh and try again.",
"roster.searchLabel": "Search agents",
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
"roster.sidebar.agents": "Agents",
"roster.sidebar.humans": "Humans",
"roster.sidebarLabel": "Roster sections",
"roster.soon": "Soon",
"roster.searchPlaceholder": "Search agents by name…",
"roster.sources.agent_app": "Agent app",
"roster.sources.imported": "Imported",
"roster.sources.system": "System",
"roster.sources.workflow": "Workflow",
"roster.status.active": "Active",
"roster.status.archived": "Archived",
"roster.title": "Agent Roster",
"roster.unused": "Unused",
"roster.updated": "updated {{time}} ago",
"roster.usedInWorkflows": "Used in {{count}} workflows"
"roster.updateFailed": "Failed to update agent. Check the fields and try again.",
"roster.updateSuccess": "Agent updated."
}

View File

@ -96,29 +96,43 @@
"agentDetail.subtitle": "Agent ID: {{agentId}}",
"agentDetail.title": "Agent",
"agentDetail.type": "AGENT",
"roster.connectOwnAgent": "Connect to Your Own Agent",
"roster.agentCount": "{{count}} agents",
"roster.archive": "Archive",
"roster.archiveAgent": "Archive {{name}}",
"roster.archiveDialog.description": "This agent will be removed from the active roster list.",
"roster.archiveDialog.title": "Archive {{name}}?",
"roster.archiveFailed": "Failed to archive agent.",
"roster.archiveSuccess": "Agent archived.",
"roster.createAgent": "Create agent",
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
"roster.draft": "Draft",
"roster.createDialog.description": "Create a reusable agent in this workspace roster.",
"roster.createDialog.title": "Create agent",
"roster.createFailed": "Failed to create agent.",
"roster.createForm.descriptionLabel": "Description",
"roster.createForm.descriptionPlaceholder": "Describe what this agent does…",
"roster.createForm.nameLabel": "Name",
"roster.createForm.namePlaceholder": "Enter agent name…",
"roster.createForm.nameRequired": "Name is required.",
"roster.createSuccess": "Agent created.",
"roster.description": "Agents saved to this workspace are listed here. Create, search, edit, and archive roster agents from one place.",
"roster.editAgent": "Edit {{name}}",
"roster.filters.all": "All 4",
"roster.filters.drafts": "Drafts",
"roster.filters.inUse": "In use",
"roster.gridView": "Grid view",
"roster.invite": "Invite",
"roster.inviteAgent": "Invite {{name}}",
"roster.editDialog.description": "Update the roster name and description for this agent.",
"roster.editDialog.title": "Edit agent",
"roster.empty": "No agents yet",
"roster.emptyDescription": "Agents saved to this workspace will appear here.",
"roster.emptySearch": "No matching agents",
"roster.emptySearchDescription": "Try another agent name.",
"roster.learnMore": "Learn more",
"roster.listView": "List view",
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
"roster.moreActions": "More actions for {{name}}",
"roster.loadMore": "Load more",
"roster.loadingError": "Failed to load agents. Refresh and try again.",
"roster.searchLabel": "Search agents",
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
"roster.sidebar.agents": "Agents",
"roster.sidebar.humans": "Humans",
"roster.sidebarLabel": "Roster sections",
"roster.soon": "Soon",
"roster.searchPlaceholder": "Search agents by name…",
"roster.sources.agent_app": "Agent app",
"roster.sources.imported": "Imported",
"roster.sources.system": "System",
"roster.sources.workflow": "Workflow",
"roster.status.active": "Active",
"roster.status.archived": "Archived",
"roster.title": "Agent Roster",
"roster.unused": "Unused",
"roster.updated": "updated {{time}} ago",
"roster.usedInWorkflows": "Used in {{count}} workflows"
"roster.updateFailed": "Failed to update agent. Check the fields and try again.",
"roster.updateSuccess": "Agent updated."
}

View File

@ -25,13 +25,8 @@
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
"agentDetail.monitoring.timeRangeLabel": "Time range",
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
@ -50,29 +45,43 @@
"agentDetail.subtitle": "ID del agente: {{agentId}}",
"agentDetail.title": "Agente",
"agentDetail.type": "AGENTE",
"roster.connectOwnAgent": "Connect to Your Own Agent",
"roster.agentCount": "{{count}} agents",
"roster.archive": "Archive",
"roster.archiveAgent": "Archive {{name}}",
"roster.archiveDialog.description": "This agent will be removed from the active roster list.",
"roster.archiveDialog.title": "Archive {{name}}?",
"roster.archiveFailed": "Failed to archive agent.",
"roster.archiveSuccess": "Agent archived.",
"roster.createAgent": "Create agent",
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
"roster.draft": "Draft",
"roster.createDialog.description": "Create a reusable agent in this workspace roster.",
"roster.createDialog.title": "Create agent",
"roster.createFailed": "Failed to create agent.",
"roster.createForm.descriptionLabel": "Description",
"roster.createForm.descriptionPlaceholder": "Describe what this agent does…",
"roster.createForm.nameLabel": "Name",
"roster.createForm.namePlaceholder": "Enter agent name…",
"roster.createForm.nameRequired": "Name is required.",
"roster.createSuccess": "Agent created.",
"roster.description": "Agents saved to this workspace are listed here. Create, search, edit, and archive roster agents from one place.",
"roster.editAgent": "Editar {{name}}",
"roster.filters.all": "All 4",
"roster.filters.drafts": "Drafts",
"roster.filters.inUse": "In use",
"roster.gridView": "Grid view",
"roster.invite": "Invite",
"roster.inviteAgent": "Invitar a {{name}}",
"roster.editDialog.description": "Update the roster name and description for this agent.",
"roster.editDialog.title": "Edit agent",
"roster.empty": "No agents yet",
"roster.emptyDescription": "Agents saved to this workspace will appear here.",
"roster.emptySearch": "No matching agents",
"roster.emptySearchDescription": "Try another agent name.",
"roster.learnMore": "Learn more",
"roster.listView": "List view",
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
"roster.moreActions": "Más acciones para {{name}}",
"roster.loadMore": "Load more",
"roster.loadingError": "Failed to load agents. Refresh and try again.",
"roster.searchLabel": "Search agents",
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
"roster.sidebar.agents": "Agents",
"roster.sidebar.humans": "Humans",
"roster.sidebarLabel": "Roster sections",
"roster.soon": "Soon",
"roster.searchPlaceholder": "Search agents by name…",
"roster.sources.agent_app": "Agent app",
"roster.sources.imported": "Imported",
"roster.sources.system": "System",
"roster.sources.workflow": "Workflow",
"roster.status.active": "Active",
"roster.status.archived": "Archived",
"roster.title": "Agent Roster",
"roster.unused": "Unused",
"roster.updated": "updated {{time}} ago",
"roster.usedInWorkflows": "Used in {{count}} workflows"
"roster.updateFailed": "Failed to update agent. Check the fields and try again.",
"roster.updateSuccess": "Agent updated."
}

View File

@ -25,13 +25,8 @@
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
"agentDetail.monitoring.timeRangeLabel": "Time range",
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
@ -50,29 +45,43 @@
"agentDetail.subtitle": "شناسه عامل: {{agentId}}",
"agentDetail.title": "عامل",
"agentDetail.type": "عامل",
"roster.connectOwnAgent": "Connect to Your Own Agent",
"roster.agentCount": "{{count}} agents",
"roster.archive": "Archive",
"roster.archiveAgent": "Archive {{name}}",
"roster.archiveDialog.description": "This agent will be removed from the active roster list.",
"roster.archiveDialog.title": "Archive {{name}}?",
"roster.archiveFailed": "Failed to archive agent.",
"roster.archiveSuccess": "Agent archived.",
"roster.createAgent": "Create agent",
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
"roster.draft": "Draft",
"roster.createDialog.description": "Create a reusable agent in this workspace roster.",
"roster.createDialog.title": "Create agent",
"roster.createFailed": "Failed to create agent.",
"roster.createForm.descriptionLabel": "Description",
"roster.createForm.descriptionPlaceholder": "Describe what this agent does…",
"roster.createForm.nameLabel": "Name",
"roster.createForm.namePlaceholder": "Enter agent name…",
"roster.createForm.nameRequired": "Name is required.",
"roster.createSuccess": "Agent created.",
"roster.description": "Agents saved to this workspace are listed here. Create, search, edit, and archive roster agents from one place.",
"roster.editAgent": "ویرایش {{name}}",
"roster.filters.all": "All 4",
"roster.filters.drafts": "Drafts",
"roster.filters.inUse": "In use",
"roster.gridView": "Grid view",
"roster.invite": "Invite",
"roster.inviteAgent": "دعوت از {{name}}",
"roster.editDialog.description": "Update the roster name and description for this agent.",
"roster.editDialog.title": "Edit agent",
"roster.empty": "No agents yet",
"roster.emptyDescription": "Agents saved to this workspace will appear here.",
"roster.emptySearch": "No matching agents",
"roster.emptySearchDescription": "Try another agent name.",
"roster.learnMore": "Learn more",
"roster.listView": "List view",
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
"roster.moreActions": "اقدام‌های بیشتر برای {{name}}",
"roster.loadMore": "Load more",
"roster.loadingError": "Failed to load agents. Refresh and try again.",
"roster.searchLabel": "Search agents",
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
"roster.sidebar.agents": "Agents",
"roster.sidebar.humans": "Humans",
"roster.sidebarLabel": "Roster sections",
"roster.soon": "Soon",
"roster.searchPlaceholder": "Search agents by name…",
"roster.sources.agent_app": "Agent app",
"roster.sources.imported": "Imported",
"roster.sources.system": "System",
"roster.sources.workflow": "Workflow",
"roster.status.active": "Active",
"roster.status.archived": "Archived",
"roster.title": "Agent Roster",
"roster.unused": "Unused",
"roster.updated": "updated {{time}} ago",
"roster.usedInWorkflows": "Used in {{count}} workflows"
"roster.updateFailed": "Failed to update agent. Check the fields and try again.",
"roster.updateSuccess": "Agent updated."
}

View File

@ -25,13 +25,8 @@
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
"agentDetail.monitoring.timeRangeLabel": "Time range",
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
@ -50,29 +45,43 @@
"agentDetail.subtitle": "ID de lagent : {{agentId}}",
"agentDetail.title": "Agent",
"agentDetail.type": "AGENT",
"roster.connectOwnAgent": "Connect to Your Own Agent",
"roster.agentCount": "{{count}} agents",
"roster.archive": "Archive",
"roster.archiveAgent": "Archive {{name}}",
"roster.archiveDialog.description": "This agent will be removed from the active roster list.",
"roster.archiveDialog.title": "Archive {{name}}?",
"roster.archiveFailed": "Failed to archive agent.",
"roster.archiveSuccess": "Agent archived.",
"roster.createAgent": "Create agent",
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
"roster.draft": "Draft",
"roster.createDialog.description": "Create a reusable agent in this workspace roster.",
"roster.createDialog.title": "Create agent",
"roster.createFailed": "Failed to create agent.",
"roster.createForm.descriptionLabel": "Description",
"roster.createForm.descriptionPlaceholder": "Describe what this agent does…",
"roster.createForm.nameLabel": "Name",
"roster.createForm.namePlaceholder": "Enter agent name…",
"roster.createForm.nameRequired": "Name is required.",
"roster.createSuccess": "Agent created.",
"roster.description": "Agents saved to this workspace are listed here. Create, search, edit, and archive roster agents from one place.",
"roster.editAgent": "Modifier {{name}}",
"roster.filters.all": "All 4",
"roster.filters.drafts": "Drafts",
"roster.filters.inUse": "In use",
"roster.gridView": "Grid view",
"roster.invite": "Invite",
"roster.inviteAgent": "Inviter {{name}}",
"roster.editDialog.description": "Update the roster name and description for this agent.",
"roster.editDialog.title": "Edit agent",
"roster.empty": "No agents yet",
"roster.emptyDescription": "Agents saved to this workspace will appear here.",
"roster.emptySearch": "No matching agents",
"roster.emptySearchDescription": "Try another agent name.",
"roster.learnMore": "Learn more",
"roster.listView": "List view",
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
"roster.moreActions": "Plus dactions pour {{name}}",
"roster.loadMore": "Load more",
"roster.loadingError": "Failed to load agents. Refresh and try again.",
"roster.searchLabel": "Search agents",
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
"roster.sidebar.agents": "Agents",
"roster.sidebar.humans": "Humans",
"roster.sidebarLabel": "Roster sections",
"roster.soon": "Soon",
"roster.searchPlaceholder": "Search agents by name…",
"roster.sources.agent_app": "Agent app",
"roster.sources.imported": "Imported",
"roster.sources.system": "System",
"roster.sources.workflow": "Workflow",
"roster.status.active": "Active",
"roster.status.archived": "Archived",
"roster.title": "Agent Roster",
"roster.unused": "Unused",
"roster.updated": "updated {{time}} ago",
"roster.usedInWorkflows": "Used in {{count}} workflows"
"roster.updateFailed": "Failed to update agent. Check the fields and try again.",
"roster.updateSuccess": "Agent updated."
}

View File

@ -25,13 +25,8 @@
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
"agentDetail.monitoring.timeRangeLabel": "Time range",
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
@ -50,29 +45,43 @@
"agentDetail.subtitle": "एजेंट आईडी: {{agentId}}",
"agentDetail.title": "एजेंट",
"agentDetail.type": "एजेंट",
"roster.connectOwnAgent": "Connect to Your Own Agent",
"roster.agentCount": "{{count}} agents",
"roster.archive": "Archive",
"roster.archiveAgent": "Archive {{name}}",
"roster.archiveDialog.description": "This agent will be removed from the active roster list.",
"roster.archiveDialog.title": "Archive {{name}}?",
"roster.archiveFailed": "Failed to archive agent.",
"roster.archiveSuccess": "Agent archived.",
"roster.createAgent": "Create agent",
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
"roster.draft": "Draft",
"roster.createDialog.description": "Create a reusable agent in this workspace roster.",
"roster.createDialog.title": "Create agent",
"roster.createFailed": "Failed to create agent.",
"roster.createForm.descriptionLabel": "Description",
"roster.createForm.descriptionPlaceholder": "Describe what this agent does…",
"roster.createForm.nameLabel": "Name",
"roster.createForm.namePlaceholder": "Enter agent name…",
"roster.createForm.nameRequired": "Name is required.",
"roster.createSuccess": "Agent created.",
"roster.description": "Agents saved to this workspace are listed here. Create, search, edit, and archive roster agents from one place.",
"roster.editAgent": "{{name}} संपादित करें",
"roster.filters.all": "All 4",
"roster.filters.drafts": "Drafts",
"roster.filters.inUse": "In use",
"roster.gridView": "Grid view",
"roster.invite": "Invite",
"roster.inviteAgent": "{{name}} को आमंत्रित करें",
"roster.editDialog.description": "Update the roster name and description for this agent.",
"roster.editDialog.title": "Edit agent",
"roster.empty": "No agents yet",
"roster.emptyDescription": "Agents saved to this workspace will appear here.",
"roster.emptySearch": "No matching agents",
"roster.emptySearchDescription": "Try another agent name.",
"roster.learnMore": "Learn more",
"roster.listView": "List view",
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
"roster.moreActions": "{{name}} के लिए और कार्रवाइयां",
"roster.loadMore": "Load more",
"roster.loadingError": "Failed to load agents. Refresh and try again.",
"roster.searchLabel": "Search agents",
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
"roster.sidebar.agents": "Agents",
"roster.sidebar.humans": "Humans",
"roster.sidebarLabel": "Roster sections",
"roster.soon": "Soon",
"roster.searchPlaceholder": "Search agents by name…",
"roster.sources.agent_app": "Agent app",
"roster.sources.imported": "Imported",
"roster.sources.system": "System",
"roster.sources.workflow": "Workflow",
"roster.status.active": "Active",
"roster.status.archived": "Archived",
"roster.title": "Agent Roster",
"roster.unused": "Unused",
"roster.updated": "updated {{time}} ago",
"roster.usedInWorkflows": "Used in {{count}} workflows"
"roster.updateFailed": "Failed to update agent. Check the fields and try again.",
"roster.updateSuccess": "Agent updated."
}

View File

@ -25,13 +25,8 @@
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
"agentDetail.monitoring.timeRangeLabel": "Time range",
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
@ -50,29 +45,43 @@
"agentDetail.subtitle": "ID agen: {{agentId}}",
"agentDetail.title": "Agen",
"agentDetail.type": "AGEN",
"roster.connectOwnAgent": "Connect to Your Own Agent",
"roster.agentCount": "{{count}} agents",
"roster.archive": "Archive",
"roster.archiveAgent": "Archive {{name}}",
"roster.archiveDialog.description": "This agent will be removed from the active roster list.",
"roster.archiveDialog.title": "Archive {{name}}?",
"roster.archiveFailed": "Failed to archive agent.",
"roster.archiveSuccess": "Agent archived.",
"roster.createAgent": "Create agent",
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
"roster.draft": "Draft",
"roster.createDialog.description": "Create a reusable agent in this workspace roster.",
"roster.createDialog.title": "Create agent",
"roster.createFailed": "Failed to create agent.",
"roster.createForm.descriptionLabel": "Description",
"roster.createForm.descriptionPlaceholder": "Describe what this agent does…",
"roster.createForm.nameLabel": "Name",
"roster.createForm.namePlaceholder": "Enter agent name…",
"roster.createForm.nameRequired": "Name is required.",
"roster.createSuccess": "Agent created.",
"roster.description": "Agents saved to this workspace are listed here. Create, search, edit, and archive roster agents from one place.",
"roster.editAgent": "Edit {{name}}",
"roster.filters.all": "All 4",
"roster.filters.drafts": "Drafts",
"roster.filters.inUse": "In use",
"roster.gridView": "Grid view",
"roster.invite": "Invite",
"roster.inviteAgent": "Undang {{name}}",
"roster.editDialog.description": "Update the roster name and description for this agent.",
"roster.editDialog.title": "Edit agent",
"roster.empty": "No agents yet",
"roster.emptyDescription": "Agents saved to this workspace will appear here.",
"roster.emptySearch": "No matching agents",
"roster.emptySearchDescription": "Try another agent name.",
"roster.learnMore": "Learn more",
"roster.listView": "List view",
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
"roster.moreActions": "Tindakan lainnya untuk {{name}}",
"roster.loadMore": "Load more",
"roster.loadingError": "Failed to load agents. Refresh and try again.",
"roster.searchLabel": "Search agents",
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
"roster.sidebar.agents": "Agents",
"roster.sidebar.humans": "Humans",
"roster.sidebarLabel": "Roster sections",
"roster.soon": "Soon",
"roster.searchPlaceholder": "Search agents by name…",
"roster.sources.agent_app": "Agent app",
"roster.sources.imported": "Imported",
"roster.sources.system": "System",
"roster.sources.workflow": "Workflow",
"roster.status.active": "Active",
"roster.status.archived": "Archived",
"roster.title": "Agent Roster",
"roster.unused": "Unused",
"roster.updated": "updated {{time}} ago",
"roster.usedInWorkflows": "Used in {{count}} workflows"
"roster.updateFailed": "Failed to update agent. Check the fields and try again.",
"roster.updateSuccess": "Agent updated."
}

View File

@ -25,13 +25,8 @@
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
"agentDetail.monitoring.timeRangeLabel": "Time range",
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
@ -50,29 +45,43 @@
"agentDetail.subtitle": "ID agente: {{agentId}}",
"agentDetail.title": "Agente",
"agentDetail.type": "AGENTE",
"roster.connectOwnAgent": "Connect to Your Own Agent",
"roster.agentCount": "{{count}} agents",
"roster.archive": "Archive",
"roster.archiveAgent": "Archive {{name}}",
"roster.archiveDialog.description": "This agent will be removed from the active roster list.",
"roster.archiveDialog.title": "Archive {{name}}?",
"roster.archiveFailed": "Failed to archive agent.",
"roster.archiveSuccess": "Agent archived.",
"roster.createAgent": "Create agent",
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
"roster.draft": "Draft",
"roster.createDialog.description": "Create a reusable agent in this workspace roster.",
"roster.createDialog.title": "Create agent",
"roster.createFailed": "Failed to create agent.",
"roster.createForm.descriptionLabel": "Description",
"roster.createForm.descriptionPlaceholder": "Describe what this agent does…",
"roster.createForm.nameLabel": "Name",
"roster.createForm.namePlaceholder": "Enter agent name…",
"roster.createForm.nameRequired": "Name is required.",
"roster.createSuccess": "Agent created.",
"roster.description": "Agents saved to this workspace are listed here. Create, search, edit, and archive roster agents from one place.",
"roster.editAgent": "Modifica {{name}}",
"roster.filters.all": "All 4",
"roster.filters.drafts": "Drafts",
"roster.filters.inUse": "In use",
"roster.gridView": "Grid view",
"roster.invite": "Invite",
"roster.inviteAgent": "Invita {{name}}",
"roster.editDialog.description": "Update the roster name and description for this agent.",
"roster.editDialog.title": "Edit agent",
"roster.empty": "No agents yet",
"roster.emptyDescription": "Agents saved to this workspace will appear here.",
"roster.emptySearch": "No matching agents",
"roster.emptySearchDescription": "Try another agent name.",
"roster.learnMore": "Learn more",
"roster.listView": "List view",
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
"roster.moreActions": "Altre azioni per {{name}}",
"roster.loadMore": "Load more",
"roster.loadingError": "Failed to load agents. Refresh and try again.",
"roster.searchLabel": "Search agents",
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
"roster.sidebar.agents": "Agents",
"roster.sidebar.humans": "Humans",
"roster.sidebarLabel": "Roster sections",
"roster.soon": "Soon",
"roster.searchPlaceholder": "Search agents by name…",
"roster.sources.agent_app": "Agent app",
"roster.sources.imported": "Imported",
"roster.sources.system": "System",
"roster.sources.workflow": "Workflow",
"roster.status.active": "Active",
"roster.status.archived": "Archived",
"roster.title": "Agent Roster",
"roster.unused": "Unused",
"roster.updated": "updated {{time}} ago",
"roster.usedInWorkflows": "Used in {{count}} workflows"
"roster.updateFailed": "Failed to update agent. Check the fields and try again.",
"roster.updateSuccess": "Agent updated."
}

View File

@ -25,13 +25,8 @@
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
"agentDetail.monitoring.timeRangeLabel": "Time range",
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
@ -50,29 +45,43 @@
"agentDetail.subtitle": "エージェントID: {{agentId}}",
"agentDetail.title": "エージェント",
"agentDetail.type": "エージェント",
"roster.connectOwnAgent": "Connect to Your Own Agent",
"roster.agentCount": "{{count}} agents",
"roster.archive": "Archive",
"roster.archiveAgent": "Archive {{name}}",
"roster.archiveDialog.description": "This agent will be removed from the active roster list.",
"roster.archiveDialog.title": "Archive {{name}}?",
"roster.archiveFailed": "Failed to archive agent.",
"roster.archiveSuccess": "Agent archived.",
"roster.createAgent": "Create agent",
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
"roster.draft": "Draft",
"roster.createDialog.description": "Create a reusable agent in this workspace roster.",
"roster.createDialog.title": "Create agent",
"roster.createFailed": "Failed to create agent.",
"roster.createForm.descriptionLabel": "Description",
"roster.createForm.descriptionPlaceholder": "Describe what this agent does…",
"roster.createForm.nameLabel": "Name",
"roster.createForm.namePlaceholder": "Enter agent name…",
"roster.createForm.nameRequired": "Name is required.",
"roster.createSuccess": "Agent created.",
"roster.description": "Agents saved to this workspace are listed here. Create, search, edit, and archive roster agents from one place.",
"roster.editAgent": "{{name}}を編集",
"roster.filters.all": "All 4",
"roster.filters.drafts": "Drafts",
"roster.filters.inUse": "In use",
"roster.gridView": "Grid view",
"roster.invite": "Invite",
"roster.inviteAgent": "{{name}}を招待",
"roster.editDialog.description": "Update the roster name and description for this agent.",
"roster.editDialog.title": "Edit agent",
"roster.empty": "No agents yet",
"roster.emptyDescription": "Agents saved to this workspace will appear here.",
"roster.emptySearch": "No matching agents",
"roster.emptySearchDescription": "Try another agent name.",
"roster.learnMore": "Learn more",
"roster.listView": "List view",
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
"roster.moreActions": "{{name}}のその他の操作",
"roster.loadMore": "Load more",
"roster.loadingError": "Failed to load agents. Refresh and try again.",
"roster.searchLabel": "Search agents",
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
"roster.sidebar.agents": "Agents",
"roster.sidebar.humans": "Humans",
"roster.sidebarLabel": "Roster sections",
"roster.soon": "Soon",
"roster.searchPlaceholder": "Search agents by name…",
"roster.sources.agent_app": "Agent app",
"roster.sources.imported": "Imported",
"roster.sources.system": "System",
"roster.sources.workflow": "Workflow",
"roster.status.active": "Active",
"roster.status.archived": "Archived",
"roster.title": "Agent Roster",
"roster.unused": "Unused",
"roster.updated": "updated {{time}} ago",
"roster.usedInWorkflows": "Used in {{count}} workflows"
"roster.updateFailed": "Failed to update agent. Check the fields and try again.",
"roster.updateSuccess": "Agent updated."
}

View File

@ -25,13 +25,8 @@
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
"agentDetail.monitoring.timeRangeLabel": "Time range",
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
@ -50,29 +45,43 @@
"agentDetail.subtitle": "에이전트 ID: {{agentId}}",
"agentDetail.title": "에이전트",
"agentDetail.type": "에이전트",
"roster.connectOwnAgent": "Connect to Your Own Agent",
"roster.agentCount": "{{count}} agents",
"roster.archive": "Archive",
"roster.archiveAgent": "Archive {{name}}",
"roster.archiveDialog.description": "This agent will be removed from the active roster list.",
"roster.archiveDialog.title": "Archive {{name}}?",
"roster.archiveFailed": "Failed to archive agent.",
"roster.archiveSuccess": "Agent archived.",
"roster.createAgent": "Create agent",
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
"roster.draft": "Draft",
"roster.createDialog.description": "Create a reusable agent in this workspace roster.",
"roster.createDialog.title": "Create agent",
"roster.createFailed": "Failed to create agent.",
"roster.createForm.descriptionLabel": "Description",
"roster.createForm.descriptionPlaceholder": "Describe what this agent does…",
"roster.createForm.nameLabel": "Name",
"roster.createForm.namePlaceholder": "Enter agent name…",
"roster.createForm.nameRequired": "Name is required.",
"roster.createSuccess": "Agent created.",
"roster.description": "Agents saved to this workspace are listed here. Create, search, edit, and archive roster agents from one place.",
"roster.editAgent": "{{name}} 편집",
"roster.filters.all": "All 4",
"roster.filters.drafts": "Drafts",
"roster.filters.inUse": "In use",
"roster.gridView": "Grid view",
"roster.invite": "Invite",
"roster.inviteAgent": "{{name}} 초대",
"roster.editDialog.description": "Update the roster name and description for this agent.",
"roster.editDialog.title": "Edit agent",
"roster.empty": "No agents yet",
"roster.emptyDescription": "Agents saved to this workspace will appear here.",
"roster.emptySearch": "No matching agents",
"roster.emptySearchDescription": "Try another agent name.",
"roster.learnMore": "Learn more",
"roster.listView": "List view",
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
"roster.moreActions": "{{name}}에 대한 추가 작업",
"roster.loadMore": "Load more",
"roster.loadingError": "Failed to load agents. Refresh and try again.",
"roster.searchLabel": "Search agents",
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
"roster.sidebar.agents": "Agents",
"roster.sidebar.humans": "Humans",
"roster.sidebarLabel": "Roster sections",
"roster.soon": "Soon",
"roster.searchPlaceholder": "Search agents by name…",
"roster.sources.agent_app": "Agent app",
"roster.sources.imported": "Imported",
"roster.sources.system": "System",
"roster.sources.workflow": "Workflow",
"roster.status.active": "Active",
"roster.status.archived": "Archived",
"roster.title": "Agent Roster",
"roster.unused": "Unused",
"roster.updated": "updated {{time}} ago",
"roster.usedInWorkflows": "Used in {{count}} workflows"
"roster.updateFailed": "Failed to update agent. Check the fields and try again.",
"roster.updateSuccess": "Agent updated."
}

View File

@ -25,13 +25,8 @@
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
"agentDetail.monitoring.timeRangeLabel": "Time range",
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
@ -50,29 +45,43 @@
"agentDetail.subtitle": "Agent-ID: {{agentId}}",
"agentDetail.title": "Agent",
"agentDetail.type": "AGENT",
"roster.connectOwnAgent": "Connect to Your Own Agent",
"roster.agentCount": "{{count}} agents",
"roster.archive": "Archive",
"roster.archiveAgent": "Archive {{name}}",
"roster.archiveDialog.description": "This agent will be removed from the active roster list.",
"roster.archiveDialog.title": "Archive {{name}}?",
"roster.archiveFailed": "Failed to archive agent.",
"roster.archiveSuccess": "Agent archived.",
"roster.createAgent": "Create agent",
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
"roster.draft": "Draft",
"roster.createDialog.description": "Create a reusable agent in this workspace roster.",
"roster.createDialog.title": "Create agent",
"roster.createFailed": "Failed to create agent.",
"roster.createForm.descriptionLabel": "Description",
"roster.createForm.descriptionPlaceholder": "Describe what this agent does…",
"roster.createForm.nameLabel": "Name",
"roster.createForm.namePlaceholder": "Enter agent name…",
"roster.createForm.nameRequired": "Name is required.",
"roster.createSuccess": "Agent created.",
"roster.description": "Agents saved to this workspace are listed here. Create, search, edit, and archive roster agents from one place.",
"roster.editAgent": "{{name}} bewerken",
"roster.filters.all": "All 4",
"roster.filters.drafts": "Drafts",
"roster.filters.inUse": "In use",
"roster.gridView": "Grid view",
"roster.invite": "Invite",
"roster.inviteAgent": "{{name}} uitnodigen",
"roster.editDialog.description": "Update the roster name and description for this agent.",
"roster.editDialog.title": "Edit agent",
"roster.empty": "No agents yet",
"roster.emptyDescription": "Agents saved to this workspace will appear here.",
"roster.emptySearch": "No matching agents",
"roster.emptySearchDescription": "Try another agent name.",
"roster.learnMore": "Learn more",
"roster.listView": "List view",
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
"roster.moreActions": "Meer acties voor {{name}}",
"roster.loadMore": "Load more",
"roster.loadingError": "Failed to load agents. Refresh and try again.",
"roster.searchLabel": "Search agents",
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
"roster.sidebar.agents": "Agents",
"roster.sidebar.humans": "Humans",
"roster.sidebarLabel": "Roster sections",
"roster.soon": "Soon",
"roster.searchPlaceholder": "Search agents by name…",
"roster.sources.agent_app": "Agent app",
"roster.sources.imported": "Imported",
"roster.sources.system": "System",
"roster.sources.workflow": "Workflow",
"roster.status.active": "Active",
"roster.status.archived": "Archived",
"roster.title": "Agent Roster",
"roster.unused": "Unused",
"roster.updated": "updated {{time}} ago",
"roster.usedInWorkflows": "Used in {{count}} workflows"
"roster.updateFailed": "Failed to update agent. Check the fields and try again.",
"roster.updateSuccess": "Agent updated."
}

View File

@ -25,13 +25,8 @@
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
"agentDetail.monitoring.timeRangeLabel": "Time range",
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
@ -50,29 +45,43 @@
"agentDetail.subtitle": "ID agenta: {{agentId}}",
"agentDetail.title": "Agent",
"agentDetail.type": "AGENT",
"roster.connectOwnAgent": "Connect to Your Own Agent",
"roster.agentCount": "{{count}} agents",
"roster.archive": "Archive",
"roster.archiveAgent": "Archive {{name}}",
"roster.archiveDialog.description": "This agent will be removed from the active roster list.",
"roster.archiveDialog.title": "Archive {{name}}?",
"roster.archiveFailed": "Failed to archive agent.",
"roster.archiveSuccess": "Agent archived.",
"roster.createAgent": "Create agent",
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
"roster.draft": "Draft",
"roster.createDialog.description": "Create a reusable agent in this workspace roster.",
"roster.createDialog.title": "Create agent",
"roster.createFailed": "Failed to create agent.",
"roster.createForm.descriptionLabel": "Description",
"roster.createForm.descriptionPlaceholder": "Describe what this agent does…",
"roster.createForm.nameLabel": "Name",
"roster.createForm.namePlaceholder": "Enter agent name…",
"roster.createForm.nameRequired": "Name is required.",
"roster.createSuccess": "Agent created.",
"roster.description": "Agents saved to this workspace are listed here. Create, search, edit, and archive roster agents from one place.",
"roster.editAgent": "Edytuj {{name}}",
"roster.filters.all": "All 4",
"roster.filters.drafts": "Drafts",
"roster.filters.inUse": "In use",
"roster.gridView": "Grid view",
"roster.invite": "Invite",
"roster.inviteAgent": "Zaproś {{name}}",
"roster.editDialog.description": "Update the roster name and description for this agent.",
"roster.editDialog.title": "Edit agent",
"roster.empty": "No agents yet",
"roster.emptyDescription": "Agents saved to this workspace will appear here.",
"roster.emptySearch": "No matching agents",
"roster.emptySearchDescription": "Try another agent name.",
"roster.learnMore": "Learn more",
"roster.listView": "List view",
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
"roster.moreActions": "Więcej akcji dla {{name}}",
"roster.loadMore": "Load more",
"roster.loadingError": "Failed to load agents. Refresh and try again.",
"roster.searchLabel": "Search agents",
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
"roster.sidebar.agents": "Agents",
"roster.sidebar.humans": "Humans",
"roster.sidebarLabel": "Roster sections",
"roster.soon": "Soon",
"roster.searchPlaceholder": "Search agents by name…",
"roster.sources.agent_app": "Agent app",
"roster.sources.imported": "Imported",
"roster.sources.system": "System",
"roster.sources.workflow": "Workflow",
"roster.status.active": "Active",
"roster.status.archived": "Archived",
"roster.title": "Agent Roster",
"roster.unused": "Unused",
"roster.updated": "updated {{time}} ago",
"roster.usedInWorkflows": "Used in {{count}} workflows"
"roster.updateFailed": "Failed to update agent. Check the fields and try again.",
"roster.updateSuccess": "Agent updated."
}

View File

@ -25,13 +25,8 @@
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
"agentDetail.monitoring.timeRangeLabel": "Time range",
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
@ -50,29 +45,43 @@
"agentDetail.subtitle": "ID do agente: {{agentId}}",
"agentDetail.title": "Agente",
"agentDetail.type": "AGENTE",
"roster.connectOwnAgent": "Connect to Your Own Agent",
"roster.agentCount": "{{count}} agents",
"roster.archive": "Archive",
"roster.archiveAgent": "Archive {{name}}",
"roster.archiveDialog.description": "This agent will be removed from the active roster list.",
"roster.archiveDialog.title": "Archive {{name}}?",
"roster.archiveFailed": "Failed to archive agent.",
"roster.archiveSuccess": "Agent archived.",
"roster.createAgent": "Create agent",
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
"roster.draft": "Draft",
"roster.createDialog.description": "Create a reusable agent in this workspace roster.",
"roster.createDialog.title": "Create agent",
"roster.createFailed": "Failed to create agent.",
"roster.createForm.descriptionLabel": "Description",
"roster.createForm.descriptionPlaceholder": "Describe what this agent does…",
"roster.createForm.nameLabel": "Name",
"roster.createForm.namePlaceholder": "Enter agent name…",
"roster.createForm.nameRequired": "Name is required.",
"roster.createSuccess": "Agent created.",
"roster.description": "Agents saved to this workspace are listed here. Create, search, edit, and archive roster agents from one place.",
"roster.editAgent": "Editar {{name}}",
"roster.filters.all": "All 4",
"roster.filters.drafts": "Drafts",
"roster.filters.inUse": "In use",
"roster.gridView": "Grid view",
"roster.invite": "Invite",
"roster.inviteAgent": "Convidar {{name}}",
"roster.editDialog.description": "Update the roster name and description for this agent.",
"roster.editDialog.title": "Edit agent",
"roster.empty": "No agents yet",
"roster.emptyDescription": "Agents saved to this workspace will appear here.",
"roster.emptySearch": "No matching agents",
"roster.emptySearchDescription": "Try another agent name.",
"roster.learnMore": "Learn more",
"roster.listView": "List view",
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
"roster.moreActions": "Mais ações para {{name}}",
"roster.loadMore": "Load more",
"roster.loadingError": "Failed to load agents. Refresh and try again.",
"roster.searchLabel": "Search agents",
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
"roster.sidebar.agents": "Agents",
"roster.sidebar.humans": "Humans",
"roster.sidebarLabel": "Roster sections",
"roster.soon": "Soon",
"roster.searchPlaceholder": "Search agents by name…",
"roster.sources.agent_app": "Agent app",
"roster.sources.imported": "Imported",
"roster.sources.system": "System",
"roster.sources.workflow": "Workflow",
"roster.status.active": "Active",
"roster.status.archived": "Archived",
"roster.title": "Agent Roster",
"roster.unused": "Unused",
"roster.updated": "updated {{time}} ago",
"roster.usedInWorkflows": "Used in {{count}} workflows"
"roster.updateFailed": "Failed to update agent. Check the fields and try again.",
"roster.updateSuccess": "Agent updated."
}

View File

@ -25,13 +25,8 @@
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
"agentDetail.monitoring.timeRangeLabel": "Time range",
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
@ -50,29 +45,43 @@
"agentDetail.subtitle": "ID agent: {{agentId}}",
"agentDetail.title": "Agent",
"agentDetail.type": "AGENT",
"roster.connectOwnAgent": "Connect to Your Own Agent",
"roster.agentCount": "{{count}} agents",
"roster.archive": "Archive",
"roster.archiveAgent": "Archive {{name}}",
"roster.archiveDialog.description": "This agent will be removed from the active roster list.",
"roster.archiveDialog.title": "Archive {{name}}?",
"roster.archiveFailed": "Failed to archive agent.",
"roster.archiveSuccess": "Agent archived.",
"roster.createAgent": "Create agent",
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
"roster.draft": "Draft",
"roster.createDialog.description": "Create a reusable agent in this workspace roster.",
"roster.createDialog.title": "Create agent",
"roster.createFailed": "Failed to create agent.",
"roster.createForm.descriptionLabel": "Description",
"roster.createForm.descriptionPlaceholder": "Describe what this agent does…",
"roster.createForm.nameLabel": "Name",
"roster.createForm.namePlaceholder": "Enter agent name…",
"roster.createForm.nameRequired": "Name is required.",
"roster.createSuccess": "Agent created.",
"roster.description": "Agents saved to this workspace are listed here. Create, search, edit, and archive roster agents from one place.",
"roster.editAgent": "Editează {{name}}",
"roster.filters.all": "All 4",
"roster.filters.drafts": "Drafts",
"roster.filters.inUse": "In use",
"roster.gridView": "Grid view",
"roster.invite": "Invite",
"roster.inviteAgent": "Invită {{name}}",
"roster.editDialog.description": "Update the roster name and description for this agent.",
"roster.editDialog.title": "Edit agent",
"roster.empty": "No agents yet",
"roster.emptyDescription": "Agents saved to this workspace will appear here.",
"roster.emptySearch": "No matching agents",
"roster.emptySearchDescription": "Try another agent name.",
"roster.learnMore": "Learn more",
"roster.listView": "List view",
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
"roster.moreActions": "Mai multe acțiuni pentru {{name}}",
"roster.loadMore": "Load more",
"roster.loadingError": "Failed to load agents. Refresh and try again.",
"roster.searchLabel": "Search agents",
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
"roster.sidebar.agents": "Agents",
"roster.sidebar.humans": "Humans",
"roster.sidebarLabel": "Roster sections",
"roster.soon": "Soon",
"roster.searchPlaceholder": "Search agents by name…",
"roster.sources.agent_app": "Agent app",
"roster.sources.imported": "Imported",
"roster.sources.system": "System",
"roster.sources.workflow": "Workflow",
"roster.status.active": "Active",
"roster.status.archived": "Archived",
"roster.title": "Agent Roster",
"roster.unused": "Unused",
"roster.updated": "updated {{time}} ago",
"roster.usedInWorkflows": "Used in {{count}} workflows"
"roster.updateFailed": "Failed to update agent. Check the fields and try again.",
"roster.updateSuccess": "Agent updated."
}

View File

@ -25,13 +25,8 @@
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
"agentDetail.monitoring.timeRangeLabel": "Time range",
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
@ -50,29 +45,43 @@
"agentDetail.subtitle": "ID агента: {{agentId}}",
"agentDetail.title": "Агент",
"agentDetail.type": "АГЕНТ",
"roster.connectOwnAgent": "Connect to Your Own Agent",
"roster.agentCount": "{{count}} agents",
"roster.archive": "Archive",
"roster.archiveAgent": "Archive {{name}}",
"roster.archiveDialog.description": "This agent will be removed from the active roster list.",
"roster.archiveDialog.title": "Archive {{name}}?",
"roster.archiveFailed": "Failed to archive agent.",
"roster.archiveSuccess": "Agent archived.",
"roster.createAgent": "Create agent",
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
"roster.draft": "Draft",
"roster.createDialog.description": "Create a reusable agent in this workspace roster.",
"roster.createDialog.title": "Create agent",
"roster.createFailed": "Failed to create agent.",
"roster.createForm.descriptionLabel": "Description",
"roster.createForm.descriptionPlaceholder": "Describe what this agent does…",
"roster.createForm.nameLabel": "Name",
"roster.createForm.namePlaceholder": "Enter agent name…",
"roster.createForm.nameRequired": "Name is required.",
"roster.createSuccess": "Agent created.",
"roster.description": "Agents saved to this workspace are listed here. Create, search, edit, and archive roster agents from one place.",
"roster.editAgent": "Редактировать {{name}}",
"roster.filters.all": "All 4",
"roster.filters.drafts": "Drafts",
"roster.filters.inUse": "In use",
"roster.gridView": "Grid view",
"roster.invite": "Invite",
"roster.inviteAgent": "Пригласить {{name}}",
"roster.editDialog.description": "Update the roster name and description for this agent.",
"roster.editDialog.title": "Edit agent",
"roster.empty": "No agents yet",
"roster.emptyDescription": "Agents saved to this workspace will appear here.",
"roster.emptySearch": "No matching agents",
"roster.emptySearchDescription": "Try another agent name.",
"roster.learnMore": "Learn more",
"roster.listView": "List view",
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
"roster.moreActions": "Дополнительные действия для {{name}}",
"roster.loadMore": "Load more",
"roster.loadingError": "Failed to load agents. Refresh and try again.",
"roster.searchLabel": "Search agents",
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
"roster.sidebar.agents": "Agents",
"roster.sidebar.humans": "Humans",
"roster.sidebarLabel": "Roster sections",
"roster.soon": "Soon",
"roster.searchPlaceholder": "Search agents by name…",
"roster.sources.agent_app": "Agent app",
"roster.sources.imported": "Imported",
"roster.sources.system": "System",
"roster.sources.workflow": "Workflow",
"roster.status.active": "Active",
"roster.status.archived": "Archived",
"roster.title": "Agent Roster",
"roster.unused": "Unused",
"roster.updated": "updated {{time}} ago",
"roster.usedInWorkflows": "Used in {{count}} workflows"
"roster.updateFailed": "Failed to update agent. Check the fields and try again.",
"roster.updateSuccess": "Agent updated."
}

View File

@ -25,13 +25,8 @@
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
"agentDetail.monitoring.timeRangeLabel": "Time range",
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
@ -50,29 +45,43 @@
"agentDetail.subtitle": "ID agenta: {{agentId}}",
"agentDetail.title": "Agent",
"agentDetail.type": "AGENT",
"roster.connectOwnAgent": "Connect to Your Own Agent",
"roster.agentCount": "{{count}} agents",
"roster.archive": "Archive",
"roster.archiveAgent": "Archive {{name}}",
"roster.archiveDialog.description": "This agent will be removed from the active roster list.",
"roster.archiveDialog.title": "Archive {{name}}?",
"roster.archiveFailed": "Failed to archive agent.",
"roster.archiveSuccess": "Agent archived.",
"roster.createAgent": "Create agent",
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
"roster.draft": "Draft",
"roster.createDialog.description": "Create a reusable agent in this workspace roster.",
"roster.createDialog.title": "Create agent",
"roster.createFailed": "Failed to create agent.",
"roster.createForm.descriptionLabel": "Description",
"roster.createForm.descriptionPlaceholder": "Describe what this agent does…",
"roster.createForm.nameLabel": "Name",
"roster.createForm.namePlaceholder": "Enter agent name…",
"roster.createForm.nameRequired": "Name is required.",
"roster.createSuccess": "Agent created.",
"roster.description": "Agents saved to this workspace are listed here. Create, search, edit, and archive roster agents from one place.",
"roster.editAgent": "Uredi {{name}}",
"roster.filters.all": "All 4",
"roster.filters.drafts": "Drafts",
"roster.filters.inUse": "In use",
"roster.gridView": "Grid view",
"roster.invite": "Invite",
"roster.inviteAgent": "Povabi {{name}}",
"roster.editDialog.description": "Update the roster name and description for this agent.",
"roster.editDialog.title": "Edit agent",
"roster.empty": "No agents yet",
"roster.emptyDescription": "Agents saved to this workspace will appear here.",
"roster.emptySearch": "No matching agents",
"roster.emptySearchDescription": "Try another agent name.",
"roster.learnMore": "Learn more",
"roster.listView": "List view",
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
"roster.moreActions": "Več dejanj za {{name}}",
"roster.loadMore": "Load more",
"roster.loadingError": "Failed to load agents. Refresh and try again.",
"roster.searchLabel": "Search agents",
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
"roster.sidebar.agents": "Agents",
"roster.sidebar.humans": "Humans",
"roster.sidebarLabel": "Roster sections",
"roster.soon": "Soon",
"roster.searchPlaceholder": "Search agents by name…",
"roster.sources.agent_app": "Agent app",
"roster.sources.imported": "Imported",
"roster.sources.system": "System",
"roster.sources.workflow": "Workflow",
"roster.status.active": "Active",
"roster.status.archived": "Archived",
"roster.title": "Agent Roster",
"roster.unused": "Unused",
"roster.updated": "updated {{time}} ago",
"roster.usedInWorkflows": "Used in {{count}} workflows"
"roster.updateFailed": "Failed to update agent. Check the fields and try again.",
"roster.updateSuccess": "Agent updated."
}

View File

@ -25,13 +25,8 @@
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
"agentDetail.monitoring.timeRangeLabel": "Time range",
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
@ -50,29 +45,43 @@
"agentDetail.subtitle": "รหัสเอเจนต์: {{agentId}}",
"agentDetail.title": "เอเจนต์",
"agentDetail.type": "เอเจนต์",
"roster.connectOwnAgent": "Connect to Your Own Agent",
"roster.agentCount": "{{count}} agents",
"roster.archive": "Archive",
"roster.archiveAgent": "Archive {{name}}",
"roster.archiveDialog.description": "This agent will be removed from the active roster list.",
"roster.archiveDialog.title": "Archive {{name}}?",
"roster.archiveFailed": "Failed to archive agent.",
"roster.archiveSuccess": "Agent archived.",
"roster.createAgent": "Create agent",
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
"roster.draft": "Draft",
"roster.createDialog.description": "Create a reusable agent in this workspace roster.",
"roster.createDialog.title": "Create agent",
"roster.createFailed": "Failed to create agent.",
"roster.createForm.descriptionLabel": "Description",
"roster.createForm.descriptionPlaceholder": "Describe what this agent does…",
"roster.createForm.nameLabel": "Name",
"roster.createForm.namePlaceholder": "Enter agent name…",
"roster.createForm.nameRequired": "Name is required.",
"roster.createSuccess": "Agent created.",
"roster.description": "Agents saved to this workspace are listed here. Create, search, edit, and archive roster agents from one place.",
"roster.editAgent": "แก้ไข {{name}}",
"roster.filters.all": "All 4",
"roster.filters.drafts": "Drafts",
"roster.filters.inUse": "In use",
"roster.gridView": "Grid view",
"roster.invite": "Invite",
"roster.inviteAgent": "เชิญ {{name}}",
"roster.editDialog.description": "Update the roster name and description for this agent.",
"roster.editDialog.title": "Edit agent",
"roster.empty": "No agents yet",
"roster.emptyDescription": "Agents saved to this workspace will appear here.",
"roster.emptySearch": "No matching agents",
"roster.emptySearchDescription": "Try another agent name.",
"roster.learnMore": "Learn more",
"roster.listView": "List view",
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
"roster.moreActions": "การดำเนินการเพิ่มเติมสำหรับ {{name}}",
"roster.loadMore": "Load more",
"roster.loadingError": "Failed to load agents. Refresh and try again.",
"roster.searchLabel": "Search agents",
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
"roster.sidebar.agents": "Agents",
"roster.sidebar.humans": "Humans",
"roster.sidebarLabel": "Roster sections",
"roster.soon": "Soon",
"roster.searchPlaceholder": "Search agents by name…",
"roster.sources.agent_app": "Agent app",
"roster.sources.imported": "Imported",
"roster.sources.system": "System",
"roster.sources.workflow": "Workflow",
"roster.status.active": "Active",
"roster.status.archived": "Archived",
"roster.title": "Agent Roster",
"roster.unused": "Unused",
"roster.updated": "updated {{time}} ago",
"roster.usedInWorkflows": "Used in {{count}} workflows"
"roster.updateFailed": "Failed to update agent. Check the fields and try again.",
"roster.updateSuccess": "Agent updated."
}

View File

@ -25,13 +25,8 @@
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
"agentDetail.monitoring.timeRangeLabel": "Time range",
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
@ -50,29 +45,43 @@
"agentDetail.subtitle": "Ajan ID: {{agentId}}",
"agentDetail.title": "Ajan",
"agentDetail.type": "AJAN",
"roster.connectOwnAgent": "Connect to Your Own Agent",
"roster.agentCount": "{{count}} agents",
"roster.archive": "Archive",
"roster.archiveAgent": "Archive {{name}}",
"roster.archiveDialog.description": "This agent will be removed from the active roster list.",
"roster.archiveDialog.title": "Archive {{name}}?",
"roster.archiveFailed": "Failed to archive agent.",
"roster.archiveSuccess": "Agent archived.",
"roster.createAgent": "Create agent",
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
"roster.draft": "Draft",
"roster.createDialog.description": "Create a reusable agent in this workspace roster.",
"roster.createDialog.title": "Create agent",
"roster.createFailed": "Failed to create agent.",
"roster.createForm.descriptionLabel": "Description",
"roster.createForm.descriptionPlaceholder": "Describe what this agent does…",
"roster.createForm.nameLabel": "Name",
"roster.createForm.namePlaceholder": "Enter agent name…",
"roster.createForm.nameRequired": "Name is required.",
"roster.createSuccess": "Agent created.",
"roster.description": "Agents saved to this workspace are listed here. Create, search, edit, and archive roster agents from one place.",
"roster.editAgent": "{{name}} ögesini düzenle",
"roster.filters.all": "All 4",
"roster.filters.drafts": "Drafts",
"roster.filters.inUse": "In use",
"roster.gridView": "Grid view",
"roster.invite": "Invite",
"roster.inviteAgent": "{{name}} ögesini davet et",
"roster.editDialog.description": "Update the roster name and description for this agent.",
"roster.editDialog.title": "Edit agent",
"roster.empty": "No agents yet",
"roster.emptyDescription": "Agents saved to this workspace will appear here.",
"roster.emptySearch": "No matching agents",
"roster.emptySearchDescription": "Try another agent name.",
"roster.learnMore": "Learn more",
"roster.listView": "List view",
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
"roster.moreActions": "{{name}} için daha fazla işlem",
"roster.loadMore": "Load more",
"roster.loadingError": "Failed to load agents. Refresh and try again.",
"roster.searchLabel": "Search agents",
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
"roster.sidebar.agents": "Agents",
"roster.sidebar.humans": "Humans",
"roster.sidebarLabel": "Roster sections",
"roster.soon": "Soon",
"roster.searchPlaceholder": "Search agents by name…",
"roster.sources.agent_app": "Agent app",
"roster.sources.imported": "Imported",
"roster.sources.system": "System",
"roster.sources.workflow": "Workflow",
"roster.status.active": "Active",
"roster.status.archived": "Archived",
"roster.title": "Agent Roster",
"roster.unused": "Unused",
"roster.updated": "updated {{time}} ago",
"roster.usedInWorkflows": "Used in {{count}} workflows"
"roster.updateFailed": "Failed to update agent. Check the fields and try again.",
"roster.updateSuccess": "Agent updated."
}

View File

@ -25,13 +25,8 @@
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
"agentDetail.monitoring.timeRangeLabel": "Time range",
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
@ -50,29 +45,43 @@
"agentDetail.subtitle": "ID агента: {{agentId}}",
"agentDetail.title": "Агент",
"agentDetail.type": "АГЕНТ",
"roster.connectOwnAgent": "Connect to Your Own Agent",
"roster.agentCount": "{{count}} agents",
"roster.archive": "Archive",
"roster.archiveAgent": "Archive {{name}}",
"roster.archiveDialog.description": "This agent will be removed from the active roster list.",
"roster.archiveDialog.title": "Archive {{name}}?",
"roster.archiveFailed": "Failed to archive agent.",
"roster.archiveSuccess": "Agent archived.",
"roster.createAgent": "Create agent",
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
"roster.draft": "Draft",
"roster.createDialog.description": "Create a reusable agent in this workspace roster.",
"roster.createDialog.title": "Create agent",
"roster.createFailed": "Failed to create agent.",
"roster.createForm.descriptionLabel": "Description",
"roster.createForm.descriptionPlaceholder": "Describe what this agent does…",
"roster.createForm.nameLabel": "Name",
"roster.createForm.namePlaceholder": "Enter agent name…",
"roster.createForm.nameRequired": "Name is required.",
"roster.createSuccess": "Agent created.",
"roster.description": "Agents saved to this workspace are listed here. Create, search, edit, and archive roster agents from one place.",
"roster.editAgent": "Редагувати {{name}}",
"roster.filters.all": "All 4",
"roster.filters.drafts": "Drafts",
"roster.filters.inUse": "In use",
"roster.gridView": "Grid view",
"roster.invite": "Invite",
"roster.inviteAgent": "Запросити {{name}}",
"roster.editDialog.description": "Update the roster name and description for this agent.",
"roster.editDialog.title": "Edit agent",
"roster.empty": "No agents yet",
"roster.emptyDescription": "Agents saved to this workspace will appear here.",
"roster.emptySearch": "No matching agents",
"roster.emptySearchDescription": "Try another agent name.",
"roster.learnMore": "Learn more",
"roster.listView": "List view",
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
"roster.moreActions": "Додаткові дії для {{name}}",
"roster.loadMore": "Load more",
"roster.loadingError": "Failed to load agents. Refresh and try again.",
"roster.searchLabel": "Search agents",
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
"roster.sidebar.agents": "Agents",
"roster.sidebar.humans": "Humans",
"roster.sidebarLabel": "Roster sections",
"roster.soon": "Soon",
"roster.searchPlaceholder": "Search agents by name…",
"roster.sources.agent_app": "Agent app",
"roster.sources.imported": "Imported",
"roster.sources.system": "System",
"roster.sources.workflow": "Workflow",
"roster.status.active": "Active",
"roster.status.archived": "Archived",
"roster.title": "Agent Roster",
"roster.unused": "Unused",
"roster.updated": "updated {{time}} ago",
"roster.usedInWorkflows": "Used in {{count}} workflows"
"roster.updateFailed": "Failed to update agent. Check the fields and try again.",
"roster.updateSuccess": "Agent updated."
}

View File

@ -25,13 +25,8 @@
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
"agentDetail.monitoring.timeRangeLabel": "Time range",
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
@ -50,29 +45,43 @@
"agentDetail.subtitle": "ID tác nhân: {{agentId}}",
"agentDetail.title": "Tác nhân",
"agentDetail.type": "TÁC NHÂN",
"roster.connectOwnAgent": "Connect to Your Own Agent",
"roster.agentCount": "{{count}} agents",
"roster.archive": "Archive",
"roster.archiveAgent": "Archive {{name}}",
"roster.archiveDialog.description": "This agent will be removed from the active roster list.",
"roster.archiveDialog.title": "Archive {{name}}?",
"roster.archiveFailed": "Failed to archive agent.",
"roster.archiveSuccess": "Agent archived.",
"roster.createAgent": "Create agent",
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
"roster.draft": "Draft",
"roster.createDialog.description": "Create a reusable agent in this workspace roster.",
"roster.createDialog.title": "Create agent",
"roster.createFailed": "Failed to create agent.",
"roster.createForm.descriptionLabel": "Description",
"roster.createForm.descriptionPlaceholder": "Describe what this agent does…",
"roster.createForm.nameLabel": "Name",
"roster.createForm.namePlaceholder": "Enter agent name…",
"roster.createForm.nameRequired": "Name is required.",
"roster.createSuccess": "Agent created.",
"roster.description": "Agents saved to this workspace are listed here. Create, search, edit, and archive roster agents from one place.",
"roster.editAgent": "Chỉnh sửa {{name}}",
"roster.filters.all": "All 4",
"roster.filters.drafts": "Drafts",
"roster.filters.inUse": "In use",
"roster.gridView": "Grid view",
"roster.invite": "Invite",
"roster.inviteAgent": "Mời {{name}}",
"roster.editDialog.description": "Update the roster name and description for this agent.",
"roster.editDialog.title": "Edit agent",
"roster.empty": "No agents yet",
"roster.emptyDescription": "Agents saved to this workspace will appear here.",
"roster.emptySearch": "No matching agents",
"roster.emptySearchDescription": "Try another agent name.",
"roster.learnMore": "Learn more",
"roster.listView": "List view",
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
"roster.moreActions": "Thao tác khác cho {{name}}",
"roster.loadMore": "Load more",
"roster.loadingError": "Failed to load agents. Refresh and try again.",
"roster.searchLabel": "Search agents",
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
"roster.sidebar.agents": "Agents",
"roster.sidebar.humans": "Humans",
"roster.sidebarLabel": "Roster sections",
"roster.soon": "Soon",
"roster.searchPlaceholder": "Search agents by name…",
"roster.sources.agent_app": "Agent app",
"roster.sources.imported": "Imported",
"roster.sources.system": "System",
"roster.sources.workflow": "Workflow",
"roster.status.active": "Active",
"roster.status.archived": "Archived",
"roster.title": "Agent Roster",
"roster.unused": "Unused",
"roster.updated": "updated {{time}} ago",
"roster.usedInWorkflows": "Used in {{count}} workflows"
"roster.updateFailed": "Failed to update agent. Check the fields and try again.",
"roster.updateSuccess": "Agent updated."
}

View File

@ -96,29 +96,43 @@
"agentDetail.subtitle": "智能体 ID{{agentId}}",
"agentDetail.title": "智能体",
"agentDetail.type": "智能体",
"roster.connectOwnAgent": "连接你自己的智能体",
"roster.agentCount": "{{count}} 个智能体",
"roster.archive": "归档",
"roster.archiveAgent": "归档 {{name}}",
"roster.archiveDialog.description": "此智能体将从当前活跃 Roster 列表中移除。",
"roster.archiveDialog.title": "归档 {{name}}",
"roster.archiveFailed": "智能体归档失败。",
"roster.archiveSuccess": "智能体已归档。",
"roster.createAgent": "创建智能体",
"roster.description": "保存在此工作区的可复用智能体。可拖到任意画布或挂到工作流节点。编辑一次,所有使用该智能体的工作流都会同步更新。",
"roster.draft": "草稿",
"roster.createDialog.description": "在当前工作区 Roster 中创建一个可复用智能体。",
"roster.createDialog.title": "创建智能体",
"roster.createFailed": "智能体创建失败。",
"roster.createForm.descriptionLabel": "描述",
"roster.createForm.descriptionPlaceholder": "描述这个智能体的用途…",
"roster.createForm.nameLabel": "名称",
"roster.createForm.namePlaceholder": "输入智能体名称…",
"roster.createForm.nameRequired": "请输入名称。",
"roster.createSuccess": "智能体已创建。",
"roster.description": "这里列出保存在当前工作区的智能体。你可以在一个地方创建、搜索、编辑和归档 Roster 智能体。",
"roster.editAgent": "编辑 {{name}}",
"roster.filters.all": "全部 4",
"roster.filters.drafts": "草稿",
"roster.filters.inUse": "使用中",
"roster.gridView": "网格视图",
"roster.invite": "邀请",
"roster.inviteAgent": "邀请 {{name}}",
"roster.editDialog.description": "更新此智能体在 Roster 中的名称和描述。",
"roster.editDialog.title": "编辑智能体",
"roster.empty": "暂无智能体",
"roster.emptyDescription": "保存在此工作区的智能体会显示在这里。",
"roster.emptySearch": "没有匹配的智能体",
"roster.emptySearchDescription": "请尝试其他智能体名称。",
"roster.learnMore": "了解更多",
"roster.listView": "列表视图",
"roster.marketplaceCta": "在 Marketplace 发现现成智能体",
"roster.moreActions": "{{name}} 的更多操作",
"roster.loadMore": "加载更多",
"roster.loadingError": "智能体加载失败。请刷新后重试。",
"roster.searchLabel": "搜索智能体",
"roster.searchPlaceholder": "按名称、角色或技能搜索智能体…",
"roster.sidebar.agents": "智能体",
"roster.sidebar.humans": "成员",
"roster.sidebarLabel": "Roster 分区",
"roster.soon": "即将推出",
"roster.searchPlaceholder": "按名称搜索智能体…",
"roster.sources.agent_app": "智能体应用",
"roster.sources.imported": "导入",
"roster.sources.system": "系统",
"roster.sources.workflow": "工作流",
"roster.status.active": "活跃",
"roster.status.archived": "已归档",
"roster.title": "Agent Roster",
"roster.unused": "未使用",
"roster.updated": "{{time}} 前更新",
"roster.usedInWorkflows": "用于 {{count}} 个工作流"
"roster.updateFailed": "智能体更新失败。请检查字段后重试。",
"roster.updateSuccess": "智能体已更新"
}

View File

@ -25,13 +25,8 @@
"agentDetail.monitoring.description": "追蹤可複用智慧體在工作流中的活躍度、成本和互動品質。",
"agentDetail.monitoring.metrics.activeUsers.explanation": "觸發過使用此智慧體的工作流的獨立終端使用者數。",
"agentDetail.monitoring.metrics.activeUsers.title": "活躍使用者",
"agentDetail.monitoring.metrics.avgInteractions.explanation": "每次執行平均完成的智慧體步驟數。",
"agentDetail.monitoring.metrics.avgInteractions.title": "平均互動次數",
"agentDetail.monitoring.metrics.avgInteractions.unit": "步",
"agentDetail.monitoring.metrics.tokenUsage.explanation": "此智慧體在工作流執行中產生的預估 token 成本。",
"agentDetail.monitoring.metrics.tokenUsage.title": "Token 用量",
"agentDetail.monitoring.metrics.totalRuns.explanation": "呼叫此智慧體的工作流執行總數。",
"agentDetail.monitoring.metrics.totalRuns.title": "總執行次數",
"agentDetail.monitoring.timeRangeLabel": "時間範圍",
"agentDetail.monitoring.timeRanges.last30days": "最近 30 天",
"agentDetail.monitoring.timeRanges.last7days": "最近 7 天",
@ -50,29 +45,43 @@
"agentDetail.subtitle": "智慧體 ID{{agentId}}",
"agentDetail.title": "智慧體",
"agentDetail.type": "智慧體",
"roster.connectOwnAgent": "連接你自己的智能體",
"roster.agentCount": "{{count}} 個智能體",
"roster.archive": "封存",
"roster.archiveAgent": "封存 {{name}}",
"roster.archiveDialog.description": "此智能體將從目前活躍 Roster 清單中移除。",
"roster.archiveDialog.title": "封存 {{name}}",
"roster.archiveFailed": "智能體封存失敗。",
"roster.archiveSuccess": "智能體已封存。",
"roster.createAgent": "建立智能體",
"roster.description": "儲存在此工作區的可複用智能體。可拖到任意畫布或掛到工作流節點。編輯一次,所有使用該智能體的工作流都會同步更新。",
"roster.draft": "草稿",
"roster.createDialog.description": "在目前工作區 Roster 中建立一個可複用智能體。",
"roster.createDialog.title": "建立智能體",
"roster.createFailed": "智能體建立失敗。",
"roster.createForm.descriptionLabel": "描述",
"roster.createForm.descriptionPlaceholder": "描述這個智能體的用途…",
"roster.createForm.nameLabel": "名稱",
"roster.createForm.namePlaceholder": "輸入智能體名稱…",
"roster.createForm.nameRequired": "請輸入名稱。",
"roster.createSuccess": "智能體已建立。",
"roster.description": "這裡列出保存在目前工作區的智能體。你可以在一個地方建立、搜尋、編輯和封存 Roster 智能體。",
"roster.editAgent": "編輯 {{name}}",
"roster.filters.all": "全部 4",
"roster.filters.drafts": "草稿",
"roster.filters.inUse": "使用中",
"roster.gridView": "網格視圖",
"roster.invite": "邀請",
"roster.inviteAgent": "邀請 {{name}}",
"roster.editDialog.description": "更新此智能體在 Roster 中的名稱和描述。",
"roster.editDialog.title": "編輯智能體",
"roster.empty": "No agents yet",
"roster.emptyDescription": "Agents saved to this workspace will appear here.",
"roster.emptySearch": "No matching agents",
"roster.emptySearchDescription": "Try another agent name.",
"roster.learnMore": "瞭解更多",
"roster.listView": "列表視圖",
"roster.marketplaceCta": "在 Marketplace 探索現成智能體",
"roster.moreActions": "{{name}} 的更多操作",
"roster.loadMore": "載入更多",
"roster.loadingError": "智能體載入失敗。請重新整理後重試。",
"roster.searchLabel": "搜尋智能體",
"roster.searchPlaceholder": "按名稱、角色或技能搜尋智能體…",
"roster.sidebar.agents": "智能體",
"roster.sidebar.humans": "成員",
"roster.sidebarLabel": "Roster 分區",
"roster.soon": "即將推出",
"roster.searchPlaceholder": "按名稱搜尋智能體…",
"roster.sources.agent_app": "Agent app",
"roster.sources.imported": "Imported",
"roster.sources.system": "System",
"roster.sources.workflow": "Workflow",
"roster.status.active": "Active",
"roster.status.archived": "Archived",
"roster.title": "Agent Roster",
"roster.unused": "未使用",
"roster.updated": "{{time}} 前更新",
"roster.usedInWorkflows": "用於 {{count}} 個工作流"
"roster.updateFailed": "智能體更新失敗。請檢查欄位後重試。",
"roster.updateSuccess": "智能體已更新"
}

View File

@ -1,6 +1,8 @@
import type { AgentRosterListResponse } from '@dify/contracts/api/console/agents/types.gen'
import type { ApiBasedExtensionResponse } from '@dify/contracts/api/console/api-based-extension/types.gen'
import type { ContractRouterClient } from '@orpc/contract'
import type { JsonifiedClient } from '@orpc/openapi-client'
import type { InfiniteData } from '@tanstack/react-query'
import type { Tag } from '@/contract/console/tags'
import { createORPCClient, onError } from '@orpc/client'
import { OpenAPILink } from '@orpc/openapi-client/fetch'
@ -16,6 +18,7 @@ import {
marketplaceRouterContract,
} from '@/contract/router'
import { isClient } from '@/utils/client'
// eslint-disable-next-line no-restricted-imports
import { request } from './base'
const getMarketplaceHeaders = () => new Headers({
@ -90,6 +93,115 @@ export const consoleClient: JsonifiedClient<ContractRouterClient<typeof consoleR
export const consoleQuery = createTanstackQueryUtils(consoleClient, {
path: ['console'],
experimental_defaults: {
agents: {
post: {
mutationOptions: {
onSuccess: (_createdAgent, _variables, _onMutateResult, context) => {
context.client.invalidateQueries({
queryKey: consoleQuery.agents.get.key(),
})
},
},
},
byAgentId: {
patch: {
mutationOptions: {
onSuccess: (updatedAgent, variables, _onMutateResult, context) => {
context.client.setQueriesData(
{
queryKey: consoleQuery.agents.get.key({ type: 'query' }),
},
(oldList: AgentRosterListResponse | undefined) => {
if (!oldList?.data.some(item => item.id === updatedAgent.id))
return oldList
return {
...oldList,
data: oldList.data.map(item => item.id === updatedAgent.id ? updatedAgent : item),
}
},
)
context.client.setQueriesData(
{
queryKey: consoleQuery.agents.get.key({ type: 'infinite' }),
},
(oldList: InfiniteData<AgentRosterListResponse, unknown> | undefined) => {
if (!oldList?.pages.some(page => page.data.some(item => item.id === updatedAgent.id)))
return oldList
return {
...oldList,
pages: oldList.pages.map(page => ({
...page,
data: page.data.map(item => item.id === updatedAgent.id ? updatedAgent : item),
})),
}
},
)
context.client.setQueryData(
consoleQuery.agents.byAgentId.get.queryKey({
input: {
params: {
agent_id: variables.params.agent_id,
},
},
}),
updatedAgent,
)
},
},
},
delete: {
mutationOptions: {
onSuccess: (_data, variables, _onMutateResult, context) => {
const agentListQueryKey = consoleQuery.agents.get.key()
context.client.setQueriesData(
{
queryKey: consoleQuery.agents.get.key({ type: 'query' }),
},
(oldList: AgentRosterListResponse | undefined) => {
if (!oldList?.data.some(item => item.id === variables.params.agent_id))
return oldList
return {
...oldList,
data: oldList.data.filter(item => item.id !== variables.params.agent_id),
total: Math.max(0, oldList.total - 1),
}
},
)
context.client.setQueriesData(
{
queryKey: consoleQuery.agents.get.key({ type: 'infinite' }),
},
(oldList: InfiniteData<AgentRosterListResponse, unknown> | undefined) => {
if (!oldList?.pages.some(page => page.data.some(item => item.id === variables.params.agent_id)))
return oldList
return {
...oldList,
pages: oldList.pages.map((page) => {
const total = Math.max(0, page.total - 1)
return {
...page,
data: page.data.filter(item => item.id !== variables.params.agent_id),
has_more: page.page * page.limit < total,
total,
}
}),
}
},
)
context.client.invalidateQueries({
queryKey: agentListQueryKey,
})
},
},
},
},
},
apiBasedExtension: {
post: {
mutationOptions: {