{"version":3,"sources":["../../src/contracts/page-stream.ts"],"sourcesContent":["import { z } from 'zod';\nimport { IsoDateTimeSchema, JsonObjectSchema } from './common';\nimport { DECLARATIVE_CONTROL_API_PREFIX } from './declarative-control-http';\n\n/** Draft: no shared exports until server/client fixed-route support is integrated. */\nexport const PAGE_STREAM_MAX_FRAME_BYTES = 256 * 1024;\nexport const PAGE_STREAM_MAX_BUFFER_BYTES = 2 * 1024 * 1024;\nexport const PAGE_STREAM_MAX_BUFFER_EVENTS = 2048;\nexport const PAGE_STREAM_MAX_CURSOR_LENGTH = 2048;\nexport const PAGE_STREAM_MAX_INPUT_BYTES = 8192;\nexport const PAGE_STREAM_MAX_EVENT_ITEMS = 256;\nconst StreamIdSchema = z.string().min(1).max(256).regex(/^[^\\u0000-\\u001f\\u007f]+$/);\nconst CursorSchema = z.string().min(1).max(PAGE_STREAM_MAX_CURSOR_LENGTH).regex(/^[^\\u0000-\\u001f\\u007f]+$/);\nconst SequenceSchema = z.number().int().min(1).max(Number.MAX_SAFE_INTEGER);\n\n/** Opaque handle, never authorization. Server binds principal/team/release/page/binding/scope\n * and reauthorizes each connect/control. Neither URLs nor caller-authored scope are accepted. */\nexport const PageStreamDescriptorSchema = z.object({\n  contract: z.literal('PageStreamDescriptor'), schemaVersion: z.literal(1),\n  streamId: StreamIdSchema, expiresAt: IsoDateTimeSchema,\n  channel: z.enum(['terminal', 'events']), cursor: CursorSchema.optional(),\n}).strict();\nexport const PageStreamConnectSchema = z.object({ cursor: CursorSchema.optional() }).strict();\nconst base = {\n  contract: z.literal('PageStreamEvent'), schemaVersion: z.literal(1),\n  streamId: StreamIdSchema, sequence: SequenceSchema, cursor: CursorSchema,\n};\n/** First accepted frame must be snapshot. Exact duplicates compare cursor+payload;\n * conflicting duplicates/gaps reconnect using only last verified cursor. Transport rejects\n * oversized SSE frames before parsing and bounds retained bytes/events to constants above. */\nexport const PageStreamEventSchema = z.discriminatedUnion('type', [\n  z.object({ ...base, type: z.literal('snapshot'), payload: z.object({ model: JsonObjectSchema }).strict() }).strict(),\n  z.object({ ...base, type: z.literal('delta'), payload: z.object({ events: z.array(JsonObjectSchema).max(PAGE_STREAM_MAX_EVENT_ITEMS) }).strict() }).strict(),\n  z.object({ ...base, type: z.literal('end'), payload: z.object({}).strict() }).strict(),\n  z.object({ ...base, type: z.literal('error'), payload: z.object({ code: z.string().min(1).max(128), retryable: z.boolean() }).strict() }).strict(),\n]).superRefine((value, context) => {\n  if (new TextEncoder().encode(JSON.stringify(value)).byteLength > PAGE_STREAM_MAX_FRAME_BYTES)\n    context.addIssue({ code: 'custom', message: 'Page stream frame exceeds the UTF-8 byte limit.' });\n});\n/** Reuse requestId on retries. Server deduplicates before PTY mutation; credentials never\n * travel in payload. stream.disconnect closes this descriptor lease, not the backing workload. */\nexport const PageStreamControlSchema = z.discriminatedUnion('port', [\n  z.object({ requestId: z.string().uuid(), port: z.literal('terminal.input'), payload: z.object({ data: z.string().min(1).max(PAGE_STREAM_MAX_INPUT_BYTES) }).strict() }).strict(),\n  z.object({ requestId: z.string().uuid(), port: z.literal('terminal.resize'), payload: z.object({ columns: z.number().int().min(1).max(1000), rows: z.number().int().min(1).max(1000) }).strict() }).strict(),\n  z.object({ requestId: z.string().uuid(), port: z.literal('stream.disconnect'), payload: z.object({}).strict() }).strict(),\n]).superRefine((value, context) => {\n  if (value.port === 'terminal.input' && new TextEncoder().encode(value.payload.data).byteLength > PAGE_STREAM_MAX_INPUT_BYTES)\n    context.addIssue({ code: 'custom', path: ['payload', 'data'], message: 'Terminal input exceeds the UTF-8 byte limit.' });\n});\nconst route = (releaseSlotId: string, bindingId: string, streamId: string) => {\n  StreamIdSchema.parse(streamId);\n  if (streamId === '.' || streamId === '..') throw new TypeError('Invalid stream route identifier');\n  for (const segment of [releaseSlotId, bindingId]) if (!segment || segment.length > 256 || /[\\u0000-\\u001f\\u007f]/.test(segment) || segment === '.' || segment === '..') throw new TypeError('Invalid stream route identifier');\n  return `${DECLARATIVE_CONTROL_API_PREFIX}/runtime/pages/${encodeURIComponent(releaseSlotId)}/bindings/${encodeURIComponent(bindingId)}/streams/${encodeURIComponent(streamId)}`;\n};\nexport const pageStreamRoutes = {\n  events: (releaseSlotId: string, bindingId: string, streamId: string) => `${route(releaseSlotId, bindingId, streamId)}/events`,\n  terminal: (releaseSlotId: string, bindingId: string, streamId: string) => `${route(releaseSlotId, bindingId, streamId)}/terminal`,\n  control: (releaseSlotId: string, bindingId: string, streamId: string) => `${route(releaseSlotId, bindingId, streamId)}/control`,\n} as const;\nexport const PageStreamControlResultSchema = z.object({ requestId: z.string().uuid(), accepted: z.literal(true) }).strict();\nexport type PageStreamControlResult = z.infer<typeof PageStreamControlResultSchema>;\nexport type PageStreamDescriptor = z.infer<typeof PageStreamDescriptorSchema>;\nexport type PageStreamEvent = z.infer<typeof PageStreamEventSchema>;\nexport type PageStreamControl = z.infer<typeof PageStreamControlSchema>;\n"],"mappings":"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","names":[]}