| import type { |
| HeartbeatRun, |
| HeartbeatRunEvent, |
| InstanceSchedulerHeartbeatAgent, |
| WorkspaceOperation, |
| } from "@paperclipai/shared"; |
| import { api } from "./client"; |
|
|
| export interface ActiveRunForIssue extends HeartbeatRun { |
| agentId: string; |
| agentName: string; |
| adapterType: string; |
| } |
|
|
| export interface LiveRunForIssue { |
| id: string; |
| status: string; |
| invocationSource: string; |
| triggerDetail: string | null; |
| startedAt: string | null; |
| finishedAt: string | null; |
| createdAt: string; |
| agentId: string; |
| agentName: string; |
| adapterType: string; |
| issueId?: string | null; |
| } |
|
|
| export const heartbeatsApi = { |
| list: (companyId: string, agentId?: string, limit?: number) => { |
| const searchParams = new URLSearchParams(); |
| if (agentId) searchParams.set("agentId", agentId); |
| if (limit) searchParams.set("limit", String(limit)); |
| const qs = searchParams.toString(); |
| return api.get<HeartbeatRun[]>(`/companies/${companyId}/heartbeat-runs${qs ? `?${qs}` : ""}`); |
| }, |
| get: (runId: string) => api.get<HeartbeatRun>(`/heartbeat-runs/${runId}`), |
| events: (runId: string, afterSeq = 0, limit = 200) => |
| api.get<HeartbeatRunEvent[]>( |
| `/heartbeat-runs/${runId}/events?afterSeq=${encodeURIComponent(String(afterSeq))}&limit=${encodeURIComponent(String(limit))}`, |
| ), |
| log: (runId: string, offset = 0, limitBytes = 256000) => |
| api.get<{ runId: string; store: string; logRef: string; content: string; nextOffset?: number }>( |
| `/heartbeat-runs/${runId}/log?offset=${encodeURIComponent(String(offset))}&limitBytes=${encodeURIComponent(String(limitBytes))}`, |
| ), |
| workspaceOperations: (runId: string) => |
| api.get<WorkspaceOperation[]>(`/heartbeat-runs/${runId}/workspace-operations`), |
| workspaceOperationLog: (operationId: string, offset = 0, limitBytes = 256000) => |
| api.get<{ operationId: string; store: string; logRef: string; content: string; nextOffset?: number }>( |
| `/workspace-operations/${operationId}/log?offset=${encodeURIComponent(String(offset))}&limitBytes=${encodeURIComponent(String(limitBytes))}`, |
| ), |
| cancel: (runId: string) => api.post<void>(`/heartbeat-runs/${runId}/cancel`, {}), |
| liveRunsForIssue: (issueId: string) => |
| api.get<LiveRunForIssue[]>(`/issues/${issueId}/live-runs`), |
| activeRunForIssue: (issueId: string) => |
| api.get<ActiveRunForIssue | null>(`/issues/${issueId}/active-run`), |
| liveRunsForCompany: (companyId: string, minCount?: number) => |
| api.get<LiveRunForIssue[]>(`/companies/${companyId}/live-runs${minCount ? `?minCount=${minCount}` : ""}`), |
| listInstanceSchedulerAgents: () => |
| api.get<InstanceSchedulerHeartbeatAgent[]>("/instance/scheduler-heartbeats"), |
| }; |
|
|