auth.ts
1 import type { 2 AgentAuthActionRequestPayload, 3 AgentAuthActionResponsePayload, 4 AgentAuthStatusResponsePayload, 5 } from '@/lib/shared/chat' 6 import { 7 listAgentAuthSessions, 8 listAgentAuthStatuses, 9 runAgentAuthAction, 10 } from '@/server/agents/auth/service' 11 12 export async function readAgentAuthStatusResponse(): Promise<AgentAuthStatusResponsePayload> { 13 return { 14 ok: true, 15 entries: await listAgentAuthStatuses(), 16 sessions: listAgentAuthSessions(), 17 } 18 } 19 20 export async function runAgentAuthActionResponse( 21 raw: unknown, 22 ): Promise<AgentAuthActionResponsePayload> { 23 const payload = parseAgentAuthActionPayload(raw) 24 return runAgentAuthAction(payload) 25 } 26 27 export function parseAgentAuthActionPayload( 28 raw: unknown, 29 ): AgentAuthActionRequestPayload { 30 if (typeof raw !== 'object' || raw === null) { 31 throw new Error('Invalid agent auth action payload.') 32 } 33 const action = readStringField(raw, 'action') 34 switch (action) { 35 case 'codex.start_device': 36 case 'codex.logout': 37 case 'jules.start_login': 38 case 'jules.logout': 39 case 'jules.clear_api_key': 40 case 'opencode.logout': 41 return { action } 42 case 'codex.login_api_key': 43 return { 44 action, 45 apiKey: readStringField(raw, 'apiKey'), 46 } 47 case 'jules.submit_code': 48 return { 49 action, 50 sessionId: readStringField(raw, 'sessionId'), 51 code: readStringField(raw, 'code'), 52 } 53 case 'jules.cancel_login': 54 return { 55 action, 56 sessionId: readStringField(raw, 'sessionId'), 57 } 58 case 'jules.set_api_key': 59 return { 60 action, 61 apiKey: readStringField(raw, 'apiKey'), 62 } 63 case 'opencode.login': 64 return { 65 action, 66 providerUrl: readStringField(raw, 'providerUrl'), 67 } 68 default: 69 throw new Error('Unsupported agent auth action.') 70 } 71 } 72 73 function readStringField(raw: unknown, key: string): string { 74 if (typeof raw !== 'object' || raw === null) { 75 throw new Error(`Missing required field "${key}".`) 76 } 77 const value = (raw as Record<string, unknown>)[key] 78 if (typeof value !== 'string') { 79 throw new Error(`Invalid "${key}" value.`) 80 } 81 return value 82 }