docs: flesh out client readme
This commit is contained in:
134
README.md
134
README.md
@@ -0,0 +1,134 @@
|
|||||||
|
# Yonexus.Client
|
||||||
|
|
||||||
|
Yonexus.Client is the follower-side plugin for a Yonexus network.
|
||||||
|
|
||||||
|
It runs on non-central OpenClaw instances and is responsible for:
|
||||||
|
|
||||||
|
- connecting outbound to `Yonexus.Server`
|
||||||
|
- managing local identifier + trust material
|
||||||
|
- generating a local Ed25519 keypair on first run
|
||||||
|
- completing out-of-band pairing
|
||||||
|
- authenticating on reconnect with signed proof
|
||||||
|
- sending periodic heartbeats
|
||||||
|
- dispatching inbound rule messages to locally registered handlers
|
||||||
|
|
||||||
|
## Status
|
||||||
|
|
||||||
|
Current state: **scaffold + core runtime MVP**
|
||||||
|
|
||||||
|
Implemented in this repository today:
|
||||||
|
|
||||||
|
- config validation
|
||||||
|
- local state store for identifier / keypair / secret
|
||||||
|
- automatic first-run keypair generation
|
||||||
|
- WebSocket client transport with reconnect backoff
|
||||||
|
- hello / hello_ack handling
|
||||||
|
- pairing pending flow + pairing code submission
|
||||||
|
- auth_request generation and auth state transitions
|
||||||
|
- heartbeat loop
|
||||||
|
- rule registry + send-to-server APIs
|
||||||
|
|
||||||
|
Still pending before production use:
|
||||||
|
|
||||||
|
- automated Client unit/integration tests
|
||||||
|
- richer operator UX for entering pairing codes
|
||||||
|
- final OpenClaw lifecycle hook integration
|
||||||
|
- deployment/troubleshooting docs specific to follower instances
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
Required config shape:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"mainHost": "wss://example.com/yonexus",
|
||||||
|
"identifier": "client-a",
|
||||||
|
"notifyBotToken": "<discord-bot-token>",
|
||||||
|
"adminUserId": "123456789012345678"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Field notes
|
||||||
|
|
||||||
|
- `mainHost`: WebSocket URL of the Yonexus server (`ws://` or `wss://`)
|
||||||
|
- `identifier`: unique client identity inside the Yonexus network
|
||||||
|
- `notifyBotToken`: currently kept aligned with system-level config expectations
|
||||||
|
- `adminUserId`: admin reference used by the broader Yonexus pairing model
|
||||||
|
|
||||||
|
## Runtime Overview
|
||||||
|
|
||||||
|
Startup flow:
|
||||||
|
|
||||||
|
1. validate config
|
||||||
|
2. load local state
|
||||||
|
3. generate keypair if missing
|
||||||
|
4. connect to `mainHost`
|
||||||
|
5. send `hello`
|
||||||
|
6. continue into pairing or auth depending on server response
|
||||||
|
|
||||||
|
Authentication flow:
|
||||||
|
|
||||||
|
1. receive `hello_ack(auth_required)` or `pair_success`
|
||||||
|
2. build proof from `secret + nonce + timestamp` using canonical JSON bytes
|
||||||
|
3. sign with local Ed25519 private key
|
||||||
|
4. send `auth_request`
|
||||||
|
5. on success, enter authenticated state and start heartbeat loop
|
||||||
|
|
||||||
|
Pairing flow:
|
||||||
|
|
||||||
|
1. receive `pair_request` metadata from server
|
||||||
|
2. obtain pairing code from the human-admin out-of-band channel
|
||||||
|
3. submit pairing code through `submitPairingCode()`
|
||||||
|
4. persist returned secret after `pair_success`
|
||||||
|
|
||||||
|
## Public API Surface
|
||||||
|
|
||||||
|
Exported runtime helpers currently include:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
sendMessageToServer(message: string): Promise<boolean>
|
||||||
|
sendRuleMessage(ruleIdentifier: string, content: string): Promise<boolean>
|
||||||
|
registerRule(rule: string, processor: (message: string) => unknown): void
|
||||||
|
submitPairingCode(pairingCode: string): Promise<boolean>
|
||||||
|
```
|
||||||
|
|
||||||
|
Rules:
|
||||||
|
|
||||||
|
- application messages must use `${rule_identifier}::${message_content}`
|
||||||
|
- `builtin` is reserved and cannot be registered as an application rule
|
||||||
|
|
||||||
|
## Local State
|
||||||
|
|
||||||
|
The client persists at least:
|
||||||
|
|
||||||
|
- `identifier`
|
||||||
|
- `privateKey`
|
||||||
|
- `publicKey`
|
||||||
|
- `secret`
|
||||||
|
- key/auth/pair timestamps
|
||||||
|
|
||||||
|
This is enough to survive restarts and perform authenticated reconnects.
|
||||||
|
|
||||||
|
## Development
|
||||||
|
|
||||||
|
Install dependencies and run type checks:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install
|
||||||
|
npm run check
|
||||||
|
```
|
||||||
|
|
||||||
|
## Limitations
|
||||||
|
|
||||||
|
Current known limitations:
|
||||||
|
|
||||||
|
- no polished end-user pairing code entry UX yet
|
||||||
|
- no client unit/integration test suite yet
|
||||||
|
- no offline buffering/queueing
|
||||||
|
- no end-to-end encrypted payload channel beyond current pairing/auth model
|
||||||
|
|
||||||
|
## Related Repos
|
||||||
|
|
||||||
|
- Umbrella: `../`
|
||||||
|
- Shared protocol: `../Yonexus.Protocol`
|
||||||
|
- Server plugin: `../Yonexus.Server`
|
||||||
|
|||||||
Reference in New Issue
Block a user