import { z } from 'zod' export const sharingIdSchema = z.string().trim().min(1).max(200) export const sharingSettingsInputSchema = z.object({ serverUrl: z.url().refine(value => { if (!URL.canParse(value)) return false const url = new URL(value) return ['http:', 'https:'].includes(url.protocol) && !url.username && !url.password && !url.search && !url.hash }, 'Use an HTTP(S) service URL without credentials, query or fragment'), name: z.string().trim().min(1).max(200) }).strict() export const sharingSettingsSchema = sharingSettingsInputSchema.extend({ deviceId: sharingIdSchema }) export const sharingDeviceSchema = z.object({ id: sharingIdSchema, name: z.string(), platform: z.string(), appVersion: z.string(), registeredAt: z.string(), updatedAt: z.string() }) export const sharingPublicationDraftSchema = z.object({ name: z.string().trim().min(1).max(200), kind: z.enum(['capability', 'knowledge']), description: z.string().trim().max(4000), sourceMode: z.enum(['device', 'server']), permissions: z.object({ search: z.boolean(), read: z.boolean(), download: z.boolean() }).strict() }).strict() export const sharingPublicationSchema = sharingPublicationDraftSchema.extend({ id: sharingIdSchema, deviceId: sharingIdSchema, status: z.enum(['published', 'revoked']), createdAt: z.string(), updatedAt: z.string() }) export type SharingSettings = z.infer export type SharingSettingsInput = z.infer export type SharingDevice = z.infer export type SharingPublicationDraft = z.infer export type SharingPublication = z.infer export type SharingCatalog = { devices: SharingDevice[]; publications: SharingPublication[] } export type DeviceSharingApi = { getSettings: () => Promise saveSettings: (input: SharingSettingsInput) => Promise registerDevice: () => Promise getCatalog: () => Promise publish: (input: SharingPublicationDraft) => Promise revoke: (id: string) => Promise }