ó
    ŸUAj†  ã                  óž   • S r SSKJr  SSKJr  SSKJrJr  SSKJ	r	  SSK
Jr  SSKJr  \" S5      rSS	 jrSS
 jr S           SS jjrg)a”  Discovery upload via the session flow (Phase 2).

Drives open-session -> per-category items -> complete/failed against the
Central API. Upload is best-effort: any transport failure is logged and the
local last.json snapshot remains the fallback. A category whose upload fails is
reported in failed_categories so the backend records the session as partial
(never silently dropped, never reconciled away).
é    )Úannotations)ÚAny)Ú	ApiClientÚApiError)ÚConfig)Úload_agent_token)Ú
get_loggerzdiscovery.uploadc                óÆ   • [        U [        5      (       a+  U  Vs/ sH  n[        U[        5      (       a  UOSU0PM      sn$ [        U [        5      (       a  U /$ SU 0/$ s  snf )zENormalize a category value into a list of dict items for raw storage.Úvalue)Ú
isinstanceÚlistÚdict)r   Úitems     Ú:D:\Programs\laragon\www\wolf\agent\src\discovery\upload.pyÚ_coerce_itemsr      sc   € ä�%œ×ÑÙPUÓVÑPUÈœ
 4¬×.Ñ.‘°W¸d°OÒCÑPUÑVÐVÜ�%œ×ÑØˆwˆØ�eÐÐÐùò Ws   š$Ac                ój   • U R                  5        VVs0 sH  u  pU[        U5      _M     snn$ s  snnf )zAMap a full-discovery inventory dict to category -> list-of-items.)Úitemsr   )Ú	inventoryÚcategoryr   s      r   Úcategories_from_inventoryr      s/   € àBKÇ/Á/ÔBSÔTÑBS©¨xˆH”m EÓ*Ò*ÑBSÒTÐTùÓTs   ”/Nc                ó  • U=(       d    [        U 5      n[        UR                  5       5      n UR                  X%S.U5      nUS   n/ n	/ n
UR                  5        H,  u  p¼ UR                  X{US.U5        U	R                  U5        M.      U	(       d  UR                  USS.U5      nOUR                  UU	U
S	.U5      n[        R                  S
UUUR                  S5      5        U$ ! [        [
        [        4 a   n[        R                  SU5         SnAgSnAff = f! [         a2  n[        R                  SX¸5        U
R                  U5         SnAMü  SnAff = f! [         a   n[        R                  SU5         SnAgSnAff = f)zŒRun the full session flow for one scan. Returns the finalize response.

Never raises: returns None if the session could not even be opened.
)Ú	scan_typeÚexpected_categoriesÚ
session_idz!discovery session open failed: %sN)r   r   r   z(discovery items upload failed for %s: %szall category uploads failed)r   Úerror)r   Úsucceeded_categoriesÚfailed_categoriesz1discovery %s scan finalized: session=%s status=%sÚstatuszdiscovery finalize failed: %s)r   ÚsortedÚkeysÚopen_discovery_sessionr   ÚKeyErrorÚ	TypeErrorÚlogÚwarningr   Úupload_discovery_itemsÚappendÚfail_discoveryÚcomplete_discoveryÚinfoÚget)ÚconfigÚ
api_clientr   Ú
categoriesÚtokenÚexpectedÚopenedr   ÚexcÚ	succeededÚfailedr   r   Úresults                 r   Úupload_inventoryr6   $   sŽ  € ð ×-Ô% fÓ-€EÜ�j—o‘oÓ'Ó(€HðØ×2Ñ2Ø#ÑEÀuó
ˆð ˜LÑ)ˆ
ð
 €IØ€FØ%×+Ñ+Ö-‰ˆð	$Ø×-Ñ-Ø)È%ÑPØôð ×Ñ˜XÖ&ñ .ðÞà×.Ñ.Ø)Ð4QÑRØó‰Fð
  ×2Ñ2à",Ø,5Ø)/ñð
 óˆFô 	�‰Ø?ØØØ�J‰J�xÓ ô		
ð ˆøôO ”h¤	Ð*ó Ü�‰Ð7¸Ô=Üûðûô ó 	$Ü�K‰KÐBÀHÔRØ�M‰M˜(×#Ò#ûð	$ûô6 ó Ü�‰Ð3°SÔ9ÜûðúsH   ¯C) Á"&D!ÂAE  Ã)DÃ>DÄDÄ!
EÄ+'EÅEÅ 
F
Å*FÆF
)r   r   Úreturnzlist[dict[str, Any]])r   zdict[str, Any]r7   údict[str, list[dict[str, Any]]])N)r,   r   r-   r   r   Ústrr.   r8   r/   z
str | Noner7   zdict[str, Any] | None)Ú__doc__Ú
__future__r   Útypingr   r-   r   r   r,   r   Úidentityr   Úloggerr	   r$   r   r   r6   © ó    r   Ú<module>rA      sv   ðñõ #å ç *Ý Ý %Ý áÐ#Ó$€ôôUð ð=Øð=àð=ð ð=ð 0ð	=ð
 ð=ð ö=r@   