mirror of
https://github.com/wu736139669/hapi.git
synced 2026-08-05 06:24:37 +00:00
feat: add support for user message events from Codex
Add sendUserMessage() method to ApiSessionClient and CodexSession to handle user_message events from Codex. Updates CodexConversionResult type and convertCodexEvent() to process user_message payloads, with test coverage.
This commit is contained in:
@@ -6,7 +6,7 @@ import { backoff } from '@/utils/time'
|
||||
import { AsyncLock } from '@/utils/lock'
|
||||
import type { RawJSONLines } from '@/claude/types'
|
||||
import { configuration } from '@/configuration'
|
||||
import type { AgentState, ClientToServerEvents, MessageContent, Metadata, ServerToClientEvents, Session, Update, UserMessage } from './types'
|
||||
import type { AgentState, ClientToServerEvents, MessageContent, MessageMeta, Metadata, ServerToClientEvents, Session, Update, UserMessage } from './types'
|
||||
import { AgentStateSchema, MetadataSchema, UserMessageSchema } from './types'
|
||||
import { RpcHandlerManager } from './rpc/RpcHandlerManager'
|
||||
import { registerCommonHandlers } from '../modules/common/registerCommonHandlers'
|
||||
@@ -184,6 +184,29 @@ export class ApiSessionClient extends EventEmitter {
|
||||
}
|
||||
}
|
||||
|
||||
sendUserMessage(text: string, meta?: MessageMeta): void {
|
||||
if (!text) {
|
||||
return
|
||||
}
|
||||
|
||||
const content: MessageContent = {
|
||||
role: 'user',
|
||||
content: {
|
||||
type: 'text',
|
||||
text
|
||||
},
|
||||
meta: {
|
||||
sentFrom: 'cli',
|
||||
...(meta ?? {})
|
||||
}
|
||||
}
|
||||
|
||||
this.socket.emit('message', {
|
||||
sid: this.sessionId,
|
||||
message: content
|
||||
})
|
||||
}
|
||||
|
||||
sendCodexMessage(body: unknown): void {
|
||||
const content = {
|
||||
role: 'agent',
|
||||
|
||||
@@ -17,6 +17,9 @@ export async function codexLocalLauncher(session: CodexSession): Promise<'switch
|
||||
session.onSessionFound(converted.sessionId);
|
||||
scanner.onNewSession(converted.sessionId);
|
||||
}
|
||||
if (converted?.userMessage) {
|
||||
session.sendUserMessage(converted.userMessage);
|
||||
}
|
||||
if (converted?.message) {
|
||||
session.sendCodexMessage(converted.message);
|
||||
}
|
||||
|
||||
@@ -45,6 +45,10 @@ export class CodexSession extends AgentSessionBase<EnhancedMode> {
|
||||
this.client.sendCodexMessage(message);
|
||||
};
|
||||
|
||||
sendUserMessage = (text: string): void => {
|
||||
this.client.sendUserMessage(text);
|
||||
};
|
||||
|
||||
sendSessionEvent = (event: Parameters<ApiSessionClient['sendSessionEvent']>[0]): void => {
|
||||
this.client.sendSessionEvent(event);
|
||||
};
|
||||
|
||||
@@ -23,6 +23,15 @@ describe('convertCodexEvent', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('converts user_message events', () => {
|
||||
const result = convertCodexEvent({
|
||||
type: 'event_msg',
|
||||
payload: { type: 'user_message', message: 'hello user' }
|
||||
});
|
||||
|
||||
expect(result?.userMessage).toBe('hello user');
|
||||
});
|
||||
|
||||
it('converts reasoning events', () => {
|
||||
const result = convertCodexEvent({
|
||||
type: 'event_msg',
|
||||
|
||||
@@ -41,6 +41,7 @@ export type CodexMessage = {
|
||||
export type CodexConversionResult = {
|
||||
sessionId?: string;
|
||||
message?: CodexMessage;
|
||||
userMessage?: string;
|
||||
};
|
||||
|
||||
function asRecord(value: unknown): Record<string, unknown> | null {
|
||||
@@ -118,7 +119,15 @@ export function convertCodexEvent(rawEvent: unknown): CodexConversionResult | nu
|
||||
}
|
||||
|
||||
if (eventType === 'user_message') {
|
||||
return null;
|
||||
const message = asString(payloadRecord.message)
|
||||
?? asString(payloadRecord.text)
|
||||
?? asString(payloadRecord.content);
|
||||
if (!message) {
|
||||
return null;
|
||||
}
|
||||
return {
|
||||
userMessage: message
|
||||
};
|
||||
}
|
||||
|
||||
if (eventType === 'agent_message') {
|
||||
|
||||
Reference in New Issue
Block a user