Files
openclaw-true-recall-base/watcher/__pycache__/realtime_qdrant_watcher.cpython-312.pyc

74 lines
12 KiB
Plaintext
Raw Normal View History

2026-02-27 15:01:44 -06:00
<EFBFBD>
<10><>ik"<00> <00>"<00>dZddlZddlZddlZddlZddlZddlZddlZddlZddl m Z m
Z
ddl m Z ddl mZmZmZmZej$dd<07>Zej$dd <09>Zej$d
d <0B>Zej$d d <0A>Zej$dd<0F>ae d<10>Zdadadadad<12>Zdedeefd<15>Z dedefd<16>Z!d$deeefde"de"fd<19>Z#d<1A>Z$dededeeeeffd<1D>Z%d$dede"fd<1E>Z&d$de de"fd <20>Z'd$de"fd!<21>Z(d"<22>Z)e*d#k(re)<29>yy)%z<>
TrueRecall v1 - Real-time Qdrant Watcher
Monitors OpenClaw sessions and stores to memories_tr instantly.
This is the CAPTURE component. For curation and injection, install v2.
<EFBFBD>N)<02>datetime<6D>timezone)<01>Path)<04>Dict<63>Any<6E>Optional<61>List<73>
QDRANT_URLzhttp://10.0.0.40:6333<33>QDRANT_COLLECTION<4F> memories_tr<74>
OLLAMA_URLzhttp://10.0.0.10:11434<33>EMBEDDING_MODELzsnowflake-arctic-embed2<64>USER_ID<49>robz$/root/.openclaw/agents/main/sessionsTc<00>F<00>td|<00>d<02>tj<00><03>day)Nz
Received signal z, shutting down...<2E><01>fileF)<04>print<6E>sys<79>stderr<72>running)<02>signum<75>frames <20>]/root/.openclaw/workspace/.local_projects/true-recall-base/watcher/realtime_qdrant_watcher.py<70>signal_handlerr&s <00><00> <09> <1E>v<EFBFBD>h<EFBFBD>&8<>
9<EFBFBD><03>
<EFBFBD>
<EFBFBD>K<><13>G<EFBFBD><00>text<78>returnc<00><><00> tjt<00>d<01>t|d<02>d<03><04>}|j <00>|j <00>dS#t $r(}td|<02><00>tj<00><07>Yd}~yd}~wwxYw)Nz/api/embeddings)<02>model<65>prompt<70><00><02>json<6F>timeout<75> embeddingzError getting embedding: r)
<EFBFBD>requests<74>postr r<00>raise_for_statusr$<00> Exceptionrrr)r<00>response<73>es r<00> get_embeddingr-,sr<00><00>
<14><1B>=<3D>=<3D><19>l<EFBFBD>/<2F> *<2A>*<2A>d<EFBFBD>;<3B><16>
<EFBFBD><08>
<11>!<21>!<21>#<23><17>}<7D>}<7D><EFBFBD>{<7B>+<2B>+<2B><> <14><14> <0A>)<29>!<21><13>-<2D>C<EFBFBD>J<EFBFBD>J<EFBFBD>?<3F><13><><14>s<00>AA <00> A<<03>A7<03>7A<c<00><00>ddl}|jdd|<00>}|jdd|<00>}|jdd|<00>}|jdd|<00>}|jdd|<00>}|jdd |<00>}|jd
d |<00>}|jd d |<00>}|jd d|<00>}|jd d|<00>}|jdd|<00>}|jdd|<00>}|jdd|<00>}|j<00>S)NrzHConversation info \(untrusted metadata\):\s*```json\s*\{[\s\S]*?\}\s*```<60>z\[thinking:[^\]]*\]z0\[\w{3} \d{4}-\d{2}-\d{2} \d{2}:\d{2} [A-Z]{3}\]z
\|[^\n]*\|z \|[-:]+\|z\*\*([^*]+)\*\*z\1z \*([^*]+)\*z `([^`]+)`z```[\s\S]*?```z---+z\*\*\*+z\n{3,}<7D>
z[ \t]+<2B> )<03>re<72>sub<75>strip)rr2s r<00> clean_contentr5:s<00><00> <0A> <0E>6<EFBFBD>6<EFBFBD>]<5D>_a<5F>cg<63> h<>D<EFBFBD> <0E>6<EFBFBD>6<EFBFBD>(<28>"<22>d<EFBFBD> 3<>D<EFBFBD> <0E>6<EFBFBD>6<EFBFBD>E<>r<EFBFBD>4<EFBFBD> P<>D<EFBFBD> <0E>6<EFBFBD>6<EFBFBD>-<2D><12>T<EFBFBD> *<2A>D<EFBFBD> <0A>6<EFBFBD>6<EFBFBD>,<2C><02>D<EFBFBD> )<29>D<EFBFBD> <0E>6<EFBFBD>6<EFBFBD>$<24>e<EFBFBD>T<EFBFBD> 2<>D<EFBFBD> <0A>6<EFBFBD>6<EFBFBD>.<2E>%<25><14> .<2E>D<EFBFBD> <0A>6<EFBFBD>6<EFBFBD>,<2C><05>t<EFBFBD> ,<2C>D<EFBFBD> <0A>6<EFBFBD>6<EFBFBD>#<23>R<EFBFBD><14> .<2E>D<EFBFBD> <0E>6<EFBFBD>6<EFBFBD>'<27>2<EFBFBD>t<EFBFBD> $<24>D<EFBFBD> <0A>6<EFBFBD>6<EFBFBD>*<2A>b<EFBFBD>$<24> '<27>D<EFBFBD> <0E>6<EFBFBD>6<EFBFBD>)<29>T<EFBFBD>4<EFBFBD> (<28>D<EFBFBD> <0A>6<EFBFBD>6<EFBFBD>)<29>S<EFBFBD>$<24> '<27>D<EFBFBD> <0F>:<3A>:<3A><<3C>r<00>turn<72>dry_runc
<00><><00>|r"td|d<00>d|d<00>d|ddd<00>d<08><07>y t|d<00>}|<02>"td
|d<00><00>tj<00> <0B>y |j d t
<00>|d|d|d|j dt jtj<00>j<00><00>t jtj<00>jd<0F>dd d<11>}|j dd<12>}tjt
<00>d|<04>dt j<00>jd<15><00><00>j<00><00>j<00>dd}t j#|d<17><18>dz} t%j&t(<00>dt*<00>d<1B>dt-|<06>||d<1D>gid<1E><1F>}|j/<00>y #t0$r(}td |<08><00>tj<00> <0B>Yd}~y d}~wwxYw)!NzRY RUN] Would store turn r6<00> (<28>rolez): <20>content<6E><z...Tz!Failed to get embedding for turn rF<>user_id<69> timestampz%Y-%m-%dztrue-recall-base)r=r:r;r6r><00>date<74>source<63>curatedrz:turn:<3A>:z%H%M%S<><00>big)<01> byteorderlz /collections/z/points<74>points)<03>id<69>vector<6F>payloadr"r#zError writing to Qdrant: )rr-rr<00>getrr<00>nowr<00>utc<74> isoformat<61>strftime<6D>hashlib<69>sha256<35>encode<64>digest<73>int<6E>
from_bytesr'<00>putr
r <00>absr)r*) r6r7rHrI<00>turn_id<69>
hash_bytes<EFBFBD>point_idr+r,s r<00>store_to_qdrantrZ[s<><00><00><0E> <0A>+<2B>D<EFBFBD><16>L<EFBFBD>><3E><12>D<EFBFBD><16>L<EFBFBD>><3E><13>T<EFBFBD>R[<5B>_<EFBFBD>]`<60>^`<60>Ma<4D>Lb<4C>be<62>f<>g<><13> <1A>4<EFBFBD> <09>?<3F> +<2B>F<EFBFBD> <0A>~<7E> <0A>1<>$<24>v<EFBFBD>,<2C><1E>@<40>s<EFBFBD>z<EFBFBD>z<EFBFBD>R<><14><18>8<EFBFBD>8<EFBFBD>I<EFBFBD>w<EFBFBD>/<2F><14>V<EFBFBD> <0C><17> <09>?<3F><14>V<EFBFBD> <0C><19>X<EFBFBD>X<EFBFBD>k<EFBFBD>8<EFBFBD><<3C><<3C><08> <0C> <0C>+E<>+O<>+O<>+Q<>R<><18> <0C> <0C>X<EFBFBD>\<5C>\<5C>*<2A>3<>3<>J<EFBFBD>?<3F>$<24><18> <06>G<EFBFBD><13>h<EFBFBD>h<EFBFBD>v<EFBFBD>q<EFBFBD>!<21>G<EFBFBD><18><1E><1E>7<EFBFBD>)<29>6<EFBFBD>'<27><19>!<21>H<EFBFBD>L<EFBFBD>L<EFBFBD>N<EFBFBD><S<><S<>T\<5C><]<5D>;^<5E> _<> f<> f<> h<>i<>p<>p<>r<>su<73>tu<74>v<>J<EFBFBD><12>~<7E>~<7E>j<EFBFBD>E<EFBFBD>~<7E>:<3A>e<EFBFBD>D<>H<EFBFBD><15><1B><<3C><<3C><19>l<EFBFBD>-<2D>(9<>':<3A>'<27> B<><18><1D>h<EFBFBD>-<2D>$<24>&<26><12><13><0E><17>

<EFBFBD><08> <11>!<21>!<21>#<23><13><> <14><15> <0A>)<29>!<21><13>-<2D>C<EFBFBD>J<EFBFBD>J<EFBFBD>?<3F><14><><15>s<00><AG<00> G4<03> G/<03>/G4c<00><><00>tj<00>syttjd<01><00>}|syt |d<02><00><03>S)Nz*.jsonlc<00>6<00>|j<00>jS)N)<02>stat<61>st_mtime)<01>ps r<00><lambda>z*get_current_session_file.<locals>.<lambda><3E>s<00><00>A<EFBFBD>F<EFBFBD>F<EFBFBD>H<EFBFBD>$5<>$5<>r)<01>key)<05> SESSIONS_DIR<49>exists<74>list<73>glob<6F>max)<01>filess r<00>get_current_session_filerh<00>s:<00><00> <17> <1E> <1E> <20><13> <10><1C>"<22>"<22>9<EFBFBD>-<2D> .<2E>E<EFBFBD> <10><13> <0E>u<EFBFBD>5<> 6<>6r<00>line<6E> session_namec <00><><00> tj|j<00><00>}|j d<01>dk7sd|vry|d}|j d<03>}|dvry|dvryd}t |j d<07>t <00>r)|dD] }t |t<00>s<01>d|vs<01>||dz }<05>"n$t |j d<07>t<00>r|d}|syt|<05>}|rt|<05>d krytd
z a t||dd |j d tjtj<00>j!<00><00>t"d <0A>S#tj$rYywxYw)N<>type<70>messager:)<03>
toolResult<EFBFBD>system<65> developer)<02>user<65> assistantr/r;r<00><00>i<>r>)r6r:r;r>r=)r$<00>loadsr4<00>JSONDecodeErrorrJ<00>
isinstancerd<00>dict<63>strr5<00>len<65> turn_counterrrKrrLrMr)rirj<00>entry<72>msgr:r;<00>items r<00>
parse_turnr<00>sV<00><00><14><14>
<EFBFBD>
<EFBFBD>4<EFBFBD>:<3A>:<3A><<3C>(<28><05> <0A>y<EFBFBD>y<EFBFBD><16><18>I<EFBFBD>%<25><19>%<25>)?<3F><13>
<0F> <09>
<1A>C<EFBFBD> <0E>7<EFBFBD>7<EFBFBD>6<EFBFBD>?<3F>D<EFBFBD> <0B>4<>4<><13> <0B>(<28>(<28><13><10>G<EFBFBD><11>#<23>'<27>'<27>)<29>$<24>d<EFBFBD>+<2B><17> <09>N<EFBFBD> (<28>D<EFBFBD><19>$<24><04>%<25>&<26>D<EFBFBD>.<2E><17>4<EFBFBD><06><<3C>'<27><07> (<28>
<14>C<EFBFBD>G<EFBFBD>G<EFBFBD>I<EFBFBD>&<26><03> ,<2C><15>i<EFBFBD>.<2E><07> <12><13><1B>G<EFBFBD>$<24>G<EFBFBD> <12>c<EFBFBD>'<27>l<EFBFBD>Q<EFBFBD>&<26><13><10>A<EFBFBD><15>L<EFBFBD><1D><14><1A>5<EFBFBD>D<EFBFBD>><3E><1A>Y<EFBFBD>Y<EFBFBD>{<7B>H<EFBFBD>L<EFBFBD>L<EFBFBD><18><1C><1C>,F<>,P<>,P<>,R<>S<><1A>  <06><06><>A <10> <1F> <1F><14><13><14>s<00>#E<00>E<03>Ec<00><><00>|jt<00>|D]I}|j<00>}|s<01>t||<01>}|s<01>%t ||<02>s<01>2t d|d<00>d|d<00>d<05><05><00>K|j <00>ay)Nu ✅ Turn r6r9r:u ) → Qdrant)<07>seek<65> last_positionr4rrZr<00>tell)<05>frjr7rir6s r<00>process_new_linesr<73><00>sw<00><00><06>F<EFBFBD>F<EFBFBD>=<3D><19><11>N<01><04><13>z<EFBFBD>z<EFBFBD>|<7C><04><13> <14><19>$<24> <0C>-<2D><04> <0F><1E>t<EFBFBD>W<EFBFBD>-<2D><15> <09>$<24>v<EFBFBD>,<2C><1E>r<EFBFBD>$<24>v<EFBFBD>,<2C><1E>|<7C>L<>M<>N<01><16>F<EFBFBD>F<EFBFBD>H<EFBFBD>Mr<00> session_filec<00><><00>|jjdd<02>}td|j<00><00><02> t|d<04>5}|D] }tdz a<04>  ddd<00>|j <00>j atdt<00>dt<00><00><04>t|d<04>5}trN|j<00>std <0B> ddd<00>yt|||<01>tjd <0C>tr<01>Nddd<00>|S#1swY<00><>xYw#t$r*}td|<05><00>tj<00> <09>d
aYd}~<05><>d}~wwxYw#1swY|SxYw) Nz.jsonlr/zWatching session: <20>rrtz Session has z( existing turns, starting from position z(Warning: Could not read existing turns: rrz0Session file removed, looking for new session...g<><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?)<10>name<6D>replacer<00>openr{r]<00>st_sizer<65>r*rrrrcr<><00>time<6D>sleep)r<>r7rjr<>rir,s r<00> watch_sessionr<6E><00>s=<00><00> <20>$<24>$<24>,<2C>,<2C>X<EFBFBD>r<EFBFBD>:<3A>L<EFBFBD> <09> <1E>|<7C>0<>0<>1<>
2<EFBFBD>3<><1A> <11>,<2C><03> $<24> "<22><01><19> "<22><04><1C><01>!<21> <0C> "<22> "<22>%<25>)<29>)<29>+<2B>3<>3<> <0A> <0A> <0C>\<5C>N<EFBFBD>*R<>S`<60>Ra<52>b<>c<>
<0E>l<EFBFBD>C<EFBFBD> <20><1C>A<EFBFBD><15><1F>&<26>&<26>(<28><15>H<>I<><1B> <1C><1C> <1E>a<EFBFBD><1C>w<EFBFBD> 7<> <10>J<EFBFBD>J<EFBFBD>s<EFBFBD>O<EFBFBD> <16><1C> <18><17>% "<22> "<22><>
<15><1A> <0A>8<><11><03><<3C>3<EFBFBD>:<3A>:<3A>N<><19> <0A><><1A><><1C> <18><17>sA<00> D<00>C:<03>;D<00>#D<<03>(D<<03>:D<07>?D<00> D9<03> D4<03>4D9<03><Ec<00><00>tr<>t<00>}|<01>!td<01>tjd<02><00>3t
|k7rtd|j <00><00><02>|adad}t||<00>}|<03>datjd<05>tr<01><>yy)Nz#No active session found, waiting...rtz
New session detected: rg<00>?) rrhrr<>r<><00> current_filer<65>r{r<>)r7r<>r<><00>results r<00>
watch_loopr<EFBFBD><00>s<><00><00> <12>/<2F>1<> <0C> <17> <1F> <11>7<> 8<> <10>J<EFBFBD>J<EFBFBD>q<EFBFBD>M<EFBFBD> <14> <17><<3C> '<27> <11>,<2C>\<5C>-><3E>-><3E>,?<3F>@<40> A<>'<27>L<EFBFBD><1C>L<EFBFBD><1D>M<EFBFBD><1E>|<7C>W<EFBFBD>5<><06> <11>><3E><1F>L<EFBFBD> <10>J<EFBFBD>J<EFBFBD>s<EFBFBD>O<EFBFBD>% <12>'rc<00>^<00>tjd<01><02>}|jdddd<06><07>|jdd dd
<EFBFBD><07>|jd d dd <0A><07>|jddtdt<00>d<11><03><12>|j <00>}t j
t
j t<00>t j
t
jt<00>|jr |jatd<13>tdt<00>dt<00><00><04>tdt<00>dt<00><00><04>tdt<00><00><02>t<00>|jr:td<18>t!<00>}|rt#||j$<00>ytd<19>ytd<1A>t'|j$<00>y)Nz(TrueRecall v1 - Real-time Memory Capture)<01> descriptionz--daemonz-d<>
store_truez Run as daemon)<02>action<6F>helpz--oncez-ozProcess once then exitz --dry-runz-nzDon't write to Qdrantz --user-idz-uzUser ID (default: <20>))<02>defaultr<74>u-🔍 TrueRecall v1 - Real-time Memory Captureu 📍 Qdrant: <20>/u 🧠 Ollama: u 👤 User: zRunning once...zNo session foundz%Running as daemon (Ctrl+C to stop)...)<14>argparse<73>ArgumentParser<65> add_argumentr<00>
parse_args<EFBFBD>signal<61>SIGINTr<00>SIGTERMr=rr
r r r<00>oncerhr<>r7r<>)<03>parser<65>argsr<73>s r<00>mainr<6E>sS<00><00><16> $<24> $<24>1[<5B> \<5C>F<EFBFBD>
<EFBFBD><17><17>
<EFBFBD>D<EFBFBD><1C>O<EFBFBD><17>T<>
<EFBFBD><17><17><08>$<24>|<7C>BZ<42><17>[<5B>
<EFBFBD><17><17> <0B>T<EFBFBD>,<2C>E\<5C><17>]<5D>
<EFBFBD><17><17> <0B>T<EFBFBD>7<EFBFBD>CU<43>V]<5D>U^<5E>^_<>A`<60><17>a<> <11> <1C> <1C> <1E>D<EFBFBD>
<EFBFBD>M<EFBFBD>M<EFBFBD>&<26>-<2D>-<2D><1E>0<>
<EFBFBD>M<EFBFBD>M<EFBFBD>&<26>.<2E>.<2E>.<2E>1<> <0B>|<7C>|<7C><16>,<2C>,<2C><07> <09> 9<>;<3B> <09>M<EFBFBD>*<2A><1C>Q<EFBFBD>'8<>&9<>
:<3A>;<3B> <09>M<EFBFBD>*<2A><1C>Q<EFBFBD><EFBFBD>&7<>
8<EFBFBD>9<> <09>K<EFBFBD><07>y<EFBFBD>
!<21>"<22> <09>G<EFBFBD> <0B>y<EFBFBD>y<EFBFBD> <0A><1F> <20>/<2F>1<> <0C> <17> <19>,<2C><04> <0C> <0C> 5<> <11>$<24> %<25> <0A>5<>6<><12>4<EFBFBD><<3C><<3C> r<00>__main__)F)+<2B>__doc__<5F>osrr$r<>r<>rOr<>r'rr<00>pathlibr<00>typingrrrr <00>getenvr
r r rrrbrr<>r<>r{rry<00>floatr-r5<00>boolrZrhrr<>r<>r<>r<><00>__name__<5F>rr<00><module>r<>s<><00><01><04>
<EFBFBD>
<EFBFBD> <0B> <0B> <0A><0E><0F><0F>'<27><18>,<2C>,<2C><17>R<EFBFBD>Y<EFBFBD>Y<EFBFBD>|<7C>%<<3C> =<3D>
<EFBFBD><1D>B<EFBFBD>I<EFBFBD>I<EFBFBD>1<>=<3D>A<><11> <16>R<EFBFBD>Y<EFBFBD>Y<EFBFBD>|<7C>%=<3D> ><3E>
<EFBFBD><1B>"<22>)<29>)<29>-<2D>/H<>I<><0F>
<13>"<22>)<29>)<29>I<EFBFBD>u<EFBFBD>
%<25><07><14>:<3A>;<3B> <0C> <0F><07><11> <0A><13> <0C><10> <0C><14> <14><03> <14><04>U<EFBFBD> <0B> <14><18><03><18><03><18>B*<15>$<24>s<EFBFBD>C<EFBFBD>x<EFBFBD>.<2E>*<15>4<EFBFBD>*<15>D<EFBFBD>*<15>Z7<>+<06>S<EFBFBD>+<06><03>+<06><08><14>c<EFBFBD>3<EFBFBD>h<EFBFBD><1E>0H<30>+<06>\<1D>s<EFBFBD><1D>T<EFBFBD><1D>$<18><04><18>t<EFBFBD><18>8<1C><04><1C>0 !<21>F <0C>z<EFBFBD><19><08>F<EFBFBD>r