@giveitsmaller/contracts 0.36.0 → 0.38.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 (415) hide show
  1. package/accepted-options/accepted-options.json +274 -1
  2. package/accepted-options/image-output-routes.json +56 -12
  3. package/asyncapi/events.yaml +8 -4
  4. package/availability/availability.json +500 -59
  5. package/dist/openapi/models/AccountLimitEntry.d.ts +1 -1
  6. package/dist/openapi/models/AccountLimitEntry.js +1 -1
  7. package/dist/openapi/models/AccountLimits.d.ts +1 -1
  8. package/dist/openapi/models/AccountLimits.js +1 -1
  9. package/dist/openapi/models/AccountLimitsLimits.d.ts +1 -1
  10. package/dist/openapi/models/AccountLimitsLimits.js +1 -1
  11. package/dist/openapi/models/AccountLimitsSuccessEnvelope.d.ts +1 -1
  12. package/dist/openapi/models/AccountLimitsSuccessEnvelope.js +1 -1
  13. package/dist/openapi/models/AudioWatermarkDecodeRequest.d.ts +1 -1
  14. package/dist/openapi/models/AudioWatermarkDecodeRequest.js +1 -1
  15. package/dist/openapi/models/AudioWatermarkDecodeResponse.d.ts +1 -1
  16. package/dist/openapi/models/AudioWatermarkDecodeResponse.js +1 -1
  17. package/dist/openapi/models/AuthErrorResponse.d.ts +1 -1
  18. package/dist/openapi/models/AuthErrorResponse.js +1 -1
  19. package/dist/openapi/models/AuthErrorType.d.ts +1 -1
  20. package/dist/openapi/models/AuthErrorType.js +1 -1
  21. package/dist/openapi/models/AuthRejectionEnvelope.d.ts +1 -1
  22. package/dist/openapi/models/AuthRejectionEnvelope.js +1 -1
  23. package/dist/openapi/models/AvailabilityValue.d.ts +1 -1
  24. package/dist/openapi/models/AvailabilityValue.js +1 -1
  25. package/dist/openapi/models/BalanceExhaustedResponse.d.ts +1 -1
  26. package/dist/openapi/models/BalanceExhaustedResponse.js +1 -1
  27. package/dist/openapi/models/BalanceExhaustedResponseAllOfLinks.d.ts +1 -1
  28. package/dist/openapi/models/BalanceExhaustedResponseAllOfLinks.js +1 -1
  29. package/dist/openapi/models/CallbackEventType.d.ts +1 -1
  30. package/dist/openapi/models/CallbackEventType.js +1 -1
  31. package/dist/openapi/models/ChangePasswordRequest.d.ts +1 -1
  32. package/dist/openapi/models/ChangePasswordRequest.js +1 -1
  33. package/dist/openapi/models/CompositionPlan.d.ts +1 -1
  34. package/dist/openapi/models/CompositionPlan.js +1 -1
  35. package/dist/openapi/models/CompositionPlanJob.d.ts +1 -1
  36. package/dist/openapi/models/CompositionPlanJob.js +1 -1
  37. package/dist/openapi/models/CompositionPlanOperation.d.ts +1 -1
  38. package/dist/openapi/models/CompositionPlanOperation.js +1 -1
  39. package/dist/openapi/models/ConfirmEmailChange200Response.d.ts +1 -1
  40. package/dist/openapi/models/ConfirmEmailChange200Response.js +1 -1
  41. package/dist/openapi/models/ConfirmEmailChange200ResponseData.d.ts +1 -1
  42. package/dist/openapi/models/ConfirmEmailChange200ResponseData.js +1 -1
  43. package/dist/openapi/models/ConfirmEmailChangeRequest.d.ts +1 -1
  44. package/dist/openapi/models/ConfirmEmailChangeRequest.js +1 -1
  45. package/dist/openapi/models/ConnectionSource.d.ts +1 -1
  46. package/dist/openapi/models/ConnectionSource.js +1 -1
  47. package/dist/openapi/models/ContactRequest.d.ts +1 -1
  48. package/dist/openapi/models/ContactRequest.js +1 -1
  49. package/dist/openapi/models/ContactSubject.d.ts +1 -1
  50. package/dist/openapi/models/ContactSubject.js +1 -1
  51. package/dist/openapi/models/ContactValidationErrorResponse.d.ts +1 -1
  52. package/dist/openapi/models/ContactValidationErrorResponse.js +1 -1
  53. package/dist/openapi/models/CreateApiKey201Response.d.ts +1 -1
  54. package/dist/openapi/models/CreateApiKey201Response.js +1 -1
  55. package/dist/openapi/models/CreateApiKey201ResponseData.d.ts +1 -1
  56. package/dist/openapi/models/CreateApiKey201ResponseData.js +1 -1
  57. package/dist/openapi/models/CreateApiKeyRequest.d.ts +1 -1
  58. package/dist/openapi/models/CreateApiKeyRequest.js +1 -1
  59. package/dist/openapi/models/CreateExternalImport403Response.d.ts +1 -1
  60. package/dist/openapi/models/CreateExternalImport403Response.js +1 -1
  61. package/dist/openapi/models/CreateExternalImport422Response.d.ts +1 -1
  62. package/dist/openapi/models/CreateExternalImport422Response.js +1 -1
  63. package/dist/openapi/models/CreateWorkflow422Response.d.ts +1 -1
  64. package/dist/openapi/models/CreateWorkflow422Response.js +1 -1
  65. package/dist/openapi/models/CreditTransaction.d.ts +1 -1
  66. package/dist/openapi/models/CreditTransaction.js +1 -1
  67. package/dist/openapi/models/CreditTransactionSourceBucket.d.ts +1 -1
  68. package/dist/openapi/models/CreditTransactionSourceBucket.js +1 -1
  69. package/dist/openapi/models/CreditsBalanceResponse.d.ts +1 -1
  70. package/dist/openapi/models/CreditsBalanceResponse.js +1 -1
  71. package/dist/openapi/models/CreditsBalanceSuccessEnvelope.d.ts +1 -1
  72. package/dist/openapi/models/CreditsBalanceSuccessEnvelope.js +1 -1
  73. package/dist/openapi/models/CreditsUsageResponse.d.ts +1 -1
  74. package/dist/openapi/models/CreditsUsageResponse.js +1 -1
  75. package/dist/openapi/models/CreditsUsageSuccessEnvelope.d.ts +1 -1
  76. package/dist/openapi/models/CreditsUsageSuccessEnvelope.js +1 -1
  77. package/dist/openapi/models/Delivery.d.ts +1 -1
  78. package/dist/openapi/models/Delivery.js +1 -1
  79. package/dist/openapi/models/DeliveryOutputRef.d.ts +1 -1
  80. package/dist/openapi/models/DeliveryOutputRef.js +1 -1
  81. package/dist/openapi/models/DeliveryPlan.d.ts +1 -1
  82. package/dist/openapi/models/DeliveryPlan.js +1 -1
  83. package/dist/openapi/models/DeliveryPlanOutput.d.ts +1 -1
  84. package/dist/openapi/models/DeliveryPlanOutput.js +1 -1
  85. package/dist/openapi/models/DeliveryPlanReason.d.ts +1 -1
  86. package/dist/openapi/models/DeliveryPlanReason.js +1 -1
  87. package/dist/openapi/models/DeliverySelection.d.ts +1 -1
  88. package/dist/openapi/models/DeliverySelection.js +1 -1
  89. package/dist/openapi/models/DownloadBundle.d.ts +1 -1
  90. package/dist/openapi/models/DownloadBundle.js +1 -1
  91. package/dist/openapi/models/EmptySuccessEnvelope.d.ts +1 -1
  92. package/dist/openapi/models/EmptySuccessEnvelope.js +1 -1
  93. package/dist/openapi/models/EndpointProjection.d.ts +1 -1
  94. package/dist/openapi/models/EndpointProjection.js +1 -1
  95. package/dist/openapi/models/ErrorEnvelope.d.ts +1 -1
  96. package/dist/openapi/models/ErrorEnvelope.js +1 -1
  97. package/dist/openapi/models/EstimateQuality.d.ts +1 -1
  98. package/dist/openapi/models/EstimateQuality.js +1 -1
  99. package/dist/openapi/models/EstimateRange.d.ts +1 -1
  100. package/dist/openapi/models/EstimateRange.js +1 -1
  101. package/dist/openapi/models/ExternalDestination.d.ts +1 -1
  102. package/dist/openapi/models/ExternalDestination.js +1 -1
  103. package/dist/openapi/models/ExternalImportCreatedResponse.d.ts +1 -1
  104. package/dist/openapi/models/ExternalImportCreatedResponse.js +1 -1
  105. package/dist/openapi/models/ExternalImportCreatedSuccessEnvelope.d.ts +1 -1
  106. package/dist/openapi/models/ExternalImportCreatedSuccessEnvelope.js +1 -1
  107. package/dist/openapi/models/ExternalImportRequest.d.ts +1 -1
  108. package/dist/openapi/models/ExternalImportRequest.js +1 -1
  109. package/dist/openapi/models/ExternalImportToken.d.ts +1 -1
  110. package/dist/openapi/models/ExternalImportToken.js +1 -1
  111. package/dist/openapi/models/ExternalSource.d.ts +1 -1
  112. package/dist/openapi/models/ExternalSource.js +1 -1
  113. package/dist/openapi/models/FeatureNotAvailableResponse.d.ts +1 -1
  114. package/dist/openapi/models/FeatureNotAvailableResponse.js +1 -1
  115. package/dist/openapi/models/FeatureTierRestrictedResponse.d.ts +1 -1
  116. package/dist/openapi/models/FeatureTierRestrictedResponse.js +1 -1
  117. package/dist/openapi/models/FeatureViolation.d.ts +1 -1
  118. package/dist/openapi/models/FeatureViolation.js +1 -1
  119. package/dist/openapi/models/ForgotPasswordRequest.d.ts +1 -1
  120. package/dist/openapi/models/ForgotPasswordRequest.js +1 -1
  121. package/dist/openapi/models/ImageEncodeCapabilities.d.ts +1 -1
  122. package/dist/openapi/models/ImageEncodeCapabilities.js +1 -1
  123. package/dist/openapi/models/JobDefinition.d.ts +1 -1
  124. package/dist/openapi/models/JobDefinition.js +1 -1
  125. package/dist/openapi/models/JobDownload.d.ts +1 -1
  126. package/dist/openapi/models/JobDownload.js +1 -1
  127. package/dist/openapi/models/JobInputV2.d.ts +1 -1
  128. package/dist/openapi/models/JobInputV2.js +1 -1
  129. package/dist/openapi/models/JobMediaClass.d.ts +1 -1
  130. package/dist/openapi/models/JobMediaClass.js +1 -1
  131. package/dist/openapi/models/JobOutputSource.d.ts +1 -1
  132. package/dist/openapi/models/JobOutputSource.js +1 -1
  133. package/dist/openapi/models/JobResponse.d.ts +1 -1
  134. package/dist/openapi/models/JobResponse.js +1 -1
  135. package/dist/openapi/models/JobStatus.d.ts +1 -1
  136. package/dist/openapi/models/JobStatus.js +1 -1
  137. package/dist/openapi/models/JobType.d.ts +1 -1
  138. package/dist/openapi/models/JobType.js +1 -1
  139. package/dist/openapi/models/LivenessResponse.d.ts +1 -1
  140. package/dist/openapi/models/LivenessResponse.js +1 -1
  141. package/dist/openapi/models/LoginUser200Response.d.ts +1 -1
  142. package/dist/openapi/models/LoginUser200Response.js +1 -1
  143. package/dist/openapi/models/LoginUser200ResponseData.d.ts +1 -1
  144. package/dist/openapi/models/LoginUser200ResponseData.js +1 -1
  145. package/dist/openapi/models/LoginUser200ResponseDataUser.d.ts +1 -1
  146. package/dist/openapi/models/LoginUser200ResponseDataUser.js +1 -1
  147. package/dist/openapi/models/LoginUserRequest.d.ts +1 -1
  148. package/dist/openapi/models/LoginUserRequest.js +1 -1
  149. package/dist/openapi/models/MetadataResponse.d.ts +1 -1
  150. package/dist/openapi/models/MetadataResponse.js +1 -1
  151. package/dist/openapi/models/MetadataResponseDimensions.d.ts +1 -1
  152. package/dist/openapi/models/MetadataResponseDimensions.js +1 -1
  153. package/dist/openapi/models/MetadataResponseExif.d.ts +1 -1
  154. package/dist/openapi/models/MetadataResponseExif.js +1 -1
  155. package/dist/openapi/models/MetadataResponseExifGps.d.ts +1 -1
  156. package/dist/openapi/models/MetadataResponseExifGps.js +1 -1
  157. package/dist/openapi/models/MetadataSuccessEnvelope.d.ts +1 -1
  158. package/dist/openapi/models/MetadataSuccessEnvelope.js +1 -1
  159. package/dist/openapi/models/MimeGroupSchema.d.ts +1 -1
  160. package/dist/openapi/models/MimeGroupSchema.js +1 -1
  161. package/dist/openapi/models/MultiInputSource.d.ts +1 -1
  162. package/dist/openapi/models/MultiInputSource.js +1 -1
  163. package/dist/openapi/models/MultipartCompleteRequest.d.ts +1 -1
  164. package/dist/openapi/models/MultipartCompleteRequest.js +1 -1
  165. package/dist/openapi/models/MultipartCompleteRequestPartsInner.d.ts +1 -1
  166. package/dist/openapi/models/MultipartCompleteRequestPartsInner.js +1 -1
  167. package/dist/openapi/models/MultipartCompleteResponse.d.ts +1 -1
  168. package/dist/openapi/models/MultipartCompleteResponse.js +1 -1
  169. package/dist/openapi/models/MultipartCompleteSuccessEnvelope.d.ts +1 -1
  170. package/dist/openapi/models/MultipartCompleteSuccessEnvelope.js +1 -1
  171. package/dist/openapi/models/MultipartInitiateRequestMetadataHint.d.ts +1 -1
  172. package/dist/openapi/models/MultipartInitiateRequestMetadataHint.js +1 -1
  173. package/dist/openapi/models/MultipartInitiateResponse.d.ts +1 -1
  174. package/dist/openapi/models/MultipartInitiateResponse.js +1 -1
  175. package/dist/openapi/models/MultipartInitiateSuccessEnvelope.d.ts +1 -1
  176. package/dist/openapi/models/MultipartInitiateSuccessEnvelope.js +1 -1
  177. package/dist/openapi/models/MultipartKeepaliveResponse.d.ts +1 -1
  178. package/dist/openapi/models/MultipartKeepaliveResponse.js +1 -1
  179. package/dist/openapi/models/MultipartKeepaliveSuccessEnvelope.d.ts +1 -1
  180. package/dist/openapi/models/MultipartKeepaliveSuccessEnvelope.js +1 -1
  181. package/dist/openapi/models/MultipartPartListing.d.ts +1 -1
  182. package/dist/openapi/models/MultipartPartListing.js +1 -1
  183. package/dist/openapi/models/MultipartPresignRequest.d.ts +1 -1
  184. package/dist/openapi/models/MultipartPresignRequest.js +1 -1
  185. package/dist/openapi/models/MultipartPresignResponse.d.ts +1 -1
  186. package/dist/openapi/models/MultipartPresignResponse.js +1 -1
  187. package/dist/openapi/models/MultipartPresignSuccessEnvelope.d.ts +1 -1
  188. package/dist/openapi/models/MultipartPresignSuccessEnvelope.js +1 -1
  189. package/dist/openapi/models/MultipartStatusResponse.d.ts +1 -1
  190. package/dist/openapi/models/MultipartStatusResponse.js +1 -1
  191. package/dist/openapi/models/MultipartStatusSuccessEnvelope.d.ts +1 -1
  192. package/dist/openapi/models/MultipartStatusSuccessEnvelope.js +1 -1
  193. package/dist/openapi/models/OperationDefinition.d.ts +1 -1
  194. package/dist/openapi/models/OperationDefinition.js +1 -1
  195. package/dist/openapi/models/OperationDownload.d.ts +1 -1
  196. package/dist/openapi/models/OperationDownload.js +1 -1
  197. package/dist/openapi/models/OperationInputModel.d.ts +1 -1
  198. package/dist/openapi/models/OperationInputModel.js +1 -1
  199. package/dist/openapi/models/OperationResponse.d.ts +1 -1
  200. package/dist/openapi/models/OperationResponse.js +1 -1
  201. package/dist/openapi/models/OperationResult.d.ts +24 -1
  202. package/dist/openapi/models/OperationResult.js +3 -1
  203. package/dist/openapi/models/OperationResultMetadata.d.ts +1 -1
  204. package/dist/openapi/models/OperationResultMetadata.js +1 -1
  205. package/dist/openapi/models/OperationResultMetrics.d.ts +1 -1
  206. package/dist/openapi/models/OperationResultMetrics.js +1 -1
  207. package/dist/openapi/models/OperationSchemaDefinition.d.ts +1 -1
  208. package/dist/openapi/models/OperationSchemaDefinition.js +1 -1
  209. package/dist/openapi/models/OperationStatus.d.ts +1 -1
  210. package/dist/openapi/models/OperationStatus.js +1 -1
  211. package/dist/openapi/models/OperationType.d.ts +1 -1
  212. package/dist/openapi/models/OperationType.js +1 -1
  213. package/dist/openapi/models/OperationsSchemaResponse.d.ts +1 -1
  214. package/dist/openapi/models/OperationsSchemaResponse.js +1 -1
  215. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeatures.d.ts +1 -1
  216. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeatures.js +1 -1
  217. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDelivery.d.ts +1 -1
  218. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDelivery.js +1 -1
  219. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliveryMode.d.ts +1 -1
  220. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliveryMode.js +1 -1
  221. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliverySelection.d.ts +1 -1
  222. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliverySelection.js +1 -1
  223. package/dist/openapi/models/OptionSchema.d.ts +1 -1
  224. package/dist/openapi/models/OptionSchema.js +1 -1
  225. package/dist/openapi/models/PerRoleCardinalityEntry.d.ts +1 -1
  226. package/dist/openapi/models/PerRoleCardinalityEntry.js +1 -1
  227. package/dist/openapi/models/PerValueAvailabilityEntry.d.ts +1 -1
  228. package/dist/openapi/models/PerValueAvailabilityEntry.js +1 -1
  229. package/dist/openapi/models/PresignedUrlPart.d.ts +1 -1
  230. package/dist/openapi/models/PresignedUrlPart.js +1 -1
  231. package/dist/openapi/models/ProbePendingResponse.d.ts +1 -1
  232. package/dist/openapi/models/ProbePendingResponse.js +1 -1
  233. package/dist/openapi/models/ProcessingClass.d.ts +1 -1
  234. package/dist/openapi/models/ProcessingClass.js +1 -1
  235. package/dist/openapi/models/ProcessingClassBandViolation.d.ts +1 -1
  236. package/dist/openapi/models/ProcessingClassBandViolation.js +1 -1
  237. package/dist/openapi/models/ProcessingClassConstraints.d.ts +1 -1
  238. package/dist/openapi/models/ProcessingClassConstraints.js +1 -1
  239. package/dist/openapi/models/ProcessingClassEntry.d.ts +1 -1
  240. package/dist/openapi/models/ProcessingClassEntry.js +1 -1
  241. package/dist/openapi/models/ProcessingClassExceedsBandResponse.d.ts +1 -1
  242. package/dist/openapi/models/ProcessingClassExceedsBandResponse.js +1 -1
  243. package/dist/openapi/models/ProcessingClassHint.d.ts +1 -1
  244. package/dist/openapi/models/ProcessingClassHint.js +1 -1
  245. package/dist/openapi/models/ProcessingClassReason.d.ts +1 -1
  246. package/dist/openapi/models/ProcessingClassReason.js +1 -1
  247. package/dist/openapi/models/ProcessingClassRejectReason.d.ts +1 -1
  248. package/dist/openapi/models/ProcessingClassRejectReason.js +1 -1
  249. package/dist/openapi/models/ProcessingPlan.d.ts +1 -1
  250. package/dist/openapi/models/ProcessingPlan.js +1 -1
  251. package/dist/openapi/models/ProcessingPlanJob.d.ts +1 -1
  252. package/dist/openapi/models/ProcessingPlanJob.js +1 -1
  253. package/dist/openapi/models/ReEncodeDecision.d.ts +1 -1
  254. package/dist/openapi/models/ReEncodeDecision.js +1 -1
  255. package/dist/openapi/models/ReadinessResponse.d.ts +1 -1
  256. package/dist/openapi/models/ReadinessResponse.js +1 -1
  257. package/dist/openapi/models/RegisterUser422Response.d.ts +1 -1
  258. package/dist/openapi/models/RegisterUser422Response.js +1 -1
  259. package/dist/openapi/models/RegisterUserRequest.d.ts +1 -1
  260. package/dist/openapi/models/RegisterUserRequest.js +1 -1
  261. package/dist/openapi/models/ResetPasswordRequest.d.ts +1 -1
  262. package/dist/openapi/models/ResetPasswordRequest.js +1 -1
  263. package/dist/openapi/models/ResponseEnvelope.d.ts +1 -1
  264. package/dist/openapi/models/ResponseEnvelope.js +1 -1
  265. package/dist/openapi/models/RetryResponse.d.ts +1 -1
  266. package/dist/openapi/models/RetryResponse.js +1 -1
  267. package/dist/openapi/models/RetrySuccessEnvelope.d.ts +1 -1
  268. package/dist/openapi/models/RetrySuccessEnvelope.js +1 -1
  269. package/dist/openapi/models/SseCompletionBase.d.ts +1 -1
  270. package/dist/openapi/models/SseCompletionBase.js +1 -1
  271. package/dist/openapi/models/SseEventType.d.ts +1 -1
  272. package/dist/openapi/models/SseEventType.js +1 -1
  273. package/dist/openapi/models/SseJobCompletedData.d.ts +1 -1
  274. package/dist/openapi/models/SseJobCompletedData.js +1 -1
  275. package/dist/openapi/models/SseJobFailedData.d.ts +1 -1
  276. package/dist/openapi/models/SseJobFailedData.js +1 -1
  277. package/dist/openapi/models/SseMultiOutputCompletion.d.ts +1 -1
  278. package/dist/openapi/models/SseMultiOutputCompletion.js +1 -1
  279. package/dist/openapi/models/SseMultiOutputCompletionMetrics.d.ts +1 -1
  280. package/dist/openapi/models/SseMultiOutputCompletionMetrics.js +1 -1
  281. package/dist/openapi/models/SseMultiOutputCompletionWithKind.d.ts +1 -1
  282. package/dist/openapi/models/SseMultiOutputCompletionWithKind.js +1 -1
  283. package/dist/openapi/models/SseMultiOutputResultEntry.d.ts +1 -1
  284. package/dist/openapi/models/SseMultiOutputResultEntry.js +1 -1
  285. package/dist/openapi/models/SseOperationCompletedData.d.ts +1 -1
  286. package/dist/openapi/models/SseOperationCompletedData.js +1 -1
  287. package/dist/openapi/models/SseOperationCompletionResult.d.ts +1 -1
  288. package/dist/openapi/models/SseOperationCompletionResult.js +1 -1
  289. package/dist/openapi/models/SseOperationFailedData.d.ts +1 -1
  290. package/dist/openapi/models/SseOperationFailedData.js +1 -1
  291. package/dist/openapi/models/SseOperationProgressData.d.ts +1 -1
  292. package/dist/openapi/models/SseOperationProgressData.js +1 -1
  293. package/dist/openapi/models/SseSingleOutputCompletion.d.ts +24 -1
  294. package/dist/openapi/models/SseSingleOutputCompletion.js +3 -1
  295. package/dist/openapi/models/SseWorkflowTerminalData.d.ts +1 -1
  296. package/dist/openapi/models/SseWorkflowTerminalData.js +1 -1
  297. package/dist/openapi/models/TierRestrictionKind.d.ts +1 -1
  298. package/dist/openapi/models/TierRestrictionKind.js +1 -1
  299. package/dist/openapi/models/TierRestrictionResponse.d.ts +1 -1
  300. package/dist/openapi/models/TierRestrictionResponse.js +1 -1
  301. package/dist/openapi/models/UpdateProfile200Response.d.ts +1 -1
  302. package/dist/openapi/models/UpdateProfile200Response.js +1 -1
  303. package/dist/openapi/models/UpdateProfile200ResponseData.d.ts +1 -1
  304. package/dist/openapi/models/UpdateProfile200ResponseData.js +1 -1
  305. package/dist/openapi/models/UpdateProfile422Response.d.ts +1 -1
  306. package/dist/openapi/models/UpdateProfile422Response.js +1 -1
  307. package/dist/openapi/models/UpdateProfileRequest.d.ts +1 -1
  308. package/dist/openapi/models/UpdateProfileRequest.js +1 -1
  309. package/dist/openapi/models/UploadConstraintsApplied.d.ts +1 -1
  310. package/dist/openapi/models/UploadConstraintsApplied.js +1 -1
  311. package/dist/openapi/models/UploadDurationExceedsTierResponse.d.ts +1 -1
  312. package/dist/openapi/models/UploadDurationExceedsTierResponse.js +1 -1
  313. package/dist/openapi/models/UploadFile403Response.d.ts +1 -1
  314. package/dist/openapi/models/UploadFile403Response.js +1 -1
  315. package/dist/openapi/models/UploadFile422Response.d.ts +1 -1
  316. package/dist/openapi/models/UploadFile422Response.js +1 -1
  317. package/dist/openapi/models/UploadProbeMediaMetadata.d.ts +1 -1
  318. package/dist/openapi/models/UploadProbeMediaMetadata.js +1 -1
  319. package/dist/openapi/models/UploadProbeProcessingClass.d.ts +1 -1
  320. package/dist/openapi/models/UploadProbeProcessingClass.js +1 -1
  321. package/dist/openapi/models/UploadProbeResponse.d.ts +1 -1
  322. package/dist/openapi/models/UploadProbeResponse.js +1 -1
  323. package/dist/openapi/models/UploadProbeStatus.d.ts +1 -1
  324. package/dist/openapi/models/UploadProbeStatus.js +1 -1
  325. package/dist/openapi/models/UploadProbeSuccessEnvelope.d.ts +1 -1
  326. package/dist/openapi/models/UploadProbeSuccessEnvelope.js +1 -1
  327. package/dist/openapi/models/UploadResponse.d.ts +1 -1
  328. package/dist/openapi/models/UploadResponse.js +1 -1
  329. package/dist/openapi/models/UploadSizeExceedsTierResponse.d.ts +1 -1
  330. package/dist/openapi/models/UploadSizeExceedsTierResponse.js +1 -1
  331. package/dist/openapi/models/UploadSource.d.ts +1 -1
  332. package/dist/openapi/models/UploadSource.js +1 -1
  333. package/dist/openapi/models/UploadSuccessEnvelope.d.ts +1 -1
  334. package/dist/openapi/models/UploadSuccessEnvelope.js +1 -1
  335. package/dist/openapi/models/UploadThresholds.d.ts +1 -1
  336. package/dist/openapi/models/UploadThresholds.js +1 -1
  337. package/dist/openapi/models/UserTier.d.ts +1 -1
  338. package/dist/openapi/models/UserTier.js +1 -1
  339. package/dist/openapi/models/ValidationErrorEnvelope.d.ts +1 -1
  340. package/dist/openapi/models/ValidationErrorEnvelope.js +1 -1
  341. package/dist/openapi/models/ValidationErrorEnvelopeDetailsInner.d.ts +1 -1
  342. package/dist/openapi/models/ValidationErrorEnvelopeDetailsInner.js +1 -1
  343. package/dist/openapi/models/VerifyEmailRequest.d.ts +1 -1
  344. package/dist/openapi/models/VerifyEmailRequest.js +1 -1
  345. package/dist/openapi/models/WarningType.d.ts +1 -1
  346. package/dist/openapi/models/WarningType.js +1 -1
  347. package/dist/openapi/models/WebhookOperationContext.d.ts +1 -1
  348. package/dist/openapi/models/WebhookOperationContext.js +1 -1
  349. package/dist/openapi/models/WebhookPayload.d.ts +1 -1
  350. package/dist/openapi/models/WebhookPayload.js +1 -1
  351. package/dist/openapi/models/WorkflowCancelBillingEffect.d.ts +1 -1
  352. package/dist/openapi/models/WorkflowCancelBillingEffect.js +1 -1
  353. package/dist/openapi/models/WorkflowCancelResponse.d.ts +1 -1
  354. package/dist/openapi/models/WorkflowCancelResponse.js +1 -1
  355. package/dist/openapi/models/WorkflowCancelSuccessEnvelope.d.ts +1 -1
  356. package/dist/openapi/models/WorkflowCancelSuccessEnvelope.js +1 -1
  357. package/dist/openapi/models/WorkflowCreateRequest.d.ts +1 -1
  358. package/dist/openapi/models/WorkflowCreateRequest.js +1 -1
  359. package/dist/openapi/models/WorkflowCreateResponse.d.ts +1 -1
  360. package/dist/openapi/models/WorkflowCreateResponse.js +1 -1
  361. package/dist/openapi/models/WorkflowCreateSuccessEnvelope.d.ts +1 -1
  362. package/dist/openapi/models/WorkflowCreateSuccessEnvelope.js +1 -1
  363. package/dist/openapi/models/WorkflowDownloadResponse.d.ts +1 -1
  364. package/dist/openapi/models/WorkflowDownloadResponse.js +1 -1
  365. package/dist/openapi/models/WorkflowDownloadSuccessEnvelope.d.ts +1 -1
  366. package/dist/openapi/models/WorkflowDownloadSuccessEnvelope.js +1 -1
  367. package/dist/openapi/models/WorkflowEdge.d.ts +1 -1
  368. package/dist/openapi/models/WorkflowEdge.js +1 -1
  369. package/dist/openapi/models/WorkflowExpiredResponse.d.ts +1 -1
  370. package/dist/openapi/models/WorkflowExpiredResponse.js +1 -1
  371. package/dist/openapi/models/WorkflowListResponse.d.ts +1 -1
  372. package/dist/openapi/models/WorkflowListResponse.js +1 -1
  373. package/dist/openapi/models/WorkflowListSuccessEnvelope.d.ts +1 -1
  374. package/dist/openapi/models/WorkflowListSuccessEnvelope.js +1 -1
  375. package/dist/openapi/models/WorkflowPauseRequiredAction.d.ts +1 -1
  376. package/dist/openapi/models/WorkflowPauseRequiredAction.js +1 -1
  377. package/dist/openapi/models/WorkflowPausedDetail.d.ts +1 -1
  378. package/dist/openapi/models/WorkflowPausedDetail.js +1 -1
  379. package/dist/openapi/models/WorkflowPausedDetailLinks.d.ts +1 -1
  380. package/dist/openapi/models/WorkflowPausedDetailLinks.js +1 -1
  381. package/dist/openapi/models/WorkflowProcessing.d.ts +1 -1
  382. package/dist/openapi/models/WorkflowProcessing.js +1 -1
  383. package/dist/openapi/models/WorkflowResumeResponse.d.ts +1 -1
  384. package/dist/openapi/models/WorkflowResumeResponse.js +1 -1
  385. package/dist/openapi/models/WorkflowResumeSuccessEnvelope.d.ts +1 -1
  386. package/dist/openapi/models/WorkflowResumeSuccessEnvelope.js +1 -1
  387. package/dist/openapi/models/WorkflowSource.d.ts +1 -1
  388. package/dist/openapi/models/WorkflowSource.js +1 -1
  389. package/dist/openapi/models/WorkflowStatus.d.ts +1 -1
  390. package/dist/openapi/models/WorkflowStatus.js +1 -1
  391. package/dist/openapi/models/WorkflowStatusResponse.d.ts +1 -1
  392. package/dist/openapi/models/WorkflowStatusResponse.js +1 -1
  393. package/dist/openapi/models/WorkflowStatusSuccessEnvelope.d.ts +1 -1
  394. package/dist/openapi/models/WorkflowStatusSuccessEnvelope.js +1 -1
  395. package/dist/openapi/models/WorkflowSummary.d.ts +1 -1
  396. package/dist/openapi/models/WorkflowSummary.js +1 -1
  397. package/dist/openapi/models/WorkflowSummaryJob.d.ts +1 -1
  398. package/dist/openapi/models/WorkflowSummaryJob.js +1 -1
  399. package/dist/openapi/models/WorkflowWarning.d.ts +1 -1
  400. package/dist/openapi/models/WorkflowWarning.js +1 -1
  401. package/dist/openapi/models/WorkflowWarningSeverity.d.ts +1 -1
  402. package/dist/openapi/models/WorkflowWarningSeverity.js +1 -1
  403. package/dist/openapi/runtime.d.ts +1 -1
  404. package/dist/openapi/runtime.js +1 -1
  405. package/dist/operations/compress.d.ts +77 -14
  406. package/dist/operations/compress.js +58 -4
  407. package/dist/operations/compress.metadata.js +135 -25
  408. package/dist/operations/convert.d.ts +47 -0
  409. package/dist/operations/convert.js +39 -0
  410. package/dist/operations/convert.metadata.js +56 -0
  411. package/openapi/api.yaml +23 -1
  412. package/operation-capabilities/operation-capabilities.json +19 -2
  413. package/operations/schemas/compress.yaml +412 -96
  414. package/operations/schemas/convert.yaml +158 -6
  415. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  {
2
- "capabilities_version": 123,
2
+ "capabilities_version": 131,
3
3
  "endpoints": {
4
4
  "DELETE /api/auth/api-keys/{apiKeyId}": {
5
5
  "auth": "required",
@@ -1118,6 +1118,31 @@
1118
1118
  "image/tiff"
1119
1119
  ],
1120
1120
  "options": {
1121
+ "auto_orient": {
1122
+ "availability": "planned",
1123
+ "default": true,
1124
+ "description": "Bake EXIF orientation into the pixels (honour the camera/device rotation tag) so the output displays upright everywhere, then drop the now-redundant orientation tag. `planned` \u2014 a restored control (was removed): the worker must apply the EXIF-orientation transform before encode on both Output routes. Default `true` (a behaviour change, proven planned-first). No-op for inputs without an orientation tag.",
1125
+ "honored_on": [
1126
+ "same_format",
1127
+ "format_change"
1128
+ ],
1129
+ "type": "boolean"
1130
+ },
1131
+ "color_profile": {
1132
+ "availability": "planned",
1133
+ "default": "keep",
1134
+ "description": "ICC colour-profile handling \u2014 its OWN control, DECOUPLED from `metadata` (stripping metadata must NOT silently shift colours; that coupling is the correctness bug this fixes). `keep` (default) = preserve the embedded profile; `srgb` = convert to sRGB (also handles CMYK\u2192sRGB); `strip` = drop the profile (smallest \u2014 only when the consumer manages colour itself). `planned` \u2014 the worker does not yet honour it (today the default strips ICC during metadata-strip; the fix preserves it). Applies on BOTH Output routes (optimiser preserves; transcoder preserves/converts). Worker-proven flip.",
1135
+ "honored_on": [
1136
+ "same_format",
1137
+ "format_change"
1138
+ ],
1139
+ "type": "enum",
1140
+ "values": [
1141
+ "keep",
1142
+ "srgb",
1143
+ "strip"
1144
+ ]
1145
+ },
1121
1146
  "fit": {
1122
1147
  "default": "max",
1123
1148
  "depends_on": {
@@ -1147,25 +1172,56 @@
1147
1172
  "min": 1,
1148
1173
  "type": "integer"
1149
1174
  },
1175
+ "keep_metadata": {
1176
+ "availability": "planned",
1177
+ "depends_on": {
1178
+ "metadata": "strip"
1179
+ },
1180
+ "description": "Selective per-category metadata keep (optimiser/same_format route): preserve ONLY these categories and strip the rest \u2014 refines the strip path (`metadata: strip`). Valid categories: `copyright`, `gps` (location), `date` (capture time); combinable. `planned` \u2014 the worker does not yet do selective keep (use `metadata: keep` to preserve everything), so the API returns feature_not_available until lambdas proves it.",
1181
+ "honored_on": [
1182
+ "same_format"
1183
+ ],
1184
+ "items": {
1185
+ "type": "string"
1186
+ },
1187
+ "type": "array",
1188
+ "uniqueItems": true
1189
+ },
1150
1190
  "metadata": {
1151
- "default": "all",
1152
- "description": "Metadata handling (optimiser/same_format route). `all` = strip all EXIF/IPTC/XMP (default). `keep` = preserve EXIF/ICC/XMP \u2014 STABLE (worker-proven, libcaesium; lambdas PR #260, staging round-trip + unit test). Any other value is rejected as invalid_options.",
1191
+ "default": "strip",
1192
+ "description": "Metadata handling (optimiser/same_format route). `strip` = remove all EXIF/IPTC/XMP (default). `keep` = preserve EXIF/ICC/XMP \u2014 STABLE (worker-proven, libcaesium; lambdas PR #260, staging round-trip + unit test). `all` is a DEPRECATED alias of `strip` (the pre-2026-06-23 token; `all` reading as \"strip all\" was counterintuitive) \u2014 still accepted, emits Deprecation/Sunset, migrate to `strip`. The API lowers `strip`\u2192`all` at the worker boundary. Any other value is rejected as invalid_options.",
1153
1193
  "honored_on": [
1154
1194
  "same_format"
1155
1195
  ],
1196
+ "per_value_availability": {
1197
+ "all": {
1198
+ "availability": "deprecated"
1199
+ }
1200
+ },
1156
1201
  "type": "enum",
1157
1202
  "values": [
1158
- "all",
1159
- "keep"
1203
+ "strip",
1204
+ "keep",
1205
+ "all"
1160
1206
  ]
1161
1207
  },
1162
1208
  "output_format": {
1163
1209
  "default": "original",
1164
- "description": "Output format. original = keep input format (default); webp = recompress to WebP \u2014 the one live compress+format target (proven on staging). Other format changes (jpeg/png/avif/gif/tiff) are the convert operation's job, not compress. See FORMAT.md.",
1210
+ "description": "Output format. original = keep input format (default); webp = recompress to WebP \u2014 the one live compress+format target (proven on staging). Concrete format changes (jpeg/png/avif/gif/tiff) are the convert operation's job, not compress. `auto` / `smallest` are PLANNED auto-format directives \u2014 the server encodes to several candidate formats and returns the best (`auto` = the most suitable; `smallest` = the absolute fewest bytes), reporting the chosen format via the result `mime_type`. They are SELECTION STRATEGIES, not concrete targets (convert cannot express \"pick the smallest\"), so they live here and stay `planned` until the API try-all-return-smallest logic + worker proof land. See FORMAT.md.",
1211
+ "per_value_availability": {
1212
+ "auto": {
1213
+ "availability": "planned"
1214
+ },
1215
+ "smallest": {
1216
+ "availability": "planned"
1217
+ }
1218
+ },
1165
1219
  "type": "enum",
1166
1220
  "values": [
1167
1221
  "original",
1168
- "webp"
1222
+ "webp",
1223
+ "auto",
1224
+ "smallest"
1169
1225
  ]
1170
1226
  },
1171
1227
  "quality": {
@@ -1197,6 +1253,16 @@
1197
1253
  "image/avif"
1198
1254
  ],
1199
1255
  "options": {
1256
+ "auto_orient": {
1257
+ "availability": "planned",
1258
+ "default": true,
1259
+ "description": "Bake EXIF orientation into the pixels (honour the camera/device rotation tag) so the output displays upright everywhere, then drop the now-redundant orientation tag. `planned` \u2014 a restored control (was removed): the worker must apply the EXIF-orientation transform before encode on both Output routes. Default `true` (a behaviour change, proven planned-first). No-op for inputs without an orientation tag.",
1260
+ "honored_on": [
1261
+ "same_format",
1262
+ "format_change"
1263
+ ],
1264
+ "type": "boolean"
1265
+ },
1200
1266
  "avif_speed": {
1201
1267
  "default": 4,
1202
1268
  "description": "AVIF encode speed (1-10, ravif). Lower = smaller file, slower encode; higher = faster, larger. Default 4. Optimiser (same_format) route.",
@@ -1207,17 +1273,27 @@
1207
1273
  "min": 1,
1208
1274
  "type": "integer"
1209
1275
  },
1276
+ "color_profile": {
1277
+ "availability": "planned",
1278
+ "default": "keep",
1279
+ "description": "ICC colour-profile handling \u2014 its OWN control, DECOUPLED from `metadata` (stripping metadata must NOT silently shift colours; that coupling is the correctness bug this fixes). `keep` (default) = preserve the embedded profile; `srgb` = convert to sRGB (also handles CMYK\u2192sRGB); `strip` = drop the profile (smallest \u2014 only when the consumer manages colour itself). `planned` \u2014 the worker does not yet honour it (today the default strips ICC during metadata-strip; the fix preserves it). Applies on BOTH Output routes (optimiser preserves; transcoder preserves/converts). Worker-proven flip.",
1280
+ "honored_on": [
1281
+ "same_format",
1282
+ "format_change"
1283
+ ],
1284
+ "type": "enum",
1285
+ "values": [
1286
+ "keep",
1287
+ "srgb",
1288
+ "strip"
1289
+ ]
1290
+ },
1210
1291
  "encoding_mode": {
1211
1292
  "default": "quality",
1212
- "description": "Compression mode (mirrors compress.video). `quality` = the `quality` slider drives the encode (default, live). `target_size` = `planned` \u2014 hit a byte budget via the worker's encode-measure-binary-search loop (lambdas building; jpeg/webp/avif only). AVIF encodes are slow, so the loop caps iterations. Optimiser (same_format) route.",
1293
+ "description": "Compression mode (mirrors compress.video). `quality` = the `quality` slider drives the encode (default). `target_size` = hit a byte budget via the worker's encode-measure-binary-search loop \u2014 STABLE (worker-proven on staging, lambdas git-870a7c2: re-encode under target + best-effort + original-wins). AVIF encodes are slow, so the loop caps iterations (a 6-iteration cap, ~18s worst case). Optimiser (same_format) route.",
1213
1294
  "honored_on": [
1214
1295
  "same_format"
1215
1296
  ],
1216
- "per_value_availability": {
1217
- "target_size": {
1218
- "availability": "planned"
1219
- }
1220
- },
1221
1297
  "type": "enum",
1222
1298
  "values": [
1223
1299
  "quality",
@@ -1254,23 +1330,39 @@
1254
1330
  "type": "integer"
1255
1331
  },
1256
1332
  "metadata": {
1257
- "default": "all",
1258
- "description": "Metadata handling. `all` = strip all EXIF/IPTC/XMP (the only supported value). `keep` is NOT offered for AVIF \u2014 ravif re-encodes from pixels and cannot preserve metadata (the worker rejects `keep` as invalid_options).",
1333
+ "default": "strip",
1334
+ "description": "Metadata handling. `strip` = remove all EXIF/IPTC/XMP (default, the only supported behaviour). `all` is a DEPRECATED alias of `strip` (migrate to `strip`; the API lowers it at the worker boundary). `keep` is NOT offered for AVIF \u2014 ravif re-encodes from pixels and cannot preserve metadata (the worker rejects `keep` as invalid_options).",
1259
1335
  "honored_on": [
1260
1336
  "same_format"
1261
1337
  ],
1338
+ "per_value_availability": {
1339
+ "all": {
1340
+ "availability": "deprecated"
1341
+ }
1342
+ },
1262
1343
  "type": "enum",
1263
1344
  "values": [
1345
+ "strip",
1264
1346
  "all"
1265
1347
  ]
1266
1348
  },
1267
1349
  "output_format": {
1268
1350
  "default": "original",
1269
- "description": "Output format. original = keep input format (default); webp = recompress to WebP \u2014 the one live compress+format target (proven on staging). Other format changes (jpeg/png/avif/gif/tiff) are the convert operation's job, not compress. See FORMAT.md.",
1351
+ "description": "Output format. original = keep input format (default); webp = recompress to WebP \u2014 the one live compress+format target (proven on staging). Concrete format changes (jpeg/png/avif/gif/tiff) are the convert operation's job, not compress. `auto` / `smallest` are PLANNED auto-format directives \u2014 the server encodes to several candidate formats and returns the best (`auto` = the most suitable; `smallest` = the absolute fewest bytes), reporting the chosen format via the result `mime_type`. They are SELECTION STRATEGIES, not concrete targets (convert cannot express \"pick the smallest\"), so they live here and stay `planned` until the API try-all-return-smallest logic + worker proof land. See FORMAT.md.",
1352
+ "per_value_availability": {
1353
+ "auto": {
1354
+ "availability": "planned"
1355
+ },
1356
+ "smallest": {
1357
+ "availability": "planned"
1358
+ }
1359
+ },
1270
1360
  "type": "enum",
1271
1361
  "values": [
1272
1362
  "original",
1273
- "webp"
1363
+ "webp",
1364
+ "auto",
1365
+ "smallest"
1274
1366
  ]
1275
1367
  },
1276
1368
  "quality": {
@@ -1287,11 +1379,10 @@
1287
1379
  "type": "integer"
1288
1380
  },
1289
1381
  "target_size_bytes": {
1290
- "availability": "planned",
1291
1382
  "depends_on": {
1292
1383
  "encoding_mode": "target_size"
1293
1384
  },
1294
- "description": "Target output size in bytes (min 1024 = 1 KiB). `planned` \u2014 the image encode-measure loop binary-searches quality to land at or under the target; best-effort if the target is unreachable at min quality (the result reports the chosen quality + whether the target was met). Optimiser (same_format) route.",
1385
+ "description": "Target output size in bytes (min 1024 = 1 KiB). The image encode-measure loop binary-searches quality to land at or under the target; best-effort if the target is unreachable at min quality (the result reports the chosen quality + whether the target was met). STABLE (worker-proven, lambdas git-870a7c2). Optimiser (same_format) route.",
1295
1386
  "honored_on": [
1296
1387
  "same_format"
1297
1388
  ],
@@ -1316,17 +1407,49 @@
1316
1407
  "image/jpeg"
1317
1408
  ],
1318
1409
  "options": {
1410
+ "auto_orient": {
1411
+ "availability": "planned",
1412
+ "default": true,
1413
+ "description": "Bake EXIF orientation into the pixels (honour the camera/device rotation tag) so the output displays upright everywhere, then drop the now-redundant orientation tag. `planned` \u2014 a restored control (was removed): the worker must apply the EXIF-orientation transform before encode on both Output routes. Default `true` (a behaviour change, proven planned-first). No-op for inputs without an orientation tag.",
1414
+ "honored_on": [
1415
+ "same_format",
1416
+ "format_change"
1417
+ ],
1418
+ "type": "boolean"
1419
+ },
1420
+ "chroma_subsampling": {
1421
+ "description": "JPEG chroma subsampling \u2014 the colour-resolution/size trade-off. `420` (4:2:0) = smallest, chroma at quarter resolution (default-ish for web photos); `422` (4:2:2) = half-horizontal; `444` (4:4:4) = full chroma (largest, best for sharp colour edges / text). JPEG ONLY (declared on image_jpeg only \u2014 ravif hardcodes 4:4:4, libwebp lossy locks 4:2:0). String values (the worker strict-matches strings). STABLE \u2014 worker-proven on staging (lambdas PR #264, deployed git-f2bef85: output JPEG SOF luma sampling bytes verified 0x22/0x21/0x11 for 420/422/444). INCOMPATIBLE with `lossless` (any chroma value): lossless JPEG is a DCT-coefficient copy and cannot resample chroma \u2014 see the chroma_subsampling.lossless_conflict constraint.",
1422
+ "honored_on": [
1423
+ "same_format"
1424
+ ],
1425
+ "type": "enum",
1426
+ "values": [
1427
+ "420",
1428
+ "422",
1429
+ "444"
1430
+ ]
1431
+ },
1432
+ "color_profile": {
1433
+ "availability": "planned",
1434
+ "default": "keep",
1435
+ "description": "ICC colour-profile handling \u2014 its OWN control, DECOUPLED from `metadata` (stripping metadata must NOT silently shift colours; that coupling is the correctness bug this fixes). `keep` (default) = preserve the embedded profile; `srgb` = convert to sRGB (also handles CMYK\u2192sRGB); `strip` = drop the profile (smallest \u2014 only when the consumer manages colour itself). `planned` \u2014 the worker does not yet honour it (today the default strips ICC during metadata-strip; the fix preserves it). Applies on BOTH Output routes (optimiser preserves; transcoder preserves/converts). Worker-proven flip.",
1436
+ "honored_on": [
1437
+ "same_format",
1438
+ "format_change"
1439
+ ],
1440
+ "type": "enum",
1441
+ "values": [
1442
+ "keep",
1443
+ "srgb",
1444
+ "strip"
1445
+ ]
1446
+ },
1319
1447
  "encoding_mode": {
1320
1448
  "default": "quality",
1321
- "description": "Compression mode (mirrors compress.video). `quality` = the `quality` slider drives the encode (default, live). `target_size` = `planned` \u2014 hit a byte budget via the worker's encode-measure-binary-search loop (lambdas building; jpeg/webp/avif only). Optimiser (same_format) route.",
1449
+ "description": "Compression mode (mirrors compress.video). `quality` = the `quality` slider drives the encode (default). `target_size` = hit a byte budget via the worker's encode-measure-binary-search loop \u2014 STABLE (worker-proven on staging, lambdas git-870a7c2: re-encode under target + best-effort below floor + original-wins, all proven). Optimiser (same_format) route.",
1322
1450
  "honored_on": [
1323
1451
  "same_format"
1324
1452
  ],
1325
- "per_value_availability": {
1326
- "target_size": {
1327
- "availability": "planned"
1328
- }
1329
- },
1330
1453
  "type": "enum",
1331
1454
  "values": [
1332
1455
  "quality",
@@ -1362,6 +1485,21 @@
1362
1485
  "min": 1,
1363
1486
  "type": "integer"
1364
1487
  },
1488
+ "keep_metadata": {
1489
+ "availability": "planned",
1490
+ "depends_on": {
1491
+ "metadata": "strip"
1492
+ },
1493
+ "description": "Selective per-category metadata keep (optimiser/same_format route): preserve ONLY these categories and strip the rest \u2014 refines the strip path (`metadata: strip`). Valid categories: `copyright`, `gps` (location), `date` (capture time); combinable. `planned` \u2014 the worker does not yet do selective keep (use `metadata: keep` to preserve everything), so the API returns feature_not_available until lambdas proves it.",
1494
+ "honored_on": [
1495
+ "same_format"
1496
+ ],
1497
+ "items": {
1498
+ "type": "string"
1499
+ },
1500
+ "type": "array",
1501
+ "uniqueItems": true
1502
+ },
1365
1503
  "lossless": {
1366
1504
  "default": false,
1367
1505
  "depends_on": {
@@ -1374,24 +1512,40 @@
1374
1512
  "type": "boolean"
1375
1513
  },
1376
1514
  "metadata": {
1377
- "default": "all",
1378
- "description": "Metadata handling (optimiser/same_format route). `all` = strip all EXIF/IPTC/XMP (default). `keep` = preserve EXIF/ICC/XMP \u2014 STABLE (worker-proven, libcaesium; lambdas PR #260, staging round-trip + unit test). Any other value is rejected as invalid_options.",
1515
+ "default": "strip",
1516
+ "description": "Metadata handling (optimiser/same_format route). `strip` = remove all EXIF/IPTC/XMP (default). `keep` = preserve EXIF/ICC/XMP \u2014 STABLE (worker-proven, libcaesium; lambdas PR #260, staging round-trip + unit test). `all` is a DEPRECATED alias of `strip` (the pre-2026-06-23 token; `all` reading as \"strip all\" was counterintuitive) \u2014 still accepted, emits Deprecation/Sunset, migrate to `strip`. The API lowers `strip`\u2192`all` at the worker boundary. Any other value is rejected as invalid_options.",
1379
1517
  "honored_on": [
1380
1518
  "same_format"
1381
1519
  ],
1520
+ "per_value_availability": {
1521
+ "all": {
1522
+ "availability": "deprecated"
1523
+ }
1524
+ },
1382
1525
  "type": "enum",
1383
1526
  "values": [
1384
- "all",
1385
- "keep"
1527
+ "strip",
1528
+ "keep",
1529
+ "all"
1386
1530
  ]
1387
1531
  },
1388
1532
  "output_format": {
1389
1533
  "default": "original",
1390
- "description": "Output format. original = keep input format (default); webp = recompress to WebP \u2014 the one live compress+format target (proven on staging). Other format changes (jpeg/png/avif/gif/tiff) are the convert operation's job, not compress. See FORMAT.md.",
1534
+ "description": "Output format. original = keep input format (default); webp = recompress to WebP \u2014 the one live compress+format target (proven on staging). Concrete format changes (jpeg/png/avif/gif/tiff) are the convert operation's job, not compress. `auto` / `smallest` are PLANNED auto-format directives \u2014 the server encodes to several candidate formats and returns the best (`auto` = the most suitable; `smallest` = the absolute fewest bytes), reporting the chosen format via the result `mime_type`. They are SELECTION STRATEGIES, not concrete targets (convert cannot express \"pick the smallest\"), so they live here and stay `planned` until the API try-all-return-smallest logic + worker proof land. See FORMAT.md.",
1535
+ "per_value_availability": {
1536
+ "auto": {
1537
+ "availability": "planned"
1538
+ },
1539
+ "smallest": {
1540
+ "availability": "planned"
1541
+ }
1542
+ },
1391
1543
  "type": "enum",
1392
1544
  "values": [
1393
1545
  "original",
1394
- "webp"
1546
+ "webp",
1547
+ "auto",
1548
+ "smallest"
1395
1549
  ]
1396
1550
  },
1397
1551
  "progressive": {
@@ -1416,11 +1570,10 @@
1416
1570
  "type": "integer"
1417
1571
  },
1418
1572
  "target_size_bytes": {
1419
- "availability": "planned",
1420
1573
  "depends_on": {
1421
1574
  "encoding_mode": "target_size"
1422
1575
  },
1423
- "description": "Target output size in bytes (min 1024 = 1 KiB). `planned` \u2014 the image encode-measure loop binary-searches quality to land at or under the target; best-effort if the target is unreachable at min quality (the result reports the chosen quality + whether the target was met). Optimiser (same_format) route.",
1576
+ "description": "Target output size in bytes (min 1024 = 1 KiB). The image encode-measure loop binary-searches quality to land at or under the target; best-effort if the target is unreachable at min quality (the result reports the chosen quality + whether the target was met). STABLE (worker-proven, lambdas git-870a7c2). Optimiser (same_format) route.",
1424
1577
  "honored_on": [
1425
1578
  "same_format"
1426
1579
  ],
@@ -1445,6 +1598,31 @@
1445
1598
  "image/png"
1446
1599
  ],
1447
1600
  "options": {
1601
+ "auto_orient": {
1602
+ "availability": "planned",
1603
+ "default": true,
1604
+ "description": "Bake EXIF orientation into the pixels (honour the camera/device rotation tag) so the output displays upright everywhere, then drop the now-redundant orientation tag. `planned` \u2014 a restored control (was removed): the worker must apply the EXIF-orientation transform before encode on both Output routes. Default `true` (a behaviour change, proven planned-first). No-op for inputs without an orientation tag.",
1605
+ "honored_on": [
1606
+ "same_format",
1607
+ "format_change"
1608
+ ],
1609
+ "type": "boolean"
1610
+ },
1611
+ "color_profile": {
1612
+ "availability": "planned",
1613
+ "default": "keep",
1614
+ "description": "ICC colour-profile handling \u2014 its OWN control, DECOUPLED from `metadata` (stripping metadata must NOT silently shift colours; that coupling is the correctness bug this fixes). `keep` (default) = preserve the embedded profile; `srgb` = convert to sRGB (also handles CMYK\u2192sRGB); `strip` = drop the profile (smallest \u2014 only when the consumer manages colour itself). `planned` \u2014 the worker does not yet honour it (today the default strips ICC during metadata-strip; the fix preserves it). Applies on BOTH Output routes (optimiser preserves; transcoder preserves/converts). Worker-proven flip.",
1615
+ "honored_on": [
1616
+ "same_format",
1617
+ "format_change"
1618
+ ],
1619
+ "type": "enum",
1620
+ "values": [
1621
+ "keep",
1622
+ "srgb",
1623
+ "strip"
1624
+ ]
1625
+ },
1448
1626
  "fit": {
1449
1627
  "default": "max",
1450
1628
  "depends_on": {
@@ -1474,6 +1652,21 @@
1474
1652
  "min": 1,
1475
1653
  "type": "integer"
1476
1654
  },
1655
+ "keep_metadata": {
1656
+ "availability": "planned",
1657
+ "depends_on": {
1658
+ "metadata": "strip"
1659
+ },
1660
+ "description": "Selective per-category metadata keep (optimiser/same_format route): preserve ONLY these categories and strip the rest \u2014 refines the strip path (`metadata: strip`). Valid categories: `copyright`, `gps` (location), `date` (capture time); combinable. `planned` \u2014 the worker does not yet do selective keep (use `metadata: keep` to preserve everything), so the API returns feature_not_available until lambdas proves it.",
1661
+ "honored_on": [
1662
+ "same_format"
1663
+ ],
1664
+ "items": {
1665
+ "type": "string"
1666
+ },
1667
+ "type": "array",
1668
+ "uniqueItems": true
1669
+ },
1477
1670
  "lossy": {
1478
1671
  "availability": "planned",
1479
1672
  "default": false,
@@ -1484,15 +1677,21 @@
1484
1677
  "type": "boolean"
1485
1678
  },
1486
1679
  "metadata": {
1487
- "default": "all",
1488
- "description": "Metadata handling (optimiser/same_format route). `all` = strip all EXIF/IPTC/XMP (default). `keep` = preserve EXIF/ICC/XMP \u2014 STABLE (worker-proven, libcaesium; lambdas PR #260, staging round-trip + unit test). Any other value is rejected as invalid_options.",
1680
+ "default": "strip",
1681
+ "description": "Metadata handling (optimiser/same_format route). `strip` = remove all EXIF/IPTC/XMP (default). `keep` = preserve EXIF/ICC/XMP \u2014 STABLE (worker-proven, libcaesium; lambdas PR #260, staging round-trip + unit test). `all` is a DEPRECATED alias of `strip` (the pre-2026-06-23 token; `all` reading as \"strip all\" was counterintuitive) \u2014 still accepted, emits Deprecation/Sunset, migrate to `strip`. The API lowers `strip`\u2192`all` at the worker boundary. Any other value is rejected as invalid_options.",
1489
1682
  "honored_on": [
1490
1683
  "same_format"
1491
1684
  ],
1685
+ "per_value_availability": {
1686
+ "all": {
1687
+ "availability": "deprecated"
1688
+ }
1689
+ },
1492
1690
  "type": "enum",
1493
1691
  "values": [
1494
- "all",
1495
- "keep"
1692
+ "strip",
1693
+ "keep",
1694
+ "all"
1496
1695
  ]
1497
1696
  },
1498
1697
  "optimization_level": {
@@ -1507,11 +1706,21 @@
1507
1706
  },
1508
1707
  "output_format": {
1509
1708
  "default": "original",
1510
- "description": "Output format. original = keep input format (default); webp = recompress to WebP \u2014 the one live compress+format target (proven on staging). Other format changes (jpeg/png/avif/gif/tiff) are the convert operation's job, not compress. See FORMAT.md.",
1709
+ "description": "Output format. original = keep input format (default); webp = recompress to WebP \u2014 the one live compress+format target (proven on staging). Concrete format changes (jpeg/png/avif/gif/tiff) are the convert operation's job, not compress. `auto` / `smallest` are PLANNED auto-format directives \u2014 the server encodes to several candidate formats and returns the best (`auto` = the most suitable; `smallest` = the absolute fewest bytes), reporting the chosen format via the result `mime_type`. They are SELECTION STRATEGIES, not concrete targets (convert cannot express \"pick the smallest\"), so they live here and stay `planned` until the API try-all-return-smallest logic + worker proof land. See FORMAT.md.",
1710
+ "per_value_availability": {
1711
+ "auto": {
1712
+ "availability": "planned"
1713
+ },
1714
+ "smallest": {
1715
+ "availability": "planned"
1716
+ }
1717
+ },
1511
1718
  "type": "enum",
1512
1719
  "values": [
1513
1720
  "original",
1514
- "webp"
1721
+ "webp",
1722
+ "auto",
1723
+ "smallest"
1515
1724
  ]
1516
1725
  },
1517
1726
  "quality": {
@@ -1542,23 +1751,39 @@
1542
1751
  ],
1543
1752
  "options": {
1544
1753
  "metadata": {
1545
- "default": "all",
1546
- "description": "Metadata handling. `all` = strip all metadata (the only supported value). `keep` is NOT offered for SVG \u2014 SVGO optimises the markup and cannot preserve a metadata block (the worker rejects `keep` as invalid_options).",
1754
+ "default": "strip",
1755
+ "description": "Metadata handling. `strip` = remove all metadata (default, the only supported behaviour). `all` is a DEPRECATED alias of `strip` (migrate to `strip`; the API lowers it at the worker boundary). `keep` is NOT offered for SVG \u2014 SVGO optimises the markup and cannot preserve a metadata block (the worker rejects `keep` as invalid_options).",
1547
1756
  "honored_on": [
1548
1757
  "same_format"
1549
1758
  ],
1759
+ "per_value_availability": {
1760
+ "all": {
1761
+ "availability": "deprecated"
1762
+ }
1763
+ },
1550
1764
  "type": "enum",
1551
1765
  "values": [
1766
+ "strip",
1552
1767
  "all"
1553
1768
  ]
1554
1769
  },
1555
1770
  "output_format": {
1556
1771
  "default": "original",
1557
- "description": "Output format. original = keep input format (default); webp = recompress to WebP. Other format changes are the convert operation's job. See FORMAT.md.",
1772
+ "description": "Output format. original = keep input format (default); webp = recompress to WebP. Concrete format changes are the convert operation's job. `auto` / `smallest` are PLANNED auto-format directives (server picks the best/smallest candidate format, reported via the result `mime_type`) \u2014 selection strategies, not concrete targets, planned until the API logic + worker proof land. See FORMAT.md.",
1773
+ "per_value_availability": {
1774
+ "auto": {
1775
+ "availability": "planned"
1776
+ },
1777
+ "smallest": {
1778
+ "availability": "planned"
1779
+ }
1780
+ },
1558
1781
  "type": "enum",
1559
1782
  "values": [
1560
1783
  "original",
1561
- "webp"
1784
+ "webp",
1785
+ "auto",
1786
+ "smallest"
1562
1787
  ]
1563
1788
  },
1564
1789
  "quality": {
@@ -1579,17 +1804,37 @@
1579
1804
  "image/webp"
1580
1805
  ],
1581
1806
  "options": {
1807
+ "auto_orient": {
1808
+ "availability": "planned",
1809
+ "default": true,
1810
+ "description": "Bake EXIF orientation into the pixels (honour the camera/device rotation tag) so the output displays upright everywhere, then drop the now-redundant orientation tag. `planned` \u2014 a restored control (was removed): the worker must apply the EXIF-orientation transform before encode on both Output routes. Default `true` (a behaviour change, proven planned-first). No-op for inputs without an orientation tag.",
1811
+ "honored_on": [
1812
+ "same_format",
1813
+ "format_change"
1814
+ ],
1815
+ "type": "boolean"
1816
+ },
1817
+ "color_profile": {
1818
+ "availability": "planned",
1819
+ "default": "keep",
1820
+ "description": "ICC colour-profile handling \u2014 its OWN control, DECOUPLED from `metadata` (stripping metadata must NOT silently shift colours; that coupling is the correctness bug this fixes). `keep` (default) = preserve the embedded profile; `srgb` = convert to sRGB (also handles CMYK\u2192sRGB); `strip` = drop the profile (smallest \u2014 only when the consumer manages colour itself). `planned` \u2014 the worker does not yet honour it (today the default strips ICC during metadata-strip; the fix preserves it). Applies on BOTH Output routes (optimiser preserves; transcoder preserves/converts). Worker-proven flip.",
1821
+ "honored_on": [
1822
+ "same_format",
1823
+ "format_change"
1824
+ ],
1825
+ "type": "enum",
1826
+ "values": [
1827
+ "keep",
1828
+ "srgb",
1829
+ "strip"
1830
+ ]
1831
+ },
1582
1832
  "encoding_mode": {
1583
1833
  "default": "quality",
1584
- "description": "Compression mode (mirrors compress.video). `quality` = the `quality` slider drives the encode (default, live). `target_size` = `planned` \u2014 hit a byte budget via the worker's encode-measure-binary-search loop (lambdas building; jpeg/webp/avif only). Optimiser (same_format) route.",
1834
+ "description": "Compression mode (mirrors compress.video). `quality` = the `quality` slider drives the encode (default). `target_size` = hit a byte budget via the worker's encode-measure-binary-search loop \u2014 STABLE (worker-proven on staging, lambdas git-870a7c2: re-encode under target + best-effort below floor + original-wins, all proven). Optimiser (same_format) route.",
1585
1835
  "honored_on": [
1586
1836
  "same_format"
1587
1837
  ],
1588
- "per_value_availability": {
1589
- "target_size": {
1590
- "availability": "planned"
1591
- }
1592
- },
1593
1838
  "type": "enum",
1594
1839
  "values": [
1595
1840
  "quality",
@@ -1625,6 +1870,21 @@
1625
1870
  "min": 1,
1626
1871
  "type": "integer"
1627
1872
  },
1873
+ "keep_metadata": {
1874
+ "availability": "planned",
1875
+ "depends_on": {
1876
+ "metadata": "strip"
1877
+ },
1878
+ "description": "Selective per-category metadata keep (optimiser/same_format route): preserve ONLY these categories and strip the rest \u2014 refines the strip path (`metadata: strip`). Valid categories: `copyright`, `gps` (location), `date` (capture time); combinable. `planned` \u2014 the worker does not yet do selective keep (use `metadata: keep` to preserve everything), so the API returns feature_not_available until lambdas proves it.",
1879
+ "honored_on": [
1880
+ "same_format"
1881
+ ],
1882
+ "items": {
1883
+ "type": "string"
1884
+ },
1885
+ "type": "array",
1886
+ "uniqueItems": true
1887
+ },
1628
1888
  "lossless": {
1629
1889
  "default": false,
1630
1890
  "depends_on": {
@@ -1637,24 +1897,40 @@
1637
1897
  "type": "boolean"
1638
1898
  },
1639
1899
  "metadata": {
1640
- "default": "all",
1641
- "description": "Metadata handling (optimiser/same_format route). `all` = strip all EXIF/IPTC/XMP (default). `keep` = preserve EXIF/ICC/XMP \u2014 STABLE (worker-proven, libcaesium; lambdas PR #260, staging round-trip + unit test). Any other value is rejected as invalid_options.",
1900
+ "default": "strip",
1901
+ "description": "Metadata handling (optimiser/same_format route). `strip` = remove all EXIF/IPTC/XMP (default). `keep` = preserve EXIF/ICC/XMP \u2014 STABLE (worker-proven, libcaesium; lambdas PR #260, staging round-trip + unit test). `all` is a DEPRECATED alias of `strip` (the pre-2026-06-23 token; `all` reading as \"strip all\" was counterintuitive) \u2014 still accepted, emits Deprecation/Sunset, migrate to `strip`. The API lowers `strip`\u2192`all` at the worker boundary. Any other value is rejected as invalid_options.",
1642
1902
  "honored_on": [
1643
1903
  "same_format"
1644
1904
  ],
1905
+ "per_value_availability": {
1906
+ "all": {
1907
+ "availability": "deprecated"
1908
+ }
1909
+ },
1645
1910
  "type": "enum",
1646
1911
  "values": [
1647
- "all",
1648
- "keep"
1912
+ "strip",
1913
+ "keep",
1914
+ "all"
1649
1915
  ]
1650
1916
  },
1651
1917
  "output_format": {
1652
1918
  "default": "original",
1653
- "description": "Output format. original = keep input format (default); webp = recompress to WebP \u2014 the one live compress+format target (proven on staging). Other format changes (jpeg/png/avif/gif/tiff) are the convert operation's job, not compress. See FORMAT.md.",
1919
+ "description": "Output format. original = keep input format (default); webp = recompress to WebP \u2014 the one live compress+format target (proven on staging). Concrete format changes (jpeg/png/avif/gif/tiff) are the convert operation's job, not compress. `auto` / `smallest` are PLANNED auto-format directives \u2014 the server encodes to several candidate formats and returns the best (`auto` = the most suitable; `smallest` = the absolute fewest bytes), reporting the chosen format via the result `mime_type`. They are SELECTION STRATEGIES, not concrete targets (convert cannot express \"pick the smallest\"), so they live here and stay `planned` until the API try-all-return-smallest logic + worker proof land. See FORMAT.md.",
1920
+ "per_value_availability": {
1921
+ "auto": {
1922
+ "availability": "planned"
1923
+ },
1924
+ "smallest": {
1925
+ "availability": "planned"
1926
+ }
1927
+ },
1654
1928
  "type": "enum",
1655
1929
  "values": [
1656
1930
  "original",
1657
- "webp"
1931
+ "webp",
1932
+ "auto",
1933
+ "smallest"
1658
1934
  ]
1659
1935
  },
1660
1936
  "quality": {
@@ -1671,11 +1947,10 @@
1671
1947
  "type": "integer"
1672
1948
  },
1673
1949
  "target_size_bytes": {
1674
- "availability": "planned",
1675
1950
  "depends_on": {
1676
1951
  "encoding_mode": "target_size"
1677
1952
  },
1678
- "description": "Target output size in bytes (min 1024 = 1 KiB). `planned` \u2014 the image encode-measure loop binary-searches quality to land at or under the target; best-effort if the target is unreachable at min quality (the result reports the chosen quality + whether the target was met). Optimiser (same_format) route.",
1953
+ "description": "Target output size in bytes (min 1024 = 1 KiB). The image encode-measure loop binary-searches quality to land at or under the target; best-effort if the target is unreachable at min quality (the result reports the chosen quality + whether the target was met). STABLE (worker-proven, lambdas git-870a7c2). Optimiser (same_format) route.",
1679
1954
  "honored_on": [
1680
1955
  "same_format"
1681
1956
  ],
@@ -1971,7 +2246,6 @@
1971
2246
  "mimes": [
1972
2247
  "image/jpeg",
1973
2248
  "image/png",
1974
- "image/gif",
1975
2249
  "image/webp",
1976
2250
  "image/tiff",
1977
2251
  "image/bmp",
@@ -1980,6 +2254,15 @@
1980
2254
  "image/heic"
1981
2255
  ],
1982
2256
  "options": {
2257
+ "auto_orient": {
2258
+ "availability": "planned",
2259
+ "default": true,
2260
+ "description": "Bake EXIF orientation into the pixels on the transcoder (format-change) route \u2014 mirrors compress.image.auto_orient. `planned` \u2014 the convert worker does not yet apply the orientation transform. Declared HERE so the API re-validates the rewritten Output convert op.",
2261
+ "honored_on": [
2262
+ "format_change"
2263
+ ],
2264
+ "type": "boolean"
2265
+ },
1983
2266
  "background": {
1984
2267
  "depends_on": {
1985
2268
  "output_format": "jpeg"
@@ -1991,6 +2274,20 @@
1991
2274
  "pattern": "^#[0-9a-fA-F]{6}$",
1992
2275
  "type": "string"
1993
2276
  },
2277
+ "color_profile": {
2278
+ "availability": "planned",
2279
+ "default": "keep",
2280
+ "description": "ICC colour-profile handling on the transcoder (format-change) route \u2014 mirrors compress.image.color_profile (its own control, decoupled from metadata). `keep` (default) = preserve; `srgb` = convert to sRGB (incl. CMYK\u2192sRGB); `strip` = drop. `planned` \u2014 the convert worker re-encodes from pixels and does not yet preserve/convert the profile. Declared HERE so the API re-validates the rewritten Output convert op.",
2281
+ "honored_on": [
2282
+ "format_change"
2283
+ ],
2284
+ "type": "enum",
2285
+ "values": [
2286
+ "keep",
2287
+ "srgb",
2288
+ "strip"
2289
+ ]
2290
+ },
1994
2291
  "fit": {
1995
2292
  "default": "max",
1996
2293
  "depends_on": {
@@ -2018,6 +2315,19 @@
2018
2315
  "min": 1,
2019
2316
  "type": "integer"
2020
2317
  },
2318
+ "metadata": {
2319
+ "availability": "planned",
2320
+ "default": "strip",
2321
+ "description": "Metadata handling on the format-change (convert/transcoder) route. `strip` = remove all EXIF/IPTC/XMP (default), `keep` = preserve. `planned` \u2014 the convert worker re-encodes from pixels and does not yet preserve metadata across a format change, so the API returns feature_not_available (rather than \"Unknown option\" on a format-change request \u2014 e2e/api flagged 2026-06-23). This is a new (planned) surface, so it carries no deprecated `all` alias \u2014 unlike compress.image.metadata, which keeps `all` for its existing callers. Stable-flip gated on lambdas proving convert-route metadata preservation; the honoured target subset may narrow (avif/heic targets re-encode and cannot keep).",
2322
+ "honored_on": [
2323
+ "format_change"
2324
+ ],
2325
+ "type": "enum",
2326
+ "values": [
2327
+ "strip",
2328
+ "keep"
2329
+ ]
2330
+ },
2021
2331
  "output_format": {
2022
2332
  "description": "Target format",
2023
2333
  "required": true,
@@ -2067,6 +2377,137 @@
2067
2377
  }
2068
2378
  }
2069
2379
  },
2380
+ "image_gif": {
2381
+ "max_output_pixels": 16000000,
2382
+ "mimes": [
2383
+ "image/gif"
2384
+ ],
2385
+ "options": {
2386
+ "auto_orient": {
2387
+ "availability": "planned",
2388
+ "default": true,
2389
+ "description": "Bake EXIF orientation into the pixels (format-change route) \u2014 mirrors compress.image.auto_orient. `planned`. Declared HERE so the API re-validates the rewritten Output op.",
2390
+ "honored_on": [
2391
+ "format_change"
2392
+ ],
2393
+ "type": "boolean"
2394
+ },
2395
+ "background": {
2396
+ "depends_on": {
2397
+ "output_format": "jpeg"
2398
+ },
2399
+ "description": "Background colour as a 6-digit hex (`#RRGGBB`) for a transparent GIF flattened to JPEG (alpha-flatten). HEX ONLY \u2014 non-hex is rejected as `invalid_options` (see convert.image.background).",
2400
+ "honored_on": [
2401
+ "format_change"
2402
+ ],
2403
+ "pattern": "^#[0-9a-fA-F]{6}$",
2404
+ "type": "string"
2405
+ },
2406
+ "color_profile": {
2407
+ "availability": "planned",
2408
+ "default": "keep",
2409
+ "description": "ICC colour-profile handling (format-change route) \u2014 mirrors compress.image.color_profile. `keep` (default)/`srgb`/`strip`. `planned` \u2014 applies to the still-image targets; the video targets (mp4/webm) carry no ICC. Declared HERE so the API re-validates the rewritten Output op.",
2410
+ "honored_on": [
2411
+ "format_change"
2412
+ ],
2413
+ "type": "enum",
2414
+ "values": [
2415
+ "keep",
2416
+ "srgb",
2417
+ "strip"
2418
+ ]
2419
+ },
2420
+ "fit": {
2421
+ "default": "max",
2422
+ "depends_on": {
2423
+ "height": "set",
2424
+ "logic": "or",
2425
+ "width": "set"
2426
+ },
2427
+ "description": "Resize mode. `max` (default) = fit within bounds, preserving aspect ratio and never upscaling; `crop`/`scale` = exact dimensions. Applies only when width or height is set.",
2428
+ "honored_on": [
2429
+ "format_change"
2430
+ ],
2431
+ "type": "enum",
2432
+ "values": [
2433
+ "max",
2434
+ "crop",
2435
+ "scale"
2436
+ ]
2437
+ },
2438
+ "height": {
2439
+ "description": "Resize-inside-Output: target height in pixels (1-16384; width*height <= max_output_pixels). See `width`.",
2440
+ "honored_on": [
2441
+ "format_change"
2442
+ ],
2443
+ "max": 16384,
2444
+ "min": 1,
2445
+ "type": "integer"
2446
+ },
2447
+ "metadata": {
2448
+ "availability": "planned",
2449
+ "default": "strip",
2450
+ "description": "Metadata handling on the format-change route (still-image targets). `planned` \u2014 mirrors convert.image.metadata (the convert worker does not yet preserve metadata across a format change). The video targets carry no EXIF/IPTC/XMP.",
2451
+ "honored_on": [
2452
+ "format_change"
2453
+ ],
2454
+ "type": "enum",
2455
+ "values": [
2456
+ "strip",
2457
+ "keep"
2458
+ ]
2459
+ },
2460
+ "output_format": {
2461
+ "description": "Target format. The still-image targets (jpeg/png/webp/avif/gif/tiff) take the first frame / rasterise (stable, today's gif-convert behaviour). `mp4` / `webm` are the NEW (planned) GIF\u2192VIDEO transcode targets \u2014 the animated GIF becomes a muted, play-once video (`mp4` = H.264 / yuv420p / +faststart, plays everywhere; `webm` = VP9, smaller). GIFs are silent (no audio stream); the GIF infinite-loop becomes a playback attribute (`<video loop>`) the player sets, NOT baked into the file. mp4 and webm flip planned\u2192stable independently on worker proof.",
2462
+ "per_value_availability": {
2463
+ "mp4": {
2464
+ "availability": "planned"
2465
+ },
2466
+ "webm": {
2467
+ "availability": "planned"
2468
+ }
2469
+ },
2470
+ "required": true,
2471
+ "type": "enum",
2472
+ "values": [
2473
+ "jpeg",
2474
+ "png",
2475
+ "webp",
2476
+ "avif",
2477
+ "gif",
2478
+ "tiff",
2479
+ "mp4",
2480
+ "webm"
2481
+ ]
2482
+ },
2483
+ "quality": {
2484
+ "default": 85,
2485
+ "depends_on": {
2486
+ "output_format": [
2487
+ "jpeg",
2488
+ "webp",
2489
+ "avif"
2490
+ ]
2491
+ },
2492
+ "description": "Output quality for the lossy STILL-IMAGE targets (jpeg/webp/avif). The video targets (mp4/webm) use a sensible default encode quality in v1 \u2014 there is no exposed CRF knob yet (planned-first; may be added later).",
2493
+ "honored_on": [
2494
+ "format_change"
2495
+ ],
2496
+ "max": 100,
2497
+ "min": 1,
2498
+ "type": "integer"
2499
+ },
2500
+ "width": {
2501
+ "description": "Resize-inside-Output: target width in pixels (1-16384; width*height <= max_output_pixels). Applies to the still-image targets; for the planned mp4/webm video targets, resize applicability is settled at the worker flip.",
2502
+ "honored_on": [
2503
+ "format_change"
2504
+ ],
2505
+ "max": 16384,
2506
+ "min": 1,
2507
+ "type": "integer"
2508
+ }
2509
+ }
2510
+ },
2070
2511
  "image_svg": {
2071
2512
  "mimes": [
2072
2513
  "image/svg+xml"
@@ -4127,7 +4568,7 @@
4127
4568
  "sole_op": true
4128
4569
  }
4129
4570
  },
4130
- "schema_version": "2.104.0",
4571
+ "schema_version": "2.112.0",
4131
4572
  "source_commit": null,
4132
4573
  "user_tier": null,
4133
4574
  "workflow_features": {