feat(cloud): AI safety ratings for Startup Manager and Uninstaller#73
feat(cloud): AI safety ratings for Startup Manager and Uninstaller#73
Conversation
Show a loading spinner instead of rendering nothing while the onboarding IPC check completes. On slow Windows 10 machines the concurrent startup IPC calls (settings, history, platform, etc.) queue up synchronous file reads, delaying the onboarding response and leaving users with a blank window. Also fix onboarding completion not being reliably persisted — the write was fire-and-forget so closing the app quickly could lose the flag — and add missing gameMode to PlatformInfo defaults. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Startup toggle silently returned success even when all registry operations failed (e.g. HKLM without admin), causing the UI to show items as disabled until the next refresh. Now returns false when no critical registry write succeeds, so the optimistic UI update reverts and an error toast is shown. Privacy toggle notification was based on intention rather than actual post-rescan state. When the operation reported no error but the system state didn't change, the toast still said "Activated". Now compares pre/post state and shows an admin-required error when unchanged. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…nstaller Cloud-enriched safety analysis for startup programs and installed programs. When linked to Kudu Cloud, each item shows a color-coded shield icon (green/amber/orange/red) with a clickable detail panel showing the AI description and safety score. When cloud is not linked, badges show greyed out with a prompt to link. - Add StartupSafetyRating/StartupSafetyResult types - Add IPC channels and preload bridge for both startup and program safety - Add cloud agent methods to POST items and poll for ratings - Add safety state to startup-store and uninstaller-store with push listeners - Add shield icon badges, SafetyTooltip, expanded detail panels to both pages - Add sort-by-safety option to both pages - Add i18n keys for safety UI strings Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: c0abbefaa9
ℹ️ 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".
Clear startupItems and cachedInstalledPrograms before renderer-triggered safety fetches so that post-toggle/post-refresh requests re-list from the OS instead of reusing stale snapshots. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a99becda63
ℹ️ 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".
| setSafetyRatings: (ratings) => set({ | ||
| safetyRatings: Object.fromEntries(ratings.map((r) => [r.name, r])) | ||
| }), |
There was a problem hiding this comment.
Key startup safety ratings by unique item identity
This map uses only r.name as the key, but startup entries are not guaranteed to be unique by name (e.g., the same startup name can exist in both HKCU and HKLM locations). When that happens, later entries overwrite earlier ones, so one item can display/sort with another item's safety score. Use a stable composite key (such as name+source+location or an explicit id returned by the API) to avoid collisions.
Useful? React with 👍 / 👎.
| selectAll: (ids) => set({ selectedIds: new Set(ids) }), | ||
| clearSelected: () => set({ selectedIds: new Set<string>() }), | ||
| setSafetyRatings: (ratings) => set({ | ||
| safetyRatings: Object.fromEntries(ratings.map((r) => [r.name, r])), |
There was a problem hiding this comment.
Preserve ratings for programs sharing display names
Safety ratings are indexed only by r.name (which is populated from displayName), so two installed programs with the same display name but different publishers/versions will collide and one rating will overwrite the other. This produces incorrect badges and safety sorting for at least one program in that case; use a unique identity (for example displayName+publisher or a stable program id echoed back from the server).
Useful? React with 👍 / 👎.
Summary
/devices/{id}/startup-programsand/devices/{id}/installed-programs, polls while analyses are pendingFiles changed
shared/types.ts,shared/channels.tscloud-agent.ts,startup-safety.ipc.ts(new),program-safety.ipc.ts(new),ipc/index.tspreload/index.tsstartup-store.ts,uninstaller-store.ts,StartupPage.tsx,UninstallerPage.tsxen/startup.json,en/uninstaller.jsonTest plan
ShieldOff, click shows toastnpm testpasses (1891 tests)🤖 Generated with Claude Code