╭ changed ──╮ │src/try.zig│ ╰───────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭───────────────────────────────────────────────────────────────────────────╮ │70 var session_arena = std.heap.ArenaAllocator.init(allocator); │ │71 defer session_arena.deinit(); │ │72 │ │73 + // the seeded admin's event id, so both uis start logged in as them│ │74 + var admin_user_id: [evt.event_id_size]u8 = undefined; │ │75 + │ │76 var session: ui.Session = blk: { │ │77 var arena = std.heap.ArenaAllocator.init(allocator); │ │78 defer arena.deinit(); │ ╰───────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────╮ │158 │ │159 var user_ids: [user_data.len][evt.event_id_size]u8 = undefined; │ │160 for (&user_ids) |*id| id.* = evt.EventWithId.randomId(prng.random()); │ │161 + // admin is the first entry of user_data above │ │162 + admin_user_id = user_ids[0]; │ │163 │ │164 var repo_event_ids: [repo_data.len][evt.event_id_size]u8 = undefined; │ │165 for (&repo_event_ids) |*id| id.* = evt.EventWithId.randomId(prng.random());│ ╰────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────╮ │567 } │ │568 } │ │569 │ │565 - break :blk try ui.Session.init(&session_arena, &repo, .{}); │ │570 + break :blk try ui.Session.init(&session_arena, &repo, .{ .user_id = &admin_user_id });│ │571 }; │ │572 session.is_terminal = true; │ │573 // try uses the default serve options below, so the footer's url points at │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │593 // let the native TUI's page builders open the on-disk repos for the file tree │ │594 session.io = io; │ │595 session.repos_dir = try std.fs.path.join(session_arena.allocator(), &.{ server_path, "repos" });│ │596 + │ │597 + // leave a one-shot session for the first browser to hit the web ui, so it │ │598 + // starts logged in as admin │ │599 + { │ │600 + var data_dir = try cwd.createDirPathOpen(io, server_path, .{}); │ │601 + defer data_dir.close(io); │ │602 + const store = try hx.web.SessionStore.init(io, data_dir); │ │603 + defer store.deinit(); │ │604 + const token = try store.create(&admin_user_id); │ │605 + try store.offerAutoLogin(&token); │ │606 + } │ │607 │ │608 if (cli) { │ │609 var stdout_writer = std.Io.File.stdout().writer(io, &.{}); │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯