Boundary snapshots flushed the debounced writes but didn't wait for them,
so the snapshot could read the row before the edit it was meant to keep.
They now await flushAllModelWrites first. A closing window can't await,
so it sends the writes and then the snapshot straight behind them: in
the browser the worker keeps that order, and on the desktop the snapshot
can still win, leaving the edit saved but unversioned until its next
send.
The idle tracker kept one timer for all requests, so a write to any
request, from another window or sync, restarted the active one's
countdown. Each request now has its own, cleared when it fires or when
that request is captured at a boundary.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Clean merge with no conflicts or compile fixes. Regenerated bindings
differ from the merged files only in formatting, so none are included.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The actions row moves out of the code editor into ActionsBar, a plain
component a wrapper places over its content. FormatAction reformats an
editor through its ref, and BodyViewModeSwitch names its first state for
the body's format (Pretty, Table, Parts, Preview, Form) next to Raw.
Yaak Proxy's request and response body tabs now share one viewer
choice, with the switch in each tab's bar beside the text viewer's
filter. The choice is remembered for both panes; bodies over the large
size open raw. "Response (Raw)" leaves the proxy's tab menu, while
Yaak's response pane keeps it until the remaining sites move.
SegmentedControl moves from the client into packages/ui.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Restore told open editors to re-read the request before its change event
had reached the store, so header and parameter rows could keep showing
the old content. The restore RPC now returns the restored request, and
the frontend puts it in the store before calling wasUpdatedExternally,
the same way deleteModel applies its change locally once the RPC
resolves.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The comparison query kept its last answer as placeholder data across
version changes, so switching to a response with no version, or to one
whose comparison was still loading, could leave the Request Changed
dropdown offering another response's diff and restore. Placeholder data
now carries over only within the same version, and the hook returns a
comparison only when it is for the version asked about.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Conflicts were all at registration points; both sides are kept.
Main now routes every write through one connection (#642): ClientDb only
reads and writes go through `with_tx` on a WriteDb. Versioning follows:
snapshot, restore, prune and the cascade delete move to WriteDb, while the
lookups and the "has it changed" check stay on ClientDb. Callers take a
write transaction the way their neighbours do:
- The HTTP send snapshots in its own transaction from
`resolve_send_inputs`, and a failure there (including not getting the
writer) is still logged and swallowed, so the response just has no
version.
- gRPC and WebSocket connect snapshot inside the transaction that upserts
the connection.
- The snapshot and restore RPCs, on the desktop and in the browser host,
each run in a transaction.
- The request and workspace cascades live on main's WriteDb deletes.
The Request Changed dropdown moves into the response pane's
`statusLineRight` slot, since main moved the status line into the shared
pane view.
The plugin runtime's copy of the model bindings picks up `versionId`, and
`gen_rpc.ts` is regenerated.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Use an object with a null prototype so inherited property names are not
mistaken for existing fields and __proto__ remains a literal JSON key.
Cover __proto__, constructor, and toString with regression cases.
The URL link and menu item stay enabled and focus the field on repeat
clicks, waiting out the menu's focus return. Larger empty-state icon,
inline links inherit the text color with a translucent underline, and
card rows use a muted trash icon for removal.