@@ -25,6 +25,12 @@ type AgentStepProps = {
2525 build ?: BuildFormData
2626 setAppDataForm : ( data : { build : BuildFormData } ) => void
2727 selectedTemplateName ?: string
28+ selectedTemplateRequirements : {
29+ tee : 'tdx' | 'sgx' | undefined
30+ cpus : number | undefined
31+ memory : number | undefined
32+ storage : number | undefined
33+ }
2834}
2935
3036export const BuildStep : FC < AgentStepProps > = ( {
@@ -33,6 +39,7 @@ export const BuildStep: FC<AgentStepProps> = ({
3339 build,
3440 setAppDataForm,
3541 selectedTemplateName,
42+ selectedTemplateRequirements,
3643} ) => {
3744 const network = useNetwork ( )
3845 const providersQuery = useGetRuntimeRoflmarketProviders ( network , 'sapphire' )
@@ -70,9 +77,40 @@ export const BuildStep: FC<AgentStepProps> = ({
7077 'sapphire' ,
7178 providerValue ,
7279 )
73- const offers = providersOffersQuery . data ?. data . offers . filter (
74- offer => offer . resources . tee === oasisRT . types . RoflmarketTeeType . TDX ,
75- )
80+ const offers = providersOffersQuery . data ?. data . offers
81+ . filter ( offer => {
82+ if (
83+ selectedTemplateRequirements . tee === 'tdx' &&
84+ offer . resources . tee !== oasisRT . types . RoflmarketTeeType . TDX
85+ )
86+ return false
87+ if (
88+ selectedTemplateRequirements . tee === 'sgx' &&
89+ offer . resources . tee !== oasisRT . types . RoflmarketTeeType . SGX
90+ )
91+ return false
92+ if ( selectedTemplateRequirements . cpus && offer . resources . cpus < selectedTemplateRequirements . cpus )
93+ return false
94+ if ( selectedTemplateRequirements . memory && offer . resources . memory < selectedTemplateRequirements . memory )
95+ return false
96+ if (
97+ selectedTemplateRequirements . storage &&
98+ offer . resources . storage < selectedTemplateRequirements . storage
99+ )
100+ return false
101+ return true
102+ } )
103+ . sort ( sortOffersByPaymentTerms )
104+
105+ useEffect ( ( ) => {
106+ form . resetField ( 'resources' ) // Clear offer selection if provider changes
107+ } , [ providerValue , form ] )
108+
109+ useEffect ( ( ) => {
110+ if ( ! form . getValues ( 'resources' ) && offers && offers . length > 0 ) {
111+ form . setValue ( 'resources' , offers [ 0 ] . id ) // Preselect smallest offer
112+ }
113+ } , [ offers , form ] )
76114
77115 // API terms are like 1=hour, 2=month, 3=year, but only hour is mandatory
78116 // Testnet provider provide only hourly terms
@@ -164,7 +202,7 @@ export const BuildStep: FC<AgentStepProps> = ({
164202 render = { ( { field, fieldState } ) => (
165203 < >
166204 < RadioGroup onValueChange = { field . onChange } value = { field . value } className = "space-y-2" >
167- { offers ?. sort ( sortOffersByPaymentTerms ) . map ( offer => (
205+ { offers ?. map ( offer => (
168206 < BuildStepOffers
169207 key = { offer . id }
170208 offer = { offer }
0 commit comments