o
    i                     @   s   d Z ddlZddlZddlZddlZddlZddlmZ dZ	ee
jZed d Zed d Zed d	 Ze Zd
efddZd
eddfddZdedefddZG dd dejjZdd Zedkrie  dS dS )zSimple HTTP server for dashboard, kanban, and action board.

Supports a minimal POST API for persisting Action Board drag/drop overrides and
(optionally) syncing those moves into Kanban state.

Zero external dependencies.
    N)Pathi  actionzaction-state.jsonkanbanzkanban-state.jsonzbuild-kanban-data.pypathc                 C   s(   zt |  W S  ty   | Y S w N)jsonloads	read_text	Exception)r   default r   +/home/isthekid/.openclaw/workspace/serve.py
_read_json   s
   r   returnc                 C   s(   | j jddd | tj|dd d S )NT)parentsexist_ok   )indent)parentmkdir
write_textr   dumps)r   objr   r   r   _write_json"   s   r   
action_colc                 C   s4   | pd  } | dkrdS | dv rdS | dkrdS dS )N waiting)done_recentdoner   do_nowdoingtodo)lower)r   r   r   r   _map_action_col_to_kanban_col'   s   r#   c                       s>   e Zd Z fddZ fddZdefddZdd	 Z  ZS )
Handlerc                    s   t  j|dtti| d S )N	directory)super__init__strDIR)selfargskwargs	__class__r   r   r'   6   s   zHandler.__init__c                    s2   |  dd |  dd |  dd t   d S )NzCache-Controlz#no-store, no-cache, must-revalidatePragmazno-cacheExpires0)send_headerr&   end_headers)r*   r-   r   r   r3   9   s   zHandler.end_headersstatusc                 C   sR   t |d}| | | dd | dtt| |   | j	| d S )Nutf-8zContent-Typezapplication/json; charset=utf-8Content-Length)
r   r   encodesend_responser2   r(   lenr3   wfilewrite)r*   r4   payloaddatar   r   r   
_send_json@   s   
zHandler._send_jsonc              
   C   s4  | j ddkrzt| jddpd}| j|d}t	|p#d}|dp+g }|dp2d	}|d
p9d}t
|trHtdd |D sR| ddddW S t
|trY|sc| ddddW S t} ttddddddddi g d}|di  |D ]}||  |d|d |< qtt| ttddddddd d!dd"d#dd$d%dgi g d&}	|	d'i  t|}
|D ]
}d(|
i|	d' |< qtt|	 t rtjttgdd) W d    n1 sw   Y  | d*d+d,iW S  ty } z| d-dt|dW  Y d }~S d }~ww | d.dd/dS )0N/z/action/api/mover6   r1   r5   z{}
projectIdstargetColumnIdr   reasonuserc                 s   s    | ]}t |tV  qd S r   )
isinstancer(   ).0xr   r   r   	<genexpr>T   s    z"Handler.do_POST.<locals>.<genexpr>i  FzprojectIds must be string[])okerrorztargetColumnId requiredzAction BoardzAmerica/New_York)titletimezone      )urgentDaysThresholddoNowDaysThresholddoneRecentDaysquickWinMaxActions)metapreferencesmanualOverridesdismissedProjectsrT   )columnId	timestamprB   zAdner Kanban (overlay)r!   zTo Do)idnamer    Doingr   Waitingr   Done)rR   columns	cardStatemanualCardsr^   column)check   rH   Ti  i  z	not found)r   rstripintheadersgetrfilereaddecoder   r   rD   listallr>   r(   _LOCKr   ACTION_STATE
setdefaultdate_time_stringr   KANBAN_STATEr#   BUILD_KANBANexists
subprocessrunr
   )r*   lengthrawbodyproject_idstargetrB   action_statepidkanban_statekcoler   r   r   do_POSTH   sv   

4"zHandler.do_POST)	__name__
__module____qualname__r'   r3   rd   r>   r   __classcell__r   r   r-   r   r$   5   s
    r$   c                  C   s   t dtft1} tdt d tdt d tdt d tdt d	 td
 |   W d    d S 1 s<w   Y  d S )Nr   u*   ✓ Serving workspace at http://localhost:r?   z  Dashboard: http://localhost:z/dashboard/z  Kanban:    http://localhost:z/kanban/z  Action:    http://localhost:z/action/zPress Ctrl+C to stop.)socketserverThreadingTCPServerPORTr$   printserve_forever)httpdr   r   r   main   s   
"r   __main__)__doc__http.serverhttpr   r   rs   	threadingpathlibr   r   __file__r   r)   rm   rp   rq   Lockrl   r   r   r(   r#   serverSimpleHTTPRequestHandlerr$   r   r   r   r   r   r   <module>   s*   
_

