Skip to content
61 linesCodeBlameRaw

Pick any line to see why it is the way it is: the commit, the pull request and issue it came from, and what the agent was thinking.

Merge the desktop app's runner: it starts with the app for the signed-in person, sandboxed by default and running nothing where no sandbox is available yet, registers through the site, keeps itself up to date, and says everywhere what it is doing, why it is not, and how to fix it.1import assert from "node:assert/strict";
2import { test } from "node:test";
3
4import { HEARTBEAT_MS, type DesktopRunnerView, backendOf, diagnosisOf, reportDue, reportKey, reportOf } from "./desktop-runner.ts";
5
6function view(over: Partial<DesktopRunnerView> = {}): DesktopRunnerView {
7 return {
8 diagnosis: { code: "no_docker", tone: "problem", title: "Not running: Docker isn't running", cause: "Docker isn't running.", fix: "Start Docker Desktop.", actions: [{ id: "open_docker", label: "Open Docker" }] },
9 closed: { code: "off", tone: "off", title: "g1t is closed on build-box", cause: null, fix: "Open g1t on build-box.", actions: [] },
10 running: false,
11 version: "0.2.3",
12 backend: "docker",
13 workspace: "acme",
14 workspaces: [{ slug: "acme", name: "Acme" }],
15 enabled: true,
16 paused: false,
17 link: "https://g1t.sh/acme/-/runners",
18 machine: "build-box",
19 platform: "windows",
20 log: ["2026-10-12T08:00:00Z a line"],
21 ...over,
22 };
23}
24
25test("a report carries the app's words, without its buttons or log", () => {
26 const report = reportOf(view());
27 assert.deepEqual(report, {
28 workspace: "acme",
29 machine: "build-box",
30 backend: "docker",
31 version: "0.2.3",
32 diagnosis: { code: "no_docker", tone: "problem", title: "Not running: Docker isn't running", cause: "Docker isn't running.", fix: "Start Docker Desktop." },
33 closed: { code: "off", tone: "off", title: "g1t is closed on build-box", cause: null, fix: "Open g1t on build-box." },
34 });
35 assert.equal(reportOf(view({ workspace: null })), null);
36});
37
38test("a report goes when what the page shows changes, and as a heartbeat", () => {
39 const report = reportOf(view())!;
40 const at = 1_000_000;
41 assert.equal(reportDue(null, report, at), true);
42 const last = { key: reportKey(report), at };
43 assert.equal(reportDue(last, report, at + 1000), false);
44 assert.equal(reportDue(last, report, at + HEARTBEAT_MS), true);
45 const busy = reportOf(view({ diagnosis: { ...view().diagnosis, code: "busy", tone: "working", title: "Running Build (acme/web)" } }))!;
46 assert.equal(reportDue(last, busy, at + 1000), true);
47});
48
49test("only a diagnosis and a backend the app makes are kept", () => {
50 assert.deepEqual(diagnosisOf({ code: "idle", tone: "ok", title: "Waiting for jobs", cause: "Running sandboxed.", extra: 1 }), {
51 code: "idle",
52 tone: "ok",
53 title: "Waiting for jobs",
54 cause: "Running sandboxed.",
55 fix: null,
56 });
57 assert.equal(diagnosisOf({ code: "idle", tone: "loud", title: "x" }), null);
58 assert.equal(diagnosisOf("idle"), null);
59 assert.equal(backendOf("host"), "host");
60 assert.equal(backendOf("vm"), null);
61});

This file's history is long; its oldest lines are credited to the oldest commit read.