import type { HeartbeatRun, HeartbeatRunEvent } from "@paperclip/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(`/companies/${companyId}/heartbeat-runs${qs ? `?${qs}` : ""}`); }, events: (runId: string, afterSeq = 0, limit = 200) => api.get( `/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))}`, ), cancel: (runId: string) => api.post(`/heartbeat-runs/${runId}/cancel`, {}), liveRunsForIssue: (issueId: string) => api.get(`/issues/${issueId}/live-runs`), activeRunForIssue: (issueId: string) => api.get(`/issues/${issueId}/active-run`), liveRunsForCompany: (companyId: string) => api.get(`/companies/${companyId}/live-runs`), };