From d1fdfb140cc440664f77a24886172f9976a05a31 Mon Sep 17 00:00:00 2001 From: soryu Date: Tue, 28 Apr 2026 19:12:52 +0100 Subject: feat: revert broken directive PRs, re-implement Lexical document orchestrator (#98) * feat: soryu-co/soryu - makima: Revert broken directive PRs and verify clean build * feat: soryu-co/soryu - makima: Re-implement frontend: Lexical document editor with feature flag and base components * WIP: heartbeat checkpoint * feat: soryu-co/soryu - makima: Add contract blocks, expandable log rows, and interaction controls * WIP: heartbeat checkpoint * feat: soryu-co/soryu - makima: End-to-end build verification and integration polish --- frontend/src/services/taskWs.ts | 88 ----------------------------------------- 1 file changed, 88 deletions(-) delete mode 100644 frontend/src/services/taskWs.ts (limited to 'frontend/src/services/taskWs.ts') diff --git a/frontend/src/services/taskWs.ts b/frontend/src/services/taskWs.ts deleted file mode 100644 index 832648e..0000000 --- a/frontend/src/services/taskWs.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { VNWebSocket } from './ws' - -export interface TaskOutputMessage { - task_id: string - message_type: string - content: string - tool_name?: string - tool_input?: string - is_error?: boolean - cost_usd?: number - duration_ms?: number - is_partial?: boolean -} - -type TaskOutputCallback = (msg: TaskOutputMessage) => void - -export class TaskOutputStream { - private ws: VNWebSocket - private listeners: Map> = new Map() - private connected = false - - constructor() { - const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:' - this.ws = new VNWebSocket(`${protocol}//${window.location.host}/ws/tasks`) - - this.ws.on('message', (data: any) => { - if (data && data.type === 'TaskOutput') { - const payload = data.payload || data - const taskId = payload.task_id - if (taskId && this.listeners.has(taskId)) { - this.listeners.get(taskId)!.forEach(cb => cb(payload)) - } - } - }) - - this.ws.on('open', () => { - this.connected = true - // Re-subscribe all active subscriptions on reconnect - for (const taskId of this.listeners.keys()) { - this.ws.send({ type: 'SubscribeOutput', task_id: taskId }) - } - }) - - this.ws.on('close', () => { - this.connected = false - }) - } - - connect() { - this.ws.connect() - } - - subscribe(taskId: string, callback: TaskOutputCallback) { - if (!this.listeners.has(taskId)) { - this.listeners.set(taskId, new Set()) - // Only send subscribe if this is a new task subscription - this.ws.send({ type: 'SubscribeOutput', task_id: taskId }) - } - this.listeners.get(taskId)!.add(callback) - } - - unsubscribe(taskId: string, callback?: TaskOutputCallback) { - if (!this.listeners.has(taskId)) return - - if (callback) { - this.listeners.get(taskId)!.delete(callback) - if (this.listeners.get(taskId)!.size > 0) return - } - - this.listeners.delete(taskId) - this.ws.send({ type: 'UnsubscribeOutput', task_id: taskId }) - } - - close() { - this.ws.close() - this.listeners.clear() - } -} - -let instance: TaskOutputStream | null = null - -export function getTaskOutputStream(): TaskOutputStream { - if (!instance) { - instance = new TaskOutputStream() - instance.connect() - } - return instance -} -- cgit v1.2.3