@opengeni/react 7.6.1-canary.37062299158001 → 7.6.1
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/README.md +2 -19
- package/dist/{browser-viewer-63TXMINB.js → browser-viewer-5X47I6T2.js} +5 -6
- package/dist/{chunk-TKB4SB44.js → chunk-45GE35O7.js} +2 -10
- package/dist/chunk-45GE35O7.js.map +1 -0
- package/dist/{chunk-DOJWJQ3F.js → chunk-5EXGU7UF.js} +3 -3
- package/dist/{chunk-YN7I3STW.js → chunk-6NEZPF53.js} +32 -153
- package/dist/chunk-6NEZPF53.js.map +1 -0
- package/dist/{chunk-I7IWRQLN.js → chunk-BI57CQUV.js} +2 -2
- package/dist/{chunk-6ZSWSH4I.js → chunk-CHPKSLPN.js} +1 -3
- package/dist/chunk-CHPKSLPN.js.map +1 -0
- package/dist/{chunk-Q5QBEZIQ.js → chunk-DV2DBNPQ.js} +29 -48
- package/dist/chunk-DV2DBNPQ.js.map +1 -0
- package/dist/{chunk-RDKBXMWX.js → chunk-FGBCYQOT.js} +74 -120
- package/dist/chunk-FGBCYQOT.js.map +1 -0
- package/dist/{chunk-AAG4R3QN.js → chunk-KGENSZKS.js} +3 -4
- package/dist/chunk-KGENSZKS.js.map +1 -0
- package/dist/{chunk-YQEAA6LT.js → chunk-KZ73RL76.js} +3 -7
- package/dist/chunk-KZ73RL76.js.map +1 -0
- package/dist/{chunk-LFXYGZWK.js → chunk-LZ3KHA55.js} +60 -169
- package/dist/chunk-LZ3KHA55.js.map +1 -0
- package/dist/{chunk-2QUSQVF2.js → chunk-UINDK6C3.js} +3 -3
- package/dist/{chunk-UTRTG6LH.js → chunk-UJRYEWZI.js} +8 -48
- package/dist/chunk-UJRYEWZI.js.map +1 -0
- package/dist/{chunk-XOAMRDDK.js → chunk-VGIKFIO2.js} +3 -6
- package/dist/chunk-VGIKFIO2.js.map +1 -0
- package/dist/{chunk-ELCE5SXV.js → chunk-WZ55DVGK.js} +4 -8
- package/dist/chunk-WZ55DVGK.js.map +1 -0
- package/dist/{chunk-IQUCRAT7.js → chunk-XA6R7DJQ.js} +3 -3
- package/dist/{chunk-TOAH2BKA.js → chunk-YCGBREUV.js} +2 -6
- package/dist/{chunk-TOAH2BKA.js.map → chunk-YCGBREUV.js.map} +1 -1
- package/dist/{chunk-HNFCAQ5R.js → chunk-YRYF2GLG.js} +31 -39
- package/dist/chunk-YRYF2GLG.js.map +1 -0
- package/dist/{chunk-GISEVGS6.js → chunk-YSMMDOOE.js} +2 -10
- package/dist/chunk-YSMMDOOE.js.map +1 -0
- package/dist/{chunk-CWWKTNKK.js → chunk-Z3DISEQN.js} +18 -35
- package/dist/chunk-Z3DISEQN.js.map +1 -0
- package/dist/client.d.ts +1 -4
- package/dist/commands/types.d.ts +0 -2
- package/dist/components/approval-surface.d.ts +0 -15
- package/dist/composer.js +7 -8
- package/dist/{computer-viewer-X2MBRZY4.js → computer-viewer-7GF35SNY.js} +4 -5
- package/dist/connect.js +3 -3
- package/dist/hooks/use-browser-session.d.ts +0 -4
- package/dist/hooks/use-composer.d.ts +0 -2
- package/dist/hooks/use-computer-session.d.ts +0 -2
- package/dist/hooks/use-file-attachments.d.ts +0 -2
- package/dist/hooks/use-session-events.d.ts +1 -1
- package/dist/hooks/use-workspace-sessions.d.ts +5 -15
- package/dist/index.d.ts +2 -2
- package/dist/index.js +21 -28
- package/dist/index.js.map +1 -1
- package/dist/interaction.d.ts +1 -1
- package/dist/interaction.js +5 -6
- package/dist/interaction.js.map +1 -1
- package/dist/{latest-question-CNEZ5KAN.js → latest-question-3BJGKQQ6.js} +3 -3
- package/dist/lib/format.d.ts +3 -27
- package/dist/lib/interaction-errors.d.ts +0 -3
- package/dist/machines.js +4 -5
- package/dist/{model-policy-picker-menu-JSA64TNN.js → model-policy-picker-menu-PUTA5JOB.js} +4 -4
- package/dist/model-policy.js +1 -1
- package/dist/provider.d.ts +1 -5
- package/dist/{queue-surface-implementation-HENWYFWA.js → queue-surface-implementation-2CAQAIHM.js} +2 -3
- package/dist/{queue-surface-implementation-HENWYFWA.js.map → queue-surface-implementation-2CAQAIHM.js.map} +1 -1
- package/dist/realtime.js +2 -2
- package/dist/{sandbox-files-BBC47SLD.js → sandbox-files-AEJTWGT4.js} +3 -4
- package/dist/session-ui.d.ts +1 -1
- package/dist/session-ui.js +12 -13
- package/dist/session-ui.js.map +1 -1
- package/dist/session.js +6 -7
- package/dist/usage.js +1 -2
- package/dist/usage.js.map +1 -1
- package/package.json +3 -3
- package/src/client.ts +1 -5
- package/src/commands/registry.ts +15 -18
- package/src/commands/types.ts +0 -2
- package/src/components/approval-surface.tsx +42 -166
- package/src/components/browser-viewer.tsx +9 -38
- package/src/components/composer.tsx +2 -9
- package/src/components/computer-viewer.tsx +30 -160
- package/src/components/generated-video-player.tsx +2 -4
- package/src/components/human-input-form.tsx +5 -18
- package/src/components/message-timeline.tsx +2 -4
- package/src/components/open-geni-chat.tsx +4 -11
- package/src/components/queue-surface-state.tsx +1 -3
- package/src/components/session-chrome.tsx +2 -5
- package/src/components/session-commands-panel.tsx +1 -3
- package/src/components/session-conversation.tsx +2 -4
- package/src/components/session-list.tsx +5 -7
- package/src/components/session-mcp-capability-card.tsx +1 -11
- package/src/hooks/internal.ts +2 -3
- package/src/hooks/use-browser-session.ts +79 -115
- package/src/hooks/use-composer.ts +31 -70
- package/src/hooks/use-computer-session.ts +6 -57
- package/src/hooks/use-file-attachments.ts +3 -16
- package/src/hooks/use-goal.ts +1 -2
- package/src/hooks/use-session-capabilities.ts +2 -3
- package/src/hooks/use-session-events.ts +8 -15
- package/src/hooks/use-slash-commands.ts +11 -6
- package/src/hooks/use-turn-queue.ts +1 -2
- package/src/hooks/use-workspace-sessions.ts +7 -40
- package/src/index.ts +2 -7
- package/src/interaction.ts +0 -1
- package/src/lib/format.ts +9 -73
- package/src/lib/interaction-errors.ts +0 -15
- package/src/model-policy.ts +0 -5
- package/src/provider.tsx +4 -12
- package/src/session-ui.ts +1 -1
- package/src/timeline/projection.ts +1 -12
- package/styles/compiled.css +0 -14
- package/dist/chunk-6ZSWSH4I.js.map +0 -1
- package/dist/chunk-AAG4R3QN.js.map +0 -1
- package/dist/chunk-CWWKTNKK.js.map +0 -1
- package/dist/chunk-ELCE5SXV.js.map +0 -1
- package/dist/chunk-GISEVGS6.js.map +0 -1
- package/dist/chunk-HNFCAQ5R.js.map +0 -1
- package/dist/chunk-LFXYGZWK.js.map +0 -1
- package/dist/chunk-Q5QBEZIQ.js.map +0 -1
- package/dist/chunk-RDKBXMWX.js.map +0 -1
- package/dist/chunk-TKB4SB44.js.map +0 -1
- package/dist/chunk-UGLEYEMP.js +0 -33
- package/dist/chunk-UGLEYEMP.js.map +0 -1
- package/dist/chunk-UTRTG6LH.js.map +0 -1
- package/dist/chunk-XOAMRDDK.js.map +0 -1
- package/dist/chunk-YN7I3STW.js.map +0 -1
- package/dist/chunk-YQEAA6LT.js.map +0 -1
- package/dist/lib/error-message.d.ts +0 -7
- package/src/lib/error-message.ts +0 -37
- /package/dist/{browser-viewer-63TXMINB.js.map → browser-viewer-5X47I6T2.js.map} +0 -0
- /package/dist/{chunk-DOJWJQ3F.js.map → chunk-5EXGU7UF.js.map} +0 -0
- /package/dist/{chunk-I7IWRQLN.js.map → chunk-BI57CQUV.js.map} +0 -0
- /package/dist/{chunk-2QUSQVF2.js.map → chunk-UINDK6C3.js.map} +0 -0
- /package/dist/{chunk-IQUCRAT7.js.map → chunk-XA6R7DJQ.js.map} +0 -0
- /package/dist/{computer-viewer-X2MBRZY4.js.map → computer-viewer-7GF35SNY.js.map} +0 -0
- /package/dist/{latest-question-CNEZ5KAN.js.map → latest-question-3BJGKQQ6.js.map} +0 -0
- /package/dist/{model-policy-picker-menu-JSA64TNN.js.map → model-policy-picker-menu-PUTA5JOB.js.map} +0 -0
- /package/dist/{sandbox-files-BBC47SLD.js.map → sandbox-files-AEJTWGT4.js.map} +0 -0
package/README.md
CHANGED
|
@@ -605,11 +605,6 @@ explicit activation brings a tab forward. The override ends when its controller
|
|
|
605
605
|
detaches. Native **App controls** also work in the background where supported.
|
|
606
606
|
Physical desktop mouse/keyboard input shares the foreground seat; **Bring to front**
|
|
607
607
|
makes that change explicit.
|
|
608
|
-
Computer frames fit the dock while preserving their proportions. Resizing or
|
|
609
|
-
reopening the dock refits the visible image without changing capture resolution
|
|
610
|
-
or the coordinates sent to the computer.
|
|
611
|
-
|
|
612
|
-
Desktop IME candidates and their selection keys stay local; only committed text is sent.
|
|
613
608
|
|
|
614
609
|
A managed browser's attachment authority error keeps a same-browser **Reconnect**
|
|
615
610
|
action available. It obtains a fresh server-authorized attachment without creating
|
|
@@ -656,12 +651,6 @@ returned ComputerSession must be the exact placement/window the browser uses.
|
|
|
656
651
|
`onOpenComputer` then changes the host layout to that resource—it must not open a
|
|
657
652
|
lookalike desktop. Closing either viewer never ends its durable resource.
|
|
658
653
|
|
|
659
|
-
`ComputerViewer` disables input when its control service is unavailable, even if
|
|
660
|
-
frames keep arriving. Reconnect refreshes the selected desktop's controls and
|
|
661
|
-
frames. App accessibility inspection failures leave independent live input
|
|
662
|
-
available; `useComputerSession().controlError` reports service loss separately
|
|
663
|
-
from the hook's general `error`.
|
|
664
|
-
|
|
665
654
|
If the chat's latest browser was lost or failed, the viewer names it and explains
|
|
666
655
|
why it is unavailable instead of showing the ordinary empty state. It offers the
|
|
667
656
|
existing new-browser controls without reopening the lost controller or selecting
|
|
@@ -785,8 +774,7 @@ state remains application-owned; durable draft and session state remain in
|
|
|
785
774
|
|
|
786
775
|
- `useSessionEvents(sessionId)` — loads a compact, bounded tail window by
|
|
787
776
|
default, then live-streams on the SDK's exactly-once/ordered event delivery.
|
|
788
|
-
Initial replay
|
|
789
|
-
recover a dense turn's boundary; `loadOlder` is capped at two such pages;
|
|
777
|
+
Initial replay is capped at three 5000-row raw pages and `loadOlder` at two;
|
|
790
778
|
timeline group density is only an early stop. It returns the raw windowed
|
|
791
779
|
`events`, projected `timeline`, latest `sessionStatus`, connection state, and
|
|
792
780
|
older-history controls (`hasOlder`, `loadingOlder`, `loadOlder`). Pass
|
|
@@ -801,8 +789,6 @@ state remains application-owned; durable draft and session state remain in
|
|
|
801
789
|
window.
|
|
802
790
|
- Browser retention limits are exported as `SESSION_EVENT_BROWSER_MAX_BYTES`
|
|
803
791
|
and `SESSION_EVENT_BROWSER_MAX_COUNT`; they do not change fetch page sizes.
|
|
804
|
-
The live working set is at most 16 MiB or 20,000 events. One event larger than
|
|
805
|
-
the byte target stays complete in a window of its own.
|
|
806
792
|
Live appends reuse the retained window's byte total, measuring only incoming
|
|
807
793
|
and evicted events. History still pages when either retention limit is reached.
|
|
808
794
|
- Newer history uses `hasNewer`, `loadingNewer`, and `loadNewer`. A failed
|
|
@@ -859,10 +845,7 @@ state remains application-owned; durable draft and session state remain in
|
|
|
859
845
|
- `useSlashCommands(...)` — the slash-command palette state (registry + parsing +
|
|
860
846
|
handlers) behind `CommandPalette`.
|
|
861
847
|
- `useWorkspaceSessions()` / `useScheduledTasks()` — workspace lists for
|
|
862
|
-
fleet/manager views (optional polling).
|
|
863
|
-
"summary" })` returns compact list entries; omit the option for full sessions.
|
|
864
|
-
Scripted clients can omit the summary method and the hook projects full pages
|
|
865
|
-
locally while retaining cancellation and causal read revisions.
|
|
848
|
+
fleet/manager views (optional polling).
|
|
866
849
|
- `useVariableSets()` — workspace variable sets with metadata-only generic
|
|
867
850
|
reads and create/update/remove/set/delete operations. Dedicated permissioned
|
|
868
851
|
exact-value reveal is part of the held React/UI train rather than an
|
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
BrowserViewer
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-FGBCYQOT.js";
|
|
4
|
+
import "./chunk-YSMMDOOE.js";
|
|
5
5
|
import "./chunk-JVYQRRC4.js";
|
|
6
6
|
import "./chunk-RHREZ7BO.js";
|
|
7
|
-
import "./chunk-
|
|
7
|
+
import "./chunk-UJRYEWZI.js";
|
|
8
8
|
import "./chunk-5J4FOW6Q.js";
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-UGLEYEMP.js";
|
|
9
|
+
import "./chunk-KZ73RL76.js";
|
|
11
10
|
import "./chunk-NEXLLTP4.js";
|
|
12
11
|
import "./chunk-22KP6LR5.js";
|
|
13
12
|
export {
|
|
14
13
|
BrowserViewer
|
|
15
14
|
};
|
|
16
|
-
//# sourceMappingURL=browser-viewer-
|
|
15
|
+
//# sourceMappingURL=browser-viewer-5X47I6T2.js.map
|
|
@@ -307,15 +307,7 @@ function ScopedCard({
|
|
|
307
307
|
]);
|
|
308
308
|
if (!invocation || invocation.signal.aborted || lifetime.current !== invocation || !active())
|
|
309
309
|
return null;
|
|
310
|
-
|
|
311
|
-
if (resolved?.kind === "mcp" && !resolved.enabled && !resolved.authKind) {
|
|
312
|
-
const endpoint = resolved.mcpUrl ?? resolved.endpointUrl;
|
|
313
|
-
if (endpoint) {
|
|
314
|
-
const inspected = await client.inspectMcpAuthentication(workspaceId, endpoint);
|
|
315
|
-
if (invocation.signal.aborted || lifetime.current !== invocation || !active()) return null;
|
|
316
|
-
if (inspected.kind === "oauth2") resolved = { ...resolved, authKind: "oauth2" };
|
|
317
|
-
}
|
|
318
|
-
}
|
|
310
|
+
const resolved = catalog.items.find((entry) => entry.id === capabilityId);
|
|
319
311
|
if (!resolved || resolved.kind !== "mcp" || resolved.authKind !== "oauth2")
|
|
320
312
|
throw new Error(
|
|
321
313
|
"This recommendation is not an available OAuth MCP integration. Review the current connection catalog."
|
|
@@ -731,4 +723,4 @@ export {
|
|
|
731
723
|
SessionMcpCapabilityCard,
|
|
732
724
|
McpConnectionCard
|
|
733
725
|
};
|
|
734
|
-
//# sourceMappingURL=chunk-
|
|
726
|
+
//# sourceMappingURL=chunk-45GE35O7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/use-connect.ts","../src/session-capability-policy.ts","../src/components/session-capability-frame.tsx","../src/components/session-mcp-capability-card.tsx","../src/mcp-connection-status.ts"],"sourcesContent":["import type { ConnectController } from \"@opengeni/connect\";\nimport { useMemo, useSyncExternalStore } from \"react\";\n\n/** Internal consumers import the hook directly so setup surfaces stay lazy. */\nexport function useConnect(controller: ConnectController) {\n const snapshot = useSyncExternalStore(\n controller.subscribe,\n controller.getSnapshot,\n controller.getSnapshot,\n );\n const actions = useMemo(\n () => ({\n begin: controller.begin.bind(controller),\n recover: controller.recover.bind(controller),\n refresh: controller.refresh.bind(controller),\n waitForAction: controller.waitForAction.bind(controller),\n advance: controller.advance.bind(controller),\n cancel: controller.cancel.bind(controller),\n }),\n [controller],\n );\n return useMemo(() => ({ ...snapshot, ...actions }), [snapshot, actions]);\n}\n","import type { FirstPartyMcpToolName, CapabilityCatalogItem } from \"@opengeni/sdk\";\nimport type { OpenGeniBrowserClient as OpenGeniClient } from \"@opengeni/sdk/browser\";\n\n/** Catalog tool discovery may be lazy; selecting the installed server does not\n * require its individual tool inventory to have been fetched. */\nexport function sessionCapabilityTools(item: CapabilityCatalogItem) {\n const serverId = item.kind === \"mcp\" ? item.runtime?.mcpServerId : undefined;\n return serverId && !item.tools.some((tool) => tool.kind === \"mcp\" && tool.id === serverId)\n ? [...item.tools, { kind: \"mcp\" as const, id: serverId }]\n : item.tools;\n}\n\n/** A connection never resets the human's existing tool selection. Default-mode\n * sessions discover newly enabled servers at admission; explicit/inherited\n * policies add only this reviewed capability, with the existing CAS fence. */\nexport async function attachSessionCapability(\n client: OpenGeniClient,\n workspaceId: string,\n sessionId: string,\n item: CapabilityCatalogItem,\n stillCurrent: () => boolean = () => true,\n): Promise<void> {\n const tools = sessionCapabilityTools(item);\n if (item.kind === \"skill\" || tools.length === 0) return;\n if (!stillCurrent()) throw new Error(\"Connection setup was interrupted.\");\n const session = await client.getSession(workspaceId, sessionId);\n if (!stillCurrent()) throw new Error(\"Connection setup was interrupted.\");\n // Session.tools includes mandatory runtime servers, which must never be\n // echoed into the human's explicit selection.\n let existing = session.tools.filter(\n (tool) => !session.effectiveToolPolicy?.mandatoryIds?.includes(tool.id),\n );\n if (session.toolPolicy.mode === \"workspace_default\") {\n const policy = session.effectiveToolPolicy;\n if (!policy || policy.idsTruncated)\n throw new Error(\n \"Connected, but the full session tool selection could not be read. Review the Tools picker before continuing.\",\n );\n // A workspace may choose a restricted default instead of all enabled servers.\n // Preserve that exact selection if this connection needs an explicit addition.\n // selectedIds contains only explicit additions, and is normally empty for\n // automatic selection. Compare against the resolved defaults instead.\n existing = policy.effectiveIds\n .filter((id) => !policy.mandatoryIds.includes(id))\n .map((id) => ({ kind: \"mcp\" as const, id }));\n }\n const additions = tools.filter(\n (tool) => !existing.some((current) => current.kind === tool.kind && current.id === tool.id),\n );\n const recommended = Array.isArray(item.metadata?.firstPartyMcpTools)\n ? (item.metadata.firstPartyMcpTools.filter(\n (name): name is string => typeof name === \"string\",\n ) as FirstPartyMcpToolName[])\n : [];\n const firstParty = [...new Set([...session.firstPartyMcpTools, ...recommended])];\n if (additions.length === 0 && firstParty.length === session.firstPartyMcpTools.length) return;\n await client.updateSessionToolPolicy(workspaceId, sessionId, {\n mode: \"explicit\",\n tools: [...existing, ...additions],\n firstPartyMcpTools: firstParty,\n expectedVersion: session.toolPolicyVersion,\n });\n}\n\n/** Native OAuth callbacks have already saved the provider connection. Finish\n * the separate, version-fenced session tool selection before reporting success. */\nexport async function completeSessionCapabilityOAuth(\n client: OpenGeniClient,\n workspaceId: string,\n sessionId: string,\n capabilityId: string | null,\n): Promise<void> {\n if (!capabilityId)\n throw new Error(\n \"The authorized integration could not be identified. Review its connection card to finish setup.\",\n );\n const connected = (await client.listCapabilities(workspaceId)).items.find(\n (item) => item.id === capabilityId,\n );\n if (!connected?.enabled)\n throw new Error(\"The connection was authorized, but enabling its tools could not be verified.\");\n await attachSessionCapability(client, workspaceId, sessionId, connected);\n}\n","import { CheckIcon, ShieldCheckIcon, XIcon } from \"lucide-react\";\nimport { Dialog } from \"radix-ui\";\nimport { useRef, useState, type ReactNode, type RefObject } from \"react\";\nimport { usePortalTokenStyle } from \"../lib/use-portal-token-style\";\n\nexport type SessionCapabilityFrameProps = {\n name: string;\n subtitle: string;\n logo: string | null;\n typeLabel: string;\n description: string;\n skill: boolean;\n expanded: boolean;\n complete: boolean;\n /** Completion copy must reflect the provider's actual scope of access. */\n completeLabel?: string;\n actionLabel: string;\n /** Direct navigation actions should not announce a dialog on the card. */\n opensDialog?: boolean;\n note: string;\n onOpen(): void;\n onClose(): void;\n busy?: boolean;\n opener?: RefObject<HTMLButtonElement | null>;\n cardRef?: RefObject<HTMLElement | null>;\n children?: ReactNode;\n /** A catalogue row can own the opener while reusing the same details dialog. */\n dialogOnly?: boolean;\n};\n\nfunction Mark({ src, name }: { src: string | null; name: string }) {\n const [failed, setFailed] = useState<string | null>(null);\n return (\n <span className=\"og-session-capability-logo\" aria-hidden>\n {src && failed !== src ? (\n <img src={src} alt=\"\" loading=\"lazy\" decoding=\"async\" onError={() => setFailed(src)} />\n ) : (\n name.trim().slice(0, 2).toUpperCase()\n )}\n </span>\n );\n}\n\n/** The same conversation card in the console and embedded clients. Setup\n * content owns the provider flow; this frame owns identity and protected focus. */\nexport function SessionCapabilityFrame({\n name,\n subtitle,\n logo,\n typeLabel,\n description,\n skill,\n expanded,\n complete,\n completeLabel,\n actionLabel,\n opensDialog = true,\n note,\n onOpen,\n onClose,\n busy = false,\n opener,\n cardRef,\n children,\n dialogOnly = false,\n}: SessionCapabilityFrameProps) {\n const localOpener = useRef<HTMLButtonElement>(null);\n const localCard = useRef<HTMLElement>(null);\n const buttonRef = opener ?? localOpener;\n const sectionRef = cardRef ?? localCard;\n const portalStyle = usePortalTokenStyle(sectionRef.current);\n const identity = (\n <>\n <Mark src={logo} name={name} />\n <div className=\"og-session-capability-identity\">\n <h3>{name}</h3>\n <span>{subtitle}</span>\n </div>\n <span className=\"og-session-capability-type\">{typeLabel}</span>\n </>\n );\n return (\n <div className=\"og-session-capability\">\n <section\n hidden={dialogOnly}\n style={dialogOnly ? { display: \"none\" } : undefined}\n ref={sectionRef}\n tabIndex={-1}\n aria-label={`${name} setup`}\n data-state={complete ? \"complete\" : expanded ? \"setup\" : \"suggested\"}\n className=\"og-session-capability-shell\"\n >\n <div className=\"og-session-capability-header\">\n {identity}\n {complete ? <CheckIcon size={16} aria-hidden /> : null}\n </div>\n {complete ? (\n <p role=\"status\" className=\"og-session-capability-copy\">\n {completeLabel ??\n (skill ? \"Installed · Workspace\" : \"Connected · Available in this conversation\")}\n </p>\n ) : (\n <>\n <p className=\"og-session-capability-copy\">{description}</p>\n <div className=\"og-session-capability-actions\">\n <span>\n <ShieldCheckIcon size={13} aria-hidden />\n {skill ? \"Guidance only · no account access\" : \"You choose what to authorize\"}\n </span>\n <button\n ref={buttonRef}\n type=\"button\"\n onClick={onOpen}\n disabled={busy}\n aria-haspopup={opensDialog ? \"dialog\" : undefined}\n aria-expanded={opensDialog ? expanded : undefined}\n >\n {actionLabel}\n </button>\n </div>\n </>\n )}\n </section>\n {!complete && !dialogOnly ? <p className=\"og-session-capability-note\">{note}</p> : null}\n <Dialog.Root\n open={expanded && !complete}\n onOpenChange={(open) => {\n if (!open && !busy) onClose();\n }}\n >\n <Dialog.Portal>\n <Dialog.Overlay className=\"og-root og-session-capability-overlay\" style={portalStyle} />\n <Dialog.Content\n className=\"og-root og-session-capability-dialog\"\n style={portalStyle}\n onEscapeKeyDown={(event) => {\n if (busy) event.preventDefault();\n }}\n onInteractOutside={(event) => {\n if (busy) event.preventDefault();\n }}\n onCloseAutoFocus={(event) => {\n event.preventDefault();\n const target = buttonRef.current?.isConnected\n ? buttonRef.current\n : sectionRef.current;\n if (target?.isConnected) target.focus();\n }}\n >\n <div className=\"og-session-capability-dialog-header\">\n <Mark src={logo} name={name} />\n <div>\n <Dialog.Title>{name}</Dialog.Title>\n <Dialog.Description>\n {typeLabel}\n {subtitle ? ` · ${subtitle}` : \"\"}\n </Dialog.Description>\n </div>\n {!busy ? (\n <Dialog.Close aria-label=\"Close connection setup\">\n <XIcon size={18} />\n </Dialog.Close>\n ) : null}\n </div>\n <div className=\"og-session-capability-dialog-body\">{children}</div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n </div>\n );\n}\n","import {\n authorizeConnectAttempt,\n ConnectPopupClosedError,\n ConnectController,\n createBrowserConnectNavigation,\n reserveBrowserConnectNavigation,\n type ConnectAttempt,\n type ConnectNavigation,\n type ConnectOwnership,\n} from \"@opengeni/connect\";\nimport type { CapabilityCatalogItem } from \"@opengeni/sdk\";\nimport type { OpenGeniBrowserClient as OpenGeniClient } from \"@opengeni/sdk/browser\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useConnect } from \"../hooks/use-connect\";\nimport { attachSessionCapability, sessionCapabilityTools } from \"../session-capability-policy\";\nimport { SessionCapabilityFrame } from \"./session-capability-frame\";\nimport { matchingActiveMcpConnections } from \"../mcp-connection-status\";\n\nexport type SessionMcpCapabilityCardProps = {\n client: OpenGeniClient;\n workspaceId: string;\n sessionId: string;\n capabilityId: string;\n name: string;\n rationale?: string;\n /** Exact host route; no console-specific routing is assumed. */\n returnUrl: string;\n onConfigured?: (() => void | Promise<void>) | undefined;\n};\n\nexport type McpConnectionCardProps = Omit<SessionMcpCapabilityCardProps, \"sessionId\"> & {\n /** Omit for connection management: no session tool selection is written. */\n sessionId?: string;\n dialogOnly?: boolean;\n onClose?: (() => void) | undefined;\n /**\n * The provider only ever connects someone's own account (official Gmail,\n * Slack's hosted MCP): no ownership choice, always personal.\n */\n personalOnly?: boolean;\n /** The connect button's words, \"Connect Gmail\". Defaults to \"Continue to <name>\". */\n connectLabel?: string;\n /** The line under the dialog title. Defaults to the kind and provider domain. */\n dialogSubtitle?: string;\n /** The host's product copy for this connection, instead of the catalog description. */\n description?: string;\n /** The host's logo for this connection, when the catalog has no asset. */\n logoSrc?: string | null;\n /** The host's words for the ownership choice. */\n ownershipCopy?: { legend: string; workspace: string; personal: string };\n};\n\n/** Native OAuth recommendation flow. Identity and endpoint come from the live\n * catalog, never from model-authored recommendation text. */\nexport function SessionMcpCapabilityCard(props: SessionMcpCapabilityCardProps) {\n return <McpConnectionCard {...props} />;\n}\n\nexport function McpConnectionCard(props: McpConnectionCardProps) {\n const [client, setClient] = useState(props.client);\n const [generation, setGeneration] = useState(0);\n if (client !== props.client) {\n setClient(props.client);\n setGeneration(generation + 1);\n }\n return (\n <ScopedCard\n key={`${generation}:${props.workspaceId}:${props.sessionId}:${props.capabilityId}`}\n {...props}\n />\n );\n}\n\nfunction ScopedCard({\n client,\n workspaceId,\n sessionId,\n capabilityId,\n name,\n rationale = \"\",\n returnUrl,\n onConfigured,\n dialogOnly = false,\n onClose,\n personalOnly = false,\n connectLabel,\n dialogSubtitle,\n description: hostDescription,\n logoSrc,\n ownershipCopy,\n}: McpConnectionCardProps) {\n const [controller] = useState(\n () => new ConnectController(client.connectTransport(), workspaceId),\n );\n const view = useConnect(controller);\n const [item, setItem] = useState<CapabilityCatalogItem | null>(null);\n const [logo, setLogo] = useState<string | null>(null);\n const [expanded, setExpanded] = useState(dialogOnly);\n const [complete, setComplete] = useState(false);\n const [connected, setConnected] = useState(false);\n const [waiting, setWaiting] = useState(false);\n const [reconciling, setReconciling] = useState(false);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [notice, setNotice] = useState<string | null>(null);\n const [retryFresh, setRetryFresh] = useState(false);\n const [ownership, setOwnership] = useState<ConnectOwnership>(\n personalOnly ? \"personal\" : \"workspace\",\n );\n const lifetime = useRef<AbortController | null>(null);\n const authorization = useRef<AbortController | null>(null);\n const operation = useRef<AbortController | null>(null);\n const reservedPopup = useRef<(() => void) | null>(null);\n const startKey = useRef(crypto.randomUUID());\n const advanceKey = useRef(crypto.randomUUID());\n const startInput = useRef<string | null>(null);\n const storageKey = sessionId\n ? `opengeni:session-connect:${workspaceId}:${sessionId}:${capabilityId}`\n : `opengeni:workspace-connect:${workspaceId}:${capabilityId}`;\n const current = () => !!lifetime.current && !lifetime.current.signal.aborted;\n\n async function load(active: () => boolean = current) {\n const invocation = lifetime.current;\n const [catalog, session] = await Promise.all([\n client.listCapabilities(workspaceId),\n sessionId ? client.getSession(workspaceId, sessionId) : Promise.resolve(null),\n ]);\n if (!invocation || invocation.signal.aborted || lifetime.current !== invocation || !active())\n return null;\n const resolved = catalog.items.find((entry) => entry.id === capabilityId);\n if (!resolved || resolved.kind !== \"mcp\" || resolved.authKind !== \"oauth2\")\n throw new Error(\n \"This recommendation is not an available OAuth MCP integration. Review the current connection catalog.\",\n );\n setItem(resolved);\n if (resolved.connectionRef)\n setOwnership(resolved.connectionRef.subjectScope === \"subject\" ? \"personal\" : \"workspace\");\n else if (\n !item &&\n (personalOnly || resolved.metadata?.defaultConnectionOwnership === \"personal\")\n )\n setOwnership(\"personal\");\n let accountReady = false;\n if (resolved.enabled && resolved.connectionRef) {\n const connections =\n resolved.connectionRef.subjectScope === \"subject\"\n ? await client.listOwnConnectionAccounts(workspaceId)\n : await client.listConnections(workspaceId);\n if (invocation.signal.aborted || lifetime.current !== invocation || !active()) return null;\n const matches = matchingActiveMcpConnections(resolved, connections);\n accountReady = matches.length === 1;\n }\n if (invocation.signal.aborted || lifetime.current !== invocation || !active()) return null;\n const selected =\n session?.toolPolicy.mode === \"workspace_default\"\n ? session.effectiveToolPolicy?.selectedIds\n : session?.tools.filter((tool) => tool.kind === \"mcp\").map((tool) => tool.id);\n setConnected(accountReady);\n setComplete(\n accountReady &&\n !!selected &&\n sessionCapabilityTools(resolved).every((tool) => selected.includes(tool.id)),\n );\n return resolved;\n }\n\n useEffect(() => {\n const abort = new AbortController();\n lifetime.current = abort;\n // Mount reads are scoped to this effect, not to the user-action lock.\n // Strict Mode may cancel the first mount while its promise is still in\n // flight; that must not suppress the replacement mount's initialization.\n if (dialogOnly) setBusy(true);\n void (async () => {\n await load();\n if (abort.signal.aborted || !dialogOnly) return;\n await recoverSavedAttempt();\n })()\n .catch((failure) => {\n if (!abort.signal.aborted)\n setError(\n failure instanceof Error ? failure.message : \"Couldn't load connection details.\",\n );\n })\n .finally(() => {\n if (!abort.signal.aborted && dialogOnly) setBusy(false);\n });\n return () => {\n abort.abort();\n };\n // ScopedCard remounts for client/workspace/session/capability changes.\n // These reads initialize that scope; rerunning on action closures would\n // cancel initialization whenever its own state updates render the card.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [client, workspaceId, sessionId, capabilityId, dialogOnly]);\n\n useEffect(() => {\n const path = item?.logoAssetPath;\n setLogo(null);\n if (!path?.startsWith(\"catalog-assets/\")) return;\n const abort = new AbortController();\n let objectUrl: string | null = null;\n // Embeds can require authentication even for the API's public catalog\n // asset route. Use the client's transport instead of an unauthenticated img.\n void client\n .downloadCatalogAsset(path, { signal: abort.signal })\n .then((blob) => {\n if (abort.signal.aborted || !blob.type.startsWith(\"image/\") || blob.size > 2_000_000)\n return;\n objectUrl = URL.createObjectURL(blob);\n setLogo(objectUrl);\n })\n .catch(() => {\n /* Keep the provider's initials if its passive mark is unavailable. */\n });\n return () => {\n abort.abort();\n if (objectUrl) URL.revokeObjectURL(objectUrl);\n };\n }, [client, item?.logoAssetPath]);\n\n async function run(action: (active: () => boolean) => Promise<void>) {\n if (operation.current || !current()) return;\n const pending = new AbortController();\n operation.current = pending;\n const active = () => current() && operation.current === pending && !pending.signal.aborted;\n setBusy(true);\n setError(null);\n setNotice(null);\n setRetryFresh(false);\n try {\n await action(active);\n } catch (failure) {\n if (active()) {\n if (failure instanceof ConnectPopupClosedError) setNotice(failure.message);\n else\n setError(\n failure instanceof Error\n ? failure.message\n : \"Connection setup could not finish. Try again.\",\n );\n }\n } finally {\n if (operation.current === pending) {\n operation.current = null;\n if (current()) setBusy(false);\n }\n }\n }\n\n function remember(attemptId: string) {\n // An opaque recovery hint only. The backend rechecks the authenticated\n // owner on recover; this value never grants access or proves completion.\n try {\n sessionStorage.setItem(storageKey, attemptId);\n } catch {\n /* Storage may be disabled. */\n }\n }\n\n async function reconcile(attempt: ConnectAttempt, active: () => boolean = current) {\n if (!active()) return;\n if (attempt.state !== \"complete\" || !attempt.account || !attempt.credentialsCommitted) return;\n const resolved = await load(active);\n if (!resolved || !active()) return;\n const connection = (await client.listConnections(workspaceId)).find(\n (entry) => entry.id === attempt.account!.id,\n );\n if (!active()) return;\n if (\n !connection ||\n connection.status !== \"active\" ||\n connection.kind !== \"oauth2\" ||\n connection.metadata.mcpUrl !== (resolved.mcpUrl ?? resolved.endpointUrl) ||\n (connection.subjectId !== null) !== (attempt.ownership === \"personal\")\n )\n throw new Error(\n \"The authorized account does not match this integration. Review its connection settings.\",\n );\n const previous = resolved.connectionRef;\n if (\n resolved.enabled &&\n previous?.subjectScope !== \"subject\" &&\n previous?.connectionId &&\n previous.connectionId !== connection.id\n )\n throw new Error(\n \"This integration's selected account changed during setup. Review it before continuing.\",\n );\n await client.enableCapability(workspaceId, capabilityId, {\n connectionRef:\n attempt.ownership === \"personal\"\n ? { providerDomain: connection.providerDomain, kind: \"oauth2\", subjectScope: \"subject\" }\n : {\n providerDomain: connection.providerDomain,\n kind: \"oauth2\",\n subjectScope: \"workspace\",\n connectionId: connection.id,\n },\n });\n if (!active()) return;\n const enabled = await load(active);\n if (enabled && active()) {\n await finishConnection(enabled, active);\n }\n if (!active()) return;\n try {\n sessionStorage.removeItem(storageKey);\n } catch {\n /* Recovery hint only. */\n }\n }\n\n async function open() {\n setExpanded(true);\n await run(async (active) => {\n await load(active);\n if (!active()) return;\n await recoverSavedAttempt(active);\n });\n }\n\n async function recoverSavedAttempt(active: () => boolean = current) {\n let saved: string | null = null;\n try {\n saved = sessionStorage.getItem(storageKey);\n } catch {\n /* No persisted attempt. */\n }\n if (saved) {\n const attempt = await controller.recover(saved);\n if (!active()) return;\n if ([\"failed\", \"expired\", \"cancelled\"].includes(attempt.state)) setRetryFresh(true);\n if (attempt.state === \"complete\") setReconciling(true);\n try {\n await reconcile(attempt, active);\n } finally {\n if (active()) setReconciling(false);\n }\n }\n }\n\n async function begin(fresh = false) {\n await run(async (active) => {\n if (\n fresh ||\n (view.attempt && [\"failed\", \"expired\", \"cancelled\"].includes(view.attempt.state))\n ) {\n startKey.current = crypto.randomUUID();\n advanceKey.current = crypto.randomUUID();\n }\n const reserved = reserveBrowserConnectNavigation(window);\n reservedPopup.current = reserved.close;\n try {\n const resolved = await load(active);\n if (!resolved || !active()) return;\n if (\n resolved.connectionRef &&\n ownership !==\n (resolved.connectionRef.subjectScope === \"subject\" ? \"personal\" : \"workspace\")\n )\n throw new Error(\n \"The connection ownership changed. Review the current account before continuing.\",\n );\n const mcpUrl = resolved.mcpUrl ?? resolved.endpointUrl;\n if (!mcpUrl)\n throw new Error(\n \"The current catalog has no authorization endpoint for this integration.\",\n );\n // Never silently replace an already selected account. Reauthorization\n // stays on its exact native connection ID.\n let reconnectAccountId = resolved.connectionRef?.connectionId ?? undefined;\n if (resolved.connectionRef?.subjectScope === \"subject\") {\n const connections = (await client.listConnections(workspaceId)).filter(\n (entry) =>\n entry.subjectId !== null &&\n entry.kind === \"oauth2\" &&\n entry.metadata.mcpUrl === mcpUrl,\n );\n if (!active()) return;\n if (connections.length > 1)\n throw new Error(\n \"More than one personal account matches. Choose the account in connection settings before reconnecting.\",\n );\n reconnectAccountId = connections[0]?.id;\n }\n // A closed request can still have reached the server. Keep its key for\n // an exact replay, but never reuse it when ownership or another input\n // changes while the user reopens setup.\n const input = JSON.stringify({ ownership, returnUrl, reconnectAccountId, mcpUrl });\n if (startInput.current !== null && startInput.current !== input) {\n startKey.current = crypto.randomUUID();\n advanceKey.current = crypto.randomUUID();\n }\n startInput.current = input;\n let attempt = await controller.begin({\n providerId: \"mcp-oauth\",\n ownership,\n returnUrl,\n idempotencyKey: startKey.current,\n ...(reconnectAccountId ? { reconnectAccountId } : {}),\n });\n if (!active()) return;\n remember(attempt.id);\n if (attempt.state === \"credential_input\")\n attempt = await controller.advance(\n { type: \"credentials\", values: { mcpUrl } },\n advanceKey.current,\n );\n if (!active()) return;\n if (attempt.nextAction.type === \"authorize\")\n await performAuthorization(attempt, reserved.navigation, active);\n else await reconcile(attempt, active);\n } finally {\n if (reservedPopup.current === reserved.close) reservedPopup.current = null;\n reserved.close();\n }\n });\n }\n\n async function performAuthorization(\n attempt: ConnectAttempt,\n navigation: ConnectNavigation,\n active: () => boolean,\n ) {\n if (!active()) return;\n const pending = new AbortController();\n authorization.current = pending;\n const abortOnUnmount = () => pending.abort(lifetime.current?.signal.reason);\n lifetime.current!.signal.addEventListener(\"abort\", abortOnUnmount, { once: true });\n setWaiting(true);\n try {\n const result = await authorizeConnectAttempt(controller.transport, attempt, navigation, {\n mode: \"popup\",\n signal: pending.signal,\n });\n if (!active() || !result) return;\n setWaiting(false);\n setReconciling(true);\n await reconcile(result, active);\n if (!active()) return;\n if (result.state === \"cancelled\") {\n setNotice(\"Sign-in was cancelled. You can try connecting again.\");\n setRetryFresh(true);\n return;\n }\n if (result.state !== \"complete\") {\n if ([\"failed\", \"expired\"].includes(result.state)) setRetryFresh(true);\n throw new Error(\"Sign-in did not finish. You can try connecting again.\");\n }\n } finally {\n lifetime.current?.signal.removeEventListener(\"abort\", abortOnUnmount);\n if (authorization.current === pending) authorization.current = null;\n if (active()) {\n setReconciling(false);\n setWaiting(false);\n }\n }\n }\n\n function authorize(attempt: ConnectAttempt) {\n // run invokes action synchronously, retaining the browser click gesture.\n return run((active) =>\n performAuthorization(attempt, createBrowserConnectNavigation(window), active),\n );\n }\n\n async function finishConnection(\n capability: CapabilityCatalogItem,\n active: () => boolean = current,\n ) {\n if (!sessionId) {\n // Connection management does not select session tools.\n await onConfigured?.();\n if (!active()) return;\n setComplete(true);\n setExpanded(false);\n onClose?.();\n return;\n }\n if (capability.connectionRef && capability.connectionRef.subjectScope !== \"subject\") {\n const selected = (await client.listConnections(workspaceId)).find(\n (entry) => entry.id === capability.connectionRef?.connectionId,\n );\n if (!active()) return;\n if (!selected || selected.status !== \"active\")\n throw new Error(\"This account needs reconnection before it can be used here.\");\n }\n if (capability.connectionRef?.subjectScope === \"subject\") {\n const accounts = await client.listOwnConnectionAccounts(workspaceId);\n if (!active()) return;\n if (matchingActiveMcpConnections(capability, accounts).length === 0)\n throw new Error(\"Your account needs reconnection before it can be used here.\");\n }\n if (!active()) return;\n await attachSessionCapability(client, workspaceId, sessionId, capability, active);\n if (!active()) return;\n await onConfigured?.();\n if (!active()) return;\n setComplete(true);\n setExpanded(false);\n }\n\n async function useHere() {\n await run(async (active) => {\n if (item) await finishConnection(item, active);\n });\n }\n\n function close() {\n const pending = operation.current;\n if (pending) {\n operation.current = null;\n pending.abort(new ConnectPopupClosedError());\n authorization.current?.abort(new ConnectPopupClosedError());\n authorization.current = null;\n reservedPopup.current?.();\n setBusy(false);\n setWaiting(false);\n setReconciling(false);\n }\n setExpanded(false);\n onClose?.();\n }\n\n return (\n <SessionCapabilityFrame\n name={item?.name ?? name}\n subtitle={dialogSubtitle !== undefined ? \"\" : (item?.providerDomain ?? \"\")}\n logo={logo ?? logoSrc ?? null}\n typeLabel={dialogSubtitle ?? \"MCP server\"}\n description={hostDescription || item?.description || rationale}\n skill={false}\n expanded={expanded}\n complete={complete}\n actionLabel={\n connected\n ? sessionId\n ? \"Use in this conversation\"\n : \"Connected\"\n : `Connect ${item?.name ?? name}`\n }\n note={\n sessionId\n ? \"Review access before signing in. You'll return to this conversation after authorization.\"\n : \"Review access before signing in. You'll return here after authorization.\"\n }\n onOpen={() => void open()}\n onClose={close}\n dialogOnly={dialogOnly}\n >\n <div className=\"og-session-capability-setup\">\n {error ? <p role=\"alert\">{error}</p> : null}\n {notice ? (\n <p role=\"status\" className=\"og-session-capability-notice\">\n {notice}\n </p>\n ) : null}\n {!item ? (\n <>\n <p role=\"status\">\n {busy ? \"Loading connection details…\" : \"Connection details are unavailable.\"}\n </p>\n <button disabled={busy} onClick={() => void open()}>\n Retry\n </button>\n </>\n ) : (\n <>\n <p>{hostDescription || item.description || rationale}</p>\n {busy ? (\n <>\n <p role=\"status\" className=\"og-session-capability-progress\">\n {waiting\n ? `Finish signing in with ${item.name} in the opened window. This will close automatically when you’re connected.`\n : reconciling\n ? \"Finishing your connection…\"\n : \"Preparing your connection…\"}\n </p>\n {waiting ? (\n <button\n type=\"button\"\n className=\"og-session-capability-stop\"\n onClick={() => authorization.current?.abort(new ConnectPopupClosedError())}\n >\n Stop waiting\n </button>\n ) : null}\n </>\n ) : !connected ? (\n <>\n {!item.connectionRef && !personalOnly ? (\n <fieldset disabled={busy}>\n <legend>{ownershipCopy?.legend ?? \"Who can use this connection?\"}</legend>\n <label>\n <input\n type=\"radio\"\n name={`${capabilityId}-ownership`}\n checked={ownership === \"workspace\"}\n onChange={() => setOwnership(\"workspace\")}\n />\n Everyone in this workspace\n </label>\n <label>\n <input\n type=\"radio\"\n name={`${capabilityId}-ownership`}\n checked={ownership === \"personal\"}\n onChange={() => setOwnership(\"personal\")}\n />\n Only me\n </label>\n </fieldset>\n ) : null}\n <p className=\"og-session-capability-scope\">\n {personalOnly && ownership === \"personal\"\n ? \"Connects your own account. Only work you start can use it.\"\n : ownershipCopy\n ? ownership === \"workspace\"\n ? ownershipCopy.workspace\n : ownershipCopy.personal\n : ownership === \"workspace\"\n ? sessionId\n ? \"This connection will be available to your workspace and used in this conversation.\"\n : \"This connection will be available to your workspace.\"\n : \"This connection belongs to you. Your messages can use it; other participants use their own accounts.\"}\n </p>\n <button\n className=\"og-session-capability-primary\"\n onClick={() => {\n if (notice || retryFresh) void begin(true);\n else if (\n view.attempt?.nextAction.type === \"authorize\" &&\n view.attempt.ownership === ownership\n )\n void authorize(view.attempt);\n else void begin();\n }}\n >\n {retryFresh ||\n ((error || notice) && view.attempt?.nextAction.type === \"authorize\")\n ? \"Try signing in again\"\n : (connectLabel ?? `Continue to ${item.name}`)}\n </button>\n </>\n ) : null}\n {connected && !busy ? (\n <>\n <p className=\"og-session-capability-scope\">\n {sessionId\n ? \"Your account is connected. Enable it for this conversation to finish.\"\n : \"Your account is connected.\"}\n </p>\n <button\n className=\"og-session-capability-primary\"\n disabled={busy || view.busy}\n onClick={() => void useHere()}\n >\n {sessionId ? \"Use in this conversation\" : \"Done\"}\n </button>\n </>\n ) : null}\n </>\n )}\n </div>\n </SessionCapabilityFrame>\n );\n}\n","import type { CapabilityCatalogItem, ConnectionMetadata } from \"@opengeni/sdk\";\n\n/** Status only; runtime use is authorized for the authenticated initiating user. */\nexport function matchingActiveMcpConnections(\n item: CapabilityCatalogItem,\n connections: ConnectionMetadata[],\n) {\n return matchingMcpConnections(item, connections).filter((entry) => entry.status === \"active\");\n}\n\nfunction matchingMcpConnections(item: CapabilityCatalogItem, connections: ConnectionMetadata[]) {\n const ref = item.connectionRef;\n if (!item.enabled || !ref) return [];\n return connections.filter(\n (entry) =>\n entry.status !== \"revoked\" &&\n entry.kind === \"oauth2\" &&\n entry.metadata.mcpUrl === (item.mcpUrl ?? item.endpointUrl) &&\n (ref.subjectScope !== \"subject\"\n ? entry.id === ref.connectionId && entry.subjectId === null\n : entry.subjectId !== null),\n );\n}\n\n/** Installation availability is not account readiness. Revoked history is not actionable. */\nexport function mcpConnectionDiscoveryState(\n item: CapabilityCatalogItem,\n connections: ConnectionMetadata[],\n) {\n const matching = matchingMcpConnections(item, connections);\n const active = matching.filter((entry) => entry.status === \"active\");\n if (active.length === 1) return { status: \"added\", label: \"Connected\" } as const;\n if (matching.length > 0) return { status: \"attention\", label: \"Review connection\" } as const;\n return { status: \"available\", label: \"Connect\" } as const;\n}\n"],"mappings":"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","names":["useRef","useState","Fragment","jsx","jsxs","useState","useRef"]}
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
PickerNavRow,
|
|
4
4
|
defaultModelPolicyPickerMessages,
|
|
5
5
|
effectiveRows
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-UINDK6C3.js";
|
|
7
7
|
import {
|
|
8
8
|
MENU_CHECK_CLASS,
|
|
9
9
|
MENU_LABEL_CLASS,
|
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
labelReasoningEffort,
|
|
19
19
|
payerSummaryForModel,
|
|
20
20
|
runnableLatencyModesForModel
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-CHPKSLPN.js";
|
|
22
22
|
import {
|
|
23
23
|
cn
|
|
24
24
|
} from "./chunk-22KP6LR5.js";
|
|
@@ -305,4 +305,4 @@ export {
|
|
|
305
305
|
ModelPolicyPickerMenu,
|
|
306
306
|
ModelPolicyPickerPopover
|
|
307
307
|
};
|
|
308
|
-
//# sourceMappingURL=chunk-
|
|
308
|
+
//# sourceMappingURL=chunk-5EXGU7UF.js.map
|