Repository navigation
Conversation
Replace legacy interest/catalog processing with chat, task and proactive agents, durable PA metadata, cron-slot scheduling and asynchronous reminder delivery. Add ASR/TTS, configurable voice auto-send/narration, Qwen model defaults and current-workflow benchmarks. Fix snapshot starvation, provider error details, voice cache invalidation and outdated or nondeterministic regression fixtures. Validation: Python unit suite (3546 passed, 46 skipped), benchmark regression (11 passed), desktop unit (59 passed), Electron E2E (30 passed), development startup, typecheck, documentation tests (20 passed) and documentation build. Live provider and physical microphone integration were not run.
Load PA runtime dependencies only when its fixture is requested so package metadata checks run without application dependencies. Check JSON error locations against the active interpreter, including trailing-comma and invalid-value inputs on Python 3.13 and 3.14. Apply the configured Python and desktop formatters, document public helpers, and keep intentional private fixture/owner access scoped to its modules. Validated full pre-commit, 3548 unit tests, isolated Python 3.11 packaging checks, 25 focused tests on each of Python 3.13/3.14, distribution build and wheel installation, and the complete desktop CI sequence through macOS packaging and packaged-app validation.
Require explicit reminder kinds, reserve one daily greeting per period, and stop proactive rounds after an evening closing decision. Derive notification windows from the reminder journal and apply them to queued bubbles and native notices. Task agents follow proactive active hours by default and cancel model work at the closing deadline. Migrate callers, prompts, schemas, tests and bilingual documentation; provide an explicit offline journal migration with backups. Validation: 3609 unit tests passed, 46 skipped; 62 desktop tests passed; 20 documentation tests and build passed; typecheck and scoped pre-commit passed.
This branch has not been deployed
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.
Summary
本 PR 将 Remy 的对话、主动关注、任务执行、桌面呈现和语音交互接成完整流程:主人通过对话表达需求,任务 Agent 按独立 cron 收集资料并发布累计摘要,主动 Agent 消费结果并判断是否提醒,桌面端负责聊天、语音和提醒展示;Studio 则使用独立的普通聊天入口。
以下说明覆盖本分支相对
main的全部 9 个提交、319 个文件变更,基于当前提交c3082dd7,包含桌面端、后端重构、独立 Cron 调度、提醒规则、Studio 普通聊天、资源工具、评测和 CI 修复。按主题说明改动
1. 三 Agent 职责与 Prompt 拆分
pa_chat.py/pa_chat.yamlproactive_agent.py/proactive_agent.yamltask_agent.py/task_agent.yamlPromptHandler管理,提供中英文版本,公共记忆默认值放在base_pa_step.yaml。2. PA 状态统一归属与文件持久化
PaRuntime直接持有选中会话、会话锁和单个有类型的ProactiveRound,统一负责会话创建、切换、释放及恢复。_pa_tasks.py、_pa_reminders.py、_pa_hints.py分别管理任务文件与累计摘要、提醒投递和可选提示采样。{workspace_dir}/{metadata_dir}/pa/。启动时仅创建缺失文件,保留已有配置、空任务列表和文本内容;无效配置显式报错。session_ids.jsonproactive.jsontasks.jsontask_runs.jsonlproactive_inbox.txtreminders.jsonlhandoff.txtproactive_context.jsonlhint_state.json任务正文另存于
{daily_dir}/YYYY-MM-DD/cron/{task_id}/HHMMSS.md。累计摘要带task_id、run_id、created_at及unread/read/supersededfrontmatter,完整结果不再内嵌在任务执行 JSONL 中。{workspace_dir}/{daily_dir}/personal/MEMORY.md,默认即daily/personal/MEMORY.md。只初始化缺失文件,已有文件不被默认内容覆盖。session_ids.json最后一条恢复,原生对话历史继续由 Codex 管理;旧pa.json的自动迁移代码已移除。3. 独立 Cron 调度、累计摘要与主动唤醒
task_schedule是独立后台 Job,每秒检查tasks.json的文件版本,为每个启用任务创建应用生命周期内的原生 ReMeCronJob。tasks.json,不会覆盖已有工作区任务。task_agent改为私有 Job,参数由单独的query改为完整task对象。每次任务开启新会话:q1 执行 query;q2 继续同一会话,读取该任务最近 1–2 篇已完成记录(可跨日期),合并本轮发现,生成完整累计 Markdown 摘要。{daily_dir}/YYYY-MM-DD/cron/{task_id}/HHMMSS.md,不覆盖旧记录,不发布失败或中断的半成品。read_task_results(limit=3)只消费已完成结果,不触发任务。每个仍在配置中的任务分别返回最多 3 篇最新未读摘要路径,包含暂停任务和此前日期;删除配置项后不再扫描对应目录,但文件保留。read,被累计摘要覆盖的更旧未读版本标为superseded;并发编辑过的文档留待下轮处理。已读指主动 Agent 已消费,不表示主人已读或已收到提醒。0900–2300、轮次结束后间隔 5 分钟运行,最多每 30 秒重新检查配置。任务调度与主动唤醒相互独立,原run_due_tasksJob、Step 和轮次内调度器已删除。tasks_follow_active_hours默认true,任务 Agent 每次模型调用使用相同活动窗口,窗口外直接跳过,执行中的查询在窗口截止时取消;设为false可全天按 cron 执行。晚间收尾只关闭主动交流,独立任务仍遵循自己的活动时段设置。web_search补充证据,相关性、是否有新价值及是否提醒由 Agent 判断。1.0/0.5/0.5,每个适用时段每天最多采样一次,未命中也持久化,重启不会重新抽取;18 条方向提供问候、关怀和生活小彩蛋灵感,Agent 可以忽略,不强制发送。4. 反馈、增量对话读取与提醒投递
send_to_proactive(message)get_proactive_messages()read_conversation(...)read_task_results(limit=3)send_reminder(content, kind)get_reminder(limit=10, offset=0)check_json(path)read_conversation默认读取最近最多 20 轮,保留用户输入与对应回复,排除工具调用和主动消息;默认每条消息最多 2000 字符、总量 20000 字符。读取游标保存到会话注册表,消费前先写恢复记录。kind必填,取值为normal/morning/midday/evening。空内容使用normal,表示不发送,并可撤回同会话的待发提醒。pending、sent、discarded、failed,以及创建、更新、发送、过期时间和原因。sent表示已注入对应原生会话;桌面是否展示、主人是否已读,由展示确认和已读回执分别记录。5. 活动时段、每日问候与通知窗口的强制规则
morning/midday/evening分别要求本轮实际抽中对应 hint,每个本地日期各只能接受一次非空决定;一旦写入提醒日志,即使后来投递失败或废弃,也不能通过重启或切换会话重新占用该问候名额。空决定不占名额。normal。内置问候词检查要求早安、午安、晚安等明确词语匹配特殊 kind,防止通过普通提醒绕过问候类型限制。evening决定就关闭本活动窗口的后续主动交流;收尾消息自身仍允许等待空闲后投递。状态从reminders.jsonl重建,无需另存一套安静状态文件。PaEvent的快照和状态事件增加notifications:绝对starts_at/ends_at和可选closing_message_id。桌面气泡与主动系统通知在排队、展示确认及存续期间复核窗口;收尾后仅允许收尾消息,窗口结束关闭通知,旧消息次日不补弹,聊天历史保留。scripts/migrate_pa_reminder_kinds.py,在停服后显式校验并迁移旧提醒日志,保留.bak,按已保存 hint 的轮次补类型,其余旧记录设为normal。运行时不再兼容缺少kind的旧记录或旧工具参数。6. 资源采集契约与过期清理
BaseConnectorStep统一返回{context: str, paths: list[str]}:文字说明结果和阅读方式,路径指向可逐步展开的工作区文件或目录。resource/screen_capture/{timestamp}_screen_{index}.png,包含采集时间、显示器数量和解释提示,不拼图、不缩放。metadata.json契约与相关 schema。resource_dir,按文件 mtime 清理满 7 天的数据,再删除空目录。check_json支持完整解析、编码识别、读取大小和路径权限限制;失败保留路径、行列和真实解析原因,不修改原文件。7. Agent 执行状态与 SSE 同步
AgentActivity和ActivityTracker,将原生执行事件归一为思考、工具执行、记忆读取、回答、等待确认及终态。PaEvent增加按chat/proactive区分的activities,通过现有快照和状态事件同步;主动临时会话的执行状态可以关联到选中的 PA 对话,由桌面消费。Studio 的普通聊天不再绑定 PA 选中会话。session_status_step,支持不排队等待生成结束的状态查询。8. 桌面客户端、动画与提醒呈现
reme_desktop/Electron + React + TypeScript 客户端,提供透明角色窗口和对话窗口。主进程管理 HTTP/SSE、重连、窗口和本地状态,渲染层通过 sandboxed preload bridge 操作。9. Studio 恢复为独立普通聊天
pa_session/pa_new_session/pa_chat客户端封装;统一通过/chat创建或恢复每个聊天标签自己的会话。session_id,通过session_read同步对应原生历史;保留轮次和最后消息检查,避免迟到快照覆盖当前消息。/chatJob;Remy 桌面使用/pa_*,两者不再共享 PA 选择和控制入口。10. ASR/TTS 组件与默认语音对话流程
BaseASR、BaseTTS、DashScope 后端及共享语音结果 schema,提供asr_demo、tts_demo和 TTS → ASR 的speech_demoJob。voiceAutoSend,只保留可编辑文字。DASHSCOPE_API_KEY配置。默认 ASR 为qwen-audio-3.1-asr-flash,TTS 为qwen-audio-3.1-tts-plus,使用longanhuan_v3.1配置甜美、轻盈、软萌的女声风格。11. 中英文界面与角色资源
12. 模型配置与旧方案清理
qwen3.8-max-0902,保留kimi-k3.1-pro注释;review、子 Agent、原生记忆提取与整合使用同一可覆盖模型配置。xhigh推理配置,并在通用 OAuth Codex 配置中补齐相应默认值。web_search="live",可用性仍受提供方能力约束。FindInterestStep、PushInterestStep、旧 PA 模块和 Prompt、资源发现/确认工具、set_next_wakeup等旧路径;反馈工具合并至feedback.py,提醒工具合并至reminders.py。reme/utils/file_utils.py,由普通文件写入、任务摘要发布、采集清理和记忆演化共同复用。13. 评测、文档和 CI
Contract and data impact
本 PR 包含有意的配置、工具和文件布局迁移:
{digest_dir}/personal/REME_MEMORY.md{daily_dir}/personal/MEMORY.md;旧记忆需要显式迁移,不自动复制或覆盖。{session_dir}/pa.json{metadata_dir}/pa/session_ids.json;旧指针自动迁移已移除,升级旧工作区需要显式迁移选择记录。原生聊天文件不被删除。tasks.json、采集工具的context/paths和独立提醒投递;自定义 Job/内部导入需同步修改。set_next_wakeup和运行时覆盖状态proactive.json的活动时间与间隔,并用check_json检查语法。metadata.jsonTTLresource_dir实际文件 mtime 的独立清理任务。task_agent(query)/run_due_tasks()task_agent(task)、独立task_schedule和只消费结果的read_task_results(limit=3);任务 ID 必填,已有任务定义不会自动补写,旧执行 JSONL 不代替新的 Markdown 摘要。send_reminder(content)和缺少kind的旧 JSONLsend_reminder(content, kind),类型与日志都要求显式迁移;停服后执行scripts/migrate_pa_reminder_kinds.py,保留备份。/pa_*调用/chat与对应会话历史;恢复时移除旧 PA 标签,保留普通聊天及文件草稿。使用 Studio 聊天需在服务配置中提供/chat。hint_probability配置hint_probabilities.morning/midday/evening,存在旧字段时需显式转换。PA 会话和聊天接口服务于 Remy 桌面;Studio 普通聊天单独使用
/chat。新的桌面需要服务端activities与notifications契约,后端和桌面应配套更新;缺少有效通知窗口时不会展示主动提醒。check_json检查 JSON 解析,任务 cron、字段和业务状态由相应 schema/Runtime 校验。迁移旧提醒日志时先停止持有该工作区的服务,再执行:
Validation
基于
c3082dd7,GitHub Actions 的全部 9 类工作流已通过。本次为 PR 描述更新,不重新运行代码测试;下列结果来自最新提交对应的 CI 日志。桌面自动化使用临时 user-data 和模拟 ReMe/ASR/TTS 边界,系统通知事件也由测试模拟。评测案例中的资料和测试数字是合成输入,不作为真实模型成绩;真实模型评测为显式启用的付费入口,本次未运行。当前提交未验证真实麦克风、实时语音提供方、实际 OS 通知授权/投递、物理多显示器/Spaces/全屏行为、Windows/Linux 原生桌面、安装包签名及长期性能;这些也不由 CI 通过结果推导。
Checklist