From 1658f91238cb6c030622603b6e288fcbe013080a Mon Sep 17 00:00:00 2001 From: "Anthony Fu (via agent)" Date: Thu, 23 Jul 2026 02:35:12 +0000 Subject: [PATCH 01/10] feat(devtools): project each DevTools tab as its own Vite DevTools dock entry Replace the single Nuxt DevTools hub iframe with one iframe dock entry per tab, all members of the Nuxt dock group, each opening a chromeless deep link to that tab. --- packages/devtools/client/app.vue | 5 +- packages/devtools/client/composables/embed.ts | 35 ++++ .../devtools/client/pages/embed/[...path].vue | 28 +++ .../devtools/src/integrations/dock-tabs.ts | 181 ++++++++++++++++++ packages/devtools/src/module-main.ts | 21 +- .../src/runtime/plugins/view/client.ts | 34 ++-- 6 files changed, 281 insertions(+), 23 deletions(-) create mode 100644 packages/devtools/client/composables/embed.ts create mode 100644 packages/devtools/client/pages/embed/[...path].vue create mode 100644 packages/devtools/src/integrations/dock-tabs.ts diff --git a/packages/devtools/client/app.vue b/packages/devtools/client/app.vue index 867e4f9eef..8ede60b2ba 100644 --- a/packages/devtools/client/app.vue +++ b/packages/devtools/client/app.vue @@ -5,6 +5,7 @@ import { useRoute } from '#app/composables/router' import { useHead } from '#imports' import { getColorMode, showConnectionWarning, useClient, useInjectionClient } from '~/composables/client' import { useCopy } from '~/composables/editor' +import { isEmbedded } from '~/composables/embed' import { WS_DEBOUNCE_TIME } from '~/composables/rpc' import { registerCommands } from '~/composables/state-commands' import { splitScreenAvailable, splitScreenEnabled } from '~/composables/storage' @@ -43,7 +44,9 @@ setupClientRPC() const client = useClient() const route = useRoute() const colorMode = getColorMode() -const isUtilityView = computed(() => route.path.startsWith('/__') || route.path === '/') +// When embedded as a single dock tab, hide the app shell (SideNav + split pane) +// so the iframe shows only the tab content. +const isUtilityView = computed(() => isEmbedded.value || route.path.startsWith('/__') || route.path === '/') const waiting = computed(() => !client.value && !showConnectionWarning.value) const showDisconnectIndicator = ref(false) diff --git a/packages/devtools/client/composables/embed.ts b/packages/devtools/client/composables/embed.ts new file mode 100644 index 0000000000..9ea1bbc6cc --- /dev/null +++ b/packages/devtools/client/composables/embed.ts @@ -0,0 +1,35 @@ +import { ref } from 'vue' + +const STORAGE_KEY = 'nuxt-devtools-embedded' + +/** + * "Embedded" mode: the client app is loaded as a single, chromeless tab inside + * a Vite DevTools dock iframe (via the `/embed/*` route). In this mode the app + * shell — SideNav and split pane — is hidden so the iframe shows only the tab. + * + * The `/embed/*` entry route redirects to the real tab route right away, so the + * URL no longer carries the `/embed/` marker afterwards. We persist the flag in + * `sessionStorage` (isolated per iframe/browsing-context) so it survives that + * redirect and any in-iframe reloads. + */ +function detect(): boolean { + if (typeof window === 'undefined') + return false + try { + if (window.sessionStorage.getItem(STORAGE_KEY) === '1') + return true + } + catch {} + // First paint lands on `/embed/*` before the redirect runs. + return /\/embed(?:\/|$)/.test(window.location.pathname) +} + +export const isEmbedded = ref(detect()) + +export function markEmbedded(): void { + isEmbedded.value = true + try { + window.sessionStorage.setItem(STORAGE_KEY, '1') + } + catch {} +} diff --git a/packages/devtools/client/pages/embed/[...path].vue b/packages/devtools/client/pages/embed/[...path].vue new file mode 100644 index 0000000000..0c5c4b003f --- /dev/null +++ b/packages/devtools/client/pages/embed/[...path].vue @@ -0,0 +1,28 @@ + + + diff --git a/packages/devtools/src/integrations/dock-tabs.ts b/packages/devtools/src/integrations/dock-tabs.ts new file mode 100644 index 0000000000..3ac0425d6d --- /dev/null +++ b/packages/devtools/src/integrations/dock-tabs.ts @@ -0,0 +1,181 @@ +import type { ViteDevToolsNodeContext } from '@vitejs/devtools-kit' +import type { ModuleCustomTab, NuxtDevtoolsServerContext } from '../types' +import { NUXT_DEVTOOLS_GROUP_ID } from '@nuxt/devtools-kit' + +/** + * Static list of the built-in DevTools tabs. + * + * The canonical source of these tabs is each client page's `definePageMeta` + * under `client/pages/modules/*.vue`, which is only assembled at runtime in the + * browser (via Vue Router, see `client/composables/state-tabs.ts`). Registering + * one dock entry per tab happens on the Node side, which has no access to that + * router table — so we mirror the metadata here. + * + * This is an intentional, temporary bridge: once Devframe supports client-only + * dock definitions (register + postMessage), the client can push its own tab + * list and this hardcoded copy can be dropped. + */ +interface BuiltinTab { + /** Route name, matches the file under `client/pages/modules/.vue`. */ + name: string + title: string + icon: string + /** Lower renders earlier (matches `definePageMeta({ order })`); default 100. */ + order?: number +} + +const BUILTIN_TABS: BuiltinTab[] = [ + { name: 'overview', title: 'Overview', icon: 'carbon-information', order: -100 }, + { name: 'pages', title: 'Pages', icon: 'carbon-tree-view-alt', order: 1 }, + { name: 'components', title: 'Components', icon: 'i-carbon-assembly-cluster', order: 2 }, + { name: 'imports', title: 'Imports', icon: 'carbon-function', order: 4 }, + { name: 'modules', title: 'Modules', icon: 'carbon-3d-mpr-toggle', order: 5 }, + { name: 'runtime-configs', title: 'Runtime Configs', icon: 'carbon-settings-services', order: 6 }, + { name: 'payload', title: 'Payload', icon: 'carbon-data-set', order: 7 }, + { name: 'render-tree', title: 'Render Tree', icon: 'i-carbon-category', order: 1 }, + { name: 'pinia', title: 'Pinia', icon: 'i-logos-pinia' }, + { name: 'assets', title: 'Assets', icon: 'carbon-image-copy' }, + { name: 'server-routes', title: 'Server Routes', icon: 'carbon-cloud' }, + { name: 'server-tasks', title: 'Server Tasks', icon: 'codicon-run-all' }, + { name: 'storage', title: 'Storage', icon: 'carbon-data-base' }, + { name: 'open-graph', title: 'Open Graph', icon: 'carbon:image-search' }, + { name: 'timeline', title: 'Timeline', icon: 'i-carbon-roadmap' }, + { name: 'analyze-build', title: 'Build Analyze', icon: 'carbon-edge-node' }, + { name: 'plugins', title: 'Plugins', icon: 'carbon-plug' }, + { name: 'hooks', title: 'Hooks', icon: 'carbon-ibm-cloud-direct-link-2-connect' }, + { name: 'virtual-files', title: 'Virtual Files', icon: 'i-carbon-border-none' }, + { name: 'debug', title: 'Debug', icon: 'i-carbon-debug' }, + { name: 'error', title: 'Error', icon: 'i-carbon-warning-alt-filled' }, +] + +const FALLBACK_ICON = 'carbon:application' + +/** + * Normalise a tab icon into a form the dock can render. + * + * Tab metadata uses a mix of UnoCSS preset-icons style (`i-carbon-foo`, + * `carbon-foo`) and raw iconify names (`carbon:foo`), sometimes with trailing + * utility classes (`i-carbon-warning-alt-filled text-red`). Image URLs and + * absolute paths are passed through untouched. + */ +function normalizeIcon(icon: string | undefined): string { + if (!icon) + return FALLBACK_ICON + + // Drop any trailing utility classes, keep only the icon token. + let token = icon.trim().split(/\s+/)[0] ?? '' + if (!token) + return FALLBACK_ICON + + // Image URLs / absolute paths are used as-is. + if (/^(?:https?:)?\/\//.test(token) || token.startsWith('/') || token.startsWith('data:')) + return token + + if (token.startsWith('i-')) + token = token.slice(2) + + // Convert UnoCSS `collection-name` to iconify `collection:name`. + if (!token.includes(':')) + token = token.replace('-', ':') + + return token +} + +/** + * Projects every Nuxt DevTools tab (built-in + module custom tabs) as its own + * iframe dock entry inside the `Nuxt` dock group, each pointing at a chromeless + * deep link (`/embed/modules/`). + * + * Registration happens on the Node side (`ctx.docks.register` only exists there), + * so built-in tabs come from the static list above and custom tabs are collected + * via the `devtools:customTabs` hook and kept in sync on `devtools:customTabs:refresh`. + */ +export function setup(ctx: NuxtDevtoolsServerContext, routeClient: string): void { + const { nuxt, options } = ctx + + // register handle per dock id, so we can update/hide entries later + const handles = new Map) => void }>() + const customIds = new Set() + + let kit: ViteDevToolsNodeContext | undefined + + const entryId = (name: string) => `nuxt:devtools:${name}` + const embedUrl = (path: string) => `${routeClient}/embed${path}` + + function upsert(entry: Record & { id: string }) { + if (!kit) + return + const existing = handles.get(entry.id) + if (existing) { + // Re-show a previously hidden entry and refresh its metadata. Note: an + // already-open iframe won't re-navigate on url change (platform gap). + existing.update({ when: undefined, ...entry }) + } + else { + handles.set(entry.id, kit.docks.register(entry as any)) + } + } + + function registerBuiltinTabs() { + for (const tab of BUILTIN_TABS) { + upsert({ + id: entryId(tab.name), + type: 'iframe', + title: tab.title, + icon: normalizeIcon(tab.icon), + url: embedUrl(`/modules/${tab.name}`), + groupId: NUXT_DEVTOOLS_GROUP_ID, + // dock `defaultOrder`: higher renders earlier; tab `order`: lower first. + defaultOrder: -(tab.order ?? 100), + }) + } + } + + async function collectCustomTabs(): Promise { + const tabs: ModuleCustomTab[] = [] + if (options.customTabs?.length) + tabs.push(...options.customTabs) + await nuxt.callHook('devtools:customTabs', tabs) + return tabs + } + + async function syncCustomTabs() { + if (!kit) + return + + const tabs = await collectCustomTabs() + const seen = new Set() + + tabs.forEach((tab, index) => { + const id = entryId(`custom-${tab.name}`) + seen.add(id) + customIds.add(id) + upsert({ + id, + type: 'iframe', + title: tab.title, + icon: normalizeIcon(tab.icon), + url: embedUrl(`/modules/custom-${tab.name}`), + groupId: NUXT_DEVTOOLS_GROUP_ID, + // keep custom tabs after the built-in set + defaultOrder: -1000 - index, + }) + }) + + // The dock host has no `unregister`; hide tabs that disappeared instead. + for (const id of customIds) { + if (!seen.has(id)) + handles.get(id)?.update({ when: 'false' }) + } + } + + nuxt.hook('devtools:ready', async (kitCtx: ViteDevToolsNodeContext) => { + kit = kitCtx + registerBuiltinTabs() + await syncCustomTabs() + }) + + nuxt.hook('devtools:customTabs:refresh', () => { + syncCustomTabs() + }) +} diff --git a/packages/devtools/src/module-main.ts b/packages/devtools/src/module-main.ts index e256aa3129..48d288f74f 100644 --- a/packages/devtools/src/module-main.ts +++ b/packages/devtools/src/module-main.ts @@ -103,6 +103,11 @@ export async function enableModule(options: ModuleOptions, nuxt: Nuxt) { // setup callback too, and would otherwise create a second, inert // group + hub member. See `skipInSSR`. if (!skipInSSR(ctx)) { + // Register only the `Nuxt` group here. Its members — one iframe dock + // entry per DevTools tab — are registered on the `devtools:ready` hook + // by the `dock-tabs` integration below. The single hub iframe that + // used to host the whole client app has been replaced by these + // per-tab entries. ctx.docks.register({ id: NUXT_DEVTOOLS_GROUP_ID, type: 'group', @@ -110,17 +115,7 @@ export async function enableModule(options: ModuleOptions, nuxt: Nuxt) { icon: '/__nuxt_devtools__/client/nuxt.svg', category: 'framework', defaultOrder: -2000, - defaultChildId: 'nuxt:devtools', - }) - - ctx.docks.register({ - id: 'nuxt:devtools', - type: 'iframe', - icon: '/__nuxt_devtools__/client/nuxt.svg', - title: 'Nuxt DevTools', - url: '/__nuxt_devtools__/client/', - groupId: NUXT_DEVTOOLS_GROUP_ID, - defaultOrder: -300, + defaultChildId: 'nuxt:devtools:overview', }) } @@ -211,6 +206,10 @@ window.__NUXT_DEVTOOLS_TIME_METRIC__.appInit = Date.now() const ROUTE_CLIENT = `${ROUTE_PATH}/client` const ROUTE_ANALYZE = `${ROUTE_PATH}/analyze` + // Project every DevTools tab as its own iframe dock entry inside the `Nuxt` + // group (registered above). Members are wired up on the `devtools:ready` hook. + await import('./integrations/dock-tabs').then(({ setup }) => setup(ctx, ROUTE_CLIENT)) + // TODO: Use WS from nitro server when possible nuxt.hook('vite:serverCreated', (server) => { const devtoolsAnalyzeDir = join(nuxt.options.rootDir, 'node_modules/.cache/nuxt-devtools/analyze') diff --git a/packages/devtools/src/runtime/plugins/view/client.ts b/packages/devtools/src/runtime/plugins/view/client.ts index c662ceb1ba..940a519bdd 100644 --- a/packages/devtools/src/runtime/plugins/view/client.ts +++ b/packages/devtools/src/runtime/plugins/view/client.ts @@ -21,6 +21,12 @@ import { state } from './state' const MULTIPLE_SLASHES_RE = /\/+/g +// The `Nuxt` dock group id (see `NUXT_DEVTOOLS_GROUP_ID`). Activating the group +// auto-opens its `defaultChildId` (the Overview tab). Per-tab dock entries use +// the `nuxt:devtools:` id prefix. +const NUXT_DOCK_GROUP_ID = 'nuxt' +const NUXT_DOCK_ENTRY_PREFIX = 'nuxt:devtools:' + function getViteDevToolsContext() { return getDevToolsClientContext() as any } @@ -60,7 +66,7 @@ export async function setupDevToolsClient({ toggle() { const ctx = getViteDevToolsContext() if (ctx) - ctx.docks.toggleEntry('nuxt:devtools') + ctx.docks.toggleEntry(NUXT_DOCK_GROUP_ID) }, close() { const ctx = getViteDevToolsContext() @@ -71,14 +77,14 @@ export async function setupDevToolsClient({ const ctx = getViteDevToolsContext() if (ctx) { ctx.panel.store.value.open = true - ctx.docks.switchEntry('nuxt:devtools') + ctx.docks.switchEntry(NUXT_DOCK_GROUP_ID) } }, async navigate(path: string) { const ctx = getViteDevToolsContext() if (ctx) { ctx.panel.store.value.open = true - ctx.docks.switchEntry('nuxt:devtools') + ctx.docks.switchEntry(NUXT_DOCK_GROUP_ID) } await client.hooks.callHook('host:action:navigate', path) }, @@ -287,19 +293,25 @@ export async function setupDevToolsClient({ client.devtools.toggle() }) - // The Nuxt DevTools panel is rendered as an iframe **inside Vite DevTools' - // dock**, so we never create it ourselves (`getIframe()` above is legacy). - // The `@vue/devtools-kit` iframe messaging channel, however, only talks to - // whichever iframe was registered via `setIframeServerContext()` — without - // that the in-panel Vue DevTools applets (Pinia, component inspector, …) sit + // Each Nuxt DevTools tab is now its own iframe dock entry inside Vite DevTools' + // dock, so there is no single hub iframe we create ourselves (`getIframe()` + // above is legacy). The `@vue/devtools-kit` iframe messaging channel only + // talks to whichever iframe was registered via `setIframeServerContext()` — + // without that, the Vue DevTools applets (Pinia, component inspector, …) sit // on "Connecting..." forever because the host backend never learns which - // iframe to answer. Point it at the dock iframe as soon as Vite DevTools - // mounts it (and keep it pointed there if the element is recreated). + // iframe to answer. Bind it to whichever Nuxt tab iframe is currently + // selected, and rebind when the selection (or the element) changes. function bindVueDevToolsIframe() { let bound: HTMLIFrameElement | undefined const bind = () => { const ctx = getViteDevToolsContext() - const dockIframe = ctx?.docks?.getStateById?.('nuxt:devtools')?.domElements?.iframe as HTMLIFrameElement | null | undefined + const docks = ctx?.docks + if (!docks) + return + const selectedId: string | undefined = docks.selectedId ?? docks.selected?.id + if (!selectedId || !selectedId.startsWith(NUXT_DOCK_ENTRY_PREFIX)) + return + const dockIframe = docks.getStateById?.(selectedId)?.domElements?.iframe as HTMLIFrameElement | null | undefined if (!dockIframe || dockIframe === bound) return bound = dockIframe From b0a833697ae8b3985f416b8498afdb077c29f5e8 Mon Sep 17 00:00:00 2001 From: "Anthony Fu (via agent)" Date: Thu, 23 Jul 2026 04:30:56 +0000 Subject: [PATCH 02/10] feat(devtools): upgrade to @vitejs/devtools 0.4.4 and sub-categorize dock tabs Fix the per-tab dock 404 by riding the embed flag on each tab's existing route (`?embed=1`) instead of a dedicated `/embed/*` route that the built client doesn't contain. Upgrade @vitejs/devtools + @vitejs/devtools-kit to 0.4.4 and @devframes/hub + devframe to 0.7.10, and set each grouped entry's `category` so it becomes an in-group sub-category of the Nuxt group. Defers the postMessage shared-iframe soft-navigation (devframe#128). --- packages/devtools/client/composables/embed.ts | 30 ++- .../devtools/client/pages/embed/[...path].vue | 28 --- .../devtools/src/integrations/dock-tabs.ts | 63 +++-- pnpm-lock.yaml | 226 +++++++++--------- pnpm-workspace.yaml | 10 +- 5 files changed, 172 insertions(+), 185 deletions(-) delete mode 100644 packages/devtools/client/pages/embed/[...path].vue diff --git a/packages/devtools/client/composables/embed.ts b/packages/devtools/client/composables/embed.ts index 9ea1bbc6cc..ef07823832 100644 --- a/packages/devtools/client/composables/embed.ts +++ b/packages/devtools/client/composables/embed.ts @@ -4,13 +4,13 @@ const STORAGE_KEY = 'nuxt-devtools-embedded' /** * "Embedded" mode: the client app is loaded as a single, chromeless tab inside - * a Vite DevTools dock iframe (via the `/embed/*` route). In this mode the app - * shell — SideNav and split pane — is hidden so the iframe shows only the tab. + * a Vite DevTools dock iframe (each per-tab dock entry points at the tab's own + * route with an `?embed=1` flag). In this mode the app shell — SideNav and + * split pane — is hidden so the iframe shows only the tab. * - * The `/embed/*` entry route redirects to the real tab route right away, so the - * URL no longer carries the `/embed/` marker afterwards. We persist the flag in - * `sessionStorage` (isolated per iframe/browsing-context) so it survives that - * redirect and any in-iframe reloads. + * The flag rides on the existing tab route (no dedicated route needed). We latch + * it into `sessionStorage` — isolated per iframe/browsing-context — so it + * survives in-iframe navigation that drops the query and any reloads. */ function detect(): boolean { if (typeof window === 'undefined') @@ -20,16 +20,14 @@ function detect(): boolean { return true } catch {} - // First paint lands on `/embed/*` before the redirect runs. - return /\/embed(?:\/|$)/.test(window.location.pathname) + const embedded = new URLSearchParams(window.location.search).get('embed') === '1' + if (embedded) { + try { + window.sessionStorage.setItem(STORAGE_KEY, '1') + } + catch {} + } + return embedded } export const isEmbedded = ref(detect()) - -export function markEmbedded(): void { - isEmbedded.value = true - try { - window.sessionStorage.setItem(STORAGE_KEY, '1') - } - catch {} -} diff --git a/packages/devtools/client/pages/embed/[...path].vue b/packages/devtools/client/pages/embed/[...path].vue deleted file mode 100644 index 0c5c4b003f..0000000000 --- a/packages/devtools/client/pages/embed/[...path].vue +++ /dev/null @@ -1,28 +0,0 @@ - - - diff --git a/packages/devtools/src/integrations/dock-tabs.ts b/packages/devtools/src/integrations/dock-tabs.ts index 3ac0425d6d..e2b6c128e6 100644 --- a/packages/devtools/src/integrations/dock-tabs.ts +++ b/packages/devtools/src/integrations/dock-tabs.ts @@ -22,30 +22,36 @@ interface BuiltinTab { icon: string /** Lower renders earlier (matches `definePageMeta({ order })`); default 100. */ order?: number + /** + * DevTools tab category, mirrored from each page's `definePageMeta`. Because + * the entry belongs to the `Nuxt` group, this is reinterpreted by the dock as + * an in-group **sub-category** that sub-divides the group popover/sidebar. + */ + category?: string } const BUILTIN_TABS: BuiltinTab[] = [ - { name: 'overview', title: 'Overview', icon: 'carbon-information', order: -100 }, - { name: 'pages', title: 'Pages', icon: 'carbon-tree-view-alt', order: 1 }, - { name: 'components', title: 'Components', icon: 'i-carbon-assembly-cluster', order: 2 }, - { name: 'imports', title: 'Imports', icon: 'carbon-function', order: 4 }, - { name: 'modules', title: 'Modules', icon: 'carbon-3d-mpr-toggle', order: 5 }, - { name: 'runtime-configs', title: 'Runtime Configs', icon: 'carbon-settings-services', order: 6 }, - { name: 'payload', title: 'Payload', icon: 'carbon-data-set', order: 7 }, - { name: 'render-tree', title: 'Render Tree', icon: 'i-carbon-category', order: 1 }, - { name: 'pinia', title: 'Pinia', icon: 'i-logos-pinia' }, - { name: 'assets', title: 'Assets', icon: 'carbon-image-copy' }, - { name: 'server-routes', title: 'Server Routes', icon: 'carbon-cloud' }, - { name: 'server-tasks', title: 'Server Tasks', icon: 'codicon-run-all' }, - { name: 'storage', title: 'Storage', icon: 'carbon-data-base' }, - { name: 'open-graph', title: 'Open Graph', icon: 'carbon:image-search' }, - { name: 'timeline', title: 'Timeline', icon: 'i-carbon-roadmap' }, - { name: 'analyze-build', title: 'Build Analyze', icon: 'carbon-edge-node' }, - { name: 'plugins', title: 'Plugins', icon: 'carbon-plug' }, - { name: 'hooks', title: 'Hooks', icon: 'carbon-ibm-cloud-direct-link-2-connect' }, - { name: 'virtual-files', title: 'Virtual Files', icon: 'i-carbon-border-none' }, - { name: 'debug', title: 'Debug', icon: 'i-carbon-debug' }, - { name: 'error', title: 'Error', icon: 'i-carbon-warning-alt-filled' }, + { name: 'overview', title: 'Overview', icon: 'carbon-information', order: -100, category: 'app' }, + { name: 'pages', title: 'Pages', icon: 'carbon-tree-view-alt', order: 1, category: 'app' }, + { name: 'components', title: 'Components', icon: 'i-carbon-assembly-cluster', order: 2, category: 'app' }, + { name: 'imports', title: 'Imports', icon: 'carbon-function', order: 4, category: 'app' }, + { name: 'modules', title: 'Modules', icon: 'carbon-3d-mpr-toggle', order: 5, category: 'app' }, + { name: 'assets', title: 'Assets', icon: 'carbon-image-copy', category: 'app' }, + { name: 'error', title: 'Error', icon: 'i-carbon-warning-alt-filled', category: 'app' }, + { name: 'render-tree', title: 'Render Tree', icon: 'i-carbon-category', order: 1, category: 'vue-devtools' }, + { name: 'pinia', title: 'Pinia', icon: 'i-logos-pinia', category: 'vue-devtools' }, + { name: 'runtime-configs', title: 'Runtime Configs', icon: 'carbon-settings-services', order: 6, category: 'analyze' }, + { name: 'payload', title: 'Payload', icon: 'carbon-data-set', order: 7, category: 'analyze' }, + { name: 'open-graph', title: 'Open Graph', icon: 'carbon:image-search', category: 'analyze' }, + { name: 'timeline', title: 'Timeline', icon: 'i-carbon-roadmap', category: 'analyze' }, + { name: 'analyze-build', title: 'Build Analyze', icon: 'carbon-edge-node', category: 'analyze' }, + { name: 'plugins', title: 'Plugins', icon: 'carbon-plug', category: 'analyze' }, + { name: 'server-routes', title: 'Server Routes', icon: 'carbon-cloud', category: 'server' }, + { name: 'server-tasks', title: 'Server Tasks', icon: 'codicon-run-all', category: 'server' }, + { name: 'storage', title: 'Storage', icon: 'carbon-data-base', category: 'server' }, + { name: 'hooks', title: 'Hooks', icon: 'carbon-ibm-cloud-direct-link-2-connect', category: 'advanced' }, + { name: 'virtual-files', title: 'Virtual Files', icon: 'i-carbon-border-none', category: 'advanced' }, + { name: 'debug', title: 'Debug', icon: 'i-carbon-debug', category: 'advanced' }, ] const FALLBACK_ICON = 'carbon:application' @@ -84,11 +90,18 @@ function normalizeIcon(icon: string | undefined): string { /** * Projects every Nuxt DevTools tab (built-in + module custom tabs) as its own * iframe dock entry inside the `Nuxt` dock group, each pointing at a chromeless - * deep link (`/embed/modules/`). + * deep link (`/modules/?embed=1`). The `embed` flag tells the + * client app to hide its own shell (SideNav + split pane) so the iframe shows + * only the tab; it rides on the tab's existing route, so no extra client route + * is needed. * * Registration happens on the Node side (`ctx.docks.register` only exists there), * so built-in tabs come from the static list above and custom tabs are collected * via the `devtools:customTabs` hook and kept in sync on `devtools:customTabs:refresh`. + * + * Each entry sets `groupId: 'nuxt'`, so its `category` is reinterpreted by the + * dock as an in-group sub-category (`@vitejs/devtools` >= 0.4.4 / `@devframes/hub` + * >= 0.7.10) that sub-divides the `Nuxt` group. */ export function setup(ctx: NuxtDevtoolsServerContext, routeClient: string): void { const { nuxt, options } = ctx @@ -100,7 +113,7 @@ export function setup(ctx: NuxtDevtoolsServerContext, routeClient: string): void let kit: ViteDevToolsNodeContext | undefined const entryId = (name: string) => `nuxt:devtools:${name}` - const embedUrl = (path: string) => `${routeClient}/embed${path}` + const embedUrl = (path: string) => `${routeClient}${path}?embed=1` function upsert(entry: Record & { id: string }) { if (!kit) @@ -125,6 +138,8 @@ export function setup(ctx: NuxtDevtoolsServerContext, routeClient: string): void icon: normalizeIcon(tab.icon), url: embedUrl(`/modules/${tab.name}`), groupId: NUXT_DEVTOOLS_GROUP_ID, + // in-group sub-category (grouped entry: `category` is the sub-bucket) + category: tab.category ?? 'app', // dock `defaultOrder`: higher renders earlier; tab `order`: lower first. defaultOrder: -(tab.order ?? 100), }) @@ -157,6 +172,8 @@ export function setup(ctx: NuxtDevtoolsServerContext, routeClient: string): void icon: normalizeIcon(tab.icon), url: embedUrl(`/modules/custom-${tab.name}`), groupId: NUXT_DEVTOOLS_GROUP_ID, + // in-group sub-category; custom tabs default to `modules` + category: tab.category || 'modules', // keep custom tabs after the built-in set defaultOrder: -1000 - index, }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 32a2b80688..5b95676197 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -37,8 +37,8 @@ catalogs: specifier: ^66.7.5 version: 66.7.5 '@vitejs/devtools': - specifier: ^0.4.3 - version: 0.4.3 + specifier: ^0.4.4 + version: 0.4.4 '@vueuse/nuxt': specifier: ^14.3.0 version: 14.3.0 @@ -277,8 +277,8 @@ catalogs: version: 1.1.3 prod: '@devframes/plugin-data-inspector': - specifier: ^0.7.9 - version: 0.7.9 + specifier: ^0.7.10 + version: 0.7.10 '@nuxt/kit': specifier: ^4.4.8 version: 4.4.8 @@ -368,17 +368,17 @@ catalogs: specifier: ^3.1.8 version: 3.1.8 '@vitejs/devtools-kit': - specifier: ^0.4.3 - version: 0.4.3 + specifier: ^0.4.4 + version: 0.4.4 overrides: - '@devframes/hub': ^0.7.9 + '@devframes/hub': ^0.7.10 '@nuxt/devtools': workspace:* '@vue/compiler-core': 3.5.39 '@vue/compiler-dom': 3.5.39 '@vue/shared': 3.5.39 chokidar: ^5.0.0 - devframe: ^0.7.9 + devframe: ^0.7.10 esbuild: ^0.28.1 rollup: ^4.62.2 semver: ^7.8.5 @@ -433,7 +433,7 @@ importers: version: 66.7.5(eslint@10.7.0(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3) '@vitejs/devtools-kit': specifier: catalog:types - version: 0.4.3(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16) + version: 0.4.4(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16) bumpp: specifier: catalog:cli version: 11.1.0 @@ -508,7 +508,7 @@ importers: dependencies: '@devframes/plugin-data-inspector': specifier: catalog:prod - version: 0.7.9(devframe@0.7.9(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(vite@8.0.16) + version: 0.7.10(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(vite@8.0.16) '@nuxt/devtools-kit': specifier: workspace:* version: link:../devtools-kit @@ -517,10 +517,10 @@ importers: version: 4.4.8(magicast@0.5.3) '@vitejs/devtools': specifier: catalog:buildtools - version: 0.4.3(crossws@0.4.10(srvx@0.11.22))(srvx@0.11.22)(typescript@6.0.3)(valibot@1.4.2(typescript@6.0.3))(vite@8.0.16) + version: 0.4.4(crossws@0.4.10(srvx@0.11.22))(srvx@0.11.22)(typescript@6.0.3)(valibot@1.4.2(typescript@6.0.3))(vite@8.0.16) '@vitejs/devtools-kit': specifier: catalog:types - version: 0.4.3(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16) + version: 0.4.4(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16) '@vue/devtools-core': specifier: catalog:frontend version: 8.1.5(vue@3.5.39(typescript@6.0.3)) @@ -595,7 +595,7 @@ importers: version: 0.1.2 vite: specifier: ~8.0.14 - version: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + version: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) vite-plugin-inspect: specifier: catalog:prod version: 12.0.2(@nuxt/kit@4.4.8(magicast@0.5.3))(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16) @@ -665,7 +665,7 @@ importers: version: 8.1.5(@unocss/reset@66.7.5)(change-case@5.4.4)(floating-vue@5.2.2(@nuxt/kit@4.4.8(magicast@0.5.3))(vue@3.5.39(typescript@6.0.3)))(fuse.js@7.4.2)(unocss@66.7.5(@unocss/webpack@66.7.5(esbuild@0.28.1)(rolldown@1.1.5)(rollup@4.62.2)(vite@8.0.16)(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20)))(vite@8.0.16))(vue@3.5.39(typescript@6.0.3)) '@vueuse/nuxt': specifier: catalog:buildtools - version: 14.3.0(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@8.1.1))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(pinia@3.0.4(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rolldown@1.1.5)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.5)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20))(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3)) + version: 14.3.0(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@8.1.1))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(pinia@3.0.4(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rolldown@1.1.5)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.5)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20))(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3)) cronstrue: specifier: catalog:frontend version: 3.24.0 @@ -695,7 +695,7 @@ importers: version: 2.13.4(oxc-parser@0.133.0)(rolldown@1.1.5)(srvx@0.11.22)(vite@8.0.16)(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20)) nuxt: specifier: catalog:buildtools - version: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@8.1.1))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(pinia@3.0.4(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rolldown@1.1.5)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.5)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20))(yaml@2.9.0) + version: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@8.1.1))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(pinia@3.0.4(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rolldown@1.1.5)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.5)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20))(yaml@2.9.0) ofetch: specifier: catalog:frontend version: 1.5.1 @@ -731,7 +731,7 @@ importers: version: 66.7.5(@unocss/webpack@66.7.5(esbuild@0.28.1)(rolldown@1.1.5)(rollup@4.62.2)(vite@8.0.16)(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20)))(vite@8.0.16) unplugin-vue: specifier: catalog:buildtools - version: 7.2.0(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(rolldown@1.1.5)(rollup@4.62.2)(terser@5.49.0)(tsx@4.23.1)(vue@3.5.39(typescript@6.0.3))(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20))(yaml@2.9.0) + version: 7.2.0(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(rolldown@1.1.5)(rollup@4.62.2)(terser@5.49.0)(tsx@4.23.1)(vue@3.5.39(typescript@6.0.3))(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20))(yaml@2.9.0) unplugin-vue-markdown: specifier: catalog:buildtools version: 32.0.0(esbuild@0.28.1)(rolldown@1.1.5)(rollup@4.62.2)(vite@8.0.16)(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20)) @@ -764,7 +764,7 @@ importers: version: 1.2.4 vite: specifier: ~8.0.14 - version: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + version: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) devDependencies: '@nuxt/schema': specifier: catalog:types @@ -1263,25 +1263,25 @@ packages: '@cypress/xvfb@1.2.4': resolution: {integrity: sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==} - '@devframes/hub@0.7.9': - resolution: {integrity: sha512-+tARSZfwkzez6RKA8ShlntAmfKTn7Z+IM2xwDilNMze5YO+E4n/WmaJBYZL2VvXdDiWB0cJbbwHto+vsrEQB9g==} + '@devframes/hub@0.7.10': + resolution: {integrity: sha512-IMRWNYZxYzSXG8XsFLcdtsCNVZM11pNUxLhHsuiI8m3MciLliSNrVkpoHRblFbRj0phG6fRRuEQajGikJ3xmiA==} peerDependencies: - devframe: ^0.7.9 + devframe: ^0.7.10 '@devframes/json-render@0.7.9': resolution: {integrity: sha512-VgUBkxyCG60wTMvihZpGwX9RZwhmhNf+znh/R0Dlwz602E74HtCD2J8jdWqKje4aia4KmmHFLLwWC/itmkfJZg==} peerDependencies: - '@devframes/hub': ^0.7.9 - devframe: ^0.7.9 + '@devframes/hub': ^0.7.10 + devframe: ^0.7.10 peerDependenciesMeta: '@devframes/hub': optional: true - '@devframes/plugin-data-inspector@0.7.9': - resolution: {integrity: sha512-1IoxdNjMUqEWwDlJhoO9roa4zRd/c3+b4YcrM5VWnWiqZTJEor67+nt819dNCpi4rnEuKqjtPopsZF+uGxlnIg==} + '@devframes/plugin-data-inspector@0.7.10': + resolution: {integrity: sha512-gt2beVnrBB2R7k8mE3026l7ZNjCRnQygWkW+PBBVqa+xp8PCbTFWKj3z0/4YW9dkle0kdmMN/8PeNX4/jqWYNQ==} hasBin: true peerDependencies: - devframe: ^0.7.9 + devframe: ^0.7.10 vite: ~8.0.14 peerDependenciesMeta: vite: @@ -1291,7 +1291,7 @@ packages: resolution: {integrity: sha512-pDt/cjOvc8hF0Qj4WwBo+drnGD9yy1ck/CCFr2wno+d6AlM+00rxTgP1cCecAckVRNPxeVzSmQ7rFo8Ep/zPIw==} hasBin: true peerDependencies: - devframe: ^0.7.9 + devframe: ^0.7.10 vite: ~8.0.14 peerDependenciesMeta: vite: @@ -1301,8 +1301,8 @@ packages: resolution: {integrity: sha512-WcKRQEPw+VAjbubEZx7gHZdaKMkN4FwGkGBHCoAfe/4rbY2Sl2l/KEIW6+og0y8luoxHWxmnmrus1Jkc9mRZow==} hasBin: true peerDependencies: - '@devframes/hub': ^0.7.9 - devframe: ^0.7.9 + '@devframes/hub': ^0.7.10 + devframe: ^0.7.10 vite: ~8.0.14 peerDependenciesMeta: vite: @@ -1312,7 +1312,7 @@ packages: resolution: {integrity: sha512-rvDtNCzZyMRvtd89IV8UHImI0fHGqa88DzP87zHVAUoscL1WSHv9bE8zXW5yKj/tJMpJziVIeGJKTbto07tIrQ==} hasBin: true peerDependencies: - devframe: ^0.7.9 + devframe: ^0.7.10 vite: ~8.0.14 peerDependenciesMeta: vite: @@ -3624,19 +3624,19 @@ packages: engines: {node: '>=20'} hasBin: true - '@vitejs/devtools-kit@0.4.3': - resolution: {integrity: sha512-FjETJwshQQwa9DNeCYtjzfQhvye3e4XMAkDSVmdDicPj8dJM6lJapKTHvNU7SUoxgm8e5tc7OcFyQYaq1xDH3A==} + '@vitejs/devtools-kit@0.4.4': + resolution: {integrity: sha512-HwCjEzuCwCSkv3X4ZJCvQcO9qCaLm9uImYTw6TQ3z71jJTmqYn0UcJx8tqY23KgF/jPPbaYBSHYG3QSGZWqMNA==} peerDependencies: vite: ~8.0.14 - '@vitejs/devtools@0.4.3': - resolution: {integrity: sha512-+CEeUTVsRdCUMiy4YeOBOuuMPaYA9o0cA7O/gVIqBiT+WgkXEHHiMQH5MaqtaEMgoH0ii/8W1nQrtstorlELrQ==} + '@vitejs/devtools@0.4.4': + resolution: {integrity: sha512-mNNEMYBHNg3EzIIADgZlOhqqeaXN1EUguxsh14pxZz4BiEfdXTcNy9KTWuOSfa0GKgMbWP4H7uUFNq6cz5gbog==} hasBin: true peerDependencies: - '@vitejs/devtools-oxc': ^0.4.3 - '@vitejs/devtools-rolldown': ^0.4.3 - '@vitejs/devtools-vite': ^0.4.3 - '@vitejs/devtools-vitest': ^0.4.3 + '@vitejs/devtools-oxc': ^0.4.4 + '@vitejs/devtools-rolldown': ^0.4.4 + '@vitejs/devtools-vite': ^0.4.4 + '@vitejs/devtools-vitest': ^0.4.4 vite: ~8.0.14 peerDependenciesMeta: '@vitejs/devtools-oxc': @@ -4712,8 +4712,8 @@ packages: devalue@5.8.1: resolution: {integrity: sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw==} - devframe@0.7.9: - resolution: {integrity: sha512-ZWSHN5uk6KwCsrCXhu373kdBnk5kxkgxmGpD8tvv5DablgUOfWz+JrP4ufufTrns6PtQFP1Nh5S7sffWoLLp8w==} + devframe@0.7.10: + resolution: {integrity: sha512-+DyTB+s6Do7lp1SlbFsqlDZ6FACz4hTj1CHiCR6rtVnJt5NI0bshTtXHTzlvmFfCaELWPk/3826WqOcUuJqLmg==} peerDependencies: '@modelcontextprotocol/sdk': ^1.0.0 cac: ^7.0.0 @@ -8794,68 +8794,68 @@ snapshots: transitivePeerDependencies: - supports-color - '@devframes/hub@0.7.9(devframe@0.7.9(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))': + '@devframes/hub@0.7.10(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))': dependencies: birpc: 4.0.0 destr: 2.0.5 - devframe: 0.7.9(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) + devframe: 0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) nostics: 1.2.0 pathe: 2.0.3 perfect-debounce: 2.1.0 tinyexec: 1.2.4 zigpty: 0.2.1 - '@devframes/json-render@0.7.9(@devframes/hub@0.7.9(devframe@0.7.9(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)))(devframe@0.7.9(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))': + '@devframes/json-render@0.7.9(@devframes/hub@0.7.10(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)))(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))': dependencies: '@json-render/core': 0.19.0(zod@4.4.3) - devframe: 0.7.9(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) + devframe: 0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) nostics: 1.2.0 zod: 4.4.3 optionalDependencies: - '@devframes/hub': 0.7.9(devframe@0.7.9(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)) + '@devframes/hub': 0.7.10(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)) - '@devframes/plugin-data-inspector@0.7.9(devframe@0.7.9(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(vite@8.0.16)': + '@devframes/plugin-data-inspector@0.7.10(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(vite@8.0.16)': dependencies: cac: 7.0.0 - devframe: 0.7.9(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) + devframe: 0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) get-port-please: 3.2.0 jora: 1.0.0-beta.16 nostics: 1.2.0 optionalDependencies: - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) - '@devframes/plugin-inspect@0.7.9(devframe@0.7.9(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(valibot@1.4.2(typescript@6.0.3))(vite@8.0.16)': + '@devframes/plugin-inspect@0.7.9(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(valibot@1.4.2(typescript@6.0.3))(vite@8.0.16)': dependencies: '@valibot/to-json-schema': 1.7.1(valibot@1.4.2(typescript@6.0.3)) cac: 7.0.0 - devframe: 0.7.9(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) + devframe: 0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) nostics: 1.2.0 optionalDependencies: - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: - valibot - '@devframes/plugin-messages@0.7.9(@devframes/hub@0.7.9(devframe@0.7.9(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)))(devframe@0.7.9(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(vite@8.0.16)': + '@devframes/plugin-messages@0.7.9(@devframes/hub@0.7.10(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)))(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(vite@8.0.16)': dependencies: - '@devframes/hub': 0.7.9(devframe@0.7.9(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)) + '@devframes/hub': 0.7.10(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)) cac: 7.0.0 - devframe: 0.7.9(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) + devframe: 0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) nostics: 1.2.0 optionalDependencies: - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) - '@devframes/plugin-terminals@0.7.9(devframe@0.7.9(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(typescript@6.0.3)(vite@8.0.16)': + '@devframes/plugin-terminals@0.7.9(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(typescript@6.0.3)(vite@8.0.16)': dependencies: '@xterm/addon-fit': 0.11.0 '@xterm/xterm': 6.0.0 cac: 7.0.0 - devframe: 0.7.9(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) + devframe: 0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) nostics: 1.2.0 pathe: 2.0.3 valibot: 1.4.2(typescript@6.0.3) zigpty: 0.2.1 optionalDependencies: - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: - typescript @@ -9066,7 +9066,7 @@ snapshots: ansis: 4.3.1 cac: 7.0.0 chokidar: 5.0.0 - devframe: 0.7.9(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) + devframe: 0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) eslint: 10.7.0(jiti@2.7.0)(supports-color@8.1.1) jiti: 2.7.0 tinyglobby: 0.2.17 @@ -9390,7 +9390,7 @@ snapshots: dependencies: '@nuxt/kit': 3.21.8(magicast@0.5.3) execa: 8.0.1 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: - magicast @@ -9398,7 +9398,7 @@ snapshots: dependencies: '@nuxt/kit': 4.4.8(magicast@0.5.3) execa: 8.0.1 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: - magicast @@ -9656,7 +9656,7 @@ snapshots: - webpack - xml2js - '@nuxt/nitro-server@4.4.8(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(db0@0.3.4)(esbuild@0.28.1)(ioredis@5.11.1)(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@8.1.1))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(pinia@3.0.4(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rolldown@1.1.5)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.5)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20))(yaml@2.9.0))(oxc-parser@0.133.0)(rolldown@1.1.5)(rollup@4.62.2)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16)(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20))': + '@nuxt/nitro-server@4.4.8(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(db0@0.3.4)(esbuild@0.28.1)(ioredis@5.11.1)(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@8.1.1))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(pinia@3.0.4(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rolldown@1.1.5)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.5)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20))(yaml@2.9.0))(oxc-parser@0.133.0)(rolldown@1.1.5)(rollup@4.62.2)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16)(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20))': dependencies: '@nuxt/devalue': 2.0.2 '@nuxt/kit': 4.4.8(magicast@0.5.3) @@ -9674,7 +9674,7 @@ snapshots: klona: 2.0.6 mocked-exports: 0.1.1 nitropack: 2.13.4(oxc-parser@0.133.0)(rolldown@1.1.5)(srvx@0.11.22)(vite@8.0.16)(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20)) - nuxt: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@8.1.1))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(pinia@3.0.4(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rolldown@1.1.5)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.5)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20))(yaml@2.9.0) + nuxt: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@8.1.1))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(pinia@3.0.4(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rolldown@1.1.5)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.5)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20))(yaml@2.9.0) nypm: 0.6.8 ohash: 2.0.11 pathe: 2.0.3 @@ -10034,8 +10034,8 @@ snapshots: std-env: 4.2.0 ufo: 1.6.4 unenv: 2.0.0-rc.24 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) - vite-node: 5.3.0(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite-node: 5.3.0(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) vite-plugin-checker: 0.14.4(eslint@10.7.0(jiti@2.7.0)(supports-color@8.1.1))(optionator@0.9.4)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3)) vue: 3.5.39(typescript@6.0.3) vue-bundle-renderer: 2.3.1 @@ -10094,8 +10094,8 @@ snapshots: std-env: 4.2.0 ufo: 1.6.4 unenv: 2.0.0-rc.24 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) - vite-node: 5.3.0(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite-node: 5.3.0(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) vite-plugin-checker: 0.14.4(eslint@10.7.0(jiti@2.7.0))(optionator@0.9.4)(typescript@6.0.3)(vite@8.0.16(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(vue-tsc@3.3.7(typescript@6.0.3)) vue: 3.5.39(typescript@6.0.3) vue-bundle-renderer: 2.3.1 @@ -10127,7 +10127,7 @@ snapshots: - vue-tsc - yaml - '@nuxt/vite-builder@4.4.8(9dcd023bdff18c01940e8286173eced5)': + '@nuxt/vite-builder@4.4.8(cd1807b2eab32e20275d298e3335a2b9)': dependencies: '@nuxt/kit': 4.4.8(magicast@0.5.3) '@rollup/plugin-replace': 6.0.3(rollup@4.62.2) @@ -10145,7 +10145,7 @@ snapshots: magic-string: 0.30.21 mlly: 1.8.2 mocked-exports: 0.1.1 - nuxt: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@8.1.1))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(pinia@3.0.4(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rolldown@1.1.5)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.5)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20))(yaml@2.9.0) + nuxt: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@8.1.1))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(pinia@3.0.4(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rolldown@1.1.5)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.5)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20))(yaml@2.9.0) nypm: 0.6.8 pathe: 2.0.3 pkg-types: 2.3.1 @@ -10154,8 +10154,8 @@ snapshots: std-env: 4.2.0 ufo: 1.6.4 unenv: 2.0.0-rc.24 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) - vite-node: 5.3.0(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite-node: 5.3.0(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) vite-plugin-checker: 0.14.4(eslint@10.7.0(jiti@2.7.0)(supports-color@8.1.1))(optionator@0.9.4)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3)) vue: 3.5.39(typescript@6.0.3) vue-bundle-renderer: 2.3.1 @@ -10214,8 +10214,8 @@ snapshots: std-env: 4.2.0 ufo: 1.6.4 unenv: 2.0.0-rc.24 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) - vite-node: 5.3.0(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite-node: 5.3.0(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) vite-plugin-checker: 0.14.4(eslint@10.7.0(jiti@2.7.0)(supports-color@8.1.1))(optionator@0.9.4)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3)) vue: 3.5.39(typescript@6.0.3) vue-bundle-renderer: 2.3.1 @@ -11452,7 +11452,7 @@ snapshots: pathe: 2.0.3 tinyglobby: 0.2.17 unplugin-utils: 0.3.2 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) '@unocss/webpack@66.7.5(esbuild@0.28.1)(rolldown@1.1.5)(rollup@4.62.2)(vite@8.0.16(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(webpack@5.108.4(esbuild@0.28.1)(postcss@8.5.20))': dependencies: @@ -11593,39 +11593,39 @@ snapshots: - rollup - supports-color - '@vitejs/devtools-kit@0.4.3(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16)': + '@vitejs/devtools-kit@0.4.4(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16)': dependencies: - '@devframes/hub': 0.7.9(devframe@0.7.9(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)) - '@devframes/json-render': 0.7.9(@devframes/hub@0.7.9(devframe@0.7.9(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)))(devframe@0.7.9(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)) - devframe: 0.7.9(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) + '@devframes/hub': 0.7.10(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)) + '@devframes/json-render': 0.7.9(@devframes/hub@0.7.10(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)))(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)) + devframe: 0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) local-pkg: 1.2.1 mlly: 1.8.2 nostics: 1.2.0 nypm: 0.6.8 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: - '@modelcontextprotocol/sdk' - cac - srvx - typescript - '@vitejs/devtools@0.4.3(crossws@0.4.10(srvx@0.11.22))(srvx@0.11.22)(typescript@6.0.3)(valibot@1.4.2(typescript@6.0.3))(vite@8.0.16)': + '@vitejs/devtools@0.4.4(crossws@0.4.10(srvx@0.11.22))(srvx@0.11.22)(typescript@6.0.3)(valibot@1.4.2(typescript@6.0.3))(vite@8.0.16)': dependencies: - '@devframes/hub': 0.7.9(devframe@0.7.9(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)) - '@devframes/plugin-inspect': 0.7.9(devframe@0.7.9(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(valibot@1.4.2(typescript@6.0.3))(vite@8.0.16) - '@devframes/plugin-messages': 0.7.9(@devframes/hub@0.7.9(devframe@0.7.9(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)))(devframe@0.7.9(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(vite@8.0.16) - '@devframes/plugin-terminals': 0.7.9(devframe@0.7.9(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(typescript@6.0.3)(vite@8.0.16) - '@vitejs/devtools-kit': 0.4.3(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16) + '@devframes/hub': 0.7.10(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)) + '@devframes/plugin-inspect': 0.7.9(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(valibot@1.4.2(typescript@6.0.3))(vite@8.0.16) + '@devframes/plugin-messages': 0.7.9(@devframes/hub@0.7.10(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)))(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(vite@8.0.16) + '@devframes/plugin-terminals': 0.7.9(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(typescript@6.0.3)(vite@8.0.16) + '@vitejs/devtools-kit': 0.4.4(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16) birpc: 4.0.0 cac: 7.0.0 - devframe: 0.7.9(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) + devframe: 0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) h3: 2.0.1-rc.22(crossws@0.4.10(srvx@0.11.22)) local-pkg: 1.2.1 mlly: 1.8.2 nostics: 1.2.0 obug: 2.1.4 pathe: 2.0.3 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) vue: 3.5.39(typescript@6.0.3) transitivePeerDependencies: - '@modelcontextprotocol/sdk' @@ -11641,7 +11641,7 @@ snapshots: '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) '@rolldown/pluginutils': 1.0.1 '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.29.7) - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) vue: 3.5.39(typescript@6.0.3) transitivePeerDependencies: - supports-color @@ -11649,7 +11649,7 @@ snapshots: '@vitejs/plugin-vue@6.0.7(vite@8.0.16)(vue@3.5.39(typescript@6.0.3))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) vue: 3.5.39(typescript@6.0.3) '@vitest/eslint-plugin@1.6.23(@typescript-eslint/eslint-plugin@8.63.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3))(eslint@10.7.0(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3))(eslint@10.7.0(jiti@2.7.0)(supports-color@8.1.1))(typescript@6.0.3)(vitest@4.1.10)': @@ -11679,7 +11679,7 @@ snapshots: estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) '@vitest/pretty-format@4.1.10': dependencies: @@ -11966,13 +11966,13 @@ snapshots: '@vueuse/metadata@14.3.0': {} - '@vueuse/nuxt@14.3.0(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@8.1.1))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(pinia@3.0.4(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rolldown@1.1.5)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.5)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20))(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3))': + '@vueuse/nuxt@14.3.0(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@8.1.1))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(pinia@3.0.4(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rolldown@1.1.5)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.5)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20))(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3))': dependencies: '@nuxt/kit': 4.4.8(magicast@0.5.3) '@vueuse/core': 14.3.0(vue@3.5.39(typescript@6.0.3)) '@vueuse/metadata': 14.3.0 local-pkg: 1.2.1 - nuxt: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@8.1.1))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(pinia@3.0.4(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rolldown@1.1.5)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.5)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20))(yaml@2.9.0) + nuxt: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@8.1.1))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(pinia@3.0.4(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rolldown@1.1.5)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.5)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20))(yaml@2.9.0) vue: 3.5.39(typescript@6.0.3) transitivePeerDependencies: - magicast @@ -12776,7 +12776,7 @@ snapshots: devalue@5.8.1: {} - devframe@0.7.9(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3): + devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3): dependencies: '@valibot/to-json-schema': 1.7.1(valibot@1.4.2(typescript@6.0.3)) birpc: 4.0.0 @@ -15033,16 +15033,16 @@ snapshots: - vite - webpack - nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@8.1.1))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(pinia@3.0.4(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rolldown@1.1.5)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.5)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20))(yaml@2.9.0): + nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@8.1.1))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(pinia@3.0.4(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rolldown@1.1.5)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.5)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20))(yaml@2.9.0): dependencies: '@dxup/nuxt': 0.4.1(magicast@0.5.3)(typescript@6.0.3) '@nuxt/cli': 3.36.1(@nuxt/schema@4.4.8)(cac@7.0.0)(magicast@0.5.3) '@nuxt/devtools': link:packages/devtools '@nuxt/kit': 4.4.8(magicast@0.5.3) - '@nuxt/nitro-server': 4.4.8(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(db0@0.3.4)(esbuild@0.28.1)(ioredis@5.11.1)(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@8.1.1))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(pinia@3.0.4(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rolldown@1.1.5)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.5)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20))(yaml@2.9.0))(oxc-parser@0.133.0)(rolldown@1.1.5)(rollup@4.62.2)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16)(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20)) + '@nuxt/nitro-server': 4.4.8(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(db0@0.3.4)(esbuild@0.28.1)(ioredis@5.11.1)(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@8.1.1))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(pinia@3.0.4(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rolldown@1.1.5)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.5)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20))(yaml@2.9.0))(oxc-parser@0.133.0)(rolldown@1.1.5)(rollup@4.62.2)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16)(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20)) '@nuxt/schema': 4.4.8 '@nuxt/telemetry': 2.8.0(@nuxt/kit@4.4.8(magicast@0.5.3)) - '@nuxt/vite-builder': 4.4.8(9dcd023bdff18c01940e8286173eced5) + '@nuxt/vite-builder': 4.4.8(cd1807b2eab32e20275d298e3335a2b9) '@unhead/vue': 2.1.15(vue@3.5.39(typescript@6.0.3)) '@vue/shared': 3.5.39 chokidar: 5.0.0 @@ -17275,7 +17275,7 @@ snapshots: markdown-exit: 1.0.0-beta.9 unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.1.5)(rollup@4.62.2)(vite@8.0.16)(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20)) unplugin-utils: 0.3.2 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' @@ -17286,14 +17286,14 @@ snapshots: - unloader - webpack - unplugin-vue@7.2.0(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(rolldown@1.1.5)(rollup@4.62.2)(terser@5.49.0)(tsx@4.23.1)(vue@3.5.39(typescript@6.0.3))(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20))(yaml@2.9.0): + unplugin-vue@7.2.0(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(rolldown@1.1.5)(rollup@4.62.2)(terser@5.49.0)(tsx@4.23.1)(vue@3.5.39(typescript@6.0.3))(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20))(yaml@2.9.0): dependencies: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 '@vue/reactivity': 3.5.39 obug: 2.1.3 unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.1.5)(rollup@4.62.2)(vite@8.0.16)(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20)) - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) vue: 3.5.39(typescript@6.0.3) transitivePeerDependencies: - '@farmfe/core' @@ -17332,7 +17332,7 @@ snapshots: esbuild: 0.28.1 rolldown: 1.1.5 rollup: 4.62.2 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) webpack: 5.108.4(esbuild@0.28.1)(postcss@8.5.20) unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.1.5)(rollup@4.62.2)(vite@8.0.16)(webpack@5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20)): @@ -17344,7 +17344,7 @@ snapshots: esbuild: 0.28.1 rolldown: 1.1.5 rollup: 4.62.2 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) webpack: 5.108.4(esbuild@0.28.1)(lightningcss@1.32.0)(postcss@8.5.20) unrouting@0.1.7: @@ -17518,15 +17518,15 @@ snapshots: vite-hot-client@2.2.0(vite@8.0.16(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)): dependencies: - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) - vite-node@5.3.0(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0): + vite-node@5.3.0(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0): dependencies: cac: 6.7.14 es-module-lexer: 2.3.1 obug: 2.1.4 pathe: 2.0.3 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: - '@types/node' - '@vitejs/devtools' @@ -17550,7 +17550,7 @@ snapshots: picomatch: 4.0.5 proper-lockfile: 4.1.2 tiny-invariant: 1.3.3 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) optionalDependencies: eslint: 10.7.0(jiti@2.7.0)(supports-color@8.1.1) optionator: 0.9.4 @@ -17566,7 +17566,7 @@ snapshots: picomatch: 4.0.5 proper-lockfile: 4.1.2 tiny-invariant: 1.3.3 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) optionalDependencies: eslint: 10.7.0(jiti@2.7.0) optionator: 0.9.4 @@ -17575,7 +17575,7 @@ snapshots: vite-plugin-inspect@12.0.2(@nuxt/kit@4.4.8(magicast@0.5.3))(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16): dependencies: - '@vitejs/devtools-kit': 0.4.3(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16) + '@vitejs/devtools-kit': 0.4.4(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16) ansis: 4.3.1 error-stack-parser-es: 2.0.1 obug: 2.1.3 @@ -17584,7 +17584,7 @@ snapshots: perfect-debounce: 2.1.0 sirv: 3.0.2 unplugin-utils: 0.3.2 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) optionalDependencies: '@nuxt/kit': 4.4.8(magicast@0.5.3) transitivePeerDependencies: @@ -17600,10 +17600,10 @@ snapshots: magic-string: 0.30.21 pathe: 2.0.3 source-map-js: 1.2.1 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) vue: 3.5.39(typescript@6.0.3) - vite@8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0): + vite@8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.5 @@ -17612,7 +17612,7 @@ snapshots: tinyglobby: 0.2.17 optionalDependencies: '@types/node': 26.1.1 - '@vitejs/devtools': 0.4.3(crossws@0.4.10(srvx@0.11.22))(srvx@0.11.22)(typescript@6.0.3)(valibot@1.4.2(typescript@6.0.3))(vite@8.0.16) + '@vitejs/devtools': 0.4.4(crossws@0.4.10(srvx@0.11.22))(srvx@0.11.22)(typescript@6.0.3)(valibot@1.4.2(typescript@6.0.3))(vite@8.0.16) esbuild: 0.28.1 fsevents: 2.3.3 jiti: 2.7.0 @@ -17694,7 +17694,7 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 26.1.1 @@ -17757,7 +17757,7 @@ snapshots: optionalDependencies: '@vue/compiler-sfc': 3.5.39 pinia: 3.0.4(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)) - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' @@ -17791,7 +17791,7 @@ snapshots: optionalDependencies: '@vue/compiler-sfc': 3.5.39 pinia: 3.0.4(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)) - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 12d329acb2..04db1afe7d 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -42,13 +42,13 @@ overrides: # which silently drops the whole `overrides` config and desyncs the # lockfile, breaking `pnpm install --frozen-lockfile`. Keep these in sync # with the matching catalog entries below by hand. - '@devframes/hub': ^0.7.9 + '@devframes/hub': ^0.7.10 '@nuxt/devtools': workspace:* '@vue/compiler-core': 3.5.39 '@vue/compiler-dom': 3.5.39 '@vue/shared': 3.5.39 chokidar: ^5.0.0 - devframe: ^0.7.9 + devframe: ^0.7.10 esbuild: ^0.28.1 rollup: ^4.62.2 semver: ^7.8.5 @@ -76,7 +76,7 @@ catalogs: '@unocss/preset-icons': ^66.7.5 '@unocss/preset-mini': ^66.7.5 '@unocss/preset-uno': ^66.7.5 - '@vitejs/devtools': ^0.4.3 + '@vitejs/devtools': ^0.4.4 '@vueuse/nuxt': ^14.3.0 exsolve: ^1.1.0 lightningcss: ^1.32.0 @@ -163,7 +163,7 @@ catalogs: playground: '@exampledev/new.css': ^1.1.3 prod: - '@devframes/plugin-data-inspector': ^0.7.9 + '@devframes/plugin-data-inspector': ^0.7.10 '@nuxt/kit': ^4.4.8 '@vue/devtools-kit': ^8.1.5 consola: ^3.4.2 @@ -194,5 +194,5 @@ catalogs: '@types/which': ^3.0.4 '@types/ws': ^8.18.1 '@unhead/schema': ^3.1.8 - '@vitejs/devtools-kit': ^0.4.3 + '@vitejs/devtools-kit': ^0.4.4 unimport: ^6.3.0 From df7d312f629a36f1db6bb0216d4cd17ce04db478 Mon Sep 17 00:00:00 2001 From: "Anthony Fu (via agent)" Date: Thu, 23 Jul 2026 05:03:17 +0000 Subject: [PATCH 03/10] fix(devtools): load client root + soft-nav for embedded dock tabs The client is an ssr:false SPA served by a single sirv middleware; the old hub only ever hard-loaded the root `/`. Per-tab dock entries now also load the root (`?embed=1&to=`) and a global route middleware soft-navigates to the target tab, instead of hard-loading a deep client URL. This keeps the feature on the one serving path proven to work and sidesteps any deep-path SPA-fallback concerns. --- .../devtools/client/middleware/route.global.ts | 12 ++++++++++++ packages/devtools/src/integrations/dock-tabs.ts | 17 +++++++++++------ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/packages/devtools/client/middleware/route.global.ts b/packages/devtools/client/middleware/route.global.ts index 1789871914..3a8d2ee199 100644 --- a/packages/devtools/client/middleware/route.global.ts +++ b/packages/devtools/client/middleware/route.global.ts @@ -1,7 +1,19 @@ import { defineNuxtRouteMiddleware, navigateTo } from '#imports' +import { isEmbedded } from '~/composables/embed' import { isFirstVisit } from '~/composables/storage' export default defineNuxtRouteMiddleware((to) => { + // Embedded single-tab mode (loaded inside a Vite DevTools dock iframe): the + // iframe loads the client root with the target tab in `?to=`, and we + // soft-navigate to it here — no deep server route is ever hard-loaded. Skip + // the first-visit / overview redirects below so the embedded tab stays put. + if (isEmbedded.value || to.query.embed === '1') { + const target = to.query.to + if (typeof target === 'string' && target && to.path !== target) + return navigateTo({ path: target, query: { embed: '1' } }) + return + } + if (isFirstVisit.value) { if (to.path !== '/') return navigateTo('/') diff --git a/packages/devtools/src/integrations/dock-tabs.ts b/packages/devtools/src/integrations/dock-tabs.ts index e2b6c128e6..cf9b88bc00 100644 --- a/packages/devtools/src/integrations/dock-tabs.ts +++ b/packages/devtools/src/integrations/dock-tabs.ts @@ -89,11 +89,14 @@ function normalizeIcon(icon: string | undefined): string { /** * Projects every Nuxt DevTools tab (built-in + module custom tabs) as its own - * iframe dock entry inside the `Nuxt` dock group, each pointing at a chromeless - * deep link (`/modules/?embed=1`). The `embed` flag tells the - * client app to hide its own shell (SideNav + split pane) so the iframe shows - * only the tab; it rides on the tab's existing route, so no extra client route - * is needed. + * iframe dock entry inside the `Nuxt` dock group. + * + * Each entry loads the client **root** (`/?embed=1&to=`) — + * the only URL the client was ever served/hard-loaded at — and a global route + * middleware soft-navigates to the target tab. This deliberately avoids + * hard-loading deep client routes from the server (the client is an `ssr:false` + * SPA served by a single sirv middleware). The `embed` flag tells the client to + * hide its own shell (SideNav + split pane) so the iframe shows only the tab. * * Registration happens on the Node side (`ctx.docks.register` only exists there), * so built-in tabs come from the static list above and custom tabs are collected @@ -113,7 +116,9 @@ export function setup(ctx: NuxtDevtoolsServerContext, routeClient: string): void let kit: ViteDevToolsNodeContext | undefined const entryId = (name: string) => `nuxt:devtools:${name}` - const embedUrl = (path: string) => `${routeClient}${path}?embed=1` + // Load the client root and let the client soft-navigate to `to` — never a + // deep server URL. + const embedUrl = (path: string) => `${routeClient}/?embed=1&to=${encodeURIComponent(path)}` function upsert(entry: Record & { id: string }) { if (!kit) From 0d71a28e3705238bd7442b127dadacef75dd3352 Mon Sep 17 00:00:00 2001 From: "Anthony Fu (via agent)" Date: Thu, 23 Jul 2026 06:30:46 +0000 Subject: [PATCH 04/10] feat(devtools): mount embedded dock tabs via /embed/ sub-path Bring back the dedicated `/embed/` sub-path for per-tab dock iframes. The `/embed/[...path]` page resolves the target tab's own route component and mounts it directly (like SplitScreen), so the tab renders without the SideNav or split pane and takes the full iframe. app.vue drops the split-pane wrapper while embedded; the route middleware skips its first-visit/overview redirects for `/embed/*`. --- packages/devtools/client/app.vue | 11 +++-- packages/devtools/client/composables/embed.ts | 37 +++------------ .../client/middleware/route.global.ts | 14 ++---- .../devtools/client/pages/embed/[...path].vue | 47 +++++++++++++++++++ .../devtools/src/integrations/dock-tabs.ts | 16 ++----- 5 files changed, 70 insertions(+), 55 deletions(-) create mode 100644 packages/devtools/client/pages/embed/[...path].vue diff --git a/packages/devtools/client/app.vue b/packages/devtools/client/app.vue index 8ede60b2ba..b72057d028 100644 --- a/packages/devtools/client/app.vue +++ b/packages/devtools/client/app.vue @@ -5,7 +5,7 @@ import { useRoute } from '#app/composables/router' import { useHead } from '#imports' import { getColorMode, showConnectionWarning, useClient, useInjectionClient } from '~/composables/client' import { useCopy } from '~/composables/editor' -import { isEmbedded } from '~/composables/embed' +import { isEmbeddedPath } from '~/composables/embed' import { WS_DEBOUNCE_TIME } from '~/composables/rpc' import { registerCommands } from '~/composables/state-commands' import { splitScreenAvailable, splitScreenEnabled } from '~/composables/storage' @@ -44,8 +44,9 @@ setupClientRPC() const client = useClient() const route = useRoute() const colorMode = getColorMode() -// When embedded as a single dock tab, hide the app shell (SideNav + split pane) -// so the iframe shows only the tab content. +// When embedded as a single dock tab (`/embed/*`), hide the app shell (SideNav +// + split pane) so the iframe shows only the tab content. +const isEmbedded = computed(() => isEmbeddedPath(route.path)) const isUtilityView = computed(() => isEmbedded.value || route.path.startsWith('/__') || route.path === '/') const waiting = computed(() => !client.value && !showConnectionWarning.value) const showDisconnectIndicator = ref(false) @@ -156,7 +157,9 @@ registerCommands(() => [ > - + + + diff --git a/packages/devtools/client/composables/embed.ts b/packages/devtools/client/composables/embed.ts index ef07823832..b6d016f56f 100644 --- a/packages/devtools/client/composables/embed.ts +++ b/packages/devtools/client/composables/embed.ts @@ -1,33 +1,10 @@ -import { ref } from 'vue' - -const STORAGE_KEY = 'nuxt-devtools-embedded' - /** - * "Embedded" mode: the client app is loaded as a single, chromeless tab inside - * a Vite DevTools dock iframe (each per-tab dock entry points at the tab's own - * route with an `?embed=1` flag). In this mode the app shell — SideNav and - * split pane — is hidden so the iframe shows only the tab. - * - * The flag rides on the existing tab route (no dedicated route needed). We latch - * it into `sessionStorage` — isolated per iframe/browsing-context — so it - * survives in-iframe navigation that drops the query and any reloads. + * "Embedded" mode: a single tab loaded chromelessly inside a Vite DevTools dock + * iframe, via the `/embed/` sub-path. In this mode the app shell — + * SideNav and split pane — is hidden so the iframe shows only the tab content. */ -function detect(): boolean { - if (typeof window === 'undefined') - return false - try { - if (window.sessionStorage.getItem(STORAGE_KEY) === '1') - return true - } - catch {} - const embedded = new URLSearchParams(window.location.search).get('embed') === '1' - if (embedded) { - try { - window.sessionStorage.setItem(STORAGE_KEY, '1') - } - catch {} - } - return embedded -} +export const EMBED_PREFIX = '/embed' -export const isEmbedded = ref(detect()) +export function isEmbeddedPath(path: string): boolean { + return path === EMBED_PREFIX || path.startsWith(`${EMBED_PREFIX}/`) +} diff --git a/packages/devtools/client/middleware/route.global.ts b/packages/devtools/client/middleware/route.global.ts index 3a8d2ee199..485c94039f 100644 --- a/packages/devtools/client/middleware/route.global.ts +++ b/packages/devtools/client/middleware/route.global.ts @@ -1,18 +1,12 @@ import { defineNuxtRouteMiddleware, navigateTo } from '#imports' -import { isEmbedded } from '~/composables/embed' +import { isEmbeddedPath } from '~/composables/embed' import { isFirstVisit } from '~/composables/storage' export default defineNuxtRouteMiddleware((to) => { - // Embedded single-tab mode (loaded inside a Vite DevTools dock iframe): the - // iframe loads the client root with the target tab in `?to=`, and we - // soft-navigate to it here — no deep server route is ever hard-loaded. Skip - // the first-visit / overview redirects below so the embedded tab stays put. - if (isEmbedded.value || to.query.embed === '1') { - const target = to.query.to - if (typeof target === 'string' && target && to.path !== target) - return navigateTo({ path: target, query: { embed: '1' } }) + // Embedded single-tab views (`/embed/*`) render their own content + // chromelessly; skip the first-visit / overview redirects for them. + if (isEmbeddedPath(to.path)) return - } if (isFirstVisit.value) { if (to.path !== '/') diff --git a/packages/devtools/client/pages/embed/[...path].vue b/packages/devtools/client/pages/embed/[...path].vue new file mode 100644 index 0000000000..f21a1dbe55 --- /dev/null +++ b/packages/devtools/client/pages/embed/[...path].vue @@ -0,0 +1,47 @@ + + + diff --git a/packages/devtools/src/integrations/dock-tabs.ts b/packages/devtools/src/integrations/dock-tabs.ts index cf9b88bc00..184495ca90 100644 --- a/packages/devtools/src/integrations/dock-tabs.ts +++ b/packages/devtools/src/integrations/dock-tabs.ts @@ -89,14 +89,10 @@ function normalizeIcon(icon: string | undefined): string { /** * Projects every Nuxt DevTools tab (built-in + module custom tabs) as its own - * iframe dock entry inside the `Nuxt` dock group. - * - * Each entry loads the client **root** (`/?embed=1&to=`) — - * the only URL the client was ever served/hard-loaded at — and a global route - * middleware soft-navigates to the target tab. This deliberately avoids - * hard-loading deep client routes from the server (the client is an `ssr:false` - * SPA served by a single sirv middleware). The `embed` flag tells the client to - * hide its own shell (SideNav + split pane) so the iframe shows only the tab. + * iframe dock entry inside the `Nuxt` dock group, each pointing at a chromeless + * deep link under the client's `/embed/` sub-path (`/embed/modules/`). + * The `/embed/*` route mounts just that tab's content — no SideNav, no split + * pane — so the tab takes the full iframe. * * Registration happens on the Node side (`ctx.docks.register` only exists there), * so built-in tabs come from the static list above and custom tabs are collected @@ -116,9 +112,7 @@ export function setup(ctx: NuxtDevtoolsServerContext, routeClient: string): void let kit: ViteDevToolsNodeContext | undefined const entryId = (name: string) => `nuxt:devtools:${name}` - // Load the client root and let the client soft-navigate to `to` — never a - // deep server URL. - const embedUrl = (path: string) => `${routeClient}/?embed=1&to=${encodeURIComponent(path)}` + const embedUrl = (path: string) => `${routeClient}/embed${path}` function upsert(entry: Record & { id: string }) { if (!kit) From cfb5c3e22d05925d27382d0f1254774194ace80e Mon Sep 17 00:00:00 2001 From: "Anthony Fu (via agent)" Date: Thu, 23 Jul 2026 08:15:14 +0000 Subject: [PATCH 05/10] feat(devtools): adopt shared-iframe soft navigation for dock tabs Replace the per-tab `/embed/` iframes (which deep-loaded client routes and 404'd) with the shared-iframe soft-navigation model from devframe#128 / vitejs/devtools#464. Register a single `subTabs` anchor iframe under the Nuxt group that loads the client root once; a client-side `devframe:frame-nav` postMessage shim announces one member dock per tab (from useAllTabs, carrying its category as an in-group sub-category) and soft-navigates within that one iframe. No deep-path loads, no Node-side tab list. Upgrades @vitejs/devtools + @vitejs/devtools-kit to ^0.4.5 and the devframe family to ^0.7.11. --- packages/devtools/client/app.vue | 14 +- packages/devtools/client/composables/embed.ts | 36 +- .../devtools/client/composables/frame-nav.ts | 99 ++++++ .../client/middleware/route.global.ts | 11 +- .../devtools/client/pages/embed/[...path].vue | 47 --- .../devtools/src/integrations/dock-tabs.ts | 197 ----------- packages/devtools/src/module-main.ts | 32 +- .../src/runtime/plugins/view/client.ts | 32 +- pnpm-lock.yaml | 314 +++++++++--------- pnpm-workspace.yaml | 12 +- 10 files changed, 344 insertions(+), 450 deletions(-) create mode 100644 packages/devtools/client/composables/frame-nav.ts delete mode 100644 packages/devtools/client/pages/embed/[...path].vue delete mode 100644 packages/devtools/src/integrations/dock-tabs.ts diff --git a/packages/devtools/client/app.vue b/packages/devtools/client/app.vue index b72057d028..68de005c65 100644 --- a/packages/devtools/client/app.vue +++ b/packages/devtools/client/app.vue @@ -5,7 +5,8 @@ import { useRoute } from '#app/composables/router' import { useHead } from '#imports' import { getColorMode, showConnectionWarning, useClient, useInjectionClient } from '~/composables/client' import { useCopy } from '~/composables/editor' -import { isEmbeddedPath } from '~/composables/embed' +import { isEmbedded } from '~/composables/embed' +import { setupFrameNav } from '~/composables/frame-nav' import { WS_DEBOUNCE_TIME } from '~/composables/rpc' import { registerCommands } from '~/composables/state-commands' import { splitScreenAvailable, splitScreenEnabled } from '~/composables/storage' @@ -44,9 +45,9 @@ setupClientRPC() const client = useClient() const route = useRoute() const colorMode = getColorMode() -// When embedded as a single dock tab (`/embed/*`), hide the app shell (SideNav -// + split pane) so the iframe shows only the tab content. -const isEmbedded = computed(() => isEmbeddedPath(route.path)) +// When embedded as the shared-frame anchor (`?embed=1`), hide the app shell +// (SideNav + split pane) so the iframe shows only the current tab; the dock's +// per-tab members drive navigation via the frame-nav shim. const isUtilityView = computed(() => isEmbedded.value || route.path.startsWith('/__') || route.path === '/') const waiting = computed(() => !client.value && !showConnectionWarning.value) const showDisconnectIndicator = ref(false) @@ -91,6 +92,11 @@ const { scale, sidebarExpanded } = useDevToolsOptions('ui') const dataSchema = useSchemaInput() onMounted(async () => { + // As the shared-frame anchor, announce our tabs to the dock and answer + // soft-navigation over postMessage. + if (isEmbedded.value) + setupFrameNav() + const injectClient = useInjectionClient() watchEffect(() => { window.__NUXT_DEVTOOLS__ = injectClient.value diff --git a/packages/devtools/client/composables/embed.ts b/packages/devtools/client/composables/embed.ts index b6d016f56f..f307e9d46d 100644 --- a/packages/devtools/client/composables/embed.ts +++ b/packages/devtools/client/composables/embed.ts @@ -1,10 +1,32 @@ +import { ref } from 'vue' + +const STORAGE_KEY = 'nuxt-devtools-embedded' + /** - * "Embedded" mode: a single tab loaded chromelessly inside a Vite DevTools dock - * iframe, via the `/embed/` sub-path. In this mode the app shell — - * SideNav and split pane — is hidden so the iframe shows only the tab content. + * "Embedded" mode: the client is loaded as the shared-frame **anchor** inside a + * Vite DevTools dock iframe (`?embed=1`). In this mode the app shell — SideNav + * and split pane — is hidden so the iframe shows only the current tab, and the + * `devframe:frame-nav` shim drives tab navigation from the dock instead. + * + * The flag is latched into `sessionStorage` (isolated per iframe) so it + * survives soft navigation that drops the query and any reloads. */ -export const EMBED_PREFIX = '/embed' - -export function isEmbeddedPath(path: string): boolean { - return path === EMBED_PREFIX || path.startsWith(`${EMBED_PREFIX}/`) +function detect(): boolean { + if (typeof window === 'undefined') + return false + try { + if (window.sessionStorage.getItem(STORAGE_KEY) === '1') + return true + } + catch {} + const embedded = new URLSearchParams(window.location.search).get('embed') === '1' + if (embedded) { + try { + window.sessionStorage.setItem(STORAGE_KEY, '1') + } + catch {} + } + return embedded } + +export const isEmbedded = ref(detect()) diff --git a/packages/devtools/client/composables/frame-nav.ts b/packages/devtools/client/composables/frame-nav.ts new file mode 100644 index 0000000000..d2e895904c --- /dev/null +++ b/packages/devtools/client/composables/frame-nav.ts @@ -0,0 +1,99 @@ +import type { ModuleBuiltinTab, ModuleCustomTab } from '~/../src/types' +import { watch } from 'vue' +import { useRouter } from '#app/composables/router' +import { useAllTabs } from '~/composables/state-tabs' + +// `devframe:frame-nav` — the embedded-app half of the shared-iframe soft-nav +// protocol (devframe#128 / vitejs/devtools#464). The Vite DevTools dock owns +// one kept-alive iframe (the anchor); this shim announces one member dock per +// DevTools tab and switches views by client-side navigation, so no per-tab +// iframe/reload is needed. The shim is transport-only: it takes no hub/RPC +// dependency, just `postMessage`. +const CHANNEL = 'devframe:frame-nav' +const VERSION = 1 +// Must match the anchor's `frameId` registered in `module-main.ts`. +const FRAME_ID = 'nuxt:devtools' + +const ICON_CLASS_RE = /\s.*$/ +const FIRST_DASH_RE = /-/ + +/** Normalise a tab icon (UnoCSS `i-carbon-foo` / `carbon-foo`) to iconify `carbon:foo`. */ +function normalizeIcon(icon: string | undefined): string | undefined { + if (!icon) + return undefined + let token = icon.replace(ICON_CLASS_RE, '') + if (/^(?:https?:)?\/\//.test(token) || token.startsWith('/') || token.startsWith('data:')) + return token + if (token.startsWith('i-')) + token = token.slice(2) + if (!token.includes(':')) + token = token.replace(FIRST_DASH_RE, ':') + return token +} + +function tabPath(tab: ModuleBuiltinTab | ModuleCustomTab): string { + return 'path' in tab && tab.path ? tab.path : `/modules/custom-${tab.name}` +} + +/** + * Start the frame-nav shim. No-op unless running inside an iframe. Announces the + * tab manifest, answers `navigate` with client-side navigation, and reports + * `navigated` so the dock highlight follows in-app navigation. + */ +export function setupFrameNav(): void { + if (typeof window === 'undefined' || window.parent === window) + return + + const router = useRouter() + const tabs = useAllTabs() + + function buildManifest() { + return tabs.value.map(tab => ({ + id: tab.name, + title: tab.title ?? tab.name, + icon: normalizeIcon(tab.icon), + category: tab.category, + navTarget: { path: tabPath(tab) }, + })) + } + + function currentTabId(): string | undefined { + const path = router.currentRoute.value.path + return tabs.value.find(tab => tabPath(tab) === path)?.name + } + + function post(message: Record) { + window.parent.postMessage({ channel: CHANNEL, v: VERSION, frameId: FRAME_ID, from: 'frame', ...message }, '*') + } + + function announce(type: 'ready' | 'manifest') { + post({ type, tabs: buildManifest(), current: currentTabId() }) + } + + window.addEventListener('message', (ev: MessageEvent) => { + const data = ev.data + if (!data || data.channel !== CHANNEL || data.v !== VERSION || data.frameId !== FRAME_ID || data.from !== 'host') + return + if (data.type === 'hello') { + announce('ready') + } + else if (data.type === 'navigate') { + const path = data.navTarget?.path + if (typeof path === 'string') + router.push(path).then(() => post({ type: 'navigated', tabId: data.tabId })) + } + }) + + // Announce proactively in case the host attached before this shim loaded. + announce('ready') + + // Re-announce when the tab set changes. + watch(() => tabs.value.map(t => t.name).join(','), () => announce('manifest')) + + // Report in-app navigation so the dock highlight follows. + watch(() => router.currentRoute.value.path, () => { + const id = currentTabId() + if (id) + post({ type: 'navigated', tabId: id }) + }) +} diff --git a/packages/devtools/client/middleware/route.global.ts b/packages/devtools/client/middleware/route.global.ts index 485c94039f..a57a187a1e 100644 --- a/packages/devtools/client/middleware/route.global.ts +++ b/packages/devtools/client/middleware/route.global.ts @@ -1,12 +1,15 @@ import { defineNuxtRouteMiddleware, navigateTo } from '#imports' -import { isEmbeddedPath } from '~/composables/embed' +import { isEmbedded } from '~/composables/embed' import { isFirstVisit } from '~/composables/storage' export default defineNuxtRouteMiddleware((to) => { - // Embedded single-tab views (`/embed/*`) render their own content - // chromelessly; skip the first-visit / overview redirects for them. - if (isEmbeddedPath(to.path)) + // Embedded anchor: skip the first-visit welcome; land on a real tab so the + // frame-nav shim has something to report as the current view. + if (isEmbedded.value) { + if (to.path === '/') + return navigateTo('/modules/overview') return + } if (isFirstVisit.value) { if (to.path !== '/') diff --git a/packages/devtools/client/pages/embed/[...path].vue b/packages/devtools/client/pages/embed/[...path].vue deleted file mode 100644 index f21a1dbe55..0000000000 --- a/packages/devtools/client/pages/embed/[...path].vue +++ /dev/null @@ -1,47 +0,0 @@ - - - diff --git a/packages/devtools/src/integrations/dock-tabs.ts b/packages/devtools/src/integrations/dock-tabs.ts deleted file mode 100644 index 184495ca90..0000000000 --- a/packages/devtools/src/integrations/dock-tabs.ts +++ /dev/null @@ -1,197 +0,0 @@ -import type { ViteDevToolsNodeContext } from '@vitejs/devtools-kit' -import type { ModuleCustomTab, NuxtDevtoolsServerContext } from '../types' -import { NUXT_DEVTOOLS_GROUP_ID } from '@nuxt/devtools-kit' - -/** - * Static list of the built-in DevTools tabs. - * - * The canonical source of these tabs is each client page's `definePageMeta` - * under `client/pages/modules/*.vue`, which is only assembled at runtime in the - * browser (via Vue Router, see `client/composables/state-tabs.ts`). Registering - * one dock entry per tab happens on the Node side, which has no access to that - * router table — so we mirror the metadata here. - * - * This is an intentional, temporary bridge: once Devframe supports client-only - * dock definitions (register + postMessage), the client can push its own tab - * list and this hardcoded copy can be dropped. - */ -interface BuiltinTab { - /** Route name, matches the file under `client/pages/modules/.vue`. */ - name: string - title: string - icon: string - /** Lower renders earlier (matches `definePageMeta({ order })`); default 100. */ - order?: number - /** - * DevTools tab category, mirrored from each page's `definePageMeta`. Because - * the entry belongs to the `Nuxt` group, this is reinterpreted by the dock as - * an in-group **sub-category** that sub-divides the group popover/sidebar. - */ - category?: string -} - -const BUILTIN_TABS: BuiltinTab[] = [ - { name: 'overview', title: 'Overview', icon: 'carbon-information', order: -100, category: 'app' }, - { name: 'pages', title: 'Pages', icon: 'carbon-tree-view-alt', order: 1, category: 'app' }, - { name: 'components', title: 'Components', icon: 'i-carbon-assembly-cluster', order: 2, category: 'app' }, - { name: 'imports', title: 'Imports', icon: 'carbon-function', order: 4, category: 'app' }, - { name: 'modules', title: 'Modules', icon: 'carbon-3d-mpr-toggle', order: 5, category: 'app' }, - { name: 'assets', title: 'Assets', icon: 'carbon-image-copy', category: 'app' }, - { name: 'error', title: 'Error', icon: 'i-carbon-warning-alt-filled', category: 'app' }, - { name: 'render-tree', title: 'Render Tree', icon: 'i-carbon-category', order: 1, category: 'vue-devtools' }, - { name: 'pinia', title: 'Pinia', icon: 'i-logos-pinia', category: 'vue-devtools' }, - { name: 'runtime-configs', title: 'Runtime Configs', icon: 'carbon-settings-services', order: 6, category: 'analyze' }, - { name: 'payload', title: 'Payload', icon: 'carbon-data-set', order: 7, category: 'analyze' }, - { name: 'open-graph', title: 'Open Graph', icon: 'carbon:image-search', category: 'analyze' }, - { name: 'timeline', title: 'Timeline', icon: 'i-carbon-roadmap', category: 'analyze' }, - { name: 'analyze-build', title: 'Build Analyze', icon: 'carbon-edge-node', category: 'analyze' }, - { name: 'plugins', title: 'Plugins', icon: 'carbon-plug', category: 'analyze' }, - { name: 'server-routes', title: 'Server Routes', icon: 'carbon-cloud', category: 'server' }, - { name: 'server-tasks', title: 'Server Tasks', icon: 'codicon-run-all', category: 'server' }, - { name: 'storage', title: 'Storage', icon: 'carbon-data-base', category: 'server' }, - { name: 'hooks', title: 'Hooks', icon: 'carbon-ibm-cloud-direct-link-2-connect', category: 'advanced' }, - { name: 'virtual-files', title: 'Virtual Files', icon: 'i-carbon-border-none', category: 'advanced' }, - { name: 'debug', title: 'Debug', icon: 'i-carbon-debug', category: 'advanced' }, -] - -const FALLBACK_ICON = 'carbon:application' - -/** - * Normalise a tab icon into a form the dock can render. - * - * Tab metadata uses a mix of UnoCSS preset-icons style (`i-carbon-foo`, - * `carbon-foo`) and raw iconify names (`carbon:foo`), sometimes with trailing - * utility classes (`i-carbon-warning-alt-filled text-red`). Image URLs and - * absolute paths are passed through untouched. - */ -function normalizeIcon(icon: string | undefined): string { - if (!icon) - return FALLBACK_ICON - - // Drop any trailing utility classes, keep only the icon token. - let token = icon.trim().split(/\s+/)[0] ?? '' - if (!token) - return FALLBACK_ICON - - // Image URLs / absolute paths are used as-is. - if (/^(?:https?:)?\/\//.test(token) || token.startsWith('/') || token.startsWith('data:')) - return token - - if (token.startsWith('i-')) - token = token.slice(2) - - // Convert UnoCSS `collection-name` to iconify `collection:name`. - if (!token.includes(':')) - token = token.replace('-', ':') - - return token -} - -/** - * Projects every Nuxt DevTools tab (built-in + module custom tabs) as its own - * iframe dock entry inside the `Nuxt` dock group, each pointing at a chromeless - * deep link under the client's `/embed/` sub-path (`/embed/modules/`). - * The `/embed/*` route mounts just that tab's content — no SideNav, no split - * pane — so the tab takes the full iframe. - * - * Registration happens on the Node side (`ctx.docks.register` only exists there), - * so built-in tabs come from the static list above and custom tabs are collected - * via the `devtools:customTabs` hook and kept in sync on `devtools:customTabs:refresh`. - * - * Each entry sets `groupId: 'nuxt'`, so its `category` is reinterpreted by the - * dock as an in-group sub-category (`@vitejs/devtools` >= 0.4.4 / `@devframes/hub` - * >= 0.7.10) that sub-divides the `Nuxt` group. - */ -export function setup(ctx: NuxtDevtoolsServerContext, routeClient: string): void { - const { nuxt, options } = ctx - - // register handle per dock id, so we can update/hide entries later - const handles = new Map) => void }>() - const customIds = new Set() - - let kit: ViteDevToolsNodeContext | undefined - - const entryId = (name: string) => `nuxt:devtools:${name}` - const embedUrl = (path: string) => `${routeClient}/embed${path}` - - function upsert(entry: Record & { id: string }) { - if (!kit) - return - const existing = handles.get(entry.id) - if (existing) { - // Re-show a previously hidden entry and refresh its metadata. Note: an - // already-open iframe won't re-navigate on url change (platform gap). - existing.update({ when: undefined, ...entry }) - } - else { - handles.set(entry.id, kit.docks.register(entry as any)) - } - } - - function registerBuiltinTabs() { - for (const tab of BUILTIN_TABS) { - upsert({ - id: entryId(tab.name), - type: 'iframe', - title: tab.title, - icon: normalizeIcon(tab.icon), - url: embedUrl(`/modules/${tab.name}`), - groupId: NUXT_DEVTOOLS_GROUP_ID, - // in-group sub-category (grouped entry: `category` is the sub-bucket) - category: tab.category ?? 'app', - // dock `defaultOrder`: higher renders earlier; tab `order`: lower first. - defaultOrder: -(tab.order ?? 100), - }) - } - } - - async function collectCustomTabs(): Promise { - const tabs: ModuleCustomTab[] = [] - if (options.customTabs?.length) - tabs.push(...options.customTabs) - await nuxt.callHook('devtools:customTabs', tabs) - return tabs - } - - async function syncCustomTabs() { - if (!kit) - return - - const tabs = await collectCustomTabs() - const seen = new Set() - - tabs.forEach((tab, index) => { - const id = entryId(`custom-${tab.name}`) - seen.add(id) - customIds.add(id) - upsert({ - id, - type: 'iframe', - title: tab.title, - icon: normalizeIcon(tab.icon), - url: embedUrl(`/modules/custom-${tab.name}`), - groupId: NUXT_DEVTOOLS_GROUP_ID, - // in-group sub-category; custom tabs default to `modules` - category: tab.category || 'modules', - // keep custom tabs after the built-in set - defaultOrder: -1000 - index, - }) - }) - - // The dock host has no `unregister`; hide tabs that disappeared instead. - for (const id of customIds) { - if (!seen.has(id)) - handles.get(id)?.update({ when: 'false' }) - } - } - - nuxt.hook('devtools:ready', async (kitCtx: ViteDevToolsNodeContext) => { - kit = kitCtx - registerBuiltinTabs() - await syncCustomTabs() - }) - - nuxt.hook('devtools:customTabs:refresh', () => { - syncCustomTabs() - }) -} diff --git a/packages/devtools/src/module-main.ts b/packages/devtools/src/module-main.ts index 3cac36ff6a..2159804642 100644 --- a/packages/devtools/src/module-main.ts +++ b/packages/devtools/src/module-main.ts @@ -103,11 +103,13 @@ export async function enableModule(options: ModuleOptions, nuxt: Nuxt) { // setup callback too, and would otherwise create a second, inert // group + hub member. See `skipInSSR`. if (!skipInSSR(ctx)) { - // Register only the `Nuxt` group here. Its members — one iframe dock - // entry per DevTools tab — are registered on the `devtools:ready` hook - // by the `dock-tabs` integration below. The single hub iframe that - // used to host the whole client app has been replaced by these - // per-tab entries. + // Register the `Nuxt` group and a single **shared-frame anchor** + // iframe. The anchor owns one kept-alive iframe (its `frameId`); the + // client app ships a `devframe:frame-nav` postMessage shim that + // announces one member dock per DevTools tab and soft-navigates + // between them within that one iframe — no per-tab reload, and no + // Node-side tab list. Requires `@vitejs/devtools` >= 0.4.5 / + // `@devframes/hub` >= 0.7.11 (devframe#128 / vitejs/devtools#464). ctx.docks.register({ id: NUXT_DEVTOOLS_GROUP_ID, type: 'group', @@ -115,7 +117,21 @@ export async function enableModule(options: ModuleOptions, nuxt: Nuxt) { icon: '/__nuxt_devtools__/client/nuxt.svg', category: 'framework', defaultOrder: -2000, - defaultChildId: 'nuxt:devtools:overview', + defaultChildId: 'nuxt:devtools', + }) + + ctx.docks.register({ + id: 'nuxt:devtools', + type: 'iframe', + title: 'Nuxt DevTools', + icon: '/__nuxt_devtools__/client/nuxt.svg', + // `?embed=1` tells the client it is the embedded anchor: hide its + // own shell (SideNav/split pane) and start the frame-nav shim. + url: '/__nuxt_devtools__/client/?embed=1', + groupId: NUXT_DEVTOOLS_GROUP_ID, + frameId: 'nuxt:devtools', + subTabs: { protocol: 'postmessage' }, + defaultOrder: -300, }) } @@ -206,10 +222,6 @@ window.__NUXT_DEVTOOLS_TIME_METRIC__.appInit = Date.now() const ROUTE_CLIENT = `${ROUTE_PATH}/client` const ROUTE_ANALYZE = `${ROUTE_PATH}/analyze` - // Project every DevTools tab as its own iframe dock entry inside the `Nuxt` - // group (registered above). Members are wired up on the `devtools:ready` hook. - await import('./integrations/dock-tabs').then(({ setup }) => setup(ctx, ROUTE_CLIENT)) - // TODO: Use WS from nitro server when possible nuxt.hook('vite:serverCreated', (server) => { const devtoolsAnalyzeDir = join(nuxt.options.rootDir, 'node_modules/.cache/nuxt-devtools/analyze') diff --git a/packages/devtools/src/runtime/plugins/view/client.ts b/packages/devtools/src/runtime/plugins/view/client.ts index 940a519bdd..a1b44196ff 100644 --- a/packages/devtools/src/runtime/plugins/view/client.ts +++ b/packages/devtools/src/runtime/plugins/view/client.ts @@ -22,10 +22,11 @@ import { state } from './state' const MULTIPLE_SLASHES_RE = /\/+/g // The `Nuxt` dock group id (see `NUXT_DEVTOOLS_GROUP_ID`). Activating the group -// auto-opens its `defaultChildId` (the Overview tab). Per-tab dock entries use -// the `nuxt:devtools:` id prefix. +// auto-opens its `defaultChildId` (the shared-frame anchor). The anchor iframe +// dock (`nuxt:devtools`) hosts the one kept-alive client iframe that all tab +// members soft-navigate within. const NUXT_DOCK_GROUP_ID = 'nuxt' -const NUXT_DOCK_ENTRY_PREFIX = 'nuxt:devtools:' +const NUXT_DOCK_ANCHOR_ID = 'nuxt:devtools' function getViteDevToolsContext() { return getDevToolsClientContext() as any @@ -293,25 +294,20 @@ export async function setupDevToolsClient({ client.devtools.toggle() }) - // Each Nuxt DevTools tab is now its own iframe dock entry inside Vite DevTools' - // dock, so there is no single hub iframe we create ourselves (`getIframe()` - // above is legacy). The `@vue/devtools-kit` iframe messaging channel only - // talks to whichever iframe was registered via `setIframeServerContext()` — - // without that, the Vue DevTools applets (Pinia, component inspector, …) sit - // on "Connecting..." forever because the host backend never learns which - // iframe to answer. Bind it to whichever Nuxt tab iframe is currently - // selected, and rebind when the selection (or the element) changes. + // Nuxt DevTools renders inside a single shared-frame anchor iframe in Vite + // DevTools' dock (its per-tab members all soft-navigate within that one + // iframe), so we never create it ourselves (`getIframe()` above is legacy). + // The `@vue/devtools-kit` iframe messaging channel only talks to whichever + // iframe was registered via `setIframeServerContext()` — without that, the + // Vue DevTools applets (Pinia, component inspector, …) sit on "Connecting..." + // forever because the host backend never learns which iframe to answer. Bind + // it to the anchor iframe once Vite DevTools mounts it (and keep it pointed + // there if the element is recreated). function bindVueDevToolsIframe() { let bound: HTMLIFrameElement | undefined const bind = () => { const ctx = getViteDevToolsContext() - const docks = ctx?.docks - if (!docks) - return - const selectedId: string | undefined = docks.selectedId ?? docks.selected?.id - if (!selectedId || !selectedId.startsWith(NUXT_DOCK_ENTRY_PREFIX)) - return - const dockIframe = docks.getStateById?.(selectedId)?.domElements?.iframe as HTMLIFrameElement | null | undefined + const dockIframe = ctx?.docks?.getStateById?.(NUXT_DOCK_ANCHOR_ID)?.domElements?.iframe as HTMLIFrameElement | null | undefined if (!dockIframe || dockIframe === bound) return bound = dockIframe diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6641df54f6..cbeb097038 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -37,8 +37,8 @@ catalogs: specifier: ^66.7.5 version: 66.7.5 '@vitejs/devtools': - specifier: ^0.4.4 - version: 0.4.4 + specifier: ^0.4.5 + version: 0.4.5 '@vueuse/nuxt': specifier: ^14.3.0 version: 14.3.0 @@ -277,11 +277,11 @@ catalogs: version: 1.1.3 prod: '@devframes/plugin-code-server': - specifier: ^0.7.10 - version: 0.7.10 + specifier: ^0.7.11 + version: 0.7.11 '@devframes/plugin-data-inspector': - specifier: ^0.7.10 - version: 0.7.10 + specifier: ^0.7.11 + version: 0.7.11 '@nuxt/kit': specifier: ^4.5.0 version: 4.5.0 @@ -362,17 +362,17 @@ catalogs: specifier: ^3.2.1 version: 3.2.1 '@vitejs/devtools-kit': - specifier: ^0.4.4 - version: 0.4.4 + specifier: ^0.4.5 + version: 0.4.5 overrides: - '@devframes/hub': ^0.7.10 + '@devframes/hub': ^0.7.11 '@nuxt/devtools': workspace:* '@vue/compiler-core': 3.5.39 '@vue/compiler-dom': 3.5.39 '@vue/shared': 3.5.39 chokidar: ^5.0.0 - devframe: ^0.7.10 + devframe: ^0.7.11 esbuild: ^0.28.1 rollup: ^4.62.2 semver: ^7.8.5 @@ -424,7 +424,7 @@ importers: version: 66.7.5(eslint@10.7.0(jiti@2.7.0)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3) '@vitejs/devtools-kit': specifier: catalog:types - version: 0.4.4(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16) + version: 0.4.5(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16) bumpp: specifier: catalog:cli version: 12.0.0 @@ -499,10 +499,10 @@ importers: dependencies: '@devframes/plugin-code-server': specifier: catalog:prod - version: 0.7.10(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(vite@8.0.16) + version: 0.7.11(devframe@0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(vite@8.0.16) '@devframes/plugin-data-inspector': specifier: catalog:prod - version: 0.7.10(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(vite@8.0.16) + version: 0.7.11(devframe@0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(vite@8.0.16) '@nuxt/devtools-kit': specifier: workspace:* version: link:../devtools-kit @@ -511,10 +511,10 @@ importers: version: 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.0)(rollup@4.62.2)(vite@8.0.16)(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))) '@vitejs/devtools': specifier: catalog:buildtools - version: 0.4.4(crossws@0.4.10(srvx@0.11.22))(srvx@0.11.22)(typescript@6.0.3)(valibot@1.4.2(typescript@6.0.3))(vite@8.0.16) + version: 0.4.5(crossws@0.4.10(srvx@0.11.22))(srvx@0.11.22)(typescript@6.0.3)(valibot@1.4.2(typescript@6.0.3))(vite@8.0.16) '@vitejs/devtools-kit': specifier: catalog:types - version: 0.4.4(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16) + version: 0.4.5(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16) '@vue/devtools-core': specifier: catalog:frontend version: 8.1.5(vue@3.5.39(typescript@6.0.3)) @@ -586,7 +586,7 @@ importers: version: 0.2.0 vite: specifier: ~8.0.16 - version: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + version: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) vite-plugin-inspect: specifier: catalog:prod version: 12.0.2(@nuxt/kit@4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.0)(rollup@4.62.2)(vite@8.0.16)(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))))(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16) @@ -653,7 +653,7 @@ importers: version: 8.1.5(@unocss/reset@66.7.5)(change-case@5.4.4)(floating-vue@5.2.2(@nuxt/kit@4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.0)(rollup@4.62.2)(vite@8.0.16)(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))))(vue@3.5.39(typescript@6.0.3)))(fuse.js@7.5.0)(unocss@66.7.5(@unocss/webpack@66.7.5(esbuild@0.28.1)(rolldown@1.2.0)(rollup@4.62.2)(vite@8.0.16)(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20)))(vite@8.0.16))(vue@3.5.39(typescript@6.0.3)) '@vueuse/nuxt': specifier: catalog:buildtools - version: 14.3.0(60e9d80da15fe1130dec6e28164f862e) + version: 14.3.0(efc94133b966c2bf9505de459420051f) cronstrue: specifier: catalog:frontend version: 3.24.0 @@ -683,7 +683,7 @@ importers: version: 2.13.4(oxc-parser@0.140.0)(rolldown@1.2.0)(srvx@0.11.22)(supports-color@10.2.2)(vite@8.0.16)(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20)) nuxt: specifier: catalog:buildtools - version: 4.5.0(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@parcel/watcher@2.6.0)(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@10.2.2))(ioredis@5.11.1(supports-color@10.2.2))(lightningcss@1.33.0)(magicast@0.5.3)(optionator@0.9.4)(oxc-parser@0.140.0)(pinia@4.0.2(@vue/devtools-api@8.1.5)(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(supports-color@10.2.2)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))(yaml@2.9.0) + version: 4.5.0(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@parcel/watcher@2.6.0)(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@10.2.2))(ioredis@5.11.1(supports-color@10.2.2))(lightningcss@1.33.0)(magicast@0.5.3)(optionator@0.9.4)(oxc-parser@0.140.0)(pinia@4.0.2(@vue/devtools-api@8.1.5)(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(supports-color@10.2.2)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))(yaml@2.9.0) ofetch: specifier: catalog:frontend version: 1.5.1 @@ -719,7 +719,7 @@ importers: version: 66.7.5(@unocss/webpack@66.7.5(esbuild@0.28.1)(rolldown@1.2.0)(rollup@4.62.2)(vite@8.0.16)(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20)))(vite@8.0.16) unplugin-vue: specifier: catalog:buildtools - version: 7.2.0(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(rolldown@1.2.0)(rollup@4.62.2)(terser@5.49.0)(tsx@4.23.1)(vue@3.5.39(typescript@6.0.3))(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))(yaml@2.9.0) + version: 7.2.0(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(rolldown@1.2.0)(rollup@4.62.2)(terser@5.49.0)(tsx@4.23.1)(vue@3.5.39(typescript@6.0.3))(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))(yaml@2.9.0) unplugin-vue-markdown: specifier: catalog:buildtools version: 32.0.0(esbuild@0.28.1)(rolldown@1.2.0)(rollup@4.62.2)(vite@8.0.16)(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20)) @@ -752,7 +752,7 @@ importers: version: 1.2.4 vite: specifier: ~8.0.16 - version: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + version: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) devDependencies: '@nuxt/schema': specifier: catalog:types @@ -1251,66 +1251,66 @@ packages: '@cypress/xvfb@1.2.4': resolution: {integrity: sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==} - '@devframes/hub@0.7.10': - resolution: {integrity: sha512-IMRWNYZxYzSXG8XsFLcdtsCNVZM11pNUxLhHsuiI8m3MciLliSNrVkpoHRblFbRj0phG6fRRuEQajGikJ3xmiA==} + '@devframes/hub@0.7.11': + resolution: {integrity: sha512-r+qyGg0Hu1w1q7mNDCmuZUryeZAi2sUC8FTwEbwjqPT5SGjWnIoj1rMmRbJIOIBaC+2ofOejTGel4jklmzHc3w==} peerDependencies: - devframe: ^0.7.10 + devframe: ^0.7.11 - '@devframes/json-render@0.7.9': - resolution: {integrity: sha512-VgUBkxyCG60wTMvihZpGwX9RZwhmhNf+znh/R0Dlwz602E74HtCD2J8jdWqKje4aia4KmmHFLLwWC/itmkfJZg==} + '@devframes/json-render@0.7.11': + resolution: {integrity: sha512-Iza65fq6U9OSxKUEhGokfpfMz21ISLkWF9jeS0bQHugTLKRGcPRO/tu3YE+nTe6EiKP3kQFBvSNZ1FcZ1FPfSg==} peerDependencies: - '@devframes/hub': ^0.7.10 - devframe: ^0.7.10 + '@devframes/hub': ^0.7.11 + devframe: ^0.7.11 peerDependenciesMeta: '@devframes/hub': optional: true - '@devframes/plugin-code-server@0.7.10': - resolution: {integrity: sha512-b05jRteQax+MWnZr81KcPFtnBwj/+TWakp3UJEVPRhYtbhWJSnbHl5HBR3WPspyfGCKQ/bEbjsq4L+nbx11AWA==} + '@devframes/plugin-code-server@0.7.11': + resolution: {integrity: sha512-FF5ND53exrYirlPZ0GjDGrHcLt24Ge/edbJAifNbRhvUWneZNjxPf7XSD9zY6Olps17PZH22TwtqGgkVGlcIbg==} hasBin: true peerDependencies: - devframe: ^0.7.10 + devframe: ^0.7.11 vite: ~8.0.16 peerDependenciesMeta: vite: optional: true - '@devframes/plugin-data-inspector@0.7.10': - resolution: {integrity: sha512-gt2beVnrBB2R7k8mE3026l7ZNjCRnQygWkW+PBBVqa+xp8PCbTFWKj3z0/4YW9dkle0kdmMN/8PeNX4/jqWYNQ==} + '@devframes/plugin-data-inspector@0.7.11': + resolution: {integrity: sha512-AMRH/iwegqzWSfpD9BNB6IZwk9aL1hUj05yLaRfI+Io+grg9MvhE0gKSISlZ4Rlx1FdJ4EBhS0SKWU73rU5bkg==} hasBin: true peerDependencies: - devframe: ^0.7.10 + devframe: ^0.7.11 vite: ~8.0.16 peerDependenciesMeta: vite: optional: true - '@devframes/plugin-inspect@0.7.9': - resolution: {integrity: sha512-pDt/cjOvc8hF0Qj4WwBo+drnGD9yy1ck/CCFr2wno+d6AlM+00rxTgP1cCecAckVRNPxeVzSmQ7rFo8Ep/zPIw==} + '@devframes/plugin-inspect@0.7.11': + resolution: {integrity: sha512-eL1zFUqr65PFORTlBmdJuV7VlqUed5AXRG8SB9ofRyyiauvEWX31PUMD5g6DnZyJBztq97pCxiB0X4AIXNGmeg==} hasBin: true peerDependencies: - devframe: ^0.7.10 + devframe: ^0.7.11 vite: ~8.0.16 peerDependenciesMeta: vite: optional: true - '@devframes/plugin-messages@0.7.9': - resolution: {integrity: sha512-WcKRQEPw+VAjbubEZx7gHZdaKMkN4FwGkGBHCoAfe/4rbY2Sl2l/KEIW6+og0y8luoxHWxmnmrus1Jkc9mRZow==} + '@devframes/plugin-messages@0.7.11': + resolution: {integrity: sha512-7Hbgtlo84g6gp5xUOzxKWuBVVBQmT5QswzQ3K2Ax6nZyYO9kGdjDrdGrIWxH5D3acEvzxJw1ixgoRDHPmNtQSQ==} hasBin: true peerDependencies: - '@devframes/hub': ^0.7.10 - devframe: ^0.7.10 + '@devframes/hub': ^0.7.11 + devframe: ^0.7.11 vite: ~8.0.16 peerDependenciesMeta: vite: optional: true - '@devframes/plugin-terminals@0.7.9': - resolution: {integrity: sha512-rvDtNCzZyMRvtd89IV8UHImI0fHGqa88DzP87zHVAUoscL1WSHv9bE8zXW5yKj/tJMpJziVIeGJKTbto07tIrQ==} + '@devframes/plugin-terminals@0.7.11': + resolution: {integrity: sha512-eeUvY0IyBJ2Ao529Wwn/7tgXIrtVyXs5kfPRtsLiFq9/gAl4fmS0Lj4FXX0fpFFrbjraazj7Z9AIlBaPLVp83A==} hasBin: true peerDependencies: - devframe: ^0.7.10 + devframe: ^0.7.11 vite: ~8.0.16 peerDependenciesMeta: vite: @@ -3390,19 +3390,19 @@ packages: peerDependencies: vite: ~8.0.16 - '@vitejs/devtools-kit@0.4.4': - resolution: {integrity: sha512-HwCjEzuCwCSkv3X4ZJCvQcO9qCaLm9uImYTw6TQ3z71jJTmqYn0UcJx8tqY23KgF/jPPbaYBSHYG3QSGZWqMNA==} + '@vitejs/devtools-kit@0.4.5': + resolution: {integrity: sha512-fBjJ8Dyv0XvtyxxWyraah3+WC+7QDePfRQZ60Hh+gS0KrbuvgxoESiBVikE5IG9hwy03WliOM4yPWO/sVRP3+A==} peerDependencies: vite: ~8.0.16 - '@vitejs/devtools@0.4.4': - resolution: {integrity: sha512-mNNEMYBHNg3EzIIADgZlOhqqeaXN1EUguxsh14pxZz4BiEfdXTcNy9KTWuOSfa0GKgMbWP4H7uUFNq6cz5gbog==} + '@vitejs/devtools@0.4.5': + resolution: {integrity: sha512-jBawA1bnLhlUYNmVBVP94rOzezsa68kTaYD1+zVExzHG1xNp4udYnbbKLjjRtaMlZAOYwahwqhblrdNyr/fqPA==} hasBin: true peerDependencies: - '@vitejs/devtools-oxc': ^0.4.4 - '@vitejs/devtools-rolldown': ^0.4.4 - '@vitejs/devtools-vite': ^0.4.4 - '@vitejs/devtools-vitest': ^0.4.4 + '@vitejs/devtools-oxc': ^0.4.5 + '@vitejs/devtools-rolldown': ^0.4.5 + '@vitejs/devtools-vite': ^0.4.5 + '@vitejs/devtools-vitest': ^0.4.5 vite: ~8.0.16 peerDependenciesMeta: '@vitejs/devtools-oxc': @@ -4465,8 +4465,8 @@ packages: devalue@5.8.1: resolution: {integrity: sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw==} - devframe@0.7.10: - resolution: {integrity: sha512-+DyTB+s6Do7lp1SlbFsqlDZ6FACz4hTj1CHiCR6rtVnJt5NI0bshTtXHTzlvmFfCaELWPk/3826WqOcUuJqLmg==} + devframe@0.7.11: + resolution: {integrity: sha512-EC65NA7B1Q1H0daTMiPn2BLCjekIVC8V1WvoPyXAM/pBhNGGlRRaSVSfmAsaYmqSDT3osD8nWZ6KYhExU2KOfA==} peerDependencies: '@modelcontextprotocol/sdk': ^1.0.0 cac: ^7.0.0 @@ -8665,77 +8665,77 @@ snapshots: transitivePeerDependencies: - supports-color - '@devframes/hub@0.7.10(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))': + '@devframes/hub@0.7.11(devframe@0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))': dependencies: birpc: 4.0.0 destr: 2.0.5 - devframe: 0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) + devframe: 0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) nostics: 1.2.0 pathe: 2.0.3 perfect-debounce: 2.1.0 tinyexec: 1.2.4 zigpty: 0.2.1 - '@devframes/json-render@0.7.9(@devframes/hub@0.7.10(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)))(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))': + '@devframes/json-render@0.7.11(@devframes/hub@0.7.11(devframe@0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)))(devframe@0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))': dependencies: '@json-render/core': 0.19.0(zod@4.4.3) - devframe: 0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) + devframe: 0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) nostics: 1.2.0 zod: 4.4.3 optionalDependencies: - '@devframes/hub': 0.7.10(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)) + '@devframes/hub': 0.7.11(devframe@0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)) - '@devframes/plugin-code-server@0.7.10(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(vite@8.0.16)': + '@devframes/plugin-code-server@0.7.11(devframe@0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(vite@8.0.16)': dependencies: cac: 7.0.0 - devframe: 0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) + devframe: 0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) get-port-please: 3.2.0 nostics: 1.2.0 optionalDependencies: - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) - '@devframes/plugin-data-inspector@0.7.10(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(vite@8.0.16)': + '@devframes/plugin-data-inspector@0.7.11(devframe@0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(vite@8.0.16)': dependencies: cac: 7.0.0 - devframe: 0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) + devframe: 0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) get-port-please: 3.2.0 jora: 1.0.0-beta.16 nostics: 1.2.0 optionalDependencies: - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) - '@devframes/plugin-inspect@0.7.9(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(valibot@1.4.2(typescript@6.0.3))(vite@8.0.16)': + '@devframes/plugin-inspect@0.7.11(devframe@0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(valibot@1.4.2(typescript@6.0.3))(vite@8.0.16)': dependencies: '@valibot/to-json-schema': 1.7.1(valibot@1.4.2(typescript@6.0.3)) cac: 7.0.0 - devframe: 0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) + devframe: 0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) nostics: 1.2.0 optionalDependencies: - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: - valibot - '@devframes/plugin-messages@0.7.9(@devframes/hub@0.7.10(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)))(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(vite@8.0.16)': + '@devframes/plugin-messages@0.7.11(@devframes/hub@0.7.11(devframe@0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)))(devframe@0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(vite@8.0.16)': dependencies: - '@devframes/hub': 0.7.10(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)) + '@devframes/hub': 0.7.11(devframe@0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)) cac: 7.0.0 - devframe: 0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) + devframe: 0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) nostics: 1.2.0 optionalDependencies: - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) - '@devframes/plugin-terminals@0.7.9(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(typescript@6.0.3)(vite@8.0.16)': + '@devframes/plugin-terminals@0.7.11(devframe@0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(typescript@6.0.3)(vite@8.0.16)': dependencies: '@xterm/addon-fit': 0.11.0 '@xterm/xterm': 6.0.0 cac: 7.0.0 - devframe: 0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) + devframe: 0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) nostics: 1.2.0 pathe: 2.0.3 valibot: 1.4.2(typescript@6.0.3) zigpty: 0.2.1 optionalDependencies: - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: - typescript @@ -8977,7 +8977,7 @@ snapshots: ansis: 4.3.1 cac: 7.0.0 chokidar: 5.0.0 - devframe: 0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) + devframe: 0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) eslint: 10.7.0(jiti@2.7.0)(supports-color@10.2.2) jiti: 2.7.0 tinyglobby: 0.2.17 @@ -9352,7 +9352,7 @@ snapshots: dependencies: '@nuxt/kit': 3.21.8(magicast@0.5.3) execa: 8.0.1 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: - magicast @@ -9360,7 +9360,7 @@ snapshots: dependencies: '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.131.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.0)(rollup@4.62.2)(vite@8.0.16(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))) execa: 8.0.1 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: - magic-string - magicast @@ -9896,11 +9896,11 @@ snapshots: - webpack - xml2js - '@nuxt/nitro-server@4.5.0(a5fa61b1000fa231d076d32e478dfc5a)': + '@nuxt/nitro-server@4.5.0(6d138c019640122da7bf7128990a1df1)': dependencies: '@nuxt/devalue': 2.0.2 '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.0)(rollup@4.62.2)(vite@8.0.16)(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))) - '@unhead/vue': 3.2.1(cac@7.0.0)(esbuild@0.28.1)(lightningcss@1.33.0)(rolldown@1.2.0)(rollup@4.62.2)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3))(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20)) + '@unhead/vue': 3.2.1(cac@7.0.0)(esbuild@0.28.1)(lightningcss@1.33.0)(rolldown@1.2.0)(rollup@4.62.2)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16)(vue@3.5.39(typescript@6.0.3))(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20)) '@vue/shared': 3.5.39 consola: 3.4.2 defu: 6.1.7 @@ -9915,7 +9915,7 @@ snapshots: mocked-exports: 0.1.1 nitropack: 2.13.4(oxc-parser@0.140.0)(rolldown@1.2.0)(srvx@0.11.22)(supports-color@10.2.2)(vite@8.0.16)(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20)) nostics: 1.2.0 - nuxt: 4.5.0(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@parcel/watcher@2.6.0)(@types/node@26.1.1)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@10.2.2))(ioredis@5.11.1(supports-color@10.2.2))(lightningcss@1.33.0)(magicast@0.5.3)(optionator@0.9.4)(oxc-parser@0.140.0)(pinia@4.0.2(@vue/devtools-api@8.1.5)(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(supports-color@10.2.2)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))(yaml@2.9.0) + nuxt: 4.5.0(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@parcel/watcher@2.6.0)(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@10.2.2))(ioredis@5.11.1(supports-color@10.2.2))(lightningcss@1.33.0)(magicast@0.5.3)(optionator@0.9.4)(oxc-parser@0.140.0)(pinia@4.0.2(@vue/devtools-api@8.1.5)(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(supports-color@10.2.2)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))(yaml@2.9.0) nypm: 0.6.8 ohash: 2.0.11 pathe: 2.0.3 @@ -9981,11 +9981,11 @@ snapshots: - webpack - xml2js - '@nuxt/nitro-server@4.5.0(ee8c8491f0796e695341286f72fafd59)': + '@nuxt/nitro-server@4.5.0(a5fa61b1000fa231d076d32e478dfc5a)': dependencies: '@nuxt/devalue': 2.0.2 '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.0)(rollup@4.62.2)(vite@8.0.16)(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))) - '@unhead/vue': 3.2.1(cac@7.0.0)(esbuild@0.28.1)(lightningcss@1.33.0)(rolldown@1.2.0)(rollup@4.62.2)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16)(vue@3.5.39(typescript@6.0.3))(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20)) + '@unhead/vue': 3.2.1(cac@7.0.0)(esbuild@0.28.1)(lightningcss@1.33.0)(rolldown@1.2.0)(rollup@4.62.2)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3))(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20)) '@vue/shared': 3.5.39 consola: 3.4.2 defu: 6.1.7 @@ -10000,7 +10000,7 @@ snapshots: mocked-exports: 0.1.1 nitropack: 2.13.4(oxc-parser@0.140.0)(rolldown@1.2.0)(srvx@0.11.22)(supports-color@10.2.2)(vite@8.0.16)(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20)) nostics: 1.2.0 - nuxt: 4.5.0(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@parcel/watcher@2.6.0)(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@10.2.2))(ioredis@5.11.1(supports-color@10.2.2))(lightningcss@1.33.0)(magicast@0.5.3)(optionator@0.9.4)(oxc-parser@0.140.0)(pinia@4.0.2(@vue/devtools-api@8.1.5)(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(supports-color@10.2.2)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))(yaml@2.9.0) + nuxt: 4.5.0(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@parcel/watcher@2.6.0)(@types/node@26.1.1)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@10.2.2))(ioredis@5.11.1(supports-color@10.2.2))(lightningcss@1.33.0)(magicast@0.5.3)(optionator@0.9.4)(oxc-parser@0.140.0)(pinia@4.0.2(@vue/devtools-api@8.1.5)(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(supports-color@10.2.2)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))(yaml@2.9.0) nypm: 0.6.8 ohash: 2.0.11 pathe: 2.0.3 @@ -10220,8 +10220,8 @@ snapshots: std-env: 4.2.0 ufo: 1.6.4 unenv: 2.0.0-rc.24 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) - vite-node: 6.0.0(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite-node: 6.0.0(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) vite-plugin-checker: 0.14.4(eslint@10.7.0(jiti@2.7.0)(supports-color@10.2.2))(optionator@0.9.4)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3)) vue: 3.5.39(typescript@6.0.3) vue-bundle-renderer: 2.3.1 @@ -10255,11 +10255,11 @@ snapshots: - vue-tsc - yaml - '@nuxt/vite-builder@4.5.0(309394096da95d99edac9569f3420305)': + '@nuxt/vite-builder@4.5.0(7dbd8b1a508350443cd1d7f9560d8209)': dependencies: '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.0)(rollup@4.62.2)(vite@8.0.16)(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))) '@vitejs/plugin-vue': 6.0.8(vite@8.0.16)(vue@3.5.39(typescript@6.0.3)) - '@vitejs/plugin-vue-jsx': 5.1.6(supports-color@10.2.2)(vite@8.0.16)(vue@3.5.39(typescript@6.0.3)) + '@vitejs/plugin-vue-jsx': 5.1.6(supports-color@8.1.1)(vite@8.0.16(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3)) autoprefixer: 10.5.4(postcss@8.5.20) consola: 3.4.2 cssnano: 8.0.2(postcss@8.5.20) @@ -10272,7 +10272,7 @@ snapshots: knitwork: 1.3.0 mlly: 1.8.2 mocked-exports: 0.1.1 - nuxt: 4.5.0(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@parcel/watcher@2.6.0)(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@10.2.2))(ioredis@5.11.1(supports-color@10.2.2))(lightningcss@1.33.0)(magicast@0.5.3)(optionator@0.9.4)(oxc-parser@0.140.0)(pinia@4.0.2(@vue/devtools-api@8.1.5)(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(supports-color@10.2.2)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))(yaml@2.9.0) + nuxt: 4.5.0(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7(supports-color@8.1.1)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7(supports-color@8.1.1)))(@parcel/watcher@2.6.0)(@types/node@26.1.1)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@10.2.2))(ioredis@5.11.1(supports-color@8.1.1))(lightningcss@1.33.0)(magicast@0.5.3)(optionator@0.9.4)(oxc-parser@0.140.0)(pinia@4.0.2(@vue/devtools-api@8.1.5)(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(supports-color@8.1.1)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))(yaml@2.9.0) nypm: 0.6.8 pathe: 2.0.3 pkg-types: 2.3.1 @@ -10282,13 +10282,13 @@ snapshots: std-env: 4.2.0 ufo: 1.6.4 unenv: 2.0.0-rc.24 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) - vite-node: 6.0.0(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite-node: 6.0.0(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) vite-plugin-checker: 0.14.4(eslint@10.7.0(jiti@2.7.0)(supports-color@10.2.2))(optionator@0.9.4)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3)) vue: 3.5.39(typescript@6.0.3) vue-bundle-renderer: 2.3.1 optionalDependencies: - '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2)) + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) rolldown: 1.2.0 rollup-plugin-visualizer: 7.0.1(rolldown@1.2.0)(rollup@4.62.2) transitivePeerDependencies: @@ -10317,11 +10317,11 @@ snapshots: - vue-tsc - yaml - '@nuxt/vite-builder@4.5.0(7dbd8b1a508350443cd1d7f9560d8209)': + '@nuxt/vite-builder@4.5.0(9b378dbfa7278decc46e9aaad61b48ab)': dependencies: '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.0)(rollup@4.62.2)(vite@8.0.16)(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))) '@vitejs/plugin-vue': 6.0.8(vite@8.0.16)(vue@3.5.39(typescript@6.0.3)) - '@vitejs/plugin-vue-jsx': 5.1.6(supports-color@8.1.1)(vite@8.0.16(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3)) + '@vitejs/plugin-vue-jsx': 5.1.6(supports-color@10.2.2)(vite@8.0.16)(vue@3.5.39(typescript@6.0.3)) autoprefixer: 10.5.4(postcss@8.5.20) consola: 3.4.2 cssnano: 8.0.2(postcss@8.5.20) @@ -10334,7 +10334,7 @@ snapshots: knitwork: 1.3.0 mlly: 1.8.2 mocked-exports: 0.1.1 - nuxt: 4.5.0(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7(supports-color@8.1.1)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7(supports-color@8.1.1)))(@parcel/watcher@2.6.0)(@types/node@26.1.1)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@10.2.2))(ioredis@5.11.1(supports-color@8.1.1))(lightningcss@1.33.0)(magicast@0.5.3)(optionator@0.9.4)(oxc-parser@0.140.0)(pinia@4.0.2(@vue/devtools-api@8.1.5)(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(supports-color@8.1.1)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))(yaml@2.9.0) + nuxt: 4.5.0(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@parcel/watcher@2.6.0)(@types/node@26.1.1)(@vue/compiler-sfc@3.5.39)(cac@6.7.14)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@10.2.2))(ioredis@5.11.1(supports-color@10.2.2))(lightningcss@1.33.0)(magicast@0.5.3)(optionator@0.9.4)(oxc-parser@0.140.0)(pinia@4.0.2(@vue/devtools-api@8.1.5)(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(supports-color@10.2.2)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))(yaml@2.9.0) nypm: 0.6.8 pathe: 2.0.3 pkg-types: 2.3.1 @@ -10344,13 +10344,13 @@ snapshots: std-env: 4.2.0 ufo: 1.6.4 unenv: 2.0.0-rc.24 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) - vite-node: 6.0.0(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite-node: 6.0.0(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) vite-plugin-checker: 0.14.4(eslint@10.7.0(jiti@2.7.0)(supports-color@10.2.2))(optionator@0.9.4)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3)) vue: 3.5.39(typescript@6.0.3) vue-bundle-renderer: 2.3.1 optionalDependencies: - '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2)) rolldown: 1.2.0 rollup-plugin-visualizer: 7.0.1(rolldown@1.2.0)(rollup@4.62.2) transitivePeerDependencies: @@ -10379,7 +10379,7 @@ snapshots: - vue-tsc - yaml - '@nuxt/vite-builder@4.5.0(9b378dbfa7278decc46e9aaad61b48ab)': + '@nuxt/vite-builder@4.5.0(e9ce28a0d31bef45015cdfd59998b50f)': dependencies: '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.0)(rollup@4.62.2)(vite@8.0.16)(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))) '@vitejs/plugin-vue': 6.0.8(vite@8.0.16)(vue@3.5.39(typescript@6.0.3)) @@ -10396,7 +10396,7 @@ snapshots: knitwork: 1.3.0 mlly: 1.8.2 mocked-exports: 0.1.1 - nuxt: 4.5.0(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@parcel/watcher@2.6.0)(@types/node@26.1.1)(@vue/compiler-sfc@3.5.39)(cac@6.7.14)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@10.2.2))(ioredis@5.11.1(supports-color@10.2.2))(lightningcss@1.33.0)(magicast@0.5.3)(optionator@0.9.4)(oxc-parser@0.140.0)(pinia@4.0.2(@vue/devtools-api@8.1.5)(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(supports-color@10.2.2)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))(yaml@2.9.0) + nuxt: 4.5.0(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@parcel/watcher@2.6.0)(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@10.2.2))(ioredis@5.11.1(supports-color@10.2.2))(lightningcss@1.33.0)(magicast@0.5.3)(optionator@0.9.4)(oxc-parser@0.140.0)(pinia@4.0.2(@vue/devtools-api@8.1.5)(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(supports-color@10.2.2)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))(yaml@2.9.0) nypm: 0.6.8 pathe: 2.0.3 pkg-types: 2.3.1 @@ -10406,8 +10406,8 @@ snapshots: std-env: 4.2.0 ufo: 1.6.4 unenv: 2.0.0-rc.24 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) - vite-node: 6.0.0(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite-node: 6.0.0(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) vite-plugin-checker: 0.14.4(eslint@10.7.0(jiti@2.7.0)(supports-color@10.2.2))(optionator@0.9.4)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3)) vue: 3.5.39(typescript@6.0.3) vue-bundle-renderer: 2.3.1 @@ -10468,8 +10468,8 @@ snapshots: std-env: 4.2.0 ufo: 1.6.4 unenv: 2.0.0-rc.24 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) - vite-node: 6.0.0(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite-node: 6.0.0(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) vite-plugin-checker: 0.14.4(eslint@10.7.0(jiti@2.7.0)(supports-color@10.2.2))(optionator@0.9.4)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3)) vue: 3.5.39(typescript@6.0.3) vue-bundle-renderer: 2.3.1 @@ -11365,7 +11365,7 @@ snapshots: esbuild: 0.28.1 lightningcss: 1.33.0 rolldown: 1.2.0 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) webpack: 5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20) transitivePeerDependencies: - '@farmfe/core' @@ -11391,7 +11391,7 @@ snapshots: esbuild: 0.28.1 lightningcss: 1.33.0 rolldown: 1.2.0 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) webpack: 5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20) transitivePeerDependencies: - '@farmfe/core' @@ -11414,7 +11414,7 @@ snapshots: unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.0)(rollup@4.62.2)(vite@8.0.16)(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20)) vue: 3.5.39(typescript@6.0.3) optionalDependencies: - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) webpack: 5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20) transitivePeerDependencies: - '@farmfe/core' @@ -11439,7 +11439,7 @@ snapshots: unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.0)(rollup@4.62.2)(vite@8.0.16)(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20)) vue: 3.5.39(typescript@6.0.3) optionalDependencies: - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) webpack: 5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20) transitivePeerDependencies: - '@farmfe/core' @@ -11464,7 +11464,7 @@ snapshots: unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.0)(rollup@4.62.2)(vite@8.0.16)(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20)) vue: 3.5.39(typescript@6.0.3) optionalDependencies: - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) webpack: 5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20) transitivePeerDependencies: - '@farmfe/core' @@ -11671,7 +11671,7 @@ snapshots: pathe: 2.0.3 tinyglobby: 0.2.17 unplugin-utils: 0.3.2 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) '@unocss/webpack@66.7.5(esbuild@0.28.1)(rolldown@1.2.0)(rollup@4.62.2)(vite@8.0.16)(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))': dependencies: @@ -11810,15 +11810,15 @@ snapshots: '@vitejs/devtools-kit@0.3.4(cac@6.7.14)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))': dependencies: - '@devframes/hub': 0.7.10(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)) + '@devframes/hub': 0.7.11(devframe@0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)) birpc: 4.0.0 - devframe: 0.7.10(cac@6.7.14)(srvx@0.11.22)(typescript@6.0.3) + devframe: 0.7.11(cac@6.7.14)(srvx@0.11.22)(typescript@6.0.3) mlly: 1.8.2 nostics: 1.2.0 pathe: 2.0.3 perfect-debounce: 2.1.0 tinyexec: 1.2.4 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: - '@modelcontextprotocol/sdk' - cac @@ -11827,54 +11827,54 @@ snapshots: '@vitejs/devtools-kit@0.3.4(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16)': dependencies: - '@devframes/hub': 0.7.10(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)) + '@devframes/hub': 0.7.11(devframe@0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)) birpc: 4.0.0 - devframe: 0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) + devframe: 0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) mlly: 1.8.2 nostics: 1.2.0 pathe: 2.0.3 perfect-debounce: 2.1.0 tinyexec: 1.2.4 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: - '@modelcontextprotocol/sdk' - cac - srvx - typescript - '@vitejs/devtools-kit@0.4.4(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16)': + '@vitejs/devtools-kit@0.4.5(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16)': dependencies: - '@devframes/hub': 0.7.10(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)) - '@devframes/json-render': 0.7.9(@devframes/hub@0.7.10(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)))(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)) - devframe: 0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) + '@devframes/hub': 0.7.11(devframe@0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)) + '@devframes/json-render': 0.7.11(@devframes/hub@0.7.11(devframe@0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)))(devframe@0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)) + devframe: 0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) local-pkg: 1.2.1 mlly: 1.8.2 nostics: 1.2.0 nypm: 0.6.8 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: - '@modelcontextprotocol/sdk' - cac - srvx - typescript - '@vitejs/devtools@0.4.4(crossws@0.4.10(srvx@0.11.22))(srvx@0.11.22)(typescript@6.0.3)(valibot@1.4.2(typescript@6.0.3))(vite@8.0.16)': + '@vitejs/devtools@0.4.5(crossws@0.4.10(srvx@0.11.22))(srvx@0.11.22)(typescript@6.0.3)(valibot@1.4.2(typescript@6.0.3))(vite@8.0.16)': dependencies: - '@devframes/hub': 0.7.10(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)) - '@devframes/plugin-inspect': 0.7.9(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(valibot@1.4.2(typescript@6.0.3))(vite@8.0.16) - '@devframes/plugin-messages': 0.7.9(@devframes/hub@0.7.10(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)))(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(vite@8.0.16) - '@devframes/plugin-terminals': 0.7.9(devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(typescript@6.0.3)(vite@8.0.16) - '@vitejs/devtools-kit': 0.4.4(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16) + '@devframes/hub': 0.7.11(devframe@0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)) + '@devframes/plugin-inspect': 0.7.11(devframe@0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(valibot@1.4.2(typescript@6.0.3))(vite@8.0.16) + '@devframes/plugin-messages': 0.7.11(@devframes/hub@0.7.11(devframe@0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)))(devframe@0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(vite@8.0.16) + '@devframes/plugin-terminals': 0.7.11(devframe@0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3))(typescript@6.0.3)(vite@8.0.16) + '@vitejs/devtools-kit': 0.4.5(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16) birpc: 4.0.0 cac: 7.0.0 - devframe: 0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) + devframe: 0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3) h3: 2.0.1-rc.22(crossws@0.4.10(srvx@0.11.22)) local-pkg: 1.2.1 mlly: 1.8.2 nostics: 1.2.0 obug: 2.1.4 pathe: 2.0.3 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) vue: 3.5.39(typescript@6.0.3) transitivePeerDependencies: - '@modelcontextprotocol/sdk' @@ -11890,7 +11890,7 @@ snapshots: '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) '@rolldown/pluginutils': 1.0.1 '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) vue: 3.5.39(typescript@6.0.3) transitivePeerDependencies: - supports-color @@ -11902,7 +11902,7 @@ snapshots: '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@rolldown/pluginutils': 1.0.1 '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) vue: 3.5.39(typescript@6.0.3) transitivePeerDependencies: - supports-color @@ -11910,7 +11910,7 @@ snapshots: '@vitejs/plugin-vue@6.0.8(vite@8.0.16)(vue@3.5.39(typescript@6.0.3))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) vue: 3.5.39(typescript@6.0.3) '@vitest/eslint-plugin@1.6.23(@typescript-eslint/eslint-plugin@8.63.0(@typescript-eslint/parser@8.63.0(eslint@10.7.0(jiti@2.7.0)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3))(eslint@10.7.0(jiti@2.7.0)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3))(eslint@10.7.0(jiti@2.7.0)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@6.0.3)(vitest@4.1.10)': @@ -11940,7 +11940,7 @@ snapshots: estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) '@vitest/pretty-format@4.1.10': dependencies: @@ -12236,13 +12236,13 @@ snapshots: '@vueuse/metadata@14.3.0': {} - '@vueuse/nuxt@14.3.0(60e9d80da15fe1130dec6e28164f862e)': + '@vueuse/nuxt@14.3.0(62c129cbd24015a71abfab5a7fa9cb49)': dependencies: '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.0)(rollup@4.62.2)(vite@8.0.16)(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))) '@vueuse/core': 14.3.0(vue@3.5.39(typescript@6.0.3)) '@vueuse/metadata': 14.3.0 local-pkg: 1.2.1 - nuxt: 4.5.0(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@parcel/watcher@2.6.0)(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@10.2.2))(ioredis@5.11.1(supports-color@10.2.2))(lightningcss@1.33.0)(magicast@0.5.3)(optionator@0.9.4)(oxc-parser@0.140.0)(pinia@4.0.2(@vue/devtools-api@8.1.5)(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(supports-color@10.2.2)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))(yaml@2.9.0) + nuxt: 4.5.0(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@parcel/watcher@2.6.0)(@types/node@26.1.1)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@10.2.2))(ioredis@5.11.1(supports-color@10.2.2))(lightningcss@1.33.0)(magicast@0.5.3)(optionator@0.9.4)(oxc-parser@0.140.0)(pinia@4.0.2(@vue/devtools-api@8.1.5)(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(supports-color@10.2.2)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))(yaml@2.9.0) vue: 3.5.39(typescript@6.0.3) transitivePeerDependencies: - magic-string @@ -12251,13 +12251,13 @@ snapshots: - rolldown - unplugin - '@vueuse/nuxt@14.3.0(62c129cbd24015a71abfab5a7fa9cb49)': + '@vueuse/nuxt@14.3.0(efc94133b966c2bf9505de459420051f)': dependencies: '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.0)(rollup@4.62.2)(vite@8.0.16)(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))) '@vueuse/core': 14.3.0(vue@3.5.39(typescript@6.0.3)) '@vueuse/metadata': 14.3.0 local-pkg: 1.2.1 - nuxt: 4.5.0(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@parcel/watcher@2.6.0)(@types/node@26.1.1)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@10.2.2))(ioredis@5.11.1(supports-color@10.2.2))(lightningcss@1.33.0)(magicast@0.5.3)(optionator@0.9.4)(oxc-parser@0.140.0)(pinia@4.0.2(@vue/devtools-api@8.1.5)(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(supports-color@10.2.2)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))(yaml@2.9.0) + nuxt: 4.5.0(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@parcel/watcher@2.6.0)(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@10.2.2))(ioredis@5.11.1(supports-color@10.2.2))(lightningcss@1.33.0)(magicast@0.5.3)(optionator@0.9.4)(oxc-parser@0.140.0)(pinia@4.0.2(@vue/devtools-api@8.1.5)(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(supports-color@10.2.2)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))(yaml@2.9.0) vue: 3.5.39(typescript@6.0.3) transitivePeerDependencies: - magic-string @@ -13057,7 +13057,7 @@ snapshots: devalue@5.8.1: {} - devframe@0.7.10(cac@6.7.14)(srvx@0.11.22)(typescript@6.0.3): + devframe@0.7.11(cac@6.7.14)(srvx@0.11.22)(typescript@6.0.3): dependencies: '@valibot/to-json-schema': 1.7.1(valibot@1.4.2(typescript@6.0.3)) birpc: 4.0.0 @@ -13075,7 +13075,7 @@ snapshots: - srvx - typescript - devframe@0.7.10(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3): + devframe@0.7.11(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3): dependencies: '@valibot/to-json-schema': 1.7.1(valibot@1.4.2(typescript@6.0.3)) birpc: 4.0.0 @@ -15385,16 +15385,16 @@ snapshots: - vite - webpack - nuxt@4.5.0(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@parcel/watcher@2.6.0)(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@10.2.2))(ioredis@5.11.1(supports-color@10.2.2))(lightningcss@1.33.0)(magicast@0.5.3)(optionator@0.9.4)(oxc-parser@0.140.0)(pinia@4.0.2(@vue/devtools-api@8.1.5)(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(supports-color@10.2.2)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))(yaml@2.9.0): + nuxt@4.5.0(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7(supports-color@10.2.2)))(@parcel/watcher@2.6.0)(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(@vue/compiler-sfc@3.5.39)(cac@7.0.0)(db0@0.3.4)(esbuild@0.28.1)(eslint@10.7.0(jiti@2.7.0)(supports-color@10.2.2))(ioredis@5.11.1(supports-color@10.2.2))(lightningcss@1.33.0)(magicast@0.5.3)(optionator@0.9.4)(oxc-parser@0.140.0)(pinia@4.0.2(@vue/devtools-api@8.1.5)(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(supports-color@10.2.2)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@8.0.16)(vue-tsc@3.3.7(typescript@6.0.3))(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))(yaml@2.9.0): dependencies: '@dxup/nuxt': 0.5.3(esbuild@0.28.1)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup@4.62.2)(vite@8.0.16)(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20)) '@nuxt/cli': 3.37.0(@nuxt/schema@4.5.0)(cac@7.0.0)(magicast@0.5.3)(supports-color@10.2.2) '@nuxt/devtools': link:packages/devtools '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.0)(rollup@4.62.2)(vite@8.0.16)(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))) - '@nuxt/nitro-server': 4.5.0(ee8c8491f0796e695341286f72fafd59) + '@nuxt/nitro-server': 4.5.0(6d138c019640122da7bf7128990a1df1) '@nuxt/schema': 4.5.0 '@nuxt/telemetry': 2.8.0(@nuxt/kit@4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.0)(rollup@4.62.2)(vite@8.0.16)(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20)))) - '@nuxt/vite-builder': 4.5.0(309394096da95d99edac9569f3420305) + '@nuxt/vite-builder': 4.5.0(e9ce28a0d31bef45015cdfd59998b50f) '@unhead/vue': 3.2.1(cac@7.0.0)(esbuild@0.28.1)(lightningcss@1.33.0)(rolldown@1.2.0)(rollup@4.62.2)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16)(vue@3.5.39(typescript@6.0.3))(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20)) '@vue/shared': 3.5.39 chokidar: 5.0.0 @@ -17609,7 +17609,7 @@ snapshots: hookable: 6.1.1 unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.0)(rollup@4.62.2)(vite@8.0.16)(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20)) optionalDependencies: - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' @@ -17759,7 +17759,7 @@ snapshots: markdown-exit: 1.0.0-beta.9 unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.0)(rollup@4.62.2)(vite@8.0.16)(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20)) unplugin-utils: 0.3.2 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' @@ -17770,14 +17770,14 @@ snapshots: - unloader - webpack - unplugin-vue@7.2.0(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(rolldown@1.2.0)(rollup@4.62.2)(terser@5.49.0)(tsx@4.23.1)(vue@3.5.39(typescript@6.0.3))(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))(yaml@2.9.0): + unplugin-vue@7.2.0(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(rolldown@1.2.0)(rollup@4.62.2)(terser@5.49.0)(tsx@4.23.1)(vue@3.5.39(typescript@6.0.3))(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))(yaml@2.9.0): dependencies: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 '@vue/reactivity': 3.5.39 obug: 2.1.4 unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.2.0)(rollup@4.62.2)(vite@8.0.16)(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20)) - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) vue: 3.5.39(typescript@6.0.3) transitivePeerDependencies: - '@farmfe/core' @@ -17816,7 +17816,7 @@ snapshots: esbuild: 0.28.1 rolldown: 1.2.0 rollup: 4.62.2 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) webpack: 5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20) unrouting@0.1.7: @@ -18006,15 +18006,15 @@ snapshots: vite-hot-client@2.2.0(vite@8.0.16(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)): dependencies: - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) - vite-node@6.0.0(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0): + vite-node@6.0.0(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0): dependencies: cac: 7.0.0 es-module-lexer: 2.3.1 obug: 2.1.4 pathe: 2.0.3 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: - '@types/node' - '@vitejs/devtools' @@ -18038,7 +18038,7 @@ snapshots: picomatch: 4.0.5 proper-lockfile: 4.1.2 tiny-invariant: 1.3.3 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) optionalDependencies: eslint: 10.7.0(jiti@2.7.0)(supports-color@10.2.2) optionator: 0.9.4 @@ -18047,7 +18047,7 @@ snapshots: vite-plugin-inspect@12.0.2(@nuxt/kit@4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.0)(rollup@4.62.2)(vite@8.0.16)(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))))(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16): dependencies: - '@vitejs/devtools-kit': 0.4.4(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16) + '@vitejs/devtools-kit': 0.4.5(cac@7.0.0)(srvx@0.11.22)(typescript@6.0.3)(vite@8.0.16) ansis: 4.3.1 error-stack-parser-es: 2.0.1 obug: 2.1.4 @@ -18056,7 +18056,7 @@ snapshots: perfect-debounce: 2.1.0 sirv: 3.0.2 unplugin-utils: 0.3.2 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) optionalDependencies: '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.0)(rollup@4.62.2)(vite@8.0.16)(webpack@5.108.4(cssnano@8.0.2(postcss@8.5.20))(csso@5.0.5)(esbuild@0.28.1)(lightningcss@1.33.0)(postcss@8.5.20))) transitivePeerDependencies: @@ -18072,10 +18072,10 @@ snapshots: magic-string: 0.30.21 pathe: 2.0.3 source-map-js: 1.2.1 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) vue: 3.5.39(typescript@6.0.3) - vite@8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0): + vite@8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0): dependencies: lightningcss: 1.33.0 picomatch: 4.0.5 @@ -18084,7 +18084,7 @@ snapshots: tinyglobby: 0.2.17 optionalDependencies: '@types/node': 26.1.1 - '@vitejs/devtools': 0.4.4(crossws@0.4.10(srvx@0.11.22))(srvx@0.11.22)(typescript@6.0.3)(valibot@1.4.2(typescript@6.0.3))(vite@8.0.16) + '@vitejs/devtools': 0.4.5(crossws@0.4.10(srvx@0.11.22))(srvx@0.11.22)(typescript@6.0.3)(valibot@1.4.2(typescript@6.0.3))(vite@8.0.16) esbuild: 0.28.1 fsevents: 2.3.3 jiti: 2.7.0 @@ -18166,7 +18166,7 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 26.1.1 @@ -18230,7 +18230,7 @@ snapshots: optionalDependencies: '@vue/compiler-sfc': 3.5.39 pinia: 4.0.2(@vue/devtools-api@8.1.5)(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)) - vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.0.16(@types/node@26.1.1)(@vitejs/devtools@0.4.5)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 9eeb5765b2..67ba492098 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -44,13 +44,13 @@ overrides: # which silently drops the whole `overrides` config and desyncs the # lockfile, breaking `pnpm install --frozen-lockfile`. Keep these in sync # with the matching catalog entries below by hand. - '@devframes/hub': ^0.7.10 + '@devframes/hub': ^0.7.11 '@nuxt/devtools': workspace:* '@vue/compiler-core': 3.5.39 '@vue/compiler-dom': 3.5.39 '@vue/shared': 3.5.39 chokidar: ^5.0.0 - devframe: ^0.7.10 + devframe: ^0.7.11 esbuild: ^0.28.1 rollup: ^4.62.2 semver: ^7.8.5 @@ -78,7 +78,7 @@ catalogs: '@unocss/preset-icons': ^66.7.5 '@unocss/preset-mini': ^66.7.5 '@unocss/preset-uno': ^66.7.5 - '@vitejs/devtools': ^0.4.4 + '@vitejs/devtools': ^0.4.5 '@vueuse/nuxt': ^14.3.0 exsolve: ^1.1.0 lightningcss: ^1.33.0 @@ -165,8 +165,8 @@ catalogs: playground: '@exampledev/new.css': ^1.1.3 prod: - '@devframes/plugin-code-server': ^0.7.10 - '@devframes/plugin-data-inspector': ^0.7.10 + '@devframes/plugin-code-server': ^0.7.11 + '@devframes/plugin-data-inspector': ^0.7.11 '@nuxt/kit': ^4.5.0 '@vue/devtools-kit': ^8.1.5 consola: ^3.4.2 @@ -194,5 +194,5 @@ catalogs: '@types/node': ^26.1.1 '@types/ws': ^8.18.1 '@unhead/schema': ^3.2.1 - '@vitejs/devtools-kit': ^0.4.4 + '@vitejs/devtools-kit': ^0.4.5 unimport: ^6.3.1 From 2430c31fdf518c9ea5f77c65eb5c5deb4ea446a4 Mon Sep 17 00:00:00 2001 From: "Anthony Fu (via agent)" Date: Thu, 23 Jul 2026 08:39:33 +0000 Subject: [PATCH 06/10] feat(devtools): conditional tab docks, full-width embed, settings entry Drive the shared-iframe member docks from useEnabledTabs() so a tab's show() condition, hidden/pinned settings and experimental gating decide whether its dock appears (mirroring the old SideNav), re-announcing the manifest when that set changes. Expose the Settings page as its own dock member. In embedded mode the SideNav is hidden, so lay the content out full-width. --- packages/devtools/client/app.vue | 2 +- .../devtools/client/composables/frame-nav.ts | 52 ++++++++++++++----- 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/packages/devtools/client/app.vue b/packages/devtools/client/app.vue index 68de005c65..9cea29569b 100644 --- a/packages/devtools/client/app.vue +++ b/packages/devtools/client/app.vue @@ -158,7 +158,7 @@ registerCommands(() => [
diff --git a/packages/devtools/client/composables/frame-nav.ts b/packages/devtools/client/composables/frame-nav.ts index d2e895904c..6846917a0a 100644 --- a/packages/devtools/client/composables/frame-nav.ts +++ b/packages/devtools/client/composables/frame-nav.ts @@ -1,7 +1,7 @@ import type { ModuleBuiltinTab, ModuleCustomTab } from '~/../src/types' -import { watch } from 'vue' +import { computed, watch } from 'vue' import { useRouter } from '#app/composables/router' -import { useAllTabs } from '~/composables/state-tabs' +import { useEnabledTabs } from '~/composables/state-tabs' // `devframe:frame-nav` — the embedded-app half of the shared-iframe soft-nav // protocol (devframe#128 / vitejs/devtools#464). The Vite DevTools dock owns @@ -9,6 +9,11 @@ import { useAllTabs } from '~/composables/state-tabs' // DevTools tab and switches views by client-side navigation, so no per-tab // iframe/reload is needed. The shim is transport-only: it takes no hub/RPC // dependency, just `postMessage`. +// +// The announced set comes from `useEnabledTabs()` — the same conditional list +// the SideNav used — so a tab's `show()` condition, hidden/pinned settings and +// experimental gating decide whether its dock appears, and the manifest is +// re-announced whenever that set changes. const CHANNEL = 'devframe:frame-nav' const VERSION = 1 // Must match the anchor's `frameId` registered in `module-main.ts`. @@ -17,6 +22,26 @@ const FRAME_ID = 'nuxt:devtools' const ICON_CLASS_RE = /\s.*$/ const FIRST_DASH_RE = /-/ +interface FrameNavTab { + id: string + title: string + icon?: string + category?: string + order?: number + navTarget: { path: string } +} + +/** The DevTools settings page, surfaced as its own dock member. */ +const SETTINGS_TAB: FrameNavTab = { + id: 'settings', + title: 'Settings', + icon: 'carbon:settings', + category: 'advanced', + // sort last within its sub-category (higher `order` renders earlier) + order: -1000, + navTarget: { path: '/settings' }, +} + /** Normalise a tab icon (UnoCSS `i-carbon-foo` / `carbon-foo`) to iconify `carbon:foo`. */ function normalizeIcon(icon: string | undefined): string | undefined { if (!icon) @@ -37,29 +62,30 @@ function tabPath(tab: ModuleBuiltinTab | ModuleCustomTab): string { /** * Start the frame-nav shim. No-op unless running inside an iframe. Announces the - * tab manifest, answers `navigate` with client-side navigation, and reports - * `navigated` so the dock highlight follows in-app navigation. + * (conditional) tab manifest, answers `navigate` with client-side navigation, + * and reports `navigated` so the dock highlight follows in-app navigation. */ export function setupFrameNav(): void { if (typeof window === 'undefined' || window.parent === window) return const router = useRouter() - const tabs = useAllTabs() + const tabs = useEnabledTabs() - function buildManifest() { - return tabs.value.map(tab => ({ + const manifest = computed(() => [ + ...tabs.value.map(tab => ({ id: tab.name, title: tab.title ?? tab.name, icon: normalizeIcon(tab.icon), category: tab.category, navTarget: { path: tabPath(tab) }, - })) - } + })), + SETTINGS_TAB, + ]) function currentTabId(): string | undefined { const path = router.currentRoute.value.path - return tabs.value.find(tab => tabPath(tab) === path)?.name + return manifest.value.find(entry => entry.navTarget.path === path)?.id } function post(message: Record) { @@ -67,7 +93,7 @@ export function setupFrameNav(): void { } function announce(type: 'ready' | 'manifest') { - post({ type, tabs: buildManifest(), current: currentTabId() }) + post({ type, tabs: manifest.value, current: currentTabId() }) } window.addEventListener('message', (ev: MessageEvent) => { @@ -87,8 +113,8 @@ export function setupFrameNav(): void { // Announce proactively in case the host attached before this shim loaded. announce('ready') - // Re-announce when the tab set changes. - watch(() => tabs.value.map(t => t.name).join(','), () => announce('manifest')) + // Re-announce when the conditional tab set changes (show()/settings/etc). + watch(() => manifest.value.map(entry => entry.id).join(','), () => announce('manifest')) // Report in-app navigation so the dock highlight follows. watch(() => router.currentRoute.value.path, () => { From b742611c56ec65949f96190dd45e87228362eec3 Mon Sep 17 00:00:00 2001 From: "Anthony Fu (via agent)" Date: Thu, 23 Jul 2026 09:18:45 +0000 Subject: [PATCH 07/10] =?UTF-8?q?fix(devtools):=20fix=20CI=20=E2=80=94=20s?= =?UTF-8?q?erve=20embedded=20anchor=20index,=20update=20e2e=20for=20shared?= =?UTF-8?q?-iframe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - module-main: serve the base-rewritten client index for the root document regardless of query, so the shared-frame anchor URL (`/?embed=1`) no longer gets a raw, un-rewritten `index.html` from sirv (broken base). - e2e: update iframe/nuxt-group specs for the shared-iframe model — the anchor renders chromelessly (SideNav hidden) and surfaces per-tab member docks via the frame-nav shim, instead of showing the in-iframe SideNav. - restore main's `unimport/auto-insert` eslint-disable comments that a merge in this branch had dropped (lint was failing on unrelated files). --- .../client/components/ServerRouteDetails.vue | 2 +- .../client/components/ServerTaskDetails.vue | 1 + .../client/composables/state-commands.ts | 1 + .../client/composables/state-modules.ts | 1 + packages/devtools/src/module-main.ts | 6 ++++- tests/e2e/specs/iframe.spec.ts | 10 ++++--- tests/e2e/specs/nuxt-group.spec.ts | 26 +++++++++++++++---- 7 files changed, 37 insertions(+), 10 deletions(-) diff --git a/packages/devtools/client/components/ServerRouteDetails.vue b/packages/devtools/client/components/ServerRouteDetails.vue index a7858843e4..f7b573a0a2 100644 --- a/packages/devtools/client/components/ServerRouteDetails.vue +++ b/packages/devtools/client/components/ServerRouteDetails.vue @@ -180,7 +180,7 @@ async function fetchData() { const f = resolvedSendFrom.value === 'app' ? client.value!.app!.$fetch - + // eslint-disable-next-line unimport/auto-insert : $fetch as $Fetch telemetry('server-routes:fetch', { diff --git a/packages/devtools/client/components/ServerTaskDetails.vue b/packages/devtools/client/components/ServerTaskDetails.vue index 7236a49fcc..c8f40c05cc 100644 --- a/packages/devtools/client/components/ServerTaskDetails.vue +++ b/packages/devtools/client/components/ServerTaskDetails.vue @@ -133,6 +133,7 @@ async function fetchData() { }) try { + // eslint-disable-next-line unimport/auto-insert response.data = await ($fetch as $Fetch)(finalURL.value, { method: 'POST', // routeMethod.value.toUpperCase() as any, headers: parsedHeader.value, diff --git a/packages/devtools/client/composables/state-commands.ts b/packages/devtools/client/composables/state-commands.ts index 16da4b766e..e4a3b72da1 100644 --- a/packages/devtools/client/composables/state-commands.ts +++ b/packages/devtools/client/composables/state-commands.ts @@ -76,6 +76,7 @@ let _nuxtDocsCommands: CommandItem[] | undefined export async function getNuxtDocsCommands() { if (!_nuxtDocsCommands) { + // eslint-disable-next-line unimport/auto-insert const list = await $fetch('https://nuxt.com/api/search.json', { query: { select: '_path,title,description,navigation', diff --git a/packages/devtools/client/composables/state-modules.ts b/packages/devtools/client/composables/state-modules.ts index 9afd9c0229..f094fae94d 100644 --- a/packages/devtools/client/composables/state-modules.ts +++ b/packages/devtools/client/composables/state-modules.ts @@ -16,6 +16,7 @@ const ignoredModules = [ export function useModulesList() { return useAsyncState('getModulesList', async () => { + // eslint-disable-next-line unimport/auto-insert const m = await $fetch<{ modules: ModuleStaticInfo[] }>('https://api.nuxt.com/modules?version=3') return m.modules .filter((item: ModuleStaticInfo) => !ignoredModules.includes(item.npm) && item.compatibility.nuxt.includes('>=3')) diff --git a/packages/devtools/src/module-main.ts b/packages/devtools/src/module-main.ts index 2159804642..79c7b68567 100644 --- a/packages/devtools/src/module-main.ts +++ b/packages/devtools/src/module-main.ts @@ -244,7 +244,11 @@ window.__NUXT_DEVTOOLS_TIME_METRIC__.appInit = Date.now() res.end() } server.middlewares.use(ROUTE_CLIENT, (req, res) => { - if (req.url === '/') + // Serve the (base-rewritten) SPA index for the root document, ignoring + // any query string — e.g. the shared-frame anchor loads `/?embed=1`, + // which sirv would otherwise serve as a raw, un-rewritten `index.html`. + const pathname = (req.url || '/').split('?')[0] + if (pathname === '/' || pathname === '') return handleIndex(res) return handleStatic(req, res, () => handleIndex(res)) }) diff --git a/tests/e2e/specs/iframe.spec.ts b/tests/e2e/specs/iframe.spec.ts index 34defa07a6..640c66df7f 100644 --- a/tests/e2e/specs/iframe.spec.ts +++ b/tests/e2e/specs/iframe.spec.ts @@ -3,9 +3,13 @@ import { expect, test } from '../fixtures/devtools' // Nuxt DevTools is dev-only — no devtools UI exists in built/preview mode. test.skip(({ mode }) => mode !== 'dev', 'devtools UI is dev-mode only') -test('devtools iframe loads with side nav visible', async ({ page, openDevTools, devtoolsFrame }) => { +test('devtools iframe loads chromelessly in the shared-frame anchor', async ({ page, openDevTools, devtoolsFrame }) => { await page.goto('/') await openDevTools() - await expect(devtoolsFrame().locator('#nuxt-devtools-side-nav')) - .toBeVisible({ timeout: 30_000 }) + // The client loads as the shared-frame anchor (`?embed=1`): its SideNav is + // hidden — the dock's per-tab members provide navigation — and the current + // tab's content fills the iframe. + await expect(devtoolsFrame().locator('#nuxt-devtools-side-nav')).toBeHidden() + await expect(devtoolsFrame().locator('body')) + .toContainText(/components|imports|plugins/i, { timeout: 30_000 }) }) diff --git a/tests/e2e/specs/nuxt-group.spec.ts b/tests/e2e/specs/nuxt-group.spec.ts index eecf8f5adf..915ccef6f8 100644 --- a/tests/e2e/specs/nuxt-group.spec.ts +++ b/tests/e2e/specs/nuxt-group.spec.ts @@ -3,7 +3,7 @@ import { expect, test } from '../fixtures/devtools' // Vite DevTools UI (and its dock registry) is dev-mode only. test.skip(({ mode }) => mode !== 'dev', 'devtools UI is dev-mode only') -test('registers a single `Nuxt` group with `nuxt:devtools` as its default child', async ({ page, openDevTools, devtoolsFrame }) => { +test('registers a single `Nuxt` group with `nuxt:devtools` as its default child', async ({ page, openDevTools }) => { await page.goto('/') await openDevTools() @@ -23,6 +23,8 @@ test('registers a single `Nuxt` group with `nuxt:devtools` as its default child' defaultChildId: 'nuxt:devtools', }) + // The `nuxt:devtools` entry is the shared-frame anchor: it owns one iframe + // (its `frameId`) whose sub-tabs are discovered over postMessage. const hubEntry = await page.evaluate(() => { const ctx = (globalThis as any).__VITE_DEVTOOLS_CLIENT_CONTEXT__ return ctx.docks.entries.find((entry: any) => entry.id === 'nuxt:devtools') @@ -31,10 +33,24 @@ test('registers a single `Nuxt` group with `nuxt:devtools` as its default child' id: 'nuxt:devtools', type: 'iframe', groupId: 'nuxt', + frameId: 'nuxt:devtools', + subTabs: { protocol: 'postmessage' }, }) - // Opening the hub (already driven by `openDevTools()` via `switchEntry`) - // still hydrates the full SideNav. - await expect(devtoolsFrame().locator('#nuxt-devtools-side-nav')) - .toBeVisible({ timeout: 30_000 }) + // Opening the anchor (driven by `openDevTools()`) starts the client's + // `devframe:frame-nav` shim, which announces one member dock per enabled tab + // (plus Settings). Those members share the anchor's iframe and soft-navigate. + await page.waitForFunction(() => { + const ctx = (globalThis as any).__VITE_DEVTOOLS_CLIENT_CONTEXT__ + return ctx.docks.entries.some((entry: any) => String(entry.id).startsWith('nuxt:devtools:')) + }, null, { timeout: 30_000 }) + + const memberIds = await page.evaluate(() => { + const ctx = (globalThis as any).__VITE_DEVTOOLS_CLIENT_CONTEXT__ + return ctx.docks.entries + .filter((entry: any) => String(entry.id).startsWith('nuxt:devtools:')) + .map((entry: any) => entry.id) + }) + expect(memberIds).toContain('nuxt:devtools:settings') + expect(memberIds.length).toBeGreaterThan(1) }) From 76808fce9bbd8356b9a861d62f7ad6d0e0c62f13 Mon Sep 17 00:00:00 2001 From: "Anthony Fu (via agent)" Date: Fri, 24 Jul 2026 04:35:21 +0000 Subject: [PATCH 08/10] feat(devtools): upgrade Vite DevTools to 0.4.6; Nuxt category order + embedded settings - Upgrade @vitejs/devtools + @vitejs/devtools-kit to ^0.4.6 and @devframes/hub + devframe to ^0.7.12. - Set `categoryOrder` on the Nuxt dock group (vitejs/devtools#468) so the in-group sub-categories sort in Nuxt's own order (app, vue-devtools, analyze, server, modules, documentation, advanced) instead of the shared default table. Default uncategorised tabs to `app` in the frame-nav manifest to match. - Hide settings that are redundant when embedded (owned by the Vite DevTools dock): the tab visibility/order panel, the color-mode toggle, the SideNav options, and the close-on-outside-click toggle. --- .../devtools/client/composables/frame-nav.ts | 4 +- packages/devtools/client/pages/settings.vue | 51 +-- packages/devtools/src/module-main.ts | 14 + pnpm-lock.yaml | 290 +++++++++--------- pnpm-workspace.yaml | 8 +- 5 files changed, 196 insertions(+), 171 deletions(-) diff --git a/packages/devtools/client/composables/frame-nav.ts b/packages/devtools/client/composables/frame-nav.ts index 6846917a0a..e4bb767d42 100644 --- a/packages/devtools/client/composables/frame-nav.ts +++ b/packages/devtools/client/composables/frame-nav.ts @@ -77,7 +77,9 @@ export function setupFrameNav(): void { id: tab.name, title: tab.title ?? tab.name, icon: normalizeIcon(tab.icon), - category: tab.category, + // Mirror `getCategorizedTabs`: an uncategorised tab belongs to `app`, so + // the `Nuxt` group's `categoryOrder` weights apply to it. + category: tab.category || 'app', navTarget: { path: tabPath(tab) }, })), SETTINGS_TAB, diff --git a/packages/devtools/client/pages/settings.vue b/packages/devtools/client/pages/settings.vue index 9eb1ecfe14..78c0ce1142 100644 --- a/packages/devtools/client/pages/settings.vue +++ b/packages/devtools/client/pages/settings.vue @@ -2,6 +2,7 @@ import { watchEffect } from 'vue' import { definePageMeta } from '#imports' import { useClient } from '~/composables/client' +import { isEmbedded } from '~/composables/embed' import { rpc } from '~/composables/rpc' import { getCategorizedTabs, useAllTabs } from '~/composables/state-tabs' import { telemetryEnabled } from '~/composables/telemetry' @@ -115,7 +116,8 @@ watchEffect(() => { text="DevTools Settings" />
-
+ +

Tabs

@@ -175,38 +177,45 @@ watchEffect(() => { Appearance -
- - -
{{ isDark.value ? 'Dark' : 'Light' }} - - -
-
+ +

UI Scale

-
- - - Expand Sidebar - - - - - Scrollable Sidebar - - + +

Features

- + + Close DevTools when clicking outside