
    p"jN                        d Z ddlmZ ddlZddlmZ dZdZdZ ej	        dej
                  Zd	Zd
ZdZdZdZdZdZddZddZd dZd!dZdS )"zHeuristic retention scoring for short-form ideas.

The goal is not to predict virality perfectly. The goal is to reject obvious
scroll-past drafts before rendering: slow intros, generic advice, static visuals,
and weak payoffs.
    )annotationsN)Any)youyourdudeindeinedich)	zdo thismachbeforebevorwhywarumnotnichtinstead)tipstippshabitsroutinesproductivity
motivationmindsetzS\b(\d+|one|two|three|first|last|minute|minutes|sekunden|minute|tabs|tiktok|ki|ai)\b)zin this videozin diesem videoztoday i willzheute werde ichzi will talkzwe will discuss)
zpattern interruptzbefore/aftermessytimercaptionszscreen recordingcardszclose-upschnellecut)comment	kommentarwriteschreibreplyantwortstartreset)screentextsmspopuplogininvoicepaymentbrowsercardchatshopcaptcha)	zred flagtrapriskdangerfakescamstealpressureurgent)
closeblockzopen the officialverifycontactchangeremovezdo notzdon'tstop)z!what do i do if i already clickedzwhat do i check before actingzwhat should i avoidr)   strmarkerstuple[str, ...]returnboolc                b    |                                  t          fd|D                       S )Nc              3      K   | ]}|v V  	d S N ).0markerlowers     N/home/agent/jarvis_runtime/autoshortsbot/AutoShortsBot/autoshorts/retention.py	<genexpr>z _contains_any.<locals>.<genexpr>2   s'      556v555555    )rN   any)r)   rD   rN   s     @rO   _contains_anyrS   0   s3    JJLLE5555W555555rQ   hookdict[str, Any]c                H   g }g }d}|                                  t          t                    r|dz  }|                    d           t          t                    r|dz  }|                    d           t
                              |           r|dz  }|                    d           t          fddD                       r|dz  }|                    d	           t          | 	                                          d
k    r|dz  }|                    d           t          t                    r|dz  }|                    d           |                     d          r|s|dz  }|                    d           t          dt          |d                    ||dS )z0Score a hook for first-second retention signals.      direct_address   	open_loopspecificityc              3      K   | ]}|v V  	d S rJ   rK   )rL   tokenrN   s     rO   rP   zscore_hook.<locals>.<genexpr>E   s'      
\
\e5E>
\
\
\
\
\
\rQ   )r   r   withoutohnerB   stopptension   
short_hook   
slow_intro.flat_statementr   
   scoresignalsrisks)rN   rS   DIRECT_ADDRESSappend	OPEN_LOOPSPECIFIC_MARKERSsearchrR   lensplitSLOW_INTRO_MARKERSendswithmaxmin)rT   rl   rm   rk   rN   s       @rO   
score_hookry   5   s   GEEJJLLEUN++ )
'(((UI&& $
{###t$$ &
}%%%

\
\
\
\'[
\
\
\\\ "
y!!!
4::<<B
|$$$U.// #
\"""}}S '' '
%&&&CrNN++%PPPrQ   ideac                   t          t          |                     dd                              }|d         }t          |d                   }t          |d                   }t	          |                     dd                    }t          |                     dd                    }t          |                     d	d                    }t          |                     d
d                    }| d|                                 d|cxk    rdk    rn n|dz  }|                    d           nFd|cxk    rdk    rn n|                    d           n |dk    r|dz  }|                    d           t          |t                    r|dz  }|                    d           nFd|                                v sd|                                v r|dz  }|                    d           t          fdt          D                       }	t          fddD                       }
|	dk    r!|
dk    r|dz  }|                    d           n|
r|dz  }|                    d           t          |t                    r|dz  }|                    d           t          dt          |d                     t          t          |                    t          t          |                    d!S )"z@Score an idea using hook, pacing, visual energy, value, and CTA.rT    rk   rm   rl   duration_secondsr   visual_conceptscript_outlinecta    -   rX   growth_duration<   K   monetization_durationZ   rZ   too_long_for_unproven_formatvisual_energystatic	slideshowstatic_visualsc              3  $   K   | ]
}|v d V  dS rX   NrK   rL   termcombined_values     rO   rP   z'score_idea_retention.<locals>.<genexpr>r   s-      NNdt~7M7M7M7M7M7MNNrQ   c              3  $   K   | ]
}|v d V  dS r   rK   r   s     rO   rP   z'score_idea_retention.<locals>.<genexpr>s   s:        >!! 	
!!!! rQ   )	exampletemplater   calendarpromptr   afterz
two-minutez2-minutegeneric_valueconcrete_payoffcomment_triggerri   rj   )ry   rC   getlistintrN   ro   rS   VISUAL_ENERGY_MARKERSsumGENERIC_TERMSCOMMENT_CTA_MARKERSrw   rx   sortedset)rz   hook_resultrk   rm   rl   durationvisualoutliner   generic_countconcrete_markersr   s              @rO   score_idea_retentionr   U   s   S&"!5!56677K EW%&&E;y)**G488.2233H*B//00F$((+R0011G
dhhub!!
"
"C**&**0022N	X
())))	x				2					.////	B
3444V233 '
''''	V\\^^	#	#{fllnn'D'D
%&&&NNNNmNNNNNM    w    
 .!33
_%%%%	 *
()))S-.. *
())) QE2''#g,,''E

##  rQ   	candidatec                   t          |                     d          p+|                     d          p|                     d          pd          }t          |                     d          pd          }|                     d          p|                     d          pg }|                     d          p|                     d	          pg }|                     d
          pg }t          |t                     r|g}t          |t                     r|g}t          |t                     r|g}g }|                                |                                }t	          t
                    o/t	          t                    ot          fddD                       }|s|                    d           d|v pt	          |d          }	|	s|                    d           t          d |D                       dk    r|                    d           t          d |D                       dk    s:t	          d
                    |                                          t                    s|                    d           d
                    d |D                       t          fdt          D                       }
|
s|                    d           | |||	d|vd|v|
dg ddddS )zHard retention gates for TrueTraceShorts scam red-flag videos.

    Expected candidate keys are intentionally simple so render scripts, review packages,
    and future V2 candidates can all call this without side effects.
    first_frame_descriptionvisibleScreenr~   r|   rT   	red_flagsredFlagsafer_moves	saferMovewebsite_companion_questionsc              3      K   | ]}|v V  	d S rJ   rK   )rL   r   first_frame_lowers     rO   rP   z0evaluate_red_flag_video_gates.<locals>.<genexpr>   sA        K  Kd))  K  K  K  K  K  KrQ   )moneypasswordr0   accountr,   r.   
permissioncodesone_second_recognition_gate?)whatr   r   alreadymistaker4   open_loop_gatec                T    g | ]%}t          |                                          #|&S rK   rC   striprL   items     rO   
<listcomp>z1evaluate_red_flag_video_gates.<locals>.<listcomp>   s-    <<<T#d))//*;*;<D<<<rQ   rX   one_red_flag_gatec                T    g | ]%}t          |                                          #|&S rK   r   r   s     rO   r   z1evaluate_red_flag_video_gates.<locals>.<listcomp>   s-    >>>TCIIOO,=,=>D>>>rQ   r   one_safer_move_gatec              3  X   K   | ]%}t          |                                          V  &d S rJ   )rC   rN   r   s     rO   rP   z0evaluate_red_flag_video_gates.<locals>.<genexpr>   s2      PPDc$iioo//PPPPPPrQ   c              3      K   | ]}|v V  	d S rJ   rK   )rL   questioncompanion_texts     rO   rP   z0evaluate_red_flag_video_gates.<locals>.<genexpr>   s(      aa(n4aaaaaarQ   website_companion_value_gate)one_second_recognitionr[   one_red_flagone_safer_movewebsite_companion_value)z0-2s visible screen + hookz2-8s why it feels normalz8-16s one red flagz16-30s safer movez(30-45s memorable rule + website/help CTAz345-75s allowed when the viewer needs recovery steps)scam_red_flagrecovery_topic)allowedfailuresgatesrequired_structure)rC   r   
isinstancerN   rS   SCREEN_MARKERSDANGER_MARKERSrR   ro   rs   joinSAFER_MOVE_MARKERSWEBSITE_COMPANION_QUESTIONS)r   first_framerT   r   r   companion_questionsr   
hook_lowerr   r[   companion_valuer   r   s              @@rO   evaluate_red_flag_video_gatesr      s~    imm$=>>  J)--P_B`B`  Jdmdqdq  sC  eD  eD  J  HJ  K  KKy}}V$$*++Dk**LimmI.F.FL"I--..R)--2L2LRPRK#--(EFFL")S!!  K	+s## $"m%s++ 423H#))++J 	'88 	K+^<<	K  K  K  K  K  7J  K  K  K  K  K 
 " 75666tq}Z9pqqI *()))
<<Y<<<==BB+,,,
>>[>>>??1DDMZ]ZbZbcnZoZoZuZuZwZw  zL  MM  MMD-...XXPP<OPPPPPNaaaaE`aaaaaO 86777  <&<"/x?38C'6
 
 o  o  oS
 
  rQ   )r)   rC   rD   rE   rF   rG   )rT   rC   rF   rU   )rz   rU   rF   rU   )r   rU   rF   rU   )__doc__
__future__r   retypingr   rn   rp   r   compileIrq   ru   r   r   r   r   r   r   rS   ry   r   r   rK   rQ   rO   <module>r      s     # " " " " " 				      ?]	`2:tvxvz{{    i  Af A  6 6 6 6
Q Q Q Q@2 2 2 2j< < < < < <rQ   