A refresh token. token is raw on the way in and never stored.
family_id groups a token with every token it has been rotated into.
family_expires_at is an absolute ceiling: rotation extends a token's own
life but never the family's, so a stolen-and-rotated chain cannot live
forever.
Summary
Types
@type t() :: %Noizu.MCP.Auth.Server.Store.RefreshToken{ client_id: String.t(), expires_at: DateTime.t(), family_expires_at: DateTime.t() | nil, family_id: String.t(), id: String.t() | nil, inserted_at: DateTime.t() | nil, resource: String.t() | nil, revoked_at: DateTime.t() | nil, rotated_at: DateTime.t() | nil, rotated_to: String.t() | nil, scope: [String.t()], subject: String.t(), token: String.t() | nil }