
    8ji,                     (   S SK r S SKrS SKrS SKJr  S SKJrJrJr  S SK	J
r
Jr  S SKJrJr  S SKJr  S SKJr  S SKJr  S SKJrJrJrJr  S S	KJr  S S
KJr  S SKJ r   \" \!5      RD                  RD                  r#\#S-  S-  S-  r$\#S-  S-  S-  r%\%RM                  SSS9  \ RN                  RQ                  SS5      r)\)(       dk   \*" \#S-  S-  S5       r+\+ HL  r,\,R[                  S5      (       d  M  \,R]                  S5      S   R_                  5       R_                  S5      r)MN     SSS5        \)(       a  \Rb                  " \)S9  \" SSS9r2 " S S \
5      r3 " S! S"\
5      r4 " S# S$\
5      r5 " S% S&\
5      r6 " S' S(\
5      r7S)\8S*\8S+\84S, jr9S-\8S+\84S. jr:S-\8S+\84S/ jr;S0\8S1\8S*\8S+\84S2 jr<S3\34S4 jr=\2R}                  S55      S3\3S6\4S7 j5       r?\@S8:X  a   S SKArA\B" S95        \AR                  " S:S;S<SS=9  gg! , (       d  f       N= f! \0 a     Nf = f)>    N)Path)FastAPIHTTPExceptionBackgroundTasks)	BaseModelField)ListOptional)BeautifulSoup)deploy_to_netlify)get_supabase_clientprovision_tenantSUPABASE_URLSUPABASE_ANON_KEY)spawn_telnyx_assistant)generate_3d_icon)visual_polish_loopSunaivawebsite_factory	templatesgenerated_sitesT)parentsexist_okGEMINI_API_KEY configzsecrets.envrzGEMINI_API_KEY==   z"')api_keyz%AgileAdapt Website Generation Factoryz2.0.0)titleversionc                   4    \ rS rSr% \\S'   \\S'   \\S'   Srg)ProspectIntakeRequest*   business_nametranscript_summarytarget_audience N__name__
__module____qualname____firstlineno__str__annotations____static_attributes__r)       9e:\genesis-system\scripts\website_factory_orchestrator.pyr$   r$   *   s    r2   r$   c                   T    \ rS rSr% \\S'   \\   \S'   \\S'   \\S'   \\   \S'   Srg)	ResearchOutput/   r&   core_servicesbrand_archetyper(   customer_objectionsr)   Nr+   r,   r-   r.   r/   r0   r	   r1   r)   r2   r3   r5   r5   /   s(    9c"r2   r5   c                   t    \ rS rSr% \\S'   \\S'   \\   \S'   \\   \S'   \\   \S'   \\   \S'   \\S'   S	rg
)CopywriterOutput6   hero_headlinehero_subheadlineservice_titlesservice_descriptionsfaq_questionsfaq_answerscall_to_actionr)   Nr:   r)   r2   r3   r<   r<   6   s<    Is)#9cr2   r<   c                   :    \ rS rSr% \\S'   \\S'   \\   \S'   Srg)DesignerOutput?   primary_color_hexbackground_gradient_classlucide_iconsr)   Nr:   r)   r2   r3   rF   rF   ?   s    ""s)r2   rF   c                   *    \ rS rSr% \\S'   \\S'   Srg)AssemblyOutputD   
custom_csscontentr)   Nr*   r)   r2   r3   rL   rL   D   s    OLr2   rL   
transcriptbiz_namereturnc                    #    [         R                  " S5      nSU SU  S3nUR                  U[         R                  R	                  SS9S9I Sh  vN nUR
                  $  N7f)	z8Agent 1: Distills raw conversation into structured JSON.gemini-2.5-flashz$Analyze this transcript/summary for z: zx. Extract the core services, the brand vibe/archetype, audience, and any customer objections mentioned into strict JSON.application/jsonresponse_mime_typegeneration_configNgenaiGenerativeModelgenerate_content_asynctypesGenerationConfigtext)rP   rQ   modelpromptresponses        r3   run_researcherrd   L   sv     !!"45E3H:R
|  LD  EF11++66J\6] 2  H ==	s   AA#A!A#research_jsonc                    #    [         R                  " S5      nSU  S3nUR                  U[         R                  R	                  SS9S9I Sh  vN nUR
                  $  N7f)z9Agent 2: Writes high-converting copy handling objections.gemini-3.1-pro-previewzAYou are a direct response copywriter. Given this business brief: z. Write high-converting English copy for a single page website. Write an FAQ that explicitly resolves the customer objections. Return strict JSON.rU   rV   rX   NrZ   re   ra   rb   rc   s       r3   run_copywriterri   W   sr     !!":;EPQ^P_  `r  sF11++66J\6] 2  H ==	   AA AA c                    #    [         R                  " S5      nSU  S3nUR                  U[         R                  R	                  SS9S9I Sh  vN nUR
                  $  N7f)z"Agent 3: Selects aesthetic tokens.rT   zGiven this business profile: z. Select a modern Tailwind background gradient, a primary hex color for glowing elements, and 3 specific Lucide icon names relevant to the services. Return strict JSON.rU   rV   rX   NrZ   rh   s       r3   run_designerrl   b   so     !!"45E,]O  <d  eF11++66J\6] 2  H ==	rj   	copy_jsondesign_jsonc                    #    [         R                  " S5      nSU SU SU  S3nUR                  U[         R                  R	                  SS9S9I S	h  vN nUR
                  $  N7f)
zAgent 4: The Build Engine.rg   zQYou are the Master Web Architect.
    Assemble the final HTML <body> content for zl. Use Glassmorphism UI (backdrop-filter: blur(16px), subtle borders).
    Use these exact aesthetic tokens: z.
    Use this exact copy: a  .
    MUST USE Lucide icons: `<i data-lucide="icon-name"></i>`.
    CRITICAL: You MUST embed the following brand logo image tag prominently in the hero section or top-left nav: `<img src="{logo_url}" alt="Brand Icon" class="w-32 h-32 rounded-3xl shadow-2xl glass-panel" />` (Customize classes as needed but use that exact src string).
    Return strictly JSON with strictly two keys: 'custom_css' and 'content' (which contains all the HTML).rU   rV   rX   NrZ   )rm   rn   rQ   ra   rb   rc   s         r3   run_architectrp   m   s     !!":;E008z :''2m 4# %knF 11++66J\6] 2  H ==	s   AA&A$A&requestc                 
  #    [        SU R                   S35        [        U R                  U R                  5      I S h  vN n[        SU R                   S35        0 n [        R
                  " U5      nUR                  SS5      nUR                  SS5      n[        R                  " [        U5      5      n[        R                  " [        U5      5      n[        R                  " [        U R                  X45      5      n[        R                  " [        U R                  U5      5      n[        R                  " XVXx5      I S h  vN u  pp[        SU R                   S35        [        XU R                  5      I S h  vN n[        SU R                   S	35         [        R
                  " U5      nUR                  S
S5      nUR                  SS5      n[#        [$        S-  SSS9 nUR'                  5       nS S S 5        U(       a  SU;  a  SU S3nWR)                  SU R                  5      nUR)                  SU5      nUR)                  SU5      nSS Kn[-        UR/                  5       5      nUR)                  SU5      nUR)                  S[0        =(       d    S5      nUR)                  S[2        =(       d    S5      nUR)                  SU5      nUR)                  SU5      n [5        US 5      n[-        U5      n[        SU R                   S!35        [        SU R                   S#35        [7        US$S%S&9I S h  vN n[        SU R                   S'35        SR9                  U R                   Vs/ s H1  nUR;                  5       (       d  UR=                  5       (       d  M/  UPM3     sn5      R?                  5       n[@        U S(3-  n[#        US)SS9 nURC                  U5        S S S 5        [        SU R                   S*U 35        S+U 3n[E        UUS,9I S h  vN n[G        5       nU(       aZ   URI                  S-5      RK                  UU R                  UUUS..5      RM                  5         [        SU R                   S/35        U$ U$  GNU! [         a     GN.f = f GNb GN+! [        R                    a    [        S5        UnSn GNf = f! , (       d  f       GN= f! [         a&  n[        SU R                   S"U 35         S nAGNS nAff = f GNs  snf ! , (       d  f       GN?= f GN! [         a&  n[        SU R                   S0U 35         S nAU$ S nAff = f7f)1N[z#] Initiating Zero-Touch Pipeline...z] Research Extracted.
core_offerzgeneral servicesr8   professionalz7] Copy, Aesthetics, Voice Agent, and 3D Logo generated.z] Final DOM Assembled.rN   r   rO   z2Architect JSON parsing failed. Executing fallback.zbase_glassmorphism.htmlr   zutf-8)encodingz<style>z<style>
z	
</style>z{{business_name}}z{{custom_css}}z{{content}}r   z{{tenant_id}}z{{supabase_url}}SUPERBASE_URL_MISSINGz{{supabase_anon_key}}SUPABASE_ANON_MISSINGz{{telnyx_assistant_id}}z{{logo_url}}zhtml.parserz5] AST Self-Healing complete. DOM structure validated.z] AST parsing failed: z%] Initiating Design Critic (AIVPL)...   Z   )max_iterationstarget_scorez0] AIVPL Phase Complete. Final Aesthetics locked.z.htmlwz0] [SUCCESS] Production Build Complete! Saved to zagile-adapt-)html_contentproject_nametenants)idr&   	subdomaintelnyx_assistant_idhtml_payloadu0   ] 🔒 Database tenant row provisioned securely.z] Supabase provision failed: )'printr&   rd   r'   jsonloads	Exceptiongetasynciocreate_taskri   rl   r   r   gatherrp   JSONDecodeErroropenTEMPLATES_DIRreadreplaceuuidr/   uuid4r   r   r   r   joinisalphaisdigitlower
OUTPUT_DIRwriter   r   tableinsertexecute)rq   re   rs_datart   target_archcopywriter_taskdesigner_tasktelnyx_task	logo_taskrm   rn   assistant_idlogo_url
final_json
final_datarN   body_contentftemplate
final_htmlr   	tenant_idsoupec	safe_nameoutput_pathproject_slug
deploy_url	sb_clients                                 r3   execute_p1_pipeliner      s    	Ag##$$G
HI ))C)CWEZEZ[[M	Ag##$$9
:; G**]+ \+=>J++/@K)).*GHO''](CDM%%&<W=R=RT^&lmK##$4W5J5JJ$WXI;B>>/ju  <B  6B2IL	Ag##$$[
\] %YW=R=RSSJ	Ag##$$:
;<ZZ
+
^^L"5
!~~i4 
m77w	OST668 
P iz1 J7
!!"5w7L7LMJ##$4jAJ##M<@J DJJL!I##OY?J##$68_H_`J##$;=N=iRijJ##$=|LJ##NH=JDZ7Y
'''((]^_
 
Ag##$$I
JK)*QUWXXJ	Ag##$$T
UV G$9$9X$9qQYY[[AIIK$9XY__aI)E22K	k3	1Q	
 
2 
Ag##$$TU`Ta
bc ")-L(j|\\J $%I

	OOOI&--!(!6!6)'3 */  wyAg++,,bcd :I \   6B T  BC!
 
P	O2  D'''((>qcBCCD
 Y Y 
2	1 ]$  	OAg++,,I!MNN	Os-  =U-R U- R 6CU-R(9U- R+U-:R. U-+S<C,U-)0S* 'U- T6U-7.T )T /,U-T%-5U-"T7#U-9AT: U-
R%!U-$R%%U-+U-.#SU-SU-
S'"U-*
T4TU-TU- U-%
T4/	U-:
U*U%U-%U**U-z/api/generatebackground_tasksc                    #    [         (       d
  [        SSS9eUR                  [        U 5        SSU R                   S3SS.$ 7f)	zi
Webhook target for Telnyx AI Assistant.
Accepts conversational summary and triggers the async pipeline.
i  zGemini API Key missing.)status_codedetailzEngine InitializedzPipeline started for z. ETA to live URL: 60s.pending_generation)statusmessager   )r   r   add_taskr   r&   )rq   r   s     r3   trigger_factoryr      sS      >4MNN 17; '*7+@+@*AAXY) s   A A__main__u6   
🚀 AgileAdapt Factory API Starting on Port 8000...
z website_factory_orchestrator:appz0.0.0.0i@  )hostportreload)Dosr   r   pathlibr   fastapir   r   r   pydanticr   r   typingr	   r
   bs4r   google.generativeaigenerativeair[   netlify_deployerr   supabase_clientr   r   r   r   telnyx_clientr   image_generate_clientr   visual_polish_agentr   __file__parentBASE_DIRr   r   mkdirenvironr   r   r   r   line
startswithsplitstripr   	configureappr$   r5   r<   rF   rL   r/   rd   ri   rl   rp   r   postr   r+   uvicornr   runr)   r2   r3   <module>r      sG   	    ; ; % !  # . b b 0 2 2 >  ''9$'88;F	!$558II
 
    -  0"5(X%5s;q??#455%)ZZ_Q%7%=%=%?%E%Ee%LN  < 	OON+;WM
I 
#Y #y Y 
Y 	S 	C 	C 		 	 		c 	c 	3 S C C (h'< hV /#8 O  " z	
DEKK2VZ[ G <;  s6   H G705G7%H 7
HH H HH