51
updated_at: float
52
53
54
+@dataclass(frozen=True)
55
+class RemoteFileMetadata:
56
+ enabled: bool
57
+ write_enabled: bool
58
+ mode: str
59
+ updated_at: float
60
+
61
+
62
+@dataclass(frozen=True)
63
+class RemoteExecMetadata:
64
+ enabled: bool
65
+ updated_at: float
66
+
67
+
68
_context_subscriptions: dict[str, set[str]] = {}
69
_sid_contexts: dict[str, set[str]] = {}
70
_pending_file_ops: dict[str, PendingFileOperation] = {}
72
_pending_computer_use_ops: dict[str, PendingComputerUseOperation] = {}
73
_remote_tree_snapshots: dict[str, RemoteTreeSnapshot] = {}
74
_sid_computer_use_metadata: dict[str, ComputerUseMetadata] = {}
75
+_sid_remote_file_metadata: dict[str, RemoteFileMetadata] = {}
76
+_sid_remote_exec_metadata: dict[str, RemoteExecMetadata] = {}
77
_state_lock = threading.RLock()
78
79
87
contexts = _sid_contexts.pop(sid, set())
88
_remote_tree_snapshots.pop(sid, None)
89
_sid_computer_use_metadata.pop(sid, None)
90
+ _sid_remote_file_metadata.pop(sid, None)
91
+ _sid_remote_exec_metadata.pop(sid, None)
92
for context_id in contexts:
93
subscribers = _context_subscriptions.get(context_id)
94
if not subscribers:
185
return sorted(subscribers)[0]
186
187
188
+def store_sid_remote_file_metadata(sid: str, payload: dict[str, Any]) -> RemoteFileMetadata:
189
+ write_enabled = bool(payload.get("write_enabled"))
190
+ mode = str(payload.get("mode", "") or "").strip().lower()
191
+ if mode not in {"read_only", "read_write"}:
192
+ mode = "read_write" if write_enabled else "read_only"
193
+ metadata = RemoteFileMetadata(
194
+ enabled=bool(payload.get("enabled", True)),
195
+ write_enabled=write_enabled,
196
+ mode=mode,
197
+ updated_at=time.time(),
198
+ )
199
+ with _state_lock:
200
+ _sid_remote_file_metadata[sid] = metadata
201
+ return metadata
202
+
203
+
204
+def clear_sid_remote_file_metadata(sid: str) -> None:
205
+ with _state_lock:
206
+ _sid_remote_file_metadata.pop(sid, None)
207
+
208
+
209
+def remote_file_metadata_for_sid(sid: str) -> dict[str, Any] | None:
210
+ with _state_lock:
211
+ metadata = _sid_remote_file_metadata.get(sid)
212
+ if metadata is None:
213
+ return None
214
+ return {
215
+ "enabled": metadata.enabled,
216
+ "write_enabled": metadata.write_enabled,
217
+ "mode": metadata.mode,
218
+ "updated_at": metadata.updated_at,
219
+ }
220
+
221
+
222
+def select_remote_file_target_sid(context_id: str, *, require_writes: bool = False) -> str | None:
223
+ with _state_lock:
224
+ subscribers = sorted(_context_subscriptions.get(context_id, set()))
225
+ fallback_sid: str | None = None
226
+ for sid in subscribers:
227
+ metadata = _sid_remote_file_metadata.get(sid)
228
+ if metadata is None:
229
+ if fallback_sid is None:
230
+ fallback_sid = sid
231
+ continue
232
+ if not metadata.enabled:
233
+ continue
234
+ if require_writes and not metadata.write_enabled:
235
+ continue
236
+ return sid
237
+ return fallback_sid
238
+
239
+
240
+def store_sid_remote_exec_metadata(sid: str, payload: dict[str, Any]) -> RemoteExecMetadata:
241
+ metadata = RemoteExecMetadata(
242
+ enabled=bool(payload.get("enabled")),
243
+ updated_at=time.time(),
244
+ )
245
+ with _state_lock:
246
+ _sid_remote_exec_metadata[sid] = metadata
247
+ return metadata
248
+
249
+
250
+def clear_sid_remote_exec_metadata(sid: str) -> None:
251
+ with _state_lock:
252
+ _sid_remote_exec_metadata.pop(sid, None)
253
+
254
+
255
+def remote_exec_metadata_for_sid(sid: str) -> dict[str, Any] | None:
256
+ with _state_lock:
257
+ metadata = _sid_remote_exec_metadata.get(sid)
258
+ if metadata is None:
259
+ return None
260
+ return {
261
+ "enabled": metadata.enabled,
262
+ "updated_at": metadata.updated_at,
263
+ }
264
+
265
+
266
+def select_remote_exec_target_sid(context_id: str) -> str | None:
267
+ with _state_lock:
268
+ subscribers = sorted(_context_subscriptions.get(context_id, set()))
269
+ fallback_sid: str | None = None
270
+ for sid in subscribers:
271
+ metadata = _sid_remote_exec_metadata.get(sid)
272
+ if metadata is None:
273
+ if fallback_sid is None:
274
+ fallback_sid = sid
275
+ continue
276
+ if metadata.enabled:
277
+ return sid
278
+ return fallback_sid
279
+
280
+
281
def store_sid_computer_use_metadata(sid: str, payload: dict[str, Any]) -> ComputerUseMetadata:
282
features_value = payload.get("features")
283
if isinstance(features_value, (list, tuple)):