projects: file explorer, ws improvements, i18n, and fs routing
Nightly Build / build (push) Successful in 6m47s

Add project-files component with tree navigation. Extend UserFs with
shared-folder resolution. Wire API routes for file browsing. Improve
WS session lifecycle and project-board layout. Add i18n keys for
projects and inbox across all locales.
This commit is contained in:
2026-07-22 18:35:13 +01:00
parent 8407a949fc
commit f34f800e5c
16 changed files with 733 additions and 40 deletions
+13 -3
View File
@@ -428,10 +428,20 @@ async fn handle_socket(mut socket: WebSocket, skald: Arc<Skald>, source: String,
match event {
Ok(ge) => {
// Forward events for this connection's source.
// ApprovalResolved is forwarded regardless of source so the
// copilot can react to approvals resolved from other clients.
// The inbox lifecycle events (approval/clarification/
// elicitation requested+resolved) are forwarded regardless
// of source: they carry no content — just ids — and let the
// sidebar badge and inbox pages refresh live when any of
// this user's sessions (chat, cron, background) raises or
// settles a pending item.
let forward = ge.source.as_deref() == Some(source.as_str())
|| matches!(ge.event, ServerEvent::ApprovalResolved { .. });
|| matches!(ge.event,
ServerEvent::ApprovalRequested { .. }
| ServerEvent::ApprovalResolved { .. }
| ServerEvent::ClarificationRequested { .. }
| ServerEvent::ClarificationResolved { .. }
| ServerEvent::ElicitationRequested { .. }
| ServerEvent::ElicitationResolved { .. });
if !forward { continue; }
debug!(event_type = ge.event.type_name(), "sending event to client");
if socket.send(to_msg(&ge.event)).await.is_err() {