后端没修完版

This commit is contained in:
Typer_Body
2026-05-05 15:08:04 +08:00
parent a8fba46040
commit e7c9bc69d3
156 changed files with 34633 additions and 2149 deletions
@@ -16,7 +16,7 @@ import { httpClient } from '@/app/infra/http/HttpClient';
import { Bot } from '@/app/infra/entities/api';
import { getAdapterDocUrl } from '@/app/infra/entities/adapter-docs';
import { ExternalLink } from 'lucide-react';
import RoutingRulesEditor from './RoutingRulesEditor';
import { UnifiedBindingSelector } from '@/app/home/components/unified-binding-selector';
import { zodResolver } from '@hookform/resolvers/zod';
import { useForm } from 'react-hook-form';
@@ -43,6 +43,7 @@ import {
SelectTrigger,
SelectValue,
} from '@/components/ui/select';
// SelectGroup used in adapter selector
import {
Card,
CardContent,
@@ -64,29 +65,11 @@ const getFormSchema = (t: (key: string) => string) =>
adapter: z.string().min(1, { message: t('bots.adapterRequired') }),
adapter_config: z.record(z.string(), z.any()),
enable: z.boolean().optional(),
// New unified binding fields
binding_type: z.enum(['pipeline', 'workflow']).optional(),
binding_uuid: z.string().optional(),
// Legacy fields (kept for backward compatibility, but not used in UI)
use_pipeline_uuid: z.string().optional(),
pipeline_routing_rules: z
.array(
z.object({
type: z.enum([
'launcher_type',
'launcher_id',
'message_content',
'message_has_element',
]),
operator: z.enum([
'eq',
'neq',
'contains',
'not_contains',
'starts_with',
'regex',
]),
value: z.string(),
pipeline_uuid: z.string(),
}),
)
.optional(),
});
export default function BotForm({
@@ -111,8 +94,9 @@ export default function BotForm({
adapter: '',
adapter_config: {},
enable: true,
binding_type: 'pipeline',
binding_uuid: '',
use_pipeline_uuid: '',
pipeline_routing_rules: [],
},
});
@@ -178,8 +162,9 @@ export default function BotForm({
adapter: val.adapter,
adapter_config: val.adapter_config,
enable: val.enable,
binding_type: val.binding_type || 'pipeline',
binding_uuid: val.binding_uuid || val.use_pipeline_uuid || '',
use_pipeline_uuid: val.use_pipeline_uuid || '',
pipeline_routing_rules: val.pipeline_routing_rules || [],
});
handleAdapterSelect(val.adapter);
@@ -294,8 +279,9 @@ export default function BotForm({
name: bot.name,
adapter_config: bot.adapter_config,
enable: bot.enable ?? true,
binding_type: bot.binding_type ?? 'pipeline',
binding_uuid: bot.binding_uuid ?? bot.use_pipeline_uuid ?? '',
use_pipeline_uuid: bot.use_pipeline_uuid ?? '',
pipeline_routing_rules: bot.pipeline_routing_rules ?? [],
webhook_full_url: runtimeValues?.webhook_full_url as
| string
| undefined,
@@ -332,15 +318,21 @@ export default function BotForm({
function onDynamicFormSubmit() {
setIsLoading(true);
if (initBotId) {
const formValues = form.getValues();
const updateBot: Bot = {
uuid: initBotId,
name: form.getValues().name,
description: form.getValues().description ?? '',
adapter: form.getValues().adapter,
adapter_config: form.getValues().adapter_config,
enable: form.getValues().enable,
use_pipeline_uuid: form.getValues().use_pipeline_uuid,
pipeline_routing_rules: form.getValues().pipeline_routing_rules ?? [],
name: formValues.name,
description: formValues.description ?? '',
adapter: formValues.adapter,
adapter_config: formValues.adapter_config,
enable: formValues.enable,
binding_type: formValues.binding_type ?? 'pipeline',
binding_uuid: formValues.binding_uuid ?? '',
// Sync use_pipeline_uuid for backward compatibility when binding_type is 'pipeline'
use_pipeline_uuid:
formValues.binding_type === 'pipeline'
? formValues.binding_uuid
: formValues.use_pipeline_uuid,
};
httpClient
.updateBot(initBotId, updateBot)
@@ -429,74 +421,40 @@ export default function BotForm({
</CardContent>
</Card>
{/* Card 2: Pipeline Binding (edit mode only) */}
{/* Card 2: Unified Binding (edit mode only) */}
{initBotId && (
<Card>
<CardHeader>
<CardTitle>{t('bots.routingConnection')}</CardTitle>
<CardTitle>{t('bots.bindTarget')}</CardTitle>
<CardDescription>
{t('bots.routingConnectionDescription')}
{t('bots.bindTargetDescription')}
</CardDescription>
</CardHeader>
<CardContent>
<FormField
control={form.control}
name="use_pipeline_uuid"
name="binding_uuid"
render={({ field }) => (
<FormItem>
<FormLabel>{t('bots.bindPipeline')}</FormLabel>
<FormControl>
<Select onValueChange={field.onChange} {...field}>
<SelectTrigger>
{field.value ? (
(() => {
const pipeline = pipelineNameList.find(
(p) => p.value === field.value,
);
return (
<div className="flex items-center gap-2">
{pipeline?.emoji && (
<span className="text-sm shrink-0">
{pipeline.emoji}
</span>
)}
<span>{pipeline?.label ?? field.value}</span>
</div>
);
})()
) : (
<SelectValue
placeholder={t('bots.selectPipeline')}
/>
)}
</SelectTrigger>
<SelectContent>
<SelectGroup>
{pipelineNameList.map((item) => (
<SelectItem key={item.value} value={item.value}>
<div className="flex items-center gap-2">
{item.emoji && (
<span className="text-sm shrink-0">
{item.emoji}
</span>
)}
<span>{item.label}</span>
</div>
</SelectItem>
))}
</SelectGroup>
</SelectContent>
</Select>
<UnifiedBindingSelector
value={{
type: form.watch('binding_type') ?? 'pipeline',
id: field.value ?? null,
}}
onChange={(val) => {
form.setValue('binding_type', val.type, {
shouldDirty: true,
});
form.setValue('binding_uuid', val.id ?? '', {
shouldDirty: true,
});
}}
/>
</FormControl>
</FormItem>
)}
/>
{/* Pipeline Routing Rules */}
<RoutingRulesEditor
form={form}
pipelineNameList={pipelineNameList}
/>
</CardContent>
</Card>
)}