@almadar/ui 6.21.0 → 6.23.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.
@@ -200,7 +200,20 @@ interface ServerBridgeTransport {
200
200
  sendEvent: (orbitalName: string, event: string, payload?: EventPayload, clientId?: string, tick?: string, sourceTrait?: string, results?: ReadonlyArray<{
201
201
  traitName: string;
202
202
  result: TransitionResult;
203
- }>, entityByTrait?: Readonly<Record<string, EntityRow>>) => Promise<OrbitalEventResponse>;
203
+ }>, entityByTrait?: Readonly<Record<string, EntityRow>>,
204
+ /**
205
+ * The mounted top-level schema's own `name` (`ServerBridgeProvider`'s
206
+ * `schema` prop). Orbital names are not unique across a hosting
207
+ * server's whole catalog — a "whole orbital import" copies an existing
208
+ * orbital wholesale into a new behavior, so two catalog entries can
209
+ * declare an orbital with the identical name — this disambiguates
210
+ * which one a stateless server should resolve against instead of it
211
+ * guessing from a global orbital-name reverse index (verified
212
+ * 2026-09-16: project-friday's own imported `TaskOrbital` was
213
+ * misrouted to the standalone `std-project-manager` orbital of the
214
+ * same name). An unmodified server ignores the extra field.
215
+ */
216
+ behaviorHint?: string) => Promise<OrbitalEventResponse>;
204
217
  }
205
218
  /**
206
219
  * Supplies the bearer token the hosting server authenticates with. Resolved
@@ -200,7 +200,20 @@ interface ServerBridgeTransport {
200
200
  sendEvent: (orbitalName: string, event: string, payload?: EventPayload, clientId?: string, tick?: string, sourceTrait?: string, results?: ReadonlyArray<{
201
201
  traitName: string;
202
202
  result: TransitionResult;
203
- }>, entityByTrait?: Readonly<Record<string, EntityRow>>) => Promise<OrbitalEventResponse>;
203
+ }>, entityByTrait?: Readonly<Record<string, EntityRow>>,
204
+ /**
205
+ * The mounted top-level schema's own `name` (`ServerBridgeProvider`'s
206
+ * `schema` prop). Orbital names are not unique across a hosting
207
+ * server's whole catalog — a "whole orbital import" copies an existing
208
+ * orbital wholesale into a new behavior, so two catalog entries can
209
+ * declare an orbital with the identical name — this disambiguates
210
+ * which one a stateless server should resolve against instead of it
211
+ * guessing from a global orbital-name reverse index (verified
212
+ * 2026-09-16: project-friday's own imported `TaskOrbital` was
213
+ * misrouted to the standalone `std-project-manager` orbital of the
214
+ * same name). An unmodified server ignores the extra field.
215
+ */
216
+ behaviorHint?: string) => Promise<OrbitalEventResponse>;
204
217
  }
205
218
  /**
206
219
  * Supplies the bearer token the hosting server authenticates with. Resolved
@@ -60549,7 +60549,7 @@ function NavStackRefBridge({ apiRef }) {
60549
60549
  }, [api, apiRef]);
60550
60550
  return null;
60551
60551
  }
60552
- function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNavigate, onNavigateBack, onLocalFallback, persistence, traitConfigsByName, orbitalsByTrait, embeddedTraits, callsiteCaptureChildrenByTrait, serverActiveTraits, children }) {
60552
+ function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNavigate, onNavigateBack, onLocalFallback, localFallbackTimeoutMs, persistence, traitConfigsByName, orbitalsByTrait, embeddedTraits, callsiteCaptureChildrenByTrait, serverActiveTraits, children }) {
60553
60553
  const bridge = providers.useServerBridge();
60554
60554
  const activeTraitNames = React96.useMemo(
60555
60555
  () => new Set(traits2.map((b) => b.trait.name).filter((n) => !!n)),
@@ -60616,9 +60616,9 @@ function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNaviga
60616
60616
  sendEvent("INIT", routeParams);
60617
60617
  onLocalFallback?.();
60618
60618
  }
60619
- }, 5e3);
60619
+ }, localFallbackTimeoutMs ?? 5e3);
60620
60620
  return () => clearTimeout(fallback);
60621
- }, [traits2, orbitalNames, sendEvent, onLocalFallback, routeParams]);
60621
+ }, [traits2, orbitalNames, sendEvent, onLocalFallback, localFallbackTimeoutMs, routeParams]);
60622
60622
  React96.useEffect(() => {
60623
60623
  if (!bridge.connected || !orbitalNames?.length || initSentRef.current) return;
60624
60624
  initSentRef.current = true;
@@ -60672,7 +60672,7 @@ function FitToBox({ children }) {
60672
60672
  }, []);
60673
60673
  return /* @__PURE__ */ jsxRuntime.jsx("div", { ref: outerRef, className: "relative h-full w-full overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsx("div", { ref: innerRef, style: { transform: `scale(${scale})`, transformOrigin: "top left", width: "fit-content" }, children }) });
60674
60674
  }
60675
- function SchemaRunner({ schema, serverUrl, transport, getAccessToken, mockData, pageName, routeParams, onNavigate, onNavigateBack, onLocalFallback, persistence }) {
60675
+ function SchemaRunner({ schema, serverUrl, transport, getAccessToken, mockData, pageName, routeParams, onNavigate, onNavigateBack, onLocalFallback, localFallbackTimeoutMs, persistence }) {
60676
60676
  const { traits: traits2, allEntities, allTraits, ir } = useResolvedSchema(schema, pageName);
60677
60677
  const allPageTraits = React96.useMemo(() => {
60678
60678
  let base;
@@ -60835,6 +60835,7 @@ function SchemaRunner({ schema, serverUrl, transport, getAccessToken, mockData,
60835
60835
  onNavigate,
60836
60836
  onNavigateBack,
60837
60837
  onLocalFallback,
60838
+ localFallbackTimeoutMs,
60838
60839
  persistence,
60839
60840
  children: /* @__PURE__ */ jsxRuntime.jsx(providers.OrbitalThemeProvider, { theme: activeOrbitalTheme, children: /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "h-full min-h-full overflow-auto p-4", children: /* @__PURE__ */ jsxRuntime.jsx(UISlotRenderer, { includeHud: true, hudMode: "inline", includeFloating: true }) }) })
60840
60841
  }
@@ -60858,7 +60859,8 @@ function OrbPreview({
60858
60859
  initialPagePath,
60859
60860
  isolated = false,
60860
60861
  fit = false,
60861
- user = null
60862
+ user = null,
60863
+ localFallbackTimeoutMs
60862
60864
  }) {
60863
60865
  if (serverUrl && transport) {
60864
60866
  throw new Error("OrbPreview accepts serverUrl OR transport, not both");
@@ -61040,6 +61042,7 @@ function OrbPreview({
61040
61042
  onNavigate: handleNavigateEffect,
61041
61043
  onNavigateBack: handleNavigateBack,
61042
61044
  onLocalFallback: handleLocalFallback,
61045
+ localFallbackTimeoutMs,
61043
61046
  persistence
61044
61047
  }
61045
61048
  ) }) : /* @__PURE__ */ jsxRuntime.jsx(
@@ -61055,6 +61058,7 @@ function OrbPreview({
61055
61058
  onNavigate: handleNavigateEffect,
61056
61059
  onNavigateBack: handleNavigateBack,
61057
61060
  onLocalFallback: handleLocalFallback,
61061
+ localFallbackTimeoutMs,
61058
61062
  persistence
61059
61063
  }
61060
61064
  ) }) })
package/dist/avl/index.js CHANGED
@@ -60473,7 +60473,7 @@ function NavStackRefBridge({ apiRef }) {
60473
60473
  }, [api, apiRef]);
60474
60474
  return null;
60475
60475
  }
60476
- function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNavigate, onNavigateBack, onLocalFallback, persistence, traitConfigsByName, orbitalsByTrait, embeddedTraits, callsiteCaptureChildrenByTrait, serverActiveTraits, children }) {
60476
+ function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNavigate, onNavigateBack, onLocalFallback, localFallbackTimeoutMs, persistence, traitConfigsByName, orbitalsByTrait, embeddedTraits, callsiteCaptureChildrenByTrait, serverActiveTraits, children }) {
60477
60477
  const bridge = useServerBridge();
60478
60478
  const activeTraitNames = useMemo(
60479
60479
  () => new Set(traits2.map((b) => b.trait.name).filter((n) => !!n)),
@@ -60540,9 +60540,9 @@ function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNaviga
60540
60540
  sendEvent("INIT", routeParams);
60541
60541
  onLocalFallback?.();
60542
60542
  }
60543
- }, 5e3);
60543
+ }, localFallbackTimeoutMs ?? 5e3);
60544
60544
  return () => clearTimeout(fallback);
60545
- }, [traits2, orbitalNames, sendEvent, onLocalFallback, routeParams]);
60545
+ }, [traits2, orbitalNames, sendEvent, onLocalFallback, localFallbackTimeoutMs, routeParams]);
60546
60546
  useEffect(() => {
60547
60547
  if (!bridge.connected || !orbitalNames?.length || initSentRef.current) return;
60548
60548
  initSentRef.current = true;
@@ -60596,7 +60596,7 @@ function FitToBox({ children }) {
60596
60596
  }, []);
60597
60597
  return /* @__PURE__ */ jsx("div", { ref: outerRef, className: "relative h-full w-full overflow-hidden", children: /* @__PURE__ */ jsx("div", { ref: innerRef, style: { transform: `scale(${scale})`, transformOrigin: "top left", width: "fit-content" }, children }) });
60598
60598
  }
60599
- function SchemaRunner({ schema, serverUrl, transport, getAccessToken, mockData, pageName, routeParams, onNavigate, onNavigateBack, onLocalFallback, persistence }) {
60599
+ function SchemaRunner({ schema, serverUrl, transport, getAccessToken, mockData, pageName, routeParams, onNavigate, onNavigateBack, onLocalFallback, localFallbackTimeoutMs, persistence }) {
60600
60600
  const { traits: traits2, allEntities, allTraits, ir } = useResolvedSchema(schema, pageName);
60601
60601
  const allPageTraits = useMemo(() => {
60602
60602
  let base;
@@ -60759,6 +60759,7 @@ function SchemaRunner({ schema, serverUrl, transport, getAccessToken, mockData,
60759
60759
  onNavigate,
60760
60760
  onNavigateBack,
60761
60761
  onLocalFallback,
60762
+ localFallbackTimeoutMs,
60762
60763
  persistence,
60763
60764
  children: /* @__PURE__ */ jsx(OrbitalThemeProvider, { theme: activeOrbitalTheme, children: /* @__PURE__ */ jsx(Box, { className: "h-full min-h-full overflow-auto p-4", children: /* @__PURE__ */ jsx(UISlotRenderer, { includeHud: true, hudMode: "inline", includeFloating: true }) }) })
60764
60765
  }
@@ -60782,7 +60783,8 @@ function OrbPreview({
60782
60783
  initialPagePath,
60783
60784
  isolated = false,
60784
60785
  fit = false,
60785
- user = null
60786
+ user = null,
60787
+ localFallbackTimeoutMs
60786
60788
  }) {
60787
60789
  if (serverUrl && transport) {
60788
60790
  throw new Error("OrbPreview accepts serverUrl OR transport, not both");
@@ -60964,6 +60966,7 @@ function OrbPreview({
60964
60966
  onNavigate: handleNavigateEffect,
60965
60967
  onNavigateBack: handleNavigateBack,
60966
60968
  onLocalFallback: handleLocalFallback,
60969
+ localFallbackTimeoutMs,
60967
60970
  persistence
60968
60971
  }
60969
60972
  ) }) : /* @__PURE__ */ jsx(
@@ -60979,6 +60982,7 @@ function OrbPreview({
60979
60982
  onNavigate: handleNavigateEffect,
60980
60983
  onNavigateBack: handleNavigateBack,
60981
60984
  onLocalFallback: handleLocalFallback,
60985
+ localFallbackTimeoutMs,
60982
60986
  persistence
60983
60987
  }
60984
60988
  ) }) })
@@ -54647,7 +54647,7 @@ function createHttpTransport(serverUrl, getAccessToken) {
54647
54647
  } catch {
54648
54648
  }
54649
54649
  },
54650
- sendEvent: async (orbitalName, event, payload, clientId, tick, sourceTrait, results, entityByTrait) => {
54650
+ sendEvent: async (orbitalName, event, payload, clientId, tick, sourceTrait, results, entityByTrait, behaviorHint) => {
54651
54651
  const traits2 = results?.map((r) => ({ trait: r.traitName, from: r.result.previousState }));
54652
54652
  const body = {
54653
54653
  event,
@@ -54667,7 +54667,8 @@ function createHttpTransport(serverUrl, getAccessToken) {
54667
54667
  // `traits`" would make the mount-time case indistinguishable from
54668
54668
  // "do nothing" and break every organism's INIT on the stateless path.
54669
54669
  ...results !== void 0 ? { traits: traits2 ?? [] } : {},
54670
- ...entityByTrait ? { entityByTrait } : {}
54670
+ ...entityByTrait ? { entityByTrait } : {},
54671
+ ...behaviorHint !== void 0 ? { behavior: behaviorHint } : {}
54671
54672
  };
54672
54673
  const res = await fetch(`${serverUrl}/${orbitalName}/events`, {
54673
54674
  method: "POST",
@@ -54716,9 +54717,9 @@ function ServerBridgeProvider({
54716
54717
  );
54717
54718
  const tickRelay = React89.useMemo(
54718
54719
  () => createTickSendRelay(async (_key, snap) => {
54719
- await transport.sendEvent(snap.orbitalName, snap.event, snap.payload, getTabClientId(), snap.tick, snap.sourceTrait);
54720
+ await transport.sendEvent(snap.orbitalName, snap.event, snap.payload, getTabClientId(), snap.tick, snap.sourceTrait, void 0, void 0, schema.name);
54720
54721
  }),
54721
- [transport]
54722
+ [transport, schema.name]
54722
54723
  );
54723
54724
  React89.useEffect(() => () => tickRelay.clear(), [tickRelay]);
54724
54725
  const commandPump = React89.useMemo(createCommandSendPump, []);
@@ -54739,7 +54740,7 @@ function ServerBridgeProvider({
54739
54740
  return commandPump.enqueue(async () => {
54740
54741
  if (disposedRef.current) return { effects: [], meta: emptyMeta };
54741
54742
  try {
54742
- const result = await transport.sendEvent(orbitalName, event, payload, getTabClientId(), tick, sourceTrait, results, entityByTrait);
54743
+ const result = await transport.sendEvent(orbitalName, event, payload, getTabClientId(), tick, sourceTrait, results, entityByTrait, schema.name);
54743
54744
  const effects = [];
54744
54745
  const responseData = result.data || {};
54745
54746
  const dataEntities = {};
@@ -54820,7 +54821,7 @@ function ServerBridgeProvider({
54820
54821
  return { effects: [], meta: { ...emptyMeta, error: msg } };
54821
54822
  }
54822
54823
  });
54823
- }, [connected, transport, eventBus, tickRelay, commandPump]);
54824
+ }, [connected, transport, eventBus, tickRelay, commandPump, schema.name]);
54824
54825
  React89.useEffect(() => {
54825
54826
  if (!schema) return;
54826
54827
  let cancelled = false;
@@ -6,7 +6,7 @@ export { a as CurrentPagePathContext, b as CurrentPagePathProvider, c as Current
6
6
  import { b as UserData } from '../UserContext-D566nfWA.cjs';
7
7
  export { U as UserContext, a as UserContextValue, c as UserProvider, d as UserProviderProps, u as useHasPermission, e as useHasRole, f as useUser, g as useUserForEvaluation } from '../UserContext-D566nfWA.cjs';
8
8
  import { E as EventBusContextType } from '../event-bus-types-Bl78kokd.cjs';
9
- export { A as AccessTokenProvider, E as EntityBindingContext, a as EntityBindingSource, b as EntitySchemaContextValue, c as EntitySchemaProvider, d as EntitySchemaProviderProps, S as SendEventResult, e as ServerBridgeContextValue, f as ServerBridgeProvider, g as ServerBridgeProviderProps, h as ServerBridgeTransport, i as ServerClientEffect, j as ServerResponseMeta, T as TraitContext, k as TraitContextValue, l as TraitInstance, m as TraitProvider, n as TraitProviderProps, u as useEntityBindingSnapshot, o as useEntitySchema, p as useEntitySchemaOptional, q as useServerBridge, r as useTrait, s as useTraitContext } from '../EntityBindingContext-DoK8Xq71.cjs';
9
+ export { A as AccessTokenProvider, E as EntityBindingContext, a as EntityBindingSource, b as EntitySchemaContextValue, c as EntitySchemaProvider, d as EntitySchemaProviderProps, S as SendEventResult, e as ServerBridgeContextValue, f as ServerBridgeProvider, g as ServerBridgeProviderProps, h as ServerBridgeTransport, i as ServerClientEffect, j as ServerResponseMeta, T as TraitContext, k as TraitContextValue, l as TraitInstance, m as TraitProvider, n as TraitProviderProps, u as useEntityBindingSnapshot, o as useEntitySchema, p as useEntitySchemaOptional, q as useServerBridge, r as useTrait, s as useTraitContext } from '../EntityBindingContext-CTZw2DbY.cjs';
10
10
  import { i as UseOfflineExecutorResult, U as UseOfflineExecutorOptions } from '../offline-executor-DdV2o0Zu.cjs';
11
11
  export { N as NavigationContextValue, c as NavigationProvider, d as NavigationProviderProps, e as NavigationState, j as comparePathSpecificity, l as extractRouteParams, m as findPageByName, n as findPageByPath, o as getAllPages, p as getDefaultPage, q as matchPath, r as matchPathAmong, s as pathMatches, u as useActivePage, t as useInitPayload, v as useNavigateTo, w as useNavigation, x as useNavigationId, y as useNavigationState } from '../offline-executor-DdV2o0Zu.cjs';
12
12
  import '../verificationRegistry-DTrKDRoa.cjs';
@@ -6,7 +6,7 @@ export { a as CurrentPagePathContext, b as CurrentPagePathProvider, c as Current
6
6
  import { b as UserData } from '../UserContext-D566nfWA.js';
7
7
  export { U as UserContext, a as UserContextValue, c as UserProvider, d as UserProviderProps, u as useHasPermission, e as useHasRole, f as useUser, g as useUserForEvaluation } from '../UserContext-D566nfWA.js';
8
8
  import { E as EventBusContextType } from '../event-bus-types-Bl78kokd.js';
9
- export { A as AccessTokenProvider, E as EntityBindingContext, a as EntityBindingSource, b as EntitySchemaContextValue, c as EntitySchemaProvider, d as EntitySchemaProviderProps, S as SendEventResult, e as ServerBridgeContextValue, f as ServerBridgeProvider, g as ServerBridgeProviderProps, h as ServerBridgeTransport, i as ServerClientEffect, j as ServerResponseMeta, T as TraitContext, k as TraitContextValue, l as TraitInstance, m as TraitProvider, n as TraitProviderProps, u as useEntityBindingSnapshot, o as useEntitySchema, p as useEntitySchemaOptional, q as useServerBridge, r as useTrait, s as useTraitContext } from '../EntityBindingContext-DoK8Xq71.js';
9
+ export { A as AccessTokenProvider, E as EntityBindingContext, a as EntityBindingSource, b as EntitySchemaContextValue, c as EntitySchemaProvider, d as EntitySchemaProviderProps, S as SendEventResult, e as ServerBridgeContextValue, f as ServerBridgeProvider, g as ServerBridgeProviderProps, h as ServerBridgeTransport, i as ServerClientEffect, j as ServerResponseMeta, T as TraitContext, k as TraitContextValue, l as TraitInstance, m as TraitProvider, n as TraitProviderProps, u as useEntityBindingSnapshot, o as useEntitySchema, p as useEntitySchemaOptional, q as useServerBridge, r as useTrait, s as useTraitContext } from '../EntityBindingContext-CTZw2DbY.js';
10
10
  import { i as UseOfflineExecutorResult, U as UseOfflineExecutorOptions } from '../offline-executor-DdV2o0Zu.js';
11
11
  export { N as NavigationContextValue, c as NavigationProvider, d as NavigationProviderProps, e as NavigationState, j as comparePathSpecificity, l as extractRouteParams, m as findPageByName, n as findPageByPath, o as getAllPages, p as getDefaultPage, q as matchPath, r as matchPathAmong, s as pathMatches, u as useActivePage, t as useInitPayload, v as useNavigateTo, w as useNavigation, x as useNavigationId, y as useNavigationState } from '../offline-executor-DdV2o0Zu.js';
12
12
  import '../verificationRegistry-Cwa52VyK.js';
@@ -54573,7 +54573,7 @@ function createHttpTransport(serverUrl, getAccessToken) {
54573
54573
  } catch {
54574
54574
  }
54575
54575
  },
54576
- sendEvent: async (orbitalName, event, payload, clientId, tick, sourceTrait, results, entityByTrait) => {
54576
+ sendEvent: async (orbitalName, event, payload, clientId, tick, sourceTrait, results, entityByTrait, behaviorHint) => {
54577
54577
  const traits2 = results?.map((r) => ({ trait: r.traitName, from: r.result.previousState }));
54578
54578
  const body = {
54579
54579
  event,
@@ -54593,7 +54593,8 @@ function createHttpTransport(serverUrl, getAccessToken) {
54593
54593
  // `traits`" would make the mount-time case indistinguishable from
54594
54594
  // "do nothing" and break every organism's INIT on the stateless path.
54595
54595
  ...results !== void 0 ? { traits: traits2 ?? [] } : {},
54596
- ...entityByTrait ? { entityByTrait } : {}
54596
+ ...entityByTrait ? { entityByTrait } : {},
54597
+ ...behaviorHint !== void 0 ? { behavior: behaviorHint } : {}
54597
54598
  };
54598
54599
  const res = await fetch(`${serverUrl}/${orbitalName}/events`, {
54599
54600
  method: "POST",
@@ -54642,9 +54643,9 @@ function ServerBridgeProvider({
54642
54643
  );
54643
54644
  const tickRelay = useMemo(
54644
54645
  () => createTickSendRelay(async (_key, snap) => {
54645
- await transport.sendEvent(snap.orbitalName, snap.event, snap.payload, getTabClientId(), snap.tick, snap.sourceTrait);
54646
+ await transport.sendEvent(snap.orbitalName, snap.event, snap.payload, getTabClientId(), snap.tick, snap.sourceTrait, void 0, void 0, schema.name);
54646
54647
  }),
54647
- [transport]
54648
+ [transport, schema.name]
54648
54649
  );
54649
54650
  useEffect(() => () => tickRelay.clear(), [tickRelay]);
54650
54651
  const commandPump = useMemo(createCommandSendPump, []);
@@ -54665,7 +54666,7 @@ function ServerBridgeProvider({
54665
54666
  return commandPump.enqueue(async () => {
54666
54667
  if (disposedRef.current) return { effects: [], meta: emptyMeta };
54667
54668
  try {
54668
- const result = await transport.sendEvent(orbitalName, event, payload, getTabClientId(), tick, sourceTrait, results, entityByTrait);
54669
+ const result = await transport.sendEvent(orbitalName, event, payload, getTabClientId(), tick, sourceTrait, results, entityByTrait, schema.name);
54669
54670
  const effects = [];
54670
54671
  const responseData = result.data || {};
54671
54672
  const dataEntities = {};
@@ -54746,7 +54747,7 @@ function ServerBridgeProvider({
54746
54747
  return { effects: [], meta: { ...emptyMeta, error: msg } };
54747
54748
  }
54748
54749
  });
54749
- }, [connected, transport, eventBus, tickRelay, commandPump]);
54750
+ }, [connected, transport, eventBus, tickRelay, commandPump, schema.name]);
54750
54751
  useEffect(() => {
54751
54752
  if (!schema) return;
54752
54753
  let cancelled = false;
@@ -54776,7 +54776,7 @@ function NavStackRefBridge({ apiRef }) {
54776
54776
  }, [api, apiRef]);
54777
54777
  return null;
54778
54778
  }
54779
- function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNavigate, onNavigateBack, onLocalFallback, persistence, traitConfigsByName, orbitalsByTrait, embeddedTraits, callsiteCaptureChildrenByTrait, serverActiveTraits, children }) {
54779
+ function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNavigate, onNavigateBack, onLocalFallback, localFallbackTimeoutMs, persistence, traitConfigsByName, orbitalsByTrait, embeddedTraits, callsiteCaptureChildrenByTrait, serverActiveTraits, children }) {
54780
54780
  const bridge = providers.useServerBridge();
54781
54781
  const activeTraitNames = React87.useMemo(
54782
54782
  () => new Set(traits2.map((b) => b.trait.name).filter((n) => !!n)),
@@ -54843,9 +54843,9 @@ function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNaviga
54843
54843
  sendEvent("INIT", routeParams);
54844
54844
  onLocalFallback?.();
54845
54845
  }
54846
- }, 5e3);
54846
+ }, localFallbackTimeoutMs ?? 5e3);
54847
54847
  return () => clearTimeout(fallback);
54848
- }, [traits2, orbitalNames, sendEvent, onLocalFallback, routeParams]);
54848
+ }, [traits2, orbitalNames, sendEvent, onLocalFallback, localFallbackTimeoutMs, routeParams]);
54849
54849
  React87.useEffect(() => {
54850
54850
  if (!bridge.connected || !orbitalNames?.length || initSentRef.current) return;
54851
54851
  initSentRef.current = true;
@@ -54899,7 +54899,7 @@ function FitToBox({ children }) {
54899
54899
  }, []);
54900
54900
  return /* @__PURE__ */ jsxRuntime.jsx("div", { ref: outerRef, className: "relative h-full w-full overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsx("div", { ref: innerRef, style: { transform: `scale(${scale})`, transformOrigin: "top left", width: "fit-content" }, children }) });
54901
54901
  }
54902
- function SchemaRunner({ schema, serverUrl, transport, getAccessToken, mockData, pageName, routeParams, onNavigate, onNavigateBack, onLocalFallback, persistence }) {
54902
+ function SchemaRunner({ schema, serverUrl, transport, getAccessToken, mockData, pageName, routeParams, onNavigate, onNavigateBack, onLocalFallback, localFallbackTimeoutMs, persistence }) {
54903
54903
  const { traits: traits2, allEntities, allTraits, ir } = useResolvedSchema(schema, pageName);
54904
54904
  const allPageTraits = React87.useMemo(() => {
54905
54905
  let base;
@@ -55062,6 +55062,7 @@ function SchemaRunner({ schema, serverUrl, transport, getAccessToken, mockData,
55062
55062
  onNavigate,
55063
55063
  onNavigateBack,
55064
55064
  onLocalFallback,
55065
+ localFallbackTimeoutMs,
55065
55066
  persistence,
55066
55067
  children: /* @__PURE__ */ jsxRuntime.jsx(providers.OrbitalThemeProvider, { theme: activeOrbitalTheme, children: /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "h-full min-h-full overflow-auto p-4", children: /* @__PURE__ */ jsxRuntime.jsx(UISlotRenderer, { includeHud: true, hudMode: "inline", includeFloating: true }) }) })
55067
55068
  }
@@ -55085,7 +55086,8 @@ function OrbPreview({
55085
55086
  initialPagePath,
55086
55087
  isolated = false,
55087
55088
  fit = false,
55088
- user = null
55089
+ user = null,
55090
+ localFallbackTimeoutMs
55089
55091
  }) {
55090
55092
  if (serverUrl && transport) {
55091
55093
  throw new Error("OrbPreview accepts serverUrl OR transport, not both");
@@ -55267,6 +55269,7 @@ function OrbPreview({
55267
55269
  onNavigate: handleNavigateEffect,
55268
55270
  onNavigateBack: handleNavigateBack,
55269
55271
  onLocalFallback: handleLocalFallback,
55272
+ localFallbackTimeoutMs,
55270
55273
  persistence
55271
55274
  }
55272
55275
  ) }) : /* @__PURE__ */ jsxRuntime.jsx(
@@ -55282,6 +55285,7 @@ function OrbPreview({
55282
55285
  onNavigate: handleNavigateEffect,
55283
55286
  onNavigateBack: handleNavigateBack,
55284
55287
  onLocalFallback: handleLocalFallback,
55288
+ localFallbackTimeoutMs,
55285
55289
  persistence
55286
55290
  }
55287
55291
  ) }) })
@@ -5,8 +5,8 @@ import * as _almadar_runtime from '@almadar/runtime';
5
5
  import { TraitState, TransitionResult, EffectHandlers } from '@almadar/runtime';
6
6
  import { K as KeyCaptureTable } from '../useKeyboardRouter-CVn8lfiX.cjs';
7
7
  import { c as useUISlots } from '../UISlotContext-BlRDbHDy.cjs';
8
- import { a as EntityBindingSource, h as ServerBridgeTransport, A as AccessTokenProvider } from '../EntityBindingContext-DoK8Xq71.cjs';
9
- export { b as EntitySchemaContextValue, c as EntitySchemaProvider, d as EntitySchemaProviderProps, e as ServerBridgeContextValue, f as ServerBridgeProvider, i as ServerClientEffect, T as TraitContext, k as TraitContextValue, l as TraitInstance, m as TraitProvider, n as TraitProviderProps, o as useEntitySchema, p as useEntitySchemaOptional, q as useServerBridge, r as useTrait, s as useTraitContext } from '../EntityBindingContext-DoK8Xq71.cjs';
8
+ import { a as EntityBindingSource, h as ServerBridgeTransport, A as AccessTokenProvider } from '../EntityBindingContext-CTZw2DbY.cjs';
9
+ export { b as EntitySchemaContextValue, c as EntitySchemaProvider, d as EntitySchemaProviderProps, e as ServerBridgeContextValue, f as ServerBridgeProvider, i as ServerClientEffect, T as TraitContext, k as TraitContextValue, l as TraitInstance, m as TraitProvider, n as TraitProviderProps, o as useEntitySchema, p as useEntitySchemaOptional, q as useServerBridge, r as useTrait, s as useTraitContext } from '../EntityBindingContext-CTZw2DbY.cjs';
10
10
  import '../verificationRegistry-DTrKDRoa.cjs';
11
11
  export { PERF_NAMESPACE, PerfEntry, PreparedPreviewSchema, adjustSchemaForMockData, buildMockData, clearPerf, perfEnd, perfStart, perfTime, prepareSchemaForPreview, wrapCallbackForEvent } from '@almadar/runtime/ui';
12
12
  import React__default, { ReactNode } from 'react';
@@ -292,6 +292,15 @@ interface OrbPreviewProps {
292
292
  transport?: ServerBridgeTransport;
293
293
  /** Bearer token for `serverUrl` requests (see `ServerBridgeProviderProps.getAccessToken`). */
294
294
  getAccessToken?: AccessTokenProvider;
295
+ /**
296
+ * How long (ms) to wait for the server bridge to connect before assuming
297
+ * it's unreachable and falling back to local-only execution. Default
298
+ * 5000 (unchanged unless you pass this). Widen it for a caller whose
299
+ * schema is large enough that the server's first `register()` genuinely
300
+ * takes longer than 5s (e.g. a 53-orbital organism measured ~14.5s in
301
+ * production) — see `TraitInitializer`'s `localFallbackTimeoutMs` doc.
302
+ */
303
+ localFallbackTimeoutMs?: number;
295
304
  /**
296
305
  * Initial page path to render (e.g. `/deals`). Resolves against the
297
306
  * schema's `pages[]` to seed `currentPage` so the right orbital's traits
@@ -333,7 +342,7 @@ interface OrbPreviewProps {
333
342
  * <OrbPreview schema={schema} serverUrl="/api/orbitals" />
334
343
  * ```
335
344
  */
336
- declare function OrbPreview({ schema, mockData, autoMock, height, className, serverUrl, transport, getAccessToken, initialPagePath, isolated, fit, user, }: OrbPreviewProps): React__default.ReactElement;
345
+ declare function OrbPreview({ schema, mockData, autoMock, height, className, serverUrl, transport, getAccessToken, initialPagePath, isolated, fit, user, localFallbackTimeoutMs, }: OrbPreviewProps): React__default.ReactElement;
337
346
  declare namespace OrbPreview {
338
347
  var displayName: string;
339
348
  }
@@ -5,8 +5,8 @@ import * as _almadar_runtime from '@almadar/runtime';
5
5
  import { TraitState, TransitionResult, EffectHandlers } from '@almadar/runtime';
6
6
  import { K as KeyCaptureTable } from '../useKeyboardRouter-B1pIi9jo.js';
7
7
  import { c as useUISlots } from '../UISlotContext-CB89mv7N.js';
8
- import { a as EntityBindingSource, h as ServerBridgeTransport, A as AccessTokenProvider } from '../EntityBindingContext-DoK8Xq71.js';
9
- export { b as EntitySchemaContextValue, c as EntitySchemaProvider, d as EntitySchemaProviderProps, e as ServerBridgeContextValue, f as ServerBridgeProvider, i as ServerClientEffect, T as TraitContext, k as TraitContextValue, l as TraitInstance, m as TraitProvider, n as TraitProviderProps, o as useEntitySchema, p as useEntitySchemaOptional, q as useServerBridge, r as useTrait, s as useTraitContext } from '../EntityBindingContext-DoK8Xq71.js';
8
+ import { a as EntityBindingSource, h as ServerBridgeTransport, A as AccessTokenProvider } from '../EntityBindingContext-CTZw2DbY.js';
9
+ export { b as EntitySchemaContextValue, c as EntitySchemaProvider, d as EntitySchemaProviderProps, e as ServerBridgeContextValue, f as ServerBridgeProvider, i as ServerClientEffect, T as TraitContext, k as TraitContextValue, l as TraitInstance, m as TraitProvider, n as TraitProviderProps, o as useEntitySchema, p as useEntitySchemaOptional, q as useServerBridge, r as useTrait, s as useTraitContext } from '../EntityBindingContext-CTZw2DbY.js';
10
10
  import '../verificationRegistry-Cwa52VyK.js';
11
11
  export { PERF_NAMESPACE, PerfEntry, PreparedPreviewSchema, adjustSchemaForMockData, buildMockData, clearPerf, perfEnd, perfStart, perfTime, prepareSchemaForPreview, wrapCallbackForEvent } from '@almadar/runtime/ui';
12
12
  import React__default, { ReactNode } from 'react';
@@ -292,6 +292,15 @@ interface OrbPreviewProps {
292
292
  transport?: ServerBridgeTransport;
293
293
  /** Bearer token for `serverUrl` requests (see `ServerBridgeProviderProps.getAccessToken`). */
294
294
  getAccessToken?: AccessTokenProvider;
295
+ /**
296
+ * How long (ms) to wait for the server bridge to connect before assuming
297
+ * it's unreachable and falling back to local-only execution. Default
298
+ * 5000 (unchanged unless you pass this). Widen it for a caller whose
299
+ * schema is large enough that the server's first `register()` genuinely
300
+ * takes longer than 5s (e.g. a 53-orbital organism measured ~14.5s in
301
+ * production) — see `TraitInitializer`'s `localFallbackTimeoutMs` doc.
302
+ */
303
+ localFallbackTimeoutMs?: number;
295
304
  /**
296
305
  * Initial page path to render (e.g. `/deals`). Resolves against the
297
306
  * schema's `pages[]` to seed `currentPage` so the right orbital's traits
@@ -333,7 +342,7 @@ interface OrbPreviewProps {
333
342
  * <OrbPreview schema={schema} serverUrl="/api/orbitals" />
334
343
  * ```
335
344
  */
336
- declare function OrbPreview({ schema, mockData, autoMock, height, className, serverUrl, transport, getAccessToken, initialPagePath, isolated, fit, user, }: OrbPreviewProps): React__default.ReactElement;
345
+ declare function OrbPreview({ schema, mockData, autoMock, height, className, serverUrl, transport, getAccessToken, initialPagePath, isolated, fit, user, localFallbackTimeoutMs, }: OrbPreviewProps): React__default.ReactElement;
337
346
  declare namespace OrbPreview {
338
347
  var displayName: string;
339
348
  }
@@ -54702,7 +54702,7 @@ function NavStackRefBridge({ apiRef }) {
54702
54702
  }, [api, apiRef]);
54703
54703
  return null;
54704
54704
  }
54705
- function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNavigate, onNavigateBack, onLocalFallback, persistence, traitConfigsByName, orbitalsByTrait, embeddedTraits, callsiteCaptureChildrenByTrait, serverActiveTraits, children }) {
54705
+ function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNavigate, onNavigateBack, onLocalFallback, localFallbackTimeoutMs, persistence, traitConfigsByName, orbitalsByTrait, embeddedTraits, callsiteCaptureChildrenByTrait, serverActiveTraits, children }) {
54706
54706
  const bridge = useServerBridge();
54707
54707
  const activeTraitNames = useMemo(
54708
54708
  () => new Set(traits2.map((b) => b.trait.name).filter((n) => !!n)),
@@ -54769,9 +54769,9 @@ function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNaviga
54769
54769
  sendEvent("INIT", routeParams);
54770
54770
  onLocalFallback?.();
54771
54771
  }
54772
- }, 5e3);
54772
+ }, localFallbackTimeoutMs ?? 5e3);
54773
54773
  return () => clearTimeout(fallback);
54774
- }, [traits2, orbitalNames, sendEvent, onLocalFallback, routeParams]);
54774
+ }, [traits2, orbitalNames, sendEvent, onLocalFallback, localFallbackTimeoutMs, routeParams]);
54775
54775
  useEffect(() => {
54776
54776
  if (!bridge.connected || !orbitalNames?.length || initSentRef.current) return;
54777
54777
  initSentRef.current = true;
@@ -54825,7 +54825,7 @@ function FitToBox({ children }) {
54825
54825
  }, []);
54826
54826
  return /* @__PURE__ */ jsx("div", { ref: outerRef, className: "relative h-full w-full overflow-hidden", children: /* @__PURE__ */ jsx("div", { ref: innerRef, style: { transform: `scale(${scale})`, transformOrigin: "top left", width: "fit-content" }, children }) });
54827
54827
  }
54828
- function SchemaRunner({ schema, serverUrl, transport, getAccessToken, mockData, pageName, routeParams, onNavigate, onNavigateBack, onLocalFallback, persistence }) {
54828
+ function SchemaRunner({ schema, serverUrl, transport, getAccessToken, mockData, pageName, routeParams, onNavigate, onNavigateBack, onLocalFallback, localFallbackTimeoutMs, persistence }) {
54829
54829
  const { traits: traits2, allEntities, allTraits, ir } = useResolvedSchema(schema, pageName);
54830
54830
  const allPageTraits = useMemo(() => {
54831
54831
  let base;
@@ -54988,6 +54988,7 @@ function SchemaRunner({ schema, serverUrl, transport, getAccessToken, mockData,
54988
54988
  onNavigate,
54989
54989
  onNavigateBack,
54990
54990
  onLocalFallback,
54991
+ localFallbackTimeoutMs,
54991
54992
  persistence,
54992
54993
  children: /* @__PURE__ */ jsx(OrbitalThemeProvider, { theme: activeOrbitalTheme, children: /* @__PURE__ */ jsx(Box, { className: "h-full min-h-full overflow-auto p-4", children: /* @__PURE__ */ jsx(UISlotRenderer, { includeHud: true, hudMode: "inline", includeFloating: true }) }) })
54993
54994
  }
@@ -55011,7 +55012,8 @@ function OrbPreview({
55011
55012
  initialPagePath,
55012
55013
  isolated = false,
55013
55014
  fit = false,
55014
- user = null
55015
+ user = null,
55016
+ localFallbackTimeoutMs
55015
55017
  }) {
55016
55018
  if (serverUrl && transport) {
55017
55019
  throw new Error("OrbPreview accepts serverUrl OR transport, not both");
@@ -55193,6 +55195,7 @@ function OrbPreview({
55193
55195
  onNavigate: handleNavigateEffect,
55194
55196
  onNavigateBack: handleNavigateBack,
55195
55197
  onLocalFallback: handleLocalFallback,
55198
+ localFallbackTimeoutMs,
55196
55199
  persistence
55197
55200
  }
55198
55201
  ) }) : /* @__PURE__ */ jsx(
@@ -55208,6 +55211,7 @@ function OrbPreview({
55208
55211
  onNavigate: handleNavigateEffect,
55209
55212
  onNavigateBack: handleNavigateBack,
55210
55213
  onLocalFallback: handleLocalFallback,
55214
+ localFallbackTimeoutMs,
55211
55215
  persistence
55212
55216
  }
55213
55217
  ) }) })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@almadar/ui",
3
- "version": "6.21.0",
3
+ "version": "6.23.0",
4
4
  "description": "React UI components, hooks, and providers for Almadar",
5
5
  "type": "module",
6
6
  "sideEffects": [