mirror of
https://github.com/tiennm99/goclaw.git
synced 2026-10-11 03:13:24 +00:00
- 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]>
55 lines
1.9 KiB
JSON
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"
|
|
}
|
|
}
|