2.8 KiB
Human takeover and progress messages
Implemented
- Opening acknowledgements and results remain chat messages. Routine updates use
report_progress, which emitsuser_progressand replaces the current status text. Progress is not a final answer and is omitted from the saved transcript. - Raw model scratchpad and tool statuses do not become conversational progress. A collapsed execution-details panel contains only tool names and completion status, not arguments, model scratchpad or captured credentials.
browser_handoffandrequest_box_helpcreate an identified question. The UI automatically embeds the existing shared desktop in the conversation. It does not move Cloudflare widgets or create a different login session.- The shared viewer appears once, can be expanded, and does not expose restart/ update controls during takeover. The ordinary message composer is disabled during takeover; passwords and verification codes are entered on the original website, not in chat.
- The human presses Done to return control. The authenticated endpoint accepts only task ID, question ID and an enumerated done/cancel action. Completion is delivered directly to the original worker without a coordinator model round. Owner, pending question and task status are checked; duplicate submissions are idempotent. Cancel affects only that task and its children.
- Waiting tasks retain their tool context/browser session. New AI desktop, browser and external-execution requests are rejected while a human holds the shared computer. Other public research can continue.
- Hand-back is a request to inspect the original page, not proof of login success. Bounded research permits one verification read after hand-back even when its collection limit has been reached.
Security boundary and deferred integrations
This version deliberately uses the original website in the embedded desktop. It does not provide a separate password/OTP text field or independent CAPTCHA image relay, and does not claim that AI can never observe credentials. Existing in-flight operations and privileged host access are not a cryptographic isolation boundary.
A future secret-input broker needs separate authorization, destination binding, protected browser observation, disabled sensitive logging, expiration and end-to-end tests before displaying a "not sent to AI" claim. Installing 1Password alone does not establish that boundary. No password manager or vault connection is installed by this change.
Verification
cargo test --workspacenpm --prefix web run build- With local Vite running:
node tests/handover_ui.mjs
The browser test uses an isolated profile, mocked API and fake credential. It checks automatic takeover, one viewer, paused animation, direct task hand-back, and that credentials/raw scratchpad are not sent as ordinary chat messages.