+
    jHàjóI  ã                  óÎ  € R t ^ RIHt ^ RIHtHt ^ RIHt ^ RI	H
t
 ^ RIHtHt ^ RIHtHt ];QJ dR    . R ]P$                  ! R^4      ^,          P%                  R	^4      ^ ,          P%                  R
4       4       F  NK  	  5MK! R ]P$                  ! R^4      ^,          P%                  R	^4      ^ ,          P%                  R
4       4       4      t]! 0 Rm4      t ! R R4      tR# )aå  In-place row-rewrite persistence for the proactive prune (#124102).

Split out of :mod:`hermes_state_messages` (FILE_LINES ratchet): the prune's own commit primitive and
its lease-less staleness probe. Both are ``SessionMessagesMixin`` methods; this sibling defines a
``SessionPruneRewriteMixin`` the facade binds into the same MRO slot, so every existing
``session_db.rewrite_pruned_rows(...)`` / ``rewritten_held_row_ids(...)`` call site and test patch
seam keeps working unchanged.
)Úannotations)ÚAnyÚOptional)Ú_DB_PERSISTED_MARKER©ÚDB_ROW_SNAPSHOT)Ú
_id_chunksÚ_placeholders)Ú_INSERT_MESSAGE_SQLÚ_parse_tool_callsc              #  ó@   "  € T F  qP                  4       x € K  	  R # 5i©N)Ústrip©Ú.0Úcolumns   & Ú?/home/ubuntu/.hermes/hermes-agent/hermes_state_prune_rewrite.pyÚ	<genexpr>r      s   é € ð cÙ!a�v‡L�L‡N€NÓ!aùs   ‚Ú(Ú)Ú,c                  óF   € ] tR t^tRtR R ltR R ltRR/R R	 lltR
tR# )ÚSessionPruneRewriteMixinz]``SessionDB`` mixin: the proactive prune's in-place row rewrite and held-row staleness probe.c               ó$   € V ^8„  d   QhRRRRRR/# ©é   Ú
session_idÚstrÚheldzlist[dict[str, Any]]Úreturnz	list[int]© )Úformats   "r   Ú__annotate__Ú%SessionPruneRewriteMixin.__annotate__   s(   € ÷ Kñ K°ð KÐ<Pð KÐU^ñ Kó    c                ó6   a aa€ S P                  VV V3R l4      # )uâ  Ids among *held* message dicts whose ACTIVE row no longer holds the payload the dict holds.

An in-place commit (the proactive prune's ``rewrite_pruned_rows``) changes what a row says and
keeps its id and its ``active`` flag, so an id/activity staleness check cannot see it. A lease-less
writer holding the pre-rewrite bodies must not publish them: that archives rows it never compared
and republishes the stale text over the newer generation (#124102).

The comparison is representation-safe, never raw storage against a loaded view. A dict's content
passed through the loader lens (``_loaded_view_content`` sanitizes and strips user/assistant
strings), so the stored bytes are compared through the same lens; when the dict carries the
stored-row CAS digest (``DB_ROW_SNAPSHOT``, see ``agent.transcript_repair``) that wins instead,
covering every owned column including assistant ``tool_calls`` arguments. Absent or inactive
rows are NOT reported â€” that is the activity check's job and it has its own fallback rules.
Every model-transcript role is compared (user/assistant/tool): the callers gate the FULL
writer (``archive_and_compact`` via the prune fallback and micro-compaction), which re-inserts
held rows of those roles verbatim â€” a concurrently rewritten user row (``set_user_message_content``,
the repair batch's in-place rewrite) is as much a lost race as a rewritten tool result (#124102).
Bookkeeping roles (``session_meta``/``system``) never reach the model-facing list and stay excluded.
c                ó*   <€ SP                  V SS4      # r   )Úheld_row_mismatches)Úconnr   Úselfr   s   &€€€r   Ú<lambda>ÚASessionPruneRewriteMixin.rewritten_held_row_ids.<locals>.<lambda>2   s   ø€ ˜×1Ñ1°$¸
ÀDÔIr$   )Ú_read_retrying_ioerr)r)   r   r   s   fffr   Úrewritten_held_row_idsÚ/SessionPruneRewriteMixin.rewritten_held_row_ids   s   ú€ ð( ×(Ñ(ÞIóKð 	Kr$   c               ó$   € V ^8„  d   QhRRRRRR/# r   r    )r!   s   "r   r"   r#   4   s(   € ÷ Oñ O°Cð OÐ?Sð OÐXañ Or$   c                óÔ  € ^ RI Hp ^ RIHp R R lpV Uu. uFY  p\	        V\
        4      '       g   K  VP                  \        4      '       g   K8  VP                  R4      R9   g   KP  Wv! V4      3NK[  	  ppV UU	u/ uF  w  ryV	f   K  W—bK  	  p
pp	/ pV FH  w  ryV	e   K  \	        VP                  \        4      \        4      '       g   K6  V! V4      pVf   KD  W{V&   KJ  	  V'       d   V
'       g   V'       g   . # / p\        V
4       FO  pVP                  R\        V4       R2V.VO54      P                  4        F  pWý\        VR,          4      &   K  	  KQ  	  / pVP                  4        FU  w  rÇVP                  R	W'P                  R4      V34      P!                  4       pVf   K<  VVV&   Wý\        VR,          4      &   KW  	  . pV EFŒ  w  ryV	e   VP                  V	4      M TP                  V! V4      ;'       g    R
4      pVe#   \        VR,          ;'       g    ^ 4      '       g   Kd  VP                  \        4      p\	        V\        4      '       d1   V! V4      V8w  d"   VP#                  \        VR,          4      4       K¿  V P%                  VP                  RR4      VP                  R4      VP                  R4      \'        VP                  R4      4      4      pV P%                  VR,          V P)                  VR,          4      VR,          \'        VR,          4      4      pVV8w  g   EKk  VP#                  \        VR,          4      4       EK�  	  V# u upi u up	pi )uP  ``rewritten_held_row_ids`` against *conn*: the same CAS compare, on a connection the
caller already holds (inside a ``BEGIN IMMEDIATE``, the full writer's commit window â€” a
precheck outside that lock misses a write that lands between check and commit, and the
full writer would then archive that newer row and republish the stale held text, #124102).

Chunked like ``stamp_inserted_row_snapshots``: one ``id IN (...)`` per ``_id_chunks`` batch,
so a long history stays under SQLite's host-parameter limit instead of failing the pass.
Rows without an exact ``_row_id`` but with both the persist marker and a CAS snapshot are
resolved by their logical ``message_uid`` (``idx_messages_session_uid``): the unaddressed
live-replay loaders stamp exactly that pair, and a rewritten-in-place row is as lost a race
there as a row-addressed one (#124102).
)Úmessage_uid_or_none©Útranscript_row_snapshotc               ó    € V ^8„  d   QhRRRR/# )r   Úmessageúdict[str, Any]r   zOptional[int]r    )r!   s   "r   r"   ÚBSessionPruneRewriteMixin.held_row_mismatches.<locals>.__annotate__D   s   € ÷ 	ñ 	˜~ð 	°-ñ 	r$   c                ó’   € V P                  R 4      p\        V\        4      '       d    \        V\        4      '       g
   V^ 8”  d   V# R# )Ú_row_idN)ÚgetÚ
isinstanceÚintÚbool)r5   Úrids   & r   Ú	_exact_idÚ?SessionPruneRewriteMixin.held_row_mismatches.<locals>._exact_idD   s7   € Ø—+‘+˜iÓ(ˆCÜ˜#œs×#Ò#¬J°s¼D×,AÒ,AÀcÈAÄgØ�
Ùr$   Úrolez7SELECT * FROM messages WHERE session_id = ? AND id IN (r   ÚidztSELECT * FROM messages WHERE session_id = ? AND active = 1 AND role = ? AND message_uid = ? ORDER BY id DESC LIMIT 1Ú ÚactiveÚunknownÚcontentÚtool_call_idÚ
tool_calls)ÚuserÚ	assistantÚtool)Úagent.message_metadatar1   Úagent.transcript_repairr3   r;   Údictr:   Ú_DB_PERSISTED_MARKER_KEYr   r   r   Úexecuter	   Úfetchallr<   ÚitemsÚfetchoneÚappendÚ_row_identityr   Ú_decode_content)r)   r(   r   r   r1   r3   r?   r5   ÚexactÚrow_idÚby_idÚby_uidÚuidÚstoredÚchunkÚrowÚ
by_uid_rowÚ
mismatchesÚsnapshotÚheld_identityÚstored_identitys   &&&&                 r   r'   Ú,SessionPruneRewriteMixin.held_row_mismatches4   s  € õ 	?ÝCõ	ñ  óFá�Ü˜'¤4×(ô *à-4¯[©[Ô9Q×-Rô *ð —‘˜FÓ#Ð'DÑDô *ˆW�i Ó(Ó)Ùð 	ð Fñ
 9>ÔT¹¡_ WÀ”�’¹ˆÑTð
 ˆÛ$‰OˆGØŒ~¤*¨W¯[©[¼Ó-IÌ3×"OÔ"OÙ)¨'Ó2�Ø”?Ø")˜3“Kñ	  %÷
 §%¯6ØˆIØ!#ˆÜ Ö&ˆEØ—|‘|ØIÌ-ÐX]ÓJ^ÐI_Ð_`ÐaØÐ$˜eÑ$ó&ç&.¡h£jò1�ð *-”s˜3˜t�9“~Ó&ó1ñ 'ð
 &(ˆ
Ø"ŸL™LžN‰LˆCð —,‘,ð+àŸ[™[¨Ó0°#Ð6ó8÷ 9A¹»
ð ð ŒØ"%�
˜3‘Ø),”s˜3˜t�9“~Ó&ñ +ð !#ˆ
Ü$‰OˆGØ(.Ò(:�&—*‘*˜VÔ$À
ÇÁÑObÐcjÓOk×OqÐOqÐoqÓ@rˆCØŠ{¤# c¨(¥m×&8Ð&8°q×"9Ò"9ÙØ—{‘{¤?Ó3ˆHÜ˜(¤C×(Ò(Ù*¨3Ó/°8Ô;Ø×%Ñ%¤c¨#¨d­)£nÔ5ÙØ ×.Ñ.Ø—‘˜F IÓ.°·±¸IÓ0FÈÏÉÐTbÓHcÜ! '§+¡+¨lÓ";Ó<ó>ˆMð #×0Ñ0Ø�F•˜T×1Ñ1°#°iµ.ÓAÀ3À~ÕCVÜ! # lÕ"3Ó4ó6ˆOð  ×/Ø×!Ñ!¤# c¨$¥i£.×1ñ!  %ð" ÐùòsFùó
 Us"   —M´MÁMÁ)MÁ=M$Â
M$Úmodel_config_patchNc               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   r   r   Úchangesz+list[tuple[dict[str, Any], dict[str, Any]]]re   zOptional[dict[str, Any]]r   r<   r    )r!   s   "r   r"   r#   …   s1   € ÷ F>ñ F>¨cð F>Ð<gð F>Ø4ðF>Ø@CñF>r$   c          	     ó  a aaaaaa	a
aaa€ ^ RI Ho ^ RIHo ^ RIHo ^ RIHo	Ho
 R R loR VVV	V
VV VV3R lloVV
VVVV VV3R	 lpS P                  S4       S P                  TS UUu. uF  w  rVVNK	  	  upp4      # u uppi )
uB  Proactive-prune commit that rewrites only the changed rows, in place (#124102).

``archive_and_compact`` is a generation writer: it archives every active row and re-inserts the whole
list, which is right for summary compaction (the row set changes) but makes each prune grow the store
by the full live transcript although a prune only edits a few rows' content. Each
``(original, replacement)`` in *changes* is a persisted message the prune edited. Its row is named by
``original["_row_id"]``, else by its tool call id (tool results) or tool-call ids (assistant turns),
else by the single active row with the same role and stored content. That row gets one archived twin
of its pre-prune self (``active=0, compacted=1``: still searchable, like the originals
``archive_and_compact`` keeps), then takes the replacement's changed columns under its own id.
Unchanged rows, model order, row ids and concurrently appended rows are untouched; the FTS and
display-identity triggers keep both indexes consistent; the counters are unchanged because no row
enters or leaves the live set.

Raises :class:`PruneRowUnresolvedError` before writing anything when a row cannot be named exactly (a
merged dict, zero or several matches, an inactive row or a user row), so the caller can commit
through ``archive_and_compact``. A named row whose stored payload moved on raises the
:class:`PruneRowStaleError` subclass instead: that is another writer's generation, not ambiguity,
and the full writer must not be handed the stale transcript. The staleness check is the repo's
row-version CAS (``DB_ROW_SNAPSHOT`` / ``transcript_row_snapshot``, see ``agent/transcript_repair``)
when the held dict carries the digest â€” it covers every owned column including assistant
``tool_calls`` arguments â€” and the representation-safe loader-lens identity compare otherwise
(raw storage bytes are never compared against a loaded/normalized view; #124102).
Returns the rows rewritten. Each rewritten dict is stamped with its row's new digest, so a second
prune of the same transcript compares against what this commit wrote, not what it replaced.
)ÚABSORBED_ROW_IDSr   r2   )ÚPruneRowStaleErrorÚPruneRowUnresolvedErrorc               ó    € V ^8„  d   QhRRRR/# )r   rH   r   r   z	list[Any]r    )r!   s   "r   r"   ÚBSessionPruneRewriteMixin.rewrite_pruned_rows.<locals>.__annotate__¦   s   € ÷ 	zñ 	z #ð 	z¨)ñ 	zr$   c                ó¤   € \        V 4      ;'       g    .  Uu. uF,  p\        V\        4      '       d   VP                  R 4      MRNK.  	  up# u upi )rB   N)r   r;   rN   r:   )rH   Úcalls   & r   Ú	_call_idsÚ?SessionPruneRewriteMixin.rewrite_pruned_rows.<locals>._call_ids¦   sG   € ÜTeÐfpÓTq×TwÐTwÐuwÐTwÓyÑTwÈ4¤j°´t×&<Ò&<�D—H‘H˜T”NÀ$ÒFÑTwÑyÐyùÒys   ˜2Ac               ó    € V ^8„  d   QhRRRR/# )r   Úoriginalr6   r   r   r    )r!   s   "r   r"   rm   ©   s   € ÷ %	ñ %	 ^ð %	¸ñ %	r$   c           
     ó  <€ VP                  R 4      pVR9  g   VP                  S4      '       d   S! RV R24      hVP                  R4      p\        V\        4      '       d#   \        V\        4      '       g   V^ 8”  d   V.pEMVR8X  da   VP                  R4      '       dJ   V P	                  RSVR,          34      P                  4        Uu. uF  p\        VR,          4      NK  	  ppM¥VR8X  dŒ   S! VP                  R	4      4      '       do   S! VP                  R	4      4      pV P	                  R
S34      P                  4        Uu. uF+  pS! VR	,          4      V8X  g   K  \        VR,          4      NK-  	  ppMSP                  V SV4      p\        V4      ^8w  d   S! \        V4       RV R24      hV P	                  RV^ ,          S34      P                  4       pVe   VR ,          V8w  d   S
! RV^ ,           RV R24      hVP                  S	4      p\        V\        4      '       d'   S! V4      V8w  d   S
! RV^ ,           RV R24      h V# SP                  W!P                  R4      VP                  R4      \        VP                  R	4      4      4      SP                  VR ,          SP                  VR,          4      VR,          \        VR	,          4      4      8w  d   S
! RV^ ,           RV R24      hV# u upi u upi )rA   rJ   rK   za z" message is not rewritten in placer9   rG   zbSELECT id FROM messages WHERE session_id = ? AND active = 1 AND role = 'tool' AND tool_call_id = ?rB   rH   zySELECT id, tool_calls FROM messages WHERE session_id = ? AND active = 1 AND role = 'assistant' AND tool_calls IS NOT NULLz live rows match a pruned z messagezESELECT * FROM messages WHERE id = ? AND session_id = ? AND active = 1zrow z no longer holds the pruned rF   )rJ   rK   )r:   r;   r<   r=   rP   rQ   Ú_matching_active_idsÚlenrS   r   rU   r   rV   )r(   rs   rA   rX   Úidsr^   Úwantedra   ri   r   rj   rk   rp   r)   r   r3   s   &&      €€€€€€€€r   Ú_resolveÚ>SessionPruneRewriteMixin.rewrite_pruned_rows.<locals>._resolve©   s  ø€ Ø—<‘< Ó'ˆDØÐ0Ô0°H·L±LÐAQ×4RÒ4RÙ-°°4°&Ð8ZÐ.[Ó\Ð\Ø—\‘\ )Ó,ˆFÜ˜&¤#×&Ò&¬z¸&Ä$×/GÒ/GÈFÐUVÌJØ�h’Ø˜” H§L¡L°×$@Ò$@Ø15·±ØxØ ¨.Õ!9Ð:ó2<ç<D¹H»Jð2Gó Hñ 2G¨#”s˜3˜t�9–~ñ 2G�ð H�ð ˜Ô$©°8·<±<ÀÓ3M×)NÒ)NÙ" 8§<¡<°Ó#=Ó>�Ø15·±ð1Ø3=°-ó2AçAIÁÃð2Ló wñ 2L¨#áOXÐY\Ð]iÕYjÓOkÐouÑOuô &”s˜3˜t�9–~ñ 2L�ð w�ð ×/Ñ/°°jÀ(ÓK�Ü�3‹x˜1Œ}Ù-´°S³°
Ð:TÐUYÐTZÐZbÐ.cÓdÐdØ—,‘,ØWÐZ]Ð^_ÕZ`ÐblÐYmóoßowÑowÓoyð àŠ{˜c &�k¨TÔ1Ù(¨4°°Aµ¨xÐ7SÐTXÐSYÐYaÐ)bÓcÐcØ—|‘| OÓ4ˆHÜ˜(¤C×(Ò(ñ +¨3Ó/°8Ô;Ù,¨t°C¸µF°8Ð;WÐX\ÐW]Ð]eÐ-fÓgÐgð <ð ˆJð ×$Ñ$ T¯<©<¸	Ó+BÀHÇLÁLÐQ_ÓD`Ü%6°x·|±|ÀLÓ7QÓ%RóTà×)Ñ)¨#¨f­+°t×7KÑ7KÈCÐPYÍNÓ7[Ø+.¨~Õ+>Ô@QÐRUÐVbÕRcÓ@dófôfñ )¨4°°Aµ¨xÐ7SÐTXÐSYÐYaÐ)bÓcÐcØˆJùò;Hùò
ws   ÃLÅLÅ&Lc                óp  <€ S R JpV'       d   S!P                  V S"S RR7      MR p. pS EFg  w  rES! W4      pVR,          VR,          r‡VP                  R4      V8w  d	   S! R4      hS!P                  S"Wt\        VP                  R4      4      W‡R8H  R7      p	S!P                  S"Wu\        VP                  R4      4      W‡R8H  R7      p
\	        \
        Wš4       UUUu. uF  w  r¼pWÍ8w  g   K  V\        9  g   K  VNK  	  ppppV'       g   Kâ  TP                  \        VR	,          4      T\	        \
        V
4       UUu. uF  w  r¿W¾9   g   K  VNK  	  uppVR
,          VR,          e   \        VR,          4      M\        VR	,          4      V34       EKj  	  RP                  R S!P                  V 4       4       4      pV EF;  w  ppppppV P                  RV RV R2V34      P                  pVe$   V P                  RS"VV34      P                  4       MVV3.pV P                  RRP                  R V 4       4       R2. VOVN4       T P                  RV UUu. uF  w  ppTVf   TMTV3NK  	  upp4       V P                  RV34      P                  4       pV P                  RS!P!                  S!P#                  V4      4      VV34       V P                  RV34      P                  4       pS#! V4      VS&   EK>  	  V'       d   V P                  RVS"34       \%        V4      # u upppi u uppi u uppi )NÚraise)Ú
on_missingrA   Ú	timestampz,a prune replacement changed the message rolerH   rJ   )Úkeep_reasoningrB   Údisplay_identityÚdisplay_orderz, c              3  ó8   "  € T F  pVR9  g   K  Vx € K  	  R# 5i)rB   N)rB   rD   Ú	compactedr�   r    )r   Úcs   & r   r   ÚLSessionPruneRewriteMixin.rewrite_pruned_rows.<locals>._do.<locals>.<genexpr>æ   s#   é € ð %aÑ0P¨1Ø()Ð1_Ñ(_÷ &'¢QÓ0Pùs   ‚	�
zINSERT INTO messages (z, active, compacted) SELECT z!, 0, 1 FROM messages WHERE id = ?z‚SELECT id, display_order FROM messages WHERE session_id = ? AND id <> ? AND display_identity = ? AND (active = 1 OR compacted = 1)zUPDATE messages SET c              3  ó*   "  € T F	  q R 2x € K  	  R# 5i)z = ?Nr    r   s   & r   r   r…   ñ   s   é € Ð=dÑ\cÐRXÀÈ½oÓ\cùs   ‚z WHERE id = ?zHUPDATE messages SET display_identity = ?, display_order = ? WHERE id = ?zSELECT role, content, timestamp, tool_call_id, tool_calls, tool_name, display_kind, display_metadata FROM messages WHERE id = ?z#SELECT * FROM messages WHERE id = ?z1UPDATE sessions SET model_config = ? WHERE id = ?)Ú_merge_model_config_jsonr:   Ú_message_row_paramsr   ÚzipÚ_MESSAGE_ROW_COLUMNSÚ_PRUNE_FIXED_COLUMNSrT   r<   ÚjoinÚ_message_column_namesrP   Ú	lastrowidrQ   ÚexecutemanyrS   Ú_display_identityÚ_display_dedupe_keyrv   )$r(   ÚpatchÚpatched_model_configÚupdatesrs   Úreplacementr^   rA   r~   ÚbeforeÚafterr   ÚoldÚnewÚchangedÚvalueÚtwin_columnsrX   ÚcolumnsÚvaluesÚidentityÚorderÚtwin_idÚpeersÚpeer_idÚ
peer_orderÚliveÚ	final_rowr   rk   ry   rg   re   r)   r   r3   s$   &                           €€€€€€€€r   Ú_doÚ9SessionPruneRewriteMixin.rewrite_pruned_rows.<locals>._doÐ   s³  ø€ Ø&¨dÐ2ˆEçMRð $(×#@Ñ#@Ø�jÐ"4Àð $Aô $JØX\ð !àHJˆGÜ)0Ñ%�Ù˜tÓ.�Ø"% f¥+¨s°;Õ/?�iØ—?‘? 6Ó*¨dÔ2Ù1Ð2`ÓaÐaØ×1Ñ1°*¸dÔN_Ø—L‘L Ó.óO0Ø1:ÐS^ÑK^ð 2ó `�à×0Ñ0°¸TÔPaØ—O‘O LÓ1óQ3Ø4=ÐVaÑNað 1ó c�ä:=Ô>RÐTZÔ:bõ QÑ:bÑ&6 f°3Ø!™jô "Ø-3Ô;OÑ-O÷ "˜6Ñ:b�ò Qç‘7Ø—N‘N¤C¨¨D­	£N°GÜ36Ô7KÈUÔ3Sô>jÙ3S¡- &ÐW]ÑWhŸ˜Ñ3Sò>jàÐ.Õ/Ø58¸Õ5IÒ5Uœ˜C Õ0Ô1Ô[^Ð_bÐcgÕ_hÓ[iØ#ð	$%÷ &ñ *1ð"  Ÿ9™9ñ %a°×0JÑ0JÈ4Ô0Pó %aó aˆLäIPÑE�˜ ¨°5¸+ØŸ,™,Ð)?À¸~ð N'Ø'3 nÐ4Uð(WØY_ÐXaócßclÑclð ð CKÒBVð Ÿ™ðQà ¨Ð2ó4÷ 5=±H´JÐ^eÐglÐ]mÐ\nð ð —‘Ð3°D·I±IÑ=dÑ\cÓ=dÓ4dÐ3eÐerÐsØ.˜vÐ. vÐ.ô0ð
 × Ñ Ð!ká=Bô"DÙ=BÑ&9 g¨zð $,°jÒ6H©UÈjÐZaÓ"bÙ=Bò"DôEð —|‘|ðBØDJÀ9óNçNVÉhËjð ð —‘ÐgØ"×4Ñ4°T×5MÑ5MÈdÓ5SÓTÐV[Ð]cÐdôfð
 !ŸL™LØ9¸F¸9óFßFNÁhÃjð á/FÀyÓ/Q�˜OÔ,ñ7 JQ÷8 Ø—‘ÐPÐSgÐisÐRtÔuÜ�w“<ÐùôQQùó>jùó,"Ds$   ÃL%
Ã*L%
Ã7L%
Ä;
L,Å
L,ÉL2)Ú&agent.conversation_compression_archiveri   rL   r   rM   r3   Úhermes_state_errorsrj   rk   Ú_ensure_display_orderÚ_execute_transcript_write)r)   r   rg   re   r§   Ú_r•   ri   r   rj   rk   rp   ry   r3   s   fffd   @@@@@@@r   Úrewrite_pruned_rowsÚ,SessionPruneRewriteMixin.rewrite_pruned_rows…   sm   ÿú€ õ8 	LÝ:ÝCßSõ	z÷%	÷ %	÷N6	 ô 6	 ðn 	×"Ñ" :Ô.ð ×-Ñ-Ø±GÔ<±G¡. !“+±GÒ<ó>ð 	>ùÛ<s   Á+B r    )	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r-   r'   r®   Ú__static_attributes__r    r$   r   r   r      s'   † ÙgõKõ.OðbF>Ø7;÷F>ó F>r$   r   N>   rA   rD   r~   r   rG   r€   )r´   Ú
__future__r   Útypingr   r   Úagent.context_compressorr   rO   rL   r   Úhermes_state_commonr   r	   Úhermes_state_messagesr
   r   ÚtupleÚsplitrŠ   Ú	frozensetr‹   r   r    r$   r   Ú<module>r¾      sÎ   ðñõ #ç  å UÝ 2ß 9ß H÷ �uñ cØ!4×!:Ò!:¸3ÀÓ!BÀ1Õ!E×!KÑ!KÈCÐQRÓ!SÐTUÕ!V×!\Ñ!\Ð]`Ô!aóc—u‘uñ cØ!4×!:Ò!:¸3ÀÓ!BÀ1Õ!E×!KÑ!KÈCÐQRÓ!SÐTUÕ!V×!\Ñ!\Ð]`Ô!aócó cÐ ñ !Ò!rÓsÐ ÷q>ó q>r$   