File size: 2,675 Bytes
8ee19d1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/bin/bash
set -e

# 清理残留锁文件并启动虚拟显示器
rm -f /tmp/.X99-lock
Xvfb :99 -screen 0 1280x800x24 &
export DISPLAY=:99

# 确保数据目录存在且可写
# 注意: /app/data 可能是 HF bucket(FUSE) 挂载点。FUSE 不一定支持 chmod,
# 在 `set -e` 下未加保护的 chmod 失败会让容器崩溃 crash-loop,故用 `|| true` 兜底。
mkdir -p /app/data /app/data/auths /app/data/screenshots 2>/dev/null || true
chmod -R 777 /app/data 2>/dev/null || true

# 数据文件:无条件软链到 data/(确保所有写入都持久化)
for f in .env accounts.json state.json; do
    # data 里没有就创建空文件
    [ -f "/app/data/$f" ] || touch "/app/data/$f"
    # 删除容器内的真实文件(如果不是软链),然后建软链
    rm -f "/app/$f"
    ln -s "/app/data/$f" "/app/$f"
done

# 目录软链
for d in auths screenshots; do
    rm -rf "/app/$d"
    ln -s "/app/data/$d" "/app/$d"
done

# ---------------------------------------------------------------------------
# Self-check: 关键 import 白名单 — 失败即 crash-loop(SPEC-3 §2)
# ---------------------------------------------------------------------------
echo "[self-check] verifying critical imports..."
if ! uv run python - <<'PYEOF'
import sys

# 核心 web 应用入口
from autoteam.api import app  # noqa: F401

# accounts.py 全部对外契约符号(典型 typo 高发区)
from autoteam.accounts import (  # noqa: F401
    load_accounts,
    save_accounts,
    STATUS_ACTIVE,
    STATUS_EXHAUSTED,
    STATUS_STANDBY,
    STATUS_PENDING,
    STATUS_PERSONAL,
    STATUS_AUTH_INVALID,
    STATUS_ORPHAN,
)

# manager → accounts 链路(覆盖跨模块 typo)
from autoteam.manager import sync_account_states  # noqa: F401

# 0515 runtime hardening helpers
from autoteam.runtime_resources import collect_runtime_resource_snapshot  # noqa: F401
from autoteam.playwright_lifecycle import close_playwright_objects  # noqa: F401
from autoteam.playwright_probe import main as playwright_probe_main  # noqa: F401
from autoteam.chatgpt_transport import build_chatgpt_transport  # noqa: F401

print("[self-check] OK: %d critical symbols imported." % 15)
sys.exit(0)
PYEOF
then
    echo "[self-check] FATAL: critical import failed - image is likely stale or broken." >&2
    echo "[self-check] If you just pulled new code, the image must be rebuilt:" >&2
    echo "[self-check]   docker compose down" >&2
    echo "[self-check]   docker compose build --no-cache --build-arg GIT_SHA=\$(git rev-parse --short HEAD)" >&2
    echo "[self-check]   docker compose up -d" >&2
    exit 1
fi
echo "[self-check] passed."

# 执行命令
exec uv run autoteam "$@"