@agent-native/core 0.102.0 → 0.102.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/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +15 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/client/AgentPanel.tsx +7 -0
- package/corpus/core/src/client/AssistantChat.tsx +7 -0
- package/corpus/core/src/client/agent-chat-adapter.ts +7 -1
- package/corpus/core/src/client/agent-page/AgentTabsPage.tsx +1 -1
- package/corpus/core/src/client/chat/message-components.tsx +17 -3
- package/corpus/core/src/client/composer/ComposerPlusMenu.tsx +96 -6
- package/corpus/core/src/client/composer/asset-picker-url.ts +80 -0
- package/corpus/core/src/client/error-format.ts +24 -0
- package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +8 -1
- package/corpus/templates/analytics/changelog/2026-07-15-fixed-the-agent-discarding-a-successful-dashboard-edit-and-r.md +6 -0
- package/corpus/templates/analytics/server/lib/real-data-actions.ts +30 -1
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +15 -0
- package/corpus/templates/assets/app/routes/library.tsx +69 -0
- package/corpus/templates/assets/changelog/2026-07-15-fixed-top-level-image-picker-selections-returning-to-the-com.md +6 -0
- package/corpus/templates/clips/actions/disconnect-calendar.ts +57 -9
- package/corpus/templates/clips/actions/generate-workflow.ts +102 -59
- package/corpus/templates/clips/actions/get-recording-player-data.ts +64 -1
- package/corpus/templates/clips/actions/regenerate-summary.ts +7 -0
- package/corpus/templates/clips/actions/regenerate-title.ts +29 -11
- package/corpus/templates/clips/app/components/editor/editor-layout.tsx +22 -11
- package/corpus/templates/clips/app/components/editor/thumbnail-picker.tsx +87 -9
- package/corpus/templates/clips/app/components/editor/trim-handles.tsx +15 -0
- package/corpus/templates/clips/app/components/editor/waveform.tsx +21 -8
- package/corpus/templates/clips/app/components/library/folder-tree.tsx +52 -0
- package/corpus/templates/clips/app/components/player/settings-panel.tsx +86 -46
- package/corpus/templates/clips/app/components/player/share-dialog.tsx +43 -37
- package/corpus/templates/clips/app/components/player/video-player.tsx +45 -1
- package/corpus/templates/clips/app/i18n/ar-SA.ts +2 -0
- package/corpus/templates/clips/app/i18n/de-DE.ts +2 -0
- package/corpus/templates/clips/app/i18n/en-US.ts +2 -0
- package/corpus/templates/clips/app/i18n/es-ES.ts +2 -0
- package/corpus/templates/clips/app/i18n/fr-FR.ts +2 -0
- package/corpus/templates/clips/app/i18n/hi-IN.ts +2 -0
- package/corpus/templates/clips/app/i18n/ja-JP.ts +2 -0
- package/corpus/templates/clips/app/i18n/ko-KR.ts +2 -0
- package/corpus/templates/clips/app/i18n/pt-BR.ts +2 -0
- package/corpus/templates/clips/app/i18n/zh-CN.ts +2 -0
- package/corpus/templates/clips/app/i18n/zh-TW.ts +2 -0
- package/corpus/templates/clips/app/lib/timestamp-mapping.ts +14 -0
- package/corpus/templates/clips/app/routes/_app.library._index.tsx +1 -2
- package/corpus/templates/clips/app/routes/_index.tsx +1 -2
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +71 -31
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +4 -1
- package/corpus/templates/clips/changelog/2026-07-15-ai-workflow-generation-now-stays-visible-avoids-duplicate-re.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-clip-playback-and-cta-controls-remain-interactive-through-ed.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-clip-titles-no-longer-describe-the-product-as-a-loom-alterna.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-description-regeneration-now-opens-the-agent-chat-so-progres.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-direct-recording-urls-now-respect-share-link-and-password-ac.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-disconnecting-a-calendar-now-clears-unrecorded-synced-meetin.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-folders-now-expose-rename-and-delete-actions-directly-in-the.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-recording-pages-now-explain-sign-in-access-and-avoid-showing.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-the-clips-extension-quick-actions-toolbar-can-be-moved-out-o.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-the-editor-now-skips-cut-sections-during-preview-and-keeps-t.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-thumbnail-capture-now-updates-previews-while-scrubbing-and-l.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-windows-permission-links-open-the-matching-settings-page.md +6 -0
- package/corpus/templates/clips/chrome-extension/src/content-script.ts +117 -2
- package/corpus/templates/clips/chrome-extension/src/overlay.ts +27 -0
- package/corpus/templates/clips/desktop/src-tauri/tauri.conf.json +1 -1
- package/corpus/templates/clips/server/lib/calendar-event-meetings.ts +139 -101
- package/corpus/templates/clips/server/lib/recording-page-access.ts +35 -0
- package/corpus/templates/content/app/components/editor/DescriptionField.tsx +10 -2
- package/corpus/templates/content/changelog/2026-07-15-page-and-database-descriptions-now-use-a-clean-single-line-f.md +6 -0
- package/corpus/templates/design/app/components/design/design-canvas/external-preview.ts +7 -3
- package/corpus/templates/design/changelog/2026-07-15-prototype-print-and-download-buttons-now-work-in-preview.md +6 -0
- package/corpus/templates/slides/actions/extract-pdf.ts +1 -1
- package/corpus/templates/slides/actions/import-file.ts +4 -1
- package/corpus/templates/slides/app/components/editor/ImageGenPanel.tsx +1 -1
- package/corpus/templates/slides/app/components/editor/ImageSearchPanel.tsx +9 -12
- package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +29 -21
- package/corpus/templates/slides/app/i18n/ar-SA.ts +1 -0
- package/corpus/templates/slides/app/i18n/de-DE.ts +1 -0
- package/corpus/templates/slides/app/i18n/en-US.ts +1 -0
- package/corpus/templates/slides/app/i18n/es-ES.ts +1 -0
- package/corpus/templates/slides/app/i18n/fr-FR.ts +1 -0
- package/corpus/templates/slides/app/i18n/hi-IN.ts +1 -0
- package/corpus/templates/slides/app/i18n/ja-JP.ts +1 -0
- package/corpus/templates/slides/app/i18n/ko-KR.ts +1 -0
- package/corpus/templates/slides/app/i18n/pt-BR.ts +1 -0
- package/corpus/templates/slides/app/i18n/zh-CN.ts +1 -0
- package/corpus/templates/slides/app/i18n/zh-TW.ts +1 -0
- package/corpus/templates/slides/changelog/2026-07-15-image-search-and-generation-controls-now-use-the-registered-.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-15-pdf-deck-references-can-be-imported-for-slide-inspiration-ag.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-15-stable-style-inspector-dock.md +6 -0
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +5 -0
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +7 -0
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +8 -1
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/agent-page/AgentTabsPage.js +1 -1
- package/dist/client/agent-page/AgentTabsPage.js.map +1 -1
- package/dist/client/chat/message-components.d.ts +4 -0
- package/dist/client/chat/message-components.d.ts.map +1 -1
- package/dist/client/chat/message-components.js +10 -3
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/composer/ComposerPlusMenu.d.ts.map +1 -1
- package/dist/client/composer/ComposerPlusMenu.js +58 -6
- package/dist/client/composer/ComposerPlusMenu.js.map +1 -1
- package/dist/client/composer/asset-picker-url.d.ts +16 -0
- package/dist/client/composer/asset-picker-url.d.ts.map +1 -0
- package/dist/client/composer/asset-picker-url.js +64 -0
- package/dist/client/composer/asset-picker-url.js.map +1 -0
- package/dist/client/error-format.d.ts.map +1 -1
- package/dist/client/error-format.js +17 -0
- package/dist/client/error-format.js.map +1 -1
- package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
- package/dist/client/resources/McpIntegrationDialog.js +6 -1
- package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/observability/routes.d.ts +1 -1
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/package.json +1 -1
|
@@ -76,7 +76,7 @@ function EmptySlot({ label }) {
|
|
|
76
76
|
return (_jsx("div", { className: "flex min-h-[220px] items-center justify-center rounded-lg border border-dashed border-border/70 bg-muted/10", children: _jsx("span", { className: "sr-only", children: label }) }));
|
|
77
77
|
}
|
|
78
78
|
function FilesTab({ scope }) {
|
|
79
|
-
return (_jsx("div", { className: "h-
|
|
79
|
+
return (_jsx("div", { className: "h-[calc(100vh-14rem)] min-h-[480px]", children: _jsx(ResourcesPanel, { showMcpServers: false, scope: scope === "org" ? "shared" : "personal" }, scope) }));
|
|
80
80
|
}
|
|
81
81
|
function ScopeBadge({ scope }) {
|
|
82
82
|
return (_jsx("span", { className: "rounded-full border border-border bg-muted/40 px-2 py-0.5 text-[10px] font-medium text-muted-foreground", children: scope === "user" ? "Personal" : "Organization" }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentTabsPage.js","sourceRoot":"","sources":["../../../src/client/agent-page/AgentTabsPage.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n IconBrain,\n IconClock,\n IconExternalLink,\n IconFolder,\n IconPlugConnected,\n IconSearch,\n IconShieldLock,\n IconX,\n} from \"@tabler/icons-react\";\nimport {\n lazy,\n Suspense,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n} from \"react\";\n\nimport {\n MCP_CONNECT_GUIDES,\n MCP_CONNECT_MCP_URL_TEMPLATE,\n MCP_STATIC_TOKEN_FALLBACK,\n interpolateMcpConnectTemplate,\n type McpConnectTemplateValues,\n} from \"../../shared/mcp-connect-content.js\";\nimport { appPath } from \"../api-path.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport { useT } from \"../i18n.js\";\nimport { useOrg } from \"../org/hooks.js\";\nimport {\n McpIntegrationDialog,\n // The dialog is intentionally reused here so the Agent page remains a thin\n // host for the existing MCP management flow.\n} from \"../resources/McpIntegrationDialog.js\";\nimport { McpServerDetail } from \"../resources/McpServerDetail.js\";\nimport {\n useCreateMcpServer,\n useDeleteMcpServer,\n useMcpServers,\n type McpServer,\n type McpServerScope,\n} from \"../resources/use-mcp-servers.js\";\nimport { AgentsSection } from \"../settings/AgentsSection.js\";\nimport type {\n SettingsSearchEntry,\n SettingsTabItem,\n} from \"../settings/SettingsTabsPage.js\";\nimport { cn } from \"../utils.js\";\nimport type { AgentPageScope, AgentPageTabProps } from \"./types.js\";\n\nconst AgentContextTab = lazy(() =>\n import(\"./AgentContextTab.js\").then((module) => ({\n default: module.AgentContextTab,\n })),\n);\nconst AgentJobsTab = lazy(() =>\n import(\"./AgentJobsTab.js\").then((module) => ({\n default: module.AgentJobsTab,\n })),\n);\nconst ResourcesPanel = lazy(() =>\n import(\"../resources/ResourcesPanel.js\").then((module) => ({\n default: module.ResourcesPanel,\n })),\n);\n\ntype SettingsTabIcon = ComponentType<{ className?: string }>;\n\nfunction normalizeTabId(value?: string | null): string | null {\n const normalized = value\n ?.replace(/^#/, \"\")\n .trim()\n .toLowerCase()\n .replace(/[\"']/g, \"\")\n .replace(/[\\s_]+/g, \"-\");\n return normalized || null;\n}\n\nfunction resolveTabId(\n tabs: SettingsTabItem[],\n value?: string | null,\n): string | null {\n const normalized = normalizeTabId(value);\n if (!normalized) return null;\n if (tabs.some((tab) => tab.id === normalized)) return normalized;\n const section = normalized.split(\":\", 1)[0];\n const owner = tabs.find((tab) =>\n tab.searchEntries?.some(\n (entry) => normalizeTabId(entry.hash ?? entry.id) === section,\n ),\n );\n return owner?.id ?? null;\n}\n\nfunction updateTabHash(tabId: string) {\n if (typeof window === \"undefined\") return;\n const hash = tabId === \"context\" ? \"\" : `#${encodeURIComponent(tabId)}`;\n window.history.pushState(\n null,\n \"\",\n `${window.location.pathname}${window.location.search}${hash}`,\n );\n}\n\nfunction initialScope(): AgentPageScope {\n if (typeof window === \"undefined\") return \"user\";\n try {\n const queryScope = new URLSearchParams(window.location.search).get(\"scope\");\n if (queryScope === \"org\" || queryScope === \"user\") return queryScope;\n return localStorage.getItem(\"agent-page-scope\") === \"org\" ? \"org\" : \"user\";\n } catch {\n return \"user\";\n }\n}\n\nfunction updateScopeUrl(scope: AgentPageScope) {\n if (typeof window === \"undefined\") return;\n const search = new URLSearchParams(window.location.search);\n search.set(\"scope\", scope);\n const query = search.toString();\n window.history.replaceState(\n null,\n \"\",\n `${window.location.pathname}${query ? `?${query}` : \"\"}${window.location.hash}`,\n );\n}\n\nfunction TabLoading() {\n return (\n <div className=\"space-y-3\" aria-busy=\"true\">\n <div className=\"h-5 w-36 animate-pulse rounded bg-muted\" />\n <div className=\"h-20 animate-pulse rounded-lg border border-border bg-muted/30\" />\n <div className=\"h-20 animate-pulse rounded-lg border border-border bg-muted/30\" />\n </div>\n );\n}\n\nfunction EmptySlot({ label }: { label: string }) {\n return (\n <div className=\"flex min-h-[220px] items-center justify-center rounded-lg border border-dashed border-border/70 bg-muted/10\">\n <span className=\"sr-only\">{label}</span>\n </div>\n );\n}\n\nfunction FilesTab({ scope }: AgentPageTabProps) {\n return (\n <div className=\"h-full min-h-[360px]\">\n <ResourcesPanel\n key={scope}\n showMcpServers={false}\n scope={scope === \"org\" ? \"shared\" : \"personal\"}\n />\n </div>\n );\n}\n\nfunction ScopeBadge({ scope }: { scope: McpServerScope }) {\n return (\n <span className=\"rounded-full border border-border bg-muted/40 px-2 py-0.5 text-[10px] font-medium text-muted-foreground\">\n {scope === \"user\" ? \"Personal\" : \"Organization\"}\n </span>\n );\n}\n\nfunction ServerStatus({ server }: { server: McpServer }) {\n if (server.status.state === \"connected\") {\n return (\n <span className=\"text-[11px] text-emerald-600 dark:text-emerald-400\">\n Connected · {server.status.toolCount} tools\n </span>\n );\n }\n if (server.status.state === \"error\") {\n return (\n <span className=\"truncate text-[11px] text-destructive\">\n Connection error\n </span>\n );\n }\n return (\n <span className=\"text-[11px] text-muted-foreground\">Status unknown</span>\n );\n}\n\nfunction ConnectionsTab({ scope, canManageOrg = false }: AgentPageTabProps) {\n const t = useT();\n const serversQuery = useMcpServers();\n const createServer = useCreateMcpServer();\n const deleteServer = useDeleteMcpServer();\n const [dialogOpen, setDialogOpen] = useState(false);\n const [selectedServer, setSelectedServer] = useState<McpServer | null>(null);\n const [deleteTarget, setDeleteTarget] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const data = serversQuery.data;\n const hasOrg = Boolean(data?.orgId);\n const canCreateOrgMcp = hasOrg && canManageOrg;\n const activeScope: McpServerScope = scope === \"org\" ? \"org\" : \"user\";\n\n const onCreateMcpServer = useCallback(\n async (args: {\n scope: McpServerScope;\n name: string;\n url: string;\n headers?: Record<string, string>;\n description?: string;\n }) => {\n if (args.scope === \"org\" && !canCreateOrgMcp) {\n throw new Error(\n \"Only organization admins can add organization MCP servers.\",\n );\n }\n return createServer.mutateAsync(args);\n },\n [canCreateOrgMcp, createServer],\n );\n\n const removeServer = async (server: McpServer) => {\n const key = `${server.scope}:${server.id}`;\n if (deleteTarget !== key) {\n setDeleteTarget(key);\n return;\n }\n setError(null);\n try {\n await deleteServer.mutateAsync({ id: server.id, scope: server.scope });\n if (\n selectedServer?.id === server.id &&\n selectedServer.scope === server.scope\n ) {\n setSelectedServer(null);\n }\n setDeleteTarget(null);\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause));\n }\n };\n\n const renderServer = (server: McpServer) => {\n const key = `${server.scope}:${server.id}`;\n const canDelete = server.scope === \"user\" || canManageOrg;\n const selected =\n selectedServer?.id === server.id && selectedServer.scope === server.scope;\n return (\n <div\n key={key}\n className={cn(\n \"rounded-lg border border-border bg-card p-3 transition-colors\",\n selected && \"border-foreground/30 bg-accent/20\",\n )}\n >\n <div className=\"flex items-start gap-3\">\n <button\n type=\"button\"\n onClick={() => setSelectedServer(selected ? null : server)}\n className=\"min-w-0 flex-1 cursor-pointer text-start\"\n >\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"truncate text-sm font-medium text-foreground\">\n {server.name}\n </span>\n <ScopeBadge scope={server.scope} />\n {server.scope === activeScope && (\n <span className=\"text-[10px] text-muted-foreground\">\n Selected scope\n </span>\n )}\n </div>\n <code className=\"mt-1 block truncate text-[11px] text-muted-foreground\">\n {server.url}\n </code>\n <div className=\"mt-2 flex items-center gap-2\">\n <ServerStatus server={server} />\n {server.description && (\n <span className=\"truncate text-[11px] text-muted-foreground/70\">\n {server.description}\n </span>\n )}\n </div>\n </button>\n {canDelete && (\n <button\n type=\"button\"\n onClick={() => void removeServer(server)}\n disabled={deleteServer.isPending}\n className={cn(\n \"cursor-pointer rounded-md px-2 py-1 text-[11px] font-medium text-muted-foreground hover:bg-destructive/10 hover:text-destructive\",\n deleteTarget === key && \"bg-destructive/10 text-destructive\",\n )}\n >\n {deleteTarget === key ? \"Confirm\" : \"Delete\"}\n </button>\n )}\n </div>\n {selected && (\n <div className=\"mt-3 border-t border-border/70 pt-3\">\n <McpServerDetail server={server} />\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div className=\"space-y-8\">\n <section className=\"space-y-3\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <h2 className=\"text-base font-semibold text-foreground\">\n MCP servers\n </h2>\n <p className=\"mt-1 max-w-2xl text-sm leading-relaxed text-muted-foreground\">\n Tools and services this agent can reach. The page scope controls\n where new servers are saved.\n </p>\n </div>\n <button\n type=\"button\"\n onClick={() => {\n setError(null);\n setDialogOpen(true);\n }}\n className=\"cursor-pointer rounded-md bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground hover:bg-primary/90\"\n >\n {t(\"mcpIntegrations.connect\")}\n </button>\n </div>\n {error && (\n <p className=\"rounded-md border border-destructive/20 bg-destructive/5 px-3 py-2 text-xs text-destructive\">\n {error}\n </p>\n )}\n {serversQuery.isLoading ? (\n <TabLoading />\n ) : serversQuery.isError ? (\n <p className=\"rounded-md border border-destructive/20 bg-destructive/5 px-3 py-2 text-xs text-destructive\">\n Could not load MCP servers.\n </p>\n ) : data && data.user.length + data.org.length > 0 ? (\n <div className=\"space-y-2\">\n {data.user.map(renderServer)}\n {data.org.map(renderServer)}\n </div>\n ) : (\n <div className=\"rounded-lg border border-dashed border-border p-5 text-sm text-muted-foreground\">\n No MCP servers are connected yet.\n </div>\n )}\n <McpIntegrationDialog\n open={dialogOpen}\n onOpenChange={setDialogOpen}\n defaultScope={activeScope}\n canCreateOrgMcp={canCreateOrgMcp}\n hasOrg={hasOrg}\n onCreateMcpServer={onCreateMcpServer}\n />\n </section>\n\n <section className=\"space-y-3 border-t border-border/70 pt-6\">\n <div>\n <h2 className=\"text-base font-semibold text-foreground\">\n Remote agents\n </h2>\n <p className=\"mt-1 max-w-2xl text-sm leading-relaxed text-muted-foreground\">\n Other agents this app can call through A2A.\n </p>\n </div>\n <div className=\"rounded-lg border border-border bg-card p-4\">\n <AgentsSection />\n </div>\n </section>\n </div>\n );\n}\n\ninterface AccessUrls {\n appName: string;\n appUrl: string;\n mcpUrl: string;\n connectUrl: string;\n agentCardUrl: string;\n}\n\nfunction CopyField({ label, value }: { label: string; value: string }) {\n const [copied, setCopied] = useState(false);\n const copy = async () => {\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n window.setTimeout(() => setCopied(false), 1600);\n } catch {\n setCopied(false);\n }\n };\n return (\n <div className=\"flex min-w-0 items-center gap-2 rounded-md border border-border bg-muted/20 p-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-[10px] font-semibold uppercase tracking-wide text-muted-foreground/70\">\n {label}\n </div>\n <code className=\"mt-1 block truncate text-xs text-foreground\">\n {value}\n </code>\n </div>\n <button\n type=\"button\"\n onClick={() => void copy()}\n className=\"shrink-0 cursor-pointer rounded-md border border-border bg-background px-2.5 py-1.5 text-[11px] font-medium text-foreground hover:bg-accent\"\n >\n {copied ? \"Copied\" : \"Copy\"}\n </button>\n </div>\n );\n}\n\nfunction AccessTab({\n appName: appNameProp,\n}: AgentPageTabProps & { appName?: string }) {\n const [urls, setUrls] = useState<AccessUrls | null>(null);\n const [agentCardAvailable, setAgentCardAvailable] = useState(false);\n const [activeGuide, setActiveGuide] = useState(MCP_CONNECT_GUIDES[0]?.id);\n\n useEffect(() => {\n const origin = window.location.origin;\n const baseUrl = new URL(appPath(\"/\"), origin).toString().replace(/\\/$/, \"\");\n const hostname = window.location.hostname || \"app\";\n const metaSiteName = document\n .querySelector('meta[property=\"og:site_name\"]')\n ?.getAttribute(\"content\")\n ?.trim();\n const hostnameGuess =\n hostname !== \"localhost\" && hostname !== \"127.0.0.1\"\n ? hostname.split(\".\")[0]\n : \"\";\n const appName =\n appNameProp?.trim() || metaSiteName || hostnameGuess || \"this app\";\n const templateValues = {\n appName,\n appUrl: baseUrl,\n mcpUrl: \"\",\n serverId: `agent-native-${hostname}`,\n } satisfies McpConnectTemplateValues;\n setUrls({\n appName,\n appUrl: baseUrl,\n mcpUrl: interpolateMcpConnectTemplate(\n MCP_CONNECT_MCP_URL_TEMPLATE,\n templateValues,\n ),\n connectUrl: new URL(appPath(\"/mcp/connect\"), origin).toString(),\n agentCardUrl: new URL(\n appPath(\"/.well-known/agent-card.json\"),\n origin,\n ).toString(),\n });\n }, [appNameProp]);\n\n useEffect(() => {\n if (!urls) return;\n let cancelled = false;\n fetch(urls.agentCardUrl)\n .then((response) => {\n if (!cancelled) setAgentCardAvailable(response.ok);\n })\n .catch(() => {\n if (!cancelled) setAgentCardAvailable(false);\n });\n return () => {\n cancelled = true;\n };\n }, [urls]);\n\n const templateValues: McpConnectTemplateValues | null = urls\n ? {\n appName: urls.appName,\n appUrl: urls.appUrl,\n mcpUrl: urls.mcpUrl,\n serverId: `agent-native-${window.location.hostname || \"app\"}`,\n }\n : null;\n const guide =\n MCP_CONNECT_GUIDES.find((item) => item.id === activeGuide) ??\n MCP_CONNECT_GUIDES[0];\n\n return (\n <div className=\"space-y-6\">\n <div>\n <h2 className=\"text-base font-semibold text-foreground\">Access</h2>\n <p className=\"mt-1 max-w-2xl text-sm leading-relaxed text-muted-foreground\">\n Choose which external clients can talk to this app's agent and\n follow the setup for each one. Grants, scopes, and revocation will\n live here in a future pass.\n </p>\n </div>\n {urls ? (\n <>\n <CopyField label=\"MCP URL\" value={urls.mcpUrl} />\n {agentCardAvailable && (\n <CopyField label=\"A2A agent card\" value={urls.agentCardUrl} />\n )}\n <section className=\"space-y-3 rounded-lg border border-border bg-card p-4\">\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">\n Client setup\n </h3>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n These instructions are also available on the full connect page.\n </p>\n </div>\n <div\n className=\"flex gap-1 overflow-x-auto border-b border-border pb-2\"\n role=\"tablist\"\n aria-label=\"Choose your AI assistant\"\n >\n {MCP_CONNECT_GUIDES.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={item.id === guide?.id}\n onClick={() => setActiveGuide(item.id)}\n className={cn(\n \"shrink-0 cursor-pointer rounded-md px-2.5 py-1.5 text-xs font-medium\",\n item.id === guide?.id\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent/50 hover:text-foreground\",\n )}\n >\n {item.label}\n </button>\n ))}\n </div>\n {guide && templateValues && (\n <div className=\"space-y-3 pt-1\" role=\"tabpanel\">\n {guide.steps?.length ? (\n <ol className=\"list-decimal space-y-2 ps-5 text-xs leading-relaxed text-muted-foreground\">\n {guide.steps.map((step) => (\n <li key={step}>\n {interpolateMcpConnectTemplate(step, templateValues)}\n </li>\n ))}\n </ol>\n ) : null}\n {guide.intro && (\n <p className=\"text-xs text-muted-foreground\">\n {interpolateMcpConnectTemplate(guide.intro, templateValues)}\n </p>\n )}\n {guide.commandTemplate && (\n <CopyField\n label=\"Command\"\n value={interpolateMcpConnectTemplate(\n guide.commandTemplate,\n templateValues,\n )}\n />\n )}\n {guide.configTemplate && (\n <CopyField\n label=\"MCP config\"\n value={interpolateMcpConnectTemplate(\n guide.configTemplate,\n templateValues,\n )}\n />\n )}\n {guide.action?.kind === \"link\" && guide.action.href && (\n <a\n href={guide.action.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-3 py-1.5 text-xs font-medium text-foreground hover:bg-accent\"\n >\n {guide.action.label}\n <IconExternalLink className=\"size-3.5\" />\n </a>\n )}\n {guide.note && (\n <p className=\"text-xs leading-relaxed text-muted-foreground\">\n {interpolateMcpConnectTemplate(guide.note, templateValues)}\n </p>\n )}\n </div>\n )}\n </section>\n <section className=\"rounded-lg border border-border/70 bg-muted/10 p-4\">\n <h3 className=\"text-sm font-semibold text-foreground\">\n {MCP_STATIC_TOKEN_FALLBACK.title}\n </h3>\n <p className=\"mt-1 text-xs leading-relaxed text-muted-foreground\">\n {MCP_STATIC_TOKEN_FALLBACK.state}. Open the connect page to create\n a token for clients that cannot complete OAuth.\n </p>\n <a\n href={urls.connectUrl}\n className=\"mt-3 inline-flex cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-3 py-1.5 text-xs font-medium text-foreground hover:bg-accent\"\n >\n Open full connect page\n <IconExternalLink className=\"size-3.5\" />\n </a>\n </section>\n </>\n ) : (\n <TabLoading />\n )}\n </div>\n );\n}\n\nexport interface AgentTabsPageProps {\n /**\n * Human-readable app name used in the Access tab's connect instructions\n * (e.g. \"name it Mail\"). Falls back to the `og:site_name` meta tag, then a\n * hostname-derived guess — never `document.title`, which this page owns.\n */\n appName?: string;\n extraTabs?: SettingsTabItem[];\n defaultTab?: string;\n className?: string;\n /** Whether to render the Agent page search box. Defaults to true. */\n enableSearch?: boolean;\n searchPlaceholder?: string;\n hiddenTabs?: string[];\n value?: string;\n onValueChange?: (tabId: string) => void;\n}\n\nexport function AgentTabsPage({\n appName,\n extraTabs = [],\n defaultTab = \"context\",\n className,\n enableSearch = true,\n searchPlaceholder = \"Search agent settings\",\n hiddenTabs = [],\n value,\n onValueChange,\n}: AgentTabsPageProps) {\n const { data: org, isLoading: orgLoading } = useOrg();\n const hasOrg = Boolean(org?.orgId);\n const canManageOrg =\n !org?.orgId || org.role === \"owner\" || org.role === \"admin\";\n const [scope, setScope] = useState<AgentPageScope>(initialScope);\n const scopeInitialized = useRef(false);\n const rootRef = useRef<HTMLDivElement | null>(null);\n const searchRef = useRef<HTMLInputElement | null>(null);\n const [query, setQuery] = useState(\"\");\n const normalizedHiddenTabs = useMemo(\n () => new Set(hiddenTabs.map((tab) => normalizeTabId(tab)).filter(Boolean)),\n [hiddenTabs],\n );\n\n const tabs = useMemo<SettingsTabItem[]>(\n () => [\n {\n id: \"context\",\n label: \"Context\",\n icon: IconBrain,\n keywords: \"influence provenance prompt\",\n content: (\n <div className=\"space-y-4\">\n <div>\n <h1 className=\"text-lg font-semibold text-foreground\">Context</h1>\n <p className=\"mt-1 text-sm leading-relaxed text-muted-foreground\">\n See what can influence this agent and why.\n </p>\n </div>\n <div className=\"min-h-[220px] rounded-lg border border-dashed border-border/70 bg-muted/10 p-4\">\n <Suspense fallback={<TabLoading />}>\n <AgentContextTab scope={scope} canManageOrg={canManageOrg} />\n </Suspense>\n </div>\n </div>\n ),\n },\n {\n id: \"files\",\n label: \"Files\",\n icon: IconFolder,\n keywords: \"workspace resources instructions skills\",\n content: (\n <div className=\"space-y-4\">\n <div>\n <h1 className=\"text-lg font-semibold text-foreground\">Files</h1>\n <p className=\"mt-1 text-sm leading-relaxed text-muted-foreground\">\n Workspace files that shape the agent's context.\n </p>\n </div>\n <Suspense fallback={<TabLoading />}>\n <FilesTab scope={scope} canManageOrg={canManageOrg} />\n </Suspense>\n </div>\n ),\n },\n {\n id: \"connections\",\n label: \"Connections\",\n icon: IconPlugConnected,\n keywords: \"mcp servers tools remote agents a2a\",\n searchEntries: [\n { id: \"mcp-servers\", label: \"MCP servers\", keywords: \"tools\" },\n { id: \"remote-agents\", label: \"Remote agents\", keywords: \"a2a\" },\n ],\n content: <ConnectionsTab scope={scope} canManageOrg={canManageOrg} />,\n },\n {\n id: \"jobs\",\n label: \"Jobs\",\n icon: IconClock,\n keywords: \"scheduled automations recurring\",\n content: (\n <div className=\"space-y-4\">\n <div>\n <h1 className=\"text-lg font-semibold text-foreground\">Jobs</h1>\n <p className=\"mt-1 text-sm leading-relaxed text-muted-foreground\">\n Scheduled work that can run with this agent.\n </p>\n </div>\n <div className=\"min-h-[220px] rounded-lg border border-dashed border-border/70 bg-muted/10 p-4\">\n <Suspense fallback={<TabLoading />}>\n <AgentJobsTab scope={scope} canManageOrg={canManageOrg} />\n </Suspense>\n </div>\n </div>\n ),\n },\n {\n id: \"access\",\n label: \"Access\",\n icon: IconShieldLock,\n keywords: \"external clients oauth a2a exposure\",\n searchEntries: [\n {\n id: \"mcp-connect\",\n label: \"External client setup\",\n keywords: \"oauth connect\",\n },\n {\n id: \"a2a-agent-card\",\n label: \"A2A agent card\",\n keywords: \"agent card\",\n },\n ],\n content: (\n <AccessTab\n scope={scope}\n canManageOrg={canManageOrg}\n appName={appName}\n />\n ),\n },\n ...extraTabs,\n ],\n [canManageOrg, extraTabs, scope],\n );\n const visibleTabs = useMemo(\n () => tabs.filter((tab) => !normalizedHiddenTabs.has(tab.id)),\n [normalizedHiddenTabs, tabs],\n );\n const fallbackTab = visibleTabs.some((tab) => tab.id === defaultTab)\n ? defaultTab\n : (visibleTabs[0]?.id ?? \"context\");\n const [internalTab, setInternalTab] = useState(() => {\n if (typeof window === \"undefined\") return fallbackTab;\n return resolveTabId(visibleTabs, window.location.hash) ?? fallbackTab;\n });\n const isControlled = value !== undefined;\n const activeTab = isControlled ? value : internalTab;\n const selectedTab =\n visibleTabs.find((tab) => tab.id === activeTab) ?? visibleTabs[0];\n const tabGroups = useMemo(() => {\n const groups: Array<{ id: string; tabs: SettingsTabItem[] }> = [];\n for (const tab of visibleTabs) {\n const groupId = tab.group ?? \"agent\";\n const previous = groups.at(-1);\n if (previous?.id === groupId) previous.tabs.push(tab);\n else groups.push({ id: groupId, tabs: [tab] });\n }\n return groups;\n }, [visibleTabs]);\n\n useEffect(() => {\n if (scopeInitialized.current || orgLoading) return;\n scopeInitialized.current = true;\n if (!hasOrg && scope === \"org\") setScope(\"user\");\n }, [hasOrg, orgLoading, scope]);\n\n useEffect(() => {\n if (orgLoading) return;\n const resolvedScope = hasOrg ? scope : \"user\";\n if (resolvedScope !== scope) {\n setScope(resolvedScope);\n return;\n }\n updateScopeUrl(resolvedScope);\n }, [hasOrg, orgLoading, scope]);\n\n useEffect(() => {\n if (!isControlled && !visibleTabs.some((tab) => tab.id === internalTab)) {\n setInternalTab(fallbackTab);\n }\n }, [fallbackTab, internalTab, isControlled, visibleTabs]);\n\n useEffect(() => {\n if (isControlled) return;\n const onHashChange = () => {\n const next = resolveTabId(visibleTabs, window.location.hash);\n if (next) setInternalTab(next);\n };\n window.addEventListener(\"hashchange\", onHashChange);\n return () => window.removeEventListener(\"hashchange\", onHashChange);\n }, [isControlled, visibleTabs]);\n\n const changeTab = useCallback(\n (tabId: string) => {\n if (!isControlled) setInternalTab(tabId);\n onValueChange?.(tabId);\n },\n [isControlled, onValueChange],\n );\n\n const changeScope = (next: AgentPageScope) => {\n if (next === \"org\" && !hasOrg) return;\n setScope(next);\n try {\n localStorage.setItem(\"agent-page-scope\", next);\n } catch {}\n updateScopeUrl(next);\n };\n\n const searchIndex = useMemo(() => {\n const entries: Array<\n SettingsSearchEntry & { tabId: string; haystack: string }\n > = [];\n for (const tab of visibleTabs) {\n entries.push({\n id: `tab:${tab.id}`,\n label: tab.label,\n keywords: tab.keywords,\n tabId: tab.id,\n haystack: `${tab.label} ${tab.keywords ?? \"\"}`.toLowerCase(),\n });\n for (const entry of tab.searchEntries ?? []) {\n entries.push({\n ...entry,\n tabId: entry.tabId ?? tab.id,\n haystack:\n `${entry.label} ${entry.keywords ?? \"\"} ${entry.description ?? \"\"} ${tab.label}`.toLowerCase(),\n });\n }\n }\n return entries;\n }, [visibleTabs]);\n const results = useMemo(() => {\n const terms = query.trim().toLowerCase().split(/\\s+/).filter(Boolean);\n if (!terms.length) return [];\n return searchIndex\n .filter((entry) => terms.every((term) => entry.haystack.includes(term)))\n .sort((a, b) => a.label.localeCompare(b.label));\n }, [query, searchIndex]);\n\n const selectSearchResult = useCallback(\n (entry: (typeof searchIndex)[number]) => {\n changeTab(entry.tabId);\n setQuery(\"\");\n if (isControlled || typeof window === \"undefined\") return;\n if (entry.hash) {\n window.history.pushState(\n null,\n \"\",\n `${window.location.pathname}${window.location.search}#${entry.hash.replace(/^#/, \"\")}`,\n );\n window.dispatchEvent(new Event(\"hashchange\"));\n } else {\n updateTabHash(entry.tabId);\n }\n },\n [changeTab, isControlled],\n );\n\n return (\n <div\n ref={rootRef}\n className={cn(\n \"flex h-full min-h-0 w-full flex-col overflow-hidden bg-background\",\n className,\n )}\n >\n <header className=\"flex shrink-0 flex-wrap items-center justify-between gap-3 border-b border-border px-4 py-3 sm:px-6\">\n <div>\n <h1 className=\"text-base font-semibold text-foreground\">Agent</h1>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n What can influence this agent, and why.\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-muted-foreground\">Scope</span>\n <div\n className=\"flex rounded-md border border-border bg-muted/30 p-0.5\"\n role=\"radiogroup\"\n aria-label=\"Agent scope\"\n >\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={scope !== \"org\" || !hasOrg}\n onClick={() => changeScope(\"user\")}\n className={cn(\n \"cursor-pointer rounded px-2.5 py-1.5 text-xs font-medium\",\n scope !== \"org\" || !hasOrg\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n Personal\n </button>\n {hasOrg && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={scope === \"org\"}\n onClick={() => changeScope(\"org\")}\n className={cn(\n \"cursor-pointer rounded px-2.5 py-1.5 text-xs font-medium\",\n scope === \"org\"\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n Organization\n </button>\n </TooltipTrigger>\n {!canManageOrg && (\n <TooltipContent>\n Organization settings are read-only for members.\n </TooltipContent>\n )}\n </Tooltip>\n )}\n </div>\n </div>\n </header>\n <div className=\"flex min-h-0 flex-1 flex-col sm:flex-row\">\n <div className=\"flex shrink-0 flex-col gap-2 bg-background p-2 sm:min-h-0 sm:w-56 sm:overflow-y-auto sm:p-3\">\n {enableSearch ? (\n <div className=\"relative sm:mb-1\">\n <IconSearch className=\"pointer-events-none absolute start-2.5 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground\" />\n <input\n ref={searchRef}\n type=\"search\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") setQuery(\"\");\n if (event.key === \"Enter\" && results[0]) {\n event.preventDefault();\n selectSearchResult(results[0]);\n }\n }}\n placeholder={searchPlaceholder}\n aria-label={searchPlaceholder}\n className=\"h-8 w-full rounded-md border border-border bg-background ps-8 pe-7 text-[13px] text-foreground outline-none transition-colors placeholder:text-muted-foreground focus:border-foreground/30 focus:ring-2 focus:ring-accent/40\"\n />\n {query && (\n <button\n type=\"button\"\n onClick={() => setQuery(\"\")}\n aria-label=\"Clear search\"\n className=\"absolute end-1.5 top-1/2 flex size-5 -translate-y-1/2 cursor-pointer items-center justify-center rounded text-muted-foreground hover:bg-accent/60 hover:text-foreground\"\n >\n <IconX className=\"size-3.5\" />\n </button>\n )}\n </div>\n ) : null}\n {query.trim() ? (\n <div\n role=\"listbox\"\n aria-label=\"Agent search results\"\n className=\"flex flex-col gap-0.5\"\n >\n {results.length === 0 ? (\n <p className=\"px-2 py-6 text-center text-xs text-muted-foreground\">\n No matching agent settings\n </p>\n ) : (\n results.map((entry) => (\n <button\n key={entry.id}\n type=\"button\"\n role=\"option\"\n onClick={() => selectSearchResult(entry)}\n className=\"flex cursor-pointer items-start gap-2 rounded-md px-2.5 py-2 text-start text-sm text-foreground hover:bg-accent/60\"\n >\n <span className=\"flex min-w-0 flex-col\">\n <span className=\"truncate font-medium\">\n {entry.label}\n </span>\n <span className=\"truncate text-[11px] text-muted-foreground\">\n {entry.description ?? entry.tabId}\n </span>\n </span>\n </button>\n ))\n )}\n </div>\n ) : (\n <nav\n aria-label=\"Agent sections\"\n role=\"tablist\"\n className=\"flex gap-1 overflow-x-auto sm:flex-col sm:overflow-x-visible\"\n >\n {tabGroups.map((group, groupIndex) => (\n <div\n key={group.id}\n className={cn(\n \"contents sm:block\",\n groupIndex > 0 &&\n \"sm:mt-2 sm:border-t sm:border-border/60 sm:pt-2\",\n )}\n >\n <div className=\"contents sm:flex sm:flex-col sm:gap-1\">\n {group.tabs.map((tab) => {\n const Icon = tab.icon as SettingsTabIcon | undefined;\n const selected = tab.id === selectedTab?.id;\n return (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n aria-controls={`agent-tabpanel-${tab.id}`}\n onClick={() => {\n changeTab(tab.id);\n if (!isControlled) updateTabHash(tab.id);\n }}\n className={cn(\n \"flex min-h-9 shrink-0 cursor-pointer items-center gap-2 rounded-md px-3 py-2 text-start text-sm font-medium transition-colors sm:w-full\",\n selected\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent/50 hover:text-foreground\",\n )}\n >\n {Icon ? (\n <Icon\n className={cn(\n \"size-4 shrink-0\",\n selected\n ? \"text-foreground\"\n : \"text-muted-foreground\",\n )}\n />\n ) : null}\n <span className=\"truncate\">{tab.label}</span>\n </button>\n );\n })}\n </div>\n </div>\n ))}\n </nav>\n )}\n </div>\n <div\n id={`agent-tabpanel-${selectedTab?.id ?? \"context\"}`}\n role=\"tabpanel\"\n aria-labelledby={`agent-tab-${selectedTab?.id ?? \"context\"}`}\n className=\"min-h-0 min-w-0 flex-1 overflow-y-auto p-4 sm:p-6\"\n >\n {selectedTab?.content ?? <EmptySlot label=\"Agent section\" />}\n </div>\n </div>\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"AgentTabsPage.js","sourceRoot":"","sources":["../../../src/client/agent-page/AgentTabsPage.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n IconBrain,\n IconClock,\n IconExternalLink,\n IconFolder,\n IconPlugConnected,\n IconSearch,\n IconShieldLock,\n IconX,\n} from \"@tabler/icons-react\";\nimport {\n lazy,\n Suspense,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n} from \"react\";\n\nimport {\n MCP_CONNECT_GUIDES,\n MCP_CONNECT_MCP_URL_TEMPLATE,\n MCP_STATIC_TOKEN_FALLBACK,\n interpolateMcpConnectTemplate,\n type McpConnectTemplateValues,\n} from \"../../shared/mcp-connect-content.js\";\nimport { appPath } from \"../api-path.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport { useT } from \"../i18n.js\";\nimport { useOrg } from \"../org/hooks.js\";\nimport {\n McpIntegrationDialog,\n // The dialog is intentionally reused here so the Agent page remains a thin\n // host for the existing MCP management flow.\n} from \"../resources/McpIntegrationDialog.js\";\nimport { McpServerDetail } from \"../resources/McpServerDetail.js\";\nimport {\n useCreateMcpServer,\n useDeleteMcpServer,\n useMcpServers,\n type McpServer,\n type McpServerScope,\n} from \"../resources/use-mcp-servers.js\";\nimport { AgentsSection } from \"../settings/AgentsSection.js\";\nimport type {\n SettingsSearchEntry,\n SettingsTabItem,\n} from \"../settings/SettingsTabsPage.js\";\nimport { cn } from \"../utils.js\";\nimport type { AgentPageScope, AgentPageTabProps } from \"./types.js\";\n\nconst AgentContextTab = lazy(() =>\n import(\"./AgentContextTab.js\").then((module) => ({\n default: module.AgentContextTab,\n })),\n);\nconst AgentJobsTab = lazy(() =>\n import(\"./AgentJobsTab.js\").then((module) => ({\n default: module.AgentJobsTab,\n })),\n);\nconst ResourcesPanel = lazy(() =>\n import(\"../resources/ResourcesPanel.js\").then((module) => ({\n default: module.ResourcesPanel,\n })),\n);\n\ntype SettingsTabIcon = ComponentType<{ className?: string }>;\n\nfunction normalizeTabId(value?: string | null): string | null {\n const normalized = value\n ?.replace(/^#/, \"\")\n .trim()\n .toLowerCase()\n .replace(/[\"']/g, \"\")\n .replace(/[\\s_]+/g, \"-\");\n return normalized || null;\n}\n\nfunction resolveTabId(\n tabs: SettingsTabItem[],\n value?: string | null,\n): string | null {\n const normalized = normalizeTabId(value);\n if (!normalized) return null;\n if (tabs.some((tab) => tab.id === normalized)) return normalized;\n const section = normalized.split(\":\", 1)[0];\n const owner = tabs.find((tab) =>\n tab.searchEntries?.some(\n (entry) => normalizeTabId(entry.hash ?? entry.id) === section,\n ),\n );\n return owner?.id ?? null;\n}\n\nfunction updateTabHash(tabId: string) {\n if (typeof window === \"undefined\") return;\n const hash = tabId === \"context\" ? \"\" : `#${encodeURIComponent(tabId)}`;\n window.history.pushState(\n null,\n \"\",\n `${window.location.pathname}${window.location.search}${hash}`,\n );\n}\n\nfunction initialScope(): AgentPageScope {\n if (typeof window === \"undefined\") return \"user\";\n try {\n const queryScope = new URLSearchParams(window.location.search).get(\"scope\");\n if (queryScope === \"org\" || queryScope === \"user\") return queryScope;\n return localStorage.getItem(\"agent-page-scope\") === \"org\" ? \"org\" : \"user\";\n } catch {\n return \"user\";\n }\n}\n\nfunction updateScopeUrl(scope: AgentPageScope) {\n if (typeof window === \"undefined\") return;\n const search = new URLSearchParams(window.location.search);\n search.set(\"scope\", scope);\n const query = search.toString();\n window.history.replaceState(\n null,\n \"\",\n `${window.location.pathname}${query ? `?${query}` : \"\"}${window.location.hash}`,\n );\n}\n\nfunction TabLoading() {\n return (\n <div className=\"space-y-3\" aria-busy=\"true\">\n <div className=\"h-5 w-36 animate-pulse rounded bg-muted\" />\n <div className=\"h-20 animate-pulse rounded-lg border border-border bg-muted/30\" />\n <div className=\"h-20 animate-pulse rounded-lg border border-border bg-muted/30\" />\n </div>\n );\n}\n\nfunction EmptySlot({ label }: { label: string }) {\n return (\n <div className=\"flex min-h-[220px] items-center justify-center rounded-lg border border-dashed border-border/70 bg-muted/10\">\n <span className=\"sr-only\">{label}</span>\n </div>\n );\n}\n\nfunction FilesTab({ scope }: AgentPageTabProps) {\n return (\n <div className=\"h-[calc(100vh-14rem)] min-h-[480px]\">\n <ResourcesPanel\n key={scope}\n showMcpServers={false}\n scope={scope === \"org\" ? \"shared\" : \"personal\"}\n />\n </div>\n );\n}\n\nfunction ScopeBadge({ scope }: { scope: McpServerScope }) {\n return (\n <span className=\"rounded-full border border-border bg-muted/40 px-2 py-0.5 text-[10px] font-medium text-muted-foreground\">\n {scope === \"user\" ? \"Personal\" : \"Organization\"}\n </span>\n );\n}\n\nfunction ServerStatus({ server }: { server: McpServer }) {\n if (server.status.state === \"connected\") {\n return (\n <span className=\"text-[11px] text-emerald-600 dark:text-emerald-400\">\n Connected · {server.status.toolCount} tools\n </span>\n );\n }\n if (server.status.state === \"error\") {\n return (\n <span className=\"truncate text-[11px] text-destructive\">\n Connection error\n </span>\n );\n }\n return (\n <span className=\"text-[11px] text-muted-foreground\">Status unknown</span>\n );\n}\n\nfunction ConnectionsTab({ scope, canManageOrg = false }: AgentPageTabProps) {\n const t = useT();\n const serversQuery = useMcpServers();\n const createServer = useCreateMcpServer();\n const deleteServer = useDeleteMcpServer();\n const [dialogOpen, setDialogOpen] = useState(false);\n const [selectedServer, setSelectedServer] = useState<McpServer | null>(null);\n const [deleteTarget, setDeleteTarget] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const data = serversQuery.data;\n const hasOrg = Boolean(data?.orgId);\n const canCreateOrgMcp = hasOrg && canManageOrg;\n const activeScope: McpServerScope = scope === \"org\" ? \"org\" : \"user\";\n\n const onCreateMcpServer = useCallback(\n async (args: {\n scope: McpServerScope;\n name: string;\n url: string;\n headers?: Record<string, string>;\n description?: string;\n }) => {\n if (args.scope === \"org\" && !canCreateOrgMcp) {\n throw new Error(\n \"Only organization admins can add organization MCP servers.\",\n );\n }\n return createServer.mutateAsync(args);\n },\n [canCreateOrgMcp, createServer],\n );\n\n const removeServer = async (server: McpServer) => {\n const key = `${server.scope}:${server.id}`;\n if (deleteTarget !== key) {\n setDeleteTarget(key);\n return;\n }\n setError(null);\n try {\n await deleteServer.mutateAsync({ id: server.id, scope: server.scope });\n if (\n selectedServer?.id === server.id &&\n selectedServer.scope === server.scope\n ) {\n setSelectedServer(null);\n }\n setDeleteTarget(null);\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause));\n }\n };\n\n const renderServer = (server: McpServer) => {\n const key = `${server.scope}:${server.id}`;\n const canDelete = server.scope === \"user\" || canManageOrg;\n const selected =\n selectedServer?.id === server.id && selectedServer.scope === server.scope;\n return (\n <div\n key={key}\n className={cn(\n \"rounded-lg border border-border bg-card p-3 transition-colors\",\n selected && \"border-foreground/30 bg-accent/20\",\n )}\n >\n <div className=\"flex items-start gap-3\">\n <button\n type=\"button\"\n onClick={() => setSelectedServer(selected ? null : server)}\n className=\"min-w-0 flex-1 cursor-pointer text-start\"\n >\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"truncate text-sm font-medium text-foreground\">\n {server.name}\n </span>\n <ScopeBadge scope={server.scope} />\n {server.scope === activeScope && (\n <span className=\"text-[10px] text-muted-foreground\">\n Selected scope\n </span>\n )}\n </div>\n <code className=\"mt-1 block truncate text-[11px] text-muted-foreground\">\n {server.url}\n </code>\n <div className=\"mt-2 flex items-center gap-2\">\n <ServerStatus server={server} />\n {server.description && (\n <span className=\"truncate text-[11px] text-muted-foreground/70\">\n {server.description}\n </span>\n )}\n </div>\n </button>\n {canDelete && (\n <button\n type=\"button\"\n onClick={() => void removeServer(server)}\n disabled={deleteServer.isPending}\n className={cn(\n \"cursor-pointer rounded-md px-2 py-1 text-[11px] font-medium text-muted-foreground hover:bg-destructive/10 hover:text-destructive\",\n deleteTarget === key && \"bg-destructive/10 text-destructive\",\n )}\n >\n {deleteTarget === key ? \"Confirm\" : \"Delete\"}\n </button>\n )}\n </div>\n {selected && (\n <div className=\"mt-3 border-t border-border/70 pt-3\">\n <McpServerDetail server={server} />\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div className=\"space-y-8\">\n <section className=\"space-y-3\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <h2 className=\"text-base font-semibold text-foreground\">\n MCP servers\n </h2>\n <p className=\"mt-1 max-w-2xl text-sm leading-relaxed text-muted-foreground\">\n Tools and services this agent can reach. The page scope controls\n where new servers are saved.\n </p>\n </div>\n <button\n type=\"button\"\n onClick={() => {\n setError(null);\n setDialogOpen(true);\n }}\n className=\"cursor-pointer rounded-md bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground hover:bg-primary/90\"\n >\n {t(\"mcpIntegrations.connect\")}\n </button>\n </div>\n {error && (\n <p className=\"rounded-md border border-destructive/20 bg-destructive/5 px-3 py-2 text-xs text-destructive\">\n {error}\n </p>\n )}\n {serversQuery.isLoading ? (\n <TabLoading />\n ) : serversQuery.isError ? (\n <p className=\"rounded-md border border-destructive/20 bg-destructive/5 px-3 py-2 text-xs text-destructive\">\n Could not load MCP servers.\n </p>\n ) : data && data.user.length + data.org.length > 0 ? (\n <div className=\"space-y-2\">\n {data.user.map(renderServer)}\n {data.org.map(renderServer)}\n </div>\n ) : (\n <div className=\"rounded-lg border border-dashed border-border p-5 text-sm text-muted-foreground\">\n No MCP servers are connected yet.\n </div>\n )}\n <McpIntegrationDialog\n open={dialogOpen}\n onOpenChange={setDialogOpen}\n defaultScope={activeScope}\n canCreateOrgMcp={canCreateOrgMcp}\n hasOrg={hasOrg}\n onCreateMcpServer={onCreateMcpServer}\n />\n </section>\n\n <section className=\"space-y-3 border-t border-border/70 pt-6\">\n <div>\n <h2 className=\"text-base font-semibold text-foreground\">\n Remote agents\n </h2>\n <p className=\"mt-1 max-w-2xl text-sm leading-relaxed text-muted-foreground\">\n Other agents this app can call through A2A.\n </p>\n </div>\n <div className=\"rounded-lg border border-border bg-card p-4\">\n <AgentsSection />\n </div>\n </section>\n </div>\n );\n}\n\ninterface AccessUrls {\n appName: string;\n appUrl: string;\n mcpUrl: string;\n connectUrl: string;\n agentCardUrl: string;\n}\n\nfunction CopyField({ label, value }: { label: string; value: string }) {\n const [copied, setCopied] = useState(false);\n const copy = async () => {\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n window.setTimeout(() => setCopied(false), 1600);\n } catch {\n setCopied(false);\n }\n };\n return (\n <div className=\"flex min-w-0 items-center gap-2 rounded-md border border-border bg-muted/20 p-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-[10px] font-semibold uppercase tracking-wide text-muted-foreground/70\">\n {label}\n </div>\n <code className=\"mt-1 block truncate text-xs text-foreground\">\n {value}\n </code>\n </div>\n <button\n type=\"button\"\n onClick={() => void copy()}\n className=\"shrink-0 cursor-pointer rounded-md border border-border bg-background px-2.5 py-1.5 text-[11px] font-medium text-foreground hover:bg-accent\"\n >\n {copied ? \"Copied\" : \"Copy\"}\n </button>\n </div>\n );\n}\n\nfunction AccessTab({\n appName: appNameProp,\n}: AgentPageTabProps & { appName?: string }) {\n const [urls, setUrls] = useState<AccessUrls | null>(null);\n const [agentCardAvailable, setAgentCardAvailable] = useState(false);\n const [activeGuide, setActiveGuide] = useState(MCP_CONNECT_GUIDES[0]?.id);\n\n useEffect(() => {\n const origin = window.location.origin;\n const baseUrl = new URL(appPath(\"/\"), origin).toString().replace(/\\/$/, \"\");\n const hostname = window.location.hostname || \"app\";\n const metaSiteName = document\n .querySelector('meta[property=\"og:site_name\"]')\n ?.getAttribute(\"content\")\n ?.trim();\n const hostnameGuess =\n hostname !== \"localhost\" && hostname !== \"127.0.0.1\"\n ? hostname.split(\".\")[0]\n : \"\";\n const appName =\n appNameProp?.trim() || metaSiteName || hostnameGuess || \"this app\";\n const templateValues = {\n appName,\n appUrl: baseUrl,\n mcpUrl: \"\",\n serverId: `agent-native-${hostname}`,\n } satisfies McpConnectTemplateValues;\n setUrls({\n appName,\n appUrl: baseUrl,\n mcpUrl: interpolateMcpConnectTemplate(\n MCP_CONNECT_MCP_URL_TEMPLATE,\n templateValues,\n ),\n connectUrl: new URL(appPath(\"/mcp/connect\"), origin).toString(),\n agentCardUrl: new URL(\n appPath(\"/.well-known/agent-card.json\"),\n origin,\n ).toString(),\n });\n }, [appNameProp]);\n\n useEffect(() => {\n if (!urls) return;\n let cancelled = false;\n fetch(urls.agentCardUrl)\n .then((response) => {\n if (!cancelled) setAgentCardAvailable(response.ok);\n })\n .catch(() => {\n if (!cancelled) setAgentCardAvailable(false);\n });\n return () => {\n cancelled = true;\n };\n }, [urls]);\n\n const templateValues: McpConnectTemplateValues | null = urls\n ? {\n appName: urls.appName,\n appUrl: urls.appUrl,\n mcpUrl: urls.mcpUrl,\n serverId: `agent-native-${window.location.hostname || \"app\"}`,\n }\n : null;\n const guide =\n MCP_CONNECT_GUIDES.find((item) => item.id === activeGuide) ??\n MCP_CONNECT_GUIDES[0];\n\n return (\n <div className=\"space-y-6\">\n <div>\n <h2 className=\"text-base font-semibold text-foreground\">Access</h2>\n <p className=\"mt-1 max-w-2xl text-sm leading-relaxed text-muted-foreground\">\n Choose which external clients can talk to this app's agent and\n follow the setup for each one. Grants, scopes, and revocation will\n live here in a future pass.\n </p>\n </div>\n {urls ? (\n <>\n <CopyField label=\"MCP URL\" value={urls.mcpUrl} />\n {agentCardAvailable && (\n <CopyField label=\"A2A agent card\" value={urls.agentCardUrl} />\n )}\n <section className=\"space-y-3 rounded-lg border border-border bg-card p-4\">\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">\n Client setup\n </h3>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n These instructions are also available on the full connect page.\n </p>\n </div>\n <div\n className=\"flex gap-1 overflow-x-auto border-b border-border pb-2\"\n role=\"tablist\"\n aria-label=\"Choose your AI assistant\"\n >\n {MCP_CONNECT_GUIDES.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={item.id === guide?.id}\n onClick={() => setActiveGuide(item.id)}\n className={cn(\n \"shrink-0 cursor-pointer rounded-md px-2.5 py-1.5 text-xs font-medium\",\n item.id === guide?.id\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent/50 hover:text-foreground\",\n )}\n >\n {item.label}\n </button>\n ))}\n </div>\n {guide && templateValues && (\n <div className=\"space-y-3 pt-1\" role=\"tabpanel\">\n {guide.steps?.length ? (\n <ol className=\"list-decimal space-y-2 ps-5 text-xs leading-relaxed text-muted-foreground\">\n {guide.steps.map((step) => (\n <li key={step}>\n {interpolateMcpConnectTemplate(step, templateValues)}\n </li>\n ))}\n </ol>\n ) : null}\n {guide.intro && (\n <p className=\"text-xs text-muted-foreground\">\n {interpolateMcpConnectTemplate(guide.intro, templateValues)}\n </p>\n )}\n {guide.commandTemplate && (\n <CopyField\n label=\"Command\"\n value={interpolateMcpConnectTemplate(\n guide.commandTemplate,\n templateValues,\n )}\n />\n )}\n {guide.configTemplate && (\n <CopyField\n label=\"MCP config\"\n value={interpolateMcpConnectTemplate(\n guide.configTemplate,\n templateValues,\n )}\n />\n )}\n {guide.action?.kind === \"link\" && guide.action.href && (\n <a\n href={guide.action.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-3 py-1.5 text-xs font-medium text-foreground hover:bg-accent\"\n >\n {guide.action.label}\n <IconExternalLink className=\"size-3.5\" />\n </a>\n )}\n {guide.note && (\n <p className=\"text-xs leading-relaxed text-muted-foreground\">\n {interpolateMcpConnectTemplate(guide.note, templateValues)}\n </p>\n )}\n </div>\n )}\n </section>\n <section className=\"rounded-lg border border-border/70 bg-muted/10 p-4\">\n <h3 className=\"text-sm font-semibold text-foreground\">\n {MCP_STATIC_TOKEN_FALLBACK.title}\n </h3>\n <p className=\"mt-1 text-xs leading-relaxed text-muted-foreground\">\n {MCP_STATIC_TOKEN_FALLBACK.state}. Open the connect page to create\n a token for clients that cannot complete OAuth.\n </p>\n <a\n href={urls.connectUrl}\n className=\"mt-3 inline-flex cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-3 py-1.5 text-xs font-medium text-foreground hover:bg-accent\"\n >\n Open full connect page\n <IconExternalLink className=\"size-3.5\" />\n </a>\n </section>\n </>\n ) : (\n <TabLoading />\n )}\n </div>\n );\n}\n\nexport interface AgentTabsPageProps {\n /**\n * Human-readable app name used in the Access tab's connect instructions\n * (e.g. \"name it Mail\"). Falls back to the `og:site_name` meta tag, then a\n * hostname-derived guess — never `document.title`, which this page owns.\n */\n appName?: string;\n extraTabs?: SettingsTabItem[];\n defaultTab?: string;\n className?: string;\n /** Whether to render the Agent page search box. Defaults to true. */\n enableSearch?: boolean;\n searchPlaceholder?: string;\n hiddenTabs?: string[];\n value?: string;\n onValueChange?: (tabId: string) => void;\n}\n\nexport function AgentTabsPage({\n appName,\n extraTabs = [],\n defaultTab = \"context\",\n className,\n enableSearch = true,\n searchPlaceholder = \"Search agent settings\",\n hiddenTabs = [],\n value,\n onValueChange,\n}: AgentTabsPageProps) {\n const { data: org, isLoading: orgLoading } = useOrg();\n const hasOrg = Boolean(org?.orgId);\n const canManageOrg =\n !org?.orgId || org.role === \"owner\" || org.role === \"admin\";\n const [scope, setScope] = useState<AgentPageScope>(initialScope);\n const scopeInitialized = useRef(false);\n const rootRef = useRef<HTMLDivElement | null>(null);\n const searchRef = useRef<HTMLInputElement | null>(null);\n const [query, setQuery] = useState(\"\");\n const normalizedHiddenTabs = useMemo(\n () => new Set(hiddenTabs.map((tab) => normalizeTabId(tab)).filter(Boolean)),\n [hiddenTabs],\n );\n\n const tabs = useMemo<SettingsTabItem[]>(\n () => [\n {\n id: \"context\",\n label: \"Context\",\n icon: IconBrain,\n keywords: \"influence provenance prompt\",\n content: (\n <div className=\"space-y-4\">\n <div>\n <h1 className=\"text-lg font-semibold text-foreground\">Context</h1>\n <p className=\"mt-1 text-sm leading-relaxed text-muted-foreground\">\n See what can influence this agent and why.\n </p>\n </div>\n <div className=\"min-h-[220px] rounded-lg border border-dashed border-border/70 bg-muted/10 p-4\">\n <Suspense fallback={<TabLoading />}>\n <AgentContextTab scope={scope} canManageOrg={canManageOrg} />\n </Suspense>\n </div>\n </div>\n ),\n },\n {\n id: \"files\",\n label: \"Files\",\n icon: IconFolder,\n keywords: \"workspace resources instructions skills\",\n content: (\n <div className=\"space-y-4\">\n <div>\n <h1 className=\"text-lg font-semibold text-foreground\">Files</h1>\n <p className=\"mt-1 text-sm leading-relaxed text-muted-foreground\">\n Workspace files that shape the agent's context.\n </p>\n </div>\n <Suspense fallback={<TabLoading />}>\n <FilesTab scope={scope} canManageOrg={canManageOrg} />\n </Suspense>\n </div>\n ),\n },\n {\n id: \"connections\",\n label: \"Connections\",\n icon: IconPlugConnected,\n keywords: \"mcp servers tools remote agents a2a\",\n searchEntries: [\n { id: \"mcp-servers\", label: \"MCP servers\", keywords: \"tools\" },\n { id: \"remote-agents\", label: \"Remote agents\", keywords: \"a2a\" },\n ],\n content: <ConnectionsTab scope={scope} canManageOrg={canManageOrg} />,\n },\n {\n id: \"jobs\",\n label: \"Jobs\",\n icon: IconClock,\n keywords: \"scheduled automations recurring\",\n content: (\n <div className=\"space-y-4\">\n <div>\n <h1 className=\"text-lg font-semibold text-foreground\">Jobs</h1>\n <p className=\"mt-1 text-sm leading-relaxed text-muted-foreground\">\n Scheduled work that can run with this agent.\n </p>\n </div>\n <div className=\"min-h-[220px] rounded-lg border border-dashed border-border/70 bg-muted/10 p-4\">\n <Suspense fallback={<TabLoading />}>\n <AgentJobsTab scope={scope} canManageOrg={canManageOrg} />\n </Suspense>\n </div>\n </div>\n ),\n },\n {\n id: \"access\",\n label: \"Access\",\n icon: IconShieldLock,\n keywords: \"external clients oauth a2a exposure\",\n searchEntries: [\n {\n id: \"mcp-connect\",\n label: \"External client setup\",\n keywords: \"oauth connect\",\n },\n {\n id: \"a2a-agent-card\",\n label: \"A2A agent card\",\n keywords: \"agent card\",\n },\n ],\n content: (\n <AccessTab\n scope={scope}\n canManageOrg={canManageOrg}\n appName={appName}\n />\n ),\n },\n ...extraTabs,\n ],\n [canManageOrg, extraTabs, scope],\n );\n const visibleTabs = useMemo(\n () => tabs.filter((tab) => !normalizedHiddenTabs.has(tab.id)),\n [normalizedHiddenTabs, tabs],\n );\n const fallbackTab = visibleTabs.some((tab) => tab.id === defaultTab)\n ? defaultTab\n : (visibleTabs[0]?.id ?? \"context\");\n const [internalTab, setInternalTab] = useState(() => {\n if (typeof window === \"undefined\") return fallbackTab;\n return resolveTabId(visibleTabs, window.location.hash) ?? fallbackTab;\n });\n const isControlled = value !== undefined;\n const activeTab = isControlled ? value : internalTab;\n const selectedTab =\n visibleTabs.find((tab) => tab.id === activeTab) ?? visibleTabs[0];\n const tabGroups = useMemo(() => {\n const groups: Array<{ id: string; tabs: SettingsTabItem[] }> = [];\n for (const tab of visibleTabs) {\n const groupId = tab.group ?? \"agent\";\n const previous = groups.at(-1);\n if (previous?.id === groupId) previous.tabs.push(tab);\n else groups.push({ id: groupId, tabs: [tab] });\n }\n return groups;\n }, [visibleTabs]);\n\n useEffect(() => {\n if (scopeInitialized.current || orgLoading) return;\n scopeInitialized.current = true;\n if (!hasOrg && scope === \"org\") setScope(\"user\");\n }, [hasOrg, orgLoading, scope]);\n\n useEffect(() => {\n if (orgLoading) return;\n const resolvedScope = hasOrg ? scope : \"user\";\n if (resolvedScope !== scope) {\n setScope(resolvedScope);\n return;\n }\n updateScopeUrl(resolvedScope);\n }, [hasOrg, orgLoading, scope]);\n\n useEffect(() => {\n if (!isControlled && !visibleTabs.some((tab) => tab.id === internalTab)) {\n setInternalTab(fallbackTab);\n }\n }, [fallbackTab, internalTab, isControlled, visibleTabs]);\n\n useEffect(() => {\n if (isControlled) return;\n const onHashChange = () => {\n const next = resolveTabId(visibleTabs, window.location.hash);\n if (next) setInternalTab(next);\n };\n window.addEventListener(\"hashchange\", onHashChange);\n return () => window.removeEventListener(\"hashchange\", onHashChange);\n }, [isControlled, visibleTabs]);\n\n const changeTab = useCallback(\n (tabId: string) => {\n if (!isControlled) setInternalTab(tabId);\n onValueChange?.(tabId);\n },\n [isControlled, onValueChange],\n );\n\n const changeScope = (next: AgentPageScope) => {\n if (next === \"org\" && !hasOrg) return;\n setScope(next);\n try {\n localStorage.setItem(\"agent-page-scope\", next);\n } catch {}\n updateScopeUrl(next);\n };\n\n const searchIndex = useMemo(() => {\n const entries: Array<\n SettingsSearchEntry & { tabId: string; haystack: string }\n > = [];\n for (const tab of visibleTabs) {\n entries.push({\n id: `tab:${tab.id}`,\n label: tab.label,\n keywords: tab.keywords,\n tabId: tab.id,\n haystack: `${tab.label} ${tab.keywords ?? \"\"}`.toLowerCase(),\n });\n for (const entry of tab.searchEntries ?? []) {\n entries.push({\n ...entry,\n tabId: entry.tabId ?? tab.id,\n haystack:\n `${entry.label} ${entry.keywords ?? \"\"} ${entry.description ?? \"\"} ${tab.label}`.toLowerCase(),\n });\n }\n }\n return entries;\n }, [visibleTabs]);\n const results = useMemo(() => {\n const terms = query.trim().toLowerCase().split(/\\s+/).filter(Boolean);\n if (!terms.length) return [];\n return searchIndex\n .filter((entry) => terms.every((term) => entry.haystack.includes(term)))\n .sort((a, b) => a.label.localeCompare(b.label));\n }, [query, searchIndex]);\n\n const selectSearchResult = useCallback(\n (entry: (typeof searchIndex)[number]) => {\n changeTab(entry.tabId);\n setQuery(\"\");\n if (isControlled || typeof window === \"undefined\") return;\n if (entry.hash) {\n window.history.pushState(\n null,\n \"\",\n `${window.location.pathname}${window.location.search}#${entry.hash.replace(/^#/, \"\")}`,\n );\n window.dispatchEvent(new Event(\"hashchange\"));\n } else {\n updateTabHash(entry.tabId);\n }\n },\n [changeTab, isControlled],\n );\n\n return (\n <div\n ref={rootRef}\n className={cn(\n \"flex h-full min-h-0 w-full flex-col overflow-hidden bg-background\",\n className,\n )}\n >\n <header className=\"flex shrink-0 flex-wrap items-center justify-between gap-3 border-b border-border px-4 py-3 sm:px-6\">\n <div>\n <h1 className=\"text-base font-semibold text-foreground\">Agent</h1>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n What can influence this agent, and why.\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-muted-foreground\">Scope</span>\n <div\n className=\"flex rounded-md border border-border bg-muted/30 p-0.5\"\n role=\"radiogroup\"\n aria-label=\"Agent scope\"\n >\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={scope !== \"org\" || !hasOrg}\n onClick={() => changeScope(\"user\")}\n className={cn(\n \"cursor-pointer rounded px-2.5 py-1.5 text-xs font-medium\",\n scope !== \"org\" || !hasOrg\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n Personal\n </button>\n {hasOrg && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={scope === \"org\"}\n onClick={() => changeScope(\"org\")}\n className={cn(\n \"cursor-pointer rounded px-2.5 py-1.5 text-xs font-medium\",\n scope === \"org\"\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n Organization\n </button>\n </TooltipTrigger>\n {!canManageOrg && (\n <TooltipContent>\n Organization settings are read-only for members.\n </TooltipContent>\n )}\n </Tooltip>\n )}\n </div>\n </div>\n </header>\n <div className=\"flex min-h-0 flex-1 flex-col sm:flex-row\">\n <div className=\"flex shrink-0 flex-col gap-2 bg-background p-2 sm:min-h-0 sm:w-56 sm:overflow-y-auto sm:p-3\">\n {enableSearch ? (\n <div className=\"relative sm:mb-1\">\n <IconSearch className=\"pointer-events-none absolute start-2.5 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground\" />\n <input\n ref={searchRef}\n type=\"search\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") setQuery(\"\");\n if (event.key === \"Enter\" && results[0]) {\n event.preventDefault();\n selectSearchResult(results[0]);\n }\n }}\n placeholder={searchPlaceholder}\n aria-label={searchPlaceholder}\n className=\"h-8 w-full rounded-md border border-border bg-background ps-8 pe-7 text-[13px] text-foreground outline-none transition-colors placeholder:text-muted-foreground focus:border-foreground/30 focus:ring-2 focus:ring-accent/40\"\n />\n {query && (\n <button\n type=\"button\"\n onClick={() => setQuery(\"\")}\n aria-label=\"Clear search\"\n className=\"absolute end-1.5 top-1/2 flex size-5 -translate-y-1/2 cursor-pointer items-center justify-center rounded text-muted-foreground hover:bg-accent/60 hover:text-foreground\"\n >\n <IconX className=\"size-3.5\" />\n </button>\n )}\n </div>\n ) : null}\n {query.trim() ? (\n <div\n role=\"listbox\"\n aria-label=\"Agent search results\"\n className=\"flex flex-col gap-0.5\"\n >\n {results.length === 0 ? (\n <p className=\"px-2 py-6 text-center text-xs text-muted-foreground\">\n No matching agent settings\n </p>\n ) : (\n results.map((entry) => (\n <button\n key={entry.id}\n type=\"button\"\n role=\"option\"\n onClick={() => selectSearchResult(entry)}\n className=\"flex cursor-pointer items-start gap-2 rounded-md px-2.5 py-2 text-start text-sm text-foreground hover:bg-accent/60\"\n >\n <span className=\"flex min-w-0 flex-col\">\n <span className=\"truncate font-medium\">\n {entry.label}\n </span>\n <span className=\"truncate text-[11px] text-muted-foreground\">\n {entry.description ?? entry.tabId}\n </span>\n </span>\n </button>\n ))\n )}\n </div>\n ) : (\n <nav\n aria-label=\"Agent sections\"\n role=\"tablist\"\n className=\"flex gap-1 overflow-x-auto sm:flex-col sm:overflow-x-visible\"\n >\n {tabGroups.map((group, groupIndex) => (\n <div\n key={group.id}\n className={cn(\n \"contents sm:block\",\n groupIndex > 0 &&\n \"sm:mt-2 sm:border-t sm:border-border/60 sm:pt-2\",\n )}\n >\n <div className=\"contents sm:flex sm:flex-col sm:gap-1\">\n {group.tabs.map((tab) => {\n const Icon = tab.icon as SettingsTabIcon | undefined;\n const selected = tab.id === selectedTab?.id;\n return (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n aria-controls={`agent-tabpanel-${tab.id}`}\n onClick={() => {\n changeTab(tab.id);\n if (!isControlled) updateTabHash(tab.id);\n }}\n className={cn(\n \"flex min-h-9 shrink-0 cursor-pointer items-center gap-2 rounded-md px-3 py-2 text-start text-sm font-medium transition-colors sm:w-full\",\n selected\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent/50 hover:text-foreground\",\n )}\n >\n {Icon ? (\n <Icon\n className={cn(\n \"size-4 shrink-0\",\n selected\n ? \"text-foreground\"\n : \"text-muted-foreground\",\n )}\n />\n ) : null}\n <span className=\"truncate\">{tab.label}</span>\n </button>\n );\n })}\n </div>\n </div>\n ))}\n </nav>\n )}\n </div>\n <div\n id={`agent-tabpanel-${selectedTab?.id ?? \"context\"}`}\n role=\"tabpanel\"\n aria-labelledby={`agent-tab-${selectedTab?.id ?? \"context\"}`}\n className=\"min-h-0 min-w-0 flex-1 overflow-y-auto p-4 sm:p-6\"\n >\n {selectedTab?.content ?? <EmptySlot label=\"Agent section\" />}\n </div>\n </div>\n </div>\n );\n}\n"]}
|
|
@@ -39,6 +39,10 @@ export declare function shouldShowAssistantWorkSummary({ isLast, isComplete, has
|
|
|
39
39
|
hasCollapsibleWork: boolean;
|
|
40
40
|
hasUnresolvedTool: boolean;
|
|
41
41
|
}): boolean;
|
|
42
|
+
export declare function isCollapsibleAssistantWorkPart(part: {
|
|
43
|
+
type?: string;
|
|
44
|
+
toolName?: string;
|
|
45
|
+
}): boolean;
|
|
42
46
|
export declare function AssistantMessage(): React.JSX.Element | null;
|
|
43
47
|
export declare function RunningActivityStatus({ label }: {
|
|
44
48
|
label: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-components.d.ts","sourceRoot":"","sources":["../../../src/client/chat/message-components.tsx"],"names":[],"mappings":"AA0CA,OAAO,KAAmD,MAAM,OAAO,CAAC;AA0CxE,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM/D;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAc7D;AAID,UAAU,yBAAyB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAqBD,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,OAAO,GACb,yBAAyB,GAAG,IAAI,CAyClC;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,SAAS,GACV,EAAE;IACD,SAAS,EAAE,yBAAyB,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,qBAYA;AAID,wBAAgB,qBAAqB,6BAgEpC;AAID,eAAO,MAAM,iBAAiB;YACpB,MAAM;aACL,OAAO;eACL,MAAM;SACJ,CAAC;AAEhB,eAAO,MAAM,qBAAqB;iBACnB,MAAM,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC;SAC9C,CAAC;AAIhB,wBAAgB,mBAAmB,sBA+BlC;AAwMD,wBAAgB,kBAAkB,CAAC,EACjC,UAAU,EACV,QAAQ,GACT,GAAE;IACD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB,qBAoIL;AAID,wBAAgB,WAAW,6BA2I1B;AA4BD,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAO3E;AAED,wBAAgB,gCAAgC,CAAC,EAC/C,MAAM,EACN,WAAW,EACX,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,GAClB,EAAE;IACD,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,GAAG,OAAO,CAMV;AAED,wBAAgB,8BAA8B,CAAC,EAC7C,MAAM,EACN,UAAU,EACV,kBAAkB,EAClB,iBAAiB,GAClB,EAAE;IACD,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,iBAAiB,EAAE,OAAO,CAAC;CAC5B,GAAG,OAAO,CAOV;
|
|
1
|
+
{"version":3,"file":"message-components.d.ts","sourceRoot":"","sources":["../../../src/client/chat/message-components.tsx"],"names":[],"mappings":"AA0CA,OAAO,KAAmD,MAAM,OAAO,CAAC;AA0CxE,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM/D;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAc7D;AAID,UAAU,yBAAyB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAqBD,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,OAAO,GACb,yBAAyB,GAAG,IAAI,CAyClC;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,SAAS,GACV,EAAE;IACD,SAAS,EAAE,yBAAyB,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,qBAYA;AAID,wBAAgB,qBAAqB,6BAgEpC;AAID,eAAO,MAAM,iBAAiB;YACpB,MAAM;aACL,OAAO;eACL,MAAM;SACJ,CAAC;AAEhB,eAAO,MAAM,qBAAqB;iBACnB,MAAM,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC;SAC9C,CAAC;AAIhB,wBAAgB,mBAAmB,sBA+BlC;AAwMD,wBAAgB,kBAAkB,CAAC,EACjC,UAAU,EACV,QAAQ,GACT,GAAE;IACD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB,qBAoIL;AAID,wBAAgB,WAAW,6BA2I1B;AA4BD,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAO3E;AAED,wBAAgB,gCAAgC,CAAC,EAC/C,MAAM,EACN,WAAW,EACX,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,GAClB,EAAE;IACD,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,GAAG,OAAO,CAMV;AAED,wBAAgB,8BAA8B,CAAC,EAC7C,MAAM,EACN,UAAU,EACV,kBAAkB,EAClB,iBAAiB,GAClB,EAAE;IACD,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,iBAAiB,EAAE,OAAO,CAAC;CAC5B,GAAG,OAAO,CAOV;AA8CD,wBAAgB,8BAA8B,CAAC,IAAI,EAAE;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAMV;AAYD,wBAAgB,gBAAgB,6BA6P/B;AAID,wBAAgB,qBAAqB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,qBAMjE;AAED,wBAAgB,iBAAiB,CAAC,EAChC,KAAkB,GACnB,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,qBAWzB"}
|
|
@@ -451,8 +451,15 @@ function ReasoningMessagePart() {
|
|
|
451
451
|
}, [isStreaming]);
|
|
452
452
|
return (_jsx(ReasoningCell, { text: part.text, isStreaming: isStreaming, resetKey: `message-reasoning-${partIndex}`, durationMs: durationMs, defaultOpen: partIndex === latestReasoningPartIndex, collapseWhenReplaced: partIndex < latestReasoningPartIndex }));
|
|
453
453
|
}
|
|
454
|
+
const ALWAYS_VISIBLE_ASSISTANT_TOOLS = new Set(["connect-builder"]);
|
|
455
|
+
export function isCollapsibleAssistantWorkPart(part) {
|
|
456
|
+
if (part.type === "reasoning")
|
|
457
|
+
return true;
|
|
458
|
+
return (part.type === "tool-call" &&
|
|
459
|
+
!ALWAYS_VISIBLE_ASSISTANT_TOOLS.has(part.toolName ?? ""));
|
|
460
|
+
}
|
|
454
461
|
function groupAssistantWorkParts(part) {
|
|
455
|
-
if (part
|
|
462
|
+
if (isCollapsibleAssistantWorkPart(part)) {
|
|
456
463
|
return ["group-work"];
|
|
457
464
|
}
|
|
458
465
|
return null;
|
|
@@ -559,8 +566,8 @@ export function AssistantMessage() {
|
|
|
559
566
|
(p.structuredMeta.toolKind === "edit" ||
|
|
560
567
|
p.structuredMeta.toolKind === "write"));
|
|
561
568
|
const hasCollapsibleWork = Array.isArray(msgContent) &&
|
|
562
|
-
msgContent.some((p) => p.type
|
|
563
|
-
(p
|
|
569
|
+
msgContent.some((p) => (p.type !== "tool-call" || p.activity !== true) &&
|
|
570
|
+
isCollapsibleAssistantWorkPart(p));
|
|
564
571
|
if (!hasRenderableContent)
|
|
565
572
|
return null;
|
|
566
573
|
return (_jsxs("div", { className: "group relative", style: { contentVisibility: isComplete ? "auto" : "visible" }, children: [_jsxs("div", { className: "w-full max-w-[95%] text-sm leading-relaxed text-foreground", children: [_jsx(MessagePrimitive.GroupedParts, { groupBy: groupAssistantWorkParts, children: ({ part, children }) => {
|