open-index/open-npm huggingface dataset:
npm package: @soyeht/openclaw
Description: OpenClaw channel plugin for the Soyeht Flutter mobile app
Latest version: 0.1.0

# Soyeht OpenClaw Plugin

Channel plugin for connecting the Soyeht Flutter mobile app to an OpenClaw gateway.

## Install in OpenClaw

After this package is published to npm, install it on the OpenClaw host with:

```bash
openclaw plugins install @soyeht/openclaw@0.1.0 --pin
openclaw plugins enable soyeht
```

Then verify:

```bash
openclaw plugins list
openclaw plugins info soyeht
openclaw plugins doctor
```

## Minimal configuration

Add a Soyeht account under `channels.soyeht.accounts.default`:

```yaml
channels:
  soyeht:
    accounts:
      default:
        enabled: true
        backendBaseUrl: https://your-backend.example
        pluginAuthToken: your-plugin-auth-token
        security:
          enabled: true
```

## Local validation

```bash
npm ci
npm run validate
```

## Publish to npm

1. Make sure the package name and scope are available on npm.
2. Log in:

```bash
npm login
```

3. Bump the version:

```bash
npm version patch
```

This also syncs `openclaw.plugin.json`.

4. Publish publicly:

```bash
npm publish
```

The package is configured with `publishConfig.access=public`, so the first publish of the scoped package does not need an extra `--access public`.

## Protocol docs

- [Protocol](docs/PROTOCOL.md)
- [Flutter agent prompt](docs/FLUTTER_AGENT_PROMPT.md)
npm package: @soyeht/soyeht
Description: OpenClaw channel plugin for the Soyeht Flutter mobile app
Latest version: 0.2.12

# Soyeht OpenClaw Plugin

Channel plugin for connecting the Soyeht Flutter mobile app to an OpenClaw gateway.

## V1 Architecture

The app and the OpenClaw instance communicate over **HTTP + SSE** on a shared network (typically Tailscale).

- **Inbound** (app → plugin): `POST {gatewayUrl}/soyeht/messages/inbound`
- **Outbound** (plugin → app): `GET {gatewayUrl}/soyeht/events/{accountId}?token=...` (SSE)
- **Pairing**: QR code scanned by the app, then HTTP handshake

No WebRTC. No public domain required. Tailscale resolves connectivity.

## Install

```bash
openclaw plugins install @soyeht/soyeht --pin
openclaw plugins enable soyeht
```

Verify:

```bash
openclaw plugins list
openclaw plugins info soyeht
openclaw plugins doctor
```

## Configuration

Set `gatewayUrl` to the URL accessible from the app. With Tailscale, this is your instance's Tailscale IP or MagicDNS hostname:

```bash
# Using Tailscale IP
openclaw config set channels.soyeht.gatewayUrl "http://100.x.y.z:18789"

# Or using MagicDNS
openclaw config set channels.soyeht.gatewayUrl "http://my-machine.tailnet.ts.net:18789"

openclaw config set channels.soyeht.enabled true
openclaw gateway restart
```

The plugin will auto-generate a pairing QR on startup if no peers are paired.

### Manual pairing

```bash
openclaw gateway call soyeht.security.pairing.start '{"accountId": "default", "allowOverwrite": true}'
```

### Full config reference

```yaml
channels:
  soyeht:
    enabled: true
    gatewayUrl: "http://100.x.y.z:18789"  # required — your Tailscale/LAN URL
    # Optional (only for legacy backend mode, not needed in V1):
    # backendBaseUrl: "https://your-backend.example"
    # pluginAuthToken: "your-token"
```

Or with named accounts:

```yaml
channels:
  soyeht:
    accounts:
      default:
        enabled: true
        gatewayUrl: "http://100.x.y.z:18789"
```

## App endpoints

All called by the Flutter app against `{gatewayUrl}`:

| Method | Path | Purpose |
|--------|------|---------|
| `GET` | `/soyeht/pairing/info?t={token}` | Fetch plugin keys for pairing |
| `POST` | `/soyeht/pairing/pair` | Register peer + start handshake |
| `POST` | `/soyeht/pairing/finish` | Complete handshake, get streamToken |
| `POST` | `/soyeht/messages/inbound` | Send encrypted message to agent |
| `GET` | `/soyeht/events/{accountId}?token={streamToken}` | SSE stream for agent replies |
| `GET` | `/soyeht/health` | Health check (503 if not ready) |

## QR format

The compact QR URL emitted by the plugin:

```
soyeht://pair?g={gatewayUrl}&t={pairingToken}&fp={fingerprint}
```

The app parses the URL, then calls the HTTP pairing endpoints above.

## Local development

```bash
npm ci
npm run validate    # typecheck + tests
npm run test:watch  # vitest in watch mode
```

## Publish

```bash
npm version patch   # bumps package.json + openclaw.plugin.json
npm publish
```

## Protocol docs

- [Security Protocol](docs/PROTOCOL.md)