mirror of
https://github.com/tiennm99/goclaw.git
synced 2026-06-10 14:10:52 +00:00
037d18f711
* feat(ui): improve kanban UX, fix dialog scroll, remove delegation page - Kanban: reorder columns (blocked after pending), show blocked-by info on cards, clickable blocker links in task detail, framer-motion card animation between columns - Dialogs: standardize scroll pattern across all modals — header fixed, scrollbar flush with outer edge via negative margin trick - Remove delegation page, types, events, i18n, routes, and all references - Fix activity_logs NULL jsonb scan error (COALESCE) - Board header: show text labels on action buttons (desktop) * docs: comprehensive audit and update of all documentation - Update Go 1.25 → 1.26, PostgreSQL 15+ → 18 across all docs - Add 10 missing internal modules to CLAUDE.md project structure - Expand provider docs from 2 to 6 packages (Anthropic, OpenAI, DashScope, Claude CLI, ACP, Codex) - Add 8 missing store interfaces to data model docs (22 total) - Update bootstrap files from 7 to 13 templates - Expand tool inventory from ~35 to 60+ tools with media/KG/credential categories - Fix Team Task Board: add blocked status, 3 missing actions, V2 versioning, delegate restrictions - Remove all references to removed features: handoff, delegate_search, evaluate_loop, agent_links - Fix lane defaults (2/4/1 → 30/50/100/30), ghost file references, models.list → providers.models - Add SecureCLI, snapshot worker, cost calculation, pairing security docs - Comprehensive changelog catch-up - Trim docs/03-tools-system.md to 800-line limit
543 lines
14 KiB
Markdown
543 lines
14 KiB
Markdown
# 19 — WebSocket RPC Methods
|
|
|
|
GoClaw's primary control plane is a WebSocket-based JSON-RPC protocol (v3). Clients connect to `/ws`, authenticate via `connect`, then exchange request/response/event frames.
|
|
|
|
For the wire protocol, frame format, and connection lifecycle, see [04 — Gateway Protocol](04-gateway-protocol.md). This document catalogs every available RPC method.
|
|
|
|
---
|
|
|
|
## 1. Connection & System
|
|
|
|
### `connect`
|
|
|
|
Establish an authenticated session. Must be the first request after WebSocket upgrade.
|
|
|
|
**Request:**
|
|
|
|
```json
|
|
{
|
|
"token": "gateway-token-or-api-key",
|
|
"user_id": "external-user-id",
|
|
"sender_id": "optional-device-id",
|
|
"locale": "en"
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
|
|
```json
|
|
{
|
|
"protocol": 3,
|
|
"role": "admin",
|
|
"user_id": "user-123",
|
|
"server": {
|
|
"version": "1.0.0",
|
|
"uptime": "2h30m"
|
|
}
|
|
}
|
|
```
|
|
|
|
**Auth flow:** Gateway token → timing-safe compare → admin role. If no match, SHA-256 hash → API key lookup → role derived from scopes. Pairing codes also accepted for channel devices.
|
|
|
|
### `health`
|
|
|
|
Server health and connected clients.
|
|
|
|
**Response:**
|
|
|
|
```json
|
|
{
|
|
"status": "ok",
|
|
"version": "1.0.0",
|
|
"uptime": "2h30m",
|
|
"mode": "managed",
|
|
"database": "ok",
|
|
"tools": ["exec", "web_fetch", "memory", "..."],
|
|
"clients": [{"id": "...", "role": "admin", "user_id": "..."}],
|
|
"currentId": "client-uuid"
|
|
}
|
|
```
|
|
|
|
### `status`
|
|
|
|
Quick agent/session/client counts.
|
|
|
|
**Response:**
|
|
|
|
```json
|
|
{
|
|
"agents": [{"id": "...", "name": "...", "isRunning": false}],
|
|
"agentTotal": 5,
|
|
"clients": 2,
|
|
"sessions": 42
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 2. Chat
|
|
|
|
### `chat.send`
|
|
|
|
Send a message to an agent and trigger execution.
|
|
|
|
**Request:**
|
|
|
|
```json
|
|
{
|
|
"message": "Hello, agent",
|
|
"agentId": "uuid-or-key",
|
|
"sessionKey": "optional-session",
|
|
"stream": true,
|
|
"media": [{"type": "image", "url": "..."}]
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
|
|
```json
|
|
{
|
|
"runId": "uuid",
|
|
"content": "Agent response text",
|
|
"usage": {"input_tokens": 100, "output_tokens": 50},
|
|
"media": []
|
|
}
|
|
```
|
|
|
|
When `stream: true`, intermediate events are emitted: `chunk`, `tool.call`, `tool.result`, `run.started`, `run.completed`.
|
|
|
|
### `chat.history`
|
|
|
|
Retrieve chat history for a session.
|
|
|
|
**Request:** `{agentId, sessionKey}`
|
|
**Response:** `{messages: [{role, content, timestamp, ...}]}`
|
|
|
|
### `chat.abort`
|
|
|
|
Cancel running agent invocations.
|
|
|
|
**Request:** `{sessionKey?, runId?}`
|
|
**Response:** `{ok: true, aborted: 1, runIds: ["..."]}`
|
|
|
|
### `chat.inject`
|
|
|
|
Inject a message into the session transcript without triggering the agent.
|
|
|
|
**Request:** `{sessionKey, message, label}`
|
|
**Response:** `{ok: true, messageId: "..."}`
|
|
|
|
---
|
|
|
|
## 3. Agents
|
|
|
|
### `agents.list`
|
|
|
|
List all agents.
|
|
|
|
**Response:** `{agents: [{id, name, key, emoji, avatar, agent_type, ...}]}`
|
|
|
|
### `agent`
|
|
|
|
Get single agent status.
|
|
|
|
**Request:** `{agentId}`
|
|
**Response:** `{id, isRunning}`
|
|
|
|
### `agent.wait`
|
|
|
|
Wait for agent completion.
|
|
|
|
**Request:** `{agentId}`
|
|
**Response:** `{id, status}`
|
|
|
|
### `agent.identity.get`
|
|
|
|
Get agent identity (name, emoji, avatar, description).
|
|
|
|
**Request:** `{agentId?, sessionKey?}`
|
|
**Response:** `{agentId, name, emoji, avatar, description}`
|
|
|
|
### `agents.create`
|
|
|
|
Create a new agent (admin only).
|
|
|
|
**Request:**
|
|
|
|
```json
|
|
{
|
|
"name": "My Agent",
|
|
"workspace": "~/agents/my-agent",
|
|
"emoji": "🤖",
|
|
"agent_type": "open",
|
|
"owner_ids": ["user-1"],
|
|
"tools_config": {},
|
|
"memory_config": {},
|
|
"sandbox_config": {}
|
|
}
|
|
```
|
|
|
|
**Response:** `{ok: true, agentId: "uuid", name, workspace}`
|
|
|
|
### `agents.update`
|
|
|
|
Update agent properties (admin only).
|
|
|
|
**Request:** `{agentId, name?, model?, avatar?, tools_config?, ...}`
|
|
**Response:** `{ok: true, agentId}`
|
|
|
|
### `agents.delete`
|
|
|
|
Delete an agent (admin only).
|
|
|
|
**Request:** `{agentId, deleteFiles: false}`
|
|
**Response:** `{ok: true, agentId, removedBindings: 2}`
|
|
|
|
### Agent Context Files
|
|
|
|
| Method | Description |
|
|
|--------|-------------|
|
|
| `agents.files.list` | List allowed context files |
|
|
| `agents.files.get` | Get file content |
|
|
| `agents.files.set` | Save file content |
|
|
|
|
**Request:** `{agentId, name?, content?}`
|
|
|
|
---
|
|
|
|
## 4. Sessions
|
|
|
|
| Method | Description |
|
|
|--------|-------------|
|
|
| `sessions.list` | List sessions (paginated) |
|
|
| `sessions.preview` | Get session history + summary |
|
|
| `sessions.patch` | Update label, model, metadata |
|
|
| `sessions.delete` | Delete session |
|
|
| `sessions.reset` | Clear session messages |
|
|
|
|
**`sessions.list` request:** `{agentId, limit, offset}`
|
|
**Response:** `{sessions[], total, limit, offset}`
|
|
|
|
---
|
|
|
|
## 5. Config
|
|
|
|
### `config.get`
|
|
|
|
Get current configuration.
|
|
|
|
**Response:** `{config: {...}, hash: "sha256", path: "/path/to/config.json"}`
|
|
|
|
### `config.apply`
|
|
|
|
Replace entire config (admin only). Uses optimistic locking via `baseHash`.
|
|
|
|
**Request:** `{raw: "json5 content", baseHash: "sha256"}`
|
|
**Response:** `{ok, path, config, hash, restart: false}`
|
|
|
|
### `config.patch`
|
|
|
|
Merge partial config update (admin only).
|
|
|
|
**Request:** `{raw: "{gateway: {port: 9090}}", baseHash: "sha256"}`
|
|
**Response:** `{ok, path, config, hash, restart: true}`
|
|
|
|
### `config.schema`
|
|
|
|
Get JSON schema for config form generation.
|
|
|
|
**Response:** `{json: {...schema...}}`
|
|
|
|
---
|
|
|
|
## 6. Skills
|
|
|
|
| Method | Description |
|
|
|--------|-------------|
|
|
| `skills.list` | List all available skills |
|
|
| `skills.get` | Get skill metadata and content |
|
|
| `skills.update` | Update skill metadata (DB-backed only) |
|
|
|
|
---
|
|
|
|
## 7. Cron
|
|
|
|
| Method | Description |
|
|
|--------|-------------|
|
|
| `cron.list` | List cron jobs |
|
|
| `cron.create` | Create scheduled job |
|
|
| `cron.update` | Update job settings |
|
|
| `cron.delete` | Delete job |
|
|
| `cron.toggle` | Enable/disable job |
|
|
| `cron.status` | Get scheduler status |
|
|
| `cron.run` | Trigger immediate execution |
|
|
| `cron.runs` | List execution history |
|
|
|
|
### `cron.create` Request
|
|
|
|
```json
|
|
{
|
|
"name": "daily-report",
|
|
"schedule": "every day at 09:00",
|
|
"message": "Generate daily report",
|
|
"deliver": "channel",
|
|
"channel": "telegram",
|
|
"to": "chat-id",
|
|
"agentId": "uuid"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 8. Channels
|
|
|
|
| Method | Description |
|
|
|--------|-------------|
|
|
| `channels.list` | List enabled channels |
|
|
| `channels.status` | Get channel connection status |
|
|
|
|
### Channel Instances
|
|
|
|
| Method | Description |
|
|
|--------|-------------|
|
|
| `channels.instances.list` | List instances |
|
|
| `channels.instances.get` | Get instance details |
|
|
| `channels.instances.create` | Create instance |
|
|
| `channels.instances.update` | Update instance |
|
|
| `channels.instances.delete` | Delete instance |
|
|
|
|
---
|
|
|
|
## 9. Device Pairing
|
|
|
|
| Method | Description | Auth |
|
|
|--------|-------------|------|
|
|
| `device.pair.request` | Request pairing (from device) | Unauthenticated |
|
|
| `device.pair.approve` | Approve request (from admin) | Admin |
|
|
| `device.pair.deny` | Deny request | Admin |
|
|
| `device.pair.list` | List pending + paired devices | Admin |
|
|
| `device.pair.revoke` | Revoke device | Admin |
|
|
| `browser.pairing.status` | Poll pairing status | Unauthenticated |
|
|
|
|
### Pairing Flow
|
|
|
|
```mermaid
|
|
sequenceDiagram
|
|
Device->>Gateway: device.pair.request {senderId, channel}
|
|
Gateway-->>Device: {code: "A1B2C3D4"}
|
|
Device->>Gateway: browser.pairing.status {sender_id} (poll)
|
|
Admin->>Gateway: device.pair.approve {code, approvedBy}
|
|
Gateway-->>Device: {status: "approved"}
|
|
```
|
|
|
|
---
|
|
|
|
## 10. Teams
|
|
|
|
### Team CRUD
|
|
|
|
| Method | Description |
|
|
|--------|-------------|
|
|
| `teams.list` | List all teams |
|
|
| `teams.create` | Create team (admin only) |
|
|
| `teams.get` | Get team with members |
|
|
| `teams.update` | Update team properties |
|
|
| `teams.delete` | Delete team |
|
|
|
|
### Members
|
|
|
|
| Method | Description |
|
|
|--------|-------------|
|
|
| `teams.members.add` | Add agent to team with role |
|
|
| `teams.members.remove` | Remove agent from team |
|
|
|
|
### Tasks
|
|
|
|
| Method | Description |
|
|
|--------|-------------|
|
|
| `teams.tasks.list` | List team tasks (filterable) |
|
|
| `teams.tasks.get` | Get task with comments/events |
|
|
| `teams.tasks.create` | Create task |
|
|
| `teams.tasks.approve` | Approve task |
|
|
| `teams.tasks.reject` | Reject task |
|
|
| `teams.tasks.comment` | Add comment |
|
|
| `teams.tasks.comments` | List comments |
|
|
| `teams.tasks.events` | List task events |
|
|
| `teams.tasks.assign` | Assign to member |
|
|
| `teams.tasks.delete` | Delete task |
|
|
|
|
### Team Context
|
|
|
|
| Method | Description |
|
|
|--------|-------------|
|
|
| `teams.known_users` | Get list of known user IDs in team |
|
|
| `teams.scopes` | Get channel/chat scopes for task routing |
|
|
| `teams.events.list` | List team task events (paginated) |
|
|
|
|
**`teams.known_users` request:** `{teamId}`
|
|
**Response:** `{users: ["user-1", "user-2", ...]}`
|
|
|
|
**`teams.scopes` request:** `{teamId}`
|
|
**Response:** `{scopes: [{channel, chatId, ...}]}`
|
|
|
|
**`teams.events.list` request:** `{team_id, limit?, offset?}`
|
|
**Response:** `{events: [...], count: N}`
|
|
|
|
### Workspace
|
|
|
|
| Method | Description |
|
|
|--------|-------------|
|
|
| `teams.workspace.list` | List workspace items |
|
|
| `teams.workspace.read` | Read workspace file |
|
|
| `teams.workspace.delete` | Delete workspace item |
|
|
|
|
---
|
|
|
|
## 11. Exec Approvals
|
|
|
|
| Method | Description |
|
|
|--------|-------------|
|
|
| `exec.approval.list` | List pending command approvals |
|
|
| `exec.approval.approve` | Approve (optionally always for this command) |
|
|
| `exec.approval.deny` | Deny command execution |
|
|
|
|
---
|
|
|
|
## 12. Delegations
|
|
|
|
| Method | Description |
|
|
|--------|-------------|
|
|
| `delegations.list` | List delegation history (filterable) |
|
|
| `delegations.get` | Get delegation record |
|
|
|
|
**Filters:** `source_agent_id`, `target_agent_id`, `team_id`, `user_id`, `status`
|
|
|
|
---
|
|
|
|
## 13. Usage & Quotas
|
|
|
|
| Method | Description |
|
|
|--------|-------------|
|
|
| `usage.get` | Get usage records by agent |
|
|
| `usage.summary` | Get summary of token usage |
|
|
| `quota.usage` | Get quota consumption |
|
|
|
|
---
|
|
|
|
## 14. API Keys
|
|
|
|
Admin-only methods.
|
|
|
|
| Method | Description |
|
|
|--------|-------------|
|
|
| `api_keys.list` | List API keys (masked) |
|
|
| `api_keys.create` | Create new API key |
|
|
| `api_keys.revoke` | Revoke an API key |
|
|
|
|
See [20 — API Keys & Auth](20-api-keys-auth.md) for the full authentication model.
|
|
|
|
---
|
|
|
|
## 15. Messaging
|
|
|
|
### `send`
|
|
|
|
Route an outbound message to a channel.
|
|
|
|
**Request:** `{channel: "telegram", to: "chat-id", message: "Hello"}`
|
|
**Response:** `{ok: true, channel, to}`
|
|
|
|
---
|
|
|
|
## 16. Logs
|
|
|
|
### `logs.tail`
|
|
|
|
Start or stop live log streaming.
|
|
|
|
**Request:** `{action: "start", level: "info"}`
|
|
**Response:** `{status: "started", level: "info"}`
|
|
|
|
Log entries are delivered as events while tailing is active.
|
|
|
|
---
|
|
|
|
## 17. Permission Matrix
|
|
|
|
Methods are gated by role. The role is determined at `connect` time from the token type and scopes.
|
|
|
|
| Role | Access |
|
|
|------|--------|
|
|
| **Admin** | All methods |
|
|
| **Operator** | Read + write operations (chat, sessions, cron, approvals, send) |
|
|
| **Viewer** | Read-only (list, get, preview, status, history) |
|
|
|
|
### Admin-Only Methods
|
|
|
|
`config.apply`, `config.patch`, `agents.create`, `agents.update`, `agents.delete`, `channels.toggle`, `device.pair.approve`, `device.pair.deny`, `device.pair.revoke`, `teams.*`, `api_keys.*`
|
|
|
|
### Write Methods (Operator+)
|
|
|
|
`chat.send`, `chat.abort`, `chat.inject`, `sessions.delete`, `sessions.reset`, `sessions.patch`, `cron.*`, `skills.update`, `exec.approval.*`, `send`, `teams.tasks.*`
|
|
|
|
### Read Methods (Viewer+)
|
|
|
|
All other methods: list, get, preview, status, history, etc.
|
|
|
|
---
|
|
|
|
## 18. Events
|
|
|
|
The server pushes events to connected clients via event frames. Key event types:
|
|
|
|
| Event | Description |
|
|
|-------|-------------|
|
|
| `run.started` | Agent run began |
|
|
| `run.completed` | Agent run finished |
|
|
| `chunk` | Streaming text chunk |
|
|
| `tool.call` | Tool invocation started |
|
|
| `tool.result` | Tool invocation completed |
|
|
| `session.updated` | Session metadata changed |
|
|
| `agent.updated` | Agent config changed |
|
|
| `cron.fired` | Cron job triggered |
|
|
| `team.task.*` | Team task lifecycle events |
|
|
| `exec.approval.pending` | Command awaiting approval |
|
|
|
|
---
|
|
|
|
## File Reference
|
|
|
|
| File | Purpose |
|
|
|------|---------|
|
|
| `internal/gateway/router.go` | Method dispatch + auth + connect handler |
|
|
| `internal/gateway/client.go` | WebSocket client + frame reading |
|
|
| `internal/gateway/server.go` | Server + mux setup |
|
|
| `internal/gateway/methods/chat.go` | Chat send/history/abort/inject |
|
|
| `internal/gateway/methods/agents.go` | Agent list/status |
|
|
| `internal/gateway/methods/agents_create.go` | Agent creation |
|
|
| `internal/gateway/methods/agents_update.go` | Agent update |
|
|
| `internal/gateway/methods/agents_delete.go` | Agent deletion |
|
|
| `internal/gateway/methods/agents_files.go` | Agent context files |
|
|
| `internal/gateway/methods/agents_identity.go` | Agent identity |
|
|
| `internal/gateway/methods/config.go` | Config get/apply/patch/schema |
|
|
| `internal/gateway/methods/sessions.go` | Session CRUD |
|
|
| `internal/gateway/methods/skills.go` | Skill list/get/update |
|
|
| `internal/gateway/methods/cron.go` | Cron job management |
|
|
| `internal/gateway/methods/channels.go` | Channel listing |
|
|
| `internal/gateway/methods/channel_instances.go` | Channel instance CRUD |
|
|
| `internal/gateway/methods/pairing.go` | Device pairing flow |
|
|
| `internal/gateway/methods/teams.go` | Team list, create, get, delete, context methods |
|
|
| `internal/gateway/methods/teams_crud.go` | Team CRUD operations |
|
|
| `internal/gateway/methods/teams_members.go` | Team membership |
|
|
| `internal/gateway/methods/teams_tasks.go` | Team task management |
|
|
| `internal/gateway/methods/teams_workspace.go` | Team workspace |
|
|
| `internal/gateway/methods/exec_approval.go` | Exec approval flow |
|
|
| `internal/gateway/methods/delegations.go` | Delegation history |
|
|
| `internal/gateway/methods/usage.go` | Usage records |
|
|
| `internal/gateway/methods/quota_methods.go` | Quota consumption |
|
|
| `internal/gateway/methods/api_keys.go` | API key management |
|
|
| `internal/gateway/methods/send.go` | Outbound messaging |
|
|
| `internal/gateway/methods/logs.go` | Log tailing |
|
|
| `internal/permissions/policy.go` | RBAC policy engine |
|
|
| `pkg/protocol/methods.go` | Method name constants |
|