Commit Graph

238 Commits

Author SHA1 Message Date
lyon 6f9a3755b1 feat: paginate code agent trace loading 2026-06-16 23:28:58 +08:00
Lyon 32a2e2d39f fix: remove frontend json-rpc probe (#1344) 2026-06-16 22:27:51 +08:00
lyon 2679b1f14e fix: load Code Agent traces through REST resource 2026-06-16 21:57:51 +08:00
lyon 7d1a012d7b fix: keep selected session tab in workbench rail 2026-06-16 19:42:02 +08:00
lyon ce1f1031f5 fix: unify code agent turn status authority 2026-06-16 19:21:13 +08:00
lyon e0ac07c2f5 fix: make session rail use stateless list authority 2026-06-16 18:31:45 +08:00
Lyon d7202b808d fix: unify session tab status authority (#1336) 2026-06-16 17:27:59 +08:00
lyon 884a95164c fix: scope code agent cancel targets 2026-06-16 15:40:49 +08:00
lyon 20c26246f3 fix(web): restore running code agent sessions after refresh 2026-06-16 14:44:38 +08:00
lyon 8557f1a464 fix: guard workbench URL reflection 2026-06-16 10:50:28 +08:00
Lyon 424a2ce780 fix: lock routed workbench composer session (#1323) 2026-06-16 10:15:15 +08:00
Lyon c71da8a062 fix: reflect live workbench turns in session tabs (#1319) 2026-06-16 09:03:09 +08:00
Lyon 126ccf73e2 fix: unify workbench session status (#1318) 2026-06-16 08:50:39 +08:00
lyon 515f185213 fix: show session loading state before conversations load 2026-06-16 08:01:33 +08:00
lyon c5bd542c30 fix: make workbench session timestamps user-driven 2026-06-16 07:03:00 +08:00
lyon d91b686f8f fix(web): keep selected workbench session visible 2026-06-16 05:51:11 +08:00
lyon 5a848a287c fix(web): preserve explicit workbench session selection 2026-06-16 05:23:54 +08:00
lyon 170ab43e79 fix: update session tab activity time 2026-06-16 04:09:52 +08:00
lyon 96b4557b0a fix(web): show tool command preview in trace rows 2026-06-15 20:50:27 +08:00
lyon a3762d1763 fix: hide trace debug details behind message details 2026-06-15 20:19:53 +08:00
lyon 97835afe54 fix: polish workbench markdown and trace controls 2026-06-15 19:47:23 +08:00
Lyon ee8bb81443 Merge pull request #1270 from pikasTech/fix/issue-1263-1264-workbench-probe
fix(web): 归一化 Workbench session 标题与 probe 证据
2026-06-15 19:12:33 +08:00
lyon 93c6dcee85 fix: auto toggle trace lifecycle in workbench 2026-06-15 19:11:29 +08:00
lyon d52f390568 fix(web): normalize workbench session titles 2026-06-15 19:11:12 +08:00
lyon f24f39bb3e fix: tighten agent trace workbench UI 2026-06-15 16:44:12 +08:00
Lyon b592e191e9 Merge pull request #1253 from pikasTech/fix/issue-1250-trace-consistency
fix: 对齐 Trace 实时流与 Web/CLI 去噪
2026-06-15 15:46:16 +08:00
lyon e984074de0 fix: align cloud web workbench bootstrap entry 2026-06-15 15:42:36 +08:00
lyon f2614ad521 fix: align trace rendering stream 2026-06-15 15:41:47 +08:00
lyon 53f8d94471 fix: tighten web trace reading 2026-06-15 14:44:47 +08:00
lyon 1bf3023009 fix: reduce trace rendering noise 2026-06-15 10:26:12 +08:00
lyon 200cc5a370 fix: 收敛 v0.3 Vue common architecture parity 2026-06-14 05:40:11 +08:00
lyon c71de6830f fix: restore v03 admin crud parity 2026-06-14 03:34:41 +08:00
lyon 5e751eff64 fix: stabilize v03 live web entry 2026-06-14 02:40:58 +08:00
lyon 94c25b967e fix: restore v03 live hwpod parity 2026-06-14 02:14:40 +08:00
lyon ee0b175128 fix: restore v03 composer session parity 2026-06-14 01:20:55 +08:00
lyon 5b4156a482 fix: restore v03 workbench parity foundation 2026-06-13 23:47:05 +08:00
Codex Agent 36fc82f5dc feat: migrate cloud web to vue platform shell 2026-06-12 01:17:11 +08:00
Codex Agent e74acf333b fix: preserve workbench project refresh path 2026-06-05 22:57:42 +08:00
Codex Agent d2ee808133 fix: collapse trace after final response 2026-06-05 22:34:03 +08:00
Codex Agent 3e7131f6ab refactor: converge hwpod node-ops channel 2026-06-05 17:23:56 +08:00
Codex Agent e54b3672d9 fix: keep v02 workspace history out of first screen LCP 2026-06-05 17:00:35 +08:00
Codex Agent 946d550056 fix: stabilize v02 workspace first paint 2026-06-05 14:58:37 +08:00
Codex Agent ac2d3001fa fix: depollute v02 web performance telemetry 2026-06-05 13:03:09 +08:00
Codex Agent f5be1c0361 feat: add v02 web performance dashboard 2026-06-05 12:00:23 +08:00
Codex Agent ab7d79c69a feat: expose v02 webui performance metrics 2026-06-05 11:14:27 +08:00
Codex Agent 9840dcc269 fix: add cloud web access route alias 2026-06-05 09:54:11 +08:00
Lyon 412f95f1a5 fix(v02): unify web trace markdown rendering (#858)
Co-authored-by: Codex Agent <codex@hwlab.local>
2026-06-04 21:33:01 +08:00
Lyon 2129cebfef fix(v02): improve trace and sidebar web ui (#854)
Co-authored-by: Codex Agent <codex@hwlab.local>
2026-06-04 20:56:43 +08:00
Lyon 10c03e6c32 fix(web): v0.2 unify Code Agent trace polling path + persist fail (HWLAB #802) (#806)
Follow-up to PR #798 (#795 final). PR #798 closed the total-timeout /
hard-cap issue, but left two residual code-path inconsistencies that
#802 captures:

- Submit path and refresh path used different trace-polling code:
  submitMessage called `pollRunnerTrace` + `waitForAgentResult` (a
  dual function pair from pre-#798), while hydrate() never subscribed
  to the running trace at all. After a page refresh, the user saw
  the cloud-api "running" state but no live trace events.
- The submit fail branch only dispatched a local "Code Agent 超时"
  message; it never called `persistConversation`, so the failure was
  invisible after F5 — the cloud-api conversation would show
  "running" forever from the user's perspective.

This PR collapses both into a single `subscribeToTrace` entry point
and wires the refresh path into the same active subscription:

- `state/runner-trace.ts` — replace `waitForAgentResult` +
  `pollRunnerTrace` with a single `subscribeToTrace(config)` that
  handles both the result endpoint and the trace endpoint in one
  `for(;;)` loop. Calls `onActivity` on EVERY successful poll (not
  just on new events) so the per-poll inactivity window in
  `fetchJson` does not fire on a healthy polling loop. Terminal
  status -> `onComplete`; 5xx -> keep polling, no activity; 4xx ->
  `onInfrastructureError`; `signal.aborted` -> silent return. The
  hard-cap / 4x / `TRACE_HARD_CAP_ATTEMPTS` machinery is gone (was
  already removed by #798).
- `state/trace-reattach.ts` — new `useTraceReattach` hook that
  subscribes to the running trace on hydrate (same `subscribeToTrace`
  call as submitMessage). Reuses an existing agent message slot for
  the traceId if one exists; otherwise creates a placeholder. Persists
  on both onComplete and onInfrastructureError. Path unification
  achieved: one entry, two callers.
- `state/workbench.ts`:
  - `submitMessage` calls `subscribeToTrace` directly with a
    single-line `onActivity: () => updateActivity()` plus
    `onComplete` / `onInfrastructureError` callbacks. The
    `onInfrastructureError` branch now ALSO calls
    `persistConversation`, persisting the fail state to cloud-api.
  - The re-attach useEffect is replaced with a one-liner
    `useTraceReattach({...})` call (workbench.ts stays under the
    400-line guard).
- `scripts/fetchJson-inactivity.test.ts` — third case tightened:
  200ms-cadence activity for 10s with `timeoutMs: 3000`; the
  request must live the full 10s and abort only after activity
  stops. Asserts `elapsed >= 10_000`.
- `docs/reference/spec-v02-hwlab-cloud-web.md` — the "Code Agent
  Timeout Model" section is renamed "Code Agent Timeout Model 与
  Path Unification" and now also pins: (a) `subscribeToTrace` is
  the only entry; `waitForAgentResult` / `pollRunnerTrace` /
  `TRACE_HARD_CAP_ATTEMPTS` MUST NOT exist; (b) `useTraceReattach`
  MUST be wired in; (c) `persistConversation` is required in both
  onComplete and onInfrastructureError; (d) `state.workspace.activeTraceId`
  changes MUST re-attach. Includes a distilled history of
  #775 / #777 / #791 / #795 / #797 / #798 / #802.

Verification
- `bun run scripts/tsc-check.ts` → strict React TSX, 0 explicit any
- `bun run check` → 5 pass / 0 fail (3 inactivity + 2 dist-contract)
- `bun run build` → 9 dist files verified fresh; `app.js`
  238460 → 240990 B
- `state/trace-reattach.ts` is now wired in; `state/runner-trace.ts`
  exports only `subscribeToTrace` (verified by tsc + grep)
- `workbench.ts` line count 400 (under the 400-line guard)
- New 200ms-cadence 10s test passes; old 100ms-cadence 2s test
  and total-timeout 200ms test still pass.

Refs: HWLAB #802, #795, #777, #791, #798

Co-authored-by: Codex Agent <codex@hwlab.local>
2026-06-04 11:08:20 +08:00
Lyon f7731d1421 fix(web): v0.2 remove all total-timeout / hard cap on Code Agent turn (HWLAB #795 final) (#798)
Follow-up to PR #797: drop every wall-clock or attempt-count ceiling from
`state/runner-trace.ts` so the Web UI's Code Agent inactivity-timeout
contract is total-cap-free. The previous PR kept a
`max(totalTimeoutMs * 4, totalTimeoutMs + 60s)` outer-loop safety net
plus a `TRACE_HARD_CAP_ATTEMPTS = 120` poll-count cap, which would
re-introduce the same regression class that #795 was filed against: a
long-running operation that keeps emitting trace events could still be
killed by the outer ceiling even with an active `activityRef`. The
"Code Agent Timeout Model" section of
`docs/reference/spec-v02-hwlab-cloud-web.md` now pins the contract:

- The sole abort signal is per-poll `fetchJson` inactivity-timeout,
  driven by `activityRef`.
- The outer `waitForAgentResult` / `pollRunnerTrace` loops are
  `for (;;)`. They only exit when the upstream returns a terminal
  status, the request fails with a non-5xx, or the inactivity window
  fires inside `fetchJson`.
- The per-poll `getAgentChatResult` call passes the full
  `totalTimeoutMs`; the inactivity window is **not** shrunk by
  wall-clock elapsed time.
- `TRACE_HARD_CAP_ATTEMPTS` and the 4x / +60s outer cap are deleted.
- Runaway protection is the caller's responsibility: Web users have
  cancel / steer / close-tab; CLI has `--timeout-ms`. The browser does
  not introduce an implicit cap.

Changes

- `web/hwlab-cloud-web/src/state/runner-trace.ts`:
  - Drop `const hardCapMs = Math.max(totalTimeoutMs * 4, totalTimeoutMs + 60_000)`
    and the `if (Date.now() - startedAt >= hardCapMs) break;` checks in
    both `waitForAgentResult` and `pollRunnerTrace`.
  - Replace `while (Date.now() - startedAt < hardCapMs)` with
    `for (;;)`. Drop the now-unused `startedAt` locals and the
    `let attempt = 0; attempt > TRACE_HARD_CAP_ATTEMPTS` guard.
  - Pass `totalTimeoutMs` directly to `api.getAgentChatResult` instead
    of `totalTimeoutMs - (Date.now() - startedAt)` so the per-poll
    inactivity window is stable.
  - Delete `const TRACE_HARD_CAP_ATTEMPTS = 120;` (no longer referenced).

- `web/hwlab-cloud-web/scripts/fetchJson-inactivity.test.ts`:
  - Replace the "1.5s cadence 6.5s" case with a stricter "200ms cadence
    10s" case: `timeoutMs=3000` inactivity window, continuous 200ms
    activity for 10s, then stop. Assert `elapsed >= 10_000` and that
    the abort is the inactivity-timeout error. This pins the
    `elapsed >= 10000` invariant in the spec.

- `docs/reference/spec-v02-hwlab-cloud-web.md`:
  - Strengthen the existing bullet in "在系统中的职责划分" to
    explicitly forbid total-timeout, hard cap, `codeAgentTimeoutMs * N`,
    poll-count cap, and wall-clock-shrunk per-poll windows.
  - Add a dedicated "Code Agent Timeout Model" section after "## 内部架构"
    that distils the contract, lists the three invariants, and records
    the history of #775 / #777 / #791 / #795 leading to the final state.

Verification

- `bun run scripts/tsc-check.ts` → strict React TSX, 0 explicit any
- `bun run check` → 5 pass / 0 fail (3 inactivity + 2 dist-contract)
- `bun run build` → 9 dist files verified fresh; `app.js` 241802 → 238460 B
  (delta reflects the deleted hardCap / TRACE_HARD_CAP_ATTEMPTS code)
- New 200ms-cadence 10s inactivity test runs for ~13s and asserts the
  request lives the full window — proving the outer cap is gone.

Refs: HWLAB #795 (final), #777, #791, #775

Co-authored-by: Codex <codex@local>
2026-06-04 09:36:29 +08:00