Protocol
Wire contract for PearData P2P RPC. Source of truth: shared/protocol.js, shared/schema.js, shared/metrics.js.
Identity
| Constant |
Value |
| Protocol id |
peardata/rpc |
| Protocol version |
1 |
| Invite prefix |
pd1. |
| Default role |
viewer |
Bump PROTOCOL_VERSION on breaking argument/result shapes.
Roles
| Role |
Rank |
Typical access |
viewer |
1 |
Read metrics, subscribe, list alerts |
operator |
2 |
Ack/silence alerts, run jobs, set alert config |
admin |
3 |
Mint invites, revoke peers, export snapshot |
Auth modes at handshake: public key (viewer), capability token / pd1. invite, admin seed proof, allowlist.
Methods
Session
| Method |
Role |
Notes |
handshake |
viewer |
Negotiate version + elevate role |
ping |
viewer |
Hot |
getServerInfo |
viewer |
Agent metadata |
getAuthStatus |
viewer |
Peer role / auth mode |
setDisplayName |
viewer |
Label for audit / UI |
Node
| Method |
Role |
Result |
getNodeInfo |
viewer |
Hostname, CPUs, charts, sample interval |
getHealth |
viewer |
{ status, score, checks } |
Metrics discovery & query
| Method |
Role |
Args |
Result |
listContexts |
viewer |
— |
Context catalog |
getContext |
viewer |
{ id } |
Charts in context |
listCharts |
viewer |
— |
agent-style chart map |
getChart |
viewer |
{ id } |
Chart summary |
queryData |
viewer |
{ chart, after, before, points, group, tier } |
Time series |
getWeights |
viewer |
see below |
Metric Correlations / alert weights |
queryLogs |
viewer* |
see below |
Anomaly / audit / journal lines |
listProcesses |
viewer |
sort / filter / q / limit |
Live Linux /proc process table |
getAllMetrics |
viewer |
{ format: json|prometheus|shell } |
Latest export |
* queryLogs method role is viewer so anomaly search works for all dialers; audit and journal sources require admin inside the handler.
after / before: absolute unix seconds, or relative (negative = relative to before/now), agent-style.
getWeights
Scores charts for Metric Correlations (or legacy alert weights when no highlight window).
| Arg |
Notes |
method |
volume | ks2 | anomaly-rate | value | alerts |
after / before |
Highlight window |
baseline_after / baseline_before |
Optional baseline (default 4× preceding highlight) |
points, time_group, contexts, charts, dimensions, limit, timeout |
Same as REST |
REST parity: GET /api/v*/weights. Engine: server/services/weights.js.
queryLogs
| Arg |
Notes |
source |
journal (default) | anomaly | audit — desktop prefers journal for admins |
q |
Case-insensitive substring |
since / until |
Absolute ms/sec or relative (-1h) |
priority / unit |
Journal filters |
limit / cursor |
Cap (≤2000) + pagination offset |
Journal is enabled by default on Linux (PEARDATA_JOURNAL=0 to disable). Installer grants systemd-journal to the agent user. REST: GET /api/v*/logs. Engine: server/services/logs.js. UI: user-guide/logs.md.
listProcesses
| Arg |
Notes |
sort |
cpu (default) | rss | pid | name | io | threads | age | fds | state |
order |
desc (default) | asc |
filter |
all | running | sleeping | zombie | stopped | highcpu | highmem | hasio | kernel | user |
q |
Substring over pid / name / cmdline / user / cgroup |
limit / offset |
Cap ≤2000 |
pid |
Optional — return one process with detail fields (fds, exe, cwd, …) |
Linux /proc only. Rates need two samples (~450ms cache). REST: GET /api/v*/processes. UI: user-guide/processes.md.
Live subscriptions
| Method |
Role |
Args |
subscribeMetrics |
viewer |
{ charts: string[]|['*'], intervalMs } |
unsubscribeMetrics |
viewer |
— |
subscribeAnomalies |
viewer |
— |
unsubscribeAnomalies |
viewer |
— |
Anomalies & alerts
| Method |
Role |
Notes |
listAnomalies |
viewer |
Recent events |
listAlerts / getAlert |
viewer |
State + config |
setAlertConfig |
operator |
Upsert threshold |
ackAlert |
operator |
Clear until next breach |
silenceAlert |
operator |
Disable temporarily |
Jobs
| Method |
Role |
Known jobs |
listJobs |
viewer |
— |
runJob |
operator |
collectOnce, snapshot, gcBuffers (prune) |
cancelJob |
operator |
By job id |
Data Manager (retention / storage)
| Method |
Role |
Notes |
getStorageInfo |
viewer |
Disk usage, memory rings, warm sample stats, effective retention |
getRetentionConfig |
viewer |
Current policy (retention.json; default warm age 1 year) |
setRetentionConfig |
admin |
Update hot/warm rings, age rotate, disk budget, auto-prune |
pruneHistory |
admin |
{ dryRun?, beforeMs? } — delete warm points past retention |
UI: user-guide/settings.md → Data. Job alias: runJob({ name: 'gcBuffers' }) runs the same prune path.
HyperDB / peer links
| Method |
Role |
Notes |
getDbInfo |
viewer |
DB + discovery keys, swarm flag, remotes |
listPeerLinks |
viewer |
Linked peers from HyperDB |
linkPeer |
admin |
Upsert link; open remote bee + optional swarm join |
unlinkPeer |
admin |
Remove link |
getFleetHealth |
viewer |
Parent rollup (when PEARDATA_PARENT=1) |
listChildPeers |
viewer |
Dialed child agents |
See STORAGE-HYPERDB.md.
Admin
| Method |
Role |
mintInvite |
admin |
listPeers |
admin |
revokePeer |
admin |
exportSnapshot |
admin |
Pushes (server → client)
| Event |
Payload |
push:metrics |
{ samples: MetricSample[] } |
push:anomaly |
AnomalyEvent |
push:alert |
Alert transition |
push:health |
HealthSnapshot |
push:job |
JobRecord |
push:system |
Generic notices |
Errors
Handlers throw Error with .code:
| Code |
Meaning |
PERMISSION_DENIED |
Role too low |
RATE_LIMIT_EXCEEDED |
RPM exceeded |
INVALID_ARGS |
Schema failure |
NOT_CONNECTED |
Client-side |
CAPABILITY_* |
Invite/token issues |
Versioning policy
- Additive methods/fields: no version bump if old clients ignore unknowns.
- Rename/remove/change meaning: bump
PROTOCOL_VERSION; reject or compat-negotiate in handshake.
- REST API versions (
v1/v2/v3) are independent of RPC version but share the store.
Example session