diff --git a/ai-hub/app/core/grpc/services/grpc_server.py b/ai-hub/app/core/grpc/services/grpc_server.py index 28d4dd3..8ad19b2 100644 --- a/ai-hub/app/core/grpc/services/grpc_server.py +++ b/ai-hub/app/core/grpc/services/grpc_server.py @@ -281,29 +281,35 @@ ] self.journal.fulfill(task_id, {"files": files, "path": fs.manifest.root_path}) - drifts = self.mirror.reconcile(fs.session_id, fs.manifest) - if drifts: - print(f" [📁🏃] Drift Detected (Node -> Server): Requesting {len(drifts)} files") - # Request node to push these specific files - node.queue.put(agent_pb2.ServerTaskMessage( - file_sync=agent_pb2.FileSyncMessage( - session_id=fs.session_id, - control=agent_pb2.SyncControl( - action=agent_pb2.SyncControl.REFRESH_MANIFEST, - path=fs.manifest.root_path, - request_paths=drifts + # M6: Only reconcile for real user sessions, not for the modular explorer. + if fs.session_id != "__fs_explorer__": + drifts = self.mirror.reconcile(fs.session_id, fs.manifest) + if drifts: + print(f" [📁🏃] Drift Detected (Node -> Server): Requesting {len(drifts)} files") + # Request node to push these specific files + node.queue.put(agent_pb2.ServerTaskMessage( + file_sync=agent_pb2.FileSyncMessage( + session_id=fs.session_id, + control=agent_pb2.SyncControl( + action=agent_pb2.SyncControl.REFRESH_MANIFEST, + path=fs.manifest.root_path, + request_paths=drifts + ) ) - ) - )) - else: - self.registry.emit(node_id, "sync_status", {"message": "Synchronized (Node -> Server)", "code": 0}) + )) + else: + self.registry.emit(node_id, "sync_status", {"message": "Synchronized (Node -> Server)", "code": 0}) elif fs.HasField("status"): print(f" [📁] Sync Status from {node_id}: {fs.status.message}") - # M6: Handle interactive write/rm result correlation - if task_id and (task_id.startswith("fs-write-") or task_id.startswith("fs-rm-")): - self.journal.fulfill(task_id, {"success": fs.status.code == 0, "message": fs.status.message}) + # M6: Handle interactive write/rm/ls/cat result correlation from node-side error status + if task_id and task_id.startswith("fs-"): + success = fs.status.code == 0 + if not success: + self.journal.fulfill(task_id, {"error": fs.status.message}) + elif task_id.startswith("fs-write-") or task_id.startswith("fs-rm-"): + self.journal.fulfill(task_id, {"success": True, "message": fs.status.message}) self.registry.emit(node_id, "sync_status", {"message": fs.status.message, "code": fs.status.code}) if fs.status.code == agent_pb2.SyncStatus.RECONCILE_REQUIRED: diff --git a/ui/client-app/src/services/apiService.js b/ui/client-app/src/services/apiService.js index af1f8e8..41e1d17 100644 --- a/ui/client-app/src/services/apiService.js +++ b/ui/client-app/src/services/apiService.js @@ -877,7 +877,14 @@ method: "GET", headers: { "X-User-ID": userId }, }); - if (!response.ok) throw new Error("Failed to list directory"); + if (!response.ok) { + let detail = "Failed to list directory"; + try { + const errBody = await response.json(); + detail = errBody.detail || detail; + } catch { } + throw new Error(detail); + } return await response.json(); };