import {z} from 'zod' export type GetApiV1TeamsTeamIdSecretIncidentsArgs = {team_id: number, cursor?: string | undefined, page?: number | undefined, per_page?: number | undefined, date_before?: unknown | undefined, date_after?: unknown | undefined, assignee_email?: string | undefined, assignee_id?: number | undefined, status?: ('IGNORED' | 'TRIGGERED' | 'ASSIGNED' | 'RESOLVED') | undefined, severity?: ('critical' | 'high' | 'medium' | 'low' | 'info' | 'unknown') | undefined, validity?: ('valid' | 'invalid' | 'failed_to_check' | 'no_checker' | 'unknown') | undefined, tags?: ('DEFAULT_BRANCH' | 'FROM_HISTORICAL_SCAN' | 'CHECK_RUN_SKIP_FALSE_POSITIVE' | 'CHECK_RUN_SKIP_LOW_RISK' | 'CHECK_RUN_SKIP_TEST_CRED' | 'PUBLIC' | 'PUBLICLY_EXPOSED' | 'PUBLICLY_LEAKED' | 'REGRESSION' | 'SENSITIVE_FILE' | 'TEST_FILE' | 'FALSE_POSITIVE' | 'VAULTED' | 'NONE') | undefined, custom_tags?: string | undefined, custom_tag_key?: string | undefined, custom_tag_value?: string | undefined, ordering?: ('date' | '-date' | 'resolved_at' | '-resolved_at' | 'ignored_at' | '-ignored_at') | undefined, detector_group_name?: string | undefined, ignorer_id?: number | undefined, ignorer_api_token_id?: string | undefined, resolver_id?: number | undefined, resolver_api_token_id?: string | undefined, feedback?: boolean | undefined, only_on_provider_archived_sources?: boolean | undefined}; export type GetApiV1TeamsTeamIdSecretIncidentsOptions = {baseUrl?: string | undefined, apiKey?: string | undefined, fetch?: typeof fetch | undefined}; export const getApiV1TeamsTeamIdSecretIncidentsResponse = z.array(z.object({id: z.number().int().optional(), date: z.string().optional(), detector: z.object({name: z.string(), display_name: z.string(), nature: z.string(), family: z.string().optional(), category: z.string().optional(), detector_group_name: z.string().optional(), detector_group_display_name: z.string().optional(), revocation_mode: z.enum(["synchronous", "asynchronous"]).nullable().optional(), revocation_credentials: z.record(z.string(), z.string()).nullable().optional(), revocation_optional_credentials: z.record(z.string(), z.string()).nullable().optional()}).optional(), secret_id: z.number().int().optional(), secret_hash: z.string().optional(), hmsl_hash: z.string().optional(), gitguardian_url: z.string().optional(), regression: z.boolean().optional(), status: z.enum(["IGNORED", "TRIGGERED", "ASSIGNED", "RESOLVED"]).optional(), assignee_id: z.number().int().nullable().optional(), assignee_email: z.string().nullable().optional(), occurrences_count: z.number().int().optional(), secret_presence: z.object({files_requiring_code_fix: z.number().int().optional(), files_pending_merge: z.number().int().optional(), files_fixed: z.number().int().optional(), outside_vcs: z.number().int().optional(), removed_outside_vcs: z.number().int().optional(), in_vcs: z.number().int().optional(), removed_in_vcs: z.number().int().optional()}).optional(), ignore_reason: z.enum(["test_credential", "false_positive", "low_risk", "invalid"]).nullable().optional(), triggered_at: z.string().optional(), ignored_at: z.string().nullable().optional(), ignorer_id: z.number().int().nullable().optional(), ignorer_api_token_id: z.string().nullable().optional(), resolver_id: z.number().int().nullable().optional(), resolver_api_token_id: z.string().nullable().optional(), secret_revoked: z.boolean().optional(), severity: z.enum(["critical", "high", "medium", "low", "info", "unknown"]).optional(), validity: z.enum(["valid", "invalid", "failed_to_check", "no_checker", "unknown"]).optional(), resolved_at: z.string().nullable().optional(), share_url: z.string().nullable().optional(), tags: z.array(z.enum(["DEFAULT_BRANCH", "FROM_HISTORICAL_SCAN", "CHECK_RUN_SKIP_FALSE_POSITIVE", "CHECK_RUN_SKIP_LOW_RISK", "CHECK_RUN_SKIP_TEST_CRED", "IGNORED_IN_CHECK_RUN", "PUBLIC", "PUBLICLY_EXPOSED", "PUBLICLY_LEAKED", "REGRESSION", "SENSITIVE_FILE", "TEST_FILE", "FALSE_POSITIVE", "VAULTED", "REVOCABLE_BY_GG"])).optional(), custom_tags: z.array(z.object({id: z.string().optional(), key: z.string().optional(), value: z.string().nullable().optional()})).optional(), feedback_list: z.array(z.object({created_at: z.string().optional(), updated_at: z.string().optional(), member_id: z.number().int().nullable().optional(), email: z.string().optional(), answers: z.array(z.union([z.object({type: z.literal("boolean").optional(), field_ref: z.string().optional(), field_label: z.string().optional(), boolean: z.boolean().optional()}), z.object({type: z.literal("text").optional(), field_ref: z.string().optional(), field_label: z.string().optional(), text: z.string().optional()})])).optional()})).optional(), incident_name: z.string().optional(), risk_score: z.number().int().nullable().optional(), severity_rule_id: z.number().int().nullable().optional(), is_vaulted: z.boolean().nullable().optional(), public_exposure: z.object({source_publicly_visible: z.boolean().optional(), public_incident_linked: z.boolean().optional(), leaked_outside_perimeter: z.boolean().optional()}).nullable().optional(), destination_tickets: z.array(z.object({id: z.string(), type: z.enum(["jira_cloud", "jira_data_center", "servicenow"]), link: z.string()})).optional(), occurrences: z.array(z.object({id: z.number().int().optional(), incident_id: z.number().int().optional(), kind: z.enum(["realtime", "historical"]).optional(), source: z.object({id: z.number().int().optional(), url: z.string().optional(), type: z.string().optional(), full_name: z.string().optional(), full_path: z.string().nullable().optional(), health: z.enum(["safe", "unknown", "at_risk"]).optional(), default_branch: z.string().nullable().optional(), default_branch_head: z.string().nullable().optional(), open_incidents_count: z.number().int().optional(), closed_incidents_count: z.number().int().optional(), secret_incidents_breakdown: z.object({open_secret_incidents: z.object({total: z.number().int().optional(), severity_breakdown: z.object({critical: z.number().int().optional(), high: z.number().int().optional(), medium: z.number().int().optional(), low: z.number().int().optional(), info: z.number().int().optional(), unknown: z.number().int().optional()}).optional()}).optional(), closed_secret_incidents: z.object({total: z.number().int().optional(), severity_breakdown: z.object({critical: z.number().int().optional(), high: z.number().int().optional(), medium: z.number().int().optional(), low: z.number().int().optional(), info: z.number().int().optional(), unknown: z.number().int().optional()}).optional()}).optional()}).optional(), visibility: z.string().optional(), external_id: z.string().optional(), source_criticality: z.string().optional(), last_scan: z.object({date: z.string().optional(), status: z.enum(["launched", "pending", "running", "finished", "failed", "canceled", "too_large", "timeout", "skipped", "pending_timeout", "running_failed", "running_cancelled"]).optional(), failing_reason: z.string().optional(), commits_scanned: z.number().int().optional(), branches_scanned: z.number().int().optional(), duration: z.string().optional()}).nullable().optional(), monitored: z.boolean().optional(), monitoring_status: z.enum(["active", "disabled", "unreachable", "archived", "deleted_on_remote"]).optional(), provider_metadata: z.object({archived: z.boolean()}).optional(), deleted: z.boolean().optional()}).optional(), author_name: z.string().optional(), author_info: z.string().optional(), date: z.string().optional(), url: z.string().optional(), matches: z.array(z.object({name: z.string(), indice_start: z.number().int(), indice_end: z.number().int(), pre_line_start: z.number().int().nullable(), pre_line_end: z.number().int().nullable(), post_line_start: z.number().int().nullable(), post_line_end: z.number().int().nullable()})).optional(), tags: z.array(z.enum(["DEFAULT_BRANCH", "FROM_HISTORICAL_SCAN", "CHECK_RUN_SKIP_FALSE_POSITIVE", "CHECK_RUN_SKIP_LOW_RISK", "CHECK_RUN_SKIP_TEST_CRED", "IGNORED_IN_CHECK_RUN", "PUBLIC", "PUBLICLY_EXPOSED", "PUBLICLY_LEAKED", "REGRESSION", "SENSITIVE_FILE", "TEST_FILE", "FALSE_POSITIVE", "VAULTED", "REVOCABLE_BY_GG"])).optional(), incident_name: z.string().optional(), sha: z.string().nullable().optional(), presence: z.enum(["present", "removed"]).optional(), filepath: z.string().nullable().optional(), change_type: z.enum(["addition", "deletion", "context"]).nullable().optional()})).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 }; /** * List secret incidents a team has access to * * GET /v1/teams/{team_id}/secret-incidents */ export const getApiV1TeamsTeamIdSecretIncidents = async (args: GetApiV1TeamsTeamIdSecretIncidentsArgs, options?: GetApiV1TeamsTeamIdSecretIncidentsOptions) => { const {baseUrl = "https://api.gitguardian.com", fetch: fetchFn = fetch, apiKey} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.cursor != null) query.append("cursor", String(args.cursor)) if (args.page != null) query.append("page", String(args.page)) if (args.per_page != null) query.append("per_page", String(args.per_page)) if (args.date_before != null) query.append("date_before", String(args.date_before)) if (args.date_after != null) query.append("date_after", String(args.date_after)) if (args.assignee_email != null) query.append("assignee_email", String(args.assignee_email)) if (args.assignee_id != null) query.append("assignee_id", String(args.assignee_id)) if (args.status != null) query.append("status", String(args.status)) if (args.severity != null) query.append("severity", String(args.severity)) if (args.validity != null) query.append("validity", String(args.validity)) if (args.tags != null) query.append("tags", String(args.tags)) if (args.custom_tags != null) query.append("custom_tags", String(args.custom_tags)) if (args.custom_tag_key != null) query.append("custom_tag_key", String(args.custom_tag_key)) if (args.custom_tag_value != null) query.append("custom_tag_value", String(args.custom_tag_value)) if (args.ordering != null) query.append("ordering", String(args.ordering)) if (args.detector_group_name != null) query.append("detector_group_name", String(args.detector_group_name)) if (args.ignorer_id != null) query.append("ignorer_id", String(args.ignorer_id)) if (args.ignorer_api_token_id != null) query.append("ignorer_api_token_id", String(args.ignorer_api_token_id)) if (args.resolver_id != null) query.append("resolver_id", String(args.resolver_id)) if (args.resolver_api_token_id != null) query.append("resolver_api_token_id", String(args.resolver_api_token_id)) if (args.feedback != null) query.append("feedback", String(args.feedback)) if (args.only_on_provider_archived_sources != null) query.append("only_on_provider_archived_sources", String(args.only_on_provider_archived_sources)) if (apiKey !== undefined) headers.set('authorization', `Bearer ${apiKey}`) const url = `${baseUrl.replace(/\/+$/, '')}/v1/teams/${encodeURIComponent(String(args.team_id))}/secret-incidents${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(getApiV1TeamsTeamIdSecretIncidentsResponse, await res.json()) };