one command release solution for 5.6 - #445
Merged
Merged
Conversation
登录态落磁盘 profile(~/.camoufox-cli/profiles/<platform>/)+ 中央 cookie/UA, 不需要常驻浏览器进程桥接。新模型: - login 子流(有头手动登录)导出 cookie/UA/token 后即 close——不留进程占内存 - 业务/usage 子流用 --session <platform> --persistent 重起无头 session, 从磁盘 profile 恢复登录态,用完即 close - 唯一例外:wx-mp-hunter login(截 QR)不 close,留给紧接的 login-confirm 复用同一进程,login-confirm 导出后即 close - fail-first 并发:session 正忙时不 close(避免 tear down 正在跑的另一个操作) 代码: - wx-mp-hunter.ts: cmdCheck / cmdLoginConfirm 导出后 close - fetch_engagement.py: _cleanup_session 改为真 close(原 pass) - publish_douyin.py: cmd_run finally 改为真 close(原 pass) - twitter_interact.py: twitter_session() context manager 在非 busy 退出时 close 文档:login-manager / browser-guide 边界 + 11 个平台 SKILL.md + spec 统一改为「用完即 close,profile 留盘桥接」说法。 测试:test_twitter_interact.test_like_success 翻转 mock_close 断言 (原 assert_not_called → assert_called_once);test_publish_douyin docstring 更新。 unittest 全绿(twitter 29 / douyin 15)。 附带:wx-mp-hunter.sh 修可执行位 644→755。
该文件测的是 fetch_engagement.py 旧的 Phase 4.6 API(camoufox_open_session / build_metrics_payload / parse_dom_metrics / login_manager_check 等), 这些函数在 2026-07-09 真机验证重写时已全部删除。15 个测试 13 个 AttributeError, 纯死代码,无 CI / config 引用,删之。
camoufox 默认按指纹给移动端窗口比例,有头扫码登录时二维码看不全。 forked camoufox-cli 加 --viewport WxH flag,映射 camoufox-js launch 的 window: [w,h],覆盖指纹默认窗口尺寸。 fork 改动(patches/camoufox-cli/src): - config.ts: ConfigDefaults +viewport,parseViewport() 解析 WxH/[w,h],coerce 接入 - cli.ts: Flags +viewport,--viewport 解析,spawnDaemon/ensureDaemon 透传,USAGE - daemon.ts: 解析 --viewport 传 DaemonServer - server.ts: opts +viewport 传 BrowserManager - browser.ts: launch() 设 launchOpts.window = [w,h] - README.md: flag 说明 skill 改动: - wechat-channels-publish: 登录从「无头截 QR 发图」改为「有头手动扫码」 (视频号扫码页无法无头截 QR),--headed --viewport 1920x1080 - weibo-publish / xianyu-ops: 有头登录加 --viewport 1920x1080 - browser-guide: 文档 --viewport + 澄清只有 wx_mp 能无头截 QR, 视频号/微博/闲鱼等扫码页必须有头 spec docs 同步:platform-login-and-browser-spec / browser-stack-replacement-spec 把 wechat-channel 从「无头截图 QR」移到「有头手动」。 验证:camoufox-cli vitest 全绿(cli/protocol/server-queue 106 + browser 9); --viewport 1920x1080 实测 window.innerWidth=1920 / innerHeight=1019(1080 减标题栏)。
rebase 前快照 e8d88ca 把 baseResp.ret 误改成 baseResp0(未定义标识符), checkRet 一调用即抛 ReferenceError → exit 1。fetch 不走 checkRet 故幸免。
…ON_EXPIRED
camoufox-cli cookies export 写的是裸数组(patches/camoufox-cli/src/commands.ts:323
writeFileSync(path, JSON.stringify(cookies))),但 fetch-retro-data.ts 的 readSession
直接 as SessionData,requireSession 的 !data.cookies 对裸数组判空 → xhs/douyin/bilibili/
kuaishou 取数全部误报 SESSION_EXPIRED,cookie 其实新鲜有效。
readSession 检测 Array.isArray(raw) → 归一化为 {cookies: raw}。实测 xhs-browse 18 条
(web_session+a1 齐全)、bilibili 32、douyin 44 均不再被判空。
camoufox-cli cookies export 写裸数组到 SESSION_FILE,cmdLoginConfirm 读回时取 exported.cookies
(期望 {cookies:[...]})→ undefined → 回退 [] → 把刚导出的 cookies 覆盖成空数组写回。
token/ua 来自别的途径所以 wx_mp.json 只剩空 cookies + token + ua,search/account-posts 无 Cookie 必失败。
读回时 Array.isArray(exported) ? exported : exported?.cookies ?? []。
…M_HOME 移到参数解析后 LM_PLATFORM=$PLATFORM 与 case LM_PLATFORM 块原在参数解析之前,此时 PLATFORM 还是空串 → LM_PLATFORM="" → PLATFORM_HOME="" → 探活 open 空串无效。挪到 -z PLATFORM 校验之后。 (xiaobei 修,技能软链接已同步到代码仓)
借鉴 docs/nodriver_helper_reference.py _check_login_status:按平台查关键 cookie (xhs web_session / bili SESSDATA / dy sessionid+sid_tt+uid_tt 且无 stale / ks webday7 等),读 ~/.openclaw/logins/<session>.json(归一化裸数组)。 旧探活开 camoufox open+snapshot 再 grep "login|登录|扫码|请登录|sign?in",已登录页面 里「登录」文案会假阳性误报 SESSION_EXPIRED,且探活测 camoufox profile 状态、取数读 JSON cookie,两套存储脱节。新探活与取数读同一份 cookie,状态对齐;cookie 缺失必失效, 真伪交 fetch-retro-data 实请求验证。 实测:xhs(18,web_session+a1)/bilibili(32)/douyin(44) 不再误报;kuaishou 无登录文件 正确报 SESSION_EXPIRED。wx_mp 走 wx-mp-hunter 自管,本脚本不涉及。
check-login.ts 重写为两层探活:
- Tier 1 cookie 关键字段存在性(cheap,无网络):xhs web_session、
bilibili SESSDATA/DedeUserID、douyin sessionid+sid_tt+uid_tt(含 stale 检测)、
kuaishou webday7/userId/passToken。借鉴 nodriver_helper _check_login_status。
- Tier 2 pong 真实 authenticated 请求验 session 服务端有效性,借鉴
MediaCrawlerPro-Python media_platform/<p>/client.py pong:
bilibili GET /x/web-interface/nav → code==0 && data.isLogin
kuaishou POST graphql visionProfileUserList → result==1
xhs GET /api/sns/web/v2/user/me(xhsFetch 签名 signFormat=xyw)→ success
douyin GET /aweme/v1/web/history/read/(a_bogus 签名)→ status_code==0
- pong 结果落 ~/.cache/wiseflow-check-login/<p>.json,TTL 600s。复盘每条记录
调一次本脚本,缓存把 N 次 pong 压成 1 次,避免批量签名触 xhs 风控。
- 复用 _shared/relay-sign.ts(xhsFetch / douyinSign),与 fetch-retro-data 同通道。
wx-mp-hunter check 升级为 wx_mp _ping:
- 弃 camoufox open+eval window.location 的 profile 探活(与 fetch 走不同状态源,
曾致误报)。改走 mpFetch GET /cgi-bin/home?t=home/index&lang=zh_CN&token=,
解析 <h2>:「新的创作」→ 有效,「请重新」/scanloginqrcode → 失效。
- 借鉴 wiseflow4-pro/core/wis/wx_crawler.py _ping。纯 HTTP,与 fetch/search
同通道同 cookie 源,消除 profile vs JSON cookie 状态分叉。
已验:bilibili pong 端到端 ok+缓存命中;Tier 1 presence xhs/bili/douyin 通过;
kuaishou 无登录文件正确 exit 2。
顶层注释、camoufox 辅助段、usage help 三处仍写「check 走 camoufox open + snapshot 看跳登录页」,与上一提交改的 _ping 实现不符,顺手同步。
…触发重登 现象:xhs/douyin pong 走 relay-sign.ts,需 OFB_KEY。本机 daemon.env 中 OFB_KEY 为空, pong 报 OFB_KEY 未配置 → 旧逻辑归为 pong 失败 → SESSION_EXPIRED (exit 2) → heartbeat 引导用户重登。但重登救不了——缺签名凭证,新 cookie 照样签不了,业务 fetch 同样 500。 修复: - check-login.ts:签名平台 (xhs/douyin) pong 前先验 OFB_KEY,缺失/空 → 报 SIGN_UNAVAILABLE (exit 1),不写 expired 缓存。bilibili/kuaishou 不需签名,不受影响。 - fetch-and-update-metrics.sh:exit 1 时解析 error 字段,SIGN_UNAVAILABLE 单独报 「签名基础设施不可用,非 cookie 失效——重登无益,请 IT engineer 修 relay 凭证」, 不混入通用 CHECK_LOGIN_FAILED。 已验:xhs/douyin 缺 OFB_KEY → SIGN_UNAVAILABLE exit 1;bilibili 仍 pong ok; shell 端到端正确 surface SIGN_UNAVAILABLE。
fetch-retro-data.ts 的 fetchDouyin 此前只发 aweme_id+msToken+a_bogus,缺抖音 Janus 网关要求的全套 COMMON_PARAMS(device_platform/aid/channel/version_code/ browser_*/webid/verifyFp/fp…),接口回 200 空体,长期取不到数却被当 __no_metrics__ 静默「成功」。实测同 aweme_id:缺 COMMON_PARAMS → 200 空体;补全 → 正常返回 statistics。 抽 _shared/douyin-web.ts 封装 COMMON_PARAMS + webid + msToken + verifyFp + fp + a_bogus 签名 + fetch(douyinWebGet),viral-chaser platforms/douyin.ts 与 published-track fetch-retro-data.ts 共用,消除两处实现漂移。viral-chaser douyinGet 改为委托共享 helper,行为保持(getDouyinVideo 冒烟通过)。 附:fetch-retro-data.ts 同文件携带 xhs 取数改 HTML 路线 (get_note_by_id_from_html + profile 页纯 HTTP 取 xsec_token)的既有改动。
check-session 共享化 - 新增 _shared/check-session.ts:两层探活(Tier1 cookie 关键字段 + Tier2 平台 pong, TTL 600s 缓存)可导入库,导出 verifyCookies/checkSession/buildCookieMap。 pong 借鉴 MediaCrawlerPro 各平台 client:bilibili /x/web-interface/nav、 kuaishou graphql visionProfileUserList、xhs /api/sns/web/v2/user/me、 douyin /aweme/v1/web/history/read/。区分 SESSION_EXPIRED(cookie 问题,应重登) 与 SIGN_UNAVAILABLE(缺 OFB_KEY,重登救不了)。 - published-track/scripts/check-login.ts 改为薄 CLI 包装,复用共享逻辑。 login-manager - 新增 login-manager.sh + scripts/export-and-verify.ts:camoufox-cli 登录 → cookies/identity 导出 → verifyCookies 验证 → 落中央存储的闭环。 - SKILL.md 同步更新流程。 xhs-publish 登录闭环 - 新增 scripts/check-login.ts / creator-session.ts / login-and-verify.ts: 创作者域(creator.xiaohongshu.com,无 web_session)登录与验证。 - xhs-publish.sh / publish_xhs.py / SKILL.md 配套调整。 wx-mp-hunter - 新增 scripts/wx-mp-hunter.sh wrapper;wx_mp_hunter.ts 探活改 HTTP _ping (弃 camoufox profile snapshot grep)。 其他 - viral-chaser session.ts/viral_chaser.ts/SKILL.md、xhs-content-ops fetch_note_content.ts/SKILL.md、wx-mp-publisher SKILL.md、published-track fetch-and-update-metrics.sh/SKILL.md 同步探活/取数链路改动。
login-manager/SKILL.md:重写为 agent 用法导向(Step1-3 命令式 + 背后原理单节), 删除开发者/历史内容。 douyin-publish / xhs-interact / xhs-content-ops / xhs-publish SKILL.md: 登录探活段改写为简洁命令式,对齐最新 check-login.ts / login-manager 流程。 viral-chaser:探活合并进下载脚本(单条下载无法批量,每条自带探活最稳), SKILL.md 删独立 Step 2 探活、并入下载步骤。 wx-mp-hunter:修 --download-images 参数失效(flag 解析后从未调 downloadImages, 现接上下载 + markdown 图片路径改写);SKILL.md Step 0/4 登录描述对齐 HTTP _ping。 wrapper 机制系统性修复(code-repo): - 全部 31 个顶层 wrapper 加 symlink resolution(BASH_SOURCE 经 readlink -f 解到 真 skill dir,否则经 ~/.openclaw/bin 软链调用时 SCRIPT_DIR 错指 bin 目录)。 - 全部 wrapper chmod +x(29 个缺 exec bit,PATH exec 调用报「权限不够」)。 - skill-wrappers.sh:expose_skill_wrappers ln -sfn 后补 chmod +x 根因修复。
systemd user service 不 source shell rc,PATH 只能经 EnvironmentFile 注入 (Linux: daemon.env / Darwin: service-env/ai.openclaw.gateway.env)。 EnvironmentFile 覆盖 unit 的 Environment=(实测 systemd 255),故在 env 文件 把 ~/.openclaw/bin 前置到 PATH,gateway 重启后 agent exec 才能解析 skill wrapper。 幂等:PATH 已含 bin 则跳过,仅改 PATH 行。Darwin/Linux 双格式。
- generate-wenyan-theme: 放宽 --output 路径约束,允许工作区内子目录(如 wenyan-theme/sources.json),writeOutput 自动 mkdir -p 父目录;SKILL.md 统一将采集 JSON + 生成 CSS 引导到 wenyan-theme/ 子目录。仍禁止绝对路径 与 .. 上跳。 - wx-mp-hunter: 在 Agent 行为约束新增第 5 条,要求所有中间/临时 scratch (_wx*.txt、命令输出落盘、二维码等)统一写入 wx-mp-hunter-out/ 子目录。
…file 2026-07-15 xhs-publish 首发即触发风控的根因之一:登录页直接打开 creator 而非先 www, 导出的创作者 cookie 缺 web_session;且 xhs-publish 自带独立 camoufox profile 与 xhs-browse 并存,两个 profile 都涉及消费域会互踢 web_session 致频繁重登暴露。 修复(对齐 AiToEarn loginUrlHome→loginUrl SSO 流程): - login-and-verify.ts:改用共享 session=xhs-browse(login-manager 已预热 www 登录态), open creator.xiaohongshu.com/login?source=official 自动 SSO 重定向,轮询创作者 cookie 落盘, 导出全量 cookie(含 web_session + galaxy_creator)→ personal_info 裸 GET 验过才 commit。 不再独立有头扫码登 creator,前置改为 login-manager check xhs-browse 保活消费域。 - publish_xhs.py load_cookies:合并读 xhs-publish.json(创作者)+ xhs-browse.json(消费者, web_session 最新覆盖);发布门收紧为 a1 + web_session + 任一创作者 token 三者必备; UA 优先 xhs-publish.ua.json 回退 xhs-browse.ua.json。 - creator-session.ts presenceCheckCreator:增加 web_session 存在性检查,与发布门对齐。 - SKILL.md:Step 2 改为两步(先 login-manager check xhs-browse,再 xhs-publish login-verify 自动 SSO),更新登录态管理说明为共享 profile 模型。 同一台机器只剩一个 camoufox profile 涉及小红书消费域,消除互踢;发布同时带 web_session + galaxy_creator,对齐 AiToEarn。残留风险:camoufox(Firefox) 指纹仍与账号 Chrome 历史不同, 需靠持久 session 浏览养号缓解(见 memory 21);账号当前处罚中,改完代码勿立即在该号发布。
relay services/sign/xhs.js 定义两套独立 x-s 算法: - xys(XYS_)→ note 创建 / feed / comment / search 等通用 endpoint - xyw(XYW_)→ data-fetching API(user/me、user_posted、otherinfo), 自 ~2026-03 起对 xys 返回 HTTP 406,必须用 xyw 原注释只写「xyw 用于 user/me 等 data API」未列全,未来加 user_posted/otherinfo 易误用 xys 撞 406。补全端点清单 + 406 背景到 relay-sign.ts / relay_sign.py。 当前各调用点格式已正确(feed/note=xys, user/me=xyw),无代码改动。
refactor(login-manager): 移除冗余描述,简化平台登录态管理说明 refactor(xhs-interact): 更新登录失效处理流程,简化描述 refactor(xhs-publish): 清理描述,简化两步登录说明
两次死机(07-16 14:24 / 20:58)同根因:agent 开浏览器不 close,daemon 堆积撑爆 13GB 机器。14:24 那次 72 open/1 close(search-<ts> 唯一 session), 20:58 那次 9 open/0 close(--persistent session)。 源头兜底(camoufox-cli fork,已全局重装生效): - server.ts: MAX_IDLE_TIMEOUT=60 硬顶,Math.min(opts.timeout??60, 60)——任何 daemon(持久化与否、caller 传多少 --timeout)idle ≤60s 自退。持久化只保登录态 (profile 目录落盘),不保进程活着。watchdog 加 if(this.busy) return 守卫,不误杀 正在跑的长命令(如 wait 90)。 - cli.ts: MAX_CONCURRENT_DAEMONS=6,spawn 新 daemon 前若已达上限,驱逐最老 live daemon(close 它,profile 留登录态)。daemonAlive 探活 + evictForCap helper。 - daemon.ts/cli.ts: 默认 timeout 1800→60,USAGE 同步。 skill 侧(browser-guide §0.3 用后即关):临时 session 用完即 close / 复用同名 session / 持久化≠一直开 / close --all 兜底。源头兜底是最后防线,不是不关的理由。 tests: 默认 timeout 断言 1800→60 + clamp 回归测试,98 测试过。 注:兜底只拦新 daemon,拦不住已在跑的旧 daemon 和不守 close 纪律的 agent;需重启 gateway 让 agent 加载新 camoufox-cli + 新 browser-guide skill。
…rror camoufox_upload() 的 subprocess.run 引用 timeout=UPLOAD_TIMEOUT_S,但该常量 从未声明,调用即 NameError,抖音上传视频直接崩。补声明 300s(大文件上传够用)。
camoufox-cli 原生 cookies export 与 xhs-publish 均导出裸数组, readSession 直接 JSON.parse as SessionData 会致 cookies=undefined, requireSession 误报 SESSION_EXPIRED。对齐 fetch-retro-data.ts / _shared/check-session.ts 的归一化写法。
2026-07-17 真机 spike 暴露 5 个 bug(musk-2030 发布超时根因):
1. 上传完成检测:wait_for_text('上传成功') → wait_for_selector('input[placeholder*="填写作品标题"]')
抖音上传页无'上传成功'文本,表单渲染才是真完成信号。
2. 标题选择器收窄:input[placeholder*='标题'] 会误中付费场景标题,改 '填写作品标题'。
3. 简介:placeholder 是'添加作品简介'非'描述',且为 contenteditable div,value setter 无效。
新 camoufox_type_contenteditable(execCommand insertText,回退 textContent+input)。
4. 自主声明:原完全未实现。新 _select_ai_declaration 点开 Semi-UI 下拉选'内容由AI生成'。
5. 发布按钮:button:has-text('发布') 非 CSS,querySelector 返回 null。改按 innerText 点 button。
发布成功检测:无'发布成功'文本,改 wait_for_url_contains('/content/manage')(跳转即成功)。
cmd_get_link 失败改为非致命(发布已成功,取不到链接只 warn)。
新增 helper:camoufox_wait_for_selector / camoufox_wait_for_url_contains /
camoufox_type_contenteditable / camoufox_click_button_by_text / camoufox_click_leaf_by_text。
transcriber.ts 原把 VOLC_ASR_APP_KEY 塞进 X-Api-App-Key,但旧控制台该字段 要的是数字 APP ID,填 Secret Key 会报 45000010 request and grant appid mismatch。 改为二选一鉴权(优先旧控制台双头): - VOLC_ASR_APP_ID + VOLC_ASR_ACCESS_KEY → X-Api-App-Key=APP_ID, X-Api-Access-Key=Token - VOLC_ASR_APP_KEY → X-Api-App-Key 单头(新控制台) 用真实 audio.wav 实测:旧双头(APPID+Token) 返回 20000000 + 全文;原 bug 复现 45000010。 SKILL.md 环境变量表同步更新。
真机确认(2026-07-17):选完自主声明后需点弹窗右下角粉色「确定」按钮才生效, 故把声明流程合进 fill(填标题→填简介→选声明→点确定),下拉不存在时不阻断。 SKILL.md 同步分步流程与 pitfall,并归一化中文标点为 ASCII。
- it-engineer AGENTS.md「添加环境变量」:技能密钥一律写 state-dir .env(每个 openclaw 进程都加载——gateway/subagent/cron/裸 CLI),daemon.env/service-env 只放 PATH 等启动期运维变量;源码部署和 Docker 都适用。Docker 固定路径段同步 指向 /root/.openclaw/.env。 - setup-crew.sh OFB_ENV.md 生成:文件位置指向 ~/.openclaw/.env(Linux/macOS 同路径),去掉 OS 分支,写入格式统一 dotenv KEY=value。 - viral-chaser SKILL.md 开通流程第 3 步:Doubao-录音文件识别2.0 → 立即使用 → 极速版标签卡(实例 Speech_Recognition_Seed_AUC2000000854311547266)→ 试用; 给小贝 APP ID + Access Token(旧控制台双头),不给 Secret Key。 背景:viral-chaser ASR 报「VOLC_ASR_APP_KEY 未设置」根因是 daemon.env 只对 systemd gateway 生效,self-spawn subagent 是裸 CLI 子进程只读 .env。统一到 .env 消除「同时写两个文件」的分支。
ensureDaemon 复用存活 daemon 时静默丢弃 --headed/headless 不一致,导致 agent 反复起 headed 窗口却始终无头,堆积 41 个 Firefox 窗口撑死低端核显桌面 (2026-07-17 11:59 死机事故根因)。 - 新增 info action(server.ts)返回 session+headless,绕过 fail-first busy 门 - ensureDaemon 查存活 daemon 模式,与请求不一致则 killDaemon(close→SIGKILL 兜底) + 重 spawn,让 flag 真正生效;查不到模式才回退原复用逻辑 - 新增 camoufox-cli info 子命令(客户端直查,不 spawn daemon) - 补 server info 用例 + cli buildCommand info 用例
…e → sc=8 2026-07-18 xiaobei get-link 事故真根因。camoufox_eval(line 148)构造命令时 没带 --persistent,而 camoufox_open/upload/cookies export 都带了。 ensureDaemon 按 session+headless mode 复用 daemon,不查 persistent-ness。daemon 的 persistent 在 spawn 时由 BrowserManager 构造函数固定。cmd_get_link 第一步是 _read_captured_aweme_id → camoufox_eval,若此刻无 daemon 活着,这条不带 --persistent 的 eval 触发 spawnDaemon 起一个非持久 daemon(BrowserManager persistent=null)→ browser.launch 走非持久分支 → camoufox-bin -profile /tmp/playwright_firefoxdev_profile-XXX 临时 profile(无 auth cookie)。后续 camoufox_open --persistent 进来,ensureDaemon 看 session+mode 都匹配就复用这个非持久 daemon,全程跑临时 profile → 登录页 + work_list sc=8。 live 实锤: - 修前 eval(无 --persistent)先起 → open 复用:camoufox-bin -profile /tmp/.../playwright_firefoxdev_profile-Wzz3lD - 修后 eval(带 --persistent)先起 → open 复用:-profile ~/.camoufox-cli/profiles/douyin,work_list sc=0 修:camoufox_eval 加 --persistent。camoufox_click/type/wait 等全走 camoufox_eval,一处全救。 login-manager 统一走 --persistent --headed,不毒 daemon。26 测试过。 关联 memory 26(HttpOnly document.cookie 诊断坑是二次报告的测量错误,真根因在此).
- 载体: GitHub release tarball (route B),不发 npm、无认证、无多 arch 矩阵 - 包名/bin 保留 openclaw(@wiseflow/openclaw),保留官方 mac/Windows 原生 app GUI 选项 - 初始化 delegate 给 openclaw onboard,预填 channel(微信→main)+预填 crew 模板,用户只交互模型供应商+API key - 构建期 pnpm(现状不变,与官方一致),用户期 npm 全局装 tarball - 两个 release artifact 解耦: 引擎 tarball + wiseflow-layer tarball - Docker 降级可选(docker-distribution.md 保留) - P0-P6 阶段拆分,P0 先验 onboard 跳过/预填 channel + npm pack 可用性
- Updated README.md to reflect changes in deployment instructions and Docker Compose usage. - Modified docker-compose.yml to streamline service configuration and naming conventions. - Refactored docker-entrypoint.sh for improved initialization and error handling. - Created docker-bootstrap.sh to centralize application layer preparation during image builds. - Adjusted build-image.sh to align with new image naming and tagging conventions. - Implemented tests for Docker layout to ensure consistency and correctness in deployment structure. - Revised documentation on Docker distribution to clarify usage and configuration steps.
根因(2026-07-19):camoufox-cli daemon 60s 空闲超时(hard max,cli.ts:737)。 login 截 QR 后到 login-confirm 起之间,用户扫码这段无命令间隙若 >60s,daemon 自退 → 浏览器死 → scanloginqrcode 服务端轮询死 → 手机「确认登录」无落地。login-confirm eval 连死浏览器得空 URL,空转 150s 后报「URL 异常: 」。排故中手动 flag 不一致还起出 3+ 野 daemon 抢一个 pidfile([[24]] 复发)。 修1(wx_mp_hunter.ts):cmdLoginQr 幂等——REUSE_WINDOW 内重复 login 不 re-open(re-open 刷新 scanloginqrcode scene_id 作废正在扫的 QR,07:36 根因),只 re-screenshot 同 scene; screenshot 失败才回退 open 新 scene 并标记 regenerated。 修2(camoufox-cli cli.ts):recoverOrphanBrowser(persistent) 在 ensureDaemon→spawnDaemon 前回收孤儿 camoufox-bin——profile 被 lock 占但 daemon sock 已不在时,解 lock symlink 的 camoufox-bin pid,杀进程组 + 清 lock,否则新 spawn 拿不到 profile lock 卡死。 修3 + keep-alive(wx_mp_hunter.ts + 新增 wx_mp_keepalive.mjs):cmdLoginQr 截 QR 后 detached spawn keep-alive(每 20s eval 1 重置 daemon idle timer,上限 5min),pid 入 LoginMarker; cmdLoginConfirm 起手 kill keep-alive 接管轮询,eval 返回空 URL 时明确报「浏览器/daemon 已挂, QR 在间隙被 60s 超时回收,请重新 login」+ 清 marker,不再空转;clearLoginMarker 清前先 kill keep-alive 防孤儿 ping。 验证:login → keep-alive 起(pid 入 marker)→ login-confirm ok:true → check ok:true 「session 有效」h2「新的创作」→ keep-alive/marker/野 daemon 全清。
- .github/workflows/build-dist.yml: matrix build → release tarball,v1 先开 linux-x64 - 删 patches 008/011/012/015/016/017:CI 跑全量 deps 不 strip,由 template extensions disabled 运行时控制 - patches/README.md: 记录删除历史 详见 memory 28 (2026-07-20 更新)
…e_modules,4 平台各塞 portable Node,用户侧 pnpm install --prod
- 砍掉 Node/git/pnpm 安装段(tarball ship 了 portable Node + pnpm) - 核心换成 download tarball → extract → pnpm install --prod --frozen-lockfile - 加 detect_platform_asset / resolve_latest_version / download_and_extract_tarball / pnpm_install_prod / install_python_deps / place_config_template - camoufox-cli 改用本地 fork + portable node npm install -g - prefill/onboard 改用 portable node / wrapper - 加 setup-crew 裸跑(无 --force) - XIAOBEI_MIRROR / XIAOBEI_TAG env 支持 - workflow: asset 名用 git tag 与 install.sh 按 tag 拉对齐
…v Node 钉 24.15.0 与 portable Node 对齐
Issue 2 布局分离: - WISEFLOW_ROOT 默认 ~/.xiaobei(程序:引擎+模板+脚本+工具+wrapper+camoufox-cli fork) - OPENCLAW_HOME 留 ~/.openclaw(运行数据:openclaw.json+daemon.env+workspace-*) - install.sh: daemon.env/macOS env 落 OPENCLAW_HOME;export OPENCLAW_HOME 给 daemon install; setup-crew 传 OPENCLAW_HOME + XIAOBEI_BIN_DIR - setup-crew.sh: OPENCLAW_HOME 可 env 覆盖;4g PATH 前置 program bin(PROJECT_ROOT/bin) 而非 OPENCLAW_HOME/bin(wrapper 已不在 runtime dir) Issue 1 weixin 插件 + awada: - config-templates/openclaw.json 删 plugins.entries.awada(disabled,relay 未就绪) - install.sh 加 install_weixin_plugin:读 openclaw-weixin.version.json pin, openclaw plugins install @tencent-weixin/openclaw-weixin@<ver> --pin(npmmirror),幂等 - build-dist.yml 把 openclaw-weixin.version.json 打进 tarball
Windows(install.ps1,tarball 路线):
- 拉 xiaobei-{tag}-win-x64.tar.gz(Win bsdtar 原生支持 gzip,免装 zstd)
- 解压 → pnpm install --prod → python deps → config → setup-crew(需 bash:Git Bash/WSL)
→ camoufox-cli → weixin 插件 → 交互收 AWK_API_KEY + daemon.env + setx
- workflow: win-x64 出 .tar.gz + bin/openclaw.cmd wrapper(原生 Windows);其余平台仍 .tar.zst
- Next steps 用 [Environment]::SetEnvironmentVariable 注 PATH(setx %PATH% 会截断)
atomgit 国内镜像:
- install.sh resolve_latest_version 优先读 $XIAOBEI_MIRROR/latest.txt(免访问 api.github.com)
- README 加 atomgit install 命令(XIAOBEI_MIRROR=atomgit 仓根,tarball 走 atomgit releases)
README install 殡线更新:
- clone+build+onboard 旧描述 → 预构建 tarball 新路线(步骤/目录职责/系统要求)
- 目录布局:~/.xiaobei 程序 + ~/.openclaw 运行数据(XIAOBEI_HOME/OPENCLAW_HOME 可覆盖)
- 加 Windows PowerShell 命令 + 排障链接
P1+P2 awada 本地插件回归:
- config-templates/openclaw.json 加 plugins.load.paths=["${XIAOBEI_HOME}/awada"] + entries.awada.enabled=false
- build-dist.yml stage 加 rsync awada/(排除 node_modules)
- install.sh install_awada_plugin + install.ps1 Install-AwadaPlugin:awada/ 下 npm install --omit=dev 装 ws+zod
- ensure_env_xiaobei_home 把 XIAOBEI_HOME 写进 daemon.env/macOS env,让 ${XIAOBEI_HOME}/awada env ref 解析
P3 程序目录去隐藏:~/.xiaobei → ~/xiaobei(install.sh/install.ps1/README)
P4 setup-crew.sh OFB_ENV.md 显式写程序目录 + 运行数据目录两行
P5 README 写明 Windows 必须 bash(Git Bash/WSL),无 bash crew 部署跳过
P6 默认走 atomgit 国内镜像,--github/-GitHub 切回 GitHub,--mirror/-Mirror 自定义
P7 install.sh 检测已有 ~/.openclaw/openclaw.json → 走更新路线(只刷 program + rebuild deps + 幂等刷 camoufox/weixin/awada + restart,不碰运行数据);--force 强覆盖(备份旧 config);refresh_gateway_env_only 幂等刷 env + restart。README 升级段改为重跑 install 即升级,update.sh 降为 dev git-clone 路线
feat(docs): 更新 AGENTS.md 和 CLAUDE.md 中 Docker 部署规范 feat(patch): 新增禁用 web 搜索环境变量的补丁 feat(config): 更新 daemon.env.template 中的 DISPLAY 变量注释
- 删 latest.txt 约定:atomgit 每晚同步 tag,改走 Gitea /api/v1/repos/<o>/<r>/releases/latest 取最新 tag,全程不访问 api.github.com;自定义镜像回退 GitHub API - install.sh / install.ps1 首装末尾自动出微信绑定二维码:检测 accounts.json 已绑则跳过,否则循环跑 channels login 等扫码确认(--skip-bind / --no-prompt 跳过,非 TTY 跳过) - README 装好后步骤简化为'脚本最后出二维码,扫码即用' - scripts/README.md 重写为 tarball 路线现状(install.sh/ps1 + update.sh + apply-addons/dev/setup-crew)
|
codes-factory-of-bg seems not to be a GitHub user. You need a GitHub account to be able to sign the CLA. If you have already a GitHub account, please add the email address used for this commit to your account. You have signed the CLA already but the status is still pending? Let us recheck it. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.