railwayapp 5.66.0

Interact with Railway via CLI
�

Ĝ�jw>��6�dZddlZddlZddlZddlZddlZddlZddlmZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlZdZdZdZdZGd�d	e��Zd
�Zd�Zd�Zd
�Zd�Zd!d�Zd!d�Zd�Zd�Z d!d�Z!d�Z"d�Z#d�Z$d�Z%d�Z&d�Z'e(dkr�	e'ej)e
j*��ej+����Z,e-dej.e,��zd���dS#ee/e0e1f$r0Z2e-de2��e
j3���e
j4d ��YdZ2[2dSdZ2[2wwxYwdS)"a<CLI-owned OpenCode launcher, executed over SSH with a JSON request on stdin.

Runs the image's official OpenCode V2 `opencode` as a password-protected
server. Credentials stay in the VM's private state directory and in the SSH
response. The child has its own session and closed SSH descriptors; no tunnel
is needed.
�N)�Pathii�zvThis cloud agent is on an older image whose OpenCode is not V2. Create a new agent with railway code --opencode --new.z�This agent's saved OpenCode server was started as OpenCode 1, which this CLI no longer supports. Create a new agent with railway code --opencode --new.c��eZdZdS)�
SetupErrorN)�__name__�
__module__�__qualname__���5/tmp/railway-cli/src/commands/cloud_agent/opencode.pyrr!s�������Dr
rc��|�d��}|�d��5}tj|d��t	j||��ddd��n#1swxYwY|�|��dS)Nz.tmp�wi�)�with_suffix�open�os�chmod�json�dump�replace)�path�value�	temporary�streams    r�saver%s���� � ��(�(�I�	����	�	�!��
���E�"�"�"��	�%�� � � �!�!�!�!�!�!�!�!�!�!�!����!�!�!�!����d�����s�+A"�"A&�)A&c��	td|�d�������dd��d���}|ddkrdn|dS#tt
f$rYdSwxYw)N�/proc/z/stat�)�r�Z�)r�	read_text�rsplit�split�OSError�
IndexError)�pid�fieldss  r�
process_startr'-s�����)�s�)�)�)�*�*�4�4�6�6�=�=�c�1�E�E�a�H�N�N�P�P���a�y�C�'�'�t�t�V�B�Z�7���Z� �����t�t����s�A&A)�)A>�=A>c��tj�d��}t|o |�d��o|d|k��S)N�RAILWAY_FACTORY_VM_ID�vm_id)r�environ�get�bool)�state�currents  r�restored_stater07sC���j�n�n�4�5�5�G���L�E�I�I�g�.�.�L�5��>�W�3L�M�M�Mr
c���t|��rdS|�d��}|�d��}t|t��o|dko|duot	|��|kS)NFr%�startr)r0r,�
isinstance�intr')r.r%r2s   r�
owned_processr5<sp���e�����u�
�)�)�E�
�
�C��I�I�g���E��c�3���a�C�!�G�a��T�0A�a�m�TW�FX�FX�\a�Fa�ar
c���tj�d|�d|����}|rbtj|d�d|d����������}|�dd|����	tj�tj�	i�����
|d�	��5}tj|�
d
����}|j|fcddd��S#1swxYwYdS#tjj$r}|jifcYd}~Sd}~wt$t&f$rdifcYSwxYw)Nzhttp://127.0.0.1:�/�username�:�password�
AuthorizationzBasic r)�timeouti)�urllib�request�Request�base64�	b64encode�encode�decode�
add_header�build_opener�ProxyHandlerrr�loads�read�status�error�	HTTPError�coder#�
ValueError)�port�credentialsrr>�token�response�bodyrJs        r�proberSDs����n�$�$�%F��%F�%F��%F�%F�G�G�G��>�� ��:�&�B�B��Z�)@�B�B�I�I�K�K�
�
�
�&�(�(�	�	���?�,<�U�,<�,<�=�=�=��
�^�
(�
(���)D�)D�R�)H�)H�
I�
I�
N�
N�w�`a�
N�
b�
b�	)�fn��:�h�m�m�E�2�2�3�3�D��?�D�(�	)�	)�	)�	)�	)�	)�	)�	)�	)�	)�	)�	)����	)�	)�	)�	)�	)�	)���<�!�����z�2�~������������Z� �����R�x�������sI�AD&�0D�D&�D�D&� D�!D&�&E#�:E�E#�E#�"E#c�T�dD]"}t|||��\}}|dkr||fcS�#||fS)N)zapi/infoz
api/statusz
api/healthi�)rS)rNrOrrIrRs     r�
server_statusrUVsP��9� � ���T�;��5�5�����S�=�=��4�<������4�<�r
c�P�t||��\}}t|�d��t��og|�d��dupPt	|�d����t
uo't|�d��t��}||fS)N�version�healthyTr%�urls)rUr3r,�str�typer4�list)rNrOrIrR�readys     r�healthr^`s��� ��{�3�3�L�F�D��t�x�x�	�*�*�C�0�0�
�������t�#�l��T�X�X�e�_�_�(=�(=��(D�(k��TX�T\�T\�]c�Td�Td�fj�Ik�Ik�
��5�=�r
c��t|��sdS	tj|dtj��n#t
$rYdSwxYwt
j��dz}t|��rQt
j��|kr:t
jd��t|��rt
j��|k�:t|��r�tj|dtj	��t
j��dz}t|��rQt
j��|kr:t
jd��t|��rt
j��|k�:t|��rtd���dSdS)Nr%�g�������?z(The OpenCode server did not stop; retry.)r5r�killpg�signal�SIGTERM�ProcessLookupError�time�	monotonic�sleep�SIGKILLr)r.�deadlines  r�
stop_ownedrjhs�����������
�	�%��,���/�/�/�/��������������~���!�#�H�
��
�
��4�>�#3�#3�h�#>�#>��
�3������
�
��4�>�#3�#3�h�#>�#>��U���I�
�	�%��,���/�/�/��>�#�#�a�'���E�"�"�	�t�~�'7�'7�(�'B�'B��J�s�O�O�O��E�"�"�	�t�~�'7�'7�(�'B�'B�����	I��G�H�H�H�
I�I�
	I�	Is�%9�
A�Ac��tjd|pd��r5ttt|�d������ndS)N�
\d+\.\d+\.\d+��.)�re�	fullmatch�tuple�mapr4r")rWs r�
release_tuplers{sE��24�,�?O�QX�Q^�\^�2_�2_�i�5��S�'�-�-��,�,�-�-�.�.�.�ei�ir
c���|�d|�d�tj�dd��z}tdt	|dz��tjd|���g��D]t}	t|��}n"#ttj
tf$rY�1wxYwt|��}|�
d	��r|�t|��|kr||fcS�utt���)
z�The image's official OpenCode V2 executable.

    `minimum` is the release a saved server last ran: V2 storage is not
    reopened by an older release. The CLI never installs or upgrades OpenCode
    on a VM; an image without V2 is recreated.
    �/.opencode/bin:�/.local/bin:�PATH�/usr/local/bin:/usr/bin:/binNz.opencode/bin/opencode�opencode)rz2.)rr+r,�filterrZ�shutil�which�executable_versionr#�
subprocess�SubprocessErrorrrs�
startswith�	OLD_IMAGE)�home�minimum�search�binaryrW�floors      r�
v2_runtimer�s���
7�
7�T�
7�
7�
7�"�*�.�.��Qo�:p�:p�
p�F����D�+C�$C� D� D�f�l�S]�dj�Fk�Fk�Fk�l�m�m�#�#��	�(��0�0�G�G����3�Z�@�	�	�	��H�	�����g�&�&�����d�#�#�	#���-��:P�:P�TY�:Y�:Y��7�?�"�"�"��
�Y�
�
�s�#A3�3B�Bc��tjt|��dgtjddd���}|j����d��}|jstj	d|��std���|S)Nz	--versionT�
)�stdin�capture_output�textr<z
opencode vrlz3The OpenCode executable has an unsupported version.)r~�runrZ�DEVNULL�stdout�strip�removeprefix�
returncoderorpr)r��resultrWs   rr}r}�s���
�^�S��[�[�+�6�j�>P�+/�d�B�H�H�H�F��m�!�!�#�#�0�0��>�>�G�
��P���-=�w� G� G�P��N�O�O�O��Nr
c��|sdS|�d��}|�|�d��dkS|dvrtd���|dkS)	z�Whether a saved server record is a V2 server this CLI can manage.

    Records written before `protocol` existed named V2 servers opencode2;
    an `opencode` record without a protocol was OpenCode 1.
    T�protocolN�harness�	opencode2)�v1�v2zCThe saved OpenCode protocol is unsupported; update the Railway CLI.r�)r,r)r.r�s  r�saved_v2r��sd�����t��y�y��$�$�H����y�y��#�#�{�2�2��|�#�#��^�_�_�_��t��r
c	�X�|r�|r�||kr�|�d��s�ttt|�d������ttt|�d������krtd|�d|�d����dSdSdSdSdS)Nz0.0.0-beta-rnz#The saved server last ran OpenCode z, newer than this image's zi; its storage is not reopened by an older release. Create a new agent with railway code --opencode --new.)r�rqrrr4r"r)r/�	requesteds  r�reject_downgrader��s����\�9�\��I�!5�!5�g�>P�>P�Q^�>_�>_�!5���S�'�-�-��,�,�-�-�.�.��s�3�	���PS�@T�@T�7U�7U�1V�1V�V�V��[�7�[�[�fo�[�[�[�\�\�
\�\�\�\�\�!5�!5�!5�!5�V�Vr
c��	tj��5}|�tjtjd��|�d|f��ddd��n#1swxYwYdS#t
$rYdSwxYw)Nr�0.0.0.0TF)�socket�
setsockopt�
SOL_SOCKET�SO_REUSEADDR�bindr#)rN�socks  r�port_availabler��s����
�]�_�_�	)���O�O�F�-�v�/B�A�F�F�F��I�I�y�$�'�(�(�(�	)�	)�	)�	)�	)�	)�	)�	)�	)�	)�	)����	)�	)�	)�	)��t�������u�u����s5�A1�AA$�A1�$A(�(A1�+A(�,A1�1
A?�>A?c���tj�d��}|rp|���r|���std���t
|��}d|cxkrdkrnn|tdfvrtd���t|��r|�dt��}ng|r|}nb|r+t|��s|�dt��}n5tj�dt����rtnt}t|��tusd|cxkrdkr	nn|dkrtd	���|S)
N�RAILWAY_CODE_PORTz5RAILWAY_CODE_PORT must be a valid code endpoint port.ii��iV"zJRAILWAY_CODE_PORT must be 1024-65535, excluding the app and gateway ports.rN�RAILWAY_PUBLIC_DOMAIN_z2The saved OpenCode server has an unsupported port.)rr+r,�isascii�	isdecimalrr4�LEGACY_PORTr5r0�	CODE_PORTr[)r.�
configuredrNs   r�server_portr��s|������ 3�4�4�J��k��!�!�#�#�	V�:�+?�+?�+A�+A�	V��T�U�U�U���_�_�
��z�*�*�*�*�U�*�*�*�*�*�j�[�$�<O�.O�.O��i�j�j�j��U���b��y�y���-�-���	�b����	�b�~�e�,�,�b��y�y���-�-����J�N�N�+O�I�+O�+O�P�P�a�y�y�Va���D�z�z����D�D�$9�$9�$9�$9�E�$9�$9�$9�$9�$9�T�T�\�\��M�N�N�N��Kr
c��t|��}|�dd��dvrtd���|�dd��dkrtd���tjd��t|��d	zd
zdz}|dz}|�d��d
kr�|���r&t
j|�����ni}t|��sdSt|��}t|��r|t||��dkrht|��ddkrOd|�d��p7ttd|d�d��������iSdS|�d��dkr#|���std���|�ddd���tj|d��|dz�d��5}	t%j|t$jt$jz��n#t,$rtd���wxYw|���r&t
j|�����ni}|�d��dkr]t/|��|�dd��|�dd��|rt3||��ddicddd��St|��stt4���t|��}|�d��dkr�|�d ��r|�d!��std"���|�d��}|sGt|��r8ttd|d�d��������}|std#���t7|||d �$��}tt|d���d�%����}t|�����std&���tj�d'|����}|s*|t<krtj�d(��}|std)|�d*����|�d!��p tj�d+��pd|�d ��p&tj�d,��p|d d-�}	|sd|	d!<t?d.�|	� ��D����std/���d}
tC|��s"t|��std0|�d1����t|��r)tE||	��d2�d3��nd}|s;|�d3��}tG||��}
tI||
d2��d4}
tC|��sRt|��r0t||	��dkrt|��ddkrd}
ntd0|�d1����|
�s�t|��rtd5���t7tj��}|�%t|��|	d!|	d d6���|�d7|�d8�|�d9d:��z|d9<t7|	dd||tj�d;��|
d2t|
d���<��}t3||��|d=z�d��5}tMj't|
d��d>d?d@dAt|��g||tLj(|tLj)dd�B��}ddd��n#1swxYwY|�%|j*tW|j*��dC���t3||��tYj-��dDz}tYj-��|kr�|�.���tdE|d=z�dF����t||	��dkrMt|��ddkr3tj/|j*t`j1��tdG���netYj2dH��tYj-��|k��tj/|j*t`j1��tdI|d=z�dF����|
rv|�d��satd|d�d���}|���r4t|�����|d<t3||��|
rY|�dJ��sDtj�d;��r%tjd;|dJ<t3||��tE||	��d2�d3��p|�d3��}|�%d|�K��t3||��t7|	dL|��||
|�M��cddd��S#1swxYwYdS)NNr�ry)ryr�zUnsupported OpenCode harness.r�r�zUnsupported OpenCode protocol.�?z.railway�desktopzserver.json�action�inspect)��Tri��	directoryrr%z/cwd�connectzNThis agent has no managed OpenCode server. Set one up with railway code first.Ti�)�parents�exist_ok�modez
setup.lockr
zHAnother OpenCode setup is running on this agent. Retry when it finishes.�stopr2�stoppedr:r8z;This agent has no server for the selected OpenCode edition.zbThe saved server has no project directory. Rerun railway code with --agent and --dir to reconnect.)r�r:)�strictz1OpenCode's working directory must be a directory.r��RAILWAY_PUBLIC_DOMAINz*This agent has no public address for port rn�OPENCODE_SERVER_USERNAME�OPENCODE_SERVER_PASSWORD)r8r:c3�DK�|]}t|t��o|V��dS�N)r3rZ)�.0rs  r�	<genexpr>zsetup.<locals>.<genexpr>s1����V�V��:�e�S�)�)�3�e�V�V�V�V�V�Vr
z3OpenCode requires a nonempty username and password.zPort zH is occupied by another process. Stop it or use --new for a fresh agent.rrWFzTThe managed OpenCode process is running but unhealthy. Run --remove, then reconnect.)�HOMEr�r�rurvrwrxr))r�r�r�rNr*rWr�z
server.log�servez
--hostnamer�z--port)�cwd�envr�r��stderr�	close_fds�start_new_session)r%r2iXz&OpenCode exited during startup. Check z on the agent.z>OpenCode is not enforcing password authentication; stopped it.g�?z'OpenCode did not become healthy. Check r*)r�rWzhttps://)�urlr��reusedrW)3rr,rr�umask�existsrrGr r�r�r5r^rZ�resolve�mkdirrr�fcntl�flock�LOCK_EX�LOCK_NB�BlockingIOErrorrj�popr�	V1_SERVER�dict�is_dirr+r��all�valuesr�rUr�r��updater~�Popenr��STDOUTr%r'rerf�pollrarbrcrg)r>r��root�
state_pathr.rN�lockr��domainrO�runtimer/�previousr��environment�log�childrir�rWs                    r�setupr��s�����:�:�D��{�{�9�j�)�)�1J�J�J��8�9�9�9��{�{�:�t�$�$��,�,��9�:�:�:��H�U�O�O�O���:�:�
�"�Y�.��;�D��
�%�J��{�{�8���	�)�)�7A�6G�6G�6I�6I�Q��
�:�/�/�1�1�2�2�2�r������	��4��5�!�!���%� � �	m��4��'�'�;�6�6��4�L�L��O�s�*�*�����;�!7�!7�!k�3�t�D_�U�SX�\�D_�D_�D_�?`�?`�?h�?h�?j�?j�;k�;k�l�l��t��{�{�8���	�)�)�*�2C�2C�2E�2E�)��i�j�j�j��J�J�t�d��J�7�7�7��H�T�5����
��
�	#�	#�C�	(�	(�no�D�	i��K��e�m�e�m�;�<�<�<�<���	i�	i�	i��g�h�h�h�	i����6@�6G�6G�6I�6I�Q��
�:�/�/�1�1�2�2�2�r���;�;�x� � �F�*�*��u�����I�I�e�T�"�"�"��I�I�g�t�$�$�$��
(��Z��'�'�'��t�$�no�no�no�no�no�no�no�no�����	(��Y�'�'�'��5�!�!���;�;�x� � �I�-�-��9�9�Z�(�(�
`��	�	�*�0E�0E�
`� �!^�_�_�_��	�	�+�.�.�I��
M��u�!5�!5�
M���%@�e�E�l�%@�%@�%@� A� A� I� I� K� K�L�L�	��
G� �"F�G�G�G��7�i�%�
�BS�T�T�T�G���W�[�1�2�2�:�:�$�:�G�G�H�H�	��I���%�%�'�'�	R��P�Q�Q�Q����� ?�� ?� ?�@�@���	=�$�+�-�-��Z�^�^�$;�<�<�F��	S��Q�$�Q�Q�Q�R�R�R��	�	�*�-�-�i�����@Z�1[�1[�i�_i��	�	�*�-�-�r�����@Z�1[�1[�r�_f�gq�_r�
�
���	1�&0�K�
�#��V�V��AS�AS�AU�AU�V�V�V�V�V�	T��R�S�S�S����d�#�#�	u�M�%�,@�,@�	u��s�T�s�s�s�t�t�t�HU�V[�H\�H\�f�-��k�2�2�1�5�9�9�)�D�D�D�bf���	3��y�y��+�+�H� ��x�0�0�G��X�w�q�z�2�2�2����d�#�#�	y��U�#�#�
y��t�[�(A�(A�[�(P�(P�U[�\`�Ua�Ua�bc�Ud�hk�Uk�Uk���� �!w��!w�!w�!w�x�x�x��$	p��U�#�#�
y� �!w�x�x�x��r�z�*�*�K�����D�	�	�,7�
�,C�,7�
�,C� � �
�
�
�
&*�"L�"L�$�"L�"L�"L�{���_e�hF�PG�PG�#G�K�����j�4�S\�cg�!�z�~�~�.E�F�F�PW�XY�PZ�cf�gn�op�gq�cr�cr�t�t�t�E���U�#�#�#���%�+�+�C�0�0�
�C�"�(�����_�_�g�|�Y��RU�VZ�R[�R[�\�!�{�*�:L��z�'8�D�&*�	����
�
�
�
�
�
�
�
�
�
�
����
�
�
�
�
�L�L���]�5�9�5M�5M�N�N�O�O�O���U�#�#�#��~�'�'�#�-�H��.�"�"�X�-�-��:�:�<�<�+�$�%q�d�Ua�Na�%q�%q�%q�r�r�r��$��,�,��;�;��d�|�|�A��#�-�-��	�%�)�V�^�<�<�<�(�)i�j�j�j���
�4� � � ��.�"�"�X�-�-��	�%�)�V�^�4�4�4� �!n�4�R^�K^�!n�!n�!n�o�o�o��	(�%�)�)�K�0�0�	(��2��e��2�2�2�3�3�C��z�z�|�|�
(�%(������%7�%7��k�"��Z��'�'�'��	$�%�)�)�G�,�,�	$�����@W�1X�1X�	$��Z�(?�@�E�'�N���U�#�#�#���k�2�2�1�5�9�9�)�D�D�\��	�	�R[�H\�H\��
���d�G��4�4�4��Z������K�%8��%8�%8�I�V\�fm�n�n�n�]no�no�no�no�no�no�no�no�no�no�no�no����no�no�no�no�no�nosX�k�,I�k�I�B(k�Rk�*A`
�k�
`	�k�`	�J-k�k�k�__main__zRAILWAY_OPENCODE_CONNECTION=T)�flushzOpenCode setup failed: )�filerr�)5�__doc__r@r�rrror{�pathlibrrbr��sqlite3r~�sysre�urllib.errorr=�urllib.requestr�r�r�r��	Exceptionrrr'r0r5rSrUr^rjrsr�r}r�r�r�r�r�r�loadr�r�r��print�dumpsr#rM�KeyErrorrJr��exitr	r
r�<module>r�s������
�
�
���������	�	�	�	�	�	�	�	�
�
�
�
�������
�
�
�
�
�
�
�
���������
�
�
�
��������������	���F�	�F�	�	�	�	�	�	��	�	�	�������N�N�N�
b�b�b����$��������I�I�I�&j�j�j� � � � �&���
�
�
� \�\�\�������0Go�Go�Go�T�z������y�t�y���+�+�Y�T�Y�[�[�9�9��
��,�z�t�z�&�/A�/A�A��N�N�N�N�N�N�����X�6����
��/��/�/�c�j�A�A�A�A����������������������	�s�A
C�	D�&%D�D