@myrialabs/clopen 0.2.7 → 0.2.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/backend/chat/stream-manager.ts +23 -12
  2. package/backend/mcp/project-context.ts +20 -0
  3. package/backend/mcp/servers/browser-automation/actions.ts +0 -2
  4. package/backend/mcp/servers/browser-automation/browser.ts +80 -143
  5. package/backend/mcp/servers/browser-automation/inspection.ts +5 -11
  6. package/backend/preview/browser/browser-mcp-control.ts +174 -195
  7. package/backend/preview/browser/browser-preview-service.ts +3 -3
  8. package/backend/preview/browser/browser-video-capture.ts +12 -14
  9. package/backend/preview/browser/scripts/video-stream.ts +14 -14
  10. package/backend/preview/browser/types.ts +7 -7
  11. package/backend/preview/index.ts +1 -1
  12. package/backend/terminal/stream-manager.ts +40 -26
  13. package/backend/ws/preview/index.ts +3 -3
  14. package/backend/ws/system/operations.ts +23 -0
  15. package/frontend/components/chat/message/MessageBubble.svelte +2 -2
  16. package/frontend/components/chat/tools/components/FileHeader.svelte +1 -1
  17. package/frontend/components/chat/tools/components/TerminalCommand.svelte +8 -1
  18. package/frontend/components/common/overlay/Dialog.svelte +1 -1
  19. package/frontend/components/common/overlay/Lightbox.svelte +2 -2
  20. package/frontend/components/common/overlay/Modal.svelte +2 -2
  21. package/frontend/components/common/xterm/XTerm.svelte +6 -1
  22. package/frontend/components/git/ConflictResolver.svelte +1 -1
  23. package/frontend/components/git/GitModal.svelte +2 -2
  24. package/frontend/components/preview/browser/BrowserPreview.svelte +1 -1
  25. package/frontend/components/preview/browser/components/Canvas.svelte +1 -1
  26. package/frontend/components/preview/browser/components/Toolbar.svelte +4 -4
  27. package/frontend/components/preview/browser/core/mcp-handlers.svelte.ts +58 -64
  28. package/frontend/components/settings/SettingsModal.svelte +1 -1
  29. package/frontend/components/settings/general/DataManagementSettings.svelte +5 -66
  30. package/frontend/components/terminal/Terminal.svelte +1 -29
  31. package/frontend/components/tunnel/TunnelInactive.svelte +7 -5
  32. package/frontend/components/workspace/DesktopNavigator.svelte +1 -1
  33. package/frontend/components/workspace/PanelHeader.svelte +22 -16
  34. package/frontend/components/workspace/panels/GitPanel.svelte +1 -6
  35. package/frontend/services/preview/browser/browser-webcodecs.service.ts +2 -2
  36. package/frontend/services/project/status.service.ts +11 -1
  37. package/frontend/stores/core/sessions.svelte.ts +11 -1
  38. package/frontend/stores/features/terminal.svelte.ts +56 -26
  39. package/frontend/stores/ui/theme.svelte.ts +1 -1
  40. package/frontend/utils/ws.ts +42 -0
  41. package/index.html +2 -2
  42. package/package.json +1 -1
  43. package/shared/utils/ws-client.ts +21 -4
  44. package/static/manifest.json +2 -2
@@ -56,6 +56,8 @@ export interface WSClientOptions {
56
56
  maxReconnectDelay?: number;
57
57
  /** Callback when connection status changes */
58
58
  onStatusChange?: (status: WSConnectionStatus, reconnectAttempts: number) => void;
59
+ /** Callback when WebSocket reconnects (not on initial connection) */
60
+ onReconnect?: () => void;
59
61
  }
60
62
 
61
63
  // ============================================================================
@@ -204,13 +206,14 @@ function decodeBinaryMessage(buffer: ArrayBuffer): { action: string; payload: an
204
206
  export class WSClient<TAPI extends { client: any; server: any }> {
205
207
  private ws: WebSocket | null = null;
206
208
  private url: string;
207
- private options: Required<Omit<WSClientOptions, 'onStatusChange'>> & Pick<WSClientOptions, 'onStatusChange'>;
209
+ private options: Required<Omit<WSClientOptions, 'onStatusChange' | 'onReconnect'>> & Pick<WSClientOptions, 'onStatusChange' | 'onReconnect'>;
208
210
  private reconnectAttempts = 0;
209
211
  private reconnectTimeout: ReturnType<typeof setTimeout> | null = null;
210
212
  private listeners = new Map<string, Set<(payload: any) => void>>();
211
213
  private messageQueue: Array<{ action: string; payload: any }> = [];
212
214
  private isConnected = false;
213
215
  private shouldReconnect = true;
216
+ private hasConnectedBefore = false;
214
217
 
215
218
  /** Current context (synced with server) */
216
219
  private context: {
@@ -237,7 +240,8 @@ export class WSClient<TAPI extends { client: any; server: any }> {
237
240
  maxReconnectAttempts: options.maxReconnectAttempts ?? 5,
238
241
  reconnectDelay: options.reconnectDelay ?? 1000,
239
242
  maxReconnectDelay: options.maxReconnectDelay ?? 30000,
240
- onStatusChange: options.onStatusChange ?? undefined
243
+ onStatusChange: options.onStatusChange ?? undefined,
244
+ onReconnect: options.onReconnect ?? undefined
241
245
  };
242
246
 
243
247
  this.connect();
@@ -295,7 +299,20 @@ export class WSClient<TAPI extends { client: any; server: any }> {
295
299
  }
296
300
  }
297
301
 
298
- // Flush queued messages AFTER context is synced
302
+ // Fire reconnect handlers BEFORE queue flush so room
303
+ // subscriptions (chat:join-session, projects:join) are
304
+ // restored before any queued messages are sent.
305
+ const isReconnect = this.hasConnectedBefore;
306
+ this.hasConnectedBefore = true;
307
+ if (isReconnect) {
308
+ try {
309
+ this.options.onReconnect?.();
310
+ } catch (err) {
311
+ debug.error('websocket', 'onReconnect callback error:', err);
312
+ }
313
+ }
314
+
315
+ // Flush queued messages AFTER context + room re-joins are synced
299
316
  while (this.messageQueue.length > 0) {
300
317
  const msg = this.messageQueue.shift();
301
318
  if (msg) {
@@ -303,7 +320,7 @@ export class WSClient<TAPI extends { client: any; server: any }> {
303
320
  }
304
321
  }
305
322
 
306
- // Resolve waitUntilConnected() callers AFTER context sync + queue flush
323
+ // Resolve waitUntilConnected() callers AFTER everything is ready
307
324
  for (const resolve of this.connectResolvers) {
308
325
  resolve();
309
326
  }
@@ -4,8 +4,8 @@
4
4
  "description": "All-in-one web workspace for Claude Code & OpenCode — chat, terminal, git, browser preview, checkpoints, and real-time collaboration",
5
5
  "start_url": "/",
6
6
  "display": "standalone",
7
- "background_color": "#0f172a",
8
- "theme_color": "#0f172a",
7
+ "background_color": "#0e172b",
8
+ "theme_color": "#0e172b",
9
9
  "icons": [
10
10
  {
11
11
  "src": "/favicon.svg",