jacquard 0.12.2 only refreshes on a 401, but the PDS reports expiry as a 400
ExpiredToken, so DM polling failed after about two hours.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
stream_labels only noticed a disconnect on its next send, so with few labels
closed subscribers piled up in CLOSE-WAIT until the server ran out of file
descriptors. It now watches the socket and pings every 30s.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`cargo run --bin setup -- did` adds #atproto_label and #atproto_labeler to the
DID document via the PDS-signed PLC flow, prompting for the main password and
the emailed code. Splits setup into declare/did modules.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`cargo run --bin setup -- declare` writes app.bsky.labeler.service/self with
one inform-severity label per city and opts out of reports.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Lets additional binaries share the labeler code. Adds a shared login()
helper and Cities::iter/is_empty for use outside the crate.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Users DM @cities.pds.cosocial.ca their city and get a signed account label.
Serves com.atproto.label.queryLabels and subscribeLabels, built on jacquard.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>