[Feature]: 让 AI 按时出现:会话内定时触发与提醒
Feature Description
功能概述
- 在单个会话内支持“AI 定时触发”(不插入用户气泡),自动产出 AI 回复与工具执行。
- 建立统一通知总线,覆盖桌面 Electron、在线 Web、移动端 PWA;在线用 WebSocket,离线用 Web Push(可选后续接 APNs)。
- 以轻量为原则:优先会话级调度,复用现有消息与权限管线,最小改动接入各 Agent。
用户故事
- 我可以在某个会话设置“每天 9 点自动整理任务”,AI 会在指定时间自动回复并执行工具,无需我手动发消息。
- 我可以设置私人助手,帮我管理日历、 todo 和提醒
- 当我不在线时,仍能在手机锁屏收到重要通知;回到应用后看到未读并能补发到达。
- 我可在会话页管理定时任务(暂停/恢复/删除),查看最近执行结果;必要时开启自动批准工具权限。
Problem Statement
- 目前无法让 AI 在会话中“按计划自主回应/执行工具”,需要人工触发。
- 通知分散(桌面、本地 Web、远程移动),缺少统一抽象与送达确认。
- 移动端场景需要锁屏到达能力(PWA Web Push 在 iOS 16.4+ 可达,但需前提),希望在“至少一次送达”层面有保障。
Proposed Solution
目标与非目标
- 目标
- 会话内定时任务:一次/周期触发、暂停/恢复、重启后恢复。
- ACP/Codex/Gemini 三类 Agent接入,系统触发不插入用户气泡。
- 通知统一分发:Electron 系统通知、WebSocket 页面内提醒、PWA Web Push。
- 送达确认与重试:未读补发、去重与节流、指标监控。
- 非目标
- 不在此阶段实现全局跨会话/跨 Agent 的复杂编排。
- 不迁移桌面端的本地 CLI/MCP 到移动端;移动端仅展示与通知。
- 不上架 iOS 原生 App;如需 APNs,后续评估 Capacitor/原生方案。
核心需求
- 会话内调度
- 创建/编辑/删除/暂停/恢复任务;支持一次与周期( runAt + intervalMs )。
- 并发防重入;应用重启后按会话恢复未完成任务。
- Agent 对接
- ACP/Codex:直接调用 sendMessage({ content, files }) ,不传 msg_id ,只生成左侧 AI 回复。
- Gemini:新增系统触发标志(如 systemTrigger: true ),跳过插入用户气泡;其他流程不变。
- 通知总线
- 事件源:任务启动/完成/失败、权限请求、异常状态。
- 渠道:Electron 系统通知、WebSocket 推送、PWA Web Push(iOS 需“添加到主屏幕”且授权)。
- 标准化内容: title/body/icon/deeplink(conversation_id) ;客户端点击深链回会话。
- 送达保障
- 至少一次:通知先落库为 pending ,客户端 ack 后置为 delivered ;失败重试与上线补发。
- 去重与节流:按 conversation_id+type+window 合并高频事件。
- 指标:送达率、点击率、未读数。
技术方案
- 会话级调度器
- 新增 src/process/services/SessionScheduler.ts :CRUD + 注册/触发 + 恢复。
- 在 src/process/message.ts 接入触发路径,复用现有 AgentManager.sendMessage 。
- Agent 适配
- ACP/Codex:按现状调用 sendMessage ,不传 msg_id 。
- Gemini:在 src/agent/gemini/GeminiAgentManager.ts 引入 systemTrigger?: boolean ,系统触发时跳过用户消息插入(其余逻辑保持)。
- 通知服务
- 新增 src/process/services/NotificationService.ts :订阅会话事件,统一分发到桌面/WebSocket/Web Push。
- WebSocket:在 src/webserver/websocket/ 增加 notification.* 事件与客户端 ack 。
- Web Push:新增订阅路由(如 src/webserver/routes/push.ts ),保存 VAPID 订阅,服务端下发。
- 数据持久
- 任务表: id 、 conversation_id 、 payload 、 run_at 、 interval_ms 、 status 、 created_at/updated_at 。
- 通知表: id 、 user_id 、 conversation_id 、 type 、 title/body/icon/deeplink 、 channel 、 status 、 retry_count 。
- 集成在 src/process/database/ 并与现有初始化流程挂钩。
- 前端/PWA
- PWA:新增 public/manifest.json 、 public/sw.js (或构建输出),订阅逻辑放在 src/renderer/services/ 。
- UI:会话页增加定时任务面板(创建/管理/查看执行结果)、通知 UI(Toast/徽标/未读列表);权限与订阅引导。
里程碑
- 阶段 1:会话内定时器 MVP(接 ACP/Codex,Gemini 支持系统触发)与基本 UI。
- 阶段 2:通知 MVP(Electron + WebSocket),未读列表与 ack 。
- 阶段 3:PWA 化与 Web Push(订阅/权限/引导,“添加到主屏幕”)。
- 阶段 4:可靠性(重试、去重、节流、补发)与审计/指标面板;任务级自动批准。
- 阶段 5(可选):iOS App(Capacitor/原生)与 APNs 渠道适配。
验收标准
- 我能在会话页创建一次/周期任务,任务按计划触发并产生 AI 回复,无右侧用户气泡。
- 各渠道通知都能收到,对应在数据库有 pending→delivered 状态流转,未读上线后自动补发。
- iOS PWA(16.4+,添加到主屏幕并授权)能在锁屏显示 Web Push 通知。
- 并发安全:同一任务不会重入;失败重试与日志可追踪;有基本指标。
风险与对策
- iOS Web Push 依赖“添加到主屏幕”与权限:在 UI 内明确引导与状态显示。
- 高频事件导致噪音:去重与节流策略;摘要化内容。
- Gemini 接口改动风险:以可选标志位实现,保持默认行为不变;单元测试覆盖。
Feature Category
UI/UX Improvement
Additional Context
我可以试着做做
🤖 Hi @xavierliang, I've received your request, and I'm working on it now! You can track my progress in the logs for more details.
@xavierliang 你好!我们对这个提议进行了详细的技术评估,确认方案完全可行!现有代码库已经为大部分功能提供了很好的基础。
技术可行性
现成可用
- Agent 系统:Gemini/ACP/Codex 三类 Agent 都已就绪
-
消息处理:
message.ts提供完整的消息增删改能力 - 数据库:SQLite + 迁移系统可直接扩展
- WebSocket:实时通信机制已实现
- Electron 通知:桌面通知开箱即用
需要新建
-
定时调度器:新增
SessionScheduler.ts -
通知总线:新增
NotificationService.ts - PWA 基础设施:manifest.json + Service Worker + Web Push
简化实现方案
建议分 3 个阶段渐进式实现:
阶段 1:核心调度
// 新增文件结构
src/process/services/
├── SessionScheduler.ts // 任务调度器(CRUD + 定时触发)
└── NotificationService.ts // 通知分发(桌面 + WebSocket)
// 数据库新增表(迁移 v7)
- scheduled_tasks // 任务表
- notifications // 通知记录表
关键实现:
- 使用 Node.js
setTimeout+ SQLite 持久化(无需引入重量级队列) - 复用现有
AgentManager.sendMessage,不传msg_id即可只生成 AI 回复 - Gemini 需新增
systemTrigger?: boolean可选参数跳过用户气泡
阶段 2:桌面 + Web 通知
- Electron 系统通知(已有 API)
- WebSocket 推送 + 客户端 ACK
- 前端 UI:任务管理面板 + Toast 通知
阶段 3:PWA + Web Push
- 生成 VAPID 密钥
- 添加 manifest.json + Service Worker
- 实现订阅路由与推送逻辑
- iOS 引导 UI("添加到主屏幕" + 权限)
需要你确认的细节
在开始实现前,有几个设计细节希望你确认:
-
定时任务 UI 交互
- 你期望的时间选择方式是?
- [ ] 简单选择器(日期 + 时间)
- [ ] Cron 表达式(更灵活但复杂)
- 任务管理入口放在哪里?
- [ ] 会话右上角菜单
- [ ] 会话输入框工具栏
- [ ] 单独的侧边栏
- 你期望的时间选择方式是?
-
工具权限处理
- 定时任务触发时需要工具权限:
- [ ] 每次弹窗确认
- [ ] 任务级自动批准设置
- [ ] 会话级全局自动批准
- 定时任务触发时需要工具权限:
-
通知优先级
- 第一步:桌面 Electron + Web WebSocket
- 第二步:移动端 PWA + Web Push
- 还是你更关注移动端场景?
-
周期任务语法
- 你倾向于:
- [ ] 简单周期(每天/每周/每月 + 时间点)
- [ ] 灵活表达式(如 Cron)
- [ ] 自然语言("每天早上 9 点")
- 你倾向于:
已知限制
-
iOS Web Push:必须"添加到主屏幕" + 用户授权(iOS 16.4+)
- 对策:UI 明确引导,降级使用 WebSocket 在线推送
-
Gemini 接口改动:需测试确保不影响现有流程
- 对策:新增可选参数,默认行为不变
下一步
如果以上方案你认同,或者有新的想法咱们可以继续讨论,非常期待你的贡献!建议:
- 先确认上述设计细节(回复本评论即可)
- 从阶段 1 开始(核心调度 + 桌面通知)
- 我们会提供 Code Review 和技术支持
有任何问题随时在 issue 讨论,或者加入我们的开发者频道交流!
再次感谢你提出这么有价值的功能建议,期待你的实现!
🤖 Hi @kuishou68, I've received your request, and I'm working on it now! You can track my progress in the logs for more details.
🤖 I'm sorry @kuishou68, but I was unable to process your request. Please see the logs for more details.
@kuishou68 这功能我再梳理一下,有几个其他我想开发的功能,相互之间有依赖,梳理完之后也希望能和你们团队讨论一下,看是否与你们的愿景相符
好的,你最近有什么想做的也可以跟我们沟通,符合我们方向的我会协助你一起推进!
Xavier Liang @.***> 于2025年11月24日周一 00:12写道:
xavierliang left a comment (iOfficeAI/AionUi#258) https://github.com/iOfficeAI/AionUi/issues/258#issuecomment-3568115246
@kuishou68 https://github.com/kuishou68 这功能我再梳理一下,有几个其他我想开发的功能,相互之间有依赖,梳理完之后也希望能和你们团队讨论一下,看是否与你们的愿景相符
— Reply to this email directly, view it on GitHub https://github.com/iOfficeAI/AionUi/issues/258#issuecomment-3568115246, or unsubscribe https://github.com/notifications/unsubscribe-auth/AM4NAUYU3RQ6L4NWNS7U3WT36HMGJAVCNFSM6AAAAACKPLFOMWVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZTKNRYGEYTKMRUGY . You are receiving this because you were mentioned.Message ID: @.***>