From 543ec5f0502e6c9cb24e0837b72e6c4d82f15c4d Mon Sep 17 00:00:00 2001 From: Tam Nhu Tran Date: Wed, 25 Feb 2026 15:53:40 +0700 Subject: [PATCH] feat(ui): add target controls to cliproxy variants - add default target selectors in create/edit dialogs - include target in variant create/update payloads - display target badge column in variants table --- .../components/cliproxy/cliproxy-dialog.tsx | 29 +++++++++++++++++++ .../cliproxy/cliproxy-edit-dialog.tsx | 29 +++++++++++++++++++ ui/src/components/cliproxy/cliproxy-table.tsx | 9 ++++++ 3 files changed, 67 insertions(+) diff --git a/ui/src/components/cliproxy/cliproxy-dialog.tsx b/ui/src/components/cliproxy/cliproxy-dialog.tsx index 0642596a..879c5e07 100644 --- a/ui/src/components/cliproxy/cliproxy-dialog.tsx +++ b/ui/src/components/cliproxy/cliproxy-dialog.tsx @@ -26,6 +26,7 @@ const singleProviderSchema = z.object({ provider: z.enum(CLIPROXY_PROVIDERS, { message: 'Provider is required' }), model: z.string().optional(), account: z.string().optional(), + target: z.enum(['claude', 'droid']).default('claude'), }); const compositeSchema = z.object({ @@ -34,6 +35,7 @@ const compositeSchema = z.object({ .min(1, 'Name is required') .regex(/^[a-zA-Z][a-zA-Z0-9._-]*$/, 'Invalid variant name'), default_tier: z.enum(['opus', 'sonnet', 'haiku'], { message: 'Default tier is required' }), + target: z.enum(['claude', 'droid']).default('claude'), tiers: z.object({ opus: z.object({ provider: z.enum(CLIPROXY_PROVIDERS, { message: 'Provider is required' }), @@ -74,12 +76,14 @@ export function CliproxyDialog({ open, onClose }: CliproxyDialogProps) { const singleForm = useForm({ resolver: zodResolver(singleProviderSchema), + defaultValues: { target: 'claude' }, }); const compositeForm = useForm({ resolver: zodResolver(compositeSchema), defaultValues: { default_tier: 'opus', + target: 'claude', tiers: { opus: { provider: 'gemini', model: '' }, sonnet: { provider: 'gemini', model: '' }, @@ -107,6 +111,7 @@ export function CliproxyDialog({ open, onClose }: CliproxyDialogProps) { await createMutation.mutateAsync({ name: data.name, provider: data.tiers[data.default_tier].provider, + target: data.target, type: 'composite', default_tier: data.default_tier, tiers: data.tiers, @@ -200,6 +205,18 @@ export function CliproxyDialog({ open, onClose }: CliproxyDialogProps) { +
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+