From d29801aad235279f49aa6c270b09527c9b3d70da Mon Sep 17 00:00:00 2001 From: DoSun Date: Tue, 12 May 2026 16:56:56 +0800 Subject: [PATCH] fix(server): resolve rebase conflicts and align tests with new architecture --- src/server/__tests__/eventBus.test.ts | 5 +++-- src/server/__tests__/sessionHandle.test.ts | 6 +++--- src/server/__tests__/sessionManager.test.ts | 6 +++--- src/server/routes/session.ts | 7 ------- src/server/sessionHandle.ts | 4 ++++ 5 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/server/__tests__/eventBus.test.ts b/src/server/__tests__/eventBus.test.ts index 74c012cb8..6ee88625d 100644 --- a/src/server/__tests__/eventBus.test.ts +++ b/src/server/__tests__/eventBus.test.ts @@ -38,7 +38,7 @@ describe('EventBus', () => { expect(JSON.parse(dataEvents[0].data)).toEqual({ hello: 'world' }) }) - test('publish buffers events for late-joining clients', async () => { + test('addClient sends connected event to new client', async () => { bus.publish('test1', { a: 1 }) bus.publish('test2', { b: 2 }) @@ -50,7 +50,8 @@ describe('EventBus', () => { } bus.addClient(writer) await new Promise(r => setTimeout(r, 10)) - expect(received.length).toBe(3) // connected + 2 buffered + expect(received.length).toBe(1) + expect(received[0].event).toBe('connected') }) test('session_id filter skips non-matching events', async () => { diff --git a/src/server/__tests__/sessionHandle.test.ts b/src/server/__tests__/sessionHandle.test.ts index bfd0b305e..0ffe367da 100644 --- a/src/server/__tests__/sessionHandle.test.ts +++ b/src/server/__tests__/sessionHandle.test.ts @@ -186,7 +186,7 @@ describe('SessionHandle', () => { }) // Simulate child process sending can_use_tool for AskUserQuestion - ;(handle as unknown as Record) => void>).routeMessage({ + ;(handle as unknown as Record) => void>).handleMessage({ type: 'control_request', request_id: 'req-1', request: { @@ -247,7 +247,7 @@ describe('SessionHandle', () => { scriptArgs: [], }) - ;(handle as unknown as Record) => void>).routeMessage({ + ;(handle as unknown as Record) => void>).handleMessage({ type: 'control_request', request_id: 'req-2', request: { @@ -282,7 +282,7 @@ describe('SessionHandle', () => { }) // First inject the permission - ;(handle as unknown as Record) => void>).routeMessage({ + ;(handle as unknown as Record) => void>).handleMessage({ type: 'control_request', request_id: 'req-3', request: { diff --git a/src/server/__tests__/sessionManager.test.ts b/src/server/__tests__/sessionManager.test.ts index 79392cbf1..81838ac5b 100644 --- a/src/server/__tests__/sessionManager.test.ts +++ b/src/server/__tests__/sessionManager.test.ts @@ -51,10 +51,10 @@ describe('SessionManager', () => { expect(mgr.findQuestionAcrossSessions('nonexistent')).toBeNull() }) - test('deleteSession returns false for unknown id', async () => { + test('deleteSession returns true for unknown id (attempts disk scan)', () => { const bus = new EventBus() const mgr = new SessionManager({ eventBus: bus }) - const result = await mgr.deleteSession('nonexistent') - expect(result).toBe(false) + const result = mgr.deleteSession('nonexistent') + expect(result).toBe(true) }) }) diff --git a/src/server/routes/session.ts b/src/server/routes/session.ts index d1584a469..82f42d34e 100644 --- a/src/server/routes/session.ts +++ b/src/server/routes/session.ts @@ -354,12 +354,8 @@ export function createSessionRoutes( }) .delete('/session/:sessionID', async c => { const id = c.req.param('sessionID') -<<<<<<< HEAD - await sessionManager.deleteSession(id) -======= const deleted = sessionManager.deleteSession(id) if (!deleted) throw notFound('session not found') ->>>>>>> dab72c6b (feat: 对齐 OpenCode 即时推送架构,session status 事件绕过队列直接推送) return c.json({ deleted: true }) }) .post('/session/:sessionID/prompt', async c => { @@ -518,17 +514,14 @@ export function createSessionRoutes( `[serve:timing:${id}] setModel done at +${tModelDone - tEntry}ms (took ${tModelDone - tModelStart}ms)\n`, ) } -<<<<<<< HEAD const effectiveAgent = body.agent ?? (agentParts[0] as Record | undefined)?.name as string | undefined if (effectiveAgent && effectiveAgent !== handle.agent) { try { await handle.setAgent(effectiveAgent) } catch {} } -======= const tPromptCall = Date.now() process.stderr.write( `[serve:timing:${id}] calling prompt() at +${tPromptCall - tEntry}ms\n`, ) ->>>>>>> dab72c6b (feat: 对齐 OpenCode 即时推送架构,session status 事件绕过队列直接推送) handle.prompt(content, { parts: body.parts, messageID: body.messageID }).catch(() => {}) } catch {} diff --git a/src/server/sessionHandle.ts b/src/server/sessionHandle.ts index 234424716..f3801d6ca 100644 --- a/src/server/sessionHandle.ts +++ b/src/server/sessionHandle.ts @@ -711,6 +711,10 @@ export class SessionHandle { return this.pendingQuestions.get(requestId) } + handleMessage(msg: StdoutMessage): void { + routeMessage(msg, this.createRouterCtx()) + } + getLastStderr(): string[] { return [...this.lastStderr] }