From 5c5324354e578e7856d166dec40e07da8fdf157c Mon Sep 17 00:00:00 2001 From: prompt.ac/@jeffrey Date: Thu, 23 Apr 2026 16:45:55 +0000 Subject: [PATCH] plans: systray passphrase entry form (deferred, post-LACMA) Captures the 2026-04-22 ask for a macOS-native passphrase prompt served by the slab daemon so long-running agents can request vault decryption without blocking on the terminal. Co-Authored-By: Claude Opus 4.7 (1M context) --- plans/SYSTRAY-PASSPHRASE-ENTRY.md | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file(s) changed, 67 insertion(s)(+), 0 deletion(s)(-) diff --git a/plans/SYSTRAY-PASSPHRASE-ENTRY.md b/plans/SYSTRAY-PASSPHRASE-ENTRY.md new file mode 100644 --- /dev/null +++ b/plans/SYSTRAY-PASSPHRASE-ENTRY.md @@ -0,0 +1,67 @@ +# 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/` or `ac-electron/` — + check the tray app that already exists. Otherwise there's a Python + component somewhere in `fedac/` or `ants/` that hosts the tray. +- **UI:** macOS `NSAlert` with a `NSSecureTextField` accessory (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":"","cached":true}`. + - Requester blocks until user types or cancels. +- **Cache:** in-memory with TTL (default 10 minutes). Clear on daemon + restart or explicit `{"op":"forget"}`. Do NOT persist to disk. +- **Zeroize:** overwrite the `bytes` object 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 uses `gpg` + directly; 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. -- tangled.sh