/ src / server / api / agents / auth.ts
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  }