Skip to content

[comp] Production Deploy#2136

Merged
tofikwest merged 9 commits intoreleasefrom
main
Feb 17, 2026
Merged

[comp] Production Deploy#2136
tofikwest merged 9 commits intoreleasefrom
main

Conversation

@github-actions
Copy link
Contributor

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.

github-actions bot and others added 2 commits February 13, 2026 17:21
* feat(device-agent): new device agent package and CI workflow for releases

* feat(devices): add linux platform support to device interfaces and schemas

* refactor(people): update Employee component to use button rendering

* refactor(devices): simplify device ID handling and update DTO definition

* feat(api): add organization membership verification for device check-in

* refactor(api): update device ID definition to support multiple types

* feat(devices): add linux support to platform labels in device components

* refactor(people): update EmployeeCompletionChart to manage perPage state

* feat(ci): enhance device agent release workflow with version detection

* refactor(ci): update portal URL handling in device agent release workflow

* chore(device-agent): remove unused generate-icons script

* feat(devices): add mergeDeviceLists utility for device deduplication

* refactor(devices): update disk encryption check to use latest result

* chore(device-agent): update version and author information in package.json

* feat(device-agent): comp-ai device agent

* feat(device-agent): update auto update interval time

* fix(employee): remove EMPLOYEE_FORM_ID from Employee

* fix(fleet-logic): return old condition for fleet

* feat(device-agent): s3 logic for stage

* fix(device-agent): using correct time for updated_at var

* fix(org-training-course): fix for orgs which disable trainings

* fix(trainining-videos): corerct calc total tasks

---------

Co-authored-by: Lewis Carhart <lewis@trycomp.ai>
Co-authored-by: Tofik Hasanov <annexcies@gmail.com>
@vercel
Copy link

vercel bot commented Feb 15, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

2 Skipped Deployments
Project Deployment Actions Updated (UTC)
app (staging) Skipped Skipped Feb 17, 2026 7:48am
portal (staging) Skipped Skipped Feb 17, 2026 7:48am

Request Review

@cursor
Copy link

cursor bot commented Feb 15, 2026

PR Summary

High Risk
Introduces new production release automation (tagging, signing, S3 uploads) and adds new authenticated device-agent registration/check-in APIs that write compliance data, so misconfiguration or logic issues could impact releases and device/compliance reporting.

Overview
Adds end-to-end support for the new Comp AI Device Agent alongside legacy FleetDM.

Introduces a new GitHub Actions device-agent-release workflow to version, build, codesign (macOS/Windows), publish GitHub releases/tags, and upload installers + auto-update artifacts to S3 for both staging and production.

Updates the API and apps to treat devices as hybrid data: the API now merges FleetDM and DB-backed device-agent devices (with a source field and string/number id), People flows delete device-agent device records on unlink, and the app/portal UIs surface device-agent compliance data (lists, per-employee checks, task completion counts) while preferring agent devices over Fleet when both exist.

Portal adds authenticated device-agent endpoints (register, check-in, status, my-organizations) plus an S3-proxied auto-update download route, switches agent downloads to S3 “latest” targets (including Linux), and expands auth/origin config and design-system usage as part of the UI refresh.

Written by Cursor Bugbot for commit c6ac355. This will update automatically on new commits. Configure here.

const checkInSchema = z.object({
deviceId: z.string().min(1),
checks: z.array(checkResultSchema).min(1),
agentVersion: z.string().optional(),
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Partial check-ins can report stale compliance

Medium Severity

checkInSchema accepts any non-empty checks array, and isCompliant is computed from existing stored fields plus only the submitted checks. If a check is omitted in a payload, its old value is reused, so isCompliant can stay true even when a required control currently fails.

Additional Locations (1)

Fix in Cursor Fix in Web

`Failed to fetch agent devices for org ${organizationId}: ${error instanceof Error ? error.message : error}`,
);
return [];
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Device fetch errors are silently hidden

Medium Severity

The new helper methods catch backend failures and return empty arrays, so findAllByOrganization and findAllByMember can return successful empty results when db.device or Fleet queries fail. This turns real data access failures into “no devices,” causing silent incorrect behavior.

Additional Locations (2)

Fix in Cursor Fix in Web

`Failed to delete device-agent devices for member ${memberId}:`,
deviceError,
);
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unlink reports success after failed deletion

Medium Severity

unlinkDevice logs and ignores failures from db.device.deleteMany, then continues and returns success from MemberQueries.unlinkDevice. If device-agent deletion fails, the API still reports a successful unlink while device records remain, leaving the system in a partially unlinked state.

Fix in Cursor Fix in Web

…2137)

The version detection grep was only filtering out '-staging' suffixes,
but failed on tags like 'device-agent-v0.1.0-beta.1'. The arithmetic
parser couldn't handle '0-beta.1' as a patch number, causing the
version to be empty and electron-builder to fail with "Please specify
'version' in the package.json".

Now uses a strict regex to only match clean semver tags (e.g.,
device-agent-v1.0.0), which correctly falls back to 1.0.0 when no
clean tags exist.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
)

CI overrides this at build time, but keeping it in sync with what
the version detection computes (1.0.0 since no clean semver tags exist).

Co-authored-by: Tofik Hasanov <annexcies@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
@vercel vercel bot temporarily deployed to staging – portal February 16, 2026 21:06 Inactive
@vercel vercel bot temporarily deployed to staging – app February 16, 2026 21:06 Inactive
);
const filteredFleetDevices = fleetDevices.filter(
(host) => !host.member_id || !memberIdsWithAgent.has(host.member_id),
);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fleet devices hidden for mixed-source members

Medium Severity

The deduplication in apps/app/src/app/(app)/[orgId]/people/page.tsx removes every Fleet host for any member who has at least one device_agent record. This member-level filter can hide valid Fleet-only devices when a user has multiple machines, so device inventory and compliance views become incomplete.

Fix in Cursor Fix in Web

git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git tag "${{ needs.detect-version.outputs.tag_name }}" -m "${{ needs.detect-version.outputs.release_name }}"
git push origin "${{ needs.detect-version.outputs.tag_name }}"
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Release versioning race creates tag collisions

Medium Severity

The workflow computes NEXT_VERSION from the latest tag and later pushes tag_name without any concurrency guard or existence check. Two runs started close together can derive the same version, and one fails when git push hits an already-created tag, causing nondeterministic release failures.

Additional Locations (1)

Fix in Cursor Fix in Web

…1.3.2 (#2141)

* chore(device-agent): align package.json version to 1.0.0 baseline

CI overrides this at build time, but keeping it in sync with what
the version detection computes (1.0.0 since no clean semver tags exist).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(ci): use stable sslcom/esigner-codesign@v1.3.2 instead of @develop

The @develop branch broke Windows code signing — the action stopped
passing -username and -password flags to CodeSignTool. Pinning to the
latest stable tag v1.3.2.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Tofik Hasanov <annexcies@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
@vercel vercel bot temporarily deployed to staging – portal February 16, 2026 23:37 Inactive
@vercel vercel bot temporarily deployed to staging – app February 16, 2026 23:37 Inactive

const devices = await db.device.findMany({
where: { organizationId },
include: {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Deactivated member devices still appear

Medium Severity

getEmployeeDevicesFromDB queries db.device by organizationId only, so it also returns devices tied to deactivated members. Since deactivated members are not deleted, stale devices continue to show in the devices view and can skew operational visibility.

Fix in Cursor Fix in Web

osVersion,
hardwareModel,
agentVersion,
},
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hostname never updates for serialless devices

Low Severity

In the no-serial-number update branch, db.device.update omits hostname, so re-registration cannot refresh hostname changes. hostname is only set on create, leaving stale hostnames for serial-less devices after renames.

Fix in Cursor Fix in Web

…deSignTool invocation (#2143)

The sslcom/esigner-codesign GitHub Action (both @develop and @v1.3.2)
has a bug where it fails to pass -username and -password flags to the
CodeSignTool CLI. Replaced with direct download and invocation of
CodeSignTool v1.3.0 via PowerShell.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
- Replace broken sslcom/esigner-codesign action with direct CodeSignTool
  jar invocation via Java (the action fails to pass credentials)
- Use staging AWS credentials for non-release branches, production for
  release branch
- Fix Linux artifact filenames: .deb uses amd64, .AppImage uses x86_64
  (not x64 as previously assumed)
- Update portal download constants to match actual .deb filename

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Copy link

@cursor cursor bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Bugbot Autofix is OFF. To automatically fix reported issues with Cloud Agents, enable Autofix in the Cursor dashboard.

},
},
orderBy: { installedAt: 'desc' },
});
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Single device hides other member devices

Medium Severity

getMemberDevice uses db.device.findFirst and returns only one record (latest installedAt) for a member. Since Device is one-to-many per member, the employee page can ignore additional devices and show compliance from just one machine, which can misrepresent the member’s actual compliance posture.

Fix in Cursor Fix in Web

aws s3 cp artifacts/CompAI-Device-Agent-${VERSION}-x86_64.AppImage \
s3://${S3_BUCKET}/${PREFIX}/linux/CompAI-Device-Agent-${VERSION}-x86_64.AppImage
aws s3 cp artifacts/CompAI-Device-Agent-${VERSION}-x86_64.AppImage \
s3://${S3_BUCKET}/${PREFIX}/linux/latest-x86_64.AppImage
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Linux artifact names don’t match build output

High Severity

The S3 upload step expects Linux files named with amd64 and x86_64, but electron-builder uses artifactName: 'CompAI-Device-Agent-${version}-${arch}.${ext}' and builds Linux with arch: ['x64']. This mismatch makes aws s3 cp target non-existent files, breaking Linux artifact publishing in the release workflow.

Additional Locations (1)

Fix in Cursor Fix in Web

Co-authored-by: Tofik Hasanov <annexcies@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
@vercel vercel bot temporarily deployed to staging – portal February 17, 2026 07:48 Inactive
@vercel vercel bot temporarily deployed to staging – app February 17, 2026 07:48 Inactive
@tofikwest tofikwest merged commit f2dd650 into release Feb 17, 2026
20 checks passed
@claudfuen
Copy link
Contributor

🎉 This PR is included in version 1.83.1 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

Comments