Added
- Workspace deletion.
DELETE /admin/tenants/{id}removes a workspace and
everything scoped to it, in one transaction, plus its ClickHouse click events
and its Keycloak realm. Only theOwnercan delete, the last remaining
workspace cannot be deleted, and a tenant the caller is not a member of
answers404rather than403so the endpoint cannot be used to enumerate
workspaces. The panel asks for the slug to be typed before it will proceed.
Deleting frees the slug for reuse. Seedocs/WORKSPACES.mdfor what is
removed immediately and what is removed eventually. - Workspace creation explains the wait. The request provisions a realm, a
client, a mapper and a user in Keycloak, so it is legitimately slow. The
panel now says a sign-in is being prepared, and after a threshold adds that
it is taking longer than usual and that reloading is safe. disabled_reasonon the webhook representation inGET /admin/webhooks,
which lets the panel tell a subscription the user paused from one the system
disabled.
Fixed
- Webhook destination URLs no longer reach the logs. For Discord, Slack,
Telegram and the generic connectors the token lives in the URL path, so the
URL is the credential. It was printed in full at ten log sites. The field is
now aWebhookUrlwhoseDisplayprints host and port only, andreqwest
does not accept it without an explicitexpose(), so reintroducing the leak
is a compile error rather than a review miss. The subscription's signing
secret was also readable through the struct'sDebug, and no longer is. - A dead webhook destination is no longer retried forever.
404and410
mean the destination is gone, but every non-2xx response was treated the
same, so a removed endpoint burned the full attempt budget on every event,
indefinitely. Those two statuses now get one confirmation attempt, and a
destination that fails it is disabled with the reason recorded and shown in
the panel.429,5xx, timeouts and transport errors keep the existing
backoff.400and422are deliberately not treated as permanent: they
usually mean our payload is wrong, and disabling a customer's integration
over our own bug is the worst outcome available. - Reconnecting Slack over a disabled subscription reactivates it. The OAuth
merge inheritedactive: falseand the old reason, so the obvious fix
(reconnect) appeared to work and delivered nothing. - Log events from
main.rscarry fields again. Eight sites built JSON by
hand inside the log macro, which underQUARK_LOG_FORMAT=jsonproduced a
serialized object escaped insidemessage, so the values were text rather
than queryable fields. Six of them logged errors atinfo, which no alert
keyed on severity would ever match.
Imagem do container
docker pull ghcr.io/lucasolopes/quark:0.4.1
Plataformas: linux/amd64, linux/arm64.
Digest: sha256:e2a7fd50ca44730c1293c152804ec0b88ab2339ddbdbe9eecef1aaeb909d42f5
Verifique a proveniencia do build:
gh attestation verify oci://ghcr.io/lucasolopes/quark:0.4.1 --repo lucasolopes/quark