§
    ‰eîiÆÔ  ã                  ó¦  — d Z ddlm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	m
Z
mZmZ ddlmZ ddlmZ  ej        e¦  «        Zddd	d
ddœddd
iddœdœg dœdœZddd	d
ddœdddœd
ddœdœdgdœdœZddd	d
ddœd
dg d¢d œd
ddœd!œdgdœdœZd"d#d	d
d$dœd
ddœd%œg dœdœZd&d'd	d
d(dœd
d)dœd
ddœd*œg dœdœZeeeeegZ G d+„ d,e¦  «        Zd0d/„ZdS )1uL  Honcho memory plugin â€” MemoryProvider for Honcho AI-native memory.

Provides cross-session user modeling with dialectic Q&A, semantic search,
peer cards, and persistent conclusions via the Honcho SDK. Honcho provides AI-native cross-session user
modeling with dialectic Q&A, semantic search, peer cards, and conclusions.

The 4 tools (profile, search, context, conclude) are exposed through
the MemoryProvider interface.

Config: Uses the existing Honcho config chain:
  1. $HERMES_HOME/honcho.json (profile-scoped)
  2. ~/.honcho/config.json (legacy global)
  3. Environment variables
é    )ÚannotationsN)ÚAnyÚDictÚListÚOptional)ÚMemoryProvider)Ú
tool_errorÚhoncho_profileuÀ   Retrieve or update a peer card from Honcho â€” a curated list of key facts about that peer (name, role, preferences, communication style, patterns). Pass `card` to update; omit `card` to read.ÚobjectÚstringzaPeer to query. Built-in aliases: 'user' (default), 'ai'. Or pass any peer ID from this workspace.)ÚtypeÚdescriptionÚarrayr   zGNew peer card as a list of fact strings. Omit to read the current card.)r   Úitemsr   )ÚpeerÚcard)r   Ú
propertiesÚrequired)Únamer   Ú
parametersÚhoncho_searchuñ   Semantic search over Honcho's stored context about a peer. Returns raw excerpts ranked by relevance â€” no LLM synthesis. Cheaper and faster than honcho_reasoning. Good when you want to find specific past facts and reason over them yourself.z&What to search for in Honcho's memory.Úintegerz:Token budget for returned context (default 800, max 2000).)ÚqueryÚ
max_tokensr   r   Úhoncho_reasoningug  Ask Honcho a natural language question and get a synthesized answer. Uses Honcho's LLM (dialectic reasoning) â€” higher cost than honcho_profile or honcho_search. Can query about any peer via alias or explicit peer ID. Pass reasoning_level to control depth: minimal (fast/cheap), low (default), medium, high, max (deep/expensive). Omit for configured default.zA natural language question.aŸ  Override the default reasoning depth. Omit to use the configured default (typically low). Guide:
- minimal: quick factual lookups (name, role, simple preference)
- low: straightforward questions with clear answers
- medium: multi-aspect questions requiring synthesis across observations
- high: complex behavioral patterns, contradictions, deep analysis
- max: thorough audit-level analysis, leave no stone unturned©ÚminimalÚlowÚmediumÚhighÚmax)r   r   Úenum)r   Úreasoning_levelr   Úhoncho_contextuõ   Retrieve full session context from Honcho â€” summary, peer representation, peer card, and recent messages. No LLM synthesis. Cheaper than honcho_reasoning. Use this to see what Honcho knows about the current conversation and the specified peer.zOOptional focus query to filter context. Omit for full session context snapshot.)r   r   Úhoncho_concludeuC  Write or delete a conclusion about a peer in Honcho's memory. Conclusions are persistent facts that build a peer's profile. You MUST pass exactly one of: `conclusion` (to create) or `delete_id` (to delete). Passing neither is an error. Deletion is only for PII removal â€” Honcho self-heals incorrect conclusions over time.zpA factual statement to persist. Provide this when creating a conclusion. Do not send it together with delete_id.zzConclusion ID to delete for PII removal. Provide this when deleting a conclusion. Do not send it together with conclusion.)Ú
conclusionÚ	delete_idr   c                  óº  — e Zd ZU dZd„ ZedNd„¦   «         ZdOd„Zd„ Zd	„ Z	dPd„Z
dQd„ZdQd„ZdOd„ZdRd„ZdNd„ZddœdSd„ZdTd„ZddœdUd„Zddddddd œZd!ed"<   d#Zd$Zd%Zd&Zd'Zd(ZdOd)„ZdVd+„ZdWd,„ZdXd-„ZdYdZd/„Zd[d3„Z e!d\d5„¦   «         Z"d]d6„Z# e$j%        d7e$j&        ¦  «        Z'e(d^d8„¦   «         Z)d_d;„Z*e!d`d>„¦   «         Z+ddœdadA„Z,dbdD„Z-dcdG„Z.dddH„Z/dedK„Z0dfdL„Z1dMS )gÚHonchoMemoryProviderzHHoncho AI-native memory with dialectic Q&A and persistent user modeling.c                óÄ  — d | _         d | _        d| _        d| _        t	          j        ¦   «         | _        d | _        d | _        d| _	        d | _
        t	          j        ¦   «         | _        d| _        d| _        d| _        d| _        d| _        d | _        d| _        d| _        d| _        d| _        d	| _        d| _        d| _        d
| _        d | _        d | _        d
| _        d S )NÚ Úhybridr   ú
every-turné   Tr    éüÿÿg        F)Ú_managerÚ_configÚ_session_keyÚ_prefetch_resultÚ	threadingÚLockÚ_prefetch_lockÚ_prefetch_threadÚ_sync_threadÚ_recall_modeÚ_base_context_cacheÚ_base_context_lockÚ_turn_countÚ_injection_frequencyÚ_context_cadenceÚ_dialectic_cadenceÚ_dialectic_depthÚ_dialectic_depth_levelsÚ_reasoning_heuristicÚ_reasoning_level_capÚ_last_context_turnÚ_last_dialectic_turnÚ_prefetch_thread_started_atÚ_prefetch_result_fired_atÚ_dialectic_empty_streakÚ_session_initializedÚ_lazy_init_kwargsÚ_lazy_init_session_idÚ_cron_skipped©Úselfs    ú@/home/div/.hermes/hermes-agent/plugins/memory/honcho/__init__.pyÚ__init__zHonchoMemoryProvider.__init__¾   sú   € ØˆŒØˆŒØˆÔØ "ˆÔÝ'œnÑ.Ô.ˆÔØ<@ˆÔØ8<ˆÔð %ˆÔð 37ˆÔ Ý"+¤.Ñ"2Ô"2ˆÔð ˆÔØ$0ˆÔ!Ø !ˆÔØ"#ˆÔØ !ˆÔØ9=ˆÔ$Ø*.ˆÔ!Ø)/ˆÔ!Ø"&ˆÔØ$(ˆÔ!ð 36ˆÔ(Ø.2ˆÔ&Ø,-ˆÔ$ð %*ˆÔ!Ø15ˆÔØ48ˆÔ"ð #ˆÔÐÐó    ÚreturnÚstrc                ó   — dS )NÚhoncho© rM   s    rO   r   zHonchoMemoryProvider.nameç   s   € àˆxrQ   Úboolc                óž   — 	 ddl m} |                     ¦   «         }|j        ot	          |j        p|j        ¦  «        S # t          $ r Y dS w xY w)z0Check if Honcho is configured. No network calls.r   )ÚHonchoClientConfigF)Úplugins.memory.honcho.clientrY   Úfrom_global_configÚenabledrW   Úapi_keyÚbase_urlÚ	Exception)rN   rY   Úcfgs      rO   Úis_availablez!HonchoMemoryProvider.is_availableë   sj   € ð	ØGÐGÐGÐGÐGÐGØ$×7Ò7Ñ9Ô9ˆCà”;ÐD¥4¨¬Ð(C°s´|Ñ#DÔ#DÐDøÝð 	ð 	ð 	Ø�5�5ð	øøøs   ‚;> ¾
AÁAc                ó>  — ddl }ddlm}  ||¦  «        dz  }i }|                     ¦   «         r4	  |j        |                     ¦   «         ¦  «        }n# t          $ r Y nw xY w|                     |¦  «         |                      |j	        |d¬¦  «        ¦  «         dS )zDWrite config to $HERMES_HOME/honcho.json (Honcho SDK native format).r   N)ÚPathzhoncho.jsoné   )Úindent)
ÚjsonÚpathlibrc   ÚexistsÚloadsÚ	read_textr_   ÚupdateÚ
write_textÚdumps)rN   ÚvaluesÚhermes_homerf   rc   Úconfig_pathÚexistings          rO   Úsave_configz HonchoMemoryProvider.save_configõ   sË   € àˆˆˆØ Ð Ð Ð Ð Ð Ø�d˜;Ñ'Ô'¨-Ñ7ˆØˆØ×ÒÑÔð 	ðØ%˜4œ: k×&;Ò&;Ñ&=Ô&=Ñ>Ô>��øÝð ð ð Ø�ðøøøà�Š˜ÑÔÐØ×Ò˜z˜tœz¨(¸1Ð=Ñ=Ô=Ñ>Ô>Ð>Ð>Ð>s   °"A Á
A ÁA c                ó   — ddddddœddd	œgS )
Nr]   zHoncho API keyTÚHONCHO_API_KEYzhttps://app.honcho.dev)Úkeyr   ÚsecretÚenv_varÚurlÚbaseUrlz!Honcho base URL (for self-hosted))ru   r   rV   rM   s    rO   Úget_config_schemaz&HonchoMemoryProvider.get_config_schema  s6   € àÐ.>È$Ð[kð  uMð  Nð  NØÐ.QÐRÐRð
ð 	
rQ   ro   ÚconfigÚdictÚNonec                óT   — ddl }ddlm}  ||                     ¦   «         ¦  «         dS )z:Run the full Honcho setup wizard after provider selection.r   N)Ú	cmd_setup)ÚtypesÚplugins.memory.honcho.clir   ÚSimpleNamespace)rN   ro   r{   r€   r   s        rO   Ú
post_setupzHonchoMemoryProvider.post_setup	  s?   € àˆˆˆØ7Ð7Ð7Ð7Ð7Ð7Øˆ	�%×'Ò'Ñ)Ô)Ñ*Ô*Ð*Ð*Ð*rQ   Ú
session_idc                óT  — 	 |                      dd¦  «        }|                      dd¦  «        }|dv s|dk    r%t                               d||¦  «         d| _        d	S d
dlm}m} d
dlm} | 	                    ¦   «         }|j
        r|j        s#|j        st                               d¦  «         d	S || _        |j        | _        t                               d| j        ¦  «         	 |j        pi }	|	                      dd¦  «        | _        t%          |	                      dd¦  «        ¦  «        | _        t%          |	                      dd¦  «        ¦  «        | _        t+          dt-          |j        d¦  «        ¦  «        | _        |j        | _        |j        | _        |j        | j        v r|j        | _        n2# t@          $ r%}
t                               d|
¦  «         Y d	}
~
nd	}
~
ww xY w| j        dk    rI|j!        r | j"        ||fi |¤Ž d	S || _#        || _$        || _        t                               d¦  «         d	S  | j"        ||fi |¤Ž d	S # tJ          $ r t                               d¦  «         Y d	S t@          $ r-}
t           &                    d|
¦  «         d	| _'        Y d	}
~
d	S d	}
~
ww xY w)zßInitialize Honcho session manager.

        Handles: cron guard, recall_mode, session name resolution,
        peer memory mode, SOUL.md ai_peer sync, memory file migration,
        and pre-warming context at init.
        Úagent_contextr+   ÚplatformÚcli)ÚcronÚflushr‰   zBHoncho skipped: cron/flush context (agent_context=%s, platform=%s)TNr   )rY   Úget_honcho_client©ÚHonchoSessionManageru)   Honcho not configured â€” plugin inactivezHoncho recall_mode: %sÚinjectionFrequencyr-   ÚcontextCadencer.   ÚdialecticCadenceé   z,Honcho cost-awareness config parse error: %sÚtoolsuG   Honcho tools-only mode â€” deferring session init until first tool callu3   honcho-ai package not installed â€” plugin inactivezHoncho init failed: %s)(ÚgetÚloggerÚdebugrL   rZ   rY   r‹   Úplugins.memory.honcho.sessionr�   r[   r\   r]   r^   r1   Úrecall_moder9   Úrawr=   Úintr>   r?   r!   ÚminÚdialectic_depthr@   Údialectic_depth_levelsrA   Úreasoning_heuristicrB   Úreasoning_level_capÚ_LEVEL_ORDERrC   r_   Úinit_on_session_startÚ_do_session_initrJ   rK   ÚImportErrorÚwarningr0   )rN   r„   Úkwargsr†   r‡   rY   r‹   r�   r`   r˜   Úes              rO   Ú
initializezHonchoMemoryProvider.initialize  s  € ðD	!à"ŸJšJ ¸Ñ;Ô;ˆMØ—z’z *¨eÑ4Ô4ˆHØÐ 1Ð1Ð1°XÀÒ5GÐ5GÝ—’ÐaØ*¨Hñ6ô 6ð 6à%)�Ô"Ø�àZÐZÐZÐZÐZÐZÐZÐZØJÐJÐJÐJÐJÐJà$×7Ò7Ñ9Ô9ˆCØ”;ð  s¤{ð °c´lð Ý—’ÐHÑIÔIÐIØ�àˆDŒLð !$¤ˆDÔÝ�LŠLÐ1°4Ô3DÑEÔEÐEðPØ”g�m �Ø,/¯GªGÐ4HÈ,Ñ,WÔ,W�Ô)Ý(+¨C¯GªGÐ4DÀaÑ,HÔ,HÑ(IÔ(I�Ô%õ
 +.¨c¯gªgÐ6HÈ!Ñ.LÔ.LÑ*MÔ*M�Ô'Ý(+¨A­s°3Ô3FÈÑ/JÔ/JÑ(KÔ(K�Ô%Ø/2Ô/I�Ô,Ø,/Ô,C�Ô)ØÔ*¨dÔ.?Ð?Ð?Ø03Ô0G�DÔ-øøÝð Pð Pð PÝ—’ÐKÈQÑOÔOÐOÐOÐOÐOÐOÐOøøøøðPøøøð Ô  GÒ+Ð+ØÔ,ð à)�DÔ)¨#¨zÐDÐD¸VÐDÐDÐDØ�Fà)/�Ô&Ø-7�Ô*à"�”Ý—’ÐfÑgÔgÐgØ�ð "ˆDÔ! # zÐ<Ð<°VÐ<Ð<Ð<Ð<Ð<øåð 	Pð 	Pð 	PÝ�LŠLÐNÑOÔOÐOÐOÐOÐOÝð 	!ð 	!ð 	!Ý�NŠNÐ3°QÑ7Ô7Ð7Ø ˆDŒMˆMˆMˆMˆMˆMˆMøøøøð	!øøøsb   ‚AI
 ÁAI
 Â03I
 Ã$CF3 Æ2I
 Æ3
G"Æ=GÇI
 ÇG"Ç"$I
 È/I
 È9I
 É
$J'É1	J'É:"J"Ê"J'c                ó  ‡ ‡— ddl m} ddlm}  ||¦  «        } ||||j        |                     d¦  «        pd¬¦  «        ‰ _        |                     d¦  «        }|                     d¦  «        }|                     |||¬	¦  «        p|pd
‰ _        t           
                    d‰ j        ¦  «         ‰ j                             ‰ j        ¦  «        }	d‰ _        	 |	j        sl|j        dk    raddlm}
 t#           |
¦   «         dz  ¦  «        }‰ j                             ‰ j        |¦  «         t           
                    d‰ j        ¦  «         n+|j        dk    r t           
                    d‰ j        ¦  «         n2# t&          $ r%}t           
                    d|¦  «         Y d}~nd}~ww xY w‰ j        dv rË	 ‰ j                             ‰ j        ¦  «         n2# t&          $ r%}t           
                    d|¦  «         Y d}~nd}~ww xY wdŠdˆˆ fd„}t-          j        ¦   «         ‰ _        t3          j        |dd¬¦  «        ‰ _        ‰ j                             ¦   «          t           
                    d‰ j        ¦  «         dS dS )zBShared session initialization logic for both eager and lazy paths.r   )r‹   rŒ   Úuser_idN)rU   r{   Úcontext_tokensÚruntime_user_peer_nameÚsession_titleÚgateway_session_key)r«   r„   r¬   úhermes-defaultzHoncho session key resolved: %sTzper-session)Úget_hermes_homeÚmemoriesz:Honcho memory file migration attempted for new session: %sz_Honcho memory file migration skipped: per-session strategy creates a fresh session per run (%s)z(Honcho memory file migration skipped: %s)Úcontextr,   z!Honcho context prewarm failed: %szcSummarize what you know about this user. Focus on preferences, current projects, and working style.rR   r}   c                 ó‚  •— 	 ‰                      ‰¦  «        } nC# t          $ r6}t                               d|¦  «         ‰xj        dz  c_        Y d }~d S d }~ww xY w| rQ|                      ¦   «         r=‰j        5  | ‰_        d‰_        d d d ¦  «         n# 1 swxY w Y   d‰_	        d‰_        d S ‰xj        dz  c_        d S )Nz#Honcho dialectic prewarm failed: %sr.   r   ©
Ú_run_dialectic_depthr_   r”   r•   rH   Ústripr6   r3   rG   rE   )ÚrÚexcÚ_prewarm_queryrN   s     €€rO   Ú_prewarm_dialecticzAHonchoMemoryProvider._do_session_init.<locals>._prewarm_dialecticž  s+  ø€ ðØ×1Ò1°.ÑAÔA�A�AøÝ ð ð ð Ý—L’LÐ!FÈÑLÔLÐLØÐ0Ô0°AÑ5Ð0Ô0Ø�F�F�F�F�Føøøøðøøøð ð 6˜Ÿš™œð 6ØÔ,ð ;ð ;Ø01˜Ô-Ø9:˜Ô6ð;ð ;ð ;ñ ;ô ;ð ;ð ;ð ;ð ;ð ;ð ;øøøð ;ð ;ð ;ð ;ð 12�DÔ-Ø34�DÔ0Ð0Ð0àÐ0Ô0°AÑ5Ð0Ô0Ð0Ð0ó&   ƒ ™
A£+AÁAÁ9BÂBÂBzhoncho-prewarm-dialectic©ÚtargetÚdaemonr   z'Honcho pre-warm started for session: %s©rR   r}   )rZ   r‹   r–   r�   r©   r“   r0   Úresolve_session_namer2   r”   r•   Úget_or_createrI   ÚmessagesÚsession_strategyÚhermes_constantsr®   rS   Úmigrate_memory_filesr_   r9   Úprefetch_contextÚtimeÚ	monotonicrF   r4   ÚThreadr7   Ústart)rN   r`   r„   r¤   r‹   r�   Úclientr«   r¬   Úsessionr®   Úmem_dirr¥   r¸   r·   s   `             @rO   r¡   z%HonchoMemoryProvider._do_session_init\  s"  øø€ àBÐBÐBÐBÐBÐBØFÐFÐFÐFÐFÐFà"Ð" 3Ñ'Ô'ˆØ,Ð,ØØØÔ-Ø#)§:¢:¨iÑ#8Ô#8Ð#@¸Dð	
ñ 
ô 
ˆŒð Ÿ
š
 ?Ñ3Ô3ˆØ$ŸjšjÐ)>Ñ?Ô?Ðà×$Ò$Ø+Ø%Ø$7ð %ñ ô ð  ð
 ð ð  ð 	Ôõ 	�ŠÐ6¸Ô8IÑJÔJÐJð ”-×-Ò-¨dÔ.?Ñ@Ô@ˆØ$(ˆÔ!ð	HØÔ#ð 	¨Ô(<ÀÒ(MÐ(MØ<Ð<Ð<Ð<Ð<Ð<Ý˜o˜oÑ/Ô/°*Ñ<Ñ=Ô=�Ø”×2Ò2°4Ô3DÀgÑNÔNÐNÝ—’ÐYÐ[_Ô[lÑmÔmÐmÐmØÔ%¨Ò6Ð6Ý—’ØuØÔ%ñô ð øøõ ð 	Hð 	Hð 	HÝ�LŠLÐCÀQÑGÔGÐGÐGÐGÐGÐGÐGøøøøð	Høøøð ÔÐ 5Ð5Ð5ðEØ”×.Ò.¨tÔ/@ÑAÔAÐAÐAøÝð Eð Eð EÝ—’Ð@À!ÑDÔDÐDÐDÐDÐDÐDÐDøøøøðEøøøðMð ð
6ð 6ð 6ð 6ð 6ð 6ð 6õ" 04¬~Ñ/?Ô/?ˆDÔ,Ý$-Ô$4Ø)°$Ð=Wð%ñ %ô %ˆDÔ!ð Ô!×'Ò'Ñ)Ô)Ð)Ý�LŠLÐBÀDÔDUÑVÔVÐVÐVÐVðC 6Ð5s1   ÃBE9 Å9
F(ÆF#Æ#F(Æ5G Ç
HÇG?Ç?Hc                ó*  — | j         r	| j        rdS | j        rdS | j        r| j        sdS 	  | j        | j        | j        pdfi | j        ¤Ž d| _        d| _        | j         duS # t          $ r&}t           	                    d|¦  «         Y d}~dS d}~ww xY w)z„Lazily initialize the Honcho session (for tools-only mode).

        Returns True if the manager is ready, False otherwise.
        TFr­   Nz#Honcho lazy session init failed: %s)
r0   rI   rL   r1   rJ   r¡   rK   r_   r”   r£   )rN   r¥   s     rO   Ú_ensure_sessionz$HonchoMemoryProvider._ensure_session¶  så   € ð
 Œ=ð 	˜TÔ6ð 	Ø�4ØÔð 	Ø�5ØŒ|ð 	 4Ô#9ð 	Ø�5ð	Ø!ˆDÔ!Ø”ØÔ*Ð>Ð.>ðð ð Ô(ðð ð ð &*ˆDÔ"Ø)-ˆDÔ&Ø”=¨Ð,Ð,øÝð 	ð 	ð 	Ý�NŠNÐ@À!ÑDÔDÐDØ�5�5�5�5�5øøøøð	øøøs   «6A" Á"
BÁ,BÂBÚctxc                ó  — g }|                      dd¦  «        }|r|                     d|› �¦  «         |                      dd¦  «        }|r|                     d|› �¦  «         |                      dd¦  «        }|r|                     d|› �¦  «         |                      dd¦  «        }|r|                     d	|› �¦  «         |                      d
d¦  «        }|r|                     d|› �¦  «         |sdS d                     |¦  «        S )zEFormat the prefetch context dict into a readable system prompt block.Úsummaryr+   z## Session Summary
Úrepresentationz## User Representation
r   z## User Peer Card
Úai_representationz## AI Self-Representation
Úai_cardz## AI Identity Card
ú

)r“   ÚappendÚjoin)rN   rÎ   ÚpartsrÐ   Úrepr   Úai_reprÓ   s           rO   Ú_format_first_turn_contextz/HonchoMemoryProvider._format_first_turn_contextÐ  s9  € àˆð —'’'˜) RÑ(Ô(ˆØð 	;Ø�LŠLÐ9°Ð9Ð9Ñ:Ô:Ð:à�gŠgÐ&¨Ñ+Ô+ˆØð 	;Ø�LŠLÐ9°CÐ9Ð9Ñ:Ô:Ð:à�wŠw�v˜rÑ"Ô"ˆØð 	7Ø�LŠLÐ5¨tÐ5Ð5Ñ6Ô6Ð6à—’Ð,¨bÑ1Ô1ˆØð 	AØ�LŠLÐ?°vÐ?Ð?Ñ@Ô@Ð@à—'’'˜) RÑ(Ô(ˆØð 	<Ø�LŠLÐ:°Ð:Ð:Ñ;Ô;Ð;àð 	Ø�2Ø�{Š{˜5Ñ!Ô!Ð!rQ   c                óž   — | j         rdS | j        r| j        s| j        dk    r
| j        r	 dS dS | j        dk    rd}n| j        dk    rd}nd}|S )u  Return system prompt text, adapted by recall_mode.

        Returns only the mode header and tool instructions â€” static text
        that doesn't change between turns (prompt-cache friendly).
        Live context (representation, card) is injected via prefetch().
        r+   r’   zŸ# Honcho Memory
Active (tools-only mode). Use honcho_profile, honcho_search, honcho_reasoning, honcho_context, and honcho_conclude tools to access user memory.r°   u¶   # Honcho Memory
Active (context-injection mode). Relevant user context is automatically injected before each turn. No memory tools are available â€” context is managed automatically.u’  # Honcho Memory
Active (tools-only mode). Use honcho_profile for a quick factual snapshot, honcho_search for raw excerpts, honcho_context for raw peer context, honcho_reasoning for synthesized answers (pass reasoning_level minimal/low/medium/high/max â€” you pick the depth per call), honcho_conclude to save facts about the user. No automatic context injection â€” you must use tools to access memory.uˆ  # Honcho Memory
Active (hybrid mode). Relevant context is auto-injected AND memory tools are available. Use honcho_profile for a quick factual snapshot, honcho_search for raw excerpts, honcho_context for raw peer context, honcho_reasoning for synthesized answers (pass reasoning_level minimal/low/medium/high/max â€” you pick the depth per call), honcho_conclude to save facts about the user.)rL   r0   r2   r9   r1   )rN   Úheaders     rO   Úsystem_prompt_blockz(HonchoMemoryProvider.system_prompt_blockí  sŸ   € ð Ôð 	Ø�2ØŒ}ð 	 DÔ$5ð 	àÔ  GÒ+Ð+°´Ð+ðiðð ð
 �2ð Ô 	Ò)Ð)ð)ð ˆFð Ô 'Ò)Ð)ðZð ˆFð@ð ð ˆrQ   r+   )r„   r   c               ór  ‡ ‡‡— ‰ j         rdS ‰ j        dk    rdS ‰ j        dk    r‰ j        dk    rdS ‰                      ‰¦  «        rdS g }‰ j        5  ‰ j        €„	 ‰ j                             ‰ j	        ¦  «        }|r‰  
                    |¦  «        nd‰ _        ‰ j        ‰ _        n9# t          $ r,}t                               d|¦  «         d‰ _        Y d}~nd}~ww xY w‰ j        }ddd¦  «         n# 1 swxY w Y   ‰ j        r`‰ j                             ‰ j	        ¦  «        }|r?‰  
                    |¦  «        }|r(‰ j        5  |‰ _        ddd¦  «         n# 1 swxY w Y   |}|r|                     |¦  «         ‰ j        5  t%          ‰ j        ¦  «        }	ddd¦  «         n# 1 swxY w Y   |	r‰ j        dk    r‰ j        ‰ _        ‰ j        dk    rÎ‰rÌ‰ j        r‰ j        j        r‰ j        j        nd}
‰ j        Šdˆˆˆ fd„}t/          j        ¦   «         ‰ _        t5          j        |dd¬¦  «        ‰ _        ‰ j                             ¦   «          ‰ j                             |
¬¦  «         ‰ j                             ¦   «         rt                               d|
¦  «         ‰ j        r4‰ j                             ¦   «         r‰ j                             d¬¦  «         ‰ j        5  ‰ j        }‰ j         }d‰ _        d‰ _         ddd¦  «         n# 1 swxY w Y   ‰ j!        ‰ j"        z  }|r8|dk    r2‰ j        |z
  |k    r$t                               d|‰ j        |¦  «         d}|r)| #                    ¦   «         r|                     |¦  «         |sdS d                     |¦  «        }‰  $                    |¦  «        }|S )uê  Return base context (representation + card) plus dialectic supplement.

        Assembles two layers:
        1. Base context from peer.context() â€” cached, refreshed on context_cadence
        2. Dialectic supplement â€” cached, refreshed on dialectic_cadence

        B1: Returns empty when recall_mode is "tools" (no injection).
        B5: Respects injection_frequency â€” "first-turn" returns cached/empty after turn 0.
        Port #3265: Truncates to context_tokens budget.
        r+   r’   z
first-turnr.   Nz$Honcho base context fetch failed: %sr/   ç       @rR   r}   c                 ó‚  •— 	 ‰                      ‰¦  «        } nC# t          $ r6}t                               d|¦  «         ‰xj        dz  c_        Y d }~d S d }~ww xY w| rQ|                      ¦   «         r=‰j        5  | ‰_        ‰‰_        d d d ¦  «         n# 1 swxY w Y   ‰‰_	        d‰_        d S ‰xj        dz  c_        d S )Nz&Honcho first-turn dialectic failed: %sr.   r   r²   )rµ   r¶   Ú	_fired_atr   rN   s     €€€rO   Ú_run_first_turnz6HonchoMemoryProvider.prefetch.<locals>._run_first_turnl  s<  ø€ ðØ×1Ò1°%Ñ8Ô8�A�AøÝ ð ð ð Ý—L’LÐ!IÈ3ÑOÔOÐOØÐ0Ô0°AÑ5Ð0Ô0Ø�F�F�F�F�Føøøøðøøøð ð 	6˜Ÿš™œð 	6ØÔ,ð Cð CØ01˜Ô-Ø9B˜Ô6ðCð Cð Cñ Cô Cð Cð Cð Cð Cð Cð Cøøøð Cð Cð Cð Cð
 1:�DÔ-Ø34�DÔ0Ð0Ð0àÐ0Ô0°AÑ5Ð0Ô0Ð0Ð0r¹   Tzhoncho-prefetch-firstrº   ©ÚtimeoutuS   Honcho first-turn dialectic still running after %.1fs â€” will surface on next turng      @r   zKHoncho pending dialectic discarded as stale: fired_at=%d, turn=%d, limit=%drÔ   r½   )%rL   r9   r=   r<   Ú_is_trivial_promptr;   r:   r0   Úget_prefetch_contextr2   rÚ   rD   r_   r”   r•   Úpop_context_resultrÕ   r6   rW   r3   rE   r1   rä   rÅ   rÆ   rF   r4   rÇ   r7   rÈ   rÖ   Úis_aliverG   r?   Ú_STALE_RESULT_MULTIPLIERr´   Ú_truncate_to_budget)rN   r   r„   r×   rÎ   r¥   Úbase_contextÚ	fresh_ctxÚ	formattedÚ_prewarm_landedÚ_first_turn_timeoutrâ   Údialectic_resultÚfired_atÚstale_limitÚresultrá   s   ``              @rO   ÚprefetchzHonchoMemoryProvider.prefetch  s_  øøø€ ð Ôð 	Ø�2ð Ô Ò'Ð'Ø�2ð Ô$¨Ò4Ð4¸Ô9IÈAÒ9MÐ9MØ�2ð ×"Ò" 5Ñ)Ô)ð 	Ø�2àˆð
 Ô$ð 
	4ð 
	4ØÔ'Ð/ð2Øœ-×<Ò<¸TÔ=NÑOÔO�CØWZÐ/b¨t×/NÒ/NÈsÑ/SÔ/SÐ/SÐ`b�DÔ,Ø.2Ô.>�DÔ+Ð+øÝ ð 2ð 2ð 2Ý—L’LÐ!GÈÑKÔKÐKØ/1�DÔ,Ð,Ð,Ð,Ð,Ð,øøøøð2øøøð  Ô3ˆLð
	4ð 
	4ð 
	4ñ 
	4ô 
	4ð 
	4ð 
	4ð 
	4ð 
	4ð 
	4ð 
	4øøøð 
	4ð 
	4ð 
	4ð 
	4ð Œ=ð 	-Øœ×8Ò8¸Ô9JÑKÔKˆIØð -Ø ×;Ò;¸IÑFÔF�	Øð -ØÔ0ð =ð =Ø3<˜Ô0ð=ð =ð =ñ =ô =ð =ð =ð =ð =ð =ð =øøøð =ð =ð =ð =à#,�Làð 	'Ø�LŠL˜Ñ&Ô&Ð&ð Ô ð 	:ð 	:Ý" 4Ô#8Ñ9Ô9ˆOð	:ð 	:ð 	:ñ 	:ô 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:øøøð 	:ð 	:ð 	:ð 	:àð 	9˜tÔ8¸DÒ@Ð@Ø(,Ô(8ˆDÔ%àÔ$¨Ò,Ð,°Ð,à(,¬ÐV¸¼Ô9MÐV�”Ô$Ð$ÐSVð  ð Ô(ˆIð6ð 6ð 6ð 6ð 6ð 6ð 6ð 6õ$ 04¬~Ñ/?Ô/?ˆDÔ,Ý$-Ô$4Ø&¨tÐ:Qð%ñ %ô %ˆDÔ!ð Ô!×'Ò'Ñ)Ô)Ð)ØÔ!×&Ò&Ð/BÐ&ÑCÔCÐCØÔ$×-Ò-Ñ/Ô/ð Ý—’ð0à'ñô ð ð Ô ð 	4 TÔ%:×%CÒ%CÑ%EÔ%Eð 	4ØÔ!×&Ò&¨sÐ&Ñ3Ô3Ð3ØÔ ð 	2ð 	2Ø#Ô4ÐØÔ5ˆHØ$&ˆDÔ!Ø-1ˆDÔ*ð		2ð 	2ð 	2ñ 	2ô 	2ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2øøøð 	2ð 	2ð 	2ð 	2ð Ô-°Ô0MÑMˆØð 	" ¨A¢ °4Ô3CÀhÑ3NÐR]Ò2]Ð2]Ý�LŠLð$Ø%-¨tÔ/?Àñô ð ð  "Ðàð 	+Ð 0× 6Ò 6Ñ 8Ô 8ð 	+Ø�LŠLÐ)Ñ*Ô*Ð*àð 	Ø�2à—’˜UÑ#Ô#ˆð ×)Ò)¨&Ñ1Ô1ˆàˆss   ÁC1ÁA	B%Â$C1Â%
CÂ/"CÃC1ÃCÃ
C1Ã1C5Ã8C5ÅEÅEÅEÆF"Æ"F&Æ)F&Ë!L
Ì
LÌLÚtextc                óâ   — | j         r| j         j        s|S | j         j        dz  }t          |¦  «        |k    r|S |d|…         }|                     d¦  «        }||dz  k    r
|d|…         }|dz   S )z9Truncate text to fit within context_tokens budget if set.é   Nú gš™™™™™é?u    â€¦)r1   r©   ÚlenÚrfind)rN   rõ   Úbudget_charsÚ	truncatedÚ
last_spaces        rO   rê   z(HonchoMemoryProvider._truncate_to_budget¬  sŠ   € àŒ|ð 	 4¤<Ô#>ð 	ØˆKØ”|Ô2°QÑ6ˆÝˆt‰9Œ9˜Ò$Ð$ØˆKà˜˜,˜Ô'ˆ	Ø—_’_ SÑ)Ô)ˆ
Ø˜ sÑ*Ò*Ð*Ø! + : +Ô.ˆIØ˜6Ñ!Ð!rQ   c               ób  ‡ ‡‡— ‰ j         rdS ‰ j        r	‰ j        r‰sdS ‰ j        dk    rdS ‰                      ‰¦  «        rdS ‰ j        dk    s‰ j        ‰ j        z
  ‰ j        k    r`‰ j        ‰ _        	 ‰ j                             ‰ j        ‰¦  «         n2# t          $ r%}t                               d|¦  «         Y d}~nd}~ww xY w‰                      ¦   «         rt                               d¦  «         dS ‰                      ¦   «         }‰ j        ‰ j        z
  |k     r7t                               d|‰ j        ‰ j        ‰ j        ‰ j        z
  ¦  «         dS ‰ j        Šˆˆˆ fd„}t#          j        ¦   «         ‰ _        t)          j        |dd	¬
¦  «        ‰ _        ‰ j                             ¦   «          dS )a  Fire background prefetch threads for the upcoming turn.

        B5: Checks cadence independently for dialectic and context refresh.
        Context refresh updates the base layer (representation + card).
        Dialectic fires the LLM reasoning supplement.
        Nr’   r.   z"Honcho context prefetch failed: %sz=Honcho dialectic prefetch skipped: prior thread still runningzhHoncho dialectic prefetch skipped: effective cadence %d (base %d, empty streak %d), turns since last: %dc                 ó‚  •— 	 ‰                      ‰¦  «        } nC# t          $ r6}t                               d|¦  «         ‰xj        dz  c_        Y d }~d S d }~ww xY w| rQ|                      ¦   «         r=‰j        5  | ‰_        ‰‰_        d d d ¦  «         n# 1 swxY w Y   ‰‰_	        d‰_        d S ‰xj        dz  c_        d S )NzHoncho prefetch failed: %sr.   r   r²   )ró   r¥   rá   r   rN   s     €€€rO   Ú_runz1HonchoMemoryProvider.queue_prefetch.<locals>._runî  s+  ø€ ðØ×2Ò2°5Ñ9Ô9��øÝð ð ð Ý—’Ð9¸1Ñ=Ô=Ð=ØÐ,Ô,°Ñ1Ð,Ô,Ø�����øøøøðøøøð ð 2˜&Ÿ,š,™.œ.ð 2ØÔ(ð ?ð ?Ø,2�DÔ)Ø5>�DÔ2ð?ð ?ð ?ñ ?ô ?ð ?ð ?ð ?ð ?ð ?ð ?øøøð ?ð ?ð ?ð ?ð -6�Ô)Ø/0�Ô,Ð,Ð,àÐ,Ô,°Ñ1Ð,Ô,Ð,Ð,r¹   Tzhoncho-prefetchrº   )rL   r0   r2   r9   rå   r>   r<   rD   rÄ   r_   r”   r•   Ú_thread_is_liveÚ_effective_cadencerE   r?   rH   rÅ   rÆ   rF   r4   rÇ   r7   rÈ   )rN   r   r„   r¥   Ú	effectiver   rá   s   ``    @rO   Úqueue_prefetchz#HonchoMemoryProvider.queue_prefetchº  s  øøø€ ð Ôð 	ØˆFØŒ}ð 	 DÔ$5ð 	¸Uð 	ØˆFð Ô Ò'Ð'ØˆFð ×"Ò" 5Ñ)Ô)ð 	ØˆFð Ô  AÒ%Ð%¨$Ô*:¸TÔ=TÑ*TÐY]ÔYnÒ)nÐ)nØ&*Ô&6ˆDÔ#ðFØ”×.Ò.¨tÔ/@À%ÑHÔHÐHÐHøÝð Fð Fð FÝ—’ÐAÀ1ÑEÔEÐEÐEÐEÐEÐEÐEøøøøðFøøøð ×ÒÑ!Ô!ð 	Ý�LŠLÐXÑYÔYÐYØˆFð ×+Ò+Ñ-Ô-ˆ	ØÔ˜tÔ8Ñ8¸IÒEÐEÝ�LŠLðCà˜4Ô2°DÔ4PØÔ  4Ô#<Ñ<ñ	ô ð ð ˆFð Ô$ˆ	ð	2ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2õ  ,0¬>Ñ+;Ô+;ˆÔ(Ý )Ô 0Ø Ð+<ð!
ñ !
ô !
ˆÔð 	Ô×#Ò#Ñ%Ô%Ð%Ð%Ð%s   Á3 B Â
CÂB>Â>CÚbaser   r   ))r.   r   )rd   r   )rd   r.   )r‘   r   )r‘   r.   )r‘   rd   zdict[tuple[int, int], str]Ú_PROPORTIONAL_LEVELSr   éx   i�  g       @rd   é   c                ó*  — | j         r| j                              ¦   «         sdS | j        r| j        j        r| j        j        nd}t	          j        ¦   «         | j        z
  }||| j        z  k    r&t           	                    d||| j        z  ¦  «         dS dS )z†Thread-alive guard that treats threads older than the stale
        threshold as dead, so a hung Honcho request can't block new fires.Frß   uS   Honcho prefetch thread age %.1fs exceeds stale threshold %.1fs â€” treating as deadT)
r7   rè   r1   rä   rÅ   rÆ   rF   Ú_STALE_THREAD_MULTIPLIERr”   r•   )rN   rä   Úages      rO   r  z$HonchoMemoryProvider._thread_is_live&  s§   € ð Ô$ð 	¨DÔ,A×,JÒ,JÑ,LÔ,Lð 	Ø�5Ø+/¬<ÐY¸D¼LÔ<PÐY�4”<Ô'Ð'ÐVYˆÝŒnÑÔ Ô!AÑAˆØ�˜4Ô8Ñ8Ò8Ð8Ý�LŠLð-Ø.1°7¸TÔ=ZÑ3Zñô ð ð �5ØˆtrQ   r™   c                ó‚   — | j         dk    r| j        S | j        | j         z   }| j        | j        z  }t          ||¦  «        S )uB   Cadence plus empty-streak backoff, capped at _BACKOFF_MAX Ã— base.r   )rH   r?   Ú_BACKOFF_MAXrš   )rN   ÚwidenedÚceilings      rO   r  z'HonchoMemoryProvider._effective_cadence5  sI   € àÔ'¨1Ò,Ð,ØÔ*Ð*ØÔ)¨DÔ,HÑHˆØÔ)¨DÔ,=Ñ=ˆÝ�7˜GÑ$Ô$Ð$rQ   c                óà   — d}| j         r4| j                              ¦   «         rt          j        ¦   «         | j        z
  }| j        | j        | j        | j        |  	                    ¦   «         |du|dœS )zÞIn-process snapshot of dialectic liveness state for diagnostics.

        Returns current turn, last successful dialectic turn, pending-result
        fire turn, empty streak, effective cadence, and thread status.
        N)Ú
turn_countÚlast_dialectic_turnÚpending_result_fired_atÚempty_streakÚeffective_cadenceÚthread_aliveÚthread_age_seconds)
r7   rè   rÅ   rÆ   rF   r<   rE   rG   rH   r  )rN   Ú
thread_ages     rO   Úliveness_snapshotz&HonchoMemoryProvider.liveness_snapshot=  s‚   € ð ˆ
ØÔ ð 	M TÔ%:×%CÒ%CÑ%EÔ%Eð 	MÝœÑ)Ô)¨DÔ,LÑLˆJàÔ*Ø#'Ô#<Ø'+Ô'EØ Ô8Ø!%×!8Ò!8Ñ!:Ô!:Ø&¨dÐ2Ø",ð
ð 
ð 	
rQ   c                ó6  — | j         r|s|S || j        vr|S t          |¦  «        }|| j        k     rd}n|| j        k     rd}nd}| j                             |¦  «        }| j                             | j        ¦  «        }| j        t          ||z   |¦  «                 S )zˆScale `base` up by query length, clamped at reasoning_level_cap.

        Char-count heuristic: +1 at >=120 chars, +2 at >=400.
        r   r.   rd   )rB   rŸ   rù   Ú_HEURISTIC_LENGTH_MEDIUMÚ_HEURISTIC_LENGTH_HIGHÚindexrC   rš   )rN   r  r   ÚnÚbumpÚbase_idxÚcap_idxs          rO   Ú_apply_reasoning_heuristicz/HonchoMemoryProvider._apply_reasoning_heuristicP  s³   € ð
 Ô(ð 	°ð 	ØˆKØ�tÔ(Ð(Ð(ØˆKÝ�‰JŒJˆØˆtÔ,Ò,Ð,ØˆDˆDØ�Ô,Ò,Ð,ØˆDˆDàˆDØÔ$×*Ò*¨4Ñ0Ô0ˆØÔ#×)Ò)¨$Ô*CÑDÔDˆØÔ ¥ X°¡_°gÑ!>Ô!>Ô?Ð?rQ   Úpass_idxc                ó  — | j         r%|t          | j         ¦  «        k     r| j         |         S | j        r| j        j        nd}| j                             | j        |f¦  «        }|�|dk    r|                      ||¦  «        S |S )ut  Resolve reasoning level for a given pass index.

        Precedence:
          1. dialecticDepthLevels (explicit per-pass) â€” wins absolutely
          2. _PROPORTIONAL_LEVELS table (depth>1 lighter-early passes)
          3. Base level = dialecticReasoningLevel, optionally scaled by the
             reasoning heuristic when the mapping falls through to 'base'
        r   Nr  )rA   rù   r1   Údialectic_reasoning_levelr  r“   r@   r"  )rN   r#  r   r  Úmappings        rO   Ú_resolve_pass_levelz(HonchoMemoryProvider._resolve_pass_leveld  s�   € ð Ô'ð 	:¨Hµs¸4Ô;WÑ7XÔ7XÒ,XÐ,XØÔ/°Ô9Ð9à:>¼,ÐQ�”Ô6Ð6ÈEˆØÔ+×/Ò/°Ô1FÈÐ0QÑRÔRˆØˆ?˜g¨Ò/Ð/Ø×2Ò2°4¸Ñ?Ô?Ð?ØˆrQ   Úprior_resultsú	list[str]Úis_coldc                óÌ   — |dk    r|r	 dS 	 dS |dk    r|r|d         nd}d|› d�S d	t          |¦  «        dk    r|d         nd
› dt          |¦  «        dk    r|d         nd
› d�S )a  Build the prompt for a given dialectic pass.

        Pass 0: cold start (general user query) or warm (session-scoped).
        Pass 1: self-audit / targeted synthesis against gaps from pass 0.
        Pass 2: reconciliation / contradiction check across prior passes.
        r   z�Who is this person? What are their preferences, goals, and working style? Focus on facts that would help an AI assistant be immediately useful.z±Given what's been discussed in this session so far, what context about this user is most relevant to the current conversation? Prioritize active context over biographical facts.r.   éÿÿÿÿr+   z Given this initial assessment:

zÈ

What gaps remain in your understanding that would help going forward? Synthesize what you actually know about the user's current state and immediate needs, grounded in evidence from recent sessions.z Prior passes produced:

Pass 1:
z(empty)z


Pass 2:
z•

Do these assessments cohere? Reconcile any contradictions and produce a final, concise synthesis of what matters most for the current conversation.)rù   )rN   r#  r(  r*  Úpriors        rO   Ú_build_dialectic_promptz,HonchoMemoryProvider._build_dialectic_promptv  sÏ   € ð �qŠ=ˆ=Øð ð7ðð ðSðð ð
 ˜Š]ˆ]Ø)6Ð>�M "Ô%Ð%¸BˆEð4°Uð 4ð 4ð 4ðð0Ý03°MÑ0BÔ0BÀQÒ0FÐ0F˜M¨!Ô,Ð,ÈIð0ð 0å03°MÑ0BÔ0BÀQÒ0FÐ0F˜M¨!Ô,Ð,ÈIð0ð 0ð 0ðrQ   ró   c                ó:  — | r%t          |                      ¦   «         ¦  «        dk     rdS d| v rJd| v sDd| v s@t          j        d| t          j        ¦  «        s t          j        d| t          j        ¦  «        rdS t          |                      ¦   «         ¦  «        d	k    S )
zëCheck if a dialectic pass returned enough signal to skip further passes.

        Heuristic: a response longer than 100 chars with some structure
        (section headers, bullets, or an ordered list) is considered sufficient.
        éd   Fú
z##u   â€¢z^[*-] z
^\s*\d+\. Ti,  )rù   r´   ÚreÚsearchÚ	MULTILINE)ró   s    rO   Ú_signal_sufficientz'HonchoMemoryProvider._signal_sufficient�  s˜   € ð ð 	�˜VŸ\š\™^œ^Ñ,Ô,¨sÒ2Ð2Ø�5à�6ˆ>ˆ>Ø�FˆNˆNØ˜ˆˆÝŒy˜ F­B¬LÑ9Ô9ð åŒy˜¨µ´Ñ=Ô=ð ð �4å�6—<’<‘>”>Ñ"Ô" SÒ(Ð(rQ   c                ó’  — | j         r| j        sdS | j         }g }t          | j        ¦  «        D ]ë}|dk    r|                      d||¦  «        }nW|r>|                      |d         ¦  «        r#t                               d| j        |¦  «          nŒ|                      |||¦  «        }|  	                    ||¬¦  «        }t                               d| j        |||¦  «         | j          
                    | j        ||d¬¦  «        }|                     |pd¦  «         Œìt          |¦  «        D ]}|r|                     ¦   «         r|c S ŒdS )	u[  Execute up to dialecticDepth .chat() calls with conditional bail-out.

        Cold start (no base context): general user-oriented query.
        Warm session (base context exists): session-scoped query.
        Each pass is conditional â€” bails early if prior pass returned strong signal.
        Returns the best (usually last) result.
        r+   r   r,  zCHoncho dialectic depth %d: pass %d skipped, prior signal sufficient)r   z5Honcho dialectic depth %d: pass %d, level=%s, cold=%sÚuser©r#   r   )r0   r2   r:   Úranger@   r.  r5  r”   r•   r'  Údialectic_queryrÕ   Úreversedr´   )	rN   r   r*  ÚresultsÚiÚpromptÚlevelró   rµ   s	            rO   r³   z)HonchoMemoryProvider._run_dialectic_depth±  s�  € ð Œ}ð 	 DÔ$5ð 	Ø�2àÔ.Ð.ˆØˆå�tÔ,Ñ-Ô-ð 	)ð 	)ˆAØ�AŠvˆvØ×5Ò5°a¸À'ÑJÔJ��ð ð ˜t×6Ò6°w¸r´{ÑCÔCð Ý—L’LÐ!fØ!%Ô!6¸ñ;ô ;ð ;à�EØ×5Ò5°a¸À'ÑJÔJ�à×,Ò,¨Q°eÐ,Ñ<Ô<ˆEÝ�LŠLÐPØÔ.°°5¸'ñCô Cð Cð ”]×2Ò2ØÔ! 6Ø %Øð 3ñ ô ˆFð
 �NŠN˜6˜< RÑ(Ô(Ð(Ð(õ ˜'Ñ"Ô"ð 	ð 	ˆAØð �Q—W’W‘Y”Yð Ø���øØˆrrQ   z†^(yes|no|ok|okay|sure|thanks|thank you|y|n|yep|nope|yeah|nah|continue|go ahead|do it|proceed|got it|cool|nice|great|done|next|lgtm|k)$c                ó¤   — |sdS |                      ¦   «         }|sdS |                     d¦  «        rdS | j                             |¦  «        rdS dS )zFReturn True if the prompt is too trivial to warrant context injection.Tú/F)r´   Ú
startswithÚ_TRIVIAL_PROMPT_REÚmatch)Úclsrõ   Ústrippeds      rO   rå   z'HonchoMemoryProvider._is_trivial_promptä  si   € ð ð 	Ø�4Ø—:’:‘<”<ˆØð 	Ø�4Ø×Ò˜sÑ#Ô#ð 	Ø�4ØÔ!×'Ò'¨Ñ1Ô1ð 	Ø�4ØˆurQ   Úturn_numberÚmessagec                ó   — || _         dS )z;Track turn count for cadence and injection_frequency logic.N)r<   )rN   rG  rH  r¤   s       rO   Úon_turn_startz"HonchoMemoryProvider.on_turn_startò  s   € à&ˆÔÐÐrQ   ÚcontentÚlimitc                ól  — t          | ¦  «        |k    r| gS d}t          |¦  «        }g }| }d}|�r|r|n||z
  }t          |¦  «        |k    r|                     |r|n||z   ¦  «         nÊ|d|…         }|                     d¦  «        }	|	|dz  k     r |                     d¦  «        }	|	dk    r|	dz  }	|	|dz  k     r|                     d	¦  «        }	|	|dz  k     r|}	|d|	…                              ¦   «         }
||	d…                              ¦   «         }|s||
z   }
|                     |
¦  «         d
}|�°|S )aR  Split content into chunks that fit within the Honcho message limit.

        Splits at paragraph boundaries when possible, falling back to
        sentence boundaries, then word boundaries. Each continuation
        chunk is prefixed with "[continued] " so Honcho's representation
        engine can reconstruct the full message.
        z[continued] TNrÔ   g333333Ó?z. r   rd   rø   F)rù   rÕ   rú   ÚrstripÚlstrip)rK  rL  ÚprefixÚ
prefix_lenÚchunksÚ	remainingÚfirstr  ÚsegmentÚcutÚchunks              rO   Ú_chunk_messagez#HonchoMemoryProvider._chunk_messageö  s}  € õ ˆw‰<Œ<˜5Ò Ð Ø�9ÐàˆÝ˜‘[”[ˆ
ØˆØˆ	ØˆØñ 	Ø!&Ð>˜˜¨E°JÑ,>ˆIÝ�9‰~Œ~ Ò*Ð*Ø—’¨5ÐH˜i˜i°f¸yÑ6HÑIÔIÐIØà 
  
Ô+ˆGð —-’- Ñ'Ô'ˆCØ�Y ‘_Ò$Ð$Ø—m’m DÑ)Ô)�Ø˜!’8�8Ø˜1‘H�CØ�Y ‘_Ò$Ð$Ø—m’m CÑ(Ô(�Ø�Y ‘_Ò$Ð$Ø�à˜d˜s˜d”O×*Ò*Ñ,Ô,ˆEØ! # $ $œ×.Ò.Ñ0Ô0ˆIØð 'Ø ™�Ø�MŠM˜%Ñ Ô Ð ØˆEð1 ñ 	ð4 ˆrQ   Úuser_contentÚassistant_contentc               óZ  ‡ ‡‡‡— ‰ j         rdS ‰ j        r‰ j        sdS ‰ j        r‰ j        j        ndŠˆˆˆ ˆfd„}‰ j        r4‰ j                             ¦   «         r‰ j                             d¬¦  «         t          j	        |dd¬¦  «        ‰ _        ‰ j         
                    ¦   «          dS )	zÈRecord the conversation turn in Honcho (non-blocking).

        Messages exceeding the Honcho API limit (default 25k chars) are
        split into multiple messages with continuation markers.
        Ni¨a  c                 óž  •— 	 ‰j                              ‰j        ¦  «        } ‰                     ‰‰¦  «        D ]}|                      d|¦  «         Œ‰                     ‰‰¦  «        D ]}|                      d|¦  «         Œ‰j                              | ¦  «         d S # t          $ r&}t                               d|¦  «         Y d }~d S d }~ww xY w)Nr7  Ú	assistantzHoncho sync_turn failed: %s)	r0   r¿   r2   rX  Úadd_messageÚ_flush_sessionr_   r”   r•   )rÊ   rW  r¥   rZ  Ú	msg_limitrN   rY  s      €€€€rO   Ú_syncz-HonchoMemoryProvider.sync_turn.<locals>._sync0  só   ø€ ð?Øœ-×5Ò5°dÔ6GÑHÔH�Ø!×0Ò0°¸yÑIÔIð 7ð 7�EØ×'Ò'¨°Ñ6Ô6Ð6Ð6Ø!×0Ò0Ð1BÀIÑNÔNð <ð <�EØ×'Ò'¨°UÑ;Ô;Ð;Ð;Ø”×,Ò,¨WÑ5Ô5Ð5Ð5Ð5øÝð ?ð ?ð ?Ý—’Ð:¸AÑ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>Ð>øøøøð?øøøs   ƒBB Â
CÂ&CÃCç      @rã   Tzhoncho-syncrº   )rL   r0   r2   r1   Úmessage_max_charsr8   rè   rÖ   r4   rÇ   rÈ   )rN   rY  rZ  r„   ra  r`  s   ```  @rO   Ú	sync_turnzHonchoMemoryProvider.sync_turn#  sê   øøøø€ ð Ôð 	ØˆFØŒ}ð 	 DÔ$5ð 	ØˆFà6:´lÐM�D”LÔ2Ð2Èˆ	ð		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð Ôð 	0 Ô!2×!;Ò!;Ñ!=Ô!=ð 	0ØÔ×"Ò"¨3Ð"Ñ/Ô/Ð/Ý%Ô,Ø ¨Mð
ñ 
ô 
ˆÔð 	Ô×ÒÑ!Ô!Ð!Ð!Ð!rQ   Úactionr»   c                ó¾   ‡ ‡— |dk    s|dk    s‰sdS ‰ j         rdS ‰ j        r‰ j        sdS ˆˆ fd„}t          j        |dd¬¦  «        }|                     ¦   «          dS )z:Mirror built-in user profile writes as Honcho conclusions.Úaddr7  Nc                 ó°   •— 	 ‰j                              ‰j        ‰¦  «         d S # t          $ r&} t                               d| ¦  «         Y d } ~ d S d } ~ ww xY w)NzHoncho memory mirror failed: %s)r0   Úcreate_conclusionr2   r_   r”   r•   )r¥   rK  rN   s    €€rO   Ú_writez4HonchoMemoryProvider.on_memory_write.<locals>._writeK  st   ø€ ðCØ”×/Ò/°Ô0AÀ7ÑKÔKÐKÐKÐKøÝð Cð Cð CÝ—’Ð>ÀÑBÔBÐBÐBÐBÐBÐBÐBÐBøøøøðCøøøs   ƒ % ¥
A¯AÁATzhoncho-memwriterº   )rL   r0   r2   r4   rÇ   rÈ   )rN   re  r»   rK  rj  Úts   `  `  rO   Úon_memory_writez$HonchoMemoryProvider.on_memory_writeB  s™   øø€ à�UŠ?ˆ?˜f¨Ò.Ð.°gÐ.ØˆFØÔð 	ØˆFØŒ}ð 	 DÔ$5ð 	ØˆFð	Cð 	Cð 	Cð 	Cð 	Cð 	Cõ Ô F°4Ð>OÐPÑPÔPˆØ	�Š‰	Œ	ˆ	ˆ	ˆ	rQ   rÀ   úList[Dict[str, Any]]c                ó:  — | j         rdS | j        sdS | j        r4| j                             ¦   «         r| j                             d¬¦  «         	 | j                             ¦   «          dS # t          $ r&}t                               d|¦  «         Y d}~dS d}~ww xY w)z4Flush all pending messages to Honcho on session end.Ng      $@rã   z#Honcho session-end flush failed: %s)	rL   r0   r8   rè   rÖ   Ú	flush_allr_   r”   r•   )rN   rÀ   r¥   s      rO   Úon_session_endz#HonchoMemoryProvider.on_session_endT  sÆ   € àÔð 	ØˆFØŒ}ð 	ØˆFàÔð 	1 Ô!2×!;Ò!;Ñ!=Ô!=ð 	1ØÔ×"Ò"¨4Ð"Ñ0Ô0Ð0ð	CØŒM×#Ò#Ñ%Ô%Ð%Ð%Ð%øÝð 	Cð 	Cð 	CÝ�LŠLÐ>ÀÑBÔBÐBÐBÐBÐBÐBÐBÐBøøøøð	Cøøøs   ÁA* Á*
BÁ4BÂBc                óV   — | j         rg S | j        dk    rg S t          t          ¦  «        S )zeReturn tool schemas, respecting recall_mode.

        B1: context-only mode hides all tools.
        r°   )rL   r9   ÚlistÚALL_TOOL_SCHEMASrM   s    rO   Úget_tool_schemasz%HonchoMemoryProvider.get_tool_schemasb  s6   € ð
 Ôð 	ØˆIØÔ 	Ò)Ð)ØˆIÝÕ$Ñ%Ô%Ð%rQ   Ú	tool_nameÚargsc                ój  — | j         rt          d¦  «        S | j        s#|                      ¦   «         st          d¦  «        S | j        r| j        st          d¦  «        S 	 |dk    r×|                     dd¦  «        }|                     d¦  «        }|r[| j                             | j        ||¬¦  «        }|€t          d
¦  «        S t          j	        dt          |¦  «        › d�|dœ¦  «        S | j                             | j        |¬¦  «        }|st          j	        ddi¦  «        S t          j	        d|i¦  «        S |dk    r¿|                     dd¦  «        }|st          d¦  «        S t          t          |                     dd¦  «        ¦  «        d¦  «        }	|                     dd¦  «        }| j                             | j        ||	|¬¦  «        }|st          j	        ddi¦  «        S t          j	        d|i¦  «        S |dk    r™|                     dd¦  «        }|st          d¦  «        S |                     dd¦  «        }|                     d¦  «        }
| j                             | j        ||
|¬¦  «        }| j        | _        t          j	        d|pdi¦  «        S |dk    �rq|                     dd¦  «        }| j                             | j        |¬¦  «        }|st          j	        ddi¦  «        S g }|                     d¦  «        r|                     d |d         › �¦  «         |                     d!¦  «        r|                     d"|d!         › �¦  «         |                     d¦  «        r|                     d#|d         › �¦  «         |                     d$¦  «        rG|d$         }d%                     d&„ |d'd	…         D ¦   «         ¦  «        }|                     d(|› �¦  «         t          j	        dd)                     |¦  «        pd*i¦  «        S |d+k    �r<|                     d,¦  «        pd                     ¦   «         }|                     d-d¦  «                             ¦   «         }|                     dd¦  «        }t-          |¦  «        }t-          |¦  «        }||k    rt          d.¦  «        S |rQ| j                             | j        ||¬¦  «        }|rt          j	        dd/|› d0�i¦  «        S t          d1|› d2�¦  «        S | j                             | j        ||¬¦  «        }|rt          j	        dd3|› d4|› �i¦  «        S t          d5¦  «        S t          d6|› �¦  «        S # t2          $ r;}t4                               d7||¦  «         t          d8|› d9|› �¦  «        cY d	}~S d	}~ww xY w):zFHandle a Honcho tool call, with lazy session init for tools-only mode.z$Honcho is not active (cron context).z(Honcho session could not be initialized.z&Honcho is not active for this session.r
   r   r7  r   )r   NzFailed to update peer card.zPeer card updated (z facts).)ró   r   ró   zNo profile facts available yet.r   r   r+   z!Missing required parameter: queryr   i   iÐ  )r   r   zNo relevant context found.r   r#   r8  zNo result from Honcho.r$   zNo context available yet.rÐ   z## Summary
rÑ   z## Representation
z## Card
Úrecent_messagesr1  c              3  óN   K  — | ] }d |d         › d|d         dd…         › �V — Œ!dS )z  [Úrolez] rK  NéÈ   rV   )Ú.0Úms     rO   ú	<genexpr>z8HonchoMemoryProvider.handle_tool_call.<locals>.<genexpr>²  sX   è è € ð (ð (àð @˜a œiÐ?Ð?¨1¨Y¬<¸¸¸Ô+=Ð?Ð?ð(ð (ð (ð (ð (ð (rQ   éûÿÿÿz## Recent messages
rÔ   zNo context available.r%   r'   r&   z8Exactly one of conclusion or delete_id must be provided.zConclusion z	 deleted.zFailed to delete conclusion ú.zConclusion saved for z: zFailed to save conclusion.zUnknown tool: zHoncho tool %s failed: %szHoncho z	 failed: )rL   r	   rI   rÍ   r0   r2   r“   Úset_peer_cardrf   rm   rù   Úget_peer_cardrš   r™   Úsearch_contextr:  r<   rE   Úget_session_contextrÕ   rÖ   r´   rW   Údelete_conclusionri  r_   r”   Úerror)rN   ru  rv  r¤   r   Úcard_updateró   r   r   r   r#   rÎ   r×   ÚmsgsÚmsg_strr'   r&   Úhas_delete_idÚhas_conclusionÚokr¥   s                        rO   Úhandle_tool_callz%HonchoMemoryProvider.handle_tool_callm  sT  € àÔð 	FÝÐDÑEÔEÐEð Ô(ð 	NØ×'Ò'Ñ)Ô)ð NÝ!Ð"LÑMÔMÐMàŒ}ð 	H DÔ$5ð 	HÝÐFÑGÔGÐGðW	AØÐ,Ò,Ð,Ø—x’x ¨Ñ/Ô/�Ø"Ÿhšh vÑ.Ô.�Øð oØ!œ]×8Ò8¸Ô9JÈKÐ^bÐ8ÑcÔc�FØ�~Ý)Ð*GÑHÔHÐHÝœ:Ð1\ÅsÈ6Á{Ä{Ð1\Ð1\Ð1\ÐflÐ&mÐ&mÑnÔnÐnØ”}×2Ò2°4Ô3DÈ4Ð2ÑPÔP�Øð UÝœ: xÐ1RÐ&SÑTÔTÐTÝ”z 8¨TÐ"2Ñ3Ô3Ð3à˜oÒ-Ð-ØŸš ¨"Ñ-Ô-�Øð KÝ%Ð&IÑJÔJÐJÝ ¥ T§X¢X¨l¸CÑ%@Ô%@Ñ!AÔ!AÀ4ÑHÔH�
Ø—x’x ¨Ñ/Ô/�Øœ×5Ò5ØÔ% u¸È$ð 6ñ ô �ð ð PÝœ: xÐ1MÐ&NÑOÔOÐOÝ”z 8¨VÐ"4Ñ5Ô5Ð5àÐ0Ò0Ð0ØŸš ¨"Ñ-Ô-�Øð KÝ%Ð&IÑJÔJÐJØ—x’x ¨Ñ/Ô/�Ø"&§(¢(Ð+<Ñ"=Ô"=�Øœ×6Ò6ØÔ% uØ$3Øð 7ñ ô �ð -1Ô,<�Ô)Ý”z 8¨VÐ-OÐ7OÐ"PÑQÔQÐQàÐ.Ò.Ñ.Ø—x’x ¨Ñ/Ô/�Ø”m×7Ò7¸Ô8IÐPTÐ7ÑUÔU�Øð OÝœ: xÐ1LÐ&MÑNÔNÐNØ�Ø—7’7˜9Ñ%Ô%ð BØ—L’LÐ!@°°I´Ð!@Ð!@ÑAÔAÐAØ—7’7Ð+Ñ,Ô,ð PØ—L’LÐ!N°sÐ;KÔ7LÐ!NÐ!NÑOÔOÐOØ—7’7˜6‘?”?ð <Ø—L’LÐ!:¨S°¬[Ð!:Ð!:Ñ;Ô;Ð;Ø—7’7Ð,Ñ-Ô-ð CØÐ0Ô1�DØ"Ÿišið (ð (à!% b c c¤ð(ñ (ô (ñ ô �Gð —L’LÐ!A¸Ð!AÐ!AÑBÔBÐBÝ”z 8¨V¯[ª[¸Ñ-?Ô-?Ð-ZÐCZÐ"[Ñ\Ô\Ð\àÐ/Ò/Ñ/Ø!ŸXšX kÑ2Ô2Ð8°b×?Ò?ÑAÔA�	Ø!ŸXšX l°BÑ7Ô7×=Ò=Ñ?Ô?�
Ø—x’x ¨Ñ/Ô/�å $ Y¡¤�Ý!% jÑ!1Ô!1�Ø  NÒ2Ð2Ý%Ð&`ÑaÔaÐaà ð SØœ×8Ò8¸Ô9JÈIÐ\`Ð8ÑaÔa�BØð ZÝ#œz¨8Ð5WÀ9Ð5WÐ5WÐ5WÐ*XÑYÔYÐYÝ%Ð&QÀYÐ&QÐ&QÐ&QÑRÔRÐRØ”]×4Ò4°TÔ5FÈ
ÐY]Ð4Ñ^Ô^�Øð `Ýœ: xÐ1]ÈÐ1]Ð1]ÐQ[Ð1]Ð1]Ð&^Ñ_Ô_Ð_Ý!Ð">Ñ?Ô?Ð?åÐ:¨yÐ:Ð:Ñ;Ô;Ð;øåð 	Að 	Að 	AÝ�LŠLÐ4°iÀÑCÔCÐCÝÐ?¨	Ð?Ð?¸AÐ?Ð?Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@øøøøð	Aøøøs„   ÁA%U- Ã'U- Ã-8U- Ä&U- Ä<,U- Å)BU- Ç+U- È,U- È.A1U- Ê AU- Ë6D!U- ÐB U- Ò9?U- Ó9U- Ô?U- ÕU- ÕU- Õ-
V2Õ70V-Ö'V2Ö-V2c                óè   — | j         | j        fD ].}|r*|                     ¦   «         r|                     d¬¦  «         Œ/| j        r-	 | j                             ¦   «          d S # t          $ r Y d S w xY wd S )Nrb  rã   )r7   r8   rè   rÖ   r0   ro  r_   )rN   rk  s     rO   ÚshutdownzHonchoMemoryProvider.shutdownÓ  s�   € ØÔ'¨Ô):Ð;ð 	$ð 	$ˆAØð $�Q—Z’Z‘\”\ð $Ø—’˜s�Ñ#Ô#Ð#øàŒ=ð 	ðØ”×'Ò'Ñ)Ô)Ð)Ð)Ð)øÝð ð ð Ø��ðøøøð	ð 	s   ÁA! Á!
A/Á.A/N)rR   rS   )rR   rW   )ro   rS   r{   r|   rR   r}   )r„   rS   rR   r}   )rÎ   r|   rR   rS   )r   rS   r„   rS   rR   rS   )rõ   rS   rR   rS   )r   rS   r„   rS   rR   r}   )rR   r™   )rR   r|   )r  rS   r   rS   rR   rS   )r+   )r#  r™   r   rS   rR   rS   )r#  r™   r(  r)  r*  rW   rR   rS   )ró   rS   rR   rW   )r   rS   rR   rS   )rõ   rS   rR   rW   )rG  r™   rH  rS   rR   r}   )rK  rS   rL  r™   rR   r)  )rY  rS   rZ  rS   r„   rS   rR   r}   )re  rS   r»   rS   rK  rS   rR   r}   )rÀ   rm  rR   r}   )rR   rm  )ru  rS   rv  r|   rR   rS   r½   )2Ú__name__Ú
__module__Ú__qualname__Ú__doc__rP   Úpropertyr   ra   rr   rz   rƒ   r¦   r¡   rÍ   rÚ   rÝ   rô   rê   r  r  Ú__annotations__rŸ   r  r  r
  ré   r  r  r  r  r"  r'  r.  Ústaticmethodr5  r³   r2  ÚcompileÚ
IGNORECASErC  Úclassmethodrå   rJ  rX  rd  rl  rp  rt  r�  r�  rV   rQ   rO   r)   r)   »   s’  € € € € € € ØRÐRð'#ð '#ð '#ðR ðð ð ñ „Xððð ð ð ð?ð ?ð ?ð
ð 
ð 
ð+ð +ð +ð +ðK!ð K!ð K!ð K!ðZXWð XWð XWð XWðtð ð ð ð4"ð "ð "ð "ð:0ð 0ð 0ð 0ðd 9;ð Kð Kð Kð Kð Kð KðZ"ð "ð "ð "ð ?Að H&ð H&ð H&ð H&ð H&ð H&ðb àØàØØð
8ð 
8Ðð 
ð 
ð 
ñ 
ð ?€Lð  #ÐØ Ðð  #Ðð  !Ðð €Lðð ð ð ð%ð %ð %ð %ð
ð 
ð 
ð 
ð&@ð @ð @ð @ð(ð ð ð ð ð$%ð %ð %ð %ðN ð)ð )ð )ñ „\ð)ð&(ð (ð (ð (ðZ $˜œð	Uà
Œñô Ðð ðð ð ñ „[ðð'ð 'ð 'ð 'ð ð*ð *ð *ñ „\ð*ðX Y[ð "ð "ð "ð "ð "ð "ð>ð ð ð ð$Cð Cð Cð Cð	&ð 	&ð 	&ð 	&ðdAð dAð dAð dAðL	ð 	ð 	ð 	ð 	ð 	rQ   r)   rR   r}   c                óH   — |                       t          ¦   «         ¦  «         dS )z,Register Honcho as a memory provider plugin.N)Úregister_memory_providerr)   )rÎ   s    rO   Úregisterrœ  ã  s#   € à× Ò Õ!5Ñ!7Ô!7Ñ8Ô8Ð8Ð8Ð8rQ   r½   )r“  Ú
__future__r   rf   Úloggingr2  r4   rÅ   Útypingr   r   r   r   Úagent.memory_providerr   Útools.registryr	   Ú	getLoggerr�  r”   ÚPROFILE_SCHEMAÚSEARCH_SCHEMAÚREASONING_SCHEMAÚCONTEXT_SCHEMAÚCONCLUDE_SCHEMArs  r)   rœ  rV   rQ   rO   ú<module>r¨     s6  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø 	€	€	€	Ø Ð Ð Ð Ø €€€Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,à 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø %Ð %Ð %Ð %Ð %Ð %à	ˆÔ	˜8Ñ	$Ô	$€ð ð	6ð
 ð !ð  Cðð ð
  Ø  (Ð+Øhðð ð

ð 

ð ðð ðð €ð2 ð	Xð ð !ØGðð ð
 "Ø[ðð ð
 !ð  Cðð ð
ð 
ð �Ið!ð ðð €ð: ð	Kð ð !Ø=ðð ð
 !ðTð DÐCÐCð ð  ð !ð  Cðð ð'
ð 
ð0 �Ið5ð ð%ð %Ð ðP ð	;ð ð !Øpðð ð
 !ð  Cðð ð	
ð 	
ð ðð ðð €ð2 ð	bð ð !ð  Rðð ð
 !ð  \ðð ð
 !ð  Cðð ð
ð 
ð ð!ð ðð €ð< # MÐ3CÀ^ÐUdÐeÐ ðað að að að a˜>ñ aô að aðP!9ð 9ð 9ð 9ð 9ð 9rQ   