Skip to content

feat: add a signed Desktop Tools menu bar app for agents outside Ace - #29

Merged
iamnbutler merged 1 commit into
mainfrom
app
Oct 15, 2026
Merged

iamnbutler merged 1 commit into
mainfrom
app

Conversation

@iamnbutler

Copy link
Copy Markdown
Contributor

Part of #27. A standalone host so agents outside Ace (Claude Code or Codex through the MCP server in #12) get their own grants instead of borrowing Ace's (#24).

  • native/sources/app/app.swift: a menu bar app (LSUIElement) that dlopens libDesktopTools.dylib like Ace does. It serves ~/.local/state/desktop-tools/desktop.sock for the exact client dev.githubnext.desktop-tools.desktop-client, links desktop-client there, and shows the runtime state and the three grants with grant buttons, plus a Serve agents toggle and Quit.
  • src/app.ts:
    • assemble(out, scratch?) builds through dist/build.js, then lays out the bundle: executable, dylib, client, Licenses, Info.plist, and the swift-stdlib-tool Frameworks.
    • sign(app, identity, release) signs inside out, giving the client its exact identifier, adds the hardened runtime and timestamp for release, then runs codesign --verify --deep --strict.
    • Both also work as a CLI: node dist/app.js --out build --identity … --release.
    • feat: release a signed, notarized Desktop Tools DMG #28 uses both.
  • build.ts also copies desktop-tools-app, a small AppKit-only target that doesn't link Peekaboo. Embedding apps can ignore it.
  • The README documents the app and replaces "a vendor-signed companion … is not part of this package".

Verified locally:

  • It builds with the local Developer ID identity (team 8S43JJMN6B).
  • codesign shows the hardened runtime and timestamp, and the client identifier is right.
  • spctl rejects it only as "Unnotarized Developer ID"; notarizing is feat: release a signed, notarized Desktop Tools DMG #28's job.
  • From /Applications it starts serving and creates the 0600 socket and the client link.
  • Live MCP runs follow once the grants are given.

Why: src/app.ts#function sign | The client must be signed with exactly <app identifier>.desktop-client by the app's team; the runtime admits only that identifier
@iamnbutler
iamnbutler merged commit c3c61ff into main Oct 15, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant