Compare commits

...
11 Commits
Author SHA1 Message Date
mwandJunie b4a582af34 feat(automation): add optimization scripts and update docs for EOD
Co-authored-by: Junie <junie@jetbrains.com>
2026-04-01 17:16:48 +02:00
mw 8af92de50b chore: add gitleaks baseline for historical secrets 2026-03-31 17:17:53 +02:00
mw 23f383e0f0 chore: remove exposed API key from .env.example 2026-03-31 17:17:42 +02:00
mw f2a9ab23fc docs: integrate script references into README 2026-03-31 17:07:34 +02:00
mw aeeb5faea2 docs: Update OpenClaw architecture and VLM prompting guidelines 2026-03-31 17:06:37 +02:00
mw dc18c1cd8b fix(openclaw): disable conflicting scripts and update target remote 2026-03-31 13:42:30 +02:00
mwandJunie a28a4a049b docs: bump OpenClaw node version to 2026.3.28 and align remote maintenance docs
- Update OpenClaw version references from 2026.3.13 to 2026.3.28 in README.md, docs/OPENCLAW_ARCHITECTURE.md, and gateway_plugins.txt.
- Remove outdated MacOS maintenance instructions (log rotation, credential syncing) from remote luca project.
- Redirect remote luca documentation to explicitly refer back to the mw-macbook-pro repository for MacOS-specific routines.
- Updated CHANGELOG to reflect version bump and cross-repo document alignments.
- Removed completed implementation plan.

Co-authored-by: Junie <junie@jetbrains.com>
2026-03-30 17:08:57 +02:00
mwandJunie f54fc1d9cd chore: final EOD repository hygiene and untracked files
Co-authored-by: Junie <junie@jetbrains.com>
2026-03-22 11:30:14 +01:00
mwandJunie a839772032 docs: add NEXT_STEPS.md for future maintenance and expansion
Co-authored-by: Junie <junie@jetbrains.com>
2026-03-22 11:18:46 +01:00
mwandJunie d64156ce14 chore: update plugins and skills tracking files
Co-authored-by: Junie <junie@jetbrains.com>
2026-03-22 11:16:09 +01:00
mwandJunie be00d893d2 docs: update README and CHANGELOG with stable SSH tunnel architecture
Co-authored-by: Junie <junie@jetbrains.com>
2026-03-22 11:16:03 +01:00
35 changed files with 2010 additions and 40 deletions
+4
View File
@@ -16,6 +16,10 @@
"openclaw-mission-control": {
"version": "1.0.0",
"installedAt": 1773121517750
},
"blogwatcher": {
"version": "1.0.0",
"installedAt": 1774106354350
}
}
}
+16
View File
@@ -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
View File
@@ -2,7 +2,7 @@
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1
PWD=/Users/MWsatwareAG/internal/mw-macbook-pro
OLDPWD=/Users/MWsatwareAG/internal/mw-macbook-pro/imsg
ELEVENLABS_API_KEY=
ELEVENLABS_API_KEY=your_api_key_here
HOMEBREW_CELLAR=/usr/local/Cellar
INFOPATH=/usr/local/share/info
KITTY_PUBLIC_KEY=
+22
View File
@@ -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
View File
@@ -1 +1 @@
[{"lang":"en","usageCount":40}]
[{"lang":"en","usageCount":69}]
+20
View File
@@ -3,6 +3,26 @@
All notable changes to this repository are documented in this file.
## [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
+16
View File
@@ -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.
+52
View File
@@ -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.
+33 -26
View File
@@ -17,9 +17,8 @@ This repository documents the OpenClaw gateway integration for the satware AG Ma
| **OS** | macOS 26.3.1 (Tahoe) |
| **Kernel** | Darwin 25.3.0 (x86_64) |
| **User** | MWsatwareAG |
| **Local IP** | 10.11.206.26 (en0) |
| **Tailscale IP** | 100.64.0.12 |
| **OpenClaw Version** | core v2026.3.8 |
| **Local IP** | 100.64.0.12 (Tailscale) |
| **OpenClaw Version** | core v2026.3.28 |
## Node Configuration
@@ -37,10 +36,10 @@ This repository documents the OpenClaw gateway integration for the satware AG Ma
│ │ │ │
│ OpenClaw Node │ WebSocket │ OpenClaw Gateway │
│ (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 │
│──────────────────►│ Port 2222 │
(LaunchAgent) │──────────────────►│ Port 2222 │
└─────────────────────┘ └─────────────────────┘
```
@@ -48,20 +47,24 @@ This repository documents the OpenClaw gateway integration for the satware AG Ma
```json
{
"meta": {
"lastTouchedVersion": "2026.3.8"
"lastTouchedVersion": "2026.3.28"
},
"gateway": {
"mode": "remote",
"remote": {
"url": "ws://100.64.0.39:18789",
"token": "skt3_W8A5AVp...",
"sshTarget": "root@100.64.0.39:2222",
"sshIdentity": "/Users/MWsatwareAG/.ssh/id_ed25519"
"url": "ws://127.0.0.1:18789"
}
}
}
```
### 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`)
```json
{
@@ -342,34 +345,33 @@ glab auth login --hostname gitlab.satware.com --token <TOKEN>
## Verification Status
**Last Verified**: 2026-03-11 23:15 CET
**Last Verified**: 2026-03-22 11:30 CET
| Component | Status |
|-----------|--------|
| **Node Connection** | ✅ Paired & Connected |
| **Gateway Health** | ✅ OK (158ms via Tailscale) |
| **Node Connection** | ✅ Paired & Connected (Headless + App) |
| **Gateway Health** | ✅ OK (Transparent via SSH Tunnel) |
| **system.run** | ✅ Working |
| **Vision (Peekaboo)**| ✅ 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 |
|---------|--------|---------|
| `ai.openclaw.node` | Running | Primary Node service (v2026.3.8) |
| `ai.openclaw.gateway` | Unloaded | Disabled (remote node role) |
| `com.satware.openclaw-tunnel` | Running | SSH tunnel to gateway |
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.
| Component | Status | Purpose |
|-----------|--------|---------|
| `OpenClaw.app` | Running | macOS Companion App (Node & SSH Tunnel Manager) |
### Management Commands (on MacBook)
```bash
# Check service status
launchctl list | grep openclaw
# Check running application
ps aux | grep -i openclaw | grep -v grep
# Restart SSH tunnel
launchctl unload ~/Library/LaunchAgents/com.satware.openclaw-tunnel.plist
launchctl load ~/Library/LaunchAgents/com.satware.openclaw-tunnel.plist
# Restart Node
# Quit the OpenClaw app from the macOS menu bar and reopen it from /Applications
```
### Verify from Gateway
@@ -385,6 +387,11 @@ docker exec agent-zero openclaw nodes invoke \
--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)
+39 -11
View File
@@ -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`.
#### B. Layer 2: SSH Tunnel (Container Entry)
* **Service**: `ai.openclaw.ssh-tunnel.plist`
* **Command**: `ssh -N -L 18789:172.18.0.2:18789 root@100.64.0.39 -p 2222`
* **Service**: Handled natively by `/Applications/OpenClaw.app`
* **Command**: `ssh -N -L 18789:127.0.0.1:18789 -p 2222 root@100.64.0.39`
* **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.
2. The `-L 18789:172.18.0.2: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`).
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.
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: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 port (`18789`).
#### C. Layer 3: WebSocket Node Connection
* **Service**: `ai.openclaw.node.plist`
* **Command**: `openclaw node run --host 127.0.0.1 --port 18789`
* **Service**: `OpenClaw.app` Mac Companion App
* **How it works**:
1. The node process starts on the MacBook.
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.
3. It authenticates using the `OPENCLAW_GATEWAY_TOKEN` provided in the environment variables.
1. The node process runs embedded within the Companion App.
2. It uses the provided SSH tunnel transparently based on the settings in `~/.openclaw/openclaw.json`.
3. It authenticates using the stored remote token.
### 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?
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.
+105
View File
@@ -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
+1
View File
@@ -0,0 +1 @@
3.12
+29
View File
@@ -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.
+3
View File
@@ -0,0 +1,3 @@
FROM qwen2:0.5b
PARAMETER num_ctx 131072
PARAMETER num_gpu 99
+4
View File
@@ -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
View File
Binary file not shown.
+84
View File
@@ -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}")
View File
+9
View File
@@ -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
View File
+6
View File
@@ -0,0 +1,6 @@
def main():
print("Hello from ml-test!")
if __name__ == "__main__":
main()
+17
View File
@@ -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

+1206
View File
File diff suppressed because it is too large Load Diff
+44
View File
@@ -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()
+49
View File
@@ -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=""
+29
View File
@@ -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."
+1 -1
View File
@@ -6,7 +6,7 @@ launchctl list | grep ai.openclaw
echo ""
echo "--- Connectivity Check ---"
curl -i http://127.0.0.1:18789/health
curl -i http://100.64.0.39:18789/health
echo ""
echo "--- Node Logs (Last 10 lines) ---"
+64
View File
@@ -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
+32
View File
@@ -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."
+64
View File
@@ -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."
+7
View File
@@ -0,0 +1,7 @@
{
"version": 1,
"registry": "https://clawhub.ai",
"slug": "blogwatcher",
"installedVersion": "1.0.0",
"installedAt": 1774106354348
}
+46
View File
@@ -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.
+6
View File
@@ -0,0 +1,6 @@
{
"ownerId": "kn70pywhg0fyz996kpa8xj89s57yhv26",
"slug": "blogwatcher",
"version": "1.0.0",
"publishedAt": 1767545299849
}