Files
goclaw/ui/web/src/i18n/locales/en/nodes.json
T
yatulandClaude Opus 5 ea4890c257 fix(pairing): address review — docs, error mapping, approve feedback, unreadable expiry
- docs: device.pair.update and the `permanent` option on approve in
  docs/04-gateway-protocol.md, docs/19-websocket-rpc.md and
  websocket-protocol.md; the paired-device TTL row in docs/09-security.md
  now mentions the admin opt-out.
- store.ErrPairedDeviceNotFound: SetPairingPermanent wraps it in both stores.
  device.pair.update maps it to NOT_FOUND and any other store error to
  INTERNAL, so a DB failure no longer reads as "not found".
- web UI: approve and make-permanent/set-expiry now toast the server error
  and reload the list in `finally`. A partially applied approve (paired, but
  the permanent write failed) shows up in the table instead of leaving the
  dialog dead-ended.
- SQLite ListPaired: a stored expiry that fails to parse stays 0 (expires,
  date unknown) rather than being mistaken for permanent; the UI renders it
  as "--" instead of a 1970 date.

Tests: gateway handler error mapping (NOT_FOUND / INTERNAL / OK), sentinel
checks in the PG and SQLite store tests, SQLite unreadable-expiry case.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-18 19:26:43 +04:00

55 lines
1.9 KiB
JSON

{
"title": "Nodes",
"description": "Manage paired devices and pending pairing requests",
"emptyTitle": "No devices",
"emptyDescription": "No paired devices or pending pairing requests.",
"pendingRequests": "Pending Requests ({{count}})",
"pairedDevices": "Paired Devices ({{count}})",
"sender": "Sender:",
"chat": "Chat:",
"columns": {
"channel": "Channel",
"senderId": "Sender ID",
"paired": "Paired",
"by": "By",
"expires": "Expires",
"actions": "Actions"
},
"approve": "Approve",
"deny": "Deny",
"revoke": "Revoke",
"never": "Never",
"makePermanent": "Make permanent",
"makeExpiring": "Set expiry",
"confirmApprove": {
"title": "Approve Pairing",
"description": "Approve pairing request from {{channel}}:{{senderId}} (code: {{code}})? This device will be able to interact with agents.",
"confirmLabel": "Approve",
"permanent": "Never expires (otherwise 30 days)"
},
"confirmDeny": {
"title": "Deny Pairing",
"description": "Deny pairing request from {{channel}}:{{senderId}} (code: {{code}})? The request will be removed.",
"confirmLabel": "Deny"
},
"confirmRevoke": {
"title": "Revoke Device",
"description": "Revoke pairing for {{channel}}:{{senderId}}? The device will need to re-pair.",
"confirmLabel": "Revoke"
},
"confirmPermanent": {
"title": "Make Pairing Permanent",
"description": "Make the pairing for {{channel}}:{{senderId}} permanent? It will stay until revoked manually.",
"confirmLabel": "Make permanent"
},
"confirmExpiring": {
"title": "Set Pairing Expiry",
"description": "Return the pairing for {{channel}}:{{senderId}} to the standard term? It will expire in 30 days from now.",
"confirmLabel": "Set expiry"
},
"toast": {
"approveFailed": "Could not approve pairing",
"updateFailed": "Could not change pairing expiry"
}
}