host.schema.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. /** host.describe request payload (empty object literal). */
  9. export const hostDescribeRequestSchema = z.object({}) satisfies z.ZodType<Wire<RequestPayload<'host.describe'>>>
  10. /** host.describe response value. */
  11. export const hostDescribeValueSchema = z.object({
  12. version: z.string(),
  13. cwd: z.string(),
  14. provider: z.string().optional(),
  15. model: z.string().optional(),
  16. attachedSessions: z.number().int().nonnegative(),
  17. // Open string, not a literal union: unknown kinds must survive the wire so
  18. // a merge-added capability can advertise (the client hides the affordance).
  19. }) satisfies z.ZodType<Wire<ResponseValue<'host.describe'>>>
  20. /** host.pickDirectory request payload (empty object literal). */
  21. export const hostPickDirectoryRequestSchema = z.object({}) satisfies z.ZodType<Wire<RequestPayload<'host.pickDirectory'>>>
  22. /** host.pickDirectory response value; null means the user cancelled. */
  23. export const hostPickDirectoryValueSchema = z.object({
  24. path: z.string().nullable(),
  25. }) satisfies z.ZodType<Wire<ResponseValue<'host.pickDirectory'>>>
  26. /** Directory row shared by listing entries and breadcrumb crumbs. */
  27. export const directoryEntrySchema = z.object({
  28. name: z.string(),
  29. path: z.string(),
  30. hidden: z.boolean(),
  31. }) satisfies z.ZodType<Wire<DirectoryEntry>>
  32. /** host.listDirectory request payload; an absent path lists the home directory. */
  33. export const hostListDirectoryRequestSchema = z.object({
  34. path: z.string().optional(),
  35. }) satisfies z.ZodType<Wire<RequestPayload<'host.listDirectory'>>>
  36. /** host.listDirectory response value. */
  37. export const hostListDirectoryValueSchema = z.object({
  38. path: z.string(),
  39. home: z.string(),
  40. crumbs: z.array(directoryEntrySchema),
  41. entries: z.array(directoryEntrySchema),
  42. truncated: z.boolean(),
  43. }) satisfies z.ZodType<Wire<ResponseValue<'host.listDirectory'>>>
  44. /** host.createDirectory request payload: name must be one plain path segment. */
  45. export const hostCreateDirectoryRequestSchema = z.object({
  46. path: z.string(),
  47. name: z.string(),
  48. }).refine(
  49. payload => payload.name.trim() !== '' && payload.name !== '.' && payload.name !== '..'
  50. && !/[/\\]/.test(payload.name),
  51. { message: 'host.createDirectory requires a single non-blank path segment name' },
  52. ) satisfies z.ZodType<Wire<RequestPayload<'host.createDirectory'>>>
  53. /** host.createDirectory response value: the created directory's absolute path. */
  54. export const hostCreateDirectoryValueSchema = z.object({
  55. path: z.string(),
  56. }) satisfies z.ZodType<Wire<ResponseValue<'host.createDirectory'>>>
  57. /** host.openPath request payload. */
  58. export const hostOpenPathRequestSchema = z.object({
  59. path: z.string().min(1),
  60. }) satisfies z.ZodType<Wire<RequestPayload<'host.openPath'>>>
  61. /** host.openPath response value. */
  62. export const hostOpenPathValueSchema = z.object({
  63. opened: z.literal(true),
  64. }) satisfies z.ZodType<Wire<ResponseValue<'host.openPath'>>>