skalpel 3.0.13 → 3.0.15

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skalpel",
3
- "version": "3.0.13",
3
+ "version": "3.0.15",
4
4
  "description": "Skalpel — local proxy and TUI for coding agents (skalpel + skalpeld bundle).",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://skalpel.ai",
@@ -53,10 +53,10 @@
53
53
  "x64"
54
54
  ],
55
55
  "optionalDependencies": {
56
- "@skalpelai/skalpel-darwin-arm64": "3.0.13",
57
- "@skalpelai/skalpel-darwin-x64": "3.0.13",
58
- "@skalpelai/skalpel-linux-arm64": "3.0.13",
59
- "@skalpelai/skalpel-linux-x64": "3.0.13",
60
- "@skalpelai/skalpel-win32-x64": "3.0.13"
56
+ "@skalpelai/skalpel-darwin-arm64": "3.0.15",
57
+ "@skalpelai/skalpel-darwin-x64": "3.0.15",
58
+ "@skalpelai/skalpel-linux-arm64": "3.0.15",
59
+ "@skalpelai/skalpel-linux-x64": "3.0.15",
60
+ "@skalpelai/skalpel-win32-x64": "3.0.15"
61
61
  }
62
62
  }
@@ -36,8 +36,19 @@ const LAUNCHCTL_PATH = '/bin/launchctl';
36
36
  // B10: launchd target (gui/<uid> vs system/) depends on whether a
37
37
  // graphical session is attached. Headless macOS (SSH login, CI box)
38
38
  // must use system/ because gui/<uid> requires Aqua.
39
+ //
40
+ // 2026-05-14 fix: the previous heuristic used `!process.env.DISPLAY`
41
+ // as a headless signal, but macOS native terminal sessions never set
42
+ // DISPLAY (that's an X11 convention) — every desktop install was
43
+ // misclassified as headless, fell into the system/ branch, and then
44
+ // failed with "Bootstrap failed: Operation not permitted" because
45
+ // `launchctl bootstrap system <plist>` requires sudo. The correct
46
+ // signal on macOS is just "is this an SSH session." If the user is
47
+ // SSHed into a headless box, fall back to system/; otherwise use
48
+ // gui/<uid>, which is the right scope for a per-user agent and does
49
+ // not need elevated privileges.
39
50
  function launchdTarget() {
40
- const headless = !!process.env.SSH_CLIENT || !process.env.DISPLAY;
51
+ const headless = !!process.env.SSH_CLIENT || !!process.env.SSH_TTY;
41
52
  if (headless) {
42
53
  return 'system';
43
54
  }