@opengeni/react 6.1.0-canary.2 → 6.1.0-canary.4
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 +5 -0
- package/dist/{browser-viewer-NTD6UIPR.js → browser-viewer-LGH4IP47.js} +3 -3
- package/dist/chunk-AWEBVNVX.js +1398 -0
- package/dist/chunk-AWEBVNVX.js.map +1 -0
- package/dist/{chunk-NYESIADM.js → chunk-B7TTSUEW.js} +3 -1
- package/dist/chunk-B7TTSUEW.js.map +1 -0
- package/dist/{chunk-UWVY3OXF.js → chunk-BC7BFCMN.js} +277 -455
- package/dist/chunk-BC7BFCMN.js.map +1 -0
- package/dist/chunk-BRM6FVZA.js +302 -0
- package/dist/chunk-BRM6FVZA.js.map +1 -0
- package/dist/{chunk-KZ4QDBGM.js → chunk-GHSSI2BK.js} +925 -1265
- package/dist/chunk-GHSSI2BK.js.map +1 -0
- package/dist/{chunk-NLTS7JHI.js → chunk-JPHDWKZE.js} +5 -5
- package/dist/{chunk-L5VJYZIW.js → chunk-O53CQZ6T.js} +7 -7
- package/dist/{chunk-24M4YBCL.js → chunk-PNAVEK2U.js} +4 -4
- package/dist/components/preview-loading.d.ts +2 -0
- package/dist/composer.js +4 -4
- package/dist/connect-setup.d.ts +2 -0
- package/dist/connect.js +19 -8
- package/dist/connect.js.map +1 -1
- package/dist/index.js +27 -27
- package/dist/interaction.js +2 -2
- package/dist/machines.js +2 -2
- package/dist/plugin-discovery.d.ts +2 -0
- package/dist/realtime.js +20 -20
- package/dist/realtime.js.map +1 -1
- package/dist/session-ui.js +7 -7
- package/dist/session.js +3 -3
- package/package.json +3 -3
- package/src/components/markdown.tsx +13 -21
- package/src/components/preview-loading.tsx +154 -0
- package/src/connect-setup.tsx +17 -5
- package/src/hooks/use-composer.ts +6 -0
- package/src/plugin-discovery.tsx +10 -6
- package/src/realtime/realtime-control.tsx +6 -8
- package/styles/compiled.css +48 -8
- package/styles/index.css +45 -0
- package/dist/chunk-G5JFM6ZE.js +0 -911
- package/dist/chunk-G5JFM6ZE.js.map +0 -1
- package/dist/chunk-HQV2I5HV.js +0 -124
- package/dist/chunk-HQV2I5HV.js.map +0 -1
- package/dist/chunk-KZ4QDBGM.js.map +0 -1
- package/dist/chunk-NYESIADM.js.map +0 -1
- package/dist/chunk-UWVY3OXF.js.map +0 -1
- /package/dist/{browser-viewer-NTD6UIPR.js.map → browser-viewer-LGH4IP47.js.map} +0 -0
- /package/dist/{chunk-NLTS7JHI.js.map → chunk-JPHDWKZE.js.map} +0 -0
- /package/dist/{chunk-L5VJYZIW.js.map → chunk-O53CQZ6T.js.map} +0 -0
- /package/dist/{chunk-24M4YBCL.js.map → chunk-PNAVEK2U.js.map} +0 -0
package/dist/connect.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/connect.ts","../src/capability-catalog-row.tsx","../src/skill-discovery.tsx","../src/discovery-cache.ts","../src/connect-setup.tsx","../src/connection-catalog.tsx","../src/connect-chooser.tsx","../src/connect-accounts.tsx","../src/connect-panel.tsx","../src/device-authorization.tsx","../src/identity-link-consent.tsx","../src/identity-link-accounts.tsx","../src/connection-installed.tsx","../src/connection-type-picker.tsx","../src/connection-logo.tsx","../src/plugin-discovery.tsx","../src/plugin-details.tsx"],"sourcesContent":["// Optional, unstyled React adapter over the shared headless controller.\n// The host owns controller lifetime; unmounting one observer does not cancel an\n// attempt another observer is displaying or a durable backend operation.\nimport { useMemo, useSyncExternalStore } from \"react\";\nexport {\n CapabilityCatalogRow,\n CapabilityCatalogIndicator,\n type CapabilityCatalogRowProps,\n type CapabilityCatalogStatus,\n} from \"./capability-catalog-row\";\nexport {\n SkillDiscovery,\n type SkillDiscoveryProps,\n type SkillDiscoveryClient,\n type SkillDiscoveryItem,\n type SkillDiscoveryPage,\n} from \"./skill-discovery\";\nimport type { ConnectController } from \"@opengeni/connect\";\nexport { ConnectSetup, type ConnectSetupProps } from \"./connect-setup\";\nexport { ConnectChooser, type ConnectChooserProps } from \"./connect-chooser\";\nexport { ConnectAccounts, type ConnectAccountsProps } from \"./connect-accounts\";\nexport { ConnectPanel, type ConnectPanelProps } from \"./connect-panel\";\nexport { DeviceAuthorization, type DeviceAuthorizationProps } from \"./device-authorization\";\nexport {\n IdentityLinkConsent,\n type IdentityLinkClient,\n type IdentityLinkConsentProps,\n} from \"./identity-link-consent\";\nexport { IdentityLinkAccounts, type IdentityLinkAccountsClient } from \"./identity-link-accounts\";\n\nexport type { ConnectSnapshot } from \"@opengeni/connect\";\nexport type {\n ConnectAccount,\n ConnectAdvance,\n ConnectAttempt,\n ConnectNextAction,\n ConnectOwnership,\n ConnectProvider,\n ConnectResource,\n ConnectTransport,\n} from \"@opengeni/connect\";\n\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\nexport {\n ConnectionCatalog,\n ConnectionServiceRow,\n ConnectionOptionRow,\n type ConnectionCatalogProps,\n type ConnectionCatalogService,\n type ConnectionCatalogOption,\n} from \"./connection-catalog\";\nexport { ConnectionInstalled, type ConnectionInstalledItem } from \"./connection-installed\";\nexport { ConnectionTypePicker, type ConnectionType } from \"./connection-type-picker\";\nexport { ConnectionLogo } from \"./connection-logo\";\nexport { PluginDiscovery, type PluginDiscoveryProps } from \"./plugin-discovery\";\nexport { PluginDetails } from \"./plugin-details\";\n","import type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { AlertTriangleIcon, CheckIcon, Loader2Icon, PlusIcon } from \"lucide-react\";\n\nexport type CapabilityCatalogStatus =\n | \"available\"\n | \"added\"\n | \"attention\"\n | \"unavailable\"\n | \"loading\";\n\nexport type CapabilityCatalogRowProps = Omit<\n ComponentPropsWithoutRef<\"button\">,\n \"children\" | \"onClick\" | \"name\"\n> & {\n name: string;\n description?: string | undefined;\n icon?: ReactNode;\n status?: CapabilityCatalogStatus;\n statusLabel?: string | undefined;\n /** Preserve opaque host status text when adopting this row without typed health. */\n showStatusLabel?: boolean;\n onOpen: () => void;\n};\n\nconst labels: Record<CapabilityCatalogStatus, string> = {\n available: \"Available to add\",\n added: \"Added\",\n attention: \"Needs attention\",\n unavailable: \"Unavailable\",\n loading: \"Working\",\n};\n\n/** A display-only state. The entire catalog row is the action, never this glyph. */\nexport function CapabilityCatalogIndicator({\n status = \"available\",\n label,\n showLabel = false,\n}: {\n status?: CapabilityCatalogStatus;\n label?: string | undefined;\n showLabel?: boolean;\n}) {\n const Icon =\n status === \"added\"\n ? CheckIcon\n : status === \"attention\" || status === \"unavailable\"\n ? AlertTriangleIcon\n : status === \"loading\"\n ? Loader2Icon\n : PlusIcon;\n return (\n <span className=\"og-capability-catalog-indicator\" data-status={status}>\n <Icon aria-hidden=\"true\" />\n <span\n className={\n showLabel || status === \"attention\" || status === \"unavailable\"\n ? \"og-capability-catalog-notice\"\n : \"og-capability-catalog-sr-only\"\n }\n >\n {label ?? labels[status]}\n </span>\n </span>\n );\n}\n\n/** Shared by connections, skills, and plugins: one row, one focus target, one action. */\nexport function CapabilityCatalogRow({\n name,\n description,\n icon,\n status = \"available\",\n statusLabel,\n showStatusLabel = false,\n onOpen,\n className = \"\",\n ...props\n}: CapabilityCatalogRowProps) {\n return (\n <button\n {...props}\n type=\"button\"\n className={`og-capability-catalog-row ${className}`}\n onClick={onOpen}\n >\n {icon ? <span className=\"og-capability-catalog-icon\">{icon}</span> : null}\n <span className=\"og-capability-catalog-copy\">\n <strong>{name}</strong>\n {description ? <span>{description}</span> : null}\n </span>\n <CapabilityCatalogIndicator status={status} label={statusLabel} showLabel={showStatusLabel} />\n </button>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { createDiscoveryCache } from \"./discovery-cache\";\nimport { BookOpenIcon } from \"lucide-react\";\nimport { CapabilityCatalogRow, type CapabilityCatalogStatus } from \"./capability-catalog-row\";\n\nexport type SkillDiscoveryItem = {\n id: string;\n name: string;\n source: string;\n installs: number;\n url: string;\n};\nexport type SkillDiscoveryPage = { items: SkillDiscoveryItem[]; nextCursor: null };\nconst discoveryCache = createDiscoveryCache<SkillDiscoveryPage>();\n\nexport type SkillDiscoveryClient = {\n searchPublicSkills(workspaceId: string, query: string): Promise<SkillDiscoveryPage>;\n};\nexport type SkillDiscoveryProps = {\n installedSkills?: readonly { name: string; repositoryUrl: string; sourceUrl: string }[];\n client: SkillDiscoveryClient;\n workspaceId: string;\n query: string;\n onImport: (url: string) => void;\n canManage: boolean;\n localSkills?: readonly {\n id: string;\n name: string;\n description?: string;\n status?: CapabilityCatalogStatus;\n statusLabel?: string;\n onOpen: () => void;\n }[];\n resultLimit?: number;\n onShowMore?: () => void;\n onSearch?: (() => void) | undefined;\n};\n\n/** Host-owned query and import flow; browse presentation is reusable independently. */\nexport function SkillDiscovery(props: SkillDiscoveryProps) {\n const query = props.query.trim();\n const discoveryQuery = query || \"agent\";\n return (\n <section className=\"og-skill-discovery\" aria-label=\"Discover skills\">\n <header>\n <h3>{props.resultLimit ? \"Skills\" : query ? \"Search skills\" : \"Browse skills\"}</h3>\n {!props.resultLimit ? (\n <a\n href=\"https://skills.sh/\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"og-skill-discovery-browse\"\n >\n Browse skills.sh ↗\n </a>\n ) : null}\n </header>\n {!query ? (\n <p>Agent skills from skills.sh. Search above for another topic.</p>\n ) : query.length < 2 ? (\n <p>Enter at least two characters to search skills.sh.</p>\n ) : null}\n <DiscoveryResults\n key={`${props.workspaceId}:${discoveryQuery}`}\n {...props}\n query={discoveryQuery}\n />\n </section>\n );\n}\n\nconst EMPTY_LOCAL_SKILLS: NonNullable<SkillDiscoveryProps[\"localSkills\"]> = [];\nconst EMPTY_INSTALLED_SKILLS: NonNullable<SkillDiscoveryProps[\"installedSkills\"]> = [];\n\nfunction DiscoveryResults({\n client,\n workspaceId,\n query,\n canManage,\n onImport,\n resultLimit,\n onShowMore,\n localSkills = EMPTY_LOCAL_SKILLS,\n installedSkills = EMPTY_INSTALLED_SKILLS,\n}: SkillDiscoveryProps) {\n const cacheKey = JSON.stringify([workspaceId, query]);\n const cached = discoveryCache.peek(client, cacheKey);\n const [result, setResult] = useState<SkillDiscoveryPage | null>(cached ?? null);\n const [loading, setLoading] = useState(query.length >= 2 && !cached);\n const [error, setError] = useState(false);\n const [retry, setRetry] = useState(0);\n useEffect(() => {\n let active = true;\n setError(false);\n if (query.length < 2) return;\n const existing = discoveryCache.peek(client, cacheKey);\n setLoading(!existing);\n let timer: ReturnType<typeof setTimeout>;\n const search = async (attempt: number) => {\n try {\n const data = await discoveryCache.read(client, cacheKey, () =>\n client.searchPublicSkills(workspaceId, query),\n );\n if (!active) return;\n setResult(data);\n setLoading(false);\n } catch (cause) {\n if (!active) return;\n const status =\n typeof cause === \"object\" && cause !== null && \"status\" in cause\n ? cause.status\n : undefined;\n const transient =\n cause instanceof TypeError ||\n (typeof status === \"number\" && status >= 500 && status <= 599);\n if (attempt === 0 && transient) {\n timer = setTimeout(() => void search(1), 750);\n return;\n }\n setError(true);\n setLoading(false);\n }\n };\n timer = setTimeout(() => void search(0), existing ? 0 : 300);\n return () => {\n active = false;\n clearTimeout(timer);\n };\n }, [client, workspaceId, query, cacheKey, retry]);\n const remoteSkills =\n result?.items.filter(\n (skill) =>\n !localSkills.some((local) => local.name.toLowerCase() === skill.name.toLowerCase()),\n ) ?? [];\n return (\n <div aria-busy={loading}>\n <div className=\"og-skill-discovery-grid\">\n {localSkills.slice(0, resultLimit).map((skill) => (\n <CapabilityCatalogRow\n key={skill.id}\n name={skill.name}\n description={skill.description}\n icon={<BookOpenIcon aria-hidden=\"true\" />}\n status={skill.status ?? \"added\"}\n statusLabel={skill.statusLabel}\n onOpen={skill.onOpen}\n />\n ))}\n {remoteSkills\n .slice(\n 0,\n resultLimit === undefined ? undefined : Math.max(0, resultLimit - localSkills.length),\n )\n .map((skill) => {\n const installed = installedSkills.some(\n (entry) =>\n entry.sourceUrl.replace(/\\/$/, \"\").toLowerCase() === skill.url.toLowerCase() ||\n (entry.repositoryUrl.replace(/\\/$/, \"\").toLowerCase() ===\n `https://github.com/${skill.source}`.toLowerCase() &&\n entry.name.toLowerCase() === skill.name.toLowerCase()),\n );\n return (\n <CapabilityCatalogRow\n key={skill.id}\n disabled={!canManage}\n name={skill.name}\n description={skill.source}\n icon={<BookOpenIcon aria-hidden=\"true\" />}\n status={!canManage ? \"unavailable\" : installed ? \"added\" : \"available\"}\n statusLabel={\n !canManage ? \"Admin required\" : installed ? \"Installed\" : \"Available to add\"\n }\n onOpen={() => onImport(skill.url)}\n />\n );\n })}\n </div>\n {resultLimit && remoteSkills.length + localSkills.length > resultLimit && !loading ? (\n <button className=\"og-catalog-more\" type=\"button\" onClick={onShowMore}>\n View all skills\n </button>\n ) : null}\n {loading ? <p role=\"status\">Loading skills…</p> : null}\n {error ? (\n <div role=\"alert\" className=\"og-skill-discovery-error\">\n Could not load skills.\n <button type=\"button\" onClick={() => setRetry((value) => value + 1)}>\n Retry\n </button>\n </div>\n ) : null}\n {result && !remoteSkills.length && !localSkills.length && !loading && !error ? (\n <p role=\"status\">No skills found. Try a different search.</p>\n ) : null}\n </div>\n );\n}\n","/** Short-lived presentation data only. Never cache installation or authorization state. */\nexport function createDiscoveryCache<T>(ttlMs = 60_000, capacity = 64) {\n const clients = new WeakMap<\n object,\n Map<string, { expires: number; value: T | undefined; pending: Promise<T> }>\n >();\n return {\n peek(client: object, key: string): T | undefined {\n const entry = clients.get(client)?.get(key);\n return entry && entry.expires > Date.now() ? entry.value : undefined;\n },\n read(client: object, key: string, fetch: () => Promise<T>): Promise<T> {\n let entries = clients.get(client);\n if (!entries) {\n entries = new Map();\n clients.set(client, entries);\n }\n const existing = entries.get(key);\n if (existing && existing.expires > Date.now()) return existing.pending;\n entries.delete(key);\n while (entries.size >= capacity) entries.delete(entries.keys().next().value!);\n const entry = {\n expires: Date.now() + ttlMs,\n value: undefined as T | undefined,\n pending: Promise.resolve().then(fetch),\n };\n entries.set(key, entry);\n entry.pending = entry.pending.then(\n (value) => {\n entry.value = value;\n entry.expires = Date.now() + ttlMs;\n return value;\n },\n (error) => {\n if (entries.get(key) === entry) entries.delete(key);\n throw error;\n },\n );\n return entry.pending;\n },\n };\n}\n","import { useState, type FormEvent } from \"react\";\nimport type { ConnectAttempt, ConnectController } from \"@opengeni/connect\";\nimport { useConnect } from \"./connect\";\n\nconst setupStatus: Record<ConnectAttempt[\"state\"], string> = {\n ready: \"Ready to connect\",\n requires_user_action: \"Authorize your account\",\n credential_input: \"Enter connection details\",\n provider_wait: \"Waiting for authorization\",\n account_selection: \"Choose an account\",\n resource_selection: \"Choose resources\",\n preview: \"Review available operations\",\n installing: \"Installing selected operations…\",\n connected_but_incomplete: \"Account connected — finish setup\",\n complete: \"Connection ready\",\n cancelled: \"Setup cancelled\",\n expired: \"Setup expired\",\n failed: \"Setup could not finish\",\n uncertain: \"Setup outcome needs checking\",\n};\n\nfunction deviceVerificationUrl(action: ConnectAttempt[\"nextAction\"]): string | null {\n if (action.type !== \"wait\" || !action.verificationUrl) return null;\n try {\n const url = new URL(action.verificationUrl);\n return url.protocol === \"https:\" && !url.username && !url.password\n ? action.verificationUrl\n : null;\n } catch {\n return null;\n }\n}\n\nexport type ConnectSetupProps = {\n controller: ConnectController;\n /** Called synchronously in the click handler so a host can open a popup. */\n onAuthorize: (attempt: ConnectAttempt) => void | Promise<unknown>;\n /** Host pagination must retain selections across pages and submit the final set. */\n onBrowseResources?: (attempt: ConnectAttempt) => void | Promise<unknown>;\n className?: string;\n /** Provider-specific label supplied by the embedding host. */\n authorizeLabel?: string | undefined;\n};\n\n/** Controller-backed setup surface, styled by opt-in connect.css. No provider secrets enter React state. Host owns\n * chooser, controller lifetime, navigation and recovery after full redirect. */\nexport function ConnectSetup(props: ConnectSetupProps) {\n // Attempt IDs/revisions are not a substitute for actor scope. A host can\n // recover the same attempt through a replacement controller; never preserve\n // a previous actor's unsent credential DOM or local errors across that swap.\n const [scope, setScope] = useState(props.controller);\n const [generation, setGeneration] = useState(0);\n if (scope !== props.controller) {\n setScope(props.controller);\n setGeneration(generation + 1);\n }\n return <ScopedSetup key={generation} {...props} />;\n}\n\nfunction ScopedSetup({\n controller,\n onAuthorize,\n onBrowseResources,\n className,\n authorizeLabel = \"Authorize connection\",\n}: ConnectSetupProps) {\n const view = useConnect(controller);\n const [localError, setLocalError] = useState(false);\n const invoke = (operation: () => unknown | Promise<unknown>) => {\n setLocalError(false);\n try {\n void Promise.resolve(operation()).catch(() => setLocalError(true));\n } catch {\n setLocalError(true);\n }\n };\n const attempt = view.attempt;\n if (!attempt)\n return (\n <section\n className={[\"og-connect-setup\", className].filter(Boolean).join(\" \")}\n aria-label=\"Connection setup\"\n >\n <p role=\"status\">Choose a connection to begin.</p>\n </section>\n );\n const action = attempt.nextAction;\n const verificationUrl = deviceVerificationUrl(action);\n const terminal = [\"complete\", \"cancelled\", \"expired\"].includes(attempt.state);\n const submit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const form = event.currentTarget;\n const data = new FormData(form);\n if (view.busy) return;\n const key = crypto.randomUUID();\n if (action.type === \"credentials\") {\n const values = Object.fromEntries(\n action.fields.map((field, i) => [field.name, String(data.get(`field-${i}`) ?? \"\")]),\n );\n // Clear the DOM before awaiting remote work; controller never retains values.\n form.reset();\n invoke(() => view.advance({ type: \"credentials\", values }, key));\n } else if (action.type === \"select_account\") {\n const accountId = String(data.get(\"account\") ?? \"\");\n if (\n action.accounts.some((account) => account.id === accountId && account.status !== \"disabled\")\n )\n invoke(() => view.advance({ type: \"account\", accountId }, key));\n } else if (action.type === \"select_resources\") {\n if (action.cursor) return;\n const resourceIds = data.getAll(\"resource\").map(String);\n invoke(() => view.advance({ type: \"resources\", resourceIds }, key));\n } else if (action.type === \"preview\") {\n const operationIds = data.getAll(\"operation\").map(String);\n invoke(() =>\n view.advance(\n {\n type: \"install\",\n previewId: action.previewId,\n contentHash: action.contentHash,\n operationIds,\n },\n key,\n ),\n );\n }\n };\n return (\n <section\n className={[\"og-connect-setup\", className].filter(Boolean).join(\" \")}\n aria-label=\"Connection setup\"\n aria-busy={view.busy}\n >\n <div className=\"og-connect-setup-summary\">\n <p className=\"og-connect-setup-scope\">\n {attempt.ownership === \"personal\" ? \"Personal connection\" : \"Workspace connection\"}\n </p>\n <p role=\"status\" className=\"og-connect-setup-status\">\n {setupStatus[attempt.state]}\n </p>\n <p className=\"og-connect-setup-description\">\n {attempt.ownership === \"personal\"\n ? \"Only your work can use this connection.\"\n : \"Work in this workspace can use this connection.\"}\n </p>\n </div>\n {attempt.account && <p>Account: {attempt.account.label}</p>}\n {(localError || view.error || attempt.error) && (\n <p role=\"alert\">\n {attempt.error?.code === \"source_changed\"\n ? \"The integration source changed. Review the new operations before installing.\"\n : \"Connection setup could not continue. Refresh its status before trying again.\"}\n </p>\n )}\n {!terminal && (\n <form key={`${attempt.id}:${attempt.revision}`} onSubmit={submit} autoComplete=\"off\">\n <fieldset disabled={view.busy}>\n {[\"credentials\", \"select_account\", \"select_resources\", \"preview\"].includes(\n action.type,\n ) ? (\n <legend>Connection details</legend>\n ) : null}\n {attempt.state === \"connected_but_incomplete\" && action.type === \"none\" && (\n <button\n type=\"button\"\n className=\"og-connect-setup-primary\"\n onClick={() => invoke(() => view.advance({ type: \"retry\" }, crypto.randomUUID()))}\n >\n Review integration operations\n </button>\n )}\n {action.type === \"credentials\" &&\n action.fields.map((field, i) => (\n <label key={field.name}>\n {field.label}\n {field.options ? (\n <select name={`field-${i}`} required={field.required} defaultValue=\"\">\n <option value=\"\">\n {field.required ? \"Choose an option\" : \"No account (public service)\"}\n </option>\n {field.options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n ) : (\n <input\n name={`field-${i}`}\n type={field.secret ? \"password\" : \"text\"}\n required={field.required}\n autoComplete=\"off\"\n />\n )}\n </label>\n ))}\n {action.type === \"select_account\" && (\n <label>\n Account\n <select name=\"account\" required defaultValue=\"\">\n <option value=\"\" disabled>\n Choose an account\n </option>\n {action.accounts.map((account) => (\n <option\n key={account.id}\n value={account.id}\n disabled={account.status === \"disabled\"}\n >\n {account.label} — {account.id} ({account.ownership})\n </option>\n ))}\n </select>\n </label>\n )}\n {action.type === \"select_resources\" &&\n action.resources.map((resource) => (\n <label key={resource.id}>\n <input type=\"checkbox\" name=\"resource\" value={resource.id} />\n {resource.label} ({resource.kind})\n </label>\n ))}\n {action.type === \"select_resources\" && action.cursor && (\n <>\n <p>More resources are available. Review all pages before submitting a selection.</p>\n {onBrowseResources && (\n <button\n type=\"button\"\n onClick={() => invoke(() => onBrowseResources(structuredClone(attempt)))}\n >\n Browse all resources\n </button>\n )}\n </>\n )}\n {action.type === \"preview\" && (\n <>\n <p>Select the operations to install.</p>\n {action.operations.map((operation) => (\n <label key={operation.id}>\n <input type=\"checkbox\" name=\"operation\" value={operation.id} />\n {operation.label} ({operation.kind})\n </label>\n ))}\n </>\n )}\n {[\"credentials\", \"select_account\", \"select_resources\", \"preview\"].includes(\n action.type,\n ) && (\n <button\n type=\"submit\"\n className=\"og-connect-setup-primary\"\n disabled={action.type === \"select_resources\" && Boolean(action.cursor)}\n >\n {action.type === \"preview\" ? \"Install selected operations\" : \"Continue\"}\n </button>\n )}\n {action.type === \"authorize\" && (\n <button\n type=\"button\"\n className=\"og-connect-setup-primary\"\n onClick={() => invoke(() => onAuthorize(structuredClone(attempt)))}\n >\n {authorizeLabel}\n </button>\n )}\n {action.type === \"wait\" && (\n <>\n {action.userCode && (\n <p>\n Verification code: <code>{action.userCode}</code>\n </p>\n )}\n <p>Complete provider authorization, then check the connection status.</p>\n {verificationUrl && (\n <a href={verificationUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n Open provider verification page (new tab)\n </a>\n )}\n </>\n )}\n <div className=\"og-connect-setup-secondary\">\n <button type=\"button\" onClick={() => invoke(() => view.refresh())}>\n Check status\n </button>\n <button type=\"button\" onClick={() => invoke(() => view.cancel(crypto.randomUUID()))}>\n Cancel setup\n </button>\n </div>\n </fieldset>\n </form>\n )}\n </section>\n );\n}\n","import type { ReactNode } from \"react\";\nimport {\n CapabilityCatalogIndicator,\n CapabilityCatalogRow,\n type CapabilityCatalogStatus,\n} from \"./capability-catalog-row\";\n\n/** Status comes from the host/controller, never inferred from a display label. */\nexport type ConnectionCatalogOption = {\n id: string;\n name: string;\n description?: string | undefined;\n status: string;\n connected: boolean;\n /** Explicit health/availability. Omit to retain visible legacy status text. */\n state?: CapabilityCatalogStatus;\n onOpen: () => void;\n action?: ReactNode;\n};\nexport type ConnectionCatalogService = {\n id: string;\n name: string;\n logo?: ReactNode;\n options: ConnectionCatalogOption[];\n};\nexport type ConnectionCatalogProps = {\n services: ConnectionCatalogService[];\n query?: string;\n columns?: 1 | 2;\n resultLimit?: number;\n onShowMore?: () => void;\n /** Group capabilities by service, or show every capability independently. */\n grouped?: boolean;\n className?: string;\n emptyMessage?: string;\n};\n\nexport function ConnectionOptionRow({ option }: { option: ConnectionCatalogOption }) {\n return (\n <div className=\"og-connection-catalog-action-row og-connection-option\">\n <CapabilityCatalogRow\n name={option.name}\n description={option.description}\n status={option.state ?? (option.connected ? \"added\" : \"available\")}\n statusLabel={option.status}\n showStatusLabel={option.state === undefined}\n onOpen={option.onOpen}\n />\n {option.action ? <span className=\"og-connection-option-action\">{option.action}</span> : null}\n </div>\n );\n}\n\nexport function ConnectionServiceRow({ service }: { service: ConnectionCatalogService }) {\n if (!service.options.length) return null;\n const connected = service.options.filter((option) => option.connected).length;\n const attention = service.options.find(\n (option) => option.state === \"attention\" || option.state === \"unavailable\",\n );\n const groupState =\n attention?.state ??\n (service.options.some((option) => option.state === \"loading\")\n ? \"loading\"\n : connected === service.options.length\n ? \"added\"\n : \"available\");\n const identity = (\n <>\n <span className=\"og-capability-catalog-icon\">{service.logo}</span>\n <span className=\"og-capability-catalog-copy\">\n <strong>{service.name}</strong>\n <span>\n {service.options.length === 1\n ? service.options[0]?.description\n : service.options.map((option) => option.name).join(\" · \")}\n </span>\n </span>\n <CapabilityCatalogIndicator\n status={groupState}\n label={attention?.status ?? `${connected} of ${service.options.length} added`}\n />\n </>\n );\n return service.options.length === 1 ? (\n <div className=\"og-connection-catalog-action-row\">\n <CapabilityCatalogRow\n name={service.name}\n description={service.options[0]!.description}\n icon={service.logo}\n status={service.options[0]!.state ?? (connected ? \"added\" : \"available\")}\n statusLabel={service.options[0]!.status}\n showStatusLabel={service.options[0]!.state === undefined}\n onOpen={service.options[0]!.onOpen}\n />\n {service.options[0]?.action}\n </div>\n ) : (\n <details className=\"og-connection-catalog-service\">\n <summary className=\"og-capability-catalog-row\">\n {identity}\n <span aria-hidden className=\"og-connection-group-chevron\">\n ⌄\n </span>\n </summary>\n <div className=\"og-connection-catalog-options\">\n {service.options.map((option) => (\n <ConnectionOptionRow key={option.id} option={option} />\n ))}\n </div>\n </details>\n );\n}\n\nexport function ConnectionCatalog({\n services,\n query = \"\",\n columns = 1,\n grouped = true,\n resultLimit,\n onShowMore,\n className = \"\",\n emptyMessage = \"No connections match your search.\",\n}: ConnectionCatalogProps) {\n const search = query.trim().toLowerCase();\n const entries = grouped\n ? services\n : services.flatMap((service) =>\n service.options.map((option) => ({\n ...service,\n id: `${service.id}/${option.id}`,\n name:\n service.options.length > 1 && option.name !== service.name\n ? `${service.name} · ${option.name}`\n : service.name,\n options: [option],\n })),\n );\n const visible = entries.filter((service) =>\n [service.name, ...service.options.flatMap((option) => [option.name, option.description ?? \"\"])]\n .join(\" \")\n .toLowerCase()\n .includes(search),\n );\n return (\n <>\n <div className={`og-connection-catalog ${className}`} data-columns={columns}>\n {visible.length ? (\n visible\n .slice(0, resultLimit)\n .map((service) => <ConnectionServiceRow key={service.id} service={service} />)\n ) : (\n <p role=\"status\">{emptyMessage}</p>\n )}\n </div>\n {resultLimit && visible.length > resultLimit ? (\n <button className=\"og-catalog-more\" type=\"button\" onClick={onShowMore}>\n View all connections\n </button>\n ) : null}\n </>\n );\n}\n","import { ConnectionCatalog } from \"./connection-catalog\";\nimport { useEffect, useState, type FormEvent } from \"react\";\nimport type { ConnectController, ConnectProvider } from \"@opengeni/connect\";\nimport { useConnect } from \"./connect\";\n\nexport type ConnectChooserProps = {\n controller: ConnectController;\n /** Exact host return string; no completion parameters are added. */\n returnUrl: string;\n className?: string;\n presentation?: \"select\" | \"catalog\";\n};\n\n/** Catalog readiness is supplied by the authenticated backend, never inferred\n * from the existence of a provider definition. Host replaces the controller on\n * actor/workspace change. This form does not open OAuth windows itself. */\nexport function ConnectChooser(props: ConnectChooserProps) {\n // Remount scope-local selections synchronously when the controller changes,\n // before effects can expose a previous actor's inventory for one frame.\n const [scope, setScope] = useState(props.controller);\n const [generation, setGeneration] = useState(0);\n if (scope !== props.controller) {\n setScope(props.controller);\n setGeneration(generation + 1);\n }\n return <ScopedChooser key={generation} {...props} />;\n}\n\nfunction ScopedChooser({\n controller,\n returnUrl,\n className,\n presentation = \"select\",\n}: ConnectChooserProps) {\n const view = useConnect(controller);\n const [catalog, setCatalog] = useState<ConnectProvider[] | null>(null);\n const [failed, setFailed] = useState(false);\n const [load, setLoad] = useState(0);\n const [query, setQuery] = useState(\"\");\n const [providerId, setProviderId] = useState(\"\");\n const [ownership, setOwnership] = useState(\"\");\n useEffect(() => {\n const abort = new AbortController();\n setCatalog(null);\n setFailed(false);\n setProviderId(\"\");\n setOwnership(\"\");\n // Promise boundary also handles a synchronously throwing injected transport.\n void Promise.resolve()\n .then(() => {\n abort.signal.throwIfAborted();\n return controller.transport.catalog(controller.workspaceId, { signal: abort.signal });\n })\n .then((providers) => {\n if (!abort.signal.aborted) setCatalog(structuredClone(providers));\n })\n .catch(() => {\n if (!abort.signal.aborted) setFailed(true);\n });\n return () => abort.abort();\n }, [controller, load]);\n const provider = catalog?.find((entry) => entry.id === providerId);\n const canBegin =\n provider?.readiness === \"available\" &&\n (ownership === \"personal\" || ownership === \"workspace\") &&\n provider.ownership.includes(ownership);\n const submit = (event: FormEvent) => {\n event.preventDefault();\n if (!canBegin || view.busy || (ownership !== \"personal\" && ownership !== \"workspace\")) return;\n setFailed(false);\n try {\n void controller\n .begin({ providerId, ownership, returnUrl, idempotencyKey: crypto.randomUUID() })\n .catch(() => setFailed(true));\n } catch {\n setFailed(true);\n }\n };\n return (\n <section\n className={className}\n aria-label=\"Choose a connection\"\n aria-busy={view.busy || (!catalog && !failed)}\n >\n {failed && (\n <p role=\"alert\">\n Connections could not be loaded or started. Check setup status before retrying.\n </p>\n )}\n {!catalog && !failed && <p role=\"status\">Loading connections…</p>}\n {catalog?.length === 0 && <p role=\"status\">No connections are available.</p>}\n {Boolean(catalog?.length) && (\n <form onSubmit={submit}>\n <fieldset disabled={view.busy}>\n <legend>Provider and ownership</legend>\n {presentation === \"catalog\" && !provider ? (\n <>\n <label>\n Search connections\n <input\n type=\"search\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n />\n </label>\n <ConnectionCatalog\n query={query}\n services={catalog!.map((entry) => ({\n id: entry.id,\n name: entry.label,\n options: [\n {\n id: entry.id,\n name: entry.label,\n description: entry.reason,\n status: entry.readiness.replaceAll(\"_\", \" \"),\n connected: false,\n onOpen: () => {\n if (!view.busy) {\n setProviderId(entry.id);\n setOwnership(entry.ownership.length === 1 ? entry.ownership[0]! : \"\");\n }\n },\n },\n ],\n }))}\n />\n </>\n ) : null}\n {presentation === \"catalog\" && provider ? (\n <button\n type=\"button\"\n onClick={() => {\n setProviderId(\"\");\n setOwnership(\"\");\n }}\n >\n Back to connections\n </button>\n ) : null}\n <label hidden={presentation === \"catalog\"}>\n Provider\n <select\n required\n value={providerId}\n onChange={(event) => {\n setProviderId(event.target.value);\n setOwnership(\"\");\n }}\n >\n <option value=\"\" disabled>\n Choose a provider\n </option>\n {catalog!.map((entry) => (\n <option\n key={entry.id}\n value={entry.id}\n disabled={entry.readiness !== \"available\" || entry.ownership.length === 0}\n >\n {entry.label} — {entry.id} ({entry.readiness.replaceAll(\"_\", \" \")})\n </option>\n ))}\n </select>\n </label>\n {provider && (\n <>\n <strong>{presentation === \"catalog\" ? provider.label : null}</strong>\n <label>\n Ownership\n <select\n required\n value={ownership}\n onChange={(event) => setOwnership(event.target.value)}\n >\n <option value=\"\" disabled>\n Choose ownership\n </option>\n {provider.ownership.map((choice) => (\n <option key={choice} value={choice}>\n {choice === \"personal\"\n ? \"Personal — owned by you\"\n : \"Workspace — shared connection\"}\n </option>\n ))}\n </select>\n </label>\n </>\n )}\n <button\n hidden={presentation === \"catalog\" && !provider}\n type=\"submit\"\n disabled={!canBegin}\n >\n Start setup\n </button>\n </fieldset>\n </form>\n )}\n <button type=\"button\" disabled={view.busy} onClick={() => setLoad(load + 1)}>\n Reload providers\n </button>\n </section>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { ConnectAccount, ConnectController } from \"@opengeni/connect\";\nimport { useConnect } from \"./connect\";\n\nexport type ConnectAccountsProps = {\n controller: ConnectController;\n className?: string;\n /** Enables explicit account-bound reconnect. Host supplies the exact destination. */\n returnUrl?: string;\n};\n\n/** Local credential revocation only. Unknown or changed versions must be\n * refreshed; this component never retries a destructive operation implicitly. */\nexport function ConnectAccounts(props: ConnectAccountsProps) {\n const [scope, setScope] = useState(props.controller);\n const [generation, setGeneration] = useState(0);\n if (scope !== props.controller) {\n setScope(props.controller);\n setGeneration(generation + 1);\n }\n return <ScopedAccounts key={generation} {...props} />;\n}\n\nfunction ScopedAccounts({ controller, className, returnUrl }: ConnectAccountsProps) {\n const view = useConnect(controller);\n const [accounts, setAccounts] = useState<ConnectAccount[] | null>(null);\n const [selected, setSelected] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState(false);\n const [reload, setReload] = useState(0);\n const mutation = useRef<AbortController | null>(null);\n useEffect(() => () => mutation.current?.abort(), []);\n useEffect(() => {\n const abort = new AbortController();\n setAccounts(null);\n setSelected(null);\n setError(false);\n void Promise.resolve()\n .then(() => {\n abort.signal.throwIfAborted();\n return controller.transport.accounts(controller.workspaceId, { signal: abort.signal });\n })\n .then((result) => {\n if (!abort.signal.aborted) setAccounts(structuredClone(result));\n })\n .catch(() => {\n if (!abort.signal.aborted) setError(true);\n });\n return () => abort.abort();\n }, [controller, reload]);\n\n const disconnect = async (account: ConnectAccount) => {\n const expectedVersion = account.version;\n if (\n mutation.current ||\n view.busy ||\n expectedVersion === undefined ||\n !Number.isSafeInteger(expectedVersion) ||\n expectedVersion < 1\n )\n return;\n const abort = new AbortController();\n mutation.current = abort;\n setBusy(true);\n setError(false);\n try {\n await controller.transport.disconnect(controller.workspaceId, account.id, {\n expectedVersion,\n signal: abort.signal,\n });\n if (!abort.signal.aborted) setReload((value) => value + 1);\n } catch {\n if (!abort.signal.aborted) {\n // Outcome may be unknown. Drop the inventory so a second click cannot\n // replay against the stale selection; let the host reload live state.\n setAccounts(null);\n setError(true);\n }\n } finally {\n if (!abort.signal.aborted) {\n mutation.current = null;\n setBusy(false);\n setSelected(null);\n }\n }\n };\n const reconnect = async (account: ConnectAccount) => {\n if (!returnUrl || mutation.current || view.busy) return;\n setError(false);\n try {\n await controller.begin({\n providerId: account.providerId,\n ownership: account.ownership,\n reconnectAccountId: account.id,\n returnUrl,\n idempotencyKey: crypto.randomUUID(),\n });\n } catch {\n setError(true);\n }\n };\n\n return (\n <section\n className={className}\n aria-label=\"Connected accounts\"\n aria-busy={busy || view.busy || (!accounts && !error)}\n >\n {error && (\n <p role=\"alert\">Account state could not be confirmed. Reload before trying again.</p>\n )}\n {!accounts && !error && <p role=\"status\">Loading accounts…</p>}\n {accounts?.length === 0 && <p role=\"status\">No connected accounts.</p>}\n {accounts && accounts.length > 0 && (\n <ul>\n {accounts.map((account) => (\n <li key={`${account.providerId}:${account.id}`}>\n <span>\n {account.label} — {account.providerId} — {account.ownership} —{\" \"}\n {account.status.replaceAll(\"_\", \" \")}\n </span>\n {returnUrl && (\n <button\n type=\"button\"\n disabled={busy || view.busy || account.status === \"disabled\"}\n onClick={() => void reconnect(account)}\n >\n Reconnect {account.label}\n </button>\n )}\n {selected === `${account.providerId}:${account.id}` ? (\n <div role=\"group\" aria-label={`Disconnect ${account.label}`}>\n <p>\n This removes local OpenGeni access. It does not revoke consent at the provider.\n </p>\n <button\n type=\"button\"\n disabled={busy || view.busy}\n onClick={() => void disconnect(account)}\n >\n Confirm disconnect\n </button>\n <button type=\"button\" disabled={busy} onClick={() => setSelected(null)}>\n Keep account\n </button>\n </div>\n ) : (\n <button\n type=\"button\"\n disabled={\n busy ||\n view.busy ||\n account.status === \"disabled\" ||\n !Number.isSafeInteger(account.version) ||\n account.version! < 1\n }\n onClick={() => setSelected(`${account.providerId}:${account.id}`)}\n >\n Disconnect {account.label}\n </button>\n )}\n </li>\n ))}\n </ul>\n )}\n <button type=\"button\" disabled={busy} onClick={() => setReload((value) => value + 1)}>\n Reload accounts\n </button>\n </section>\n );\n}\n","import { ConnectAccounts } from \"./connect-accounts\";\nimport { ConnectChooser } from \"./connect-chooser\";\nimport { ConnectSetup, type ConnectSetupProps } from \"./connect-setup\";\nimport { useConnect } from \"./connect\";\n\nexport type ConnectPanelProps = ConnectSetupProps & {\n returnUrl: string;\n /** Null omits the heading when the host already supplies one. */\n title?: string | null;\n showAccounts?: boolean;\n presentation?: \"select\" | \"catalog\";\n};\n\n/** Optional composition over the same unstyled surfaces. Import\n * @opengeni/react/connect.css for styling; the host retains navigation,\n * transport, actor admission, and controller lifetime. */\nexport function ConnectPanel({\n returnUrl,\n title = \"Connections\",\n showAccounts = true,\n presentation = \"select\",\n className,\n ...setup\n}: ConnectPanelProps) {\n const { attempt } = useConnect(setup.controller);\n // Unknown/failed outcomes still need reconciliation or cancellation, not a\n // competing new acquisition. Unmounting observers never cancels controller work.\n const activeSetup =\n attempt !== null && ![\"complete\", \"cancelled\", \"expired\"].includes(attempt.state);\n return (\n <div className={[\"og-connect\", className].filter(Boolean).join(\" \")}>\n {title !== null && <h2>{title}</h2>}\n {!activeSetup && (\n <ConnectChooser\n presentation={presentation}\n controller={setup.controller}\n returnUrl={returnUrl}\n />\n )}\n <ConnectSetup {...setup} />\n {showAccounts && !activeSetup && (\n <ConnectAccounts controller={setup.controller} returnUrl={returnUrl} />\n )}\n </div>\n );\n}\n","import { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { copyTextToClipboard } from \"./clipboard\";\n\nexport type DeviceAuthorizationProps = {\n userCode: string;\n verificationUri: string;\n providerLabel?: string;\n description?: string;\n className?: string;\n codeAttributes?: Record<`data-${string}`, string>;\n loadClipboard?: () => Promise<{ copyTextToClipboard(text: string): Promise<boolean> }>;\n onCopyResult?: (copied: boolean) => void;\n /** Optional host presentation; clipboard state and URL validation remain shared. */\n render?: (state: {\n copied: boolean;\n copyError: boolean;\n copy: () => Promise<void>;\n verificationHref: string | undefined;\n }) => ReactNode;\n};\n\n/** Optional presentation for the existing model-account device APIs. It neither\n * owns provider state nor assumes that opening a verification page completed it. */\nexport function DeviceAuthorization(props: DeviceAuthorizationProps) {\n const [copied, setCopied] = useState(false);\n const [copyError, setCopyError] = useState(false);\n const generation = useRef(0);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(() => {\n generation.current++;\n setCopied(false);\n setCopyError(false);\n return () => {\n // This is a live async-operation counter, not a captured DOM ref.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n generation.current++;\n if (timer.current) clearTimeout(timer.current);\n };\n }, [props.userCode]);\n async function copy() {\n const revision = ++generation.current;\n if (timer.current) clearTimeout(timer.current);\n setCopied(false);\n setCopyError(false);\n try {\n const clipboard = props.loadClipboard ? await props.loadClipboard() : { copyTextToClipboard };\n if (revision !== generation.current) return;\n const success = await clipboard.copyTextToClipboard(props.userCode);\n if (revision !== generation.current) return;\n setCopied(success);\n setCopyError(!success);\n props.onCopyResult?.(success);\n if (success)\n timer.current = setTimeout(() => {\n if (revision === generation.current) setCopied(false);\n }, 1600);\n } catch {\n if (revision !== generation.current) return;\n setCopyError(true);\n props.onCopyResult?.(false);\n }\n }\n let href: string | undefined;\n try {\n const url = new URL(props.verificationUri);\n if ([\"https:\", \"http:\"].includes(url.protocol) && !url.username && !url.password)\n href = props.verificationUri;\n } catch {\n /* A malformed provider URL must never become an executable link. */\n }\n if (props.render) return props.render({ copied, copyError, copy, verificationHref: href });\n return (\n <section className={`og-connect ${props.className ?? \"\"}`} aria-label=\"Device authorization\">\n <p>{props.description ?? `Enter this code at ${props.providerLabel ?? \"the provider\"}.`}</p>\n <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: \"0.5rem\", alignItems: \"center\" }}>\n <code {...props.codeAttributes} style={{ overflowWrap: \"anywhere\" }}>\n {props.userCode}\n </code>\n <button\n type=\"button\"\n aria-label={copied ? \"Code copied\" : \"Copy code\"}\n onClick={() => void copy()}\n >\n {copied ? \"Copied\" : \"Copy code\"}\n </button>\n {href ? (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\">\n Open {props.providerLabel ?? \"auth page\"}\n </a>\n ) : (\n <span role=\"alert\">Authorization address unavailable.</span>\n )}\n </div>\n {copyError ? <p role=\"alert\">Couldn't copy the code. Copy it manually instead.</p> : null}\n <p role=\"status\">Waiting for authorization…</p>\n </section>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type {\n ExternalIdentityLink,\n ConfirmExternalIdentityLinkRequest,\n ExternalIdentityLinkPreview,\n} from \"@opengeni/sdk\";\n\nexport type IdentityLinkClient = {\n previewIdentityLink(\n workspaceId: string,\n linkId: string,\n challenge: string,\n ): Promise<ExternalIdentityLinkPreview>;\n confirmIdentityLink(\n workspaceId: string,\n linkId: string,\n input: ConfirmExternalIdentityLinkRequest,\n ): Promise<ExternalIdentityLink>;\n revokeIdentityLink(\n workspaceId: string,\n linkId: string,\n expectedRevision: number,\n ): Promise<ExternalIdentityLink>;\n};\nexport type IdentityLinkConsentProps = {\n client: IdentityLinkClient;\n workspaceId: string;\n linkId: string;\n challenge: string;\n /** Host label is explanatory, never proof of the requesting application. */\n className?: string;\n onComplete?: (link: ExternalIdentityLink) => void;\n};\n\n/** Optional native-login consent. Ordinary Connect does not use this surface.\n * Permission choices only narrow the server's request; no automatic approval. */\nexport function IdentityLinkConsent({\n client,\n workspaceId,\n linkId,\n challenge,\n className,\n onComplete,\n}: IdentityLinkConsentProps) {\n const [link, setLink] = useState<ExternalIdentityLink | null>(null);\n const [preview, setPreview] = useState<ExternalIdentityLinkPreview | null>(null);\n const [selected, setSelected] = useState<ExternalIdentityLink[\"permissions\"]>([]);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState(false);\n const [retry, setRetry] = useState(0);\n const generation = useRef(0);\n useEffect(() => {\n const current = ++generation.current;\n setLink(null);\n setPreview(null);\n setSelected([]);\n setBusy(true);\n setError(false);\n void client\n .previewIdentityLink(workspaceId, linkId, challenge)\n .then(\n (result) => {\n if (generation.current !== current) return;\n setPreview(result);\n setLink(result.link);\n setSelected(result.link.permissions);\n },\n () => {\n if (generation.current === current) setError(true);\n },\n )\n .finally(() => {\n if (generation.current === current) setBusy(false);\n });\n return () => {\n // Invalidate live async work, rather than cleaning up a captured DOM node.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n generation.current++;\n };\n }, [client, workspaceId, linkId, challenge, retry]);\n async function mutate(revoke: boolean) {\n if (!link || busy) return;\n const current = generation.current;\n setBusy(true);\n setError(false);\n try {\n const result = revoke\n ? await client.revokeIdentityLink(workspaceId, linkId, link.revision)\n : await client.confirmIdentityLink(workspaceId, linkId, {\n challenge,\n expectedRevision: link.revision,\n permissions: selected,\n });\n if (generation.current !== current) return;\n setLink(result);\n onComplete?.(result);\n } catch {\n if (generation.current === current) setError(true);\n } finally {\n if (generation.current === current) setBusy(false);\n }\n }\n return (\n <section\n className={[\"og-connect og-identity-link\", className].filter(Boolean).join(\" \")}\n aria-label=\"Link your account\"\n aria-busy={busy}\n >\n <h2>Link your OpenGeni account</h2>\n <p>\n Only continue if you started this request in a product you trust. Linking lets that product\n act as your account with the permissions you select. It does not merge accounts or move\n existing work.\n </p>\n {preview && (\n <dl>\n <dt>Organization</dt>\n <dd>{preview.organizationId}</dd>\n <dt>Product user</dt>\n <dd>\n {preview.externalIdentity.externalId} ({preview.externalIdentity.source})\n </dd>\n <dt>Your OpenGeni identity</dt>\n <dd>{preview.nativeSubjectId}</dd>\n </dl>\n )}\n {error && (\n <div role=\"alert\">\n This request could not be completed. It may have expired, changed, or require you to sign\n in to the right organization.\n {!link && (\n <button type=\"button\" disabled={busy} onClick={() => setRetry((value) => value + 1)}>\n Try again\n </button>\n )}\n </div>\n )}\n {!link && busy && <p role=\"status\">Loading the account-link request…</p>}\n {link?.status === \"pending\" && (\n <>\n <p>\n {link.expiresAt\n ? `Access ends ${new Date(link.expiresAt).toLocaleString()}.`\n : \"Access lasts until you or the product revoke this link.\"}{\" \"}\n Your current permissions still apply.\n </p>\n <fieldset disabled={busy}>\n <legend>Allow these permissions</legend>\n {link.permissions.map((permission) => (\n <label key={permission}>\n <input\n type=\"checkbox\"\n checked={selected.includes(permission)}\n onChange={(event) =>\n setSelected((values) =>\n event.target.checked\n ? [...values, permission]\n : values.filter((value) => value !== permission),\n )\n }\n />\n <span>{permission.replaceAll(\":\", \" · \")}</span>\n </label>\n ))}\n </fieldset>\n <button\n type=\"button\"\n disabled={busy || selected.length === 0}\n onClick={() => void mutate(false)}\n >\n {busy ? \"Saving…\" : \"Allow selected access\"}\n </button>\n <p>You can close this page without granting access.</p>\n </>\n )}\n {link?.status === \"active\" && (\n <>\n <p role=\"status\">Account linked. Return to your product to continue.</p>\n <button type=\"button\" disabled={busy} onClick={() => void mutate(true)}>\n Revoke this link\n </button>\n </>\n )}\n {link?.status === \"revoked\" && (\n <p role=\"status\">Link revoked. Your OpenGeni account and existing work are unchanged.</p>\n )}\n {link?.status === \"expired\" && (\n <p role=\"status\">This request has expired. Start a new request from your product.</p>\n )}\n </section>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { ExternalIdentityLink, ExternalIdentityLinkPage } from \"@opengeni/sdk\";\n\nexport type IdentityLinkAccountsClient = {\n listIdentityLinks(workspaceId: string, cursor?: string): Promise<ExternalIdentityLinkPage>;\n revokeIdentityLink(\n workspaceId: string,\n linkId: string,\n expectedRevision: number,\n ): Promise<ExternalIdentityLink>;\n};\n\n/** Participant-scoped inventory. Revocation never deletes native work or merges\n * identities. The caller remounts this component when the signed-in user changes. */\nexport function IdentityLinkAccounts({\n client,\n workspaceId,\n}: {\n client: IdentityLinkAccountsClient;\n workspaceId: string;\n}) {\n const [links, setLinks] = useState<ExternalIdentityLink[]>([]);\n const [cursor, setCursor] = useState<string | null>(null);\n const [busy, setBusy] = useState(true);\n const [error, setError] = useState(false);\n const [revision, setRevision] = useState(0);\n const generation = useRef(0);\n const inFlight = useRef(false);\n useEffect(() => {\n const current = ++generation.current;\n inFlight.current = true;\n setLinks([]);\n setCursor(null);\n setBusy(true);\n setError(false);\n void client\n .listIdentityLinks(workspaceId)\n .then(\n (page) => {\n if (current !== generation.current) return;\n setLinks(page.links);\n setCursor(page.nextCursor);\n },\n () => {\n if (current === generation.current) setError(true);\n },\n )\n .finally(() => {\n if (current === generation.current) {\n inFlight.current = false;\n setBusy(false);\n }\n });\n return () => {\n // Invalidate live async work, rather than cleaning up a captured DOM node.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n generation.current++;\n };\n }, [client, workspaceId, revision]);\n\n async function act(link?: ExternalIdentityLink) {\n if (inFlight.current || (!link && !cursor)) return;\n const current = generation.current;\n inFlight.current = true;\n setBusy(true);\n setError(false);\n try {\n if (link) {\n const updated = await client.revokeIdentityLink(workspaceId, link.id, link.revision);\n if (current === generation.current)\n setLinks((values) =>\n values.map((value) => (value.id === updated.id ? { ...value, ...updated } : value)),\n );\n } else {\n const page = await client.listIdentityLinks(workspaceId, cursor!);\n if (current === generation.current) {\n setLinks((values) => [\n ...new Map([...values, ...page.links].map((value) => [value.id, value])).values(),\n ]);\n setCursor(page.nextCursor);\n }\n }\n } catch {\n if (current === generation.current) setError(true);\n } finally {\n if (current === generation.current) {\n inFlight.current = false;\n setBusy(false);\n }\n }\n }\n return (\n <section\n className=\"og-connect og-identity-link\"\n aria-label=\"Linked product access\"\n aria-busy={busy}\n >\n <h2>Linked product access</h2>\n <p>\n Manage products allowed to act as your account in this organization. Revoking a link stops\n future linked access; it does not delete your work or undo an operation already started.\n </p>\n {error && (\n <div role=\"alert\">\n Could not update account links. Reload to see current access.\n <button type=\"button\" disabled={busy} onClick={() => setRevision((value) => value + 1)}>\n Reload links\n </button>\n </div>\n )}\n {busy && <p role=\"status\">Loading account links…</p>}\n {!busy && !error && links.length === 0 && (\n <p>No products have linked access to this account.</p>\n )}\n <ul>\n {links.map((link) => (\n <li key={link.id}>\n <p>\n {link.externalIdentity?.source || \"Product identity\"}{\" \"}\n <code>{link.externalIdentity?.externalId ?? link.externalIdentityId}</code>\n </p>\n <p>\n Status: {link.status}.{\" \"}\n {link.expiresAt\n ? `Expires ${new Date(link.expiresAt).toLocaleString()}.`\n : \"No automatic expiry.\"}\n </p>\n <p>{link.permissions.join(\", \")}</p>\n {(link.status === \"active\" || link.status === \"pending\") && (\n <button type=\"button\" disabled={busy} onClick={() => void act(link)}>\n Revoke access\n </button>\n )}\n </li>\n ))}\n </ul>\n {cursor && (\n <button type=\"button\" disabled={busy} onClick={() => void act()}>\n Load more links\n </button>\n )}\n </section>\n );\n}\n","import type { ReactNode } from \"react\";\n\nexport type ConnectionInstalledItem = {\n id: string;\n name: string;\n status: string;\n icon?: ReactNode;\n needsAttention?: boolean;\n disabled?: boolean;\n onOpen: () => void;\n};\n\n/** Compact account/service shortcuts. The host supplies authoritative status. */\nexport function ConnectionInstalled({\n items,\n title = \"Connected\",\n className = \"\",\n}: {\n items: ConnectionInstalledItem[];\n title?: string;\n className?: string;\n}) {\n if (!items.length) return null;\n return (\n <section aria-label={title} className={`og-connection-installed ${className}`}>\n <h2>\n {title} <span>{items.length}</span>\n </h2>\n <div>\n {items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n onClick={item.onOpen}\n disabled={item.disabled}\n title={item.status}\n aria-label={`${item.name} · ${item.status}`}\n >\n {item.icon}\n <span>{item.name}</span>\n {item.needsAttention ? <span aria-label=\"Needs attention\">!</span> : null}\n </button>\n ))}\n </div>\n </section>\n );\n}\n","import { useId } from \"react\";\nexport type ConnectionType = \"mcp\" | \"openapi\" | \"graphql\";\nexport function ConnectionTypePicker({\n value,\n onChange,\n disabled = false,\n}: {\n value: ConnectionType;\n onChange: (value: ConnectionType) => void;\n disabled?: boolean;\n}) {\n const name = useId();\n return (\n <fieldset className=\"og-connection-type-picker\" disabled={disabled}>\n <legend>Connection type</legend>\n {(\n [\n [\"mcp\", \"MCP server\"],\n [\"openapi\", \"OpenAPI\"],\n [\"graphql\", \"GraphQL\"],\n ] as const\n ).map(([type, label]) => (\n <label key={type} data-selected={value === type}>\n <input\n type=\"radio\"\n name={name}\n value={type}\n checked={value === type}\n onChange={() => onChange(type)}\n />\n {label}\n </label>\n ))}\n </fieldset>\n );\n}\n","import { useState, type ReactNode } from \"react\";\n/** Brand identifier; failed/missing assets use the supplied fallback or stable initials. */\nexport function ConnectionLogo({\n src,\n name,\n size = 40,\n fallback,\n}: {\n src: string | null;\n name: string;\n size?: number;\n fallback?: ReactNode;\n}) {\n const [failedSrc, setFailedSrc] = useState<string | null>(null);\n return (\n <span className=\"og-connection-logo\" aria-hidden=\"true\" style={{ width: size, height: size }}>\n {src && src !== failedSrc ? (\n <img src={src} alt=\"\" loading=\"lazy\" decoding=\"async\" onError={() => setFailedSrc(src)} />\n ) : (\n (fallback ?? (\n <span>\n {name\n .split(/\\s+/)\n .map((part) => part[0])\n .join(\"\")\n .slice(0, 2)\n .toUpperCase()}\n </span>\n ))\n )}\n </span>\n );\n}\n","import { createDiscoveryCache } from \"./discovery-cache\";\nimport { useEffect, useRef, useState } from \"react\";\nimport type { PluginDiscoveryItem, PluginDiscoveryPage } from \"@opengeni/sdk\";\nimport { BoxesIcon } from \"lucide-react\";\nimport { CapabilityCatalogRow } from \"./capability-catalog-row\";\nimport { ConnectionLogo } from \"./connection-logo\";\n\nconst discoveryCache = createDiscoveryCache<PluginDiscoveryPage>();\nconst EMPTY_INSTALLED_IDS: ReadonlySet<string> = new Set();\n\nexport type PluginDiscoveryProps = {\n client: {\n discoverPlugins(\n workspaceId: string,\n options?: { query?: string; provider?: string; offset?: number },\n ): Promise<PluginDiscoveryPage>;\n };\n workspaceId: string;\n query: string;\n /** Discovery identities already installed in the current workspace. */\n installedIds?: ReadonlySet<string>;\n resultLimit?: number;\n onShowMore?: () => void;\n onOpen: (item: PluginDiscoveryItem) => void;\n};\nexport function PluginDiscovery(props: PluginDiscoveryProps) {\n const [provider, setProvider] = useState(\"\");\n return (\n <section\n className={`og-plugin-discovery ${props.resultLimit ? \"og-catalog-overview\" : \"\"}`}\n aria-label=\"Discover plugins\"\n >\n <header>\n <h3>{props.resultLimit ? \"Plugins\" : \"Browse plugins\"}</h3>\n {!props.resultLimit ? (\n <div className=\"og-plugin-filters\" role=\"group\" aria-label=\"Plugin registry\">\n {[\n { value: \"\", label: \"All\" },\n { value: \"openai\", label: \"OpenAI plugin registry\" },\n { value: \"anthropic\", label: \"Anthropic plugin registry\" },\n ].map((option) => (\n <button\n key={option.value}\n type=\"button\"\n aria-pressed={provider === option.value}\n onClick={() => setProvider(option.value)}\n >\n {option.label}\n </button>\n ))}\n </div>\n ) : null}\n </header>\n <Results\n key={`${props.workspaceId}:${props.query}:${provider}`}\n {...props}\n provider={provider}\n />\n </section>\n );\n}\nfunction Results({\n client,\n workspaceId,\n query,\n provider,\n installedIds = EMPTY_INSTALLED_IDS,\n onOpen,\n resultLimit,\n onShowMore,\n}: PluginDiscoveryProps & { provider: string }) {\n const initial = discoveryCache.peek(client, JSON.stringify([workspaceId, query, provider, 0]));\n const [items, setItems] = useState<PluginDiscoveryItem[]>(initial?.items ?? []);\n const [offset, setOffset] = useState(0);\n const [next, setNext] = useState<number | null>(initial?.nextOffset ?? null);\n const [total, setTotal] = useState(initial?.total ?? 0);\n const [loading, setLoading] = useState(!initial);\n const [error, setError] = useState(false);\n const [retry, setRetry] = useState(0);\n const sentinel = useRef<HTMLDivElement>(null);\n useEffect(() => {\n let active = true;\n const cacheKey = JSON.stringify([workspaceId, query, provider, offset]);\n const cached = discoveryCache.peek(client, cacheKey);\n setLoading(!cached);\n setError(false);\n const timer = setTimeout(\n () => {\n void discoveryCache\n .read(client, cacheKey, () =>\n client.discoverPlugins(workspaceId, { query, provider, offset }),\n )\n .then(\n (page) => {\n if (!active) return;\n setItems((previous) => (offset ? [...previous, ...page.items] : page.items));\n setTotal(page.total);\n setNext(page.nextOffset);\n setLoading(false);\n },\n () => {\n if (active) {\n setError(true);\n setLoading(false);\n }\n },\n );\n },\n cached || offset ? 0 : 200,\n );\n return () => {\n active = false;\n clearTimeout(timer);\n };\n }, [client, workspaceId, query, provider, offset, retry]);\n useEffect(() => {\n if (resultLimit || loading || error || next === null || !sentinel.current) return;\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) setOffset(next);\n },\n { rootMargin: \"200px\" },\n );\n observer.observe(sentinel.current);\n return () => observer.disconnect();\n }, [loading, error, next, resultLimit]);\n return (\n <>\n {!loading && !error ? (\n <p role=\"status\">\n {total ? `${total} plugins` : \"No matching plugins. Try another search or registry.\"}\n </p>\n ) : null}\n <div className=\"og-plugin-discovery-grid\">\n {items.slice(0, resultLimit).map((item) => (\n <CapabilityCatalogRow\n key={item.id}\n data-plugin-id={item.id}\n name={item.displayName.replace(/-/g, \" \")}\n description={item.description}\n status={installedIds.has(item.id) ? \"added\" : \"available\"}\n statusLabel={installedIds.has(item.id) ? \"Installed\" : \"Available to install\"}\n onOpen={() => onOpen(item)}\n icon={\n <ConnectionLogo\n src={item.logoUrl}\n name={item.displayName}\n fallback={<BoxesIcon aria-hidden=\"true\" />}\n />\n }\n />\n ))}\n </div>\n {loading ? <p role=\"status\">Loading plugins…</p> : null}\n {error ? (\n <p role=\"alert\">\n Couldn’t load plugins.{\" \"}\n <button type=\"button\" onClick={() => setRetry((value) => value + 1)}>\n Retry\n </button>\n </p>\n ) : null}\n {resultLimit && !loading && !error && total > resultLimit ? (\n <button className=\"og-catalog-more\" type=\"button\" onClick={onShowMore}>\n View all plugins\n </button>\n ) : null}\n <div ref={sentinel}>\n {!resultLimit && next !== null && !loading && !error ? (\n <button className=\"og-plugin-more\" type=\"button\" onClick={() => setOffset(next)}>\n Show more plugins\n </button>\n ) : null}\n </div>\n </>\n );\n}\n","import { useState } from \"react\";\nimport { pluginMcpUnavailableReason, type PluginDiscoveryItem } from \"@opengeni/sdk\";\nimport { BoxesIcon } from \"lucide-react\";\nimport { Markdown } from \"./components/markdown\";\nimport { ConnectionLogo } from \"./connection-logo\";\n\nconst componentLabels: Record<string, string> = {\n skills: \"Skills\",\n mcp: \"MCP connections\",\n apps: \"Hosted apps\",\n hooks: \"Hooks\",\n agents: \"Agents\",\n commands: \"Commands\",\n lsp: \"Language servers\",\n};\n\nconst EMPTY_CONNECTIONS: Record<string, boolean> = {};\n\n/** Embeddable plugin overview. Hosts own the dialog and installation actions. */\nexport function PluginDetails({\n item,\n onInstall,\n busy = false,\n installed = false,\n error,\n connections = EMPTY_CONNECTIONS,\n onConnect,\n}: {\n item: PluginDiscoveryItem;\n onInstall?: () => void;\n busy?: boolean;\n installed?: boolean;\n error?: string | null;\n connections?: Record<string, boolean>;\n onConnect?: (server: { name: string; endpoint: string | null }) => void;\n}) {\n const supported = (server: NonNullable<PluginDiscoveryItem[\"mcpServers\"]>[number]) =>\n pluginMcpUnavailableReason(server) === null;\n const contentsUnknown = item.skills == null || item.mcpServers == null;\n const installableCount =\n (item.skills?.length ?? 0) + (item.mcpServers?.filter(supported).length ?? 0);\n const exceedsInstallLimit = installableCount > 64;\n const installable = !contentsUnknown && installableCount > 0 && !exceedsInstallLimit;\n const [expanded, setExpanded] = useState(false);\n const description = item.longDescription || item.description;\n const lengthy = description.length > 700;\n const registryLabel =\n item.provider === \"openai\"\n ? \"OpenAI plugin registry\"\n : item.provider === \"anthropic\"\n ? \"Anthropic plugin registry\"\n : \"Custom source\";\n return (\n <article className=\"og-plugin-details\">\n <header className=\"og-plugin-details-header\">\n <ConnectionLogo\n src={item.logoUrl}\n name={item.displayName}\n fallback={<BoxesIcon aria-hidden=\"true\" />}\n />\n <div>\n <h2>{item.displayName.replace(/-/g, \" \")}</h2>\n {item.author?.name ? <p>By {item.author.name}</p> : null}\n </div>\n </header>\n <div className=\"og-plugin-details-meta\">\n <span>{registryLabel}</span>\n {item.category ? <span>{item.category}</span> : null}\n {item.version ? <span>v{item.version}</span> : null}\n </div>\n <section className=\"og-plugin-details-members\">\n <h3>\n Skills <span>{item.skills?.length ?? \"—\"}</span>\n </h3>\n {item.skills?.length ? (\n <ul>\n {item.skills.map((skill) => (\n <li key={skill.sourceUrl}>\n <a href={skill.sourceUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n <strong>{skill.name}</strong>\n <span aria-hidden=\"true\">↗</span>\n </a>\n </li>\n ))}\n </ul>\n ) : (\n <p>\n {item.skills\n ? \"No bundled skills.\"\n : \"Contents haven’t been indexed for this repository.\"}\n </p>\n )}\n <h3>\n MCP servers <span>{item.mcpServers?.length ?? \"—\"}</span>\n </h3>\n {item.mcpServers?.length ? (\n <ul>\n {item.mcpServers.map((server) => {\n const connected = Boolean(server.endpoint && connections[server.endpoint]);\n // Existing connections remain manageable regardless of the source manifest's setup requirements.\n const unavailableReason = connected ? null : pluginMcpUnavailableReason(server);\n return (\n <li\n key={server.name}\n className={unavailableReason ? \"og-plugin-member-disabled\" : undefined}\n >\n <div className=\"og-plugin-server-heading\">\n <strong>{server.name}</strong>\n {!unavailableReason && onConnect ? (\n <button type=\"button\" disabled={busy} onClick={() => onConnect(server)}>\n {connected ? \"Manage\" : \"Connect\"}\n </button>\n ) : null}\n </div>\n <small>\n {connected ? \"Connected · \" : \"\"}\n {unavailableReason ?? server.endpoint}\n </small>\n </li>\n );\n })}\n </ul>\n ) : (\n <p>\n {item.mcpServers ? \"No bundled MCP servers.\" : \"Server details haven’t been indexed.\"}\n </p>\n )}\n {item.components?.some((component) => ![\"skills\", \"mcp\"].includes(component)) ? (\n <div className=\"og-plugin-details-other\">\n Not installed here:{\" \"}\n {item.components\n .filter((component) => ![\"skills\", \"mcp\"].includes(component))\n .map((component) => componentLabels[component] ?? component)\n .join(\", \")}\n </div>\n ) : null}\n </section>\n <section className=\"og-plugin-details-overview\" aria-label=\"Overview\">\n <div className={lengthy && !expanded ? \"og-plugin-details-excerpt\" : undefined}>\n <Markdown>{description}</Markdown>\n </div>\n {lengthy ? (\n <button\n type=\"button\"\n className=\"og-plugin-details-more\"\n aria-expanded={expanded}\n onClick={() => setExpanded((value) => !value)}\n >\n {expanded ? \"Show less\" : \"Read more\"}\n </button>\n ) : null}\n </section>\n <footer>\n {item.sourceUrl ? (\n <a href={item.sourceUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n View repository <span aria-hidden=\"true\">↗</span>\n </a>\n ) : null}\n {onInstall ? (\n <button\n className=\"og-plugin-install\"\n type=\"button\"\n disabled={!installable || busy || installed}\n onClick={onInstall}\n >\n {installed ? \"Installed\" : busy ? \"Installing…\" : \"Install plugin\"}\n </button>\n ) : null}\n {error ? <p role=\"alert\">{error}</p> : null}\n {exceedsInstallLimit ? (\n <p>This plugin exceeds the current 64-component installation limit.</p>\n ) : contentsUnknown ? (\n <p>\n Plugin contents are unavailable. Installation is disabled until the repository can be\n inspected.\n </p>\n ) : !installable ? (\n <p>No installable skills or remote MCP servers.</p>\n ) : (\n <p>Installs skills and adds connection references. Connect each server separately.</p>\n )}\n </footer>\n </article>\n );\n}\n"],"mappings":"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","names":["jsx","jsxs","useState","jsx","jsxs","useState","Fragment","jsx","jsxs","useEffect","useState","Fragment","jsx","jsxs","useState","useEffect","useEffect","useState","jsx","jsxs","useState","useEffect","jsx","jsxs","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","useEffect","useRef","useState","Fragment","jsx","jsxs","useEffect","useRef","useState","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","jsx","useEffect","useRef","useState","Fragment","jsx","jsxs","discoveryCache","useState","useRef","useEffect","useState","BoxesIcon","jsx","jsxs","useState","BoxesIcon"]}
|
|
1
|
+
{"version":3,"sources":["../src/connect.ts","../src/capability-catalog-row.tsx","../src/skill-discovery.tsx","../src/discovery-cache.ts","../src/connect-setup.tsx","../src/connection-catalog.tsx","../src/connect-chooser.tsx","../src/connect-accounts.tsx","../src/connect-panel.tsx","../src/device-authorization.tsx","../src/identity-link-consent.tsx","../src/identity-link-accounts.tsx","../src/connection-installed.tsx","../src/connection-type-picker.tsx","../src/connection-logo.tsx","../src/plugin-discovery.tsx","../src/plugin-details.tsx"],"sourcesContent":["// Optional, unstyled React adapter over the shared headless controller.\n// The host owns controller lifetime; unmounting one observer does not cancel an\n// attempt another observer is displaying or a durable backend operation.\nimport { useMemo, useSyncExternalStore } from \"react\";\nexport {\n CapabilityCatalogRow,\n CapabilityCatalogIndicator,\n type CapabilityCatalogRowProps,\n type CapabilityCatalogStatus,\n} from \"./capability-catalog-row\";\nexport {\n SkillDiscovery,\n type SkillDiscoveryProps,\n type SkillDiscoveryClient,\n type SkillDiscoveryItem,\n type SkillDiscoveryPage,\n} from \"./skill-discovery\";\nimport type { ConnectController } from \"@opengeni/connect\";\nexport { ConnectSetup, type ConnectSetupProps } from \"./connect-setup\";\nexport { ConnectChooser, type ConnectChooserProps } from \"./connect-chooser\";\nexport { ConnectAccounts, type ConnectAccountsProps } from \"./connect-accounts\";\nexport { ConnectPanel, type ConnectPanelProps } from \"./connect-panel\";\nexport { DeviceAuthorization, type DeviceAuthorizationProps } from \"./device-authorization\";\nexport {\n IdentityLinkConsent,\n type IdentityLinkClient,\n type IdentityLinkConsentProps,\n} from \"./identity-link-consent\";\nexport { IdentityLinkAccounts, type IdentityLinkAccountsClient } from \"./identity-link-accounts\";\n\nexport type { ConnectSnapshot } from \"@opengeni/connect\";\nexport type {\n ConnectAccount,\n ConnectAdvance,\n ConnectAttempt,\n ConnectNextAction,\n ConnectOwnership,\n ConnectProvider,\n ConnectResource,\n ConnectTransport,\n} from \"@opengeni/connect\";\n\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\nexport {\n ConnectionCatalog,\n ConnectionServiceRow,\n ConnectionOptionRow,\n type ConnectionCatalogProps,\n type ConnectionCatalogService,\n type ConnectionCatalogOption,\n} from \"./connection-catalog\";\nexport { ConnectionInstalled, type ConnectionInstalledItem } from \"./connection-installed\";\nexport { ConnectionTypePicker, type ConnectionType } from \"./connection-type-picker\";\nexport { ConnectionLogo } from \"./connection-logo\";\nexport { PluginDiscovery, type PluginDiscoveryProps } from \"./plugin-discovery\";\nexport { PluginDetails } from \"./plugin-details\";\n","import type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { AlertTriangleIcon, CheckIcon, Loader2Icon, PlusIcon } from \"lucide-react\";\n\nexport type CapabilityCatalogStatus =\n | \"available\"\n | \"added\"\n | \"attention\"\n | \"unavailable\"\n | \"loading\";\n\nexport type CapabilityCatalogRowProps = Omit<\n ComponentPropsWithoutRef<\"button\">,\n \"children\" | \"onClick\" | \"name\"\n> & {\n name: string;\n description?: string | undefined;\n icon?: ReactNode;\n status?: CapabilityCatalogStatus;\n statusLabel?: string | undefined;\n /** Preserve opaque host status text when adopting this row without typed health. */\n showStatusLabel?: boolean;\n onOpen: () => void;\n};\n\nconst labels: Record<CapabilityCatalogStatus, string> = {\n available: \"Available to add\",\n added: \"Added\",\n attention: \"Needs attention\",\n unavailable: \"Unavailable\",\n loading: \"Working\",\n};\n\n/** A display-only state. The entire catalog row is the action, never this glyph. */\nexport function CapabilityCatalogIndicator({\n status = \"available\",\n label,\n showLabel = false,\n}: {\n status?: CapabilityCatalogStatus;\n label?: string | undefined;\n showLabel?: boolean;\n}) {\n const Icon =\n status === \"added\"\n ? CheckIcon\n : status === \"attention\" || status === \"unavailable\"\n ? AlertTriangleIcon\n : status === \"loading\"\n ? Loader2Icon\n : PlusIcon;\n return (\n <span className=\"og-capability-catalog-indicator\" data-status={status}>\n <Icon aria-hidden=\"true\" />\n <span\n className={\n showLabel || status === \"attention\" || status === \"unavailable\"\n ? \"og-capability-catalog-notice\"\n : \"og-capability-catalog-sr-only\"\n }\n >\n {label ?? labels[status]}\n </span>\n </span>\n );\n}\n\n/** Shared by connections, skills, and plugins: one row, one focus target, one action. */\nexport function CapabilityCatalogRow({\n name,\n description,\n icon,\n status = \"available\",\n statusLabel,\n showStatusLabel = false,\n onOpen,\n className = \"\",\n ...props\n}: CapabilityCatalogRowProps) {\n return (\n <button\n {...props}\n type=\"button\"\n className={`og-capability-catalog-row ${className}`}\n onClick={onOpen}\n >\n {icon ? <span className=\"og-capability-catalog-icon\">{icon}</span> : null}\n <span className=\"og-capability-catalog-copy\">\n <strong>{name}</strong>\n {description ? <span>{description}</span> : null}\n </span>\n <CapabilityCatalogIndicator status={status} label={statusLabel} showLabel={showStatusLabel} />\n </button>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { createDiscoveryCache } from \"./discovery-cache\";\nimport { BookOpenIcon } from \"lucide-react\";\nimport { CapabilityCatalogRow, type CapabilityCatalogStatus } from \"./capability-catalog-row\";\n\nexport type SkillDiscoveryItem = {\n id: string;\n name: string;\n source: string;\n installs: number;\n url: string;\n};\nexport type SkillDiscoveryPage = { items: SkillDiscoveryItem[]; nextCursor: null };\nconst discoveryCache = createDiscoveryCache<SkillDiscoveryPage>();\n\nexport type SkillDiscoveryClient = {\n searchPublicSkills(workspaceId: string, query: string): Promise<SkillDiscoveryPage>;\n};\nexport type SkillDiscoveryProps = {\n installedSkills?: readonly { name: string; repositoryUrl: string; sourceUrl: string }[];\n client: SkillDiscoveryClient;\n workspaceId: string;\n query: string;\n onImport: (url: string) => void;\n canManage: boolean;\n localSkills?: readonly {\n id: string;\n name: string;\n description?: string;\n status?: CapabilityCatalogStatus;\n statusLabel?: string;\n onOpen: () => void;\n }[];\n resultLimit?: number;\n onShowMore?: () => void;\n onSearch?: (() => void) | undefined;\n};\n\n/** Host-owned query and import flow; browse presentation is reusable independently. */\nexport function SkillDiscovery(props: SkillDiscoveryProps) {\n const query = props.query.trim();\n const discoveryQuery = query || \"agent\";\n return (\n <section className=\"og-skill-discovery\" aria-label=\"Discover skills\">\n <header>\n <h3>{props.resultLimit ? \"Skills\" : query ? \"Search skills\" : \"Browse skills\"}</h3>\n {!props.resultLimit ? (\n <a\n href=\"https://skills.sh/\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"og-skill-discovery-browse\"\n >\n Browse skills.sh ↗\n </a>\n ) : null}\n </header>\n {!query ? (\n <p>Agent skills from skills.sh. Search above for another topic.</p>\n ) : query.length < 2 ? (\n <p>Enter at least two characters to search skills.sh.</p>\n ) : null}\n <DiscoveryResults\n key={`${props.workspaceId}:${discoveryQuery}`}\n {...props}\n query={discoveryQuery}\n />\n </section>\n );\n}\n\nconst EMPTY_LOCAL_SKILLS: NonNullable<SkillDiscoveryProps[\"localSkills\"]> = [];\nconst EMPTY_INSTALLED_SKILLS: NonNullable<SkillDiscoveryProps[\"installedSkills\"]> = [];\n\nfunction DiscoveryResults({\n client,\n workspaceId,\n query,\n canManage,\n onImport,\n resultLimit,\n onShowMore,\n localSkills = EMPTY_LOCAL_SKILLS,\n installedSkills = EMPTY_INSTALLED_SKILLS,\n}: SkillDiscoveryProps) {\n const cacheKey = JSON.stringify([workspaceId, query]);\n const cached = discoveryCache.peek(client, cacheKey);\n const [result, setResult] = useState<SkillDiscoveryPage | null>(cached ?? null);\n const [loading, setLoading] = useState(query.length >= 2 && !cached);\n const [error, setError] = useState(false);\n const [retry, setRetry] = useState(0);\n useEffect(() => {\n let active = true;\n setError(false);\n if (query.length < 2) return;\n const existing = discoveryCache.peek(client, cacheKey);\n setLoading(!existing);\n let timer: ReturnType<typeof setTimeout>;\n const search = async (attempt: number) => {\n try {\n const data = await discoveryCache.read(client, cacheKey, () =>\n client.searchPublicSkills(workspaceId, query),\n );\n if (!active) return;\n setResult(data);\n setLoading(false);\n } catch (cause) {\n if (!active) return;\n const status =\n typeof cause === \"object\" && cause !== null && \"status\" in cause\n ? cause.status\n : undefined;\n const transient =\n cause instanceof TypeError ||\n (typeof status === \"number\" && status >= 500 && status <= 599);\n if (attempt === 0 && transient) {\n timer = setTimeout(() => void search(1), 750);\n return;\n }\n setError(true);\n setLoading(false);\n }\n };\n timer = setTimeout(() => void search(0), existing ? 0 : 300);\n return () => {\n active = false;\n clearTimeout(timer);\n };\n }, [client, workspaceId, query, cacheKey, retry]);\n const remoteSkills =\n result?.items.filter(\n (skill) =>\n !localSkills.some((local) => local.name.toLowerCase() === skill.name.toLowerCase()),\n ) ?? [];\n return (\n <div aria-busy={loading}>\n <div className=\"og-skill-discovery-grid\">\n {localSkills.slice(0, resultLimit).map((skill) => (\n <CapabilityCatalogRow\n key={skill.id}\n name={skill.name}\n description={skill.description}\n icon={<BookOpenIcon aria-hidden=\"true\" />}\n status={skill.status ?? \"added\"}\n statusLabel={skill.statusLabel}\n onOpen={skill.onOpen}\n />\n ))}\n {remoteSkills\n .slice(\n 0,\n resultLimit === undefined ? undefined : Math.max(0, resultLimit - localSkills.length),\n )\n .map((skill) => {\n const installed = installedSkills.some(\n (entry) =>\n entry.sourceUrl.replace(/\\/$/, \"\").toLowerCase() === skill.url.toLowerCase() ||\n (entry.repositoryUrl.replace(/\\/$/, \"\").toLowerCase() ===\n `https://github.com/${skill.source}`.toLowerCase() &&\n entry.name.toLowerCase() === skill.name.toLowerCase()),\n );\n return (\n <CapabilityCatalogRow\n key={skill.id}\n disabled={!canManage}\n name={skill.name}\n description={skill.source}\n icon={<BookOpenIcon aria-hidden=\"true\" />}\n status={!canManage ? \"unavailable\" : installed ? \"added\" : \"available\"}\n statusLabel={\n !canManage ? \"Admin required\" : installed ? \"Installed\" : \"Available to add\"\n }\n onOpen={() => onImport(skill.url)}\n />\n );\n })}\n </div>\n {resultLimit && remoteSkills.length + localSkills.length > resultLimit && !loading ? (\n <button className=\"og-catalog-more\" type=\"button\" onClick={onShowMore}>\n View all skills\n </button>\n ) : null}\n {loading ? <p role=\"status\">Loading skills…</p> : null}\n {error ? (\n <div role=\"alert\" className=\"og-skill-discovery-error\">\n Could not load skills.\n <button type=\"button\" onClick={() => setRetry((value) => value + 1)}>\n Retry\n </button>\n </div>\n ) : null}\n {result && !remoteSkills.length && !localSkills.length && !loading && !error ? (\n <p role=\"status\">No skills found. Try a different search.</p>\n ) : null}\n </div>\n );\n}\n","/** Short-lived presentation data only. Never cache installation or authorization state. */\nexport function createDiscoveryCache<T>(ttlMs = 60_000, capacity = 64) {\n const clients = new WeakMap<\n object,\n Map<string, { expires: number; value: T | undefined; pending: Promise<T> }>\n >();\n return {\n peek(client: object, key: string): T | undefined {\n const entry = clients.get(client)?.get(key);\n return entry && entry.expires > Date.now() ? entry.value : undefined;\n },\n read(client: object, key: string, fetch: () => Promise<T>): Promise<T> {\n let entries = clients.get(client);\n if (!entries) {\n entries = new Map();\n clients.set(client, entries);\n }\n const existing = entries.get(key);\n if (existing && existing.expires > Date.now()) return existing.pending;\n entries.delete(key);\n while (entries.size >= capacity) entries.delete(entries.keys().next().value!);\n const entry = {\n expires: Date.now() + ttlMs,\n value: undefined as T | undefined,\n pending: Promise.resolve().then(fetch),\n };\n entries.set(key, entry);\n entry.pending = entry.pending.then(\n (value) => {\n entry.value = value;\n entry.expires = Date.now() + ttlMs;\n return value;\n },\n (error) => {\n if (entries.get(key) === entry) entries.delete(key);\n throw error;\n },\n );\n return entry.pending;\n },\n };\n}\n","import { useState, type FormEvent } from \"react\";\nimport type { ConnectAttempt, ConnectController } from \"@opengeni/connect\";\nimport { useConnect } from \"./connect\";\n\nconst setupStatus: Record<ConnectAttempt[\"state\"], string> = {\n ready: \"Ready to connect\",\n requires_user_action: \"Authorize your account\",\n credential_input: \"Enter connection details\",\n provider_wait: \"Waiting for authorization\",\n account_selection: \"Choose an account\",\n resource_selection: \"Choose resources\",\n preview: \"Review available operations\",\n installing: \"Installing selected operations…\",\n connected_but_incomplete: \"Account connected — finish setup\",\n complete: \"Connection ready\",\n cancelled: \"Setup cancelled\",\n expired: \"Setup expired\",\n failed: \"Setup could not finish\",\n uncertain: \"Setup outcome needs checking\",\n};\n\nfunction deviceVerificationUrl(action: ConnectAttempt[\"nextAction\"]): string | null {\n if (action.type !== \"wait\" || !action.verificationUrl) return null;\n try {\n const url = new URL(action.verificationUrl);\n return url.protocol === \"https:\" && !url.username && !url.password\n ? action.verificationUrl\n : null;\n } catch {\n return null;\n }\n}\n\nexport type ConnectSetupProps = {\n controller: ConnectController;\n /** Called synchronously in the click handler so a host can open a popup. */\n onAuthorize: (attempt: ConnectAttempt) => void | Promise<unknown>;\n /** Called synchronously on Continue; hosts can reserve a popup before advancing. */\n onSelectAccount?: (accountId: string) => void | Promise<unknown>;\n /** Host pagination must retain selections across pages and submit the final set. */\n onBrowseResources?: (attempt: ConnectAttempt) => void | Promise<unknown>;\n className?: string;\n /** Provider-specific label supplied by the embedding host. */\n authorizeLabel?: string | undefined;\n};\n\n/** Controller-backed setup surface, styled by opt-in connect.css. No provider secrets enter React state. Host owns\n * chooser, controller lifetime, navigation and recovery after full redirect. */\nexport function ConnectSetup(props: ConnectSetupProps) {\n // Attempt IDs/revisions are not a substitute for actor scope. A host can\n // recover the same attempt through a replacement controller; never preserve\n // a previous actor's unsent credential DOM or local errors across that swap.\n const [scope, setScope] = useState(props.controller);\n const [generation, setGeneration] = useState(0);\n if (scope !== props.controller) {\n setScope(props.controller);\n setGeneration(generation + 1);\n }\n return <ScopedSetup key={generation} {...props} />;\n}\n\nfunction ScopedSetup({\n controller,\n onAuthorize,\n onBrowseResources,\n onSelectAccount,\n className,\n authorizeLabel = \"Authorize connection\",\n}: ConnectSetupProps) {\n const view = useConnect(controller);\n const [localError, setLocalError] = useState(false);\n const [navigating, setNavigating] = useState(false);\n const invoke = (operation: () => unknown | Promise<unknown>) => {\n setLocalError(false);\n try {\n void Promise.resolve(operation()).catch(() => setLocalError(true));\n } catch {\n setLocalError(true);\n }\n };\n const attempt = view.attempt;\n if (!attempt)\n return (\n <section\n className={[\"og-connect-setup\", className].filter(Boolean).join(\" \")}\n aria-label=\"Connection setup\"\n >\n <p role=\"status\">Choose a connection to begin.</p>\n </section>\n );\n const action = attempt.nextAction;\n const verificationUrl = deviceVerificationUrl(action);\n const terminal = [\"complete\", \"cancelled\", \"expired\"].includes(attempt.state);\n const submit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const form = event.currentTarget;\n const data = new FormData(form);\n if (view.busy || navigating) return;\n const key = crypto.randomUUID();\n if (action.type === \"credentials\") {\n const values = Object.fromEntries(\n action.fields.map((field, i) => [field.name, String(data.get(`field-${i}`) ?? \"\")]),\n );\n // Clear the DOM before awaiting remote work; controller never retains values.\n form.reset();\n invoke(() => view.advance({ type: \"credentials\", values }, key));\n } else if (action.type === \"select_account\") {\n const accountId = String(data.get(\"account\") ?? \"\");\n if (\n action.accounts.some((account) => account.id === accountId && account.status !== \"disabled\")\n )\n invoke(async () => {\n if (!onSelectAccount) return view.advance({ type: \"account\", accountId }, key);\n setNavigating(true);\n try {\n await onSelectAccount(accountId);\n } finally {\n setNavigating(false);\n }\n });\n } else if (action.type === \"select_resources\") {\n if (action.cursor) return;\n const resourceIds = data.getAll(\"resource\").map(String);\n invoke(() => view.advance({ type: \"resources\", resourceIds }, key));\n } else if (action.type === \"preview\") {\n const operationIds = data.getAll(\"operation\").map(String);\n invoke(() =>\n view.advance(\n {\n type: \"install\",\n previewId: action.previewId,\n contentHash: action.contentHash,\n operationIds,\n },\n key,\n ),\n );\n }\n };\n return (\n <section\n className={[\"og-connect-setup\", className].filter(Boolean).join(\" \")}\n aria-label=\"Connection setup\"\n aria-busy={view.busy || navigating}\n >\n <div className=\"og-connect-setup-summary\">\n <p className=\"og-connect-setup-scope\">\n {attempt.ownership === \"personal\" ? \"Personal connection\" : \"Workspace connection\"}\n </p>\n <p role=\"status\" className=\"og-connect-setup-status\">\n {setupStatus[attempt.state]}\n </p>\n <p className=\"og-connect-setup-description\">\n {attempt.ownership === \"personal\"\n ? \"Only your work can use this connection.\"\n : \"Work in this workspace can use this connection.\"}\n </p>\n </div>\n {attempt.account && <p>Account: {attempt.account.label}</p>}\n {(localError || view.error || attempt.error) && (\n <p role=\"alert\">\n {attempt.error?.code === \"source_changed\"\n ? \"The integration source changed. Review the new operations before installing.\"\n : \"Connection setup could not continue. Refresh its status before trying again.\"}\n </p>\n )}\n {!terminal && (\n <form key={`${attempt.id}:${attempt.revision}`} onSubmit={submit} autoComplete=\"off\">\n <fieldset disabled={view.busy || navigating}>\n {[\"credentials\", \"select_account\", \"select_resources\", \"preview\"].includes(\n action.type,\n ) ? (\n <legend>Connection details</legend>\n ) : null}\n {attempt.state === \"connected_but_incomplete\" && action.type === \"none\" && (\n <button\n type=\"button\"\n className=\"og-connect-setup-primary\"\n onClick={() => invoke(() => view.advance({ type: \"retry\" }, crypto.randomUUID()))}\n >\n Review integration operations\n </button>\n )}\n {action.type === \"credentials\" &&\n action.fields.map((field, i) => (\n <label key={field.name}>\n {field.label}\n {field.options ? (\n <select name={`field-${i}`} required={field.required} defaultValue=\"\">\n <option value=\"\">\n {field.required ? \"Choose an option\" : \"No account (public service)\"}\n </option>\n {field.options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n ) : (\n <input\n name={`field-${i}`}\n type={field.secret ? \"password\" : \"text\"}\n required={field.required}\n autoComplete=\"off\"\n />\n )}\n </label>\n ))}\n {action.type === \"select_account\" && (\n <label>\n Account\n <select name=\"account\" required defaultValue=\"\">\n <option value=\"\" disabled>\n Choose an account\n </option>\n {action.accounts.map((account) => (\n <option\n key={account.id}\n value={account.id}\n disabled={account.status === \"disabled\"}\n >\n {account.label} — {account.id} ({account.ownership})\n </option>\n ))}\n </select>\n </label>\n )}\n {action.type === \"select_resources\" &&\n action.resources.map((resource) => (\n <label key={resource.id}>\n <input type=\"checkbox\" name=\"resource\" value={resource.id} />\n {resource.label} ({resource.kind})\n </label>\n ))}\n {action.type === \"select_resources\" && action.cursor && (\n <>\n <p>More resources are available. Review all pages before submitting a selection.</p>\n {onBrowseResources && (\n <button\n type=\"button\"\n onClick={() => invoke(() => onBrowseResources(structuredClone(attempt)))}\n >\n Browse all resources\n </button>\n )}\n </>\n )}\n {action.type === \"preview\" && (\n <>\n <p>Select the operations to install.</p>\n {action.operations.map((operation) => (\n <label key={operation.id}>\n <input type=\"checkbox\" name=\"operation\" value={operation.id} />\n {operation.label} ({operation.kind})\n </label>\n ))}\n </>\n )}\n {[\"credentials\", \"select_account\", \"select_resources\", \"preview\"].includes(\n action.type,\n ) && (\n <button\n type=\"submit\"\n className=\"og-connect-setup-primary\"\n disabled={action.type === \"select_resources\" && Boolean(action.cursor)}\n >\n {action.type === \"preview\" ? \"Install selected operations\" : \"Continue\"}\n </button>\n )}\n {action.type === \"authorize\" && (\n <button\n type=\"button\"\n className=\"og-connect-setup-primary\"\n onClick={() => invoke(() => onAuthorize(structuredClone(attempt)))}\n >\n {navigating ? \"Waiting for authorization…\" : authorizeLabel}\n </button>\n )}\n {action.type === \"wait\" && (\n <>\n {action.userCode && (\n <p>\n Verification code: <code>{action.userCode}</code>\n </p>\n )}\n <p>Complete provider authorization, then check the connection status.</p>\n {verificationUrl && (\n <a href={verificationUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n Open provider verification page (new tab)\n </a>\n )}\n </>\n )}\n <div className=\"og-connect-setup-secondary\">\n <button type=\"button\" onClick={() => invoke(() => view.refresh())}>\n Check status\n </button>\n <button type=\"button\" onClick={() => invoke(() => view.cancel(crypto.randomUUID()))}>\n Cancel setup\n </button>\n </div>\n </fieldset>\n </form>\n )}\n </section>\n );\n}\n","import type { ReactNode } from \"react\";\nimport {\n CapabilityCatalogIndicator,\n CapabilityCatalogRow,\n type CapabilityCatalogStatus,\n} from \"./capability-catalog-row\";\n\n/** Status comes from the host/controller, never inferred from a display label. */\nexport type ConnectionCatalogOption = {\n id: string;\n name: string;\n description?: string | undefined;\n status: string;\n connected: boolean;\n /** Explicit health/availability. Omit to retain visible legacy status text. */\n state?: CapabilityCatalogStatus;\n onOpen: () => void;\n action?: ReactNode;\n};\nexport type ConnectionCatalogService = {\n id: string;\n name: string;\n logo?: ReactNode;\n options: ConnectionCatalogOption[];\n};\nexport type ConnectionCatalogProps = {\n services: ConnectionCatalogService[];\n query?: string;\n columns?: 1 | 2;\n resultLimit?: number;\n onShowMore?: () => void;\n /** Group capabilities by service, or show every capability independently. */\n grouped?: boolean;\n className?: string;\n emptyMessage?: string;\n};\n\nexport function ConnectionOptionRow({ option }: { option: ConnectionCatalogOption }) {\n return (\n <div className=\"og-connection-catalog-action-row og-connection-option\">\n <CapabilityCatalogRow\n name={option.name}\n description={option.description}\n status={option.state ?? (option.connected ? \"added\" : \"available\")}\n statusLabel={option.status}\n showStatusLabel={option.state === undefined}\n onOpen={option.onOpen}\n />\n {option.action ? <span className=\"og-connection-option-action\">{option.action}</span> : null}\n </div>\n );\n}\n\nexport function ConnectionServiceRow({ service }: { service: ConnectionCatalogService }) {\n if (!service.options.length) return null;\n const connected = service.options.filter((option) => option.connected).length;\n const attention = service.options.find(\n (option) => option.state === \"attention\" || option.state === \"unavailable\",\n );\n const groupState =\n attention?.state ??\n (service.options.some((option) => option.state === \"loading\")\n ? \"loading\"\n : connected === service.options.length\n ? \"added\"\n : \"available\");\n const identity = (\n <>\n <span className=\"og-capability-catalog-icon\">{service.logo}</span>\n <span className=\"og-capability-catalog-copy\">\n <strong>{service.name}</strong>\n <span>\n {service.options.length === 1\n ? service.options[0]?.description\n : service.options.map((option) => option.name).join(\" · \")}\n </span>\n </span>\n <CapabilityCatalogIndicator\n status={groupState}\n label={attention?.status ?? `${connected} of ${service.options.length} added`}\n />\n </>\n );\n return service.options.length === 1 ? (\n <div className=\"og-connection-catalog-action-row\">\n <CapabilityCatalogRow\n name={service.name}\n description={service.options[0]!.description}\n icon={service.logo}\n status={service.options[0]!.state ?? (connected ? \"added\" : \"available\")}\n statusLabel={service.options[0]!.status}\n showStatusLabel={service.options[0]!.state === undefined}\n onOpen={service.options[0]!.onOpen}\n />\n {service.options[0]?.action}\n </div>\n ) : (\n <details className=\"og-connection-catalog-service\">\n <summary className=\"og-capability-catalog-row\">\n {identity}\n <span aria-hidden className=\"og-connection-group-chevron\">\n ⌄\n </span>\n </summary>\n <div className=\"og-connection-catalog-options\">\n {service.options.map((option) => (\n <ConnectionOptionRow key={option.id} option={option} />\n ))}\n </div>\n </details>\n );\n}\n\nexport function ConnectionCatalog({\n services,\n query = \"\",\n columns = 1,\n grouped = true,\n resultLimit,\n onShowMore,\n className = \"\",\n emptyMessage = \"No connections match your search.\",\n}: ConnectionCatalogProps) {\n const search = query.trim().toLowerCase();\n const entries = grouped\n ? services\n : services.flatMap((service) =>\n service.options.map((option) => ({\n ...service,\n id: `${service.id}/${option.id}`,\n name:\n service.options.length > 1 && option.name !== service.name\n ? `${service.name} · ${option.name}`\n : service.name,\n options: [option],\n })),\n );\n const visible = entries.filter((service) =>\n [service.name, ...service.options.flatMap((option) => [option.name, option.description ?? \"\"])]\n .join(\" \")\n .toLowerCase()\n .includes(search),\n );\n return (\n <>\n <div className={`og-connection-catalog ${className}`} data-columns={columns}>\n {visible.length ? (\n visible\n .slice(0, resultLimit)\n .map((service) => <ConnectionServiceRow key={service.id} service={service} />)\n ) : (\n <p role=\"status\">{emptyMessage}</p>\n )}\n </div>\n {resultLimit && visible.length > resultLimit ? (\n <button className=\"og-catalog-more\" type=\"button\" onClick={onShowMore}>\n View all connections\n </button>\n ) : null}\n </>\n );\n}\n","import { ConnectionCatalog } from \"./connection-catalog\";\nimport { useEffect, useState, type FormEvent } from \"react\";\nimport type { ConnectController, ConnectProvider } from \"@opengeni/connect\";\nimport { useConnect } from \"./connect\";\n\nexport type ConnectChooserProps = {\n controller: ConnectController;\n /** Exact host return string; no completion parameters are added. */\n returnUrl: string;\n className?: string;\n presentation?: \"select\" | \"catalog\";\n};\n\n/** Catalog readiness is supplied by the authenticated backend, never inferred\n * from the existence of a provider definition. Host replaces the controller on\n * actor/workspace change. This form does not open OAuth windows itself. */\nexport function ConnectChooser(props: ConnectChooserProps) {\n // Remount scope-local selections synchronously when the controller changes,\n // before effects can expose a previous actor's inventory for one frame.\n const [scope, setScope] = useState(props.controller);\n const [generation, setGeneration] = useState(0);\n if (scope !== props.controller) {\n setScope(props.controller);\n setGeneration(generation + 1);\n }\n return <ScopedChooser key={generation} {...props} />;\n}\n\nfunction ScopedChooser({\n controller,\n returnUrl,\n className,\n presentation = \"select\",\n}: ConnectChooserProps) {\n const view = useConnect(controller);\n const [catalog, setCatalog] = useState<ConnectProvider[] | null>(null);\n const [failed, setFailed] = useState(false);\n const [load, setLoad] = useState(0);\n const [query, setQuery] = useState(\"\");\n const [providerId, setProviderId] = useState(\"\");\n const [ownership, setOwnership] = useState(\"\");\n useEffect(() => {\n const abort = new AbortController();\n setCatalog(null);\n setFailed(false);\n setProviderId(\"\");\n setOwnership(\"\");\n // Promise boundary also handles a synchronously throwing injected transport.\n void Promise.resolve()\n .then(() => {\n abort.signal.throwIfAborted();\n return controller.transport.catalog(controller.workspaceId, { signal: abort.signal });\n })\n .then((providers) => {\n if (!abort.signal.aborted) setCatalog(structuredClone(providers));\n })\n .catch(() => {\n if (!abort.signal.aborted) setFailed(true);\n });\n return () => abort.abort();\n }, [controller, load]);\n const provider = catalog?.find((entry) => entry.id === providerId);\n const canBegin =\n provider?.readiness === \"available\" &&\n (ownership === \"personal\" || ownership === \"workspace\") &&\n provider.ownership.includes(ownership);\n const submit = (event: FormEvent) => {\n event.preventDefault();\n if (!canBegin || view.busy || (ownership !== \"personal\" && ownership !== \"workspace\")) return;\n setFailed(false);\n try {\n void controller\n .begin({ providerId, ownership, returnUrl, idempotencyKey: crypto.randomUUID() })\n .catch(() => setFailed(true));\n } catch {\n setFailed(true);\n }\n };\n return (\n <section\n className={className}\n aria-label=\"Choose a connection\"\n aria-busy={view.busy || (!catalog && !failed)}\n >\n {failed && (\n <p role=\"alert\">\n Connections could not be loaded or started. Check setup status before retrying.\n </p>\n )}\n {!catalog && !failed && <p role=\"status\">Loading connections…</p>}\n {catalog?.length === 0 && <p role=\"status\">No connections are available.</p>}\n {Boolean(catalog?.length) && (\n <form onSubmit={submit}>\n <fieldset disabled={view.busy}>\n <legend>Provider and ownership</legend>\n {presentation === \"catalog\" && !provider ? (\n <>\n <label>\n Search connections\n <input\n type=\"search\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n />\n </label>\n <ConnectionCatalog\n query={query}\n services={catalog!.map((entry) => ({\n id: entry.id,\n name: entry.label,\n options: [\n {\n id: entry.id,\n name: entry.label,\n description: entry.reason,\n status: entry.readiness.replaceAll(\"_\", \" \"),\n connected: false,\n onOpen: () => {\n if (!view.busy) {\n setProviderId(entry.id);\n setOwnership(entry.ownership.length === 1 ? entry.ownership[0]! : \"\");\n }\n },\n },\n ],\n }))}\n />\n </>\n ) : null}\n {presentation === \"catalog\" && provider ? (\n <button\n type=\"button\"\n onClick={() => {\n setProviderId(\"\");\n setOwnership(\"\");\n }}\n >\n Back to connections\n </button>\n ) : null}\n <label hidden={presentation === \"catalog\"}>\n Provider\n <select\n required\n value={providerId}\n onChange={(event) => {\n setProviderId(event.target.value);\n setOwnership(\"\");\n }}\n >\n <option value=\"\" disabled>\n Choose a provider\n </option>\n {catalog!.map((entry) => (\n <option\n key={entry.id}\n value={entry.id}\n disabled={entry.readiness !== \"available\" || entry.ownership.length === 0}\n >\n {entry.label} — {entry.id} ({entry.readiness.replaceAll(\"_\", \" \")})\n </option>\n ))}\n </select>\n </label>\n {provider && (\n <>\n <strong>{presentation === \"catalog\" ? provider.label : null}</strong>\n <label>\n Ownership\n <select\n required\n value={ownership}\n onChange={(event) => setOwnership(event.target.value)}\n >\n <option value=\"\" disabled>\n Choose ownership\n </option>\n {provider.ownership.map((choice) => (\n <option key={choice} value={choice}>\n {choice === \"personal\"\n ? \"Personal — owned by you\"\n : \"Workspace — shared connection\"}\n </option>\n ))}\n </select>\n </label>\n </>\n )}\n <button\n hidden={presentation === \"catalog\" && !provider}\n type=\"submit\"\n disabled={!canBegin}\n >\n Start setup\n </button>\n </fieldset>\n </form>\n )}\n <button type=\"button\" disabled={view.busy} onClick={() => setLoad(load + 1)}>\n Reload providers\n </button>\n </section>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { ConnectAccount, ConnectController } from \"@opengeni/connect\";\nimport { useConnect } from \"./connect\";\n\nexport type ConnectAccountsProps = {\n controller: ConnectController;\n className?: string;\n /** Enables explicit account-bound reconnect. Host supplies the exact destination. */\n returnUrl?: string;\n};\n\n/** Local credential revocation only. Unknown or changed versions must be\n * refreshed; this component never retries a destructive operation implicitly. */\nexport function ConnectAccounts(props: ConnectAccountsProps) {\n const [scope, setScope] = useState(props.controller);\n const [generation, setGeneration] = useState(0);\n if (scope !== props.controller) {\n setScope(props.controller);\n setGeneration(generation + 1);\n }\n return <ScopedAccounts key={generation} {...props} />;\n}\n\nfunction ScopedAccounts({ controller, className, returnUrl }: ConnectAccountsProps) {\n const view = useConnect(controller);\n const [accounts, setAccounts] = useState<ConnectAccount[] | null>(null);\n const [selected, setSelected] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState(false);\n const [reload, setReload] = useState(0);\n const mutation = useRef<AbortController | null>(null);\n useEffect(() => () => mutation.current?.abort(), []);\n useEffect(() => {\n const abort = new AbortController();\n setAccounts(null);\n setSelected(null);\n setError(false);\n void Promise.resolve()\n .then(() => {\n abort.signal.throwIfAborted();\n return controller.transport.accounts(controller.workspaceId, { signal: abort.signal });\n })\n .then((result) => {\n if (!abort.signal.aborted) setAccounts(structuredClone(result));\n })\n .catch(() => {\n if (!abort.signal.aborted) setError(true);\n });\n return () => abort.abort();\n }, [controller, reload]);\n\n const disconnect = async (account: ConnectAccount) => {\n const expectedVersion = account.version;\n if (\n mutation.current ||\n view.busy ||\n expectedVersion === undefined ||\n !Number.isSafeInteger(expectedVersion) ||\n expectedVersion < 1\n )\n return;\n const abort = new AbortController();\n mutation.current = abort;\n setBusy(true);\n setError(false);\n try {\n await controller.transport.disconnect(controller.workspaceId, account.id, {\n expectedVersion,\n signal: abort.signal,\n });\n if (!abort.signal.aborted) setReload((value) => value + 1);\n } catch {\n if (!abort.signal.aborted) {\n // Outcome may be unknown. Drop the inventory so a second click cannot\n // replay against the stale selection; let the host reload live state.\n setAccounts(null);\n setError(true);\n }\n } finally {\n if (!abort.signal.aborted) {\n mutation.current = null;\n setBusy(false);\n setSelected(null);\n }\n }\n };\n const reconnect = async (account: ConnectAccount) => {\n if (!returnUrl || mutation.current || view.busy) return;\n setError(false);\n try {\n await controller.begin({\n providerId: account.providerId,\n ownership: account.ownership,\n reconnectAccountId: account.id,\n returnUrl,\n idempotencyKey: crypto.randomUUID(),\n });\n } catch {\n setError(true);\n }\n };\n\n return (\n <section\n className={className}\n aria-label=\"Connected accounts\"\n aria-busy={busy || view.busy || (!accounts && !error)}\n >\n {error && (\n <p role=\"alert\">Account state could not be confirmed. Reload before trying again.</p>\n )}\n {!accounts && !error && <p role=\"status\">Loading accounts…</p>}\n {accounts?.length === 0 && <p role=\"status\">No connected accounts.</p>}\n {accounts && accounts.length > 0 && (\n <ul>\n {accounts.map((account) => (\n <li key={`${account.providerId}:${account.id}`}>\n <span>\n {account.label} — {account.providerId} — {account.ownership} —{\" \"}\n {account.status.replaceAll(\"_\", \" \")}\n </span>\n {returnUrl && (\n <button\n type=\"button\"\n disabled={busy || view.busy || account.status === \"disabled\"}\n onClick={() => void reconnect(account)}\n >\n Reconnect {account.label}\n </button>\n )}\n {selected === `${account.providerId}:${account.id}` ? (\n <div role=\"group\" aria-label={`Disconnect ${account.label}`}>\n <p>\n This removes local OpenGeni access. It does not revoke consent at the provider.\n </p>\n <button\n type=\"button\"\n disabled={busy || view.busy}\n onClick={() => void disconnect(account)}\n >\n Confirm disconnect\n </button>\n <button type=\"button\" disabled={busy} onClick={() => setSelected(null)}>\n Keep account\n </button>\n </div>\n ) : (\n <button\n type=\"button\"\n disabled={\n busy ||\n view.busy ||\n account.status === \"disabled\" ||\n !Number.isSafeInteger(account.version) ||\n account.version! < 1\n }\n onClick={() => setSelected(`${account.providerId}:${account.id}`)}\n >\n Disconnect {account.label}\n </button>\n )}\n </li>\n ))}\n </ul>\n )}\n <button type=\"button\" disabled={busy} onClick={() => setReload((value) => value + 1)}>\n Reload accounts\n </button>\n </section>\n );\n}\n","import { ConnectAccounts } from \"./connect-accounts\";\nimport { ConnectChooser } from \"./connect-chooser\";\nimport { ConnectSetup, type ConnectSetupProps } from \"./connect-setup\";\nimport { useConnect } from \"./connect\";\n\nexport type ConnectPanelProps = ConnectSetupProps & {\n returnUrl: string;\n /** Null omits the heading when the host already supplies one. */\n title?: string | null;\n showAccounts?: boolean;\n presentation?: \"select\" | \"catalog\";\n};\n\n/** Optional composition over the same unstyled surfaces. Import\n * @opengeni/react/connect.css for styling; the host retains navigation,\n * transport, actor admission, and controller lifetime. */\nexport function ConnectPanel({\n returnUrl,\n title = \"Connections\",\n showAccounts = true,\n presentation = \"select\",\n className,\n ...setup\n}: ConnectPanelProps) {\n const { attempt } = useConnect(setup.controller);\n // Unknown/failed outcomes still need reconciliation or cancellation, not a\n // competing new acquisition. Unmounting observers never cancels controller work.\n const activeSetup =\n attempt !== null && ![\"complete\", \"cancelled\", \"expired\"].includes(attempt.state);\n return (\n <div className={[\"og-connect\", className].filter(Boolean).join(\" \")}>\n {title !== null && <h2>{title}</h2>}\n {!activeSetup && (\n <ConnectChooser\n presentation={presentation}\n controller={setup.controller}\n returnUrl={returnUrl}\n />\n )}\n <ConnectSetup {...setup} />\n {showAccounts && !activeSetup && (\n <ConnectAccounts controller={setup.controller} returnUrl={returnUrl} />\n )}\n </div>\n );\n}\n","import { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { copyTextToClipboard } from \"./clipboard\";\n\nexport type DeviceAuthorizationProps = {\n userCode: string;\n verificationUri: string;\n providerLabel?: string;\n description?: string;\n className?: string;\n codeAttributes?: Record<`data-${string}`, string>;\n loadClipboard?: () => Promise<{ copyTextToClipboard(text: string): Promise<boolean> }>;\n onCopyResult?: (copied: boolean) => void;\n /** Optional host presentation; clipboard state and URL validation remain shared. */\n render?: (state: {\n copied: boolean;\n copyError: boolean;\n copy: () => Promise<void>;\n verificationHref: string | undefined;\n }) => ReactNode;\n};\n\n/** Optional presentation for the existing model-account device APIs. It neither\n * owns provider state nor assumes that opening a verification page completed it. */\nexport function DeviceAuthorization(props: DeviceAuthorizationProps) {\n const [copied, setCopied] = useState(false);\n const [copyError, setCopyError] = useState(false);\n const generation = useRef(0);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(() => {\n generation.current++;\n setCopied(false);\n setCopyError(false);\n return () => {\n // This is a live async-operation counter, not a captured DOM ref.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n generation.current++;\n if (timer.current) clearTimeout(timer.current);\n };\n }, [props.userCode]);\n async function copy() {\n const revision = ++generation.current;\n if (timer.current) clearTimeout(timer.current);\n setCopied(false);\n setCopyError(false);\n try {\n const clipboard = props.loadClipboard ? await props.loadClipboard() : { copyTextToClipboard };\n if (revision !== generation.current) return;\n const success = await clipboard.copyTextToClipboard(props.userCode);\n if (revision !== generation.current) return;\n setCopied(success);\n setCopyError(!success);\n props.onCopyResult?.(success);\n if (success)\n timer.current = setTimeout(() => {\n if (revision === generation.current) setCopied(false);\n }, 1600);\n } catch {\n if (revision !== generation.current) return;\n setCopyError(true);\n props.onCopyResult?.(false);\n }\n }\n let href: string | undefined;\n try {\n const url = new URL(props.verificationUri);\n if ([\"https:\", \"http:\"].includes(url.protocol) && !url.username && !url.password)\n href = props.verificationUri;\n } catch {\n /* A malformed provider URL must never become an executable link. */\n }\n if (props.render) return props.render({ copied, copyError, copy, verificationHref: href });\n return (\n <section className={`og-connect ${props.className ?? \"\"}`} aria-label=\"Device authorization\">\n <p>{props.description ?? `Enter this code at ${props.providerLabel ?? \"the provider\"}.`}</p>\n <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: \"0.5rem\", alignItems: \"center\" }}>\n <code {...props.codeAttributes} style={{ overflowWrap: \"anywhere\" }}>\n {props.userCode}\n </code>\n <button\n type=\"button\"\n aria-label={copied ? \"Code copied\" : \"Copy code\"}\n onClick={() => void copy()}\n >\n {copied ? \"Copied\" : \"Copy code\"}\n </button>\n {href ? (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\">\n Open {props.providerLabel ?? \"auth page\"}\n </a>\n ) : (\n <span role=\"alert\">Authorization address unavailable.</span>\n )}\n </div>\n {copyError ? <p role=\"alert\">Couldn't copy the code. Copy it manually instead.</p> : null}\n <p role=\"status\">Waiting for authorization…</p>\n </section>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type {\n ExternalIdentityLink,\n ConfirmExternalIdentityLinkRequest,\n ExternalIdentityLinkPreview,\n} from \"@opengeni/sdk\";\n\nexport type IdentityLinkClient = {\n previewIdentityLink(\n workspaceId: string,\n linkId: string,\n challenge: string,\n ): Promise<ExternalIdentityLinkPreview>;\n confirmIdentityLink(\n workspaceId: string,\n linkId: string,\n input: ConfirmExternalIdentityLinkRequest,\n ): Promise<ExternalIdentityLink>;\n revokeIdentityLink(\n workspaceId: string,\n linkId: string,\n expectedRevision: number,\n ): Promise<ExternalIdentityLink>;\n};\nexport type IdentityLinkConsentProps = {\n client: IdentityLinkClient;\n workspaceId: string;\n linkId: string;\n challenge: string;\n /** Host label is explanatory, never proof of the requesting application. */\n className?: string;\n onComplete?: (link: ExternalIdentityLink) => void;\n};\n\n/** Optional native-login consent. Ordinary Connect does not use this surface.\n * Permission choices only narrow the server's request; no automatic approval. */\nexport function IdentityLinkConsent({\n client,\n workspaceId,\n linkId,\n challenge,\n className,\n onComplete,\n}: IdentityLinkConsentProps) {\n const [link, setLink] = useState<ExternalIdentityLink | null>(null);\n const [preview, setPreview] = useState<ExternalIdentityLinkPreview | null>(null);\n const [selected, setSelected] = useState<ExternalIdentityLink[\"permissions\"]>([]);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState(false);\n const [retry, setRetry] = useState(0);\n const generation = useRef(0);\n useEffect(() => {\n const current = ++generation.current;\n setLink(null);\n setPreview(null);\n setSelected([]);\n setBusy(true);\n setError(false);\n void client\n .previewIdentityLink(workspaceId, linkId, challenge)\n .then(\n (result) => {\n if (generation.current !== current) return;\n setPreview(result);\n setLink(result.link);\n setSelected(result.link.permissions);\n },\n () => {\n if (generation.current === current) setError(true);\n },\n )\n .finally(() => {\n if (generation.current === current) setBusy(false);\n });\n return () => {\n // Invalidate live async work, rather than cleaning up a captured DOM node.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n generation.current++;\n };\n }, [client, workspaceId, linkId, challenge, retry]);\n async function mutate(revoke: boolean) {\n if (!link || busy) return;\n const current = generation.current;\n setBusy(true);\n setError(false);\n try {\n const result = revoke\n ? await client.revokeIdentityLink(workspaceId, linkId, link.revision)\n : await client.confirmIdentityLink(workspaceId, linkId, {\n challenge,\n expectedRevision: link.revision,\n permissions: selected,\n });\n if (generation.current !== current) return;\n setLink(result);\n onComplete?.(result);\n } catch {\n if (generation.current === current) setError(true);\n } finally {\n if (generation.current === current) setBusy(false);\n }\n }\n return (\n <section\n className={[\"og-connect og-identity-link\", className].filter(Boolean).join(\" \")}\n aria-label=\"Link your account\"\n aria-busy={busy}\n >\n <h2>Link your OpenGeni account</h2>\n <p>\n Only continue if you started this request in a product you trust. Linking lets that product\n act as your account with the permissions you select. It does not merge accounts or move\n existing work.\n </p>\n {preview && (\n <dl>\n <dt>Organization</dt>\n <dd>{preview.organizationId}</dd>\n <dt>Product user</dt>\n <dd>\n {preview.externalIdentity.externalId} ({preview.externalIdentity.source})\n </dd>\n <dt>Your OpenGeni identity</dt>\n <dd>{preview.nativeSubjectId}</dd>\n </dl>\n )}\n {error && (\n <div role=\"alert\">\n This request could not be completed. It may have expired, changed, or require you to sign\n in to the right organization.\n {!link && (\n <button type=\"button\" disabled={busy} onClick={() => setRetry((value) => value + 1)}>\n Try again\n </button>\n )}\n </div>\n )}\n {!link && busy && <p role=\"status\">Loading the account-link request…</p>}\n {link?.status === \"pending\" && (\n <>\n <p>\n {link.expiresAt\n ? `Access ends ${new Date(link.expiresAt).toLocaleString()}.`\n : \"Access lasts until you or the product revoke this link.\"}{\" \"}\n Your current permissions still apply.\n </p>\n <fieldset disabled={busy}>\n <legend>Allow these permissions</legend>\n {link.permissions.map((permission) => (\n <label key={permission}>\n <input\n type=\"checkbox\"\n checked={selected.includes(permission)}\n onChange={(event) =>\n setSelected((values) =>\n event.target.checked\n ? [...values, permission]\n : values.filter((value) => value !== permission),\n )\n }\n />\n <span>{permission.replaceAll(\":\", \" · \")}</span>\n </label>\n ))}\n </fieldset>\n <button\n type=\"button\"\n disabled={busy || selected.length === 0}\n onClick={() => void mutate(false)}\n >\n {busy ? \"Saving…\" : \"Allow selected access\"}\n </button>\n <p>You can close this page without granting access.</p>\n </>\n )}\n {link?.status === \"active\" && (\n <>\n <p role=\"status\">Account linked. Return to your product to continue.</p>\n <button type=\"button\" disabled={busy} onClick={() => void mutate(true)}>\n Revoke this link\n </button>\n </>\n )}\n {link?.status === \"revoked\" && (\n <p role=\"status\">Link revoked. Your OpenGeni account and existing work are unchanged.</p>\n )}\n {link?.status === \"expired\" && (\n <p role=\"status\">This request has expired. Start a new request from your product.</p>\n )}\n </section>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { ExternalIdentityLink, ExternalIdentityLinkPage } from \"@opengeni/sdk\";\n\nexport type IdentityLinkAccountsClient = {\n listIdentityLinks(workspaceId: string, cursor?: string): Promise<ExternalIdentityLinkPage>;\n revokeIdentityLink(\n workspaceId: string,\n linkId: string,\n expectedRevision: number,\n ): Promise<ExternalIdentityLink>;\n};\n\n/** Participant-scoped inventory. Revocation never deletes native work or merges\n * identities. The caller remounts this component when the signed-in user changes. */\nexport function IdentityLinkAccounts({\n client,\n workspaceId,\n}: {\n client: IdentityLinkAccountsClient;\n workspaceId: string;\n}) {\n const [links, setLinks] = useState<ExternalIdentityLink[]>([]);\n const [cursor, setCursor] = useState<string | null>(null);\n const [busy, setBusy] = useState(true);\n const [error, setError] = useState(false);\n const [revision, setRevision] = useState(0);\n const generation = useRef(0);\n const inFlight = useRef(false);\n useEffect(() => {\n const current = ++generation.current;\n inFlight.current = true;\n setLinks([]);\n setCursor(null);\n setBusy(true);\n setError(false);\n void client\n .listIdentityLinks(workspaceId)\n .then(\n (page) => {\n if (current !== generation.current) return;\n setLinks(page.links);\n setCursor(page.nextCursor);\n },\n () => {\n if (current === generation.current) setError(true);\n },\n )\n .finally(() => {\n if (current === generation.current) {\n inFlight.current = false;\n setBusy(false);\n }\n });\n return () => {\n // Invalidate live async work, rather than cleaning up a captured DOM node.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n generation.current++;\n };\n }, [client, workspaceId, revision]);\n\n async function act(link?: ExternalIdentityLink) {\n if (inFlight.current || (!link && !cursor)) return;\n const current = generation.current;\n inFlight.current = true;\n setBusy(true);\n setError(false);\n try {\n if (link) {\n const updated = await client.revokeIdentityLink(workspaceId, link.id, link.revision);\n if (current === generation.current)\n setLinks((values) =>\n values.map((value) => (value.id === updated.id ? { ...value, ...updated } : value)),\n );\n } else {\n const page = await client.listIdentityLinks(workspaceId, cursor!);\n if (current === generation.current) {\n setLinks((values) => [\n ...new Map([...values, ...page.links].map((value) => [value.id, value])).values(),\n ]);\n setCursor(page.nextCursor);\n }\n }\n } catch {\n if (current === generation.current) setError(true);\n } finally {\n if (current === generation.current) {\n inFlight.current = false;\n setBusy(false);\n }\n }\n }\n return (\n <section\n className=\"og-connect og-identity-link\"\n aria-label=\"Linked product access\"\n aria-busy={busy}\n >\n <h2>Linked product access</h2>\n <p>\n Manage products allowed to act as your account in this organization. Revoking a link stops\n future linked access; it does not delete your work or undo an operation already started.\n </p>\n {error && (\n <div role=\"alert\">\n Could not update account links. Reload to see current access.\n <button type=\"button\" disabled={busy} onClick={() => setRevision((value) => value + 1)}>\n Reload links\n </button>\n </div>\n )}\n {busy && <p role=\"status\">Loading account links…</p>}\n {!busy && !error && links.length === 0 && (\n <p>No products have linked access to this account.</p>\n )}\n <ul>\n {links.map((link) => (\n <li key={link.id}>\n <p>\n {link.externalIdentity?.source || \"Product identity\"}{\" \"}\n <code>{link.externalIdentity?.externalId ?? link.externalIdentityId}</code>\n </p>\n <p>\n Status: {link.status}.{\" \"}\n {link.expiresAt\n ? `Expires ${new Date(link.expiresAt).toLocaleString()}.`\n : \"No automatic expiry.\"}\n </p>\n <p>{link.permissions.join(\", \")}</p>\n {(link.status === \"active\" || link.status === \"pending\") && (\n <button type=\"button\" disabled={busy} onClick={() => void act(link)}>\n Revoke access\n </button>\n )}\n </li>\n ))}\n </ul>\n {cursor && (\n <button type=\"button\" disabled={busy} onClick={() => void act()}>\n Load more links\n </button>\n )}\n </section>\n );\n}\n","import type { ReactNode } from \"react\";\n\nexport type ConnectionInstalledItem = {\n id: string;\n name: string;\n status: string;\n icon?: ReactNode;\n needsAttention?: boolean;\n disabled?: boolean;\n onOpen: () => void;\n};\n\n/** Compact account/service shortcuts. The host supplies authoritative status. */\nexport function ConnectionInstalled({\n items,\n title = \"Connected\",\n className = \"\",\n}: {\n items: ConnectionInstalledItem[];\n title?: string;\n className?: string;\n}) {\n if (!items.length) return null;\n return (\n <section aria-label={title} className={`og-connection-installed ${className}`}>\n <h2>\n {title} <span>{items.length}</span>\n </h2>\n <div>\n {items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n onClick={item.onOpen}\n disabled={item.disabled}\n title={item.status}\n aria-label={`${item.name} · ${item.status}`}\n >\n {item.icon}\n <span>{item.name}</span>\n {item.needsAttention ? <span aria-label=\"Needs attention\">!</span> : null}\n </button>\n ))}\n </div>\n </section>\n );\n}\n","import { useId } from \"react\";\nexport type ConnectionType = \"mcp\" | \"openapi\" | \"graphql\";\nexport function ConnectionTypePicker({\n value,\n onChange,\n disabled = false,\n}: {\n value: ConnectionType;\n onChange: (value: ConnectionType) => void;\n disabled?: boolean;\n}) {\n const name = useId();\n return (\n <fieldset className=\"og-connection-type-picker\" disabled={disabled}>\n <legend>Connection type</legend>\n {(\n [\n [\"mcp\", \"MCP server\"],\n [\"openapi\", \"OpenAPI\"],\n [\"graphql\", \"GraphQL\"],\n ] as const\n ).map(([type, label]) => (\n <label key={type} data-selected={value === type}>\n <input\n type=\"radio\"\n name={name}\n value={type}\n checked={value === type}\n onChange={() => onChange(type)}\n />\n {label}\n </label>\n ))}\n </fieldset>\n );\n}\n","import { useState, type ReactNode } from \"react\";\n/** Brand identifier; failed/missing assets use the supplied fallback or stable initials. */\nexport function ConnectionLogo({\n src,\n name,\n size = 40,\n fallback,\n}: {\n src: string | null;\n name: string;\n size?: number;\n fallback?: ReactNode;\n}) {\n const [failedSrc, setFailedSrc] = useState<string | null>(null);\n return (\n <span className=\"og-connection-logo\" aria-hidden=\"true\" style={{ width: size, height: size }}>\n {src && src !== failedSrc ? (\n <img src={src} alt=\"\" loading=\"lazy\" decoding=\"async\" onError={() => setFailedSrc(src)} />\n ) : (\n (fallback ?? (\n <span>\n {name\n .split(/\\s+/)\n .map((part) => part[0])\n .join(\"\")\n .slice(0, 2)\n .toUpperCase()}\n </span>\n ))\n )}\n </span>\n );\n}\n","import { createDiscoveryCache } from \"./discovery-cache\";\nimport { useEffect, useRef, useState } from \"react\";\nimport type { PluginDiscoveryItem, PluginDiscoveryPage } from \"@opengeni/sdk\";\nimport { BoxesIcon } from \"lucide-react\";\nimport { CapabilityCatalogRow } from \"./capability-catalog-row\";\nimport { ConnectionLogo } from \"./connection-logo\";\n\nconst discoveryCache = createDiscoveryCache<PluginDiscoveryPage>();\nconst EMPTY_INSTALLED_IDS: ReadonlySet<string> = new Set();\n\nexport type PluginDiscoveryProps = {\n client: {\n discoverPlugins(\n workspaceId: string,\n options?: { query?: string; provider?: string; offset?: number },\n ): Promise<PluginDiscoveryPage>;\n };\n workspaceId: string;\n query: string;\n /** Initially selected registry. Users can still switch registries or browse all. */\n defaultProvider?: \"\" | \"openai\" | \"anthropic\";\n /** Discovery identities already installed in the current workspace. */\n installedIds?: ReadonlySet<string>;\n resultLimit?: number;\n onShowMore?: () => void;\n onOpen: (item: PluginDiscoveryItem) => void;\n};\nexport function PluginDiscovery(props: PluginDiscoveryProps) {\n const [provider, setProvider] = useState(props.defaultProvider ?? \"\");\n return (\n <section\n className={`og-plugin-discovery ${props.resultLimit ? \"og-catalog-overview\" : \"\"}`}\n aria-label=\"Discover plugins\"\n >\n <header>\n <h3>{props.resultLimit ? \"Plugins\" : \"Browse plugins\"}</h3>\n {!props.resultLimit ? (\n <div className=\"og-plugin-filters\" role=\"group\" aria-label=\"Plugin registry\">\n {(\n [\n { value: \"\", label: \"All\" },\n { value: \"openai\", label: \"OpenAI plugin registry\" },\n { value: \"anthropic\", label: \"Anthropic plugin registry\" },\n ] as const\n ).map((option) => (\n <button\n key={option.value}\n type=\"button\"\n aria-pressed={provider === option.value}\n onClick={() => setProvider(option.value)}\n >\n {option.label}\n </button>\n ))}\n </div>\n ) : null}\n </header>\n <Results\n key={`${props.workspaceId}:${props.query}:${provider}`}\n {...props}\n provider={provider}\n />\n </section>\n );\n}\nfunction Results({\n client,\n workspaceId,\n query,\n provider,\n installedIds = EMPTY_INSTALLED_IDS,\n onOpen,\n resultLimit,\n onShowMore,\n}: PluginDiscoveryProps & { provider: string }) {\n const initial = discoveryCache.peek(client, JSON.stringify([workspaceId, query, provider, 0]));\n const [items, setItems] = useState<PluginDiscoveryItem[]>(initial?.items ?? []);\n const [offset, setOffset] = useState(0);\n const [next, setNext] = useState<number | null>(initial?.nextOffset ?? null);\n const [total, setTotal] = useState(initial?.total ?? 0);\n const [loading, setLoading] = useState(!initial);\n const [error, setError] = useState(false);\n const [retry, setRetry] = useState(0);\n const sentinel = useRef<HTMLDivElement>(null);\n useEffect(() => {\n let active = true;\n const cacheKey = JSON.stringify([workspaceId, query, provider, offset]);\n const cached = discoveryCache.peek(client, cacheKey);\n setLoading(!cached);\n setError(false);\n const timer = setTimeout(\n () => {\n void discoveryCache\n .read(client, cacheKey, () =>\n client.discoverPlugins(workspaceId, { query, provider, offset }),\n )\n .then(\n (page) => {\n if (!active) return;\n setItems((previous) => (offset ? [...previous, ...page.items] : page.items));\n setTotal(page.total);\n setNext(page.nextOffset);\n setLoading(false);\n },\n () => {\n if (active) {\n setError(true);\n setLoading(false);\n }\n },\n );\n },\n cached || offset ? 0 : 200,\n );\n return () => {\n active = false;\n clearTimeout(timer);\n };\n }, [client, workspaceId, query, provider, offset, retry]);\n useEffect(() => {\n if (resultLimit || loading || error || next === null || !sentinel.current) return;\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) setOffset(next);\n },\n { rootMargin: \"200px\" },\n );\n observer.observe(sentinel.current);\n return () => observer.disconnect();\n }, [loading, error, next, resultLimit]);\n return (\n <>\n {!loading && !error ? (\n <p role=\"status\">\n {total ? `${total} plugins` : \"No matching plugins. Try another search or registry.\"}\n </p>\n ) : null}\n <div className=\"og-plugin-discovery-grid\">\n {items.slice(0, resultLimit).map((item) => (\n <CapabilityCatalogRow\n key={item.id}\n data-plugin-id={item.id}\n name={item.displayName.replace(/-/g, \" \")}\n description={item.description}\n status={installedIds.has(item.id) ? \"added\" : \"available\"}\n statusLabel={installedIds.has(item.id) ? \"Installed\" : \"Available to install\"}\n onOpen={() => onOpen(item)}\n icon={\n <ConnectionLogo\n src={item.logoUrl}\n name={item.displayName}\n fallback={<BoxesIcon aria-hidden=\"true\" />}\n />\n }\n />\n ))}\n </div>\n {loading ? <p role=\"status\">Loading plugins…</p> : null}\n {error ? (\n <p role=\"alert\">\n Couldn’t load plugins.{\" \"}\n <button type=\"button\" onClick={() => setRetry((value) => value + 1)}>\n Retry\n </button>\n </p>\n ) : null}\n {resultLimit && !loading && !error && total > resultLimit ? (\n <button className=\"og-catalog-more\" type=\"button\" onClick={onShowMore}>\n View all plugins\n </button>\n ) : null}\n <div ref={sentinel}>\n {!resultLimit && next !== null && !loading && !error ? (\n <button className=\"og-plugin-more\" type=\"button\" onClick={() => setOffset(next)}>\n Show more plugins\n </button>\n ) : null}\n </div>\n </>\n );\n}\n","import { useState } from \"react\";\nimport { pluginMcpUnavailableReason, type PluginDiscoveryItem } from \"@opengeni/sdk\";\nimport { BoxesIcon } from \"lucide-react\";\nimport { Markdown } from \"./components/markdown\";\nimport { ConnectionLogo } from \"./connection-logo\";\n\nconst componentLabels: Record<string, string> = {\n skills: \"Skills\",\n mcp: \"MCP connections\",\n apps: \"Hosted apps\",\n hooks: \"Hooks\",\n agents: \"Agents\",\n commands: \"Commands\",\n lsp: \"Language servers\",\n};\n\nconst EMPTY_CONNECTIONS: Record<string, boolean> = {};\n\n/** Embeddable plugin overview. Hosts own the dialog and installation actions. */\nexport function PluginDetails({\n item,\n onInstall,\n busy = false,\n installed = false,\n error,\n connections = EMPTY_CONNECTIONS,\n onConnect,\n}: {\n item: PluginDiscoveryItem;\n onInstall?: () => void;\n busy?: boolean;\n installed?: boolean;\n error?: string | null;\n connections?: Record<string, boolean>;\n onConnect?: (server: { name: string; endpoint: string | null }) => void;\n}) {\n const supported = (server: NonNullable<PluginDiscoveryItem[\"mcpServers\"]>[number]) =>\n pluginMcpUnavailableReason(server) === null;\n const contentsUnknown = item.skills == null || item.mcpServers == null;\n const installableCount =\n (item.skills?.length ?? 0) + (item.mcpServers?.filter(supported).length ?? 0);\n const exceedsInstallLimit = installableCount > 64;\n const installable = !contentsUnknown && installableCount > 0 && !exceedsInstallLimit;\n const [expanded, setExpanded] = useState(false);\n const description = item.longDescription || item.description;\n const lengthy = description.length > 700;\n const registryLabel =\n item.provider === \"openai\"\n ? \"OpenAI plugin registry\"\n : item.provider === \"anthropic\"\n ? \"Anthropic plugin registry\"\n : \"Custom source\";\n return (\n <article className=\"og-plugin-details\">\n <header className=\"og-plugin-details-header\">\n <ConnectionLogo\n src={item.logoUrl}\n name={item.displayName}\n fallback={<BoxesIcon aria-hidden=\"true\" />}\n />\n <div>\n <h2>{item.displayName.replace(/-/g, \" \")}</h2>\n {item.author?.name ? <p>By {item.author.name}</p> : null}\n </div>\n </header>\n <div className=\"og-plugin-details-meta\">\n <span>{registryLabel}</span>\n {item.category ? <span>{item.category}</span> : null}\n {item.version ? <span>v{item.version}</span> : null}\n </div>\n <section className=\"og-plugin-details-members\">\n <h3>\n Skills <span>{item.skills?.length ?? \"—\"}</span>\n </h3>\n {item.skills?.length ? (\n <ul>\n {item.skills.map((skill) => (\n <li key={skill.sourceUrl}>\n <a href={skill.sourceUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n <strong>{skill.name}</strong>\n <span aria-hidden=\"true\">↗</span>\n </a>\n </li>\n ))}\n </ul>\n ) : (\n <p>\n {item.skills\n ? \"No bundled skills.\"\n : \"Contents haven’t been indexed for this repository.\"}\n </p>\n )}\n <h3>\n MCP servers <span>{item.mcpServers?.length ?? \"—\"}</span>\n </h3>\n {item.mcpServers?.length ? (\n <ul>\n {item.mcpServers.map((server) => {\n const connected = Boolean(server.endpoint && connections[server.endpoint]);\n // Existing connections remain manageable regardless of the source manifest's setup requirements.\n const unavailableReason = connected ? null : pluginMcpUnavailableReason(server);\n return (\n <li\n key={server.name}\n className={unavailableReason ? \"og-plugin-member-disabled\" : undefined}\n >\n <div className=\"og-plugin-server-heading\">\n <strong>{server.name}</strong>\n {!unavailableReason && onConnect ? (\n <button type=\"button\" disabled={busy} onClick={() => onConnect(server)}>\n {connected ? \"Manage\" : \"Connect\"}\n </button>\n ) : null}\n </div>\n <small>\n {connected ? \"Connected · \" : \"\"}\n {unavailableReason ?? server.endpoint}\n </small>\n </li>\n );\n })}\n </ul>\n ) : (\n <p>\n {item.mcpServers ? \"No bundled MCP servers.\" : \"Server details haven’t been indexed.\"}\n </p>\n )}\n {item.components?.some((component) => ![\"skills\", \"mcp\"].includes(component)) ? (\n <div className=\"og-plugin-details-other\">\n Not installed here:{\" \"}\n {item.components\n .filter((component) => ![\"skills\", \"mcp\"].includes(component))\n .map((component) => componentLabels[component] ?? component)\n .join(\", \")}\n </div>\n ) : null}\n </section>\n <section className=\"og-plugin-details-overview\" aria-label=\"Overview\">\n <div className={lengthy && !expanded ? \"og-plugin-details-excerpt\" : undefined}>\n <Markdown>{description}</Markdown>\n </div>\n {lengthy ? (\n <button\n type=\"button\"\n className=\"og-plugin-details-more\"\n aria-expanded={expanded}\n onClick={() => setExpanded((value) => !value)}\n >\n {expanded ? \"Show less\" : \"Read more\"}\n </button>\n ) : null}\n </section>\n <footer>\n {item.sourceUrl ? (\n <a href={item.sourceUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n View repository <span aria-hidden=\"true\">↗</span>\n </a>\n ) : null}\n {onInstall ? (\n <button\n className=\"og-plugin-install\"\n type=\"button\"\n disabled={!installable || busy || installed}\n onClick={onInstall}\n >\n {installed ? \"Installed\" : busy ? \"Installing…\" : \"Install plugin\"}\n </button>\n ) : null}\n {error ? <p role=\"alert\">{error}</p> : null}\n {exceedsInstallLimit ? (\n <p>This plugin exceeds the current 64-component installation limit.</p>\n ) : contentsUnknown ? (\n <p>\n Plugin contents are unavailable. Installation is disabled until the repository can be\n inspected.\n </p>\n ) : !installable ? (\n <p>No installable skills or remote MCP servers.</p>\n ) : (\n <p>Installs skills and adds connection references. Connect each server separately.</p>\n )}\n </footer>\n </article>\n );\n}\n"],"mappings":"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","names":["jsx","jsxs","useState","jsx","jsxs","useState","Fragment","jsx","jsxs","useEffect","useState","Fragment","jsx","jsxs","useState","useEffect","useEffect","useState","jsx","jsxs","useState","useEffect","jsx","jsxs","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","useEffect","useRef","useState","Fragment","jsx","jsxs","useEffect","useRef","useState","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","jsx","useEffect","useRef","useState","Fragment","jsx","jsxs","discoveryCache","useState","useRef","useEffect","useState","BoxesIcon","jsx","jsxs","useState","BoxesIcon"]}
|