mirror of
https://github.com/langgenius/dify.git
synced 2026-06-16 21:06:20 +08:00
feat(agent-v2): connect roster to generated contracts
This commit is contained in:
@ -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)
|
||||
})
|
||||
})
|
||||
@ -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()
|
||||
})
|
||||
})
|
||||
@ -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')
|
||||
})
|
||||
})
|
||||
@ -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')
|
||||
})
|
||||
})
|
||||
@ -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')
|
||||
})
|
||||
})
|
||||
163
web/features/agent-v2/roster/components/agent-roster-list.tsx
Normal file
163
web/features/agent-v2/roster/components/agent-roster-list.tsx
Normal 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>
|
||||
)
|
||||
}
|
||||
@ -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>
|
||||
)
|
||||
}
|
||||
103
web/features/agent-v2/roster/components/create-agent-dialog.tsx
Normal file
103
web/features/agent-v2/roster/components/create-agent-dialog.tsx
Normal 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>
|
||||
)
|
||||
}
|
||||
123
web/features/agent-v2/roster/components/edit-agent-dialog.tsx
Normal file
123
web/features/agent-v2/roster/components/edit-agent-dialog.tsx
Normal 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>
|
||||
)
|
||||
}
|
||||
38
web/features/agent-v2/roster/components/roster-toolbar.tsx
Normal file
38
web/features/agent-v2/roster/components/roster-toolbar.tsx
Normal 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>
|
||||
)
|
||||
}
|
||||
@ -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>
|
||||
)
|
||||
}
|
||||
|
||||
@ -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."
|
||||
}
|
||||
|
||||
@ -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."
|
||||
}
|
||||
|
||||
@ -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."
|
||||
}
|
||||
|
||||
@ -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."
|
||||
}
|
||||
|
||||
@ -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."
|
||||
}
|
||||
|
||||
@ -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 l’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": "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 d’actions 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."
|
||||
}
|
||||
|
||||
@ -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."
|
||||
}
|
||||
|
||||
@ -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."
|
||||
}
|
||||
|
||||
@ -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."
|
||||
}
|
||||
|
||||
@ -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."
|
||||
}
|
||||
|
||||
@ -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."
|
||||
}
|
||||
|
||||
@ -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."
|
||||
}
|
||||
|
||||
@ -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."
|
||||
}
|
||||
|
||||
@ -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."
|
||||
}
|
||||
|
||||
@ -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."
|
||||
}
|
||||
|
||||
@ -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."
|
||||
}
|
||||
|
||||
@ -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."
|
||||
}
|
||||
|
||||
@ -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."
|
||||
}
|
||||
|
||||
@ -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."
|
||||
}
|
||||
|
||||
@ -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."
|
||||
}
|
||||
|
||||
@ -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."
|
||||
}
|
||||
|
||||
@ -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": "智能体已更新。"
|
||||
}
|
||||
|
||||
@ -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": "智能體已更新。"
|
||||
}
|
||||
|
||||
@ -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: {
|
||||
|
||||
Reference in New Issue
Block a user