
    (FjX                        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ZddlZddlZddl	Z	ddl
Z
ddlmZ ddlmZmZ ddlmZ  G d de      Z G d d	e      Z G d
 d      Zedk(  r ej*                  d      Zej/                  ddd       ej/                  dedd       ej/                  dddd       ej3                         Z eej6                        Zej;                  ej<                         Z e de        ej<                  s	 e d       n e         ej:                  sejC                           e"d      	 	  e	jF                  d       y# e$$ r  e d       Y yw xY w) a  
Hint panel for Kimi Copilot.

Maintains a persistent dashboard of detected issues, RAG writes, and
intervention hints. The dashboard is rendered as a self-contained HTML
page served by a local HTTP server. Run this module directly with
``--open`` to start the server and print the URL.
    N)datetime)BaseHTTPRequestHandler
HTTPServer)Anyc                        e Zd ZdZdZd Zd Zy)_PanelRequestHandlerz)Serve the current panel HTML from memory.Nc                    | j                   dv r| j                  d       | j                  dd       | j                          | j                  r| j                  j
                  nd}| j                  j                  |j                  d             y | j                  d       | j                  dd       | j                          | j                  j                  d	       y )
N)/z/panel.html   zContent-Typeztext/html; charset=utf-8 utf-8i  ztext/plain; charset=utf-8s	   Not found)	pathsend_responsesend_headerend_headerspanelhtml_contentwfilewriteencode)selfcontents     copilot_panel.pydo_GETz_PanelRequestHandler.do_GET   s    99,,s#^-GH15djj--GJJW^^G45s#^-HIJJ\*    c                      y N )r   formatargss      r   log_messagez _PanelRequestHandler.log_message,   s    r   )__name__
__module____qualname____doc__r   r   r!   r   r   r   r   r      s    3E+r   r   c                       e Zd ZdZy)_PanelHTTPServerTN)r"   r#   r$   allow_reuse_addressr   r   r   r'   r'   1   s    r   r'   c                      e Zd ZU  ej                         ZdZdZedz  e	d<   dZ
edz  e	d<   dZej                  dz  e	d<   	 	 	 	 d3dededed	efd
Zd Zd Z	 d4dededee   dedef
dZ	 	 	 	 d5dededededee   defdZ	 d6dedededee   dee   defdZ	 	 	 d7dee   dededee   dz  dee   f
dZd8dee   dedeeee   f   fdZed edefd!       Zedefd"       Zd9d#ed$ed%edefd&Zd9d#ed$ed%edefd'Z d9d#ed$ed%edefd(Z!d)edefd*Z"d+ Z#defd,Z$ed	edefd-       Z%defd.Z&d/efd0Z'd:d1edefd2Z(y);	HintPanelFN_server_port_http_server_server_thread	json_path	html_path
session_idportc                     || _         || _        |xs# t        j                         j	                  d      | _        g | _        d| _        |xs | j                         | _	        | j                          y )Nz%Y%m%d_%H%M%Sr   )r.   r/   r   nowstrftimer0   recordsr   _resolve_portr1   _load)r   r.   r/   r0   r1   s        r   __init__zHintPanel.__init__<   s\     #"$P(?(?(P#%!#0D..0	

r   c                 F   t         j                  j                  | j                        sg | _        y 	 t        | j                  dd      5 }t        j                  |      }|j                  dg       | _        d d d        y # 1 sw Y   y xY w# t        $ r
 g | _        Y y w xY w)Nrr   encodingr5   )
osr   existsr.   r5   openjsonloadget	Exception)r   fdatas      r   r7   zHintPanel._loadK   s    ww~~dnn-DL	dnncG< 7yy|#xx	267 7 7  	DL	s/   B -B8B B
B 
B B B c                    	 t        | j                  dd      5 }t        j                  d| j                  i|dd       d d d        | j                          y # 1 sw Y   xY w# t        $ r}t        d| d	       Y d }~y d }~ww xY w)
Nwr   r;   r5   F   )ensure_asciiindentu   
[Copilot] 面板保存失败: 
)r?   r.   r@   dumpr5   render_htmlrC   print)r   rD   es      r   savezHintPanel.saveV   s    	<dnncG< V		9dll3QUSTUVV V  	<4QCr:;;	<s.   A% &A A% A"A% %	B.BBsummary
suggestiontagsseverityreturnc                     d||t        |xs g       || j                  t        j                         j	                         d}| j
                  j                  |       | j                          |S )Nissue)typerQ   rR   rS   rT   r0   timelistr0   r   r3   	isoformatr5   appendrP   )r   rQ   rR   rS   rT   records         r   	add_issuezHintPanel.add_issue^   s^     $$ //LLN,,.
 	F#		r   titlequestionwrongcorrectc           	          d||||t        |xs g       | j                  t        j                         j	                         d}| j
                  j                  |       | j                          |S )Nrag)rX   r`   ra   wrong_approachcorrect_approachrS   r0   rY   rZ   )r   r`   ra   rb   rc   rS   r^   s          r   add_ragzHintPanel.add_ragr   sa      # '$//LLN,,.	
 	F#		r   
root_causeintervention_promptsourcesc           	          d|||t        |xs g       t        |xs g       | j                  t        j                         j	                         d}| j
                  j                  |       | j                          |S )Nintervention)rX   rQ   ri   rj   rk   rS   r0   rY   rZ   )r   rQ   ri   rj   rk   rS   r^   s          r   add_interventionzHintPanel.add_intervention   sj     #$#6GMr*$//LLN,,.	
 	F#		r   limitallowed_scopesc                    g }t        d |D              }|r|j                         nd}|xs
 t               D ch c]  }|s|j                          }	}| j                  dd D ]  }
|
j                  d      dvrt        d |
j                  dg       D              }|D ch c]&  }|j	                  d	      s|j	                  d
      r|( }}|r|	r||	z  st|r||z  r|j                  |
       |r4||
j                  dd      j                         v r|j                  |
       |s||
j                  dd      j                         v s|j                  |
        || d S c c}w c c}w )a  Find related records by tag overlap or summary/title similarity.

        If ``allowed_scopes`` is provided, records that carry project/scope
        tags but match none of the allowed scopes are skipped. This keeps
        stuck analysis focused on the current project.
        c              3   B   K   | ]  }|s|j                           y wr   lower.0ts     r   	<genexpr>z)HintPanel.find_related.<locals>.<genexpr>   s     8a17798   r   NrX   )rW   re   c              3   B   K   | ]  }|s|j                           y wr   rs   ru   s     r   rx   z)HintPanel.find_related.<locals>.<genexpr>   s     HAaaggiHry   rS   zproject:zscope:rQ   r`   )setrt   r5   rB   
startswithr]   )r   rS   rQ   ro   rp   relatedcurrent_tagscurrent_summaryrw   allowedr:   record_tagsrecord_scopess                r   find_relatedzHintPanel.find_related   sb    8d88-4'--/"'5'>E11779EE cr" 	"AuuV}$44Hvr1BHHK '<<
+q||H/E M  -'2I!;q! _i8L8R8R8T%Tq! _gr8J8P8P8R%Rq!%	"& vw- Fs   E&E&!+E+c                 F    | j                  ||      }t        |      dk\  |fS )N   )r   len)r   rS   rQ   r~   s       r   is_repeatedzHintPanel.is_repeated   s(    ##D'27|q '))r   isoc                 r    	 t        j                  |       }|j                  d      S # t        $ r | cY S w xY w)Nz%Y-%m-%d %H:%M:%S)r   fromisoformatr4   rC   )r   dts     r   _format_timezHintPanel._format_time   s;    	'',B;;233 	J	s   %( 66c                       y)NuV  
        function copyText(id) {
            const el = document.getElementById(id);
            if (!el) return;
            navigator.clipboard.writeText(el.innerText).then(() => {
                const btn = el.previousElementSibling;
                if (btn && btn.tagName === 'BUTTON') {
                    const old = btn.innerText;
                    btn.innerText = '已复制';
                    setTimeout(() => btn.innerText = old, 1500);
                }
            }).catch(() => {
                alert('复制失败，请手动选中复制');
            });
        }
        r   r   r   r   _copy_jszHintPanel._copy_js   s    r   r^   idx
is_currentc                 8   t        j                  |j                  dd            }t        j                  |j                  dd            }dj                  d |j                  dg       D              }| j	                  |j                  dd            }t        j                  |j                  dd	            }d
|j                  dd       d|j                  dd       d}	|rdnd}
d| d| d|
 d| d| d| d| d| d| dt        j                  |	       dS )NrQ   r   rR   , c              3   F   K   | ]  }t        j                  |        y wr   htmlescaperu   s     r   rx   z(HintPanel._issue_card.<locals>.<genexpr>        HAQH   !rS   rY   rT   mediumu   我之前遇到这个问题：u   \n建议：u>   \n请帮我检查当前对话是否也犯了同样的问题。/   <span class="badge current">当前会话</span>zn
        <div class="card issue">
            <div class="card-header">
                <span class="severity z">z</span>
                $
                <span class="time">+</span>
            </div>
            <h4>z</h4>
            <p>,   </p>
            <div class="tags">标签：.</div>
            <button onclick="copyText('>   ')">复制提示发给主模型</button>
            <pre id="" class="copy-box"></pre>
        </div>
        r   r   rB   joinr   )r   r^   r   r   rQ   rR   rS   time_strrT   prompt_textcurrent_badges              r   _issue_cardzHintPanel._issue_card   sJ   ++fjjB78[[L"!=>
yyHFB1GHH$$VZZ%;<;;vzz*h?@,VZZ	2-F,G H

<45 6KL 	
 NXI]_' (0j8* =  $$,: .	 | ((,v .((+u -U-dkk+.F-G H	 	r   c                    t        j                  |j                  dd            }t        j                  |j                  dd            }t        j                  |j                  dd            }t        j                  |j                  dd            }dj                  d |j                  dg       D              }| j	                  |j                  d	d            }	d
|j                  dd       d|j                  dd       d|j                  dd       d}
|rdnd}d| d|	 d| d| d| d| d| d| d| dt        j                  |
       dS )Nr`   r   ra   rf   rg   r   c              3   F   K   | ]  }t        j                  |        y wr   r   ru   s     r   rx   z&HintPanel._rag_card.<locals>.<genexpr>  r   r   rS   rY   u   这是之前总结的知识：u   \n问题：u   \n正确做法：u/   \n请帮我按这个思路处理当前问题。r   z
        <div class="card rag">
            <div class="card-header">
                <span class="badge rag">RAG</span>
                r   u0   </span>
            </div>
            <h4>📚 u/   </h4>
            <p><strong>问题：</strong>u4   </p>
            <p><strong>错误方案：</strong>u4   </p>
            <p><strong>正确方案：</strong>r   r   r   r   r   r   )r   r^   r   r   r`   ra   rb   rc   rS   r   r   r   s               r   	_rag_cardzHintPanel._rag_card   s   FJJw34;;vzz*b9:FJJ'7<=++fjj);R@AyyHFB1GHH$$VZZ%;<,VZZ-D,E F

:r23 4$jj);R@A B<= 	 NXI]_   $$,: .W **2 4005w 7007y 9((,v .((+u -U-dkk+.F-G H	 	r   c                 
   t        j                  |j                  dd            }t        j                  |j                  dd            }|j                  dd      }dj                  d |j                  dg       D              }dj                  d |j                  d	g       D              }| j	                  |j                  d
d            }	|rdnd}
d|
 d|	 d| d| d| d| d| d| dt        j                  |       dS )NrQ   r   ri   rj   r   c              3   F   K   | ]  }t        j                  |        y wr   r   )rv   ss     r   rx   z/HintPanel._intervention_card.<locals>.<genexpr>#  s     NqDKKNNr   rk   c              3   F   K   | ]  }t        j                  |        y wr   r   ru   s     r   rx   z/HintPanel._intervention_card.<locals>.<genexpr>$  r   r   rS   rY   r   u   
        <div class="card intervention">
            <div class="card-header">
                <span class="badge intervention">🚨 干预建议</span>
                r   r   u/   </h4>
            <p><strong>根因：</strong>r   u1   </div>
            <div class="sources">来源：r   uD   ')">复制干预提示发给主模型</button>
            <pre id="r   r   r   )r   r^   r   r   rQ   ri   r   rk   rS   r   r   s              r   _intervention_cardzHintPanel._intervention_card  s   ++fjjB78[[L"!=>
jj!6;))NFJJy"4MNNyyHFB1GHH$$VZZ%;<MWI]_   $$,: .	 **4 6((,v .++2) 4((+u -U-dkk+.F-G H	 	r   textc                 4    dt        j                  |       dS )Nz<div class="empty">z</div>r   )r   r   s     r   _emptyzHintPanel._empty7  s    $T[[%6$7v>>r   c                    | j                   D cg c]6  }|j                  d      dk(  r |j                  d      | j                  k(  r|8 }}| j                   D cg c]6  }|j                  d      dk(  r |j                  d      | j                  k(  r|8 }}| j                   D cg c]6  }|j                  d      dk(  r |j                  d      | j                  k(  r|8 }}| j                   D cg c]6  }|j                  d      dk(  r |j                  d      | j                  k7  r|8 }}| j                   D cg c]6  }|j                  d      dk(  r |j                  d      | j                  k7  r|8 }}| j                   D cg c]6  }|j                  d      dk(  r |j                  d      | j                  k7  r|8 }}t        | j                   D cg c]  }|j                  d      dk(  s| c}      }t        | j                   D cg c]  }|j                  d      dk(  s| c}      }	t        | j                   D cg c]  }|j                  d      dk(  s| c}      }
t        |      t        |      z   t        |      z   }g }t	        t        |            D ]+  \  }}|j                  | j                  |d| d             - t	        t        |            D ]+  \  }}|j                  | j                  |d	| d             - d
j                  |      xs | j                  d      }||z   }g }t	        t        |dd              D ]I  \  }}|j                  d      | j                  k(  }|j                  | j                  |d| |             K d
j                  |      xs | j                  d      }||z   }g }t	        t        |dd              D ]I  \  }}|j                  d      | j                  k(  }|j                  | j                  |d| |             K d
j                  |      xs | j                  d      }g }t	        t        |dd              D ]+  \  }}|j                  | j                  |d| d             - d
j                  |      xs | j                  d      }d}|j                  ||	|
|||||| j                         	      }|| _        	 t        | j                   dd      5 }|j#                  |       d d d        y c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w # 1 sw Y   y xY w# t$        $ r}t'        d| d       Y d }~y d }~ww xY w)NrX   rW   r0   re   rm   zc-issue-T)r   zc-rag-r   u   当前会话还没有记录izintervention-u   还没有干预建议izrag-u   还没有 RAG 知识库记录zh-issue-Fu   没有历史踩坑记录u  <!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Kimi Copilot 提示面板</title>
<style>
  body {{
    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
    margin: 0; padding: 0; background: #f5f5f7; color: #1d1d1f; line-height: 1.6;
  }}
  header {{
    background: #000; color: #fff; padding: 24px 32px;
  }}
  header h1 {{
    margin: 0; font-size: 24px;
  }}
  header p {{
    margin: 8px 0 0; opacity: 0.8; font-size: 14px;
  }}
  .container {{
    max-width: 900px; margin: 0 auto; padding: 24px 32px;
  }}
  .stats {{
    display: flex; gap: 16px; margin-bottom: 24px;
  }}
  .stat {{
    background: #fff; border-radius: 12px; padding: 16px 20px; flex: 1;
    box-shadow: 0 1px 3px rgba(0,0,0,0.08);
  }}
  .stat-value {{
    font-size: 28px; font-weight: 700;
  }}
  .stat-label {{
    font-size: 13px; color: #666; margin-top: 4px;
  }}
  section {{
    margin-bottom: 32px;
  }}
  h2 {{
    font-size: 18px; margin-bottom: 16px;
  }}
  .card {{
    background: #fff; border-radius: 12px; padding: 20px; margin-bottom: 16px;
    box-shadow: 0 1px 3px rgba(0,0,0,0.08);
  }}
  .card-header {{
    display: flex; align-items: center; gap: 8px; margin-bottom: 12px; font-size: 12px;
  }}
  .severity {{
    padding: 2px 8px; border-radius: 4px; font-weight: 600; text-transform: uppercase;
  }}
  .severity.high {{
    background: #ffebee; color: #c62828;
  }}
  .severity.medium {{
    background: #fff3e0; color: #ef6c00;
  }}
  .severity.low {{
    background: #e8f5e9; color: #2e7d32;
  }}
  .badge {{
    padding: 2px 8px; border-radius: 4px; font-weight: 600; font-size: 11px;
  }}
  .badge.rag {{
    background: #e3f2fd; color: #1565c0;
  }}
  .badge.current {{
    background: #f3e5f5; color: #6a1b9a;
  }}
  .badge.intervention {{
    background: #ffebee; color: #c62828;
  }}
  .card.intervention {{
    border-left: 4px solid #c62828;
  }}
  .sources {{
    font-size: 12px; color: #888; margin-bottom: 12px;
  }}
  .time {{
    margin-left: auto; color: #888;
  }}
  .card h4 {{
    margin: 0 0 10px; font-size: 16px;
  }}
  .card p {{
    margin: 0 0 10px;
  }}
  .tags {{
    font-size: 12px; color: #666; margin-bottom: 12px;
  }}
  button {{
    background: #007aff; color: #fff; border: none; padding: 8px 14px;
    border-radius: 6px; cursor: pointer; font-size: 13px;
  }}
  button:hover {{
    background: #005bb5;
  }}
  .copy-box {{
    background: #f5f5f7; border: 1px solid #ddd; border-radius: 6px; padding: 12px;
    font-size: 13px; white-space: pre-wrap; margin-top: 10px;
  }}
  .empty {{
    color: #888; font-style: italic; text-align: center; padding: 40px;
  }}
</style>
</head>
<body>
<header>
  <h1>🛡️ Kimi Copilot 提示面板</h1>
  <p>旁路模型发现的踩坑经验与已写入 RAG 的知识库记录</p>
</header>
<div class="container">
  <div class="stats">
    <div class="stat"><div class="stat-value">{issue_count}</div><div class="stat-label">踩坑记录</div></div>
    <div class="stat"><div class="stat-value">{rag_count}</div><div class="stat-label">RAG 知识</div></div>
    <div class="stat"><div class="stat-value">{intervention_count}</div><div class="stat-label">干预建议</div></div>
    <div class="stat"><div class="stat-value">{current_count}</div><div class="stat-label">当前会话</div></div>
  </div>

  <section>
    <h2>🚨 干预建议</h2>
    {intervention_html}
  </section>

  <section>
    <h2>📌 当前会话</h2>
    {current_html}
  </section>

  <section>
    <h2>📚 RAG 知识库</h2>
    {rag_html}
  </section>

  <section>
    <h2>🕐 历史记录</h2>
    {history_html}
  </section>
</div>
<script>{copy_js}</script>
</body>
</html>)	issue_count	rag_countintervention_countcurrent_countcurrent_htmlintervention_htmlrag_htmlhistory_htmlcopy_jsrG   r   r;   u%   
[Copilot] 面板 HTML 渲染失败: rK   )r5   rB   r0   r   	enumeratereversedr]   r   r   r   r   r   r   r   r   r?   r/   r   rC   rN   )r   r:   current_issuescurrent_ragscurrent_interventionshistory_issueshistory_ragshistory_interventionsr   r   r   r   current_html_partsir   all_interventionsintervention_html_partsr   r   all_ragsrag_html_partsr   history_html_partsr   templater   rD   rO   s                               r   rM   zHintPanel.render_html:  sg   ||
uuV}'AEE,,?4??,R 
 

 ||
uuV}%!%%*=*P 
 

 ||!
uuV}.1553F$//3Y !
 !

 ||
uuV}'AEE,,?4??,R 
 

 ||
uuV}%!%%*=*P 
 

 ||!
uuV}.1553F$//3Y !
 !

 dllOaeeFmw6N1OPDLLKqAEE&MU4JKL	 T\\!]QUU6]n=\!!]^N+c,.??#F[B\\  h~67 	\DAq%%d&6&6qHQC.UY&6&Z[	\h|45 	XDAq%%dnnQ&QUn&VW	Xww12`dkkB_6`14II"$h'8'>?@ 	sDAq|,?J#**4+B+B1VWUXFYfp+B+qr	s GG$;<dLc@d,.hx~67 	XDAq|,?J!!$..d1#J:."VW	X 77>*Zdkk:Y.Zh~cd';<= 	]DAq%%d&6&6qHQC.UZ&6&[\	]ww12]dkkB\6]N`  #1'%/%MMO ' 

 )	BdnncG< &%& &q

!


!

 PK!]z& & 	B:1#R@AA	Bs}   ;T$;T)%;T.0;T3;;T8;T=U0UU(UU U1U 	UU UU U 	U?&U::U?c                     t         j                  j                  dd      j                         }|j	                         rt        |      S y)NCOPILOT_PANEL_PORTr   il  )r=   environrB   stripisdigitint)r   env_ports     r   r6   zHintPanel._resolve_port  s9    ::>>"6;AACx= r   c                     	 t        j                   t         j                  t         j                        5 }|j                  d| f       d d d        y# 1 sw Y   yxY w# t        $ r Y yw xY w)N	127.0.0.1TF)socketAF_INETSOCK_STREAMbindOSError)r1   r   s     r   _is_port_freezHintPanel._is_port_free  sY    	v~~v/A/AB ,aT*+,, 		s.   2A AA AA A 	A)(A)c                 &   t         j                  5  t         j                  st        dt        fi       }| |_        | j                  }| j                  |      st        d| d      t        d|f|      t         _
        |t         _        t        j                  t         j                  j                  d      t         _        t         j                  j!                          dt         _        dt         j                   dcd d d        S # 1 sw Y   y xY w)	N_BoundPanelHandleru   端口 u    已被占用。请先停止其他面板服务，或设置环境变量 COPILOT_PANEL_PORT 指定其他端口，或使用 --port 参数指定其他端口。r   Ttargetdaemonzhttp://127.0.0.1:r
   )r*   _server_lock_server_startedrX   r   r   r1   r   RuntimeErrorr'   r,   r+   	threadingThreadserve_foreverr-   start)r   handlerr1   s      r   _ensure_serverzHintPanel._ensure_server'  s    ## 	A,,36J5LbQ $yy))$/&!$ (G H 
 *: $'*	& *.	&+4+;+;$11??,	( ((..0,0	)&y'='=&>a@+	A 	A 	As   C,DDurlc                     t         j                  j                  dd      j                         j	                         dv ryfd}t        j                  |d      j                          y)z7Open the panel URL in the default browser, best-effort.COPILOT_PANEL_NO_BROWSERr   )1trueyesNc                      	 t         j                  dk(  r8t        j                  d gdt        j                  t        j                         y t        j                   d       y # t        $ r Y y w xY w)Ndarwinr?   F)checkstdoutstderrrH   )new)sysplatform
subprocessrunDEVNULL
webbrowserr?   rC   )r   s   r   _openz&HintPanel._open_browser.<locals>._openI  s^    <<8+NN#)11)11	 OOCQ/ s   A
A& A& &	A21A2Tr   )r=   r   rB   r   rt   r   r   r   )r   r   r   s    ` r   _open_browserzHintPanel._open_browser?  sZ     ::>>4b9??AGGI N
 

 	 	d399;r   open_browserc                 l    | j                          | j                         }|r| j                  |       |S )z5Start the local HTTP server and return the panel URL.)rM   r   r   )r   r   r   s      r   r?   zHintPanel.openZ  s2    !!#s#
r   )z
panel.jsonz
panel.htmlNN)r   )r   r   r   Nr   )r   
   N)r   )F)T))r"   r#   r$   r   Lockr   r   r+   r   __annotations__r,   r   r-   r   strr8   r7   rP   r[   dictr_   rh   rn   r|   r   tupleboolr   staticmethodr   r   r   r   r   r   rM   r6   r   r   r   r?   r   r   r   r*   r*   5   s   !9>>#LO#L#*#&*L*t#*.2NI$$t+2 &%  	
 	< !  3i	
  
.   	
  3i 
8   !	
 c 3i 
2 *.& 3i&  &  	& 
 C4&  
d& P*S	 *C *tTRVZGWAX * # #   c  $$ S d s 6 3 D S > C T VY 0?3 ?3 ?\B|s  C D  A A0< <6  r   r*   __main__zKimi Copilot panel server)descriptionz--open
store_truez;Start the panel server, print the URL, and open the browser)actionhelpz--portz?Port for the panel server (default: 7788 or COPILOT_PANEL_PORT))rX   defaultr  z--no-browser
no_browserz%Do not open the browser automatically)destr  r  )r1   )r   u   
[Copilot] 提示面板：u#   [Copilot] 正在打开浏览器...
r   u    
[Copilot] 面板服务已停止)%r%   r   r@   argparser=   r   r   r   r   rY   r   r   http.serverr   r   typingr   r   r'   r*   r"   ArgumentParserparseradd_argumentr   
parse_argsr    r1   r   r?   r  r   rN   
print_help
SystemExitsleepKeyboardInterruptr   r   r   <module>r     s      	   
     : 1 .z k k\ z$X$$1LMF
J  
 N	   4	   D499%E
**doo"5*
6C	'u
-.??4599m3DJJqM E H  3123s   E E&%E&