import type { ActivityEvent, Routine, RoutineDetail, RoutineListItem, RoutineRevision, RoutineRun, RoutineRunSummary, RoutineTrigger, RoutineTriggerSecretMaterial, } from "@paperclipai/shared"; import { activityApi } from "./activity"; import { api } from "./client"; export interface RoutineTriggerResponse { trigger: RoutineTrigger; secretMaterial: RoutineTriggerSecretMaterial | null; } export interface RotateRoutineTriggerResponse { trigger: RoutineTrigger; secretMaterial: RoutineTriggerSecretMaterial; } export interface RestoreRoutineRevisionSecretMaterial extends RoutineTriggerSecretMaterial { triggerId: string; } export interface RestoreRoutineRevisionResponse { routine: Routine; revision: RoutineRevision; restoredFromRevisionId: string; restoredFromRevisionNumber: number; secretMaterials: RestoreRoutineRevisionSecretMaterial[]; } export const routinesApi = { list: (companyId: string, filters?: { projectId?: string | null }) => { const params = new URLSearchParams(); if (filters?.projectId) params.set("projectId", filters.projectId); const query = params.toString(); return api.get(`/companies/${companyId}/routines${query ? `?${query}` : ""}`); }, create: (companyId: string, data: Record) => api.post(`/companies/${companyId}/routines`, data), get: (id: string) => api.get(`/routines/${id}`), update: (id: string, data: Record) => api.patch(`/routines/${id}`, data), listRevisions: (id: string) => api.get(`/routines/${id}/revisions`), restoreRevision: ( id: string, revisionId: string, body: { changeSummary?: string | null } = {}, ) => api.post( `/routines/${id}/revisions/${revisionId}/restore`, body, ), listRuns: (id: string, limit: number = 50) => api.get(`/routines/${id}/runs?limit=${limit}`), createTrigger: (id: string, data: Record) => api.post(`/routines/${id}/triggers`, data), updateTrigger: (id: string, data: Record) => api.patch(`/routine-triggers/${id}`, data), deleteTrigger: (id: string) => api.delete(`/routine-triggers/${id}`), rotateTriggerSecret: (id: string) => api.post(`/routine-triggers/${id}/rotate-secret`, {}), run: (id: string, data?: Record) => api.post(`/routines/${id}/run`, data ?? {}), activity: async ( companyId: string, routineId: string, related?: { triggerIds?: string[]; runIds?: string[] }, ) => { const requests = [ activityApi.list(companyId, { entityType: "routine", entityId: routineId }), ...(related?.triggerIds ?? []).map((triggerId) => activityApi.list(companyId, { entityType: "routine_trigger", entityId: triggerId })), ...(related?.runIds ?? []).map((runId) => activityApi.list(companyId, { entityType: "routine_run", entityId: runId })), ]; const events = (await Promise.all(requests)).flat(); const deduped = new Map(events.map((event) => [event.id, event])); return [...deduped.values()].sort( (a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(), ); }, };