@giveitsmaller/contracts 0.58.0 → 0.60.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.
- package/accepted-options/accepted-options.json +14 -1
- package/accepted-options/image-output-routes.json +1 -1
- package/asyncapi/events.yaml +36 -9
- package/availability/availability.json +136 -27
- package/code-builder/code-builder-metadata.json +136 -27
- package/dist/asyncapi/ErrorCode.d.ts +2 -0
- package/dist/asyncapi/ErrorCode.js +2 -0
- package/dist/openapi/models/AccountLimitEntry.d.ts +1 -1
- package/dist/openapi/models/AccountLimitEntry.js +1 -1
- package/dist/openapi/models/AccountLimits.d.ts +1 -1
- package/dist/openapi/models/AccountLimits.js +1 -1
- package/dist/openapi/models/AccountLimitsLimits.d.ts +1 -1
- package/dist/openapi/models/AccountLimitsLimits.js +1 -1
- package/dist/openapi/models/AccountLimitsSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/AccountLimitsSuccessEnvelope.js +1 -1
- package/dist/openapi/models/AudioWatermarkDecodeRequest.d.ts +1 -1
- package/dist/openapi/models/AudioWatermarkDecodeRequest.js +1 -1
- package/dist/openapi/models/AudioWatermarkDecodeResponse.d.ts +1 -1
- package/dist/openapi/models/AudioWatermarkDecodeResponse.js +1 -1
- package/dist/openapi/models/AuthErrorResponse.d.ts +1 -1
- package/dist/openapi/models/AuthErrorResponse.js +1 -1
- package/dist/openapi/models/AuthErrorType.d.ts +1 -1
- package/dist/openapi/models/AuthErrorType.js +1 -1
- package/dist/openapi/models/AuthRejectionEnvelope.d.ts +1 -1
- package/dist/openapi/models/AuthRejectionEnvelope.js +1 -1
- package/dist/openapi/models/AvailabilityValue.d.ts +1 -1
- package/dist/openapi/models/AvailabilityValue.js +1 -1
- package/dist/openapi/models/BalanceExhaustedResponse.d.ts +1 -1
- package/dist/openapi/models/BalanceExhaustedResponse.js +1 -1
- package/dist/openapi/models/BalanceExhaustedResponseAllOfLinks.d.ts +1 -1
- package/dist/openapi/models/BalanceExhaustedResponseAllOfLinks.js +1 -1
- package/dist/openapi/models/BillingCheckoutRequest.d.ts +1 -1
- package/dist/openapi/models/BillingCheckoutRequest.js +1 -1
- package/dist/openapi/models/BillingCheckoutSession.d.ts +1 -1
- package/dist/openapi/models/BillingCheckoutSession.js +1 -1
- package/dist/openapi/models/BillingCheckoutSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/BillingCheckoutSuccessEnvelope.js +1 -1
- package/dist/openapi/models/CallbackEventType.d.ts +1 -1
- package/dist/openapi/models/CallbackEventType.js +1 -1
- package/dist/openapi/models/CapabilityCondition.d.ts +1 -1
- package/dist/openapi/models/CapabilityCondition.js +1 -1
- package/dist/openapi/models/CapabilityConditionOneOf.d.ts +1 -1
- package/dist/openapi/models/CapabilityConditionOneOf.js +1 -1
- package/dist/openapi/models/CapabilityConditionOneOf1.d.ts +1 -1
- package/dist/openapi/models/CapabilityConditionOneOf1.js +1 -1
- package/dist/openapi/models/CapabilityConditionOneOf2.d.ts +1 -1
- package/dist/openapi/models/CapabilityConditionOneOf2.js +1 -1
- package/dist/openapi/models/CapabilityConditionOneOf3.d.ts +1 -1
- package/dist/openapi/models/CapabilityConditionOneOf3.js +1 -1
- package/dist/openapi/models/CapabilityConditionOneOf4.d.ts +1 -1
- package/dist/openapi/models/CapabilityConditionOneOf4.js +1 -1
- package/dist/openapi/models/CapabilityConditionOneOf5.d.ts +1 -1
- package/dist/openapi/models/CapabilityConditionOneOf5.js +1 -1
- package/dist/openapi/models/CapabilityConditionOneOf6.d.ts +1 -1
- package/dist/openapi/models/CapabilityConditionOneOf6.js +1 -1
- package/dist/openapi/models/CapabilityConstraint.d.ts +1 -1
- package/dist/openapi/models/CapabilityConstraint.js +1 -1
- package/dist/openapi/models/CapabilityInputSpec.d.ts +1 -1
- package/dist/openapi/models/CapabilityInputSpec.js +1 -1
- package/dist/openapi/models/CapabilityProduces.d.ts +1 -1
- package/dist/openapi/models/CapabilityProduces.js +1 -1
- package/dist/openapi/models/CapabilityProducesOneOf.d.ts +1 -1
- package/dist/openapi/models/CapabilityProducesOneOf.js +1 -1
- package/dist/openapi/models/CapabilityProducesOneOf1.d.ts +1 -1
- package/dist/openapi/models/CapabilityProducesOneOf1.js +1 -1
- package/dist/openapi/models/CapabilityProducesOneOf2.d.ts +1 -1
- package/dist/openapi/models/CapabilityProducesOneOf2.js +1 -1
- package/dist/openapi/models/ChangePasswordRequest.d.ts +1 -1
- package/dist/openapi/models/ChangePasswordRequest.js +1 -1
- package/dist/openapi/models/CodegenSource.d.ts +1 -1
- package/dist/openapi/models/CodegenSource.js +1 -1
- package/dist/openapi/models/CodegenSourceInput.d.ts +1 -1
- package/dist/openapi/models/CodegenSourceInput.js +1 -1
- package/dist/openapi/models/CodegenSourceJob.d.ts +1 -1
- package/dist/openapi/models/CodegenSourceJob.js +1 -1
- package/dist/openapi/models/CodegenSourceJobSource.d.ts +1 -1
- package/dist/openapi/models/CodegenSourceJobSource.js +1 -1
- package/dist/openapi/models/CodegenSourceOperation.d.ts +1 -1
- package/dist/openapi/models/CodegenSourceOperation.js +1 -1
- package/dist/openapi/models/CodegenUploadPlaceholder.d.ts +1 -1
- package/dist/openapi/models/CodegenUploadPlaceholder.js +1 -1
- package/dist/openapi/models/CompositionPlan.d.ts +1 -1
- package/dist/openapi/models/CompositionPlan.js +1 -1
- package/dist/openapi/models/CompositionPlanJob.d.ts +1 -1
- package/dist/openapi/models/CompositionPlanJob.js +1 -1
- package/dist/openapi/models/CompositionPlanOperation.d.ts +1 -1
- package/dist/openapi/models/CompositionPlanOperation.js +1 -1
- package/dist/openapi/models/ConfirmEmailChange200Response.d.ts +1 -1
- package/dist/openapi/models/ConfirmEmailChange200Response.js +1 -1
- package/dist/openapi/models/ConfirmEmailChange200ResponseData.d.ts +1 -1
- package/dist/openapi/models/ConfirmEmailChange200ResponseData.js +1 -1
- package/dist/openapi/models/ConfirmEmailChangeRequest.d.ts +1 -1
- package/dist/openapi/models/ConfirmEmailChangeRequest.js +1 -1
- package/dist/openapi/models/ConnectionSource.d.ts +1 -1
- package/dist/openapi/models/ConnectionSource.js +1 -1
- package/dist/openapi/models/ContactRequest.d.ts +1 -1
- package/dist/openapi/models/ContactRequest.js +1 -1
- package/dist/openapi/models/ContactSubject.d.ts +1 -1
- package/dist/openapi/models/ContactSubject.js +1 -1
- package/dist/openapi/models/ContactValidationErrorResponse.d.ts +1 -1
- package/dist/openapi/models/ContactValidationErrorResponse.js +1 -1
- package/dist/openapi/models/CreateApiKey201Response.d.ts +1 -1
- package/dist/openapi/models/CreateApiKey201Response.js +1 -1
- package/dist/openapi/models/CreateApiKey201ResponseData.d.ts +1 -1
- package/dist/openapi/models/CreateApiKey201ResponseData.js +1 -1
- package/dist/openapi/models/CreateApiKeyRequest.d.ts +1 -1
- package/dist/openapi/models/CreateApiKeyRequest.js +1 -1
- package/dist/openapi/models/CreateBillingCheckoutSession422Response.d.ts +1 -1
- package/dist/openapi/models/CreateBillingCheckoutSession422Response.js +1 -1
- package/dist/openapi/models/CreateExternalImport403Response.d.ts +1 -1
- package/dist/openapi/models/CreateExternalImport403Response.js +1 -1
- package/dist/openapi/models/CreateExternalImport422Response.d.ts +1 -1
- package/dist/openapi/models/CreateExternalImport422Response.js +1 -1
- package/dist/openapi/models/CreateWorkflow401Response.d.ts +1 -1
- package/dist/openapi/models/CreateWorkflow401Response.js +1 -1
- package/dist/openapi/models/CreateWorkflow422Response.d.ts +1 -1
- package/dist/openapi/models/CreateWorkflow422Response.js +1 -1
- package/dist/openapi/models/CreditTransaction.d.ts +1 -1
- package/dist/openapi/models/CreditTransaction.js +1 -1
- package/dist/openapi/models/CreditTransactionSourceBucket.d.ts +1 -1
- package/dist/openapi/models/CreditTransactionSourceBucket.js +1 -1
- package/dist/openapi/models/CreditsBalanceResponse.d.ts +1 -1
- package/dist/openapi/models/CreditsBalanceResponse.js +1 -1
- package/dist/openapi/models/CreditsBalanceSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/CreditsBalanceSuccessEnvelope.js +1 -1
- package/dist/openapi/models/CreditsUsageResponse.d.ts +43 -1
- package/dist/openapi/models/CreditsUsageResponse.js +5 -1
- package/dist/openapi/models/CreditsUsageSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/CreditsUsageSuccessEnvelope.js +1 -1
- package/dist/openapi/models/Delivery.d.ts +1 -1
- package/dist/openapi/models/Delivery.js +1 -1
- package/dist/openapi/models/DeliveryOutputRef.d.ts +1 -1
- package/dist/openapi/models/DeliveryOutputRef.js +1 -1
- package/dist/openapi/models/DeliveryPlan.d.ts +1 -1
- package/dist/openapi/models/DeliveryPlan.js +1 -1
- package/dist/openapi/models/DeliveryPlanOutput.d.ts +1 -1
- package/dist/openapi/models/DeliveryPlanOutput.js +1 -1
- package/dist/openapi/models/DeliveryPlanReason.d.ts +1 -1
- package/dist/openapi/models/DeliveryPlanReason.js +1 -1
- package/dist/openapi/models/DeliverySelection.d.ts +1 -1
- package/dist/openapi/models/DeliverySelection.js +1 -1
- package/dist/openapi/models/DownloadBundle.d.ts +1 -1
- package/dist/openapi/models/DownloadBundle.js +1 -1
- package/dist/openapi/models/DroppedOption.d.ts +88 -0
- package/dist/openapi/models/DroppedOption.js +54 -0
- package/dist/openapi/models/EmailNotify.d.ts +1 -1
- package/dist/openapi/models/EmailNotify.js +1 -1
- package/dist/openapi/models/EmptySuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/EmptySuccessEnvelope.js +1 -1
- package/dist/openapi/models/EndpointProjection.d.ts +1 -1
- package/dist/openapi/models/EndpointProjection.js +1 -1
- package/dist/openapi/models/ErrorEnvelope.d.ts +1 -1
- package/dist/openapi/models/ErrorEnvelope.js +1 -1
- package/dist/openapi/models/EstimateQuality.d.ts +1 -1
- package/dist/openapi/models/EstimateQuality.js +1 -1
- package/dist/openapi/models/EstimateRange.d.ts +1 -1
- package/dist/openapi/models/EstimateRange.js +1 -1
- package/dist/openapi/models/ExternalDestination.d.ts +1 -1
- package/dist/openapi/models/ExternalDestination.js +1 -1
- package/dist/openapi/models/ExternalImportCreatedResponse.d.ts +1 -1
- package/dist/openapi/models/ExternalImportCreatedResponse.js +1 -1
- package/dist/openapi/models/ExternalImportCreatedSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/ExternalImportCreatedSuccessEnvelope.js +1 -1
- package/dist/openapi/models/ExternalImportRequest.d.ts +1 -1
- package/dist/openapi/models/ExternalImportRequest.js +1 -1
- package/dist/openapi/models/ExternalImportToken.d.ts +1 -1
- package/dist/openapi/models/ExternalImportToken.js +1 -1
- package/dist/openapi/models/ExternalSource.d.ts +1 -1
- package/dist/openapi/models/ExternalSource.js +1 -1
- package/dist/openapi/models/FeatureNotAvailableResponse.d.ts +1 -1
- package/dist/openapi/models/FeatureNotAvailableResponse.js +1 -1
- package/dist/openapi/models/FeatureTierRestrictedResponse.d.ts +1 -1
- package/dist/openapi/models/FeatureTierRestrictedResponse.js +1 -1
- package/dist/openapi/models/FeatureViolation.d.ts +1 -1
- package/dist/openapi/models/FeatureViolation.js +1 -1
- package/dist/openapi/models/ImageEncodeCapabilities.d.ts +1 -1
- package/dist/openapi/models/ImageEncodeCapabilities.js +1 -1
- package/dist/openapi/models/JobDefinition.d.ts +1 -1
- package/dist/openapi/models/JobDefinition.js +1 -1
- package/dist/openapi/models/JobDownload.d.ts +1 -1
- package/dist/openapi/models/JobDownload.js +1 -1
- package/dist/openapi/models/JobInputV2.d.ts +1 -1
- package/dist/openapi/models/JobInputV2.js +1 -1
- package/dist/openapi/models/JobMediaClass.d.ts +1 -1
- package/dist/openapi/models/JobMediaClass.js +1 -1
- package/dist/openapi/models/JobOutputSource.d.ts +1 -1
- package/dist/openapi/models/JobOutputSource.js +1 -1
- package/dist/openapi/models/JobResponse.d.ts +23 -1
- package/dist/openapi/models/JobResponse.js +3 -1
- package/dist/openapi/models/JobStatus.d.ts +1 -1
- package/dist/openapi/models/JobStatus.js +1 -1
- package/dist/openapi/models/JobType.d.ts +1 -1
- package/dist/openapi/models/JobType.js +1 -1
- package/dist/openapi/models/LivenessResponse.d.ts +1 -1
- package/dist/openapi/models/LivenessResponse.js +1 -1
- package/dist/openapi/models/LoginUser200Response.d.ts +1 -1
- package/dist/openapi/models/LoginUser200Response.js +1 -1
- package/dist/openapi/models/LoginUser200ResponseData.d.ts +1 -1
- package/dist/openapi/models/LoginUser200ResponseData.js +1 -1
- package/dist/openapi/models/LoginUser200ResponseDataUser.d.ts +1 -1
- package/dist/openapi/models/LoginUser200ResponseDataUser.js +1 -1
- package/dist/openapi/models/LoginUser401Response.d.ts +1 -1
- package/dist/openapi/models/LoginUser401Response.js +1 -1
- package/dist/openapi/models/LoginUserRequest.d.ts +1 -1
- package/dist/openapi/models/LoginUserRequest.js +1 -1
- package/dist/openapi/models/LongFormConcurrencyLimitResponse.d.ts +5 -2
- package/dist/openapi/models/LongFormConcurrencyLimitResponse.js +1 -1
- package/dist/openapi/models/LongFormConcurrencyLimitResponseAllOfLinks.d.ts +1 -1
- package/dist/openapi/models/LongFormConcurrencyLimitResponseAllOfLinks.js +1 -1
- package/dist/openapi/models/MetadataResponse.d.ts +1 -1
- package/dist/openapi/models/MetadataResponse.js +1 -1
- package/dist/openapi/models/MetadataResponseDimensions.d.ts +1 -1
- package/dist/openapi/models/MetadataResponseDimensions.js +1 -1
- package/dist/openapi/models/MetadataResponseExif.d.ts +1 -1
- package/dist/openapi/models/MetadataResponseExif.js +1 -1
- package/dist/openapi/models/MetadataResponseExifGps.d.ts +1 -1
- package/dist/openapi/models/MetadataResponseExifGps.js +1 -1
- package/dist/openapi/models/MetadataSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/MetadataSuccessEnvelope.js +1 -1
- package/dist/openapi/models/MimeGroupSchema.d.ts +38 -1
- package/dist/openapi/models/MimeGroupSchema.js +5 -1
- package/dist/openapi/models/MultiInputSource.d.ts +1 -1
- package/dist/openapi/models/MultiInputSource.js +1 -1
- package/dist/openapi/models/MultipartCompleteRequest.d.ts +1 -1
- package/dist/openapi/models/MultipartCompleteRequest.js +1 -1
- package/dist/openapi/models/MultipartCompleteRequestPartsInner.d.ts +1 -1
- package/dist/openapi/models/MultipartCompleteRequestPartsInner.js +1 -1
- package/dist/openapi/models/MultipartCompleteResponse.d.ts +1 -1
- package/dist/openapi/models/MultipartCompleteResponse.js +1 -1
- package/dist/openapi/models/MultipartCompleteSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/MultipartCompleteSuccessEnvelope.js +1 -1
- package/dist/openapi/models/MultipartInitiateRequestMetadataHint.d.ts +1 -1
- package/dist/openapi/models/MultipartInitiateRequestMetadataHint.js +1 -1
- package/dist/openapi/models/MultipartInitiateResponse.d.ts +1 -1
- package/dist/openapi/models/MultipartInitiateResponse.js +1 -1
- package/dist/openapi/models/MultipartInitiateSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/MultipartInitiateSuccessEnvelope.js +1 -1
- package/dist/openapi/models/MultipartKeepaliveResponse.d.ts +1 -1
- package/dist/openapi/models/MultipartKeepaliveResponse.js +1 -1
- package/dist/openapi/models/MultipartKeepaliveSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/MultipartKeepaliveSuccessEnvelope.js +1 -1
- package/dist/openapi/models/MultipartPartListing.d.ts +1 -1
- package/dist/openapi/models/MultipartPartListing.js +1 -1
- package/dist/openapi/models/MultipartPresignRequest.d.ts +1 -1
- package/dist/openapi/models/MultipartPresignRequest.js +1 -1
- package/dist/openapi/models/MultipartPresignResponse.d.ts +1 -1
- package/dist/openapi/models/MultipartPresignResponse.js +1 -1
- package/dist/openapi/models/MultipartPresignSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/MultipartPresignSuccessEnvelope.js +1 -1
- package/dist/openapi/models/MultipartStatusResponse.d.ts +1 -1
- package/dist/openapi/models/MultipartStatusResponse.js +1 -1
- package/dist/openapi/models/MultipartStatusSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/MultipartStatusSuccessEnvelope.js +1 -1
- package/dist/openapi/models/NotifyConfig.d.ts +1 -1
- package/dist/openapi/models/NotifyConfig.js +1 -1
- package/dist/openapi/models/OperationCapability.d.ts +1 -1
- package/dist/openapi/models/OperationCapability.js +1 -1
- package/dist/openapi/models/OperationDefinition.d.ts +1 -1
- package/dist/openapi/models/OperationDefinition.js +1 -1
- package/dist/openapi/models/OperationDownload.d.ts +103 -5
- package/dist/openapi/models/OperationDownload.js +1 -1
- package/dist/openapi/models/OperationInputModel.d.ts +1 -1
- package/dist/openapi/models/OperationInputModel.js +1 -1
- package/dist/openapi/models/OperationResponse.d.ts +30 -6
- package/dist/openapi/models/OperationResponse.js +1 -1
- package/dist/openapi/models/OperationResult.d.ts +1 -1
- package/dist/openapi/models/OperationResult.js +1 -1
- package/dist/openapi/models/OperationResultMetadata.d.ts +1 -1
- package/dist/openapi/models/OperationResultMetadata.js +1 -1
- package/dist/openapi/models/OperationResultMetrics.d.ts +1 -1
- package/dist/openapi/models/OperationResultMetrics.js +1 -1
- package/dist/openapi/models/OperationSchemaDefinition.d.ts +1 -1
- package/dist/openapi/models/OperationSchemaDefinition.js +1 -1
- package/dist/openapi/models/OperationStatus.d.ts +1 -1
- package/dist/openapi/models/OperationStatus.js +1 -1
- package/dist/openapi/models/OperationType.d.ts +1 -1
- package/dist/openapi/models/OperationType.js +1 -1
- package/dist/openapi/models/OperationsSchemaResponse.d.ts +1 -1
- package/dist/openapi/models/OperationsSchemaResponse.js +1 -1
- package/dist/openapi/models/OperationsSchemaResponseWorkflowFeatures.d.ts +10 -1
- package/dist/openapi/models/OperationsSchemaResponseWorkflowFeatures.js +4 -1
- package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDelivery.d.ts +1 -1
- package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDelivery.js +1 -1
- package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliveryMode.d.ts +1 -1
- package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliveryMode.js +1 -1
- package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliverySelection.d.ts +1 -1
- package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliverySelection.js +1 -1
- package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesProcessing.d.ts +33 -0
- package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesProcessing.js +42 -0
- package/dist/openapi/models/OptionSchema.d.ts +30 -1
- package/dist/openapi/models/OptionSchema.js +4 -1
- package/dist/openapi/models/OutputProperties.d.ts +1 -1
- package/dist/openapi/models/OutputProperties.js +1 -1
- package/dist/openapi/models/OutputPropertiesIsAnimated.d.ts +1 -1
- package/dist/openapi/models/OutputPropertiesIsAnimated.js +1 -1
- package/dist/openapi/models/PerClassAvailabilityEntry.d.ts +58 -0
- package/dist/openapi/models/PerClassAvailabilityEntry.js +48 -0
- package/dist/openapi/models/PerRoleCardinalityEntry.d.ts +1 -1
- package/dist/openapi/models/PerRoleCardinalityEntry.js +1 -1
- package/dist/openapi/models/PerValueAvailabilityEntry.d.ts +44 -1
- package/dist/openapi/models/PerValueAvailabilityEntry.js +5 -1
- package/dist/openapi/models/PresignedUrlPart.d.ts +1 -1
- package/dist/openapi/models/PresignedUrlPart.js +1 -1
- package/dist/openapi/models/ProbePendingResponse.d.ts +1 -1
- package/dist/openapi/models/ProbePendingResponse.js +1 -1
- package/dist/openapi/models/ProcessingClass.d.ts +1 -1
- package/dist/openapi/models/ProcessingClass.js +1 -1
- package/dist/openapi/models/ProcessingClassBandViolation.d.ts +1 -1
- package/dist/openapi/models/ProcessingClassBandViolation.js +1 -1
- package/dist/openapi/models/ProcessingClassConstraints.d.ts +1 -1
- package/dist/openapi/models/ProcessingClassConstraints.js +1 -1
- package/dist/openapi/models/ProcessingClassEntry.d.ts +1 -1
- package/dist/openapi/models/ProcessingClassEntry.js +1 -1
- package/dist/openapi/models/ProcessingClassExceedsBandResponse.d.ts +1 -1
- package/dist/openapi/models/ProcessingClassExceedsBandResponse.js +1 -1
- package/dist/openapi/models/ProcessingClassHint.d.ts +23 -6
- package/dist/openapi/models/ProcessingClassHint.js +23 -6
- package/dist/openapi/models/ProcessingClassReason.d.ts +78 -1
- package/dist/openapi/models/ProcessingClassReason.js +79 -2
- package/dist/openapi/models/ProcessingClassRejectReason.d.ts +1 -1
- package/dist/openapi/models/ProcessingClassRejectReason.js +1 -1
- package/dist/openapi/models/ProcessingPlan.d.ts +1 -1
- package/dist/openapi/models/ProcessingPlan.js +1 -1
- package/dist/openapi/models/ProcessingPlanJob.d.ts +30 -1
- package/dist/openapi/models/ProcessingPlanJob.js +4 -1
- package/dist/openapi/models/ReEncodeDecision.d.ts +1 -1
- package/dist/openapi/models/ReEncodeDecision.js +1 -1
- package/dist/openapi/models/ReadinessResponse.d.ts +1 -1
- package/dist/openapi/models/ReadinessResponse.js +1 -1
- package/dist/openapi/models/RegisterUser422Response.d.ts +1 -1
- package/dist/openapi/models/RegisterUser422Response.js +1 -1
- package/dist/openapi/models/RegisterUserRequest.d.ts +1 -1
- package/dist/openapi/models/RegisterUserRequest.js +1 -1
- package/dist/openapi/models/ResendVerificationEmailRequest.d.ts +1 -1
- package/dist/openapi/models/ResendVerificationEmailRequest.js +1 -1
- package/dist/openapi/models/ResetPasswordRequest.d.ts +1 -1
- package/dist/openapi/models/ResetPasswordRequest.js +1 -1
- package/dist/openapi/models/ResponseEnvelope.d.ts +1 -1
- package/dist/openapi/models/ResponseEnvelope.js +1 -1
- package/dist/openapi/models/RetryResponse.d.ts +1 -1
- package/dist/openapi/models/RetryResponse.js +1 -1
- package/dist/openapi/models/RetrySuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/RetrySuccessEnvelope.js +1 -1
- package/dist/openapi/models/SseCompletionBase.d.ts +1 -1
- package/dist/openapi/models/SseCompletionBase.js +1 -1
- package/dist/openapi/models/SseEventType.d.ts +1 -1
- package/dist/openapi/models/SseEventType.js +1 -1
- package/dist/openapi/models/SseJobCompletedData.d.ts +1 -1
- package/dist/openapi/models/SseJobCompletedData.js +1 -1
- package/dist/openapi/models/SseJobFailedData.d.ts +1 -1
- package/dist/openapi/models/SseJobFailedData.js +1 -1
- package/dist/openapi/models/SseMultiOutputCompletion.d.ts +1 -1
- package/dist/openapi/models/SseMultiOutputCompletion.js +1 -1
- package/dist/openapi/models/SseMultiOutputCompletionMetrics.d.ts +1 -1
- package/dist/openapi/models/SseMultiOutputCompletionMetrics.js +1 -1
- package/dist/openapi/models/SseMultiOutputCompletionWithKind.d.ts +1 -1
- package/dist/openapi/models/SseMultiOutputCompletionWithKind.js +1 -1
- package/dist/openapi/models/SseMultiOutputResultEntry.d.ts +9 -4
- package/dist/openapi/models/SseMultiOutputResultEntry.js +1 -1
- package/dist/openapi/models/SseOperationCompletedData.d.ts +1 -1
- package/dist/openapi/models/SseOperationCompletedData.js +1 -1
- package/dist/openapi/models/SseOperationCompletionResult.d.ts +1 -1
- package/dist/openapi/models/SseOperationCompletionResult.js +1 -1
- package/dist/openapi/models/SseOperationFailedData.d.ts +1 -1
- package/dist/openapi/models/SseOperationFailedData.js +1 -1
- package/dist/openapi/models/SseOperationProgressData.d.ts +1 -1
- package/dist/openapi/models/SseOperationProgressData.js +1 -1
- package/dist/openapi/models/SseSingleOutputCompletion.d.ts +1 -1
- package/dist/openapi/models/SseSingleOutputCompletion.js +1 -1
- package/dist/openapi/models/SseWorkflowTerminalData.d.ts +1 -1
- package/dist/openapi/models/SseWorkflowTerminalData.js +1 -1
- package/dist/openapi/models/TierRestrictionKind.d.ts +1 -1
- package/dist/openapi/models/TierRestrictionKind.js +1 -1
- package/dist/openapi/models/TierRestrictionResponse.d.ts +1 -1
- package/dist/openapi/models/TierRestrictionResponse.js +1 -1
- package/dist/openapi/models/UpdateProfile200Response.d.ts +1 -1
- package/dist/openapi/models/UpdateProfile200Response.js +1 -1
- package/dist/openapi/models/UpdateProfile200ResponseData.d.ts +1 -1
- package/dist/openapi/models/UpdateProfile200ResponseData.js +1 -1
- package/dist/openapi/models/UpdateProfile422Response.d.ts +1 -1
- package/dist/openapi/models/UpdateProfile422Response.js +1 -1
- package/dist/openapi/models/UpdateProfileRequest.d.ts +1 -1
- package/dist/openapi/models/UpdateProfileRequest.js +1 -1
- package/dist/openapi/models/UploadConstraintsApplied.d.ts +1 -1
- package/dist/openapi/models/UploadConstraintsApplied.js +1 -1
- package/dist/openapi/models/UploadDurationExceedsTierResponse.d.ts +1 -1
- package/dist/openapi/models/UploadDurationExceedsTierResponse.js +1 -1
- package/dist/openapi/models/UploadFile403Response.d.ts +1 -1
- package/dist/openapi/models/UploadFile403Response.js +1 -1
- package/dist/openapi/models/UploadFile422Response.d.ts +1 -1
- package/dist/openapi/models/UploadFile422Response.js +1 -1
- package/dist/openapi/models/UploadProbeMediaMetadata.d.ts +1 -1
- package/dist/openapi/models/UploadProbeMediaMetadata.js +1 -1
- package/dist/openapi/models/UploadProbeProcessingClass.d.ts +1 -1
- package/dist/openapi/models/UploadProbeProcessingClass.js +1 -1
- package/dist/openapi/models/UploadProbeResponse.d.ts +1 -1
- package/dist/openapi/models/UploadProbeResponse.js +1 -1
- package/dist/openapi/models/UploadProbeStatus.d.ts +1 -1
- package/dist/openapi/models/UploadProbeStatus.js +1 -1
- package/dist/openapi/models/UploadProbeSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/UploadProbeSuccessEnvelope.js +1 -1
- package/dist/openapi/models/UploadResponse.d.ts +1 -1
- package/dist/openapi/models/UploadResponse.js +1 -1
- package/dist/openapi/models/UploadSizeExceedsTierResponse.d.ts +1 -1
- package/dist/openapi/models/UploadSizeExceedsTierResponse.js +1 -1
- package/dist/openapi/models/UploadSource.d.ts +1 -19
- package/dist/openapi/models/UploadSource.js +1 -3
- package/dist/openapi/models/UploadSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/UploadSuccessEnvelope.js +1 -1
- package/dist/openapi/models/UploadThresholds.d.ts +1 -1
- package/dist/openapi/models/UploadThresholds.js +1 -1
- package/dist/openapi/models/UserTier.d.ts +1 -1
- package/dist/openapi/models/UserTier.js +1 -1
- package/dist/openapi/models/ValidationErrorEnvelope.d.ts +1 -1
- package/dist/openapi/models/ValidationErrorEnvelope.js +1 -1
- package/dist/openapi/models/ValidationErrorEnvelopeDetailsInner.d.ts +1 -1
- package/dist/openapi/models/ValidationErrorEnvelopeDetailsInner.js +1 -1
- package/dist/openapi/models/VerifyEmailRequest.d.ts +1 -1
- package/dist/openapi/models/VerifyEmailRequest.js +1 -1
- package/dist/openapi/models/WarningType.d.ts +1 -1
- package/dist/openapi/models/WarningType.js +1 -1
- package/dist/openapi/models/WebhookOperationContext.d.ts +1 -1
- package/dist/openapi/models/WebhookOperationContext.js +1 -1
- package/dist/openapi/models/WebhookPayload.d.ts +1 -1
- package/dist/openapi/models/WebhookPayload.js +1 -1
- package/dist/openapi/models/WorkflowArchiveResponse.d.ts +81 -0
- package/dist/openapi/models/WorkflowArchiveResponse.js +71 -0
- package/dist/openapi/models/WorkflowArchiveSuccessEnvelope.d.ts +46 -0
- package/dist/openapi/models/WorkflowArchiveSuccessEnvelope.js +54 -0
- package/dist/openapi/models/WorkflowCancelBillingEffect.d.ts +1 -1
- package/dist/openapi/models/WorkflowCancelBillingEffect.js +1 -1
- package/dist/openapi/models/WorkflowCancelResponse.d.ts +1 -1
- package/dist/openapi/models/WorkflowCancelResponse.js +1 -1
- package/dist/openapi/models/WorkflowCancelSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/WorkflowCancelSuccessEnvelope.js +1 -1
- package/dist/openapi/models/WorkflowCreateRequest.d.ts +1 -1
- package/dist/openapi/models/WorkflowCreateRequest.js +1 -1
- package/dist/openapi/models/WorkflowCreateResponse.d.ts +1 -1
- package/dist/openapi/models/WorkflowCreateResponse.js +1 -1
- package/dist/openapi/models/WorkflowCreateSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/WorkflowCreateSuccessEnvelope.js +1 -1
- package/dist/openapi/models/WorkflowCreditSummary.d.ts +1 -1
- package/dist/openapi/models/WorkflowCreditSummary.js +1 -1
- package/dist/openapi/models/WorkflowDownloadResponse.d.ts +1 -1
- package/dist/openapi/models/WorkflowDownloadResponse.js +1 -1
- package/dist/openapi/models/WorkflowDownloadSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/WorkflowDownloadSuccessEnvelope.js +1 -1
- package/dist/openapi/models/WorkflowEdge.d.ts +1 -1
- package/dist/openapi/models/WorkflowEdge.js +1 -1
- package/dist/openapi/models/WorkflowExpiredResponse.d.ts +1 -1
- package/dist/openapi/models/WorkflowExpiredResponse.js +1 -1
- package/dist/openapi/models/WorkflowListResponse.d.ts +1 -1
- package/dist/openapi/models/WorkflowListResponse.js +1 -1
- package/dist/openapi/models/WorkflowListSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/WorkflowListSuccessEnvelope.js +1 -1
- package/dist/openapi/models/WorkflowPauseRequiredAction.d.ts +1 -1
- package/dist/openapi/models/WorkflowPauseRequiredAction.js +1 -1
- package/dist/openapi/models/WorkflowPausedDetail.d.ts +1 -1
- package/dist/openapi/models/WorkflowPausedDetail.js +1 -1
- package/dist/openapi/models/WorkflowPausedDetailLinks.d.ts +1 -1
- package/dist/openapi/models/WorkflowPausedDetailLinks.js +1 -1
- package/dist/openapi/models/WorkflowProcessing.d.ts +1 -1
- package/dist/openapi/models/WorkflowProcessing.js +1 -1
- package/dist/openapi/models/WorkflowRestoreResponse.d.ts +60 -0
- package/dist/openapi/models/WorkflowRestoreResponse.js +58 -0
- package/dist/openapi/models/WorkflowRestoreSuccessEnvelope.d.ts +46 -0
- package/dist/openapi/models/WorkflowRestoreSuccessEnvelope.js +54 -0
- package/dist/openapi/models/WorkflowResumeResponse.d.ts +1 -1
- package/dist/openapi/models/WorkflowResumeResponse.js +1 -1
- package/dist/openapi/models/WorkflowResumeSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/WorkflowResumeSuccessEnvelope.js +1 -1
- package/dist/openapi/models/WorkflowSource.d.ts +12 -1
- package/dist/openapi/models/WorkflowSource.js +1 -1
- package/dist/openapi/models/WorkflowStatus.d.ts +1 -1
- package/dist/openapi/models/WorkflowStatus.js +1 -1
- package/dist/openapi/models/WorkflowStatusResponse.d.ts +1 -1
- package/dist/openapi/models/WorkflowStatusResponse.js +1 -1
- package/dist/openapi/models/WorkflowStatusSuccessEnvelope.d.ts +1 -1
- package/dist/openapi/models/WorkflowStatusSuccessEnvelope.js +1 -1
- package/dist/openapi/models/WorkflowSummary.d.ts +24 -1
- package/dist/openapi/models/WorkflowSummary.js +5 -1
- package/dist/openapi/models/WorkflowSummaryJob.d.ts +11 -5
- package/dist/openapi/models/WorkflowSummaryJob.js +1 -1
- package/dist/openapi/models/WorkflowWarning.d.ts +1 -1
- package/dist/openapi/models/WorkflowWarning.js +1 -1
- package/dist/openapi/models/WorkflowWarningSeverity.d.ts +1 -1
- package/dist/openapi/models/WorkflowWarningSeverity.js +1 -1
- package/dist/openapi/models/index.d.ts +7 -0
- package/dist/openapi/models/index.js +7 -0
- package/dist/openapi/runtime.d.ts +1 -1
- package/dist/openapi/runtime.js +1 -1
- package/dist/operations/merge.metadata.js +6 -1
- package/dist/operations/thumbnail.d.ts +21 -0
- package/dist/operations/thumbnail.js +16 -0
- package/dist/operations/thumbnail.metadata.js +25 -0
- package/openapi/api.yaml +895 -45
- package/operation-capabilities/operation-capabilities.json +1 -1
- package/operations/schemas/audio_overlay.yaml +0 -4
- package/operations/schemas/audio_to_video.yaml +1 -0
- package/operations/schemas/compress.yaml +113 -22
- package/operations/schemas/convert.yaml +10 -4
- package/operations/schemas/merge.yaml +90 -3
- package/operations/schemas/render_variants.yaml +30 -7
- package/operations/schemas/split.yaml +13 -3
- package/operations/schemas/thumbnail.yaml +190 -3
- package/package.json +1 -1
package/openapi/api.yaml
CHANGED
|
@@ -89,7 +89,7 @@ info:
|
|
|
89
89
|
of truth instead of hardcoding magic numbers. A runtime
|
|
90
90
|
`GET /api/uploads/limits` endpoint for dynamic discovery
|
|
91
91
|
(per-tier / per-environment overrides) is a deferred follow-up.
|
|
92
|
-
version: 2.
|
|
92
|
+
version: 2.188.0
|
|
93
93
|
contact:
|
|
94
94
|
name: API Support
|
|
95
95
|
|
|
@@ -1192,6 +1192,28 @@ paths:
|
|
|
1192
1192
|
minimum: 1
|
|
1193
1193
|
maximum: 100
|
|
1194
1194
|
default: 20
|
|
1195
|
+
- name: archived
|
|
1196
|
+
in: query
|
|
1197
|
+
required: false
|
|
1198
|
+
description: |
|
|
1199
|
+
Archived-row filter (ticket
|
|
1200
|
+
[`j2s6T2qf`](https://trello.com/c/j2s6T2qf)). **Default `false`**:
|
|
1201
|
+
archived workflows are EXCLUDED, so archiving declutters the
|
|
1202
|
+
default view. **`true`**: list ONLY archived workflows (the
|
|
1203
|
+
"archive" view, for review or recovery via
|
|
1204
|
+
`POST /api/workflows/{id}/restore`).
|
|
1205
|
+
|
|
1206
|
+
Archiving is a **recoverable declutter, NOT a delete** — an
|
|
1207
|
+
archived workflow keeps every record and stays fully readable via
|
|
1208
|
+
`GET /api/workflows/{id}/status` and its downloads; only this list
|
|
1209
|
+
hides it by default. Archive an individual workflow via
|
|
1210
|
+
`POST /api/workflows/{id}/archive`, restore it via
|
|
1211
|
+
`POST /api/workflows/{id}/restore`. (A future "show both" view, if
|
|
1212
|
+
needed, would be a separate additive parameter — this boolean
|
|
1213
|
+
stays exclude-vs-archived-only.)
|
|
1214
|
+
schema:
|
|
1215
|
+
type: boolean
|
|
1216
|
+
default: false
|
|
1195
1217
|
responses:
|
|
1196
1218
|
'200':
|
|
1197
1219
|
description: Cursor-paginated summary list of the caller's workflows.
|
|
@@ -1963,7 +1985,7 @@ paths:
|
|
|
1963
1985
|
message: "Inputs use different frame rates (29.97 vs 30); set re_encode_mode to auto or always."
|
|
1964
1986
|
'429':
|
|
1965
1987
|
description: |
|
|
1966
|
-
Rate limited.
|
|
1988
|
+
Rate limited. Three distinct triggers share this status — branch
|
|
1967
1989
|
on the `error` code, NOT on the status:
|
|
1968
1990
|
|
|
1969
1991
|
1. **Long-form concurrency cap** — the caller already holds the
|
|
@@ -1977,13 +1999,31 @@ paths:
|
|
|
1977
1999
|
2. **Infrastructure rate-limit** — too many requests in the
|
|
1978
2000
|
current window. The links-absent subset of the same shape: a
|
|
1979
2001
|
plain `ErrorEnvelope` with a `Retry-After` header.
|
|
2002
|
+
3. **Duplicate in progress** — the caller resubmitted an
|
|
2003
|
+
identical workflow whose idempotency claim is already held by
|
|
2004
|
+
an in-flight create (deduplication that prevents a
|
|
2005
|
+
double-charge; ticket
|
|
2006
|
+
[`DSxwCetg`](https://trello.com/c/DSxwCetg)). Body is a plain
|
|
2007
|
+
`ErrorEnvelope`: `error: DUPLICATE_IN_PROGRESS`, `message_key:
|
|
2008
|
+
job.duplicate_in_progress`, **no `Retry-After`** and **no
|
|
2009
|
+
`links`**. **Transient — the caller SHOULD retry:** the retry
|
|
2010
|
+
folds onto the now-attached winning workflow and returns
|
|
2011
|
+
`201` with that existing workflow (the normal create shape),
|
|
2012
|
+
so the winning `workflow_id` is delivered on the retry, not
|
|
2013
|
+
here. There is no id to return at this point — the winner is
|
|
2014
|
+
still mid-create (its `workflow_id` is not yet assigned), which
|
|
2015
|
+
is exactly what "in progress" means. This is why the status is
|
|
2016
|
+
`429` (retry-with-backoff resolves it) rather than `409`.
|
|
1980
2017
|
headers:
|
|
1981
2018
|
Retry-After:
|
|
1982
2019
|
description: |
|
|
1983
2020
|
Seconds to wait before retrying. Delta-seconds (RFC 9110).
|
|
1984
2021
|
Present ONLY for the infrastructure rate-limit trigger —
|
|
1985
|
-
ABSENT for `LONG_FORM_CONCURRENCY_LIMIT_EXCEEDED` (
|
|
1986
|
-
|
|
2022
|
+
ABSENT for `LONG_FORM_CONCURRENCY_LIMIT_EXCEEDED` (clears on
|
|
2023
|
+
workflow completion, not a timer) and for
|
|
2024
|
+
`DUPLICATE_IN_PROGRESS` (resolves when the caller retries and
|
|
2025
|
+
folds onto the winning workflow — retry promptly, no fixed
|
|
2026
|
+
back-off window).
|
|
1987
2027
|
schema:
|
|
1988
2028
|
type: integer
|
|
1989
2029
|
minimum: 0
|
|
@@ -2008,6 +2048,14 @@ paths:
|
|
|
2008
2048
|
value:
|
|
2009
2049
|
success: false
|
|
2010
2050
|
error: "Too many requests. Please try again later."
|
|
2051
|
+
duplicate_in_progress:
|
|
2052
|
+
summary: Identical workflow already mid-create (idempotency fold — retry to get the 201-with-existing-workflow)
|
|
2053
|
+
value:
|
|
2054
|
+
success: false
|
|
2055
|
+
error: "DUPLICATE_IN_PROGRESS"
|
|
2056
|
+
message: "An identical workflow is already being created. Retry in a moment to attach to it."
|
|
2057
|
+
message_key: "job.duplicate_in_progress"
|
|
2058
|
+
locale: "en-GB"
|
|
2011
2059
|
'500':
|
|
2012
2060
|
description: Internal server error
|
|
2013
2061
|
content:
|
|
@@ -2513,6 +2561,186 @@ paths:
|
|
|
2513
2561
|
schema:
|
|
2514
2562
|
$ref: '#/components/schemas/ErrorEnvelope'
|
|
2515
2563
|
|
|
2564
|
+
/api/workflows/{id}/archive:
|
|
2565
|
+
post:
|
|
2566
|
+
summary: Archive a workflow
|
|
2567
|
+
description: |
|
|
2568
|
+
Archive a terminal workflow so it drops out of the caller's default
|
|
2569
|
+
workflow list. **Recoverable declutter, NOT a delete** — the workflow,
|
|
2570
|
+
its jobs, its operations, and its outputs are all retained and stay
|
|
2571
|
+
fully readable: `GET /api/workflows/{id}/status` and every download
|
|
2572
|
+
link keep working unchanged. Archiving only hides the row from the
|
|
2573
|
+
default `GET /api/workflows` view; `?archived=true` lists archived
|
|
2574
|
+
rows, and `POST /api/workflows/{id}/restore` brings one back.
|
|
2575
|
+
|
|
2576
|
+
Archive sets a dedicated `archived` flag that is **distinct from
|
|
2577
|
+
deletion** — it is the Gmail-style "archive" (reversible, user-owned),
|
|
2578
|
+
not the admin-only hard delete, and it does NOT set any soft-delete /
|
|
2579
|
+
`deleted_at` state. Hard deletion is not exposed to callers.
|
|
2580
|
+
|
|
2581
|
+
Owner-scoped. Idempotent — archiving an already-archived workflow
|
|
2582
|
+
returns 200 with the same shape (`archived_at` reflects the FIRST
|
|
2583
|
+
archive instant, unchanged by a re-archive).
|
|
2584
|
+
|
|
2585
|
+
**Terminal workflows only.** Archive is allowed only once the workflow
|
|
2586
|
+
has reached a terminal status (`completed`, `failed`,
|
|
2587
|
+
`partially_failed`, `cancelled`, `expired`). Archiving an active
|
|
2588
|
+
workflow (`pending`, `in_progress`, `paused_insufficient_credits`) is
|
|
2589
|
+
a **409** — cancel it first (`POST /api/workflows/{id}/cancel`) or wait
|
|
2590
|
+
for it to finish. Archiving does NOT change the workflow's status; it
|
|
2591
|
+
stays terminal and the response echoes it unchanged.
|
|
2592
|
+
operationId: archiveWorkflow
|
|
2593
|
+
security: [{bearerAuth: []}, {sessionAuth: []}] # required (explicit 401 in response set)
|
|
2594
|
+
x-identity-scoped: true # workflow-ownership-scoped per ADR-0016 D3
|
|
2595
|
+
tags:
|
|
2596
|
+
- Workflow
|
|
2597
|
+
parameters:
|
|
2598
|
+
- name: id
|
|
2599
|
+
in: path
|
|
2600
|
+
required: true
|
|
2601
|
+
description: Workflow ID (UUID v7)
|
|
2602
|
+
schema:
|
|
2603
|
+
$ref: '#/components/schemas/UuidV7'
|
|
2604
|
+
responses:
|
|
2605
|
+
'200':
|
|
2606
|
+
description: Workflow archived (or already archived — idempotent).
|
|
2607
|
+
content:
|
|
2608
|
+
application/json:
|
|
2609
|
+
schema:
|
|
2610
|
+
$ref: '#/components/schemas/WorkflowArchiveSuccessEnvelope'
|
|
2611
|
+
examples:
|
|
2612
|
+
archived:
|
|
2613
|
+
summary: Archive a completed workflow
|
|
2614
|
+
value:
|
|
2615
|
+
success: true
|
|
2616
|
+
data:
|
|
2617
|
+
workflow_id: "019539ac-2222-7000-8000-000000000001"
|
|
2618
|
+
status: "completed"
|
|
2619
|
+
archived: true
|
|
2620
|
+
archived_at: "2026-07-17T20:15:00Z"
|
|
2621
|
+
idempotent_rearchive:
|
|
2622
|
+
summary: Archiving an already-archived workflow
|
|
2623
|
+
value:
|
|
2624
|
+
success: true
|
|
2625
|
+
data:
|
|
2626
|
+
workflow_id: "019539ac-2222-7000-8000-000000000002"
|
|
2627
|
+
status: "failed"
|
|
2628
|
+
archived: true
|
|
2629
|
+
archived_at: "2026-07-17T19:55:00Z"
|
|
2630
|
+
'401':
|
|
2631
|
+
description: Authentication required.
|
|
2632
|
+
content:
|
|
2633
|
+
application/json:
|
|
2634
|
+
schema:
|
|
2635
|
+
$ref: '#/components/schemas/ErrorEnvelope'
|
|
2636
|
+
'404':
|
|
2637
|
+
description: Workflow not found OR not owned by the caller (same shape — no ownership leak).
|
|
2638
|
+
content:
|
|
2639
|
+
application/json:
|
|
2640
|
+
schema:
|
|
2641
|
+
$ref: '#/components/schemas/ErrorEnvelope'
|
|
2642
|
+
'409':
|
|
2643
|
+
description: |
|
|
2644
|
+
Workflow is in a non-terminal state (`pending`, `in_progress`,
|
|
2645
|
+
`paused_insufficient_credits`) and cannot be archived yet — only
|
|
2646
|
+
terminal workflows are archivable. Cancel it first
|
|
2647
|
+
(`POST /api/workflows/{id}/cancel`) or wait for it to finish, then
|
|
2648
|
+
retry. Check status via `GET /api/workflows/{id}/status`.
|
|
2649
|
+
content:
|
|
2650
|
+
application/json:
|
|
2651
|
+
schema:
|
|
2652
|
+
$ref: '#/components/schemas/ErrorEnvelope'
|
|
2653
|
+
'429':
|
|
2654
|
+
description: Rate limit exceeded
|
|
2655
|
+
content:
|
|
2656
|
+
application/json:
|
|
2657
|
+
schema:
|
|
2658
|
+
$ref: '#/components/schemas/ErrorEnvelope'
|
|
2659
|
+
'500':
|
|
2660
|
+
description: Internal server error
|
|
2661
|
+
content:
|
|
2662
|
+
application/json:
|
|
2663
|
+
schema:
|
|
2664
|
+
$ref: '#/components/schemas/ErrorEnvelope'
|
|
2665
|
+
|
|
2666
|
+
/api/workflows/{id}/restore:
|
|
2667
|
+
post:
|
|
2668
|
+
summary: Restore (un-archive) a workflow
|
|
2669
|
+
description: |
|
|
2670
|
+
Restore a previously-archived workflow so it reappears in the caller's
|
|
2671
|
+
default `GET /api/workflows` list. The exact inverse of
|
|
2672
|
+
`POST /api/workflows/{id}/archive` — it clears the `archived` flag and
|
|
2673
|
+
nothing else. Status, jobs, operations, outputs, and download links are
|
|
2674
|
+
untouched (archiving never hid or changed any of those; it only hid the
|
|
2675
|
+
list row).
|
|
2676
|
+
|
|
2677
|
+
Owner-scoped. Idempotent — restoring a workflow that is not archived
|
|
2678
|
+
is a harmless no-op that returns 200 with `archived: false`. Because a
|
|
2679
|
+
non-archived workflow can be in any lifecycle state, the echoed
|
|
2680
|
+
`status` is the workflow's unchanged status (any `WorkflowStatus`
|
|
2681
|
+
value), not a fixed terminal subset. There is no 409: un-archiving is
|
|
2682
|
+
always safe.
|
|
2683
|
+
operationId: restoreWorkflow
|
|
2684
|
+
security: [{bearerAuth: []}, {sessionAuth: []}] # required (explicit 401 in response set)
|
|
2685
|
+
x-identity-scoped: true # workflow-ownership-scoped per ADR-0016 D3
|
|
2686
|
+
tags:
|
|
2687
|
+
- Workflow
|
|
2688
|
+
parameters:
|
|
2689
|
+
- name: id
|
|
2690
|
+
in: path
|
|
2691
|
+
required: true
|
|
2692
|
+
description: Workflow ID (UUID v7)
|
|
2693
|
+
schema:
|
|
2694
|
+
$ref: '#/components/schemas/UuidV7'
|
|
2695
|
+
responses:
|
|
2696
|
+
'200':
|
|
2697
|
+
description: Workflow restored (or was already not archived — idempotent).
|
|
2698
|
+
content:
|
|
2699
|
+
application/json:
|
|
2700
|
+
schema:
|
|
2701
|
+
$ref: '#/components/schemas/WorkflowRestoreSuccessEnvelope'
|
|
2702
|
+
examples:
|
|
2703
|
+
restored:
|
|
2704
|
+
summary: Restore an archived workflow
|
|
2705
|
+
value:
|
|
2706
|
+
success: true
|
|
2707
|
+
data:
|
|
2708
|
+
workflow_id: "019539ac-2222-7000-8000-000000000001"
|
|
2709
|
+
status: "completed"
|
|
2710
|
+
archived: false
|
|
2711
|
+
idempotent_restore:
|
|
2712
|
+
summary: Restoring a workflow that was not archived
|
|
2713
|
+
value:
|
|
2714
|
+
success: true
|
|
2715
|
+
data:
|
|
2716
|
+
workflow_id: "019539ac-2222-7000-8000-000000000002"
|
|
2717
|
+
status: "in_progress"
|
|
2718
|
+
archived: false
|
|
2719
|
+
'401':
|
|
2720
|
+
description: Authentication required.
|
|
2721
|
+
content:
|
|
2722
|
+
application/json:
|
|
2723
|
+
schema:
|
|
2724
|
+
$ref: '#/components/schemas/ErrorEnvelope'
|
|
2725
|
+
'404':
|
|
2726
|
+
description: Workflow not found OR not owned by the caller (same shape — no ownership leak).
|
|
2727
|
+
content:
|
|
2728
|
+
application/json:
|
|
2729
|
+
schema:
|
|
2730
|
+
$ref: '#/components/schemas/ErrorEnvelope'
|
|
2731
|
+
'429':
|
|
2732
|
+
description: Rate limit exceeded
|
|
2733
|
+
content:
|
|
2734
|
+
application/json:
|
|
2735
|
+
schema:
|
|
2736
|
+
$ref: '#/components/schemas/ErrorEnvelope'
|
|
2737
|
+
'500':
|
|
2738
|
+
description: Internal server error
|
|
2739
|
+
content:
|
|
2740
|
+
application/json:
|
|
2741
|
+
schema:
|
|
2742
|
+
$ref: '#/components/schemas/ErrorEnvelope'
|
|
2743
|
+
|
|
2516
2744
|
# ============================================
|
|
2517
2745
|
# OPERATIONS ENDPOINTS
|
|
2518
2746
|
# ============================================
|
|
@@ -5552,6 +5780,34 @@ components:
|
|
|
5552
5780
|
- planned
|
|
5553
5781
|
- deprecated
|
|
5554
5782
|
|
|
5783
|
+
PerClassAvailabilityEntry:
|
|
5784
|
+
type: object
|
|
5785
|
+
description: |
|
|
5786
|
+
Availability of an option (or one of its values) on ONE execution
|
|
5787
|
+
class. Attached as a value within a `per_class_availability` map,
|
|
5788
|
+
keyed by a `processing_class` name the parent mime_group
|
|
5789
|
+
declares.
|
|
5790
|
+
|
|
5791
|
+
Exists because `processing_class:` is a SIBLING of `options:`,
|
|
5792
|
+
not a parent, so without this overlay "honoured on short-form,
|
|
5793
|
+
unavailable on long-form" is inexpressible and the only
|
|
5794
|
+
instrument is an operation-wide `planned` — which withdraws a
|
|
5795
|
+
working capability from every caller to describe one path's gap.
|
|
5796
|
+
|
|
5797
|
+
**May only RESTRICT** relative to the scope it overlays, never
|
|
5798
|
+
re-open it (`schemas/FORMAT.md` §Precedence; machine-enforced).
|
|
5799
|
+
required:
|
|
5800
|
+
- availability
|
|
5801
|
+
properties:
|
|
5802
|
+
availability:
|
|
5803
|
+
$ref: '#/components/schemas/AvailabilityValue'
|
|
5804
|
+
eta:
|
|
5805
|
+
type: string
|
|
5806
|
+
description: ISO-8601 date or quarter when this class is expected to support it.
|
|
5807
|
+
documentation_url:
|
|
5808
|
+
type: string
|
|
5809
|
+
format: uri
|
|
5810
|
+
|
|
5555
5811
|
PerValueAvailabilityEntry:
|
|
5556
5812
|
type: object
|
|
5557
5813
|
description: |
|
|
@@ -5570,11 +5826,50 @@ components:
|
|
|
5570
5826
|
present in this map MUST be a subset of the option's `values[]`
|
|
5571
5827
|
array — verified by `make check-per-value-availability`
|
|
5572
5828
|
(`scripts/check-per-value-availability.py`).
|
|
5829
|
+
|
|
5830
|
+
**`availability` is ALWAYS required, including when
|
|
5831
|
+
`per_class_availability` is present.** An entry carrying a
|
|
5832
|
+
per-class overlay MUST also state the blanket truth:
|
|
5833
|
+
|
|
5834
|
+
target_size:
|
|
5835
|
+
availability: stable # true on every other path
|
|
5836
|
+
per_class_availability:
|
|
5837
|
+
long_form_re_encode: { availability: planned }
|
|
5838
|
+
|
|
5839
|
+
**Ruled 2026-07-29, reversing an earlier reading of mine that
|
|
5840
|
+
the absence of a blanket tag was itself the statement.** Three
|
|
5841
|
+
reasons, and the third is the one that decided it:
|
|
5842
|
+
|
|
5843
|
+
1. It keeps the restrict-only check **LOCAL** — the value an
|
|
5844
|
+
overlay is compared against sits in the same entry, instead
|
|
5845
|
+
of requiring a walk up to option/group/operation scope that
|
|
5846
|
+
must be got right at every nesting depth.
|
|
5847
|
+
2. It keeps consumers' parsers correct as written: requiring the
|
|
5848
|
+
blanket value IS the rule they already enforce.
|
|
5849
|
+
3. **It stops the absence of a key carrying meaning.** A reader
|
|
5850
|
+
seeing only `per_class_availability` would have to INFER the
|
|
5851
|
+
general level from a key that is not there — the failure
|
|
5852
|
+
shape this contract spent 2026-07-28 removing everywhere
|
|
5853
|
+
else, and it should not be reintroduced here.
|
|
5854
|
+
|
|
5855
|
+
Nothing is lost by requiring it: the blanket value is `stable`,
|
|
5856
|
+
which is TRUE, and most-cautious inheritance then yields the
|
|
5857
|
+
intended behaviour from the per-class restriction on top.
|
|
5573
5858
|
required:
|
|
5574
5859
|
- availability
|
|
5575
5860
|
properties:
|
|
5576
5861
|
availability:
|
|
5577
5862
|
$ref: '#/components/schemas/AvailabilityValue'
|
|
5863
|
+
per_class_availability:
|
|
5864
|
+
type: object
|
|
5865
|
+
description: |
|
|
5866
|
+
Per-execution-class overlay for this enum value: restricts it
|
|
5867
|
+
on named `processing_class` entries of the parent mime_group
|
|
5868
|
+
while leaving the others at the inherited level. Keys MUST be
|
|
5869
|
+
classes the group declares. See `schemas/FORMAT.md`
|
|
5870
|
+
§`per_class_availability`.
|
|
5871
|
+
additionalProperties:
|
|
5872
|
+
$ref: '#/components/schemas/PerClassAvailabilityEntry'
|
|
5578
5873
|
required_tier:
|
|
5579
5874
|
description: |
|
|
5580
5875
|
Tier required to use this enum value. Optional — omit when
|
|
@@ -5713,6 +6008,7 @@ components:
|
|
|
5713
6008
|
|
|
5714
6009
|
UploadSource:
|
|
5715
6010
|
type: object
|
|
6011
|
+
additionalProperties: false # closed to the API allowlist {type, file_id} — fZXM5VZd
|
|
5716
6012
|
description: |
|
|
5717
6013
|
References an upload created via `POST /api/uploads` (single)
|
|
5718
6014
|
or completed via `POST /api/uploads/multipart/complete`
|
|
@@ -5726,28 +6022,10 @@ components:
|
|
|
5726
6022
|
const: upload
|
|
5727
6023
|
file_id:
|
|
5728
6024
|
$ref: '#/components/schemas/UuidV7'
|
|
5729
|
-
declared_duration_seconds:
|
|
5730
|
-
type:
|
|
5731
|
-
- number
|
|
5732
|
-
- "null"
|
|
5733
|
-
minimum: 0
|
|
5734
|
-
description: |
|
|
5735
|
-
OPTIONAL client-declared media duration in seconds, measured on the
|
|
5736
|
-
client **before** upload (e.g. the browser's
|
|
5737
|
-
`HTMLVideoElement.duration`). A **routing hint** for long-form
|
|
5738
|
-
classification only ([`frlwBuQ5`](https://trello.com/c/frlwBuQ5)):
|
|
5739
|
-
the server prefers its own authoritative media probe and falls back
|
|
5740
|
-
to this value **only when the async probe duration is null** (e.g.
|
|
5741
|
-
the probe has not completed at classification time). It never
|
|
5742
|
-
overrides a successful probe, and is not billed against — duration
|
|
5743
|
-
billing uses the probed value. Omit (or `null`) when unknown —
|
|
5744
|
-
**absent behaves exactly as today** (probe-only). Ignored for
|
|
5745
|
-
non-timed media. Only meaningful on an `upload` source (the one the
|
|
5746
|
-
client measured locally); other source leaves do not carry it.
|
|
5747
|
-
example: 187.5
|
|
5748
6025
|
|
|
5749
6026
|
JobOutputSource:
|
|
5750
6027
|
type: object
|
|
6028
|
+
additionalProperties: false # closed to the API allowlist {type, from, operation} — fZXM5VZd
|
|
5751
6029
|
description: |
|
|
5752
6030
|
References the output of an upstream job in the same workflow.
|
|
5753
6031
|
Used to chain operations: workflow runs job A first, then job B
|
|
@@ -5771,6 +6049,7 @@ components:
|
|
|
5771
6049
|
|
|
5772
6050
|
ExternalImportToken:
|
|
5773
6051
|
type: object
|
|
6052
|
+
additionalProperties: false # closed to the API allowlist {type, external_source_id} — fZXM5VZd
|
|
5774
6053
|
description: |
|
|
5775
6054
|
Opaque handle returned by `POST /api/external-imports` for a
|
|
5776
6055
|
one-shot bearer URL (S3 presigned, GCS signed, Azure SAS,
|
|
@@ -5790,6 +6069,7 @@ components:
|
|
|
5790
6069
|
|
|
5791
6070
|
ConnectionSource:
|
|
5792
6071
|
type: object
|
|
6072
|
+
additionalProperties: false # closed to the API allowlist {type, connection_id, path} — fZXM5VZd
|
|
5793
6073
|
description: |
|
|
5794
6074
|
Reference to a vaulted connection (pre-registered via
|
|
5795
6075
|
`POST /api/connections` — owned by cross-repo `compression_api`
|
|
@@ -5830,6 +6110,17 @@ components:
|
|
|
5830
6110
|
|
|
5831
6111
|
Wiring into `JobDefinition` lands via ticket
|
|
5832
6112
|
[I12 (`Gr0VKFya`)](https://trello.com/c/Gr0VKFya).
|
|
6113
|
+
|
|
6114
|
+
**All four leaves are CLOSED** (`additionalProperties: false`) to
|
|
6115
|
+
exactly the API's per-leaf allowlist (`WorkflowSourceV2Constraint`,
|
|
6116
|
+
which hard-rejects any extra key). This is a deliberate forward-compat
|
|
6117
|
+
stance (ticket [`fZXM5VZd`](https://trello.com/c/fZXM5VZd)): a client
|
|
6118
|
+
sending a *future* additive field fails contract-validation the same way
|
|
6119
|
+
the API already rejects it — so contract and runtime agree. Adding a new
|
|
6120
|
+
field to a leaf therefore requires a paired API-allowlist change in the
|
|
6121
|
+
same co-land. The union aliases themselves (`WorkflowSource`,
|
|
6122
|
+
`MultiInputSource`, `ExternalSource`) stay open — they are `oneOf`
|
|
6123
|
+
dispatchers, not property-bearing objects.
|
|
5833
6124
|
oneOf:
|
|
5834
6125
|
- $ref: '#/components/schemas/UploadSource'
|
|
5835
6126
|
- $ref: '#/components/schemas/JobOutputSource'
|
|
@@ -6561,6 +6852,44 @@ components:
|
|
|
6561
6852
|
offset:
|
|
6562
6853
|
type: integer
|
|
6563
6854
|
minimum: 0
|
|
6855
|
+
current_cycle_net_spent:
|
|
6856
|
+
type: integer
|
|
6857
|
+
minimum: 0
|
|
6858
|
+
description: |
|
|
6859
|
+
OPTIONAL/additive. Net credits the caller has spent in the CURRENT
|
|
6860
|
+
billing cycle — the monthly-grant period (ledger rows with
|
|
6861
|
+
`created_at` >= the current cycle start). Integer credit units, same
|
|
6862
|
+
as `CreditTransaction.amount` and the balance fields.
|
|
6863
|
+
|
|
6864
|
+
**"Net" = credits actually consumed**, i.e. reservation debits minus
|
|
6865
|
+
the credit-returns that give credits back:
|
|
6866
|
+
|
|
6867
|
+
net = Σ |workflow-reservation debits|
|
|
6868
|
+
− Σ |credit-return rows|
|
|
6869
|
+
|
|
6870
|
+
Rows are identified by **`reference_type`, NOT `type`** — there is
|
|
6871
|
+
no `type: refund` row. The debit is
|
|
6872
|
+
`reference_type: workflow_reservation` (a negative `amount`); the
|
|
6873
|
+
credit-return family is `reference_type` ∈ {`workflow_settle_refund`,
|
|
6874
|
+
`workflow_reservation_release`, `workflow_pause_release`,
|
|
6875
|
+
`workflow_expiry_release`} (positive amounts). This nets a fully
|
|
6876
|
+
released / cancelled / expired reservation to ~0 and a settled one to
|
|
6877
|
+
its non-refundable consumed portion — so it reflects credits ACTUALLY
|
|
6878
|
+
consumed, not gross reservations (a raw settled-sum would overstate
|
|
6879
|
+
spend, since the returns are separate positive rows). Mirrors the
|
|
6880
|
+
reserved-minus-refunded semantics of the API's authoritative
|
|
6881
|
+
`WorkflowCreditSummary` reads. **Absent** for legacy/unsupported
|
|
6882
|
+
reads — treat as unknown, not `0`. Per ticket
|
|
6883
|
+
[`5aXGShPy`](https://trello.com/c/5aXGShPy).
|
|
6884
|
+
lifetime_net_spent:
|
|
6885
|
+
type: integer
|
|
6886
|
+
minimum: 0
|
|
6887
|
+
description: |
|
|
6888
|
+
OPTIONAL/additive. Same net-of-credit-returns formula as
|
|
6889
|
+
`current_cycle_net_spent`, but ALL-TIME (no cycle window) — the
|
|
6890
|
+
caller's total credits ever consumed. Integer credit units.
|
|
6891
|
+
**Absent** for legacy/unsupported reads — treat as unknown, not `0`.
|
|
6892
|
+
Per ticket [`5aXGShPy`](https://trello.com/c/5aXGShPy).
|
|
6564
6893
|
|
|
6565
6894
|
CreditsUsageSuccessEnvelope:
|
|
6566
6895
|
type: object
|
|
@@ -6693,7 +7022,10 @@ components:
|
|
|
6693
7022
|
documented string (not a strict enum) so the rate-limit subset
|
|
6694
7023
|
validates against the same schema and consumers tolerate unknown
|
|
6695
7024
|
codes; SDKs branch on the `LONG_FORM_CONCURRENCY_LIMIT_EXCEEDED`
|
|
6696
|
-
value to distinguish
|
|
7025
|
+
value to distinguish it. A third links-absent branch shares this
|
|
7026
|
+
`429`: `DUPLICATE_IN_PROGRESS` (idempotency fold, ticket
|
|
7027
|
+
[`DSxwCetg`](https://trello.com/c/DSxwCetg)) — see the endpoint's
|
|
7028
|
+
`429` response description for the full trigger list.
|
|
6697
7029
|
|
|
6698
7030
|
Mirrors the runtime shape produced by `compression_api`'s
|
|
6699
7031
|
`WorkflowController` +
|
|
@@ -6817,6 +7149,99 @@ components:
|
|
|
6817
7149
|
data:
|
|
6818
7150
|
$ref: '#/components/schemas/WorkflowResumeResponse'
|
|
6819
7151
|
|
|
7152
|
+
WorkflowArchiveResponse:
|
|
7153
|
+
type: object
|
|
7154
|
+
description: |
|
|
7155
|
+
Response body for `POST /api/workflows/{id}/archive` (ticket
|
|
7156
|
+
[`j2s6T2qf`](https://trello.com/c/j2s6T2qf)). Archiving sets the
|
|
7157
|
+
`archived` flag so the row drops from the default workflow list; it
|
|
7158
|
+
does NOT change the workflow's status, delete anything, or hide it from
|
|
7159
|
+
`GET /api/workflows/{id}/status` or its downloads. Reversible via
|
|
7160
|
+
`POST /api/workflows/{id}/restore`.
|
|
7161
|
+
required:
|
|
7162
|
+
- workflow_id
|
|
7163
|
+
- status
|
|
7164
|
+
- archived
|
|
7165
|
+
- archived_at
|
|
7166
|
+
properties:
|
|
7167
|
+
workflow_id:
|
|
7168
|
+
$ref: '#/components/schemas/UuidV7'
|
|
7169
|
+
status:
|
|
7170
|
+
type: string
|
|
7171
|
+
enum:
|
|
7172
|
+
- completed
|
|
7173
|
+
- failed
|
|
7174
|
+
- partially_failed
|
|
7175
|
+
- cancelled
|
|
7176
|
+
- expired
|
|
7177
|
+
description: |
|
|
7178
|
+
The workflow's UNCHANGED terminal status — archive never mutates
|
|
7179
|
+
status, only sets the archived flag. Constrained to the terminal
|
|
7180
|
+
subset of `WorkflowStatus` (the only archivable states); an active
|
|
7181
|
+
workflow is a 409, never a 200.
|
|
7182
|
+
archived:
|
|
7183
|
+
type: boolean
|
|
7184
|
+
enum: [true]
|
|
7185
|
+
description: Always `true` on a 200 — the workflow is archived.
|
|
7186
|
+
archived_at:
|
|
7187
|
+
type: string
|
|
7188
|
+
format: date-time
|
|
7189
|
+
description: |
|
|
7190
|
+
ISO-8601 timestamp the workflow was FIRST archived. Idempotent —
|
|
7191
|
+
a re-archive of an already-archived workflow returns the original
|
|
7192
|
+
`archived_at`, unchanged.
|
|
7193
|
+
|
|
7194
|
+
WorkflowArchiveSuccessEnvelope:
|
|
7195
|
+
type: object
|
|
7196
|
+
additionalProperties: false
|
|
7197
|
+
required:
|
|
7198
|
+
- success
|
|
7199
|
+
- data
|
|
7200
|
+
properties:
|
|
7201
|
+
success:
|
|
7202
|
+
type: boolean
|
|
7203
|
+
enum: [true]
|
|
7204
|
+
data:
|
|
7205
|
+
$ref: '#/components/schemas/WorkflowArchiveResponse'
|
|
7206
|
+
|
|
7207
|
+
WorkflowRestoreResponse:
|
|
7208
|
+
type: object
|
|
7209
|
+
description: |
|
|
7210
|
+
Response body for `POST /api/workflows/{id}/restore` (ticket
|
|
7211
|
+
[`j2s6T2qf`](https://trello.com/c/j2s6T2qf)). Restoring clears the
|
|
7212
|
+
`archived` flag so the workflow reappears in the default list. The
|
|
7213
|
+
inverse of archive — status, jobs, outputs, and downloads are
|
|
7214
|
+
untouched.
|
|
7215
|
+
required:
|
|
7216
|
+
- workflow_id
|
|
7217
|
+
- status
|
|
7218
|
+
- archived
|
|
7219
|
+
properties:
|
|
7220
|
+
workflow_id:
|
|
7221
|
+
$ref: '#/components/schemas/UuidV7'
|
|
7222
|
+
status:
|
|
7223
|
+
$ref: '#/components/schemas/WorkflowStatus'
|
|
7224
|
+
archived:
|
|
7225
|
+
type: boolean
|
|
7226
|
+
enum: [false]
|
|
7227
|
+
description: |
|
|
7228
|
+
Always `false` on a 200 — the workflow is no longer archived
|
|
7229
|
+
(or was never archived; restore is an idempotent no-op there).
|
|
7230
|
+
No `archived_at` is returned once restored.
|
|
7231
|
+
|
|
7232
|
+
WorkflowRestoreSuccessEnvelope:
|
|
7233
|
+
type: object
|
|
7234
|
+
additionalProperties: false
|
|
7235
|
+
required:
|
|
7236
|
+
- success
|
|
7237
|
+
- data
|
|
7238
|
+
properties:
|
|
7239
|
+
success:
|
|
7240
|
+
type: boolean
|
|
7241
|
+
enum: [true]
|
|
7242
|
+
data:
|
|
7243
|
+
$ref: '#/components/schemas/WorkflowRestoreResponse'
|
|
7244
|
+
|
|
6820
7245
|
WorkflowExpiredResponse:
|
|
6821
7246
|
allOf:
|
|
6822
7247
|
- $ref: '#/components/schemas/ErrorEnvelope'
|
|
@@ -9393,12 +9818,29 @@ components:
|
|
|
9393
9818
|
description: |
|
|
9394
9819
|
Caller-supplied logical-policy hint on `WorkflowCreateRequest`.
|
|
9395
9820
|
NOT a backend selector — server is final authority on routing.
|
|
9821
|
+
|
|
9822
|
+
`auto` is the only committed value; the other three are
|
|
9823
|
+
`planned` — the API runtime returns `422 feature_not_available`
|
|
9824
|
+
for any non-`auto` value until they ship. Value availability is
|
|
9825
|
+
carried by `per_value_availability` below and promoted to the
|
|
9826
|
+
authoritative sidecar as
|
|
9827
|
+
`workflow_features.processing.class_hint` (keyed by request-shape
|
|
9828
|
+
path, mirroring `workflow_features.delivery.mode`; the decorative
|
|
9829
|
+
`x-availability`/openapi is not authoritative — consumers read the
|
|
9830
|
+
runtime endpoint / sidecar).
|
|
9831
|
+
|
|
9396
9832
|
- `auto` (default): server routes safely.
|
|
9397
|
-
- `short_form_only
|
|
9398
|
-
|
|
9399
|
-
|
|
9400
|
-
|
|
9401
|
-
|
|
9833
|
+
- `short_form_only` (planned): once shipped, fails fast when any
|
|
9834
|
+
job would require `long_form`. The dedicated fail-fast reject
|
|
9835
|
+
envelope is defined at graduation (co-design with the API
|
|
9836
|
+
handler); while planned the reject is the standard
|
|
9837
|
+
`feature_not_available`. NOTE: `tier_policy` is a success-path
|
|
9838
|
+
advisory reason on `ProcessingClassReason` (why an honored
|
|
9839
|
+
hint drove classification), NOT a 422 reject reason —
|
|
9840
|
+
`ProcessingClassRejectReason` stays ceiling-reasons only.
|
|
9841
|
+
- `long_form_allowed` (planned): caller accepts slower
|
|
9842
|
+
queue/runtime semantics.
|
|
9843
|
+
- `long_form_preferred` (planned): prefer `long_form` pool when
|
|
9402
9844
|
eligible (test/isolation use cases).
|
|
9403
9845
|
enum:
|
|
9404
9846
|
- auto
|
|
@@ -9406,6 +9848,11 @@ components:
|
|
|
9406
9848
|
- long_form_allowed
|
|
9407
9849
|
- long_form_preferred
|
|
9408
9850
|
default: auto
|
|
9851
|
+
per_value_availability:
|
|
9852
|
+
auto: { availability: stable }
|
|
9853
|
+
short_form_only: { availability: planned }
|
|
9854
|
+
long_form_allowed: { availability: planned }
|
|
9855
|
+
long_form_preferred: { availability: planned }
|
|
9409
9856
|
|
|
9410
9857
|
EstimateQuality:
|
|
9411
9858
|
type: string
|
|
@@ -9462,6 +9909,82 @@ components:
|
|
|
9462
9909
|
- `tier_policy`: emitted when the caller's
|
|
9463
9910
|
`processing.class_hint` (e.g. `short_form_only`) forced
|
|
9464
9911
|
the decision rather than input characteristics.
|
|
9912
|
+
- `input_metrics_unavailable`: **the classifier did not have
|
|
9913
|
+
every metric the decision required.** One or more of the
|
|
9914
|
+
duration / size figures it needed was unavailable at
|
|
9915
|
+
create-plan time (e.g. an upload probe had not landed), so a
|
|
9916
|
+
class was DEFAULTED rather than chosen. Note this covers the
|
|
9917
|
+
PARTIAL case as well as the none-at-all case — see below;
|
|
9918
|
+
having *some* metrics is not having the metric the decision
|
|
9919
|
+
required. **This is the only
|
|
9920
|
+
value that does not assert a measurement.** Every other value
|
|
9921
|
+
states a fact about the input; this one states that no such
|
|
9922
|
+
fact was obtained.
|
|
9923
|
+
|
|
9924
|
+
**It is a reason a class was DEFAULTED, not a reason a class
|
|
9925
|
+
was CHOSEN** — despite sitting in `ProcessingClassReason`.
|
|
9926
|
+
Read it as *no routing claim was made*. Consumers MUST NOT
|
|
9927
|
+
read the assigned `processing_class` as evidence the input
|
|
9928
|
+
fits that class's constraints when this reason is present,
|
|
9929
|
+
and MUST NOT surface it as a positive statement about the
|
|
9930
|
+
file.
|
|
9931
|
+
|
|
9932
|
+
**Partial measurement usually counts as unmeasured.** On a
|
|
9933
|
+
multi-input operation, emit this whenever a contributing
|
|
9934
|
+
input lacked the metric the decision needed — a sum over the
|
|
9935
|
+
inputs that happened to be probed is not a measurement of the
|
|
9936
|
+
request, even though it is not empty either. The honest
|
|
9937
|
+
predicate is "did I have every metric this decision required",
|
|
9938
|
+
not "did I have some".
|
|
9939
|
+
|
|
9940
|
+
**The exception, and it is a principle rather than a special
|
|
9941
|
+
case: partial evidence that is DECISIVE is still evidence.**
|
|
9942
|
+
Ask whether the missing data could FALSIFY the claim the
|
|
9943
|
+
reason makes:
|
|
9944
|
+
|
|
9945
|
+
- `within_short_form_limits` claims the input **fits**. An
|
|
9946
|
+
unmeasured input can only ADD to the sum, so it could push
|
|
9947
|
+
the request over the cap — the missing data can falsify the
|
|
9948
|
+
claim. This reason therefore requires COMPLETE measurement,
|
|
9949
|
+
and a partial sum must report `input_metrics_unavailable`.
|
|
9950
|
+
- `input_duration_exceeds_short_form` /
|
|
9951
|
+
`input_size_exceeds_short_form` claim the input **exceeds**
|
|
9952
|
+
a cap. The sums are MONOTONE — they only grow — so once the
|
|
9953
|
+
measured subset alone crosses the cap, the missing data
|
|
9954
|
+
cannot falsify the claim. The escalation is positively
|
|
9955
|
+
evidenced, and the decision did not *need* the missing
|
|
9956
|
+
metric. **Report the real reason, NOT
|
|
9957
|
+
`input_metrics_unavailable`.**
|
|
9958
|
+
|
|
9959
|
+
Reporting "I could not measure" for a decision that WAS
|
|
9960
|
+
positively evidenced is a lie in the opposite direction, and
|
|
9961
|
+
it costs twice: it understates what the server knew, and —
|
|
9962
|
+
because this field carries one value — it MASKS a more
|
|
9963
|
+
specific true reason such as `merge_re_encode_long_form`.
|
|
9964
|
+
|
|
9965
|
+
**Generalise by the falsifiability test, not by the list
|
|
9966
|
+
above.** If a future cap is a band rather than a ceiling, or
|
|
9967
|
+
a metric can reduce a total, the monotonicity no longer holds
|
|
9968
|
+
and the exception does not apply.
|
|
9969
|
+
|
|
9970
|
+
**Known limit, stated so it is not later read as a gap in a
|
|
9971
|
+
completed fix:** an input whose probe landed with a duration
|
|
9972
|
+
of **zero** counts as MEASURED and contributes 0 to the sum.
|
|
9973
|
+
That is indistinguishable from a genuine zero-length input
|
|
9974
|
+
from outside the classifier, so this value does not and
|
|
9975
|
+
cannot cover it.
|
|
9976
|
+
|
|
9977
|
+
**Why this value exists (2026-07-28).** A deduplicated upload
|
|
9978
|
+
(and, independently, a fresh upload racing an async probe)
|
|
9979
|
+
reaches create-plan with no duration, and a 62-minute merge was
|
|
9980
|
+
assigned `short_form` with reason `within_short_form_limits` —
|
|
9981
|
+
an affirmative claim that a 62-minute input fits inside a
|
|
9982
|
+
`PT5M` cap. The fallback was indistinguishable from a genuine
|
|
9983
|
+
measurement, so the mis-route was invisible. A classifier that
|
|
9984
|
+
cannot say *"I did not know"* has no way to be honest; this
|
|
9985
|
+
value is that sentence. Emit it in preference to a
|
|
9986
|
+
measurement-asserting value whenever the metrics were absent,
|
|
9987
|
+
even if the class ultimately chosen happens to be correct.
|
|
9465
9988
|
enum:
|
|
9466
9989
|
- within_short_form_limits
|
|
9467
9990
|
- input_size_exceeds_short_form
|
|
@@ -9469,6 +9992,7 @@ components:
|
|
|
9469
9992
|
- merge_re_encode_long_form
|
|
9470
9993
|
- requires_reencode
|
|
9471
9994
|
- tier_policy
|
|
9995
|
+
- input_metrics_unavailable
|
|
9472
9996
|
|
|
9473
9997
|
ProcessingPlanJob:
|
|
9474
9998
|
type: object
|
|
@@ -9509,6 +10033,90 @@ components:
|
|
|
9509
10033
|
$ref: '#/components/schemas/EstimateQuality'
|
|
9510
10034
|
reason:
|
|
9511
10035
|
$ref: '#/components/schemas/ProcessingClassReason'
|
|
10036
|
+
dropped_options:
|
|
10037
|
+
type: array
|
|
10038
|
+
description: |
|
|
10039
|
+
Options the SERVER supplied on the caller's behalf and then
|
|
10040
|
+
REMOVED, because the resolved execution path cannot honour
|
|
10041
|
+
them. **Never contains a value the caller sent explicitly** —
|
|
10042
|
+
an explicit option the path cannot honour is refused with
|
|
10043
|
+
`422 feature_not_available`, not silently dropped. That
|
|
10044
|
+
split is the whole rule: a caller who asked for nothing is
|
|
10045
|
+
not punished for our default; a caller who asked for
|
|
10046
|
+
something is told.
|
|
10047
|
+
|
|
10048
|
+
**Why this field exists at all.** Dropping a defaulted
|
|
10049
|
+
option is better than refusing the request, and it is still
|
|
10050
|
+
a silent no-op unless we say so — the caller asked for
|
|
10051
|
+
(say) audio normalisation, we did not do it, and nobody
|
|
10052
|
+
told them. This field is the "we did not do that" sentence,
|
|
10053
|
+
the same honesty requirement as
|
|
10054
|
+
`ProcessingClassReason.input_metrics_unavailable`.
|
|
10055
|
+
|
|
10056
|
+
**🔴 ABSENCE CARRIES NO INFORMATION until every server
|
|
10057
|
+
emits it.** An empty array means "nothing was dropped". An
|
|
10058
|
+
ABSENT array means "this server does not report drops" —
|
|
10059
|
+
consumers MUST NOT read absence as "nothing was dropped".
|
|
10060
|
+
Once the emitting side ships, the array is always present.
|
|
10061
|
+
items:
|
|
10062
|
+
$ref: '#/components/schemas/DroppedOption'
|
|
10063
|
+
|
|
10064
|
+
DroppedOption:
|
|
10065
|
+
type: object
|
|
10066
|
+
description: |
|
|
10067
|
+
One server-supplied option removed from a job before dispatch.
|
|
10068
|
+
**Names the THING, the WHY and the PATH** — the three parts a
|
|
10069
|
+
caller needs to act, and the three a single interpolated string
|
|
10070
|
+
would fuse into something unparseable.
|
|
10071
|
+
required:
|
|
10072
|
+
- option
|
|
10073
|
+
- reason
|
|
10074
|
+
properties:
|
|
10075
|
+
option:
|
|
10076
|
+
type: string
|
|
10077
|
+
description: The option key that was removed, as it appears in the operation schema.
|
|
10078
|
+
example: normalize_audio
|
|
10079
|
+
operation_type:
|
|
10080
|
+
type: string
|
|
10081
|
+
description: |
|
|
10082
|
+
The operation the option belonged to. Present because a job
|
|
10083
|
+
may carry several operations, so the option key alone does
|
|
10084
|
+
not identify where the drop happened.
|
|
10085
|
+
example: merge
|
|
10086
|
+
operation_id:
|
|
10087
|
+
type: string
|
|
10088
|
+
format: uuid
|
|
10089
|
+
description: The specific operation, when the server can attribute the drop to one.
|
|
10090
|
+
processing_class:
|
|
10091
|
+
$ref: '#/components/schemas/ProcessingClass'
|
|
10092
|
+
reason:
|
|
10093
|
+
type: string
|
|
10094
|
+
description: |
|
|
10095
|
+
Why the option was dropped. **A documented vocabulary, NOT a
|
|
10096
|
+
strict enum** — deliberately, following `error_code`: a
|
|
10097
|
+
consumer MUST map known values to a friendly reason and
|
|
10098
|
+
MUST degrade an unknown one, so the vocabulary can grow
|
|
10099
|
+
without breaking clients.
|
|
10100
|
+
|
|
10101
|
+
**Known values:**
|
|
10102
|
+
|
|
10103
|
+
- `unavailable_on_processing_class` — the option is tagged
|
|
10104
|
+
unavailable for the class this job resolved to (see
|
|
10105
|
+
`per_class_availability` in `schemas/FORMAT.md`). The
|
|
10106
|
+
`processing_class` field names which.
|
|
10107
|
+
- `processing_class_unmeasured` — the class could NOT be
|
|
10108
|
+
measured (see
|
|
10109
|
+
`ProcessingClassReason.input_metrics_unavailable`), so the
|
|
10110
|
+
option was dropped rather than refused. **Refusing a
|
|
10111
|
+
caller on a guessed class is the same error as asserting
|
|
10112
|
+
a measurement never taken**, so an unmeasured basis
|
|
10113
|
+
degrades to a drop and never to a 422.
|
|
10114
|
+
|
|
10115
|
+
The class token is deliberately NOT interpolated into this
|
|
10116
|
+
string: the reason and the path are separate fields because
|
|
10117
|
+
a fused `not_available_on_<class>` is unparseable and
|
|
10118
|
+
duplicates `processing_class`.
|
|
10119
|
+
example: unavailable_on_processing_class
|
|
9512
10120
|
|
|
9513
10121
|
ProcessingPlan:
|
|
9514
10122
|
type: object
|
|
@@ -10438,10 +11046,16 @@ components:
|
|
|
10438
11046
|
minimum: 0
|
|
10439
11047
|
description: |
|
|
10440
11048
|
OPTIONAL. Final job output size in bytes — the right side of the
|
|
10441
|
-
savings readout. The
|
|
10442
|
-
|
|
10443
|
-
|
|
10444
|
-
|
|
11049
|
+
before→after savings readout. The **main/terminal deliverable's**
|
|
11050
|
+
size: the **highest-position completed non-thumbnail** operation's
|
|
11051
|
+
output — **NOT a sum across the job's operations** (a thumbnail's
|
|
11052
|
+
size is excluded; for a compress+thumbnail job this is the compressed
|
|
11053
|
+
output). Authoritative per-output sizes remain on
|
|
11054
|
+
`GET /{id}/downloads`. Populated from the highest-position COMPLETED
|
|
11055
|
+
op, so it is **PROVISIONAL while the job is still running** (a
|
|
11056
|
+
later-completing op can become the main deliverable and change this
|
|
11057
|
+
value) and final only once the job reaches a **terminal** status.
|
|
11058
|
+
Absent until a non-thumbnail op has completed with a recorded size.
|
|
10445
11059
|
example: 491520
|
|
10446
11060
|
operation_types:
|
|
10447
11061
|
type: array
|
|
@@ -10506,6 +11120,24 @@ components:
|
|
|
10506
11120
|
oneOf:
|
|
10507
11121
|
- $ref: '#/components/schemas/WorkflowCreditSummary'
|
|
10508
11122
|
- type: 'null'
|
|
11123
|
+
archived:
|
|
11124
|
+
type: boolean
|
|
11125
|
+
description: |
|
|
11126
|
+
Whether this workflow is archived (hidden from the default list;
|
|
11127
|
+
surfaced only via `?archived=true`). Set by
|
|
11128
|
+
`POST /api/workflows/{id}/archive`, cleared by
|
|
11129
|
+
`POST /api/workflows/{id}/restore`. Archiving is a recoverable
|
|
11130
|
+
declutter — it does NOT delete the workflow or hide it from
|
|
11131
|
+
`GET /api/workflows/{id}/status` or its downloads. **OPTIONAL
|
|
11132
|
+
(additive)** — absent is treated as `false` (not archived),
|
|
11133
|
+
covering legacy rows written before this field existed. Per ticket
|
|
11134
|
+
[`j2s6T2qf`](https://trello.com/c/j2s6T2qf).
|
|
11135
|
+
archived_at:
|
|
11136
|
+
type: string
|
|
11137
|
+
format: date-time
|
|
11138
|
+
description: |
|
|
11139
|
+
ISO-8601 timestamp the workflow was archived. Present only when
|
|
11140
|
+
`archived: true`; absent otherwise. Additive/optional.
|
|
10509
11141
|
|
|
10510
11142
|
WorkflowCreditSummary:
|
|
10511
11143
|
type: object
|
|
@@ -10787,6 +11419,28 @@ components:
|
|
|
10787
11419
|
per-operation `OperationResult.size_bytes` / `GET /{id}/downloads`).
|
|
10788
11420
|
OPTIONAL for the same webhook-payload reason as `input_filename`.
|
|
10789
11421
|
example: 1258291
|
|
11422
|
+
output_size_bytes:
|
|
11423
|
+
type: integer
|
|
11424
|
+
format: int64
|
|
11425
|
+
minimum: 0
|
|
11426
|
+
description: |
|
|
11427
|
+
OPTIONAL. Final job output size in bytes — the **right** side of the
|
|
11428
|
+
before→after savings readout. The **main/terminal deliverable's**
|
|
11429
|
+
size: the **highest-position completed non-thumbnail** operation's
|
|
11430
|
+
output — **NOT a sum across the job's operations** (a thumbnail's
|
|
11431
|
+
size is excluded; for a compress+thumbnail job this is the compressed
|
|
11432
|
+
output). Authoritative per-output sizes remain on
|
|
11433
|
+
`GET /{id}/downloads`. The drill-in mirror of
|
|
11434
|
+
`WorkflowSummaryJob.output_size_bytes` (same semantics); pairs with
|
|
11435
|
+
`input_size_bytes` above. Populated from the highest-position
|
|
11436
|
+
COMPLETED op, so it is **PROVISIONAL while the job is still running**
|
|
11437
|
+
(a later-completing op can become the main deliverable and change
|
|
11438
|
+
this value) and final only once the job reaches a **terminal**
|
|
11439
|
+
status. Absent until a non-thumbnail op has completed with a recorded
|
|
11440
|
+
size, and OPTIONAL for the same webhook-payload reason as
|
|
11441
|
+
`input_filename`. Ticket [`j2s6T2qf`](https://trello.com/c/j2s6T2qf)
|
|
11442
|
+
(FE before→after size, workflow-view launch ask).
|
|
11443
|
+
example: 491520
|
|
10790
11444
|
processing_class:
|
|
10791
11445
|
$ref: '#/components/schemas/ProcessingClass'
|
|
10792
11446
|
description: |
|
|
@@ -10866,11 +11520,29 @@ components:
|
|
|
10866
11520
|
Distinct from the workflow/API create-time `ErrorEnvelope.error`
|
|
10867
11521
|
vocabulary — this is the per-operation processing failure.
|
|
10868
11522
|
|
|
10869
|
-
**Retry semantics
|
|
10870
|
-
|
|
10871
|
-
|
|
10872
|
-
|
|
10873
|
-
`
|
|
11523
|
+
**Retry semantics — DERIVE THEM FROM THIS FIELD.** Retryability is a
|
|
11524
|
+
property OF THE ERROR CODE, not an independent fact about an
|
|
11525
|
+
occurrence: the same code is always equally retryable, so there is
|
|
11526
|
+
no per-response boolean on this surface to read. The transient codes
|
|
11527
|
+
are `out_of_memory`, `timeout`, `s3_download_failed` and
|
|
11528
|
+
`s3_upload_failed`; the AsyncAPI `ErrorCode` enum groups every value
|
|
11529
|
+
under **Retryable** / **Non-retryable** headings and is the source of
|
|
11530
|
+
truth for that mapping.
|
|
11531
|
+
|
|
11532
|
+
Note a reported failure is **always terminal** regardless: transient
|
|
11533
|
+
codes are auto-redriven (SQS) and exhausted before a failure ever
|
|
11534
|
+
surfaces here, so retryability only tells the caller whether
|
|
11535
|
+
**re-submitting** is worthwhile.
|
|
11536
|
+
|
|
11537
|
+
**This docstring previously referred to "the sibling `is_retryable`".
|
|
11538
|
+
There is no such field on the OpenAPI surface** — it exists only on
|
|
11539
|
+
the AsyncAPI worker→API channel, so no generated REST client could
|
|
11540
|
+
ever carry it, and the contract was describing to consumers something
|
|
11541
|
+
it does not deliver (ticket `wdOF3ol4`). Deliberately corrected by
|
|
11542
|
+
REMOVING the promise rather than by adding the field: a per-response
|
|
11543
|
+
boolean would be a second source of truth for a fact the code already
|
|
11544
|
+
determines, free to drift from it, and it would break again when the
|
|
11545
|
+
`retryable` boolean→enum change lands.
|
|
10874
11546
|
|
|
10875
11547
|
**Codes** (closed set; meaning):
|
|
10876
11548
|
`invalid_options` (options invalid for this op — most common),
|
|
@@ -10883,6 +11555,12 @@ components:
|
|
|
10883
11555
|
`invalid_key` (storage key invalid),
|
|
10884
11556
|
`processing_failed` (non-specific processing failure),
|
|
10885
11557
|
`s3_access_denied` (storage access denied — fail-fast, non-retryable),
|
|
11558
|
+
`input_too_large` (input exceeds our PROCESSING limits — deterministic,
|
|
11559
|
+
user-actionable via downscaling or a higher tier; distinct from the
|
|
11560
|
+
byte caps, which are refused at create and never reach a worker),
|
|
11561
|
+
`never_started` (the operation was terminated without ever running
|
|
11562
|
+
because its job reached a terminal state first — an upstream failure
|
|
11563
|
+
OR a cancellation; API-derived, never worker-emitted),
|
|
10886
11564
|
`unknown` (unclassified),
|
|
10887
11565
|
`out_of_memory` (retryable), `timeout` (retryable),
|
|
10888
11566
|
`s3_download_failed` (retryable), `s3_upload_failed` (retryable).
|
|
@@ -11190,7 +11868,100 @@ components:
|
|
|
11190
11868
|
$ref: '#/components/schemas/UuidV7'
|
|
11191
11869
|
filename:
|
|
11192
11870
|
type: string
|
|
11193
|
-
description:
|
|
11871
|
+
description: |
|
|
11872
|
+
The **download filename** the API synthesises for this output — a
|
|
11873
|
+
human-friendly, extension-bearing name. This is a DIFFERENT surface
|
|
11874
|
+
from the S3 object key (an opaque UUID/`output-NNN` leaf governed by
|
|
11875
|
+
ADR-0014 §D9); the two are independent by design. Composed as
|
|
11876
|
+
`<stem><marker><suffix><.ext>`:
|
|
11877
|
+
|
|
11878
|
+
- **stem** — derived from the originating upload's `original_name`
|
|
11879
|
+
(a chained job resolves through its upstream to the original
|
|
11880
|
+
upload; path separators, control characters and quotes stripped);
|
|
11881
|
+
collapses to `download` if the sanitised stem is empty. When there
|
|
11882
|
+
is **no** original name at all (a `job_output`-sourced job with no
|
|
11883
|
+
upstream upload, or an unrecorded/purged name — rare), the whole
|
|
11884
|
+
field falls back to the S3-key basename **as-is, unmarked**; the
|
|
11885
|
+
per-op marker below applies only to the `original_name`-derived
|
|
11886
|
+
stem, so that fallback path is the one unlabelled case and is
|
|
11887
|
+
outside this map's scope.
|
|
11888
|
+
- **marker** — a per-operation label so **every** processed output
|
|
11889
|
+
is self-describing: it names what the output IS and disambiguates
|
|
11890
|
+
the different operations of a job from each other and from the
|
|
11891
|
+
original (ticket [`50obWMbm`](https://trello.com/c/50obWMbm), user
|
|
11892
|
+
launch feedback — the user hit a watermarked-main + thumbnail
|
|
11893
|
+
collision within one job). **Scope:** the marker resolves
|
|
11894
|
+
within-job and vs-original ambiguity, NOT workflow-wide uniqueness
|
|
11895
|
+
— two SEPARATE jobs running the same op on the same-named upload
|
|
11896
|
+
still produce the same name (a rarer case a job/node identifier
|
|
11897
|
+
would address; out of scope for this label map). **Invariant, with
|
|
11898
|
+
two explicit exceptions:** every op below **except `passthrough`**
|
|
11899
|
+
carries a non-empty marker, so a terminal deliverable **derived
|
|
11900
|
+
from an `original_name`** never falls back to a bare, op-less stem
|
|
11901
|
+
(the bug this fixes). The two exceptions are inline: `passthrough`
|
|
11902
|
+
(the identity op — its output IS the original) and the
|
|
11903
|
+
no-`original_name` S3-key fallback described under **stem** above. The
|
|
11904
|
+
canonical marker is keyed on the **public (masked) operation
|
|
11905
|
+
type** — a long-form concat surfaces as `compress` and carries its
|
|
11906
|
+
marker:
|
|
11907
|
+
- `compress` → `-compressed`
|
|
11908
|
+
- `thumbnail` (and the `thumbnail_image` / `thumbnail_video` /
|
|
11909
|
+
`thumbnail_document` / `thumbnail_office` sub-types, which all
|
|
11910
|
+
surface publicly as `thumbnail`) → `-thumbnail`
|
|
11911
|
+
- `image_watermark` / `text_watermark` / `video_watermark` /
|
|
11912
|
+
`video_text_watermark` / `audio_watermark` → `-watermarked`
|
|
11913
|
+
- `convert` → `-converted` (the extension changes too, but the
|
|
11914
|
+
marker keeps naming consistent — no operation is a special case)
|
|
11915
|
+
- `merge` → `-merged`
|
|
11916
|
+
- `transform` → `-transformed`
|
|
11917
|
+
- `custom_luma` → `-graded`
|
|
11918
|
+
- `audio_overlay` → `-overlay`
|
|
11919
|
+
- `audio_to_video` → `-video`
|
|
11920
|
+
- `render_variants` → `-variant`
|
|
11921
|
+
- `split` → `-part`, plus the `-<n>` piece suffix (below) when
|
|
11922
|
+
the run yields more than one piece. The word-marker is required
|
|
11923
|
+
because a split can legally produce a SINGLE output (e.g.
|
|
11924
|
+
`frame_range: "5-5"`, a one-page PDF range, or an interval that
|
|
11925
|
+
exceeds the media duration) — without it a single-piece split
|
|
11926
|
+
would fall back to the bare original stem.
|
|
11927
|
+
- `archive` → `-archive` (the archive OPERATION's output). Note:
|
|
11928
|
+
the workflow `delivery.bundle` path names its zip from
|
|
11929
|
+
`delivery.bundle_filename` instead — that is a separate surface
|
|
11930
|
+
and takes precedence when a bundle is requested.
|
|
11931
|
+
- `passthrough` → **none, by design** — it emits the input
|
|
11932
|
+
UNCHANGED (it is the identity/plumbing op), so its output IS the
|
|
11933
|
+
original file and carries the original name. It is normally
|
|
11934
|
+
consumed by a downstream job (not a terminal deliverable); when
|
|
11935
|
+
it is a leaf, returning the original name is correct, not a
|
|
11936
|
+
mislabel.
|
|
11937
|
+
**This whole map is co-owned with `compression_api`'s
|
|
11938
|
+
`DownloadFilenameComputer`** (as the `MIME_EXTENSION` table is) —
|
|
11939
|
+
api implements it; contracts is the normative source.
|
|
11940
|
+
- **suffix** — `-<n>` **only** when the operation produced more than
|
|
11941
|
+
one output. `<n>` is the output's **0-based position in the
|
|
11942
|
+
producer's `outputs[]` array** — a uniqueness key. It is
|
|
11943
|
+
**INDEPENDENT of `page_index` and must NOT be read as a page
|
|
11944
|
+
number**: a `pages: '5-7'` PDF fan-out emits
|
|
11945
|
+
`{ filename: "report-converted-0.png", page_index: 5 }` (PDF→PNG is a
|
|
11946
|
+
`convert`, hence `-converted`) — the `-0` is the
|
|
11947
|
+
array position, `5` is the source page. Reconciling them is a bug.
|
|
11948
|
+
- **.ext** — the extension of the **actual produced format**, never
|
|
11949
|
+
the input's and never guessed. Resolved from the worker-reported
|
|
11950
|
+
`output_file_type` (AsyncAPI `OperationResult.output_file_type`,
|
|
11951
|
+
ADR-0022) when present — authoritative for formats the API cannot
|
|
11952
|
+
infer (e.g. `compress.output_format` ∈ `{auto, smallest}`) — else
|
|
11953
|
+
derived from the operation chain. The chain additionally
|
|
11954
|
+
disambiguates a MIME→extension collision even when the MIME is
|
|
11955
|
+
known (`audio/ogg` → `.ogg` for Vorbis vs `.opus` for Opus). When
|
|
11956
|
+
the produced format is
|
|
11957
|
+
genuinely unknown at download time the name is emitted with **no
|
|
11958
|
+
extension** rather than a wrong one. `split` and `audio_to_video`
|
|
11959
|
+
derive to no format, so their extension comes **only** from
|
|
11960
|
+
`output_file_type`.
|
|
11961
|
+
|
|
11962
|
+
Sanitised for JSON (Unicode-safe); the `Content-Disposition` header
|
|
11963
|
+
on the presigned `download_url` is ASCII-sanitised separately, so
|
|
11964
|
+
the two user-visible names may legitimately differ.
|
|
11194
11965
|
example: "photo.jpg"
|
|
11195
11966
|
size_bytes:
|
|
11196
11967
|
type: integer
|
|
@@ -11243,9 +12014,14 @@ components:
|
|
|
11243
12014
|
type: integer
|
|
11244
12015
|
minimum: 1
|
|
11245
12016
|
description: |
|
|
11246
|
-
1-based page number for PDF-page fan-out
|
|
11247
|
-
PDF->image)
|
|
11248
|
-
emits `
|
|
12017
|
+
1-based **literal source page number** for PDF-page fan-out
|
|
12018
|
+
outputs (convert PDF->image) — the actual page from the input PDF.
|
|
12019
|
+
A full conversion emits `1..N`; a sparse `pages` selection (e.g.
|
|
12020
|
+
`'1-5,8'`) emits exactly the selected pages (`1,2,3,4,5,8`), so it
|
|
12021
|
+
is gapless ONLY for a full conversion, not for a sparse selection.
|
|
12022
|
+
NOT the download `filename` suffix (that is a 0-based array
|
|
12023
|
+
position — see `OperationDownload.filename`). Mutually exclusive with `position`.
|
|
12024
|
+
Normative semantics: ADR-0009 §D2.
|
|
11249
12025
|
Absent on non-indexed (single-output) downloads. Mirrors
|
|
11250
12026
|
`OperationResultOutputEntry.page_index`. Per ADR-0009 §D2.
|
|
11251
12027
|
example: 1
|
|
@@ -11681,9 +12457,14 @@ components:
|
|
|
11681
12457
|
type: integer
|
|
11682
12458
|
minimum: 1
|
|
11683
12459
|
description: |
|
|
11684
|
-
1-based page number for PDF-page fan-out
|
|
11685
|
-
PDF->image)
|
|
11686
|
-
emits `
|
|
12460
|
+
1-based **literal source page number** for PDF-page fan-out
|
|
12461
|
+
outputs (convert PDF->image) — the actual page from the input PDF.
|
|
12462
|
+
A full conversion emits `1..N`; a sparse `pages` selection (e.g.
|
|
12463
|
+
`'1-5,8'`) emits exactly the selected pages (`1,2,3,4,5,8`), so it
|
|
12464
|
+
is gapless ONLY for a full conversion, not for a sparse selection.
|
|
12465
|
+
NOT the download `filename` suffix (that is a 0-based array
|
|
12466
|
+
position — see `OperationDownload.filename`). Mutually exclusive with `position`.
|
|
12467
|
+
Normative semantics: ADR-0009 §D2.
|
|
11687
12468
|
Absent on non-indexed outputs. Mirrors
|
|
11688
12469
|
`OperationResultOutputEntry.page_index`. Per ADR-0009 §D2.
|
|
11689
12470
|
example: 1
|
|
@@ -11942,6 +12723,8 @@ components:
|
|
|
11942
12723
|
schema)
|
|
11943
12724
|
- `delivery.selection.type.per_value_availability` (from the
|
|
11944
12725
|
`DeliverySelection.type` schema)
|
|
12726
|
+
- `processing.class_hint.per_value_availability` (from the
|
|
12727
|
+
`ProcessingClassHint` enum — ticket `tK81wZKJ`)
|
|
11945
12728
|
|
|
11946
12729
|
Closes the co0CERtJ (v2.19.0) authority-hierarchy gap: those
|
|
11947
12730
|
`planned` downgrades lived only in the (decorative per ADR-0001
|
|
@@ -11971,6 +12754,14 @@ components:
|
|
|
11971
12754
|
properties:
|
|
11972
12755
|
per_value_availability:
|
|
11973
12756
|
$ref: '#/components/schemas/PerValueAvailability'
|
|
12757
|
+
processing:
|
|
12758
|
+
type: object
|
|
12759
|
+
properties:
|
|
12760
|
+
class_hint:
|
|
12761
|
+
type: object
|
|
12762
|
+
properties:
|
|
12763
|
+
per_value_availability:
|
|
12764
|
+
$ref: '#/components/schemas/PerValueAvailability'
|
|
11974
12765
|
image_encode_capabilities:
|
|
11975
12766
|
description: |
|
|
11976
12767
|
Pre-flight image-encode capability matrix
|
|
@@ -12546,6 +13337,40 @@ components:
|
|
|
12546
13337
|
[I3](https://trello.com/c/eCWIpug8); until then the
|
|
12547
13338
|
contract advertises the field shape but the endpoint
|
|
12548
13339
|
does not yet surface the field.
|
|
13340
|
+
max_input_size_bytes:
|
|
13341
|
+
type: integer
|
|
13342
|
+
format: int64
|
|
13343
|
+
minimum: 1
|
|
13344
|
+
description: |
|
|
13345
|
+
Optional mime-group-level INPUT-file size ceiling in BYTES
|
|
13346
|
+
(ticket [`uKsFzORi`](https://trello.com/c/uKsFzORi)). Sibling of
|
|
13347
|
+
`max_output_pixels`. **Applies to the enclosing operation's input** —
|
|
13348
|
+
currently authored on `compress` image/document groups (the API
|
|
13349
|
+
enforces it on compress input only: AVIF 20 MiB, other images 500 MiB,
|
|
13350
|
+
office/ODF/EPUB 100 MiB). A consumer MUST scope it to the operation
|
|
13351
|
+
whose schema carries it and MUST NOT assume it applies to other
|
|
13352
|
+
operations. An oversize input is rejected at create-time (ADR-0012
|
|
13353
|
+
band-ceiling 422 family).
|
|
13354
|
+
|
|
13355
|
+
**XOR with `processing_class` caps (ADR-0011):** a group carries this
|
|
13356
|
+
group-level cap ONLY when it has NO `processing_class` band. Banded
|
|
13357
|
+
media (e.g. `video`) put input caps in
|
|
13358
|
+
`processing_class.<class>.constraints.max_input_size_bytes` instead —
|
|
13359
|
+
never both, so the input ceiling lives in exactly one place per group.
|
|
13360
|
+
CI-enforced by `scripts/check-per-tier-constraints.py`.
|
|
13361
|
+
max_input_duration:
|
|
13362
|
+
type: string
|
|
13363
|
+
description: |
|
|
13364
|
+
Optional mime-group-level INPUT duration ceiling as an ISO-8601
|
|
13365
|
+
duration string (ticket [`KzrquIX7`](https://trello.com/c/KzrquIX7)) —
|
|
13366
|
+
e.g. `"PT2H"`. Sibling of `max_output_pixels`; same
|
|
13367
|
+
XOR-with-`processing_class` rule as `max_input_size_bytes`
|
|
13368
|
+
(group-level ONLY where no `processing_class` band; banded media use
|
|
13369
|
+
`processing_class.<class>.constraints.max_input_duration`). Currently
|
|
13370
|
+
authored on `audio_to_video.audio` (2h input cap, mirroring the
|
|
13371
|
+
worker's audio-duration limit). Over-cap inputs are rejected at
|
|
13372
|
+
create-time.
|
|
13373
|
+
example: "PT2H"
|
|
12549
13374
|
processing_class:
|
|
12550
13375
|
type: object
|
|
12551
13376
|
description: |
|
|
@@ -12639,6 +13464,31 @@ components:
|
|
|
12639
13464
|
scoped to a single option (e.g. an operation may have a
|
|
12640
13465
|
free-tier base option set with one or two `pro`-tier
|
|
12641
13466
|
advanced options gated this way).
|
|
13467
|
+
per_class_availability:
|
|
13468
|
+
type: object
|
|
13469
|
+
description: |
|
|
13470
|
+
Per-EXECUTION-CLASS overlay for this option: restricts it on named
|
|
13471
|
+
`processing_class` entries of the parent mime_group while leaving
|
|
13472
|
+
the others at the inherited level. Keys MUST be classes the group
|
|
13473
|
+
declares.
|
|
13474
|
+
|
|
13475
|
+
Use this — NOT an operation-wide `availability` — when a worker
|
|
13476
|
+
honours an option on one execution path and refuses it on another.
|
|
13477
|
+
Marking the whole option `planned` would withdraw a working
|
|
13478
|
+
capability from every caller in order to describe one path's gap.
|
|
13479
|
+
|
|
13480
|
+
May only RESTRICT relative to the scope it overlays, never re-open
|
|
13481
|
+
it. See `schemas/FORMAT.md` §`per_class_availability` and
|
|
13482
|
+
§Precedence (machine-enforced by
|
|
13483
|
+
`scripts/check-per-class-availability.py`).
|
|
13484
|
+
|
|
13485
|
+
Note the option-level overlay and the per-VALUE one
|
|
13486
|
+
(`per_value_availability.<value>.per_class_availability`) can
|
|
13487
|
+
coexist: the option-level says the worker refuses the KEY on that
|
|
13488
|
+
path, the value-level says it refuses one VALUE. Most-cautious
|
|
13489
|
+
inheritance applies.
|
|
13490
|
+
additionalProperties:
|
|
13491
|
+
$ref: '#/components/schemas/PerClassAvailabilityEntry'
|
|
12642
13492
|
per_value_availability:
|
|
12643
13493
|
$ref: '#/components/schemas/PerValueAvailability'
|
|
12644
13494
|
description: |
|