Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
id: 01M6EGNHQ7F88SS5SRFCE25PAQ
anchor: '@file'
created: 2026-11-02T16:14:51Z
norm: '1'
sig: 9d55c295e4357b94
body_hash: 7094cf0980eaf202
raw_hash: 3395477bf2fd8d30
lines: 1-313
---

a copy of native2's DesktopCore/Updates.swift so native/'s app build compiles; delete with native/
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
id: 01M6EGNHQ0W644YEB8MJQSSSNW
anchor: '@file'
created: 2026-11-02T16:14:51Z
norm: '1'
sig: 389d8172009399de
body_hash: f9625dee71be3c17
raw_hash: d04b70656f426188
lines: 1-314
---

never install code that fails requirement(team:identifier:) plus the running app's designated requirement: TCC grants are keyed to them, and they are the only thing standing between the feed and code execution
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
id: 01M6EGNHQD071BCTT6MCZ500BE
anchor: '@file'
created: 2026-11-02T16:14:51Z
norm: '1'
sig: 27abcba5e975f16e
body_hash: 982615dac862f90b
raw_hash: a6b683e33b522bcc
lines: 1-256
---

install only after runtime.stop() has drained (status "stopped"); never kill an agent's in-flight call, and never relaunch while input is paused, since pausing isn't saved
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ Notable changes to Desktop Tools, newest first. Each release's GitHub release no

## [Unreleased]

### Added

- The app updates itself from GitHub Releases. **Update Automatically**, on by default, checks at launch and daily, downloads a newer release, and installs it once agents have been idle for 10 minutes, after the calls already running finish, then relaunches. **Check for Updates…** checks at once and asks before installing. Only a release notarized and signed with Developer ID by the Desktop Tools team, with the app's bundle ID, is installed, so permissions and approved agents are kept. The development app never updates itself. See [Updates](docs/app.md#updates).

### Removed

- The Peekaboo stack, which the app stopped shipping in 0.17.0: `native/` with its vendored Peekaboo, its client and runtime, the release workflow's `stack` input, and wire 1, the Node tool logic behind `createDesktop` without `wire: 2`. `desktop-tools-build`, `desktop-tools-app` and `npm run dev-app` build only the Swift host in `native2/`, and accept `--native2` without effect; `createDesktop` and `dist/mcp.js` with options always forward to its `desktop-tools-client`, and accept `wire: 2` and `--wire 2` without effect, while `--wire 1` is refused. `dist/mcp.js` with no options still hands over to the app's bundled MCP server. An embedder whose app still embeds `native/`'s runtime must stay on 0.18.0 or move to `native2/`'s. The npm package no longer ships `native/`, and `npm run peekaboo-test` is gone. ([#233](https://github.com/githubnext/desktop-tools/pull/233))
Expand Down
16 changes: 16 additions & 0 deletions docs/app.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,22 @@ Download the notarized DMG from the [latest release](https://github.com/githubne

Anything running as the user could use those grants, so the app asks before serving each agent (see [approved agents](#approved-agents)). Grant them only on machines where that is acceptable, and quit the app when it isn't needed.

## Updates

The app keeps itself up to date from this repository's [GitHub Releases](https://github.com/githubnext/desktop-tools/releases), which anyone can read without signing in.

- **Update Automatically**, on by default, checks a minute after launch and then once a day (a failed check is retried an hour later). A newer release is downloaded and checked in the background, then installed once agents have run no operation for 10 minutes, input isn't paused and no Desktop Tools prompt is open. Turn it off and the app only checks when you ask.
- **Check for Updates…** checks at once. It says when the app is up to date or why a check failed; when there is a newer release it downloads it and asks before installing (**Install and Relaunch** or **Later**). Below the item the menu shows the running version and when it last checked, or why the last update failed.
- An update that is downloaded but not installed yet shows as **Install Desktop Tools *version* and Relaunch**, and is also installed when you quit the app, ready for the next launch.

Installing stops serving new calls, lets the calls already running finish (at most 30 seconds), replaces the app in place in one rename, and opens the new version through LaunchServices once the old one has exited. Agents reconnect on their next call: the client waits for the app to serve again, as in [Keeping the socket served](#keeping-the-socket-served). Accessibility, Screen Recording and Keyboard input stay granted, and approved agents and settings are kept, because the new app has the same bundle ID and signature requirement.

Nothing is installed unless the release's disk image and the app inside it are signed with Developer ID by team `8S43JJMN6B`, notarized, and pass Gatekeeper's assessment, and the app has the bundle ID `dev.githubnext.desktop-tools`, satisfies the running app's own designated requirement, and is the newer version the release names. The app must be able to write to the folder it is installed in, such as Applications; otherwise the update fails and names the release page to download it from. Each check and update is noted in the [log](#approved-agents).

The development app (`Desktop Tools Dev`) and any build not signed by that team never update themselves and have no update items in their menu.

To test a release build against another release list, open it with `DESKTOP_TOOLS_UPDATE_FEED` set to a URL that returns the same JSON as GitHub's list releases API, such as a `file:` URL; the app passes it on when it relaunches, as it does `DESKTOP_TOOLS_STATE`. Updates from it are checked the same way.

## Approved agents

The first time an agent calls, the app asks **Allow *name* to control this Mac?**, naming who signed it and where it runs from, with **Allow** and **Don't Allow**. Until you answer, and after Don't Allow, every request from that agent is refused with `CALLER_NOT_APPROVED`, listings and screen captures included; the agent is told to ask you, and is never left waiting. The answer is remembered in `callers.json` in the state folder (`~/.local/state/desktop-tools`), readable only by you, and the app asks about each agent once. Updating from 0.13.1 or earlier, each agent you use is asked about once.
Expand Down
Loading
Loading