oxios 1.13.0

Oxios Agent OS — Agent Operating System powered by oxi-sdk
import { createFileRoute } from '@tanstack/react-router'
import { useState } from 'react'
import { useTranslation } from 'react-i18next'
import { BudgetManagement } from '@/components/budget/budget-management'
import { CostByModel } from '@/components/cost/cost-by-model'
import { CostByProject } from '@/components/cost/cost-by-project'
import { CostChart } from '@/components/cost/cost-chart'
import { CostSummaryCards } from '@/components/cost/cost-summary'
import { ProviderQuotaCards } from '@/components/cost/provider-quota-cards'
import { SpendLimitCard } from '@/components/cost/spend-limit-card'
import { RefreshButton } from '@/components/shared/refresh-button'
import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs'
import { useCostSummary } from '@/hooks/use-costs'
import type { CostPeriod } from '@/types/cost'

export const Route = createFileRoute('/budget')({ component: CostPage })

const PERIODS: CostPeriod[] = ['today', 'week', 'month', 'all']

function CostPage() {
  const { t } = useTranslation()
  const [period, setPeriod] = useState<CostPeriod>('month')
  const { refetch, isFetching } = useCostSummary(period)

  return (
    <div className="space-y-6">
      {/* Header */}
      <div className="flex items-center justify-between">
        <div>
          <h1 className="text-2xl font-bold">{t('cost.title')}</h1>
          <p className="text-sm text-muted-foreground">{t('cost.subtitle')}</p>
        </div>
        <div className="flex items-center gap-2">
          <RefreshButton onClick={() => refetch()} isFetching={isFetching} />
        </div>
      </div>

      {/* Spend limit + period selector */}
      <div className="grid gap-4 sm:grid-cols-2 lg:grid-cols-4">
        <SpendLimitCard />
        <div className="flex items-end sm:col-span-1 lg:col-span-3">
          <Tabs value={period} onValueChange={(v) => setPeriod(v as CostPeriod)} className="w-full">
            <TabsList>
              {PERIODS.map((p) => (
                <TabsTrigger key={p} value={p}>
                  {t(`cost.period.${p}`)}
                </TabsTrigger>
              ))}
            </TabsList>
          </Tabs>
        </div>
      </div>

      {/* Summary stat cards */}
      <CostSummaryCards period={period} />

      {/* Daily spend chart */}
      <CostChart days={30} />

      {/* Breakdowns */}
      <div className="grid gap-4 lg:grid-cols-2">
        <CostByModel period={period} />
        <CostByProject period={period} />
      </div>

      {/* Provider panel — all configured providers + quota data */}
      <ProviderQuotaCards />

      {/* Agent budget management — token/call rate limits */}
      <div className="space-y-2">
        <h2 className="text-lg font-semibold">{t('budget.title')}</h2>
        <BudgetManagement />
      </div>
    </div>
  )
}