Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
82c3b80
refactor: update device path handling and enhance script generation f…
Marfuen Aug 20, 2025
a0f0215
chore: add logging for device retrieval and organization checks
Marfuen Aug 20, 2025
48fccfa
Merge branch 'main' into mariano/agent-improvements
Marfuen Aug 20, 2025
4b54e2a
refactor: remove unnecessary console logs from device retrieval funct…
Marfuen Aug 20, 2025
1502493
Merge branch 'mariano/agent-improvements' of https://github.com/tryco…
Marfuen Aug 20, 2025
880420a
Merge pull request #1347 from trycompai/mariano/agent-improvements
Marfuen Aug 20, 2025
900d99a
feat: enhance download agent with improved error handling and configu…
Marfuen Aug 20, 2025
76e56a4
Merge pull request #1349 from trycompai/mariano/agent-improvements
Marfuen Aug 20, 2025
0254930
refactor: remove fleet feature flag checks from employee and organiza…
Marfuen Aug 20, 2025
8c05fd8
Merge pull request #1350 from trycompai/mariano/agent-improvements
Marfuen Aug 20, 2025
fe37a73
fix: update marker file handling in Windows script
Marfuen Aug 20, 2025
a313739
fix: improve PowerShell command in Windows script for better execution
Marfuen Aug 20, 2025
2975a08
Merge pull request #1351 from trycompai/mariano/agent-improvements
Marfuen Aug 20, 2025
9b4aeee
fix: enhance elevation process in Windows script for better user expe…
Marfuen Aug 20, 2025
aeffa4e
Merge pull request #1352 from trycompai/mariano/agent-improvements
Marfuen Aug 20, 2025
1a67177
fix: enhance elevation and error handling in Windows script
Marfuen Aug 20, 2025
d9039aa
Merge pull request #1353 from trycompai/mariano/agent-improvements
Marfuen Aug 20, 2025
2705540
fix: streamline elevation process in Windows script for clarity
Marfuen Aug 20, 2025
514fba7
Merge pull request #1354 from trycompai/mariano/agent-improvements
Marfuen Aug 20, 2025
bfad924
fix: add persistent cmd session support in Windows script
Marfuen Aug 20, 2025
b84a152
Merge pull request #1355 from trycompai/mariano/agent-improvements
Marfuen Aug 20, 2025
b2da074
fix: improve directory selection logic in Windows script
Marfuen Aug 20, 2025
b88898a
Merge pull request #1356 from trycompai/mariano/agent-improvements
Marfuen Aug 20, 2025
bfbfca0
fix: refine directory creation logic in Windows script
Marfuen Aug 20, 2025
ee2c537
Merge pull request #1357 from trycompai/mariano/agent-improvements
Marfuen Aug 20, 2025
71858ec
fix: improve directory creation logic in Windows script
Marfuen Aug 20, 2025
2f17553
Merge pull request #1358 from trycompai/mariano/agent-improvements
Marfuen Aug 20, 2025
6a02bc4
Merge pull request #1360 from trycompai/mariano/tasks-limits-release
Marfuen Aug 20, 2025
d48ea60
fix: update registry path formatting in Windows script
Marfuen Aug 20, 2025
b831e3a
Merge pull request #1362 from trycompai/mariano/agent-improvements
Marfuen Aug 20, 2025
49e3ec4
fix: enhance directory and marker file handling in Windows script
Marfuen Aug 20, 2025
2ff98f6
Merge pull request #1363 from trycompai/mariano/agent-improvements
Marfuen Aug 20, 2025
3982150
fix: refine directory handling and logging in Windows script
Marfuen Aug 20, 2025
395c418
Merge pull request #1364 from trycompai/mariano/agent-improvements
Marfuen Aug 20, 2025
042db43
fix: improve variable handling and logging in Windows script
Marfuen Aug 20, 2025
d95ae13
Merge pull request #1365 from trycompai/mariano/agent-improvements
Marfuen Aug 20, 2025
9c54eb0
fix: enhance logging and error handling in Windows script
Marfuen Aug 20, 2025
8773baa
Merge pull request #1366 from trycompai/mariano/agent-improvements
Marfuen Aug 20, 2025
e27a003
fix: enhance structure and logging in Windows script
Marfuen Aug 20, 2025
e394194
Merge pull request #1367 from trycompai/mariano/agent-improvements
Marfuen Aug 20, 2025
e9a5afd
fix: streamline script structure and enhance logging in Windows script
Marfuen Aug 20, 2025
47937ef
Merge pull request #1368 from trycompai/mariano/agent-improvements
Marfuen Aug 20, 2025
37ea28b
fix: refine directory existence checks and logging in Windows script
Marfuen Aug 20, 2025
07643e2
Merge pull request #1369 from trycompai/mariano/agent-improvements
Marfuen Aug 20, 2025
f34610f
fix: correct Windows path formatting in fleet label creation script
Marfuen Aug 20, 2025
c032989
Merge pull request #1370 from trycompai/mariano/agent-improvements
Marfuen Aug 20, 2025
9db9538
Merge branch 'release' into main
Marfuen Aug 20, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ interface EmployeeDetailsProps {
})[];
fleetPolicies: FleetPolicy[];
host: Host;
isFleetEnabled: boolean;
}

export function Employee({
Expand All @@ -25,7 +24,6 @@ export function Employee({
trainingVideos,
fleetPolicies,
host,
isFleetEnabled,
}: EmployeeDetailsProps) {
return (
<div className="flex flex-col gap-4">
Expand All @@ -36,7 +34,6 @@ export function Employee({
trainingVideos={trainingVideos}
fleetPolicies={fleetPolicies}
host={host}
isFleetEnabled={isFleetEnabled}
/>
</div>
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ export const EmployeeTasks = ({
trainingVideos,
host,
fleetPolicies,
isFleetEnabled,
}: {
employee: Member & {
user: User;
Expand All @@ -24,7 +23,6 @@ export const EmployeeTasks = ({
})[];
host: Host;
fleetPolicies: FleetPolicy[];
isFleetEnabled: boolean;
}) => {
return (
<Card>
Expand All @@ -43,7 +41,7 @@ export const EmployeeTasks = ({
<TabsList className="mb-4">
<TabsTrigger value="policies">Policies</TabsTrigger>
<TabsTrigger value="training">Training Videos</TabsTrigger>
{isFleetEnabled && <TabsTrigger value="device">Device</TabsTrigger>}
<TabsTrigger value="device">Device</TabsTrigger>
</TabsList>

<TabsContent value="policies">
Expand Down Expand Up @@ -116,45 +114,43 @@ export const EmployeeTasks = ({
</div>
</TabsContent>

{isFleetEnabled && (
<TabsContent value="device">
{host ? (
<Card>
<CardHeader>
<CardTitle>{host.computer_name}'s Policies</CardTitle>
</CardHeader>
<CardContent className="space-y-3">
{fleetPolicies.map((policy) => (
<div
key={policy.id}
className={cn(
'hover:bg-muted/50 flex items-center justify-between rounded-md border border-l-4 p-3 shadow-sm transition-colors',
policy.response === 'pass' ? 'border-l-green-500' : 'border-l-red-500',
)}
>
<p className="font-medium">{policy.name}</p>
{policy.response === 'pass' ? (
<div className="flex items-center gap-1 text-green-600">
<CheckCircle2 size={16} />
<span>Pass</span>
</div>
) : (
<div className="flex items-center gap-1 text-red-600">
<XCircle size={16} />
<span>Fail</span>
</div>
)}
</div>
))}
</CardContent>
</Card>
) : (
<div className="text-muted-foreground py-6 text-center">
<p>No device found.</p>
</div>
)}
</TabsContent>
)}
<TabsContent value="device">
{host ? (
<Card>
<CardHeader>
<CardTitle>{host.computer_name}'s Policies</CardTitle>
</CardHeader>
<CardContent className="space-y-3">
{fleetPolicies.map((policy) => (
<div
key={policy.id}
className={cn(
'hover:bg-muted/50 flex items-center justify-between rounded-md border border-l-4 p-3 shadow-sm transition-colors',
policy.response === 'pass' ? 'border-l-green-500' : 'border-l-red-500',
)}
>
<p className="font-medium">{policy.name}</p>
{policy.response === 'pass' ? (
<div className="flex items-center gap-1 text-green-600">
<CheckCircle2 size={16} />
<span>Pass</span>
</div>
) : (
<div className="flex items-center gap-1 text-red-600">
<XCircle size={16} />
<span>Fail</span>
</div>
)}
</div>
))}
</CardContent>
</Card>
) : (
<div className="text-muted-foreground py-6 text-center">
<p>No device found.</p>
</div>
)}
</TabsContent>
</Tabs>
</CardContent>
</Card>
Expand Down
6 changes: 0 additions & 6 deletions apps/app/src/app/(app)/[orgId]/people/[employeeId]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { auth } from '@/utils/auth';

import { getPostHogClient } from '@/app/posthog';
import {
type TrainingVideo,
trainingVideos as trainingVideosData,
Expand Down Expand Up @@ -40,10 +39,6 @@ export default async function EmployeeDetailsPage({
}

const { fleetPolicies, device } = await getFleetPolicies(employee);
const isFleetEnabled = await getPostHogClient()?.isFeatureEnabled(
'is-fleet-enabled',
session?.session.userId,
);

return (
<Employee
Expand All @@ -52,7 +47,6 @@ export default async function EmployeeDetailsPage({
trainingVideos={employeeTrainingVideos}
fleetPolicies={fleetPolicies}
host={device}
isFleetEnabled={isFleetEnabled ?? false}
/>
);
}
Expand Down
18 changes: 4 additions & 14 deletions apps/app/src/app/(app)/[orgId]/people/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { getPostHogClient } from '@/app/posthog';
import { auth } from '@/utils/auth';
import { SecondaryMenu } from '@comp/ui/secondary-menu';
import { db } from '@db';
Expand Down Expand Up @@ -27,11 +26,6 @@ export default async function Layout({ children }: { children: React.ReactNode }
return roles.includes('employee');
});

const isFleetEnabled = await getPostHogClient()?.isFeatureEnabled(
'is-fleet-enabled',
session?.session.userId,
);

return (
<div className="m-auto max-w-[1200px]">
<SecondaryMenu
Expand All @@ -48,14 +42,10 @@ export default async function Layout({ children }: { children: React.ReactNode }
},
]
: []),
...(isFleetEnabled
? [
{
path: `/${orgId}/people/devices`,
label: 'Employee Devices',
},
]
: []),
{
path: `/${orgId}/people/devices`,
label: 'Employee Devices',
},
]}
/>

Expand Down
23 changes: 12 additions & 11 deletions apps/app/src/jobs/tasks/device/create-fleet-label-for-org.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,20 +29,21 @@ export const createFleetLabelForOrg = task({
return;
}

const fleetDevicePathMac = process.env.FLEET_DEVICE_PATH_MAC;
const fleetDevicePathWindows = process.env.FLEET_DEVICE_PATH_WINDOWS;
const fleetDevicePathMac = '/Users/Shared/.fleet';
const fleetDevicePathWindows = 'C:\\ProgramData\\CompAI\\Fleet';
const windowsFallbackDir = 'C:\\Users\\Public\\CompAI\\Fleet';

if (!fleetDevicePathMac || !fleetDevicePathWindows) {
logger.error('FLEET_DEVICE_PATH_MAC or FLEET_DEVICE_PATH_WINDOWS not configured');
return;
}

// Create a query that matches devices from either macOS or Windows
const query = `SELECT 1 FROM file WHERE path = '${fleetDevicePathMac}/${organizationId}' OR path = '${fleetDevicePathWindows}\\${organizationId}' LIMIT 1;`;
// Simple union query: only file table, constrained per platform path
const query = `
SELECT 1 FROM file WHERE path = '${fleetDevicePathMac}/${organizationId}'
UNION SELECT 1 FROM file WHERE path = '${fleetDevicePathWindows}\\${organizationId}'
UNION SELECT 1 FROM file WHERE path = '${windowsFallbackDir}\\${organizationId}'
LIMIT 1;`;
const normalizedQuery = query.replace(/\s+/g, ' ').trim();

logger.info('Creating label', {
name: organization.id,
query: query,
query: normalizedQuery,
});

const fleet = await getFleetInstance();
Expand All @@ -53,7 +54,7 @@ export const createFleetLabelForOrg = task({
// Create a manual label that we can assign to hosts.
labelResponse = await fleet.post('/labels', {
name: organization.id,
query: query,
query: normalizedQuery,
});

logger.info('Label created', {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ interface EmployeeTasksListProps {
member: Member;
fleetPolicies: FleetPolicy[];
host: Host | null;
isFleetEnabled: boolean;
}

export const EmployeeTasksList = ({
Expand All @@ -24,7 +23,6 @@ export const EmployeeTasksList = ({
member,
fleetPolicies,
host,
isFleetEnabled,
}: EmployeeTasksListProps) => {
// Check completion status
const hasAcceptedPolicies =
Expand Down Expand Up @@ -58,16 +56,12 @@ export const EmployeeTasksList = ({
title: 'Accept security policies',
content: <PoliciesAccordionItem policies={policies} member={member} />,
},
...(isFleetEnabled
? [
{
title: 'Download and install Comp AI Device Agent',
content: (
<DeviceAgentAccordionItem member={member} host={host} fleetPolicies={fleetPolicies} />
),
},
]
: []),
{
title: 'Download and install Comp AI Device Agent',
content: (
<DeviceAgentAccordionItem member={member} host={host} fleetPolicies={fleetPolicies} />
),
},
{
title: 'Complete general security awareness training',
content: <GeneralTrainingAccordionItem trainingVideoCompletions={trainingVideoCompletions} />,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,13 @@ interface OrganizationDashboardProps {
member: MemberWithUserOrg; // Pass the full member object for user info etc.
fleetPolicies: FleetPolicy[];
host: Host | null;
isFleetEnabled: boolean;
}

export async function OrganizationDashboard({
organizationId,
member,
fleetPolicies,
host,
isFleetEnabled,
}: OrganizationDashboardProps) {
// Fetch policies specific to the selected organization
const policies = await db.policy.findMany({
Expand Down Expand Up @@ -74,7 +72,6 @@ export async function OrganizationDashboard({
member={member} // Pass the member object down
fleetPolicies={fleetPolicies}
host={host}
isFleetEnabled={isFleetEnabled ?? false}
/>
);
}
21 changes: 3 additions & 18 deletions apps/portal/src/app/(app)/(home)/[orgId]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
'use server';

import { auth } from '@/app/lib/auth';
import { getPostHogClient } from '@/app/posthog';
import { getFleetInstance } from '@/utils/fleet';
import type { Member } from '@db';
import { db } from '@db';
Expand Down Expand Up @@ -45,26 +44,13 @@ export default async function OrganizationPage({ params }: { params: Promise<{ o
return redirect('/'); // Or appropriate login/auth route
}

// Check fleet feature flag first
let isFleetEnabled = false;
try {
const postHogClient = await getPostHogClient();
isFleetEnabled =
(await postHogClient?.isFeatureEnabled('is-fleet-enabled', session?.user.id)) ?? false;
} catch (error) {
console.error('Error checking fleet feature flag:', error);
// Default to false if there's an error
}

// Only fetch fleet policies if fleet is enabled
let fleetPolicies: FleetPolicy[] = [];
let device: Host | null = null;

if (isFleetEnabled) {
const fleetData = await getFleetPolicies(member);
fleetPolicies = fleetData.fleetPolicies;
device = fleetData.device;
}
const fleetData = await getFleetPolicies(member);
fleetPolicies = fleetData.fleetPolicies;
device = fleetData.device;

return (
<OrganizationDashboard
Expand All @@ -73,7 +59,6 @@ export default async function OrganizationPage({ params }: { params: Promise<{ o
member={member}
fleetPolicies={fleetPolicies}
host={device}
isFleetEnabled={isFleetEnabled}
/>
);
} catch (error) {
Expand Down
15 changes: 10 additions & 5 deletions apps/portal/src/app/api/download-agent/fleet-label.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,30 +24,35 @@ export async function createFleetLabel({
const fleet = await getFleetInstance();
logger('Fleet instance obtained successfully');

// Create platform-specific query
// OS-specific queries: mac uses file-only; Windows uses UNION with file and registry
const query =
os === 'macos'
? `SELECT 1 FROM file WHERE path = '${fleetDevicePathMac}/${employeeId}' LIMIT 1;`
: `SELECT 1 FROM file WHERE path = '${fleetDevicePathWindows}\\${employeeId}' LIMIT 1;`;
: `SELECT 1 FROM file WHERE path = '${fleetDevicePathWindows}\\${employeeId}'
UNION SELECT 1 FROM file WHERE path = 'C:\\Users\\Public\\CompAI\\Fleet\\${employeeId}'
LIMIT 1;`;

// Normalize whitespace to a single line to avoid issues with newlines/tabs
const normalizedQuery = query.replace(/\s+/g, ' ').trim();

logger('Generated Fleet query for label creation', {
employeeId,
os,
query,
query: normalizedQuery,
});

logger('Sending POST request to Fleet API to create label...', {
labelName: employeeId,
endpoint: '/labels',
requestBody: {
name: employeeId,
query: query,
query: normalizedQuery,
},
});

const response = await fleet.post('/labels', {
name: employeeId,
query: query,
query: normalizedQuery,
});

logger('Fleet API response received', {
Expand Down
Loading
Loading