Changeset 0.37.14 (#226)
Co-authored-by: gobha <jasafpro@gmail.com> Co-committed-by: gobha <jasafpro@gmail.com>
This commit is contained in:
@@ -50,12 +50,15 @@ GET /settings/public
|
||||
"allow_registration": "true",
|
||||
"allow_user_byok": "true",
|
||||
"allow_user_personas": "true",
|
||||
"channel_retention_mode": "flexible"
|
||||
"retention_ttl_days": 0
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Note: policy values are strings (`"true"` / `"false"`), not booleans.
|
||||
`retention_ttl_days` is an integer (days). When > 0, channels using
|
||||
global/team providers are archived on delete and purged after TTL.
|
||||
Personal (BYOK) provider channels are always immediately deleted.
|
||||
|
||||
### Banner Configuration
|
||||
|
||||
@@ -202,7 +205,7 @@ admin's own email address using the configured SMTP settings.
|
||||
### Archived Channels
|
||||
|
||||
```
|
||||
GET /admin/channels/archived → { "channels": [...], "total", "page", "per_page", "retention_mode" }
|
||||
GET /admin/channels/archived → { "channels": [...], "total", "page", "per_page", "retention_ttl_days" }
|
||||
DELETE /admin/channels/:id/purge → permanent delete (ignores retention)
|
||||
```
|
||||
|
||||
|
||||
@@ -116,10 +116,34 @@ Same field set as create, plus `is_archived`, `is_pinned`, `settings`
|
||||
DELETE /channels/:id
|
||||
```
|
||||
|
||||
Cascades: deletes messages, files, channel_models, channel_kbs,
|
||||
**Retention policy (v0.37.14):** When `retention_ttl_days > 0`, all
|
||||
channels are archived on delete and purged after the TTL. The only
|
||||
exception is channels using a Personal (BYOK) provider — those are
|
||||
always hard-deleted immediately.
|
||||
|
||||
| Provider scope | TTL > 0 | TTL = 0 |
|
||||
|---------------|---------|---------|
|
||||
| `personal` (BYOK) | Hard delete | Hard delete |
|
||||
| `global` | Archive + purge after TTL | Hard delete |
|
||||
| `team` | Archive + purge after TTL | Hard delete |
|
||||
| NULL (no provider) | Archive + purge after TTL | Hard delete |
|
||||
|
||||
When retention applies, the channel is archived (`is_archived = true`)
|
||||
and stamped with `purge_after`. A background scanner purges channels
|
||||
past their `purge_after` hourly. Archived channels are hidden from
|
||||
the user's sidebar.
|
||||
|
||||
Non-owners who call DELETE are removed as participants ("leave channel")
|
||||
instead of deleting.
|
||||
|
||||
**Response (immediate delete):** `{"message": "channel deleted"}`
|
||||
**Response (retention):** `{"message": "channel archived for retention", "purge_after": "..."}`
|
||||
**Response (leave):** `{"message": "left channel"}`
|
||||
|
||||
Hard-delete cascades: messages, files, channel_models, channel_kbs,
|
||||
channel_participants. Storage cleanup runs asynchronously.
|
||||
|
||||
**Auth:** Owner only.
|
||||
**Auth:** Owner for delete/archive; any participant for leave.
|
||||
|
||||
### Message Tree
|
||||
|
||||
|
||||
@@ -248,3 +248,62 @@ This endpoint is the SDK's bootstrap source for `sw.can(permission)`.
|
||||
Called once at login and on each token refresh.
|
||||
|
||||
---
|
||||
|
||||
### Bootstrap (v0.37.15)
|
||||
|
||||
```
|
||||
GET /profile/bootstrap
|
||||
```
|
||||
|
||||
**Auth:** Authenticated user
|
||||
|
||||
Single-call boot payload for the SDK. Collapses what previously required
|
||||
3–4 sequential requests (profile, permissions, teams/mine, settings) into
|
||||
one call. The SDK calls this at startup and on token refresh.
|
||||
|
||||
**Response:**
|
||||
|
||||
```json
|
||||
{
|
||||
"user": {
|
||||
"id": "uuid",
|
||||
"username": "jdoe",
|
||||
"display_name": "Jane Doe",
|
||||
"email": "jdoe@example.com",
|
||||
"role": "user",
|
||||
"avatar": "data:image/png;base64,..."
|
||||
},
|
||||
"permissions": ["channel.create", "kb.read", "model.use"],
|
||||
"groups": ["group-id-1", "00000000-0000-0000-0000-000000000001"],
|
||||
"teams": [
|
||||
{ "id": "uuid", "name": "Engineering", "my_role": "member" }
|
||||
],
|
||||
"policies": {
|
||||
"allow_user_byok": false,
|
||||
"allow_user_personas": false,
|
||||
"allow_raw_model_access": true,
|
||||
"kb_direct_access": true
|
||||
},
|
||||
"settings": {
|
||||
"theme": "dark",
|
||||
"editor_keybindings": "vim"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| `user` | object | Curated profile (same fields as `GET /profile` minus timestamps) |
|
||||
| `permissions` | string[] | Resolved permission set (sorted). Admins get all. |
|
||||
| `groups` | string[] | Contributing group IDs (always includes Everyone) |
|
||||
| `teams` | object[] | Active team memberships with `my_role` |
|
||||
| `policies` | object | Boolean policy flags for UI feature gating |
|
||||
| `settings` | object | User preferences (`{}` if never saved) |
|
||||
|
||||
`user.avatar` is omitted when unset (not `null`).
|
||||
|
||||
This is a **superset** of `GET /profile/permissions` — it includes
|
||||
everything that endpoint returns plus `user` and `settings`. Clients
|
||||
that only need permissions can continue using the narrower endpoint.
|
||||
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user