File size: 3,094 Bytes
d47b053
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import { getStudioAuthHeaders, studioRequest } from './client'
import type {
  StudioCreateRunInput,
  StudioCreateSessionInput,
  StudioPermissionDecision,
  StudioPermissionMode,
  StudioPermissionRequest,
  StudioRun,
  StudioSession,
  StudioSessionSnapshot,
} from '../protocol/studio-agent-types'

interface CreateSessionResponse {
  session: StudioSession
}

interface PatchSessionResponse {
  session: StudioSession
}

export interface CreateRunResponse extends Omit<StudioSessionSnapshot, 'session'> {
  run: StudioRun
  assistantMessage?: unknown
  text?: string
  pendingPermissions: StudioPermissionRequest[]
}

interface PendingPermissionsResponse {
  requests: StudioPermissionRequest[]
}

interface CancelRunResponse {
  run?: StudioRun
  status: 'cancelled' | 'completed' | 'failed' | 'running' | 'pending'
  message: string
}

export async function createStudioSession(input: StudioCreateSessionInput): Promise<StudioSession> {
  const data = await studioRequest<CreateSessionResponse>('/sessions', {
    method: 'POST',
    headers: getStudioAuthHeaders('application/json'),
    body: JSON.stringify(input),
  })

  return data.session
}

export async function updateStudioSession(input: {
  sessionId: string
  permissionMode: StudioPermissionMode
}): Promise<StudioSession> {
  const data = await studioRequest<PatchSessionResponse>(`/sessions/${encodeURIComponent(input.sessionId)}`, {
    method: 'PATCH',
    headers: getStudioAuthHeaders('application/json'),
    body: JSON.stringify({ permissionMode: input.permissionMode }),
  })

  return data.session
}

export async function getStudioSessionSnapshot(sessionId: string): Promise<StudioSessionSnapshot> {
  return studioRequest<StudioSessionSnapshot>(`/sessions/${encodeURIComponent(sessionId)}`, {
    headers: getStudioAuthHeaders(),
  })
}

export async function createStudioRun(input: StudioCreateRunInput): Promise<CreateRunResponse> {
  return studioRequest<CreateRunResponse>('/runs', {
    method: 'POST',
    headers: getStudioAuthHeaders('application/json'),
    body: JSON.stringify(input),
  })
}

export async function cancelStudioRun(input: {
  runId: string
  reason?: string
}): Promise<CancelRunResponse> {
  return studioRequest<CancelRunResponse>(`/runs/${encodeURIComponent(input.runId)}/cancel`, {
    method: 'POST',
    headers: getStudioAuthHeaders('application/json'),
    body: JSON.stringify({ reason: input.reason }),
  })
}

export async function getPendingStudioPermissions(): Promise<StudioPermissionRequest[]> {
  const data = await studioRequest<PendingPermissionsResponse>('/permissions/pending', {
    headers: getStudioAuthHeaders(),
  })

  return data.requests
}

export async function replyStudioPermission(input: {
  requestID: string
  reply: StudioPermissionDecision
  message?: string
  directory?: string
}): Promise<StudioPermissionRequest[]> {
  const data = await studioRequest<PendingPermissionsResponse>('/permissions/reply', {
    method: 'POST',
    headers: getStudioAuthHeaders('application/json'),
    body: JSON.stringify(input),
  })

  return data.requests
}