import {z} from 'zod' export type GetApiApiExternalBridgeBridgeIdColumnMetadataArgs = {bridgeId: string}; export type GetApiApiExternalBridgeBridgeIdColumnMetadataOptions = {baseUrl?: string | undefined, apiKey?: string | undefined, fetch?: typeof fetch | undefined}; export const fieldFormatEnumerationValue = z.object({value: z.string(), label: z.string().optional()}); export const bridgeObjFieldDefinition = z.object({name: z.string(), type: z.enum(["text", "date", "url", "number", "enumeration", "list", "obj", "json", "phone", "email", "boolean", "currencyUnit"]), description: z.string().nullable().optional()}); export const bridgeFieldFormat = z.object({baseFormat: z.enum(["text", "date", "url", "number", "enumeration", "list", "obj", "json", "phone", "email", "boolean", "currencyUnit"]), description: z.string().nullable().optional(), enumerationValues: z.array(fieldFormatEnumerationValue).nullable().optional(), currency: z.enum(["USD", "CAD"]).nullable().optional(), listElementBaseFormat: z.enum(["text", "date", "url", "number", "enumeration", "list", "obj", "json", "phone", "email", "boolean", "currencyUnit"]).nullable().optional(), outputFields: z.array(bridgeObjFieldDefinition).nullable().optional()}); export const bridgeColumnResponse = z.object({columnId: z.string(), bridgeId: z.string(), name: z.string(), prompt: z.string(), type: z.enum(["AiAnalysis", "DataAttribute", "AiAnalysisTemplate", "WebAgentTemplate", "Input", "Link", "CrmLookup", "CrmSync", "LinkToCell", "CompetitorsPresence", "EmailTemplate", "PhoneCallTemplate", "Webhook", "MultiLink", "AccountScoring"]), fieldFormat: bridgeFieldFormat, index: z.number().int(), key: z.string().nullable().optional()}); export const bridgeRowAttributeOption = z.object({key: z.string(), name: z.string(), fieldFormat: bridgeFieldFormat}); export const triggerFiltersTerm = z.object({field: z.string(), operation: z.enum(["Equals", "DoesNotEqual", "Contains", "DoesNotContain", "GreaterThan", "LessThan", "IsEmpty", "IsNotEmpty", "Any", "None", "ContainsAny", "ContainsAll", "ContainedBy", "NotContainedBy", "HasCellStatus", "HasLookupStatus", "HasLastSyncStatus", "HasSyncStatusHistory"]), value: z.unknown()}); export const triggerFiltersTermGroup = z.object({terms: z.array(triggerFiltersTerm).optional()}); export const triggerFilters = z.object({groups: z.array(triggerFiltersTermGroup).optional()}); export const bridgeLinkSettings = z.object({sourceBridgeId: z.string(), includedStatuses: z.array(z.string()), maxAgeRelativePeriod: z.enum(["Future", "NextTwoYears", "NextYear", "NextNineMonths", "NextSixMonths", "NextThreeMonths", "NextTwoMonths", "NextOneMonth", "NextSixtyDays", "NextThirtyDays", "NextSevenDays", "NextOneDay", "Present", "LastOneDay", "LastSevenDays", "LastThirtyDays", "LastSixtyDays", "LastOneMonths", "LastTwoMonths", "LastThreeMonths", "LastSixMonths", "LastNineMonths", "LastYear", "LastTwoYears", "Past"]).nullable().optional(), filters: triggerFilters.optional()}); export const competitorPresenceSettingsServiceProvider = z.object({name: z.string(), serviceProviderAliases: z.array(z.string()).nullable().optional(), productNamesOrAliases: z.array(z.string()).nullable().optional()}); export const bridgeCompetitorPresenceSettings = z.object({serviceProviders: z.array(competitorPresenceSettingsServiceProvider), runWebPresence: z.boolean(), contextPrompt: z.string().nullable().optional(), runContractEstimation: z.boolean().optional()}); export const bridgeEmailGenerationSettings = z.object({emailSubjectTemplate: z.string(), emailBodyTemplate: z.string(), showParentColumn: z.boolean().optional(), snippetDefinitions: z.record(z.string(), z.string()).nullable().optional()}); export const bridgeLinkToCellSettings = z.object({targetBridgeId: z.string(), targetColumnId: z.string(), sourceRowIdentity: z.string()}); export const bridgeMultiLinkSettings = z.object({sourceBridgeIds: z.array(z.string()), includedStatuses: z.array(z.string()), maxAgeRelativePeriod: z.enum(["Future", "NextTwoYears", "NextYear", "NextNineMonths", "NextSixMonths", "NextThreeMonths", "NextTwoMonths", "NextOneMonth", "NextSixtyDays", "NextThirtyDays", "NextSevenDays", "NextOneDay", "Present", "LastOneDay", "LastSevenDays", "LastThirtyDays", "LastSixtyDays", "LastOneMonths", "LastTwoMonths", "LastThreeMonths", "LastSixMonths", "LastNineMonths", "LastYear", "LastTwoYears", "Past"]).nullable().optional()}); export const webContactSettings = z.object({subPrompt: z.string(), examples: z.array(z.string()).nullable().optional(), additionalContext: z.string().nullable().optional()}); export const accountScoringFitColumnConfig = z.object({phaseId: z.string(), includedInScoring: z.boolean().optional(), weight: z.enum(["High", "Medium", "Low"]).optional(), strongFitGuidance: z.string().nullable().optional()}); export const accountScoringSignalTypeConfig = z.object({weight: z.enum(["High", "Medium", "Low"]).optional(), guidance: z.string().nullable().optional()}); export const accountScoringConfig = z.object({fitColumns: z.array(accountScoringFitColumnConfig).nullable().optional(), signalConfigs: z.record(z.string(), accountScoringSignalTypeConfig).nullable().optional(), fitInteractionPrompt: z.string().nullable().optional(), signalInteractionPrompt: z.string().nullable().optional()}); export const signalBridgeConfig = z.object({id: z.string(), enabled: z.boolean().optional()}); export const accountScoringMetadata = z.object({scoringConfig: accountScoringConfig.optional(), signalBridgesByType: z.record(z.string(), signalBridgeConfig).optional()}); export const bridgeExistingColumnMetadata = z.object({columnId: z.string(), bridgeId: z.string(), column: bridgeColumnResponse, additionalFields: z.array(bridgeRowAttributeOption), webAgentModel: z.enum(["Lite", "Base", "Core", "Core2X", "Pro", "Ultra", "UltraTwoX", "UltraFourX", "UltraEightX"]).nullable().optional(), linkSettings: bridgeLinkSettings.optional(), vendorPresenceSettings: bridgeCompetitorPresenceSettings.nullable().optional(), emailGenerationSettings: bridgeEmailGenerationSettings.nullable().optional(), webhookUrl: z.string().nullable().optional(), linkToCellSettings: bridgeLinkToCellSettings.nullable().optional(), multiLinkSettings: bridgeMultiLinkSettings.nullable().optional(), webContactSettings: webContactSettings.nullable().optional(), accountScoringMetadata: accountScoringMetadata.nullable().optional(), runConditions: triggerFilters.optional()}); export const getApiApiExternalBridgeBridgeIdColumnMetadataResponse = z.array(bridgeExistingColumnMetadata); 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 existing columns with their per-type settings * * GET /api/external/bridge/{bridgeId}/column/metadata */ export const getApiApiExternalBridgeBridgeIdColumnMetadata = async (args: GetApiApiExternalBridgeBridgeIdColumnMetadataArgs, options?: GetApiApiExternalBridgeBridgeIdColumnMetadataOptions) => { const {baseUrl = "https://dashboard.starbridge.ai", fetch: fetchFn = fetch, apiKey} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (apiKey !== undefined) headers.set('authorization', `Bearer ${apiKey}`) const url = `${baseUrl.replace(/\/+$/, '')}/api/external/bridge/${encodeURIComponent(String(args.bridgeId))}/column/metadata${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(getApiApiExternalBridgeBridgeIdColumnMetadataResponse, await res.json()) };