oxios 1.23.2

Oxios Agent OS — Agent Operating System powered by oxi-sdk
import { createFileRoute, useNavigate } from '@tanstack/react-router'
import { Plus, Server, Terminal, Wrench } from 'lucide-react'
import { useState } from 'react'
import { useTranslation } from 'react-i18next'
import { AddServerDialog } from '@/components/mcp/add-server-dialog'
import { ServerList } from '@/components/mcp/server-list'
import { ToolList } from '@/components/mcp/tool-list'
import { ToolTester } from '@/components/mcp/tool-tester'
import { Button } from '@/components/ui/button'
import { Card, CardContent } from '@/components/ui/card'
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'

export const Route = createFileRoute('/mcp')({
  component: McpPage,
  validateSearch: (search: Record<string, unknown>) => ({
    tab: (search.tab as string) || undefined,
  }),
})

function McpPage() {
  const { t } = useTranslation()
  const [addDialogOpen, setAddDialogOpen] = useState(false)
  const navigate = useNavigate({ from: Route.id })
  const { tab: tabParam } = Route.useSearch()
  const tab = tabParam === 'tools' || tabParam === 'test' ? tabParam : 'servers'

  return (
    <div className="space-y-6">
      <div className="flex items-center justify-between">
        <div>
          <h1 className="text-2xl font-bold">{t('mcp.title')}</h1>
          <p className="text-muted-foreground">{t('mcp.subtitle')}</p>
        </div>
        {tab === 'servers' && (
          <Button onClick={() => setAddDialogOpen(true)}>
            <Plus className="h-4 w-4 mr-1" /> {t('mcp.addServer')}
          </Button>
        )}
      </div>

      <Tabs
        value={tab}
        onValueChange={(v) =>
          navigate({
            search: (prev) => ({ ...prev, tab: v === 'servers' ? undefined : v }),
            replace: true,
          })
        }
      >
        <TabsList>
          <TabsTrigger value="servers" className="flex items-center gap-1.5">
            <Server className="h-4 w-4" /> {t('mcp.servers')}
          </TabsTrigger>
          <TabsTrigger value="tools" className="flex items-center gap-1.5">
            <Wrench className="h-4 w-4" /> {t('mcp.tools')}
          </TabsTrigger>
          <TabsTrigger value="test" className="flex items-center gap-1.5">
            <Terminal className="h-4 w-4" /> {t('mcp.test')}
          </TabsTrigger>
        </TabsList>

        <TabsContent value="servers">
          <Card>
            <CardContent className="pt-6">
              <ServerList />
            </CardContent>
          </Card>
        </TabsContent>

        <TabsContent value="tools">
          <Card>
            <CardContent className="pt-6">
              <ToolList />
            </CardContent>
          </Card>
        </TabsContent>

        <TabsContent value="test">
          <Card>
            <CardContent className="pt-6">
              <ToolTester />
            </CardContent>
          </Card>
        </TabsContent>
      </Tabs>

      <AddServerDialog open={addDialogOpen} onOpenChange={setAddDialogOpen} />
    </div>
  )
}