/root/.openclaw/workspace/memory/docs/todo/T025-task-viewer.md v1.0
1. 路径穿越防护
字符过滤 + os.path.realpath 白名单双重校验,防护设计充分。✅
2. Basic Auth 复用
单用户场景,共用凭据合理。⚠️ 轻微:若后续分享链接给他人,会同时暴露 claw 控制台访问权,现阶段不阻塞。✅
3. 自动刷新30秒
合理,任务完成后持续刷新无害。✅
4. log-to-channel.sh 向后兼容
task_id 为可选第4参数,现有3参数调用自动兼容。✅
5. systemd user service User 字段
user service 天然以当前用户运行,无需 User= 字段,模板正确。✅
6. ⚠️ markdown 库 fallback(轻微,供 coder 参考)
方案层面未明确 markdown 库不可用时的降级策略。建议 coder 在 import 时加 try/except,不可用时降级为 <pre> 原文展示,避免服务启动崩溃。
7. ⚠️ Caddyfile 重复追加风险(轻微,供爱衣参考)
cat >> Caddyfile 在重试场景可能产生重复块。建议爱衣质检时先 grep tasks.guuax.com /opt/caddy/config/Caddyfile 确认不存在再执行追加。
方案无阻塞性问题,可进入实现阶段。
markdown 库:3.4.1 ✅(支持 tables / fenced_code / nl2br 扩展)1. task-viewer.py
- 监听 127.0.0.1:8181
- 路由:/ 任务列表、/<task_id>/task、/<task_id>/session、/<task_id>/task.md、/<task_id>/session.md
- 路径穿越防护:re.fullmatch(r'[A-Za-z0-9_\-]+', task_id) + os.path.realpath 白名单双重校验
- markdown 库 try/except fallback:不可用时降级为 <pre> 展示(响应 Reviewer 建议)
- session.md 页面自动刷新 30 秒
- 深色主题(#1a1a2e)
- 404 / 400 错误页
- 无 stdout 输出(log_message 已覆盖)
- Python 语法检查:python3 -m py_compile 通过 ✅
2. task-viewer.service
- systemd user service,无 User= 字段(user service 天然当前用户运行)
- ExecStart 指向正式部署路径 /root/.openclaw/workspace/scripts/task-viewer.py
- Restart=always, RestartSec=5
3. Caddyfile
- 从 /opt/caddy/config/Caddyfile 复制,追加 tasks.guuax.com 块
- Basic Auth 复用现有 hash(syrcco)
- 反代到 127.0.0.1:8181
- 访问日志 /opt/caddy/logs/tasks-access.log
4. log-to-channel.sh
- 增加可选第4参数 task_id(handoff event 为 next_role 之后)
- start event + task_id → 附 ${BASE_URL}/${task_id}/task 链接
- done/retry/fail event + task_id → 附 ${BASE_URL}/${task_id}/session 链接
- handoff event → 不附链接(中间节点)
- 无 task_id 时退化为纯文本,完全向后兼容 ✅
- 向后兼容测试(3参数调用):通过 ✅
- 含 task_id 测试(done/retry):通过 ✅
- bash -n 语法检查:通过 ✅
/root/sandbox/task-120pq4/task-viewer.py/root/sandbox/task-120pq4/task-viewer.service/root/sandbox/task-120pq4/Caddyfile/root/sandbox/task-120pq4/log-to-channel.sh1. 路径穿越防护实现
- 正则 re.fullmatch(r'[A-Za-z0-9_\-]+', task_id) 白名单校验,覆盖 ..、/、空格、\x00 等所有变体。✅
- os.path.realpath 二次验证在 TASKS_DIR + os.sep 前缀内,双重防护。✅
- 手动跑 8 个测试用例,全部通过。✅
2. markdown 库 fallback
- try/except ImportError 降级为 HTML 转义 + <pre> 展示,无 XSS 风险。✅
- 响应了步骤1审计建议。✅
3. Caddyfile 追加格式
- Basic Auth hash 完整,反代端口 8181 正确,日志配置完整。✅
4. log-to-channel.sh 向后兼容
- task_id 为各 event 末尾可选参数,现有3参数调用无需修改。✅
- stdout 无输出,bash -n 语法检查通过。✅
5. task-viewer.py stdout 输出
- 启动时有 print("Task Viewer listening on ...") 输出,进 systemd journal,属调试友好,无功能影响。✅
6. task-viewer.service
- 无 User= 字段(user service 规范),WantedBy=default.target 正确。✅
7. 首页目录遍历
- handle_index 也做了 os.path.realpath 白名单检查,防止列出非预期目录。✅
代码实现无阻塞性问题,可进入爱衣质检阶段。