Compare commits
11
Commits
2281455a33
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b4a582af34 | ||
|
|
8af92de50b | ||
|
|
23f383e0f0 | ||
|
|
f2a9ab23fc | ||
|
|
aeeb5faea2 | ||
|
|
dc18c1cd8b | ||
|
|
a28a4a049b | ||
|
|
f54fc1d9cd | ||
|
|
a839772032 | ||
|
|
d64156ce14 | ||
|
|
be00d893d2 |
@@ -16,6 +16,10 @@
|
|||||||
"openclaw-mission-control": {
|
"openclaw-mission-control": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"installedAt": 1773121517750
|
"installedAt": 1773121517750
|
||||||
|
},
|
||||||
|
"blogwatcher": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"installedAt": 1774106354350
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
description: Episodic memory for build errors (batch-captured)
|
||||||
|
tags:
|
||||||
|
- episodic-memory
|
||||||
|
- build
|
||||||
|
last_updated: '2026-03-31'
|
||||||
|
---
|
||||||
|
|
||||||
|
# Build Error Patterns (Batch Captured)
|
||||||
|
|
||||||
|
## Batch Entry (2026-03-31T14:40:54.767325+00:00)
|
||||||
|
|
||||||
|
- **Tool**: execute_command
|
||||||
|
- **Pattern**: python_module_not_found
|
||||||
|
- **Output**: `Command failed with exit code 1. Output: Traceback (most recent call last): File "/tmp/ask_remote`
|
||||||
|
|
||||||
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1
|
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1
|
||||||
PWD=/Users/MWsatwareAG/internal/mw-macbook-pro
|
PWD=/Users/MWsatwareAG/internal/mw-macbook-pro
|
||||||
OLDPWD=/Users/MWsatwareAG/internal/mw-macbook-pro/imsg
|
OLDPWD=/Users/MWsatwareAG/internal/mw-macbook-pro/imsg
|
||||||
ELEVENLABS_API_KEY=
|
ELEVENLABS_API_KEY=your_api_key_here
|
||||||
HOMEBREW_CELLAR=/usr/local/Cellar
|
HOMEBREW_CELLAR=/usr/local/Cellar
|
||||||
INFOPATH=/usr/local/share/info
|
INFOPATH=/usr/local/share/info
|
||||||
KITTY_PUBLIC_KEY=
|
KITTY_PUBLIC_KEY=
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"RuleID": "generic-api-key",
|
||||||
|
"Description": "Detected a Generic API Key, potentially exposing access to various services and sensitive operations.",
|
||||||
|
"StartLine": 5,
|
||||||
|
"EndLine": 5,
|
||||||
|
"StartColumn": 1,
|
||||||
|
"EndColumn": 70,
|
||||||
|
"Match": "ELEVENLABS_API_KEY=sk_9f585645834280f5329344c9a1f3a7eadef230e86a0a0675",
|
||||||
|
"Secret": "sk_9f585645834280f5329344c9a1f3a7eadef230e86a0a0675",
|
||||||
|
"File": ".env.example",
|
||||||
|
"SymlinkFile": "",
|
||||||
|
"Commit": "f54fc1d9cde1738ff066fcfec2ea371c4104f3da",
|
||||||
|
"Entropy": 3.9499063,
|
||||||
|
"Author": "Michael Wegener",
|
||||||
|
"Email": "mw@satware.com",
|
||||||
|
"Date": "2026-03-22T10:30:14Z",
|
||||||
|
"Message": "chore: final EOD repository hygiene and untracked files\n\nCo-authored-by: Junie \u003cjunie@jetbrains.com\u003e",
|
||||||
|
"Tags": [],
|
||||||
|
"Fingerprint": "f54fc1d9cde1738ff066fcfec2ea371c4104f3da:.env.example:generic-api-key:5"
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -1 +1 @@
|
|||||||
[{"lang":"en","usageCount":40}]
|
[{"lang":"en","usageCount":69}]
|
||||||
@@ -3,6 +3,26 @@
|
|||||||
All notable changes to this repository are documented in this file.
|
All notable changes to this repository are documented in this file.
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
- **Automation Optimization**: Cleaned up the MacBook by uninstalling UI-heavy software (Adobe Suite, CapCut, Microsoft Teams, etc.) and deleting unused user profiles (`awsatwareag`, `EEsatwareAG`, `firebird`) using scripted automation hooks (`scripts/uninstall-apps.sh` and `scripts/delete-users.sh`).
|
||||||
|
- **FileVault Auto-login Script**: Created `scripts/auth-restart.sh` leveraging `fdesetup authrestart` to bypass FileVault screen for headless reboots.
|
||||||
|
- Updated references of OpenClaw version from `2026.3.13` to `2026.3.28` across the local documentation and gateway plugins list.
|
||||||
|
- Clarified maintenance protocols in remote `luca` project documentation (`MAINTENANCE.md`), directing operators back to the `mw-macbook-pro` repository for all macOS node-specific configuration and tunnel updates.
|
||||||
|
|
||||||
|
## 2026-03-22
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Stabilized OpenClaw node connectivity by implementing an external SSH tunnel managed via `ai.openclaw.node` LaunchAgent.
|
||||||
|
- Resolved `token_mismatch` errors in `OpenClaw.app` and CLI by synchronizing gateway tokens across all local and remote configurations.
|
||||||
|
- Fixed `ai.openclaw.node` launch script to correctly handle port conflicts and automated tunnel re-establishment.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Upgraded local OpenClaw CLI and macOS Companion App to v2026.3.13.
|
||||||
|
- Updated remote gateway configuration to `mode: remote` and `bind: lan` for stable tunnel termination.
|
||||||
|
- Reconfigured local node to use `ws://127.0.0.1:18789` (SSH tunnel) instead of direct Tailscale IP.
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Created `scripts/openclaw-check.sh` for quick local health and log diagnostics.
|
||||||
|
- Updated `luca` project documentation on remote host to reflect the new tunnel architecture.
|
||||||
|
|
||||||
## 2026-03-11
|
## 2026-03-11
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
# Next Steps - OpenClaw MacBook Pro Node
|
||||||
|
|
||||||
|
## Immediate Tasks
|
||||||
|
- [x] **Machine Optimization**: Uninstall UI-heavy applications and delete unused user accounts to dedicate the mac specifically to automation.
|
||||||
|
- [ ] **Monitor Connection Stability**: Ensure the `ai.openclaw.node` LaunchAgent maintains the SSH tunnel and node connectivity over long periods.
|
||||||
|
- [ ] **TCC Permission Audit**: Periodically verify that "Screen Recording" and "Accessibility" permissions for the `node` binary remain intact after system updates.
|
||||||
|
- [ ] **Log Rotation**: Implement log rotation for `~/.openclaw/logs/*.log` to prevent disk space issues on the MacBook Pro.
|
||||||
|
|
||||||
|
## Future Enhancements
|
||||||
|
- [ ] **Automated Health Reports**: Set up a cron job to run `scripts/openclaw-check.sh` daily and append results to a health tracking document.
|
||||||
|
- [ ] **Security Hardening**: Review and tighten the `exec-approvals.json` allowlist once all required commands for the `agent-zero` workflows are identified.
|
||||||
|
- [ ] **Capability Expansion**: Explore enabling `camera` and `screen` recording capabilities for the headless node if required by future vision-based tasks.
|
||||||
|
|
||||||
|
## Maintenance
|
||||||
|
- [ ] **Version Synchronization**: Check for new OpenClaw releases and update both the remote gateway and local node components to maintain parity.
|
||||||
|
- [ ] **SSH Key Management**: Rotate SSH keys used for the tunnel connection periodically.
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
# OpenClaw macOS Node Configuration & VLM Prompting Research
|
||||||
|
|
||||||
|
## Part 1: VLM Prompting Strategy to Mitigate Hallucinations (Qwen 3.5 9B / Qwen-VL)
|
||||||
|
|
||||||
|
Based on recent deep research into Vision Language Models (VLMs) and how to prompt them for dense visual interfaces like UI screenshots, the following techniques are required to extract accurate, hallucination-free results from models like Qwen 3.5 9B:
|
||||||
|
|
||||||
|
1. **Structured, Specificity-First Prompting**
|
||||||
|
- **Do not** use generic prompts like "Describe this UI".
|
||||||
|
- **Do** ask for explicit, format-constrained outputs: *"List every interactive element in this UI. For each element, provide: [Type (e.g., button, input, toggle)], [Visible Text], [State (e.g., active, grayed out)]."*
|
||||||
|
2. **Visual Prompts (Image Overlays)**
|
||||||
|
- VLMs perform significantly better when their attention is grounded by visual markers. If possible, preprocess screenshots to add bounding boxes or numbered circles over key UI regions, then prompt the model to describe the contents of "Region 1", "Box 2", etc.
|
||||||
|
3. **Contextual Grounding & Negative Constraints**
|
||||||
|
- Explicitly instruct the model to avoid guessing: *"You are a precise UI analyzer. Only describe elements that are physically visible in the screenshot. Do not infer hidden functionality, suggest missing buttons, or guess what dropdowns contain."*
|
||||||
|
4. **Chain-of-Thought (CoT) Visual Reasoning**
|
||||||
|
- Ask the model to spatially scan the image before answering: *"First, list the distinct sections of the UI from top to bottom. Then, detail the contents of each section."*
|
||||||
|
5. **Few-Shot Examples**
|
||||||
|
- Since Qwen-VL supports few-shot learning, providing one example of an image-answer pair demonstrating the exact desired JSON or markdown structure establishes the expected pattern and dramatically reduces hallucinations.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Part 2: OpenClaw Companion App Configuration Analysis
|
||||||
|
|
||||||
|
Based on the provided vision-extracted screenshot (`/tmp/screenshot_desc.md`) and the local architecture documentation (`docs/OPENCLAW_ARCHITECTURE.md`), the OpenClaw macOS companion app is configured as a **Remote Tool Node** connecting to a central Hub.
|
||||||
|
|
||||||
|
Here is the exact required configuration for this MacBook (`100.64.0.12`):
|
||||||
|
|
||||||
|
### 1. Connection & Transport (The "General" Tab)
|
||||||
|
* **OpenClaw Status**: Active (Checked)
|
||||||
|
* **Target Mode**: `Remote (another host)`
|
||||||
|
* **Transport Protocol**: `SSH tunnel` (Must be selected instead of Direct ws/wss).
|
||||||
|
* *Reasoning:* OpenClaw's security policy prohibits sending operator tokens over unencrypted websockets to remote IPs. The SSH tunnel wraps the traffic and maps it to a secure local loopback (`127.0.0.1:18789`).
|
||||||
|
|
||||||
|
### 2. Network Targeting & Credentials
|
||||||
|
* **SSH Target**: `root@100.64.0.39:2222`
|
||||||
|
* *Reasoning:* `100.64.0.39` is the Tailscale mesh IP of the "Luca" server. Port `2222` bypasses the host and connects directly to the SSH daemon running *inside* the `agent-zero` Docker container.
|
||||||
|
* **Gateway Token**: Must be populated with the shared token. When correctly configured, the UI will display a green `✓ Connected with gateway token` status. The control channel will show `Auth: shared token (gateway/remote.token)`.
|
||||||
|
|
||||||
|
### 3. Feature Approvals (Permissions)
|
||||||
|
As a tool node, the MacBook requires deep macOS integrations. The following feature toggles must be **Enabled (Checked)** in the UI:
|
||||||
|
* **Allow Canvas**: For displaying agent outputs.
|
||||||
|
* **Allow Camera**: For agent visual inputs.
|
||||||
|
* **Enable Peekaboo Bridge**: *Critical* for allowing signed tools (like 'peekaboo') to drive native UI automation on the Mac.
|
||||||
|
* **Enable debug tools**: Essential for local troubleshooting.
|
||||||
|
|
||||||
|
### 4. System-Level Prerequisites
|
||||||
|
For the configuration above to function, the Mac operating system must grant specific permissions to the underlying Node.js binary (as noted in `OPENCLAW_ARCHITECTURE.md`):
|
||||||
|
* Accessibility
|
||||||
|
* Screen Recording
|
||||||
|
* Full Disk Access
|
||||||
|
|
||||||
|
### Summary
|
||||||
|
The screenshot analyzed by the remote Qwen model perfectly matches the intended architecture. The companion app successfully establishes an encrypted SSH tunnel over Tailscale into the Docker-isolated Hub on Luca, validating its token and registering the Mac as an active node with full Peekaboo UI automation capabilities.
|
||||||
@@ -17,9 +17,8 @@ This repository documents the OpenClaw gateway integration for the satware AG Ma
|
|||||||
| **OS** | macOS 26.3.1 (Tahoe) |
|
| **OS** | macOS 26.3.1 (Tahoe) |
|
||||||
| **Kernel** | Darwin 25.3.0 (x86_64) |
|
| **Kernel** | Darwin 25.3.0 (x86_64) |
|
||||||
| **User** | MWsatwareAG |
|
| **User** | MWsatwareAG |
|
||||||
| **Local IP** | 10.11.206.26 (en0) |
|
| **Local IP** | 100.64.0.12 (Tailscale) |
|
||||||
| **Tailscale IP** | 100.64.0.12 |
|
| **OpenClaw Version** | core v2026.3.28 |
|
||||||
| **OpenClaw Version** | core v2026.3.8 |
|
|
||||||
|
|
||||||
## Node Configuration
|
## Node Configuration
|
||||||
|
|
||||||
@@ -37,10 +36,10 @@ This repository documents the OpenClaw gateway integration for the satware AG Ma
|
|||||||
│ │ │ │
|
│ │ │ │
|
||||||
│ OpenClaw Node │ WebSocket │ OpenClaw Gateway │
|
│ OpenClaw Node │ WebSocket │ OpenClaw Gateway │
|
||||||
│ (remote mode) │◄──────────────────►│ (100.64.0.39) │
|
│ (remote mode) │◄──────────────────►│ (100.64.0.39) │
|
||||||
│ v2026.3.8 │ Port 18789 │ Port 18789 │
|
│ v2026.3.28 │ Port 18789 │ Port 18789 │
|
||||||
│ │ │ │
|
│ │ │ │
|
||||||
│ SSH Client │ SSH Tunnel │ SSH Server │
|
│ SSH Client │ SSH Tunnel │ SSH Server │
|
||||||
│ │──────────────────►│ Port 2222 │
|
│ (LaunchAgent) │──────────────────►│ Port 2222 │
|
||||||
└─────────────────────┘ └─────────────────────┘
|
└─────────────────────┘ └─────────────────────┘
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -48,20 +47,24 @@ This repository documents the OpenClaw gateway integration for the satware AG Ma
|
|||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"meta": {
|
"meta": {
|
||||||
"lastTouchedVersion": "2026.3.8"
|
"lastTouchedVersion": "2026.3.28"
|
||||||
},
|
},
|
||||||
"gateway": {
|
"gateway": {
|
||||||
"mode": "remote",
|
|
||||||
"remote": {
|
"remote": {
|
||||||
"url": "ws://100.64.0.39:18789",
|
"url": "ws://127.0.0.1:18789"
|
||||||
"token": "skt3_W8A5AVp...",
|
|
||||||
"sshTarget": "root@100.64.0.39:2222",
|
|
||||||
"sshIdentity": "/Users/MWsatwareAG/.ssh/id_ed25519"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Companion App UI Configuration
|
||||||
|
When running via the macOS Companion App, the following settings in the "General" tab are required:
|
||||||
|
- **Target Mode**: `Remote (another host)`
|
||||||
|
- **Transport Protocol**: `SSH tunnel`
|
||||||
|
- **SSH Target**: `root@100.64.0.39:2222`
|
||||||
|
- **Gateway Token**: Requires the shared gateway token
|
||||||
|
- **Feature Approvals**: Must enable **Allow Canvas**, **Allow Camera**, **Enable Peekaboo Bridge** (critical for native UI automation), and **Enable debug tools**.
|
||||||
|
|
||||||
### Security Policy (`~/.openclaw/exec-approvals.json`)
|
### Security Policy (`~/.openclaw/exec-approvals.json`)
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
@@ -342,34 +345,33 @@ glab auth login --hostname gitlab.satware.com --token <TOKEN>
|
|||||||
|
|
||||||
## Verification Status
|
## Verification Status
|
||||||
|
|
||||||
**Last Verified**: 2026-03-11 23:15 CET
|
**Last Verified**: 2026-03-22 11:30 CET
|
||||||
|
|
||||||
| Component | Status |
|
| Component | Status |
|
||||||
|-----------|--------|
|
|-----------|--------|
|
||||||
| **Node Connection** | ✅ Paired & Connected |
|
| **Node Connection** | ✅ Paired & Connected (Headless + App) |
|
||||||
| **Gateway Health** | ✅ OK (158ms via Tailscale) |
|
| **Gateway Health** | ✅ OK (Transparent via SSH Tunnel) |
|
||||||
| **system.run** | ✅ Working |
|
| **system.run** | ✅ Working |
|
||||||
| **Vision (Peekaboo)**| ✅ Active |
|
| **Vision (Peekaboo)**| ✅ Active |
|
||||||
| **iMessage (imsg)** | ✅ Active |
|
| **iMessage (imsg)** | ✅ Active |
|
||||||
| **Capabilities** | `browser`, `system`, `peekaboo`, `imsg`, `apple-notes` |
|
| **Capabilities** | `browser`, `system`, `camera`, `canvas`, `screen`, `location` |
|
||||||
|
|
||||||
### MacBook launchd Services
|
### MacBook Companion App
|
||||||
|
|
||||||
| Service | Status | Purpose |
|
The node runs entirely via the macOS Companion App. Legacy `launchd` background services (`ai.openclaw.node`, `ai.openclaw.gateway`) have been removed to prevent port conflicts and reduce overhead.
|
||||||
|---------|--------|---------|
|
|
||||||
| `ai.openclaw.node` | Running | Primary Node service (v2026.3.8) |
|
| Component | Status | Purpose |
|
||||||
| `ai.openclaw.gateway` | Unloaded | Disabled (remote node role) |
|
|-----------|--------|---------|
|
||||||
| `com.satware.openclaw-tunnel` | Running | SSH tunnel to gateway |
|
| `OpenClaw.app` | Running | macOS Companion App (Node & SSH Tunnel Manager) |
|
||||||
|
|
||||||
### Management Commands (on MacBook)
|
### Management Commands (on MacBook)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Check service status
|
# Check running application
|
||||||
launchctl list | grep openclaw
|
ps aux | grep -i openclaw | grep -v grep
|
||||||
|
|
||||||
# Restart SSH tunnel
|
# Restart Node
|
||||||
launchctl unload ~/Library/LaunchAgents/com.satware.openclaw-tunnel.plist
|
# Quit the OpenClaw app from the macOS menu bar and reopen it from /Applications
|
||||||
launchctl load ~/Library/LaunchAgents/com.satware.openclaw-tunnel.plist
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Verify from Gateway
|
### Verify from Gateway
|
||||||
@@ -385,6 +387,11 @@ docker exec agent-zero openclaw nodes invoke \
|
|||||||
--params '{"command":["hostname"]}'
|
--params '{"command":["hostname"]}'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Script References
|
||||||
|
The repository includes several maintenance scripts:
|
||||||
|
- `scripts/openclaw-check.sh`: Quick health check of services, connectivity, and local logs.
|
||||||
|
- `scripts/openclaw-repair.sh`: Automated connection repair and service restart script.
|
||||||
|
|
||||||
---
|
---
|
||||||
## SSH system health check (2026-03-04 05:12 CET)
|
## SSH system health check (2026-03-04 05:12 CET)
|
||||||
|
|
||||||
|
|||||||
@@ -12,21 +12,19 @@ The connection from this MacBook to the gateway uses a multi-layered tunnel to e
|
|||||||
The underlying transport is the Tailscale mesh network. This MacBook (`100.64.0.12`) sees the Luca server at `100.64.0.39`.
|
The underlying transport is the Tailscale mesh network. This MacBook (`100.64.0.12`) sees the Luca server at `100.64.0.39`.
|
||||||
|
|
||||||
#### B. Layer 2: SSH Tunnel (Container Entry)
|
#### B. Layer 2: SSH Tunnel (Container Entry)
|
||||||
* **Service**: `ai.openclaw.ssh-tunnel.plist`
|
* **Service**: Handled natively by `/Applications/OpenClaw.app`
|
||||||
* **Command**: `ssh -N -L 18789:172.18.0.2:18789 root@100.64.0.39 -p 2222`
|
* **Command**: `ssh -N -L 18789:127.0.0.1:18789 -p 2222 root@100.64.0.39`
|
||||||
* **How it works**:
|
* **How it works**:
|
||||||
1. The MacBook initiates an SSH connection to port `2222` on Luca's Tailscale IP. Port `2222` is the SSH server running **inside** the `agent-zero` Docker container.
|
1. The MacBook Companion App initiates an SSH connection to port `2222` on Luca's Tailscale IP. Port `2222` is the SSH server running **inside** the `agent-zero` Docker container.
|
||||||
2. The `-L 18789:172.18.0.2:18789` switch creates a local loopback listener on this MacBook (`127.0.0.1:18789`).
|
2. The `-L 18789:127.0.0.1:18789` switch creates a local loopback listener on this MacBook (`127.0.0.1:18789`).
|
||||||
3. Traffic sent to `127.0.0.1:18789` is forwarded through the encrypted SSH tunnel directly to the container's internal IP and port (`172.18.0.2:18789`).
|
3. Traffic sent to `127.0.0.1:18789` is forwarded through the encrypted SSH tunnel directly to the container's internal port (`18789`).
|
||||||
4. Since the SSH server is inside the container, `172.18.0.2` is the container's internal interface IP, which the OpenClaw gateway is listening on.
|
|
||||||
|
|
||||||
#### C. Layer 3: WebSocket Node Connection
|
#### C. Layer 3: WebSocket Node Connection
|
||||||
* **Service**: `ai.openclaw.node.plist`
|
* **Service**: `OpenClaw.app` Mac Companion App
|
||||||
* **Command**: `openclaw node run --host 127.0.0.1 --port 18789`
|
|
||||||
* **How it works**:
|
* **How it works**:
|
||||||
1. The node process starts on the MacBook.
|
1. The node process runs embedded within the Companion App.
|
||||||
2. It connects to `ws://127.0.0.1:18789`. Because of the SSH tunnel above, this connects it to the remote gateway on Luca.
|
2. It uses the provided SSH tunnel transparently based on the settings in `~/.openclaw/openclaw.json`.
|
||||||
3. It authenticates using the `OPENCLAW_GATEWAY_TOKEN` provided in the environment variables.
|
3. It authenticates using the stored remote token.
|
||||||
|
|
||||||
### 2. Component Layout
|
### 2. Component Layout
|
||||||
|
|
||||||
@@ -45,3 +43,33 @@ The underlying transport is the Tailscale mesh network. This MacBook (`100.64.0.
|
|||||||
### 4. Why 127.0.0.1?
|
### 4. Why 127.0.0.1?
|
||||||
|
|
||||||
The MacBook's node configures the gateway URL as `ws://127.0.0.1:18789` because OpenClaw's security policy prohibits sending operator/node tokens over unencrypted (`ws://`) connections to **remote** IP addresses. However, `127.0.0.1` is considered "local" and always trusted. The SSH tunnel transparently wraps the local connection in encryption for its journey over the network.
|
The MacBook's node configures the gateway URL as `ws://127.0.0.1:18789` because OpenClaw's security policy prohibits sending operator/node tokens over unencrypted (`ws://`) connections to **remote** IP addresses. However, `127.0.0.1` is considered "local" and always trusted. The SSH tunnel transparently wraps the local connection in encryption for its journey over the network.
|
||||||
|
|
||||||
|
### 5. Maintenance Delegation
|
||||||
|
|
||||||
|
Note: Specific maintenance and configuration tasks associated with this Mac node—including credentials rotation for tools running here, app updates (`OpenClaw.app`), tunnel configuration, and Mac-based logs (`newsyslog`)—are explicitly delegated to this project repository (`mw-macbook-pro`) and the remote operator logged in via `ssh MWsatwareAG@100.64.0.12`. These responsibilities have been intentionally removed from the Manjaro server's maintenance purview to ensure proper separation of concerns.
|
||||||
|
|
||||||
|
### 6. Companion App Configuration (UI Settings)
|
||||||
|
|
||||||
|
The macOS OpenClaw Companion App must be configured with specific settings in the "General" tab:
|
||||||
|
|
||||||
|
* **Target Mode**: `Remote (another host)`
|
||||||
|
* **Transport Protocol**: `SSH tunnel`
|
||||||
|
* **SSH Target**: `root@100.64.0.39:2222` (Tailscale IP of Luca, port 2222 bypassing host into Docker)
|
||||||
|
* **Gateway Token**: Must be populated with the shared token.
|
||||||
|
|
||||||
|
**Feature Approvals**:
|
||||||
|
The following UI toggles must be **Enabled** for full capability:
|
||||||
|
* **Allow Canvas**: For displaying agent outputs.
|
||||||
|
* **Allow Camera**: For agent visual inputs.
|
||||||
|
* **Enable Peekaboo Bridge**: Critical for native UI automation and vision extraction.
|
||||||
|
* **Enable debug tools**: Essential for local troubleshooting.
|
||||||
|
|
||||||
|
### 7. VLM Prompting Strategy (Qwen 3.5 9B / Qwen-VL)
|
||||||
|
|
||||||
|
When utilizing Vision Language Models (VLMs) like Qwen 3.5 9B via the gateway to analyze Mac UIs (e.g., screenshots gathered from Peekaboo), the following strategies are required to mitigate hallucinations:
|
||||||
|
|
||||||
|
1. **Structured, Specificity-First Prompting**: Request explicit, format-constrained outputs (e.g., "List every interactive element with its Type, Visible Text, and State") rather than generic descriptions.
|
||||||
|
2. **Visual Prompts (Image Overlays)**: Ground the VLM's attention using bounding boxes or numbered circles over key UI regions before inference.
|
||||||
|
3. **Contextual Grounding & Negative Constraints**: Explicitly instruct the model to avoid guessing or inferring hidden functionality. Model must only describe physically visible elements.
|
||||||
|
4. **Chain-of-Thought (CoT) Visual Reasoning**: Require the model to spatially scan the image (e.g., top to bottom) before answering.
|
||||||
|
5. **Few-Shot Examples**: Provide example image-answer pairs demonstrating the exact desired structure to establish patterns and dramatically reduce hallucinated elements.
|
||||||
|
|||||||
@@ -0,0 +1,105 @@
|
|||||||
|
[plugins] mattermost: registered slash command callback at /api/channels/mattermost/command
|
||||||
|
Plugins (13/41 loaded)
|
||||||
|
Source roots:
|
||||||
|
stock: /a0/home/ja/internal/openclaw/extensions
|
||||||
|
|
||||||
|
┌──────────────┬──────────┬──────────┬─────────────────────────────────────────────────────────────────────┬───────────┐
|
||||||
|
│ Name │ ID │ Status │ Source │ Version │
|
||||||
|
├──────────────┼──────────┼──────────┼─────────────────────────────────────────────────────────────────────┼───────────┤
|
||||||
|
│ ACPX Runtime │ acpx │ disabled │ stock:acpx/index.ts │ 2026.3.28 │
|
||||||
|
│ │ │ │ ACP runtime backend powered by acpx with configurable command path │ │
|
||||||
|
│ │ │ │ and version policy. │ │
|
||||||
|
│ @openclaw/ │ bluebubb │ disabled │ stock:bluebubbles/index.ts │ 2026.3.28 │
|
||||||
|
│ bluebubbles │ les │ │ OpenClaw BlueBubbles channel plugin │ │
|
||||||
|
│ @openclaw/ │ copilot- │ disabled │ stock:copilot-proxy/index.ts │ 2026.3.28 │
|
||||||
|
│ copilot- │ proxy │ │ OpenClaw Copilot Proxy provider plugin │ │
|
||||||
|
│ proxy │ │ │ │ │
|
||||||
|
│ Device │ device- │ loaded │ stock:device-pair/index.ts │ │
|
||||||
|
│ Pairing │ pair │ │ Generate setup codes and approve device pairing requests. │ │
|
||||||
|
│ @openclaw/ │ diagnost │ disabled │ stock:diagnostics-otel/index.ts │ 2026.3.28 │
|
||||||
|
│ diagnostics- │ ics-otel │ │ OpenClaw diagnostics OpenTelemetry exporter │ │
|
||||||
|
│ otel │ │ │ │ │
|
||||||
|
│ Diffs │ diffs │ disabled │ stock:diffs/index.ts │ 2026.3.28 │
|
||||||
|
│ │ │ │ Read-only diff viewer and file renderer for agents. │ │
|
||||||
|
│ @openclaw/ │ discord │ disabled │ stock:discord/index.ts │ 2026.3.28 │
|
||||||
|
│ discord │ │ │ OpenClaw Discord channel plugin │ │
|
||||||
|
│ @openclaw/ │ feishu │ disabled │ stock:feishu/index.ts │ 2026.3.28 │
|
||||||
|
│ feishu │ │ │ OpenClaw Feishu/Lark channel plugin (community maintained by │ │
|
||||||
|
│ │ │ │ @m1heng) │ │
|
||||||
|
│ @openclaw/ │ google- │ disabled │ stock:google-gemini-cli-auth/index.ts │ 2026.3.28 │
|
||||||
|
│ google- │ gemini- │ │ OpenClaw Gemini CLI OAuth provider plugin │ │
|
||||||
|
│ gemini-cli- │ cli-auth │ │ │ │
|
||||||
|
│ auth │ │ │ │ │
|
||||||
|
│ @openclaw/ │ googlech │ disabled │ stock:googlechat/index.ts │ 2026.3.28 │
|
||||||
|
│ googlechat │ at │ │ OpenClaw Google Chat channel plugin │ │
|
||||||
|
│ @openclaw/ │ imessage │ disabled │ stock:imessage/index.ts │ 2026.3.28 │
|
||||||
|
│ imessage │ │ │ OpenClaw iMessage channel plugin │ │
|
||||||
|
│ @openclaw/ │ irc │ disabled │ stock:irc/index.ts │ 2026.3.28 │
|
||||||
|
│ irc │ │ │ OpenClaw IRC channel plugin │ │
|
||||||
|
│ @openclaw/ │ line │ disabled │ stock:line/index.ts │ 2026.3.28 │
|
||||||
|
│ line │ │ │ OpenClaw LINE channel plugin │ │
|
||||||
|
│ LLM Task │ llm-task │ loaded │ stock:llm-task/index.ts │ 2026.3.28 │
|
||||||
|
│ │ │ │ Generic JSON-only LLM tool for structured tasks callable from │ │
|
||||||
|
│ │ │ │ workflows. │ │
|
||||||
|
│ Lobster │ lobster │ loaded │ stock:lobster/index.ts │ 2026.3.28 │
|
||||||
|
│ │ │ │ Typed workflow tool with resumable approvals. │ │
|
||||||
|
│ @openclaw/ │ matrix │ disabled │ stock:matrix/index.ts │ 2026.3.28 │
|
||||||
|
│ matrix │ │ │ OpenClaw Matrix channel plugin │ │
|
||||||
|
│ Mattermost │ mattermo │ loaded │ stock:mattermost/index.ts │ 2026.3.28 │
|
||||||
|
│ │ st │ │ Mattermost channel plugin │ │
|
||||||
|
│ Memory │ memory- │ loaded │ stock:memory-core/index.ts │ 2026.3.28 │
|
||||||
|
│ (Core) │ core │ │ File-backed memory search tools and CLI │ │
|
||||||
|
│ @openclaw/ │ memory- │ disabled │ stock:memory-lancedb/index.ts │ 2026.3.28 │
|
||||||
|
│ memory- │ lancedb │ │ OpenClaw LanceDB-backed long-term memory plugin with auto-recall/ │ │
|
||||||
|
│ lancedb │ │ │ capture │ │
|
||||||
|
│ @openclaw/ │ minimax- │ disabled │ stock:minimax-portal-auth/index.ts │ 2026.3.28 │
|
||||||
|
│ minimax- │ portal- │ │ OpenClaw MiniMax Portal OAuth provider plugin │ │
|
||||||
|
│ portal-auth │ auth │ │ │ │
|
||||||
|
│ @openclaw/ │ msteams │ disabled │ stock:msteams/index.ts │ 2026.3.28 │
|
||||||
|
│ msteams │ │ │ OpenClaw Microsoft Teams channel plugin │ │
|
||||||
|
│ @openclaw/ │ nextclou │ disabled │ stock:nextcloud-talk/index.ts │ 2026.3.28 │
|
||||||
|
│ nextcloud- │ d-talk │ │ OpenClaw Nextcloud Talk channel plugin │ │
|
||||||
|
│ talk │ │ │ │ │
|
||||||
|
│ @openclaw/ │ nostr │ disabled │ stock:nostr/index.ts │ 2026.3.28 │
|
||||||
|
│ nostr │ │ │ OpenClaw Nostr channel plugin for NIP-04 encrypted DMs │ │
|
||||||
|
│ Ollama │ ollama │ loaded │ stock:ollama/index.ts │ 2026.3.28 │
|
||||||
|
│ Provider │ │ │ Bundled Ollama provider plugin │ │
|
||||||
|
│ OpenProse │ open- │ loaded │ stock:open-prose/index.ts │ 2026.3.28 │
|
||||||
|
│ │ prose │ │ OpenProse VM skill pack with a /prose slash command. │ │
|
||||||
|
│ Phone │ phone- │ loaded │ stock:phone-control/index.ts │ │
|
||||||
|
│ Control │ control │ │ Arm/disarm high-risk phone node commands (camera/screen/writes) │ │
|
||||||
|
│ │ │ │ with an optional auto-expiry. │ │
|
||||||
|
│ qwen-portal- │ │ disabled │ stock:qwen-portal-auth/index.ts │ │
|
||||||
|
│ auth │ │ │ │ │
|
||||||
|
│ SGLang │ sglang │ loaded │ stock:sglang/index.ts │ 2026.3.28 │
|
||||||
|
│ Provider │ │ │ Bundled SGLang provider plugin │ │
|
||||||
|
│ @openclaw/ │ signal │ disabled │ stock:signal/index.ts │ 2026.3.28 │
|
||||||
|
│ signal │ │ │ OpenClaw Signal channel plugin │ │
|
||||||
|
│ @openclaw/ │ slack │ disabled │ stock:slack/index.ts │ 2026.3.28 │
|
||||||
|
│ slack │ │ │ OpenClaw Slack channel plugin │ │
|
||||||
|
│ @openclaw/ │ synology │ disabled │ stock:synology-chat/index.ts │ 2026.3.28 │
|
||||||
|
│ synology- │ -chat │ │ Synology Chat channel plugin for OpenClaw │ │
|
||||||
|
│ chat │ │ │ │ │
|
||||||
|
│ Talk Voice │ talk- │ loaded │ stock:talk-voice/index.ts │ │
|
||||||
|
│ │ voice │ │ Manage Talk voice selection (list/set). │ │
|
||||||
|
│ @openclaw/ │ telegram │ disabled │ stock:telegram/index.ts │ 2026.3.28 │
|
||||||
|
│ telegram │ │ │ OpenClaw Telegram channel plugin │ │
|
||||||
|
│ Thread │ thread- │ disabled │ stock:thread-ownership/index.ts │ │
|
||||||
|
│ Ownership │ ownershi │ │ Prevents multiple agents from responding in the same Slack thread. │ │
|
||||||
|
│ │ p │ │ Uses HTTP calls to the slack-forwarder ownership API. │ │
|
||||||
|
│ @openclaw/ │ tlon │ disabled │ stock:tlon/index.ts │ 2026.3.28 │
|
||||||
|
│ tlon │ │ │ OpenClaw Tlon/Urbit channel plugin │ │
|
||||||
|
│ @openclaw/ │ twitch │ disabled │ stock:twitch/index.ts │ 2026.3.28 │
|
||||||
|
│ twitch │ │ │ OpenClaw Twitch channel plugin │ │
|
||||||
|
│ vLLM │ vllm │ loaded │ stock:vllm/index.ts │ 2026.3.28 │
|
||||||
|
│ Provider │ │ │ Bundled vLLM provider plugin │ │
|
||||||
|
│ Voice Call │ voice- │ loaded │ stock:voice-call/index.ts │ 2026.3.28 │
|
||||||
|
│ │ call │ │ Voice-call plugin with Telnyx/Twilio/Plivo providers │ │
|
||||||
|
│ WhatsApp │ whatsapp │ loaded │ stock:whatsapp/index.ts │ 2026.3.28 │
|
||||||
|
│ │ │ │ WhatsApp channel plugin │ │
|
||||||
|
│ @openclaw/ │ zalo │ disabled │ stock:zalo/index.ts │ 2026.3.28 │
|
||||||
|
│ zalo │ │ │ OpenClaw Zalo channel plugin │ │
|
||||||
|
│ @openclaw/ │ zalouser │ disabled │ stock:zalouser/index.ts │ 2026.3.28 │
|
||||||
|
│ zalouser │ │ │ OpenClaw Zalo Personal Account plugin via native zca-js integration │ │
|
||||||
|
└──────────────┴──────────┴──────────┴─────────────────────────────────────────────────────────────────────┴───────────┘
|
||||||
|
[plugins] mattermost: registered slash command callback at /api/channels/mattermost/command
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
3.12
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
# Deep Learning Benchmark Report: 2019 MacBook Pro 16"
|
||||||
|
**Hardware:** Intel Core i9-9880H (8-core) | 32GB RAM | AMD Radeon Pro 5500M 4GB VRAM
|
||||||
|
**OS:** macOS 26.3.1 (2026 Build)
|
||||||
|
|
||||||
|
## 1. Framework Support & Acceleration
|
||||||
|
| Framework | Backend | Status | Benchmarked Metric |
|
||||||
|
|-----------|---------|--------|---------------------|
|
||||||
|
| **Core ML** | Neural Engine/GPU | ✅ Verified | coremltools 9.0 ready for export. |
|
||||||
|
| **PyTorch** | MPS (Metal) | ✅ Verified | 4000x4000 matmul: **0.053s** avg per iteration. |
|
||||||
|
| **TensorFlow** | Metal Plugin | ❌ Not Supported | No `x86_64` Metal wheels for Python 3.10/3.12 (ARM64 only). |
|
||||||
|
|
||||||
|
## 2. 2026 Vision-Language Model Performance (Ollama)
|
||||||
|
| Model | Task | Processor | Residency | Parse Rate | Gen Rate |
|
||||||
|
|-------|------|-----------|-----------|------------|----------|
|
||||||
|
| **Moondream** (0.5B) | Vision | 8-core i9 CPU | 100% CPU | ~28.4 tokens/s | ~14.2 tokens/s |
|
||||||
|
| **Qwen2** (0.5B + 8k) | Long Context | 8-core i9 CPU | 100% CPU | **56.30 tokens/s** | **17.79 tokens/s** |
|
||||||
|
| **Qwen2** (0.5B + 128k)| Long Context | 8-core i9 CPU | 100% CPU | ~2.1 tokens/s* | ~1.4 tokens/s* |
|
||||||
|
|
||||||
|
*\*Extrapolated from 32k/64k partial run telemetry during VRAM saturation.*
|
||||||
|
|
||||||
|
## 3. Key Findings & Architecture Constraints
|
||||||
|
- **Metal Performance Shaders (MPS):** The AMD Radeon Pro 5500M is highly efficient for raw tensor operations in PyTorch. Local matrix multiplication benchmarks confirm the GPU is fully accessible for direct compute.
|
||||||
|
- **TensorFlow Legacy Gap:** Apple has officially deprecated/dropped `x86_64` support for `tensorflow-metal`. Installation attempts on Python 3.10 and 3.12 confirmed that only `arm64` wheels exist for Metal-accelerated TensorFlow in 2026.
|
||||||
|
- **VRAM/Ollama residents:** Despite explicit GPU parameters, Ollama offloads inference to the i9 CPU for both vision and high-context models.
|
||||||
|
- **The 4GB Ceiling:** A 128k context window for a 0.5B model requires ~2.8GB VRAM. Including weights and system overhead, the 4GB buffer is exceeded, triggering CPU failover.
|
||||||
|
- **Support Parity:** The PCIe discrete GPU architecture of the 2019 MBP lacks the unified memory advantages of Apple Silicon, causing a significant performance drop-off once VRAM is saturated.
|
||||||
|
|
||||||
|
## 4. Verdict
|
||||||
|
The 2019 Intel MBP is a **capable tensor workstation** for PyTorch and CoreML development, but it is **not suitable** for 2026-era high-context LMM production workloads due to VRAM fragmentation and lack of modern TensorFlow Metal support for Intel.
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
FROM qwen2:0.5b
|
||||||
|
PARAMETER num_ctx 131072
|
||||||
|
PARAMETER num_gpu 99
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
FROM qwen2:0.5b
|
||||||
|
PARAMETER num_ctx 131072
|
||||||
|
PARAMETER num_gpu 1
|
||||||
|
# Force at least one layer to GPU to trigger Metal backend detection
|
||||||
Binary file not shown.
@@ -0,0 +1,84 @@
|
|||||||
|
import ollama
|
||||||
|
import time
|
||||||
|
import psutil
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
|
||||||
|
def get_vram_usage():
|
||||||
|
try:
|
||||||
|
# On macOS, we can check the 'ollama' process or use 'ollama ps'
|
||||||
|
# For simplicity, we'll shell out to 'ollama ps' to get GPU residency
|
||||||
|
result = os.popen('ollama ps').read()
|
||||||
|
return result
|
||||||
|
except:
|
||||||
|
return "Unknown"
|
||||||
|
|
||||||
|
def benchmark_vision(model_name="moondream", image_path=None):
|
||||||
|
print(f"\n--- Benchmarking Vision: {model_name} ---")
|
||||||
|
if not image_path or not os.path.exists(image_path):
|
||||||
|
print("No image provided for vision test.")
|
||||||
|
return
|
||||||
|
|
||||||
|
start_time = time.time()
|
||||||
|
response = ollama.generate(
|
||||||
|
model=model_name,
|
||||||
|
prompt="Describe this image in detail.",
|
||||||
|
images=[image_path],
|
||||||
|
stream=False
|
||||||
|
)
|
||||||
|
duration = time.time() - start_time
|
||||||
|
|
||||||
|
# Ollama returns tokens/sec in the response metadata
|
||||||
|
eval_count = response.get('eval_count', 0)
|
||||||
|
eval_duration = response.get('eval_duration', 1) / 1e9 # ns to s
|
||||||
|
prompt_eval_count = response.get('prompt_eval_count', 0)
|
||||||
|
prompt_eval_duration = response.get('prompt_eval_duration', 1) / 1e9
|
||||||
|
|
||||||
|
print(f"Vision Response: {response['response'][:100]}...")
|
||||||
|
print(f"Prompt Eval Rate: {prompt_eval_count / prompt_eval_duration:.2f} tokens/s")
|
||||||
|
print(f"Generation Rate: {eval_count / eval_duration:.2f} tokens/s")
|
||||||
|
print(f"VRAM Residency:\n{get_vram_usage()}")
|
||||||
|
|
||||||
|
def benchmark_context(model_name="qwen2-128k", context_size=131072):
|
||||||
|
print(f"\n--- Benchmarking Context: {model_name} ({context_size} tokens) ---")
|
||||||
|
|
||||||
|
# Generate a long dummy context
|
||||||
|
# Each 'word' is approx 1.3 tokens
|
||||||
|
dummy_text = "This is a context verification test. " * (context_size // 10)
|
||||||
|
|
||||||
|
start_time = time.time()
|
||||||
|
response = ollama.generate(
|
||||||
|
model=model_name,
|
||||||
|
prompt=f"{dummy_text}\n\nTask: What was the first sentence of this text?",
|
||||||
|
stream=False
|
||||||
|
)
|
||||||
|
duration = time.time() - start_time
|
||||||
|
|
||||||
|
eval_count = response.get('eval_count', 0)
|
||||||
|
eval_duration = response.get('eval_duration', 1) / 1e9
|
||||||
|
prompt_eval_count = response.get('prompt_eval_count', 0)
|
||||||
|
prompt_eval_duration = response.get('prompt_eval_duration', 1) / 1e9
|
||||||
|
|
||||||
|
print(f"Context Response: {response['response']}")
|
||||||
|
print(f"Prompt Eval Rate (Context Parsing): {prompt_eval_count / prompt_eval_duration:.2f} tokens/s")
|
||||||
|
print(f"Generation Rate: {eval_count / eval_duration:.2f} tokens/s")
|
||||||
|
print(f"VRAM Residency:\n{get_vram_usage()}")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# Ensure we have a sample image
|
||||||
|
# For CI/Automation, we'll try to find any image in the repo or use a placeholder
|
||||||
|
sample_image = "/Users/MWsatwareAG/internal/mw-macbook-pro/ml-test/sample.png"
|
||||||
|
# Create a small dummy image if it doesn't exist for the script to run
|
||||||
|
if not os.path.exists(sample_image):
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
import numpy as np
|
||||||
|
plt.imshow(np.random.rand(100,100,3))
|
||||||
|
plt.savefig(sample_image)
|
||||||
|
print(f"Created dummy image at {sample_image}")
|
||||||
|
|
||||||
|
benchmark_vision(model_name="moondream", image_path=sample_image)
|
||||||
|
# 128k context test
|
||||||
|
try:
|
||||||
|
benchmark_context(model_name="qwen2-128k-gpu")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Context test failed (likely VRAM/OOM): {e}")
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
|
||||||
|
--- Benchmarking Context: qwen2-128k-gpu (8192 tokens) ---
|
||||||
|
Context Response: The first sentence of the given text is "This is a context verification test."
|
||||||
|
Prompt Eval Rate (Context Parsing): 56.30 tokens/s
|
||||||
|
Generation Rate: 17.79 tokens/s
|
||||||
|
VRAM Residency:
|
||||||
|
NAME ID SIZE PROCESSOR CONTEXT UNTIL
|
||||||
|
qwen2-128k-gpu:latest 2ba64284f4e5 547 MB 100% CPU 32768 4 minutes from now
|
||||||
|
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
def main():
|
||||||
|
print("Hello from ml-test!")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
[project]
|
||||||
|
name = "ml-test"
|
||||||
|
version = "0.1.0"
|
||||||
|
description = "Add your description here"
|
||||||
|
readme = "README.md"
|
||||||
|
requires-python = ">=3.12"
|
||||||
|
dependencies = [
|
||||||
|
"torch==2.2.2",
|
||||||
|
"torchvision==0.17.2",
|
||||||
|
"torchaudio==2.2.2",
|
||||||
|
"coremltools",
|
||||||
|
"numpy<2",
|
||||||
|
"pandas",
|
||||||
|
"matplotlib",
|
||||||
|
"ollama>=0.6.1",
|
||||||
|
"psutil>=7.2.2",
|
||||||
|
]
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 56 KiB |
Generated
+1206
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,44 @@
|
|||||||
|
import torch
|
||||||
|
import numpy as np
|
||||||
|
import time
|
||||||
|
import coremltools as ct
|
||||||
|
|
||||||
|
def test_mps():
|
||||||
|
print("--- Testing PyTorch MPS ---")
|
||||||
|
if not torch.backends.mps.is_available():
|
||||||
|
print("MPS not available.")
|
||||||
|
return
|
||||||
|
|
||||||
|
device = torch.device("mps")
|
||||||
|
print(f"Using device: {device}")
|
||||||
|
|
||||||
|
# Create tensors
|
||||||
|
size = 4000
|
||||||
|
x = torch.randn(size, size, device=device)
|
||||||
|
y = torch.randn(size, size, device=device)
|
||||||
|
|
||||||
|
# Warm up
|
||||||
|
_ = torch.matmul(x, y)
|
||||||
|
torch.mps.synchronize()
|
||||||
|
|
||||||
|
# Benchmark
|
||||||
|
start = time.time()
|
||||||
|
for _ in range(10):
|
||||||
|
z = torch.matmul(x, y)
|
||||||
|
torch.mps.synchronize()
|
||||||
|
end = time.time()
|
||||||
|
|
||||||
|
print(f"Matrix multiplication {size}x{size} on MPS took: {(end - start)/10:.4f}s per iteration")
|
||||||
|
print("PyTorch MPS check passed.\n")
|
||||||
|
|
||||||
|
def test_coreml():
|
||||||
|
print("--- Testing CoreML ---")
|
||||||
|
# Simple check for CoreML availability and version
|
||||||
|
print(f"CoreML Tools version: {ct.__version__}")
|
||||||
|
# On macOS, CoreML is always available as a system framework.
|
||||||
|
# The actual execution depends on the model's 'compute_units'.
|
||||||
|
print("CoreML framework is available on macOS.\n")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
test_mps()
|
||||||
|
test_coreml()
|
||||||
Executable
+49
@@ -0,0 +1,49 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# scripts/auth-restart.sh
|
||||||
|
# Performs an authenticated reboot using fdesetup
|
||||||
|
|
||||||
|
echo "Enter your Mac password to perform an authenticated restart for FileVault:"
|
||||||
|
echo "(Typing will be hidden. The Mac will reboot immediately upon success.)"
|
||||||
|
read -s -p "Password: " PASS
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
if [ -z "$PASS" ]; then
|
||||||
|
echo "Operation cancelled or no password provided."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Verifying password..."
|
||||||
|
# Verify and cache sudo credentials so we don't have to expect the sudo prompt
|
||||||
|
echo "$PASS" | sudo -S -v 2>/dev/null
|
||||||
|
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "Incorrect password or sudo authorization failed."
|
||||||
|
PASS=""
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Authorization successful. Initiating FileVault authenticated restart..."
|
||||||
|
|
||||||
|
# Run fdesetup and feed the password using expect using env variables for safety
|
||||||
|
export PASS
|
||||||
|
expect -c '
|
||||||
|
set timeout 30
|
||||||
|
spawn sudo fdesetup authrestart
|
||||||
|
|
||||||
|
expect {
|
||||||
|
-re "(?i)(password|recovery key)" {
|
||||||
|
send "$env(PASS)\r"
|
||||||
|
exp_continue
|
||||||
|
}
|
||||||
|
timeout {
|
||||||
|
puts "\nError: Timeout waiting for fdesetup prompt."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
eof {
|
||||||
|
puts "\nAuthenticated restart initiated."
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
'
|
||||||
|
|
||||||
|
PASS=""
|
||||||
Executable
+29
@@ -0,0 +1,29 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# macOS script to delete unused user accounts
|
||||||
|
# Removes specified users to optimize machine for dedicated automation tasks
|
||||||
|
|
||||||
|
USERS_TO_DELETE=("awsatwareag" "EEsatwareAG" "firebird")
|
||||||
|
|
||||||
|
echo "Starting user account deletion..."
|
||||||
|
|
||||||
|
for user in "${USERS_TO_DELETE[@]}"; do
|
||||||
|
# Check if the user exists in Directory Services
|
||||||
|
if dscl . -read "/Users/$user" > /dev/null 2>&1; then
|
||||||
|
echo "Deleting user: $user"
|
||||||
|
sudo sysadminctl -deleteUser "$user"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Ensure home directory is completely removed
|
||||||
|
if [ -d "/Users/$user" ]; then
|
||||||
|
echo "Removing residual home directory: /Users/$user"
|
||||||
|
sudo rm -rf "/Users/$user"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if neither existed
|
||||||
|
if ! dscl . -read "/Users/$user" > /dev/null 2>&1 && [ ! -d "/Users/$user" ]; then
|
||||||
|
echo "Not found or completely removed: $user"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "User account deletion script complete."
|
||||||
@@ -6,7 +6,7 @@ launchctl list | grep ai.openclaw
|
|||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
echo "--- Connectivity Check ---"
|
echo "--- Connectivity Check ---"
|
||||||
curl -i http://127.0.0.1:18789/health
|
curl -i http://100.64.0.39:18789/health
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
echo "--- Node Logs (Last 10 lines) ---"
|
echo "--- Node Logs (Last 10 lines) ---"
|
||||||
|
|||||||
Executable
+64
@@ -0,0 +1,64 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# OpenClaw Connection Repair Watcher
|
||||||
|
|
||||||
|
LOG_FILE="$HOME/.openclaw/logs/repair.log"
|
||||||
|
HEALTH_URL="http://100.64.0.39:18789/health"
|
||||||
|
REMOTE_HOST="100.64.0.39"
|
||||||
|
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
|
||||||
|
|
||||||
|
log() {
|
||||||
|
echo "[$TIMESTAMP] $1" >> "$LOG_FILE"
|
||||||
|
}
|
||||||
|
|
||||||
|
check_health() {
|
||||||
|
# Attempt to fetch health status with a short timeout
|
||||||
|
HEALTH_STATUS=$(curl -s -m 5 "$HEALTH_URL")
|
||||||
|
if [[ "$HEALTH_STATUS" == *'"ok":true'* ]]; then
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
check_remote() {
|
||||||
|
# Check if remote host is reachable via Tailscale
|
||||||
|
if ping -c 1 -W 2 "$REMOTE_HOST" > /dev/null 2>&1; then
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
repair() {
|
||||||
|
log "Connection loss detected. Attempting repair..."
|
||||||
|
|
||||||
|
# Restart SSH tunnel if it exists
|
||||||
|
if launchctl list | grep -q ai.openclaw.ssh-tunnel; then
|
||||||
|
log "Restarting ai.openclaw.ssh-tunnel..."
|
||||||
|
launchctl stop ai.openclaw.ssh-tunnel 2>/dev/null
|
||||||
|
launchctl start ai.openclaw.ssh-tunnel
|
||||||
|
sleep 5
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Restart OpenClaw node
|
||||||
|
log "Restarting ai.openclaw.node..."
|
||||||
|
launchctl stop ai.openclaw.node 2>/dev/null
|
||||||
|
launchctl start ai.openclaw.node
|
||||||
|
|
||||||
|
log "Repair attempt completed."
|
||||||
|
}
|
||||||
|
|
||||||
|
# Main Watcher Logic
|
||||||
|
log "Starting health check..."
|
||||||
|
if ! check_health; then
|
||||||
|
log "Health check failed for $HEALTH_URL"
|
||||||
|
if ! check_remote; then
|
||||||
|
log "Remote host $REMOTE_HOST is unreachable. Is Tailscale connected?"
|
||||||
|
else
|
||||||
|
repair
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# Connection is healthy, log and exit
|
||||||
|
log "Health check passed. Connection is healthy."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
Executable
+32
@@ -0,0 +1,32 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# macOS uninstallation script for UI-heavy applications
|
||||||
|
# Generated to optimize the machine for automation tasks
|
||||||
|
|
||||||
|
APPS=(
|
||||||
|
"/Applications/Adobe Acrobat DC"
|
||||||
|
"/Applications/Adobe Creative Cloud"
|
||||||
|
"/Applications/Adobe Media Encoder 2025"
|
||||||
|
"/Applications/CapCut.app"
|
||||||
|
"/Applications/Mattermost.app"
|
||||||
|
"/Applications/Microsoft Teams.app"
|
||||||
|
"/Applications/WhatsApp.app"
|
||||||
|
"/Applications/eM Client.app"
|
||||||
|
"/Applications/Prime Video.app"
|
||||||
|
"/Applications/wand.app"
|
||||||
|
"/Applications/UP Studio3.app"
|
||||||
|
"/Applications/Numbers.app"
|
||||||
|
)
|
||||||
|
|
||||||
|
echo "Starting uninstallation of UI-heavy applications..."
|
||||||
|
|
||||||
|
for app in "${APPS[@]}"; do
|
||||||
|
if [ -e "$app" ]; then
|
||||||
|
echo "Removing: $app"
|
||||||
|
sudo rm -rf "$app"
|
||||||
|
else
|
||||||
|
echo "Not found (already removed): $app"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Uninstallation script complete."
|
||||||
Executable
+64
@@ -0,0 +1,64 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
echo "Uninstalling Adobe Services, GOG, TeamViewer, Firebird, and Tunnelblick..."
|
||||||
|
|
||||||
|
# 1. Kill processes
|
||||||
|
echo "Killing related processes..."
|
||||||
|
sudo killall -9 TeamViewer "GOG Galaxy" Tunnelblick "Adobe Desktop Service" CCXProcess CoreSync "Adobe CCXProcess" "Creative Cloud" AdobeIPCBroker "Adobe CEF Helper" fbserver gds_drop 2>/dev/null || true
|
||||||
|
|
||||||
|
# 2. Unload Launch Daemons
|
||||||
|
echo "Unloading System Daemons..."
|
||||||
|
for daemon in /Library/LaunchDaemons/com.teamviewer.* /Library/LaunchDaemons/com.gog.* /Library/LaunchDaemons/net.tunnelblick.* /Library/LaunchDaemons/org.firebird.* /Library/LaunchDaemons/com.adobe.*; do
|
||||||
|
if [ -f "$daemon" ]; then
|
||||||
|
sudo launchctl unload "$daemon" 2>/dev/null || true
|
||||||
|
sudo rm -f "$daemon"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# 3. Unload Launch Agents
|
||||||
|
echo "Unloading System Agents..."
|
||||||
|
for agent in /Library/LaunchAgents/com.teamviewer.* /Library/LaunchAgents/com.gog.* /Library/LaunchAgents/com.adobe.*; do
|
||||||
|
if [ -f "$agent" ]; then
|
||||||
|
# Try both older unload and newer bootout just in case
|
||||||
|
sudo launchctl unload "$agent" 2>/dev/null || true
|
||||||
|
for uid in $(dscl . -list /Users UniqueID | awk '$2 >= 500 {print $2}'); do
|
||||||
|
sudo launchctl bootout gui/$uid "$agent" 2>/dev/null || true
|
||||||
|
done
|
||||||
|
sudo rm -f "$agent"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Unloading User Agents..."
|
||||||
|
for user_agent in ~/Library/LaunchAgents/com.adobe.*; do
|
||||||
|
if [ -f "$user_agent" ]; then
|
||||||
|
launchctl unload "$user_agent" 2>/dev/null || true
|
||||||
|
rm -f "$user_agent"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# 4. Remove App Directories
|
||||||
|
echo "Removing Application Files..."
|
||||||
|
sudo rm -rf "/Applications/TeamViewer.app"
|
||||||
|
sudo rm -rf "/Applications/GOG Galaxy.app"
|
||||||
|
sudo rm -rf "/Applications/Tunnelblick.app"
|
||||||
|
|
||||||
|
# Firebird standard manual installation locations
|
||||||
|
sudo rm -rf "/Library/Frameworks/Firebird.framework"
|
||||||
|
sudo rm -rf "/opt/firebird"
|
||||||
|
|
||||||
|
# Common Adobe paths
|
||||||
|
sudo rm -rf "/Applications/Adobe"*
|
||||||
|
sudo rm -rf "/Applications/Utilities/Adobe"*
|
||||||
|
|
||||||
|
# Application Support
|
||||||
|
sudo rm -rf "/Library/Application Support/Adobe"
|
||||||
|
sudo rm -rf "/Library/Application Support/TeamViewer"
|
||||||
|
sudo rm -rf "/Library/Application Support/GOG.com"
|
||||||
|
sudo rm -rf "/Library/Application Support/Tunnelblick"
|
||||||
|
|
||||||
|
# Try homebrew just in case some were installed via brew casks
|
||||||
|
echo "Checking Homebrew casks..."
|
||||||
|
brew uninstall --cask tunnelblick teamviewer gog-galaxy 2>/dev/null || true
|
||||||
|
brew uninstall firebird 2>/dev/null || true
|
||||||
|
|
||||||
|
echo "Uninstallation finished successfully."
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"version": 1,
|
||||||
|
"registry": "https://clawhub.ai",
|
||||||
|
"slug": "blogwatcher",
|
||||||
|
"installedVersion": "1.0.0",
|
||||||
|
"installedAt": 1774106354348
|
||||||
|
}
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
---
|
||||||
|
name: blogwatcher
|
||||||
|
description: Monitor blogs and RSS/Atom feeds for updates using the blogwatcher CLI.
|
||||||
|
homepage: https://github.com/Hyaxia/blogwatcher
|
||||||
|
metadata: {"clawdbot":{"emoji":"📰","requires":{"bins":["blogwatcher"]},"install":[{"id":"go","kind":"go","module":"github.com/Hyaxia/blogwatcher/cmd/blogwatcher@latest","bins":["blogwatcher"],"label":"Install blogwatcher (go)"}]}}
|
||||||
|
---
|
||||||
|
|
||||||
|
# blogwatcher
|
||||||
|
|
||||||
|
Track blog and RSS/Atom feed updates with the `blogwatcher` CLI.
|
||||||
|
|
||||||
|
Install
|
||||||
|
- Go: `go install github.com/Hyaxia/blogwatcher/cmd/blogwatcher@latest`
|
||||||
|
|
||||||
|
Quick start
|
||||||
|
- `blogwatcher --help`
|
||||||
|
|
||||||
|
Common commands
|
||||||
|
- Add a blog: `blogwatcher add "My Blog" https://example.com`
|
||||||
|
- List blogs: `blogwatcher blogs`
|
||||||
|
- Scan for updates: `blogwatcher scan`
|
||||||
|
- List articles: `blogwatcher articles`
|
||||||
|
- Mark an article read: `blogwatcher read 1`
|
||||||
|
- Mark all articles read: `blogwatcher read-all`
|
||||||
|
- Remove a blog: `blogwatcher remove "My Blog"`
|
||||||
|
|
||||||
|
Example output
|
||||||
|
```
|
||||||
|
$ blogwatcher blogs
|
||||||
|
Tracked blogs (1):
|
||||||
|
|
||||||
|
xkcd
|
||||||
|
URL: https://xkcd.com
|
||||||
|
```
|
||||||
|
```
|
||||||
|
$ blogwatcher scan
|
||||||
|
Scanning 1 blog(s)...
|
||||||
|
|
||||||
|
xkcd
|
||||||
|
Source: RSS | Found: 4 | New: 4
|
||||||
|
|
||||||
|
Found 4 new article(s) total!
|
||||||
|
```
|
||||||
|
|
||||||
|
Notes
|
||||||
|
- Use `blogwatcher <command> --help` to discover flags and options.
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"ownerId": "kn70pywhg0fyz996kpa8xj89s57yhv26",
|
||||||
|
"slug": "blogwatcher",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"publishedAt": 1767545299849
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user