@object-ui/app-shell 5.4.1 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,74 @@
1
1
  # @object-ui/app-shell — Changelog
2
2
 
3
+ ## 6.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - 168a4d0: ai
8
+
9
+ ### Patch Changes
10
+
11
+ - 451bbee: **HITL conversation loop:** `useHitlInChat` now accepts a
12
+ `continueConversation(prompt, ctx)` callback. After the operator approves
13
+ or rejects a tool call from inline chat buttons, the hook synthesises a
14
+ short follow-up user prompt (tagged `[HITL pa_xxx]`, with the executed
15
+ result or rejection reason) and invokes the callback so the LLM
16
+ continues the conversation with full awareness of the outcome.
17
+
18
+ `ConsoleFloatingChatbot` wires this callback to `useObjectChat`'s
19
+ `sendMessage`, closing the loop end-to-end. Execution failures stay
20
+ visible in the inline status badge but do NOT continue automatically —
21
+ the operator decides next steps.
22
+
23
+ No framework changes required. Internal `idMap` now also tracks the
24
+ tool name so the synthesised prompt is human-readable. New test suite
25
+ `useHitlInChat.test.tsx` covers approve/reject/failed/no-callback
26
+ branches.
27
+
28
+ - Updated dependencies [451bbee]
29
+ - @object-ui/plugin-chatbot@6.0.0
30
+ - @object-ui/types@6.0.0
31
+ - @object-ui/core@6.0.0
32
+ - @object-ui/i18n@6.0.0
33
+ - @object-ui/react@6.0.0
34
+ - @object-ui/components@6.0.0
35
+ - @object-ui/fields@6.0.0
36
+ - @object-ui/layout@6.0.0
37
+ - @object-ui/data-objectstack@6.0.0
38
+ - @object-ui/auth@6.0.0
39
+ - @object-ui/permissions@6.0.0
40
+ - @object-ui/plugin-calendar@6.0.0
41
+ - @object-ui/plugin-charts@6.0.0
42
+ - @object-ui/plugin-dashboard@6.0.0
43
+ - @object-ui/plugin-designer@6.0.0
44
+ - @object-ui/plugin-detail@6.0.0
45
+ - @object-ui/plugin-form@6.0.0
46
+ - @object-ui/plugin-grid@6.0.0
47
+ - @object-ui/plugin-kanban@6.0.0
48
+ - @object-ui/plugin-list@6.0.0
49
+ - @object-ui/plugin-report@6.0.0
50
+ - @object-ui/plugin-view@6.0.0
51
+ - @object-ui/collaboration@6.0.0
52
+ - @object-ui/providers@6.0.0
53
+
54
+ ## 5.4.2
55
+
56
+ ### Patch Changes
57
+
58
+ - 3efeecf: ai
59
+ - @object-ui/types@5.4.2
60
+ - @object-ui/core@5.4.2
61
+ - @object-ui/i18n@5.4.2
62
+ - @object-ui/react@5.4.2
63
+ - @object-ui/components@5.4.2
64
+ - @object-ui/fields@5.4.2
65
+ - @object-ui/layout@5.4.2
66
+ - @object-ui/data-objectstack@5.4.2
67
+ - @object-ui/auth@5.4.2
68
+ - @object-ui/permissions@5.4.2
69
+ - @object-ui/collaboration@5.4.2
70
+ - @object-ui/providers@5.4.2
71
+
3
72
  ## 5.4.1
4
73
 
5
74
  ### Patch Changes
@@ -8,13 +8,13 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
8
8
  *
9
9
  * @module
10
10
  */
11
- import { useEffect, Suspense, lazy } from 'react';
11
+ import { useEffect } from 'react';
12
12
  import { useNavigationContext } from '../../context/NavigationContext';
13
13
  import { AppHeader } from '../../layout/AppHeader';
14
14
  import { useDiscovery } from '@object-ui/react';
15
- // Lazy-load the chatbot so its heavy markdown deps stay out of the initial
16
- // paint until the AI assistant is actually enabled.
17
- const ConsoleFloatingChatbot = lazy(() => import('../../layout/ConsoleFloatingChatbot'));
15
+ // Lightweight FAB stub the heavy chat chunk graph only downloads on
16
+ // first hover/click. See ../../layout/ConsoleChatbotFab.tsx.
17
+ import { ConsoleChatbotFab } from '../../layout/ConsoleChatbotFab';
18
18
  export function HomeLayout({ children }) {
19
19
  const { setContext } = useNavigationContext();
20
20
  const { isAiEnabled } = useDiscovery();
@@ -26,5 +26,5 @@ export function HomeLayout({ children }) {
26
26
  useEffect(() => {
27
27
  setContext('home');
28
28
  }, [setContext]);
29
- return (_jsxs("div", { className: "flex min-h-svh w-full flex-col bg-background", "data-testid": "home-layout", children: [_jsx("header", { className: "sticky top-0 z-30 flex h-14 w-full shrink-0 items-center gap-2 border-b bg-background px-2 sm:px-4", children: _jsx(AppHeader, { variant: "home" }) }), _jsx("main", { className: "flex-1 min-w-0 overflow-auto pb-20 sm:pb-0", children: children }), showChatbot && (_jsx(Suspense, { fallback: null, children: _jsx(ConsoleFloatingChatbot, { appLabel: "Workspace", objects: [] }) }))] }));
29
+ return (_jsxs("div", { className: "flex min-h-svh w-full flex-col bg-background", "data-testid": "home-layout", children: [_jsx("header", { className: "sticky top-0 z-30 flex h-14 w-full shrink-0 items-center gap-2 border-b bg-background px-2 sm:px-4", children: _jsx(AppHeader, { variant: "home" }) }), _jsx("main", { className: "flex-1 min-w-0 overflow-auto pb-20 sm:pb-0", children: children }), showChatbot && _jsx(ConsoleChatbotFab, { appLabel: "Workspace", objects: [] })] }));
30
30
  }
@@ -14,6 +14,7 @@ import { useAuth } from '@object-ui/auth';
14
14
  import { useObjectTranslation } from '@object-ui/i18n';
15
15
  import { useNavigate } from 'react-router-dom';
16
16
  import { CreateWorkspaceDialog } from './CreateWorkspaceDialog';
17
+ import { resolveHomeUrl } from './resolveHomeUrl';
17
18
  function getOrgInitials(name) {
18
19
  return name
19
20
  .split(/[\s_-]+/)
@@ -42,9 +43,7 @@ export function OrganizationsPage() {
42
43
  if (org.id !== activeOrganization?.id) {
43
44
  await switchOrganization(org.id);
44
45
  }
45
- const base = import.meta.env.BASE_URL || '/';
46
- const normalizedBase = base.endsWith('/') ? base : `${base}/`;
47
- window.location.href = `${window.location.origin}${normalizedBase}home`;
46
+ window.location.href = resolveHomeUrl();
48
47
  }
49
48
  catch (err) {
50
49
  console.error('[OrganizationsPage] Failed to switch:', err);
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Resolve the absolute URL of the console "home" route used after switching
3
+ * the active organization.
4
+ *
5
+ * Earlier versions concatenated `import.meta.env.BASE_URL` to
6
+ * `window.location.origin` ("`${origin}${base}home`"). That was correct for
7
+ * apps built with an absolute Vite base (e.g. `base: '/_console/'`), but
8
+ * silently broken for portable builds that ship with `base: './'` — the
9
+ * resulting URL `https://host./home` has a trailing-dot host (`host.` is a
10
+ * fully-qualified-domain marker the browser keeps) AND drops the mount
11
+ * prefix, landing the user on a 404.
12
+ *
13
+ * The fix is to resolve `home` against `document.baseURI`, which already
14
+ * accounts for any `<base href="...">` injected by the host page. This works
15
+ * for both `<base href="/_console/">` (tenant deployments) and
16
+ * `<base href="/">` (root-mount deployments), and also for hosts that omit
17
+ * `<base>` entirely (falls back to the current document URL's directory).
18
+ */
19
+ export declare function resolveHomeUrl(baseURI?: string): string;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Resolve the absolute URL of the console "home" route used after switching
3
+ * the active organization.
4
+ *
5
+ * Earlier versions concatenated `import.meta.env.BASE_URL` to
6
+ * `window.location.origin` ("`${origin}${base}home`"). That was correct for
7
+ * apps built with an absolute Vite base (e.g. `base: '/_console/'`), but
8
+ * silently broken for portable builds that ship with `base: './'` — the
9
+ * resulting URL `https://host./home` has a trailing-dot host (`host.` is a
10
+ * fully-qualified-domain marker the browser keeps) AND drops the mount
11
+ * prefix, landing the user on a 404.
12
+ *
13
+ * The fix is to resolve `home` against `document.baseURI`, which already
14
+ * accounts for any `<base href="...">` injected by the host page. This works
15
+ * for both `<base href="/_console/">` (tenant deployments) and
16
+ * `<base href="/">` (root-mount deployments), and also for hosts that omit
17
+ * `<base>` entirely (falls back to the current document URL's directory).
18
+ */
19
+ export function resolveHomeUrl(baseURI = document.baseURI) {
20
+ return new URL('home', baseURI).toString();
21
+ }
@@ -0,0 +1,3 @@
1
+ import type { ConsoleFloatingChatbotProps } from './ConsoleFloatingChatbot';
2
+ export type ConsoleChatbotFabProps = ConsoleFloatingChatbotProps;
3
+ export declare function ConsoleChatbotFab(props: ConsoleChatbotFabProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,30 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * ConsoleChatbotFab
4
+ *
5
+ * Lightweight FAB proxy for the console's floating AI assistant.
6
+ *
7
+ * Before any interaction this component renders a small, zero-dependency
8
+ * button (~1KB). On first hover/focus it speculatively warms the heavy
9
+ * chat chunk graph (plugin-chatbot → streamdown → shiki → mermaid →
10
+ * @ai-sdk, ~20MB); on first click it lazy-mounts `<ConsoleFloatingChatbot
11
+ * defaultOpen />` which takes over (its own FAB replaces this stub).
12
+ *
13
+ * Net effect: every console page-load no longer pays the chat-bundle
14
+ * cost just for the FAB to be visible — those bytes only download when
15
+ * the user actually opens (or hovers) the assistant.
16
+ *
17
+ * @module
18
+ */
19
+ import { Suspense, lazy, useState } from 'react';
20
+ const ConsoleFloatingChatbot = lazy(() => import('./ConsoleFloatingChatbot'));
21
+ const prefetchChatbot = () => {
22
+ void import('./ConsoleFloatingChatbot');
23
+ };
24
+ export function ConsoleChatbotFab(props) {
25
+ const [armed, setArmed] = useState(false);
26
+ if (armed) {
27
+ return (_jsx(Suspense, { fallback: null, children: _jsx(ConsoleFloatingChatbot, { ...props, defaultOpen: true }) }));
28
+ }
29
+ return (_jsx("button", { type: "button", "aria-label": `Open ${props.appLabel} assistant`, onClick: () => setArmed(true), onMouseEnter: prefetchChatbot, onFocus: prefetchChatbot, className: "fixed bottom-6 right-6 z-50 flex h-14 w-14 items-center justify-center rounded-full bg-primary text-primary-foreground shadow-lg ring-1 ring-primary/20 transition-transform hover:scale-105 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2", children: _jsxs("svg", { width: "22", height: "22", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [_jsx("path", { d: "M12 3v3" }), _jsx("path", { d: "M12 18v3" }), _jsx("path", { d: "M5.6 5.6l2.1 2.1" }), _jsx("path", { d: "M16.3 16.3l2.1 2.1" }), _jsx("path", { d: "M3 12h3" }), _jsx("path", { d: "M18 12h3" }), _jsx("path", { d: "M5.6 18.4l2.1-2.1" }), _jsx("path", { d: "M16.3 7.7l2.1-2.1" }), _jsx("circle", { cx: "12", cy: "12", r: "3" })] }) }));
30
+ }
@@ -12,6 +12,8 @@ export interface ConsoleFloatingChatbotProps {
12
12
  apiBase?: string;
13
13
  /** Default agent name to select on first render. */
14
14
  defaultAgent?: string;
15
+ /** Whether the floating panel should open immediately on mount. */
16
+ defaultOpen?: boolean;
15
17
  }
16
- export default function ConsoleFloatingChatbot({ appLabel, objects, apiBase: apiBaseProp, defaultAgent: defaultAgentProp, }: ConsoleFloatingChatbotProps): import("react/jsx-runtime").JSX.Element;
18
+ export default function ConsoleFloatingChatbot({ appLabel, objects, apiBase: apiBaseProp, defaultAgent: defaultAgentProp, defaultOpen, }: ConsoleFloatingChatbotProps): import("react/jsx-runtime").JSX.Element;
17
19
  export {};
@@ -12,7 +12,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
12
12
  * @module
13
13
  */
14
14
  import React from 'react';
15
- import { FloatingChatbot, useObjectChat, useAgents, } from '@object-ui/plugin-chatbot';
15
+ import { FloatingChatbot, useObjectChat, useAgents, useHitlInChat, } from '@object-ui/plugin-chatbot';
16
16
  import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@object-ui/components';
17
17
  const DEFAULT_AI_PATH = '/api/v1/ai';
18
18
  function resolveApiBase(explicit) {
@@ -25,7 +25,7 @@ function resolveApiBase(explicit) {
25
25
  const serverUrl = env.VITE_SERVER_URL ?? '';
26
26
  return `${serverUrl.replace(/\/$/, '')}${DEFAULT_AI_PATH}`;
27
27
  }
28
- function ChatbotInner({ appLabel, objects, agents, agentsLoading, agentsError, activeAgent, onAgentChange, chatApi, }) {
28
+ function ChatbotInner({ appLabel, objects, agents, agentsLoading, agentsError, activeAgent, onAgentChange, chatApi, apiBase, defaultOpen = false, }) {
29
29
  const objectNames = objects.map((o) => o.label || o.name).join(', ');
30
30
  const activeAgentLabel = React.useMemo(() => {
31
31
  const found = agents.find((a) => a.name === activeAgent);
@@ -59,10 +59,22 @@ function ChatbotInner({ appLabel, objects, agents, agentsLoading, agentsError, a
59
59
  : "Thanks for your message! I'm here to help you navigate and manage your data.",
60
60
  autoResponseDelay: 600,
61
61
  });
62
+ // HITL bridge — turns the pending-approval tool result envelope from the
63
+ // framework's action-tools.ts into inline approve/reject buttons that talk
64
+ // directly to /api/v1/ai/pending-actions/:id/{approve,reject}. After a
65
+ // successful decision the hook synthesises a short follow-up user message
66
+ // so the LLM continues the conversation aware of the outcome.
67
+ const hitl = useHitlInChat({
68
+ messages: messages,
69
+ apiBase,
70
+ continueConversation: (prompt) => {
71
+ sendMessage(prompt);
72
+ },
73
+ });
62
74
  const headerExtra = agents.length > 0 ? (_jsxs(Select, { value: activeAgent, onValueChange: onAgentChange, disabled: agentsLoading, children: [_jsx(SelectTrigger, { className: "h-7 w-[180px] text-xs", "data-testid": "floating-chatbot-agent-picker", children: _jsx(SelectValue, { placeholder: "Choose agent..." }) }), _jsx(SelectContent, { align: "end", children: agents.map((agent) => (_jsxs(SelectItem, { value: agent.name, className: "text-xs", children: [_jsx("span", { className: "font-medium", children: agent.label }), agent.description ? (_jsx("span", { className: "block text-muted-foreground text-[10px] truncate max-w-[220px]", children: agent.description })) : null] }, agent.name))) })] })) : null;
63
75
  return (_jsx(FloatingChatbot, { floatingConfig: {
64
76
  position: 'bottom-right',
65
- defaultOpen: false,
77
+ defaultOpen,
66
78
  panelWidth: 420,
67
79
  panelHeight: 560,
68
80
  title: `${appLabel} Assistant`,
@@ -71,9 +83,9 @@ function ChatbotInner({ appLabel, objects, agents, agentsLoading, agentsError, a
71
83
  ? `Ask ${activeAgentLabel}...`
72
84
  : agentsLoading
73
85
  ? 'Loading agents...'
74
- : 'Ask anything...', onSendMessage: (content) => sendMessage(content), onClear: clear, onStop: isLoading ? stop : undefined, onReload: reload, isLoading: isLoading, error: error, enableMarkdown: true }));
86
+ : 'Ask anything...', onSendMessage: (content) => sendMessage(content), onClear: clear, onStop: isLoading ? stop : undefined, onReload: reload, isLoading: isLoading, error: error, enableMarkdown: true, onToolApprove: hitl.decide, toolDecisions: hitl.decisions, toolApproveLabel: "Approve & run", toolDenyLabel: "Reject", toolDenyReason: "Operator rejected from chat" }));
75
87
  }
76
- export default function ConsoleFloatingChatbot({ appLabel, objects, apiBase: apiBaseProp, defaultAgent: defaultAgentProp, }) {
88
+ export default function ConsoleFloatingChatbot({ appLabel, objects, apiBase: apiBaseProp, defaultAgent: defaultAgentProp, defaultOpen = false, }) {
77
89
  const apiBase = React.useMemo(() => resolveApiBase(apiBaseProp), [apiBaseProp]);
78
90
  const env = import.meta.env ?? {};
79
91
  const envDefaultAgent = env.VITE_AI_DEFAULT_AGENT;
@@ -92,5 +104,5 @@ export default function ConsoleFloatingChatbot({ appLabel, objects, apiBase: api
92
104
  // `key` forces a clean remount whenever the active agent (and therefore the
93
105
  // chat API URL) changes — required because `useObjectChat` locks its mode
94
106
  // (api vs local) on first render.
95
- return (_jsx(ChatbotInner, { appLabel: appLabel, objects: objects, agents: agents, agentsLoading: agentsLoading, agentsError: agentsError, activeAgent: activeAgent, onAgentChange: setActiveAgent, chatApi: chatApi }, chatApi ?? 'local'));
107
+ return (_jsx(ChatbotInner, { appLabel: appLabel, objects: objects, agents: agents, agentsLoading: agentsLoading, agentsError: agentsError, activeAgent: activeAgent, onAgentChange: setActiveAgent, chatApi: chatApi, apiBase: apiBase, defaultOpen: defaultOpen }, chatApi ?? 'local'));
96
108
  }
@@ -8,12 +8,13 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
8
8
  * Sets navigation context to 'app' for app-specific routes.
9
9
  * @module
10
10
  */
11
- import { useEffect, Suspense, lazy } from 'react';
11
+ import { useEffect } from 'react';
12
12
  import { AppShell } from '@object-ui/layout';
13
13
  import { useDiscovery } from '@object-ui/react';
14
- // Lazy-load the chatbot so its heavy markdown deps (~150 KB) stay out of
15
- // the initial paint until the AI assistant is actually enabled.
16
- const ConsoleFloatingChatbot = lazy(() => import('./ConsoleFloatingChatbot'));
14
+ // Lightweight FAB stub the heavy chat chunk graph (plugin-chatbot,
15
+ // shiki, streamdown, mermaid, @ai-sdk, ~20MB) only downloads on first
16
+ // hover/click. See ConsoleChatbotFab.tsx.
17
+ import { ConsoleChatbotFab } from './ConsoleChatbotFab';
17
18
  import { UnifiedSidebar } from './UnifiedSidebar';
18
19
  import { AppHeader } from './AppHeader';
19
20
  import { MobileViewSwitcherProvider } from './MobileViewSwitcherContext';
@@ -50,5 +51,5 @@ export function ConsoleLayout({ children, activeAppName, activeApp, onAppChange,
50
51
  ? `${resolveI18nLabel(activeApp.label)} — ObjectStack Console`
51
52
  : undefined,
52
53
  }
53
- : undefined, children: [_jsx(ConsoleLayoutInner, { children: children }), showChatbot && (_jsx(Suspense, { fallback: null, children: _jsx(ConsoleFloatingChatbot, { appLabel: appLabel, objects: objects }) }))] }) }));
54
+ : undefined, children: [_jsx(ConsoleLayoutInner, { children: children }), showChatbot && (_jsx(ConsoleChatbotFab, { appLabel: appLabel, objects: objects }))] }) }));
54
55
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@object-ui/app-shell",
3
- "version": "5.4.1",
3
+ "version": "6.0.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "Minimal application shell for ObjectUI - framework-agnostic rendering engine",
@@ -28,35 +28,35 @@
28
28
  "@sentry/react": "^8.55.2",
29
29
  "lucide-react": "^1.16.0",
30
30
  "sonner": "^2.0.7",
31
- "@object-ui/auth": "5.4.1",
32
- "@object-ui/collaboration": "5.4.1",
33
- "@object-ui/components": "5.4.1",
34
- "@object-ui/core": "5.4.1",
35
- "@object-ui/data-objectstack": "5.4.1",
36
- "@object-ui/fields": "5.4.1",
37
- "@object-ui/i18n": "5.4.1",
38
- "@object-ui/layout": "5.4.1",
39
- "@object-ui/permissions": "5.4.1",
40
- "@object-ui/providers": "5.4.1",
41
- "@object-ui/react": "5.4.1",
42
- "@object-ui/types": "5.4.1"
31
+ "@object-ui/auth": "6.0.0",
32
+ "@object-ui/collaboration": "6.0.0",
33
+ "@object-ui/components": "6.0.0",
34
+ "@object-ui/core": "6.0.0",
35
+ "@object-ui/data-objectstack": "6.0.0",
36
+ "@object-ui/fields": "6.0.0",
37
+ "@object-ui/i18n": "6.0.0",
38
+ "@object-ui/layout": "6.0.0",
39
+ "@object-ui/permissions": "6.0.0",
40
+ "@object-ui/providers": "6.0.0",
41
+ "@object-ui/react": "6.0.0",
42
+ "@object-ui/types": "6.0.0"
43
43
  },
44
44
  "peerDependencies": {
45
45
  "react": "^18.0.0 || ^19.0.0",
46
46
  "react-dom": "^18.0.0 || ^19.0.0",
47
47
  "react-router-dom": "^6.0.0 || ^7.0.0",
48
- "@object-ui/plugin-calendar": "^5.4.1",
49
- "@object-ui/plugin-charts": "^5.4.1",
50
- "@object-ui/plugin-chatbot": "^5.4.1",
51
- "@object-ui/plugin-dashboard": "^5.4.1",
52
- "@object-ui/plugin-designer": "^5.4.1",
53
- "@object-ui/plugin-detail": "^5.4.1",
54
- "@object-ui/plugin-form": "^5.4.1",
55
- "@object-ui/plugin-grid": "^5.4.1",
56
- "@object-ui/plugin-kanban": "^5.4.1",
57
- "@object-ui/plugin-list": "^5.4.1",
58
- "@object-ui/plugin-report": "^5.4.1",
59
- "@object-ui/plugin-view": "^5.4.1"
48
+ "@object-ui/plugin-calendar": "^6.0.0",
49
+ "@object-ui/plugin-charts": "^6.0.0",
50
+ "@object-ui/plugin-chatbot": "^6.0.0",
51
+ "@object-ui/plugin-dashboard": "^6.0.0",
52
+ "@object-ui/plugin-designer": "^6.0.0",
53
+ "@object-ui/plugin-detail": "^6.0.0",
54
+ "@object-ui/plugin-form": "^6.0.0",
55
+ "@object-ui/plugin-grid": "^6.0.0",
56
+ "@object-ui/plugin-kanban": "^6.0.0",
57
+ "@object-ui/plugin-list": "^6.0.0",
58
+ "@object-ui/plugin-report": "^6.0.0",
59
+ "@object-ui/plugin-view": "^6.0.0"
60
60
  },
61
61
  "devDependencies": {
62
62
  "@types/node": "^25.9.0",