## ADDED Requirements ### Requirement: Duplex Communication Channel 应用层与 Service Worker 之间 SHALL 使用 postmessage-duplex 库建立双工通信通道。 #### Scenario: 页面初始化通道 - **WHEN** 页面加载完成 - **THEN** 自动创建 `ServiceWorkerChannel` 实例 - **AND** 等待 SW 就绪后建立连接 - **AND** 连接就绪前的消息 SHALL 自动缓存 #### Scenario: SW 接受新连接 - **WHEN** SW 收到新客户端连接消息 - **THEN** 为该客户端创建独立的通道实例 - **AND** 将通道存入 `Map` ### Requirement: Request-Response Task Creation 任务创建操作 SHALL 使用请求-响应模式,由 SW 返回创建结果。 #### Scenario: 成功创建新任务 - **GIVEN** 用户提交任务创建请求 - **WHEN** SW 验证任务不重复 - **THEN** SW 创建任务并返回 `{success: true, task: SWTask}` - **AND** 应用层根据响应更新本地状态 - **AND** SW 广播 `task:created` 给其他客户端 #### Scenario: 拒绝重复任务 - **GIVEN** 用户提交任务创建请求 - **WHEN** SW 检测到相同参数的任务已存在 - **THEN** SW 返回 `{success: false, existingTaskId: string, reason: 'duplicate'}` - **AND** 应用层 SHALL 不创建新任务 #### Scenario: 多页面同时提交相同任务 - **GIVEN** Tab A 和 Tab B 几乎同时提交相同任务 - **WHEN** SW 串行处理请求 - **THEN** 第一个请求成功创建任务 - **AND** 第二个请求收到重复拒绝响应 - **AND** 两个页面最终状态一致 ### Requirement: Event-Based Status Updates 任务状态变更 SHALL 使用订阅模式通知所有客户端。 #### Scenario: 订阅任务状态变更 - **GIVEN** 页面订阅 `task:status` 事件 - **WHEN** 任何任务状态发生变更 - **THEN** 所有订阅客户端收到状态更新 - **AND** 事件包含 `{taskId, status, progress?, phase?}` #### Scenario: 任务完成通知 - **GIVEN** 页面订阅 `task:completed` 事件 - **WHEN** 任务执行成功完成 - **THEN** 所有订阅客户端收到完成通知 - **AND** 事件包含 `{taskId, result}` ### Requirement: Chat Streaming via Subscribe Chat 流式输出 SHALL 使用订阅模式。 #### Scenario: 订阅 Chat 流式输出 - **GIVEN** 页面发起 Chat 请求 - **WHEN** SW 开始生成响应 - **THEN** 订阅该 chatId 的客户端收到 `chat:chunk` 事件 - **AND** 响应完成时收到 `chat:done` 事件 ### Requirement: Multi-Tab Isolation 多标签页 SHALL 独立管理各自的通道连接。 #### Scenario: 页面刷新重建连接 - **WHEN** 页面刷新 - **THEN** 旧通道自动销毁 - **AND** 新页面建立新通道 - **AND** SW 清理旧 clientId 的通道引用 #### Scenario: 页面关闭清理 - **WHEN** 页面关闭 - **THEN** SW 检测到客户端断开 - **AND** 清理对应的通道资源