fix(web): address installation feedback from user testing#398
Conversation
- Fix Tailscale onboarding: use `tailscale_up` field (not `connected`) and add "Configure in Settings" link when installed but not connected - Sort preferred model list alphabetically within groups - Increase emoji picker max-height to prevent cutoff (240→320px) - Humanize STT test errors (constraint, permission, device errors) - Fix skill deletion: add ServiceError::Forbidden variant, expose `protected` field in REST API so UI disables delete for built-in skills - Auth protection: detect UNAUTHORIZED in RPC responses, clear sensitive data on logout, hide session list when vault is sealed, handle 401/403 in bootstrap fetch Entire-Checkpoint: 7f64b9b73958
Merging this PR will degrade performance by 22.33%
|
| Benchmark | BASE |
HEAD |
Efficiency | |
|---|---|---|---|---|
| ❌ | env_substitution |
10 µs | 12.8 µs | -22.33% |
Comparing installation-feedback (21f8c71) with main (742bce9)
Footnotes
-
5 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports. ↩
Greptile SummaryThis PR addresses a batch of user-reported installation pain points across the Tailscale onboarding, model picker sorting, emoji picker UX, microphone error messages, skill deletion protection, and auth session hygiene. The Rust-side changes (new Key issues found:
Confidence Score: 3/5
Important Files Changed
Sequence DiagramsequenceDiagram
participant UI as Browser UI
participant WS as ws-connect.js
participant App as app.js
participant API as /api/*
participant Server as Rust Backend
Note over UI,Server: Normal auth expiry / logout flow
UI->>WS: RPC request (any method)
Server-->>WS: res { error: { code: "UNAUTHORIZED" } }
WS->>UI: dispatchEvent("moltis:auth-status-changed")
UI->>API: GET /api/auth/status
API-->>UI: { authenticated: false }
UI->>UI: clearSensitiveData()
Note right of UI: sessions/models/identity cleared<br/>vault_status NOT set → "sealed"
UI->>UI: window.location.assign("/login")
Note over UI,Server: Bootstrap fetch 401/403 guard
UI->>API: GET /api/bootstrap
API-->>UI: 401 or 403
UI->>UI: dispatchEvent("moltis:auth-status-changed")
UI->>API: GET /api/auth/status
API-->>UI: { authenticated: false }
UI->>UI: clearSensitiveData() → redirect /login
Note over UI,Server: Skill delete protection
UI->>API: DELETE skill (template / tmux)
API-->>UI: 403 Forbidden (ServiceError::Forbidden)
Note right of UI: protected=true disables button<br/>in UI before request is made
Last reviewed commit: f09063f |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f09063f50e
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
- Add gon.offChange() and clean up listener in SessionList useEffect - Debounce UNAUTHORIZED auth redirect with a flag to avoid N concurrent dispatches when multiple RPCs fail simultaneously - Set vault_status to "sealed" in clearSensitiveData() so SessionList shows the correct placeholder on logout - Simplify protected skill check in REST API to match server-side logic (check name only, not source type) Entire-Checkpoint: 0d9f0ce04c2b
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 947a8c6bf6
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Adjust expected order in priority_models_pin_raw_model_ids_first, priority_models_match_separator_variants, and models_without_priority_prefer_subscription_providers to reflect alphabetical sorting within preferred and non-preferred groups. Entire-Checkpoint: d8d3382a3e17
Codecov Report❌ Patch coverage is
📢 Thoughts on this report? Let us know! |
* fix(web): address installation feedback from user testing - Fix Tailscale onboarding: use `tailscale_up` field (not `connected`) and add "Configure in Settings" link when installed but not connected - Sort preferred model list alphabetically within groups - Increase emoji picker max-height to prevent cutoff (240→320px) - Humanize STT test errors (constraint, permission, device errors) - Fix skill deletion: add ServiceError::Forbidden variant, expose `protected` field in REST API so UI disables delete for built-in skills - Auth protection: detect UNAUTHORIZED in RPC responses, clear sensitive data on logout, hide session list when vault is sealed, handle 401/403 in bootstrap fetch Entire-Checkpoint: 7f64b9b73958 * fix(web): address PR review feedback - Add gon.offChange() and clean up listener in SessionList useEffect - Debounce UNAUTHORIZED auth redirect with a flag to avoid N concurrent dispatches when multiple RPCs fail simultaneously - Set vault_status to "sealed" in clearSensitiveData() so SessionList shows the correct placeholder on logout - Simplify protected skill check in REST API to match server-side logic (check name only, not source type) Entire-Checkpoint: 0d9f0ce04c2b * test(chat): update model ordering tests for alphabetical sort Adjust expected order in priority_models_pin_raw_model_ids_first, priority_models_match_separator_variants, and models_without_priority_prefer_subscription_providers to reflect alphabetical sorting within preferred and non-preferred groups. Entire-Checkpoint: d8d3382a3e17 * fix(review): address remaining PR feedback * style(web): apply biome formatting
…#398) * fix(web): address installation feedback from user testing - Fix Tailscale onboarding: use `tailscale_up` field (not `connected`) and add "Configure in Settings" link when installed but not connected - Sort preferred model list alphabetically within groups - Increase emoji picker max-height to prevent cutoff (240→320px) - Humanize STT test errors (constraint, permission, device errors) - Fix skill deletion: add ServiceError::Forbidden variant, expose `protected` field in REST API so UI disables delete for built-in skills - Auth protection: detect UNAUTHORIZED in RPC responses, clear sensitive data on logout, hide session list when vault is sealed, handle 401/403 in bootstrap fetch Entire-Checkpoint: 7f64b9b73958 * fix(web): address PR review feedback - Add gon.offChange() and clean up listener in SessionList useEffect - Debounce UNAUTHORIZED auth redirect with a flag to avoid N concurrent dispatches when multiple RPCs fail simultaneously - Set vault_status to "sealed" in clearSensitiveData() so SessionList shows the correct placeholder on logout - Simplify protected skill check in REST API to match server-side logic (check name only, not source type) Entire-Checkpoint: 0d9f0ce04c2b * test(chat): update model ordering tests for alphabetical sort Adjust expected order in priority_models_pin_raw_model_ids_first, priority_models_match_separator_variants, and models_without_priority_prefer_subscription_providers to reflect alphabetical sorting within preferred and non-preferred groups. Entire-Checkpoint: d8d3382a3e17 * fix(review): address remaining PR feedback * style(web): apply biome formatting
Summary
Fixes multiple issues reported during user installation testing (Discord feedback from David Cumps):
connected→tailscale_up) causing "Installed but not connected" to never show as connected. Add "Configure in Settings" link when Tailscale is installed but not connected.getUserMediaerrors ("Invalid constraint" → "No compatible microphone found").ServiceError::Forbiddenvariant with proper error code. Exposeprotectedfield in REST/api/skillsresponse so the UI correctly disables the delete button for built-in skills (template-skill, template, tmux).UNAUTHORIZEDin RPC responses and trigger redirect to login. Clear cached sensitive data (sessions, models, identity) on logout. Hide session list when vault is sealed. Handle 401/403 in bootstrap fetch.Feature requests filed separately
Validation
Completed
cargo checkpassescargo +nightly-2025-11-30 fmt --all -- --checkpassesbiome check --writepasses (no new errors)cargo test -p moltis-service-traitspassescargo test -p moltis-chatpassesRemaining
./scripts/local-validate.sh <PR_NUMBER>cargo testManual QA