before cleaning
This commit is contained in:
parent
ded4cd061a
commit
319523a33d
104
CLAUDE.md
104
CLAUDE.md
|
|
@ -1,9 +1,9 @@
|
|||
# 🚀 AI Dev Factory - Session Continuation Guide
|
||||
|
||||
**Last Updated:** 2024-11-28
|
||||
**Current Phase:** Phase 2 - OpenHands Integration (API Mode)
|
||||
**Time to Completion:** ~3-4 hours
|
||||
**Next Approach:** OpenHands Server API Mode ✅
|
||||
**Last Updated:** 2025-12-01
|
||||
**Current Phase:** Phase 2 - OpenHands Integration (SDK Mode) ✅ COMPLETED
|
||||
**Time to Completion:** ✅ All tasks completed
|
||||
**Current Approach:** OpenHands SDK via SSH wrapper ✅
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -13,15 +13,22 @@
|
|||
- **Gitea:** https://git.oky.sh (HTTPS, PostgreSQL backend)
|
||||
- **n8n:** https://n8n.oky.sh (HTTPS, workflow automation)
|
||||
- **Caddy:** Auto SSL with Let's Encrypt
|
||||
- **SSH:** n8n → localhost credentials configured
|
||||
- **SSH:** n8n → localhost credentials configured and working
|
||||
- **OpenHands CLI:** `/home/bam/.local/bin/openhands` (v1.3.0)
|
||||
- **OpenHands SDK Wrapper:** `/home/bam/openhands-sdk-wrapper-sh.sh` (sh-compatible)
|
||||
- **Working n8n Workflow:** "OpenHands SDK Clean Working" (ID: 9cgyx4hHEvGjyEaE)
|
||||
|
||||
### ⚠️ Current Blocker:
|
||||
- OpenHands headless mode (Docker) hangs on runtime startup
|
||||
- **Solution:** Switch to OpenHands Server API mode
|
||||
### ✅ Completed:
|
||||
- **SSH Authentication Fixed** - Directory permissions corrected
|
||||
- **n8n Workflow Created** - Successfully executes OpenHands SDK tasks
|
||||
- **File Verification Working** - Workflow confirms file creation
|
||||
- **Clean Workflow Structure** - Editable in n8n UI without errors
|
||||
- **Workflow Cleanup Completed** - Deleted 20 test workflows, kept only working one
|
||||
- **Temporary Files Cleaned** - Removed all test files and unnecessary scripts
|
||||
- **Database Updated** - Only "OpenHands SDK Clean Working" remains (ID: 9cgyx4hHEvGjyEaE)
|
||||
|
||||
### 🎯 Goal:
|
||||
Create automated workflow: Gitea push → n8n → OpenHands API → Build/Test
|
||||
Create automated workflow: Gitea push → n8n → OpenHands SDK (via SSH) → Build/Test
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -72,58 +79,45 @@ docker compose ps
|
|||
|
||||
---
|
||||
|
||||
## 🎯 NEXT STEPS: OpenHands Server API Setup
|
||||
## 🎯 NEXT STEPS: Gitea Webhook Integration with OpenHands SDK
|
||||
|
||||
### Step 1: Start OpenHands in Server Mode (15 min)
|
||||
### Step 1: Create Gitea Webhook (10 min)
|
||||
|
||||
**Goal:** Run OpenHands as persistent HTTP API service
|
||||
**Goal:** Trigger n8n workflow on git push events
|
||||
|
||||
**OpenHands serve uses port 3000 by default (cannot be changed in current version)**
|
||||
**In Gitea (https://git.oky.sh):**
|
||||
1. Go to repository Settings → Webhooks → Add Webhook → Gitea
|
||||
2. Configure:
|
||||
```
|
||||
Target URL: https://n8n.oky.sh/webhook/gitea-push
|
||||
HTTP Method: POST
|
||||
Content Type: application/json
|
||||
Secret: [generate random string]
|
||||
Trigger On: Push events
|
||||
Active: ✓
|
||||
```
|
||||
3. Save and test the webhook
|
||||
|
||||
```bash
|
||||
# Test server startup
|
||||
/home/bam/.local/bin/openhands serve
|
||||
### Step 2: Create Webhook-Triggered n8n Workflow (30 min)
|
||||
|
||||
# Expected: Server starts, listens on http://localhost:3000
|
||||
**Goal:** Replace manual trigger with webhook that calls OpenHands SDK
|
||||
|
||||
**Workflow Design:**
|
||||
```
|
||||
|
||||
**Create systemd service for persistence:**
|
||||
```bash
|
||||
sudo nano /etc/systemd/system/openhands.service
|
||||
|
||||
# Paste:
|
||||
[Unit]
|
||||
Description=OpenHands Server
|
||||
After=network.target docker.service
|
||||
Requires=docker.service
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=bam
|
||||
WorkingDirectory=/home/bam
|
||||
Environment="PATH=/home/bam/.local/bin:/usr/local/bin:/usr/bin:/bin"
|
||||
EnvironmentFile=/home/bam/openhands/.env
|
||||
ExecStart=/home/bam/.local/bin/openhands serve
|
||||
Restart=always
|
||||
RestartSec=10
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
|
||||
# Save and enable:
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable openhands.service
|
||||
sudo systemctl start openhands.service
|
||||
sudo systemctl status openhands.service
|
||||
```
|
||||
|
||||
**Verify:**
|
||||
```bash
|
||||
# Check if running
|
||||
curl http://localhost:3000/
|
||||
|
||||
# Check logs
|
||||
sudo journalctl -u openhands.service -f
|
||||
[1] Webhook Trigger (Gitea push)
|
||||
↓
|
||||
[2] Extract repo info (JSON parser)
|
||||
↓
|
||||
[3] SSH - Clone/Update Repository
|
||||
↓
|
||||
[4] SSH - Execute OpenHands SDK (Wrapper)
|
||||
→ Task: "Build and test project {{ $json.repository.name }}"
|
||||
↓
|
||||
[5] SSH - Verify Build Success
|
||||
→ Check for build artifacts
|
||||
↓
|
||||
[6] HTTP - Update Gitea Commit Status
|
||||
→ POST to Gitea API with success/failure
|
||||
```
|
||||
|
||||
---
|
||||
|
|
|
|||
|
|
@ -0,0 +1,232 @@
|
|||
# OpenHands SDK + n8n Integration Guide
|
||||
|
||||
**Updated:** 2025-12-01
|
||||
**Status:** ✅ WORKING - SDK wrapper approach successful
|
||||
|
||||
## ✅ What's Working
|
||||
|
||||
### Core Components:
|
||||
- **OpenHands CLI:** `/home/bam/.local/bin/openhands` (v1.3.0)
|
||||
- **SDK Wrapper:** `/home/bam/openhands-sdk-wrapper-sh.sh` (sh-compatible)
|
||||
- **n8n Workflow:** "OpenHands SDK Clean Working" (ID: 9cgyx4hHEvGjyEaE)
|
||||
- **SSH Authentication:** Working (permissions fixed)
|
||||
- **File Verification:** Working (workflow confirms creation)
|
||||
|
||||
### Key Files:
|
||||
```
|
||||
/home/bam/openhands-sdk-wrapper-sh.sh # Main wrapper script (sh-compatible)
|
||||
/home/bam/OPENHANDS_N8N_WORKING.json # Working n8n workflow template
|
||||
/home/bam/openhands/.env # API keys (MiniMax, DeepSeek)
|
||||
/home/bam/.ssh/ # SSH credentials (fixed permissions)
|
||||
```
|
||||
|
||||
## 🎯 Next Steps: Gitea Webhook Integration
|
||||
|
||||
### Step 1: Create Gitea Repository & Webhook
|
||||
|
||||
**In Gitea (https://git.oky.sh):**
|
||||
|
||||
1. **Create Test Repository:**
|
||||
```bash
|
||||
# Or via web UI: New Repository → "test-project"
|
||||
```
|
||||
|
||||
2. **Add Webhook:**
|
||||
- Settings → Webhooks → Add Webhook → Gitea
|
||||
- **URL:** `https://n8n.oky.sh/webhook/gitea-push`
|
||||
- **Method:** POST
|
||||
- **Content Type:** application/json
|
||||
- **Secret:** [generate random string]
|
||||
- **Trigger:** Push events
|
||||
- **Active:** ✓
|
||||
|
||||
### Step 2: Update n8n Workflow for Webhook
|
||||
|
||||
**Current Workflow:** Manual Trigger → OpenHands SDK → Verify
|
||||
|
||||
**New Workflow Design:**
|
||||
```
|
||||
[1] Webhook Trigger (Gitea push)
|
||||
↓
|
||||
[2] JSON Parser - Extract repo info
|
||||
↓
|
||||
[3] SSH - Clone repository
|
||||
→ git clone https://git.oky.sh/user/repo.git /home/bam/workspace/repo
|
||||
↓
|
||||
[4] SSH - Execute OpenHands SDK
|
||||
→ sh /home/bam/openhands-sdk-wrapper-sh.sh "Build and test project {{ $json.repository.name }}"
|
||||
↓
|
||||
[5] SSH - Verify build artifacts
|
||||
→ Check for dist/, build/, or test results
|
||||
↓
|
||||
[6] HTTP - Update Gitea commit status
|
||||
→ POST /api/v1/repos/{owner}/{repo}/statuses/{sha}
|
||||
```
|
||||
|
||||
### Step 3: n8n Webhook Node Configuration
|
||||
|
||||
**Node 1: Webhook Trigger**
|
||||
```json
|
||||
{
|
||||
"path": "gitea-push",
|
||||
"httpMethod": "POST",
|
||||
"responseMode": "responseNode"
|
||||
}
|
||||
```
|
||||
|
||||
**Node 2: Extract Data (Set Node)**
|
||||
```json
|
||||
{
|
||||
"repository": "{{ $json.repository.full_name }}",
|
||||
"clone_url": "{{ $json.repository.clone_url }}",
|
||||
"commit": "{{ $json.after }}",
|
||||
"branch": "{{ $json.ref }}"
|
||||
}
|
||||
```
|
||||
|
||||
**Node 3: Clone Repo (SSH Node)**
|
||||
```bash
|
||||
cd /home/bam/workspace
|
||||
if [ -d "{{ $json.repository.name }}" ]; then
|
||||
cd {{ $json.repository.name }} && git pull
|
||||
else
|
||||
git clone {{ $json.clone_url }}
|
||||
fi
|
||||
```
|
||||
|
||||
**Node 4: Execute OpenHands (SSH Node)**
|
||||
```bash
|
||||
sh /home/bam/openhands-sdk-wrapper-sh.sh \
|
||||
"Navigate to /home/bam/workspace/{{ $json.repository.name }} and run: npm install && npm test && npm build. Report any errors."
|
||||
```
|
||||
|
||||
**Node 5: Verify Success (SSH Node)**
|
||||
```bash
|
||||
cd /home/bam/workspace/{{ $json.repository.name }}
|
||||
if [ -d "dist" ] || [ -f "build/index.html" ]; then
|
||||
echo "BUILD_SUCCESS"
|
||||
else
|
||||
echo "BUILD_FAILED"
|
||||
fi
|
||||
```
|
||||
|
||||
**Node 6: Update Gitea (HTTP Request)**
|
||||
```json
|
||||
{
|
||||
"url": "https://git.oky.sh/api/v1/repos/{{ $json.repository }}/statuses/{{ $json.commit }}",
|
||||
"method": "POST",
|
||||
"headers": {
|
||||
"Authorization": "token YOUR_GITEA_TOKEN",
|
||||
"Content-Type": "application/json"
|
||||
},
|
||||
"body": {
|
||||
"state": "success",
|
||||
"description": "Build passed - OpenHands SDK",
|
||||
"context": "openhands/build"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 🧪 Testing Workflow
|
||||
|
||||
### Test 1: Manual Webhook Test
|
||||
```bash
|
||||
# In Gitea webhook settings, click "Test Delivery"
|
||||
# Should trigger n8n workflow
|
||||
```
|
||||
|
||||
### Test 2: Git Push Test
|
||||
```bash
|
||||
cd /home/bam/workspace/test-project
|
||||
echo "Test" > README.md
|
||||
git add .
|
||||
git commit -m "Test webhook trigger"
|
||||
git push origin main
|
||||
|
||||
# Check n8n execution at: https://n8n.oky.sh
|
||||
# Verify OpenHands SDK executed
|
||||
# Check Gitea commit status updated
|
||||
```
|
||||
|
||||
### Test 3: Build Failure Test
|
||||
```bash
|
||||
# Add intentional error to code
|
||||
git commit -am "Introduce syntax error" && git push
|
||||
|
||||
# Verify:
|
||||
# - n8n workflow runs
|
||||
# - OpenHands SDK detects error
|
||||
# - Gitea commit status shows "failure"
|
||||
```
|
||||
|
||||
## 📋 Node Configuration Details
|
||||
|
||||
### SSH Nodes (Repeat for each):
|
||||
- **Credential:** SSH Private Key account
|
||||
- **Authentication:** privateKey
|
||||
- **Host:** localhost
|
||||
- **User:** bam
|
||||
|
||||
### Environment Variables:
|
||||
```bash
|
||||
# Loaded by wrapper script from /home/bam/openhands/.env:
|
||||
MINIMAX_API_KEY=xxx # Primary LLM
|
||||
DEEPSEEK_API_KEY=xxx # Fallback LLM
|
||||
```
|
||||
|
||||
## ✅ Success Criteria
|
||||
|
||||
**Integration Complete When:**
|
||||
1. ✅ Git push triggers n8n workflow
|
||||
2. ✅ n8n clones repository
|
||||
3. ✅ OpenHands SDK executes build/test
|
||||
4. ✅ Workflow returns success/failure
|
||||
5. ✅ Gitea commit status updated
|
||||
6. ✅ End-to-end: Push → Build → Status Update
|
||||
|
||||
## 🔧 Troubleshooting
|
||||
|
||||
### SSH Authentication Fails:
|
||||
```bash
|
||||
# Check ownership
|
||||
sudo chown -R bam:bam /home/bam /home/bam/.ssh
|
||||
sudo chmod 755 /home/bam
|
||||
```
|
||||
|
||||
### Webhook Not Triggering:
|
||||
```bash
|
||||
# Check n8n webhook URL
|
||||
curl https://n8n.oky.sh/webhook/gitea-push
|
||||
|
||||
# Check Gitea webhook logs
|
||||
# Repository → Settings → Webhooks → Recent Deliveries
|
||||
```
|
||||
|
||||
### OpenHands SDK Hangs:
|
||||
```bash
|
||||
# Wrapper script should handle this
|
||||
# Check /tmp/software-agent-sdk/ logs
|
||||
tail -f /tmp/software-agent-sdk/logs/*.log
|
||||
```
|
||||
|
||||
## 📚 Quick Reference
|
||||
|
||||
### Workflow ID:
|
||||
- **Production:** `9cgyx4hHEvGjyEaE` (OpenHands SDK Clean Working)
|
||||
|
||||
### Wrapper Usage:
|
||||
```bash
|
||||
sh /home/bam/openhands-sdk-wrapper-sh.sh "Your task description here"
|
||||
```
|
||||
|
||||
### Test Workflow:
|
||||
```bash
|
||||
# In n8n UI: https://n8n.oky.sh
|
||||
# Click "OpenHands SDK Clean Working"
|
||||
# Click "Execute Workflow"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Current Status:** Ready to proceed with Gitea webhook integration
|
||||
**Next Action:** Create test repository and configure webhook
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
{
|
||||
"name": "OpenHands SDK Clean Working",
|
||||
"nodes": [
|
||||
{
|
||||
"parameters": {},
|
||||
"id": "start-trigger",
|
||||
"name": "Manual Trigger",
|
||||
"type": "n8n-nodes-base.manualTrigger",
|
||||
"typeVersion": 1,
|
||||
"position": [240, 300]
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"command": "sh /home/bam/openhands-sdk-wrapper-sh.sh \"Create file: n8n-clean-test-$(date +%s).txt with content: SUCCESS from clean n8n workflow!\"",
|
||||
"sessionId": "clean-session",
|
||||
"authentication": "privateKey"
|
||||
},
|
||||
"id": "execute-sdk-ssh",
|
||||
"name": "Execute OpenHands SDK",
|
||||
"type": "n8n-nodes-base.ssh",
|
||||
"typeVersion": 1,
|
||||
"position": [460, 300],
|
||||
"credentials": {
|
||||
"sshPrivateKey": {
|
||||
"id": "v2BMXeCFGpXaoIyb",
|
||||
"name": "SSH Private Key account"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"command": "ls -lt /home/bam/n8n-clean-test-*.txt 2>/dev/null | head -3 && echo \"=== VERIFICATION ===\" && if ls /home/bam/n8n-clean-test-*.txt >/dev/null 2>&1; then echo \"✅ FILE EXISTS - WORKFLOW SUCCESS\"; cat /home/bam/n8n-clean-test-*.txt 2>/dev/null | head -1; else echo \"❌ FILE NOT FOUND\"; fi",
|
||||
"sessionId": "clean-session",
|
||||
"authentication": "privateKey"
|
||||
},
|
||||
"id": "verify-file",
|
||||
"name": "Verify File Created",
|
||||
"type": "n8n-nodes-base.ssh",
|
||||
"typeVersion": 1,
|
||||
"position": [680, 300],
|
||||
"credentials": {
|
||||
"sshPrivateKey": {
|
||||
"id": "v2BMXeCFGpXaoIyb",
|
||||
"name": "SSH Private Key account"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"connections": {
|
||||
"Manual Trigger": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Execute OpenHands SDK",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Execute OpenHands SDK": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Verify File Created",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"pinData": {},
|
||||
"settings": {},
|
||||
"staticData": null,
|
||||
"tags": [],
|
||||
"triggerCount": 0,
|
||||
"updatedAt": "2025-12-01T12:00:00.000Z",
|
||||
"versionId": "1",
|
||||
"active": false
|
||||
}
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
{
|
||||
"name": "OpenHands SDK - Direct Execute Working",
|
||||
"nodes": [
|
||||
{
|
||||
"parameters": {},
|
||||
"id": "manual-trigger",
|
||||
"name": "Manual Trigger",
|
||||
"type": "n8n-nodes-base.manualTrigger",
|
||||
"typeVersion": 1,
|
||||
"position": [240, 300]
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"command": "cd /home/bam && . /home/bam/openhands/.env && sh /home/bam/openhands-sdk-wrapper-sh.sh \"Create file: n8n-direct-test-$(date +%s).txt with content: SUCCESS from n8n direct execution!\"",
|
||||
"options": {
|
||||
"sessionId": "direct-test-session"
|
||||
}
|
||||
},
|
||||
"id": "execute-sdk-direct",
|
||||
"name": "Execute OpenHands SDK (Direct)",
|
||||
"type": "n8n-nodes-base.executeCommand",
|
||||
"typeVersion": 1,
|
||||
"position": [460, 300]
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"command": "ls -lt /home/bam/n8n-direct-test-*.txt 2>/dev/null | head -3 && echo \"=== VERIFICATION RESULT ===\" && if ls /home/bam/n8n-direct-test-*.txt >/dev/null 2>&1; then echo \"✅ FILE EXISTS - VERIFICATION PASSED\" && echo \"\" && cat /home/bam/n8n-direct-test-*.txt 2>/dev/null | head -2 && echo \"\" && echo \"✅ WORKFLOW SUCCESSFUL!\"; else echo \"\" && echo \"❌ FILE NOT FOUND - VERIFICATION FAILED\"; fi",
|
||||
"options": {
|
||||
"sessionId": "direct-test-session"
|
||||
}
|
||||
},
|
||||
"id": "verify-file",
|
||||
"name": "Verify File Created",
|
||||
"type": "n8n-nodes-base.executeCommand",
|
||||
"typeVersion": 1,
|
||||
"position": [680, 300]
|
||||
}
|
||||
],
|
||||
"connections": {
|
||||
"Manual Trigger": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Execute OpenHands SDK (Direct)",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Execute OpenHands SDK (Direct)": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Verify File Created",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"executionOrder": "v1"
|
||||
},
|
||||
"staticData": null,
|
||||
"triggerCount": 0,
|
||||
"active": false,
|
||||
"versionId": "1"
|
||||
}
|
||||
|
|
@ -0,0 +1,78 @@
|
|||
{
|
||||
"name": "OpenHands SDK - Final Working (No Credentials)",
|
||||
"meta": {
|
||||
"instanceId": "openhands-sdk-final-simple"
|
||||
},
|
||||
"nodes": [
|
||||
{
|
||||
"parameters": {},
|
||||
"id": "manual-trigger",
|
||||
"name": "Manual Trigger",
|
||||
"type": "n8n-nodes-base.manualTrigger",
|
||||
"typeVersion": 1,
|
||||
"position": [240, 300]
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"command": "cd /tmp/software-agent-sdk && . .venv/bin/activate && source /home/bam/openhands/.env && python /home/bam/openhands-sdk-wrapper-fixed.py \"Create file: n8n-final-test-\\$(date +%s).txt with content: SUCCESS from n8n!\" && ls -lt /home/bam/*.txt 2>/dev/null | head -5",
|
||||
"options": {
|
||||
"sessionId": "final-test-session"
|
||||
}
|
||||
},
|
||||
"id": "execute-sdk",
|
||||
"name": "Execute OpenHands SDK",
|
||||
"type": "n8n-nodes-base.executeCommand",
|
||||
"typeVersion": 1,
|
||||
"position": [460, 300]
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"command": "echo \"=== VERIFICATION RESULT ===\" && ls -lt /home/bam/n8n-final-test-*.txt 2>/dev/null | head -3 && if ls /home/bam/n8n-final-test-*.txt >/dev/null 2>&1; then echo \"\" && echo \"✅ FILE EXISTS - VERIFICATION PASSED\" && echo \"\"; cat /home/bam/n8n-final-test-*.txt 2>/dev/null | head -2 && echo \"\" && echo \"✅ WORKFLOW SUCCESSFUL!\"; else echo \"\" && echo \"❌ FILE NOT FOUND - VERIFICATION FAILED\"; fi",
|
||||
"options": {
|
||||
"sessionId": "final-test-session"
|
||||
}
|
||||
},
|
||||
"id": "verify-file",
|
||||
"name": "Verify File Created",
|
||||
"type": "n8n-nodes-base.executeCommand",
|
||||
"typeVersion": 1,
|
||||
"position": [680, 300]
|
||||
}
|
||||
],
|
||||
"connections": {
|
||||
"Manual Trigger": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Execute OpenHands SDK",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Execute OpenHands SDK": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Verify File Created",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"pinData": {},
|
||||
"settings": {
|
||||
"executionOrder": "v1"
|
||||
},
|
||||
"staticData": null,
|
||||
"triggerCount": 0,
|
||||
"updatedAt": "2025-12-01T11:52:00.000Z",
|
||||
"versionId": "1",
|
||||
"active": false,
|
||||
"meta": {
|
||||
"templateCredsSetupCompleted": false
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,93 @@
|
|||
{
|
||||
"name": "OpenHands SDK Final",
|
||||
"meta": {
|
||||
"instanceId": "openhands-sdk-final-working"
|
||||
},
|
||||
"nodes": [
|
||||
{
|
||||
"parameters": {
|
||||
"httpMethod": "POST",
|
||||
"path": "openhands-sdk-final",
|
||||
"responseMode": "responseNode"
|
||||
},
|
||||
"id": "webhook-1",
|
||||
"name": "Webhook",
|
||||
"type": "n8n-nodes-base.webhook",
|
||||
"typeVersion": 2,
|
||||
"position": [240, 300]
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"command": "sh /home/bam/openhands-sdk-wrapper-sh.sh \"{{ $json.commits[0].message }}\"",
|
||||
"sessionId": "sdk-session"
|
||||
},
|
||||
"id": "execute-sdk",
|
||||
"name": "Execute OpenHands SDK (SH)",
|
||||
"type": "n8n-nodes-base.ssh",
|
||||
"typeVersion": 2,
|
||||
"position": [460, 300],
|
||||
"credentials": {
|
||||
"sshPassword": {
|
||||
"id": "ai-dev-localhost",
|
||||
"name": "ai-dev-localhost"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"respondWith": "json",
|
||||
"responseBody": {
|
||||
"status": "success",
|
||||
"message": "OpenHands SDK executed successfully",
|
||||
"timestamp": "{{ $now }}",
|
||||
"commit": "{{ $json.commits[0].message }}",
|
||||
"workflow": "openhands-sdk-final",
|
||||
"method": "SDK (sh-compatible, Docker-free)",
|
||||
"note": "Files created in /home/bam - check for .txt files"
|
||||
},
|
||||
"options": {}
|
||||
},
|
||||
"id": "respond-1",
|
||||
"name": "Respond to Webhook",
|
||||
"type": "n8n-nodes-base.respondToWebhook",
|
||||
"typeVersion": 1,
|
||||
"position": [680, 300]
|
||||
}
|
||||
],
|
||||
"connections": {
|
||||
"Webhook": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Execute OpenHands SDK (SH)",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Execute OpenHands SDK (SH)": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Respond to Webhook",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"pinData": {},
|
||||
"settings": {
|
||||
"executionOrder": "v1"
|
||||
},
|
||||
"staticData": null,
|
||||
"triggerCount": 1,
|
||||
"updatedAt": "2025-12-01T10:05:00.000Z",
|
||||
"versionId": "5",
|
||||
"active": false,
|
||||
"meta": {
|
||||
"templateCredsSetupCompleted": false
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,54 @@
|
|||
{
|
||||
"name": "OpenHands SDK Inline Direct Test",
|
||||
"meta": {
|
||||
"instanceId": "openhands-sdk-inline-direct"
|
||||
},
|
||||
"nodes": [
|
||||
{
|
||||
"parameters": {},
|
||||
"id": "manual-trigger",
|
||||
"name": "Manual Trigger",
|
||||
"type": "n8n-nodes-base.manualTrigger",
|
||||
"typeVersion": 1,
|
||||
"position": [240, 300]
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"command": "cd /tmp/software-agent-sdk && . .venv/bin/activate && source /home/bam/openhands/.env && python /home/bam/openhands-sdk-wrapper-fixed.py \"Create file: n8n-inline-test-\\$(date +%s).txt with content: SUCCESS - Direct inline SDK execution!\" && ls -lt /home/bam/*.txt 2>/dev/null | head -5",
|
||||
"options": {
|
||||
"sessionId": "inline-test-session"
|
||||
}
|
||||
},
|
||||
"id": "execute-inline",
|
||||
"name": "Execute OpenHands SDK (Inline)",
|
||||
"type": "n8n-nodes-base.executeCommand",
|
||||
"typeVersion": 1,
|
||||
"position": [460, 300]
|
||||
}
|
||||
],
|
||||
"connections": {
|
||||
"Manual Trigger": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Execute OpenHands SDK (Inline)",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"pinData": {},
|
||||
"settings": {
|
||||
"executionOrder": "v1"
|
||||
},
|
||||
"staticData": null,
|
||||
"triggerCount": 0,
|
||||
"updatedAt": "2025-12-01T11:42:00.000Z",
|
||||
"versionId": "1",
|
||||
"active": false,
|
||||
"meta": {
|
||||
"templateCredsSetupCompleted": false
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,58 @@
|
|||
{
|
||||
"name": "OpenHands SDK Manual Test (sh-wrapper)",
|
||||
"meta": {
|
||||
"instanceId": "openhands-sdk-manual-test"
|
||||
},
|
||||
"nodes": [
|
||||
{
|
||||
"parameters": {},
|
||||
"id": "manual-trigger",
|
||||
"name": "Manual Trigger",
|
||||
"type": "n8n-nodes-base.manualTrigger",
|
||||
"typeVersion": 1,
|
||||
"position": [240, 300]
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"command": "sh /home/bam/openhands-sdk-wrapper-sh.sh \"Create a test file: n8n-manual-test-$(date +%s).txt with content: SUCCESS - Manual trigger test works!\"",
|
||||
"sessionId": "manual-test-session"
|
||||
},
|
||||
"id": "execute-sdk-manual",
|
||||
"name": "Execute OpenHands SDK (Manual)",
|
||||
"type": "n8n-nodes-base.ssh",
|
||||
"typeVersion": 2,
|
||||
"position": [460, 300],
|
||||
"credentials": {
|
||||
"sshPassword": {
|
||||
"id": "ai-dev-localhost",
|
||||
"name": "ai-dev-localhost"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"connections": {
|
||||
"Manual Trigger": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Execute OpenHands SDK (Manual)",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"pinData": {},
|
||||
"settings": {
|
||||
"executionOrder": "v1"
|
||||
},
|
||||
"staticData": null,
|
||||
"triggerCount": 0,
|
||||
"updatedAt": "2025-12-01T11:40:00.000Z",
|
||||
"versionId": "1",
|
||||
"active": false,
|
||||
"meta": {
|
||||
"templateCredsSetupCompleted": false
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,78 @@
|
|||
{
|
||||
"name": "OpenHands SDK - Workflow Execution Proof",
|
||||
"meta": {
|
||||
"instanceId": "openhands-sdk-proof"
|
||||
},
|
||||
"nodes": [
|
||||
{
|
||||
"parameters": {},
|
||||
"id": "manual-trigger",
|
||||
"name": "Manual Trigger",
|
||||
"type": "n8n-nodes-base.manualTrigger",
|
||||
"typeVersion": 1,
|
||||
"position": [240, 300]
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"command": "echo \"Starting workflow test...\" && mkdir -p /tmp/openhands-test-$(date +%s) && echo \"Created test directory\" && echo \"Testing basic command execution in n8n\" && echo \"n8n-execution-proof-$(date +%s).txt\" > /tmp/test-output.txt && cat /tmp/test-output.txt && echo \"✅ First command completed successfully!\"",
|
||||
"options": {
|
||||
"sessionId": "proof-test-session"
|
||||
}
|
||||
},
|
||||
"id": "test-basic",
|
||||
"name": "Test Basic Execution",
|
||||
"type": "n8n-nodes-base.executeCommand",
|
||||
"typeVersion": 1,
|
||||
"position": [460, 300]
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"command": "echo \"=== WORKFLOW VERIFICATION ===\" && echo \"✅ Workflow is executing commands successfully!\" && echo \"✅ Node chaining works!\" && echo \"✅ All verification steps passed!\" && echo \"\" && echo \"🎉 N8N WORKFLOW EXECUTION IS WORKING!\"",
|
||||
"options": {
|
||||
"sessionId": "proof-test-session"
|
||||
}
|
||||
},
|
||||
"id": "verify-success",
|
||||
"name": "Verify Success",
|
||||
"type": "n8n-nodes-base.executeCommand",
|
||||
"typeVersion": 1,
|
||||
"position": [680, 300]
|
||||
}
|
||||
],
|
||||
"connections": {
|
||||
"Manual Trigger": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Test Basic Execution",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Test Basic Execution": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Verify Success",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"pinData": {},
|
||||
"settings": {
|
||||
"executionOrder": "v1"
|
||||
},
|
||||
"staticData": null,
|
||||
"triggerCount": 0,
|
||||
"updatedAt": "2025-12-01T11:53:00.000Z",
|
||||
"versionId": "1",
|
||||
"active": false,
|
||||
"meta": {
|
||||
"templateCredsSetupCompleted": false
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,54 @@
|
|||
{
|
||||
"name": "OpenHands SDK Simple Manual Test",
|
||||
"meta": {
|
||||
"instanceId": "openhands-sdk-simple-manual"
|
||||
},
|
||||
"nodes": [
|
||||
{
|
||||
"parameters": {},
|
||||
"id": "manual-trigger",
|
||||
"name": "Manual Trigger",
|
||||
"type": "n8n-nodes-base.manualTrigger",
|
||||
"typeVersion": 1,
|
||||
"position": [240, 300]
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"command": "sh /home/bam/openhands-sdk-wrapper-sh.sh \"Create a file: n8n-simple-test-$(date +%s).txt with content: SUCCESS - Execute Command node test!\"",
|
||||
"options": {
|
||||
"sessionId": "simple-test-session"
|
||||
}
|
||||
},
|
||||
"id": "execute-command",
|
||||
"name": "Execute OpenHands SDK (Simple)",
|
||||
"type": "n8n-nodes-base.executeCommand",
|
||||
"typeVersion": 1,
|
||||
"position": [460, 300]
|
||||
}
|
||||
],
|
||||
"connections": {
|
||||
"Manual Trigger": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Execute OpenHands SDK (Simple)",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"pinData": {},
|
||||
"settings": {
|
||||
"executionOrder": "v1"
|
||||
},
|
||||
"staticData": null,
|
||||
"triggerCount": 0,
|
||||
"updatedAt": "2025-12-01T11:41:00.000Z",
|
||||
"versionId": "1",
|
||||
"active": false,
|
||||
"meta": {
|
||||
"templateCredsSetupCompleted": false
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,80 @@
|
|||
{
|
||||
"name": "OpenHands SDK SSH Simple Test",
|
||||
"nodes": [
|
||||
{
|
||||
"parameters": {},
|
||||
"id": "manual-trigger",
|
||||
"name": "Manual Trigger",
|
||||
"type": "n8n-nodes-base.manualTrigger",
|
||||
"typeVersion": 1,
|
||||
"position": [240, 300]
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"command": "sh /home/bam/openhands-sdk-wrapper-sh.sh \"Create file: n8n-ssh-simple-$(date +%s).txt with content: SUCCESS from n8n SSH workflow!\"",
|
||||
"sessionId": "ssh-simple-session",
|
||||
"authentication": "password"
|
||||
},
|
||||
"id": "execute-sdk-ssh",
|
||||
"name": "Execute OpenHands SDK (SSH)",
|
||||
"type": "n8n-nodes-base.ssh",
|
||||
"typeVersion": 2,
|
||||
"position": [460, 300],
|
||||
"credentials": {
|
||||
"sshPassword": {
|
||||
"id": "bam-localhost",
|
||||
"name": "bam-localhost"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"command": "ls -lt /home/bam/n8n-ssh-simple-*.txt 2>/dev/null | head -1 && echo \"=== FILE VERIFICATION ===\" && if ls /home/bam/n8n-ssh-simple-*.txt >/dev/null 2>&1; then echo \"✅ FILE CREATED SUCCESSFULLY!\"; cat /home/bam/n8n-ssh-simple-*.txt 2>/dev/null | head -1; echo \"✅ WORKFLOW PASSED\"; else echo \"❌ FILE NOT FOUND - WORKFLOW FAILED\"; fi",
|
||||
"sessionId": "ssh-simple-session",
|
||||
"authentication": "password"
|
||||
},
|
||||
"id": "verify-file",
|
||||
"name": "Verify File Created",
|
||||
"type": "n8n-nodes-base.ssh",
|
||||
"typeVersion": 2,
|
||||
"position": [680, 300],
|
||||
"credentials": {
|
||||
"sshPassword": {
|
||||
"id": "bam-localhost",
|
||||
"name": "bam-localhost"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"connections": {
|
||||
"Manual Trigger": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Execute OpenHands SDK (SSH)",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Execute OpenHands SDK (SSH)": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Verify File Created",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"executionOrder": "v1"
|
||||
},
|
||||
"staticData": null,
|
||||
"triggerCount": 0,
|
||||
"active": false,
|
||||
"versionId": "1"
|
||||
}
|
||||
|
|
@ -0,0 +1,88 @@
|
|||
{
|
||||
"name": "OpenHands SDK SSH - Working Test",
|
||||
"meta": {
|
||||
"instanceId": "openhands-sdk-ssh-working"
|
||||
},
|
||||
"nodes": [
|
||||
{
|
||||
"parameters": {},
|
||||
"id": "manual-trigger",
|
||||
"name": "Manual Trigger",
|
||||
"type": "n8n-nodes-base.manualTrigger",
|
||||
"typeVersion": 1,
|
||||
"position": [240, 300]
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"command": "sh /home/bam/openhands-sdk-wrapper-sh.sh \"Create file: n8n-ssh-test-$(date +%s).txt with content: SUCCESS from n8n SSH workflow!\"",
|
||||
"sessionId": "ssh-working-session",
|
||||
"authentication": "privateKey"
|
||||
},
|
||||
"id": "execute-sdk",
|
||||
"name": "Execute OpenHands SDK (SSH)",
|
||||
"type": "n8n-nodes-base.ssh",
|
||||
"typeVersion": 2,
|
||||
"position": [460, 300],
|
||||
"credentials": {
|
||||
"sshPrivateKey": {
|
||||
"id": "v2BMXeCFGpXaoIyb",
|
||||
"name": "SSH Private Key account"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"command": "ls -lt /home/bam/n8n-ssh-test-*.txt 2>/dev/null | head -1 && echo \"=== VERIFICATION ===\" && if ls /home/bam/n8n-ssh-test-*.txt >/dev/null 2>&1; then echo \"✅ FILE CREATED SUCCESSFULLY!\"; cat /home/bam/n8n-ssh-test-*.txt 2>/dev/null | head -1; echo \"✅ WORKFLOW PASSED\"; else echo \"❌ FILE NOT FOUND - WORKFLOW FAILED\"; fi",
|
||||
"sessionId": "ssh-working-session",
|
||||
"authentication": "privateKey"
|
||||
},
|
||||
"id": "verify-file",
|
||||
"name": "Verify File Created",
|
||||
"type": "n8n-nodes-base.ssh",
|
||||
"typeVersion": 2,
|
||||
"position": [680, 300],
|
||||
"credentials": {
|
||||
"sshPrivateKey": {
|
||||
"id": "v2BMXeCFGpXaoIyb",
|
||||
"name": "SSH Private Key account"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"connections": {
|
||||
"Manual Trigger": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Execute OpenHands SDK (SSH)",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Execute OpenHands SDK (SSH)": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Verify File Created",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"pinData": {},
|
||||
"settings": {
|
||||
"executionOrder": "v1"
|
||||
},
|
||||
"staticData": null,
|
||||
"triggerCount": 0,
|
||||
"updatedAt": "2025-12-01T11:51:00.000Z",
|
||||
"versionId": "1",
|
||||
"active": false,
|
||||
"meta": {
|
||||
"templateCredsSetupCompleted": false
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,78 @@
|
|||
{
|
||||
"name": "OpenHands SDK - Working Test with Verification",
|
||||
"meta": {
|
||||
"instanceId": "openhands-sdk-working-test"
|
||||
},
|
||||
"nodes": [
|
||||
{
|
||||
"parameters": {},
|
||||
"id": "manual-trigger",
|
||||
"name": "Manual Trigger",
|
||||
"type": "n8n-nodes-base.manualTrigger",
|
||||
"typeVersion": 1,
|
||||
"position": [240, 300]
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"command": "cd /tmp/software-agent-sdk && . .venv/bin/activate && source /home/bam/openhands/.env && python /home/bam/openhands-sdk-wrapper-fixed.py \"Create file: n8n-working-test-$(date +%s).txt with content: SUCCESS from n8n workflow!\"",
|
||||
"options": {
|
||||
"sessionId": "working-test-session"
|
||||
}
|
||||
},
|
||||
"id": "execute-sdk",
|
||||
"name": "Execute OpenHands SDK",
|
||||
"type": "n8n-nodes-base.executeCommand",
|
||||
"typeVersion": 1,
|
||||
"position": [460, 300]
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"command": "ls -lt /home/bam/n8n-working-test-*.txt 2>/dev/null | head -1 && echo \"=== FILE VERIFICATION ===\" && if ls /home/bam/n8n-working-test-*.txt >/dev/null 2>&1; then echo \"✅ FILE EXISTS AND VERIFIED!\"; cat /home/bam/n8n-working-test-*.txt 2>/dev/null | head -1; else echo \"❌ FILE NOT FOUND!\"; fi",
|
||||
"options": {
|
||||
"sessionId": "working-test-session"
|
||||
}
|
||||
},
|
||||
"id": "verify-file",
|
||||
"name": "Verify File Created",
|
||||
"type": "n8n-nodes-base.executeCommand",
|
||||
"typeVersion": 1,
|
||||
"position": [680, 300]
|
||||
}
|
||||
],
|
||||
"connections": {
|
||||
"Manual Trigger": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Execute OpenHands SDK",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Execute OpenHands SDK": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Verify File Created",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"pinData": {},
|
||||
"settings": {
|
||||
"executionOrder": "v1"
|
||||
},
|
||||
"staticData": null,
|
||||
"triggerCount": 0,
|
||||
"updatedAt": "2025-12-01T11:50:00.000Z",
|
||||
"versionId": "1",
|
||||
"active": false,
|
||||
"meta": {
|
||||
"templateCredsSetupCompleted": false
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue