@truefoundry/trueforge-ui 0.3.0-rc.9 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +181 -4
- package/dist/{AgentCodeSnippets-ARHIK2T6.js → AgentCodeSnippets-EK7KMIY2.js} +7 -7
- package/dist/AgentMetricChart-UZCYOC4M.js +15 -0
- package/dist/AgentOverview-5UPMYHT2.js +314 -0
- package/dist/AgentOverview-5UPMYHT2.js.map +1 -0
- package/dist/{AgentSessionEventTimeline-7QM7QKIQ.js → AgentSessionEventTimeline-V6NPCYMW.js} +7 -7
- package/dist/{AgentSessionEventTimelineChart-PIDYWLYT.js → AgentSessionEventTimelineChart-YQWZBQCG.js} +7 -7
- package/dist/{AgentSessions-MR2DREKN.js → AgentSessions-WNYVVB6Q.js} +81 -16
- package/dist/AgentSessions-WNYVVB6Q.js.map +1 -0
- package/dist/{ConnectorSettings-YBGANZOG.js → ConnectorSettings-O4I24244.js} +12 -10
- package/dist/ConnectorSettings-O4I24244.js.map +1 -0
- package/dist/{DockLayout-O5TS4YZH.js → DockLayout-JMBZVMGB.js} +10 -10
- package/dist/{DrawerLayout-7R3XONK2.js → DrawerLayout-E6G3IF6R.js} +11 -11
- package/dist/{ModelSettings-UXPL4E6X.js → ModelSettings-ZVXMXIU4.js} +7 -7
- package/dist/OpenUiFenceBlock-F3YVDKAG.js +9 -0
- package/dist/{SandboxSettings-5MMPJHBH.js → SandboxSettings-H6BA2DJQ.js} +7 -7
- package/dist/SchedulesPage-FS2QZ5KB.js +15 -0
- package/dist/{SettingsBuilder-JAP4QGMY.js → SettingsBuilder-VA3VGWZC.js} +8 -8
- package/dist/{ShellRouteSync-SJXFKUAJ.js → ShellRouteSync-ZT4PBE6T.js} +4 -4
- package/dist/{SidebarLayout-MYZTVWWE.js → SidebarLayout-ICXEN7ZL.js} +13 -13
- package/dist/SidebarLayout-ICXEN7ZL.js.map +1 -0
- package/dist/{SkillSettings-6C5PH3NN.js → SkillSettings-F5JGGFXR.js} +7 -7
- package/dist/{TrueForgeUIWithRouter-3J5G62O5.js → TrueForgeUIWithRouter-MKJ7IEWG.js} +9 -9
- package/dist/{WidgetLayout-24ZL3QWT.js → WidgetLayout-J7ZRW3V3.js} +10 -10
- package/dist/{chunk-JTQU2N2Q.js → chunk-7VWUB5OV.js} +7 -5
- package/dist/{chunk-JTQU2N2Q.js.map → chunk-7VWUB5OV.js.map} +1 -1
- package/dist/{chunk-RI6TIYWL.js → chunk-BREN6OSX.js} +38 -14
- package/dist/chunk-BREN6OSX.js.map +1 -0
- package/dist/{chunk-2QTH6JHX.js → chunk-JEAULQNF.js} +3 -3
- package/dist/{chunk-3ZW74FHC.js → chunk-KDCVFHPZ.js} +23 -19
- package/dist/chunk-KDCVFHPZ.js.map +1 -0
- package/dist/{chunk-4OEAJKLJ.js → chunk-KZK2PQ4A.js} +2356 -1840
- package/dist/chunk-KZK2PQ4A.js.map +1 -0
- package/dist/{chunk-JF4IELMW.js → chunk-MB7Z5FPI.js} +9 -9
- package/dist/{chunk-UBQYRCCH.js → chunk-MEW7WZ7Q.js} +6 -6
- package/dist/chunk-NXK4XW4U.js +587 -0
- package/dist/chunk-NXK4XW4U.js.map +1 -0
- package/dist/{chunk-JKUYG6HV.js → chunk-QI4HGU5E.js} +7 -7
- package/dist/chunk-QI4HGU5E.js.map +1 -0
- package/dist/{chunk-FEHL45EB.js → chunk-SCIEO6CF.js} +2 -2
- package/dist/{chunk-2GIZY3JJ.js → chunk-U7WONUMR.js} +55 -4
- package/dist/chunk-U7WONUMR.js.map +1 -0
- package/dist/{chunk-T6QQV5LK.js → chunk-UN7WPTTK.js} +2 -2
- package/dist/{chunk-MACHU4OO.js → chunk-VTOW2UIX.js} +4 -4
- package/dist/{chunk-CG75X77Q.js → chunk-WFIA627Q.js} +2 -2
- package/dist/index.d.ts +37 -8
- package/dist/index.js +16 -12
- package/dist/index.js.map +1 -1
- package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +10 -3
- package/dist/plugins/trueforge-agent-server-adapter/index.js +37 -12
- package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +3 -3
- package/dist/AgentMetricChart-ZQIRBCZL.js +0 -15
- package/dist/AgentOverview-7GJJV2OU.js +0 -169
- package/dist/AgentOverview-7GJJV2OU.js.map +0 -1
- package/dist/AgentSessions-MR2DREKN.js.map +0 -1
- package/dist/ConnectorSettings-YBGANZOG.js.map +0 -1
- package/dist/OpenUiFenceBlock-KPZFLUSC.js +0 -9
- package/dist/SchedulesPage-5XZRDA5O.js +0 -15
- package/dist/SidebarLayout-MYZTVWWE.js.map +0 -1
- package/dist/chunk-2GIZY3JJ.js.map +0 -1
- package/dist/chunk-3ZW74FHC.js.map +0 -1
- package/dist/chunk-4OEAJKLJ.js.map +0 -1
- package/dist/chunk-JCL3Q7RW.js +0 -587
- package/dist/chunk-JCL3Q7RW.js.map +0 -1
- package/dist/chunk-JKUYG6HV.js.map +0 -1
- package/dist/chunk-RI6TIYWL.js.map +0 -1
- /package/dist/{AgentCodeSnippets-ARHIK2T6.js.map → AgentCodeSnippets-EK7KMIY2.js.map} +0 -0
- /package/dist/{AgentMetricChart-ZQIRBCZL.js.map → AgentMetricChart-UZCYOC4M.js.map} +0 -0
- /package/dist/{AgentSessionEventTimeline-7QM7QKIQ.js.map → AgentSessionEventTimeline-V6NPCYMW.js.map} +0 -0
- /package/dist/{AgentSessionEventTimelineChart-PIDYWLYT.js.map → AgentSessionEventTimelineChart-YQWZBQCG.js.map} +0 -0
- /package/dist/{DockLayout-O5TS4YZH.js.map → DockLayout-JMBZVMGB.js.map} +0 -0
- /package/dist/{DrawerLayout-7R3XONK2.js.map → DrawerLayout-E6G3IF6R.js.map} +0 -0
- /package/dist/{ModelSettings-UXPL4E6X.js.map → ModelSettings-ZVXMXIU4.js.map} +0 -0
- /package/dist/{OpenUiFenceBlock-KPZFLUSC.js.map → OpenUiFenceBlock-F3YVDKAG.js.map} +0 -0
- /package/dist/{SandboxSettings-5MMPJHBH.js.map → SandboxSettings-H6BA2DJQ.js.map} +0 -0
- /package/dist/{SchedulesPage-5XZRDA5O.js.map → SchedulesPage-FS2QZ5KB.js.map} +0 -0
- /package/dist/{SettingsBuilder-JAP4QGMY.js.map → SettingsBuilder-VA3VGWZC.js.map} +0 -0
- /package/dist/{ShellRouteSync-SJXFKUAJ.js.map → ShellRouteSync-ZT4PBE6T.js.map} +0 -0
- /package/dist/{SkillSettings-6C5PH3NN.js.map → SkillSettings-F5JGGFXR.js.map} +0 -0
- /package/dist/{TrueForgeUIWithRouter-3J5G62O5.js.map → TrueForgeUIWithRouter-MKJ7IEWG.js.map} +0 -0
- /package/dist/{WidgetLayout-24ZL3QWT.js.map → WidgetLayout-J7ZRW3V3.js.map} +0 -0
- /package/dist/{chunk-2QTH6JHX.js.map → chunk-JEAULQNF.js.map} +0 -0
- /package/dist/{chunk-JF4IELMW.js.map → chunk-MB7Z5FPI.js.map} +0 -0
- /package/dist/{chunk-UBQYRCCH.js.map → chunk-MEW7WZ7Q.js.map} +0 -0
- /package/dist/{chunk-FEHL45EB.js.map → chunk-SCIEO6CF.js.map} +0 -0
- /package/dist/{chunk-T6QQV5LK.js.map → chunk-UN7WPTTK.js.map} +0 -0
- /package/dist/{chunk-MACHU4OO.js.map → chunk-VTOW2UIX.js.map} +0 -0
- /package/dist/{chunk-CG75X77Q.js.map → chunk-WFIA627Q.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/atoms/agent-details/AgentOverview.tsx","../src/atoms/agent-details/AgentOverviewMcpServers.tsx"],"sourcesContent":["'use client';\n\nimport { useState, type ComponentType } from 'react';\nimport { Icon } from '../../icons/Icon.js';\nimport { useServerCapabilities } from '../../server/ServerContext.js';\nimport { useSlot } from '../../theme/SlotsProvider.js';\nimport { cn } from '../lib/cn.js';\nimport { AgentOverviewMcpServers } from './AgentOverviewMcpServers.js';\nimport type { AgentOverviewProps } from './types.js';\n\ntype InstructionsView = 'markdown' | 'raw';\n\nconst valueClassName = 'text-right font-mono text-primary-button-bg';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value != null;\n}\n\nfunction readName(value: object): string | null {\n if (!('name' in value) || typeof value.name !== 'string') return null;\n return value.name;\n}\n\nfunction readRecordValue(record: Record<string, unknown> | null, ...keys: string[]): unknown {\n for (const key of keys) {\n const value = record?.[key];\n if (value !== undefined) return value;\n }\n return undefined;\n}\n\nfunction displayModelName(name: string): string {\n const slash = name.lastIndexOf('/');\n return slash >= 0 ? name.slice(slash + 1) : name;\n}\n\nexport default function AgentOverview({ detail }: AgentOverviewProps) {\n const Markdown = useSlot('Markdown');\n const AgentOverviewCard = useSlot('AgentOverviewCard');\n const capabilitiesAvailable = useServerCapabilities();\n const [instructionsView, setInstructionsView] = useState<InstructionsView>('markdown');\n const [copied, setCopied] = useState(false);\n const spec = detail.agentSpec;\n const skills = spec.skills ?? [];\n const modelParams = isRecord(spec.model.params) ? spec.model.params : null;\n const maxTokens = readRecordValue(modelParams, 'maxTokens', 'max_tokens');\n const temperature = readRecordValue(modelParams, 'temperature');\n const config = isRecord(spec.config) ? spec.config : null;\n const sandbox = isRecord(config?.sandbox) ? config.sandbox : null;\n const instructions = spec.instructions?.trim() ? spec.instructions : null;\n const description = detail.description?.trim() ? detail.description : null;\n const execution = [\n ['Sandbox', typeof sandbox?.enabled === 'boolean' ? (sandbox.enabled ? 'Enabled' : 'Disabled') : undefined],\n ['Iteration limit', readRecordValue(config, 'iterationLimit', 'iteration_limit')],\n ['Response format', readRecordValue(config, 'responseFormat', 'response_format')],\n ].filter((entry): entry is [string, string | number] => {\n return typeof entry[1] === 'string' || typeof entry[1] === 'number';\n });\n const capabilities = [\n ['Generative UI', spec.config?.generativeUi?.enabled],\n ['Dynamic sub-agents', spec.config?.dynamicSubAgents?.enabled],\n ['Ask user questions', spec.config?.askUserQuestions?.enabled],\n ...(capabilitiesAvailable?.webSearch?.enabled === true\n ? ([['Web search', spec.config?.webSearch?.enabled]] as const)\n : []),\n ].filter((entry): entry is [string, boolean] => typeof entry[1] === 'boolean');\n const toggleLabel = instructionsView === 'markdown' ? 'Raw' : 'Markdown';\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col gap-3 overflow-auto p-4 md:overflow-hidden\">\n <div className=\"grid min-h-0 flex-1 gap-3 md:grid-cols-[minmax(0,1fr)_22rem] md:overflow-hidden\">\n <section className=\"flex min-h-64 flex-col rounded-lg border border-border bg-card-bg p-4 text-text-primary\">\n <div className=\"mb-3 flex shrink-0 items-center justify-between gap-2\">\n <h2 className=\"flex items-center gap-1.5 text-sm font-semibold text-text-primary\">\n <Icon name=\"book-open\" className=\"size-4 text-text-secondary\" />\n Instructions\n </h2>\n {instructions ? (\n <div\n className=\"inline-flex h-7 items-stretch overflow-hidden rounded-md border border-border bg-primary-bg text-xs font-medium text-text-secondary\"\n role=\"group\"\n aria-label=\"Instructions actions\"\n >\n <button\n type=\"button\"\n aria-label={`Show ${toggleLabel}`}\n onClick={() => setInstructionsView(view => (view === 'markdown' ? 'raw' : 'markdown'))}\n className=\"cursor-pointer px-2.5 transition-colors hover:bg-ghost-button-hover hover:text-text-primary\"\n >\n {toggleLabel}\n </button>\n <span className=\"w-px self-stretch bg-border\" aria-hidden />\n <button\n type=\"button\"\n title={copied ? 'Copied!' : 'Copy'}\n aria-label={copied ? 'Copied!' : 'Copy'}\n onClick={() => {\n void navigator.clipboard.writeText(instructions).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n }}\n className=\"inline-flex cursor-pointer items-center justify-center px-2 transition-colors hover:bg-ghost-button-hover hover:text-text-primary\"\n >\n <Icon name={copied ? 'check' : 'copy'} size={12} />\n </button>\n </div>\n ) : null}\n </div>\n <div className=\"min-h-0 flex-1 overflow-auto\">\n {instructions ? (\n instructionsView === 'markdown' ? (\n <Markdown content={instructions} readOnly className=\"text-sm\" />\n ) : (\n <pre className=\"whitespace-pre-wrap break-words font-mono text-sm text-text-primary\">\n {instructions}\n </pre>\n )\n ) : (\n <p className=\"text-sm text-text-secondary\">No instructions for this agent.</p>\n )}\n </div>\n </section>\n\n <aside className=\"flex min-h-0 min-w-0 flex-col gap-3 md:overflow-auto\">\n {description ? (\n <AgentOverviewCard title=\"Description\" icon=\"file\">\n <p className=\"text-xs text-text-secondary\">{description}</p>\n </AgentOverviewCard>\n ) : null}\n <AgentOverviewCard title=\"Model Configuration\" icon=\"cpu\">\n <dl className=\"grid grid-cols-[auto_minmax(0,1fr)] gap-x-3 gap-y-1 text-xs\">\n <dt className=\"text-text-secondary\">Model</dt>\n <dd className={cn(valueClassName, 'truncate')} title={spec.model.name}>\n {displayModelName(spec.model.name)}\n </dd>\n {typeof maxTokens === 'number' ? (\n <>\n <dt className=\"text-text-secondary\">Max tokens</dt>\n <dd className={valueClassName}>{maxTokens}</dd>\n </>\n ) : null}\n {spec.model.params?.reasoningEffort !== undefined ? (\n <>\n <dt className=\"text-text-secondary\">Reasoning</dt>\n <dd className={valueClassName}>{spec.model.params.reasoningEffort}</dd>\n </>\n ) : null}\n {typeof temperature === 'number' ? (\n <>\n <dt className=\"text-text-secondary\">Temperature</dt>\n <dd className={valueClassName}>{temperature}</dd>\n </>\n ) : null}\n </dl>\n </AgentOverviewCard>\n <AgentOverviewMcpServers mcpServers={spec.mcpServers} />\n\n <AgentOverviewCard title=\"Attached Skills\" icon=\"lightbulb\" count={skills.length}>\n {skills.length === 0 ? (\n <p className=\"text-xs text-text-secondary\">No skills attached.</p>\n ) : (\n <ul className=\"space-y-1.5\">\n {skills.map((skill, index) => (\n <li\n key={`${readName(skill) ?? 'skill'}-${index}`}\n className=\"rounded-md bg-secondary-bg px-2 py-1.5 text-xs\"\n >\n {readName(skill) ?? `Skill ${index + 1}`}\n </li>\n ))}\n </ul>\n )}\n </AgentOverviewCard>\n\n {execution.length > 0 ? (\n <AgentOverviewCard title=\"Execution\" icon=\"terminal\">\n <dl className=\"space-y-1 text-xs\">\n {execution.map(([label, value]) => (\n <div key={label} className=\"flex justify-between gap-3\">\n <dt className=\"text-text-secondary\">{label}</dt>\n <dd className={valueClassName}>{value}</dd>\n </div>\n ))}\n </dl>\n </AgentOverviewCard>\n ) : null}\n\n {capabilities.length > 0 ? (\n <AgentOverviewCard title=\"Capabilities\" icon=\"cube\">\n <dl className=\"space-y-1 text-xs\">\n {capabilities.map(([label, enabled]) => (\n <div key={label} className=\"flex justify-between gap-3\">\n <dt className=\"text-text-secondary\">{label}</dt>\n <dd className={valueClassName}>{enabled ? 'Enabled' : 'Disabled'}</dd>\n </div>\n ))}\n </dl>\n </AgentOverviewCard>\n ) : null}\n </aside>\n </div>\n </div>\n );\n}\n\ndeclare module '../../theme/SlotsProvider.js' {\n interface AtomSlots {\n AgentOverview: ComponentType<AgentOverviewProps>;\n }\n}\n","'use client';\n\nimport { useEffect, useMemo, useState } from 'react';\n\nimport { Icon } from '../../icons/Icon.js';\nimport { useOptionalServer } from '../../server/ServerContext.js';\nimport type { McpToolSelection } from '../../server/types.js';\nimport { useSlot } from '../../theme/SlotsProvider.js';\nimport {\n approvalSelectorsFromMount,\n disableSelectorsFromMount,\n editableMountsFromSpec,\n enableSelectorsFromMount,\n} from '../draft/agentConfigMounts.js';\nimport { namedToolRequiresApproval } from '../draft/mcpToolApprovals.js';\nimport { mcpToolKind, type McpToolKind } from '../draft/mcpToolSections.js';\nimport { selectedToolNames, TOOL_TAG_ALL } from '../draft/mcpToolSelectors.js';\nimport { cn } from '../lib/cn.js';\nimport { Tooltip } from '../primitives/Tooltip.js';\n\nconst KIND_CLASSES: Record<McpToolKind, string> = {\n read: 'border-border bg-secondary-bg text-text-secondary',\n write: 'border-border bg-secondary-bg text-text-primary',\n destructive: 'border-failure-bg/30 bg-failure-bg/10 text-failure-bg',\n};\n\n/** Read-only tools first and destructive last, mirroring the tool picker's sections. */\nconst KIND_ORDER: Record<McpToolKind | 'unknown', number> = {\n read: 0,\n write: 1,\n unknown: 2,\n destructive: 3,\n};\n\nfunction toolCountLabel(count: number): string {\n return count === 1 ? '1 tool' : `${count} tools`;\n}\n\n/** Shown while tags cannot be resolved: the selectors themselves are the best available answer. */\nfunction toolSelectorLabel(enableSelectors: readonly string[]): string {\n if (enableSelectors.includes(TOOL_TAG_ALL)) return 'All tools';\n return enableSelectors.filter(selector => selector.startsWith('@')).join(' ');\n}\n\nfunction ApprovalCountBadge({ count }: { count: number }) {\n return (\n <span\n className=\"border-warning-bg/40 bg-warning-bg/10 text-warning-bg inline-flex shrink-0 items-center gap-1 rounded-full border px-1.5 py-0.5 text-[0.625rem] font-medium\"\n aria-label={`${count} ${count === 1 ? 'tool needs' : 'tools need'} approval`}\n >\n <Icon name=\"shield-check\" className=\"size-2.5\" />\n {count}\n </span>\n );\n}\n\nfunction ToolKindPill({ kind }: { kind: McpToolKind }) {\n return (\n <span className={cn('shrink-0 rounded-full border px-1.5 py-0.5 text-[0.625rem] font-medium', KIND_CLASSES[kind])}>\n {kind}\n </span>\n );\n}\n\nfunction ApprovalIndicator({ approvalRequired, toolName }: { approvalRequired: boolean; toolName: string }) {\n return (\n <Tooltip\n content={approvalRequired ? 'Asks for approval before running' : 'Runs without asking for approval'}\n triggerClassName=\"shrink-0\"\n >\n <span\n role=\"img\"\n aria-label={`${toolName} ${approvalRequired ? 'requires approval' : 'runs without approval'}`}\n className={cn(\n 'flex size-5 items-center justify-center rounded-md border',\n approvalRequired\n ? 'border-warning-bg/50 bg-warning-bg/10 text-warning-bg'\n : 'border-border text-text-secondary',\n )}\n >\n <Icon name={approvalRequired ? 'shield-check' : 'shield'} className=\"size-3\" />\n </span>\n </Tooltip>\n );\n}\n\n/** Attached MCP servers, each expanding into the tools the agent can call. */\nexport function AgentOverviewMcpServers({ mcpServers }: { mcpServers: unknown }) {\n const AgentOverviewCard = useSlot('AgentOverviewCard');\n const server = useOptionalServer();\n const getMcpTools = server?.getMcpTools;\n const mounts = useMemo(() => editableMountsFromSpec(mcpServers), [mcpServers]);\n const [toolsByServer, setToolsByServer] = useState<Record<string, McpToolSelection[]>>({});\n const [expandedIds, setExpandedIds] = useState<ReadonlySet<string>>(() => new Set());\n\n // Tool metadata drives the counts, kinds, and approval state; a failing server just shows less.\n useEffect(() => {\n if (getMcpTools === undefined) return;\n let cancelled = false;\n for (const mount of mounts) {\n void getMcpTools({ connectorId: mount.name }).then(\n tools => {\n if (!cancelled) setToolsByServer(prev => ({ ...prev, [mount.name]: tools }));\n },\n () => {},\n );\n }\n return () => {\n cancelled = true;\n };\n }, [getMcpTools, mounts]);\n\n if (mounts.length === 0) {\n return (\n <AgentOverviewCard title=\"MCP Servers & Tools\" icon=\"plug\" count={0}>\n <p className=\"text-text-secondary text-xs\">No connectors attached.</p>\n </AgentOverviewCard>\n );\n }\n\n return (\n <AgentOverviewCard title=\"MCP Servers & Tools\" icon=\"plug\" count={mounts.length}>\n <ul className=\"space-y-1.5\">\n {mounts.map(mount => {\n const tools = toolsByServer[mount.name] ?? [];\n const selectors = approvalSelectorsFromMount(mount.value);\n const enableSelectors = enableSelectorsFromMount(mount.value);\n const enabled = selectedToolNames({\n enableSelectors,\n disableSelectors: disableSelectorsFromMount(mount.value),\n tools,\n });\n const toolNames = enabled.names\n .map(toolName => {\n const tool = tools.find(item => item.name === toolName);\n const kind = tool === undefined ? undefined : mcpToolKind(tool);\n return {\n toolName,\n kind,\n approvalRequired: namedToolRequiresApproval({ toolName, tools, selectors }),\n };\n })\n .sort((left, right) => KIND_ORDER[left.kind ?? 'unknown'] - KIND_ORDER[right.kind ?? 'unknown']);\n const approvalCount = toolNames.filter(tool => tool.approvalRequired).length;\n const expanded = expandedIds.has(mount.id);\n return (\n <li key={mount.id} className=\"overflow-hidden rounded-md border border-border\">\n <button\n type=\"button\"\n aria-expanded={expanded}\n disabled={toolNames.length === 0}\n className=\"flex w-full cursor-pointer items-center gap-2 bg-secondary-bg px-2.5 py-2 text-left text-xs hover:bg-ghost-button-hover disabled:cursor-default disabled:hover:bg-secondary-bg\"\n onClick={() =>\n setExpandedIds(prev => {\n const next = new Set(prev);\n if (expanded) next.delete(mount.id);\n else next.add(mount.id);\n return next;\n })\n }\n >\n <Icon\n name=\"chevron-down\"\n className={cn(\n 'size-3 shrink-0 text-text-secondary transition-transform',\n expanded ? undefined : '-rotate-90',\n toolNames.length === 0 && 'invisible',\n )}\n />\n <span className=\"min-w-0 flex-1 truncate font-medium\">{mount.name}</span>\n <span className=\"shrink-0 text-text-secondary\">\n {enabled.resolved ? toolCountLabel(toolNames.length) : toolSelectorLabel(enableSelectors)}\n </span>\n {approvalCount > 0 ? <ApprovalCountBadge count={approvalCount} /> : null}\n </button>\n {expanded ? (\n <ul className=\"divide-y divide-border border-t border-border\">\n {toolNames.map(({ toolName, kind, approvalRequired }) => (\n <li key={toolName} className=\"flex items-center gap-2 px-2.5 py-1.5\">\n <span className=\"min-w-0 flex-1 truncate font-mono text-[0.6875rem]\" title={toolName}>\n {toolName}\n </span>\n {kind ? <ToolKindPill kind={kind} /> : null}\n <ApprovalIndicator approvalRequired={approvalRequired} toolName={toolName} />\n </li>\n ))}\n </ul>\n ) : null}\n </li>\n );\n })}\n </ul>\n </AgentOverviewCard>\n );\n}\n"],"mappings":"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","names":["useState","jsx","jsxs","useState"]}
|
package/dist/{AgentSessionEventTimeline-7QM7QKIQ.js → AgentSessionEventTimeline-V6NPCYMW.js}
RENAMED
|
@@ -4,15 +4,15 @@ import {
|
|
|
4
4
|
getSessionEventColor,
|
|
5
5
|
useSlot,
|
|
6
6
|
useThemeMode
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
7
|
+
} from "./chunk-KZK2PQ4A.js";
|
|
8
|
+
import "./chunk-UN7WPTTK.js";
|
|
9
|
+
import "./chunk-KDCVFHPZ.js";
|
|
10
|
+
import "./chunk-U7WONUMR.js";
|
|
11
11
|
import "./chunk-M6MHLVSO.js";
|
|
12
|
-
import "./chunk-
|
|
12
|
+
import "./chunk-WFIA627Q.js";
|
|
13
13
|
import {
|
|
14
14
|
cn
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-NXK4XW4U.js";
|
|
16
16
|
|
|
17
17
|
// src/atoms/agent-details/AgentSessionEventTimeline.tsx
|
|
18
18
|
import { useCallback, useMemo, useState } from "react";
|
|
@@ -85,4 +85,4 @@ function AgentSessionEventTimeline({ turns, segments, onSelectTurn }) {
|
|
|
85
85
|
export {
|
|
86
86
|
AgentSessionEventTimeline
|
|
87
87
|
};
|
|
88
|
-
//# sourceMappingURL=AgentSessionEventTimeline-
|
|
88
|
+
//# sourceMappingURL=AgentSessionEventTimeline-V6NPCYMW.js.map
|
|
@@ -25,13 +25,13 @@ import {
|
|
|
25
25
|
mergeOverlappingSubAgentSegments,
|
|
26
26
|
roundDurationMsToSecond,
|
|
27
27
|
useThemeMode
|
|
28
|
-
} from "./chunk-
|
|
29
|
-
import "./chunk-
|
|
30
|
-
import "./chunk-
|
|
31
|
-
import "./chunk-
|
|
28
|
+
} from "./chunk-KZK2PQ4A.js";
|
|
29
|
+
import "./chunk-UN7WPTTK.js";
|
|
30
|
+
import "./chunk-KDCVFHPZ.js";
|
|
31
|
+
import "./chunk-U7WONUMR.js";
|
|
32
32
|
import "./chunk-M6MHLVSO.js";
|
|
33
|
-
import "./chunk-
|
|
34
|
-
import "./chunk-
|
|
33
|
+
import "./chunk-WFIA627Q.js";
|
|
34
|
+
import "./chunk-NXK4XW4U.js";
|
|
35
35
|
|
|
36
36
|
// src/atoms/agent-details/AgentSessionEventTimelineChart.tsx
|
|
37
37
|
import {
|
|
@@ -588,4 +588,4 @@ function AgentSessionEventTimelineChart({
|
|
|
588
588
|
export {
|
|
589
589
|
AgentSessionEventTimelineChart
|
|
590
590
|
};
|
|
591
|
-
//# sourceMappingURL=AgentSessionEventTimelineChart-
|
|
591
|
+
//# sourceMappingURL=AgentSessionEventTimelineChart-YQWZBQCG.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import {
|
|
3
3
|
buildSessionResumeHref
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-JEAULQNF.js";
|
|
5
5
|
import {
|
|
6
6
|
useOptionalResolvedRoutes
|
|
7
7
|
} from "./chunk-Y6S4OVVQ.js";
|
|
@@ -9,27 +9,34 @@ import {
|
|
|
9
9
|
sessionIsCreateAgent
|
|
10
10
|
} from "./chunk-RDXBMTP5.js";
|
|
11
11
|
import {
|
|
12
|
+
Button,
|
|
13
|
+
Dialog,
|
|
14
|
+
DialogContent,
|
|
15
|
+
DialogFooter,
|
|
16
|
+
DialogHeader,
|
|
17
|
+
DialogTitle,
|
|
12
18
|
EmptyScreen,
|
|
13
19
|
Skeleton,
|
|
14
20
|
useResourcePermissions,
|
|
15
21
|
useSessionShareSearch,
|
|
16
|
-
useSlot
|
|
17
|
-
|
|
18
|
-
|
|
22
|
+
useSlot,
|
|
23
|
+
useToasterOptional
|
|
24
|
+
} from "./chunk-KZK2PQ4A.js";
|
|
25
|
+
import "./chunk-UN7WPTTK.js";
|
|
19
26
|
import {
|
|
20
27
|
Icon
|
|
21
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-KDCVFHPZ.js";
|
|
22
29
|
import {
|
|
23
30
|
sessionTimeRangeFromCreatedAt,
|
|
24
31
|
useAgentSessionsServer,
|
|
25
32
|
useOptionalShellMode,
|
|
26
33
|
useServer
|
|
27
|
-
} from "./chunk-
|
|
34
|
+
} from "./chunk-U7WONUMR.js";
|
|
28
35
|
import "./chunk-M6MHLVSO.js";
|
|
29
|
-
import "./chunk-
|
|
36
|
+
import "./chunk-WFIA627Q.js";
|
|
30
37
|
import {
|
|
31
38
|
cn
|
|
32
|
-
} from "./chunk-
|
|
39
|
+
} from "./chunk-NXK4XW4U.js";
|
|
33
40
|
|
|
34
41
|
// src/atoms/agent-details/AgentSessions.tsx
|
|
35
42
|
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
@@ -68,14 +75,10 @@ function entrySourceType(entry) {
|
|
|
68
75
|
function AgentSessions({ agentId, startTimestamp, endTimestamp, shareView }) {
|
|
69
76
|
const sessionsServer = useAgentSessionsServer();
|
|
70
77
|
const chatServer = useServer();
|
|
78
|
+
const toaster = useToasterOptional();
|
|
71
79
|
const shell = useOptionalShellMode();
|
|
72
80
|
const routes = useOptionalResolvedRoutes();
|
|
73
81
|
const { sessionId: selectedSessionId, updateShareSearch } = useSessionShareSearch();
|
|
74
|
-
const { allows } = useResourcePermissions({
|
|
75
|
-
resourceType: "session",
|
|
76
|
-
resourceIds: selectedSessionId == null ? [] : [selectedSessionId]
|
|
77
|
-
});
|
|
78
|
-
const canResume = allows(selectedSessionId, "MANAGE");
|
|
79
82
|
const AgentSessionListRow = useSlot("AgentSessionListRow");
|
|
80
83
|
const AgentSessionDetailHeader = useSlot("AgentSessionDetailHeader");
|
|
81
84
|
const AgentSessionTimelineContainer = useSlot("AgentSessionTimelineContainer");
|
|
@@ -93,6 +96,18 @@ function AgentSessions({ agentId, startTimestamp, endTimestamp, shareView }) {
|
|
|
93
96
|
const [detailSession, setDetailSession] = useState();
|
|
94
97
|
const [detailLoading, setDetailLoading] = useState(false);
|
|
95
98
|
const [detailFailed, setDetailFailed] = useState(false);
|
|
99
|
+
const [pendingDelete, setPendingDelete] = useState(null);
|
|
100
|
+
const canDeleteSession = typeof chatServer.deleteSession === "function";
|
|
101
|
+
const permissionResourceIds = useMemo(() => {
|
|
102
|
+
const ids = new Set(entries.map((entry) => entry.id));
|
|
103
|
+
if (selectedSessionId != null && selectedSessionId.length > 0) ids.add(selectedSessionId);
|
|
104
|
+
return [...ids];
|
|
105
|
+
}, [entries, selectedSessionId]);
|
|
106
|
+
const { allows } = useResourcePermissions({
|
|
107
|
+
resourceType: "session",
|
|
108
|
+
resourceIds: permissionResourceIds
|
|
109
|
+
});
|
|
110
|
+
const canResume = allows(selectedSessionId, "MANAGE");
|
|
96
111
|
const listRequest = useMemo(
|
|
97
112
|
() => ({
|
|
98
113
|
order: "desc",
|
|
@@ -205,6 +220,19 @@ function AgentSessions({ agentId, startTimestamp, endTimestamp, shareView }) {
|
|
|
205
220
|
if (selectedSessionId == null) return;
|
|
206
221
|
updateShareSearch({ sessionId: null });
|
|
207
222
|
};
|
|
223
|
+
const handleDelete = async (entry) => {
|
|
224
|
+
if (!allows(entry.id, "DELETE") || typeof chatServer.deleteSession !== "function") return;
|
|
225
|
+
setPendingDelete(null);
|
|
226
|
+
try {
|
|
227
|
+
await chatServer.deleteSession({ sessionId: entry.id });
|
|
228
|
+
setEntries((current) => current.filter((item) => item.id !== entry.id));
|
|
229
|
+
if (selectedSessionId === entry.id) {
|
|
230
|
+
updateShareSearch({ sessionId: null });
|
|
231
|
+
}
|
|
232
|
+
} catch (caught) {
|
|
233
|
+
toaster?.showError(caught);
|
|
234
|
+
}
|
|
235
|
+
};
|
|
208
236
|
const selectedEntry = entries.find((entry) => entry.id === selectedSessionId);
|
|
209
237
|
const selectedTitle = detailSession != null ? sessionTitle(detailSession) : selectedEntry != null ? sessionTitle(selectedEntry) : selectedSessionId ?? "Untitled session";
|
|
210
238
|
const resumeIsCreateAgent = detailSession != null ? sessionIsCreateAgent(detailSession) : selectedEntry != null ? sessionIsCreateAgent(selectedEntry) : false;
|
|
@@ -250,7 +278,11 @@ function AgentSessions({ agentId, startTimestamp, endTimestamp, shareView }) {
|
|
|
250
278
|
lastActivityAt: entry.lastActivityAt,
|
|
251
279
|
metrics: entry.metrics,
|
|
252
280
|
active: entry.id === selectedSessionId,
|
|
253
|
-
onSelect: () => selectSession(entry)
|
|
281
|
+
onSelect: () => selectSession(entry),
|
|
282
|
+
...canDeleteSession ? {
|
|
283
|
+
onRequestDelete: () => setPendingDelete(entry),
|
|
284
|
+
canDelete: allows(entry.id, "DELETE")
|
|
285
|
+
} : {}
|
|
254
286
|
},
|
|
255
287
|
entry.id
|
|
256
288
|
)),
|
|
@@ -312,7 +344,40 @@ function AgentSessions({ agentId, startTimestamp, endTimestamp, shareView }) {
|
|
|
312
344
|
listMetrics: selectedEntry?.metrics
|
|
313
345
|
}
|
|
314
346
|
)
|
|
315
|
-
] }) }) })
|
|
347
|
+
] }) }) }),
|
|
348
|
+
pendingDelete != null ? /* @__PURE__ */ jsxs(
|
|
349
|
+
Dialog,
|
|
350
|
+
{
|
|
351
|
+
open: true,
|
|
352
|
+
onOpenChange: (open) => {
|
|
353
|
+
if (!open) setPendingDelete(null);
|
|
354
|
+
},
|
|
355
|
+
"aria-label": "Delete session",
|
|
356
|
+
className: "max-w-md",
|
|
357
|
+
children: [
|
|
358
|
+
/* @__PURE__ */ jsx(DialogContent, { children: /* @__PURE__ */ jsxs(DialogHeader, { children: [
|
|
359
|
+
/* @__PURE__ */ jsx(DialogTitle, { children: "Delete session" }),
|
|
360
|
+
/* @__PURE__ */ jsxs("p", { className: "text-text-secondary text-sm", children: [
|
|
361
|
+
"\u201C",
|
|
362
|
+
sessionTitle(pendingDelete),
|
|
363
|
+
"\u201D will be permanently deleted. This cannot be undone."
|
|
364
|
+
] })
|
|
365
|
+
] }) }),
|
|
366
|
+
/* @__PURE__ */ jsxs(DialogFooter, { children: [
|
|
367
|
+
/* @__PURE__ */ jsx(Button.Secondary, { type: "button", onClick: () => setPendingDelete(null), children: "Cancel" }),
|
|
368
|
+
/* @__PURE__ */ jsx(
|
|
369
|
+
Button.Destructive,
|
|
370
|
+
{
|
|
371
|
+
type: "button",
|
|
372
|
+
disabled: !allows(pendingDelete.id, "DELETE"),
|
|
373
|
+
onClick: () => void handleDelete(pendingDelete),
|
|
374
|
+
children: "Delete"
|
|
375
|
+
}
|
|
376
|
+
)
|
|
377
|
+
] })
|
|
378
|
+
]
|
|
379
|
+
}
|
|
380
|
+
) : null
|
|
316
381
|
]
|
|
317
382
|
}
|
|
318
383
|
);
|
|
@@ -320,4 +385,4 @@ function AgentSessions({ agentId, startTimestamp, endTimestamp, shareView }) {
|
|
|
320
385
|
export {
|
|
321
386
|
AgentSessions
|
|
322
387
|
};
|
|
323
|
-
//# sourceMappingURL=AgentSessions-
|
|
388
|
+
//# sourceMappingURL=AgentSessions-WNYVVB6Q.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/atoms/agent-details/AgentSessions.tsx","../src/utils/drainListPages.ts"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useMemo, useRef, useState, type ComponentType } from 'react';\nimport { Group, Panel, Separator } from 'react-resizable-panels';\n\nimport { useToasterOptional } from '../../containers/ToasterContainer.js';\nimport { useResourcePermissions } from '../../hooks/useResourcePermissions.js';\nimport { useSessionShareSearch } from '../../hooks/useSessionShareSearch.js';\nimport { Icon } from '../../icons/Icon.js';\nimport { buildSessionResumeHref } from '../../routing/paths.js';\nimport { useOptionalResolvedRoutes } from '../../routing/ResolvedRoutesContext.js';\nimport { useAgentSessionsServer, useServer } from '../../server/ServerContext.js';\nimport { useOptionalShellMode } from '../../server/ShellModeContext.js';\nimport type { Session, SessionEventItem, SessionListEntry } from '../../server/types.js';\nimport { useSlot } from '../../theme/SlotsProvider.js';\nimport { drainListPages } from '../../utils/drainListPages.js';\nimport { sessionTimeRangeFromCreatedAt } from '../../utils/sessionShareUrl.js';\nimport { EmptyScreen } from '../EmptyScreen.js';\nimport { cn } from '../lib/cn.js';\nimport { sessionIsCreateAgent } from '../lib/sessionCreateAgent.js';\nimport { Button } from '../primitives/Button.js';\nimport { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from '../primitives/Dialog.js';\nimport { Skeleton } from '../primitives/Skeleton.js';\nimport type { AgentSessionsProps } from './types.js';\n\nconst LOAD_MORE_ROOT_MARGIN = '96px';\n\nfunction sessionTitle(entry: Pick<SessionListEntry, 'title'>): string {\n const title = entry.title?.trim();\n return title != null && title.length > 0 ? title : 'Untitled session';\n}\n\nfunction entryIsMutable(entry: SessionListEntry): boolean {\n if ('isMutable' in entry && typeof Reflect.get(entry, 'isMutable') === 'boolean') {\n return Reflect.get(entry, 'isMutable') === true;\n }\n return entry.agentName == null;\n}\n\nfunction entrySourceType(entry: SessionListEntry): 'schedule' | undefined {\n return 'sourceType' in entry && Reflect.get(entry, 'sourceType') === 'schedule' ? 'schedule' : undefined;\n}\n\nexport function AgentSessions({ agentId, startTimestamp, endTimestamp, shareView }: AgentSessionsProps) {\n const sessionsServer = useAgentSessionsServer();\n const chatServer = useServer();\n const toaster = useToasterOptional();\n const shell = useOptionalShellMode();\n const routes = useOptionalResolvedRoutes();\n const { sessionId: selectedSessionId, updateShareSearch } = useSessionShareSearch();\n\n const AgentSessionListRow = useSlot('AgentSessionListRow');\n const AgentSessionDetailHeader = useSlot('AgentSessionDetailHeader');\n const AgentSessionTimelineContainer = useSlot('AgentSessionTimelineContainer');\n\n const [entries, setEntries] = useState<SessionListEntry[]>([]);\n const [nextPageToken, setNextPageToken] = useState<string | undefined>();\n const [listLoading, setListLoading] = useState(true);\n const [listLoadingMore, setListLoadingMore] = useState(false);\n const [listLoadMoreFailed, setListLoadMoreFailed] = useState(false);\n const [listFailed, setListFailed] = useState(false);\n const listRequestIdRef = useRef(0);\n const loadMoreInflightRef = useRef(false);\n const [listEl, setListEl] = useState<HTMLDivElement | null>(null);\n const [sentinelEl, setSentinelEl] = useState<HTMLDivElement | null>(null);\n const [detailEvents, setDetailEvents] = useState<SessionEventItem[]>();\n const [detailSession, setDetailSession] = useState<Session>();\n const [detailLoading, setDetailLoading] = useState(false);\n const [detailFailed, setDetailFailed] = useState(false);\n const [pendingDelete, setPendingDelete] = useState<SessionListEntry | null>(null);\n\n const canDeleteSession = typeof chatServer.deleteSession === 'function';\n const permissionResourceIds = useMemo(() => {\n const ids = new Set(entries.map(entry => entry.id));\n if (selectedSessionId != null && selectedSessionId.length > 0) ids.add(selectedSessionId);\n return [...ids];\n }, [entries, selectedSessionId]);\n const { allows } = useResourcePermissions({\n resourceType: 'session',\n resourceIds: permissionResourceIds,\n });\n const canResume = allows(selectedSessionId, 'MANAGE');\n\n const listRequest = useMemo(\n () => ({\n order: 'desc' as const,\n limit: 20,\n ...(agentId == null || agentId.length === 0 ? {} : { agentId }),\n ...(startTimestamp == null ? {} : { startTimestamp }),\n ...(endTimestamp == null ? {} : { endTimestamp }),\n }),\n [agentId, endTimestamp, startTimestamp],\n );\n\n useEffect(() => {\n const requestId = ++listRequestIdRef.current;\n let cancelled = false;\n loadMoreInflightRef.current = false;\n setNextPageToken(undefined);\n setListLoading(true);\n setListLoadingMore(false);\n setListLoadMoreFailed(false);\n setListFailed(false);\n void sessionsServer\n .listSessions(listRequest)\n .then(page => {\n if (cancelled || listRequestIdRef.current !== requestId) return;\n setEntries(page.data);\n setNextPageToken(page.nextPageToken);\n })\n .catch(() => {\n if (cancelled || listRequestIdRef.current !== requestId) return;\n setEntries([]);\n setNextPageToken(undefined);\n setListFailed(true);\n })\n .finally(() => {\n if (!cancelled && listRequestIdRef.current === requestId) setListLoading(false);\n });\n\n return () => {\n cancelled = true;\n };\n }, [listRequest, sessionsServer]);\n\n const loadMore = useCallback(async () => {\n // A ref, not `listLoadingMore`: the observer can fire twice before a re-render.\n if (listLoading || nextPageToken == null || loadMoreInflightRef.current) return;\n const requestId = listRequestIdRef.current;\n loadMoreInflightRef.current = true;\n setListLoadingMore(true);\n setListLoadMoreFailed(false);\n try {\n const page = await sessionsServer.listSessions({ ...listRequest, pageToken: nextPageToken });\n if (listRequestIdRef.current !== requestId) return;\n setEntries(current => [...current, ...page.data]);\n setNextPageToken(page.nextPageToken);\n } catch {\n if (listRequestIdRef.current === requestId) setListLoadMoreFailed(true);\n } finally {\n if (listRequestIdRef.current === requestId) {\n loadMoreInflightRef.current = false;\n setListLoadingMore(false);\n }\n }\n }, [listLoading, listRequest, nextPageToken, sessionsServer]);\n\n // `entries.length` re-arms the observer: an already-intersecting sentinel emits no new entry.\n useEffect(() => {\n if (listLoading || nextPageToken == null || listEl == null || sentinelEl == null) return;\n\n const observer = new IntersectionObserver(\n observed => {\n if (observed.some(entry => entry.isIntersecting)) void loadMore();\n },\n { root: listEl, rootMargin: LOAD_MORE_ROOT_MARGIN },\n );\n observer.observe(sentinelEl);\n return () => observer.disconnect();\n }, [entries.length, listEl, listLoading, loadMore, nextPageToken, sentinelEl]);\n\n useEffect(() => {\n if (selectedSessionId == null || selectedSessionId.length === 0) {\n setDetailEvents(undefined);\n setDetailSession(undefined);\n setDetailFailed(false);\n setDetailLoading(false);\n return;\n }\n\n let cancelled = false;\n setDetailLoading(true);\n setDetailFailed(false);\n setDetailEvents(undefined);\n setDetailSession(undefined);\n\n void Promise.all([\n drainListPages({\n fetchPage: pageToken =>\n sessionsServer.listSessionEvents({\n sessionId: selectedSessionId,\n limit: 100,\n ...(pageToken == null ? {} : { pageToken }),\n }),\n }),\n chatServer.getSession({ sessionId: selectedSessionId }).catch(() => undefined),\n ])\n .then(([itemsNewestFirst, session]) => {\n if (cancelled) return;\n setDetailEvents([...itemsNewestFirst].reverse());\n setDetailSession(session);\n })\n .catch(() => {\n if (!cancelled) setDetailFailed(true);\n })\n .finally(() => {\n if (!cancelled) setDetailLoading(false);\n });\n\n return () => {\n cancelled = true;\n };\n }, [chatServer, selectedSessionId, sessionsServer]);\n\n const selectSession = (entry: SessionListEntry) => {\n const pinned = shareView === 'sessions' ? sessionTimeRangeFromCreatedAt(entry.createdAt) : null;\n updateShareSearch({\n sessionId: entry.id,\n ...(shareView === 'sessions'\n ? { view: 'sessions', ...(pinned == null ? {} : { timeRange: pinned }) }\n : { agentId: agentId ?? null, tab: 'sessions', view: null, timeRange: null }),\n });\n };\n\n const clearSelectedSession = () => {\n if (selectedSessionId == null) return;\n updateShareSearch({ sessionId: null });\n };\n\n const handleDelete = async (entry: SessionListEntry) => {\n if (!allows(entry.id, 'DELETE') || typeof chatServer.deleteSession !== 'function') return;\n setPendingDelete(null);\n try {\n await chatServer.deleteSession({ sessionId: entry.id });\n setEntries(current => current.filter(item => item.id !== entry.id));\n if (selectedSessionId === entry.id) {\n updateShareSearch({ sessionId: null });\n }\n } catch (caught) {\n toaster?.showError(caught);\n }\n };\n\n const selectedEntry = entries.find(entry => entry.id === selectedSessionId);\n const selectedTitle =\n detailSession != null\n ? sessionTitle(detailSession)\n : selectedEntry != null\n ? sessionTitle(selectedEntry)\n : (selectedSessionId ?? 'Untitled session');\n\n const resumeIsCreateAgent =\n detailSession != null\n ? sessionIsCreateAgent(detailSession)\n : selectedEntry != null\n ? sessionIsCreateAgent(selectedEntry)\n : false;\n const resumeIsMutable =\n detailSession != null ? detailSession.isMutable : selectedEntry != null ? entryIsMutable(selectedEntry) : true;\n const resumeLabel = resumeIsCreateAgent ? 'Resume Agent building' : 'Resume Chat';\n const resumeHref =\n selectedSessionId != null && routes != null\n ? buildSessionResumeHref({ sessionId: selectedSessionId, routes })\n : null;\n\n const handleResume = () => {\n if (!canResume || selectedSessionId == null || shell == null) return;\n const agentName = detailSession?.agentName ?? selectedEntry?.agentName;\n shell.openHistorySession({\n sessionId: selectedSessionId,\n isMutable: resumeIsMutable,\n isCreateAgent: resumeIsCreateAgent,\n ...(agentName != null && agentName.length > 0 ? { agentName } : {}),\n });\n };\n\n const resumeProps =\n resumeHref != null ? { resumeHref, resumeLabel } : shell != null ? { onResume: handleResume, resumeLabel } : {};\n\n // Full empty only when nothing is selected — keep the detail pane for deep-linked sessionIds\n // (filters/time range can empty the list while share state still points at a session).\n if (\n !listLoading &&\n !listFailed &&\n entries.length === 0 &&\n (selectedSessionId == null || selectedSessionId.length === 0)\n ) {\n return (\n <EmptyScreen\n title=\"No Sessions Found\"\n description=\"There are no sessions available at the moment.\"\n className=\"bg-primary-bg\"\n />\n );\n }\n\n return (\n <Group\n id=\"agent-sessions-split\"\n orientation=\"horizontal\"\n className=\"h-full min-h-0 w-full\"\n resizeTargetMinimumSize={{ coarse: 24, fine: 11 }}\n >\n <Panel id=\"agent-sessions-list\" defaultSize=\"35%\" minSize=\"20%\" maxSize=\"50%\">\n <aside className=\"flex h-full min-h-0 w-full flex-col bg-sidebar-bg\">\n <div ref={setListEl} className=\"scrollbar-none min-h-0 flex-1 overflow-y-auto\">\n {listLoading ? (\n <div className=\"space-y-2 p-3\" role=\"status\" aria-label=\"Loading sessions\">\n {['a', 'b', 'c'].map(key => (\n <Skeleton key={key} className=\"h-16 rounded-md\" />\n ))}\n </div>\n ) : listFailed ? (\n <p className=\"px-3 py-6 text-center text-xs text-text-secondary\">Sessions could not be loaded.</p>\n ) : (\n entries.map(entry => (\n <AgentSessionListRow\n key={entry.id}\n title={sessionTitle(entry)}\n agentName={entry.agentName ?? undefined}\n sourceType={entrySourceType(entry)}\n lastActivityAt={entry.lastActivityAt}\n metrics={entry.metrics}\n active={entry.id === selectedSessionId}\n onSelect={() => selectSession(entry)}\n {...(canDeleteSession\n ? {\n onRequestDelete: () => setPendingDelete(entry),\n canDelete: allows(entry.id, 'DELETE'),\n }\n : {})}\n />\n ))\n )}\n\n {nextPageToken != null && !listLoading && !listFailed ? (\n <div ref={setSentinelEl} className=\"px-3 py-2\">\n {listLoadingMore ? (\n <Skeleton className=\"h-16 rounded-md\" role=\"status\" aria-label=\"Loading more sessions\" />\n ) : listLoadMoreFailed ? (\n <button\n type=\"button\"\n className=\"h-8 w-full rounded-md border border-border text-xs font-medium text-text-primary hover:bg-ghost-button-hover\"\n onClick={() => void loadMore()}\n >\n Retry loading sessions\n </button>\n ) : null}\n </div>\n ) : null}\n </div>\n </aside>\n </Panel>\n\n <Separator\n id=\"agent-sessions-resizer\"\n aria-label=\"Resize session list\"\n className=\"group/resizer relative z-10 w-0 cursor-col-resize focus-visible:outline-none\"\n >\n <div aria-hidden className=\"absolute inset-y-0 -left-1.25 w-2.75\" />\n <div aria-hidden className=\"absolute inset-y-0 left-0 w-px bg-border transition-colors\" />\n <div\n aria-hidden\n className={cn(\n 'absolute top-1/2 left-0 z-10 flex h-4 w-2 -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-xs shadow-sm transition-colors',\n 'bg-secondary-button-bg text-text-secondary',\n 'group-hover/resizer:bg-primary-button-bg group-hover/resizer:text-primary-button-text',\n 'group-active/resizer:bg-primary-button-bg group-active/resizer:text-primary-button-text',\n 'group-focus-visible/resizer:bg-primary-button-bg group-focus-visible/resizer:text-primary-button-text',\n )}\n >\n <Icon name=\"grip-vertical\" size={10} />\n </div>\n </Separator>\n\n <Panel id=\"agent-session-detail\" defaultSize=\"65%\" minSize=\"30%\">\n <section className=\"flex h-full min-w-0 flex-col bg-primary-bg\">\n {selectedSessionId == null ? (\n <div className=\"flex flex-1 items-center justify-center px-6 text-sm text-text-secondary\">\n Select a session to view details\n </div>\n ) : detailFailed ? (\n <div className=\"flex flex-1 items-center justify-center px-6 text-sm text-text-secondary\">\n Session details could not be loaded.\n </div>\n ) : (\n <>\n <AgentSessionDetailHeader\n title={selectedTitle}\n sessionId={selectedSessionId}\n agentId={agentId}\n createdAt={detailSession?.createdAt ?? selectedEntry?.createdAt}\n view={shareView}\n onClose={clearSelectedSession}\n canResume={canResume}\n {...resumeProps}\n />\n {detailLoading || detailEvents === undefined ? (\n <div className=\"flex flex-1 flex-col p-4\" role=\"status\" aria-label=\"Loading session details\">\n <Skeleton className=\"min-h-64 flex-1 rounded-lg\" />\n </div>\n ) : (\n <AgentSessionTimelineContainer\n sessionId={selectedSessionId}\n events={detailEvents}\n listMetrics={selectedEntry?.metrics}\n />\n )}\n </>\n )}\n </section>\n </Panel>\n\n {pendingDelete != null ? (\n <Dialog\n open\n onOpenChange={open => {\n if (!open) setPendingDelete(null);\n }}\n aria-label=\"Delete session\"\n className=\"max-w-md\"\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Delete session</DialogTitle>\n <p className=\"text-text-secondary text-sm\">\n “{sessionTitle(pendingDelete)}” will be permanently deleted. This cannot be undone.\n </p>\n </DialogHeader>\n </DialogContent>\n <DialogFooter>\n <Button.Secondary type=\"button\" onClick={() => setPendingDelete(null)}>\n Cancel\n </Button.Secondary>\n <Button.Destructive\n type=\"button\"\n disabled={!allows(pendingDelete.id, 'DELETE')}\n onClick={() => void handleDelete(pendingDelete)}\n >\n Delete\n </Button.Destructive>\n </DialogFooter>\n </Dialog>\n ) : null}\n </Group>\n );\n}\n\ndeclare module '../../theme/SlotsProvider.js' {\n interface AtomSlots {\n AgentSessions: ComponentType<AgentSessionsProps>;\n }\n}\n","import type { ListResult } from '../server/types.js';\n\n/** Drain token-paginated list endpoints until `nextPageToken` is exhausted. */\nexport async function drainListPages<T>({\n fetchPage,\n}: {\n fetchPage: (pageToken?: string) => Promise<ListResult<T>>;\n}): Promise<T[]> {\n const items: T[] = [];\n let pageToken: string | undefined;\n do {\n const page = await fetchPage(pageToken);\n items.push(...page.data);\n pageToken = page.nextPageToken;\n } while (pageToken != null && pageToken.length > 0);\n return items;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -7,20 +7,20 @@ import {
|
|
|
7
7
|
auiInputClass,
|
|
8
8
|
useMCPAuth,
|
|
9
9
|
useToasterOptional
|
|
10
|
-
} from "./chunk-
|
|
11
|
-
import "./chunk-
|
|
10
|
+
} from "./chunk-KZK2PQ4A.js";
|
|
11
|
+
import "./chunk-UN7WPTTK.js";
|
|
12
12
|
import {
|
|
13
13
|
Icon
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-KDCVFHPZ.js";
|
|
15
15
|
import {
|
|
16
16
|
getErrorMessage,
|
|
17
17
|
useCatalogServer
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-U7WONUMR.js";
|
|
19
19
|
import "./chunk-M6MHLVSO.js";
|
|
20
|
-
import "./chunk-
|
|
20
|
+
import "./chunk-WFIA627Q.js";
|
|
21
21
|
import {
|
|
22
22
|
cn
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-NXK4XW4U.js";
|
|
24
24
|
|
|
25
25
|
// src/containers/SettingsBuilder/ConnectorSettings.tsx
|
|
26
26
|
import { useCallback, useEffect as useEffect3, useMemo, useState as useState3 } from "react";
|
|
@@ -219,10 +219,12 @@ var AddMcpServerForm = ({ open, onOpenChange, onSubmit, connector, busy = false,
|
|
|
219
219
|
onChange: (event) => {
|
|
220
220
|
setApiKey(event.target.value);
|
|
221
221
|
},
|
|
222
|
-
placeholder: "Paste the
|
|
222
|
+
placeholder: "Bearer <Paste the token from the provider>",
|
|
223
|
+
"aria-describedby": "mcp-server-api-key-hint",
|
|
223
224
|
className: inputClassName
|
|
224
225
|
}
|
|
225
|
-
)
|
|
226
|
+
),
|
|
227
|
+
/* @__PURE__ */ jsx("p", { id: "mcp-server-api-key-hint", className: "mt-1.5 text-xs text-text-secondary", children: `This is the value for the "${headerName.trim() || "Authorization"}" header.` })
|
|
226
228
|
] }),
|
|
227
229
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
228
230
|
/* @__PURE__ */ jsxs("label", { htmlFor: "mcp-server-header-name", className: "mb-1.5 block text-sm font-medium text-text-primary", children: [
|
|
@@ -918,7 +920,7 @@ var ConnectorSettings = () => {
|
|
|
918
920
|
onChange: (event) => {
|
|
919
921
|
setApiKey(event.target.value);
|
|
920
922
|
},
|
|
921
|
-
placeholder: `Paste the token from ${connectorAwaitingKey?.name ?? "the provider"}
|
|
923
|
+
placeholder: `Bearer <Paste the token from ${connectorAwaitingKey?.name ?? "the provider"}>`,
|
|
922
924
|
autoFocus: true,
|
|
923
925
|
required: true,
|
|
924
926
|
className: auiInputClass("h-11")
|
|
@@ -958,4 +960,4 @@ var ConnectorSettings_default = ConnectorSettings;
|
|
|
958
960
|
export {
|
|
959
961
|
ConnectorSettings_default as default
|
|
960
962
|
};
|
|
961
|
-
//# sourceMappingURL=ConnectorSettings-
|
|
963
|
+
//# sourceMappingURL=ConnectorSettings-O4I24244.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/containers/SettingsBuilder/ConnectorSettings.tsx","../src/containers/SettingsBuilder/AddMcpServerForm.tsx","../src/containers/SettingsBuilder/authTypeLabels.ts","../src/containers/SettingsBuilder/ConnectorDetails.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useMemo, useState, type FormEvent } from 'react';\n\nimport { cn } from '@/atoms/lib/cn.js';\nimport { auiInputClass } from '@/atoms/lib/inputClasses.js';\nimport { Button } from '@/atoms/primitives/Button.js';\nimport { CatalogLogo } from '@/atoms/primitives/CatalogLogo.js';\nimport { CenteredModal } from '@/atoms/primitives/CenteredModal.js';\nimport SearchInput from '@/atoms/primitives/SearchInput.js';\nimport { Icon } from '@/icons/Icon.js';\nimport { useCatalogServer } from '@/server/ServerContext.js';\nimport type { ConnectorAuth, ConnectorBase, ConnectorCatalogEntry } from '@/server/types.js';\nimport { getErrorMessage } from '@/utils/getErrorMessage.js';\nimport { useToasterOptional } from '../ToasterContainer.js';\nimport AddMcpServerForm, { type AddMcpServerDraft } from './AddMcpServerForm.js';\nimport { AUTH_TYPE_LABELS } from './authTypeLabels.js';\nimport ConnectorDetails from './ConnectorDetails.js';\n\ntype ConnectorListItem =\n { connector: ConnectorBase; isConfigured: true } | { connector: ConnectorCatalogEntry; isConfigured: false };\n\ntype ConnectorsState = {\n ordered: ConnectorListItem[];\n authStatusById: Map<string, boolean>;\n};\n\nconst ConnectorSettings = () => {\n const { connectorCatalog } = useCatalogServer();\n const toaster = useToasterOptional();\n\n const [query, setQuery] = useState('');\n const [connectors, setConnectors] = useState<ConnectorsState>({\n ordered: [],\n authStatusById: new Map(),\n });\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [formError, setFormError] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n\n const [catalog, setCatalog] = useState<ConnectorCatalogEntry[]>([]);\n const [addMcpServerFormOpen, setAddMcpServerFormOpen] = useState(false);\n const [editingConnector, setEditingConnector] = useState<ConnectorBase | null>(null);\n const [connectorAwaitingKey, setConnectorAwaitingKey] = useState<ConnectorCatalogEntry | null>(null);\n const [selectedConnector, setSelectedConnector] = useState<ConnectorBase | null>(null);\n const [apiKey, setApiKey] = useState('');\n\n const connectorIconMap = useMemo(() => {\n return (catalog ?? []).reduce(\n (acc, entry) => {\n acc[entry.name] = entry.logo ?? '';\n return acc;\n },\n {} as Record<string, string>,\n );\n }, [catalog]);\n\n const refresh = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const [listed, available] = await Promise.all([\n connectorCatalog.listConnectors(),\n connectorCatalog.getConnectorCatalog(),\n ]);\n setCatalog(available);\n const configured = listed ?? [];\n const seenIds = new Set(configured.map(connector => connector.id));\n const ordered: ConnectorListItem[] = [\n ...configured.map<ConnectorListItem>(connector => ({ connector, isConfigured: true })),\n ...available\n .filter(connector => !seenIds.has(connector.id))\n .map<ConnectorListItem>(connector => ({ connector, isConfigured: false })),\n ];\n setConnectors({\n ordered,\n authStatusById: new Map(\n ordered.map(item => [item.connector.id, item.isConfigured ? item.connector.authenticated : false]),\n ),\n });\n setSelectedConnector(current => (current ? (listed.find(item => item.id === current.id) ?? null) : null));\n } catch (err) {\n setError(getErrorMessage(err, 'Failed to load connectors'));\n } finally {\n setLoading(false);\n }\n }, [connectorCatalog]);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n const normalizedQuery = query.trim().toLowerCase();\n\n const matchingConnectors = useMemo(() => {\n if (!normalizedQuery) return connectors.ordered;\n return connectors.ordered.filter(({ connector }) => {\n return (\n connector.name.toLowerCase().includes(normalizedQuery) ||\n (connector.description?.toLowerCase().includes(normalizedQuery) ?? false) ||\n connector.url.toLowerCase().includes(normalizedQuery)\n );\n });\n }, [connectors.ordered, normalizedQuery]);\n\n const matchingConnected = useMemo(() => {\n const result: ConnectorBase[] = [];\n for (const item of matchingConnectors) {\n if (item.isConfigured) {\n const authenticated = connectors.authStatusById.get(item.connector.id) ?? item.connector.authenticated;\n result.push(\n authenticated === item.connector.authenticated ? item.connector : { ...item.connector, authenticated },\n );\n }\n }\n return result;\n }, [connectors.authStatusById, matchingConnectors]);\n\n const availableConnectors = useMemo(() => {\n const result: ConnectorCatalogEntry[] = [];\n for (const item of matchingConnectors) {\n if (!item.isConfigured) result.push(item.connector);\n }\n return result;\n }, [matchingConnectors]);\n\n const runMutation = async (fn: () => Promise<void>, setMutationError = setError) => {\n setBusy(true);\n setError(null);\n try {\n await fn();\n await refresh();\n } catch (err) {\n setMutationError(getErrorMessage(err, 'Request failed'));\n throw err;\n } finally {\n setBusy(false);\n }\n };\n\n const closeApiKeyModal = () => {\n setConnectorAwaitingKey(null);\n setApiKey('');\n setFormError(null);\n };\n\n const createFromCatalog = async (entry: ConnectorCatalogEntry, authOverride?: ConnectorAuth) => {\n const auth: ConnectorAuth =\n authOverride ??\n (entry.auth.type === 'header'\n ? {\n type: 'header',\n ...(entry.auth.headerName ? { headerName: entry.auth.headerName } : {}),\n }\n : entry.auth.type === 'dcr'\n ? { type: 'dcr' }\n : { type: 'none' });\n await connectorCatalog.createConnector({\n name: entry.name,\n description: entry.description ?? entry.url,\n url: entry.url,\n auth,\n });\n };\n\n const handleConnect = (entry: ConnectorCatalogEntry) => {\n if (entry.auth.type === 'header') {\n setApiKey('');\n setFormError(null);\n setConnectorAwaitingKey(entry);\n return;\n }\n\n void runMutation(async () => {\n await createFromCatalog(entry);\n }).catch(() => {});\n };\n\n const handleApiKeySubmit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n if (!connectorAwaitingKey || !apiKey.trim()) return;\n\n const entry = connectorAwaitingKey;\n setFormError(null);\n void runMutation(async () => {\n const auth: ConnectorAuth = {\n type: 'header',\n apiKey: apiKey.trim(),\n ...(entry.auth.type === 'header' && entry.auth.headerName ? { headerName: entry.auth.headerName } : {}),\n };\n await createFromCatalog(entry, auth);\n closeApiKeyModal();\n setTimeout(() => {\n toaster?.showSuccess({\n title: `${entry.name} connected`,\n });\n }, 100);\n }, setFormError).catch(() => {});\n };\n\n const handleMcpServerSubmit = async (draft: AddMcpServerDraft) => {\n setFormError(null);\n await runMutation(async () => {\n if (editingConnector) {\n await connectorCatalog.updateConnector({ id: editingConnector.id, ...draft });\n } else {\n await connectorCatalog.createConnector({ ...draft });\n }\n }, setFormError);\n setTimeout(() => {\n toaster?.showSuccess({ title: `${draft.name} ${editingConnector ? 'updated' : 'added'}` });\n }, 0);\n };\n\n const handleDisconnect = (connector: ConnectorBase) => {\n void runMutation(async () => {\n await connectorCatalog.disconnectConnector({ id: connector.id });\n setSelectedConnector(null);\n }).catch(() => {});\n };\n\n const handleConnectorRefreshed = (refreshedConnector: ConnectorBase) => {\n setSelectedConnector(current => (current?.id === refreshedConnector.id ? refreshedConnector : current));\n setConnectors(current => {\n const authStatusById = new Map(current.authStatusById);\n authStatusById.set(refreshedConnector.id, refreshedConnector.authenticated);\n\n return {\n ordered: current.ordered.map(item =>\n item.isConfigured && item.connector.id === refreshedConnector.id\n ? { connector: refreshedConnector, isConfigured: true }\n : item,\n ),\n authStatusById,\n };\n });\n };\n\n const renderConnector = (connector: ConnectorBase, isConnected: boolean) => {\n const logoSrc = connectorIconMap[connector.name];\n const content = (\n <>\n <span\n className=\"flex size-9 shrink-0 items-center justify-center overflow-hidden rounded-lg border border-border bg-secondary-bg\"\n aria-hidden\n >\n {logoSrc ? (\n <CatalogLogo src={logoSrc} alt={connector.name} className=\"size-4.5\" />\n ) : (\n <Icon name=\"mcp-server\" className=\"size-4.5 text-text-primary\" />\n )}\n </span>\n\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <h5 className=\"truncate text-sm font-medium text-text-primary\">{connector.name}</h5>\n <div className=\"flex items-center gap-2\">\n <span\n className={cn(\n 'flex items-center gap-1.5 rounded-full border border-border bg-secondary-bg/40 px-2 py-0.5 text-xs font-medium',\n connector.authenticated ? 'text-success-bg' : 'text-text-primary',\n )}\n >\n <span\n className={cn(\n 'h-1.5 w-1.5 rounded-full',\n connector.authenticated ? 'bg-success-bg' : 'bg-primary-button-bg',\n )}\n ></span>\n {connector.authenticated ? 'Connected' : 'Added'}\n </span>\n </div>\n </div>\n <p className=\"mt-0.5 line-clamp-2 text-sm text-text-secondary sm:truncate\">{connector.description}</p>\n </div>\n </>\n );\n\n const rowClassName = 'flex min-h-16 w-full items-center gap-3 border-b border-border p-3 text-left last:border-b-0';\n\n if (isConnected) {\n return (\n <article\n key={connector.id}\n className={`${rowClassName} cursor-pointer transition-colors hover:bg-ghost-button-hover/60`}\n onClick={() => {\n setSelectedConnector(connector);\n }}\n >\n <div className=\"flex min-w-0 flex-1 items-center gap-3\">{content}</div>\n\n <div className=\"flex items-center gap-2\">\n <Button.Secondary\n size=\"small\"\n type=\"button\"\n disabled={busy}\n onClick={event => {\n event.stopPropagation();\n setFormError(null);\n setEditingConnector(connector);\n setAddMcpServerFormOpen(true);\n }}\n >\n <Icon name=\"pencil\" className=\"size-3\" />\n Edit\n </Button.Secondary>\n <Icon name=\"chevron-right\" className=\"size-4\" />\n </div>\n </article>\n );\n }\n\n return (\n <article key={connector.id} className={rowClassName}>\n {content}\n </article>\n );\n };\n\n const renderCatalogEntry = (entry: ConnectorCatalogEntry) => {\n const logoSrc = connectorIconMap[entry.name];\n return (\n <article\n key={entry.id}\n className=\"flex min-h-16 w-full items-center gap-3 border-b border-border p-3 text-left last:border-b-0\"\n >\n <span\n className=\"flex size-9 shrink-0 items-center justify-center overflow-hidden rounded-lg border border-border bg-secondary-bg\"\n aria-hidden\n >\n {logoSrc ? (\n <CatalogLogo src={logoSrc} alt={entry.name} className=\"size-4.5\" />\n ) : (\n <Icon name=\"mcp-server\" className=\"size-4.5 text-text-primary\" />\n )}\n </span>\n\n <div className=\"min-w-0 flex-1\">\n <h5 className=\"truncate text-sm font-medium text-text-primary\">{entry.name}</h5>\n <p className=\"mt-0.5 line-clamp-2 text-sm text-text-secondary sm:truncate\">\n {entry.description ?? entry.url}\n </p>\n </div>\n\n <div className=\"flex shrink-0 items-center gap-2\">\n <span className=\"hidden text-xs text-text-secondary sm:inline\">\n {AUTH_TYPE_LABELS[entry.auth.type] ?? AUTH_TYPE_LABELS.none}\n </span>\n <Button.Secondary\n size=\"small\"\n type=\"button\"\n disabled={busy}\n onClick={() => {\n handleConnect(entry);\n }}\n >\n {entry.auth.type === 'dcr' ? 'Add' : 'Connect'}\n </Button.Secondary>\n </div>\n </article>\n );\n };\n\n if (selectedConnector) {\n return (\n <>\n <ConnectorDetails\n connector={selectedConnector}\n busy={busy}\n onBack={() => {\n setSelectedConnector(null);\n }}\n onConnectorRefreshed={handleConnectorRefreshed}\n onEdit={() => {\n setFormError(null);\n setEditingConnector(selectedConnector);\n setAddMcpServerFormOpen(true);\n }}\n onDisconnect={() => {\n handleDisconnect(selectedConnector);\n }}\n />\n <AddMcpServerForm\n open={addMcpServerFormOpen}\n onOpenChange={open => {\n setAddMcpServerFormOpen(open);\n if (!open) {\n setEditingConnector(null);\n setFormError(null);\n }\n }}\n onSubmit={handleMcpServerSubmit}\n connector={editingConnector ?? undefined}\n busy={busy}\n error={formError}\n />\n </>\n );\n }\n\n const hasMatches = matchingConnected.length > 0 || availableConnectors.length > 0;\n\n return (\n <>\n <h3 className=\"text-xl font-semibold tracking-tight text-text-primary\">Connectors</h3>\n <p className=\"mt-1 text-sm text-text-secondary\">Connect tools your agents can use.</p>\n\n {error ? (\n <p className=\"mt-3 rounded-md border border-failure-bg/30 bg-failure-bg/10 px-3 py-2 text-sm text-failure-bg\">\n {error}\n </p>\n ) : null}\n\n <div className=\"mt-4 flex-1 overflow-y-hidden\">\n <div className=\"flex h-full flex-col gap-3\">\n <div className=\"flex gap-2\">\n <div className=\"flex-1\">\n <SearchInput query={query} setQuery={setQuery} placeholder=\"Search connectors\" />\n </div>\n <Button.Secondary\n type=\"button\"\n onClick={() => {\n setFormError(null);\n setEditingConnector(null);\n setAddMcpServerFormOpen(true);\n }}\n >\n <Icon name=\"plus\" size=\"1rem\" className=\"mr-1\" />\n Add MCP Server\n </Button.Secondary>\n </div>\n\n <div className=\"flex flex-1 flex-col gap-5 overflow-y-auto pb-1\">\n {loading ? <p className=\"py-8 text-center text-sm text-text-secondary\">Loading…</p> : null}\n\n {!loading && matchingConnected.length > 0 ? (\n <section aria-labelledby=\"connected-connectors-heading\">\n <h4\n id=\"connected-connectors-heading\"\n className=\"mb-2 text-[0.8125rem] font-semibold uppercase text-text-secondary\"\n >\n Configured · {matchingConnected.length}\n </h4>\n <div className=\"overflow-hidden rounded-xl border border-border bg-card-bg\">\n {matchingConnected.map(connector => renderConnector(connector, true))}\n </div>\n </section>\n ) : null}\n\n {!loading && availableConnectors.length > 0 ? (\n <section aria-labelledby=\"available-connectors-heading\">\n <h4\n id=\"available-connectors-heading\"\n className=\"mb-2 text-[0.8125rem] font-semibold uppercase text-text-secondary\"\n >\n Available · {availableConnectors.length}\n </h4>\n <div className=\"overflow-hidden rounded-xl border border-border bg-card-bg\">\n {availableConnectors.map(entry => renderCatalogEntry(entry))}\n </div>\n </section>\n ) : null}\n\n {!loading && !hasMatches ? (\n <div className=\"flex flex-1 items-center justify-center rounded-xl border border-dashed border-border p-8 text-center text-sm text-text-secondary\">\n {query.trim() ? `No connectors match “${query.trim()}”.` : 'No connectors yet.'}\n </div>\n ) : null}\n </div>\n\n <CenteredModal\n open={connectorAwaitingKey !== null}\n onOpenChange={open => {\n if (!open) closeApiKeyModal();\n }}\n title={`Connect ${connectorAwaitingKey?.name ?? 'connector'}`}\n description={connectorAwaitingKey?.url}\n contentSized\n className=\"md:max-w-xl\"\n >\n <form onSubmit={handleApiKeySubmit}>\n <div className=\"space-y-5 px-5 py-5\">\n <div className=\"flex items-center gap-3\">\n <span\n className=\"flex size-12 shrink-0 items-center justify-center overflow-hidden rounded-xl border border-border bg-secondary-bg\"\n aria-hidden\n >\n <Icon name=\"mcp-server\" className=\"size-6 text-text-primary\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"font-medium text-text-primary\">{connectorAwaitingKey?.name}</p>\n <p className=\"truncate text-sm text-text-secondary\">{connectorAwaitingKey?.description}</p>\n </div>\n </div>\n\n <div>\n <label\n htmlFor=\"connector-api-key\"\n className=\"mb-2 block text-xs font-semibold uppercase tracking-wide text-text-secondary\"\n >\n API key / token\n </label>\n <input\n id=\"connector-api-key\"\n type=\"password\"\n value={apiKey}\n onChange={event => {\n setApiKey(event.target.value);\n }}\n placeholder={`Bearer <Paste the token from ${connectorAwaitingKey?.name ?? 'the provider'}>`}\n autoFocus\n required\n className={auiInputClass('h-11')}\n />\n </div>\n {formError ? <p className=\"text-failure-bg text-sm\">{formError}</p> : null}\n </div>\n\n <footer className=\"flex justify-end gap-2 border-t border-border px-5 py-4\">\n <Button.Ghost type=\"button\" onClick={closeApiKeyModal} disabled={busy}>\n Cancel\n </Button.Ghost>\n <Button.Primary type=\"submit\" disabled={!apiKey.trim() || busy}>\n Connect\n </Button.Primary>\n </footer>\n </form>\n </CenteredModal>\n\n <AddMcpServerForm\n open={addMcpServerFormOpen}\n onOpenChange={open => {\n setAddMcpServerFormOpen(open);\n if (!open) {\n setEditingConnector(null);\n setFormError(null);\n }\n }}\n onSubmit={handleMcpServerSubmit}\n connector={editingConnector ?? undefined}\n busy={busy}\n error={formError}\n />\n </div>\n </div>\n </>\n );\n};\n\nexport default ConnectorSettings;\n","'use client';\n\nimport { useEffect, useState, type FormEvent } from 'react';\n\nimport { auiInputClass } from '../../atoms/lib/inputClasses.js';\nimport { Button } from '../../atoms/primitives/Button.js';\nimport { CenteredModal } from '../../atoms/primitives/CenteredModal.js';\nimport { Icon } from '../../icons/Icon.js';\nimport type { ConnectorAuth, ConnectorAuthType, ConnectorBase } from '../../server/types.js';\n\nexport type McpAuthType = ConnectorAuthType;\n\nexport type AddMcpServerDraft = {\n name: string;\n url: string;\n description: string;\n auth: ConnectorAuth;\n};\n\ntype AddMcpServerFormProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onSubmit: (draft: AddMcpServerDraft) => void | Promise<void>;\n connector?: ConnectorBase;\n busy?: boolean;\n error?: string | null;\n};\n\nconst AUTH_OPTIONS: Array<{ value: McpAuthType; label: string }> = [\n { value: 'none', label: 'None' },\n { value: 'header', label: 'API Key' },\n { value: 'dcr', label: 'OAuth' },\n];\n\nconst inputClassName = auiInputClass('h-11 shadow-sm');\n\nconst RequiredMark = () => (\n <span className=\"ml-0.5 text-failure-bg\" aria-hidden>\n *\n </span>\n);\n\nconst AddMcpServerForm = ({ open, onOpenChange, onSubmit, connector, busy = false, error }: AddMcpServerFormProps) => {\n const [name, setName] = useState('');\n const [url, setUrl] = useState('');\n const [description, setDescription] = useState('');\n const [authType, setAuthType] = useState<McpAuthType>('dcr');\n const [apiKey, setApiKey] = useState('');\n const [headerName, setHeaderName] = useState('');\n const isEditing = connector !== undefined;\n const nameInputClassName = auiInputClass(\n `h-11 shadow-sm ${isEditing ? 'cursor-not-allowed bg-secondary-bg/60 text-text-secondary opacity-40' : ''}`,\n );\n\n const resetForm = () => {\n setName('');\n setUrl('');\n setDescription('');\n setAuthType('dcr');\n setApiKey('');\n setHeaderName('');\n };\n\n useEffect(() => {\n if (!open) return;\n setName(connector?.name ?? '');\n setUrl(connector?.url ?? '');\n setDescription(connector?.description ?? '');\n setAuthType(connector?.auth.type ?? 'dcr');\n setApiKey('');\n setHeaderName(connector?.auth.type === 'header' ? (connector.auth.headerName ?? '') : '');\n }, [connector, open]);\n\n const handleOpenChange = (nextOpen: boolean) => {\n if (!nextOpen) resetForm();\n onOpenChange(nextOpen);\n };\n\n const hasApiKey = !!apiKey.trim() || connector?.auth.type === 'header';\n const isValid = !!name.trim() && !!description.trim() && !!url.trim() && (authType !== 'header' || hasApiKey);\n\n const handleSubmit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n if (!isValid || busy) return;\n\n const auth: ConnectorAuth =\n authType === 'header'\n ? {\n type: 'header',\n apiKey: apiKey.trim(),\n ...(headerName.trim() ? { headerName: headerName.trim() } : {}),\n }\n : { type: authType };\n\n try {\n await onSubmit({\n name: name.trim(),\n url: url.trim(),\n description: description.trim(),\n auth,\n });\n resetForm();\n onOpenChange(false);\n } catch {\n // Parent surfaces error; keep form open.\n }\n };\n\n return (\n <CenteredModal\n open={open}\n onOpenChange={handleOpenChange}\n title={isEditing ? 'Edit MCP server' : 'Add MCP server'}\n description={\n isEditing\n ? 'Update how this connector authenticates.'\n : 'Point at a remote MCP endpoint. It then behaves like any other connector.'\n }\n contentSized\n headerIcon={\n <span\n className=\"flex size-11 shrink-0 items-center justify-center rounded-lg border border-border bg-secondary-bg text-text-primary\"\n aria-hidden\n >\n <Icon name=\"mcp-server\" className=\"size-6\" />\n </span>\n }\n >\n <form className=\"flex flex-col overflow-y-auto p-5 md:p-6\" onSubmit={e => void handleSubmit(e)}>\n <div className=\"space-y-4\">\n <div>\n <label htmlFor=\"mcp-server-name\" className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n Name\n <RequiredMark />\n </label>\n <input\n id=\"mcp-server-name\"\n type=\"text\"\n required\n value={name}\n readOnly={isEditing}\n aria-disabled={isEditing}\n onChange={event => {\n setName(event.target.value);\n }}\n placeholder=\"analytics-postgres-mcp\"\n autoFocus={!isEditing}\n className={nameInputClassName}\n />\n </div>\n\n <div>\n <label htmlFor=\"mcp-server-description\" className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n Description\n <RequiredMark />\n </label>\n <textarea\n id=\"mcp-server-description\"\n value={description}\n onChange={event => {\n setDescription(event.target.value);\n }}\n placeholder=\"Query analytics from Postgres\"\n required\n rows={3}\n className={auiInputClass('resize-y py-2.5 shadow-sm')}\n />\n </div>\n\n <div>\n <label htmlFor=\"mcp-server-url\" className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n URL\n <RequiredMark />\n </label>\n <input\n id=\"mcp-server-url\"\n type=\"url\"\n required\n value={url}\n onChange={event => {\n setUrl(event.target.value);\n }}\n placeholder=\"https://mcp.example.com/mcp\"\n className={inputClassName}\n />\n </div>\n\n <fieldset>\n <legend className=\"mb-1.5 text-sm font-medium text-text-primary\">\n Auth type\n <RequiredMark />\n </legend>\n <div className=\"flex w-full flex-row rounded-md border border-border bg-secondary-bg/40 p-1\">\n {AUTH_OPTIONS.map(option => (\n <label\n key={option.value}\n className={`flex h-8 flex-1 cursor-pointer items-center justify-center rounded-sm text-sm font-medium transition-colors ${\n authType === option.value\n ? 'bg-dropdown-selected-item-bg text-dropdown-selected-item-text shadow-sm'\n : 'text-text-secondary hover:text-text-primary'\n }`}\n >\n <input\n type=\"radio\"\n name=\"mcp-auth-type\"\n value={option.value}\n checked={authType === option.value}\n onChange={() => {\n setAuthType(option.value);\n }}\n className=\"sr-only\"\n />\n {option.label}\n </label>\n ))}\n </div>\n </fieldset>\n\n {authType === 'dcr' ? (\n <div className=\"flex gap-1.5 bg-secondary-bg/40 p-2 rounded-md\">\n <Icon name=\"info\" className=\"size-3.5 mt-1 text-text-secondary\" />\n <div className=\"text-xs text-text-secondary leading-5.5\">\n Sign-in only — the server must support dynamic client registration. Manual OAuth (client ID / secret)\n isn't supported yet.\n </div>\n </div>\n ) : null}\n\n {authType === 'header' ? (\n <>\n <div>\n <label htmlFor=\"mcp-server-api-key\" className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n API key\n {connector?.auth.type === 'header' ? (\n <span className=\"font-normal text-text-secondary\"> (leave blank to keep current)</span>\n ) : (\n <RequiredMark />\n )}\n </label>\n <input\n id=\"mcp-server-api-key\"\n type=\"password\"\n required={connector?.auth.type !== 'header'}\n value={apiKey}\n onChange={event => {\n setApiKey(event.target.value);\n }}\n placeholder=\"Bearer <Paste the token from the provider>\"\n aria-describedby=\"mcp-server-api-key-hint\"\n className={inputClassName}\n />\n <p id=\"mcp-server-api-key-hint\" className=\"mt-1.5 text-xs text-text-secondary\">\n {`This is the value for the \"${headerName.trim() || 'Authorization'}\" header.`}\n </p>\n </div>\n\n <div>\n <label htmlFor=\"mcp-server-header-name\" className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n Header name <span className=\"font-normal text-text-secondary\">(optional)</span>\n </label>\n <input\n id=\"mcp-server-header-name\"\n type=\"text\"\n value={headerName}\n onChange={event => {\n setHeaderName(event.target.value);\n }}\n placeholder=\"Authorization\"\n className={inputClassName}\n />\n </div>\n </>\n ) : null}\n </div>\n\n <div className=\"mt-6 space-y-3\">\n {error ? <p className=\"text-failure-bg text-sm\">{error}</p> : null}\n <Button.Primary type=\"submit\" size=\"large\" disabled={!isValid || busy} className=\"w-full shrink-0\">\n {isEditing ? 'Save' : 'Add'}\n </Button.Primary>\n </div>\n </form>\n </CenteredModal>\n );\n};\n\nexport default AddMcpServerForm;\n","/** Display labels for connector auth types (catalog + details). */\nexport const AUTH_TYPE_LABELS: Record<string, string> = {\n dcr: 'OAuth2',\n header: 'API Key',\n none: 'No Auth',\n};\n","'use client';\n\nimport { useEffect, useLayoutEffect, useRef, useState } from 'react';\n\nimport { cn } from '../../atoms/lib/cn.js';\nimport { Button } from '../../atoms/primitives/Button.js';\nimport { useMCPAuth } from '../../hooks/useMcpAuth.js';\nimport { Icon } from '../../icons/Icon.js';\nimport { useCatalogServer } from '../../server/ServerContext.js';\nimport type { ConnectorBase, ToolBase } from '../../server/types.js';\nimport { getErrorMessage } from '../../utils/getErrorMessage.js';\nimport { AUTH_TYPE_LABELS } from './authTypeLabels.js';\n\ntype ConnectorDetailsProps = {\n connector: ConnectorBase;\n onBack: () => void;\n onConnectorRefreshed: (connector: ConnectorBase) => void;\n onEdit: () => void;\n onDisconnect: () => void;\n busy?: boolean;\n};\n\n/** One-line clamp with animated expand; toggle only when content actually overflows. */\nfunction ExpandableDescription({ text }: { text: string }) {\n const contentRef = useRef<HTMLParagraphElement>(null);\n const [expanded, setExpanded] = useState(false);\n const [canExpand, setCanExpand] = useState(false);\n const [maxHeight, setMaxHeight] = useState(16);\n\n useLayoutEffect(() => {\n setExpanded(false);\n setMaxHeight(16);\n }, [text]);\n\n useLayoutEffect(() => {\n const el = contentRef.current;\n if (!el) return;\n\n if (!expanded) {\n setMaxHeight(16);\n setCanExpand(el.scrollWidth > el.clientWidth + 1);\n return;\n }\n\n // Keep collapsed height for one frame (wrap enabled), then grow so max-height can transition.\n setMaxHeight(16);\n const frame = requestAnimationFrame(() => {\n setMaxHeight(el.scrollHeight);\n });\n return () => cancelAnimationFrame(frame);\n }, [text, expanded]);\n\n if (!text) return null;\n\n return (\n <div className=\"relative min-w-0\">\n <p\n ref={contentRef}\n style={{ maxHeight }}\n className={cn(\n 'mt-0.5 overflow-hidden font-mono text-xs leading-4 text-text-secondary transition-[max-height] duration-300 ease-in-out',\n !expanded && 'whitespace-nowrap',\n !expanded && canExpand && 'pr-[5.75rem]',\n )}\n >\n {text}\n {expanded && canExpand ? (\n <>\n {' '}\n <button\n type=\"button\"\n className=\"cursor-pointer font-mono text-xs font-medium text-text-primary/80 hover:text-text-primary focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-focus-ring\"\n aria-expanded\n onClick={() => setExpanded(false)}\n >\n Show less\n </button>\n </>\n ) : null}\n </p>\n {!expanded && canExpand ? (\n <button\n type=\"button\"\n className=\"absolute top-0.5 right-0 cursor-pointer bg-card-bg pl-1.5 font-mono text-xs font-medium leading-4 text-text-primary/80 hover:text-text-primary focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-focus-ring\"\n aria-expanded={false}\n onClick={() => setExpanded(true)}\n >\n <span aria-hidden className=\"text-text-secondary\">\n …\n </span>\n <span className=\"ml-1\">Read more</span>\n </button>\n ) : null}\n </div>\n );\n}\n\nconst ConnectorDetails = ({\n connector,\n onBack,\n onConnectorRefreshed,\n onEdit,\n onDisconnect,\n busy = false,\n}: ConnectorDetailsProps) => {\n const { connectorCatalog } = useCatalogServer();\n const { handleAuthorize, isOAuthLoading } = useMCPAuth();\n const [tools, setTools] = useState<ToolBase[]>([]);\n const [toolsLoading, setToolsLoading] = useState(true);\n const [toolsError, setToolsError] = useState<string | null>(null);\n const [refreshingAfterAuth, setRefreshingAfterAuth] = useState(false);\n\n useEffect(() => {\n let cancelled = false;\n setTools([]);\n setToolsError(null);\n setToolsLoading(true);\n\n void connectorCatalog\n .getToolsByConnectorId({ id: connector.id })\n .then(result => {\n if (!cancelled) setTools(result);\n })\n .catch((err: unknown) => {\n if (!cancelled) {\n setToolsError(getErrorMessage(err, 'Failed to load connector tools'));\n }\n })\n .finally(() => {\n if (!cancelled) setToolsLoading(false);\n });\n\n return () => {\n cancelled = true;\n };\n }, [connector.authenticated, connector.id, connectorCatalog]);\n\n const refreshAfterAuthentication = async () => {\n setRefreshingAfterAuth(true);\n setToolsError(null);\n\n try {\n const refreshedConnector = await connectorCatalog.getConnector({ id: connector.id });\n onConnectorRefreshed(refreshedConnector);\n } catch (err: unknown) {\n setToolsError(getErrorMessage(err, 'Failed to refresh connector details'));\n } finally {\n setRefreshingAfterAuth(false);\n }\n };\n\n const connecting = isOAuthLoading || refreshingAfterAuth;\n\n return (\n <div className=\"flex h-full flex-col overflow-hidden\">\n <button\n type=\"button\"\n onClick={onBack}\n className=\"mb-3 inline-flex w-fit items-center gap-1 rounded-md py-1 pr-2 text-sm text-text-secondary hover:text-text-primary focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-focus-ring\"\n >\n <Icon name=\"chevron-left\" className=\"size-3.5\" />\n Connectors\n </button>\n\n <div className=\"flex flex-1 flex-col overflow-y-auto pb-1\">\n <header className=\"flex items-start gap-3\">\n <span\n className=\"flex size-10 shrink-0 items-center justify-center overflow-hidden rounded-lg border border-border bg-secondary-bg\"\n aria-hidden\n >\n <Icon name=\"mcp-server\" className=\"size-5 text-text-primary\" />\n </span>\n\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <h4 className=\"text-lg font-semibold text-text-primary\">{connector.name}</h4>\n <span className=\"inline-flex items-center rounded-full border border-border bg-secondary-bg/40 px-2 py-0.5 text-xs font-medium text-text-secondary\">\n {AUTH_TYPE_LABELS[connector.auth.type] ?? AUTH_TYPE_LABELS.none}\n </span>\n <span\n className={cn(\n 'flex items-center gap-1.5 rounded-full border border-border bg-secondary-bg/40 px-2 py-0.5 text-xs font-medium',\n connector.authenticated ? 'text-success-bg' : 'text-text-primary',\n )}\n >\n <span\n className={cn(\n 'h-1.5 w-1.5 rounded-full',\n connector.authenticated ? 'bg-success-bg' : 'bg-primary-button-bg',\n )}\n ></span>\n {connector.authenticated ? 'Connected' : 'Not authenticated'}\n </span>\n </div>\n <div className=\"flex flex-wrap items-center gap-x-2 gap-y-1 text-sm\">\n <span className=\"text-text-secondary\">{connector.description}</span>\n </div>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Button.Secondary size=\"small\" type=\"button\" disabled={busy} onClick={onEdit}>\n <Icon name=\"pencil\" className=\"size-3\" />\n Edit\n </Button.Secondary>\n {connector.auth.type === 'dcr' && !connector.authenticated ? (\n <Button.Secondary\n size=\"small\"\n type=\"button\"\n disabled={busy || connecting}\n onClick={() => {\n void handleAuthorize(connector.id, isSuccess => {\n if (isSuccess) void refreshAfterAuthentication();\n });\n }}\n >\n {connecting ? 'Connecting…' : 'Connect'}\n </Button.Secondary>\n ) : connector.auth.type === 'dcr' && !connector.requiresAuth ? (\n <Button.Secondary size=\"small\" type=\"button\" disabled={busy} onClick={onDisconnect}>\n Disconnect\n </Button.Secondary>\n ) : null}\n </div>\n </header>\n\n <section className=\"mt-6\" aria-labelledby=\"connector-tools-heading\">\n {toolsLoading ? (\n <div className=\"rounded-xl border border-dashed border-border p-6 text-center text-sm text-text-secondary\">\n Loading tools…\n </div>\n ) : toolsError ? (\n <div className=\"rounded-xl border border-failure-bg/30 bg-failure-bg/10 p-6 text-center text-sm text-failure-bg\">\n {toolsError}\n {connector.auth.type === 'dcr' && !connector.authenticated && (\n <div className=\"font-bold mt-1\">Click Connect and authenticate successfully to view tools.</div>\n )}\n </div>\n ) : tools.length > 0 ? (\n <>\n <h5 id=\"connector-tools-heading\" className=\"mb-2 text-[0.8125rem] font-semibold text-text-primary\">\n Tools <span className=\"font-normal text-text-secondary\">· {tools.length}</span>\n </h5>\n <div className=\"overflow-hidden rounded-xl border border-border bg-card-bg\">\n {tools.map(tool => (\n <article\n key={tool.id}\n className=\"flex min-h-12 items-start gap-3 border-b border-border px-3 py-2 last:border-b-0\"\n >\n <div className=\"min-w-0 flex-1\">\n <h6 className=\"text-sm font-medium text-text-primary\">{tool.name}</h6>\n <ExpandableDescription text={tool.description} />\n </div>\n </article>\n ))}\n </div>\n </>\n ) : (\n <div className=\"rounded-xl border border-dashed border-border p-6 text-center text-sm text-text-secondary\">\n No tools reported for this connector.\n </div>\n )}\n </section>\n </div>\n </div>\n );\n};\n\nexport default ConnectorDetails;\n"],"mappings":"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","names":["useEffect","useState","useEffect","useState","Fragment","jsx","jsxs","useState","useEffect","Fragment","jsx","jsxs","useState","useEffect"]}
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import {
|
|
3
3
|
StackChatPanel
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-MB7Z5FPI.js";
|
|
5
|
+
import "./chunk-7VWUB5OV.js";
|
|
6
|
+
import "./chunk-VTOW2UIX.js";
|
|
7
7
|
import "./chunk-BSIPI3KV.js";
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-KZK2PQ4A.js";
|
|
9
|
+
import "./chunk-UN7WPTTK.js";
|
|
10
10
|
import {
|
|
11
11
|
CompactLayoutProvider
|
|
12
|
-
} from "./chunk-
|
|
13
|
-
import "./chunk-
|
|
12
|
+
} from "./chunk-KDCVFHPZ.js";
|
|
13
|
+
import "./chunk-U7WONUMR.js";
|
|
14
14
|
import "./chunk-M6MHLVSO.js";
|
|
15
|
-
import "./chunk-
|
|
15
|
+
import "./chunk-WFIA627Q.js";
|
|
16
16
|
import {
|
|
17
17
|
cn
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-NXK4XW4U.js";
|
|
19
19
|
|
|
20
20
|
// src/layouts/DockLayout.tsx
|
|
21
21
|
import { jsx } from "react/jsx-runtime";
|
|
@@ -35,4 +35,4 @@ function DockLayout({ className }) {
|
|
|
35
35
|
export {
|
|
36
36
|
DockLayout
|
|
37
37
|
};
|
|
38
|
-
//# sourceMappingURL=DockLayout-
|
|
38
|
+
//# sourceMappingURL=DockLayout-JMBZVMGB.js.map
|