Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
# 本对话的版本约定

- 用户指定:本对话的后续更新统一保存为 `0.4.1-preview`,在 `preview/0.4.1` 分支开发;不要自动递增版本号或添加新的 preview 序号。
- 用户于 2026-10-29 更新约定:后续更改统一记录为 `0.5.1`,在 `preview/0.5.1` 分支开发;不要自动递增版本号或添加 preview 序号。此前 `0.5.0-preview` 已推送并保留。
- 用户于 2026-10-29 本轮明确授权:将 `0.5.1` 源码和用户编写的 README 原样推送并合入公开仓库 `main`;仍通过脱敏独立仓库发布。该次授权不包含安装、切换正在使用的插件或发布 Release;完成后后续改动默认仍只保存在本地,除非收到新指令。
- 当前继续使用的 `0.4.0-preview.1` 是保留版本。不要覆盖其安装目录、已生成的 0.4.0 构建、运行配置、任务数据或 GitHub `main` 分支。
- 新版本改动保存在源码和 Git 提交中。没有新的明确安装指令时,不运行安装器、不切换用户正在使用的插件、不发布 Release 或合并到 `main`。
- 2026-10-26 用户已明确授权:本轮“退出停止所有后台”完成后,正常停止 0.4.0,并安装、打开 0.4.1 供预览。保留 0.4.0 的安装文件和构建备份;后续更新仍沿用上述默认规则。
- 需要构建时,在独立的 0.4.1 源码导出目录构建,避免默认构建路径覆盖现有 0.4.0 产物。
- 用户于 2026-10-28 明确要求“别给我推送”:本轮及后续改动只保存在本地;不推送远程仓库、不发布版本,除非收到新的明确指令。
- 用户于 2026-10-28 授权推送“卡片展开窗口漂移”和备注清理修复的 `0.5.0-preview`,已完成;README 保留用户修改。该次推送授权已履行,0.5.1 默认只保存源码和本地提交,未经新指令不推送、不安装、不发布 Release、不合并 `main`。
- 2026-10-26 用户曾明确授权:当轮“退出停止所有后台”完成后,正常停止 0.4.0,并安装、打开 0.4.1 供预览。该授权仅适用于当轮;0.5.0 未获新安装指令,仍只保存源码和提交。保留 0.4.0 的安装文件和构建备份。
- 需要构建时,在独立的 0.5.1 源码导出目录构建,避免默认构建路径覆盖现有 0.4.0 / 0.4.1 / 0.5.0 产物。
- 测试使用独立数据目录和模拟 RPC/消息通道,不启动真实任务,不发送聊天消息,不更改 Electron 沙箱或系统 ACL。
- 当前工作目录的旧 Git 历史包含私有开发记录。公开提交仍通过脱敏独立仓库 `dist/public-source/codex-continuer`,不得把原开发仓库的历史推送出去。
48 changes: 47 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,51 @@
# 更新记录

## 0.5.1 — 开发中

- 后续版本统一记录为 0.5.1,在 preview/0.5.1 分支开发。
- main 合入检查修正:状态文件的大小检查与读取共用同一文件描述符;HTML 转义回归补充大写及带属性的 SCRIPT 输入,并使用不区分大小写的断言。
- 插件、命令行和桌面共用启动与退出接口;本机配置、固定证书请求和生命周期协调明确分工,统一服务构建及目录核验,保留查询冷启动与完整退出规则。
- 并发查询、打开与完整退出各自合并;启动等待受总时间预算约束,创建进程失败及时返回;退出与重开使用独立启动代次,旧响应和等待不会影响新一轮。新增 23 项生命周期与本地客户端回归。
- 运行链路重构验证:固定源码以两个测试文件并发运行,354 项回归全部通过,包含真实服务冷启动与隐藏窗口启动、退出和反复展开;语法和公开源码检查通过。
- 界面和服务提示改用固定消息标识及显式参数;任务活动、日志、连接、存储和 HTTP 错误保留文本并附带翻译字段,支持重启后和跨窗口切换语言。旧文本与外部输出按原文显示。
- 页面、挂件、旧凭据清理及桌面运行时提供正式模块入口,测试直接调用;移除为执行测试而截取、改写和拼接生产 JavaScript 的做法。
- 消息与测试入口重构验证:新增 10 项契约检查,固定源码中 331 项回归全部通过;中英文页面与挂件共 4 组隐藏窗口验收通过,语法和公开源码检查通过。
- 完整页面和挂件共用请求客户端、任务状态与按钮规则、卡片与详情内容,以及新建和导入表单;保留各自布局,将长模板按内容段落展开。
- 完整页面补齐挂件已有的 35 秒请求超时;两处均在工作运行或暂停过程中隐藏结束按钮,完整详情加载后才开放续作消息编辑。
- 界面重构验证:固定源码以两个测试文件并发运行,321 项回归全部通过;实际隐藏窗口的中英文共 4 组验收通过,覆盖布局、详情编辑和语言切换时草稿与光标保留。语法和公开源码检查通过,未安装或发送真实消息。
- 多轮工作与原聊天额度监测各自定义创建、状态、计数、操作、校验和恢复规则;Manager 按模式分发,工作轮次入口明确拒绝监测记录。
- 新建工作明确记录 direct 模式;兼容迁移旧模式和计数,清理监测记录中遗留的执行字段。重启中的不确定发送立即保存,备份恢复也按模式归一化后暂停。
- 模式重构验证:固定源码副本中 311 项回归全部通过,新增 7 项模式、计数、执行隔离及迁移恢复检查;语法和公开源码检查通过,未启动真实任务或发送真实消息。
- 额度恢复时逐条检查原聊天最新指令的回复:已正常结束并形成最终回复则跳过本次续作;较早的完整回复不阻止新指令的恢复,失败、中断和中途说明不误判为完成。
- 原聊天仍在回复或读取失败时保留待发送记录并稍后重试;队列能力检查后、真正发送前再次核对,避免准备期间完成回复仍被追加消息。跳过不增加次数,不删除监测备注或自定义消息。
- 完整回复检查支持分页历史和旧服务,读取到的聊天正文不写入任务和日志;界面、英文提示、MCP 工具说明和使用文档同步更新。
- 回复检查验证:固定源码副本中 300 项回归全部通过,覆盖多对话筛选、新指令与旧回复、重启、分页读取、发送前补查、读取失败及暂停/额度过期/上限变更;语法和公开源码检查通过,全部使用独立数据和模拟消息通道。
- 已加入的原聊天可在详情中编辑并保存续作消息;挂件和完整页面均支持,清空后按当前语言使用默认消息。
- 编辑不重置发送次数、额度耗尽记录或监测状态;正在发送的消息保留原内容,新内容用于后续发送。独立编辑表单在后台刷新和语言切换时保留输入。
- 完整详情加载后才开放编辑,避免用尚未加载或过期的内容覆盖已保存消息。
- 验证:288 项回归通过,覆盖编辑后的本地持久化和重启、等待恢复时修改、发送中修改、清空后的中英文默认消息及非法输入;独立模拟界面验收保存、取消、草稿和光标保留,未发送真实消息。

## 0.5.0-preview — 开发中

- 修复卡片展开时跳回旧面板位置的问题:以当前卡片和所在屏幕定位,空间不足时换向展开;跟随偏移同步更新,收起恢复卡片原位。已提交的模式状态取代固定尺寸误差阈值,兼容 DPI 读回差异。
- 删除工作记录时同步从自动备份及可解析的恢复副本中移除对应记录、监测备注和自定义消息,避免恢复备份时重新带回;其他任务和设置继续保留。
- 验证:281 项回归通过,包含 3 个原生窗口位置各 12 次展开收起、模拟 DPI 读回偏差下的反复切换,以及删除后的主文件、备份、恢复副本和再次恢复检查。
- 修复切换英文后已缓存的聊天下拉框仍显示中文的问题;加载中、无会话、读取失败等状态同步切换语言,保留已选聊天,避免重新读取或改写聊天标题。
- 新建、导入弹窗与缓存会话列表支持跨窗口语言同步,保留输入内容、勾选状态、焦点、光标和滚动位置;旧弹窗延迟触发的关闭事件不再清除新弹窗状态,过期列表响应不再覆盖新表单。
- 修复聊天读取错误被后台刷新覆盖的问题,导入失败提供重试;补齐英文空列表、日志和范围错误提示,并统一英文界面的标点。
- 英文修复验证:275 项回归通过,语法和公开源码检查通过;真实隐藏窗口复现并验收下拉框即时切换、跨窗口弹窗同步、表单内容与光标保留及快速关闭重开。
- 飞行演示期间隐藏上层额度字样:第 12–12.6 秒淡出,第 18.3–18.9 秒恢复;文字与背景动画共用 60 秒周期和可见性暂停状态。
- 航天器抵达中心后,摩斯电码从第 18.6 秒开始淡入、第 19.2 秒完全显示,比原来提前约 3.2 秒;同步提前星球淡出和逐行揭示,并将电码下移 24 个 SVG 像素,扫描线收拢到电码区域。
- 动画验证覆盖真实 Electron 的飞行遮字、抵达后显码、上下文字间距、减少动态效果,以及保留的一秒额度切换渐变。
- 新增中文 / English 切换,覆盖挂件、完整页面、额度倒计时、表单、设置和托盘菜单;语言保存在本地并同步到其他窗口,旧数据默认中文。
- 空白或仅空白的续作消息在发送时使用当前语言的默认消息:中文“继续”、英文“Continue”;自定义消息保持原文。切换语言保留未提交的设置,不会开启调度。
- 双语验证:269 项回归全部通过;独立数据、模拟 RPC 与桌面桥验收英文表单、首页卡片、详情、完整页面与中英文往返切换,未发送真实消息,未改动现有安装。
- 本对话后续改动统一记为 0.5.0 preview,在 preview/0.5.0 分支开发。
- 点击“加入我的工作”后可填写续作消息;开启监测并确认额度耗尽、恢复后,向原聊天发送该消息。留空或仅空白时发送“继续”,旧记录沿用默认行为。
- 监测备注随记录保存在本地,并展示在首页工作卡片中;长备注显示预览,详情保留完整内容,备注不发送给聊天。
- 挂件、完整页面、HTTP 导入及 MCP 导入使用同一消息字段;保留暂停导入、发送上限和结果不确定时防重复发送的规则。
- 验证:265 项回归通过,语法和公开源码检查通过;退出及 Electron 检查在常规权限环境重跑通过,未修改 Electron 沙箱或系统 ACL。另用独立数据、模拟 RPC 和桌面桥验收真实表单提交、本地保存、首页备注卡片与详情展示,未发送真实聊天消息。

## 0.4.1-preview — 开发中

- MCP 限制为查询和收紧执行范围的操作;创建、恢复、开启及策略修改改由用户在挂件中操作。
Expand All @@ -11,7 +57,7 @@
- 关闭按钮、托盘退出和命令行退出统一结束后台服务、跟随及自启动监听器;正常保存停止后仍未退出时,只清理路径核验通过的所属服务进程树。
- 主动退出后,查询和自动启动不再重建后台服务;手动打开才恢复。演示模式退出与真实服务隔离。
- 本轮用户明确授权停止 0.4.0 并切换预览 0.4.1;旧版安装文件和 main 分支保留。
- 本对话的后续更新固定保存到此版本;保留现有安装版 0.4.0-preview.1。
- 当时约定后续更新固定保存到此版本;2026-10-28 起由 0.5.0-preview 约定取代,保留 0.4.0-preview.1 安装及构建备份。
- 五小时/七天额度的切换间隔由 5 秒延长到 12 秒,淡出换值和淡入的完整过渡由 480 毫秒延长到 1 秒。
- 额度文字与背景装饰动画的隐藏阶段解耦,在可见的紧凑仪表中持续显示;背景的 60 秒动画保留。
- 移除切换时强制读取布局的操作;隐藏、展开面板时仍停止轮播和相关定时器,减少动态效果模式仍直接换值。
Expand Down
2 changes: 2 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

请先提交带最小复现的 Issue 或小范围 PR。调度、审批、发送、存储和访问控制改动应有对应行为回归。测试必须使用临时数据与模拟 RPC/消息通道;不得读取贡献者真实任务、发送真实消息或为了通过测试关闭 Electron 沙箱、修改系统 ACL。

服务组件的职责和协作边界见 [Manager 职责拆分](docs/manager-responsibilities.md)。迁移、持久化和轮次协议分别维护,新增功能通过明确的组件接口接入。

提交前检查日志、截图和 Git diff 是否包含本机路径、聊天 ID、凭据或任务内容。不要提交 data、缓存、运行时或分发包。素材与依赖必须记录来源、许可证和修改日期。贡献按 GPL-3.0-only 提交;第三方原件保留各自版权和许可声明。

公开仓库 main 要求通过 PR 合入、通过 verify 检查并满足签名提交规则,禁止强推和删除;单人维护不强制第二位审批者。不要为绕过签名要求重写旧公开历史。可使用 GitHub 验证签名的网页合并流程,或维护者自行配置并登记签名密钥;自动化不会替维护者生成身份密钥。
Expand Down
28 changes: 19 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,32 @@

监测 Codex 账户额度,在额度恢复后接续指定工作,并通过跟随 Codex 窗口的桌面挂件查看状态。

**开发版本:0.4.1-preview · Windows x64 预览版 · GPL-3.0-only。**
**开发版本:0.5.1 · Windows x64 预览版 · GPL-3.0-only。**

## 功能

- 显示短期、长期额度与重置倒计时;数据未知或超过 90 秒时等待新样本。
- 导入原聊天,确认额度耗尽并恢复后,向原聊天排队发送一次固定“继续”。
- 新建带目标和验收标准的工作,按额度、轮次上限和审批状态推进。
- 提供紧凑仪表、任务面板、托盘、窗口跟随与独立显示;隐藏时暂停界面订阅和动画。
- 本地保存任务与备份,提供存储恢复;所有本地 API 都要求访问凭据。

- 显示短期、长期定量与重置倒计时;数据未知或超过 90 秒等待新样本
- 导入原聊天,确认前期并恢复后,向原聊天发送一次约定消息
- 新建带目标并验收标准的工作,按限额、轮次上限和中间状态推进
- 提供简洁的仪表、任务面板、托盘、窗口紧随独立显示;隐藏时暂停界面订阅和动画
- 本地保存任务与备份,提供存储恢复;所有本地 API 都需要访问凭据
| 紧凑仪表 | 任务面板 |
| --- | --- |
| <img src="docs/images/gauge.png" width="228" alt="紧凑额度仪表"> | <img src="docs/images/panel.png" width="260" alt="任务面板"> |

截图使用演示数据,拍摄于旧版,仅供界面参考。

## 相对上版本的改动

- 你现在可以随意编辑它在额度耗尽后的发送内容
- 解决了即使当前任务已经结束,仍然会对被设置监测的对话发送约定消息的问题
- 拆分了事件处理器的职责,减轻了核心管理器manager.js的负担
- 明确了不同工作的边界,加入了跨模式校验
- 减轻了重复逻辑的使用,稍微优化了石山
- 给依赖文字和源码形状的实现添加了新的协议
- 给英文版装了新的依赖

## 安装

运行需要 Windows x64、Node.js 22.12+(推荐 24),以及已安装、登录并支持插件的 Codex CLI。原聊天接续还需要支持 `queue --thread --message` 的桌面 CLI。源码编译额外需要 Visual Studio Build Tools 的 MSBuild/Roslyn;便携包不需要编译工具。
Expand Down Expand Up @@ -54,7 +64,7 @@ cd codex-continuer

| 模式 | 接续行为 | 停止条件 |
| --- | --- | --- |
| 导入原聊天 | 一次确认的耗尽恢复周期,向原聊天发送一次“继续”;备注仅本地保存 | 暂停、发送次数到限或发送结果不确定;不自动识别原聊天目标完成 |
| 导入原聊天 | 一次确认的耗尽恢复周期,向原聊天发送一次自定义续作消息,留空发送“继续”;备注保存在本地并展示在首页卡片 | 暂停、发送次数到限或发送结果不确定;不自动识别原聊天目标完成 |
| 新建工作 | 按原始目标启动执行轮次,要求结构化完成结果 | 完成、阻塞、无工具活动或轮次到限;模型报告完成仍需核对验收 |

`Start-Continuer.ps1` 打开原生挂件;浏览器凭据链接已停用。本地客户端通过固定证书校验服务身份后才发送凭据。隐藏到托盘仍保留运行;点击关闭按钮或选择“退出 Continuer”会保存状态、停止后台服务和监听器,并结束进程。停止超时后仅清理经安装路径核验的所属服务进程树。退出后,普通状态查询和自动启动不会重新拉起;手动打开挂件可恢复。
Expand Down Expand Up @@ -87,7 +97,7 @@ npm run build:release
## 范围与隐私

- 当前主要验证 Windows x64、Node.js 24、Codex CLI 协议基线 0.153.2;外部接口升级可能需要适配。
- 目前仅支持中文,在工作恢复时也发送且只发送“继续”,对于需求新阶段新引导词的对话可能不适配。
- 界面支持中文和英文;续作消息可在加入工作时自定义,每次额度恢复使用同一条消息,仍需在原聊天中确认工作进展和结果。
- 电脑、服务和原聊天执行端必须可用。排队成功不等于任务完成;已进入 Codex 队列的消息不能由本工具撤回。
- 跨机器、完整真实额度耗尽恢复和长期无人值守仍然需要验收;原生监听器尚未代码签名。
- 凭据由 Codex 管理;本工具的任务、输出、路径、备注和日志仍可能包含私人信息。不要上传 `data/`、`.cache/`、`runtime.json`、令牌或未脱敏诊断以及一切可能涉及安全问题的信息。
Expand Down
14 changes: 13 additions & 1 deletion desktop/geometry.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,18 @@ function placeIndependent(saved, current, workArea, size) {
const y = saved?.y ?? (Math.abs(current.height-size.height)<=1 ? current.y : current.y+current.height-size.height);
return place({ x, y, ...size },workArea,size,{ right: 0, bottom: 0 });
}
function expandFromCard(card, workArea, size) {
const width = Math.min(size.width, workArea.width), height = Math.min(size.height, workArea.height);
const align = (start, length, minimum, available, expanded) => {
const endAligned = start + length - expanded, maximum = minimum + available - expanded;
// Prefer the shared bottom/right edge; near the top/left edge, grow in
// the other direction instead of sliding the card's corner to the edge.
if (endAligned >= minimum && endAligned <= maximum) return Math.round(endAligned);
if (start >= minimum && start <= maximum) return Math.round(start);
return Math.round(Math.max(minimum, Math.min(endAligned, maximum)));
};
return { x: align(card.x, card.width, workArea.x, workArea.width, width), y: align(card.y, card.height, workArea.y, workArea.height, height), width, height };
}
function compactSize(value) { return Number.isFinite(value) ? Math.min(420,Math.max(160,Math.round(value))) : 256; }
function samePlacementContext(a,b) {
return !!a && a.mode===b.mode && a.follow===b.follow && a.compactSize===b.compactSize &&
Expand All @@ -31,4 +43,4 @@ function restoreModePosition(fallback,saved,workArea) {
? {...fallback,x,y} : fallback;
}
const sizes = { compact: { width: 256, height: 256 }, expanded: { width: 432, height: 720 } };
module.exports = { place, placeIndependent, offsetFrom, sizes, compactSize, samePlacementContext, restoreModePosition };
module.exports = { place, placeIndependent, expandFromCard, offsetFrom, sizes, compactSize, samePlacementContext, restoreModePosition };
Loading
Loading