import { z } from "zod/v4"; export const appPermissionValues = [ "app.home.read", "files.read", "files.write", "index.write", "notifications.read_own", "notifications.write", "profile.read", "tasks.read", "tasks.write", ] as const; export const appPermissionSchema = z.enum(appPermissionValues); export type AppPermission = z.infer; export const appHomeRenderModeValues = ["cached", "live", "hybrid"] as const; export const appHomeRenderModeSchema = z.enum(appHomeRenderModeValues); export type AppHomeRenderMode = z.infer; export const appHostingSchema = z.object({ mode: z.literal("external"), baseUrl: z.url(), }); export type AppHostingConfig = z.infer; export const colineAppManifestSchema = z.object({ key: z.string().trim().min(3).max(120), name: z.string().trim().min(1).max(120), description: z.string().trim().min(1).max(500).optional(), iconUrl: z.url().optional(), permissions: z.array(appPermissionSchema).default([]), hosting: appHostingSchema, }); export type ColineAppManifest = z.infer; export const colineFileTypeSchema = z.object({ typeKey: z.string().trim().min(3).max(160), name: z.string().trim().min(1).max(120), description: z.string().trim().min(1).max(500).optional(), storage: z.enum(["coline_document"]), indexable: z.boolean().default(true), homeRenderMode: appHomeRenderModeSchema.default("cached"), }); export type ColineFileTypeDefinitionInput = z.input; export type ColineFileTypeDefinition = z.infer; export const colineAppRegistrationPayloadSchema = z.object({ version: z.string().trim().min(1).max(64), manifest: colineAppManifestSchema, fileTypes: z.array(colineFileTypeSchema).default([]), }); export type ColineAppRegistrationPayload = z.infer< typeof colineAppRegistrationPayloadSchema >;