/ core / attention / __pycache__ / device_focus.cpython-314.pyc
device_focus.cpython-314.pyc
  1  +
  2  	�hi�:���Rt^RIt^RIt^RIt^RIt^RIHtHt^RIHt^RI	H
  3  t
  4  HtHt^RI
Ht]!RR44t!RR	4t!R
  5  R4t!RR
4t!RR4t]R8Xd�]!R4]!4tRRlt]P1]4]!R4]!R4]!R4]P34'd]P4!R4K]P94]!R4R#R# ]dL%i;i)u�
  6  Device Focus Tracking
  7  
  8  Tracks which application has focus on each device in a multi-device setup.
  9  Uses NSWorkspace on macOS to detect active application changes.
 10  
 11  Combined with eye tracking, this tells us not just WHICH device
 12  the operator is looking at, but WHAT they're doing there.
 13  
 14  Architecture:
 15      Device 1 (MacBook) → focus_tracker → Tailscale → Fusion
 16      Device 2 (Main Mac) → focus_tracker + Tobii → Fusion
 17      Device 3 (iPad) → focus_tracker → Tailscale → Fusion
 18  N)�	dataclass�asdict)�datetime)�Optional�List�Callable)�Pathc�fa�]tRt^toRtRtRtV3RlRlt]V3RlRl4t	V3Rlt
 19  RtVtR#)	�AppFocusz&Current application focus on a device.Nc� <�V^8�dQhRS[/#���return��str)�format�
__classdict__s"��>/Users/rcerf/repos/Sovereign_OS/core/attention/device_focus.py�__annotate__�AppFocus.__annotate__$s�������c��\V4pVPP4VR&RVR&\P!V4#)�	timestamp�	app_focus�type)rr�	isoformat�json�dumps)�self�ds& r�to_json�AppFocus.to_json$s8���4�L�����1�1�3��+����&�	��z�z�!�}�rc�$<�V^8�dQhRS[RR/#)r
�datarr
 20  r)rrs"�rrr+s�����S��Z�rc��\P!V4pVPRR4\P!VR,4VR&V!R/VB#)rNr�)r�loads�popr�
fromisoformat)�clsr#rs&& r�	from_json�AppFocus.from_json*sA���J�J�t���	���f�d��!�/�/��+��?��+���x�Q�x�rc�<�V^8�dQh/S[;R&S[;R&S[;R&S[;R&S[S[,;R&S[S[,;R&#)r
r�device_name�	device_id�app_name�
app_bundle_id�window_title)rrr)rrs"�rrrsY���������	�
 21  �N���M�
��C�=�'���3�-�&�rr%)
�__name__�
 22  __module__�__qualname__�__firstlineno__�__doc__r0r1r �classmethodr*�__annotate_func__�__static_attributes__�__classdictcell__�rs@rr
 23  r
 24  s9����0�
 25  $(�M�"&�L�������#�rr
 26  c�a�]tRt^2toRtRV3RlRlltV3RlRltV3RlRltV3R	lR
 27  ltRt	V3RlR
lt
 28  V3RlRltRtV3RlRlt
RtVtR#)�LocalFocusTrackerzv
 29  Tracks application focus on the local macOS device.
 30  
 31  Uses NSWorkspace to detect when the active application changes.
 32  Nc�,<�V^8�dQhRS[RS[RS[/#)r
r-r.�
poll_interval)r�float)rrs"�rr�LocalFocusTracker.__annotate__9s)���&�&��&��&��	&rc���T;'gVP4VnT;'gVP4VnW0nRVnRVnRVn.Vn\P!4VnR#)FN)�_get_device_namer-�_get_device_idr.r?�_running�_thread�_current_focus�
 33  _callbacks�	threading�Lock�_lock)rr-r.r?s&&&&r�__init__�LocalFocusTracker.__init__9sf��'�A�A�$�*?�*?�*A���"�;�;�d�&9�&9�&;���*����
�37���26���FH����^�^�%��
 34  rc� <�V^8�dQhRS[/#rr)rrs"�rrrAIs���
 35  !�
 36  !�#�
 37  !rc��^RIpVP.RORRR7pVPP4;'gR# R#;i)zGet the device's name.NT��capture_output�textzUnknown Mac)�scutilz--get�ComputerName)�
 38  subprocess�run�stdout�strip)rrU�results&  rrC�"LocalFocusTracker._get_device_nameIsL��	!���^�^�3�#�$�$��F��=�=�&�&�(�9�9�M�9��	!� �s�:A�A�Ac� <�V^8�dQhRS[/#rr)rrs"�rrrAUs���
7�
7��
7rc�&�^RIpVPRR.RRR7pVPPR4F2pRV9gKVPR4^,P	4u#	R	\TP4R
 39  ,2# L#;i)zGet a unique device identifier.N�system_profiler�SPHardwareDataTypeTrP�
 40  z
Hardware UUID�:zmac-i')rUrVrW�splitrX�hashr-)rrUrY�lines&   rrD� LocalFocusTracker._get_device_idUs���
 41  	���^�^�"�$8�9�#�$�$��F��
�
�+�+�D�1��"�d�*��:�:�c�?�1�-�3�3�5�5�2�
 42  �d�4�+�+�,�u�4�5�6�6��	��s�<B�'B�+B�Bc� <�V^8�dQhRS[/#r��bool)rrs"�rrrAds�����t�rc�b�VP'dR#^RIHpVP4VnRTn\P!TPRRR7Tn
 43  TPP4\
RTP24R# \
 44  d\
R4R#i;i)zStart tracking focus changes.T)�NSWorkspacez3[FocusTracker] AppKit not available (not on macOS?)F�FocusTracker��target�daemon�namez[FocusTracker] Started on )
rE�AppKitri�sharedWorkspace�
 45  _workspace�ImportError�printrI�Thread�
 46  _poll_looprF�startr-)rris& rrv�LocalFocusTracker.startds����=�=�=��	�*�)�9�9�;�D�O�
 47  ��
� �'�'��?�?���
 48  ���
 49  	
������
�*�4�+;�+;�*<�=�>����	��G�H��	�s�B�B.�-B.c��RVnVP'd$VPP^R7RVn\R4R#)zStop tracking.F��timeoutNz[FocusTracker] Stopped)rErF�joinrs�rs&r�stop�LocalFocusTracker.stopzs7����
��<�<�<��L�L���a��(��D�L�
�&�'rc�0<�V^8�dQhRS[S[,/#r�rr
 50  )rrs"�rrrA�����'�'�8�H�-�'rc��VP;_uu_4VPuuRRR4# +'giR#;i)zGet current focus.N�rKrGr|s&r�	get_focus�LocalFocusTracker.get_focus�� ��
�Z�Z�Z��&�&��Z�Z�Z���,�=	c�:<�V^8�dQhRS[S[S[.R3,/#�r
�callbackN�rr
 51  )rrs"�rrrA�s#���)�)��(�H�1E�t�1K�(L�)rc�<�VPPV4R#)z$Register callback for focus changes.N�rH�append�rr�s&&r�on_focus_change�!LocalFocusTracker.on_focus_change���������x�(rc�8�VP'd�VP4pV'dlVP;_uu_4VPpVeVPVP8wd#WnVP
 52  FpV!W!4K	RRR4M\P!VP4K�R# \dp\RT24Rp?K]Rp?ii;i +'giL[;i \dp\RT24Rp?L|Rp?ii;i)zPoll for focus changes.Nz[FocusTracker] Callback error: zocusTracker] Poll error: )rE�_get_current_focusrKrGr/rH�	Exceptionrs�time�sleepr?)r�focus�	old_focusr��es&    rru�LocalFocusTracker._poll_loop�s����m�m�m�
9��/�/�1�������$(�$7�$7�	�$�,����)�BT�BT�0T�27�/�,0�O�O��!Q�$,�Y�$>�-<�$���
�J�J�t�)�)�*�%��(1�!Q�$)�,K�A�3�*O�$P�$P��!Q��$����
9��3�A�3�7�8�8��
9�se�C6�C6�AC#�B<�
 53  C#�C6�<C 	�C	�C#�C 	� C#�#C3	�.C6�3C6�6D�D�Dc�0<�V^8�dQhRS[S[,/#rr�)rrs"�rrrA�s�����H�X�$6�rc	�H�VPP4pV'dW\\P!4VP
 54  VPVPRR4VPR4R7#R# \dp\RT24Rp?R#Rp?ii;i)z&Get the currently focused application.�NSApplicationName�Unknown�NSApplicationBundleIdentifier)rr-r.r/r0z$[FocusTracker] Error getting focus: N)
 55  rq�activeApplicationr
 56  r�nowr-r.�getr�rs)r�
 57  active_appr�s&  rr��$LocalFocusTracker._get_current_focus�s���	>����:�:�<�J���&�l�l�n� $� 0� 0�"�n�n�'�^�^�,?��K�",�.�.�1P�"Q�������	>��8���<�=�=���	>�s�!A=�AA=�=B!�B�B!)	rHrGrKrErFrqr.r-r?)NN��?)r2r3r4r5r6rLrCrDrvr}r�r�rur�r9r:r;s@rr=r=2sZ�����&�&� 
 58  !�
 59  !�
7�
7���,(�'�'�
 60  )�)�+�,�rr=c�^a�]tRt^�toRtRV3RlRlltRtRtRtV3RlRlt	R	t
 61  VtR
 62  #)�FocusServerz�
 63  Server that broadcasts focus changes over the network.
 64  
 65  Run this on each device to share focus state with the main
 66  attention tracking system.
 67  c�&<�V^8�dQhRS[RS[/#)r
�tracker�port)r=�int)rrs"�rr�FocusServer.__annotate__�s���
 68  ?�
 69  ?�"�
 70  ?��
 71  ?rc�V�WnW nRVn.VnRVnRVnR#�NF)r�r��_socket�_clientsrE�_accept_thread)rr�r�s&&&rrL�FocusServer.__init__�s+��
 72  ���	�04���-/��
���
�:>��rc��\P!\P\P4VnVPP	\P
 73  \P^4VPPRVP34VPP^4VPPR4RVn\P!VPRRR7VnVPP!4VP"P%VP&4\)RVP24R#)zStart the focus server.z0.0.0.0FT�FocusServerAcceptrkz [FocusServer] Listening on port N)�socket�AF_INET�SOCK_STREAMr��
 74  setsockopt�
 75  SOL_SOCKET�SO_REUSEADDR�bindr��listen�setblockingrErIrt�_accept_loopr�rvr�r��_broadcast_focusrsr|s&rrv�FocusServer.start�s����}�}�V�^�^�V�5G�5G�H��������� 1� 1�6�3F�3F��J������9�d�i�i�0�1������A����� � ��'���
�'�.�.��$�$��$�
 76  ���
 77  	
���!�!�#�	
���$�$�T�%:�%:�;�
�0�����<�=rc�,�RVnVPFpVP4K	VPP4VP'd#VPP4RTn\R4R# Kx;i L ;i)zStop the server.FNz[FocusServer] Stopped)rEr��close�clearr�rs�r�clients& rr}�FocusServer.stop�sz����
��m�m�F�
�����$�
 78  	
�
�
�����<�<�<�
����"�"�$� �D�L�
�%�&��
���
��s�B�B�B�Bc�~�VP'dIVPP4wrVPP	V4\RV24KZR# \d\P!R4K�\d2pTP'd\RT24Rp?K�Rp?K�Rp?ii;i)zAccept incoming connections.z$[FocusServer] Client connected from g�������?z[FocusServer] Accept error: N)
 79  rEr��acceptr�r�rs�BlockingIOErrorr�r�r�)rr��addrr�s&   rr��FocusServer._accept_loop�s����m�m�m�
>�#�|�|�2�2�4����
�
�$�$�V�,��<�T�F�C�D�	��
 80  #�
 ��
 81 82  �3���
>��=�=�=��8���<�=�=�!��
>�s$�AA�!B<�B<�
 83  B<� B7�7B<c�6<�V^8�dQhRS[S[,RS[/#)r
r��	new_focusr�)rrs"�rrr��s �����(�8�*<���rc�L�VP4R,p.pVPF$pVPVPR44K&	VF/pVPPV4VP
4K1	R# TP	T4Ku;i KS;i)z0Broadcast focus change to all connected clients.r_�utf-8N)r r��sendall�encoder��remover�)rr�r��message�dead_clientsr�s&&&   rr��FocusServer._broadcast_focus�s����#�#�%��,�����m�m�F�
,����w�~�~�g�6�7�$�#�F��M�M� � ��(�
�����#��
,��#�#�F�+��
��s� B�/B�B�B#)r�r�rEr�r�r�N��&)r2r3r4r5r6rLrvr}r�r�r9r:r;s@rr�r��s-�����
 84  ?�
 85  ?�>�*'�(>��rr�c�a�]tRtRtoRtRV3RlRlltV3RlRltRtV3R	lR
 86  ltV3RlRlt	R
t
 87  V3RlRltRtVt
R#)�FocusClientiz�
 88  Client that receives focus updates from remote devices.
 89  
 90  Run this on the main attention tracking machine to receive
 91  focus state from MacBook, iPad, etc.
 92  Nc�,<�V^8�dQhRS[RS[RS[/#)r
�hostr�r-)rr�)rrs"�rr�FocusClient.__annotate__s)���&�&��&��&��	&rc��WnW nT;'gTVnRVnRVnRVn.VnRVn\P!4Vn
 93  R#r�)r�r�r-r�rErFrHrGrIrJrK)rr�r�r-s&&&&rrL�FocusClient.__init__sP���	��	�&�.�.�$���04�����
�37���<>���26����^�^�%��
 94  rc� <�V^8�dQhRS[/#rrf)rrs"�rrr�'s������rc	��\P!\P\P4VnVPP	VP
 95  VP34VPPR4RVn\P!VPRRVP2R7Vn
VPP4\RVPRVP
 96  RVP24R# \ d4p\RTP
 97  RTPR	T24R
 98  p?R#R
 99  p?ii;i)zConnect to remote focus server.FTzFocusClient-rkzocusClient] Connected to z at r`z#[FocusClient] Failed to connect to z: N)r�r�r�r��connectr�r�r�rErIrt�
_receive_loopr-rFrvrsr�)rr�s& rr��FocusClient.connect's��	�!�=�=�����9K�9K�L�D�L��L�L� � �$�)�)�T�Y�Y�!7�8��L�L�$�$�U�+� �D�M�$�+�+��)�)��#�D�$4�$4�#5�6��D�L�
100  
�L�L��� ��/��0@�0@�/A��d�i�i�[�PQ�RV�R[�R[�Q\�]�^����	��7��	�	�{�!�D�I�I�;�b�QR�PS�T�U���	�s�DD�E�(E	�	Ec���RVnVP'd#VPP4RTnVP'd&VPP	^R7RVnR#R# LD;i)zDisconnect from server.FNry)rEr�r�rFr{r|s&r�
101  disconnect�FocusClient.disconnect=sd����
��<�<�<�
����"�"�$� �D�L��<�<�<��L�L���a��(��D�L���	
��s�A5�5A9c�0<�V^8�dQhRS[S[,/#rr�)rrs"�rrr�Lr�rc��VP;_uu_4VPuuRRR4# +'giR#;i)z"Get latest focus from this device.Nr�r|s&rr��FocusClient.get_focusLr�r�c�6<�V^8�dQhRS[S[.R3,/#r�r�)rrs"�rrr�Qs ���)�)��(��T�1A�(B�)rc�<�VPPV4R#)z$Register callback for focus updates.Nr�r�s&&r�on_focus_update�FocusClient.on_focus_updateQr�rc��RpVP'd�VPPR4PR4pV'g\P
102  !R4K]W,
pRV9d@VP
R^4wr1VP4'gK3VPV4KFK�R# \d\P
103  !R4K�\d,pTP'd\RT24Rp?R#Rp?ii;i)zReceive focus updates.�ir�g{�G�z�?r_z[FocusClient] Receive error: N)rEr��recv�decoder�r�rarX�_process_messager�r�rs)r�bufferr#rcr�s&    rr��FocusClient._receive_loopUs������m�m�m�
��|�|�(�(��.�5�5�g�>����J�J�t�$������f�n�#)�<�<��a�#8�L�D��z�z�|�|��-�-�d�3�%���#�
!��
104105  �4� ��
��=�=�=��9�!��=�>���
�s5�1B2�B2� 6B2�B2�2!D�D�D�  D�Dc� <�V^8�dQhRS[/#)r
r�r)rrs"�rrr�ns���7�7��7rc�r�\PV4pVP;_uu_4W nRRR4VPFpV!V4K	R# +'giL.;i \
106  dp\
RT24Rp?KDRp?ii;i \
107  dp\
RT24Rp?R#Rp?ii;i)zProcess a focus update message.Nz[FocusClient] Callback error: z[FocusClient] Message error: )r
108  r*rKrGrHr�rs)rr�r�r�r�s&&   rr��FocusClient._process_messagens���
	7��&�&�w�/�E�����&+�#��!�O�O��@��U�O�,����!�@��:�1�#�>�?�?��@���	7��1�!��5�6�6��	7�sW�)B�A�B�
109  A+�B�A(	�#B�+B�6B
110  �B�
111  B�B�B6�B1�1B6)	rHrGrKrEr�rFr-r�r�)r�N)r2r3r4r5r6rLr�r�r�r�r�r�r9r:r;s@rr�r�sF�����&�&� ��,
 �'�'�
112  )�)��27�7rr�c�a�]tRtRtoRtRtRV3RlRlltRV3RlRlltR	tR
113  t	V3RlRlt
114  V3R
lRltV3RlRltRt
VtR#)�MultiDeviceFocusTrackeri�z�
115  Aggregates focus state across multiple devices.
116  
117  Combines local focus tracking with remote device clients
118  to provide a unified view of attention across all devices.
119  c�0�RVn/Vn.VnR#�N)�
local_tracker�remote_clientsrHr|s&rrL� MultiDeviceFocusTracker.__init__�s��:>���68���AC��rNc�&<�V^8�dQhRS[RS[/#)r
r-r)rr=)rrs"�rr�$MultiDeviceFocusTracker.__annotate__�s���"�"�S�"�4E�"rc�|a�\VR7SnSPPV3Rl4SP#)zAdd local device tracking.)r-c�(<�SPRV4#)�local��_notify)�old�newrs&&�r�<lambda>�3MultiDeviceFocusTracker.add_local.<locals>.<lambda>�s���T�\�\�'�3�7r)r=r�r�)rr-sf&r�	add_local�!MultiDeviceFocusTracker.add_local�s5���.�;�G������*�*�7�	
120  ��!�!�!rc�2<�V^8�dQhRS[RS[RS[RS[/#)r
r�r-r�r)rr�r�)rrs"�rrr�s)�����s����C��;�rc�laa�\WS4pVSPS&VPVV3Rl4V#)zAdd remote device tracking.c�(<�SPSV4#r�r)r�r-rs&��rr	�4MultiDeviceFocusTracker.add_remote.<locals>.<lambda>�s���$�,�,�{�E�:r)r�r�r�)rr�r-r�r�sf&f& r�
121  add_remote�"MultiDeviceFocusTracker.add_remote�s7����T��5��+1����K�(����:�	
122  ��
rc���VP'dVPP4VPP4F+wrVP	4'dK\RV24K-	R#)zStart all trackers.z#[MultiDevice] Could not connect to N)r�rvr��itemsr�rs)rrnr�s&  rrv�MultiDeviceFocusTracker.start�sX���������$�$�&� �/�/�5�5�7�L�D��>�>�#�#��;�D�6�B�C�8rc���VP'dVPP4VPP4FpVP	4K	R#)zStop all trackers.N)r�r}r��valuesr�r�s& rr}�MultiDeviceFocusTracker.stop�sE���������#�#�%��)�)�0�0�2�F�����3rc�:<�V^8�dQhRS[S[S[.R3,/#r�)rrr
123  )rrs"�rrr�s"���)�)�H�c�8�_�d�5J�,K�)rc�<�VPPV4R#)z2Register callback for focus changes on any device.Nr�r�s&&r�on_any_focus_change�+MultiDeviceFocusTracker.on_any_focus_change�r�rc�&<�V^8�dQhRS[RS[/#)r
�devicer�)rr
124  )rrs"�rrr�s���<�<�c�<�(�<rc��VPFpV!W4K	R# \dp\RT24Rp?K1Rp?ii;i)z!Notify callbacks of focus change.z[MultiDevice] Callback error: N)rHr�rs)rrr�r�r�s&&&  rr�MultiDeviceFocusTracker._notify�sB�����H�
<���'�(���
<��6�q�c�:�;�;��
<�s��A�>�Ac�F<�V^8�dQhRS[S[S[S[,3,/#r)�dictrrr
125  )rrs"�rrr�s#���
126  �
127  �t�C��(�);�$;�<�
128  rc���/pVP'dVPP4VR&VPP4Fwr#VP4W&K	V#)z Get focus state for all devices.r)r�r�r�r)rrYrnr�s&   r�
get_all_focus�%MultiDeviceFocusTracker.get_all_focus�s]��������"�0�0�:�:�<�F�7�O� �/�/�5�5�7�L�D�!�+�+�-�F�L�8��
r)rHr�r�r�r�)r2r3r4r5r6rLrrrvr}rrr$r9r:r;s@rr�r��sM�����D�
129  "�"���D� �)�)�<�<�
130  �
131  rr��__main__z=== Device Focus Tracker ===
132  c�F�V^8�dQhR\\,R\/#)r
rrr�)rs"rrr�s��7�7�x��)�7��7rc�h�V'd
VPMRp\RVRVP24R#)�NonezFocus: u → N)r/rs)rr�old_names&& r�	on_changer+�s(��#&�3�<�<�F��
���z��s�|�|�n�5�6rz Starting local focus tracking...z(Switch between apps to see focus changeszPress Ctrl+C to stop
133  r�z
134  Done.)r6rr�rIr��dataclassesrrr�typingrrr�pathlibrr
135  r=r�r�r�r2rsr�r+r�rvr��KeyboardInterruptr}r%rr�<module>r0s��
��
���)��+�+�������.}�}�@Z�Z�zn7�n7�bE�E�P�z��	�
136  *�+� �!�G�7����I�&�	�
137  ,�-�	�
138  4�5�	�
139  "�#��}�}���	���
140141  �3���L�L�N�	�)��1��(!�	��	�s�C5�5C?�>C?