
    ;Rj&                     r   d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
  e
ej                        dz  dz  dz  Zej                         r! eed      r ej                   ee              ej"                  de	        e
d
      Z e
d      Zedz  Zedz  ZdZ ej0                  dd      Zi ddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@ZdAZdB ZdC ZdD ZdPdEZdF Z dG Z!dH Z"dI Z#dQdJZ$dRdKZ%dL Z&dM Z'dN Z(e)dOk(  r e(        yy)Sz
MichelBridge: keyboard-first local MCSJ bridge.
Run INSIDE the interactive Windows desktop session (directly, or via run-operator-interactive.ps1).
Returns compact JSON; screenshots are proof/debug, not the main reasoning loop.
    N)PathLibzsite-packagespywin32_system32add_dll_directoryignore)categoryzC:\MCSJAgent\MichelBridgezC:\MCSJAgent\proof\MichelBridgetabmapscropsz,C:\Program Files\Tesseract-OCR\tesseract.exeuser32T)use_last_errorTAB	   ENTER   RETURNESC   ESCAPESPACE    LEFT%   UP&   RIGHT'   DOWN(   DELETE.   	BACKSPACE   F1p   F2q   F3r   F4s   F5t   u   v   w   x   y   z   {            A   C   V   X   )F6F7F8F9F10F11F12CTRLALTSHIFTACVX   c                 F    t        t        j                  | dd             y )NF),:)ensure_ascii
separators)printjsondumps)objs    *C:\MCSJAgent\MichelBridge\michel_bridge.pyjdumprT   $   s    	$**Su
DE    c                 4    t         j                  | ddd       y Nr   )r   keybd_eventvks    rS   key_downr[   (   s    &$$RAq1rU   c                 <    t         j                  | dt        d       y rW   )r   rX   KEYEVENTF_KEYUPrY   s    rS   key_upr^   )   s    ""2q/1=rU   c                     | j                         }|t        vrt        d|        t        t        |          t	        j
                  |       t        t        |          y )Nzunknown key: )upperVK
SystemExitr[   timesleepr^   )keydelayks      rS   taprh   +   sE    	iikA{*}SE%:;;RUOTZZ&r!urU   c                    | D cg c]  }t         |j                             }}|D ]"  }t        |       t        j                  d       $ t        |      D ]"  }t        |       t        j                  d       $ y c c}w )Ng{Gz?)ra   r`   r[   rc   rd   reversedr^   )keysrg   kss      rS   comborm   0   sY    #$t!1779tB$!djj.Rb\6!9djj&6\ %s   A=c                     	 dd l }|j                  |        y # t        $ r$ t        j                  dddd| z   dz   gd       Y y w xY w)	Nr   
powershell
-NoProfilez-CommandzSet-Clipboard -Value @'
z
'@T)check)	pyperclipcopy	Exception
subprocessrun)textrr   s     rS   set_clipboardrx   5   sM    st s\*=XY]=]^d=demqrss    *AAc                  F   dd l dd l} d fd}j                  |d        sdddS 	 j                  d       t        j                         t        j                  d       d	j                        d
S # t        $ r}dt        |      dcY d }~S d }~ww xY w)Nr   c                 |    j                  |       sy j                  |       xs d}|j                  d      r| y y )N zMCSJ - 2026.1)IsWindowVisibleGetWindowText
startswith)hwnd_titletargetwin32guis      rS   enumzactivate_mcsj.<locals>.enum@   sC    ''-v$$T*0bO,F -rU   FzMCSJ window not found)	activatederrorr   皙?)r   r   r   T)r   r   r   )r   win32processEnumWindows
ShowWindowr   SetForegroundWindowrc   rd   rt   strr}   )r   r   er   r   s      @@rS   activate_mcsjr   =   s    !F t$u5LMM@FA&""6*

3 F83I3I&3QRR  @!A??@s   <A> >	B BB B c                     dd l } dd ldd lt        j	                         }|rj                  |      nd}g fd}j                  |d        g }| j                  g d      D ]M  }	 |j                  j                  d      xs dj                         dv r|j                  |j                         O t        j                  d      ||d|d	S # t        $ r Y xw xY w)
Nr   r{   c                     j                  |       rVj                  |       xs d}d|v r<j                  |       \  }}j                  |       }j	                  | |||d       y y y )Nr{   MCSJ)r   pidr   rect)r|   r}   GetWindowThreadProcessIdGetWindowRectappend)r   r   r   r   r   hwndsr   r   s        rS   r   zwindow_state.<locals>.enumV   sp    ##D)((.4"E#<<TB3++D1TENO  *rU   )r   nameusernamer   )zmcsj.exezjava.exez	javaw.exez%Y-%m-%dT%H:%M:%S%z)r   r   )rc   
foregroundmcsj_windowsmcsj_processes)psutilr   r   r   GetForegroundWindowr}   r   process_iterinfogetlowerr   rt   rc   strftime)	r   fgfg_titler   procspr   r   r   s	         @@@rS   window_stater   Q   s    ))!!#B+-X##B'2H
EP t$
E  !:;	

6"(b//15XXQVV$ <
 ==!67RX`Eaqv  IN  O  O $s   -A
C	C"!C"c                    ddl }ddlm} t        j	                  dd       | (t        t        t        j                  d      dz   z        } 	 |j                         5 }|j                  d   }|j                  |      }|j                  d	|j                  |j                        }|j                  |        | |j                  |j                  d
dcddd       S # 1 sw Y   yxY w# t         $ r}t#        j$                  ddddddd| gddd      }|j&                  dk7  r)t)        d| d|j*                  j-                                t/        d t1        |j2                  j5                               D        d      }	t7        j8                  |	      }
|
j;                  d      rt=        |
j;                  dd            dk  rt)        d|
       |
d   |
d   |
d   |
d   |
d   |
d    d!t        |      d"cY d}~S d}~ww xY w)#a*  Capture proof, preferring the desktop but falling back to MCSJ PrintWindow.

    BitBlt/mss fails when the interactive desktop surface is disconnected. PrintWindow
    renders the live MCSJ HWND without depending on that surface and is the approved
    occlusion-safe proof route on this host.
    r   N)ImageTparentsexist_okzscreen-%Y%m%d-%H%M%S.png   RGBzmss-desktop)pathwidthheightsourcezpowershell.exerp   z-ExecutionPolicyBypassz-Filez!C:/MCSJAgent/printwindow-shot.ps1z-Path   )capture_outputrw   timeoutzdesktop capture failed: z; PrintWindow failed: c              3   |   K   | ]4  }|j                         j                  d       s#|j                          6 yw){N)stripr~   ).0xs     rS   	<genexpr>zscreenshot.<locals>.<genexpr>   s-     h(J1aggiNbNbcfNgQWWY(Js   $<<r{   okbytesz$PrintWindow returned invalid proof: r   r   r   r   r   z win32-printwindow-occlusion-safe)r   r   r   r   r   r   r   desktop_error)mssPILr   PROOFmkdirr   rc   r   monitorsgrab	frombytessizergbsaver   r   rt   ru   rv   
returncodeRuntimeErrorstderrr   nextrj   stdout
splitlinesrP   loadsr   int)r   r   r   sctmonimgimr   proclineresults              rS   
screenshotr   f   s    	KKtK,|$--(>?FGH`WWY#QCCuchh8BGGDM"))][ YY  `~~\*<Xg/
 T27 ??a!9-H^_c_j_j_p_p_r^stuuh1G1G1I(JhjlmD!zz$3vzz'1'=#>!#C!EfXNOOf~fWovhGWwwvf~;CP]L^` 	``s>   C& A3C	C& C#C& #C& &
G?0DG:4G?:G?c                 P   ddl m}m}m} dd l}	t
        j                  j                  t              rt        |	j                  _	        t               }
|j                  |
d         }|j                  | || |z   ||z   f      }|j                  |      j                  |j                        }|=t!        t"        d|  d| d| d| dt%        t'        j&                                dz        }|j)                  |       |	j+                  |d|       j-                         }|| |||g|d	S )
Nr   )r   ImageOpsImageFilterr   zcrop--r   z--psm )config)cropr   rw   )r   r   r   r   pytesseractosr   exists	TESSERACTtesseract_cmdr   openr   	grayscalefilterSHARPENr   r   r   rc   r   image_to_stringr   )r   ywhr   psmr   r   r   r   shotr   r   grayrw   s                  rS   crop_ocrr      s   00	ww~~i 	+"9"9"G	Dzz$v,B	!Aac!A#	D			D	!	(	()<)<	=D|51QCq1QCqTYY[1A0B$GGHIIdO		$	$TF3%.	$	A	G	G	ID!Aay55rU   c                     t        ddddd      } t        ddddd      }| d   d	z   |d   z   j                         }d
}d}g }d|v r|j                  d       d|v rd}d}|j                  d       d|v sd|v rd}t        |d      }|j                  d       d|v rd|v r|j                  d       |||| d   d d |d   d d dS )Nr   i@  Z      r   i  il  rw   
unknowng      ?mcsjz	mcsj-textzpurchase orderzPurchase Order / PO visibleg?zpurchase-orderzstatement of revenuezrevenue and expendituresz-Statement of Revenue and Expenditures visibleg=
ףp=?zstatement-gridbillingcollectionsztop-menui  )screen
confidencesignalstop_text	left_text)r   r   r   max)topleftrw   r   r   r   s         rS   fingerprintr     sB   1T"#C	!Bs31	%D
f+d
4<
'	.	.	0DFjrw~w~~k24(ERVzX_XfXfgwXx%)Ct)K  UDV  QT  U_  `d  Qe  FP  gn  gu  gu  vF  gGD]d2GNN:4NgQTU[Q\]a^aQbostzo{  }A  ~A  pB  C  CrU   c                 d    t         |  dz  }t        j                  |j                  d            S )Nz.jsonzutf-8)encoding)
TABMAP_DIRrP   r   	read_text)r   r   s     rS   load_tabmapr	     s,    dV5>!A::akk7k344rU   c            	         t        j                         } | j                  dd      }|j                  d       |j                  d       |j                  d      }|j	                  d       |j	                  dt
        d	
       |j                  d      }|j	                  dd       |j                  d      }|j	                  dt
        dd	       |j	                  dd       |j                  d      }|j	                  dd       |j                  d      }|j	                  dt
               |j	                  dt
               |j	                  dt        d
       |j                  d      }|j	                  dd       |j                  d       }|j	                  dt
               |j	                  dt
               |j	                  d!t
               |j	                  d"t
               |j	                  d#t
        d$
       |j                  d%       |j                  d&      }|j	                  d'       | j                         }t        j                  dd(       t        j                  dd(       |j                  dk(  rt        t                      y |j                  dk(  rt        t                      y |j                  dk(  r]t               }t        |j                         D ]  }t#        |j$                          t        ||j$                  |j                   d)       y |j                  dk(  r8t               }t'        |j(                         t        ||j(                  d*       y |j                  dk(  rt               }t        |j                         D ]<  }|j*                  rt'        d+d,g       nt#        d,       t-        j.                  d-       > t        ||j*                  rd.nd,|j                   d/       y |j                  dk(  rUd0j1                  |j2                        }t               }t5        |       t'        d1d2g       t        |t7        |      d3       y |j                  dk(  rt               }d4d l}d5|_        |j=                  |j>                  |j@                         t-        j.                  |jB                         t        ||j>                  |j@                  gd6       y |j                  dk(  rt        tE        |jF                               y |j                  d k(  rLt        tI        |j>                  |j@                  |jJ                  |jL                  |jN                  7             y |j                  d%k(  rt        tQ                      y |j                  d&k(  rt        tS        |jT                               y y )8NcmdT)destrequiredstateactivatepressre   z--countr   )typedefaultrm   rk   +)nargstabcount?)r  r  r  z--shift
store_true)actionpasterw   clickr   )r  r   z--waitr   r   r   zocr-cropr   r   z--psm   r  tabmapr   r   )r   pressedr  )r   rm   rD   r   gQ?z	SHIFT+TAB)r   re   r   rB   rG   )r   pasted_charsr   F)r   clickedr   )+argparseArgumentParseradd_subparsers
add_parseradd_argumentr   float
parse_argsROOTr   r   r  rT   r   r   ranger  rh   re   rm   rk   shiftrc   rd   joinrw   rx   len	pyautoguiFAILSAFEr  r   r   waitr   r   r   r   r   r   r  r	  r   )apsubr   argsar   rw   r.  s           rS   mainr5     sz    B
ut4CNN7NN:	nnWAq~~e4annYTW`an6b	nnWAq~~fC~@	nnUAQ^^G#SRS^TVWVdVden  xDVd  WE	nnWAq~~fC~@	nnWAq~~c~<annSWZn>[]^]k]klt  |A  KN]k  ^O	nn\"AANN6N$E	nnZ A!..#.">sX[@\^_^l^lmpvy^l^z|}  }K  }K  LO  UX  }K  }Y  [\  [i  [i  jq  wz  CD  [i  [ENN=!	nnXAv 6	DJJtdJ+U[[PT[-Uxx%/	:	u]_5	7	
/tzz"ACM"1txx

CD	7	
/5+U$))3T-U	5
/tzz"Azz5'%1e*JJu # 	1$**;%PTPZPZ[\	7	xx		"
/=.vcl0CUXYilmqirKsEt	7	
/"	'

4991tvv78	<	z$))'<!=	:	uXdffTVVDFF466dhh%WX	=	 %"6	8	U;tyy#9:	rU   __main__)g
ףp=
?)N)Nr  )*__doc__r"  ctypesrP   r   ru   sysrc   warningspathlibr   prefix_pywin32_dll_dirr   hasattrr   r   filterwarningsDeprecationWarningr)  r   r  CROP_DIRr   WinDLLr   ra   r]   rT   r[   r^   rh   rm   rx   r   r   r   r   r  r	  r5  __name__ rU   rS   <module>rE     s  
 C B B B 
 

#e+o=@RR -@!AB-./   += >()/0I
'>;		x	5	$t$T*/5=dCJ4
4T!$'-d3;DALT 	 4 T #'t -1 <@Tt	Dt$d4DTdt F 2 =6
7
sS(O* `D6
C5
,;\ ZrU   