Promote develop to main#264
Merged
Merged
Conversation
Mobile strategy phase 1 (docs/ROADMAP.md "Client Strategy & Boundaries"): the web app becomes installable, and the two events that block or summon a human — a pending permission card and an @mention — now reach the lock screen and deep-link back to the exact message. Gateway: - infra/web_push.rs: pure-Rust RFC 8291 aes128gcm + RFC 8292 VAPID sender (p256/hkdf/aes-gcm, no openssl); pinned by the RFC 8291 Appendix A test vector. Hardened outbound client (no redirects, 5s/10s timeouts); 404/410 self-cleans dead subscriptions; suspended/deleted users filtered. - api/push.rs + migration 0050: VAPID key endpoint and per-user subscription registry (endpoint PK upsert, key validation at write time). - Triggers: permission_request → approver set (owner + delegations, text truncated to notification size); @mention → human REST sends, bot post_message, and bridge send/done frames. - Session-revocation parity: password change/reset, logout, and suspension drop the user's push subscriptions. - Helm: optional secrets.vapidPrivateKey / gateway.vapidSubject; secret checksum annotation so enabling push actually rolls the gateway. Frontend: - vite-plugin-pwa (injectManifest) + manifest/icons/theme-color; precache kept to the real app shell (lazy heavyweights excluded, ~2.1 MB). - src/sw.ts: push handler with focused-channel suppression (MessageChannel query), notificationclick routing that prefers a /chat window. - src/lib/push.ts: subscribe lifecycle (active-SW readiness race, rollback on failed server registration), SW⇄page bridge, deep-link target parked until the channel's history is loaded, DM links filed under the viewer's personal workspace. - Settings → Account: push toggle (hidden when unsupported/unconfigured); sign-out paths unsubscribe first. - nginx (image + Helm chart): no-cache for sw.js, correct MIME + no-cache for manifest.webmanifest. Verified on the kind stack: RFC vector unit test, 174 lib tests, live mention → encrypted POST to push service → Gone cleanup, logout revocation, SW activated + manifest installable in-browser. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…laboration features
A Tauri v2 desktop shell that hosts the existing React frontend and acts as the
graphical home of the local ACP connector daemon. Control plane stays on the
gateway: messages and permission decisions always go through the gateway API —
the desktop only displays richer local context and runs native pickers.
Foundation
- apps/macos Tauri shell: tray residency, close-to-hide, single-instance,
⌥⌘C toggle, launch-at-login, native notifications (WKWebView has no Web Push,
so approvals/@mentions arrive over a user-scoped WS notification frame).
- Runtime-configurable gateway address (serverConfig.ts) + first-run ServerPicker;
serverBase=null preserves the browser behavior exactly (web zero-regression).
- Gateway: spawn_notify_users_ws user-scoped frames alongside Web Push; Tauri
origins allow-listed in CORS.
Connector management (M1/M2)
- List/start/stop/restart/logs/delete daemons + a supervisor that revives managed
instances (macOS answer to the systemd-linger pitfall), with backoff.
- Form-based config editor (structure-preserving toml_edit), agent picker with
brand icons + one-click npm install, native folder pickers for roots/cwd.
- Grid connector page; onboarding via gateway mint→redeem; bot↔connector linkage
("Set up on this Mac"); open agent files locally (same-machine) or download.
Native collaboration + AI-ops features
- A2 agent-changes watch (FSEvents) + git status/diff/revert/open-PR, path-guarded.
- A3 drag-to-grant: drop a Finder folder on a card → allowed_roots + restart.
- A4 read-only audit timeline parsed from the connector log.
- A1a informed approval: native banner shows the target's branch/dirty/size.
- B5 cheers:// deep links (route via push) + ⌥⌘K quick-panel window.
- B6 screenshot (screencapture -i) + Finder "Open With → Cheers", both uploaded
through the existing gateway path; cold-start files survive via a pending stash.
- B7 tray roster + dock badge (unread + pending approvals).
- C8 per-connector health (process-group CPU/mem, hung detection).
- C9 one-click ACP adapter update check + upgrade.
Personal workbench plugins
- User-installed (this-Mac) renderer plugins under ~/.cheers/plugins, no admin —
the middle tier between session-temp and admin-global; install-time trust prompt.
Deferred (documented): A1b native notification action-buttons (deprecated macOS
API) and C10 local voice (native-heavy). Known LOW tradeoff: permission_context
is an ungated metadata oracle, CSP-mitigated (see approval.rs).
Verified: server + tauri cargo check, 18 Rust unit tests, tsc, full tauri build
(.app + .dmg). Native/UI paths are needs-live-verify and only work from a bundled
.app (not tauri dev); adversarial review ran (3 findings fixed, 2 rejected).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…notes Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The remote-workspace file preview header wrapped its text buttons in a narrow panel. Make Download / Save / Add-to-context icon-only with hover tooltips, and replace the single 'Open in editor' dropdown with one brand-accent icon button per available opener (Finder + installed editors). Filename shrinks first (min-w-0), every action is shrink-0, so the row stays on one line. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add a Feature Tour section (EN + zh) covering the macOS desktop client (connector management, native notifications, same-machine open-in-editor / watch+diff / drag-to-grant / screenshot-send / tray+dock) and the installable PWA, plus a matching feature card on the GitHub Pages landing page. Links to Releases for the .dmg download. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
feat(desktop): macOS Tauri client + native collaboration features
[codex] add iOS mobile shell and push notifications
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Notable Changes
Validation
Release Notes