fix(mcp): включить проверяемый контроллер маршрутизации

This commit is contained in:
Denozordec committed 2026-11-05 05:36:19 +07:00
1 parent 6569dbfc60
commit 1f0704add0
25 files changed
+1041 -291

No files matched your search

+2 -7
View File
@@ -6,7 +6,7 @@ import { useTable, type ColumnDef } from "@tanstack/react-table"
import { BotIcon, CopyIcon, PlusIcon, RefreshCwIcon, ShieldIcon, StopCircleIcon } from "lucide-react"
import { toast } from "sonner"
import { mcpConnectionCreateSchema, type McpConnection, type McpOperationDescriptor } from "@mmapp/contracts/mcp"
import { routeAiProfileSchema, type RouteAiProfile } from "@mmapp/contracts/mcp-routing"
import { routeAiControllerBlockReason, routeAiProfileSchema, type RouteAiProfile } from "@mmapp/contracts/mcp-routing"
import { useDataSource } from "@/lib/data-source"
import { can, getClaims, hasPermission } from "@/lib/auth"
import { DATA_GRID_LABELS_RU } from "@/lib/data-grid-labels-ru"
@@ -164,18 +164,13 @@ function RoutingProfileForm({ api, editing, close }: { api: McpApi; editing?: Re
const [probeVrf, setProbeVrf] = useState(original?.probeVrf ?? "main")
const [bindBgp, setBindBgp] = useState(!!original?.bgpContext)
const [bgp, setBgp] = useState(original?.bgpContext ?? { connectionId: "", instance: "", inputChain: "", vrf: "main" })
const executionReason = table.trim() !== "main" || probeVrf.trim() !== "main"
? "Автоматическое переключение для отдельной таблицы маршрутов или VRF проб пока недоступно."
: bindBgp && (bgp.inputChain.trim() !== "bgp-in" || bgp.vrf.trim() !== "main")
? "Автоматическое переключение для этой входящей цепочки BGP или транспортной VRF пока недоступно."
: ""
const [enabled, setEnabled] = useState(editing?.enabled === true), [expires, setExpires] = useState(() => new Date(Date.now() + 1800000).toISOString().slice(0, 16))
const [autoRecovery, setAutoRecovery] = useState(original?.autoRecovery ?? false)
const controllerReason = autoRecovery ? "Автовосстановление Community пока недоступно. Отключите его для активации контроллера." : executionReason
const [weights, setWeights] = useState(original?.weights ?? { ping: 60, speed: 30, loss: 10 }), [threshold, setThreshold] = useState(original?.switchThreshold ?? 15), [cooldown, setCooldown] = useState(original?.cooldownSec ?? 600)
const [pin, setPin] = useState(original?.pinnedCandidateId ?? ""), [excluded, setExcluded] = useState<string[]>(original?.excludedCandidateIds ?? [])
const [sla, setSla] = useState({ ping: original?.maxPingMs?.toString() ?? "", loss: original?.maxLossPct?.toString() ?? "", speed: original?.minBandwidthMbps?.toString() ?? "" })
const [candidates, setCandidates] = useState<CandidateForm[]>(() => original?.candidates.map(candidate => ({ ...candidate, jumpHostId: String(candidate.jumpHostId), exitNodeId: String(candidate.exitNodeId) })) ?? [{ id: "path-1", wanInterface: "", jumpHostId: "", exitNodeId: "", downstreamInterface: "", gateway: "", gatewayRef: { resource: "gre" as "gre" | "ipv4_route" | "ipv6_route", id: "" }, wanRemoteInterface: "", downstreamRemoteInterface: "" }])
const controllerReason = routeAiControllerBlockReason({ table, probeVrf, bgpContext: bindBgp ? bgp : undefined, autoRecovery, candidates })
const [error, setError] = useState(""), [busy, setBusy] = useState(false), [plan, setPlan] = useState("")
const save = async () => {
setBusy(true); setError("")