2.92.12
(fix): README generation in self-hosted GitHub mode can clone a private repository with a personal
access token again. Upgrades @fern-api/generator-cli to 0.12.1, which also sends the token as an
Authorization header. Before this, git in the generator image (libcurl 8.23+) dropped the token
from the clone URL and failed with could not read Username.
2.92.11
(fix): XML (TwiML) serialization writes empty elements with an explicit close tag (<Hangup></Hangup>) instead of a
self-closing <Hangup />, matching the legacy twilio-csharp output byte for byte.
2.92.10
(fix): The generator image keeps Alpine 3.22’s libcurl (< 8.23). curl 8.23.0 strips credentials from the
effective URL it reports, which made git treat every authenticated https clone as a redirect and drop
the token, so README generation and GitHub output for private repositories failed inside the
container with “could not read Username for ‘https://github.com‘“.
2.92.9
(fix): XML (TwiML) types match the legacy call shapes: when an element’s text property has the same name as
one of its child elements, the child builder keeps the name (message.Body("hi") adds a <Body> child,
dial.Number("+1…") a <Number>) and the text property is renamed to Text; every element with text
content gets a new Say("hi") constructor next to the parameterless one; child builders whose text is a
format: uri string accept a System.Uri (Redirect(new Uri("/voice", UriKind.Relative))).
2.92.8
(fix): Fix WebhooksHelper.VerifyRequest failing to compile on net462/netstandard2.0
(CS1503: cannot convert from 'string' to 'char') when webhook-signature.algorithm-header
uses key-id-parameter/algorithm-parameter: the settings header is now split with
Split(new[] { "," }, StringSplitOptions.None) instead of the Split(string) overload that
only exists on newer target frameworks.
2.92.7
(fix): C# dynamic snippets now keep nullable list and set item types (e.g. List<MyEnum?> for a multi-value query parameter typed optional<nullable<MyEnum>>), matching the SDK’s IEnumerable<MyEnum?> property type instead of failing with CS0266.
2.92.6
(fix): XML (TwiML) ToXml() drops characters outside the XML 1.0 Char production (e.g. \u0001) from text, attributes and comments instead of throwing ArgumentException.
2.92.5
(fix): XML (TwiML) fluent child builders now take the element’s text content as the first parameter, before
attributes, so legacy-style calls such as response.Say("hi") and response.Dial("+15551234567")
compile and set the content instead of an attribute. ToXml(xmlDeclaration, indent) adds an indented
output option.
2.92.4
(fix): Escape form-urlencoded example keys and values when generating C# mock-server tests. Examples
containing quotes, backslashes, or control characters now produce valid C# string literals
instead of causing the formatter to fail with syntax errors.
2.92.3
(fix): WebhooksHelper.verifyRequest now parses name=value settings headers when
webhook-signature.algorithm-header sets key-id-parameter/algorithm-parameter
(e.g. Twilio’s X-Twilio-Webhooks-Signature-Settings: key=<id>,algorithm=HMAC_SHA256),
so the key resolver receives the bare key ID instead of key=<id>. Requires IR 67.33.0.
2.92.2
(fix): The generated WebhooksHelper now consumes algorithm-header from api.settings.webhook-signature:
a request-level verifyRequest helper reads the configured signature header first (missing or empty
fails early with “could not run: missing signature header”), then the algorithm-selection header
(e.g. X-Twilio-Webhook-Signature-Settings: <key_id>;HMAC_SHA256) to pick the HMAC algorithm from
the configured wire values and hand the key ID to an application-supplied secret resolver. When the
header is absent the configured default algorithm and the plain secret are used, so legacy
auth-token flows keep working. The lower-level verifySignature is unchanged and still returns
false without throwing.
2.92.1
(fix): reference.md is now generated for every output mode, matching the Go and Python generators. It was
previously skipped unless the CLI passed a snippet path (local-file-system output without
snippets: path: in generators.yml). README.md is unchanged and still requires snippets.
2.92.0
(feat): XML (TwiML) types can now carry XML comments. Comment(text) adds <!--text--> inside the element at its
position in the ordered content (interleaved with AddText segments and child elements), while
CommentBefore(text) / CommentAfter(text) render a comment immediately before or after the element
itself (as a sibling in its parent, or around the root element after the XML declaration). Comments in
parsed documents are preserved by FromXml and round-trip through ToXml; XmlElement.AddComment and
the new XmlComment runtime type expose the same for untyped elements.
2.91.0
(feat): Generate a unit test file per XML-encoded (TwiML) type alongside the models, covering
fromXml/toXml round trips, escaping, unknown attributes/children, open enum passthrough,
child ordering, and rejection of malformed XML, wrong root elements and DOCTYPE declarations.
2.90.1
(fix): XML (TwiML) record types implement value equality: Equals/GetHashCode (and ==) compare the
rendered XML, so VoiceResponse.FromXml(xml).Equals(VoiceResponse.FromXml(parsed.ToXml())) and
new Say { Message = "x" }.Equals(new Say { Message = "x" }) are true. Previously the record
default compared the collection members by reference and was always false.
2.90.0
(feat): Add opt-in user-agent-only config. When enabled, generated clients send the User-Agent
header (including the structured form from include-platform-headers) but omit the
X-Fern-Language, X-Fern-SDK-Name, and X-Fern-SDK-Version headers. Disabled by default,
so existing generated output is unchanged. omit-fern-headers still takes precedence and drops
the User-Agent too.
2.89.0
(feat): The generated WebhooksHelper HMAC verifier now accepts a per-call algorithm override via an optional algorithm parameter on verifySignature,
one of sha1, sha256, sha384 or sha512. When omitted, the algorithm configured in
webhook-signature is used, so existing callers are unchanged. This lets one endpoint verify both
legacy HMAC-SHA1 (auth-token) and HMAC-SHA256 (shared-key) signed webhooks.
The verifier also logs a warning distinguishing an early failure (missing signature header) from a
failed verification (signature mismatch); it still returns false and never throws.
2.88.0
(feat): XML (TwiML) types keep text segments, typed child elements and raw XmlElement children in a
single ordered Content list, so ToXml() emits them in the order they were added
(Response.Say(a).AddChild(custom).Say(b) yields <Say>a</Say><Custom /><Say>b</Say>) and
FromXml() preserves document order, including the position of unknown elements and repeated
wrapper elements. Adds AddText(string) to XML types and XmlElement for mixed content such as
<Say>Hi <break strength="weak" /> world</Say>. Typed child properties and AdditionalChildren
remain available; AdditionalChildren is now derived from Content.
2.87.0
(feat): Support SDK variables (variables in api.yml / x-fern-sdk-variables in OpenAPI). Path
parameters bound to a variable via x-fern-sdk-variable are removed from endpoint
signatures and request types and are configured once on the client through the generated
ClientOptions.<Variable> property. String variables that declare an env fall back to that
environment variable, and a variable that is still unset fails with a clear
ArgumentException before the request is sent.
2.86.3
(fix): XML-encoded (TwiML) types now return their XML representation from
ToString() instead of JSON, and ToXml() prepends the
<?xml version="1.0" encoding="utf-8"?> declaration by default.
Pass ToXml(xmlDeclaration: false) to omit it.