Follow-up to #2274 (part of #1666). The client protocol landed with both adapters, one conformance suite, and the tab strip rendering from toTabDescriptors on leader and follower. The rest of the shell still has two wirings.
What is left
| Surface |
Leader today |
Follower today |
After |
| transcript |
requestScoopMessages → onScoopMessagesReplaced → controller.loadMessages |
onSnapshot → controller.loadMessages |
client.snapshot(id) / subscribe(id) |
| selection |
setSelectedScoopJid + replay |
sync.selectScoop + onSnapshot |
client.snapshot(id) (selection IS the call) |
| queued pile |
queuedIds on the replay envelope (#2362) |
not sent |
snapshot.queuedIds, absent ≠ empty |
| composer send |
AgentHandle.sendMessage (implicit selection) |
sync.sendMessage (implicit selection) |
client.send(id, input) |
| stop |
stopScoop(jid) |
sync.stop() |
client.signal(id, 'stop') |
| model pill |
modelFor(record) + set-scoop-model |
wc-follower-model-surface + model.select |
summary.model as the single read |
| mount |
mountWcUiLive / mountWcUiExtension |
mountWcUiFollower |
one mount path taking a WorkUnitClient |
Why it was not in #2274
attachWcClient binds OffscreenClient to the VFS, the terminal, the monitor, sprinkles and the permissions surface as well as the chat — none of which the protocol covers or should. Collapsing the mounts means deciding what those get instead, which is a design question of its own (and overlaps #2276's CapabilityBroker). Shipping the protocol with the strip cut over keeps the risk of each step legible.
Done when
Legacy path deletion stays with #2365.
Follow-up to #2274 (part of #1666). The client protocol landed with both adapters, one conformance suite, and the tab strip rendering from
toTabDescriptorson leader and follower. The rest of the shell still has two wirings.What is left
requestScoopMessages→onScoopMessagesReplaced→controller.loadMessagesonSnapshot→controller.loadMessagesclient.snapshot(id)/subscribe(id)setSelectedScoopJid+ replaysync.selectScoop+onSnapshotclient.snapshot(id)(selection IS the call)queuedIdson the replay envelope (#2362)snapshot.queuedIds, absent ≠ emptyAgentHandle.sendMessage(implicit selection)sync.sendMessage(implicit selection)client.send(id, input)stopScoop(jid)sync.stop()client.signal(id, 'stop')modelFor(record)+set-scoop-modelwc-follower-model-surface+model.selectsummary.modelas the single readmountWcUiLive/mountWcUiExtensionmountWcUiFollowerWorkUnitClientWhy it was not in #2274
attachWcClientbindsOffscreenClientto the VFS, the terminal, the monitor, sprinkles and the permissions surface as well as the chat — none of which the protocol covers or should. Collapsing the mounts means deciding what those get instead, which is a design question of its own (and overlaps #2276'sCapabilityBroker). Shipping the protocol with the strip cut over keeps the risk of each step legible.Done when
WorkUnitClienton both sides.client.snapshot(id)rather than two transport-specific selection calls.mountWcUiLive/mountWcUiFollower/mountWcUiExtensionshare one mount that takes a client.Legacy path deletion stays with #2365.