@ai-matrx/summon 0.1.7 → 0.1.8

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.
Files changed (50) hide show
  1. package/CHANGELOG.md +15 -2
  2. package/dist/gate-DUvE-Cc1.d.cts +399 -0
  3. package/dist/gate-DUvE-Cc1.d.ts +399 -0
  4. package/dist/handles.cjs +1 -0
  5. package/dist/handles.cjs.map +1 -1
  6. package/dist/handles.d.cts +3 -61
  7. package/dist/handles.d.ts +3 -61
  8. package/dist/handles.js +1 -0
  9. package/dist/handles.js.map +1 -1
  10. package/dist/helpers-2NY1ha0V.d.cts +63 -0
  11. package/dist/helpers-2NY1ha0V.d.ts +63 -0
  12. package/dist/index.cjs +194 -159
  13. package/dist/index.cjs.map +1 -1
  14. package/dist/index.d.cts +9 -355
  15. package/dist/index.d.ts +9 -355
  16. package/dist/index.js +200 -165
  17. package/dist/index.js.map +1 -1
  18. package/dist/instanceBody-CgZAFnic.d.cts +23 -0
  19. package/dist/instanceBody-CgZAFnic.d.ts +23 -0
  20. package/dist/open.cjs +408 -0
  21. package/dist/open.cjs.map +1 -0
  22. package/dist/open.d.cts +22 -0
  23. package/dist/open.d.ts +22 -0
  24. package/dist/open.js +375 -0
  25. package/dist/open.js.map +1 -0
  26. package/dist/react.cjs +249 -352
  27. package/dist/react.cjs.map +1 -1
  28. package/dist/react.d.cts +11 -151
  29. package/dist/react.d.ts +11 -151
  30. package/dist/react.js +210 -306
  31. package/dist/react.js.map +1 -1
  32. package/dist/root.cjs +277 -0
  33. package/dist/root.cjs.map +1 -0
  34. package/dist/root.d.cts +175 -0
  35. package/dist/root.d.ts +175 -0
  36. package/dist/root.js +254 -0
  37. package/dist/root.js.map +1 -0
  38. package/dist/window-host.cjs +11 -2
  39. package/dist/window-host.cjs.map +1 -1
  40. package/dist/window-host.d.cts +1 -0
  41. package/dist/window-host.d.ts +1 -0
  42. package/dist/window-host.js +11 -2
  43. package/dist/window-host.js.map +1 -1
  44. package/dist/window.cjs +2 -1
  45. package/dist/window.cjs.map +1 -1
  46. package/dist/window.d.cts +3 -2
  47. package/dist/window.d.ts +3 -2
  48. package/dist/window.js +2 -1
  49. package/dist/window.js.map +1 -1
  50. package/package.json +28 -5
package/dist/index.cjs CHANGED
@@ -55,7 +55,7 @@ __export(src_exports, {
55
55
  clearOverlaySurfaceRender: () => clearOverlaySurfaceRender,
56
56
  clearWindowPersistenceState: () => clearWindowPersistenceState,
57
57
  closeAllInstancesOfOverlay: () => closeAllInstancesOfOverlay,
58
- closeAllOverlays: () => closeAllOverlays,
58
+ closeAllOverlays: () => closeAllOverlays2,
59
59
  closeLifecycleMiddleware: () => closeLifecycleMiddleware,
60
60
  closeOverlay: () => closeOverlay,
61
61
  closeOverlaysBoundToPage: () => closeOverlaysBoundToPage,
@@ -73,7 +73,7 @@ __export(src_exports, {
73
73
  diagnoseOverlayRender: () => diagnoseOverlayRender,
74
74
  discardPendingWindowSession: () => discardPendingWindowSession,
75
75
  dockWindow: () => dockWindow,
76
- focusWindow: () => focusWindow,
76
+ focusWindow: () => focusWindow2,
77
77
  getGrid12Rect: () => getGrid12Rect,
78
78
  getGrid4Rect: () => getGrid4Rect,
79
79
  getGrid6Rect: () => getGrid6Rect,
@@ -98,7 +98,7 @@ __export(src_exports, {
98
98
  locationRouter: () => locationRouter,
99
99
  markWindowClosing: () => markWindowClosing,
100
100
  maximizeWindow: () => maximizeWindow,
101
- minimizeAll: () => minimizeAll,
101
+ minimizeAll: () => minimizeAll2,
102
102
  minimizeWindow: () => minimizeWindow,
103
103
  moveTraySlot: () => moveTraySlot,
104
104
  openOverlay: () => openOverlay,
@@ -108,7 +108,7 @@ __export(src_exports, {
108
108
  overlaysReducer: () => overlaysReducer,
109
109
  parseInstanceKey: () => parseInstanceKey,
110
110
  popOutWindow: () => popOutWindow,
111
- pruneStaleInstances: () => pruneStaleInstances,
111
+ pruneStaleInstances: () => pruneStaleInstances2,
112
112
  raiseTransientWindow: () => raiseTransientWindow,
113
113
  recomputeTrayPositions: () => recomputeTrayPositions,
114
114
  rectOnScreen: () => rectOnScreen,
@@ -123,8 +123,8 @@ __export(src_exports, {
123
123
  resetOverlayRegistry: () => resetOverlayRegistry,
124
124
  resetOverlayRenderWatchdog: () => resetOverlayRenderWatchdog,
125
125
  resolvePorts: () => resolvePorts,
126
- restoreAll: () => restoreAll,
127
- restoreWindow: () => restoreWindow,
126
+ restoreAll: () => restoreAll2,
127
+ restoreWindow: () => restoreWindow2,
128
128
  restoreWindowState: () => restoreWindowState,
129
129
  revealWindow: () => revealWindow,
130
130
  safeViewportDims: () => safeViewportDims,
@@ -159,9 +159,10 @@ __export(src_exports, {
159
159
  setOverlayStateValue: () => setOverlayStateValue,
160
160
  setPopoutCandidate: () => setPopoutCandidate,
161
161
  subscribeToOverlayRegistry: () => subscribeToOverlayRegistry,
162
+ summonCore: () => summonCore,
162
163
  summonReducers: () => summonReducers,
163
164
  toggleOverlay: () => toggleOverlay,
164
- toggleWindowsHidden: () => toggleWindowsHidden,
165
+ toggleWindowsHidden: () => toggleWindowsHidden2,
165
166
  trayChipsPerRow: () => trayChipsPerRow,
166
167
  traySlotRect: () => traySlotRect,
167
168
  unregisterSyncEntry: () => unregisterSyncEntry,
@@ -279,15 +280,107 @@ function resetOverlayRegistry() {
279
280
 
280
281
  // src/core/overlaysSlice.ts
281
282
  var import_toolkit = require("@reduxjs/toolkit");
283
+
284
+ // src/open/actions.ts
285
+ function creator(type, build) {
286
+ const create = (...args) => ({ type, payload: build(...args) });
287
+ return Object.assign(create, {
288
+ type,
289
+ toString: () => type,
290
+ match: (action) => typeof action === "object" && action !== null && action.type === type
291
+ });
292
+ }
293
+ function isPlainRecord(value) {
294
+ return typeof value === "object" && value !== null && !Array.isArray(value);
295
+ }
296
+ function stripFunctions(overlayId, data) {
297
+ if (!isPlainRecord(data)) return data;
298
+ const offenders = Object.keys(data).filter((key) => typeof data[key] === "function");
299
+ if (offenders.length === 0) return data;
300
+ console.error(
301
+ `[summon] BUG: function value(s) in openOverlay data for "${overlayId}" (keys: ${offenders.join(", ")}). Functions cannot travel through Redux \u2014 the handler would NEVER fire. Register a handle (@ai-matrx/summon/handles) and pass its id string instead. The offending key(s) were stripped from state.`
302
+ );
303
+ const cleaned = { ...data };
304
+ for (const key of offenders) delete cleaned[key];
305
+ return cleaned;
306
+ }
307
+ function rawOpen(payload) {
308
+ const raw = { overlayId: payload.overlayId };
309
+ if (payload.instanceId !== void 0) raw.instanceId = payload.instanceId;
310
+ if (payload.data !== void 0) raw.data = stripFunctions(payload.overlayId, payload.data);
311
+ const defaults = getOverlayMeta(payload.overlayId)?.defaults;
312
+ if (isPlainRecord(defaults)) raw.defaults = stripFunctions(payload.overlayId, defaults);
313
+ return raw;
314
+ }
315
+ var O = "overlays/";
316
+ var openOverlay = creator(O + "openOverlay", (payload) => rawOpen(payload));
317
+ var closeOverlay = creator(
318
+ O + "closeOverlay",
319
+ (payload) => payload.instanceId === void 0 ? { overlayId: payload.overlayId } : { overlayId: payload.overlayId, instanceId: payload.instanceId }
320
+ );
321
+ var toggleOverlay = creator(O + "toggleOverlay", (payload) => rawOpen(payload));
322
+ var closeAllInstancesOfOverlay = creator(
323
+ O + "closeAllInstancesOfOverlay",
324
+ (payload) => ({ overlayId: payload.overlayId })
325
+ );
326
+ function overlayIdsBoundToPage() {
327
+ return allOverlayMeta().filter((meta) => meta.closesOnNavigation === true).map((meta) => meta.id);
328
+ }
329
+ var closeOverlaysBoundToPage = creator(
330
+ O + "closeOverlaysBoundToPage",
331
+ (payload) => ({
332
+ overlayIds: [...payload?.overlayIds ?? overlayIdsBoundToPage()]
333
+ })
334
+ );
335
+ var closeAllOverlays = creator(O + "closeAllOverlays", () => void 0);
336
+ var pruneStaleInstances = creator(O + "pruneStaleInstances", (payload) => payload);
337
+ var W = "windowManager/";
338
+ var pass = () => (payload) => payload;
339
+ var focusWindow = creator(W + "focusWindow", pass());
340
+ var restoreWindow = creator(W + "restoreWindow", pass());
341
+ var toggleWindowsHidden = creator(W + "toggleWindowsHidden", () => void 0);
342
+ var restoreAll = creator(W + "restoreAll", () => void 0);
343
+ var minimizeAll = creator(W + "minimizeAll", pass());
344
+
345
+ // src/open/selectors.ts
282
346
  var import_global_slot2 = require("@ai-matrx/kit/global-slot");
347
+ var CLOSED = Object.freeze({ isOpen: false, data: null });
348
+ var EMPTY = Object.freeze([]);
349
+ var selectOverlay = (state2, overlayId, instanceId = DEFAULT_INSTANCE_ID) => state2.overlays?.overlays[overlayId]?.[instanceId] ?? CLOSED;
350
+ var selectIsOverlayOpen = (state2, overlayId, instanceId = DEFAULT_INSTANCE_ID) => selectOverlay(state2, overlayId, instanceId).isOpen;
351
+ var selectOverlayData = (state2, overlayId, instanceId = DEFAULT_INSTANCE_ID) => selectOverlay(state2, overlayId, instanceId).data;
352
+ var openCache = () => (0, import_global_slot2.globalSlot)("ai-matrx.summon.openInstances", () => /* @__PURE__ */ new Map());
353
+ var selectOpenInstances = (state2, overlayId) => {
354
+ const bucket = state2.overlays?.overlays[overlayId];
355
+ const cache = openCache();
356
+ const hit = cache.get(overlayId);
357
+ if (hit && hit.bucket === bucket) return hit.result;
358
+ let result = EMPTY;
359
+ if (bucket) {
360
+ const open = [];
361
+ for (const [instanceId, inst] of Object.entries(bucket)) if (inst.isOpen) open.push({ instanceId, data: inst.data });
362
+ if (open.length > 0) result = open;
363
+ }
364
+ cache.set(overlayId, { bucket, result });
365
+ return result;
366
+ };
367
+ function listOpenInstanceKeys(state2) {
368
+ const keys = [];
369
+ for (const [overlayId, bucket] of Object.entries(state2.overlays?.overlays ?? {})) {
370
+ for (const [instanceId, inst] of Object.entries(bucket)) if (inst.isOpen) keys.push(`${overlayId}:${instanceId}`);
371
+ }
372
+ return keys;
373
+ }
374
+
375
+ // src/core/overlaysSlice.ts
283
376
  var initialState = { overlays: {} };
284
- function isPlainRecord(value) {
377
+ function isPlainRecord2(value) {
285
378
  return typeof value === "object" && value !== null && !Array.isArray(value);
286
379
  }
287
380
  function withDefaults(data, defaults) {
288
381
  if (!defaults) return data ?? null;
289
382
  if (data === void 0 || data === null) return { ...defaults };
290
- if (isPlainRecord(data)) return { ...defaults, ...data };
383
+ if (isPlainRecord2(data)) return { ...defaults, ...data };
291
384
  return data;
292
385
  }
293
386
  function closeInstance(state2, overlayId, instanceId) {
@@ -387,92 +480,7 @@ var overlaysSlice = (0, import_toolkit.createSlice)({
387
480
  });
388
481
  var overlaysReducer = overlaysSlice.reducer;
389
482
  var overlaysRawActions = overlaysSlice.actions;
390
- function stripFunctionsFromOverlayData(overlayId, data) {
391
- if (!isPlainRecord(data)) return data;
392
- const offenders = Object.keys(data).filter((key) => typeof data[key] === "function");
393
- if (offenders.length === 0) return data;
394
- console.error(
395
- `[summon] BUG: function value(s) in openOverlay data for "${overlayId}" (keys: ${offenders.join(", ")}). Functions cannot travel through Redux \u2014 the handler would NEVER fire. Register a handle (@ai-matrx/summon/handles) and pass its id string instead. The offending key(s) were stripped from state.`
396
- );
397
- const cleaned = { ...data };
398
- for (const key of offenders) delete cleaned[key];
399
- return cleaned;
400
- }
401
- function rawOpenPayload(payload) {
402
- const raw = { overlayId: payload.overlayId };
403
- if (payload.instanceId !== void 0) raw.instanceId = payload.instanceId;
404
- if (payload.data !== void 0) raw.data = stripFunctionsFromOverlayData(payload.overlayId, payload.data);
405
- const defaults = getOverlayMeta(payload.overlayId)?.defaults;
406
- if (isPlainRecord(defaults)) {
407
- raw.defaults = stripFunctionsFromOverlayData(payload.overlayId, defaults);
408
- }
409
- return raw;
410
- }
411
- function withMatcher(create, raw) {
412
- return Object.assign(create, { type: raw.type, match: raw.match });
413
- }
414
- var openOverlay = withMatcher(
415
- (payload) => overlaysSlice.actions.openOverlay(rawOpenPayload(payload)),
416
- overlaysSlice.actions.openOverlay
417
- );
418
- var closeOverlay = withMatcher(
419
- (payload) => overlaysSlice.actions.closeOverlay(
420
- payload.instanceId === void 0 ? { overlayId: payload.overlayId } : { overlayId: payload.overlayId, instanceId: payload.instanceId }
421
- ),
422
- overlaysSlice.actions.closeOverlay
423
- );
424
- var toggleOverlay = withMatcher(
425
- (payload) => overlaysSlice.actions.toggleOverlay(rawOpenPayload(payload)),
426
- overlaysSlice.actions.toggleOverlay
427
- );
428
- var closeAllInstancesOfOverlay = withMatcher(
429
- (payload) => overlaysSlice.actions.closeAllInstancesOfOverlay({ overlayId: payload.overlayId }),
430
- overlaysSlice.actions.closeAllInstancesOfOverlay
431
- );
432
- function overlayIdsBoundToPage() {
433
- return allOverlayMeta().filter((meta) => meta.closesOnNavigation === true).map((meta) => meta.id);
434
- }
435
- var closeOverlaysBoundToPage = withMatcher(
436
- (payload) => overlaysSlice.actions.closeOverlaysBoundToPage({
437
- overlayIds: [...payload?.overlayIds ?? overlayIdsBoundToPage()]
438
- }),
439
- overlaysSlice.actions.closeOverlaysBoundToPage
440
- );
441
- var { closeAllOverlays, pruneStaleInstances } = overlaysSlice.actions;
442
- var CLOSED_OVERLAY_INSTANCE = Object.freeze({ isOpen: false, data: null });
443
- var EMPTY_INSTANCES = Object.freeze([]);
444
- var selectOverlay = (state2, overlayId, instanceId = DEFAULT_INSTANCE_ID) => state2.overlays.overlays[overlayId]?.[instanceId] ?? CLOSED_OVERLAY_INSTANCE;
445
- var selectIsOverlayOpen = (state2, overlayId, instanceId = DEFAULT_INSTANCE_ID) => selectOverlay(state2, overlayId, instanceId).isOpen;
446
- var selectOverlayData = (state2, overlayId, instanceId = DEFAULT_INSTANCE_ID) => selectOverlay(state2, overlayId, instanceId).data;
447
- var openInstancesCache = () => (0, import_global_slot2.globalSlot)("ai-matrx.summon.openInstancesSelectors", () => /* @__PURE__ */ new Map());
448
- var selectOpenInstances = (state2, overlayId) => {
449
- const cache = openInstancesCache();
450
- let selector = cache.get(overlayId);
451
- if (!selector) {
452
- selector = (0, import_toolkit.createSelector)(
453
- (s) => s.overlays.overlays[overlayId],
454
- (instances) => {
455
- if (!instances) return EMPTY_INSTANCES;
456
- const result = [];
457
- for (const [instanceId, inst] of Object.entries(instances)) {
458
- if (inst.isOpen) result.push({ instanceId, data: inst.data });
459
- }
460
- return result.length === 0 ? EMPTY_INSTANCES : result;
461
- }
462
- );
463
- cache.set(overlayId, selector);
464
- }
465
- return selector(state2);
466
- };
467
- function listOpenInstanceKeys(state2) {
468
- const keys = [];
469
- for (const [overlayId, bucket] of Object.entries(state2.overlays.overlays)) {
470
- for (const [instanceId, inst] of Object.entries(bucket)) {
471
- if (inst.isOpen) keys.push(`${overlayId}:${instanceId}`);
472
- }
473
- }
474
- return keys;
475
- }
483
+ var { closeAllOverlays: closeAllOverlays2, pruneStaleInstances: pruneStaleInstances2 } = overlaysSlice.actions;
476
484
 
477
485
  // src/core/windowManagerSlice.ts
478
486
  var import_toolkit2 = require("@reduxjs/toolkit");
@@ -775,11 +783,11 @@ function trayChipsPerRow(viewportWidth) {
775
783
  Math.floor((usable + TRAY_GAP_X) / (chipWidth + TRAY_GAP_X))
776
784
  );
777
785
  }
778
- function traySlotRect(slot, viewportWidth, viewportHeight, totalSlots = slot + 1) {
786
+ function traySlotRect(slot2, viewportWidth, viewportHeight, totalSlots = slot2 + 1) {
779
787
  const chipWidth = computeTrayChipWidth(viewportWidth);
780
788
  const chipHeight = computeTrayChipHeight(viewportWidth);
781
789
  const perRow = trayChipsPerRow(viewportWidth);
782
- const safeSlot = Math.max(0, Math.floor(slot));
790
+ const safeSlot = Math.max(0, Math.floor(slot2));
783
791
  const usableHeight = Math.max(1, viewportHeight - TRAY_MARGIN_B - 8);
784
792
  const fullRows = Math.max(
785
793
  1,
@@ -928,44 +936,44 @@ var windowManagerSlice = (0, import_toolkit2.createSlice)({
928
936
  const { id, title, initial, initialState: initialState5, persistence, viewport } = action.payload;
929
937
  if (state2.windows[id]) return;
930
938
  const safeInitial = viewport ? clampRectToViewport(initial, viewport) : initial;
931
- const pending = persistence ? state2.pendingRestores[windowSessionKey(persistence.overlayId, persistence.instanceId)] : void 0;
932
- const pendingRenderRect = pending ? pending.state === "minimized" && pending.traySlot !== null && viewport ? traySlotRect(
933
- pending.traySlot,
939
+ const pending2 = persistence ? state2.pendingRestores[windowSessionKey(persistence.overlayId, persistence.instanceId)] : void 0;
940
+ const pendingRenderRect = pending2 ? pending2.state === "minimized" && pending2.traySlot !== null && viewport ? traySlotRect(
941
+ pending2.traySlot,
934
942
  viewport.width,
935
943
  viewport.height,
936
944
  state2.trayCount
937
- ) : viewport ? clampRectToViewport(pending.windowedRect, viewport) : pending.renderRect : void 0;
938
- const startsMinimized = !pending && initialState5 === "minimized" && viewport !== void 0;
945
+ ) : viewport ? clampRectToViewport(pending2.windowedRect, viewport) : pending2.renderRect : void 0;
946
+ const startsMinimized = !pending2 && initialState5 === "minimized" && viewport !== void 0;
939
947
  const initialTraySlot = startsMinimized ? state2.trayCount : null;
940
948
  state2.windows[id] = {
941
949
  id,
942
- title: title ?? pending?.title ?? id,
943
- state: pending?.state ?? (startsMinimized ? "minimized" : "windowed"),
950
+ title: title ?? pending2?.title ?? id,
951
+ state: pending2?.state ?? (startsMinimized ? "minimized" : "windowed"),
944
952
  windowed: pendingRenderRect ?? safeInitial,
945
- preMinimizedRect: pending?.state === "minimized" ? pending.windowedRect : startsMinimized ? safeInitial : null,
946
- zIndex: pending?.zIndex ?? state2.nextZIndex++,
947
- traySlot: pending?.state === "minimized" ? pending.traySlot : initialTraySlot,
953
+ preMinimizedRect: pending2?.state === "minimized" ? pending2.windowedRect : startsMinimized ? safeInitial : null,
954
+ zIndex: pending2?.zIndex ?? state2.nextZIndex++,
955
+ traySlot: pending2?.state === "minimized" ? pending2.traySlot : initialTraySlot,
948
956
  popoutMode: null,
949
957
  prePopoutRect: null,
950
958
  ...persistence ? {
951
959
  persistence: {
952
960
  ...persistence,
953
- data: { ...pending?.data ?? {}, ...persistence.data },
954
- sidebarOpen: pending?.sidebarOpen ?? persistence.sidebarOpen,
955
- sidebarSize: pending?.sidebarSize ?? persistence.sidebarSize,
961
+ data: { ...pending2?.data ?? {}, ...persistence.data },
962
+ sidebarOpen: pending2?.sidebarOpen ?? persistence.sidebarOpen,
963
+ sidebarSize: pending2?.sidebarSize ?? persistence.sidebarSize,
956
964
  closing: false
957
965
  }
958
966
  } : {}
959
967
  };
960
- if (pending?.state === "minimized" && pending.traySlot !== null) {
961
- state2.trayCount = Math.max(state2.trayCount, pending.traySlot + 1);
968
+ if (pending2?.state === "minimized" && pending2.traySlot !== null) {
969
+ state2.trayCount = Math.max(state2.trayCount, pending2.traySlot + 1);
962
970
  } else if (startsMinimized && viewport) {
963
971
  state2.trayCount += 1;
964
972
  state2.trayViewport = viewport;
965
973
  recomputeAllTrayRects(state2);
966
974
  }
967
- if (pending && pending.zIndex >= state2.nextZIndex) {
968
- state2.nextZIndex = pending.zIndex + 1;
975
+ if (pending2 && pending2.zIndex >= state2.nextZIndex) {
976
+ state2.nextZIndex = pending2.zIndex + 1;
969
977
  }
970
978
  if (state2.windowsHidden) state2.windowsHidden = false;
971
979
  },
@@ -1028,14 +1036,14 @@ var windowManagerSlice = (0, import_toolkit2.createSlice)({
1028
1036
  delete state2.pendingRestores[action.payload];
1029
1037
  },
1030
1038
  discardPendingWindowSession(state2, action) {
1031
- const pending = state2.pendingRestores[action.payload];
1032
- if (pending?.traySlot !== null && pending?.traySlot !== void 0 && !hasMatchingLiveTrayReservation(
1039
+ const pending2 = state2.pendingRestores[action.payload];
1040
+ if (pending2?.traySlot !== null && pending2?.traySlot !== void 0 && !hasMatchingLiveTrayReservation(
1033
1041
  state2,
1034
- pending.overlayId,
1035
- pending.instanceId,
1036
- pending.traySlot
1042
+ pending2.overlayId,
1043
+ pending2.instanceId,
1044
+ pending2.traySlot
1037
1045
  )) {
1038
- compactReservedTraySlot(state2, pending.traySlot, pending.renderRect);
1046
+ compactReservedTraySlot(state2, pending2.traySlot, pending2.renderRect);
1039
1047
  }
1040
1048
  delete state2.pendingRestores[action.payload];
1041
1049
  },
@@ -1058,15 +1066,15 @@ var windowManagerSlice = (0, import_toolkit2.createSlice)({
1058
1066
  action.payload.overlayId,
1059
1067
  action.payload.instanceId
1060
1068
  );
1061
- const pending = state2.pendingRestores[key];
1062
- const hasMatchingLiveReservation = pending ? hasMatchingLiveTrayReservation(
1069
+ const pending2 = state2.pendingRestores[key];
1070
+ const hasMatchingLiveReservation = pending2 ? hasMatchingLiveTrayReservation(
1063
1071
  state2,
1064
1072
  action.payload.overlayId,
1065
1073
  action.payload.instanceId,
1066
- pending.traySlot
1074
+ pending2.traySlot
1067
1075
  ) : false;
1068
- if (!hasMatchingLiveReservation && pending?.traySlot !== null && pending?.traySlot !== void 0) {
1069
- compactReservedTraySlot(state2, pending.traySlot, pending.renderRect);
1076
+ if (!hasMatchingLiveReservation && pending2?.traySlot !== null && pending2?.traySlot !== void 0) {
1077
+ compactReservedTraySlot(state2, pending2.traySlot, pending2.renderRect);
1070
1078
  }
1071
1079
  delete state2.pendingRestores[key];
1072
1080
  Object.values(state2.windows).forEach((entry) => {
@@ -1102,16 +1110,16 @@ var windowManagerSlice = (0, import_toolkit2.createSlice)({
1102
1110
  unregisterWindow(state2, action) {
1103
1111
  const win = state2.windows[action.payload];
1104
1112
  if (!win) return;
1105
- const pending = win.persistence ? state2.pendingRestores[windowSessionKey(
1113
+ const pending2 = win.persistence ? state2.pendingRestores[windowSessionKey(
1106
1114
  win.persistence.overlayId,
1107
1115
  win.persistence.instanceId
1108
1116
  )] : void 0;
1109
1117
  const pendingOwnsLiveReservation = Boolean(
1110
- win.persistence && pending && hasMatchingLiveTrayReservation(
1118
+ win.persistence && pending2 && hasMatchingLiveTrayReservation(
1111
1119
  state2,
1112
1120
  win.persistence.overlayId,
1113
1121
  win.persistence.instanceId,
1114
- pending.traySlot
1122
+ pending2.traySlot
1115
1123
  )
1116
1124
  );
1117
1125
  if (!pendingOwnsLiveReservation) releaseTraySlot(state2, win);
@@ -1205,8 +1213,8 @@ var windowManagerSlice = (0, import_toolkit2.createSlice)({
1205
1213
  if (!win || win.state === "minimized") return;
1206
1214
  if (win.popoutMode !== null) return;
1207
1215
  win.preMinimizedRect = { ...win.windowed };
1208
- const slot = state2.trayCount;
1209
- win.traySlot = slot;
1216
+ const slot2 = state2.trayCount;
1217
+ win.traySlot = slot2;
1210
1218
  state2.trayCount += 1;
1211
1219
  state2.trayViewport = { width: viewportWidth, height: viewportHeight };
1212
1220
  win.state = "minimized";
@@ -1223,8 +1231,8 @@ var windowManagerSlice = (0, import_toolkit2.createSlice)({
1223
1231
  if (win.state !== "windowed") return;
1224
1232
  if (win.popoutMode !== null) return;
1225
1233
  win.preMinimizedRect = { ...win.windowed };
1226
- const slot = state2.trayCount;
1227
- win.traySlot = slot;
1234
+ const slot2 = state2.trayCount;
1235
+ win.traySlot = slot2;
1228
1236
  state2.trayCount += 1;
1229
1237
  win.state = "minimized";
1230
1238
  });
@@ -1520,19 +1528,19 @@ var windowManagerSlice = (0, import_toolkit2.createSlice)({
1520
1528
  if (typeof overlayId !== "string" || typeof instanceId !== "string") {
1521
1529
  return;
1522
1530
  }
1523
- const pending = Object.values(state2.pendingRestores).find(
1531
+ const pending2 = Object.values(state2.pendingRestores).find(
1524
1532
  (session) => session.overlayId === overlayId && session.instanceId === instanceId
1525
1533
  );
1526
- const hasMatchingLive = pending ? hasMatchingLiveTrayReservation(
1534
+ const hasMatchingLive = pending2 ? hasMatchingLiveTrayReservation(
1527
1535
  state2,
1528
1536
  overlayId,
1529
1537
  instanceId,
1530
- pending.traySlot
1538
+ pending2.traySlot
1531
1539
  ) : false;
1532
- if (!hasMatchingLive && pending?.traySlot != null) {
1533
- compactReservedTraySlot(state2, pending.traySlot, pending.renderRect);
1540
+ if (!hasMatchingLive && pending2?.traySlot != null) {
1541
+ compactReservedTraySlot(state2, pending2.traySlot, pending2.renderRect);
1534
1542
  }
1535
- if (pending) delete state2.pendingRestores[pending.sessionKey];
1543
+ if (pending2) delete state2.pendingRestores[pending2.sessionKey];
1536
1544
  Object.values(state2.windows).forEach((entry) => {
1537
1545
  if (entry.persistence?.overlayId === overlayId && entry.persistence.instanceId === instanceId) {
1538
1546
  entry.persistence.closing = true;
@@ -1605,17 +1613,17 @@ var {
1605
1613
  releaseTransientWindow,
1606
1614
  registerWindow,
1607
1615
  unregisterWindow,
1608
- focusWindow,
1609
- restoreWindow,
1616
+ focusWindow: focusWindow2,
1617
+ restoreWindow: restoreWindow2,
1610
1618
  revealWindow,
1611
1619
  maximizeWindow,
1612
1620
  minimizeWindow,
1613
- minimizeAll,
1614
- restoreAll,
1621
+ minimizeAll: minimizeAll2,
1622
+ restoreAll: restoreAll2,
1615
1623
  recomputeTrayPositions,
1616
1624
  updateWindowRect,
1617
1625
  updateWindowTitle,
1618
- toggleWindowsHidden,
1626
+ toggleWindowsHidden: toggleWindowsHidden2,
1619
1627
  moveTraySlot,
1620
1628
  arrangeActiveWindows,
1621
1629
  popOutWindow,
@@ -1734,7 +1742,7 @@ var selectOverlayStateFor = (state2, key) => state2.overlayState.entries[key]?.v
1734
1742
  var import_toolkit5 = require("@reduxjs/toolkit");
1735
1743
 
1736
1744
  // src/core/middleware/closeLifecycle.ts
1737
- var import_global_slot4 = require("@ai-matrx/kit/global-slot");
1745
+ var import_global_slot5 = require("@ai-matrx/kit/global-slot");
1738
1746
 
1739
1747
  // src/handles/callbackManager.ts
1740
1748
  var import_global_slot3 = require("@ai-matrx/kit/global-slot");
@@ -1763,9 +1771,9 @@ var handlesState = () => (0, import_global_slot3.globalSlot)(HANDLES_SLOT, () =>
1763
1771
  owners: /* @__PURE__ */ new Map(),
1764
1772
  registryListeners: /* @__PURE__ */ new Set()
1765
1773
  }));
1766
- function invoke(slot, data, context) {
1767
- if (typeof slot !== "function") return void 0;
1768
- return slot(data, context);
1774
+ function invoke(slot2, data, context) {
1775
+ if (typeof slot2 !== "function") return void 0;
1776
+ return slot2(data, context);
1769
1777
  }
1770
1778
  function invokeListener(listener, data, context) {
1771
1779
  return listener(data, context);
@@ -1797,11 +1805,11 @@ var CallbackManager = class {
1797
1805
  return this.registerEntry(callback, options);
1798
1806
  }
1799
1807
  /** @internal The one insertion path (typed helpers pass a fixed id and a removal hook). */
1800
- registerEntry(slot, options) {
1808
+ registerEntry(slot2, options) {
1801
1809
  const s = this.s;
1802
1810
  const callbackId = options.id ?? newHandleId();
1803
1811
  if (s.callbacks.has(callbackId)) this.deleteEntry(callbackId, false);
1804
- const entry = { callback: slot };
1812
+ const entry = { callback: slot2 };
1805
1813
  if (options.context !== void 0) entry.context = options.context;
1806
1814
  if (options.groupId !== void 0) entry.groupId = options.groupId;
1807
1815
  if (options.owner !== void 0) entry.owner = options.owner;
@@ -1991,8 +1999,16 @@ var CallbackManager = class {
1991
1999
  };
1992
2000
  var callbackManager = new CallbackManager();
1993
2001
 
2002
+ // src/open/channels.ts
2003
+ var import_global_slot4 = require("@ai-matrx/kit/global-slot");
2004
+ var pending = () => (0, import_global_slot4.globalSlot)("ai-matrx.summon.pendingChannels", () => /* @__PURE__ */ new Map());
2005
+ function dropPendingChannelsOf(owner) {
2006
+ const map = pending();
2007
+ for (const [id, entry] of [...map]) if (entry.owner === owner) map.delete(id);
2008
+ }
2009
+
1994
2010
  // src/core/middleware/closeLifecycle.ts
1995
- var closeState = () => (0, import_global_slot4.globalSlot)("ai-matrx.summon.closeLifecycle", () => ({ flushers: /* @__PURE__ */ new Set() }));
2011
+ var closeState = () => (0, import_global_slot5.globalSlot)("ai-matrx.summon.closeLifecycle", () => ({ flushers: /* @__PURE__ */ new Set() }));
1996
2012
  function registerCloseFlusher(flush) {
1997
2013
  const { flushers } = closeState();
1998
2014
  flushers.add(flush);
@@ -2018,7 +2034,7 @@ function preservedIdentities(state2, overlayId) {
2018
2034
  }
2019
2035
  return identities;
2020
2036
  }
2021
- function isPlainRecord2(value) {
2037
+ function isPlainRecord3(value) {
2022
2038
  return typeof value === "object" && value !== null && !Array.isArray(value);
2023
2039
  }
2024
2040
  var CLOSE_TYPES = /* @__PURE__ */ new Set([
@@ -2030,6 +2046,7 @@ var CLOSE_TYPES = /* @__PURE__ */ new Set([
2030
2046
  ]);
2031
2047
  function releaseOverlayInstance(dispatch, key, options = {}) {
2032
2048
  callbackManager.disposeOwner(key);
2049
+ dropPendingChannelsOf(key);
2033
2050
  if (!options.keepState) dispatch(clearOverlayState({ key }));
2034
2051
  }
2035
2052
  function closeInstanceResources(api, key) {
@@ -2038,14 +2055,15 @@ function closeInstanceResources(api, key) {
2038
2055
  if (keepAlive === "hidden") return;
2039
2056
  const hasState = api.getState().overlayState?.entries[key] !== void 0;
2040
2057
  callbackManager.disposeOwner(key);
2058
+ dropPendingChannelsOf(key);
2041
2059
  if (keepAlive !== "restore" && hasState) api.dispatch(clearOverlayState({ key }));
2042
2060
  }
2043
2061
  var closeLifecycleMiddleware = (api) => (next) => (action) => {
2044
- if (!isPlainRecord2(action) || typeof action.type !== "string" || !CLOSE_TYPES.has(action.type)) {
2062
+ if (!isPlainRecord3(action) || typeof action.type !== "string" || !CLOSE_TYPES.has(action.type)) {
2045
2063
  return next(action);
2046
2064
  }
2047
2065
  const type = action.type;
2048
- const payload = isPlainRecord2(action.payload) ? action.payload : null;
2066
+ const payload = isPlainRecord3(action.payload) ? action.payload : null;
2049
2067
  const before = api.getState();
2050
2068
  const openBefore = new Set(listOpenInstanceKeys(before));
2051
2069
  let closing = [];
@@ -2059,7 +2077,7 @@ var closeLifecycleMiddleware = (api) => (next) => (action) => {
2059
2077
  intents.push({ scope: "overlay", overlayId });
2060
2078
  } else if ((type === overlaysRawActions.closeOverlay.type || type === overlaysRawActions.toggleOverlay.type) && overlayId) {
2061
2079
  const instanceId = typeof payload?.instanceId === "string" ? payload.instanceId : DEFAULT_INSTANCE_ID;
2062
- const wasOpen = before.overlays.overlays[overlayId]?.[instanceId]?.isOpen === true;
2080
+ const wasOpen = before.overlays?.overlays[overlayId]?.[instanceId]?.isOpen === true;
2063
2081
  if (type === overlaysRawActions.closeOverlay.type || wasOpen) {
2064
2082
  closing = [{ overlayId, instanceId }];
2065
2083
  intents.push({ scope: "exact", overlayId, instanceId });
@@ -2091,12 +2109,12 @@ var closeLifecycleMiddleware = (api) => (next) => (action) => {
2091
2109
  };
2092
2110
 
2093
2111
  // src/core/middleware/renderWatchdog.ts
2094
- var import_global_slot5 = require("@ai-matrx/kit/global-slot");
2112
+ var import_global_slot6 = require("@ai-matrx/kit/global-slot");
2095
2113
  var LAZY_WINDOW_MOUNT_DEADLINE_MS = process.env.NODE_ENV === "production" ? 12e3 : 45e3;
2096
2114
  var OPEN_TYPE = "overlays/openOverlay";
2097
2115
  var TOGGLE_TYPE = "overlays/toggleOverlay";
2098
2116
  var DEFAULT_INSTANCE_ID2 = "default";
2099
- function isPlainRecord3(value) {
2117
+ function isPlainRecord4(value) {
2100
2118
  return typeof value === "object" && value !== null && !Array.isArray(value);
2101
2119
  }
2102
2120
  var CHECK_DELAY_MS = 2500;
@@ -2106,7 +2124,7 @@ var NO_MOUNT_DEADLINE_MS = LAZY_WINDOW_MOUNT_DEADLINE_MS;
2106
2124
  var TOAST_DURATION_MS = 8e3;
2107
2125
  var RECOVERY_POLL_MS = 500;
2108
2126
  var RENDER_WATCHDOG_SLOT = "ai-matrx.summon.renderWatchdog";
2109
- var watchdogState = () => (0, import_global_slot5.globalSlot)(RENDER_WATCHDOG_SLOT, () => ({
2127
+ var watchdogState = () => (0, import_global_slot6.globalSlot)(RENDER_WATCHDOG_SLOT, () => ({
2110
2128
  renderAcks: /* @__PURE__ */ new Map(),
2111
2129
  ackWaiters: /* @__PURE__ */ new Map(),
2112
2130
  watches: /* @__PURE__ */ new Map()
@@ -2323,9 +2341,9 @@ function createOverlayRenderWatchdogMiddleware(ports) {
2323
2341
  const typed = action;
2324
2342
  if (typed.type !== OPEN_TYPE && typed.type !== TOGGLE_TYPE) return result;
2325
2343
  const payload = typed.payload;
2326
- const overlayId = isPlainRecord3(payload) && typeof payload.overlayId === "string" ? payload.overlayId : void 0;
2344
+ const overlayId = isPlainRecord4(payload) && typeof payload.overlayId === "string" ? payload.overlayId : void 0;
2327
2345
  if (!overlayId) return result;
2328
- const instanceIdRaw = isPlainRecord3(payload) && typeof payload.instanceId === "string" ? payload.instanceId : void 0;
2346
+ const instanceIdRaw = isPlainRecord4(payload) && typeof payload.instanceId === "string" ? payload.instanceId : void 0;
2329
2347
  const meta = getOverlayMeta(overlayId);
2330
2348
  if (!meta || !watchdogTracksOpen(meta, instanceIdRaw ?? DEFAULT_INSTANCE_ID2)) {
2331
2349
  return result;
@@ -2383,4 +2401,21 @@ function buildDockWindowPayload(windowId) {
2383
2401
  viewportHeight: window.innerHeight
2384
2402
  };
2385
2403
  }
2404
+
2405
+ // src/open/gate.ts
2406
+ var import_global_slot7 = require("@ai-matrx/kit/global-slot");
2407
+ var slot = () => (0, import_global_slot7.globalSlot)("ai-matrx.summon.gate", () => ({ core: null, loading: null, gates: /* @__PURE__ */ new Set(), listeners: /* @__PURE__ */ new Set() }));
2408
+ function installSummonCore(core) {
2409
+ const s = slot();
2410
+ if (s.core) return;
2411
+ s.core = core;
2412
+ const gates = [...s.gates];
2413
+ s.gates.clear();
2414
+ for (const gate of gates) gate.install(core);
2415
+ for (const listener of [...s.listeners]) listener();
2416
+ }
2417
+
2418
+ // src/index.ts
2419
+ var summonCore = { reducers: summonReducers, createMiddleware: createSummonMiddleware };
2420
+ installSummonCore(summonCore);
2386
2421
  //# sourceMappingURL=index.cjs.map