
    ?i              
          d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	  ej                         dz  dz  d	z  d
z  adefdZd Zde	j                  defdZdde	j                  dededefdZdde	j                  dedefdZde	j                  defdZde	j                  defdZ	 	 	 dde	j                  dee   dee   dee   fdZdefdZy)z&Output rendering for last30days skill.    N)Path)Optional   )schemaz.localshare
last30daysoutreturnc                    t        | dd      }|syt               }|D ]  }|j                  d      r|j                  d       '|j                  d      r|j                  d       J|j                  d      r|j                  d       m|j                  d	      r|j                  d
       |j                  d      r|j                  d       |j                  d      r|j                  d       |j                  d      r|j                  d       |j                  d      s|j                  d        |rddj	                  t        |             dS y)zGReturn ' [also on: Reddit, HN]' string if item has cross_refs, else ''.
cross_refsN RRedditXYTYouTubeTKTikTokIG	InstagramHNPM
PolymarketWWebz [also on: , ])getattrset
startswithaddjoinsorted)itemrefssource_namesref_ids       Q/home/ubuntu/.openclaw/workspace/skills/last30days-official/scripts/lib/render.py	_xref_tagr)      s2   4t,D5L $S!X&s#S!t$Y't$X&t$[)t$T"t$\*s#U#!$" TYYvl';<=Q??    c                     t         j                  j                  d      } | rt        |       a	 t        j                  dd       y# t        $ r= t        t        j                               dz  dz  at        j                  dd       Y yw xY w)zKEnsure output directory exists. Supports env override and sandbox fallback.LAST30DAYS_OUTPUT_DIRT)parentsexist_okr   r	   N)	osenvirongetr   
OUTPUT_DIRmkdirPermissionErrortempfile
gettempdir)env_dirs    r(   ensure_output_dirr8   *   sz     jjnn45G']
65 6(--/0<?%G
56s   A ABBreportc           	      6    t         fd j                  D              }t         fd j                  D              }t         fd j                  D              }t         fd j                  D              }t         fd j
                  D              }t         fd j                  D              }t         fd j                  D              }||z   |z   |z   |z   |z   |z   }t         j                        t         j                        z   t         j                        z   t         j                        z   t         j
                        z   t         j                        z   t         j                        z   }	|||||	|dk  |	d	kD  xr ||	d
z  k  dS )z7Assess how much data is actually from the last 30 days.c              3   p   K   | ]-  }|j                   s|j                   j                  k\  s*d  / ywr   Ndate
range_from).0rr9   s     r(   	<genexpr>z)_assess_data_freshness.<locals>.<genexpr>:   (     [aAFFqvvIZIZ?Z[   666c              3   p   K   | ]-  }|j                   s|j                   j                  k\  s*d  / ywr<   r=   )r@   xr9   s     r(   rB   z)_assess_data_freshness.<locals>.<genexpr>;   s(     Q!&&QVVv?P?P5P1QrD   c              3   p   K   | ]-  }|j                   s|j                   j                  k\  s*d  / ywr<   r=   )r@   wr9   s     r(   rB   z)_assess_data_freshness.<locals>.<genexpr><   s(     U1aff6CTCT9TQUrD   c              3   p   K   | ]-  }|j                   s|j                   j                  k\  s*d  / ywr<   r=   )r@   hr9   s     r(   rB   z)_assess_data_freshness.<locals>.<genexpr>=   (     [!AFFqvvIZIZ?ZA[rD   c              3   p   K   | ]-  }|j                   s|j                   j                  k\  s*d  / ywr<   r=   )r@   pr9   s     r(   rB   z)_assess_data_freshness.<locals>.<genexpr>>   rK   rD   c              3   p   K   | ]-  }|j                   s|j                   j                  k\  s*d  / ywr<   r=   )r@   tr9   s     r(   rB   z)_assess_data_freshness.<locals>.<genexpr>@   rC   rD   c              3   p   K   | ]-  }|j                   s|j                   j                  k\  s*d  / ywr<   r=   )r@   igr9   s     r(   rB   z)_assess_data_freshness.<locals>.<genexpr>A   s(     ]"BGG6K\K\@\A]rD      r   g333333?)reddit_recentx_recent
web_recenttotal_recenttotal_items	is_sparsemostly_evergreen)	sumredditrF   web
hackernews
polymarkettiktok	instagramlen)
r9   rS   rT   rU   	hn_recent	pm_recenttiktok_recent	ig_recentrV   rW   s
   `         r(   _assess_data_freshnessrf   8   s   [6==[[MQfhhQQHU

UUJ[v00[[I[v00[[I[6==[[M] 0 0]]I 8+j89DyPS``cllLfmm$s688}4s6::FVM^M^I__beflfwfwbxx{~  @F  @M  @M  |N  N  QT  U[  Ue  Ue  Qf  fK ' $"!A%'!OP{S?P0P r*   limitmissing_keysc                 0   g }|j                  d| j                          |j                  d       t        |       }|d   re|j                  d       |j                  d|d    d| j                   d| j                   d	       |j                  d
       |j                  d       | j
                  dk(  r|j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       | j                  rD| j                  r| j                  ddnd}|j                  d| d       |j                  d       |j                  d| j                   d| j                          |j                  d| j
                          | j                  r|j                  d| j                          | j                  r|j                  d| j                          | j                  r|j                  d| j                          |j                  d       | j
                  dk(  r'|dv r#|j                  d       |j                  d       n5| j
                  d k(  r&|d!v r"|j                  d"       |j                  d       | j                  rS|j                  d#       |j                  d       |j                  d$| j                          |j                  d       n| j
                  d%v rR| j                  sF|j                  d#       |j                  d       |j                  d&       |j                  d       n| j                  r|j                  d#       |j                  d       | j                  d'| D ]V  }d}|j                  ry|j                  }g }	|j                  |	j                  |j                   d(       |j                  |	j                  |j                   d)       |	rd*d+j!                  |	       d,}|j"                  rd-|j"                   d.nd/}
|j$                  d0k7  rd1|j$                   d,nd}|j                  d2|j&                   d3|j                   d4|j(                   |
 | | t+        |       
       |j                  d5|j,                          |j                  d5|j.                          |j                  d6|j0                   d7       |j2                  r|j2                  d8   j                  d9k\  rk|j2                  d8   }|j4                  d'd: }t7        |j4                        d:kD  r|j9                         d;z   }|j                  d<|j                   d=| d>       |j:                  r9|j                  d?       |j:                  d'd@ D ]  }|j                  dA|         |j                  d       Y | j<                  rS|j                  dB       |j                  d       |j                  d$| j<                          |j                  d       n$| j
                  dCv rR| j>                  sF|j                  dB       |j                  d       |j                  dD       |j                  d       n| j>                  r|j                  dB       |j                  d       | j>                  d'| D ]  }d}|j                  ry|j                  }g }	|j@                  |	j                  |j@                   dE       |jB                  |	j                  |jB                   dF       |	rd*d+j!                  |	       d,}|j"                  rd-|j"                   d.nd/}
|j$                  d0k7  rd1|j$                   d,nd}|j                  d2|j&                   d3|j                   dG|jD                   |
 | | t+        |       
       |j                  d5|jF                  d'd:  d;       |j                  d5|j.                          |j                  d6|j0                   d7       |j                  d        | jH                  rS|j                  dH       |j                  d       |j                  d$| jH                          |j                  d       n| jJ                  r|j                  dH       |j                  d       | jJ                  d'| D ]  }d}|j                  r{|j                  }g }	|jL                  |	j                  |jL                  dIdJ       |j@                  |	j                  |j@                  dIdK       |	rd*d+j!                  |	       d,}|j"                  rd-|j"                   d.nd}
|j                  d2|j&                   d3|j                   dL|jN                   |
 | t+        |       	       |j                  d5|j,                          |j                  d5|j.                          |jP                  r@|jP                  d'd: }t7        |jP                        d:kD  r|d;z  }|j                  dM|        |j                  d6|j0                   d7       |j                  d        | jR                  rS|j                  dN       |j                  d       |j                  d$| jR                          |j                  d       n`| jT                  rS|j                  dN       |j                  d       | jT                  d'| D ]  }d}|j                  r{|j                  }g }	|jL                  |	j                  |jL                  dIdJ       |j@                  |	j                  |j@                  dIdK       |	rd*d+j!                  |	       d,}|j"                  rd-|j"                   d.nd}
|j                  d2|j&                   d3|j                   dG|jV                   |
 | t+        |       	       |j                  d5|jF                  d'd:         |j                  d5|j.                          |jX                  ro|jX                  |jF                  d't7        |jX                         k7  r@|jX                  d'd: }t7        |jX                        d:kD  r|d;z  }|j                  dO|        |jZ                  r7|j                  dPdQj!                  dR |jZ                  d'dS D                      |j                  d6|j0                   d7       |j                  d       ! | j\                  rS|j                  dT       |j                  d       |j                  d$| j\                          |j                  d       n`| j^                  rS|j                  dT       |j                  d       | j^                  d'| D ]  }d}|j                  r{|j                  }g }	|jL                  |	j                  |jL                  dIdJ       |j@                  |	j                  |j@                  dIdK       |	rd*d+j!                  |	       d,}|j"                  rd-|j"                   d.nd}
|j                  d2|j&                   d3|j                   dG|jV                   |
 | t+        |       	       |j                  d5|jF                  d'd:         |j                  d5|j.                          |jX                  ro|jX                  |jF                  d't7        |jX                         k7  r@|jX                  d'd: }t7        |jX                        d:kD  r|d;z  }|j                  dO|        |jZ                  r7|j                  dPdQj!                  dU |jZ                  d'dS D                      |j                  d6|j0                   d7       |j                  d       ! | j`                  rS|j                  dV       |j                  d       |j                  d$| j`                          |j                  d       n| jb                  r|j                  dV       |j                  d       | jb                  d'| D ]  }d}|j                  ry|j                  }g }	|j                  |	j                  |j                   d(       |j                  |	j                  |j                   d)       |	rd*d+j!                  |	       d,}|j"                  rd-|j"                   d.nd}
|j                  d2|j&                   d3|j                   dW|jd                   |
 | t+        |       	       |j                  d5|j,                          |j                  d5|jf                          |j                  d6|j0                   d7       |j:                  r9|j                  d?       |j:                  d'd@ D ]  }|j                  dA|         |j                  d        | jh                  rS|j                  dX       |j                  d       |j                  d$| jh                          |j                  d       n| jj                  r|j                  dX       |j                  d       | jj                  d'| D ]  }d}|j                  rI|j                  }g }	|jl                  |jl                  dYk\  r$|	j                  dZ|jl                  dYz  dd[       nS|jl                  d\k\  r$|	j                  dZ|jl                  d\z  d]d^       n |	j                  dZ|jl                  d]d_       |jn                  |jn                  dYk\  r$|	j                  dZ|jn                  dYz  dd`       nS|jn                  d\k\  r$|	j                  dZ|jn                  d\z  d]da       n |	j                  dZ|jn                  d]db       |	rd*d+j!                  |	       d,}|j"                  rd-|j"                   d.nd}
|j                  d2|j&                   d3|j                   d.| t+        |              |j                  d5|jp                          |jr                  rg }|jr                  D ]"  \  }}|dcz  }|j                  | dd|d]de       $ dfj!                  |      }|jt                  d8kD  r|dg|jt                   dhz  }|jv                  r|d-|jv                   d.z  }|j                  d5|        |j                  d5|j.                          |j                  d6|j0                   d7       |j                  d        | jx                  rS|j                  di       |j                  d       |j                  d$| jx                          |j                  d       nY| jz                  rL|j                  di       |j                  d       | jz                  d'| D ]  }|j"                  rd-|j"                   d.nd/}
|j$                  d0k7  rd1|j$                   d,nd}|j                  d2|j&                   dj|j                   dL|j|                   |
 | t+        |       	       |j                  d5|j,                          |j                  d5|j.                          |j                  d5|j~                  d'dk  d;       |j                  d6|j0                   d7       |j                  d        dlj!                  |      S )mzRender compact output for the assistant to synthesize.

    Args:
        report: Report data
        limit: Max items per source
        missing_keys: 'both', 'reddit', 'x', or 'none'

    Returns:
        Compact markdown string
    z## Research Results: r   rX   uG   **⚠️ LIMITED RECENT DATA** - Few discussions from the last 30 days.zOnly rV   z item(s) confirmed from  to .z[Results below may include older/evergreen content. Be transparent with the user about this.zweb-onlyuC   **🌐 WEB SEARCH MODE** - assistant will search blogs, docs & news---uW   **⚡ Want better results?** Add API keys to unlock Reddit, TikTok, Instagram & X data:ur   - `SCRAPECREATORS_API_KEY` → Reddit + TikTok + Instagram (one key, all three!) — real upvotes, comments, viewsu5   - `XAI_API_KEY` → X posts with real likes & repostsuD   - `OPENAI_API_KEY` (legacy) → Reddit threads (slower, higher cost)z.- Edit `~/.config/last30days/.env` to add keysz.1fzh oldcachedu   **⚡ CACHED RESULTS** (z") - use `--refresh` for fresh data**Date Range:** 
**Mode:** z**OpenAI Model:** z**xAI Model:** z**Resolved X Handle:** @reddit-only)rF   noneuW   *💡 Tip: Add an xAI key (`XAI_API_KEY`) for X/Twitter data and better triangulation.*x-only)r[   rq   u|   *💡 Tip: Add `SCRAPECREATORS_API_KEY` for Reddit + TikTok + Instagram data (one key, all three) and better triangulation.*z### Reddit Threadsz**ERROR:** )bothrp   z2*No relevant Reddit threads found for this topic.*Nptscmtz [r   r   z ()z (date unknown)highz [date:z**z
** (score:z) r/z  z  **r   
      ...u     💬 Top comment (z upvotes): ""z  Insights:   z    - z### X Postsrs   rr   allzx-webz+*No relevant X posts found for this topic.*likesrtz) @z### YouTube Videos,z viewsz likesz) z  Transcript: z### TikTok Videosz  Caption: z  Tags:  c              3   &   K   | ]	  }d |z     yw#N r@   rJ   s     r(   rB   z!render_compact.<locals>.<genexpr>&       0TQq0T      z### Instagram Reelsc              3   &   K   | ]	  }d |z     ywr   r   r   s     r(   rB   z!render_compact.<locals>.<genexpr>J  r   r   z### Hacker News Storiesz) hn/z#### Prediction Markets (Polymarket)i@B $zM volumei  .0fzK volumez volumezM liquidityzK liquidityz
 liquidityd   : % | z and z morez### Web Resultsz** [WEB] (score:   
)@appendtopicrf   r?   range_tomode
from_cachecache_age_hoursopenai_model_usedxai_model_usedresolved_x_handlereddit_errorr[   
engagementscorenum_commentsr"   r>   date_confidenceid	subredditr)   titleurlwhy_relevanttop_commentsexcerptra   rstripcomment_insightsx_errorrF   r   repostsauthor_handletextyoutube_erroryoutubeviewschannel_nametranscript_snippettiktok_errorr_   author_namecaption_snippethashtagsinstagram_errorr`   hackernews_errorr]   authorhn_urlpolymarket_errorr^   volume	liquidityquestionoutcome_pricesoutcomes_remainingprice_movement	web_errorr\   source_domainsnippet)r9   rg   rh   lines	freshnessage_strr$   eng_strengpartsdate_strconf_strtcr   insightr   outcomesnamepricepctoutcome_lines                        r(   render_compactr   Q   s1    E 
LL(78	LL 'v.I^_uY~677OPVPaPaObbfgmgvgvfwwxyzrsR {{j Z[RUno  J  	KLM[\EFUR :@:P:PV++C06V^/y8Z[\R	LL#F$5$5#6d6??:KLM	LL:fkk]+,)&*B*B)CDEv'<'<&=>?/0H0H/IJK	LL {{m#(EnoR		 \5G%G  T  	UR )*R{6#6#6"789R	/	/)*RIJR	)*RMM&5) "	DGoo99(LLCII;c!23##/LLC$4$4#5S!9: "499U#3"4A6G,0IIDII;a(;LH<@<P<PTZ<Z!5!5 6a8`bHLL2dggYjD@PQYPZ[cZdeldmnwx|n}m~  ALL2djj\*+LL2dhhZ)LL3t00134   T%6%6q%9%?%?2%E&&q)**Tc*rzz?S(%nn.6G9"((<PWyXYZ[ $$]+#44Ra8 5GLL6'!345 LLE"	J ~~]#R{6>>"234R	:	:688]#RBCR	]#RHHVe$ 	DGoo99(LLCII;e!45;;*LLCKK=!34 "499U#3"4A6G,0IIDII;a(;LH<@<P<PTZ<Z!5!5 6a8`bHLL2dggYjC@R@R?ST\S]^f]ghogpqz{  rA  qB  C  DLL2diio.c23LL2dhhZ)LL3t00134LL'	, )*R{6#7#7"89:R	)*RNN6E* 	DGoo99(LLCIIa=!7899(LLCIIa=!78 "499U#3"4A6G,0IIDII;a(2HLL2dggYjBt?P?P>QRZQ[\c[denosetduvwLL2djj\*+LL2dhhZ)&&11$37t../#5u$G~gY78LL3t00134LL/	4 ()R{6#6#6"789R	()RMM&5) 	DGoo99(LLCIIa=!7899(LLCIIa=!78 "499U#3"4A6G,0IIDII;a(2HLL2dggYjC@P@P?QRZQ[\c[denosetduvwLL2diio./0LL2dhhZ)##(<(<		Jd3tOcOcKd@e(e..t4t++,s2u$G{7)45}}x0T$--PRQRBS0T(T'UVWLL3t00134LL3	8 *+R{6#9#9":;<R			*+R$$Ve, 	DGoo99(LLCIIa=!7899(LLCIIa=!78 "499U#3"4A6G,0IIDII;a(2HLL2dggYjC@P@P?QRZQ[\c[denosetduvwLL2diio./0LL2dhhZ)##(<(<		Jd3tOcOcKd@e(e..t4t++,s2u$G{7)45}}x0T$--PRQRBS0T(T'UVWLL3t00134LL3	8 ./R{6#:#:";<=R			./R%%fu- 	DGoo99(LLCII;c!23##/LLC$4$4#5S!9: "499U#3"4A6G,0IIDII;a(2HLL2dggYjE$++xjY`XabklpbqarstLL2djj\*+LL2dkk]+,LL3t00134 $${,#44Ra8 5GLL6'!345 LL3	8 :;R{6#:#:";<=R			:;R%%fu- *	DGoo::)zzY.qI)=c(B(%KLu,qE)9#(>h%GHqC(8%@A==,}}	1qy)@(E[%QR%/qu)<S(A%MNqs(;:%FG "499U#3"4A6G,0IIDII;a(2HLL2dggYjAgYyQUFWXYLL2dmm_-. ""#'#6#6 ;KD%#+COOtfBs3iq$9:;  %zz(3**Q. eD,C,C+DE$JJL&& b)<)<(=Q$??Lr,01LL2dhhZ)LL3t00134LLU*	Z &'R{6#3#3"456R	&'RJJv& 		D,0IIDII;a(;LH<@<P<PTZ<Z!5!5 6a8`bHLL2dggY&6tzzl"TEWEWDXYaXbckblmvw{m|l}~LL2djj\*+LL2dhhZ)LL2dll4C0156LL3t00134LL		 99Ur*   source_infoc                    |i }g }|j                  d       |j                  d       | j                  r|j                  d| j                          nj| j                  r)|j                  dt        | j                         d       n5| j                  dv rn&|j                  dd      }|j                  d	|        | j                  r|j                  d
| j                          n| j                  rJdt        | j                         d}| j                  r|d| j                   dz  }|j                  |       n5| j                  dv rn&|j                  dd      }|j                  d|        | j                  r|j                  d| j                          nS| j                  rGt        d | j                  D              }|j                  dt        | j                         d| d       | j                  r|j                  d| j                          nS| j                  rGt        d | j                  D              }|j                  dt        | j                         d| d       | j                  r|j                  d| j                          nS| j                  rGt        d | j                  D              }|j                  dt        | j                         d| d       | j                   r|j                  d | j                           n4| j"                  r(|j                  d!t        | j"                         d"       | j$                  r|j                  d#| j$                          n4| j&                  r(|j                  d$t        | j&                         d%       | j(                  r|j                  d&| j(                          n[| j*                  r)|j                  d't        | j*                         d(       n&|j                  d)d*      }|j                  d+|        |j                  d,       d-j-                  |      S ).a  Render source status footer showing what was used/skipped and why.

    Args:
        report: Report data
        source_info: Dict with source availability info:
            x_skip_reason, youtube_skip_reason, web_skip_reason

    Returns:
        Source status markdown string
    rl   z**Sources:**u     ❌ Reddit: error — u     ✅ Reddit: z threads)rs   rp   r   z
reddit-webreddit_skip_reasonznot configuredu     ⏭️ Reddit: skipped — u     ❌ X: error — u	     ✅ X: z postsz (via @z + keyword search)r~   x_skip_reasonzNo Bird CLI or XAI_API_KEYu     ⏭️ X: skipped — u     ❌ YouTube: error — c              3   <   K   | ]  }t        |d d      sd  yw)r   Nr   r   r@   vs     r(   rB   z'render_source_status.<locals>.<genexpr>  s     cQGAG[]a<bqc   u     ✅ YouTube: z	 videos (z with transcripts)u     ❌ TikTok: error — c              3   <   K   | ]  }t        |d d      sd  ywr   Nr   r   r   s     r(   rB   z'render_source_status.<locals>.<genexpr>  s     \!CTVZ8[A\r   u     ✅ TikTok: z with captions)u     ❌ Instagram: error — c              3   <   K   | ]  }t        |d d      sd  ywr   r   r   s     r(   rB   z'render_source_status.<locals>.<genexpr>  s     _!71FWY];^A_r   u     ✅ Instagram: z reels (u     ❌ HN: error - u
     ✅ HN: z storiesu     ❌ Polymarket: error - u     ✅ Polymarket: z marketsu     ❌ Web: error — u     ✅ Web: z pagesweb_skip_reasonzassistant will use WebSearchu     ⚡ Web: r   r   )r   r   r[   ra   r   r1   r   rF   r   r   r   rZ   r   r_   r   r`   r   r]   r   r^   r   r\   r"   )r9   r   r   reasonx_linewith_transcriptswith_captionss          r(   render_source_statusr     s    E	LL	LL  /0C0C/DEF	~c&--&8%9BC	D	D!57GH4VH=> ~~*6>>*:;<	S]O62## 8 899KLLFV	:	:2NO/x89 01E1E0FGH	c&..ccs6>>':&;9EUDVVhij /0C0C/DEF	\v}}\\~c&--&8%9=/Q`ab 263I3I2JKL			_v'7'7__(V-=-=)>(?xVefg )&*A*A)BCD			z#f&7&7"8!9BC 1&2I2I1JKL			)#f.?.?*@)AJK ,V-=-=,>?@	{3vzz?"36:;!24RS{6(+,	LL99Ur*   c                    g }|j                  d| j                   d       |j                  d       |j                  d| j                  dd  d| j                   d       |j                  d       |j                  d	       |j                  d       g }| j                  dd
 D ]5  }|j                  |j
                  d|j                  |j                  f       7 | j                  dd
 D ];  }|j                  |j
                  d|j                  dd dz   |j                  f       = | j                  dd
 D ];  }|j                  |j
                  d|j                  dd dz   |j                  f       = | j                  dd
 D ];  }|j                  |j
                  d|j                  dd dz   |j                  f       = | j                  dd
 D ];  }|j                  |j
                  d|j                  dd dz   |j                  f       = | j                  dd
 D ];  }|j                  |j
                  d|j                  dd dz   |j                  f       = | j                   dd
 D ];  }|j                  |j
                  d|j                  dd dz   |j                  f       = |j#                  d        |dd D ]  \  }}}}|j                  d| d|          |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       dj%                  |      S )zzRender reusable context snippet.

    Args:
        report: Report data

    Returns:
        Context markdown string
    z# Context: z (Last 30 Days)r   z*Generated: Nry   z | Sources: rx   z## Key SourcesrR   r   r   2   r{   r   r   r   r   r   c                     | d    S )Nr   r   )rF   s    r(   <lambda>z(render_context_snippet.<locals>.<lambda>?  s    !A$ r*   )key   z- [z] z
## SummaryzH*See full report for best practices, prompt pack, and detailed sources.*r   )r   r   generated_atr   r[   r   r   r   rF   r   r_   r`   r]   r   r^   r   r\   sortr"   )r9   r   	all_itemsr$   r   sourcer   r   s           r(   render_context_snippetr     s     E	LL;v||nO<=	LL	LL< 3 3CR 89fkk]RSTU	LL 
LL!"	LLIbq! G$**h

DHHEFG! N$**c499Sb>E+A488LMNbq! S$**h		#20FQRS  !$ V$**k499Sb>E3I488TUV!!"1% S$**dDJJsOe,CT[[QRS!!"1% [$**lDMM#24F4NPTPXPXYZ[

2A Q$**eTZZ_u-DdhhOPQ NNN'$-bqM - vtSs6("TF+,- 
LL	LL	LL	LL[\	LL99Ur*   c           
         g }|j                  d| j                   d       |j                  d       |j                  d| j                          |j                  d| j                   d| j                          |j                  d| j
                          |j                  d       |j                  d       |j                  d       | j                  r|j                  d	| j                          | j                  r|j                  d
| j                          |j                  d       | j                  r|j                  d       |j                  d       | j                  D ]Z  }|j                  d|j                   d|j                          |j                  d       |j                  d|j                          |j                  d|j                          |j                  d|j                  xs d d|j                   d       |j                  d|j                   d       |j                  d|j                           |j"                  r@|j"                  }|j                  d|j                  xs d d|j$                  xs d d       |j&                  r|j&                  d   j                  dk\  r|j&                  d   }|j(                  dd }t+        |j(                        dkD  r|j-                         dz   }|j                  d       |j                  d |j                   d!|j.                   d"       |j                  d#|        |j0                  rG|j                  d       |j                  d$       |j0                  D ]  }|j                  d%|         |j                  d       ] | j2                  r|j                  d&       |j                  d       | j2                  D ]V  }|j                  d|j                   d'|j4                          |j                  d       |j                  d|j                          |j                  d|j                  xs d d|j                   d       |j                  d|j                   d       |j                  d|j                           |j"                  r@|j"                  }|j                  d|j6                  xs d d(|j8                  xs d d)       |j                  d       |j                  d#|j:                          |j                  d       Y | j<                  r|j                  d*       |j                  d       | j<                  D ]  }|j                  d|j                   d'|j>                          |j                  d       |j                  d|j                          |j                  d|j                  xs d        |j                  d|j                   d       |j                  d|j                           |j"                  rQ|j"                  }|j                  d|j@                  xs d d+|j6                  xs d d(|j$                  xs d d       |jB                  r7|j                  d,d-jE                  d. |jB                  dd D                      |j                  d       |j                  d#|j:                  dd/         |j                  d        | jF                  r|j                  d0       |j                  d       | jF                  D ]  }|j                  d|j                   d'|j>                          |j                  d       |j                  d|j                          |j                  d|j                  xs d        |j                  d|j                   d       |j                  d|j                           |j"                  rQ|j"                  }|j                  d|j@                  xs d d+|j6                  xs d d(|j$                  xs d d       |jB                  r7|j                  d,d-jE                  d1 |jB                  dd D                      |j                  d       |j                  d#|j:                  dd/         |j                  d        | jH                  r|j                  d2       |j                  d       | jH                  D ]  }|j                  d|j                   d|j                          |j                  d       |j                  d3|j.                          |j                  d4|jJ                          |j                  r|j                  d5|j                          |j                  d|j                  xs d        |j                  d|j                   d       |j                  d|j                           |j"                  r@|j"                  }|j                  d|j                  xs d d|j$                  xs d d       |j0                  rG|j                  d       |j                  d$       |j0                  D ]  }|j                  d%|         |j                  d        | jL                  r|j                  d6       |j                  d       | jL                  D ]  }|j                  d|j                   d|jN                          |j                  d       |j                  d7|j                          |j                  d|j                          |j                  d|j                  xs d        |j                  d|j                   d       |jP                  rK|jP                  D cg c]  \  }}| d|d8z  d9d: }	}}|j                  d;d<jE                  |	              |jR                  r|j                  d=|jR                          |j"                  rA|j"                  }|j                  d>|jT                  xs dd?d@|jV                  xs dd?       |j                  d        | jX                  rZ|j                  dA       |j                  d       | jX                  D ](  }|j                  d|j                   d|j                          |j                  d       |j                  dB|jZ                          |j                  d|j                          |j                  d|j                  xs d d|j                   d       |j                  d|j                   d       |j                  d|j                           |j                  d       |j                  d#|j\                          |j                  d       + |j                  dC       |j                  d       |j                  dD       |j                  d       |j                  dE       |j                  d       |j                  dD       |j                  d       dFjE                  |      S c c}}w )GzsRender full markdown report.

    Args:
        report: Report data

    Returns:
        Full report markdown
    z# z - Last 30 Days Research Reportr   z**Generated:** rn   rj   ro   z## Models Usedz- **OpenAI:** z- **xAI:** z## Reddit Threadsz### r   z- **Subreddit:** r/z- **URL:** z- **Date:** Unknownz (confidence: rv   z- **Score:** z/100z- **Relevance:** z- **Engagement:** ?z	 points, z	 commentsr   ry   Nrz   r{   u   **💬 Top Comment** (z upvotes, u/z):z> z**Key Insights from Comments:**z- z
## X Postsz: @z likes, z repostsz## TikTok Videosz views, z- **Hashtags:** r   c              3   &   K   | ]	  }d |z     ywr   r   r   s     r(   rB   z%render_full_report.<locals>.<genexpr>       8]Qq8]r   i,  z## Instagram Reelsc              3   &   K   | ]	  }d |z     ywr   r   r   s     r(   rB   z%render_full_report.<locals>.<genexpr>  r   r   z## Hacker News Storiesz- **Author:** z- **HN URL:** z- **Article URL:** z"## Prediction Markets (Polymarket)z- **Event:** r   r   r   z- **Outcomes:** r   z- **Trend:** z- **Volume:** $z,.0fz | Liquidity: $z## Web Resultsz- **Source:** z## Best Practicesz *To be synthesized by assistant*z## Prompt Packr   )/r   r   r   r?   r   r   r   r   r[   r   r   r   r   r>   r   r   r   r   r   r   r   ra   r   r   r   rF   r   r   r   r   r_   r   r   r   r"   r`   r]   r   r^   r   r   r   r   r   r\   r   r   )
r9   r   r$   r   r   r   r   r   r   r   s
             r(   render_full_reportr   L  s    E 
LL2fll^#BCD	LL	LL?6#6#6"789	LL#F$5$5#6d6??:KLM	LL:fkk]+,	LL 
LL!"	LL~f&>&>%?@A{6#8#8"9:;	LL }}()RMM 	DLL4y4::,78LLLL.t~~.>?@LL;txxj12LL<		(>Y'?~dNbNbMccdefLL=D9:LL,T->->,?@Aoo1#))2Bs1C9SM]M]MdadLeenop  T%6%6q%9%?%?2%E&&q)**Tc*rzz?S(%nn.6GR ;BHH:\RTR[R[Q\\^_`r'^,$$R >?#44 1GLL2gY01 LL9	> xx\"RHH 	DLL4yD,>,>+?@ALLLL;txxj12LL<		(>Y'?~dNbNbMccdefLL=D9:LL,T->->,?@Aoo1#))2Bs1C8CKKL^[^K__ghiLLLL2dii[)*LL	" }}'(RMM 	DLL4yD,<,<+=>?LLLL;txxj12LL<		(>Y'?@ALL=D9:LL,T->->,?@Aoo1#))2Bs1C8CIIL\Y\K]]efifvfvf}z}e~  H  I  J}}/8]$--X[Y[J\8]0]/^_`LLLL2diio./0LL#	( )*R$$ 	DLL4yD,<,<+=>?LLLL;txxj12LL<		(>Y'?@ALL=D9:LL,T->->,?@Aoo1#))2Bs1C8CIIL\Y\K]]efifvfvf}z}e~  H  I  J}}/8]$--X[Y[J\8]0]/^_`LLLL2diio./0LL#	( -.R%% 	DLL4y4::,78LLLL>$++78LL>$++78xx2488*=>LL<		(>Y'?@ALL=D9:LL,T->->,?@Aoo1#))2Bs1C9SM]M]MdadLeenop$$R >?#44 1GLL2gY01 LL+	0 9:R%% 	DLL4y4==/:;LLLL=56LL;txxj12LL<		(>Y'?@ALL=D9:""KOK^K^_KD%tfBuSyoQ7__/

80D/EFG""}T-@-@,ABCooszzQt.DOTWTaTaTfefgkSlmnLL#	( zz%&RJJ 
	DLL4y4::,78LLLL>$*<*<)=>?LL;txxj12LL<		(>Y'?~dNbNbMccdefLL=D9:LL,T->->,?@ALLLL2dll^,-LL
	 
LL$%	LL	LL34	LL	LL!"	LL	LL34	LL99UK `s   "{)
raw_openairaw_xairaw_reddit_enrichedc                 L   t                t        t        dz  d      5 }t        j                  | j                         |d       ddd       t        t        dz  d      5 }|j                  t        |              ddd       t        t        dz  d      5 }|j                  t        |              ddd       |r4t        t        dz  d      5 }t        j                  ||d       ddd       |r4t        t        d	z  d      5 }t        j                  ||d       ddd       |r5t        t        d
z  d      5 }t        j                  ||d       ddd       yy# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   rxY w# 1 sw Y   yxY w)zWrite all output files.

    Args:
        report: Report data
        raw_openai: Raw OpenAI API response
        raw_xai: Raw xAI API response
        raw_reddit_enriched: Raw enriched Reddit thread data
    zreport.jsonrH      )indentNz	report.mdlast30days.context.mdzraw_openai.jsonzraw_xai.jsonz raw_reddit_threads_enriched.json)	r8   openr2   jsondumpto_dictwriter   r   )r9   r   r   r   fs        r(   write_outputsr    s|     
j=(#	. 1!		&.."Aa01 
j;&	, ,	"6*+, 
j22C	8 0A	&v./0 *00#6 	/!IIj!A.	/ *~-s3 	,qIIgq+	, *AA3G 	81II)1Q7	8 	8 )1 1, ,0 0
	/ 	/	, 	,	8 	8sG   'E E*E6FF:FE'*E36E?FFF#c                  &    t        t        dz        S )zGet path to context file.r  )strr2   r   r*   r(   get_context_pathr  H  s    z3344r*   )   rq   )N)NNN)__doc__r  r/   r5   pathlibr   typingr   r   r   homer2   r
  r)   r8   Reportdictrf   intr   r   r   r   listr  r  r   r*   r(   <module>r     s6   ,  	    TYY[8#g-<uD
s 866== T 2j6== j j jZ] jZ[ [T [S [|-6== -S -`Mv}} M Mh "&"*.	'8MM'8'8 d^'8 "$	'8T5# 5r*   