vibego 0.2.28__py3-none-any.whl → 0.2.30__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
@@ -623,8 +623,10 @@ def _unescape_if_already_escaped(text: str) -> str:
623
623
 
624
624
  def _prepare_model_payload(text: str) -> str:
625
625
  if _IS_MARKDOWN_V2:
626
- # 先转换标准 Markdown 格式为 Telegram 支持的格式
627
- normalized = _normalize_to_telegram_markdown(text)
626
+ # 先反转义已转义的内容,避免双重转义
627
+ cleaned = _unescape_if_already_escaped(text)
628
+ # 转换标准 Markdown 格式为 Telegram 支持的格式
629
+ normalized = _normalize_to_telegram_markdown(cleaned)
628
630
  # 再进行 MarkdownV2 转义
629
631
  return _escape_markdown_v2(normalized)
630
632
  if _IS_MARKDOWN:
master.py CHANGED
@@ -62,9 +62,28 @@ CONFIG_DB_PATH = Path(os.environ.get("MASTER_PROJECTS_DB_PATH", ROOT_DIR / "conf
62
62
  STATE_PATH = Path(os.environ.get("MASTER_STATE_PATH", ROOT_DIR / "state/state.json"))
63
63
  RUN_SCRIPT = ROOT_DIR / "scripts/run_bot.sh"
64
64
  STOP_SCRIPT = ROOT_DIR / "scripts/stop_bot.sh"
65
- RESTART_SIGNAL_PATH = Path(
66
- os.environ.get("MASTER_RESTART_SIGNAL_PATH", ROOT_DIR / "state/restart_signal.json")
67
- )
65
+
66
+
67
+ def _get_restart_signal_path() -> Path:
68
+ """
69
+ 获取重启信号文件路径,使用健壮的默认值逻辑。
70
+
71
+ 优先级:
72
+ 1. 环境变量 MASTER_RESTART_SIGNAL_PATH
73
+ 2. 配置目录 $MASTER_CONFIG_ROOT/state/restart_signal.json
74
+ 3. 代码目录 ROOT_DIR/state/restart_signal.json(兜底)
75
+
76
+ 这样可以确保 pipx 安装的版本和源码运行的版本使用同一个信号文件。
77
+ """
78
+ if env_path := os.environ.get("MASTER_RESTART_SIGNAL_PATH"):
79
+ return Path(env_path)
80
+
81
+ # 默认使用配置目录而非代码目录,确保跨安装方式的一致性
82
+ config_root = Path(os.environ.get("MASTER_CONFIG_ROOT", Path.home() / ".config/vibego"))
83
+ return config_root / "state/restart_signal.json"
84
+
85
+
86
+ RESTART_SIGNAL_PATH = _get_restart_signal_path()
68
87
  RESTART_SIGNAL_TTL = int(os.environ.get("MASTER_RESTART_SIGNAL_TTL", "1800")) # 默认 30 分钟
69
88
  LOCAL_TZ = ZoneInfo(os.environ.get("MASTER_TIMEZONE", "Asia/Shanghai"))
70
89
  JUMP_BUTTON_TEXT_WIDTH = 40
@@ -2866,6 +2885,18 @@ async def main() -> None:
2866
2885
 
2867
2886
  manager = await bootstrap_manager()
2868
2887
 
2888
+ # 诊断日志:记录重启信号文件路径,便于排查问题
2889
+ log.info(
2890
+ "重启信号文件路径: %s (存在: %s)",
2891
+ RESTART_SIGNAL_PATH,
2892
+ RESTART_SIGNAL_PATH.exists(),
2893
+ extra={
2894
+ "signal_path": str(RESTART_SIGNAL_PATH),
2895
+ "signal_exists": RESTART_SIGNAL_PATH.exists(),
2896
+ "env_override": os.environ.get("MASTER_RESTART_SIGNAL_PATH"),
2897
+ },
2898
+ )
2899
+
2869
2900
  master_token = os.environ.get("MASTER_BOT_TOKEN")
2870
2901
  if not master_token:
2871
2902
  log.error("MASTER_BOT_TOKEN 未设置")
scripts/start.sh CHANGED
@@ -8,6 +8,11 @@ START_LOG="$LOG_DIR/start.log"
8
8
  CODEX_STAMP_FILE="$ROOT_DIR/state/npm_codex_install.stamp"
9
9
  CODEX_INSTALL_TTL="${CODEX_INSTALL_TTL:-86400}"
10
10
 
11
+ # 统一重启信号文件路径:使用配置目录而非代码目录
12
+ # 这样 pipx 安装的 master 和源码运行的 master 可以共享同一个信号文件
13
+ MASTER_CONFIG_ROOT="${MASTER_CONFIG_ROOT:-$HOME/.config/vibego}"
14
+ export MASTER_RESTART_SIGNAL_PATH="$MASTER_CONFIG_ROOT/state/restart_signal.json"
15
+
11
16
  log_line() {
12
17
  local ts
13
18
  ts=$(date '+%Y-%m-%d %H:%M:%S%z')
@@ -251,7 +256,8 @@ if [[ -n "${MASTER_RESTART_EXPECTED:-}" ]]; then
251
256
  fi
252
257
 
253
258
  log_info "准备启动 master 进程..."
254
- nohup python master.py >> /dev/null 2>&1 &
259
+ # 显式传递环境变量给 nohup 进程,确保重启信号文件路径正确
260
+ MASTER_RESTART_SIGNAL_PATH="$MASTER_RESTART_SIGNAL_PATH" nohup python master.py >> /dev/null 2>&1 &
255
261
  MASTER_PID=$!
256
262
 
257
263
  # 健壮性检查:确保进程成功启动
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vibego
3
- Version: 0.2.28
3
+ Version: 0.2.30
4
4
  Summary: vibego CLI:用于初始化与管理 Telegram Master Bot 的工具
5
5
  Author: Hypha
6
6
  License-Expression: LicenseRef-Proprietary
@@ -1,6 +1,6 @@
1
- bot.py,sha256=2CYEIkjH4DKxqa26WEYdFfYc6DttFRLX7buh3acSrKE,271931
1
+ bot.py,sha256=uJcmMJmj5SlpwUXSgtnIEeNiUGkBg-lG5g6kM9BobP4,272046
2
2
  logging_setup.py,sha256=gvxHi8mUwK3IhXJrsGNTDo-DR6ngkyav1X-tvlBF_IE,4613
3
- master.py,sha256=mA8eXtTGHrtqZ3MB4u56unHnq8NEMm3HZ2GikxRFeYY,108225
3
+ master.py,sha256=CHCsjOYAhr_gnNb1Yl7NaOsFQTbRL9CdhLLMIlrx3G0,109337
4
4
  project_repository.py,sha256=UcthtSGOJK0cTE5bQCneo3xkomRG-kyc1N1QVqxeHIs,17577
5
5
  scripts/__init__.py,sha256=LVrXUkvWKoc6Sb47X5G0gbIxu5aJ2ARW-qJ14vwi5vM,65
6
6
  scripts/bump_version.sh,sha256=a4uB8V8Y5LPsoqTCdzQKsEE8HhwpBmqRaQInG52LDig,4089
@@ -9,7 +9,7 @@ scripts/master_healthcheck.py,sha256=-X0VVsZ0AXaOb7izxTO_oyu23g_1jsirNdGIcP8nrSI
9
9
  scripts/publish.sh,sha256=ehLfMedcXuGKJ87jpZy3kuiFszG9Cpavp3zXPfR4h-g,3511
10
10
  scripts/requirements.txt,sha256=QSt30DSSSHtfucTFPpc7twk9kLS5rVLNTcvDiagxrZg,62
11
11
  scripts/run_bot.sh,sha256=rN4K1nz041XBaUJmnBBKHS2cHmQf11vPNX8wf1hbVR4,4596
12
- scripts/start.sh,sha256=Q-PCySQNFL242ScmbLlpp5e1eHZOq6qssZF6DjWrpdk,9546
12
+ scripts/start.sh,sha256=WxByzBXALfjcjhGPCrLHLkaD8hNYZ2WDQAZ0tpoQSeA,9996
13
13
  scripts/start_tmux_codex.sh,sha256=xyLv29p924q-ysxvZYAP3T6VrqLPBPMBWo9QP7cuL50,4438
14
14
  scripts/stop_all.sh,sha256=FOz07gi2CI9sMHxBb8XkqHtxRYs3jt1RYgGrEi-htVg,4086
15
15
  scripts/stop_bot.sh,sha256=ot6Sm0IYoXuRNslUVEflQmJKu5Agm-5xIUXXudJWyTM,5588
@@ -426,14 +426,14 @@ tasks/constants.py,sha256=tS1kZxBIUm3JJUMHm25XI-KHNUZl5NhbbuzjzL_rF-c,299
426
426
  tasks/fsm.py,sha256=rKXXLEieQQU4r2z_CZUvn1_70FXiZXBBugF40gpe_tQ,1476
427
427
  tasks/models.py,sha256=N_qqRBo9xMSV0vbn4k6bLBXT8C_dp_oTFUxvdx16ZQM,2459
428
428
  tasks/service.py,sha256=w_S_aWiVqRXzXEpimLDsuCCCX2lB5uDkff9aKThBw9c,41916
429
- vibego_cli/__init__.py,sha256=FjSJzaPVdmp1eef3N9aYUXfhaRuM8EqSuIpN6P_L51I,311
429
+ vibego_cli/__init__.py,sha256=cGLGVLdOGT2rC2HZZBaLnLPkoa2ofpzKfDuuMEhgNeY,311
430
430
  vibego_cli/__main__.py,sha256=qqTrYmRRLe4361fMzbI3-CqpZ7AhTofIHmfp4ykrrBY,158
431
- vibego_cli/config.py,sha256=33WSORCfUIxrDtgASPEbVqVLBVNHh-RSFLpNy7tfc0s,2992
431
+ vibego_cli/config.py,sha256=VxkPJMq01tA3h3cOkH-z_tiP7pMgfSGGicRvUnCWkhI,3054
432
432
  vibego_cli/deps.py,sha256=1nRXI7Dd-S1hYE8DligzK5fIluQWETRUj4_OKL0DikQ,1419
433
- vibego_cli/main.py,sha256=e2W5Pb9U9rfmF-jNX9uIA3222lhM0GgcvSdFTDBZd2s,12086
433
+ vibego_cli/main.py,sha256=X__NXwZnIDIFbdKSTbNyZgZHKcPlN0DQz9sqTI1aQ9E,12158
434
434
  vibego_cli/data/worker_requirements.txt,sha256=QSt30DSSSHtfucTFPpc7twk9kLS5rVLNTcvDiagxrZg,62
435
- vibego-0.2.28.dist-info/METADATA,sha256=amRMMlsJJzx3J-7kO-KTRsOPNakEnRPPd0iMgwykBk4,10475
436
- vibego-0.2.28.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
437
- vibego-0.2.28.dist-info/entry_points.txt,sha256=Lsy_zm-dlyxt8-9DL9blBReIwU2k22c8-kifr46ND1M,48
438
- vibego-0.2.28.dist-info/top_level.txt,sha256=R56CT3nW5H5v3ce0l3QDN4-C4qxTrNWzRTwrxnkDX4U,69
439
- vibego-0.2.28.dist-info/RECORD,,
435
+ vibego-0.2.30.dist-info/METADATA,sha256=Ksc_G1L5Gn8gIEDXPTVHhQYXereR6HczAjdfEcsAdRc,10475
436
+ vibego-0.2.30.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
437
+ vibego-0.2.30.dist-info/entry_points.txt,sha256=Lsy_zm-dlyxt8-9DL9blBReIwU2k22c8-kifr46ND1M,48
438
+ vibego-0.2.30.dist-info/top_level.txt,sha256=R56CT3nW5H5v3ce0l3QDN4-C4qxTrNWzRTwrxnkDX4U,69
439
+ vibego-0.2.30.dist-info/RECORD,,
vibego_cli/__init__.py CHANGED
@@ -7,6 +7,6 @@ from __future__ import annotations
7
7
 
8
8
  __all__ = ["main", "__version__"]
9
9
 
10
- __version__ = "0.2.28"
10
+ __version__ = "0.2.30"
11
11
 
12
12
  from .main import main # noqa: E402
vibego_cli/config.py CHANGED
@@ -39,6 +39,7 @@ PROJECTS_JSON: Path = CONFIG_DIR / "projects.json"
39
39
  MASTER_DB: Path = CONFIG_DIR / "master.db"
40
40
  MASTER_STATE: Path = STATE_DIR / "master_state.json"
41
41
  MASTER_PID_FILE: Path = STATE_DIR / "master.pid"
42
+ RESTART_SIGNAL_PATH: Path = STATE_DIR / "restart_signal.json"
42
43
  LOG_FILE: Path = LOG_DIR / "vibe.log"
43
44
 
44
45
 
vibego_cli/main.py CHANGED
@@ -148,6 +148,7 @@ def _build_master_env(base_env: Dict[str, str]) -> Dict[str, str]:
148
148
  env["MASTER_PROJECTS_PATH"] = str(config.PROJECTS_JSON)
149
149
  env["MASTER_PROJECTS_DB_PATH"] = str(config.MASTER_DB)
150
150
  env["MASTER_STATE_PATH"] = str(config.MASTER_STATE)
151
+ env["MASTER_RESTART_SIGNAL_PATH"] = str(config.RESTART_SIGNAL_PATH)
151
152
  env["LOG_ROOT"] = str(config.LOG_DIR)
152
153
  env["TASKS_DATA_ROOT"] = str(config.DATA_DIR)
153
154
  env["LOG_FILE"] = str(config.LOG_FILE)