Pure Python stdlib http.server + ThreadingMixIn, zero web framework deps.
- GET/HEAD → 301, POST/PUT/DELETE/PATCH → 308
- Reads Host header, strips port, redirects to https://{host}{path}
- Config via confs (retry_on_refused, hard dependency) + env var override
- Logs via log_client → db Logs table (fail-safe async batch)
- Port 80 privilege via setcap cap_net_bind_service in _run.sh
RpcClient.call() returns the data dict, not a raw string.
configparser.read_string() expects str, hence TypeError.
Now uses .get("content") to unwrap the ini text.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
1. 侧栏重复:_handle_tool_calls 中 msg_type in ("line", "complete") 将流式工具末尾的 complete 信号也当作 line 转发,导致所有支持 流式输出的工具(get_current_time、run_command、read_file等20+个) 结果在侧栏显示两次。改为仅转发 "line" 类型。 2. 聊天区Markdown列表重复:Textual 的 Markdown.append() 在 chunk 边界切断 Markdown 语法(如列表项 "- "被拆成两个chunk)时,增量 解析可能导致内容重复渲染。改为累积完整文本后调用 update() 整体 重新解析,避免增量解析的边界问题。recv() payload.decode("utf-8") 抛出 UnicodeDecodeError(ValueError子类)不在 _handle_client 异常捕获列表中,同步模式(workers=0)下收到无效UTF-8字节会导致整个服务进程崩溃。修复:recv()中将UnicodeDecodeError包装为ConnectionError;_handle_client()异常列表增加防御性兜底。RpcClient.call() returns the data dict, not a raw string. configparser.read_string() expects str, hence TypeError. Now uses .get("content") to unwrap the ini text.