雨课堂 CLI 与 OH 查询贯通¶
用户反馈 OH 声称雨课堂未接入。现状:GUI 已有完整雨课堂只读客户端;插件 facade 仅提供外部作业快照/刷新;独立 SDK 有部分 exthw 查询,但桌面雨课堂会话未移交,OH 没有对应工具与能力说明。
实现沿用现有 createYuketangSource,为 GUI facade、CLI/SDK 与 OH 提供显式 yuketang 查询:状态、课程、内容目录、作业列表、作业详情、课件/视频详情、公告详情。目录携带可用于下一步查询的源 id,说明默认时间范围与登录路径;保留原 exthw 命令。
桌面已授权 CLI/智能体服务时,通过现有私有原生通道同步雨课堂 Cookie/学校标识;以学校账号和会话 epoch 隔离,凭据不进入模型、公共服务结果或日志。桌面断开仅撤销自己同步的凭据,独立 CLI 已配置的不同会话返回冲突并保留。移动端继续调用应用内客户端。新增桥接不放宽审批或提交作业权限。
OH 增加明确可发现的只读雨课堂工具,提示学校统一登录与雨课堂扫码登录各自状态。补齐中英 CLI 文档与纯模拟回归;检查目录、权限、账号切换、凭据隐藏、同步与断开,再执行类型、构建、Harness 工具回归。条件允许时使用既有登录只读查询,不发送消息或提交作业。
实现与验收¶
- 已添加共享的纯 core 查询服务、GUI facade、CLI/SDK 七项 yuketang 查询、OH 内置 query_yuketang 及两个内置清单的 exthw:read 权限。独立 Agent 提示词说明两个平台分别接入。
- 桌面私有 yuketangSync 已加到原生/daemon 精确白名单,公共 MCP 与服务目录保持不可调用;按账号与 epoch 同步,断开只撤销自身凭据,独立配置冲突可从 yuketang.status 的 desktopSync 读取。旧心跳的 Cookie 回写增加凭据与账号检查。
- 查询目录遍历可用分页、去重重叠条目;失败课程和重复页显式返回 incomplete。作业 horizon 沿用 GUI 语义:保留既往作业,未来截止通常30天,可显式调整;内容目录不按这个 horizon 截断。
- SDK 195、CLI 74、私有同步编排 5、Harness 66 项回归通过;全工作区类型、生产构建、原生构建及 sidecar release 构建通过。通知附件/原 CLI 保护性回归继续通过;中英 i18n 检查 errors 0。
- 当前 dev 的雨课堂会话已成功交给 CLI(desktopSync=synced),真实课程查询到达学校接口并返回 HTTP401;需要用户在雨课堂扫码重登后才能完成真实课程/内容成功验收。此处未声称真实数据查询已成功,学校主登录仍 ready。
- 代码保持原有本地开发状态;未发布新安装包。详见 docs/reviews/2026-10-26-yuketang-agent-access.md。
- 联调发现并修复 CLI 启动先于原生授权恢复而意外关闭后台开关的路径,增加初始化等待与回归(共享运行时现20项)。用户确认未手动关闭,已恢复原 enabled=true、保留 automatic=false;再次重启后查询保持可达,准确返回雨课堂会话过期错误。
后续联调修正¶
上述 HTTP401 后续证实还有 SDK 传输层重建 Cookie 导致的假失效,已改用服务专属隔离 Cookie jar。当前常驻 CLI 已成功读取真实作业,完整结果与微信凭据覆盖问题见 docs/reviews/2026-10-26-rain-wechat-recovery.md。
用户再次转述 OH「没有雨课堂插件」后,发现运行中的二进制已有工具,旧对话却让模型跳过真正的数据查询。此次修补在明确雨课堂读请求时,通过原工具及权限门面先取得实证;仅当前用户请求触发,历史人类消息只用于理解再次查询的目标。保留旧对话并通过真实 IM 的 askOh 调用路径验收,不清空历史,也不替用户发送微信消息。工具失败保留真实错误;预读只读,无自动安装、改配置或提交操作。