@agent-native/dispatch 0.15.10 → 0.15.11
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/dist/actions/provider-api-register.d.ts +11 -11
- package/dist/components/layout/Layout.d.ts.map +1 -1
- package/dist/components/layout/Layout.js +10 -6
- package/dist/components/layout/Layout.js.map +1 -1
- package/dist/components/workspace-app-card.js +1 -1
- package/dist/components/workspace-app-card.js.map +1 -1
- package/dist/routes/pages/approvals.js +1 -1
- package/dist/routes/pages/approvals.js.map +1 -1
- package/dist/routes/pages/workspace.d.ts.map +1 -1
- package/dist/routes/pages/workspace.js +5 -5
- package/dist/routes/pages/workspace.js.map +1 -1
- package/package.json +3 -3
- package/src/components/layout/Layout.tsx +28 -34
- package/src/components/workspace-app-card.spec.tsx +33 -1
- package/src/components/workspace-app-card.tsx +8 -7
- package/src/routes/pages/approvals.tsx +1 -1
- package/src/routes/pages/workspace.tsx +14 -13
|
@@ -47,7 +47,9 @@ declare const _default: import("node_modules/@agent-native/core/dist").ActionDef
|
|
|
47
47
|
notes?: string | undefined;
|
|
48
48
|
scope?: "org" | "user" | undefined;
|
|
49
49
|
}, {
|
|
50
|
+
message?: undefined;
|
|
50
51
|
id?: undefined;
|
|
52
|
+
found?: undefined;
|
|
51
53
|
deleted?: undefined;
|
|
52
54
|
providers: {
|
|
53
55
|
id: string;
|
|
@@ -60,46 +62,44 @@ declare const _default: import("node_modules/@agent-native/core/dist").ActionDef
|
|
|
60
62
|
}[];
|
|
61
63
|
count: number;
|
|
62
64
|
provider?: undefined;
|
|
63
|
-
found?: undefined;
|
|
64
65
|
registered?: undefined;
|
|
65
66
|
label?: undefined;
|
|
66
|
-
message?: undefined;
|
|
67
67
|
} | {
|
|
68
|
-
|
|
68
|
+
message?: undefined;
|
|
69
69
|
id?: undefined;
|
|
70
70
|
deleted?: undefined;
|
|
71
71
|
providers?: undefined;
|
|
72
|
+
count?: undefined;
|
|
72
73
|
found: boolean;
|
|
73
74
|
provider: import("node_modules/@agent-native/core/dist/provider-api").CustomProviderConfig;
|
|
74
75
|
registered?: undefined;
|
|
75
76
|
label?: undefined;
|
|
76
|
-
message?: undefined;
|
|
77
77
|
} | {
|
|
78
|
-
|
|
78
|
+
message?: undefined;
|
|
79
79
|
deleted?: undefined;
|
|
80
80
|
providers?: undefined;
|
|
81
|
+
count?: undefined;
|
|
81
82
|
provider?: undefined;
|
|
82
83
|
found: boolean;
|
|
83
84
|
id: string;
|
|
84
85
|
registered?: undefined;
|
|
85
86
|
label?: undefined;
|
|
86
|
-
message?: undefined;
|
|
87
87
|
} | {
|
|
88
|
-
|
|
88
|
+
message?: undefined;
|
|
89
|
+
found?: undefined;
|
|
89
90
|
providers?: undefined;
|
|
91
|
+
count?: undefined;
|
|
90
92
|
provider?: undefined;
|
|
91
|
-
found?: undefined;
|
|
92
93
|
deleted: boolean;
|
|
93
94
|
id: string;
|
|
94
95
|
registered?: undefined;
|
|
95
96
|
label?: undefined;
|
|
96
|
-
message?: undefined;
|
|
97
97
|
} | {
|
|
98
|
-
|
|
98
|
+
found?: undefined;
|
|
99
99
|
deleted?: undefined;
|
|
100
100
|
providers?: undefined;
|
|
101
|
+
count?: undefined;
|
|
101
102
|
provider?: undefined;
|
|
102
|
-
found?: undefined;
|
|
103
103
|
registered: boolean;
|
|
104
104
|
id: string;
|
|
105
105
|
label: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Layout.d.ts","sourceRoot":"","sources":["../../../src/components/layout/Layout.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Layout.d.ts","sourceRoot":"","sources":["../../../src/components/layout/Layout.tsx"],"names":[],"mappings":"AA0CA,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAgBf,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,YAAY,CAAC;AAE1D,MAAM,MAAM,eAAe,GAAG,aAAa,CAAC;IAC1C,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC;AAEH,MAAM,WAAW,eAAe;IAC9B,uEAAuE;IACvE,EAAE,EAAE,MAAM,CAAC;IACX,iFAAiF;IACjF,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,mFAAmF;IACnF,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,gEAAgE;IAChE,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;CACvC;AAED,MAAM,WAAW,uBAAuB;IACtC,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACtC,kFAAkF;IAClF,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B;AA6ND,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,SAAa,UAWlE;AA2ID,wBAAgB,UAAU,CAAC,EACzB,UAAU,EACV,UAAU,EACV,SAAiB,EACjB,WAAmB,EACnB,iBAAiB,GAClB,EAAE;IACD,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,UAAU,CAAC,EAAE,uBAAuB,CAAC;IACrC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CAClD,mDA+PA;AAED,wBAAgB,MAAM,CAAC,EACrB,QAAQ,EACR,UAAU,EACV,aAAa,GACd,EAAE;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,UAAU,CAAC,EAAE,uBAAuB,CAAC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,mDA6IA"}
|
|
@@ -6,8 +6,8 @@ import { useActionQuery } from "@agent-native/core/client/hooks";
|
|
|
6
6
|
import { useT } from "@agent-native/core/client/i18n";
|
|
7
7
|
import { InvitationBanner, OrgSwitcher } from "@agent-native/core/client/org";
|
|
8
8
|
import { FeedbackButton } from "@agent-native/core/client/ui";
|
|
9
|
-
import {
|
|
10
|
-
import { IconActivity, IconArrowUpRight, IconApps, IconBrain, IconChartBar, IconBrandTelegram, IconKey, IconChevronDown, IconLayersSubtract, IconMessageQuestion, IconMessages,
|
|
9
|
+
import { ChatHistoryRail, } from "@agent-native/toolkit/chat-history";
|
|
10
|
+
import { IconActivity, IconArrowUpRight, IconApps, IconBrain, IconChartBar, IconBrandTelegram, IconKey, IconChevronDown, IconLayersSubtract, IconMessageQuestion, IconMessages, IconPlugConnected, IconBroadcast, IconFingerprint, IconHistory, IconLayoutSidebarLeftCollapse, IconLayoutSidebarLeftExpand, IconPuzzle, IconSettings, IconSettingsAutomation, IconShieldCheck, } from "@tabler/icons-react";
|
|
11
11
|
import { useEffect, useMemo, useState, } from "react";
|
|
12
12
|
import { NavLink, useLocation, useNavigate } from "react-router";
|
|
13
13
|
import { cn } from "../../lib/utils.js";
|
|
@@ -256,7 +256,7 @@ function DispatchChatsSection({ onNavigate }) {
|
|
|
256
256
|
const visibleThreads = useMemo(() => threads
|
|
257
257
|
.filter((thread) => thread.messageCount > 0 || thread.id === activeThreadId)
|
|
258
258
|
.sort((a, b) => threadUpdatedAt(b) - threadUpdatedAt(a))
|
|
259
|
-
.slice(0,
|
|
259
|
+
.slice(0, 15), [activeThreadId, threads]);
|
|
260
260
|
const localPathname = localDispatchPath(location.pathname);
|
|
261
261
|
const displayedActiveThreadId = threadIdFromPath(localPathname) ??
|
|
262
262
|
(localPathname === "/chat" ? null : activeThreadId);
|
|
@@ -304,7 +304,11 @@ function DispatchChatsSection({ onNavigate }) {
|
|
|
304
304
|
}
|
|
305
305
|
return (_jsxs("div", { className: "ms-4 min-w-0 space-y-0.5", children: [chatsLoading &&
|
|
306
306
|
visibleThreads.length === 0 &&
|
|
307
|
-
Array.from({ length: 3 }).map((_, index) => (_jsxs("div", { className: "flex items-center gap-2 px-3 py-1", children: [_jsx(Skeleton, { className: "size-3.5 shrink-0 rounded-sm" }), _jsx(Skeleton, { className: "h-3 w-3/4 rounded" })] }, `chat-skeleton-${index}`))),
|
|
307
|
+
Array.from({ length: 3 }).map((_, index) => (_jsxs("div", { className: "flex items-center gap-2 px-3 py-1", children: [_jsx(Skeleton, { className: "size-3.5 shrink-0 rounded-sm" }), _jsx(Skeleton, { className: "h-3 w-3/4 rounded" })] }, `chat-skeleton-${index}`))), _jsx(ChatHistoryRail, { items: chatItems, activeId: displayedActiveThreadId, onSelect: (threadId) => openThread(threadId), onNewChat: () => void handleNewChat(), railLabels: {
|
|
308
|
+
newChat: t("dispatch.sidebar.newChat"),
|
|
309
|
+
showMore: t("dispatch.sidebar.chats"),
|
|
310
|
+
showLess: t("dispatch.sidebar.chats"),
|
|
311
|
+
}, renameMaxLength: 160, onRename: (threadId, title) => void renameThread(threadId, title), labels: {
|
|
308
312
|
options: (item) => t("dispatch.sidebar.chatOptions", {
|
|
309
313
|
title: item.titleText ?? "",
|
|
310
314
|
}),
|
|
@@ -312,7 +316,7 @@ function DispatchChatsSection({ onNavigate }) {
|
|
|
312
316
|
title: item.titleText ?? "",
|
|
313
317
|
}),
|
|
314
318
|
rename: t("dispatch.sidebar.renameChat"),
|
|
315
|
-
},
|
|
319
|
+
}, className: "min-w-0" })] }));
|
|
316
320
|
}
|
|
317
321
|
export function NavContent({ onNavigate, extensions, collapsed = false, collapsible = false, onCollapsedChange, }) {
|
|
318
322
|
const t = useT();
|
|
@@ -386,7 +390,7 @@ export function NavContent({ onNavigate, extensions, collapsed = false, collapsi
|
|
|
386
390
|
? t("sidebar.expandSidebar")
|
|
387
391
|
: t("sidebar.collapseSidebar"), className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-sidebar-foreground/65 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground", children: collapsed ? (_jsx(IconLayoutSidebarLeftExpand, { className: "h-4 w-4 rtl:-scale-x-100" })) : (_jsx(IconLayoutSidebarLeftCollapse, { className: "h-4 w-4 rtl:-scale-x-100" })) }) }), _jsx(TooltipContent, { side: "right", children: collapsed
|
|
388
392
|
? t("sidebar.expandSidebar")
|
|
389
|
-
: t("sidebar.collapseSidebar") })] })) : null] }) }), _jsxs("div", { className: "flex min-h-0 flex-1 flex-col overflow-y-auto", children: [_jsxs("nav", { className: cn("py-3", collapsed ? "px-1" : "px-2"), children: [_jsx("ul", { className: cn(collapsed ? "flex flex-col items-center gap-1" : "space-y-0.5"), children: primaryNavItems.map(renderNavItem) }), collapsed ? (_jsxs(_Fragment, { children: [_jsx("ul", { className: "mt-5 flex flex-col items-center gap-1", children: operationsNavItems.map(renderNavItem) }), _jsx("ul", { className: "mt-3 flex flex-col items-center gap-1", children: ADVANCED_NAV_ITEMS.map(renderNavItem) })] })) : (_jsxs("div", { className: "mt-5", children: [_jsx("p", { className: "px-2 pb-1 text-[11px] font-medium uppercase tracking-wide text-sidebar-foreground/45", children: t("dispatch.nav.operate", { defaultValue: "Operate" }) }), _jsx("ul", { className: "space-y-0.5", children: operationsNavItems.map(renderNavItem) }), _jsxs("details", { className: "group mt-3", open: advancedOpen, children: [_jsxs("summary", { className: "flex h-8 cursor-pointer list-none items-center justify-between rounded-md px-2 text-xs font-medium text-sidebar-foreground/60 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground [&::-webkit-details-marker]:hidden", children: [_jsx("span", { children: t("dispatch.nav.advanced", { defaultValue: "Advanced" }) }), _jsx(IconChevronDown, { size: 14, className: "transition-transform group-open:rotate-180" })] }), _jsx("ul", { className: "mt-1 space-y-0.5", children: ADVANCED_NAV_ITEMS.map(renderNavItem) })] })] }))] }), !collapsed ? (_jsxs("div", { className: "mt-auto shrink-0", children: [_jsx("div", { className: "px-2 py-1", children: _jsx(ExtensionsSidebarSection, {}) }), _jsx("div", { className: "px-3 py-2", children: _jsx(OrgSwitcher, {}) }), _jsx("div", { className: "px-3 py-2", children: _jsx(FeedbackButton, {}) })] })) : null] })] }));
|
|
393
|
+
: t("sidebar.collapseSidebar") })] })) : null] }) }), _jsxs("div", { className: "flex min-h-0 flex-1 flex-col overflow-y-auto", children: [_jsxs("nav", { className: cn("py-3", collapsed ? "px-1" : "px-2"), children: [_jsx("ul", { className: cn(collapsed ? "flex flex-col items-center gap-1" : "space-y-0.5"), children: primaryNavItems.map(renderNavItem) }), collapsed ? (_jsxs(_Fragment, { children: [_jsx("ul", { className: "mt-5 flex flex-col items-center gap-1", children: operationsNavItems.map(renderNavItem) }), _jsx("ul", { className: "mt-3 flex flex-col items-center gap-1", children: ADVANCED_NAV_ITEMS.map(renderNavItem) })] })) : (_jsxs("div", { className: "mt-5", children: [_jsx("p", { className: "px-2 pb-1 text-[11px] font-medium uppercase tracking-wide text-sidebar-foreground/45", children: t("dispatch.nav.operate", { defaultValue: "Operate" }) }), _jsx("ul", { className: "space-y-0.5", children: operationsNavItems.map(renderNavItem) }), _jsxs("details", { className: "group mt-3", open: advancedOpen, children: [_jsxs("summary", { className: "flex h-8 cursor-pointer list-none items-center justify-between rounded-md px-2 text-xs font-medium text-sidebar-foreground/60 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground [&::-webkit-details-marker]:hidden", children: [_jsx("span", { children: t("dispatch.nav.advanced", { defaultValue: "Advanced" }) }), _jsx(IconChevronDown, { size: 14, className: "transition-transform group-open:rotate-180" })] }), _jsx("ul", { className: "mt-1 space-y-0.5", children: ADVANCED_NAV_ITEMS.map(renderNavItem) })] })] }))] }), !collapsed ? (_jsxs("div", { className: "mt-auto shrink-0", children: [_jsx("div", { className: "px-2 py-1", children: _jsx(ExtensionsSidebarSection, {}) }), _jsx("div", { className: "px-3 py-2", children: _jsx(OrgSwitcher, {}) }), _jsx("div", { className: "px-3 py-2 empty:hidden", children: _jsx(FeedbackButton, {}) })] })) : null] })] }));
|
|
390
394
|
}
|
|
391
395
|
export function Layout({ children, extensions, agentPageHref, }) {
|
|
392
396
|
const t = useT();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Layout.js","sourceRoot":"","sources":["../../../src/components/layout/Layout.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n AgentSidebar,\n focusAgentChat,\n navigateWithAgentChatViewTransition,\n useAgentChatHomeHandoff,\n useAgentChatHomeHandoffLinks,\n useChatThreads,\n type ChatThreadSummary,\n} from \"@agent-native/core/client/agent-chat\";\nimport { appBasePath, appPath } from \"@agent-native/core/client/api-path\";\nimport { ExtensionsSidebarSection } from \"@agent-native/core/client/extensions\";\nimport { useActionQuery } from \"@agent-native/core/client/hooks\";\nimport { useT } from \"@agent-native/core/client/i18n\";\nimport { InvitationBanner, OrgSwitcher } from \"@agent-native/core/client/org\";\nimport { FeedbackButton } from \"@agent-native/core/client/ui\";\nimport {\n ChatHistoryList,\n type ChatHistoryItem,\n} from \"@agent-native/toolkit/chat-history\";\nimport {\n IconActivity,\n IconArrowUpRight,\n IconApps,\n IconBrain,\n IconChartBar,\n IconBrandTelegram,\n IconKey,\n IconChevronDown,\n IconLayersSubtract,\n IconMessageQuestion,\n IconMessages,\n IconPlus,\n IconPlugConnected,\n IconBroadcast,\n IconFingerprint,\n IconHistory,\n IconLayoutSidebarLeftCollapse,\n IconLayoutSidebarLeftExpand,\n IconPuzzle,\n IconSettings,\n IconSettingsAutomation,\n IconShieldCheck,\n} from \"@tabler/icons-react\";\nimport {\n useEffect,\n useMemo,\n useState,\n type ComponentType,\n type ReactNode,\n} from \"react\";\nimport { NavLink, useLocation, useNavigate } from \"react-router\";\n\nimport { cn } from \"../../lib/utils\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"../ui/dropdown-menu\";\nimport { Sheet, SheetContent, SheetDescription, SheetTitle } from \"../ui/sheet\";\nimport { Skeleton } from \"../ui/skeleton\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/tooltip\";\nimport { Header } from \"./Header\";\nimport { HeaderActionsProvider } from \"./HeaderActions\";\n\nexport type DispatchNavSection = \"primary\" | \"operations\";\n\nexport type DispatchNavIcon = ComponentType<{\n size?: number | string;\n className?: string;\n}>;\n\nexport interface DispatchNavItem {\n /** Stable id used for keys and navigation.view. Avoid built-in ids. */\n id: string;\n /** React Router path for the tab, usually backed by an app/routes/*.tsx file. */\n to: string;\n label: string;\n icon?: DispatchNavIcon;\n /** Defaults to \"operations\", which is where local management tools usually fit. */\n section?: DispatchNavSection;\n /** Override active matching for nested or multi-route tools. */\n match?: (pathname: string) => boolean;\n}\n\nexport interface DispatchExtensionConfig {\n /** Extra sidebar tabs supplied by the generated workspace. */\n navItems?: readonly DispatchNavItem[];\n /** Extra React Query keys to invalidate when Dispatch receives DB sync events. */\n queryKeys?: readonly string[];\n}\n\nconst PRIMARY_NAV_ITEMS = [\n {\n id: \"overview\",\n to: \"/overview\",\n label: \"Overview\",\n icon: IconBroadcast,\n section: \"primary\",\n },\n {\n id: \"chat\",\n to: \"/chat\",\n label: \"Chat\",\n icon: IconMessageQuestion,\n section: \"primary\",\n },\n {\n id: \"apps\",\n to: \"/apps\",\n label: \"Apps\",\n icon: IconApps,\n section: \"primary\",\n },\n] as const satisfies readonly DispatchNavItem[];\n\nconst OPERATIONS_NAV_ITEMS = [\n {\n id: \"operations\",\n to: \"/operations\",\n label: \"Operations\",\n icon: IconActivity,\n section: \"operations\",\n },\n {\n id: \"metrics\",\n to: \"/metrics\",\n label: \"Metrics\",\n icon: IconChartBar,\n section: \"operations\",\n },\n {\n id: \"automations\",\n to: \"/automations\",\n label: \"Automations\",\n icon: IconSettingsAutomation,\n section: \"operations\",\n },\n {\n id: \"approvals\",\n to: \"/approvals\",\n label: \"Approvals\",\n icon: IconShieldCheck,\n section: \"operations\",\n },\n {\n id: \"destinations\",\n to: \"/destinations\",\n label: \"Destinations\",\n icon: IconArrowUpRight,\n section: \"operations\",\n },\n {\n id: \"integrations\",\n to: \"/integrations\",\n label: \"Integrations\",\n icon: IconPuzzle,\n section: \"operations\",\n },\n {\n id: \"vault\",\n to: \"/vault\",\n label: \"Vault\",\n icon: IconKey,\n section: \"operations\",\n },\n {\n id: \"agents\",\n to: \"/agents\",\n label: \"Agents\",\n icon: IconPlugConnected,\n section: \"operations\",\n },\n {\n id: \"workspace\",\n to: \"/workspace\",\n label: \"Resources\",\n icon: IconLayersSubtract,\n section: \"operations\",\n },\n {\n id: \"settings\",\n to: \"/settings\",\n label: \"Settings\",\n icon: IconSettings,\n section: \"operations\",\n },\n] as const satisfies readonly DispatchNavItem[];\n\nconst ADVANCED_NAV_ITEMS = [\n {\n id: \"messaging\",\n to: \"/messaging\",\n label: \"Messaging\",\n icon: IconBrandTelegram,\n section: \"operations\",\n },\n {\n id: \"identities\",\n to: \"/identities\",\n label: \"Identities\",\n icon: IconFingerprint,\n section: \"operations\",\n },\n {\n id: \"audit\",\n to: \"/audit\",\n label: \"Audit\",\n icon: IconHistory,\n section: \"operations\",\n },\n {\n id: \"dreams\",\n to: \"/dreams\",\n label: \"Dreams\",\n icon: IconBrain,\n section: \"operations\",\n },\n {\n id: \"thread-debug\",\n to: \"/thread-debug\",\n label: \"Thread Debug\",\n icon: IconMessages,\n section: \"operations\",\n },\n] as const satisfies readonly DispatchNavItem[];\n\nconst EMPTY_NAV_ITEMS: readonly DispatchNavItem[] = [];\n\nconst CHROMELESS_PATHS = [\"/approval\"];\nconst SIDEBAR_COLLAPSE_KEY = \"dispatch.sidebar.collapsed\";\n\n// Routes whose page renders its own toolbar.\n// Layout still mounts the sidebar + AgentSidebar, but skips its own Header so\n// there's no double-header.\nfunction pageOwnsToolbar(pathname: string): boolean {\n if (pathname === \"/tools\" || pathname.startsWith(\"/tools/\")) return true;\n if (pathname === \"/extensions\" || pathname.startsWith(\"/extensions/\"))\n return true;\n return false;\n}\n\ninterface WorkspaceInfo {\n name: string | null;\n displayName: string | null;\n appCount: number;\n}\n\nfunction sectionFor(item: DispatchNavItem): DispatchNavSection {\n return item.section ?? \"operations\";\n}\n\nfunction navItemMatchesPath(item: DispatchNavItem, pathname: string): boolean {\n if (item.match) {\n try {\n if (item.match(pathname)) return true;\n } catch {\n return false;\n }\n }\n return pathname === item.to || pathname.startsWith(`${item.to}/`);\n}\n\nfunction navItemsForSection(\n items: readonly DispatchNavItem[],\n section: DispatchNavSection,\n): DispatchNavItem[] {\n return items.filter((item) => sectionFor(item) === section);\n}\n\nfunction localDispatchPath(pathname: string): string {\n const basePath = appBasePath();\n if (!basePath) return pathname;\n if (pathname === basePath) return \"/\";\n if (pathname.startsWith(`${basePath}/`)) {\n return pathname.slice(basePath.length) || \"/\";\n }\n return pathname;\n}\n\nfunction dispatchNavLinkTarget(path: string): string {\n if (typeof window === \"undefined\") return path;\n const basePath = appBasePath();\n if (!basePath) return path;\n // Mirror the basename calculation entry.client.tsx uses to configure the\n // router (basePath iff the current URL is under that mount, \"\" otherwise).\n // Reading the live URL directly avoids races with the previous check on\n // `__reactRouterContext.basename`, which could read undefined before the\n // entry script set it — that race produced /dispatch/dispatch/<route>\n // history entries that 404'd on back-button navigation.\n const pathname = window.location.pathname;\n const routerHasBasename =\n pathname === basePath || pathname.startsWith(`${basePath}/`);\n return routerHasBasename ? path : appPath(path);\n}\n\nfunction chatThreadPath(threadId: string): string {\n return `/chat/${encodeURIComponent(threadId)}`;\n}\n\nfunction threadIdFromPath(pathname: string): string | null {\n const match = pathname.match(/^\\/chat\\/([^/]+)/);\n if (!match) return null;\n try {\n const value = decodeURIComponent(match[1]).trim();\n return value || null;\n } catch {\n return null;\n }\n}\n\nexport function formatThreadAge(updatedAt: number, now = Date.now()) {\n const diffMs = Math.max(0, now - updatedAt);\n const minutes = Math.floor(diffMs / 60_000);\n if (minutes < 1) return \"now\";\n if (minutes < 60) return `${minutes}m`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h`;\n const days = Math.floor(hours / 24);\n if (days < 14) return `${days}d`;\n if (days < 365) return `${Math.floor(days / 7)}w`;\n return `${Math.floor(days / 365)}y`;\n}\n\nfunction threadTitle(thread: ChatThreadSummary, fallback: string) {\n return thread.title || thread.preview || fallback;\n}\n\nfunction threadUpdatedAt(thread: ChatThreadSummary) {\n return Number.isFinite(thread.updatedAt)\n ? thread.updatedAt\n : Number.isFinite(thread.createdAt)\n ? thread.createdAt\n : 0;\n}\n\nfunction DispatchChatsSection({ onNavigate }: { onNavigate?: () => void }) {\n const t = useT();\n const navigate = useNavigate();\n const location = useLocation();\n const {\n threads,\n activeThreadId,\n isLoading: chatsLoading,\n createThread,\n switchThread,\n renameThread,\n refreshThreads,\n } = useChatThreads(undefined, \"dispatch\", undefined, { autoCreate: false });\n\n const visibleThreads = useMemo(\n () =>\n threads\n .filter(\n (thread) => thread.messageCount > 0 || thread.id === activeThreadId,\n )\n .sort((a, b) => threadUpdatedAt(b) - threadUpdatedAt(a))\n .slice(0, 8),\n [activeThreadId, threads],\n );\n const localPathname = localDispatchPath(location.pathname);\n const displayedActiveThreadId =\n threadIdFromPath(localPathname) ??\n (localPathname === \"/chat\" ? null : activeThreadId);\n const chatItems: ChatHistoryItem[] = visibleThreads.map((thread) => {\n const title = threadTitle(thread, t(\"dispatch.sidebar.newChat\"));\n return {\n id: thread.id,\n title: <span title={title}>{title}</span>,\n titleText: title,\n timestamp:\n thread.id === displayedActiveThreadId\n ? \"\"\n : formatThreadAge(threadUpdatedAt(thread)),\n };\n });\n\n useEffect(() => {\n const refresh = () => refreshThreads();\n const handleRunning = (event: Event) => {\n const detail = (event as CustomEvent).detail as\n | { isRunning?: unknown }\n | undefined;\n if (detail?.isRunning === false) refreshThreads();\n };\n\n window.addEventListener(\"agent-chat:threads-updated\", refresh);\n window.addEventListener(\"agentNative.chatRunning\", handleRunning);\n window.addEventListener(\"focus\", refresh);\n return () => {\n window.removeEventListener(\"agent-chat:threads-updated\", refresh);\n window.removeEventListener(\"agentNative.chatRunning\", handleRunning);\n window.removeEventListener(\"focus\", refresh);\n };\n }, [refreshThreads]);\n\n function openThread(threadId: string, options?: { isNew?: boolean }) {\n switchThread(threadId);\n navigateWithAgentChatViewTransition(\n navigate,\n dispatchNavLinkTarget(\n options?.isNew ? \"/chat\" : chatThreadPath(threadId),\n ),\n );\n onNavigate?.();\n window.requestAnimationFrame(() => {\n window.dispatchEvent(\n new CustomEvent(\"agent-chat:open-thread\", {\n detail: { threadId, newThread: options?.isNew === true },\n }),\n );\n });\n }\n\n async function handleNewChat() {\n const threadId = await createThread();\n if (threadId) openThread(threadId, { isNew: true });\n }\n\n return (\n <div className=\"ms-4 min-w-0 space-y-0.5\">\n {chatsLoading &&\n visibleThreads.length === 0 &&\n Array.from({ length: 3 }).map((_, index) => (\n <div\n key={`chat-skeleton-${index}`}\n className=\"flex items-center gap-2 px-3 py-1\"\n >\n <Skeleton className=\"size-3.5 shrink-0 rounded-sm\" />\n <Skeleton className=\"h-3 w-3/4 rounded\" />\n </div>\n ))}\n {visibleThreads.length > 0 && (\n <ChatHistoryList\n items={chatItems}\n activeId={displayedActiveThreadId}\n onSelect={(threadId) => openThread(threadId)}\n renameMaxLength={160}\n onRename={(threadId, title) => void renameThread(threadId, title)}\n labels={{\n options: (item) =>\n t(\"dispatch.sidebar.chatOptions\", {\n title: item.titleText ?? \"\",\n }),\n renameInput: (item) =>\n t(\"dispatch.sidebar.renameThread\", {\n title: item.titleText ?? \"\",\n }),\n rename: t(\"dispatch.sidebar.renameChat\"),\n }}\n variant=\"rail\"\n className=\"min-w-0\"\n />\n )}\n <button\n type=\"button\"\n onClick={() => void handleNewChat()}\n className=\"flex w-full cursor-pointer items-center gap-2 rounded-lg px-3 py-1.5 text-xs text-muted-foreground/60 transition-colors hover:bg-sidebar-accent/50 hover:text-foreground\"\n >\n <IconPlus className=\"size-3 shrink-0\" />\n <span className=\"truncate\">{t(\"dispatch.sidebar.newChat\")}</span>\n </button>\n </div>\n );\n}\n\nexport function NavContent({\n onNavigate,\n extensions,\n collapsed = false,\n collapsible = false,\n onCollapsedChange,\n}: {\n onNavigate?: () => void;\n extensions?: DispatchExtensionConfig;\n collapsed?: boolean;\n collapsible?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n}) {\n const t = useT();\n const location = useLocation();\n const navigate = useNavigate();\n const { data: workspace } = useActionQuery(\n \"get-workspace-info\",\n {},\n { staleTime: 60_000 },\n );\n const ws = workspace as WorkspaceInfo | undefined;\n const workspaceLabel = ws?.displayName ?? ws?.name ?? null;\n const extensionNavItems = extensions?.navItems ?? EMPTY_NAV_ITEMS;\n const primaryNavItems = [\n ...PRIMARY_NAV_ITEMS,\n ...navItemsForSection(extensionNavItems, \"primary\"),\n ];\n const operationsNavItems = [\n ...OPERATIONS_NAV_ITEMS,\n ...navItemsForSection(extensionNavItems, \"operations\"),\n ];\n const localPathname = localDispatchPath(location.pathname);\n const advancedOpen = ADVANCED_NAV_ITEMS.some((item) =>\n navItemMatchesPath(item, localPathname),\n );\n const navLabel = (item: DispatchNavItem) => {\n const key =\n item.id === \"thread-debug\"\n ? \"threadDebug\"\n : item.id === \"workspace\"\n ? \"resources\"\n : item.id;\n return t(`dispatch.nav.${key}`, { defaultValue: item.label });\n };\n\n const renderNavItem = (item: DispatchNavItem) => {\n const Icon = item.icon;\n const itemMatchesLocalPath = navItemMatchesPath(item, localPathname);\n const label = navLabel(item);\n return (\n <li key={item.id}>\n {collapsed ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <NavLink\n to={dispatchNavLinkTarget(item.to)}\n onClick={(event) => {\n if (\n item.id === \"chat\" &&\n localPathname !== \"/chat\" &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.shiftKey &&\n !event.altKey\n ) {\n event.preventDefault();\n navigateWithAgentChatViewTransition(\n navigate,\n dispatchNavLinkTarget(\"/chat\"),\n );\n onNavigate?.();\n return;\n }\n onNavigate?.();\n }}\n aria-label={label}\n className={({ isActive }) => {\n const active = isActive || itemMatchesLocalPath;\n return cn(\n \"flex h-8 w-8 items-center justify-center rounded-md text-sm\",\n active\n ? \"bg-sidebar-accent font-medium text-sidebar-accent-foreground\"\n : \"text-sidebar-foreground/70 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n );\n }}\n >\n {Icon ? (\n <Icon size={16} className=\"shrink-0\" />\n ) : (\n <span className=\"h-4 w-4 shrink-0\" aria-hidden=\"true\" />\n )}\n </NavLink>\n </TooltipTrigger>\n <TooltipContent side=\"right\">{label}</TooltipContent>\n </Tooltip>\n ) : (\n <NavLink\n to={dispatchNavLinkTarget(item.to)}\n onClick={(event) => {\n if (\n item.id === \"chat\" &&\n localPathname !== \"/chat\" &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.shiftKey &&\n !event.altKey\n ) {\n event.preventDefault();\n navigateWithAgentChatViewTransition(\n navigate,\n dispatchNavLinkTarget(\"/chat\"),\n );\n onNavigate?.();\n return;\n }\n onNavigate?.();\n }}\n className={({ isActive }) => {\n const active = isActive || itemMatchesLocalPath;\n return cn(\n \"flex h-8 w-full items-center gap-2 rounded-md px-2 text-sm\",\n active\n ? \"bg-sidebar-accent font-medium text-sidebar-accent-foreground\"\n : \"text-sidebar-foreground/70 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n );\n }}\n >\n {Icon ? (\n <Icon size={16} className=\"shrink-0\" />\n ) : (\n <span className=\"h-4 w-4 shrink-0\" aria-hidden=\"true\" />\n )}\n <span className=\"truncate\">{label}</span>\n </NavLink>\n )}\n {!collapsed && item.id === \"chat\" && itemMatchesLocalPath ? (\n <DispatchChatsSection onNavigate={onNavigate} />\n ) : null}\n </li>\n );\n };\n\n return (\n <>\n <div className={cn(\"border-b py-3\", collapsed ? \"px-1\" : \"px-4\")}>\n <div\n className={cn(\n \"flex items-center\",\n collapsed ? \"justify-center\" : \"gap-2\",\n )}\n >\n {!collapsed && (\n <>\n <img\n src={appPath(\"/agent-native-icon-light.svg\")}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"block h-5 w-auto shrink-0 dark:hidden\"\n />\n <img\n src={appPath(\"/agent-native-icon-dark.svg\")}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"hidden h-5 w-auto shrink-0 dark:block\"\n />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-lg font-bold tracking-tight text-foreground\">\n {workspaceLabel ?? \"Dispatch\"}\n </div>\n </div>\n </>\n )}\n {collapsible ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => onCollapsedChange?.(!collapsed)}\n aria-label={\n collapsed\n ? t(\"sidebar.expandSidebar\")\n : t(\"sidebar.collapseSidebar\")\n }\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-sidebar-foreground/65 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\"\n >\n {collapsed ? (\n <IconLayoutSidebarLeftExpand className=\"h-4 w-4 rtl:-scale-x-100\" />\n ) : (\n <IconLayoutSidebarLeftCollapse className=\"h-4 w-4 rtl:-scale-x-100\" />\n )}\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"right\">\n {collapsed\n ? t(\"sidebar.expandSidebar\")\n : t(\"sidebar.collapseSidebar\")}\n </TooltipContent>\n </Tooltip>\n ) : null}\n </div>\n </div>\n\n <div className=\"flex min-h-0 flex-1 flex-col overflow-y-auto\">\n <nav className={cn(\"py-3\", collapsed ? \"px-1\" : \"px-2\")}>\n <ul\n className={cn(\n collapsed ? \"flex flex-col items-center gap-1\" : \"space-y-0.5\",\n )}\n >\n {primaryNavItems.map(renderNavItem)}\n </ul>\n\n {collapsed ? (\n <>\n <ul className=\"mt-5 flex flex-col items-center gap-1\">\n {operationsNavItems.map(renderNavItem)}\n </ul>\n <ul className=\"mt-3 flex flex-col items-center gap-1\">\n {ADVANCED_NAV_ITEMS.map(renderNavItem)}\n </ul>\n </>\n ) : (\n <div className=\"mt-5\">\n <p className=\"px-2 pb-1 text-[11px] font-medium uppercase tracking-wide text-sidebar-foreground/45\">\n {t(\"dispatch.nav.operate\", { defaultValue: \"Operate\" })}\n </p>\n <ul className=\"space-y-0.5\">\n {operationsNavItems.map(renderNavItem)}\n </ul>\n\n <details className=\"group mt-3\" open={advancedOpen}>\n <summary className=\"flex h-8 cursor-pointer list-none items-center justify-between rounded-md px-2 text-xs font-medium text-sidebar-foreground/60 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground [&::-webkit-details-marker]:hidden\">\n <span>\n {t(\"dispatch.nav.advanced\", { defaultValue: \"Advanced\" })}\n </span>\n <IconChevronDown\n size={14}\n className=\"transition-transform group-open:rotate-180\"\n />\n </summary>\n <ul className=\"mt-1 space-y-0.5\">\n {ADVANCED_NAV_ITEMS.map(renderNavItem)}\n </ul>\n </details>\n </div>\n )}\n </nav>\n\n {!collapsed ? (\n <div className=\"mt-auto shrink-0\">\n <div className=\"px-2 py-1\">\n <ExtensionsSidebarSection />\n </div>\n\n <div className=\"px-3 py-2\">\n <OrgSwitcher />\n </div>\n\n <div className=\"px-3 py-2\">\n <FeedbackButton />\n </div>\n </div>\n ) : null}\n </div>\n </>\n );\n}\n\nexport function Layout({\n children,\n extensions,\n agentPageHref,\n}: {\n children: ReactNode;\n extensions?: DispatchExtensionConfig;\n agentPageHref?: string;\n}) {\n const t = useT();\n const location = useLocation();\n const navigate = useNavigate();\n const [mobileOpen, setMobileOpen] = useState(false);\n const [sidebarCollapsed, setSidebarCollapsed] = useState(() => {\n if (typeof window === \"undefined\") return false;\n try {\n return window.localStorage.getItem(SIDEBAR_COLLAPSE_KEY) === \"1\";\n } catch {\n return false;\n }\n });\n const localPathname = localDispatchPath(location.pathname);\n const isChatRoute =\n localPathname === \"/chat\" || localPathname.startsWith(\"/chat/\");\n const chatHomeHandoffActive = useAgentChatHomeHandoff({\n storageKey: \"dispatch\",\n activePath: localPathname,\n enabled: !isChatRoute,\n });\n const chatHandoffLinkOptions = {\n storageKey: \"dispatch\",\n isChatPath: (pathname: string) =>\n pathname === \"/chat\" || pathname.startsWith(\"/chat/\"),\n requireActiveHandoff: true,\n };\n useAgentChatHomeHandoffLinks(chatHandoffLinkOptions);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(\n SIDEBAR_COLLAPSE_KEY,\n sidebarCollapsed ? \"1\" : \"0\",\n );\n } catch {\n // Ignore storage failures; the in-memory preference still works.\n }\n }, [sidebarCollapsed]);\n\n if (CHROMELESS_PATHS.some((path) => localPathname === path)) {\n return <>{children}</>;\n }\n\n const showHeader = !isChatRoute && !pageOwnsToolbar(localPathname);\n function openAskAgentFullscreen() {\n focusAgentChat();\n navigateWithAgentChatViewTransition(\n navigate,\n dispatchNavLinkTarget(\"/chat\"),\n );\n }\n const sidebarSuggestions = [\n t(\"dispatch.sidebar.suggestionBuildApp\"),\n t(\"dispatch.sidebar.suggestionRouteSlack\"),\n t(\"dispatch.sidebar.suggestionGrantKey\"),\n ];\n const appContent = (\n <div className=\"flex h-full min-w-0 flex-1 flex-col overflow-hidden\">\n {showHeader ? <Header onOpenMobile={() => setMobileOpen(true)} /> : null}\n <InvitationBanner />\n <main\n className={cn(\n \"flex-1\",\n isChatRoute ? \"min-h-0 overflow-hidden\" : \"overflow-y-auto\",\n )}\n >\n {showHeader ? (\n <div className=\"mx-auto max-w-7xl space-y-10 px-4 py-6 sm:px-6\">\n {children}\n </div>\n ) : (\n children\n )}\n </main>\n </div>\n );\n const content = isChatRoute ? (\n <div className=\"agent-layout-main-surface flex min-w-0 flex-1 overflow-hidden\">\n {appContent}\n </div>\n ) : (\n <AgentSidebar\n position=\"right\"\n defaultOpen={false}\n agentPageHref={agentPageHref}\n chatViewTransition\n storageKey=\"dispatch\"\n openOnChatRunning={chatHomeHandoffActive}\n onFullscreenRequest={openAskAgentFullscreen}\n emptyStateText={t(\"dispatch.sidebar.emptyAgentText\")}\n suggestions={sidebarSuggestions}\n >\n {appContent}\n </AgentSidebar>\n );\n\n return (\n <HeaderActionsProvider>\n <div className=\"agent-layout-shell flex h-screen w-full overflow-hidden bg-background\">\n <aside\n data-collapsed={sidebarCollapsed ? \"true\" : \"false\"}\n className={cn(\n \"agent-layout-left-drawer hidden shrink-0 flex-col border-e bg-sidebar text-sidebar-foreground transition-[width] duration-200 ease-out lg:flex\",\n sidebarCollapsed ? \"w-14\" : \"w-56\",\n )}\n >\n <NavContent\n extensions={extensions}\n collapsed={sidebarCollapsed}\n collapsible\n onCollapsedChange={setSidebarCollapsed}\n />\n </aside>\n\n <Sheet open={mobileOpen} onOpenChange={setMobileOpen}>\n <SheetContent\n side=\"left\"\n className=\"w-72 p-0 bg-sidebar text-sidebar-foreground [&>button]:hidden\"\n >\n <SheetTitle className=\"sr-only\">\n {t(\"dispatch.nav.navigation\")}\n </SheetTitle>\n <SheetDescription className=\"sr-only\">\n {t(\"dispatch.nav.navigationDescription\")}\n </SheetDescription>\n <div className=\"flex h-full w-full flex-col\">\n <NavContent\n extensions={extensions}\n collapsed={false}\n onNavigate={() => setMobileOpen(false)}\n />\n </div>\n </SheetContent>\n </Sheet>\n\n {content}\n </div>\n </HeaderActionsProvider>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Layout.js","sourceRoot":"","sources":["../../../src/components/layout/Layout.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n AgentSidebar,\n focusAgentChat,\n navigateWithAgentChatViewTransition,\n useAgentChatHomeHandoff,\n useAgentChatHomeHandoffLinks,\n useChatThreads,\n type ChatThreadSummary,\n} from \"@agent-native/core/client/agent-chat\";\nimport { appBasePath, appPath } from \"@agent-native/core/client/api-path\";\nimport { ExtensionsSidebarSection } from \"@agent-native/core/client/extensions\";\nimport { useActionQuery } from \"@agent-native/core/client/hooks\";\nimport { useT } from \"@agent-native/core/client/i18n\";\nimport { InvitationBanner, OrgSwitcher } from \"@agent-native/core/client/org\";\nimport { FeedbackButton } from \"@agent-native/core/client/ui\";\nimport {\n ChatHistoryRail,\n type ChatHistoryItem,\n} from \"@agent-native/toolkit/chat-history\";\nimport {\n IconActivity,\n IconArrowUpRight,\n IconApps,\n IconBrain,\n IconChartBar,\n IconBrandTelegram,\n IconKey,\n IconChevronDown,\n IconLayersSubtract,\n IconMessageQuestion,\n IconMessages,\n IconPlugConnected,\n IconBroadcast,\n IconFingerprint,\n IconHistory,\n IconLayoutSidebarLeftCollapse,\n IconLayoutSidebarLeftExpand,\n IconPuzzle,\n IconSettings,\n IconSettingsAutomation,\n IconShieldCheck,\n} from \"@tabler/icons-react\";\nimport {\n useEffect,\n useMemo,\n useState,\n type ComponentType,\n type ReactNode,\n} from \"react\";\nimport { NavLink, useLocation, useNavigate } from \"react-router\";\n\nimport { cn } from \"../../lib/utils\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"../ui/dropdown-menu\";\nimport { Sheet, SheetContent, SheetDescription, SheetTitle } from \"../ui/sheet\";\nimport { Skeleton } from \"../ui/skeleton\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/tooltip\";\nimport { Header } from \"./Header\";\nimport { HeaderActionsProvider } from \"./HeaderActions\";\n\nexport type DispatchNavSection = \"primary\" | \"operations\";\n\nexport type DispatchNavIcon = ComponentType<{\n size?: number | string;\n className?: string;\n}>;\n\nexport interface DispatchNavItem {\n /** Stable id used for keys and navigation.view. Avoid built-in ids. */\n id: string;\n /** React Router path for the tab, usually backed by an app/routes/*.tsx file. */\n to: string;\n label: string;\n icon?: DispatchNavIcon;\n /** Defaults to \"operations\", which is where local management tools usually fit. */\n section?: DispatchNavSection;\n /** Override active matching for nested or multi-route tools. */\n match?: (pathname: string) => boolean;\n}\n\nexport interface DispatchExtensionConfig {\n /** Extra sidebar tabs supplied by the generated workspace. */\n navItems?: readonly DispatchNavItem[];\n /** Extra React Query keys to invalidate when Dispatch receives DB sync events. */\n queryKeys?: readonly string[];\n}\n\nconst PRIMARY_NAV_ITEMS = [\n {\n id: \"overview\",\n to: \"/overview\",\n label: \"Overview\",\n icon: IconBroadcast,\n section: \"primary\",\n },\n {\n id: \"chat\",\n to: \"/chat\",\n label: \"Chat\",\n icon: IconMessageQuestion,\n section: \"primary\",\n },\n {\n id: \"apps\",\n to: \"/apps\",\n label: \"Apps\",\n icon: IconApps,\n section: \"primary\",\n },\n] as const satisfies readonly DispatchNavItem[];\n\nconst OPERATIONS_NAV_ITEMS = [\n {\n id: \"operations\",\n to: \"/operations\",\n label: \"Operations\",\n icon: IconActivity,\n section: \"operations\",\n },\n {\n id: \"metrics\",\n to: \"/metrics\",\n label: \"Metrics\",\n icon: IconChartBar,\n section: \"operations\",\n },\n {\n id: \"automations\",\n to: \"/automations\",\n label: \"Automations\",\n icon: IconSettingsAutomation,\n section: \"operations\",\n },\n {\n id: \"approvals\",\n to: \"/approvals\",\n label: \"Approvals\",\n icon: IconShieldCheck,\n section: \"operations\",\n },\n {\n id: \"destinations\",\n to: \"/destinations\",\n label: \"Destinations\",\n icon: IconArrowUpRight,\n section: \"operations\",\n },\n {\n id: \"integrations\",\n to: \"/integrations\",\n label: \"Integrations\",\n icon: IconPuzzle,\n section: \"operations\",\n },\n {\n id: \"vault\",\n to: \"/vault\",\n label: \"Vault\",\n icon: IconKey,\n section: \"operations\",\n },\n {\n id: \"agents\",\n to: \"/agents\",\n label: \"Agents\",\n icon: IconPlugConnected,\n section: \"operations\",\n },\n {\n id: \"workspace\",\n to: \"/workspace\",\n label: \"Resources\",\n icon: IconLayersSubtract,\n section: \"operations\",\n },\n {\n id: \"settings\",\n to: \"/settings\",\n label: \"Settings\",\n icon: IconSettings,\n section: \"operations\",\n },\n] as const satisfies readonly DispatchNavItem[];\n\nconst ADVANCED_NAV_ITEMS = [\n {\n id: \"messaging\",\n to: \"/messaging\",\n label: \"Messaging\",\n icon: IconBrandTelegram,\n section: \"operations\",\n },\n {\n id: \"identities\",\n to: \"/identities\",\n label: \"Identities\",\n icon: IconFingerprint,\n section: \"operations\",\n },\n {\n id: \"audit\",\n to: \"/audit\",\n label: \"Audit\",\n icon: IconHistory,\n section: \"operations\",\n },\n {\n id: \"dreams\",\n to: \"/dreams\",\n label: \"Dreams\",\n icon: IconBrain,\n section: \"operations\",\n },\n {\n id: \"thread-debug\",\n to: \"/thread-debug\",\n label: \"Thread Debug\",\n icon: IconMessages,\n section: \"operations\",\n },\n] as const satisfies readonly DispatchNavItem[];\n\nconst EMPTY_NAV_ITEMS: readonly DispatchNavItem[] = [];\n\nconst CHROMELESS_PATHS = [\"/approval\"];\nconst SIDEBAR_COLLAPSE_KEY = \"dispatch.sidebar.collapsed\";\n\n// Routes whose page renders its own toolbar.\n// Layout still mounts the sidebar + AgentSidebar, but skips its own Header so\n// there's no double-header.\nfunction pageOwnsToolbar(pathname: string): boolean {\n if (pathname === \"/tools\" || pathname.startsWith(\"/tools/\")) return true;\n if (pathname === \"/extensions\" || pathname.startsWith(\"/extensions/\"))\n return true;\n return false;\n}\n\ninterface WorkspaceInfo {\n name: string | null;\n displayName: string | null;\n appCount: number;\n}\n\nfunction sectionFor(item: DispatchNavItem): DispatchNavSection {\n return item.section ?? \"operations\";\n}\n\nfunction navItemMatchesPath(item: DispatchNavItem, pathname: string): boolean {\n if (item.match) {\n try {\n if (item.match(pathname)) return true;\n } catch {\n return false;\n }\n }\n return pathname === item.to || pathname.startsWith(`${item.to}/`);\n}\n\nfunction navItemsForSection(\n items: readonly DispatchNavItem[],\n section: DispatchNavSection,\n): DispatchNavItem[] {\n return items.filter((item) => sectionFor(item) === section);\n}\n\nfunction localDispatchPath(pathname: string): string {\n const basePath = appBasePath();\n if (!basePath) return pathname;\n if (pathname === basePath) return \"/\";\n if (pathname.startsWith(`${basePath}/`)) {\n return pathname.slice(basePath.length) || \"/\";\n }\n return pathname;\n}\n\nfunction dispatchNavLinkTarget(path: string): string {\n if (typeof window === \"undefined\") return path;\n const basePath = appBasePath();\n if (!basePath) return path;\n // Mirror the basename calculation entry.client.tsx uses to configure the\n // router (basePath iff the current URL is under that mount, \"\" otherwise).\n // Reading the live URL directly avoids races with the previous check on\n // `__reactRouterContext.basename`, which could read undefined before the\n // entry script set it — that race produced /dispatch/dispatch/<route>\n // history entries that 404'd on back-button navigation.\n const pathname = window.location.pathname;\n const routerHasBasename =\n pathname === basePath || pathname.startsWith(`${basePath}/`);\n return routerHasBasename ? path : appPath(path);\n}\n\nfunction chatThreadPath(threadId: string): string {\n return `/chat/${encodeURIComponent(threadId)}`;\n}\n\nfunction threadIdFromPath(pathname: string): string | null {\n const match = pathname.match(/^\\/chat\\/([^/]+)/);\n if (!match) return null;\n try {\n const value = decodeURIComponent(match[1]).trim();\n return value || null;\n } catch {\n return null;\n }\n}\n\nexport function formatThreadAge(updatedAt: number, now = Date.now()) {\n const diffMs = Math.max(0, now - updatedAt);\n const minutes = Math.floor(diffMs / 60_000);\n if (minutes < 1) return \"now\";\n if (minutes < 60) return `${minutes}m`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h`;\n const days = Math.floor(hours / 24);\n if (days < 14) return `${days}d`;\n if (days < 365) return `${Math.floor(days / 7)}w`;\n return `${Math.floor(days / 365)}y`;\n}\n\nfunction threadTitle(thread: ChatThreadSummary, fallback: string) {\n return thread.title || thread.preview || fallback;\n}\n\nfunction threadUpdatedAt(thread: ChatThreadSummary) {\n return Number.isFinite(thread.updatedAt)\n ? thread.updatedAt\n : Number.isFinite(thread.createdAt)\n ? thread.createdAt\n : 0;\n}\n\nfunction DispatchChatsSection({ onNavigate }: { onNavigate?: () => void }) {\n const t = useT();\n const navigate = useNavigate();\n const location = useLocation();\n const {\n threads,\n activeThreadId,\n isLoading: chatsLoading,\n createThread,\n switchThread,\n renameThread,\n refreshThreads,\n } = useChatThreads(undefined, \"dispatch\", undefined, { autoCreate: false });\n\n const visibleThreads = useMemo(\n () =>\n threads\n .filter(\n (thread) => thread.messageCount > 0 || thread.id === activeThreadId,\n )\n .sort((a, b) => threadUpdatedAt(b) - threadUpdatedAt(a))\n .slice(0, 15),\n [activeThreadId, threads],\n );\n const localPathname = localDispatchPath(location.pathname);\n const displayedActiveThreadId =\n threadIdFromPath(localPathname) ??\n (localPathname === \"/chat\" ? null : activeThreadId);\n const chatItems: ChatHistoryItem[] = visibleThreads.map((thread) => {\n const title = threadTitle(thread, t(\"dispatch.sidebar.newChat\"));\n return {\n id: thread.id,\n title: <span title={title}>{title}</span>,\n titleText: title,\n timestamp:\n thread.id === displayedActiveThreadId\n ? \"\"\n : formatThreadAge(threadUpdatedAt(thread)),\n };\n });\n\n useEffect(() => {\n const refresh = () => refreshThreads();\n const handleRunning = (event: Event) => {\n const detail = (event as CustomEvent).detail as\n | { isRunning?: unknown }\n | undefined;\n if (detail?.isRunning === false) refreshThreads();\n };\n\n window.addEventListener(\"agent-chat:threads-updated\", refresh);\n window.addEventListener(\"agentNative.chatRunning\", handleRunning);\n window.addEventListener(\"focus\", refresh);\n return () => {\n window.removeEventListener(\"agent-chat:threads-updated\", refresh);\n window.removeEventListener(\"agentNative.chatRunning\", handleRunning);\n window.removeEventListener(\"focus\", refresh);\n };\n }, [refreshThreads]);\n\n function openThread(threadId: string, options?: { isNew?: boolean }) {\n switchThread(threadId);\n navigateWithAgentChatViewTransition(\n navigate,\n dispatchNavLinkTarget(\n options?.isNew ? \"/chat\" : chatThreadPath(threadId),\n ),\n );\n onNavigate?.();\n window.requestAnimationFrame(() => {\n window.dispatchEvent(\n new CustomEvent(\"agent-chat:open-thread\", {\n detail: { threadId, newThread: options?.isNew === true },\n }),\n );\n });\n }\n\n async function handleNewChat() {\n const threadId = await createThread();\n if (threadId) openThread(threadId, { isNew: true });\n }\n\n return (\n <div className=\"ms-4 min-w-0 space-y-0.5\">\n {chatsLoading &&\n visibleThreads.length === 0 &&\n Array.from({ length: 3 }).map((_, index) => (\n <div\n key={`chat-skeleton-${index}`}\n className=\"flex items-center gap-2 px-3 py-1\"\n >\n <Skeleton className=\"size-3.5 shrink-0 rounded-sm\" />\n <Skeleton className=\"h-3 w-3/4 rounded\" />\n </div>\n ))}\n <ChatHistoryRail\n items={chatItems}\n activeId={displayedActiveThreadId}\n onSelect={(threadId) => openThread(threadId)}\n onNewChat={() => void handleNewChat()}\n railLabels={{\n newChat: t(\"dispatch.sidebar.newChat\"),\n showMore: t(\"dispatch.sidebar.chats\"),\n showLess: t(\"dispatch.sidebar.chats\"),\n }}\n renameMaxLength={160}\n onRename={(threadId, title) => void renameThread(threadId, title)}\n labels={{\n options: (item) =>\n t(\"dispatch.sidebar.chatOptions\", {\n title: item.titleText ?? \"\",\n }),\n renameInput: (item) =>\n t(\"dispatch.sidebar.renameThread\", {\n title: item.titleText ?? \"\",\n }),\n rename: t(\"dispatch.sidebar.renameChat\"),\n }}\n className=\"min-w-0\"\n />\n </div>\n );\n}\n\nexport function NavContent({\n onNavigate,\n extensions,\n collapsed = false,\n collapsible = false,\n onCollapsedChange,\n}: {\n onNavigate?: () => void;\n extensions?: DispatchExtensionConfig;\n collapsed?: boolean;\n collapsible?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n}) {\n const t = useT();\n const location = useLocation();\n const navigate = useNavigate();\n const { data: workspace } = useActionQuery(\n \"get-workspace-info\",\n {},\n { staleTime: 60_000 },\n );\n const ws = workspace as WorkspaceInfo | undefined;\n const workspaceLabel = ws?.displayName ?? ws?.name ?? null;\n const extensionNavItems = extensions?.navItems ?? EMPTY_NAV_ITEMS;\n const primaryNavItems = [\n ...PRIMARY_NAV_ITEMS,\n ...navItemsForSection(extensionNavItems, \"primary\"),\n ];\n const operationsNavItems = [\n ...OPERATIONS_NAV_ITEMS,\n ...navItemsForSection(extensionNavItems, \"operations\"),\n ];\n const localPathname = localDispatchPath(location.pathname);\n const advancedOpen = ADVANCED_NAV_ITEMS.some((item) =>\n navItemMatchesPath(item, localPathname),\n );\n const navLabel = (item: DispatchNavItem) => {\n const key =\n item.id === \"thread-debug\"\n ? \"threadDebug\"\n : item.id === \"workspace\"\n ? \"resources\"\n : item.id;\n return t(`dispatch.nav.${key}`, { defaultValue: item.label });\n };\n\n const renderNavItem = (item: DispatchNavItem) => {\n const Icon = item.icon;\n const itemMatchesLocalPath = navItemMatchesPath(item, localPathname);\n const label = navLabel(item);\n return (\n <li key={item.id}>\n {collapsed ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <NavLink\n to={dispatchNavLinkTarget(item.to)}\n onClick={(event) => {\n if (\n item.id === \"chat\" &&\n localPathname !== \"/chat\" &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.shiftKey &&\n !event.altKey\n ) {\n event.preventDefault();\n navigateWithAgentChatViewTransition(\n navigate,\n dispatchNavLinkTarget(\"/chat\"),\n );\n onNavigate?.();\n return;\n }\n onNavigate?.();\n }}\n aria-label={label}\n className={({ isActive }) => {\n const active = isActive || itemMatchesLocalPath;\n return cn(\n \"flex h-8 w-8 items-center justify-center rounded-md text-sm\",\n active\n ? \"bg-sidebar-accent font-medium text-sidebar-accent-foreground\"\n : \"text-sidebar-foreground/70 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n );\n }}\n >\n {Icon ? (\n <Icon size={16} className=\"shrink-0\" />\n ) : (\n <span className=\"h-4 w-4 shrink-0\" aria-hidden=\"true\" />\n )}\n </NavLink>\n </TooltipTrigger>\n <TooltipContent side=\"right\">{label}</TooltipContent>\n </Tooltip>\n ) : (\n <NavLink\n to={dispatchNavLinkTarget(item.to)}\n onClick={(event) => {\n if (\n item.id === \"chat\" &&\n localPathname !== \"/chat\" &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.shiftKey &&\n !event.altKey\n ) {\n event.preventDefault();\n navigateWithAgentChatViewTransition(\n navigate,\n dispatchNavLinkTarget(\"/chat\"),\n );\n onNavigate?.();\n return;\n }\n onNavigate?.();\n }}\n className={({ isActive }) => {\n const active = isActive || itemMatchesLocalPath;\n return cn(\n \"flex h-8 w-full items-center gap-2 rounded-md px-2 text-sm\",\n active\n ? \"bg-sidebar-accent font-medium text-sidebar-accent-foreground\"\n : \"text-sidebar-foreground/70 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n );\n }}\n >\n {Icon ? (\n <Icon size={16} className=\"shrink-0\" />\n ) : (\n <span className=\"h-4 w-4 shrink-0\" aria-hidden=\"true\" />\n )}\n <span className=\"truncate\">{label}</span>\n </NavLink>\n )}\n {!collapsed && item.id === \"chat\" && itemMatchesLocalPath ? (\n <DispatchChatsSection onNavigate={onNavigate} />\n ) : null}\n </li>\n );\n };\n\n return (\n <>\n <div className={cn(\"border-b py-3\", collapsed ? \"px-1\" : \"px-4\")}>\n <div\n className={cn(\n \"flex items-center\",\n collapsed ? \"justify-center\" : \"gap-2\",\n )}\n >\n {!collapsed && (\n <>\n <img\n src={appPath(\"/agent-native-icon-light.svg\")}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"block h-5 w-auto shrink-0 dark:hidden\"\n />\n <img\n src={appPath(\"/agent-native-icon-dark.svg\")}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"hidden h-5 w-auto shrink-0 dark:block\"\n />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-lg font-bold tracking-tight text-foreground\">\n {workspaceLabel ?? \"Dispatch\"}\n </div>\n </div>\n </>\n )}\n {collapsible ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => onCollapsedChange?.(!collapsed)}\n aria-label={\n collapsed\n ? t(\"sidebar.expandSidebar\")\n : t(\"sidebar.collapseSidebar\")\n }\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-sidebar-foreground/65 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\"\n >\n {collapsed ? (\n <IconLayoutSidebarLeftExpand className=\"h-4 w-4 rtl:-scale-x-100\" />\n ) : (\n <IconLayoutSidebarLeftCollapse className=\"h-4 w-4 rtl:-scale-x-100\" />\n )}\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"right\">\n {collapsed\n ? t(\"sidebar.expandSidebar\")\n : t(\"sidebar.collapseSidebar\")}\n </TooltipContent>\n </Tooltip>\n ) : null}\n </div>\n </div>\n\n <div className=\"flex min-h-0 flex-1 flex-col overflow-y-auto\">\n <nav className={cn(\"py-3\", collapsed ? \"px-1\" : \"px-2\")}>\n <ul\n className={cn(\n collapsed ? \"flex flex-col items-center gap-1\" : \"space-y-0.5\",\n )}\n >\n {primaryNavItems.map(renderNavItem)}\n </ul>\n\n {collapsed ? (\n <>\n <ul className=\"mt-5 flex flex-col items-center gap-1\">\n {operationsNavItems.map(renderNavItem)}\n </ul>\n <ul className=\"mt-3 flex flex-col items-center gap-1\">\n {ADVANCED_NAV_ITEMS.map(renderNavItem)}\n </ul>\n </>\n ) : (\n <div className=\"mt-5\">\n <p className=\"px-2 pb-1 text-[11px] font-medium uppercase tracking-wide text-sidebar-foreground/45\">\n {t(\"dispatch.nav.operate\", { defaultValue: \"Operate\" })}\n </p>\n <ul className=\"space-y-0.5\">\n {operationsNavItems.map(renderNavItem)}\n </ul>\n\n <details className=\"group mt-3\" open={advancedOpen}>\n <summary className=\"flex h-8 cursor-pointer list-none items-center justify-between rounded-md px-2 text-xs font-medium text-sidebar-foreground/60 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground [&::-webkit-details-marker]:hidden\">\n <span>\n {t(\"dispatch.nav.advanced\", { defaultValue: \"Advanced\" })}\n </span>\n <IconChevronDown\n size={14}\n className=\"transition-transform group-open:rotate-180\"\n />\n </summary>\n <ul className=\"mt-1 space-y-0.5\">\n {ADVANCED_NAV_ITEMS.map(renderNavItem)}\n </ul>\n </details>\n </div>\n )}\n </nav>\n\n {!collapsed ? (\n <div className=\"mt-auto shrink-0\">\n <div className=\"px-2 py-1\">\n <ExtensionsSidebarSection />\n </div>\n\n <div className=\"px-3 py-2\">\n <OrgSwitcher />\n </div>\n\n <div className=\"px-3 py-2 empty:hidden\">\n <FeedbackButton />\n </div>\n </div>\n ) : null}\n </div>\n </>\n );\n}\n\nexport function Layout({\n children,\n extensions,\n agentPageHref,\n}: {\n children: ReactNode;\n extensions?: DispatchExtensionConfig;\n agentPageHref?: string;\n}) {\n const t = useT();\n const location = useLocation();\n const navigate = useNavigate();\n const [mobileOpen, setMobileOpen] = useState(false);\n const [sidebarCollapsed, setSidebarCollapsed] = useState(() => {\n if (typeof window === \"undefined\") return false;\n try {\n return window.localStorage.getItem(SIDEBAR_COLLAPSE_KEY) === \"1\";\n } catch {\n return false;\n }\n });\n const localPathname = localDispatchPath(location.pathname);\n const isChatRoute =\n localPathname === \"/chat\" || localPathname.startsWith(\"/chat/\");\n const chatHomeHandoffActive = useAgentChatHomeHandoff({\n storageKey: \"dispatch\",\n activePath: localPathname,\n enabled: !isChatRoute,\n });\n const chatHandoffLinkOptions = {\n storageKey: \"dispatch\",\n isChatPath: (pathname: string) =>\n pathname === \"/chat\" || pathname.startsWith(\"/chat/\"),\n requireActiveHandoff: true,\n };\n useAgentChatHomeHandoffLinks(chatHandoffLinkOptions);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(\n SIDEBAR_COLLAPSE_KEY,\n sidebarCollapsed ? \"1\" : \"0\",\n );\n } catch {\n // Ignore storage failures; the in-memory preference still works.\n }\n }, [sidebarCollapsed]);\n\n if (CHROMELESS_PATHS.some((path) => localPathname === path)) {\n return <>{children}</>;\n }\n\n const showHeader = !isChatRoute && !pageOwnsToolbar(localPathname);\n function openAskAgentFullscreen() {\n focusAgentChat();\n navigateWithAgentChatViewTransition(\n navigate,\n dispatchNavLinkTarget(\"/chat\"),\n );\n }\n const sidebarSuggestions = [\n t(\"dispatch.sidebar.suggestionBuildApp\"),\n t(\"dispatch.sidebar.suggestionRouteSlack\"),\n t(\"dispatch.sidebar.suggestionGrantKey\"),\n ];\n const appContent = (\n <div className=\"flex h-full min-w-0 flex-1 flex-col overflow-hidden\">\n {showHeader ? <Header onOpenMobile={() => setMobileOpen(true)} /> : null}\n <InvitationBanner />\n <main\n className={cn(\n \"flex-1\",\n isChatRoute ? \"min-h-0 overflow-hidden\" : \"overflow-y-auto\",\n )}\n >\n {showHeader ? (\n <div className=\"mx-auto max-w-7xl space-y-10 px-4 py-6 sm:px-6\">\n {children}\n </div>\n ) : (\n children\n )}\n </main>\n </div>\n );\n const content = isChatRoute ? (\n <div className=\"agent-layout-main-surface flex min-w-0 flex-1 overflow-hidden\">\n {appContent}\n </div>\n ) : (\n <AgentSidebar\n position=\"right\"\n defaultOpen={false}\n agentPageHref={agentPageHref}\n chatViewTransition\n storageKey=\"dispatch\"\n openOnChatRunning={chatHomeHandoffActive}\n onFullscreenRequest={openAskAgentFullscreen}\n emptyStateText={t(\"dispatch.sidebar.emptyAgentText\")}\n suggestions={sidebarSuggestions}\n >\n {appContent}\n </AgentSidebar>\n );\n\n return (\n <HeaderActionsProvider>\n <div className=\"agent-layout-shell flex h-screen w-full overflow-hidden bg-background\">\n <aside\n data-collapsed={sidebarCollapsed ? \"true\" : \"false\"}\n className={cn(\n \"agent-layout-left-drawer hidden shrink-0 flex-col border-e bg-sidebar text-sidebar-foreground transition-[width] duration-200 ease-out lg:flex\",\n sidebarCollapsed ? \"w-14\" : \"w-56\",\n )}\n >\n <NavContent\n extensions={extensions}\n collapsed={sidebarCollapsed}\n collapsible\n onCollapsedChange={setSidebarCollapsed}\n />\n </aside>\n\n <Sheet open={mobileOpen} onOpenChange={setMobileOpen}>\n <SheetContent\n side=\"left\"\n className=\"w-72 p-0 bg-sidebar text-sidebar-foreground [&>button]:hidden\"\n >\n <SheetTitle className=\"sr-only\">\n {t(\"dispatch.nav.navigation\")}\n </SheetTitle>\n <SheetDescription className=\"sr-only\">\n {t(\"dispatch.nav.navigationDescription\")}\n </SheetDescription>\n <div className=\"flex h-full w-full flex-col\">\n <NavContent\n extensions={extensions}\n collapsed={false}\n onNavigate={() => setMobileOpen(false)}\n />\n </div>\n </SheetContent>\n </Sheet>\n\n {content}\n </div>\n </HeaderActionsProvider>\n );\n}\n"]}
|
|
@@ -90,7 +90,7 @@ function AppResourcesDialog({ app }) {
|
|
|
90
90
|
setOpen(nextOpen);
|
|
91
91
|
if (!nextOpen)
|
|
92
92
|
setInspectedResourceId(null);
|
|
93
|
-
}, children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(DialogTrigger, { asChild: true, children: _jsx(Button, { type: "button", variant: "ghost", size: "sm", "aria-label": `View
|
|
93
|
+
}, children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(DialogTrigger, { asChild: true, children: _jsx(Button, { type: "button", variant: "ghost", size: "sm", "aria-label": `View agent resources for ${app.name}`, className: APP_CARD_ACTION_CLASS, onClick: (e) => e.stopPropagation(), children: _jsx(IconFileText, { size: 14 }) }) }) }), _jsx(TooltipContent, { children: "View agent resources" })] }), _jsxs(DialogContent, { className: "max-w-2xl", children: [_jsxs(DialogHeader, { children: [_jsxs(DialogTitle, { children: [app.name, " agent resources"] }), _jsx(DialogDescription, { children: "Workspace-scope agent resources are inherited at runtime. App shared and personal resources can override them locally." })] }), _jsxs("div", { className: "space-y-4", children: [_jsx("div", { className: "rounded-lg border bg-muted/30 px-3 py-2 text-xs leading-relaxed text-muted-foreground", children: "All-app agent resources live once at workspace scope and are read by each app agent when it builds context. Nothing is copied into this app." }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsxs(Badge, { variant: "secondary", children: [counts?.total ?? 0, " total"] }), _jsxs(Badge, { variant: "outline", children: [counts?.workspace ?? counts?.global ?? 0, " workspace"] }), _jsxs(Badge, { variant: "outline", children: [counts?.granted ?? 0, " granted"] }), _jsxs(Badge, { variant: "outline", children: [counts?.autoLoaded ?? 0, " auto-loaded"] })] }), query.isError ? (_jsx(ActionQueryError, { error: query.error, onRetry: () => void query.refetch() })) : isLoading ? (_jsxs("div", { className: "space-y-2", children: [_jsx("div", { className: "h-14 rounded-lg border bg-muted/30" }), _jsx("div", { className: "h-14 rounded-lg border bg-muted/30" }), _jsx("div", { className: "h-14 rounded-lg border bg-muted/30" })] })) : resources.length === 0 ? (_jsx("div", { className: "rounded-lg border border-dashed px-4 py-8 text-center text-sm text-muted-foreground", children: "No workspace or granted resources are visible to this app yet." })) : (_jsx("div", { className: "max-h-[420px] space-y-2 overflow-y-auto pr-1", children: resources.map((resource) => {
|
|
94
94
|
const inspected = inspectedResourceId === resource.id;
|
|
95
95
|
return (_jsxs("div", { className: "rounded-lg border px-3 py-3", children: [_jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx("span", { className: "text-sm font-medium text-foreground", children: resource.name }), _jsx(Badge, { variant: "secondary", children: resource.kind }), _jsx(Badge, { variant: "outline", children: resource.source === "workspace"
|
|
96
96
|
? "All apps"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-app-card.js","sourceRoot":"","sources":["../../src/components/workspace-app-card.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n useActionMutation,\n useActionQuery,\n} from \"@agent-native/core/client/hooks\";\nimport {\n IconChevronDown,\n IconChevronRight,\n IconClockHour4,\n IconDots,\n IconEdit,\n IconEye,\n IconEyeOff,\n IconFileText,\n IconWorld,\n IconTrash,\n} from \"@tabler/icons-react\";\nimport { useEffect, useState, type FormEvent } from \"react\";\nimport { toast } from \"sonner\";\n\nimport { cn } from \"../lib/utils\";\nimport {\n isPendingBuilderHref,\n workspaceAppHref,\n type WorkspaceAppSummary,\n} from \"../lib/workspace-apps\";\nimport { ActionQueryError } from \"./action-query-error\";\nimport { AppKeysPopover } from \"./app-keys-popover\";\nimport { Badge } from \"./ui/badge\";\nimport { Button } from \"./ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from \"./ui/dialog\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"./ui/dropdown-menu\";\nimport { Input } from \"./ui/input\";\nimport { Label } from \"./ui/label\";\nimport { Textarea } from \"./ui/textarea\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./ui/tooltip\";\nimport { AppResourceEffectiveStack } from \"./workspace-resource-effective-stack\";\n\nconst APP_CARD_ACTION_CLASS =\n \"size-7 rounded-md p-0 text-muted-foreground transition-[background-color,color] hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring data-[state=open]:bg-accent data-[state=open]:text-foreground\";\n\nexport function WorkspaceAppCard({\n app,\n className,\n}: {\n app: WorkspaceAppSummary;\n className?: string;\n}) {\n const href = workspaceAppHref(app);\n const openInNewTab = isPendingBuilderHref(app);\n const isPending = app.status === \"pending\";\n const pendingLabel = app.statusLabel || \"Builder branch\";\n const isArchived = !!app.archived;\n const audience = app.audience ?? \"internal\";\n const [editOpen, setEditOpen] = useState(false);\n const [draftName, setDraftName] = useState(app.name);\n const [draftDescription, setDraftDescription] = useState(\n app.description || \"\",\n );\n\n useEffect(() => {\n if (editOpen) return;\n setDraftName(app.name);\n setDraftDescription(app.description || \"\");\n }, [app.description, app.name, editOpen]);\n\n const archive = useActionMutation(\"archive-workspace-app\", {\n onError: (err) =>\n toast.error(`Could not hide ${app.name}: ${stringifyError(err)}`),\n });\n const unarchive = useActionMutation(\"unarchive-workspace-app\", {\n onError: (err) =>\n toast.error(`Could not restore ${app.name}: ${stringifyError(err)}`),\n });\n const removePending = useActionMutation(\"remove-pending-workspace-app\", {\n onError: (err) =>\n toast.error(`Could not remove ${app.name}: ${stringifyError(err)}`),\n });\n const updateMetadata = useActionMutation(\"update-workspace-app-metadata\", {\n onSuccess: () => {\n toast.success(`Updated ${draftName.trim() || app.name}`);\n setEditOpen(false);\n },\n onError: (err) =>\n toast.error(`Could not update ${app.name}: ${stringifyError(err)}`),\n });\n\n const handleArchive = () => {\n archive.mutate({ appId: app.id });\n toast.success(`Hid ${app.name} from the Apps list`);\n };\n const handleUnarchive = () => {\n unarchive.mutate({ appId: app.id });\n toast.success(`Restored ${app.name} to the Apps list`);\n };\n const handleRemovePending = () => {\n removePending.mutate({ appId: app.id });\n toast.success(`Removed pending ${app.name}`);\n };\n const handleMetadataSubmit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const name = draftName.trim();\n if (!name) {\n toast.error(\"App name is required.\");\n return;\n }\n updateMetadata.mutate({\n appId: app.id,\n name,\n description: draftDescription.trim(),\n });\n };\n\n return (\n <div\n aria-disabled={!href}\n className={cn(\n \"group relative rounded-xl border border-border/60 bg-card/40 p-4 transition-[background-color,border-color] hover:border-foreground/20 hover:bg-accent/15 focus-within:border-foreground/20 focus-within:bg-accent/15 aria-disabled:opacity-60\",\n isArchived && \"opacity-70\",\n className,\n )}\n >\n {href ? (\n <a\n href={href}\n target={openInNewTab ? \"_blank\" : undefined}\n rel={openInNewTab ? \"noreferrer\" : undefined}\n aria-label={`Open ${app.name}`}\n className=\"absolute inset-0 z-0 rounded-xl outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n />\n ) : null}\n\n <div className=\"pointer-events-none relative z-10 flex h-full min-w-0 items-start justify-between gap-3\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-1.5\">\n <h3 className=\"min-w-0 flex-1 truncate text-sm font-semibold text-foreground\">\n {app.name}\n </h3>\n {isPending ? (\n <Badge\n variant=\"outline\"\n className=\"shrink-0 gap-1 border-amber-500/30 bg-amber-500/10 text-amber-700 dark:text-amber-300\"\n >\n <IconClockHour4 size={12} />\n {pendingLabel}\n </Badge>\n ) : null}\n {isArchived ? (\n <Badge variant=\"outline\" className=\"shrink-0 gap-1\">\n <IconEyeOff size={12} />\n Hidden\n </Badge>\n ) : null}\n {audience === \"public\" ? (\n <Badge variant=\"outline\" className=\"shrink-0 gap-1\">\n <IconWorld size={12} />\n Public\n </Badge>\n ) : null}\n </div>\n <p className=\"mt-1 truncate font-mono text-[11px] text-muted-foreground\">\n {app.path}\n </p>\n {isPending && app.branchName ? (\n <p className=\"mt-1 truncate text-xs text-muted-foreground\">\n Builder branch: {app.branchName}\n </p>\n ) : null}\n {app.description ? (\n <p className=\"mt-2 min-h-10 line-clamp-2 text-[13px] leading-5 text-muted-foreground\">\n {app.description}\n </p>\n ) : null}\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {!isPending && !isArchived ? (\n <div className=\"pointer-events-auto\">\n <AppResourcesDialog app={app} />\n </div>\n ) : null}\n {!isPending && !isArchived ? (\n <div className=\"pointer-events-auto\">\n <AppKeysPopover appId={app.id} appName={app.name} />\n </div>\n ) : null}\n <div className=\"pointer-events-auto\">\n <DropdownMenu>\n <Tooltip>\n <TooltipTrigger asChild>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n aria-label={`More actions for ${app.name}`}\n className={cn(\n APP_CARD_ACTION_CLASS,\n \"inline-flex cursor-pointer items-center justify-center\",\n )}\n onClick={(e) => e.stopPropagation()}\n >\n <IconDots size={15} />\n </button>\n </DropdownMenuTrigger>\n </TooltipTrigger>\n <TooltipContent>More actions</TooltipContent>\n </Tooltip>\n <DropdownMenuContent align=\"end\" className=\"w-44\">\n <DropdownMenuItem\n onSelect={(event) => {\n event.preventDefault();\n setEditOpen(true);\n }}\n >\n <IconEdit size={14} className=\"mr-2\" />\n Edit details\n </DropdownMenuItem>\n {isPending ? (\n <DropdownMenuItem\n onSelect={handleRemovePending}\n className=\"text-red-600 focus:text-red-600 dark:text-red-400 dark:focus:text-red-400\"\n >\n <IconTrash size={14} className=\"mr-2\" />\n Remove from list\n </DropdownMenuItem>\n ) : isArchived ? (\n <DropdownMenuItem onSelect={handleUnarchive}>\n <IconEye size={14} className=\"mr-2\" />\n Restore to list\n </DropdownMenuItem>\n ) : (\n <DropdownMenuItem onSelect={handleArchive}>\n <IconEyeOff size={14} className=\"mr-2\" />\n Hide from list\n </DropdownMenuItem>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n </div>\n <Dialog open={editOpen} onOpenChange={setEditOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Edit app details</DialogTitle>\n </DialogHeader>\n <form className=\"space-y-4\" onSubmit={handleMetadataSubmit}>\n <div className=\"space-y-2\">\n <Label htmlFor={`app-name-${app.id}`}>Name</Label>\n <Input\n id={`app-name-${app.id}`}\n value={draftName}\n maxLength={120}\n onChange={(event) => setDraftName(event.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor={`app-description-${app.id}`}>Description</Label>\n <Textarea\n id={`app-description-${app.id}`}\n value={draftDescription}\n maxLength={500}\n rows={4}\n onChange={(event) => setDraftDescription(event.target.value)}\n />\n </div>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setEditOpen(false)}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={updateMetadata.isPending}>\n {updateMetadata.isPending ? \"Saving...\" : \"Save\"}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n\nfunction AppResourcesDialog({ app }: { app: WorkspaceAppSummary }) {\n const [open, setOpen] = useState(false);\n const [inspectedResourceId, setInspectedResourceId] = useState<string | null>(\n null,\n );\n const query = useActionQuery(\n \"list-workspace-resources-for-app\",\n { appId: app.id },\n { enabled: open },\n );\n const { data, isLoading } = query;\n\n const resources = ((data as any)?.resources ?? []) as any[];\n const counts = (data as any)?.counts;\n\n return (\n <Dialog\n open={open}\n onOpenChange={(nextOpen) => {\n setOpen(nextOpen);\n if (!nextOpen) setInspectedResourceId(null);\n }}\n >\n <Tooltip>\n <TooltipTrigger asChild>\n <DialogTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n aria-label={`View context resources for ${app.name}`}\n className={APP_CARD_ACTION_CLASS}\n onClick={(e) => e.stopPropagation()}\n >\n <IconFileText size={14} />\n </Button>\n </DialogTrigger>\n </TooltipTrigger>\n <TooltipContent>View context</TooltipContent>\n </Tooltip>\n <DialogContent className=\"max-w-2xl\">\n <DialogHeader>\n <DialogTitle>{app.name} workspace resources</DialogTitle>\n <DialogDescription>\n Workspace-level resources are inherited at runtime. App shared and\n personal resources can override them locally.\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-4\">\n <div className=\"rounded-lg border bg-muted/30 px-3 py-2 text-xs leading-relaxed text-muted-foreground\">\n All-app resources live once at workspace scope and are read by each\n app agent when it builds context. Nothing is copied into this app.\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant=\"secondary\">{counts?.total ?? 0} total</Badge>\n <Badge variant=\"outline\">\n {counts?.workspace ?? counts?.global ?? 0} workspace\n </Badge>\n <Badge variant=\"outline\">{counts?.granted ?? 0} granted</Badge>\n <Badge variant=\"outline\">\n {counts?.autoLoaded ?? 0} auto-loaded\n </Badge>\n </div>\n\n {query.isError ? (\n <ActionQueryError\n error={query.error}\n onRetry={() => void query.refetch()}\n />\n ) : isLoading ? (\n <div className=\"space-y-2\">\n <div className=\"h-14 rounded-lg border bg-muted/30\" />\n <div className=\"h-14 rounded-lg border bg-muted/30\" />\n <div className=\"h-14 rounded-lg border bg-muted/30\" />\n </div>\n ) : resources.length === 0 ? (\n <div className=\"rounded-lg border border-dashed px-4 py-8 text-center text-sm text-muted-foreground\">\n No workspace or granted resources are visible to this app yet.\n </div>\n ) : (\n <div className=\"max-h-[420px] space-y-2 overflow-y-auto pr-1\">\n {resources.map((resource) => {\n const inspected = inspectedResourceId === resource.id;\n return (\n <div\n key={resource.id}\n className=\"rounded-lg border px-3 py-3\"\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-sm font-medium text-foreground\">\n {resource.name}\n </span>\n <Badge variant=\"secondary\">{resource.kind}</Badge>\n <Badge variant=\"outline\">\n {resource.source === \"workspace\"\n ? \"All apps\"\n : \"Granted\"}\n </Badge>\n {resource.autoLoaded ? (\n <Badge variant=\"outline\">Auto-loaded</Badge>\n ) : null}\n </div>\n <div className=\"mt-1 truncate font-mono text-xs text-muted-foreground\">\n {resource.path}\n </div>\n </div>\n <div className=\"flex shrink-0 flex-col items-end gap-2\">\n {resource.source === \"grant\" ? (\n <div className=\"text-right text-[11px] text-muted-foreground\">\n Selected grant\n </div>\n ) : null}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 text-xs\"\n onClick={(event) => {\n event.stopPropagation();\n setInspectedResourceId(\n inspected ? null : resource.id,\n );\n }}\n >\n {inspected ? (\n <IconChevronDown size={14} className=\"mr-1\" />\n ) : (\n <IconChevronRight size={14} className=\"mr-1\" />\n )}\n Stack\n </Button>\n </div>\n </div>\n\n {resource.description ? (\n <p className=\"mt-2 line-clamp-2 text-xs text-muted-foreground\">\n {resource.description}\n </p>\n ) : null}\n\n {inspected ? (\n <AppResourceEffectiveStack\n appId={app.id}\n resource={resource}\n />\n ) : null}\n </div>\n );\n })}\n </div>\n )}\n </div>\n <DialogFooter>\n <Button type=\"button\" onClick={() => setOpen(false)}>\n Done\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction stringifyError(err: unknown): string {\n if (err instanceof Error) return err.message;\n return String(err);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"workspace-app-card.js","sourceRoot":"","sources":["../../src/components/workspace-app-card.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n useActionMutation,\n useActionQuery,\n} from \"@agent-native/core/client/hooks\";\nimport {\n IconChevronDown,\n IconChevronRight,\n IconClockHour4,\n IconDots,\n IconEdit,\n IconEye,\n IconEyeOff,\n IconFileText,\n IconWorld,\n IconTrash,\n} from \"@tabler/icons-react\";\nimport { useEffect, useState, type FormEvent } from \"react\";\nimport { toast } from \"sonner\";\n\nimport { cn } from \"../lib/utils\";\nimport {\n isPendingBuilderHref,\n workspaceAppHref,\n type WorkspaceAppSummary,\n} from \"../lib/workspace-apps\";\nimport { ActionQueryError } from \"./action-query-error\";\nimport { AppKeysPopover } from \"./app-keys-popover\";\nimport { Badge } from \"./ui/badge\";\nimport { Button } from \"./ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from \"./ui/dialog\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"./ui/dropdown-menu\";\nimport { Input } from \"./ui/input\";\nimport { Label } from \"./ui/label\";\nimport { Textarea } from \"./ui/textarea\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./ui/tooltip\";\nimport { AppResourceEffectiveStack } from \"./workspace-resource-effective-stack\";\n\nconst APP_CARD_ACTION_CLASS =\n \"size-7 rounded-md p-0 text-muted-foreground transition-[background-color,color] hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring data-[state=open]:bg-accent data-[state=open]:text-foreground\";\n\nexport function WorkspaceAppCard({\n app,\n className,\n}: {\n app: WorkspaceAppSummary;\n className?: string;\n}) {\n const href = workspaceAppHref(app);\n const openInNewTab = isPendingBuilderHref(app);\n const isPending = app.status === \"pending\";\n const pendingLabel = app.statusLabel || \"Builder branch\";\n const isArchived = !!app.archived;\n const audience = app.audience ?? \"internal\";\n const [editOpen, setEditOpen] = useState(false);\n const [draftName, setDraftName] = useState(app.name);\n const [draftDescription, setDraftDescription] = useState(\n app.description || \"\",\n );\n\n useEffect(() => {\n if (editOpen) return;\n setDraftName(app.name);\n setDraftDescription(app.description || \"\");\n }, [app.description, app.name, editOpen]);\n\n const archive = useActionMutation(\"archive-workspace-app\", {\n onError: (err) =>\n toast.error(`Could not hide ${app.name}: ${stringifyError(err)}`),\n });\n const unarchive = useActionMutation(\"unarchive-workspace-app\", {\n onError: (err) =>\n toast.error(`Could not restore ${app.name}: ${stringifyError(err)}`),\n });\n const removePending = useActionMutation(\"remove-pending-workspace-app\", {\n onError: (err) =>\n toast.error(`Could not remove ${app.name}: ${stringifyError(err)}`),\n });\n const updateMetadata = useActionMutation(\"update-workspace-app-metadata\", {\n onSuccess: () => {\n toast.success(`Updated ${draftName.trim() || app.name}`);\n setEditOpen(false);\n },\n onError: (err) =>\n toast.error(`Could not update ${app.name}: ${stringifyError(err)}`),\n });\n\n const handleArchive = () => {\n archive.mutate({ appId: app.id });\n toast.success(`Hid ${app.name} from the Apps list`);\n };\n const handleUnarchive = () => {\n unarchive.mutate({ appId: app.id });\n toast.success(`Restored ${app.name} to the Apps list`);\n };\n const handleRemovePending = () => {\n removePending.mutate({ appId: app.id });\n toast.success(`Removed pending ${app.name}`);\n };\n const handleMetadataSubmit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const name = draftName.trim();\n if (!name) {\n toast.error(\"App name is required.\");\n return;\n }\n updateMetadata.mutate({\n appId: app.id,\n name,\n description: draftDescription.trim(),\n });\n };\n\n return (\n <div\n aria-disabled={!href}\n className={cn(\n \"group relative rounded-xl border border-border/60 bg-card/40 p-4 transition-[background-color,border-color] hover:border-foreground/20 hover:bg-accent/15 focus-within:border-foreground/20 focus-within:bg-accent/15 aria-disabled:opacity-60\",\n isArchived && \"opacity-70\",\n className,\n )}\n >\n {href ? (\n <a\n href={href}\n target={openInNewTab ? \"_blank\" : undefined}\n rel={openInNewTab ? \"noreferrer\" : undefined}\n aria-label={`Open ${app.name}`}\n className=\"absolute inset-0 z-0 rounded-xl outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n />\n ) : null}\n\n <div className=\"pointer-events-none relative z-10 flex h-full min-w-0 items-start justify-between gap-3\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-1.5\">\n <h3 className=\"min-w-0 flex-1 truncate text-sm font-semibold text-foreground\">\n {app.name}\n </h3>\n {isPending ? (\n <Badge\n variant=\"outline\"\n className=\"shrink-0 gap-1 border-amber-500/30 bg-amber-500/10 text-amber-700 dark:text-amber-300\"\n >\n <IconClockHour4 size={12} />\n {pendingLabel}\n </Badge>\n ) : null}\n {isArchived ? (\n <Badge variant=\"outline\" className=\"shrink-0 gap-1\">\n <IconEyeOff size={12} />\n Hidden\n </Badge>\n ) : null}\n {audience === \"public\" ? (\n <Badge variant=\"outline\" className=\"shrink-0 gap-1\">\n <IconWorld size={12} />\n Public\n </Badge>\n ) : null}\n </div>\n <p className=\"mt-1 truncate font-mono text-[11px] text-muted-foreground\">\n {app.path}\n </p>\n {isPending && app.branchName ? (\n <p className=\"mt-1 truncate text-xs text-muted-foreground\">\n Builder branch: {app.branchName}\n </p>\n ) : null}\n {app.description ? (\n <p className=\"mt-2 min-h-10 line-clamp-2 text-[13px] leading-5 text-muted-foreground\">\n {app.description}\n </p>\n ) : null}\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {!isPending && !isArchived ? (\n <div className=\"pointer-events-auto\">\n <AppResourcesDialog app={app} />\n </div>\n ) : null}\n {!isPending && !isArchived ? (\n <div className=\"pointer-events-auto\">\n <AppKeysPopover appId={app.id} appName={app.name} />\n </div>\n ) : null}\n <div className=\"pointer-events-auto\">\n <DropdownMenu>\n <Tooltip>\n <TooltipTrigger asChild>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n aria-label={`More actions for ${app.name}`}\n className={cn(\n APP_CARD_ACTION_CLASS,\n \"inline-flex cursor-pointer items-center justify-center\",\n )}\n onClick={(e) => e.stopPropagation()}\n >\n <IconDots size={15} />\n </button>\n </DropdownMenuTrigger>\n </TooltipTrigger>\n <TooltipContent>More actions</TooltipContent>\n </Tooltip>\n <DropdownMenuContent align=\"end\" className=\"w-44\">\n <DropdownMenuItem\n onSelect={(event) => {\n event.preventDefault();\n setEditOpen(true);\n }}\n >\n <IconEdit size={14} className=\"mr-2\" />\n Edit details\n </DropdownMenuItem>\n {isPending ? (\n <DropdownMenuItem\n onSelect={handleRemovePending}\n className=\"text-red-600 focus:text-red-600 dark:text-red-400 dark:focus:text-red-400\"\n >\n <IconTrash size={14} className=\"mr-2\" />\n Remove from list\n </DropdownMenuItem>\n ) : isArchived ? (\n <DropdownMenuItem onSelect={handleUnarchive}>\n <IconEye size={14} className=\"mr-2\" />\n Restore to list\n </DropdownMenuItem>\n ) : (\n <DropdownMenuItem onSelect={handleArchive}>\n <IconEyeOff size={14} className=\"mr-2\" />\n Hide from list\n </DropdownMenuItem>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n </div>\n <Dialog open={editOpen} onOpenChange={setEditOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Edit app details</DialogTitle>\n </DialogHeader>\n <form className=\"space-y-4\" onSubmit={handleMetadataSubmit}>\n <div className=\"space-y-2\">\n <Label htmlFor={`app-name-${app.id}`}>Name</Label>\n <Input\n id={`app-name-${app.id}`}\n value={draftName}\n maxLength={120}\n onChange={(event) => setDraftName(event.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor={`app-description-${app.id}`}>Description</Label>\n <Textarea\n id={`app-description-${app.id}`}\n value={draftDescription}\n maxLength={500}\n rows={4}\n onChange={(event) => setDraftDescription(event.target.value)}\n />\n </div>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setEditOpen(false)}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={updateMetadata.isPending}>\n {updateMetadata.isPending ? \"Saving...\" : \"Save\"}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n\nfunction AppResourcesDialog({ app }: { app: WorkspaceAppSummary }) {\n const [open, setOpen] = useState(false);\n const [inspectedResourceId, setInspectedResourceId] = useState<string | null>(\n null,\n );\n const query = useActionQuery(\n \"list-workspace-resources-for-app\",\n { appId: app.id },\n { enabled: open },\n );\n const { data, isLoading } = query;\n\n const resources = ((data as any)?.resources ?? []) as any[];\n const counts = (data as any)?.counts;\n\n return (\n <Dialog\n open={open}\n onOpenChange={(nextOpen) => {\n setOpen(nextOpen);\n if (!nextOpen) setInspectedResourceId(null);\n }}\n >\n <Tooltip>\n <TooltipTrigger asChild>\n <DialogTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n aria-label={`View agent resources for ${app.name}`}\n className={APP_CARD_ACTION_CLASS}\n onClick={(e) => e.stopPropagation()}\n >\n <IconFileText size={14} />\n </Button>\n </DialogTrigger>\n </TooltipTrigger>\n <TooltipContent>View agent resources</TooltipContent>\n </Tooltip>\n <DialogContent className=\"max-w-2xl\">\n <DialogHeader>\n <DialogTitle>{app.name} agent resources</DialogTitle>\n <DialogDescription>\n Workspace-scope agent resources are inherited at runtime. App shared\n and personal resources can override them locally.\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-4\">\n <div className=\"rounded-lg border bg-muted/30 px-3 py-2 text-xs leading-relaxed text-muted-foreground\">\n All-app agent resources live once at workspace scope and are read by\n each app agent when it builds context. Nothing is copied into this\n app.\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant=\"secondary\">{counts?.total ?? 0} total</Badge>\n <Badge variant=\"outline\">\n {counts?.workspace ?? counts?.global ?? 0} workspace\n </Badge>\n <Badge variant=\"outline\">{counts?.granted ?? 0} granted</Badge>\n <Badge variant=\"outline\">\n {counts?.autoLoaded ?? 0} auto-loaded\n </Badge>\n </div>\n\n {query.isError ? (\n <ActionQueryError\n error={query.error}\n onRetry={() => void query.refetch()}\n />\n ) : isLoading ? (\n <div className=\"space-y-2\">\n <div className=\"h-14 rounded-lg border bg-muted/30\" />\n <div className=\"h-14 rounded-lg border bg-muted/30\" />\n <div className=\"h-14 rounded-lg border bg-muted/30\" />\n </div>\n ) : resources.length === 0 ? (\n <div className=\"rounded-lg border border-dashed px-4 py-8 text-center text-sm text-muted-foreground\">\n No workspace or granted resources are visible to this app yet.\n </div>\n ) : (\n <div className=\"max-h-[420px] space-y-2 overflow-y-auto pr-1\">\n {resources.map((resource) => {\n const inspected = inspectedResourceId === resource.id;\n return (\n <div\n key={resource.id}\n className=\"rounded-lg border px-3 py-3\"\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-sm font-medium text-foreground\">\n {resource.name}\n </span>\n <Badge variant=\"secondary\">{resource.kind}</Badge>\n <Badge variant=\"outline\">\n {resource.source === \"workspace\"\n ? \"All apps\"\n : \"Granted\"}\n </Badge>\n {resource.autoLoaded ? (\n <Badge variant=\"outline\">Auto-loaded</Badge>\n ) : null}\n </div>\n <div className=\"mt-1 truncate font-mono text-xs text-muted-foreground\">\n {resource.path}\n </div>\n </div>\n <div className=\"flex shrink-0 flex-col items-end gap-2\">\n {resource.source === \"grant\" ? (\n <div className=\"text-right text-[11px] text-muted-foreground\">\n Selected grant\n </div>\n ) : null}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 text-xs\"\n onClick={(event) => {\n event.stopPropagation();\n setInspectedResourceId(\n inspected ? null : resource.id,\n );\n }}\n >\n {inspected ? (\n <IconChevronDown size={14} className=\"mr-1\" />\n ) : (\n <IconChevronRight size={14} className=\"mr-1\" />\n )}\n Stack\n </Button>\n </div>\n </div>\n\n {resource.description ? (\n <p className=\"mt-2 line-clamp-2 text-xs text-muted-foreground\">\n {resource.description}\n </p>\n ) : null}\n\n {inspected ? (\n <AppResourceEffectiveStack\n appId={app.id}\n resource={resource}\n />\n ) : null}\n </div>\n );\n })}\n </div>\n )}\n </div>\n <DialogFooter>\n <Button type=\"button\" onClick={() => setOpen(false)}>\n Done\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction stringifyError(err: unknown): string {\n if (err instanceof Error) return err.message;\n return String(err);\n}\n"]}
|
|
@@ -36,7 +36,7 @@ export default function ApprovalsRoute() {
|
|
|
36
36
|
onError: (err) => toast.error(String(err)),
|
|
37
37
|
});
|
|
38
38
|
return (_jsx(DispatchShell, { title: "Approvals", description: "Review durable dispatch changes before they apply.", children: _jsxs("div", { className: "grid gap-4 xl:grid-cols-[minmax(0,0.9fr)_minmax(0,1.1fr)]", children: [_jsxs("section", { className: "rounded-2xl border bg-card p-5", children: [_jsx("h2", { className: "text-lg font-semibold text-foreground", children: "Approval policy" }), settingsQuery.isError ? (_jsx(ActionQueryError, { className: "mt-4", error: settingsQuery.error, onRetry: () => void settingsQuery.refetch() })) : (_jsxs("div", { className: "mt-4 space-y-4", children: [_jsxs("label", { className: "flex items-center justify-between rounded-xl border px-4 py-3", children: [_jsxs("div", { children: [_jsx("div", { className: "text-sm font-medium text-foreground", children: "Require approval for durable changes" }), _jsx("div", { className: "mt-1 text-xs text-muted-foreground", children: hasOrg
|
|
39
|
-
? "Applies to saved destinations, shared dream proposals, All-app
|
|
39
|
+
? "Applies to saved destinations, shared dream proposals, All-app agent resources, and dispatch settings."
|
|
40
40
|
: "Requires a team workspace. Set one up on the Team page." })] }), _jsx(Switch, { checked: settings?.enabled || false, disabled: !hasOrg || savePolicy.isPending, onCheckedChange: (checked) => savePolicy.mutate({
|
|
41
41
|
enabled: checked,
|
|
42
42
|
approverEmails: settings?.approverEmails || approverList,
|