日历
Libre WebUI 包含个人日历。每位登录用户都有自己的月视图和周视图,可显示一次性与重复事件;计划自动化也会在同一网格中显示下一次执行和运行历史。
事件
事件包含标题、可选备注、开始时间、可选结束时间、全天标记和可选重复规则。标题和备注使用与聊天和笔记相同的信封进行静态加密。
重复使用共享触发器模型:
| 类型 | 字段 | 含义 |
|---|---|---|
once | at | 单次发生 |
hourly | minute, startHour?, endHour? | 在时间窗口内每小时发生 |
daily | hour, minute | 每天在指定本地时间发生 |
weekly | dayOfWeek, hour, minute | 每周在指定日期发生 |
monthly | dayOfMonth, hour, minute | 每月在指定日期发生 |
yearly | month, dayOfMonth, hour, minute | 每年在指定日期发生 |
重复事件只存储一次。范围查询会在服务器端展开:每个投影事件都携带指向源事件的 baseEventId,因此修改源事件会更新所有未来事件。超过月末的 dayOfMonth 会限制为该月最后一天。所有重复计算均使用服务器本地时区。
命名日历与共享
除默认个人范围外,用户最多可以创建 20 个命名日历,每个日历可设置显示颜色。事件可以携带 calendarId;没有该字段的事件属于始终私有的默认范围。
命名日历通过通用授权模型共享:read 允许接收者在自己的日历旁查看共享日历及事件,write 还允许创建和编辑事件。协作者创建的事件存储在 日历所有者 账户下,因此配额、删除和可移植存档仍属于所有者。每次请求都会重新授权;撤销授权后,下一次读取立即隐藏日历。删除日历会把事件分离回所有者默认范围,并移除授权。
提醒
事件可包含提醒偏移量(reminderMinutes,最多 14 天)。自动化调度器的租约周期会扫描到期提醒,并向事件所有者的收件箱发布 calendar-reminder 通知。每次事件的比较并设置操作保证不会重复触发,包括重复事件。
ICS 导入与导出
GET /api/calendar/export?calendarId= 将日历(或默认范围)下载为 RFC 5545 .ics 文件,其中包含 UTC 时间戳、转义文本、映射自原生重复类型的基本 RRULE,以及提醒的 VALARM 块。POST /api/calendar/import 接受 ICS 载荷(最多 2 MB / 1,000 个事件)并导入可写日历范围。导入器支持 UTC 和浮动时间、全天 DATE 值及简单 FREQ 规则。无法准确表示的规则(INTERVAL、COUNT、UNTIL、EXDATE)会将事件导入为不重复,并在响应中计为已丢弃规则,而不是悄然偏移。
模型访问
三个内置聊天工具以调用用户身份向模型提供日历访问:list_calendar_events(只读)、create_calendar_event 和 delete_calendar_event(后两者有副作用,因此受标准工具审批流程约束)。
API
所有端点都需要身份验证。事件读取包括调用者自己的事件及与其共享的日历;写入需要目标日历的所有权或写入授权。
| 方法 | 路径 | 用途 |
|---|---|---|
GET | /api/calendar/events?from=&to= | 范围内的事件,展开重复项 |
POST | /api/calendar/events | 创建事件 |
PUT | /api/calendar/events/:eventId | 更新事件 |
DELETE | /api/calendar/events/:eventId | 删除事件 |
GET | /api/calendar/calendars | 自有和共享的命名日历 |
POST | /api/calendar/calendars | 创建命名日历 |
PUT | /api/calendar/calendars/:id | 重命名日历或更改颜色 |
DELETE | /api/calendar/calendars/:id | 删除日历(事件会被分离) |
GET | /api/calendar/export | ICS 导出 |
POST | /api/calendar/import | ICS 导入 |
范围查询使用以毫秒表示的纪元 from/to 边界,每次请求最多跨越 13 个月。每位用户最多存储 2000 个事件;标题最多 200 个字符,备注最多 10,000 个字符。