# Protocol 中没有默认值的可选字段

## 概述
这些可选字段在 MessageFactory 中没有提供默认值，使用时需要显式传递或留空。

## 1. RegisterMessage
- `clientInfo?: ClientInfo` - 没有默认值
  - `name?: string`
  - `version?: string`
  - `platform?: string`
  - `capabilities?: string[]`
  - `deviceType?: string`
  - `description?: string`
  - `metadata?: Record<string, any>`
- `edgeInfo?: EdgeInfo` - 没有默认值
  - `edgeVersion?: string`
  - `connectionTime?: string`

## 2. RegisterAckMessage
- `sessionId?: string` - 没有默认值
- `error?: { code: string; message: string }` - 根据 success 条件生成
- `serverInfo?: { ... }` - 没有默认值
  - `currentLoad?: number`
  - `maxClients?: number`

## 3. UnregisterMessage
- `reason?: string` - 没有默认值

## 4. UnregisterAckMessage
- `cleanupInfo?: { ... }` - 没有默认值

## 5. CommandMessage
- `retryCount?: number` - 没有默认值
- `metadata?: Record<string, any>` - 没有默认值

## 6. Command 相关
- `parameters?: Record<string, any>` - 没有默认值（所有 Command 类型）
- ComplexCommand 中的可选字段：
  - `deviceId?: number | number[] | string`
  - `deviceType?: string`
  - `operationType?: OperationType`
- GenericCommand 中的可选字段（无默认值，但验证器会检查）：
  - `commandType?: CommandType`
  - `deviceId?: number | number[] | string`
  - `deviceType?: string`
  - `operationType?: OperationType`

## 7. CommandResponseMessage
- `result?: CommandResult` - 没有默认值
- `report?: ReportMessage` - 根据 message 参数条件生成
- `executionTime?: number` - 没有默认值

## 8. HeartbeatAckMessage
- `latency?: number` - 没有默认值
- `serverStatus?: { ... }` - 没有默认值
  - `cpuUsage?: number`
  - `memoryUsage?: number`

## 9. ErrorMessage
- `category?: string` - 没有默认值
- `context?: any` - 根据参数构建，但内部字段可能为空
- `retryable?: boolean` - 没有默认值

## 10. ProgramResponseMessage
- `context?: ProgramContext` - 没有默认值（使用 result 参数）
- `report?: ReportMessage` - 根据 message 参数条件生成
- `executionTime?: number` - 没有默认值

## 11. ProgressUpdateMessage
- `context?: ProgramContext` - 没有默认值
- `command?: DeviceOperationRecord` - 没有默认值
- `report?: ReportMessage` - 根据 message 参数条件生成
  - `code?: string` - 没有默认值
  - `data?: Record<string, any>` - 没有默认值

## 12. DeviceOperationRecord
- `result?: Record<string, any>` - 没有默认值

## 建议

### 可以考虑添加默认值的字段：
1. **retryCount** - 可以默认为 0
2. **metadata** - 可以默认为空对象 {}
3. **latency** - 可以根据时间戳计算
4. **executionTime** - 可以根据开始和结束时间计算

### 不应该有默认值的字段：
1. **sessionId** - 必须由服务器生成
2. **result** - 必须是实际执行结果
3. **error** - 只在错误时存在
4. **serverInfo/serverStatus** - 必须是实际服务器状态
5. **context** - 必须是实际上下文信息

### Gateway 迁移注意事项：
- 这些没有默认值的可选字段，Gateway 可以根据实际情况选择性提供
- 不提供时，字段会被省略（undefined），这符合 Protocol 的设计
- 某些字段（如 metadata）虽然没有默认值，但 Gateway 可以在自己的代码中设置默认空对象