
    ʟj
[              
          d dl Z d dlZd dlmZmZ d dlmZmZ d dlmZ d dl	Z	d dl
Z
d dlZd dlmZ d dlmZ d dlmZ d dlmZ d dlmZmZ d dlmZ d dlmZ d dlmZ d dlm Z  d d	l!m"Z"m#Z# ejH                  jK                  e&      Z'd
ddddddddd	Z(g Z)g Z*d"dZ+d"dZ,d Z-d Z.d Z/d#dZ0d Z1d Z2d Z3d Z4 G d de      Z5e6d k(  r ed!e5      jo                          yy)$    N)datetimetimezone)BaseHTTPRequestHandlerThreadingHTTPServer)urlparse)ask)collect)r	   request_detail)evaluate)ingest_post
ingest_getz/opt/obsidian-vaultz+/opt/struktur/youtube-research/knowledge.dbzB/opt/struktur/obsidian-graphiti-import/obsidian_graphiti_import.dbz//opt/struktur/graphiti/request-data/requests.dbz;/opt/struktur/graphiti/request-data/processing-events.jsonlz http://127.0.0.1:9119/api/healthz$http://127.0.0.1:9119/api/model/infozhttp://127.0.0.1:8644/healthz</opt/struktur/obsidian-graphiti-import/import_run_block.json)	vaultknowledge_db	import_dbrequests_dbevents_filehermes_health_urlhermes_model_urlgraphiti_health_url	run_blockc                     t        j                  dt        d    dd      }	 |j                  | |      j	                         d   |j                          S # |j                          w xY w)Nfile:r   ?mode=roTurir   )sqlite3connectCFGexecutefetchoneclosesqlparamscons      +/home/hermes/app.py.queue-rootcause-patchedkdb_oner'      sU    %N 34H=4HC{{3'00215				s   "A A)c                     t        j                  dt        d    dd      }	 |j                  | |      j	                         |j                          S # |j                          w xY w)Nr   r   r   Tr   )r   r   r   r   fetchallr!   r"   s      r&   kdb_allr*      sP    %N 34H=4HC{{3'002				s   A A&c                 8   	 t        j                  dd| gt        d |D        g       z   ddd      j                  }|j	                         D ci c]0  }d|v s|j                  dd      d	   |j                  dd      d   2 c}S c c}w # t        $ r i cY S w xY w)
N	systemctlshowc              3   $   K   | ]  }d |g 
 yw)z-pN .0xs     r&   	<genexpr>zread_unit.<locals>.<genexpr>'   s     9Rq4(9Rs   T   )capture_outputtexttimeout=   r   )
subprocessrunsumstdout
splitlinessplit	Exception)unitpropsoutlines       r&   	read_unitrE   %   s    NNKt4S9RE9RSU5VVfjpt}~  G  GFInnFVfdZ]aeZe

3q!!$TZZA%6q%99fff 	s*   AB 	B+BB B BBc                     | r| dv ry | j                  dd      j                  dd      } 	 t        j                  |       }|j                   |j                  t        j
                        S |S # t        $ r Y y w xY w)N)zn/a-0z0.000000z UTCz+00:00Z)tzinfo)replacer   fromisoformatrJ   r   utcr@   )valuedts     r&   
parse_timerP   ,   sw    E77
--x
(
0
0X
>E!!%(24))2Crzzz.KK s   A A. ,A. .	A:9A:c                      ddddd} i }dD ]Q  \  }}i ||<   | j                         D ]4  \  }\  }}|dk(  rdnd	}d
| d}t        d| d| d| d|       ||   |<   6 S |S )N)
created_atvideos)transcript_updated_atrS   )rR   knowledge_units)z!COALESCE(completed_at,updated_at)graphiti_import_queue)new_sourcesupdated_transcriptsnew_knowledge_unitscompleted_queue_entries))last_24hr9   )last_7d   rV   z AND graphiti_status='done' zdatetime(replace(z, 'T', ' '))zSELECT COUNT(*) FROM z WHERE z >= datetime('now','-z day'))itemsr'   )	specsrC   windowdayskeycolumntableextranormalized_columns	            r&   _window_countsrh   6   s    +>< ]	_E
 	C5 HtF"'++- 	HC38:Q3Q/WYE 1&F$'<UG7K\J]]rswrxx~  @E  F  &G  HCK	HH J    c                     |ry| sy|rdS dS )NGRAUROTGELB   GRÜNr/   )activeproblempauseds      r&   _status_labelrr   E   s    f%6)')ri   c                   9 t        j                  t        j                        }t	        d      }|D ci c]  }|d   |d   |d   |d   d }}t	        d      }|r|d   d   nd }	t        d      }
t        d	      }||j                  d
i       j                  dd      z
  }t        d      }t        d      }t        d      }t        d      }t               }t        |	      r|t        |	      z
  j                         nd }t        |
      r|t        |
      z
  j                         nd }|dkD  xsM |dkD  xsF |j                  di       j                  dd      dkD  xr |d uxr |dkD  xs |d uxr |dkD  xr ||kD  }t        t	        d            }t        t	        d            9t        d      }t        dg d      }t        dg d      }t        dg d      }	 t        dd      j                         }t        j                  d|      }|rt!        |j#                  d            dz  nd }|j                  d       d!k(  xr |j                  d"      d#k(  }t        d$      }t        |      r|t        |      z
  j                         nd }t'        9fd%d&D              } 9j                  dd      }!| |!z   }"9j                  d'd      9j                  d(d      z   }#t)        |j                  d)i       j                  d*            }$t)        |j                  d+            }%t	        d,      D cg c]  }|d   	 }&}t)        |&      xr t+        d- |&D              }'| xs t)        |#      xs |"dkD  xr |d uxr |d.kD  }(t-        ||(      })t        d/      }*|d0   d1   |d0   d2   z   }+|+dkD  xr |*dk(  },|,rd3nt-        d4d5|* 6      }-t        d7      }.t        d8      }/t        d9      }0t-        |$xr |%d5      }1|'rd:nd;}2|r|$r|%r|s|,rd<}3n|(rd=}3n
|dk(  rd>}3nd?}3g }4|(rF|s|4j/                  d@       |#r|4j/                  |# dA       |"dkD  r||d.kD  r|4j/                  dB       |r
|"dk(  r|#sdC}5n|(rdD}5ndE}5|$r|%s|4j/                  dF       |r|4j/                  ||z    dG       |'r|4j/                  dH       |,r|4j/                  dI       |r|'r|s|4j/                  | dJ       |4s|4j/                  dK       |$r|%rdLnd<}6t               }|3dMj1                  |4      |d|t        dN      |j                  d
d      |j                  dOd      |j                  dPd      |j                  dQd      | j                  dRd      t        dS      dTi dU|dV|j                  d
i       j                  dd      dP|j                  dWi       j                  dd      dX|j                  dYi       j                  dd      d|j                  di       j                  dd      dZ|j                  dZi       j                  dd      d[|d\|	d]|
d^|d_|d`|da|j3                         D 78ci c]  \  }7}8|7|8d    c}8}7db|dc|dd|de|d|j                  d df      dgz   |j                  d"df      z   |j                  dh      |j                  di      |||"9j                  d'd      9j                  d(d      z   t        dj      t        dk      9|)|5dl|0|/|.|/|.z
  |0|.z
  dm|t        dn      do|j                  dWi       j                  dd      |-|,rdIndp|+|*dqdrdrt        ds      dtt        du      t        dv      t        dw      dtdx|'rdyndz|2|j                  d df      |j                  d df      dgz   |j                  d"df      z   |&d{|6|1|j                  d)i       |%|j5                         d|d}S c c}w # t$        $ r d }Y w xY wc c}w c c}8}7w )~NzsSELECT graphiti_status,COUNT(*),MIN(updated_at),MAX(updated_at) FROM graphiti_import_queue GROUP BY graphiti_statusr   r9         )countoldestnewestz{SELECT MIN(COALESCE(next_attempt_at,updated_at)),MAX(completed_at) FROM graphiti_import_queue WHERE graphiti_status<>'done'zeSELECT MAX(COALESCE(completed_at,updated_at)) FROM graphiti_import_queue WHERE graphiti_status='done'z*SELECT COUNT(*) FROM graphiti_import_queuedonerv   zSELECT COUNT(*) FROM graphiti_import_queue WHERE graphiti_status IN ('queued','review_required') AND COALESCE(graphiti_release,0)=0zySELECT COUNT(*) FROM graphiti_import_queue WHERE graphiti_status='retry_wait' AND COALESCE(TRIM(last_error_class),'')<>''zSELECT COUNT(*) FROM graphiti_import_queue WHERE graphiti_status='retry_wait' AND COALESCE(TRIM(last_error_class),'')<>'' AND (next_attempt_at IS NULL OR datetime(replace(next_attempt_at,'T',' ')) <= datetime('now'))zmSELECT COUNT(*) FROM graphiti_import_queue WHERE graphiti_status='queued' AND COALESCE(graphiti_release,0)<>0
processingiQ zHSELECT transcript_status,COUNT(*) FROM videos GROUP BY transcript_statusz4SELECT status,COUNT(*) FROM e2e_jobs GROUP BY statusz+SELECT MAX(created_at) FROM knowledge_unitsz#youtube-research-e2e-worker.service)ActiveStateSubStateMainPIDExecMainStartTimestampExecMainStatuszobsidian-graphiti-import.timer)r{   LastTriggerUSecNextElapseUSecRealtimez obsidian-graphiti-import.service)r{   r|   r   z2/etc/systemd/system/obsidian-graphiti-import.timerutf-8)encodingzOnCalendar=\*:0/(\d+)<   r{   ro   r|   runningz>SELECT MAX(completed_at) FROM e2e_jobs WHERE status='complete'c              3   B   K   | ]  }j                  |d         yw)r   N)get)r1   statuse2es     r&   r3   zp18_status.<locals>.<genexpr>n   s     bfq!bs   )queuedsupadata_retrysupadata_quota_waitblocked_transcript_fetch discarded_after_processing_errorgraphiti_healthready	reachablez;SELECT DISTINCT graphiti_release FROM graphiti_import_queuec              3   8   K   | ]  }t        |      d k(    yw)rH   N)strr0   s     r&   r3   zp18_status.<locals>.<genexpr>u   s     /TA/Ts   i  znSELECT COUNT(*) FROM knowledge_units WHERE datetime(replace(created_at, 'T', ' ')) >= datetime('now','-1 day')r[   rW   rX   rl   TF)rq   zSELECT COUNT(DISTINCT e.youtube_id) FROM e2e_jobs e JOIN videos v ON v.youtube_id=e.youtube_id WHERE e.status='blocked_transcript_fetch' AND v.transcript_status='retry'z]SELECT COUNT(DISTINCT e.youtube_id) FROM e2e_jobs e WHERE e.status='blocked_transcript_fetch'zMSELECT COUNT(DISTINCT youtube_id) FROM videos WHERE transcript_status='retry'rm   rn   u   GESTÖRTu
   AUFFÄLLIGPAUSIERTu   LÄUFTzYouTube-Worker nicht aktivu$    aktuelle Worker-/Fetch-Fehlerfälleu[   letzte erfolgreiche YouTube-Verarbeitung liegt länger zurück als die erwartete Aktivitätu&   BETRIEBSBEREIT / KEINE FÄLLIGE ARBEITu   YouTube-Worker gestörtu-   fällige/laufende E2E-Arbeit wird verarbeitetz$Graphiti oder Neo4j nicht erreichbaruR    technische Graphiti-Queue-Arbeiten kritisch/fällig; Governance-Blockaden separatu+   FREIGABE GESPERRT – BEWUSSTE SCHUTZSPERREu1   KEINE NEUEN WISSENSPUNKTE TROTZ QUELLENAKTIVITÄTuI    Graphiti-Import-Queue-Einträge offen; Freigabe ist absichtlich gesperrtuB   Verarbeitung und Abhängigkeiten ohne nachgewiesene Auffälligkeitgesundu    · SELECT COUNT(*) FROM videospartialretrynonefiles_totalSELECT COUNT(*) FROM sources)youtube_videostranscripts_donetranscripts_partialtranscripts_retrytranscripts_noneobsidian_documentssource_channelstotal	processed
retry_waitwaitingr   failed_permanentbacklogoldest_openlast_successoldest_open_age_secondslast_success_age_secondscriticalstatus_countsgovernance_blockedtechnical_retrytechnical_retry_duetechnical_queuedunknown/r}   r~   zLSELECT MIN(updated_at) FROM e2e_jobs WHERE status IN ('queued','processing')zSELECT error_message FROM e2e_jobs WHERE error_message IS NOT NULL AND TRIM(error_message)<>'' ORDER BY updated_at DESC LIMIT 1)rA   process_statusmain_pidservice_startedr   r   	open_workretry_countr   
last_errorjob_status_countsr   status_reason)transcript_status_retry_videosworker_fetch_error_casesoverlap_video_idsworker_only_cases$transcript_retry_without_worker_case$SELECT COUNT(*) FROM knowledge_unitszNkein fachlich eindeutig bestimmbarer Knowledge-Unit-Arbeitsvorrat nachgewiesenur   keine Knowledge Unit im echten rollierenden 24-Stunden-Fenster; letzter Timestamp liegt außerhalb dieses Fensters)last_knowledge_unitrU   unprocessed_workretry_stater   r   upstream_activity_24hknowledge_activity_24hznoch nicht eindeutig zuordenbarzaSELECT COUNT(*) FROM graphiti_import_queue WHERE source_type='youtube' AND graphiti_status='done')wissenspunkte
goldwissengraphiti_verarbeitetzLSELECT COUNT(*) FROM knowledge_units WHERE source_identity LIKE 'obsidian:%'zSELECT COUNT(*) FROM knowledge_units WHERE source_identity LIKE 'obsidian:%' AND source_version_id IN (SELECT source_version_id FROM reconciliation_decisions WHERE approval_state='ACCEPTED')zjSELECT COUNT(*) FROM graphiti_import_queue WHERE source_type='obsidian-general' AND graphiti_status='done'YouTubeObsidianzFREIGABE GESPERRT / STANDBYBETRIEBSBEREIT)r   status_codequeue_timerimporter_servicegraphiti_release)r   r   r   neo4j_reachable
checked_at)r   reasoncadence_secondsderived_from_timeractivitysource_inventoryqueueyoutube_workerretry_comparisonknowledge_processingcontributionsingle_writergraphiti_neo4j)r   nowr   rM   r*   r'   r   rh   rP   total_secondsdictrE   openreadresearchintgroupr@   r<   boolallrr   appendjoinr_   	isoformat):oinmr   qrowsrq	open_rowsr   r   queue_total
queue_openr   r   r   r   r   
oldest_agelast_success_agequeue_critical
transcript	latest_kuworkertimerr   
timer_textmatch_cadencecadenceworker_activeworker_last
worker_agee2e_duee2e_processinge2e_active_worke2e_current_errorsgraphiti_okneo4j_okrelease_valuesrelease_lockedworker_problemworker_statusknowledge_activityupstream_activityknowledge_criticalknowledge_statusretry_overlapretry_worker_idsretry_video_idsgraph_statussingle_statusoverallr   worker_idle_reasonhealthkvr   s:                                                            @r&   
p18_statusr  J   sT   X\\"C
  H  IE@EF1qtQqT1Q4166FAF  T  UI#,	!Q$K  A  BLDEK155+//::J
    e  f  X  YO  !{  |  M  NH@J;@WJ{++::<]aJGQR^G_c*\22AACei')  /?/A  quu\Z\G]GaGabijkGlmnGn  H_s}  FJ  tJ  H_  OY  Z_  O_    eu  }A  eA  e~  FV  W\  F\  e~  ak  l~  a~NGfghJWKLMCCDI:  <J  KF
45o
pEABmnLV]^cce
ii 8D2?M''*+B.T **]+X5[&**Z:PR[:[MXYK@J;@WJ{++::<]aJb0abbG77<*Nn,Oww9!<SWWEghi=jjQUU,R044W=>K!%%$%H")*g"hiQAaDiNi'TC/T^/T,TN%%  N$/A*B  NYZGZ  HM_iqu_u  HM  {E  FM  {MNn=M   P  Qz*=9HZ<PQf<gg)!+E0BA0E0U}T5^pZp7r  E  FM|}klO{7x?L +&M8~Qc		QFfmm,HIv}}0B/CCg-hiQ:#9j>PRXR_R_  a~  SA-6HC	4Jh6\(]v}}(;>N(N'O  Pb  &c  dv}}%RS6==)\]n^V]]j\  Zc  Ld  >e6==!ef"x8ZFHF 3g  dD  PX+23P+Qeoesestz{|e}  U_  Uc  Uc  dm  no  Up  EO  ES  ES  T[  \]  E^  r|  r@  r@  AG  HI  rJ  `a  `e  `e  fs  tu  `v  IP  Qo  Ip  q ^
w{  ^
;quuVB/?/C/CGA/N  ^
wWXW\W\]ijlWmWqWqryz{W|  ^
  ~G  HI  HM  HM  NV  WY  HZ  H^  H^  _f  gh  Hi  ^
  jv  wx  w|  w|  }I  JL  wM  wQ  wQ  RY  Z[  w\  ^
  ]o  pq  pu  pu  vH  IK  pL  pP  pP  QX  YZ  p[  ^
  \e  fp  ^
  q~  J  ^
  KY  Zf  ^
  g@  AK  ^
  Lf  gw  ^
  xB  CQ  ^
  Ra  {|  {B  {B  {D  bE  tw  tu  vw  cd  ef  gn  eo  co  bE  ^
  FZ  [m  ^
  n  @	O	  ^
  P	e	  f	y	  ^
  z	L
  M
]
  ^
DV\V`V`anoxVyz}V}  E  I  I  JT  U^  _  W_  kq  ku  ku  v  k@  SY  S]  S]  ^v  Sw  GR  nx  ET  cf  cj  cj  kE  FG  cH  IL  IP  IP  Qs  tu  Iv  cv  EL  M[  E\  jq  rs
  jt
  IL  Vc  tF  G;Jfv  LY  n~  L  nL  tC  DQ  tQ  R4=PWX~P  Td  st  sx  sx  yE  FH  sI  sM  sM  NU  VW  sX  br  {M  Dw  SG  ar  L	^	  _	1R  aB  Za  bE  ZF  !G  dk  lz  d{  IP  QQ	  IR	  j	q	  r	^  j	_  S`  aAO =Ue  uB  QV  QZ  QZ  [h  ir  Qs  GW  G[  G[  \i  js  Gt  ux  Gx  yI  yM  yM  NX  Yb  yc  Gc  wE  F!'lUVUZUZ[lmoUp  DL  Z]  Zg  Zg  Zi  j
 
e G8   j\ bEs$   _%A_* -_< `*_98_9c                    t        d      }t        d      }d}d}ddt        d      t        d      t        d      t        d	      d
}t        d      }i }	|r6|d   \  }
}}}|
rt        d|
f      nd }d|
|||||rt        d|f      ndddd	}	|d|||||j                  di       j                  dd      |j                  d      r"|j                  di       j                  dd      nd|j                  d      r"|j                  di       j                  dd      nd|j                  d      r"|j                  di       j                  dd      nd| j                  dd      t        d      || j                  dd      dddd gg d!d"|	d#S )$Nr   r   znicht nachgewiesenu*  GRAPH_GOLD nicht belastbar bestimmbar: produktive knowledge_units enthält weder unit_status noch einen nachgewiesenen VALID_GRAPH_GOLD-Status; reconciliation_decisions.approval_state='APPROVED' ist nur die vorhandene Reconciliation-Freigabe; promotion_policy ist bei allen 144 Entscheidungen leer.FzMSELECT COUNT(*) FROM reconciliation_decisions WHERE approval_state='ACCEPTED'zMSELECT COUNT(*) FROM reconciliation_decisions WHERE approval_state='APPROVED'z[SELECT COUNT(*) FROM reconciliation_decisions WHERE COALESCE(TRIM(promotion_policy),'')<>''zOSELECT COUNT(*) FROM knowledge_units WHERE knowledge_unit_identity='__source__')unit_status_column_presentvalid_graph_gold_code_foundaccepted_decisionsapproved_decisionspromotion_policy_nonemptylegacy_dummy_identity_countzSELECT video_id, updated_at, graphiti_status, knowledge_unit_identity FROM graphiti_import_queue WHERE graphiti_status='done' AND video_id IS NOT NULL ORDER BY updated_at DESC LIMIT 1r   z+SELECT title FROM videos WHERE youtube_id=?r   zDSELECT COUNT(*) FROM knowledge_units WHERE knowledge_unit_identity=?zMNeo4j-Wirkung dieser einzelnen Quelle derzeit nicht eindeutig nachverfolgbar.)	typevideo_idtitle	timestampgraphiti_statusknowledge_unit_identityrU   
gold_unitsneo4j_source_effectuk   eindeutige Einzelobjekte: videos; aktuell als YouTube-Videos ausgewiesen, nicht mit Quellenkanälen addiertr   ry   r   labelsEntityrelationshipsr   Episodicr   r   r   u4   Evidenzbewertung noch nicht vollständig verfügbar.u   unabhängige Belegquellenz#systematische Widerspruchserkennung)	GESICHERTu
   BESTÄTIGT	PLAUSIBELUNSICHERu   WIDERSPRÜCHLICH)notemissingclasses)informationsquelleninformationsquellen_definitionr   gold_wissenspunktegold_definition
gold_prober   
entitaetenbeziehungenepisodenobsidian_dateienquellenkanaeleherkunft	qualitaetletzte_quelle)r'   r*   r   )r   r   r   rS   unitsgoldr;  r<  lastlatestvidtsr   identityr(  s                  r&   knowledge_viewrL     s   01F
8
9E 
D AO-2QVls  uD  mE  [b  cr  [s  PW  Xu  Pv  U\  ]n  Uo  pJ	  K  
LDF#AwBvhORgCSFKX\ C"_e  AI  {C  \c  dj  lt  kv  \w  IJ  Xl  CR  S"(  Kx  IN  dh  {J  Xb  z{  z  z  @O  PR  zS  zW  zW  X^  _`  za  UV  UZ  UZ  [f  Ug  op  ot  ot  u}  ~@  oA  oE  oE  FN  OP  oQ  mn  ij  in  in  oz  i{  }~  }B  }B  CR  SU  }V  }Z  }Z  [b  cd  }e  AB  vw  v{  v{  |G	  vH	  NO  NS  NS  T\  ]_  N`  Nd  Nd  eo  pq  Nr  N	O	  c	d	  c	h	  c	h	  i	v	  w	x	  c	y	  K
R
  S
q
  K
r
  IO  [\  [`  [`  an  op  [q  ~
r  G}  Id  eJ  HK  VZ  [  lr  s  sri   c                     t        t        d   t        t        d      } t	        t        d         }t        t        d         }t        t        d         }t               }t        t        d   t        d   t        d   |      }t        |||||      \  }}|j                  d	      xs i }|j                  d
      rt        ||j                  d
            ng i i d}	|j                         D 
ci c]  \  }
}|
dk7  s|
| }}
}t        t        d         }|j                  di       }t        | ||      }t        | |||      }i dddt!        j"                  t$        j&                        j)                         d|d|d| d|d|d|d|d|d|d|d|j                  dd      dkD  ||	dd|j                  dg       d |d!|S c c}}
w )"Nr   d   r   r   r   r   r   r   last_request
request_id)edgesphasesgaterequests_internalr   r   schema_versionz2.0r   overall_statuswarningsobsidianimportrequestsusageneo4jmodelsgraphiticurrent_runactive_request_countr   )ro   requestdetailerrorsknowledge_systemp18)rX  r   ALLOWDENYimporterrZ  eventsr\  r]  r   r   r
   r_   r   rL  r  r   r   r   rM   r   )r   r   r   er   r   stwrG  rb  r  r  public_usageblockgh	knowledgere  s                    r&   snapshotrq     sw   s7|E$s+AxN8K/LQPXY\]jYkPlapvwz  |I  xJ  qKno  OT  OV  MN  Z`  ad  ex  ay  z}  ~P  zQ  RU  Vk  Rl  mn  Zo  XY  v~  @  AB  CD  EF  GH  vI  qu  qs  tu	
~		$"DY]YaYabnYo^Adhh|>T-U  A  KM  UW  vXf!"E#!Aa1D.D!A#ELE
C$
%E!%%0A"*ErQ_`abcdeQfylvwxyz{|}~lhk EU  E<X\\0J0T0T0V  EWghj  Ekuvw  E  yC  DE  E  FN  OP  E  Q[  \]  E  ^e  fr  E  sz  {|  E  }E  FG  E  HR  SU  E  Va  bg  E  hu  @A  @E  @E  F\  ]^  @_  `a  @a  lp  z@  vA  E  BJ  KL  KP  KP  QY  Z\  K]  E  ^p  qz  E  {@  AD  E  E Fs   -G
;G
c                 L    t        j                  | d      j                         S )NF)ensure_ascii)jsondumpsencode)datas    r&   	safe_jsonrx     s    DJJt?FFHHri   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)Handlerc                      y )Nr/   )selfas     r&   log_messagezHandler.log_message   s    ri   c                 *   	 t        | j                        j                  }|dk(  r4t        dddd      }| j                  d       | j	                  dd       n|dk(  rb| j
                  d	   d
vr| j                  d       y t        dd      j                         }| j                  d       | j	                  dd       n|dk(  s|j                  d      rTt        |      }|| j                  d       y |\  }}t        |      }| j                  |       | j	                  dd       n+|dk(  r`t        t        j                  j                  t        d      d      j                         }| j                  d       | j	                  dd       n|dk(  rd}| j                  d       nt               }|||d   |d   d|d   d   i|d   |d   |d   |d   |d   |d   d |d   j                  dg       |d!   d"|d#   |d$   d%j                  |      }|| j                  d       y t        |      }| j                  d       | j	                  dd       | j	                  d&d'       | j	                  d(t!        t#        |                   | j%                          | j&                  j)                  |       y # t*        $ rQ | j                  d)       | j	                  dd*       | j%                          | j&                  j)                  d+       Y y w xY w),Nz/healthTzknowledge-pipeline-aggregator)okservice	read_only   Content-Typeapplication/json; charset=utf-8z/admin/knowledge-ingestr   )	127.0.0.1z::1i  z>/opt/struktur/agent-solutions-cockpit/knowledge_questions.htmlrbztext/html; charset=utf-8z/api/knowledge/ingest/history/api/knowledge/ingest/  r   zdashboard.htmlz/favicon.icori      rX  rY  r   rZ  r[  r\  r]  rV  rW  )rV  rW  rc  )rZ  ri  r   r_  )z/v1/summaryz/v1/dashboardz/v1/obsidianz
/v1/importz/v1/import/queuez/v1/requestsz	/v1/usagez	/v1/neo4jz
/v1/modelsz/v1/warningsz
/v1/errorsz/v1/run-blockz/v1/current-runCache-Controlno-storeContent-Length  application/jsons-   {"ok":false,"error":"aggregator_unavailable"})r   pathrx  send_responsesend_headerclient_address
send_errorr   r   
startswithr   osr   BASErq  r   r   lenend_headerswfilewriter@   )r|  r  rawresultr   rw  ss          r&   do_GETzHandler.do_GET   s7   	n$))$))DYD3R_cdegkgygyz}g~  AE  AQ  AQ  R`  aB  AC00&&q)1DDdooVYFZ[aYZ^_ddfhlhzhz{~h  BF  BR  BR  Sa  b|  B}66$//Jb:c!$'>$//#"6v!' DYt_d>P>PQ\>]_c_o_op~  @a  `bsd+;<TBGGI4K]K]^aKbdhdtdt  vD  E_  e`~%++C0*!AUVWaUbpqrzp{  QX  YZ  [c  Yd  el  Ym  Pn  ~  @J  ~K  XY  Za  Xb  op  qx  oy  GH  IQ  GR  tu  vF  tG  ST  U_  S`  ba  {|  }G  {H  {L  {L  MW  XZ  {[  ef  go  ep  oq  BC  DO  BP  cd  er  cs  $t  $x  $x  y}  $~d< 4VdOT%7%7%<d>N>N~^  ?A_Z89I9IJZ[^_bcf_g[h9ijnjzjzj|  ~B  ~H  ~H  ~N  ~N  OR  ~S 	ns#D$4$4^DV$WX\XhXhXjkokukuk{k{  }m  ln	ns(   A?J8 A3J8 6D1J8 (BJ8 8ALLc           	         	 t        | j                        j                  j                  d      r?t        | j                        j                  }t        | j                  j                  dd            }|dk  s|dkD  r| j                  dd       y t        |t        | j                        | j                  j                  |      | j                  d         }|| j                  d       y |\  }}t        |      }| j                  |       | j                  d	d
       | j                  dt        t!        |                   | j#                          | j$                  j'                  |       y t        | j                        j                  dk7  r| j                  d       y t        | j                  j                  dd            }|dk  s|dkD  r| j                  dd       y t)        j*                  | j                  j                  |      j-                  d            }t/        |      }t        |      }| j                  d       | j                  d	d
       | j                  dd       | j                  dt        t!        |                   | j#                          | j$                  j'                  |       y # t0        $ r}t        dt        |      i      }| j                  d       | j                  d	d       | j                  dt        t!        |                   | j#                          | j$                  j'                  |       Y d }~y d }~wt2        $ r t        ddi      }| j                  d       | j                  d	d       | j                  dt        t!        |                   | j#                          | j$                  j'                  |       Y y w xY w)Nr  r  rH   r   i  i  zinvalid payload sizer  r  r  z/api/knowledge/ask  i   i  zinvalid request bodyr   r  r  r  errorr  knowledge_query_unavailabler  )r   r  r  r   headersr   r  r   r   rfiler   r  rx  r  r  r   r  r  r  r  rt  loadsdecodeknowledge_ask
ValueErrorr@   )	r|  r  lengthr  r   rw  r  payloadexcs	            r&   do_POSTzHandler.do_POST   s`   	n		"''223KLdii(--c$,,:J:JK[\_:`6av19xDZ0[\b"4T\\(:4::??6;RSWSfSfghSij>$//#"6v!' DYt_d>P>PQ\>]_c_o_op~  @a  `b  dh  dt  dt  uE  FI  JM  NQ  JR  FS  dT  VZ  Vf  Vf  Vh  jn  jt  jt  jz  jz  {~  j  AG		"''+??$ft||''(8=>F{fun%;<fJJtzzv6==gFGG )F&!Cs#T%5%5nEf%g_Z8$:J:JK[\_`cdg`h\i:jlpl|l|l~  AE  AK  AK  AQ  AQ  RU  AV 	Y73s8,-Ct/A/A#/FHXHXYghzH{  ~B  ~N  ~N  O_  `c  dg  hk  dl  `m  ~n  pt  p@  p@  pB  DH  DN  DN  DT  DT  UX  DY  DY 	n7#@ABCDDVDVWZD[]a]m]mn|  ~P  ^Q  SW  Sc  Sc  dt  ux  y|  }@  yA  uB  SC  EI  EU  EU  EW  Y]  Yc  Yc  Yi  Yi  jm  Yn	nsB   BJ> AJ> -BJ> 03J> $AJ> &CJ> >	O"BMBO"!O"c                 &    | j                  d       y Nr  r  r|  s    r&   do_PUTzHandler.do_PUT   s    dooc*ri   c                 &    | j                  d       y r  r  r  s    r&   do_PATCHzHandler.do_PATCH   s    ,ri   c                 &    | j                  d       y r  r  r  s    r&   	do_DELETEzHandler.do_DELETE   s    -ri   N)	__name__
__module____qualname__r~  r  r  r  r  r  r/   ri   r&   rz  rz     s    "n.n, +,-ri   rz  __main__)r  i!  )r/   )FF)8rt  r  r   r   http.serverr   r   urllib.parser   r   r:   r   knowledge_modesr   r  sources.obsidianr	   rX  sources.importer_dbrh  sources.requests_dbrZ  sources.processing_eventsri  r
   sources.neo4jr\  sources.modelsr]  run_block_sourcer   status_logicr   manual_ingestr   r   r  dirname__file__r  r   rf  rg  r'   r*   rE   rP   rh   rr   r  rL  rq  rx  rz  r  serve_foreverr/   ri   r&   <module>r     s     ' C !   0 0 3 3 G * , 1 ! 1WW__X"2_  mq  @q  @}  Rt  Hn  Ec  pn  o*
_Bs E I1.$ 1.d Z,-?HVVXri   