@featureflip/mcp 0.1.11 → 0.1.13

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.
package/dist/cli.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { a as e, i as t, n, o as r, s as i, t as a } from "./org-c4iWMSzU.js";
1
+ import { a as e, i as t, n, o as r, s as i, t as a } from "./org-D-y_4-WG.js";
2
2
  import { serveStdio as o } from "@modelcontextprotocol/server/stdio";
3
3
  //#region src/unconfigured.ts
4
4
  var s = class extends i {
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,CAEhD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAqBpD;AAED,wBAAsB,GAAG,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAM5E"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,CAOhD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAqBpD;AAED,wBAAsB,GAAG,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAM5E"}
@@ -195,6 +195,8 @@ export interface paths {
195
195
  /** @description OK */
196
196
  200: {
197
197
  headers: {
198
+ /** @description Strong ETag of the resource. Send it back as If-Match on a PUT. */
199
+ ETag?: string;
198
200
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
199
201
  "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
200
202
  "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
@@ -251,7 +253,10 @@ export interface paths {
251
253
  put: {
252
254
  parameters: {
253
255
  query?: never;
254
- header?: never;
256
+ header?: {
257
+ /** @description Optional. The ETag from a GET of this resource. The write applies only if the resource still has that ETag; otherwise 412 `precondition_failed`. `*` or no header applies the write unconditionally. */
258
+ "If-Match"?: string;
259
+ };
255
260
  path: {
256
261
  org: string;
257
262
  project: string;
@@ -270,6 +275,8 @@ export interface paths {
270
275
  /** @description No Content */
271
276
  204: {
272
277
  headers: {
278
+ /** @description Strong ETag of the resource. Send it back as If-Match on a PUT. */
279
+ ETag?: string;
273
280
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
274
281
  "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
275
282
  "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
@@ -313,6 +320,18 @@ export interface paths {
313
320
  "application/json": components["schemas"]["PublicApiErrorEnvelope"];
314
321
  };
315
322
  };
323
+ /** @description The resource changed since the If-Match ETag. */
324
+ 412: {
325
+ headers: {
326
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
327
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
328
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
329
+ [name: string]: unknown;
330
+ };
331
+ content: {
332
+ "application/json": components["schemas"]["PublicApiErrorEnvelope"];
333
+ };
334
+ };
316
335
  /** @description Rate limit exceeded. Retry after the interval indicated by the Retry-After header. */
317
336
  429: {
318
337
  headers: {
@@ -752,6 +771,8 @@ export interface paths {
752
771
  /** @description OK */
753
772
  200: {
754
773
  headers: {
774
+ /** @description Strong ETag of the resource. Send it back as If-Match on a PUT. */
775
+ ETag?: string;
755
776
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
756
777
  "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
757
778
  "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
@@ -810,7 +831,10 @@ export interface paths {
810
831
  put: {
811
832
  parameters: {
812
833
  query?: never;
813
- header?: never;
834
+ header?: {
835
+ /** @description Optional. The ETag from a GET of this resource. The write applies only if the resource still has that ETag; otherwise 412 `precondition_failed`. `*` or no header applies the write unconditionally. */
836
+ "If-Match"?: string;
837
+ };
814
838
  path: {
815
839
  org: string;
816
840
  project: string;
@@ -829,6 +853,8 @@ export interface paths {
829
853
  /** @description No Content */
830
854
  204: {
831
855
  headers: {
856
+ /** @description Strong ETag of the resource. Send it back as If-Match on a PUT. */
857
+ ETag?: string;
832
858
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
833
859
  "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
834
860
  "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
@@ -872,6 +898,18 @@ export interface paths {
872
898
  "application/json": components["schemas"]["PublicApiErrorEnvelope"];
873
899
  };
874
900
  };
901
+ /** @description The resource changed since the If-Match ETag. */
902
+ 412: {
903
+ headers: {
904
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
905
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
906
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
907
+ [name: string]: unknown;
908
+ };
909
+ content: {
910
+ "application/json": components["schemas"]["PublicApiErrorEnvelope"];
911
+ };
912
+ };
875
913
  /** @description Rate limit exceeded. Retry after the interval indicated by the Retry-After header. */
876
914
  429: {
877
915
  headers: {
@@ -2075,6 +2113,8 @@ export interface paths {
2075
2113
  /** @description OK */
2076
2114
  200: {
2077
2115
  headers: {
2116
+ /** @description Strong ETag of the resource. Send it back as If-Match on a PUT. */
2117
+ ETag?: string;
2078
2118
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
2079
2119
  "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
2080
2120
  "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
@@ -2133,7 +2173,10 @@ export interface paths {
2133
2173
  put: {
2134
2174
  parameters: {
2135
2175
  query?: never;
2136
- header?: never;
2176
+ header?: {
2177
+ /** @description Optional. The ETag from a GET of this resource. The write applies only if the resource still has that ETag; otherwise 412 `precondition_failed`. `*` or no header applies the write unconditionally. */
2178
+ "If-Match"?: string;
2179
+ };
2137
2180
  path: {
2138
2181
  org: string;
2139
2182
  project: string;
@@ -2153,6 +2196,8 @@ export interface paths {
2153
2196
  /** @description No Content */
2154
2197
  204: {
2155
2198
  headers: {
2199
+ /** @description Strong ETag of the resource. Send it back as If-Match on a PUT. */
2200
+ ETag?: string;
2156
2201
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
2157
2202
  "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
2158
2203
  "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
@@ -2208,6 +2253,18 @@ export interface paths {
2208
2253
  "application/json": components["schemas"]["PublicApiErrorEnvelope"];
2209
2254
  };
2210
2255
  };
2256
+ /** @description The resource changed since the If-Match ETag. */
2257
+ 412: {
2258
+ headers: {
2259
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
2260
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
2261
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
2262
+ [name: string]: unknown;
2263
+ };
2264
+ content: {
2265
+ "application/json": components["schemas"]["PublicApiErrorEnvelope"];
2266
+ };
2267
+ };
2211
2268
  /** @description Rate limit exceeded. Retry after the interval indicated by the Retry-After header. */
2212
2269
  429: {
2213
2270
  headers: {
@@ -2375,6 +2432,8 @@ export interface paths {
2375
2432
  /** @description OK */
2376
2433
  200: {
2377
2434
  headers: {
2435
+ /** @description Strong ETag of the resource. Send it back as If-Match on a PUT. */
2436
+ ETag?: string;
2378
2437
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
2379
2438
  "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
2380
2439
  "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
@@ -2433,7 +2492,10 @@ export interface paths {
2433
2492
  put: {
2434
2493
  parameters: {
2435
2494
  query?: never;
2436
- header?: never;
2495
+ header?: {
2496
+ /** @description Optional. The ETag from a GET of this resource. The write applies only if the resource still has that ETag; otherwise 412 `precondition_failed`. `*` or no header applies the write unconditionally. */
2497
+ "If-Match"?: string;
2498
+ };
2437
2499
  path: {
2438
2500
  org: string;
2439
2501
  project: string;
@@ -2453,6 +2515,8 @@ export interface paths {
2453
2515
  /** @description No Content */
2454
2516
  204: {
2455
2517
  headers: {
2518
+ /** @description Strong ETag of the resource. Send it back as If-Match on a PUT. */
2519
+ ETag?: string;
2456
2520
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
2457
2521
  "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
2458
2522
  "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
@@ -2508,6 +2572,18 @@ export interface paths {
2508
2572
  "application/json": components["schemas"]["PublicApiErrorEnvelope"];
2509
2573
  };
2510
2574
  };
2575
+ /** @description The resource changed since the If-Match ETag. */
2576
+ 412: {
2577
+ headers: {
2578
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
2579
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
2580
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
2581
+ [name: string]: unknown;
2582
+ };
2583
+ content: {
2584
+ "application/json": components["schemas"]["PublicApiErrorEnvelope"];
2585
+ };
2586
+ };
2511
2587
  /** @description Rate limit exceeded. Retry after the interval indicated by the Retry-After header. */
2512
2588
  429: {
2513
2589
  headers: {
@@ -2675,6 +2751,8 @@ export interface paths {
2675
2751
  /** @description OK */
2676
2752
  200: {
2677
2753
  headers: {
2754
+ /** @description Strong ETag of the resource. Send it back as If-Match on a PUT. */
2755
+ ETag?: string;
2678
2756
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
2679
2757
  "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
2680
2758
  "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
@@ -2731,7 +2809,10 @@ export interface paths {
2731
2809
  put: {
2732
2810
  parameters: {
2733
2811
  query?: never;
2734
- header?: never;
2812
+ header?: {
2813
+ /** @description Optional. The ETag from a GET of this resource. The write applies only if the resource still has that ETag; otherwise 412 `precondition_failed`. `*` or no header applies the write unconditionally. */
2814
+ "If-Match"?: string;
2815
+ };
2735
2816
  path: {
2736
2817
  org: string;
2737
2818
  project: string;
@@ -2752,6 +2833,8 @@ export interface paths {
2752
2833
  /** @description No Content */
2753
2834
  204: {
2754
2835
  headers: {
2836
+ /** @description Strong ETag of the resource. Send it back as If-Match on a PUT. */
2837
+ ETag?: string;
2755
2838
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
2756
2839
  "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
2757
2840
  "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
@@ -2807,6 +2890,18 @@ export interface paths {
2807
2890
  "application/json": components["schemas"]["PublicApiErrorEnvelope"];
2808
2891
  };
2809
2892
  };
2893
+ /** @description The resource changed since the If-Match ETag. */
2894
+ 412: {
2895
+ headers: {
2896
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
2897
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
2898
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
2899
+ [name: string]: unknown;
2900
+ };
2901
+ content: {
2902
+ "application/json": components["schemas"]["PublicApiErrorEnvelope"];
2903
+ };
2904
+ };
2810
2905
  /** @description Rate limit exceeded. Retry after the interval indicated by the Retry-After header. */
2811
2906
  429: {
2812
2907
  headers: {
@@ -3919,6 +4014,219 @@ export interface paths {
3919
4014
  patch?: never;
3920
4015
  trace?: never;
3921
4016
  };
4017
+ "/api/v1/orgs/{org}/projects/{project}/default-flag-lifetime": {
4018
+ parameters: {
4019
+ query?: never;
4020
+ header?: never;
4021
+ path?: never;
4022
+ cookie?: never;
4023
+ };
4024
+ get?: never;
4025
+ /**
4026
+ * Sets or removes the project's default flag lifetime, in days (1–3650; null removes it).
4027
+ * @description Temporary
4028
+ * flags with no expiry date of their own then expire that many days after they were created, reported
4029
+ * as `expirySource: "project-default"`. Takes effect at the next hourly staleness run. Requires at
4030
+ * least Member, and the default-flag-lifetime feature to set one (400 `FEATURE_NOT_ENABLED`);
4031
+ * removing one is always allowed.
4032
+ */
4033
+ put: {
4034
+ parameters: {
4035
+ query?: never;
4036
+ header?: never;
4037
+ path: {
4038
+ org: string;
4039
+ project: string;
4040
+ };
4041
+ cookie?: never;
4042
+ };
4043
+ requestBody?: {
4044
+ content: {
4045
+ "application/json": components["schemas"]["PublicSetDefaultFlagLifetimeRequest"];
4046
+ "text/json": components["schemas"]["PublicSetDefaultFlagLifetimeRequest"];
4047
+ "application/*+json": components["schemas"]["PublicSetDefaultFlagLifetimeRequest"];
4048
+ };
4049
+ };
4050
+ responses: {
4051
+ /** @description No Content */
4052
+ 204: {
4053
+ headers: {
4054
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
4055
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
4056
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
4057
+ [name: string]: unknown;
4058
+ };
4059
+ content?: never;
4060
+ };
4061
+ /** @description Bad Request */
4062
+ 400: {
4063
+ headers: {
4064
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
4065
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
4066
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
4067
+ [name: string]: unknown;
4068
+ };
4069
+ content: {
4070
+ "application/json": components["schemas"]["PublicApiErrorEnvelope"];
4071
+ };
4072
+ };
4073
+ /** @description Authentication is required, or the supplied API token is invalid or expired. */
4074
+ 401: {
4075
+ headers: {
4076
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
4077
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
4078
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
4079
+ [name: string]: unknown;
4080
+ };
4081
+ content: {
4082
+ "application/json": components["schemas"]["PublicApiErrorEnvelope"];
4083
+ };
4084
+ };
4085
+ /** @description Forbidden */
4086
+ 403: {
4087
+ headers: {
4088
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
4089
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
4090
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
4091
+ [name: string]: unknown;
4092
+ };
4093
+ content: {
4094
+ "application/json": components["schemas"]["PublicApiErrorEnvelope"];
4095
+ };
4096
+ };
4097
+ /** @description Not Found */
4098
+ 404: {
4099
+ headers: {
4100
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
4101
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
4102
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
4103
+ [name: string]: unknown;
4104
+ };
4105
+ content: {
4106
+ "application/json": components["schemas"]["PublicApiErrorEnvelope"];
4107
+ };
4108
+ };
4109
+ /** @description Rate limit exceeded. Retry after the interval indicated by the Retry-After header. */
4110
+ 429: {
4111
+ headers: {
4112
+ /** @description Number of seconds to wait before retrying the request. */
4113
+ "Retry-After"?: number;
4114
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
4115
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
4116
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
4117
+ [name: string]: unknown;
4118
+ };
4119
+ content: {
4120
+ "application/json": components["schemas"]["PublicApiErrorEnvelope"];
4121
+ };
4122
+ };
4123
+ };
4124
+ };
4125
+ post?: never;
4126
+ delete?: never;
4127
+ options?: never;
4128
+ head?: never;
4129
+ patch?: never;
4130
+ trace?: never;
4131
+ };
4132
+ "/api/v1/orgs/{org}/projects/{project}/default-flag-lifetime/impact": {
4133
+ parameters: {
4134
+ query?: never;
4135
+ header?: never;
4136
+ path?: never;
4137
+ cookie?: never;
4138
+ };
4139
+ /**
4140
+ * Previews a default flag lifetime: how many temporary flags with no expiry date of their own would newly be past expiry, and how many would stop being past the current one.
4141
+ * @description Omit `days` to
4142
+ * preview removing it.
4143
+ */
4144
+ get: {
4145
+ parameters: {
4146
+ query?: {
4147
+ days?: number;
4148
+ };
4149
+ header?: never;
4150
+ path: {
4151
+ org: string;
4152
+ project: string;
4153
+ };
4154
+ cookie?: never;
4155
+ };
4156
+ requestBody?: never;
4157
+ responses: {
4158
+ /** @description OK */
4159
+ 200: {
4160
+ headers: {
4161
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
4162
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
4163
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
4164
+ [name: string]: unknown;
4165
+ };
4166
+ content: {
4167
+ "application/json": components["schemas"]["PublicDefaultFlagLifetimeImpact"];
4168
+ };
4169
+ };
4170
+ /** @description Bad Request */
4171
+ 400: {
4172
+ headers: {
4173
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
4174
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
4175
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
4176
+ [name: string]: unknown;
4177
+ };
4178
+ content: {
4179
+ "application/json": components["schemas"]["PublicApiErrorEnvelope"];
4180
+ };
4181
+ };
4182
+ /** @description Authentication is required, or the supplied API token is invalid or expired. */
4183
+ 401: {
4184
+ headers: {
4185
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
4186
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
4187
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
4188
+ [name: string]: unknown;
4189
+ };
4190
+ content: {
4191
+ "application/json": components["schemas"]["PublicApiErrorEnvelope"];
4192
+ };
4193
+ };
4194
+ /** @description Not Found */
4195
+ 404: {
4196
+ headers: {
4197
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
4198
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
4199
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
4200
+ [name: string]: unknown;
4201
+ };
4202
+ content: {
4203
+ "application/json": components["schemas"]["PublicApiErrorEnvelope"];
4204
+ };
4205
+ };
4206
+ /** @description Rate limit exceeded. Retry after the interval indicated by the Retry-After header. */
4207
+ 429: {
4208
+ headers: {
4209
+ /** @description Number of seconds to wait before retrying the request. */
4210
+ "Retry-After"?: number;
4211
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
4212
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
4213
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
4214
+ [name: string]: unknown;
4215
+ };
4216
+ content: {
4217
+ "application/json": components["schemas"]["PublicApiErrorEnvelope"];
4218
+ };
4219
+ };
4220
+ };
4221
+ };
4222
+ put?: never;
4223
+ post?: never;
4224
+ delete?: never;
4225
+ options?: never;
4226
+ head?: never;
4227
+ patch?: never;
4228
+ trace?: never;
4229
+ };
3922
4230
  "/api/v1/orgs/{org}/projects/{project}/environments/{env}/sdk-keys": {
3923
4231
  parameters: {
3924
4232
  query?: never;
@@ -4590,6 +4898,8 @@ export interface paths {
4590
4898
  /** @description OK */
4591
4899
  200: {
4592
4900
  headers: {
4901
+ /** @description Strong ETag of the resource. Send it back as If-Match on a PUT. */
4902
+ ETag?: string;
4593
4903
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
4594
4904
  "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
4595
4905
  "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
@@ -4646,7 +4956,10 @@ export interface paths {
4646
4956
  put: {
4647
4957
  parameters: {
4648
4958
  query?: never;
4649
- header?: never;
4959
+ header?: {
4960
+ /** @description Optional. The ETag from a GET of this resource. The write applies only if the resource still has that ETag; otherwise 412 `precondition_failed`. `*` or no header applies the write unconditionally. */
4961
+ "If-Match"?: string;
4962
+ };
4650
4963
  path: {
4651
4964
  org: string;
4652
4965
  project: string;
@@ -4665,6 +4978,8 @@ export interface paths {
4665
4978
  /** @description No Content */
4666
4979
  204: {
4667
4980
  headers: {
4981
+ /** @description Strong ETag of the resource. Send it back as If-Match on a PUT. */
4982
+ ETag?: string;
4668
4983
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
4669
4984
  "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
4670
4985
  "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
@@ -4720,6 +5035,18 @@ export interface paths {
4720
5035
  "application/json": components["schemas"]["PublicApiErrorEnvelope"];
4721
5036
  };
4722
5037
  };
5038
+ /** @description The resource changed since the If-Match ETag. */
5039
+ 412: {
5040
+ headers: {
5041
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
5042
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
5043
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
5044
+ [name: string]: unknown;
5045
+ };
5046
+ content: {
5047
+ "application/json": components["schemas"]["PublicApiErrorEnvelope"];
5048
+ };
5049
+ };
4723
5050
  /** @description Rate limit exceeded. Retry after the interval indicated by the Retry-After header. */
4724
5051
  429: {
4725
5052
  headers: {
@@ -5135,6 +5462,8 @@ export interface paths {
5135
5462
  /** @description OK */
5136
5463
  200: {
5137
5464
  headers: {
5465
+ /** @description Strong ETag of the resource. Send it back as If-Match on a PUT. */
5466
+ ETag?: string;
5138
5467
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
5139
5468
  "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
5140
5469
  "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
@@ -5204,7 +5533,10 @@ export interface paths {
5204
5533
  put: {
5205
5534
  parameters: {
5206
5535
  query?: never;
5207
- header?: never;
5536
+ header?: {
5537
+ /** @description Optional. The ETag from a GET of this resource. The write applies only if the resource still has that ETag; otherwise 412 `precondition_failed`. `*` or no header applies the write unconditionally. */
5538
+ "If-Match"?: string;
5539
+ };
5208
5540
  path: {
5209
5541
  org: string;
5210
5542
  id: string;
@@ -5222,6 +5554,8 @@ export interface paths {
5222
5554
  /** @description No Content */
5223
5555
  204: {
5224
5556
  headers: {
5557
+ /** @description Strong ETag of the resource. Send it back as If-Match on a PUT. */
5558
+ ETag?: string;
5225
5559
  "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
5226
5560
  "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
5227
5561
  "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
@@ -5277,6 +5611,18 @@ export interface paths {
5277
5611
  "application/json": components["schemas"]["PublicApiErrorEnvelope"];
5278
5612
  };
5279
5613
  };
5614
+ /** @description The resource changed since the If-Match ETag. */
5615
+ 412: {
5616
+ headers: {
5617
+ "X-RateLimit-Limit": components["headers"]["X-RateLimit-Limit"];
5618
+ "X-RateLimit-Remaining": components["headers"]["X-RateLimit-Remaining"];
5619
+ "X-RateLimit-Reset": components["headers"]["X-RateLimit-Reset"];
5620
+ [name: string]: unknown;
5621
+ };
5622
+ content: {
5623
+ "application/json": components["schemas"]["PublicApiErrorEnvelope"];
5624
+ };
5625
+ };
5280
5626
  /** @description Rate limit exceeded. Retry after the interval indicated by the Retry-After header. */
5281
5627
  429: {
5282
5628
  headers: {
@@ -5972,6 +6318,7 @@ export interface components {
5972
6318
  * public API surfaces environments via their own endpoint (Task 6), not embedded here.
5973
6319
  * UpdatedAt is only populated from ProjectDto (the detail/create
5974
6320
  * shape); ProjectListItemDto doesn't carry it, so list rows leave it `null`.
6321
+ * DefaultFlagLifetimeDays is the project's default flag lifetime in days, or null (#3194).
5975
6322
  * @example {
5976
6323
  * "id": "0197b69f-1a2b-7c3d-8e4f-5a6b7c8d9e0f",
5977
6324
  * "key": "checkout",
@@ -5991,6 +6338,8 @@ export interface components {
5991
6338
  createdAt?: string;
5992
6339
  /** Format: date-time */
5993
6340
  updatedAt?: string | null;
6341
+ /** Format: int32 */
6342
+ defaultFlagLifetimeDays?: number | null;
5994
6343
  /** @description Capability hints: which operations the authenticated caller may perform on this resource, each with allowed + optional reason. Computed from the caller's role and the resource's state. Injected at runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it. */
5995
6344
  _actions?: {
5996
6345
  [key: string]: components["schemas"]["ActionCapability"];
@@ -6397,6 +6746,16 @@ export interface components {
6397
6746
  secret?: string | null;
6398
6747
  warning?: string | null;
6399
6748
  };
6749
+ /**
6750
+ * @description Response of `GET .../default-flag-lifetime/impact`: how many temporary flags with no expiry
6751
+ * date of their own would newly be past expiry, and how many would stop being past it.
6752
+ */
6753
+ PublicDefaultFlagLifetimeImpact: {
6754
+ /** Format: int32 */
6755
+ newlyPastExpiry?: number;
6756
+ /** Format: int32 */
6757
+ noLongerPastExpiry?: number;
6758
+ };
6400
6759
  /**
6401
6760
  * @description Public representation of an environment, returned by
6402
6761
  * `GET /api/v1/orgs/{org}/projects/{project}/environments` (list),
@@ -6488,6 +6847,9 @@ export interface components {
6488
6847
  * Variations (a summary-only shape upstream) and
6489
6848
  * Staleness, matching the "list is narrower than detail"
6490
6849
  * split already present on the Application-layer DTOs.
6850
+ * EffectiveExpiresAtUtc is when the flag counts as past expiry, from its own ExpiresAtUtc
6851
+ * or its project's default lifetime; ExpirySource says which (`explicit` / `project-default`),
6852
+ * both null when neither applies.
6491
6853
  */
6492
6854
  PublicFlagListItem: {
6493
6855
  /** Format: uuid */
@@ -6511,6 +6873,9 @@ export interface components {
6511
6873
  owner?: components["schemas"]["PublicFlagOwner"];
6512
6874
  removalPrUrl?: string | null;
6513
6875
  isPermanent?: boolean;
6876
+ /** Format: date-time */
6877
+ effectiveExpiresAtUtc?: string | null;
6878
+ expirySource?: string | null;
6514
6879
  };
6515
6880
  /**
6516
6881
  * @description A page of results plus an opaque cursor for the next page, or null when this is the last
@@ -6583,6 +6948,9 @@ export interface components {
6583
6948
  * `GET .../flags/{flag}` and the body of a successful create. Drops internal/dashboard-only
6584
6949
  * fields present on FeatureFlagDto — notably `ProjectId` (implicit in the
6585
6950
  * route) and `Staleness` (an internal analytics signal, not part of the public contract).
6951
+ * EffectiveExpiresAtUtc is when the flag counts as past expiry, from its own ExpiresAtUtc
6952
+ * or its project's default lifetime; ExpirySource says which (`explicit` / `project-default`),
6953
+ * both null when neither applies.
6586
6954
  * @example {
6587
6955
  * "id": "0197b6a0-5f2a-7c3e-9b4d-1e2f3a4b5c6d",
6588
6956
  * "key": "new-checkout-flow",
@@ -6639,6 +7007,9 @@ export interface components {
6639
7007
  owner?: components["schemas"]["PublicFlagOwner"];
6640
7008
  removalPrUrl?: string | null;
6641
7009
  isPermanent?: boolean;
7010
+ /** Format: date-time */
7011
+ effectiveExpiresAtUtc?: string | null;
7012
+ expirySource?: string | null;
6642
7013
  /** @description Capability hints: which operations the authenticated caller may perform on this resource, each with allowed + optional reason. Computed from the caller's role and the resource's state. Injected at runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it. */
6643
7014
  _actions?: {
6644
7015
  [key: string]: components["schemas"]["ActionCapability"];
@@ -6807,6 +7178,14 @@ export interface components {
6807
7178
  [key: string]: components["schemas"]["ActionCapability"];
6808
7179
  };
6809
7180
  };
7181
+ /**
7182
+ * @description Request body for `PUT /api/v1/orgs/{org}/projects/{project}/default-flag-lifetime`. `days`
7183
+ * is 1–3650; null (or an empty body) removes the default.
7184
+ */
7185
+ PublicSetDefaultFlagLifetimeRequest: {
7186
+ /** Format: int32 */
7187
+ days?: number | null;
7188
+ };
6810
7189
  /**
6811
7190
  * @description Request body for `PUT /api/v1/orgs/{org}/projects/{project}/flags/{flag}/expiry`. Expiry is a
6812
7191
  * dedicated sub-resource, deliberately NOT a field on PublicUpdateFeatureFlagRequest: that