overmux 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/dist/bin.js +339 -7
- package/dist/bin.js.map +1 -1
- package/dist/docs/200-getting-started/100-install-and-run-overmux.md +1 -2
- package/dist/docs/300-fundamentals/100-project-structure.md +20 -0
- package/dist/docs/400-reference/300-client-api.md +17 -0
- package/dist/docs/400-reference/400-cli/050-init.md +17 -0
- package/dist/exports/client.d.ts +18 -1
- package/dist/exports/client.d.ts.map +1 -1
- package/dist/exports/client.js +24 -2
- package/dist/exports/client.js.map +1 -1
- package/docs/200-getting-started/100-install-and-run-overmux.md +1 -2
- package/docs/300-fundamentals/100-project-structure.md +20 -0
- package/docs/400-reference/300-client-api.md +17 -0
- package/docs/400-reference/400-cli/050-init.md +17 -0
- package/package.json +2 -2
- package/src/internal/cli/app.ts +5 -1
- package/src/internal/cli/commands/init-template.ts +146 -0
- package/src/internal/cli/commands/init.ts +267 -0
- package/src/internal/cli/commands/integration.ts +15 -0
- package/src/internal/cli/commands/zellij-install.ts +96 -0
- package/src/internal/client/clipboard.ts +22 -0
- package/src/internal/client/host/desktop-host.ts +12 -0
- package/src/internal/client/host/notification-forwarding.ts +1 -10
- package/src/internal/client/websocket.ts +17 -9
- package/src/public/client.ts +4 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":["keyBindingSchema","formatKeyBinding","elementDepth","matchesKeyBinding"],"sources":["../../src/internal/shared/background-notifications.ts","../../src/internal/shared/protocol.ts","../../src/internal/client/background-notifications.ts","../../src/internal/client/client-definition.ts","../../src/internal/client/commands.tsx","../../src/internal/client/overmux-react.ts","../../src/internal/client/theme-scope.tsx","../../src/internal/client/browser-api.ts","../../src/internal/client/host/browser-log-forwarding.ts","../../src/internal/client/host/notification-forwarding.ts","../../src/internal/client/shortcuts.tsx","../../src/internal/client/websocket.ts","../../src/internal/client/transport.ts","../../src/internal/client/host/hosted-pages/hosted-page.tsx","../../src/internal/client/host/hosted-pages/logout-page.tsx","../../src/internal/client/host/hosted-pages/browser-notification-settings.tsx","../../src/internal/client/host/hosted-pages/settings-page.tsx","../../src/internal/client/host/recovery-screen.tsx","../../../lib/dist/index.js","../../src/internal/client/host/update-popover.tsx","../../src/internal/client/host/overmux-host.tsx"],"sourcesContent":["// Validates browser subscription data exchanged by background-notification delivery.\n// Browser-standard key and endpoint details stay behind this internal boundary.\nimport { z } from \"zod\";\n\nconst deliveryKeySchema = z\n .string()\n .min(1)\n .max(1_024)\n .regex(/^[\\w-]+$/u);\n\nexport const backgroundNotificationSubscriptionSchema = z\n .object({\n endpoint: z\n .url()\n .max(4_096)\n .refine((endpoint) => {\n const url = new URL(endpoint);\n return url.protocol === \"https:\" && !url.username && !url.password;\n }),\n expirationTime: z.number().int().nonnegative().nullable(),\n keys: z\n .object({ auth: deliveryKeySchema, p256dh: deliveryKeySchema })\n .strict(),\n })\n .strict();\n\nexport const backgroundNotificationPublicKeyResponseSchema = z\n .object({ publicKey: deliveryKeySchema })\n .strict();\n\nexport const backgroundNotificationDisableRequestSchema = z\n .object({ endpoint: backgroundNotificationSubscriptionSchema.shape.endpoint })\n .strict();\n\nexport type BackgroundNotificationSubscription = z.infer<\n typeof backgroundNotificationSubscriptionSchema\n>;\n","import { z } from \"zod\";\n\nimport { notificationSchema } from \"../../public/notifications\";\n\n// Compatibility gate, not negotiation: open tabs may still run older client assets.\n// The exact version rejects incompatible runtime manifest and wire formats before later traffic.\nexport const protocolVersion = 9 as const;\n\n// Application-defined WebSocket close codes shared by server and browser transports.\nexport const webSocketCloseCode = {\n authenticationRevoked: 4001,\n authenticationUnavailable: 4002,\n} as const;\n\nexport const runtimeManifestSchema = z.object({\n debug: z.boolean(),\n operations: z.array(z.string().min(1)),\n protocolVersion: z.literal(protocolVersion),\n resources: z.array(z.string().min(1)),\n streams: z.array(z.string().min(1)),\n});\n\nexport const updateAvailableEventSchema = z.object({\n type: z.literal(\"update-available\"),\n});\n\nexport const restartingEventSchema = z.object({\n type: z.literal(\"restarting\"),\n});\n\nexport const serverLifecycleEventSchema = z.discriminatedUnion(\"type\", [\n updateAvailableEventSchema,\n restartingEventSchema,\n]);\n\nexport const notificationEventSchema = z\n .object({\n notification: notificationSchema,\n type: z.literal(\"notification\"),\n })\n .strict();\n\nconst operationIdSchema = z.string().min(1).max(256);\nconst registrationNameSchema = z.string().min(1).max(256);\n\nexport const resourceReadMessageSchema = z.object({\n input: z.unknown().optional(),\n operationId: operationIdSchema,\n resourceName: registrationNameSchema,\n type: z.literal(\"resource-read\"),\n});\n\nexport const resourceSubscribeMessageSchema = z.object({\n input: z.unknown().optional(),\n operationId: operationIdSchema,\n resourceName: registrationNameSchema,\n subscriptionId: operationIdSchema,\n type: z.literal(\"resource-subscribe\"),\n});\n\nexport const resourceUnsubscribeMessageSchema = z.object({\n subscriptionId: operationIdSchema,\n type: z.literal(\"resource-unsubscribe\"),\n});\n\nexport const streamOpenMessageSchema = z.object({\n input: z.unknown().optional(),\n operationId: operationIdSchema,\n streamId: operationIdSchema,\n streamName: registrationNameSchema,\n type: z.literal(\"stream-open\"),\n});\n\nexport const streamMessageSchema = z.object({\n message: z.unknown(),\n streamId: operationIdSchema,\n type: z.literal(\"stream-message\"),\n});\n\nexport const streamCloseMessageSchema = z.object({\n streamId: operationIdSchema,\n type: z.literal(\"stream-close\"),\n});\n\nexport const clientDiagnosticEventSchema = z.object({\n arguments: z.string().max(16_100),\n level: z.enum([\"log\", \"info\", \"warn\", \"error\", \"debug\"]),\n message: z.string().max(4_100),\n stack: z.string().max(8_100).optional(),\n timestamp: z.iso.datetime(),\n type: z.literal(\"client-diagnostic\"),\n url: z.string().max(2_100).optional(),\n});\n\nexport const clientProtocolMessageSchema = z.discriminatedUnion(\"type\", [\n resourceReadMessageSchema,\n resourceSubscribeMessageSchema,\n resourceUnsubscribeMessageSchema,\n streamOpenMessageSchema,\n streamMessageSchema,\n streamCloseMessageSchema,\n clientDiagnosticEventSchema,\n]);\n\nexport const resourceResultMessageSchema = z.object({\n operationId: operationIdSchema,\n output: z.unknown(),\n type: z.literal(\"resource-result\"),\n});\n\nexport const resourceInvalidatedMessageSchema = z.object({\n subscriptionId: operationIdSchema,\n type: z.literal(\"resource-invalidated\"),\n});\n\nexport const streamOpenedMessageSchema = z.object({\n operationId: operationIdSchema,\n streamId: operationIdSchema,\n type: z.literal(\"stream-opened\"),\n});\n\nexport const streamOutputMessageSchema = z.object({\n message: z.unknown(),\n streamId: operationIdSchema,\n type: z.literal(\"stream-output\"),\n});\n\nexport const streamClosedMessageSchema = z.object({\n streamId: operationIdSchema,\n type: z.literal(\"stream-closed\"),\n});\n\nexport const protocolErrorMessageSchema = z.object({\n code: z.enum([\"bad-request\", \"conflict\", \"internal\", \"not-found\"]),\n message: z.string(),\n operationId: operationIdSchema.optional(),\n streamId: operationIdSchema.optional(),\n subscriptionId: operationIdSchema.optional(),\n type: z.literal(\"error\"),\n});\n\nexport const serverProtocolMessageSchema = z.discriminatedUnion(\"type\", [\n resourceResultMessageSchema,\n resourceInvalidatedMessageSchema,\n streamOpenedMessageSchema,\n streamOutputMessageSchema,\n streamClosedMessageSchema,\n protocolErrorMessageSchema,\n updateAvailableEventSchema,\n restartingEventSchema,\n notificationEventSchema,\n]);\n\nconst byteMarker = \"$overmuxBytes\";\n\ntype EncodedBytes = { [byteMarker]: number[] };\n\nconst encodeValue = (value: unknown): unknown => {\n if (value instanceof Uint8Array) {\n return { [byteMarker]: Array.from(value) } satisfies EncodedBytes;\n }\n if (Array.isArray(value)) {\n return value.map(encodeValue);\n }\n if (typeof value === \"object\" && value !== null) {\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [key, encodeValue(item)]),\n );\n }\n return value;\n};\n\nconst decodeValue = (value: unknown): unknown => {\n if (Array.isArray(value)) {\n return value.map(decodeValue);\n }\n if (typeof value !== \"object\" || value === null) {\n return value;\n }\n const record = value as Record<string, unknown>;\n if (\n Object.keys(record).length === 1 &&\n Array.isArray(record[byteMarker]) &&\n record[byteMarker].every(\n (item) => Number.isInteger(item) && item >= 0 && item <= 255,\n )\n ) {\n return Uint8Array.from(record[byteMarker] as number[]);\n }\n return Object.fromEntries(\n Object.entries(record).map(([key, item]) => [key, decodeValue(item)]),\n );\n};\n\nconst binaryMarker = \"$overmuxBinary\";\nconst binaryMagic = 0x4f4d5801;\n\ntype EncodedBinary = { [binaryMarker]: [number, number] };\n\nconst encodeBinaryValue = (\n value: unknown,\n payloads: Uint8Array[],\n offset: { value: number },\n): unknown => {\n if (value instanceof Uint8Array) {\n const marker = {\n [binaryMarker]: [offset.value, value.byteLength],\n } satisfies EncodedBinary;\n payloads.push(value);\n offset.value += value.byteLength;\n return marker;\n }\n if (Array.isArray(value)) {\n return value.map((item) => encodeBinaryValue(item, payloads, offset));\n }\n if (typeof value === \"object\" && value !== null) {\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [\n key,\n encodeBinaryValue(item, payloads, offset),\n ]),\n );\n }\n return value;\n};\n\nconst decodeBinaryValue = (value: unknown, payload: Uint8Array): unknown => {\n if (Array.isArray(value)) {\n return value.map((item) => decodeBinaryValue(item, payload));\n }\n if (typeof value !== \"object\" || value === null) {\n return value;\n }\n const record = value as Record<string, unknown>;\n const marker = record[binaryMarker];\n if (\n Object.keys(record).length === 1 &&\n Array.isArray(marker) &&\n marker.length === 2 &&\n marker.every((item) => Number.isInteger(item) && item >= 0)\n ) {\n const [offset, length] = marker as [number, number];\n if (offset + length > payload.byteLength) {\n throw new Error(\"Invalid Overmux binary payload range\");\n }\n return payload.slice(offset, offset + length);\n }\n return Object.fromEntries(\n Object.entries(record).map(([key, item]) => [\n key,\n decodeBinaryValue(item, payload),\n ]),\n );\n};\n\nexport const encodeProtocolMessage = (message: unknown): string =>\n JSON.stringify(encodeValue(message));\n\nexport const decodeProtocolMessage = (message: string): unknown =>\n decodeValue(JSON.parse(message));\n\nexport const encodeProtocolFrame = (message: unknown): string | Uint8Array => {\n const payloads: Uint8Array[] = [];\n const encoded = encodeBinaryValue(message, payloads, { value: 0 });\n if (!payloads.length) {\n return JSON.stringify(encoded);\n }\n const header = new TextEncoder().encode(JSON.stringify(encoded));\n const payloadLength = payloads.reduce(\n (total, payload) => total + payload.byteLength,\n 0,\n );\n const frame = new Uint8Array(8 + header.byteLength + payloadLength);\n const view = new DataView(frame.buffer);\n view.setUint32(0, binaryMagic);\n view.setUint32(4, header.byteLength);\n frame.set(header, 8);\n let offset = 8 + header.byteLength;\n payloads.forEach((payload) => {\n frame.set(payload, offset);\n offset += payload.byteLength;\n });\n return frame;\n};\n\nexport const decodeProtocolFrame = (\n frame: string | ArrayBuffer | Uint8Array,\n): unknown => {\n if (typeof frame === \"string\") {\n return decodeProtocolMessage(frame);\n }\n const bytes =\n frame instanceof Uint8Array\n ? frame\n : new Uint8Array(frame, 0, frame.byteLength);\n if (bytes.byteLength < 8) {\n throw new Error(\"Invalid Overmux binary frame\");\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n if (view.getUint32(0) !== binaryMagic) {\n throw new Error(\"Invalid Overmux binary frame magic\");\n }\n const headerLength = view.getUint32(4);\n if (8 + headerLength > bytes.byteLength) {\n throw new Error(\"Invalid Overmux binary frame header\");\n }\n const header = JSON.parse(\n new TextDecoder().decode(bytes.subarray(8, 8 + headerLength)),\n ) as unknown;\n return decodeBinaryValue(header, bytes.subarray(8 + headerLength));\n};\n\nexport type RuntimeManifest = z.infer<typeof runtimeManifestSchema>;\nexport type ClientDiagnosticEvent = z.infer<typeof clientDiagnosticEventSchema>;\nexport type ClientProtocolMessage = z.infer<typeof clientProtocolMessageSchema>;\nexport type ServerLifecycleEvent = z.infer<typeof serverLifecycleEventSchema>;\nexport type ServerProtocolMessage = z.infer<typeof serverProtocolMessageSchema>;\n","// Provides the browser API and controls for background notifications.\n// Browser PushManager details remain inside this delivery boundary.\nimport {\n backgroundNotificationPublicKeyResponseSchema,\n backgroundNotificationSubscriptionSchema,\n} from \"../shared/index\";\n\nconst enabledStorageKey = \"overmux.backgroundNotificationsEnabled\";\n\nexport type BackgroundNotificationStatus =\n | \"checking\"\n | \"denied\"\n | \"disabled\"\n | \"enabled\"\n | \"error\"\n | \"ios-home-screen\"\n | \"unsupported\";\n\nconst isIos = () =>\n /iPad|iPhone|iPod/u.test(navigator.userAgent) ||\n (navigator.platform === \"MacIntel\" && navigator.maxTouchPoints > 1);\nconst isStandalone = () =>\n window.matchMedia(\"(display-mode: standalone)\").matches ||\n Boolean((navigator as Navigator & { standalone?: boolean }).standalone);\n\nconst supportStatus = (): BackgroundNotificationStatus | undefined => {\n if (window.overmuxHost?.notifications) {\n return \"unsupported\";\n }\n if (isIos() && !isStandalone()) {\n return \"ios-home-screen\";\n }\n if (\n !window.isSecureContext ||\n !(\"Notification\" in window) ||\n !(\"serviceWorker\" in navigator) ||\n !(\"PushManager\" in window)\n ) {\n return \"unsupported\";\n }\n return undefined;\n};\n\nconst decodeApplicationServerKey = (value: string) => {\n const padded = `${value}${\"=\".repeat((4 - (value.length % 4)) % 4)}`;\n return Uint8Array.from(\n atob(padded.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\")),\n (character) => character.charCodeAt(0),\n );\n};\n\nconst encodeApplicationServerKey = (value: ArrayBuffer | null) => {\n if (!value) {\n return undefined;\n }\n const binary = String.fromCharCode(...new Uint8Array(value));\n return btoa(binary)\n .replaceAll(\"+\", \"-\")\n .replaceAll(\"/\", \"_\")\n .replace(/=+$/u, \"\");\n};\n\nconst request = async (path: string, init?: RequestInit) => {\n const response = await fetch(path, { cache: \"no-store\", ...init });\n if (!response.ok) {\n throw new Error(\n `Background notification request failed: ${response.status}`,\n );\n }\n return response;\n};\n\nconst getPublicKey = async () => {\n const response = await request(\"/api/background-notifications/public-key\");\n return backgroundNotificationPublicKeyResponseSchema.parse(\n await response.json(),\n ).publicKey;\n};\n\nconst serializeSubscription = (subscription: PushSubscription) => {\n const json = subscription.toJSON();\n return backgroundNotificationSubscriptionSchema.parse({\n endpoint: subscription.endpoint,\n expirationTime: subscription.expirationTime ?? null,\n keys: json.keys,\n });\n};\n\nconst enableSubscription = async (subscription: PushSubscription) => {\n await request(\"/api/background-notifications/subscription\", {\n body: JSON.stringify(serializeSubscription(subscription)),\n headers: { \"Content-Type\": \"application/json\" },\n method: \"PUT\",\n });\n};\n\nconst disableSubscription = async (subscription: PushSubscription) => {\n await request(\"/api/background-notifications/subscription\", {\n body: JSON.stringify({ endpoint: subscription.endpoint }),\n headers: { \"Content-Type\": \"application/json\" },\n method: \"DELETE\",\n });\n};\n\nconst subscribe = async (\n registration: ServiceWorkerRegistration,\n publicKey: string,\n) =>\n registration.pushManager.subscribe({\n applicationServerKey: decodeApplicationServerKey(publicKey),\n userVisibleOnly: true,\n });\n\nconst canManageSubscription = () =>\n window.isSecureContext &&\n \"serviceWorker\" in navigator &&\n \"PushManager\" in window;\n\nconst removeCurrentSubscription = async () => {\n if (!canManageSubscription()) {\n return;\n }\n const registration = await navigator.serviceWorker.getRegistration();\n const subscription = await registration?.pushManager.getSubscription();\n if (!subscription) {\n return;\n }\n await disableSubscription(subscription);\n if (!(await subscription.unsubscribe())) {\n throw new Error(\"The background subscription could not be removed\");\n }\n};\n\nconst reconcileBackgroundNotifications = async () => {\n const registration = await navigator.serviceWorker.ready;\n const publicKey = await getPublicKey();\n let subscription = await registration.pushManager.getSubscription();\n const subscriptionKey = subscription\n ? encodeApplicationServerKey(subscription.options.applicationServerKey)\n : undefined;\n if (subscription && subscriptionKey !== publicKey) {\n await disableSubscription(subscription);\n if (!(await subscription.unsubscribe())) {\n throw new Error(\"The previous background subscription is still active\");\n }\n subscription = null;\n }\n if (!subscription) {\n subscription = await subscribe(registration, publicKey);\n }\n await enableSubscription(subscription);\n};\n\nexport const enableBackgroundNotifications = async () => {\n if (supportStatus()) {\n localStorage.removeItem(enabledStorageKey);\n return false;\n }\n const permission =\n Notification.permission === \"default\"\n ? await Notification.requestPermission()\n : Notification.permission;\n if (permission !== \"granted\") {\n localStorage.removeItem(enabledStorageKey);\n return false;\n }\n await reconcileBackgroundNotifications();\n localStorage.setItem(enabledStorageKey, \"true\");\n return true;\n};\n\nexport const disableBackgroundNotifications = async () => {\n localStorage.removeItem(enabledStorageKey);\n await removeCurrentSubscription();\n};\n\nexport const reconciledStatus =\n async (): Promise<BackgroundNotificationStatus> => {\n const unavailable = supportStatus();\n if (unavailable) {\n await disableBackgroundNotifications().catch(() => undefined);\n return unavailable;\n }\n if (Notification.permission !== \"granted\") {\n await disableBackgroundNotifications().catch(() => undefined);\n return Notification.permission === \"denied\" ? \"denied\" : \"disabled\";\n }\n if (localStorage.getItem(enabledStorageKey) !== \"true\") {\n await disableBackgroundNotifications();\n return \"disabled\";\n }\n await reconcileBackgroundNotifications();\n return \"enabled\";\n };\n","import type { OvermuxContrast, OvermuxScheme } from \"./theme-scope\";\nimport type { ComponentType } from \"react\";\nimport {\n formatKeyBinding,\n keyBindingSchema,\n matchesKeyBinding,\n type KeyBinding,\n} from \"@overmux/keybindings\";\nexport {\n formatKeyBinding,\n keyBindingSchema,\n matchesKeyBinding,\n} from \"@overmux/keybindings\";\nexport type { KeyBinding } from \"@overmux/keybindings\";\nimport { z } from \"zod\";\n\nimport type { OvermuxServerApi } from \"./browser-api\";\n\nexport type KeySequence = readonly [KeyBinding, KeyBinding, ...KeyBinding[]];\nexport type ShortcutBinding = KeyBinding | KeySequence;\nexport type ConditionalShortcutBinding = {\n binding: ShortcutBinding;\n when: { media: string };\n};\nexport type CommandBinding = ShortcutBinding | ConditionalShortcutBinding;\nexport type ChordPrefix = {\n binding: KeyBinding;\n unmatched: \"replay-to-focused-input\";\n};\n\nexport const shortcutBindingSchema = z.union([\n keyBindingSchema,\n z.array(keyBindingSchema).min(2),\n]);\nexport const commandBindingSchema = z.union([\n shortcutBindingSchema,\n z.object({\n binding: shortcutBindingSchema,\n when: z.object({ media: z.string().trim().min(1) }),\n }),\n]);\nexport const chordPrefixSchema = z.object({\n binding: keyBindingSchema,\n unmatched: z.literal(\"replay-to-focused-input\"),\n});\n\nexport const formatShortcutBinding = (binding: ShortcutBinding) =>\n typeof binding === \"string\"\n ? formatKeyBinding(binding)\n : binding.map(formatKeyBinding).join(\" \");\n\ntype CommandRunResult = Promise<unknown> | unknown;\ntype CommandRun<TServerConfig, TParams> = (input: {\n overmuxServerApi: OvermuxServerApi<TServerConfig>;\n params: TParams;\n}) => CommandRunResult;\ntype CommandDefinitionSource = {\n defaultBindings?: readonly CommandBinding[];\n params?: z.ZodType;\n run?: unknown;\n title: string;\n};\ntype ParamsSchema<TCommand> = TCommand extends {\n params: infer TParams extends z.ZodType;\n}\n ? TParams\n : undefined;\ntype ParamsOutput<TCommand> =\n ParamsSchema<TCommand> extends z.ZodType\n ? z.output<ParamsSchema<TCommand>>\n : undefined;\ntype CheckedCommand<TServerConfig, TCommand extends CommandDefinitionSource> = {\n [TKey in keyof TCommand]: TKey extends \"run\"\n ? CommandRun<TServerConfig, ParamsOutput<TCommand>>\n : TCommand[TKey];\n} & {\n defaultBindings?: readonly CommandBinding[];\n params?: z.ZodType;\n title: string;\n};\ntype CheckedCommands<\n TServerConfig,\n TCommands extends Record<string, CommandDefinitionSource>,\n> = {\n [TId in keyof TCommands]: CheckedCommand<TServerConfig, TCommands[TId]>;\n};\n\nexport type CommandHandle<TId extends string = string> = {\n defaultBindings?: readonly CommandBinding[];\n id: TId;\n params?: z.ZodType;\n run?: unknown;\n title: string;\n};\n\ntype DefinedCommands<\n TServerConfig,\n TCommands extends Record<string, CommandDefinitionSource>,\n> = {\n readonly [TId in keyof TCommands]: CheckedCommand<\n TServerConfig,\n TCommands[TId]\n > & { readonly id: Extract<TId, string> };\n};\n\nconst validateBindings = (bindings: readonly CommandBinding[] | undefined) =>\n bindings?.forEach((binding) => commandBindingSchema.parse(binding));\n\nexport const defineCommandRegistry =\n <TServerConfig>() =>\n <const TCommands extends Record<string, CommandDefinitionSource>>(\n commands: CheckedCommands<TServerConfig, TCommands>,\n ): DefinedCommands<TServerConfig, TCommands> =>\n Object.fromEntries(\n Object.entries(commands).map(([id, command]) => {\n validateBindings(command.defaultBindings);\n return [id, { ...command, id }];\n }),\n ) as DefinedCommands<TServerConfig, TCommands>;\n\nexport type CommandRegistry = Readonly<Record<string, CommandHandle>>;\n\nexport type OvermuxClientAppearance = {\n contrast?: OvermuxContrast;\n scheme?: OvermuxScheme;\n};\n\nexport type ClientAppDefinition<\n TCommands extends CommandRegistry = CommandRegistry,\n> = {\n appearance?: OvermuxClientAppearance;\n chordPrefixes?: readonly ChordPrefix[];\n commands: TCommands;\n component: ComponentType;\n shortcutOverrides?: Partial<\n Record<Extract<keyof TCommands, string>, readonly CommandBinding[]>\n >;\n};\n\nexport const defineOvermuxClient = <const TCommands extends CommandRegistry>(\n definition: ClientAppDefinition<TCommands>,\n): ClientAppDefinition<TCommands> => {\n definition.chordPrefixes?.forEach((prefix) =>\n chordPrefixSchema.parse(prefix),\n );\n Object.values(definition.shortcutOverrides ?? {}).forEach(validateBindings);\n return definition;\n};\n\nexport const isConditionalShortcutBinding = (\n binding: CommandBinding,\n): binding is ConditionalShortcutBinding =>\n typeof binding !== \"string\" && !Array.isArray(binding);\n\nexport const resolveShortcutBinding = (\n binding: CommandBinding,\n): ShortcutBinding =>\n isConditionalShortcutBinding(binding) ? binding.binding : binding;\n\nexport const configuredCommandBindings = (\n definition: ClientAppDefinition,\n command: CommandHandle,\n) =>\n definition.shortcutOverrides?.[command.id] ?? command.defaultBindings ?? [];\n\nexport const activeCommandBindings = (\n bindings: readonly CommandBinding[],\n matchesMedia: (media: string) => boolean,\n) =>\n bindings.flatMap((binding) =>\n !isConditionalShortcutBinding(binding) || matchesMedia(binding.when.media)\n ? [resolveShortcutBinding(binding)]\n : [],\n );\n\nexport const shortcutMediaQueries = (definition: ClientAppDefinition) => [\n ...new Set(\n Object.values(definition.commands).flatMap((command) =>\n configuredCommandBindings(definition, command).flatMap((binding) =>\n isConditionalShortcutBinding(binding) ? [binding.when.media] : [],\n ),\n ),\n ),\n];\n","import type { RuntimeManifest } from \"../shared/index\";\nimport {\n createContext,\n type RefObject,\n useContext,\n useEffect,\n useRef,\n} from \"react\";\nimport { z } from \"zod\";\n\nimport type {\n ClientAppDefinition,\n CommandHandle,\n ShortcutBinding,\n} from \"./client-definition\";\nimport {\n activeCommandBindings,\n configuredCommandBindings,\n} from \"./client-definition\";\nimport type { RuntimeOvermuxServerApi } from \"./browser-api\";\n\ntype CommandRunResult = Promise<unknown> | unknown;\ntype LocalCommandRun = () => CommandRunResult;\ntype ParamsSchema<TCommand> = TCommand extends {\n params: infer TParams extends z.ZodType;\n}\n ? TParams\n : undefined;\ntype RegistrationParams<TCommand> =\n ParamsSchema<TCommand> extends z.ZodType\n ? { params: z.input<ParamsSchema<TCommand>> }\n : { params?: never };\ntype RegistrationRun<TCommand> = TCommand extends {\n run: (...args: never[]) => unknown;\n}\n ? { run?: LocalCommandRun }\n : { run: LocalCommandRun };\ntype CommandRegistration<TCommand> = RegistrationParams<TCommand> &\n RegistrationRun<TCommand> & {\n element?: RefObject<HTMLElement | null>;\n enabled?: boolean;\n };\ntype UseCommandRegistration<TCommand> =\n ParamsSchema<TCommand> extends z.ZodType\n ? CommandRegistration<TCommand> | SkipToken\n : CommandRegistration<TCommand>;\n\nexport const skipToken = Symbol(\"overmux command registration\");\nexport type SkipToken = typeof skipToken;\n\nexport type RegisteredCommand = {\n command: CommandHandle;\n element: () => HTMLElement | null | undefined;\n enabled: () => boolean;\n execute: () => Promise<void>;\n};\n\ntype RuntimeContextValue = {\n manifest: RuntimeManifest;\n overmuxServerApi: RuntimeOvermuxServerApi;\n refreshCommands: () => void;\n registerCommand: (registration: RegisteredCommand) => () => void;\n};\n\nexport const RuntimeContext = createContext<RuntimeContextValue | undefined>(\n undefined,\n);\n\nexport const useRuntime = () => {\n const runtime = useContext(RuntimeContext);\n if (!runtime) {\n throw new Error(\n \"Overmux hooks must be used inside an active Overmux client runtime\",\n );\n }\n return runtime;\n};\n\ntype RuntimeCommandRegistration = {\n element?: RefObject<HTMLElement | null>;\n enabled?: boolean;\n params?: unknown;\n run?: LocalCommandRun;\n};\n\nconst executeRegistration = async (\n command: CommandHandle,\n registration: RuntimeCommandRegistration,\n overmuxServerApi: RuntimeOvermuxServerApi,\n) => {\n const params = command.params\n ? command.params.parse(registration.params)\n : undefined;\n if (registration.run) {\n await registration.run();\n return;\n }\n if (typeof command.run !== \"function\") {\n throw new Error(`Command has no implementation: ${command.id}`);\n }\n await command.run({ overmuxServerApi, params });\n};\n\nexport const createRegisteredCommand = ({\n command,\n getRegistration,\n overmuxServerApi,\n}: {\n command: CommandHandle;\n getRegistration: () => RuntimeCommandRegistration | SkipToken;\n overmuxServerApi: RuntimeOvermuxServerApi;\n}): RegisteredCommand => ({\n command,\n element: () => {\n const registration = getRegistration();\n return registration === skipToken\n ? undefined\n : registration.element?.current;\n },\n enabled: () => {\n const registration = getRegistration();\n return registration === skipToken ? false : (registration.enabled ?? true);\n },\n execute: () => {\n const registration = getRegistration();\n return registration === skipToken\n ? Promise.resolve()\n : executeRegistration(command, registration, overmuxServerApi);\n },\n});\n\nexport const useCommand = <TCommand extends CommandHandle>(\n command: TCommand,\n registration: UseCommandRegistration<TCommand>,\n) => {\n const { overmuxServerApi, refreshCommands, registerCommand } = useRuntime();\n const registrationRef = useRef(registration);\n registrationRef.current = registration;\n const skipped = registration === skipToken;\n useEffect(() => {\n if (skipped) {\n return;\n }\n return registerCommand(\n createRegisteredCommand({\n command,\n getRegistration: () =>\n registrationRef.current as RuntimeCommandRegistration | SkipToken,\n overmuxServerApi,\n }),\n );\n }, [command, overmuxServerApi, registerCommand, skipped]);\n const enabled = skipped ? false : (registration.enabled ?? true);\n const element = skipped ? undefined : registration.element;\n useEffect(refreshCommands, [element, enabled, refreshCommands, skipped]);\n};\n\nconst elementDepth = (element: HTMLElement) => {\n let depth = 0;\n for (\n let current: HTMLElement | null = element;\n current;\n current = current.parentElement\n ) {\n depth += 1;\n }\n return depth;\n};\n\nexport const selectCommandRegistration = (\n command: CommandHandle,\n registrations: ReadonlySet<RegisteredCommand>,\n activeElement: Element | null,\n) => {\n const candidates = [...registrations].filter(\n (registration) => registration.command === command,\n );\n const focused = candidates.filter((registration) => {\n const element = registration.element();\n return Boolean(element && activeElement && element.contains(activeElement));\n });\n return (\n focused.reduce<RegisteredCommand | undefined>((selected, candidate) => {\n const selectedElement = selected?.element();\n const candidateElement = candidate.element();\n if (!selectedElement || !candidateElement) {\n return candidate;\n }\n return elementDepth(candidateElement) >= elementDepth(selectedElement)\n ? candidate\n : selected;\n }, undefined) ?? candidates.at(-1)\n );\n};\n\nconst currentActiveElement = () => document.activeElement;\n\nconst selectedRegistration = (\n command: CommandHandle,\n registrations: ReadonlySet<RegisteredCommand>,\n getActiveElement: () => Element | null = currentActiveElement,\n) => selectCommandRegistration(command, registrations, getActiveElement());\n\nexport const executeCommand = async (\n command: CommandHandle,\n registrations: ReadonlySet<RegisteredCommand>,\n getActiveElement: () => Element | null = currentActiveElement,\n) => {\n const selected = selectedRegistration(\n command,\n registrations,\n getActiveElement,\n );\n if (selected?.enabled()) {\n await selected.execute();\n }\n};\n\nexport type CommandEntry = {\n bindings: readonly ShortcutBinding[];\n disabledReason?: string;\n enabled: boolean;\n execute: () => Promise<void>;\n id: string;\n title: string;\n};\n\nexport const createCommandEntries = (\n definition: ClientAppDefinition,\n registrations: ReadonlySet<RegisteredCommand>,\n getActiveElement: () => Element | null = currentActiveElement,\n matchesMedia: (media: string) => boolean = (media) =>\n typeof window !== \"undefined\" && window.matchMedia(media).matches,\n): CommandEntry[] =>\n Object.values(definition.commands).flatMap((command) => {\n const selected = selectedRegistration(\n command,\n registrations,\n getActiveElement,\n );\n return selected\n ? [\n {\n bindings: activeCommandBindings(\n configuredCommandBindings(definition, command),\n matchesMedia,\n ),\n enabled: selected.enabled(),\n execute: () =>\n executeCommand(command, registrations, getActiveElement),\n id: command.id,\n title: command.title,\n },\n ]\n : [];\n });\n\nexport const CommandsContext = createContext<readonly CommandEntry[]>([]);\n\nexport const useCommands = () => useContext(CommandsContext);\n","import type { ContractInputArguments } from \"../../public/index\";\nimport {\n useMutation,\n useQuery,\n useQueryClient,\n type UseMutationResult,\n} from \"@tanstack/react-query\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { z } from \"zod\";\n\nimport { skipToken, type SkipToken, useRuntime } from \"./commands\";\n\ntype Resources<TConfig> = TConfig extends { resources?: infer TResources }\n ? NonNullable<TResources>\n : never;\ntype Operations<TConfig> = TConfig extends { operations?: infer TOperations }\n ? NonNullable<TOperations>\n : never;\ntype Streams<TConfig> = TConfig extends { streams?: infer TStreams }\n ? NonNullable<TStreams>\n : never;\ntype ContractOf<T> = T extends { contract: infer TContract }\n ? TContract\n : never;\ntype InputOf<T> = T extends { input: infer TInput extends z.ZodType }\n ? TInput\n : never;\ntype OutputOf<T> = T extends { output: infer TOutput extends z.ZodType }\n ? z.output<TOutput>\n : never;\ntype ClientMessageOf<T> =\n ContractOf<T> extends {\n clientMessage: infer TMessage extends z.ZodType;\n }\n ? z.input<TMessage>\n : never;\ntype ServerMessageOf<T> =\n ContractOf<T> extends {\n serverMessage: infer TMessage extends z.ZodType;\n }\n ? z.output<TMessage>\n : never;\ntype InputProperty<TInput extends z.ZodType> =\n undefined extends z.input<TInput>\n ? { input?: Exclude<z.input<TInput>, undefined> }\n : { input: z.input<TInput> };\ntype OperationOptions<TId extends string, TInput extends z.ZodType> = {\n id: TId;\n} & InputProperty<TInput>;\ntype UseResource<TServerConfig> = {\n <TId extends Extract<keyof Resources<TServerConfig>, string>>(\n options: OperationOptions<\n TId,\n InputOf<ContractOf<Resources<TServerConfig>[TId]>>\n >,\n ): ResourceResult<OutputOf<ContractOf<Resources<TServerConfig>[TId]>>>;\n <TId extends Extract<keyof Resources<TServerConfig>, string>>(options: {\n id: TId;\n input: SkipToken;\n }): undefined;\n <TId extends Extract<keyof Resources<TServerConfig>, string>>(options: {\n id: TId;\n input:\n | z.input<InputOf<ContractOf<Resources<TServerConfig>[TId]>>>\n | SkipToken;\n }):\n | ResourceResult<OutputOf<ContractOf<Resources<TServerConfig>[TId]>>>\n | undefined;\n};\n\nexport type ResourceResult<T> =\n | {\n data?: never;\n error?: never;\n refetch: () => void;\n status: \"pending\";\n }\n | {\n data?: T;\n error: Error;\n refetch: () => void;\n status: \"error\";\n }\n | {\n data: T;\n error?: never;\n refetch: () => void;\n status: \"success\";\n };\n\nexport type StreamResult<TClientMessage, TServerMessage> = {\n close: () => void;\n error?: Error;\n send: (message: TClientMessage) => boolean;\n status: \"closed\" | \"open\" | \"opening\";\n subscribe: (listener: (message: TServerMessage) => void) => () => void;\n};\n\ntype OperationResult<TInputSchema extends z.ZodType, TOutput> = Omit<\n UseMutationResult<TOutput, Error, z.input<TInputSchema>>,\n \"mutate\" | \"mutateAsync\"\n> & {\n mutate: (...args: ContractInputArguments<TInputSchema>) => void;\n mutateAsync: (\n ...args: ContractInputArguments<TInputSchema>\n ) => Promise<TOutput>;\n};\n\nconst inputKey = (input: unknown) => JSON.stringify(input) ?? \"\";\n\nconst useCanonicalInput = (input: unknown) => {\n const key = inputKey(input);\n return useMemo(() => (key ? JSON.parse(key) : undefined), [key]);\n};\n\nconst useResourceById = <TOutput>(\n id: string,\n input: unknown,\n skipped: boolean,\n): ResourceResult<TOutput> | undefined => {\n const { manifest, overmuxServerApi } = useRuntime();\n const queryClient = useQueryClient();\n const canonicalInput = useCanonicalInput(input);\n const queryKey = useMemo(\n () => [id, canonicalInput] as const,\n [canonicalInput, id],\n );\n const query = useQuery<TOutput, Error>({\n enabled: !skipped,\n queryFn: () =>\n overmuxServerApi.readResource({\n id,\n input: canonicalInput,\n }) as Promise<TOutput>,\n queryKey,\n });\n useEffect(\n () =>\n !skipped && manifest.resources.includes(id)\n ? overmuxServerApi.subscribeResource({\n id,\n input: canonicalInput,\n onError: () =>\n void queryClient.invalidateQueries({ exact: true, queryKey }),\n onInvalidate: () =>\n void queryClient.invalidateQueries({ exact: true, queryKey }),\n })\n : undefined,\n [\n manifest.resources,\n canonicalInput,\n id,\n overmuxServerApi,\n queryClient,\n queryKey,\n skipped,\n ],\n );\n const refetch = useCallback(() => {\n void queryClient.invalidateQueries({ exact: true, queryKey });\n }, [queryClient, queryKey]);\n if (skipped) {\n return undefined;\n }\n if (query.status === \"pending\") {\n return { refetch, status: \"pending\" };\n }\n if (query.status === \"error\") {\n return query.data === undefined\n ? { error: query.error, refetch, status: \"error\" }\n : { data: query.data, error: query.error, refetch, status: \"error\" };\n }\n return { data: query.data, refetch, status: \"success\" };\n};\n\nconst useOperationById = <TInputSchema extends z.ZodType, TOutput>(\n id: string,\n signal?: AbortSignal,\n): OperationResult<TInputSchema, TOutput> => {\n const { overmuxServerApi } = useRuntime();\n return useMutation<TOutput, Error, z.input<TInputSchema>>({\n mutationFn: (input) =>\n overmuxServerApi.executeOperation(id, input, signal) as Promise<TOutput>,\n }) as OperationResult<TInputSchema, TOutput>;\n};\n\nconst useStreamById = <TClientMessage, TServerMessage>(\n id: string,\n input: unknown,\n): StreamResult<TClientMessage, TServerMessage> => {\n const { manifest, overmuxServerApi } = useRuntime();\n const streamAvailable = manifest.streams.includes(id);\n const [state, setState] = useState<{\n error?: Error;\n status: \"closed\" | \"open\" | \"opening\";\n }>({ status: \"opening\" });\n const listeners = useMemo(\n () => new Set<(message: TServerMessage) => void>(),\n [],\n );\n const canonicalInput = useCanonicalInput(input);\n const streamRef = useRef<\n ReturnType<typeof overmuxServerApi.openStream> | undefined\n >(undefined);\n useEffect(() => {\n streamRef.current?.close();\n streamRef.current = undefined;\n if (!streamAvailable) {\n setState({ status: \"closed\" });\n return;\n }\n setState({ status: \"opening\" });\n const stream = overmuxServerApi.openStream({\n id,\n input: canonicalInput,\n onClose: () => setState({ status: \"closed\" }),\n onError: (error) => setState({ error, status: \"closed\" }),\n onOpen: () => setState({ status: \"open\" }),\n onMessage: (message) =>\n listeners.forEach((listener) => listener(message as TServerMessage)),\n });\n streamRef.current = stream;\n return () => {\n stream.close();\n if (streamRef.current === stream) {\n streamRef.current = undefined;\n }\n };\n }, [canonicalInput, id, listeners, overmuxServerApi, streamAvailable]);\n const close = useCallback(() => {\n streamRef.current?.close();\n streamRef.current = undefined;\n setState({ status: \"closed\" });\n }, []);\n const send = useCallback(\n (message: TClientMessage) => streamRef.current?.send(message) ?? false,\n [],\n );\n const subscribe = useCallback(\n (listener: (message: TServerMessage) => void) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n [listeners],\n );\n return {\n close,\n error: streamAvailable\n ? state.error\n : new Error(`Stream is not available: ${id}`),\n send,\n status: streamAvailable ? state.status : \"closed\",\n subscribe,\n };\n};\n\nexport const createOvermuxHooks = <TServerConfig>() => ({\n useOperation: <TId extends Extract<keyof Operations<TServerConfig>, string>>({\n id,\n signal,\n }: {\n id: TId;\n signal?: AbortSignal;\n }) => {\n type TInputSchema = InputOf<Operations<TServerConfig>[TId]>;\n type TOutput = OutputOf<Operations<TServerConfig>[TId]>;\n return useOperationById<TInputSchema, TOutput>(id, signal);\n },\n useResource: (({ id, input }: { id: string; input?: unknown }) =>\n useResourceById(\n id,\n input,\n input === skipToken,\n )) as UseResource<TServerConfig>,\n useStream: <TId extends Extract<keyof Streams<TServerConfig>, string>>({\n id,\n input,\n }: OperationOptions<TId, InputOf<ContractOf<Streams<TServerConfig>[TId]>>>) =>\n useStreamById<\n ClientMessageOf<Streams<TServerConfig>[TId]>,\n ServerMessageOf<Streams<TServerConfig>[TId]>\n >(id, input),\n});\n","import \"./theme-scope.css\";\n\nimport {\n createContext,\n type CSSProperties,\n type ReactNode,\n useCallback,\n useContext,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport type OvermuxScheme = \"dark\" | \"light\" | \"system\";\nexport type OvermuxContrast = \"auto\" | \"high\" | \"normal\";\n\nexport const overmuxThemeTokens = [\n \"--om-color-accent\",\n \"--om-color-accent-fg\",\n \"--om-color-border\",\n \"--om-color-canvas\",\n \"--om-color-danger\",\n \"--om-color-fg\",\n \"--om-color-muted\",\n \"--om-color-panel\",\n \"--om-color-success\",\n \"--om-color-surface\",\n \"--om-elevation\",\n \"--om-focus-ring\",\n \"--om-font-mono\",\n \"--om-font-sans\",\n \"--om-motion-duration\",\n \"--om-radius\",\n \"--om-spacing\",\n] as const;\n\nexport type OvermuxThemeToken = (typeof overmuxThemeTokens)[number];\n\nexport type OvermuxStyle = CSSProperties &\n Partial<Record<OvermuxThemeToken, number | string>>;\n\nexport type OvermuxExternalPortalContainer = {\n container: HTMLElement;\n scopeAttributesAndVariables: \"caller-owned\";\n};\n\nexport type OvermuxPortalProps = {\n children: ReactNode;\n external?: OvermuxExternalPortalContainer;\n};\n\nexport type OvermuxThemeScopeProps = {\n children: ReactNode;\n className?: string;\n contrast?: OvermuxContrast;\n scheme?: OvermuxScheme;\n style?: OvermuxStyle;\n};\n\nconst PortalRootContext = createContext<HTMLElement | null | undefined>(\n undefined,\n);\n\nexport const useOvermuxPortalContainer = (\n external?: OvermuxExternalPortalContainer,\n) => {\n const scopeRoot = useContext(PortalRootContext);\n if (external) {\n return external.container;\n }\n if (scopeRoot !== undefined) {\n return scopeRoot;\n }\n return typeof document === \"undefined\" ? null : document.body;\n};\n\nexport const OvermuxPortal = ({ children, external }: OvermuxPortalProps) => {\n const container = useOvermuxPortalContainer(external);\n return container ? createPortal(children, container) : null;\n};\n\nexport const OvermuxThemeScope = ({\n children,\n className,\n contrast = \"auto\",\n scheme = \"system\",\n style,\n}: OvermuxThemeScopeProps) => {\n const [portalRoot, setPortalRoot] = useState<HTMLDivElement | null>(null);\n const capturePortalRoot = useCallback((element: HTMLDivElement | null) => {\n setPortalRoot(element);\n }, []);\n\n return (\n <div\n className={className}\n data-om-contrast={contrast}\n data-om-scheme={scheme}\n data-om-scope=\"\"\n style={style}\n >\n <PortalRootContext.Provider value={portalRoot}>\n {children}\n </PortalRootContext.Provider>\n <div data-om-overlay-root=\"\" ref={capturePortalRoot} />\n </div>\n );\n};\n","import type { RuntimeManifest } from \"../shared/index\";\nimport type { ContractInputArguments } from \"../../public/index\";\nimport type { z } from \"zod\";\n\nimport type { ClientTransport } from \"./transport\";\n\ntype Operations<TConfig> = TConfig extends { operations?: infer TOperations }\n ? NonNullable<TOperations>\n : never;\ntype InputOf<T> = T extends { input: infer TInput extends z.ZodType }\n ? TInput\n : never;\ntype OutputOf<T> = T extends { output: infer TOutput extends z.ZodType }\n ? z.output<TOutput>\n : never;\ntype OperationId<TConfig> = Extract<keyof Operations<TConfig>, string>;\ntype OperationInput<TConfig, TId extends OperationId<TConfig>> = InputOf<\n Operations<TConfig>[TId]\n>;\ntype OperationOutput<TConfig, TId extends OperationId<TConfig>> = OutputOf<\n Operations<TConfig>[TId]\n>;\ntype OperationArguments<TInput extends z.ZodType> = [\n ...ContractInputArguments<TInput>,\n signal?: AbortSignal,\n];\n\nexport type OvermuxServerApi<TServerConfig> = {\n executeOperation: <TId extends OperationId<TServerConfig>>(\n id: TId,\n ...args: OperationArguments<OperationInput<TServerConfig, TId>>\n ) => Promise<OperationOutput<TServerConfig, TId>>;\n};\n\nexport type RuntimeOvermuxServerApi = {\n executeOperation: (\n id: string,\n input?: unknown,\n signal?: AbortSignal,\n ) => Promise<unknown>;\n openStream: (input: {\n id: string;\n input?: unknown;\n onClose: () => void;\n onError: (error: Error) => void;\n onMessage: (message: unknown) => void;\n onOpen: () => void;\n }) => { close: () => void; send: (message: unknown) => boolean };\n readResource: (input: { id: string; input?: unknown }) => Promise<unknown>;\n subscribeResource: (input: {\n id: string;\n input?: unknown;\n onError: (error: Error) => void;\n onInvalidate: () => void;\n }) => () => void;\n};\n\nconst availableName = (\n names: readonly string[],\n kind: \"Resource\" | \"Stream\",\n name: string,\n) => {\n if (!names.includes(name)) {\n throw new Error(`${kind} is not available: ${name}`);\n }\n return name;\n};\n\nexport const createOvermuxServerApi = ({\n manifest,\n transport,\n}: {\n manifest: RuntimeManifest;\n transport: ClientTransport;\n}): RuntimeOvermuxServerApi => ({\n executeOperation: (id, input, signal) => {\n if (!manifest.operations.includes(id)) {\n throw new Error(`Operation is not available: ${id}`);\n }\n return transport.invokeOperation({ input, name: id, signal });\n },\n openStream: ({ id, ...input }) =>\n transport.openStream({\n ...input,\n streamName: availableName(manifest.streams, \"Stream\", id),\n }),\n readResource: ({ id, input }) =>\n transport.readResource({\n input,\n resourceName: availableName(manifest.resources, \"Resource\", id),\n }),\n subscribeResource: ({ id, ...input }) =>\n transport.subscribeResource({\n ...input,\n resourceName: availableName(manifest.resources, \"Resource\", id),\n }),\n});\n","import type { ClientDiagnosticEvent } from \"../../shared/index\";\n\nconst maxStringLength = 2_000;\nconst truncate = (value: string, length = maxStringLength) =>\n value.length <= length ? value : `${value.slice(0, length)}…[truncated]`;\n\nconst serializeValue = (\n value: unknown,\n seen: WeakSet<object>,\n depth = 0,\n): unknown => {\n if (typeof value === \"string\") {\n return truncate(value);\n }\n if (\n value === null ||\n typeof value === \"boolean\" ||\n typeof value === \"number\"\n ) {\n return value;\n }\n if (typeof value === \"bigint\") {\n return `${value}n`;\n }\n if (typeof value === \"undefined\" || typeof value === \"symbol\") {\n return String(value);\n }\n if (typeof value === \"function\") {\n return `[Function ${value.name || \"anonymous\"}]`;\n }\n if (depth >= 4) {\n return \"[Max depth]\";\n }\n if (typeof value !== \"object\") {\n return truncate(String(value));\n }\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n if (value instanceof Error) {\n return {\n message: truncate(value.message),\n name: value.name,\n ...(value.stack ? { stack: truncate(value.stack, 8_000) } : {}),\n };\n }\n if (Array.isArray(value)) {\n return value\n .slice(0, 25)\n .map((item) => serializeValue(item, seen, depth + 1));\n }\n try {\n return Object.fromEntries(\n Object.entries(value)\n .slice(0, 25)\n .map(([key, item]) => [key, serializeValue(item, seen, depth + 1)]),\n );\n } catch {\n return `[Unserializable ${Object.prototype.toString.call(value)}]`;\n }\n};\n\nexport const serializeBrowserLogArguments = (values: unknown[]) => {\n const seen = new WeakSet<object>();\n const serialized = values.map((value) => serializeValue(value, seen));\n const json = JSON.stringify(serialized);\n return truncate(json, 16_000);\n};\n\nconst diagnosticUrl = () => {\n try {\n return `${location.origin}${location.pathname}`;\n } catch {\n return undefined;\n }\n};\n\nconst stackOf = (values: unknown[]) => {\n const error = values.find((value) => value instanceof Error);\n return error instanceof Error && error.stack\n ? truncate(error.stack, 8_000)\n : undefined;\n};\n\nexport const installBrowserLogForwarding = (\n report: (event: ClientDiagnosticEvent) => void,\n) => {\n const methods = [\"log\", \"info\", \"warn\", \"error\", \"debug\"] as const;\n const originals = Object.fromEntries(\n methods.map((level) => [level, console[level].bind(console)]),\n ) as Record<(typeof methods)[number], (...values: unknown[]) => void>;\n let reporting = false;\n const emit = (\n level: ClientDiagnosticEvent[\"level\"],\n values: unknown[],\n stack?: string,\n ) => {\n if (reporting) {\n return;\n }\n reporting = true;\n try {\n const serializedArguments = serializeBrowserLogArguments(values);\n report({\n arguments: serializedArguments,\n level,\n message: truncate(\n values\n .map((value) =>\n typeof value === \"string\" ? value : serializedArguments,\n )\n .join(\" \"),\n 4_000,\n ),\n ...(stack ? { stack: truncate(stack, 8_000) } : {}),\n timestamp: new Date().toISOString(),\n type: \"client-diagnostic\",\n ...(diagnosticUrl() ? { url: diagnosticUrl() } : {}),\n });\n } finally {\n reporting = false;\n }\n };\n methods.forEach((level) => {\n console[level] = (...values: unknown[]) => {\n originals[level](...values);\n emit(level, values, stackOf(values));\n };\n });\n const onError = (event: ErrorEvent) =>\n emit(\"error\", [event.message], event.error?.stack);\n const onRejection = (event: PromiseRejectionEvent) =>\n emit(\n \"error\",\n [\"Unhandled rejection\", event.reason],\n stackOf([event.reason]),\n );\n window.addEventListener(\"error\", onError);\n window.addEventListener(\"unhandledrejection\", onRejection);\n\n return () => {\n methods.forEach((level) => {\n console[level] = originals[level];\n });\n window.removeEventListener(\"error\", onError);\n window.removeEventListener(\"unhandledrejection\", onRejection);\n };\n};\n","import { notificationEventSchema } from \"../../shared/index\";\n\nimport type { WebSocketTransport } from \"../transport\";\n\n// Forwards server notifications to the optional desktop host injected at window.overmuxHost.\ntype NotificationHost = {\n notifications?: { show: (notification: unknown) => void; version: 1 };\n};\n\ndeclare global {\n interface Window {\n overmuxHost?: NotificationHost;\n }\n}\n\nexport const installNotificationForwarding = (transport: WebSocketTransport) =>\n transport.subscribeNotification((event) => {\n const notification = notificationEventSchema.safeParse(event);\n if (notification.success) {\n window.overmuxHost?.notifications?.show(notification.data);\n }\n });\n","import {\n type ReactNode,\n createContext,\n useCallback,\n useContext,\n useEffect,\n useState,\n type RefObject,\n} from \"react\";\nimport {\n matchesKeyBinding,\n platformBinding,\n type KeyBinding,\n} from \"@overmux/keybindings\";\n\nimport {\n activeCommandBindings,\n configuredCommandBindings,\n shortcutMediaQueries,\n type ClientAppDefinition,\n type CommandHandle,\n type ShortcutBinding,\n} from \"./client-definition\";\nimport {\n CommandsContext,\n createCommandEntries,\n executeCommand,\n selectCommandRegistration,\n type RegisteredCommand,\n} from \"./commands\";\n\nconst bindingSequence = (binding: ShortcutBinding): KeyBinding[] =>\n typeof binding === \"string\" ? [binding] : [...binding];\n\nconst normalizedBinding = (binding: ShortcutBinding): string[] =>\n bindingSequence(binding).map((key) => platformBinding(key));\n\nconst sequenceMatches = (\n binding: ShortcutBinding,\n pending: string[],\n event: KeyboardEvent,\n) => {\n const sequence = normalizedBinding(binding);\n return (\n sequence.length > pending.length &&\n pending.every((key, index) => sequence[index] === key) &&\n matchesKeyBinding(sequence[pending.length] as KeyBinding, event)\n );\n};\n\nconst isTextInput = (element: Element | null) =>\n element instanceof HTMLInputElement ||\n element instanceof HTMLSelectElement ||\n element instanceof HTMLTextAreaElement ||\n (element instanceof HTMLElement &&\n (element.isContentEditable || element.getAttribute(\"role\") === \"textbox\"));\n\nconst acceptsTextInput = (bindings: readonly ShortcutBinding[]) => {\n if (!(document.activeElement instanceof Element)) {\n return false;\n }\n const terminal = document.activeElement.closest(\".xterm\");\n if (!terminal) {\n return false;\n }\n if (terminal.closest(\"[data-copy-mode]\")) {\n return true;\n }\n return bindings.some((binding) => {\n const sequence = bindingSequence(binding);\n return (\n sequence.length > 1 ||\n sequence[0]?.startsWith(\"F\") ||\n sequence[0]?.includes(\"+\")\n );\n });\n};\n\ntype Shortcut = {\n bindings: readonly [ShortcutBinding, ...ShortcutBinding[]];\n command: CommandHandle;\n};\n\nconst flattenShortcuts = (\n definition: ClientAppDefinition,\n matchesMedia: (media: string) => boolean,\n): Shortcut[] =>\n Object.values(definition.commands).flatMap((command) => {\n const bindings = activeCommandBindings(\n configuredCommandBindings(definition, command),\n matchesMedia,\n );\n return bindings.length\n ? [\n {\n bindings: bindings as [ShortcutBinding, ...ShortcutBinding[]],\n command,\n },\n ]\n : [];\n });\n\nconst canRunShortcut = (\n shortcut: Shortcut,\n event: KeyboardEvent,\n registrations: ReadonlySet<RegisteredCommand>,\n) => {\n const selected = selectCommandRegistration(\n shortcut.command,\n registrations,\n document.activeElement,\n );\n return Boolean(\n selected?.enabled() &&\n !event.repeat &&\n !(\n isTextInput(document.activeElement) &&\n !acceptsTextInput(shortcut.bindings)\n ),\n );\n};\n\nconst runShortcut = (\n shortcut: Shortcut,\n event: KeyboardEvent,\n registrations: ReadonlySet<RegisteredCommand>,\n) => {\n if (!canRunShortcut(shortcut, event, registrations)) {\n return false;\n }\n void executeCommand(shortcut.command, registrations);\n event.preventDefault();\n return true;\n};\n\nexport type ShortcutInputTarget = {\n container: RefObject<HTMLElement | null>;\n input: RefObject<HTMLElement | null>;\n};\ntype RegisterShortcutInputTarget = (target: ShortcutInputTarget) => () => void;\n\nconst ShortcutInputTargetsContext = createContext<\n RegisterShortcutInputTarget | undefined\n>(undefined);\n\nexport const useShortcutInputTarget = (target: ShortcutInputTarget) => {\n const register = useContext(ShortcutInputTargetsContext);\n const { container, input } = target;\n useEffect(\n () => register?.({ container, input }),\n [container, input, register],\n );\n};\n\nconst elementDepth = (element: HTMLElement) => {\n let depth = 0;\n for (\n let current: HTMLElement | null = element;\n current;\n current = current.parentElement\n ) {\n depth += 1;\n }\n return depth;\n};\n\nconst selectShortcutInputTarget = (\n targets: ReadonlySet<ShortcutInputTarget>,\n activeElement: Element | null,\n) =>\n [...targets]\n .filter((target) => {\n const container = target.container.current;\n return Boolean(\n container && activeElement && container.contains(activeElement),\n );\n })\n .reduce<ShortcutInputTarget | undefined>((selected, candidate) => {\n const selectedElement = selected?.container.current;\n const candidateElement = candidate.container.current;\n if (!selectedElement || !candidateElement) {\n return candidate;\n }\n return elementDepth(candidateElement) >= elementDepth(selectedElement)\n ? candidate\n : selected;\n }, undefined);\n\nconst replayedKeyboardEvents = new WeakSet<KeyboardEvent>();\nconst keyboardEventProperties = [\"charCode\", \"keyCode\", \"which\"] as const;\n\nconst replayKeyboardEvent = (target: HTMLElement, source: KeyboardEvent) => {\n const replay = new KeyboardEvent(source.type, {\n altKey: source.altKey,\n bubbles: true,\n cancelable: true,\n code: source.code,\n composed: true,\n ctrlKey: source.ctrlKey,\n key: source.key,\n location: source.location,\n metaKey: source.metaKey,\n repeat: source.repeat,\n shiftKey: source.shiftKey,\n });\n keyboardEventProperties.forEach((property) =>\n Object.defineProperty(replay, property, { value: source[property] }),\n );\n replayedKeyboardEvents.add(replay);\n target.dispatchEvent(replay);\n};\n\nconst replayChord = (\n target: ShortcutInputTarget | undefined,\n events: readonly KeyboardEvent[],\n) => {\n const input = target?.input.current;\n if (!input) {\n return;\n }\n events.forEach((event) => replayKeyboardEvent(input, event));\n};\n\nexport const ShortcutHost = ({\n children,\n definition,\n registrations,\n registrationRevision,\n}: {\n children: ReactNode;\n definition: ClientAppDefinition;\n registrations: Set<RegisteredCommand>;\n registrationRevision: number;\n}) => {\n const [, setFocusRevision] = useState(0);\n const [inputTargets] = useState(() => new Set<ShortcutInputTarget>());\n const [mediaRevision, setMediaRevision] = useState(0);\n const registerInputTarget = useCallback(\n (target: ShortcutInputTarget) => {\n inputTargets.add(target);\n return () => {\n inputTargets.delete(target);\n };\n },\n [inputTargets],\n );\n useEffect(() => {\n const refreshMedia = () => setMediaRevision((revision) => revision + 1);\n const queries = shortcutMediaQueries(definition).map((media) =>\n window.matchMedia(media),\n );\n queries.forEach((query) => query.addEventListener(\"change\", refreshMedia));\n return () =>\n queries.forEach((query) =>\n query.removeEventListener(\"change\", refreshMedia),\n );\n }, [definition]);\n useEffect(() => {\n const refreshFocus = () => setFocusRevision((revision) => revision + 1);\n window.addEventListener(\"focusin\", refreshFocus);\n return () => window.removeEventListener(\"focusin\", refreshFocus);\n }, []);\n useEffect(() => {\n const shortcuts = flattenShortcuts(\n definition,\n (media) => window.matchMedia(media).matches,\n );\n let pending: string[] = [];\n let pendingEvents: KeyboardEvent[] = [];\n let pendingTarget: ShortcutInputTarget | undefined;\n let timeout: number | undefined;\n const clearPending = () => {\n pending = [];\n pendingEvents = [];\n pendingTarget = undefined;\n if (timeout !== undefined) {\n window.clearTimeout(timeout);\n timeout = undefined;\n }\n };\n const replayPending = (events = pendingEvents) => {\n replayChord(pendingTarget, events);\n clearPending();\n };\n const scheduleTimeout = () => {\n if (timeout !== undefined) {\n window.clearTimeout(timeout);\n }\n timeout = window.setTimeout(() => replayPending(), 1_000);\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (replayedKeyboardEvents.has(event)) {\n return;\n }\n if (pending.length && event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n clearPending();\n return;\n }\n const matches = shortcuts.flatMap((shortcut) =>\n shortcut.bindings\n .filter(\n (binding) =>\n sequenceMatches(binding, pending, event) &&\n canRunShortcut(shortcut, event, registrations),\n )\n .map((binding) => ({ binding, shortcut })),\n );\n if (!matches.length) {\n if (pending.length) {\n event.preventDefault();\n event.stopPropagation();\n replayPending([...pendingEvents, event]);\n }\n return;\n }\n const complete = matches.find(\n ({ binding }) =>\n normalizedBinding(binding).length === pending.length + 1,\n );\n if (complete) {\n clearPending();\n if (runShortcut(complete.shortcut, event, registrations)) {\n event.stopPropagation();\n }\n return;\n }\n if (!pending.length) {\n const shouldReplay = definition.chordPrefixes?.some((prefix) =>\n matchesKeyBinding(prefix.binding, event),\n );\n pendingTarget = shouldReplay\n ? selectShortcutInputTarget(inputTargets, document.activeElement)\n : undefined;\n }\n pending = [\n ...pending,\n normalizedBinding(matches[0]!.binding)[pending.length]!,\n ];\n pendingEvents = [...pendingEvents, event];\n event.preventDefault();\n event.stopPropagation();\n scheduleTimeout();\n };\n window.addEventListener(\"keydown\", onKeyDown, { capture: true });\n return () => {\n window.removeEventListener(\"keydown\", onKeyDown, { capture: true });\n if (timeout !== undefined) {\n window.clearTimeout(timeout);\n }\n };\n }, [\n definition,\n inputTargets,\n mediaRevision,\n registrationRevision,\n registrations,\n ]);\n const commands = createCommandEntries(\n definition,\n registrations,\n () => document.activeElement,\n (media) => window.matchMedia(media).matches,\n );\n return (\n <ShortcutInputTargetsContext.Provider value={registerInputTarget}>\n <CommandsContext.Provider value={commands}>\n {children}\n </CommandsContext.Provider>\n </ShortcutInputTargetsContext.Provider>\n );\n};\n","import {\n clientProtocolMessageSchema,\n decodeProtocolFrame,\n encodeProtocolMessage,\n serverProtocolMessageSchema,\n streamMessageSchema,\n webSocketCloseCode,\n type ClientDiagnosticEvent,\n type ClientProtocolMessage,\n type ServerLifecycleEvent,\n} from \"../shared/index\";\n\ntype Request = {\n reject: (error: Error) => void;\n resolve: (output: unknown) => void;\n};\ntype Subscription = {\n input: unknown;\n onError: (error: Error) => void;\n onInvalidate: () => void;\n resourceName: string;\n};\ntype StreamMessage = Extract<ClientProtocolMessage, { type: \"stream-message\" }>;\n\ntype Stream = {\n input: unknown;\n onOpen: () => void;\n onClose: () => void;\n onError: (error: Error) => void;\n onMessage: (message: unknown) => void;\n pendingMessages: StreamMessage[];\n status: \"disconnected\" | \"failed\" | \"open\" | \"opening\";\n streamName: string;\n};\n\nconst maxWebSocketBufferedBytes = 1_048_576;\n\nexport type TransportStatus =\n | \"authentication-required\"\n | \"connecting\"\n | \"connected\"\n | \"disconnected\";\n\nexport type WebSocketTransport = {\n activate: () => void;\n dispose: () => void;\n openStream: (input: {\n input?: unknown;\n onClose: () => void;\n onError: (error: Error) => void;\n onOpen: () => void;\n onMessage: (message: unknown) => void;\n streamName: string;\n }) => { close: () => void; send: (message: unknown) => boolean };\n readResource: (input: {\n input?: unknown;\n resourceName: string;\n }) => Promise<unknown>;\n reportDiagnostic: (event: ClientDiagnosticEvent) => void;\n subscribeResource: (input: {\n input?: unknown;\n onError: (error: Error) => void;\n onInvalidate: () => void;\n resourceName: string;\n }) => () => void;\n subscribeStatus: (listener: (status: TransportStatus) => void) => () => void;\n subscribeLifecycle: (\n listener: (event: ServerLifecycleEvent) => void,\n ) => () => void;\n subscribeNotification: (listener: (event: unknown) => void) => () => void;\n};\n\nconst socketUrl = () =>\n `${location.protocol === \"https:\" ? \"wss:\" : \"ws:\"}//${location.host}/api/socket`;\n\nconst operationId = () => {\n const randomUUID = crypto.randomUUID?.();\n if (randomUUID) {\n return randomUUID;\n }\n const bytes = crypto.getRandomValues(new Uint8Array(16));\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = Array.from(bytes, (byte) =>\n byte.toString(16).padStart(2, \"0\"),\n ).join(\"\");\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n};\nconst disconnected = () => new Error(\"Overmux transport disconnected.\");\n\nexport const createWebSocketTransport = ({\n createSocket = () => new WebSocket(socketUrl()),\n}: {\n createSocket?: () => WebSocket;\n} = {}): WebSocketTransport => {\n let active = false;\n let disposed = false;\n let reconnectDelay = 250;\n let reconnectTimer: ReturnType<typeof setTimeout> | undefined;\n let socket: WebSocket | undefined;\n let status: TransportStatus = \"disconnected\";\n const diagnosticQueue: ClientDiagnosticEvent[] = [];\n const requests = new Map<string, Request>();\n const subscriptions = new Map<string, Subscription>();\n const streams = new Map<string, Stream>();\n const lifecycleListeners = new Set<(event: ServerLifecycleEvent) => void>();\n const notificationListeners = new Set<(event: unknown) => void>();\n const statusListeners = new Set<(status: TransportStatus) => void>();\n\n const setStatus = (next: TransportStatus) => {\n if (status === next) {\n return;\n }\n status = next;\n statusListeners.forEach((listener) => listener(status));\n };\n const send = (message: unknown) => {\n if (socket?.readyState !== WebSocket.OPEN) {\n return false;\n }\n // Apply outbound backpressure before queued messages consume unbounded memory.\n if (socket.bufferedAmount > maxWebSocketBufferedBytes) {\n socket.close(1013, \"client could not keep up\");\n return false;\n }\n socket.send(\n encodeProtocolMessage(clientProtocolMessageSchema.parse(message)),\n );\n return true;\n };\n const flushDiagnostics = () => {\n const unsent = diagnosticQueue.filter((event) => !send(event));\n diagnosticQueue.splice(0, diagnosticQueue.length, ...unsent);\n };\n const request = ({\n input,\n resourceName,\n }: {\n input?: unknown;\n resourceName: string;\n }) =>\n new Promise<unknown>((resolve, reject) => {\n const id = operationId();\n requests.set(id, { reject, resolve });\n const message = {\n input,\n operationId: id,\n resourceName,\n type: \"resource-read\",\n };\n if (!send(message)) {\n requests.delete(id);\n reject(disconnected());\n }\n });\n const restore = () => {\n subscriptions.forEach(\n ({ input, onInvalidate, resourceName }, subscriptionId) => {\n if (\n send({\n input,\n operationId: subscriptionId,\n resourceName,\n subscriptionId,\n type: \"resource-subscribe\",\n })\n ) {\n onInvalidate();\n }\n },\n );\n streams.forEach((stream, streamId) => {\n if (stream.status === \"failed\") {\n return;\n }\n stream.status = send({\n input: stream.input,\n operationId: streamId,\n streamId,\n streamName: stream.streamName,\n type: \"stream-open\",\n })\n ? \"opening\"\n : \"disconnected\";\n });\n };\n const rejectRequests = (error: Error) => {\n requests.forEach(({ reject }) => reject(error));\n requests.clear();\n };\n const reportDisconnect = () => {\n const error = disconnected();\n rejectRequests(error);\n subscriptions.forEach(({ onError }) => onError(error));\n streams.forEach((stream) => {\n stream.pendingMessages.length = 0;\n if (stream.status !== \"failed\") {\n stream.status = \"disconnected\";\n }\n stream.onError(error);\n });\n };\n const connect = () => {\n if (!active || disposed || socket) {\n return;\n }\n setStatus(\"connecting\");\n const next = createSocket();\n next.binaryType = \"arraybuffer\";\n socket = next;\n next.addEventListener(\"open\", () => {\n if (socket !== next) {\n return;\n }\n reconnectDelay = 250;\n setStatus(\"connected\");\n flushDiagnostics();\n restore();\n });\n next.addEventListener(\"message\", (event) => {\n if (socket !== next) {\n return;\n }\n let decoded: unknown;\n try {\n decoded = decodeProtocolFrame(event.data as string | ArrayBuffer);\n } catch (cause) {\n reportDisconnect();\n console.error(\"Invalid Overmux transport message\", cause);\n next.close(1002, \"invalid protocol message\");\n return;\n }\n const parsed = serverProtocolMessageSchema.safeParse(decoded);\n if (!parsed.success) {\n reportDisconnect();\n console.error(\"Invalid Overmux transport message\", parsed.error);\n next.close(1002, \"invalid protocol message\");\n return;\n }\n const message = parsed.data;\n if (\n message.type === \"update-available\" ||\n message.type === \"restarting\"\n ) {\n lifecycleListeners.forEach((listener) => listener(message));\n }\n if (message.type === \"notification\") {\n notificationListeners.forEach((listener) => listener(message));\n }\n if (message.type === \"resource-invalidated\") {\n subscriptions.get(message.subscriptionId)?.onInvalidate();\n }\n if (message.type === \"stream-opened\") {\n const stream = streams.get(message.streamId);\n if (stream?.status === \"opening\") {\n stream.status = \"open\";\n const pendingMessages = stream.pendingMessages.splice(0);\n if (pendingMessages.every(send)) {\n stream.onOpen();\n }\n }\n }\n if (message.type === \"stream-output\") {\n streams.get(message.streamId)?.onMessage(message.message);\n }\n if (message.type === \"stream-closed\") {\n const stream = streams.get(message.streamId);\n if (stream) {\n stream.pendingMessages.length = 0;\n stream.onClose();\n streams.delete(message.streamId);\n }\n }\n if (message.type === \"error\") {\n if (message.operationId) {\n requests.get(message.operationId)?.reject(new Error(message.message));\n }\n const stream = streams.get(message.operationId ?? \"\");\n if (stream) {\n stream.pendingMessages.length = 0;\n stream.status = \"failed\";\n stream.onError(new Error(message.message));\n }\n subscriptions\n .get(message.operationId ?? \"\")\n ?.onError(new Error(message.message));\n requests.delete(message.operationId ?? \"\");\n }\n if (message.type === \"resource-result\") {\n requests.get(message.operationId)?.resolve(message.output);\n requests.delete(message.operationId);\n }\n });\n next.addEventListener(\"close\", (event) => {\n if (socket !== next || disposed) {\n return;\n }\n socket = undefined;\n reportDisconnect();\n if (event.code === webSocketCloseCode.authenticationRevoked) {\n active = false;\n setStatus(\"authentication-required\");\n return;\n }\n setStatus(\"disconnected\");\n reconnectTimer = setTimeout(() => {\n reconnectTimer = undefined;\n connect();\n }, reconnectDelay);\n reconnectDelay = Math.min(reconnectDelay * 2, 5_000);\n });\n };\n\n return {\n activate: () => {\n active = true;\n connect();\n },\n dispose: () => {\n disposed = true;\n if (reconnectTimer !== undefined) {\n clearTimeout(reconnectTimer);\n }\n reportDisconnect();\n streams.forEach(({ onClose }) => onClose());\n streams.clear();\n subscriptions.clear();\n socket?.close();\n },\n openStream: ({\n input,\n onClose,\n onError,\n onMessage,\n onOpen,\n streamName,\n }) => {\n const streamId = operationId();\n const stream: Stream = {\n input,\n onClose,\n onError,\n onMessage,\n onOpen,\n pendingMessages: [],\n status: \"disconnected\",\n streamName,\n };\n streams.set(streamId, stream);\n stream.status = send({\n input,\n operationId: streamId,\n streamId,\n streamName,\n type: \"stream-open\",\n })\n ? \"opening\"\n : \"disconnected\";\n if (stream.status === \"disconnected\") {\n onError(disconnected());\n }\n return {\n close: () => {\n const activeStream = streams.get(streamId);\n if (activeStream) {\n activeStream.pendingMessages.length = 0;\n activeStream.onClose();\n streams.delete(streamId);\n }\n send({ streamId, type: \"stream-close\" });\n },\n send: (message) => {\n const activeStream = streams.get(streamId);\n if (\n activeStream?.status !== \"open\" &&\n activeStream?.status !== \"opening\"\n ) {\n return false;\n }\n const protocolMessage = streamMessageSchema.parse({\n message,\n streamId,\n type: \"stream-message\",\n });\n if (activeStream.status === \"opening\") {\n activeStream.pendingMessages.push(protocolMessage);\n return true;\n }\n return send(protocolMessage);\n },\n };\n },\n readResource: (input) => request(input),\n reportDiagnostic: (event) => {\n if (send(event)) {\n return;\n }\n diagnosticQueue.push(event);\n if (diagnosticQueue.length > 100) {\n diagnosticQueue.shift();\n }\n },\n subscribeResource: ({ input, onError, onInvalidate, resourceName }) => {\n const subscriptionId = operationId();\n subscriptions.set(subscriptionId, {\n input,\n onError,\n onInvalidate,\n resourceName,\n });\n if (\n !send({\n input,\n operationId: subscriptionId,\n resourceName,\n subscriptionId,\n type: \"resource-subscribe\",\n })\n ) {\n onError(disconnected());\n }\n return () => {\n subscriptions.delete(subscriptionId);\n send({ subscriptionId, type: \"resource-unsubscribe\" });\n };\n },\n subscribeStatus: (listener) => {\n statusListeners.add(listener);\n listener(status);\n return () => statusListeners.delete(listener);\n },\n subscribeLifecycle: (listener) => {\n lifecycleListeners.add(listener);\n return () => lifecycleListeners.delete(listener);\n },\n subscribeNotification: (listener) => {\n notificationListeners.add(listener);\n return () => notificationListeners.delete(listener);\n },\n };\n};\n","import { createContext, useContext } from \"react\";\n\nimport {\n createWebSocketTransport,\n type WebSocketTransport,\n type TransportStatus,\n} from \"./websocket\";\n\nexport type ClientTransport = WebSocketTransport & {\n invokeOperation: (input: {\n input?: unknown;\n name: string;\n signal?: AbortSignal;\n }) => Promise<unknown>;\n};\n\nexport const TransportContext = createContext<ClientTransport | undefined>(\n undefined,\n);\n\nexport const useTransport = () => {\n const transport = useContext(TransportContext);\n if (!transport) {\n throw new Error(\n \"Overmux transport hooks must be used inside an active Overmux client runtime\",\n );\n }\n return transport;\n};\n\nconst operationError = async (response: Response) => {\n const body = await response.text();\n try {\n const error = (JSON.parse(body) as { error?: unknown }).error;\n if (typeof error === \"string\") {\n return new Error(error);\n }\n } catch {}\n return new Error(\n `Operation request failed: ${response.status} ${response.statusText}`,\n );\n};\n\nexport const createClientTransport = ({\n createSocket,\n fetch: fetchRequest = globalThis.fetch,\n}: {\n createSocket?: () => WebSocket;\n fetch?: typeof globalThis.fetch;\n} = {}): ClientTransport => ({\n ...createWebSocketTransport({ createSocket }),\n invokeOperation: async ({ input, name, signal }) => {\n const response = await fetchRequest(\n `/api/operations/${encodeURIComponent(name)}`,\n {\n body: input === undefined ? undefined : JSON.stringify(input),\n headers: { \"content-type\": \"application/json\" },\n method: \"POST\",\n signal,\n },\n );\n if (!response.ok) {\n throw await operationError(response);\n }\n return response.status === 204 ? undefined : response.json();\n },\n});\n\nexport type { WebSocketTransport, TransportStatus };\n","import \"./hosted-page.css\";\n\nimport type { ReactNode } from \"react\";\n\nexport const HostedPage = ({ children }: { children: ReactNode }) => (\n <main data-om-hosted-page=\"\">\n <article data-om-hosted-panel=\"\">{children}</article>\n </main>\n);\n","import { useEffect, useState } from \"react\";\n\nimport { HostedPage } from \"./hosted-page\";\n\nconst logoutRequests = new WeakMap<Document, Promise<void>>();\nconst minimumLogoutDuration = 3_000;\n\nconst requestLogout = () => {\n const existing = logoutRequests.get(document);\n if (existing) {\n return existing;\n }\n const request = fetch(\"/api/auth/logout\", { method: \"POST\" }).then(\n (response) => {\n if (!response.ok) {\n throw new Error(`Logout failed: ${response.status}`);\n }\n },\n );\n logoutRequests.set(document, request);\n return request;\n};\n\nconst minimumDelay = () =>\n new Promise<void>((resolve) => setTimeout(resolve, minimumLogoutDuration));\n\nexport const HostedLogoutPage = () => {\n const [attempt, setAttempt] = useState(0);\n const [error, setError] = useState(false);\n\n useEffect(() => {\n let active = true;\n setError(false);\n void Promise.allSettled([requestLogout(), minimumDelay()]).then(\n ([logout]) => {\n if (!active) {\n return;\n }\n if (logout?.status === \"fulfilled\") {\n location.replace(\"/login\");\n return;\n }\n setError(true);\n },\n );\n return () => {\n active = false;\n };\n }, [attempt]);\n\n return (\n <HostedPage>\n <h1>{error ? \"Log out failed\" : \"Logging out…\"}</h1>\n {error ? (\n <>\n <p role=\"alert\">\n Overmux could not log you out. Check your connection and try again.\n </p>\n <button\n data-om-hosted-retry=\"\"\n onClick={() => {\n logoutRequests.delete(document);\n setAttempt((current) => current + 1);\n }}\n type=\"button\"\n >\n Retry\n </button>\n </>\n ) : (\n <p>Please wait while Overmux ends your session.</p>\n )}\n </HostedPage>\n );\n};\n","import { useCallback, useEffect, useState } from \"react\";\n\nimport {\n disableBackgroundNotifications,\n enableBackgroundNotifications,\n reconciledStatus,\n type BackgroundNotificationStatus,\n} from \"../../background-notifications\";\n\nconst statusMessage = (status: BackgroundNotificationStatus) => {\n const messages: Record<BackgroundNotificationStatus, string> = {\n checking: \"Checking background notification status…\",\n denied:\n \"Background notifications are blocked in this browser's site settings.\",\n disabled: \"Background notifications are disabled for this browser.\",\n enabled: \"Background notifications are enabled for this browser.\",\n error: \"Background notification settings could not be updated. Try again.\",\n \"ios-home-screen\":\n \"On iPhone or iPad, add Overmux to the Home Screen before enabling background notifications.\",\n unsupported: \"Background notifications are not supported in this browser.\",\n };\n return messages[status];\n};\n\nexport const BrowserNotificationSettings = () => {\n const [status, setStatus] =\n useState<BackgroundNotificationStatus>(\"checking\");\n\n useEffect(() => {\n let active = true;\n const reconcile = () => {\n void reconciledStatus()\n .then((next) => {\n if (active) {\n setStatus(next);\n }\n })\n .catch(() => {\n if (active) {\n setStatus(\"error\");\n }\n });\n };\n const onVisibilityChange = () => {\n if (document.visibilityState === \"visible\") {\n reconcile();\n }\n };\n reconcile();\n document.addEventListener(\"visibilitychange\", onVisibilityChange);\n navigator.serviceWorker?.addEventListener(\"controllerchange\", reconcile);\n return () => {\n active = false;\n document.removeEventListener(\"visibilitychange\", onVisibilityChange);\n navigator.serviceWorker?.removeEventListener(\n \"controllerchange\",\n reconcile,\n );\n };\n }, []);\n\n const enable = useCallback(async () => {\n try {\n setStatus(\"checking\");\n const enabled = await enableBackgroundNotifications();\n setStatus(\n enabled\n ? \"enabled\"\n : Notification.permission === \"denied\"\n ? \"denied\"\n : \"disabled\",\n );\n } catch {\n setStatus(\"error\");\n }\n }, []);\n\n const disable = useCallback(async () => {\n try {\n setStatus(\"checking\");\n await disableBackgroundNotifications();\n setStatus(\"disabled\");\n } catch {\n setStatus(\"error\");\n }\n }, []);\n\n const canEnable = status === \"disabled\" || status === \"error\";\n const canDisable = status === \"enabled\" || status === \"error\";\n return (\n <div data-om-browser-notifications=\"\">\n <h3>Browser notifications</h3>\n <p aria-live=\"polite\" data-om-background-notifications-status=\"\">\n {statusMessage(status)}\n </p>\n <div data-om-hosted-actions=\"\">\n {canEnable ? (\n <button\n data-om-background-notifications-enable=\"\"\n onClick={enable}\n type=\"button\"\n >\n Enable\n </button>\n ) : null}\n {canDisable ? (\n <button\n data-om-background-notifications-disable=\"\"\n onClick={disable}\n type=\"button\"\n >\n Disable\n </button>\n ) : null}\n </div>\n </div>\n );\n};\n","import { overmuxLogoutPath, resolveOvermuxReturnTo } from \"@overmux/shared\";\nimport { BrowserNotificationSettings } from \"./browser-notification-settings\";\nimport { HostedPage } from \"./hosted-page\";\n\nconst DesktopNotificationSettings = () => (\n <div data-om-desktop-notifications=\"\">\n <h3>Desktop notifications</h3>\n <p>\n Notifications are delivered through the Overmux desktop app and managed by\n the OS. Change notification permissions and preferences in your operating\n system's settings.\n </p>\n </div>\n);\n\nexport const HostedSettingsPage = () => {\n const returnTo = resolveOvermuxReturnTo(\n new URLSearchParams(location.search).get(\"returnTo\"),\n );\n const desktopNotifications = Boolean(window.overmuxHost?.notifications);\n\n return (\n <HostedPage>\n <header data-om-hosted-header=\"\">\n <h1>Overmux settings</h1>\n <a href={returnTo}>Back to Overmux</a>\n </header>\n <section data-om-hosted-section=\"\">\n <h2>Notifications</h2>\n {desktopNotifications ? (\n <DesktopNotificationSettings />\n ) : (\n <BrowserNotificationSettings />\n )}\n </section>\n <section data-om-hosted-section=\"\">\n <h2>Session</h2>\n <p>End this Overmux session on this device.</p>\n <a data-om-hosted-button=\"\" href={overmuxLogoutPath}>\n Log out\n </a>\n </section>\n </HostedPage>\n );\n};\n","import \"./recovery-screen.css\";\n\nexport const RecoveryScreen = ({ error }: { error?: string }) => (\n <main data-om-recovery=\"\">\n <section data-om-recovery-panel=\"\">\n <h1 data-om-recovery-title=\"\">Overmux recovery</h1>\n {error ? <pre data-om-recovery-error=\"\">{error}</pre> : null}\n <button\n data-om-recovery-reload=\"\"\n onClick={() => location.reload()}\n type=\"button\"\n >\n Reload\n </button>\n </section>\n </main>\n);\n","//#region src/delay.ts\nconst delay = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds));\n//#endregion\n//#region src/duration.ts\nconst durationPattern = /^([1-9]\\d*)(ms|s|m|h|d)$/;\nconst millisecondsByUnit = {\n\td: 1440 * 60 * 1e3,\n\th: 3600 * 1e3,\n\tm: 60 * 1e3,\n\tms: 1,\n\ts: 1e3\n};\nconst durationToMilliseconds = (duration) => {\n\tconst match = durationPattern.exec(duration);\n\tif (!match) return;\n\tconst unit = match[2];\n\tconst milliseconds = Number(match[1]) * millisecondsByUnit[unit];\n\treturn Number.isSafeInteger(milliseconds) ? milliseconds : void 0;\n};\n//#endregion\nexport { delay, durationToMilliseconds };\n\n//# sourceMappingURL=index.js.map","// Presents update availability and coordinates browser-side restart recovery.\n// Every browser follows the server broadcast and reloads only after health returns.\n\nimport \"./update-popover.css\";\n\nimport { delay } from \"@overmux/lib\";\nimport { useCallback, useEffect, useReducer, useRef, useState } from \"react\";\n\nimport type { ServerLifecycleEvent } from \"../../shared/index\";\nimport type { ClientTransport, TransportStatus } from \"../transport\";\n\ntype UpdateState =\n | { type: \"current\" }\n | { type: \"available\"; error?: string }\n | { type: \"requesting\" }\n | { type: \"restarting\" };\ntype UpdateAction =\n | ServerLifecycleEvent\n | { type: \"restart-requested\" }\n | { type: \"restart-failed\"; error: string };\ntype ConnectionState = \"initial\" | \"connected\" | \"reconnecting\";\n\nconst reduceUpdateState = (\n _state: UpdateState,\n action: UpdateAction,\n): UpdateState => {\n if (action.type === \"update-available\") {\n return { type: \"available\" };\n }\n if (action.type === \"restart-requested\") {\n return { type: \"requesting\" };\n }\n if (action.type === \"restart-failed\") {\n return { type: \"available\", error: action.error };\n }\n return { type: \"restarting\" };\n};\n\nconst pollUntilHealthy = async (signal: AbortSignal): Promise<void> => {\n if (signal.aborted) {\n return;\n }\n try {\n const response = await fetch(\"/api/health\", {\n cache: \"no-store\",\n signal,\n });\n if (response.ok) {\n location.reload();\n return;\n }\n } catch {}\n await delay(250);\n return pollUntilHealthy(signal);\n};\n\nconst ReconnectingScreen = () => (\n <main aria-live=\"polite\" data-om-reconnecting=\"\" role=\"status\">\n <section data-om-reconnecting-panel=\"\">\n <h1 data-om-reconnecting-title=\"\">Reconnecting</h1>\n <p data-om-reconnecting-message=\"\">\n Reconnecting to Overmux. Your workspace will resume shortly.\n </p>\n </section>\n </main>\n);\n\nconst useUpdateState = (transport: ClientTransport) => {\n const [state, dispatch] = useReducer(reduceUpdateState, { type: \"current\" });\n\n useEffect(\n () => transport.subscribeLifecycle((event) => dispatch(event)),\n [transport],\n );\n useEffect(() => {\n if (state.type !== \"restarting\") {\n return;\n }\n const controller = new AbortController();\n void pollUntilHealthy(controller.signal);\n return () => controller.abort();\n }, [state.type]);\n\n const requestRestart = useCallback(async () => {\n dispatch({ type: \"restart-requested\" });\n try {\n const response = await fetch(\"/api/restart\", { method: \"POST\" });\n if (!response.ok) {\n throw new Error(`Restart request failed: ${response.status}`);\n }\n dispatch({ type: \"restarting\" });\n } catch (cause) {\n const error = cause instanceof Error ? cause.message : String(cause);\n dispatch({ type: \"restart-failed\", error });\n }\n }, []);\n\n return { requestRestart, state };\n};\n\nconst useConnectionState = (transport: ClientTransport) => {\n const connected = useRef(false);\n const [connection, setConnection] = useState<ConnectionState>(\"initial\");\n\n useEffect(\n () =>\n transport.subscribeStatus((status: TransportStatus) => {\n if (status === \"connected\") {\n connected.current = true;\n setConnection(\"connected\");\n return;\n }\n if (!connected.current) {\n return;\n }\n connected.current = false;\n setConnection(\"reconnecting\");\n }),\n [transport],\n );\n\n return connection;\n};\n\nexport const UpdatePopover = ({\n transport,\n}: {\n transport: ClientTransport;\n}) => {\n const connection = useConnectionState(transport);\n const { requestRestart, state } = useUpdateState(transport);\n\n if (state.type === \"restarting\") {\n return (\n <main aria-live=\"polite\" data-om-restarting=\"\" role=\"status\">\n <section data-om-restarting-panel=\"\">\n <h1 data-om-restarting-title=\"\">Restarting Overmux</h1>\n <p data-om-restarting-message=\"\">Waiting for the new version.</p>\n </section>\n </main>\n );\n }\n if (connection === \"reconnecting\") {\n return <ReconnectingScreen />;\n }\n if (state.type === \"current\") {\n return null;\n }\n\n const error = state.type === \"available\" ? state.error : undefined;\n\n return (\n <aside data-om-update=\"\" role=\"status\">\n <p>A new version is available. Reload to update.</p>\n <button\n data-om-update-reload=\"\"\n disabled={state.type === \"requesting\"}\n onClick={() => void requestRestart()}\n type=\"button\"\n >\n Reload\n </button>\n {error ? <p data-om-update-error=\"\">{error}</p> : null}\n </aside>\n );\n};\n","// This file is the overmux owned part of the client\n\nimport {\n runtimeManifestSchema,\n type RuntimeManifest,\n} from \"../../shared/index\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport {\n Component,\n createElement,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { overmuxLogoutPath, overmuxSettingsPath } from \"@overmux/shared\";\nimport { OvermuxThemeScope } from \"../theme-scope\";\nimport { createOvermuxServerApi } from \"../browser-api\";\nimport { installBrowserLogForwarding } from \"./browser-log-forwarding\";\nimport { installNotificationForwarding } from \"./notification-forwarding\";\nimport type { ClientAppDefinition } from \"../client-definition\";\nimport { type RegisteredCommand, RuntimeContext } from \"../commands\";\nimport { ShortcutHost } from \"../shortcuts\";\nimport { createClientTransport, TransportContext } from \"../transport\";\nimport { HostedLogoutPage } from \"./hosted-pages/logout-page\";\nimport { HostedSettingsPage } from \"./hosted-pages/settings-page\";\nimport { RecoveryScreen } from \"./recovery-screen\";\nimport { UpdatePopover } from \"./update-popover\";\n\ntype ErrorBoundaryProps = {\n children: ReactNode;\n fallback: (error: Error) => ReactNode;\n};\n\ntype ErrorBoundaryState = { error?: Error };\n\nclass RootErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n state: ErrorBoundaryState = {};\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n render() {\n return this.state.error\n ? this.props.fallback(this.state.error)\n : this.props.children;\n }\n}\n\nclass AuthenticationRequiredError extends Error {}\n\nconst redirectToLogin = () => location.replace(\"/login?reason=session-expired\");\n\nconst loadRuntimeManifest = async () => {\n const response = await fetch(\"/api/runtime-manifest\", { cache: \"no-store\" });\n if (response.status === 401) {\n throw new AuthenticationRequiredError(\"Authentication required\");\n }\n if (!response.ok) {\n throw new Error(`Runtime manifest request failed: ${response.status}`);\n }\n return runtimeManifestSchema.parse(await response.json());\n};\n\nconst OvermuxRuntime = ({\n definition,\n}: {\n definition: ClientAppDefinition;\n}) => {\n const safeMode = new URLSearchParams(location.search).get(\"safe\") === \"1\";\n const transport = useMemo(createClientTransport, []);\n const queryClient = useMemo(() => new QueryClient(), []);\n const logForwardingDisposer = useRef<(() => void) | undefined>(undefined);\n const [manifest, setManifest] = useState<RuntimeManifest>();\n const [error, setError] = useState<string>();\n useEffect(() => {\n let active = true;\n void loadRuntimeManifest()\n .then((next) => {\n if (!active) {\n return;\n }\n setManifest(next);\n transport.activate();\n })\n .catch((cause: unknown) => {\n if (cause instanceof AuthenticationRequiredError) {\n redirectToLogin();\n return;\n }\n if (active) {\n setError(cause instanceof Error ? cause.message : String(cause));\n }\n });\n return () => {\n active = false;\n };\n }, [transport]);\n const registrations = useMemo(() => new Set<RegisteredCommand>(), []);\n const [registrationRevision, setRegistrationRevision] = useState(0);\n useEffect(() => {\n if (manifest?.debug && !logForwardingDisposer.current) {\n logForwardingDisposer.current = installBrowserLogForwarding(\n transport.reportDiagnostic,\n );\n }\n }, [manifest?.debug, transport]);\n useEffect(\n () =>\n transport.subscribeStatus((status) => {\n if (status === \"authentication-required\") {\n redirectToLogin();\n }\n }),\n [transport],\n );\n useEffect(\n () => () => {\n logForwardingDisposer.current?.();\n transport.dispose();\n },\n [transport],\n );\n useEffect(() => installNotificationForwarding(transport), [transport]);\n const refreshCommands = useCallback(\n () => setRegistrationRevision((revision) => revision + 1),\n [],\n );\n const registerCommand = useCallback(\n (registration: RegisteredCommand) => {\n registrations.add(registration);\n refreshCommands();\n return () => {\n registrations.delete(registration);\n refreshCommands();\n };\n },\n [refreshCommands, registrations],\n );\n const overmuxServerApi = useMemo(\n () =>\n manifest ? createOvermuxServerApi({ manifest, transport }) : undefined,\n [manifest, transport],\n );\n if (safeMode || !manifest || !overmuxServerApi) {\n return <RecoveryScreen error={error} />;\n }\n\n const App = definition.component;\n return (\n <QueryClientProvider client={queryClient}>\n <RuntimeContext.Provider\n value={{\n manifest,\n overmuxServerApi,\n refreshCommands,\n registerCommand,\n }}\n >\n <TransportContext.Provider value={transport}>\n <ShortcutHost\n definition={definition}\n registrations={registrations}\n registrationRevision={registrationRevision}\n >\n <RootErrorBoundary\n fallback={(cause) => <RecoveryScreen error={cause.message} />}\n >\n {createElement(App)}\n </RootErrorBoundary>\n <UpdatePopover transport={transport} />\n </ShortcutHost>\n </TransportContext.Provider>\n </RuntimeContext.Provider>\n </QueryClientProvider>\n );\n};\n\nexport const OvermuxHost = ({\n definition,\n}: {\n definition: ClientAppDefinition;\n}) => (\n <OvermuxThemeScope {...definition.appearance}>\n {location.pathname === overmuxSettingsPath ? (\n <HostedSettingsPage />\n ) : location.pathname === overmuxLogoutPath ? (\n <HostedLogoutPage />\n ) : (\n <OvermuxRuntime definition={definition} />\n )}\n </OvermuxThemeScope>\n);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","names":["keyBindingSchema","formatKeyBinding","elementDepth","matchesKeyBinding"],"sources":["../../src/internal/shared/background-notifications.ts","../../src/internal/shared/protocol.ts","../../src/internal/client/background-notifications.ts","../../src/internal/client/clipboard.ts","../../src/internal/client/client-definition.ts","../../src/internal/client/commands.tsx","../../src/internal/client/overmux-react.ts","../../src/internal/client/theme-scope.tsx","../../src/internal/client/browser-api.ts","../../src/internal/client/host/browser-log-forwarding.ts","../../src/internal/client/host/notification-forwarding.ts","../../src/internal/client/shortcuts.tsx","../../src/internal/client/websocket.ts","../../src/internal/client/transport.ts","../../src/internal/client/host/hosted-pages/hosted-page.tsx","../../src/internal/client/host/hosted-pages/logout-page.tsx","../../src/internal/client/host/hosted-pages/browser-notification-settings.tsx","../../src/internal/client/host/hosted-pages/settings-page.tsx","../../src/internal/client/host/recovery-screen.tsx","../../../lib/dist/index.js","../../src/internal/client/host/update-popover.tsx","../../src/internal/client/host/overmux-host.tsx"],"sourcesContent":["// Validates browser subscription data exchanged by background-notification delivery.\n// Browser-standard key and endpoint details stay behind this internal boundary.\nimport { z } from \"zod\";\n\nconst deliveryKeySchema = z\n .string()\n .min(1)\n .max(1_024)\n .regex(/^[\\w-]+$/u);\n\nexport const backgroundNotificationSubscriptionSchema = z\n .object({\n endpoint: z\n .url()\n .max(4_096)\n .refine((endpoint) => {\n const url = new URL(endpoint);\n return url.protocol === \"https:\" && !url.username && !url.password;\n }),\n expirationTime: z.number().int().nonnegative().nullable(),\n keys: z\n .object({ auth: deliveryKeySchema, p256dh: deliveryKeySchema })\n .strict(),\n })\n .strict();\n\nexport const backgroundNotificationPublicKeyResponseSchema = z\n .object({ publicKey: deliveryKeySchema })\n .strict();\n\nexport const backgroundNotificationDisableRequestSchema = z\n .object({ endpoint: backgroundNotificationSubscriptionSchema.shape.endpoint })\n .strict();\n\nexport type BackgroundNotificationSubscription = z.infer<\n typeof backgroundNotificationSubscriptionSchema\n>;\n","import { z } from \"zod\";\n\nimport { notificationSchema } from \"../../public/notifications\";\n\n// Compatibility gate, not negotiation: open tabs may still run older client assets.\n// The exact version rejects incompatible runtime manifest and wire formats before later traffic.\nexport const protocolVersion = 9 as const;\n\n// Application-defined WebSocket close codes shared by server and browser transports.\nexport const webSocketCloseCode = {\n authenticationRevoked: 4001,\n authenticationUnavailable: 4002,\n} as const;\n\nexport const runtimeManifestSchema = z.object({\n debug: z.boolean(),\n operations: z.array(z.string().min(1)),\n protocolVersion: z.literal(protocolVersion),\n resources: z.array(z.string().min(1)),\n streams: z.array(z.string().min(1)),\n});\n\nexport const updateAvailableEventSchema = z.object({\n type: z.literal(\"update-available\"),\n});\n\nexport const restartingEventSchema = z.object({\n type: z.literal(\"restarting\"),\n});\n\nexport const serverLifecycleEventSchema = z.discriminatedUnion(\"type\", [\n updateAvailableEventSchema,\n restartingEventSchema,\n]);\n\nexport const notificationEventSchema = z\n .object({\n notification: notificationSchema,\n type: z.literal(\"notification\"),\n })\n .strict();\n\nconst operationIdSchema = z.string().min(1).max(256);\nconst registrationNameSchema = z.string().min(1).max(256);\n\nexport const resourceReadMessageSchema = z.object({\n input: z.unknown().optional(),\n operationId: operationIdSchema,\n resourceName: registrationNameSchema,\n type: z.literal(\"resource-read\"),\n});\n\nexport const resourceSubscribeMessageSchema = z.object({\n input: z.unknown().optional(),\n operationId: operationIdSchema,\n resourceName: registrationNameSchema,\n subscriptionId: operationIdSchema,\n type: z.literal(\"resource-subscribe\"),\n});\n\nexport const resourceUnsubscribeMessageSchema = z.object({\n subscriptionId: operationIdSchema,\n type: z.literal(\"resource-unsubscribe\"),\n});\n\nexport const streamOpenMessageSchema = z.object({\n input: z.unknown().optional(),\n operationId: operationIdSchema,\n streamId: operationIdSchema,\n streamName: registrationNameSchema,\n type: z.literal(\"stream-open\"),\n});\n\nexport const streamMessageSchema = z.object({\n message: z.unknown(),\n streamId: operationIdSchema,\n type: z.literal(\"stream-message\"),\n});\n\nexport const streamCloseMessageSchema = z.object({\n streamId: operationIdSchema,\n type: z.literal(\"stream-close\"),\n});\n\nexport const clientDiagnosticEventSchema = z.object({\n arguments: z.string().max(16_100),\n level: z.enum([\"log\", \"info\", \"warn\", \"error\", \"debug\"]),\n message: z.string().max(4_100),\n stack: z.string().max(8_100).optional(),\n timestamp: z.iso.datetime(),\n type: z.literal(\"client-diagnostic\"),\n url: z.string().max(2_100).optional(),\n});\n\nexport const clientProtocolMessageSchema = z.discriminatedUnion(\"type\", [\n resourceReadMessageSchema,\n resourceSubscribeMessageSchema,\n resourceUnsubscribeMessageSchema,\n streamOpenMessageSchema,\n streamMessageSchema,\n streamCloseMessageSchema,\n clientDiagnosticEventSchema,\n]);\n\nexport const resourceResultMessageSchema = z.object({\n operationId: operationIdSchema,\n output: z.unknown(),\n type: z.literal(\"resource-result\"),\n});\n\nexport const resourceInvalidatedMessageSchema = z.object({\n subscriptionId: operationIdSchema,\n type: z.literal(\"resource-invalidated\"),\n});\n\nexport const streamOpenedMessageSchema = z.object({\n operationId: operationIdSchema,\n streamId: operationIdSchema,\n type: z.literal(\"stream-opened\"),\n});\n\nexport const streamOutputMessageSchema = z.object({\n message: z.unknown(),\n streamId: operationIdSchema,\n type: z.literal(\"stream-output\"),\n});\n\nexport const streamClosedMessageSchema = z.object({\n streamId: operationIdSchema,\n type: z.literal(\"stream-closed\"),\n});\n\nexport const protocolErrorMessageSchema = z.object({\n code: z.enum([\"bad-request\", \"conflict\", \"internal\", \"not-found\"]),\n message: z.string(),\n operationId: operationIdSchema.optional(),\n streamId: operationIdSchema.optional(),\n subscriptionId: operationIdSchema.optional(),\n type: z.literal(\"error\"),\n});\n\nexport const serverProtocolMessageSchema = z.discriminatedUnion(\"type\", [\n resourceResultMessageSchema,\n resourceInvalidatedMessageSchema,\n streamOpenedMessageSchema,\n streamOutputMessageSchema,\n streamClosedMessageSchema,\n protocolErrorMessageSchema,\n updateAvailableEventSchema,\n restartingEventSchema,\n notificationEventSchema,\n]);\n\nconst byteMarker = \"$overmuxBytes\";\n\ntype EncodedBytes = { [byteMarker]: number[] };\n\nconst encodeValue = (value: unknown): unknown => {\n if (value instanceof Uint8Array) {\n return { [byteMarker]: Array.from(value) } satisfies EncodedBytes;\n }\n if (Array.isArray(value)) {\n return value.map(encodeValue);\n }\n if (typeof value === \"object\" && value !== null) {\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [key, encodeValue(item)]),\n );\n }\n return value;\n};\n\nconst decodeValue = (value: unknown): unknown => {\n if (Array.isArray(value)) {\n return value.map(decodeValue);\n }\n if (typeof value !== \"object\" || value === null) {\n return value;\n }\n const record = value as Record<string, unknown>;\n if (\n Object.keys(record).length === 1 &&\n Array.isArray(record[byteMarker]) &&\n record[byteMarker].every(\n (item) => Number.isInteger(item) && item >= 0 && item <= 255,\n )\n ) {\n return Uint8Array.from(record[byteMarker] as number[]);\n }\n return Object.fromEntries(\n Object.entries(record).map(([key, item]) => [key, decodeValue(item)]),\n );\n};\n\nconst binaryMarker = \"$overmuxBinary\";\nconst binaryMagic = 0x4f4d5801;\n\ntype EncodedBinary = { [binaryMarker]: [number, number] };\n\nconst encodeBinaryValue = (\n value: unknown,\n payloads: Uint8Array[],\n offset: { value: number },\n): unknown => {\n if (value instanceof Uint8Array) {\n const marker = {\n [binaryMarker]: [offset.value, value.byteLength],\n } satisfies EncodedBinary;\n payloads.push(value);\n offset.value += value.byteLength;\n return marker;\n }\n if (Array.isArray(value)) {\n return value.map((item) => encodeBinaryValue(item, payloads, offset));\n }\n if (typeof value === \"object\" && value !== null) {\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [\n key,\n encodeBinaryValue(item, payloads, offset),\n ]),\n );\n }\n return value;\n};\n\nconst decodeBinaryValue = (value: unknown, payload: Uint8Array): unknown => {\n if (Array.isArray(value)) {\n return value.map((item) => decodeBinaryValue(item, payload));\n }\n if (typeof value !== \"object\" || value === null) {\n return value;\n }\n const record = value as Record<string, unknown>;\n const marker = record[binaryMarker];\n if (\n Object.keys(record).length === 1 &&\n Array.isArray(marker) &&\n marker.length === 2 &&\n marker.every((item) => Number.isInteger(item) && item >= 0)\n ) {\n const [offset, length] = marker as [number, number];\n if (offset + length > payload.byteLength) {\n throw new Error(\"Invalid Overmux binary payload range\");\n }\n return payload.slice(offset, offset + length);\n }\n return Object.fromEntries(\n Object.entries(record).map(([key, item]) => [\n key,\n decodeBinaryValue(item, payload),\n ]),\n );\n};\n\nexport const encodeProtocolMessage = (message: unknown): string =>\n JSON.stringify(encodeValue(message));\n\nexport const decodeProtocolMessage = (message: string): unknown =>\n decodeValue(JSON.parse(message));\n\nexport const encodeProtocolFrame = (message: unknown): string | Uint8Array => {\n const payloads: Uint8Array[] = [];\n const encoded = encodeBinaryValue(message, payloads, { value: 0 });\n if (!payloads.length) {\n return JSON.stringify(encoded);\n }\n const header = new TextEncoder().encode(JSON.stringify(encoded));\n const payloadLength = payloads.reduce(\n (total, payload) => total + payload.byteLength,\n 0,\n );\n const frame = new Uint8Array(8 + header.byteLength + payloadLength);\n const view = new DataView(frame.buffer);\n view.setUint32(0, binaryMagic);\n view.setUint32(4, header.byteLength);\n frame.set(header, 8);\n let offset = 8 + header.byteLength;\n payloads.forEach((payload) => {\n frame.set(payload, offset);\n offset += payload.byteLength;\n });\n return frame;\n};\n\nexport const decodeProtocolFrame = (\n frame: string | ArrayBuffer | Uint8Array,\n): unknown => {\n if (typeof frame === \"string\") {\n return decodeProtocolMessage(frame);\n }\n const bytes =\n frame instanceof Uint8Array\n ? frame\n : new Uint8Array(frame, 0, frame.byteLength);\n if (bytes.byteLength < 8) {\n throw new Error(\"Invalid Overmux binary frame\");\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n if (view.getUint32(0) !== binaryMagic) {\n throw new Error(\"Invalid Overmux binary frame magic\");\n }\n const headerLength = view.getUint32(4);\n if (8 + headerLength > bytes.byteLength) {\n throw new Error(\"Invalid Overmux binary frame header\");\n }\n const header = JSON.parse(\n new TextDecoder().decode(bytes.subarray(8, 8 + headerLength)),\n ) as unknown;\n return decodeBinaryValue(header, bytes.subarray(8 + headerLength));\n};\n\nexport type RuntimeManifest = z.infer<typeof runtimeManifestSchema>;\nexport type ClientDiagnosticEvent = z.infer<typeof clientDiagnosticEventSchema>;\nexport type ClientProtocolMessage = z.infer<typeof clientProtocolMessageSchema>;\nexport type ServerLifecycleEvent = z.infer<typeof serverLifecycleEventSchema>;\nexport type ServerProtocolMessage = z.infer<typeof serverProtocolMessageSchema>;\n","// Provides the browser API and controls for background notifications.\n// Browser PushManager details remain inside this delivery boundary.\nimport {\n backgroundNotificationPublicKeyResponseSchema,\n backgroundNotificationSubscriptionSchema,\n} from \"../shared/index\";\n\nconst enabledStorageKey = \"overmux.backgroundNotificationsEnabled\";\n\nexport type BackgroundNotificationStatus =\n | \"checking\"\n | \"denied\"\n | \"disabled\"\n | \"enabled\"\n | \"error\"\n | \"ios-home-screen\"\n | \"unsupported\";\n\nconst isIos = () =>\n /iPad|iPhone|iPod/u.test(navigator.userAgent) ||\n (navigator.platform === \"MacIntel\" && navigator.maxTouchPoints > 1);\nconst isStandalone = () =>\n window.matchMedia(\"(display-mode: standalone)\").matches ||\n Boolean((navigator as Navigator & { standalone?: boolean }).standalone);\n\nconst supportStatus = (): BackgroundNotificationStatus | undefined => {\n if (window.overmuxHost?.notifications) {\n return \"unsupported\";\n }\n if (isIos() && !isStandalone()) {\n return \"ios-home-screen\";\n }\n if (\n !window.isSecureContext ||\n !(\"Notification\" in window) ||\n !(\"serviceWorker\" in navigator) ||\n !(\"PushManager\" in window)\n ) {\n return \"unsupported\";\n }\n return undefined;\n};\n\nconst decodeApplicationServerKey = (value: string) => {\n const padded = `${value}${\"=\".repeat((4 - (value.length % 4)) % 4)}`;\n return Uint8Array.from(\n atob(padded.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\")),\n (character) => character.charCodeAt(0),\n );\n};\n\nconst encodeApplicationServerKey = (value: ArrayBuffer | null) => {\n if (!value) {\n return undefined;\n }\n const binary = String.fromCharCode(...new Uint8Array(value));\n return btoa(binary)\n .replaceAll(\"+\", \"-\")\n .replaceAll(\"/\", \"_\")\n .replace(/=+$/u, \"\");\n};\n\nconst request = async (path: string, init?: RequestInit) => {\n const response = await fetch(path, { cache: \"no-store\", ...init });\n if (!response.ok) {\n throw new Error(\n `Background notification request failed: ${response.status}`,\n );\n }\n return response;\n};\n\nconst getPublicKey = async () => {\n const response = await request(\"/api/background-notifications/public-key\");\n return backgroundNotificationPublicKeyResponseSchema.parse(\n await response.json(),\n ).publicKey;\n};\n\nconst serializeSubscription = (subscription: PushSubscription) => {\n const json = subscription.toJSON();\n return backgroundNotificationSubscriptionSchema.parse({\n endpoint: subscription.endpoint,\n expirationTime: subscription.expirationTime ?? null,\n keys: json.keys,\n });\n};\n\nconst enableSubscription = async (subscription: PushSubscription) => {\n await request(\"/api/background-notifications/subscription\", {\n body: JSON.stringify(serializeSubscription(subscription)),\n headers: { \"Content-Type\": \"application/json\" },\n method: \"PUT\",\n });\n};\n\nconst disableSubscription = async (subscription: PushSubscription) => {\n await request(\"/api/background-notifications/subscription\", {\n body: JSON.stringify({ endpoint: subscription.endpoint }),\n headers: { \"Content-Type\": \"application/json\" },\n method: \"DELETE\",\n });\n};\n\nconst subscribe = async (\n registration: ServiceWorkerRegistration,\n publicKey: string,\n) =>\n registration.pushManager.subscribe({\n applicationServerKey: decodeApplicationServerKey(publicKey),\n userVisibleOnly: true,\n });\n\nconst canManageSubscription = () =>\n window.isSecureContext &&\n \"serviceWorker\" in navigator &&\n \"PushManager\" in window;\n\nconst removeCurrentSubscription = async () => {\n if (!canManageSubscription()) {\n return;\n }\n const registration = await navigator.serviceWorker.getRegistration();\n const subscription = await registration?.pushManager.getSubscription();\n if (!subscription) {\n return;\n }\n await disableSubscription(subscription);\n if (!(await subscription.unsubscribe())) {\n throw new Error(\"The background subscription could not be removed\");\n }\n};\n\nconst reconcileBackgroundNotifications = async () => {\n const registration = await navigator.serviceWorker.ready;\n const publicKey = await getPublicKey();\n let subscription = await registration.pushManager.getSubscription();\n const subscriptionKey = subscription\n ? encodeApplicationServerKey(subscription.options.applicationServerKey)\n : undefined;\n if (subscription && subscriptionKey !== publicKey) {\n await disableSubscription(subscription);\n if (!(await subscription.unsubscribe())) {\n throw new Error(\"The previous background subscription is still active\");\n }\n subscription = null;\n }\n if (!subscription) {\n subscription = await subscribe(registration, publicKey);\n }\n await enableSubscription(subscription);\n};\n\nexport const enableBackgroundNotifications = async () => {\n if (supportStatus()) {\n localStorage.removeItem(enabledStorageKey);\n return false;\n }\n const permission =\n Notification.permission === \"default\"\n ? await Notification.requestPermission()\n : Notification.permission;\n if (permission !== \"granted\") {\n localStorage.removeItem(enabledStorageKey);\n return false;\n }\n await reconcileBackgroundNotifications();\n localStorage.setItem(enabledStorageKey, \"true\");\n return true;\n};\n\nexport const disableBackgroundNotifications = async () => {\n localStorage.removeItem(enabledStorageKey);\n await removeCurrentSubscription();\n};\n\nexport const reconciledStatus =\n async (): Promise<BackgroundNotificationStatus> => {\n const unavailable = supportStatus();\n if (unavailable) {\n await disableBackgroundNotifications().catch(() => undefined);\n return unavailable;\n }\n if (Notification.permission !== \"granted\") {\n await disableBackgroundNotifications().catch(() => undefined);\n return Notification.permission === \"denied\" ? \"denied\" : \"disabled\";\n }\n if (localStorage.getItem(enabledStorageKey) !== \"true\") {\n await disableBackgroundNotifications();\n return \"disabled\";\n }\n await reconcileBackgroundNotifications();\n return \"enabled\";\n };\n","import \"./host/desktop-host\";\n\n// Reads the system clipboard through the browser, never through the desktop host.\nexport const readClipboardText = async (): Promise<string> => {\n if (!globalThis.navigator?.clipboard?.readText) {\n throw new Error(\"Clipboard reading is unavailable in this browser context\");\n }\n return navigator.clipboard.readText();\n};\n\n// Desktop writes are fire-and-forget: resolution confirms dispatch, not completion.\nexport const writeClipboardText = async (text: string): Promise<void> => {\n const desktopClipboard = globalThis.window?.overmuxHost?.clipboard;\n if (desktopClipboard?.version === 1) {\n desktopClipboard.writeText(text);\n return;\n }\n if (!globalThis.navigator?.clipboard?.writeText) {\n throw new Error(\"Clipboard writing is unavailable in this browser context\");\n }\n await navigator.clipboard.writeText(text);\n};\n","import type { OvermuxContrast, OvermuxScheme } from \"./theme-scope\";\nimport type { ComponentType } from \"react\";\nimport {\n formatKeyBinding,\n keyBindingSchema,\n matchesKeyBinding,\n type KeyBinding,\n} from \"@overmux/keybindings\";\nexport {\n formatKeyBinding,\n keyBindingSchema,\n matchesKeyBinding,\n} from \"@overmux/keybindings\";\nexport type { KeyBinding } from \"@overmux/keybindings\";\nimport { z } from \"zod\";\n\nimport type { OvermuxServerApi } from \"./browser-api\";\n\nexport type KeySequence = readonly [KeyBinding, KeyBinding, ...KeyBinding[]];\nexport type ShortcutBinding = KeyBinding | KeySequence;\nexport type ConditionalShortcutBinding = {\n binding: ShortcutBinding;\n when: { media: string };\n};\nexport type CommandBinding = ShortcutBinding | ConditionalShortcutBinding;\nexport type ChordPrefix = {\n binding: KeyBinding;\n unmatched: \"replay-to-focused-input\";\n};\n\nexport const shortcutBindingSchema = z.union([\n keyBindingSchema,\n z.array(keyBindingSchema).min(2),\n]);\nexport const commandBindingSchema = z.union([\n shortcutBindingSchema,\n z.object({\n binding: shortcutBindingSchema,\n when: z.object({ media: z.string().trim().min(1) }),\n }),\n]);\nexport const chordPrefixSchema = z.object({\n binding: keyBindingSchema,\n unmatched: z.literal(\"replay-to-focused-input\"),\n});\n\nexport const formatShortcutBinding = (binding: ShortcutBinding) =>\n typeof binding === \"string\"\n ? formatKeyBinding(binding)\n : binding.map(formatKeyBinding).join(\" \");\n\ntype CommandRunResult = Promise<unknown> | unknown;\ntype CommandRun<TServerConfig, TParams> = (input: {\n overmuxServerApi: OvermuxServerApi<TServerConfig>;\n params: TParams;\n}) => CommandRunResult;\ntype CommandDefinitionSource = {\n defaultBindings?: readonly CommandBinding[];\n params?: z.ZodType;\n run?: unknown;\n title: string;\n};\ntype ParamsSchema<TCommand> = TCommand extends {\n params: infer TParams extends z.ZodType;\n}\n ? TParams\n : undefined;\ntype ParamsOutput<TCommand> =\n ParamsSchema<TCommand> extends z.ZodType\n ? z.output<ParamsSchema<TCommand>>\n : undefined;\ntype CheckedCommand<TServerConfig, TCommand extends CommandDefinitionSource> = {\n [TKey in keyof TCommand]: TKey extends \"run\"\n ? CommandRun<TServerConfig, ParamsOutput<TCommand>>\n : TCommand[TKey];\n} & {\n defaultBindings?: readonly CommandBinding[];\n params?: z.ZodType;\n title: string;\n};\ntype CheckedCommands<\n TServerConfig,\n TCommands extends Record<string, CommandDefinitionSource>,\n> = {\n [TId in keyof TCommands]: CheckedCommand<TServerConfig, TCommands[TId]>;\n};\n\nexport type CommandHandle<TId extends string = string> = {\n defaultBindings?: readonly CommandBinding[];\n id: TId;\n params?: z.ZodType;\n run?: unknown;\n title: string;\n};\n\ntype DefinedCommands<\n TServerConfig,\n TCommands extends Record<string, CommandDefinitionSource>,\n> = {\n readonly [TId in keyof TCommands]: CheckedCommand<\n TServerConfig,\n TCommands[TId]\n > & { readonly id: Extract<TId, string> };\n};\n\nconst validateBindings = (bindings: readonly CommandBinding[] | undefined) =>\n bindings?.forEach((binding) => commandBindingSchema.parse(binding));\n\nexport const defineCommandRegistry =\n <TServerConfig>() =>\n <const TCommands extends Record<string, CommandDefinitionSource>>(\n commands: CheckedCommands<TServerConfig, TCommands>,\n ): DefinedCommands<TServerConfig, TCommands> =>\n Object.fromEntries(\n Object.entries(commands).map(([id, command]) => {\n validateBindings(command.defaultBindings);\n return [id, { ...command, id }];\n }),\n ) as DefinedCommands<TServerConfig, TCommands>;\n\nexport type CommandRegistry = Readonly<Record<string, CommandHandle>>;\n\nexport type OvermuxClientAppearance = {\n contrast?: OvermuxContrast;\n scheme?: OvermuxScheme;\n};\n\nexport type ClientAppDefinition<\n TCommands extends CommandRegistry = CommandRegistry,\n> = {\n appearance?: OvermuxClientAppearance;\n chordPrefixes?: readonly ChordPrefix[];\n commands: TCommands;\n component: ComponentType;\n shortcutOverrides?: Partial<\n Record<Extract<keyof TCommands, string>, readonly CommandBinding[]>\n >;\n};\n\nexport const defineOvermuxClient = <const TCommands extends CommandRegistry>(\n definition: ClientAppDefinition<TCommands>,\n): ClientAppDefinition<TCommands> => {\n definition.chordPrefixes?.forEach((prefix) =>\n chordPrefixSchema.parse(prefix),\n );\n Object.values(definition.shortcutOverrides ?? {}).forEach(validateBindings);\n return definition;\n};\n\nexport const isConditionalShortcutBinding = (\n binding: CommandBinding,\n): binding is ConditionalShortcutBinding =>\n typeof binding !== \"string\" && !Array.isArray(binding);\n\nexport const resolveShortcutBinding = (\n binding: CommandBinding,\n): ShortcutBinding =>\n isConditionalShortcutBinding(binding) ? binding.binding : binding;\n\nexport const configuredCommandBindings = (\n definition: ClientAppDefinition,\n command: CommandHandle,\n) =>\n definition.shortcutOverrides?.[command.id] ?? command.defaultBindings ?? [];\n\nexport const activeCommandBindings = (\n bindings: readonly CommandBinding[],\n matchesMedia: (media: string) => boolean,\n) =>\n bindings.flatMap((binding) =>\n !isConditionalShortcutBinding(binding) || matchesMedia(binding.when.media)\n ? [resolveShortcutBinding(binding)]\n : [],\n );\n\nexport const shortcutMediaQueries = (definition: ClientAppDefinition) => [\n ...new Set(\n Object.values(definition.commands).flatMap((command) =>\n configuredCommandBindings(definition, command).flatMap((binding) =>\n isConditionalShortcutBinding(binding) ? [binding.when.media] : [],\n ),\n ),\n ),\n];\n","import type { RuntimeManifest } from \"../shared/index\";\nimport {\n createContext,\n type RefObject,\n useContext,\n useEffect,\n useRef,\n} from \"react\";\nimport { z } from \"zod\";\n\nimport type {\n ClientAppDefinition,\n CommandHandle,\n ShortcutBinding,\n} from \"./client-definition\";\nimport {\n activeCommandBindings,\n configuredCommandBindings,\n} from \"./client-definition\";\nimport type { RuntimeOvermuxServerApi } from \"./browser-api\";\n\ntype CommandRunResult = Promise<unknown> | unknown;\ntype LocalCommandRun = () => CommandRunResult;\ntype ParamsSchema<TCommand> = TCommand extends {\n params: infer TParams extends z.ZodType;\n}\n ? TParams\n : undefined;\ntype RegistrationParams<TCommand> =\n ParamsSchema<TCommand> extends z.ZodType\n ? { params: z.input<ParamsSchema<TCommand>> }\n : { params?: never };\ntype RegistrationRun<TCommand> = TCommand extends {\n run: (...args: never[]) => unknown;\n}\n ? { run?: LocalCommandRun }\n : { run: LocalCommandRun };\ntype CommandRegistration<TCommand> = RegistrationParams<TCommand> &\n RegistrationRun<TCommand> & {\n element?: RefObject<HTMLElement | null>;\n enabled?: boolean;\n };\ntype UseCommandRegistration<TCommand> =\n ParamsSchema<TCommand> extends z.ZodType\n ? CommandRegistration<TCommand> | SkipToken\n : CommandRegistration<TCommand>;\n\nexport const skipToken = Symbol(\"overmux command registration\");\nexport type SkipToken = typeof skipToken;\n\nexport type RegisteredCommand = {\n command: CommandHandle;\n element: () => HTMLElement | null | undefined;\n enabled: () => boolean;\n execute: () => Promise<void>;\n};\n\ntype RuntimeContextValue = {\n manifest: RuntimeManifest;\n overmuxServerApi: RuntimeOvermuxServerApi;\n refreshCommands: () => void;\n registerCommand: (registration: RegisteredCommand) => () => void;\n};\n\nexport const RuntimeContext = createContext<RuntimeContextValue | undefined>(\n undefined,\n);\n\nexport const useRuntime = () => {\n const runtime = useContext(RuntimeContext);\n if (!runtime) {\n throw new Error(\n \"Overmux hooks must be used inside an active Overmux client runtime\",\n );\n }\n return runtime;\n};\n\ntype RuntimeCommandRegistration = {\n element?: RefObject<HTMLElement | null>;\n enabled?: boolean;\n params?: unknown;\n run?: LocalCommandRun;\n};\n\nconst executeRegistration = async (\n command: CommandHandle,\n registration: RuntimeCommandRegistration,\n overmuxServerApi: RuntimeOvermuxServerApi,\n) => {\n const params = command.params\n ? command.params.parse(registration.params)\n : undefined;\n if (registration.run) {\n await registration.run();\n return;\n }\n if (typeof command.run !== \"function\") {\n throw new Error(`Command has no implementation: ${command.id}`);\n }\n await command.run({ overmuxServerApi, params });\n};\n\nexport const createRegisteredCommand = ({\n command,\n getRegistration,\n overmuxServerApi,\n}: {\n command: CommandHandle;\n getRegistration: () => RuntimeCommandRegistration | SkipToken;\n overmuxServerApi: RuntimeOvermuxServerApi;\n}): RegisteredCommand => ({\n command,\n element: () => {\n const registration = getRegistration();\n return registration === skipToken\n ? undefined\n : registration.element?.current;\n },\n enabled: () => {\n const registration = getRegistration();\n return registration === skipToken ? false : (registration.enabled ?? true);\n },\n execute: () => {\n const registration = getRegistration();\n return registration === skipToken\n ? Promise.resolve()\n : executeRegistration(command, registration, overmuxServerApi);\n },\n});\n\nexport const useCommand = <TCommand extends CommandHandle>(\n command: TCommand,\n registration: UseCommandRegistration<TCommand>,\n) => {\n const { overmuxServerApi, refreshCommands, registerCommand } = useRuntime();\n const registrationRef = useRef(registration);\n registrationRef.current = registration;\n const skipped = registration === skipToken;\n useEffect(() => {\n if (skipped) {\n return;\n }\n return registerCommand(\n createRegisteredCommand({\n command,\n getRegistration: () =>\n registrationRef.current as RuntimeCommandRegistration | SkipToken,\n overmuxServerApi,\n }),\n );\n }, [command, overmuxServerApi, registerCommand, skipped]);\n const enabled = skipped ? false : (registration.enabled ?? true);\n const element = skipped ? undefined : registration.element;\n useEffect(refreshCommands, [element, enabled, refreshCommands, skipped]);\n};\n\nconst elementDepth = (element: HTMLElement) => {\n let depth = 0;\n for (\n let current: HTMLElement | null = element;\n current;\n current = current.parentElement\n ) {\n depth += 1;\n }\n return depth;\n};\n\nexport const selectCommandRegistration = (\n command: CommandHandle,\n registrations: ReadonlySet<RegisteredCommand>,\n activeElement: Element | null,\n) => {\n const candidates = [...registrations].filter(\n (registration) => registration.command === command,\n );\n const focused = candidates.filter((registration) => {\n const element = registration.element();\n return Boolean(element && activeElement && element.contains(activeElement));\n });\n return (\n focused.reduce<RegisteredCommand | undefined>((selected, candidate) => {\n const selectedElement = selected?.element();\n const candidateElement = candidate.element();\n if (!selectedElement || !candidateElement) {\n return candidate;\n }\n return elementDepth(candidateElement) >= elementDepth(selectedElement)\n ? candidate\n : selected;\n }, undefined) ?? candidates.at(-1)\n );\n};\n\nconst currentActiveElement = () => document.activeElement;\n\nconst selectedRegistration = (\n command: CommandHandle,\n registrations: ReadonlySet<RegisteredCommand>,\n getActiveElement: () => Element | null = currentActiveElement,\n) => selectCommandRegistration(command, registrations, getActiveElement());\n\nexport const executeCommand = async (\n command: CommandHandle,\n registrations: ReadonlySet<RegisteredCommand>,\n getActiveElement: () => Element | null = currentActiveElement,\n) => {\n const selected = selectedRegistration(\n command,\n registrations,\n getActiveElement,\n );\n if (selected?.enabled()) {\n await selected.execute();\n }\n};\n\nexport type CommandEntry = {\n bindings: readonly ShortcutBinding[];\n disabledReason?: string;\n enabled: boolean;\n execute: () => Promise<void>;\n id: string;\n title: string;\n};\n\nexport const createCommandEntries = (\n definition: ClientAppDefinition,\n registrations: ReadonlySet<RegisteredCommand>,\n getActiveElement: () => Element | null = currentActiveElement,\n matchesMedia: (media: string) => boolean = (media) =>\n typeof window !== \"undefined\" && window.matchMedia(media).matches,\n): CommandEntry[] =>\n Object.values(definition.commands).flatMap((command) => {\n const selected = selectedRegistration(\n command,\n registrations,\n getActiveElement,\n );\n return selected\n ? [\n {\n bindings: activeCommandBindings(\n configuredCommandBindings(definition, command),\n matchesMedia,\n ),\n enabled: selected.enabled(),\n execute: () =>\n executeCommand(command, registrations, getActiveElement),\n id: command.id,\n title: command.title,\n },\n ]\n : [];\n });\n\nexport const CommandsContext = createContext<readonly CommandEntry[]>([]);\n\nexport const useCommands = () => useContext(CommandsContext);\n","import type { ContractInputArguments } from \"../../public/index\";\nimport {\n useMutation,\n useQuery,\n useQueryClient,\n type UseMutationResult,\n} from \"@tanstack/react-query\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { z } from \"zod\";\n\nimport { skipToken, type SkipToken, useRuntime } from \"./commands\";\n\ntype Resources<TConfig> = TConfig extends { resources?: infer TResources }\n ? NonNullable<TResources>\n : never;\ntype Operations<TConfig> = TConfig extends { operations?: infer TOperations }\n ? NonNullable<TOperations>\n : never;\ntype Streams<TConfig> = TConfig extends { streams?: infer TStreams }\n ? NonNullable<TStreams>\n : never;\ntype ContractOf<T> = T extends { contract: infer TContract }\n ? TContract\n : never;\ntype InputOf<T> = T extends { input: infer TInput extends z.ZodType }\n ? TInput\n : never;\ntype OutputOf<T> = T extends { output: infer TOutput extends z.ZodType }\n ? z.output<TOutput>\n : never;\ntype ClientMessageOf<T> =\n ContractOf<T> extends {\n clientMessage: infer TMessage extends z.ZodType;\n }\n ? z.input<TMessage>\n : never;\ntype ServerMessageOf<T> =\n ContractOf<T> extends {\n serverMessage: infer TMessage extends z.ZodType;\n }\n ? z.output<TMessage>\n : never;\ntype InputProperty<TInput extends z.ZodType> =\n undefined extends z.input<TInput>\n ? { input?: Exclude<z.input<TInput>, undefined> }\n : { input: z.input<TInput> };\ntype OperationOptions<TId extends string, TInput extends z.ZodType> = {\n id: TId;\n} & InputProperty<TInput>;\ntype UseResource<TServerConfig> = {\n <TId extends Extract<keyof Resources<TServerConfig>, string>>(\n options: OperationOptions<\n TId,\n InputOf<ContractOf<Resources<TServerConfig>[TId]>>\n >,\n ): ResourceResult<OutputOf<ContractOf<Resources<TServerConfig>[TId]>>>;\n <TId extends Extract<keyof Resources<TServerConfig>, string>>(options: {\n id: TId;\n input: SkipToken;\n }): undefined;\n <TId extends Extract<keyof Resources<TServerConfig>, string>>(options: {\n id: TId;\n input:\n | z.input<InputOf<ContractOf<Resources<TServerConfig>[TId]>>>\n | SkipToken;\n }):\n | ResourceResult<OutputOf<ContractOf<Resources<TServerConfig>[TId]>>>\n | undefined;\n};\n\nexport type ResourceResult<T> =\n | {\n data?: never;\n error?: never;\n refetch: () => void;\n status: \"pending\";\n }\n | {\n data?: T;\n error: Error;\n refetch: () => void;\n status: \"error\";\n }\n | {\n data: T;\n error?: never;\n refetch: () => void;\n status: \"success\";\n };\n\nexport type StreamResult<TClientMessage, TServerMessage> = {\n close: () => void;\n error?: Error;\n send: (message: TClientMessage) => boolean;\n status: \"closed\" | \"open\" | \"opening\";\n subscribe: (listener: (message: TServerMessage) => void) => () => void;\n};\n\ntype OperationResult<TInputSchema extends z.ZodType, TOutput> = Omit<\n UseMutationResult<TOutput, Error, z.input<TInputSchema>>,\n \"mutate\" | \"mutateAsync\"\n> & {\n mutate: (...args: ContractInputArguments<TInputSchema>) => void;\n mutateAsync: (\n ...args: ContractInputArguments<TInputSchema>\n ) => Promise<TOutput>;\n};\n\nconst inputKey = (input: unknown) => JSON.stringify(input) ?? \"\";\n\nconst useCanonicalInput = (input: unknown) => {\n const key = inputKey(input);\n return useMemo(() => (key ? JSON.parse(key) : undefined), [key]);\n};\n\nconst useResourceById = <TOutput>(\n id: string,\n input: unknown,\n skipped: boolean,\n): ResourceResult<TOutput> | undefined => {\n const { manifest, overmuxServerApi } = useRuntime();\n const queryClient = useQueryClient();\n const canonicalInput = useCanonicalInput(input);\n const queryKey = useMemo(\n () => [id, canonicalInput] as const,\n [canonicalInput, id],\n );\n const query = useQuery<TOutput, Error>({\n enabled: !skipped,\n queryFn: () =>\n overmuxServerApi.readResource({\n id,\n input: canonicalInput,\n }) as Promise<TOutput>,\n queryKey,\n });\n useEffect(\n () =>\n !skipped && manifest.resources.includes(id)\n ? overmuxServerApi.subscribeResource({\n id,\n input: canonicalInput,\n onError: () =>\n void queryClient.invalidateQueries({ exact: true, queryKey }),\n onInvalidate: () =>\n void queryClient.invalidateQueries({ exact: true, queryKey }),\n })\n : undefined,\n [\n manifest.resources,\n canonicalInput,\n id,\n overmuxServerApi,\n queryClient,\n queryKey,\n skipped,\n ],\n );\n const refetch = useCallback(() => {\n void queryClient.invalidateQueries({ exact: true, queryKey });\n }, [queryClient, queryKey]);\n if (skipped) {\n return undefined;\n }\n if (query.status === \"pending\") {\n return { refetch, status: \"pending\" };\n }\n if (query.status === \"error\") {\n return query.data === undefined\n ? { error: query.error, refetch, status: \"error\" }\n : { data: query.data, error: query.error, refetch, status: \"error\" };\n }\n return { data: query.data, refetch, status: \"success\" };\n};\n\nconst useOperationById = <TInputSchema extends z.ZodType, TOutput>(\n id: string,\n signal?: AbortSignal,\n): OperationResult<TInputSchema, TOutput> => {\n const { overmuxServerApi } = useRuntime();\n return useMutation<TOutput, Error, z.input<TInputSchema>>({\n mutationFn: (input) =>\n overmuxServerApi.executeOperation(id, input, signal) as Promise<TOutput>,\n }) as OperationResult<TInputSchema, TOutput>;\n};\n\nconst useStreamById = <TClientMessage, TServerMessage>(\n id: string,\n input: unknown,\n): StreamResult<TClientMessage, TServerMessage> => {\n const { manifest, overmuxServerApi } = useRuntime();\n const streamAvailable = manifest.streams.includes(id);\n const [state, setState] = useState<{\n error?: Error;\n status: \"closed\" | \"open\" | \"opening\";\n }>({ status: \"opening\" });\n const listeners = useMemo(\n () => new Set<(message: TServerMessage) => void>(),\n [],\n );\n const canonicalInput = useCanonicalInput(input);\n const streamRef = useRef<\n ReturnType<typeof overmuxServerApi.openStream> | undefined\n >(undefined);\n useEffect(() => {\n streamRef.current?.close();\n streamRef.current = undefined;\n if (!streamAvailable) {\n setState({ status: \"closed\" });\n return;\n }\n setState({ status: \"opening\" });\n const stream = overmuxServerApi.openStream({\n id,\n input: canonicalInput,\n onClose: () => setState({ status: \"closed\" }),\n onError: (error) => setState({ error, status: \"closed\" }),\n onOpen: () => setState({ status: \"open\" }),\n onMessage: (message) =>\n listeners.forEach((listener) => listener(message as TServerMessage)),\n });\n streamRef.current = stream;\n return () => {\n stream.close();\n if (streamRef.current === stream) {\n streamRef.current = undefined;\n }\n };\n }, [canonicalInput, id, listeners, overmuxServerApi, streamAvailable]);\n const close = useCallback(() => {\n streamRef.current?.close();\n streamRef.current = undefined;\n setState({ status: \"closed\" });\n }, []);\n const send = useCallback(\n (message: TClientMessage) => streamRef.current?.send(message) ?? false,\n [],\n );\n const subscribe = useCallback(\n (listener: (message: TServerMessage) => void) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n [listeners],\n );\n return {\n close,\n error: streamAvailable\n ? state.error\n : new Error(`Stream is not available: ${id}`),\n send,\n status: streamAvailable ? state.status : \"closed\",\n subscribe,\n };\n};\n\nexport const createOvermuxHooks = <TServerConfig>() => ({\n useOperation: <TId extends Extract<keyof Operations<TServerConfig>, string>>({\n id,\n signal,\n }: {\n id: TId;\n signal?: AbortSignal;\n }) => {\n type TInputSchema = InputOf<Operations<TServerConfig>[TId]>;\n type TOutput = OutputOf<Operations<TServerConfig>[TId]>;\n return useOperationById<TInputSchema, TOutput>(id, signal);\n },\n useResource: (({ id, input }: { id: string; input?: unknown }) =>\n useResourceById(\n id,\n input,\n input === skipToken,\n )) as UseResource<TServerConfig>,\n useStream: <TId extends Extract<keyof Streams<TServerConfig>, string>>({\n id,\n input,\n }: OperationOptions<TId, InputOf<ContractOf<Streams<TServerConfig>[TId]>>>) =>\n useStreamById<\n ClientMessageOf<Streams<TServerConfig>[TId]>,\n ServerMessageOf<Streams<TServerConfig>[TId]>\n >(id, input),\n});\n","import \"./theme-scope.css\";\n\nimport {\n createContext,\n type CSSProperties,\n type ReactNode,\n useCallback,\n useContext,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport type OvermuxScheme = \"dark\" | \"light\" | \"system\";\nexport type OvermuxContrast = \"auto\" | \"high\" | \"normal\";\n\nexport const overmuxThemeTokens = [\n \"--om-color-accent\",\n \"--om-color-accent-fg\",\n \"--om-color-border\",\n \"--om-color-canvas\",\n \"--om-color-danger\",\n \"--om-color-fg\",\n \"--om-color-muted\",\n \"--om-color-panel\",\n \"--om-color-success\",\n \"--om-color-surface\",\n \"--om-elevation\",\n \"--om-focus-ring\",\n \"--om-font-mono\",\n \"--om-font-sans\",\n \"--om-motion-duration\",\n \"--om-radius\",\n \"--om-spacing\",\n] as const;\n\nexport type OvermuxThemeToken = (typeof overmuxThemeTokens)[number];\n\nexport type OvermuxStyle = CSSProperties &\n Partial<Record<OvermuxThemeToken, number | string>>;\n\nexport type OvermuxExternalPortalContainer = {\n container: HTMLElement;\n scopeAttributesAndVariables: \"caller-owned\";\n};\n\nexport type OvermuxPortalProps = {\n children: ReactNode;\n external?: OvermuxExternalPortalContainer;\n};\n\nexport type OvermuxThemeScopeProps = {\n children: ReactNode;\n className?: string;\n contrast?: OvermuxContrast;\n scheme?: OvermuxScheme;\n style?: OvermuxStyle;\n};\n\nconst PortalRootContext = createContext<HTMLElement | null | undefined>(\n undefined,\n);\n\nexport const useOvermuxPortalContainer = (\n external?: OvermuxExternalPortalContainer,\n) => {\n const scopeRoot = useContext(PortalRootContext);\n if (external) {\n return external.container;\n }\n if (scopeRoot !== undefined) {\n return scopeRoot;\n }\n return typeof document === \"undefined\" ? null : document.body;\n};\n\nexport const OvermuxPortal = ({ children, external }: OvermuxPortalProps) => {\n const container = useOvermuxPortalContainer(external);\n return container ? createPortal(children, container) : null;\n};\n\nexport const OvermuxThemeScope = ({\n children,\n className,\n contrast = \"auto\",\n scheme = \"system\",\n style,\n}: OvermuxThemeScopeProps) => {\n const [portalRoot, setPortalRoot] = useState<HTMLDivElement | null>(null);\n const capturePortalRoot = useCallback((element: HTMLDivElement | null) => {\n setPortalRoot(element);\n }, []);\n\n return (\n <div\n className={className}\n data-om-contrast={contrast}\n data-om-scheme={scheme}\n data-om-scope=\"\"\n style={style}\n >\n <PortalRootContext.Provider value={portalRoot}>\n {children}\n </PortalRootContext.Provider>\n <div data-om-overlay-root=\"\" ref={capturePortalRoot} />\n </div>\n );\n};\n","import type { RuntimeManifest } from \"../shared/index\";\nimport type { ContractInputArguments } from \"../../public/index\";\nimport type { z } from \"zod\";\n\nimport type { ClientTransport } from \"./transport\";\n\ntype Operations<TConfig> = TConfig extends { operations?: infer TOperations }\n ? NonNullable<TOperations>\n : never;\ntype InputOf<T> = T extends { input: infer TInput extends z.ZodType }\n ? TInput\n : never;\ntype OutputOf<T> = T extends { output: infer TOutput extends z.ZodType }\n ? z.output<TOutput>\n : never;\ntype OperationId<TConfig> = Extract<keyof Operations<TConfig>, string>;\ntype OperationInput<TConfig, TId extends OperationId<TConfig>> = InputOf<\n Operations<TConfig>[TId]\n>;\ntype OperationOutput<TConfig, TId extends OperationId<TConfig>> = OutputOf<\n Operations<TConfig>[TId]\n>;\ntype OperationArguments<TInput extends z.ZodType> = [\n ...ContractInputArguments<TInput>,\n signal?: AbortSignal,\n];\n\nexport type OvermuxServerApi<TServerConfig> = {\n executeOperation: <TId extends OperationId<TServerConfig>>(\n id: TId,\n ...args: OperationArguments<OperationInput<TServerConfig, TId>>\n ) => Promise<OperationOutput<TServerConfig, TId>>;\n};\n\nexport type RuntimeOvermuxServerApi = {\n executeOperation: (\n id: string,\n input?: unknown,\n signal?: AbortSignal,\n ) => Promise<unknown>;\n openStream: (input: {\n id: string;\n input?: unknown;\n onClose: () => void;\n onError: (error: Error) => void;\n onMessage: (message: unknown) => void;\n onOpen: () => void;\n }) => { close: () => void; send: (message: unknown) => boolean };\n readResource: (input: { id: string; input?: unknown }) => Promise<unknown>;\n subscribeResource: (input: {\n id: string;\n input?: unknown;\n onError: (error: Error) => void;\n onInvalidate: () => void;\n }) => () => void;\n};\n\nconst availableName = (\n names: readonly string[],\n kind: \"Resource\" | \"Stream\",\n name: string,\n) => {\n if (!names.includes(name)) {\n throw new Error(`${kind} is not available: ${name}`);\n }\n return name;\n};\n\nexport const createOvermuxServerApi = ({\n manifest,\n transport,\n}: {\n manifest: RuntimeManifest;\n transport: ClientTransport;\n}): RuntimeOvermuxServerApi => ({\n executeOperation: (id, input, signal) => {\n if (!manifest.operations.includes(id)) {\n throw new Error(`Operation is not available: ${id}`);\n }\n return transport.invokeOperation({ input, name: id, signal });\n },\n openStream: ({ id, ...input }) =>\n transport.openStream({\n ...input,\n streamName: availableName(manifest.streams, \"Stream\", id),\n }),\n readResource: ({ id, input }) =>\n transport.readResource({\n input,\n resourceName: availableName(manifest.resources, \"Resource\", id),\n }),\n subscribeResource: ({ id, ...input }) =>\n transport.subscribeResource({\n ...input,\n resourceName: availableName(manifest.resources, \"Resource\", id),\n }),\n});\n","import type { ClientDiagnosticEvent } from \"../../shared/index\";\n\nconst maxStringLength = 2_000;\nconst truncate = (value: string, length = maxStringLength) =>\n value.length <= length ? value : `${value.slice(0, length)}…[truncated]`;\n\nconst serializeValue = (\n value: unknown,\n seen: WeakSet<object>,\n depth = 0,\n): unknown => {\n if (typeof value === \"string\") {\n return truncate(value);\n }\n if (\n value === null ||\n typeof value === \"boolean\" ||\n typeof value === \"number\"\n ) {\n return value;\n }\n if (typeof value === \"bigint\") {\n return `${value}n`;\n }\n if (typeof value === \"undefined\" || typeof value === \"symbol\") {\n return String(value);\n }\n if (typeof value === \"function\") {\n return `[Function ${value.name || \"anonymous\"}]`;\n }\n if (depth >= 4) {\n return \"[Max depth]\";\n }\n if (typeof value !== \"object\") {\n return truncate(String(value));\n }\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n if (value instanceof Error) {\n return {\n message: truncate(value.message),\n name: value.name,\n ...(value.stack ? { stack: truncate(value.stack, 8_000) } : {}),\n };\n }\n if (Array.isArray(value)) {\n return value\n .slice(0, 25)\n .map((item) => serializeValue(item, seen, depth + 1));\n }\n try {\n return Object.fromEntries(\n Object.entries(value)\n .slice(0, 25)\n .map(([key, item]) => [key, serializeValue(item, seen, depth + 1)]),\n );\n } catch {\n return `[Unserializable ${Object.prototype.toString.call(value)}]`;\n }\n};\n\nexport const serializeBrowserLogArguments = (values: unknown[]) => {\n const seen = new WeakSet<object>();\n const serialized = values.map((value) => serializeValue(value, seen));\n const json = JSON.stringify(serialized);\n return truncate(json, 16_000);\n};\n\nconst diagnosticUrl = () => {\n try {\n return `${location.origin}${location.pathname}`;\n } catch {\n return undefined;\n }\n};\n\nconst stackOf = (values: unknown[]) => {\n const error = values.find((value) => value instanceof Error);\n return error instanceof Error && error.stack\n ? truncate(error.stack, 8_000)\n : undefined;\n};\n\nexport const installBrowserLogForwarding = (\n report: (event: ClientDiagnosticEvent) => void,\n) => {\n const methods = [\"log\", \"info\", \"warn\", \"error\", \"debug\"] as const;\n const originals = Object.fromEntries(\n methods.map((level) => [level, console[level].bind(console)]),\n ) as Record<(typeof methods)[number], (...values: unknown[]) => void>;\n let reporting = false;\n const emit = (\n level: ClientDiagnosticEvent[\"level\"],\n values: unknown[],\n stack?: string,\n ) => {\n if (reporting) {\n return;\n }\n reporting = true;\n try {\n const serializedArguments = serializeBrowserLogArguments(values);\n report({\n arguments: serializedArguments,\n level,\n message: truncate(\n values\n .map((value) =>\n typeof value === \"string\" ? value : serializedArguments,\n )\n .join(\" \"),\n 4_000,\n ),\n ...(stack ? { stack: truncate(stack, 8_000) } : {}),\n timestamp: new Date().toISOString(),\n type: \"client-diagnostic\",\n ...(diagnosticUrl() ? { url: diagnosticUrl() } : {}),\n });\n } finally {\n reporting = false;\n }\n };\n methods.forEach((level) => {\n console[level] = (...values: unknown[]) => {\n originals[level](...values);\n emit(level, values, stackOf(values));\n };\n });\n const onError = (event: ErrorEvent) =>\n emit(\"error\", [event.message], event.error?.stack);\n const onRejection = (event: PromiseRejectionEvent) =>\n emit(\n \"error\",\n [\"Unhandled rejection\", event.reason],\n stackOf([event.reason]),\n );\n window.addEventListener(\"error\", onError);\n window.addEventListener(\"unhandledrejection\", onRejection);\n\n return () => {\n methods.forEach((level) => {\n console[level] = originals[level];\n });\n window.removeEventListener(\"error\", onError);\n window.removeEventListener(\"unhandledrejection\", onRejection);\n };\n};\n","import \"./desktop-host\";\nimport { notificationEventSchema } from \"../../shared/index\";\n\nimport type { WebSocketTransport } from \"../transport\";\n\n// Forwards server notifications to the optional desktop host injected at window.overmuxHost.\nexport const installNotificationForwarding = (transport: WebSocketTransport) =>\n transport.subscribeNotification((event) => {\n const notification = notificationEventSchema.safeParse(event);\n if (notification.success) {\n window.overmuxHost?.notifications?.show(notification.data);\n }\n });\n","import {\n type ReactNode,\n createContext,\n useCallback,\n useContext,\n useEffect,\n useState,\n type RefObject,\n} from \"react\";\nimport {\n matchesKeyBinding,\n platformBinding,\n type KeyBinding,\n} from \"@overmux/keybindings\";\n\nimport {\n activeCommandBindings,\n configuredCommandBindings,\n shortcutMediaQueries,\n type ClientAppDefinition,\n type CommandHandle,\n type ShortcutBinding,\n} from \"./client-definition\";\nimport {\n CommandsContext,\n createCommandEntries,\n executeCommand,\n selectCommandRegistration,\n type RegisteredCommand,\n} from \"./commands\";\n\nconst bindingSequence = (binding: ShortcutBinding): KeyBinding[] =>\n typeof binding === \"string\" ? [binding] : [...binding];\n\nconst normalizedBinding = (binding: ShortcutBinding): string[] =>\n bindingSequence(binding).map((key) => platformBinding(key));\n\nconst sequenceMatches = (\n binding: ShortcutBinding,\n pending: string[],\n event: KeyboardEvent,\n) => {\n const sequence = normalizedBinding(binding);\n return (\n sequence.length > pending.length &&\n pending.every((key, index) => sequence[index] === key) &&\n matchesKeyBinding(sequence[pending.length] as KeyBinding, event)\n );\n};\n\nconst isTextInput = (element: Element | null) =>\n element instanceof HTMLInputElement ||\n element instanceof HTMLSelectElement ||\n element instanceof HTMLTextAreaElement ||\n (element instanceof HTMLElement &&\n (element.isContentEditable || element.getAttribute(\"role\") === \"textbox\"));\n\nconst acceptsTextInput = (bindings: readonly ShortcutBinding[]) => {\n if (!(document.activeElement instanceof Element)) {\n return false;\n }\n const terminal = document.activeElement.closest(\".xterm\");\n if (!terminal) {\n return false;\n }\n if (terminal.closest(\"[data-copy-mode]\")) {\n return true;\n }\n return bindings.some((binding) => {\n const sequence = bindingSequence(binding);\n return (\n sequence.length > 1 ||\n sequence[0]?.startsWith(\"F\") ||\n sequence[0]?.includes(\"+\")\n );\n });\n};\n\ntype Shortcut = {\n bindings: readonly [ShortcutBinding, ...ShortcutBinding[]];\n command: CommandHandle;\n};\n\nconst flattenShortcuts = (\n definition: ClientAppDefinition,\n matchesMedia: (media: string) => boolean,\n): Shortcut[] =>\n Object.values(definition.commands).flatMap((command) => {\n const bindings = activeCommandBindings(\n configuredCommandBindings(definition, command),\n matchesMedia,\n );\n return bindings.length\n ? [\n {\n bindings: bindings as [ShortcutBinding, ...ShortcutBinding[]],\n command,\n },\n ]\n : [];\n });\n\nconst canRunShortcut = (\n shortcut: Shortcut,\n event: KeyboardEvent,\n registrations: ReadonlySet<RegisteredCommand>,\n) => {\n const selected = selectCommandRegistration(\n shortcut.command,\n registrations,\n document.activeElement,\n );\n return Boolean(\n selected?.enabled() &&\n !event.repeat &&\n !(\n isTextInput(document.activeElement) &&\n !acceptsTextInput(shortcut.bindings)\n ),\n );\n};\n\nconst runShortcut = (\n shortcut: Shortcut,\n event: KeyboardEvent,\n registrations: ReadonlySet<RegisteredCommand>,\n) => {\n if (!canRunShortcut(shortcut, event, registrations)) {\n return false;\n }\n void executeCommand(shortcut.command, registrations);\n event.preventDefault();\n return true;\n};\n\nexport type ShortcutInputTarget = {\n container: RefObject<HTMLElement | null>;\n input: RefObject<HTMLElement | null>;\n};\ntype RegisterShortcutInputTarget = (target: ShortcutInputTarget) => () => void;\n\nconst ShortcutInputTargetsContext = createContext<\n RegisterShortcutInputTarget | undefined\n>(undefined);\n\nexport const useShortcutInputTarget = (target: ShortcutInputTarget) => {\n const register = useContext(ShortcutInputTargetsContext);\n const { container, input } = target;\n useEffect(\n () => register?.({ container, input }),\n [container, input, register],\n );\n};\n\nconst elementDepth = (element: HTMLElement) => {\n let depth = 0;\n for (\n let current: HTMLElement | null = element;\n current;\n current = current.parentElement\n ) {\n depth += 1;\n }\n return depth;\n};\n\nconst selectShortcutInputTarget = (\n targets: ReadonlySet<ShortcutInputTarget>,\n activeElement: Element | null,\n) =>\n [...targets]\n .filter((target) => {\n const container = target.container.current;\n return Boolean(\n container && activeElement && container.contains(activeElement),\n );\n })\n .reduce<ShortcutInputTarget | undefined>((selected, candidate) => {\n const selectedElement = selected?.container.current;\n const candidateElement = candidate.container.current;\n if (!selectedElement || !candidateElement) {\n return candidate;\n }\n return elementDepth(candidateElement) >= elementDepth(selectedElement)\n ? candidate\n : selected;\n }, undefined);\n\nconst replayedKeyboardEvents = new WeakSet<KeyboardEvent>();\nconst keyboardEventProperties = [\"charCode\", \"keyCode\", \"which\"] as const;\n\nconst replayKeyboardEvent = (target: HTMLElement, source: KeyboardEvent) => {\n const replay = new KeyboardEvent(source.type, {\n altKey: source.altKey,\n bubbles: true,\n cancelable: true,\n code: source.code,\n composed: true,\n ctrlKey: source.ctrlKey,\n key: source.key,\n location: source.location,\n metaKey: source.metaKey,\n repeat: source.repeat,\n shiftKey: source.shiftKey,\n });\n keyboardEventProperties.forEach((property) =>\n Object.defineProperty(replay, property, { value: source[property] }),\n );\n replayedKeyboardEvents.add(replay);\n target.dispatchEvent(replay);\n};\n\nconst replayChord = (\n target: ShortcutInputTarget | undefined,\n events: readonly KeyboardEvent[],\n) => {\n const input = target?.input.current;\n if (!input) {\n return;\n }\n events.forEach((event) => replayKeyboardEvent(input, event));\n};\n\nexport const ShortcutHost = ({\n children,\n definition,\n registrations,\n registrationRevision,\n}: {\n children: ReactNode;\n definition: ClientAppDefinition;\n registrations: Set<RegisteredCommand>;\n registrationRevision: number;\n}) => {\n const [, setFocusRevision] = useState(0);\n const [inputTargets] = useState(() => new Set<ShortcutInputTarget>());\n const [mediaRevision, setMediaRevision] = useState(0);\n const registerInputTarget = useCallback(\n (target: ShortcutInputTarget) => {\n inputTargets.add(target);\n return () => {\n inputTargets.delete(target);\n };\n },\n [inputTargets],\n );\n useEffect(() => {\n const refreshMedia = () => setMediaRevision((revision) => revision + 1);\n const queries = shortcutMediaQueries(definition).map((media) =>\n window.matchMedia(media),\n );\n queries.forEach((query) => query.addEventListener(\"change\", refreshMedia));\n return () =>\n queries.forEach((query) =>\n query.removeEventListener(\"change\", refreshMedia),\n );\n }, [definition]);\n useEffect(() => {\n const refreshFocus = () => setFocusRevision((revision) => revision + 1);\n window.addEventListener(\"focusin\", refreshFocus);\n return () => window.removeEventListener(\"focusin\", refreshFocus);\n }, []);\n useEffect(() => {\n const shortcuts = flattenShortcuts(\n definition,\n (media) => window.matchMedia(media).matches,\n );\n let pending: string[] = [];\n let pendingEvents: KeyboardEvent[] = [];\n let pendingTarget: ShortcutInputTarget | undefined;\n let timeout: number | undefined;\n const clearPending = () => {\n pending = [];\n pendingEvents = [];\n pendingTarget = undefined;\n if (timeout !== undefined) {\n window.clearTimeout(timeout);\n timeout = undefined;\n }\n };\n const replayPending = (events = pendingEvents) => {\n replayChord(pendingTarget, events);\n clearPending();\n };\n const scheduleTimeout = () => {\n if (timeout !== undefined) {\n window.clearTimeout(timeout);\n }\n timeout = window.setTimeout(() => replayPending(), 1_000);\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (replayedKeyboardEvents.has(event)) {\n return;\n }\n if (pending.length && event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n clearPending();\n return;\n }\n const matches = shortcuts.flatMap((shortcut) =>\n shortcut.bindings\n .filter(\n (binding) =>\n sequenceMatches(binding, pending, event) &&\n canRunShortcut(shortcut, event, registrations),\n )\n .map((binding) => ({ binding, shortcut })),\n );\n if (!matches.length) {\n if (pending.length) {\n event.preventDefault();\n event.stopPropagation();\n replayPending([...pendingEvents, event]);\n }\n return;\n }\n const complete = matches.find(\n ({ binding }) =>\n normalizedBinding(binding).length === pending.length + 1,\n );\n if (complete) {\n clearPending();\n if (runShortcut(complete.shortcut, event, registrations)) {\n event.stopPropagation();\n }\n return;\n }\n if (!pending.length) {\n const shouldReplay = definition.chordPrefixes?.some((prefix) =>\n matchesKeyBinding(prefix.binding, event),\n );\n pendingTarget = shouldReplay\n ? selectShortcutInputTarget(inputTargets, document.activeElement)\n : undefined;\n }\n pending = [\n ...pending,\n normalizedBinding(matches[0]!.binding)[pending.length]!,\n ];\n pendingEvents = [...pendingEvents, event];\n event.preventDefault();\n event.stopPropagation();\n scheduleTimeout();\n };\n window.addEventListener(\"keydown\", onKeyDown, { capture: true });\n return () => {\n window.removeEventListener(\"keydown\", onKeyDown, { capture: true });\n if (timeout !== undefined) {\n window.clearTimeout(timeout);\n }\n };\n }, [\n definition,\n inputTargets,\n mediaRevision,\n registrationRevision,\n registrations,\n ]);\n const commands = createCommandEntries(\n definition,\n registrations,\n () => document.activeElement,\n (media) => window.matchMedia(media).matches,\n );\n return (\n <ShortcutInputTargetsContext.Provider value={registerInputTarget}>\n <CommandsContext.Provider value={commands}>\n {children}\n </CommandsContext.Provider>\n </ShortcutInputTargetsContext.Provider>\n );\n};\n","import {\n clientProtocolMessageSchema,\n decodeProtocolFrame,\n encodeProtocolMessage,\n serverProtocolMessageSchema,\n streamMessageSchema,\n webSocketCloseCode,\n type ClientDiagnosticEvent,\n type ClientProtocolMessage,\n type ServerLifecycleEvent,\n} from \"../shared/index\";\n\ntype Request = {\n reject: (error: Error) => void;\n resolve: (output: unknown) => void;\n};\ntype Subscription = {\n input: unknown;\n onError: (error: Error) => void;\n onInvalidate: () => void;\n resourceName: string;\n};\ntype StreamMessage = Extract<ClientProtocolMessage, { type: \"stream-message\" }>;\n\ntype Stream = {\n input: unknown;\n onOpen: () => void;\n onClose: () => void;\n onError: (error: Error) => void;\n onMessage: (message: unknown) => void;\n pendingMessages: StreamMessage[];\n status: \"disconnected\" | \"failed\" | \"open\" | \"opening\";\n streamName: string;\n};\n\nconst maxWebSocketBufferedBytes = 1_048_576;\n\nexport type TransportStatus =\n | \"authentication-required\"\n | \"connecting\"\n | \"connected\"\n | \"disconnected\";\n\nexport type WebSocketTransport = {\n activate: () => void;\n dispose: () => void;\n openStream: (input: {\n input?: unknown;\n onClose: () => void;\n onError: (error: Error) => void;\n onOpen: () => void;\n onMessage: (message: unknown) => void;\n streamName: string;\n }) => { close: () => void; send: (message: unknown) => boolean };\n readResource: (input: {\n input?: unknown;\n resourceName: string;\n }) => Promise<unknown>;\n reportDiagnostic: (event: ClientDiagnosticEvent) => void;\n subscribeResource: (input: {\n input?: unknown;\n onError: (error: Error) => void;\n onInvalidate: () => void;\n resourceName: string;\n }) => () => void;\n subscribeStatus: (listener: (status: TransportStatus) => void) => () => void;\n subscribeLifecycle: (\n listener: (event: ServerLifecycleEvent) => void,\n ) => () => void;\n subscribeNotification: (listener: (event: unknown) => void) => () => void;\n};\n\nconst socketUrl = () =>\n `${location.protocol === \"https:\" ? \"wss:\" : \"ws:\"}//${location.host}/api/socket`;\n\nconst operationId = () => {\n const randomUUID = crypto.randomUUID?.();\n if (randomUUID) {\n return randomUUID;\n }\n const bytes = crypto.getRandomValues(new Uint8Array(16));\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = Array.from(bytes, (byte) =>\n byte.toString(16).padStart(2, \"0\"),\n ).join(\"\");\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n};\nconst disconnected = () => new Error(\"Overmux transport disconnected.\");\n\nexport const createWebSocketTransport = ({\n createSocket = () => new WebSocket(socketUrl()),\n}: {\n createSocket?: () => WebSocket;\n} = {}): WebSocketTransport => {\n let active = false;\n let disposed = false;\n let reconnectDelay = 250;\n let reconnectTimer: ReturnType<typeof setTimeout> | undefined;\n let socket: WebSocket | undefined;\n let status: TransportStatus = \"disconnected\";\n const diagnosticQueue: ClientDiagnosticEvent[] = [];\n const requests = new Map<string, Request>();\n const subscriptions = new Map<string, Subscription>();\n const streams = new Map<string, Stream>();\n const lifecycleListeners = new Set<(event: ServerLifecycleEvent) => void>();\n const notificationListeners = new Set<(event: unknown) => void>();\n const statusListeners = new Set<(status: TransportStatus) => void>();\n\n const setStatus = (next: TransportStatus) => {\n if (status === next) {\n return;\n }\n status = next;\n statusListeners.forEach((listener) => listener(status));\n };\n const send = (message: unknown) => {\n if (socket?.readyState !== WebSocket.OPEN) {\n return false;\n }\n // Apply outbound backpressure before queued messages consume unbounded memory.\n if (socket.bufferedAmount > maxWebSocketBufferedBytes) {\n socket.close(1013, \"client could not keep up\");\n return false;\n }\n socket.send(\n encodeProtocolMessage(clientProtocolMessageSchema.parse(message)),\n );\n return true;\n };\n const flushDiagnostics = () => {\n const unsent = diagnosticQueue.filter((event) => !send(event));\n diagnosticQueue.splice(0, diagnosticQueue.length, ...unsent);\n };\n const request = ({\n input,\n resourceName,\n }: {\n input?: unknown;\n resourceName: string;\n }) =>\n new Promise<unknown>((resolve, reject) => {\n const id = operationId();\n requests.set(id, { reject, resolve });\n const message = {\n input,\n operationId: id,\n resourceName,\n type: \"resource-read\",\n };\n if (!send(message)) {\n requests.delete(id);\n reject(disconnected());\n }\n });\n const restore = () => {\n subscriptions.forEach(\n ({ input, onInvalidate, resourceName }, subscriptionId) => {\n if (\n send({\n input,\n operationId: subscriptionId,\n resourceName,\n subscriptionId,\n type: \"resource-subscribe\",\n })\n ) {\n onInvalidate();\n }\n },\n );\n streams.forEach((stream, streamId) => {\n if (stream.status === \"failed\") {\n return;\n }\n stream.status = send({\n input: stream.input,\n operationId: streamId,\n streamId,\n streamName: stream.streamName,\n type: \"stream-open\",\n })\n ? \"opening\"\n : \"disconnected\";\n });\n };\n const rejectRequests = (error: Error) => {\n requests.forEach(({ reject }) => reject(error));\n requests.clear();\n };\n const reportDisconnect = () => {\n const error = disconnected();\n rejectRequests(error);\n subscriptions.forEach(({ onError }) => onError(error));\n streams.forEach((stream) => {\n stream.pendingMessages.length = 0;\n if (stream.status !== \"failed\") {\n stream.status = \"disconnected\";\n }\n stream.onError(error);\n });\n };\n const connect = () => {\n if (!active || disposed || socket) {\n return;\n }\n setStatus(\"connecting\");\n const next = createSocket();\n next.binaryType = \"arraybuffer\";\n socket = next;\n next.addEventListener(\"open\", () => {\n if (socket !== next) {\n return;\n }\n reconnectDelay = 250;\n setStatus(\"connected\");\n flushDiagnostics();\n restore();\n });\n next.addEventListener(\"message\", (event) => {\n if (socket !== next) {\n return;\n }\n let decoded: unknown;\n try {\n decoded = decodeProtocolFrame(event.data as string | ArrayBuffer);\n } catch (cause) {\n reportDisconnect();\n console.error(\"Invalid Overmux transport message\", cause);\n next.close(1002, \"invalid protocol message\");\n return;\n }\n const parsed = serverProtocolMessageSchema.safeParse(decoded);\n if (!parsed.success) {\n reportDisconnect();\n console.error(\"Invalid Overmux transport message\", parsed.error);\n next.close(1002, \"invalid protocol message\");\n return;\n }\n const message = parsed.data;\n if (\n message.type === \"update-available\" ||\n message.type === \"restarting\"\n ) {\n lifecycleListeners.forEach((listener) => listener(message));\n }\n if (message.type === \"notification\") {\n notificationListeners.forEach((listener) => listener(message));\n }\n if (message.type === \"resource-invalidated\") {\n subscriptions.get(message.subscriptionId)?.onInvalidate();\n }\n if (message.type === \"stream-opened\") {\n const stream = streams.get(message.streamId);\n if (stream?.status === \"opening\") {\n stream.status = \"open\";\n const pendingMessages = stream.pendingMessages.splice(0);\n if (pendingMessages.every(send)) {\n stream.onOpen();\n }\n }\n }\n if (message.type === \"stream-output\") {\n streams.get(message.streamId)?.onMessage(message.message);\n }\n if (message.type === \"stream-closed\") {\n const stream = streams.get(message.streamId);\n if (stream) {\n stream.pendingMessages.length = 0;\n stream.onClose();\n streams.delete(message.streamId);\n }\n }\n if (message.type === \"error\") {\n if (message.operationId) {\n requests.get(message.operationId)?.reject(new Error(message.message));\n }\n const stream = streams.get(message.operationId ?? \"\");\n if (stream) {\n stream.pendingMessages.length = 0;\n stream.status = \"failed\";\n stream.onError(new Error(message.message));\n }\n subscriptions\n .get(message.operationId ?? \"\")\n ?.onError(new Error(message.message));\n requests.delete(message.operationId ?? \"\");\n }\n if (message.type === \"resource-result\") {\n requests.get(message.operationId)?.resolve(message.output);\n requests.delete(message.operationId);\n }\n });\n next.addEventListener(\"close\", (event) => {\n if (socket !== next || disposed) {\n return;\n }\n socket = undefined;\n reportDisconnect();\n if (event.code === webSocketCloseCode.authenticationRevoked) {\n active = false;\n setStatus(\"authentication-required\");\n return;\n }\n setStatus(\"disconnected\");\n reconnectTimer = setTimeout(() => {\n reconnectTimer = undefined;\n connect();\n }, reconnectDelay);\n reconnectDelay = Math.min(reconnectDelay * 2, 5_000);\n });\n };\n\n return {\n activate: () => {\n active = true;\n connect();\n },\n dispose: () => {\n disposed = true;\n if (reconnectTimer !== undefined) {\n clearTimeout(reconnectTimer);\n }\n reportDisconnect();\n streams.forEach(({ onClose }) => onClose());\n streams.clear();\n subscriptions.clear();\n socket?.close();\n },\n openStream: ({\n input,\n onClose,\n onError,\n onMessage,\n onOpen,\n streamName,\n }) => {\n if (!active || disposed) {\n onError(disconnected());\n return { close: () => {}, send: () => false };\n }\n const streamId = operationId();\n const stream: Stream = {\n input,\n onClose,\n onError,\n onMessage,\n onOpen,\n pendingMessages: [],\n status: \"disconnected\",\n streamName,\n };\n streams.set(streamId, stream);\n // Initial connection is not a failure: restore sends stream-open when the socket\n // opens, then stream-opened flushes queued messages. Actual failures still reject.\n stream.status =\n socket?.readyState === WebSocket.CONNECTING ||\n send({\n input,\n operationId: streamId,\n streamId,\n streamName,\n type: \"stream-open\",\n })\n ? \"opening\"\n : \"disconnected\";\n if (stream.status === \"disconnected\") {\n onError(disconnected());\n }\n return {\n close: () => {\n const activeStream = streams.get(streamId);\n if (activeStream) {\n activeStream.pendingMessages.length = 0;\n activeStream.onClose();\n streams.delete(streamId);\n }\n send({ streamId, type: \"stream-close\" });\n },\n send: (message) => {\n const activeStream = streams.get(streamId);\n if (\n activeStream?.status !== \"open\" &&\n activeStream?.status !== \"opening\"\n ) {\n return false;\n }\n const protocolMessage = streamMessageSchema.parse({\n message,\n streamId,\n type: \"stream-message\",\n });\n if (activeStream.status === \"opening\") {\n activeStream.pendingMessages.push(protocolMessage);\n return true;\n }\n return send(protocolMessage);\n },\n };\n },\n readResource: (input) => request(input),\n reportDiagnostic: (event) => {\n if (send(event)) {\n return;\n }\n diagnosticQueue.push(event);\n if (diagnosticQueue.length > 100) {\n diagnosticQueue.shift();\n }\n },\n subscribeResource: ({ input, onError, onInvalidate, resourceName }) => {\n const subscriptionId = operationId();\n subscriptions.set(subscriptionId, {\n input,\n onError,\n onInvalidate,\n resourceName,\n });\n if (\n !send({\n input,\n operationId: subscriptionId,\n resourceName,\n subscriptionId,\n type: \"resource-subscribe\",\n })\n ) {\n onError(disconnected());\n }\n return () => {\n subscriptions.delete(subscriptionId);\n send({ subscriptionId, type: \"resource-unsubscribe\" });\n };\n },\n subscribeStatus: (listener) => {\n statusListeners.add(listener);\n listener(status);\n return () => statusListeners.delete(listener);\n },\n subscribeLifecycle: (listener) => {\n lifecycleListeners.add(listener);\n return () => lifecycleListeners.delete(listener);\n },\n subscribeNotification: (listener) => {\n notificationListeners.add(listener);\n return () => notificationListeners.delete(listener);\n },\n };\n};\n","import { createContext, useContext } from \"react\";\n\nimport {\n createWebSocketTransport,\n type WebSocketTransport,\n type TransportStatus,\n} from \"./websocket\";\n\nexport type ClientTransport = WebSocketTransport & {\n invokeOperation: (input: {\n input?: unknown;\n name: string;\n signal?: AbortSignal;\n }) => Promise<unknown>;\n};\n\nexport const TransportContext = createContext<ClientTransport | undefined>(\n undefined,\n);\n\nexport const useTransport = () => {\n const transport = useContext(TransportContext);\n if (!transport) {\n throw new Error(\n \"Overmux transport hooks must be used inside an active Overmux client runtime\",\n );\n }\n return transport;\n};\n\nconst operationError = async (response: Response) => {\n const body = await response.text();\n try {\n const error = (JSON.parse(body) as { error?: unknown }).error;\n if (typeof error === \"string\") {\n return new Error(error);\n }\n } catch {}\n return new Error(\n `Operation request failed: ${response.status} ${response.statusText}`,\n );\n};\n\nexport const createClientTransport = ({\n createSocket,\n fetch: fetchRequest = globalThis.fetch,\n}: {\n createSocket?: () => WebSocket;\n fetch?: typeof globalThis.fetch;\n} = {}): ClientTransport => ({\n ...createWebSocketTransport({ createSocket }),\n invokeOperation: async ({ input, name, signal }) => {\n const response = await fetchRequest(\n `/api/operations/${encodeURIComponent(name)}`,\n {\n body: input === undefined ? undefined : JSON.stringify(input),\n headers: { \"content-type\": \"application/json\" },\n method: \"POST\",\n signal,\n },\n );\n if (!response.ok) {\n throw await operationError(response);\n }\n return response.status === 204 ? undefined : response.json();\n },\n});\n\nexport type { WebSocketTransport, TransportStatus };\n","import \"./hosted-page.css\";\n\nimport type { ReactNode } from \"react\";\n\nexport const HostedPage = ({ children }: { children: ReactNode }) => (\n <main data-om-hosted-page=\"\">\n <article data-om-hosted-panel=\"\">{children}</article>\n </main>\n);\n","import { useEffect, useState } from \"react\";\n\nimport { HostedPage } from \"./hosted-page\";\n\nconst logoutRequests = new WeakMap<Document, Promise<void>>();\nconst minimumLogoutDuration = 3_000;\n\nconst requestLogout = () => {\n const existing = logoutRequests.get(document);\n if (existing) {\n return existing;\n }\n const request = fetch(\"/api/auth/logout\", { method: \"POST\" }).then(\n (response) => {\n if (!response.ok) {\n throw new Error(`Logout failed: ${response.status}`);\n }\n },\n );\n logoutRequests.set(document, request);\n return request;\n};\n\nconst minimumDelay = () =>\n new Promise<void>((resolve) => setTimeout(resolve, minimumLogoutDuration));\n\nexport const HostedLogoutPage = () => {\n const [attempt, setAttempt] = useState(0);\n const [error, setError] = useState(false);\n\n useEffect(() => {\n let active = true;\n setError(false);\n void Promise.allSettled([requestLogout(), minimumDelay()]).then(\n ([logout]) => {\n if (!active) {\n return;\n }\n if (logout?.status === \"fulfilled\") {\n location.replace(\"/login\");\n return;\n }\n setError(true);\n },\n );\n return () => {\n active = false;\n };\n }, [attempt]);\n\n return (\n <HostedPage>\n <h1>{error ? \"Log out failed\" : \"Logging out…\"}</h1>\n {error ? (\n <>\n <p role=\"alert\">\n Overmux could not log you out. Check your connection and try again.\n </p>\n <button\n data-om-hosted-retry=\"\"\n onClick={() => {\n logoutRequests.delete(document);\n setAttempt((current) => current + 1);\n }}\n type=\"button\"\n >\n Retry\n </button>\n </>\n ) : (\n <p>Please wait while Overmux ends your session.</p>\n )}\n </HostedPage>\n );\n};\n","import { useCallback, useEffect, useState } from \"react\";\n\nimport {\n disableBackgroundNotifications,\n enableBackgroundNotifications,\n reconciledStatus,\n type BackgroundNotificationStatus,\n} from \"../../background-notifications\";\n\nconst statusMessage = (status: BackgroundNotificationStatus) => {\n const messages: Record<BackgroundNotificationStatus, string> = {\n checking: \"Checking background notification status…\",\n denied:\n \"Background notifications are blocked in this browser's site settings.\",\n disabled: \"Background notifications are disabled for this browser.\",\n enabled: \"Background notifications are enabled for this browser.\",\n error: \"Background notification settings could not be updated. Try again.\",\n \"ios-home-screen\":\n \"On iPhone or iPad, add Overmux to the Home Screen before enabling background notifications.\",\n unsupported: \"Background notifications are not supported in this browser.\",\n };\n return messages[status];\n};\n\nexport const BrowserNotificationSettings = () => {\n const [status, setStatus] =\n useState<BackgroundNotificationStatus>(\"checking\");\n\n useEffect(() => {\n let active = true;\n const reconcile = () => {\n void reconciledStatus()\n .then((next) => {\n if (active) {\n setStatus(next);\n }\n })\n .catch(() => {\n if (active) {\n setStatus(\"error\");\n }\n });\n };\n const onVisibilityChange = () => {\n if (document.visibilityState === \"visible\") {\n reconcile();\n }\n };\n reconcile();\n document.addEventListener(\"visibilitychange\", onVisibilityChange);\n navigator.serviceWorker?.addEventListener(\"controllerchange\", reconcile);\n return () => {\n active = false;\n document.removeEventListener(\"visibilitychange\", onVisibilityChange);\n navigator.serviceWorker?.removeEventListener(\n \"controllerchange\",\n reconcile,\n );\n };\n }, []);\n\n const enable = useCallback(async () => {\n try {\n setStatus(\"checking\");\n const enabled = await enableBackgroundNotifications();\n setStatus(\n enabled\n ? \"enabled\"\n : Notification.permission === \"denied\"\n ? \"denied\"\n : \"disabled\",\n );\n } catch {\n setStatus(\"error\");\n }\n }, []);\n\n const disable = useCallback(async () => {\n try {\n setStatus(\"checking\");\n await disableBackgroundNotifications();\n setStatus(\"disabled\");\n } catch {\n setStatus(\"error\");\n }\n }, []);\n\n const canEnable = status === \"disabled\" || status === \"error\";\n const canDisable = status === \"enabled\" || status === \"error\";\n return (\n <div data-om-browser-notifications=\"\">\n <h3>Browser notifications</h3>\n <p aria-live=\"polite\" data-om-background-notifications-status=\"\">\n {statusMessage(status)}\n </p>\n <div data-om-hosted-actions=\"\">\n {canEnable ? (\n <button\n data-om-background-notifications-enable=\"\"\n onClick={enable}\n type=\"button\"\n >\n Enable\n </button>\n ) : null}\n {canDisable ? (\n <button\n data-om-background-notifications-disable=\"\"\n onClick={disable}\n type=\"button\"\n >\n Disable\n </button>\n ) : null}\n </div>\n </div>\n );\n};\n","import { overmuxLogoutPath, resolveOvermuxReturnTo } from \"@overmux/shared\";\nimport { BrowserNotificationSettings } from \"./browser-notification-settings\";\nimport { HostedPage } from \"./hosted-page\";\n\nconst DesktopNotificationSettings = () => (\n <div data-om-desktop-notifications=\"\">\n <h3>Desktop notifications</h3>\n <p>\n Notifications are delivered through the Overmux desktop app and managed by\n the OS. Change notification permissions and preferences in your operating\n system's settings.\n </p>\n </div>\n);\n\nexport const HostedSettingsPage = () => {\n const returnTo = resolveOvermuxReturnTo(\n new URLSearchParams(location.search).get(\"returnTo\"),\n );\n const desktopNotifications = Boolean(window.overmuxHost?.notifications);\n\n return (\n <HostedPage>\n <header data-om-hosted-header=\"\">\n <h1>Overmux settings</h1>\n <a href={returnTo}>Back to Overmux</a>\n </header>\n <section data-om-hosted-section=\"\">\n <h2>Notifications</h2>\n {desktopNotifications ? (\n <DesktopNotificationSettings />\n ) : (\n <BrowserNotificationSettings />\n )}\n </section>\n <section data-om-hosted-section=\"\">\n <h2>Session</h2>\n <p>End this Overmux session on this device.</p>\n <a data-om-hosted-button=\"\" href={overmuxLogoutPath}>\n Log out\n </a>\n </section>\n </HostedPage>\n );\n};\n","import \"./recovery-screen.css\";\n\nexport const RecoveryScreen = ({ error }: { error?: string }) => (\n <main data-om-recovery=\"\">\n <section data-om-recovery-panel=\"\">\n <h1 data-om-recovery-title=\"\">Overmux recovery</h1>\n {error ? <pre data-om-recovery-error=\"\">{error}</pre> : null}\n <button\n data-om-recovery-reload=\"\"\n onClick={() => location.reload()}\n type=\"button\"\n >\n Reload\n </button>\n </section>\n </main>\n);\n","//#region src/delay.ts\nconst delay = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds));\n//#endregion\n//#region src/duration.ts\nconst durationPattern = /^([1-9]\\d*)(ms|s|m|h|d)$/;\nconst millisecondsByUnit = {\n\td: 1440 * 60 * 1e3,\n\th: 3600 * 1e3,\n\tm: 60 * 1e3,\n\tms: 1,\n\ts: 1e3\n};\nconst durationToMilliseconds = (duration) => {\n\tconst match = durationPattern.exec(duration);\n\tif (!match) return;\n\tconst unit = match[2];\n\tconst milliseconds = Number(match[1]) * millisecondsByUnit[unit];\n\treturn Number.isSafeInteger(milliseconds) ? milliseconds : void 0;\n};\n//#endregion\nexport { delay, durationToMilliseconds };\n\n//# sourceMappingURL=index.js.map","// Presents update availability and coordinates browser-side restart recovery.\n// Every browser follows the server broadcast and reloads only after health returns.\n\nimport \"./update-popover.css\";\n\nimport { delay } from \"@overmux/lib\";\nimport { useCallback, useEffect, useReducer, useRef, useState } from \"react\";\n\nimport type { ServerLifecycleEvent } from \"../../shared/index\";\nimport type { ClientTransport, TransportStatus } from \"../transport\";\n\ntype UpdateState =\n | { type: \"current\" }\n | { type: \"available\"; error?: string }\n | { type: \"requesting\" }\n | { type: \"restarting\" };\ntype UpdateAction =\n | ServerLifecycleEvent\n | { type: \"restart-requested\" }\n | { type: \"restart-failed\"; error: string };\ntype ConnectionState = \"initial\" | \"connected\" | \"reconnecting\";\n\nconst reduceUpdateState = (\n _state: UpdateState,\n action: UpdateAction,\n): UpdateState => {\n if (action.type === \"update-available\") {\n return { type: \"available\" };\n }\n if (action.type === \"restart-requested\") {\n return { type: \"requesting\" };\n }\n if (action.type === \"restart-failed\") {\n return { type: \"available\", error: action.error };\n }\n return { type: \"restarting\" };\n};\n\nconst pollUntilHealthy = async (signal: AbortSignal): Promise<void> => {\n if (signal.aborted) {\n return;\n }\n try {\n const response = await fetch(\"/api/health\", {\n cache: \"no-store\",\n signal,\n });\n if (response.ok) {\n location.reload();\n return;\n }\n } catch {}\n await delay(250);\n return pollUntilHealthy(signal);\n};\n\nconst ReconnectingScreen = () => (\n <main aria-live=\"polite\" data-om-reconnecting=\"\" role=\"status\">\n <section data-om-reconnecting-panel=\"\">\n <h1 data-om-reconnecting-title=\"\">Reconnecting</h1>\n <p data-om-reconnecting-message=\"\">\n Reconnecting to Overmux. Your workspace will resume shortly.\n </p>\n </section>\n </main>\n);\n\nconst useUpdateState = (transport: ClientTransport) => {\n const [state, dispatch] = useReducer(reduceUpdateState, { type: \"current\" });\n\n useEffect(\n () => transport.subscribeLifecycle((event) => dispatch(event)),\n [transport],\n );\n useEffect(() => {\n if (state.type !== \"restarting\") {\n return;\n }\n const controller = new AbortController();\n void pollUntilHealthy(controller.signal);\n return () => controller.abort();\n }, [state.type]);\n\n const requestRestart = useCallback(async () => {\n dispatch({ type: \"restart-requested\" });\n try {\n const response = await fetch(\"/api/restart\", { method: \"POST\" });\n if (!response.ok) {\n throw new Error(`Restart request failed: ${response.status}`);\n }\n dispatch({ type: \"restarting\" });\n } catch (cause) {\n const error = cause instanceof Error ? cause.message : String(cause);\n dispatch({ type: \"restart-failed\", error });\n }\n }, []);\n\n return { requestRestart, state };\n};\n\nconst useConnectionState = (transport: ClientTransport) => {\n const connected = useRef(false);\n const [connection, setConnection] = useState<ConnectionState>(\"initial\");\n\n useEffect(\n () =>\n transport.subscribeStatus((status: TransportStatus) => {\n if (status === \"connected\") {\n connected.current = true;\n setConnection(\"connected\");\n return;\n }\n if (!connected.current) {\n return;\n }\n connected.current = false;\n setConnection(\"reconnecting\");\n }),\n [transport],\n );\n\n return connection;\n};\n\nexport const UpdatePopover = ({\n transport,\n}: {\n transport: ClientTransport;\n}) => {\n const connection = useConnectionState(transport);\n const { requestRestart, state } = useUpdateState(transport);\n\n if (state.type === \"restarting\") {\n return (\n <main aria-live=\"polite\" data-om-restarting=\"\" role=\"status\">\n <section data-om-restarting-panel=\"\">\n <h1 data-om-restarting-title=\"\">Restarting Overmux</h1>\n <p data-om-restarting-message=\"\">Waiting for the new version.</p>\n </section>\n </main>\n );\n }\n if (connection === \"reconnecting\") {\n return <ReconnectingScreen />;\n }\n if (state.type === \"current\") {\n return null;\n }\n\n const error = state.type === \"available\" ? state.error : undefined;\n\n return (\n <aside data-om-update=\"\" role=\"status\">\n <p>A new version is available. Reload to update.</p>\n <button\n data-om-update-reload=\"\"\n disabled={state.type === \"requesting\"}\n onClick={() => void requestRestart()}\n type=\"button\"\n >\n Reload\n </button>\n {error ? <p data-om-update-error=\"\">{error}</p> : null}\n </aside>\n );\n};\n","// This file is the overmux owned part of the client\n\nimport {\n runtimeManifestSchema,\n type RuntimeManifest,\n} from \"../../shared/index\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport {\n Component,\n createElement,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { overmuxLogoutPath, overmuxSettingsPath } from \"@overmux/shared\";\nimport { OvermuxThemeScope } from \"../theme-scope\";\nimport { createOvermuxServerApi } from \"../browser-api\";\nimport { installBrowserLogForwarding } from \"./browser-log-forwarding\";\nimport { installNotificationForwarding } from \"./notification-forwarding\";\nimport type { ClientAppDefinition } from \"../client-definition\";\nimport { type RegisteredCommand, RuntimeContext } from \"../commands\";\nimport { ShortcutHost } from \"../shortcuts\";\nimport { createClientTransport, TransportContext } from \"../transport\";\nimport { HostedLogoutPage } from \"./hosted-pages/logout-page\";\nimport { HostedSettingsPage } from \"./hosted-pages/settings-page\";\nimport { RecoveryScreen } from \"./recovery-screen\";\nimport { UpdatePopover } from \"./update-popover\";\n\ntype ErrorBoundaryProps = {\n children: ReactNode;\n fallback: (error: Error) => ReactNode;\n};\n\ntype ErrorBoundaryState = { error?: Error };\n\nclass RootErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n state: ErrorBoundaryState = {};\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n render() {\n return this.state.error\n ? this.props.fallback(this.state.error)\n : this.props.children;\n }\n}\n\nclass AuthenticationRequiredError extends Error {}\n\nconst redirectToLogin = () => location.replace(\"/login?reason=session-expired\");\n\nconst loadRuntimeManifest = async () => {\n const response = await fetch(\"/api/runtime-manifest\", { cache: \"no-store\" });\n if (response.status === 401) {\n throw new AuthenticationRequiredError(\"Authentication required\");\n }\n if (!response.ok) {\n throw new Error(`Runtime manifest request failed: ${response.status}`);\n }\n return runtimeManifestSchema.parse(await response.json());\n};\n\nconst OvermuxRuntime = ({\n definition,\n}: {\n definition: ClientAppDefinition;\n}) => {\n const safeMode = new URLSearchParams(location.search).get(\"safe\") === \"1\";\n const transport = useMemo(createClientTransport, []);\n const queryClient = useMemo(() => new QueryClient(), []);\n const logForwardingDisposer = useRef<(() => void) | undefined>(undefined);\n const [manifest, setManifest] = useState<RuntimeManifest>();\n const [error, setError] = useState<string>();\n useEffect(() => {\n let active = true;\n void loadRuntimeManifest()\n .then((next) => {\n if (!active) {\n return;\n }\n setManifest(next);\n transport.activate();\n })\n .catch((cause: unknown) => {\n if (cause instanceof AuthenticationRequiredError) {\n redirectToLogin();\n return;\n }\n if (active) {\n setError(cause instanceof Error ? cause.message : String(cause));\n }\n });\n return () => {\n active = false;\n };\n }, [transport]);\n const registrations = useMemo(() => new Set<RegisteredCommand>(), []);\n const [registrationRevision, setRegistrationRevision] = useState(0);\n useEffect(() => {\n if (manifest?.debug && !logForwardingDisposer.current) {\n logForwardingDisposer.current = installBrowserLogForwarding(\n transport.reportDiagnostic,\n );\n }\n }, [manifest?.debug, transport]);\n useEffect(\n () =>\n transport.subscribeStatus((status) => {\n if (status === \"authentication-required\") {\n redirectToLogin();\n }\n }),\n [transport],\n );\n useEffect(\n () => () => {\n logForwardingDisposer.current?.();\n transport.dispose();\n },\n [transport],\n );\n useEffect(() => installNotificationForwarding(transport), [transport]);\n const refreshCommands = useCallback(\n () => setRegistrationRevision((revision) => revision + 1),\n [],\n );\n const registerCommand = useCallback(\n (registration: RegisteredCommand) => {\n registrations.add(registration);\n refreshCommands();\n return () => {\n registrations.delete(registration);\n refreshCommands();\n };\n },\n [refreshCommands, registrations],\n );\n const overmuxServerApi = useMemo(\n () =>\n manifest ? createOvermuxServerApi({ manifest, transport }) : undefined,\n [manifest, transport],\n );\n if (safeMode || !manifest || !overmuxServerApi) {\n return <RecoveryScreen error={error} />;\n }\n\n const App = definition.component;\n return (\n <QueryClientProvider client={queryClient}>\n <RuntimeContext.Provider\n value={{\n manifest,\n overmuxServerApi,\n refreshCommands,\n registerCommand,\n }}\n >\n <TransportContext.Provider value={transport}>\n <ShortcutHost\n definition={definition}\n registrations={registrations}\n registrationRevision={registrationRevision}\n >\n <RootErrorBoundary\n fallback={(cause) => <RecoveryScreen error={cause.message} />}\n >\n {createElement(App)}\n </RootErrorBoundary>\n <UpdatePopover transport={transport} />\n </ShortcutHost>\n </TransportContext.Provider>\n </RuntimeContext.Provider>\n </QueryClientProvider>\n );\n};\n\nexport const OvermuxHost = ({\n definition,\n}: {\n definition: ClientAppDefinition;\n}) => (\n <OvermuxThemeScope {...definition.appearance}>\n {location.pathname === overmuxSettingsPath ? (\n <HostedSettingsPage />\n ) : location.pathname === overmuxLogoutPath ? (\n <HostedLogoutPage />\n ) : (\n <OvermuxRuntime definition={definition} />\n )}\n </OvermuxThemeScope>\n);\n"],"mappings":"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"}
|