§
    ‰eîi‡f  ã                  ó¦  — U d Z ddlmZ ddl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 erddlmZ  ej        e¦  «        Z e
j        ¦   «         d	z  d
z  ZdZd<d„Zd=d„ZddiZh d£Zd>d„Zd?d„Zd@d„ZdAd„ZdZ dBd „Z!dCd$„Z"d%d&hZ#d%d&d&d'œZ$d>d(„Z%d)d)d)d)d*œd)d+d+d)d*œd,œZ&dDd1„Z'e G d2„ d3¦  «        ¦   «         Z(da)d4e*d5<   dEdFd9„Z+dGd;„Z,dS )Haé  Honcho client initialization and configuration.

Resolution order for config file:
  1. $HERMES_HOME/honcho.json  (instance-local, enables isolated Hermes instances)
  2. ~/.honcho/config.json     (global, shared across all Honcho-enabled apps)
  3. Environment variables     (HONCHO_API_KEY, HONCHO_ENVIRONMENT)

Resolution order for host-specific settings:
  1. Explicit host block fields (always win)
  2. Flat/global fields from config root
  3. Defaults (host name as workspace/peer)
é    )ÚannotationsN)Ú	dataclassÚfield)ÚPath)Úget_hermes_home)ÚAnyÚTYPE_CHECKING©ÚHonchoz.honchozconfig.jsonÚhermesÚreturnÚstrc                 óä   — t           j                             dd¦  «                             ¦   «         } | r| S 	 ddlm}  |¦   «         }|r|dvrt          › d|› �S n# t          $ r Y nw xY wt          S )a	  Derive the Honcho host key from the active Hermes profile.

    Resolution order:
      1. HERMES_HONCHO_HOST env var (explicit override)
      2. Active profile name via profiles system -> ``hermes.<profile>``
      3. Fallback: ``"hermes"`` (default profile)
    ÚHERMES_HONCHO_HOSTÚ r   )Úget_active_profile_name)ÚdefaultÚcustomú.)ÚosÚenvironÚgetÚstripÚhermes_cli.profilesr   ÚHOSTÚ	Exception)Úexplicitr   Úprofiles      ú>/home/div/.hermes/hermes-agent/plugins/memory/honcho/client.pyÚresolve_active_hostr    "   s¥   € õ Œz�~Š~Ð2°BÑ7Ô7×=Ò=Ñ?Ô?€HØð ØˆðØ?Ð?Ð?Ð?Ð?Ð?Ø)Ð)Ñ+Ô+ˆØð 	'�wÐ&;Ð;Ð;ÝÐ&Ð&˜WÐ&Ð&Ð&øøÝð ð ð Øˆðøøøå€Ks   ¸!A Á
A(Á'A(r   c                 óÈ   — t          ¦   «         dz  } |                      ¦   «         r| S t          j        ¦   «         dz  dz  }|| k    r|                     ¦   «         r|S t          S )uo  Return the active Honcho config path.

    Resolution order:
      1. $HERMES_HOME/honcho.json      (profile-local, if it exists)
      2. ~/.hermes/honcho.json          (default profile â€” shared host blocks live here)
      3. ~/.honcho/config.json          (global, cross-app interop)

    Returns the global path if none exist (for first-time setup writes).
    zhoncho.jsonz.hermes)r   Úexistsr   ÚhomeÚGLOBAL_CONFIG_PATH)Ú
local_pathÚdefault_paths     r   Úresolve_config_pathr'   8   sm   € õ !Ñ"Ô" ]Ñ2€JØ×ÒÑÔð ØÐõ ”9‘;”; Ñ*¨]Ñ:€LØ�zÒ!Ð! l×&9Ò&9Ñ&;Ô&;Ð!ØÐåÐó    ÚautoÚhybrid>   Útoolsr*   ÚcontextÚvalc                óR   — t                                | | ¦  «        } | t          v r| ndS )u?   Normalize legacy recall mode values (e.g. 'auto' â†’ 'hybrid').r*   )Ú_RECALL_MODE_ALIASESr   Ú_VALID_RECALL_MODES©r-   s    r   Ú_normalize_recall_moder2   R   s,   € å
×
"Ò
" 3¨Ñ
,Ô
,€CØÕ,Ð,Ð,ˆ3ˆ3°(Ð:r(   r   Úboolc               óJ   — | �t          | ¦  «        S |�t          |¦  «        S |S )z@Resolve a bool config field: host wins, then root, then default.)r3   )Úhost_valÚroot_valr   s      r   Ú_resolve_boolr7   X   s+   € àÐÝ�H‰~Œ~ÐØÐÝ�H‰~Œ~ÐØ€Nr(   ú
int | Nonec                ój   — | |fD ]-}|�)	 t          |¦  «        c S # t          t          f$ r Y Œ)w xY wŒ.dS )z@Parse contextTokens: host wins, then root, then None (uncapped).N)ÚintÚ
ValueErrorÚ	TypeError©r5   r6   r-   s      r   Ú_parse_context_tokensr>   a   s`   € à˜(Ð#ð ð ˆØˆ?ðÝ˜3‘x”x���øÝ¥	Ð*ð ð ð Ø�ðøøøð ð
 ˆ4s   Š›/®/r:   c           	     ó¢   — | |fD ]I}|�E	 t          dt          t          |¦  «        d¦  «        ¦  «        c S # t          t          f$ r Y ŒEw xY wŒJdS )zCParse dialecticDepth: host wins, then root, then 1. Clamped to 1-3.Né   é   )ÚmaxÚminr:   r;   r<   r=   s      r   Ú_parse_dialectic_depthrD   l   sw   € à˜(Ð#ð ð ˆØˆ?ðÝ˜1�c¥# c¡(¤(¨AÑ.Ô.Ñ/Ô/Ð/Ð/Ð/øÝ¥	Ð*ð ð ð Ø�ðøøøð ð
 ˆ1s   Š*7·AÁ
A)ÚminimalÚlowÚmediumÚhighrB   Údepthúlist[str] | Nonec                óè   — | |fD ]l}|�ht          |t          ¦  «        rSd„ |d|…         D ¦   «         }t          |¦  «        |k     r(|                     d¦  «         t          |¦  «        |k     °(|c S ŒmdS )zÝParse dialecticDepthLevels: optional array of reasoning levels per pass.

    Returns None when not configured (use proportional defaults).
    When configured, validates each level and truncates/pads to match depth.
    Nc                ó(   — g | ]}|t           v r|nd ‘ŒS )rF   )Ú_VALID_REASONING_LEVELS)Ú.0Úlvls     r   ú
<listcomp>z1_parse_dialectic_depth_levels.<locals>.<listcomp>‚   s7   € ð ð ð àð Õ5Ð5Ð5��¸5ðð ð r(   rF   )Ú
isinstanceÚlistÚlenÚappend)r5   r6   rI   r-   Úlevelss        r   Ú_parse_dialectic_depth_levelsrV   z   s˜   € ð ˜(Ð#ð 	ð 	ˆØˆ?�z¨#­tÑ4Ô4ˆ?ðð à˜v ˜vœ;ðñ ô ˆFõ
 �f‘+”+ Ò%Ð%Ø—’˜eÑ$Ô$Ð$õ �f‘+”+ Ò%Ð%àˆMˆMˆMøØˆ4r(   Úvaluesr   úfloat | Nonec                 óÒ   — | D ]c}|€Œt          |t          ¦  «        r|                     ¦   «         }|sŒ1	 t          |¦  «        }n# t          t
          f$ r Y ŒUw xY w|dk    r|c S ŒddS )z=Return the first non-empty value coerced to a positive float.Nr   )rQ   r   r   Úfloatr<   r;   )rW   ÚvalueÚparseds      r   Ú_resolve_optional_floatr]   �   s–   € àð ð ˆØˆ=ØÝ�e�SÑ!Ô!ð 	Ø—K’K‘M”MˆEØð Øð	Ý˜5‘\”\ˆFˆFøÝ�:Ð&ð 	ð 	ð 	ØˆHð	øøøà�AŠ:ˆ:ØˆMˆMˆMð àˆ4s   µAÁAÁAÚunifiedÚdirectional)ÚsharedÚseparateÚcrossc                óR   — t                                | | ¦  «        } | t          v r| ndS )z"Normalize observation mode values.r_   )Ú_OBSERVATION_MODE_ALIASESr   Ú_VALID_OBSERVATION_MODESr1   s    r   Ú_normalize_observation_moderf   £   s,   € å
#×
'Ò
'¨¨SÑ
1Ô
1€CØÕ1Ð1Ð1ˆ3ˆ3°}ÐDr(   T©Úuser_observe_meÚuser_observe_othersÚai_observe_meÚai_observe_othersF)r_   r^   ÚmodeÚobservation_objúdict | NoneÚdictc                óÔ  — t                                | t           d         ¦  «        }|rt          |t          ¦  «        st          |¦  «        S |                     d¦  «        pi }|                     d¦  «        pi }|                     d|d         ¦  «        |                     d|d         ¦  «        |                     d|d         ¦  «        |                     d|d	         ¦  «        d
œS )aj  Resolve per-peer observation booleans.

    Config forms:
      String shorthand:  ``"observationMode": "directional"``
      Granular object:   ``"observation": {"user": {"observeMe": true, "observeOthers": true},
                                           "ai": {"observeMe": true, "observeOthers": false}}``

    Granular fields override preset defaults.
    r_   ÚuserÚaiÚ	observeMerh   ÚobserveOthersri   rj   rk   rg   )Ú_OBSERVATION_PRESETSr   rQ   ro   )rl   rm   ÚpresetÚ
user_blockÚai_blocks        r   Ú_resolve_observationry   ·   sà   € õ "×%Ò% dÕ,@ÀÔ,OÑPÔP€FØð ¥*¨_½dÑ"CÔ"Cð Ý�F‰|Œ|Ðà ×$Ò$ VÑ,Ô,Ð2°€JØ×"Ò" 4Ñ(Ô(Ð.¨B€Hð &Ÿ>š>¨+°vÐ>OÔ7PÑQÔQØ)Ÿ~š~¨o¸vÐF[Ô?\Ñ]Ô]Ø!Ÿš k°6¸/Ô3JÑKÔKØ%Ÿ\š\¨/¸6ÐBUÔ;VÑWÔWð	ð ð r(   c                  óp  — e Zd ZU dZeZded<   dZded<   dZded<   d	Z	ded
<   dZ
ded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   d Zded!<   dZd"ed#<   dZded$<   d%Zded&<   d'Zded(<   d)Zded*<   d+Zded,<   dZded-<   d.Zded/<   dZded0<   dZded1<   dZ ded2<   dZ!ded3<   d4Z"ded5<   dZ#ded6<    e$e%¬7¦  «        Z&d8ed9<    e$e%¬7¦  «        Z'd:ed;<   dZ(ded<<   e)	 	 dHdId>„¦   «         Z*e)	 	 dJdKdA„¦   «         Z+e,dLdC„¦   «         Z-	 	 	 	 dMdNdG„Z.dS )OÚHonchoClientConfigz>Configuration for Honcho client, resolved for a specific host.r   Úhostr   Úworkspace_idNú
str | NoneÚapi_keyÚ
productionÚenvironmentÚbase_urlrX   ÚtimeoutÚ	peer_nameÚai_peerFr3   ÚenabledTÚsave_messagesÚasyncz	str | intÚwrite_frequencyr8   Úcontext_tokensrF   Údialectic_reasoning_levelÚdialectic_dynamicéX  r:   Údialectic_max_charsr@   Údialectic_depthrJ   Údialectic_depth_levelsÚreasoning_heuristicrH   Úreasoning_level_capé¨a  Úmessage_max_charsé'  Údialectic_max_input_charsr*   Úrecall_modeÚinit_on_session_startr_   Úobservation_moderh   ri   rj   rk   úper-directoryÚsession_strategyÚsession_peer_prefix)Údefault_factoryzdict[str, str]Úsessionszdict[str, Any]ÚrawÚexplicitly_configuredr   c                ó   — |pt          ¦   «         }t          j                             d¦  «        }t          j                             dd¦  «                             ¦   «         pd}t          t          j                             d¦  «        ¦  «        } | |||t          j                             dd¦  «        |||t          |p|¦  «        ¬¦  «        S )	z4Create config from environment variables (fallback).ÚHONCHO_API_KEYÚHONCHO_BASE_URLr   NÚHONCHO_TIMEOUTÚHONCHO_ENVIRONMENTr€   )r|   r}   r   r�   r‚   rƒ   r…   r†   )r    r   r   r   r   r]   r3   )Úclsr}   r|   Úresolved_hostr   r‚   rƒ   s          r   Úfrom_envzHonchoClientConfig.from_env$  s»   € ð Ð5Õ 3Ñ 5Ô 5ˆÝ”*—.’.Ð!1Ñ2Ô2ˆÝ”:—>’>Ð"3°RÑ8Ô8×>Ò>Ñ@Ô@ÐHÀDˆÝ)­"¬*¯.ª.Ð9IÑ*JÔ*JÑKÔKˆØˆsØØ%ØÝœ
ŸšÐ';¸\ÑJÔJØØØ!Ý˜Ð, HÑ-Ô-ð	
ñ 	
ô 	
ð 		
r(   Úconfig_pathúPath | Nonec                ó’  — |pt          ¦   «         }|pt          ¦   «         }|                     ¦   «         s1t                               d|¦  «         |                      |¬¦  «        S 	 t          j        |                     d¬¦  «        ¦  «        }nU# t          j	        t          f$ r<}t                               d||¦  «         |                      |¬¦  «        cY d}~S d}~ww xY w|                     d¦  «        pi                      |i ¦  «        }t          |¦  «        p|                     d¦  «        d	u }|                     d
¦  «        p|                     d
¦  «        p|}	|                     d¦  «        p|                     d¦  «        p|}
|                     d¦  «        p3|                     d¦  «        pt          j                             d¦  «        }|                     d¦  «        p|                     dd¦  «        }|                     d¦  «        pH|                     d¦  «        p3t          j                             dd¦  «                             ¦   «         pd}t#          |                     d¦  «        |                     d¦  «        t          j                             d¦  «        ¦  «        }|                     d¦  «        }|                     d¦  «        }|�|}n|�|}nt          |p|¦  «        }|                     d¦  «        p|                     d¦  «        pd}	 t%          |¦  «        }n&# t&          t(          f$ r t+          |¦  «        }Y nw xY w|                     d¦  «        }|�|n|                     dd	¦  «        }|                     d¦  «        p|                     dd¦  «        }|                     d¦  «        }|�|n|                     dd¦  «        } | dMi d|“d|	“d |“d|“d|“d|“d!|                     d"¦  «        p|                     d"¦  «        “d#|
“d|“d$|“d%|“d&t-          |                     d'¦  «        |                     d'¦  «        ¦  «        “d(|                     d)¦  «        p|                     d)¦  «        pd*“d+t/          |                     d,¦  «        |                     d,¦  «        d	¬-¦  «        “d.t%          |                     d/¦  «        p|                     d/¦  «        pd0¦  «        “d1t1          |                     d2¦  «        |                     d2¦  «        ¦  «        “d3t3          |                     d4¦  «        |                     d4¦  «        t1          |                     d2¦  «        |                     d2¦  «        ¦  «        ¬5¦  «        “d6t/          |                     d7¦  «        |                     d7¦  «        d	¬-¦  «        “d8|                     d9¦  «        p|                     d9¦  «        pd:“d;t%          |                     d<¦  «        p|                     d<¦  «        pd=¦  «        “d>t%          |                     d?¦  «        p|                     d?¦  «        pd@¦  «        “dAt5          |                     dB¦  «        p|                     dB¦  «        pdC¦  «        “dDt/          |                     dE¦  «        |                     dE¦  «        d¬-¦  «        “dFt7          |                     dG¦  «        p|                     dG¦  «        p|rdHndI¦  «        “t9          t7          |                     dG¦  «        p|                     dG¦  «        p|rdHndI¦  «        |                     dJ¦  «        p|                     dJ¦  «        ¦  «        ¤|||                     dKi ¦  «        ||dLœ¤ŽS )NzÖCreate config from the resolved Honcho config path.

        Resolution: $HERMES_HOME/honcho.json -> ~/.honcho/config.json -> env vars.
        When host is None, derives it from the active Hermes profile.
        z2No global Honcho config at %s, falling back to env)r|   zutf-8)Úencodingz*Failed to read %s: %s, falling back to envNÚhostsr†   TÚ	workspaceÚaiPeerÚapiKeyr¢   r�   r€   ÚbaseUrlr‚   r£   r   rƒ   ÚrequestTimeoutr¤   ÚwriteFrequencyrˆ   ÚsaveMessagesÚsessionStrategyrš   ÚsessionPeerPrefixFr|   r}   r   r„   ÚpeerNamer…   r‡   r‰   rŠ   ÚcontextTokensr‹   ÚdialecticReasoningLevelrF   rŒ   ÚdialecticDynamic)r   rŽ   ÚdialecticMaxCharsr�   r�   ÚdialecticDepthr�   ÚdialecticDepthLevels)rI   r‘   ÚreasoningHeuristicr’   ÚreasoningLevelCaprH   r”   ÚmessageMaxCharsr“   r–   ÚdialecticMaxInputCharsr•   r—   Ú
recallModer*   r˜   ÚinitOnSessionStartr™   ÚobservationModer^   r_   Úobservationrž   )r›   rœ   rž   rŸ   r    © )r    r'   r"   ÚloggerÚdebugr¨   ÚjsonÚloadsÚ	read_textÚJSONDecodeErrorÚOSErrorÚwarningr   r3   r   r   r   r]   r:   r<   r;   r   r>   r7   rD   rV   r2   rf   ry   )r¦   r|   r©   r§   ÚpathrŸ   ÚeÚ
host_blockÚ_explicitly_configuredr®   r…   r   r�   r‚   rƒ   Úhost_enabledÚroot_enabledr†   Úraw_wfr‰   Ú	host_saver‡   r›   Úhost_prefixrœ   s                            r   Úfrom_global_configz%HonchoClientConfig.from_global_config:  sô  € ð Ð5Õ 3Ñ 5Ô 5ˆØÐ3Õ1Ñ3Ô3ˆØ�{Š{‰}Œ}ð 	4Ý�LŠLÐMÈtÑTÔTÐTØ—<’< ]�<Ñ3Ô3Ð3ð	4Ý”*˜TŸ^š^°W˜^Ñ=Ô=Ñ>Ô>ˆCˆCøÝÔ$¥gÐ.ð 	4ð 	4ð 	4Ý�NŠNÐGÈÈqÑQÔQÐQØ—<’< ]�<Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3øøøøð	4øøøð —g’g˜gÑ&Ô&Ð,¨"×1Ò1°-ÀÑDÔDˆ
õ "& jÑ!1Ô!1Ð!O°S·W²W¸YÑ5GÔ5GÈ4Ð5OÐð �NŠN˜;Ñ'Ô'ð Ø�wŠw�{Ñ#Ô#ðàð 	ð �NŠN˜8Ñ$Ô$ð Ø�wŠw�xÑ Ô ðàð 	ð �NŠN˜8Ñ$Ô$ð 0Ø�wŠw�xÑ Ô ð0åŒz�~Š~Ð.Ñ/Ô/ð 	ð �NŠN˜=Ñ)Ô)ð 4Ø�wŠw�} lÑ3Ô3ð 	ð �GŠG�IÑÔð Ø�wŠw�zÑ"Ô"ðåŒz�~Š~Ð/°Ñ4Ô4×:Ò:Ñ<Ô<ðð ð	 	õ *Ø�GŠG�IÑÔØ�GŠGÐ$Ñ%Ô%ÝŒJ�NŠNÐ+Ñ,Ô,ñ
ô 
ˆð "—~’~ iÑ0Ô0ˆØ—w’w˜yÑ)Ô)ˆØÐ#Ø"ˆGˆGØÐ%Ø"ˆGˆGõ ˜7Ð. hÑ/Ô/ˆGð �NŠNÐ+Ñ,Ô,ð Ø�wŠwÐ'Ñ(Ô(ðàð 	ð
	*Ý),¨V©¬ˆOˆOøÝ�:Ð&ð 	*ð 	*ð 	*Ý! &™kœkˆOˆOˆOð	*øøøð —N’N >Ñ2Ô2ˆ	Ø%.Ð%:˜	˜	ÀÇÂÈÐX\Ñ@]Ô@]ˆð �NŠNÐ,Ñ-Ô-ð ;Ø�wŠwÐ(¨/Ñ:Ô:ð 	ð !—n’nÐ%8Ñ9Ô9ˆà&Ð2ˆKˆKØ—’Ð,¨eÑ4Ô4ð 	ð
 ˆsð ]
ð ]
ð ]
Ø�ð]
à"˜ð]
ð �Gð]
ð $˜ð	]
ð
 �Xð]
ð �Gð]
ð !—n’n ZÑ0Ô0ÐG°C·G²G¸JÑ4GÔ4Gøð]
ð �Gð]
ð �Gð]
ð (˜-ð]
ð ,˜Oð]
õ 1Ø—’˜Ñ/Ô/Ø—’˜Ñ(Ô(ñô ð ð]
ð" —’Ð8Ñ9Ô9ð Ø—7’7Ð4Ñ5Ô5ðàøð']
õ* ,Ø—’Ð1Ñ2Ô2Ø—’Ð*Ñ+Ô+Øðñ ô ð ð+]
õ4 !$Ø—’Ð2Ñ3Ô3ð Ø—7’7Ð.Ñ/Ô/ðàñ!ô !ð !ð5]
õ> 3Ø—’Ð/Ñ0Ô0Ø—’Ð(Ñ)Ô)ñô ð ð?]
õF $AØ—’Ð5Ñ6Ô6Ø—’Ð.Ñ/Ô/Ý,¨Z¯^ª^Ð<LÑ-MÔ-MÈsÏwÊwÐWgÑOhÔOhÑiÔið$ñ $ô $ð $ðG]
õP !.Ø—’Ð3Ñ4Ô4Ø—’Ð,Ñ-Ô-Øð!ñ !ô !ð !ðQ]
ð\ —’Ð2Ñ3Ô3ð Ø—7’7Ð.Ñ/Ô/ðàøða]
õd "Ø—’Ð0Ñ1Ô1ð Ø—7’7Ð,Ñ-Ô-ðàñô ð ðe]
õn '*Ø—’Ð7Ñ8Ô8ð Ø—7’7Ð3Ñ4Ô4ðàñ'ô 'ð 'ðo]
õx /Ø—’˜|Ñ,Ô,ð Ø—7’7˜<Ñ(Ô(ðàñô ð ðy]
õB #0Ø—’Ð3Ñ4Ô4Ø—’Ð,Ñ-Ô-Øð#ñ #ô #ð #ðC]
õV 9Ø—’Ð0Ñ1Ô1ð LØ—7’7Ð,Ñ-Ô-ðLà!7ÐJ�I�I¸]ñô ð õ
 #Ý+Ø—N’NÐ#4Ñ5Ô5ð PØ—w’wÐ0Ñ1Ô1ðPà%;ÐN˜	˜	Àñô ð
 —’˜}Ñ-Ô-ÐG°·²¸Ñ1GÔ1Gñô ða]
ðp .Ø 3Ø—W’W˜Z¨Ñ,Ô,ØØ"8ðy]
ð ]
ð ]
ð ]
ð ]	
s0   Á'(B ÂC"Â&1CÃC"ÃC"Ì&L6 Ì6 MÍMÚcwdc                óä   — ddl }	 |                     g d¢dd| d¬¦  «        }|j        dk    r+t          |j                             ¦   «         ¦  «        j        S n# t          |j        f$ r Y nw xY wdS )zBReturn the git repo root directory name, or None if not in a repo.r   N)Úgitz	rev-parsez--show-toplevelTé   )Úcapture_outputÚtextrÙ   rƒ   )	Ú
subprocessÚrunÚ
returncoder   Ústdoutr   ÚnamerÍ   ÚTimeoutExpired)rÙ   rß   Úroots      r   Ú_git_repo_namez!HonchoClientConfig._git_repo_nameý  sŸ   € ð 	ÐÐÐð	Ø—>’>Ø7Ð7Ð7Ø#¨$°CÀð "ñ ô ˆDð Œ !Ò#Ð#Ý˜DœK×-Ò-Ñ/Ô/Ñ0Ô0Ô5Ð5ð $øå˜Ô2Ð3ð 	ð 	ð 	ØˆDð	øøøàˆts   †AA ÁA-Á,A-Úsession_titleÚ
session_idÚgateway_session_keyc                óÖ  — ddl }|st          j        ¦   «         }| j                             |¦  «        }|r|S |rH|                     dd|¦  «                             d¦  «        }|r| j        r| j        r| j        › d|› �S |S |r.|                     dd|¦  «                             d¦  «        }|r|S | j	        dk    r|r| j        r| j        r| j        › d|› �S |S | j	        dk    rE|  
                    |¦  «        pt          |¦  «        j        }| j        r| j        r| j        › d|› �S |S | j	        dv r0t          |¦  «        j        }| j        r| j        r| j        › d|› �S |S | j        S )uý  Resolve Honcho session name.

        Resolution order:
          1. Manual directory override from sessions map
          2. Hermes session title (from /title command)
          3. Gateway session key (stable per-chat identifier from gateway platforms)
          4. per-session strategy â€” Hermes session_id ({timestamp}_{hex})
          5. per-repo strategy â€” git repo root directory name
          6. per-directory strategy â€” directory basename
          7. global strategy â€” workspace name
        r   Nz[^a-zA-Z0-9_-]+ú-úper-sessionzper-repo)rš   rì   )Úrer   Úgetcwdrž   r   Úsubr   rœ   r„   r›   ræ   r   rã   r}   )	ÚselfrÙ   rç   rè   ré   rí   ÚmanualÚ	sanitizedÚbases	            r   Úresolve_session_namez'HonchoClientConfig.resolve_session_name  sä  € ð$ 	ˆ	ˆ	ˆ	àð 	Ý”)‘+”+ˆCð ”×"Ò" 3Ñ'Ô'ˆØð 	ØˆMð ð 	!ØŸšÐ1°3¸ÑFÔF×LÒLÈSÑQÔQˆIØð !ØÔ+ð ;°´ð ;Ø"œnÐ:Ð:¨yÐ:Ð:Ð:Ø Ð ð ð 	!ØŸšÐ1°3Ð8KÑLÔL×RÒRÐSVÑWÔWˆIØð !Ø Ð ð Ô  MÒ1Ð1°jÐ1ØÔ'ð 8¨D¬Nð 8Øœ.Ð7Ð7¨:Ð7Ð7Ð7ØÐð Ô  JÒ.Ð.Ø×&Ò& sÑ+Ô+Ð=­t°C©y¬y¬~ˆDØÔ'ð 2¨D¬Nð 2Øœ.Ð1Ð1¨4Ð1Ð1Ð1ØˆKð Ô Ð$DÐDÐDÝ˜‘9”9”>ˆDØÔ'ð 2¨D¬Nð 2Øœ.Ð1Ð1¨4Ð1Ð1Ð1ØˆKð Ô Ð r(   )r   N)r}   r   r|   r~   r   r{   )NN)r|   r~   r©   rª   r   r{   )rÙ   r   r   r~   )NNNN)
rÙ   r~   rç   r~   rè   r~   ré   r~   r   r~   )/Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r|   Ú__annotations__r}   r   r�   r‚   rƒ   r„   r…   r†   r‡   r‰   rŠ   r‹   rŒ   rŽ   r�   r�   r‘   r’   r”   r–   r—   r˜   r™   rh   ri   rj   rk   r›   rœ   r   ro   rž   rŸ   r    Úclassmethodr¨   rØ   Ústaticmethodræ   rô   rÆ   r(   r   r{   r{   Ö   s:  € € € € € € àHÐHà€DÐÐÐÑØ €LÐ Ð Ð Ñ Ø€GÐÐÐÑØ#€KÐ#Ð#Ð#Ñ#à€HÐÐÐÑà €GÐ Ð Ð Ñ à €IÐ Ð Ð Ñ Ø€GÐÐÐÑà€GÐÐÐÑØ€MÐÐÐÑð ")€OÐ(Ð(Ð(Ñ(à!%€NÐ%Ð%Ð%Ñ%ð &+ÐÐ*Ð*Ð*Ñ*ð #ÐÐ"Ð"Ð"Ñ"à"ÐÐ"Ð"Ð"Ñ"ð €OÐÐÐÑð 04ÐÐ3Ð3Ð3Ñ3ð !%ÐÐ$Ð$Ð$Ñ$à%ÐÐ%Ð%Ð%Ñ%ð #ÐÐ"Ð"Ð"Ñ"à%*ÐÐ*Ð*Ð*Ñ*ð
  €KÐÐÐÑð #(ÐÐ'Ð'Ð'Ñ'ð *ÐÐ)Ð)Ð)Ñ)ð !€OÐ Ð Ð Ñ Ø $ÐÐ$Ð$Ð$Ñ$Ø€MÐÐÐÑØ"ÐÐ"Ð"Ð"Ñ"à+ÐÐ+Ð+Ð+Ñ+Ø %ÐÐ%Ð%Ð%Ñ%Ø$˜u°TÐ:Ñ:Ô:€HÐ:Ð:Ð:Ñ:à˜%°Ð5Ñ5Ô5€CÐ5Ð5Ð5Ñ5ð #(ÐÐ'Ð'Ð'Ñ'àð %Øð
ð 
ð 
ð 
ñ „[ð
ð* ð  Ø#'ð@
ð @
ð @
ð @
ñ „[ð@
ðD ðð ð ñ „\ðð" Ø$(Ø!%Ø*.ðC!ð C!ð C!ð C!ð C!ð C!ð C!r(   r{   zHoncho | NoneÚ_honcho_clientÚconfigúHonchoClientConfig | Noner   c                óH  — t           �t           S | €t                               ¦   «         } | j        s| j        st          d¦  «        ‚	 ddlm} n# t          $ r t          d¦  «        ‚w xY w| j        }| j	        }|r|€±	 ddl
m}  |¦   «         }|                     di ¦  «        }t          |t          ¦  «        rd|s*|                     dd	¦  «                             ¦   «         pd}|€6t!          |                     d
¦  «        |                     d¦  «        ¦  «        }n# t"          $ r Y nw xY w|r"t$                               d|| j        ¦  «         n&t$                               d| j        | j        ¦  «         |od|v pd|v pd|v }|rg| j        pi }|                     d¦  «        pi                      | j        i ¦  «        }	t/          |	                     d¦  «        ¦  «        }
|
r| j        nd}n| j        }| j        || j        dœ}|r||d<   |�||d
<    |di |¤Ža t           S )z©Get or create the Honcho client singleton.

    When no config is provided, attempts to load ~/.honcho/config.json
    first, falling back to environment variables.
    Nz­Honcho API key not found. Get your API key at https://app.honcho.dev, then run 'hermes honcho setup' or set HONCHO_API_KEY. For local instances, set HONCHO_BASE_URL instead.r   r
   zThoncho-ai is required for Honcho integration. Install it with: pip install honcho-ai)Úload_configÚhonchor‚   r   rƒ   Úrequest_timeoutz8Initializing Honcho client (base_url: %s, workspace: %s)z4Initializing Honcho client (host: %s, workspace: %s)Ú	localhostz	127.0.0.1z::1r­   r°   Úlocal)r}   r   r�   rÆ   )rü   r{   rØ   r   r‚   r;   r  r   ÚImportErrorrƒ   Úhermes_cli.configr   r   rQ   ro   r   r]   r   rÇ   Úinfor}   r|   rŸ   r3   r�   )rý   r   Úresolved_base_urlÚresolved_timeoutr   Ú
hermes_cfgÚ
honcho_cfgÚ	_is_localÚ_rawÚ_host_blockÚ_host_has_keyÚeffective_api_keyÚkwargss                r   Úget_honcho_clientr  V  sÕ  € õ Ð!ÝÐà€~Ý#×6Ò6Ñ8Ô8ˆàŒ>ð 
 &¤/ð 
Ýð@ñ
ô 
ð 	
ð
Ø!Ð!Ð!Ð!Ð!Ð!Ð!øÝð 
ð 
ð 
Ýð5ñ
ô 
ð 	
ð
øøøð œÐØ”~ÐØð Ð 0Ð 8ð	Ø5Ð5Ð5Ð5Ð5Ð5Ø$˜™œˆJØ#Ÿš¨°"Ñ5Ô5ˆJÝ˜*¥dÑ+Ô+ð Ø(ð WØ(2¯ª°zÀ2Ñ(FÔ(F×(LÒ(LÑ(NÔ(NÐ(VÐRVÐ%Ø#Ð+Ý'>Ø"Ÿš yÑ1Ô1Ø"ŸšÐ'8Ñ9Ô9ñ(ô (Ð$øøõ ð 	ð 	ð 	ØˆDð	øøøð ð nÝ�ŠÐNÐPaÐciÔcvÑwÔwÐwÐwå�ŠÐJÈFÌKÐY_ÔYlÑmÔmÐmð "ð ØÐ(Ð(ð 	&ØÐ+Ð+ð	&àÐ%Ð%ð ð
 ð +àŒzÐ˜RˆØ—x’x Ñ(Ô(Ð.¨B×3Ò3°F´KÀÑDÔDˆÝ˜[Ÿ_š_¨XÑ6Ô6Ñ7Ô7ˆØ.;ÐH˜FœN˜NÀÐÐà"œNÐð Ô+Ø$ØÔ)ðð €Fð
 ð /Ø.ˆˆzÑØÐ#Ø,ˆˆyÑà�VÐ%Ð%˜fÐ%Ð%€NåÐs   ÁA ÁA)Á?BD Ä
D,Ä+D,ÚNonec                 ó
   — da dS )z7Reset the Honcho client singleton (useful for testing).N)rü   rÆ   r(   r   Úreset_honcho_clientr  °  s   € ð €N€N€Nr(   )r   r   )r   r   )r-   r   r   r   )r   r3   r   r3   )r   r8   )r   r:   )rI   r:   r   rJ   )rW   r   r   rX   )rl   r   rm   rn   r   ro   )N)rý   rþ   r   r   )r   r  )-rø   Ú
__future__r   rÉ   r   ÚloggingÚdataclassesr   r   Úpathlibr   Úhermes_constantsr   Útypingr   r	   r  r   Ú	getLoggerrõ   rÇ   r#   r$   r   r    r'   r/   r0   r2   r7   r>   rD   rM   rV   r]   re   rd   rf   ru   ry   r{   rü   rù   r  r  rÆ   r(   r   ú<module>r     s²  ððð ð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø €€€Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ð Ð à ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø %Ð %Ð %Ð %Ð %Ð %Ð %Ð %àð ØÐÐÐÐÐà	ˆÔ	˜8Ñ	$Ô	$€à�T”Y‘[”[ 9Ñ,¨}Ñ<Ð Ø€ðð ð ð ð,ð ð ð ð,  Ð)Ð Ø4Ð4Ð4Ð ð;ð ;ð ;ð ;ðð ð ð ðð ð ð ðð ð ð ð FÐ ðð ð ð ð&ð ð ð ð$ & }Ð5Ð Ø'0¸mÐVcÐdÐdÐ ðEð Eð Eð Eð  ¸Ø°Dðð ð
  ¸Ø°Tðð ð	ð 	Ð ðð ð ð ð> ðy!ð y!ð y!ð y!ð y!ñ y!ô y!ñ „ðy!ðx !%€Ð $Ð $Ð $Ñ $ðWð Wð Wð Wð Wðtð ð ð ð ð r(   