import {z} from 'zod' export type GetApiAgentsFetchDeletedOptions = {baseUrl?: string | undefined, apiKeyAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const getApiAgentsFetchDeletedResponse = z.array(z.object({id: z.string(), name: z.string().nullable().optional(), createdAt: z.number(), deletedAt: z.number(), deletedBy: z.string().nullable().optional(), scriptOrgName: z.string().nullable().optional(), scriptId: z.string().nullable().optional(), script: z.string().nullable().optional(), branch: z.string().nullable().optional(), environment: z.enum(["staging", "release"]).nullable().optional(), argument: z.string().nullable().optional(), lastEndType: z.enum(["finished", "killed", "global timeout", "org timeout", "agent timeout", "unknown", "no log timeout"]).nullable().optional(), lastEndedAt: z.number().nullable().optional(), lastExitCode: z.number().nullable().optional(), nbContainersRunning: z.number(), runningTime: z.number().nullable().optional(), manifest: z.object({slug: z.string(), description: z.string().max(500), kind: z.literal("lib"), documentation: z.object({summary: z.string().min(1).max(1000), exports: z.array(z.object({name: z.string().min(1).max(200), kind: z.enum(["function", "class", "interface", "typeAlias", "enum", "const", "namespace"]), signature: z.string().min(1).max(8000)}))}), unlisted: z.boolean().optional(), isDeprecated: z.boolean().optional(), isBaasCompatible: z.boolean().optional(), personalUseOnly: z.boolean().optional(), featuredRank: z.number().optional(), usageRank: z.number().optional(), categories: z.array(z.string().max(100)).optional(), tags: z.object({categories: z.array(z.string().max(100)).optional(), extractions: z.array(z.string().max(100)).optional(), actions: z.array(z.string().max(100)).optional(), goals: z.array(z.string().max(100)).optional()}).optional(), defaultArgument: z.record(z.string(), z.unknown()).optional(), outputDescription: z.record(z.string(), z.unknown()).optional(), defaultArgumentAllowed: z.boolean().optional(), argumentForm: z.object({enabled: z.boolean().optional(), steps: z.array(z.object({slug: z.string(), title: z.string().max(100), headerTitle: z.string().max(100).optional(), fields: z.record(z.string(), z.object({label: z.string().max(100).optional(), labelLink: z.string().max(2000).optional(), labelInfo: z.string().max(1000).optional(), placeholder: z.string().max(250).optional(), helper: z.string().max(1000).optional(), helpers: z.union([z.array(z.string().max(1000)), z.string().max(1000)]).optional(), optionLabels: z.array(z.string().max(100)).optional(), optionIcons: z.array(z.string().max(100)).optional(), format: z.enum(["radioTiles", "combobox", "radio"]).optional(), dataAttrFieldInfo: z.string().optional(), isMultiLine: z.boolean().optional(), rows: z.number().optional(), isPassword: z.boolean().optional(), deprecated: z.boolean().optional(), collapsibleSection: z.string().max(100).optional(), isLabelHidden: z.boolean().optional()})), helper: z.string().max(1000).optional(), helpers: z.union([z.array(z.string().max(1000)), z.string().max(1000)]).optional()})).optional()}).optional(), argumentSchema: z.object({type: z.literal("object").optional(), properties: z.record(z.string(), z.object({type: z.enum(["string", "boolean", "number", "object", "array", "integer"]).optional(), required: z.boolean().optional(), minLength: z.number().optional(), maxLength: z.number().optional(), minimum: z.number().optional(), maximum: z.number().optional(), enum: z.array(z.string()).optional(), sensitive: z.boolean().optional()}).and(z.record(z.string(), z.unknown()))).optional()}).optional(), argumentTypes: z.record(z.string(), z.object({types: z.array(z.union([z.string(), z.array(z.string())])).optional(), pipe: z.boolean().optional(), targetsColumn: z.object({pipe: z.string().optional(), types: z.array(z.string()).optional()}).optional()})).optional(), outputTypes: z.record(z.string(), z.object({types: z.array(z.string()).optional(), filenameBeginsWith: z.array(z.string()).optional()})).optional(), updated: z.boolean().optional(), update: z.boolean().optional(), defaultSettings: z.object({executionTimeLimit: z.number().nullable().optional(), fileMgmt: z.enum(["folders", "mix", "delete"]).optional(), fileMgmtMaxFolders: z.number().nullable().optional(), maxParallelism: z.number().nullable().optional(), maxRetryNumber: z.number().nullable().optional(), launchType: z.enum(["manually", "repeatedly"]).optional(), repeatedLaunchPreset: z.enum(["Once every other day", "Once per day", "Once per day, at the start of the day", "Twice per day", "Thrice per day", "4 times per day", "6 times per day", "8 times per day", "Once every other hour", "Once per hour", "Twice per hour", "Thrice per hour", "4 times per hour", "Once every other working hour", "Once per working hour", "Twice per working hour", "Thrice per working hour", "4 times per working hour", "Once every other working hour, excluding weekends", "Once per working hour, excluding weekends", "Twice per working hour, excluding weekends", "Thrice per working hour, excluding weekends", "4 times per working hour, excluding weekends"]).optional(), notificationPreset: z.enum(["none", "error", "success"]).optional(), ignoreNotificationPresetForOrgSlugs: z.array(z.string()).nullable().optional(), notifications: z.object({mailAutomaticExitSuccess: z.boolean().optional(), mailAutomaticExitError: z.boolean().optional(), mailAutomaticLaunchError: z.boolean().optional(), mailAutomaticTimeError: z.boolean().optional(), mailManualExitSuccess: z.boolean().optional(), mailManualExitError: z.boolean().optional(), mailManualLaunchError: z.boolean().optional(), mailManualTimeError: z.boolean().optional(), slackWebHook: z.string().max(2000).optional(), slackAutomaticExitSuccess: z.boolean().optional(), slackAutomaticExitError: z.boolean().optional(), slackAutomaticLaunchError: z.boolean().optional(), slackAutomaticTimeError: z.boolean().optional(), slackManualExitSuccess: z.boolean().optional(), slackManualExitError: z.boolean().optional(), slackManualLaunchError: z.boolean().optional(), slackManualTimeError: z.boolean().optional(), webhook: z.string().max(2000).optional()}).nullable().optional(), proxyLease: z.object({groupSlug: z.string().nullable().optional(), refreshRate: z.number().int().gte(0)}).optional(), proxyType: z.enum(["none", "http", "pool", "squid lease"]).optional()}).optional(), inputIcon: z.string().max(100).optional(), outputIcon: z.string().max(100).optional(), status: z.object({type: z.string().optional(), description: z.string().max(500).optional()}).optional(), askUserToNameAgent: z.boolean().optional(), reservedAgentSlots: z.number().int().gte(1).optional(), hideSetupLaunchSettings: z.boolean().optional(), hideFolderManagement: z.boolean().optional(), onlyListedForUsersEnrolledInBeta: z.boolean().optional(), diffusionGroups: z.array(z.object({arguments: z.array(z.string()), title: z.string()})).optional(), embeddedYouTubeVideo: z.object({videoId: z.string(), videoHeader: z.string().max(40).optional()}).optional(), tutorialArticleUrl: z.string().optional(), plugins: z.array(z.union([z.object({name: z.literal("rateLimitsRecommendations"), recommendations: z.record(z.string(), z.array(z.object({type: z.literal("max"), intervalUnit: z.enum(["day", "week", "month"]), alertContent: z.object({headerText: z.string(), subheaderText: z.string().optional(), linkTextOne: z.string(), linkTextOther: z.string()}).optional(), values: z.array(z.object({key: z.string(), value: z.number()}).and(z.record(z.string(), z.unknown())))}).and(z.record(z.string(), z.unknown()))))}).and(z.record(z.string(), z.unknown())), z.object({name: z.literal("chainedResultsManagement"), options: z.object({chainedResultsFieldName: z.string(), columnTypesToDisplay: z.array(z.union([z.object({hrefFromType: z.string(), labelFromType: z.string()}), z.string()])), exclusionList: z.object({fieldName: z.string()}).optional()})}).and(z.record(z.string(), z.unknown())), z.object({name: z.literal("attachments"), options: z.object({associatedFieldName: z.string(), validationType: z.literal("linkedinMessage")})}).and(z.record(z.string(), z.unknown())), z.object({name: z.literal("setupMappedFieldsColumnLayoutDisplay"), options: z.object({leftColumnTitle: z.string(), rightColumnTitle: z.string(), sectionFieldNameList: z.array(z.string()), label: z.string().optional(), helper: z.string().optional(), displayPreviewQueries: z.boolean().optional()})}).and(z.record(z.string(), z.unknown())), z.object({name: z.literal("taggedTemplateInterpolation"), associatedFieldName: z.string(), sortedAvailableTags: z.array(z.union([z.string(), z.object({csvHeadersFromPipeFieldName: z.string()}).and(z.record(z.string(), z.unknown())), z.object({argumentFieldName: z.string(), matchAnyArgumentFieldValue: z.array(z.union([z.string(), z.boolean(), z.number(), z.unknown()])), conditionalTags: z.array(z.union([z.string(), z.object({csvHeadersFromPipeFieldName: z.string()}).and(z.record(z.string(), z.unknown()))]))}), z.object({leadProperties: z.array(z.string())})]))}).and(z.record(z.string(), z.unknown())), z.object({name: z.literal("leadDatabaseContribution"), lastVersionAt: z.number()}).and(z.record(z.string(), z.unknown())), z.object({name: z.literal("acceptsLeadListAsInput"), hideMyPhantomsMode: z.boolean().optional(), hideCsvUrlMode: z.boolean().optional(), skipFirstStepIfPrefilled: z.boolean().optional()}).and(z.record(z.string(), z.unknown())), z.object({name: z.literal("dividedInputType"), associatedFieldName: z.string(), optionIcons: z.array(z.string().max(100))}).and(z.record(z.string(), z.unknown())), z.object({name: z.literal("acceptsCRMListAsInput"), helperText: z.string().optional(), hideMyPhantomsMode: z.boolean().optional(), hideCsvUrlMode: z.boolean().optional()}).and(z.record(z.string(), z.unknown())), z.object({name: z.literal("crmOutputMappingPlugin"), options: z.object({activationArgumentName: z.string().optional(), optionalFieldsArgumentName: z.string().optional(), optionalFields: z.array(z.object({fieldLabel: z.string(), resultFieldName: z.string(), defaultCrmFieldId: z.string().optional()})), requiredFields: z.array(z.object({argumentName: z.string(), fieldLabel: z.string(), resultFieldName: z.string(), defaultCrmFieldId: z.string().optional()}))})}).and(z.record(z.string(), z.unknown())), z.object({name: z.literal("crmInputMappingPlugin"), options: z.object({fieldName: z.string(), activationArgumentName: z.string().optional(), requiredFields: z.array(z.object({fieldLabel: z.string(), leadDatabaseFieldName: z.string(), defaultCrmFieldId: z.string().optional()}))})}).and(z.record(z.string(), z.unknown())), z.object({name: z.literal("useMultiIdentities"), multiIdentityFieldName: z.string()}).and(z.record(z.string(), z.unknown())), z.record(z.string(), z.unknown())])).optional(), noLogTimeout: z.number().optional(), argumentsToSendToAnalytics: z.array(z.string()).optional(), recommenderMetadata: z.object({workers: z.array(z.string()).optional(), standalone: z.boolean().optional(), description: z.string().max(1000).optional()}).optional(), visibleInChat: z.array(z.literal("tealde")).optional()}).nullable().optional(), launchType: z.enum(["manually", "repeatedly", "once", "after agent"]).optional(), lastNonManualLaunchType: z.enum(["manually", "repeatedly", "once", "after agent"]).nullable().optional(), repeatedLaunchTimes: z.object({simplePreset: z.enum(["Once every other day", "Once per day", "Once per day, at the start of the day", "Twice per day", "Thrice per day", "4 times per day", "6 times per day", "8 times per day", "Once every other hour", "Once per hour", "Twice per hour", "Thrice per hour", "4 times per hour", "Once every other working hour", "Once per working hour", "Twice per working hour", "Thrice per working hour", "4 times per working hour", "Once every other working hour, excluding weekends", "Once per working hour, excluding weekends", "Twice per working hour, excluding weekends", "Thrice per working hour, excluding weekends", "4 times per working hour, excluding weekends"]).nullable().optional(), isSimplePresetEnabled: z.boolean().optional(), timezone: z.string().max(250), minute: z.array(z.number()), hour: z.array(z.number()), day: z.array(z.number()), dow: z.array(z.enum(["sun", "mon", "tue", "wed", "thu", "fri", "sat"])), month: z.array(z.enum(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"]))}).nullable().optional(), s3Folder: z.string().optional(), slaveSlug: z.string().nullable().optional(), masterAgentId: z.string().nullable().optional(), launchBefore: z.number().nullable().optional(), launchOnceAt: z.number().nullable().optional(), launchAfterAgentId: z.string().nullable().optional(), masterAgentLaunchAfter: z.number().nullable().optional(), masterAgentLaunchOnExitCodes: z.union([z.array(z.number()).nullable(), z.literal("all").nullable()]).optional(), reservedAgentSlotsFactor: z.number().optional(), squidLeaseIdentifier: z.object({groupSlug: z.string(), refreshRate: z.number().int().gte(0), location: z.string().min(1).max(100).nullable().optional(), sublocation: z.string().min(1).max(100).nullable().optional()}).nullable().optional(), wasSetupValidWhenSubmittedByTheFrontend: z.boolean().optional(), expireAt: z.number().nullable().optional(), internalMetadata: z.record(z.string(), z.unknown()).nullable().optional(), userCustomMetadata: z.record(z.string(), z.unknown()).nullable().optional()})); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Gets all deleted agents of the current user's organization. * * GET /agents/fetch-deleted */ export const getApiAgentsFetchDeleted = async (options?: GetApiAgentsFetchDeletedOptions) => { const {baseUrl = "https://api.phantombuster.com/api/v2", fetch: fetchFn = fetch, apiKeyAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (apiKeyAuth !== undefined) headers.set("X-Phantombuster-Key", apiKeyAuth) const url = `${baseUrl.replace(/\/+$/, '')}/agents/fetch-deleted${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(getApiAgentsFetchDeletedResponse, await res.json()) };