Repository navigation
Releases: G57651/dsh-dual-checkin
Release list
v1.3.12
适配 DSH 0.2.1-rc.3(行为与接口零变化,仅清单声明与依赖对齐)。
engines.dsh:加|| ^0.2.1-rc.3- 三个
@deepseek-ai/dsh-*peer 范围(dsh-client-locale / dsh-client-ui-slots / dsh-host-webserver)同步补^0.2.1-rc.3 - devDependencies 对齐 0.2.1-rc.3
验证:88 条回归用例全绿;客户端 bundle 外壳与 require 解析静态校验通过;按宿主真实判定逻辑对三版本全 PASS。
v1.3.10 — Windows 平台适配
修复
- Windows 默认路径识别:此前
resolveElectronPath只有 macOS 默认路径,Windows 一律抛「请设置 WORKBUDDY_ELECTRON_BIN」。现在 win32 分支按可靠性顺序自动探测:卸载表三个视图(HKCU / HKLM / HKLM WOW6432Node)里的DisplayIcon(剥引号与图标索引,只接受WorkBuddy.exe)与InstallLocation,再到四个默认安装目录(%LOCALAPPDATA%\Programs、%LOCALAPPDATA%、%ProgramFiles%、%ProgramFiles(x86)%下的WorkBuddy\WorkBuddy.exe),候选统一走与显式配置一致的三重校验(realpath+ 常规文件 + 可执行)。自定义盘符安装(如D:\Program Files\WorkBuddy)只有注册表里找得到;探测进程带windowsHide,DSH 无控制台宿主下不再闪黑框。 - Qoder 回退通道在 Windows 可用:
.credentials.yaml的 POSIX 权限校验(mode & 0o077)在 NTFS 上对任何文件都判「过宽」(Windows 无 POSIX 位,文件恒报 666),回退直读通道此前在 Windows 上永远被拒;现在 win32 跳过该校验,实际防护由 NTFS ACL 承担,宿主 credentials-local 服务路径不受影响。 - macOS 分支零改动:默认路径识别、显式
WORKBUDDY_ELECTRON_BIN的优先级均保持原样。
测试
- 回归用例扩到 88 条(离线:隔离
HOME/DSH_HOME/APPDATA/LOCALAPPDATA+ 全桩fetch+ 注册表注入桩,不使用真实凭据、不读本机注册表)。 - 新增 win32 路径用例:注册表输出解析(引号 / 图标索引 / 非 WorkBuddy.exe 拒绝)、候选顺序(注册表命中在前、默认目录兜底、失败视图跳过)、三重校验(同名目录候选被跳过)、全部落空时报错保留
WORKBUDDY_ELECTRON_BIN指引。 - 夹具补
APPDATA/LOCALAPPDATA重定向:Trae 与 WorkBuddy 在 win32 上经它们找凭据,此前 Windows 测试机会读到本机真实登录态,把「无凭据零网络请求」用例打穿。 - 平台相关断言按平台拆分:
X_OK「不可执行」仅 POSIX 可断言(win32 无可执行位概念);落盘失败错误形态 POSIX 报 EISDIR、win32 报 EPERM;S-04 权限用例改为显式注入darwin/win32双平台互证。
升级
替换插件目录或经 DSH 市场安装后重启 DSH;WorkBuddy 从此无需手动设置 WORKBUDDY_ELECTRON_BIN(显式设置仍优先)。
v1.3.9 — 契约收敛与纵深加固
修复
- 三平台共用一份 HTTP 契约:新增
lib/http.mjs(重试 / 退避 / 超时 /Retry-After/AbortSignal透传 /redirect: 'error')。此前 Trae / Qoder / WorkBuddy 各写一份postJson/requestJson/tunables/sleep,重试语义与defaults形状四次漂移(WorkBuddy 的defaults只有 2 个键)。 - 退避带抖动:重试前读上游
Retry-After(秒数或 HTTP 日期,上限 60 秒),否则按retryDelayMs做 ±20% 抖动,避免多平台同时重试对齐;retryDelayMs: 0现在真的表示不等待(此前被回退成默认 5 秒)。 - 卸载 / 热重载真正中止在飞请求:
apply建AbortController,dispose 时 abort 并清空内存里的 Qoder jobToken 与 WorkBuddy 解密密钥(旧实现只置标志位,请求照样跑完且旧闭包继续持有令牌)。 - 落盘脱敏与版本号:写入与读回都剔除名字像凭据的字段(
token/pat/authorization/cookie/secret/apiKey等,含嵌套),快照带schemaVersion: 1。 - 状态文件带 profile 维度:合法 profile 名下写
…-<platform>-<profile>.json,读不到时回退旧全局名,升级不会因为改名而重复签到。 - WorkBuddy 加固:解密子进程的环境变量收窄为白名单(不再整份继承
process.env);WORKBUDDY_ELECTRON_BIN需经realpath+ 常规文件 + 可执行三重校验;缓存的解密密钥在 keyId 轮换后失效重取一次(此前会永久返回 0 个账号直到重启)。 - 并行与容错:WorkBuddy 多账号并行签到(结果顺序稳定);积分刷新时单个账号失败不再放弃整批,全部失败才保留原快照。
- 客户端:多账号逐账号明细上屏(此前只显示首个);签到前后积分对比
creditsBefore → creditsAfter上屏;积分到期提醒上屏(expiringAlert此前零引用);侧栏图标改用官方usePanelInfo读自己的选中态;删除死键intro。 - 修复面板崩溃:响应缺某个平台键时
Ticket读creditsBefore会抛TypeError,已补空值守卫。 - 路由防漂移:新增用例断言 host 注册的
STATUS_ROUTE与客户端fetch的路径字面量一致。 - 回归用例扩到 82 条(离线:隔离
HOME/DSH_HOME+ 全桩fetch,不使用真实凭据);同一套用例在 1.3.8 上 14 条失败、在 1.3.7 上 34 条失败。
v1.3.8 — 安全阻断项与 P0 正确性修复
修复
- 状态路由守卫重写:Host 判定由
startsWith前缀比对改为剥端口后精确匹配,localhost:80.evil.com、127.0.0.1:80.evil.com、[::1]:80.evil.com这类绕过值不再放行;新增回环对端校验(req.socket.remoteAddress),宿主绑0.0.0.0时局域网请求读不到状态;响应补cache-control: no-store、x-content-type-options: nosniff、referrer-policy: no-referrer。 - Qoder PAT 解析不再拼正则:
qoderCredentialRef先过[A-Za-z0-9_.-]白名单再逐行字符串前缀匹配。此前.*/(A|B)/[之类的配置值会从.credentials.yaml读出另一个 ref 的无关密钥,非法正则还会把原始错误字符串经备注上屏。 - 凭据文件权限校验:回退直读
~/.dsh/.credentials.yaml前校验mode & 0o077,过宽即拒绝并提示chmod 600(此前比宿主 credentials-local 更宽松)。 - WorkBuddy 上游域名白名单:
auth.domain必须匹配(^|\.)(workbuddy|codebuddy)\.cn$且不得携带用户名 / 密码 / 端口 / 路径 / 查询,避免被改写的本机文件把任意主机当上游。 - 请求不跟随跳转:三个平台的
fetch显式redirect: 'error'。 - 落盘失败不再把成功签到误报为失败:
saveState与 runner 的 try/catch 解耦,写入失败改为带persistError并记 warn;此前EISDIR等场景面板显示ok:false而 claim 其实已成功,下次启动还会再签一次。 - 失败态负缓存:当日失败快照 60 秒内不再重打上游(此前只有成功快照有短路,故障日面板每 15 秒轮询都各打一次上游)。
creditsBefore不再自毁:积分刷新不再把「签到前」基线覆写为当前值。- 备注清洗:状态路由返回的 note 剥掉换行与控制字符,避免上游响应片段伪造日志行或把不可见字符写进状态文件。
- 重试分类:只对网络故障与
5xx/429重试,4xx快速失败;WorkBuddy 补齐与其他两平台一致的重试;Qoder 的 401 重换 jobToken 不再额外消耗重试额度。 mkdir权限:状态目录创建补mode: 0o700(此前跟随 umask,实测 755)。- 客户端:刷新按钮改发
POST(此前按 GET 发,host 侧「强制重查积分」从未接线);超时 15 秒提到 300 秒;CSS 注入 effect 返回 cleanup(热重载不再堆积<style>);平台清单抽为单一来源;PAT 到期与签到徽标等 8 处文案改走 locale 字典;已签到时也显示备注;删除死代码。 - 工程化:新增
scripts.test、repository与test/回归用例 46 条(离线:隔离HOME/DSH_HOME+ 全桩fetch,不使用真实凭据)。
v1.3.7 — 侧栏图标重设计
变更
- 侧栏签到图标由裸文本「✓」替换为票根对勾线性 SVG:24 viewBox、stroke 2、圆角端点,
currentColor随侧栏主题自适应;对勾居左、右侧打孔虚线,与新版票据卡面板同构。
安装:dsh plugin --profile desktop add dsh-dual-checkin-1.3.7.tgz
v1.3.6 — 面板重设计:总览头 + 票据卡
面板重设计
- 总览头:今日 N/3 已签 · 今日共得积分(大数字)。
- 三张票据卡:平台 · 状态徽标 · 签到时间 · 主数字「本次获得」· 剩余/已使用/3天内到期(虚线账目行,等宽数字对齐)· 撕票锯齿收尾;纵向高度约为旧布局一半。
- Qoder 票据内嵌:PAT 临期(黄)/ 已过期(红)账目行;未签到平台的失败原因显示在票内注释行。
安装:dsh plugin --profile desktop add dsh-dual-checkin-1.3.6.tgz
v1.3.5 — 「今日已签到,跳过」也显示本次获得积分
修复
- 当轮时间窗内
CLAIMED(含 claim 返回replayed: true)时,本轮奖励今天已经到账——无论由 Qoder 客户端还是本插件领取。此前该场景gained为 null,面板「本次获得」显示「—」;现在把本轮宣传金额(100 Credits)填入gained,与 WorkBuddy already 分支行为一致。
安装:dsh plugin --profile desktop add dsh-dual-checkin-1.3.5.tgz
v1.3.4 — 新增 Qoder 纯 PAT 签到
新增 Qoder 平台(纯 PAT 模式)
- 凭据:复用 DSH 凭据服务里已配置的 Qoder PAT(与 dsh-provider-qoder 同一份凭据),或首次启用时在插件配置直接填写
qoderPat+ 到期时间qoderPatExpiresAt。零钥匙串、零解密、零子进程——不读取 Qoder 的任何本机文件。 - 签到协议:
POST /api/v1/jobToken/exchange换短期 jobToken(进程内缓存、临期自动重换、401 自愈且不消耗重试次数)→GET /sash/api/v1/me/campaigns找CLAIM_BENEFIT轮次 →POST .../claim幂等领取(重复领取返回replayed: true不再发币);积分快照走/sash/api/v2/me/usage。 - PAT 生命周期:剩余 ≤
qoderPatExpiringDays(默认 7 天)时面板黄条提醒 + 日志 warn;过期红条提醒;状态在每次面板刷新时实时重算。 - 面板:Qoder 状态卡(签到时间 / 备注 / 积分三列 / 签到前后对比);状态路由新增
qoder键。
修复
- campaigns 的
startAt/endAt为秒级时间戳,此前按毫秒判定导致活动窗口永远视为已关闭(真机发现并修复)。
合并 v1.2.2 重构
本版本在远端 v1.2.2 重构基础上合并 Qoder 能力:resolveLogger 修复日志静默丢失、singleFlight 并发去重、状态文件原子写加固、ctx.webServer 直注册、trae retryTimes 参数对齐、devDependencies 双声明。
安装
dsh plugin --profile desktop add dsh-dual-checkin-1.3.4.tgz或 Web UI 插件页上传该 tarball。首次启用请在插件配置填写 qoderPat(或确认已配置 QODER_MANAGED_CREDENTIAL)与 qoderPatExpiresAt。
v1.2.2 — 重构版:修复日志静默丢失,对外行为与接口不变
对照 DeepSeek Harness 插件开发规范的整理重构,签到流程、请求端点、解密逻辑与面板行为零变化。
修复
- 修复日志静默丢失(开发文档 §10.1「
ctx.logger(name)返回具名 logger」):旧代码把ctx.logger当普通{ warn, info }对象读,宿主为可调用服务形态时所有日志一行不打。现在按可调用形态优先(ctx.logger('dsh-dual-checkin')),对象形态回退——与 dsh-session-manager 0.1.2 的修法一致。
整理(零行为变化)
- 去除冗余双重等待:插件级
inject = ['webServer']已保证apply运行前服务就绪(§2.1),apply 内不再二次ctx.inject(['webServer']),路由直接经ctx.effect注册。 - GET/POST 两个 handler 分支合并为
handleStatus(仅refreshCredits标志不同)。 syncCredits签名中从未使用的runner参数移除;once更名为语义明确的singleFlight;移除未使用的workbuddyDefaultsimport。- 状态文件写入加固:临时文件改为唯一随机名 + 原子改名,并发/崩溃不再可能留下可读到的半截 JSON。
trae.mjs内部整理:EXPIRING_WINDOW_MS归位、postJson重试参数名与 tunables 统一(模块内私有 API)。package.json:按开发文档 §7.3 双声明要求补齐devDependencies(与 peerDependencies 同范围)。
安装
dsh plugin --profile <profile> add github:G57651/dsh-dual-checkin#v1.2.2或 Web UI → Plugins → 安装,填 tarball 绝对路径。签到状态、积分面板与幂等行为与 1.2.1 完全一致(已在隔离 DSH 0.2.0-rc.2 上端到端验证)。
v1.2.1 — 积分端点/同步修复,WorkBuddy 备注与配色统一
🐛 修复
- 剩余积分获取不准 / 同步不及时:Trae 余额端点
ide_user_ent_usage→web_user_ent_usage(对齐 dsh-connect-trae 已验证只读端点),请求体去掉未经验证的req_source;签到状态与积分快照分离——当日已签到不再短路整天,积分按creditsTtlSeconds(默认 300 秒)独立刷新,面板刷新按钮强制重查且不重复签到 - WorkBuddy 备注与 Trae 统一:金额缺失时用签到状态响应的
daily_credit/today_credit兜底,备注统一为「签到成功,获得 +N 积分」;多账号聚合分支同句式 - 「3 天内到期」标签颜色统一:三格标签均恢复二级灰,不再单独变色
- 到期提醒警示色修复:CSS 令牌
--dsw-alias-state-warning-primary(不存在)→--dsw-alias-state-warn-primary,兜底#b7791f→#f59e0b(amber-500,明暗主题一致) - 其他:WorkBuddy 月度包不再误计入 3 天内到期;资源请求体补
PackageEndTimeRangeBegin/End时间窗;queryCredits校验业务码、失败可诊断;秒级时间戳不再当毫秒解析;启动 Promise 纳入ctx.effect托管;新增同名Configschema(可调值全部入配置);dsh.client.inject改真实包名并补齐 peerDependencies
📦 安装
CLI(推荐)
dsh plugin --profile desktop add github:G57651/dsh-dual-checkin升级已有安装
dsh plugin --profile desktop add https://github.com/G57651/dsh-dual-checkin/releases/download/v1.2.1/dsh-dual-checkin-1.2.1.tgzWeb UI:Plugins 页 → Git 填 github:G57651/dsh-dual-checkin;或下载本页附件 tarball 后 dsh plugin --profile desktop add ./dsh-dual-checkin-1.2.1.tgz