codeburn/app/electron
iamtoruk 8d1a10369f fix(app): quota connects via macOS keychain + Connect affordance
Root causes (verified live): the Claude keychain branch was never
enabled (allowClaudeKeychain never passed), security -w returns
hex-encoded JSON the parser rejected, and Codex had no keychain
discovery at all.

- shared readKeychainPassword: Apple-signed /usr/bin/security, 90s
  window so the user can answer the macOS dialog, hex decode,
  notFound vs accessDenied classification; secrets never logged
- Claude: keychain fallback active (gated to explicit Refresh so
  launch never ambushes with a dialog); connection retained across
  keychain-less background polls
- Codex sources in order: the menubar's own cached OAuth (read-only,
  401 = one re-read, never rotate), legacy ~/.codex/auth.json
  (writable), com.openai.codex plaintext if usable; Safe Storage
  never decrypted
- new accessDenied state (amber, 'locked') + ConnectAffordance on
  Plans cards and Settings rows: login command, keychain-Allow note,
  force Refresh

Live verification: Claude connected with its real tier and windows;
Codex correctly accessDenied until the keychain dialog is allowed.

273/273 (26 files), typecheck + build green.
2026-07-16 06:20:44 -07:00
..
quota fix(app): quota connects via macOS keychain + Connect affordance 2026-07-16 06:20:44 -07:00
cli.test.ts harden(app): Electron security + spawn efficiency batch 2026-07-16 01:57:44 -07:00
cli.ts harden(app): Electron security + spawn efficiency batch 2026-07-16 01:57:44 -07:00
main.test.ts feat(app): Audit lens on Models + Pricing pane in Settings 2026-07-16 03:45:36 -07:00
main.ts feat(app): Audit lens on Models + Pricing pane in Settings 2026-07-16 03:45:36 -07:00
preload.ts feat(app): Audit lens on Models + Pricing pane in Settings 2026-07-16 03:45:36 -07:00