@ai-matrx/summon 0.0.0 → 0.1.0
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 +13 -0
- package/LICENSE +21 -0
- package/README.md +379 -1
- package/dist/closeBinding-C6raC3qJ.d.cts +20 -0
- package/dist/closeBinding-C6raC3qJ.d.ts +20 -0
- package/dist/dialog.cjs +60 -0
- package/dist/dialog.cjs.map +1 -0
- package/dist/dialog.d.cts +16 -0
- package/dist/dialog.d.ts +16 -0
- package/dist/dialog.js +38 -0
- package/dist/dialog.js.map +1 -0
- package/dist/errors-eJrKXq33.d.cts +30 -0
- package/dist/errors-eJrKXq33.d.ts +30 -0
- package/dist/handles.cjs +411 -0
- package/dist/handles.cjs.map +1 -0
- package/dist/handles.d.cts +166 -0
- package/dist/handles.d.ts +166 -0
- package/dist/handles.js +388 -0
- package/dist/handles.js.map +1 -0
- package/dist/index.cjs +2383 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1259 -0
- package/dist/index.d.ts +1259 -0
- package/dist/index.js +2363 -0
- package/dist/index.js.map +1 -0
- package/dist/lite.cjs +460 -0
- package/dist/lite.cjs.map +1 -0
- package/dist/lite.d.cts +56 -0
- package/dist/lite.d.ts +56 -0
- package/dist/lite.js +444 -0
- package/dist/lite.js.map +1 -0
- package/dist/next.cjs +61 -0
- package/dist/next.cjs.map +1 -0
- package/dist/next.d.cts +5 -0
- package/dist/next.d.ts +5 -0
- package/dist/next.js +39 -0
- package/dist/next.js.map +1 -0
- package/dist/persistence-data.cjs +143 -0
- package/dist/persistence-data.cjs.map +1 -0
- package/dist/persistence-data.d.cts +72 -0
- package/dist/persistence-data.d.ts +72 -0
- package/dist/persistence-data.js +120 -0
- package/dist/persistence-data.js.map +1 -0
- package/dist/persistence.cjs +1073 -0
- package/dist/persistence.cjs.map +1 -0
- package/dist/persistence.d.cts +236 -0
- package/dist/persistence.d.ts +236 -0
- package/dist/persistence.js +1077 -0
- package/dist/persistence.js.map +1 -0
- package/dist/react.cjs +733 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +261 -0
- package/dist/react.d.ts +261 -0
- package/dist/react.js +718 -0
- package/dist/react.js.map +1 -0
- package/dist/sheet.cjs +71 -0
- package/dist/sheet.cjs.map +1 -0
- package/dist/sheet.d.cts +17 -0
- package/dist/sheet.d.ts +17 -0
- package/dist/sheet.js +49 -0
- package/dist/sheet.js.map +1 -0
- package/dist/styles.css +78 -0
- package/dist/testing.cjs +132 -0
- package/dist/testing.cjs.map +1 -0
- package/dist/testing.d.cts +44 -0
- package/dist/testing.d.ts +44 -0
- package/dist/testing.js +115 -0
- package/dist/testing.js.map +1 -0
- package/dist/url.cjs +362 -0
- package/dist/url.cjs.map +1 -0
- package/dist/url.d.cts +153 -0
- package/dist/url.d.ts +153 -0
- package/dist/url.js +352 -0
- package/dist/url.js.map +1 -0
- package/dist/window-host.cjs +123 -0
- package/dist/window-host.cjs.map +1 -0
- package/dist/window-host.d.cts +72 -0
- package/dist/window-host.d.ts +72 -0
- package/dist/window-host.js +104 -0
- package/dist/window-host.js.map +1 -0
- package/dist/window.cjs +3978 -0
- package/dist/window.cjs.map +1 -0
- package/dist/window.d.cts +796 -0
- package/dist/window.d.ts +796 -0
- package/dist/window.js +4003 -0
- package/dist/window.js.map +1 -0
- package/package.json +239 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/core/types.ts","../src/core/ports.ts","../src/core/registry.ts","../src/core/overlaysSlice.ts","../src/core/windowManagerSlice.ts","../src/core/geometry/windowArrangements.ts","../src/core/geometry/rectClamp.ts","../src/core/geometry/tray.ts","../src/core/linksSlice.ts","../src/core/overlayStateSlice.ts","../src/core/store.ts","../src/core/middleware/closeLifecycle.ts","../src/handles/callbackManager.ts","../src/handles/ids.ts","../src/core/middleware/renderWatchdog.ts","../src/core/geometry/dockWindowPayload.ts"],"sourcesContent":["// @ai-matrx/summon — core (framework-free). Store, slices, selectors, actions, middleware,\n// ports, types and window geometry. Importing this section never loads React.\nexport * from \"./core/types\";\nexport * from \"./core/ports\";\nexport * from \"./core/registry\";\nexport * from \"./core/overlaysSlice\";\nexport * from \"./core/windowManagerSlice\";\nexport * from \"./core/linksSlice\";\nexport * from \"./core/overlayStateSlice\";\nexport * from \"./core/store\";\nexport * from \"./core/middleware/closeLifecycle\";\nexport * from \"./core/middleware/renderWatchdog\";\nexport * from \"./core/geometry/types\";\nexport * from \"./core/geometry/rectClamp\";\nexport * from \"./core/geometry/tray\";\nexport * from \"./core/geometry/windowArrangements\";\nexport * from \"./core/geometry/dockWindowPayload\";\n","/**\n * The shared vocabulary of @ai-matrx/summon. Framework-free: no React, no Redux imports.\n *\n * An OVERLAY is any component rendered on top of the app by dispatch — a window, dialog, sheet,\n * light floating window, toast-like card, anything. It is identified by an `OverlayId` and opened\n * as one or more INSTANCES (`instanceId`, \"default\" for single-instance overlays).\n */\n\n/**\n * The host's overlay registry: overlay id → the data its opener accepts. Hosts extend it by\n * module augmentation so every open call is type-checked:\n *\n * declare module \"@ai-matrx/summon\" {\n * interface OverlayRegistry { notesWindow: { noteId?: string } }\n * }\n *\n * `defineOverlay` emits nothing at runtime for this; the augmentation is the host's one-line\n * declaration per overlay (the converter writes it next to each definition).\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface OverlayRegistry {}\n\n/** Every registered overlay id; plain `string` until the host augments the registry. */\nexport type OverlayId = [keyof OverlayRegistry] extends [never]\n ? string\n : Extract<keyof OverlayRegistry, string>;\n\n/** The open-data type declared for an overlay id. */\nexport type OverlayDataOf<Id extends string> = Id extends keyof OverlayRegistry\n ? OverlayRegistry[Id]\n : Record<string, unknown>;\n\n/**\n * Data as it arrives at render time. It crossed Redux, a URL or storage, so it is NOT trusted to\n * match the opener's type: render code narrows it (or the definition supplies `parse`).\n */\nexport type OverlayRawData = Readonly<Record<string, unknown>> | null;\n\nexport const DEFAULT_INSTANCE_ID = \"default\";\n\n/** `single`: one instance (\"default\"). `multi`: any number, each with its own instanceId. */\nexport type InstanceMode = \"single\" | \"multi\";\n\n/**\n * What closing does to a mounted overlay (Arman, 2026-10-16, C38 R3):\n * none — unmount (default).\n * hidden — stay mounted but hidden; reopening shows the same live component (LRU-capped).\n * restore — unmount, but values saved with `useOverlayState` come back on reopen.\n * Minimizing a window always keeps its component mounted, whatever this says.\n */\nexport type KeepAlive = \"none\" | \"hidden\" | \"restore\";\n\n/** `overlayId:instanceId` — the one key every subsystem uses for an open instance. */\nexport type InstanceKey = `${string}:${string}`;\n\nexport function instanceKey(overlayId: string, instanceId: string = DEFAULT_INSTANCE_ID): InstanceKey {\n return `${overlayId}:${instanceId}`;\n}\n\nexport function parseInstanceKey(key: string): { overlayId: string; instanceId: string } | null {\n const at = key.indexOf(\":\");\n if (at <= 0 || at === key.length - 1) return null;\n return { overlayId: key.slice(0, at), instanceId: key.slice(at + 1) };\n}\n\n// ── Window options (consumed by the window surface; inert for other surfaces) ──────────────────\n\nexport type MobilePresentation = \"fullscreen\" | \"drawer\" | \"card\" | \"hidden\";\n\n/**\n * Default-deny allowlist of the open data a window may save and restore. A window with no\n * preservation entry restores geometry only.\n */\nexport interface WindowPreservation {\n readonly dataKeys: readonly string[];\n readonly requiredDataKeys?: readonly string[];\n readonly allowedDataValues?: Readonly<Record<string, readonly (string | number | boolean | null)[]>>;\n /** Default 32 KiB. */\n readonly maxDataBytes?: number;\n}\n\n/** One declared home for an unbidden (system-raised) window: a route prefix, or one exact page. */\nexport type UnbiddenHomeRoute = string | { readonly route: string; readonly exact: true };\n\nexport interface OverlayWindowOptions {\n readonly mobile?: MobilePresentation;\n readonly mobileSidebarAs?: \"drawer\" | \"inline\";\n /** Never saved or restored (debug panels, one-shot tools, callback-bound editors). */\n readonly ephemeral?: boolean;\n readonly preservation?: WindowPreservation;\n /**\n * Values merged under saved data when a window is RESTORED (reload, another device). Unlike the\n * definition's `defaults`, never applied to a normal open.\n */\n readonly restoreDefaults?: Readonly<Record<string, unknown>>;\n /**\n * The window-manager id the WindowPanel registers under for the default instance. Default: the\n * overlay id. The render watchdog reveals and inspects this id until the panel acks its own.\n */\n readonly windowId?: string;\n readonly deprecated?: { readonly replacement?: string; readonly reason?: string };\n /**\n * Where a window nobody opened (system-raised) may raise itself. Default deny: no home → it may\n * not raise itself anywhere (`mayRaiseUnbidden` in the window section).\n */\n readonly unbiddenHome?: readonly UnbiddenHomeRoute[];\n}\n\n// ── Host types (augmentable) ────────────────────────────────────────────────────────────────\n\n/**\n * Host-specific types the package passes through untouched. A Redux host augments `dispatch`\n * with its thunk-aware dispatch so link hydrators can dispatch its thunks without casts:\n *\n * declare module \"@ai-matrx/summon\" { interface OverlayHostTypes { dispatch: AppDispatch } }\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface OverlayHostTypes {}\nexport type OverlayHostDispatch = OverlayHostTypes extends { dispatch: infer D } ? D : (action: unknown) => unknown;\n\n// ── Links (address-bar references) ──────────────────────────────────────────────────────────\n\nexport interface LinkHydrateContext<Data> {\n /** The id segment of the link token (`notes:<id>`). */\n readonly id: string;\n /** Decoded `k-v` arguments of the token. */\n readonly args: Readonly<Record<string, string>>;\n /** Open this overlay. */\n open(options?: { readonly instanceId?: string; readonly data?: Data }): void;\n /** The host store's dispatch, for thunks a hydrator needs (loading a record first). Typed by\n * augmenting `OverlayHostTypes` with the host's dispatch type. */\n readonly dispatch: OverlayHostDispatch;\n}\n\nexport interface OverlayLinkSpec<Data> {\n /** The token type key in `?panels=key:id`. Unique across the host. */\n readonly key: string;\n /** Older keys that still resolve to this overlay. */\n readonly aliases?: readonly string[];\n /** Turn a link token into an open overlay (and its data). `\"refused\"` keeps the token and says why. */\n hydrate(context: LinkHydrateContext<Data>): void | \"refused\" | Promise<void | \"refused\">;\n}\n\n// ── Definitions (framework-free half; the React half adds `render`) ─────────────────────────\n\nexport interface OverlayDefinitionMeta<Id extends string = string, Data = Record<string, unknown>> {\n readonly id: Id;\n /** Human label: tray, menus, diagnostics. */\n readonly label: string;\n readonly instance?: InstanceMode;\n readonly keepAlive?: KeepAlive;\n /** Close when the route changes — the overlay shows a piece of the page that opened it. */\n readonly closesOnNavigation?: boolean;\n /** Present only for overlays that render a WindowPanel. */\n readonly window?: OverlayWindowOptions;\n readonly link?: OverlayLinkSpec<Data>;\n /** Defaults merged under open data (replaces the old per-overlay schema registry). */\n readonly defaults?: Partial<Data>;\n}\n\n/** The window-manager id a singleton window overlay registers under (`window.windowId ?? id`). */\nexport function defaultWindowIdFor(meta: Pick<OverlayDefinitionMeta, \"id\" | \"window\">): string {\n return meta.window?.windowId ?? meta.id;\n}\n","/**\n * Everything the overlays system needs from its host, as ports. Every port ships a working\n * default, so a bare host gets a working system with zero wiring (package standard rule 8); a\n * host overrides only what it has: identity, navigation, notifications, error sink, debug flag,\n * persistence. Framework-free.\n */\n\nexport type Unsubscribe = () => void;\n\n/** Who the person is, for isolating saved state. `key` changes → everything saved is swapped. */\nexport interface IdentityPort {\n current(): { readonly key: string; readonly ready: boolean };\n subscribe(listener: () => void): Unsubscribe;\n}\n\n/** The address bar: route changes (close-on-navigation) and the `?panels=` link channel. */\nexport interface RouterPort {\n pathname(): string;\n search(): string;\n /** Replace the query string without navigating or remounting the page. */\n replaceSearch(nextSearch: string): void;\n subscribe(listener: () => void): Unsubscribe;\n}\n\nexport interface NotifyOptions {\n readonly id?: string;\n readonly description?: string;\n /** How long the notice stays up (ms). Hosts without timed notices ignore it. */\n readonly duration?: number;\n /** One action button (e.g. the render watchdog's \"Show it\"). Hosts without actions ignore it. */\n readonly action?: { readonly label: string; readonly onClick: () => void };\n}\n\nexport interface NotifyPort {\n info(message: string, options?: NotifyOptions): void;\n warn(message: string, options?: NotifyOptions): void;\n error(message: string, options?: NotifyOptions): void;\n /** Withdraw a notice by id (optional). */\n dismiss?(id: string): void;\n}\n\nexport interface ErrorSinkPort {\n capture(error: unknown, context: Readonly<Record<string, unknown>>): void;\n}\n\nexport interface DebugPort {\n enabled(): boolean;\n subscribe?(listener: () => void): Unsubscribe;\n}\n\n/** A stored value with its optimistic-concurrency version (0 when the store has none). */\nexport interface StoredValue<T = unknown> {\n readonly value: T;\n readonly version: number;\n}\n\n/**\n * Where saved overlay state lives when persistence is on. Keys are already scoped to the\n * identity by the caller (`<identityKey>/<key>`) for stores that are not per-person themselves.\n * Implementations: the browser-local store (`./persistence`), `@ai-matrx/data` over\n * `users.user_surface_state` (`./persistence/data`), or any host database.\n */\nexport interface OverlayPersistencePort {\n /**\n * True when the store is per-person itself (rows scoped to the signed-in person, e.g. the\n * `@ai-matrx/data` adapter): the persistence section then passes plain keys (`workspace`,\n * `state:<instanceKey>`) instead of `<identityKey>/<key>`, and defaults to `scope: \"person\"`.\n */\n readonly perPerson?: boolean;\n load<T = unknown>(key: string): Promise<StoredValue<T> | null>;\n save<T = unknown>(key: string, value: T, options?: { readonly expectedVersion?: number }): Promise<{ readonly version: number }>;\n remove(key: string): Promise<void>;\n list?(prefix: string): Promise<readonly string[]>;\n}\n\nexport interface SummonPorts {\n readonly identity: IdentityPort;\n readonly router: RouterPort;\n readonly notify: NotifyPort;\n readonly errors: ErrorSinkPort;\n readonly debug: DebugPort;\n /** `null` = persistence off (R6). */\n readonly persistence: OverlayPersistencePort | null;\n}\n\nconst noop = (): void => {};\n\nexport const anonymousIdentity: IdentityPort = {\n current: () => ({ key: \"anonymous\", ready: true }),\n subscribe: () => noop,\n};\n\n/** `window.location` + `history.replaceState`; inert on the server. */\nexport const locationRouter: RouterPort = {\n pathname: () => (typeof window === \"undefined\" ? \"/\" : window.location.pathname),\n search: () => (typeof window === \"undefined\" ? \"\" : window.location.search),\n replaceSearch: (nextSearch) => {\n if (typeof window === \"undefined\") return;\n const query = nextSearch && !nextSearch.startsWith(\"?\") ? `?${nextSearch}` : nextSearch;\n const url = `${window.location.pathname}${query}${window.location.hash}`;\n window.history.replaceState(window.history.state, \"\", url);\n },\n subscribe: (listener) => {\n if (typeof window === \"undefined\") return noop;\n window.addEventListener(\"popstate\", listener);\n return () => window.removeEventListener(\"popstate\", listener);\n },\n};\n\n/* eslint-disable no-console */\nexport const consoleNotify: NotifyPort = {\n info: (message) => console.info(`[summon] ${message}`),\n warn: (message) => console.warn(`[summon] ${message}`),\n error: (message) => console.error(`[summon] ${message}`),\n};\n\nexport const consoleErrorSink: ErrorSinkPort = {\n capture: (error, context) => console.error(\"[summon]\", error, context),\n};\n/* eslint-enable no-console */\n\nexport const debugOff: DebugPort = { enabled: () => false };\n\nexport const DEFAULT_PORTS: SummonPorts = {\n identity: anonymousIdentity,\n router: locationRouter,\n notify: consoleNotify,\n errors: consoleErrorSink,\n debug: debugOff,\n persistence: null,\n};\n\nexport function resolvePorts(overrides: Partial<SummonPorts> | undefined): SummonPorts {\n return { ...DEFAULT_PORTS, ...overrides };\n}\n","/**\n * The process-wide registry of overlay definition metadata (the framework-free half of each\n * definition). The host registers its definitions once (`<SummonHost definitions>` does it);\n * reducers stay pure — middleware and hooks read this registry and put what reducers need in the\n * action payload (e.g. the ids bound to the page).\n *\n * State lives in a global slot so a duplicated module graph (ESM + CJS, unsplit bundles) sees one\n * registry (kit `globalSlot`, architecture D9).\n */\nimport { globalSlot } from \"@ai-matrx/kit/global-slot\";\nimport type { OverlayDefinitionMeta } from \"./types\";\n\n/**\n * A definition's meta with its data type erased, so definitions of every data shape share one\n * registry without casts. (`never` erasure made `defaults` unassignable.)\n */\nexport interface AnyOverlayMeta extends Omit<OverlayDefinitionMeta<string, unknown>, \"defaults\"> {\n readonly defaults?: object | undefined;\n}\n\ntype AnyMeta = AnyOverlayMeta;\n\ninterface RegistryState {\n readonly byId: Map<string, AnyMeta>;\n readonly byLinkKey: Map<string, AnyMeta>;\n readonly listeners: Set<() => void>;\n}\n\nconst state = (): RegistryState =>\n globalSlot<RegistryState>(\"ai-matrx.summon.registry\", () => ({\n byId: new Map(),\n byLinkKey: new Map(),\n listeners: new Set(),\n }));\n\n/**\n * Register (or re-register) definitions. Re-registering an id replaces it (hot reload). A link\n * key claimed by two different ids is a host bug and throws, naming both.\n */\nexport function registerOverlayMeta(definitions: readonly AnyOverlayMeta[]): void {\n const s = state();\n for (const def of definitions) {\n s.byId.set(def.id, def);\n const keys = def.link ? [def.link.key, ...(def.link.aliases ?? [])] : [];\n for (const key of keys) {\n const holder = s.byLinkKey.get(key);\n if (holder && holder.id !== def.id) {\n throw new Error(`[summon] link key \"${key}\" is claimed by both \"${holder.id}\" and \"${def.id}\"`);\n }\n s.byLinkKey.set(key, def);\n }\n }\n for (const listener of s.listeners) listener();\n}\n\nexport function getOverlayMeta(overlayId: string): AnyMeta | undefined {\n return state().byId.get(overlayId);\n}\n\nexport function getOverlayMetaByLinkKey(linkKey: string): AnyMeta | undefined {\n return state().byLinkKey.get(linkKey);\n}\n\nexport function allOverlayMeta(): readonly AnyMeta[] {\n return [...state().byId.values()];\n}\n\nexport function isRegisteredOverlay(overlayId: string): boolean {\n return state().byId.has(overlayId);\n}\n\nexport function subscribeToOverlayRegistry(listener: () => void): () => void {\n const s = state();\n s.listeners.add(listener);\n return () => s.listeners.delete(listener);\n}\n\n/** Test-only. */\nexport function resetOverlayRegistry(): void {\n const s = state();\n s.byId.clear();\n s.byLinkKey.clear();\n}\n","/**\n * The `overlays` slice — which overlay instances are open and the (serialisable) data each was\n * opened with. Ported from matrx-frontend `lib/redux/slices/overlaySlice.ts`; behavior verbatim\n * except (CHANGELOG 0.1.0):\n * - `closeOverlaysBoundToPage` no longer imports the app catalogue: its payload carries the\n * overlay ids to close; the action creator fills them from the registry when omitted.\n * - Registry `defaults` are merged under open data (the old per-overlay schema registry role),\n * read in the action creator so the reducer stays pure.\n * - The memoized per-id selector cache lives in a global slot, not module scope.\n * - App-only types (FullScreenEditorMode) and the \"[Track New Project]\" debug log are gone.\n *\n * Every overlay supports two modes:\n * Singleton (default): dispatch(openOverlay({ overlayId })) → instanceId \"default\"\n * Instanced: dispatch(openOverlay({ overlayId, instanceId: \"uuid\" })) → isolated\n *\n * State shape: overlays.overlays: Record<overlayId, Record<instanceId, OverlayInstance>>\n */\nimport { createSelector, createSlice, type PayloadAction } from \"@reduxjs/toolkit\";\nimport { globalSlot } from \"@ai-matrx/kit/global-slot\";\nimport { allOverlayMeta, getOverlayMeta } from \"./registry\";\nimport { DEFAULT_INSTANCE_ID, type OverlayDataOf, type OverlayId } from \"./types\";\n\n// ── Public payload types ─────────────────────────────────────────────────────────────────────\n\nexport interface OpenOverlayPayload<Id extends OverlayId = OverlayId> {\n overlayId: Id;\n instanceId?: string;\n data?: OverlayDataOf<Id> | null;\n}\n\nexport interface CloseOverlayPayload<Id extends OverlayId = OverlayId> {\n overlayId: Id;\n instanceId?: string;\n}\n\nexport type ToggleOverlayPayload<Id extends OverlayId = OverlayId> = OpenOverlayPayload<Id>;\n\nexport interface CloseAllInstancesPayload<Id extends OverlayId = OverlayId> {\n overlayId: Id;\n}\n\nexport interface CloseOverlaysBoundToPagePayload {\n /** Overlay ids whose definitions say `closesOnNavigation`. */\n overlayIds: readonly string[];\n}\n\nexport interface PruneStaleInstancesPayload {\n olderThanMs: number;\n}\n\n// ── State ────────────────────────────────────────────────────────────────────────────────────\n\nexport interface OverlayInstance {\n isOpen: boolean;\n data: unknown;\n /**\n * Unix ms timestamp of the last open action. Used by `pruneStaleInstances` to GC\n * long-forgotten closed entries. Set on every open, untouched on close.\n */\n lastUsedAt?: number;\n}\n\nexport interface OverlayState {\n overlays: Record<string, Record<string, OverlayInstance>>;\n}\n\n/** Empty by design: overlay keys are added lazily on first open. */\nconst initialState: OverlayState = { overlays: {} };\n\n/** Raw reducer payloads: untyped ids + the registry defaults the action creator resolved. */\ninterface RawOpenPayload {\n overlayId: string;\n instanceId?: string;\n data?: unknown;\n defaults?: Readonly<Record<string, unknown>>;\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** Open data with the definition defaults merged underneath (null when neither exists). */\nfunction withDefaults(data: unknown, defaults: Readonly<Record<string, unknown>> | undefined): unknown {\n if (!defaults) return data ?? null;\n if (data === undefined || data === null) return { ...defaults };\n if (isPlainRecord(data)) return { ...defaults, ...data };\n return data;\n}\n\nfunction closeInstance(state: OverlayState, overlayId: string, instanceId: string): void {\n const bucket = state.overlays[overlayId];\n if (!bucket) return;\n const instance = bucket[instanceId];\n if (!instance) return;\n // Multi-instance entries have unique (non-default) ids: drop them on close so closed records\n // never grow without bound. Singleton (\"default\") entries flip isOpen but keep the slot so\n // selectors keep their stable reference.\n if (instanceId !== DEFAULT_INSTANCE_ID) {\n delete bucket[instanceId];\n if (Object.keys(bucket).length === 0) delete state.overlays[overlayId];\n return;\n }\n instance.isOpen = false;\n instance.data = null;\n}\n\nconst overlaysSlice = createSlice({\n name: \"overlays\",\n initialState,\n reducers: {\n openOverlay: (state, action: PayloadAction<RawOpenPayload>) => {\n const { overlayId, instanceId = DEFAULT_INSTANCE_ID, data, defaults } = action.payload;\n const bucket = (state.overlays[overlayId] ??= {});\n bucket[instanceId] = { isOpen: true, data: withDefaults(data, defaults), lastUsedAt: Date.now() };\n },\n\n closeOverlay: (state, action: PayloadAction<{ overlayId: string; instanceId?: string }>) => {\n const { overlayId, instanceId = DEFAULT_INSTANCE_ID } = action.payload;\n closeInstance(state, overlayId, instanceId);\n },\n\n closeAllOverlays: (state) => {\n for (const [overlayId, bucket] of Object.entries(state.overlays)) {\n for (const [instanceId, instance] of Object.entries(bucket)) {\n if (instanceId === DEFAULT_INSTANCE_ID) {\n instance.isOpen = false;\n instance.data = null;\n } else {\n delete bucket[instanceId];\n }\n }\n if (Object.keys(bucket).length === 0) delete state.overlays[overlayId];\n }\n },\n\n toggleOverlay: (state, action: PayloadAction<RawOpenPayload>) => {\n const { overlayId, instanceId = DEFAULT_INSTANCE_ID, data, defaults } = action.payload;\n const bucket = (state.overlays[overlayId] ??= {});\n const existing = bucket[instanceId];\n if (!existing) {\n bucket[instanceId] = { isOpen: true, data: withDefaults(data, defaults), lastUsedAt: Date.now() };\n } else if (existing.isOpen) {\n closeInstance(state, overlayId, instanceId);\n } else {\n existing.isOpen = true;\n existing.data = data === undefined || data === null ? existing.data : withDefaults(data, defaults);\n existing.lastUsedAt = Date.now();\n }\n },\n\n /** Removes every instance of an overlay id (e.g. an editor that spawned many tabs). */\n closeAllInstancesOfOverlay: (state, action: PayloadAction<{ overlayId: string }>) => {\n delete state.overlays[action.payload.overlayId];\n },\n\n /**\n * Route change: close every open instance of the listed overlays — each shows a piece of the\n * page that opened it, so after navigating away it would float over a page it does not\n * belong to. Every other overlay is a workbench tool and stays open.\n */\n closeOverlaysBoundToPage: (state, action: PayloadAction<CloseOverlaysBoundToPagePayload>) => {\n for (const overlayId of action.payload.overlayIds) {\n const bucket = state.overlays[overlayId];\n if (!bucket) continue;\n for (const [instanceId, instance] of Object.entries(bucket)) {\n if (!instance.isOpen) continue;\n if (instanceId === DEFAULT_INSTANCE_ID) {\n instance.isOpen = false;\n instance.data = null;\n } else {\n delete bucket[instanceId];\n }\n }\n if (Object.keys(bucket).length === 0) delete state.overlays[overlayId];\n }\n },\n\n /**\n * GC pass — removes closed instances last used more than `olderThanMs` ago. Singleton slots\n * are kept regardless so selectors returning stable references don't thrash.\n */\n pruneStaleInstances: (state, action: PayloadAction<PruneStaleInstancesPayload>) => {\n const cutoff = Date.now() - action.payload.olderThanMs;\n for (const [overlayId, bucket] of Object.entries(state.overlays)) {\n for (const [instanceId, instance] of Object.entries(bucket)) {\n if (instanceId === DEFAULT_INSTANCE_ID) continue;\n if (instance.isOpen) continue;\n if (!instance.lastUsedAt || instance.lastUsedAt < cutoff) delete bucket[instanceId];\n }\n if (Object.keys(bucket).length === 0) delete state.overlays[overlayId];\n }\n },\n },\n});\n\nexport const overlaysReducer = overlaysSlice.reducer;\n/** The raw slice action creators (untyped ids). Use for `.match` / `.type`; dispatch the typed ones. */\nexport const overlaysRawActions = overlaysSlice.actions;\n\n// ── Function-in-data guard ───────────────────────────────────────────────────────────────────\n// Functions can NEVER travel through Redux: render code reads only serialisable values out of\n// `data`, so a callback stored there silently never fires (the D33 dead-button class). Handlers\n// go through the handles registry (`@ai-matrx/summon/handles`) with only an id string in\n// `data`. This guard screams and strips the offending keys so the failure is visible at once.\n\nfunction stripFunctionsFromOverlayData(overlayId: string, data: unknown): unknown {\n if (!isPlainRecord(data)) return data;\n const offenders = Object.keys(data).filter((key) => typeof data[key] === \"function\");\n if (offenders.length === 0) return data;\n // eslint-disable-next-line no-console\n console.error(\n `[summon] BUG: function value(s) in openOverlay data for \"${overlayId}\" ` +\n `(keys: ${offenders.join(\", \")}). Functions cannot travel through Redux — the handler ` +\n `would NEVER fire. Register a handle (@ai-matrx/summon/handles) and pass its id string ` +\n `instead. The offending key(s) were stripped from state.`,\n );\n const cleaned = { ...data };\n for (const key of offenders) delete cleaned[key];\n return cleaned;\n}\n\nfunction rawOpenPayload(payload: { overlayId: string; instanceId?: string; data?: unknown }): RawOpenPayload {\n const raw: RawOpenPayload = { overlayId: payload.overlayId };\n if (payload.instanceId !== undefined) raw.instanceId = payload.instanceId;\n if (payload.data !== undefined) raw.data = stripFunctionsFromOverlayData(payload.overlayId, payload.data);\n const defaults: unknown = getOverlayMeta(payload.overlayId)?.defaults;\n if (isPlainRecord(defaults)) {\n raw.defaults = stripFunctionsFromOverlayData(payload.overlayId, defaults) as Record<string, unknown>;\n }\n return raw;\n}\n\n/** Typed action creator that still exposes the raw creator's `type` and `match`. */\nfunction withMatcher<F extends (...args: never[]) => unknown, M extends { type: string; match: unknown }>(\n create: F,\n raw: M,\n): F & Pick<M, \"type\" | \"match\"> {\n return Object.assign(create, { type: raw.type, match: raw.match } as Pick<M, \"type\" | \"match\">);\n}\n\n// ── Public typed actions ─────────────────────────────────────────────────────────────────────\n\nexport const openOverlay = withMatcher(\n <Id extends OverlayId>(payload: OpenOverlayPayload<Id>) =>\n overlaysSlice.actions.openOverlay(rawOpenPayload(payload)),\n overlaysSlice.actions.openOverlay,\n);\n\nexport const closeOverlay = withMatcher(\n <Id extends OverlayId>(payload: CloseOverlayPayload<Id>) =>\n overlaysSlice.actions.closeOverlay(\n payload.instanceId === undefined\n ? { overlayId: payload.overlayId }\n : { overlayId: payload.overlayId, instanceId: payload.instanceId },\n ),\n overlaysSlice.actions.closeOverlay,\n);\n\nexport const toggleOverlay = withMatcher(\n <Id extends OverlayId>(payload: ToggleOverlayPayload<Id>) =>\n overlaysSlice.actions.toggleOverlay(rawOpenPayload(payload)),\n overlaysSlice.actions.toggleOverlay,\n);\n\nexport const closeAllInstancesOfOverlay = withMatcher(\n <Id extends OverlayId>(payload: CloseAllInstancesPayload<Id>) =>\n overlaysSlice.actions.closeAllInstancesOfOverlay({ overlayId: payload.overlayId }),\n overlaysSlice.actions.closeAllInstancesOfOverlay,\n);\n\n/** Ids of every registered overlay whose definition says `closesOnNavigation`. */\nexport function overlayIdsBoundToPage(): string[] {\n return allOverlayMeta()\n .filter((meta) => meta.closesOnNavigation === true)\n .map((meta) => meta.id);\n}\n\n/** Close page-bound overlays. Omit the ids to use the registry's `closesOnNavigation` list. */\nexport const closeOverlaysBoundToPage = withMatcher(\n (payload?: Partial<CloseOverlaysBoundToPagePayload>) =>\n overlaysSlice.actions.closeOverlaysBoundToPage({\n overlayIds: [...(payload?.overlayIds ?? overlayIdsBoundToPage())],\n }),\n overlaysSlice.actions.closeOverlaysBoundToPage,\n);\n\nexport const { closeAllOverlays, pruneStaleInstances } = overlaysSlice.actions;\n\n// ── Selectors ────────────────────────────────────────────────────────────────────────────────\n\n/** The slice of any store these selectors need. */\nexport type StateWithOverlays = { overlays: OverlayState };\n\nexport interface OpenInstanceView {\n instanceId: string;\n data: unknown;\n}\n\n/** Stable fallback when an overlay instance has never been opened. */\nconst CLOSED_OVERLAY_INSTANCE: OverlayInstance = Object.freeze({ isOpen: false, data: null });\n\n/** Stable empty array so `instances.length === 0` callers never get a new reference. */\nconst EMPTY_INSTANCES: readonly OpenInstanceView[] = Object.freeze([]);\n\nexport const selectOverlay = (\n state: StateWithOverlays,\n overlayId: string,\n instanceId: string = DEFAULT_INSTANCE_ID,\n): OverlayInstance => state.overlays.overlays[overlayId]?.[instanceId] ?? CLOSED_OVERLAY_INSTANCE;\n\nexport const selectIsOverlayOpen = (\n state: StateWithOverlays,\n overlayId: string,\n instanceId: string = DEFAULT_INSTANCE_ID,\n): boolean => selectOverlay(state, overlayId, instanceId).isOpen;\n\nexport const selectOverlayData = (\n state: StateWithOverlays,\n overlayId: string,\n instanceId: string = DEFAULT_INSTANCE_ID,\n): unknown => selectOverlay(state, overlayId, instanceId).data;\n\ntype OpenInstancesSelector = (state: StateWithOverlays) => readonly OpenInstanceView[];\n\nconst openInstancesCache = (): Map<string, OpenInstancesSelector> =>\n globalSlot(\"ai-matrx.summon.openInstancesSelectors\", () => new Map<string, OpenInstancesSelector>());\n\n/**\n * All currently-open instances of an overlay id. Memoized per id: the array reference is stable\n * while the open set is unchanged.\n */\nexport const selectOpenInstances = (state: StateWithOverlays, overlayId: string): readonly OpenInstanceView[] => {\n const cache = openInstancesCache();\n let selector = cache.get(overlayId);\n if (!selector) {\n selector = createSelector(\n (s: StateWithOverlays) => s.overlays.overlays[overlayId],\n (instances): readonly OpenInstanceView[] => {\n if (!instances) return EMPTY_INSTANCES;\n const result: OpenInstanceView[] = [];\n for (const [instanceId, inst] of Object.entries(instances)) {\n if (inst.isOpen) result.push({ instanceId, data: inst.data });\n }\n return result.length === 0 ? EMPTY_INSTANCES : result;\n },\n );\n cache.set(overlayId, selector);\n }\n return selector(state);\n};\n\n/** Every open instance key (`overlayId:instanceId`) in the state. */\nexport function listOpenInstanceKeys(state: StateWithOverlays): string[] {\n const keys: string[] = [];\n for (const [overlayId, bucket] of Object.entries(state.overlays.overlays)) {\n for (const [instanceId, inst] of Object.entries(bucket)) {\n if (inst.isOpen) keys.push(`${overlayId}:${instanceId}`);\n }\n }\n return keys;\n}\n","import {\n createSelector,\n createSlice,\n type PayloadAction,\n} from \"@reduxjs/toolkit\";\nimport {\n computeGlobalArrangement,\n GlobalLayoutType,\n} from \"./geometry/windowArrangements\";\nimport {\n centerRectInViewport,\n clampRectToViewport,\n rectsEqual,\n} from \"./geometry/rectClamp\";\nimport type { DockWindowPayload } from \"./geometry/dockWindowPayload\";\nimport {\n TRAY_CHIP_H_DESKTOP,\n TRAY_CHIP_W_DESKTOP,\n traySlotRect,\n} from \"./geometry/tray\";\n// WindowRect lives in the shared types file so that windowArrangements.ts\n// (a feature utility) can import it without pulling in this Redux slice,\n// which would create a cycle. Re-exported here for backward compatibility.\nexport type { WindowRect } from \"./geometry/types\";\nimport type { WindowRect } from \"./geometry/types\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type WindowState = \"windowed\" | \"maximized\" | \"minimized\";\n\nexport const WINDOW_SESSION_SCHEMA_VERSION = 1 as const;\n\n/** Canonical persistence identity. Runtime window ids and registry slugs are not identities. */\nexport function windowSessionKey(\n overlayId: string,\n instanceId: string,\n): string {\n return `${overlayId}:${instanceId}`;\n}\n\nexport interface WindowPersistenceRegistration {\n overlayId: string;\n instanceId: string;\n data: Record<string, unknown>;\n sidebarOpen: boolean;\n sidebarSize: number | null;\n}\n\nexport interface WindowPersistenceState extends WindowPersistenceRegistration {\n /** Explicit close suppresses every later snapshot/unmount path. */\n closing: boolean;\n}\n\n/** Compact, JSON-only record written to the local window workspace cache. */\nexport interface PersistedWindowSession {\n schemaVersion: typeof WINDOW_SESSION_SCHEMA_VERSION;\n sessionKey: string;\n overlayId: string;\n instanceId: string;\n /** Runtime id is diagnostic/matching metadata, never the canonical identity. */\n windowId: string;\n title: string;\n state: WindowState;\n /** Always the full windowed rect, never minimized-card geometry. */\n windowedRect: WindowRect;\n traySlot: number | null;\n zIndex: number;\n sidebarOpen: boolean;\n sidebarSize: number | null;\n data: Record<string, unknown>;\n savedAt: number;\n}\n\n/** Viewport-normalized session staged for a live WindowPanel registration. */\nexport interface HydratedWindowSession extends PersistedWindowSession {\n /** Current-viewport render rect; tray geometry is recomputed, never stored. */\n renderRect: WindowRect;\n}\n\n/**\n * Pop-out mode for windows that have been detached into a separate browser\n * window. Orthogonal to `WindowState` — a popped-out window still has a\n * \"logical\" docked state remembered on `prePopoutRect` for the dock-back path.\n *\n * - `\"pip\"`: Document Picture-in-Picture (Chromium) — frameless, always-on-top.\n * Subject to the single-PiP-per-origin constraint enforced via\n * `activePipWindowId`.\n * - `\"popup\"`: `window.open()` fallback for browsers without DPiP support\n * (Safari, Firefox). Shows browser chrome.\n * - `null`: Window is docked inside the parent viewport (the default).\n */\nexport type PopoutMode = \"pip\" | \"popup\" | null;\n\nexport interface WindowEntry {\n id: string;\n title: string;\n state: WindowState;\n /** Last windowed size/position — restored when coming back from max/min */\n windowed: WindowRect;\n /** Saved rect before minimize so restore can return to the original size */\n preMinimizedRect: WindowRect | null;\n /** z-index order — higher = on top */\n zIndex: number;\n /** Order in the minimized tray (0-based). */\n traySlot: number | null;\n /**\n * Pop-out mode. `null` while docked. When set, the window is rendered into\n * a separate browser window via Document PiP or `window.open()` fallback.\n * Never written to the local workspace cache — always reset on hydration\n * (see `restoreWindowState`).\n */\n popoutMode: PopoutMode;\n /**\n * Saved windowed rect at popout time. Restored to `windowed` on dock-back\n * via `dockWindow`. `null` while docked (matches `preMinimizedRect` pattern).\n */\n prePopoutRect: WindowRect | null;\n /** Present only for registry entries explicitly approved for preservation. */\n persistence?: WindowPersistenceState;\n}\n\nexport interface WindowManagerState {\n windows: Record<string, WindowEntry>;\n /** Validated sessions waiting for their WindowPanel registration. */\n pendingRestores: Record<string, HydratedWindowSession>;\n /** Next z-index to assign when a window is focused */\n nextZIndex: number;\n /** How many slots are currently occupied in the tray */\n trayCount: number;\n /** Last viewport used to place tray cards; enables safe reflow on removal. */\n trayViewport: { width: number; height: number } | null;\n /** Global show/hide toggle — windows stay mounted but are visually hidden */\n windowsHidden: boolean;\n /**\n * The id of the window currently occupying the single Document PiP slot\n * (Chromium allows only one DPiP window per origin at a time). `null` when\n * the slot is free. Windows in `\"popup\"` mode do NOT count toward this slot.\n */\n activePipWindowId: string | null;\n /**\n * The id of the window currently being dragged outside the viewport beyond\n * the popout threshold. Used purely for visual feedback (\"Release to pop\n * out\" outline + ghost label). Cleared on every `pointerup`.\n */\n popoutCandidateId: string | null;\n /**\n * Z-index lane for LITE windows (`MatrxDynamicPanelHost presentation=\"floating\"`).\n *\n * They are deliberately NOT entries in `windows`: a lite window is a\n * transient form/picker host with no tray chip, no minimize and no\n * persistence, so joining `windows` would put a half-typed create form into\n * \"minimize all\" and the tray — the lost-work trap the lite window exists to\n * avoid. Keeping them in their own map means every tray/minimize/arrange\n * selector excludes them BY CONSTRUCTION rather than by a flag somebody must\n * remember to filter on.\n *\n * They still draw from the SAME `nextZIndex` counter, so there is one\n * z-order: a lite window opened from a WindowPanel always lands above it,\n * and clicking the WindowPanel afterwards raises it above the lite window.\n */\n transientZ: Record<string, number>;\n}\n\n// ─── Tray layout constants ────────────────────────────────────────────────────\n//\n// All minimized-chip placement math derives from these values.\n// Change them here and every calculation updates automatically.\n//\n// ┌─────────────────────────────── viewport ────────────────────────────────┐\n// │ │\n// │ [chip 4] [chip 3] [chip 2] [chip 1] [chip 0] ← MARGIN_RIGHT │\n// │ ↕ MARGIN_BOTTOM │\n// └─────────────────────────────────────────────────────────────────────────┘\n//\n// Row 0 starts at the bottom-right. Once full cards would exceed the viewport,\n// every minimized window reflows into the bounded header-only overview grid.\n\nexport const TRAY_CHIP_W = TRAY_CHIP_W_DESKTOP;\nexport const TRAY_CHIP_H = TRAY_CHIP_H_DESKTOP;\n\n// ─── Base constants ───────────────────────────────────────────────────────────\n\nconst BASE_Z = 1000;\nconst TRAY_SLOT_WIDTH = TRAY_CHIP_W; // kept for selector compat\n\n// ─── Initial state ────────────────────────────────────────────────────────────\n\nconst initialState: WindowManagerState = {\n windows: {},\n pendingRestores: {},\n nextZIndex: BASE_Z,\n trayCount: 0,\n trayViewport: null,\n windowsHidden: false,\n activePipWindowId: null,\n popoutCandidateId: null,\n transientZ: {},\n};\n\nfunction recomputeAllTrayRects(state: WindowManagerState): void {\n const viewport = state.trayViewport;\n if (!viewport) return;\n Object.values(state.windows).forEach((entry) => {\n if (entry.traySlot === null) return;\n entry.windowed = traySlotRect(\n entry.traySlot,\n viewport.width,\n viewport.height,\n state.trayCount,\n );\n });\n Object.values(state.pendingRestores).forEach((session) => {\n if (session.traySlot === null) return;\n session.renderRect = traySlotRect(\n session.traySlot,\n viewport.width,\n viewport.height,\n state.trayCount,\n );\n });\n}\n\nfunction hasMatchingLiveTrayReservation(\n state: WindowManagerState,\n overlayId: string,\n instanceId: string,\n traySlot: number | null,\n): boolean {\n if (traySlot === null) return false;\n return Object.values(state.windows).some(\n (entry) =>\n entry.persistence?.overlayId === overlayId &&\n entry.persistence.instanceId === instanceId &&\n entry.traySlot === traySlot,\n );\n}\n\n/**\n * Free a minimized slot and close the visual gap in the same reducer update.\n * Rectangles are mapped by their old slot so compaction does not need viewport\n * dimensions and cannot leave renumbered cards at stale coordinates.\n */\nfunction compactReservedTraySlot(\n state: WindowManagerState,\n freedSlot: number,\n freedRect: WindowRect,\n): void {\n const rectBySlot = new Map<number, WindowRect>();\n rectBySlot.set(freedSlot, freedRect);\n Object.values(state.windows).forEach((entry) => {\n if (entry.traySlot !== null) {\n rectBySlot.set(entry.traySlot, { ...entry.windowed });\n }\n });\n Object.values(state.pendingRestores).forEach((session) => {\n if (session.traySlot !== null) {\n rectBySlot.set(session.traySlot, { ...session.renderRect });\n }\n });\n\n state.trayCount = Math.max(0, state.trayCount - 1);\n if (state.trayCount === 0) state.trayViewport = null;\n Object.values(state.windows).forEach((entry) => {\n if (entry.traySlot === null || entry.traySlot <= freedSlot) return;\n const nextSlot = entry.traySlot - 1;\n entry.traySlot = nextSlot;\n const nextRect = rectBySlot.get(nextSlot);\n if (nextRect) entry.windowed = nextRect;\n });\n Object.values(state.pendingRestores).forEach((session) => {\n if (session.traySlot === null || session.traySlot <= freedSlot) return;\n const nextSlot = session.traySlot - 1;\n session.traySlot = nextSlot;\n const nextRect = rectBySlot.get(nextSlot);\n if (nextRect) session.renderRect = nextRect;\n });\n recomputeAllTrayRects(state);\n}\n\nfunction releaseTraySlot(state: WindowManagerState, win: WindowEntry): void {\n const freedSlot = win.traySlot;\n if (freedSlot === null) return;\n const freedRect = { ...win.windowed };\n win.traySlot = null;\n compactReservedTraySlot(state, freedSlot, freedRect);\n}\n\n// ─── Slice ────────────────────────────────────────────────────────────────────\n\nconst windowManagerSlice = createSlice({\n name: \"windowManager\",\n initialState,\n reducers: {\n /**\n * Put a transient (lite) window on top of the shared stack, or raise one\n * that is already there. Same counter as `focusWindow`, so heavy and lite\n * windows interleave correctly.\n */\n raiseTransientWindow(state, action: PayloadAction<string>) {\n state.transientZ[action.payload] = state.nextZIndex++;\n },\n\n /** Drop a transient window's z registration when it unmounts. */\n releaseTransientWindow(state, action: PayloadAction<string>) {\n delete state.transientZ[action.payload];\n },\n\n /** Register a new window. Idempotent — ignored if id already exists. */\n registerWindow(\n state,\n action: PayloadAction<{\n id: string;\n title?: string;\n initial: WindowRect;\n initialState?: \"windowed\" | \"minimized\";\n persistence?: WindowPersistenceRegistration;\n viewport?: { width: number; height: number };\n }>,\n ) {\n const { id, title, initial, initialState, persistence, viewport } =\n action.payload;\n if (state.windows[id]) return;\n\n // Defense in depth against the \"window opens invisible\" class: a caller\n // that computed its initial rect against a degenerate viewport (hidden /\n // prerendered page → innerWidth 0 → \"90vw\" → width 0) would otherwise\n // register a zero-size or off-screen rect that nothing ever heals.\n // clampRectToViewport rejects non-positive sizes (→ centered fallback\n // dims) and pulls off-screen coords back into reach; it is a no-op for\n // sane rects and self-guards against a degenerate viewport payload.\n const safeInitial = viewport\n ? clampRectToViewport(initial, viewport)\n : initial;\n\n const pending = persistence\n ? state.pendingRestores[\n windowSessionKey(persistence.overlayId, persistence.instanceId)\n ]\n : undefined;\n const pendingRenderRect = pending\n ? pending.state === \"minimized\" && pending.traySlot !== null && viewport\n ? traySlotRect(\n pending.traySlot,\n viewport.width,\n viewport.height,\n state.trayCount,\n )\n : viewport\n ? clampRectToViewport(pending.windowedRect, viewport)\n : pending.renderRect\n : undefined;\n const startsMinimized =\n !pending && initialState === \"minimized\" && viewport !== undefined;\n const initialTraySlot = startsMinimized ? state.trayCount : null;\n state.windows[id] = {\n id,\n title: title ?? pending?.title ?? id,\n state: pending?.state ?? (startsMinimized ? \"minimized\" : \"windowed\"),\n windowed: pendingRenderRect ?? safeInitial,\n preMinimizedRect:\n pending?.state === \"minimized\"\n ? pending.windowedRect\n : startsMinimized\n ? safeInitial\n : null,\n zIndex: pending?.zIndex ?? state.nextZIndex++,\n traySlot:\n pending?.state === \"minimized\" ? pending.traySlot : initialTraySlot,\n popoutMode: null,\n prePopoutRect: null,\n ...(persistence\n ? {\n persistence: {\n ...persistence,\n data: { ...(pending?.data ?? {}), ...persistence.data },\n sidebarOpen: pending?.sidebarOpen ?? persistence.sidebarOpen,\n sidebarSize: pending?.sidebarSize ?? persistence.sidebarSize,\n closing: false,\n },\n }\n : {}),\n };\n\n if (pending?.state === \"minimized\" && pending.traySlot !== null) {\n state.trayCount = Math.max(state.trayCount, pending.traySlot + 1);\n } else if (startsMinimized && viewport) {\n state.trayCount += 1;\n state.trayViewport = viewport;\n recomputeAllTrayRects(state);\n }\n if (pending && pending.zIndex >= state.nextZIndex) {\n state.nextZIndex = pending.zIndex + 1;\n }\n // Opening a brand-new window is an explicit \"show me\" intent. Never let a\n // stale global hide-all (windowsHidden) silently render it invisible —\n // that is the silent-failure class this slice must structurally prevent.\n if (state.windowsHidden) state.windowsHidden = false;\n },\n\n /** Stage validated local sessions without creating phantom live windows. */\n hydrateWindowSessions(\n state,\n action: PayloadAction<{\n sessions: HydratedWindowSession[];\n viewportWidth: number;\n viewportHeight: number;\n }>,\n ) {\n const liveEntries = Object.values(state.windows).sort(\n (a, b) => a.zIndex - b.zIndex || a.id.localeCompare(b.id),\n );\n const accepted: HydratedWindowSession[] = [];\n action.payload.sessions.forEach((session) => {\n const alreadyLive = Object.values(state.windows).some(\n (entry) =>\n entry.persistence?.overlayId === session.overlayId &&\n entry.persistence.instanceId === session.instanceId &&\n !entry.persistence.closing,\n );\n // Current URL/manual intent wins over a late local hydration.\n if (alreadyLive) return;\n accepted.push(session);\n });\n const trayBase = state.trayCount;\n const acceptedTraySlots = new Map(\n accepted\n .filter(\n (session) =>\n session.state === \"minimized\" && session.traySlot !== null,\n )\n .sort(\n (a, b) =>\n (a.traySlot ?? Number.MAX_SAFE_INTEGER) -\n (b.traySlot ?? Number.MAX_SAFE_INTEGER) ||\n a.sessionKey.localeCompare(b.sessionKey),\n )\n .map(\n (session, index) => [session.sessionKey, trayBase + index] as const,\n ),\n );\n accepted\n .sort(\n (a, b) =>\n a.zIndex - b.zIndex || a.sessionKey.localeCompare(b.sessionKey),\n )\n .forEach((session, index) => {\n const key = windowSessionKey(session.overlayId, session.instanceId);\n const traySlot =\n session.state === \"minimized\"\n ? (acceptedTraySlots.get(session.sessionKey) ?? null)\n : null;\n state.pendingRestores[key] = {\n ...session,\n sessionKey: key,\n traySlot,\n zIndex: BASE_Z + index,\n renderRect:\n traySlot !== null\n ? traySlotRect(\n traySlot,\n action.payload.viewportWidth,\n action.payload.viewportHeight,\n )\n : clampRectToViewport(session.windowedRect, {\n width: action.payload.viewportWidth,\n height: action.payload.viewportHeight,\n }),\n };\n });\n state.trayCount = trayBase + acceptedTraySlots.size;\n state.trayViewport = {\n width: action.payload.viewportWidth,\n height: action.payload.viewportHeight,\n };\n recomputeAllTrayRects(state);\n liveEntries.forEach((entry, index) => {\n entry.zIndex = BASE_Z + accepted.length + index;\n });\n state.nextZIndex = BASE_Z + accepted.length + liveEntries.length;\n },\n\n /** StrictMode-safe: the first mount cleanup may run before the real mount settles. */\n confirmWindowRestored(state, action: PayloadAction<string>) {\n delete state.pendingRestores[action.payload];\n },\n\n discardPendingWindowSession(state, action: PayloadAction<string>) {\n const pending = state.pendingRestores[action.payload];\n if (\n pending?.traySlot !== null &&\n pending?.traySlot !== undefined &&\n !hasMatchingLiveTrayReservation(\n state,\n pending.overlayId,\n pending.instanceId,\n pending.traySlot,\n )\n ) {\n compactReservedTraySlot(state, pending.traySlot, pending.renderRect);\n }\n delete state.pendingRestores[action.payload];\n },\n\n updateWindowPersistence(\n state,\n action: PayloadAction<{\n id: string;\n data?: Record<string, unknown>;\n sidebarOpen?: boolean;\n sidebarSize?: number | null;\n }>,\n ) {\n const entry = state.windows[action.payload.id];\n if (!entry?.persistence || entry.persistence.closing) return;\n if (\n action.payload.data !== undefined &&\n JSON.stringify(entry.persistence.data) !==\n JSON.stringify(action.payload.data)\n ) {\n entry.persistence.data = action.payload.data;\n }\n if (\n action.payload.sidebarOpen !== undefined &&\n entry.persistence.sidebarOpen !== action.payload.sidebarOpen\n ) {\n entry.persistence.sidebarOpen = action.payload.sidebarOpen;\n }\n if (\n action.payload.sidebarSize !== undefined &&\n entry.persistence.sidebarSize !== action.payload.sidebarSize\n ) {\n entry.persistence.sidebarSize = action.payload.sidebarSize;\n }\n },\n\n /** Synchronous tombstone: close can never be undone by an unmount snapshot. */\n markWindowClosing(\n state,\n action: PayloadAction<{ overlayId: string; instanceId: string }>,\n ) {\n const key = windowSessionKey(\n action.payload.overlayId,\n action.payload.instanceId,\n );\n const pending = state.pendingRestores[key];\n const hasMatchingLiveReservation = pending\n ? hasMatchingLiveTrayReservation(\n state,\n action.payload.overlayId,\n action.payload.instanceId,\n pending.traySlot,\n )\n : false;\n if (\n !hasMatchingLiveReservation &&\n pending?.traySlot !== null &&\n pending?.traySlot !== undefined\n ) {\n compactReservedTraySlot(state, pending.traySlot, pending.renderRect);\n }\n delete state.pendingRestores[key];\n Object.values(state.windows).forEach((entry) => {\n if (\n entry.persistence?.overlayId === action.payload.overlayId &&\n entry.persistence.instanceId === action.payload.instanceId\n ) {\n entry.persistence.closing = true;\n }\n });\n },\n\n clearWindowPersistenceState(state) {\n Object.values(state.pendingRestores)\n .filter(\n (session) =>\n session.traySlot !== null &&\n session.traySlot !== undefined &&\n !hasMatchingLiveTrayReservation(\n state,\n session.overlayId,\n session.instanceId,\n session.traySlot,\n ),\n )\n .sort((a, b) => (b.traySlot ?? -1) - (a.traySlot ?? -1))\n .forEach((session) => {\n const traySlot = session.traySlot;\n if (traySlot === null) return;\n compactReservedTraySlot(state, traySlot, session.renderRect);\n });\n state.pendingRestores = {};\n Object.values(state.windows).forEach((entry) => {\n if (entry.persistence) entry.persistence.closing = true;\n });\n },\n\n /** Update just the title (e.g. when prop changes). */\n updateWindowTitle(\n state,\n action: PayloadAction<{ id: string; title: string }>,\n ) {\n const win = state.windows[action.payload.id];\n if (win) win.title = action.payload.title;\n },\n\n /** Remove a window from tracking entirely. */\n unregisterWindow(state, action: PayloadAction<string>) {\n const win = state.windows[action.payload];\n if (!win) return;\n const pending = win.persistence\n ? state.pendingRestores[\n windowSessionKey(\n win.persistence.overlayId,\n win.persistence.instanceId,\n )\n ]\n : undefined;\n const pendingOwnsLiveReservation = Boolean(\n win.persistence &&\n pending &&\n hasMatchingLiveTrayReservation(\n state,\n win.persistence.overlayId,\n win.persistence.instanceId,\n pending.traySlot,\n ),\n );\n if (!pendingOwnsLiveReservation) releaseTraySlot(state, win);\n // Free the PiP slot if this window held it\n if (state.activePipWindowId === action.payload) {\n state.activePipWindowId = null;\n }\n // Clear popout-candidate flag if this window was being dragged out\n if (state.popoutCandidateId === action.payload) {\n state.popoutCandidateId = null;\n }\n delete state.windows[action.payload];\n // A global hide-all flag is meaningless with zero windows and otherwise\n // strands `true` (the sidebar \"Show All\" control is disabled when there\n // are no windows), which would silently hide the NEXT window the user\n // opens. Reset it so the flag can never outlive the windows it governs.\n if (Object.keys(state.windows).length === 0) {\n state.windowsHidden = false;\n }\n },\n\n /** Bring a window to the top of the z stack. */\n focusWindow(state, action: PayloadAction<string>) {\n const win = state.windows[action.payload];\n if (!win) return;\n win.zIndex = state.nextZIndex++;\n },\n\n /** Switch to windowed (restore) state. */\n restoreWindow(state, action: PayloadAction<string>) {\n const win = state.windows[action.payload];\n if (!win) return;\n releaseTraySlot(state, win);\n // Recover the rect we had before minimizing (if any)\n if (win.preMinimizedRect) {\n win.windowed = win.preMinimizedRect;\n win.preMinimizedRect = null;\n }\n win.state = \"windowed\";\n win.zIndex = state.nextZIndex++;\n },\n\n /**\n * Bring an already-registered window unconditionally into view — the\n * single \"show me this panel\" primitive used by the open path.\n *\n * Re-triggering a menu/opener for a window that is already open must never\n * be a silent no-op. Before this existed, an open dispatch only updated\n * overlay-slice data; if the window was minimized, dragged off-screen, or\n * suppressed by `windowsHidden`, the user saw nothing. `revealWindow`:\n * - restores a minimized window to its pre-minimized rect,\n * - clamps the rect back into the current viewport (off-screen rescue),\n * - raises it to the top of the z-stack,\n * - clears the global hide-all flag.\n *\n * No-op when the window isn't registered yet (first open — `registerWindow`\n * handles that). Popped-out windows keep their OS-managed frame; we only\n * clear the global hide so the rest of the desktop is visible.\n *\n * Caller supplies viewport dimensions (reducers can't read `window`).\n */\n revealWindow(\n state,\n action: PayloadAction<{\n id: string;\n viewportWidth: number;\n viewportHeight: number;\n }>,\n ) {\n const { id, viewportWidth, viewportHeight } = action.payload;\n const win = state.windows[id];\n if (!win) return;\n if (state.windowsHidden) state.windowsHidden = false;\n if (win.popoutMode !== null) return; // OS frame owns whether the popout shows\n releaseTraySlot(state, win);\n if (win.state === \"minimized\") {\n if (win.preMinimizedRect) {\n win.windowed = win.preMinimizedRect;\n win.preMinimizedRect = null;\n }\n win.state = \"windowed\";\n }\n if (win.state === \"windowed\") {\n const clamped = clampRectToViewport(win.windowed, {\n width: viewportWidth,\n height: viewportHeight,\n });\n if (!rectsEqual(win.windowed, clamped)) win.windowed = clamped;\n }\n win.zIndex = state.nextZIndex++;\n },\n\n /** Switch to maximized state. */\n maximizeWindow(state, action: PayloadAction<string>) {\n const win = state.windows[action.payload];\n if (!win) return;\n releaseTraySlot(state, win);\n win.state = \"maximized\";\n win.zIndex = state.nextZIndex++;\n },\n\n /**\n * Minimize a window — parks it in the tray grid at the bottom of the\n * viewport. Caller must supply current viewport dimensions so the reducer\n * can compute the exact position without touching window/document.\n */\n minimizeWindow(\n state,\n action: PayloadAction<{\n id: string;\n viewportWidth: number;\n viewportHeight: number;\n }>,\n ) {\n const { id, viewportWidth, viewportHeight } = action.payload;\n const win = state.windows[id];\n if (!win || win.state === \"minimized\") return;\n // Popped-out windows live in a separate browser window — minimize is a\n // no-op for them. The OS PiP frame provides its own minimize behavior.\n if (win.popoutMode !== null) return;\n\n // Save full-size rect so restore can return to it\n win.preMinimizedRect = { ...win.windowed };\n\n // Assign the next available tray slot and compute its position\n const slot = state.trayCount;\n win.traySlot = slot;\n state.trayCount += 1;\n state.trayViewport = { width: viewportWidth, height: viewportHeight };\n win.state = \"minimized\";\n recomputeAllTrayRects(state);\n },\n\n /**\n * Minimize ALL non-minimized, non-maximized windows in one shot.\n * Use for a \"collapse all\" button. Caller supplies viewport dimensions.\n */\n minimizeAll(\n state,\n action: PayloadAction<{ viewportWidth: number; viewportHeight: number }>,\n ) {\n const { viewportWidth, viewportHeight } = action.payload;\n state.trayViewport = { width: viewportWidth, height: viewportHeight };\n Object.values(state.windows).forEach((win) => {\n if (win.state !== \"windowed\") return;\n // Skip popped-out windows — they live in separate browser windows\n // and aren't part of the parent tray model.\n if (win.popoutMode !== null) return;\n win.preMinimizedRect = { ...win.windowed };\n const slot = state.trayCount;\n win.traySlot = slot;\n state.trayCount += 1;\n win.state = \"minimized\";\n });\n recomputeAllTrayRects(state);\n },\n\n /** Update the windowed rect (called during drag or resize). */\n updateWindowRect(\n state,\n action: PayloadAction<{ id: string; rect: Partial<WindowRect> }>,\n ) {\n const win = state.windows[action.payload.id];\n if (!win) return;\n win.windowed = { ...win.windowed, ...action.payload.rect };\n },\n\n /**\n * Clamp a window's `windowed` rect into the current viewport so its body\n * and footer remain reachable.\n *\n * **Why this exists:** drag-and-release outside the viewport (without a\n * popout firing), restore-from-minimize where `preMinimizedRect` was\n * captured at a larger viewport, and dock-from-popout where the docked\n * rect was off-screen all leave the window in a position the user can't\n * reach. We clamp at the boundary where the user expects to \"see\" the\n * window again.\n *\n * **Skips popped-out windows** — their rect is OS-managed, not our\n * concern. Skips minimized + maximized windows — those have their own\n * rect logic that owners shouldn't fight.\n *\n * Caller passes viewport dimensions because reducers can't read\n * `window.innerWidth` (consistent with `minimizeWindow` /\n * `arrangeActiveWindows` patterns).\n */\n clampWindowRect(\n state,\n action: PayloadAction<{\n id: string;\n viewportWidth: number;\n viewportHeight: number;\n }>,\n ) {\n const { id, viewportWidth, viewportHeight } = action.payload;\n const win = state.windows[id];\n if (!win) return;\n if (win.state !== \"windowed\") return; // skip min/max\n if (win.popoutMode !== null) return; // skip popped-out\n const clamped = clampRectToViewport(win.windowed, {\n width: viewportWidth,\n height: viewportHeight,\n });\n // Only write when the geometry actually moved. An unconditional assign\n // hands every subscriber a fresh object on every clamp, so a caller that\n // clamps on each measurement churns the whole window desktop for nothing.\n if (!rectsEqual(win.windowed, clamped)) win.windowed = clamped;\n },\n\n /**\n * Clamp every docked windowed window into the viewport. Dispatched by\n * a global resize listener so windows that were positioned for a larger\n * viewport get nudged back into reach.\n *\n * Mirrors `recomputeTrayPositions`'s coverage for minimized chips.\n */\n clampAllWindowRects(\n state,\n action: PayloadAction<{ viewportWidth: number; viewportHeight: number }>,\n ) {\n const { viewportWidth, viewportHeight } = action.payload;\n Object.values(state.windows).forEach((win) => {\n if (win.state !== \"windowed\") return;\n if (win.popoutMode !== null) return;\n const clamped = clampRectToViewport(win.windowed, {\n width: viewportWidth,\n height: viewportHeight,\n });\n if (!rectsEqual(win.windowed, clamped)) win.windowed = clamped;\n });\n },\n\n /** Arranges all non-minimized windows globally */\n arrangeActiveWindows(\n state,\n action: PayloadAction<{\n layout: GlobalLayoutType;\n viewportWidth: number;\n viewportHeight: number;\n dirX?: \"ltr\" | \"rtl\";\n dirY?: \"ttb\" | \"btt\";\n primary?: \"horizontal\" | \"vertical\";\n }>,\n ) {\n const { layout, viewportWidth, viewportHeight, dirX, dirY, primary } =\n action.payload;\n\n // Get all non-minimized, non-popped-out windows, sorted by zIndex newest first.\n // Popped-out windows live in separate browser windows and shouldn't get\n // assigned a slot in a parent-viewport arrangement.\n const eligibleWindows = Object.values(state.windows)\n .filter((w) => w.state === \"windowed\" && w.popoutMode === null)\n .sort((a, b) => b.zIndex - a.zIndex)\n .map((w) => w.id);\n\n if (eligibleWindows.length === 0) return;\n\n const updates = computeGlobalArrangement(\n layout,\n eligibleWindows,\n viewportWidth,\n viewportHeight,\n dirX,\n dirY,\n primary,\n );\n\n updates.forEach(({ id, rect }) => {\n if (state.windows[id]) {\n state.windows[id].windowed = {\n ...state.windows[id].windowed,\n ...rect,\n };\n }\n });\n },\n\n /**\n * Recompute tray positions for all minimized windows after a viewport\n * resize. Each window keeps its existing traySlot number — only x/y/w/h\n * are recalculated. No-op if nothing is minimized.\n */\n recomputeTrayPositions(\n state,\n action: PayloadAction<{ viewportWidth: number; viewportHeight: number }>,\n ) {\n const { viewportWidth, viewportHeight } = action.payload;\n // A degenerate measurement (hidden tab, display:none ancestor, pre-layout\n // read) is not a resize. Storing it would poison `trayViewport` for every\n // LATER recompute — minimize/restore/register all reuse it — and park\n // every tray chip at a garbage position long after the tab is visible.\n if (\n !Number.isFinite(viewportWidth) ||\n !Number.isFinite(viewportHeight) ||\n viewportWidth <= 0 ||\n viewportHeight <= 0\n ) {\n return;\n }\n state.trayViewport = { width: viewportWidth, height: viewportHeight };\n const minimized = Object.values(state.windows).filter(\n (w) => w.state === \"minimized\" && w.traySlot !== null,\n );\n if (minimized.length === 0) return;\n recomputeAllTrayRects(state);\n },\n\n /**\n * Restore ALL minimized windows to their pre-minimized rects in one shot.\n * Maximized windows are left alone — only minimized ones are affected.\n */\n restoreAll(state) {\n Object.values(state.windows).forEach((win) => {\n if (win.state !== \"minimized\") return;\n if (win.preMinimizedRect) {\n win.windowed = win.preMinimizedRect;\n win.preMinimizedRect = null;\n }\n win.traySlot = null;\n win.state = \"windowed\";\n win.zIndex = state.nextZIndex++;\n });\n Object.values(state.pendingRestores).forEach((session) => {\n if (session.state !== \"minimized\") return;\n session.state = \"windowed\";\n session.traySlot = null;\n session.renderRect = session.windowedRect;\n });\n state.trayCount = 0;\n state.trayViewport = null;\n },\n\n /** Show or hide all windows (they stay mounted). */\n toggleWindowsHidden(state) {\n state.windowsHidden = !state.windowsHidden;\n },\n\n /** Move a minimized chip to a new tray slot (drag-within-tray). */\n moveTraySlot(state, action: PayloadAction<{ id: string; toSlot: number }>) {\n const { id, toSlot } = action.payload;\n const win = state.windows[id];\n if (!win || win.traySlot === null) return;\n const fromSlot = win.traySlot;\n const boundedSlot = Math.min(\n Math.max(0, Math.floor(toSlot)),\n Math.max(0, state.trayCount - 1),\n );\n if (fromSlot === boundedSlot) return;\n const rectBySlot = new Map<number, WindowRect>();\n Object.values(state.windows).forEach((entry) => {\n if (entry.traySlot !== null) {\n rectBySlot.set(entry.traySlot, { ...entry.windowed });\n }\n });\n Object.values(state.pendingRestores).forEach((session) => {\n if (session.traySlot !== null) {\n rectBySlot.set(session.traySlot, { ...session.renderRect });\n }\n });\n // Shift other windows\n Object.values(state.windows).forEach((w) => {\n if (w.id === id || w.traySlot === null) return;\n if (\n fromSlot < boundedSlot &&\n w.traySlot > fromSlot &&\n w.traySlot <= boundedSlot\n ) {\n w.traySlot -= 1;\n } else if (\n fromSlot > boundedSlot &&\n w.traySlot >= boundedSlot &&\n w.traySlot < fromSlot\n ) {\n w.traySlot += 1;\n }\n });\n Object.values(state.pendingRestores).forEach((session) => {\n if (session.traySlot === null) return;\n if (\n fromSlot < boundedSlot &&\n session.traySlot > fromSlot &&\n session.traySlot <= boundedSlot\n ) {\n session.traySlot -= 1;\n } else if (\n fromSlot > boundedSlot &&\n session.traySlot >= boundedSlot &&\n session.traySlot < fromSlot\n ) {\n session.traySlot += 1;\n }\n });\n win.traySlot = boundedSlot;\n Object.values(state.windows).forEach((entry) => {\n if (entry.traySlot === null) return;\n const nextRect = rectBySlot.get(entry.traySlot);\n if (nextRect) entry.windowed = nextRect;\n });\n Object.values(state.pendingRestores).forEach((session) => {\n if (session.traySlot === null) return;\n const nextRect = rectBySlot.get(session.traySlot);\n if (nextRect) session.renderRect = nextRect;\n });\n recomputeAllTrayRects(state);\n },\n\n /**\n * Transition a window into popped-out mode.\n *\n * Caller is responsible for actually opening the Document PiP / popup\n * window FIRST (it requires a synchronous user gesture). This reducer is\n * dispatched only after the window resolves successfully so Redux state\n * always matches reality.\n *\n * If the window is currently minimized, the tray slot is freed first\n * (same compaction logic as `restoreWindow`). The current `windowed`\n * rect is saved to `prePopoutRect` so dock-back returns to the original\n * dimensions.\n *\n * Single-PiP enforcement: callers MUST check `selectActivePipWindowId`\n * before requesting `mode: \"pip\"`. This reducer is defense-in-depth and\n * silently no-ops if a different window already holds the PiP slot.\n */\n popOutWindow(\n state,\n action: PayloadAction<{ id: string; mode: \"pip\" | \"popup\" }>,\n ) {\n const { id, mode } = action.payload;\n const win = state.windows[id];\n if (!win) return;\n // Defense-in-depth: refuse PiP if the slot is taken by a different window.\n if (\n mode === \"pip\" &&\n state.activePipWindowId !== null &&\n state.activePipWindowId !== id\n ) {\n return;\n }\n // Free the tray slot if the window was minimized — the popout is no\n // longer part of the parent tray model.\n if (win.traySlot !== null) {\n releaseTraySlot(state, win);\n // Pop minimized windows back to the windowed state so dock-back has a\n // sensible target. Use preMinimizedRect if available.\n if (win.preMinimizedRect) {\n win.windowed = win.preMinimizedRect;\n win.preMinimizedRect = null;\n }\n win.state = \"windowed\";\n }\n // Save the current windowed rect for dock-back. Don't overwrite if\n // already set (idempotent: a re-dispatch shouldn't lose the original).\n if (win.prePopoutRect === null) {\n win.prePopoutRect = { ...win.windowed };\n }\n win.popoutMode = mode;\n if (mode === \"pip\") {\n state.activePipWindowId = id;\n }\n // Clear any popout-candidate flag — we're past the candidate phase.\n if (state.popoutCandidateId === id) {\n state.popoutCandidateId = null;\n }\n },\n\n /**\n * Transition a popped-out window back into the parent viewport.\n *\n * Centers the window in the parent viewport using `prePopoutRect`\n * width/height (falls back to current `windowed` size), clears\n * `popoutMode`, releases the PiP slot if held, and bumps z-index.\n * Caller is responsible for closing the actual browser popout window.\n */\n dockWindow(state, action: PayloadAction<DockWindowPayload>) {\n const { id, viewportWidth, viewportHeight } = action.payload;\n const win = state.windows[id];\n if (!win || win.popoutMode === null) return;\n if (state.activePipWindowId === win.id) {\n state.activePipWindowId = null;\n }\n\n const savedRect = win.prePopoutRect ?? win.windowed;\n const centered = centerRectInViewport(savedRect, {\n width: viewportWidth,\n height: viewportHeight,\n });\n\n win.windowed = centered;\n win.prePopoutRect = null;\n win.popoutMode = null;\n // Bring back to top of the z-stack (mirrors restoreWindow behavior).\n win.zIndex = state.nextZIndex++;\n },\n\n /**\n * Set or clear the drag-out candidate window. Used purely for visual\n * feedback during a drag: when set, the WindowPanel renders a\n * \"Release to pop out\" outline. Cleared on every pointerup regardless\n * of whether popout actually fires.\n */\n setPopoutCandidate(state, action: PayloadAction<{ id: string | null }>) {\n state.popoutCandidateId = action.payload.id;\n },\n\n /** Restore window geometry and state from localStorage */\n restoreWindowState(\n state,\n action: PayloadAction<Record<string, WindowEntry>>,\n ) {\n const restored = action.payload;\n let maxZ = state.nextZIndex;\n\n Object.entries(restored).forEach(([id, win]) => {\n if (!state.windows[id]) {\n // Skip orphans: only restore geometry for windows that are already\n // registered (i.e. whose component is actually mounted). Creating\n // entries for unregistered ids produces phantom windows in the\n // Visibility tab and inflates trayCount, which pushes minimized\n // chips away from the bottom-right corner.\n return;\n }\n // Window is registered — overwrite with persisted geometry/state.\n // Force popoutMode/prePopoutRect to null on hydration: re-opening\n // a Document PiP requires a fresh user gesture, which we can't\n // produce programmatically. The window restores in the docked state.\n state.windows[id] = {\n ...state.windows[id],\n ...win,\n popoutMode: null,\n prePopoutRect: null,\n };\n if (win.zIndex >= maxZ) maxZ = win.zIndex + 1;\n });\n\n state.nextZIndex = Math.max(state.nextZIndex, maxZ);\n // Popout state is never restored from persistence — clear the slot.\n state.activePipWindowId = null;\n state.popoutCandidateId = null;\n // Recount from scratch to avoid stale counts from the persisted payload\n state.trayCount = Object.values(state.windows).filter(\n (w) => w.traySlot !== null,\n ).length;\n },\n },\n extraReducers: (builder) => {\n builder.addMatcher(\n (action) => action.type === \"overlays/closeOverlay\",\n (state, action) => {\n const payload = (action as { payload?: unknown }).payload;\n if (!payload || typeof payload !== \"object\") return;\n const overlayId = (payload as { overlayId?: unknown }).overlayId;\n const instanceId =\n (payload as { instanceId?: unknown }).instanceId ?? \"default\";\n if (typeof overlayId !== \"string\" || typeof instanceId !== \"string\") {\n return;\n }\n const pending = Object.values(state.pendingRestores).find(\n (session) =>\n session.overlayId === overlayId &&\n session.instanceId === instanceId,\n );\n const hasMatchingLive = pending\n ? hasMatchingLiveTrayReservation(\n state,\n overlayId,\n instanceId,\n pending.traySlot,\n )\n : false;\n if (!hasMatchingLive && pending?.traySlot != null) {\n compactReservedTraySlot(state, pending.traySlot, pending.renderRect);\n }\n if (pending) delete state.pendingRestores[pending.sessionKey];\n Object.values(state.windows).forEach((entry) => {\n if (\n entry.persistence?.overlayId === overlayId &&\n entry.persistence.instanceId === instanceId\n ) {\n entry.persistence.closing = true;\n }\n });\n },\n );\n builder.addMatcher(\n (action) => action.type === \"overlays/closeAllOverlays\",\n (state) => {\n Object.values(state.pendingRestores)\n .filter(\n (session) =>\n session.traySlot !== null &&\n !hasMatchingLiveTrayReservation(\n state,\n session.overlayId,\n session.instanceId,\n session.traySlot,\n ),\n )\n .sort((a, b) => (b.traySlot ?? -1) - (a.traySlot ?? -1))\n .forEach((session) => {\n if (session.traySlot !== null) {\n compactReservedTraySlot(\n state,\n session.traySlot,\n session.renderRect,\n );\n }\n });\n state.pendingRestores = {};\n Object.values(state.windows).forEach((entry) => {\n if (entry.persistence) entry.persistence.closing = true;\n });\n },\n );\n builder.addMatcher(\n (action) => action.type === \"overlays/closeAllInstancesOfOverlay\",\n (state, action) => {\n const payload = (action as { payload?: unknown }).payload;\n const overlayId =\n payload && typeof payload === \"object\" && \"overlayId\" in payload\n ? payload.overlayId\n : null;\n if (typeof overlayId !== \"string\") return;\n Object.values(state.pendingRestores)\n .filter(\n (session) =>\n session.overlayId === overlayId &&\n session.traySlot !== null &&\n !hasMatchingLiveTrayReservation(\n state,\n session.overlayId,\n session.instanceId,\n session.traySlot,\n ),\n )\n .sort((a, b) => (b.traySlot ?? -1) - (a.traySlot ?? -1))\n .forEach((session) => {\n if (session.traySlot !== null) {\n compactReservedTraySlot(\n state,\n session.traySlot,\n session.renderRect,\n );\n }\n });\n Object.entries(state.pendingRestores).forEach(([key, session]) => {\n if (session.overlayId === overlayId)\n delete state.pendingRestores[key];\n });\n Object.values(state.windows).forEach((entry) => {\n if (entry.persistence?.overlayId === overlayId) {\n entry.persistence.closing = true;\n }\n });\n },\n );\n },\n});\n\nexport const {\n raiseTransientWindow,\n releaseTransientWindow,\n registerWindow,\n unregisterWindow,\n focusWindow,\n restoreWindow,\n revealWindow,\n maximizeWindow,\n minimizeWindow,\n minimizeAll,\n restoreAll,\n recomputeTrayPositions,\n updateWindowRect,\n updateWindowTitle,\n toggleWindowsHidden,\n moveTraySlot,\n arrangeActiveWindows,\n popOutWindow,\n dockWindow,\n setPopoutCandidate,\n clampWindowRect,\n clampAllWindowRects,\n restoreWindowState,\n hydrateWindowSessions,\n confirmWindowRestored,\n discardPendingWindowSession,\n updateWindowPersistence,\n markWindowClosing,\n clearWindowPersistenceState,\n} = windowManagerSlice.actions;\n\n// ─── Selectors ────────────────────────────────────────────────────────────────\n\ntype StateWithWM = { windowManager: WindowManagerState };\n\n// Raw slice accessor — used as input selector for derived selectors\nconst selectWindowsMap = (state: StateWithWM) => state.windowManager.windows;\n\nexport const selectPendingWindowRestores = (state: StateWithWM) =>\n state.windowManager.pendingRestores;\n\nexport const selectWindowPersistence = (id: string) => (state: StateWithWM) =>\n state.windowManager.windows[id]?.persistence;\n\nexport const selectWindow = (id: string) => (state: StateWithWM) =>\n state.windowManager.windows[id];\n\nexport const selectWindowState = (id: string) => (state: StateWithWM) =>\n state.windowManager.windows[id]?.state;\n\nexport const selectWindowRect = (id: string) => (state: StateWithWM) =>\n state.windowManager.windows[id]?.windowed;\n\nexport const selectWindowZIndex = (id: string) => (state: StateWithWM) =>\n state.windowManager.windows[id]?.zIndex ?? BASE_Z;\n\n/** z-index for a transient (lite) window; BASE_Z until it has been raised. */\nexport const selectTransientZIndex = (id: string) => (state: StateWithWM) =>\n state.windowManager.transientZ[id] ?? BASE_Z;\n\nexport const selectWindowTitle = (id: string) => (state: StateWithWM) =>\n state.windowManager.windows[id]?.title ?? id;\n\nexport const selectTraySlotWidth = () => TRAY_SLOT_WIDTH;\n\nexport const selectWindowsHidden = (state: StateWithWM) =>\n state.windowManager.windowsHidden;\n\n/**\n * Minimized windows sorted by tray slot ascending.\n * Memoized — only recalculates when the windows map reference changes.\n */\nexport const selectTrayWindows = createSelector([selectWindowsMap], (windows) =>\n Object.values(windows)\n .filter((w) => w.state === \"minimized\")\n .sort((a, b) => (a.traySlot ?? 0) - (b.traySlot ?? 0)),\n);\n\n/** All registered windows sorted by zIndex descending (most-recently-focused first). */\nexport const selectAllWindows = createSelector([selectWindowsMap], (windows) =>\n Object.values(windows).sort((a, b) => b.zIndex - a.zIndex),\n);\n\n/** True when every registered window is minimized (or there are none). */\nexport const selectAllMinimized = createSelector(\n [selectWindowsMap],\n (windows) => {\n const wins = Object.values(windows);\n return wins.length > 0 && wins.every((w) => w.state === \"minimized\");\n },\n);\n\n// ─── Popout selectors ─────────────────────────────────────────────────────────\n\n/** Current popout mode for a window. Returns `null` if docked or unknown id. */\nexport const selectPopoutMode = (id: string) => (state: StateWithWM) =>\n state.windowManager.windows[id]?.popoutMode ?? null;\n\n/** True if the window is currently popped out (either pip or popup mode). */\nexport const selectIsPoppedOut = (id: string) => (state: StateWithWM) =>\n (state.windowManager.windows[id]?.popoutMode ?? null) !== null;\n\n/** The id of the window holding the single Document PiP slot, or `null`. */\nexport const selectActivePipWindowId = (state: StateWithWM) =>\n state.windowManager.activePipWindowId;\n\n/**\n * The id of the window currently being dragged outside the viewport beyond\n * the popout threshold. Used by WindowPanel to render the \"Release to pop\n * out\" outline.\n */\nexport const selectPopoutCandidateId = (state: StateWithWM) =>\n state.windowManager.popoutCandidateId;\n\n/** Saved rect to dock back to. `null` while docked or after dock-back. */\nexport const selectPrePopoutRect = (id: string) => (state: StateWithWM) =>\n state.windowManager.windows[id]?.prePopoutRect ?? null;\n\n/**\n * All windows currently docked (popoutMode === null), sorted by zIndex\n * descending. Used by arrange/tray logic so popped-out windows don't get\n * assigned slots in parent-viewport layouts.\n */\nexport const selectDockedWindows = createSelector(\n [selectWindowsMap],\n (windows) =>\n Object.values(windows)\n .filter((w) => w.popoutMode === null)\n .sort((a, b) => b.zIndex - a.zIndex),\n);\n\nexport const windowManagerReducer = windowManagerSlice.reducer;\n","import type { WindowRect } from \"./types\";\n\n/**\n * Calculates a 4-grid quadrant (2x2).\n * @param index 0: top-left, 1: top-right, 2: bottom-left, 3: bottom-right\n */\nexport function getGrid4Rect(\n index: number,\n vw: number,\n vh: number,\n): WindowRect {\n const w = Math.round(vw / 2);\n const h = Math.round(vh / 2);\n return {\n x: (index % 2) * w,\n y: Math.floor(index / 2) * h,\n width: w,\n height: h,\n };\n}\n\n/**\n * Calculates a 6-grid partition (3 columns x 2 rows).\n * @param index 0-5. 0-2 is top row (left-to-right), 3-5 is bottom row.\n */\nexport function getGrid6Rect(\n index: number,\n vw: number,\n vh: number,\n): WindowRect {\n const w = Math.round(vw / 3);\n const h = Math.round(vh / 2);\n return {\n x: (index % 3) * w,\n y: Math.floor(index / 3) * h,\n width: w,\n height: h,\n };\n}\n\n/**\n * Calculates an 8-window grid (4 columns, 2 a rows)\n */\nexport function getGrid8Rect(\n index: number,\n vw: number,\n vh: number,\n): WindowRect {\n const w = Math.round(vw / 4);\n const h = Math.round(vh / 2);\n return {\n x: (index % 4) * w,\n y: Math.floor((index % 8) / 4) * h,\n width: w,\n height: h,\n };\n}\n\n/**\n * Calculates a 9-window grid (3 columns, 3 rows)\n */\nexport function getGrid9Rect(\n index: number,\n vw: number,\n vh: number,\n): WindowRect {\n const w = Math.round(vw / 3);\n const h = Math.round(vh / 3);\n return {\n x: (index % 3) * w,\n y: Math.floor((index % 9) / 3) * h,\n width: w,\n height: h,\n };\n}\n\n/**\n * Calculates a 12-window grid (4 columns, 3 rows)\n */\nexport function getGrid12Rect(\n index: number,\n vw: number,\n vh: number,\n): WindowRect {\n const w = Math.round(vw / 4);\n const h = Math.round(vh / 3);\n return {\n x: (index % 4) * w,\n y: Math.floor((index % 12) / 4) * h,\n width: w,\n height: h,\n };\n}\n\n/**\n * Calculates 2 stacked windows on the right edge.\n * @param index 0: top right half, 1: bottom right half\n */\nexport function getStackedRight2Rect(\n index: number,\n vw: number,\n vh: number,\n): WindowRect {\n const w = Math.round(vw / 2);\n const h = Math.round(vh / 2);\n return {\n x: w,\n y: (index % 2) * h,\n width: w,\n height: h,\n };\n}\n\n/**\n * Calculates 3 stacked windows on the right edge.\n * @param index 0, 1, 2 top-to-bottom on the right third of the screen.\n */\nexport function getStackedRight3Rect(\n index: number,\n vw: number,\n vh: number,\n): WindowRect {\n const w = Math.round(vw / 3);\n const h = Math.round(vh / 3);\n return {\n x: vw - w,\n y: (index % 3) * h,\n width: w,\n height: h,\n };\n}\n\n/**\n * Calculates 4 stacked windows on the right edge.\n * @param index 0,1,2,3 top-to-bottom on the right quarter of the screen.\n */\nexport function getStackedRight4Rect(\n index: number,\n vw: number,\n vh: number,\n): WindowRect {\n const w = Math.round(vw / 4);\n const h = Math.round(vh / 4);\n return {\n x: vw - w,\n y: (index % 4) * h,\n width: w,\n height: h,\n };\n}\n\n/**\n * Calculates 5 stacked windows on the right edge.\n */\nexport function getStackedRight5Rect(\n index: number,\n vw: number,\n vh: number,\n): WindowRect {\n const w = Math.round(vw / 5);\n const h = Math.round(vh / 5);\n return {\n x: vw - w,\n y: (index % 5) * h,\n width: w,\n height: h,\n };\n}\n\n/**\n * Calculates 2 stacked windows on the left edge.\n * @param index 0: top left half, 1: bottom left half\n */\nexport function getStackedLeft2Rect(\n index: number,\n vw: number,\n vh: number,\n): WindowRect {\n const w = Math.round(vw / 2);\n const h = Math.round(vh / 2);\n return {\n x: 0,\n y: (index % 2) * h,\n width: w,\n height: h,\n };\n}\n\n/**\n * Calculates 3 stacked windows on the left edge.\n * @param index 0, 1, 2 top-to-bottom on the left third of the screen.\n */\nexport function getStackedLeft3Rect(\n index: number,\n vw: number,\n vh: number,\n): WindowRect {\n const w = Math.round(vw / 3);\n const h = Math.round(vh / 3);\n return {\n x: 0,\n y: (index % 3) * h,\n width: w,\n height: h,\n };\n}\n\n/**\n * Calculates 4 stacked windows on the left edge.\n * @param index 0,1,2,3 top-to-bottom on the left quarter of the screen.\n */\nexport function getStackedLeft4Rect(\n index: number,\n vw: number,\n vh: number,\n): WindowRect {\n const w = Math.round(vw / 4);\n const h = Math.round(vh / 4);\n return {\n x: 0,\n y: (index % 4) * h,\n width: w,\n height: h,\n };\n}\n\n/**\n * Calculates 5 stacked windows on the left edge.\n */\nexport function getStackedLeft5Rect(\n index: number,\n vw: number,\n vh: number,\n): WindowRect {\n const w = Math.round(vw / 5);\n const h = Math.round(vh / 5);\n return {\n x: 0,\n y: (index % 5) * h,\n width: w,\n height: h,\n };\n}\n\nexport type GlobalLayoutType =\n | \"grid4\"\n | \"grid6\"\n | \"grid8\"\n | \"grid9\"\n | \"grid12\"\n | \"stackRight2\"\n | \"stackRight3\"\n | \"stackRight4\"\n | \"stackRight5\"\n | \"stackLeft2\"\n | \"stackLeft3\"\n | \"stackLeft4\"\n | \"stackLeft5\";\n\n/**\n * Helper: Applies global arrangement to an array of windows logic.\n * Returns an array of updates to batch dispatch.\n */\nexport function computeGlobalArrangement(\n layout: GlobalLayoutType,\n windowIds: string[],\n vw: number,\n vh: number,\n dirX: \"ltr\" | \"rtl\" = \"rtl\",\n dirY: \"ttb\" | \"btt\" = \"ttb\",\n primary: \"horizontal\" | \"vertical\" = \"vertical\",\n): { id: string; rect: WindowRect }[] {\n const specs: Record<\n GlobalLayoutType,\n {\n cols: number;\n rows: number;\n fn: (i: number, w: number, h: number) => WindowRect;\n }\n > = {\n grid4: { cols: 2, rows: 2, fn: getGrid4Rect },\n grid6: { cols: 3, rows: 2, fn: getGrid6Rect },\n grid8: { cols: 4, rows: 2, fn: getGrid8Rect },\n grid9: { cols: 3, rows: 3, fn: getGrid9Rect },\n grid12: { cols: 4, rows: 3, fn: getGrid12Rect },\n stackRight2: { cols: 1, rows: 2, fn: getStackedRight2Rect },\n stackRight3: { cols: 1, rows: 3, fn: getStackedRight3Rect },\n stackRight4: { cols: 1, rows: 4, fn: getStackedRight4Rect },\n stackRight5: { cols: 1, rows: 5, fn: getStackedRight5Rect },\n stackLeft2: { cols: 1, rows: 2, fn: getStackedLeft2Rect },\n stackLeft3: { cols: 1, rows: 3, fn: getStackedLeft3Rect },\n stackLeft4: { cols: 1, rows: 4, fn: getStackedLeft4Rect },\n stackLeft5: { cols: 1, rows: 5, fn: getStackedLeft5Rect },\n };\n\n const spec = specs[layout];\n // Only fill unique slots — extras used to wrap onto occupied tiles and overlap.\n const slotCount = spec.cols * spec.rows;\n const placed = windowIds.slice(0, slotCount);\n\n return placed.map((id, i) => {\n let col: number;\n let row: number;\n\n if (primary === \"horizontal\") {\n col = i % spec.cols;\n row = Math.floor(i / spec.cols);\n } else {\n row = i % spec.rows;\n col = Math.floor(i / spec.rows);\n }\n\n if (dirX === \"rtl\") {\n col = spec.cols - 1 - col;\n }\n if (dirY === \"btt\") {\n row = spec.rows - 1 - row;\n }\n\n const targetIndex = row * spec.cols + col;\n\n return {\n id,\n rect: spec.fn(targetIndex, vw, vh),\n };\n });\n}\n","/**\n * rectClamp — viewport-safe geometry restoration.\n *\n * When hydrating window geometry from the DB (or the legacy localStorage\n * migration), a rect saved at a larger viewport size or on a different\n * device can land partially or entirely off-screen. This utility clamps\n * stored rects into a sensible shape for the current viewport:\n *\n * - Width/height capped to viewport minus safe margins.\n * - Position nudged into bounds so the complete usable window stays visible.\n * - If the stored rect is entirely nonsensical (e.g. width 0, negative\n * coords with huge values), fall back to a centered default.\n */\n\nexport interface WindowRectLike {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/** Safety padding around the viewport edges. */\nconst VIEWPORT_PADDING = 8;\n\n/** Sensible fallback dimensions when the stored rect is unusable. */\nconst FALLBACK_W = 480;\nconst FALLBACK_H = 360;\n\n/** Once-per-realm latch for the degenerate-viewport clamp warning (global slot, never module `let`). */\nconst CLAMP_WARNED = Symbol.for(\"ai-matrx.summon.clampDegenerateViewportWarned\");\n\n/** SSR / degenerate-measurement fallback viewport. */\nconst FALLBACK_VIEWPORT_W = 1280;\nconst FALLBACK_VIEWPORT_H = 800;\n\n/**\n * Once-per-page latch for the degenerate-measurement scream. Parked on\n * `globalThis` rather than in module scope: this module can be instantiated\n * more than once (separate chunks, a Fast Refresh re-evaluation), and a\n * per-instance flag then screams once *per copy* — which reads as \"repeating\"\n * in the console even though each copy warned exactly once.\n */\nconst DEGENERATE_WARNED = Symbol.for(\n \"ai-matrx.summon.degenerateViewportWarned\",\n);\n\nfunction screamOnceAboutDegenerateMeasurement(\n rawW: number,\n rawH: number,\n): void {\n const host = globalThis as unknown as Record<symbol, unknown>;\n if (host[DEGENERATE_WARNED]) return;\n host[DEGENERATE_WARNED] = true;\n // A zero-sized viewport is a browser lifecycle measurement, not a product\n // failure. Keep recovery visible without feeding console-error capture.\n console.warn(\n \"[window-panels] degenerate viewport measurement\",\n { innerWidth: rawW, innerHeight: rawH },\n \"— using fallback dimensions so window geometry cannot collapse to zero. \" +\n \"Logged once per page; state writers bail out instead of persisting invented dims.\",\n );\n}\n\nexport interface ViewportDims {\n vw: number;\n vh: number;\n /**\n * True when the measurement was unusable (0, negative, non-finite, or SSR)\n * and `vw`/`vh` are invented fallbacks rather than a real screen.\n *\n * **Anything that WRITES geometry state from a viewport read must check this\n * and bail without writing.** Inventing 1280×800 is right for \"give me\n * something to render against\"; it is wrong for \"persist this as the user's\n * geometry\", because the invented value then has to be undone by the next\n * real measurement — and a write per measurement is how a\n * measure → write → re-measure cycle starts.\n */\n degenerate: boolean;\n}\n\n/**\n * Viewport dimensions that are safe to derive or judge window geometry from.\n *\n * `window.innerWidth/innerHeight` can measure 0 (hidden or prerendered page,\n * a background/undisplayed tab, pre-layout read, headless run). Deriving an\n * initial rect from that turns \"90vw\" into width 0 — the window registers a\n * 0×0 rect, renders as nothing, and stays invisible until something\n * re-clamps it (the \"window opens invisible\" class, watchdog reason:\n * zero-size). Judging on-screen position against a 0×0 viewport is just as wrong:\n * every on-screen rect reads as off-screen. A degenerate measurement is never\n * a real screen — fall back to sane dimensions, warn once, and tell the\n * caller so writers can stand down (`degenerate`).\n */\nexport function safeViewportDims(): ViewportDims {\n if (typeof window === \"undefined\") {\n return {\n vw: FALLBACK_VIEWPORT_W,\n vh: FALLBACK_VIEWPORT_H,\n degenerate: true,\n };\n }\n const rawW = window.innerWidth;\n const rawH = window.innerHeight;\n const degenerate =\n !Number.isFinite(rawW) || !Number.isFinite(rawH) || rawW <= 0 || rawH <= 0;\n if (degenerate) screamOnceAboutDegenerateMeasurement(rawW, rawH);\n return {\n vw: Number.isFinite(rawW) && rawW > 0 ? rawW : FALLBACK_VIEWPORT_W,\n vh: Number.isFinite(rawH) && rawH > 0 ? rawH : FALLBACK_VIEWPORT_H,\n degenerate,\n };\n}\n\n/**\n * Clamp a rect into the current viewport. Pure — caller passes both the\n * rect and the viewport so this works in tests without DOM globals.\n *\n * A zero/negative viewport is a degenerate MEASUREMENT (hidden or embedded\n * pane, pre-layout read, headless run) — never a real screen. Clamping\n * against it collapses any rect to `{x:-48, y:0, width:120, height:80}` and\n * that garbage then gets rendered and persisted, so instead we keep the\n * caller's geometry (sanitising only non-finite values) and scream once.\n *\n * @param rect Stored rect from DB / LS.\n * @param viewport { width, height } in CSS pixels.\n */\nexport function clampRectToViewport(\n rect: WindowRectLike,\n viewport: { width: number; height: number },\n): WindowRectLike {\n if (\n !Number.isFinite(viewport.width) ||\n !Number.isFinite(viewport.height) ||\n viewport.width <= 0 ||\n viewport.height <= 0\n ) {\n const host = globalThis as unknown as Record<symbol, unknown>;\n if (!host[CLAMP_WARNED]) {\n host[CLAMP_WARNED] = true;\n console.warn(\n \"[window-panels] clampRectToViewport received a degenerate viewport\",\n viewport,\n \"— skipping clamp so real window geometry is not destroyed.\",\n );\n }\n return {\n x: Number.isFinite(rect.x) ? rect.x : 0,\n y: Number.isFinite(rect.y) ? rect.y : 0,\n width:\n Number.isFinite(rect.width) && rect.width > 0 ? rect.width : FALLBACK_W,\n height:\n Number.isFinite(rect.height) && rect.height > 0\n ? rect.height\n : FALLBACK_H,\n };\n }\n const maxW = Math.max(120, viewport.width - VIEWPORT_PADDING * 2);\n const maxH = Math.max(80, viewport.height - VIEWPORT_PADDING * 2);\n\n // 1. Sanitise width/height. Reject 0, negative, NaN, or absurdly large.\n let width = rect.width;\n if (!Number.isFinite(width) || width <= 0 || width > viewport.width * 4) {\n width = FALLBACK_W;\n }\n width = Math.min(width, maxW);\n\n let height = rect.height;\n if (!Number.isFinite(height) || height <= 0 || height > viewport.height * 4) {\n height = FALLBACK_H;\n }\n height = Math.min(height, maxH);\n\n // 2. Sanitise position. Reject NaN. The complete body must remain reachable:\n // keeping only a title-bar strip visible leaves footer controls below a\n // smaller viewport after a desktop-window resize.\n let x = Number.isFinite(rect.x) ? rect.x : 0;\n let y = Number.isFinite(rect.y) ? rect.y : 0;\n\n const maxX = Math.max(0, viewport.width - width - VIEWPORT_PADDING);\n const maxY = Math.max(0, viewport.height - height - VIEWPORT_PADDING);\n x = Math.max(0, Math.min(maxX, x));\n y = Math.max(0, Math.min(maxY, y));\n\n return { x, y, width, height };\n}\n\n/**\n * Center a rect in the viewport, preserving (clamped) width/height.\n * Used when docking a popped-out window back into the parent page.\n */\nexport function centerRectInViewport(\n rect: WindowRectLike,\n viewport: { width: number; height: number },\n): WindowRectLike {\n const sized = clampRectToViewport({ ...rect, x: 0, y: 0 }, viewport);\n const x = Math.max(0, Math.round((viewport.width - sized.width) / 2));\n const y = Math.max(0, Math.round((viewport.height - sized.height) / 2));\n return { x, y, width: sized.width, height: sized.height };\n}\n\n/**\n * Convenience wrapper that reads the current window dimensions. Only safe\n * to call on the client.\n */\nexport function clampRectToCurrentViewport(\n rect: WindowRectLike,\n): WindowRectLike {\n if (typeof window === \"undefined\") return rect;\n const { vw, vh } = safeViewportDims();\n return clampRectToViewport(rect, { width: vw, height: vh });\n}\n\n/** Exact rect equality. Used to skip no-op geometry writes. */\nexport function rectsEqual(a: WindowRectLike, b: WindowRectLike): boolean {\n return (\n a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height\n );\n}\n","/**\n * Tray layout constants.\n *\n * Hardcoded previously inside `windowManagerSlice.ts` and `WindowTray.tsx`.\n * Centralised here so the mobile-responsive sizing path can derive chip\n * dimensions from a single source.\n *\n * Note: `windowManagerSlice` re-exports `TRAY_CHIP_W` and `TRAY_CHIP_H` for\n * backward compatibility — external consumers should still import from here\n * going forward.\n */\n\n/** Desktop minimized-card width in px. */\nexport const TRAY_CHIP_W_DESKTOP = 240;\n\n/** Desktop minimized-card height in px. */\nexport const TRAY_CHIP_H_DESKTOP = 160;\n\n/** Horizontal gap between chips. */\nexport const TRAY_GAP_X = 8;\n\n/** Vertical gap between rows of chips. */\nexport const TRAY_GAP_Y = 8;\n\n/** Gap from the right viewport edge. */\nexport const TRAY_MARGIN_R = 20;\n\n/** Gap from the bottom viewport edge. */\nexport const TRAY_MARGIN_B = 20;\n\n/** Left boundary: cards never flow farther left than this. */\nexport const TRAY_MARGIN_L = 8;\n\n/** Header-only height used when full cards no longer fit in the viewport. */\nexport const TRAY_COMPACT_H = 32;\n\n/** Tighter gap for the overflow overview grid. */\nexport const TRAY_COMPACT_GAP = 4;\n\n/**\n * Mobile chip width target. The tray becomes a horizontal-scroll strip on\n * mobile, so the width is a target upper bound clamped against the viewport.\n */\nexport const TRAY_CHIP_W_MOBILE_MAX = 180;\n\n/** Mobile chip height — slightly shorter to fit tight screens. */\nexport const TRAY_CHIP_H_MOBILE = 72;\n\n/** Viewport width below which the mobile tray layout takes over. */\nexport const TRAY_MOBILE_BREAKPOINT = 768;\n\n/**\n * Compute the chip width for a given viewport. On mobile, fits ~2 chips\n * across with safe-area padding; never exceeds the desktop size on wider\n * screens.\n */\nexport function computeTrayChipWidth(viewportWidth: number): number {\n if (viewportWidth < TRAY_MOBILE_BREAKPOINT) {\n return Math.min(\n TRAY_CHIP_W_MOBILE_MAX,\n Math.max(120, Math.floor(viewportWidth / 2) - 24),\n );\n }\n return TRAY_CHIP_W_DESKTOP;\n}\n\n/** Chip height for a given viewport. */\nexport function computeTrayChipHeight(viewportWidth: number): number {\n return viewportWidth < TRAY_MOBILE_BREAKPOINT\n ? TRAY_CHIP_H_MOBILE\n : TRAY_CHIP_H_DESKTOP;\n}\n\n/** Number of cards that fit in a tray row at the current viewport width. */\nexport function trayChipsPerRow(viewportWidth: number): number {\n const chipWidth = computeTrayChipWidth(viewportWidth);\n const usable = viewportWidth - TRAY_MARGIN_R - TRAY_MARGIN_L;\n return Math.max(\n 1,\n Math.floor((usable + TRAY_GAP_X) / (chipWidth + TRAY_GAP_X)),\n );\n}\n\n/**\n * Compute the visual rectangle for a tray slot. Slot zero starts at the\n * bottom-right; later slots grow left, then wrap upward into additional rows.\n */\nexport function traySlotRect(\n slot: number,\n viewportWidth: number,\n viewportHeight: number,\n totalSlots = slot + 1,\n): { x: number; y: number; width: number; height: number } {\n const chipWidth = computeTrayChipWidth(viewportWidth);\n const chipHeight = computeTrayChipHeight(viewportWidth);\n const perRow = trayChipsPerRow(viewportWidth);\n const safeSlot = Math.max(0, Math.floor(slot));\n const usableHeight = Math.max(1, viewportHeight - TRAY_MARGIN_B - 8);\n const fullRows = Math.max(\n 1,\n Math.floor((usableHeight + TRAY_GAP_Y) / (chipHeight + TRAY_GAP_Y)),\n );\n const fullCardCapacity = perRow * fullRows;\n\n if (totalSlots > fullCardCapacity) {\n const compactRows = Math.max(\n 1,\n Math.floor(\n (viewportHeight - 16 + TRAY_COMPACT_GAP) /\n (TRAY_COMPACT_H + TRAY_COMPACT_GAP),\n ),\n );\n const compactColumns = Math.max(1, Math.ceil(totalSlots / compactRows));\n const availableWidth = Math.max(\n compactColumns,\n viewportWidth - 16 - TRAY_COMPACT_GAP * (compactColumns - 1),\n );\n const compactWidth = Math.min(\n TRAY_CHIP_W_DESKTOP,\n Math.max(1, Math.floor(availableWidth / compactColumns)),\n );\n const compactCol = safeSlot % compactColumns;\n const compactRow = Math.floor(safeSlot / compactColumns);\n return {\n x:\n viewportWidth -\n 8 -\n compactWidth -\n compactCol * (compactWidth + TRAY_COMPACT_GAP),\n y:\n viewportHeight -\n 8 -\n TRAY_COMPACT_H -\n compactRow * (TRAY_COMPACT_H + TRAY_COMPACT_GAP),\n width: compactWidth,\n height: TRAY_COMPACT_H,\n };\n }\n const col = safeSlot % perRow;\n const row = Math.floor(safeSlot / perRow);\n\n return {\n x:\n viewportWidth -\n TRAY_MARGIN_R -\n chipWidth -\n col * (chipWidth + TRAY_GAP_X),\n y:\n viewportHeight -\n TRAY_MARGIN_B -\n chipHeight -\n row * (chipHeight + TRAY_GAP_Y),\n width: chipWidth,\n height: chipHeight,\n };\n}\n","/**\n * The `urlSync` slice — which open overlays are mirrored into the address bar (`?panels=`).\n * Ported verbatim from matrx-frontend `lib/redux/slices/urlSyncSlice.ts`. The link manager\n * (`@ai-matrx/summon/url`) registers an entry per open, linked instance and marks the store\n * hydrated once the address bar has been read on load.\n */\nimport { createSlice, type PayloadAction } from \"@reduxjs/toolkit\";\n\nexport interface UrlSyncEntry {\n typeKey: string;\n instanceId: string;\n args?: Record<string, string>;\n}\n\nexport interface UrlSyncState {\n /** Keyed by `${typeKey}:${instanceId}`. */\n entries: Record<string, UrlSyncEntry>;\n isHydrated: boolean;\n}\n\nconst initialState: UrlSyncState = {\n entries: {},\n isHydrated: false,\n};\n\nconst urlSyncSlice = createSlice({\n name: \"urlSync\",\n initialState,\n reducers: {\n setHydrated: (state) => {\n state.isHydrated = true;\n },\n registerSyncEntry: (state, action: PayloadAction<UrlSyncEntry>) => {\n const key = `${action.payload.typeKey}:${action.payload.instanceId}`;\n state.entries[key] = action.payload;\n },\n unregisterSyncEntry: (state, action: PayloadAction<{ typeKey: string; instanceId: string }>) => {\n const key = `${action.payload.typeKey}:${action.payload.instanceId}`;\n delete state.entries[key];\n },\n },\n});\n\nexport const linksReducer = urlSyncSlice.reducer;\nexport const { setHydrated, registerSyncEntry, unregisterSyncEntry } = urlSyncSlice.actions;\n\nexport type StateWithUrlSync = { urlSync: UrlSyncState };\n\nexport const selectUrlSyncEntries = (state: StateWithUrlSync) => state.urlSync.entries;\nexport const selectIsUrlHydrated = (state: StateWithUrlSync) => state.urlSync.isHydrated;\n","/**\n * The `overlayState` slice — values a component saves beyond its open data, per open instance\n * (`overlayId:instanceId`). It backs `useOverlayState` and keepAlive \"restore\": the close\n * middleware clears an instance's entry on close unless its definition says `keepAlive:\n * \"restore\"`, in which case the values come back when the instance reopens.\n *\n * Supersedes matrx-frontend `lib/redux/slices/overlayDataSlice.ts` (typed `type` discriminator +\n * whole-blob replace): here each value is a named field so independent children of one overlay\n * write without clobbering each other; `replaceOverlayState` covers the whole-blob case and\n * `hydrateOverlayState` loads saved entries (persistence restore).\n */\nimport { createSlice, type PayloadAction } from \"@reduxjs/toolkit\";\nimport type { InstanceKey } from \"./types\";\n\nexport interface OverlayStateEntry {\n values: Record<string, unknown>;\n updatedAt: number;\n}\n\nexport interface OverlayStateState {\n entries: Record<string, OverlayStateEntry>;\n}\n\nconst initialState: OverlayStateState = { entries: {} };\n\nexport interface SetOverlayStateValuePayload {\n key: InstanceKey;\n name: string;\n value: unknown;\n}\n\nexport interface ReplaceOverlayStatePayload {\n key: InstanceKey;\n values: Record<string, unknown>;\n}\n\nexport interface HydrateOverlayStatePayload {\n /** Entries to load. Existing keys are replaced; others are left alone. */\n entries: Record<string, { values: Record<string, unknown>; updatedAt?: number }>;\n}\n\nconst overlayStateSlice = createSlice({\n name: \"overlayState\",\n initialState,\n reducers: {\n setOverlayStateValue(state, action: PayloadAction<SetOverlayStateValuePayload>) {\n const { key, name, value } = action.payload;\n const entry = (state.entries[key] ??= { values: {}, updatedAt: 0 });\n entry.values[name] = value;\n entry.updatedAt = Date.now();\n },\n replaceOverlayState(state, action: PayloadAction<ReplaceOverlayStatePayload>) {\n const { key, values } = action.payload;\n state.entries[key] = { values: { ...values }, updatedAt: Date.now() };\n },\n clearOverlayState(state, action: PayloadAction<{ key: InstanceKey }>) {\n delete state.entries[action.payload.key];\n },\n hydrateOverlayState(state, action: PayloadAction<HydrateOverlayStatePayload>) {\n const now = Date.now();\n for (const [key, entry] of Object.entries(action.payload.entries)) {\n state.entries[key] = { values: { ...entry.values }, updatedAt: entry.updatedAt ?? now };\n }\n },\n },\n});\n\nexport const overlayStateReducer = overlayStateSlice.reducer;\nexport const { setOverlayStateValue, replaceOverlayState, clearOverlayState, hydrateOverlayState } =\n overlayStateSlice.actions;\n\nexport type StateWithOverlayState = { overlayState: OverlayStateState };\n\nconst EMPTY_VALUES: Readonly<Record<string, unknown>> = Object.freeze({});\n\n/** One saved value, `undefined` when never set. */\nexport const selectOverlayStateValue = (\n state: StateWithOverlayState,\n key: InstanceKey,\n name: string,\n): unknown => state.overlayState.entries[key]?.values[name];\n\n/** Every saved value of an instance (stable empty object when none). */\nexport const selectOverlayStateFor = (\n state: StateWithOverlayState,\n key: InstanceKey,\n): Readonly<Record<string, unknown>> => state.overlayState.entries[key]?.values ?? EMPTY_VALUES;\n","/**\n * Store setup for the overlays system. Two ways to host it:\n *\n * - Own store (default, chat pattern): `createSummonStore({ ports })` — the provider in\n * `./react` creates one when the host passes none.\n * - Host store: mount `summonReducers` under their keys and append\n * `createSummonMiddleware(ports)` to the host's middleware.\n *\n * Slice keys are fixed: `overlays`, `windowManager`, `urlSync`, `overlayState`.\n */\nimport { combineReducers, configureStore, type Middleware, type Reducer, type UnknownAction } from \"@reduxjs/toolkit\";\nimport { linksReducer } from \"./linksSlice\";\nimport { closeLifecycleMiddleware } from \"./middleware/closeLifecycle\";\nimport { createOverlayRenderWatchdogMiddleware } from \"./middleware/renderWatchdog\";\nimport { overlayStateReducer } from \"./overlayStateSlice\";\nimport { overlaysReducer } from \"./overlaysSlice\";\nimport { resolvePorts, type SummonPorts } from \"./ports\";\nimport { windowManagerReducer } from \"./windowManagerSlice\";\n\n/** The four overlays reducers at their canonical root keys. */\nexport const summonReducers = {\n overlays: overlaysReducer,\n windowManager: windowManagerReducer,\n urlSync: linksReducer,\n overlayState: overlayStateReducer,\n};\n\nexport type SummonRootState = {\n [K in keyof typeof summonReducers]: ReturnType<(typeof summonReducers)[K]>;\n};\n\n/** The overlays middleware, in order: close lifecycle, then the render watchdog. */\nexport function createSummonMiddleware(ports?: Partial<SummonPorts>): Middleware[] {\n const resolved = resolvePorts(ports);\n return [closeLifecycleMiddleware as Middleware, createOverlayRenderWatchdogMiddleware(resolved) as Middleware];\n}\n\nexport interface CreateOverlaysStoreOptions {\n ports?: Partial<SummonPorts>;\n preloadedState?: Partial<SummonRootState>;\n /** More reducers mounted beside the overlays keys (a small host that wants one store). */\n extraReducers?: Record<string, Reducer>;\n}\n\n/** A store holding the overlays slices and middleware. */\nexport function createSummonStore(options: CreateOverlaysStoreOptions = {}) {\n // Extra host reducers are opaque here; the store is typed by the overlays keys it guarantees.\n const reducer = combineReducers({ ...options.extraReducers, ...summonReducers }) as unknown as Reducer<\n SummonRootState,\n UnknownAction,\n Partial<SummonRootState>\n >;\n const middleware = createSummonMiddleware(options.ports);\n return configureStore({\n reducer,\n ...(options.preloadedState === undefined ? {} : { preloadedState: options.preloadedState }),\n middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(middleware),\n });\n}\n\nexport type SummonStore = ReturnType<typeof createSummonStore>;\nexport type SummonDispatch = SummonStore[\"dispatch\"];\n","/**\n * Close lifecycle — what happens, in one place, when an overlay instance closes:\n *\n * 1. Window preservation identities are tombstoned (`markWindowClosing`) so no later snapshot or\n * unmount path re-saves a window the person closed (ported from matrx-frontend\n * `features/window-panels/persistence/windowPersistenceCloseMiddleware.ts`).\n * 2. Every handle owned by the closed instance (`overlayId:instanceId`) is disposed — pending\n * requests reject, channels drop their subscribers — so no opener disposes by hand.\n * 3. The instance's `overlayState` is cleared, unless its definition says `keepAlive:\n * \"restore\"` (values come back on reopen). `keepAlive: \"hidden\"` instances stay mounted, so\n * they keep both their handles and their state until the React host evicts them\n * (`releaseOverlayInstance`).\n * 4. Registered close flushers run (the persistence section writes the post-close workspace).\n *\n * Close actions: closeOverlay, toggleOverlay (when it closed), closeAllOverlays,\n * closeAllInstancesOfOverlay, closeOverlaysBoundToPage. Closed instances are found by diffing the\n * open set before and after the reducer, so every path is covered the same way.\n */\nimport type { Dispatch, Middleware, MiddlewareAPI, UnknownAction } from \"@reduxjs/toolkit\";\nimport { globalSlot } from \"@ai-matrx/kit/global-slot\";\nimport { callbackManager } from \"../../handles/callbackManager\";\nimport { clearOverlayState, type StateWithOverlayState } from \"../overlayStateSlice\";\nimport { listOpenInstanceKeys, overlaysRawActions, type StateWithOverlays } from \"../overlaysSlice\";\nimport { getOverlayMeta } from \"../registry\";\nimport { DEFAULT_INSTANCE_ID, parseInstanceKey, type InstanceKey } from \"../types\";\nimport { markWindowClosing, type WindowManagerState } from \"../windowManagerSlice\";\n\ninterface CloseIdentity {\n overlayId: string;\n instanceId: string;\n}\n\n/** What a close meant, for persistence: one exact instance, every instance of an id, or all. */\nexport type WindowCloseIntent =\n | ({ scope: \"exact\" } & CloseIdentity)\n | { scope: \"overlay\"; overlayId: string }\n | { scope: \"all\" };\n\nexport interface CloseEvent {\n /** The intent(s) behind this close (empty when only a page-bound or toggle path closed). */\n readonly intents: readonly WindowCloseIntent[];\n /** Every instance that went from open to closed in this action. */\n readonly closedKeys: readonly InstanceKey[];\n /** The dispatched action's type. */\n readonly actionType: string;\n}\n\nexport type CloseFlusher = (event: CloseEvent) => void;\n\ninterface CloseLifecycleState {\n readonly flushers: Set<CloseFlusher>;\n}\n\nconst closeState = (): CloseLifecycleState =>\n globalSlot<CloseLifecycleState>(\"ai-matrx.summon.closeLifecycle\", () => ({ flushers: new Set() }));\n\n/**\n * Run `flush` synchronously after every close, once tombstones and disposal are done. Replaces the\n * app's `registerWindowPersistenceFlusher`; any number may be registered. Returns the unregister.\n */\nexport function registerCloseFlusher(flush: CloseFlusher): () => void {\n const { flushers } = closeState();\n flushers.add(flush);\n return () => {\n flushers.delete(flush);\n };\n}\n\ntype CloseRootState = StateWithOverlays & Partial<StateWithOverlayState> & { windowManager?: WindowManagerState };\n\nfunction dedupe(identities: CloseIdentity[]): CloseIdentity[] {\n return [...new Map(identities.map((identity) => [`${identity.overlayId}:${identity.instanceId}`, identity])).values()];\n}\n\nfunction preservedIdentities(state: CloseRootState, overlayId?: string): CloseIdentity[] {\n const wm = state.windowManager;\n if (!wm) return [];\n const identities: CloseIdentity[] = [];\n for (const entry of Object.values(wm.windows)) {\n if (!entry.persistence || entry.persistence.closing) continue;\n if (overlayId && entry.persistence.overlayId !== overlayId) continue;\n identities.push({ overlayId: entry.persistence.overlayId, instanceId: entry.persistence.instanceId });\n }\n for (const session of Object.values(wm.pendingRestores)) {\n if (overlayId && session.overlayId !== overlayId) continue;\n identities.push({ overlayId: session.overlayId, instanceId: session.instanceId });\n }\n return identities;\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nconst CLOSE_TYPES: ReadonlySet<string> = new Set([\n overlaysRawActions.closeOverlay.type,\n overlaysRawActions.toggleOverlay.type,\n overlaysRawActions.closeAllOverlays.type,\n overlaysRawActions.closeAllInstancesOfOverlay.type,\n overlaysRawActions.closeOverlaysBoundToPage.type,\n]);\n\n/**\n * Release an instance's handles and saved state now (the React host calls this when it evicts a\n * kept-alive hidden instance). `keepState` keeps `overlayState` (keepAlive \"restore\").\n */\nexport function releaseOverlayInstance(\n dispatch: (action: UnknownAction) => unknown,\n key: InstanceKey,\n options: { keepState?: boolean } = {},\n): void {\n callbackManager.disposeOwner(key);\n if (!options.keepState) dispatch(clearOverlayState({ key }));\n}\n\nfunction closeInstanceResources(api: MiddlewareAPI<Dispatch, CloseRootState>, key: InstanceKey): void {\n const parsed = parseInstanceKey(key);\n const keepAlive = parsed ? getOverlayMeta(parsed.overlayId)?.keepAlive : undefined;\n if (keepAlive === \"hidden\") return;\n const hasState = api.getState().overlayState?.entries[key] !== undefined;\n callbackManager.disposeOwner(key);\n if (keepAlive !== \"restore\" && hasState) api.dispatch(clearOverlayState({ key }));\n}\n\n/** The close-lifecycle middleware (framework-free; one per overlays store). */\nexport const closeLifecycleMiddleware: Middleware<object, CloseRootState> = (api) => (next) => (action) => {\n if (!isPlainRecord(action) || typeof action.type !== \"string\" || !CLOSE_TYPES.has(action.type)) {\n return next(action);\n }\n const type = action.type;\n const payload = isPlainRecord(action.payload) ? action.payload : null;\n const before = api.getState();\n const openBefore = new Set(listOpenInstanceKeys(before));\n\n let closing: CloseIdentity[] = [];\n const intents: WindowCloseIntent[] = [];\n const overlayId = typeof payload?.overlayId === \"string\" ? payload.overlayId : null;\n\n if (type === overlaysRawActions.closeAllOverlays.type) {\n closing = preservedIdentities(before);\n intents.push({ scope: \"all\" });\n } else if (type === overlaysRawActions.closeAllInstancesOfOverlay.type && overlayId) {\n closing = preservedIdentities(before, overlayId);\n intents.push({ scope: \"overlay\", overlayId });\n } else if ((type === overlaysRawActions.closeOverlay.type || type === overlaysRawActions.toggleOverlay.type) && overlayId) {\n const instanceId = typeof payload?.instanceId === \"string\" ? payload.instanceId : DEFAULT_INSTANCE_ID;\n const wasOpen = before.overlays.overlays[overlayId]?.[instanceId]?.isOpen === true;\n if (type === overlaysRawActions.closeOverlay.type || wasOpen) {\n closing = [{ overlayId, instanceId }];\n intents.push({ scope: \"exact\", overlayId, instanceId });\n }\n }\n\n const result = next(action);\n\n const openAfter = new Set(listOpenInstanceKeys(api.getState()));\n const closedKeys = [...openBefore].filter((key) => !openAfter.has(key)) as InstanceKey[];\n if (type === overlaysRawActions.closeOverlaysBoundToPage.type) {\n for (const key of closedKeys) {\n const parsed = parseInstanceKey(key);\n if (parsed) closing.push(parsed);\n }\n }\n\n const exact = dedupe(closing);\n if (api.getState().windowManager) {\n for (const identity of exact) api.dispatch(markWindowClosing(identity));\n }\n\n // An exact close of an instance that was not open still releases what it owns.\n const released = new Set<InstanceKey>(closedKeys);\n for (const intent of intents) {\n if (intent.scope === \"exact\") released.add(`${intent.overlayId}:${intent.instanceId}`);\n }\n for (const key of released) closeInstanceResources(api, key);\n\n if (\n exact.length > 0 ||\n closedKeys.length > 0 ||\n type === overlaysRawActions.closeAllOverlays.type ||\n type === overlaysRawActions.closeAllInstancesOfOverlay.type\n ) {\n // The reducer may have removed a pending-only session that was never open in the overlays\n // slice, so flush whatever the reducer produced regardless.\n const event: CloseEvent = { intents, closedKeys, actionType: type };\n for (const flush of [...closeState().flushers]) flush(event);\n }\n return result;\n};\n","/**\n * The handles registry — everything that cannot travel through Redux (callbacks, event channels,\n * one-shot requests, imperative object handles) lives here under a string id; only the id goes\n * into overlay open data.\n *\n * Successor of `@ai-matrx/chat` `utils/callbackManager.ts` with the SAME public verbs and types, so\n * moving a caller is an import-path swap. Changes (CHANGELOG 0.1.0):\n * 1. State lives in the global slot \"ai-matrx.summon.handles\", never in module scope: a\n * duplicated module graph (ESM + CJS, unsplit bundles, two packages) sees one registry.\n * 2. Removal bug fixed: `trigger` / `triggerWithContext` / `remove` deleted the entry BEFORE\n * `removeFromGroups` read it, so group membership never shrank and emptied groups were never\n * dropped. Removal now reads the entry first, in one place (`deleteEntry`).\n * 3. Owner scoping: `registerWithContext(cb, { owner })` (an InstanceKey `overlayId:instanceId`)\n * ties the entry to an open overlay instance; `disposeOwner(owner)` removes everything it\n * owns. The overlays close middleware calls it, so no opener disposes by hand.\n * 4. The object slot is handle-agnostic: `registerWidgetHandle<H extends object>(handle)` stores\n * any object (no chat `WidgetHandle` import).\n * 5. Ids come from `crypto.randomUUID` (no `uuid` dependency), with a fallback for insecure\n * contexts where `randomUUID` is absent.\n *\n * Framework-free: no React, no Redux.\n */\nimport { globalSlot } from \"@ai-matrx/kit/global-slot\";\nimport { newHandleId } from \"./ids\";\n\nexport type CallbackContext = Record<string, unknown>;\n\nexport interface ProgressInfo {\n progress?: number;\n status?: \"pending\" | \"running\" | \"completed\" | \"error\";\n error?: Error;\n}\n\nexport type Callback<T = unknown, C extends CallbackContext = CallbackContext> = (\n data: T,\n context?: C,\n) => void | Promise<void>;\n\n/** What an entry's slot holds: a callback, or an object handle retrieved with `get`. */\nexport type HandleSlot = Callback<never, never> | object;\n\nexport interface RegisterOptions<C extends CallbackContext = CallbackContext> {\n context?: C;\n groupId?: string;\n /** The InstanceKey (`overlayId:instanceId`) that owns this entry; disposed when it closes. */\n owner?: string;\n}\n\nexport interface TriggerOptions<C extends CallbackContext = CallbackContext> {\n context?: C;\n progress?: ProgressInfo;\n removeAfterTrigger?: boolean;\n}\n\n/** A registry entry. `callback` is the heterogeneous slot (function or object handle). */\ninterface CallbackEntry {\n callback: HandleSlot;\n context?: CallbackContext;\n groupId?: string;\n owner?: string;\n listeners?: Array<Callback<never, never>>;\n /** Runs once when the entry leaves the registry for any reason (requests reject here). */\n onRemove?: () => void;\n}\n\ninterface HandlesState {\n readonly callbacks: Map<string, CallbackEntry>;\n readonly groups: Map<string, Set<string>>;\n readonly owners: Map<string, Set<string>>;\n readonly registryListeners: Set<() => void>;\n}\n\nexport const HANDLES_SLOT = \"ai-matrx.summon.handles\";\n\nconst handlesState = (): HandlesState =>\n globalSlot<HandlesState>(HANDLES_SLOT, () => ({\n callbacks: new Map(),\n groups: new Map(),\n owners: new Map(),\n registryListeners: new Set(),\n }));\n\n/** Invoke a slot as a callback (a function slot only; object handles are never invoked). */\nfunction invoke(slot: HandleSlot, data: unknown, context?: CallbackContext): void | Promise<void> {\n if (typeof slot !== \"function\") return undefined;\n return (slot as Callback<unknown, CallbackContext>)(data, context);\n}\n\nfunction invokeListener(listener: Callback<never, never>, data: unknown, context?: CallbackContext): void | Promise<void> {\n return (listener as Callback<unknown, CallbackContext>)(data, context);\n}\n\n/** Internal registration options beyond the public ones (used by the typed helpers). */\nexport interface InternalRegisterOptions extends RegisterOptions {\n id?: string;\n onRemove?: () => void;\n}\n\nexport class CallbackManager {\n private get s(): HandlesState {\n return handlesState();\n }\n\n /**\n * Observe the registry itself: `listener` runs after any entry is added or removed. This lets a\n * view that resolves ids with `get` re-render when an id goes away (`useSyncExternalStore`).\n */\n subscribeToRegistry(listener: () => void): () => void {\n const listeners = this.s.registryListeners;\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n }\n\n private notifyRegistry(): void {\n for (const listener of [...this.s.registryListeners]) listener();\n }\n\n /** Register a callback; returns its id. */\n register<T>(callback: Callback<T>): string {\n return this.registerEntry(callback as HandleSlot, {});\n }\n\n /** Register with optional context, group and owner. */\n registerWithContext<T, C extends CallbackContext = CallbackContext>(\n callback: Callback<T, C>,\n options: RegisterOptions<C> = {},\n ): string {\n return this.registerEntry(callback as HandleSlot, options);\n }\n\n /** @internal The one insertion path (typed helpers pass a fixed id and a removal hook). */\n registerEntry(slot: HandleSlot, options: InternalRegisterOptions): string {\n const s = this.s;\n const callbackId = options.id ?? newHandleId();\n if (s.callbacks.has(callbackId)) this.deleteEntry(callbackId, false);\n const entry: CallbackEntry = { callback: slot };\n if (options.context !== undefined) entry.context = options.context;\n if (options.groupId !== undefined) entry.groupId = options.groupId;\n if (options.owner !== undefined) entry.owner = options.owner;\n if (options.onRemove !== undefined) entry.onRemove = options.onRemove;\n s.callbacks.set(callbackId, entry);\n\n if (options.groupId !== undefined) {\n const group = s.groups.get(options.groupId) ?? new Set<string>();\n group.add(callbackId);\n s.groups.set(options.groupId, group);\n }\n if (options.owner !== undefined) {\n const owned = s.owners.get(options.owner) ?? new Set<string>();\n owned.add(callbackId);\n s.owners.set(options.owner, owned);\n }\n this.notifyRegistry();\n return callbackId;\n }\n\n /** Subscribe to results for a callback id. */\n subscribe<T, C extends CallbackContext = CallbackContext>(callbackId: string, listener: Callback<T, C>): boolean {\n const entry = this.s.callbacks.get(callbackId);\n if (!entry) return false;\n (entry.listeners ??= []).push(listener as Callback<never, never>);\n return true;\n }\n\n /** Unsubscribe a listener from a callback id. */\n unsubscribe<T, C extends CallbackContext = CallbackContext>(callbackId: string, listener: Callback<T, C>): boolean {\n const entry = this.s.callbacks.get(callbackId);\n if (!entry || !entry.listeners) return false;\n const index = entry.listeners.indexOf(listener as Callback<never, never>);\n if (index === -1) return false;\n entry.listeners.splice(index, 1);\n return true;\n }\n\n /** Run a callback once, notify its listeners, then remove it. */\n trigger<T>(callbackId: string, data: T): void {\n const entry = this.s.callbacks.get(callbackId);\n if (!entry) return;\n void invoke(entry.callback, data);\n if (entry.listeners && entry.listeners.length > 0) {\n for (const listener of [...entry.listeners]) void invokeListener(listener, data);\n }\n this.deleteEntry(callbackId, true);\n }\n\n /** Trigger with merged context and progress; removes unless `removeAfterTrigger: false`. */\n triggerWithContext<T, C extends CallbackContext = CallbackContext>(\n callbackId: string,\n data: T,\n options?: TriggerOptions<C>,\n ): void {\n const entry = this.s.callbacks.get(callbackId);\n if (!entry) return;\n const mergedContext: CallbackContext = {\n ...entry.context,\n ...options?.context,\n ...(options?.progress && { progress: options.progress }),\n };\n void invoke(entry.callback, data, mergedContext);\n if (entry.listeners && entry.listeners.length > 0) {\n for (const listener of [...entry.listeners]) void invokeListener(listener, data, mergedContext);\n }\n if (options?.removeAfterTrigger !== false) this.deleteEntry(callbackId, true);\n }\n\n /** Trigger every callback in a group. */\n triggerGroup<T, C extends CallbackContext = CallbackContext>(groupId: string, data: T, options?: TriggerOptions<C>): void {\n const group = this.s.groups.get(groupId);\n if (!group) return;\n for (const callbackId of [...group]) this.triggerWithContext(callbackId, data, options);\n if (options?.removeAfterTrigger !== false) this.s.groups.delete(groupId);\n }\n\n /**\n * Run the one durable command registered for a group. A command is retained on rejection so its\n * caller can retry, and is removed only after its promise settles successfully.\n */\n async triggerGroupCommand<T, C extends CallbackContext = CallbackContext>(\n groupId: string,\n data: T,\n options?: { context?: C; removeAfterSuccess?: boolean },\n ): Promise<void> {\n const group = this.s.groups.get(groupId);\n const callbackIds = group ? [...group] : [];\n const callbackId = callbackIds[0];\n if (callbackIds.length !== 1 || callbackId === undefined) {\n throw new Error(`Expected exactly one command callback for group \"${groupId}\", found ${callbackIds.length}`);\n }\n const entry = this.s.callbacks.get(callbackId);\n if (!entry) throw new Error(`Command callback \"${callbackId}\" is no longer available`);\n\n const mergedContext: CallbackContext = { ...entry.context, ...options?.context };\n await invoke(entry.callback, data, mergedContext);\n\n // Observers never control command settlement: the command already acknowledged.\n for (const listener of entry.listeners ?? []) {\n try {\n await invokeListener(listener, data, mergedContext);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(\"[overlays/handles] command observer failed\", error);\n }\n }\n\n if (options?.removeAfterSuccess !== false) {\n this.deleteEntry(callbackId, true);\n this.s.groups.delete(groupId);\n }\n }\n\n /** Report progress to a callback (or every callback of a group) without removing it. */\n updateProgress(\n id: string,\n progress: number,\n options?: { status?: ProgressInfo[\"status\"]; error?: Error; groupId?: boolean },\n ): void {\n const progressInfo: ProgressInfo = { progress, status: options?.status || \"running\" };\n if (options?.error !== undefined) progressInfo.error = options.error;\n if (options?.groupId) {\n this.triggerGroup(id, null, { progress: progressInfo, removeAfterTrigger: false });\n } else {\n this.triggerWithContext(id, null, { progress: progressInfo, removeAfterTrigger: false });\n }\n }\n\n /** Create a new, empty group and return its id. */\n createGroup(): string {\n const groupId = newHandleId();\n this.s.groups.set(groupId, new Set());\n return groupId;\n }\n\n /** Remove one entry (and its group/owner membership). */\n remove(callbackId: string): void {\n this.deleteEntry(callbackId, true);\n }\n\n /** Alias of `remove` — the preferred name when unregistering a handle on unmount. */\n unregister(callbackId: string): void {\n this.remove(callbackId);\n }\n\n /** The stored callback or object handle for an id, without invoking it. */\n get<T = unknown>(callbackId: string): T | undefined {\n return this.s.callbacks.get(callbackId)?.callback as T | undefined;\n }\n\n /** True when the id is registered. */\n has(callbackId: string): boolean {\n return this.s.callbacks.has(callbackId);\n }\n\n /**\n * Register an object handle (a widget handle, an editor API, …). The object occupies the slot;\n * it is never invoked by `trigger`, only retrieved with `get`.\n */\n registerWidgetHandle<H extends object>(handle: H, options: { owner?: string } = {}): string {\n return this.registerEntry(handle, options.owner === undefined ? {} : { owner: options.owner });\n }\n\n /** Remove a group and all its callbacks. */\n removeGroup(groupId: string): void {\n const s = this.s;\n const group = s.groups.get(groupId);\n if (!group) return;\n s.groups.delete(groupId);\n for (const callbackId of [...group]) this.deleteEntry(callbackId, false);\n this.notifyRegistry();\n }\n\n /** Remove everything registered with `owner` (an InstanceKey). Returns how many were removed. */\n disposeOwner(owner: string): number {\n const s = this.s;\n const owned = s.owners.get(owner);\n if (!owned) return 0;\n s.owners.delete(owner);\n const ids = [...owned];\n for (const callbackId of ids) this.deleteEntry(callbackId, false);\n if (ids.length > 0) this.notifyRegistry();\n return ids.length;\n }\n\n /** Ids currently owned by `owner`. */\n ownedBy(owner: string): readonly string[] {\n return [...(this.s.owners.get(owner) ?? [])];\n }\n\n /** The member ids of a group (empty when unknown). */\n groupMembers(groupId: string): readonly string[] {\n return [...(this.s.groups.get(groupId) ?? [])];\n }\n\n /** Total registered entries (diagnostics, leak tests). */\n size(): number {\n return this.s.callbacks.size;\n }\n\n /**\n * The one removal path. Reads the entry BEFORE deleting it so group and owner membership shrink\n * (the old `removeFromGroups`-after-delete bug), then runs the entry's removal hook.\n */\n private deleteEntry(callbackId: string, notify: boolean): void {\n const s = this.s;\n const entry = s.callbacks.get(callbackId);\n if (!entry) return;\n s.callbacks.delete(callbackId);\n if (entry.groupId !== undefined) {\n const group = s.groups.get(entry.groupId);\n group?.delete(callbackId);\n if (group?.size === 0) s.groups.delete(entry.groupId);\n }\n if (entry.owner !== undefined) {\n const owned = s.owners.get(entry.owner);\n owned?.delete(callbackId);\n if (owned?.size === 0) s.owners.delete(entry.owner);\n }\n if (notify) this.notifyRegistry();\n entry.onRemove?.();\n }\n}\n\n/** The process-wide handles registry (state in the global slot; every instance shares it). */\nexport const callbackManager = new CallbackManager();\n\n/** Remove everything owned by an open instance (`overlayId:instanceId`). */\nexport function disposeOwner(owner: string): number {\n return callbackManager.disposeOwner(owner);\n}\n","/** A fresh handle id: `crypto.randomUUID` when present, else a v4 UUID from `getRandomValues`. */\nexport function newHandleId(): string {\n const c: Crypto | undefined = typeof globalThis.crypto === \"undefined\" ? undefined : globalThis.crypto;\n if (c && typeof c.randomUUID === \"function\") return c.randomUUID();\n const bytes = new Uint8Array(16);\n if (c && typeof c.getRandomValues === \"function\") {\n c.getRandomValues(bytes);\n } else {\n for (let i = 0; i < 16; i += 1) bytes[i] = Math.floor(Math.random() * 256);\n }\n bytes[6] = ((bytes[6] ?? 0) & 0x0f) | 0x40;\n bytes[8] = ((bytes[8] ?? 0) & 0x3f) | 0x80;\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n","/**\n * overlayRenderWatchdog\n *\n * Makes \"a panel was triggered but silently never appeared\" structurally\n * impossible to ship unnoticed. Two responsibilities, one middleware:\n *\n * 1. REVEAL — on every open of a window-kind overlay, dispatch `revealWindow`\n * so an already-registered window that is minimized, dragged off-screen, or\n * suppressed by the global hide-all is brought back into view. Re-opening a\n * window must never be a silent no-op.\n *\n * 2. DETECT — after the open, inspect actual Redux + viewport state and\n * confirm a *visible* panel is on screen. If not, SCREAM (console.error)\n * and surface a self-healing toast. This is the loud recovery layer\n * mandated by CLAUDE.md: a recovery firing means a real bug got past the\n * proactive layer.\n *\n * The one state a fixed timer cannot distinguish is \"lazy chunk still loading\"\n * vs \"never mounted\" — every window component enters through `next/dynamic`,\n * and a cold dev compile (or a slow network fetch in prod) can take far longer\n * than any polite delay. The watchdog therefore treats the WindowPanel mount\n * acknowledgement (`ackOverlayRender`, called from WindowPanel's mount effect,\n * i.e. strictly after the dynamic import settled) as the chunk-settle signal:\n * while no ack exists it WAITS for one (bounded by a hard no-mount deadline)\n * instead of screaming, and diagnoses geometry only once the ack arrives. A\n * false scream trains people to ignore the real ones.\n *\n * If a scream does fire and the panel becomes visible afterwards anyway, the\n * toast is auto-dismissed and a recovery note is logged — the loud layer never\n * lingers past the failure it reported.\n *\n * The detector is intentionally scoped to SINGLETON window-kind overlays — the\n * surfaces that render through `WindowPanel` and join the window manager. Non-\n * window overlays (dialogs/sheets/toasts) don't register geometry and would\n * false-positive, so they're skipped. Multi-instance windows carry per-instance\n * ids we don't track here and are skipped too.\n *\n * The pure decision (`diagnoseOverlayRender`) is exported separately so it can\n * be unit-tested without a store, a DOM, or timers.\n *\n * Ported from matrx-frontend `features/window-panels/diagnostics/overlayRenderWatchdog.ts`.\n * Seams inverted: toast → `ports.notify`, the console scream → `ports.errors`, the window\n * metadata lookup → the core definition registry (`meta.window` = window kind, `meta.instance`,\n * `defaultWindowIdFor(meta)` = the old registry slug). Ack/waiter/watch maps live in a global\n * slot instead of module scope. The middleware is a factory over ports.\n */\n\nimport type { Dispatch, Middleware, MiddlewareAPI } from \"@reduxjs/toolkit\";\nimport { globalSlot } from \"@ai-matrx/kit/global-slot\";\nimport { selectIsOverlayOpen, type OverlayState } from \"../overlaysSlice\";\nimport { revealWindow, type WindowEntry, type WindowManagerState } from \"../windowManagerSlice\";\nimport { getOverlayMeta } from \"../registry\";\nimport { safeViewportDims } from \"../geometry/rectClamp\";\nimport type { WindowRect } from \"../geometry/types\";\nimport type { SummonPorts } from \"../ports\";\nimport { defaultWindowIdFor, type OverlayDefinitionMeta } from \"../types\";\n\n/**\n * Hard ceiling on waiting for a lazily mounted window: one constant for every subsystem that\n * waits on that physical event (the link manager waits on the same one).\n */\nexport const LAZY_WINDOW_MOUNT_DEADLINE_MS =\n process.env.NODE_ENV === \"production\" ? 12_000 : 45_000;\n\n// Action types emitted by overlaySlice (createSlice name: \"overlays\"). The\n// public `openOverlay` / `toggleOverlay` creators wrap the raw reducers, so we\n// match on the dispatched action's resolved type string rather than a creator.\nconst OPEN_TYPE = \"overlays/openOverlay\";\nconst TOGGLE_TYPE = \"overlays/toggleOverlay\";\nconst DEFAULT_INSTANCE_ID = \"default\";\n\n/** Narrow a dispatched action's `payload` (declared `unknown`) to a plain object. */\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** First look after an open. If the panel already acked (warm chunk), this is\n * the whole geometry check; if not, we switch to waiting for the ack. */\nconst CHECK_DELAY_MS = 2500;\n/** After the mount ack arrives, how long to let `registerWindow` geometry land\n * in Redux before diagnosing (registration runs in an earlier effect than the\n * ack, so this is belt-and-braces, not load-bearing). */\nconst ACK_SETTLE_MS = 300;\n/** One extra look if geometry is somehow still absent right after the ack. */\nconst ACK_SETTLE_RETRY_MS = 700;\n/** Hard ceiling on waiting for a lazy chunk: no WindowPanel ack by this long\n * after open means the panel genuinely never mounted. Dev chunk compiles are\n * the slow case; prod chunk fetches are network-bound but far quicker. ONE\n * constant for every subsystem that waits on a lazily-mounted window — the\n * URL deep-link manager waits on the same physical event. */\nconst NO_MOUNT_DEADLINE_MS = LAZY_WINDOW_MOUNT_DEADLINE_MS;\n/** How long the failure toast stays up, and how often the post-scream watcher\n * re-checks so it can auto-dismiss if the panel shows up after the fact. */\nconst TOAST_DURATION_MS = 8000;\nconst RECOVERY_POLL_MS = 500;\n\n// ── Render acknowledgement registry ─────────────────────────────────────────\n// WindowPanel reports the real window-manager id it rendered under. A\n// registered window that deliberately swaps WindowPanel for an alternate\n// mobile surface reports a surface ack instead: that presentation is visible\n// but owns no window-manager geometry. Both acknowledgements are also the\n// chunk-settle signal that gates the \"no window registered\" verdict.\n\ntype RenderAck =\n | { kind: \"window\"; windowId: string }\n | { kind: \"surface\" };\n\ninterface WatchdogState {\n readonly renderAcks: Map<string, RenderAck>;\n readonly ackWaiters: Map<string, () => void>;\n readonly watches: Map<string, Watch>;\n}\n\nexport const RENDER_WATCHDOG_SLOT = \"ai-matrx.summon.renderWatchdog\";\n\nconst watchdogState = (): WatchdogState =>\n globalSlot<WatchdogState>(RENDER_WATCHDOG_SLOT, () => ({\n renderAcks: new Map(),\n ackWaiters: new Map(),\n watches: new Map(),\n }));\n\nfunction notifyRenderAck(overlayId: string): void {\n const notify = watchdogState().ackWaiters.get(overlayId);\n if (notify) {\n watchdogState().ackWaiters.delete(overlayId);\n notify();\n }\n}\n\nexport function ackOverlayRender(overlayId: string, windowId: string): void {\n watchdogState().renderAcks.set(overlayId, { kind: \"window\", windowId });\n notifyRenderAck(overlayId);\n}\n\nexport function clearOverlayRender(overlayId: string, windowId: string): void {\n const ack = watchdogState().renderAcks.get(overlayId);\n if (ack?.kind === \"window\" && ack.windowId === windowId) {\n watchdogState().renderAcks.delete(overlayId);\n }\n}\n\nexport function ackOverlaySurfaceRender(overlayId: string): void {\n watchdogState().renderAcks.set(overlayId, { kind: \"surface\" });\n notifyRenderAck(overlayId);\n}\n\nexport function clearOverlaySurfaceRender(overlayId: string): void {\n if (watchdogState().renderAcks.get(overlayId)?.kind === \"surface\") {\n watchdogState().renderAcks.delete(overlayId);\n }\n}\n\nfunction acknowledgedWindowId(overlayId: string, fallback: string): string {\n const ack = watchdogState().renderAcks.get(overlayId);\n return ack?.kind === \"window\" ? ack.windowId : fallback;\n}\n\n// ── Pure on-screen diagnosis ───────────────────────────────────────────────\n\nexport type RenderFailureReason =\n | \"no-window-registered\"\n | \"all-windows-hidden\"\n | \"zero-size\"\n | \"off-screen\";\n\nexport type RenderDiagnosis =\n | { ok: true; reason: null }\n | { ok: false; reason: RenderFailureReason };\n\n/** A window counts as on-screen if a usable strip of it intersects the\n * viewport (matches the spirit of `clampRectToViewport`'s safe margin). */\nexport function rectOnScreen(\n rect: WindowRect,\n viewportWidth: number,\n viewportHeight: number,\n): boolean {\n const MARGIN = 24;\n const intersectsX =\n rect.x < viewportWidth - MARGIN && rect.x + rect.width > MARGIN;\n const intersectsY =\n rect.y < viewportHeight - MARGIN && rect.y + rect.height > MARGIN;\n return intersectsX && intersectsY;\n}\n\n/**\n * Given the window's geometry entry and global state, decide whether a visible\n * panel is actually on screen. Pure — no store, DOM, or timers.\n */\nexport function diagnoseOverlayRender(args: {\n entry: WindowEntry | undefined;\n windowsHidden: boolean;\n viewportWidth: number;\n viewportHeight: number;\n surfaceAcknowledged?: boolean;\n}): RenderDiagnosis {\n const {\n entry,\n windowsHidden,\n viewportWidth,\n viewportHeight,\n surfaceAcknowledged = false,\n } = args;\n // Alternate mobile surfaces (for example a purpose-built settings drawer)\n // do not join the window manager. Their mount acknowledgement is the\n // on-screen proof; applying window geometry to them is a category error.\n if (surfaceAcknowledged) return { ok: true, reason: null };\n if (!entry) return { ok: false, reason: \"no-window-registered\" };\n // Popped-out windows live in a separate OS-managed browser window; the\n // global hide-all doesn't apply and there's nothing to verify on our canvas.\n if (entry.popoutMode !== null) return { ok: true, reason: null };\n if (windowsHidden) return { ok: false, reason: \"all-windows-hidden\" };\n // Minimized is a legitimate parked state (reachable via the tray), and the\n // persistence layer can restore a window minimized on purpose. A *user* open\n // is un-minimized by `revealWindow` before this check runs, so a minimized\n // window here is intentional, not a silent failure — don't flag it.\n if (entry.state === \"minimized\") return { ok: true, reason: null };\n if (entry.state === \"maximized\") return { ok: true, reason: null };\n if (entry.windowed.width <= 1 || entry.windowed.height <= 1) {\n return { ok: false, reason: \"zero-size\" };\n }\n if (!rectOnScreen(entry.windowed, viewportWidth, viewportHeight)) {\n return { ok: false, reason: \"off-screen\" };\n }\n return { ok: true, reason: null };\n}\n\nconst REASON_HINT: Record<RenderFailureReason, string> = {\n \"no-window-registered\":\n \"no <WindowPanel> mounted for this overlay — check its definition's render module, the lazy import, and that the component returns a <WindowPanel> when open\",\n \"all-windows-hidden\":\n \"the global 'Hide all windows' flag is on — opening should have cleared it (revealWindow)\",\n \"zero-size\": \"the window rect collapsed to zero size\",\n \"off-screen\": \"the window rect is outside the viewport — opening should have clamped it\",\n};\n\n// ── Watchdog scheduling ─────────────────────────────────────────────────────\n\n// Minimal slice of app state this watchdog reads. Used to type the middleware\n// (and the check helpers) without casting the store.\ntype WMState = { overlays: OverlayState; windowManager: WindowManagerState };\ntype WMApi = MiddlewareAPI<Dispatch, WMState>;\n\ntype WatchdogPorts = Pick<SummonPorts, \"notify\" | \"errors\">;\n\ntype Watch = {\n overlayId: string;\n slug: string;\n label: string;\n ports: WatchdogPorts;\n timer: ReturnType<typeof setTimeout> | null;\n deadlineTimer: ReturnType<typeof setTimeout> | null;\n};\n\n// In-flight watches are deduped per overlayId (WatchdogState.watches) so rapid\n// re-opens don't stack timers (and can't double-scream).\n\nfunction endWatch(watch: Watch): void {\n if (watch.timer !== null) globalThis.clearTimeout(watch.timer);\n if (watch.deadlineTimer !== null) globalThis.clearTimeout(watch.deadlineTimer);\n watchdogState().ackWaiters.delete(watch.overlayId);\n watchdogState().watches.delete(watch.overlayId);\n}\n\ntype Evaluation = {\n viewportWidth: number;\n viewportHeight: number;\n viewportDegenerate: boolean;\n renderAcknowledgement: \"window\" | \"surface\" | \"none\";\n diag: RenderDiagnosis;\n windowId: string;\n entry: WindowEntry | undefined;\n windowsHidden: boolean;\n};\n\n/** Snapshot state and diagnose. Returns null when the overlay has been closed\n * in the meantime — nothing to verify. */\nfunction evaluate(store: WMApi, watch: Watch): Evaluation | null {\n const state = store.getState();\n if (!selectIsOverlayOpen(state, watch.overlayId, DEFAULT_INSTANCE_ID)) {\n return null;\n }\n const ack = watchdogState().renderAcks.get(watch.overlayId);\n const windowId = ack?.kind === \"window\" ? ack.windowId : watch.slug;\n const entry = state.windowManager.windows[windowId];\n // Judge geometry against sanitized dims — a degenerate 0×0 measurement\n // (hidden/prerendered page) makes every on-screen rect read as off-screen,\n // and a false scream trains people to ignore the real ones.\n const { vw, vh, degenerate } = safeViewportDims();\n return {\n viewportWidth: vw,\n viewportHeight: vh,\n viewportDegenerate: degenerate,\n renderAcknowledgement: ack?.kind ?? \"none\",\n diag: diagnoseOverlayRender({\n entry,\n windowsHidden: state.windowManager.windowsHidden,\n viewportWidth: vw,\n viewportHeight: vh,\n surfaceAcknowledged: ack?.kind === \"surface\",\n }),\n windowId,\n entry,\n windowsHidden: state.windowManager.windowsHidden,\n };\n}\n\nfunction startWatch(\n store: WMApi,\n ports: WatchdogPorts,\n overlayId: string,\n slug: string,\n label: string,\n): void {\n if (watchdogState().watches.has(overlayId)) return;\n const watch: Watch = { overlayId, slug, label, ports, timer: null, deadlineTimer: null };\n watchdogState().watches.set(overlayId, watch);\n\n watch.timer = globalThis.setTimeout(() => {\n watch.timer = null;\n const res = evaluate(store, watch);\n if (!res) return endWatch(watch); // closed meanwhile\n if (res.diag.ok) return endWatch(watch);\n\n if (res.diag.reason === \"no-window-registered\" && !watchdogState().renderAcks.has(overlayId)) {\n // No WindowPanel has mounted yet — indistinguishable from a lazy chunk\n // still loading (dev compile / slow fetch). Don't scream on a guess:\n // wait for the mount ack, bounded by the hard no-mount deadline.\n waitForMount(store, watch);\n return;\n }\n\n // Geometry exists (or an acked panel has bad geometry) — a real failure.\n scream(store, watch, res);\n endWatch(watch);\n }, CHECK_DELAY_MS);\n}\n\n/** The chunk-settle wait: resolve on `ackOverlayRender` (dynamic import done,\n * WindowPanel mounted), or scream when the no-mount deadline expires. */\nfunction waitForMount(store: WMApi, watch: Watch): void {\n const checkAfterAck = (delay: number, isRetry: boolean) => {\n watch.timer = globalThis.setTimeout(() => {\n watch.timer = null;\n const res = evaluate(store, watch);\n if (!res) return endWatch(watch);\n if (res.diag.ok) return endWatch(watch);\n if (res.diag.reason === \"no-window-registered\" && !isRetry) {\n // Ack landed but registration hasn't committed yet — one short retry.\n checkAfterAck(ACK_SETTLE_RETRY_MS, true);\n return;\n }\n scream(store, watch, res);\n endWatch(watch);\n }, delay);\n };\n\n watchdogState().ackWaiters.set(watch.overlayId, () => {\n if (watch.deadlineTimer !== null) {\n globalThis.clearTimeout(watch.deadlineTimer);\n watch.deadlineTimer = null;\n }\n checkAfterAck(ACK_SETTLE_MS, false);\n });\n\n watch.deadlineTimer = globalThis.setTimeout(() => {\n watch.deadlineTimer = null;\n watchdogState().ackWaiters.delete(watch.overlayId);\n const res = evaluate(store, watch);\n if (!res) return endWatch(watch);\n if (res.diag.ok) return endWatch(watch);\n scream(store, watch, res);\n endWatch(watch);\n }, NO_MOUNT_DEADLINE_MS);\n}\n\n// LOUD recovery — screams in prod and dev (cheap, and makes the failure\n// auditable from any user's DevTools), with a one-click self-heal. If the\n// panel turns visible while the toast is still up (e.g. a chunk that beat the\n// deadline by seconds), the toast is withdrawn automatically — the scream must\n// only outlive a failure that is still real.\nfunction scream(store: WMApi, watch: Watch, res: Evaluation): void {\n const { overlayId, label } = watch;\n const reason = res.diag.ok ? null : res.diag.reason;\n if (reason === null) return;\n\n watch.ports.errors.capture(\n new Error(\n `[summon] SILENT RENDER FAILURE — overlay \"${overlayId}\" was ` +\n `opened but no visible panel is on screen ` +\n `(reason: ${reason}). ${REASON_HINT[reason]}.`,\n ),\n {\n overlayId,\n windowId: res.windowId,\n viewportWidth: res.viewportWidth,\n viewportHeight: res.viewportHeight,\n viewportDegenerate: res.viewportDegenerate,\n renderAcknowledgement: res.renderAcknowledgement,\n entry: res.entry,\n windowsHidden: res.windowsHidden,\n },\n );\n\n const toastId = `window-watchdog-${overlayId}`;\n watch.ports.notify.error(`\"${label}\" didn't appear`, {\n id: toastId,\n description: \"The panel was opened but isn't visible. Click to show it.\",\n duration: TOAST_DURATION_MS,\n action: {\n label: \"Show it\",\n onClick: () => {\n const dims = safeViewportDims();\n store.dispatch(\n revealWindow({\n id: acknowledgedWindowId(overlayId, watch.slug),\n viewportWidth: dims.vw,\n viewportHeight: dims.vh,\n }),\n );\n },\n },\n });\n\n // Post-scream watcher: for the toast's lifetime, re-check it is on screen and\n // withdraw the toast the moment the panel is actually on screen (or the\n // overlay was closed — nothing left to heal either way).\n let elapsed = 0;\n const interval = globalThis.setInterval(() => {\n elapsed += RECOVERY_POLL_MS;\n const check = evaluate(store, watch);\n if (check === null || check.diag.ok) {\n globalThis.clearInterval(interval);\n watch.ports.notify.dismiss?.(toastId);\n if (check?.diag.ok) {\n // Diagnostic note for developers, not a notice for the person.\n // eslint-disable-next-line no-console\n console.info(\n `[summon] overlay \"${overlayId}\" became visible after the ` +\n `recovery scream — toast withdrawn. If this recurs, the pre-scream ` +\n `wait is ending too early for this panel.`,\n );\n }\n return;\n }\n if (elapsed >= TOAST_DURATION_MS) globalThis.clearInterval(interval);\n }, RECOVERY_POLL_MS);\n}\n\n/**\n * Does the watchdog verify this open? Only SINGLETON window-kind overlays: a\n * multi-instance window renders under a per-instance window id\n * (`transcription-cleanup-<instanceId>`) that is never the registry slug and\n * never acks under the overlay id — so watching it, even when it was opened on\n * the \"default\" instance (the Tools grid / URL hydration open that way), can\n * only end in a false \"didn't appear\" toast over a window that is on screen.\n */\nexport function watchdogTracksOpen(\n meta: Pick<OverlayDefinitionMeta, \"window\" | \"instance\"> | undefined,\n instanceId: string,\n): boolean {\n if (!meta || !meta.window) return false;\n if (meta.instance === \"multi\") return false;\n return instanceId === DEFAULT_INSTANCE_ID;\n}\n\n// ── Middleware ──────────────────────────────────────────────────────────────\n\n/** The render watchdog for a store whose host supplied `ports` (notify + error sink). */\nexport function createOverlayRenderWatchdogMiddleware(ports: WatchdogPorts): Middleware<object, WMState> {\n return (store) => (next) => (action) => {\n const result = next(action);\n\n // Browser-only: no viewport / timers during SSR.\n if (typeof window === \"undefined\") return result;\n\n const typed = action as { type?: string; payload?: unknown };\n if (typed.type !== OPEN_TYPE && typed.type !== TOGGLE_TYPE) return result;\n\n const payload = typed.payload;\n const overlayId =\n isPlainRecord(payload) && typeof payload.overlayId === \"string\"\n ? payload.overlayId\n : undefined;\n if (!overlayId) return result;\n const instanceIdRaw =\n isPlainRecord(payload) && typeof payload.instanceId === \"string\"\n ? payload.instanceId\n : undefined;\n\n // Only singleton windows participate in the geometry/on-screen model;\n // multi-instance windows use per-instance ids we don't track here.\n const meta = getOverlayMeta(overlayId);\n if (!meta || !watchdogTracksOpen(meta, instanceIdRaw ?? DEFAULT_INSTANCE_ID)) {\n return result;\n }\n\n const state = store.getState();\n // `toggleOverlay` may have just CLOSED it — only act when it ended up open.\n if (!selectIsOverlayOpen(state, overlayId, DEFAULT_INSTANCE_ID)) {\n return result;\n }\n\n // 1) Reveal: bring an already-registered window into view immediately\n // (no-op on a first open, where the component hasn't mounted yet —\n // `registerWindow` shows it). This dispatch re-enters the middleware\n // but `revealWindow`'s type is ignored above, so there's no loop.\n const slug = defaultWindowIdFor(meta);\n const revealDims = safeViewportDims();\n store.dispatch(\n revealWindow({\n id: acknowledgedWindowId(overlayId, slug),\n viewportWidth: revealDims.vw,\n viewportHeight: revealDims.vh,\n }),\n );\n\n // 2) Detect: verify a visible panel actually appears.\n startWatch(store, ports, overlayId, slug, meta.label || overlayId);\n\n return result;\n };\n}\n\n/** Test-only: cancel every in-flight watch and forget all acks. */\nexport function resetOverlayRenderWatchdog(): void {\n const s = watchdogState();\n for (const watch of [...s.watches.values()]) endWatch(watch);\n s.renderAcks.clear();\n s.ackWaiters.clear();\n}\n","export interface DockWindowPayload {\n id: string;\n viewportWidth: number;\n viewportHeight: number;\n}\n\n/** Build a dock action payload from the live parent viewport. Client-only. */\nexport function buildDockWindowPayload(windowId: string): DockWindowPayload {\n return {\n id: windowId,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n };\n}\n"],"mappings":"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","names":["import_global_slot","state","import_toolkit","initialState","state","import_toolkit","initialState","state","import_toolkit","initialState","state","import_toolkit","import_global_slot","import_global_slot","state","isPlainRecord","import_global_slot","DEFAULT_INSTANCE_ID","isPlainRecord","state"]}
|