Conversation
When an org's only device-sync-capable connection (Intune/Kandji/JumpCloud)
is in error state (e.g. expired OAuth), the Devices tab hid the sync
selector entirely with no explanation. Now available-providers reports
connectionStatus ('active' | 'error' | null) and the selector renders a
reconnect hint linking to Integrations instead of rendering nothing.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TfDHFTwRgYxUoyyqGkHPDc
…e pattern Replaces the notification-bar approach with the established sync-source control UX (TwoFactorSourceSelector / people sync): an always-visible labeled select — dashed 'Connect an integration' slot when the org has no device-sync connection, provider options with logo/Active marker and a 'Don't auto-sync' option, and broken (errored) connections listed as disabled options marked 'Reconnect'. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TfDHFTwRgYxUoyyqGkHPDc
- connectionStatus fallback now decides by the LATEST connection row: reconnects create new rows, so a newer 'disconnected' row must not be shadowed by a stale older 'error' row (no more false reconnect hints after a deliberate disconnect) - closed select trigger shows 'Needs reconnection' instead of the misleading 'Not syncing' when the only connection(s) are broken - 'Don't auto-sync' Active marker keyed on the saved provider slug, not the resolved connected provider, so a broken chosen provider no longer mislabels auto-sync as disabled Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TfDHFTwRgYxUoyyqGkHPDc
The 'Needs reconnection' trigger state only fired when NO provider was connected. If the saved sync source's connection broke while another provider stayed connected, the trigger fell back to 'Not syncing' even though the daily sync was failing. Key the trigger off the saved provider's errored state as well. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TfDHFTwRgYxUoyyqGkHPDc
…ction-hint feat(devices): always-visible device-sync source selector (People-tab pattern)
|
The latest updates on your projects. Learn more about Vercel for GitHub.
1 Skipped Deployment
|
Contributor
There was a problem hiding this comment.
All reported issues were addressed across 5 files
Confidence score: 5/5
- Safe to merge after the addressed issues were fixed.
Reply with feedback, questions, or to request a fix.
Fix all with cubic | Re-trigger cubic
…evice sync (#3383) * feat(devices): universal source-reported compliance for device sync Device sync's universal shape gains optional provider-reported fields: - isCompliant (overall verdict, e.g. Intune complianceState) - checks[] ({id,label,passed}, provider's own vocabulary, capped at 50) - lastSeenAt (provider's last-contact timestamp) Stored in a new nullable Device.sourceCompliance JSON column, fully separate from the agent's measured compliance columns. The devices UI renders what the source reported — verdict badge with provider attribution, provider-named check badges, honest online/offline dot from the provider timestamp — and keeps 'Not tracked' + dashes when a provider reports nothing. Agent and Fleet rendering paths untouched. All fields optional: existing device-sync definitions (Kandji, Intune, JumpCloud) keep validating unchanged; providers adopt per-field via their DB-row definitions with no deploy. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TfDHFTwRgYxUoyyqGkPDc * fix(devices): address cubic review on source-reported compliance - accept timezone offsets in lastSeenAt (a +02:00 timestamp must not drop the whole device from the sync) - clamp future lastSeenAt to now so provider clock skew can't pin an imported device 'Online' for days - details panel: provider attribution uses the accessible tooltip pattern (matching stale/not-tracked) instead of a title attribute - details header: online/offline shown for imported devices too, consistent with the list - drop 'red' from a test name that didn't assert color Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TfDHFTwRgYxUoyyqGkHPDc --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat(devices): count imported devices in the compliance chart The Device Compliance donut previously excluded integration-imported devices entirely, so its total contradicted the device table right below it. Now every device counts: imported devices use the SOURCE's verdict (sourceCompliance.isCompliant) for Compliant/Non-Compliant, and imported devices with no verdict land in a gray 'Not Tracked' segment instead of being fabricated into a verdict. The Not Tracked legend entry only appears when it exists, so agent/Fleet-only orgs see no change. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TfDHFTwRgYxUoyyqGkHPDc * fix(devices): compliance chart colors — dead legacy tokens rendered black CHART_COLORS referenced hsl(var(--chart-positive)) etc. from the legacy @trycompai/ui stylesheet, which the app no longer loads — so all pie segments fell back to SVG-default black. Use the design-system tokens the app actually defines: --primary (brand green) for compliant, --destructive for non-compliant, --muted-foreground for not tracked. Dark mode adapts automatically. Note: vendors/backup-overview charts reference the same dead tokens (same black rendering) — left for a follow-up, out of scope here. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TfDHFTwRgYxUoyyqGkHPDc --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…sync button (#3385) * refactor(devices): right-align device-sync control, icon-only re-sync button The sync-source select moves to the right end of its row (it's a setting, not the page subject), with the re-sync button snug beside it as an icon-only button — the select already names what's syncing, so the 'Sync now' text was redundant. aria-label + title keep it accessible; the connect-an-integration empty slot right-aligns too so the control doesn't jump sides between states. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TfDHFTwRgYxUoyyqGkHPDc * refactor(devices): match device-sync control to design — inline synced-ago + primary icon button Inline row per Tofik's mockup: 'Synced Xh ago' muted text, compact provider select (label dropped — the provider name + refresh affordance identify the control), and the re-sync button in the brand primary color, icon-only. Connect-an-integration slot keeps its label. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TfDHFTwRgYxUoyyqGkHPDc --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
#3386) The dropdown's info block already shows last/next sync times, so the inline 'Synced Xh ago' text was redundant. The icon-only re-sync button goes back to the neutral outline variant — a lone refresh icon doesn't warrant primary emphasis. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Contributor
|
Reviewed the three cubic findings on this deploy — all three are valid, none are release blockers (no correctness/data risk in what ships here; they are an efficiency improvement, an a11y improvement, and a test-accuracy fix). Fixes for all three are in #3387 to ride the next deploy. |
- available-providers: one batched connections query for all providers (newest-first, resolved in memory) instead of up to two point lookups per provider - device-sync select is controlled (value guarded to listed items) so the open dropdown marks the saved selection for keyboard and screen-reader users - older-API test fixture now genuinely omits connectionStatus instead of inheriting 'active' from the base fixture
Contributor
|
🎉 This PR is included in version 3.100.0 🎉 The release is available on GitHub release Your semantic-release bot 📦🚀 |
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.
This is an automated pull request to release the candidate branch into production, which will trigger a deployment.
It was created by the [Production PR] action.
Summary by cubic
Adds
connectionStatusto the device-sync API and rebuilds the Devices selector so users see reconnect/connect states instead of the selector disappearing. Also adds source-reported device compliance and provider last-seen so imported devices show accurate status and context, updates the compliance chart to include imported devices with correct coloring, and refines the control with an icon-only re-sync button and sync times shown inside the dropdown.New Features
connectionStatusper provider: 'active' | 'error' | null, based on the latest connection row.isCompliant,checks[], andlastSeenAt; stored inDevice.sourceCompliance; UI shows provider verdict and named checks with attribution; imported devices get honest online/offline from provider last-seen; CSV exports source-reported status.Bug Fixes
connectionStatus.Written for commit f0c9f2c. Summary will update on new commits.