Skip to content

[Feature]: 让 AI 按时出现:会话内定时触发与提醒 #258

@xavierliang

Description

@xavierliang

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

我可以试着做做

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions