Commit dc1a4f86 authored by Lisa's avatar Lisa

license: switch node agent bundle sources to GPLv3 headers

parent b8c862e4
<!-- Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net> -->
<!-- SPDX-License-Identifier: GPL-3.0-or-later -->
<!-- Copyleft: GNU GPLv3 or later applies to this file. -->
# Hermes Node Protocol # Hermes Node Protocol
# Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net> # Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net>
# All rights reserved. # All rights reserved.
......
<!-- Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net> -->
<!-- SPDX-License-Identifier: GPL-3.0-or-later -->
<!-- Copyleft: GNU GPLv3 or later applies to this file. -->
# Deploying the Windows Installer # Deploying the Windows Installer
## Quick Deploy ## Quick Deploy
......
<!-- Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net> -->
<!-- SPDX-License-Identifier: GPL-3.0-or-later -->
<!-- Copyleft: GNU GPLv3 or later applies to this file. -->
# Hermes Node Protocol # Hermes Node Protocol
# Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net> # Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net>
# All rights reserved. # All rights reserved.
......
<!-- Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net> -->
<!-- SPDX-License-Identifier: GPL-3.0-or-later -->
<!-- Copyleft: GNU GPLv3 or later applies to this file. -->
# Hermes Node Protocol # Hermes Node Protocol
# Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net> # Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net>
# All rights reserved. # All rights reserved.
......
MIT License GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (c) 2026 Lisa (Hermes AI) / OpenClaw Project Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Permission is hereby granted, free of charge, to any person obtaining a copy Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all This project is licensed under the GNU General Public License version 3
copies or substantial portions of the Software. or (at your option) any later version.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR You should have received a copy of the GNU General Public License along
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, with this program. If not, see <https://www.gnu.org/licenses/>.
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
<!-- Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net> -->
<!-- SPDX-License-Identifier: GPL-3.0-or-later -->
<!-- Copyleft: GNU GPLv3 or later applies to this file. -->
# Hermes Node Protocol # Hermes Node Protocol
# Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net> # Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net>
# All rights reserved. # All rights reserved.
...@@ -204,7 +207,50 @@ All messages are JSON over WebSocket. ...@@ -204,7 +207,50 @@ All messages are JSON over WebSocket.
### Capability Registration ### Capability Registration
Node registers `browser_control` in capabilities during registration: ## Camera Control
**Optional capability** — phase-1 Linux support uses `ffmpeg` + V4L2 (`/dev/video*`). The node only advertises `camera_control` in its `tools` list when `enable_camera_control` is true *and* a usable camera backend/device is present at runtime.
### Actions
- `list_cameras` — enumerate detected camera devices and probe metadata
- `get_camera_status` — current camera backend readiness and discovered devices
- `capture_frame` — grab a single still frame from a selected/default device
- `capture_video` — record a short video clip from a selected/default device
### Gateway → Node: Camera Control
```json
{
"type": "camera_control",
"id": "camera-a1b2c3d4",
"action": "capture_frame",
"params": {
"device": "/dev/video0",
"format": "png",
"width": 1280,
"height": 720
}
}
```
### Node → Gateway: Camera Control Result
```json
{
"type": "camera_control_result",
"id": "camera-a1b2c3d4",
"action": "capture_frame",
"success": true,
"device": "/dev/video0",
"format": "png",
"path": "/tmp/hermes-camera-1714392000.png",
"size_bytes": 123456,
"data_base64": "..."
}
```
Node registers optional tools in its `tools` list during registration and exposes structured readiness metadata under `capabilities`. Existing siblings include `browser_control`, `computer_control`, `desktop_observe`, `audio_control`, and `camera_control`.
```json ```json
{ {
...@@ -230,7 +276,8 @@ Node registers `browser_control` in capabilities during registration: ...@@ -230,7 +276,8 @@ Node registers `browser_control` in capabilities during registration:
"token": "node-sissy-secret-token-abc123", "token": "node-sissy-secret-token-abc123",
"sexec_path": "/home/openclaw/.openclaw/skills/sexec/sexec.sh", "sexec_path": "/home/openclaw/.openclaw/skills/sexec/sexec.sh",
"reconnect_interval": 5, "reconnect_interval": 5,
"heartbeat_interval": 30 "heartbeat_interval": 30,
"enable_camera_control": false
} }
``` ```
......
<!-- Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net> -->
<!-- SPDX-License-Identifier: GPL-3.0-or-later -->
<!-- Copyleft: GNU GPLv3 or later applies to this file. -->
# Hermes Node Agent # Hermes Node Agent
**Version:** 2.0 **Version:** 2.0
......
<!-- Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net> -->
<!-- SPDX-License-Identifier: GPL-3.0-or-later -->
<!-- Copyleft: GNU GPLv3 or later applies to this file. -->
# Windows Installer — Complete Setup Summary # Windows Installer — Complete Setup Summary
## What Was Built ## What Was Built
......
<!-- Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net> -->
<!-- SPDX-License-Identifier: GPL-3.0-or-later -->
<!-- Copyleft: GNU GPLv3 or later applies to this file. -->
# Hermes Node Protocol # Hermes Node Protocol
# Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net> # Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net>
# All rights reserved. # All rights reserved.
......
#!/usr/bin/env python3 #!/usr/bin/env python3
# Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyleft: this program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# Hermes Node Protocol # Hermes Node Protocol
# Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net> # Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net>
# All rights reserved. # All rights reserved.
......
#!/usr/bin/env python3 #!/usr/bin/env python3
# Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyleft: this program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# Hermes Node Protocol # Hermes Node Protocol
# Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net> # Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net>
# All rights reserved. # All rights reserved.
......
#!/bin/bash #!/bin/bash
# Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyleft: this program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# Hermes Node Protocol # Hermes Node Protocol
# Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net> # Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net>
# All rights reserved. # All rights reserved.
...@@ -40,6 +46,24 @@ tar czf hermes-node-agent-linux.tar.gz hermes-node-agent/ ...@@ -40,6 +46,24 @@ tar czf hermes-node-agent-linux.tar.gz hermes-node-agent/
mv hermes-node-agent-linux.tar.gz "$OLDPWD/dist/" mv hermes-node-agent-linux.tar.gz "$OLDPWD/dist/"
cd "$OLDPWD" cd "$OLDPWD"
# Re-embed the packaged payload into the self-contained Linux installer wrapper
python3 <<'PY'
import base64, pathlib, re
src = pathlib.Path('dist/hermes-node-agent-linux.tar.gz').read_bytes()
b64 = base64.b64encode(src).decode('ascii')
installer_path = pathlib.Path('package-hermes-node-agent/deploy/install-node.sh')
text = installer_path.read_text()
pattern = r"(cat <<'TARBALL_DATA' \| base64 -d \| tar xzf -\n)(.*?)(\nTARBALL_DATA)"
new_text, count = re.subn(pattern, lambda m: m.group(1) + b64 + m.group(3), text, flags=re.S)
if count != 1:
raise SystemExit(f'Expected exactly one TARBALL_DATA block in {installer_path}, found {count}')
pathlib.Path('deploy/linux/install-node.sh').write_text(new_text)
print('✅ Re-embedded packaged payload into deploy/linux/install-node.sh')
PY
# Keep the root installer copy in sync with the packaged source of truth
cp package-hermes-node-agent/install.sh install.sh
# Cleanup # Cleanup
rm -rf "$BUILD_DIR" rm -rf "$BUILD_DIR"
......
#!/bin/bash #!/bin/bash
# Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyleft: this program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# Hermes Node Protocol # Hermes Node Protocol
# Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net> # Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net>
# All rights reserved. # All rights reserved.
......
#!/bin/bash #!/bin/bash
# Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyleft: this program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# Hermes Node Protocol # Hermes Node Protocol
# Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net> # Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net>
# All rights reserved. # All rights reserved.
......
<!-- Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net> -->
<!-- SPDX-License-Identifier: GPL-3.0-or-later -->
<!-- Copyleft: GNU GPLv3 or later applies to this file. -->
# Hermes Browser Agent Chrome Extension # Hermes Browser Agent Chrome Extension
This extension enables browser automation through the Hermes Node Agent. This extension enables browser automation through the Hermes Node Agent.
......
// Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyleft: this program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// Hermes Browser Agent — native messaging host bridge // Hermes Browser Agent — native messaging host bridge
const NATIVE_HOST = 'hermes.node.agent'; const NATIVE_HOST = 'hermes.node.agent';
const WS_RETRY = 3000; const WS_RETRY = 3000;
......
// Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyleft: this program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// Hermes Browser Agent Content Script — no-op placeholder // Hermes Browser Agent Content Script — no-op placeholder
// Main functionality lives in background.js routing to native host // Main functionality lives in background.js routing to native host
// This file ensures content context is available when needed // This file ensures content context is available when needed
......
// Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyleft: this program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
const statusEl = document.getElementById('status'); const statusEl = document.getElementById('status');
setTimeout(() => { setTimeout(() => {
chrome.runtime.sendMessage({type:'ping'}, resp => { chrome.runtime.sendMessage({type:'ping'}, resp => {
......
<!-- Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net> -->
<!-- SPDX-License-Identifier: GPL-3.0-or-later -->
<!-- Copyleft: GNU GPLv3 or later applies to this file. -->
# Deployment Scripts for Hermes Node Agent # Deployment Scripts for Hermes Node Agent
These scripts build installers for deploying Hermes Node Agent on target machines. These scripts build installers for deploying Hermes Node Agent on target machines.
......
This diff is collapsed.
#!/bin/bash #!/bin/bash
# Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyleft: this program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# Complete Windows installer build: PyInstaller + NSIS # Complete Windows installer build: PyInstaller + NSIS
# Works on Linux using Wine Windows Python environment # Works on Linux using Wine Windows Python environment
# #
......
#!/bin/bash #!/bin/bash
# Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyleft: this program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# Build Windows offline installer for Hermes Node Agent # Build Windows offline installer for Hermes Node Agent
# Requires: makensis (NSIS compiler), wget/curl, python3 + pip # Requires: makensis (NSIS compiler), wget/curl, python3 + pip
......
# Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyleft: this program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# Hermes Node Protocol # Hermes Node Protocol
# Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net> # Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net>
# All rights reserved. # All rights reserved.
......
This diff is collapsed.
# Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyleft: this program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# Hermes Node Protocol # Hermes Node Protocol
# Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net> # Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net>
# All rights reserved. # All rights reserved.
......
#!/bin/bash #!/bin/bash
# Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyleft: this program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# Hermes Node Protocol # Hermes Node Protocol
# Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net> # Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net>
# All rights reserved. # All rights reserved.
...@@ -155,6 +161,14 @@ p = Path(r'''$CONFIG_DIR/config.json''') ...@@ -155,6 +161,14 @@ p = Path(r'''$CONFIG_DIR/config.json''')
data = json.loads(p.read_text()) data = json.loads(p.read_text())
print(str(bool(data.get('enable_audio_control', False))).lower()) print(str(bool(data.get('enable_audio_control', False))).lower())
PY PY
)
EXISTING_ENABLE_CAMERA_CONTROL=$(python3 - <<PY
import json
from pathlib import Path
p = Path(r'''$CONFIG_DIR/config.json''')
data = json.loads(p.read_text())
print(str(bool(data.get('enable_camera_control', False))).lower())
PY
) )
echo " Existing config found: $CONFIG_DIR/config.json" echo " Existing config found: $CONFIG_DIR/config.json"
fi fi
...@@ -204,6 +218,15 @@ case "$ENABLE_AUDIO_INPUT" in ...@@ -204,6 +218,15 @@ case "$ENABLE_AUDIO_INPUT" in
*) ENABLE_AUDIO_CONTROL=false ;; *) ENABLE_AUDIO_CONTROL=false ;;
esac esac
DEFAULT_CAMERA_CHOICE="n"
[ "$EXISTING_ENABLE_CAMERA_CONTROL" = "true" ] && DEFAULT_CAMERA_CHOICE="y"
read -r -p "Enable camera_control? (y/N) [$DEFAULT_CAMERA_CHOICE]: " ENABLE_CAMERA_INPUT
ENABLE_CAMERA_INPUT=${ENABLE_CAMERA_INPUT:-$DEFAULT_CAMERA_CHOICE}
case "$ENABLE_CAMERA_INPUT" in
y|Y|yes|YES) ENABLE_CAMERA_CONTROL=true ;;
*) ENABLE_CAMERA_CONTROL=false ;;
esac
CAPABILITIES='["exec"]' CAPABILITIES='["exec"]'
if [ "$ENABLE_BROWSER" = true ]; then if [ "$ENABLE_BROWSER" = true ]; then
CAPABILITIES=$(python3 - <<'PY' "$CAPABILITIES" CAPABILITIES=$(python3 - <<'PY' "$CAPABILITIES"
...@@ -245,6 +268,16 @@ print(json.dumps(caps)) ...@@ -245,6 +268,16 @@ print(json.dumps(caps))
PY PY
) )
fi fi
if [ "$ENABLE_CAMERA_CONTROL" = true ]; then
CAPABILITIES=$(python3 - <<'PY' "$CAPABILITIES"
import json, sys
caps = json.loads(sys.argv[1])
if 'camera_control' not in caps:
caps.append('camera_control')
print(json.dumps(caps))
PY
)
fi
cat > "$CONFIG_DIR/config.json" << EOF cat > "$CONFIG_DIR/config.json" << EOF
{ {
...@@ -258,6 +291,7 @@ cat > "$CONFIG_DIR/config.json" << EOF ...@@ -258,6 +291,7 @@ cat > "$CONFIG_DIR/config.json" << EOF
"enable_computer_control": $ENABLE_COMPUTER_CONTROL, "enable_computer_control": $ENABLE_COMPUTER_CONTROL,
"enable_desktop_observe": $ENABLE_DESKTOP_OBSERVE, "enable_desktop_observe": $ENABLE_DESKTOP_OBSERVE,
"enable_audio_control": $ENABLE_AUDIO_CONTROL, "enable_audio_control": $ENABLE_AUDIO_CONTROL,
"enable_camera_control": $ENABLE_CAMERA_CONTROL,
"permissions": { "permissions": {
"deny": ["sudo", "su", "doas", "dd if=", "mkfs", "fdisk", "wipe"], "deny": ["sudo", "su", "doas", "dd if=", "mkfs", "fdisk", "wipe"],
"ask": ["rm -rf", "dd if=", "> /dev/", "chmod", "chown", "mv /", ":/usr/", ":/etc/", ":/bin/", ":/sbin/"], "ask": ["rm -rf", "dd if=", "> /dev/", "chmod", "chown", "mv /", ":/usr/", ":/etc/", ":/bin/", ":/sbin/"],
......
<!-- Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net> -->
<!-- SPDX-License-Identifier: GPL-3.0-or-later -->
<!-- Copyleft: GNU GPLv3 or later applies to this file. -->
# Hermes Node Protocol # Hermes Node Protocol
# Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net> # Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net>
# All rights reserved. # All rights reserved.
......
<!-- Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net> -->
<!-- SPDX-License-Identifier: GPL-3.0-or-later -->
<!-- Copyleft: GNU GPLv3 or later applies to this file. -->
# Hermes Node Protocol # Hermes Node Protocol
# Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net> # Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net>
# All rights reserved. # All rights reserved.
......
<!-- Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net> -->
<!-- SPDX-License-Identifier: GPL-3.0-or-later -->
<!-- Copyleft: GNU GPLv3 or later applies to this file. -->
# Hermes Node Protocol # Hermes Node Protocol
# Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net> # Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net>
# All rights reserved. # All rights reserved.
...@@ -204,7 +207,50 @@ All messages are JSON over WebSocket. ...@@ -204,7 +207,50 @@ All messages are JSON over WebSocket.
### Capability Registration ### Capability Registration
Node registers `browser_control` in capabilities during registration: ## Camera Control
**Optional capability** — phase-1 Linux support uses `ffmpeg` + V4L2 (`/dev/video*`). The node only advertises `camera_control` in its `tools` list when `enable_camera_control` is true *and* a usable camera backend/device is present at runtime.
### Actions
- `list_cameras` — enumerate detected camera devices and probe metadata
- `get_camera_status` — current camera backend readiness and discovered devices
- `capture_frame` — grab a single still frame from a selected/default device
- `capture_video` — record a short video clip from a selected/default device
### Gateway → Node: Camera Control
```json
{
"type": "camera_control",
"id": "camera-a1b2c3d4",
"action": "capture_frame",
"params": {
"device": "/dev/video0",
"format": "png",
"width": 1280,
"height": 720
}
}
```
### Node → Gateway: Camera Control Result
```json
{
"type": "camera_control_result",
"id": "camera-a1b2c3d4",
"action": "capture_frame",
"success": true,
"device": "/dev/video0",
"format": "png",
"path": "/tmp/hermes-camera-1714392000.png",
"size_bytes": 123456,
"data_base64": "..."
}
```
Node registers optional tools in its `tools` list during registration and exposes structured readiness metadata under `capabilities`. Existing siblings include `browser_control`, `computer_control`, `desktop_observe`, `audio_control`, and `camera_control`.
```json ```json
{ {
...@@ -230,7 +276,8 @@ Node registers `browser_control` in capabilities during registration: ...@@ -230,7 +276,8 @@ Node registers `browser_control` in capabilities during registration:
"token": "node-sissy-secret-token-abc123", "token": "node-sissy-secret-token-abc123",
"sexec_path": "/home/openclaw/.openclaw/skills/sexec/sexec.sh", "sexec_path": "/home/openclaw/.openclaw/skills/sexec/sexec.sh",
"reconnect_interval": 5, "reconnect_interval": 5,
"heartbeat_interval": 30 "heartbeat_interval": 30,
"enable_camera_control": false
} }
``` ```
......
<!-- Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net> -->
<!-- SPDX-License-Identifier: GPL-3.0-or-later -->
<!-- Copyleft: GNU GPLv3 or later applies to this file. -->
# Hermes Node Agent # Hermes Node Agent
**Version:** 2.0 **Version:** 2.0
......
<!-- Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net> -->
<!-- SPDX-License-Identifier: GPL-3.0-or-later -->
<!-- Copyleft: GNU GPLv3 or later applies to this file. -->
# Hermes Node Protocol # Hermes Node Protocol
# Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net> # Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net>
# All rights reserved. # All rights reserved.
......
#!/usr/bin/env python3 #!/usr/bin/env python3
# Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyleft: this program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# Hermes Node Protocol # Hermes Node Protocol
# Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net> # Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net>
# All rights reserved. # All rights reserved.
......
# Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyleft: this program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# Hermes Node Protocol # Hermes Node Protocol
# Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net> # Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net>
# All rights reserved. # All rights reserved.
......
# Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyleft: this program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# Hermes Node Protocol # Hermes Node Protocol
# Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net> # Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net>
# All rights reserved. # All rights reserved.
......
#!/bin/bash #!/bin/bash
# Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyleft: this program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# Hermes Node Protocol # Hermes Node Protocol
# Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net> # Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net>
# All rights reserved. # All rights reserved.
...@@ -155,6 +161,14 @@ p = Path(r'''$CONFIG_DIR/config.json''') ...@@ -155,6 +161,14 @@ p = Path(r'''$CONFIG_DIR/config.json''')
data = json.loads(p.read_text()) data = json.loads(p.read_text())
print(str(bool(data.get('enable_audio_control', False))).lower()) print(str(bool(data.get('enable_audio_control', False))).lower())
PY PY
)
EXISTING_ENABLE_CAMERA_CONTROL=$(python3 - <<PY
import json
from pathlib import Path
p = Path(r'''$CONFIG_DIR/config.json''')
data = json.loads(p.read_text())
print(str(bool(data.get('enable_camera_control', False))).lower())
PY
) )
echo " Existing config found: $CONFIG_DIR/config.json" echo " Existing config found: $CONFIG_DIR/config.json"
fi fi
...@@ -204,6 +218,15 @@ case "$ENABLE_AUDIO_INPUT" in ...@@ -204,6 +218,15 @@ case "$ENABLE_AUDIO_INPUT" in
*) ENABLE_AUDIO_CONTROL=false ;; *) ENABLE_AUDIO_CONTROL=false ;;
esac esac
DEFAULT_CAMERA_CHOICE="n"
[ "$EXISTING_ENABLE_CAMERA_CONTROL" = "true" ] && DEFAULT_CAMERA_CHOICE="y"
read -r -p "Enable camera_control? (y/N) [$DEFAULT_CAMERA_CHOICE]: " ENABLE_CAMERA_INPUT
ENABLE_CAMERA_INPUT=${ENABLE_CAMERA_INPUT:-$DEFAULT_CAMERA_CHOICE}
case "$ENABLE_CAMERA_INPUT" in
y|Y|yes|YES) ENABLE_CAMERA_CONTROL=true ;;
*) ENABLE_CAMERA_CONTROL=false ;;
esac
CAPABILITIES='["exec"]' CAPABILITIES='["exec"]'
if [ "$ENABLE_BROWSER" = true ]; then if [ "$ENABLE_BROWSER" = true ]; then
CAPABILITIES=$(python3 - <<'PY' "$CAPABILITIES" CAPABILITIES=$(python3 - <<'PY' "$CAPABILITIES"
...@@ -245,6 +268,16 @@ print(json.dumps(caps)) ...@@ -245,6 +268,16 @@ print(json.dumps(caps))
PY PY
) )
fi fi
if [ "$ENABLE_CAMERA_CONTROL" = true ]; then
CAPABILITIES=$(python3 - <<'PY' "$CAPABILITIES"
import json, sys
caps = json.loads(sys.argv[1])
if 'camera_control' not in caps:
caps.append('camera_control')
print(json.dumps(caps))
PY
)
fi
cat > "$CONFIG_DIR/config.json" << EOF cat > "$CONFIG_DIR/config.json" << EOF
{ {
...@@ -258,6 +291,7 @@ cat > "$CONFIG_DIR/config.json" << EOF ...@@ -258,6 +291,7 @@ cat > "$CONFIG_DIR/config.json" << EOF
"enable_computer_control": $ENABLE_COMPUTER_CONTROL, "enable_computer_control": $ENABLE_COMPUTER_CONTROL,
"enable_desktop_observe": $ENABLE_DESKTOP_OBSERVE, "enable_desktop_observe": $ENABLE_DESKTOP_OBSERVE,
"enable_audio_control": $ENABLE_AUDIO_CONTROL, "enable_audio_control": $ENABLE_AUDIO_CONTROL,
"enable_camera_control": $ENABLE_CAMERA_CONTROL,
"permissions": { "permissions": {
"deny": ["sudo", "su", "doas", "dd if=", "mkfs", "fdisk", "wipe"], "deny": ["sudo", "su", "doas", "dd if=", "mkfs", "fdisk", "wipe"],
"ask": ["rm -rf", "dd if=", "> /dev/", "chmod", "chown", "mv /", ":/usr/", ":/etc/", ":/bin/", ":/sbin/"], "ask": ["rm -rf", "dd if=", "> /dev/", "chmod", "chown", "mv /", ":/usr/", ":/etc/", ":/bin/", ":/sbin/"],
......
<!-- Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net> -->
<!-- SPDX-License-Identifier: GPL-3.0-or-later -->
<!-- Copyleft: GNU GPLv3 or later applies to this file. -->
# Hermes Node Protocol # Hermes Node Protocol
# Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net> # Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net>
# All rights reserved. # All rights reserved.
......
# Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyleft: this program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# Hermes Node Protocol # Hermes Node Protocol
# Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net> # Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net>
# All rights reserved. # All rights reserved.
......
# Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyleft: this program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# Hermes Node Protocol # Hermes Node Protocol
# Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net> # Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net>
# All rights reserved. # All rights reserved.
......
This diff is collapsed.
#!/bin/bash #!/bin/bash
# Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyleft: this program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# Hermes Node Agent Installer — Linux (self-contained) # Hermes Node Agent Installer — Linux (self-contained)
set -e set -e
......
#!/bin/bash #!/bin/bash
# Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyleft: this program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# Release script: builds Windows installer and publishes to website # Release script: builds Windows installer and publishes to website
# #
# This script: # This script:
......
#!/bin/bash #!/bin/bash
# Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyleft: this program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# Upload built Windows installer to website (lisa.nexlab.net) # Upload built Windows installer to website (lisa.nexlab.net)
# #
# Prerequisites: # Prerequisites:
......
#!/bin/bash #!/bin/bash
# Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyleft: this program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# Hermes sexec - secure command execution wrapper # Hermes sexec - secure command execution wrapper
# This is a placeholder. Actual sexec implementation goes here. # This is a placeholder. Actual sexec implementation goes here.
if command -v sudo >/dev/null 2>&1; then if command -v sudo >/dev/null 2>&1; then
......
#!/usr/bin/env python3 #!/usr/bin/env python3
# Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyleft: this program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# Hermes Node Protocol # Hermes Node Protocol
# Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net> # Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net>
# All rights reserved. # All rights reserved.
......
<!-- Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net> -->
<!-- SPDX-License-Identifier: GPL-3.0-or-later -->
<!-- Copyleft: GNU GPLv3 or later applies to this file. -->
# Hermes Node Protocol # Hermes Node Protocol
# Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net> # Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net>
# All rights reserved. # All rights reserved.
......
<!-- Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net> -->
<!-- SPDX-License-Identifier: GPL-3.0-or-later -->
<!-- Copyleft: GNU GPLv3 or later applies to this file. -->
# Windows Installer Build — PyInstaller + NSIS # Windows Installer Build — PyInstaller + NSIS
## Overview ## Overview
......
# Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyleft: this program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# Hermes Node Protocol # Hermes Node Protocol
# Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net> # Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net>
# All rights reserved. # All rights reserved.
......
#!/bin/bash #!/bin/bash
# Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyleft: this program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# Complete Windows installer build: PyInstaller + NSIS # Complete Windows installer build: PyInstaller + NSIS
# Works on Linux using Wine Windows Python environment # Works on Linux using Wine Windows Python environment
# #
......
#!/bin/bash #!/bin/bash
# Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyleft: this program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# Build Windows executables using PyInstaller via Wine # Build Windows executables using PyInstaller via Wine
set -e set -e
cd "$(cd "$(dirname "$0")" && pwd)" cd "$(cd "$(dirname "$0")" && pwd)"
......
# Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyleft: this program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# Hermes Node Protocol # Hermes Node Protocol
# Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net> # Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net>
# All rights reserved. # All rights reserved.
......
# -*- mode: python ; coding: utf-8 -*- # Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyleft: this program is free software; you can redistribute it and/or modify
a = Analysis( # it under the terms of the GNU General Public License as published by
['Z:\\home\\lisa\\hermes-node-protocol\\node-agent\\hermes_node_agent.py'], # the Free Software Foundation, either version 3 of the License, or
pathex=[], # (at your option) any later version.
binaries=[], # -*- mode: python ; coding: utf-8 -*-
datas=[],
hiddenimports=[],
hookspath=[], a = Analysis(
hooksconfig={}, ['Z:\\home\\lisa\\hermes-node-protocol\\node-agent\\hermes_node_agent.py'],
runtime_hooks=[], pathex=[],
excludes=[], binaries=[],
noarchive=False, datas=[],
optimize=0, hiddenimports=[],
) hookspath=[],
pyz = PYZ(a.pure) hooksconfig={},
runtime_hooks=[],
exe = EXE( excludes=[],
pyz, noarchive=False,
a.scripts, optimize=0,
a.binaries, )
a.datas, pyz = PYZ(a.pure)
[],
name='hermes-node-agent', exe = EXE(
debug=False, pyz,
bootloader_ignore_signals=False, a.scripts,
strip=False, a.binaries,
upx=True, a.datas,
upx_exclude=[], [],
runtime_tmpdir=None, name='hermes-node-agent',
console=True, debug=False,
disable_windowed_traceback=False, bootloader_ignore_signals=False,
argv_emulation=False, strip=False,
target_arch=None, upx=True,
codesign_identity=None, upx_exclude=[],
entitlements_file=None, runtime_tmpdir=None,
) console=True,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
# -*- mode: python ; coding: utf-8 -*- # Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyleft: this program is free software; you can redistribute it and/or modify
a = Analysis( # it under the terms of the GNU General Public License as published by
['agent-manager.py'], # the Free Software Foundation, either version 3 of the License, or
pathex=[], # (at your option) any later version.
binaries=[], # -*- mode: python ; coding: utf-8 -*-
datas=[],
hiddenimports=[],
hookspath=[], a = Analysis(
hooksconfig={}, ['agent-manager.py'],
runtime_hooks=[], pathex=[],
excludes=[], binaries=[],
noarchive=False, datas=[],
optimize=0, hiddenimports=[],
) hookspath=[],
pyz = PYZ(a.pure) hooksconfig={},
runtime_hooks=[],
exe = EXE( excludes=[],
pyz, noarchive=False,
a.scripts, optimize=0,
a.binaries, )
a.datas, pyz = PYZ(a.pure)
[],
name='hermes-node-manager', exe = EXE(
debug=False, pyz,
bootloader_ignore_signals=False, a.scripts,
strip=False, a.binaries,
upx=True, a.datas,
upx_exclude=[], [],
runtime_tmpdir=None, name='hermes-node-manager',
console=False, debug=False,
disable_windowed_traceback=False, bootloader_ignore_signals=False,
argv_emulation=False, strip=False,
target_arch=None, upx=True,
codesign_identity=None, upx_exclude=[],
entitlements_file=None, runtime_tmpdir=None,
) console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
This diff is collapsed.
; Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
; SPDX-License-Identifier: GPL-3.0-or-later
; Copyleft: this program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
; Hermes Node Agent Windows Installer — NSIS ; Hermes Node Agent Windows Installer — NSIS
; User-owned config: $APPDATA\HermesNode\config.json ; User-owned config: $APPDATA\HermesNode\config.json
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment