pi-studio 0.10.3 → 0.10.4

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/CHANGELOG.md CHANGED
@@ -4,6 +4,11 @@ All notable changes to `pi-studio` are documented here.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.10.4] — 2026-10-19
8
+
9
+ ### Fixed
10
+ - Stopping a Python, Julia or other runtime session works again on a Mac that runs a process as `nobody`. Since 0.10.2, Stop refused there with "Could not parse process ownership data; refusing unsafe shutdown."
11
+
7
12
  ## [0.10.3] — 2026-10-19
8
13
 
9
14
  ### Fixed
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-studio",
3
- "version": "0.10.3",
3
+ "version": "0.10.4",
4
4
  "description": "Two-pane browser workspace for pi with prompt/response editing, annotations, critiques, active quiz, prompt/response history, live previews, and tmux-backed REPL/literate REPL workflows",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -12,7 +12,8 @@ const paneFormat = "#{pid}\t#{session_id}\t#{session_name}\t#{session_created}\t
12
12
  export function parseStopProcessTable(text) {
13
13
  return text.split("\n").filter((line) => line.trim()).map((line) => {
14
14
  const f = line.trim().split(/\s+/);
15
- if (f.length !== 11 || !f.slice(0, 4).every((v) => /^\d+$/.test(v) && Number.isSafeInteger(Number(v)))) throw new Error("Could not parse process ownership data; refusing unsafe shutdown.");
15
+ // macOS lists processes of `nobody` with uid -2; it never matches ours.
16
+ if (f.length !== 11 || !f.slice(0, 4).every((v, i) => (i === 3 ? /^-?\d+$/ : /^\d+$/).test(v) && Number.isSafeInteger(Number(v)))) throw new Error("Could not parse process ownership data; refusing unsafe shutdown.");
16
17
  return { pid: Number(f[0]), ppid: Number(f[1]), pgid: Number(f[2]), uid: Number(f[3]), tty: f[4], startedAt: f.slice(5, 10).join(" "), state: f[10] };
17
18
  });
18
19
  }