Nodes

एक node एक companion device (macOS/iOS/Android/headless) है जो Gateway WebSocket (operators के समान port) से role: "node" के साथ connect होता है और node.invoke के माध्यम से एक command surface (जैसे canvas.*, camera.*, system.*) expose करता है। Protocol विवरण: Gateway protocol

Legacy transport: Bridge protocol (TCP JSONL; deprecated/वर्तमान nodes के लिए removed)।

macOS node mode में भी चल सकता है: menubar app Gateway के WS server से connect होता है और अपने स्थानीय canvas/camera commands को एक node के रूप में expose करता है (ताकि mayros nodes … इस Mac के खिलाफ काम करे)।

नोट्स:

  • Nodes peripherals हैं, gateways नहीं। वे gateway service नहीं चलाते।
  • Telegram/WhatsApp/आदि संदेश gateway पर land होते हैं, nodes पर नहीं।
  • Troubleshooting runbook: /nodes/troubleshooting

Pairing + status

WS nodes device pairing का उपयोग करते हैं। Nodes connect के दौरान device identity present करते हैं; Gateway role: node के लिए device pairing request बनाता है। Devices CLI (या UI) के माध्यम से approve करें।

Quick CLI:

bash
mayros devices list
mayros devices approve <requestId>
mayros devices reject <requestId>
mayros nodes status
mayros nodes describe --node <idOrNameOrIp>

नोट्स:

  • nodes status एक node को paired के रूप में mark करता है जब इसकी device pairing role में node शामिल हो।
  • node.pair.* (CLI: mayros nodes pending/approve/reject) एक अलग gateway-owned node pairing store है; यह WS connect handshake को gate नहीं करता।

Remote node host (system.run)

जब आपका Gateway एक मशीन पर चलता है और आप commands को दूसरी पर execute करना चाहते हैं तो node host का उपयोग करें। Model अभी भी gateway से बात करता है; gateway exec calls को node host पर forward करता है जब host=node selected हो।

क्या कहां चलता है

  • Gateway host: संदेश receive करता है, model चलाता है, tool calls को route करता है।
  • Node host: node मशीन पर system.run/system.which execute करता है।
  • Approvals: ~/.mayros/exec-approvals.json के माध्यम से node host पर enforced।

Node host शुरू करें (foreground)

Node मशीन पर:

bash
mayros node run --host <gateway-host> --port 18789 --display-name "Build Node"

SSH tunnel के माध्यम से Remote gateway (loopback bind)

यदि Gateway loopback से bind करता है (gateway.bind=loopback, local mode में डिफ़ॉल्ट), तो remote node hosts सीधे connect नहीं हो सकते। एक SSH tunnel बनाएं और node host को tunnel के स्थानीय end पर point करें।

उदाहरण (node host -> gateway host):

bash
# Terminal A (चलता रहे): local 18790 -> gateway 127.0.0.1:18789 forward करें
ssh -N -L 18790:127.0.0.1:18789 user@gateway-host

# Terminal B: gateway token export करें और tunnel के माध्यम से connect करें
export MAYROS_GATEWAY_TOKEN="<gateway-token>"
mayros node run --host 127.0.0.1 --port 18790 --display-name "Build Node"

Commands invoke करना

Low-level (raw RPC):

bash
mayros nodes invoke --node <idOrNameOrIp> --command canvas.eval --params '{"javaScript":"location.href"}'

सामान्य "एजेंट को MEDIA attachment दें" workflows के लिए higher-level helpers मौजूद हैं।

Screenshots (canvas snapshots)

यदि node Canvas (WebView) दिखा रहा है, तो canvas.snapshot { format, base64 } return करता है।

CLI helper (temp file में लिखता है और MEDIA:<path> print करता है):

bash
mayros nodes canvas snapshot --node <idOrNameOrIp> --format png
mayros nodes canvas snapshot --node <idOrNameOrIp> --format jpg --max-width 1200 --quality 0.9

Canvas controls

bash
mayros nodes canvas present --node <idOrNameOrIp> --target https://example.com
mayros nodes canvas hide --node <idOrNameOrIp>
mayros nodes canvas navigate https://example.com --node <idOrNameOrIp>
mayros nodes canvas eval --node <idOrNameOrIp> --js "document.title"

Photos + videos (node camera)

Photos (jpg):

bash
mayros nodes camera list --node <idOrNameOrIp>
mayros nodes camera snap --node <idOrNameOrIp>            # डिफ़ॉल्ट: दोनों facings (2 MEDIA lines)
mayros nodes camera snap --node <idOrNameOrIp> --facing front

Video clips (mp4):

bash
mayros nodes camera clip --node <idOrNameOrIp> --duration 10s
mayros nodes camera clip --node <idOrNameOrIp> --duration 3000 --no-audio

नोट्स:

  • Node को canvas.* और camera.* के लिए foregrounded होना चाहिए (background calls NODE_BACKGROUND_UNAVAILABLE return करते हैं)।
  • Clip duration clamped है (वर्तमान में <= 60s) oversized base64 payloads से बचने के लिए।
  • Android संभव होने पर CAMERA/RECORD_AUDIO permissions के लिए prompt करेगा; denied permissions *_PERMISSION_REQUIRED के साथ fail होते हैं।

Screen recordings (nodes)

Nodes screen.record (mp4) expose करते हैं। उदाहरण:

bash
mayros nodes screen record --node <idOrNameOrIp> --duration 10s --fps 10
mayros nodes screen record --node <idOrNameOrIp> --duration 10s --fps 10 --no-audio

Location (nodes)

Nodes location.get expose करते हैं जब Location settings में enabled हो।

CLI helper:

bash
mayros nodes location get --node <idOrNameOrIp>
mayros nodes location get --node <idOrNameOrIp> --accuracy precise --max-age 15000 --location-timeout 10000

System commands (node host / mac node)

macOS node system.run, system.notify और system.execApprovals.get/set expose करता है। Headless node host system.run, system.which और system.execApprovals.get/set expose करता है।

उदाहरण:

bash
mayros nodes run --node <idOrNameOrIp> -- echo "Hello from mac node"
mayros nodes notify --node <idOrNameOrIp> --title "Ping" --body "Gateway ready"

Headless node host (cross-platform)

Mayros एक headless node host (कोई UI नहीं) चला सकता है जो Gateway WebSocket से connect होता है और system.run / system.which expose करता है।

इसे शुरू करें:

bash
mayros node run --host <gateway-host> --port 18789

नोट्स:

  • Pairing अभी भी आवश्यक है (Gateway एक node approval prompt दिखाएगा)।
  • Node host अपनी node id, token, display name और gateway connection info को ~/.mayros/node.json में store करता है।
  • Exec approvals स्थानीय रूप से ~/.mayros/exec-approvals.json के माध्यम से enforced हैं (Exec approvals देखें)।