@devframes/hub 0.9.0-beta.1 → 0.9.0-beta.10

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.
@@ -1,7 +1,6 @@
1
- import { E as DevframeMessagesClient, x as DevframeMessageEntryInput } from "../context-Dz0j8Eyg.mjs";
2
- import { D as DevframeViewIframe, M as RemoteConnectionInfo, b as DevframeDockUserEntry, f as ClientScriptEntry, h as DevframeDockEntry, i as DevframeCommandEntry, j as NavTarget, m as DevframeDockEntriesGrouped, o as DevframeCommandKeybinding, t as DevframeClientCommand, v as DevframeDockEntryIcon } from "../commands-CAcTUSlj.mjs";
3
- import { t as DevframeDocksUserSettings } from "../settings-B1qJ47d5.mjs";
4
- import "../index-p4BktGvQ.mjs";
1
+ import { E as DevframeMessagesClient, x as DevframeMessageEntryInput } from "../context-D5TJIHwp.mjs";
2
+ import { N as NavTarget, P as RemoteConnectionInfo, S as DevframeDockUserEntry, _ as DevframeDockEntry, a as DevframeCommandEntry, b as DevframeDockEntryIcon, g as DevframeDockEntriesGrouped, k as DevframeViewIframe, n as DevframeClientCommand, p as ClientScriptEntry, s as DevframeCommandKeybinding, t as DevframeDocksUserSettings } from "../settings-DfrRa9Wf.mjs";
3
+ import "../index-coDmWngQ.mjs";
5
4
  import { DevframeClientRpcHost, DevframeConnection, DevframeConnectionStatus, DevframeRpcClient, DevframeRpcClientOptions, DevframeRpcContext, RpcClientEvents, RpcClientEvents as RpcClientEvents$1 } from "devframe/client";
6
5
  import { EventEmitter } from "devframe/types";
7
6
  import { SharedState } from "devframe/utils/shared-state";
@@ -135,9 +134,30 @@ interface DockPanelStorage {
135
134
  top: number;
136
135
  left: number;
137
136
  position: 'left' | 'right' | 'bottom' | 'top';
138
- open: boolean;
139
137
  inactiveTimeout: number;
140
138
  }
139
+ /**
140
+ * Per-tab UI state of the dock panel, distinct from the browser-shared geometry
141
+ * in {@link DockPanelStorage}. A viewer persists this to `sessionStorage` so a
142
+ * reload (or the RPC auth handshake that follows one) restores the panel to
143
+ * exactly where the developer left it — which dock was open, and the
144
+ * address-bar route of that dock's iframe. Kept `sessionStorage`-scoped (not
145
+ * `localStorage`) because it is per-tab navigation state: two tabs open against
146
+ * the same dev server each keep their own selection rather than fighting over a
147
+ * shared one. Every field is serializable.
148
+ */
149
+ interface DockSessionStorage {
150
+ /** Whether the dock panel is open. */
151
+ open: boolean;
152
+ /** The currently selected dock entry id, or `null` when nothing is open. */
153
+ selectedDockId: string | null;
154
+ /**
155
+ * The live address-bar URL of the selected iframe dock, restored as that
156
+ * iframe's boot `src` on the next load so the deep-linked route survives a
157
+ * reload. `null` when the selected dock has no iframe route to remember.
158
+ */
159
+ selectedDockRoute: string | null;
160
+ }
141
161
  type DockClientType = 'embedded' | 'standalone';
142
162
  interface DocksContext extends DevframeRpcContext {
143
163
  /**
@@ -197,16 +217,41 @@ interface WhenClauseContext {
197
217
  type DevframeClientContext = DocksContext;
198
218
  interface DocksPanelContext {
199
219
  store: DockPanelStorage;
220
+ /**
221
+ * Per-tab session UI state — whether the panel is open, which dock is
222
+ * selected, and that dock's iframe route. Restored across reloads (and the
223
+ * auth handshake that follows one) by a viewer that persists it to
224
+ * `sessionStorage`.
225
+ */
226
+ session: DockSessionStorage;
200
227
  isDragging: boolean;
201
228
  isResizing: boolean;
202
229
  readonly isVertical: boolean;
230
+ /**
231
+ * Claim the persisted {@link DockSessionStorage.selectedDockRoute boot route} for a dock
232
+ * id, once. Returns the saved address-bar URL only for the dock that was
233
+ * selected before the last reload — and only on the first call for it — so a
234
+ * restored iframe boots deep-linked while a later switch to a different dock
235
+ * (whose live route isn't reflected in {@link DockSessionStorage.selectedDockRoute} yet)
236
+ * doesn't reuse the stale value. Returns `null` otherwise.
237
+ */
238
+ consumeBootRoute?: (id: string) => string | null;
203
239
  }
204
240
  interface DocksEntriesContext {
205
241
  selectedId: string | null;
242
+ selectedRoute: string | null;
206
243
  readonly selected: DevframeDockEntry | null;
207
244
  entries: DevframeDockEntry[];
208
245
  entryToStateMap: Map<string, DockEntryState>;
209
246
  groupedEntries: DevframeDockEntriesGrouped;
247
+ /**
248
+ * The resolved top-level category ordering — `DEFAULT_CATEGORIES_ORDER`,
249
+ * overridden by every installed devframe's own `dock.categoryOrder`
250
+ * (`ConnectionMeta.configs.dock.categoryOrder`), overridden again by the
251
+ * host page's own `createDevframeClientHost({ categoryOrder })`. Fixed
252
+ * for the life of the session — resolved once at boot.
253
+ */
254
+ readonly categoryOrder: Record<string, number>;
210
255
  settings: SharedState<DevframeDocksUserSettings>;
211
256
  /**
212
257
  * Get the state of a dock entry by its ID
@@ -339,6 +384,79 @@ declare function resolveDockUrl(url: string, connection: DevframeConnection): st
339
384
  /** Resolve URL-backed dock icons while preserving Iconify names and data URLs. */
340
385
  declare function resolveDockIcon(icon: DevframeDockEntryIcon, connection: DevframeConnection): DevframeDockEntryIcon;
341
386
  //#endregion
387
+ //#region src/client/frame-location.d.ts
388
+ /**
389
+ * Live location tracking for an iframe dock.
390
+ *
391
+ * An iframe dock's address bar — and the route persisted from it into
392
+ * `DockSessionStorage.selectedDockRoute` — has to follow wherever the embedded
393
+ * app actually goes. The `load` event only covers whole-document navigations, so
394
+ * an SPA router moving between routes with `history.pushState()` leaves both
395
+ * showing the URL the frame booted with.
396
+ *
397
+ * {@link watchFrameLocation} closes that gap for a same-origin frame, reporting
398
+ * `location.href` on every navigation it can observe:
399
+ *
400
+ * - `popstate` / `hashchange` — back/forward and hash routing;
401
+ * - `history.pushState`/`replaceState`, wrapped in place (and restored on
402
+ * dispose) because those two fire no event of their own;
403
+ * - the [Navigation API](https://developer.mozilla.org/en-US/docs/Web/API/Navigation_API)'s
404
+ * `currententrychange` where it exists, which reports post-commit and so also
405
+ * catches what a wrapper structurally cannot — a router holding a reference to
406
+ * `pushState` captured before this watch attached;
407
+ * - `load`, which also re-subscribes: a document navigation swaps the frame's
408
+ * `history`/`navigation` objects, so the previous subscription dies with them.
409
+ *
410
+ * These sources overlap deliberately rather than being chosen between, since a
411
+ * report is deduped against the last href — the cost of hearing the same
412
+ * navigation twice is nothing, and the cost of missing one is a stale route.
413
+ *
414
+ * A cross-origin frame reports nothing — its location is unreadable by design,
415
+ * so the caller keeps the last URL it knew.
416
+ */
417
+ /** The minimal `history` surface the watcher wraps. Injectable for tests. */
418
+ interface FrameLocationHistory {
419
+ pushState: (...args: any[]) => void;
420
+ replaceState: (...args: any[]) => void;
421
+ }
422
+ /** The minimal frame-window surface the watcher reads and subscribes to. */
423
+ interface FrameLocationWindow {
424
+ readonly location: {
425
+ readonly href: string;
426
+ };
427
+ readonly history?: FrameLocationHistory;
428
+ /** Present only where the Navigation API ships. */
429
+ readonly navigation?: {
430
+ addEventListener: (type: 'currententrychange', listener: () => void) => void;
431
+ removeEventListener: (type: 'currententrychange', listener: () => void) => void;
432
+ };
433
+ addEventListener: (type: 'popstate' | 'hashchange', listener: () => void) => void;
434
+ removeEventListener: (type: 'popstate' | 'hashchange', listener: () => void) => void;
435
+ }
436
+ /** The minimal iframe surface the watcher needs. Injectable for tests. */
437
+ interface FrameLocationTarget {
438
+ readonly contentWindow: FrameLocationWindow | null;
439
+ addEventListener: (type: 'load', listener: () => void) => void;
440
+ removeEventListener: (type: 'load', listener: () => void) => void;
441
+ }
442
+ interface WatchFrameLocationOptions {
443
+ /** The live iframe whose location is tracked. */
444
+ iframe: FrameLocationTarget;
445
+ /** Called with the frame's `location.href` on each observed change. */
446
+ onChange: (href: string) => void;
447
+ /**
448
+ * The href the caller already shows, so an initial report is only made when
449
+ * the frame is somewhere else (a frame re-attached mid-session, say).
450
+ */
451
+ initial?: string;
452
+ }
453
+ /**
454
+ * Track a frame's location until the returned disposer is called. Disposing
455
+ * detaches every listener and restores any wrapped `history` method, leaving the
456
+ * embedded page as it was found.
457
+ */
458
+ declare function watchFrameLocation(options: WatchFrameLocationOptions): () => void;
459
+ //#endregion
342
460
  //#region src/client/frame-nav.d.ts
343
461
  /**
344
462
  * Shared-iframe soft navigation — the viewer-side half of a host↔iframe
@@ -504,7 +622,7 @@ interface DevframeClientHostOptions {
504
622
  *
505
623
  * Keys are merged over `DEFAULT_CATEGORIES_ORDER`, so the host app only
506
624
  * lists the categories it wants to move; any category absent from the map
507
- * keeps its default weight (falling back to `0`).
625
+ * keeps its default weight.
508
626
  *
509
627
  * @example
510
628
  * ```ts
@@ -580,4 +698,4 @@ declare function parseRemoteConnection(input?: string): RemoteConnectionInfo | n
580
698
  */
581
699
  declare function connectRemoteDevframe(options?: ConnectRemoteDevframeOptions): Promise<DevframeRpcClient>;
582
700
  //#endregion
583
- export { CLIENT_CONTEXT_KEY, CommandsContext, ConnectRemoteDevframeOptions, CreateDockRenderersContextOptions, DevframeClientContext, DevframeClientHost, DevframeClientHostOptions, type DevframeClientRpcHost, DockClientScriptContext, DockClientType, DockEntryState, DockEntryStateEvents, DockPanelStorage, DockRegistration, DockRenderer, DockRendererInstance, DockRendererManifest, DockRendererMountOptions, DockRendererMountResult, DockRenderersContext, DocksConnectionContext, DocksContext, DocksEntriesContext, DocksPanelContext, FRAME_NAV_CHANNEL, FRAME_NAV_VERSION, FrameNavClient, FrameNavClientOptions, FrameNavEnvelope, FrameNavFrameMessage, FrameNavHostMessage, FrameNavHostPayload, FrameNavListenTarget, FrameTab, MessagesClientOptions, type RpcClientEvents, WhenClauseContext, attachFrameNavClient, buildRemoteDevframeUrl, connectRemoteDevframe, createDevframeClientHost, createDockRenderersContext, createMessagesClient, getDevframeClientContext, parseRemoteConnection, resolveDockIcon, resolveDockUrl, setDevframeClientContext, stripRemoteConnectionFromUrl };
701
+ export { CLIENT_CONTEXT_KEY, CommandsContext, ConnectRemoteDevframeOptions, CreateDockRenderersContextOptions, DevframeClientContext, DevframeClientHost, DevframeClientHostOptions, type DevframeClientRpcHost, DockClientScriptContext, DockClientType, DockEntryState, DockEntryStateEvents, DockPanelStorage, DockRegistration, DockRenderer, DockRendererInstance, DockRendererManifest, DockRendererMountOptions, DockRendererMountResult, DockRenderersContext, DockSessionStorage, DocksConnectionContext, DocksContext, DocksEntriesContext, DocksPanelContext, FRAME_NAV_CHANNEL, FRAME_NAV_VERSION, FrameLocationHistory, FrameLocationTarget, FrameLocationWindow, FrameNavClient, FrameNavClientOptions, FrameNavEnvelope, FrameNavFrameMessage, FrameNavHostMessage, FrameNavHostPayload, FrameNavListenTarget, FrameTab, MessagesClientOptions, type RpcClientEvents, WatchFrameLocationOptions, WhenClauseContext, attachFrameNavClient, buildRemoteDevframeUrl, connectRemoteDevframe, createDevframeClientHost, createDockRenderersContext, createMessagesClient, getDevframeClientContext, parseRemoteConnection, resolveDockIcon, resolveDockUrl, setDevframeClientContext, stripRemoteConnectionFromUrl, watchFrameLocation };
@@ -69,6 +69,88 @@ function resolveDockIcon(icon, connection) {
69
69
  };
70
70
  }
71
71
  //#endregion
72
+ //#region src/client/frame-location.ts
73
+ /**
74
+ * Track a frame's location until the returned disposer is called. Disposing
75
+ * detaches every listener and restores any wrapped `history` method, leaving the
76
+ * embedded page as it was found.
77
+ */
78
+ function watchFrameLocation(options) {
79
+ const { iframe, onChange } = options;
80
+ let lastReported = options.initial;
81
+ let detach;
82
+ let disposed = false;
83
+ /**
84
+ * The frame's window, or `null` when its location can't be read. Touching
85
+ * `location.href` is the cross-origin probe — it throws for a foreign
86
+ * document, where there is nothing to observe.
87
+ */
88
+ function readableWindow() {
89
+ try {
90
+ const win = iframe.contentWindow;
91
+ return win && typeof win.location.href === "string" ? win : null;
92
+ } catch {
93
+ return null;
94
+ }
95
+ }
96
+ function report() {
97
+ const href = readableWindow()?.location.href;
98
+ if (!href || href === "about:blank" || href === lastReported) return;
99
+ lastReported = href;
100
+ onChange(href);
101
+ }
102
+ function subscribe() {
103
+ const win = readableWindow();
104
+ if (!win) return;
105
+ const listeners = [];
106
+ win.addEventListener("popstate", report);
107
+ win.addEventListener("hashchange", report);
108
+ listeners.push(() => {
109
+ win.removeEventListener("popstate", report);
110
+ win.removeEventListener("hashchange", report);
111
+ });
112
+ const { navigation, history } = win;
113
+ if (navigation) {
114
+ navigation.addEventListener("currententrychange", report);
115
+ listeners.push(() => navigation.removeEventListener("currententrychange", report));
116
+ }
117
+ if (history) {
118
+ const originals = {
119
+ pushState: history.pushState,
120
+ replaceState: history.replaceState
121
+ };
122
+ for (const method of ["pushState", "replaceState"]) history[method] = function(...args) {
123
+ originals[method].apply(this, args);
124
+ report();
125
+ };
126
+ listeners.push(() => {
127
+ history.pushState = originals.pushState;
128
+ history.replaceState = originals.replaceState;
129
+ });
130
+ }
131
+ detach = () => {
132
+ for (const off of listeners) off();
133
+ };
134
+ }
135
+ function onLoad() {
136
+ if (disposed) return;
137
+ detach?.();
138
+ detach = void 0;
139
+ subscribe();
140
+ report();
141
+ }
142
+ iframe.addEventListener("load", onLoad);
143
+ subscribe();
144
+ report();
145
+ return () => {
146
+ if (disposed) return;
147
+ disposed = true;
148
+ iframe.removeEventListener("load", onLoad);
149
+ detach?.();
150
+ detach = void 0;
151
+ };
152
+ }
153
+ //#endregion
72
154
  //#region src/client/frame-nav.ts
73
155
  /**
74
156
  * Shared-iframe soft navigation — the viewer-side half of a host↔iframe
@@ -445,6 +527,10 @@ async function createDevframeClientHost(options = {}) {
445
527
  const clientDocks = /* @__PURE__ */ new Map();
446
528
  const frameNavAdapters = /* @__PURE__ */ new Map();
447
529
  const loadScriptsEnabled = options.loadClientScripts ?? true;
530
+ const categoryOrder = {
531
+ ...DEFAULT_CATEGORIES_ORDER,
532
+ ...options.categoryOrder
533
+ };
448
534
  const panel = createPanelContext(clientType);
449
535
  const docks = createDocksContext();
450
536
  const commands = createCommandsContext();
@@ -458,7 +544,7 @@ async function createDevframeClientHost(options = {}) {
458
544
  when: { get context() {
459
545
  return {
460
546
  clientType,
461
- dockOpen: panel.store.open,
547
+ dockOpen: panel.session.open,
462
548
  paletteOpen: commands.paletteOpen,
463
549
  dockSelectedId: selectedId ?? ""
464
550
  };
@@ -579,8 +665,12 @@ async function createDevframeClientHost(options = {}) {
579
665
  }
580
666
  }
581
667
  docks.entries = entries;
582
- docks.groupedEntries = groupByCategory(entries);
583
- if (selectedId && !entryToStateMap.has(selectedId)) selectedId = null;
668
+ docks.groupedEntries = groupByCategory(entries, categoryOrder);
669
+ if (selectedId && !entryToStateMap.has(selectedId)) {
670
+ selectedId = null;
671
+ panel.session.selectedDockId = null;
672
+ panel.session.selectedDockRoute = null;
673
+ }
584
674
  }
585
675
  function createDocksContext() {
586
676
  return {
@@ -590,12 +680,19 @@ async function createDevframeClientHost(options = {}) {
590
680
  set selectedId(id) {
591
681
  switchEntry(id);
592
682
  },
683
+ get selectedRoute() {
684
+ return panel.session.selectedDockRoute;
685
+ },
686
+ set selectedRoute(route) {
687
+ panel.session.selectedDockRoute = route;
688
+ },
593
689
  get selected() {
594
690
  return selectedId && entryToStateMap.get(selectedId)?.entryMeta || null;
595
691
  },
596
692
  entries: [],
597
693
  entryToStateMap,
598
694
  groupedEntries: [],
695
+ categoryOrder,
599
696
  settings,
600
697
  getStateById: (id) => entryToStateMap.get(id),
601
698
  switchEntry,
@@ -633,6 +730,8 @@ async function createDevframeClientHost(options = {}) {
633
730
  if (next !== null && !entryToStateMap.has(next)) return false;
634
731
  const previous = selectedId;
635
732
  selectedId = next;
733
+ panel.session.selectedDockId = next;
734
+ if (next === null || entryToStateMap.get(next)?.entryMeta.type !== "iframe") panel.session.selectedDockRoute = null;
636
735
  if (previous) entryToStateMap.get(previous)?.events.emit("entry:deactivated");
637
736
  if (next) entryToStateMap.get(next)?.events.emit("entry:activated");
638
737
  return true;
@@ -729,11 +828,15 @@ function createPanelContext(clientType) {
729
828
  top: 0,
730
829
  left: 0,
731
830
  position: "right",
732
- open: clientType === "standalone",
733
831
  inactiveTimeout: 0
734
832
  };
735
833
  return {
736
834
  store,
835
+ session: {
836
+ open: clientType === "standalone",
837
+ selectedDockId: null,
838
+ selectedDockRoute: null
839
+ },
737
840
  isDragging: false,
738
841
  isResizing: false,
739
842
  get isVertical() {
@@ -741,7 +844,7 @@ function createPanelContext(clientType) {
741
844
  }
742
845
  };
743
846
  }
744
- function groupByCategory(entries) {
847
+ function groupByCategory(entries, categoryOrder) {
745
848
  const groupsById = /* @__PURE__ */ new Map();
746
849
  for (const entry of entries) if (entry.type === "group") groupsById.set(entry.id, entry);
747
850
  const groups = /* @__PURE__ */ new Map();
@@ -755,7 +858,7 @@ function groupByCategory(entries) {
755
858
  }
756
859
  list.push(entry);
757
860
  }
758
- return [...groups.entries()].sort(([a], [b]) => (DEFAULT_CATEGORIES_ORDER[a] ?? 0) - (DEFAULT_CATEGORIES_ORDER[b] ?? 0));
861
+ return [...groups.entries()].sort(([a], [b]) => (categoryOrder[a] ?? 0) - (categoryOrder[b] ?? 0));
759
862
  }
760
863
  //#endregion
761
864
  //#region src/client/remote.ts
@@ -864,4 +967,4 @@ async function connectRemoteDevframe(options = {}) {
864
967
  });
865
968
  }
866
969
  //#endregion
867
- export { CLIENT_CONTEXT_KEY, FRAME_NAV_CHANNEL, FRAME_NAV_VERSION, attachFrameNavClient, buildRemoteDevframeUrl, connectRemoteDevframe, createDevframeClientHost, createDockRenderersContext, createMessagesClient, getDevframeClientContext, parseRemoteConnection, resolveDockIcon, resolveDockUrl, setDevframeClientContext, stripRemoteConnectionFromUrl };
970
+ export { CLIENT_CONTEXT_KEY, FRAME_NAV_CHANNEL, FRAME_NAV_VERSION, attachFrameNavClient, buildRemoteDevframeUrl, connectRemoteDevframe, createDevframeClientHost, createDockRenderersContext, createMessagesClient, getDevframeClientContext, parseRemoteConnection, resolveDockIcon, resolveDockUrl, setDevframeClientContext, stripRemoteConnectionFromUrl, watchFrameLocation };
@@ -1,6 +1,16 @@
1
- import { t as DevframeDocksUserSettings } from "./settings-B1qJ47d5.mjs";
1
+ import { t as DevframeDocksUserSettings } from "./settings-DfrRa9Wf.mjs";
2
2
  export * from "devframe/constants";
3
3
  //#region src/constants.d.ts
4
+ /** Default mount base for a hub instance — one namespace, one catch-all. */
5
+ declare const DEVFRAMES_HUB_BASE = "/__devframes/";
6
+ /**
7
+ * Normalize a hub mount base to an absolute path with leading and trailing
8
+ * slashes (e.g. `devframes` → `/devframes/`), collapsing any doubled
9
+ * slashes the input introduced. The one implementation every hub-aware
10
+ * host (`@devframes/hub` itself, and the Vite/Nuxt/Next adapters) resolves
11
+ * `options.base` through.
12
+ */
13
+ declare function normalizeHubBase(base: string): string;
4
14
  /**
5
15
  * The default ordering weight for each known dock category — lower sorts
6
16
  * earlier. Downstream viewers (e.g. `@vitejs/devtools-kit`) import this as the
@@ -21,4 +31,4 @@ declare const DEFAULT_CATEGORIES_ORDER: Record<string, number>;
21
31
  declare const DOCK_RENDERERS_STATE_KEY = "devframe:dock-renderers";
22
32
  declare const DEFAULT_STATE_USER_SETTINGS: () => DevframeDocksUserSettings;
23
33
  //#endregion
24
- export { DEFAULT_CATEGORIES_ORDER, DEFAULT_STATE_USER_SETTINGS, DOCK_RENDERERS_STATE_KEY };
34
+ export { DEFAULT_CATEGORIES_ORDER, DEFAULT_STATE_USER_SETTINGS, DEVFRAMES_HUB_BASE, DOCK_RENDERERS_STATE_KEY, normalizeHubBase };
@@ -1,5 +1,18 @@
1
+ import { cleanDoubleSlashes, withLeadingSlash, withTrailingSlash } from "ufo";
1
2
  export * from "devframe/constants";
2
3
  //#region src/constants.ts
4
+ /** Default mount base for a hub instance — one namespace, one catch-all. */
5
+ const DEVFRAMES_HUB_BASE = "/__devframes/";
6
+ /**
7
+ * Normalize a hub mount base to an absolute path with leading and trailing
8
+ * slashes (e.g. `devframes` → `/devframes/`), collapsing any doubled
9
+ * slashes the input introduced. The one implementation every hub-aware
10
+ * host (`@devframes/hub` itself, and the Vite/Nuxt/Next adapters) resolves
11
+ * `options.base` through.
12
+ */
13
+ function normalizeHubBase(base) {
14
+ return cleanDoubleSlashes(withTrailingSlash(withLeadingSlash(base)));
15
+ }
3
16
  /**
4
17
  * The default ordering weight for each known dock category — lower sorts
5
18
  * earlier. Downstream viewers (e.g. `@vitejs/devtools-kit`) import this as the
@@ -34,9 +47,7 @@ const DEFAULT_STATE_USER_SETTINGS = () => ({
34
47
  docksCategoriesHidden: [],
35
48
  docksPinned: [],
36
49
  docksCustomOrder: {},
37
- showIframeAddressBar: false,
38
- closeOnOutsideClick: false,
39
50
  commandShortcuts: {}
40
51
  });
41
52
  //#endregion
42
- export { DEFAULT_CATEGORIES_ORDER, DEFAULT_STATE_USER_SETTINGS, DOCK_RENDERERS_STATE_KEY };
53
+ export { DEFAULT_CATEGORIES_ORDER, DEFAULT_STATE_USER_SETTINGS, DEVFRAMES_HUB_BASE, DOCK_RENDERERS_STATE_KEY, normalizeHubBase };
@@ -1,4 +1,4 @@
1
- import { D as DevframeViewIframe, S as DevframeDocksHost, c as DevframeCommandsHost, p as DevframeDockActivation, v as DevframeDockEntryIcon } from "./commands-CAcTUSlj.mjs";
1
+ import { b as DevframeDockEntryIcon, k as DevframeViewIframe, l as DevframeCommandsHost, m as DevframeDockActivation, w as DevframeDocksHost } from "./settings-DfrRa9Wf.mjs";
2
2
  import { CreateHostContextOptions } from "devframe/node";
3
3
  import { DevframeDefinition, DevframeHost, DevframeNodeContext, EventEmitter } from "devframe/types";
4
4
  import { ChildProcess } from "node:child_process";
@@ -3,25 +3,16 @@ import { DEFAULT_STATE_USER_SETTINGS } from "./constants.mjs";
3
3
  import { t as buildRemoteConnectionUrl } from "./remote-url-KVXtKP47.mjs";
4
4
  import { createEventEmitter } from "devframe/utils/events";
5
5
  import { createHostContext, createStorage } from "devframe/node";
6
+ import { getInternalContext, resolveBasePath } from "devframe/node/hub-internals";
6
7
  import { debounce } from "perfect-debounce";
7
8
  import { coerceAgentPositionalArgs } from "devframe/internal";
8
- import { defineDiagnostics } from "nostics";
9
- import { colors } from "devframe/utils/colors";
10
- import { ansiFormatter } from "nostics/formatters/ansi";
11
- import { getInternalContext, resolveBasePath } from "devframe/node/hub-internals";
9
+ import { defineDiagnostics } from "devframe/utils/nostics";
12
10
  import { join, resolve } from "pathe";
13
11
  import { nanoid } from "devframe/utils/nanoid";
14
12
  import process from "node:process";
15
- //#region src/utils/diagnostics-reporter.ts
16
- const formatAnsi = ansiFormatter(colors);
17
- function hubReporter(d, { method = "warn" } = {}) {
18
- console[method](formatAnsi(d));
19
- }
20
- //#endregion
21
13
  //#region src/node/diagnostics.ts
22
14
  const diagnostics = defineDiagnostics({
23
15
  docsBase: "https://devfra.me/errors",
24
- reporters: [hubReporter],
25
16
  codes: {
26
17
  DF8000: {
27
18
  why: (p) => `Devframe id "${p.id}" collides with a reserved hub path — it cannot be mounted directly under the hub base.`,
@@ -920,7 +911,8 @@ async function installDevframe(ctx, d, options = {}) {
920
911
  name: d.name,
921
912
  base
922
913
  });
923
- ctx.views.hostStatic(base, resolve(d.cli.distDir));
914
+ const distSource = d.cli.distDir;
915
+ ctx.views.hostStatic(base, typeof distSource === "string" ? resolve(distSource) : distSource);
924
916
  }
925
917
  ctx.docks.register({
926
918
  id,
@@ -1146,6 +1138,7 @@ async function createHubContext(options) {
1146
1138
  docksSharedState.mutate(() => docks.values());
1147
1139
  }, debounceMs);
1148
1140
  docks.events.on("dock:entry:updated", refreshDocks);
1141
+ getInternalContext(context).onWsEndpointChange(refreshDocks);
1149
1142
  docksSharedState.mutate(() => docks.values());
1150
1143
  const activeDockSharedState = await context.rpc.sharedState.get("devframe:docks:active", { initialValue: { activation: null } });
1151
1144
  docks.events.on("dock:activate", (activation) => {
@@ -0,0 +1,5 @@
1
+ import "./context-D5TJIHwp.mjs";
2
+ import "./settings-DfrRa9Wf.mjs";
3
+ import { RpcDefinitionsFilter, RpcDefinitionsToFunctions } from "devframe/rpc";
4
+ import { ConnectionMeta as ConnectionMeta$1, DevframeCapabilities, DevframeDiagnosticsHost, DevframeDiagnosticsLogger, DevframeHost as DevframeHost$1, DevframeNodeRpcSession, DevframeRpcClientFunctions, DevframeRpcServerFunctions, DevframeRpcSharedStates, DevframeViewHost, EventEmitter as EventEmitter$1, EventUnsubscribe, EventsMap, RpcBroadcastOptions, RpcFunctionsHost, RpcSharedStateGetOptions, RpcSharedStateHost, RpcStreamingChannel, RpcStreamingChannelOptions, RpcStreamingHost } from "devframe/types";
5
+ export { RpcStreamingHost as S, RpcFunctionsHost as _, DevframeHost$1 as a, RpcStreamingChannel as b, DevframeRpcServerFunctions as c, EventEmitter$1 as d, EventUnsubscribe as f, RpcDefinitionsToFunctions as g, RpcDefinitionsFilter as h, DevframeDiagnosticsLogger as i, DevframeRpcSharedStates as l, RpcBroadcastOptions as m, DevframeCapabilities as n, DevframeNodeRpcSession as o, EventsMap as p, DevframeDiagnosticsHost as r, DevframeRpcClientFunctions as s, ConnectionMeta$1 as t, DevframeViewHost as u, RpcSharedStateGetOptions as v, RpcStreamingChannelOptions as x, RpcSharedStateHost as y };
package/dist/index.d.mts CHANGED
@@ -1,7 +1,6 @@
1
- import { C as DevframeMessageHandle, D as DevframeMessagesHost, E as DevframeMessagesClient, O as DevframeMessagesLevelShortcuts, S as DevframeMessageFilePosition, T as DevframeMessageShortcutInput, _ as DevframeMessageCommandAction, a as DevframeChildProcessExecuteOptions, b as DevframeMessageEntryFrom, c as DevframeChildProcessTerminalSession, d as DevframeTerminalSession, f as DevframeTerminalSessionBase, g as DevframeMessageActivateAction, h as DevframeMessageAction, k as DevframeMessagesListDelta, l as DevframePtyExecuteOptions, m as DevframeTerminalsHost, n as DevframeHubContext, o as DevframeChildProcessOutput, p as DevframeTerminalStatus, s as DevframeChildProcessResult, t as CreateHubContextOptions, u as DevframePtyTerminalSession, v as DevframeMessageElementPosition, w as DevframeMessageLevel, x as DevframeMessageEntryInput, y as DevframeMessageEntry } from "./context-Dz0j8Eyg.mjs";
2
- import { A as FrameSubTabsConfig, C as DevframeViewAction, D as DevframeViewIframe, E as DevframeViewGroup, M as RemoteConnectionInfo, N as RemoteDockOptions, O as DevframeViewLauncher, S as DevframeDocksHost, T as DevframeViewCustomRender, _ as DevframeDockEntryCategory, a as DevframeCommandHandle, b as DevframeDockUserEntry, c as DevframeCommandsHost, d as DevframeServerCommandInput, f as ClientScriptEntry, g as DevframeDockEntryBase, h as DevframeDockEntry, i as DevframeCommandEntry, j as NavTarget, k as DevframeViewLauncherStatus, l as DevframeCommandsHostEvents, m as DevframeDockEntriesGrouped, n as DevframeCommandAgentOptions, o as DevframeCommandKeybinding, p as DevframeDockActivation, r as DevframeCommandBase, s as DevframeCommandShortcutOverrides, t as DevframeClientCommand, u as DevframeServerCommandEntry, v as DevframeDockEntryIcon, w as DevframeViewBuiltin, x as DevframeDocksActiveState, y as DevframeDockEntryRegistry } from "./commands-CAcTUSlj.mjs";
3
- import { t as DevframeDocksUserSettings } from "./settings-B1qJ47d5.mjs";
4
- import { C as RpcStreamingChannel, E as Thenable, S as RpcSharedStateHost, T as RpcStreamingHost, _ as RpcBroadcastOptions, a as DevframeDiagnosticsLogger, b as RpcFunctionsHost, c as DevframeRpcClientFunctions, d as DevframeViewHost, f as EntriesToObject, g as PartialWithoutId, h as EventsMap, i as DevframeDiagnosticsHost, l as DevframeRpcServerFunctions, m as EventUnsubscribe, n as DevframeCapabilities, o as DevframeHost, p as EventEmitter, r as DevframeDiagnosticsDefinition, s as DevframeNodeRpcSession, t as ConnectionMeta, u as DevframeRpcSharedStates, v as RpcDefinitionsFilter, w as RpcStreamingChannelOptions, x as RpcSharedStateGetOptions, y as RpcDefinitionsToFunctions } from "./index-p4BktGvQ.mjs";
1
+ import { C as DevframeMessageHandle, D as DevframeMessagesHost, E as DevframeMessagesClient, O as DevframeMessagesLevelShortcuts, S as DevframeMessageFilePosition, T as DevframeMessageShortcutInput, _ as DevframeMessageCommandAction, a as DevframeChildProcessExecuteOptions, b as DevframeMessageEntryFrom, c as DevframeChildProcessTerminalSession, d as DevframeTerminalSession, f as DevframeTerminalSessionBase, g as DevframeMessageActivateAction, h as DevframeMessageAction, k as DevframeMessagesListDelta, l as DevframePtyExecuteOptions, m as DevframeTerminalsHost, n as DevframeHubContext, o as DevframeChildProcessOutput, p as DevframeTerminalStatus, s as DevframeChildProcessResult, t as CreateHubContextOptions, u as DevframePtyTerminalSession, v as DevframeMessageElementPosition, w as DevframeMessageLevel, x as DevframeMessageEntryInput, y as DevframeMessageEntry } from "./context-D5TJIHwp.mjs";
2
+ import { A as DevframeViewLauncher, C as DevframeDocksActiveState, D as DevframeViewCustomRender, E as DevframeViewBuiltin, F as RemoteDockOptions, M as FrameSubTabsConfig, N as NavTarget, O as DevframeViewGroup, P as RemoteConnectionInfo, S as DevframeDockUserEntry, T as DevframeViewAction, _ as DevframeDockEntry, a as DevframeCommandEntry, b as DevframeDockEntryIcon, c as DevframeCommandShortcutOverrides, d as DevframeServerCommandEntry, f as DevframeServerCommandInput, g as DevframeDockEntriesGrouped, h as DevframeDockBadgeVariant, i as DevframeCommandBase, j as DevframeViewLauncherStatus, k as DevframeViewIframe, l as DevframeCommandsHost, m as DevframeDockActivation, n as DevframeClientCommand, o as DevframeCommandHandle, p as ClientScriptEntry, r as DevframeCommandAgentOptions, s as DevframeCommandKeybinding, t as DevframeDocksUserSettings, u as DevframeCommandsHostEvents, v as DevframeDockEntryBase, w as DevframeDocksHost, x as DevframeDockEntryRegistry, y as DevframeDockEntryCategory } from "./settings-DfrRa9Wf.mjs";
3
+ import { S as RpcStreamingHost, _ as RpcFunctionsHost, a as DevframeHost, b as RpcStreamingChannel, c as DevframeRpcServerFunctions, d as EventEmitter, f as EventUnsubscribe, g as RpcDefinitionsToFunctions, h as RpcDefinitionsFilter, i as DevframeDiagnosticsLogger, l as DevframeRpcSharedStates, m as RpcBroadcastOptions, n as DevframeCapabilities, o as DevframeNodeRpcSession, p as EventsMap, r as DevframeDiagnosticsHost, s as DevframeRpcClientFunctions, t as ConnectionMeta, u as DevframeViewHost, v as RpcSharedStateGetOptions, x as RpcStreamingChannelOptions, y as RpcSharedStateHost } from "./index-coDmWngQ.mjs";
5
4
  import { WhenContext, WhenExpression } from "devframe/utils/when";
6
5
  //#region src/define.d.ts
7
6
  declare const defineHubRpcFunction: <NAME extends string, TYPE extends import("devframe/rpc").RpcFunctionType, ARGS extends any[], RETURN = void, const AS extends import("devframe/rpc").RpcArgsSchema | undefined = undefined, const RS extends import("devframe/rpc").RpcReturnSchema | undefined = undefined>(definition: import("devframe/rpc").RpcFunctionDefinition<NAME, TYPE, ARGS, RETURN, AS, RS, DevframeHubContext>) => import("devframe/rpc").RpcFunctionDefinition<NAME, TYPE, ARGS, RETURN, AS, RS, DevframeHubContext>;
@@ -13,4 +12,4 @@ declare function defineDockEntry<const T extends DevframeDockUserEntry, const W
13
12
  visibility?: WhenExpression<WhenContext, V>;
14
13
  }): T;
15
14
  //#endregion
16
- export { type ClientScriptEntry, type ConnectionMeta, type CreateHubContextOptions, type DevframeCapabilities, type DevframeChildProcessExecuteOptions, type DevframeChildProcessOutput, type DevframeChildProcessResult, type DevframeChildProcessTerminalSession, type DevframeClientCommand, type DevframeCommandAgentOptions, type DevframeCommandBase, type DevframeCommandEntry, type DevframeCommandHandle, type DevframeCommandKeybinding, type DevframeCommandShortcutOverrides, type DevframeCommandsHost, type DevframeCommandsHostEvents, type DevframeDiagnosticsDefinition, type DevframeDiagnosticsHost, type DevframeDiagnosticsLogger, type DevframeDockActivation, type DevframeDockEntriesGrouped, type DevframeDockEntry, type DevframeDockEntryBase, type DevframeDockEntryCategory, type DevframeDockEntryIcon, type DevframeDockEntryRegistry, type DevframeDockUserEntry, type DevframeDocksActiveState, type DevframeDocksHost, type DevframeDocksUserSettings, type DevframeHost, type DevframeHubContext, type DevframeMessageAction, type DevframeMessageActivateAction, type DevframeMessageCommandAction, type DevframeMessageElementPosition, type DevframeMessageEntry, type DevframeMessageEntryFrom, type DevframeMessageEntryInput, type DevframeMessageFilePosition, type DevframeMessageHandle, type DevframeMessageLevel, type DevframeMessageShortcutInput, type DevframeMessagesClient, type DevframeMessagesHost, type DevframeMessagesLevelShortcuts, type DevframeMessagesListDelta, type DevframeNodeRpcSession, type DevframePtyExecuteOptions, type DevframePtyTerminalSession, type DevframeRpcClientFunctions, type DevframeRpcServerFunctions, type DevframeRpcSharedStates, type DevframeServerCommandEntry, type DevframeServerCommandInput, type DevframeTerminalSession, type DevframeTerminalSessionBase, type DevframeTerminalStatus, type DevframeTerminalsHost, type DevframeViewAction, type DevframeViewBuiltin, type DevframeViewCustomRender, type DevframeViewGroup, type DevframeViewHost, type DevframeViewIframe, type DevframeViewLauncher, type DevframeViewLauncherStatus, type EntriesToObject, type EventEmitter, type EventUnsubscribe, type EventsMap, type FrameSubTabsConfig, type NavTarget, type PartialWithoutId, type RemoteConnectionInfo, type RemoteDockOptions, type RpcBroadcastOptions, type RpcDefinitionsFilter, type RpcDefinitionsToFunctions, type RpcFunctionsHost, type RpcSharedStateGetOptions, type RpcSharedStateHost, type RpcStreamingChannel, type RpcStreamingChannelOptions, type RpcStreamingHost, type Thenable, defineCommand, defineDockEntry, defineHubRpcFunction };
15
+ export { type ClientScriptEntry, type ConnectionMeta, type CreateHubContextOptions, type DevframeCapabilities, type DevframeChildProcessExecuteOptions, type DevframeChildProcessOutput, type DevframeChildProcessResult, type DevframeChildProcessTerminalSession, type DevframeClientCommand, type DevframeCommandAgentOptions, type DevframeCommandBase, type DevframeCommandEntry, type DevframeCommandHandle, type DevframeCommandKeybinding, type DevframeCommandShortcutOverrides, type DevframeCommandsHost, type DevframeCommandsHostEvents, type DevframeDiagnosticsHost, type DevframeDiagnosticsLogger, type DevframeDockActivation, type DevframeDockBadgeVariant, type DevframeDockEntriesGrouped, type DevframeDockEntry, type DevframeDockEntryBase, type DevframeDockEntryCategory, type DevframeDockEntryIcon, type DevframeDockEntryRegistry, type DevframeDockUserEntry, type DevframeDocksActiveState, type DevframeDocksHost, type DevframeDocksUserSettings, type DevframeHost, type DevframeHubContext, type DevframeMessageAction, type DevframeMessageActivateAction, type DevframeMessageCommandAction, type DevframeMessageElementPosition, type DevframeMessageEntry, type DevframeMessageEntryFrom, type DevframeMessageEntryInput, type DevframeMessageFilePosition, type DevframeMessageHandle, type DevframeMessageLevel, type DevframeMessageShortcutInput, type DevframeMessagesClient, type DevframeMessagesHost, type DevframeMessagesLevelShortcuts, type DevframeMessagesListDelta, type DevframeNodeRpcSession, type DevframePtyExecuteOptions, type DevframePtyTerminalSession, type DevframeRpcClientFunctions, type DevframeRpcServerFunctions, type DevframeRpcSharedStates, type DevframeServerCommandEntry, type DevframeServerCommandInput, type DevframeTerminalSession, type DevframeTerminalSessionBase, type DevframeTerminalStatus, type DevframeTerminalsHost, type DevframeViewAction, type DevframeViewBuiltin, type DevframeViewCustomRender, type DevframeViewGroup, type DevframeViewHost, type DevframeViewIframe, type DevframeViewLauncher, type DevframeViewLauncherStatus, type EventEmitter, type EventUnsubscribe, type EventsMap, type FrameSubTabsConfig, type NavTarget, type RemoteConnectionInfo, type RemoteDockOptions, type RpcBroadcastOptions, type RpcDefinitionsFilter, type RpcDefinitionsToFunctions, type RpcFunctionsHost, type RpcSharedStateGetOptions, type RpcSharedStateHost, type RpcStreamingChannel, type RpcStreamingChannelOptions, type RpcStreamingHost, defineCommand, defineDockEntry, defineHubRpcFunction };
@@ -1,6 +1,5 @@
1
- import { C as DevframeMessageHandle, D as DevframeMessagesHost$1, T as DevframeMessageShortcutInput, a as DevframeChildProcessExecuteOptions, c as DevframeChildProcessTerminalSession, d as DevframeTerminalSession, f as DevframeTerminalSessionBase, i as InstallDevframeOptions, k as DevframeMessagesListDelta, l as DevframePtyExecuteOptions, m as DevframeTerminalsHost$1, n as DevframeHubContext, r as createHubContext, t as CreateHubContextOptions, u as DevframePtyTerminalSession, x as DevframeMessageEntryInput, y as DevframeMessageEntry } from "../context-Dz0j8Eyg.mjs";
2
- import { S as DevframeDocksHost$1, a as DevframeCommandHandle, b as DevframeDockUserEntry, c as DevframeCommandsHost$1, d as DevframeServerCommandInput, f as ClientScriptEntry, h as DevframeDockEntry, u as DevframeServerCommandEntry } from "../commands-CAcTUSlj.mjs";
3
- import { t as DevframeDocksUserSettings } from "../settings-B1qJ47d5.mjs";
1
+ import { C as DevframeMessageHandle, D as DevframeMessagesHost$1, T as DevframeMessageShortcutInput, a as DevframeChildProcessExecuteOptions, c as DevframeChildProcessTerminalSession, d as DevframeTerminalSession, f as DevframeTerminalSessionBase, i as InstallDevframeOptions, k as DevframeMessagesListDelta, l as DevframePtyExecuteOptions, m as DevframeTerminalsHost$1, n as DevframeHubContext, r as createHubContext, t as CreateHubContextOptions, u as DevframePtyTerminalSession, x as DevframeMessageEntryInput, y as DevframeMessageEntry } from "../context-D5TJIHwp.mjs";
2
+ import { S as DevframeDockUserEntry, _ as DevframeDockEntry, d as DevframeServerCommandEntry, f as DevframeServerCommandInput, l as DevframeCommandsHost$1, o as DevframeCommandHandle, p as ClientScriptEntry, t as DevframeDocksUserSettings, w as DevframeDocksHost$1 } from "../settings-DfrRa9Wf.mjs";
4
3
  import { RpcFunctionDefinitionAny } from "devframe/rpc";
5
4
  import { SharedState } from "devframe/utils/shared-state";
6
5
  //#region src/node/host-commands.d.ts
@@ -1,9 +1,9 @@
1
- import { _ as DevframeCommandsHost, a as hubMessagesAdd, c as hubMessagesUpdate, d as hubTerminalsRestart, f as hubTerminalsTerminate, g as DevframeDocksHost, h as DevframeMessagesHost, i as hubDocksActivate, l as hubTerminalsRemove, m as DevframeTerminalsHost, n as builtinHubRpcDeclarations, o as hubMessagesClear, p as hubTerminalsWrite, r as hubCommandsExecute, s as hubMessagesRemove, t as createHubContext, u as hubTerminalsResize } from "../context-DPdojIW8.mjs";
1
+ import { _ as DevframeCommandsHost, a as hubMessagesAdd, c as hubMessagesUpdate, d as hubTerminalsRestart, f as hubTerminalsTerminate, g as DevframeDocksHost, h as DevframeMessagesHost, i as hubDocksActivate, l as hubTerminalsRemove, m as DevframeTerminalsHost, n as builtinHubRpcDeclarations, o as hubMessagesClear, p as hubTerminalsWrite, r as hubCommandsExecute, s as hubMessagesRemove, t as createHubContext, u as hubTerminalsResize } from "../context-DzqMQ2mI.mjs";
2
+ import "ufo";
2
3
  import "pathe";
3
4
  import "node:process";
4
5
  import { builtinModules } from "node:module";
5
6
  import "node:fs";
6
- import "ufo";
7
7
  import "node:url";
8
8
  import assert from "node:assert";
9
9
  import "node:path";
@@ -1,4 +1,5 @@
1
- import { i as InstallDevframeOptions, n as DevframeHubContext, t as CreateHubContextOptions } from "../context-Dz0j8Eyg.mjs";
1
+ import { i as InstallDevframeOptions, n as DevframeHubContext, t as CreateHubContextOptions } from "../context-D5TJIHwp.mjs";
2
+ import { DEVFRAMES_HUB_BASE } from "../constants.mjs";
2
3
  import { DevframeInstanceRecord } from "devframe/internal";
3
4
  import { ConnectionMeta, DevframeDefinition, DevframeSseOptions, DevframeStorageScope, DevframeWsOptions, McpRouteOptions } from "devframe/types";
4
5
  import { DevframeAuthHandler } from "devframe/node/auth";
@@ -15,8 +16,6 @@ interface HubDevframeEntry {
15
16
  }
16
17
  type Thenable<T> = T | Promise<T>;
17
18
  type Arrayable<T> = T | readonly T[];
18
- /** Default mount base for a hub instance — one namespace, one catch-all. */
19
- declare const DEVFRAMES_HUB_BASE = "/__devframes/";
20
19
  /**
21
20
  * One dock-type → prebuilt renderer-module registration for
22
21
  * {@link InitHubOptions.renderers}. The hub serves the module at
@@ -71,12 +70,22 @@ interface DevframeHubUi {
71
70
  };
72
71
  /**
73
72
  * Extra UI-owned files the hub serves at `<base><key>`, each produced lazily
74
- * from memory. Keys are base-relative paths (e.g. `branding.json`); the
75
- * content-type is inferred from the key's extension. A generic seam a viewer
76
- * uses to publish small runtime documents (the reference UI serves its
77
- * branding this way) without teaching the hub anything about their meaning.
73
+ * from memory. Keys are base-relative paths; the content-type is inferred
74
+ * from the key's extension. A generic seam a viewer uses to publish
75
+ * arbitrary runtime documents without teaching the hub anything about
76
+ * their meaning.
78
77
  */
79
78
  assets?: Record<string, () => string | Uint8Array>;
79
+ /**
80
+ * A setup hook run once during hub init with the hub context — the UI
81
+ * slot's chance to publish its own static, boot-time config through the
82
+ * generic `ctx.staticConfig` (serialized into `ConnectionMeta.configs`).
83
+ * The reference UI's `createUi()` uses it to set
84
+ * `ctx.staticConfig.ui = { branding, … }`, reaching every mounted frame and
85
+ * the standalone viewer through the one connection handshake they perform.
86
+ * The hub stays policy-free about what the UI writes.
87
+ */
88
+ setup?: (ctx: DevframeHubContext) => void | Promise<void>;
80
89
  }
81
90
  type DevframesInput = Array<DevframeDefinition | HubDevframeEntry | Thenable<Arrayable<DevframeDefinition | HubDevframeEntry | null | undefined>> | (() => Thenable<Arrayable<DevframeDefinition | HubDevframeEntry | null | undefined>>)>;
82
91
  interface InitHubOptions {
@@ -181,8 +190,6 @@ interface InitHubOptions {
181
190
  * Expose the **aggregate** MCP endpoint at `<base>__mcp` — one
182
191
  * Streamable-HTTP server over the shared context's whole tool registry
183
192
  * (ids are already namespaced per plugin). Disabled by default.
184
- *
185
- * @experimental
186
193
  */
187
194
  mcp?: boolean | McpRouteOptions;
188
195
  /**
@@ -1,11 +1,11 @@
1
- import { DOCK_RENDERERS_STATE_KEY } from "../constants.mjs";
2
- import { t as createHubContext, v as diagnostics } from "../context-DPdojIW8.mjs";
1
+ import { DEVFRAMES_HUB_BASE, DOCK_RENDERERS_STATE_KEY, normalizeHubBase } from "../constants.mjs";
2
+ import { t as createHubContext, v as diagnostics } from "../context-DzqMQ2mI.mjs";
3
+ import { joinURL, withTrailingSlash, withoutLeadingSlash } from "ufo";
3
4
  import { DEVFRAME_CONNECTION_META_FILENAME, DEVFRAME_DOCK_IMPORTS_FILENAME, DEVFRAME_MCP_ROUTE, DEVFRAME_WS_ROUTE } from "devframe/constants";
4
5
  import { createH3DevframeHost, createInstanceShell, resolveInstanceRegister } from "devframe/internal";
5
6
  import { resolve } from "pathe";
6
7
  import process from "node:process";
7
8
  import { existsSync } from "node:fs";
8
- import { cleanDoubleSlashes, joinURL, withLeadingSlash, withTrailingSlash, withoutLeadingSlash } from "ufo";
9
9
  import { readFile } from "node:fs/promises";
10
10
  import { mountStaticHandler } from "devframe/utils/serve-static";
11
11
  import { H3 } from "h3";
@@ -13,8 +13,6 @@ import { H3 } from "h3";
13
13
  function normalizeDevframeEntry(entry) {
14
14
  return "devframe" in entry ? entry : { devframe: entry };
15
15
  }
16
- /** Default mount base for a hub instance — one namespace, one catch-all. */
17
- const DEVFRAMES_HUB_BASE = "/__devframes/";
18
16
  /** Content-type for a UI asset key, inferred from its file extension. */
19
17
  function assetContentType(key) {
20
18
  if (key.endsWith(".json")) return "application/json; charset=utf-8";
@@ -45,9 +43,6 @@ function resolveDevframesInput(input) {
45
43
  return (Array.isArray(resolved) ? resolved : [resolved]).filter((slot) => slot != null).map(normalizeDevframeEntry);
46
44
  })).then((arrays) => arrays.flat());
47
45
  }
48
- function normalizeBase(base) {
49
- return cleanDoubleSlashes(withTrailingSlash(withLeadingSlash(base)));
50
- }
51
46
  /**
52
47
  * Validate the renderer-module registrations fail-fast: route-safe types
53
48
  * (each becomes the `<base>__renderers/<type>.mjs` URL segment), one module
@@ -107,7 +102,7 @@ function renderClientImportsModule(ctx) {
107
102
  * through {@link HubInstance.attach}.
108
103
  */
109
104
  function initHub(options) {
110
- const base = normalizeBase(options.base);
105
+ const base = normalizeHubBase(options.base);
111
106
  const baseNoSlash = base.slice(0, -1);
112
107
  const app = new H3();
113
108
  const cwd = options.cwd ?? process.cwd();
@@ -184,6 +179,7 @@ function initHub(options) {
184
179
  });
185
180
  }
186
181
  await options.configure?.(ctx);
182
+ await options.ui?.setup?.(ctx);
187
183
  if (rendererRegistrations.length > 0) {
188
184
  const manifest = {};
189
185
  for (const registration of rendererRegistrations) manifest[registration.type] = {
@@ -50,6 +50,8 @@ type DevframeDockEntryIcon = string | {
50
50
  light: string;
51
51
  dark: string;
52
52
  };
53
+ /** Color for a dock-bar entry's {@link DevframeDockEntryBase.badge} — mirrors json-render's `TabDescriptor.badgeVariant`. */
54
+ type DevframeDockBadgeVariant = 'default' | 'info' | 'success' | 'warning' | 'danger';
53
55
  interface DevframeDockEntryBase {
54
56
  id: string;
55
57
  title: string;
@@ -114,6 +116,11 @@ interface DevframeDockEntryBase {
114
116
  * Badge text to display on the dock icon (e.g., unread count)
115
117
  */
116
118
  badge?: string;
119
+ /**
120
+ * Colors {@link badge}. Omitted (or `'default'`) keeps the existing neutral
121
+ * fill, so every pre-existing badge consumer keeps its current look.
122
+ */
123
+ badgeVariant?: DevframeDockBadgeVariant;
117
124
  /**
118
125
  * Id of the group this entry belongs to. When set, hosts collapse this entry
119
126
  * under the matching group's button instead of showing it directly on the
@@ -460,9 +467,6 @@ interface DevframeCommandBase {
460
467
  * `when` clauses are evaluated client-side only and are **not** enforced for
461
468
  * agent calls — opt in a `when`-gated command only if running it outside its
462
469
  * UI context is safe.
463
- *
464
- * @experimental The agent-native surface is experimental and may change
465
- * without a major version bump until it stabilizes.
466
470
  */
467
471
  interface DevframeCommandAgentOptions {
468
472
  /**
@@ -499,8 +503,6 @@ interface DevframeServerCommandInput extends DevframeCommandBase {
499
503
  /**
500
504
  * Opt this command in to the agent surface (`ctx.agent` → MCP). Requires a
501
505
  * `handler`. See {@link DevframeCommandAgentOptions}.
502
- *
503
- * @experimental
504
506
  */
505
507
  agent?: DevframeCommandAgentOptions;
506
508
  /**
@@ -572,4 +574,36 @@ interface DevframeCommandShortcutOverrides {
572
574
  [commandId: string]: DevframeCommandKeybinding[];
573
575
  }
574
576
  //#endregion
575
- export { FrameSubTabsConfig as A, DevframeViewAction as C, DevframeViewIframe as D, DevframeViewGroup as E, RemoteConnectionInfo as M, RemoteDockOptions as N, DevframeViewLauncher as O, DevframeDocksHost as S, DevframeViewCustomRender as T, DevframeDockEntryCategory as _, DevframeCommandHandle as a, DevframeDockUserEntry as b, DevframeCommandsHost as c, DevframeServerCommandInput as d, ClientScriptEntry as f, DevframeDockEntryBase as g, DevframeDockEntry as h, DevframeCommandEntry as i, NavTarget as j, DevframeViewLauncherStatus as k, DevframeCommandsHostEvents as l, DevframeDockEntriesGrouped as m, DevframeCommandAgentOptions as n, DevframeCommandKeybinding as o, DevframeDockActivation as p, DevframeCommandBase as r, DevframeCommandShortcutOverrides as s, DevframeClientCommand as t, DevframeServerCommandEntry as u, DevframeDockEntryIcon as v, DevframeViewBuiltin as w, DevframeDocksActiveState as x, DevframeDockEntryRegistry as y };
577
+ //#region src/types/settings.d.ts
578
+ /**
579
+ * Persisted per-user dock + command settings, synced over the
580
+ * `devframe:user-settings` shared state. The generic base carries the hub's
581
+ * own dock-registry and command model that every viewer shares; a viewer
582
+ * augments it with its own reference-UI toggles via declaration merging:
583
+ *
584
+ * ```ts
585
+ * declare module '@devframes/hub/types' {
586
+ * interface DevframeDocksUserSettings {
587
+ * myViewerToggle?: boolean
588
+ * }
589
+ * }
590
+ * ```
591
+ *
592
+ * Augmented fields are optional so the hub's `DEFAULT_STATE_USER_SETTINGS()`
593
+ * (which knows nothing about them) stays assignable — an absent value reads
594
+ * as the viewer's documented default.
595
+ */
596
+ interface DevframeDocksUserSettings {
597
+ /** Ids of dock entries the user has hidden from the bar. */
598
+ docksHidden: string[];
599
+ /** Category ids the user has collapsed/hidden on the bar. */
600
+ docksCategoriesHidden: string[];
601
+ /** Ids of dock entries the user has pinned. */
602
+ docksPinned: string[];
603
+ /** Per-entry sort weight overriding the registry's default order. */
604
+ docksCustomOrder: Record<string, number>;
605
+ /** Per-command keybinding overrides (empty array = shortcut disabled). */
606
+ commandShortcuts: DevframeCommandShortcutOverrides;
607
+ }
608
+ //#endregion
609
+ export { DevframeViewLauncher as A, DevframeDocksActiveState as C, DevframeViewCustomRender as D, DevframeViewBuiltin as E, RemoteDockOptions as F, FrameSubTabsConfig as M, NavTarget as N, DevframeViewGroup as O, RemoteConnectionInfo as P, DevframeDockUserEntry as S, DevframeViewAction as T, DevframeDockEntry as _, DevframeCommandEntry as a, DevframeDockEntryIcon as b, DevframeCommandShortcutOverrides as c, DevframeServerCommandEntry as d, DevframeServerCommandInput as f, DevframeDockEntriesGrouped as g, DevframeDockBadgeVariant as h, DevframeCommandBase as i, DevframeViewLauncherStatus as j, DevframeViewIframe as k, DevframeCommandsHost as l, DevframeDockActivation as m, DevframeClientCommand as n, DevframeCommandHandle as o, ClientScriptEntry as p, DevframeCommandAgentOptions as r, DevframeCommandKeybinding as s, DevframeDocksUserSettings as t, DevframeCommandsHostEvents as u, DevframeDockEntryBase as v, DevframeDocksHost as w, DevframeDockEntryRegistry as x, DevframeDockEntryCategory as y };
@@ -1,5 +1,4 @@
1
- import { C as DevframeMessageHandle, D as DevframeMessagesHost, E as DevframeMessagesClient, O as DevframeMessagesLevelShortcuts, S as DevframeMessageFilePosition, T as DevframeMessageShortcutInput, _ as DevframeMessageCommandAction, a as DevframeChildProcessExecuteOptions, b as DevframeMessageEntryFrom, c as DevframeChildProcessTerminalSession, d as DevframeTerminalSession, f as DevframeTerminalSessionBase, g as DevframeMessageActivateAction, h as DevframeMessageAction, k as DevframeMessagesListDelta, l as DevframePtyExecuteOptions, m as DevframeTerminalsHost, n as DevframeHubContext, o as DevframeChildProcessOutput, p as DevframeTerminalStatus, s as DevframeChildProcessResult, t as CreateHubContextOptions, u as DevframePtyTerminalSession, v as DevframeMessageElementPosition, w as DevframeMessageLevel, x as DevframeMessageEntryInput, y as DevframeMessageEntry } from "../context-Dz0j8Eyg.mjs";
2
- import { A as FrameSubTabsConfig, C as DevframeViewAction, D as DevframeViewIframe, E as DevframeViewGroup, M as RemoteConnectionInfo, N as RemoteDockOptions, O as DevframeViewLauncher, S as DevframeDocksHost, T as DevframeViewCustomRender, _ as DevframeDockEntryCategory, a as DevframeCommandHandle, b as DevframeDockUserEntry, c as DevframeCommandsHost, d as DevframeServerCommandInput, f as ClientScriptEntry, g as DevframeDockEntryBase, h as DevframeDockEntry, i as DevframeCommandEntry, j as NavTarget, k as DevframeViewLauncherStatus, l as DevframeCommandsHostEvents, m as DevframeDockEntriesGrouped, n as DevframeCommandAgentOptions, o as DevframeCommandKeybinding, p as DevframeDockActivation, r as DevframeCommandBase, s as DevframeCommandShortcutOverrides, t as DevframeClientCommand, u as DevframeServerCommandEntry, v as DevframeDockEntryIcon, w as DevframeViewBuiltin, x as DevframeDocksActiveState, y as DevframeDockEntryRegistry } from "../commands-CAcTUSlj.mjs";
3
- import { t as DevframeDocksUserSettings } from "../settings-B1qJ47d5.mjs";
4
- import { C as RpcStreamingChannel, E as Thenable, S as RpcSharedStateHost, T as RpcStreamingHost, _ as RpcBroadcastOptions, a as DevframeDiagnosticsLogger, b as RpcFunctionsHost, c as DevframeRpcClientFunctions, d as DevframeViewHost, f as EntriesToObject, g as PartialWithoutId, h as EventsMap, i as DevframeDiagnosticsHost, l as DevframeRpcServerFunctions, m as EventUnsubscribe, n as DevframeCapabilities, o as DevframeHost, p as EventEmitter, r as DevframeDiagnosticsDefinition, s as DevframeNodeRpcSession, t as ConnectionMeta, u as DevframeRpcSharedStates, v as RpcDefinitionsFilter, w as RpcStreamingChannelOptions, x as RpcSharedStateGetOptions, y as RpcDefinitionsToFunctions } from "../index-p4BktGvQ.mjs";
5
- export { ClientScriptEntry, type ConnectionMeta, type CreateHubContextOptions, type DevframeCapabilities, DevframeChildProcessExecuteOptions, DevframeChildProcessOutput, DevframeChildProcessResult, DevframeChildProcessTerminalSession, DevframeClientCommand, DevframeCommandAgentOptions, DevframeCommandBase, DevframeCommandEntry, DevframeCommandHandle, DevframeCommandKeybinding, DevframeCommandShortcutOverrides, DevframeCommandsHost, DevframeCommandsHostEvents, type DevframeDiagnosticsDefinition, type DevframeDiagnosticsHost, type DevframeDiagnosticsLogger, DevframeDockActivation, DevframeDockEntriesGrouped, DevframeDockEntry, DevframeDockEntryBase, DevframeDockEntryCategory, DevframeDockEntryIcon, DevframeDockEntryRegistry, DevframeDockUserEntry, DevframeDocksActiveState, DevframeDocksHost, DevframeDocksUserSettings, type DevframeHost, type DevframeHubContext, DevframeMessageAction, DevframeMessageActivateAction, DevframeMessageCommandAction, DevframeMessageElementPosition, DevframeMessageEntry, DevframeMessageEntryFrom, DevframeMessageEntryInput, DevframeMessageFilePosition, DevframeMessageHandle, DevframeMessageLevel, DevframeMessageShortcutInput, DevframeMessagesClient, DevframeMessagesHost, DevframeMessagesLevelShortcuts, DevframeMessagesListDelta, type DevframeNodeRpcSession, DevframePtyExecuteOptions, DevframePtyTerminalSession, type DevframeRpcClientFunctions, type DevframeRpcServerFunctions, type DevframeRpcSharedStates, DevframeServerCommandEntry, DevframeServerCommandInput, DevframeTerminalSession, DevframeTerminalSessionBase, DevframeTerminalStatus, DevframeTerminalsHost, DevframeViewAction, DevframeViewBuiltin, DevframeViewCustomRender, DevframeViewGroup, type DevframeViewHost, DevframeViewIframe, DevframeViewLauncher, DevframeViewLauncherStatus, type EntriesToObject, type EventEmitter, type EventUnsubscribe, type EventsMap, FrameSubTabsConfig, NavTarget, type PartialWithoutId, RemoteConnectionInfo, RemoteDockOptions, type RpcBroadcastOptions, type RpcDefinitionsFilter, type RpcDefinitionsToFunctions, type RpcFunctionsHost, type RpcSharedStateGetOptions, type RpcSharedStateHost, type RpcStreamingChannel, type RpcStreamingChannelOptions, type RpcStreamingHost, type Thenable };
1
+ import { C as DevframeMessageHandle, D as DevframeMessagesHost, E as DevframeMessagesClient, O as DevframeMessagesLevelShortcuts, S as DevframeMessageFilePosition, T as DevframeMessageShortcutInput, _ as DevframeMessageCommandAction, a as DevframeChildProcessExecuteOptions, b as DevframeMessageEntryFrom, c as DevframeChildProcessTerminalSession, d as DevframeTerminalSession, f as DevframeTerminalSessionBase, g as DevframeMessageActivateAction, h as DevframeMessageAction, k as DevframeMessagesListDelta, l as DevframePtyExecuteOptions, m as DevframeTerminalsHost, n as DevframeHubContext, o as DevframeChildProcessOutput, p as DevframeTerminalStatus, s as DevframeChildProcessResult, t as CreateHubContextOptions, u as DevframePtyTerminalSession, v as DevframeMessageElementPosition, w as DevframeMessageLevel, x as DevframeMessageEntryInput, y as DevframeMessageEntry } from "../context-D5TJIHwp.mjs";
2
+ import { A as DevframeViewLauncher, C as DevframeDocksActiveState, D as DevframeViewCustomRender, E as DevframeViewBuiltin, F as RemoteDockOptions, M as FrameSubTabsConfig, N as NavTarget, O as DevframeViewGroup, P as RemoteConnectionInfo, S as DevframeDockUserEntry, T as DevframeViewAction, _ as DevframeDockEntry, a as DevframeCommandEntry, b as DevframeDockEntryIcon, c as DevframeCommandShortcutOverrides, d as DevframeServerCommandEntry, f as DevframeServerCommandInput, g as DevframeDockEntriesGrouped, h as DevframeDockBadgeVariant, i as DevframeCommandBase, j as DevframeViewLauncherStatus, k as DevframeViewIframe, l as DevframeCommandsHost, m as DevframeDockActivation, n as DevframeClientCommand, o as DevframeCommandHandle, p as ClientScriptEntry, r as DevframeCommandAgentOptions, s as DevframeCommandKeybinding, t as DevframeDocksUserSettings, u as DevframeCommandsHostEvents, v as DevframeDockEntryBase, w as DevframeDocksHost, x as DevframeDockEntryRegistry, y as DevframeDockEntryCategory } from "../settings-DfrRa9Wf.mjs";
3
+ import { S as RpcStreamingHost, _ as RpcFunctionsHost, a as DevframeHost, b as RpcStreamingChannel, c as DevframeRpcServerFunctions, d as EventEmitter, f as EventUnsubscribe, g as RpcDefinitionsToFunctions, h as RpcDefinitionsFilter, i as DevframeDiagnosticsLogger, l as DevframeRpcSharedStates, m as RpcBroadcastOptions, n as DevframeCapabilities, o as DevframeNodeRpcSession, p as EventsMap, r as DevframeDiagnosticsHost, s as DevframeRpcClientFunctions, t as ConnectionMeta, u as DevframeViewHost, v as RpcSharedStateGetOptions, x as RpcStreamingChannelOptions, y as RpcSharedStateHost } from "../index-coDmWngQ.mjs";
4
+ export { ClientScriptEntry, type ConnectionMeta, type CreateHubContextOptions, type DevframeCapabilities, DevframeChildProcessExecuteOptions, DevframeChildProcessOutput, DevframeChildProcessResult, DevframeChildProcessTerminalSession, DevframeClientCommand, DevframeCommandAgentOptions, DevframeCommandBase, DevframeCommandEntry, DevframeCommandHandle, DevframeCommandKeybinding, DevframeCommandShortcutOverrides, DevframeCommandsHost, DevframeCommandsHostEvents, type DevframeDiagnosticsHost, type DevframeDiagnosticsLogger, DevframeDockActivation, DevframeDockBadgeVariant, DevframeDockEntriesGrouped, DevframeDockEntry, DevframeDockEntryBase, DevframeDockEntryCategory, DevframeDockEntryIcon, DevframeDockEntryRegistry, DevframeDockUserEntry, DevframeDocksActiveState, DevframeDocksHost, DevframeDocksUserSettings, type DevframeHost, type DevframeHubContext, DevframeMessageAction, DevframeMessageActivateAction, DevframeMessageCommandAction, DevframeMessageElementPosition, DevframeMessageEntry, DevframeMessageEntryFrom, DevframeMessageEntryInput, DevframeMessageFilePosition, DevframeMessageHandle, DevframeMessageLevel, DevframeMessageShortcutInput, DevframeMessagesClient, DevframeMessagesHost, DevframeMessagesLevelShortcuts, DevframeMessagesListDelta, type DevframeNodeRpcSession, DevframePtyExecuteOptions, DevframePtyTerminalSession, type DevframeRpcClientFunctions, type DevframeRpcServerFunctions, type DevframeRpcSharedStates, DevframeServerCommandEntry, DevframeServerCommandInput, DevframeTerminalSession, DevframeTerminalSessionBase, DevframeTerminalStatus, DevframeTerminalsHost, DevframeViewAction, DevframeViewBuiltin, DevframeViewCustomRender, DevframeViewGroup, type DevframeViewHost, DevframeViewIframe, DevframeViewLauncher, DevframeViewLauncherStatus, type EventEmitter, type EventUnsubscribe, type EventsMap, FrameSubTabsConfig, NavTarget, RemoteConnectionInfo, RemoteDockOptions, type RpcBroadcastOptions, type RpcDefinitionsFilter, type RpcDefinitionsToFunctions, type RpcFunctionsHost, type RpcSharedStateGetOptions, type RpcSharedStateHost, type RpcStreamingChannel, type RpcStreamingChannelOptions, type RpcStreamingHost };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@devframes/hub",
3
3
  "type": "module",
4
- "version": "0.9.0-beta.1",
4
+ "version": "0.9.0-beta.10",
5
5
  "description": "Hub layer that orchestrates devframe docks, terminals, messages, and commands on any host.",
6
6
  "author": "Anthony Fu <anthonyfu117@hotmail.com>",
7
7
  "license": "MIT",
@@ -34,13 +34,12 @@
34
34
  "dist"
35
35
  ],
36
36
  "peerDependencies": {
37
- "devframe": "0.9.0-beta.1"
37
+ "devframe": "0.9.0-beta.10"
38
38
  },
39
39
  "dependencies": {
40
40
  "@standard-schema/spec": "^1.1.0",
41
41
  "destr": "^2.0.5",
42
42
  "h3": "^2.0.1-rc.26",
43
- "nostics": "^1.2.0",
44
43
  "pathe": "^2.0.3",
45
44
  "perfect-debounce": "^2.1.0",
46
45
  "tinyexec": "^1.3.0",
@@ -53,7 +52,7 @@
53
52
  "mlly": "^1.8.2",
54
53
  "tsdown": "^0.22.14",
55
54
  "valibot": "^1.4.2",
56
- "devframe": "0.9.0-beta.1"
55
+ "devframe": "0.9.0-beta.10"
57
56
  },
58
57
  "scripts": {
59
58
  "build": "tsdown",
@@ -1,6 +0,0 @@
1
- import "./context-Dz0j8Eyg.mjs";
2
- import "./commands-CAcTUSlj.mjs";
3
- import "./settings-B1qJ47d5.mjs";
4
- import { RpcDefinitionsFilter, RpcDefinitionsToFunctions } from "devframe/rpc";
5
- import { ConnectionMeta as ConnectionMeta$1, DevframeCapabilities, DevframeDiagnosticsDefinition, DevframeDiagnosticsHost, DevframeDiagnosticsLogger, DevframeHost as DevframeHost$1, DevframeNodeRpcSession, DevframeRpcClientFunctions, DevframeRpcServerFunctions, DevframeRpcSharedStates, DevframeViewHost, EntriesToObject, EventEmitter as EventEmitter$1, EventUnsubscribe, EventsMap, PartialWithoutId, RpcBroadcastOptions, RpcFunctionsHost, RpcSharedStateGetOptions, RpcSharedStateHost, RpcStreamingChannel, RpcStreamingChannelOptions, RpcStreamingHost, Thenable } from "devframe/types";
6
- export { RpcStreamingChannel as C, Thenable as E, RpcSharedStateHost as S, RpcStreamingHost as T, RpcBroadcastOptions as _, DevframeDiagnosticsLogger as a, RpcFunctionsHost as b, DevframeRpcClientFunctions as c, DevframeViewHost as d, EntriesToObject as f, PartialWithoutId as g, EventsMap as h, DevframeDiagnosticsHost as i, DevframeRpcServerFunctions as l, EventUnsubscribe as m, DevframeCapabilities as n, DevframeHost$1 as o, EventEmitter$1 as p, DevframeDiagnosticsDefinition as r, DevframeNodeRpcSession as s, ConnectionMeta$1 as t, DevframeRpcSharedStates as u, RpcDefinitionsFilter as v, RpcStreamingChannelOptions as w, RpcSharedStateGetOptions as x, RpcDefinitionsToFunctions as y };
@@ -1,13 +0,0 @@
1
- import { s as DevframeCommandShortcutOverrides } from "./commands-CAcTUSlj.mjs";
2
- //#region src/types/settings.d.ts
3
- interface DevframeDocksUserSettings {
4
- docksHidden: string[];
5
- docksCategoriesHidden: string[];
6
- docksPinned: string[];
7
- docksCustomOrder: Record<string, number>;
8
- showIframeAddressBar: boolean;
9
- closeOnOutsideClick: boolean;
10
- commandShortcuts: DevframeCommandShortcutOverrides;
11
- }
12
- //#endregion
13
- export { DevframeDocksUserSettings as t };