+
    i                       a  RK tP0 t R t^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RIHtHt ^ RIHt ^ RIHtHtHtHtHt ]! ]4      P,                  t]P,                  t]R,          t]R,          t]R,          t]! ]]! ]4      R7      t. t] ^ k ]	P@                  ! 4       t!]PD                  ! 4       t#] ^k ]PH                  ! 4       t%] ^k ]PH                  ! 4       t&] ^k R	 t'R
 t(R R lt)]PU                  R4      R 4       t+]PU                  R4      R 4       t,]PU                  R4      R 4       t-]PU                  R4      R 4       t.]PU                  RR.R7      R 4       t/]PU                  RR.R7      R 4       t0]PU                  RR.R7      R 4       t1]PU                  RR.R7      R 4       t2]PU                  R 4      R! 4       t3]PU                  R"4      R# 4       t4]PU                  R$4      R% 4       t5]PU                  R&4      R' 4       t6]PU                  R(R.R7      R) 4       t7]PU                  R*R.R7      R+ 4       t8]PU                  R,R.R7      R- 4       t9]PU                  R.4      R/ 4       t:]PU                  R04      R1 4       t;R2 R3 lt<R4 R5 lt=]PU                  R64      R7 4       t>]PU                  R84      R9 4       t?RLR: lt@R; R< ltAR= R> ltBR? R@ ltC]D! ]P                  P                  RARB4      4      tG]D! ]P                  P                  RCRD4      4      tH^ sI]	P@                  ! 4       tJRE tKRF tLRG tMRH tNRI tO]RJ8X  d
   ]O! 4        R# R# )Ma  pip-witness real-time viewer and scan orchestrator.

Serves a web UI that shows live scan progress, attestation results, and
allows subscribing to packages for automatic re-scanning on new releases.

Architecture:
- Flask app serving REST API + SSE (Server-Sent Events) for live updates
- SQLite database for scan results, subscriptions, and queue state
- Background scanner thread pulling from prioritized queue
- Watchdog on attestations/ directory for immediate result display
N)datetimetimezone)Path)FlaskResponsejsonifyrequestsend_from_directoryattestationszpip_witness.dbstatic)static_folderc                  v    \         P                  ! \        \        4      4      p \         P                  V n        V # N)sqlite3connectstrDB_PATHRowrow_factorydbs    7/Users/nkennedy/proj/node-post-install/viewer/server.pyget_dbr   2   s$    	W	&B[[BNI    c                  |    \        4       p V P                  R 4       V P                  4        V P                  4        R# )a  
        -- Scans: the immutable attestation record (one per Docker run)
        CREATE TABLE IF NOT EXISTS scans (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            package TEXT NOT NULL,
            version TEXT,
            status TEXT NOT NULL DEFAULT 'queued',
            started_at TEXT,
            completed_at TEXT,
            attestation_path TEXT,
            pre_analysis_path TEXT,
            network_connections INTEGER DEFAULT 0,
            files_opened INTEGER DEFAULT 0,
            processes_spawned INTEGER DEFAULT 0,
            dns_lookups INTEGER DEFAULT 0,
            sockets_created INTEGER DEFAULT 0,
            packages_installed INTEGER DEFAULT 0,
            error TEXT,
            created_at TEXT DEFAULT (datetime('now'))
        );

        -- Evaluations: policy results against an attestation (many per scan)
        -- Re-running policies creates a new evaluation row, old ones are kept
        CREATE TABLE IF NOT EXISTS evaluations (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            scan_id INTEGER NOT NULL REFERENCES scans(id),
            risk_score INTEGER DEFAULT 0,
            risk_level TEXT DEFAULT 'UNKNOWN',
            policy_results TEXT,
            policy_version TEXT,
            created_at TEXT DEFAULT (datetime('now'))
        );

        CREATE TABLE IF NOT EXISTS subscriptions (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            package TEXT NOT NULL UNIQUE,
            last_scanned_version TEXT,
            last_scanned_at TEXT,
            scan_frequency TEXT DEFAULT 'on_release',
            priority INTEGER DEFAULT 50,
            notes TEXT,
            created_at TEXT DEFAULT (datetime('now'))
        );

        CREATE INDEX IF NOT EXISTS idx_scans_package ON scans(package);
        CREATE INDEX IF NOT EXISTS idx_scans_status ON scans(status);
        CREATE INDEX IF NOT EXISTS idx_evaluations_scan ON evaluations(scan_id);
        CREATE INDEX IF NOT EXISTS idx_subscriptions_package ON subscriptions(package);
    N)r   executescriptcommitcloser   s    r   init_dbr   8   s1    	B 0 0	b IIKHHJr   c                0    V ^8  d   QhR\         R\        /# )   
event_typedatar   dict)formats   "r   __annotate__r&   s   s       4 r   c                   RV  R\         P                  ! V4       R2p\        ;_uu_ 4        . p\        \        4       F  w  rE VP                  V4       K  	  \        V4       F  p\        P                  V4       K  	  RRR4       R#   \        P                   d    TP                  T4        Ku  i ; i  + '       g   i     R# ; i)z+Send an event to all connected SSE clients.zevent: z
data: z

N)jsondumpssse_lock	enumeratesse_clients
put_nowaitqueueFullappendreversedpop)r!   r"   msgdeadiqs   &&    r   broadcast_eventr7   s   s    J<x

4(8'9
>C	k*DAS! +
 $AOOA   

 :: A 
s/   B7B
+B7
&B4	0B73B4	4B77C	z/api/eventsc                    a \         P                  ! ^dR7      o\        ;_uu_ 4        \        P	                  S4       RRR4       V3R lp \        V ! 4       RRRRR/R	7      #   + '       g   i     L-; i)
z#SSE endpoint for real-time updates.)maxsizeNc               3      <"   R x    SP                  ^R7      p V x  K    \        P                   d	    Rx   K6  i ; i5i)zevent: connected
data: {}

timeoutz: keepalive

)getr.   Empty)r3   r6   s    r   generatesse_stream.<locals>.generate   sA     ..(eeBe'	;; (''(s    A" A?A?Aztext/event-streamzCache-Controlzno-cachezX-Accel-Bufferingno)mimetypeheaders)r.   Queuer*   r,   r0   r   )r?   r6   s    @r   
sse_streamrE      s]     [[-A	1 
( HJ)<,j:MtTV V 
s   A""A2	/c                  4    \        \        \        4      R 4      # )z
index.html)r	   r   
STATIC_DIR r   r   indexrJ      s    s:==r   z
/api/scansc                      \        4       p V P                  R 4      P                  4       pV P                  4        \	        V Uu. uF  p\        V4      NK  	  up4      # u upi )z6SELECT * FROM scans ORDER BY created_at DESC LIMIT 100r   executefetchallr   r   r$   r   rowsrs      r   
list_scansrR      sP    	B::@hj 	 HHJT*TDGT*++*   Az/api/scans/<int:scan_id>c                 8   \        4       pVP                  R V 34      P                  4       pVP                  4        V'       g   \	        RR/4      R3# \        V4      pVP                  R4      '       d   \        P                  P                  VR,          4      '       dp    \        VR,          4      ;_uu_ 4       p\        P                  ! V4      pRRR4       \        P                  ! \        P                  ! XR,          4      4      pWcR&   VP                  R	V 34      P                  4       pV'       d_   VR
,          VR
&   VR,          VR&   VR,          VR&   VR,          VR&   VR,          VR&    \        P                  ! VR,          4      VR&   M
^ VR
&   RVR&   VP                  R4      '       dj   \        P                  P                  VR,          4      '       d>    \        VR,          4      ;_uu_ 4       p\        P                  ! V4      VR&   RRR4       \	        V4      #   + '       g   i     ELb; i  \          d   p\#        T4      TR&    Rp?ELORp?ii ; i  \          d     Li ; i  + '       g   i     Lg; i  \          d     Lwi ; i) SELECT * FROM scans WHERE id = ?error	not found  attestation_pathNpayloadattestationattestation_errorzLSELECT * FROM evaluations WHERE scan_id = ? ORDER BY created_at DESC LIMIT 1
risk_score
risk_levelideval_id
created_at	eval_datepolicy_versionpolicy_resultspolicy_evalUNEVALUATEDpre_analysis_pathpre_analysis)r   rM   fetchoner   r   r$   r=   ospathexistsopenr(   loadloadsbase64	b64decode	Exceptionr   )	scan_idr   rowresultfenveloperZ   eeval_rows	   &        r   get_scanrz      s1   	B
**7'
D
M
M
OCHHJ-.33#YF zz$%%"''..@R9S*T*T	1f/011Q99Q< 2jj!1!1(92E!FGG$+=!
 zzV	
 hj  '5|'5|$TNy&|4{#+,<#= 	$(JJx8H/I$JF=!  !|,| zz%&&277>>&AT:U+V+V	f0122a)-1~& 3
 6?E 211  	1*-a&F&'	1   		 32 		sr   "I  <H,=I  6 I' %J ?I8J ,H=	7	I   I$II$'I54I58J	J J JJz	/api/scanPOST)methodsc                    \         P                  ;'       g    / p V P                  RR4      P                  4       pV'       g   \	        RR/4      R3# V P                  R^24      p\        4       pVP                  RWP                  R4      W P                  R	R
4      34       VP                  RWP                  R4      34      P                  4       ^ ,          pVP                  4        VP                  4        \        P                  V\        P                  ! 4       WP                  R4      V34       \        RRVRVRV P                  R4      RV/4       \	        RVRR/4      # )zQueue a package for scanning.package rV   package required  priorityzOINSERT INTO scan_queue (package, version, priority, source) VALUES (?, ?, ?, ?)versionsourcemanualQINSERT INTO scans (package, version, status) VALUES (?, ?, 'queued') RETURNING idscan_queuedr_   statusqueued)r   r(   r=   stripr   r   rM   ri   r   r   
scan_queueputtimer7   )r"   r~   r   r   rs   s        r   
start_scanr      s5    <<2Dhhy"%++-G!345s::xx
B'H 
BJJY	((9%x(H1MN jj[	((9%& hjG IIKHHJNNHdiik7HHY4GQRMgy'9dhhy6IH$ 
 D'8X677r   z/api/subscriptionsGETc                      \        4       p V P                  R 4      P                  4       pV P                  4        \	        V Uu. uF  p\        V4      NK  	  up4      # u upi )z;SELECT * FROM subscriptions ORDER BY priority DESC, packagerL   rO   s      r   list_subscriptionsr      sK    	B::ST]]_DHHJT*TDGT*++*rS   c            	      V   \         P                  ;'       g    / p V P                  R R4      P                  4       pV'       g   \	        RR/4      R3# \        4       p VP                  RWP                  R^24      V P                  RR4      34       VP                  4        TP                  4        \        R
R T/4       \        YP                  R^
4      RR7       \	        RRR T/4      #   \         d3   pTP                  4        \	        R\        T4      /4      R3u R	p?# R	p?ii ; i)r~   r   rV   r   r   zINSERT INTO subscriptions (package, priority, notes)
               VALUES (?, ?, ?)
               ON CONFLICT(package) DO UPDATE SET
                   priority = excluded.priority,
                   notes = excluded.notesr   notes  Nsubscription_addedsubscription)r   r   r   
subscribed)r   r(   r=   r   r   r   rM   r   rr   r   r   r7   start_scan_internal)r"   r~   r   rx   s       r   add_subscriptionr     s   <<2Dhhy"%++-G!345s::	B/


-
 hhz2."0EF	
 			 HHJ(9g*>? ((:r*B>ZHlIw?@@  /

Q()3../s   AC+ +D(6'D#D(#D(z/api/subscriptions/<package>DELETEc                     \        4       pVP                  R V 34       VP                  4        VP                  4        \	        RRV /4       \        RR/4      # )z+DELETE FROM subscriptions WHERE package = ?subscription_removedr~   r   removed)r   rM   r   r   r7   r   )r~   r   s   & r   remove_subscriptionr   "  sL    	BJJ<wjIIIKHHJ*Y,@AHi())r   z
/api/queuec            	      .   \        4       p V P                  R 4      P                  4       pV P                  4        \        ;_uu_ 4        \
        pRRR4       \        RV Uu. uF  p\        V4      NK  	  upRX/4      #   + '       g   i     L8; iu upi )zMSELECT * FROM scans WHERE status IN ('queued', 'running') ORDER BY created_atNr.   active_scans)r   rM   rN   r   active_scans_lockr   r   r$   )r   rP   running_countrQ   s       r   	get_queuer   ,  su    	B::Whj 	 HHJ		$ 
 Gt4t!d1gt4nmTUU 
	 5s   A?!B
?B	z/api/packagesc                    \         P                  P                  RR4      P                  4       p \         P                  P                  RR4      p\         P                  P                  RR4      p\	        \        \         P                  P                  R^24      4      ^4      p\        \         P                  P                  R^ 4      4      p\        4       pR.p. pV '       d'   VP                  R4       VP                  R	V  R	24       R
P                  V4      pRRRRRRRRRRRR/P                  VR4      p	RV R2p
V'       d&   RV
 R2p
VP                  VP                  4       4       VP                  RV
 R2V4      P                  4       ^ ,          pVP                  V
 RV	 R2WsV.,           4      P                  4       pVP                  4        . pV F  pVR,          ;'       g    RpTP                  R VR ,          R!VR!,          R"VR",          R#VR#,          ;'       g    ^ R$VR$,          ;'       g    R%R&VR&,          ;'       g    ^ R'VR',          ;'       g    ^ R(VR(,          ;'       g    ^ R)VR),          RVP                  R*4       Uu. uF  pV'       g   K  VNK  	  upR+,          /
4       K  	  \        R,VR-VRVRV/4      # u upi ).z?Package-centric view: one row per package with aggregate stats.r6   r   risksortlimitoffsetzs.status = 'completed'zs.package LIKE ?% AND z$max_risk_score DESC, scan_count DESCnamezpackage ASCscanszscan_count DESCrecentzlast_scanned DESCfilesztotal_files DESCnetworkztotal_net DESCzmax_risk_score DESCa  
        SELECT
            s.package,
            COUNT(*) as scan_count,
            COUNT(DISTINCT s.version) as version_count,
            COALESCE(MAX(e.risk_score), 0) as max_risk_score,
            COALESCE(MAX(e.risk_level), 'UNEVALUATED') as worst_risk_level,
            SUM(s.network_connections) as total_net,
            SUM(s.files_opened) as total_files,
            SUM(s.processes_spawned) as total_procs,
            MAX(s.completed_at) as last_scanned,
            GROUP_CONCAT(DISTINCT s.version) as versions
        FROM scans s
        LEFT JOIN evaluations e ON e.id = (
            SELECT e2.id FROM evaluations e2 WHERE e2.scan_id = s.id
            ORDER BY e2.created_at DESC LIMIT 1
        )
        WHERE z 
        GROUP BY s.package
    zSELECT * FROM (z) WHERE worst_risk_level = ?zSELECT COUNT(*) FROM ()z
 ORDER BY z LIMIT ? OFFSET ?versionsr~   
scan_countversion_countmax_risk_scoreworst_risk_levelCLEAN	total_nettotal_filestotal_procslast_scanned,:N
   Npackagestotal)r   argsr=   r   minintr   r0   joinupperrM   ri   rN   r   splitr   )r6   r   r   r   r   r   
conditionsparamswhereorderqueryr   rP   r   rQ   versions_strvs                    r   list_packagesr   :  s    	b!'')A<<FB'D<<FF+DGLL$$Wb12C8E!!(A./F	B*+JF,-!AhLL$E 	6"%## 
c$%& 
" g #E, !%(DEdjjl#JJ/wa8&AJJLQOE::z%0ABFU[_D\]ffhDHHJH}**q|!L/Q/a 0166Q"4 5 @ @;,,11]+00q1]+00qAn-L$6$6s$;A$;qq$;A#F
 	  J'5'5(TZ[\\ Bs   
K
0K
0z/api/packages/<package>/scansc                    \        4       pVP                  RV 34      P                  4       pVP                  4        \	        V Uu. uF  p\        V4      NK  	  up4      # u upi )z:All scans for a specific package, ordered by version/date.zmSELECT * FROM scans WHERE package = ? AND status = 'completed'
           ORDER BY completed_at DESC LIMIT 50rL   r~   r   rP   rQ   s   &   r   package_scansr     s[     
B::	2	
 hj	 	
 HHJT*TDGT*++*   A z/api/dashboardc                    \        4       p RV P                  R4      P                  4       ^ ,          RV P                  R4      P                  4       ^ ,          RV P                  R4      P                  4       ^ ,          RV P                  R4      P                  4       ^ ,          R	V P                  R
4      P                  4       ^ ,          R/ R. R. R/ /	pV P                  R4      P                  4       pV Uu/ uF  q3R,          ;'       g    RVR,          bK  	  upVR&   V P                  R4      P                  4       pV Uu. uF  p\	        V4      NK  	  upVR&   V P                  R4      P                  4       pV Uu. uF  p\	        V4      NK  	  upVR&   V P                  R4      P                  4       pRVR,          ;'       g    ^ RVR,          ;'       g    ^ RVR,          ;'       g    ^ RVR,          ;'       g    ^ RVR,          ;'       g    ^ /VR&   V P                  4        \        V4      # u upi u upi u upi ) z*Aggregate dashboard data for the overview.total_packageszBSELECT COUNT(DISTINCT package) FROM scans WHERE status='completed'total_scans3SELECT COUNT(*) FROM scans WHERE status='completed'r   0SELECT COUNT(*) FROM scans WHERE status='queued'runningz1SELECT COUNT(*) FROM scans WHERE status='running'failed0SELECT COUNT(*) FROM scans WHERE status='failed'risk_distribution	top_riskyrecent_completions	aggregatezgSELECT risk_level, COUNT(DISTINCT package) as c FROM scans WHERE status='completed' GROUP BY risk_levelr^   UNKNOWNca  
        SELECT package, MAX(risk_score) as score, MAX(risk_level) as level,
               COUNT(*) as scans, SUM(network_connections) as net
        FROM scans WHERE status='completed' AND risk_level NOT IN ('CLEAN')
        GROUP BY package ORDER BY score DESC LIMIT 20
    zSELECT id, package, version, risk_level, risk_score, network_connections, files_opened, completed_at FROM scans WHERE status='completed' ORDER BY completed_at DESC LIMIT 15z
        SELECT SUM(network_connections) as net, SUM(files_opened) as files,
               SUM(processes_spawned) as procs, SUM(dns_lookups) as dns,
               SUM(packages_installed) as pkgs
        FROM scans WHERE status='completed'
    network_connectionsnetfiles_openedr   processes_spawnedprocsdns_lookupsdnspackages_installedpkgs)r   rM   ri   rN   r$   r   r   )r   drP   rQ   rt   s        r   	dashboardr     s.    
B"**%ijssuvwxrzz"WXaacdef"**OPYY[\]^2::QR[[]^_`"**OPYY[\]^RRbR
	A ::qhj 	 MQQDqo::AcFBDQA ::  	
 
 	 (,,t!d1gt,AkN :: 	whj 	 1551tAw5A **  	
 
  	s5zQG))S\..Qs5zQc&k..QAkN HHJ1:C R - 6s   6H7
H7H<?Iz/api/reeval-allc                    \        4       p V P                  R4      P                  4       pV P                  4        ^ pV F(  p\        P                  VR,          4       V^,          pK*  	  \        RRV/4       \        RRRV/4      # )zNRe-evaluate ALL existing attestations with current policies. No Docker needed.zNSELECT id FROM scans WHERE status='completed' AND attestation_path IS NOT NULLr_   reeval_startedcountr   queued_for_reeval)r   rM   rN   r   reeval_queuer   r7   r   )r   rP   r   rQ   s       r   
reeval_allr     s     
B::Xhj 	 HHJE4!
  $w&67H17EBCCr   z/api/reeval/<int:scan_id>c                J    \         P                  V 4       \        RRRV /4      # )z0Re-evaluate a single scan with current policies.r   r   rs   )r   r   r   )rs   s   &r   reeval_singler     s'     WH19gFGGr   z/api/explain/<int:scan_id>c                ~   \        4       pVP                  RV 34      P                  4       pVP                  4        V'       g   \	        RR/4      R3# \        V4      pVP                  R4      '       d'   \        P                  ! VP                  RR4      4      M/ p. pVP                  R/ 4      P                  4        F5  w  rgVP                  R. 4       F  pVP                  R	V R
V 24       K  	  K7  	  . p	. p
. p/ p. p. p. pVP                  R4      '       EdY   \        P                  P                  VR,          4      '       Ed,    \        VR,          4      ;_uu_ 4       p\        P                  ! V4      pRRR4       \        P                  ! \         P"                  ! XR,          4      4      pVP                  R/ 4      P                  R. 4      pV EF  pVP                  R/ 4      pRV9   Ed<   VR,           EF-  pV
P                  RVP                  R4      RVP                  RR4      RVP                  RR4      R,          /4       VP                  R4      pV'       Ed2   VP                  R. 4       Fj  pV	P                  VP                  RR4       RVP                  RR4       RVP                  RR4       RVP                  R R4       R!VR,           R"2
4       Kl  	  VP                  R#. 4       F9  pVP                  VP                  R$R4       RVP                  R%R4       24       K;  	  VP                  R&. 4       FL  pVP                  VP                  RR4       RVP                  R'R4       R(VP                  R)R4       24       KN  	  VP                  R*4      ;'       g    / P%                  4        Fd  pR+V9   d   VP'                  R+^4      ^ ,          MR+pVP                  V^ 4      ^,           VV&   RT F  pVV9   g   K  VP                  V4       K  	  Kf  	  EK0  	  R,V9   g   EKc  VR,,           F'  pVP                  VR-,           R.VR/,           24       K)  	  EK  	  \+        VP                  4       R0 R17      R2,          p\-        VP/                  4       4      p RP1                  . R3NVR4,           NR.NVP                  R/4      ;'       g    R5 NR6NVP                  R7R84       NR9NVP                  R:^ 4       NR;N\3        V4       NR<NV'       d   \5        ^
4      P1                  V4      MR= NR>N\3        V	4       NR?NV	'       d   \5        ^
4      P1                  V	4      MR= NR@NV'       d   \5        ^
4      P1                  V4      MR= NRAN\3        V4       NRBNV'       d   \5        ^
4      P1                  V4      MR= NRCN\3        V
4       NRBN\5        ^
4      P1                  RD V
 4       4       NRENV  NRFN\5        ^
4      P1                  RG V 4       4       NRHNV'       d   \5        ^
4      P1                  V4      MR= NRIN\3        V4       NRBN\5        ^
4      P1                  V4       NRJN4      p! ^ RIp"V"P9                  4       p#V#P:                  P=                  RKRLRMRNROV!/.RP7      p$V$P>                  ^ ,          P@                  p%\	        RSV%/4      #   + '       g   i     ELz; i  \(         d     ELi ; i  \B         d    RQp% LB\(         d   p&RRT& 2p% Rp&?&LVRp&?&ii ; i)Uz=Use Claude API to explain scan findings with actual evidence.rU   rV   rW   rX   rd   z{}policies
violations[z] rY   NrZ   	predicater
   r[   	processespid	processidprogramr   cmdline:N   Nr   connectionssyscall? familyaddress:portz (PID r   
dnsLookupsserverAddress
serverPortsocketstypez proto=protocolopenedfilesrF   r   r   ==r   c                     V ^,          ) # )   rI   )xs   &r   <lambda>explain_scan.<locals>.<lambda>2  s
    !A$r   )key:N   Na  You are a supply chain security forensic analyst. A pip package was installed inside a sandboxed Docker container with full ptrace system call tracing. Every syscall (execve, openat, socket, connect, bind, sendto) was intercepted and recorded. The attestation was then evaluated against Rego security policies.

Your job: analyze the EVIDENCE below and explain what happened. Cite specific IPs, file paths, process names, and policy violations. Do NOT speculate beyond what the evidence shows. If something is benign, explain WHY it's benign (e.g. "151.101.64.223 is Fastly CDN which hosts PyPI packages"). If something is suspicious, point to the specific evidence.

## Package
r~   latestz#

## Policy Evaluation
Risk Level: r^   r   z
 | Score: r]   z | Total violations: z

Violations:
z(none)z$

## EVIDENCE: Network Connections (z total)
z

## EVIDENCE: DNS Lookups
z 

## EVIDENCE: Sockets Created (z)
z"

## EVIDENCE: Processes Spawned (c              3   b   "   T F%  pR VR,           RVR,           RVR,           2x  K'  	  R# 5i)zPID r   : r   z | r   NrI   ).0ps   & r   	<genexpr>explain_scan.<locals>.<genexpr>L  s1     ]J\QQuXJb9c!I,@J\s   -/z

## EVIDENCE: Files Accessed (z total)
Top directories:
c              3   8   "   T F  w  rR V RV R2x  K  	  R# 5i)z  r  z filesNrI   )r  r   r   s   &  r   r  r  P  s!     7hda1#Rs&!hs   z

Sensitive files accessed:
z#

## EVIDENCE: Packages Installed (a  

---

Analyze this evidence in 3 sections:

**What happened** - Walk through exactly what the install did: which processes ran, where network connections went (identify the IPs), what files were touched. Cite the evidence.

**Risk assessment** - For each policy violation, explain whether it represents real risk or expected behavior, citing the specific evidence. If connections went to known infrastructure (PyPI CDN, Docker DNS), say so. If unknown IPs appear, flag them explicitly.

**Verdict** - Is this package safe to install? Be direct. If it's clean, say so confidently and explain why. If there are concerns, identify exactly what needs investigation.zclaude-sonnet-4-20250514i  roleusercontent)model
max_tokensmessagesz7Anthropic SDK not installed. Run: pip install anthropiczError calling Claude API: explanation)
.ssh.aws.gnupg.kube.envshadowcredentialsid_rsa
id_ed25519.pypirc)"r   rM   ri   r   r   r$   r=   r(   ro   itemsr0   rj   rk   rl   rm   rn   rp   rq   keysrsplitrr   sortedsumvaluesr   lenchr	anthropic	Anthropicr!  creater  textImportError)'rs   r   rt   scanre   r   r   polr   evidence_networkevidence_processesevidence_files_sensitiveevidence_files_dirsevidence_packagesevidence_dnsevidence_socketsrv   rw   rZ   attsattr"   r  r   r   r   sfilepathdirnamesenspkgtop_dirsr   promptr5  clientmessager"  rx   s'   &                                      r   explain_scanrN    s    
B
**7'
D
M
M
OCHHJ-.339DBF((K[B\B\$**TXX&6=>bdK J __Z4::<	r*A$r!o. + =
 !Lxx"##t<N7O(P(P-	d-.//199Q< 0jj!1!1(92E!FGG;;{B/33NBGDww}b1 $&!+..*11!155#5%quuY';%quuY';D'A3   eeI.3%(WW]B%? 0 7 7'(uuYs';&<AaeeHS>Q=RRSTUTYTYZcdfTgShhijkjojopvwyjzi{  |B  CD  EP  CQ  BR  RS  %T!" &@ &)WW\2%> , 3 3quu_R7P6QQRSTSXSXYefhSiRj4k l &?%(WWY%; 0 7 7155";M:NaPQPUPUV\]_P`Oaahijininoyz|i}h~8  !A &< *+})=)C)C(I(I(KHDG8Ohooc1&=a&@Y\G;N;R;RSZ\];^ab;b/8)[#'8#3$<$C$CH$M)[ )L) /: %#J//)00CK=3y>BR1ST  0G T )//1GLH)0023K+r +r  +r
 i +r
 +r
 HHY'3384+r
5+r XXlI./+r 0:+r ;?((<QR:S9T+r Uj+r knnxjyiz+r{+r (RjX 6+r7#+r $''7#8"9+r:+r $4R B+rC+r"  ,Rl :#+r";#+r&  ##345'+r&6'+r( $4R B)+r(C!)+r, "%%7!8 9-+r,:-+r. R]J\]] ^/+r._/+r2 *]3+r2+3+r6 R7h77 87+r697+r< ,DR&' R=+r<S"=+r@ #&&7"8!9A+r@:A+rB R  !C+rB
"oC+rFZ7$$&//((,vy&9: ) 

 ooa(-- M;/00[ 0//V  		z  PO 721#67sc   \ &[.=H7\ 5A\ "\ =9\ A\ .[?	9	\ \\\<#\<,\<-\77\<z/api/searchc            
     B   \         P                  P                  RR4      P                  4       p \         P                  P                  RR4      p\         P                  P                  RR4      p\	        \        \         P                  P                  R^d4      4      R4      p\        \         P                  P                  R^ 4      4      p\        4       p. p. pV '       d'   VP                  R4       VP                  R	V  R	24       V'       d1   VP                  R
4       VP                  VP                  4       4       VR8X  d   VP                  R4       VR8X  d   VP                  R4       V'       d   RP                  V4      MRpVP                  RV 2V4      P                  4       ^ ,          p	VP                  RV R2WsV.,           4      P                  4       p
VP                  4        \        RV
 Uu. uF  p\        V4      NK  	  upRV	RVRV/4      # u upi )z>Search scans by package name, risk level, or network activity.r6   r   r   has_networkr   r   r   zpackage LIKE ?r   zrisk_level = ?trueznetwork_connections > 0
suspiciousznetwork_connections > 12r   z1=1z!SELECT COUNT(*) FROM scans WHERE zSELECT * FROM scans WHERE z* ORDER BY created_at DESC LIMIT ? OFFSET ?resultsr   )r   r   r=   r   r   r   r   r0   r   r   rM   ri   rN   r   r   r$   )r6   r   rP  r   r   r   r   r   r   r   rP   rQ   s               r   search_scansrT  s  s    	b!'')A<<FB'D,,""="5KGLL$$Wc23S9E!!(A./F	BJF*+!Ah*+djjl#f34l"45(2GLL$EJJ:5'BFKTTVWXYE::
$UG+UV  hj 	 HHJI6AQ6QVX`bhijj6s   :H
z
/api/statsc                     \        4       p R V P                  R4      P                  4       ^ ,          RV P                  R4      P                  4       ^ ,          RV P                  R4      P                  4       ^ ,          RV P                  R4      P                  4       ^ ,          RV P                  R	4      P                  4       ^ ,          R
V P                  R4      P                  4       ^ ,          RV P                  R4      P                  4       ^ ,          ;'       g    ^ RV P                  R4      P                  4       ^ ,          ;'       g    ^ /pV P                  4        \	        V4      # )r   zSELECT COUNT(*) FROM scanscompleted_scansr   failed_scansr   queued_scansr   subscriptionsz"SELECT COUNT(*) FROM subscriptions	high_riskzBSELECT COUNT(*) FROM scans WHERE risk_level IN ('HIGH','CRITICAL')total_network_connectionsz*SELECT SUM(network_connections) FROM scanstotal_files_openedz#SELECT SUM(files_opened) FROM scans)r   rM   ri   r   r   )r   statss     r   	get_statsr^    s&   	Brzz">?HHJ1M2::&[\eeghij

#UV__abcd

#UV__abcd$HIRRTUVWRZZ dennpqrs#RZZ0\%]%f%f%hij%k%p%popbjj)NOXXZ[\]bbab	E HHJ5>r   c                0    V ^8  d   QhR\         R\        /# r    rY   returnr#   )r%   s   "r   r&   r&     s     , ,C ,D ,r   c                   V '       d&   \         P                  P                  V 4      '       g   / #  \        V 4      ;_uu_ 4       p\        P
                  ! V4      pRRR4       \        P                  ! \        P                  ! XR,          4      4      pVP                  R/ 4      P                  R. 4      pR. R\        4       R. R. R	. R
. R. /pV EF  pVP                  R/ 4      pRV9   Ed   VR,           EF  pVR,          P                  RVP                  R4      RVP                  RR4      RVP                  RR4      /4       VR,          P                  VP                  R/ 4      P                  4       4       VP                  R4      p	V	'       g   K  V	P                  R. 4       Ff  p
VR,          P                  V
P                  RR4       RV
P                  RR4       RV
P                  RR4       RV
P                  RR4       24       Kh  	  V	P                  R	. 4       FS  pVR	,          P                  VP                  RR4       RVP                  RR4       RVP                  RR4       24       KU  	  V	P                  R. 4       F@  pVR
,          P                  VP                  RR4       RVP                  RR4       24       KB  	  EK  	  RV9   d<   VR,           F.  pVR,          P                  VR,           RVR ,           24       K0  	  R!V9   g   EKU  VR!,           FS  pVR,          P                  VP                  R". 4      4       VR,          P                  VP                  R#. 4      4       KU  	  EK  	  \        VR,          4      VR&   V#   + '       g   i     ELO; i  \          d    / u # i ; i)$z9Load and parse attestation envelope into normalized data.NrZ   r   r
   r   r   r   r   r  r   setup_pyr[   r   r   r   r   r   r  r   r   r  r  r  r  r	  r
  r  r  r  r   r  r   setupPyAnalysissuspiciousCallsnetworkImports)rj   rk   rl   rm   r(   rn   ro   rp   rq   r=   setr0   updater.  extendr0  rr   )rY   rv   rw   rZ   rC  ru   rD  r"   r  r   r   rE  r   rI  as   &              r   load_attestation_datark    sc   277>>2B#C#C	("##qyy|H $**V--hy.ABC{{;+//CR#%b*bRJ< C77="-Dd"k**A;'..quu[1!155B#7!155B#70 
 7O**155+C+H+H+JK%%	*Cs!$!;A"9-44#$552#6"7qx9K8LAaeeT]^`NaMbbcdedidijpqsdtcu v "< "%B!7A"9-44hr8J7K1QUUSYZ\M]L^^_`a`e`efpqs`t_u5vw "8!$r!:A"5M00AEE/"4M3NaPQPUPUVbcePfOg1hi "; +" T!
++C:&--VRI?O.PQ , D(/00A:&--aee4Er.JK:&--aee4Db.IJ 11 8 !1wK $##L  	s8   N5 N!D9N5 FN5 %A;N5 !N2	,	N5 5OOc                <    V ^8  d   QhR\         R\         R\         /# )r    old_datanew_datara  )r$   )r%   s   "r   r&   r&     s!     < <4 <4 <D <r   c                j  a RR\        \        VP                  R. 4      4      \        V P                  R. 4      4      ,
          4      R\        \        V P                  R. 4      4      \        VP                  R. 4      4      ,
          4      /RR\        \        VP                  R. 4      4      \        V P                  R. 4      4      ,
          4      R\        \        V P                  R. 4      4      \        VP                  R. 4      4      ,
          4      /RR\        \        VP                  R. 4      4      \        V P                  R. 4      4      ,
          4      R\        \        V P                  R. 4      4      \        VP                  R. 4      4      ,
          4      /RR\        \        VP                  R. 4      4      \        V P                  R. 4      4      ,
          4      R\        \        V P                  R. 4      4      \        VP                  R. 4      4      ,
          4      /RR\        \        VP                  R. 4      4      \        V P                  R. 4      4      ,
          4      R\        \        V P                  R. 4      4      \        VP                  R. 4      4      ,
          4      /RRVP                  R. 4       UUu. uF;  pVR	,          V P                  R. 4       Uu0 uF  q3R	,          kK  	  up9  g   K9  VNK=  	  uppRV P                  R. 4       UUu. uF;  pVR	,          VP                  R. 4       Uu0 uF  q3R	,          kK  	  up9  g   K9  VNK=  	  upp/R
R\        \        VP                  R
. 4      4      \        V P                  R
. 4      4      ,
          4      R\        \        V P                  R
. 4      4      \        VP                  R
. 4      4      ,
          4      //p^ pV\        VR,          R,          4      ^
,          ,          pV\        VR,          R,          4      R,          ,          pV\        VR,          R,          4      ^,          ,          pV\        VR,          R,          4      ^,          ,          pV\        VR,          R,          4      ^,          ,          pV\        VR
,          R,          4      ^,          ,          pVR,          R,           Uau. uFG  o\        ;QJ d    V3R lR 4       F  '       g   K   RM	  RM! V3R lR 4       4      '       g   KE  SNKI  	  ppV\        V4      ^,          ,          pWtR&   \        V4      VR&   V^28  d   RMV^8  d   RMV^8  d   RM
V^8  d   RMRVR&   V# u upi u uppi u upi u uppi u upi )z2Compute the diff between two attestation datasets.r   addedr   r   r   r  r   r   r   rc  g?c              3   ,   <"   T F	  qS9   x  K  	  R # 5ir   rI   )r  rE  rv   s   & r   r  compute_diff.<locals>.<genexpr>	  s      a /`1f /`s   TFsensitive_files_addedchange_risk_scoreCRITICALHIGHMEDIUMLOWr   change_risk_level)	r#  r$  r%  r&  z/etc/shadowz/etc/passwdr'  r)  r,  )r0  rg  r=   r3  anyr   )rm  rn  r  r  diffr   rv   sensitive_filess   &&    ` r   compute_diffr}    s    	VCY ;<s8<<PY[]C^?__`vc(,,y""=>X\\R[]_E`Aaab
 	VCWb 9:SgWYAZ=[[\vc(,,w";<s8<<PWY[C\?]]^
 	VCZ <=HLLQ[]_D`@aabvc(,,z2">?#hllS]_aFbBccd
 	VCY ;<s8<<PY[]C^?__`vc(,,y""=>X\\R[]_E`Aaab
 	VCUB 783x||ESU?V;WWXvc(,,ub"9:SeUWAX=YYZ
 	k2!> d!>A9HLLQ\^`Da-bDaq	llDa-bb a!> d8<<R#@ f#@aY<hllS^`bFc/dFc)Fc/dd #@ f
 	VCZ <=HLLQ[]_D`@aabvc(,,z2">?#hllS]_aFbBccd
7DD DCY()B..DCWg&'#--DCZ )*Q..DC[!'*+a//DCUG$%))DCZ )*R//D #'w-"8 b"8Q# a /` a### a /` a a q"8O b 	C 2%%D$3	 ! #D	D	bj
"*BJ 		 KG .cd 0ef&bsT   !V,V&=VV%!V*"V%*V*" V*"5V0V0V0<V0V%V*"z-/api/diff/<int:old_scan_id>/<int:new_scan_id>c                   \        4       pVP                  RV 34      P                  4       pVP                  RV34      P                  4       pVP                  4        V'       d	   V'       g   \	        RR/4      R3# \        VR,          4      p\        VR,          4      p\        WV4      pRV RVR,          RVR,          /VR	&   RVRVR,          RVR,          /VR
&   \	        V4      # )z2Compare two scan attestations and return the diff.rU   rV   zscan not foundrX   rY   r_   r~   r   old_scannew_scan)r   rM   ri   r   r   rk  r}  )old_scan_idnew_scan_idr   old_rownew_rowrm  rn  r{  s   &&      r   
diff_scansr    s     
Bjj;k^LUUWGjj;k^LUUWGHHJ'!123S88$W-?%@AH$W-?%@AH+Dk9gi6H)U\]fUghDk9gi6H)U\]fUghD4=r   z/api/package/<package>/versionsc                    \        4       pVP                  RV 34      P                  4       pVP                  4        \	        V Uu. uF  p\        V4      NK  	  up4      # u upi )z9Get all scanned versions of a package for diff selection.zSELECT id, package, version, status, risk_level, risk_score,
                  network_connections, files_opened, completed_at
           FROM scans WHERE package = ? AND status = 'completed'
           ORDER BY completed_at DESCrL   r   s   &   r   package_versionsr  /  s]     
B::	) 

 hj 	 HHJT*TDGT*++*r   c                    \        4       pVP                  R W34      P                  4       ^ ,          pVP                  4        VP	                  4        \
        P                  V\        P                  ! 4       WV34       V# )r   )r   rM   ri   r   r   r   r   r   )r~   r   r   r   r   rs   s   &&&&  r   r   r   B  sd    	Bjj[	 hjG IIKHHJNNHdiik7WEFNr   c                J    V ^8  d   QhR\         R\         R,          R\        /# )r    r~   r   Nrs   )r   r   )r%   s   "r   r&   r&   N  s%     > >c >C$J > >r   c                   \        4       pV'       d   V  RV 2MT pVP                  RV34       VP                  4        \        RRVRV RV/4        \        RV 2,          pVP                  RRR	7       RV 2p\        P                  ! R
RRRRRRV R2RRV 2RV.RRRR7       \        VP                  V R24      4      pVR,          pV'       d   \        V^ ,          4      MRp	VP                  4       '       d   \        V4      MRp
V	'       d   \        V	4      M/ pVP                  RWVP                  R^ 4      VP                  R^ 4      VP                  R^ 4      VP                  R^ 4      VP                  R^ 4      VP                  R ^ 4      V3	4       VP                  4        V	'       d   \        P                  V4       \        R!RVRV RVRVP                  R^ 4      RVP                  R^ 4      /4       VP%                  4        R#   \        P                    d9    TP                  R"T34       TP                  4        \        R#RTRT R$R%/4        L^\"         dS   pTP                  R&\        T4      T34       TP                  4        \        R#RTRT R$\        T4      /4        Rp?LRp?ii ; i  TP%                  4        i ; i)'zExecute a pip-witness Docker scan. Only produces attestation + metrics.
Policy evaluation happens separately in the eval queue.r  zHUPDATE scans SET status='running', started_at=datetime('now') WHERE id=?scan_startedr_   r~   r   scan-Tparentsexist_okdockerrunz--rmz--cap-add=SYS_PTRACEz--security-optzseccomp=unconfinedz-vz:/attestationsz-ez
STEP_NAME=zpip-witness:latesti,  )capture_outputr8  r<   z-*.jsonzpre-analysis.jsonNa;  
            UPDATE scans SET status='completed', completed_at=datetime('now'),
                attestation_path=?, pre_analysis_path=?,
                network_connections=?, files_opened=?, processes_spawned=?,
                dns_lookups=?, sockets_created=?, packages_installed=?
            WHERE id=?
        r   r   r   r   sockets_createdr   scan_completedzZUPDATE scans SET status='failed', error='timeout', completed_at=datetime('now') WHERE id=?scan_failedrV   r<   zRUPDATE scans SET status='failed', error=?, completed_at=datetime('now') WHERE id=?)r   rM   r   r7   ATTESTATION_DIRmkdir
subprocessr  listglobr   rl   extract_metricsr=   
eval_queuer   TimeoutExpiredrr   r   )r~   r   rs   r   pkg_specscan_att_dir	step_name	att_filesrh   att_pathpre_pathmetricsrx   s   &&&          r   run_scanr  N  s    
B*1'"WI&wHJJY\c[efIIKNT7Iw	SZ$[\4&5	)::4$7G9%	uf#%57Kl^>2Z	{+!8	-
  dC	
 **i[+@AB	#&99(13y|$t(4(;(;(=(=3|$4/7/(+R


  kk/3W[[QR5Skk-q17;;}a3Pkk+Q/=QST1U	
	 			 NN7#('9gy'!7;;/Da#HGKK:+
 	 	
 $$ `


oryq{|
		gy'7T]'^_ ]


gjmnojpryiz{
		gy'7TWXYTZ'[\\]
 	
sL   B+H >H C*H A
J7J: J7$J7%AJ2-J: 2J77J: :Kc                $    V ^8  d   QhR\         /# )r    rs   )r   )r%   s   "r   r&   r&     s      3 r   c                   \        4       pVP                  RV 34      P                  4       pV'       d   VR,          '       g   VP                  4        R# TR,          p ^ RIHp V! V4      pVP                  RWP                  R^ 4      VP                  RR4      \        P                  ! V4      R	34       VP                  4        \        R
RV RVR,          RVR,          RVP                  R^ 4      RVP                  RR4      RVP                  R^ 4      /4       VP                  4        R#   \         d,   p\        RT  RT 2\        P                  R7        Rp?LCRp?ii ; i  TP                  4        i ; i)zQRun all Rego policies against a scan's attestation. Creates an evaluation record.z?SELECT attestation_path, package, version FROM scans WHERE id=?rY   N)evaluate_all_policiesz
            INSERT INTO evaluations (scan_id, risk_score, risk_level, policy_results, policy_version)
            VALUES (?, ?, ?, ?, ?)
        r]   r^   r   zv2-9policieseval_completedrs   r~   r   total_violationszEval error for scan r  file)r   rM   ri   r   re   r  r=   r(   r)   r   r7   rr   printsysstderr)rs   r   rt   r  r  rS  rx   s   &      r   evaluate_scanr    sK   	B
**VY`Xb
c
l
l
nCc,--

%&H5'1


  {{<3W[[w5Wjj!>3	4
 			(w	3y>9c)n'++lA6gkkR^`gFh,> B+
 	 	
  F$WIRs3#**EEF 	
s+   B>D/ /E%:!E E(  E%%E( (E:c                0    V ^8  d   QhR\         R\        /# r`  r#   )r%   s   "r   r&   r&     s      c d r   c                   R^ R^ R^ R^ R^ R^ /p \        V 4      ;_uu_ 4       p\        P                  ! V4      pRRR4       \        P                  ! \        P
                  ! XR,          4      4      pVP                  R	/ 4      P                  R
. 4      pV EF&  pVP                  R/ 4      pRV9   d   VR,          p\        V4      VR&   V F  p	VR;;,          \        V	P                  R/ 4      4      ,          uu&   V	P                  R4      p
V
'       g   KL  VR;;,          \        V
P                  R. 4      4      ,          uu&   VR;;,          \        V
P                  R. 4      4      ,          uu&   VR;;,          \        V
P                  R. 4      4      ,          uu&   K  	  RV9   g   EK  VR,          VR&   EK)  	  V#   + '       g   i     EL; i  \         d     T# i ; i)z1Extract key metrics from an attestation envelope.r   r   r   r   r  r   NrZ   r   r
   r[   r   r  r   r  r   r  totalInstalled)	rm   r(   rn   ro   rp   rq   r=   r3  rr   )rY   r  rv   rw   rZ   rC  rD  r"   r   r  r   s   &          r   r  r    s    	q.!5H!q+Q0DaG"##qyy|H $**V--hy.ABC{{;+//CC77="-Dd"[)/25z+,AN+s1553K/LL+%%	*Cs 12c#'')R:P6QQ2 56#cggmUW>X:YY6.#cgglB6O2PP.   4'045E0F,-   N+ $##&  Ns5   G GCG BG 1G G		G G'&G'SCAN_WORKERS8EVAL_WORKERS4c            	          \         P                  ^R7      w  rr#p\        ;_uu_ 4        \
        ^,          sRRR4        \        Y#T4       \        ;_uu_ 4        \
        ^,          sRRR4       \         P                  4        K    \        P                   d     K  i ; i  + '       g   i     Ls; i  \         d)   p\        RT 2\        P                  R7        Rp?LRp?ii ; i  + '       g   i     L; i  \        ;_uu_ 4        \
        ^,          sRRR4       M  + '       g   i     M; i\         P                  4        i ; i)z.Pulls from scan_queue, runs Docker containers.r;   NzScan worker error: r  )r   r=   r.   r>   r   r   r  rr   r  r  r  	task_done)r   tsr~   r   rs   rx   s         r   scan_workerr    s     	6@nnQn6O3H'G AL 	#Ww/ #"! #  " {{ 		  	>'s+#**==	> #"""! #"""  "sj   B B$B7 C-B! B!$B4	7C*C% D  %C**D  -C=	 ED&		E&D61Ec                 L     \         P                  ^R7      p  \	        T 4       \         P                  4        K:    \        P                   d     KR  i ; i  \
         d)   p\        RT 2\        P                  R7        Rp?L`Rp?ii ; i  \         P                  4        i ; i)uF   Pulls from eval_queue, runs OPA policy evaluation. Fast — no Docker.r;   zEval worker error: r  N)
r  r=   r.   r>   r  rr   r  r  r  r  rs   rx   s     r   eval_workerr    s    
	 nnQn/G	#'"   " {{ 		  	>'s+#**==	>   "8   ; A AAB
"B B B

B B#c                 L     \         P                  ^R7      p  \	        T 4       \         P                  4        K:    \        P                   d     KR  i ; i  \
         d)   p\        RT 2\        P                  R7        Rp?L`Rp?ii ; i  \         P                  4        i ; i)zRPulls from reeval_queue, re-evaluates existing attestations with current policies.r;   zRe-eval worker error: r  N)
r   r=   r.   r>   r  rr   r  r  r  r  r  s     r   reeval_workerr     s    
	"&&q&1G	%'" ""$ {{ 		  	A*1#.SZZ@@	A ""$r  c                     \         P                  ! ^4       \        P                  4       p \        P                  4       p\
        P                  4       p\        ;_uu_ 4        \        pRRR4       V ^ 8  g   V^ 8  g   V^ 8  g
   X^ 8  g   K  \        RV  RX R\         RV RV 2
4       K    + '       g   i     LN; i)zPeriodic status logging.NzQueues: scan=z
 (running=rF   z	) | eval=z
 | reeval=)
r   sleepr   qsizer  r   r   r   r  r  )sqeqrqr   s       r   status_loggerr    s    


2!"G 6R!VrAv1M"Zy,yQSPTT^_a^bcd s   "B//B?	c            	         \        4        \        P                  R R R7       \        \        4       F1  p \
        P                  ! \        R RV  2R7      P                  4        K3  	  \        \        4       F1  p \
        P                  ! \        R RV  2R7      P                  4        K3  	  \        \        4       F1  p \
        P                  ! \        R RV  2R7      P                  4        K3  	  \
        P                  ! \        R R7      P                  4        \        R\         R\         R	\         R
24       \        \        P                   P#                  RR4      4      p\        RV 24       \$        P'                  RVRR R7       R# )Tr  r  )targetdaemonr   zeval-zreeval-)r  r  zpip-witness: z scan workers, z eval workers, z reeval workersPORTi  z/pip-witness viewer running at http://localhost:z0.0.0.0F)hostr  debugthreadedN)r   r  r  ranger  	threadingThreadr  startr  r  r  r  r  r   rj   environr=   appr  )r5   r  s     r   mainr     s(   I$6 < Dqc{KQQS ! < Dqc{KQQS ! < d71#OUUW ! M$7==?	M,|nOT`Saap
qrrzz~~fd+,D	;D6
BCGGUTGBr   __main__c                   V ^8  d   Qh/ ^ \         9   d   \        \        P                  ,          ;R&   ^\         9   d   \        P                  ;R&   ^\         9   d   \        P                  ;R&   ^\         9   d   \        P                  ;R&   # )r    r,   r   r  r   )__conditional_annotations__r  r.   rD   PriorityQueue)r%   s   "r   r&   r&      ss     
 
F $ #T%++ #G
N 8 7E 7O
P ( 'EKK 'Q
R * )ekk )S
r   )N2   internal)Qr  __doc__rp   r(   rj   r.   r   r  r  r  r   r   r   pathlibr   flaskr   r   r   r   r	   __file__parentAPP_DIRPROJECT_DIRr  r   rH   __name__r   r  r,   Lockr*   r  r   rD   r  r   r   r   r7   routerE   rJ   rR   rz   r   r   r   r   r   r   r   r   r   r   rN  rT  r^  rk  r}  r  r  r   r  r  r  r   r  r=   r  r  r   r   r  r  r  r  r  r&   )r  s   @r   <module>r     s  
   	    
   '  H H
x.

nn.
$
$x
HC
O4 "$ #>> #("5"5"7
 7++-
 '!KKM )4v =V V. 3> > <, , %&. '.b ;)8 *8@ %1, 2, &2A 3A< )H:>* ?* <
V 
V ?J] J]Z *+	, ,	, 4 4n vh/D 0D" &9H :H '&:I1 ;I1X = k  kF < (,^<~ :; <( ,-, .,$	>B<R 2::>>.#672::>>.#67NN$ #(#%
e"C4 zF r   