Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
925ce38
Removed trying to load Windows system DLLs from user folders (#329)
panreyes Feb 12, 2026
609a2ce
Fix (UAC/Lock screen) (#320)
LightZirconite Feb 12, 2026
ac59c22
update duktape commit date/hash
si458 Feb 12, 2026
2277c1b
update win-wmi with fixes from meshcentral
si458 Feb 12, 2026
6860fd7
Fixed typo (net stort instead of net start) (#330)
panreyes Feb 12, 2026
8bbc945
Upgrade CodeQL actions to v2 and v4
si458 Feb 14, 2026
9bda665
Downgrade CodeQL action version to v2
si458 Feb 14, 2026
c1bb5cc
Enable JavaScript and C++ for CodeQL analysis
si458 Feb 14, 2026
4f9692c
Added option to limit the width of the desktop notification bar and a…
panreyes Feb 14, 2026
3e6203d
Code safely fix
Ylianst Feb 16, 2026
4a34966
Feat/agent validate webcert (#259)
HuFlungDu Feb 16, 2026
62b206e
Force alignment of allocated memory to prevent segmentation faults on…
gutschke Feb 16, 2026
c0faef2
Fixed compiler warnings
Ylianst Feb 16, 2026
9cb8ba1
Security note
Ylianst Feb 16, 2026
8dece7d
Linux compile fix
Ylianst Feb 16, 2026
ca0ebf2
Update README with supported agent keys table
si458 Mar 24, 2026
1d3662e
add mutliple monitor support to x11 for linux (#340)
si458 Apr 26, 2026
795b7d4
Corrected kvm_server_SetResolution definition and call. Fixes UAC del…
panreyes May 20, 2026
973b720
Run Duktape GC after system proxy detection (#346)
stachi May 20, 2026
a040c51
fix: prevent double-free of controlChannelRequest on connection timeo…
bdasnevesKP May 20, 2026
19e7135
macOS Tahoe: helper joins console user audit session for screen captu…
Austin519 May 20, 2026
f9ace66
fix db.Delete and add extra arguments to dbTool.js
si458 May 26, 2026
b33a61d
update WindowsTargetPlatformVersion and commit.h
si458 May 26, 2026
a20c31f
macOS Tahoe: split KVM helper into a user LaunchAgent (replaces #344 …
Austin519 Jun 2, 2026
6565c5e
fix macos kvmagent reconnect
si458 Jun 2, 2026
f3e031a
Fix UninstallString issues with paths with spaces (#352)
panreyes Jun 2, 2026
f2302c1
update modules #332
si458 Jun 2, 2026
7b55490
update agent-installer
si458 Jun 2, 2026
cb62daa
add xrandr and universal mac build to makefile instructions
si458 Jun 4, 2026
a116e9c
add Linux build workflow
si458 Jul 5, 2026
bbb477f
Refactor Linux build workflow for ARM architecture
si458 Jul 5, 2026
09d970c
use sudo for linux build
si458 Jul 5, 2026
40b0799
Update Windows build workflow for GitHub Actions
si458 Jul 5, 2026
b67fcda
Rename windows-build to windows-build.yml
si458 Jul 5, 2026
331b708
use any 10.0 platform instead of fixed, also continue on fail build
si458 Jul 5, 2026
542d57b
replace afxres with winresrc and use windows-2022 to run on workflows
si458 Jul 5, 2026
21407d1
fix freebsd service install path (#364)
PTR-inc Jul 22, 2026
c4c0042
add recursive option to fs.mkdirSync() (#365)
PTR-inc Jul 22, 2026
ebff7fb
add include for pthread_np.h for freebsd (#366)
PTR-inc Jul 22, 2026
f58dea0
Add build files to .gitignore (#374)
PTR-inc Aug 5, 2026
89989ce
Add logRotate and logTruncate options for the agent log (#358)
Rambomst Aug 18, 2026
f3ecb67
Fix -exec and -b64exec script handling (#376)
PTR-inc Aug 18, 2026
f01f763
Fix noncanonical Base64 padding in WebSocket client keys (#369)
acochenour Aug 18, 2026
ac950e5
Remove unused signcheck code (#361)
karol-gro Aug 18, 2026
2a62865
Minimize memory leaks when server is unreachable (#350)
mgr-inz-rafal Aug 18, 2026
1bebea7
Add macOS build workflow for MeshAgent
si458 Aug 18, 2026
1922ee8
Update workflow triggers for Linux build
si458 Aug 18, 2026
da8aed4
Update run-name for macOS build workflow
si458 Aug 18, 2026
ca8d838
Add FreeBSD build workflow and pull request template (#384)
Rambomst Aug 19, 2026
ce8d73d
Fix FreeBSD build workflow: install git and configure `safe.directory…
Rambomst Aug 19, 2026
e0d7879
Wayland and multimonitor support (#351)
Rambomst Sep 4, 2026
365c8bc
linux_kvm.c securityfix: put /tmp/master behind SLAVELOG option (#401)
PTR-inc Sep 4, 2026
09cd98f
Fix stream mode on windows (#399)
PTR-inc Sep 4, 2026
ef4b9e6
Fix process.on(SIGNAL, ...) never firing on SPARC/MIPS (#398)
PTR-inc Sep 4, 2026
f1d86db
Name the control channel commands in the controlChannelDebug trace (#…
PTR-inc Sep 4, 2026
c6d8088
Handle root-level capture for display-manager greeters in Linux KVM (…
Rambomst Sep 4, 2026
658d2b7
Fix ppc64le link failure: WebSocket ratio functions using long double…
PTR-inc Sep 4, 2026
9216b78
Un-macro ILibMemory_Init_Size and ILibMemory_Size_Validate for LTCG (…
PTR-inc Sep 4, 2026
bc3ad91
Fix unaligned scalar access on strict-alignment CPUs (#392)
PTR-inc Sep 4, 2026
d216616
Add an optional mTLS client certificate for server connections (#389)
Finnlife Sep 4, 2026
121233e
Drop the libutil dependency in FreeBSD and OpenBSD (#387)
PTR-inc Sep 4, 2026
8939b7a
Fix agent failover getting stuck on one MeshServer entry with no prox…
cxvqo Sep 4, 2026
469d885
makefile: build the Alpine agent with musl when cross-compiling (#378)
PTR-inc Sep 4, 2026
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
58 changes: 58 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
<!--
⚠️ NO AI SLOP!!!
⚠️ If you didn't do manual QA and testing on this PR you shouldn't be PRing
-->

# Summary

In this pull request, the following changes are made:

- Foobar was changed to FooFoo, because ...

<!--Please link any GitHub issues or tasks that this pull request addresses-->

- Relates to #issue-number <!--this links the related issue-->
- Resolves #issue-number <!--this auto-closes the issue-->

<details>
<summary>Please follow this checklist to avoid unnecessary back and forth (click to expand)</summary>

- [ ] 🧠 I used LLMs/AI in this contribution and reviewed all generated content.
I understand that I am responsible for and able to explain every line of code I submit.
- [ ] 🛠️ I have self-reviewed my code and self-tested it against a MeshCentral server to ensure it works as expected.
- [ ] 🖥️ My change compiles on every platform it affects (Windows / Linux / macOS / FreeBSD), and I have considered
the impact on platforms and architectures I could not test.
- [ ] 📦 If I changed JavaScript modules under `modules/`, I re-embedded them so the compiled-in copies in
`microscript/ILibDuktape_Polyfills.c` match (the agent runs the embedded copies, not the files on disk).
- [ ] 🤖 I ran the agent self-test where appropriate (see "Self Test" in [readme.md](../readme.md)).
- [ ] 📄 Documentation updates are included (if applicable), e.g. the `.msh` options table in [readme.md](../readme.md).
- [ ] 🧰 Updates to vendored dependencies (OpenSSL, zlib, ...) are listed and explained.
- [ ] ⚠️ CI passes and is green (Windows / Linux / macOS / FreeBSD builds and CodeQL).

</details>

## Testing

<!--
Describe how you tested this change: which platforms/architectures you ran the agent on,
and the MeshCentral server version you tested against.
-->

| Platform (OS / distro / arch) | Tested | Result |
| ----------------------------- | ------ | ------ |
| e.g. Windows 11 x64 | ✅ | |
| e.g. Debian 13 x64 (Wayland) | ✅ | |

## Screenshots for Visual Changes

<!--
If this pull request changes anything with a visual outcome (remote desktop/KVM, terminal,
file transfer, installer dialogs), please include before & after screenshots.
If not, remove this section.

Please upload the image directly here by pasting it or dragging and dropping.
-->

| Event | Before | After |
| ----- | --------------------- | -------------------- |
| | ![Before](image-link) | ![After](image-link) |
6 changes: 3 additions & 3 deletions .github/workflows/codeql-analysis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@v2
uses: actions/checkout@v4

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Locate and display the workflow section around the referenced lines
FILE=".github/workflows/codeql-analysis.yml"

echo "== File exists? =="
test -f "$FILE" && echo "Found: $FILE" || (echo "Missing: $FILE" && exit 1)

echo
echo "== Lines 1-120 =="
nl -ba "$FILE" | sed -n '1,120p'

Repository: flamingo-stack/meshagent

Length of output: 213


🏁 Script executed:

#!/bin/bash
set -euo pipefail

FILE=".github/workflows/codeql-analysis.yml"

echo "== Relevant lines (1-120) with numbers =="
awk 'NR>=1 && NR<=120 {printf "%d\t%s\n", NR, $0}' "$FILE"

echo
echo "== Lines mentioning github/codeql-action =="
rg -n "github/codeql-action/" "$FILE" || true

echo
echo "== Lines mentioning actions/checkout =="
rg -n "actions/checkout@" "$FILE" || true

echo
echo "== Full file (only if <= 200 lines) =="
LINES=$(wc -l < "$FILE" 2>/dev/null || echo 999999)
if [ "$LINES" -le 200 ]; then
  awk '{printf "%d\t%s\n", NR, $0}' "$FILE"
else
  echo "Skipping full file; file has $LINES lines."
fi

Repository: flamingo-stack/meshagent

Length of output: 3846


🌐 Web query:

GitHub documentation github/codeql-action init analyze v2 deprecation v3 supported runners pin to SHA

💡 Result:

As of June 2, 2026, the GitHub CodeQL Action is currently in its v4 release cycle, which is the recommended version for all users [1]. Deprecation Status of Older Versions: - CodeQL Action v2: This version was officially retired and deprecated in early 2025 following the deprecation of GitHub Enterprise Server (GHES) 3.11 [2]. - CodeQL Action v3: This version is scheduled for official deprecation in December 2026, coinciding with the deprecation of GHES 3.19 [3][4]. Users are advised to migrate to v4 before this date to ensure continued access to new features and security updates [3][4]. Migration to v4: To upgrade your workflows, replace all references to v3 with v4 in your workflow files (e.g., init@v3 to init@v4, analyze@v3 to analyze@v4) [4]. Note that on older GHES versions, you may need to ensure your administrator has enabled GitHub Connect to download the necessary action versions [4]. Best Practices for Pinning: While using version tags like v4 is common for flexibility, it is not cryptographically immutable, as tags can be moved or deleted [5][6]. For maximum security, GitHub and security experts strongly recommend pinning GitHub Actions to a full-length commit SHA [5][7]. This prevents unauthorized code changes from being automatically pulled into your pipeline if an action repository is compromised [8][6]. Recommended Pinning Strategy: To maintain both security and maintainability, use the following pattern in your workflow files [6]: - uses: github/codeql-action/init@ # v4 By including the tag version in a comment, you maintain readability and compatibility with automated update tools like Dependabot, while the SHA ensures immutability [6]. You can audit your current workflow files for unpinned actions using grep or specialized security tooling [6].

Citations:


Pin CodeQL GitHub Actions to commit SHAs (v2 is deprecated).

The workflow uses github/codeql-action/init@v2 (line 29) and github/codeql-action/analyze@v2 (line 52); CodeQL action v2 is deprecated/retired, so the scan may fail or stop receiving fixes. Also, actions/checkout@v4 (line 16) is tag-based and not pinned—pin these uses: entries to full commit SHAs for immutability.

Also applies to: 29-29, 52-52

🧰 Tools
🪛 zizmor (1.25.2)

[error] 16-16: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/codeql-analysis.yml at line 16, The workflow currently
references tag-based and deprecated actions (uses: actions/checkout@v4,
github/codeql-action/init@v2, github/codeql-action/analyze@v2); update each of
those uses: entries to pin to full commit SHAs instead of tags and replace the
deprecated CodeQL v2 references with the maintained CodeQL action commit SHAs.
Specifically, locate the uses: lines for actions/checkout,
github/codeql-action/init, and github/codeql-action/analyze and change their
version specifiers to full commit SHAs (the exact commit SHAs for the current
stable/main commits of those repos).

with:
# We must fetch at least the immediate parents so that if this is
# a pull request then we can checkout the head.
Expand All @@ -26,7 +26,7 @@ jobs:

# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
uses: github/codeql-action/init@v2
# Override language selection by uncommenting this and choosing your languages
with:
languages: javascript, cpp
Expand All @@ -49,4 +49,4 @@ jobs:
# make release

- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1
uses: github/codeql-action/analyze@v2
33 changes: 33 additions & 0 deletions .github/workflows/freebsd-build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
name: FreeBSD Build
run-name: Build FreeBSD versions of MeshAgent
on:
push:
pull_request:
jobs:
freebsd-build-x86-64:
name: FreeBSD x86_64 (ARCHID=30)
# GitHub has no FreeBSD runners, so the build runs inside a FreeBSD VM on a Linux runner.
# Binaries built on an older FreeBSD release run on all newer ones, but not vice versa,
# so build on the oldest release CI can still support: 13.5 covers 13.x (TrueNAS CORE,
# older OPNsense/pfSense) through 15.x. FreeBSD 13 is EOL — if its pkg repo or VM image
# disappears and the "prepare" step starts failing, bump the release to 14.4.
runs-on: ubuntu-latest
steps:
- name: Check out repository code
uses: actions/checkout@v7.0.0
- name: Build meshagent (x86_64) in FreeBSD VM
uses: vmactions/freebsd-vm@v1
with:
release: "13.5"
# The makefile generates ILibDuktape_Commit.h only when git works — without git the
# build fails on a missing header. safe.directory is needed because the rsynced
# repo is owned by the runner uid, not the VM user, so git refuses it otherwise.
prepare: |
pkg install -y gmake git
git config --global --add safe.directory '*'
run: gmake -j4 freebsd ARCHID=30
- name: Upload artifacts
uses: actions/upload-artifact@v7.0.1
with:
name: meshagent-freebsd-x86_64
path: ${{ github.workspace }}/meshagent_*
51 changes: 51 additions & 0 deletions .github/workflows/linux-build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
name: Linux Build
run-name: Build Linux versions of MeshAgent
on:
push:
pull_request:
jobs:
linux-build-x86:
runs-on: ubuntu-24.04
steps:
- name: Check out repository code
uses: actions/checkout@v7.0.0
- name: Install Packages
run: |
sudo dpkg --add-architecture i386 &&
sudo apt clean all && sudo apt update &&
sudo apt-get install -y libx11-dev libxtst-dev libxext-dev libjpeg62-dev build-essential &&
sudo apt-get install -y linux-libc-dev:i386 libc6-dev-i386 libjpeg62-dev:i386 &&
sudo apt-get install -y libc6-armel-cross libc6-dev-armel-cross binutils-arm-linux-gnueabi libncurses5-dev gcc-arm-linux-gnueabihf &&
sudo apt-get install -y libxrandr-dev libwayland-dev libdrm-dev libegl-dev libgles-dev
- name: Build 32 Bit Linux
run: make -j4 linux ARCHID=5 && make clean
- name: Build 64 Bit Linux
run: make -j4 linux ARCHID=6 && make clean
- name: Build 32 Bit NOKVM Linux
run: make -j4 linux ARCHID=19 && make clean
- name: Build 64 Bit NOKVM Linux
run: make -j4 linux ARCHID=20 && make clean
- name: Build 64 Bit Alpine Linux
run: make -j4 linux ARCHID=33 && make clean
- name: Upload Artifacts
uses: actions/upload-artifact@v7.0.1
with:
name: meshagent-binaries-x86
path: ${{ github.workspace }}/meshagent_*

linux-build-arm:
runs-on: ubuntu-24.04-arm
steps:
- name: Check out repository code
uses: actions/checkout@v7.0.0
- name: Install Packages
run: |
sudo apt clean all && sudo apt update &&
sudo apt-get install -y libx11-dev libxtst-dev libxext-dev libjpeg-dev libxrandr-dev libwayland-dev libdrm-dev libegl-dev libgles-dev build-essential
- name: Build ARM64 Linux
run: make -j4 linux ARCHID=26 && make clean
- name: Upload Artifacts
uses: actions/upload-artifact@v7.0.1
with:
name: meshagent-binaries-arm
path: ${{ github.workspace }}/meshagent_*
33 changes: 33 additions & 0 deletions .github/workflows/mac-build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
name: macOS Build
run-name: Build MacOS versions of MeshAgent
on:
push:
pull_request:
jobs:
macos-build-arm64:
name: macOS arm64 (ARCHID=29)
runs-on: macos-15
steps:
- name: Check out repository code
uses: actions/checkout@v7.0.0
- name: Build meshagent (arm64, KVM enabled)
run: make -j4 macos ARCHID=29
- name: Upload artifacts
uses: actions/upload-artifact@v7.0.1
with:
name: meshagent-macos-arm64
path: ${{ github.workspace }}/meshagent_*

macos-build-x86_64:
name: macOS x86_64 (ARCHID=16)
runs-on: macos-15-intel
steps:
- name: Check out repository code
uses: actions/checkout@v7.0.0
- name: Build meshagent (x86_64, KVM enabled)
run: make -j4 macos ARCHID=16
- name: Upload artifacts
uses: actions/upload-artifact@v7.0.1
with:
name: meshagent-macos-x86_64
path: ${{ github.workspace }}/meshagent_*
27 changes: 27 additions & 0 deletions .github/workflows/windows-build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
name: Windows Build

run-name: Build Windows versions of MeshAgent

on:
push:
pull_request:

jobs:
windows-build:
runs-on: ${{ matrix.platform == 'ARM64' && 'windows-11-arm' || 'windows-2022' }}
strategy:
fail-fast: false
matrix:
platform: [x64, x86, ARM64]
steps:
- uses: actions/checkout@v7
- name: Setup Visual Studio
uses: microsoft/setup-msbuild@v3
- name: Build ${{ matrix.platform }}
run: msbuild MeshAgent-2022.sln /p:Configuration=Release /p:Platform=${{ matrix.platform }}
- name: Upload ${{ matrix.platform }} artifacts
uses: actions/upload-artifact@v7
with:
name: meshagent-windows-${{ matrix.platform }}
path: Release/*.exe

13 changes: 12 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,17 @@ ASALocalRun/
# Klocwork
.klocwork/

# Generated module export workspace
modules_expanded/

*.o
ToolChains/
.DS_Store
.DS_Store

# Build files
# Regenerated every build
microscript/ILibDuktape_Commit.h

# compiled builds: meshagent_<arch>, DEBUG_meshagent_<arch>
/meshagent_*
/DEBUG_meshagent_*
48 changes: 48 additions & 0 deletions com.meshagent.kvm.plist
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.meshagent.kvm</string>

<!--
Launchd loads this LaunchAgent into gui/<console-uid> (and
LoginWindow), so the kvm process runs natively in the user's
GUI audit session. com.apple.replayd is reachable from this
session, which is what makes ScreenCaptureKit / ReplayKit
screen-capture work on macOS Tahoe without the
audit_session_join workaround the daemon-spawn path needs.
-->
<key>LimitLoadToSessionType</key>
<array>
<string>Aqua</string>
<string>LoginWindow</string>
</array>

<key>ProgramArguments</key>
<array>
<string>/usr/local/mesh_services/meshagent/meshagent/meshagent</string>
<string>-kvmagent</string>
</array>

<!--
Always restart unless we exited cleanly. ThrottleInterval keeps
us from hammering on a persistent failure (e.g., replayd genuinely
unreachable).
-->
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<dict>
<key>SuccessfulExit</key>
<false/>
</dict>
<key>ThrottleInterval</key>
<integer>30</integer>

<key>StandardOutPath</key>
<string>/tmp/meshagent-kvm.stdout.log</string>
<key>StandardErrorPath</key>
<string>/tmp/meshagent-kvm.stderr.log</string>
</dict>
</plist>
Loading