feat: RMM Overshell, IT Glue audit/write-back, LogLift, link-aware bundles, dashboard overhaul

- RMM Overshell (migration 077): admin page, dispatch UI, executor/worker, target
  resolver, script registry (AD/DHCP/DNS/event-log/services/software/network/loglift)
- LogLift evidence pipeline (migration 078): upload webhook, B2 storage client,
  receiver/matcher, EventLogCollector PowerShell script
- IT Glue audit + write-back (migrations 075, 076): asset-audit runner, ticket
  xrefs, applications/configurations browse pages + apply/revert/audit endpoints
- Link-aware analyzer bundles (migration 073) + provider toggle (migration 074):
  link-discovery service, OpenRouter LLM provider, related-tickets/itglue-suggestion
  panels, analyze-bundle endpoint
- Endpoint data model + device-link reconciliation (migrations 079, 080): conflicts
  admin page, reconciler service, resolve endpoints
- Dashboard overhaul: integration-health service + alerts, overview/health endpoints
- Permissions: add itglue + rmm scopes; middleware: public /api/rmm/loglift route

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
lorentz 2026-05-03 07:13:18 -04:00
parent 378e68ad8a
commit 1112a06afe
132 changed files with 21352 additions and 743 deletions

View file

@ -76,6 +76,7 @@ import { DattoRMMDevice } from '@/lib/types/datto-rmm';
import { AuvikDevice } from '@/lib/types/auvik';
import { AddigyDevice } from '@/lib/types/addigy';
import { useApi } from '@/lib/hooks/use-api';
import { RmmDispatchDialog } from '@/components/rmm/rmm-dispatch-dialog';
interface DeviceComparison {
autotaskDevice?: ConfigurationItem;
@ -864,6 +865,7 @@ function ConfigurationItemsContent() {
<TableHead>RMM</TableHead>
<TableHead>NMS</TableHead>
<TableHead>ARMM</TableHead>
<TableHead className="w-32">Actions</TableHead>
</TableRow>
</TableHeader>
<TableBody>
@ -889,7 +891,7 @@ function ConfigurationItemsContent() {
setExpandedContacts(newExpanded);
}}
>
<TableCell colSpan={11}>
<TableCell colSpan={12}>
<div className="flex items-center gap-2">
<ChevronRight className={`h-4 w-4 transition-transform ${isExpanded ? 'rotate-90' : ''}`} />
<Users className="h-4 w-4" />
@ -1024,6 +1026,17 @@ function ConfigurationItemsContent() {
<XCircle className="w-4 h-4 text-gray-400" />
)}
</TableCell>
<TableCell className="w-32" onClick={(e) => e.stopPropagation()}>
{item.rmmDevice?.uid ? (
<RmmDispatchDialog
deviceUid={item.rmmDevice.uid}
hostname={item.rmmDevice.hostname ?? null}
companyId={selectedCompany ?? null}
/>
) : (
<span className="text-xs text-muted-foreground"></span>
)}
</TableCell>
</TableRow>
))}
</>
@ -1150,6 +1163,17 @@ function ConfigurationItemsContent() {
<XCircle className="w-4 h-4 text-gray-400" />
)}
</TableCell>
<TableCell className="w-32" onClick={(e) => e.stopPropagation()}>
{item.rmmDevice?.uid ? (
<RmmDispatchDialog
deviceUid={item.rmmDevice.uid}
hostname={item.rmmDevice.hostname ?? null}
companyId={selectedCompany ?? null}
/>
) : (
<span className="text-xs text-muted-foreground"></span>
)}
</TableCell>
</TableRow>
))
)}