╭ changed ──────╮ │src/command.zig│ ╰───────────────╯ ╭─────────────────────────────────────╮ │193 http_listen: []const u8,│ │194 ssh_listen: ?[]const u8,│ │195 data_dir: []const u8, │ │196 + ui: bool, │ │197 }, │ │198 ssh_helper: struct { │ │199 ssh_connect: []const u8,│ ╰─────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │211 .http_listen = (cmd_args.get("--http-listen") orelse null) orelse "127.0.0.1:8080",│ │212 .ssh_listen = (cmd_args.get("--ssh-listen") orelse null), │ │213 .data_dir = (cmd_args.get("--data-dir") orelse null) orelse ".", │ │214 + .ui = cmd_args.contains("--ui"), │ │215 } }; │ │216 }, │ │217 .ssh_helper => { │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ───╮ │src/main.zig│ ╰────────────╯ ╭─────────────────────────────────────────────────────────────────╮ │80 .http_listen = cli_cmd.serve.http_listen,│ │81 .ssh_listen = cli_cmd.serve.ssh_listen, │ │82 .data_dir = cli_cmd.serve.data_dir, │ │83 + .ui = cli_cmd.serve.ui, │ │84 }, run_opts.err); │ │85 }, │ │86 .ssh_helper => { │ ╰─────────────────────────────────────────────────────────────────╯ ╭ changed ────╮ │src/serve.zig│ ╰─────────────╯ ╭──────────────────────────────────╮ │2 const xit = @import("xit"); │ │3 const rp = xit.repo; │ │4 const hash = xit.hash; │ │5 +const ui = @import("./ui.zig");│ │6 │ │7 pub const Options = struct { │ │8 http_listen: []const u8, │ ╰──────────────────────────────────╯ ╭──────────────────────────────────╮ │ 9 ssh_listen: ?[]const u8, │ │10 data_dir: []const u8, │ │11 + ui: bool, │ │12 }; │ │13 │ │14 const ListenAddress = struct {│ ╰──────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │54 defer tasks.cancel(io); │ │55 │ │56 runHttpListener(repo_kind, any_repo_opts, io, allocator, repo_root_path, &http_server, &tasks, err);│ │57 + │ │58 + if (options.ui) { │ │59 + runTui(io, allocator, &tasks, err); │ │60 + } │ │61 │ │62 // create ssh listener │ │63 │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────╮ │ 80 try tasks.await(io); │ │ 81 } │ │ 82 │ │ 83 +fn runTui( │ │ 84 + io: std.Io, │ │ 85 + allocator: std.mem.Allocator, │ │ 86 + tasks: *std.Io.Group, │ │ 87 + err: *std.Io.Writer, │ │ 88 +) void { │ │ 89 + const TuiTask = struct { │ │ 90 + io: std.Io, │ │ 91 + allocator: std.mem.Allocator, │ │ 92 + err: *std.Io.Writer, │ │ 93 + │ │ 94 + fn run(ctx: @This()) void { │ │ 95 + ui.run(ctx.io, ctx.allocator) catch |ui_err| { │ │ 96 + logError(ctx.err, "ui failed: {s}\n", .{@errorName(ui_err)});│ │ 97 + }; │ │ 98 + } │ │ 99 + }; │ │100 + │ │101 + tasks.async(io, TuiTask.run, .{TuiTask{ │ │102 + .io = io, │ │103 + .allocator = allocator, │ │104 + .err = err, │ │105 + }}); │ │106 +} │ │107 + │ │108 fn runHttpListener( │ │109 comptime repo_kind: rp.RepoKind, │ │110 comptime any_repo_opts: rp.AnyRepoOpts(repo_kind), │ ╰──────────────────────────────────────────────────────────────────────────────────╯ ╭ added ───╮ │src/ui.zig│ ╰──────────╯