import {z} from 'zod' export type GetApiApiV1AssistantTrademeConversationsConversationIdMessagesArgs = {conversation_id: string, after_seq?: (number | null) | undefined, before_seq?: (number | null) | undefined, limit?: number | undefined, order?: ('asc' | 'desc') | undefined, 'accept-nodes': Array, 'X-Anvil-Node-Capabilities'?: (Array | null) | undefined, authorization?: (string | null) | undefined}; export type GetApiApiV1AssistantTrademeConversationsConversationIdMessagesOptions = {baseUrl: string, AnvilBearerToken?: string | undefined, fetch?: typeof fetch | undefined}; export const messageKind = z.enum(["user", "response", "update"]); export const messageState = z.enum(["pending", "complete", "removed"]); export const memberAuthor = z.object({authorType: z.literal("member").optional(), memberId: z.string(), displayName: z.string().nullable().optional()}); export const assistantAuthor = z.object({authorType: z.literal("assistant").optional(), assistantId: z.string(), assistantVersion: z.string(), parametersVersion: z.string(), contextId: z.string()}); export const plainTextBlock = z.object({type: z.literal("plain_text").optional(), version: z.literal("1").optional(), text: z.string()}); export const dividerBlock = z.object({type: z.literal("divider").optional(), version: z.literal("1").optional()}); export const textNode = z.object({type: z.literal("text").optional(), raw: z.string()}); export const codeSpanNode = z.object({type: z.literal("code_span").optional(), raw: z.string()}); export const softBreakNode = z.object({type: z.literal("soft_break").optional()}); export const hardBreakNode = z.object({type: z.literal("hard_break").optional()}); export const linkNode: z.ZodType = z.object({type: z.literal("link").optional(), href: z.string(), title: z.string().nullable().optional(), children: z.array(z.discriminatedUnion("type", [textNode, codeSpanNode, softBreakNode, hardBreakNode, z.lazy(() => strongNode), z.lazy(() => emphasisNode), z.lazy(() => strikethroughNode), z.lazy(() => linkNode)]))}); export const strikethroughNode: z.ZodType = z.object({type: z.literal("strikethrough").optional(), children: z.array(z.discriminatedUnion("type", [textNode, codeSpanNode, softBreakNode, hardBreakNode, z.lazy(() => strongNode), z.lazy(() => emphasisNode), z.lazy(() => strikethroughNode), linkNode]))}); export const emphasisNode: z.ZodType = z.object({type: z.literal("emphasis").optional(), children: z.array(z.discriminatedUnion("type", [textNode, codeSpanNode, softBreakNode, hardBreakNode, z.lazy(() => strongNode), z.lazy(() => emphasisNode), strikethroughNode, linkNode]))}); export const strongNode: z.ZodType = z.object({type: z.literal("strong").optional(), children: z.array(z.discriminatedUnion("type", [textNode, codeSpanNode, softBreakNode, hardBreakNode, z.lazy(() => strongNode), emphasisNode, strikethroughNode, linkNode]))}); export const headingBlock = z.object({type: z.literal("heading").optional(), version: z.literal("1").optional(), level: z.number().int(), inline: z.array(z.discriminatedUnion("type", [textNode, codeSpanNode, softBreakNode, hardBreakNode, strongNode, emphasisNode, strikethroughNode, linkNode])).optional()}); export const paragraphBlock = z.object({type: z.literal("paragraph").optional(), version: z.literal("1").optional(), inline: z.array(z.discriminatedUnion("type", [textNode, codeSpanNode, softBreakNode, hardBreakNode, strongNode, emphasisNode, strikethroughNode, linkNode])).optional()}); export const codeBlock = z.object({type: z.literal("code_block").optional(), version: z.literal("1").optional(), language: z.string().nullable().optional(), code: z.string()}); export const listItemBlock = z.object({children: z.array(z.discriminatedUnion("type", [plainTextBlock, dividerBlock, headingBlock, paragraphBlock, codeBlock, z.lazy(() => blockquoteBlock), z.lazy(() => listBlock)])).optional(), type: z.literal("list_item").optional(), version: z.literal("1").optional()}); export const listBlock: z.ZodType = z.object({children: z.array(listItemBlock).optional(), type: z.literal("list").optional(), version: z.literal("1").optional(), ordered: z.boolean()}); export const blockquoteBlock: z.ZodType = z.object({children: z.array(z.discriminatedUnion("type", [plainTextBlock, dividerBlock, headingBlock, paragraphBlock, codeBlock, z.lazy(() => blockquoteBlock), listBlock])).optional(), type: z.literal("blockquote").optional(), version: z.literal("1").optional()}); export const richTextBlock = z.object({children: z.array(z.discriminatedUnion("type", [plainTextBlock, dividerBlock, headingBlock, paragraphBlock, codeBlock, blockquoteBlock, listBlock])).optional(), type: z.literal("rich_text").optional(), version: z.literal("1").optional()}); export const listingPhotoBlock = z.object({type: z.literal("listing_photo").optional(), version: z.literal("1").optional(), photoId: z.string().min(1), listingId: z.string().min(1), photoIndex: z.number().int(), urls: z.record(z.string(), z.string()), originalWidth: z.number().int().gt(0), originalHeight: z.number().int().gt(0), alt: z.string().optional()}); export const imageBlock = z.object({type: z.literal("image_block").optional(), version: z.literal("1").optional(), url: z.string(), alt: z.string(), width: z.number().int().nullable().optional(), height: z.number().int().nullable().optional(), aspectRatio: z.number().nullable().optional(), description: z.string().nullable().optional(), source: z.enum(["trademe", "user_provided", "external", "ai_generated"]).optional()}); export const choiceItem = z.object({id: z.string(), label: z.string()}); export const choicesBlock = z.object({type: z.literal("choices").optional(), version: z.literal("1").optional(), label: z.string(), selectionType: z.enum(["single", "multi"]).optional(), choices: z.array(choiceItem).optional()}); export const crisisResourceBlock = z.object({type: z.literal("crisis_resource").optional(), version: z.literal("1").optional(), name: z.string(), text: z.string(), phone: z.string().nullable().optional(), sms: z.string().nullable().optional(), url: z.string().nullable().optional(), artifactUri: z.string().nullable().optional()}); export const iframeBlock = z.object({type: z.literal("iframe").optional(), version: z.literal("1").optional(), url: z.string().nullable().optional(), html: z.string().max(65536).nullable().optional(), title: z.string(), text: z.string(), width: z.number().int().gt(0).optional(), height: z.number().int().gt(0).optional()}); export const typedValue: z.ZodType = z.object({strValue: z.string().nullable().optional(), numValue: z.union([z.number(), z.string()]).nullable().optional(), boolValue: z.boolean().nullable().optional(), arrValue: z.array(z.lazy(() => typedValue)).nullable().optional()}); export const tVAParameter = z.object({key: z.string(), value: typedValue}); export const linkAnnotation = z.object({title: z.string(), summary: z.string().nullable().optional(), imageUrl: z.string().nullable().optional()}); export const templatedViewAddress = z.object({viewName: z.string(), uri: z.string(), parameters: z.array(tVAParameter).optional(), annotation: linkAnnotation.nullable().optional()}); export const actionButtonBlock = z.object({type: z.literal("action_button").optional(), version: z.literal("1").optional(), action: z.string(), ref: z.record(z.string(), z.unknown()), label: z.string(), icon: z.string().nullable().optional(), style: z.literal("primary").nullable().optional(), disabled: z.boolean().optional(), disabledReason: z.string().nullable().optional()}); export const textInputBlock = z.object({type: z.literal("text_input").optional(), version: z.literal("1").optional(), name: z.string().min(1), label: z.string(), description: z.string().nullable().optional(), value: z.string().optional(), multiline: z.boolean().optional(), maxLength: z.number().int().gte(1).nullable().optional(), required: z.boolean().optional()}); export const watchlistToggleBlock = z.object({type: z.literal("watchlist_toggle").optional(), version: z.literal("1").optional(), listingId: z.string().min(1), isOnWatchlist: z.boolean().nullable(), addLabel: z.string(), removeLabel: z.string(), displayVariant: z.enum(["inline", "compact", "floating"]).optional(), action: z.string(), ref: z.record(z.string(), z.unknown())}); export const pendingStateBlock: z.ZodType = z.object({children: z.array(z.discriminatedUnion("type", [plainTextBlock, paragraphBlock, actionButtonBlock, z.lazy(() => pendingStateBlock), textInputBlock, watchlistToggleBlock])).optional(), type: z.literal("pending_state").optional(), version: z.literal("1").optional()}); export const nonBindingActionBlock = z.object({children: z.array(z.discriminatedUnion("type", [plainTextBlock, paragraphBlock, actionButtonBlock, pendingStateBlock, textInputBlock, watchlistToggleBlock])).optional(), type: z.literal("non_binding_action").optional(), version: z.literal("1").optional(), id: z.string(), participantId: z.string().min(1), artifactUri: z.string().nullable().optional()}); export const priceField = z.object({name: z.string(), type: z.literal("price").optional(), value: z.string()}); export const weeklyRentField = z.object({name: z.string(), type: z.literal("weekly_rent").optional(), value: z.string()}); export const bedroomsField = z.object({name: z.string(), type: z.literal("bedrooms").optional(), value: z.number().int()}); export const bathroomsField = z.object({name: z.string(), type: z.literal("bathrooms").optional(), value: z.number().int()}); export const landAreaField = z.object({name: z.string(), type: z.literal("land_area").optional(), valueM2: z.number().int(), display: z.string()}); export const floorAreaField = z.object({name: z.string(), type: z.literal("floor_area").optional(), valueM2: z.number().int(), display: z.string()}); export const propertyTypeField = z.object({name: z.string(), type: z.literal("property_type").optional(), value: z.string()}); export const availableDateField = z.object({name: z.string(), type: z.literal("available_date").optional(), isoDate: z.string(), display: z.string()}); export const textField = z.object({name: z.string(), type: z.literal("text").optional(), value: z.string()}); export const numberField = z.object({name: z.string(), type: z.literal("number").optional(), value: z.number()}); export const moneyField = z.object({name: z.string(), type: z.literal("money").optional(), value: z.number(), display: z.string()}); export const boolField = z.object({name: z.string(), type: z.literal("bool").optional(), value: z.boolean()}); export const listingSummaryBlock = z.object({listingId: z.string(), title: z.string().nullable().optional(), tva: templatedViewAddress, isOnWatchlist: z.boolean().nullable().optional(), actions: z.array(nonBindingActionBlock).nullable().optional(), images: z.array(z.string()).optional(), type: z.literal("listing_summary").optional(), version: z.literal("1").optional(), imagesEnabled: z.boolean().optional(), fields: z.array(z.discriminatedUnion("type", [priceField, weeklyRentField, bedroomsField, bathroomsField, landAreaField, floorAreaField, propertyTypeField, availableDateField, textField, numberField, moneyField, boolField])).optional()}); export const generalListingSummaryWithCoordinatesBlock = z.object({latitude: z.number(), longitude: z.number(), listingId: z.string(), title: z.string().nullable().optional(), tva: templatedViewAddress, isOnWatchlist: z.boolean().nullable().optional(), actions: z.array(nonBindingActionBlock).nullable().optional(), images: z.array(z.string()).optional(), type: z.literal("listing_summary_with_coordinates").optional(), version: z.literal("1").optional()}); export const iconAttributeField = z.object({key: z.string(), icon: z.string(), displayValue: z.string(), rawValue: z.number().nullable().optional(), sortValue: z.number().nullable().optional()}); export const propertyListingPriceField = z.object({displayValue: z.string(), asOf: z.string()}); export const listingAddressValue = z.object({street: z.string(), suburb: z.string(), district: z.string()}); export const listingAddressField = z.object({displayValue: z.string(), rawValue: listingAddressValue}); export const geographicLocation = z.object({latitude: z.number(), longitude: z.number(), accuracy: z.number().int().nullable().optional()}); export const openHomeTime = z.object({start: z.string(), end: z.string()}); export const openHomesField = z.object({items: z.array(openHomeTime), asOf: z.string()}); export const propertyListingAgent = z.object({agentFullName: z.string(), agentPhotoUrl: z.string().nullable().optional()}); export const agencyInfo = z.object({name: z.string(), logoUrl: z.string().nullable().optional(), logo2Url: z.string().nullable().optional(), largeBannerUrl: z.string().nullable().optional(), brandColor: z.string().nullable().optional(), foregroundColor: z.string().nullable().optional(), agents: z.array(propertyListingAgent).optional()}); export const propertyResiForSaleListingSummaryBlock = z.object({iconAttributes: z.array(iconAttributeField).optional(), listingId: z.string(), title: z.string().nullable().optional(), tva: templatedViewAddress, isOnWatchlist: z.boolean().nullable().optional(), actions: z.array(nonBindingActionBlock).nullable().optional(), images: z.array(z.string()).optional(), type: z.literal("property_resi_for_sale_listing_summary").optional(), version: z.literal("1").optional(), price: propertyListingPriceField, address: listingAddressField, geographicLocation: geographicLocation.nullable().optional(), propertyType: z.string().nullable().optional(), openHomes: openHomesField.nullable().optional(), listingExtras: z.array(z.string()).nullable().optional(), premiumPackageCode: z.string().nullable().optional(), isBold: z.boolean().nullable().optional(), isFeatured: z.boolean().nullable().optional(), isHighlighted: z.boolean().nullable().optional(), has3DTour: z.boolean().nullable().optional(), hasEmbeddedVideo: z.boolean().nullable().optional(), startDate: z.string().nullable().optional(), mainPhoto: z.string().nullable().optional(), photoUrls: z.array(z.string()).optional(), canonicalPath: z.string().nullable().optional(), category: z.string().nullable().optional(), agency: agencyInfo.nullable().optional()}); export const propertyResiForRentListingSummaryBlock = z.object({iconAttributes: z.array(iconAttributeField).optional(), listingId: z.string(), title: z.string().nullable().optional(), tva: templatedViewAddress, isOnWatchlist: z.boolean().nullable().optional(), actions: z.array(nonBindingActionBlock).nullable().optional(), images: z.array(z.string()).optional(), type: z.literal("property_resi_for_rent_listing_summary").optional(), version: z.literal("1").optional(), weeklyRent: propertyListingPriceField, availableFrom: z.string().nullable().optional(), address: listingAddressField, propertyType: z.string().nullable().optional(), isBold: z.boolean().nullable().optional(), isFeatured: z.boolean().nullable().optional(), isHighlighted: z.boolean().nullable().optional(), has3DTour: z.boolean().nullable().optional(), hasEmbeddedVideo: z.boolean().nullable().optional(), agency: agencyInfo.nullable().optional()}); export const motorsVehiclePriceField = z.object({displayValue: z.string(), priceNote: z.string().nullable().optional(), asOf: z.string()}); export const motorsDealerInfo = z.object({name: z.string(), logoUrl: z.string().nullable().optional(), brandColor: z.string().nullable().optional()}); export const motorsVehicleListingSummaryBlock = z.object({iconAttributes: z.array(iconAttributeField).optional(), listingId: z.string(), title: z.string().nullable().optional(), tva: templatedViewAddress, isOnWatchlist: z.boolean().nullable().optional(), actions: z.array(nonBindingActionBlock).nullable().optional(), images: z.array(z.string()).optional(), type: z.literal("motors_vehicle_listing_summary").optional(), version: z.literal("1").optional(), askingPrice: motorsVehiclePriceField, dealer: motorsDealerInfo.nullable().optional(), isDealer: z.boolean().nullable().optional()}); export const marketplaceListingSummaryBlock = z.object({listingId: z.string(), title: z.string().nullable().optional(), tva: templatedViewAddress, isOnWatchlist: z.boolean().nullable().optional(), actions: z.array(nonBindingActionBlock).nullable().optional(), images: z.array(z.string()).optional(), type: z.literal("marketplace_listing_summary").optional(), version: z.literal("1").optional(), region: z.string().nullable().optional(), closesAt: z.string().nullable().optional(), reservePrice: z.string().nullable().optional(), buyNowPrice: z.string().nullable().optional(), isBuyNow: z.boolean().nullable().optional(), condition: z.string().nullable().optional(), shipping: z.string().nullable().optional()}); export const searchQuery = z.object({tva: templatedViewAddress, label: z.string()}); export const searchMetadata = z.object({searchQuery: searchQuery.nullable().optional(), totalCount: z.number().int().nullable().optional()}); export const searchResultsBlock = z.object({type: z.literal("search_results").optional(), version: z.literal("1").optional(), artifactUri: z.string().nullable().optional(), toolCallId: z.string().nullable().optional(), preferType: z.string().nullable().optional(), items: z.array(z.discriminatedUnion("type", [listingSummaryBlock, generalListingSummaryWithCoordinatesBlock, propertyResiForSaleListingSummaryBlock, propertyResiForRentListingSummaryBlock, motorsVehicleListingSummaryBlock, marketplaceListingSummaryBlock])).optional(), searchMetadata: searchMetadata.nullable().optional()}); export const searchResultsWithCoordinatesBlock = z.object({type: z.literal("search_results_with_coordinates").optional(), version: z.literal("1").optional(), artifactUri: z.string().nullable().optional(), toolCallId: z.string().nullable().optional(), preferType: z.string().nullable().optional(), items: z.array(generalListingSummaryWithCoordinatesBlock).optional(), searchMetadata: searchMetadata.nullable().optional()}); export const rentSummary = z.object({minWeeklyRent: z.number().int(), maxWeeklyRent: z.number().int(), medianWeeklyRent: z.number().int(), sampleSize: z.number().int()}); export const propertyRentalSearchResultsBlock = z.object({type: z.literal("property_rental_search_results").optional(), version: z.literal("1").optional(), artifactUri: z.string().nullable().optional(), toolCallId: z.string().nullable().optional(), preferType: z.string().nullable().optional(), items: z.array(propertyResiForRentListingSummaryBlock).optional(), searchMetadata: searchMetadata.nullable().optional(), rentSummary: rentSummary.nullable().optional()}); export const userFileRefBlock = z.object({type: z.literal("user_file_ref").optional(), version: z.literal("1").optional(), ref: z.string().min(14), alt: z.string().max(512).optional(), width: z.number().int().gt(0).nullable().optional(), height: z.number().int().gt(0).nullable().optional()}); export const listingRefBlock = z.object({type: z.literal("listing_ref").optional(), version: z.literal("1").optional(), ref: z.string().min(20)}); export const message = z.object({id: z.string().optional(), conversationId: z.string(), kind: messageKind, state: messageState.optional(), author: z.discriminatedUnion("authorType", [memberAuthor, assistantAuthor]), blocks: z.array(z.discriminatedUnion("type", [plainTextBlock, richTextBlock, listingPhotoBlock, imageBlock, choicesBlock, crisisResourceBlock, iframeBlock, listingSummaryBlock, generalListingSummaryWithCoordinatesBlock, propertyResiForSaleListingSummaryBlock, propertyResiForRentListingSummaryBlock, motorsVehicleListingSummaryBlock, marketplaceListingSummaryBlock, searchResultsBlock, searchResultsWithCoordinatesBlock, propertyRentalSearchResultsBlock, nonBindingActionBlock, userFileRefBlock, listingRefBlock])).optional(), createdAt: z.string().optional(), finalisedAt: z.string().nullable().optional(), seq: z.number().int().optional(), inputId: z.string().nullable().optional()}); export const messageListResponse = z.object({messages: z.array(message), hasMore: z.boolean()}); 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 messages * * GET /api/v1/assistant/trademe/conversations/{conversation_id}/messages */ export const getApiApiV1AssistantTrademeConversationsConversationIdMessages = async (args: GetApiApiV1AssistantTrademeConversationsConversationIdMessagesArgs, options: GetApiApiV1AssistantTrademeConversationsConversationIdMessagesOptions) => { const {baseUrl, fetch: fetchFn = fetch, AnvilBearerToken} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.after_seq != null) query.append("after_seq", String(args.after_seq)) if (args.before_seq != null) query.append("before_seq", String(args.before_seq)) if (args.limit != null) query.append("limit", String(args.limit)) if (args.order != null) query.append("order", String(args.order)) if (args['accept-nodes'] != null) headers.set("accept-nodes", args['accept-nodes'].join(',')) if (args['X-Anvil-Node-Capabilities'] != null) headers.set("X-Anvil-Node-Capabilities", args['X-Anvil-Node-Capabilities'].join(',')) if (args.authorization != null) headers.set("authorization", String(args.authorization)) if (AnvilBearerToken !== undefined) headers.set('authorization', `Bearer ${AnvilBearerToken}`) const url = `${baseUrl.replace(/\/+$/, '')}/api/v1/assistant/trademe/conversations/${encodeURIComponent(String(args.conversation_id))}/messages${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(messageListResponse, await res.json()) };