@@ -62,6 +62,9 @@ const (
6262 agentDashboardAddFieldHTTPRoutes
6363 agentDashboardAddFieldX402PayTo
6464 agentDashboardAddFieldX402Testnet
65+ agentDashboardAddFieldX402Network
66+ agentDashboardAddFieldX402Asset
67+ agentDashboardAddFieldX402Endpoints
6568 agentDashboardAddFieldRelays
6669 agentDashboardAddFieldDiscovery
6770 agentDashboardAddFieldMaxRelays
@@ -100,16 +103,19 @@ type agentDashboardModel struct {
100103 routeDraft []string
101104 draftTunnelID string
102105
103- addingTunnel bool
104- addFocus int
105- addName textinput.Model
106- addTarget textinput.Model
107- addHTTPRoutes textinput.Model
108- addX402PayTo textinput.Model
109- addX402Testnet textinput.Model
110- addRelays textinput.Model
111- addDiscovery textinput.Model
112- addMaxRelays textinput.Model
106+ addingTunnel bool
107+ addFocus int
108+ addName textinput.Model
109+ addTarget textinput.Model
110+ addHTTPRoutes textinput.Model
111+ addX402PayTo textinput.Model
112+ addX402Testnet textinput.Model
113+ addX402Network textinput.Model
114+ addX402Asset textinput.Model
115+ addX402Endpoints textinput.Model
116+ addRelays textinput.Model
117+ addDiscovery textinput.Model
118+ addMaxRelays textinput.Model
113119
114120 settingsEditTunnelID string
115121 settingsFocus int
@@ -179,6 +185,9 @@ func RunDashboard(configPath, stateDir string) error {
179185 addHTTPRoutes : newAgentDashboardInlineInput ("/paid=3001 GET:0.01; /=5173" ),
180186 addX402PayTo : newAgentDashboardInlineInput ("0x..." ),
181187 addX402Testnet : newAgentDashboardInlineInput ("false" ),
188+ addX402Network : newAgentDashboardInlineInput ("casper:casper-test" ),
189+ addX402Asset : newAgentDashboardInlineInput ("hash-..." ),
190+ addX402Endpoints : newAgentDashboardInlineInput ("https://x402-facilitator.cspr.cloud" ),
182191 addRelays : newAgentDashboardInlineInput ("https://portal.example.com" ),
183192 addDiscovery : newAgentDashboardInlineInput ("true" ),
184193 addMaxRelays : newAgentDashboardInlineInput ("3" ),
@@ -748,6 +757,12 @@ func (m *agentDashboardModel) focusedAddTunnelInput() *textinput.Model {
748757 return & m .addX402PayTo
749758 case agentDashboardAddFieldX402Testnet :
750759 return & m .addX402Testnet
760+ case agentDashboardAddFieldX402Network :
761+ return & m .addX402Network
762+ case agentDashboardAddFieldX402Asset :
763+ return & m .addX402Asset
764+ case agentDashboardAddFieldX402Endpoints :
765+ return & m .addX402Endpoints
751766 case agentDashboardAddFieldRelays :
752767 return & m .addRelays
753768 case agentDashboardAddFieldDiscovery :
@@ -766,6 +781,9 @@ func (m *agentDashboardModel) blurAddTunnelInputs() {
766781 & m .addHTTPRoutes ,
767782 & m .addX402PayTo ,
768783 & m .addX402Testnet ,
784+ & m .addX402Network ,
785+ & m .addX402Asset ,
786+ & m .addX402Endpoints ,
769787 & m .addRelays ,
770788 & m .addDiscovery ,
771789 & m .addMaxRelays ,
@@ -781,6 +799,9 @@ func (m *agentDashboardModel) resetAddTunnelForm() {
781799 & m .addHTTPRoutes ,
782800 & m .addX402PayTo ,
783801 & m .addX402Testnet ,
802+ & m .addX402Network ,
803+ & m .addX402Asset ,
804+ & m .addX402Endpoints ,
784805 & m .addRelays ,
785806 } {
786807 input .Reset ()
@@ -903,6 +924,9 @@ func (m *agentDashboardModel) resizeInputs(width int) {
903924 & m .addHTTPRoutes ,
904925 & m .addX402PayTo ,
905926 & m .addX402Testnet ,
927+ & m .addX402Network ,
928+ & m .addX402Asset ,
929+ & m .addX402Endpoints ,
906930 & m .addRelays ,
907931 & m .addDiscovery ,
908932 & m .addMaxRelays ,
@@ -1017,6 +1041,15 @@ func (m agentDashboardModel) addTunnelRequest() (types.AgentTunnelRequest, error
10171041 if x402Testnet && ! hasPaidRoute {
10181042 return types.AgentTunnelRequest {}, fmt .Errorf ("X402 Testnet requires paid routes" )
10191043 }
1044+ x402Network := strings .ToLower (strings .TrimSpace (m .addX402Network .Value ()))
1045+ x402Asset := strings .TrimSpace (m .addX402Asset .Value ())
1046+ x402Endpoints := utils .SplitCSV (m .addX402Endpoints .Value ())
1047+ if x402Network != "" && ! hasPaidRoute {
1048+ return types.AgentTunnelRequest {}, fmt .Errorf ("X402 Network requires paid routes" )
1049+ }
1050+ if strings .HasPrefix (x402Network , "casper:" ) && x402Asset == "" {
1051+ return types.AgentTunnelRequest {}, fmt .Errorf ("casper payments require X402 Asset" )
1052+ }
10201053
10211054 discoveryRaw := strings .TrimSpace (m .addDiscovery .Value ())
10221055 if discoveryRaw == "" {
@@ -1045,6 +1078,9 @@ func (m agentDashboardModel) addTunnelRequest() (types.AgentTunnelRequest, error
10451078 MaxActiveRelays : maxRelays ,
10461079 X402PayTo : payTo ,
10471080 X402Testnet : x402Testnet ,
1081+ X402Network : x402Network ,
1082+ X402Asset : x402Asset ,
1083+ X402Endpoints : x402Endpoints ,
10481084 }, nil
10491085}
10501086
@@ -1492,6 +1528,9 @@ func (m agentDashboardModel) renderAddTunnelForm(pane *agentDashboardView, width
14921528 {label : "Routes" , input : m .addHTTPRoutes , field : agentDashboardAddFieldHTTPRoutes },
14931529 {label : "X402 Pay To" , input : m .addX402PayTo , field : agentDashboardAddFieldX402PayTo },
14941530 {label : "X402 Testnet" , input : m .addX402Testnet , field : agentDashboardAddFieldX402Testnet },
1531+ {label : "X402 Network" , input : m .addX402Network , field : agentDashboardAddFieldX402Network },
1532+ {label : "X402 Asset" , input : m .addX402Asset , field : agentDashboardAddFieldX402Asset },
1533+ {label : "X402 Endpoints" , input : m .addX402Endpoints , field : agentDashboardAddFieldX402Endpoints },
14951534 {label : "Relays" , input : m .addRelays , field : agentDashboardAddFieldRelays },
14961535 {label : "Discovery" , input : m .addDiscovery , field : agentDashboardAddFieldDiscovery },
14971536 {label : "Max Relays" , input : m .addMaxRelays , field : agentDashboardAddFieldMaxRelays },
@@ -1643,7 +1682,10 @@ func (m agentDashboardModel) renderSettingsInputRows(pane *agentDashboardView, w
16431682 if len (pane .lines )- startLine >= height {
16441683 return
16451684 }
1646- pane .addMeta (width , 0 , "Network" , agentDashboardX402Network (tunnel .X402Testnet ))
1685+ pane .addMeta (width , 0 , "Network" , agentDashboardX402Network (tunnel .X402Network , tunnel .X402Testnet ))
1686+ }
1687+ if strings .TrimSpace (tunnel .X402Asset ) != "" && len (pane .lines )- startLine < height {
1688+ pane .addMeta (width , 0 , "Asset" , tunnel .X402Asset )
16471689 }
16481690 if len (tunnel .HTTPRoutes ) == 0 {
16491691 if len (pane .lines )- startLine >= height {
@@ -2054,7 +2096,10 @@ func agentDashboardHTTPRouteSummary(route types.AgentHTTPRoute) string {
20542096 return prefix + " -> " + upstream
20552097}
20562098
2057- func agentDashboardX402Network (testnet bool ) string {
2099+ func agentDashboardX402Network (network string , testnet bool ) string {
2100+ if network = strings .TrimSpace (network ); network != "" {
2101+ return network
2102+ }
20582103 if testnet {
20592104 return "sui:testnet"
20602105 }
0 commit comments