enhancementgood first issuehelp wanted
Metriche repository
- Star
- (29.947 stelle)
- Metriche merge PR
- (Metriche PR in attesa)
Descrizione
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
我可以试着做做