
    'jQ                        U 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mZ ddlm	Z	 ddl
mZ ddlZddlZddlmZmZ ddlmZ ddlmZ dd	lmZmZmZmZmZmZmZmZ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, ddl-m.Z.m/Z/m0Z0 ddl1m2Z2 ddl3m4Z4m5Z6m7Z7m8Z9m:Z;m<Z= ddl>m?Z? ddl@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZM ddlNmOZP ddlQmRZR ddlSmTZT ddlUmVZV dZWdZXdZYdZZdZ[dZ\de\ Z]de\ d Z^d!e\ Z_d"e\ d#Z`d$e\ Zad%e\ d&Zbd'e^z   d(z   Zcd'e`z   d(z   Zdd'ebz   d(z   Zed)efd*egfd+Zhd,efd*egdz  fd-Zie?d.         Zj e/eRejjk        ejjl        /          Zmemn                    e'ejo        p                    d0d1          gd1gd1g2            ejq        d3d14          Zri Zsetegeju        f         evd5<   	 	 	 	 dd6ewdz  d7egdz  d8egdz  d9ejx        dz  d*e.f
d:Zydd;d<egd=ewd>e.d?ezd@egdAegdz  d*dfdBZ{em|                    dCe9dDgE           em|                    dFe=dDgE           em|                    dGe6dHgE           em|                    dIe;dDgE           dJe)d*e+fdKZ}em|                    dLe}dHgE           em|                    dMeAdDgE           em|                    dMeDdHgE           em|                    dNeCdHgE           em|                    dOeMdPgE           em|                    dNeBdQgE           em|                    dReJdDgE           em|                    dReEdHgE           em|                    dSeLdTgE           em|                    dUeFdHgE           em~                    dV          ddW            Zem~                    dX          ddY            Z e	e          j        dZ         Zejo        p                    d[ eged\z  d]z  d.z  d^z                      Z e	e          j                            d_d_`           em                    da e%db dcddee                     ddgegd*egfdhZ e            Zep                    diej          d*efdk            Ze                    diej           edfl          fdmegd*efdn            Zem                    doe           dpeet         d*egfdqZd<egd*egfdrZdJe)d*e+fdsZem|                    dtedDgE           dJe)d*e,e+z  fduZem|                    dvedDgE           dwegd<egd7egdz  d6ewdz  d*df
dxZer                    dy          ddwegdzetd{etdz  d*dfd|            Zer                    d}          dwegd*dfd~            Zer                    d          dwegd*dfd            Zer                    d          dwegd\etd*dfd            Z ej        erem          Zmedk    rddlZ ej        ddejj        d_           dS dS )uJ   Chanakya ASGI server — A2A + REST query + auth + conversation endpoints.    N)datetime)Path)Any)FastAPIForm)HTMLResponse)to_xml)
BodyButtonr   H2HtmlInputOptionPSelectStrong)logger)app_factory)CORSMiddleware)Request)JSONResponseStreamingResponse)RequestContextmake_metadata_aware_app_IMPERSONATION_FILE)get_username_from_token)close_auth_dbget_current_userinit_auth_dbloginupsert_userverify_token)AGENT_REGISTRY)create_conversation_handlerdelete_conversation_handlerget_conversation_handlerget_conversations_handlerget_messages_handlerget_user_bookmarks_handlerappend_to_history_cacheload_conversation_historysave_messagesave_message_handlerserialize_historytoggle_bookmark_handler!update_conversation_title_handler)ensure_poolchanakya)AgentQueryResponse)USERSzjSELECT COUNT(*) AS total_contracts, SUM(initial_contract_value) AS total_initial_budget FROM ts4_contractsa  SELECT COALESCE(SUM(change_to_prices), 0) AS accepted_revenue, COALESCE(SUM(change_to_days), 0) AS accepted_days FROM ts4_quotations INNER JOIN ts4_contracts AS c USING (contract_number) WHERE status IN ('Accepted_No_CBS', 'Accepted', 'Acc_with_Instruction')a/  SELECT COUNT(*) AS total_quotations, COALESCE(SUM(change_to_prices), 0) AS revenue, COALESCE(SUM(change_to_days), 0) AS accepted_days, COUNT(DISTINCT contract_number) AS active_contracts FROM ts4_quotations WHERE status IN ('Submitted', 'In_Review', 'Assessment', 'Internal_Review', 'Revised_Quotation')zISELECT COUNT(*) AS total_ew FROM ts4_early_warnings WHERE status = 'Open'z_SELECT COUNT(*) AS total_nce FROM ts4_nce WHERE reply_date IS NULL AND quotation_number IS NULLzP('Submitted', 'In_Review', 'Assessment', 'Internal_Review', 'Revised_Quotation')a,  SELECT COUNT(*) AS total_quotations, COALESCE(SUM(q.change_to_prices), 0) AS ce_revenue, COALESCE(SUM(q.change_to_days), 0) AS ce_days FROM ts4_quotations AS q WHERE q.change_to_prices IS NOT NULL AND q.change_to_prices != 0 AND q.change_to_days IS NOT NULL AND q.change_to_days != 0 AND q.status IN a  SELECT q.area, q.title, q.change_to_prices, q.change_to_days, q.quotation_date, q.contract_number FROM ts4_quotations AS q WHERE q.change_to_prices IS NOT NULL AND q.change_to_prices != 0 AND q.change_to_days IS NOT NULL AND q.change_to_days != 0 AND q.status IN z@ ORDER BY q.change_to_prices DESC, q.change_to_days DESC LIMIT 3zSELECT COUNT(*) AS total_quotations, COALESCE(SUM(q.change_to_days), 0) AS ce_days FROM ts4_quotations AS q WHERE q.change_to_prices IS NULL AND q.change_to_days IS NOT NULL AND q.status IN zSELECT q.area, q.title, q.change_to_days, q.quotation_date, q.contract_number FROM ts4_quotations AS q WHERE q.change_to_days IS NOT NULL AND q.change_to_days != 0 AND (q.change_to_prices IS NULL OR q.change_to_prices = 0) AND q.status IN z' ORDER BY q.change_to_days DESC LIMIT 3zSELECT COUNT(*) AS total_quotations, COALESCE(SUM(q.change_to_prices), 0) AS ce_revenue FROM ts4_quotations AS q WHERE q.change_to_prices IS NOT NULL AND q.change_to_prices != 0 AND (q.change_to_days IS NULL OR q.change_to_days = 0) AND q.status IN zSELECT q.area, q.title, q.change_to_prices, q.quotation_date, q.contract_number FROM ts4_quotations AS q WHERE q.change_to_prices IS NOT NULL AND q.change_to_prices != 0 AND (q.change_to_days IS NULL OR q.change_to_days = 0) AND q.status IN z) ORDER BY q.change_to_prices DESC LIMIT 3zSELECT c.contract_number, c.vendor, c.initial_contract_value FROM ts4_contracts c WHERE c.contract_number IN (   SELECT q.contract_number FROM (z) AS q )dreturnc                     | dS t          | d          r| j         d|                     d           S t          |           S )N day z%b %Y)hasattrr:   strftimestr)r6   s    E/var/www/html/ai-enterprise-brain/backend/chanakya/rt_agent/server.py	_fmt_dater@      sK    yrq% 0%//!**W--///q66M    vc                 <    | d S t          |           dz  }d|ddS )Ni@B    £z.1fM)float)rB   ms     r?   _fmt_budget_gbprH      s,    yta9A====rA   r3   )namedescriptionCORS_ALLOW_ORIGINS*)allow_originsallow_methodsallow_headersasgi)
async_modecors_allowed_origins_active_tasksconversation_id
user_emailpersonaprogress_queuec                 D    t          |pd|pd|           }|||_        |S )zBuild a ``RequestContext`` pre-loaded with typed runtime channels.

    Centralises all per-request deps setup so both the sync ``/query`` and the
    streaming ``/query/stream`` handlers share identical initialisation logic.
    r9   PM)rU   rolerT   )r   rW   )rT   rU   rV   rW   ctxs        r?   _make_run_contextr\      s?     #_'  C
 !+JrA   )errorquestionhistory_countdeps
start_timeendpointr]   c                    t          t          j                    |z
  dz            }d}d}d}	d}
d}d}|j        r|j        d         }t	          |                    dg                     }|                    dd          }|                    dd          }	|                    d          }
|                    d	          }|                    dg           }g }d}d}|j        rfd
 |j                            d          pg D             }|j                            d          pg dd         }|j                            d          pg }d}d}|j        D ]:}|d         dk    r,|                    d          }|                    d          } n;d |j        D             }|rt          |          nd}t          j
        	 d+i d| dd         d|d|d|j        pdd|j        d|d|j        d|d|d|	d|
d |d!|d"|d#|d$|d|d|d%|pdd&|r|n|rd'|z   nd(d)|d*|5  	 ddd           dS # 1 swxY w Y   dS ),u  Emit a single structured logfire record capturing the complete question flow.

    This log is emitted once per question — after the agent run completes — and
    contains everything that happened: which tools were called, what tatasteel
    returned, how many widgets were generated, and total duration.  Feed this
    record to an LLM to diagnose pipeline inconsistencies.
    i  r   r9   Nrowsexplanationsql_explanationgenerated_sqlrows_samplec                 :    g | ]}|                     d d          S )typeunknownget.0ws     r?   
<listcomp>z"_emit_flow_log.<locals>.<listcomp>   s&    ```15533```rA   data   stepask_ui_agentmarket_context
storylinesc                     g | ]
}|d          S )rt    )ro   rt   s     r?   rq   z"_emit_flow_log.<locals>.<listcomp>  s    ;;;TDL;;;rA   pipeline_summary | {question}r^      history_messagesrb   rU   z(anonymous)rT   tools_called
flow_stepstatasteel_rowstatasteel_business_summarytatasteel_sql_assumptionstatasteel_sql_querytatasteel_rows_sampletatasteel_rows_allui_widget_typesui_widgets_sampleui_widgets_allfinal_viz_typefinal_responsezerror: zno responser]   total_duration_ms)rz   )round_time	monotonictatasteel_resultlenrm   	ui_resultflow_log_extract_viz_typelogfirespanrU   rT   )r^   r_   r`   ra   rb   r]   duration_msr   r   r   r   r   r   tsr   r   r   rv   rw   rt   r}   r   s                         r?   _emit_flow_logr      s     **Z74?@@KN!# "  0"1%RVVFB//00%'VVM2%>%>"$&FF+<b$A$A! ff_55 "} 5 5VVFB//!#ON~ :``dn>P>PQW>X>X>^\^```!^//77=2rrB++F339r NJ  <>))!XX&677N,//JE *
 <;T];;;L:HP&~666bN	'
 
 
$3$
 '
 	

 ?3m
 ,,
 "\
 ==
 &~
 $>#=
 #<";
 0/
 43
 .-
 (
  ,+!
" &~#
$ &~%
& :'
( &-)
* *8l~~SX>ki%>O>O^k+
, e-
. &+/
  2 	3                 s   +H::H>H>z/auth/loginPOST)methodsz/auth/verify-tokenz/auth/meGETz/auth/upsert-userrequestc                   K   	 t                       d{V }n?# t          $ r2}t          j        d|           t	          ddid          cY d}~S d}~ww xY w	 t          j        |                    t                    |                    t                    |                    t                    |                    t                    |                    t                    |                    t                    |                    t                    |                    t                     |                    t"                    |                    t$                    |                    t&                    |                    t(                    |                    t*                    |                    t,                               d{V \  }}}}}}}	}
}}}}}}nL# t          $ r?}t          j        d|           t	          dt/          |          id          cY d}~S d}~ww xY wd	t0          t.          t0          f         fd
} ||           ||           ||          t3          |d         pd          }t	          |t3          |d         pd          t5          |d         pd          t3          |d         pd          t5          |d         pd          t5          |d         pd          dt5          |d         pd          |t5          |d         pd          t5          |d         pd          t5          |d         pd          t3          |d         pd          dt5          |d         pd          t3          |d         pd          t5          |d         pd          fd|	D             dt5          |
d         pd          dt5          |
d         pd          fd|D             dt5          |d         pd          t3          |d         pd          dfd|D             ddd          S )uY   GET /tatasteel/landing-metrics — returns live aggregate metrics for the landing screen.Nz&landing-metrics: DB connect failed: {}r]   zDatabase unavailablei  status_codez!landing-metrics: query failed: {}  r7   c                     d | D             S )Nc                 >    i | ]}|d          |d         |d         dS )contract_numbervendorinitial_contract_value)r   r   ry   )ro   rs     r?   
<dictcomp>zB_landing_metrics_handler.<locals>._make_lookup.<locals>.<dictcomp>W  sJ     
 
 

 	  H+*+,D*E# #
 
 
rA   ry   )rd   s    r?   _make_lookupz._landing_metrics_handler.<locals>._make_lookupV  s%    
 

 
 
 
 	
rA   total_initial_budgetr   accepted_revenueaccepted_daysrevenueactive_contracts)initialBudgetacceptedQuotationRevenueacceptedQuotationDayspendingQuotationRevenuependingQuotationDaysactiveContractstotal_contractstotal_ew	total_ncetotal_quotations)totalContractstotalInitialBudgetopenEarlyWarningopenNcestotalPendingQuotationspendingQuotationsRevenue
ce_revenuece_daysc                    g | ]}|d          pd|d         pdt          |d                   t          |d         pd          t          |d         pd                              |d         i                               d          t	                              |d         i                               d	                    d
S )titler9   areaquotation_datechange_to_daysr   change_to_pricesr   r   r   )r   r   
dateRaisedtimelineDays	budgetGbpcontractorNamecontractInitialBudget)r@   intrF   rm   rH   )ro   row	co_lookups     r?   rq   z,_landing_metrics_handler.<locals>.<listcomp>z  s         25W1C14V1B1:3?O;P1Q1Q14S9I5J5Oa1P1P16s;M7N7SRS1T1T1:sCT?UWY1Z1Z1^1^_g1h1h1@sSdOegiAjAjAnAn  pH  BI  BI  2J  2J   rA   )count
revenueGbpdayscardsc                 `   g | ]}|d          pd|d         pdt          |d                   t          |d         pd                              |d         i                               d          t                              |d         i                               d                    d	S )
r   r9   r   r   r   r   r   r   r   )r   r   r   r   r   r   )r@   r   rm   rH   )ro   r   	tl_lookups     r?   rq   z,_landing_metrics_handler.<locals>.<listcomp>  s     
 
 
  25W1C14V1B1:3?O;P1Q1Q14S9I5J5Oa1P1P1:sCT?UWY1Z1Z1^1^_g1h1h1@sSdOegiAjAjAnAn  pH  BI  BI  2J  2J 
 
 
rA   c                 `   g | ]}|d          pd|d         pdt          |d                   t          |d         pd                              |d         i                               d          t                              |d         i                               d                    d	S )
r   r9   r   r   r   r   r   r   r   )r   r   r   r   r   r   )r@   rF   rm   rH   )ro   r   	bd_lookups     r?   rq   z,_landing_metrics_handler.<locals>.<listcomp>  s     
 
 
  25W1C14V1B1:3?O;P1Q1Q16s;M7N7SRS1T1T1:sCT?UWY1Z1Z1^1^_g1h1h1@sSdOegiAjAjAnAn  pH  BI  BI  2J  2J 
 
 
rA   )cotlbd)overviewpipeline	decisions)_ensure_db_pool	Exception_logr]   r   asynciogatherfetchrow_LM_Q_CONTRACTS_LM_Q_ACCEPTED_LM_Q_PENDING_LM_Q_OPEN_EW_LM_Q_OPEN_NCE_LM_Q_CO_COUNTfetch_LM_Q_CO_CARDS_LM_Q_TL_COUNT_LM_Q_TL_CARDS_LM_Q_BD_COUNT_LM_Q_BD_CARDS_LM_Q_CO_CONTRACTORS_LM_Q_TL_CONTRACTORS_LM_Q_BD_CONTRACTORSr>   dictrF   r   )r   poolexc	contractsacceptedpendingopen_ewopen_nceco_countco_cardstl_counttl_cardsbd_countbd_cardsco_contractorstl_contractorsbd_contractorsr   initial_budgetr   r   r   s                      @@@r?   _landing_metrics_handlerr  6  s     P$&&&&&&&& P P P
;SAAAW&<=3OOOOOOOOOPB
 .MM/**MM.))MM-((MM-((MM.))MM.))JJ~&&MM.))JJ~&&MM.))JJ~&&JJ+,,JJ+,,JJ+,,
 
 
 
 
 
 
 
		
x'8h(HhNNN"  B B B
6<<<Wc#hh/SAAAAAAAAAB
d39o 
 
 
 
 ^,,I^,,I^,,I9%;<ABBN)7).x8J/K/Pq)Q)Q),Xo-F-K!)L)L).wy/A/FQ)G)G),W_-E-J)K)K),W5G-H-MA)N)N
 
 *-Y7H-I-NQ)O)O)7),WZ-@-EA)F)F),Xk-B-Ga)H)H),W5G-H-MA)N)N).wy/A/FQ)G)G
 
 "(+=">"C!DD#H\$:$?a@@!(9"5":;;     (  	 $ "(+=">"C!DD!(9"5":;;
 
 
 
  (
 
 
	 " "(+=">"C!DD#H\$:$?a@@
 
 
 
  (
 
 
	 E2
 2
#D D D D Ds9    
A'AAAFG# #
H,-4H'!H,'H,z/tatasteel/landing-metricsz/conversationsz$/conversations/{conversation_id:int}z*/conversations/{conversation_id:int}/titlePUTDELETEz-/conversations/{conversation_id:int}/messageszG/conversations/{conversation_id:int}/messages/{message_id:int}/bookmarkPATCHz/users/me/bookmarksstartupc                    K   t           j                            dd          } 	 t          j        d           t                       d{V  t          j        d           n@# t          $ r3}t          j        d|           t          j        d           Y d}~nd}~ww xY wt          j        d           t          j        d	|            t          j        d
|            t          j        d|            t          j        d|            t          j        d|            t          j        d|            t          j        d|            dS )z4Initialize auth database and display startup banner.CHANAKYA_PORT8010z'Initializing authentication database...Nu*   ✅ Auth database initialized successfullyu*   ❌ Failed to initialize auth database: {}zDAuthentication endpoints will not work until database is configured!z
  Chanakya ready:u        A2A   → http://0.0.0.0:{}/u$       Chat  → http://0.0.0.0:{}/chatu%       Query → http://0.0.0.0:{}/queryu,       Stream→ http://0.0.0.0:{}/query/streamu6       SIO   → http://0.0.0.0:{}/socket.io/ (Socket.IO)u;       Card  → http://0.0.0.0:{}/.well-known/agent-card.jsonu1       Auth  → http://0.0.0.0:{}/auth/login (POST))	osenvironrm   r   infor   r   r]   warning)portes     r?   _startup_bannerr    sX      :>>/622D]	;<<<nn	>???? ] ] ]
?CCC[\\\\\\\\] 	I#$$$I0$777I4d;;;I5t<<<I<dCCCIFMMMIKTRRRIA4HHHHHs   <A! !
B+)BBshutdownc                  Z   K   t                       d{V  t          j        d           dS )z0Close auth database connection pool on shutdown.Nz$Auth database connection pool closed)r   r   r  ry   rA   r?   	_shutdownr    s;       //I455555rA   rs   PYLOGUE_DB_PATHrr   zconversation-historieszchat_history.dbT)parentsexist_okz/chatc                      t           S Nr2   ry   rA   r?   <lambda>r    s    ( rA   Chanakyaz;Ask questions about Tata Steel's construction project data.)responder_factory
hero_titlehero_subtitledb_pathr9   messagec                 4   t          j                    r%t          j                                                    ndfdt          D             }t          t          t          d          | rt          t          |           d          ndt          dpd           t          t          |dd	d
t          ddd          d          t          t          ddd          t          ddd          d          d                    }t          |          S )Nr9   c                 x    g | ]6}t          |d           d|d          d|d         |d         k              7S )rI   z (rZ   )email)valueselected)r   )ro   uactives     r?   rq   z_admin_html.<locals>.<listcomp>  si         	y((AfI(((G*wZ6)	
 	
 	
  rA   u&   Enterprise Brain — Dev Impersonationzcolor:green)stylezActive: z(none)r#  zfont-size:1rem;padding:.3rem)rI   r(  Setsubmitz%margin-left:.5rem;padding:.3rem .8rem)rj   r(  post)methodhidden)rj   rI   r$  Clearz$margin-top:.5rem;padding:.3rem .8remz"font-family:monospace;padding:2rem)r   exists	read_textstripr5   r   r
   r   r   r   FHFormr   r   r   r	   )r  optionspager'  s      @r?   _admin_htmlr5    sN   8K8R8T8T\ *,,22444Z\F      G 7887>FAfWoo]3333B-+8--..g5STTTu83Z[[[  
 8'<<<wX5[\\\  
 7	
 	
 	
 D$ $<<rA   /)response_classc                  <   K   t          t                                S r  )r   r5  ry   rA   r?   	admin_getr9    s      &&&rA   )defaultr#  c                    K   | rt          j        |            d|  d}nt          j        d           d}t          j        d|            t          t          |                    S )NzImpersonating u&    — all agents will use this identityT)
missing_oku:   Cleared — agents will use real RequestContext.user_emailzDev impersonation set to: {!r})r   
write_textunlinkr   r  r   r5  )r#  msgs     r?   
admin_postr@    st       K&u---LuLLL"d3333JI.666C(()))rA   z/adminwidgetsc                     | D ]G}|                     d          dk    r,|                     di                                dd          c S HdS )zKReturn the chart type from the first visualization widget, or empty string.rj   visualizationcontentr9   rl   )rA  rp   s     r?   r   r   .  sZ     8 855==O++55B''++FB77777 ,2rA   c                 ^    t          j                                        d          }d| d|  S )zQPrepend current date/time to the user question so the system prompt stays static.z%d %B %Y, %H:%Mz[Today: z]
)r   nowr=   )r^   rF  s     r?   _stamprG  6  s2    
,..
!
!"3
4
4C(c((h(((rA   c                   K   	 |                                   d{V }|d         }|                    d          }|                    d          }|                    d          }nQ# t          $ rD}t          t	          j        d| d                                          d	
          cY d}~S d}~ww xY wt          |           d{V }|rX	 t          |d|d           d{V  n,# t          $ r}t          j
        d|           Y d}~nd}~ww xY wt          |d|           t          |||          }t          |          |_        t          j                    }		 t#          j        d|dd                   5  t&          j                            t-          |          ||           d{V }
ddd           n# 1 swxY w Y   n# t          $ r}t          j
        d|           t/          |t1          |          ||	dt3          |                     t          t	          j        t3          |          d                                          d
          cY d}~S d}~ww xY wt/          |t1          |          ||	d           |j        }|r=|                    d          pg }t7          d |D             d          }t9          |          }|pd}|r	|d| dz  }i }|j        rO|j        d         }|                    d g           |                    d!d          |                    dd          d"}|rYt          |d#|d$|                    d%d&          ||                    d'          |d()           d{V  t          |d#||*           t          |                    d%d&          ||                    d'          d+,          S d-|
j        d.}t	          j        |g/          }|rGt          |d#|
j        d$|                                )           d{V  t          |d#|
j                   t          |                                          S )0uN   POST /query — run Chanakya; forwards to UI agent if LLM called ask_ui_agent.Nr^   rU   rT   rV   Invalid request: PIPELINE_ERRORr  code  r   userr   rT   message_authorr  message_typez'[QUERY] Failed to save user message: {})rT   rU   rV   {q}x   qmessage_historyr`   zchanakya /query agent error: {}/queryr^   r_   r`   ra   rb   r]   r   r^   r_   r`   ra   rb   rr   c              3   X   K   | ]%}|                     d           dk    |d         V  &dS rj   textrD  Nrl   rn   s     r?   	<genexpr>z!_query_handler.<locals>.<genexpr>  s:      FFaaeeFmmv.E.EQy\.E.E.E.EFFrA   r9   (no text response)%
[Visualisation shown: visualization()]r   rd   re   rd   re   r^   	assistantresponsestatussuccessr]   re  rr   r]   _tatasteel_cacherT   rP  r  rQ  metadatatatasteel_cachere  rr   r]   )rD  r]  rj   rD  rA  ) jsonrm   r   r   r4   failure
model_dumpr+   r,   r   r]   r*   r\   r.   message_history_wirer   r   r   r   r3   agentrunrG  r   r   r>   r   nextr   r   outputrf  )r   bodyr^   rU   rT   rV   r   rW  deps_obj_flow_startresultr   rA  text_contentviz_typemessage_textts_cacher   text_widgetrd  s                       r?   _query_handlerr  @  s     

\\^^######Z(!%,!7!7
&*hh/@&A&A"hhy11 
 
 
&/H3/H/HO_```kkmm
 
 
 	
 	
 	
 	
 	
 	

 6oFFFFFFFFO  
C	G /% &	            	G 	G 	GJ@#FFFFFFFF	GBBB ZahiiiH$5o$F$FH!/##K
\%8DSD>222 	p 	p#>--fX.>.>P_fn-ooooooooF	p 	p 	p 	p 	p 	p 	p 	p 	p 	p 	p 	p 	p 	p 	p 
 
 

4c:::o.."c((	
 	
 	
 	
 &s3xx>NOOOZZ\\
 
 
 	
 	
 	
 	
 	
 	

  /**    "I  F'mmF339rFF7FFF
 
 %W--#;'; 	RQXQQQQL$ 	*1-Bvr**!vvmR88FF:r22 H
  	j /*$''mmHi@@#&]]733(0	           $O[,`hiiiiy}}Xy/Q/Q[bmvmzmz  |C  nD  nD  %E  %E  F  F  F  	F!fm<<K!);-@@@H M+&M#((**
 
 
 	
 	
 	
 	
 	
 	
 	
 	 fmLLL++--...sy   A!A& &
B409B/)B4/B4C) )
D3DD G >6G 4G  GG GG 
I(BI#I(#I(rX  c                   K   	 |                                   d{V }|d         |                    d          |                    d          |                    d          nQ# t          $ rD}t          t	          j        d| d                                          d	
          cY d}~S d}~ww xY wfd}t           |            dddd          S )uW   POST /query/stream — Chanakya runs; if tatasteel was consulted, streams via UI agent.Nr^   rU   rT   rV   rI  rJ  rK  rM  r   c                   K   dt          j        dddd           dW V  t                     d {V t          j        dt                               rX	 t          dd	
           d {V  n,# t          $ r} t          j        d|            Y d } ~ nd } ~ ww xY wt          d           t          j                    }t          |          t                    _        t          j                    }dt"          ffd}t          j         |                      }	 |                                st	 t          j        |                                d           d {V }dt          j        |           dW V  n# t          j        $ r Y nw xY w|                                tns# t          j        t0          f$ rZ |                                 t5          j        t          j        t                    5  | d {V  d d d            n# 1 swxY w Y    w xY w|                                sAdt          j        |                                           dW V  |                                A	 |                                }n# t          $ r{} t          j        d|            t?          t                    |dtA          |                      dt          j        dtA          |           dd           dW V  Y d } ~ d S d } ~ ww xY wt?          t                    |d           j!        }|rt          j        d           rg|                    d          pg }tE          d |D             d          }	tG          |          }
|	pd}|
r	|d|
 dz  }	 i }j$        rOj$        d         }|                    d g           |                    d!d          |                    d"d          d#}t          d$|d%|                    d&d'          ||                    d          |d()           d {V }t          j%        d*           t          d$||+           dt          j        d,|d-         d.           dW V  n,# t          $ r} t          j        d/|            Y d } ~ nd } ~ ww xY wd S t          j        d0           |j&        }|'                    d1          D ]#}dt          j        d2|d1z   d3           dW V  $d4|d3}d5d6itQ          j)        |g7          *                                }d }r{	 t          d$|d%d'|gd d8)           d {V }|d-         }t          j%        d9           t          d$|           n,# t          $ r} t          j        d:|            Y d } ~ nd } ~ ww xY w|||d;<   dt          j        |           dW V  d S )<Nzdata: progressthinkingProcessing your question...rj   rt   r  z

z5[QUERY/STREAM] Loaded {} history messages for conv={}rN  r   rO  z.[QUERY/STREAM] Failed to save user message: {})rT   rU   rV   rW   r7   c                  \  K   d} t          j        dd d                   5  	 t          j                            t                               d {V 	 cd d d            S # t          j        $ r d} Y nw xY w	 d d d            n# 1 swxY w Y   | rt          j                    d S NFrR  rS  rT  rV  Tr   r   r3   rt  ru  rG  r   CancelledError
_cancelledr`   rW  r^   s    r?   _run_with_spanzA_stream_query_handler.<locals>.sse_events.<locals>._run_with_span  s3     Jex~666 & &&!)!3!3F84D4DVelp!3!q!qqqqqqqq& & & & & & & & - & & &!%JJJ&	& & & & & & & & & & & & & & &
  /,.../ /.   B4A((A<9B;A<<BBB皙?timeoutz[QUERY/STREAM] agent error: {}/query/streamrY  r]   rJ  rj   r  rL  rZ  z*[QUERY/STREAM] UI agent done, saving to DBrr   c              3   X   K   | ]%}|                     d           dk    |d         V  &dS r\  rl   rn   s     r?   r^  z<_stream_query_handler.<locals>.sse_events.<locals>.<genexpr>"  s:      SSa155==F;R;RQy\;R;R;R;RSSrA   r9   r_  r`  ra  r   rd   re   r^   rb  rc  rd  re  rf  rg  ri  u6   [QUERY/STREAM] ✅ Saved assistant message for conv={}rk  message_savedidrj   
message_idu7   [QUERY/STREAM] ❌ Failed to save assistant message: {}z#[QUERY/STREAM] Direct text responser;   
text_chunkrn  r]  rj   donero  rm  u8   [QUERY/STREAM] ✅ Saved direct text message for conv={}u9   [QUERY/STREAM] ❌ Failed to save direct text message: {}r  )+rp  dumpsr+   r   debugr   r,   r   r]   r*   r   Queuer\   r.   rs  r   r   r   create_taskr  wait_forrm   TimeoutErrorr  GeneratorExitcancel
contextlibsuppressempty
get_nowaitr{  r   r>   r   rv  r   r   r  rw  splitr4   rf  rr  )r   rW   rz  r  
agent_taskeventr{  
done_eventwidgets_datar|  r}  r~  r  r   savedr]  wordr  done_payloadsaved_msg_idr`   rW  rT   rV   r^   rU   s                       @@r?   
sse_eventsz)_stream_query_handler.<locals>.sse_events  sW     {tz:zVs"t"tuu{{{{{{{ !:/ J JJJJJJJ
JCP_L`L`bqrrr  
	GR"$3#)$!*	            R R R
KSQQQQQQQQR#OVXFFF(/ +!)	
 
 
 %6o$F$F!
 o''	/c 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ $+#6~~7G7G#H#H

	 oo'' ")"2>3E3E3G3GQT"U"U"UUUUUUUE:4:e#4#4::::::::+   D	 !oo''  &6 	 	 	$W%;YGG ! !        ! ! ! ! ! ! ! ! ! ! ! ! ! ! !		 !&&(( 	IH4:n&?&?&A&ABBHHHHHHH !&&(( 	I	&&((FF 	 	 	J7===!!/22&(#hh    n4:w3s88Ue&f&fggmmmmmmmFFFFF	 	o.."$	
 	
 	
 	
 ^
 %	JCDDD "_+5>>&+A+A+GR#SS<SSSUW    -\::+C/C Z $YX$Y$Y$YYL_%'H, !215$&FF62$6$6+-66-+D+D(*z2(>(>$ $
 #/(7'2 ,%/&0nnXy&I&I$0%/^^G%<%<08	" "# # #      E IVXghhh+O[,hpqqqqi4:V[\`Va.b.b#c#ciiiiiiii  _ _ _JXZ]^^^^^^^^_F 	
8999}JJsOO 	[ 	[DZ4:|s
&S&STTZZZZZZZZ%$77i*<*Dk]*[*[*[*f*f*h*hi#' 	]]*$3#. !+"+!,!% 
 
 
 
 
 
 
 
 
  %T{	TVefff'dKKKK ] ] ]
VX[\\\\\\\\]#)5L&5tz,//555555555s    A: :
B#BB#0F9 A	F F9 F!F9  F!!F9 9AH)	HH)H 	 H)#H 	$H)J 
L!A0LL1C*R 
S&S  SAV" "
W,WWztext/event-streamzno-cacheno)zCache-ControlzX-Accel-Buffering)
media_typeheaders)rp  rm   r   r   r4   rq  rr  r   )r   rx  r   r  rT   rV   r^   rU   s       @@@@r?   _stream_query_handlerr    sJ     

\\^^######Z(!%,!7!7
&*hh/@&A&A"hhy11 
 
 
&/H3/H/HO_```kkmm
 
 
 	
 	
 	
 	
 	
 	

a6 a6 a6 a6 a6 a6 a6 a6F 
&",4HH   s   A!A* *
B849B3-B83B8r  sidc                   K   t                               ddddd|            d{V  t          |           d{V t          j        dt                    |           |rX	 t          |dd	
           d{V  n,# t          $ r}t          j        d|           Y d}~nd}~ww xY wt          |d           t          j                    }t          |||          t                    _        t          j                    }dt"          ffd}t          j         |                      }|t&          | <   	 |                                s	 t          j        |                                d           d{V }	t                               |	d         |	|            d{V  n# t          j        $ r Y nw xY w|                                |                                sQ|                                }	t                               |	d         |	|            d{V  |                                Qn# t          j        $ ru |                                 t9          j        t          j        t                    5  | d{V  ddd           n# 1 swxY w Y   t&                              | d            w xY wt&                              | d           n # t&                              | d           w xY wt?          t                    |d           j         }
|
rt          j        d           |ro|
                    d          pg }tC          d |D             d          }tE          |          }|pd}|r	|d| dz  }	 i }j#        rOj#        d         }|                    dg           |                    dd          |                    dd          d}t          |d |d!|
                    d"d#          ||
                    d$          |d%&           d{V }t          j$        d'|           t          |d ||(           t                               d)d)|d*         d+|            d{V  n,# t          $ r}t          j        d,|           Y d}~nd}~ww xY wdS |%                                rt          j$        d-|            dS 	 |&                                }na# t          $ rT}t          j        d.|           t                               d$d$tO          |          d/d0|            d{V  Y d}~dS d}~ww xY wt          j        d1           |j(        }|)                    d2          D ]+}t                               d3d3|d2z   d4|            d{V  ,d5|d4}dd6itU          j+        |g7          ,                                }d}|r{	 t          |d |d!d#|gdd8&           d{V }|d*         }t          j$        d9|           t          |d |           n,# t          $ r}t          j        d:|           Y d}~nd}~ww xY w|||d;<   t                               d6||            d{V  dS )<zExecute one query turn over Socket.IO, emitting the same event types
    as the SSE stream (progress, text_chunk, widget, done, error).
    r  r  r  r  toNz,[SIO] Loaded {} history messages for conv={}rN  r   rO  z%[SIO] Failed to save user message: {})rT   rU   rW   r7   c                  \  K   d} t          j        dd d                   5  	 t          j                            t                               d {V 	 cd d d            S # t          j        $ r d} Y nw xY w	 d d d            n# 1 swxY w Y   | rt          j                    d S r  r  r  s    r?   r  z&_run_sio_query.<locals>._run_with_span  s3     
\%8DSD>222 	" 	""%^//x0@0@Rahl/mmmmmmmmm	" 	" 	" 	" 	" 	" 	" 	" ) " " "!


"		" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"
  	+(***	+ 	+r  r  r  rj   z
/sio/queryrZ  z![SIO] UI agent done, saving to DBrr   c              3   X   K   | ]%}|                     d           dk    |d         V  &dS r\  rl   rn   s     r?   r^  z!_run_sio_query.<locals>.<genexpr>  s:      OO!quuV}}7N7N97N7N7N7NOOrA   r9   r_  r`  ra  r   rd   re   r^   rb  rc  rd  re  rf  r]   rg  ri  z)[SIO] Saved assistant message for conv={}rk  r  r  r  z*[SIO] Failed to save assistant message: {}z%[SIO] Agent task cancelled for sid={}z[SIO] agent error: {}rJ  r  z[SIO] Direct text responser;   r  rn  r]  r  ro  rm  z+[SIO] Saved direct text message for conv={}z,[SIO] Failed to save direct text message: {}r  )-sioemitr+   r   r  r   r,   r   r]   r*   r   r  r\   r.   rs  r   r   r   r  rS   r  r  rm   r  r  r  r  r  r  r  popr   r   rv  r   r   r  	cancelledr{  r>   rw  r  r4   rf  rr  )r  r^   rU   rT   r   rW   rz  r  r  r  r  r  r|  r}  r~  r  r   r  r{  r]  r  r  r  r  r`   rW  s    `                      @@r?   _run_sio_queryr  q  s      ((:
JSpqqvy(
z
zzzzzzzz 6oFFFFFFFFOJ=s??S?SUdeee  
C	E /% &	            	E 	E 	EJ>DDDDDDDD	EBBB$+MOON'%  D
 !2/ B BD/##K+# + + + + + + + +  '2>>3C3CDDJ#M#%//## 	%.~/A/A/C/CSQQQQQQQQQhhuV}eh<<<<<<<<<<'   	 //## 	 !&&(( 	9"--//E((5=%C(888888888 !&&(( 	9 !    !7CC 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	#t$$$ 	#t$$$$#t$$$$ /**    J %
6777 "	N'1~~f'='='CLOO|OOOQS L )66H'?+?L V U U U UUN!#( .q1B "vr 2 2')vvmR'@'@$&FF:r$:$:   H
 +$3#.(!+",..9"E"E ,!+!8!8,4	          	EWWW'ldlmmmmhhX]^bXc0d0dilhmmmmmmmmmm N N N
GMMMMMMMMN  	93???	""$$   
*C000hhS;KLL  
 
 	
 	
 	
 	
 	
 	
 	

 	 	J+,,,=D

3 \ \hh|ltcz%R%RWZh[[[[[[[[[[!d33KFe&8&@+&W&W&W&b&b&d&deL#L L	L& /*'$-}tTT        E !;LIC_UUU#O[$GGGG 	L 	L 	LJEsKKKKKKKK	L%1\"
((6<C(
0
0000000000s   (B 
B+B&&B+H= AF. -H= .G =H= ?G  A<H= <K  =AK	JKJ	K J	! KK   K=C2R 
R.R))R.S4 4
U>A	UU'AX5 5
Y?YYconnectr  authc                    K   |pi                      d          }|rt          |          nd}t                              | d|i           d{V  t	          j        d| |pd           dS )zMResolve user identity from JWT auth token passed in Socket.IO handshake auth.tokenNrU   z&[SIO] Client connected sid={}, user={}z(unauthenticated))rm   r   r  save_sessionr   r  )r  r  r  r  rU   s        r?   _sio_connectr    s       ((11E?DN4U;;;$J


3z :
;
;;;;;;;;I6Z=^K^_____rA   
disconnectc                    K   t                               | d           }|r=|                                s)|                                 t	          j        d|            t	          j        d|            d S )Nz/[SIO] Cancelled agent task on disconnect sid={}z [SIO] Client disconnected sid={})rS   r  r  r  r   r  r  tasks     r?   _sio_disconnectr  "  sm      S$''D JDIIKK J	CSIIII0#66666rA   stopc                    K   t                               |           }|r?|                                s-|                                 t	          j        d|            d S d S d S )Nu4   [SIO] Stop requested — cancelled agent task sid={})rS   rm   r  r  r   r  r  s     r?   _sio_on_stopr  +  sp      S!!D ODIIKK O	H#NNNNNO O O OrA   queryc                   K   t                               |            d{V }|r|                    d          nd}|                    d          pd                                }|                    d          }|s)t                               ddddd	| 
           d{V  dS t          | |||           d{V  t                               |            d{V  dS )uL   Handle 'query' event — execute one question turn for the connected client.NrU   r^   r9   rT   r]   zMissing questionINVALID_REQUESTr  r  )r  get_sessionrm   r1  r  r  r  )r  rr   sessionrU   r^   rT   s         r?   _sio_on_queryr  3  s      OOC((((((((G:AKW[[666tJXXj))/R6688H"&((+<"="=O hhw=OYj k kpshttttttttt
h
O
D
DDDDDDDD
..

rA   __main__z$backend.chanakya.rt_agent.server:appz0.0.0.0)hostr  reload)NNNN)r7   N)r9   r  )__doc__r   r  rp  r
  timer   r   pathlibr   typingr   socketior   fastapir   r   fastapi.responsesr   fastcore.xmlr	   fasthtml.componentsr
   r   r2  r   r   r   r   r   r   r   logurur   r   pylogue.shellr   create_core_appstarlette.middleware.corsr   starlette.requestsr   starlette.responsesr   r   backend.chanakya.a2a_contextr   r   r   backend.chanakya.auth.utilsr   backend.chanakya.authr   r   auth_me_handlerr   r    auth_login_handlerr!   auth_upsert_handlerr"   auth_verify_handlerbackend.chanakya.configr#   backend.chanakya.conversationr$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   &backend.chanakya.conversation.databaser1   r   backend.chanakya.rt_agent.agentr3   backend.chanakya.schemasr4   data.mock_data.usersr5   r   r   r   r   r   _LM_PENDING_STATUSESr   r   r   r   r   r   r   r   r   objectr>   r@   rH   _cfgrI   rJ   appadd_middlewarer  rm   AsyncServerr  rS   r   Task__annotations__r   r  r\   rF   r   	add_router  on_eventr  r  __file__r  _PROJECT_ROOT_chat_db_pathparentmkdirmountr5  
_admin_appr9  r+  r@  listr   rG  r  r  r  onr  r  r  r  ASGIApp__name__uvicornru  r  ry   rA   r?   <module>r
     sD   P P P       				                         ! ! ! ! ! ! ! ! * * * * * *       h h h h h h h h h h h h h h h h h h h h h h h h ! ! ! ! ! ! 8 8 8 8 8 8 4 4 4 4 4 4 & & & & & & ? ? ? ? ? ? ? ? e e e e e e e e e e ? ? ? ? ? ?                3 2 2 2 2 2                               R Q Q Q Q Q 4 4 4 4 4 4 7 7 7 7 7 7 & & & & & &
 O h  \r j / -/ / G -	G G G / -	/ / . -	. . . /
 -/ / 0 -	0 0 0 ) ,::=		 ) ,::=		 ) ,::=		  C    v #*     j!
 	      :>>"6<<=%%	     hf3GGG *,tC%& + + + #'!+/	 4Zd
 4Z MD(	
    @ N N NN N 	N
 N N :N 
N N N Nf m/& B B B "$7& J J J j/E7 ; ; ; !#6 I I IrG r r r r rh *,Dug V V V
  ;fX N N N  9E7 K K K 46NY^X_ ` ` ` :<]hmgn o o o 46Q\d[e f f f =?S^d]e f f f =?S^c]d e e e WYp  |C  {D  E  E  E #%?% Q Q Q iI I I I, j6 6 6 6 X&q)
C!99JFIZZ[[  ]          = = = 		O**S	      c    > WYY
 L11' ' ' ' 21' \22"&$r"2"2"2 * *C *| * * * 32* 		(J   tDz c    )S )S ) ) ) )l/' l/l l/ l/ l/ l/^ h 9 9 9u u5F5U u u u up o4vh G G Ge1	e1e1 d
e1 4Z	e1
 
e1 e1 e1 e1P 	` `C `$ `dTk `T ` ` ` ` 7s 7t 7 7 7 7 OC OD O O O O S      $ hsC   zNNNGK6YTY_cdddddd rA   