vibego 0.2.9__py3-none-any.whl → 0.2.11__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of vibego might be problematic. Click here for more details.

bot.py CHANGED
@@ -4450,7 +4450,14 @@ def _extract_codex_payload(data: dict, *, event_timestamp: Optional[str]) -> Opt
4450
4450
  return None
4451
4451
 
4452
4452
 
4453
- def _extract_claudecode_payload(data: dict, *, event_timestamp: Optional[str]) -> Optional[Tuple[str, str, Optional[Dict[str, Any]]]]:
4453
+ def _extract_claudecode_payload(
4454
+ data: dict, *, event_timestamp: Optional[str]
4455
+ ) -> Optional[Tuple[str, str, Optional[Dict[str, Any]]]]:
4456
+ # Claude Code 在启动时会输出 isSidechain=true 的欢迎语,此类事件直接忽略
4457
+ sidechain_flag = data.get("isSidechain")
4458
+ if isinstance(sidechain_flag, bool) and sidechain_flag:
4459
+ return None
4460
+
4454
4461
  event_type = data.get("type")
4455
4462
 
4456
4463
  if event_type == "assistant":
@@ -4463,20 +4470,11 @@ def _extract_claudecode_payload(data: dict, *, event_timestamp: Optional[str]) -
4463
4470
  if not isinstance(item, dict):
4464
4471
  continue
4465
4472
  item_type = item.get("type")
4466
- if item_type in {"thinking", "tool_use"}:
4467
- continue
4468
- if item_type == "tool_result":
4469
- tool_output = item.get("output")
4470
- if isinstance(tool_output, str) and tool_output.strip():
4471
- fragments.append(tool_output.strip())
4472
- content_value = item.get("content")
4473
- if isinstance(content_value, str) and content_value.strip():
4474
- fragments.append(content_value.strip())
4473
+ if item_type != "text":
4475
4474
  continue
4476
- if item_type in {"text", "output_text", "markdown"}:
4477
- text_value = item.get("text") or item.get("markdown")
4478
- if isinstance(text_value, str) and text_value.strip():
4479
- fragments.append(text_value)
4475
+ text_value = item.get("text")
4476
+ if isinstance(text_value, str) and text_value.strip():
4477
+ fragments.append(text_value)
4480
4478
  if fragments:
4481
4479
  combined = "\n\n".join(fragments)
4482
4480
  metadata: Optional[Dict[str, Any]] = None
master.py CHANGED
@@ -1716,13 +1716,8 @@ async def _notify_restart_success(bot: Bot) -> None:
1716
1716
  except Exception as exc:
1717
1717
  log.error("发送重启成功通知失败: %s", exc, extra={"chat": chat_id})
1718
1718
  else:
1719
+ # 重启成功后不再附带项目列表,避免高频重启时产生额外噪音
1719
1720
  log.info("重启成功通知已发送", extra={"chat": chat_id})
1720
- try:
1721
- manager = await _ensure_manager()
1722
- except Exception as ensure_exc:
1723
- log.error("发送项目概览前获取 manager 失败: %s", ensure_exc)
1724
- else:
1725
- await _send_projects_overview_to_chat(bot, chat_id, manager)
1726
1721
  finally:
1727
1722
  _safe_remove(RESTART_SIGNAL_PATH)
1728
1723
 
scripts/start.sh CHANGED
@@ -102,6 +102,84 @@ ensure_codex_installed() {
102
102
 
103
103
  ensure_codex_installed
104
104
 
105
+ select_python_binary() {
106
+ # 选择满足 CPython <=3.13 的解释器,避免 PyO3 依赖构建失败
107
+ local candidates=()
108
+ local chosen=""
109
+ local name
110
+ if [[ -n "${VIBEGO_PYTHON:-}" ]]; then
111
+ candidates+=("$VIBEGO_PYTHON")
112
+ fi
113
+ for name in python3.13 python3.12 python3.11 python3.10 python3.9 python3; do
114
+ if [[ "${VIBEGO_PYTHON:-}" == "$name" ]]; then
115
+ continue
116
+ fi
117
+ candidates+=("$name")
118
+ done
119
+
120
+ for name in "${candidates[@]}"; do
121
+ if [[ -z "$name" ]]; then
122
+ continue
123
+ fi
124
+ if ! command -v "$name" >/dev/null 2>&1; then
125
+ continue
126
+ fi
127
+ local version_raw
128
+ version_raw=$("$name" -c 'import sys; print(f"{sys.version_info[0]}.{sys.version_info[1]}")' 2>/dev/null) || continue
129
+ local major="${version_raw%%.*}"
130
+ local minor="${version_raw#*.}"
131
+ if [[ "$major" != "3" ]]; then
132
+ log_info "跳过 ${name} (版本 ${version_raw}):非 CPython 3.x"
133
+ continue
134
+ fi
135
+ if [[ "$minor" =~ ^[0-9]+$ ]] && (( minor > 13 )); then
136
+ log_info "跳过 ${name} (版本 ${version_raw}):高于 3.13"
137
+ continue
138
+ fi
139
+ if [[ "$minor" =~ ^[0-9]+$ ]] && (( minor < 9 )); then
140
+ log_info "跳过 ${name} (版本 ${version_raw}):低于 3.9,可能缺少官方轮子"
141
+ continue
142
+ fi
143
+ chosen="$name"
144
+ log_info "使用 Python 解释器:${chosen} (版本 ${version_raw})"
145
+ break
146
+ done
147
+
148
+ if [[ -z "$chosen" ]]; then
149
+ log_error "未找到满足 <=3.13 的 Python 解释器,可通过设置 VIBEGO_PYTHON 指定路径"
150
+ exit 1
151
+ fi
152
+
153
+ printf '%s' "$chosen"
154
+ }
155
+
156
+ # 检查Python依赖是否已安装完整
157
+ check_deps_installed() {
158
+ # 检查虚拟环境是否存在
159
+ if [[ ! -d "$ROOT_DIR/.venv" ]]; then
160
+ log_info "虚拟环境不存在,需要初始化"
161
+ return 1
162
+ fi
163
+
164
+ # 检查虚拟环境的Python解释器
165
+ if [[ ! -x "$ROOT_DIR/.venv/bin/python" ]]; then
166
+ log_info "虚拟环境Python解释器缺失"
167
+ return 1
168
+ fi
169
+
170
+ # 激活虚拟环境并检查关键依赖包
171
+ # aiogram: Telegram Bot框架
172
+ # aiohttp: 异步HTTP客户端
173
+ # aiosqlite: 异步SQLite数据库
174
+ if ! "$ROOT_DIR/.venv/bin/python" -c "import aiogram, aiohttp, aiosqlite" 2>/dev/null; then
175
+ log_info "关键依赖包缺失或损坏"
176
+ return 1
177
+ fi
178
+
179
+ log_info "依赖检查通过,虚拟环境完整"
180
+ return 0
181
+ }
182
+
105
183
  if pgrep -f "python.*master.py" >/dev/null 2>&1; then
106
184
  log_info "检测到历史 master 实例,正在终止..."
107
185
  pkill -f "python.*master.py" || true
@@ -118,24 +196,38 @@ if pgrep -f "python.*master.py" >/dev/null 2>&1; then
118
196
  log_info "历史 master 实例已清理"
119
197
  fi
120
198
 
121
- # 创建并启用虚拟环境
122
- python3 -m venv .venv
123
- source .venv/bin/activate
124
-
125
- # 安装依赖
199
+ # 智能依赖管理:仅在必要时安装
126
200
  REQUIREMENTS_FILE="${VIBEGO_REQUIREMENTS_PATH:-$ROOT_DIR/scripts/requirements.txt}"
127
201
  if [[ ! -f "$REQUIREMENTS_FILE" ]]; then
128
202
  log_error "依赖文件缺失: $REQUIREMENTS_FILE"
129
203
  exit 1
130
204
  fi
131
- pip install -r "$REQUIREMENTS_FILE"
205
+
206
+ PYTHON_BIN="$(select_python_binary)"
207
+
208
+ # 检查是否需要安装依赖
209
+ if check_deps_installed; then
210
+ log_info "依赖已安装且完整,跳过pip install(加速重启)"
211
+ source .venv/bin/activate
212
+ else
213
+ log_info "首次启动或依赖缺失,正在安装依赖..."
214
+
215
+ # 创建或重建虚拟环境
216
+ "$PYTHON_BIN" -m venv .venv
217
+ source .venv/bin/activate
218
+
219
+ # 安装依赖
220
+ log_info "开始执行 pip install -r $REQUIREMENTS_FILE"
221
+ pip install -r "$REQUIREMENTS_FILE"
222
+ log_info "依赖安装完成"
223
+ fi
132
224
 
133
225
  # 后台启动 master,日志落在 vibe.log
134
- nohup python3 master.py >> /dev/null 2>&1 &
226
+ nohup python master.py >> /dev/null 2>&1 &
135
227
  log_info "master 已后台启动,日志写入 vibe.log"
136
228
 
137
229
  # 健康检查:等待 master 上线并验证关键 worker
138
- if ! python3 scripts/master_healthcheck.py --project hyphavibebotbackend; then
230
+ if ! python scripts/master_healthcheck.py --project hyphavibebotbackend; then
139
231
  log_error "master 健康检查失败,请查看 logs/start.log / vibe.log"
140
232
  exit 1
141
233
  fi
@@ -0,0 +1,66 @@
1
+ #!/usr/bin/env bash
2
+ # 测试依赖检查函数的逻辑
3
+ set -euo pipefail
4
+
5
+ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
6
+
7
+ echo "=== 测试依赖检查函数 ==="
8
+ echo "ROOT_DIR: $ROOT_DIR"
9
+ echo ""
10
+
11
+ # 从start.sh提取check_deps_installed函数进行测试
12
+ check_deps_installed() {
13
+ if [[ ! -d "$ROOT_DIR/.venv" ]]; then
14
+ echo "❌ 虚拟环境不存在"
15
+ return 1
16
+ fi
17
+
18
+ if [[ ! -x "$ROOT_DIR/.venv/bin/python" ]]; then
19
+ echo "❌ 虚拟环境Python解释器缺失"
20
+ return 1
21
+ fi
22
+
23
+ if ! "$ROOT_DIR/.venv/bin/python" -c "import aiogram, aiohttp, aiosqlite" 2>/dev/null; then
24
+ echo "❌ 关键依赖包缺失或损坏"
25
+ return 1
26
+ fi
27
+
28
+ echo "✅ 依赖检查通过"
29
+ return 0
30
+ }
31
+
32
+ # 测试1:检查当前环境
33
+ echo "【测试1】检查当前虚拟环境状态:"
34
+ if check_deps_installed; then
35
+ echo "结果:依赖完整,重启时将跳过pip install"
36
+ else
37
+ echo "结果:依赖缺失,重启时将执行pip install"
38
+ fi
39
+ echo ""
40
+
41
+ # 测试2:检查虚拟环境目录
42
+ echo "【测试2】虚拟环境目录检查:"
43
+ if [[ -d "$ROOT_DIR/.venv" ]]; then
44
+ echo "✅ .venv 目录存在"
45
+ ls -lh "$ROOT_DIR/.venv/bin/python" 2>/dev/null || echo "❌ Python解释器不存在"
46
+ else
47
+ echo "❌ .venv 目录不存在"
48
+ fi
49
+ echo ""
50
+
51
+ # 测试3:检查关键依赖
52
+ echo "【测试3】关键依赖包检查:"
53
+ if [[ -x "$ROOT_DIR/.venv/bin/python" ]]; then
54
+ for pkg in aiogram aiohttp aiosqlite; do
55
+ if "$ROOT_DIR/.venv/bin/python" -c "import $pkg" 2>/dev/null; then
56
+ echo "✅ $pkg 已安装"
57
+ else
58
+ echo "❌ $pkg 未安装"
59
+ fi
60
+ done
61
+ else
62
+ echo "⚠️ 无法检查(Python解释器不可用)"
63
+ fi
64
+ echo ""
65
+
66
+ echo "=== 测试完成 ==="
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vibego
3
- Version: 0.2.9
3
+ Version: 0.2.11
4
4
  Summary: vibego CLI:用于初始化与管理 Telegram Master Bot 的工具
5
5
  Author: Hypha
6
6
  License-Expression: LicenseRef-Proprietary
@@ -1,16 +1,17 @@
1
- bot.py,sha256=4MV72uB4S_D7A6Akm4isN_NPH9CUOUMQi0EWACiAsbQ,250226
1
+ bot.py,sha256=q_aRgSBen4XThKdExfa-6NeX9R_Mgs0UjXYx32rsGzo,249827
2
2
  logging_setup.py,sha256=gvxHi8mUwK3IhXJrsGNTDo-DR6ngkyav1X-tvlBF_IE,4613
3
- master.py,sha256=q_CNNW8L_N4kp7LRQR16XGhboPk-0ocH28D23f40U7k,106675
3
+ master.py,sha256=Qz2NTapUexVvpQz8Y_pVhKd-uXkqp3M6oclzfAzIuGs,106497
4
4
  project_repository.py,sha256=UcthtSGOJK0cTE5bQCneo3xkomRG-kyc1N1QVqxeHIs,17577
5
5
  scripts/__init__.py,sha256=LVrXUkvWKoc6Sb47X5G0gbIxu5aJ2ARW-qJ14vwi5vM,65
6
6
  scripts/log_writer.py,sha256=8euoMlRo7cbtHApbcEoJnwzLABxti-ovJWFLRN1oDQw,3843
7
7
  scripts/master_healthcheck.py,sha256=-X0VVsZ0AXaOb7izxTO_oyu23g_1jsirNdGIcP8nrSI,8321
8
8
  scripts/requirements.txt,sha256=QSt30DSSSHtfucTFPpc7twk9kLS5rVLNTcvDiagxrZg,62
9
9
  scripts/run_bot.sh,sha256=rM2Op_l4mP9asT3VoTwGQuHocwaxiGyQp2l1PLegsY4,4481
10
- scripts/start.sh,sha256=lYCzQcgN_TC1rAhaboKrtnLJQEjBDb3PFQLfaF_j8TA,4047
10
+ scripts/start.sh,sha256=IsNjFWXX3qmFxx_7iiVEidTj9VHBUTkNNbsCPoNSL0E,6782
11
11
  scripts/start_tmux_codex.sh,sha256=4ko72SK7EDJmzXVuLBOz1_S1lLEmgIpLAVuD7mZhpdk,4018
12
12
  scripts/stop_all.sh,sha256=FOz07gi2CI9sMHxBb8XkqHtxRYs3jt1RYgGrEi-htVg,4086
13
13
  scripts/stop_bot.sh,sha256=b9vvrke5jeyO18SEBFZxQD09Gf65BgGzeKtpM8sa60Y,3677
14
+ scripts/test_deps_check.sh,sha256=AeSTucbNuNdOPSGvqVp0m31TVFDb0DmU8gSKg-Y5z2I,1696
14
15
  scripts/.venv/lib/python3.14/site-packages/pip/__init__.py,sha256=_lgs5Mfp0t7AGtI7sTVwxKWquz_vahWWH9kKO1cJusA,353
15
16
  scripts/.venv/lib/python3.14/site-packages/pip/__main__.py,sha256=WzbhHXTbSE6gBY19mNN9m4s5o_365LOvTYSgqgbdBhE,854
16
17
  scripts/.venv/lib/python3.14/site-packages/pip/__pip-runner__.py,sha256=JOoEZTwrtv7jRaXBkgSQKAE04yNyfFmGHxqpHiGHvL0,1450
@@ -429,8 +430,8 @@ vibego_cli/config.py,sha256=33WSORCfUIxrDtgASPEbVqVLBVNHh-RSFLpNy7tfc0s,2992
429
430
  vibego_cli/deps.py,sha256=1nRXI7Dd-S1hYE8DligzK5fIluQWETRUj4_OKL0DikQ,1419
430
431
  vibego_cli/main.py,sha256=e2W5Pb9U9rfmF-jNX9uIA3222lhM0GgcvSdFTDBZd2s,12086
431
432
  vibego_cli/data/worker_requirements.txt,sha256=QSt30DSSSHtfucTFPpc7twk9kLS5rVLNTcvDiagxrZg,62
432
- vibego-0.2.9.dist-info/METADATA,sha256=Fkdl2D7I5PvrsV8QDsbnC8Fd2NTm-D6TfkGaLx3T4oA,10474
433
- vibego-0.2.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
434
- vibego-0.2.9.dist-info/entry_points.txt,sha256=Lsy_zm-dlyxt8-9DL9blBReIwU2k22c8-kifr46ND1M,48
435
- vibego-0.2.9.dist-info/top_level.txt,sha256=R56CT3nW5H5v3ce0l3QDN4-C4qxTrNWzRTwrxnkDX4U,69
436
- vibego-0.2.9.dist-info/RECORD,,
433
+ vibego-0.2.11.dist-info/METADATA,sha256=qdYmMPXO440tHnQCLv6SojrTvBsPqj2Pbi1sUrKp9KI,10475
434
+ vibego-0.2.11.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
435
+ vibego-0.2.11.dist-info/entry_points.txt,sha256=Lsy_zm-dlyxt8-9DL9blBReIwU2k22c8-kifr46ND1M,48
436
+ vibego-0.2.11.dist-info/top_level.txt,sha256=R56CT3nW5H5v3ce0l3QDN4-C4qxTrNWzRTwrxnkDX4U,69
437
+ vibego-0.2.11.dist-info/RECORD,,