host.schema.ts 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. /**
  2. * host domain zod schemas (names derived from map keys).
  3. */
  4. import { z } from 'zod'
  5. import type { DirectoryEntry } from './host.ts'
  6. import type { RequestPayload, ResponseValue } from './rpc-map.ts'
  7. import type { Wire } from './rpc.schema.ts'
  8. import { imageMediaTypeSchema } from './sessions.schema.ts'
  9. /** host.describe request payload (empty object literal). */
  10. export const hostDescribeRequestSchema = z.object({}) satisfies z.ZodType<Wire<RequestPayload<'host.describe'>>>
  11. /** host.describe response value. */
  12. export const hostDescribeValueSchema = z.object({
  13. version: z.string(),
  14. cwd: z.string(),
  15. provider: z.string().optional(),
  16. model: z.string().optional(),
  17. imageLimits: z.object({
  18. maxImageBytes: z.number().int().positive(),
  19. maxImagePixels: z.number().int().positive(),
  20. mediaTypes: z.array(imageMediaTypeSchema),
  21. }).optional(),
  22. attachedSessions: z.number().int().nonnegative(),
  23. }) satisfies z.ZodType<Wire<ResponseValue<'host.describe'>>>
  24. /** host.pickDirectory request payload (empty object literal). */
  25. export const hostPickDirectoryRequestSchema = z.object({}) satisfies z.ZodType<Wire<RequestPayload<'host.pickDirectory'>>>
  26. /** host.pickDirectory response value; null means the user cancelled. */
  27. export const hostPickDirectoryValueSchema = z.object({
  28. path: z.string().nullable(),
  29. }) satisfies z.ZodType<Wire<ResponseValue<'host.pickDirectory'>>>
  30. /** Directory row shared by listing entries and breadcrumb crumbs. */
  31. export const directoryEntrySchema = z.object({
  32. name: z.string(),
  33. path: z.string(),
  34. hidden: z.boolean(),
  35. }) satisfies z.ZodType<Wire<DirectoryEntry>>
  36. /** host.listDirectory request payload; an absent path lists the home directory. */
  37. export const hostListDirectoryRequestSchema = z.object({
  38. path: z.string().optional(),
  39. }) satisfies z.ZodType<Wire<RequestPayload<'host.listDirectory'>>>
  40. /** host.listDirectory response value. */
  41. export const hostListDirectoryValueSchema = z.object({
  42. path: z.string(),
  43. home: z.string(),
  44. crumbs: z.array(directoryEntrySchema),
  45. entries: z.array(directoryEntrySchema),
  46. truncated: z.boolean(),
  47. }) satisfies z.ZodType<Wire<ResponseValue<'host.listDirectory'>>>
  48. /** host.createDirectory request payload: name must be one plain path segment. */
  49. export const hostCreateDirectoryRequestSchema = z.object({
  50. path: z.string(),
  51. name: z.string(),
  52. }).refine(
  53. payload => payload.name.trim() !== '' && payload.name !== '.' && payload.name !== '..'
  54. && !/[/\\]/.test(payload.name),
  55. { message: 'host.createDirectory requires a single non-blank path segment name' },
  56. ) satisfies z.ZodType<Wire<RequestPayload<'host.createDirectory'>>>
  57. /** host.createDirectory response value: the created directory's absolute path. */
  58. export const hostCreateDirectoryValueSchema = z.object({
  59. path: z.string(),
  60. }) satisfies z.ZodType<Wire<ResponseValue<'host.createDirectory'>>>
  61. /** host.openPath request payload. */
  62. export const hostOpenPathRequestSchema = z.object({
  63. path: z.string().min(1),
  64. }) satisfies z.ZodType<Wire<RequestPayload<'host.openPath'>>>
  65. /** host.openPath response value. */
  66. export const hostOpenPathValueSchema = z.object({
  67. opened: z.literal(true),
  68. }) satisfies z.ZodType<Wire<ResponseValue<'host.openPath'>>>