Tabs per tile (phase 1): tab-state model + split collapse
Foundation for multiple tabs per tile in the tiling workspace. No UI
change yet; behavior is preserved.
- model.ts: add removeLeaf (collapse split into sibling; root removal is
a no-op) and listTileIds, for last-tab close.
- tabsModel.ts: pure tab-state model (TileTabsMap), React-free and
side-effect-free. closeTab reports removedTabIds + tileEmptied so the
hook owns handle release and the caller owns collapse-vs-reseed.
- useTilingDocumentSlots: re-back onto TileTabsMap, key DocumentHandles
by tab id, preserve getSlot/ensureTile, add getTabs/getActiveTabId/
setActiveTab/newTab/closeTab for the upcoming tab UI.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>