Files
openclaw/ui
Peter Steinberger c8418459f8 fix(ui): reconcile every null tombstone and align session sort with the gateway (#124104)
* fix(ui): reconcile every null tombstone and align session sort with the gateway

The sessions.changed merge deleted null-tombstoned fields from a hand-kept
eleven-field list while the gateway's tombstone policy
(session-event-payload.ts) had grown past it: toolOverrides, observerDigest,
controlOwnerSessionKey, restartRecoveryStatus, and goal leaked literal null
into rows typed optional-not-null, and every new tombstoned field would
silently repeat the drift. One loop over the event's null-valued keys now
owns the rule; updatedAt/activeLeafEntryId (the schema's only nullable row
fields) keep their explicit handling. Net −24 lines.

Riders in the same owner neighborhood:
- compareSessionRowsByUpdatedAt gains the gateway's ascending-key tie-break
  (session-list-order.ts: "Stable key ties keep offset paging deterministic")
  so tied rows — including all updatedAt:null rows — stop visibly swapping
  when the canonical refresh replaces an event-driven reconcile.
- Deleted the unreachable kind === "cron" wire guards (gateway folds cron to
  direct before projection, #115299; both sites needed an `as string` cast
  because the protocol type has no such member).
- The stale-active-snapshot path returns the original result identity when no
  defaults were passed, so the caller's result === state.result publish gate
  skips a spurious sidebar re-render on every stale event.

* test(ui): pin the ascending-key tie for equal-updatedAt sidebar rows

* test(ui): tolerate CI renderer jitter in the typing-shift picker guard

The 2px y-tolerance flaked at 2.41px on CI renderers; the #122809
regression this guards against shifts by a full indicator row (~20px).
2026-08-15 01:59:28 -07:00
..