@agent-native/dispatch 0.40.0 → 0.40.2
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 +38 -12
- package/dist/actions/provider-api-register.d.ts +7 -7
- package/dist/components/app-open-actions.d.ts +1 -1
- package/dist/components/app-open-actions.d.ts.map +1 -1
- package/dist/components/app-open-actions.js +1 -1
- package/dist/components/app-open-actions.js.map +1 -1
- package/dist/components/app-row-settings.js +1 -1
- package/dist/components/app-row-settings.js.map +1 -1
- package/dist/components/automation-create-dialog.js +2 -2
- package/dist/components/automation-create-dialog.js.map +1 -1
- package/dist/components/automation-details-panel.js +1 -1
- package/dist/components/automation-details-panel.js.map +1 -1
- package/dist/components/chat-home-apps.js +1 -1
- package/dist/components/chat-home-apps.js.map +1 -1
- package/dist/components/create-app-popover.js +3 -3
- package/dist/components/create-app-popover.js.map +1 -1
- package/dist/components/dispatch-control-plane.d.ts.map +1 -1
- package/dist/components/dispatch-control-plane.js +9 -30
- package/dist/components/dispatch-control-plane.js.map +1 -1
- package/dist/components/layout/Header.js +2 -2
- package/dist/components/layout/Header.js.map +1 -1
- package/dist/components/layout/Layout.d.ts +6 -5
- package/dist/components/layout/Layout.d.ts.map +1 -1
- package/dist/components/layout/Layout.js +73 -113
- package/dist/components/layout/Layout.js.map +1 -1
- package/dist/components/layout/workspace-apps-rail.d.ts.map +1 -1
- package/dist/components/layout/workspace-apps-rail.js +7 -19
- package/dist/components/layout/workspace-apps-rail.js.map +1 -1
- package/dist/components/messaging-setup-panel.js +2 -1
- package/dist/components/messaging-setup-panel.js.map +1 -1
- package/dist/components/workspace-app-card.js +2 -2
- package/dist/components/workspace-app-card.js.map +1 -1
- package/dist/components/workspace-app-host.d.ts +1 -1
- package/dist/components/workspace-app-host.d.ts.map +1 -1
- package/dist/components/workspace-app-host.js +7 -74
- package/dist/components/workspace-app-host.js.map +1 -1
- package/dist/hooks/use-navigation-state.js +1 -1
- package/dist/hooks/use-navigation-state.js.map +1 -1
- package/dist/lib/workspace-apps.js +1 -1
- package/dist/lib/workspace-apps.js.map +1 -1
- package/dist/routes/pages/$appId.js +1 -1
- package/dist/routes/pages/$appId.js.map +1 -1
- package/dist/routes/pages/_index.js +1 -1
- package/dist/routes/pages/_index.js.map +1 -1
- package/dist/routes/pages/admin._index.js +1 -1
- package/dist/routes/pages/admin._index.js.map +1 -1
- package/dist/routes/pages/agent-integrations.js +1 -1
- package/dist/routes/pages/agent-integrations.js.map +1 -1
- package/dist/routes/pages/apps.d.ts.map +1 -1
- package/dist/routes/pages/apps.js +3 -43
- package/dist/routes/pages/apps.js.map +1 -1
- package/dist/routes/pages/browser-chat.js +1 -1
- package/dist/routes/pages/browser-chat.js.map +1 -1
- package/dist/routes/pages/chat.d.ts.map +1 -1
- package/dist/routes/pages/chat.js +24 -43
- package/dist/routes/pages/chat.js.map +1 -1
- package/dist/routes/pages/extensions.$id.js +1 -1
- package/dist/routes/pages/extensions.$id.js.map +1 -1
- package/dist/routes/pages/extensions._index.js +1 -1
- package/dist/routes/pages/extensions._index.js.map +1 -1
- package/dist/routes/pages/integrations.js +1 -1
- package/dist/routes/pages/integrations.js.map +1 -1
- package/dist/routes/pages/new-app.js +1 -1
- package/dist/routes/pages/new-app.js.map +1 -1
- package/dist/routes/pages/operations.js +2 -2
- package/dist/routes/pages/operations.js.map +1 -1
- package/dist/routes/pages/overview.d.ts +2 -2
- package/dist/routes/pages/settings.d.ts.map +1 -1
- package/dist/routes/pages/settings.js +26 -8
- package/dist/routes/pages/settings.js.map +1 -1
- package/dist/routes/pages/tools.$id.js +1 -1
- package/dist/routes/pages/tools.$id.js.map +1 -1
- package/dist/routes/pages/tools._index.js +1 -1
- package/dist/routes/pages/tools._index.js.map +1 -1
- package/dist/routes/pages/vault.d.ts +1 -1
- package/dist/routes/pages/vault.js +1 -1
- package/dist/routes/pages/vault.js.map +1 -1
- package/dist/shared/app-roles.js.map +1 -1
- package/package.json +3 -3
- package/src/components/app-open-actions.tsx +1 -1
- package/src/components/app-row-settings.tsx +1 -1
- package/src/components/automation-create-dialog.tsx +7 -7
- package/src/components/automation-details-panel.tsx +1 -1
- package/src/components/chat-home-apps.tsx +1 -1
- package/src/components/create-app-popover.spec.tsx +5 -7
- package/src/components/create-app-popover.tsx +3 -3
- package/src/components/dispatch-control-plane.spec.tsx +12 -19
- package/src/components/dispatch-control-plane.tsx +10 -84
- package/src/components/layout/Header.tsx +2 -2
- package/src/components/layout/Layout.app-chat.spec.ts +1 -0
- package/src/components/layout/Layout.spec.tsx +18 -20
- package/src/components/layout/Layout.tsx +153 -205
- package/src/components/layout/workspace-apps-rail.spec.tsx +79 -0
- package/src/components/layout/workspace-apps-rail.tsx +6 -30
- package/src/components/messaging-setup-panel.tsx +1 -1
- package/src/components/workspace-app-card.tsx +2 -2
- package/src/components/workspace-app-chat-rail.spec.tsx +1 -1
- package/src/components/workspace-app-host.spec.tsx +19 -19
- package/src/components/workspace-app-host.tsx +12 -129
- package/src/hooks/use-navigation-state.ts +1 -1
- package/src/lib/workspace-apps.ts +1 -1
- package/src/routes/pages/$appId.tsx +1 -1
- package/src/routes/pages/_index.tsx +1 -1
- package/src/routes/pages/admin._index.tsx +1 -1
- package/src/routes/pages/agent-integrations.tsx +1 -1
- package/src/routes/pages/apps.tsx +2 -86
- package/src/routes/pages/automations.spec.tsx +1 -1
- package/src/routes/pages/browser-chat.tsx +1 -1
- package/src/routes/pages/chat.spec.tsx +23 -46
- package/src/routes/pages/chat.tsx +20 -57
- package/src/routes/pages/extensions.$id.tsx +1 -1
- package/src/routes/pages/extensions._index.tsx +1 -1
- package/src/routes/pages/integrations.tsx +1 -1
- package/src/routes/pages/new-app.tsx +1 -1
- package/src/routes/pages/operations.tsx +2 -2
- package/src/routes/pages/settings.spec.tsx +30 -8
- package/src/routes/pages/settings.tsx +75 -7
- package/src/routes/pages/tools.$id.tsx +1 -1
- package/src/routes/pages/tools._index.tsx +1 -1
- package/src/routes/pages/vault.tsx +1 -1
- package/src/shared/app-roles.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Layout.d.ts","sourceRoot":"","sources":["../../../src/components/layout/Layout.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"Layout.d.ts","sourceRoot":"","sources":["../../../src/components/layout/Layout.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { CHAT_FIRST_MODE_CHANGED_EVENT,
|
|
2
|
+
import { CHAT_FIRST_MODE_CHANGED_EVENT, chatFirstSurfaceTabId, closeChatFirstSessionWatch, emitChatFirstSessionWatch, getChatFirstSurfaceTabsStore, navigateWithAgentChatViewTransition, readChatFirstAppLayout, readChatFirstMode, resolveChatFirstBrowserTarget, resolveChatFirstAppTarget, subscribeChatFirstOpenBrowser, subscribeChatFirstOpenApp, useChatFirstSessionWatch, useChatFirstSurfacePanel, useChatFirstSurfaceResize, useChatFirstSurfaceTabs, useAgentChatHomeHandoff, useAgentChatHomeHandoffLinks, useChatThreads, } from "@agent-native/core/client/agent-chat";
|
|
3
3
|
import { appBasePath, appPath } from "@agent-native/core/client/api-path";
|
|
4
4
|
import { readClientAppState, writeClientAppState, } from "@agent-native/core/client/application-state";
|
|
5
|
-
import {
|
|
6
|
-
import { writeClipboardText } from "@agent-native/core/client/clipboard";
|
|
5
|
+
import { useFeatureFlagState, } from "@agent-native/core/client/feature-flags";
|
|
7
6
|
import { useActionQuery } from "@agent-native/core/client/hooks";
|
|
8
7
|
import { useT } from "@agent-native/core/client/i18n";
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
8
|
+
import { SETTINGS_REDESIGN_FLAG } from "@agent-native/core/feature-flags/registry";
|
|
9
|
+
import { AgentChatSurface, AgentToggleButton, AgentSidebar, focusAgentChat, } from "@agent-native/toolkit/app/chat";
|
|
10
|
+
import { ChatFirstSurfacePanelToggle } from "@agent-native/toolkit/app/chat/chat-first";
|
|
11
|
+
import { ChatFirstAgentsPane, ChatFirstAppPane, ChatFirstAppsRail, ChatFirstBrowserPane, ChatFirstChatHistory, ChatFirstPrimaryNavigation, ChatFirstSessionWatchPane, ChatFirstSurfacePanel, ChatFirstSurfaceContent, ChatFirstSurfaceTabs, defaultChatFirstCopy, } from "@agent-native/toolkit/app/chat/chat-first";
|
|
12
|
+
import { FeedbackButton } from "@agent-native/toolkit/app/feedback";
|
|
13
|
+
import { InvitationBanner, OrgSwitcher } from "@agent-native/toolkit/app/org";
|
|
14
|
+
import { RunsTray } from "@agent-native/toolkit/app/progress";
|
|
15
|
+
import { isSettingsPathname } from "@agent-native/toolkit/app/settings";
|
|
16
|
+
import { AppSidebarFooter, AppSidebarHeader, openCommandMenu, } from "@agent-native/toolkit/app/shared";
|
|
14
17
|
import { ChatHistoryRail, } from "@agent-native/toolkit/chat-history";
|
|
18
|
+
import { writeClipboardText } from "@agent-native/toolkit/clipboard";
|
|
15
19
|
import { IconApps, IconBrandSlack, IconBrandTelegram, IconCopy, IconEye, IconHierarchy2, IconMessageQuestion, IconBroadcast, IconLayoutSidebar, IconLayoutSidebarLeftCollapse, IconLayoutSidebarLeftExpand, IconSettings, IconShield, IconWorld, IconDeviceDesktop, IconPlus, } from "@tabler/icons-react";
|
|
16
20
|
import { createContext, useEffect, useMemo, useRef, useState, useContext, useCallback, } from "react";
|
|
17
21
|
import { Link, useLocation, useNavigate } from "react-router";
|
|
@@ -19,7 +23,7 @@ import { toast } from "sonner";
|
|
|
19
23
|
import { useIsMobile } from "../../hooks/use-mobile.js";
|
|
20
24
|
import { cn } from "../../lib/utils.js";
|
|
21
25
|
import { normalizeWorkspaceAppLayout } from "../../lib/workspace-app-layout.js";
|
|
22
|
-
import { isDispatchWorkspaceAppId, isPathMountedWorkspaceApp, isWorkspaceAppVisibleInDefaultLaunchers, isWorkspaceSsoApp,
|
|
26
|
+
import { isDispatchWorkspaceAppId, isPathMountedWorkspaceApp, isWorkspaceAppVisibleInDefaultLaunchers, isWorkspaceSsoApp, navigateToWorkspaceApp, shouldOpenWorkspaceAppInTopWindow, workspaceAppIdFromRoute, workspaceAppDirectHref, workspaceAppDirectLaunchHref, workspaceAppRoute, workspaceAppTargetPath, } from "../../lib/workspace-apps.js";
|
|
23
27
|
import { CHAT_FIRST_PANE_STATE_KEY } from "../../shared/chat-first-pane.js";
|
|
24
28
|
import { AppIcon } from "../app-icon.js";
|
|
25
29
|
import { CreateAppPopover } from "../create-app-popover.js";
|
|
@@ -137,11 +141,13 @@ export function shouldQueryChatFirstApps(isChatRoute, chatFirstMode) {
|
|
|
137
141
|
return isChatRoute || chatFirstMode;
|
|
138
142
|
}
|
|
139
143
|
/**
|
|
140
|
-
* Settings brings its own navigation, header, and agent
|
|
141
|
-
* full width.
|
|
144
|
+
* The redesigned Settings brings its own navigation, header, and agent
|
|
145
|
+
* toggle, so it renders full width. While the flag loads it shows the
|
|
146
|
+
* shell's skeleton, which needs the same frame.
|
|
142
147
|
*/
|
|
143
|
-
export function
|
|
144
|
-
return isSettingsPathname(localDispatchPath(pathname))
|
|
148
|
+
export function isRedesignedSettingsPath(pathname, settingsRedesign) {
|
|
149
|
+
return (isSettingsPathname(localDispatchPath(pathname)) &&
|
|
150
|
+
(settingsRedesign.enabled || settingsRedesign.status === "loading"));
|
|
145
151
|
}
|
|
146
152
|
function chatFirstPrimaryTabForPath(pathname) {
|
|
147
153
|
if (pathname === "/chat" || pathname.startsWith("/chat/")) {
|
|
@@ -657,7 +663,7 @@ export function Layout({ children, extensions, agentPageHref, brandName, brandIc
|
|
|
657
663
|
? isElectronEmbeddedSearch(window.location.search)
|
|
658
664
|
: false);
|
|
659
665
|
const isChatRoute = localPathname === "/chat" || localPathname.startsWith("/chat/");
|
|
660
|
-
const
|
|
666
|
+
const isRedesignedSettingsRoute = isRedesignedSettingsPath(location.pathname, useFeatureFlagState(SETTINGS_REDESIGN_FLAG.key));
|
|
661
667
|
const chatFirstSurfaceScope = threadIdFromPath(localPathname) ?? "new";
|
|
662
668
|
const isWorkspaceAppRoute = shouldAutoCollapseDispatchSidebar(location.pathname);
|
|
663
669
|
const workspaceAppId = isWorkspaceAppRoute
|
|
@@ -683,61 +689,31 @@ export function Layout({ children, extensions, agentPageHref, brandName, brandIc
|
|
|
683
689
|
}, [electronEmbedded, location.pathname, location.search]);
|
|
684
690
|
const [chatFirstAppLayout, setChatFirstAppLayout] = useState(() => normalizeWorkspaceAppLayout(readChatFirstAppLayout()));
|
|
685
691
|
const chatFirstAppLayoutHydratedRef = useRef(false);
|
|
686
|
-
const chatFirstAppsQuery = useActionQuery("list-workspace-apps", { includeAgentCards: false, includeArchived: true }, {
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
const
|
|
691
|
-
?.filter((app) => app.source === "builtin")
|
|
692
|
-
.map((app) => app.id), [chatFirstConnectedAppsQuery.data]);
|
|
693
|
-
const chatFirstWorkspaceApps = useMemo(() => mergeChatFirstWorkspaceApps(chatFirstAppsQuery.data, chatFirstEnabledBuiltinAppIds), [chatFirstAppsQuery.data, chatFirstEnabledBuiltinAppIds]);
|
|
694
|
-
const chatHomeWorkspaceApps = useMemo(() => mergeChatFirstWorkspaceApps(chatFirstWorkspaceApps, chatFirstEnabledBuiltinAppIds, chatFirstConnectedAppsQuery.data?.map((app) => ({
|
|
695
|
-
id: app.id,
|
|
696
|
-
name: app.name,
|
|
697
|
-
description: app.description,
|
|
698
|
-
url: app.homeUrl?.trim() || app.url,
|
|
699
|
-
source: workspaceAppSourceFromConnected(app.source),
|
|
700
|
-
}))).filter((app) => app.status !== "pending" &&
|
|
692
|
+
const chatFirstAppsQuery = useActionQuery("list-workspace-apps", { includeAgentCards: false, includeArchived: true }, {
|
|
693
|
+
enabled: shouldQueryChatFirstApps(isChatRoute, chatFirstMode) ||
|
|
694
|
+
workspaceAppRouteActive,
|
|
695
|
+
});
|
|
696
|
+
const chatFirstWorkspaceApps = useMemo(() => (chatFirstAppsQuery.data ?? []).filter((app) => app.status !== "pending" &&
|
|
701
697
|
app.archived !== true &&
|
|
702
|
-
isWorkspaceAppVisibleInDefaultLaunchers(app)), [
|
|
703
|
-
chatFirstConnectedAppsQuery.data,
|
|
704
|
-
chatFirstEnabledBuiltinAppIds,
|
|
705
|
-
chatFirstWorkspaceApps,
|
|
706
|
-
]);
|
|
698
|
+
isWorkspaceAppVisibleInDefaultLaunchers(app)), [chatFirstAppsQuery.data]);
|
|
707
699
|
const chatFirstAppRegistrations = useMemo(() => {
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
const id = app.id.trim().toLowerCase();
|
|
722
|
-
if (!id || registrations.has(id))
|
|
723
|
-
continue;
|
|
724
|
-
registrations.set(id, {
|
|
725
|
-
id,
|
|
726
|
-
name: app.name,
|
|
727
|
-
source: workspaceAppSourceFromConnected(app.source),
|
|
728
|
-
url: app.homeUrl?.trim() || app.url,
|
|
729
|
-
enabled: true,
|
|
730
|
-
});
|
|
731
|
-
}
|
|
732
|
-
return [...registrations.values()];
|
|
733
|
-
}, [chatFirstConnectedAppsQuery.data, chatFirstWorkspaceApps]);
|
|
734
|
-
const chatFirstAppItems = useMemo(() => chatFirstAppRegistrations
|
|
735
|
-
.filter((app) => app.enabled && isWorkspaceAppVisibleInDefaultLaunchers(app))
|
|
736
|
-
.map((app) => ({
|
|
700
|
+
return (chatFirstAppsQuery.data ?? [])
|
|
701
|
+
.filter((app) => app.status !== "pending" && app.archived !== true)
|
|
702
|
+
.map((app) => ({
|
|
703
|
+
id: app.id,
|
|
704
|
+
name: app.name,
|
|
705
|
+
source: app.source ?? "workspace",
|
|
706
|
+
path: app.path,
|
|
707
|
+
url: app.url,
|
|
708
|
+
homePath: app.homePath,
|
|
709
|
+
enabled: true,
|
|
710
|
+
}));
|
|
711
|
+
}, [chatFirstAppsQuery.data]);
|
|
712
|
+
const chatFirstAppItems = useMemo(() => chatFirstWorkspaceApps.map((app) => ({
|
|
737
713
|
id: app.id,
|
|
738
|
-
name: app.name
|
|
739
|
-
source: app.source,
|
|
740
|
-
})), [
|
|
714
|
+
name: app.name,
|
|
715
|
+
source: app.source ?? "workspace",
|
|
716
|
+
})), [chatFirstWorkspaceApps]);
|
|
741
717
|
const openChatFirstApp = useCallback((app) => {
|
|
742
718
|
if (isDispatchWorkspaceAppId(app.id))
|
|
743
719
|
return;
|
|
@@ -763,30 +739,17 @@ export function Layout({ children, extensions, agentPageHref, brandName, brandIc
|
|
|
763
739
|
void navigate(dispatchNavLinkTarget(workspaceAppRoute(app.id)));
|
|
764
740
|
}, [chatFirstAppRegistrations, navigate]);
|
|
765
741
|
const chatHomeAppLauncher = useMemo(() => ({
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
error: chatFirstAppsQuery.isError
|
|
770
|
-
? chatFirstAppsQuery.error
|
|
771
|
-
: chatFirstConnectedAppsQuery.isError
|
|
772
|
-
? chatFirstConnectedAppsQuery.error
|
|
773
|
-
: undefined,
|
|
742
|
+
workspaceApps: chatFirstWorkspaceApps,
|
|
743
|
+
isLoading: chatFirstAppsQuery.isLoading,
|
|
744
|
+
error: chatFirstAppsQuery.isError ? chatFirstAppsQuery.error : undefined,
|
|
774
745
|
openApp: openChatFirstApp,
|
|
775
|
-
retry: () =>
|
|
776
|
-
void chatFirstAppsQuery.refetch();
|
|
777
|
-
void chatFirstConnectedAppsQuery.refetch();
|
|
778
|
-
},
|
|
746
|
+
retry: () => void chatFirstAppsQuery.refetch(),
|
|
779
747
|
}), [
|
|
780
748
|
chatFirstAppsQuery.error,
|
|
781
749
|
chatFirstAppsQuery.isError,
|
|
782
750
|
chatFirstAppsQuery.isLoading,
|
|
783
751
|
chatFirstAppsQuery.refetch,
|
|
784
|
-
|
|
785
|
-
chatFirstConnectedAppsQuery.isError,
|
|
786
|
-
chatFirstConnectedAppsQuery.isLoading,
|
|
787
|
-
chatFirstConnectedAppsQuery.refetch,
|
|
788
|
-
chatFirstAppItems,
|
|
789
|
-
chatHomeWorkspaceApps,
|
|
752
|
+
chatFirstWorkspaceApps,
|
|
790
753
|
openChatFirstApp,
|
|
791
754
|
]);
|
|
792
755
|
const chatFirstCopy = useMemo(() => createDispatchChatFirstCopy(t), [t]);
|
|
@@ -929,8 +892,7 @@ export function Layout({ children, extensions, agentPageHref, brandName, brandIc
|
|
|
929
892
|
});
|
|
930
893
|
}, [chatFirstSurfaceTabsStore, persistChatFirstPane]);
|
|
931
894
|
const resolveChatFirstOpenApp = useCallback((detail) => {
|
|
932
|
-
if (chatFirstAppsQuery.isLoading
|
|
933
|
-
chatFirstConnectedAppsQuery.isLoading) {
|
|
895
|
+
if (chatFirstAppsQuery.isLoading) {
|
|
934
896
|
pendingChatFirstOpenAppRef.current = detail;
|
|
935
897
|
return;
|
|
936
898
|
}
|
|
@@ -962,7 +924,6 @@ export function Layout({ children, extensions, agentPageHref, brandName, brandIc
|
|
|
962
924
|
chatFirstAppRegistrations,
|
|
963
925
|
chatFirstAppsQuery.isError,
|
|
964
926
|
chatFirstAppsQuery.isLoading,
|
|
965
|
-
chatFirstConnectedAppsQuery.isLoading,
|
|
966
927
|
chatFirstSurfaceTabsStore,
|
|
967
928
|
openChatFirstPane,
|
|
968
929
|
navigate,
|
|
@@ -1136,17 +1097,13 @@ export function Layout({ children, extensions, agentPageHref, brandName, brandIc
|
|
|
1136
1097
|
}, [activeChatFirstSurfaceTab, chatFirstSessionWatch.target]);
|
|
1137
1098
|
useEffect(() => {
|
|
1138
1099
|
const pending = pendingChatFirstOpenAppRef.current;
|
|
1139
|
-
if (!pending ||
|
|
1140
|
-
chatFirstAppsQuery.isLoading ||
|
|
1141
|
-
chatFirstConnectedAppsQuery.isLoading)
|
|
1100
|
+
if (!pending || chatFirstAppsQuery.isLoading)
|
|
1142
1101
|
return;
|
|
1143
1102
|
resolveChatFirstOpenApp(pending);
|
|
1144
1103
|
}, [
|
|
1145
1104
|
chatFirstAppsQuery.data,
|
|
1146
1105
|
chatFirstAppsQuery.isError,
|
|
1147
1106
|
chatFirstAppsQuery.isLoading,
|
|
1148
|
-
chatFirstConnectedAppsQuery.data,
|
|
1149
|
-
chatFirstConnectedAppsQuery.isLoading,
|
|
1150
1107
|
resolveChatFirstOpenApp,
|
|
1151
1108
|
]);
|
|
1152
1109
|
useEffect(() => {
|
|
@@ -1317,16 +1274,32 @@ export function Layout({ children, extensions, agentPageHref, brandName, brandIc
|
|
|
1317
1274
|
isMobileSurface,
|
|
1318
1275
|
renderChatFirstWatchChat,
|
|
1319
1276
|
]);
|
|
1277
|
+
const chatFirstSurfaceTabsBar = activeChatFirstSurfaceTab?.kind === "app" ? null : (_jsx(ChatFirstSurfaceTabs, { tabs: chatFirstSurfaceTabs.tabs, activeTabId: chatFirstSurfaceTabs.activeTabId, onActivate: activateChatFirstSurfaceTab, onClose: closeChatFirstSurfaceTab, onCloseOthers: (tab) => {
|
|
1278
|
+
activateChatFirstSurfaceTab(tab);
|
|
1279
|
+
chatFirstSurfaceTabsStore.closeOthers(tab.id);
|
|
1280
|
+
}, onCloseToRight: (tab) => {
|
|
1281
|
+
const targetIndex = chatFirstSurfaceTabs.tabs.findIndex((candidate) => candidate.id === tab.id);
|
|
1282
|
+
const activeIndex = chatFirstSurfaceTabs.tabs.findIndex((candidate) => candidate.id === chatFirstSurfaceTabs.activeTabId);
|
|
1283
|
+
if (activeIndex > targetIndex)
|
|
1284
|
+
activateChatFirstSurfaceTab(tab);
|
|
1285
|
+
chatFirstSurfaceTabsStore.closeToRight(tab.id);
|
|
1286
|
+
}, onCloseAll: closeAllChatFirstSurfaceTabs, onOpenSurface: openChatFirstSurface, apps: chatFirstAppItems, onOpenApp: (app) => openChatFirstPane({ appId: app.id }, "side"), renderAppIcon: (app) => (_jsx(AppIcon, { id: app.id, name: app.name, size: "sm", className: "size-7 rounded-lg" })), copy: chatFirstCopy }));
|
|
1287
|
+
const chatFirstSurfaceContent = chatFirstSurfaceTabs.tabs.length > 0 ? (_jsx(ChatFirstSurfaceContent, { tabs: chatFirstSurfaceTabs.tabs, activeTabId: chatFirstSurfaceTabs.activeTabId, renderTab: renderChatFirstSurfaceTab })) : null;
|
|
1320
1288
|
if (CHROMELESS_PATHS.some((path) => localPathname === path)) {
|
|
1321
1289
|
return _jsx(_Fragment, { children: children });
|
|
1322
1290
|
}
|
|
1323
1291
|
if (electronEmbedded) {
|
|
1324
|
-
return (_jsx(DispatchExtensionsContext.Provider, { value: extensions, children: _jsx(DispatchWorkspaceAppLauncherContext.Provider, { value: chatHomeAppLauncher, children: _jsx(HeaderActionsProvider, { children: _jsx("div", { "data-dispatch-electron-control-plane": true, className: "flex h-screen w-full overflow-hidden bg-background", children: _jsxs("div", { className: "relative flex min-w-0 flex-1 flex-col overflow-hidden", children: [_jsx(Header, { showAgentToggle: false }), _jsx(InvitationBanner, {}),
|
|
1292
|
+
return (_jsx(DispatchExtensionsContext.Provider, { value: extensions, children: _jsx(DispatchWorkspaceAppLauncherContext.Provider, { value: chatHomeAppLauncher, children: _jsx(HeaderActionsProvider, { children: _jsx("div", { "data-dispatch-electron-control-plane": true, className: "flex h-screen w-full overflow-hidden bg-background", children: _jsxs("div", { className: "relative flex min-w-0 flex-1 flex-col overflow-hidden", children: [_jsx(Header, { showAgentToggle: false }), _jsx(InvitationBanner, {}), _jsxs("main", { className: "relative flex min-h-0 flex-1 overflow-hidden", children: [_jsx("div", { className: "min-w-0 flex-1 overflow-y-auto", children: _jsx("div", { className: "mx-auto max-w-7xl space-y-10 px-4 py-6 sm:px-6", children: children }) }), isChatRoute &&
|
|
1293
|
+
chatFirstMode &&
|
|
1294
|
+
chatFirstHasActiveChat &&
|
|
1295
|
+
chatFirstSurfacePanel.open ? (_jsxs(ChatFirstSurfacePanel, { width: chatFirstSurfaceResize.width, onResizePointerDown: chatFirstSurfaceResize.onPointerDown, copy: chatFirstCopy, children: [chatFirstSurfaceTabsBar, chatFirstSurfaceContent] })) : null, isChatRoute && chatFirstMode && chatFirstHasActiveChat ? (_jsx(ChatFirstSurfacePanelToggle, { open: chatFirstSurfacePanel.open, onToggle: chatFirstSurfacePanel.toggle, className: CHAT_FIRST_SURFACE_PANEL_TOGGLE_CLASS_NAME })) : null] })] }) }) }) }) }));
|
|
1325
1296
|
}
|
|
1326
1297
|
if (isWorkspaceAppHostRoute) {
|
|
1327
1298
|
return (_jsx(DispatchExtensionsContext.Provider, { value: extensions, children: _jsx(HeaderActionsProvider, { children: _jsx("div", { "data-dispatch-workspace-app-chrome-less": true, className: "h-screen w-full overflow-hidden bg-background", children: children }) }) }));
|
|
1328
1299
|
}
|
|
1329
|
-
const showAgentControls = !isChatRoute &&
|
|
1300
|
+
const showAgentControls = !isChatRoute &&
|
|
1301
|
+
!isRedesignedSettingsRoute &&
|
|
1302
|
+
!pageOwnsToolbar(localPathname);
|
|
1330
1303
|
function openAskAgentFullscreen() {
|
|
1331
1304
|
focusAgentChat();
|
|
1332
1305
|
navigateWithAgentChatViewTransition(navigate, dispatchNavLinkTarget("/chat"));
|
|
@@ -1351,30 +1324,17 @@ export function Layout({ children, extensions, agentPageHref, brandName, brandIc
|
|
|
1351
1324
|
t("dispatch.sidebar.suggestionRouteSlack"),
|
|
1352
1325
|
t("dispatch.sidebar.suggestionGrantKey"),
|
|
1353
1326
|
];
|
|
1354
|
-
const appContent = (_jsxs("div", { className: "relative flex h-full min-h-0 min-w-0 flex-1 flex-col overflow-hidden", children: [_jsx(InvitationBanner, {}), isChatRoute && chatFirstMode &&
|
|
1327
|
+
const appContent = (_jsxs("div", { className: "relative flex h-full min-h-0 min-w-0 flex-1 flex-col overflow-hidden", children: [_jsx(InvitationBanner, {}), isChatRoute && chatFirstMode && chatFirstNotice ? (_jsxs("div", { className: "dispatch-chat-first-notice", role: "status", "aria-live": "polite", children: [_jsx("span", { children: chatFirstNotice }), _jsx("button", { type: "button", onClick: () => setChatFirstNotice(null), "aria-label": "Dismiss app notice", children: "Dismiss" })] })) : null, _jsx("main", { className: cn("min-h-0 flex-1", isChatRoute || isWorkspaceAppRoute
|
|
1355
1328
|
? "overflow-hidden"
|
|
1356
1329
|
: "overflow-y-auto"), children: showAgentControls ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "pointer-events-none sticky top-0 z-10 flex justify-end px-4 pt-2 lg:px-6", children: [_jsx(Button, { variant: "ghost", size: "icon-sm", className: "pointer-events-auto absolute start-4 top-2 lg:hidden", onClick: () => setMobileOpen(true), "aria-label": "Open navigation", children: _jsx(IconLayoutSidebar, { className: "h-4 w-4" }) }), _jsxs("div", { className: "pointer-events-auto flex items-center gap-1", children: [_jsx(RunsTray, { limit: 8, onOpenThread: openRunThread }), _jsx(AgentToggleButton, { className: "h-8 w-8 rounded-md bg-background/80 hover:bg-accent" })] })] }), _jsxs("div", { className: "mx-auto max-w-7xl space-y-10 px-4 py-6 sm:px-6", children: [localPathname !== "/overview" && (pageTitle || headerActions) ? (_jsxs("div", { className: "flex min-w-0 items-center justify-between gap-3", children: [_jsx("div", { className: "min-w-0 flex-1", children: pageTitle }), headerActions ? (_jsx("div", { className: "flex shrink-0 items-center gap-2", children: headerActions })) : null] })) : null, children] })] })) : (children) })] }));
|
|
1357
|
-
const
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
const targetIndex = chatFirstSurfaceTabs.tabs.findIndex((candidate) => candidate.id === tab.id);
|
|
1362
|
-
const activeIndex = chatFirstSurfaceTabs.tabs.findIndex((candidate) => candidate.id === chatFirstSurfaceTabs.activeTabId);
|
|
1363
|
-
if (activeIndex > targetIndex)
|
|
1364
|
-
activateChatFirstSurfaceTab(tab);
|
|
1365
|
-
chatFirstSurfaceTabsStore.closeToRight(tab.id);
|
|
1366
|
-
}, onCloseAll: closeAllChatFirstSurfaceTabs, onOpenSurface: openChatFirstSurface, apps: chatFirstAppItems, onOpenApp: (app) => openChatFirstPane({ appId: app.id }, "side"), renderAppIcon: (app) => (_jsx(AppIcon, { id: app.id, name: app.name, size: "sm", className: "size-7 rounded-lg" })), copy: chatFirstCopy }));
|
|
1367
|
-
const chatFirstSurfaceContent = chatFirstSurfaceTabs.tabs.length > 0 ? (_jsx(ChatFirstSurfaceContent, { tabs: chatFirstSurfaceTabs.tabs, activeTabId: chatFirstSurfaceTabs.activeTabId, renderTab: renderChatFirstSurfaceTab })) : null;
|
|
1368
|
-
const workspaceAppChatName = (workspaceAppId
|
|
1369
|
-
? chatFirstAppRegistrations.find((app) => app.id.toLowerCase() === workspaceAppId.toLowerCase())?.name
|
|
1370
|
-
: null) ??
|
|
1371
|
-
workspaceAppId ??
|
|
1372
|
-
"Workspace app";
|
|
1373
|
-
const workspaceAppContent = workspaceAppRouteActive && workspaceAppId ? (_jsx(WorkspaceAppChatRail, { appId: workspaceAppId, appName: workspaceAppChatName, agentPageHref: agentPageHref, onFullscreenRequest: openAskAgentFullscreen, children: _jsx(WorkspaceAppKeepAlive, { activeAppId: workspaceAppId }) })) : (_jsx(WorkspaceAppKeepAlive, { activeAppId: workspaceAppRouteActive ? workspaceAppId : null }));
|
|
1330
|
+
const workspaceAppChatRegistration = workspaceAppId
|
|
1331
|
+
? chatFirstAppRegistrations.find((app) => app.id.toLowerCase() === workspaceAppId.toLowerCase())
|
|
1332
|
+
: undefined;
|
|
1333
|
+
const workspaceAppContent = workspaceAppRouteActive && workspaceAppId ? (workspaceAppChatRegistration ? (_jsx(WorkspaceAppChatRail, { appId: workspaceAppId, appName: workspaceAppChatRegistration.name ?? workspaceAppId, agentPageHref: agentPageHref, onFullscreenRequest: openAskAgentFullscreen, children: _jsx(WorkspaceAppKeepAlive, { activeAppId: workspaceAppId }) })) : (_jsx(WorkspaceAppKeepAlive, { activeAppId: workspaceAppId }))) : (_jsx(WorkspaceAppKeepAlive, { activeAppId: workspaceAppRouteActive ? workspaceAppId : null }));
|
|
1374
1334
|
const content = isChatRoute ? (_jsx("div", { className: cn("agent-layout-main-surface flex h-full min-w-0 flex-1 overflow-hidden", chatFirstMode && "dispatch-chat-first-surface"), children: chatFirstAppTakesMain ? (_jsx("div", { className: "flex min-w-0 flex-1 flex-col overflow-hidden", "data-dispatch-chat-first-main-app": true, children: chatFirstSurfaceContent })) : (_jsxs(_Fragment, { children: [appContent, chatFirstMode &&
|
|
1375
1335
|
chatFirstHasActiveChat &&
|
|
1376
1336
|
chatFirstSurfacePanel.open ? (_jsxs(ChatFirstSurfacePanel, { width: chatFirstSurfaceResize.width, onResizePointerDown: chatFirstSurfaceResize.onPointerDown, copy: chatFirstCopy, children: [chatFirstSurfaceTabsBar, chatFirstSurfaceContent] })) : null] })) })) : workspaceAppRouteActive ? null : isWorkspaceAppRoute ? (appContent) : (_jsx(AgentSidebar, { position: "right", defaultOpen: false, agentPageHref: agentPageHref, chatViewTransition: true, storageKey: "dispatch", openOnChatRunning: chatHomeHandoffActive, onFullscreenRequest: openAskAgentFullscreen, emptyStateText: t("dispatch.sidebar.emptyAgentText"), suggestions: sidebarSuggestions, children: appContent }));
|
|
1377
|
-
return (_jsx(DispatchExtensionsContext.Provider, { value: extensions, children: _jsx(DispatchWorkspaceAppLauncherContext.Provider, { value: chatHomeAppLauncher, children: _jsx(HeaderActionsProvider, { children: _jsxs("div", { className: "agent-layout-shell flex h-screen w-full overflow-hidden bg-background", children: [
|
|
1337
|
+
return (_jsx(DispatchExtensionsContext.Provider, { value: extensions, children: _jsx(DispatchWorkspaceAppLauncherContext.Provider, { value: chatHomeAppLauncher, children: _jsx(HeaderActionsProvider, { children: _jsxs("div", { className: "agent-layout-shell flex h-screen w-full overflow-hidden bg-background", children: [isRedesignedSettingsRoute ? null : (_jsx("aside", { "data-collapsed": sidebarCollapsed ? "true" : "false", className: cn("agent-layout-left-drawer hidden shrink-0 flex-col border-e !border-e-sidebar-border bg-sidebar text-sidebar-foreground transition-[width] duration-200 ease-out lg:flex", sidebarCollapsed ? "w-14" : "w-[260px]"), children: _jsx(NavContent, { extensions: extensions, brandName: brandName, brandIcon: brandIcon, chatFirstMode: chatFirstMode, chatFirstEmbedded: chatFirstEmbedded, collapsed: sidebarCollapsed, chatFirstAppLayout: chatFirstAppLayout, onChatFirstAppLayoutChange: persistChatFirstAppLayout, chatFirstApps: chatFirstAppItems, chatFirstAppsLoading: chatFirstAppsQuery.isLoading, chatFirstAppsError: chatFirstAppsQuery.isError
|
|
1378
1338
|
? chatFirstCopy("appsLoadError")
|
|
1379
1339
|
: null, chatFirstActiveAppId: chatFirstActiveAppId, chatFirstActivePrimaryTab: chatFirstActivePrimaryTab, onChatFirstNewChat: () => {
|
|
1380
1340
|
closeChatFirstSessionWatch();
|