iOfficeAI/AionUi

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

オープン

#258 opened on 2025/10/28

 (6 件のコメント) (2 件のリアクション) (0 人の担当者)TypeScript (2,999 件のフォーク)auto 404
enhancementgood first issuehelp wanted

Repository metrics

Stars
 (29,947 個のスター)
PR merge metrics
 (PR metrics pending)

説明

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

我可以试着做做

コントリビューターガイド