fix(resume): fix click-blocking footer overlay + hardening on HITL resume page#5381
Conversation
PR SummaryLow Risk Overview On the HITL resume page, display data previews are capped at 5,000 characters with a truncation notice; Reviewed by Cursor Bugbot for commit a672b26. Configure here. |
Greptile SummaryThis PR fixes a click-blocking overlay bug on the HITL resume page where
Confidence Score: 5/5Safe to merge — all changes are targeted bug fixes with no regressions introduced to existing flows. All three code paths touched (footer positioning, resume validation, payload de-dup) are mechanically straightforward and well-tested. The position:'static' change is additive and doesn't affect existing fixed/absolute callers. The data: undefined stripping is a standard JSON-serialization idiom. The handleResume refactor preserves all prior early-return semantics and adds proper error surfacing. Unit tests for the new de-dup behavior assert the right invariants. No files require special attention. Important Files Changed
Sequence Diagram%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
participant Browser
participant ResumePageClient
participant API as Resume API Route
participant Manager as PauseResumeManager
Browser->>ResumePageClient: Click "Resume Execution"
Note over Browser,ResumePageClient: Footer no longer overlaps button (position:static fix)
ResumePageClient->>ResumePageClient: handleResume() — validate form fields
alt Validation error
ResumePageClient-->>Browser: setError() — visible error message
else Valid payload
ResumePageClient->>API: "POST /resume {contextId, input}"
API->>Manager: getPauseContextDetail()
Manager->>Manager: Strip response.data from execution.pausePoints
Manager-->>API: "{execution (data stripped), pausePoint (full data)}"
API-->>ResumePageClient: "{ok, payload}"
ResumePageClient-->>Browser: Update UI (status, queue position)
end
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
sequenceDiagram
participant Browser
participant ResumePageClient
participant API as Resume API Route
participant Manager as PauseResumeManager
Browser->>ResumePageClient: Click "Resume Execution"
Note over Browser,ResumePageClient: Footer no longer overlaps button (position:static fix)
ResumePageClient->>ResumePageClient: handleResume() — validate form fields
alt Validation error
ResumePageClient-->>Browser: setError() — visible error message
else Valid payload
ResumePageClient->>API: "POST /resume {contextId, input}"
API->>Manager: getPauseContextDetail()
Manager->>Manager: Strip response.data from execution.pausePoints
Manager-->>API: "{execution (data stripped), pausePoint (full data)}"
API-->>ResumePageClient: "{ok, payload}"
ResumePageClient-->>Browser: Update UI (status, queue position)
end
Reviews (3): Last reviewed commit: "fix(resume): show em dash for empty-stri..." | Re-trigger Greptile |
…sume page - SupportFooter rendered position:absolute with no space reserved for it in InterfacesShell/AuthShell/file-share auth gate, silently overlapping and eating clicks on whatever content ended up in its ~50px footprint (on the resume page, the Resume Execution button itself) - Applied the same fix to /invite and /f/[token], which shared the identical absolute-positioning pattern - handleResume no longer fails silently on validation errors or unexpected exceptions - getPauseContextDetail no longer duplicates a pause point's full response payload in the same API response - Oversized HITL display-data values are now truncated in the resume page preview instead of rendering unbounded
45ed6ec to
66c7a10
Compare
The object-branch truncation notice sliced from the prettified JSON.stringify(value, null, 2) but reported the total against the compact JSON.stringify(value).length, which could show a nonsensical "5,000 of 4,800 characters shown" when the compact form is shorter than the prettified slice. Derive both from the same string.
|
@cursor review |
There was a problem hiding this comment.
✅ Bugbot reviewed your changes and found no new issues!
Comment @cursor review or bugbot run to trigger another review on this PR
Reviewed by Cursor Bugbot for commit 5c86fae. Configure here.
renderStructuredValuePreview only treated null/undefined as empty; an empty string fell through to the plain-text branch and rendered as a bordered, padded, contentless pill that reads as a stray UI element (e.g. an unstyled toggle) in the Display Data table.
There was a problem hiding this comment.
✅ Bugbot reviewed your changes and found no new issues!
Comment @cursor review or bugbot run to trigger another review on this PR
Reviewed by Cursor Bugbot for commit a672b26. Configure here.

Summary
SupportFooterrenderedposition: absolutewith no space reserved for it inInterfacesShell/AuthShell/file-share auth gate, so it silently overlapped and ate clicks on whatever content ended up in its ~50px footprint — on the resume page this was the "Resume Execution" button itself. Root-caused via live reproduction (seeded paused execution + headless browser), confirmed fix by re-running the same repro (click now dispatches the resume POST and gets 200)./inviteand/f/[token](public file-share auth gate), which shared the identical absolute-positioning patternhandleResumeno longer fails silently on validation errors or unexpected exceptions — always surfaces a visible errorgetPauseContextDetailno longer duplicates a pause point's full (potentially large) response payload in the same API responseType of Change
Testing
human-in-the-loop-manager.test.tsbun run lint, typecheck, and existing test suite all passChecklist