§
    5=Êj¢  ã                   ó@  — d Z ddlZddlmZ ddlmZmZmZ ddlm	Z	m
Z
mZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZmZmZmZmZmZmZ  ee¦  «                             ¦   «         j        j        j        Z ee¦  «                             ¦   «         j        dz  Z edz  Z!edz  Z"edz  Z#edz  Z$ eddd¬¦  «        Z%e% &                    edgddgdg¬¦  «         e  '                    dd¬¦  «         e% (                    d e e)e ¦  «        ¬¦  «        d¬¦  «         e! *                    ¦   «         rVe% (                    d e e)e!¦  «        ¬¦  «        d¬¦  «         e% (                    d e e)e!¦  «        ¬¦  «        d¬¦  «         e" *                    ¦   «         r+e% (                    d e e)e"¦  «        ¬¦  «        d ¬¦  «         e# *                    ¦   «         rVe% (                    d! e e)e#¦  «        ¬¦  «        d"¬¦  «         e% (                    d# e e)e#¦  «        ¬¦  «        d$¬¦  «         ed%z  Z+e+ *                    ¦   «         r+e% (                    d& e e)e+¦  «        ¬¦  «        d%¬¦  «         ed'z  d(z  Z,e, *                    ¦   «         r+e% (                    d) e e)e,¦  «        ¬¦  «        d(¬¦  «          G d*„ d+e¦  «        Z-e% .                    d,e	¬-¦  «        e% /                    d,e	¬-¦  «        d.„ ¦   «         ¦   «         Z0e% .                    d/e	¬-¦  «        d0„ ¦   «         Z1e% .                    d1¦  «        d2„ ¦   «         Z2e% .                    d3¦  «        d4„ ¦   «         Z3e% .                    d5¦  «        d6„ ¦   «         Z4e% .                    d7¦  «        d8„ ¦   «         Z5e% .                    d9¦  «        d:e)fd;„¦   «         Z6e% .                    d<¦  «        d=„ ¦   «         Z7e% 8                    d<¦  «        d>e-fd?„¦   «         Z9e:d@k    rddl;Z; e;j<        dAdBdCdD¬E¦  «         dS dS )Fz†
FastAPI Server for Historical-2d Studio Review Dashboard.
Listens on port 1516 across all interfaces (0.0.0.0) for Tailscale access.
é    N)ÚPath)ÚFastAPIÚHTTPExceptionÚRequest)ÚHTMLResponseÚJSONResponseÚFileResponse)ÚStaticFiles)ÚCORSMiddleware)Ú	BaseModel)ÚOptional)Úget_system_statusÚget_intro_scenesÚget_episodes_listÚget_ep01_detailÚget_documentÚget_feedback_listÚsave_feedbackÚstaticÚoutputÚepisodesÚassetsÚdataz%Historical-2d Studio Review DashboardzCInteractive Executive Review System for Seven Nguyen over Tailscalez2026.1)ÚtitleÚdescriptionÚversionÚ*T)Úallow_originsÚallow_credentialsÚallow_methodsÚallow_headers)ÚparentsÚexist_okz/static)Ú	directory)Únamez/outputÚoutput_directz/media/outputÚoutput_mediaz/media/episodesÚepisodes_mediaz/assetsÚassets_directz/media/assetsÚassets_mediaÚnode_modulesz/node_modulesÚsrcÚwebgl_enginez/src/webgl_enginec                   ób   — e Zd ZU dZee         ed<   eed<   eed<   eed<   dZee         ed<   dS )ÚFeedbackPayloadúSeven NguyenÚauthorÚverdictÚcategoryÚcommentNÚ	timestamp)Ú__name__Ú
__module__Ú__qualname__r1   r   ÚstrÚ__annotations__r5   © ó    ú2C:\Projects\Historical 2d\src\web_review\server.pyr/   r/   E   sU   € € € € € € Ø*€FˆH�SŒMÐ*Ð*Ñ*Ø€L€L�LØ€M€M�MØ€L€L�LØ#€Iˆx˜Œ}Ð#Ð#Ñ#Ð#Ð#r<   r/   ú/)Úresponse_classc               ƒ   óü   K  — t           dz  } |                      ¦   «         st          d¦  «        S t          | dd¬¦  «        5 }t          |                     ¦   «         ¬¦  «        cd d d ¦  «         S # 1 swxY w Y   d S )Nú
index.htmlzT<h1>Historical-2d Review Dashboard</h1><p>Static index.html is being prepared...</p>Úrúutf-8©Úencoding©Úcontent)Ú
STATIC_DIRÚexistsr   ÚopenÚread)Ú
index_fileÚfs     r=   Úserve_indexrN   M   sÂ   è è € õ ˜lÑ*€JØ×ÒÑÔð tÝÐrÑsÔsÐsÝ	ˆj˜#¨Ð	0Ñ	0Ô	0ð .°AÝ A§F¢F¡H¤HÐ-Ñ-Ô-ð.ð .ð .ð .ñ .ô .ð .ð .ð .ð .ð .ð .øøøð .ð .ð .ð .ð .ð .s   Á"A1Á1A5Á8A5z/warroomc               ƒ   ó  K  — t           dz  dz  dz  } |                      ¦   «         st          dd¬¦  «        ‚t          | dd¬	¦  «        5 }t	          |                     ¦   «         ¬
¦  «        cd d d ¦  «         S # 1 swxY w Y   d S )Nr,   r-   rA   i”  zWar Room file not found)Ústatus_codeÚdetailrB   rC   rD   rF   )ÚBASE_DIRrI   r   rJ   r   rK   )Úwarroom_filerM   s     r=   Úserve_warroomrT   W   sÏ   è è € å˜eÑ# nÑ4°|ÑC€LØ×ÒÑ Ô ð OÝ¨Ð4MÐNÑNÔNÐNÝ	ˆl˜C¨'Ð	2Ñ	2Ô	2ð .°aÝ A§F¢F¡H¤HÐ-Ñ-Ô-ð.ð .ð .ð .ñ .ô .ð .ð .ð .ð .ð .ð .øøøð .ð .ð .ð .ð .ð .s   Á
"A9Á9A=Â A=z/api/statusc               ƒ   ó<   K  — t          t          ¦   «         ¦  «        S ©N)r   r   r;   r<   r=   Ú
api_statusrW   `   ó   è è € åÕ)Ñ+Ô+Ñ,Ô,Ð,r<   z/api/scenesc               ƒ   ó<   K  — t          t          ¦   «         ¦  «        S rV   )r   r   r;   r<   r=   Ú
api_scenesrZ   e   s   è è € åÕ(Ñ*Ô*Ñ+Ô+Ð+r<   z/api/episodesc               ƒ   ó<   K  — t          t          ¦   «         ¦  «        S rV   )r   r   r;   r<   r=   Úapi_episodesr\   j   rX   r<   z	/api/ep01c               ƒ   ó<   K  — t          t          ¦   «         ¦  «        S rV   )r   r   r;   r<   r=   Úapi_ep01r^   o   s   è è € å�Ñ)Ô)Ñ*Ô*Ð*r<   z/api/docs/{doc_id}Údoc_idc              ƒ   óB   K  — t          | ¦  «        }t          |¦  «        S rV   )r   r   )r_   Údocs     r=   Úapi_docrb   t   s!   è è € å
�vÑ
Ô
€CÝ˜ÑÔÐr<   z/api/feedbackc               ƒ   ó<   K  — t          t          ¦   «         ¦  «        S rV   )r   r   r;   r<   r=   Úapi_get_feedbackrd   z   rX   r<   Úpayloadc              ƒ   ó  K  — dd l }|j                              ¦   «                              ¦   «                              d¦  «        }| j        pd| j        | j        | j        | j        p|dœ}t          |¦  «        }t          |¦  «        S )Nr   z%Y-%m-%d %H:%M:%S %zr0   )r1   r2   r3   r4   r5   )ÚdatetimeÚnowÚ
astimezoneÚstrftimer1   r2   r3   r4   r5   r   r   )re   rg   Únow_strÚrecordÚresults        r=   Úapi_post_feedbackrn      sŒ   è è € à€O€O€OØÔ×#Ò#Ñ%Ô%×0Ò0Ñ2Ô2×;Ò;Ð<RÑSÔS€Gà”.Ð2 NØ”?ØÔ$Ø”?ØÔ&Ð1¨'ðð €Fõ ˜6Ñ"Ô"€FÝ˜ÑÔÐr<   Ú__main__zsrc.web_review.server:appz0.0.0.0iì  F)ÚhostÚportÚreload)=Ú__doc__ÚosÚpathlibr   Úfastapir   r   r   Úfastapi.responsesr   r   r	   Úfastapi.staticfilesr
   Úfastapi.middleware.corsr   Úpydanticr   Útypingr   Úsrc.web_review.data_servicer   r   r   r   r   r   r   Ú__file__ÚresolveÚparentrR   rH   Ú
OUTPUT_DIRÚEPISODES_DIRÚ
ASSETS_DIRÚDATA_DIRÚappÚadd_middlewareÚmkdirÚmountr9   rI   ÚNODE_MODULES_DIRÚ	WEBGL_DIRr/   ÚgetÚheadrN   rT   rW   rZ   r\   r^   rb   rd   Úpostrn   r6   ÚuvicornÚrunr;   r<   r=   ú<module>r�      sç  ððð ð
 
€	€	€	Ø Ð Ð Ð Ð Ð Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FØ +Ð +Ð +Ð +Ð +Ð +Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ˆ4�‰>Œ>×!Ò!Ñ#Ô#Ô*Ô1Ô8€ØˆT�(‰^Œ^×#Ò#Ñ%Ô%Ô,¨xÑ7€
Ø˜Ñ €
Ø˜*Ñ$€Ø˜Ñ €
Ø�fÑ€à€gØ
1ØUØðñ ô €ð × Ò ØØ�%ØØ�%Ø�%ð ñ ô ð ð × Ò ˜¨Ð Ñ -Ô -Ð -Ø ‡	‚	ˆ)�[�[¨3¨3¨z©?¬?Ð;Ñ;Ô;À(€	Ñ KÔ KÐ Kà×ÒÑÔð \Ø‡I‚Iˆi˜˜¨s¨s°:©¬Ð?Ñ?Ô?Ào€IÑVÔVÐVØ‡I‚Iˆo˜{˜{°S°S¸±_´_ÐEÑEÔEÈN€IÑ[Ô[Ð[Ø×ÒÑÔð bØ‡I‚IÐ  °s°s¸<Ñ7HÔ7HÐ!IÑ!IÔ!IÐP`€IÑaÔaÐaØ×ÒÑÔð \Ø‡I‚Iˆi˜˜¨s¨s°:©¬Ð?Ñ?Ô?Ào€IÑVÔVÐVØ‡I‚Iˆo˜{˜{°S°S¸±_´_ÐEÑEÔEÈN€IÑ[Ô[Ð[à˜nÑ,Ð Ø×ÒÑÔð bØ‡I‚Iˆo˜{˜{°S°SÐ9IÑ5JÔ5JÐKÑKÔKÐR`€IÑaÔaÐaà�uÑ˜~Ñ-€	Ø×ÒÑÔð _Ø‡I‚IÐ! ; ;¸¸¸Y¹¼Ð#HÑ#HÔ#HÈ~€IÑ^Ô^Ð^ð$ð $ð $ð $ð $�iñ $ô $ð $ð ‡‚ˆ˜\€Ñ*Ô*Ø‡‚ˆ#˜l€Ñ+Ô+ð.ð .ñ ,Ô+ñ +Ô*ð.ð ‡‚ˆ L€Ñ1Ô1ð.ð .ñ 2Ô1ð.ð ‡‚ˆÑÔð-ð -ñ Ôð-ð ‡‚ˆÑÔð,ð ,ñ Ôð,ð ‡‚ˆÑÔð-ð -ñ Ôð-ð ‡‚ˆÑÔð+ð +ñ Ôð+ð ‡‚Ð	ÑÔð˜#ð ð ð ñ Ôðð
 ‡‚ˆÑÔð-ð -ñ Ôð-ð ‡‚ˆ/ÑÔð  _ð  ð  ð  ñ Ôð ð ˆzÒÐØ€N€N€NØ€G„KÐ+°)À$ÈuÐUÑUÔUÐUÐUÐUð Ðr<   