{"record":{"id":"5902041c83cbf3b9","repo":"alibaba/nacos","slug":"transport-must-contain-1-to-64-letters-digits-590204","errorCode":null,"errorMessage":"transport must contain 1 to 64 letters, digits, +, or -","messagePattern":"transport must contain 1 to 64 letters, digits, \\+, or -","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"console-ui-next/src/pages/newAgent/agent-console-model.ts","lineNumber":138,"sourceCode":"  const withoutTrailingCommas = value.replace(\n    /(\"(?:\\\\.|[^\"\\\\])*\")|,\\s*([}\\]])/g,\n    (match, quoted, closing) => quoted || closing || match,\n  );\n  return parseJson(withoutTrailingCommas, 'agentCard');\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n  return value !== null && !Array.isArray(value) && typeof value === 'object';\n}\n\nfunction optionalString(value: unknown): string | undefined {\n  return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nfunction validateTransport(value: string): string {\n  const transport = required(value, 'transport');\n  if (!/^[0-9A-Za-z+-]{1,64}$/.test(transport)) {\n    throw new Error('transport must contain 1 to 64 letters, digits, +, or -');\n  }\n  return transport;\n}\n\nfunction endpointKey(uri: string, transport: string): string {\n  let parsed: URL;\n  try {\n    parsed = new URL(uri);\n  } catch {\n    throw new Error(`Invalid Endpoint URI: ${uri}`);\n  }\n  if (!parsed.protocol || !parsed.hostname || parsed.username || parsed.password || parsed.hash) {\n    throw new Error(`Invalid Endpoint URI: ${uri}`);\n  }\n  let port = parsed.port;\n  if (!port) {\n    if (parsed.protocol === 'http:' || parsed.protocol === 'ws:') {\n      port = '80';","sourceCodeStart":120,"sourceCodeEnd":156,"githubUrl":"https://github.com/alibaba/nacos/blob/9b989acdf181d00898f2e8839257bb2b2a3cefe3/console-ui-next/src/pages/newAgent/agent-console-model.ts#L120-L156","documentation":"validateTransport requires the transport identifier to match `^[0-9A-Za-z+\\-]{1,64}$`: one to sixty-four characters of ASCII letters, digits, plus, or hyphen only. Throws when the value is empty (caught first by `required`), or contains spaces, underscores, slashes, or exceeds 64 chars.","triggerScenarios":"User enters a transport like 'GRPC + HTTP' (space), 'a2a/v2' (slash), 'streaming_rpc' (underscore), or a name longer than 64 characters. Common transports are 'GRPC', 'HTTP', 'A2A', 'WS'.","commonSituations":"User treats transport as a free-form label. Including a version suffix with a slash or dot. Copy-paste introducing a trailing newline or space.","solutions":["Use a short alphanumeric token, e.g. 'GRPC', 'HTTP', 'A2A', 'WSS'.","Encode versions without slashes/dots: 'A2A-V2' instead of 'A2A/V2'.","Trim the input and reject it client-side before submit with the same regex."],"exampleFix":"// before\ntransport = 'a2a/v2 streaming'\n\n// after\ntransport = 'A2A-V2'","handlingStrategy":"validation","validationCode":"const TRANSPORT_RE = /^[0-9A-Za-z+-]{1,64}$/;\nfunction checkTransport(v) { if (!TRANSPORT_RE.test(v)) throw new Error('transport format invalid'); }","typeGuard":"function isValidTransport(v: string): boolean {\n  return /^[0-9A-Za-z+-]{1,64}$/.test(v);\n}","tryCatchPattern":"try { validateTransport(t); } catch (e) {\n  if (/transport must contain/.test(e.message)) { toast.error('Use letters, digits, + or - only (max 64)'); }\n}","preventionTips":["Constrain input with a pattern attribute","Trim whitespace","Avoid slashes/underscores in transport names"],"tags":["validation","transport","regex","protocol"],"backgroundTag":null,"analyzedSha":"9b989acdf181d00898f2e8839257bb2b2a3cefe3","analyzedAt":"2026-08-14T07:17:31.569Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}