pub async fn run(
state: &AppState,
tab_id: String,
source_workspace_id: String,
) -> Result<Value, String>Expand description
Run the TearOffTab saga. On success, returns
{"new_workspace_id": "..."}. On failure, the source workspace
is unchanged (compensation has reverted any partial state).