Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
dcf94b8
Update to Node.js 22 and Node-RED 4.1.5
claude Feb 17, 2026
28044ed
Add artifact uploads and manual trigger to CI workflow
claude Feb 17, 2026
203ac94
Merge pull request #1 from ReEnvisionAi/claude/update-node-versions-7…
ReEnvisionAi Feb 17, 2026
f334dc9
Rebrand to Offline - AgentOS with new geometric sphere icon
claude Feb 17, 2026
dfbd67f
Merge pull request #2 from ReEnvisionAi/claude/update-node-versions-7…
ReEnvisionAi Feb 17, 2026
690201e
Replace all Node-RED logos with AgentOS geometric sphere icon
claude Feb 17, 2026
5d5e438
Enable asar packaging to fix Windows install timeout
claude Feb 17, 2026
a49126e
Merge pull request #3 from ReEnvisionAi/claude/update-node-versions-7…
ReEnvisionAi Feb 17, 2026
ba054ae
Add files via upload
ReEnvisionAi Feb 17, 2026
60e1c62
Replace black tray icon with ReEnvision AgentOS logo
claude Feb 17, 2026
8fc8944
Add files via upload
ReEnvisionAi Feb 17, 2026
3ae55f8
Update all logos to official ReEnvision AgentOS branding
claude Feb 17, 2026
cfd8714
Merge pull request #4 from ReEnvisionAi/claude/update-node-versions-7…
ReEnvisionAi Feb 18, 2026
f425cd6
fix: resize build icon to 1024x1024 for macOS build
claude Feb 18, 2026
769dcd4
Add files via upload
ReEnvisionAi Feb 18, 2026
3d671f6
fix: use LogoMacOS.png as build icon resized to 1024x1024
claude Feb 18, 2026
b5b24b6
feat: integrate Agent Grid download/install for macOS
claude Feb 18, 2026
a0aaccc
Revert "feat: integrate Agent Grid download/install for macOS"
claude Feb 18, 2026
323e911
feat: add WebOS Edge Node with headless browser services
claude Mar 1, 2026
83cd79b
rebrand: rename "Offline - AgentOS" to "AgentOS" and stop auto-openin…
claude Mar 1, 2026
9a85f63
Fix Windows "spawn EINVAL" by resolving node path before overriding p…
claude Mar 1, 2026
cafde6f
Fix Windows "spawn EINVAL" by adding shell:true to .cmd execFile calls
claude Mar 1, 2026
2dc6fb5
Fix Sandpack iframe white screens and WebGL context lost crashes
claude Mar 1, 2026
4625882
Add iframe reverse proxy endpoint (GET /os/proxy)
claude Mar 1, 2026
bed6ecd
Merge default flow nodes into existing flows.json on startup
claude Mar 1, 2026
972eade
Inject <base> tag into proxied HTML to fix relative asset paths
claude Mar 2, 2026
fd95b97
Add stateful Remote Browser Control API (POST /os/browser/action)
claude Mar 2, 2026
33cf5be
Add neomorphic dark theme with AgentOS branding
claude Mar 3, 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
22 changes: 20 additions & 2 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -1,16 +1,34 @@
name: Build
on:
push:
branches: [ master ]
workflow_dispatch:
jobs:
build:
strategy:
matrix:
os: [ windows-latest, macos-latest, ubuntu-latest ]
include:
- os: windows-latest
artifact-name: windows-installer
artifact-path: dist/*.msi
- os: macos-latest
artifact-name: macos-installer
artifact-path: dist/*.dmg
- os: ubuntu-latest
artifact-name: linux-installer
artifact-path: dist/*.deb
runs-on: ${{matrix.os}}
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- run: npm install
- run: npm run build
env:
GH_TOKEN: ${{secrets.GITHUB_TOKEN}}
USE_HARD_LINKS: false
- uses: actions/upload-artifact@v4
with:
name: ${{matrix.artifact-name}}
path: ${{matrix.artifact-path}}
Binary file added LogoMacOS.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ReEnvision AgentOS.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
106 changes: 106 additions & 0 deletions browser-manager.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
/**
* Browser Lifecycle Manager for WebOS Edge Node
*
* Manages a single warm Chromium instance that persists across requests.
* Function nodes access the browser via Node-RED's global context using
* global.get('getBrowser'), which returns a Promise<Browser>.
*
* Puppeteer is resolved from the Node-RED userDir (installed on first run).
*/

var path = require('path');

var browser = null;
var launching = false;
var pendingCallbacks = [];

function createBrowserManager(userDir) {

async function getBrowser() {
// Return existing connected browser
if (browser && browser.isConnected()) {
return browser;
}

// If already launching, queue this caller
if (launching) {
return new Promise(function (resolve, reject) {
pendingCallbacks.push({ resolve: resolve, reject: reject });
});
}

launching = true;

try {
// Resolve puppeteer from the Node-RED user directory
var puppeteerPath = path.join(userDir, 'node_modules', 'puppeteer');
var puppeteer = require(puppeteerPath);

browser = await puppeteer.launch({
headless: 'new',
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-dev-shm-usage',
// Fix for Sandpack cross-origin iframe network timeouts
'--disable-features=IsolateOrigins,site-per-process',
'--disable-web-security',
'--disable-site-isolation-trials',
// Fix for WebGL / Three.js "Context Lost" crashes
'--use-gl=swiftshader',
'--ignore-gpu-blocklist',
'--disable-gpu'
],
defaultViewport: { width: 1280, height: 800 }
});

browser.on('disconnected', function () {
console.log('Chromium browser disconnected');
browser = null;
});

// Resolve any callers that were waiting
pendingCallbacks.forEach(function (cb) { cb.resolve(browser); });
pendingCallbacks = [];

console.log('Chromium browser launched successfully');
return browser;
} catch (err) {
// Reject any callers that were waiting
pendingCallbacks.forEach(function (cb) { cb.reject(err); });
pendingCallbacks = [];
throw err;
} finally {
launching = false;
}
}

async function closeBrowser() {
if (browser) {
try {
await browser.close();
console.log('Chromium browser closed');
} catch (e) {
console.error('Error closing Chromium:', e.message);
}
browser = null;
}
}

function isReady() {
try {
require.resolve(path.join(userDir, 'node_modules', 'puppeteer'));
return true;
} catch (e) {
return false;
}
}

return {
getBrowser: getBrowser,
closeBrowser: closeBrowser,
isReady: isReady
};
}

module.exports = createBrowserManager;
Binary file modified build/icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified build/iconTemplate@4x.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading