Systray passphrase entry form#
Requested: 2026-04-22 (during LACMA submission sprint) Priority: post-LACMA Status: Deferred (plan only, not implemented)
Ask (verbatim)#
can we add to our python daemon systray a passphrase entry form u can pop up on macos here?
Why#
Repeatedly: when a Claude agent or fish script needs to decrypt the vault
(aesthetic-computer-vault/home/.ssh/id_rsa.gpg, GPG / age / whatever),
the passphrase has to be typed at the terminal. In long-running agent
sessions (like the LACMA submission sprint on 2026-04-22) that means
the agent is blocked or the user has to context-switch to paste the
passphrase into a non-secure text field.
A native macOS passphrase prompt from the existing Python daemon's systray would solve both: the agent triggers it over IPC, the user types the passphrase into a real macOS password field (keychain- integrated, not logged), and the daemon hands the cleartext back to whatever requested it — or, better, holds it in-memory for N minutes and re-serves it without re-prompting.
Sketch#
- Daemon location: probably
micro/machine/orac-electron/— check the tray app that already exists. Otherwise there's a Python component somewhere infedac/orants/that hosts the tray. - UI: macOS
NSAlertwith aNSSecureTextFieldaccessory (via PyObjC /pyobjus/rumps— whichever the tray already uses). Alternate path: ship a tiny Swift helper binary and call it from Python. - IPC:
- Unix domain socket at
~/.ac-daemon.sock(or reuse whatever the tray already exposes). - Protocol:
{"op":"passphrase","label":"vault-ssh","timeout":600}→{"ok":true,"secret":"<phrase>","cached":true}. - Requester blocks until user types or cancels.
- Unix domain socket at
- Cache: in-memory with TTL (default 10 minutes). Clear on daemon
restart or explicit
{"op":"forget"}. Do NOT persist to disk. - Zeroize: overwrite the
bytesobject before GC (best-effort on Python; the point is to not leave it in a file).
Integration points#
Once the daemon has the endpoint, wire:
aesthetic-computer-vault/devault.fish— currently usesgpgdirectly; swap to a helper that asks the daemon first.lith/deploy.fish— SSH key step.- Any
npm run session:*scripts that touch vault creds.
Out of scope#
- Browser integration (a Chrome/Safari extension could call the daemon too, but save that for later).
- Cross-device sync — this is machine-local only.
Next time#
When picking this up, start by inventorying the current daemon: find its entry point, confirm it runs as a systray item, and see what IPC it already speaks. Only add the passphrase endpoint to an existing daemon — don't spawn a second tray.