feat(settings): refresh daemon controls and iOS chat launch#3929
Conversation
Signed-off-by: Val Alexander <bunsthedev@gmail.com>
There was a problem hiding this comment.
Pull request overview
Refreshes the Settings → Daemon surface by extracting it into a focused DaemonSection component with a dedicated control-sheet stylesheet, and updates iOS chat launch behavior to default to the most recently updated non-archived thread (while preserving explicit navigation intents). Also updates iOS connecting copy.
Changes:
- Added a new daemon settings control-sheet component (
settings-daemon.tsx) and stylesheet (settings-daemon.css), and wired it intoSettingsShell. - Updated daemon/settings source-contract tests to validate the extracted sheet and preserve key behaviors (multihost, executors, Omnigent gating, reduced motion, etc.).
- On iOS, changed connecting headline copy and added “most recent active thread” default selection with XCTest coverage.
Reviewed changes
Copilot reviewed 13 out of 13 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| src/styles/settings-daemon.css | Adds a dedicated daemon control-sheet stylesheet with container queries and reduced-motion handling. |
| src/components/settings-shell.tsx | Wires the daemon tab to the extracted DaemonSection and passes Omnigent settings as a prop. |
| src/components/settings-shell-polish.test.ts | Updates source-contract assertions to include the extracted daemon module. |
| src/components/settings-overview.test.ts | Updates overview wiring expectations now that daemon UI lives in settings-daemon.tsx. |
| src/components/settings-daemon.tsx | New extracted daemon settings UI: status, connection drafts/save/revert, tailscale device selection, executor disclosure, copy-to-clipboard, and Omnigent slot. |
| src/components/settings-daemon-multihost.test.ts | Adds/updates source-contract coverage for the new daemon control sheet and CSS affordances. |
| src/components/settings-action-buttons.test.ts | Ensures Save connection renders via exactly one shared Button in the new module. |
| src/components/daemon-start-button.test.ts | Updates source search to include the extracted daemon module. |
| scripts/ios-claude-design-fidelity.test.mjs | Extends iOS design-fidelity contract to assert “most recent thread” default selection and updated connecting copy. |
| apps/ios/CovenCave/CovenCave/CovenCaveTests/LaunchThreadIntentTests.swift | Adds XCTest coverage for mostRecentThread behavior (updatedAt + archived filtering). |
| apps/ios/CovenCave/CovenCave/Views/RootView.swift | Updates connecting headline copy to “Entering the Cave”. |
| apps/ios/CovenCave/CovenCave/Views/ChatsHomeView.swift | Selects most recent active thread on appear / thread hydration without overriding explicit intents. |
| apps/ios/CovenCave/CovenCave/State/AppModel.swift | Introduces mostRecentThread computed property (active threads by updatedAt). |
Comments suppressed due to low confidence (6)
src/styles/settings-daemon.css:262
- PR description says the sheet is “token-only”, but this uses a raw
pxvalue (width: 3px). Consider deriving it from existing spacing tokens so the sheet stays token-based.
width: 3px;
src/styles/settings-daemon.css:269
- PR description says the sheet is “token-only”, but this hard-codes
height: 6px. Use a token-derived calc so the pulse bars follow the spacing scale.
height: 6px;
src/styles/settings-daemon.css:274
- PR description says the sheet is “token-only”, but this uses
height: 12pxinstead of a token.12pxmatchesvar(--space-3), so you can keep the value token-based without changing layout.
height: 12px;
src/styles/settings-daemon.css:280
- PR description says the sheet is “token-only”, but this hard-codes
height: 8px. Since8pxisvar(--space-2), this can be expressed as a token without changing layout.
height: 8px;
src/styles/settings-daemon.css:335
- PR description says the sheet is “token-only”, but this uses raw
pxvalues (gap: 3px; padding: 2px). Consider token-derived calcs so the micro-spacing stays tied to the spacing scale.
gap: 3px;
padding: 2px;
src/styles/settings-daemon.css:381
- PR description says the sheet is “token-only”, but this uses a raw
pxoffset (inset 2px …). If this needs to remain token-derived, use a token-based calc for the inset width.
box-shadow: inset 2px 0 0 var(--color-warning);
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Signed-off-by: Val Alexander <bunsthedev@gmail.com>
Summary
Refreshes the Settings → Daemon control sheet from the approved ZIP handoff and makes iOS launch into the newest active conversation with the updated connection copy.
Why
The daemon surface needed the approved compact hierarchy without losing its live multi-host, travel, executor, or Omnigent behavior. On iOS, Chats should start at the most recently updated non-archived thread while preserving explicit deep links, handoffs, and New Chat intents.
Changes
Opening the cavetoEntering the CaveupdatedAt, independent of pin orderVerification
pnpm test:app— 913/913 files passedpnpm test:mobile— 74/74 files passedCovenCaveTests— 180/180 passed on iPhone 16 Pro, iOS 26.5pnpm typecheckpnpm lint— zero design driftpnpm check:tests-wired— 1250 files wiredpnpm build— bundle and standalone budgets passedgit diff --checkRisk + rollout notes
The Daemon UI keeps the existing API contracts and isolates new styling under
.settings-daemon. Explicit iOS navigation intents retain priority over the recency default. The approved ZIP (SHA-256956349d6be9de372dd67ea790b54b0f37051f16e43c347ffa7753c8af89d139c) was the design source; no migration or release-note entry is required.