import gi,json,os,time gi.require_version('Gtk','3.0') from gi.repository import Gtk,Gdk,GLib out=os.environ.get('JARVIS_CU_PROBE_OUTPUT', '/tmp/jarvis-cu-probe-events.json') state={'clicks':0,'keys':[],'text':'','pointer':[],'scroll':[]} def record(): with open(out,'w') as f: json.dump(state,f) win=Gtk.Window(title=os.environ.get('JARVIS_CU_PROBE_TITLE', 'Jarvis computer-use verification')) win.set_default_size(680,560) box=Gtk.Box(orientation=Gtk.Orientation.VERTICAL,spacing=12) box.set_border_width(20);win.add(box) box.pack_start(Gtk.Label(label='Jarvis verification — disposable test window'),False,False,0) entry=Gtk.Entry();entry.get_accessible().set_name('Verification text');box.pack_start(entry,False,False,0) entry.connect('changed',lambda e:(state.update(text=e.get_text()),record())) button=Gtk.Button(label='Verify click');box.pack_start(button,False,False,0) button.connect('clicked',lambda *_:(state.update(clicks=state['clicks']+1),record())) save=Gtk.Button(label='Save verification text');box.pack_start(save,False,False,0) def save_text(*_): with open(out+'.txt','w') as f: f.write(entry.get_text()) state['saved']=True;record() save.connect('clicked',save_text) area=Gtk.DrawingArea();area.set_size_request(620,220) area.get_accessible().set_name('Verification pointer area') area.add_events(Gdk.EventMask.BUTTON_PRESS_MASK|Gdk.EventMask.BUTTON_RELEASE_MASK|Gdk.EventMask.POINTER_MOTION_MASK|Gdk.EventMask.SCROLL_MASK|Gdk.EventMask.SMOOTH_SCROLL_MASK) def point(w,e): state['pointer'].append({'type':str(e.type),'x':round(e.x),'y':round(e.y),'button':getattr(e,'button',0)});state['pointer']=state['pointer'][-60:];record();return True for sig in ['button-press-event','button-release-event','motion-notify-event']:area.connect(sig,point) def scroll(w,e): state['scroll'].append(str(e.direction));record();return True area.connect('scroll-event',scroll);box.pack_start(area,True,True,0) def key(w,e):state['keys'].append(Gdk.keyval_name(e.keyval));state['keys']=state['keys'][-100:];record();return False win.connect('key-press-event',key) win.connect('destroy',Gtk.main_quit) win.show_all();entry.grab_focus();record() GLib.timeout_add_seconds(1200,lambda:(Gtk.main_quit(),False)[1]) Gtk.main()