Monotony0315/telegram-codex-control
GitHub: Monotony0315/telegram-codex-control
通过 Telegram Bot 安全地远程控制 Codex CLI 进行软件开发,具备策略管控、审计日志和多种传输模式。
Stars: 1 | Forks: 0
# Telegram Codex 控制
Telegram Codex CLI 远程控制工具,具备基于策略的访问控制、polling/webhook 传输模式以及安全的发布工具链。
关键词:`telegram bot`、`codex cli`、`remote development`、`developer automation`、`webhook`、`sbom`、`signed release`。
## 功能特性
- 指令集:
- `/status`
- `/chat`(`/chat reset`,启用交互模式时,纯文本路由至此)
- `/run `(需确认)
- `/autopilot `(需确认)
- `/codex `(需确认)
- `/files [relative_dir]`
- `/search [relative_dir_or_file]`
- `/read [max_lines]`
- `/download `
- `/report `(需确认;运行针对 `reports/` 的报告撰写 `/run` 提示词)
- `/skills [filter]`
- `/skill `(需确认)
- `/prompts [filter]`
- `/prompt `(需确认)
- `/confirm `
- `/cancel`
- `/logs`
- `/help`
- 传输模式:
- `polling`(默认)
- `webhook`(Telegram `setWebhook` + 本地 HTTP 接收器)
- 安全性:
- 严格的用户/聊天白名单
- 可选的指令策略(`COMMAND_POLICY_PATH`)
- Telegram 文档上传接入工作区(通过 `/upload` 策略门控)
- 仅参数子进程执行(`create_subprocess_exec`,无 shell)
- 日志和出站消息中的 token/secret 脱敏
- 运维:
- SQLite 状态存储 + JSONL 审计
- 当主 Codex 指令因 DNS/网络限制失败时,可选自动回退至 `CODEX_COMMAND_FALLBACK`
- 可选的 Rust `CODEX_LIVE_CORE_COMMAND` 辅助工具,用于标准化 `/chat` 事件流
- macOS `launchd` 和 Linux `systemd --user` 服务脚本
- 包含 SBOM + 制品签名/校验和的发布流水线
## 快速开始
```
cd /path/to/telegram-codex-control
./scripts/bootstrap.sh
```
更新 `.env`:
```
TELEGRAM_BOT_TOKEN=123456:replace-me
ALLOWED_USER_ID=123456789
ALLOWED_CHAT_ID=123456789
WORKSPACE_ROOT=$HOME/Projects
UPLOAD_DIR=.data/uploads
CODEX_COMMAND=/absolute/path/to/codex
# 可选:CODEX_LIVE_CORE_COMMAND=/absolute/path/to/tgcc-live-core
TELEGRAM_INTERACTIVE_MODE=true
TELEGRAM_TRANSPORT=polling
# COMMAND_POLICY_PATH=./command-policy.example.json
```
本地运行:
```
set -a; source .env; set +a
PYTHONPATH=src .venv/bin/python -m telegram_codex_control.main
```
手动构建或刷新可选的 Rust live-core 辅助工具:
```
./scripts/build-live-core.sh
```
## Webhook 模式
设置:
```
TELEGRAM_TRANSPORT=webhook
TELEGRAM_WEBHOOK_PUBLIC_URL=https://your-public-host.example.com
TELEGRAM_WEBHOOK_LISTEN_HOST=127.0.0.1
TELEGRAM_WEBHOOK_LISTEN_PORT=8080
TELEGRAM_WEBHOOK_PATH=/telegram/webhook
TELEGRAM_WEBHOOK_SECRET_TOKEN=replace-me
```
注意:
- `TELEGRAM_WEBHOOK_PUBLIC_URL` 必须是 HTTPS 且可被 Telegram 访问。
- `TELEGRAM_WEBHOOK_SECRET_TOKEN` 在 webhook 模式下是必需的。
- 将 `PUBLIC_URL + WEBHOOK_PATH` 路由到本服务。
- 在 polling 模式下,为了兼容性会自动移除 webhook 注册。
## 指令策略
将 `COMMAND_POLICY_PATH` 设置为 JSON 文件路径。
使用 `command-policy.example.json` 作为模板。
示例:
```
{
"default": { "allow": ["/status", "/chat", "/files", "/search", "/read", "/download", "/report", "/logs", "/help"] },
"rules": [
{ "user_id": 123, "chat_id": 456, "allow": ["*"], "deny": [] },
{
"user_id": 111,
"chat_id": -100222,
"allow": ["/status", "/files", "/read", "/logs"],
"deny": ["/run", "/autopilot", "/codex", "/chat", "/search", "/download", "/report", "/upload"]
}
]
}
```
## 后台服务(自启动)
安装/启动:
```
./scripts/install-service.sh
```
状态:
```
./scripts/status-service.sh
```
卸载:
```
./scripts/uninstall-service.sh
```
## 异地模式(无需 launchctl/ps)
注意:
- 运行 `install-service` 模式或异地模式,两者不可同时运行。
启动:
```
./scripts/offsite-start.sh
```
状态:
```
./scripts/offsite-status.sh
```
停止:
```
./scripts/offsite-stop.sh
```
启用 login-shell 自启动(默认配置文件:`~/.zprofile`):
```
./scripts/install-offsite-login-autostart.sh
```
禁用 login-shell 自启动:
```
./scripts/uninstall-offsite-login-autostart.sh
```
用于测试/特殊情况的可选配置文件覆盖:
```
OFFSITE_LOGIN_PROFILE_PATH=~/.zshrc ./scripts/install-offsite-login-autostart.sh
```
可选 `.env` 调优:
```
OFFSITE_STALE_TIMEOUT_SECONDS=900
OFFSITE_CHECK_INTERVAL_SECONDS=15
```
## 安全发布
构建 + SBOM + 签名/校验和:
```
./scripts/release-secure.sh
```
可选签名设置:
- OpenSSL 密钥:
- `RELEASE_PRIVATE_KEY_PATH=/path/to/private.pem`
- GPG 密钥:
- `RELEASE_GPG_KEY_ID=`
- 强制签名:
- `REQUIRE_ARTIFACT_SIGNATURES=1`
对于 GitHub 标签发布,工作流需要 `RELEASE_PRIVATE_KEY_PEM` 密钥并强制签名。
## 环境变量
- `TELEGRAM_BOT_TOKEN`(必填)
- `ALLOWED_USER_ID`(必填,整数)
- `ALLOWED_CHAT_ID`(必填,整数)
- `WORKSPACE_ROOT`(默认:若 `~/Projects` 存在则使用,否则为 `~`)
- `UPLOAD_DIR`(默认:`.data/uploads`,必须解析到 `WORKSPACE_ROOT` 下)
- `DB_PATH`(默认:`.data/state.db`)
- `AUDIT_LOG_PATH`(默认:`.data/audit.jsonl`)
- `CODEX_COMMAND`(默认:`codex`)
- `CODEX_COMMAND_FALLBACK`(可选;若设置,当 DNS 受限的作业/聊天轮次失败时,daemon 会使用此指令重试)
- `CODEX_LIVE_CORE_COMMAND`(可选;若设置,`/chat` 在回退到直接 Python 子进程路径之前,使用 Rust 辅助工具进行标准化实时事件流处理)
- `TELEGRAM_INTERACTIVE_MODE`(默认:`true`;启用时,纯文本作为 `/chat ` 处理)
- `COMMAND_POLICY_PATH`(可选)
- `TELEGRAM_TRANSPORT`(`polling` 或 `webhook`,默认 `polling`)
- `TELEGRAM_WEBHOOK_PUBLIC_URL`(webhook 模式必填)
- `TELEGRAM_WEBHOOK_LISTEN_HOST`(默认 `127.0.0.1`)
- `TELEGRAM_WEBHOOK_LISTEN_PORT`(默认 `8080`)
- `TELEGRAM_WEBHOOK_PATH`(默认 `/telegram/webhook`)
- `TELEGRAM_WEBHOOK_SECRET_TOKEN`(可选)
- `POLL_TIMEOUT_SECONDS`(默认 `30`)
- `POLL_RETRY_BASE_SECONDS`(默认 `1.0`)
- `POLL_RETRY_MAX_SECONDS`(默认 `30.0`)
- `JOB_TIMEOUT_SECONDS`(默认 `7200`)
- `CHAT_TURN_TIMEOUT_SECONDS`(默认 `1800`,交互式 `/chat` 轮次的绝对超时上限)
- `CHAT_TURN_PROGRESS_TIMEOUT_SECONDS`(默认 `300`,`/chat` 状态检查的静默期阈值;每次检查都会将延续窗口延长至绝对超时上限)
- `CHAT_TURN_RETRY_COUNT`(默认 `1`,交互式 `/chat` 超时的重试次数)
- `CHAT_TURN_RESET_SESSION_ON_TIMEOUT`(默认 `true`,使用新会话重试超时的 `/chat`)
- `SUBPROCESS_ENV_ALLOWLIST`(可选,传入 Codex 子进程的 CSV 环境变量名)
- `SUBPROCESS_ENV_PREFIX_ALLOWLIST`(可选,传入 Codex 子进程的 CSV 环境变量名前缀)
- `SUBPROCESS_HOME`(可选,子进程 `HOME` 的绝对/相对路径覆盖;默认继承启动器的 `HOME`)
- `CONFIRMATION_TTL_SECONDS`(默认 `300`)
- `MESSAGE_CHUNK_SIZE`(默认 `3500`)
- `MAX_DOWNLOAD_FILE_SIZE_BYTES`(默认 `5242880`)
- `MAX_UPLOAD_FILE_SIZE_BYTES`(默认 `5242880`)
- `TELEGRAM_API_BASE`(默认 `https://api.telegram.org`)
## 受限网络环境
当主 Codex 进程因 DNS 类错误失败(例如 `Could not resolve host`、`Errno 8`)时,您可以通过设置以下内容保持 Telegram 执行正常工作:
```
CODEX_COMMAND_FALLBACK=/absolute/path/to/network-enabled-codex-wrapper
```
行为:
- `/run`、`/autopilot`、`/codex`:自动使用 `CODEX_COMMAND_FALLBACK` 重试一次
- `/chat`:自动使用回退指令重试
- 如果 `CODEX_LIVE_CORE_COMMAND` 指向已构建的辅助工具,`/chat` 首先通过该辅助工具流式传输标准化事件
- 如果主指令和回退均失败,bot 会报告失败,但本地工作区指令仍可用(`/files`、`/search`、`/read`、`/download`)
## 测试
```
pytest -q
```
## 文档
- 部署指南:`docs/DEPLOYMENT.md`
- 安全检查清单:`docs/SECURITY.md`
- SEO 检查清单:`docs/SEO.md`
- 变更日志:`CHANGELOG.md`
标签:ChatOps, Codex CLI, JSONL, Launchd, Python, SBOM, SQLite, Streamlit, Systemd, Telegram 机器人, Webhook, 代码助手, 力导向图, 可视化界面, 命令行接口, 子进程执行, 开发者自动化, 文件传输, 无后门, 硬件无关, 签名发布, 访问控制, 轮询, 远程开发, 逆向工具