Merge origin/main into task/143
main reworked the composer around per-message forking (fork-and-send gone) and added the async-task strip, which lands a second stable-empty constant next to this branch's own in `use-connection.ts` — the only conflict, and both are kept. Nothing else collides: the steering work adds `steeredMessageIds` beside main's new `asyncTasks` on the connection, and the timeline's steered-copy suppression sits on the same seam the fork work left alone.
X
xintaofei committed
c5f5062857e274b25dc04637a5df3f727107d4e3