@postman/sdk-config 0.6.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/README.md +1 -3
  2. package/dist/index.cjs +916 -765
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.d.cts +1 -1
  5. package/dist/index.d.ts +1 -1
  6. package/dist/index.js +916 -765
  7. package/dist/index.js.map +1 -1
  8. package/dist/sdk-config/index.cjs +678 -562
  9. package/dist/sdk-config/index.cjs.map +1 -1
  10. package/dist/sdk-config/index.d.cts +1 -1
  11. package/dist/sdk-config/index.d.ts +1 -1
  12. package/dist/sdk-config/index.js +678 -562
  13. package/dist/sdk-config/index.js.map +1 -1
  14. package/dist/sdk-config/v1/index.cjs +678 -562
  15. package/dist/sdk-config/v1/index.cjs.map +1 -1
  16. package/dist/sdk-config/v1/index.d.cts +74 -934
  17. package/dist/sdk-config/v1/index.d.ts +74 -934
  18. package/dist/sdk-config/v1/index.js +678 -562
  19. package/dist/sdk-config/v1/index.js.map +1 -1
  20. package/dist/sdk-config-ir/index.cjs +607 -537
  21. package/dist/sdk-config-ir/index.cjs.map +1 -1
  22. package/dist/sdk-config-ir/index.d.cts +1 -1
  23. package/dist/sdk-config-ir/index.d.ts +1 -1
  24. package/dist/sdk-config-ir/index.js +607 -537
  25. package/dist/sdk-config-ir/index.js.map +1 -1
  26. package/dist/sdk-config-ir/v1/index.cjs +607 -537
  27. package/dist/sdk-config-ir/v1/index.cjs.map +1 -1
  28. package/dist/sdk-config-ir/v1/index.d.cts +25 -7
  29. package/dist/sdk-config-ir/v1/index.d.ts +25 -7
  30. package/dist/sdk-config-ir/v1/index.js +607 -537
  31. package/dist/sdk-config-ir/v1/index.js.map +1 -1
  32. package/dist/{typescript-BruxA5zG.d.cts → typescript-Chge0X4f.d.cts} +8 -1
  33. package/dist/{typescript-BruxA5zG.d.ts → typescript-Chge0X4f.d.ts} +8 -1
  34. package/package.json +1 -1
  35. package/src/sdk-config/v1/README.md +15 -14
  36. package/src/sdk-config-ir/v1/README.md +4 -2
package/dist/index.js CHANGED
@@ -32,140 +32,152 @@ var hashAlgorithmSchema = z.enum(["sha1", "sha256", "sha384", "sha512"]);
32
32
  var encodingSchema = z.enum(["base64", "hex"]);
33
33
  var payloadComponentSchema = z.enum(["body", "timestamp", "notification-url", "message-id"]);
34
34
  var payloadFormatSchema = z.strictObject({
35
- components: z.array(payloadComponentSchema).min(1),
36
- delimiter: z.string().optional(),
35
+ components: z.array(payloadComponentSchema).min(1).describe("Payload components concatenated in declaration order before signing."),
36
+ delimiter: z.string().optional().describe("The delimiter inserted between payload components."),
37
37
  /**
38
38
  * Set when the body is a form-encoded parameter map that must be canonicalized before signing:
39
39
  * keys sorted, each key's values deduped and sorted, concatenated as key-value pairs.
40
40
  */
41
- bodySort: z.literal("alphabetical").optional()
41
+ bodySort: z.literal("alphabetical").optional().describe("Canonicalizes form body keys and values alphabetically before signing.")
42
42
  });
43
43
  var timestampSchema = z.strictObject({
44
- header: nonEmptyStringSchema,
45
- format: z.enum(["unix-seconds", "unix-millis", "iso8601"]).optional(),
44
+ header: nonEmptyStringSchema.describe("The request header containing the signing timestamp."),
45
+ format: z.enum(["unix-seconds", "unix-millis", "iso8601"]).optional().describe("The timestamp format used in the signature payload."),
46
46
  /** Replay window in seconds. */
47
- tolerance: z.number().positive().optional()
47
+ tolerance: z.number().positive().optional().describe("The maximum accepted timestamp age, in seconds.")
48
48
  });
49
49
  var bodyHashLocationSchema = z.discriminatedUnion("type", [
50
50
  z.strictObject({
51
- type: z.literal("query-parameter"),
52
- name: nonEmptyStringSchema
51
+ type: z.literal("query-parameter").describe("Reads the body hash from a query parameter."),
52
+ name: nonEmptyStringSchema.describe("The query parameter containing the body hash.")
53
53
  })
54
54
  ]);
55
55
  var bodyHashBindingSchema = z.strictObject({
56
- algorithm: hashAlgorithmSchema,
57
- encoding: encodingSchema.optional(),
58
- location: bodyHashLocationSchema
56
+ algorithm: hashAlgorithmSchema.describe("The hash algorithm applied to the raw request body."),
57
+ encoding: encodingSchema.optional().describe("The encoding used for the body hash."),
58
+ location: bodyHashLocationSchema.describe("Where the expected body hash is read from.")
59
59
  });
60
60
  var urlNormalizationSchema = z.strictObject({
61
61
  /** Try the URL with and without an explicit default port. */
62
- portVariants: z.boolean().optional(),
62
+ portVariants: z.boolean().optional().describe("Whether verification tries URLs with and without an explicit default port."),
63
63
  /** Try the URL with the pre-RFC3986 query encoding (`+` for space, unescaped `*`). */
64
- legacyQueryEncoding: z.boolean().optional()
64
+ legacyQueryEncoding: z.boolean().optional().describe("Whether verification also tries legacy form-style query encoding.")
65
65
  }).refine(
66
66
  ({ portVariants, legacyQueryEncoding }) => portVariants === true || legacyQueryEncoding === true,
67
67
  { message: "url normalization must enable at least one variant" }
68
68
  );
69
69
  var webhookSignatureSchema = z.discriminatedUnion("type", [
70
70
  z.strictObject({
71
- type: z.literal("hmac"),
71
+ type: z.literal("hmac").describe("Identifies HMAC webhook signature verification."),
72
72
  /** Request header carrying the signature. */
73
- header: nonEmptyStringSchema,
74
- algorithm: hashAlgorithmSchema.optional(),
75
- encoding: encodingSchema.optional(),
73
+ header: nonEmptyStringSchema.describe("The request header containing the signature."),
74
+ algorithm: hashAlgorithmSchema.optional().describe("The HMAC hash algorithm."),
75
+ encoding: encodingSchema.optional().describe("The encoding used for the HMAC signature."),
76
76
  /** Stripped from the header value before comparison, e.g. `sha256=`. */
77
- signaturePrefix: z.string().optional(),
78
- payloadFormat: payloadFormatSchema.optional(),
79
- timestamp: timestampSchema.optional(),
80
- bodyHashBinding: bodyHashBindingSchema.optional(),
81
- urlNormalization: urlNormalizationSchema.optional()
77
+ signaturePrefix: z.string().optional().describe("A prefix removed from the signature header before comparison."),
78
+ payloadFormat: payloadFormatSchema.optional().describe("How the payload signed by the provider is assembled."),
79
+ timestamp: timestampSchema.optional().describe("Timestamp validation included in signature verification."),
80
+ bodyHashBinding: bodyHashBindingSchema.optional().describe("A separately transmitted hash that binds the raw body to the signed payload."),
81
+ urlNormalization: urlNormalizationSchema.optional().describe("Alternate notification URL forms accepted during verification.")
82
82
  })
83
83
  ]);
84
84
 
85
85
  // src/sdk-config-domain/v1/api.ts
86
86
  var authVariableSchema = z.strictObject({
87
- name: nonEmptyStringSchema.optional(),
88
- environmentVariable: nonEmptyStringSchema.optional(),
89
- description: z.string().optional(),
90
- omit: z.boolean().optional()
87
+ name: nonEmptyStringSchema.optional().describe("The parameter name exposed by the SDK."),
88
+ environmentVariable: nonEmptyStringSchema.optional().describe("The environment variable used to populate the parameter."),
89
+ description: z.string().optional().describe(
90
+ "A description of the authentication parameter included in generated SDK documentation."
91
+ ),
92
+ omit: z.boolean().optional().describe("Whether the parameter is omitted from the SDK surface.")
91
93
  });
92
94
  var apiKeyAuthSchema = z.strictObject({
93
- id: nonEmptyStringSchema,
94
- type: z.literal("api-key"),
95
- location: z.enum(["header", "query", "cookie"]),
96
- name: nonEmptyStringSchema,
97
- prefix: nonEmptyStringSchema.optional(),
98
- environmentVariable: nonEmptyStringSchema.optional(),
99
- description: z.string().optional()
95
+ id: nonEmptyStringSchema.describe("A unique identifier for this authentication scheme."),
96
+ type: z.literal("api-key").describe("Identifies an API key authentication scheme."),
97
+ location: z.enum(["header", "query", "cookie"]).describe("Where the API key is sent on requests."),
98
+ name: nonEmptyStringSchema.describe("The header, query parameter, or cookie name."),
99
+ prefix: nonEmptyStringSchema.optional().describe("A prefix added before the API key value."),
100
+ environmentVariable: nonEmptyStringSchema.optional().describe("The default environment variable for the API key."),
101
+ description: z.string().optional().describe(
102
+ "A description of the authentication scheme included in generated SDK documentation."
103
+ )
100
104
  });
101
105
  var bearerAuthSchema = z.strictObject({
102
- id: nonEmptyStringSchema,
103
- type: z.literal("bearer"),
104
- header: nonEmptyStringSchema.optional(),
105
- prefix: nonEmptyStringSchema.optional(),
106
- environmentVariable: nonEmptyStringSchema.optional(),
107
- description: z.string().optional()
106
+ id: nonEmptyStringSchema.describe("A unique identifier for this authentication scheme."),
107
+ type: z.literal("bearer").describe("Identifies a bearer token authentication scheme."),
108
+ header: nonEmptyStringSchema.optional().describe("The request header that carries the bearer token."),
109
+ prefix: nonEmptyStringSchema.optional().describe('The token prefix, such as "Bearer".'),
110
+ environmentVariable: nonEmptyStringSchema.optional().describe("The default environment variable for the bearer token."),
111
+ description: z.string().optional().describe(
112
+ "A description of the authentication scheme included in generated SDK documentation."
113
+ )
108
114
  });
109
115
  var basicAuthSchema = z.strictObject({
110
- id: nonEmptyStringSchema,
111
- type: z.literal("basic"),
112
- username: authVariableSchema.optional(),
113
- password: authVariableSchema.optional(),
114
- description: z.string().optional()
116
+ id: nonEmptyStringSchema.describe("A unique identifier for this authentication scheme."),
117
+ type: z.literal("basic").describe("Identifies an HTTP Basic authentication scheme."),
118
+ username: authVariableSchema.optional().describe("The username parameter exposed by the SDK."),
119
+ password: authVariableSchema.optional().describe("The password parameter exposed by the SDK."),
120
+ description: z.string().optional().describe(
121
+ "A description of the authentication scheme included in generated SDK documentation."
122
+ )
115
123
  });
116
124
  var oauthScopeSchema = z.strictObject({
117
- name: nonEmptyStringSchema,
118
- description: z.string().optional()
125
+ name: nonEmptyStringSchema.describe("The OAuth scope value requested from the provider."),
126
+ description: z.string().optional().describe("A description of the OAuth scope included in generated SDK documentation.")
119
127
  });
120
128
  var oauthFlowSchema = z.discriminatedUnion("type", [
121
129
  z.strictObject({
122
- type: z.literal("authorization-code"),
123
- authorizationUrl: nonEmptyStringSchema,
124
- tokenUrl: nonEmptyStringSchema,
125
- refreshUrl: nonEmptyStringSchema.optional(),
126
- scopes: z.array(oauthScopeSchema).optional()
130
+ type: z.literal("authorization-code").describe("Uses the OAuth authorization code flow."),
131
+ authorizationUrl: nonEmptyStringSchema.describe("The URL used to authorize the client."),
132
+ tokenUrl: nonEmptyStringSchema.describe("The URL used to exchange a code for tokens."),
133
+ refreshUrl: nonEmptyStringSchema.optional().describe("The URL used to refresh access tokens."),
134
+ scopes: z.array(oauthScopeSchema).optional().describe("The scopes supported by this flow.")
127
135
  }),
128
136
  z.strictObject({
129
- type: z.literal("client-credentials"),
130
- tokenUrl: nonEmptyStringSchema,
131
- refreshUrl: nonEmptyStringSchema.optional(),
132
- scopes: z.array(oauthScopeSchema).optional()
137
+ type: z.literal("client-credentials").describe("Uses the OAuth client credentials flow."),
138
+ tokenUrl: nonEmptyStringSchema.describe("The URL used to obtain access tokens."),
139
+ refreshUrl: nonEmptyStringSchema.optional().describe("The URL used to refresh access tokens."),
140
+ scopes: z.array(oauthScopeSchema).optional().describe("The scopes supported by this flow.")
133
141
  }),
134
142
  z.strictObject({
135
- type: z.literal("implicit"),
136
- authorizationUrl: nonEmptyStringSchema,
137
- refreshUrl: nonEmptyStringSchema.optional(),
138
- scopes: z.array(oauthScopeSchema).optional()
143
+ type: z.literal("implicit").describe("Uses the OAuth implicit flow."),
144
+ authorizationUrl: nonEmptyStringSchema.describe("The URL used to authorize the client."),
145
+ refreshUrl: nonEmptyStringSchema.optional().describe("The URL used to refresh access tokens."),
146
+ scopes: z.array(oauthScopeSchema).optional().describe("The scopes supported by this flow.")
139
147
  }),
140
148
  z.strictObject({
141
- type: z.literal("password"),
142
- tokenUrl: nonEmptyStringSchema,
143
- refreshUrl: nonEmptyStringSchema.optional(),
144
- scopes: z.array(oauthScopeSchema).optional()
149
+ type: z.literal("password").describe("Uses the OAuth resource owner password flow."),
150
+ tokenUrl: nonEmptyStringSchema.describe("The URL used to obtain access tokens."),
151
+ refreshUrl: nonEmptyStringSchema.optional().describe("The URL used to refresh access tokens."),
152
+ scopes: z.array(oauthScopeSchema).optional().describe("The scopes supported by this flow.")
145
153
  })
146
154
  ]);
147
155
  var oauth2AuthSchema = z.strictObject({
148
- id: nonEmptyStringSchema,
149
- type: z.literal("oauth2"),
150
- flows: z.array(oauthFlowSchema).min(1),
151
- clientId: authVariableSchema.optional(),
152
- clientSecret: authVariableSchema.optional(),
153
- tokenHeader: nonEmptyStringSchema.optional(),
154
- tokenPrefix: nonEmptyStringSchema.optional(),
155
- refreshBufferSeconds: z.number().nonnegative().optional(),
156
- description: z.string().optional()
156
+ id: nonEmptyStringSchema.describe("A unique identifier for this authentication scheme."),
157
+ type: z.literal("oauth2").describe("Identifies an OAuth 2.0 authentication scheme."),
158
+ flows: z.array(oauthFlowSchema).min(1).describe("The OAuth flows supported by the API."),
159
+ clientId: authVariableSchema.optional().describe("The OAuth client ID parameter exposed by the SDK."),
160
+ clientSecret: authVariableSchema.optional().describe("The OAuth client secret parameter exposed by the SDK."),
161
+ tokenHeader: nonEmptyStringSchema.optional().describe("The request header that carries the OAuth access token."),
162
+ tokenPrefix: nonEmptyStringSchema.optional().describe("The prefix added before the OAuth access token."),
163
+ refreshBufferSeconds: z.number().nonnegative().optional().describe("How early, in seconds, the client refreshes a token before it expires."),
164
+ description: z.string().optional().describe(
165
+ "A description of the authentication scheme included in generated SDK documentation."
166
+ )
157
167
  });
158
168
  var customAuthParameterSchema = z.strictObject({
159
- location: z.enum(["header", "query", "cookie"]),
160
- name: nonEmptyStringSchema,
161
- prefix: nonEmptyStringSchema.optional(),
162
- environmentVariable: nonEmptyStringSchema.optional()
169
+ location: z.enum(["header", "query", "cookie"]).describe("Where the custom authentication value is sent."),
170
+ name: nonEmptyStringSchema.describe("The header, query parameter, or cookie name."),
171
+ prefix: nonEmptyStringSchema.optional().describe("A prefix added before the parameter value."),
172
+ environmentVariable: nonEmptyStringSchema.optional().describe("The default environment variable for the parameter.")
163
173
  });
164
174
  var customAuthSchema = z.strictObject({
165
- id: nonEmptyStringSchema,
166
- type: z.literal("custom"),
167
- parameters: z.array(customAuthParameterSchema).min(1),
168
- description: z.string().optional()
175
+ id: nonEmptyStringSchema.describe("A unique identifier for this authentication scheme."),
176
+ type: z.literal("custom").describe("Identifies a custom authentication scheme."),
177
+ parameters: z.array(customAuthParameterSchema).min(1).describe("The request parameters that implement the custom scheme."),
178
+ description: z.string().optional().describe(
179
+ "A description of the authentication scheme included in generated SDK documentation."
180
+ )
169
181
  });
170
182
  var authSchemeSchema = z.discriminatedUnion("type", [
171
183
  apiKeyAuthSchema,
@@ -175,12 +187,12 @@ var authSchemeSchema = z.discriminatedUnion("type", [
175
187
  customAuthSchema
176
188
  ]);
177
189
  var authRequirementSchema = z.strictObject({
178
- schemes: z.array(nonEmptyStringSchema).min(1)
190
+ schemes: z.array(nonEmptyStringSchema).min(1).describe("Scheme identifiers that must be satisfied together.")
179
191
  });
180
192
  var authConfigSchema = z.strictObject({
181
- schemes: z.array(authSchemeSchema).min(1),
182
- requirements: z.array(authRequirementSchema).optional(),
183
- endpointSecurity: z.boolean().optional()
193
+ schemes: z.array(authSchemeSchema).min(1).describe("Authentication schemes offered by the API."),
194
+ requirements: z.array(authRequirementSchema).optional().describe("Valid combinations of authentication schemes."),
195
+ endpointSecurity: z.boolean().optional().describe("Whether generated endpoints expose their individual security requirements.")
184
196
  }).superRefine(({ requirements, schemes }, context) => {
185
197
  const schemeIds = /* @__PURE__ */ new Set();
186
198
  schemes.forEach(({ id }, index) => {
@@ -206,45 +218,45 @@ var authConfigSchema = z.strictObject({
206
218
  });
207
219
  });
208
220
  var environmentUrlSchema = z.strictObject({
209
- name: nonEmptyStringSchema,
210
- url: nonEmptyStringSchema,
211
- serverName: nonEmptyStringSchema.optional()
221
+ name: nonEmptyStringSchema.describe("The display name for this environment URL."),
222
+ url: nonEmptyStringSchema.describe("The base URL used for this environment entry."),
223
+ serverName: nonEmptyStringSchema.optional().describe("The source server represented by this URL.")
212
224
  });
213
225
  var environmentSchema = z.strictObject({
214
- name: nonEmptyStringSchema,
215
- urls: z.array(environmentUrlSchema).min(1),
216
- description: z.string().optional()
226
+ name: nonEmptyStringSchema.describe("The environment name exposed by the SDK."),
227
+ urls: z.array(environmentUrlSchema).min(1).describe("The base URLs available in this environment."),
228
+ description: z.string().optional().describe("A description of the environment included in generated SDK documentation.")
217
229
  });
218
230
  var headerSchema = z.strictObject({
219
- name: nonEmptyStringSchema,
220
- value: z.string().optional(),
221
- description: z.string().optional(),
222
- environmentVariable: nonEmptyStringSchema.optional()
231
+ name: nonEmptyStringSchema.describe("The HTTP header name."),
232
+ value: z.string().optional().describe("A fixed value for the generated header."),
233
+ description: z.string().optional().describe("A description of the header included in generated SDK documentation."),
234
+ environmentVariable: nonEmptyStringSchema.optional().describe("The environment variable used to populate the header.")
223
235
  });
224
236
  var environmentVariableSchema = z.strictObject({
225
- name: nonEmptyStringSchema,
226
- description: z.string().optional(),
227
- defaultValue: z.string().optional()
237
+ name: nonEmptyStringSchema.describe("The environment variable name exposed by the SDK."),
238
+ description: z.string().optional().describe("A description of the environment variable included in generated SDK documentation."),
239
+ defaultValue: z.string().optional().describe("The default value used when the variable is unset.")
228
240
  });
229
241
  var apiConfigSchema = z.strictObject({
230
- baseUrl: z.string().default(""),
231
- environments: z.array(environmentSchema).default([]),
232
- environmentVariables: z.array(environmentVariableSchema).default([]),
233
- defaultEnvironment: nonEmptyStringSchema.optional(),
234
- auth: authConfigSchema.optional(),
235
- headers: z.array(headerSchema).optional(),
242
+ baseUrl: z.string().default("").describe("The default base URL used by the generated client."),
243
+ environments: z.array(environmentSchema).default([]).describe("Named API environments and their base URLs."),
244
+ environmentVariables: z.array(environmentVariableSchema).default([]).describe("Environment variables exposed through generated client configuration."),
245
+ defaultEnvironment: nonEmptyStringSchema.optional().describe("The environment selected when a caller does not choose one."),
246
+ auth: authConfigSchema.optional().describe("Authentication supported by the API."),
247
+ headers: z.array(headerSchema).optional().describe("Headers added to generated API requests."),
236
248
  /**
237
249
  * Selects the named `x-fern-audiences`.
238
250
  *
239
251
  * Absent means all audiences. A present empty array selects no tagged audience: untagged nodes
240
252
  * remain included, while every audience-tagged node is excluded.
241
253
  */
242
- audiences: z.array(nonEmptyStringSchema).optional(),
254
+ audiences: z.array(nonEmptyStringSchema).optional().describe("Named API audiences included in the generated SDK."),
243
255
  /**
244
256
  * How the API signs the webhooks it sends, enabling a generated verification helper. API-wide, and
245
257
  * independent of whether any webhook is modeled — see {@link webhookSignatureSchema}.
246
258
  */
247
- webhookSignature: webhookSignatureSchema.optional()
259
+ webhookSignature: webhookSignatureSchema.optional().describe("How generated helpers verify webhook signatures from the API.")
248
260
  });
249
261
 
250
262
  // src/sdk-config/v1/api.ts
@@ -253,16 +265,16 @@ var sdkConfigV1AuthConfigSchema = authConfigSchema;
253
265
  var sdkConfigV1ApiConfigSchema = apiConfigSchema;
254
266
  var sdkConfigV1WebhookSignatureSchema = webhookSignatureSchema;
255
267
  var retryOverrideShape = {
256
- enabled: z.boolean().optional(),
257
- maxAttempts: z.number().int().min(1).optional(),
258
- retryDelayMs: z.number().nonnegative().optional(),
259
- maxDelayMs: z.number().nonnegative().optional(),
260
- jitterMs: z.number().nonnegative().optional(),
261
- backoffFactor: z.number().positive().optional(),
262
- statusCodes: z.array(z.number().int().min(100).max(599)).optional(),
263
- methods: z.array(nonEmptyStringSchema).optional(),
264
- statusCodeProfile: z.enum(["legacy", "recommended"]).optional(),
265
- maxRetryAfterDelayMs: z.number().nonnegative().optional()
268
+ enabled: z.boolean().optional().describe("Whether the generated client retries failed requests."),
269
+ maxAttempts: z.number().int().min(1).optional().describe("The maximum total request attempts, including the initial attempt."),
270
+ retryDelayMs: z.number().nonnegative().optional().describe("The initial delay between retry attempts, in milliseconds."),
271
+ maxDelayMs: z.number().nonnegative().optional().describe("The maximum backoff delay between attempts, in milliseconds."),
272
+ jitterMs: z.number().nonnegative().optional().describe("The maximum random jitter added to retry delays, in milliseconds."),
273
+ backoffFactor: z.number().positive().optional().describe("The multiplier applied to the delay after each failed attempt."),
274
+ statusCodes: z.array(z.number().int().min(100).max(599)).optional().describe("HTTP status codes that are eligible for retries."),
275
+ methods: z.array(nonEmptyStringSchema).optional().describe("HTTP methods that are eligible for retries."),
276
+ statusCodeProfile: z.enum(["legacy", "recommended"]).optional().describe("The built-in retryable status-code policy."),
277
+ maxRetryAfterDelayMs: z.number().nonnegative().optional().describe("The longest Retry-After delay the client will honor, in milliseconds.")
266
278
  };
267
279
  function validateRetryDelays({
268
280
  maxDelayMs,
@@ -279,27 +291,29 @@ function validateRetryDelays({
279
291
  var clientRetryOverrideSchema = z.strictObject(retryOverrideShape).superRefine(validateRetryDelays);
280
292
  var retryConfigSchema = z.strictObject({
281
293
  ...retryOverrideShape,
282
- enabled: z.boolean().default(true),
283
- maxAttempts: z.number().int().min(1).default(3),
284
- retryDelayMs: z.number().nonnegative().default(150),
285
- maxDelayMs: z.number().nonnegative().default(5e3),
286
- jitterMs: z.number().nonnegative().default(50),
287
- backoffFactor: z.number().positive().default(2),
288
- methods: z.array(nonEmptyStringSchema).default(["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS"]),
289
- maxRetryAfterDelayMs: z.number().nonnegative().default(6e4)
294
+ enabled: z.boolean().default(true).describe("Whether the generated client retries failed requests."),
295
+ maxAttempts: z.number().int().min(1).default(3).describe("The maximum total request attempts, including the initial attempt."),
296
+ retryDelayMs: z.number().nonnegative().default(150).describe("The initial delay between retry attempts, in milliseconds."),
297
+ maxDelayMs: z.number().nonnegative().default(5e3).describe("The maximum backoff delay between attempts, in milliseconds."),
298
+ jitterMs: z.number().nonnegative().default(50).describe("The maximum random jitter added to retry delays, in milliseconds."),
299
+ backoffFactor: z.number().positive().default(2).describe("The multiplier applied to the delay after each failed attempt."),
300
+ methods: z.array(nonEmptyStringSchema).default(["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS"]).describe("HTTP methods that are eligible for retries."),
301
+ maxRetryAfterDelayMs: z.number().nonnegative().default(6e4).describe("The longest Retry-After delay the client will honor, in milliseconds.")
290
302
  }).superRefine(validateRetryDelays);
291
303
  var constructorParameterSchema = z.strictObject({
292
- name: nonEmptyStringSchema,
293
- example: z.string().optional(),
294
- description: z.string().optional(),
295
- required: z.boolean().optional()
304
+ name: nonEmptyStringSchema.describe("The parameter name in the generated client constructor."),
305
+ example: z.string().optional().describe("An example value shown in generated documentation."),
306
+ description: z.string().optional().describe(
307
+ "A description of the constructor parameter included in generated SDK documentation."
308
+ ),
309
+ required: z.boolean().optional().describe("Whether callers must provide the parameter.")
296
310
  });
297
311
  var parameterStyleSchema = z.enum(["wrapped", "inline", "language-default"]);
298
312
  var tokenRefreshConfigSchema = z.strictObject({
299
- enabled: z.boolean(),
300
- endpoint: nonEmptyStringSchema.optional(),
301
- accessTokenField: nonEmptyStringSchema.optional(),
302
- refreshTokenField: nonEmptyStringSchema.optional()
313
+ enabled: z.boolean().describe("Whether the client can exchange refresh tokens."),
314
+ endpoint: nonEmptyStringSchema.optional().describe("The API endpoint used to refresh tokens."),
315
+ accessTokenField: nonEmptyStringSchema.optional().describe("The response field containing the refreshed access token."),
316
+ refreshTokenField: nonEmptyStringSchema.optional().describe("The response field containing the refreshed refresh token.")
303
317
  }).superRefine(({ enabled, endpoint }, context) => {
304
318
  if (enabled && endpoint === void 0) {
305
319
  context.addIssue({
@@ -310,26 +324,26 @@ var tokenRefreshConfigSchema = z.strictObject({
310
324
  }
311
325
  });
312
326
  var clientOverrideShape = {
313
- retry: clientRetryOverrideSchema.optional(),
314
- responseHeaders: z.boolean().optional(),
315
- responseValidation: z.boolean().optional(),
316
- multiTenant: z.boolean().optional(),
317
- additionalConstructorParameters: z.array(constructorParameterSchema).optional(),
318
- timeoutMs: z.union([z.number().nonnegative(), z.literal("infinity")]).optional(),
319
- requestParameterStyle: parameterStyleSchema.optional(),
320
- pathParameterStyle: parameterStyleSchema.optional(),
321
- filePropertyStyle: parameterStyleSchema.optional(),
322
- useDefaultRequestParameterValues: z.boolean().optional(),
323
- respectOptionalRequestBody: z.boolean().optional(),
324
- tokenRefresh: tokenRefreshConfigSchema.optional()
327
+ retry: clientRetryOverrideSchema.optional().describe("Retry behavior for generated API requests."),
328
+ responseHeaders: z.boolean().optional().describe("Whether generated operations expose HTTP response headers."),
329
+ responseValidation: z.boolean().optional().describe("Whether the client validates API responses against the schema."),
330
+ multiTenant: z.boolean().optional().describe("Whether the client exposes configuration for tenant-specific API access."),
331
+ additionalConstructorParameters: z.array(constructorParameterSchema).optional().describe("Additional parameters added to the generated client constructor."),
332
+ timeoutMs: z.union([z.number().nonnegative(), z.literal("infinity")]).optional().describe('The default request timeout in milliseconds, or "infinity" for no timeout.'),
333
+ requestParameterStyle: parameterStyleSchema.optional().describe("Whether generated operation parameters are wrapped or passed inline."),
334
+ pathParameterStyle: parameterStyleSchema.optional().describe("Whether generated path parameters are wrapped or passed inline."),
335
+ filePropertyStyle: parameterStyleSchema.optional().describe("Whether generated file properties are wrapped or passed inline."),
336
+ useDefaultRequestParameterValues: z.boolean().optional().describe("Whether schema defaults are applied to omitted request parameters."),
337
+ respectOptionalRequestBody: z.boolean().optional().describe("Whether an optional request body remains optional in generated methods."),
338
+ tokenRefresh: tokenRefreshConfigSchema.optional().describe("Refresh-token behavior for the generated client.")
325
339
  };
326
340
  var clientConfigOverrideSchema = z.strictObject(clientOverrideShape);
327
341
  var clientConfigSchema = z.strictObject({
328
342
  ...clientOverrideShape,
329
- retry: retryConfigSchema.prefault({}),
330
- responseHeaders: z.boolean().default(false),
331
- multiTenant: z.boolean().default(false),
332
- additionalConstructorParameters: z.array(constructorParameterSchema).default([])
343
+ retry: retryConfigSchema.prefault({}).describe("Retry behavior for generated API requests."),
344
+ responseHeaders: z.boolean().default(false).describe("Whether generated operations expose HTTP response headers."),
345
+ multiTenant: z.boolean().default(false).describe("Whether the client exposes configuration for tenant-specific API access."),
346
+ additionalConstructorParameters: z.array(constructorParameterSchema).default([]).describe("Additional parameters added to the generated client constructor.")
333
347
  });
334
348
 
335
349
  // src/sdk-config/v1/client.ts
@@ -344,75 +358,75 @@ var composerPackageNameSchema = nonEmptyStringSchema.regex(
344
358
  'Composer package name must be a lowercase "vendor/package" name'
345
359
  );
346
360
  var authorSchema = z.strictObject({
347
- name: nonEmptyStringSchema,
348
- email: z.email().optional(),
349
- url: nonEmptyStringSchema.optional()
361
+ name: nonEmptyStringSchema.describe("The package author name."),
362
+ email: z.email().optional().describe("The package author email address."),
363
+ url: nonEmptyStringSchema.optional().describe("The package author website.")
350
364
  });
351
365
  var developerSchema = z.strictObject({
352
- name: nonEmptyStringSchema,
353
- email: z.email().optional(),
354
- organization: nonEmptyStringSchema.optional(),
355
- organizationUrl: nonEmptyStringSchema.optional()
366
+ name: nonEmptyStringSchema.describe("The package developer name."),
367
+ email: z.email().optional().describe("The package developer email address."),
368
+ organization: nonEmptyStringSchema.optional().describe("The developer organization name."),
369
+ organizationUrl: nonEmptyStringSchema.optional().describe("The developer organization website.")
356
370
  });
357
371
  var licenseSchema = z.strictObject({
358
- type: nonEmptyStringSchema,
359
- name: nonEmptyStringSchema.optional(),
360
- url: nonEmptyStringSchema.optional(),
361
- path: nonEmptyStringSchema.optional()
372
+ type: nonEmptyStringSchema.describe("The license identifier or license type."),
373
+ name: nonEmptyStringSchema.optional().describe("The human-readable license name."),
374
+ url: nonEmptyStringSchema.optional().describe("The URL containing the license text."),
375
+ path: nonEmptyStringSchema.optional().describe("The path to a custom license file.")
362
376
  });
363
377
  var dependencySourceSchema = z.discriminatedUnion("type", [
364
378
  z.strictObject({
365
- type: z.literal("registry"),
366
- registry: nonEmptyStringSchema.optional()
379
+ type: z.literal("registry").describe("Resolves the dependency from a package registry."),
380
+ registry: nonEmptyStringSchema.optional().describe("The registry used to resolve the dependency.")
367
381
  }),
368
382
  z.strictObject({
369
- type: z.literal("git"),
370
- url: nonEmptyStringSchema,
371
- ref: nonEmptyStringSchema.optional(),
372
- subdirectory: nonEmptyStringSchema.optional()
383
+ type: z.literal("git").describe("Resolves the dependency from a Git repository."),
384
+ url: nonEmptyStringSchema.describe("The Git repository URL."),
385
+ ref: nonEmptyStringSchema.optional().describe("The Git branch, tag, or commit to use."),
386
+ subdirectory: nonEmptyStringSchema.optional().describe("The package subdirectory within the Git repository.")
373
387
  }),
374
388
  z.strictObject({
375
- type: z.literal("path"),
376
- path: nonEmptyStringSchema
389
+ type: z.literal("path").describe("Resolves the dependency from a local path."),
390
+ path: nonEmptyStringSchema.describe("The local path containing the dependency.")
377
391
  })
378
392
  ]);
379
393
  var dependencySchema = z.strictObject({
380
- name: nonEmptyStringSchema,
381
- version: nonEmptyStringSchema.optional(),
382
- source: dependencySourceSchema.optional(),
383
- packageName: nonEmptyStringSchema.optional(),
384
- features: z.array(nonEmptyStringSchema).optional(),
385
- extras: z.array(nonEmptyStringSchema).optional(),
386
- optional: z.boolean().optional(),
387
- defaultFeatures: z.boolean().optional(),
388
- environmentMarker: nonEmptyStringSchema.optional()
394
+ name: nonEmptyStringSchema.describe("The dependency name used by the package manager."),
395
+ version: nonEmptyStringSchema.optional().describe("The dependency version requirement."),
396
+ source: dependencySourceSchema.optional().describe("A non-default source for the dependency."),
397
+ packageName: nonEmptyStringSchema.optional().describe("The source package name when it differs from the dependency alias."),
398
+ features: z.array(nonEmptyStringSchema).optional().describe("Cargo features enabled for this dependency."),
399
+ extras: z.array(nonEmptyStringSchema).optional().describe("Python extras enabled for this dependency."),
400
+ optional: z.boolean().optional().describe("Whether the dependency is optional."),
401
+ defaultFeatures: z.boolean().optional().describe("Whether the dependency enables its default Cargo features."),
402
+ environmentMarker: nonEmptyStringSchema.optional().describe("A Python environment marker that conditions this dependency.")
389
403
  }).refine(({ source, version }) => source !== void 0 || version !== void 0, {
390
404
  message: "dependency must define a version or a source"
391
405
  });
392
406
  var projectUrlSchema = z.strictObject({
393
- label: nonEmptyStringSchema,
394
- url: nonEmptyStringSchema
407
+ label: nonEmptyStringSchema.describe("The label displayed for the project link."),
408
+ url: nonEmptyStringSchema.describe("The project link URL.")
395
409
  });
396
410
  var packageConfigSchema = z.strictObject({
397
- packageName: nonEmptyStringSchema.optional(),
398
- moduleName: nonEmptyStringSchema.optional(),
399
- modulePath: goModulePathSchema.optional(),
400
- namespace: nonEmptyStringSchema.optional(),
401
- groupId: nonEmptyStringSchema.optional(),
402
- artifactId: nonEmptyStringSchema.optional(),
403
- description: z.string().optional(),
404
- repository: nonEmptyStringSchema.optional(),
405
- homepage: nonEmptyStringSchema.optional(),
406
- documentationUrl: nonEmptyStringSchema.optional(),
407
- authors: z.array(authorSchema).optional(),
408
- developers: z.array(developerSchema).optional(),
409
- license: licenseSchema.optional(),
410
- keywords: z.array(nonEmptyStringSchema).optional(),
411
- classifiers: z.array(nonEmptyStringSchema).optional(),
412
- projectUrls: z.array(projectUrlSchema).optional(),
413
- extraDependencies: z.array(dependencySchema).optional(),
414
- extraDevDependencies: z.array(dependencySchema).optional(),
415
- extraPeerDependencies: z.array(dependencySchema).optional()
411
+ packageName: nonEmptyStringSchema.optional().describe("The package name used by the target language registry."),
412
+ moduleName: nonEmptyStringSchema.optional().describe("The generated module or import name when it differs from the package name."),
413
+ modulePath: goModulePathSchema.optional().describe("The Go module path used for imports and publishing."),
414
+ namespace: nonEmptyStringSchema.optional().describe("The namespace or package prefix for generated code."),
415
+ groupId: nonEmptyStringSchema.optional().describe("The Maven group identifier."),
416
+ artifactId: nonEmptyStringSchema.optional().describe("The Maven artifact identifier."),
417
+ description: z.string().optional().describe("The package description used in generated metadata."),
418
+ repository: nonEmptyStringSchema.optional().describe("The source repository for the generated SDK."),
419
+ homepage: nonEmptyStringSchema.optional().describe("The package homepage URL."),
420
+ documentationUrl: nonEmptyStringSchema.optional().describe("The package documentation URL."),
421
+ authors: z.array(authorSchema).optional().describe("Authors credited in package metadata."),
422
+ developers: z.array(developerSchema).optional().describe("Developers credited in package metadata."),
423
+ license: licenseSchema.optional().describe("License metadata for the generated package."),
424
+ keywords: z.array(nonEmptyStringSchema).optional().describe("Search keywords for package metadata."),
425
+ classifiers: z.array(nonEmptyStringSchema).optional().describe("Package classifiers used by registries such as PyPI."),
426
+ projectUrls: z.array(projectUrlSchema).optional().describe("Labeled project links for package metadata."),
427
+ extraDependencies: z.array(dependencySchema).optional().describe("Additional runtime dependencies added to the generated package."),
428
+ extraDevDependencies: z.array(dependencySchema).optional().describe("Additional development dependencies added to the generated package."),
429
+ extraPeerDependencies: z.array(dependencySchema).optional().describe("Additional peer dependencies added to the generated package.")
416
430
  });
417
431
  var httpMethodSchema = z.enum([
418
432
  "GET",
@@ -426,34 +440,34 @@ var httpMethodSchema = z.enum([
426
440
  "CONNECT"
427
441
  ]);
428
442
  var readmeEndpointSchema = z.strictObject({
429
- method: httpMethodSchema,
430
- path: nonEmptyStringSchema,
431
- stream: z.boolean().optional()
443
+ method: httpMethodSchema.describe("The HTTP method of the documented endpoint."),
444
+ path: nonEmptyStringSchema.describe("The endpoint path used in generated examples."),
445
+ stream: z.boolean().optional().describe("Whether the example uses the streaming response API.")
432
446
  });
433
447
  var readmeCustomSectionSchema = z.strictObject({
434
- title: nonEmptyStringSchema,
435
- content: z.string()
448
+ title: nonEmptyStringSchema.describe("The heading displayed for this README section."),
449
+ content: z.string().describe("The Markdown content of this README section.")
436
450
  });
437
451
  var readmeConfigSchema = z.strictObject({
438
- apiName: nonEmptyStringSchema.optional(),
439
- introduction: z.string().optional(),
440
- apiReferenceLink: nonEmptyStringSchema.optional(),
441
- bannerLink: nonEmptyStringSchema.optional(),
442
- disabledSections: z.array(nonEmptyStringSchema).optional(),
443
- customSections: z.array(readmeCustomSectionSchema).optional(),
444
- defaultEndpoint: readmeEndpointSchema.optional(),
445
- features: z.record(z.string(), z.array(readmeEndpointSchema)).optional()
452
+ apiName: nonEmptyStringSchema.optional().describe("The API name displayed in the README."),
453
+ introduction: z.string().optional().describe("Custom introductory Markdown for the README."),
454
+ apiReferenceLink: nonEmptyStringSchema.optional().describe("The URL linked as the API reference."),
455
+ bannerLink: nonEmptyStringSchema.optional().describe("The destination URL for the README banner."),
456
+ disabledSections: z.array(nonEmptyStringSchema).optional().describe("Generated README sections to omit."),
457
+ customSections: z.array(readmeCustomSectionSchema).optional().describe("Additional sections inserted into the README."),
458
+ defaultEndpoint: readmeEndpointSchema.optional().describe("The endpoint used for the primary README example."),
459
+ features: z.record(z.string(), z.array(readmeEndpointSchema)).optional().describe("Named feature groups and the endpoints demonstrated by each group.")
446
460
  });
447
461
  var snippetsConfigSchema = z.strictObject({
448
- enabled: z.boolean(),
449
- format: z.enum(["md", "json"]).optional(),
450
- outputPath: nonEmptyStringSchema.optional()
462
+ enabled: z.boolean().describe("Whether standalone usage snippets are generated."),
463
+ format: z.enum(["md", "json"]).optional().describe("The output format for generated snippets."),
464
+ outputPath: nonEmptyStringSchema.optional().describe("The output path for generated snippet files.")
451
465
  });
452
466
  var docsConfigSchema = z.strictObject({
453
- readme: readmeConfigSchema.optional(),
454
- snippets: snippetsConfigSchema.optional(),
455
- referenceBaseUrl: nonEmptyStringSchema.optional(),
456
- includeApiReference: z.boolean().optional()
467
+ readme: readmeConfigSchema.optional().describe("README content and example configuration."),
468
+ snippets: snippetsConfigSchema.optional().describe("Standalone usage snippet generation."),
469
+ referenceBaseUrl: nonEmptyStringSchema.optional().describe("The base URL used for links to generated API reference files."),
470
+ includeApiReference: z.boolean().optional().describe("Whether API reference documentation is included in the SDK output.")
457
471
  });
458
472
 
459
473
  // src/sdk-config/v1/docs.ts
@@ -784,6 +798,7 @@ function githubOutput(value, publishInfo, rawOutput, language, sourcePath, state
784
798
  consume(state, [...sourcePath, "repo"]);
785
799
  const publication = publishInfo ? mapPublication(publishInfo, rawOutput, language, [...sourcePath, "publishInfo"], state, index) : void 0;
786
800
  const type = stringValue(value.type);
801
+ const licensePackage = mapGithubLicense(value.license, [...sourcePath, "license"], state);
787
802
  const reviewers = mapReviewers(value.reviewers, [...sourcePath, "reviewers"], state);
788
803
  if (type) consume(state, [...sourcePath, "type"]);
789
804
  if (typeof value.makePr === "boolean") consume(state, [...sourcePath, "makePr"]);
@@ -810,9 +825,20 @@ function githubOutput(value, publishInfo, rawOutput, language, sourcePath, state
810
825
  },
811
826
  ...publication ? { publish: publication.publish } : {}
812
827
  },
813
- ...optional("package", publication?.package)
828
+ // The GitHub license wins over a publication-supplied one; `licensePackage` is `{}` or `{ license }`.
829
+ ...optionalObject("package", { ...publication?.package, ...licensePackage })
814
830
  };
815
831
  }
832
+ var basicLicenseTypes = { mit: "MIT", apache: "APACHE" };
833
+ function mapGithubLicense(value, sourcePath, state) {
834
+ if (!isObject(value) || stringValue(value.type) !== "basic") return {};
835
+ const id = stringValue(value.id);
836
+ const type = id ? basicLicenseTypes[id.toLowerCase()] : void 0;
837
+ if (!type) return {};
838
+ consume(state, [...sourcePath, "type"]);
839
+ consume(state, [...sourcePath, "id"]);
840
+ return { license: { type } };
841
+ }
816
842
  function consumeCredentialObject(value, sourcePath, state) {
817
843
  if (!isObject(value)) return;
818
844
  for (const field of ["username", "password", "token", "apiKey"]) {
@@ -1240,16 +1266,10 @@ function finishOutputMapping(mapping, outputMode, sourcePath, state, index) {
1240
1266
  for (const path of collectLeafPaths(outputMode, sourcePath)) {
1241
1267
  if (path[path.length - 1] === "_visit") consume(state, path);
1242
1268
  }
1243
- const legacyGenerateFullProject = isObject(outputMode) ? outputMode.generateFullProject : void 0;
1244
- const generationShape = typeof legacyGenerateFullProject === "boolean" ? { generation: { ...mapping.generation, generateFullProject: legacyGenerateFullProject } } : {};
1245
- if (typeof legacyGenerateFullProject === "boolean") {
1246
- consume(state, [...sourcePath, "generateFullProject"]);
1247
- }
1248
1269
  const unsupported = collectUnsupported(outputMode, sourcePath, state);
1249
1270
  const hasCredentials = unsupported.some((diagnostic) => isCredentialPath(diagnostic.path));
1250
1271
  return {
1251
1272
  ...mapping,
1252
- ...generationShape,
1253
1273
  unsupportedFields: [
1254
1274
  ...state.credentialDiagnostics ?? [],
1255
1275
  ...hasCredentials ? [
@@ -1320,6 +1340,9 @@ function outputDiagnostic(path, index) {
1320
1340
  homepageLink: {
1321
1341
  sdkConfigPath: ["targets", index, "package", "homepage"],
1322
1342
  suggestedAction: "Set target.package.homepage manually to a valid URL."
1343
+ },
1344
+ generateFullProject: {
1345
+ suggestedAction: "Preserve this packaging setting on the generation request; it is not customer-authored SDK configuration."
1323
1346
  }
1324
1347
  };
1325
1348
  const fieldGuidance = field ? guidance[field] : void 0;
@@ -1453,59 +1476,48 @@ function deepEqual(left, right) {
1453
1476
  return false;
1454
1477
  }
1455
1478
  var namingConfigSchema = z.strictObject({
1456
- clientName: nonEmptyStringSchema.optional(),
1457
- exportedClientName: nonEmptyStringSchema.optional(),
1458
- environmentTypeName: nonEmptyStringSchema.optional(),
1459
- apiErrorName: nonEmptyStringSchema.optional(),
1460
- baseErrorName: nonEmptyStringSchema.optional(),
1461
- pagerName: nonEmptyStringSchema.optional(),
1479
+ clientName: nonEmptyStringSchema.optional().describe("The generated client class name."),
1480
+ exportedClientName: nonEmptyStringSchema.optional().describe("The client name exported from the generated package."),
1481
+ environmentTypeName: nonEmptyStringSchema.optional().describe("The generated type name for API environments."),
1482
+ apiErrorName: nonEmptyStringSchema.optional().describe("The generated API error class name."),
1483
+ baseErrorName: nonEmptyStringSchema.optional().describe("The generated base error class name."),
1484
+ pagerName: nonEmptyStringSchema.optional().describe("The generated pagination helper name."),
1462
1485
  /** Apply Fern's initialism-aware casing rules when deriving generated identifiers. */
1463
- smartCasing: z.boolean().optional(),
1486
+ smartCasing: z.boolean().optional().describe("Whether generated identifiers use initialism-aware casing."),
1464
1487
  /** Preserve a word boundary after digits when Fern smart casing is enabled. */
1465
- smartCasingDigitWordBoundary: z.boolean().optional()
1488
+ smartCasingDigitWordBoundary: z.boolean().optional().describe("Whether smart casing preserves a word boundary after digits.")
1466
1489
  });
1467
1490
 
1468
1491
  // src/sdk-config/v1/generation.ts
1469
1492
  var customerGenerationAssetSchema = z.discriminatedUnion("type", [
1470
- z.strictObject({ type: z.literal("path"), location: relativePathSchema }),
1471
- z.strictObject({ type: z.literal("url"), location: nonEmptyStringSchema })
1493
+ z.strictObject({
1494
+ type: z.literal("path").describe("Loads the generation asset from a relative path."),
1495
+ location: relativePathSchema.describe("The relative path to the generation asset.")
1496
+ }),
1497
+ z.strictObject({
1498
+ type: z.literal("url").describe("Loads the generation asset from a URL."),
1499
+ location: nonEmptyStringSchema.describe("The URL of the generation asset.")
1500
+ })
1472
1501
  ]);
1473
- var hookDependencySchema = z.strictObject({
1474
- name: nonEmptyStringSchema,
1475
- version: nonEmptyStringSchema,
1476
- groupId: nonEmptyStringSchema.optional()
1477
- });
1478
- var hooksConfigSchema = z.strictObject({
1479
- enabled: z.boolean(),
1480
- source: customerGenerationAssetSchema.optional(),
1481
- dependencies: z.array(hookDependencySchema).optional()
1482
- });
1483
1502
  var customCodeConfigSchema = z.strictObject({
1484
- enabled: z.boolean(),
1485
- source: customerGenerationAssetSchema.optional(),
1486
- conflictStrategy: z.enum(["mark", "ours", "theirs"]).optional(),
1487
- trackChanges: z.boolean().optional(),
1488
- protectedFiles: z.array(nonEmptyStringSchema).optional()
1503
+ enabled: z.boolean().describe("Whether customer-authored code is merged into generated output."),
1504
+ source: customerGenerationAssetSchema.optional().describe("The source containing customer-authored code."),
1505
+ conflictStrategy: z.enum(["mark", "ours", "theirs"]).optional().describe("How merge conflicts between generated and custom code are handled."),
1506
+ trackChanges: z.boolean().optional().describe("Whether custom-code changes are tracked between builds."),
1507
+ protectedFiles: z.array(nonEmptyStringSchema).optional().describe("Generated file paths that custom-code merging must not overwrite.")
1489
1508
  });
1490
- var workflowConfigSchema = z.strictObject({
1491
- path: relativePathSchema,
1492
- outputName: nonEmptyStringSchema.optional()
1509
+ var analyticsHeaderSchema = z.strictObject({
1510
+ name: nonEmptyStringSchema.describe("The exported telemetry header name."),
1511
+ value: z.string().describe("The literal telemetry header value.")
1493
1512
  });
1494
- var analyticsHeaderSchema = z.union([
1495
- z.strictObject({ name: nonEmptyStringSchema, value: z.string() }),
1496
- z.strictObject({
1497
- name: nonEmptyStringSchema,
1498
- valueRef: nonEmptyStringSchema
1499
- })
1500
- ]);
1501
1513
  var analyticsConfigSchema = z.strictObject({
1502
- enabled: z.boolean(),
1503
- endpoint: nonEmptyStringSchema.optional(),
1504
- exporter: z.enum(["otlp-http", "console"]).optional(),
1505
- headers: z.array(analyticsHeaderSchema).optional(),
1506
- batchSize: z.number().int().positive().optional(),
1507
- scheduledDelayMs: z.number().nonnegative().optional(),
1508
- exportTimeoutMs: z.number().nonnegative().optional()
1514
+ enabled: z.boolean().describe("Whether generated clients export usage telemetry."),
1515
+ endpoint: nonEmptyStringSchema.optional().describe("The telemetry export endpoint."),
1516
+ exporter: z.enum(["otlp-http", "console"]).optional().describe("The telemetry exporter implementation."),
1517
+ headers: z.array(analyticsHeaderSchema).optional().describe("Headers sent by the telemetry exporter."),
1518
+ batchSize: z.number().int().positive().optional().describe("The maximum spans in each export batch."),
1519
+ scheduledDelayMs: z.number().nonnegative().optional().describe("The delay between scheduled exports, in milliseconds."),
1520
+ exportTimeoutMs: z.number().nonnegative().optional().describe("The maximum time allowed for an export, in milliseconds.")
1509
1521
  }).superRefine(({ enabled, endpoint }, context) => {
1510
1522
  if (enabled && endpoint === void 0) {
1511
1523
  context.addIssue({
@@ -1516,73 +1528,63 @@ var analyticsConfigSchema = z.strictObject({
1516
1528
  }
1517
1529
  });
1518
1530
  var wireTestsSchema = z.strictObject({
1519
- enabled: z.boolean(),
1520
- exclusions: z.array(nonEmptyStringSchema).optional(),
1521
- fallbackToGeneratedErrorExamples: z.boolean().optional(),
1522
- fixtureSource: z.enum(["synthetic", "recorded", "auto"]).optional()
1531
+ enabled: z.boolean().describe("Whether wire-level request and response tests are generated."),
1532
+ exclusions: z.array(nonEmptyStringSchema).optional().describe("Operations excluded from wire tests."),
1533
+ fallbackToGeneratedErrorExamples: z.boolean().optional().describe("Whether missing error fixtures are synthesized from generated examples."),
1534
+ fixtureSource: z.enum(["synthetic", "recorded", "auto"]).optional().describe("Where wire-test fixtures are obtained.")
1523
1535
  });
1524
1536
  var unitTestsSchema = z.strictObject({
1525
- enabled: z.boolean(),
1526
- mode: z.enum(["core-runtime", "schema-driven", "both"]).optional(),
1527
- exclusions: z.array(nonEmptyStringSchema).optional()
1537
+ enabled: z.boolean().describe("Whether SDK unit tests are generated."),
1538
+ exclusions: z.array(nonEmptyStringSchema).optional().describe("Operations excluded from unit tests.")
1528
1539
  });
1529
1540
  var streamsSchema = z.strictObject({
1530
- enabled: z.boolean(),
1531
- responseType: z.enum(["wrapper", "native", "web"]).optional(),
1532
- fileResponseType: z.enum(["stream", "binary-response"]).optional(),
1533
- defaultChunkSizeBytes: z.number().int().positive().optional()
1541
+ enabled: z.boolean().describe("Whether generated clients expose streaming response APIs."),
1542
+ responseType: z.enum(["wrapper", "native", "web"]).optional().describe("The streaming response abstraction exposed by generated clients."),
1543
+ fileResponseType: z.enum(["stream", "binary-response"]).optional().describe("The response type used for file downloads."),
1544
+ defaultChunkSizeBytes: z.number().int().positive().optional().describe("The default number of bytes yielded by streaming iterators.")
1534
1545
  });
1535
1546
  var layoutConfigSchema = z.strictObject({
1536
- outputDirectory: z.enum(["project-root", "source-root"]).optional(),
1537
- packagePath: nonEmptyStringSchema.optional()
1547
+ outputDirectory: z.enum(["project-root", "source-root"]).optional().describe("Whether generated source is rooted at the project or its source directory."),
1548
+ packagePath: nonEmptyStringSchema.optional().describe("The package-relative path for generated source files.")
1538
1549
  });
1539
1550
  var serializationConfigSchema = z.strictObject({
1540
- enumRepresentation: z.enum(["enum", "union", "literal", "forward-compatible-enum", "language-default"]).optional(),
1541
- additionalProperties: z.enum(["allow", "forbid", "ignore", "language-default"]).optional(),
1542
- inlineTypes: z.boolean().optional(),
1543
- omitUndefined: z.boolean().optional()
1551
+ enumRepresentation: z.enum(["enum", "union", "literal", "forward-compatible-enum", "language-default"]).optional().describe("How schema enums are represented in generated code."),
1552
+ additionalProperties: z.enum(["allow", "forbid", "ignore", "language-default"]).optional().describe("How undeclared object properties are handled."),
1553
+ inlineTypes: z.boolean().optional().describe("Whether inline schemas remain nested under their parent types."),
1554
+ omitUndefined: z.boolean().optional().describe("Whether undefined properties are omitted during serialization.")
1544
1555
  });
1545
1556
  var generationConfigOverrideShape = {
1546
- includeWatermark: z.boolean().optional(),
1547
- ai: z.boolean().optional(),
1548
- includeOptionalSnippetParameters: z.boolean().optional(),
1549
- buildAllModels: z.boolean().optional(),
1550
- inferServiceNames: z.boolean().optional(),
1551
- includeDeprecatedOperations: z.boolean().optional(),
1552
- multipleResponses: z.boolean().optional(),
1553
- /** Generate the entire SDK project, including package manifests and publishable artifacts. */
1554
- generateFullProject: z.boolean().optional(),
1555
- devContainer: z.boolean().optional(),
1556
- allowMockClient: z.boolean().optional(),
1557
- ignoreFiles: z.array(nonEmptyStringSchema).optional(),
1558
- reservedKeywords: z.array(nonEmptyStringSchema).optional(),
1559
- hooks: hooksConfigSchema.optional(),
1560
- customCode: customCodeConfigSchema.optional(),
1561
- workflows: z.array(workflowConfigSchema).optional(),
1562
- customQueryPaths: z.array(relativePathSchema).optional(),
1563
- analytics: analyticsConfigSchema.optional(),
1564
- wireTests: wireTestsSchema.optional(),
1565
- unitTests: unitTestsSchema.optional(),
1566
- webSockets: z.boolean().optional(),
1567
- streams: streamsSchema.optional(),
1568
- naming: namingConfigSchema.optional(),
1569
- layout: layoutConfigSchema.optional(),
1570
- serialization: serializationConfigSchema.optional()
1557
+ includeOptionalSnippetParameters: z.boolean().optional().describe("Whether usage snippets include optional request parameters."),
1558
+ buildAllModels: z.boolean().optional().describe("Whether models not referenced by operations are also generated."),
1559
+ inferServiceNames: z.boolean().optional().describe("Whether service names are inferred from API structure."),
1560
+ includeDeprecatedOperations: z.boolean().optional().describe("Whether deprecated API operations are generated."),
1561
+ multipleResponses: z.boolean().optional().describe("Whether operations model multiple successful response types."),
1562
+ devContainer: z.boolean().optional().describe("Whether development-container configuration is generated."),
1563
+ allowMockClient: z.boolean().optional().describe("Whether a mock API client is included in the generated SDK."),
1564
+ ignoreFiles: z.array(nonEmptyStringSchema).optional().describe("Generated paths excluded from the final output."),
1565
+ reservedKeywords: z.array(nonEmptyStringSchema).optional().describe("Additional identifiers treated as reserved words."),
1566
+ customCode: customCodeConfigSchema.optional().describe("Customer-authored code merge configuration."),
1567
+ customQueryPaths: z.array(relativePathSchema).optional().describe("Relative paths to custom query definitions."),
1568
+ analytics: analyticsConfigSchema.optional().describe("Generated client telemetry configuration."),
1569
+ wireTests: wireTestsSchema.optional().describe("Wire-level request and response test generation."),
1570
+ unitTests: unitTestsSchema.optional().describe("SDK unit-test generation."),
1571
+ webSockets: z.boolean().optional().describe("Whether WebSocket clients are generated for supported channels."),
1572
+ streams: streamsSchema.optional().describe("Streaming response generation behavior."),
1573
+ naming: namingConfigSchema.optional().describe("Names and casing used by generated code."),
1574
+ layout: layoutConfigSchema.optional().describe("Generated project and source layout."),
1575
+ serialization: serializationConfigSchema.optional().describe("Generated model serialization behavior.")
1571
1576
  };
1572
1577
  var sdkConfigV1GenerationConfigOverrideSchema = z.strictObject(
1573
1578
  generationConfigOverrideShape
1574
1579
  );
1575
1580
  var sdkConfigV1GenerationConfigSchema = z.strictObject({
1576
1581
  ...generationConfigOverrideShape,
1577
- includeWatermark: z.boolean().default(false),
1578
- ai: z.boolean().default(false),
1579
- buildAllModels: z.boolean().default(false),
1580
- inferServiceNames: z.boolean().default(false),
1581
- includeDeprecatedOperations: z.boolean().default(true),
1582
- multipleResponses: z.boolean().default(false),
1583
- generateFullProject: z.boolean().default(false),
1584
- devContainer: z.boolean().default(false),
1585
- allowMockClient: z.boolean().default(false)
1582
+ buildAllModels: z.boolean().default(false).describe("Whether models not referenced by operations are also generated."),
1583
+ inferServiceNames: z.boolean().default(false).describe("Whether service names are inferred from API structure."),
1584
+ includeDeprecatedOperations: z.boolean().default(true).describe("Whether deprecated API operations are generated."),
1585
+ multipleResponses: z.boolean().default(false).describe("Whether operations model multiple successful response types."),
1586
+ devContainer: z.boolean().default(false).describe("Whether development-container configuration is generated."),
1587
+ allowMockClient: z.boolean().default(false).describe("Whether a mock API client is included in the generated SDK.")
1586
1588
  });
1587
1589
  var commonGenerationKeys = new Set(Object.keys(generationConfigOverrideShape));
1588
1590
  function splitSdkConfigV1TargetGeneration(generation) {
@@ -1604,78 +1606,97 @@ var sdkConfigV1PublishRegistrySchema = z.enum([
1604
1606
  "composer"
1605
1607
  ]);
1606
1608
  var mavenSignatureSchema = z.strictObject({
1607
- keyId: nonEmptyStringSchema,
1608
- password: nonEmptyStringSchema,
1609
- secretKey: nonEmptyStringSchema
1609
+ keyId: nonEmptyStringSchema.describe(
1610
+ "The signing key identifier, or an environment expression that resolves to it."
1611
+ ),
1612
+ password: nonEmptyStringSchema.describe(
1613
+ "The signing key password, or an environment expression that resolves to it."
1614
+ ),
1615
+ secretKey: nonEmptyStringSchema.describe(
1616
+ "The armored secret key, or an environment expression that resolves to it."
1617
+ )
1610
1618
  });
1611
1619
  var commonPublishShape = {
1612
- url: nonEmptyStringSchema.optional(),
1613
- releaseBranch: nonEmptyStringSchema.optional(),
1614
- tolerateRepublish: z.boolean().optional()
1620
+ url: nonEmptyStringSchema.optional().describe("A custom package registry URL."),
1621
+ releaseBranch: nonEmptyStringSchema.optional().describe("The branch used by generated package release workflows."),
1622
+ tolerateRepublish: z.boolean().optional().describe("Whether an already-published package version is treated as non-fatal.")
1615
1623
  };
1616
1624
  var sdkConfigV1PublishConfigSchema = z.discriminatedUnion("registry", [
1617
1625
  z.strictObject({
1618
- registry: z.literal("npm"),
1619
- token: nonEmptyStringSchema.optional(),
1626
+ registry: z.literal("npm").describe("Publishes the package to an npm-compatible registry."),
1627
+ token: nonEmptyStringSchema.optional().describe("The npm registry token, or an environment expression that resolves to it."),
1628
+ ...commonPublishShape
1629
+ }),
1630
+ z.strictObject({
1631
+ registry: z.literal("pypi").describe("Publishes the package to a PyPI-compatible registry."),
1632
+ username: nonEmptyStringSchema.optional().describe("The PyPI username, or an environment expression that resolves to it."),
1633
+ password: nonEmptyStringSchema.optional().describe("The PyPI password or token, or an environment expression that resolves to it."),
1634
+ ...commonPublishShape
1635
+ }),
1636
+ z.strictObject({
1637
+ registry: z.literal("maven").describe("Publishes the package to a Maven-compatible repository."),
1638
+ username: nonEmptyStringSchema.optional().describe("The Maven username, or an environment expression that resolves to it."),
1639
+ password: nonEmptyStringSchema.optional().describe("The Maven password, or an environment expression that resolves to it."),
1640
+ signature: mavenSignatureSchema.optional().describe("Credentials used to sign Maven artifacts."),
1641
+ ...commonPublishShape
1642
+ }),
1643
+ z.strictObject({
1644
+ registry: z.literal("nuget").describe("Publishes the package to a NuGet-compatible registry."),
1620
1645
  ...commonPublishShape
1621
1646
  }),
1622
1647
  z.strictObject({
1623
- registry: z.literal("pypi"),
1624
- username: nonEmptyStringSchema.optional(),
1625
- password: nonEmptyStringSchema.optional(),
1648
+ registry: z.literal("rubygems").describe("Publishes the package to a RubyGems-compatible registry."),
1626
1649
  ...commonPublishShape
1627
1650
  }),
1628
1651
  z.strictObject({
1629
- registry: z.literal("maven"),
1630
- username: nonEmptyStringSchema.optional(),
1631
- password: nonEmptyStringSchema.optional(),
1632
- signature: mavenSignatureSchema.optional(),
1652
+ registry: z.literal("crates").describe("Publishes the crate to a Cargo-compatible registry."),
1653
+ token: nonEmptyStringSchema.optional().describe("The Cargo registry token, or an environment expression that resolves to it."),
1633
1654
  ...commonPublishShape
1634
1655
  }),
1635
- z.strictObject({ registry: z.literal("nuget"), ...commonPublishShape }),
1636
- z.strictObject({ registry: z.literal("rubygems"), ...commonPublishShape }),
1637
1656
  z.strictObject({
1638
- registry: z.literal("crates"),
1639
- token: nonEmptyStringSchema.optional(),
1657
+ registry: z.literal("go").describe("Publishes the SDK as a Go module."),
1640
1658
  ...commonPublishShape
1641
1659
  }),
1642
- z.strictObject({ registry: z.literal("go"), ...commonPublishShape }),
1643
- z.strictObject({ registry: z.literal("composer"), ...commonPublishShape })
1660
+ z.strictObject({
1661
+ registry: z.literal("composer").describe("Publishes the package to a Composer-compatible registry."),
1662
+ ...commonPublishShape
1663
+ })
1644
1664
  ]);
1645
1665
  var reviewersSchema = z.strictObject({
1646
- teams: z.array(nonEmptyStringSchema).optional(),
1647
- users: z.array(nonEmptyStringSchema).optional()
1666
+ teams: z.array(nonEmptyStringSchema).optional().describe("GitHub teams requested as reviewers."),
1667
+ users: z.array(nonEmptyStringSchema).optional().describe("GitHub users requested as reviewers.")
1648
1668
  });
1649
1669
  var githubCredentialsSchema = z.strictObject({
1650
- username: nonEmptyStringSchema.optional(),
1651
- password: nonEmptyStringSchema.optional(),
1652
- token: nonEmptyStringSchema.optional(),
1653
- apiKey: nonEmptyStringSchema.optional()
1670
+ username: nonEmptyStringSchema.optional().describe("The username used to authenticate with the GitHub host."),
1671
+ password: nonEmptyStringSchema.optional().describe("The password used to authenticate with the GitHub host."),
1672
+ token: nonEmptyStringSchema.optional().describe("A token used to authenticate with the GitHub host."),
1673
+ apiKey: nonEmptyStringSchema.optional().describe("An API key used to authenticate with the GitHub host.")
1654
1674
  });
1655
1675
  var githubOutputSchema = z.strictObject({
1656
- repository: nonEmptyStringSchema,
1657
- host: nonEmptyStringSchema.optional(),
1658
- branch: nonEmptyStringSchema.optional(),
1659
- mode: z.enum(["release", "pull-request", "push", "commit", "commit-and-release"]).optional(),
1660
- reviewers: reviewersSchema.optional(),
1661
- /** Raw GitHub credentials. These values can be sensitive and must be handled as secrets. */
1662
- credentials: githubCredentialsSchema.optional(),
1663
- privateRepository: z.boolean().optional()
1676
+ repository: nonEmptyStringSchema.describe(
1677
+ "The GitHub repository that receives generated files."
1678
+ ),
1679
+ host: nonEmptyStringSchema.optional().describe("The GitHub host for enterprise installations."),
1680
+ branch: nonEmptyStringSchema.optional().describe("The target branch for generated changes."),
1681
+ mode: z.enum(["release", "pull-request", "push", "commit", "commit-and-release"]).optional().describe("How generated changes are delivered to the repository."),
1682
+ reviewers: reviewersSchema.optional().describe("Reviewers requested for generated pull requests."),
1683
+ credentials: githubCredentialsSchema.optional().describe("Credentials used to authenticate GitHub delivery."),
1684
+ privateRepository: z.boolean().optional().describe("Whether the destination repository is private.")
1664
1685
  });
1665
1686
  var filesOutputSchema = z.strictObject({
1666
- delivery: z.literal("files"),
1667
- path: nonEmptyStringSchema.optional(),
1668
- publish: sdkConfigV1PublishConfigSchema.optional()
1687
+ delivery: z.literal("files").describe("Writes the generated SDK to a directory."),
1688
+ path: nonEmptyStringSchema.optional().describe("The destination directory for generated files."),
1689
+ publish: sdkConfigV1PublishConfigSchema.optional().describe("Optional package registry publication.")
1669
1690
  });
1670
1691
  var zipOutputSchema = z.strictObject({
1671
- delivery: z.literal("zip"),
1672
- fileName: nonEmptyStringSchema.optional(),
1673
- publish: sdkConfigV1PublishConfigSchema.optional()
1692
+ delivery: z.literal("zip").describe("Packages the generated SDK as a ZIP archive."),
1693
+ fileName: nonEmptyStringSchema.optional().describe("The generated ZIP archive file name."),
1694
+ publish: sdkConfigV1PublishConfigSchema.optional().describe("Optional package registry publication.")
1674
1695
  });
1675
1696
  var githubDeliverySchema = z.strictObject({
1676
- delivery: z.literal("github"),
1677
- github: githubOutputSchema,
1678
- publish: sdkConfigV1PublishConfigSchema.optional()
1697
+ delivery: z.literal("github").describe("Delivers the generated SDK to GitHub."),
1698
+ github: githubOutputSchema.describe("GitHub repository delivery settings."),
1699
+ publish: sdkConfigV1PublishConfigSchema.optional().describe("Optional package registry publication.")
1679
1700
  });
1680
1701
  var sdkConfigV1OutputConfigSchema = z.discriminatedUnion(
1681
1702
  "delivery",
@@ -1687,29 +1708,33 @@ var sdkConfigV1OutputConfigSchema = z.discriminatedUnion(
1687
1708
  var sdkConfigV1DependencySchema = dependencySchema;
1688
1709
  var sdkConfigV1PackageConfigSchema = packageConfigSchema;
1689
1710
  var sdkConfigV1ReplayConfigSchema = z.strictObject({
1690
- enabled: z.boolean()
1711
+ enabled: z.boolean().describe("Whether regeneration reapplies customer-authored repository changes.")
1691
1712
  });
1692
1713
  var apiImportSettingsSchema = z.strictObject({
1693
- respectNullableSchemas: z.boolean().optional(),
1694
- titleAsSchemaName: z.boolean().optional(),
1695
- coerceEnumsToLiterals: z.boolean().optional(),
1696
- idiomaticRequestNames: z.boolean().optional(),
1697
- wrapReferencesToNullableInOptional: z.boolean().optional(),
1698
- coerceOptionalSchemasToNullable: z.boolean().optional(),
1699
- pathParameterOrder: z.enum(["url-order", "spec-order"]).optional(),
1700
- onlyIncludeReferencedSchemas: z.boolean().optional(),
1701
- objectQueryParameters: z.boolean().optional(),
1702
- typeDatesAsStrings: z.boolean().optional(),
1703
- groupMultiApiEnvironments: z.boolean().optional(),
1704
- ignoreTags: z.boolean().optional(),
1705
- disambiguateRequestNames: z.boolean().optional(),
1706
- respectReadonlySchemas: z.boolean().optional(),
1707
- discriminatedUnionV2: z.boolean().optional(),
1708
- undiscriminatedUnionsWithLiterals: z.boolean().optional(),
1709
- inlineAllOfSchemas: z.boolean().optional(),
1710
- resolveSchemaCollisions: z.boolean().optional(),
1711
- asyncApiMessageNaming: z.enum(["v1", "v2"]).optional(),
1712
- defaultIntegerFormat: z.enum(["int32", "int64", "uint32", "uint64"]).optional()
1714
+ respectNullableSchemas: z.boolean().optional().describe("Whether nullable schemas remain nullable in generated types."),
1715
+ titleAsSchemaName: z.boolean().optional().describe("Whether a schema title can determine the generated type name."),
1716
+ coerceEnumsToLiterals: z.boolean().optional().describe("Whether single-value enums are imported as literal values."),
1717
+ idiomaticRequestNames: z.boolean().optional().describe("Whether request types use concise, idiomatic generated names."),
1718
+ wrapReferencesToNullableInOptional: z.boolean().optional().describe("Whether nullable schema references are also treated as optional."),
1719
+ coerceOptionalSchemasToNullable: z.boolean().optional().describe("Whether optional properties are represented as nullable required properties."),
1720
+ pathParameterOrder: z.enum(["url-order", "spec-order"]).optional().describe("Whether path parameters follow their URL order or specification order."),
1721
+ onlyIncludeReferencedSchemas: z.boolean().optional().describe("Whether unreferenced schemas are omitted from the generated SDK."),
1722
+ objectQueryParameters: z.boolean().optional().describe("Whether object-valued query parameters are preserved as objects."),
1723
+ typeDatesAsStrings: z.boolean().optional().describe("Whether date and date-time schemas are generated as strings."),
1724
+ groupMultiApiEnvironments: z.boolean().optional().describe(
1725
+ "Whether environments from multiple API sources are merged into shared named groups."
1726
+ ),
1727
+ ignoreTags: z.boolean().optional().describe("Whether API tags are ignored when organizing generated resources."),
1728
+ disambiguateRequestNames: z.boolean().optional().describe("Whether colliding request type names are automatically disambiguated."),
1729
+ respectReadonlySchemas: z.boolean().optional().describe(
1730
+ "Whether read-only properties are modeled separately for request and response types."
1731
+ ),
1732
+ discriminatedUnionV2: z.boolean().optional().describe("Whether oneOf and anyOf schemas use the newer discriminator inference rules."),
1733
+ undiscriminatedUnionsWithLiterals: z.boolean().optional().describe("Whether literal-bearing unions remain undiscriminated during import."),
1734
+ inlineAllOfSchemas: z.boolean().optional().describe("Whether schemas composed with allOf are inlined when possible."),
1735
+ resolveSchemaCollisions: z.boolean().optional().describe("Whether colliding imported schema names are resolved automatically."),
1736
+ asyncApiMessageNaming: z.enum(["v1", "v2"]).optional().describe("The naming strategy used for messages imported from AsyncAPI."),
1737
+ defaultIntegerFormat: z.enum(["int32", "int64", "uint32", "uint64"]).optional().describe("The integer format used when a schema does not declare one.")
1713
1738
  });
1714
1739
  var sourceSpecTypeSchema = z.enum([
1715
1740
  "openapi",
@@ -1721,27 +1746,30 @@ var sourceSpecTypeSchema = z.enum([
1721
1746
 
1722
1747
  // src/sdk-config/v1/source.ts
1723
1748
  var sourceSpecShape = {
1724
- id: nonEmptyStringSchema,
1725
- type: sourceSpecTypeSchema,
1726
- name: nonEmptyStringSchema.optional(),
1727
- namespace: nonEmptyStringSchema.optional(),
1728
- apiImportSettings: apiImportSettingsSchema.optional(),
1729
- overlays: z.array(relativePathSchema).optional(),
1730
- overrides: z.array(relativePathSchema).optional()
1749
+ id: nonEmptyStringSchema.describe("A unique identifier for this API source."),
1750
+ type: sourceSpecTypeSchema.describe("The API description format of this source."),
1751
+ name: nonEmptyStringSchema.optional().describe("A human-readable name for this API source."),
1752
+ namespace: nonEmptyStringSchema.optional().describe("A namespace used to isolate this source in a multi-source SDK."),
1753
+ apiImportSettings: apiImportSettingsSchema.optional().describe("Import behavior that overrides the source-level defaults for this spec."),
1754
+ overlays: z.array(relativePathSchema).optional().describe("Relative paths to overlays applied to this source in order."),
1755
+ overrides: z.array(relativePathSchema).optional().describe("Relative paths to source override files applied in order.")
1731
1756
  };
1732
1757
  var sdkConfigV1SourceSpecSchema = z.union(
1733
1758
  [
1734
- z.strictObject({ ...sourceSpecShape, path: relativePathSchema }),
1735
1759
  z.strictObject({
1736
1760
  ...sourceSpecShape,
1737
- url: z.url({ protocol: /^https?$/ })
1761
+ path: relativePathSchema.describe("The relative path to the API source file.")
1762
+ }),
1763
+ z.strictObject({
1764
+ ...sourceSpecShape,
1765
+ url: z.url({ protocol: /^https?$/ }).describe("The HTTP or HTTPS URL of the API source file.")
1738
1766
  })
1739
1767
  ],
1740
1768
  { error: "source spec must contain exactly one locator: path or HTTP(S) url" }
1741
1769
  );
1742
1770
  var sdkConfigV1SourceConfigSchema = z.strictObject({
1743
- specs: z.array(sdkConfigV1SourceSpecSchema).min(1, "source.specs must contain at least one source spec"),
1744
- apiImportSettings: apiImportSettingsSchema.optional()
1771
+ specs: z.array(sdkConfigV1SourceSpecSchema).min(1, "source.specs must contain at least one source spec").describe("API source files in authoritative processing order."),
1772
+ apiImportSettings: apiImportSettingsSchema.optional().describe("Default import behavior shared by every source spec.")
1745
1773
  }).superRefine(({ specs }, context) => {
1746
1774
  const seenIds = /* @__PURE__ */ new Set();
1747
1775
  specs.forEach(({ id }, index) => {
@@ -1756,74 +1784,80 @@ var sdkConfigV1SourceConfigSchema = z.strictObject({
1756
1784
  });
1757
1785
  });
1758
1786
  var cliGenerationConfigSchema = z.strictObject({
1759
- paginationParameters: z.array(nonEmptyStringSchema).optional(),
1760
- skills: z.boolean().optional()
1787
+ paginationParameters: z.array(nonEmptyStringSchema).optional().describe("Request parameter names treated as pagination controls by the CLI."),
1788
+ skills: z.boolean().optional().describe("Whether the generated CLI includes skills that teach AI agents to invoke commands.")
1761
1789
  });
1762
1790
  var csharpGenerationConfigSchema = z.strictObject({
1763
- useOptionalWrapper: z.boolean().optional(),
1764
- simplifyObjectDictionaries: z.boolean().optional(),
1765
- explicitNamespaces: z.boolean().optional(),
1766
- rootNamespaceForCoreClasses: z.boolean().optional(),
1767
- includeExceptionHandler: z.boolean().optional(),
1768
- experimentalExplicitNullableOptional: z.boolean().optional()
1791
+ useOptionalWrapper: z.boolean().optional().describe("Whether optional values use an explicit Optional wrapper."),
1792
+ simplifyObjectDictionaries: z.boolean().optional().describe("Whether object schemas with arbitrary values use simplified dictionary types."),
1793
+ explicitNamespaces: z.boolean().optional().describe("Whether generated resource groups use explicit nested namespaces."),
1794
+ rootNamespaceForCoreClasses: z.boolean().optional().describe("Whether shared client classes are emitted in the root namespace."),
1795
+ includeExceptionHandler: z.boolean().optional().describe("Whether generated client operations use a configurable exception handler."),
1796
+ experimentalExplicitNullableOptional: z.boolean().optional().describe(
1797
+ "Whether optional nullable properties distinguish omitted values from explicit nulls."
1798
+ )
1769
1799
  });
1770
1800
  var goGenerationConfigSchema = z.strictObject({
1771
- legacyComplexModels: z.boolean().optional(),
1801
+ legacyComplexModels: z.boolean().optional().describe("Whether complex models use the legacy Go representation."),
1772
1802
  /** Uppercase common initialisms in generated names (`UserID` rather than `UserId`). */
1773
- smartCasing: z.boolean().optional(),
1803
+ smartCasing: z.boolean().optional().describe("Whether generated Go names capitalize common initialisms."),
1774
1804
  /** Overrides the fern root-client constructor independently from the client type name. */
1775
- clientConstructorName: nonEmptyStringSchema.optional(),
1776
- unionVersion: z.enum(["v0", "v1"]).optional(),
1777
- includeLegacyClientOptions: z.boolean().optional()
1805
+ clientConstructorName: nonEmptyStringSchema.optional().describe("The generated root-client constructor name."),
1806
+ unionVersion: z.enum(["v0", "v1"]).optional().describe("The representation used for generated Go unions."),
1807
+ includeLegacyClientOptions: z.boolean().optional().describe("Whether the client retains legacy constructor option helpers.")
1778
1808
  });
1779
1809
  var jvmGenerationConfigSchema = z.strictObject({
1780
- packageLayout: z.enum(["flat", "nested"]).optional(),
1781
- useLocalDateForDates: z.boolean().optional(),
1782
- collapseOptionalNullable: z.boolean().optional(),
1783
- gradleDistributionUrl: z.string().min(1).optional(),
1784
- gradlePluginManagement: z.string().optional(),
1785
- gradleCentralDependencyManagement: z.boolean().optional(),
1810
+ packageLayout: z.enum(["flat", "nested"]).optional().describe("Whether generated JVM packages use a flat or nested resource layout."),
1811
+ useLocalDateForDates: z.boolean().optional().describe("Whether date-only values use LocalDate instead of OffsetDateTime."),
1812
+ collapseOptionalNullable: z.boolean().optional().describe("Whether optional nullable values collapse into a single nullable representation."),
1813
+ gradleDistributionUrl: z.string().min(1).optional().describe("The Gradle distribution URL written to the generated wrapper."),
1814
+ gradlePluginManagement: z.string().optional().describe("Plugin management configuration added to the generated Gradle settings."),
1815
+ gradleCentralDependencyManagement: z.boolean().optional().describe("Whether dependency versions are managed centrally in the Gradle project."),
1786
1816
  /** Selects co-located async methods or a separate async client surface. */
1787
- asyncStyle: z.enum(["dedicated-client", "twin-methods"]).optional()
1817
+ asyncStyle: z.enum(["dedicated-client", "twin-methods"]).optional().describe("Whether asynchronous operations use a separate client or co-located methods.")
1788
1818
  });
1789
1819
 
1790
1820
  // src/sdk-config-domain/v1/language/java.ts
1791
1821
  var javaGenerationConfigSchema = jvmGenerationConfigSchema.extend({
1792
- includeKotlinSnippets: z.boolean().optional()
1822
+ includeKotlinSnippets: z.boolean().optional().describe("Whether Java SDK documentation includes Kotlin usage snippets.")
1793
1823
  });
1794
1824
 
1795
1825
  // src/sdk-config-domain/v1/language/kotlin.ts
1796
1826
  var kotlinGenerationConfigSchema = jvmGenerationConfigSchema;
1797
1827
  var compilerOptionsSchema = z.strictObject({
1798
- target: nonEmptyStringSchema.optional(),
1799
- module: nonEmptyStringSchema.optional(),
1800
- lib: z.array(nonEmptyStringSchema).optional()
1828
+ target: nonEmptyStringSchema.optional().describe("The JavaScript language target passed to TypeScript."),
1829
+ module: nonEmptyStringSchema.optional().describe("The module format passed to TypeScript."),
1830
+ lib: z.array(nonEmptyStringSchema).optional().describe("The runtime library definitions passed to TypeScript.")
1801
1831
  });
1802
1832
  var packageScriptSchema = z.strictObject({
1803
- name: nonEmptyStringSchema,
1804
- command: nonEmptyStringSchema
1833
+ name: nonEmptyStringSchema.describe("The package script name."),
1834
+ command: nonEmptyStringSchema.describe("The command executed by the package script.")
1805
1835
  });
1806
1836
  var httpClientSchema = z.strictObject({
1807
- name: z.enum(["axios", "fetch"])
1837
+ name: z.enum(["axios", "fetch"]).describe("The HTTP client used by generated TypeScript code.")
1808
1838
  });
1809
1839
  var typescriptGenerationConfigSchema = z.strictObject({
1810
- typescriptVersion: nonEmptyStringSchema.optional(),
1811
- zodVersion: nonEmptyStringSchema.optional(),
1812
- compilerOptions: compilerOptionsSchema.optional(),
1813
- httpClient: httpClientSchema.optional(),
1814
- packageManager: z.enum(["pnpm", "yarn"]).optional(),
1815
- testFramework: z.enum(["jest", "vitest"]).optional(),
1816
- namingStrategy: z.enum(["base", "originalPropertyNames"]).optional(),
1817
- bundle: z.boolean().optional(),
1818
- exportClassDefault: z.boolean().optional(),
1840
+ typescriptVersion: nonEmptyStringSchema.optional().describe("The TypeScript version used by the generated project."),
1841
+ zodVersion: nonEmptyStringSchema.optional().describe("The Zod version used by generated runtime schemas."),
1842
+ compilerOptions: compilerOptionsSchema.optional().describe("TypeScript compiler options for the generated project."),
1843
+ httpClient: httpClientSchema.optional().describe("The HTTP client used by generated TypeScript code."),
1844
+ packageManager: z.enum(["pnpm", "yarn"]).optional().describe("The package manager used by the generated project."),
1845
+ packageManagerVersion: nonEmptyStringSchema.optional().describe("The package manager version used by the generated project."),
1846
+ testFramework: z.enum(["jest", "vitest"]).optional().describe("The test framework used by generated tests."),
1847
+ namingStrategy: z.enum(["base", "originalPropertyNames"]).optional().describe("How schema property names are converted into TypeScript identifiers."),
1848
+ bundle: z.boolean().optional().describe("Whether the generated package includes bundled output."),
1849
+ exportClassDefault: z.boolean().optional().describe("Whether the client class is also exported as the default export."),
1819
1850
  /** Name of the top-level namespace export emitted by Fern-compatible TypeScript SDKs. */
1820
- namespaceExportName: nonEmptyStringSchema.optional(),
1821
- allowCustomFetcher: z.boolean().optional(),
1822
- useBrandedStringAliases: z.boolean().optional(),
1823
- useLegacyExports: z.boolean().optional(),
1824
- useBigInt: z.boolean().optional(),
1825
- serdeLayer: z.boolean().optional(),
1826
- scripts: z.array(packageScriptSchema).optional()
1851
+ namespaceExportName: nonEmptyStringSchema.optional().describe("The top-level namespace export name."),
1852
+ consolidateTypeFiles: z.boolean().optional().describe("Whether generated types are consolidated into fewer source files."),
1853
+ allowCustomFetcher: z.boolean().optional().describe("Whether callers can supply a custom fetch implementation."),
1854
+ useBrandedStringAliases: z.boolean().optional().describe("Whether string aliases are emitted as distinct branded types."),
1855
+ useLegacyExports: z.boolean().optional().describe("Whether the package emits the legacy export layout."),
1856
+ useBigInt: z.boolean().optional().describe("Whether 64-bit integer values are represented with bigint."),
1857
+ serdeLayer: z.boolean().optional().describe("Whether generated models use Fern serialization and deserialization helpers."),
1858
+ /** Ship only the ESM build (drops CJS) to avoid the Node dual-package hazard. */
1859
+ esmOnly: z.boolean().optional().describe("Whether the package emits only ECMAScript modules."),
1860
+ scripts: z.array(packageScriptSchema).optional().describe("Additional scripts added to the generated package manifest.")
1827
1861
  });
1828
1862
 
1829
1863
  // src/sdk-config-domain/v1/language/mcp.ts
@@ -1838,172 +1872,183 @@ var mcpAvailabilityStatuses = [
1838
1872
  "LEGACY"
1839
1873
  ];
1840
1874
  var mcpToolFilterSchema = z.strictObject({
1841
- include: z.array(nonEmptyStringSchema).optional(),
1842
- exclude: z.array(nonEmptyStringSchema).optional()
1875
+ include: z.array(nonEmptyStringSchema).optional().describe("Operations explicitly included as MCP tools."),
1876
+ exclude: z.array(nonEmptyStringSchema).optional().describe("Operations explicitly excluded from MCP tools.")
1843
1877
  });
1844
1878
  var mcpToolsetNameSchema = nonEmptyStringSchema.refine(
1845
1879
  (name) => name !== "default" && /^[a-z0-9-]+$/.test(name),
1846
1880
  'toolset names must match [a-z0-9-]+ and cannot be "default"'
1847
1881
  );
1848
1882
  var mcpGenerationConfigSchema = typescriptGenerationConfigSchema.extend({
1849
- serverName: nonEmptyStringSchema.optional(),
1850
- serverDescription: nonEmptyStringSchema.optional(),
1851
- excludeAvailability: z.array(z.enum(mcpAvailabilityStatuses)).optional(),
1852
- tools: mcpToolFilterSchema.optional(),
1853
- toolsets: z.record(mcpToolsetNameSchema, mcpToolFilterSchema).optional()
1883
+ serverName: nonEmptyStringSchema.optional().describe("The name advertised by the generated MCP server."),
1884
+ serverDescription: nonEmptyStringSchema.optional().describe("The description advertised by the generated MCP server."),
1885
+ excludeAvailability: z.array(z.enum(mcpAvailabilityStatuses)).optional().describe("Operation availability statuses excluded from MCP tool generation."),
1886
+ tools: mcpToolFilterSchema.optional().describe("Global operation filters for generated MCP tools."),
1887
+ toolsets: z.record(mcpToolsetNameSchema, mcpToolFilterSchema).optional().describe("Named MCP toolsets and the operation filters for each toolset.")
1854
1888
  });
1855
1889
  var phpGenerationConfigSchema = z.strictObject({
1856
- propertyAccess: z.enum(["public", "private"]).optional(),
1857
- generateClientInterfaces: z.boolean().optional()
1890
+ propertyAccess: z.enum(["public", "private"]).optional().describe("The visibility of generated PHP model properties."),
1891
+ generateClientInterfaces: z.boolean().optional().describe("Whether interfaces are generated for PHP client classes.")
1858
1892
  });
1859
1893
  var pythonClientSchema = z.strictObject({
1860
- fileName: nonEmptyStringSchema.optional(),
1861
- exportedFileName: nonEmptyStringSchema.optional()
1894
+ fileName: nonEmptyStringSchema.optional().describe("The source file name for the Python client."),
1895
+ exportedFileName: nonEmptyStringSchema.optional().describe("The file name used when exporting the Python client.")
1862
1896
  });
1863
1897
  var pydanticConfigSchema = z.strictObject({
1864
- versionCompatibility: z.enum(["v1", "v2", "both", "v1-on-v2"]).optional(),
1865
- frozen: z.boolean().optional(),
1866
- requireOptionalFields: z.boolean().optional(),
1867
- unionNaming: z.enum(["v0", "v1"]).optional(),
1868
- useFieldAliases: z.boolean().optional()
1898
+ versionCompatibility: z.enum(["v1", "v2", "both", "v1-on-v2"]).optional().describe("The Pydantic major versions supported by generated models."),
1899
+ frozen: z.boolean().optional().describe("Whether generated Pydantic models are immutable."),
1900
+ requireOptionalFields: z.boolean().optional().describe("Whether Optional fields remain required unless they declare a default."),
1901
+ unionNaming: z.enum(["v0", "v1"]).optional().describe("The naming strategy for generated union types."),
1902
+ useFieldAliases: z.boolean().optional().describe("Whether Pydantic field aliases preserve wire names.")
1869
1903
  });
1870
1904
  var additionalInitExportSchema = z.strictObject({
1871
- from: nonEmptyStringSchema,
1872
- imports: z.array(nonEmptyStringSchema).min(1)
1905
+ from: nonEmptyStringSchema.describe("The module from which names are re-exported."),
1906
+ imports: z.array(nonEmptyStringSchema).min(1).describe("Names re-exported from the module.")
1873
1907
  });
1874
1908
  var pythonGenerationConfigSchema = z.strictObject({
1875
- pythonVersion: nonEmptyStringSchema.optional(),
1876
- pydanticVersion: nonEmptyStringSchema.optional(),
1877
- pydantic: pydanticConfigSchema.optional(),
1878
- client: pythonClientSchema.optional(),
1909
+ pythonVersion: nonEmptyStringSchema.optional().describe("The Python version targeted by the generated project."),
1910
+ pydanticVersion: nonEmptyStringSchema.optional().describe("The Pydantic dependency version requirement."),
1911
+ pydantic: pydanticConfigSchema.optional().describe("Pydantic model-generation behavior."),
1912
+ client: pythonClientSchema.optional().describe("Python client file naming."),
1879
1913
  /** Default followed by generated sync and async HTTP clients when the caller does not override it. */
1880
- followRedirectsByDefault: z.boolean().optional(),
1914
+ followRedirectsByDefault: z.boolean().optional().describe("Whether generated HTTP clients follow redirects by default."),
1881
1915
  /** Chunk size passed to Python byte-stream iterators. */
1882
- defaultBytesStreamChunkSize: z.number().int().positive().optional(),
1916
+ defaultBytesStreamChunkSize: z.number().int().positive().optional().describe("The default byte-stream iterator chunk size."),
1883
1917
  /** Python interpreter recursion limit installed by the generated package at import time. */
1884
- recursionLimit: z.number().int().gt(1e3).optional(),
1918
+ recursionLimit: z.number().int().gt(1e3).optional().describe("The Python recursion limit installed when the generated package is imported."),
1885
1919
  /** Published Python extras, keyed by extra name with package dependency names as values. */
1886
- extras: z.record(nonEmptyStringSchema, z.array(nonEmptyStringSchema)).optional(),
1887
- alwaysInitializeOptionals: z.boolean().optional(),
1888
- useTypedDictRequests: z.boolean().optional(),
1889
- additionalInitExports: z.array(additionalInitExportSchema).optional()
1920
+ extras: z.record(nonEmptyStringSchema, z.array(nonEmptyStringSchema)).optional().describe("Published Python extras and their dependency names."),
1921
+ alwaysInitializeOptionals: z.boolean().optional().describe("Whether optional model fields are initialized even when omitted."),
1922
+ useTypedDictRequests: z.boolean().optional().describe("Whether request bodies are generated as TypedDict types."),
1923
+ additionalInitExports: z.array(additionalInitExportSchema).optional().describe("Additional names re-exported from the package initializer.")
1890
1924
  });
1891
1925
  var rubyGenerationConfigSchema = z.strictObject({
1892
- requirePaths: z.array(nonEmptyStringSchema).optional()
1926
+ requirePaths: z.array(nonEmptyStringSchema).optional().describe("Ruby load paths included in the generated gem specification.")
1893
1927
  });
1894
1928
  var rustGenerationConfigSchema = z.strictObject({
1895
1929
  /**
1896
1930
  * Rust type for datetime primitives. `offset` maps to `DateTime<FixedOffset>` and preserves the
1897
1931
  * timezone the payload carried; `utc` maps to `DateTime<Utc>` and normalizes to UTC.
1898
1932
  */
1899
- dateTimeType: z.enum(["offset", "utc"]).optional(),
1933
+ dateTimeType: z.enum(["offset", "utc"]).optional().describe("Whether datetime values preserve their offset or normalize to UTC."),
1900
1934
  /** Uppercase common initialisms in generated names (`UserID` rather than `UserId`). */
1901
- capitalizeInitialisms: z.boolean().optional(),
1935
+ capitalizeInitialisms: z.boolean().optional().describe("Whether generated Rust names capitalize common initialisms."),
1902
1936
  /** Cargo features, mapping a feature name to the dependencies or features it enables. */
1903
- features: z.record(z.string(), z.array(nonEmptyStringSchema)).optional(),
1937
+ features: z.record(z.string(), z.array(nonEmptyStringSchema)).optional().describe("Cargo features and the dependencies or features each enables."),
1904
1938
  /** Overrides which features make up Cargo's `default` feature set. */
1905
- defaultFeatures: z.array(nonEmptyStringSchema).optional()
1939
+ defaultFeatures: z.array(nonEmptyStringSchema).optional().describe("Cargo features included in the crate default feature set.")
1906
1940
  });
1907
1941
  var swiftGenerationConfigSchema = z.strictObject({
1908
- moduleName: nonEmptyStringSchema.optional(),
1909
- nullableAsOptional: z.boolean().optional()
1942
+ moduleName: nonEmptyStringSchema.optional().describe("The Swift module name for the generated package."),
1943
+ nullableAsOptional: z.boolean().optional().describe("Whether nullable values are represented as Swift optionals.")
1910
1944
  });
1911
1945
  var planModifierSourceSchema = z.discriminatedUnion("enabled", [
1912
- z.strictObject({ enabled: z.literal(true), sourceDir: nonEmptyStringSchema }),
1913
- z.strictObject({ enabled: z.literal(false) })
1946
+ z.strictObject({
1947
+ enabled: z.literal(true).describe("Enables custom Terraform plan modifiers."),
1948
+ sourceDir: nonEmptyStringSchema.describe(
1949
+ "The directory containing custom plan modifier source files."
1950
+ )
1951
+ }),
1952
+ z.strictObject({
1953
+ enabled: z.literal(false).describe("Disables custom Terraform plan modifiers.")
1954
+ })
1914
1955
  ]);
1915
1956
  var planModifiersSchema = z.strictObject({
1916
- resources: planModifierSourceSchema,
1917
- attributes: planModifierSourceSchema
1957
+ resources: planModifierSourceSchema.describe("Custom plan modifiers for generated resources."),
1958
+ attributes: planModifierSourceSchema.describe("Custom plan modifiers for generated attributes.")
1918
1959
  });
1919
1960
  var providerSchemaSchema = z.strictObject({
1920
- addressKey: nonEmptyStringSchema,
1921
- authTokenKey: nonEmptyStringSchema
1961
+ addressKey: nonEmptyStringSchema.describe(
1962
+ "The provider attribute used to configure the API address."
1963
+ ),
1964
+ authTokenKey: nonEmptyStringSchema.describe(
1965
+ "The provider attribute used to configure the authentication token."
1966
+ )
1922
1967
  });
1923
1968
  var terraformGenerationConfigSchema = z.strictObject({
1924
- providerName: nonEmptyStringSchema.optional(),
1925
- providerVersion: nonEmptyStringSchema.optional(),
1926
- providerModulePath: goModulePathSchema.optional(),
1927
- mockAcceptance: z.boolean().optional(),
1928
- hideComputedDiff: z.boolean().optional(),
1929
- providerSchema: providerSchemaSchema.optional(),
1930
- planModifiers: planModifiersSchema.optional()
1969
+ providerName: nonEmptyStringSchema.optional().describe("The Terraform provider name."),
1970
+ providerVersion: nonEmptyStringSchema.optional().describe("The generated Terraform provider version."),
1971
+ providerModulePath: goModulePathSchema.optional().describe("The Go module path for the generated provider."),
1972
+ mockAcceptance: z.boolean().optional().describe("Whether acceptance tests use a mock API server."),
1973
+ hideComputedDiff: z.boolean().optional().describe("Whether computed-only changes are hidden from Terraform plans."),
1974
+ providerSchema: providerSchemaSchema.optional().describe("Names of provider-level configuration attributes."),
1975
+ planModifiers: planModifiersSchema.optional().describe("Custom plan modifier source configuration.")
1931
1976
  });
1932
1977
 
1933
1978
  // src/sdk-config/v1/target.ts
1934
1979
  var targetOverrideShape = {
1935
- generatorVersion: exactSemverSchema.optional(),
1936
- sdkName: nonEmptyStringSchema.optional(),
1937
- sdkVersion: nonEmptyStringSchema.optional(),
1938
- client: sdkConfigV1ClientConfigOverrideSchema.optional(),
1939
- docs: sdkConfigV1DocsConfigSchema.optional(),
1940
- package: sdkConfigV1PackageConfigSchema.optional(),
1941
- output: sdkConfigV1OutputConfigSchema.optional()
1980
+ generatorVersion: exactSemverSchema.optional().describe("The exact generator version used for this target."),
1981
+ sdkName: nonEmptyStringSchema.optional().describe("An SDK name that overrides the root value for this target."),
1982
+ sdkVersion: nonEmptyStringSchema.optional().describe("An SDK version that overrides the root value for this target."),
1983
+ client: sdkConfigV1ClientConfigOverrideSchema.optional().describe("Client settings that override root client configuration for this target."),
1984
+ docs: sdkConfigV1DocsConfigSchema.optional().describe("Documentation settings that override root documentation for this target."),
1985
+ package: sdkConfigV1PackageConfigSchema.optional().describe("Package metadata that overrides root package configuration for this target."),
1986
+ output: sdkConfigV1OutputConfigSchema.optional().describe("Output configuration that replaces the root output for this target.")
1942
1987
  };
1943
1988
  var sdkConfigV1TargetSchema = z.discriminatedUnion("language", [
1944
1989
  z.strictObject({
1945
- language: z.literal("typescript"),
1946
- generation: sdkConfigV1GenerationConfigOverrideSchema.extend(typescriptGenerationConfigSchema.shape).optional(),
1990
+ language: z.literal("typescript").describe("Generates a TypeScript SDK."),
1991
+ generation: sdkConfigV1GenerationConfigOverrideSchema.extend(typescriptGenerationConfigSchema.shape).optional().describe("Common and TypeScript-specific generation settings for this target."),
1947
1992
  ...targetOverrideShape
1948
1993
  }),
1949
1994
  z.strictObject({
1950
- language: z.literal("python"),
1951
- generation: sdkConfigV1GenerationConfigOverrideSchema.extend(pythonGenerationConfigSchema.shape).optional(),
1995
+ language: z.literal("python").describe("Generates a Python SDK."),
1996
+ generation: sdkConfigV1GenerationConfigOverrideSchema.extend(pythonGenerationConfigSchema.shape).optional().describe("Common and Python-specific generation settings for this target."),
1952
1997
  ...targetOverrideShape
1953
1998
  }),
1954
1999
  z.strictObject({
1955
- language: z.literal("java"),
1956
- generation: sdkConfigV1GenerationConfigOverrideSchema.extend(javaGenerationConfigSchema.shape).optional(),
2000
+ language: z.literal("java").describe("Generates a Java SDK."),
2001
+ generation: sdkConfigV1GenerationConfigOverrideSchema.extend(javaGenerationConfigSchema.shape).optional().describe("Common and Java-specific generation settings for this target."),
1957
2002
  ...targetOverrideShape
1958
2003
  }),
1959
2004
  z.strictObject({
1960
- language: z.literal("kotlin"),
1961
- generation: sdkConfigV1GenerationConfigOverrideSchema.extend(kotlinGenerationConfigSchema.shape).optional(),
2005
+ language: z.literal("kotlin").describe("Generates a Kotlin SDK."),
2006
+ generation: sdkConfigV1GenerationConfigOverrideSchema.extend(kotlinGenerationConfigSchema.shape).optional().describe("Common and Kotlin-specific generation settings for this target."),
1962
2007
  ...targetOverrideShape
1963
2008
  }),
1964
2009
  z.strictObject({
1965
- language: z.literal("go"),
1966
- generation: sdkConfigV1GenerationConfigOverrideSchema.extend(goGenerationConfigSchema.shape).optional(),
2010
+ language: z.literal("go").describe("Generates a Go SDK."),
2011
+ generation: sdkConfigV1GenerationConfigOverrideSchema.extend(goGenerationConfigSchema.shape).optional().describe("Common and Go-specific generation settings for this target."),
1967
2012
  ...targetOverrideShape
1968
2013
  }),
1969
2014
  z.strictObject({
1970
- language: z.literal("csharp"),
1971
- generation: sdkConfigV1GenerationConfigOverrideSchema.extend(csharpGenerationConfigSchema.shape).optional(),
2015
+ language: z.literal("csharp").describe("Generates a C# SDK."),
2016
+ generation: sdkConfigV1GenerationConfigOverrideSchema.extend(csharpGenerationConfigSchema.shape).optional().describe("Common and C#-specific generation settings for this target."),
1972
2017
  ...targetOverrideShape
1973
2018
  }),
1974
2019
  z.strictObject({
1975
- language: z.literal("php"),
1976
- generation: sdkConfigV1GenerationConfigOverrideSchema.extend(phpGenerationConfigSchema.shape).optional(),
2020
+ language: z.literal("php").describe("Generates a PHP SDK."),
2021
+ generation: sdkConfigV1GenerationConfigOverrideSchema.extend(phpGenerationConfigSchema.shape).optional().describe("Common and PHP-specific generation settings for this target."),
1977
2022
  ...targetOverrideShape
1978
2023
  }),
1979
2024
  z.strictObject({
1980
- language: z.literal("ruby"),
1981
- generation: sdkConfigV1GenerationConfigOverrideSchema.extend(rubyGenerationConfigSchema.shape).optional(),
2025
+ language: z.literal("ruby").describe("Generates a Ruby SDK."),
2026
+ generation: sdkConfigV1GenerationConfigOverrideSchema.extend(rubyGenerationConfigSchema.shape).optional().describe("Common and Ruby-specific generation settings for this target."),
1982
2027
  ...targetOverrideShape
1983
2028
  }),
1984
2029
  z.strictObject({
1985
- language: z.literal("rust"),
1986
- generation: sdkConfigV1GenerationConfigOverrideSchema.extend(rustGenerationConfigSchema.shape).optional(),
2030
+ language: z.literal("rust").describe("Generates a Rust SDK."),
2031
+ generation: sdkConfigV1GenerationConfigOverrideSchema.extend(rustGenerationConfigSchema.shape).optional().describe("Common and Rust-specific generation settings for this target."),
1987
2032
  ...targetOverrideShape
1988
2033
  }),
1989
2034
  z.strictObject({
1990
- language: z.literal("swift"),
1991
- generation: sdkConfigV1GenerationConfigOverrideSchema.extend(swiftGenerationConfigSchema.shape).optional(),
2035
+ language: z.literal("swift").describe("Generates a Swift SDK."),
2036
+ generation: sdkConfigV1GenerationConfigOverrideSchema.extend(swiftGenerationConfigSchema.shape).optional().describe("Common and Swift-specific generation settings for this target."),
1992
2037
  ...targetOverrideShape
1993
2038
  }),
1994
2039
  z.strictObject({
1995
- language: z.literal("cli"),
1996
- generation: sdkConfigV1GenerationConfigOverrideSchema.extend(cliGenerationConfigSchema.shape).optional(),
2040
+ language: z.literal("cli").describe("Generates a command-line interface."),
2041
+ generation: sdkConfigV1GenerationConfigOverrideSchema.extend(cliGenerationConfigSchema.shape).optional().describe("Common and CLI-specific generation settings for this target."),
1997
2042
  ...targetOverrideShape
1998
2043
  }),
1999
2044
  z.strictObject({
2000
- language: z.literal("mcp"),
2001
- generation: sdkConfigV1GenerationConfigOverrideSchema.extend(mcpGenerationConfigSchema.shape).optional(),
2045
+ language: z.literal("mcp").describe("Generates an MCP server."),
2046
+ generation: sdkConfigV1GenerationConfigOverrideSchema.extend(mcpGenerationConfigSchema.shape).optional().describe("Common and MCP-specific generation settings for this target."),
2002
2047
  ...targetOverrideShape
2003
2048
  }),
2004
2049
  z.strictObject({
2005
- language: z.literal("terraform"),
2006
- generation: sdkConfigV1GenerationConfigOverrideSchema.extend(terraformGenerationConfigSchema.shape).optional(),
2050
+ language: z.literal("terraform").describe("Generates a Terraform provider."),
2051
+ generation: sdkConfigV1GenerationConfigOverrideSchema.extend(terraformGenerationConfigSchema.shape).optional().describe("Common and Terraform-specific generation settings for this target."),
2007
2052
  ...targetOverrideShape
2008
2053
  })
2009
2054
  ]);
@@ -2096,19 +2141,21 @@ function validateTargetPublishing(target, targetIndex, globalPackage, globalOutp
2096
2141
  );
2097
2142
  }
2098
2143
  var sdkConfigV1Schema = z.strictObject({
2099
- schemaVersion: z.literal(SDK_CONFIG_V1_SCHEMA_VERSION),
2100
- sdkName: nonEmptyStringSchema,
2101
- sdkVersion: nonEmptyStringSchema.default("1.0.0"),
2102
- apiVersion: nonEmptyStringSchema.optional(),
2103
- source: sdkConfigV1SourceConfigSchema,
2104
- api: sdkConfigV1ApiConfigSchema.prefault({}),
2105
- client: sdkConfigV1ClientConfigSchema.prefault({}),
2106
- package: sdkConfigV1PackageConfigSchema.prefault({}),
2107
- output: sdkConfigV1OutputConfigSchema.optional(),
2108
- replay: sdkConfigV1ReplayConfigSchema.optional(),
2109
- docs: sdkConfigV1DocsConfigSchema.prefault({}),
2110
- generation: sdkConfigV1GenerationConfigSchema.prefault({}),
2111
- targets: z.array(sdkConfigV1TargetSchema).min(1)
2144
+ schemaVersion: z.literal(SDK_CONFIG_V1_SCHEMA_VERSION).describe("The version of the customer-facing SDK Config schema."),
2145
+ sdkName: nonEmptyStringSchema.describe("The default name used for generated SDKs."),
2146
+ sdkVersion: nonEmptyStringSchema.default("1.0.0").describe("The default version assigned to generated SDKs."),
2147
+ apiVersion: nonEmptyStringSchema.optional().describe("The version of the API represented by the generated SDKs."),
2148
+ source: sdkConfigV1SourceConfigSchema.describe(
2149
+ "The API descriptions used to generate the SDKs."
2150
+ ),
2151
+ api: sdkConfigV1ApiConfigSchema.prefault({}).describe("Shared API behavior for every target."),
2152
+ client: sdkConfigV1ClientConfigSchema.prefault({}).describe("Shared generated-client behavior for every target."),
2153
+ package: sdkConfigV1PackageConfigSchema.prefault({}).describe("Package metadata inherited by every target."),
2154
+ output: sdkConfigV1OutputConfigSchema.optional().describe("The default output delivery and publication configuration."),
2155
+ replay: sdkConfigV1ReplayConfigSchema.optional().describe("Generation replay behavior shared by every target."),
2156
+ docs: sdkConfigV1DocsConfigSchema.prefault({}).describe("Documentation settings inherited by every target."),
2157
+ generation: sdkConfigV1GenerationConfigSchema.prefault({}).describe("Generation settings inherited by every target."),
2158
+ targets: z.array(sdkConfigV1TargetSchema).min(1).describe("Language targets to generate; each language may appear once.")
2112
2159
  }).superRefine(({ output, package: globalPackage, targets }, context) => {
2113
2160
  const configuredLanguages = /* @__PURE__ */ new Set();
2114
2161
  targets.forEach((target, targetIndex) => {
@@ -2388,9 +2435,6 @@ function mapInvocation(generator, language, activeLanguages, index) {
2388
2435
  if (generator.keywords?.length) {
2389
2436
  generation.reservedKeywords = [...generator.keywords];
2390
2437
  }
2391
- if (generator.generateFullProject !== void 0) {
2392
- generation.generateFullProject = generator.generateFullProject;
2393
- }
2394
2438
  const settings = isObject(generator.settings) ? generator.settings : void 0;
2395
2439
  if (settings) {
2396
2440
  const inlinePathParameters = takeBoolean(settings, ["inlinePathParameters"], state, [
@@ -2421,6 +2465,7 @@ function unsupportedResolvedFields(generator, index) {
2421
2465
  "disableExamples",
2422
2466
  generator.disableExamples === false ? void 0 : generator.disableExamples
2423
2467
  ],
2468
+ ["generateFullProject", generator.generateFullProject],
2424
2469
  ["apiOverride", generator.apiOverride]
2425
2470
  ];
2426
2471
  return values.flatMap(([field, value]) => {
@@ -2450,6 +2495,11 @@ function resolvedFieldGuidance(field) {
2450
2495
  suggestedAction: "Preserve this orchestration setting outside SDK Config; public v1 has no idempotency-generation field."
2451
2496
  };
2452
2497
  }
2498
+ if (field === "generateFullProject") {
2499
+ return {
2500
+ suggestedAction: "Preserve this packaging setting on the generation request; it is not customer-authored SDK configuration."
2501
+ };
2502
+ }
2453
2503
  return {
2454
2504
  suggestedAction: "Review this Fern setting and preserve it outside SDK Config, or set an equivalent SDK Config field manually if one is introduced."
2455
2505
  };
@@ -2496,15 +2546,23 @@ function mapCommonConfig(language, config, state, client, generation, packageCon
2496
2546
  };
2497
2547
  }
2498
2548
  const pythonClient = language === "python" ? takeObject(config, ["client"], state, basePath) : void 0;
2549
+ const typescriptNaming = language === "typescript" || language === "mcp" ? takeObject(config, ["naming"], state, basePath) : void 0;
2499
2550
  const directClientName = takeString(config, ["clientName", "clientClassName"], state, basePath);
2500
- const nestedClientName = pythonClient ? takeString(pythonClient.value, ["className"], state, pythonClient.path) : void 0;
2551
+ const nestedClientName = pythonClient ? takeString(pythonClient.value, ["className"], state, pythonClient.path) : typescriptNaming ? takeString(typescriptNaming.value, ["client"], state, typescriptNaming.path) : void 0;
2501
2552
  const directExportedClientName = takeString(
2502
2553
  config,
2503
2554
  ["exportedClientName", "exportedClientClassName"],
2504
2555
  state,
2505
2556
  basePath
2506
2557
  );
2507
- const nestedExportedClientName = pythonClient ? takeString(pythonClient.value, ["exportedClassName"], state, pythonClient.path) : void 0;
2558
+ const nestedExportedClientName = pythonClient ? takeString(pythonClient.value, ["exportedClassName"], state, pythonClient.path) : typescriptNaming ? (
2559
+ // TypeScript's `naming.namespace` is the base every other naming.* field defaults from
2560
+ // (Fern's docs: `client` defaults to `${PascalCase(namespace)}Client`, same for
2561
+ // `environment`/`error`/etc.) — the same role `exportedClientName` already plays for every
2562
+ // other language's `clientPrefix` derivation.
2563
+ takeString(typescriptNaming.value, ["namespace"], state, typescriptNaming.path)
2564
+ ) : void 0;
2565
+ const nestedEnvironmentTypeName = typescriptNaming ? takeString(typescriptNaming.value, ["environment"], state, typescriptNaming.path) : void 0;
2508
2566
  const naming = compact({
2509
2567
  pagerName: takeString(
2510
2568
  config,
@@ -2514,12 +2572,7 @@ function mapCommonConfig(language, config, state, client, generation, packageCon
2514
2572
  ),
2515
2573
  clientName: directClientName ?? nestedClientName,
2516
2574
  exportedClientName: directExportedClientName ?? nestedExportedClientName,
2517
- environmentTypeName: takeString(
2518
- config,
2519
- ["environmentClassName", "environmentEnumName"],
2520
- state,
2521
- basePath
2522
- ),
2575
+ environmentTypeName: takeString(config, ["environmentClassName", "environmentEnumName"], state, basePath) ?? nestedEnvironmentTypeName,
2523
2576
  apiErrorName: takeString(config, ["baseApiExceptionClassName"], state, basePath),
2524
2577
  baseErrorName: takeString(config, ["baseExceptionClassName"], state, basePath)
2525
2578
  });
@@ -2533,8 +2586,10 @@ function mapCommonConfig(language, config, state, client, generation, packageCon
2533
2586
  basePath
2534
2587
  );
2535
2588
  if (webSockets !== void 0) generation.webSockets = webSockets;
2536
- const generateFullProject = takeBoolean(config, ["generateFullProject"], state, basePath);
2537
- if (generateFullProject !== void 0) generation.generateFullProject = generateFullProject;
2589
+ if (language === "typescript") {
2590
+ const streams = mapTypescriptStreams(config, state, basePath);
2591
+ if (streams) generation.streams = streams;
2592
+ }
2538
2593
  const inlineTypes = takeBoolean(config, ["enableInlineTypes"], state, basePath);
2539
2594
  const omitUndefined = takeBoolean(config, ["omitUndefined"], state, basePath);
2540
2595
  const forwardEnums = takeBoolean(config, ["enableForwardCompatibleEnums"], state, basePath);
@@ -2550,6 +2605,18 @@ function mapCommonConfig(language, config, state, client, generation, packageCon
2550
2605
  if (packagePath !== void 0) generation.layout = { packagePath };
2551
2606
  mapDependencies(config, state, packageConfig, basePath);
2552
2607
  }
2608
+ function mapTypescriptStreams(config, state, basePath) {
2609
+ const responseType = takeEnum(config, ["streamType"], ["wrapper", "web"], state, basePath);
2610
+ const fileResponseType = takeEnum(
2611
+ config,
2612
+ ["fileResponseType"],
2613
+ ["stream", "binary-response"],
2614
+ state,
2615
+ basePath
2616
+ );
2617
+ if (responseType === void 0 && fileResponseType === void 0) return void 0;
2618
+ return { enabled: true, ...compact({ responseType, fileResponseType }) };
2619
+ }
2553
2620
  function mapLanguageConfig(language, config, state, packageConfig, basePath) {
2554
2621
  switch (language) {
2555
2622
  case "typescript":
@@ -2583,29 +2650,39 @@ function mapLanguageConfig(language, config, state, packageConfig, basePath) {
2583
2650
  }
2584
2651
  }
2585
2652
  function mapTypescript(config, state, packageConfig, basePath) {
2586
- mapPackageManifest(config, ["packageJson"], state, packageConfig, basePath);
2653
+ const packageJsonManifest = mapPackageManifest(
2654
+ config,
2655
+ ["packageJson"],
2656
+ state,
2657
+ packageConfig,
2658
+ basePath
2659
+ );
2660
+ const packageJsonPackageManager = packageJsonManifest ? takeString(packageJsonManifest.value, ["packageManager"], state, packageJsonManifest.path) : void 0;
2661
+ const packageManagerAtIndex = packageJsonPackageManager ? packageJsonPackageManager.indexOf("@", packageJsonPackageManager.startsWith("@") ? 1 : 0) : -1;
2662
+ const packageManagerVersionPart = packageManagerAtIndex >= 0 ? packageJsonPackageManager?.slice(packageManagerAtIndex + 1).split("+")[0] : void 0;
2663
+ const packageManagerVersion = packageManagerVersionPart || void 0;
2587
2664
  const serdeLayer = takeBoolean(config, ["serdeLayer"], state, basePath);
2588
2665
  const noSerdeLayer = takeBoolean(config, ["noSerdeLayer"], state, basePath);
2589
2666
  const fetchSupport = takeEnum(config, ["fetchSupport"], ["native"], state, basePath);
2667
+ const namingObject = takeObject(config, ["naming"], state, basePath);
2668
+ const nestedNamespace = namingObject ? takeString(namingObject.value, ["namespace"], state, namingObject.path) : void 0;
2590
2669
  return compact({
2591
2670
  typescriptVersion: takeString(config, ["typescriptVersion"], state, basePath),
2592
2671
  zodVersion: takeString(config, ["zodVersion"], state, basePath),
2593
2672
  packageManager: takeEnum(config, ["packageManager"], ["pnpm", "yarn"], state, basePath),
2673
+ packageManagerVersion,
2594
2674
  testFramework: takeEnum(config, ["testFramework"], ["jest", "vitest"], state, basePath),
2595
2675
  httpClient: fetchSupport === "native" ? { name: "fetch" } : void 0,
2596
2676
  bundle: takeBoolean(config, ["bundle"], state, basePath),
2597
2677
  exportClassDefault: takeBoolean(config, ["exportClassDefault"], state, basePath),
2598
- namespaceExportName: takeString(
2599
- config,
2600
- ["namespaceExportName", "namespaceExport"],
2601
- state,
2602
- basePath
2603
- ),
2678
+ namespaceExportName: takeString(config, ["namespaceExportName", "namespaceExport"], state, basePath) ?? nestedNamespace,
2679
+ consolidateTypeFiles: takeBoolean(config, ["consolidateTypeFiles"], state, basePath),
2604
2680
  allowCustomFetcher: takeBoolean(config, ["allowCustomFetcher"], state, basePath),
2605
2681
  useBrandedStringAliases: takeBoolean(config, ["useBrandedStringAliases"], state, basePath),
2606
2682
  useLegacyExports: takeBoolean(config, ["useLegacyExports"], state, basePath),
2607
2683
  useBigInt: takeBoolean(config, ["useBigInt"], state, basePath),
2608
- serdeLayer: serdeLayer ?? (noSerdeLayer === void 0 ? void 0 : !noSerdeLayer)
2684
+ serdeLayer: serdeLayer ?? (noSerdeLayer === void 0 ? void 0 : !noSerdeLayer),
2685
+ esmOnly: takeBoolean(config, ["esmOnly"], state, basePath)
2609
2686
  });
2610
2687
  }
2611
2688
  function mapPython(config, state, packageConfig, basePath) {
@@ -2716,7 +2793,8 @@ function mapCsharp(config, state, packageConfig, basePath) {
2716
2793
  });
2717
2794
  }
2718
2795
  function mapPhp(config, state, packageConfig, basePath) {
2719
- mapPackageManifest(config, ["composerJson"], state, packageConfig, basePath);
2796
+ const manifest = mapPackageManifest(config, ["composerJson"], state, packageConfig, basePath);
2797
+ if (manifest) mapComposerRequirements(manifest, state, packageConfig);
2720
2798
  const packageName = takeString(config, ["packageName"], state, basePath);
2721
2799
  if (packageName !== void 0) packageConfig.packageName = packageName;
2722
2800
  return compact({
@@ -2724,6 +2802,20 @@ function mapPhp(config, state, packageConfig, basePath) {
2724
2802
  generateClientInterfaces: takeBoolean(config, ["generateClientInterfaces"], state, basePath)
2725
2803
  });
2726
2804
  }
2805
+ function mapComposerRequirements(manifest, state, packageConfig) {
2806
+ const fields = [
2807
+ ["require", "extraDependencies"],
2808
+ ["require-dev", "extraDevDependencies"]
2809
+ ];
2810
+ for (const [composerField, packageField] of fields) {
2811
+ const located = takeObject(manifest.value, [composerField], state, manifest.path);
2812
+ if (!located) continue;
2813
+ const dependencies = Object.entries(located.value).flatMap(
2814
+ ([name, dependency]) => mapDependency(name, dependency, state, [...located.path, name])
2815
+ );
2816
+ if (dependencies.length) packageConfig[packageField] = dependencies;
2817
+ }
2818
+ }
2727
2819
  function mapRuby(config, state, packageConfig, basePath) {
2728
2820
  const moduleName = takeString(config, ["moduleName"], state, basePath);
2729
2821
  if (moduleName !== void 0) packageConfig.moduleName = moduleName;
@@ -2893,28 +2985,52 @@ function takeCustomSections(value, language, activeLanguages, state, basePath) {
2893
2985
  }
2894
2986
  function mapPackageManifest(config, aliases, state, packageConfig, basePath) {
2895
2987
  const manifest = takeObject(config, aliases, state, basePath);
2896
- if (!manifest) return;
2988
+ if (!manifest) return void 0;
2897
2989
  const packageName = takeString(manifest.value, ["name"], state, manifest.path);
2898
2990
  const description = takeString(manifest.value, ["description"], state, manifest.path);
2991
+ const keywords = takeStringArray(manifest.value, ["keywords"], state, manifest.path);
2899
2992
  const license = takeString(manifest.value, ["license"], state, manifest.path);
2900
2993
  const author = takeObject(manifest.value, ["author"], state, manifest.path);
2901
2994
  const authorName = author ? takeString(author.value, ["name"], state, author.path) : void 0;
2902
- const authors = authorName && author ? [
2903
- compact({
2904
- name: authorName,
2905
- email: takeString(author.value, ["email"], state, author.path),
2906
- url: takeString(author.value, ["url"], state, author.path)
2907
- })
2908
- ] : void 0;
2995
+ const authors = [
2996
+ ...authorName && author ? [
2997
+ compact({
2998
+ name: authorName,
2999
+ email: takeString(author.value, ["email"], state, author.path),
3000
+ url: takeString(author.value, ["url"], state, author.path)
3001
+ })
3002
+ ] : [],
3003
+ ...takeManifestAuthors(manifest, state)
3004
+ ];
2909
3005
  Object.assign(
2910
3006
  packageConfig,
2911
3007
  compact({
2912
3008
  packageName,
2913
3009
  description,
2914
- authors,
3010
+ homepage: takeString(manifest.value, ["homepage"], state, manifest.path),
3011
+ keywords,
3012
+ authors: authors.length ? authors : void 0,
2915
3013
  license: license ? { type: license } : void 0
2916
3014
  })
2917
3015
  );
3016
+ return manifest;
3017
+ }
3018
+ function takeManifestAuthors(manifest, state) {
3019
+ const located = locate(manifest.value, ["authors"], manifest.path);
3020
+ if (!located || !Array.isArray(located.value)) return [];
3021
+ return located.value.flatMap((entry, index) => {
3022
+ if (!isObject(entry)) return [];
3023
+ const path = [...located.path, index];
3024
+ const name = takeString(entry, ["name"], state, path);
3025
+ if (!name) return [];
3026
+ return [
3027
+ compact({
3028
+ name,
3029
+ email: takeString(entry, ["email"], state, path),
3030
+ url: takeString(entry, ["url"], state, path)
3031
+ })
3032
+ ];
3033
+ });
2918
3034
  }
2919
3035
  function takePythonAdditionalInitExports(config, state, basePath) {
2920
3036
  const located = locate(config, ["additionalInitExports"], basePath);
@@ -3009,71 +3125,90 @@ function takeToolsets(value, aliases, state, basePath) {
3009
3125
  return Object.fromEntries(entries.filter((entry) => entry !== void 0));
3010
3126
  }
3011
3127
  var unsupportedFieldSchema = z.strictObject({
3012
- source: z.enum(["fern", "postman", "sdk-config-ir"]),
3013
- path: z.array(z.union([nonEmptyStringSchema, z.number().int().nonnegative()])).min(1),
3014
- code: nonEmptyStringSchema.optional(),
3015
- reason: nonEmptyStringSchema,
3016
- severity: z.enum(["error", "warning", "info"]),
3017
- risk: z.enum(["high", "medium", "low"]),
3018
- owner: nonEmptyStringSchema,
3019
- suggestedAction: nonEmptyStringSchema
3128
+ source: z.enum(["fern", "postman", "sdk-config-ir"]).describe("The configuration surface containing the unsupported field."),
3129
+ path: z.array(z.union([nonEmptyStringSchema, z.number().int().nonnegative()])).min(1).describe("The property path to the unsupported field in its source configuration."),
3130
+ code: nonEmptyStringSchema.optional().describe("A stable diagnostic code for the unsupported field."),
3131
+ reason: nonEmptyStringSchema.describe(
3132
+ "Why the field could not be represented in normalized configuration."
3133
+ ),
3134
+ severity: z.enum(["error", "warning", "info"]).describe("The diagnostic severity."),
3135
+ risk: z.enum(["high", "medium", "low"]).describe("The migration risk of omitting this field."),
3136
+ owner: nonEmptyStringSchema.describe("The component or team responsible for resolving the gap."),
3137
+ suggestedAction: nonEmptyStringSchema.describe(
3138
+ "Recommended action for preserving the intended behavior."
3139
+ )
3020
3140
  });
3021
3141
  var postmanLegacyInputSchema = z.strictObject({
3022
- kind: z.literal("postman-build-parameters"),
3023
- value: jsonObjectSchema
3142
+ kind: z.literal("postman-build-parameters").describe("Identifies legacy Postman build parameters."),
3143
+ value: jsonObjectSchema.describe("A debugging copy of the original Postman build parameters.")
3024
3144
  });
3025
3145
  var fernLegacyInputSchema = z.strictObject({
3026
- kind: z.literal("fern-generator-invocation"),
3027
- value: jsonObjectSchema
3146
+ kind: z.literal("fern-generator-invocation").describe("Identifies a legacy Fern generator invocation."),
3147
+ value: jsonObjectSchema.describe("A debugging copy of the original Fern generator invocation.")
3028
3148
  });
3029
3149
  var legacyInputSchema = z.discriminatedUnion("kind", [
3030
3150
  postmanLegacyInputSchema,
3031
3151
  fernLegacyInputSchema
3032
3152
  ]);
3033
3153
  var compatibilityConfigSchema = z.strictObject({
3034
- outputProfile: z.enum(["converged", "postman-legacy", "fern-legacy"]),
3035
- legacyInput: legacyInputSchema.optional(),
3036
- unsupportedFields: z.array(unsupportedFieldSchema).optional()
3154
+ outputProfile: z.enum(["converged", "postman-legacy", "fern-legacy"]).describe("The output-default profile retained while legacy producers converge."),
3155
+ legacyInput: legacyInputSchema.optional().describe("Original producer input retained only for migration debugging."),
3156
+ unsupportedFields: z.array(unsupportedFieldSchema).optional().describe("Legacy fields that could not be represented in normalized configuration.")
3037
3157
  });
3038
3158
  var generationAssetSchema = z.discriminatedUnion("type", [
3039
- z.strictObject({ type: z.literal("path"), location: relativePathSchema }),
3040
- z.strictObject({ type: z.literal("url"), location: nonEmptyStringSchema }),
3041
- z.strictObject({ type: z.literal("artifact"), location: nonEmptyStringSchema })
3159
+ z.strictObject({
3160
+ type: z.literal("path").describe("Loads the generation asset from a relative path."),
3161
+ location: relativePathSchema.describe("The relative path to the generation asset.")
3162
+ }),
3163
+ z.strictObject({
3164
+ type: z.literal("url").describe("Loads the generation asset from a URL."),
3165
+ location: nonEmptyStringSchema.describe("The URL of the generation asset.")
3166
+ }),
3167
+ z.strictObject({
3168
+ type: z.literal("artifact").describe("Loads the generation asset from stored build output."),
3169
+ location: nonEmptyStringSchema.describe("The artifact identifier or location.")
3170
+ })
3042
3171
  ]);
3043
- var hookDependencySchema2 = z.strictObject({
3044
- name: nonEmptyStringSchema,
3045
- version: nonEmptyStringSchema,
3046
- groupId: nonEmptyStringSchema.optional()
3172
+ var hookDependencySchema = z.strictObject({
3173
+ name: nonEmptyStringSchema.describe("The hook dependency name."),
3174
+ version: nonEmptyStringSchema.describe("The hook dependency version requirement."),
3175
+ groupId: nonEmptyStringSchema.optional().describe("The Maven group identifier for the dependency.")
3047
3176
  });
3048
- var hooksConfigSchema2 = z.strictObject({
3049
- enabled: z.boolean(),
3050
- source: generationAssetSchema.optional(),
3051
- dependencies: z.array(hookDependencySchema2).optional()
3177
+ var hooksConfigSchema = z.strictObject({
3178
+ enabled: z.boolean().describe("Whether custom request and response hooks are generated."),
3179
+ source: generationAssetSchema.optional().describe("The source containing custom hook implementations."),
3180
+ dependencies: z.array(hookDependencySchema).optional().describe("Dependencies required by custom hooks.")
3052
3181
  });
3053
3182
  var customCodeConfigSchema2 = z.strictObject({
3054
- enabled: z.boolean(),
3055
- source: generationAssetSchema.optional(),
3056
- conflictStrategy: z.enum(["mark", "ours", "theirs"]).optional(),
3057
- trackChanges: z.boolean().optional(),
3058
- previousBuildId: z.number().int().positive().optional(),
3059
- protectedFiles: z.array(nonEmptyStringSchema).optional()
3183
+ enabled: z.boolean().describe("Whether customer-authored code is merged into generated output."),
3184
+ source: generationAssetSchema.optional().describe("The source containing customer-authored code."),
3185
+ conflictStrategy: z.enum(["mark", "ours", "theirs"]).optional().describe("How merge conflicts between generated and custom code are handled."),
3186
+ trackChanges: z.boolean().optional().describe("Whether custom-code changes are tracked between builds."),
3187
+ previousBuildId: z.number().int().positive().optional().describe("The previous build used as the merge baseline."),
3188
+ protectedFiles: z.array(nonEmptyStringSchema).optional().describe("Generated file paths that custom-code merging must not overwrite.")
3060
3189
  });
3061
- var workflowConfigSchema2 = z.strictObject({
3062
- path: relativePathSchema,
3063
- outputName: nonEmptyStringSchema.optional()
3190
+ var workflowConfigSchema = z.strictObject({
3191
+ path: relativePathSchema.describe("The relative path to the workflow definition."),
3192
+ outputName: nonEmptyStringSchema.optional().describe("The file name used for the generated workflow.")
3064
3193
  });
3065
3194
  var analyticsHeaderSchema2 = z.union([
3066
- z.strictObject({ name: nonEmptyStringSchema, value: z.string() }),
3067
- z.strictObject({ name: nonEmptyStringSchema, valueRef: nonEmptyStringSchema })
3195
+ z.strictObject({
3196
+ name: nonEmptyStringSchema.describe("The exported telemetry header name."),
3197
+ value: z.string().describe("The literal telemetry header value.")
3198
+ }),
3199
+ z.strictObject({
3200
+ name: nonEmptyStringSchema.describe("The exported telemetry header name."),
3201
+ valueRef: nonEmptyStringSchema.describe("A reference to the telemetry header value.")
3202
+ })
3068
3203
  ]);
3069
3204
  var analyticsConfigSchema2 = z.strictObject({
3070
- enabled: z.boolean(),
3071
- endpoint: nonEmptyStringSchema.optional(),
3072
- exporter: z.enum(["otlp-http", "console"]).optional(),
3073
- headers: z.array(analyticsHeaderSchema2).optional(),
3074
- batchSize: z.number().int().positive().optional(),
3075
- scheduledDelayMs: z.number().nonnegative().optional(),
3076
- exportTimeoutMs: z.number().nonnegative().optional()
3205
+ enabled: z.boolean().describe("Whether generated clients export usage telemetry."),
3206
+ endpoint: nonEmptyStringSchema.optional().describe("The telemetry export endpoint."),
3207
+ exporter: z.enum(["otlp-http", "console"]).optional().describe("The telemetry exporter implementation."),
3208
+ headers: z.array(analyticsHeaderSchema2).optional().describe("Headers sent by the telemetry exporter."),
3209
+ batchSize: z.number().int().positive().optional().describe("The maximum spans in each export batch."),
3210
+ scheduledDelayMs: z.number().nonnegative().optional().describe("The delay between scheduled exports, in milliseconds."),
3211
+ exportTimeoutMs: z.number().nonnegative().optional().describe("The maximum time allowed for an export, in milliseconds.")
3077
3212
  }).superRefine(({ enabled, endpoint }, context) => {
3078
3213
  if (enabled && endpoint === void 0) {
3079
3214
  context.addIssue({
@@ -3084,91 +3219,93 @@ var analyticsConfigSchema2 = z.strictObject({
3084
3219
  }
3085
3220
  });
3086
3221
  var wireTestsSchema2 = z.strictObject({
3087
- enabled: z.boolean(),
3088
- exclusions: z.array(nonEmptyStringSchema).optional(),
3089
- fallbackToGeneratedErrorExamples: z.boolean().optional(),
3090
- fixtureSource: z.enum(["synthetic", "recorded", "auto"]).optional()
3222
+ enabled: z.boolean().describe("Whether wire-level request and response tests are generated."),
3223
+ exclusions: z.array(nonEmptyStringSchema).optional().describe("Operations excluded from wire tests."),
3224
+ fallbackToGeneratedErrorExamples: z.boolean().optional().describe("Whether missing error fixtures are synthesized from generated examples."),
3225
+ fixtureSource: z.enum(["synthetic", "recorded", "auto"]).optional().describe("Where wire-test fixtures are obtained.")
3091
3226
  });
3092
3227
  var unitTestsSchema2 = z.strictObject({
3093
- enabled: z.boolean(),
3094
- mode: z.enum(["core-runtime", "schema-driven", "both"]).optional(),
3095
- exclusions: z.array(nonEmptyStringSchema).optional()
3228
+ enabled: z.boolean().describe("Whether SDK unit tests are generated."),
3229
+ mode: z.enum(["core-runtime", "schema-driven", "both"]).optional().describe("The unit-test generation strategy."),
3230
+ exclusions: z.array(nonEmptyStringSchema).optional().describe("Operations excluded from unit tests.")
3096
3231
  });
3097
3232
  var fernDefinitionMetadataSchema = z.strictObject({
3098
- definitionS3DownloadUrl: nonEmptyStringSchema,
3099
- outputPath: nonEmptyStringSchema.optional(),
3100
- cliVersion: nonEmptyStringSchema.optional()
3233
+ definitionS3DownloadUrl: nonEmptyStringSchema.describe(
3234
+ "The download URL for the materialized Fern definition archive."
3235
+ ),
3236
+ outputPath: nonEmptyStringSchema.optional().describe("The destination path for Fern definition support files."),
3237
+ cliVersion: nonEmptyStringSchema.optional().describe("The Fern CLI version associated with the definition.")
3101
3238
  });
3102
3239
  var streamsSchema2 = z.strictObject({
3103
- enabled: z.boolean(),
3104
- responseType: z.enum(["wrapper", "native", "web"]).optional(),
3105
- fileResponseType: z.enum(["stream", "binary-response"]).optional(),
3106
- defaultChunkSizeBytes: z.number().int().positive().optional()
3240
+ enabled: z.boolean().describe("Whether generated clients expose streaming response APIs."),
3241
+ responseType: z.enum(["wrapper", "native", "web"]).optional().describe("The streaming response abstraction exposed by generated clients."),
3242
+ fileResponseType: z.enum(["stream", "binary-response"]).optional().describe("The response type used for file downloads."),
3243
+ defaultChunkSizeBytes: z.number().int().positive().optional().describe("The default number of bytes yielded by streaming iterators.")
3107
3244
  });
3108
3245
  var layoutConfigSchema2 = z.strictObject({
3109
- outputDirectory: z.enum(["project-root", "source-root"]).optional(),
3110
- packagePath: nonEmptyStringSchema.optional()
3246
+ outputDirectory: z.enum(["project-root", "source-root"]).optional().describe("Whether generated source is rooted at the project or its source directory."),
3247
+ packagePath: nonEmptyStringSchema.optional().describe("The package-relative path for generated source files.")
3111
3248
  });
3112
3249
  var serializationConfigSchema2 = z.strictObject({
3113
- enumRepresentation: z.enum(["enum", "union", "literal", "forward-compatible-enum", "language-default"]).optional(),
3114
- additionalProperties: z.enum(["allow", "forbid", "ignore", "language-default"]).optional(),
3115
- inlineTypes: z.boolean().optional(),
3116
- omitUndefined: z.boolean().optional()
3250
+ enumRepresentation: z.enum(["enum", "union", "literal", "forward-compatible-enum", "language-default"]).optional().describe("How schema enums are represented in generated code."),
3251
+ additionalProperties: z.enum(["allow", "forbid", "ignore", "language-default"]).optional().describe("How undeclared object properties are handled."),
3252
+ inlineTypes: z.boolean().optional().describe("Whether inline schemas remain nested under their parent types."),
3253
+ omitUndefined: z.boolean().optional().describe("Whether undefined properties are omitted during serialization.")
3117
3254
  });
3118
3255
  var languageGenerationConfigSchema = z.strictObject({
3119
- typescript: typescriptGenerationConfigSchema.optional(),
3120
- python: pythonGenerationConfigSchema.optional(),
3121
- java: javaGenerationConfigSchema.optional(),
3122
- kotlin: kotlinGenerationConfigSchema.optional(),
3123
- go: goGenerationConfigSchema.optional(),
3124
- csharp: csharpGenerationConfigSchema.optional(),
3125
- php: phpGenerationConfigSchema.optional(),
3126
- ruby: rubyGenerationConfigSchema.optional(),
3127
- rust: rustGenerationConfigSchema.optional(),
3128
- cli: cliGenerationConfigSchema.optional(),
3129
- mcp: mcpGenerationConfigSchema.optional(),
3130
- swift: swiftGenerationConfigSchema.optional(),
3131
- terraform: terraformGenerationConfigSchema.optional()
3256
+ typescript: typescriptGenerationConfigSchema.optional().describe("TypeScript-specific generation settings."),
3257
+ python: pythonGenerationConfigSchema.optional().describe("Python-specific generation settings."),
3258
+ java: javaGenerationConfigSchema.optional().describe("Java-specific generation settings."),
3259
+ kotlin: kotlinGenerationConfigSchema.optional().describe("Kotlin-specific generation settings."),
3260
+ go: goGenerationConfigSchema.optional().describe("Go-specific generation settings."),
3261
+ csharp: csharpGenerationConfigSchema.optional().describe("C#-specific generation settings."),
3262
+ php: phpGenerationConfigSchema.optional().describe("PHP-specific generation settings."),
3263
+ ruby: rubyGenerationConfigSchema.optional().describe("Ruby-specific generation settings."),
3264
+ rust: rustGenerationConfigSchema.optional().describe("Rust-specific generation settings."),
3265
+ cli: cliGenerationConfigSchema.optional().describe("CLI-specific generation settings."),
3266
+ mcp: mcpGenerationConfigSchema.optional().describe("MCP-specific generation settings."),
3267
+ swift: swiftGenerationConfigSchema.optional().describe("Swift-specific generation settings."),
3268
+ terraform: terraformGenerationConfigSchema.optional().describe("Terraform-specific generation settings.")
3132
3269
  });
3133
3270
  var generationConfigSchema = z.strictObject({
3134
- includeWatermark: z.boolean().default(false),
3271
+ includeWatermark: z.boolean().default(false).describe("Whether generated files include a generator watermark."),
3135
3272
  /** Emits an AI service into the generated SDK. Python, Java and TypeScript honour it. */
3136
- ai: z.boolean().default(false),
3137
- includeOptionalSnippetParameters: z.boolean().optional(),
3138
- buildAllModels: z.boolean().default(false),
3139
- inferServiceNames: z.boolean().default(false),
3140
- includeDeprecatedOperations: z.boolean().default(true),
3141
- multipleResponses: z.boolean().default(false),
3273
+ ai: z.boolean().default(false).describe("Whether the SDK includes generated AI service helpers."),
3274
+ includeOptionalSnippetParameters: z.boolean().optional().describe("Whether usage snippets include optional request parameters."),
3275
+ buildAllModels: z.boolean().default(false).describe("Whether models not referenced by operations are also generated."),
3276
+ inferServiceNames: z.boolean().default(false).describe("Whether service names are inferred from API structure."),
3277
+ includeDeprecatedOperations: z.boolean().default(true).describe("Whether deprecated API operations are generated."),
3278
+ multipleResponses: z.boolean().default(false).describe("Whether operations model multiple successful response types."),
3142
3279
  /** Generate the entire SDK project, including package manifests and publishable artifacts. */
3143
- generateFullProject: z.boolean().default(false),
3144
- devContainer: z.boolean().default(false),
3145
- allowMockClient: z.boolean().default(false),
3146
- ignoreFiles: z.array(nonEmptyStringSchema).optional(),
3280
+ generateFullProject: z.boolean().default(false).describe("Whether generation emits a complete publishable project."),
3281
+ devContainer: z.boolean().default(false).describe("Whether development-container configuration is generated."),
3282
+ allowMockClient: z.boolean().default(false).describe("Whether a mock API client is included in the generated SDK."),
3283
+ ignoreFiles: z.array(nonEmptyStringSchema).optional().describe("Generated paths excluded from the final output."),
3147
3284
  /**
3148
3285
  * Raw .fernignore file contents supplied to external publishers that need Fern ignore semantics.
3149
3286
  * This is separate from generation.ignoreFiles because raw contents preserve comments, ordering,
3150
3287
  * blank lines, and negation rules.
3151
3288
  */
3152
- fernignoreContents: z.string().optional(),
3289
+ fernignoreContents: z.string().optional().describe("The raw .fernignore contents retained for external publishers."),
3153
3290
  /**
3154
3291
  * Optional Fern definition metadata for publisher paths that need to write definition or
3155
3292
  * mock-server support files. This is not required for core GitHub artifact publishing.
3156
3293
  */
3157
- fernDefinitionMetadata: fernDefinitionMetadataSchema.optional(),
3158
- reservedKeywords: z.array(nonEmptyStringSchema).optional(),
3159
- hooks: hooksConfigSchema2.optional(),
3160
- customCode: customCodeConfigSchema2.optional(),
3161
- workflows: z.array(workflowConfigSchema2).optional(),
3162
- customQueryPaths: z.array(relativePathSchema).optional(),
3163
- analytics: analyticsConfigSchema2.optional(),
3164
- wireTests: wireTestsSchema2.optional(),
3165
- unitTests: unitTestsSchema2.optional(),
3166
- webSockets: z.boolean().optional(),
3167
- streams: streamsSchema2.optional(),
3168
- naming: namingConfigSchema.optional(),
3169
- layout: layoutConfigSchema2.optional(),
3170
- serialization: serializationConfigSchema2.optional(),
3171
- language: languageGenerationConfigSchema.optional()
3294
+ fernDefinitionMetadata: fernDefinitionMetadataSchema.optional().describe("Materialized Fern definition metadata used by external publishers."),
3295
+ reservedKeywords: z.array(nonEmptyStringSchema).optional().describe("Additional identifiers treated as reserved words."),
3296
+ hooks: hooksConfigSchema.optional().describe("Custom SDK request and response hook configuration."),
3297
+ customCode: customCodeConfigSchema2.optional().describe("Customer-authored code merge configuration."),
3298
+ workflows: z.array(workflowConfigSchema).optional().describe("Workflow definitions included in generated output."),
3299
+ customQueryPaths: z.array(relativePathSchema).optional().describe("Relative paths to custom query definitions."),
3300
+ analytics: analyticsConfigSchema2.optional().describe("Generated client telemetry configuration."),
3301
+ wireTests: wireTestsSchema2.optional().describe("Wire-level request and response test generation."),
3302
+ unitTests: unitTestsSchema2.optional().describe("SDK unit-test generation."),
3303
+ webSockets: z.boolean().optional().describe("Whether WebSocket clients are generated for supported channels."),
3304
+ streams: streamsSchema2.optional().describe("Streaming response generation behavior."),
3305
+ naming: namingConfigSchema.optional().describe("Names and casing used by generated code."),
3306
+ layout: layoutConfigSchema2.optional().describe("Generated project and source layout."),
3307
+ serialization: serializationConfigSchema2.optional().describe("Generated model serialization behavior."),
3308
+ language: languageGenerationConfigSchema.optional().describe("Settings specific to the selected target language.")
3172
3309
  });
3173
3310
  var publishRegistrySchema = z.enum([
3174
3311
  "npm",
@@ -3186,154 +3323,160 @@ var credentialResolutionSchema = z.enum([
3186
3323
  "resolved-by-fiddle"
3187
3324
  ]);
3188
3325
  var registryCredentialsSchema = z.strictObject({
3189
- username: nonEmptyStringSchema.optional(),
3190
- password: nonEmptyStringSchema.optional(),
3191
- token: nonEmptyStringSchema.optional(),
3192
- apiKey: nonEmptyStringSchema.optional()
3326
+ username: nonEmptyStringSchema.optional().describe("The resolved credential username."),
3327
+ password: nonEmptyStringSchema.optional().describe("The resolved credential password."),
3328
+ token: nonEmptyStringSchema.optional().describe("The resolved credential token."),
3329
+ apiKey: nonEmptyStringSchema.optional().describe("The resolved credential API key.")
3193
3330
  });
3194
3331
  var commonPublishShape2 = {
3195
- url: nonEmptyStringSchema.optional(),
3332
+ url: nonEmptyStringSchema.optional().describe("A custom package registry URL."),
3196
3333
  /** Reference to registry publishing credentials. */
3197
- credentialsRef: nonEmptyStringSchema.optional(),
3334
+ credentialsRef: nonEmptyStringSchema.optional().describe("A reference to registry publishing credentials."),
3198
3335
  /** Raw registry credentials. These values can be sensitive and must be handled as secrets. */
3199
- credentials: registryCredentialsSchema.optional(),
3336
+ credentials: registryCredentialsSchema.optional().describe("Resolved registry publishing credentials."),
3200
3337
  /**
3201
3338
  * Registry-specific package version override. If omitted, the external publisher/orchestrator may
3202
3339
  * fall back to target.sdkVersion.
3203
3340
  */
3204
- version: nonEmptyStringSchema.optional(),
3205
- releaseBranch: nonEmptyStringSchema.optional(),
3206
- tolerateRepublish: z.boolean().optional(),
3341
+ version: nonEmptyStringSchema.optional().describe("A registry-specific package version override."),
3342
+ releaseBranch: nonEmptyStringSchema.optional().describe("The branch used by generated package release workflows."),
3343
+ tolerateRepublish: z.boolean().optional().describe("Whether publishing succeeds when this package version already exists."),
3207
3344
  /** Generate registry publishing workflow files when publishing through GitHub delivery. */
3208
- shouldGeneratePublishWorkflow: z.boolean().optional()
3345
+ shouldGeneratePublishWorkflow: z.boolean().optional().describe("Whether GitHub delivery includes a registry publishing workflow.")
3209
3346
  };
3210
3347
  var trustedPublishingShape = {
3211
3348
  /** Use registry trusted publishing / OIDC instead of a static token secret. */
3212
- trustedPublishing: z.boolean().optional()
3349
+ trustedPublishing: z.boolean().optional().describe("Whether registry publication uses trusted publishing or OIDC.")
3213
3350
  };
3214
3351
  var mavenCoordinateSchema = nonEmptyStringSchema.regex(
3215
3352
  /^[A-Za-z0-9_.-]+:[A-Za-z0-9_.-]+$/,
3216
3353
  "Maven coordinate must be in groupId:artifactId form"
3217
3354
  );
3218
3355
  var mavenSignatureEnvironmentSchema = z.strictObject({
3219
- keyIdEnvironmentVariable: nonEmptyStringSchema.optional(),
3220
- passwordEnvironmentVariable: nonEmptyStringSchema.optional(),
3221
- secretKeyEnvironmentVariable: nonEmptyStringSchema.optional()
3356
+ keyIdEnvironmentVariable: nonEmptyStringSchema.optional().describe("The environment variable containing the signing key ID."),
3357
+ passwordEnvironmentVariable: nonEmptyStringSchema.optional().describe("The environment variable containing the signing key password."),
3358
+ secretKeyEnvironmentVariable: nonEmptyStringSchema.optional().describe("The environment variable containing the armored secret key.")
3222
3359
  });
3223
3360
  var mavenSignatureSchema2 = z.strictObject({
3224
- keyId: nonEmptyStringSchema,
3225
- password: nonEmptyStringSchema,
3226
- secretKey: nonEmptyStringSchema
3361
+ keyId: nonEmptyStringSchema.describe("The resolved signing key identifier."),
3362
+ password: nonEmptyStringSchema.describe("The resolved signing key password."),
3363
+ secretKey: nonEmptyStringSchema.describe("The resolved armored secret key.")
3227
3364
  });
3228
3365
  var publishConfigSchema = z.discriminatedUnion("registry", [
3229
3366
  z.strictObject({
3230
- registry: z.literal("npm"),
3367
+ registry: z.literal("npm").describe("Publishes the package to an npm-compatible registry."),
3231
3368
  /** Environment variable name containing the npm registry token. */
3232
- tokenEnvironmentVariable: nonEmptyStringSchema.optional(),
3369
+ tokenEnvironmentVariable: nonEmptyStringSchema.optional().describe("The environment variable containing the npm registry token."),
3233
3370
  /** Write npm package metadata as private when the publisher creates/updates package.json. */
3234
- isPackagePrivate: z.boolean().optional(),
3371
+ isPackagePrivate: z.boolean().optional().describe("Whether generated npm package metadata marks the package as private."),
3235
3372
  /** Also publish the TypeScript package to JSR from the npm publishing path. */
3236
- publishToJsr: z.boolean().optional(),
3373
+ publishToJsr: z.boolean().optional().describe("Whether the npm publishing flow also publishes the package to JSR."),
3237
3374
  ...trustedPublishingShape,
3238
3375
  ...commonPublishShape2
3239
3376
  }),
3240
3377
  z.strictObject({
3241
- registry: z.literal("pypi"),
3242
- usernameEnvironmentVariable: nonEmptyStringSchema.optional(),
3243
- passwordEnvironmentVariable: nonEmptyStringSchema.optional(),
3378
+ registry: z.literal("pypi").describe("Publishes the package to a PyPI-compatible registry."),
3379
+ usernameEnvironmentVariable: nonEmptyStringSchema.optional().describe("The environment variable containing the PyPI username."),
3380
+ passwordEnvironmentVariable: nonEmptyStringSchema.optional().describe("The environment variable containing the PyPI password or token."),
3244
3381
  ...trustedPublishingShape,
3245
3382
  ...commonPublishShape2
3246
3383
  }),
3247
3384
  z.strictObject({
3248
- registry: z.literal("nuget"),
3249
- apiKeyEnvironmentVariable: nonEmptyStringSchema.optional(),
3385
+ registry: z.literal("nuget").describe("Publishes the package to a NuGet-compatible registry."),
3386
+ apiKeyEnvironmentVariable: nonEmptyStringSchema.optional().describe("The environment variable containing the NuGet API key."),
3250
3387
  ...trustedPublishingShape,
3251
3388
  ...commonPublishShape2
3252
3389
  }),
3253
3390
  z.strictObject({
3254
- registry: z.literal("rubygems"),
3255
- apiKeyEnvironmentVariable: nonEmptyStringSchema.optional(),
3391
+ registry: z.literal("rubygems").describe("Publishes the package to a RubyGems-compatible registry."),
3392
+ apiKeyEnvironmentVariable: nonEmptyStringSchema.optional().describe("The environment variable containing the RubyGems API key."),
3393
+ ...commonPublishShape2
3394
+ }),
3395
+ z.strictObject({
3396
+ registry: z.literal("crates").describe("Publishes the crate to a Cargo-compatible registry."),
3397
+ tokenEnvironmentVariable: nonEmptyStringSchema.optional().describe("The environment variable containing the Cargo registry token."),
3398
+ ...commonPublishShape2
3399
+ }),
3400
+ z.strictObject({
3401
+ registry: z.literal("go").describe("Publishes the SDK as a Go module."),
3256
3402
  ...commonPublishShape2
3257
3403
  }),
3258
3404
  z.strictObject({
3259
- registry: z.literal("crates"),
3260
- tokenEnvironmentVariable: nonEmptyStringSchema.optional(),
3405
+ registry: z.literal("composer").describe("Publishes the package to a Composer-compatible registry."),
3261
3406
  ...commonPublishShape2
3262
3407
  }),
3263
- z.strictObject({ registry: z.literal("go"), ...commonPublishShape2 }),
3264
- z.strictObject({ registry: z.literal("composer"), ...commonPublishShape2 }),
3265
3408
  z.strictObject({
3266
- registry: z.literal("maven"),
3409
+ registry: z.literal("maven").describe("Publishes the package to a Maven-compatible repository."),
3267
3410
  /** Maven coordinate in groupId:artifactId form when consumers need the combined value. */
3268
- coordinate: mavenCoordinateSchema.optional(),
3269
- usernameEnvironmentVariable: nonEmptyStringSchema.optional(),
3270
- passwordEnvironmentVariable: nonEmptyStringSchema.optional(),
3271
- mavenUrlEnvironmentVariable: nonEmptyStringSchema.optional(),
3272
- signatureEnvironmentVariables: mavenSignatureEnvironmentSchema.optional(),
3411
+ coordinate: mavenCoordinateSchema.optional().describe("The Maven coordinate in groupId:artifactId form."),
3412
+ usernameEnvironmentVariable: nonEmptyStringSchema.optional().describe("The environment variable containing the Maven username."),
3413
+ passwordEnvironmentVariable: nonEmptyStringSchema.optional().describe("The environment variable containing the Maven password."),
3414
+ mavenUrlEnvironmentVariable: nonEmptyStringSchema.optional().describe("The environment variable containing the Maven repository URL."),
3415
+ signatureEnvironmentVariables: mavenSignatureEnvironmentSchema.optional().describe("Environment variables containing Maven signing material."),
3273
3416
  /** Reference to Maven signing credentials. */
3274
- signingCredentialsRef: nonEmptyStringSchema.optional(),
3417
+ signingCredentialsRef: nonEmptyStringSchema.optional().describe("A reference to Maven signing credentials."),
3275
3418
  /** Raw Maven signing material. These values can be sensitive and must be handled as secrets. */
3276
- signature: mavenSignatureSchema2.optional(),
3419
+ signature: mavenSignatureSchema2.optional().describe("Resolved Maven signing material."),
3277
3420
  ...commonPublishShape2
3278
3421
  })
3279
3422
  ]);
3280
3423
  var reviewersSchema2 = z.strictObject({
3281
- teams: z.array(nonEmptyStringSchema).optional(),
3282
- users: z.array(nonEmptyStringSchema).optional()
3424
+ teams: z.array(nonEmptyStringSchema).optional().describe("GitHub teams requested as reviewers."),
3425
+ users: z.array(nonEmptyStringSchema).optional().describe("GitHub users requested as reviewers.")
3283
3426
  });
3284
3427
  var replayControlSchema = z.strictObject({
3285
- enabled: z.boolean()
3428
+ enabled: z.boolean().describe("Whether regeneration reapplies customer-authored repository changes.")
3286
3429
  });
3287
3430
  var githubLicenseSchema = z.strictObject({
3288
3431
  /** SPDX identifier or license key for the repository license (for example, "MIT"). */
3289
- type: nonEmptyStringSchema.optional(),
3432
+ type: nonEmptyStringSchema.optional().describe("The SPDX identifier or license key for the repository license."),
3290
3433
  /** Path to a custom license file to be committed into the GitHub repository. */
3291
- customPath: nonEmptyStringSchema.optional()
3434
+ customPath: nonEmptyStringSchema.optional().describe("The path to a custom license file committed to the repository.")
3292
3435
  }).refine((value) => value.type !== void 0 || value.customPath !== void 0, {
3293
3436
  message: "GitHub license must set type or customPath"
3294
3437
  });
3295
3438
  var githubOutputSchema2 = z.strictObject({
3296
- repository: nonEmptyStringSchema,
3297
- host: nonEmptyStringSchema.optional(),
3298
- branch: nonEmptyStringSchema.optional(),
3299
- mode: z.enum(["release", "pull-request", "push", "commit", "commit-and-release"]).optional(),
3300
- reviewers: reviewersSchema2.optional(),
3439
+ repository: nonEmptyStringSchema.describe("The GitHub repository that receives generated files."),
3440
+ host: nonEmptyStringSchema.optional().describe("The GitHub host for enterprise installations."),
3441
+ branch: nonEmptyStringSchema.optional().describe("The target branch for generated changes."),
3442
+ mode: z.enum(["release", "pull-request", "push", "commit", "commit-and-release"]).optional().describe("How generated changes are delivered to the repository."),
3443
+ reviewers: reviewersSchema2.optional().describe("Reviewers requested for generated pull requests."),
3301
3444
  /** Reference to GitHub credentials. */
3302
- credentialsRef: nonEmptyStringSchema.optional(),
3445
+ credentialsRef: nonEmptyStringSchema.optional().describe("A reference to GitHub credentials."),
3303
3446
  /** Raw GitHub credentials. These values can be sensitive and must be handled as secrets. */
3304
- credentials: registryCredentialsSchema.optional(),
3305
- privateRepository: z.boolean().optional(),
3447
+ credentials: registryCredentialsSchema.optional().describe("Resolved GitHub credentials."),
3448
+ privateRepository: z.boolean().optional().describe("Whether the destination repository is private."),
3306
3449
  /** GitHub license block scoped to repository delivery. */
3307
- license: githubLicenseSchema.optional(),
3450
+ license: githubLicenseSchema.optional().describe("License configuration for the destination repository."),
3308
3451
  /** GitHub replay control. If omitted, the external publisher applies its default behavior. */
3309
- replay: replayControlSchema.optional(),
3452
+ replay: replayControlSchema.optional().describe("Replay behavior for the external GitHub publisher."),
3310
3453
  /** Run GitHub publishing verification. Defaults to false to match current Fiddle job behavior. */
3311
- verify: z.boolean().default(false),
3454
+ verify: z.boolean().default(false).describe("Whether the GitHub publisher verifies the generated result."),
3312
3455
  /** Skip creating/updating a GitHub PR when no files changed. Defaults to false. */
3313
- skipIfNoDiff: z.boolean().default(false),
3456
+ skipIfNoDiff: z.boolean().default(false).describe("Whether GitHub publication is skipped when no generated files changed."),
3314
3457
  /** Automatically merge the GitHub publishing PR. Defaults to false. */
3315
- autoMerge: z.boolean().default(false)
3458
+ autoMerge: z.boolean().default(false).describe("Whether the GitHub publisher automatically merges its pull request.")
3316
3459
  });
3317
3460
  var credentialResolutionShape = {
3318
3461
  /** Where output credential references are resolved. */
3319
- credentialResolution: credentialResolutionSchema.default("refs-only")
3462
+ credentialResolution: credentialResolutionSchema.default("refs-only").describe("Where output credential references are resolved.")
3320
3463
  };
3321
3464
  var filesOutputSchema2 = z.strictObject({
3322
- delivery: z.literal("files"),
3323
- path: nonEmptyStringSchema.optional(),
3324
- publish: publishConfigSchema.optional(),
3465
+ delivery: z.literal("files").describe("Writes the generated SDK to a directory."),
3466
+ path: nonEmptyStringSchema.optional().describe("The destination directory for generated files."),
3467
+ publish: publishConfigSchema.optional().describe("Optional package registry publication."),
3325
3468
  ...credentialResolutionShape
3326
3469
  });
3327
3470
  var zipOutputSchema2 = z.strictObject({
3328
- delivery: z.literal("zip"),
3329
- fileName: nonEmptyStringSchema.optional(),
3330
- publish: publishConfigSchema.optional(),
3471
+ delivery: z.literal("zip").describe("Packages the generated SDK as a ZIP archive."),
3472
+ fileName: nonEmptyStringSchema.optional().describe("The generated ZIP archive file name."),
3473
+ publish: publishConfigSchema.optional().describe("Optional package registry publication."),
3331
3474
  ...credentialResolutionShape
3332
3475
  });
3333
3476
  var githubDeliverySchema2 = z.strictObject({
3334
- delivery: z.literal("github"),
3335
- github: githubOutputSchema2,
3336
- publish: publishConfigSchema.optional(),
3477
+ delivery: z.literal("github").describe("Delivers the generated SDK to GitHub."),
3478
+ github: githubOutputSchema2.describe("GitHub repository delivery settings."),
3479
+ publish: publishConfigSchema.optional().describe("Optional package registry publication."),
3337
3480
  ...credentialResolutionShape
3338
3481
  });
3339
3482
  var outputConfigSchema = z.discriminatedUnion(
@@ -3344,21 +3487,23 @@ var outputConfigSchema = z.discriminatedUnion(
3344
3487
  }
3345
3488
  );
3346
3489
  var replayConfigSchema = z.strictObject({
3347
- enabled: z.boolean()
3490
+ enabled: z.boolean().describe("Whether regeneration reapplies customer-authored repository changes.")
3348
3491
  });
3349
3492
  var sourceSpecConfigSchema = z.strictObject({
3350
- id: nonEmptyStringSchema.optional(),
3351
- name: nonEmptyStringSchema.optional(),
3352
- namespace: nonEmptyStringSchema.optional(),
3353
- specUrl: nonEmptyStringSchema,
3354
- specType: sourceSpecTypeSchema,
3355
- apiImportSettings: apiImportSettingsSchema.optional(),
3356
- overlays: z.array(nonEmptyStringSchema).optional(),
3357
- overrides: z.array(nonEmptyStringSchema).optional()
3493
+ id: nonEmptyStringSchema.optional().describe("A unique identifier for this API source."),
3494
+ name: nonEmptyStringSchema.optional().describe("A human-readable name for this API source."),
3495
+ namespace: nonEmptyStringSchema.optional().describe("A namespace used to isolate this source in a multi-source SDK."),
3496
+ specUrl: nonEmptyStringSchema.describe(
3497
+ "The materialized URL from which the generator retrieves the API source."
3498
+ ),
3499
+ specType: sourceSpecTypeSchema.describe("The API description format of this source."),
3500
+ apiImportSettings: apiImportSettingsSchema.optional().describe("Import behavior that overrides the source-level defaults for this spec."),
3501
+ overlays: z.array(nonEmptyStringSchema).optional().describe("Materialized overlays applied to this source in order."),
3502
+ overrides: z.array(nonEmptyStringSchema).optional().describe("Materialized source overrides applied in order.")
3358
3503
  });
3359
3504
  var sourceConfigSchema = z.strictObject({
3360
- specs: z.array(sourceSpecConfigSchema).min(1, "source.specs must contain at least one source spec"),
3361
- apiImportSettings: apiImportSettingsSchema.optional()
3505
+ specs: z.array(sourceSpecConfigSchema).min(1, "source.specs must contain at least one source spec").describe("Materialized API sources in authoritative processing order."),
3506
+ apiImportSettings: apiImportSettingsSchema.optional().describe("Default import behavior shared by every source spec.")
3362
3507
  }).superRefine(({ specs }, context) => {
3363
3508
  const seenIds = /* @__PURE__ */ new Set();
3364
3509
  specs.forEach(({ id }, index) => {
@@ -3390,25 +3535,27 @@ var targetLanguageSchema = z.enum([
3390
3535
  "terraform"
3391
3536
  ]);
3392
3537
  var targetConfigSchema = z.strictObject({
3393
- language: targetLanguageSchema,
3394
- generatorVersion: exactSemverSchema.optional(),
3395
- sourceOrigin: z.enum(["postman", "fern"]),
3396
- sdkName: nonEmptyStringSchema,
3538
+ language: targetLanguageSchema.describe(
3539
+ "The language or platform generated by this single-target request."
3540
+ ),
3541
+ generatorVersion: exactSemverSchema.optional().describe("The exact generator version requested for this target."),
3542
+ sourceOrigin: z.enum(["postman", "fern"]).describe("The configuration system from which this IR was normalized."),
3543
+ sdkName: nonEmptyStringSchema.describe("The name used for the generated SDK."),
3397
3544
  /**
3398
3545
  * Stable Fern/Fiddle API identity for external publishing.
3399
3546
  * Producers must set this explicitly for GitHub or registry publishing; it is not inferred from
3400
3547
  * target.sdkName because SDK display names and Fern API names are not equivalent.
3401
3548
  */
3402
- apiName: nonEmptyStringSchema.optional(),
3403
- organization: nonEmptyStringSchema.optional(),
3549
+ apiName: nonEmptyStringSchema.optional().describe("The stable API identity used for external publishing."),
3550
+ organization: nonEmptyStringSchema.optional().describe("Source organization metadata retained for generation."),
3404
3551
  /**
3405
3552
  * Stable Fern/Fiddle organization identity for external publishing.
3406
3553
  * Producers must set this explicitly for GitHub or registry publishing; it is not inferred from
3407
3554
  * target.organization because source organization metadata is optional and may not match Fern.
3408
3555
  */
3409
- organizationName: nonEmptyStringSchema.optional(),
3410
- sdkVersion: nonEmptyStringSchema.default("1.0.0"),
3411
- apiVersion: nonEmptyStringSchema.optional()
3556
+ organizationName: nonEmptyStringSchema.optional().describe("The stable organization identity used for external publishing."),
3557
+ sdkVersion: nonEmptyStringSchema.default("1.0.0").describe("The version of the generated SDK."),
3558
+ apiVersion: nonEmptyStringSchema.optional().describe("The version of the API represented by the SDK.")
3412
3559
  });
3413
3560
 
3414
3561
  // src/sdk-config-ir/v1/sdk-config-ir-v1.ts
@@ -3470,17 +3617,21 @@ function validatePublishingIdentity2(packageConfig, registry, context) {
3470
3617
  }
3471
3618
  }
3472
3619
  var sdkConfigIrV1Schema = z.strictObject({
3473
- schemaVersion: z.literal(SDK_CONFIG_IR_V1_SCHEMA_VERSION),
3474
- source: sourceConfigSchema,
3475
- target: targetConfigSchema,
3476
- api: apiConfigSchema,
3477
- client: clientConfigSchema,
3478
- package: packageConfigSchema,
3479
- output: outputConfigSchema,
3480
- replay: replayConfigSchema.optional(),
3481
- docs: docsConfigSchema,
3482
- generation: generationConfigSchema,
3483
- compatibility: compatibilityConfigSchema.optional()
3620
+ schemaVersion: z.literal(SDK_CONFIG_IR_V1_SCHEMA_VERSION).describe("The version of the normalized SDK Config IR schema."),
3621
+ source: sourceConfigSchema.describe("Materialized API descriptions consumed by generation."),
3622
+ target: targetConfigSchema.describe(
3623
+ "Identity and provenance for this single generation target."
3624
+ ),
3625
+ api: apiConfigSchema.describe("API behavior exposed by the generated SDK."),
3626
+ client: clientConfigSchema.describe("Behavior of the generated API client."),
3627
+ package: packageConfigSchema.describe("Package identity and metadata for the generated SDK."),
3628
+ output: outputConfigSchema.describe("Artifact delivery and optional package publication."),
3629
+ replay: replayConfigSchema.optional().describe("Generation replay behavior."),
3630
+ docs: docsConfigSchema.describe("Generated documentation settings."),
3631
+ generation: generationConfigSchema.describe(
3632
+ "Shared and language-specific generation behavior."
3633
+ ),
3634
+ compatibility: compatibilityConfigSchema.optional().describe("Temporary provenance and diagnostics retained during legacy migration.")
3484
3635
  }).superRefine(({ compatibility, generation, output, package: packageConfig, target }, context) => {
3485
3636
  const configuredLanguages = Object.keys(generation.language ?? {});
3486
3637
  const requiresExternalPublishIdentity = output.delivery === "github" || output.publish !== void 0;