fix(chat): heal task bubble pending after completed run
@@ -15,7 +15,7 @@ allowed_environments: ["env:dev"]
|
||||
mutex: "full-system-browser-e2e"
|
||||
review_state: fail_partial
|
||||
integration_state: pending
|
||||
deployment: not_required
|
||||
deployment: dist_rsync_dev
|
||||
cleanup: pending
|
||||
remote_sync: not_requested
|
||||
---
|
||||
@@ -28,29 +28,28 @@ remote_sync: not_requested
|
||||
- **硬边界**:业务动作仅浏览器;禁止 API 冒充立项/发消息/审批。
|
||||
- **交付终点**:spec + assets + test-report + agentctl commit。
|
||||
|
||||
## 本轮结果(2026-09-26T03:32Z Docker,EXIT:1)
|
||||
## 本轮结果(2026-09-26T04:24Z Docker,EXIT:1)
|
||||
|
||||
- PASS **5** / FAIL **1** / SKIP(did not run)**15**
|
||||
- 已修:create-modal 角色 + `promoteToProjectMember`(LeftRail title +「完成并关闭」)
|
||||
- **FAIL**:FS-SQUAD-WF-01 真实 PI 任务 `data-chat-status=pending` 挂起至测试超时 15m(server-id 243)
|
||||
- 保留用户:`e2e26_{author,reviewer,approver,member,guest}_muhu39da`;项目 `E2E全量-20260926-muhu39da`
|
||||
- 报告:`.doc/test-reports/2026-09-26-full-system-browser-e2e-test-report.md`
|
||||
- PASS **7** / FAIL **1** / SKIP(did not run)**13**
|
||||
- **已验证修复**:FS-SQUAD-WF-01(真实 PI,~4.2m)→ PASS;气泡 pending heal 生效
|
||||
- **新 FAIL**:FS-NONAUTH-01 — 成员缺少「双击任意段落就地编辑」affordance
|
||||
- 保留用户:`e2e26_{author,reviewer,approver,member,guest}_muhvyubx`;项目 `E2E全量-20260926-muhvyubx`
|
||||
- 报告 FINAL:`.doc/test-reports/2026-09-26-full-system-browser-e2e-test-report.md`
|
||||
|
||||
## PI pending 诊断(msg 243,只读;未重跑)
|
||||
## msg243 只读探针(上一轮 muhu39da)
|
||||
|
||||
- **非「PI 太慢」**:`bd_intake_1790393552151447446` 约 4min 完成(`workspace.json` `completed_at=03:36:16`;manifest quality **100**;`server.log` `taskrun_status_transition … status=completed` @ 03:37:01)。
|
||||
- **现象**:error-context 上步骤(组建/专员/质量/简报)均「已完成」且质量 100,正文仍「任务执行中…」,`data-chat-status="pending"`(先 optimistic `ast-1790393552123`,后 `data-server-id=243`)直至 Playwright **900s** 墙钟。
|
||||
- **假设**:进度 SSE 已到,**终态 `done`/消息收口未映射到气泡 status**;`console-squad-wf.jsonl` 有 `fetchChatWindow` **404** / workflow docs **403**,历史刷新难纠偏。同秒另有 `chat_turn_complete_failed … assistant_message_id=0 context canceled`;03:38 `chat_turn_sweep_expired_processing marked_failed=1`(扫 `chat_turns`,非气泡 status 主因)。
|
||||
- **墙钟**:`waitForSquadCompletion` 已 1_200_000,但本轮仍被 config 默认 15m 杀掉 → spec 已加 `test.describe.configure({ timeout: 2_100_000 })`。即使 20m 墙也可能仍 FAIL(status 完成后再挂 ~10m+ 未翻)。
|
||||
- **重跑**:本会话 Shell `spawn /bin/bash ENOENT`,Docker E2E **未重跑**;账户会碰撞 → 恢复后须全量重跑(新 suffix),不得编造 PASS。
|
||||
- DB:`metadata.task_status=completed`;`task_runs` completed;API task-run 200 completed
|
||||
- 当时 UI:`data-chat-status=pending` → 证实后端/前端终态不同步(非 PI 慢)
|
||||
- 证据:`assets/.../msg243-readonly-probe.json`
|
||||
|
||||
## 计划与进展
|
||||
|
||||
1. [x] Wipe / spec / Docker 脚本
|
||||
2. [x] 修角色与 promote 选择器并重跑
|
||||
3. [x] 落盘 FAIL 收口报告 + agentctl commit
|
||||
4. [x] 排查 PI pending(诊断如上;全量重跑仍 blocked on Shell)
|
||||
5. [ ] Shell 恢复后全量 Docker 重跑至绿(新 suffix)
|
||||
4. [x] 排查 PI pending + live DB/API 探针
|
||||
5. [x] 修 bubble heal + unit/build + dist 部署 + Docker 全量重跑
|
||||
6. [ ] 修 FS-NONAUTH-01 成员编辑 affordance 后重跑审签链
|
||||
|
||||
## 验证契约
|
||||
|
||||
|
||||
@@ -1,14 +1,16 @@
|
||||
# 全系统真实浏览器多人协作验收 测试报告
|
||||
# 全系统真实浏览器多人协作验收 测试报告(FINAL)
|
||||
|
||||
## 一、测试背景 (Background)
|
||||
|
||||
对 wipe 后的 local `dev`(`BASE_URL=http://127.0.0.1:8080`)做完整 Playwright 多人协作验收。宿主缺 `libatk-1.0.so.0`,按仓库标准走 **Docker Playwright**(`mcr.microsoft.com/playwright:v1.63.0-noble --network host`)。上一轮 FS-PROJ-01 因 create-modal 误用 `editor` / promote 误点私密库「保存」失败;本轮已修正选择器后全量重跑。
|
||||
对 wipe 后的 local `dev`(`BASE_URL=http://127.0.0.1:8080`)做完整 Playwright 多人协作验收。宿主缺 `libatk-1.0.so.0`,走 **Docker Playwright**(`mcr.microsoft.com/playwright:v1.63.0-noble --network host`)。
|
||||
|
||||
上一轮(`muhu39da`,EXIT:1)在 FS-SQUAD-WF-01 因气泡 `data-chat-status=pending` 挂起至 15m 超时 FAIL。本轮已合入气泡终态 heal(`mergeLiveOverHistory` 优先 history terminal;taskRuns/useTaskRunAttempts 辅助;spec reload-heal + 2.1m describe timeout),部署 `web/dist` 后全量重跑(新 suffix `muhvyubx`)。
|
||||
|
||||
## 二、测试目标 (Test Objectives)
|
||||
|
||||
- 实跑 `web/e2e/full-system-browser-e2e.spec.ts`(21 条 serial)真实 UI + 真实 PI
|
||||
- 覆盖 IAM → 立项/成员晋升 → 工作流 → 闲聊 → 编队生成 intake → 审签链路等
|
||||
- 落盘 assets + 本规范报告;`agentctl with` 租约提交
|
||||
- 验证上一轮 P0「编队完成但气泡 pending」是否已愈合
|
||||
- 落盘 assets + 本 FINAL 报告;`agentctl with` 租约提交
|
||||
|
||||
## 三、测试方案与环境 (Test Plan & Environment)
|
||||
|
||||
@@ -17,117 +19,129 @@
|
||||
| 通道 | **headless Docker Playwright** |
|
||||
| 镜像 | `mcr.microsoft.com/playwright:v1.63.0-noble` |
|
||||
| BASE_URL | `http://127.0.0.1:8080`(`--network host`) |
|
||||
| DISPLAY | **empty**(`DISPLAY=<unset>`;`run-meta.json` → `"display":""`, `"headedHint":false`) |
|
||||
| DISPLAY | **empty**(`run-meta.json` → `"display":""`, `"headedHint":false`) |
|
||||
| 入口 | `web/scripts/run-full-system-browser-e2e.sh` |
|
||||
| 开始时间 | `2026-09-26T03:32:25.804Z` |
|
||||
| 开始时间 | `2026-09-26T04:24:57Z`(`e2e-rerun-start.txt` / `run-meta.json` `04:24:58.924Z`) |
|
||||
| 前端制品 | WT `npm run build` → `rsync` 到 `$ROOT/web/dist/`;health 仍 ok(`health-after-web-deploy.json`) |
|
||||
| 层级 | 产品 UI 真实浏览器验收(含真实 PI);禁止 stub 冒充 PASS |
|
||||
|
||||
```text
|
||||
2026-09-26T03:32:24+00:00
|
||||
DISPLAY=<unset>
|
||||
IMAGE=mcr.microsoft.com/playwright:v1.63.0-noble BASE_URL=http://127.0.0.1:8080 …
|
||||
```
|
||||
|
||||
## 四、预期结果 (Expected Results)
|
||||
|
||||
- 21 条按 serial 执行;编队用例允许长达数十分钟~2h 等待真实 PI
|
||||
- `ui-results.json` 记录 PASS/FAIL/SKIP;P0 FAIL 后后续 did not run 记 SKIP(不得记 PASS)
|
||||
- 21 条 serial;编队允许长等待真实 PI(describe timeout 2_100_000)
|
||||
- `ui-results.json` 记 PASS/FAIL/SKIP;P0 FAIL 后后续 did not run 记 SKIP(不得记 PASS)
|
||||
- FS-SQUAD-WF-01 在服务端 completed 后气泡应进入终态(非长期 pending)
|
||||
|
||||
## 五、实际测试结果与判定 (Actual Results & Evaluation)
|
||||
|
||||
### 5.1 账本计数(`ui-results.json`)
|
||||
### 5.1 账本计数(本轮 `ui-results.json`)
|
||||
|
||||
| Verdict | Count | IDs |
|
||||
|---|---:|---|
|
||||
| PASS | **5** | FS-IAM-01, FS-IAM-02, FS-PROJ-01, FS-PROJ-02, FS-CHAT-01 |
|
||||
| FAIL | **1** | FS-SQUAD-WF-01 |
|
||||
| PASS | **7** | FS-IAM-01, FS-IAM-02, FS-PROJ-01, FS-PROJ-02, FS-CHAT-01, **FS-SQUAD-WF-01**, FS-DOC-REV-01 |
|
||||
| FAIL | **1** | FS-NONAUTH-01 |
|
||||
| SKIP | **0**(账本未写 SKIP 行) | — |
|
||||
|
||||
### 5.2 Playwright 套件计数(`playwright.log`)
|
||||
|
||||
| 指标 | 值 |
|
||||
|---|---|
|
||||
| passed | **5** |
|
||||
| passed | **7** |
|
||||
| failed | **1** |
|
||||
| did not run(报告口径 SKIP) | **15** |
|
||||
| duration | 15.1m |
|
||||
| did not run(报告口径 SKIP) | **13** |
|
||||
| duration | **4.4m** |
|
||||
| `EXIT` | **1** |
|
||||
|
||||
```text
|
||||
✓ 1 … FS-IAM-01 … (2.1s)
|
||||
✓ 2 … FS-IAM-02 … (2.1s)
|
||||
✓ 3 … FS-PROJ-01 … (793ms)
|
||||
✓ 4 … FS-PROJ-02 … (632ms)
|
||||
✓ 5 … FS-CHAT-01 … (347ms)
|
||||
✘ 6 … FS-SQUAD-WF-01 generate workflow intake document (real PI) (15.0m)
|
||||
- 7 … FS-DOC-REV-01 …
|
||||
…(至 21 did not run)
|
||||
✓ 1 … FS-IAM-01 … (2.0s)
|
||||
✓ 2 … FS-IAM-02 … (2.0s)
|
||||
✓ 3 … FS-PROJ-01 … (818ms)
|
||||
✓ 4 … FS-PROJ-02 … (623ms)
|
||||
✓ 5 … FS-CHAT-01 … (389ms)
|
||||
✓ 6 … FS-SQUAD-WF-01 generate workflow intake document (real PI) (4.2m)
|
||||
✓ 7 … FS-DOC-REV-01 author edit controlled doc (1.2s)
|
||||
✘ 8 … FS-NONAUTH-01 non-author member can edit after claim (560ms)
|
||||
- 9…21 did not run
|
||||
|
||||
1 failed
|
||||
15 did not run
|
||||
5 passed (15.1m)
|
||||
13 did not run
|
||||
7 passed (4.4m)
|
||||
EXIT:1
|
||||
```
|
||||
|
||||
### 5.3 逐条(账本)
|
||||
### 5.3 逐条(账本,真实字段)
|
||||
|
||||
| ID | Verdict | Duration | 实际摘要 |
|
||||
|---|---|---:|---|
|
||||
| FS-IAM-01 | PASS | 2052ms | 五账号 `e2e26_*_muhu39da` 开通 |
|
||||
| FS-IAM-02 | PASS | 2064ms | 5/5 首次改密 |
|
||||
| FS-PROJ-01 | PASS | 790ms | 立项成功;guestListed=true;**member promoted** |
|
||||
| FS-PROJ-02 | PASS | 628ms | workflow activated |
|
||||
| FS-CHAT-01 | PASS | 344ms | assistant bubble non-empty |
|
||||
| FS-SQUAD-WF-01 | FAIL | 900102ms | 真实 PI:`data-chat-status` 始终 `"pending"`,测试超时 900000ms |
|
||||
| FS-IAM-01 | PASS | 2003ms | 五账号 `e2e26_*_muhvyubx` 开通 |
|
||||
| FS-IAM-02 | PASS | 2023ms | 5/5 首次改密 |
|
||||
| FS-PROJ-01 | PASS | 814ms | 立项;guestListed=true;member promoted |
|
||||
| FS-PROJ-02 | PASS | 619ms | workflow activated |
|
||||
| FS-CHAT-01 | PASS | 385ms | assistant bubble non-empty |
|
||||
| FS-SQUAD-WF-01 | PASS | 253177ms | `doc_proj6013_bd_intake`;title=用户初始需求收集表;squadMs=252547 |
|
||||
| FS-DOC-REV-01 | PASS | 1147ms | author 编辑受控文档成功 |
|
||||
| FS-NONAUTH-01 | FAIL | 504ms | `edit affordance absent`(未见「双击任意段落就地编辑」) |
|
||||
|
||||
#### FS-SQUAD-WF-01 FAIL 终端片段
|
||||
#### FS-NONAUTH-01 FAIL 终端片段
|
||||
|
||||
```text
|
||||
Test timeout of 900000ms exceeded.
|
||||
|
||||
Error: expect(locator).toHaveAttribute(expected) failed
|
||||
Locator: …[@data-chat-role="assistant"]
|
||||
Expected pattern: /^(completed|pending_author_confirmation|failed|cancelled|quality_failed|blocked_pending_governance)$/
|
||||
Received string: "pending"
|
||||
… 540 × … data-chat-status="pending" id="chat-anchor-ast-1790393552123"
|
||||
… 1252 × … data-server-id="243" data-category="task" data-chat-status="pending"
|
||||
Error: non-author member missing edit affordance while drafting
|
||||
at fail (…/full-system-browser-e2e.spec.ts:104:9)
|
||||
at …/full-system-browser-e2e.spec.ts:970:9
|
||||
Error Context: …/full-system-browser-e2e-fu-14a68-member-can-edit-after-claim-chromium/error-context.md
|
||||
```
|
||||
|
||||
#### SKIP / did not run(15)
|
||||
#### SKIP / did not run(13)
|
||||
|
||||
FS-DOC-REV-01…07, FS-NONAUTH-01/02, FS-ASSIST-01, FS-SQUAD-FREE-01, FS-UPLOAD-01, FS-KB-01, FS-CTX-01, FS-CONSOLE-01 — 理由:上游 P0 FS-SQUAD-WF-01 FAIL,serial 中止。
|
||||
FS-NONAUTH-02, FS-DOC-REV-02…07, FS-ASSIST-01, FS-SQUAD-FREE-01, FS-UPLOAD-01, FS-KB-01, FS-CTX-01, FS-CONSOLE-01 — 理由:上游 P0 FS-NONAUTH-01 FAIL,serial 中止。
|
||||
|
||||
### 5.4 严重缺陷
|
||||
### 5.4 msg243 只读探针(上一轮缺陷取证,本会话 live)
|
||||
|
||||
1. **P0 产品缺陷(UI 终态不同步)**:工作流编队「请编制用户初始需求收集表」在服务端约 4 分钟已完成(workspace `completed_at`、taskrun `status=completed`,quality 100),但 UI 气泡长期保持 `data-chat-status="pending"` /「任务执行中…」(`data-server-id=243`)。Playwright 在 15m 墙超时记 FAIL。这不是「PI 未跑完」,而是 **终态未落到聊天气泡**(伴随 chat window 404 迹象)。阻断后续全部审签与 P1 用例。
|
||||
2. (测试基建)`playwright.config` 默认 per-test 15m 小于编队 wait 20m;已在 spec 加 `test.describe.configure({ timeout: 2_100_000 })`(待合入下一次重跑)。即使加长超时,若不修气泡状态映射仍会 FAIL。
|
||||
3. (已修复并本轮验证)create-modal 角色仅 `author|reviewer|approver|viewer`;成员经立项后弹窗晋升;收口为「完成并关闭」。
|
||||
证据:`.doc/test-reports/assets/2026-09-26-full-system-browser-e2e/msg243-readonly-probe.json`
|
||||
|
||||
| 项 | 值 |
|
||||
|---|---|
|
||||
| 登录 | admin `POST /api/v1/auth/login` → 200(无密码落盘) |
|
||||
| 项目 | `E2E全量-20260926-muhu39da` id=6012;session `sess-p6012-u20` owner user_id=20 |
|
||||
| chat API | admin GET messages → **403**(非会话 owner;改用 DB) |
|
||||
| DB `chat_messages.id=243` | `metadata.task_status=**completed**`;正文已是「已完成 / 质量 100」 |
|
||||
| DB / API `task_runs` | `run_1790393552136040254` **status=completed**(updated 03:37:01Z);API GET `/api/v1/tasks/runs/{id}` → 200 completed |
|
||||
| 当时 UI | `data-chat-status=pending` 直至 15m 超时 |
|
||||
|
||||
结论:上一轮不是「PI 未完成」,而是 **后端已 completed、气泡未翻终态**。本轮 FS-SQUAD-WF-01 **PASS**(约 4.2m)验证 heal 有效。
|
||||
|
||||
### 5.5 严重缺陷
|
||||
|
||||
1. **(已验证修复)P0 气泡终态不同步**:上一轮 msg243 DB/task_run 均为 completed,UI pending。本轮修 `messageIdentity.mergeLiveOverHistory`(inflight live 不盖 history terminal)+ taskRuns/attempts + E2E reload-heal;FS-SQUAD-WF-01 PASS。
|
||||
2. **(本轮新 FAIL)P0 FS-NONAUTH-01**:非编制成员打开 intake 后缺少「双击任意段落就地编辑」可发现性/认领后编辑 affordance;阻断后续审签链。截图:`screenshots/FS-NONAUTH-01-FAIL.png`。
|
||||
3. (历史已修)create-modal 角色与 promote「完成并关闭」选择器。
|
||||
|
||||
## 六、自动化测试套件汇总 (Test Suite Execution)
|
||||
|
||||
| 套件 | 入口 | 结果 |
|
||||
|---|---|---|
|
||||
| Docker Playwright E2E | `run-full-system-browser-e2e.sh` | **FAIL**(5 passed / 1 failed / 15 did not run) |
|
||||
| 真实 PI 编队 | FS-SQUAD-WF-01 | **FAIL**(pending 挂起) |
|
||||
| 产品审签全链路 | FS-DOC-REV-* 等 | **未运行** |
|
||||
| `messageIdentity` unit | `npx tsx --test src/engine/messageIdentity.test.ts` | **PASS 6/6**(`messageIdentity-unittest.txt`) |
|
||||
| web build | `npm run build` | **PASS**(`web-build.txt`) |
|
||||
| Docker Playwright E2E | `run-full-system-browser-e2e.sh` | **FAIL**(7 passed / 1 failed / 13 did not run) |
|
||||
| 真实 PI 编队 | FS-SQUAD-WF-01 | **PASS**(4.2m) |
|
||||
| 产品审签全链路 | FS-DOC-REV-02+ 等 | **未运行**(上游 NONAUTH FAIL) |
|
||||
|
||||
通过率(21 调度):5/21 ≈ 23.8%。账本已记 6 条:5 PASS / 1 FAIL。
|
||||
通过率(21 调度):7/21 ≈ 33.3%。账本已记 8 条:7 PASS / 1 FAIL。
|
||||
|
||||
## 七、测试结论与后续优化建议 (Conclusion & Next Steps)
|
||||
|
||||
- **结论**:Docker headless 通道可用;立项/成员晋升/工作流激活/闲聊已通。全量验收 **未完成**,以 **FAIL** 收口。禁止将 5 PASS 写成全套 PASS。
|
||||
- **根因(已证据)**:服务端编队已 completed,UI `data-chat-status` 未翻转到终态;需修气泡/SSE/chat-window 终态同步后再重跑审签链。
|
||||
- **下一步**:修 UI 终态映射 → 全量 Docker 重跑(含 `describe.configure` 2.1m timeout)。
|
||||
- **保留账号**见下;项目 `E2E全量-20260926-muhu39da` 已创建。
|
||||
- **结论**:Docker headless 通道可用;**编队 pending 愈合已验证**(FS-SQUAD-WF-01 PASS)。全量验收仍 **未完成**,以 **FAIL** 收口于 FS-NONAUTH-01。禁止将 7 PASS 写成全套 PASS。
|
||||
- **下一步**:排查 drafting 态成员认领/就地编辑 affordance(产品或选择器),修复后全量 Docker 重跑审签链。
|
||||
- **保留账号**见下;项目 `E2E全量-20260926-muhvyubx`。
|
||||
|
||||
## 保留账号(无密码)
|
||||
|
||||
| 角色 | username |
|
||||
|---|---|
|
||||
| author | `e2e26_author_muhu39da` |
|
||||
| reviewer | `e2e26_reviewer_muhu39da` |
|
||||
| approver | `e2e26_approver_muhu39da` |
|
||||
| member | `e2e26_member_muhu39da` |
|
||||
| guest | `e2e26_guest_muhu39da` |
|
||||
| author | `e2e26_author_muhvyubx` |
|
||||
| reviewer | `e2e26_reviewer_muhvyubx` |
|
||||
| approver | `e2e26_approver_muhvyubx` |
|
||||
| member | `e2e26_member_muhvyubx` |
|
||||
| guest | `e2e26_guest_muhvyubx` |
|
||||
|
||||
- Assets:`.doc/test-reports/assets/2026-09-26-full-system-browser-e2e/`
|
||||
- 上一轮账户(对照):`e2e26_*_muhu39da` / 项目 `E2E全量-20260926-muhu39da`
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
shell write path ok
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"http_status": 200,
|
||||
"user": {
|
||||
"id": 4,
|
||||
"username": "admin",
|
||||
"name": "系统管理员",
|
||||
"status": "active",
|
||||
"role_id": "role-admin",
|
||||
"department": "系统运维部"
|
||||
},
|
||||
"env": "dev",
|
||||
"has_token": true,
|
||||
"error_code": null,
|
||||
"message": null
|
||||
}
|
||||
@@ -38,3 +38,13 @@
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:26.139Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:32:26.139Z"}
|
||||
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at C_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7112)","ts":"2026-09-26T03:32:26.139Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:24:59.265Z"}
|
||||
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:24:59.266Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:24:59.267Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:24:59.267Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:24:59.267Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:24:59.267Z"}
|
||||
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:24:59.268Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:24:59.268Z"}
|
||||
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:24:59.268Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:24:59.268Z"}
|
||||
|
||||
@@ -11,3 +11,16 @@
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:32:31.683Z"}
|
||||
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at C_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7112)","ts":"2026-09-26T03:32:31.683Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:31.683Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:04.720Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:04.720Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:04.721Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:04.722Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:04.723Z"}
|
||||
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:25:04.723Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:04.723Z"}
|
||||
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:25:04.723Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:04.723Z"}
|
||||
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:25:04.723Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:04.724Z"}
|
||||
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:25:04.724Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:04.724Z"}
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:29:18.315Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:29:18.315Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:29:18.317Z"}
|
||||
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:29:18.318Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:29:18.318Z"}
|
||||
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:29:18.318Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:29:18.318Z"}
|
||||
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:29:18.318Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:29:18.318Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:29:18.322Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:29:18.322Z"}
|
||||
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:29:18.322Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:29:18.322Z"}
|
||||
{"kind":"console","level":"error","text":"Loading the font 'data:font/woff2;base64,d09GMgABAAAAAA4oAA4AAAAAHbQAAA3TAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmAAgRQIDgmcDBEICo1oijYBNgIkA14LMgAEIAWJAAeBHAyBHBvbGiMRdnO0IkRRkiYDgr9KsJ1NUAf2kILNxgUmgqIgq1P89vcbIcmsQbRps3vCcXdYOKSWEPEKgZgQkprQQsxIXUgq0DqpGKmIvrgkeVGtEQD9DzAO29fM9jYhxZEsL2FeURH2JN4MIcTdO049NCVdxQ/w9NrSYFEBKTDKpLKfNkCGDc1RwjZLQcm3vqJ2UW9Xfa3tgAHz6ivp6vgC2yD4/6352ndnN0X0TL7seypkjZlMsjmZnf0Mm5Q+JykRWQBKCVCVPbARPXWyQtb5VgLB6Biq7/Uixcj2WGqdI8tGSgkuRG+t910GKP2D7AQH0DB9FMDW/obJZ8giFI3Wg8Cvevz0M+5m0rTh7XDBlvo9Y4vm13EXmftt...mCahLsdlyA5fdQkRSan9LgnnLEyGSkaKJCJog0wAgvepWBt80+1yKln1bMVtCljfNWDueKLsWwaEbBSfSPTEmVRsUcYYMnEjcjeyCZzBXK9E9BYBXLKjOSpUDR+nEV3TFSUdQaz+ot98QxgXwx0GQ+EEUAKB2qZPkQQ0GqFD8UPFMqyaCHM24BZmSGic9EYMagKizOw9Hz50DMrDLrqqLkTAhplMictiCAx5S3BIUQdeJeLnBy2CNtMfz6cV4u8XKoFZQesbf9YZiIERiHjaNodDW6LgcirX/mPnJIkBGDUpTBhSa0EIr38D5hCIszhCM8URGBqImoWjpvpt1ebu/v3Gl3qJfMnNM+9V+kiRFyROTPHQWOcs1dNW94/ukKMPZBvDi55i5CttdeJz84DLngLqjcdwEZ87bFFR8CIG35OAkDVN6VRDZ7aq67NteYqZ2lpT8oYB2CytoBd6VuAx4WgiAsnuj3WohG+LugzXiQRDeM3XYXlULv4dp5VFYC' violates the following Content Security Policy directive: \"font-src 'self'\". The action has been blocked.","ts":"2026-09-26T04:29:18.729Z"}
|
||||
@@ -230,3 +230,61 @@
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:29.876Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:29.876Z"}
|
||||
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:32:29.876Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.241Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.241Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.243Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:01.243Z"}
|
||||
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:25:01.244Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:01.244Z"}
|
||||
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:25:01.244Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:01.246Z"}
|
||||
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:25:01.246Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.246Z"}
|
||||
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:25:01.247Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:01.247Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.247Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.395Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.395Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.395Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.396Z"}
|
||||
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:25:01.396Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.610Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.611Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.611Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.611Z"}
|
||||
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:25:01.611Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.767Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.767Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.767Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.769Z"}
|
||||
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:25:01.769Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.995Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.996Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.997Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.997Z"}
|
||||
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:25:01.997Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.152Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.152Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.152Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.154Z"}
|
||||
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:25:02.154Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.377Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.377Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.377Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.377Z"}
|
||||
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:25:02.378Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.532Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.532Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.533Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.534Z"}
|
||||
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:25:02.535Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.762Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.763Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.763Z"}
|
||||
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:25:02.763Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.763Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.910Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.910Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.910Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.911Z"}
|
||||
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:25:02.911Z"}
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:29:19.454Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:29:19.454Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:29:19.454Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:29:19.457Z"}
|
||||
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:29:19.457Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:29:19.458Z"}
|
||||
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:29:19.458Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:29:19.458Z"}
|
||||
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:29:19.458Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:29:19.458Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:29:19.458Z"}
|
||||
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:29:19.458Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:29:19.458Z"}
|
||||
@@ -64,3 +64,16 @@
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:32:30.265Z"}
|
||||
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at C_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7112)","ts":"2026-09-26T03:32:30.266Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:30.266Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:03.283Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:03.283Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:03.284Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:03.286Z"}
|
||||
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:25:03.287Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:03.287Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:03.288Z"}
|
||||
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:25:03.288Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:03.288Z"}
|
||||
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:25:03.289Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:03.289Z"}
|
||||
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:25:03.289Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:03.289Z"}
|
||||
|
||||
@@ -11,3 +11,16 @@
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:32:31.050Z"}
|
||||
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at T_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7452)","ts":"2026-09-26T03:32:31.050Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:31.050Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:04.102Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:04.102Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:04.102Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:04.104Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:04.104Z"}
|
||||
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:25:04.105Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:04.105Z"}
|
||||
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:25:04.105Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:04.105Z"}
|
||||
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:25:04.106Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:04.108Z"}
|
||||
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:25:04.108Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:04.108Z"}
|
||||
|
||||
@@ -11,3 +11,16 @@
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:32.033Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:32:32.033Z"}
|
||||
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at C_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7112)","ts":"2026-09-26T03:32:32.033Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:05.135Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:05.135Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:05.135Z"}
|
||||
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:25:05.135Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:05.135Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:05.136Z"}
|
||||
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:25:05.136Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:05.136Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:05.136Z"}
|
||||
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:25:05.136Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:05.139Z"}
|
||||
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:25:05.139Z"}
|
||||
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:05.139Z"}
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
E2E_START=2026-09-26T04:24:57Z
|
||||
EXIT:1
|
||||
@@ -0,0 +1 @@
|
||||
{"status":"ok","env":"dev","agent_backend":"pi-agent","version":"v1.0","shared_kb_port":5433,"kb_ready":true,"database_ready":true,"schema_version":75,"schema_ready":true,"task_store_ready":true,"vault_identity_ok":false,"vault_connected":false,"vault_lag_ok":true,"events_ready":true}
|
||||
@@ -0,0 +1 @@
|
||||
{"status":"ok","env":"dev","agent_backend":"pi-agent","version":"v1.0","shared_kb_port":5433,"kb_ready":true,"database_ready":true,"schema_version":75,"schema_ready":true,"task_store_ready":true,"vault_identity_ok":false,"vault_connected":false,"vault_lag_ok":true,"events_ready":true}
|
||||
@@ -0,0 +1,9 @@
|
||||
|
||||
RUN v5.0.0 /home/weichen/projects/Agent-System/.worktrees/full-system-browser-e2e-2026-09-26/web
|
||||
|
||||
No test files found, exiting with code 1
|
||||
|
||||
filter: src/engine/messageIdentity.test.ts
|
||||
include: src/components/chat/**/*.test.ts
|
||||
exclude: **/node_modules/**, **/.git/**
|
||||
|
||||
@@ -0,0 +1,103 @@
|
||||
{
|
||||
"probe_id": "msg243-readonly-probe",
|
||||
"probed_at": "2026-09-26T04:24:49Z",
|
||||
"authorization": "read-only; no secrets in this file",
|
||||
"shell_status": {
|
||||
"usable": true,
|
||||
"error": null,
|
||||
"impact": "live admin login + DB SELECT agent_system_dev + GET /api/v1/tasks/runs/{id}"
|
||||
},
|
||||
"login": {
|
||||
"http_status": 200,
|
||||
"user": {
|
||||
"id": 4,
|
||||
"username": "admin",
|
||||
"role_id": "role-admin"
|
||||
},
|
||||
"has_token": true
|
||||
},
|
||||
"project": {
|
||||
"name": "E2E全量-20260926-muhu39da",
|
||||
"project_id": 6012,
|
||||
"session_id": "sess-p6012-u20",
|
||||
"session_owner_user_id": 20,
|
||||
"api_chat_messages": "FORBIDDEN_FOR_ADMIN (403) — owner session; used DB instead",
|
||||
"api_lookup": "OK"
|
||||
},
|
||||
"message_243": {
|
||||
"ui_data_server_id": 243,
|
||||
"ui_data_chat_status_observed": "pending",
|
||||
"ui_observation_source": [
|
||||
"playwright.log FS-SQUAD-WF-01",
|
||||
"ui-results.json FS-SQUAD-WF-01",
|
||||
"error-context.md page snapshot"
|
||||
],
|
||||
"ui_snapshot_at_timeout": {
|
||||
"chip": "执行中",
|
||||
"elapsed_label": "已用 14m 59s",
|
||||
"phases": [
|
||||
"组建小队已完成",
|
||||
"专员执行已完成",
|
||||
"质量门禁已完成",
|
||||
"参谋简报已完成"
|
||||
],
|
||||
"quality_label": "用户初始需求收集表 · 质量 100",
|
||||
"content_placeholder": "任务执行中…"
|
||||
},
|
||||
"db": {
|
||||
"id": 243,
|
||||
"session_id": "sess-p6012-u20",
|
||||
"role": "assistant",
|
||||
"content_prefix": "《用户初始需求收集表》已生成。\n\n当前状态:**已完成**\n质量评分:100/100\n\n📄 受控文档:`doc_proj6012_bd_intake`",
|
||||
"task_status": "completed",
|
||||
"run_id": "run_1790393552136040254",
|
||||
"task_key": "bd_intake",
|
||||
"workspace_id": "bizdev",
|
||||
"created_at": "2026-09-26 03:32:32.141957+00"
|
||||
},
|
||||
"metadata_task_status_db_or_api": "completed",
|
||||
"content_snippet_desensitized": "《用户初始需求收集表》已生成。\n\n当前状态:**已完成**\n质量评分:100/100\n\n📄 受控文档:`doc_proj6012_bd_intake`"
|
||||
},
|
||||
"task_run": {
|
||||
"run_id": "run_1790393552136040254",
|
||||
"from_db": {
|
||||
"run_id": "run_1790393552136040254",
|
||||
"status": "completed",
|
||||
"workspace_id": "data/dev/workspaces/bizdev/bd_intake_1790393552151447446",
|
||||
"project_id": 6012,
|
||||
"user_id": 20,
|
||||
"session_id": "sess-p6012-u20",
|
||||
"assistant_message_id": 243,
|
||||
"task_key": "bd_intake",
|
||||
"stage": "",
|
||||
"error_prefix": "",
|
||||
"created_at": "2026-09-26 03:32:32.136168+00",
|
||||
"updated_at": "2026-09-26 03:37:01.805334+00"
|
||||
},
|
||||
"api_http": 200,
|
||||
"from_api": {
|
||||
"run_id": "run_1790393552136040254",
|
||||
"status": "completed",
|
||||
"workspace_id": "data/dev/workspaces/bizdev/bd_intake_1790393552151447446",
|
||||
"project_id": 6012,
|
||||
"user_id": 20,
|
||||
"session_id": "sess-p6012-u20",
|
||||
"assistant_message_id": 243,
|
||||
"task_key": "bd_intake",
|
||||
"stage": "",
|
||||
"error_message": ""
|
||||
},
|
||||
"api_path": "/api/v1/tasks/runs/run_1790393552136040254"
|
||||
},
|
||||
"mismatch_summary": {
|
||||
"backend_task_run_status": "completed",
|
||||
"db_metadata_task_status": "completed",
|
||||
"ui_bubble_data_chat_status": "pending (stuck through ~15m Playwright wait)",
|
||||
"metadata_updated_to_completed": "YES",
|
||||
"hypothesis": {
|
||||
"primary": "SSE_DONE_NOT_APPLIED_OR_LIVE_MASKS_HISTORY",
|
||||
"detail": "DB metadata.task_status=completed and task_runs.status=completed; UI data-chat-status stayed pending. Client missed EventDone and/or inflight live bubble masked terminal history (fetchChatWindow 404).",
|
||||
"fix_shipped": "mergeLiveOverHistory prefers history terminal over inflight live; E2E reload-heal + 2.1m describe timeout"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
# Probe summary — msg 243 / project muhu39da (readonly)
|
||||
|
||||
Probed_at: 2026-09-26T04:24:49Z (JSON: `msg243-readonly-probe.json`)
|
||||
Rerun E2E start: 2026-09-26T04:24:57Z (new prefix `muhvyubx`; prior accounts `muhu39da` retained)
|
||||
|
||||
## Facts
|
||||
|
||||
| Layer | Observation |
|
||||
|---|---|
|
||||
| DB `messages.id=243` | `task_status=completed`, content says 已完成 / quality 100 |
|
||||
| API `GET /api/v1/tasks/runs/run_1790393552136040254` | `status=completed` (~4m wall: created 03:32 → updated 03:37) |
|
||||
| UI Playwright | `data-server-id=243` stuck `data-chat-status="pending"` for ~15m |
|
||||
|
||||
## Causal split
|
||||
|
||||
1. **Mapping bug (primary, confirmed in code)**: `mergeLiveOverHistory` preferred inflight live status over terminal history → completed history masked as `pending`.
|
||||
2. **SSE gap**: stream EOF without applying `done`; client stayed on live pending bubble.
|
||||
3. **Poll/heal gap**: no `onGap` settle from remote run status after reconnect; chat-window refresh alone insufficient when live masks history.
|
||||
|
||||
## Fix shipped in worktree (pre-rerun)
|
||||
|
||||
- `resolveMergedMessageStatus` — history terminal wins over inflight live
|
||||
- `taskRuns.subscribe` `onGap` + `settleFromRemoteIfTerminal` / `subscribeWithGapHeal`
|
||||
- E2E `waitForSquadCompletion` mid-wait reload-heal + describe timeout 2.1m
|
||||
- Web dist built + rsynced to MAIN `web/dist` (index hashes match)
|
||||
|
||||
## Verdict for prior FAIL
|
||||
|
||||
Not “PI unfinished”. Backend terminal; frontend mapping + SSE/poll heal missing → UI pending.
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"note": "Passwords intentionally omitted. Accounts retained after E2E by design.",
|
||||
"projectName": "E2E全量-20260926-muhu39da",
|
||||
"projectName": "E2E全量-20260926-muhvyubx",
|
||||
"usernames": [
|
||||
"e2e26_author_muhu39da",
|
||||
"e2e26_reviewer_muhu39da",
|
||||
"e2e26_approver_muhu39da",
|
||||
"e2e26_member_muhu39da",
|
||||
"e2e26_guest_muhu39da"
|
||||
"e2e26_author_muhvyubx",
|
||||
"e2e26_reviewer_muhvyubx",
|
||||
"e2e26_approver_muhvyubx",
|
||||
"e2e26_member_muhvyubx",
|
||||
"e2e26_guest_muhvyubx"
|
||||
],
|
||||
"roles": {
|
||||
"author": "e2e26_author_muhu39da",
|
||||
"reviewer": "e2e26_reviewer_muhu39da",
|
||||
"approver": "e2e26_approver_muhu39da",
|
||||
"member": "e2e26_member_muhu39da",
|
||||
"guest": "e2e26_guest_muhu39da"
|
||||
"author": "e2e26_author_muhvyubx",
|
||||
"reviewer": "e2e26_reviewer_muhvyubx",
|
||||
"approver": "e2e26_approver_muhvyubx",
|
||||
"member": "e2e26_member_muhvyubx",
|
||||
"guest": "e2e26_guest_muhvyubx"
|
||||
}
|
||||
}
|
||||
@@ -1,29 +1,29 @@
|
||||
{
|
||||
"startedAt": "2026-09-26T03:32:25.804Z",
|
||||
"startedAt": "2026-09-26T04:24:58.924Z",
|
||||
"baseURL": "http://127.0.0.1:8080",
|
||||
"display": "",
|
||||
"headedHint": false,
|
||||
"projectName": "E2E全量-20260926-muhu39da",
|
||||
"projectName": "E2E全量-20260926-muhvyubx",
|
||||
"users": {
|
||||
"author": {
|
||||
"username": "e2e26_author_muhu39da",
|
||||
"display": "E2E编制-muhu39da"
|
||||
"username": "e2e26_author_muhvyubx",
|
||||
"display": "E2E编制-muhvyubx"
|
||||
},
|
||||
"reviewer": {
|
||||
"username": "e2e26_reviewer_muhu39da",
|
||||
"display": "E2E审核-muhu39da"
|
||||
"username": "e2e26_reviewer_muhvyubx",
|
||||
"display": "E2E审核-muhvyubx"
|
||||
},
|
||||
"approver": {
|
||||
"username": "e2e26_approver_muhu39da",
|
||||
"display": "E2E批准-muhu39da"
|
||||
"username": "e2e26_approver_muhvyubx",
|
||||
"display": "E2E批准-muhvyubx"
|
||||
},
|
||||
"member": {
|
||||
"username": "e2e26_member_muhu39da",
|
||||
"display": "E2E成员-muhu39da"
|
||||
"username": "e2e26_member_muhvyubx",
|
||||
"display": "E2E成员-muhvyubx"
|
||||
},
|
||||
"guest": {
|
||||
"username": "e2e26_guest_muhu39da",
|
||||
"display": "E2E访客-muhu39da"
|
||||
"username": "e2e26_guest_muhvyubx",
|
||||
"display": "E2E访客-muhvyubx"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 109 KiB After Width: | Height: | Size: 107 KiB |
|
After Width: | Height: | Size: 149 KiB |
|
Before Width: | Height: | Size: 189 KiB After Width: | Height: | Size: 189 KiB |
|
After Width: | Height: | Size: 157 KiB |
|
Before Width: | Height: | Size: 140 KiB After Width: | Height: | Size: 138 KiB |
|
Before Width: | Height: | Size: 110 KiB After Width: | Height: | Size: 110 KiB |
|
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 84 KiB |
|
After Width: | Height: | Size: 223 KiB |
@@ -5,17 +5,17 @@
|
||||
"priority": "P0",
|
||||
"input": "admin console → 开通受控员工账号 ×5",
|
||||
"expected": "author/reviewer/approver/member/guest created",
|
||||
"actual": "e2e26_author_muhu39da,e2e26_reviewer_muhu39da,e2e26_approver_muhu39da,e2e26_member_muhu39da,e2e26_guest_muhu39da",
|
||||
"actual": "e2e26_author_muhvyubx,e2e26_reviewer_muhvyubx,e2e26_approver_muhvyubx,e2e26_member_muhvyubx,e2e26_guest_muhvyubx",
|
||||
"verdict": "PASS",
|
||||
"durationMs": 2052,
|
||||
"durationMs": 2003,
|
||||
"console_errors": [
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)"
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)"
|
||||
]
|
||||
},
|
||||
"FS-IAM-02": {
|
||||
@@ -26,12 +26,11 @@
|
||||
"expected": "all reach workbench after reset",
|
||||
"actual": "5/5 password changes OK",
|
||||
"verdict": "PASS",
|
||||
"durationMs": 2064,
|
||||
"durationMs": 2023,
|
||||
"console_errors": [
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
@@ -72,6 +71,7 @@
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)"
|
||||
]
|
||||
},
|
||||
@@ -79,18 +79,18 @@
|
||||
"id": "FS-PROJ-01",
|
||||
"name": "create project + members",
|
||||
"priority": "P0",
|
||||
"input": "project=E2E全量-20260926-muhu39da; reviewer/approver duties + member promote(+guest)",
|
||||
"input": "project=E2E全量-20260926-muhvyubx; reviewer/approver duties + member promote(+guest)",
|
||||
"expected": "banner shows project; member is project_role=member",
|
||||
"actual": "created; guestListed=true; member promoted",
|
||||
"verdict": "PASS",
|
||||
"durationMs": 790,
|
||||
"durationMs": 814,
|
||||
"console_errors": [
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)"
|
||||
@@ -104,16 +104,16 @@
|
||||
"expected": "运行中",
|
||||
"actual": "workflow activated",
|
||||
"verdict": "PASS",
|
||||
"durationMs": 628,
|
||||
"durationMs": 619,
|
||||
"console_errors": [
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)"
|
||||
]
|
||||
},
|
||||
@@ -125,16 +125,16 @@
|
||||
"expected": "assistant reply visible",
|
||||
"actual": "assistant bubble non-empty",
|
||||
"verdict": "PASS",
|
||||
"durationMs": 344,
|
||||
"durationMs": 385,
|
||||
"console_errors": [
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)"
|
||||
]
|
||||
},
|
||||
@@ -143,21 +143,64 @@
|
||||
"name": "squad workflow doc generation",
|
||||
"priority": "P0",
|
||||
"input": "请编制用户初始需求收集表",
|
||||
"expected": "PI squad completes",
|
||||
"actual": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveAttribute\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('[data-chat-role=\"user\"]').filter({ hasText: '请编制用户初始需求收集表' }).last().locator('xpath=ancestor::*[@data-index][1]/following-sibling::*[@data-index][1]//*[@data-chat-role=\"assistant\"]')\nExpected pattern: \u001b[32m/^(completed|pending_author_confirmation|failed|cancelled|quality_failed|blocked_pending_governance)$/\u001b[39m\nReceived string: \u001b[31m\"pending\"\u001b[39m\n\nCall log:\n\u001b[2m - Expect \"toHaveAttribute\" locator('[data-chat-role=\"user\"]').filter({ hasText: '请编制用户初始需求收集表' }).last().locator('xpath=ancestor::*[@data-index][1]/following-sibling::*[@data-index][1]//*[@data-chat-role=\"assistant\"]') with timeout 1200000ms\u001b[22m\n\u001b[2m - waiting for locator('[data-chat-role=\"user\"]').filter({ hasText: '请编制用户初始需求收集表' }).last().locator('xpath=ancestor::*[@data-index][1]/following-sibling::*[@data-index][1]//*[@data-chat-role=\"assistant\"]')\u001b[22m\n\u001b[2m 540 × locator resolved to <div data-chat-role=\"assistant\" data-chat-status=\"pending\" id=\"chat-anchor-ast-1790393552123\">…</div>\u001b[22m\n\u001b[2m - unexpected value \"pending\"\u001b[22m\n\u001b[2m 1252 × locator resolved to <div id=\"chat-anchor-243\" data-server-id=\"243\" data-category=\"task\" data-chat-role=\"assistant\" data-chat-status=\"pending\">…</div>\u001b[22m\n\u001b[2m - unexpected value \"pending\"\u001b[22m\n\u001b[2m - Test ended.\u001b[22m\n",
|
||||
"verdict": "FAIL",
|
||||
"durationMs": 900102,
|
||||
"expected": "squad terminal + server doc_proj intake with V/r",
|
||||
"actual": "docId=doc_proj6013_bd_intake; title=用户初始需求收集表; squadMs=252547",
|
||||
"verdict": "PASS",
|
||||
"durationMs": 253177,
|
||||
"console_errors": [
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)"
|
||||
]
|
||||
},
|
||||
"FS-DOC-REV-01": {
|
||||
"id": "FS-DOC-REV-01",
|
||||
"name": "author edit",
|
||||
"priority": "P0",
|
||||
"input": "edit block with E2E修订-muhvyubx",
|
||||
"expected": "marker persisted in pane",
|
||||
"actual": "edited doc_proj6013_bd_intake",
|
||||
"verdict": "PASS",
|
||||
"durationMs": 1147,
|
||||
"console_errors": [
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Loading the font 'data:font/woff2;base64,d09GMgABAAAAAA4oAA4AAAAAHbQAAA3TAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmAAgRQIDgmcDBEICo1oijYBNgIkA14LMgAEIAWJAAeBHAyBHBvbGiMRdnO0IkRRkiYDgr9KsJ1NUAf2kILNxgUmgqIgq1P89vcbIcmsQbRps3vCcXdYOKSWEPEKgZgQkprQQsx"
|
||||
]
|
||||
},
|
||||
"FS-NONAUTH-01": {
|
||||
"id": "FS-NONAUTH-01",
|
||||
"name": "non-author edit",
|
||||
"priority": "P0",
|
||||
"input": "member open intake",
|
||||
"expected": "can claim/edit when drafting",
|
||||
"actual": "edit affordance absent",
|
||||
"verdict": "FAIL",
|
||||
"durationMs": 504,
|
||||
"console_errors": [
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)"
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)"
|
||||
],
|
||||
"notes": "真实 PI 超时/失败记 FAIL,不伪装 PASS"
|
||||
"notes": "drafting 态应允许成员认领编辑(deny_only_submit)"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,163 @@
|
||||
{
|
||||
"FS-IAM-01": {
|
||||
"id": "FS-IAM-01",
|
||||
"name": "admin creates multi-role users",
|
||||
"priority": "P0",
|
||||
"input": "admin console → 开通受控员工账号 ×5",
|
||||
"expected": "author/reviewer/approver/member/guest created",
|
||||
"actual": "e2e26_author_muhu39da,e2e26_reviewer_muhu39da,e2e26_approver_muhu39da,e2e26_member_muhu39da,e2e26_guest_muhu39da",
|
||||
"verdict": "PASS",
|
||||
"durationMs": 2052,
|
||||
"console_errors": [
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)"
|
||||
]
|
||||
},
|
||||
"FS-IAM-02": {
|
||||
"id": "FS-IAM-02",
|
||||
"name": "first-login password change",
|
||||
"priority": "P0",
|
||||
"input": "each e2e26_* account first login",
|
||||
"expected": "all reach workbench after reset",
|
||||
"actual": "5/5 password changes OK",
|
||||
"verdict": "PASS",
|
||||
"durationMs": 2064,
|
||||
"console_errors": [
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)"
|
||||
]
|
||||
},
|
||||
"FS-PROJ-01": {
|
||||
"id": "FS-PROJ-01",
|
||||
"name": "create project + members",
|
||||
"priority": "P0",
|
||||
"input": "project=E2E全量-20260926-muhu39da; reviewer/approver duties + member promote(+guest)",
|
||||
"expected": "banner shows project; member is project_role=member",
|
||||
"actual": "created; guestListed=true; member promoted",
|
||||
"verdict": "PASS",
|
||||
"durationMs": 790,
|
||||
"console_errors": [
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)"
|
||||
]
|
||||
},
|
||||
"FS-PROJ-02": {
|
||||
"id": "FS-PROJ-02",
|
||||
"name": "activate workflow duties",
|
||||
"priority": "P0",
|
||||
"input": "配置工作流 → 纳入审批 → 三权指派 → 确认激活",
|
||||
"expected": "运行中",
|
||||
"actual": "workflow activated",
|
||||
"verdict": "PASS",
|
||||
"durationMs": 628,
|
||||
"console_errors": [
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)"
|
||||
]
|
||||
},
|
||||
"FS-CHAT-01": {
|
||||
"id": "FS-CHAT-01",
|
||||
"name": "casual dialogue",
|
||||
"priority": "P0",
|
||||
"input": "E2E闲聊:请用一句话确认项目通道可用,不要生成受控文档。",
|
||||
"expected": "assistant reply visible",
|
||||
"actual": "assistant bubble non-empty",
|
||||
"verdict": "PASS",
|
||||
"durationMs": 344,
|
||||
"console_errors": [
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)"
|
||||
]
|
||||
},
|
||||
"FS-SQUAD-WF-01": {
|
||||
"id": "FS-SQUAD-WF-01",
|
||||
"name": "squad workflow doc generation",
|
||||
"priority": "P0",
|
||||
"input": "请编制用户初始需求收集表",
|
||||
"expected": "PI squad completes",
|
||||
"actual": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveAttribute\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('[data-chat-role=\"user\"]').filter({ hasText: '请编制用户初始需求收集表' }).last().locator('xpath=ancestor::*[@data-index][1]/following-sibling::*[@data-index][1]//*[@data-chat-role=\"assistant\"]')\nExpected pattern: \u001b[32m/^(completed|pending_author_confirmation|failed|cancelled|quality_failed|blocked_pending_governance)$/\u001b[39m\nReceived string: \u001b[31m\"pending\"\u001b[39m\n\nCall log:\n\u001b[2m - Expect \"toHaveAttribute\" locator('[data-chat-role=\"user\"]').filter({ hasText: '请编制用户初始需求收集表' }).last().locator('xpath=ancestor::*[@data-index][1]/following-sibling::*[@data-index][1]//*[@data-chat-role=\"assistant\"]') with timeout 1200000ms\u001b[22m\n\u001b[2m - waiting for locator('[data-chat-role=\"user\"]').filter({ hasText: '请编制用户初始需求收集表' }).last().locator('xpath=ancestor::*[@data-index][1]/following-sibling::*[@data-index][1]//*[@data-chat-role=\"assistant\"]')\u001b[22m\n\u001b[2m 540 × locator resolved to <div data-chat-role=\"assistant\" data-chat-status=\"pending\" id=\"chat-anchor-ast-1790393552123\">…</div>\u001b[22m\n\u001b[2m - unexpected value \"pending\"\u001b[22m\n\u001b[2m 1252 × locator resolved to <div id=\"chat-anchor-243\" data-server-id=\"243\" data-category=\"task\" data-chat-role=\"assistant\" data-chat-status=\"pending\">…</div>\u001b[22m\n\u001b[2m - unexpected value \"pending\"\u001b[22m\n\u001b[2m - Test ended.\u001b[22m\n",
|
||||
"verdict": "FAIL",
|
||||
"durationMs": 900102,
|
||||
"console_errors": [
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
|
||||
"[error] Failed to load resource: the server responded with a status of 404 (Not Found)"
|
||||
],
|
||||
"notes": "真实 PI 超时/失败记 FAIL,不伪装 PASS"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,290 @@
|
||||
|
||||
> shuimu-workbench@1.0.0 build
|
||||
> tsc && vite build && node scripts/precompress-dist.mjs
|
||||
|
||||
vite v7.3.6 building client environment for production...
|
||||
transforming...
|
||||
✓ 4161 modules transformed.
|
||||
rendering chunks...
|
||||
computing gzip size...
|
||||
dist/index.html 0.72 kB │ gzip: 0.45 kB
|
||||
dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff 4.42 kB
|
||||
dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 4.93 kB
|
||||
dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 5.21 kB
|
||||
dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 5.47 kB
|
||||
dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff 5.98 kB
|
||||
dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff 6.19 kB
|
||||
dist/assets/KaTeX_Size1-Regular-C195tn64.woff 6.50 kB
|
||||
dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 6.91 kB
|
||||
dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 6.91 kB
|
||||
dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf 7.59 kB
|
||||
dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff 7.66 kB
|
||||
dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff 7.72 kB
|
||||
dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 9.64 kB
|
||||
dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 10.34 kB
|
||||
dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf 10.36 kB
|
||||
dist/assets/KaTeX_Script-Regular-D5yQViql.woff 10.59 kB
|
||||
dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 11.32 kB
|
||||
dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 11.35 kB
|
||||
dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf 11.51 kB
|
||||
dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 12.03 kB
|
||||
dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 12.22 kB
|
||||
dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf 12.23 kB
|
||||
dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff 12.32 kB
|
||||
dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf 12.34 kB
|
||||
dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf 12.37 kB
|
||||
dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff 13.21 kB
|
||||
dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff 13.30 kB
|
||||
dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 13.57 kB
|
||||
dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff 14.11 kB
|
||||
dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff 14.41 kB
|
||||
dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff 16.03 kB
|
||||
dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 16.40 kB
|
||||
dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 16.44 kB
|
||||
dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf 16.65 kB
|
||||
dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 16.78 kB
|
||||
dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 16.99 kB
|
||||
dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff 18.67 kB
|
||||
dist/assets/KaTeX_Math-Italic-DA0__PXp.woff 18.75 kB
|
||||
dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff 19.41 kB
|
||||
dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf 19.44 kB
|
||||
dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf 19.57 kB
|
||||
dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf 19.58 kB
|
||||
dist/assets/KaTeX_Main-Italic-BMLOBm91.woff 19.68 kB
|
||||
dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf 22.36 kB
|
||||
dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf 24.50 kB
|
||||
dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 25.32 kB
|
||||
dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 26.27 kB
|
||||
dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf 27.56 kB
|
||||
dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 28.08 kB
|
||||
dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff 29.91 kB
|
||||
dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff 30.77 kB
|
||||
dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf 31.20 kB
|
||||
dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf 31.31 kB
|
||||
dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf 32.97 kB
|
||||
dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff 33.52 kB
|
||||
dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf 33.58 kB
|
||||
dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf 51.34 kB
|
||||
dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf 53.58 kB
|
||||
dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf 63.63 kB
|
||||
dist/assets/index-Bq7tVxen.css 6.58 kB │ gzip: 1.99 kB
|
||||
dist/assets/katex-BOvhZl6_.css 30.25 kB │ gzip: 8.09 kB
|
||||
dist/assets/channel-BfJwwRpp.js 0.12 kB │ gzip: 0.13 kB
|
||||
dist/assets/katexRender-DyvI-2y4.js 0.15 kB │ gzip: 0.15 kB
|
||||
dist/assets/init-Gi6I4Gst.js 0.15 kB │ gzip: 0.13 kB
|
||||
dist/assets/chunk-2Q5K7J3B-uTOCI7Q6.js 0.19 kB │ gzip: 0.16 kB
|
||||
dist/assets/chunk-JWPE2WC7-XT1Uk_Wd.js 0.23 kB │ gzip: 0.17 kB
|
||||
dist/assets/chunk-XXDRQBXY-BQQAE_YR.js 0.23 kB │ gzip: 0.21 kB
|
||||
dist/assets/git-branch-DnbMF9Ta.js 0.26 kB │ gzip: 0.22 kB
|
||||
dist/assets/chunk-5VM5RSS4-bdjTZQ6T.js 0.37 kB │ gzip: 0.27 kB
|
||||
dist/assets/stateDiagram-v2-MP3YSRHH-D8xLZpRh.js 0.43 kB │ gzip: 0.30 kB
|
||||
dist/assets/classDiagram-ZZMXUADV-Cbnxqsgo.js 0.47 kB │ gzip: 0.32 kB
|
||||
dist/assets/classDiagram-v2-VYDZK3BY-Cbnxqsgo.js 0.47 kB │ gzip: 0.32 kB
|
||||
dist/assets/chunk-POPQ4Y6H-gkirj3bW.js 0.51 kB │ gzip: 0.36 kB
|
||||
dist/assets/swimlanesDiagram-VR7AAH4N-B7pc-EEh.js 0.55 kB │ gzip: 0.37 kB
|
||||
dist/assets/calculator-DLdbzBVB.js 0.56 kB │ gzip: 0.30 kB
|
||||
dist/assets/infoDiagram-27XIBGKW-l1wxAnOE.js 0.59 kB │ gzip: 0.41 kB
|
||||
dist/assets/sizeCapture-INFHLROL-CYWtpJ9D.js 0.94 kB │ gzip: 0.53 kB
|
||||
dist/assets/downloadDocx-Bddr_kIU.js 1.13 kB │ gzip: 0.77 kB
|
||||
dist/assets/ordinal-Cboi1Yqb.js 1.19 kB │ gzip: 0.57 kB
|
||||
dist/assets/railroadDiagram-O6MQD6OU-ClT_qINL.js 1.61 kB │ gzip: 0.75 kB
|
||||
dist/assets/MathBlockView-e6Rb4-gV.js 1.67 kB │ gzip: 0.97 kB
|
||||
dist/assets/abnfDiagram-VCTEODGH-BVkj8OVT.js 1.81 kB │ gzip: 0.89 kB
|
||||
dist/assets/chunk-F27PBJKO-Dgo9Gtcs.js 1.88 kB │ gzip: 0.83 kB
|
||||
dist/assets/pegDiagram-XKGWAZYB-DnPbJpOy.js 1.96 kB │ gzip: 0.92 kB
|
||||
dist/assets/ebnfDiagram-PWID7BFC-54FfkSMl.js 2.01 kB │ gzip: 0.88 kB
|
||||
dist/assets/xlsxRenderer-BQPATLFB.js 2.79 kB │ gzip: 1.69 kB
|
||||
dist/assets/arc-CUrDgjVN.js 3.44 kB │ gzip: 1.48 kB
|
||||
dist/assets/MermaidBlockView-DwNkl3ap.js 3.69 kB │ gzip: 1.80 kB
|
||||
dist/assets/diagram-Z3DM3KII-a-qZw1qk.js 4.21 kB │ gzip: 1.83 kB
|
||||
dist/assets/defaultLocale-DX6XiGOO.js 4.69 kB │ gzip: 2.18 kB
|
||||
dist/assets/renderClipboardHtml-DNks-NYn.js 5.18 kB │ gzip: 1.78 kB
|
||||
dist/assets/ExcelViewer-C-uhjzR3.js 5.55 kB │ gzip: 2.21 kB
|
||||
dist/assets/linear-D26aJrq_.js 5.66 kB │ gzip: 2.31 kB
|
||||
dist/assets/diagram-UQ7AKVKN-L5S0mnJH.js 6.08 kB │ gzip: 2.62 kB
|
||||
dist/assets/pieDiagram-E7YTZNPT-CKXYLQsw.js 6.29 kB │ gzip: 2.62 kB
|
||||
dist/assets/ChatExportModal-ZKDesrgU.js 7.58 kB │ gzip: 3.29 kB
|
||||
dist/assets/diagram-S7CK7UJ4-DwEHTr9H.js 8.22 kB │ gzip: 3.68 kB
|
||||
dist/assets/cynefinDiagram-5FMLGOSQ-CjIn0d4r.js 10.10 kB │ gzip: 3.63 kB
|
||||
dist/assets/stateDiagram-D77RDMKH-D3uJTdk1.js 10.36 kB │ gzip: 3.62 kB
|
||||
dist/assets/dagre-GXQ25YYZ-Br4clnZ4.js 10.68 kB │ gzip: 4.03 kB
|
||||
dist/assets/diagram-VSXAHHWV-B94NtSJt.js 10.72 kB │ gzip: 4.13 kB
|
||||
dist/assets/chunk-SVP7TREG-Cvh37gp2.js 15.74 kB │ gzip: 4.41 kB
|
||||
dist/assets/diagram-VX7I27RA-OsWbj59z.js 15.96 kB │ gzip: 5.70 kB
|
||||
dist/assets/ishikawaDiagram-5VMMS53U-UMdWulmn.js 17.47 kB │ gzip: 6.64 kB
|
||||
dist/assets/kanban-definition-UXKFOSKX-CD7ejFC6.js 20.29 kB │ gzip: 7.21 kB
|
||||
dist/assets/BlockEditorModal-BnxSXG3Y.js 22.24 kB │ gzip: 6.47 kB
|
||||
dist/assets/mindmap-definition-YA3MSWOX-z9yI3Rzh.js 23.18 kB │ gzip: 7.83 kB
|
||||
dist/assets/sankeyDiagram-P5KCCOFB-Crif7qEu.js 23.20 kB │ gzip: 8.56 kB
|
||||
dist/assets/journeyDiagram-3NMN7TZE-CftwVon3.js 23.57 kB │ gzip: 8.35 kB
|
||||
dist/assets/wardleyDiagram-VM6X3IG4-B5ztUCag.js 25.50 kB │ gzip: 6.79 kB
|
||||
dist/assets/gitGraphDiagram-WWUBYQGX-9eJDhhQ4.js 29.42 kB │ gzip: 8.70 kB
|
||||
dist/assets/FilePreviewPanel-BGiT-Wnx.js 30.12 kB │ gzip: 8.96 kB
|
||||
dist/assets/erDiagram-RLTQ6QDP-BoxgzrMe.js 30.79 kB │ gzip: 10.59 kB
|
||||
dist/assets/timeline-definition-24CTP7MA-iz88ctaM.js 30.83 kB │ gzip: 10.15 kB
|
||||
dist/assets/requirementDiagram-BXWQKSXE-BX6EBH5t.js 31.00 kB │ gzip: 9.73 kB
|
||||
dist/assets/quadrantDiagram-AXDQQJYC-DZjmivaJ.js 34.01 kB │ gzip: 9.98 kB
|
||||
dist/assets/layout-Djz3E9Gc.js 35.44 kB │ gzip: 12.75 kB
|
||||
dist/assets/chunk-IMKFNOWR-BLn721X6.js 38.08 kB │ gzip: 12.51 kB
|
||||
dist/assets/docxRenderer-CpbJK_2A.js 40.90 kB │ gzip: 12.04 kB
|
||||
dist/assets/blockDiagram-I7D4REHJ-m2dQ6DwB.js 41.76 kB │ gzip: 13.58 kB
|
||||
dist/assets/vennDiagram-4TSXK5OY-CRFAuqgj.js 41.96 kB │ gzip: 15.70 kB
|
||||
dist/assets/xychartDiagram-S5SC5T6Z-cBS0nqgr.js 44.51 kB │ gzip: 12.60 kB
|
||||
dist/assets/chunk-TICWLB2K-BOi7bFWd.js 49.18 kB │ gzip: 15.75 kB
|
||||
dist/assets/flowDiagram-HODETNUW-CU0c2Blo.js 61.85 kB │ gzip: 19.87 kB
|
||||
dist/assets/c4Diagram-7LVT6UL2-9k1FMogZ.js 65.47 kB │ gzip: 18.79 kB
|
||||
dist/assets/AdminConsoleView-CwJg_ndc.js 69.32 kB │ gzip: 16.78 kB
|
||||
dist/assets/ganttDiagram-EL5Y4UJY-C_ndl5DA.js 69.70 kB │ gzip: 23.55 kB
|
||||
dist/assets/cose-bilkent-JH36ORCC-DzoPaotq.js 81.70 kB │ gzip: 22.47 kB
|
||||
dist/assets/swimlanes-42K2YHIH-C1T0E6dV.js 115.79 kB │ gzip: 42.51 kB
|
||||
dist/assets/sequenceDiagram-WJ2MYXX4-lda98sk9.js 116.96 kB │ gzip: 31.13 kB
|
||||
dist/assets/architectureDiagram-5GKGNRK7-9fgWXARD.js 151.83 kB │ gzip: 43.15 kB
|
||||
dist/assets/DocxViewer-DaITUexi.js 175.87 kB │ gzip: 52.31 kB
|
||||
dist/assets/katex-HP8lGamR.js 261.31 kB │ gzip: 77.57 kB
|
||||
dist/assets/katex-BJxdM42i.js 261.44 kB │ gzip: 77.80 kB
|
||||
dist/assets/index-BXtlAAcH.js 365.75 kB │ gzip: 104.72 kB
|
||||
dist/assets/xlsx-Cig0qvpi.js 424.39 kB │ gzip: 141.60 kB
|
||||
dist/assets/cytoscape.esm-BB4DxJjf.js 443.04 kB │ gzip: 141.98 kB
|
||||
dist/assets/mermaid.core-xo-mZcUW.js 682.57 kB │ gzip: 168.90 kB
|
||||
dist/assets/cynefin-OW5HDTMX-CVeVKynp.js 687.91 kB │ gzip: 154.14 kB
|
||||
dist/assets/index-DnAAyRch.js 804.12 kB │ gzip: 235.87 kB
|
||||
|
||||
(!) Some chunks are larger than 500 kB after minification. Consider:
|
||||
- Using dynamic import() to code-split the application
|
||||
- Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/configuration-options/#output-manualchunks
|
||||
- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.
|
||||
✓ built in 9.02s
|
||||
precompress: 66 candidate(s) under /home/weichen/projects/Agent-System/.worktrees/full-system-browser-e2e-2026-09-26/web/dist
|
||||
br assets/AdminConsoleView-CwJg_ndc.js 69315 → 13740 (−80.2%)
|
||||
gzip assets/AdminConsoleView-CwJg_ndc.js 69315 → 16392 (−76.4%)
|
||||
br assets/BlockEditorModal-BnxSXG3Y.js 22241 → 5383 (−75.8%)
|
||||
gzip assets/BlockEditorModal-BnxSXG3Y.js 22241 → 6376 (−71.3%)
|
||||
br assets/ChatExportModal-ZKDesrgU.js 7581 → 2732 (−64.0%)
|
||||
gzip assets/ChatExportModal-ZKDesrgU.js 7581 → 3243 (−57.2%)
|
||||
br assets/DocxViewer-DaITUexi.js 175867 → 46135 (−73.8%)
|
||||
gzip assets/DocxViewer-DaITUexi.js 175867 → 52082 (−70.4%)
|
||||
br assets/ExcelViewer-C-uhjzR3.js 5552 → 1888 (−66.0%)
|
||||
gzip assets/ExcelViewer-C-uhjzR3.js 5552 → 2195 (−60.5%)
|
||||
br assets/FilePreviewPanel-BGiT-Wnx.js 30116 → 7587 (−74.8%)
|
||||
gzip assets/FilePreviewPanel-BGiT-Wnx.js 30116 → 8811 (−70.7%)
|
||||
br assets/MathBlockView-e6Rb4-gV.js 1669 → 801 (−52.0%)
|
||||
gzip assets/MathBlockView-e6Rb4-gV.js 1669 → 963 (−42.3%)
|
||||
br assets/MermaidBlockView-DwNkl3ap.js 3690 → 1504 (−59.2%)
|
||||
gzip assets/MermaidBlockView-DwNkl3ap.js 3690 → 1794 (−51.4%)
|
||||
br assets/abnfDiagram-VCTEODGH-BVkj8OVT.js 1809 → 790 (−56.3%)
|
||||
gzip assets/abnfDiagram-VCTEODGH-BVkj8OVT.js 1809 → 894 (−50.6%)
|
||||
br assets/arc-CUrDgjVN.js 3441 → 1298 (−62.3%)
|
||||
gzip assets/arc-CUrDgjVN.js 3441 → 1455 (−57.7%)
|
||||
br assets/architectureDiagram-5GKGNRK7-9fgWXARD.js 151827 → 36956 (−75.7%)
|
||||
gzip assets/architectureDiagram-5GKGNRK7-9fgWXARD.js 151827 → 42841 (−71.8%)
|
||||
br assets/blockDiagram-I7D4REHJ-m2dQ6DwB.js 41757 → 11987 (−71.3%)
|
||||
gzip assets/blockDiagram-I7D4REHJ-m2dQ6DwB.js 41757 → 13470 (−67.7%)
|
||||
br assets/c4Diagram-7LVT6UL2-9k1FMogZ.js 65473 → 15181 (−76.8%)
|
||||
gzip assets/c4Diagram-7LVT6UL2-9k1FMogZ.js 65473 → 18679 (−71.5%)
|
||||
br assets/chunk-F27PBJKO-Dgo9Gtcs.js 1883 → 731 (−61.2%)
|
||||
gzip assets/chunk-F27PBJKO-Dgo9Gtcs.js 1883 → 832 (−55.8%)
|
||||
br assets/chunk-IMKFNOWR-BLn721X6.js 38076 → 10982 (−71.2%)
|
||||
gzip assets/chunk-IMKFNOWR-BLn721X6.js 38076 → 12433 (−67.3%)
|
||||
br assets/chunk-SVP7TREG-Cvh37gp2.js 15735 → 3963 (−74.8%)
|
||||
gzip assets/chunk-SVP7TREG-Cvh37gp2.js 15735 → 4418 (−71.9%)
|
||||
br assets/chunk-TICWLB2K-BOi7bFWd.js 49178 → 13016 (−73.5%)
|
||||
gzip assets/chunk-TICWLB2K-BOi7bFWd.js 49178 → 15646 (−68.2%)
|
||||
br assets/cose-bilkent-JH36ORCC-DzoPaotq.js 81701 → 19616 (−76.0%)
|
||||
gzip assets/cose-bilkent-JH36ORCC-DzoPaotq.js 81701 → 22392 (−72.6%)
|
||||
br assets/cynefin-OW5HDTMX-CVeVKynp.js 687913 → 124631 (−81.9%)
|
||||
gzip assets/cynefin-OW5HDTMX-CVeVKynp.js 687913 → 153068 (−77.7%)
|
||||
br assets/cynefinDiagram-5FMLGOSQ-CjIn0d4r.js 10097 → 3248 (−67.8%)
|
||||
gzip assets/cynefinDiagram-5FMLGOSQ-CjIn0d4r.js 10097 → 3621 (−64.1%)
|
||||
br assets/cytoscape.esm-BB4DxJjf.js 443036 → 119602 (−73.0%)
|
||||
gzip assets/cytoscape.esm-BB4DxJjf.js 443036 → 141741 (−68.0%)
|
||||
br assets/dagre-GXQ25YYZ-Br4clnZ4.js 10676 → 3690 (−65.4%)
|
||||
gzip assets/dagre-GXQ25YYZ-Br4clnZ4.js 10676 → 4047 (−62.1%)
|
||||
br assets/defaultLocale-DX6XiGOO.js 4688 → 2012 (−57.1%)
|
||||
gzip assets/defaultLocale-DX6XiGOO.js 4688 → 2166 (−53.8%)
|
||||
br assets/diagram-S7CK7UJ4-DwEHTr9H.js 8217 → 3331 (−59.5%)
|
||||
gzip assets/diagram-S7CK7UJ4-DwEHTr9H.js 8217 → 3679 (−55.2%)
|
||||
br assets/diagram-UQ7AKVKN-L5S0mnJH.js 6079 → 2373 (−61.0%)
|
||||
gzip assets/diagram-UQ7AKVKN-L5S0mnJH.js 6079 → 2617 (−57.0%)
|
||||
br assets/diagram-VSXAHHWV-B94NtSJt.js 10716 → 3786 (−64.7%)
|
||||
gzip assets/diagram-VSXAHHWV-B94NtSJt.js 10716 → 4154 (−61.2%)
|
||||
br assets/diagram-VX7I27RA-OsWbj59z.js 15957 → 5181 (−67.5%)
|
||||
gzip assets/diagram-VX7I27RA-OsWbj59z.js 15957 → 5706 (−64.2%)
|
||||
br assets/diagram-Z3DM3KII-a-qZw1qk.js 4211 → 1647 (−60.9%)
|
||||
gzip assets/diagram-Z3DM3KII-a-qZw1qk.js 4211 → 1818 (−56.8%)
|
||||
br assets/docxRenderer-CpbJK_2A.js 40904 → 10522 (−74.3%)
|
||||
gzip assets/docxRenderer-CpbJK_2A.js 40904 → 11977 (−70.7%)
|
||||
br assets/downloadDocx-Bddr_kIU.js 1130 → 610 (−46.0%)
|
||||
gzip assets/downloadDocx-Bddr_kIU.js 1130 → 768 (−32.0%)
|
||||
br assets/ebnfDiagram-PWID7BFC-54FfkSMl.js 2005 → 785 (−60.8%)
|
||||
gzip assets/ebnfDiagram-PWID7BFC-54FfkSMl.js 2005 → 883 (−56.0%)
|
||||
br assets/erDiagram-RLTQ6QDP-BoxgzrMe.js 30790 → 9162 (−70.2%)
|
||||
gzip assets/erDiagram-RLTQ6QDP-BoxgzrMe.js 30790 → 10540 (−65.8%)
|
||||
br assets/flowDiagram-HODETNUW-CU0c2Blo.js 61847 → 16361 (−73.5%)
|
||||
gzip assets/flowDiagram-HODETNUW-CU0c2Blo.js 61847 → 19718 (−68.1%)
|
||||
br assets/ganttDiagram-EL5Y4UJY-C_ndl5DA.js 69695 → 20671 (−70.3%)
|
||||
gzip assets/ganttDiagram-EL5Y4UJY-C_ndl5DA.js 69695 → 23425 (−66.4%)
|
||||
br assets/gitGraphDiagram-WWUBYQGX-9eJDhhQ4.js 29417 → 7784 (−73.5%)
|
||||
gzip assets/gitGraphDiagram-WWUBYQGX-9eJDhhQ4.js 29417 → 8695 (−70.4%)
|
||||
br assets/index-BXtlAAcH.js 365745 → 89917 (−75.4%)
|
||||
gzip assets/index-BXtlAAcH.js 365745 → 104064 (−71.5%)
|
||||
br assets/index-Bq7tVxen.css 6576 → 1656 (−74.8%)
|
||||
gzip assets/index-Bq7tVxen.css 6576 → 1974 (−70.0%)
|
||||
br assets/index-DnAAyRch.js 804120 → 185404 (−76.9%)
|
||||
gzip assets/index-DnAAyRch.js 804120 → 232625 (−71.1%)
|
||||
br assets/ishikawaDiagram-5VMMS53U-UMdWulmn.js 17469 → 6028 (−65.5%)
|
||||
gzip assets/ishikawaDiagram-5VMMS53U-UMdWulmn.js 17469 → 6634 (−62.0%)
|
||||
br assets/journeyDiagram-3NMN7TZE-CftwVon3.js 23571 → 7531 (−68.0%)
|
||||
gzip assets/journeyDiagram-3NMN7TZE-CftwVon3.js 23571 → 8332 (−64.7%)
|
||||
br assets/kanban-definition-UXKFOSKX-CD7ejFC6.js 20291 → 6425 (−68.3%)
|
||||
gzip assets/kanban-definition-UXKFOSKX-CD7ejFC6.js 20291 → 7172 (−64.7%)
|
||||
br assets/katex-BJxdM42i.js 261435 → 63900 (−75.6%)
|
||||
gzip assets/katex-BJxdM42i.js 261435 → 77355 (−70.4%)
|
||||
br assets/katex-BOvhZl6_.css 30249 → 6978 (−76.9%)
|
||||
gzip assets/katex-BOvhZl6_.css 30249 → 8010 (−73.5%)
|
||||
br assets/katex-HP8lGamR.js 261313 → 63694 (−75.6%)
|
||||
gzip assets/katex-HP8lGamR.js 261313 → 77109 (−70.5%)
|
||||
br assets/layout-Djz3E9Gc.js 35436 → 11533 (−67.5%)
|
||||
gzip assets/layout-Djz3E9Gc.js 35436 → 12751 (−64.0%)
|
||||
br assets/linear-D26aJrq_.js 5661 → 2115 (−62.6%)
|
||||
gzip assets/linear-D26aJrq_.js 5661 → 2317 (−59.1%)
|
||||
br assets/mermaid.core-xo-mZcUW.js 682569 → 140414 (−79.4%)
|
||||
gzip assets/mermaid.core-xo-mZcUW.js 682569 → 168125 (−75.4%)
|
||||
br assets/mindmap-definition-YA3MSWOX-z9yI3Rzh.js 23175 → 6998 (−69.8%)
|
||||
gzip assets/mindmap-definition-YA3MSWOX-z9yI3Rzh.js 23175 → 7799 (−66.3%)
|
||||
br assets/ordinal-Cboi1Yqb.js 1189 → 497 (−58.2%)
|
||||
gzip assets/ordinal-Cboi1Yqb.js 1189 → 574 (−51.7%)
|
||||
br assets/pegDiagram-XKGWAZYB-DnPbJpOy.js 1956 → 819 (−58.1%)
|
||||
gzip assets/pegDiagram-XKGWAZYB-DnPbJpOy.js 1956 → 926 (−52.7%)
|
||||
br assets/pieDiagram-E7YTZNPT-CKXYLQsw.js 6294 → 2406 (−61.8%)
|
||||
gzip assets/pieDiagram-E7YTZNPT-CKXYLQsw.js 6294 → 2628 (−58.2%)
|
||||
br assets/quadrantDiagram-AXDQQJYC-DZjmivaJ.js 34010 → 8525 (−74.9%)
|
||||
gzip assets/quadrantDiagram-AXDQQJYC-DZjmivaJ.js 34010 → 9875 (−71.0%)
|
||||
br assets/railroadDiagram-O6MQD6OU-ClT_qINL.js 1606 → 694 (−56.8%)
|
||||
gzip assets/railroadDiagram-O6MQD6OU-ClT_qINL.js 1606 → 756 (−52.9%)
|
||||
br assets/renderClipboardHtml-DNks-NYn.js 5180 → 1453 (−71.9%)
|
||||
gzip assets/renderClipboardHtml-DNks-NYn.js 5180 → 1779 (−65.7%)
|
||||
br assets/requirementDiagram-BXWQKSXE-BX6EBH5t.js 31000 → 8261 (−73.4%)
|
||||
gzip assets/requirementDiagram-BXWQKSXE-BX6EBH5t.js 31000 → 9662 (−68.8%)
|
||||
br assets/sankeyDiagram-P5KCCOFB-Crif7qEu.js 23198 → 7812 (−66.3%)
|
||||
gzip assets/sankeyDiagram-P5KCCOFB-Crif7qEu.js 23198 → 8565 (−63.1%)
|
||||
br assets/sequenceDiagram-WJ2MYXX4-lda98sk9.js 116962 → 25751 (−78.0%)
|
||||
gzip assets/sequenceDiagram-WJ2MYXX4-lda98sk9.js 116962 → 30955 (−73.5%)
|
||||
br assets/stateDiagram-D77RDMKH-D3uJTdk1.js 10361 → 3331 (−67.9%)
|
||||
gzip assets/stateDiagram-D77RDMKH-D3uJTdk1.js 10361 → 3624 (−65.0%)
|
||||
br assets/swimlanes-42K2YHIH-C1T0E6dV.js 115791 → 36672 (−68.3%)
|
||||
gzip assets/swimlanes-42K2YHIH-C1T0E6dV.js 115791 → 42170 (−63.6%)
|
||||
br assets/timeline-definition-24CTP7MA-iz88ctaM.js 30829 → 9146 (−70.3%)
|
||||
gzip assets/timeline-definition-24CTP7MA-iz88ctaM.js 30829 → 10144 (−67.1%)
|
||||
br assets/vennDiagram-4TSXK5OY-CRFAuqgj.js 41961 → 14018 (−66.6%)
|
||||
gzip assets/vennDiagram-4TSXK5OY-CRFAuqgj.js 41961 → 15643 (−62.7%)
|
||||
br assets/wardleyDiagram-VM6X3IG4-B5ztUCag.js 25502 → 6092 (−76.1%)
|
||||
gzip assets/wardleyDiagram-VM6X3IG4-B5ztUCag.js 25502 → 6752 (−73.5%)
|
||||
br assets/xlsx-Cig0qvpi.js 424392 → 117659 (−72.3%)
|
||||
gzip assets/xlsx-Cig0qvpi.js 424392 → 140814 (−66.8%)
|
||||
br assets/xlsxRenderer-BQPATLFB.js 2785 → 1354 (−51.4%)
|
||||
gzip assets/xlsxRenderer-BQPATLFB.js 2785 → 1677 (−39.8%)
|
||||
br assets/xychartDiagram-S5SC5T6Z-cBS0nqgr.js 44509 → 11037 (−75.2%)
|
||||
gzip assets/xychartDiagram-S5SC5T6Z-cBS0nqgr.js 44509 → 12533 (−71.8%)
|
||||
br fonts/OFL.txt 4474 → 1437 (−67.9%)
|
||||
gzip fonts/OFL.txt 4474 → 1980 (−55.7%)
|
||||
precompress: wrote 66 .br and 66 .gz
|
||||
@@ -0,0 +1,5 @@
|
||||
deployed_at=2026-09-26T04:28:17Z
|
||||
worktree_head=a5ca6fdcfde36b87ca0d9bec9764875fe1fbfaa1
|
||||
worktree_short=a5ca6fdc
|
||||
main_dist_index_BXtlAAcH_md5=8a26c5cf45aca06ff5c71d30fa1bd22c
|
||||
note=rsync WT/web/dist -> MAIN/web/dist; :8080 serves static; schema 75
|
||||
@@ -398,8 +398,51 @@ async function waitForSquadCompletion(page: Page, userPromptSnippet: string, tim
|
||||
let verdict = await observe();
|
||||
if (verdict.action === 'reject') fail(`squad observation rejected: ${verdict.reason}`);
|
||||
if (verdict.action === 'accept') return Date.now() - startedAt;
|
||||
await expect(assistant).toHaveAttribute('data-chat-status', ANY_TERMINAL_STATUS_RE, { timeout: timeoutMs });
|
||||
|
||||
// Mid-wait heal: if steps look done but status stuck pending, reload to pick history task_status.
|
||||
const healDeadline = Date.now() + Math.min(timeoutMs, 480_000);
|
||||
while (Date.now() < healDeadline) {
|
||||
try {
|
||||
await expect(assistant).toHaveAttribute('data-chat-status', ANY_TERMINAL_STATUS_RE, {
|
||||
timeout: 60_000,
|
||||
});
|
||||
break;
|
||||
} catch {
|
||||
const status = (await assistant.getAttribute('data-chat-status')) || '';
|
||||
const body = await page.locator('body').innerText().catch(() => '');
|
||||
const phasesDone =
|
||||
/质量门禁已完成|质量.*100|简报已完成|组建小队已完成/.test(body) ||
|
||||
(await page.getByText(/质量门禁已完成|任务已完成/).count()) > 0;
|
||||
if (status === 'pending' || status === 'streaming_status') {
|
||||
if (phasesDone || Date.now() - startedAt > 240_000) {
|
||||
await page.reload();
|
||||
await expect(page.getByText(PROJECT_NAME, { exact: false }).first()).toBeVisible({
|
||||
timeout: 30_000,
|
||||
});
|
||||
await openProject(page);
|
||||
const again = turnAssistantLocator(page, userPromptSnippet);
|
||||
await expect(again.assistant).toBeVisible({ timeout: 30_000 });
|
||||
const healed = (await again.assistant.getAttribute('data-chat-status')) || '';
|
||||
if (ANY_TERMINAL_STATUS_RE.test(healed)) {
|
||||
return Date.now() - startedAt;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const finalAssistant = turnAssistantLocator(page, userPromptSnippet).assistant;
|
||||
await expect(finalAssistant).toHaveAttribute('data-chat-status', ANY_TERMINAL_STATUS_RE, {
|
||||
timeout: Math.max(30_000, timeoutMs - (Date.now() - startedAt)),
|
||||
});
|
||||
verdict = await observe();
|
||||
// Re-bind observe to final assistant
|
||||
const status = (await finalAssistant.getAttribute('data-chat-status')) || '';
|
||||
const hasVisibleError = await connErr.first().isVisible().catch(() => false);
|
||||
verdict = evaluateSquadObservation(
|
||||
{ userPromptMatched: true, assistantAdjacent: true, status, hasVisibleError },
|
||||
{ requireInflight: false },
|
||||
);
|
||||
if (verdict.action === 'reject') fail(`squad observation rejected: ${verdict.reason}`);
|
||||
if (verdict.action !== 'accept') fail(`squad terminal not accepted: ${verdict.reason}`);
|
||||
return Date.now() - startedAt;
|
||||
|
||||
@@ -108,6 +108,7 @@ export async function readTaskRunSSEOnce(
|
||||
|
||||
/**
|
||||
* 订阅任务 SSE:意外 EOF / 不完整 chunked 时按最后 seq 重订阅同一 run,禁止调用方据此 POST 新 run。
|
||||
* 重连前可经 onGap 轮询 run 终态:若已 completed 等则停止订阅(避免 done 丢失后永久 pending)。
|
||||
*/
|
||||
export async function subscribeTaskRunEvents(
|
||||
runId: string,
|
||||
@@ -117,6 +118,8 @@ export async function subscribeTaskRunEvents(
|
||||
maxReconnects?: number;
|
||||
reconnectDelayMs?: number;
|
||||
sleep?: (ms: number) => Promise<void>;
|
||||
/** Return true to stop reconnecting (caller already settled from GET /runs). */
|
||||
onGap?: (ctx: { afterSeq: number; attempt: number }) => Promise<boolean>;
|
||||
},
|
||||
signal?: AbortSignal,
|
||||
): Promise<void> {
|
||||
@@ -131,12 +134,20 @@ export async function subscribeTaskRunEvents(
|
||||
const { terminal, lastSeq } = await readTaskRunSSEOnce(runId, afterSeq, handlers.onEvent, signal);
|
||||
afterSeq = Math.max(afterSeq, lastSeq);
|
||||
if (terminal) return;
|
||||
// 意外 EOF:未见到 done/error,按 after_seq 重连
|
||||
// 意外 EOF:未见到 done/error — 先问 onGap,再按 after_seq 重连
|
||||
if (handlers.onGap) {
|
||||
const stop = await handlers.onGap({ afterSeq, attempt });
|
||||
if (stop) return;
|
||||
}
|
||||
} catch (err) {
|
||||
if (signal?.aborted) return;
|
||||
if (err instanceof TaskRunHttpError && isNonRetryableStatus(err.status)) {
|
||||
throw err;
|
||||
}
|
||||
if (handlers.onGap) {
|
||||
const stop = await handlers.onGap({ afterSeq, attempt }).catch(() => false);
|
||||
if (stop) return;
|
||||
}
|
||||
if (attempt >= maxReconnects) throw err;
|
||||
}
|
||||
if (attempt >= maxReconnects) {
|
||||
|
||||
@@ -46,3 +46,43 @@ test('mergeLiveOverHistory preserves server id from live', () => {
|
||||
assert.equal(merged.id, 'msg-101');
|
||||
assert.equal(merged.serverId, 101);
|
||||
});
|
||||
|
||||
test('mergeLiveOverHistory does not let inflight live mask terminal history', () => {
|
||||
const history = base({
|
||||
id: 'msg-243',
|
||||
role: 'assistant',
|
||||
serverId: 243,
|
||||
status: 'completed',
|
||||
content: '任务摘要',
|
||||
livePhaseLabel: undefined,
|
||||
});
|
||||
const live = base({
|
||||
id: 'ast-tmp',
|
||||
role: 'assistant',
|
||||
serverId: 243,
|
||||
status: 'pending',
|
||||
content: '任务执行中…',
|
||||
livePhaseLabel: '任务执行中…',
|
||||
});
|
||||
const merged = mergeLiveOverHistory(history, live);
|
||||
assert.equal(merged.id, 'msg-243');
|
||||
assert.equal(merged.status, 'completed');
|
||||
assert.equal(merged.livePhaseLabel, undefined);
|
||||
});
|
||||
|
||||
test('mergeLiveOverHistory keeps live terminal over history inflight', () => {
|
||||
const history = base({
|
||||
id: 'msg-10',
|
||||
role: 'assistant',
|
||||
serverId: 10,
|
||||
status: 'pending',
|
||||
});
|
||||
const live = base({
|
||||
id: 'ast-10',
|
||||
role: 'assistant',
|
||||
serverId: 10,
|
||||
status: 'completed',
|
||||
});
|
||||
const merged = mergeLiveOverHistory(history, live);
|
||||
assert.equal(merged.status, 'completed');
|
||||
});
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
import type { ChatMessage } from '../types/workbench';
|
||||
import type { AssistantMessageStatus, ChatMessage } from '../types/workbench';
|
||||
import {
|
||||
isErrorTerminalChatStatus,
|
||||
isInflightChatStatus,
|
||||
isSuccessTerminalChatStatus,
|
||||
} from '../lib/squadCompletionObservation';
|
||||
|
||||
/** 收集消息的所有可对账身份键 */
|
||||
export function getMessageKeys(m: ChatMessage): string[] {
|
||||
@@ -66,6 +71,31 @@ export function filterPendingLiveMessages(
|
||||
return liveMessages.filter((m) => !isLiveMessageInHistory(m, historyMessages));
|
||||
}
|
||||
|
||||
function isTerminalMessageStatus(status: string | undefined): boolean {
|
||||
if (!status) return false;
|
||||
return (
|
||||
isSuccessTerminalChatStatus(status) ||
|
||||
isErrorTerminalChatStatus(status) ||
|
||||
status === 'cancelled'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Prefer history terminal status when live is still inflight.
|
||||
* Otherwise a completed task_status from chat window refresh is masked by a
|
||||
* stale pending/streaming_status bubble (SSE done lost / reconnect gap).
|
||||
*/
|
||||
export function resolveMergedMessageStatus(
|
||||
historyStatus: string | undefined,
|
||||
liveStatus: string | undefined,
|
||||
): AssistantMessageStatus | undefined {
|
||||
const live = liveStatus || '';
|
||||
if (isInflightChatStatus(live) && isTerminalMessageStatus(historyStatus)) {
|
||||
return historyStatus as AssistantMessageStatus | undefined;
|
||||
}
|
||||
return (liveStatus ?? historyStatus) as AssistantMessageStatus | undefined;
|
||||
}
|
||||
|
||||
/** 用 live 流状态覆盖历史快照中的同一条消息 */
|
||||
export function mergeLiveOverHistory(
|
||||
history: ChatMessage,
|
||||
@@ -74,6 +104,8 @@ export function mergeLiveOverHistory(
|
||||
if (!isSameMessage(history, live)) {
|
||||
return history;
|
||||
}
|
||||
const preferHistoryTerminal =
|
||||
isInflightChatStatus(live.status || '') && isTerminalMessageStatus(history.status);
|
||||
return {
|
||||
...history,
|
||||
...live,
|
||||
@@ -82,8 +114,11 @@ export function mergeLiveOverHistory(
|
||||
clientTurnId: live.clientTurnId ?? history.clientTurnId,
|
||||
clientMessageId: live.clientMessageId ?? history.clientMessageId,
|
||||
phaseEvents: live.phaseEvents?.length ? live.phaseEvents : history.phaseEvents,
|
||||
livePhaseLabel: live.livePhaseLabel ?? history.livePhaseLabel,
|
||||
livePhaseLabel: preferHistoryTerminal
|
||||
? undefined
|
||||
: live.livePhaseLabel ?? history.livePhaseLabel,
|
||||
taskDurationMs: live.taskDurationMs ?? history.taskDurationMs,
|
||||
phaseSnapshot: live.phaseSnapshot ?? history.phaseSnapshot,
|
||||
status: resolveMergedMessageStatus(history.status, live.status),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -573,6 +573,82 @@ export function useTaskRunAttempts(input: TaskRunAttemptsInput) {
|
||||
}
|
||||
};
|
||||
|
||||
const settleFromRemoteIfTerminal = async (runId: string): Promise<boolean> => {
|
||||
if (settled || controller.signal.aborted) return settled;
|
||||
const remote = await getTaskRun(runId).catch(() => null);
|
||||
if (!remote) return false;
|
||||
const view = readRemoteTaskRun(remote);
|
||||
if (view.status === 'quality_failed') {
|
||||
settled = true;
|
||||
patchAsst({
|
||||
status: 'quality_failed',
|
||||
livePhaseLabel: undefined,
|
||||
taskWorkspaceId: view.workspaceId,
|
||||
taskRunId: runId,
|
||||
});
|
||||
taskRunStream.setThinking(sessionId, false);
|
||||
return true;
|
||||
}
|
||||
if (isBlockedGovernanceStatus(view.status)) {
|
||||
settled = true;
|
||||
patchAsst({
|
||||
status: 'blocked_pending_governance',
|
||||
content: GOVERNANCE_BLOCKED_HINT,
|
||||
livePhaseLabel: undefined,
|
||||
taskWorkspaceId: view.workspaceId,
|
||||
taskRunId: runId,
|
||||
});
|
||||
taskRunStream.setThinking(sessionId, false);
|
||||
return true;
|
||||
}
|
||||
if (view.status === 'completed' || view.status === 'pending_author_confirmation') {
|
||||
settled = true;
|
||||
const mapped = mapTaskStatusToMessageStatus(view.status, 'assistant') || 'completed';
|
||||
patchAsst({
|
||||
status: mapped,
|
||||
livePhaseLabel: undefined,
|
||||
taskWorkspaceId: view.workspaceId,
|
||||
taskRunId: runId,
|
||||
});
|
||||
taskRunStream.setThinking(sessionId, false);
|
||||
await syncControlledDocsAfterTask(task.taskKey || 'intake');
|
||||
await chatWindow.refresh().catch(() => undefined);
|
||||
return true;
|
||||
}
|
||||
if (view.status === 'failed' || view.status === 'finalizing_failed') {
|
||||
failOrRetry(buildFailedTaskErrorInfo(view.errorMessage));
|
||||
return true;
|
||||
}
|
||||
if (view.status === 'interrupted') {
|
||||
settled = true;
|
||||
patchAsst({
|
||||
status: 'failed',
|
||||
livePhaseLabel: undefined,
|
||||
taskWorkspaceId: view.workspaceId,
|
||||
taskRunId: runId,
|
||||
errorInfo: buildInterruptedTaskErrorInfo(view.errorMessage, view.workspaceId),
|
||||
});
|
||||
taskRunStream.setThinking(sessionId, false);
|
||||
return true;
|
||||
}
|
||||
if (view.status === 'cancelled') {
|
||||
failOrRetry(buildCancelledTaskErrorInfo());
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
const subscribeWithGapHeal = async (runId: string) => {
|
||||
await subscribeTaskRunEvents(
|
||||
runId,
|
||||
{
|
||||
onEvent,
|
||||
onGap: async () => settleFromRemoteIfTerminal(runId),
|
||||
},
|
||||
controller.signal,
|
||||
);
|
||||
};
|
||||
|
||||
const startObserver = async () => {
|
||||
if (mode === 'resume') {
|
||||
const runId = opts?.reconnectRunId?.trim();
|
||||
@@ -624,7 +700,7 @@ export function useTaskRunAttempts(input: TaskRunAttemptsInput) {
|
||||
taskWorkspaceId: resumed.workspace_id || workspaceId,
|
||||
livePhaseLabel: '正在继续任务…',
|
||||
});
|
||||
await subscribeTaskRunEvents(retainedRunId, { onEvent }, controller.signal);
|
||||
await subscribeWithGapHeal(retainedRunId);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -643,7 +719,7 @@ export function useTaskRunAttempts(input: TaskRunAttemptsInput) {
|
||||
retainedRunId = existingRunId;
|
||||
taskRunStream.setRunId(sessionId, existingRunId);
|
||||
patchAsst({ taskRunId: existingRunId, livePhaseLabel: '正在重连任务…' });
|
||||
await subscribeTaskRunEvents(existingRunId, { onEvent }, controller.signal);
|
||||
await subscribeWithGapHeal(existingRunId);
|
||||
return;
|
||||
}
|
||||
if (remote && isRemoteTaskTerminal(view.status)) {
|
||||
@@ -700,7 +776,7 @@ export function useTaskRunAttempts(input: TaskRunAttemptsInput) {
|
||||
await chatWindow.refresh().catch(() => undefined);
|
||||
return;
|
||||
}
|
||||
await subscribeTaskRunEvents(created.run_id, { onEvent }, controller.signal);
|
||||
await subscribeWithGapHeal(created.run_id);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -717,82 +793,17 @@ export function useTaskRunAttempts(input: TaskRunAttemptsInput) {
|
||||
const runId = retainedRunId || taskRunStream.activeTaskRunId || undefined;
|
||||
if (runId) {
|
||||
try {
|
||||
if (await settleFromRemoteIfTerminal(runId)) {
|
||||
return;
|
||||
}
|
||||
const remote = await getTaskRun(runId);
|
||||
const view = readRemoteTaskRun(remote);
|
||||
if (view.status === 'quality_failed') {
|
||||
settled = true;
|
||||
patchAsst({
|
||||
status: 'quality_failed',
|
||||
livePhaseLabel: undefined,
|
||||
taskWorkspaceId: view.workspaceId,
|
||||
taskRunId: runId,
|
||||
});
|
||||
taskRunStream.setThinking(sessionId, false);
|
||||
return;
|
||||
}
|
||||
if (isBlockedGovernanceStatus(view.status)) {
|
||||
settled = true;
|
||||
patchAsst({
|
||||
status: 'blocked_pending_governance',
|
||||
content: GOVERNANCE_BLOCKED_HINT,
|
||||
livePhaseLabel: undefined,
|
||||
taskWorkspaceId: view.workspaceId,
|
||||
taskRunId: runId,
|
||||
});
|
||||
taskRunStream.setThinking(sessionId, false);
|
||||
return;
|
||||
}
|
||||
if (view.status === 'completed') {
|
||||
settled = true;
|
||||
patchAsst({
|
||||
status: 'completed',
|
||||
livePhaseLabel: undefined,
|
||||
taskWorkspaceId: view.workspaceId,
|
||||
taskRunId: runId,
|
||||
});
|
||||
taskRunStream.setThinking(sessionId, false);
|
||||
await syncControlledDocsAfterTask(task.taskKey || 'intake');
|
||||
return;
|
||||
}
|
||||
if (view.status === 'pending_author_confirmation') {
|
||||
settled = true;
|
||||
patchAsst({
|
||||
status: 'pending_author_confirmation',
|
||||
livePhaseLabel: undefined,
|
||||
taskWorkspaceId: view.workspaceId,
|
||||
taskRunId: runId,
|
||||
});
|
||||
taskRunStream.setThinking(sessionId, false);
|
||||
await syncControlledDocsAfterTask(task.taskKey || 'intake');
|
||||
await chatWindow.refresh().catch(() => undefined);
|
||||
return;
|
||||
}
|
||||
if (shouldSubscribeExistingRun(view.status)) {
|
||||
// 原 run 仍在跑:重订阅,不 POST 新 run
|
||||
settled = false;
|
||||
retainedRunId = runId;
|
||||
patchAsst({ livePhaseLabel: '正在重连任务…', taskRunId: runId });
|
||||
await subscribeTaskRunEvents(runId, { onEvent }, controller.signal);
|
||||
return;
|
||||
}
|
||||
if (view.status === 'failed' || view.status === 'finalizing_failed') {
|
||||
failOrRetry(buildFailedTaskErrorInfo(view.errorMessage));
|
||||
return;
|
||||
}
|
||||
if (view.status === 'interrupted') {
|
||||
settled = true;
|
||||
patchAsst({
|
||||
status: 'failed',
|
||||
livePhaseLabel: undefined,
|
||||
taskWorkspaceId: view.workspaceId,
|
||||
taskRunId: runId,
|
||||
errorInfo: buildInterruptedTaskErrorInfo(view.errorMessage, view.workspaceId),
|
||||
});
|
||||
taskRunStream.setThinking(sessionId, false);
|
||||
return;
|
||||
}
|
||||
if (view.status === 'cancelled') {
|
||||
failOrRetry(buildCancelledTaskErrorInfo());
|
||||
await subscribeWithGapHeal(runId);
|
||||
return;
|
||||
}
|
||||
} catch {
|
||||
|
||||