Repository navigation
Description
Part of epic barelyworkingcode/relay#231. Depends on #195 and barelyworkingcode/relay#233.
Story
As a person whose agent is stuck, I want one button that takes it over, so that I do not hunt for the session.
What I'd notice
A Drop in action on Claude sessions under "Needs you".
Acceptance criteria
- Each headless Claude session under "Needs you" shows a Drop in action.
- Drop in opens an eve terminal on the same conversation.
- When relay refuses, eve shows relay's reason.
- Sessions of other harnesses show no Drop in action.
Contract
Calls the drop-in request from barelyworkingcode/relay#233.
Ownership: public/agent-board.js, the terminal launch path, docs/FEATURES.md.
Tasks
- Drop in action on board rows.
- Open the terminal on the resumed conversation.
- Show the refusal reason.
- Playwright journey: Drop in opens a terminal.
Decisions made for the owner
-
AC1 narrowed to headless Claude sessions (coordinator, 2026-10-06). relay refuses drop-in on non-headless sessions with 409
not_headless("continue it in eve"), so a button on an ordinary eve chat would always refuse. relay#241 addsheadlessto the session list; eve shows Drop in on rows with a Claude model andheadless === true. Amendment logged on the epic. -
The other contract decisions are in the contract comment below.
-
File ownership pinned by the planner (contract comment below), copied here so merge-check reads it (coordinator, 2026-10-06):
public/agent-board.js,public/terminal-manager.js,public/core/api-client.js,routes/index.js,public/apple/agents.css,docs/FEATURES.md,docs/api.md,docs/design-workbench.md,docs/baseline.md,test/unit/agent-board.test.js,test/unit/drop-in-route.test.js,test/unit/terminal-drop-in.test.js,test/integration/fake-relay.js,test/integration/relay-source-pins.test.js,test/integration/relay-fidelity.test.js,test/e2e/goals/agent-drop-in.spec.js,devboxverify/journeys.js,devboxverify/README.md,test/unit/devboxverify.test.js.
Activity
barelyworkingcode commentedon Oct 6, 2026
Approved by the owner on 2026-10-05: the whole epic (relay#231 and its seven children). needs-review removed.
barelyworkingcode commentedon Oct 6, 2026
Contract (eve#196)
The relay side is pinned to relay PR #239 at head
4c956a5(feat/233-drop-in-2), which is not merged yet. Until it merges, the new source pins run withEVE_RELAY_SOURCEset to a worktree of that head.Open question (sent to the coordinator)
Q1: relay refuses drop-in on non-headless sessions (
409 not_headless). eve's list rows carrymodelbut noheadlessfield. Recommended: relay addsheadlesstoSummary, and eve shows Drop in only on headless Claude rows. Until that is decided, the predicate lives in one place,AgentBoard.showsDropIn.Decisions made for the owner
POST /api/sessions/:id/drop-in, inroutes/index.js. It goes through the existingproxy(), and so throughRelayTransport. It is not a WS frame, because the dispatcher's shared error path writes into the chat pane.haiku,sonnetoropus(deriveSessionKind). This is pinned against relay.pi/…,codex/…and all other models show no action.terminal_close. At 4c956a5, relay'shandleTerminalClosecallsmgr.Close, the same asDELETE /api/terminals/{id}. Relay then callsHandBack. This is pinned. There is no new DELETE call.onTerminalCreatedand thenjoin_terminal, at a size of 80×24, ascreateTerminaldoes.messageverbatim as a toast (EVT.TOAST_SHOW). When eve can't reach relay, the toast falls back to "relay isn't reachable".{cols, rows}body, with each value a whole number from 1 to 500. A cross-site no-cors POST can't send that body.Doors
relay drop-in <session-id>(relay#233). eve adds no config.Wire
Browser → eve:
POST /api/sessions/:id/drop-inwith{"cols":80,"rows":24}.400, and eve does not call relay.201 {sessionId, claudeSessionId, host?, terminal}, or a refusal{error, message}.File ownership
public/agent-board.js,public/terminal-manager.js(addopenDropInonly),public/core/api-client.js(dropIn),routes/index.js(CRLF),public/apple/agents.css,docs/FEATURES.md,docs/api.md,docs/design-workbench.mdtest/unit/agent-board.test.js(add only),test/unit/drop-in-route.test.js,test/unit/terminal-drop-in.test.js,test/integration/fake-relay.js,test/integration/relay-source-pins.test.js,test/integration/relay-fidelity.test.js,test/e2e/goals/agent-drop-in.spec.js,docs/baseline.mddevboxverify/journeys.js,devboxverify/README.md,test/unit/devboxverify.test.js(additive only)Proof plan
goals/agent-drop-in: "Drop in opens a terminal"; a refusal shows relay's reason;pi/andcodex/rows show no action.agent-drop-in: a real headless Haiku agent; a fault injected mid-turn leaves it errored; Drop in opens a terminal on the same conversation; closing the tab brings backidle.join_terminalsend inopenDropIn.fix: agent-drop-in finds claude through the relay-sessions shim (#196)
fix: review round 2 (#196)
barelyworkingcode commentedon Oct 6, 2026
State 2026-10-06 01:02 PDT: ready, waiting on relay#239
PR #203 (head 70e1492) meets every merge-check condition except its dependency.
devbox/verifysuccess (34/0).Waiting on: relay#239 (drop-in), held for the owner, item 3 (
cmd/relay/api_credential.go). relay#241 (headlesson the list) is already on relaymain.To merge after relay#239 lands:
mainand restart eve-verify.set.js --eve 203 --postif the head moved or relay changed since 70e1492.main(they now hold the drop-in route).Not covered: SSH-host drop-in needs a test-machine pass.
Merge pull request #203 from barelyworkingcode/feat/196-drop-in