# 日程管理（calendar）

`calendar` 是 E10 日程管理的聚合命令，覆盖**创建日程、查询列表、查询详情、查询总数、更新日程、删除日程、查询类型/紧急程度字典、应用版本检测** 8 类能力。

```text
weaver-work-cli calendar --help
weaver-work-cli calendar schema
weaver-work-cli --json calendar run <operation> --input-json '{"key":"value"}'
```

`schema` 是能力清单的唯一事实来源，包含每个 operation 的 `inputSchema`、`risk`、`requiresConfirmation`。

## 实现位置

| 路径 | 职责 |
| --- | --- |
| `src/shortcuts/calendar/index.ts` | 命令注册与 JSON envelope |
| `src/shortcuts/calendar/manifest.ts` | `schema` 契约 |
| `src/shortcuts/calendar/host.ts` | E10 会话桥接、datajson/ESB 两类请求、响应归一化 |
| `src/shortcuts/calendar/continuation.ts` | 写操作确认链的 HMAC-SHA256 token |
| `src/shortcuts/calendar/operations/read.ts` | 读 operation（list/get/count/priority/type/app.check） |
| `src/shortcuts/calendar/operations/write.ts` | 写 operation（create/update/delete prepare→apply） |
| `src/shortcuts/calendar/operations/registry.ts` | operation 注册表与去重校验 |

## 认证

复用 `src/internal/e10` 的 E10 会话（`requireE10Session`），请求自动携带 `Cookie`、`eteamsid`、`User-Agent`。业务代码不接触认证目录。所有 `datajson` 结构接口的 `header.operator` 由 CLI 自动填充为当前登录用户。

## operation 清单

| operation | 类型 | 用途 |
| --- | --- | --- |
| `calendar.list` | read | 分页查询日程列表（ESB 流程触发，`uniqueIndent` 固定） |
| `calendar.get` | read | 按 ID 查询单条日程详情 |
| `calendar.count` | read | 查询日程总数 |
| `calendar.priority.list` | read | 查询紧急程度选项 |
| `calendar.type.list` | read | 查询日程类型选项 |
| `calendar.app.check` | read | 应用版本检测（要求 >= 4.1.4） |
| `calendar.create.prepare` / `.apply` | high-risk-write | 创建日程 |
| `calendar.update.prepare` / `.apply` | high-risk-write | 更新日程（全量覆盖） |
| `calendar.delete.prepare` / `.apply` | high-risk-write | 删除日程（不可逆） |

## 两类请求结构

- **datajson 结构**（创建/查询详情/总数/更新/删除/类型/紧急程度）：请求体 `{datajson: {...}}`，业务成功判定 `datajson.status === true`。
- **ESB 直接 JSON**（列表查询）：请求体 `{customParams, moduleSource, uniqueIndent}`，业务成功判定 `resultCode === 200`。

`host.ts` 的 `isBusinessSuccess` 统一判定，operation 层无需关心差异。

## 写操作确认链

创建、更新、删除全部走 `prepare -> apply`：

1. `prepare` 只归一化、补默认值、查当前数据（更新/删除）、生成预览和 continuation，不写入。
2. `apply` 必须带 `confirm=true` 与 prepare 返回的 continuation。
3. continuation 绑定 `baseUrl`/`profile`/`userId`，10 分钟有效；变化触发 `context_mismatch`，字段指纹变化触发 `target_changed`。
4. 网络中断抛 `partial/write_uncertain`，禁止自动重试，先做只读回查。

## 关键业务规则

- **参与人默认带当前人**：未传 `participants` 自动用当前用户；指定他人时当前人仍默认包含。
- **时长默认 1 小时**：只传 `start_time` 时自动补 `end_time`。
- **更新为全量覆盖**：`update.prepare` 先查当前详情，把 `[{name,id}]` 数组字段转标量 ID 再合并用户修改。
- **Switch 字段**（`all_day`/`remind`/`part_receipt`）传数字 `0`/`1`，禁止布尔值。
- **`agn_type`/`priority` 传选项 ID**，`participants` 传人员 ID，均非语义字符串/姓名。

## 调用示例

Windows PowerShell：

```powershell
weaver-work-cli --json calendar run calendar.list --input-json '{"page_no":1,"page_size":10}'
```

macOS/Linux（bash/zsh）：

```bash
printf '%s\n' '{"page_no":1,"page_size":10}' | weaver-work-cli --json calendar run calendar.list --input -
```

## 测试

```text
node --test --import tsx "test/business/calendar-*.test.ts"
```

覆盖 manifest/registry 一致性、请求形状断言、写操作确认链、响应归一化与错误形状。
