zerogterm 0.7.0-alpha3 → 0.8.0-alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -37,9 +37,9 @@ See the project walkthrough on [YouTube](https://youtu.be/4aJZCxLHD14).
37
37
 
38
38
  ## Release status
39
39
 
40
- ZeroG Terminal is currently a public alpha. The current release is `0.7.0-alpha3`; the version history is tracked in [versions.txt](versions.txt). The running version is shown beside the wordmark in the title bar, read from the app itself rather than written into the interface, so it is accurate in a packaged build too.
40
+ ZeroG Terminal is currently a public alpha. The current release is `0.8.0-alpha`; the version history is tracked in [versions.txt](versions.txt). The running version is shown beside the wordmark in the title bar, read from the app itself rather than written into the interface, so it is accurate in a packaged build too.
41
41
 
42
- The npm package contains the built Electron application and project documentation. It is intended for early adopters and testing rather than production use.
42
+ The GitHub Releases page provides a Windows x64 installer and portable executable for each desktop release. These alpha builds are intended for early adopters and testing rather than production use. The npm package remains available for developers who prefer to launch ZeroG from Node.js.
43
43
 
44
44
  ## Terminal shortcuts
45
45
 
@@ -413,6 +413,11 @@ required whichever shell you start them from.
413
413
  for Windows and macOS, so a C/C++ toolchain is a Linux requirement rather than a
414
414
  general one — there, `npm install` compiles it.
415
415
 
416
+ ### Windows desktop release
417
+
418
+ Download the latest Windows x64 installer from [GitHub Releases](https://github.com/HappyMonkeyAI/ZeroGTerm/releases). The installer adds ZeroG Terminal to the current user's applications. The portable `.exe` can be run without installation.
419
+
420
+ These binaries are unsigned alpha builds, so Windows SmartScreen may show a warning on first launch. If you downloaded the release from the official repository, choose **More info → Run anyway**. Review the release notes before installing; SSH, WSL, PowerShell, Git Bash, and any remote `screen` sessions are provided by the host system rather than bundled with the app.
416
421
  ### Linux
417
422
 
418
423
  ```bash
@@ -44,10 +44,53 @@ function parsePtySize(value) {
44
44
  return undefined;
45
45
  return { cols: cols, rows: rows };
46
46
  }
47
- // GPU is unstable under Toolbox/Wayland on this host; allow override.
48
- if (process.env.ZEROG_ENABLE_GPU !== '1') {
47
+ /**
48
+ * Software rendering, on the one platform that needs it.
49
+ *
50
+ * The GPU is unstable under Toolbox/Wayland, which is where this was found and
51
+ * why the switch exists. It was applied everywhere, though, and on Windows that
52
+ * is a straight loss: every pane is then rasterised on the CPU, and a window
53
+ * holding a dozen terminals can stall long enough for the compositor to grey it
54
+ * out — which reads to the user as a crash. Scoped to Linux, with an override in
55
+ * each direction so a machine that disagrees can say so.
56
+ */
57
+ if (process.env.ZEROG_DISABLE_GPU === '1') {
58
+ app.disableHardwareAcceleration();
59
+ }
60
+ else if (process.platform === 'linux' && process.env.ZEROG_ENABLE_GPU !== '1') {
49
61
  app.disableHardwareAcceleration();
50
62
  }
63
+ /**
64
+ * How long the main process may block before it is worth saying so.
65
+ *
66
+ * Every pty write, every IPC reply and every window event goes through this one
67
+ * loop, so a stall here freezes the whole application however many panes are
68
+ * open. 250ms is well past a slow frame and well short of anything a person
69
+ * would call a hang, which makes it a warning rather than a report.
70
+ */
71
+ const LOOP_STALL_MS = 250;
72
+ const LOOP_SAMPLE_MS = 500;
73
+ /**
74
+ * Watch the main process for stalls.
75
+ *
76
+ * A timer that knows when it should have fired is the whole instrument: the
77
+ * difference between that and when it did fire is time the loop spent unable to
78
+ * run anything. It cannot say what blocked — only that something did, and for
79
+ * how long, which is the fact that was missing when a frozen window had to be
80
+ * explained from a screenshot.
81
+ */
82
+ function watchEventLoop() {
83
+ let due = Date.now() + LOOP_SAMPLE_MS;
84
+ const timer = setInterval(() => {
85
+ const now = Date.now();
86
+ const lag = now - due;
87
+ due = now + LOOP_SAMPLE_MS;
88
+ if (lag >= LOOP_STALL_MS)
89
+ console.warn(`[zerog] main process blocked for ${Math.round(lag)}ms`);
90
+ }, LOOP_SAMPLE_MS);
91
+ // Diagnostics must never be the reason the process stays alive.
92
+ timer.unref();
93
+ }
51
94
  function createWindow() {
52
95
  win = new BrowserWindow({
53
96
  width: 1440,
@@ -95,8 +138,32 @@ function createWindow() {
95
138
  win.webContents.on('preload-error', (_event, path, error) => {
96
139
  console.error('[zerog] preload-error', path, error);
97
140
  });
98
- win.webContents.on('console-message', (_event, _level, message) => {
99
- console.log('[renderer]', message);
141
+ // The renderer's console, copied into this one — which is the only way a
142
+ // warning from the workspace reaches a log at all.
143
+ //
144
+ // Read from the event object rather than from the positional arguments that
145
+ // used to carry it. Electron still passes those, and says so on every start:
146
+ // "'console-message' arguments are deprecated and will be removed". When they
147
+ // go, a handler reading them would keep being called and print nothing, so the
148
+ // renderer would fall silent without anything appearing to break — the exact
149
+ // failure this logging exists to rule out.
150
+ win.webContents.on('console-message', (details) => {
151
+ console.log('[renderer]', details.message);
152
+ });
153
+ // The two ends of the symptom this instrumentation exists for. `unresponsive`
154
+ // is the window the desktop has started greying out; `render-process-gone` is
155
+ // the renderer having actually died, which is a different failure that looks
156
+ // similar from the outside. Only recorded here: what to *do* about either —
157
+ // offer a reload, reattach the panes — is a decision about the interface, not
158
+ // about diagnostics.
159
+ win.on('unresponsive', () => {
160
+ console.warn('[zerog] window unresponsive');
161
+ });
162
+ win.on('responsive', () => {
163
+ console.warn('[zerog] window responsive again');
164
+ });
165
+ win.webContents.on('render-process-gone', (_event, details) => {
166
+ console.error('[zerog] render-process-gone', details);
100
167
  });
101
168
  const devUrl = process.env.VITE_DEV_SERVER_URL;
102
169
  if (devUrl) {
@@ -400,6 +467,7 @@ app.whenReady().then(() => {
400
467
  // Keep the normal window chrome, but let the ZeroG UI occupy the full
401
468
  // client area instead of showing Electron's default File/Edit/etc. menu.
402
469
  Menu.setApplicationMenu(null);
470
+ watchEventLoop();
403
471
  createWindow();
404
472
  app.on('activate', () => {
405
473
  if (!BrowserWindow.getAllWindows().length)