§
    ™ŠtjÒ  ã                  óz   — d Z ddlmZ ddlmZ ddlmZmZmZm	Z	 d#d„Z
d$d„Zd%d„Zh d£Zd&d„Zd'd„Zd(d„Zd)d!„Zd"S )*z•Subscription matching: channel inference + namespace prefix filtering.

Direct port of `libs/sdk/src/client/stream/subscription.ts` from the JS SDK.
é    )Úannotations)ÚAny)ÚChannelÚEventÚ	NamespaceÚSubscribeParamsÚsegmentÚstrÚreturnc                óP   — |                       d¦  «        }|dk    r| n	| d|…         S )z<Strip the dynamic suffix after `:` from a namespace segment.ú:éÿÿÿÿN)Úfind)r	   Úidxs     ú_/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langgraph_sdk/stream/subscription.pyÚnormalize_segmentr      s-   € à
�,Š,�sÑ
Ô
€CØ˜R’i�iˆ7ˆ7 W¨T¨c¨T¤]Ð2ó    Úevent_namespacer   ÚprefixÚboolc                óÂ   — t          |¦  «        t          | ¦  «        k    rdS t          || d¬¦  «        D ])\  }}||k    rŒd|v r dS t          |¦  «        |k    rŒ' dS dS )a  Whether `event_namespace` starts with `prefix`.

    Segments compare literally first; if the prefix segment contains no `:`,
    the candidate is also compared after its dynamic suffix is stripped.
    Mirrors `is_prefix_match` in `api/langgraph_api/protocol/namespace.py`.
    F)Ústrictr   T)ÚlenÚzipr   )r   r   ÚsegÚ	candidates       r   Úis_prefix_matchr      s„   € õ ˆ6�{„{•S˜Ñ)Ô)Ò)Ð)ØˆuÝ˜f o¸eÐDÑDÔDð ð ‰ˆˆYØ˜ÒÐØØ�#ˆ:ˆ:Ø�5�5Ý˜YÑ'Ô'¨3Ò.Ð.ØØˆuˆuØˆ4r   Úprefixesúlist[Namespace] | NoneÚdepthú
int | Nonec                ó�   — |sdS |D ]>}t          | |¦  «        sŒ|€ dS t          | ¦  «        t          |¦  «        z
  |k    r dS Œ?dS )zCWhether `event_namespace` matches any of `prefixes` within `depth`.TNF)r   r   )r   r   r    r   s       r   Únamespace_matchesr#   '   sp   € ð ð ØˆtØð ð ˆÝ˜°Ñ7Ô7ð 	ØØˆ=Ø�4�4ÝˆÑÔ¥# f¡+¤+Ñ-°Ò6Ð6Ø�4�4ð 7àˆ5r   >   ÚtasksÚtoolsÚvaluesÚupdatesÚmessagesÚ	lifecycleÚcheckpointsÚeventr   úChannel | Nonec                óR  — |                       d¦  «        }|t          v r|S |dk    rx|                       d¦  «        pi }t          |t          ¦  «        r|                      d¦  «        nd}t          |t          ¦  «        r|                      d¦  «        nd}|rd|› �ndS |dk    rd	S dS )
zÏMap a protocol event's `method` to its subscription channel.

    Returns `None` for unrecognized methods so new server-side channels (e.g.
    from extension transformers) don't break existing clients.
    ÚmethodÚcustomÚparamsÚdataNÚnameúcustom:zinput.requestedÚinput)ÚgetÚ_DIRECT_METHODSÚ
isinstanceÚdict)r+   r.   r0   r1   r2   s        r   Úinfer_channelr9   D   s¿   € ð �YŠY�xÑ Ô €FØ•Ð Ð ØˆØ�ÒÐØ—’˜8Ñ$Ô$Ð*¨ˆÝ%/°½Ñ%=Ô%=ÐGˆv�zŠz˜&Ñ!Ô!Ð!À4ˆÝ#-¨dµDÑ#9Ô#9ÐCˆt�xŠx˜ÑÔÐ¸tˆà#'Ð5Ð˜ÐÐÐ¨XÐ5ØÐ"Ò"Ð"ØˆwØˆ4r   Ú
definitionr   c                óˆ  — t          | ¦  «        }|€dS |                     dg ¦  «        }||vr|                     d¦  «        rd|v sdS |                      d¦  «        pi }t          |t          ¦  «        r|                     dg ¦  «        ng }t          ||                     d¦  «        |                     d	¦  «        ¦  «        S )
z5Whether `event` should be delivered for `definition`.NFÚchannelsr3   r/   r0   Ú	namespaceÚ
namespacesr    )r9   r5   Ú
startswithr7   r8   r#   )r+   r:   Úchannelr<   r0   r=   s         r   Úmatches_subscriptionrA   X   sÍ   € å˜EÑ"Ô"€GØ€ØˆuØ�~Š~˜j¨"Ñ-Ô-€HØ�hÐÐØ×Ò˜9Ñ%Ô%ð Ø*2°hÐ*>Ð*>àˆuØ�YŠY�xÑ Ô Ð& B€FÝ/9¸&Å$Ñ/GÔ/GÐO�—
’
˜;¨Ñ+Ô+Ð+ÈR€IÝØØ�Š�|Ñ$Ô$Ø�Š�wÑÔñô ð r   Úsubscriptionsúlist[dict[str, Any]]údict[str, Any]c                óÒ  — | sdg iS t          ¦   «         }d}i }d}d}| D ]‡}|                     dg ¦  «        D ]}|                     |¦  «         Œ|                     d¦  «        }|€d}n|s|D ]}	|	|t          |	¦  «        <   Œ|                     d¦  «        }
|
€d}Œ}|s|
|k    r|
}Œˆdt	          |¦  «        i}|s&|r$t          |                     ¦   «         ¦  «        |d<   |s||d<   |S )uª  Aggregate a set of subscription filters into one covering filter.

    Direct port of `client/stream/index.ts:#computeUnionFilter`.

    - Channels are unioned.
    - Namespaces: if any subscription omits `namespaces` (wildcard), the union
      is unscoped (omits the key). Otherwise, deduplicated union.
    - Depth: if any subscription omits `depth` (unbounded), the union is
      unbounded (omits the key). Otherwise, take the max. `depth=0` is a
      valid bounded value â€” never omit when all subscriptions provide it.

    Args:
        subscriptions: list of `SubscribeParams`-shaped dicts.

    Returns:
        A `SubscribeParams`-shaped dict covering every input.
    r<   Fr   r>   NTr    )Úsetr5   ÚaddÚtupleÚsortedÚlistr&   )rB   r<   Úwildcard_namespacesÚnamespace_mapÚunbounded_depthÚ	max_depthÚsubÚchÚsub_namespacesÚnsÚ	sub_depthÚresults               r   Úcompute_union_filterrU   k   sK  € ð( ð  Ø˜BÐÐå™œ€HØÐØ68€MØ€OØ€Iàð "ð "ˆØ—'’'˜* bÑ)Ô)ð 	ð 	ˆBØ�LŠL˜ÑÔÐÐàŸš Ñ.Ô.ˆØÐ!Ø"&ÐÐØ$ð 	.Ø$ð .ð .�Ø+-��e B™iœiÑ(Ð(à—G’G˜GÑ$Ô$ˆ	ØÐØ"ˆOˆOØ ð 	" Y°Ò%:Ð%:Ø!ˆIøà(­&°Ñ*:Ô*:Ð;€FØð < =ð <Ý# M×$8Ò$8Ñ$:Ô$:Ñ;Ô;ˆˆ|ÑØð $Ø#ˆˆw‰Ø€Mr   ÚcovererÚtargetc                ó  — t          |                      dg ¦  «        ¦  «        }|                     dg ¦  «        D ]	}||vr dS Œ
|                      d¦  «        }|                     d¦  «        }|                      d¦  «        }|                     d¦  «        }|€|€dS |€dS ||k    S |€dS |D ]R}d}	|D ]F}
t          ||
¦  «        sŒ|€d}	 n.|€Œt          |¦  «        t          |
¦  «        z
  |z   |k    rd}	 nŒG|	s dS ŒSdS )a  Whether `coverer` is a superset of `target`.

    Direct port of `client/stream/index.ts:filterCovers`. Depth coverage
    accounts for namespace-prefix offset: a scoped coverer needs enough depth
    to absorb the extra levels of any deeper target namespace prefix.
    r<   Fr    r>   NT)rF   r5   r   r   )rV   rW   Úcoverer_channelsrP   Úcoverer_depthÚtarget_depthÚcoverer_namespacesÚtarget_namespacesÚtpÚcoveredÚcps              r   Úfilter_coversra   ¡   sr  € õ ˜7Ÿ;š; z°2Ñ6Ô6Ñ7Ô7ÐØ�jŠj˜ RÑ(Ô(ð ð ˆØÐ%Ð%Ð%Ø�5�5ð &ð —K’K Ñ(Ô(€MØ—:’:˜gÑ&Ô&€LØ Ÿš \Ñ2Ô2ÐØŸ
š
 <Ñ0Ô0Ðð Ð!ØÐ Ø�4ØÐØ�5Ø˜}Ò,Ð,ð Ð Øˆuð  ð ð ˆØˆØ$ð 	ð 	ˆBÝ" 2 rÑ*Ô*ð ØØÐ$Ø�Ø�ØÐ#àÝ�2‰wŒw�˜R™œÑ  <Ñ/°=Ò@Ð@Ø�Ø�ð Að ð 	Ø�5�5ð	àˆ4r   N)r	   r
   r   r
   )r   r   r   r   r   r   )r   r   r   r   r    r!   r   r   )r+   r   r   r,   )r+   r   r:   r   r   r   )rB   rC   r   rD   )rV   rD   rW   rD   r   r   )Ú__doc__Ú
__future__r   Útypingr   Úlangchain_protocolr   r   r   r   r   r   r#   r6   r9   rA   rU   ra   © r   r   ú<module>rg      s  ððð ð
 #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ð Ð à IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ Ið3ð 3ð 3ð 3ðð ð ð ð(ð ð ð ð$ð ð €ðð ð ð ð(ð ð ð ð&3ð 3ð 3ð 3ðl/ð /ð /ð /ð /ð /r   