paperclip-github-plugin 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/ui/index.tsx", "../../src/github-repo.ts", "../../src/paperclip-health.ts", "../../src/ui/http.ts", "../../src/ui/plugin-config.ts", "../../src/ui/project-bindings.ts"],
4
- "sourcesContent": ["import React, { useEffect, useRef, useState } from 'react';\nimport { useHostContext, usePluginAction, usePluginData, usePluginToast } from '@paperclipai/plugin-sdk/ui';\n\nimport { parseRepositoryReference, type ParsedRepositoryReference } from '../github-repo.ts';\nimport { requiresPaperclipBoardAccess } from '../paperclip-health.ts';\nimport { buildPaperclipUrl, fetchJson, fetchPaperclipHealth, resolveCliAuthPollUrl } from './http.ts';\nimport { mergePluginConfig, normalizePluginConfig } from './plugin-config.ts';\nimport {\n discoverExistingProjectSyncCandidates,\n filterExistingProjectSyncCandidates,\n type ExistingProjectSyncCandidate,\n type ProjectWorkspaceSummary\n} from './project-bindings.ts';\n\nconst HOST_BUTTON_BASE_CLASSNAME = [\n 'inline-flex items-center justify-center whitespace-nowrap text-sm font-medium',\n 'transition-[color,background-color,border-color,box-shadow,opacity]',\n 'disabled:pointer-events-none disabled:opacity-50',\n \"[&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n '[&_svg]:shrink-0 outline-none focus-visible:border-ring',\n 'focus-visible:ring-ring/50 focus-visible:ring-[3px]',\n 'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive',\n 'rounded-md gap-1.5 shrink-0 shadow-xs'\n].join(' ');\nconst HOST_DEFAULT_BUTTON_CLASSNAME = [\n HOST_BUTTON_BASE_CLASSNAME,\n 'bg-primary text-primary-foreground hover:bg-primary/90'\n].join(' ');\nconst HOST_OUTLINE_BUTTON_CLASSNAME = [\n HOST_BUTTON_BASE_CLASSNAME,\n 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground',\n 'dark:bg-input/30 dark:border-input dark:hover:bg-input/50'\n].join(' ');\nconst HOST_DESTRUCTIVE_BUTTON_CLASSNAME = [\n HOST_BUTTON_BASE_CLASSNAME,\n 'bg-destructive text-white hover:bg-destructive/90',\n 'focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40'\n].join(' ');\nconst HOST_TOOLBAR_BUTTON_SIZE_CLASSNAME = 'px-3 has-[>svg]:px-2.5';\nconst HOST_ACTION_BUTTON_SIZE_CLASSNAME = 'h-9 px-4 py-2 has-[>svg]:px-3';\nconst HOST_INLINE_BUTTON_SIZE_CLASSNAME = 'h-8 px-3 has-[>svg]:px-2.5';\nconst HOST_ENTITY_BUTTON_CLASSNAME = `${HOST_OUTLINE_BUTTON_CLASSNAME} ${HOST_TOOLBAR_BUTTON_SIZE_CLASSNAME} h-9`;\nconst HOST_GLOBAL_BUTTON_CLASSNAME = `${HOST_OUTLINE_BUTTON_CLASSNAME} ${HOST_TOOLBAR_BUTTON_SIZE_CLASSNAME} h-8`;\nconst GITHUB_MARK_PATH_D =\n 'M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.5-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82a7.62 7.62 0 0 1 4 0c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z';\nconst GITHUB_MARK_MASK_DATA_URI =\n 'url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNiAxNiI+PHBhdGggZmlsbD0iYmxhY2siIGQ9Ik04IDBDMy41OCAwIDAgMy41OCAwIDhjMCAzLjU0IDIuMjkgNi41MyA1LjQ3IDcuNTkuNC4wNy41NS0uMTcuNTUtLjM4IDAtLjE5LS4wMS0uODItLjAxLTEuNDktMi4wMS4zNy0yLjUzLS40OS0yLjY5LS45NC0uMDktLjIzLS40OC0uOTQtLjgyLTEuMTMtLjI4LS4xNS0uNjgtLjUyLS4wMS0uNTMuNjMtLjAxIDEuMDguNTggMS4yMy44Mi43MiAxLjIxIDEuODcuODcgMi4zMy42Ni4wNy0uNTIuMjgtLjg3LjUtMS4wNy0xLjc4LS4yLTMuNjQtLjg5LTMuNjQtMy45NSAwLS44Ny4zMS0xLjU5LjgyLTIuMTUtLjA4LS4yLS4zNi0xLjAyLjA4LTIuMTIgMCAwIC42Ny0uMjEgMi4yLjgyYTcuNjIgNy42MiAwIDAgMSA0IDBjMS41My0xLjA0IDIuMi0uODIgMi4yLS44Mi40NCAxLjEuMTYgMS45Mi4wOCAyLjEyLjUxLjU2LjgyIDEuMjcuODIgMi4xNSAwIDMuMDctMS44NyAzLjc1LTMuNjUgMy45NS4yOS4yNS41NC43My41NCAxLjQ4IDAgMS4wNy0uMDEgMS45My0uMDEgMi4yIDAgLjIxLjE1LjQ2LjU1LjM4QTguMDEgOC4wMSAwIDAgMCAxNiA4YzAtNC40Mi0zLjU4LTgtOC04WiIvPjwvc3ZnPg==\")';\n\ntype PluginActionButtonVariant = 'primary' | 'secondary' | 'danger';\ntype PluginActionButtonSize = 'default' | 'sm';\n\nfunction getPluginActionClassName(options?: {\n variant?: PluginActionButtonVariant;\n size?: PluginActionButtonSize;\n extraClassName?: string;\n}): string {\n const variant = options?.variant ?? 'secondary';\n const size = options?.size ?? 'default';\n const variantClassName =\n variant === 'primary'\n ? HOST_DEFAULT_BUTTON_CLASSNAME\n : variant === 'danger'\n ? HOST_DESTRUCTIVE_BUTTON_CLASSNAME\n : HOST_OUTLINE_BUTTON_CLASSNAME;\n const sizeClassName = size === 'sm' ? HOST_INLINE_BUTTON_SIZE_CLASSNAME : HOST_ACTION_BUTTON_SIZE_CLASSNAME;\n\n return ['ghsync__button', variantClassName, sizeClassName, options?.extraClassName].filter(Boolean).join(' ');\n}\n\ninterface RepositoryMapping {\n id: string;\n repositoryUrl: string;\n paperclipProjectName: string;\n paperclipProjectId?: string;\n companyId?: string;\n}\n\ninterface SyncRunState {\n status: 'idle' | 'running' | 'success' | 'error';\n message?: string;\n checkedAt?: string;\n syncedIssuesCount?: number;\n createdIssuesCount?: number;\n skippedIssuesCount?: number;\n erroredIssuesCount?: number;\n lastRunTrigger?: 'manual' | 'schedule' | 'retry';\n progress?: SyncProgressState;\n errorDetails?: SyncErrorDetails;\n}\n\ntype SyncProgressPhase = 'preparing' | 'importing' | 'syncing';\ntype SyncConfigurationIssue = 'missing_token' | 'missing_mapping' | 'missing_board_access';\n\ninterface SyncProgressState {\n phase?: SyncProgressPhase;\n totalRepositoryCount?: number;\n currentRepositoryIndex?: number;\n currentRepositoryUrl?: string;\n completedIssueCount?: number;\n totalIssueCount?: number;\n currentIssueNumber?: number;\n detailLabel?: string;\n}\n\ntype SyncFailurePhase =\n | 'configuration'\n | 'loading_paperclip_labels'\n | 'listing_github_issues'\n | 'building_import_plan'\n | 'importing_issue'\n | 'syncing_labels'\n | 'syncing_description'\n | 'evaluating_github_status'\n | 'updating_paperclip_status';\n\ninterface SyncErrorDetails {\n phase?: SyncFailurePhase;\n configurationIssue?: SyncConfigurationIssue;\n repositoryUrl?: string;\n githubIssueNumber?: number;\n rawMessage?: string;\n suggestedAction?: string;\n rateLimitResetAt?: string;\n rateLimitResource?: string;\n}\n\ntype PaperclipIssueStatus = 'backlog' | 'todo' | 'in_progress' | 'in_review' | 'done' | 'blocked' | 'cancelled';\n\ninterface GitHubSyncAdvancedSettings {\n defaultAssigneeAgentId?: string;\n defaultStatus: PaperclipIssueStatus;\n ignoredIssueAuthorUsernames: string[];\n}\n\ninterface GitHubSyncAssigneeOption {\n id: string;\n name: string;\n title?: string;\n status?: string;\n}\n\ninterface GitHubSyncSettings {\n mappings: RepositoryMapping[];\n syncState: SyncRunState;\n scheduleFrequencyMinutes: number;\n advancedSettings: GitHubSyncAdvancedSettings;\n availableAssignees?: GitHubSyncAssigneeOption[];\n paperclipApiBaseUrl?: string;\n githubTokenConfigured?: boolean;\n paperclipBoardAccessConfigured?: boolean;\n paperclipBoardAccessNeedsConfigSync?: boolean;\n paperclipBoardAccessConfigSyncRef?: string;\n totalSyncedIssuesCount?: number;\n updatedAt?: string;\n}\n\ninterface SyncToolbarStateData {\n kind: 'global' | 'project' | 'issue';\n visible: boolean;\n canRun: boolean;\n label: string;\n message?: string;\n syncState: SyncRunState;\n githubTokenConfigured: boolean;\n savedMappingCount: number;\n}\n\ninterface GitHubIssueDetailsData {\n paperclipIssueId: string;\n source: 'entity' | 'import_registry' | 'description';\n githubIssueNumber: number;\n githubIssueUrl: string;\n repositoryUrl: string;\n githubIssueState?: 'open' | 'closed';\n githubIssueStateReason?: 'completed' | 'not_planned' | 'duplicate';\n commentsCount?: number;\n linkedPullRequestNumbers: number[];\n labels?: Array<{\n name: string;\n color?: string;\n }>;\n syncedAt?: string;\n}\n\ninterface IssueIdentifierResolutionData {\n issueId: string;\n issueIdentifier: string;\n}\n\ninterface CommentAnnotationData {\n source: 'entity' | 'comment_body';\n links: Array<{\n type: 'issue' | 'pull_request';\n label: string;\n href: string;\n }>;\n previousStatus?: string;\n nextStatus?: string;\n reason?: string;\n}\n\ninterface TokenValidationResult {\n login: string;\n}\n\ninterface CliAuthChallengeResponse {\n token?: string;\n boardApiToken?: string;\n approvalUrl?: string;\n approvalPath?: string;\n pollUrl?: string;\n pollPath?: string;\n expiresAt?: string;\n suggestedPollIntervalMs?: number;\n}\n\ninterface CliAuthChallengePollResponse {\n status?: string;\n boardApiToken?: string;\n}\n\ninterface CliAuthIdentityResponse {\n login?: string | null;\n email?: string | null;\n displayName?: string | null;\n name?: string | null;\n user?: {\n login?: string | null;\n email?: string | null;\n displayName?: string | null;\n name?: string | null;\n } | null;\n}\n\ninterface PluginConfigResponse {\n configJson?: Record<string, unknown> | null;\n}\n\ntype ThemeMode = 'light' | 'dark';\ntype Tone = 'neutral' | 'success' | 'warning' | 'info' | 'danger';\ntype TokenStatus = 'required' | 'valid' | 'invalid';\ntype BoardAccessRequirementStatus = 'loading' | 'required' | 'not_required' | 'unknown';\ntype SelectTone = 'neutral' | 'blue' | 'yellow' | 'violet' | 'green' | 'red';\n\ninterface ThemePalette {\n text: string;\n title: string;\n muted: string;\n surface: string;\n surfaceAlt: string;\n surfaceRaised: string;\n border: string;\n borderSoft: string;\n inputBg: string;\n inputBorder: string;\n inputText: string;\n badgeBg: string;\n badgeBorder: string;\n badgeText: string;\n primaryBg: string;\n primaryBorder: string;\n primaryText: string;\n secondaryBg: string;\n secondaryBorder: string;\n secondaryText: string;\n dangerBg: string;\n dangerBorder: string;\n dangerText: string;\n successBg: string;\n successBorder: string;\n successText: string;\n warningBg: string;\n warningBorder: string;\n warningText: string;\n infoBg: string;\n infoBorder: string;\n infoText: string;\n shadow: string;\n}\n\nconst LIGHT_PALETTE: ThemePalette = {\n text: '#18181b',\n title: '#09090b',\n muted: '#71717a',\n surface: '#ffffff',\n surfaceAlt: '#fafafa',\n surfaceRaised: '#f5f5f5',\n border: '#e4e4e7',\n borderSoft: '#f4f4f5',\n inputBg: '#ffffff',\n inputBorder: '#d4d4d8',\n inputText: '#18181b',\n badgeBg: '#fafafa',\n badgeBorder: '#e4e4e7',\n badgeText: '#3f3f46',\n primaryBg: '#18181b',\n primaryBorder: '#18181b',\n primaryText: '#fafafa',\n secondaryBg: '#ffffff',\n secondaryBorder: '#d4d4d8',\n secondaryText: '#27272a',\n dangerBg: '#fff1f2',\n dangerBorder: '#fecdd3',\n dangerText: '#be123c',\n successBg: '#f0fdf4',\n successBorder: '#bbf7d0',\n successText: '#166534',\n warningBg: '#fffbeb',\n warningBorder: '#fde68a',\n warningText: '#a16207',\n infoBg: '#eff6ff',\n infoBorder: '#bfdbfe',\n infoText: '#1d4ed8',\n shadow: '0 12px 30px rgba(15, 23, 42, 0.05)'\n};\n\nconst DARK_PALETTE: ThemePalette = {\n text: '#f5f5f5',\n title: '#fafafa',\n muted: '#a1a1aa',\n surface: 'rgba(10, 10, 11, 0.96)',\n surfaceAlt: 'rgba(15, 15, 17, 1)',\n surfaceRaised: 'rgba(19, 19, 24, 1)',\n border: 'rgba(63, 63, 70, 0.92)',\n borderSoft: 'rgba(39, 39, 42, 1)',\n inputBg: 'rgba(15, 15, 17, 1)',\n inputBorder: 'rgba(63, 63, 70, 1)',\n inputText: '#fafafa',\n badgeBg: 'rgba(24, 24, 27, 0.9)',\n badgeBorder: 'rgba(63, 63, 70, 1)',\n badgeText: '#d4d4d8',\n primaryBg: '#f4f4f5',\n primaryBorder: 'rgba(82, 82, 91, 1)',\n primaryText: '#111113',\n secondaryBg: 'rgba(24, 24, 27, 1)',\n secondaryBorder: 'rgba(63, 63, 70, 1)',\n secondaryText: '#e4e4e7',\n dangerBg: 'rgba(69, 10, 10, 0.24)',\n dangerBorder: 'rgba(127, 29, 29, 0.8)',\n dangerText: '#fca5a5',\n successBg: 'rgba(20, 83, 45, 0.16)',\n successBorder: 'rgba(34, 197, 94, 0.25)',\n successText: '#bbf7d0',\n warningBg: 'rgba(146, 64, 14, 0.2)',\n warningBorder: 'rgba(245, 158, 11, 0.24)',\n warningText: '#fcd34d',\n infoBg: 'rgba(29, 78, 216, 0.2)',\n infoBorder: 'rgba(96, 165, 250, 0.24)',\n infoText: '#93c5fd',\n shadow: '0 18px 40px rgba(0, 0, 0, 0.24)'\n};\n\nconst DEFAULT_SCHEDULE_FREQUENCY_MINUTES = 15;\nconst SYNC_POLL_INTERVAL_MS = 750;\nconst CLI_AUTH_POLL_INTERVAL_FALLBACK_MS = 1_000;\nconst CLI_AUTH_POLL_INTERVAL_MIN_MS = 500;\nconst CLI_AUTH_POLL_INTERVAL_MAX_MS = 5_000;\nconst MISSING_GITHUB_TOKEN_SYNC_MESSAGE = 'Configure a GitHub token secret before running sync.';\nconst MISSING_GITHUB_TOKEN_SYNC_ACTION = 'Open settings, add a GitHub token secret, validate it, and then run sync again.';\nconst MISSING_MAPPING_SYNC_MESSAGE = 'Save at least one mapping with a created Paperclip project before running sync.';\nconst MISSING_MAPPING_SYNC_ACTION =\n 'Open settings, add a repository mapping, let Paperclip create the target project, and then retry sync.';\nconst MISSING_BOARD_ACCESS_SYNC_MESSAGE =\n 'Connect Paperclip board access before running sync on this authenticated deployment.';\nconst MISSING_BOARD_ACCESS_SYNC_ACTION =\n 'Open plugin settings for each mapped company that sync will touch, connect Paperclip board access, approve the flow, and then run sync again.';\nconst DEFAULT_IGNORED_GITHUB_ISSUE_USERNAMES = ['renovate'];\n\nconst DEFAULT_ADVANCED_SETTINGS: GitHubSyncAdvancedSettings = {\n defaultStatus: 'backlog',\n ignoredIssueAuthorUsernames: DEFAULT_IGNORED_GITHUB_ISSUE_USERNAMES\n};\n\nconst PAPERCLIP_STATUS_OPTIONS: Array<{ value: PaperclipIssueStatus; label: string; tone: SelectTone }> = [\n { value: 'backlog', label: 'Backlog', tone: 'neutral' },\n { value: 'todo', label: 'Todo', tone: 'blue' },\n { value: 'in_progress', label: 'In Progress', tone: 'yellow' },\n { value: 'in_review', label: 'In Review', tone: 'violet' },\n { value: 'done', label: 'Done', tone: 'green' },\n { value: 'blocked', label: 'Blocked', tone: 'red' },\n { value: 'cancelled', label: 'Cancelled', tone: 'neutral' }\n];\n\nconst EMPTY_SETTINGS: GitHubSyncSettings = {\n mappings: [],\n syncState: {\n status: 'idle'\n },\n scheduleFrequencyMinutes: DEFAULT_SCHEDULE_FREQUENCY_MINUTES,\n advancedSettings: DEFAULT_ADVANCED_SETTINGS,\n availableAssignees: []\n};\n\nfunction createIdleSyncState(): SyncRunState {\n return {\n status: 'idle'\n };\n}\n\nfunction getLegacySyncConfigurationIssue(syncState: SyncRunState): SyncConfigurationIssue | null {\n if (syncState.status !== 'error' || syncState.errorDetails?.phase !== 'configuration') {\n return null;\n }\n\n const message = syncState.message?.trim();\n const suggestedAction = syncState.errorDetails?.suggestedAction?.trim();\n\n if (message === MISSING_GITHUB_TOKEN_SYNC_MESSAGE || suggestedAction === MISSING_GITHUB_TOKEN_SYNC_ACTION) {\n return 'missing_token';\n }\n\n if (message === MISSING_MAPPING_SYNC_MESSAGE || suggestedAction === MISSING_MAPPING_SYNC_ACTION) {\n return 'missing_mapping';\n }\n\n if (message === MISSING_BOARD_ACCESS_SYNC_MESSAGE || suggestedAction === MISSING_BOARD_ACCESS_SYNC_ACTION) {\n return 'missing_board_access';\n }\n\n return null;\n}\n\nfunction getSyncConfigurationIssue(syncState: SyncRunState): SyncConfigurationIssue | null {\n return syncState.errorDetails?.configurationIssue ?? getLegacySyncConfigurationIssue(syncState);\n}\n\nfunction getDisplaySyncState(\n syncState: SyncRunState,\n setup: {\n hasToken: boolean;\n hasMappings: boolean;\n hasBoardAccess: boolean;\n }\n): SyncRunState {\n const configurationIssue = getSyncConfigurationIssue(syncState);\n if (!configurationIssue) {\n return syncState;\n }\n\n if (configurationIssue === 'missing_token' && setup.hasToken) {\n return createIdleSyncState();\n }\n\n if (configurationIssue === 'missing_mapping' && setup.hasMappings) {\n return createIdleSyncState();\n }\n\n if (configurationIssue === 'missing_board_access' && setup.hasBoardAccess) {\n return createIdleSyncState();\n }\n\n return syncState;\n}\n\nfunction getSyncSetupIssue(params: {\n tokenStatus: TokenStatus;\n savedMappingCount: number;\n boardAccessRequired: boolean;\n boardAccessConfigured: boolean;\n hasCompanyContext: boolean;\n}): SyncConfigurationIssue | null {\n if (params.tokenStatus !== 'valid') {\n return 'missing_token';\n }\n\n if (params.savedMappingCount === 0) {\n return 'missing_mapping';\n }\n\n if (params.boardAccessRequired && (!params.hasCompanyContext || !params.boardAccessConfigured)) {\n return 'missing_board_access';\n }\n\n return null;\n}\n\nfunction getSyncSetupMessage(\n issue: SyncConfigurationIssue | null,\n hasCompanyContext: boolean\n): string {\n switch (issue) {\n case 'missing_token':\n return 'Add a valid token to enable sync.';\n case 'missing_mapping':\n return 'Save a repository to enable sync.';\n case 'missing_board_access':\n return hasCompanyContext\n ? 'Connect Paperclip board access to enable sync on this authenticated deployment.'\n : 'Open plugin settings inside a company to connect required Paperclip board access.';\n default:\n return 'Ready to sync.';\n }\n}\n\nfunction usePaperclipBoardAccessRequirement(): {\n status: BoardAccessRequirementStatus;\n required: boolean;\n} {\n const [status, setStatus] = useState<BoardAccessRequirementStatus>('loading');\n\n useEffect(() => {\n let cancelled = false;\n\n void (async () => {\n const health = await fetchPaperclipHealth();\n if (cancelled) {\n return;\n }\n\n if (!health) {\n setStatus('unknown');\n return;\n }\n\n setStatus(requiresPaperclipBoardAccess(health) ? 'required' : 'not_required');\n })();\n\n return () => {\n cancelled = true;\n };\n }, []);\n\n return {\n status,\n required: status === 'required'\n };\n}\n\nfunction getGitHubRateLimitResourceLabel(resource?: string): string | null {\n switch (resource?.trim().toLowerCase()) {\n case 'core':\n return 'REST API';\n case 'graphql':\n return 'GraphQL API';\n case 'search':\n return 'Search API';\n default:\n return resource?.trim() ? `GitHub ${resource.trim()} API` : null;\n }\n}\n\nfunction getActiveRateLimitPause(syncState: SyncRunState, referenceTimeMs = Date.now()): {\n resetAt: string;\n resource?: string;\n} | null {\n if (syncState.status !== 'error' || !syncState.errorDetails?.rateLimitResetAt) {\n return null;\n }\n\n const resetAt = syncState.errorDetails.rateLimitResetAt.trim();\n const resetTimeMs = Date.parse(resetAt);\n if (!Number.isFinite(resetTimeMs) || resetTimeMs <= referenceTimeMs) {\n return null;\n }\n\n return {\n resetAt,\n ...(syncState.errorDetails.rateLimitResource ? { resource: syncState.errorDetails.rateLimitResource } : {})\n };\n}\n\nfunction getSyncToastTitle(syncState: SyncRunState): string {\n if (getActiveRateLimitPause(syncState)) {\n return 'GitHub sync is paused';\n }\n\n if (syncState.status === 'running') {\n return 'GitHub sync is running';\n }\n\n return syncState.status === 'error' ? 'GitHub sync needs attention' : 'GitHub sync finished';\n}\n\nfunction getSyncToastBody(syncState: SyncRunState): string {\n if (syncState.message?.trim()) {\n return syncState.message.trim();\n }\n\n if (syncState.status === 'running') {\n return 'GitHub sync is running in the background.';\n }\n\n return 'GitHub sync completed.';\n}\n\nfunction getSyncToastTone(syncState: SyncRunState): 'info' | 'error' | 'success' {\n if (getActiveRateLimitPause(syncState)) {\n return 'info';\n }\n\n if (syncState.status === 'running') {\n return 'info';\n }\n\n return syncState.status === 'error' ? 'error' : 'success';\n}\n\nfunction useSyncCompletionToast(\n syncState: SyncRunState,\n toast: ReturnType<typeof usePluginToast>\n): (nextSyncState: SyncRunState) => void {\n const completionToastArmedRef = useRef(false);\n const previousStatusRef = useRef<SyncRunState['status']>(syncState.status);\n\n useEffect(() => {\n const previousStatus = previousStatusRef.current;\n previousStatusRef.current = syncState.status;\n\n if (!completionToastArmedRef.current || previousStatus !== 'running' || syncState.status === 'running') {\n return;\n }\n\n completionToastArmedRef.current = false;\n toast({\n title: getSyncToastTitle(syncState),\n body: getSyncToastBody(syncState),\n tone: getSyncToastTone(syncState)\n });\n }, [syncState, toast]);\n\n return (nextSyncState: SyncRunState) => {\n completionToastArmedRef.current = nextSyncState.status === 'running';\n previousStatusRef.current = nextSyncState.status;\n };\n}\n\nconst SHARED_PROGRESS_STYLES = `\n.ghsync-progress {\n display: grid;\n gap: 10px;\n padding: 14px;\n border-radius: 10px;\n border: 1px solid var(--ghsync-info-border);\n background: var(--ghsync-info-bg);\n}\n\n.ghsync-progress--compact {\n gap: 8px;\n padding: 12px;\n}\n\n.ghsync-progress__header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.ghsync-progress__copy strong {\n display: block;\n font-size: 13px;\n color: var(--ghsync-title);\n}\n\n.ghsync-progress__copy span {\n display: block;\n margin-top: 4px;\n color: var(--ghsync-muted);\n font-size: 12px;\n line-height: 1.5;\n}\n\n.ghsync-progress__pill {\n display: inline-flex;\n align-items: center;\n min-height: 24px;\n padding: 0 10px;\n border-radius: 999px;\n border: 1px solid var(--ghsync-info-border);\n background: var(--ghsync-surfaceAlt);\n color: var(--ghsync-info-text);\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n white-space: nowrap;\n}\n\n.ghsync-progress__track {\n position: relative;\n overflow: hidden;\n height: 10px;\n border-radius: 999px;\n border: 1px solid var(--ghsync-border-soft);\n background: var(--ghsync-surfaceRaised);\n}\n\n.ghsync-progress__fill {\n height: 100%;\n min-width: 12px;\n border-radius: inherit;\n background: linear-gradient(90deg, var(--ghsync-info-border) 0%, var(--ghsync-info-text) 100%);\n transition: width 220ms ease;\n}\n\n.ghsync-progress__fill--indeterminate {\n width: 34%;\n animation: ghsync-progress-slide 1.4s ease-in-out infinite;\n}\n\n.ghsync-progress__meta {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n flex-wrap: wrap;\n}\n\n.ghsync-progress__meta span {\n color: var(--ghsync-muted);\n font-size: 11px;\n line-height: 1.5;\n}\n\n@keyframes ghsync-progress-slide {\n 0% {\n transform: translateX(-120%);\n }\n\n 100% {\n transform: translateX(320%);\n }\n}\n\n@media (max-width: 640px) {\n .ghsync-progress__header,\n .ghsync-progress__meta {\n align-items: stretch;\n flex-direction: column;\n }\n}\n`;\n\nconst PAGE_STYLES = `\n.ghsync {\n display: grid;\n gap: 16px;\n color: var(--ghsync-text);\n font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n}\n\n.ghsync * {\n box-sizing: border-box;\n}\n\n.ghsync button,\n.ghsync input {\n font-family: inherit;\n}\n\n.ghsync__header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n flex-wrap: wrap;\n}\n\n.ghsync__header-copy {\n min-width: 0;\n}\n\n.ghsync__header-copy h2 {\n margin: 0;\n font-size: 20px;\n line-height: 1.2;\n font-weight: 700;\n color: var(--ghsync-title);\n}\n\n.ghsync__header-copy p {\n margin: 8px 0 0;\n max-width: 760px;\n color: var(--ghsync-muted);\n font-size: 13px;\n line-height: 1.55;\n}\n\n.ghsync__scope-overview {\n display: grid;\n gap: 12px;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n\n.ghsync__scope-card {\n display: grid;\n gap: 12px;\n padding: 16px;\n border-radius: 12px;\n border: 1px solid var(--ghsync-border-soft);\n background: var(--ghsync-surfaceRaised);\n}\n\n.ghsync__scope-card--company {\n border-color: var(--ghsync-border);\n background:\n linear-gradient(180deg, color-mix(in srgb, var(--ghsync-surfaceRaised) 82%, var(--ghsync-success-bg)), var(--ghsync-surfaceRaised));\n}\n\n.ghsync__scope-card--global {\n border-color: var(--ghsync-info-border);\n background:\n linear-gradient(180deg, color-mix(in srgb, var(--ghsync-surfaceRaised) 78%, var(--ghsync-info-bg)), var(--ghsync-surfaceRaised));\n}\n\n.ghsync__scope-head {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 10px;\n flex-wrap: wrap;\n}\n\n.ghsync__scope-kicker {\n display: block;\n color: var(--ghsync-muted);\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n}\n\n.ghsync__scope-card .ghsync__scope-name {\n margin: 0;\n font-size: 22px;\n line-height: 1.15;\n font-weight: 700;\n color: var(--ghsync-title);\n}\n\n.ghsync__scope-card p {\n margin: 0;\n color: var(--ghsync-muted);\n font-size: 12px;\n line-height: 1.55;\n}\n\n.ghsync__scope-points {\n display: grid;\n gap: 8px;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.ghsync__scope-points li {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n color: var(--ghsync-text);\n font-size: 12px;\n line-height: 1.5;\n}\n\n.ghsync__scope-points li::before {\n content: \"\";\n width: 7px;\n height: 7px;\n margin-top: 5px;\n flex: 0 0 auto;\n border-radius: 999px;\n background: currentColor;\n opacity: 0.65;\n}\n\n.ghsync__layout {\n display: grid;\n gap: 16px;\n align-items: start;\n grid-template-columns: minmax(0, 1.45fr) minmax(260px, 0.8fr);\n}\n\n.ghsync__card {\n overflow: hidden;\n border-radius: 12px;\n border: 1px solid var(--ghsync-border);\n background: var(--ghsync-surface);\n box-shadow: var(--ghsync-shadow);\n}\n\n.ghsync__card-header {\n padding: 16px 18px;\n border-bottom: 1px solid var(--ghsync-border-soft);\n}\n\n.ghsync__card-header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 700;\n color: var(--ghsync-title);\n}\n\n.ghsync__card-header p {\n margin: 6px 0 0;\n color: var(--ghsync-muted);\n font-size: 12px;\n line-height: 1.5;\n}\n\n.ghsync__loading,\n.ghsync__message {\n margin: 0 18px;\n}\n\n.ghsync__loading {\n margin-top: 16px;\n color: var(--ghsync-muted);\n font-size: 12px;\n}\n\n.ghsync__message {\n margin-top: 16px;\n padding: 10px 12px;\n border-radius: 10px;\n border: 1px solid var(--ghsync-border-soft);\n background: var(--ghsync-surfaceAlt);\n color: var(--ghsync-text);\n font-size: 13px;\n line-height: 1.5;\n}\n\n.ghsync__message--error {\n border-color: var(--ghsync-danger-border);\n background: var(--ghsync-danger-bg);\n color: var(--ghsync-danger-text);\n}\n\n.ghsync-diagnostics {\n display: grid;\n gap: 10px;\n padding: 14px;\n border-radius: 10px;\n border: 1px solid var(--ghsync-dangerBorder);\n background: var(--ghsync-dangerBg);\n}\n\n.ghsync-diagnostics__header {\n display: grid;\n gap: 4px;\n}\n\n.ghsync-diagnostics__header strong {\n font-size: 13px;\n color: var(--ghsync-dangerText);\n}\n\n.ghsync-diagnostics__header span {\n color: var(--ghsync-muted);\n font-size: 12px;\n line-height: 1.5;\n}\n\n.ghsync-diagnostics__grid {\n display: grid;\n gap: 10px;\n grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\n}\n\n.ghsync-diagnostics__item,\n.ghsync-diagnostics__block {\n display: grid;\n gap: 6px;\n padding: 12px;\n border-radius: 10px;\n border: 1px solid var(--ghsync-dangerBorder);\n background: var(--ghsync-surfaceAlt);\n}\n\n.ghsync-diagnostics__label {\n color: var(--ghsync-dangerText);\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n}\n\n.ghsync-diagnostics__value {\n color: var(--ghsync-title);\n font-size: 13px;\n line-height: 1.5;\n word-break: break-word;\n}\n\n.ghsync-diagnostics__value--code {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", monospace;\n font-size: 12px;\n white-space: pre-wrap;\n}\n\n.ghsync__section {\n display: grid;\n gap: 14px;\n padding: 18px;\n border-top: 1px solid var(--ghsync-border-soft);\n}\n\n.ghsync__section-head {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.ghsync__section-head-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n justify-content: flex-end;\n}\n\n.ghsync__section-copy {\n min-width: 0;\n}\n\n.ghsync__section-title-row {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: wrap;\n}\n\n.ghsync__section-copy h4 {\n margin: 0;\n font-size: 14px;\n font-weight: 700;\n color: var(--ghsync-title);\n}\n\n.ghsync__section-tags {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.ghsync__section-copy p {\n margin: 6px 0 0;\n color: var(--ghsync-muted);\n font-size: 12px;\n line-height: 1.5;\n}\n\n.ghsync__summary-line {\n margin: 8px 0 0;\n color: var(--ghsync-title);\n font-size: 12px;\n line-height: 1.5;\n}\n\n.ghsync__scope-pill {\n display: inline-flex;\n align-items: center;\n min-height: 22px;\n padding: 0 9px;\n border-radius: 999px;\n border: 1px solid var(--ghsync-border);\n background: transparent;\n color: var(--ghsync-title);\n font-size: 11px;\n font-weight: 700;\n line-height: 1;\n white-space: nowrap;\n}\n\n.ghsync__scope-pill--company {\n border-color: var(--ghsync-border);\n background: var(--ghsync-surface);\n color: var(--ghsync-title);\n}\n\n.ghsync__scope-pill--global {\n border-color: var(--ghsync-info-border);\n background: var(--ghsync-info-bg);\n color: var(--ghsync-info-text);\n}\n\n.ghsync__scope-pill--mixed {\n border-color: var(--ghsync-warning-border);\n background: var(--ghsync-warning-bg);\n color: var(--ghsync-warning-text);\n}\n\n.ghsync__badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n min-height: 24px;\n padding: 0 10px;\n border-radius: 999px;\n border: 1px solid var(--ghsync-badge-border);\n background: var(--ghsync-badge-bg);\n color: var(--ghsync-badge-text);\n font-size: 12px;\n font-weight: 600;\n line-height: 1;\n white-space: nowrap;\n}\n\n.ghsync__badge--success {\n border-color: var(--ghsync-success-border);\n background: var(--ghsync-success-bg);\n color: var(--ghsync-success-text);\n}\n\n.ghsync__badge--warning {\n border-color: var(--ghsync-warning-border);\n background: var(--ghsync-warning-bg);\n color: var(--ghsync-warning-text);\n}\n\n.ghsync__badge--info {\n border-color: var(--ghsync-info-border);\n background: var(--ghsync-info-bg);\n color: var(--ghsync-info-text);\n}\n\n.ghsync__badge--danger {\n border-color: var(--ghsync-danger-border);\n background: var(--ghsync-danger-bg);\n color: var(--ghsync-danger-text);\n}\n\n.ghsync__badge--neutral {\n border-color: var(--ghsync-border);\n background: transparent;\n color: var(--ghsync-muted);\n}\n\n.ghsync__badge-dot {\n width: 7px;\n height: 7px;\n border-radius: 999px;\n background: currentColor;\n}\n\n.ghsync__stack,\n.ghsync__mapping-list,\n.ghsync__side-body,\n.ghsync__detail-list {\n display: grid;\n gap: 12px;\n}\n\n.ghsync__field {\n display: grid;\n gap: 8px;\n}\n\n.ghsync__field label {\n font-size: 12px;\n font-weight: 600;\n color: var(--ghsync-title);\n}\n\n.ghsync__input {\n width: 100%;\n min-height: 40px;\n border-radius: 10px;\n border: 1px solid var(--ghsync-input-border);\n background: var(--ghsync-input-bg);\n color: var(--ghsync-input-text);\n padding: 0 12px;\n outline: none;\n}\n\n.ghsync__input::placeholder {\n color: var(--ghsync-muted);\n}\n\n.ghsync__input:focus {\n border-color: var(--ghsync-border);\n}\n\n.ghsync__input[readonly] {\n opacity: 0.78;\n}\n\n.ghsync__input:disabled {\n opacity: 0.72;\n cursor: not-allowed;\n}\n\n.ghsync__picker {\n position: relative;\n}\n\n.ghsync__picker-trigger {\n width: fit-content;\n max-width: 100%;\n min-height: 0;\n display: inline-flex;\n align-items: center;\n justify-content: space-between;\n gap: 6px;\n border-radius: 8px;\n border: 1px solid var(--ghsync-border);\n background: color-mix(in srgb, var(--ghsync-badgeBg) 72%, transparent);\n color: var(--ghsync-text);\n padding: 4px 8px;\n text-align: left;\n cursor: pointer;\n transition: background-color 120ms ease, color 120ms ease, border-color 120ms ease;\n}\n\n.ghsync__picker-trigger:disabled {\n opacity: 0.72;\n cursor: not-allowed;\n}\n\n.ghsync__picker-trigger:focus,\n.ghsync__picker-trigger:focus-visible {\n outline: none;\n border-color: var(--ghsync-border);\n}\n\n.ghsync__picker-trigger:hover {\n background: var(--ghsync-surfaceRaised);\n}\n\n.ghsync__picker-trigger--assignee {\n min-width: 10rem;\n font-size: 14px;\n font-weight: 500;\n}\n\n.ghsync__picker-trigger--status {\n font-size: 12px;\n}\n\n.ghsync__picker-trigger-main {\n min-width: 0;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n\n.ghsync__picker-agent-icon {\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n color: var(--ghsync-muted);\n}\n\n.ghsync__picker-agent-icon svg {\n width: 14px;\n height: 14px;\n}\n\n.ghsync__picker-trigger-label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.ghsync__picker-trigger-icon {\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n color: var(--ghsync-muted);\n}\n\n.ghsync__picker-trigger-icon svg,\n.ghsync__picker-option-check svg {\n width: 16px;\n height: 16px;\n}\n\n.ghsync__picker-panel {\n position: absolute;\n top: calc(100% + 8px);\n left: 0;\n z-index: 30;\n border-radius: 8px;\n border: 1px solid var(--ghsync-border);\n background: var(--ghsync-surfaceAlt);\n box-shadow: var(--ghsync-shadow);\n padding: 4px;\n}\n\n.ghsync__picker-panel--assignee {\n width: min(20rem, calc(100vw - 2rem));\n}\n\n.ghsync__picker-panel--status {\n width: 9rem;\n}\n\n.ghsync__picker-search {\n padding: 2px 2px 6px;\n}\n\n.ghsync__picker-search-input {\n width: 100%;\n min-height: 32px;\n border-radius: 6px;\n border: 1px solid transparent;\n background: transparent;\n color: var(--ghsync-input-text);\n padding: 0 8px;\n font-size: 14px;\n outline: none;\n}\n\n.ghsync__picker-search-input::placeholder {\n color: var(--ghsync-muted);\n}\n\n.ghsync__picker-search-input:focus,\n.ghsync__picker-search-input:focus-visible {\n border-color: var(--ghsync-input-border);\n background: var(--ghsync-surfaceRaised);\n}\n\n.ghsync__picker-list {\n display: flex;\n flex-direction: column;\n gap: 2px;\n max-height: 240px;\n overflow: auto;\n}\n\n.ghsync__picker-option {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--ghsync-input-text);\n padding: 6px 8px;\n text-align: left;\n cursor: pointer;\n}\n\n.ghsync__picker-option:hover,\n.ghsync__picker-option:focus,\n.ghsync__picker-option:focus-visible,\n.ghsync__picker-option--selected {\n outline: none;\n background: var(--ghsync-surfaceRaised);\n}\n\n.ghsync__picker-panel--assignee .ghsync__picker-option {\n font-size: 14px;\n touch-action: manipulation;\n}\n\n.ghsync__picker-panel--status .ghsync__picker-option {\n font-size: 12px;\n}\n\n.ghsync__picker-option-label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.ghsync__picker-option-check {\n flex: 0 0 auto;\n color: var(--ghsync-muted);\n}\n\n.ghsync__picker-empty {\n padding: 10px 12px;\n color: var(--ghsync-muted);\n font-size: 13px;\n}\n\n.ghsync__select-dot {\n width: 10px;\n height: 10px;\n flex: 0 0 auto;\n border-radius: 999px;\n border: 1px solid currentColor;\n background: transparent;\n}\n\n.ghsync__select-dot--neutral {\n color: var(--ghsync-muted);\n}\n\n.ghsync__select-dot--blue {\n color: #60a5fa;\n}\n\n.ghsync__select-dot--yellow {\n color: #facc15;\n}\n\n.ghsync__select-dot--violet {\n color: #a78bfa;\n}\n\n.ghsync__select-dot--green {\n color: #34d399;\n}\n\n.ghsync__select-dot--red {\n color: #f87171;\n}\n\n.ghsync__hint,\n.ghsync__note,\n.ghsync__check span {\n margin: 0;\n color: var(--ghsync-muted);\n font-size: 12px;\n line-height: 1.5;\n}\n\n.ghsync__hint--error {\n color: var(--ghsync-danger-text);\n}\n\n.ghsync__actions,\n.ghsync__section-footer,\n.ghsync__connected,\n.ghsync__locked,\n.ghsync__sync-summary,\n.ghsync__mapping-head,\n.ghsync__check-top {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.ghsync__section-footer {\n justify-content: flex-end;\n}\n\n.ghsync__connected,\n.ghsync__locked,\n.ghsync__sync-summary,\n.ghsync__check {\n border: 1px solid var(--ghsync-border-soft);\n border-radius: 10px;\n background: var(--ghsync-surfaceAlt);\n padding: 14px;\n}\n\n.ghsync__connected strong,\n.ghsync__locked strong,\n.ghsync__sync-summary strong {\n display: block;\n font-size: 13px;\n color: var(--ghsync-title);\n}\n\n.ghsync__connected span:not(.ghsync__scope-pill),\n.ghsync__locked span:not(.ghsync__scope-pill),\n.ghsync__sync-summary span:not(.ghsync__scope-pill) {\n display: block;\n margin-top: 4px;\n color: var(--ghsync-muted);\n font-size: 12px;\n line-height: 1.5;\n}\n\n.ghsync__sync-summary > div {\n display: grid;\n gap: 8px;\n}\n\n.ghsync__sync-summary--success {\n border-color: var(--ghsync-success-border);\n background: var(--ghsync-success-bg);\n}\n\n.ghsync__sync-summary--success strong,\n.ghsync__sync-summary--success span {\n color: var(--ghsync-success-text);\n}\n\n.ghsync__sync-summary--danger {\n border-color: var(--ghsync-danger-border);\n background: var(--ghsync-danger-bg);\n}\n\n.ghsync__sync-summary--danger strong,\n.ghsync__sync-summary--danger span {\n color: var(--ghsync-danger-text);\n}\n\n.ghsync__sync-summary--info {\n border-color: var(--ghsync-info-border);\n background: var(--ghsync-info-bg);\n}\n\n.ghsync__sync-summary--info strong,\n.ghsync__sync-summary--info span {\n color: var(--ghsync-info-text);\n}\n\n.ghsync__button-row {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.ghsync__button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n white-space: nowrap;\n text-decoration: none;\n cursor: pointer;\n}\n\n.ghsync__button:disabled {\n cursor: not-allowed;\n}\n\n.ghsync__mapping-card,\n.ghsync__advanced-card,\n.ghsync__schedule-card,\n.ghsync__stat {\n border: 1px solid var(--ghsync-border-soft);\n border-radius: 10px;\n background: var(--ghsync-surfaceRaised);\n}\n\n.ghsync__mapping-card,\n.ghsync__advanced-card {\n display: grid;\n gap: 12px;\n padding: 14px;\n}\n\n.ghsync__schedule-card {\n display: grid;\n gap: 12px;\n align-items: start;\n padding: 14px;\n grid-template-columns: minmax(0, 1fr) minmax(180px, 0.8fr);\n}\n\n.ghsync__mapping-title strong {\n display: block;\n font-size: 13px;\n color: var(--ghsync-title);\n}\n\n.ghsync__mapping-title span {\n display: block;\n margin-top: 4px;\n color: var(--ghsync-muted);\n font-size: 12px;\n line-height: 1.5;\n}\n\n.ghsync__existing-projects {\n display: grid;\n gap: 10px;\n}\n\n.ghsync__existing-project-card {\n display: grid;\n gap: 10px;\n align-items: start;\n grid-template-columns: minmax(0, 1fr) auto;\n}\n\n.ghsync__existing-project-meta {\n display: grid;\n gap: 6px;\n}\n\n.ghsync__existing-project-meta strong {\n color: var(--ghsync-title);\n font-size: 13px;\n}\n\n.ghsync__existing-project-meta span {\n color: var(--ghsync-muted);\n font-size: 12px;\n line-height: 1.5;\n}\n\n.ghsync__existing-project-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.ghsync__mapping-grid {\n display: grid;\n align-items: start;\n gap: 12px;\n grid-template-columns: minmax(0, 1.15fr) minmax(220px, 0.85fr);\n}\n\n.ghsync__textarea {\n min-height: 96px;\n padding: 10px 12px;\n resize: vertical;\n}\n\n.ghsync__stats {\n display: grid;\n gap: 10px;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n\n.ghsync__schedule-meta {\n display: grid;\n gap: 4px;\n}\n\n.ghsync__schedule-meta strong {\n font-size: 13px;\n color: var(--ghsync-title);\n}\n\n.ghsync__schedule-meta span {\n color: var(--ghsync-muted);\n font-size: 12px;\n line-height: 1.5;\n}\n\n.ghsync__stat {\n display: grid;\n gap: 6px;\n padding: 12px;\n}\n\n.ghsync__stat--emphasized {\n border-color: var(--ghsync-danger-border);\n background: var(--ghsync-danger-bg);\n}\n\n.ghsync__stat span {\n display: block;\n color: var(--ghsync-title);\n font-size: 12px;\n font-weight: 600;\n}\n\n.ghsync__stat strong {\n display: block;\n color: var(--ghsync-title);\n font-size: 20px;\n line-height: 1;\n}\n\n.ghsync__stat p {\n margin: 0;\n color: var(--ghsync-muted);\n font-size: 11px;\n line-height: 1.5;\n}\n\n.ghsync__side-body {\n padding: 16px 18px;\n}\n\n.ghsync__check {\n display: grid;\n gap: 6px;\n}\n\n.ghsync__check strong {\n font-size: 12px;\n color: var(--ghsync-title);\n}\n\n.ghsync__detail-list {\n padding-top: 2px;\n}\n\n.ghsync__detail {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding-bottom: 10px;\n border-bottom: 1px solid var(--ghsync-border-soft);\n}\n\n.ghsync__detail:last-child {\n padding-bottom: 0;\n border-bottom: 0;\n}\n\n.ghsync__detail-label {\n color: var(--ghsync-muted);\n font-size: 12px;\n}\n\n.ghsync__detail-value {\n color: var(--ghsync-title);\n font-size: 12px;\n text-align: right;\n}\n\n@media (max-width: 980px) {\n .ghsync__scope-overview,\n .ghsync__layout,\n .ghsync__schedule-card,\n .ghsync__existing-project-card,\n .ghsync__advanced-card,\n .ghsync__mapping-grid,\n .ghsync__stats {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n\n@media (max-width: 640px) {\n .ghsync__header,\n .ghsync__section-head,\n .ghsync__actions,\n .ghsync__section-footer,\n .ghsync__connected,\n .ghsync__locked,\n .ghsync__sync-summary,\n .ghsync__mapping-head,\n .ghsync__check-top {\n align-items: stretch;\n flex-direction: column;\n }\n\n .ghsync__button-row {\n width: 100%;\n }\n\n .ghsync__button {\n flex: 1 1 auto;\n }\n\n .ghsync__detail {\n display: grid;\n gap: 4px;\n }\n\n .ghsync__detail-value {\n text-align: left;\n }\n}\n\n${SHARED_PROGRESS_STYLES}\n`;\n\nconst WIDGET_STYLES = `\n.ghsync-widget {\n color: var(--ghsync-text);\n font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n}\n\n.ghsync-widget * {\n box-sizing: border-box;\n}\n\n.ghsync-widget a,\n.ghsync-widget button {\n font-family: inherit;\n}\n\n.ghsync-widget__card {\n display: grid;\n gap: 14px;\n padding: 16px;\n border-radius: 12px;\n border: 1px solid var(--ghsync-border-soft);\n background: var(--ghsync-surface);\n box-shadow: none;\n}\n\n.ghsync-widget__top,\n.ghsync-widget__actions {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.ghsync-widget__eyebrow {\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: var(--ghsync-muted);\n}\n\n.ghsync-widget__top h3 {\n margin: 4px 0 0;\n font-size: 16px;\n line-height: 1.25;\n color: var(--ghsync-title);\n}\n\n.ghsync-widget__top p {\n margin: 4px 0 0;\n max-width: 440px;\n color: var(--ghsync-muted);\n font-size: 12px;\n line-height: 1.55;\n}\n\n.ghsync-widget__meta {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n color: var(--ghsync-muted);\n font-size: 11px;\n}\n\n.ghsync-widget__meta-dot {\n width: 3px;\n height: 3px;\n border-radius: 999px;\n background: var(--ghsync-muted);\n opacity: 0.75;\n}\n\n.ghsync-widget__stats {\n display: grid;\n gap: 12px;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n border-top: 1px solid var(--ghsync-border-soft);\n padding-top: 14px;\n}\n\n.ghsync-widget__stat,\n.ghsync-widget__summary,\n.ghsync-widget__message {\n border-radius: 0;\n}\n\n.ghsync-widget__stat {\n display: grid;\n gap: 6px;\n padding: 12px;\n border: 1px solid var(--ghsync-border-soft);\n border-radius: 10px;\n background: var(--ghsync-surfaceAlt);\n}\n\n.ghsync-widget__stat--emphasized {\n border-color: var(--ghsync-danger-border);\n background: var(--ghsync-dangerBg);\n}\n\n.ghsync-widget__stat span {\n display: block;\n font-size: 12px;\n font-weight: 600;\n color: var(--ghsync-title);\n}\n\n.ghsync-widget__stat strong {\n display: block;\n font-size: 24px;\n line-height: 1;\n color: var(--ghsync-title);\n}\n\n.ghsync-widget__stat p {\n margin: 0;\n color: var(--ghsync-muted);\n font-size: 11px;\n line-height: 1.5;\n}\n\n.ghsync-widget__summary {\n display: grid;\n gap: 4px;\n padding-top: 2px;\n}\n\n.ghsync-widget__summary strong {\n font-size: 13px;\n color: var(--ghsync-title);\n}\n\n.ghsync-widget__summary span {\n color: var(--ghsync-muted);\n font-size: 12px;\n line-height: 1.5;\n}\n\n.ghsync-widget__message {\n padding: 10px 12px;\n border-radius: 10px;\n border: 1px solid var(--ghsync-danger-border);\n background: var(--ghsync-danger-bg);\n color: var(--ghsync-danger-text);\n font-size: 12px;\n line-height: 1.5;\n}\n\n.ghsync-diagnostics {\n display: grid;\n gap: 10px;\n padding: 14px;\n border-radius: 10px;\n border: 1px solid var(--ghsync-dangerBorder);\n background: var(--ghsync-dangerBg);\n}\n\n.ghsync-diagnostics__header {\n display: grid;\n gap: 4px;\n}\n\n.ghsync-diagnostics__header strong {\n font-size: 13px;\n color: var(--ghsync-dangerText);\n}\n\n.ghsync-diagnostics__header span {\n color: var(--ghsync-muted);\n font-size: 12px;\n line-height: 1.5;\n}\n\n.ghsync-diagnostics__grid {\n display: grid;\n gap: 10px;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n}\n\n.ghsync-diagnostics__item,\n.ghsync-diagnostics__block {\n display: grid;\n gap: 6px;\n padding: 12px;\n border-radius: 10px;\n border: 1px solid var(--ghsync-dangerBorder);\n background: var(--ghsync-surfaceAlt);\n}\n\n.ghsync-diagnostics__label {\n color: var(--ghsync-dangerText);\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n}\n\n.ghsync-diagnostics__value {\n color: var(--ghsync-title);\n font-size: 13px;\n line-height: 1.5;\n word-break: break-word;\n}\n\n.ghsync-diagnostics__value--code {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", monospace;\n font-size: 12px;\n white-space: pre-wrap;\n}\n\n.ghsync-widget__actions {\n align-items: center;\n justify-content: space-between;\n padding-top: 2px;\n}\n\n.ghsync-widget__button-row {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.ghsync-widget__link {\n text-decoration: none;\n}\n\n.ghsync__badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n min-height: 24px;\n padding: 0 10px;\n border-radius: 999px;\n border: 1px solid var(--ghsync-badge-border);\n background: var(--ghsync-badge-bg);\n color: var(--ghsync-badge-text);\n font-size: 12px;\n font-weight: 600;\n line-height: 1;\n white-space: nowrap;\n}\n\n.ghsync__badge--success {\n border-color: var(--ghsync-success-border);\n background: var(--ghsync-success-bg);\n color: var(--ghsync-success-text);\n}\n\n.ghsync__badge--warning {\n border-color: var(--ghsync-warning-border);\n background: var(--ghsync-warning-bg);\n color: var(--ghsync-warning-text);\n}\n\n.ghsync__badge--info {\n border-color: var(--ghsync-info-border);\n background: var(--ghsync-info-bg);\n color: var(--ghsync-info-text);\n}\n\n.ghsync__badge--danger {\n border-color: var(--ghsync-danger-border);\n background: var(--ghsync-danger-bg);\n color: var(--ghsync-danger-text);\n}\n\n.ghsync__badge--neutral {\n border-color: var(--ghsync-border);\n background: transparent;\n color: var(--ghsync-muted);\n}\n\n.ghsync__badge-dot {\n width: 7px;\n height: 7px;\n border-radius: 999px;\n background: currentColor;\n}\n\n.ghsync__button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n white-space: nowrap;\n text-decoration: none;\n cursor: pointer;\n}\n\n.ghsync__button:disabled {\n cursor: not-allowed;\n}\n\n@media (max-width: 720px) {\n .ghsync-widget__stats {\n grid-template-columns: minmax(0, 1fr);\n gap: 12px;\n }\n\n .ghsync-widget__top,\n .ghsync-widget__actions {\n flex-direction: column;\n align-items: stretch;\n }\n\n .ghsync-widget__stat {\n padding-left: 0;\n border-left: 0;\n }\n\n .ghsync-widget__button-row {\n width: 100%;\n }\n\n .ghsync__button,\n .ghsync-widget__link {\n flex: 1 1 auto;\n }\n}\n\n${SHARED_PROGRESS_STYLES}\n`;\n\nconst EXTENSION_SURFACE_STYLES = `\n button[role=\"tab\"][id$=\"trigger-plugin:paperclip-github-plugin:paperclip-github-plugin-issue-detail-tab\"],\n button[role=\"tab\"][aria-controls$=\"content-plugin:paperclip-github-plugin:paperclip-github-plugin-issue-detail-tab\"] {\n gap: 6px;\n }\n\n button[role=\"tab\"][id$=\"trigger-plugin:paperclip-github-plugin:paperclip-github-plugin-issue-detail-tab\"]::before,\n button[role=\"tab\"][aria-controls$=\"content-plugin:paperclip-github-plugin:paperclip-github-plugin-issue-detail-tab\"]::before {\n content: '';\n display: inline-block;\n width: 14px;\n height: 14px;\n flex: none;\n background-color: currentColor;\n -webkit-mask-image: ${GITHUB_MARK_MASK_DATA_URI};\n -webkit-mask-position: center;\n -webkit-mask-repeat: no-repeat;\n -webkit-mask-size: contain;\n mask-image: ${GITHUB_MARK_MASK_DATA_URI};\n mask-position: center;\n mask-repeat: no-repeat;\n mask-size: contain;\n }\n\n .ghsync-extension-card {\n display: grid;\n gap: 14px;\n padding: 16px;\n border: 1px solid var(--ghsync-border);\n border-radius: 18px;\n background: linear-gradient(180deg, var(--ghsync-surfaceRaised) 0%, var(--ghsync-surface) 100%);\n color: var(--ghsync-text);\n box-shadow: var(--ghsync-shadow);\n font-family: ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n }\n\n .ghsync-extension-card--compact {\n gap: 10px;\n padding: 0;\n border: 0;\n border-radius: 0;\n background: transparent;\n box-shadow: none;\n }\n\n .ghsync-extension-heading {\n display: flex;\n justify-content: space-between;\n gap: 12px;\n align-items: start;\n }\n\n .ghsync-extension-heading h3,\n .ghsync-extension-heading h4 {\n margin: 0;\n color: var(--ghsync-title);\n font-size: 16px;\n line-height: 1.25;\n }\n\n .ghsync-extension-heading p,\n .ghsync-extension-empty,\n .ghsync-extension-copy {\n margin: 0;\n color: var(--ghsync-muted);\n font-size: 13px;\n line-height: 1.55;\n }\n\n .ghsync-extension-grid {\n display: grid;\n gap: 12px;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n }\n\n .ghsync-extension-metric {\n display: grid;\n gap: 4px;\n padding: 12px;\n border-radius: 14px;\n border: 1px solid var(--ghsync-border-soft);\n background: var(--ghsync-surfaceAlt);\n }\n\n .ghsync-extension-metric span {\n color: var(--ghsync-muted);\n font-size: 11px;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n }\n\n .ghsync-extension-metric strong {\n color: var(--ghsync-title);\n font-size: 14px;\n }\n\n .ghsync-extension-links,\n .ghsync-extension-labels,\n .ghsync-comment-annotation,\n .ghsync-toolbar-button {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n align-items: center;\n }\n\n .inline-flex:has(> .ghsync-toolbar-button--entity) {\n margin-left: auto;\n margin-inline-start: auto;\n }\n\n .ghsync-toolbar-button--entity {\n width: 100%;\n justify-content: flex-end;\n }\n\n .ghsync-extension-link {\n text-decoration: none;\n white-space: nowrap;\n }\n\n .ghsync-extension-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 7px 10px;\n border-radius: 999px;\n border: 1px solid var(--ghsync-border);\n background: var(--ghsync-surfaceAlt);\n color: var(--ghsync-title);\n font-size: 12px;\n font-weight: 600;\n text-decoration: none;\n }\n\n .ghsync-extension-pill {\n font-weight: 500;\n }\n\n .ghsync-comment-annotation__label {\n color: var(--ghsync-muted);\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n }\n\n .ghsync-extension-note {\n padding: 12px;\n border-radius: 14px;\n border: 1px solid var(--ghsync-info-border);\n background: var(--ghsync-info-bg);\n color: var(--ghsync-info-text);\n font-size: 12px;\n line-height: 1.5;\n }\n\n .ghsync-issue-detail {\n display: grid;\n gap: 16px;\n color: var(--ghsync-text);\n font-family: ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n }\n\n .ghsync-issue-detail__intro,\n .ghsync-issue-detail__section {\n display: grid;\n gap: 8px;\n }\n\n .ghsync-issue-detail__intro {\n padding-bottom: 12px;\n border-bottom: 1px solid var(--ghsync-border-soft);\n }\n\n .ghsync-issue-detail__section-heading {\n color: var(--ghsync-muted);\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n }\n\n .ghsync-issue-detail__title {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .ghsync-issue-detail__title h3 {\n margin: 0;\n }\n`;\n\nfunction createEmptyMapping(index: number): RepositoryMapping {\n return {\n id: `mapping-${index + 1}`,\n repositoryUrl: '',\n paperclipProjectName: ''\n };\n}\n\nfunction normalizePaperclipIssueStatus(value: unknown): PaperclipIssueStatus {\n return PAPERCLIP_STATUS_OPTIONS.some((option) => option.value === value)\n ? value as PaperclipIssueStatus\n : DEFAULT_ADVANCED_SETTINGS.defaultStatus;\n}\n\nfunction normalizeGitHubUsername(value: string): string | null {\n const trimmed = value.trim().replace(/^@+/, '').toLowerCase();\n return trimmed ? trimmed : null;\n}\n\nfunction normalizeIgnoredIssueAuthorUsernames(value: unknown): string[] {\n const rawEntries = Array.isArray(value)\n ? value\n : typeof value === 'string'\n ? value.split(/[\\s,]+/g)\n : [];\n\n return [...new Set(\n rawEntries\n .map((entry) => typeof entry === 'string' ? normalizeGitHubUsername(entry) : null)\n .filter((entry): entry is string => Boolean(entry))\n )];\n}\n\nfunction normalizeAdvancedSettings(value: unknown): GitHubSyncAdvancedSettings {\n if (!value || typeof value !== 'object') {\n return DEFAULT_ADVANCED_SETTINGS;\n }\n\n const record = value as Record<string, unknown>;\n const defaultAssigneeAgentId =\n typeof record.defaultAssigneeAgentId === 'string' && record.defaultAssigneeAgentId.trim()\n ? record.defaultAssigneeAgentId.trim()\n : undefined;\n\n return {\n ...(defaultAssigneeAgentId ? { defaultAssigneeAgentId } : {}),\n defaultStatus: normalizePaperclipIssueStatus(record.defaultStatus),\n ignoredIssueAuthorUsernames:\n 'ignoredIssueAuthorUsernames' in record\n ? normalizeIgnoredIssueAuthorUsernames(record.ignoredIssueAuthorUsernames)\n : DEFAULT_ADVANCED_SETTINGS.ignoredIssueAuthorUsernames\n };\n}\n\nfunction getComparableMappings(mappings: RepositoryMapping[]): RepositoryMapping[] {\n return mappings\n .map((mapping, index) => ({\n id: mapping.id.trim() || `mapping-${index + 1}`,\n repositoryUrl: mapping.repositoryUrl.trim(),\n paperclipProjectName: mapping.paperclipProjectName.trim(),\n paperclipProjectId: mapping.paperclipProjectId,\n companyId: mapping.companyId\n }))\n .filter((mapping) => mapping.repositoryUrl !== '' || mapping.paperclipProjectName !== '');\n}\n\nfunction getComparableAdvancedSettings(value: GitHubSyncAdvancedSettings | null | undefined): GitHubSyncAdvancedSettings {\n const settings = normalizeAdvancedSettings(value);\n\n return {\n ...(settings.defaultAssigneeAgentId ? { defaultAssigneeAgentId: settings.defaultAssigneeAgentId } : {}),\n defaultStatus: settings.defaultStatus,\n ignoredIssueAuthorUsernames: [...settings.ignoredIssueAuthorUsernames].sort((left, right) => left.localeCompare(right))\n };\n}\n\nfunction formatAssigneeOptionLabel(option: GitHubSyncAssigneeOption): string {\n return option.title?.trim()\n ? `${option.name} (${option.title.trim()})`\n : option.name;\n}\n\nfunction getAvailableAssigneeOptions(\n options: GitHubSyncAssigneeOption[] | null | undefined,\n selectedAgentId?: string\n): GitHubSyncAssigneeOption[] {\n const normalizedOptions = [...(options ?? [])];\n\n if (selectedAgentId && !normalizedOptions.some((option) => option.id === selectedAgentId)) {\n normalizedOptions.push({\n id: selectedAgentId,\n name: 'Unavailable agent'\n });\n }\n\n return normalizedOptions;\n}\n\nfunction formatAdvancedSettingsSummary(\n advancedSettings: GitHubSyncAdvancedSettings,\n availableAssignees: GitHubSyncAssigneeOption[]\n): string {\n const assigneeLabel = advancedSettings.defaultAssigneeAgentId\n ? formatAssigneeOptionLabel(\n availableAssignees.find((option) => option.id === advancedSettings.defaultAssigneeAgentId)\n ?? {\n id: advancedSettings.defaultAssigneeAgentId,\n name: 'Unavailable agent'\n }\n )\n : 'Unassigned';\n const statusLabel =\n PAPERCLIP_STATUS_OPTIONS.find((option) => option.value === advancedSettings.defaultStatus)?.label\n ?? 'Backlog';\n const ignoredAuthorsLabel =\n advancedSettings.ignoredIssueAuthorUsernames.length > 0\n ? advancedSettings.ignoredIssueAuthorUsernames.join(', ')\n : 'none';\n\n return `Assignee: ${assigneeLabel} \u00B7 Status: ${statusLabel} \u00B7 Ignore: ${ignoredAuthorsLabel}`;\n}\n\ninterface SettingsSelectOption {\n value: string;\n label: string;\n tone?: SelectTone;\n icon?: 'agent';\n}\n\nfunction PickerChevronIcon(): React.JSX.Element {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M4 6.5L8 10.5L12 6.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nfunction PickerCheckIcon(): React.JSX.Element {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3.75 8.25L6.5 11L12.25 5.25\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nfunction AgentIcon(): React.JSX.Element {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M8 1.75L8.96 4.31L11.5 5.25L8.96 6.19L8 8.75L7.04 6.19L4.5 5.25L7.04 4.31L8 1.75Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.15\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12.25 8.75L12.77 10.23L14.25 10.75L12.77 11.27L12.25 12.75L11.73 11.27L10.25 10.75L11.73 10.23L12.25 8.75Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.15\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M4.25 9.75L4.64 10.86L5.75 11.25L4.64 11.64L4.25 12.75L3.86 11.64L2.75 11.25L3.86 10.86L4.25 9.75Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.15\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction SettingsAssigneePicker(props: {\n id: string;\n value: string;\n options: SettingsSelectOption[];\n disabled?: boolean;\n onChange: (value: string) => void;\n}): React.JSX.Element {\n const { id, value, options, disabled, onChange } = props;\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const rootRef = useRef<HTMLDivElement | null>(null);\n const searchInputRef = useRef<HTMLInputElement | null>(null);\n const selectedOption = options.find((option) => option.value === value) ?? options[0];\n const normalizedQuery = query.trim().toLowerCase();\n const filteredOptions = normalizedQuery\n ? options.filter((option) => option.label.toLowerCase().includes(normalizedQuery))\n : options;\n\n useEffect(() => {\n if (!open) {\n setQuery('');\n return;\n }\n\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target;\n if (target instanceof Node && rootRef.current?.contains(target)) {\n return;\n }\n\n setOpen(false);\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setOpen(false);\n }\n };\n\n document.addEventListener('pointerdown', handlePointerDown);\n document.addEventListener('keydown', handleKeyDown);\n\n globalThis.setTimeout(() => {\n searchInputRef.current?.focus();\n searchInputRef.current?.select();\n }, 0);\n\n return () => {\n document.removeEventListener('pointerdown', handlePointerDown);\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [open]);\n\n useEffect(() => {\n if (disabled && open) {\n setOpen(false);\n }\n }, [disabled, open]);\n\n return (\n <div className=\"ghsync__picker\" ref={rootRef}>\n <button\n id={id}\n type=\"button\"\n className=\"ghsync__picker-trigger ghsync__picker-trigger--assignee\"\n disabled={disabled}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n onClick={() => {\n if (disabled) {\n return;\n }\n\n setOpen((current) => !current);\n }}\n >\n <span className=\"ghsync__picker-trigger-main\">\n {selectedOption?.icon === 'agent' ? (\n <span className=\"ghsync__picker-agent-icon\" aria-hidden=\"true\">\n <AgentIcon />\n </span>\n ) : null}\n <span className=\"ghsync__picker-trigger-label\">{selectedOption?.label ?? 'No assignee'}</span>\n </span>\n <span className=\"ghsync__picker-trigger-icon\">\n <PickerChevronIcon />\n </span>\n </button>\n\n {open ? (\n <div className=\"ghsync__picker-panel ghsync__picker-panel--assignee\" role=\"dialog\" aria-label=\"Choose default assignee\">\n <div className=\"ghsync__picker-search\">\n <input\n ref={searchInputRef}\n type=\"text\"\n className=\"ghsync__picker-search-input\"\n placeholder=\"Search assignees...\"\n value={query}\n onChange={(event) => {\n setQuery(event.currentTarget.value);\n }}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n setOpen(false);\n }\n }}\n />\n </div>\n\n <div className=\"ghsync__picker-list\" role=\"listbox\" aria-labelledby={id}>\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option) => {\n const selected = option.value === value;\n\n return (\n <button\n key={option.value || '__unassigned'}\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n className={`ghsync__picker-option${selected ? ' ghsync__picker-option--selected' : ''}`}\n onClick={() => {\n onChange(option.value);\n setOpen(false);\n }}\n >\n <span className=\"ghsync__picker-trigger-main\">\n {option.icon === 'agent' ? (\n <span className=\"ghsync__picker-agent-icon\" aria-hidden=\"true\">\n <AgentIcon />\n </span>\n ) : null}\n <span className=\"ghsync__picker-option-label\">{option.label}</span>\n </span>\n <span className=\"ghsync__picker-option-check\" aria-hidden=\"true\">\n {selected ? <PickerCheckIcon /> : null}\n </span>\n </button>\n );\n })\n ) : (\n <div className=\"ghsync__picker-empty\">No assignees match.</div>\n )}\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction SettingsStatusPicker(props: {\n id: string;\n value: string;\n options: SettingsSelectOption[];\n disabled?: boolean;\n onChange: (value: string) => void;\n}): React.JSX.Element {\n const { id, value, options, disabled, onChange } = props;\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement | null>(null);\n const selectedOption = options.find((option) => option.value === value) ?? options[0];\n\n useEffect(() => {\n if (!open) {\n return;\n }\n\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target;\n if (target instanceof Node && rootRef.current?.contains(target)) {\n return;\n }\n\n setOpen(false);\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setOpen(false);\n }\n };\n\n document.addEventListener('pointerdown', handlePointerDown);\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('pointerdown', handlePointerDown);\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [open]);\n\n useEffect(() => {\n if (disabled && open) {\n setOpen(false);\n }\n }, [disabled, open]);\n\n return (\n <div className=\"ghsync__picker\" ref={rootRef}>\n <button\n id={id}\n type=\"button\"\n className=\"ghsync__picker-trigger ghsync__picker-trigger--status\"\n disabled={disabled}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n onClick={() => {\n if (disabled) {\n return;\n }\n\n setOpen((current) => !current);\n }}\n >\n <span className=\"ghsync__picker-trigger-main\">\n <span\n className={`ghsync__select-dot ghsync__select-dot--${selectedOption?.tone ?? 'neutral'}`}\n aria-hidden=\"true\"\n />\n <span className=\"ghsync__picker-trigger-label\">{selectedOption?.label ?? 'Backlog'}</span>\n </span>\n </button>\n\n {open ? (\n <div className=\"ghsync__picker-panel ghsync__picker-panel--status\" role=\"dialog\" aria-label=\"Choose default status\">\n <div className=\"ghsync__picker-list\" role=\"listbox\" aria-labelledby={id}>\n {options.map((option) => {\n const selected = option.value === value;\n\n return (\n <button\n key={option.value}\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n className={`ghsync__picker-option${selected ? ' ghsync__picker-option--selected' : ''}`}\n onClick={() => {\n onChange(option.value);\n setOpen(false);\n }}\n >\n <span className=\"ghsync__picker-trigger-main\">\n <span\n className={`ghsync__select-dot ghsync__select-dot--${option.tone ?? 'neutral'}`}\n aria-hidden=\"true\"\n />\n <span className=\"ghsync__picker-option-label\">{option.label}</span>\n </span>\n <span className=\"ghsync__picker-option-check\" aria-hidden=\"true\">\n {selected ? <PickerCheckIcon /> : null}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction normalizeScheduleFrequencyMinutes(value: unknown): number {\n const numericValue =\n typeof value === 'number'\n ? value\n : typeof value === 'string'\n ? Number(value.trim())\n : NaN;\n\n if (!Number.isFinite(numericValue) || numericValue < 1) {\n return DEFAULT_SCHEDULE_FREQUENCY_MINUTES;\n }\n\n return Math.floor(numericValue);\n}\n\nfunction parseScheduleFrequencyDraft(value: string): number | null {\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n\n const numericValue = Number(trimmed);\n if (!Number.isFinite(numericValue) || numericValue < 1 || !Number.isInteger(numericValue)) {\n return null;\n }\n\n return numericValue;\n}\n\nfunction getScheduleFrequencyError(value: string): string | null {\n const trimmed = value.trim();\n if (!trimmed) {\n return 'Enter a whole number of minutes.';\n }\n\n const numericValue = Number(trimmed);\n if (!Number.isFinite(numericValue) || numericValue < 1 || !Number.isInteger(numericValue)) {\n return 'Enter a whole number of minutes greater than 0.';\n }\n\n return null;\n}\n\nfunction formatScheduleFrequency(minutes: number): string {\n const normalizedMinutes = normalizeScheduleFrequencyMinutes(minutes);\n return `every ${normalizedMinutes} minute${normalizedMinutes === 1 ? '' : 's'}`;\n}\n\nfunction formatProjectNameFromRepository(repositoryInput: string): string {\n const parsedRepository = parseRepositoryReference(repositoryInput);\n const repositoryName = parsedRepository?.repo\n ?? repositoryInput.trim().replace(/\\/+$/, '').split('/').pop()?.replace(/\\.git$/i, '')\n ?? '';\n\n if (!repositoryName) {\n return '';\n }\n\n return repositoryName\n .split(/[-_.]+/)\n .map((segment) => segment.trim())\n .filter((segment) => segment.length > 0)\n .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1))\n .join(' ');\n}\n\nfunction shouldAutofillProjectName(mapping: RepositoryMapping): boolean {\n if (mapping.paperclipProjectId) {\n return false;\n }\n\n const currentProjectName = mapping.paperclipProjectName.trim();\n if (!currentProjectName) {\n return true;\n }\n\n const previousSuggestedProjectName = formatProjectNameFromRepository(mapping.repositoryUrl);\n return previousSuggestedProjectName !== '' && currentProjectName === previousSuggestedProjectName;\n}\n\nfunction getPaperclipApiBaseUrl(): string | undefined {\n if (typeof window === 'undefined' || !window.location?.origin) {\n return undefined;\n }\n\n return window.location.origin;\n}\n\nconst syncedPaperclipApiBaseUrlsByPluginId = new Map<string, string>();\n\nasync function syncTrustedPaperclipApiBaseUrl(pluginId: string | null): Promise<string | undefined> {\n const paperclipApiBaseUrl = getPaperclipApiBaseUrl();\n if (!paperclipApiBaseUrl) {\n return undefined;\n }\n\n if (!pluginId) {\n throw new Error(\n 'Unable to sync the trusted Paperclip API origin because the plugin ID is missing. Reload the plugin and try again before saving or syncing.'\n );\n }\n\n const lastSyncedPaperclipApiBaseUrl = syncedPaperclipApiBaseUrlsByPluginId.get(pluginId);\n if (lastSyncedPaperclipApiBaseUrl === paperclipApiBaseUrl) {\n return paperclipApiBaseUrl;\n }\n\n await patchPluginConfig(pluginId, {\n paperclipApiBaseUrl\n });\n syncedPaperclipApiBaseUrlsByPluginId.set(pluginId, paperclipApiBaseUrl);\n\n return paperclipApiBaseUrl;\n}\n\nfunction formatDate(value?: string, fallback = 'Never'): string {\n if (!value) {\n return fallback;\n }\n\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return fallback;\n }\n\n return parsed.toLocaleString();\n}\n\nfunction getPluginIdFromLocation(): string | null {\n if (typeof window === 'undefined') {\n return null;\n }\n\n const parts = window.location.pathname.split('/').filter(Boolean);\n const pluginsIndex = parts.indexOf('plugins');\n if (pluginsIndex === -1 || pluginsIndex + 1 >= parts.length) {\n return null;\n }\n\n return parts[pluginsIndex + 1] ?? null;\n}\n\nfunction getThemeMode(): ThemeMode {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return 'dark';\n }\n\n const root = document.documentElement;\n const body = document.body;\n const candidates = [root, body].filter((node): node is HTMLElement => Boolean(node));\n\n for (const node of candidates) {\n const attrTheme = node.getAttribute('data-theme') || node.getAttribute('data-color-mode') || node.getAttribute('data-mode');\n if (attrTheme === 'light' || attrTheme === 'dark') {\n return attrTheme;\n }\n\n if (node.classList.contains('light')) {\n return 'light';\n }\n\n if (node.classList.contains('dark')) {\n return 'dark';\n }\n }\n\n const colorScheme = window.getComputedStyle(body).colorScheme || window.getComputedStyle(root).colorScheme;\n if (colorScheme === 'light' || colorScheme === 'dark') {\n return colorScheme;\n }\n\n return window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark';\n}\n\nfunction useResolvedThemeMode(): ThemeMode {\n const [themeMode, setThemeMode] = useState<ThemeMode>(() => getThemeMode());\n\n useEffect(() => {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return;\n }\n\n const matcher = window.matchMedia('(prefers-color-scheme: light)');\n const handleChange = () => {\n setThemeMode(getThemeMode());\n };\n\n handleChange();\n matcher.addEventListener('change', handleChange);\n\n const observer = new MutationObserver(handleChange);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class', 'data-theme', 'data-color-mode', 'data-mode']\n });\n observer.observe(document.body, {\n attributes: true,\n attributeFilter: ['class', 'data-theme', 'data-color-mode', 'data-mode']\n });\n\n return () => {\n matcher.removeEventListener('change', handleChange);\n observer.disconnect();\n };\n }, []);\n\n return themeMode;\n}\n\nasync function resolveOrCreateProject(companyId: string, projectName: string): Promise<{ id: string; name: string }> {\n const projects = await listCompanyProjects(companyId);\n const existing = projects.find((project) => project.name.trim().toLowerCase() === projectName.trim().toLowerCase());\n if (existing) {\n return existing;\n }\n\n return fetchJson<{ id: string; name: string }>(`/api/companies/${companyId}/projects`, {\n method: 'POST',\n body: JSON.stringify({\n name: projectName.trim(),\n status: 'planned'\n })\n });\n}\n\nasync function listCompanyProjects(companyId: string): Promise<Array<{ id: string; name: string }>> {\n const response = await fetchJson<unknown>(`/api/companies/${companyId}/projects`);\n if (!Array.isArray(response)) {\n throw new Error(`Unexpected projects response for company ${companyId}: expected an array.`);\n }\n\n return response\n .map((entry) => {\n if (!entry || typeof entry !== 'object') {\n return null;\n }\n\n const record = entry as Record<string, unknown>;\n const id = typeof record.id === 'string' ? record.id.trim() : '';\n const name = typeof record.name === 'string' ? record.name.trim() : '';\n return id && name ? { id, name } : null;\n })\n .filter((entry): entry is { id: string; name: string } => entry !== null);\n}\n\nasync function listProjectWorkspaces(projectId: string): Promise<ProjectWorkspaceSummary[]> {\n const response = await fetchJson<unknown>(`/api/projects/${projectId}/workspaces`);\n if (!Array.isArray(response)) {\n throw new Error(`Unexpected project workspaces response for project ${projectId}: expected an array.`);\n }\n\n const workspaces: ProjectWorkspaceSummary[] = [];\n for (const entry of response) {\n if (!entry || typeof entry !== 'object') {\n continue;\n }\n\n const record = entry as Record<string, unknown>;\n workspaces.push({\n repoUrl: typeof record.repoUrl === 'string' ? record.repoUrl : null,\n sourceType: typeof record.sourceType === 'string' ? record.sourceType : null,\n isPrimary: record.isPrimary === true\n });\n }\n\n return workspaces;\n}\n\nasync function loadExistingProjectSyncCandidates(companyId: string): Promise<ExistingProjectSyncCandidate[]> {\n const projects = await listCompanyProjects(companyId);\n const workspacesByProjectId = Object.fromEntries(\n await Promise.all(\n projects.map(async (project): Promise<[string, ProjectWorkspaceSummary[]]> => [\n project.id,\n await listProjectWorkspaces(project.id)\n ])\n )\n ) as Record<string, ProjectWorkspaceSummary[]>;\n\n return discoverExistingProjectSyncCandidates({\n projects,\n workspacesByProjectId\n });\n}\n\nasync function ensureProjectRepoBinding(projectId: string, repositoryUrl: string): Promise<void> {\n const parsedRepository = parseRepositoryReference(repositoryUrl);\n const normalizedRepositoryUrl = parsedRepository?.url ?? repositoryUrl.trim();\n\n try {\n const workspaces = await listProjectWorkspaces(projectId);\n const alreadyBound = workspaces.some((workspace) => {\n if (typeof workspace.repoUrl !== 'string' || !workspace.repoUrl.trim()) {\n return false;\n }\n\n const normalizedWorkspaceRepositoryUrl = parseRepositoryReference(workspace.repoUrl)?.url ?? workspace.repoUrl.trim();\n return normalizedWorkspaceRepositoryUrl === normalizedRepositoryUrl;\n });\n\n if (alreadyBound) {\n return;\n }\n } catch {\n // Fall back to attempting the create call when workspace listing is unavailable.\n }\n\n await fetchJson(`/api/projects/${projectId}/workspaces`, {\n method: 'POST',\n body: JSON.stringify({\n repoUrl: normalizedRepositoryUrl,\n sourceType: 'git_repo',\n isPrimary: true\n })\n });\n}\n\nasync function resolveOrCreateCompanySecret(companyId: string, name: string, value: string): Promise<{ id: string; name: string }> {\n const existingSecrets = await fetchJson<Array<{ id: string; name: string }>>(`/api/companies/${companyId}/secrets`);\n const existing = existingSecrets.find((secret) => secret.name.trim().toLowerCase() === name.trim().toLowerCase());\n\n if (existing) {\n return fetchJson<{ id: string; name: string }>(`/api/secrets/${existing.id}/rotate`, {\n method: 'POST',\n body: JSON.stringify({\n value\n })\n });\n }\n\n return fetchJson<{ id: string; name: string }>(`/api/companies/${companyId}/secrets`, {\n method: 'POST',\n body: JSON.stringify({\n name,\n value\n })\n });\n}\n\nasync function patchPluginConfig(pluginId: string, patch: Record<string, unknown>): Promise<void> {\n const currentConfigResponse = await fetchJson<PluginConfigResponse | null>(`/api/plugins/${pluginId}/config`);\n const currentConfig = normalizePluginConfig(currentConfigResponse?.configJson);\n const nextConfig = mergePluginConfig(currentConfig, patch);\n\n if (JSON.stringify(nextConfig) === JSON.stringify(currentConfig)) {\n return;\n }\n\n await fetchJson(`/api/plugins/${pluginId}/config`, {\n method: 'POST',\n body: JSON.stringify({\n configJson: nextConfig\n })\n });\n}\n\nfunction normalizeCliAuthPollIntervalMs(value: unknown): number {\n if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0) {\n return CLI_AUTH_POLL_INTERVAL_FALLBACK_MS;\n }\n\n return Math.min(CLI_AUTH_POLL_INTERVAL_MAX_MS, Math.max(CLI_AUTH_POLL_INTERVAL_MIN_MS, Math.floor(value)));\n}\n\nfunction resolveCliAuthUrl(url?: string, path?: string): string | null {\n if (typeof url === 'string' && url.trim()) {\n return buildPaperclipUrl(url.trim());\n }\n\n if (typeof path !== 'string' || !path.trim()) {\n return null;\n }\n\n return buildPaperclipUrl(path.trim());\n}\n\nfunction getCliAuthIdentityLabel(identity: CliAuthIdentityResponse): string | null {\n const candidates = [\n identity.user?.displayName,\n identity.user?.name,\n identity.user?.login,\n identity.user?.email,\n identity.displayName,\n identity.name,\n identity.login,\n identity.email\n ];\n\n for (const candidate of candidates) {\n if (typeof candidate === 'string' && candidate.trim()) {\n return candidate.trim();\n }\n }\n\n return null;\n}\n\nfunction waitForDuration(durationMs: number): Promise<void> {\n return new Promise((resolve) => {\n globalThis.setTimeout(resolve, durationMs);\n });\n}\n\nasync function requestBoardAccessChallenge(companyId: string): Promise<CliAuthChallengeResponse> {\n return fetchJson<CliAuthChallengeResponse>('/api/cli-auth/challenges', {\n method: 'POST',\n body: JSON.stringify({\n command: 'paperclip plugin github-sync settings',\n clientName: 'GitHub Sync plugin',\n requestedAccess: 'board',\n requestedCompanyId: companyId\n })\n });\n}\n\nasync function waitForBoardAccessApproval(challenge: CliAuthChallengeResponse): Promise<string> {\n const challengeToken = typeof challenge.token === 'string' ? challenge.token.trim() : '';\n const pollUrl = resolveCliAuthPollUrl(challenge.pollUrl ?? challenge.pollPath);\n if (!challengeToken || !pollUrl) {\n throw new Error('Paperclip did not return a usable board access challenge.');\n }\n\n const expiresAtTimeMs = typeof challenge.expiresAt === 'string' ? Date.parse(challenge.expiresAt) : NaN;\n const pollIntervalMs = normalizeCliAuthPollIntervalMs(challenge.suggestedPollIntervalMs);\n\n while (true) {\n const pollUrlWithToken = new URL(pollUrl);\n pollUrlWithToken.searchParams.set('token', challengeToken);\n const pollResult = await fetchJson<CliAuthChallengePollResponse>(pollUrlWithToken.toString());\n const status = typeof pollResult.status === 'string' ? pollResult.status.trim().toLowerCase() : 'pending';\n\n if (status === 'approved') {\n const boardApiToken = typeof pollResult.boardApiToken === 'string' && pollResult.boardApiToken.trim()\n ? pollResult.boardApiToken.trim()\n : typeof challenge.boardApiToken === 'string' && challenge.boardApiToken.trim()\n ? challenge.boardApiToken.trim()\n : '';\n if (!boardApiToken) {\n throw new Error('Paperclip approved board access but did not return a usable API token.');\n }\n\n return boardApiToken;\n }\n\n if (status === 'cancelled') {\n throw new Error('Board access approval was cancelled.');\n }\n\n if (status === 'expired') {\n throw new Error('Board access approval expired. Start the connection flow again.');\n }\n\n if (Number.isFinite(expiresAtTimeMs) && Date.now() >= expiresAtTimeMs) {\n throw new Error('Board access approval expired. Start the connection flow again.');\n }\n\n await waitForDuration(pollIntervalMs);\n }\n}\n\nasync function fetchBoardAccessIdentity(boardApiToken: string): Promise<string | null> {\n const identity = await fetchJson<CliAuthIdentityResponse>('/api/cli-auth/me', {\n headers: {\n authorization: `Bearer ${boardApiToken.trim()}`\n }\n });\n\n return getCliAuthIdentityLabel(identity);\n}\n\nfunction getSyncStatus(syncState: SyncRunState, runningSync: boolean, syncUnlocked: boolean): { label: string; tone: Tone } {\n if (!syncUnlocked) {\n return { label: 'Locked', tone: 'neutral' };\n }\n\n if (runningSync || syncState.status === 'running') {\n return { label: 'Running', tone: 'info' };\n }\n\n if (getActiveRateLimitPause(syncState)) {\n return { label: 'Paused', tone: 'warning' };\n }\n\n if (syncState.status === 'error') {\n return { label: 'Needs attention', tone: 'danger' };\n }\n\n if (syncState.status === 'success') {\n return { label: 'Ready', tone: 'success' };\n }\n\n return { label: 'Ready', tone: 'info' };\n}\n\nfunction getToneClass(tone: Tone): string {\n switch (tone) {\n case 'success':\n return 'ghsync__badge--success';\n case 'warning':\n return 'ghsync__badge--warning';\n case 'info':\n return 'ghsync__badge--info';\n case 'danger':\n return 'ghsync__badge--danger';\n default:\n return 'ghsync__badge--neutral';\n }\n}\n\nconst SETTINGS_INDEX_HREF = '/instance/settings/plugins';\nconst GITHUB_SYNC_SETTINGS_UPDATED_EVENT = 'paperclip-github-plugin:settings-updated';\n\nfunction getStringValue(record: Record<string, unknown>, key: string): string | null {\n const value = record[key];\n return typeof value === 'string' && value.trim() ? value.trim() : null;\n}\n\nfunction isUuidLike(value: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value.trim());\n}\n\nfunction humanizeCompanyPrefix(value: string | null | undefined): string | null {\n if (typeof value !== 'string' || !value.trim()) {\n return null;\n }\n\n const trimmed = value.trim();\n if (isUuidLike(trimmed)) {\n return null;\n }\n\n return trimmed\n .replace(/[-_]+/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n .replace(/\\b\\w/g, (character) => character.toUpperCase());\n}\n\nfunction getCompanyLabelFromRecord(record: Record<string, unknown>): string | null {\n const explicitLabel =\n getStringValue(record, 'displayName')\n ?? getStringValue(record, 'name')\n ?? getStringValue(record, 'title');\n\n if (explicitLabel && !isUuidLike(explicitLabel)) {\n return explicitLabel;\n }\n\n return humanizeCompanyPrefix(\n getStringValue(record, 'companyPrefix')\n ?? getStringValue(record, 'prefix')\n ?? getStringValue(record, 'slug')\n );\n}\n\nasync function resolveCompanyScopeLabel(companyId: string, companyPrefix?: string | null): Promise<string | null> {\n try {\n const response = await fetchJson<unknown>(`/api/companies/${companyId}`);\n const record =\n response && typeof response === 'object'\n ? response as Record<string, unknown>\n : null;\n const directLabel = record ? getCompanyLabelFromRecord(record) : null;\n if (directLabel) {\n return directLabel;\n }\n\n const nestedCompany =\n record?.company && typeof record.company === 'object'\n ? record.company as Record<string, unknown>\n : null;\n const nestedLabel = nestedCompany ? getCompanyLabelFromRecord(nestedCompany) : null;\n if (nestedLabel) {\n return nestedLabel;\n }\n } catch {\n // Best-effort only. Fall through to other resolution paths.\n }\n\n try {\n const response = await fetchJson<unknown>('/api/companies');\n if (Array.isArray(response)) {\n const matchingCompany = response.find((entry) => {\n if (!entry || typeof entry !== 'object') {\n return false;\n }\n\n const record = entry as Record<string, unknown>;\n const entryId = getStringValue(record, 'id');\n const entryPrefix =\n getStringValue(record, 'companyPrefix')\n ?? getStringValue(record, 'prefix')\n ?? getStringValue(record, 'slug');\n\n return entryId === companyId || Boolean(companyPrefix && entryPrefix === companyPrefix);\n });\n\n if (matchingCompany && typeof matchingCompany === 'object') {\n const label = getCompanyLabelFromRecord(matchingCompany as Record<string, unknown>);\n if (label) {\n return label;\n }\n }\n }\n } catch {\n // Best-effort only. Fall through to the prefix fallback.\n }\n\n return humanizeCompanyPrefix(companyPrefix);\n}\n\nfunction useResolvedCompanyScopeLabel(companyId: string | null, companyPrefix: string | null): string | null {\n const prefixFallback = humanizeCompanyPrefix(companyPrefix);\n const [companyLabel, setCompanyLabel] = useState<string | null>(prefixFallback);\n\n useEffect(() => {\n if (!companyId) {\n setCompanyLabel(null);\n return;\n }\n\n setCompanyLabel(prefixFallback);\n let cancelled = false;\n\n void (async () => {\n const resolvedLabel = await resolveCompanyScopeLabel(companyId, companyPrefix);\n if (!cancelled) {\n setCompanyLabel(resolvedLabel ?? prefixFallback);\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [companyId, companyPrefix, prefixFallback]);\n\n return companyLabel;\n}\n\nfunction notifyGitHubSyncSettingsChanged(): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n window.dispatchEvent(new CustomEvent(GITHUB_SYNC_SETTINGS_UPDATED_EVENT));\n}\n\nfunction getIssueIdentifierFromLocation(pathname: string): string | null {\n const match = pathname.match(/\\/issues\\/([^/?#]+)/i);\n if (!match?.[1]) {\n return null;\n }\n\n try {\n return decodeURIComponent(match[1]);\n } catch {\n return match[1];\n }\n}\n\nfunction useResolvedIssueId(params: {\n companyId?: string | null;\n projectId?: string | null;\n entityId?: string | null;\n entityType?: string | null;\n}): {\n issueId: string | null;\n issueIdentifier: string | null;\n loading: boolean;\n} {\n const pathname = typeof window === 'undefined' ? '' : window.location.pathname;\n const issueIdentifier = params.entityType === 'issue' ? getIssueIdentifierFromLocation(pathname) : null;\n const resolution = usePluginData<IssueIdentifierResolutionData | null>('issue.resolveByIdentifier', {\n ...(params.companyId && issueIdentifier ? { companyId: params.companyId } : {}),\n ...(params.projectId && issueIdentifier ? { projectId: params.projectId } : {}),\n ...(issueIdentifier ? { issueIdentifier } : {})\n });\n\n useEffect(() => {\n if (!params.companyId || !issueIdentifier) {\n return;\n }\n\n try {\n resolution.refresh();\n } catch {\n return;\n }\n }, [issueIdentifier, params.companyId, params.projectId, resolution.refresh]);\n\n if (issueIdentifier) {\n return {\n issueId: resolution.data?.issueId ?? null,\n issueIdentifier,\n loading: resolution.loading && !resolution.data\n };\n }\n\n return {\n issueId: params.entityId ?? null,\n issueIdentifier: null,\n loading: false\n };\n}\n\nfunction resolvePluginSettingsHref(records: unknown): string {\n if (!Array.isArray(records)) {\n return SETTINGS_INDEX_HREF;\n }\n\n for (const entry of records) {\n if (!entry || typeof entry !== 'object') {\n continue;\n }\n\n const record = entry as Record<string, unknown>;\n const manifest = record.manifest && typeof record.manifest === 'object' ? record.manifest as Record<string, unknown> : null;\n const id =\n getStringValue(record, 'id') ??\n getStringValue(record, 'pluginId');\n const key =\n getStringValue(record, 'pluginKey') ??\n getStringValue(record, 'key') ??\n getStringValue(record, 'packageName') ??\n getStringValue(record, 'name') ??\n (manifest ? getStringValue(manifest, 'id') : null);\n const displayName =\n getStringValue(record, 'displayName') ??\n (manifest ? getStringValue(manifest, 'displayName') : null);\n\n if (id && (key === 'paperclip-github-plugin' || displayName === 'GitHub Sync')) {\n return `${SETTINGS_INDEX_HREF}/${id}`;\n }\n }\n\n return SETTINGS_INDEX_HREF;\n}\n\nfunction formatSyncProgressRepository(repositoryUrl?: string): string | null {\n if (!repositoryUrl?.trim()) {\n return null;\n }\n\n const parsed = parseRepositoryReference(repositoryUrl);\n if (parsed) {\n return `${parsed.owner}/${parsed.repo}`;\n }\n\n return repositoryUrl.trim();\n}\n\nfunction getRunningSyncProgressModel(syncState: SyncRunState): {\n title: string;\n description: string;\n repositoryLabel?: string;\n repositoryPosition?: string;\n issueProgressLabel?: string;\n currentIssueLabel?: string;\n completedIssueCount?: number;\n totalIssueCount?: number;\n percent: number | null;\n indeterminate: boolean;\n} | null {\n if (syncState.status !== 'running') {\n return null;\n }\n\n const progress = syncState.progress;\n const repositoryLabel = formatSyncProgressRepository(progress?.currentRepositoryUrl) ?? undefined;\n const repositoryPosition =\n progress?.currentRepositoryIndex && progress.totalRepositoryCount\n ? `Repository ${progress.currentRepositoryIndex} of ${progress.totalRepositoryCount}`\n : progress?.totalRepositoryCount\n ? `${progress.totalRepositoryCount} ${progress.totalRepositoryCount === 1 ? 'repository' : 'repositories'}`\n : undefined;\n const completedIssueCount =\n typeof progress?.completedIssueCount === 'number' ? Math.max(0, progress.completedIssueCount) : undefined;\n const totalIssueCount =\n typeof progress?.totalIssueCount === 'number' ? Math.max(0, progress.totalIssueCount) : undefined;\n const detailLabel = progress?.detailLabel?.trim() ? progress.detailLabel.trim() : undefined;\n const indeterminate = totalIssueCount === undefined;\n const percent =\n totalIssueCount === undefined\n ? null\n : totalIssueCount === 0\n ? 100\n : Math.max(0, Math.min(100, ((completedIssueCount ?? 0) / totalIssueCount) * 100));\n const currentIssueLabel =\n progress?.currentIssueNumber !== undefined\n ? progress.phase === 'importing'\n ? `Importing GitHub issue #${progress.currentIssueNumber}`\n : progress.phase === 'syncing'\n ? `Syncing GitHub issue #${progress.currentIssueNumber}`\n : `Working on GitHub issue #${progress.currentIssueNumber}`\n : repositoryLabel\n ? `Current repository: ${repositoryLabel}`\n : undefined;\n\n switch (progress?.phase) {\n case 'importing': {\n const importingIssueProgressLabel =\n totalIssueCount !== undefined\n ? totalIssueCount === 0\n ? 'No issues to process'\n : `Processed ${Math.min(completedIssueCount ?? 0, totalIssueCount)} of ${totalIssueCount} issues`\n : detailLabel;\n return {\n title: repositoryLabel ? `Importing issues from ${repositoryLabel}` : 'Importing GitHub issues',\n description: repositoryLabel\n ? `Creating missing Paperclip issues and repairing existing imports from ${repositoryLabel}.`\n : 'Creating missing Paperclip issues and repairing existing imports.',\n ...(repositoryLabel ? { repositoryLabel } : {}),\n ...(repositoryPosition ? { repositoryPosition } : {}),\n ...(importingIssueProgressLabel ? { issueProgressLabel: importingIssueProgressLabel } : {}),\n ...(currentIssueLabel ? { currentIssueLabel } : {}),\n ...(completedIssueCount !== undefined ? { completedIssueCount } : {}),\n ...(totalIssueCount !== undefined ? { totalIssueCount } : {}),\n percent,\n indeterminate\n };\n }\n case 'syncing': {\n const syncingIssueProgressLabel =\n totalIssueCount !== undefined\n ? totalIssueCount === 0\n ? 'No issues to process'\n : `Processed ${Math.min(completedIssueCount ?? 0, totalIssueCount)} of ${totalIssueCount} issues`\n : detailLabel;\n return {\n title: repositoryLabel ? `Syncing ${repositoryLabel}` : 'Syncing Paperclip issue state',\n description: repositoryLabel\n ? `Updating labels, descriptions, and status for imported issues from ${repositoryLabel}.`\n : 'Updating labels, descriptions, and status for imported issues.',\n ...(repositoryLabel ? { repositoryLabel } : {}),\n ...(repositoryPosition ? { repositoryPosition } : {}),\n ...(syncingIssueProgressLabel ? { issueProgressLabel: syncingIssueProgressLabel } : {}),\n ...(currentIssueLabel ? { currentIssueLabel } : {}),\n ...(completedIssueCount !== undefined ? { completedIssueCount } : {}),\n ...(totalIssueCount !== undefined ? { totalIssueCount } : {}),\n percent,\n indeterminate\n };\n }\n default: {\n const preparingIssueProgressLabel =\n detailLabel ??\n (totalIssueCount !== undefined\n ? totalIssueCount === 0\n ? 'No issues to process'\n : `Found ${totalIssueCount} issues to sync`\n : completedIssueCount !== undefined\n ? `Scanned ${completedIssueCount} GitHub ${completedIssueCount === 1 ? 'issue' : 'issues'} so far`\n : undefined);\n return {\n title: repositoryLabel ? `Preparing ${repositoryLabel}` : 'Preparing GitHub sync',\n description:\n detailLabel ??\n (repositoryLabel\n ? `Calculating how many GitHub issues need to be synced for ${repositoryLabel}.`\n : 'Calculating how many GitHub issues need to be synced.'),\n ...(repositoryLabel ? { repositoryLabel } : {}),\n ...(repositoryPosition ? { repositoryPosition } : {}),\n ...(preparingIssueProgressLabel ? { issueProgressLabel: preparingIssueProgressLabel } : {}),\n ...(currentIssueLabel ? { currentIssueLabel } : {}),\n percent: null,\n indeterminate: true\n };\n }\n }\n}\n\nfunction getSyncMetricCards(params: {\n totalSyncedIssuesCount?: number;\n erroredIssuesCount?: number;\n syncState: SyncRunState;\n savedMappingCount: number;\n}): Array<{\n key: string;\n value: number;\n label: string;\n description: string;\n emphasized?: boolean;\n}> {\n const totalSyncedIssuesCount = Math.max(0, params.totalSyncedIssuesCount ?? 0);\n const erroredIssuesCount = Math.max(0, params.erroredIssuesCount ?? 0);\n\n return [\n {\n key: 'total-synced',\n value: totalSyncedIssuesCount,\n label: 'Total issues synced',\n description:\n totalSyncedIssuesCount > 0\n ? 'Across all mapped repositories.'\n : params.savedMappingCount > 0\n ? 'No issues imported yet.'\n : 'Add a repository to start syncing.'\n },\n {\n key: 'errored',\n value: erroredIssuesCount,\n label: 'Issues errored',\n description:\n params.syncState.status === 'running'\n ? erroredIssuesCount > 0\n ? 'Detected so far in this run.'\n : 'No issue errors detected yet.'\n : params.syncState.checkedAt\n ? erroredIssuesCount > 0\n ? 'From the latest sync run.'\n : 'No errors in the latest sync run.'\n : 'No sync run yet.',\n emphasized: erroredIssuesCount > 0\n }\n ];\n}\n\nfunction getDashboardSummary(params: {\n syncIssue: SyncConfigurationIssue | null;\n hasCompanyContext: boolean;\n syncState: SyncRunState;\n runningSync: boolean;\n scheduleFrequencyMinutes: number;\n}): { label: string; tone: Tone; title: string; body: string } {\n const cadence = formatScheduleFrequency(params.scheduleFrequencyMinutes);\n const activeRateLimitPause = getActiveRateLimitPause(params.syncState);\n const rateLimitResourceLabel = getGitHubRateLimitResourceLabel(activeRateLimitPause?.resource);\n\n switch (params.syncIssue) {\n case 'missing_token':\n return {\n label: 'Setup required',\n tone: 'warning',\n title: 'Finish setup to start syncing',\n body: 'Open settings to validate GitHub access and configure your first repository.'\n };\n case 'missing_mapping':\n return {\n label: 'Setup required',\n tone: 'warning',\n title: 'Add your first repository',\n body: 'Open settings to connect one repository to a Paperclip project.'\n };\n case 'missing_board_access':\n return {\n label: 'Board access required',\n tone: 'warning',\n title: 'Connect Paperclip board access',\n body: params.hasCompanyContext\n ? 'This Paperclip deployment requires board access before worker-side sync can use local REST endpoints.'\n : 'Open plugin settings inside a company to connect required Paperclip board access for this deployment.'\n };\n }\n\n if (params.runningSync || params.syncState.status === 'running') {\n const progress = getRunningSyncProgressModel(params.syncState);\n return {\n label: 'Syncing',\n tone: 'info',\n title: progress?.title ?? 'Sync in progress',\n body: progress?.description ?? 'GitHub issues are being checked right now. This card refreshes automatically until the run finishes.'\n };\n }\n\n if (activeRateLimitPause) {\n return {\n label: 'Paused',\n tone: 'warning',\n title: 'GitHub sync paused by rate limit',\n body: `${rateLimitResourceLabel ?? 'GitHub'} rate limiting paused sync until ${formatDate(activeRateLimitPause.resetAt, activeRateLimitPause.resetAt)}.`\n };\n }\n\n if (params.syncState.status === 'error') {\n return {\n label: 'Needs attention',\n tone: 'danger',\n title: 'Last sync needs attention',\n body: params.syncState.message ?? 'Open settings to review the latest GitHub sync issue.'\n };\n }\n\n if (params.syncState.checkedAt) {\n return {\n label: 'Ready',\n tone: params.syncState.status === 'success' ? 'success' : 'info',\n title: 'GitHub sync activity',\n body: params.syncState.message ?? `Automatic sync runs ${cadence}.`\n };\n }\n\n return {\n label: 'Ready',\n tone: 'info',\n title: 'Ready for first sync',\n body: `Your repository mapping is in place. Automatic sync runs ${cadence}.`\n };\n}\n\nfunction buildThemeVars(theme: ThemePalette, themeMode: ThemeMode): React.CSSProperties {\n return {\n colorScheme: themeMode,\n ['--ghsync-text' as string]: theme.text,\n ['--ghsync-title' as string]: theme.title,\n ['--ghsync-muted' as string]: theme.muted,\n ['--ghsync-surface' as string]: theme.surface,\n ['--ghsync-surfaceAlt' as string]: theme.surfaceAlt,\n ['--ghsync-surfaceRaised' as string]: theme.surfaceRaised,\n ['--ghsync-border' as string]: theme.border,\n ['--ghsync-border-soft' as string]: theme.borderSoft,\n ['--ghsync-input-bg' as string]: theme.inputBg,\n ['--ghsync-input-border' as string]: theme.inputBorder,\n ['--ghsync-input-text' as string]: theme.inputText,\n ['--ghsync-badge-bg' as string]: theme.badgeBg,\n ['--ghsync-badge-border' as string]: theme.badgeBorder,\n ['--ghsync-badge-text' as string]: theme.badgeText,\n ['--ghsync-primaryBg' as string]: theme.primaryBg,\n ['--ghsync-primaryBorder' as string]: theme.primaryBorder,\n ['--ghsync-primaryText' as string]: theme.primaryText,\n ['--ghsync-secondaryBg' as string]: theme.secondaryBg,\n ['--ghsync-secondaryBorder' as string]: theme.secondaryBorder,\n ['--ghsync-secondaryText' as string]: theme.secondaryText,\n ['--ghsync-dangerBg' as string]: theme.dangerBg,\n ['--ghsync-dangerBorder' as string]: theme.dangerBorder,\n ['--ghsync-dangerText' as string]: theme.dangerText,\n ['--ghsync-danger-bg' as string]: theme.dangerBg,\n ['--ghsync-danger-border' as string]: theme.dangerBorder,\n ['--ghsync-danger-text' as string]: theme.dangerText,\n ['--ghsync-success-bg' as string]: theme.successBg,\n ['--ghsync-success-border' as string]: theme.successBorder,\n ['--ghsync-success-text' as string]: theme.successText,\n ['--ghsync-warning-bg' as string]: theme.warningBg,\n ['--ghsync-warning-border' as string]: theme.warningBorder,\n ['--ghsync-warning-text' as string]: theme.warningText,\n ['--ghsync-info-bg' as string]: theme.infoBg,\n ['--ghsync-info-border' as string]: theme.infoBorder,\n ['--ghsync-info-text' as string]: theme.infoText,\n ['--ghsync-shadow' as string]: theme.shadow\n } as React.CSSProperties;\n}\n\nfunction formatGitHubRepositoryLabel(repositoryUrl: string): string {\n return repositoryUrl.replace(/^https:\\/\\/github\\.com\\//, '');\n}\n\nfunction formatGitHubIssueState(state?: 'open' | 'closed', reason?: 'completed' | 'not_planned' | 'duplicate'): string {\n if (!state) {\n return 'Pending refresh';\n }\n\n if (state !== 'closed') {\n return 'Open';\n }\n\n switch (reason) {\n case 'duplicate':\n return 'Closed as duplicate';\n case 'not_planned':\n return 'Closed as not planned';\n default:\n return 'Closed';\n }\n}\n\nfunction formatSyncFailurePhase(phase?: SyncFailurePhase): string | null {\n switch (phase) {\n case 'configuration':\n return 'Checking sync configuration';\n case 'loading_paperclip_labels':\n return 'Loading Paperclip labels';\n case 'listing_github_issues':\n return 'Listing GitHub issues';\n case 'building_import_plan':\n return 'Building the GitHub import plan';\n case 'importing_issue':\n return 'Importing a GitHub issue';\n case 'syncing_labels':\n return 'Syncing issue labels';\n case 'syncing_description':\n return 'Syncing issue descriptions';\n case 'evaluating_github_status':\n return 'Checking GitHub review and CI status';\n case 'updating_paperclip_status':\n return 'Updating Paperclip issue status';\n default:\n return null;\n }\n}\n\nfunction formatSyncFailureRepository(repositoryUrl?: string): string | null {\n if (!repositoryUrl?.trim()) {\n return null;\n }\n\n const parsed = parseRepositoryReference(repositoryUrl);\n if (parsed) {\n return `${parsed.owner}/${parsed.repo}`;\n }\n\n return repositoryUrl.trim();\n}\n\nfunction getSyncDiagnostics(syncState: SyncRunState): {\n rows: Array<{ label: string; value: string }>;\n rawMessage?: string;\n suggestedAction?: string;\n} | null {\n if (syncState.status !== 'error') {\n return null;\n }\n\n const rows: Array<{ label: string; value: string }> = [];\n const repositoryLabel = formatSyncFailureRepository(syncState.errorDetails?.repositoryUrl);\n const phaseLabel = formatSyncFailurePhase(syncState.errorDetails?.phase);\n const issueNumber = syncState.errorDetails?.githubIssueNumber;\n const rateLimitResetAt = syncState.errorDetails?.rateLimitResetAt;\n const rateLimitResourceLabel = getGitHubRateLimitResourceLabel(syncState.errorDetails?.rateLimitResource);\n\n if (repositoryLabel) {\n rows.push({\n label: 'Repository',\n value: repositoryLabel\n });\n }\n\n if (issueNumber !== undefined) {\n rows.push({\n label: 'GitHub issue',\n value: `#${issueNumber}`\n });\n }\n\n if (phaseLabel) {\n rows.push({\n label: 'Failed while',\n value: phaseLabel\n });\n }\n\n if (rateLimitResourceLabel) {\n rows.push({\n label: 'GitHub bucket',\n value: rateLimitResourceLabel\n });\n }\n\n if (rateLimitResetAt) {\n rows.push({\n label: 'Paused until',\n value: formatDate(rateLimitResetAt, rateLimitResetAt)\n });\n }\n\n const rawMessage =\n syncState.errorDetails?.rawMessage && syncState.errorDetails.rawMessage !== syncState.message\n ? syncState.errorDetails.rawMessage\n : undefined;\n const suggestedAction = syncState.errorDetails?.suggestedAction;\n\n if (rows.length === 0 && !rawMessage && !suggestedAction) {\n return null;\n }\n\n return {\n rows,\n ...(rawMessage ? { rawMessage } : {}),\n ...(suggestedAction ? { suggestedAction } : {})\n };\n}\n\nfunction SyncProgressPanel(props: {\n syncState: SyncRunState;\n compact?: boolean;\n}): React.JSX.Element | null {\n const progress = getRunningSyncProgressModel(props.syncState);\n const progressValueText = progress?.issueProgressLabel ?? progress?.description;\n\n if (!progress) {\n return null;\n }\n\n const progressFillWidth =\n progress.indeterminate || progress.percent === null\n ? undefined\n : `${progress.percent > 0 ? Math.max(progress.percent, 3) : 0}%`;\n\n return (\n <section\n className={`ghsync-progress${props.compact ? ' ghsync-progress--compact' : ''}`}\n aria-live=\"polite\"\n >\n <div className=\"ghsync-progress__header\">\n <div className=\"ghsync-progress__copy\">\n <strong>{progress.title}</strong>\n <span>{progress.description}</span>\n </div>\n {progress.repositoryPosition ? <span className=\"ghsync-progress__pill\">{progress.repositoryPosition}</span> : null}\n </div>\n\n <div\n className=\"ghsync-progress__track\"\n role=\"progressbar\"\n aria-label={progress.title}\n aria-valuemin={0}\n aria-valuemax={progress.totalIssueCount}\n aria-valuenow={progress.indeterminate ? undefined : progress.completedIssueCount}\n aria-valuetext={progressValueText}\n >\n <div\n className={`ghsync-progress__fill${progress.indeterminate ? ' ghsync-progress__fill--indeterminate' : ''}`}\n style={progressFillWidth ? { width: progressFillWidth } : undefined}\n />\n </div>\n\n <div className=\"ghsync-progress__meta\">\n <span>{progress.issueProgressLabel ?? 'Calculating the total number of issues to sync.'}</span>\n <span>{progress.currentIssueLabel ?? progress.repositoryLabel ?? 'GitHub sync is running.'}</span>\n </div>\n </section>\n );\n}\n\nfunction SyncDiagnosticsPanel(props: {\n syncState: SyncRunState;\n requestError?: string | null;\n compact?: boolean;\n}): React.JSX.Element | null {\n const diagnostics = getSyncDiagnostics(props.syncState);\n const requestError = props.requestError?.trim() ? props.requestError.trim() : null;\n\n if (!diagnostics && !requestError) {\n return null;\n }\n\n return (\n <section className={`ghsync-diagnostics${props.compact ? ' ghsync-diagnostics--compact' : ''}`}>\n <div className=\"ghsync-diagnostics__header\">\n <strong>{diagnostics ? 'Troubleshooting details' : 'Sync request failed'}</strong>\n <span>\n {diagnostics\n ? 'GitHub Sync saved this snapshot from the latest failed run.'\n : 'The sync request failed before the worker returned a saved result.'}\n </span>\n </div>\n\n {requestError ? (\n <div className=\"ghsync-diagnostics__block\">\n <span className=\"ghsync-diagnostics__label\">Request error</span>\n <div className=\"ghsync-diagnostics__value ghsync-diagnostics__value--code\">{requestError}</div>\n </div>\n ) : null}\n\n {diagnostics?.rows.length ? (\n <div className=\"ghsync-diagnostics__grid\">\n {diagnostics.rows.map((row) => (\n <div key={row.label} className=\"ghsync-diagnostics__item\">\n <span className=\"ghsync-diagnostics__label\">{row.label}</span>\n <strong className=\"ghsync-diagnostics__value\">{row.value}</strong>\n </div>\n ))}\n </div>\n ) : null}\n\n {diagnostics?.rawMessage ? (\n <div className=\"ghsync-diagnostics__block\">\n <span className=\"ghsync-diagnostics__label\">Raw error</span>\n <div className=\"ghsync-diagnostics__value ghsync-diagnostics__value--code\">{diagnostics.rawMessage}</div>\n </div>\n ) : null}\n\n {diagnostics?.suggestedAction ? (\n <div className=\"ghsync-diagnostics__block\">\n <span className=\"ghsync-diagnostics__label\">Next step</span>\n <div className=\"ghsync-diagnostics__value\">{diagnostics.suggestedAction}</div>\n </div>\n ) : null}\n </section>\n );\n}\n\nexport function GitHubSyncSettingsPage(): React.JSX.Element {\n const hostContext = useHostContext();\n const toast = usePluginToast();\n const pluginIdFromLocation = getPluginIdFromLocation();\n const settings = usePluginData<GitHubSyncSettings>(\n 'settings.registration',\n hostContext.companyId ? { companyId: hostContext.companyId, includeAssignees: true } : {}\n );\n const saveRegistration = usePluginAction('settings.saveRegistration');\n const updateBoardAccess = usePluginAction('settings.updateBoardAccess');\n const validateToken = usePluginAction('settings.validateToken');\n const runSyncNow = usePluginAction('sync.runNow');\n const [form, setForm] = useState<GitHubSyncSettings>(EMPTY_SETTINGS);\n const [submittingToken, setSubmittingToken] = useState(false);\n const [connectingBoardAccess, setConnectingBoardAccess] = useState(false);\n const [submittingSetup, setSubmittingSetup] = useState(false);\n const [runningSync, setRunningSync] = useState(false);\n const [manualSyncRequestError, setManualSyncRequestError] = useState<string | null>(null);\n const [scheduleFrequencyDraft, setScheduleFrequencyDraft] = useState(String(DEFAULT_SCHEDULE_FREQUENCY_MINUTES));\n const [ignoredAuthorsDraft, setIgnoredAuthorsDraft] = useState(DEFAULT_ADVANCED_SETTINGS.ignoredIssueAuthorUsernames.join(', '));\n const [tokenStatusOverride, setTokenStatusOverride] = useState<TokenStatus | null>(null);\n const [validatedLogin, setValidatedLogin] = useState<string | null>(null);\n const [boardAccessIdentity, setBoardAccessIdentity] = useState<string | null>(null);\n const [tokenDraft, setTokenDraft] = useState('');\n const [showSavedTokenHint, setShowSavedTokenHint] = useState(false);\n const [showTokenEditor, setShowTokenEditor] = useState(false);\n const [showAdvancedSettings, setShowAdvancedSettings] = useState(false);\n const [cachedSettings, setCachedSettings] = useState<GitHubSyncSettings | null>(null);\n const [existingProjectCandidates, setExistingProjectCandidates] = useState<ExistingProjectSyncCandidate[]>([]);\n const [existingProjectCandidatesLoading, setExistingProjectCandidatesLoading] = useState(false);\n const [existingProjectCandidatesError, setExistingProjectCandidatesError] = useState<string | null>(null);\n const themeMode = useResolvedThemeMode();\n const boardAccessRequirement = usePaperclipBoardAccessRequirement();\n const armSyncCompletionToast = useSyncCompletionToast(form.syncState, toast);\n const boardAccessConfigSyncAttemptRef = useRef<string | null>(null);\n\n const currentSettings = settings.data ?? cachedSettings;\n const showInitialLoadingState = settings.loading && !settings.data && !cachedSettings;\n\n useEffect(() => {\n if (settings.data) {\n setCachedSettings(settings.data);\n }\n }, [settings.data]);\n\n useEffect(() => {\n if (!settings.data) {\n return;\n }\n\n const nextScheduleFrequencyMinutes = normalizeScheduleFrequencyMinutes(settings.data.scheduleFrequencyMinutes);\n setForm({\n mappings: settings.data.mappings ?? [],\n syncState: settings.data.syncState ?? { status: 'idle' },\n scheduleFrequencyMinutes: nextScheduleFrequencyMinutes,\n advancedSettings: normalizeAdvancedSettings(settings.data.advancedSettings),\n availableAssignees: settings.data.availableAssignees ?? [],\n paperclipApiBaseUrl: settings.data.paperclipApiBaseUrl,\n githubTokenConfigured: settings.data.githubTokenConfigured,\n paperclipBoardAccessConfigured: settings.data.paperclipBoardAccessConfigured,\n totalSyncedIssuesCount: settings.data.totalSyncedIssuesCount,\n updatedAt: settings.data.updatedAt\n });\n setScheduleFrequencyDraft(String(nextScheduleFrequencyMinutes));\n setIgnoredAuthorsDraft(normalizeAdvancedSettings(settings.data.advancedSettings).ignoredIssueAuthorUsernames.join(', '));\n setTokenDraft('');\n if (!settings.data.paperclipBoardAccessConfigured) {\n setBoardAccessIdentity(null);\n }\n\n if (settings.data.githubTokenConfigured) {\n setShowSavedTokenHint(true);\n setShowTokenEditor(false);\n setTokenStatusOverride('valid');\n } else if (!showSavedTokenHint) {\n setShowTokenEditor(true);\n setValidatedLogin(null);\n }\n }, [settings.data, showSavedTokenHint]);\n\n useEffect(() => {\n const companyId = hostContext.companyId;\n if (!companyId || tokenStatusOverride === 'invalid') {\n setExistingProjectCandidates([]);\n setExistingProjectCandidatesLoading(false);\n setExistingProjectCandidatesError(null);\n return;\n }\n\n let cancelled = false;\n setExistingProjectCandidatesLoading(true);\n setExistingProjectCandidatesError(null);\n\n void (async () => {\n try {\n const candidates = await loadExistingProjectSyncCandidates(companyId);\n if (cancelled) {\n return;\n }\n\n setExistingProjectCandidates(candidates);\n } catch (error) {\n if (cancelled) {\n return;\n }\n\n setExistingProjectCandidates([]);\n setExistingProjectCandidatesError(\n error instanceof Error\n ? error.message\n : 'GitHub Sync could not inspect existing GitHub-linked projects in this company.'\n );\n } finally {\n if (!cancelled) {\n setExistingProjectCandidatesLoading(false);\n }\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [hostContext.companyId, settings.data?.updatedAt, tokenStatusOverride]);\n\n useEffect(() => {\n const companyId = hostContext.companyId;\n const secretRef =\n settings.data?.paperclipBoardAccessNeedsConfigSync\n ? settings.data.paperclipBoardAccessConfigSyncRef\n : undefined;\n\n if (!companyId || !pluginIdFromLocation || !secretRef) {\n return;\n }\n\n const attemptKey = `${companyId}:${secretRef}`;\n if (boardAccessConfigSyncAttemptRef.current === attemptKey) {\n return;\n }\n boardAccessConfigSyncAttemptRef.current = attemptKey;\n\n let cancelled = false;\n\n void (async () => {\n try {\n await patchPluginConfig(pluginIdFromLocation, {\n paperclipBoardApiTokenRefs: {\n [companyId]: secretRef\n }\n });\n\n if (cancelled) {\n return;\n }\n\n notifyGitHubSyncSettingsChanged();\n\n try {\n await settings.refresh();\n } catch {\n return;\n }\n } catch (error) {\n if (cancelled) {\n return;\n }\n\n toast({\n title: 'Paperclip board access needs reconnection',\n body:\n error instanceof Error\n ? error.message\n : 'GitHub Sync could not finish migrating the saved Paperclip board access secret into plugin config.',\n tone: 'error'\n });\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [\n hostContext.companyId,\n pluginIdFromLocation,\n settings.data?.paperclipBoardAccessNeedsConfigSync,\n settings.data?.paperclipBoardAccessConfigSyncRef,\n settings.refresh,\n toast\n ]);\n\n useEffect(() => {\n const hasSavedToken = Boolean(form.githubTokenConfigured || showSavedTokenHint);\n const tokenStatus = tokenStatusOverride ?? (hasSavedToken ? 'valid' : 'required');\n if (!hostContext.companyId || tokenStatus !== 'valid' || form.mappings.length > 0) {\n return;\n }\n\n setForm((current) => ({\n ...current,\n mappings: [createEmptyMapping(0)]\n }));\n }, [form.githubTokenConfigured, form.mappings.length, hostContext.companyId, showSavedTokenHint, tokenStatusOverride]);\n\n useEffect(() => {\n if (form.syncState.status !== 'running') {\n return;\n }\n\n const refreshSettings = () => {\n try {\n settings.refresh();\n } catch {\n return;\n }\n };\n\n const intervalId = globalThis.setInterval(() => {\n refreshSettings();\n }, SYNC_POLL_INTERVAL_MS);\n\n refreshSettings();\n\n return () => {\n globalThis.clearInterval(intervalId);\n };\n }, [form.syncState.status, settings.refresh]);\n\n const theme = themeMode === 'light' ? LIGHT_PALETTE : DARK_PALETTE;\n const themeVars = buildThemeVars(theme, themeMode);\n const hasCompanyContext = Boolean(hostContext.companyId);\n const companyScopeLabel = useResolvedCompanyScopeLabel(hostContext.companyId, hostContext.companyPrefix);\n const currentCompanyName = companyScopeLabel ?? 'this company';\n const headerDescription = hasCompanyContext ? '' : 'Select a company.';\n const hasSavedToken = Boolean(form.githubTokenConfigured || showSavedTokenHint);\n const boardAccessConfigured = Boolean(form.paperclipBoardAccessConfigured);\n const boardAccessRequired = boardAccessRequirement.required;\n const boardAccessReady = !boardAccessRequired || (hasCompanyContext && boardAccessConfigured);\n const tokenStatus = tokenStatusOverride ?? (hasSavedToken ? 'valid' : 'required');\n const tokenTone: Tone = tokenStatus === 'valid' ? 'success' : tokenStatus === 'invalid' ? 'danger' : 'warning';\n const tokenBannerLabel = tokenStatus === 'valid' ? 'Token valid' : tokenStatus === 'invalid' ? 'Token invalid' : 'Token required';\n const tokenBadgeLabel = tokenStatus === 'valid' ? 'Valid' : tokenStatus === 'invalid' ? 'Invalid' : 'Required';\n const tokenStatusDescription =\n tokenStatus === 'invalid'\n ? 'GitHub rejected the last token.'\n : tokenStatus === 'required'\n ? 'Add a token.'\n : 'Shared token.';\n const tokenDescription = tokenStatusDescription;\n const boardAccessTone: Tone =\n connectingBoardAccess\n ? 'info'\n : boardAccessConfigured\n ? 'success'\n : boardAccessRequired\n ? 'warning'\n : 'info';\n const boardAccessBannerLabel =\n connectingBoardAccess\n ? 'Connecting'\n : boardAccessConfigured\n ? 'Connected'\n : boardAccessRequired\n ? 'Required'\n : boardAccessRequirement.status === 'loading'\n ? 'Checking'\n : 'Optional';\n const boardAccessSectionDescription = '';\n const repositoriesUnlocked = tokenStatus === 'valid';\n const availableAssignees = getAvailableAssigneeOptions(\n currentSettings?.availableAssignees ?? form.availableAssignees,\n form.advancedSettings.defaultAssigneeAgentId\n );\n const savedMappingsSource = currentSettings ? currentSettings.mappings ?? [] : form.mappings;\n const savedMappings = getComparableMappings(savedMappingsSource);\n const draftMappings = getComparableMappings(form.mappings);\n const savedAdvancedSettings = getComparableAdvancedSettings(currentSettings?.advancedSettings);\n const draftAdvancedSettings = getComparableAdvancedSettings(form.advancedSettings);\n const savedMappingCount = savedMappings.length;\n const availableExistingProjectCandidates = filterExistingProjectSyncCandidates(existingProjectCandidates, form.mappings);\n const repositoriesSectionDescription = '';\n const syncSetupIssue = getSyncSetupIssue({\n tokenStatus,\n savedMappingCount,\n boardAccessRequired,\n boardAccessConfigured,\n hasCompanyContext\n });\n const syncUnlocked = syncSetupIssue === null;\n const syncSetupMessage = getSyncSetupMessage(syncSetupIssue, hasCompanyContext);\n const displaySyncState = getDisplaySyncState(form.syncState, {\n hasToken: tokenStatus === 'valid',\n hasMappings: savedMappingCount > 0,\n hasBoardAccess: boardAccessReady\n });\n const mappingsDirty = JSON.stringify(draftMappings) !== JSON.stringify(savedMappings);\n const advancedSettingsDirty = JSON.stringify(draftAdvancedSettings) !== JSON.stringify(savedAdvancedSettings);\n const scheduleFrequencyError = getScheduleFrequencyError(scheduleFrequencyDraft);\n const scheduleFrequencyMinutes = parseScheduleFrequencyDraft(scheduleFrequencyDraft) ?? form.scheduleFrequencyMinutes;\n const savedScheduleFrequencyMinutes = normalizeScheduleFrequencyMinutes(currentSettings?.scheduleFrequencyMinutes);\n const scheduleDirty = scheduleFrequencyError === null && scheduleFrequencyMinutes !== savedScheduleFrequencyMinutes;\n const mappings = form.mappings.length > 0 ? form.mappings : [createEmptyMapping(0)];\n const syncInFlight = runningSync || displaySyncState.status === 'running';\n const settingsMutationsLocked = syncInFlight;\n const settingsMutationsLockReason = settingsMutationsLocked\n ? 'Settings are temporarily locked while a sync is running to avoid overwriting local edits.'\n : null;\n const syncStatus = getSyncStatus(displaySyncState, runningSync, syncUnlocked);\n const canSaveToken =\n hasCompanyContext &&\n !settingsMutationsLocked &&\n !submittingToken &&\n !showInitialLoadingState &&\n tokenDraft.trim().length > 0;\n const canSaveSetup =\n hasCompanyContext &&\n repositoriesUnlocked &&\n !settingsMutationsLocked &&\n !submittingSetup &&\n !showInitialLoadingState &&\n scheduleFrequencyError === null &&\n (mappingsDirty || advancedSettingsDirty || scheduleDirty);\n const canConnectBoardAccess =\n hasCompanyContext &&\n !settingsMutationsLocked &&\n !connectingBoardAccess &&\n !showInitialLoadingState;\n const boardAccessStatusLabel =\n !hasCompanyContext\n ? 'Unavailable'\n : boardAccessBannerLabel;\n const boardAccessStatusTone: Tone =\n !hasCompanyContext\n ? boardAccessRequired\n ? 'warning'\n : 'neutral'\n : boardAccessTone;\n const boardAccessSummaryText =\n !hasCompanyContext\n ? boardAccessRequired\n ? 'Select a company.'\n : 'Select a company.'\n : connectingBoardAccess\n ? 'Approval in progress.'\n : boardAccessConfigured\n ? 'Connected.'\n : boardAccessRequired\n ? 'Required for sync.'\n : boardAccessRequirement.status === 'loading'\n ? 'Checking requirement.'\n : 'Optional.';\n const showTokenForm = tokenStatus !== 'valid' || showTokenEditor;\n const lastUpdated = formatDate(form.updatedAt ?? currentSettings?.updatedAt, 'Not saved yet');\n const lastSync = formatDate(displaySyncState.checkedAt, 'Never');\n const scheduleDescription = formatScheduleFrequency(scheduleFrequencyMinutes);\n const syncProgress = getRunningSyncProgressModel(displaySyncState);\n const syncMetricCards = getSyncMetricCards({\n totalSyncedIssuesCount: currentSettings?.totalSyncedIssuesCount ?? form.totalSyncedIssuesCount,\n erroredIssuesCount: displaySyncState.erroredIssuesCount,\n syncState: displaySyncState,\n savedMappingCount\n });\n const syncSectionDescription = '';\n const syncSummaryPrimaryText =\n syncProgress?.title ??\n displaySyncState.message ??\n (syncUnlocked ? 'Ready to sync.' : syncSetupMessage);\n const manualSyncScopeSummary = hasCompanyContext\n ? `Manual sync: ${currentCompanyName}`\n : 'Manual sync: all companies';\n const syncSummarySecondaryText = syncProgress\n ? [\n manualSyncScopeSummary,\n syncProgress.issueProgressLabel,\n syncProgress.currentIssueLabel ?? syncProgress.repositoryPosition,\n `Auto-sync: ${scheduleDescription}`\n ].filter((value): value is string => Boolean(value))\n .join(' \u00B7 ')\n : `${manualSyncScopeSummary} \u00B7 Auto-sync: ${scheduleDescription} \u00B7 Last trigger: ${displaySyncState.lastRunTrigger ?? 'none'} \u00B7 Last checked: ${displaySyncState.checkedAt ? formatDate(displaySyncState.checkedAt) : 'never'}`;\n const syncSummaryClass =\n syncStatus.tone === 'success'\n ? 'ghsync__sync-summary ghsync__sync-summary--success'\n : syncStatus.tone === 'danger'\n ? 'ghsync__sync-summary ghsync__sync-summary--danger'\n : 'ghsync__sync-summary ghsync__sync-summary--info';\n const manualSyncScopePillClass = hasCompanyContext\n ? 'ghsync__scope-pill ghsync__scope-pill--company'\n : 'ghsync__scope-pill ghsync__scope-pill--mixed';\n const manualSyncScopePillLabel = hasCompanyContext ? 'This company' : 'All companies';\n const manualSyncButtonLabel = hasCompanyContext ? 'Run sync for this company' : 'Run sync across all companies';\n const advancedSettingsSummary = formatAdvancedSettingsSummary(form.advancedSettings, availableAssignees);\n const assigneeSelectOptions: SettingsSelectOption[] = [\n { value: '', label: 'Unassigned' },\n ...availableAssignees.map((option) => ({\n value: option.id,\n label: formatAssigneeOptionLabel(option),\n icon: 'agent' as const\n }))\n ];\n const statusSelectOptions: SettingsSelectOption[] = PAPERCLIP_STATUS_OPTIONS.map((option) => ({\n value: option.value,\n label: option.label,\n tone: option.tone\n }));\n useEffect(() => {\n if (advancedSettingsDirty) {\n setShowAdvancedSettings(true);\n }\n }, [advancedSettingsDirty]);\n\n function updateMapping(mappingId: string, field: keyof RepositoryMapping, value: string) {\n setForm((current) => {\n const hasMapping = current.mappings.some((mapping) => mapping.id === mappingId);\n const nextMappings = hasMapping\n ? current.mappings\n : [\n ...current.mappings,\n {\n ...createEmptyMapping(current.mappings.length),\n id: mappingId\n }\n ];\n\n return {\n ...current,\n mappings: nextMappings.map((mapping) => {\n if (mapping.id !== mappingId) {\n return mapping;\n }\n\n if (field === 'repositoryUrl') {\n return {\n ...mapping,\n repositoryUrl: value,\n ...(shouldAutofillProjectName(mapping)\n ? { paperclipProjectName: formatProjectNameFromRepository(value) }\n : {})\n };\n }\n\n return {\n ...mapping,\n [field]: value\n };\n })\n };\n });\n }\n\n function addMapping() {\n setForm((current) => ({\n ...current,\n mappings: [...current.mappings, createEmptyMapping(current.mappings.length)]\n }));\n }\n\n function addExistingProjectCandidate(candidate: ExistingProjectSyncCandidate) {\n setForm((current) => {\n const emptyMappingIndex = current.mappings.findIndex((mapping) =>\n !mapping.repositoryUrl.trim() && !mapping.paperclipProjectName.trim() && !mapping.paperclipProjectId\n );\n const nextMapping = {\n ...(emptyMappingIndex === -1 ? createEmptyMapping(current.mappings.length) : current.mappings[emptyMappingIndex]),\n repositoryUrl: candidate.repositoryUrl,\n paperclipProjectName: candidate.projectName,\n paperclipProjectId: candidate.projectId,\n companyId: hostContext.companyId ?? undefined\n };\n\n if (emptyMappingIndex === -1) {\n return {\n ...current,\n mappings: [...current.mappings, nextMapping]\n };\n }\n\n return {\n ...current,\n mappings: current.mappings.map((mapping, index) => index === emptyMappingIndex ? nextMapping : mapping)\n };\n });\n }\n\n function removeMapping(mappingId: string) {\n setForm((current) => {\n const remaining = current.mappings.filter((mapping) => mapping.id !== mappingId);\n return {\n ...current,\n mappings: remaining.length > 0 ? remaining : [createEmptyMapping(0)]\n };\n });\n }\n\n async function handleSaveToken(event: React.FormEvent<HTMLFormElement>) {\n event.preventDefault();\n setSubmittingToken(true);\n\n let validation: TokenValidationResult;\n\n try {\n const trimmedToken = tokenDraft.trim();\n if (!trimmedToken) {\n throw new Error('Enter a GitHub token.');\n }\n\n validation = await validateToken({\n token: trimmedToken\n }) as TokenValidationResult;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'GitHub rejected this token.';\n if (!hasSavedToken) {\n setTokenStatusOverride('invalid');\n }\n setValidatedLogin(null);\n\n toast({\n title: 'GitHub token invalid',\n body: message,\n tone: 'error'\n });\n setSubmittingToken(false);\n return;\n }\n\n try {\n const companyId = hostContext.companyId;\n if (!companyId) {\n throw new Error('Company context is required to save the GitHub token.');\n }\n\n if (!pluginIdFromLocation) {\n throw new Error('Plugin id is required to save the GitHub token.');\n }\n\n const trimmedToken = tokenDraft.trim();\n\n const secretName = `github_sync_${companyId.replace(/[^a-z0-9]+/gi, '_').toLowerCase()}`;\n const secret = await resolveOrCreateCompanySecret(companyId, secretName, trimmedToken);\n\n await patchPluginConfig(pluginIdFromLocation, {\n githubTokenRef: secret.id\n });\n await saveRegistration({\n companyId,\n githubTokenRef: secret.id\n });\n\n setForm((current) => ({\n ...current,\n githubTokenConfigured: true\n }));\n setShowSavedTokenHint(true);\n setShowTokenEditor(false);\n setTokenStatusOverride('valid');\n setValidatedLogin(validation.login);\n setTokenDraft('');\n toast({\n title: `Authenticated as ${validation.login}`,\n body: 'Token saved.',\n tone: 'success'\n });\n notifyGitHubSyncSettingsChanged();\n\n try {\n await settings.refresh();\n } catch {\n return;\n }\n } catch (error) {\n toast({\n title: 'GitHub token could not be saved',\n body: error instanceof Error ? error.message : 'Paperclip could not save the validated token.',\n tone: 'error'\n });\n } finally {\n setSubmittingToken(false);\n }\n }\n\n async function handleConnectBoardAccess() {\n setConnectingBoardAccess(true);\n let approvalWindow: Window | null = null;\n\n try {\n const companyId = hostContext.companyId;\n if (!companyId) {\n throw new Error('Company context is required to connect Paperclip board access.');\n }\n\n if (!pluginIdFromLocation) {\n throw new Error('Plugin id is required to connect Paperclip board access.');\n }\n\n if (typeof window !== 'undefined') {\n approvalWindow = window.open('about:blank', '_blank');\n }\n\n const challenge = await requestBoardAccessChallenge(companyId);\n const approvalUrl = resolveCliAuthUrl(challenge.approvalUrl, challenge.approvalPath);\n if (!approvalUrl) {\n throw new Error('Paperclip did not return a board approval URL.');\n }\n\n if (!approvalWindow && typeof window !== 'undefined') {\n approvalWindow = window.open(approvalUrl, '_blank');\n } else {\n approvalWindow?.location.replace(approvalUrl);\n }\n\n if (!approvalWindow) {\n throw new Error('Allow pop-ups for Paperclip, then try connecting board access again.');\n }\n\n const boardApiToken = await waitForBoardAccessApproval(challenge);\n const identity = await fetchBoardAccessIdentity(boardApiToken);\n const secretName = `paperclip_board_api_${companyId.replace(/[^a-z0-9]+/gi, '_').toLowerCase()}`;\n const secret = await resolveOrCreateCompanySecret(companyId, secretName, boardApiToken);\n\n await patchPluginConfig(pluginIdFromLocation, {\n paperclipBoardApiTokenRefs: {\n [companyId]: secret.id\n }\n });\n await updateBoardAccess({\n companyId,\n paperclipBoardApiTokenRef: secret.id\n });\n\n setBoardAccessIdentity(identity);\n setForm((current) => ({\n ...current,\n paperclipBoardAccessConfigured: true\n }));\n toast({\n title: identity ? `Paperclip board access connected as ${identity}` : 'Paperclip board access connected',\n body: 'Direct Paperclip REST calls can now authenticate in authenticated deployments.',\n tone: 'success'\n });\n notifyGitHubSyncSettingsChanged();\n\n try {\n await settings.refresh();\n } catch {\n return;\n }\n } catch (error) {\n toast({\n title: 'Paperclip board access could not be connected',\n body: error instanceof Error ? error.message : 'Unable to finish the Paperclip board access approval flow.',\n tone: 'error'\n });\n } finally {\n setConnectingBoardAccess(false);\n try {\n approvalWindow?.close();\n } catch {\n return;\n }\n }\n }\n\n async function handleSaveSetup(event: React.FormEvent<HTMLFormElement>) {\n event.preventDefault();\n setSubmittingSetup(true);\n\n try {\n const companyId = hostContext.companyId;\n if (!companyId) {\n throw new Error('Company context is required to save setup.');\n }\n\n if (tokenStatus !== 'valid') {\n throw new Error('Validate a GitHub token first.');\n }\n\n if (scheduleFrequencyError) {\n throw new Error(scheduleFrequencyError);\n }\n\n const resolvedMappings: RepositoryMapping[] = [];\n for (const mapping of form.mappings) {\n const repositoryInput = mapping.repositoryUrl.trim();\n const paperclipProjectName = mapping.paperclipProjectName.trim();\n\n if (!repositoryInput && !paperclipProjectName) {\n continue;\n }\n\n if (!repositoryInput || !paperclipProjectName) {\n throw new Error('Each repository needs both a GitHub repository and a Paperclip project name.');\n }\n\n const parsedRepository = parseRepositoryReference(repositoryInput);\n if (!parsedRepository) {\n throw new Error(`Invalid GitHub repository: ${repositoryInput}. Use owner/repo or https://github.com/owner/repo.`);\n }\n\n const project = mapping.paperclipProjectId && mapping.companyId === companyId\n ? { id: mapping.paperclipProjectId, name: paperclipProjectName }\n : await resolveOrCreateProject(companyId, paperclipProjectName);\n\n await ensureProjectRepoBinding(project.id, parsedRepository.url);\n\n resolvedMappings.push({\n ...mapping,\n repositoryUrl: parsedRepository.url,\n paperclipProjectName: project.name,\n paperclipProjectId: project.id,\n companyId\n });\n }\n\n const trustedPaperclipApiBaseUrl = await syncTrustedPaperclipApiBaseUrl(pluginIdFromLocation);\n const result = await saveRegistration({\n companyId,\n mappings: resolvedMappings,\n advancedSettings: draftAdvancedSettings,\n syncState: form.syncState,\n scheduleFrequencyMinutes,\n ...(trustedPaperclipApiBaseUrl ? { paperclipApiBaseUrl: trustedPaperclipApiBaseUrl } : {})\n }) as GitHubSyncSettings;\n\n setForm((current) => ({\n ...current,\n mappings: result.mappings.length > 0 ? result.mappings : [createEmptyMapping(0)],\n syncState: result.syncState,\n scheduleFrequencyMinutes: normalizeScheduleFrequencyMinutes(result.scheduleFrequencyMinutes),\n advancedSettings: normalizeAdvancedSettings(result.advancedSettings),\n availableAssignees: result.availableAssignees ?? current.availableAssignees,\n paperclipApiBaseUrl: result.paperclipApiBaseUrl,\n updatedAt: result.updatedAt\n }));\n setScheduleFrequencyDraft(String(normalizeScheduleFrequencyMinutes(result.scheduleFrequencyMinutes)));\n\n toast({\n title: 'GitHub sync setup saved',\n body: `Advanced defaults, mappings, and automatic sync are saved for ${currentCompanyName}.`,\n tone: 'success'\n });\n notifyGitHubSyncSettingsChanged();\n\n try {\n await settings.refresh();\n } catch {\n return;\n }\n } catch (error) {\n toast({\n title: 'Setup could not be saved',\n body: error instanceof Error ? error.message : 'Unable to save GitHub sync setup.',\n tone: 'error'\n });\n } finally {\n setSubmittingSetup(false);\n }\n }\n\n async function handleRunSyncNow() {\n setRunningSync(true);\n setManualSyncRequestError(null);\n\n try {\n if (!syncUnlocked) {\n throw new Error(syncSetupMessage);\n }\n\n const trustedPaperclipApiBaseUrl = await syncTrustedPaperclipApiBaseUrl(pluginIdFromLocation);\n const result = await runSyncNow({\n ...(hostContext.companyId ? { companyId: hostContext.companyId } : {}),\n ...(trustedPaperclipApiBaseUrl ? { paperclipApiBaseUrl: trustedPaperclipApiBaseUrl } : {})\n }) as GitHubSyncSettings;\n\n setForm((current) => ({\n ...current,\n syncState: result.syncState\n }));\n setManualSyncRequestError(null);\n\n toast({\n title: getSyncToastTitle(result.syncState),\n body: getSyncToastBody(result.syncState),\n tone: getSyncToastTone(result.syncState)\n });\n armSyncCompletionToast(result.syncState);\n\n try {\n await settings.refresh();\n } catch {\n return;\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unable to run sync.';\n setManualSyncRequestError(message);\n toast({\n title: 'Unable to run GitHub sync',\n body: message,\n tone: 'error'\n });\n\n try {\n await settings.refresh();\n } catch {\n return;\n }\n } finally {\n setRunningSync(false);\n }\n }\n\n return (\n <div className=\"ghsync\" style={themeVars}>\n <style>{PAGE_STYLES}</style>\n\n <section className=\"ghsync__header\">\n <div className=\"ghsync__header-copy\">\n <h2>GitHub Sync settings</h2>\n {headerDescription ? <p>{headerDescription}</p> : null}\n {settingsMutationsLockReason ? <p className=\"ghsync__hint\">{settingsMutationsLockReason}</p> : null}\n </div>\n <div className=\"ghsync__section-head-actions\">\n <span className={`ghsync__scope-pill ${hasCompanyContext ? 'ghsync__scope-pill--company' : 'ghsync__scope-pill--mixed'}`}>\n {hasCompanyContext ? currentCompanyName : 'No company'}\n </span>\n <span className=\"ghsync__scope-pill ghsync__scope-pill--global\">Shared</span>\n <span className={`ghsync__badge ${getToneClass(tokenTone)}`}>\n <span className=\"ghsync__badge-dot\" aria-hidden=\"true\" />\n {tokenBannerLabel}\n </span>\n </div>\n </section>\n\n <div className=\"ghsync__layout\">\n <section className=\"ghsync__card\">\n <div className=\"ghsync__card-header\">\n <h3>Settings</h3>\n <p>{hasCompanyContext ? currentCompanyName : 'Read-only.'}</p>\n </div>\n\n {showInitialLoadingState ? <p className=\"ghsync__loading\">Loading saved settings\u2026</p> : null}\n\n <section className=\"ghsync__section\">\n <div className=\"ghsync__section-head\">\n <div className=\"ghsync__section-copy\">\n <div className=\"ghsync__section-title-row\">\n <h4>GitHub access</h4>\n <div className=\"ghsync__section-tags\">\n <span className=\"ghsync__scope-pill ghsync__scope-pill--global\">Shared</span>\n </div>\n </div>\n <p>{tokenDescription}</p>\n </div>\n <span className={`ghsync__badge ${getToneClass(tokenTone)}`}>\n {tokenBadgeLabel}\n </span>\n </div>\n\n {!hasCompanyContext ? (\n <div className=\"ghsync__locked\">\n <div>\n <strong>{hasSavedToken ? 'Shared token ready' : 'Company required'}</strong>\n <span>\n {hasSavedToken\n ? 'Open a company to replace it.'\n : 'Open a company to save it.'}\n </span>\n </div>\n <span className=\"ghsync__badge ghsync__badge--neutral\">Read only</span>\n </div>\n ) : showTokenForm ? (\n <form className=\"ghsync__stack\" onSubmit={handleSaveToken}>\n <div className=\"ghsync__field\">\n <label htmlFor=\"github-token\">GitHub token</label>\n <input\n id=\"github-token\"\n className=\"ghsync__input\"\n type=\"password\"\n value={tokenDraft}\n disabled={settingsMutationsLocked}\n onChange={(event) => {\n setTokenDraft(event.currentTarget.value);\n setTokenStatusOverride(hasSavedToken ? 'valid' : null);\n }}\n placeholder=\"ghp_...\"\n autoComplete=\"new-password\"\n />\n </div>\n\n <div className=\"ghsync__actions\">\n <div className=\"ghsync__button-row\">\n {hasSavedToken ? (\n <button\n type=\"button\"\n className={getPluginActionClassName({ variant: 'secondary' })}\n disabled={settingsMutationsLocked}\n onClick={() => {\n setShowTokenEditor(false);\n setTokenDraft('');\n setTokenStatusOverride('valid');\n }}\n >\n Cancel\n </button>\n ) : null}\n <button\n type=\"submit\"\n className={getPluginActionClassName({ variant: 'primary' })}\n disabled={!canSaveToken}\n >\n {submittingToken ? 'Saving\u2026' : 'Save token'}\n </button>\n </div>\n </div>\n </form>\n ) : (\n <div className=\"ghsync__connected\">\n <div>\n <strong>{validatedLogin ? `Authenticated as ${validatedLogin}` : 'Shared token ready'}</strong>\n <span>Shared across all companies.</span>\n </div>\n <button\n type=\"button\"\n className={getPluginActionClassName({ variant: 'secondary' })}\n disabled={settingsMutationsLocked}\n onClick={() => {\n setShowTokenEditor(true);\n setTokenDraft('');\n setTokenStatusOverride('valid');\n }}\n >\n Replace token\n </button>\n </div>\n )}\n </section>\n\n <section className=\"ghsync__section\">\n <div className=\"ghsync__section-head\">\n <div className=\"ghsync__section-copy\">\n <div className=\"ghsync__section-title-row\">\n <h4>Paperclip board access</h4>\n <div className=\"ghsync__section-tags\">\n <span className=\"ghsync__scope-pill ghsync__scope-pill--company\">Company</span>\n </div>\n </div>\n {boardAccessSectionDescription ? <p>{boardAccessSectionDescription}</p> : null}\n </div>\n <span className={`ghsync__badge ${getToneClass(boardAccessTone)}`}>\n {boardAccessBannerLabel}\n </span>\n </div>\n\n {hostContext.companyId ? (\n <div className=\"ghsync__connected\">\n <div>\n <strong>\n {boardAccessConfigured\n ? boardAccessIdentity\n ? `Connected as ${boardAccessIdentity}`\n : 'Connected'\n : boardAccessRequired\n ? 'Required'\n : boardAccessRequirement.status === 'loading'\n ? 'Checking requirement'\n : 'Optional'}\n </strong>\n <span>\n {boardAccessConfigured\n ? 'Used for Paperclip API calls.'\n : boardAccessRequired\n ? 'Required in authenticated deployments.'\n : boardAccessRequirement.status === 'loading'\n ? 'Checking whether it is required.'\n : 'Only needed when Paperclip API calls require sign-in.'}\n </span>\n </div>\n <button\n type=\"button\"\n className={getPluginActionClassName({ variant: boardAccessConfigured ? 'secondary' : 'primary' })}\n disabled={!canConnectBoardAccess}\n onClick={() => {\n void handleConnectBoardAccess();\n }}\n >\n {connectingBoardAccess\n ? 'Waiting for approval\u2026'\n : boardAccessConfigured\n ? 'Reconnect'\n : 'Connect board access'}\n </button>\n </div>\n ) : (\n <div className=\"ghsync__locked\">\n <div>\n <strong>Company required</strong>\n <span>Open a company to connect it.</span>\n </div>\n <span className=\"ghsync__badge ghsync__badge--neutral\">Unavailable</span>\n </div>\n )}\n </section>\n\n <section className=\"ghsync__section\">\n <div className=\"ghsync__section-head\">\n <div className=\"ghsync__section-copy\">\n <div className=\"ghsync__section-title-row\">\n <h4>Repositories</h4>\n <div className=\"ghsync__section-tags\">\n <span className=\"ghsync__scope-pill ghsync__scope-pill--company\">Company</span>\n </div>\n </div>\n {repositoriesSectionDescription ? <p>{repositoriesSectionDescription}</p> : null}\n </div>\n <span className={`ghsync__badge ${getToneClass(!repositoriesUnlocked ? 'neutral' : savedMappingCount > 0 ? 'success' : 'info')}`}>\n {!repositoriesUnlocked\n ? 'Locked'\n : savedMappingCount > 0\n ? hasCompanyContext\n ? `${savedMappingCount} saved`\n : `${savedMappingCount} total`\n : 'Open'}\n </span>\n </div>\n\n {!hasCompanyContext ? (\n <div className=\"ghsync__locked\">\n <div>\n <strong>Company required</strong>\n <span>Open a company to edit repositories.</span>\n </div>\n <span className=\"ghsync__badge ghsync__badge--neutral\">Scoped</span>\n </div>\n ) : !repositoriesUnlocked ? (\n <div className=\"ghsync__locked\">\n <div>\n <strong>Repositories are locked</strong>\n <span>Add a valid token first.</span>\n </div>\n <span className=\"ghsync__badge ghsync__badge--neutral\">Locked</span>\n </div>\n ) : (\n <div className=\"ghsync__stack\">\n {settingsMutationsLockReason ? <p className=\"ghsync__hint\">{settingsMutationsLockReason}</p> : null}\n {existingProjectCandidatesLoading ? (\n <p className=\"ghsync__hint\">Checking this company for GitHub-linked projects that can be enabled for sync\u2026</p>\n ) : null}\n {existingProjectCandidatesError ? (\n <p className=\"ghsync__hint ghsync__hint--error\">{existingProjectCandidatesError}</p>\n ) : null}\n {availableExistingProjectCandidates.length > 0 ? (\n <div className=\"ghsync__existing-projects\">\n <div className=\"ghsync__mapping-title\">\n <strong>Existing GitHub-linked projects</strong>\n <span>Enable sync for projects that are already bound to a GitHub repository in {currentCompanyName}.</span>\n </div>\n {availableExistingProjectCandidates.map((candidate) => (\n <section key={`${candidate.projectId}:${candidate.repositoryUrl}`} className=\"ghsync__mapping-card ghsync__existing-project-card\">\n <div className=\"ghsync__existing-project-meta\">\n <strong>{candidate.projectName}</strong>\n <span>{candidate.repositoryUrl}</span>\n <div className=\"ghsync__existing-project-tags\">\n <span className=\"ghsync__scope-pill ghsync__scope-pill--company\">Existing project</span>\n <span className=\"ghsync__scope-pill ghsync__scope-pill--global\">GitHub workspace</span>\n </div>\n </div>\n <div className=\"ghsync__button-row\">\n <button\n type=\"button\"\n className={getPluginActionClassName({ variant: 'secondary' })}\n disabled={settingsMutationsLocked}\n onClick={() => addExistingProjectCandidate(candidate)}\n >\n Enable sync\n </button>\n </div>\n </section>\n ))}\n </div>\n ) : null}\n <div className=\"ghsync__mapping-list\">\n {mappings.map((mapping, index) => {\n const canRemove = mappings.length > 1 || mapping.repositoryUrl.trim() !== '' || mapping.paperclipProjectName.trim() !== '';\n\n return (\n <section key={mapping.id} className=\"ghsync__mapping-card\">\n <div className=\"ghsync__mapping-head\">\n <div className=\"ghsync__mapping-title\">\n <strong>Repository {index + 1}</strong>\n {mapping.paperclipProjectId ? (\n <span>This mapping will sync into an existing Paperclip project.</span>\n ) : null}\n </div>\n {canRemove ? (\n <button\n type=\"button\"\n className={getPluginActionClassName({ variant: 'danger' })}\n disabled={settingsMutationsLocked}\n onClick={() => removeMapping(mapping.id)}\n >\n Remove\n </button>\n ) : null}\n </div>\n\n <div className=\"ghsync__mapping-grid\">\n <div className=\"ghsync__field\">\n <label htmlFor={`repository-url-${mapping.id}`}>GitHub repository</label>\n <input\n id={`repository-url-${mapping.id}`}\n className=\"ghsync__input\"\n type=\"text\"\n value={mapping.repositoryUrl}\n disabled={settingsMutationsLocked}\n onChange={(event) => updateMapping(mapping.id, 'repositoryUrl', event.currentTarget.value)}\n placeholder=\"owner/repository or https://github.com/owner/repository\"\n autoComplete=\"off\"\n />\n </div>\n\n <div className=\"ghsync__field\">\n <label htmlFor={`project-name-${mapping.id}`}>Paperclip project</label>\n <input\n id={`project-name-${mapping.id}`}\n className=\"ghsync__input\"\n type=\"text\"\n value={mapping.paperclipProjectName}\n disabled={settingsMutationsLocked}\n onChange={(event) => updateMapping(mapping.id, 'paperclipProjectName', event.currentTarget.value)}\n autoComplete=\"off\"\n readOnly={Boolean(mapping.paperclipProjectId)}\n />\n </div>\n </div>\n </section>\n );\n })}\n </div>\n\n <div className=\"ghsync__section-footer\">\n <div className=\"ghsync__button-row\">\n <button\n type=\"button\"\n className={getPluginActionClassName({ variant: 'secondary' })}\n disabled={settingsMutationsLocked}\n onClick={addMapping}\n >\n Add another repository\n </button>\n </div>\n </div>\n </div>\n )}\n </section>\n\n <section className=\"ghsync__section\">\n <div className=\"ghsync__section-head\">\n <div className=\"ghsync__section-copy\">\n <div className=\"ghsync__section-title-row\">\n <h4>Advanced settings</h4>\n <div className=\"ghsync__section-tags\">\n <span className=\"ghsync__scope-pill ghsync__scope-pill--company\">Company</span>\n </div>\n </div>\n {hasCompanyContext ? <p className=\"ghsync__summary-line\">{advancedSettingsSummary}</p> : null}\n </div>\n <div className=\"ghsync__section-head-actions\">\n <span className={`ghsync__badge ${getToneClass(hasCompanyContext ? 'info' : 'neutral')}`}>\n {hasCompanyContext ? 'Ready' : 'Scoped'}\n </span>\n {hasCompanyContext ? (\n <button\n type=\"button\"\n className={getPluginActionClassName({ variant: 'secondary', size: 'sm' })}\n onClick={() => setShowAdvancedSettings((current) => !current)}\n >\n {showAdvancedSettings ? 'Collapse' : 'Expand'}\n </button>\n ) : null}\n </div>\n </div>\n\n {!hasCompanyContext ? (\n <div className=\"ghsync__locked\">\n <div>\n <strong>Company required</strong>\n <span>Open inside a company.</span>\n </div>\n <span className=\"ghsync__badge ghsync__badge--neutral\">Scoped</span>\n </div>\n ) : showAdvancedSettings ? (\n <div className=\"ghsync__advanced-card\">\n {settingsMutationsLockReason ? <p className=\"ghsync__hint\">{settingsMutationsLockReason}</p> : null}\n <div className=\"ghsync__mapping-grid\">\n <div className=\"ghsync__field\">\n <label htmlFor=\"advanced-default-assignee\">Default assignee</label>\n <SettingsAssigneePicker\n id=\"advanced-default-assignee\"\n value={form.advancedSettings.defaultAssigneeAgentId ?? ''}\n options={assigneeSelectOptions}\n disabled={settingsMutationsLocked}\n onChange={(nextValue) => {\n setForm((current) => ({\n ...current,\n advancedSettings: {\n ...current.advancedSettings,\n ...(nextValue ? { defaultAssigneeAgentId: nextValue } : { defaultAssigneeAgentId: undefined })\n }\n }));\n }}\n />\n </div>\n\n <div className=\"ghsync__field\">\n <label htmlFor=\"advanced-default-status\">Default status</label>\n <SettingsStatusPicker\n id=\"advanced-default-status\"\n value={form.advancedSettings.defaultStatus}\n options={statusSelectOptions}\n disabled={settingsMutationsLocked}\n onChange={(nextValue) => {\n setForm((current) => ({\n ...current,\n advancedSettings: {\n ...current.advancedSettings,\n defaultStatus: normalizePaperclipIssueStatus(nextValue)\n }\n }));\n }}\n />\n </div>\n </div>\n\n <div className=\"ghsync__field\">\n <label htmlFor=\"advanced-ignored-authors\">Ignore issues from GitHub usernames</label>\n <textarea\n id=\"advanced-ignored-authors\"\n className=\"ghsync__input ghsync__textarea\"\n value={ignoredAuthorsDraft}\n disabled={settingsMutationsLocked}\n onChange={(event) => {\n const nextDraft = event.currentTarget.value;\n const ignoredIssueAuthorUsernames = normalizeIgnoredIssueAuthorUsernames(nextDraft);\n setIgnoredAuthorsDraft(nextDraft);\n setForm((current) => ({\n ...current,\n advancedSettings: {\n ...current.advancedSettings,\n ignoredIssueAuthorUsernames\n }\n }));\n }}\n placeholder=\"renovate\"\n />\n <p className=\"ghsync__hint\">Comma or newline separated.</p>\n </div>\n </div>\n ) : null}\n </section>\n\n <section className=\"ghsync__section\">\n <div className=\"ghsync__section-head\">\n <div className=\"ghsync__section-copy\">\n <div className=\"ghsync__section-title-row\">\n <h4>Sync</h4>\n <div className=\"ghsync__section-tags\">\n <span className={manualSyncScopePillClass}>{manualSyncScopePillLabel}</span>\n <span className=\"ghsync__scope-pill ghsync__scope-pill--global\">Shared cadence</span>\n </div>\n </div>\n {syncSectionDescription ? <p>{syncSectionDescription}</p> : null}\n </div>\n <span className={`ghsync__badge ${getToneClass(syncStatus.tone)}`}>{syncStatus.label}</span>\n </div>\n\n {!repositoriesUnlocked ? (\n <div className=\"ghsync__locked\">\n <div>\n <strong>Sync is locked</strong>\n <span>Add a valid token first.</span>\n </div>\n <span className=\"ghsync__badge ghsync__badge--neutral\">Locked</span>\n </div>\n ) : (\n <form className=\"ghsync__stack\" onSubmit={handleSaveSetup}>\n <div className=\"ghsync__schedule-card\">\n <div className=\"ghsync__field\">\n <label htmlFor=\"sync-frequency-minutes\">Automatic sync cadence</label>\n <input\n id=\"sync-frequency-minutes\"\n className=\"ghsync__input\"\n type=\"number\"\n inputMode=\"numeric\"\n min={1}\n step={1}\n value={scheduleFrequencyDraft}\n disabled={settingsMutationsLocked || !hasCompanyContext}\n onChange={(event) => {\n setScheduleFrequencyDraft(event.currentTarget.value);\n }}\n placeholder=\"15\"\n />\n <p className={`ghsync__hint${scheduleFrequencyError ? ' ghsync__hint--error' : ''}`}>\n {scheduleFrequencyError ?? 'Minutes.'}\n </p>\n </div>\n\n <div className=\"ghsync__schedule-meta\">\n <span className=\"ghsync__scope-pill ghsync__scope-pill--global\">Shared</span>\n <strong>Auto-sync {scheduleDescription}</strong>\n <span>All companies.</span>\n </div>\n </div>\n\n {!syncUnlocked ? (\n <div className=\"ghsync__locked\">\n <div>\n <strong>{syncSetupIssue === 'missing_board_access' ? 'Paperclip board access is required' : 'Manual sync is locked'}</strong>\n <span>{syncSetupMessage}</span>\n </div>\n <span className=\"ghsync__badge ghsync__badge--neutral\">Locked</span>\n </div>\n ) : (\n <>\n <div className=\"ghsync__stats\">\n {syncMetricCards.map((metric) => (\n <div\n key={metric.key}\n className={`ghsync__stat${metric.emphasized ? ' ghsync__stat--emphasized' : ''}`}\n >\n <strong>{metric.value}</strong>\n <span>{metric.label}</span>\n <p>{metric.description}</p>\n </div>\n ))}\n </div>\n\n <SyncProgressPanel syncState={displaySyncState} />\n\n <div className={syncSummaryClass}>\n <div>\n <span className={manualSyncScopePillClass}>{manualSyncScopePillLabel}</span>\n <strong>{syncSummaryPrimaryText}</strong>\n <span>{syncSummarySecondaryText}</span>\n </div>\n <button\n type=\"button\"\n className={getPluginActionClassName({ variant: 'primary' })}\n onClick={handleRunSyncNow}\n disabled={syncInFlight || showInitialLoadingState}\n >\n {syncInFlight ? 'Running\u2026' : manualSyncButtonLabel}\n </button>\n </div>\n </>\n )}\n\n <SyncDiagnosticsPanel\n syncState={displaySyncState}\n requestError={manualSyncRequestError}\n />\n\n <div className=\"ghsync__section-footer\">\n <div className=\"ghsync__button-row\">\n <button\n type=\"submit\"\n className={getPluginActionClassName({ variant: 'primary' })}\n disabled={!canSaveSetup}\n >\n {submittingSetup ? 'Saving\u2026' : 'Save settings'}\n </button>\n </div>\n </div>\n </form>\n )}\n </section>\n </section>\n\n <aside className=\"ghsync__card\">\n <div className=\"ghsync__card-header\">\n <h3>Summary</h3>\n <p>\n {hasCompanyContext\n ? currentCompanyName\n : 'No company selected.'}\n </p>\n </div>\n\n <div className=\"ghsync__side-body\">\n <div className=\"ghsync__check\">\n <div className=\"ghsync__check-top\">\n <strong>GitHub token</strong>\n <span className={`ghsync__badge ${getToneClass(tokenTone)}`}>\n {tokenBadgeLabel}\n </span>\n </div>\n <span>\n {tokenStatus === 'valid'\n ? (validatedLogin ? `Signed in as ${validatedLogin}.` : 'Ready.')\n : tokenStatus === 'invalid'\n ? 'Needs attention.'\n : 'Required.'}\n </span>\n </div>\n\n <div className=\"ghsync__check\">\n <div className=\"ghsync__check-top\">\n <strong>Repositories</strong>\n <span className={`ghsync__badge ${getToneClass(!repositoriesUnlocked ? 'neutral' : savedMappingCount > 0 ? 'success' : 'info')}`}>\n {!repositoriesUnlocked ? 'Locked' : savedMappingCount > 0 ? 'Ready' : 'Open'}\n </span>\n </div>\n <span>\n {!repositoriesUnlocked\n ? 'Requires a token.'\n : savedMappingCount > 0\n ? hasCompanyContext\n ? `${savedMappingCount} saved.`\n : `${savedMappingCount} saved.`\n : hasCompanyContext\n ? 'Add a repository.'\n : 'Select a company.'}\n </span>\n </div>\n\n <div className=\"ghsync__check\">\n <div className=\"ghsync__check-top\">\n <strong>Paperclip board access</strong>\n <span className={`ghsync__badge ${getToneClass(boardAccessStatusTone)}`}>\n {boardAccessStatusLabel}\n </span>\n </div>\n <span>{boardAccessSummaryText}</span>\n </div>\n\n <div className=\"ghsync__check\">\n <div className=\"ghsync__check-top\">\n <strong>Sync</strong>\n <span className={`ghsync__badge ${getToneClass(syncStatus.tone)}`}>{syncStatus.label}</span>\n </div>\n <span>\n {syncUnlocked\n ? hasCompanyContext\n ? `Manual here. Auto-sync ${scheduleDescription}.`\n : `Auto-sync ${scheduleDescription}.`\n : syncSetupMessage}\n </span>\n </div>\n\n <div className=\"ghsync__detail-list\">\n <div className=\"ghsync__detail\">\n <span className=\"ghsync__detail-label\">Last saved</span>\n <strong className=\"ghsync__detail-value\">{lastUpdated}</strong>\n </div>\n <div className=\"ghsync__detail\">\n <span className=\"ghsync__detail-label\">Auto-sync</span>\n <strong className=\"ghsync__detail-value\">{scheduleDescription}</strong>\n </div>\n <div className=\"ghsync__detail\">\n <span className=\"ghsync__detail-label\">Last sync</span>\n <strong className=\"ghsync__detail-value\">{lastSync}</strong>\n </div>\n </div>\n </div>\n </aside>\n </div>\n </div>\n );\n}\n\nexport function GitHubSyncDashboardWidget(): React.JSX.Element {\n const hostContext = useHostContext();\n const toast = usePluginToast();\n const pluginIdFromLocation = getPluginIdFromLocation();\n const settings = usePluginData<GitHubSyncSettings>(\n 'settings.registration',\n hostContext.companyId ? { companyId: hostContext.companyId } : {}\n );\n const runSyncNow = usePluginAction('sync.runNow');\n const [runningSync, setRunningSync] = useState(false);\n const [manualSyncRequestError, setManualSyncRequestError] = useState<string | null>(null);\n const [settingsHref, setSettingsHref] = useState(SETTINGS_INDEX_HREF);\n const [cachedSettings, setCachedSettings] = useState<GitHubSyncSettings | null>(null);\n const themeMode = useResolvedThemeMode();\n const boardAccessRequirement = usePaperclipBoardAccessRequirement();\n\n const theme = themeMode === 'light' ? LIGHT_PALETTE : DARK_PALETTE;\n const themeVars = buildThemeVars(theme, themeMode);\n const current = settings.data ?? cachedSettings ?? EMPTY_SETTINGS;\n const showInitialLoadingState = settings.loading && !settings.data && !cachedSettings;\n const syncState = current.syncState ?? EMPTY_SETTINGS.syncState;\n const tokenValid = Boolean(current.githubTokenConfigured);\n const hasCompanyContext = Boolean(hostContext.companyId);\n const boardAccessConfigured = Boolean(current.paperclipBoardAccessConfigured);\n const boardAccessRequired = boardAccessRequirement.required;\n const boardAccessReady = !boardAccessRequired || (hasCompanyContext && boardAccessConfigured);\n const savedMappingCount = getComparableMappings(current.mappings ?? []).length;\n const syncSetupIssue = getSyncSetupIssue({\n tokenStatus: tokenValid ? 'valid' : 'required',\n savedMappingCount,\n boardAccessRequired,\n boardAccessConfigured,\n hasCompanyContext\n });\n const syncSetupMessage = getSyncSetupMessage(syncSetupIssue, hasCompanyContext);\n const displaySyncState = getDisplaySyncState(syncState, {\n hasToken: tokenValid,\n hasMappings: savedMappingCount > 0,\n hasBoardAccess: boardAccessReady\n });\n const syncUnlocked = syncSetupIssue === null;\n const syncInFlight = runningSync || displaySyncState.status === 'running';\n const scheduleFrequencyMinutes = normalizeScheduleFrequencyMinutes(current.scheduleFrequencyMinutes);\n const scheduleDescription = formatScheduleFrequency(scheduleFrequencyMinutes);\n const summary = getDashboardSummary({\n syncIssue: syncSetupIssue,\n hasCompanyContext,\n syncState: displaySyncState,\n runningSync,\n scheduleFrequencyMinutes\n });\n const syncProgress = getRunningSyncProgressModel(displaySyncState);\n const syncMetricCards = getSyncMetricCards({\n totalSyncedIssuesCount: current.totalSyncedIssuesCount,\n erroredIssuesCount: displaySyncState.erroredIssuesCount,\n syncState: displaySyncState,\n savedMappingCount\n });\n const lastSync = formatDate(displaySyncState.checkedAt, 'Never');\n const armSyncCompletionToast = useSyncCompletionToast(displaySyncState, toast);\n\n useEffect(() => {\n if (settings.data) {\n setCachedSettings(settings.data);\n }\n }, [settings.data]);\n\n useEffect(() => {\n let cancelled = false;\n\n async function loadSettingsHref(): Promise<void> {\n try {\n const plugins = await fetchJson<unknown>('/api/plugins');\n if (!cancelled) {\n setSettingsHref(resolvePluginSettingsHref(plugins));\n }\n } catch {\n if (!cancelled) {\n setSettingsHref(SETTINGS_INDEX_HREF);\n }\n }\n }\n\n void loadSettingsHref();\n\n return () => {\n cancelled = true;\n };\n }, []);\n\n useEffect(() => {\n if (displaySyncState.status !== 'running') {\n return;\n }\n\n const refreshSettings = () => {\n try {\n settings.refresh();\n } catch {\n return;\n }\n };\n\n const intervalId = globalThis.setInterval(() => {\n refreshSettings();\n }, SYNC_POLL_INTERVAL_MS);\n\n refreshSettings();\n\n return () => {\n globalThis.clearInterval(intervalId);\n };\n }, [displaySyncState.status, settings.refresh]);\n\n async function handleRunSync(): Promise<void> {\n setRunningSync(true);\n setManualSyncRequestError(null);\n\n try {\n if (!syncUnlocked) {\n throw new Error(syncSetupMessage);\n }\n\n const trustedPaperclipApiBaseUrl = await syncTrustedPaperclipApiBaseUrl(pluginIdFromLocation);\n const result = await runSyncNow({\n ...(hostContext.companyId ? { companyId: hostContext.companyId } : {}),\n ...(trustedPaperclipApiBaseUrl ? { paperclipApiBaseUrl: trustedPaperclipApiBaseUrl } : {})\n }) as GitHubSyncSettings;\n const nextSyncState = result.syncState ?? EMPTY_SETTINGS.syncState;\n setManualSyncRequestError(null);\n\n toast({\n title: getSyncToastTitle(nextSyncState),\n body: getSyncToastBody(nextSyncState),\n tone: getSyncToastTone(nextSyncState)\n });\n armSyncCompletionToast(nextSyncState);\n\n await settings.refresh();\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unable to run GitHub sync.';\n setManualSyncRequestError(message);\n toast({\n title: 'Unable to run GitHub sync',\n body: message,\n tone: 'error'\n });\n\n try {\n await settings.refresh();\n } catch {\n return;\n }\n } finally {\n setRunningSync(false);\n }\n }\n\n return (\n <section className=\"ghsync-widget\" style={themeVars}>\n <style>{WIDGET_STYLES}</style>\n\n <div className=\"ghsync-widget__card\">\n <div className=\"ghsync-widget__top\">\n <div>\n <div className=\"ghsync-widget__eyebrow\">GitHub Sync</div>\n <h3>{summary.title}</h3>\n <p>{summary.body}</p>\n <div className=\"ghsync-widget__meta\">\n <span>{savedMappingCount} {savedMappingCount === 1 ? 'repository' : 'repositories'}</span>\n <span className=\"ghsync-widget__meta-dot\" aria-hidden=\"true\" />\n <span>Auto-sync {scheduleDescription}</span>\n <span className=\"ghsync-widget__meta-dot\" aria-hidden=\"true\" />\n <span>Last sync {lastSync}</span>\n </div>\n </div>\n <span className={`ghsync__badge ${getToneClass(summary.tone)}`}>\n <span className=\"ghsync__badge-dot\" aria-hidden=\"true\" />\n {summary.label}\n </span>\n </div>\n\n {settings.error ? <div className=\"ghsync-widget__message\">{settings.error.message}</div> : null}\n\n <div className=\"ghsync-widget__stats\">\n {syncMetricCards.map((metric) => (\n <div\n key={metric.key}\n className={`ghsync-widget__stat${metric.emphasized ? ' ghsync-widget__stat--emphasized' : ''}`}\n >\n <strong>{metric.value}</strong>\n <span>{metric.label}</span>\n <p>{metric.description}</p>\n </div>\n ))}\n </div>\n\n <SyncProgressPanel\n syncState={displaySyncState}\n compact\n />\n\n <div className=\"ghsync-widget__summary\">\n <strong>\n {showInitialLoadingState\n ? 'Loading sync status\u2026'\n : syncInFlight\n ? 'Live run'\n : syncUnlocked\n ? 'Latest result'\n : 'Next step'}\n </strong>\n <span>\n {showInitialLoadingState\n ? 'Fetching the latest GitHub sync state from the worker.'\n : syncProgress\n ? [\n syncProgress.issueProgressLabel,\n syncProgress.currentIssueLabel ?? syncProgress.repositoryPosition\n ].filter((value): value is string => Boolean(value))\n .join(' \u00B7 ')\n : syncSetupIssue === 'missing_token'\n ? 'Open settings to validate GitHub access.'\n : syncSetupIssue === 'missing_mapping'\n ? 'Open settings and add a repository. The Paperclip project will be created if it does not exist.'\n : syncSetupIssue === 'missing_board_access'\n ? hasCompanyContext\n ? 'Open settings and connect Paperclip board access before running sync.'\n : 'Open plugin settings inside a company to connect required Paperclip board access.'\n : displaySyncState.checkedAt\n ? `Last checked ${lastSync}.`\n : 'Everything is configured. Run the first sync when you are ready.'}\n </span>\n </div>\n\n <SyncDiagnosticsPanel\n syncState={displaySyncState}\n requestError={manualSyncRequestError}\n compact\n />\n\n <div className=\"ghsync-widget__actions\">\n <div className=\"ghsync-widget__button-row\">\n <a\n href={settingsHref}\n className={getPluginActionClassName({\n variant: syncUnlocked ? 'secondary' : 'primary',\n extraClassName: 'ghsync-widget__link'\n })}\n >\n Open settings\n </a>\n {syncUnlocked ? (\n <button\n type=\"button\"\n className={getPluginActionClassName({ variant: 'primary' })}\n onClick={handleRunSync}\n disabled={syncInFlight || showInitialLoadingState}\n >\n {syncInFlight ? 'Running\u2026' : 'Run sync now'}\n </button>\n ) : null}\n </div>\n </div>\n </div>\n </section>\n );\n}\n\nfunction GitHubMarkIcon(props: {\n className?: string;\n}): React.JSX.Element {\n return (\n <svg\n viewBox=\"0 0 16 16\"\n aria-hidden=\"true\"\n focusable=\"false\"\n className={props.className}\n >\n <path\n fill=\"currentColor\"\n d={GITHUB_MARK_PATH_D}\n />\n </svg>\n );\n}\n\nfunction GitHubSyncToolbarButtonSurface(props: {\n entityType?: 'project' | 'issue';\n entityId?: string | null;\n companyId?: string | null;\n projectId?: string | null;\n}): React.JSX.Element | null {\n const toast = usePluginToast();\n const runSyncNow = usePluginAction('sync.runNow');\n const pluginIdFromLocation = getPluginIdFromLocation();\n const surfaceRef = useRef<HTMLDivElement | null>(null);\n const resolvedIssue = useResolvedIssueId({\n companyId: props.companyId,\n projectId: props.projectId,\n entityId: props.entityId,\n entityType: props.entityType\n });\n const effectiveEntityId =\n props.entityType === 'issue'\n ? resolvedIssue.issueId ?? '__ghsync_unresolved_issue__'\n : props.entityId;\n const toolbarState = usePluginData<SyncToolbarStateData>('sync.toolbarState', {\n ...(props.companyId ? { companyId: props.companyId } : {}),\n ...(effectiveEntityId ? { entityId: effectiveEntityId } : {}),\n ...(props.entityType ? { entityType: props.entityType } : {})\n });\n const settingsRegistration = usePluginData<GitHubSyncSettings>(\n 'settings.registration',\n props.companyId ? { companyId: props.companyId } : {}\n );\n const [runningSync, setRunningSync] = useState(false);\n const themeMode = useResolvedThemeMode();\n const boardAccessRequirement = usePaperclipBoardAccessRequirement();\n const theme = themeMode === 'light' ? LIGHT_PALETTE : DARK_PALETTE;\n const themeVars = buildThemeVars(theme, themeMode);\n const state = toolbarState.data ?? {\n kind: props.entityType ?? 'global',\n visible: !props.entityType,\n canRun: false,\n label: props.entityType === 'issue' ? 'Sync issue' : props.entityType === 'project' ? 'Sync project' : 'Sync GitHub',\n syncState: EMPTY_SETTINGS.syncState,\n githubTokenConfigured: false,\n savedMappingCount: 0\n };\n const hasCompanyContext = Boolean(props.companyId);\n const boardAccessConfigured = Boolean(settingsRegistration.data?.paperclipBoardAccessConfigured);\n const boardAccessSetupIssue: SyncConfigurationIssue | null =\n state.canRun && boardAccessRequirement.required && (!hasCompanyContext || !boardAccessConfigured)\n ? 'missing_board_access'\n : null;\n const effectiveCanRun = state.canRun && !boardAccessSetupIssue;\n const effectiveMessage =\n boardAccessSetupIssue\n ? getSyncSetupMessage(boardAccessSetupIssue, hasCompanyContext)\n : state.message;\n const effectiveLabel = boardAccessSetupIssue ? 'Board access required' : state.label;\n const syncInFlight = runningSync || state.syncState.status === 'running';\n const armSyncCompletionToast = useSyncCompletionToast(state.syncState, toast);\n\n useEffect(() => {\n if (state.syncState.status !== 'running') {\n return;\n }\n\n const intervalId = globalThis.setInterval(() => {\n try {\n toolbarState.refresh();\n } catch {\n return;\n }\n }, SYNC_POLL_INTERVAL_MS);\n\n return () => {\n globalThis.clearInterval(intervalId);\n };\n }, [state.syncState.status, toolbarState.refresh]);\n\n useEffect(() => {\n const refreshToolbarState = () => {\n try {\n toolbarState.refresh();\n } catch {\n // Keep going so the settings registration still gets a refresh attempt.\n }\n\n try {\n settingsRegistration.refresh();\n } catch {\n return;\n }\n };\n\n refreshToolbarState();\n\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return;\n }\n\n const handleSettingsUpdated = () => {\n refreshToolbarState();\n };\n const handleWindowFocus = () => {\n refreshToolbarState();\n };\n const handleVisibilityChange = () => {\n if (document.visibilityState === 'visible') {\n refreshToolbarState();\n }\n };\n\n window.addEventListener(GITHUB_SYNC_SETTINGS_UPDATED_EVENT, handleSettingsUpdated);\n window.addEventListener('focus', handleWindowFocus);\n document.addEventListener('visibilitychange', handleVisibilityChange);\n\n return () => {\n window.removeEventListener(GITHUB_SYNC_SETTINGS_UPDATED_EVENT, handleSettingsUpdated);\n window.removeEventListener('focus', handleWindowFocus);\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n };\n }, [toolbarState.refresh, settingsRegistration.refresh, props.companyId, effectiveEntityId, props.entityType]);\n\n useEffect(() => {\n if (!props.entityType) {\n return;\n }\n\n const hostWrapper = surfaceRef.current?.parentElement;\n if (!hostWrapper) {\n return;\n }\n\n const previousMarginLeft = hostWrapper.style.marginLeft;\n const previousMarginInlineStart = hostWrapper.style.marginInlineStart;\n hostWrapper.style.marginLeft = 'auto';\n hostWrapper.style.marginInlineStart = 'auto';\n\n return () => {\n hostWrapper.style.marginLeft = previousMarginLeft;\n hostWrapper.style.marginInlineStart = previousMarginInlineStart;\n };\n });\n\n if (!state.visible) {\n return null;\n }\n\n async function handleRunSync(): Promise<void> {\n try {\n if (!effectiveCanRun) {\n throw new Error(effectiveMessage ?? 'Unable to run GitHub sync.');\n }\n\n setRunningSync(true);\n const trustedPaperclipApiBaseUrl = await syncTrustedPaperclipApiBaseUrl(pluginIdFromLocation);\n const result = await runSyncNow({\n waitForCompletion: false,\n ...(props.companyId ? { companyId: props.companyId } : {}),\n ...(props.entityType === 'project' && props.entityId ? { projectId: props.entityId } : {}),\n ...(props.entityType === 'issue' && resolvedIssue.issueId ? { issueId: resolvedIssue.issueId } : {}),\n ...(trustedPaperclipApiBaseUrl ? { paperclipApiBaseUrl: trustedPaperclipApiBaseUrl } : {})\n }) as {\n syncState?: SyncRunState;\n };\n const nextSyncState = result.syncState ?? EMPTY_SETTINGS.syncState;\n\n toast({\n title: getSyncToastTitle(nextSyncState),\n body: getSyncToastBody(nextSyncState),\n tone: getSyncToastTone(nextSyncState)\n });\n armSyncCompletionToast(nextSyncState);\n toolbarState.refresh();\n } catch (error) {\n toast({\n title: 'Unable to run GitHub sync',\n body: error instanceof Error ? error.message : 'Unable to run GitHub sync.',\n tone: 'error'\n });\n } finally {\n setRunningSync(false);\n }\n }\n\n return (\n <div\n ref={surfaceRef}\n className={`ghsync-toolbar-button${props.entityType ? ' ghsync-toolbar-button--entity' : ''}`}\n style={themeVars}\n title={toolbarState.error?.message ?? effectiveMessage}\n >\n <style>{EXTENSION_SURFACE_STYLES}</style>\n <button\n type=\"button\"\n data-slot=\"button\"\n data-variant=\"outline\"\n data-size=\"sm\"\n className={props.entityType ? HOST_ENTITY_BUTTON_CLASSNAME : HOST_GLOBAL_BUTTON_CLASSNAME}\n disabled={!effectiveCanRun || syncInFlight || toolbarState.loading}\n onClick={handleRunSync}\n >\n <GitHubMarkIcon className=\"mr-1.5 h-3.5 w-3.5\" />\n <span>{syncInFlight ? 'Syncing\u2026' : effectiveLabel}</span>\n </button>\n </div>\n );\n}\n\nexport function GitHubSyncGlobalToolbarButton(): React.JSX.Element | null {\n const context = useHostContext();\n return <GitHubSyncToolbarButtonSurface companyId={context.companyId} />;\n}\n\nexport function GitHubSyncEntityToolbarButton(): React.JSX.Element | null {\n const context = useHostContext();\n\n if ((context.entityType !== 'issue' && context.entityType !== 'project') || !context.entityId) {\n return null;\n }\n\n return (\n <GitHubSyncToolbarButtonSurface\n companyId={context.companyId}\n entityId={context.entityId}\n entityType={context.entityType}\n projectId={context.projectId}\n />\n );\n}\n\nfunction GitHubSyncIssueDetailTabContent(props: {\n companyId?: string | null;\n issueId?: string | null;\n loadingIssueId?: boolean;\n themeVars: React.CSSProperties;\n}): React.JSX.Element {\n const details = usePluginData<GitHubIssueDetailsData | null>('issue.githubDetails', {\n ...(props.companyId ? { companyId: props.companyId } : {}),\n ...(props.issueId ? { issueId: props.issueId } : {})\n });\n const issueDetails = details.data?.paperclipIssueId === props.issueId ? details.data : null;\n\n useEffect(() => {\n if (!props.companyId || !props.issueId) {\n return;\n }\n\n try {\n details.refresh();\n } catch {\n return;\n }\n }, [details.refresh, props.companyId, props.issueId]);\n\n return (\n <section className=\"ghsync-issue-detail\" style={props.themeVars}>\n <style>{EXTENSION_SURFACE_STYLES}</style>\n\n {props.loadingIssueId || (details.loading && !issueDetails) ? <p className=\"ghsync-extension-empty\">Loading GitHub sync details\u2026</p> : null}\n {details.error ? <p className=\"ghsync-extension-empty\">{details.error.message}</p> : null}\n {!props.loadingIssueId && !details.loading && !details.error && !issueDetails ? (\n <p className=\"ghsync-extension-empty\">GitHub Sync has not linked this Paperclip issue to a GitHub issue yet.</p>\n ) : null}\n\n {issueDetails ? (\n <>\n <div className=\"ghsync-extension-heading\">\n <div>\n <h4>Issue #{issueDetails.githubIssueNumber}</h4>\n <p>{formatGitHubRepositoryLabel(issueDetails.repositoryUrl)}</p>\n </div>\n <a\n href={issueDetails.githubIssueUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className={getPluginActionClassName({\n variant: 'secondary',\n size: 'sm',\n extraClassName: 'ghsync-extension-link'\n })}\n >\n Open on GitHub\n </a>\n </div>\n\n <div className=\"ghsync-extension-grid\">\n <div className=\"ghsync-extension-metric\">\n <span>State</span>\n <strong>{formatGitHubIssueState(issueDetails.githubIssueState, issueDetails.githubIssueStateReason)}</strong>\n </div>\n <div className=\"ghsync-extension-metric\">\n <span>Comments</span>\n <strong>{issueDetails.commentsCount ?? 'Unknown'}</strong>\n </div>\n <div className=\"ghsync-extension-metric\">\n <span>Linked PRs</span>\n <strong>{issueDetails.linkedPullRequestNumbers.length}</strong>\n </div>\n <div className=\"ghsync-extension-metric\">\n <span>Last synced</span>\n <strong>{issueDetails.syncedAt ? formatDate(issueDetails.syncedAt, 'Unknown') : 'Pending refresh'}</strong>\n </div>\n </div>\n\n {issueDetails.linkedPullRequestNumbers.length > 0 ? (\n <div className=\"ghsync-issue-detail__section\">\n <div className=\"ghsync-issue-detail__section-heading\">Linked pull requests</div>\n <div className=\"ghsync-extension-links\">\n {issueDetails.linkedPullRequestNumbers.map((pullRequestNumber) => (\n <a\n key={pullRequestNumber}\n href={`${issueDetails.repositoryUrl}/pull/${pullRequestNumber}`}\n target=\"_blank\"\n rel=\"noreferrer\"\n className={getPluginActionClassName({\n variant: 'secondary',\n size: 'sm',\n extraClassName: 'ghsync-extension-link'\n })}\n >\n PR #{pullRequestNumber}\n </a>\n ))}\n </div>\n </div>\n ) : null}\n\n {issueDetails.labels && issueDetails.labels.length > 0 ? (\n <div className=\"ghsync-issue-detail__section\">\n <div className=\"ghsync-issue-detail__section-heading\">Labels</div>\n <div className=\"ghsync-extension-labels\">\n {issueDetails.labels.map((label) => (\n <span\n key={`${label.name}:${label.color ?? 'none'}`}\n className=\"ghsync-extension-pill\"\n style={label.color ? { borderColor: label.color, boxShadow: `inset 0 0 0 1px ${label.color}` } : undefined}\n >\n {label.name}\n </span>\n ))}\n </div>\n </div>\n ) : null}\n\n {issueDetails.source !== 'entity' ? (\n <div className=\"ghsync-extension-note\">\n GitHub Sync recovered this link from older sync metadata. Run sync once to refresh GitHub state, labels, and linked PRs in this panel.\n </div>\n ) : null}\n </>\n ) : null}\n </section>\n );\n}\n\nexport function GitHubSyncIssueDetailTab(): React.JSX.Element {\n const context = useHostContext();\n const themeMode = useResolvedThemeMode();\n const theme = themeMode === 'light' ? LIGHT_PALETTE : DARK_PALETTE;\n const themeVars = buildThemeVars(theme, themeMode);\n const resolvedIssue = useResolvedIssueId({\n companyId: context.companyId,\n projectId: context.projectId,\n entityId: context.entityId,\n entityType: context.entityType\n });\n const detailKey = `${context.companyId ?? 'company-none'}:${resolvedIssue.issueIdentifier ?? context.entityId ?? 'issue-none'}`;\n\n return (\n <GitHubSyncIssueDetailTabContent\n key={detailKey}\n companyId={context.companyId}\n issueId={resolvedIssue.issueId}\n loadingIssueId={resolvedIssue.loading}\n themeVars={themeVars}\n />\n );\n}\n\nexport function GitHubSyncCommentAnnotation(): React.JSX.Element | null {\n const context = useHostContext();\n const themeMode = useResolvedThemeMode();\n const theme = themeMode === 'light' ? LIGHT_PALETTE : DARK_PALETTE;\n const themeVars = buildThemeVars(theme, themeMode);\n const annotation = usePluginData<CommentAnnotationData | null>('comment.annotation', {\n ...(context.companyId ? { companyId: context.companyId } : {}),\n ...(context.entityId ? { commentId: context.entityId } : {}),\n ...(context.parentEntityId ? { parentIssueId: context.parentEntityId } : {})\n });\n\n if (annotation.loading && !annotation.data) {\n return null;\n }\n\n if (annotation.error || !annotation.data || annotation.data.links.length === 0) {\n return null;\n }\n\n return (\n <div className=\"ghsync-extension-card ghsync-extension-card--compact\" style={themeVars}>\n <style>{EXTENSION_SURFACE_STYLES}</style>\n <div className=\"ghsync-comment-annotation\">\n <span className=\"ghsync-comment-annotation__label\">GitHub refs</span>\n {annotation.data.links.map((link) => (\n <a\n key={`${link.type}:${link.href}`}\n href={link.href}\n target=\"_blank\"\n rel=\"noreferrer\"\n className={getPluginActionClassName({\n variant: 'secondary',\n size: 'sm',\n extraClassName: 'ghsync-extension-link'\n })}\n >\n {link.label}\n </a>\n ))}\n </div>\n </div>\n );\n}\n\nexport default GitHubSyncSettingsPage;\n", "export interface ParsedRepositoryReference {\n owner: string;\n repo: string;\n url: string;\n}\n\nexport function parseRepositoryReference(repositoryInput: string): ParsedRepositoryReference | null {\n const trimmed = repositoryInput.trim();\n if (!trimmed) {\n return null;\n }\n\n const slugMatch = trimmed.match(/^([A-Za-z0-9_.-]+)\\/([A-Za-z0-9_.-]+?)(?:\\.git)?$/);\n if (slugMatch) {\n const [, owner, repo] = slugMatch;\n return {\n owner,\n repo,\n url: `https://github.com/${owner}/${repo}`\n };\n }\n\n try {\n const url = new URL(trimmed);\n if (url.hostname !== 'github.com' && url.hostname !== 'www.github.com') {\n return null;\n }\n\n const pathSegments = url.pathname.split('/').filter(Boolean);\n if (pathSegments.length !== 2) {\n return null;\n }\n\n const [owner, rawRepo] = pathSegments;\n const repo = rawRepo.replace(/\\.git$/, '');\n if (!owner || !repo) {\n return null;\n }\n\n return {\n owner,\n repo,\n url: `https://github.com/${owner}/${repo}`\n };\n } catch {\n return null;\n }\n}\n", "export interface PaperclipHealthResponse {\n deploymentMode?: string;\n deploymentExposure?: string;\n authReady?: boolean;\n}\n\nfunction normalizeOptionalString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nexport function normalizePaperclipHealthResponse(value: unknown): PaperclipHealthResponse | null {\n if (!value || typeof value !== 'object') {\n return null;\n }\n\n const record = value as Record<string, unknown>;\n const deploymentMode = normalizeOptionalString(record.deploymentMode);\n const deploymentExposure = normalizeOptionalString(record.deploymentExposure);\n const authReady = typeof record.authReady === 'boolean' ? record.authReady : undefined;\n\n if (!deploymentMode && !deploymentExposure && authReady === undefined) {\n return null;\n }\n\n return {\n ...(deploymentMode ? { deploymentMode } : {}),\n ...(deploymentExposure ? { deploymentExposure } : {}),\n ...(authReady !== undefined ? { authReady } : {})\n };\n}\n\nexport function requiresPaperclipBoardAccess(value: unknown): boolean {\n const health = normalizePaperclipHealthResponse(value);\n return health?.deploymentMode?.toLowerCase() === 'authenticated';\n}\n", "import { normalizePaperclipHealthResponse, type PaperclipHealthResponse } from '../paperclip-health.ts';\n\nconst JSON_CONTENT_TYPE_PATTERN = /\\b(?:application\\/json|[^;\\s]+\\/[^;\\s]+\\+json)\\b/i;\nconst HTML_LIKE_RESPONSE_PATTERN = /^\\s*</;\nconst MAX_RESPONSE_PREVIEW_LENGTH = 160;\n\nfunction resolveBrowserOrigin(): string | null {\n if (typeof window === 'undefined' || typeof window.location?.origin !== 'string') {\n return null;\n }\n\n const origin = window.location.origin.trim();\n return origin ? origin : null;\n}\n\nfunction isAbsoluteUrl(value: string): boolean {\n return /^[a-z][a-z0-9+.-]*:\\/\\//i.test(value);\n}\n\nfunction isJsonContentType(contentType: string | null): boolean {\n if (!contentType) {\n return false;\n }\n\n return JSON_CONTENT_TYPE_PATTERN.test(contentType);\n}\n\nfunction describeResponseContentType(contentType: string | null): string {\n if (!contentType) {\n return 'an unknown content type';\n }\n\n const [normalized] = contentType.split(';', 1);\n return normalized?.trim().toLowerCase() || 'an unknown content type';\n}\n\nfunction summarizeResponseBody(text: string): string | null {\n const normalized = text.replace(/\\s+/g, ' ').trim();\n if (!normalized) {\n return null;\n }\n\n if (normalized.length <= MAX_RESPONSE_PREVIEW_LENGTH) {\n return normalized;\n }\n\n return `${normalized.slice(0, MAX_RESPONSE_PREVIEW_LENGTH - 1)}...`;\n}\n\nfunction describeResponseLocation(url?: string): string {\n if (!url) {\n return 'the requested endpoint';\n }\n\n try {\n const resolved = new URL(url, 'https://paperclip.invalid');\n return `${resolved.pathname}${resolved.search}` || resolved.toString();\n } catch {\n return url;\n }\n}\n\nfunction extractErrorMessage(body: unknown): string | null {\n if (!body || typeof body !== 'object') {\n return null;\n }\n\n const record = body as Record<string, unknown>;\n const candidates = [\n record.message,\n record.error,\n record.detail,\n record.details\n ];\n\n if (record.error && typeof record.error === 'object') {\n const nestedError = record.error as Record<string, unknown>;\n candidates.push(nestedError.message, nestedError.detail);\n }\n\n for (const candidate of candidates) {\n if (typeof candidate === 'string' && candidate.trim()) {\n return candidate.trim();\n }\n }\n\n return null;\n}\n\nexport function buildPaperclipUrl(pathOrUrl: string, origin?: string): string | null {\n const trimmed = typeof pathOrUrl === 'string' ? pathOrUrl.trim() : '';\n if (!trimmed) {\n return null;\n }\n\n if (isAbsoluteUrl(trimmed)) {\n return trimmed;\n }\n\n const resolvedOrigin = origin ?? resolveBrowserOrigin();\n if (!resolvedOrigin) {\n return null;\n }\n\n return new URL(trimmed, resolvedOrigin).toString();\n}\n\nexport function resolveCliAuthPollUrl(pollUrlOrPath?: string, origin?: string): string | null {\n const trimmed = typeof pollUrlOrPath === 'string' ? pollUrlOrPath.trim() : '';\n if (!trimmed) {\n return null;\n }\n\n if (isAbsoluteUrl(trimmed)) {\n return trimmed;\n }\n\n const normalizedPath = trimmed.startsWith('/api/')\n ? trimmed\n : `/api${trimmed.startsWith('/') ? '' : '/'}${trimmed}`;\n\n return buildPaperclipUrl(normalizedPath, origin);\n}\n\nexport async function readPaperclipJsonResponse<T>(response: Response, requestUrl?: string): Promise<T> {\n const responseText = await response.text();\n\n if (!responseText) {\n if (!response.ok) {\n throw new Error(`Paperclip API ${response.status}: ${response.statusText || 'Request failed.'}`);\n }\n\n return null as T;\n }\n\n const contentType = response.headers.get('content-type');\n const responseLocation = describeResponseLocation(response.url || requestUrl);\n const responsePreview = summarizeResponseBody(responseText);\n\n if (!isJsonContentType(contentType)) {\n const htmlHint = responsePreview && HTML_LIKE_RESPONSE_PATTERN.test(responsePreview)\n ? ' This usually means Paperclip served a sign-in page or app shell instead of the API endpoint.'\n : '';\n const previewHint = responsePreview ? ` Response preview: ${responsePreview}` : '';\n\n throw new Error(\n `Paperclip API ${response.status} returned ${describeResponseContentType(contentType)} instead of JSON from ${responseLocation}.${htmlHint}${previewHint}`\n );\n }\n\n let body: unknown = null;\n\n try {\n body = JSON.parse(responseText);\n } catch {\n throw new Error(`Paperclip API ${response.status} returned invalid JSON from ${responseLocation}.`);\n }\n\n if (!response.ok) {\n const message = extractErrorMessage(body) ?? responsePreview ?? response.statusText ?? 'Request failed.';\n throw new Error(`Paperclip API ${response.status}: ${message}`);\n }\n\n return body as T;\n}\n\nexport async function fetchJson<T>(url: string, init?: RequestInit): Promise<T> {\n const headers = new Headers(init?.headers);\n headers.set('accept', 'application/json');\n\n if (typeof init?.body === 'string' && !headers.has('content-type')) {\n headers.set('content-type', 'application/json');\n }\n\n const response = await fetch(url, {\n ...init,\n headers,\n credentials: init?.credentials ?? 'same-origin'\n });\n\n return readPaperclipJsonResponse<T>(response, url);\n}\n\nexport async function fetchPaperclipHealth(origin?: string): Promise<PaperclipHealthResponse | null> {\n const url = buildPaperclipUrl('/api/health', origin);\n if (!url) {\n return null;\n }\n\n try {\n return normalizePaperclipHealthResponse(await fetchJson<unknown>(url));\n } catch {\n return null;\n }\n}\n", "export type PluginConfigBoardTokenRefs = Record<string, string>;\n\nexport interface GitHubSyncPluginConfig extends Record<string, unknown> {\n githubTokenRef?: string;\n paperclipBoardApiTokenRefs?: PluginConfigBoardTokenRefs;\n paperclipApiBaseUrl?: string;\n}\n\nfunction normalizeOptionalString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nfunction normalizePaperclipApiBaseUrl(value: unknown): string | undefined {\n const normalizedValue = normalizeOptionalString(value);\n if (!normalizedValue) {\n return undefined;\n }\n\n try {\n return new URL(normalizedValue).origin;\n } catch {\n return undefined;\n }\n}\n\nexport function normalizePluginConfigBoardTokenRefs(value: unknown): PluginConfigBoardTokenRefs | undefined {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n\n const entries = Object.entries(value as Record<string, unknown>)\n .map(([companyId, secretRef]) => {\n const normalizedCompanyId = normalizeOptionalString(companyId);\n const normalizedSecretRef = normalizeOptionalString(secretRef);\n return normalizedCompanyId && normalizedSecretRef\n ? [normalizedCompanyId, normalizedSecretRef] as const\n : null;\n })\n .filter((entry): entry is readonly [string, string] => Boolean(entry));\n\n if (entries.length === 0) {\n return undefined;\n }\n\n return Object.fromEntries(entries);\n}\n\nexport function normalizePluginConfig(value: unknown): GitHubSyncPluginConfig {\n if (!value || typeof value !== 'object') {\n return {};\n }\n\n const record = { ...(value as Record<string, unknown>) };\n const githubTokenRef = normalizeOptionalString(record.githubTokenRef);\n const paperclipBoardApiTokenRefs = normalizePluginConfigBoardTokenRefs(record.paperclipBoardApiTokenRefs);\n const paperclipApiBaseUrl = normalizePaperclipApiBaseUrl(record.paperclipApiBaseUrl);\n\n if (githubTokenRef) {\n record.githubTokenRef = githubTokenRef;\n } else {\n delete record.githubTokenRef;\n }\n\n if (paperclipBoardApiTokenRefs) {\n record.paperclipBoardApiTokenRefs = paperclipBoardApiTokenRefs;\n } else {\n delete record.paperclipBoardApiTokenRefs;\n }\n\n if (paperclipApiBaseUrl) {\n record.paperclipApiBaseUrl = paperclipApiBaseUrl;\n } else {\n delete record.paperclipApiBaseUrl;\n }\n\n return record as GitHubSyncPluginConfig;\n}\n\nexport function mergePluginConfig(\n currentValue: unknown,\n patch: Partial<GitHubSyncPluginConfig>\n): GitHubSyncPluginConfig {\n const current = normalizePluginConfig(currentValue);\n const currentBoardTokenRefs = normalizePluginConfigBoardTokenRefs(current.paperclipBoardApiTokenRefs);\n const patchBoardTokenRefs = normalizePluginConfigBoardTokenRefs(patch.paperclipBoardApiTokenRefs);\n const next = normalizePluginConfig({\n ...current,\n ...patch\n });\n\n if ('paperclipBoardApiTokenRefs' in patch) {\n const mergedBoardTokenRefs = {\n ...(currentBoardTokenRefs ?? {}),\n ...(patchBoardTokenRefs ?? {})\n };\n\n if (Object.keys(mergedBoardTokenRefs).length > 0) {\n next.paperclipBoardApiTokenRefs = mergedBoardTokenRefs;\n } else {\n delete next.paperclipBoardApiTokenRefs;\n }\n } else if (currentBoardTokenRefs) {\n next.paperclipBoardApiTokenRefs = currentBoardTokenRefs;\n }\n\n return next;\n}\n", "import { parseRepositoryReference } from '../github-repo.ts';\n\nexport interface RepositoryMappingSnapshot {\n repositoryUrl: string;\n paperclipProjectId?: string;\n}\n\nexport interface CompanyProjectSummary {\n id: string;\n name: string;\n}\n\nexport interface ProjectWorkspaceSummary {\n repoUrl?: string | null;\n sourceType?: string | null;\n isPrimary?: boolean | null;\n}\n\nexport interface ExistingProjectSyncCandidate {\n projectId: string;\n projectName: string;\n repositoryUrl: string;\n sourceType?: string;\n isPrimary: boolean;\n}\n\nfunction compareByProjectName(left: ExistingProjectSyncCandidate, right: ExistingProjectSyncCandidate): number {\n const projectNameComparison = left.projectName.localeCompare(right.projectName, undefined, { sensitivity: 'base' });\n if (projectNameComparison !== 0) {\n return projectNameComparison;\n }\n\n return left.repositoryUrl.localeCompare(right.repositoryUrl, undefined, { sensitivity: 'base' });\n}\n\nexport function discoverExistingProjectSyncCandidates(params: {\n projects: CompanyProjectSummary[];\n workspacesByProjectId: Record<string, ProjectWorkspaceSummary[] | undefined>;\n}): ExistingProjectSyncCandidate[] {\n const discoveredCandidates = new Map<string, ExistingProjectSyncCandidate>();\n\n for (const project of params.projects) {\n const projectId = project.id.trim();\n const projectName = project.name.trim();\n if (!projectId || !projectName) {\n continue;\n }\n\n const workspaces = params.workspacesByProjectId[projectId] ?? [];\n for (const workspace of workspaces) {\n const parsedRepository = parseRepositoryReference(workspace.repoUrl ?? '');\n if (!parsedRepository) {\n continue;\n }\n\n const repositoryUrl = parsedRepository.url;\n const candidateKey = `${projectId}:${repositoryUrl}`;\n const sourceType =\n typeof workspace.sourceType === 'string' && workspace.sourceType.trim()\n ? workspace.sourceType.trim()\n : undefined;\n const isPrimary = workspace.isPrimary === true;\n const existingCandidate = discoveredCandidates.get(candidateKey);\n if (existingCandidate) {\n discoveredCandidates.set(candidateKey, {\n ...existingCandidate,\n sourceType: existingCandidate.sourceType ?? sourceType,\n isPrimary: existingCandidate.isPrimary || isPrimary\n });\n continue;\n }\n\n discoveredCandidates.set(candidateKey, {\n projectId,\n projectName,\n repositoryUrl,\n sourceType,\n isPrimary\n });\n }\n }\n\n return [...discoveredCandidates.values()].sort(compareByProjectName);\n}\n\nexport function filterExistingProjectSyncCandidates(\n candidates: ExistingProjectSyncCandidate[],\n mappings: RepositoryMappingSnapshot[]\n): ExistingProjectSyncCandidate[] {\n const mappedProjectIds = new Set(\n mappings\n .map((mapping) => mapping.paperclipProjectId?.trim())\n .filter((value): value is string => Boolean(value))\n );\n const mappedRepositoryUrls = new Set(\n mappings\n .map((mapping) => parseRepositoryReference(mapping.repositoryUrl)?.url)\n .filter((value): value is string => Boolean(value))\n );\n\n return candidates.filter((candidate) =>\n !mappedProjectIds.has(candidate.projectId) && !mappedRepositoryUrls.has(candidate.repositoryUrl)\n );\n}\n"],
5
- "mappings": "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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAu/BlB,sBAAsB;AAAA;AAGxB,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmUpB,sBAAsB;AAAA;AAGxB,IAAM,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAcP,yBAAyB;AAAA;AAAA;AAAA;AAAA,kBAIjC,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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",
6
- "names": ["normalizeOptionalString", "hasSavedToken", "tokenStatus"]
3
+ "sources": ["../../src/ui/index.tsx", "../../src/github-repo.ts", "../../src/paperclip-health.ts", "../../src/ui/assignees.ts", "../../src/ui/http.ts", "../../src/ui/plugin-installation.ts", "../../src/ui/plugin-config.ts", "../../src/ui/project-bindings.ts"],
4
+ "sourcesContent": ["import React, { useEffect, useRef, useState } from 'react';\nimport { useHostContext, usePluginAction, usePluginData, usePluginToast } from '@paperclipai/plugin-sdk/ui';\n\nimport { parseRepositoryReference, type ParsedRepositoryReference } from '../github-repo.ts';\nimport { requiresPaperclipBoardAccess } from '../paperclip-health.ts';\nimport { normalizeCompanyAssigneeOptionsResponse, type GitHubSyncAssigneeOption } from './assignees.ts';\nimport { buildPaperclipUrl, fetchJson, fetchPaperclipHealth, resolveCliAuthPollUrl } from './http.ts';\nimport { resolveInstalledGitHubSyncPluginId, resolvePluginSettingsHref } from './plugin-installation.ts';\nimport { mergePluginConfig, normalizePluginConfig } from './plugin-config.ts';\nimport {\n discoverExistingProjectSyncCandidates,\n filterExistingProjectSyncCandidates,\n type ExistingProjectSyncCandidate,\n type ProjectWorkspaceSummary\n} from './project-bindings.ts';\n\nconst HOST_BUTTON_BASE_CLASSNAME = [\n 'inline-flex items-center justify-center whitespace-nowrap text-sm font-medium',\n 'transition-[color,background-color,border-color,box-shadow,opacity]',\n 'disabled:pointer-events-none disabled:opacity-50',\n \"[&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n '[&_svg]:shrink-0 outline-none focus-visible:border-ring',\n 'focus-visible:ring-ring/50 focus-visible:ring-[3px]',\n 'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive',\n 'rounded-md gap-1.5 shrink-0 shadow-xs'\n].join(' ');\nconst HOST_DEFAULT_BUTTON_CLASSNAME = [\n HOST_BUTTON_BASE_CLASSNAME,\n 'bg-primary text-primary-foreground hover:bg-primary/90'\n].join(' ');\nconst HOST_OUTLINE_BUTTON_CLASSNAME = [\n HOST_BUTTON_BASE_CLASSNAME,\n 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground',\n 'dark:bg-input/30 dark:border-input dark:hover:bg-input/50'\n].join(' ');\nconst HOST_DESTRUCTIVE_BUTTON_CLASSNAME = [\n HOST_BUTTON_BASE_CLASSNAME,\n 'bg-destructive text-white hover:bg-destructive/90',\n 'focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40'\n].join(' ');\nconst HOST_TOOLBAR_BUTTON_SIZE_CLASSNAME = 'px-3 has-[>svg]:px-2.5';\nconst HOST_ACTION_BUTTON_SIZE_CLASSNAME = 'h-9 px-4 py-2 has-[>svg]:px-3';\nconst HOST_INLINE_BUTTON_SIZE_CLASSNAME = 'h-8 px-3 has-[>svg]:px-2.5';\nconst HOST_ENTITY_BUTTON_CLASSNAME = `${HOST_OUTLINE_BUTTON_CLASSNAME} ${HOST_TOOLBAR_BUTTON_SIZE_CLASSNAME} h-9`;\nconst HOST_GLOBAL_BUTTON_CLASSNAME = `${HOST_OUTLINE_BUTTON_CLASSNAME} ${HOST_TOOLBAR_BUTTON_SIZE_CLASSNAME} h-8`;\nconst GITHUB_MARK_PATH_D =\n 'M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.5-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82a7.62 7.62 0 0 1 4 0c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z';\nconst GITHUB_MARK_MASK_DATA_URI =\n 'url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNiAxNiI+PHBhdGggZmlsbD0iYmxhY2siIGQ9Ik04IDBDMy41OCAwIDAgMy41OCAwIDhjMCAzLjU0IDIuMjkgNi41MyA1LjQ3IDcuNTkuNC4wNy41NS0uMTcuNTUtLjM4IDAtLjE5LS4wMS0uODItLjAxLTEuNDktMi4wMS4zNy0yLjUzLS40OS0yLjY5LS45NC0uMDktLjIzLS40OC0uOTQtLjgyLTEuMTMtLjI4LS4xNS0uNjgtLjUyLS4wMS0uNTMuNjMtLjAxIDEuMDguNTggMS4yMy44Mi43MiAxLjIxIDEuODcuODcgMi4zMy42Ni4wNy0uNTIuMjgtLjg3LjUtMS4wNy0xLjc4LS4yLTMuNjQtLjg5LTMuNjQtMy45NSAwLS44Ny4zMS0xLjU5LjgyLTIuMTUtLjA4LS4yLS4zNi0xLjAyLjA4LTIuMTIgMCAwIC42Ny0uMjEgMi4yLjgyYTcuNjIgNy42MiAwIDAgMSA0IDBjMS41My0xLjA0IDIuMi0uODIgMi4yLS44Mi40NCAxLjEuMTYgMS45Mi4wOCAyLjEyLjUxLjU2LjgyIDEuMjcuODIgMi4xNSAwIDMuMDctMS44NyAzLjc1LTMuNjUgMy45NS4yOS4yNS41NC43My41NCAxLjQ4IDAgMS4wNy0uMDEgMS45My0uMDEgMi4yIDAgLjIxLjE1LjQ2LjU1LjM4QTguMDEgOC4wMSAwIDAgMCAxNiA4YzAtNC40Mi0zLjU4LTgtOC04WiIvPjwvc3ZnPg==\")';\n\ntype PluginActionButtonVariant = 'primary' | 'secondary' | 'danger';\ntype PluginActionButtonSize = 'default' | 'sm';\n\nfunction getPluginActionClassName(options?: {\n variant?: PluginActionButtonVariant;\n size?: PluginActionButtonSize;\n extraClassName?: string;\n}): string {\n const variant = options?.variant ?? 'secondary';\n const size = options?.size ?? 'default';\n const variantClassName =\n variant === 'primary'\n ? HOST_DEFAULT_BUTTON_CLASSNAME\n : variant === 'danger'\n ? HOST_DESTRUCTIVE_BUTTON_CLASSNAME\n : HOST_OUTLINE_BUTTON_CLASSNAME;\n const sizeClassName = size === 'sm' ? HOST_INLINE_BUTTON_SIZE_CLASSNAME : HOST_ACTION_BUTTON_SIZE_CLASSNAME;\n\n return ['ghsync__button', variantClassName, sizeClassName, options?.extraClassName].filter(Boolean).join(' ');\n}\n\ninterface RepositoryMapping {\n id: string;\n repositoryUrl: string;\n paperclipProjectName: string;\n paperclipProjectId?: string;\n companyId?: string;\n}\n\ninterface SyncRunState {\n status: 'idle' | 'running' | 'success' | 'error';\n message?: string;\n checkedAt?: string;\n syncedIssuesCount?: number;\n createdIssuesCount?: number;\n skippedIssuesCount?: number;\n erroredIssuesCount?: number;\n lastRunTrigger?: 'manual' | 'schedule' | 'retry';\n progress?: SyncProgressState;\n errorDetails?: SyncErrorDetails;\n}\n\ntype SyncProgressPhase = 'preparing' | 'importing' | 'syncing';\ntype SyncConfigurationIssue = 'missing_token' | 'missing_mapping' | 'missing_board_access';\n\ninterface SyncProgressState {\n phase?: SyncProgressPhase;\n totalRepositoryCount?: number;\n currentRepositoryIndex?: number;\n currentRepositoryUrl?: string;\n completedIssueCount?: number;\n totalIssueCount?: number;\n currentIssueNumber?: number;\n detailLabel?: string;\n}\n\ntype SyncFailurePhase =\n | 'configuration'\n | 'loading_paperclip_labels'\n | 'listing_github_issues'\n | 'building_import_plan'\n | 'importing_issue'\n | 'syncing_labels'\n | 'syncing_description'\n | 'evaluating_github_status'\n | 'updating_paperclip_status';\n\ninterface SyncErrorDetails {\n phase?: SyncFailurePhase;\n configurationIssue?: SyncConfigurationIssue;\n repositoryUrl?: string;\n githubIssueNumber?: number;\n rawMessage?: string;\n suggestedAction?: string;\n rateLimitResetAt?: string;\n rateLimitResource?: string;\n}\n\ntype PaperclipIssueStatus = 'backlog' | 'todo' | 'in_progress' | 'in_review' | 'done' | 'blocked' | 'cancelled';\n\ninterface GitHubSyncAdvancedSettings {\n defaultAssigneeAgentId?: string;\n defaultStatus: PaperclipIssueStatus;\n ignoredIssueAuthorUsernames: string[];\n}\n\ninterface GitHubSyncSettings {\n mappings: RepositoryMapping[];\n syncState: SyncRunState;\n scheduleFrequencyMinutes: number;\n advancedSettings: GitHubSyncAdvancedSettings;\n availableAssignees?: GitHubSyncAssigneeOption[];\n paperclipApiBaseUrl?: string;\n githubTokenConfigured?: boolean;\n paperclipBoardAccessConfigured?: boolean;\n paperclipBoardAccessNeedsConfigSync?: boolean;\n paperclipBoardAccessConfigSyncRef?: string;\n totalSyncedIssuesCount?: number;\n updatedAt?: string;\n}\n\ninterface SyncToolbarStateData {\n kind: 'global' | 'project' | 'issue';\n visible: boolean;\n canRun: boolean;\n label: string;\n message?: string;\n syncState: SyncRunState;\n githubTokenConfigured: boolean;\n savedMappingCount: number;\n}\n\ninterface GitHubIssueDetailsData {\n paperclipIssueId: string;\n source: 'entity' | 'import_registry' | 'description';\n githubIssueNumber: number;\n githubIssueUrl: string;\n repositoryUrl: string;\n githubIssueState?: 'open' | 'closed';\n githubIssueStateReason?: 'completed' | 'not_planned' | 'duplicate';\n commentsCount?: number;\n linkedPullRequestNumbers: number[];\n labels?: Array<{\n name: string;\n color?: string;\n }>;\n syncedAt?: string;\n}\n\ninterface IssueIdentifierResolutionData {\n issueId: string;\n issueIdentifier: string;\n}\n\ninterface CommentAnnotationData {\n source: 'entity' | 'comment_body';\n links: Array<{\n type: 'issue' | 'pull_request';\n label: string;\n href: string;\n }>;\n previousStatus?: string;\n nextStatus?: string;\n reason?: string;\n}\n\ninterface TokenValidationResult {\n login: string;\n}\n\ninterface CliAuthChallengeResponse {\n token?: string;\n boardApiToken?: string;\n approvalUrl?: string;\n approvalPath?: string;\n pollUrl?: string;\n pollPath?: string;\n expiresAt?: string;\n suggestedPollIntervalMs?: number;\n}\n\ninterface CliAuthChallengePollResponse {\n status?: string;\n boardApiToken?: string;\n}\n\ninterface CliAuthIdentityResponse {\n login?: string | null;\n email?: string | null;\n displayName?: string | null;\n name?: string | null;\n user?: {\n login?: string | null;\n email?: string | null;\n displayName?: string | null;\n name?: string | null;\n } | null;\n}\n\ninterface PluginConfigResponse {\n configJson?: Record<string, unknown> | null;\n}\n\ntype ThemeMode = 'light' | 'dark';\ntype Tone = 'neutral' | 'success' | 'warning' | 'info' | 'danger';\ntype TokenStatus = 'required' | 'valid' | 'invalid';\ntype BoardAccessRequirementStatus = 'loading' | 'required' | 'not_required' | 'unknown';\ntype SelectTone = 'neutral' | 'blue' | 'yellow' | 'violet' | 'green' | 'red';\n\ninterface ThemePalette {\n text: string;\n title: string;\n muted: string;\n surface: string;\n surfaceAlt: string;\n surfaceRaised: string;\n border: string;\n borderSoft: string;\n inputBg: string;\n inputBorder: string;\n inputText: string;\n badgeBg: string;\n badgeBorder: string;\n badgeText: string;\n primaryBg: string;\n primaryBorder: string;\n primaryText: string;\n secondaryBg: string;\n secondaryBorder: string;\n secondaryText: string;\n dangerBg: string;\n dangerBorder: string;\n dangerText: string;\n successBg: string;\n successBorder: string;\n successText: string;\n warningBg: string;\n warningBorder: string;\n warningText: string;\n infoBg: string;\n infoBorder: string;\n infoText: string;\n shadow: string;\n}\n\nconst LIGHT_PALETTE: ThemePalette = {\n text: '#18181b',\n title: '#09090b',\n muted: '#71717a',\n surface: '#ffffff',\n surfaceAlt: '#fafafa',\n surfaceRaised: '#f5f5f5',\n border: '#e4e4e7',\n borderSoft: '#f4f4f5',\n inputBg: '#ffffff',\n inputBorder: '#d4d4d8',\n inputText: '#18181b',\n badgeBg: '#fafafa',\n badgeBorder: '#e4e4e7',\n badgeText: '#3f3f46',\n primaryBg: '#18181b',\n primaryBorder: '#18181b',\n primaryText: '#fafafa',\n secondaryBg: '#ffffff',\n secondaryBorder: '#d4d4d8',\n secondaryText: '#27272a',\n dangerBg: '#fff1f2',\n dangerBorder: '#fecdd3',\n dangerText: '#be123c',\n successBg: '#f0fdf4',\n successBorder: '#bbf7d0',\n successText: '#166534',\n warningBg: '#fffbeb',\n warningBorder: '#fde68a',\n warningText: '#a16207',\n infoBg: '#eff6ff',\n infoBorder: '#bfdbfe',\n infoText: '#1d4ed8',\n shadow: '0 12px 30px rgba(15, 23, 42, 0.05)'\n};\n\nconst DARK_PALETTE: ThemePalette = {\n text: '#f5f5f5',\n title: '#fafafa',\n muted: '#a1a1aa',\n surface: 'rgba(10, 10, 11, 0.96)',\n surfaceAlt: 'rgba(15, 15, 17, 1)',\n surfaceRaised: 'rgba(19, 19, 24, 1)',\n border: 'rgba(63, 63, 70, 0.92)',\n borderSoft: 'rgba(39, 39, 42, 1)',\n inputBg: 'rgba(15, 15, 17, 1)',\n inputBorder: 'rgba(63, 63, 70, 1)',\n inputText: '#fafafa',\n badgeBg: 'rgba(24, 24, 27, 0.9)',\n badgeBorder: 'rgba(63, 63, 70, 1)',\n badgeText: '#d4d4d8',\n primaryBg: '#f4f4f5',\n primaryBorder: 'rgba(82, 82, 91, 1)',\n primaryText: '#111113',\n secondaryBg: 'rgba(24, 24, 27, 1)',\n secondaryBorder: 'rgba(63, 63, 70, 1)',\n secondaryText: '#e4e4e7',\n dangerBg: 'rgba(69, 10, 10, 0.24)',\n dangerBorder: 'rgba(127, 29, 29, 0.8)',\n dangerText: '#fca5a5',\n successBg: 'rgba(20, 83, 45, 0.16)',\n successBorder: 'rgba(34, 197, 94, 0.25)',\n successText: '#bbf7d0',\n warningBg: 'rgba(146, 64, 14, 0.2)',\n warningBorder: 'rgba(245, 158, 11, 0.24)',\n warningText: '#fcd34d',\n infoBg: 'rgba(29, 78, 216, 0.2)',\n infoBorder: 'rgba(96, 165, 250, 0.24)',\n infoText: '#93c5fd',\n shadow: '0 18px 40px rgba(0, 0, 0, 0.24)'\n};\n\nconst DEFAULT_SCHEDULE_FREQUENCY_MINUTES = 15;\nconst SYNC_POLL_INTERVAL_MS = 750;\nconst CLI_AUTH_POLL_INTERVAL_FALLBACK_MS = 1_000;\nconst CLI_AUTH_POLL_INTERVAL_MIN_MS = 500;\nconst CLI_AUTH_POLL_INTERVAL_MAX_MS = 5_000;\nconst MISSING_GITHUB_TOKEN_SYNC_MESSAGE = 'Configure a GitHub token secret before running sync.';\nconst MISSING_GITHUB_TOKEN_SYNC_ACTION = 'Open settings, add a GitHub token secret, validate it, and then run sync again.';\nconst MISSING_MAPPING_SYNC_MESSAGE = 'Save at least one mapping with a created Paperclip project before running sync.';\nconst MISSING_MAPPING_SYNC_ACTION =\n 'Open settings, add a repository mapping, let Paperclip create the target project, and then retry sync.';\nconst MISSING_BOARD_ACCESS_SYNC_MESSAGE =\n 'Connect Paperclip board access before running sync on this authenticated deployment.';\nconst MISSING_BOARD_ACCESS_SYNC_ACTION =\n 'Open plugin settings for each mapped company that sync will touch, connect Paperclip board access, approve the flow, and then run sync again.';\nconst DEFAULT_IGNORED_GITHUB_ISSUE_USERNAMES = ['renovate'];\n\nconst DEFAULT_ADVANCED_SETTINGS: GitHubSyncAdvancedSettings = {\n defaultStatus: 'backlog',\n ignoredIssueAuthorUsernames: DEFAULT_IGNORED_GITHUB_ISSUE_USERNAMES\n};\n\nconst PAPERCLIP_STATUS_OPTIONS: Array<{ value: PaperclipIssueStatus; label: string; tone: SelectTone }> = [\n { value: 'backlog', label: 'Backlog', tone: 'neutral' },\n { value: 'todo', label: 'Todo', tone: 'blue' },\n { value: 'in_progress', label: 'In Progress', tone: 'yellow' },\n { value: 'in_review', label: 'In Review', tone: 'violet' },\n { value: 'done', label: 'Done', tone: 'green' },\n { value: 'blocked', label: 'Blocked', tone: 'red' },\n { value: 'cancelled', label: 'Cancelled', tone: 'neutral' }\n];\n\nconst EMPTY_SETTINGS: GitHubSyncSettings = {\n mappings: [],\n syncState: {\n status: 'idle'\n },\n scheduleFrequencyMinutes: DEFAULT_SCHEDULE_FREQUENCY_MINUTES,\n advancedSettings: DEFAULT_ADVANCED_SETTINGS,\n availableAssignees: []\n};\n\nfunction createIdleSyncState(): SyncRunState {\n return {\n status: 'idle'\n };\n}\n\nfunction getLegacySyncConfigurationIssue(syncState: SyncRunState): SyncConfigurationIssue | null {\n if (syncState.status !== 'error' || syncState.errorDetails?.phase !== 'configuration') {\n return null;\n }\n\n const message = syncState.message?.trim();\n const suggestedAction = syncState.errorDetails?.suggestedAction?.trim();\n\n if (message === MISSING_GITHUB_TOKEN_SYNC_MESSAGE || suggestedAction === MISSING_GITHUB_TOKEN_SYNC_ACTION) {\n return 'missing_token';\n }\n\n if (message === MISSING_MAPPING_SYNC_MESSAGE || suggestedAction === MISSING_MAPPING_SYNC_ACTION) {\n return 'missing_mapping';\n }\n\n if (message === MISSING_BOARD_ACCESS_SYNC_MESSAGE || suggestedAction === MISSING_BOARD_ACCESS_SYNC_ACTION) {\n return 'missing_board_access';\n }\n\n return null;\n}\n\nfunction getSyncConfigurationIssue(syncState: SyncRunState): SyncConfigurationIssue | null {\n return syncState.errorDetails?.configurationIssue ?? getLegacySyncConfigurationIssue(syncState);\n}\n\nfunction getDisplaySyncState(\n syncState: SyncRunState,\n setup: {\n hasToken: boolean;\n hasMappings: boolean;\n hasBoardAccess: boolean;\n }\n): SyncRunState {\n const configurationIssue = getSyncConfigurationIssue(syncState);\n if (!configurationIssue) {\n return syncState;\n }\n\n if (configurationIssue === 'missing_token' && setup.hasToken) {\n return createIdleSyncState();\n }\n\n if (configurationIssue === 'missing_mapping' && setup.hasMappings) {\n return createIdleSyncState();\n }\n\n if (configurationIssue === 'missing_board_access' && setup.hasBoardAccess) {\n return createIdleSyncState();\n }\n\n return syncState;\n}\n\nfunction getSyncSetupIssue(params: {\n tokenStatus: TokenStatus;\n savedMappingCount: number;\n boardAccessRequired: boolean;\n boardAccessConfigured: boolean;\n hasCompanyContext: boolean;\n}): SyncConfigurationIssue | null {\n if (params.tokenStatus !== 'valid') {\n return 'missing_token';\n }\n\n if (params.savedMappingCount === 0) {\n return 'missing_mapping';\n }\n\n if (params.boardAccessRequired && (!params.hasCompanyContext || !params.boardAccessConfigured)) {\n return 'missing_board_access';\n }\n\n return null;\n}\n\nfunction getSyncSetupMessage(\n issue: SyncConfigurationIssue | null,\n hasCompanyContext: boolean\n): string {\n switch (issue) {\n case 'missing_token':\n return 'Add a valid token to enable sync.';\n case 'missing_mapping':\n return 'Save a repository to enable sync.';\n case 'missing_board_access':\n return hasCompanyContext\n ? 'Connect Paperclip board access to enable sync on this authenticated deployment.'\n : 'Open plugin settings inside a company to connect required Paperclip board access.';\n default:\n return 'Ready to sync.';\n }\n}\n\nfunction usePaperclipBoardAccessRequirement(): {\n status: BoardAccessRequirementStatus;\n required: boolean;\n} {\n const [status, setStatus] = useState<BoardAccessRequirementStatus>('loading');\n\n useEffect(() => {\n let cancelled = false;\n\n void (async () => {\n const health = await fetchPaperclipHealth();\n if (cancelled) {\n return;\n }\n\n if (!health) {\n setStatus('unknown');\n return;\n }\n\n setStatus(requiresPaperclipBoardAccess(health) ? 'required' : 'not_required');\n })();\n\n return () => {\n cancelled = true;\n };\n }, []);\n\n return {\n status,\n required: status === 'required'\n };\n}\n\nfunction getGitHubRateLimitResourceLabel(resource?: string): string | null {\n switch (resource?.trim().toLowerCase()) {\n case 'core':\n return 'REST API';\n case 'graphql':\n return 'GraphQL API';\n case 'search':\n return 'Search API';\n default:\n return resource?.trim() ? `GitHub ${resource.trim()} API` : null;\n }\n}\n\nfunction getActiveRateLimitPause(syncState: SyncRunState, referenceTimeMs = Date.now()): {\n resetAt: string;\n resource?: string;\n} | null {\n if (syncState.status !== 'error' || !syncState.errorDetails?.rateLimitResetAt) {\n return null;\n }\n\n const resetAt = syncState.errorDetails.rateLimitResetAt.trim();\n const resetTimeMs = Date.parse(resetAt);\n if (!Number.isFinite(resetTimeMs) || resetTimeMs <= referenceTimeMs) {\n return null;\n }\n\n return {\n resetAt,\n ...(syncState.errorDetails.rateLimitResource ? { resource: syncState.errorDetails.rateLimitResource } : {})\n };\n}\n\nfunction getSyncToastTitle(syncState: SyncRunState): string {\n if (getActiveRateLimitPause(syncState)) {\n return 'GitHub sync is paused';\n }\n\n if (syncState.status === 'running') {\n return 'GitHub sync is running';\n }\n\n return syncState.status === 'error' ? 'GitHub sync needs attention' : 'GitHub sync finished';\n}\n\nfunction getSyncToastBody(syncState: SyncRunState): string {\n if (syncState.message?.trim()) {\n return syncState.message.trim();\n }\n\n if (syncState.status === 'running') {\n return 'GitHub sync is running in the background.';\n }\n\n return 'GitHub sync completed.';\n}\n\nfunction getSyncToastTone(syncState: SyncRunState): 'info' | 'error' | 'success' {\n if (getActiveRateLimitPause(syncState)) {\n return 'info';\n }\n\n if (syncState.status === 'running') {\n return 'info';\n }\n\n return syncState.status === 'error' ? 'error' : 'success';\n}\n\nfunction useSyncCompletionToast(\n syncState: SyncRunState,\n toast: ReturnType<typeof usePluginToast>\n): (nextSyncState: SyncRunState) => void {\n const completionToastArmedRef = useRef(false);\n const previousStatusRef = useRef<SyncRunState['status']>(syncState.status);\n\n useEffect(() => {\n const previousStatus = previousStatusRef.current;\n previousStatusRef.current = syncState.status;\n\n if (!completionToastArmedRef.current || previousStatus !== 'running' || syncState.status === 'running') {\n return;\n }\n\n completionToastArmedRef.current = false;\n toast({\n title: getSyncToastTitle(syncState),\n body: getSyncToastBody(syncState),\n tone: getSyncToastTone(syncState)\n });\n }, [syncState, toast]);\n\n return (nextSyncState: SyncRunState) => {\n completionToastArmedRef.current = nextSyncState.status === 'running';\n previousStatusRef.current = nextSyncState.status;\n };\n}\n\nconst SHARED_PROGRESS_STYLES = `\n.ghsync-progress {\n display: grid;\n gap: 10px;\n padding: 14px;\n border-radius: 10px;\n border: 1px solid var(--ghsync-info-border);\n background: var(--ghsync-info-bg);\n}\n\n.ghsync-progress--compact {\n gap: 8px;\n padding: 12px;\n}\n\n.ghsync-progress__header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.ghsync-progress__copy strong {\n display: block;\n font-size: 13px;\n color: var(--ghsync-title);\n}\n\n.ghsync-progress__copy span {\n display: block;\n margin-top: 4px;\n color: var(--ghsync-muted);\n font-size: 12px;\n line-height: 1.5;\n}\n\n.ghsync-progress__pill {\n display: inline-flex;\n align-items: center;\n min-height: 24px;\n padding: 0 10px;\n border-radius: 999px;\n border: 1px solid var(--ghsync-info-border);\n background: var(--ghsync-surfaceAlt);\n color: var(--ghsync-info-text);\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n white-space: nowrap;\n}\n\n.ghsync-progress__track {\n position: relative;\n overflow: hidden;\n height: 10px;\n border-radius: 999px;\n border: 1px solid var(--ghsync-border-soft);\n background: var(--ghsync-surfaceRaised);\n}\n\n.ghsync-progress__fill {\n height: 100%;\n min-width: 12px;\n border-radius: inherit;\n background: linear-gradient(90deg, var(--ghsync-info-border) 0%, var(--ghsync-info-text) 100%);\n transition: width 220ms ease;\n}\n\n.ghsync-progress__fill--indeterminate {\n width: 34%;\n animation: ghsync-progress-slide 1.4s ease-in-out infinite;\n}\n\n.ghsync-progress__meta {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n flex-wrap: wrap;\n}\n\n.ghsync-progress__meta span {\n color: var(--ghsync-muted);\n font-size: 11px;\n line-height: 1.5;\n}\n\n@keyframes ghsync-progress-slide {\n 0% {\n transform: translateX(-120%);\n }\n\n 100% {\n transform: translateX(320%);\n }\n}\n\n@media (max-width: 640px) {\n .ghsync-progress__header,\n .ghsync-progress__meta {\n align-items: stretch;\n flex-direction: column;\n }\n}\n`;\n\nconst PAGE_STYLES = `\n.ghsync {\n display: grid;\n gap: 16px;\n color: var(--ghsync-text);\n font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n}\n\n.ghsync * {\n box-sizing: border-box;\n}\n\n.ghsync button,\n.ghsync input {\n font-family: inherit;\n}\n\n.ghsync__header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n flex-wrap: wrap;\n}\n\n.ghsync__header-copy {\n min-width: 0;\n}\n\n.ghsync__header-copy h2 {\n margin: 0;\n font-size: 20px;\n line-height: 1.2;\n font-weight: 700;\n color: var(--ghsync-title);\n}\n\n.ghsync__header-copy p {\n margin: 8px 0 0;\n max-width: 760px;\n color: var(--ghsync-muted);\n font-size: 13px;\n line-height: 1.55;\n}\n\n.ghsync__scope-overview {\n display: grid;\n gap: 12px;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n\n.ghsync__scope-card {\n display: grid;\n gap: 12px;\n padding: 16px;\n border-radius: 12px;\n border: 1px solid var(--ghsync-border-soft);\n background: var(--ghsync-surfaceRaised);\n}\n\n.ghsync__scope-card--company {\n border-color: var(--ghsync-border);\n background:\n linear-gradient(180deg, color-mix(in srgb, var(--ghsync-surfaceRaised) 82%, var(--ghsync-success-bg)), var(--ghsync-surfaceRaised));\n}\n\n.ghsync__scope-card--global {\n border-color: var(--ghsync-info-border);\n background:\n linear-gradient(180deg, color-mix(in srgb, var(--ghsync-surfaceRaised) 78%, var(--ghsync-info-bg)), var(--ghsync-surfaceRaised));\n}\n\n.ghsync__scope-head {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 10px;\n flex-wrap: wrap;\n}\n\n.ghsync__scope-kicker {\n display: block;\n color: var(--ghsync-muted);\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n}\n\n.ghsync__scope-card .ghsync__scope-name {\n margin: 0;\n font-size: 22px;\n line-height: 1.15;\n font-weight: 700;\n color: var(--ghsync-title);\n}\n\n.ghsync__scope-card p {\n margin: 0;\n color: var(--ghsync-muted);\n font-size: 12px;\n line-height: 1.55;\n}\n\n.ghsync__scope-points {\n display: grid;\n gap: 8px;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.ghsync__scope-points li {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n color: var(--ghsync-text);\n font-size: 12px;\n line-height: 1.5;\n}\n\n.ghsync__scope-points li::before {\n content: \"\";\n width: 7px;\n height: 7px;\n margin-top: 5px;\n flex: 0 0 auto;\n border-radius: 999px;\n background: currentColor;\n opacity: 0.65;\n}\n\n.ghsync__layout {\n display: grid;\n gap: 16px;\n align-items: start;\n grid-template-columns: minmax(0, 1.45fr) minmax(260px, 0.8fr);\n}\n\n.ghsync__card {\n overflow: hidden;\n border-radius: 12px;\n border: 1px solid var(--ghsync-border);\n background: var(--ghsync-surface);\n box-shadow: var(--ghsync-shadow);\n}\n\n.ghsync__card-header {\n padding: 16px 18px;\n border-bottom: 1px solid var(--ghsync-border-soft);\n}\n\n.ghsync__card-header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 700;\n color: var(--ghsync-title);\n}\n\n.ghsync__card-header p {\n margin: 6px 0 0;\n color: var(--ghsync-muted);\n font-size: 12px;\n line-height: 1.5;\n}\n\n.ghsync__loading,\n.ghsync__message {\n margin: 0 18px;\n}\n\n.ghsync__loading {\n margin-top: 16px;\n color: var(--ghsync-muted);\n font-size: 12px;\n}\n\n.ghsync__message {\n margin-top: 16px;\n padding: 10px 12px;\n border-radius: 10px;\n border: 1px solid var(--ghsync-border-soft);\n background: var(--ghsync-surfaceAlt);\n color: var(--ghsync-text);\n font-size: 13px;\n line-height: 1.5;\n}\n\n.ghsync__message--error {\n border-color: var(--ghsync-danger-border);\n background: var(--ghsync-danger-bg);\n color: var(--ghsync-danger-text);\n}\n\n.ghsync-diagnostics {\n display: grid;\n gap: 10px;\n padding: 14px;\n border-radius: 10px;\n border: 1px solid var(--ghsync-dangerBorder);\n background: var(--ghsync-dangerBg);\n}\n\n.ghsync-diagnostics__header {\n display: grid;\n gap: 4px;\n}\n\n.ghsync-diagnostics__header strong {\n font-size: 13px;\n color: var(--ghsync-dangerText);\n}\n\n.ghsync-diagnostics__header span {\n color: var(--ghsync-muted);\n font-size: 12px;\n line-height: 1.5;\n}\n\n.ghsync-diagnostics__grid {\n display: grid;\n gap: 10px;\n grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\n}\n\n.ghsync-diagnostics__item,\n.ghsync-diagnostics__block {\n display: grid;\n gap: 6px;\n padding: 12px;\n border-radius: 10px;\n border: 1px solid var(--ghsync-dangerBorder);\n background: var(--ghsync-surfaceAlt);\n}\n\n.ghsync-diagnostics__label {\n color: var(--ghsync-dangerText);\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n}\n\n.ghsync-diagnostics__value {\n color: var(--ghsync-title);\n font-size: 13px;\n line-height: 1.5;\n word-break: break-word;\n}\n\n.ghsync-diagnostics__value--code {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", monospace;\n font-size: 12px;\n white-space: pre-wrap;\n}\n\n.ghsync__section {\n display: grid;\n gap: 14px;\n padding: 18px;\n border-top: 1px solid var(--ghsync-border-soft);\n}\n\n.ghsync__section-head {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.ghsync__section-head-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n justify-content: flex-end;\n}\n\n.ghsync__section-copy {\n min-width: 0;\n}\n\n.ghsync__section-title-row {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: wrap;\n}\n\n.ghsync__section-copy h4 {\n margin: 0;\n font-size: 14px;\n font-weight: 700;\n color: var(--ghsync-title);\n}\n\n.ghsync__section-tags {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.ghsync__section-copy p {\n margin: 6px 0 0;\n color: var(--ghsync-muted);\n font-size: 12px;\n line-height: 1.5;\n}\n\n.ghsync__summary-line {\n margin: 8px 0 0;\n color: var(--ghsync-title);\n font-size: 12px;\n line-height: 1.5;\n}\n\n.ghsync__scope-pill {\n display: inline-flex;\n align-items: center;\n min-height: 22px;\n padding: 0 9px;\n border-radius: 999px;\n border: 1px solid var(--ghsync-border);\n background: transparent;\n color: var(--ghsync-title);\n font-size: 11px;\n font-weight: 700;\n line-height: 1;\n white-space: nowrap;\n}\n\n.ghsync__scope-pill--company {\n border-color: var(--ghsync-border);\n background: var(--ghsync-surface);\n color: var(--ghsync-title);\n}\n\n.ghsync__scope-pill--global {\n border-color: var(--ghsync-info-border);\n background: var(--ghsync-info-bg);\n color: var(--ghsync-info-text);\n}\n\n.ghsync__scope-pill--mixed {\n border-color: var(--ghsync-warning-border);\n background: var(--ghsync-warning-bg);\n color: var(--ghsync-warning-text);\n}\n\n.ghsync__badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n min-height: 24px;\n padding: 0 10px;\n border-radius: 999px;\n border: 1px solid var(--ghsync-badge-border);\n background: var(--ghsync-badge-bg);\n color: var(--ghsync-badge-text);\n font-size: 12px;\n font-weight: 600;\n line-height: 1;\n white-space: nowrap;\n}\n\n.ghsync__badge--success {\n border-color: var(--ghsync-success-border);\n background: var(--ghsync-success-bg);\n color: var(--ghsync-success-text);\n}\n\n.ghsync__badge--warning {\n border-color: var(--ghsync-warning-border);\n background: var(--ghsync-warning-bg);\n color: var(--ghsync-warning-text);\n}\n\n.ghsync__badge--info {\n border-color: var(--ghsync-info-border);\n background: var(--ghsync-info-bg);\n color: var(--ghsync-info-text);\n}\n\n.ghsync__badge--danger {\n border-color: var(--ghsync-danger-border);\n background: var(--ghsync-danger-bg);\n color: var(--ghsync-danger-text);\n}\n\n.ghsync__badge--neutral {\n border-color: var(--ghsync-border);\n background: transparent;\n color: var(--ghsync-muted);\n}\n\n.ghsync__badge-dot {\n width: 7px;\n height: 7px;\n border-radius: 999px;\n background: currentColor;\n}\n\n.ghsync__stack,\n.ghsync__mapping-list,\n.ghsync__side-body,\n.ghsync__detail-list {\n display: grid;\n gap: 12px;\n}\n\n.ghsync__field {\n display: grid;\n gap: 8px;\n}\n\n.ghsync__field label {\n font-size: 12px;\n font-weight: 600;\n color: var(--ghsync-title);\n}\n\n.ghsync__input {\n width: 100%;\n min-height: 40px;\n border-radius: 10px;\n border: 1px solid var(--ghsync-input-border);\n background: var(--ghsync-input-bg);\n color: var(--ghsync-input-text);\n padding: 0 12px;\n outline: none;\n}\n\n.ghsync__input::placeholder {\n color: var(--ghsync-muted);\n}\n\n.ghsync__input:focus {\n border-color: var(--ghsync-border);\n}\n\n.ghsync__input[readonly] {\n opacity: 0.78;\n}\n\n.ghsync__input:disabled {\n opacity: 0.72;\n cursor: not-allowed;\n}\n\n.ghsync__picker {\n position: relative;\n}\n\n.ghsync__picker-trigger {\n width: fit-content;\n max-width: 100%;\n min-height: 0;\n display: inline-flex;\n align-items: center;\n justify-content: space-between;\n gap: 6px;\n border-radius: 8px;\n border: 1px solid var(--ghsync-border);\n background: color-mix(in srgb, var(--ghsync-badgeBg) 72%, transparent);\n color: var(--ghsync-text);\n padding: 4px 8px;\n text-align: left;\n cursor: pointer;\n transition: background-color 120ms ease, color 120ms ease, border-color 120ms ease;\n}\n\n.ghsync__picker-trigger:disabled {\n opacity: 0.72;\n cursor: not-allowed;\n}\n\n.ghsync__picker-trigger:focus,\n.ghsync__picker-trigger:focus-visible {\n outline: none;\n border-color: var(--ghsync-border);\n}\n\n.ghsync__picker-trigger:hover {\n background: var(--ghsync-surfaceRaised);\n}\n\n.ghsync__picker-trigger--assignee {\n min-width: 10rem;\n font-size: 14px;\n font-weight: 500;\n}\n\n.ghsync__picker-trigger--status {\n font-size: 12px;\n}\n\n.ghsync__picker-trigger-main {\n min-width: 0;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n\n.ghsync__picker-agent-icon {\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n color: var(--ghsync-muted);\n}\n\n.ghsync__picker-agent-icon svg {\n width: 14px;\n height: 14px;\n}\n\n.ghsync__picker-trigger-label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.ghsync__picker-trigger-icon {\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n color: var(--ghsync-muted);\n}\n\n.ghsync__picker-trigger-icon svg,\n.ghsync__picker-option-check svg {\n width: 16px;\n height: 16px;\n}\n\n.ghsync__picker-panel {\n position: absolute;\n top: calc(100% + 8px);\n left: 0;\n z-index: 30;\n border-radius: 8px;\n border: 1px solid var(--ghsync-border);\n background: var(--ghsync-surfaceAlt);\n box-shadow: var(--ghsync-shadow);\n padding: 4px;\n}\n\n.ghsync__picker-panel--assignee {\n width: min(20rem, calc(100vw - 2rem));\n}\n\n.ghsync__picker-panel--status {\n width: 9rem;\n}\n\n.ghsync__picker-search {\n padding: 2px 2px 6px;\n}\n\n.ghsync__picker-search-input {\n width: 100%;\n min-height: 32px;\n border-radius: 6px;\n border: 1px solid transparent;\n background: transparent;\n color: var(--ghsync-input-text);\n padding: 0 8px;\n font-size: 14px;\n outline: none;\n}\n\n.ghsync__picker-search-input::placeholder {\n color: var(--ghsync-muted);\n}\n\n.ghsync__picker-search-input:focus,\n.ghsync__picker-search-input:focus-visible {\n border-color: var(--ghsync-input-border);\n background: var(--ghsync-surfaceRaised);\n}\n\n.ghsync__picker-list {\n display: flex;\n flex-direction: column;\n gap: 2px;\n max-height: 240px;\n overflow: auto;\n}\n\n.ghsync__picker-option {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--ghsync-input-text);\n padding: 6px 8px;\n text-align: left;\n cursor: pointer;\n}\n\n.ghsync__picker-option:hover,\n.ghsync__picker-option:focus,\n.ghsync__picker-option:focus-visible,\n.ghsync__picker-option--selected {\n outline: none;\n background: var(--ghsync-surfaceRaised);\n}\n\n.ghsync__picker-panel--assignee .ghsync__picker-option {\n font-size: 14px;\n touch-action: manipulation;\n}\n\n.ghsync__picker-panel--status .ghsync__picker-option {\n font-size: 12px;\n}\n\n.ghsync__picker-option-label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.ghsync__picker-option-check {\n flex: 0 0 auto;\n color: var(--ghsync-muted);\n}\n\n.ghsync__picker-empty {\n padding: 10px 12px;\n color: var(--ghsync-muted);\n font-size: 13px;\n}\n\n.ghsync__select-dot {\n width: 10px;\n height: 10px;\n flex: 0 0 auto;\n border-radius: 999px;\n border: 1px solid currentColor;\n background: transparent;\n}\n\n.ghsync__select-dot--neutral {\n color: var(--ghsync-muted);\n}\n\n.ghsync__select-dot--blue {\n color: #60a5fa;\n}\n\n.ghsync__select-dot--yellow {\n color: #facc15;\n}\n\n.ghsync__select-dot--violet {\n color: #a78bfa;\n}\n\n.ghsync__select-dot--green {\n color: #34d399;\n}\n\n.ghsync__select-dot--red {\n color: #f87171;\n}\n\n.ghsync__hint,\n.ghsync__note,\n.ghsync__check span {\n margin: 0;\n color: var(--ghsync-muted);\n font-size: 12px;\n line-height: 1.5;\n}\n\n.ghsync__hint--error {\n color: var(--ghsync-danger-text);\n}\n\n.ghsync__actions,\n.ghsync__section-footer,\n.ghsync__connected,\n.ghsync__locked,\n.ghsync__sync-summary,\n.ghsync__mapping-head,\n.ghsync__check-top {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.ghsync__section-footer {\n justify-content: flex-end;\n}\n\n.ghsync__connected,\n.ghsync__locked,\n.ghsync__sync-summary,\n.ghsync__check {\n border: 1px solid var(--ghsync-border-soft);\n border-radius: 10px;\n background: var(--ghsync-surfaceAlt);\n padding: 14px;\n}\n\n.ghsync__connected strong,\n.ghsync__locked strong,\n.ghsync__sync-summary strong {\n display: block;\n font-size: 13px;\n color: var(--ghsync-title);\n}\n\n.ghsync__connected span:not(.ghsync__scope-pill),\n.ghsync__locked span:not(.ghsync__scope-pill),\n.ghsync__sync-summary span:not(.ghsync__scope-pill) {\n display: block;\n margin-top: 4px;\n color: var(--ghsync-muted);\n font-size: 12px;\n line-height: 1.5;\n}\n\n.ghsync__sync-summary > div {\n display: grid;\n gap: 8px;\n}\n\n.ghsync__sync-summary--success {\n border-color: var(--ghsync-success-border);\n background: var(--ghsync-success-bg);\n}\n\n.ghsync__sync-summary--success strong,\n.ghsync__sync-summary--success span {\n color: var(--ghsync-success-text);\n}\n\n.ghsync__sync-summary--danger {\n border-color: var(--ghsync-danger-border);\n background: var(--ghsync-danger-bg);\n}\n\n.ghsync__sync-summary--danger strong,\n.ghsync__sync-summary--danger span {\n color: var(--ghsync-danger-text);\n}\n\n.ghsync__sync-summary--info {\n border-color: var(--ghsync-info-border);\n background: var(--ghsync-info-bg);\n}\n\n.ghsync__sync-summary--info strong,\n.ghsync__sync-summary--info span {\n color: var(--ghsync-info-text);\n}\n\n.ghsync__button-row {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.ghsync__button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n white-space: nowrap;\n text-decoration: none;\n cursor: pointer;\n}\n\n.ghsync__button:disabled {\n cursor: not-allowed;\n}\n\n.ghsync__mapping-card,\n.ghsync__advanced-card,\n.ghsync__schedule-card,\n.ghsync__stat {\n border: 1px solid var(--ghsync-border-soft);\n border-radius: 10px;\n background: var(--ghsync-surfaceRaised);\n}\n\n.ghsync__mapping-card,\n.ghsync__advanced-card {\n display: grid;\n gap: 12px;\n padding: 14px;\n}\n\n.ghsync__schedule-card {\n display: grid;\n gap: 12px;\n align-items: start;\n padding: 14px;\n grid-template-columns: minmax(0, 1fr) minmax(180px, 0.8fr);\n}\n\n.ghsync__mapping-title strong {\n display: block;\n font-size: 13px;\n color: var(--ghsync-title);\n}\n\n.ghsync__mapping-title span {\n display: block;\n margin-top: 4px;\n color: var(--ghsync-muted);\n font-size: 12px;\n line-height: 1.5;\n}\n\n.ghsync__existing-projects {\n display: grid;\n gap: 10px;\n}\n\n.ghsync__existing-project-card {\n display: grid;\n gap: 10px;\n align-items: start;\n grid-template-columns: minmax(0, 1fr) auto;\n}\n\n.ghsync__existing-project-meta {\n display: grid;\n gap: 6px;\n}\n\n.ghsync__existing-project-meta strong {\n color: var(--ghsync-title);\n font-size: 13px;\n}\n\n.ghsync__existing-project-meta span {\n color: var(--ghsync-muted);\n font-size: 12px;\n line-height: 1.5;\n}\n\n.ghsync__existing-project-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.ghsync__mapping-grid {\n display: grid;\n align-items: start;\n gap: 12px;\n grid-template-columns: minmax(0, 1.15fr) minmax(220px, 0.85fr);\n}\n\n.ghsync__textarea {\n min-height: 96px;\n padding: 10px 12px;\n resize: vertical;\n}\n\n.ghsync__stats {\n display: grid;\n gap: 10px;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n\n.ghsync__schedule-meta {\n display: grid;\n gap: 4px;\n}\n\n.ghsync__schedule-meta strong {\n font-size: 13px;\n color: var(--ghsync-title);\n}\n\n.ghsync__schedule-meta span {\n color: var(--ghsync-muted);\n font-size: 12px;\n line-height: 1.5;\n}\n\n.ghsync__stat {\n display: grid;\n gap: 6px;\n padding: 12px;\n}\n\n.ghsync__stat--emphasized {\n border-color: var(--ghsync-danger-border);\n background: var(--ghsync-danger-bg);\n}\n\n.ghsync__stat span {\n display: block;\n color: var(--ghsync-title);\n font-size: 12px;\n font-weight: 600;\n}\n\n.ghsync__stat strong {\n display: block;\n color: var(--ghsync-title);\n font-size: 20px;\n line-height: 1;\n}\n\n.ghsync__stat p {\n margin: 0;\n color: var(--ghsync-muted);\n font-size: 11px;\n line-height: 1.5;\n}\n\n.ghsync__side-body {\n padding: 16px 18px;\n}\n\n.ghsync__check {\n display: grid;\n gap: 6px;\n}\n\n.ghsync__check strong {\n font-size: 12px;\n color: var(--ghsync-title);\n}\n\n.ghsync__detail-list {\n padding-top: 2px;\n}\n\n.ghsync__detail {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding-bottom: 10px;\n border-bottom: 1px solid var(--ghsync-border-soft);\n}\n\n.ghsync__detail:last-child {\n padding-bottom: 0;\n border-bottom: 0;\n}\n\n.ghsync__detail-label {\n color: var(--ghsync-muted);\n font-size: 12px;\n}\n\n.ghsync__detail-value {\n color: var(--ghsync-title);\n font-size: 12px;\n text-align: right;\n}\n\n@media (max-width: 980px) {\n .ghsync__scope-overview,\n .ghsync__layout,\n .ghsync__schedule-card,\n .ghsync__existing-project-card,\n .ghsync__advanced-card,\n .ghsync__mapping-grid,\n .ghsync__stats {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n\n@media (max-width: 640px) {\n .ghsync__header,\n .ghsync__section-head,\n .ghsync__actions,\n .ghsync__section-footer,\n .ghsync__connected,\n .ghsync__locked,\n .ghsync__sync-summary,\n .ghsync__mapping-head,\n .ghsync__check-top {\n align-items: stretch;\n flex-direction: column;\n }\n\n .ghsync__button-row {\n width: 100%;\n }\n\n .ghsync__button {\n flex: 1 1 auto;\n }\n\n .ghsync__detail {\n display: grid;\n gap: 4px;\n }\n\n .ghsync__detail-value {\n text-align: left;\n }\n}\n\n${SHARED_PROGRESS_STYLES}\n`;\n\nconst WIDGET_STYLES = `\n.ghsync-widget {\n color: var(--ghsync-text);\n font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n}\n\n.ghsync-widget * {\n box-sizing: border-box;\n}\n\n.ghsync-widget a,\n.ghsync-widget button {\n font-family: inherit;\n}\n\n.ghsync-widget__card {\n display: grid;\n gap: 14px;\n padding: 16px;\n border-radius: 12px;\n border: 1px solid var(--ghsync-border-soft);\n background: var(--ghsync-surface);\n box-shadow: none;\n}\n\n.ghsync-widget__top,\n.ghsync-widget__actions {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.ghsync-widget__eyebrow {\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: var(--ghsync-muted);\n}\n\n.ghsync-widget__top h3 {\n margin: 4px 0 0;\n font-size: 16px;\n line-height: 1.25;\n color: var(--ghsync-title);\n}\n\n.ghsync-widget__top p {\n margin: 4px 0 0;\n max-width: 440px;\n color: var(--ghsync-muted);\n font-size: 12px;\n line-height: 1.55;\n}\n\n.ghsync-widget__meta {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n color: var(--ghsync-muted);\n font-size: 11px;\n}\n\n.ghsync-widget__meta-dot {\n width: 3px;\n height: 3px;\n border-radius: 999px;\n background: var(--ghsync-muted);\n opacity: 0.75;\n}\n\n.ghsync-widget__stats {\n display: grid;\n gap: 12px;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n border-top: 1px solid var(--ghsync-border-soft);\n padding-top: 14px;\n}\n\n.ghsync-widget__stat,\n.ghsync-widget__summary,\n.ghsync-widget__message {\n border-radius: 0;\n}\n\n.ghsync-widget__stat {\n display: grid;\n gap: 6px;\n padding: 12px;\n border: 1px solid var(--ghsync-border-soft);\n border-radius: 10px;\n background: var(--ghsync-surfaceAlt);\n}\n\n.ghsync-widget__stat--emphasized {\n border-color: var(--ghsync-danger-border);\n background: var(--ghsync-dangerBg);\n}\n\n.ghsync-widget__stat span {\n display: block;\n font-size: 12px;\n font-weight: 600;\n color: var(--ghsync-title);\n}\n\n.ghsync-widget__stat strong {\n display: block;\n font-size: 24px;\n line-height: 1;\n color: var(--ghsync-title);\n}\n\n.ghsync-widget__stat p {\n margin: 0;\n color: var(--ghsync-muted);\n font-size: 11px;\n line-height: 1.5;\n}\n\n.ghsync-widget__summary {\n display: grid;\n gap: 4px;\n padding-top: 2px;\n}\n\n.ghsync-widget__summary strong {\n font-size: 13px;\n color: var(--ghsync-title);\n}\n\n.ghsync-widget__summary span {\n color: var(--ghsync-muted);\n font-size: 12px;\n line-height: 1.5;\n}\n\n.ghsync-widget__message {\n padding: 10px 12px;\n border-radius: 10px;\n border: 1px solid var(--ghsync-danger-border);\n background: var(--ghsync-danger-bg);\n color: var(--ghsync-danger-text);\n font-size: 12px;\n line-height: 1.5;\n}\n\n.ghsync-diagnostics {\n display: grid;\n gap: 10px;\n padding: 14px;\n border-radius: 10px;\n border: 1px solid var(--ghsync-dangerBorder);\n background: var(--ghsync-dangerBg);\n}\n\n.ghsync-diagnostics__header {\n display: grid;\n gap: 4px;\n}\n\n.ghsync-diagnostics__header strong {\n font-size: 13px;\n color: var(--ghsync-dangerText);\n}\n\n.ghsync-diagnostics__header span {\n color: var(--ghsync-muted);\n font-size: 12px;\n line-height: 1.5;\n}\n\n.ghsync-diagnostics__grid {\n display: grid;\n gap: 10px;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n}\n\n.ghsync-diagnostics__item,\n.ghsync-diagnostics__block {\n display: grid;\n gap: 6px;\n padding: 12px;\n border-radius: 10px;\n border: 1px solid var(--ghsync-dangerBorder);\n background: var(--ghsync-surfaceAlt);\n}\n\n.ghsync-diagnostics__label {\n color: var(--ghsync-dangerText);\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n}\n\n.ghsync-diagnostics__value {\n color: var(--ghsync-title);\n font-size: 13px;\n line-height: 1.5;\n word-break: break-word;\n}\n\n.ghsync-diagnostics__value--code {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", monospace;\n font-size: 12px;\n white-space: pre-wrap;\n}\n\n.ghsync-widget__actions {\n align-items: center;\n justify-content: space-between;\n padding-top: 2px;\n}\n\n.ghsync-widget__button-row {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.ghsync-widget__link {\n text-decoration: none;\n}\n\n.ghsync__badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n min-height: 24px;\n padding: 0 10px;\n border-radius: 999px;\n border: 1px solid var(--ghsync-badge-border);\n background: var(--ghsync-badge-bg);\n color: var(--ghsync-badge-text);\n font-size: 12px;\n font-weight: 600;\n line-height: 1;\n white-space: nowrap;\n}\n\n.ghsync__badge--success {\n border-color: var(--ghsync-success-border);\n background: var(--ghsync-success-bg);\n color: var(--ghsync-success-text);\n}\n\n.ghsync__badge--warning {\n border-color: var(--ghsync-warning-border);\n background: var(--ghsync-warning-bg);\n color: var(--ghsync-warning-text);\n}\n\n.ghsync__badge--info {\n border-color: var(--ghsync-info-border);\n background: var(--ghsync-info-bg);\n color: var(--ghsync-info-text);\n}\n\n.ghsync__badge--danger {\n border-color: var(--ghsync-danger-border);\n background: var(--ghsync-danger-bg);\n color: var(--ghsync-danger-text);\n}\n\n.ghsync__badge--neutral {\n border-color: var(--ghsync-border);\n background: transparent;\n color: var(--ghsync-muted);\n}\n\n.ghsync__badge-dot {\n width: 7px;\n height: 7px;\n border-radius: 999px;\n background: currentColor;\n}\n\n.ghsync__button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n white-space: nowrap;\n text-decoration: none;\n cursor: pointer;\n}\n\n.ghsync__button:disabled {\n cursor: not-allowed;\n}\n\n@media (max-width: 720px) {\n .ghsync-widget__stats {\n grid-template-columns: minmax(0, 1fr);\n gap: 12px;\n }\n\n .ghsync-widget__top,\n .ghsync-widget__actions {\n flex-direction: column;\n align-items: stretch;\n }\n\n .ghsync-widget__stat {\n padding-left: 0;\n border-left: 0;\n }\n\n .ghsync-widget__button-row {\n width: 100%;\n }\n\n .ghsync__button,\n .ghsync-widget__link {\n flex: 1 1 auto;\n }\n}\n\n${SHARED_PROGRESS_STYLES}\n`;\n\nconst EXTENSION_SURFACE_STYLES = `\n button[role=\"tab\"][id$=\"trigger-plugin:paperclip-github-plugin:paperclip-github-plugin-issue-detail-tab\"],\n button[role=\"tab\"][aria-controls$=\"content-plugin:paperclip-github-plugin:paperclip-github-plugin-issue-detail-tab\"] {\n gap: 6px;\n }\n\n button[role=\"tab\"][id$=\"trigger-plugin:paperclip-github-plugin:paperclip-github-plugin-issue-detail-tab\"]::before,\n button[role=\"tab\"][aria-controls$=\"content-plugin:paperclip-github-plugin:paperclip-github-plugin-issue-detail-tab\"]::before {\n content: '';\n display: inline-block;\n width: 14px;\n height: 14px;\n flex: none;\n background-color: currentColor;\n -webkit-mask-image: ${GITHUB_MARK_MASK_DATA_URI};\n -webkit-mask-position: center;\n -webkit-mask-repeat: no-repeat;\n -webkit-mask-size: contain;\n mask-image: ${GITHUB_MARK_MASK_DATA_URI};\n mask-position: center;\n mask-repeat: no-repeat;\n mask-size: contain;\n }\n\n .ghsync-extension-card {\n display: grid;\n gap: 14px;\n padding: 16px;\n border: 1px solid var(--ghsync-border);\n border-radius: 18px;\n background: linear-gradient(180deg, var(--ghsync-surfaceRaised) 0%, var(--ghsync-surface) 100%);\n color: var(--ghsync-text);\n box-shadow: var(--ghsync-shadow);\n font-family: ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n }\n\n .ghsync-extension-card--compact {\n gap: 10px;\n padding: 0;\n border: 0;\n border-radius: 0;\n background: transparent;\n box-shadow: none;\n }\n\n .ghsync-extension-heading {\n display: flex;\n justify-content: space-between;\n gap: 12px;\n align-items: start;\n }\n\n .ghsync-extension-heading h3,\n .ghsync-extension-heading h4 {\n margin: 0;\n color: var(--ghsync-title);\n font-size: 16px;\n line-height: 1.25;\n }\n\n .ghsync-extension-heading p,\n .ghsync-extension-empty,\n .ghsync-extension-copy {\n margin: 0;\n color: var(--ghsync-muted);\n font-size: 13px;\n line-height: 1.55;\n }\n\n .ghsync-extension-grid {\n display: grid;\n gap: 12px;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n }\n\n .ghsync-extension-metric {\n display: grid;\n gap: 4px;\n padding: 12px;\n border-radius: 14px;\n border: 1px solid var(--ghsync-border-soft);\n background: var(--ghsync-surfaceAlt);\n }\n\n .ghsync-extension-metric span {\n color: var(--ghsync-muted);\n font-size: 11px;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n }\n\n .ghsync-extension-metric strong {\n color: var(--ghsync-title);\n font-size: 14px;\n }\n\n .ghsync-extension-links,\n .ghsync-extension-labels,\n .ghsync-comment-annotation,\n .ghsync-toolbar-button {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n align-items: center;\n }\n\n .inline-flex:has(> .ghsync-toolbar-button--entity) {\n margin-left: auto;\n margin-inline-start: auto;\n }\n\n .ghsync-toolbar-button--entity {\n width: 100%;\n justify-content: flex-end;\n }\n\n .ghsync-extension-link {\n text-decoration: none;\n white-space: nowrap;\n }\n\n .ghsync-extension-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 7px 10px;\n border-radius: 999px;\n border: 1px solid var(--ghsync-border);\n background: var(--ghsync-surfaceAlt);\n color: var(--ghsync-title);\n font-size: 12px;\n font-weight: 600;\n text-decoration: none;\n }\n\n .ghsync-extension-pill {\n font-weight: 500;\n }\n\n .ghsync-comment-annotation__label {\n color: var(--ghsync-muted);\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n }\n\n .ghsync-extension-note {\n padding: 12px;\n border-radius: 14px;\n border: 1px solid var(--ghsync-info-border);\n background: var(--ghsync-info-bg);\n color: var(--ghsync-info-text);\n font-size: 12px;\n line-height: 1.5;\n }\n\n .ghsync-issue-detail {\n display: grid;\n gap: 16px;\n color: var(--ghsync-text);\n font-family: ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n }\n\n .ghsync-issue-detail__intro,\n .ghsync-issue-detail__section {\n display: grid;\n gap: 8px;\n }\n\n .ghsync-issue-detail__intro {\n padding-bottom: 12px;\n border-bottom: 1px solid var(--ghsync-border-soft);\n }\n\n .ghsync-issue-detail__section-heading {\n color: var(--ghsync-muted);\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n }\n\n .ghsync-issue-detail__title {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .ghsync-issue-detail__title h3 {\n margin: 0;\n }\n`;\n\nfunction createEmptyMapping(index: number): RepositoryMapping {\n return {\n id: `mapping-${index + 1}`,\n repositoryUrl: '',\n paperclipProjectName: ''\n };\n}\n\nfunction normalizePaperclipIssueStatus(value: unknown): PaperclipIssueStatus {\n return PAPERCLIP_STATUS_OPTIONS.some((option) => option.value === value)\n ? value as PaperclipIssueStatus\n : DEFAULT_ADVANCED_SETTINGS.defaultStatus;\n}\n\nfunction normalizeGitHubUsername(value: string): string | null {\n const trimmed = value.trim().replace(/^@+/, '').toLowerCase();\n return trimmed ? trimmed : null;\n}\n\nfunction normalizeIgnoredIssueAuthorUsernames(value: unknown): string[] {\n const rawEntries = Array.isArray(value)\n ? value\n : typeof value === 'string'\n ? value.split(/[\\s,]+/g)\n : [];\n\n return [...new Set(\n rawEntries\n .map((entry) => typeof entry === 'string' ? normalizeGitHubUsername(entry) : null)\n .filter((entry): entry is string => Boolean(entry))\n )];\n}\n\nfunction normalizeAdvancedSettings(value: unknown): GitHubSyncAdvancedSettings {\n if (!value || typeof value !== 'object') {\n return DEFAULT_ADVANCED_SETTINGS;\n }\n\n const record = value as Record<string, unknown>;\n const defaultAssigneeAgentId =\n typeof record.defaultAssigneeAgentId === 'string' && record.defaultAssigneeAgentId.trim()\n ? record.defaultAssigneeAgentId.trim()\n : undefined;\n\n return {\n ...(defaultAssigneeAgentId ? { defaultAssigneeAgentId } : {}),\n defaultStatus: normalizePaperclipIssueStatus(record.defaultStatus),\n ignoredIssueAuthorUsernames:\n 'ignoredIssueAuthorUsernames' in record\n ? normalizeIgnoredIssueAuthorUsernames(record.ignoredIssueAuthorUsernames)\n : DEFAULT_ADVANCED_SETTINGS.ignoredIssueAuthorUsernames\n };\n}\n\nfunction getComparableMappings(mappings: RepositoryMapping[]): RepositoryMapping[] {\n return mappings\n .map((mapping, index) => ({\n id: mapping.id.trim() || `mapping-${index + 1}`,\n repositoryUrl: mapping.repositoryUrl.trim(),\n paperclipProjectName: mapping.paperclipProjectName.trim(),\n paperclipProjectId: mapping.paperclipProjectId,\n companyId: mapping.companyId\n }))\n .filter((mapping) => mapping.repositoryUrl !== '' || mapping.paperclipProjectName !== '');\n}\n\nfunction getComparableAdvancedSettings(value: GitHubSyncAdvancedSettings | null | undefined): GitHubSyncAdvancedSettings {\n const settings = normalizeAdvancedSettings(value);\n\n return {\n ...(settings.defaultAssigneeAgentId ? { defaultAssigneeAgentId: settings.defaultAssigneeAgentId } : {}),\n defaultStatus: settings.defaultStatus,\n ignoredIssueAuthorUsernames: [...settings.ignoredIssueAuthorUsernames].sort((left, right) => left.localeCompare(right))\n };\n}\n\nfunction formatAssigneeOptionLabel(option: GitHubSyncAssigneeOption): string {\n return option.title?.trim()\n ? `${option.name} (${option.title.trim()})`\n : option.name;\n}\n\nfunction getAvailableAssigneeOptions(\n options: GitHubSyncAssigneeOption[] | null | undefined,\n selectedAgentId?: string\n): GitHubSyncAssigneeOption[] {\n const normalizedOptions = [...(options ?? [])];\n\n if (selectedAgentId && !normalizedOptions.some((option) => option.id === selectedAgentId)) {\n normalizedOptions.push({\n id: selectedAgentId,\n name: 'Unavailable agent'\n });\n }\n\n return normalizedOptions;\n}\n\nfunction formatAdvancedSettingsSummary(\n advancedSettings: GitHubSyncAdvancedSettings,\n availableAssignees: GitHubSyncAssigneeOption[]\n): string {\n const assigneeLabel = advancedSettings.defaultAssigneeAgentId\n ? formatAssigneeOptionLabel(\n availableAssignees.find((option) => option.id === advancedSettings.defaultAssigneeAgentId)\n ?? {\n id: advancedSettings.defaultAssigneeAgentId,\n name: 'Unavailable agent'\n }\n )\n : 'Unassigned';\n const statusLabel =\n PAPERCLIP_STATUS_OPTIONS.find((option) => option.value === advancedSettings.defaultStatus)?.label\n ?? 'Backlog';\n const ignoredAuthorsLabel =\n advancedSettings.ignoredIssueAuthorUsernames.length > 0\n ? advancedSettings.ignoredIssueAuthorUsernames.join(', ')\n : 'none';\n\n return `Assignee: ${assigneeLabel} \u00B7 Status: ${statusLabel} \u00B7 Ignore: ${ignoredAuthorsLabel}`;\n}\n\ninterface SettingsSelectOption {\n value: string;\n label: string;\n tone?: SelectTone;\n icon?: 'agent';\n}\n\nfunction PickerChevronIcon(): React.JSX.Element {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M4 6.5L8 10.5L12 6.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nfunction PickerCheckIcon(): React.JSX.Element {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3.75 8.25L6.5 11L12.25 5.25\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nfunction AgentIcon(): React.JSX.Element {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M8 1.75L8.96 4.31L11.5 5.25L8.96 6.19L8 8.75L7.04 6.19L4.5 5.25L7.04 4.31L8 1.75Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.15\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12.25 8.75L12.77 10.23L14.25 10.75L12.77 11.27L12.25 12.75L11.73 11.27L10.25 10.75L11.73 10.23L12.25 8.75Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.15\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M4.25 9.75L4.64 10.86L5.75 11.25L4.64 11.64L4.25 12.75L3.86 11.64L2.75 11.25L3.86 10.86L4.25 9.75Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.15\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction SettingsAssigneePicker(props: {\n id: string;\n value: string;\n options: SettingsSelectOption[];\n disabled?: boolean;\n onChange: (value: string) => void;\n}): React.JSX.Element {\n const { id, value, options, disabled, onChange } = props;\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const rootRef = useRef<HTMLDivElement | null>(null);\n const searchInputRef = useRef<HTMLInputElement | null>(null);\n const selectedOption = options.find((option) => option.value === value) ?? options[0];\n const normalizedQuery = query.trim().toLowerCase();\n const filteredOptions = normalizedQuery\n ? options.filter((option) => option.label.toLowerCase().includes(normalizedQuery))\n : options;\n\n useEffect(() => {\n if (!open) {\n setQuery('');\n return;\n }\n\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target;\n if (target instanceof Node && rootRef.current?.contains(target)) {\n return;\n }\n\n setOpen(false);\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setOpen(false);\n }\n };\n\n document.addEventListener('pointerdown', handlePointerDown);\n document.addEventListener('keydown', handleKeyDown);\n\n globalThis.setTimeout(() => {\n searchInputRef.current?.focus();\n searchInputRef.current?.select();\n }, 0);\n\n return () => {\n document.removeEventListener('pointerdown', handlePointerDown);\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [open]);\n\n useEffect(() => {\n if (disabled && open) {\n setOpen(false);\n }\n }, [disabled, open]);\n\n return (\n <div className=\"ghsync__picker\" ref={rootRef}>\n <button\n id={id}\n type=\"button\"\n className=\"ghsync__picker-trigger ghsync__picker-trigger--assignee\"\n disabled={disabled}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n onClick={() => {\n if (disabled) {\n return;\n }\n\n setOpen((current) => !current);\n }}\n >\n <span className=\"ghsync__picker-trigger-main\">\n {selectedOption?.icon === 'agent' ? (\n <span className=\"ghsync__picker-agent-icon\" aria-hidden=\"true\">\n <AgentIcon />\n </span>\n ) : null}\n <span className=\"ghsync__picker-trigger-label\">{selectedOption?.label ?? 'No assignee'}</span>\n </span>\n <span className=\"ghsync__picker-trigger-icon\">\n <PickerChevronIcon />\n </span>\n </button>\n\n {open ? (\n <div className=\"ghsync__picker-panel ghsync__picker-panel--assignee\" role=\"dialog\" aria-label=\"Choose default assignee\">\n <div className=\"ghsync__picker-search\">\n <input\n ref={searchInputRef}\n type=\"text\"\n className=\"ghsync__picker-search-input\"\n placeholder=\"Search assignees...\"\n value={query}\n onChange={(event) => {\n setQuery(event.currentTarget.value);\n }}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n setOpen(false);\n }\n }}\n />\n </div>\n\n <div className=\"ghsync__picker-list\" role=\"listbox\" aria-labelledby={id}>\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option) => {\n const selected = option.value === value;\n\n return (\n <button\n key={option.value || '__unassigned'}\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n className={`ghsync__picker-option${selected ? ' ghsync__picker-option--selected' : ''}`}\n onClick={() => {\n onChange(option.value);\n setOpen(false);\n }}\n >\n <span className=\"ghsync__picker-trigger-main\">\n {option.icon === 'agent' ? (\n <span className=\"ghsync__picker-agent-icon\" aria-hidden=\"true\">\n <AgentIcon />\n </span>\n ) : null}\n <span className=\"ghsync__picker-option-label\">{option.label}</span>\n </span>\n <span className=\"ghsync__picker-option-check\" aria-hidden=\"true\">\n {selected ? <PickerCheckIcon /> : null}\n </span>\n </button>\n );\n })\n ) : (\n <div className=\"ghsync__picker-empty\">No assignees match.</div>\n )}\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction SettingsStatusPicker(props: {\n id: string;\n value: string;\n options: SettingsSelectOption[];\n disabled?: boolean;\n onChange: (value: string) => void;\n}): React.JSX.Element {\n const { id, value, options, disabled, onChange } = props;\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement | null>(null);\n const selectedOption = options.find((option) => option.value === value) ?? options[0];\n\n useEffect(() => {\n if (!open) {\n return;\n }\n\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target;\n if (target instanceof Node && rootRef.current?.contains(target)) {\n return;\n }\n\n setOpen(false);\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setOpen(false);\n }\n };\n\n document.addEventListener('pointerdown', handlePointerDown);\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('pointerdown', handlePointerDown);\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [open]);\n\n useEffect(() => {\n if (disabled && open) {\n setOpen(false);\n }\n }, [disabled, open]);\n\n return (\n <div className=\"ghsync__picker\" ref={rootRef}>\n <button\n id={id}\n type=\"button\"\n className=\"ghsync__picker-trigger ghsync__picker-trigger--status\"\n disabled={disabled}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n onClick={() => {\n if (disabled) {\n return;\n }\n\n setOpen((current) => !current);\n }}\n >\n <span className=\"ghsync__picker-trigger-main\">\n <span\n className={`ghsync__select-dot ghsync__select-dot--${selectedOption?.tone ?? 'neutral'}`}\n aria-hidden=\"true\"\n />\n <span className=\"ghsync__picker-trigger-label\">{selectedOption?.label ?? 'Backlog'}</span>\n </span>\n </button>\n\n {open ? (\n <div className=\"ghsync__picker-panel ghsync__picker-panel--status\" role=\"dialog\" aria-label=\"Choose default status\">\n <div className=\"ghsync__picker-list\" role=\"listbox\" aria-labelledby={id}>\n {options.map((option) => {\n const selected = option.value === value;\n\n return (\n <button\n key={option.value}\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n className={`ghsync__picker-option${selected ? ' ghsync__picker-option--selected' : ''}`}\n onClick={() => {\n onChange(option.value);\n setOpen(false);\n }}\n >\n <span className=\"ghsync__picker-trigger-main\">\n <span\n className={`ghsync__select-dot ghsync__select-dot--${option.tone ?? 'neutral'}`}\n aria-hidden=\"true\"\n />\n <span className=\"ghsync__picker-option-label\">{option.label}</span>\n </span>\n <span className=\"ghsync__picker-option-check\" aria-hidden=\"true\">\n {selected ? <PickerCheckIcon /> : null}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction normalizeScheduleFrequencyMinutes(value: unknown): number {\n const numericValue =\n typeof value === 'number'\n ? value\n : typeof value === 'string'\n ? Number(value.trim())\n : NaN;\n\n if (!Number.isFinite(numericValue) || numericValue < 1) {\n return DEFAULT_SCHEDULE_FREQUENCY_MINUTES;\n }\n\n return Math.floor(numericValue);\n}\n\nfunction parseScheduleFrequencyDraft(value: string): number | null {\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n\n const numericValue = Number(trimmed);\n if (!Number.isFinite(numericValue) || numericValue < 1 || !Number.isInteger(numericValue)) {\n return null;\n }\n\n return numericValue;\n}\n\nfunction getScheduleFrequencyError(value: string): string | null {\n const trimmed = value.trim();\n if (!trimmed) {\n return 'Enter a whole number of minutes.';\n }\n\n const numericValue = Number(trimmed);\n if (!Number.isFinite(numericValue) || numericValue < 1 || !Number.isInteger(numericValue)) {\n return 'Enter a whole number of minutes greater than 0.';\n }\n\n return null;\n}\n\nfunction formatScheduleFrequency(minutes: number): string {\n const normalizedMinutes = normalizeScheduleFrequencyMinutes(minutes);\n return `every ${normalizedMinutes} minute${normalizedMinutes === 1 ? '' : 's'}`;\n}\n\nfunction formatProjectNameFromRepository(repositoryInput: string): string {\n const parsedRepository = parseRepositoryReference(repositoryInput);\n const repositoryName = parsedRepository?.repo\n ?? repositoryInput.trim().replace(/\\/+$/, '').split('/').pop()?.replace(/\\.git$/i, '')\n ?? '';\n\n if (!repositoryName) {\n return '';\n }\n\n return repositoryName\n .split(/[-_.]+/)\n .map((segment) => segment.trim())\n .filter((segment) => segment.length > 0)\n .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1))\n .join(' ');\n}\n\nfunction shouldAutofillProjectName(mapping: RepositoryMapping): boolean {\n if (mapping.paperclipProjectId) {\n return false;\n }\n\n const currentProjectName = mapping.paperclipProjectName.trim();\n if (!currentProjectName) {\n return true;\n }\n\n const previousSuggestedProjectName = formatProjectNameFromRepository(mapping.repositoryUrl);\n return previousSuggestedProjectName !== '' && currentProjectName === previousSuggestedProjectName;\n}\n\nfunction getPaperclipApiBaseUrl(): string | undefined {\n if (typeof window === 'undefined' || !window.location?.origin) {\n return undefined;\n }\n\n return window.location.origin;\n}\n\nconst syncedPaperclipApiBaseUrlsByPluginId = new Map<string, string>();\nlet installedGitHubSyncPluginIdPromise: Promise<string | null> | null = null;\n\nasync function resolveCurrentPluginId(pluginId: string | null): Promise<string | null> {\n if (pluginId) {\n return pluginId;\n }\n\n if (!installedGitHubSyncPluginIdPromise) {\n installedGitHubSyncPluginIdPromise = fetchJson<unknown>('/api/plugins')\n .then((records) => resolveInstalledGitHubSyncPluginId(records))\n .catch(() => null);\n }\n\n const resolvedPluginId = await installedGitHubSyncPluginIdPromise;\n if (!resolvedPluginId) {\n installedGitHubSyncPluginIdPromise = null;\n }\n\n return resolvedPluginId;\n}\n\nasync function syncTrustedPaperclipApiBaseUrl(pluginId: string | null): Promise<string | undefined> {\n const paperclipApiBaseUrl = getPaperclipApiBaseUrl();\n if (!paperclipApiBaseUrl) {\n return undefined;\n }\n\n const resolvedPluginId = await resolveCurrentPluginId(pluginId);\n if (!resolvedPluginId) {\n throw new Error(\n 'Unable to sync the trusted Paperclip API origin because the plugin ID is missing. Reload the plugin and try again before saving or syncing.'\n );\n }\n\n const lastSyncedPaperclipApiBaseUrl = syncedPaperclipApiBaseUrlsByPluginId.get(resolvedPluginId);\n if (lastSyncedPaperclipApiBaseUrl === paperclipApiBaseUrl) {\n return paperclipApiBaseUrl;\n }\n\n await patchPluginConfig(resolvedPluginId, {\n paperclipApiBaseUrl\n });\n syncedPaperclipApiBaseUrlsByPluginId.set(resolvedPluginId, paperclipApiBaseUrl);\n\n return paperclipApiBaseUrl;\n}\n\nfunction formatDate(value?: string, fallback = 'Never'): string {\n if (!value) {\n return fallback;\n }\n\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return fallback;\n }\n\n return parsed.toLocaleString();\n}\n\nfunction getPluginIdFromLocation(): string | null {\n if (typeof window === 'undefined') {\n return null;\n }\n\n const parts = window.location.pathname.split('/').filter(Boolean);\n const pluginsIndex = parts.indexOf('plugins');\n if (pluginsIndex === -1 || pluginsIndex + 1 >= parts.length) {\n return null;\n }\n\n return parts[pluginsIndex + 1] ?? null;\n}\n\nfunction getThemeMode(): ThemeMode {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return 'dark';\n }\n\n const root = document.documentElement;\n const body = document.body;\n const candidates = [root, body].filter((node): node is HTMLElement => Boolean(node));\n\n for (const node of candidates) {\n const attrTheme = node.getAttribute('data-theme') || node.getAttribute('data-color-mode') || node.getAttribute('data-mode');\n if (attrTheme === 'light' || attrTheme === 'dark') {\n return attrTheme;\n }\n\n if (node.classList.contains('light')) {\n return 'light';\n }\n\n if (node.classList.contains('dark')) {\n return 'dark';\n }\n }\n\n const colorScheme = window.getComputedStyle(body).colorScheme || window.getComputedStyle(root).colorScheme;\n if (colorScheme === 'light' || colorScheme === 'dark') {\n return colorScheme;\n }\n\n return window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark';\n}\n\nfunction useResolvedThemeMode(): ThemeMode {\n const [themeMode, setThemeMode] = useState<ThemeMode>(() => getThemeMode());\n\n useEffect(() => {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return;\n }\n\n const matcher = window.matchMedia('(prefers-color-scheme: light)');\n const handleChange = () => {\n setThemeMode(getThemeMode());\n };\n\n handleChange();\n matcher.addEventListener('change', handleChange);\n\n const observer = new MutationObserver(handleChange);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class', 'data-theme', 'data-color-mode', 'data-mode']\n });\n observer.observe(document.body, {\n attributes: true,\n attributeFilter: ['class', 'data-theme', 'data-color-mode', 'data-mode']\n });\n\n return () => {\n matcher.removeEventListener('change', handleChange);\n observer.disconnect();\n };\n }, []);\n\n return themeMode;\n}\n\nasync function resolveOrCreateProject(companyId: string, projectName: string): Promise<{ id: string; name: string }> {\n const projects = await listCompanyProjects(companyId);\n const existing = projects.find((project) => project.name.trim().toLowerCase() === projectName.trim().toLowerCase());\n if (existing) {\n return existing;\n }\n\n return fetchJson<{ id: string; name: string }>(`/api/companies/${companyId}/projects`, {\n method: 'POST',\n body: JSON.stringify({\n name: projectName.trim(),\n status: 'planned'\n })\n });\n}\n\nasync function listCompanyProjects(companyId: string): Promise<Array<{ id: string; name: string }>> {\n const response = await fetchJson<unknown>(`/api/companies/${companyId}/projects`);\n if (!Array.isArray(response)) {\n throw new Error(`Unexpected projects response for company ${companyId}: expected an array.`);\n }\n\n return response\n .map((entry) => {\n if (!entry || typeof entry !== 'object') {\n return null;\n }\n\n const record = entry as Record<string, unknown>;\n const id = typeof record.id === 'string' ? record.id.trim() : '';\n const name = typeof record.name === 'string' ? record.name.trim() : '';\n return id && name ? { id, name } : null;\n })\n .filter((entry): entry is { id: string; name: string } => entry !== null);\n}\n\nasync function listCompanyAssigneeOptions(companyId: string): Promise<GitHubSyncAssigneeOption[]> {\n return normalizeCompanyAssigneeOptionsResponse(\n await fetchJson<unknown>(`/api/companies/${companyId}/agents`)\n );\n}\n\nasync function listProjectWorkspaces(projectId: string): Promise<ProjectWorkspaceSummary[]> {\n const response = await fetchJson<unknown>(`/api/projects/${projectId}/workspaces`);\n if (!Array.isArray(response)) {\n throw new Error(`Unexpected project workspaces response for project ${projectId}: expected an array.`);\n }\n\n const workspaces: ProjectWorkspaceSummary[] = [];\n for (const entry of response) {\n if (!entry || typeof entry !== 'object') {\n continue;\n }\n\n const record = entry as Record<string, unknown>;\n workspaces.push({\n repoUrl: typeof record.repoUrl === 'string' ? record.repoUrl : null,\n sourceType: typeof record.sourceType === 'string' ? record.sourceType : null,\n isPrimary: record.isPrimary === true\n });\n }\n\n return workspaces;\n}\n\nasync function loadExistingProjectSyncCandidates(companyId: string): Promise<ExistingProjectSyncCandidate[]> {\n const projects = await listCompanyProjects(companyId);\n const workspacesByProjectId = Object.fromEntries(\n await Promise.all(\n projects.map(async (project): Promise<[string, ProjectWorkspaceSummary[]]> => [\n project.id,\n await listProjectWorkspaces(project.id)\n ])\n )\n ) as Record<string, ProjectWorkspaceSummary[]>;\n\n return discoverExistingProjectSyncCandidates({\n projects,\n workspacesByProjectId\n });\n}\n\nasync function ensureProjectRepoBinding(projectId: string, repositoryUrl: string): Promise<void> {\n const parsedRepository = parseRepositoryReference(repositoryUrl);\n const normalizedRepositoryUrl = parsedRepository?.url ?? repositoryUrl.trim();\n\n try {\n const workspaces = await listProjectWorkspaces(projectId);\n const alreadyBound = workspaces.some((workspace) => {\n if (typeof workspace.repoUrl !== 'string' || !workspace.repoUrl.trim()) {\n return false;\n }\n\n const normalizedWorkspaceRepositoryUrl = parseRepositoryReference(workspace.repoUrl)?.url ?? workspace.repoUrl.trim();\n return normalizedWorkspaceRepositoryUrl === normalizedRepositoryUrl;\n });\n\n if (alreadyBound) {\n return;\n }\n } catch {\n // Fall back to attempting the create call when workspace listing is unavailable.\n }\n\n await fetchJson(`/api/projects/${projectId}/workspaces`, {\n method: 'POST',\n body: JSON.stringify({\n repoUrl: normalizedRepositoryUrl,\n sourceType: 'git_repo',\n isPrimary: true\n })\n });\n}\n\nasync function resolveOrCreateCompanySecret(companyId: string, name: string, value: string): Promise<{ id: string; name: string }> {\n const existingSecrets = await fetchJson<Array<{ id: string; name: string }>>(`/api/companies/${companyId}/secrets`);\n const existing = existingSecrets.find((secret) => secret.name.trim().toLowerCase() === name.trim().toLowerCase());\n\n if (existing) {\n return fetchJson<{ id: string; name: string }>(`/api/secrets/${existing.id}/rotate`, {\n method: 'POST',\n body: JSON.stringify({\n value\n })\n });\n }\n\n return fetchJson<{ id: string; name: string }>(`/api/companies/${companyId}/secrets`, {\n method: 'POST',\n body: JSON.stringify({\n name,\n value\n })\n });\n}\n\nasync function patchPluginConfig(pluginId: string, patch: Record<string, unknown>): Promise<void> {\n const currentConfigResponse = await fetchJson<PluginConfigResponse | null>(`/api/plugins/${pluginId}/config`);\n const currentConfig = normalizePluginConfig(currentConfigResponse?.configJson);\n const nextConfig = mergePluginConfig(currentConfig, patch);\n\n if (JSON.stringify(nextConfig) === JSON.stringify(currentConfig)) {\n return;\n }\n\n await fetchJson(`/api/plugins/${pluginId}/config`, {\n method: 'POST',\n body: JSON.stringify({\n configJson: nextConfig\n })\n });\n}\n\nfunction normalizeCliAuthPollIntervalMs(value: unknown): number {\n if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0) {\n return CLI_AUTH_POLL_INTERVAL_FALLBACK_MS;\n }\n\n return Math.min(CLI_AUTH_POLL_INTERVAL_MAX_MS, Math.max(CLI_AUTH_POLL_INTERVAL_MIN_MS, Math.floor(value)));\n}\n\nfunction resolveCliAuthUrl(url?: string, path?: string): string | null {\n if (typeof url === 'string' && url.trim()) {\n return buildPaperclipUrl(url.trim());\n }\n\n if (typeof path !== 'string' || !path.trim()) {\n return null;\n }\n\n return buildPaperclipUrl(path.trim());\n}\n\nfunction getCliAuthIdentityLabel(identity: CliAuthIdentityResponse): string | null {\n const candidates = [\n identity.user?.displayName,\n identity.user?.name,\n identity.user?.login,\n identity.user?.email,\n identity.displayName,\n identity.name,\n identity.login,\n identity.email\n ];\n\n for (const candidate of candidates) {\n if (typeof candidate === 'string' && candidate.trim()) {\n return candidate.trim();\n }\n }\n\n return null;\n}\n\nfunction waitForDuration(durationMs: number): Promise<void> {\n return new Promise((resolve) => {\n globalThis.setTimeout(resolve, durationMs);\n });\n}\n\nasync function requestBoardAccessChallenge(companyId: string): Promise<CliAuthChallengeResponse> {\n return fetchJson<CliAuthChallengeResponse>('/api/cli-auth/challenges', {\n method: 'POST',\n body: JSON.stringify({\n command: 'paperclip plugin github-sync settings',\n clientName: 'GitHub Sync plugin',\n requestedAccess: 'board',\n requestedCompanyId: companyId\n })\n });\n}\n\nasync function waitForBoardAccessApproval(challenge: CliAuthChallengeResponse): Promise<string> {\n const challengeToken = typeof challenge.token === 'string' ? challenge.token.trim() : '';\n const pollUrl = resolveCliAuthPollUrl(challenge.pollUrl ?? challenge.pollPath);\n if (!challengeToken || !pollUrl) {\n throw new Error('Paperclip did not return a usable board access challenge.');\n }\n\n const expiresAtTimeMs = typeof challenge.expiresAt === 'string' ? Date.parse(challenge.expiresAt) : NaN;\n const pollIntervalMs = normalizeCliAuthPollIntervalMs(challenge.suggestedPollIntervalMs);\n\n while (true) {\n const pollUrlWithToken = new URL(pollUrl);\n pollUrlWithToken.searchParams.set('token', challengeToken);\n const pollResult = await fetchJson<CliAuthChallengePollResponse>(pollUrlWithToken.toString());\n const status = typeof pollResult.status === 'string' ? pollResult.status.trim().toLowerCase() : 'pending';\n\n if (status === 'approved') {\n const boardApiToken = typeof pollResult.boardApiToken === 'string' && pollResult.boardApiToken.trim()\n ? pollResult.boardApiToken.trim()\n : typeof challenge.boardApiToken === 'string' && challenge.boardApiToken.trim()\n ? challenge.boardApiToken.trim()\n : '';\n if (!boardApiToken) {\n throw new Error('Paperclip approved board access but did not return a usable API token.');\n }\n\n return boardApiToken;\n }\n\n if (status === 'cancelled') {\n throw new Error('Board access approval was cancelled.');\n }\n\n if (status === 'expired') {\n throw new Error('Board access approval expired. Start the connection flow again.');\n }\n\n if (Number.isFinite(expiresAtTimeMs) && Date.now() >= expiresAtTimeMs) {\n throw new Error('Board access approval expired. Start the connection flow again.');\n }\n\n await waitForDuration(pollIntervalMs);\n }\n}\n\nasync function fetchBoardAccessIdentity(boardApiToken: string): Promise<string | null> {\n const identity = await fetchJson<CliAuthIdentityResponse>('/api/cli-auth/me', {\n headers: {\n authorization: `Bearer ${boardApiToken.trim()}`\n }\n });\n\n return getCliAuthIdentityLabel(identity);\n}\n\nfunction getSyncStatus(syncState: SyncRunState, runningSync: boolean, syncUnlocked: boolean): { label: string; tone: Tone } {\n if (!syncUnlocked) {\n return { label: 'Locked', tone: 'neutral' };\n }\n\n if (runningSync || syncState.status === 'running') {\n return { label: 'Running', tone: 'info' };\n }\n\n if (getActiveRateLimitPause(syncState)) {\n return { label: 'Paused', tone: 'warning' };\n }\n\n if (syncState.status === 'error') {\n return { label: 'Needs attention', tone: 'danger' };\n }\n\n if (syncState.status === 'success') {\n return { label: 'Ready', tone: 'success' };\n }\n\n return { label: 'Ready', tone: 'info' };\n}\n\nfunction getToneClass(tone: Tone): string {\n switch (tone) {\n case 'success':\n return 'ghsync__badge--success';\n case 'warning':\n return 'ghsync__badge--warning';\n case 'info':\n return 'ghsync__badge--info';\n case 'danger':\n return 'ghsync__badge--danger';\n default:\n return 'ghsync__badge--neutral';\n }\n}\n\nconst SETTINGS_INDEX_HREF = '/instance/settings/plugins';\nconst GITHUB_SYNC_SETTINGS_UPDATED_EVENT = 'paperclip-github-plugin:settings-updated';\n\nfunction getStringValue(record: Record<string, unknown>, key: string): string | null {\n const value = record[key];\n return typeof value === 'string' && value.trim() ? value.trim() : null;\n}\n\nfunction isUuidLike(value: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value.trim());\n}\n\nfunction humanizeCompanyPrefix(value: string | null | undefined): string | null {\n if (typeof value !== 'string' || !value.trim()) {\n return null;\n }\n\n const trimmed = value.trim();\n if (isUuidLike(trimmed)) {\n return null;\n }\n\n return trimmed\n .replace(/[-_]+/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n .replace(/\\b\\w/g, (character) => character.toUpperCase());\n}\n\nfunction getCompanyLabelFromRecord(record: Record<string, unknown>): string | null {\n const explicitLabel =\n getStringValue(record, 'displayName')\n ?? getStringValue(record, 'name')\n ?? getStringValue(record, 'title');\n\n if (explicitLabel && !isUuidLike(explicitLabel)) {\n return explicitLabel;\n }\n\n return humanizeCompanyPrefix(\n getStringValue(record, 'companyPrefix')\n ?? getStringValue(record, 'prefix')\n ?? getStringValue(record, 'slug')\n );\n}\n\nasync function resolveCompanyScopeLabel(companyId: string, companyPrefix?: string | null): Promise<string | null> {\n try {\n const response = await fetchJson<unknown>(`/api/companies/${companyId}`);\n const record =\n response && typeof response === 'object'\n ? response as Record<string, unknown>\n : null;\n const directLabel = record ? getCompanyLabelFromRecord(record) : null;\n if (directLabel) {\n return directLabel;\n }\n\n const nestedCompany =\n record?.company && typeof record.company === 'object'\n ? record.company as Record<string, unknown>\n : null;\n const nestedLabel = nestedCompany ? getCompanyLabelFromRecord(nestedCompany) : null;\n if (nestedLabel) {\n return nestedLabel;\n }\n } catch {\n // Best-effort only. Fall through to other resolution paths.\n }\n\n try {\n const response = await fetchJson<unknown>('/api/companies');\n if (Array.isArray(response)) {\n const matchingCompany = response.find((entry) => {\n if (!entry || typeof entry !== 'object') {\n return false;\n }\n\n const record = entry as Record<string, unknown>;\n const entryId = getStringValue(record, 'id');\n const entryPrefix =\n getStringValue(record, 'companyPrefix')\n ?? getStringValue(record, 'prefix')\n ?? getStringValue(record, 'slug');\n\n return entryId === companyId || Boolean(companyPrefix && entryPrefix === companyPrefix);\n });\n\n if (matchingCompany && typeof matchingCompany === 'object') {\n const label = getCompanyLabelFromRecord(matchingCompany as Record<string, unknown>);\n if (label) {\n return label;\n }\n }\n }\n } catch {\n // Best-effort only. Fall through to the prefix fallback.\n }\n\n return humanizeCompanyPrefix(companyPrefix);\n}\n\nfunction useResolvedCompanyScopeLabel(companyId: string | null, companyPrefix: string | null): string | null {\n const prefixFallback = humanizeCompanyPrefix(companyPrefix);\n const [companyLabel, setCompanyLabel] = useState<string | null>(prefixFallback);\n\n useEffect(() => {\n if (!companyId) {\n setCompanyLabel(null);\n return;\n }\n\n setCompanyLabel(prefixFallback);\n let cancelled = false;\n\n void (async () => {\n const resolvedLabel = await resolveCompanyScopeLabel(companyId, companyPrefix);\n if (!cancelled) {\n setCompanyLabel(resolvedLabel ?? prefixFallback);\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [companyId, companyPrefix, prefixFallback]);\n\n return companyLabel;\n}\n\nfunction notifyGitHubSyncSettingsChanged(): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n window.dispatchEvent(new CustomEvent(GITHUB_SYNC_SETTINGS_UPDATED_EVENT));\n}\n\nfunction getIssueIdentifierFromLocation(pathname: string): string | null {\n const match = pathname.match(/\\/issues\\/([^/?#]+)/i);\n if (!match?.[1]) {\n return null;\n }\n\n try {\n return decodeURIComponent(match[1]);\n } catch {\n return match[1];\n }\n}\n\nfunction useResolvedIssueId(params: {\n companyId?: string | null;\n projectId?: string | null;\n entityId?: string | null;\n entityType?: string | null;\n}): {\n issueId: string | null;\n issueIdentifier: string | null;\n loading: boolean;\n} {\n const pathname = typeof window === 'undefined' ? '' : window.location.pathname;\n const issueIdentifier = params.entityType === 'issue' ? getIssueIdentifierFromLocation(pathname) : null;\n const resolution = usePluginData<IssueIdentifierResolutionData | null>('issue.resolveByIdentifier', {\n ...(params.companyId && issueIdentifier ? { companyId: params.companyId } : {}),\n ...(params.projectId && issueIdentifier ? { projectId: params.projectId } : {}),\n ...(issueIdentifier ? { issueIdentifier } : {})\n });\n\n useEffect(() => {\n if (!params.companyId || !issueIdentifier) {\n return;\n }\n\n try {\n resolution.refresh();\n } catch {\n return;\n }\n }, [issueIdentifier, params.companyId, params.projectId, resolution.refresh]);\n\n if (issueIdentifier) {\n return {\n issueId: resolution.data?.issueId ?? null,\n issueIdentifier,\n loading: resolution.loading && !resolution.data\n };\n }\n\n return {\n issueId: params.entityId ?? null,\n issueIdentifier: null,\n loading: false\n };\n}\n\nfunction formatSyncProgressRepository(repositoryUrl?: string): string | null {\n if (!repositoryUrl?.trim()) {\n return null;\n }\n\n const parsed = parseRepositoryReference(repositoryUrl);\n if (parsed) {\n return `${parsed.owner}/${parsed.repo}`;\n }\n\n return repositoryUrl.trim();\n}\n\nfunction getRunningSyncProgressModel(syncState: SyncRunState): {\n title: string;\n description: string;\n repositoryLabel?: string;\n repositoryPosition?: string;\n issueProgressLabel?: string;\n currentIssueLabel?: string;\n completedIssueCount?: number;\n totalIssueCount?: number;\n percent: number | null;\n indeterminate: boolean;\n} | null {\n if (syncState.status !== 'running') {\n return null;\n }\n\n const progress = syncState.progress;\n const repositoryLabel = formatSyncProgressRepository(progress?.currentRepositoryUrl) ?? undefined;\n const repositoryPosition =\n progress?.currentRepositoryIndex && progress.totalRepositoryCount\n ? `Repository ${progress.currentRepositoryIndex} of ${progress.totalRepositoryCount}`\n : progress?.totalRepositoryCount\n ? `${progress.totalRepositoryCount} ${progress.totalRepositoryCount === 1 ? 'repository' : 'repositories'}`\n : undefined;\n const completedIssueCount =\n typeof progress?.completedIssueCount === 'number' ? Math.max(0, progress.completedIssueCount) : undefined;\n const totalIssueCount =\n typeof progress?.totalIssueCount === 'number' ? Math.max(0, progress.totalIssueCount) : undefined;\n const detailLabel = progress?.detailLabel?.trim() ? progress.detailLabel.trim() : undefined;\n const indeterminate = totalIssueCount === undefined;\n const percent =\n totalIssueCount === undefined\n ? null\n : totalIssueCount === 0\n ? 100\n : Math.max(0, Math.min(100, ((completedIssueCount ?? 0) / totalIssueCount) * 100));\n const currentIssueLabel =\n progress?.currentIssueNumber !== undefined\n ? progress.phase === 'importing'\n ? `Importing GitHub issue #${progress.currentIssueNumber}`\n : progress.phase === 'syncing'\n ? `Syncing GitHub issue #${progress.currentIssueNumber}`\n : `Working on GitHub issue #${progress.currentIssueNumber}`\n : repositoryLabel\n ? `Current repository: ${repositoryLabel}`\n : undefined;\n\n switch (progress?.phase) {\n case 'importing': {\n const importingIssueProgressLabel =\n totalIssueCount !== undefined\n ? totalIssueCount === 0\n ? 'No issues to process'\n : `Processed ${Math.min(completedIssueCount ?? 0, totalIssueCount)} of ${totalIssueCount} issues`\n : detailLabel;\n return {\n title: repositoryLabel ? `Importing issues from ${repositoryLabel}` : 'Importing GitHub issues',\n description: repositoryLabel\n ? `Creating missing Paperclip issues and repairing existing imports from ${repositoryLabel}.`\n : 'Creating missing Paperclip issues and repairing existing imports.',\n ...(repositoryLabel ? { repositoryLabel } : {}),\n ...(repositoryPosition ? { repositoryPosition } : {}),\n ...(importingIssueProgressLabel ? { issueProgressLabel: importingIssueProgressLabel } : {}),\n ...(currentIssueLabel ? { currentIssueLabel } : {}),\n ...(completedIssueCount !== undefined ? { completedIssueCount } : {}),\n ...(totalIssueCount !== undefined ? { totalIssueCount } : {}),\n percent,\n indeterminate\n };\n }\n case 'syncing': {\n const syncingIssueProgressLabel =\n totalIssueCount !== undefined\n ? totalIssueCount === 0\n ? 'No issues to process'\n : `Processed ${Math.min(completedIssueCount ?? 0, totalIssueCount)} of ${totalIssueCount} issues`\n : detailLabel;\n return {\n title: repositoryLabel ? `Syncing ${repositoryLabel}` : 'Syncing Paperclip issue state',\n description: repositoryLabel\n ? `Updating labels, descriptions, and status for imported issues from ${repositoryLabel}.`\n : 'Updating labels, descriptions, and status for imported issues.',\n ...(repositoryLabel ? { repositoryLabel } : {}),\n ...(repositoryPosition ? { repositoryPosition } : {}),\n ...(syncingIssueProgressLabel ? { issueProgressLabel: syncingIssueProgressLabel } : {}),\n ...(currentIssueLabel ? { currentIssueLabel } : {}),\n ...(completedIssueCount !== undefined ? { completedIssueCount } : {}),\n ...(totalIssueCount !== undefined ? { totalIssueCount } : {}),\n percent,\n indeterminate\n };\n }\n default: {\n const preparingIssueProgressLabel =\n detailLabel ??\n (totalIssueCount !== undefined\n ? totalIssueCount === 0\n ? 'No issues to process'\n : `Found ${totalIssueCount} issues to sync`\n : completedIssueCount !== undefined\n ? `Scanned ${completedIssueCount} GitHub ${completedIssueCount === 1 ? 'issue' : 'issues'} so far`\n : undefined);\n return {\n title: repositoryLabel ? `Preparing ${repositoryLabel}` : 'Preparing GitHub sync',\n description:\n detailLabel ??\n (repositoryLabel\n ? `Calculating how many GitHub issues need to be synced for ${repositoryLabel}.`\n : 'Calculating how many GitHub issues need to be synced.'),\n ...(repositoryLabel ? { repositoryLabel } : {}),\n ...(repositoryPosition ? { repositoryPosition } : {}),\n ...(preparingIssueProgressLabel ? { issueProgressLabel: preparingIssueProgressLabel } : {}),\n ...(currentIssueLabel ? { currentIssueLabel } : {}),\n percent: null,\n indeterminate: true\n };\n }\n }\n}\n\nfunction getSyncMetricCards(params: {\n totalSyncedIssuesCount?: number;\n erroredIssuesCount?: number;\n syncState: SyncRunState;\n savedMappingCount: number;\n}): Array<{\n key: string;\n value: number;\n label: string;\n description: string;\n emphasized?: boolean;\n}> {\n const totalSyncedIssuesCount = Math.max(0, params.totalSyncedIssuesCount ?? 0);\n const erroredIssuesCount = Math.max(0, params.erroredIssuesCount ?? 0);\n\n return [\n {\n key: 'total-synced',\n value: totalSyncedIssuesCount,\n label: 'Total issues synced',\n description:\n totalSyncedIssuesCount > 0\n ? 'Across all mapped repositories.'\n : params.savedMappingCount > 0\n ? 'No issues imported yet.'\n : 'Add a repository to start syncing.'\n },\n {\n key: 'errored',\n value: erroredIssuesCount,\n label: 'Issues errored',\n description:\n params.syncState.status === 'running'\n ? erroredIssuesCount > 0\n ? 'Detected so far in this run.'\n : 'No issue errors detected yet.'\n : params.syncState.checkedAt\n ? erroredIssuesCount > 0\n ? 'From the latest sync run.'\n : 'No errors in the latest sync run.'\n : 'No sync run yet.',\n emphasized: erroredIssuesCount > 0\n }\n ];\n}\n\nfunction getDashboardSummary(params: {\n syncIssue: SyncConfigurationIssue | null;\n hasCompanyContext: boolean;\n syncState: SyncRunState;\n runningSync: boolean;\n scheduleFrequencyMinutes: number;\n}): { label: string; tone: Tone; title: string; body: string } {\n const cadence = formatScheduleFrequency(params.scheduleFrequencyMinutes);\n const activeRateLimitPause = getActiveRateLimitPause(params.syncState);\n const rateLimitResourceLabel = getGitHubRateLimitResourceLabel(activeRateLimitPause?.resource);\n\n switch (params.syncIssue) {\n case 'missing_token':\n return {\n label: 'Setup required',\n tone: 'warning',\n title: 'Finish setup to start syncing',\n body: 'Open settings to validate GitHub access and configure your first repository.'\n };\n case 'missing_mapping':\n return {\n label: 'Setup required',\n tone: 'warning',\n title: 'Add your first repository',\n body: 'Open settings to connect one repository to a Paperclip project.'\n };\n case 'missing_board_access':\n return {\n label: 'Board access required',\n tone: 'warning',\n title: 'Connect Paperclip board access',\n body: params.hasCompanyContext\n ? 'This Paperclip deployment requires board access before worker-side sync can use local REST endpoints.'\n : 'Open plugin settings inside a company to connect required Paperclip board access for this deployment.'\n };\n }\n\n if (params.runningSync || params.syncState.status === 'running') {\n const progress = getRunningSyncProgressModel(params.syncState);\n return {\n label: 'Syncing',\n tone: 'info',\n title: progress?.title ?? 'Sync in progress',\n body: progress?.description ?? 'GitHub issues are being checked right now. This card refreshes automatically until the run finishes.'\n };\n }\n\n if (activeRateLimitPause) {\n return {\n label: 'Paused',\n tone: 'warning',\n title: 'GitHub sync paused by rate limit',\n body: `${rateLimitResourceLabel ?? 'GitHub'} rate limiting paused sync until ${formatDate(activeRateLimitPause.resetAt, activeRateLimitPause.resetAt)}.`\n };\n }\n\n if (params.syncState.status === 'error') {\n return {\n label: 'Needs attention',\n tone: 'danger',\n title: 'Last sync needs attention',\n body: params.syncState.message ?? 'Open settings to review the latest GitHub sync issue.'\n };\n }\n\n if (params.syncState.checkedAt) {\n return {\n label: 'Ready',\n tone: params.syncState.status === 'success' ? 'success' : 'info',\n title: 'GitHub sync activity',\n body: params.syncState.message ?? `Automatic sync runs ${cadence}.`\n };\n }\n\n return {\n label: 'Ready',\n tone: 'info',\n title: 'Ready for first sync',\n body: `Your repository mapping is in place. Automatic sync runs ${cadence}.`\n };\n}\n\nfunction buildThemeVars(theme: ThemePalette, themeMode: ThemeMode): React.CSSProperties {\n return {\n colorScheme: themeMode,\n ['--ghsync-text' as string]: theme.text,\n ['--ghsync-title' as string]: theme.title,\n ['--ghsync-muted' as string]: theme.muted,\n ['--ghsync-surface' as string]: theme.surface,\n ['--ghsync-surfaceAlt' as string]: theme.surfaceAlt,\n ['--ghsync-surfaceRaised' as string]: theme.surfaceRaised,\n ['--ghsync-border' as string]: theme.border,\n ['--ghsync-border-soft' as string]: theme.borderSoft,\n ['--ghsync-input-bg' as string]: theme.inputBg,\n ['--ghsync-input-border' as string]: theme.inputBorder,\n ['--ghsync-input-text' as string]: theme.inputText,\n ['--ghsync-badge-bg' as string]: theme.badgeBg,\n ['--ghsync-badge-border' as string]: theme.badgeBorder,\n ['--ghsync-badge-text' as string]: theme.badgeText,\n ['--ghsync-primaryBg' as string]: theme.primaryBg,\n ['--ghsync-primaryBorder' as string]: theme.primaryBorder,\n ['--ghsync-primaryText' as string]: theme.primaryText,\n ['--ghsync-secondaryBg' as string]: theme.secondaryBg,\n ['--ghsync-secondaryBorder' as string]: theme.secondaryBorder,\n ['--ghsync-secondaryText' as string]: theme.secondaryText,\n ['--ghsync-dangerBg' as string]: theme.dangerBg,\n ['--ghsync-dangerBorder' as string]: theme.dangerBorder,\n ['--ghsync-dangerText' as string]: theme.dangerText,\n ['--ghsync-danger-bg' as string]: theme.dangerBg,\n ['--ghsync-danger-border' as string]: theme.dangerBorder,\n ['--ghsync-danger-text' as string]: theme.dangerText,\n ['--ghsync-success-bg' as string]: theme.successBg,\n ['--ghsync-success-border' as string]: theme.successBorder,\n ['--ghsync-success-text' as string]: theme.successText,\n ['--ghsync-warning-bg' as string]: theme.warningBg,\n ['--ghsync-warning-border' as string]: theme.warningBorder,\n ['--ghsync-warning-text' as string]: theme.warningText,\n ['--ghsync-info-bg' as string]: theme.infoBg,\n ['--ghsync-info-border' as string]: theme.infoBorder,\n ['--ghsync-info-text' as string]: theme.infoText,\n ['--ghsync-shadow' as string]: theme.shadow\n } as React.CSSProperties;\n}\n\nfunction formatGitHubRepositoryLabel(repositoryUrl: string): string {\n return repositoryUrl.replace(/^https:\\/\\/github\\.com\\//, '');\n}\n\nfunction formatGitHubIssueState(state?: 'open' | 'closed', reason?: 'completed' | 'not_planned' | 'duplicate'): string {\n if (!state) {\n return 'Pending refresh';\n }\n\n if (state !== 'closed') {\n return 'Open';\n }\n\n switch (reason) {\n case 'duplicate':\n return 'Closed as duplicate';\n case 'not_planned':\n return 'Closed as not planned';\n default:\n return 'Closed';\n }\n}\n\nfunction formatSyncFailurePhase(phase?: SyncFailurePhase): string | null {\n switch (phase) {\n case 'configuration':\n return 'Checking sync configuration';\n case 'loading_paperclip_labels':\n return 'Loading Paperclip labels';\n case 'listing_github_issues':\n return 'Listing GitHub issues';\n case 'building_import_plan':\n return 'Building the GitHub import plan';\n case 'importing_issue':\n return 'Importing a GitHub issue';\n case 'syncing_labels':\n return 'Syncing issue labels';\n case 'syncing_description':\n return 'Syncing issue descriptions';\n case 'evaluating_github_status':\n return 'Checking GitHub review and CI status';\n case 'updating_paperclip_status':\n return 'Updating Paperclip issue status';\n default:\n return null;\n }\n}\n\nfunction formatSyncFailureRepository(repositoryUrl?: string): string | null {\n if (!repositoryUrl?.trim()) {\n return null;\n }\n\n const parsed = parseRepositoryReference(repositoryUrl);\n if (parsed) {\n return `${parsed.owner}/${parsed.repo}`;\n }\n\n return repositoryUrl.trim();\n}\n\nfunction getSyncDiagnostics(syncState: SyncRunState): {\n rows: Array<{ label: string; value: string }>;\n rawMessage?: string;\n suggestedAction?: string;\n} | null {\n if (syncState.status !== 'error') {\n return null;\n }\n\n const rows: Array<{ label: string; value: string }> = [];\n const repositoryLabel = formatSyncFailureRepository(syncState.errorDetails?.repositoryUrl);\n const phaseLabel = formatSyncFailurePhase(syncState.errorDetails?.phase);\n const issueNumber = syncState.errorDetails?.githubIssueNumber;\n const rateLimitResetAt = syncState.errorDetails?.rateLimitResetAt;\n const rateLimitResourceLabel = getGitHubRateLimitResourceLabel(syncState.errorDetails?.rateLimitResource);\n\n if (repositoryLabel) {\n rows.push({\n label: 'Repository',\n value: repositoryLabel\n });\n }\n\n if (issueNumber !== undefined) {\n rows.push({\n label: 'GitHub issue',\n value: `#${issueNumber}`\n });\n }\n\n if (phaseLabel) {\n rows.push({\n label: 'Failed while',\n value: phaseLabel\n });\n }\n\n if (rateLimitResourceLabel) {\n rows.push({\n label: 'GitHub bucket',\n value: rateLimitResourceLabel\n });\n }\n\n if (rateLimitResetAt) {\n rows.push({\n label: 'Paused until',\n value: formatDate(rateLimitResetAt, rateLimitResetAt)\n });\n }\n\n const rawMessage =\n syncState.errorDetails?.rawMessage && syncState.errorDetails.rawMessage !== syncState.message\n ? syncState.errorDetails.rawMessage\n : undefined;\n const suggestedAction = syncState.errorDetails?.suggestedAction;\n\n if (rows.length === 0 && !rawMessage && !suggestedAction) {\n return null;\n }\n\n return {\n rows,\n ...(rawMessage ? { rawMessage } : {}),\n ...(suggestedAction ? { suggestedAction } : {})\n };\n}\n\nfunction SyncProgressPanel(props: {\n syncState: SyncRunState;\n compact?: boolean;\n}): React.JSX.Element | null {\n const progress = getRunningSyncProgressModel(props.syncState);\n const progressValueText = progress?.issueProgressLabel ?? progress?.description;\n\n if (!progress) {\n return null;\n }\n\n const progressFillWidth =\n progress.indeterminate || progress.percent === null\n ? undefined\n : `${progress.percent > 0 ? Math.max(progress.percent, 3) : 0}%`;\n\n return (\n <section\n className={`ghsync-progress${props.compact ? ' ghsync-progress--compact' : ''}`}\n aria-live=\"polite\"\n >\n <div className=\"ghsync-progress__header\">\n <div className=\"ghsync-progress__copy\">\n <strong>{progress.title}</strong>\n <span>{progress.description}</span>\n </div>\n {progress.repositoryPosition ? <span className=\"ghsync-progress__pill\">{progress.repositoryPosition}</span> : null}\n </div>\n\n <div\n className=\"ghsync-progress__track\"\n role=\"progressbar\"\n aria-label={progress.title}\n aria-valuemin={0}\n aria-valuemax={progress.totalIssueCount}\n aria-valuenow={progress.indeterminate ? undefined : progress.completedIssueCount}\n aria-valuetext={progressValueText}\n >\n <div\n className={`ghsync-progress__fill${progress.indeterminate ? ' ghsync-progress__fill--indeterminate' : ''}`}\n style={progressFillWidth ? { width: progressFillWidth } : undefined}\n />\n </div>\n\n <div className=\"ghsync-progress__meta\">\n <span>{progress.issueProgressLabel ?? 'Calculating the total number of issues to sync.'}</span>\n <span>{progress.currentIssueLabel ?? progress.repositoryLabel ?? 'GitHub sync is running.'}</span>\n </div>\n </section>\n );\n}\n\nfunction SyncDiagnosticsPanel(props: {\n syncState: SyncRunState;\n requestError?: string | null;\n compact?: boolean;\n}): React.JSX.Element | null {\n const diagnostics = getSyncDiagnostics(props.syncState);\n const requestError = props.requestError?.trim() ? props.requestError.trim() : null;\n\n if (!diagnostics && !requestError) {\n return null;\n }\n\n return (\n <section className={`ghsync-diagnostics${props.compact ? ' ghsync-diagnostics--compact' : ''}`}>\n <div className=\"ghsync-diagnostics__header\">\n <strong>{diagnostics ? 'Troubleshooting details' : 'Sync request failed'}</strong>\n <span>\n {diagnostics\n ? 'GitHub Sync saved this snapshot from the latest failed run.'\n : 'The sync request failed before the worker returned a saved result.'}\n </span>\n </div>\n\n {requestError ? (\n <div className=\"ghsync-diagnostics__block\">\n <span className=\"ghsync-diagnostics__label\">Request error</span>\n <div className=\"ghsync-diagnostics__value ghsync-diagnostics__value--code\">{requestError}</div>\n </div>\n ) : null}\n\n {diagnostics?.rows.length ? (\n <div className=\"ghsync-diagnostics__grid\">\n {diagnostics.rows.map((row) => (\n <div key={row.label} className=\"ghsync-diagnostics__item\">\n <span className=\"ghsync-diagnostics__label\">{row.label}</span>\n <strong className=\"ghsync-diagnostics__value\">{row.value}</strong>\n </div>\n ))}\n </div>\n ) : null}\n\n {diagnostics?.rawMessage ? (\n <div className=\"ghsync-diagnostics__block\">\n <span className=\"ghsync-diagnostics__label\">Raw error</span>\n <div className=\"ghsync-diagnostics__value ghsync-diagnostics__value--code\">{diagnostics.rawMessage}</div>\n </div>\n ) : null}\n\n {diagnostics?.suggestedAction ? (\n <div className=\"ghsync-diagnostics__block\">\n <span className=\"ghsync-diagnostics__label\">Next step</span>\n <div className=\"ghsync-diagnostics__value\">{diagnostics.suggestedAction}</div>\n </div>\n ) : null}\n </section>\n );\n}\n\nexport function GitHubSyncSettingsPage(): React.JSX.Element {\n const hostContext = useHostContext();\n const toast = usePluginToast();\n const pluginIdFromLocation = getPluginIdFromLocation();\n const settings = usePluginData<GitHubSyncSettings>(\n 'settings.registration',\n hostContext.companyId ? { companyId: hostContext.companyId, includeAssignees: true } : {}\n );\n const saveRegistration = usePluginAction('settings.saveRegistration');\n const updateBoardAccess = usePluginAction('settings.updateBoardAccess');\n const validateToken = usePluginAction('settings.validateToken');\n const runSyncNow = usePluginAction('sync.runNow');\n const [form, setForm] = useState<GitHubSyncSettings>(EMPTY_SETTINGS);\n const [submittingToken, setSubmittingToken] = useState(false);\n const [connectingBoardAccess, setConnectingBoardAccess] = useState(false);\n const [submittingSetup, setSubmittingSetup] = useState(false);\n const [runningSync, setRunningSync] = useState(false);\n const [manualSyncRequestError, setManualSyncRequestError] = useState<string | null>(null);\n const [scheduleFrequencyDraft, setScheduleFrequencyDraft] = useState(String(DEFAULT_SCHEDULE_FREQUENCY_MINUTES));\n const [ignoredAuthorsDraft, setIgnoredAuthorsDraft] = useState(DEFAULT_ADVANCED_SETTINGS.ignoredIssueAuthorUsernames.join(', '));\n const [tokenStatusOverride, setTokenStatusOverride] = useState<TokenStatus | null>(null);\n const [validatedLogin, setValidatedLogin] = useState<string | null>(null);\n const [boardAccessIdentity, setBoardAccessIdentity] = useState<string | null>(null);\n const [tokenDraft, setTokenDraft] = useState('');\n const [showSavedTokenHint, setShowSavedTokenHint] = useState(false);\n const [showTokenEditor, setShowTokenEditor] = useState(false);\n const [showAdvancedSettings, setShowAdvancedSettings] = useState(false);\n const [cachedSettings, setCachedSettings] = useState<GitHubSyncSettings | null>(null);\n const [existingProjectCandidates, setExistingProjectCandidates] = useState<ExistingProjectSyncCandidate[]>([]);\n const [existingProjectCandidatesLoading, setExistingProjectCandidatesLoading] = useState(false);\n const [existingProjectCandidatesError, setExistingProjectCandidatesError] = useState<string | null>(null);\n const [browserAvailableAssignees, setBrowserAvailableAssignees] = useState<GitHubSyncAssigneeOption[]>([]);\n const themeMode = useResolvedThemeMode();\n const boardAccessRequirement = usePaperclipBoardAccessRequirement();\n const armSyncCompletionToast = useSyncCompletionToast(form.syncState, toast);\n const boardAccessConfigSyncAttemptRef = useRef<string | null>(null);\n const assigneeFallbackAttemptRef = useRef<string | null>(null);\n\n const currentSettings = settings.data ?? cachedSettings;\n const showInitialLoadingState = settings.loading && !settings.data && !cachedSettings;\n\n useEffect(() => {\n if (settings.data) {\n setCachedSettings(settings.data);\n }\n }, [settings.data]);\n\n useEffect(() => {\n if (!settings.data) {\n return;\n }\n\n const nextScheduleFrequencyMinutes = normalizeScheduleFrequencyMinutes(settings.data.scheduleFrequencyMinutes);\n setForm({\n mappings: settings.data.mappings ?? [],\n syncState: settings.data.syncState ?? { status: 'idle' },\n scheduleFrequencyMinutes: nextScheduleFrequencyMinutes,\n advancedSettings: normalizeAdvancedSettings(settings.data.advancedSettings),\n availableAssignees: settings.data.availableAssignees ?? [],\n paperclipApiBaseUrl: settings.data.paperclipApiBaseUrl,\n githubTokenConfigured: settings.data.githubTokenConfigured,\n paperclipBoardAccessConfigured: settings.data.paperclipBoardAccessConfigured,\n totalSyncedIssuesCount: settings.data.totalSyncedIssuesCount,\n updatedAt: settings.data.updatedAt\n });\n setScheduleFrequencyDraft(String(nextScheduleFrequencyMinutes));\n setIgnoredAuthorsDraft(normalizeAdvancedSettings(settings.data.advancedSettings).ignoredIssueAuthorUsernames.join(', '));\n setTokenDraft('');\n if (!settings.data.paperclipBoardAccessConfigured) {\n setBoardAccessIdentity(null);\n }\n\n if (settings.data.githubTokenConfigured) {\n setShowSavedTokenHint(true);\n setShowTokenEditor(false);\n setTokenStatusOverride('valid');\n } else if (!showSavedTokenHint) {\n setShowTokenEditor(true);\n setValidatedLogin(null);\n }\n }, [settings.data, showSavedTokenHint]);\n\n useEffect(() => {\n const companyId = hostContext.companyId;\n if (!companyId || tokenStatusOverride === 'invalid') {\n setExistingProjectCandidates([]);\n setExistingProjectCandidatesLoading(false);\n setExistingProjectCandidatesError(null);\n return;\n }\n\n let cancelled = false;\n setExistingProjectCandidatesLoading(true);\n setExistingProjectCandidatesError(null);\n\n void (async () => {\n try {\n const candidates = await loadExistingProjectSyncCandidates(companyId);\n if (cancelled) {\n return;\n }\n\n setExistingProjectCandidates(candidates);\n } catch (error) {\n if (cancelled) {\n return;\n }\n\n setExistingProjectCandidates([]);\n setExistingProjectCandidatesError(\n error instanceof Error\n ? error.message\n : 'GitHub Sync could not inspect existing GitHub-linked projects in this company.'\n );\n } finally {\n if (!cancelled) {\n setExistingProjectCandidatesLoading(false);\n }\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [hostContext.companyId, settings.data?.updatedAt, tokenStatusOverride]);\n\n useEffect(() => {\n const companyId = hostContext.companyId;\n const workerAvailableAssignees = currentSettings?.availableAssignees ?? [];\n const snapshotKey = `${companyId ?? 'none'}:${currentSettings?.updatedAt ?? 'none'}`;\n\n if (!companyId) {\n assigneeFallbackAttemptRef.current = null;\n setBrowserAvailableAssignees([]);\n return;\n }\n\n if (workerAvailableAssignees.length > 0) {\n assigneeFallbackAttemptRef.current = snapshotKey;\n setBrowserAvailableAssignees([]);\n return;\n }\n\n if (assigneeFallbackAttemptRef.current === snapshotKey) {\n return;\n }\n\n assigneeFallbackAttemptRef.current = snapshotKey;\n\n let cancelled = false;\n\n void (async () => {\n try {\n const assignees = await listCompanyAssigneeOptions(companyId);\n if (cancelled) {\n return;\n }\n\n setBrowserAvailableAssignees(assignees);\n } catch {\n if (cancelled) {\n return;\n }\n\n setBrowserAvailableAssignees([]);\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [currentSettings?.availableAssignees?.length, currentSettings?.updatedAt, hostContext.companyId]);\n\n useEffect(() => {\n const companyId = hostContext.companyId;\n const secretRef =\n settings.data?.paperclipBoardAccessNeedsConfigSync\n ? settings.data.paperclipBoardAccessConfigSyncRef\n : undefined;\n\n if (!companyId || !secretRef) {\n return;\n }\n\n const attemptKey = `${companyId}:${secretRef}`;\n if (boardAccessConfigSyncAttemptRef.current === attemptKey) {\n return;\n }\n boardAccessConfigSyncAttemptRef.current = attemptKey;\n\n let cancelled = false;\n\n void (async () => {\n try {\n const pluginId = await resolveCurrentPluginId(pluginIdFromLocation);\n if (!pluginId) {\n throw new Error('Plugin id is required to finish syncing Paperclip board access into plugin config.');\n }\n\n await patchPluginConfig(pluginId, {\n paperclipBoardApiTokenRefs: {\n [companyId]: secretRef\n }\n });\n\n if (cancelled) {\n return;\n }\n\n notifyGitHubSyncSettingsChanged();\n\n try {\n await settings.refresh();\n } catch {\n return;\n }\n } catch (error) {\n if (cancelled) {\n return;\n }\n\n toast({\n title: 'Paperclip board access needs reconnection',\n body:\n error instanceof Error\n ? error.message\n : 'GitHub Sync could not finish migrating the saved Paperclip board access secret into plugin config.',\n tone: 'error'\n });\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [\n hostContext.companyId,\n pluginIdFromLocation,\n settings.data?.paperclipBoardAccessNeedsConfigSync,\n settings.data?.paperclipBoardAccessConfigSyncRef,\n settings.refresh,\n toast\n ]);\n\n useEffect(() => {\n const hasSavedToken = Boolean(form.githubTokenConfigured || showSavedTokenHint);\n const tokenStatus = tokenStatusOverride ?? (hasSavedToken ? 'valid' : 'required');\n if (!hostContext.companyId || tokenStatus !== 'valid' || form.mappings.length > 0) {\n return;\n }\n\n setForm((current) => ({\n ...current,\n mappings: [createEmptyMapping(0)]\n }));\n }, [form.githubTokenConfigured, form.mappings.length, hostContext.companyId, showSavedTokenHint, tokenStatusOverride]);\n\n useEffect(() => {\n if (form.syncState.status !== 'running') {\n return;\n }\n\n const refreshSettings = () => {\n try {\n settings.refresh();\n } catch {\n return;\n }\n };\n\n const intervalId = globalThis.setInterval(() => {\n refreshSettings();\n }, SYNC_POLL_INTERVAL_MS);\n\n refreshSettings();\n\n return () => {\n globalThis.clearInterval(intervalId);\n };\n }, [form.syncState.status, settings.refresh]);\n\n const theme = themeMode === 'light' ? LIGHT_PALETTE : DARK_PALETTE;\n const themeVars = buildThemeVars(theme, themeMode);\n const hasCompanyContext = Boolean(hostContext.companyId);\n const companyScopeLabel = useResolvedCompanyScopeLabel(hostContext.companyId, hostContext.companyPrefix);\n const currentCompanyName = companyScopeLabel ?? 'this company';\n const headerDescription = hasCompanyContext ? '' : 'Select a company.';\n const hasSavedToken = Boolean(form.githubTokenConfigured || showSavedTokenHint);\n const boardAccessConfigured = Boolean(form.paperclipBoardAccessConfigured);\n const boardAccessRequired = boardAccessRequirement.required;\n const boardAccessReady = !boardAccessRequired || (hasCompanyContext && boardAccessConfigured);\n const tokenStatus = tokenStatusOverride ?? (hasSavedToken ? 'valid' : 'required');\n const tokenTone: Tone = tokenStatus === 'valid' ? 'success' : tokenStatus === 'invalid' ? 'danger' : 'warning';\n const tokenBannerLabel = tokenStatus === 'valid' ? 'Token valid' : tokenStatus === 'invalid' ? 'Token invalid' : 'Token required';\n const tokenBadgeLabel = tokenStatus === 'valid' ? 'Valid' : tokenStatus === 'invalid' ? 'Invalid' : 'Required';\n const tokenStatusDescription =\n tokenStatus === 'invalid'\n ? 'GitHub rejected the last token.'\n : tokenStatus === 'required'\n ? 'Add a token.'\n : 'Shared token.';\n const tokenDescription = tokenStatusDescription;\n const boardAccessTone: Tone =\n connectingBoardAccess\n ? 'info'\n : boardAccessConfigured\n ? 'success'\n : boardAccessRequired\n ? 'warning'\n : 'info';\n const boardAccessBannerLabel =\n connectingBoardAccess\n ? 'Connecting'\n : boardAccessConfigured\n ? 'Connected'\n : boardAccessRequired\n ? 'Required'\n : boardAccessRequirement.status === 'loading'\n ? 'Checking'\n : 'Optional';\n const boardAccessSectionDescription = '';\n const repositoriesUnlocked = tokenStatus === 'valid';\n const availableAssignees = getAvailableAssigneeOptions(\n (currentSettings?.availableAssignees?.length ? currentSettings.availableAssignees : null)\n ?? (form.availableAssignees?.length ? form.availableAssignees : null)\n ?? browserAvailableAssignees,\n form.advancedSettings.defaultAssigneeAgentId\n );\n const savedMappingsSource = currentSettings ? currentSettings.mappings ?? [] : form.mappings;\n const savedMappings = getComparableMappings(savedMappingsSource);\n const draftMappings = getComparableMappings(form.mappings);\n const savedAdvancedSettings = getComparableAdvancedSettings(currentSettings?.advancedSettings);\n const draftAdvancedSettings = getComparableAdvancedSettings(form.advancedSettings);\n const savedMappingCount = savedMappings.length;\n const availableExistingProjectCandidates = filterExistingProjectSyncCandidates(existingProjectCandidates, form.mappings);\n const repositoriesSectionDescription = '';\n const syncSetupIssue = getSyncSetupIssue({\n tokenStatus,\n savedMappingCount,\n boardAccessRequired,\n boardAccessConfigured,\n hasCompanyContext\n });\n const syncUnlocked = syncSetupIssue === null;\n const syncSetupMessage = getSyncSetupMessage(syncSetupIssue, hasCompanyContext);\n const displaySyncState = getDisplaySyncState(form.syncState, {\n hasToken: tokenStatus === 'valid',\n hasMappings: savedMappingCount > 0,\n hasBoardAccess: boardAccessReady\n });\n const mappingsDirty = JSON.stringify(draftMappings) !== JSON.stringify(savedMappings);\n const advancedSettingsDirty = JSON.stringify(draftAdvancedSettings) !== JSON.stringify(savedAdvancedSettings);\n const scheduleFrequencyError = getScheduleFrequencyError(scheduleFrequencyDraft);\n const scheduleFrequencyMinutes = parseScheduleFrequencyDraft(scheduleFrequencyDraft) ?? form.scheduleFrequencyMinutes;\n const savedScheduleFrequencyMinutes = normalizeScheduleFrequencyMinutes(currentSettings?.scheduleFrequencyMinutes);\n const scheduleDirty = scheduleFrequencyError === null && scheduleFrequencyMinutes !== savedScheduleFrequencyMinutes;\n const mappings = form.mappings.length > 0 ? form.mappings : [createEmptyMapping(0)];\n const syncInFlight = runningSync || displaySyncState.status === 'running';\n const settingsMutationsLocked = syncInFlight;\n const settingsMutationsLockReason = settingsMutationsLocked\n ? 'Settings are temporarily locked while a sync is running to avoid overwriting local edits.'\n : null;\n const syncStatus = getSyncStatus(displaySyncState, runningSync, syncUnlocked);\n const canSaveToken =\n hasCompanyContext &&\n !settingsMutationsLocked &&\n !submittingToken &&\n !showInitialLoadingState &&\n tokenDraft.trim().length > 0;\n const canSaveSetup =\n hasCompanyContext &&\n repositoriesUnlocked &&\n !settingsMutationsLocked &&\n !submittingSetup &&\n !showInitialLoadingState &&\n scheduleFrequencyError === null &&\n (mappingsDirty || advancedSettingsDirty || scheduleDirty);\n const canConnectBoardAccess =\n hasCompanyContext &&\n !settingsMutationsLocked &&\n !connectingBoardAccess &&\n !showInitialLoadingState;\n const boardAccessStatusLabel =\n !hasCompanyContext\n ? 'Unavailable'\n : boardAccessBannerLabel;\n const boardAccessStatusTone: Tone =\n !hasCompanyContext\n ? boardAccessRequired\n ? 'warning'\n : 'neutral'\n : boardAccessTone;\n const boardAccessSummaryText =\n !hasCompanyContext\n ? boardAccessRequired\n ? 'Select a company.'\n : 'Select a company.'\n : connectingBoardAccess\n ? 'Approval in progress.'\n : boardAccessConfigured\n ? 'Connected.'\n : boardAccessRequired\n ? 'Required for sync.'\n : boardAccessRequirement.status === 'loading'\n ? 'Checking requirement.'\n : 'Optional.';\n const showTokenForm = tokenStatus !== 'valid' || showTokenEditor;\n const lastUpdated = formatDate(form.updatedAt ?? currentSettings?.updatedAt, 'Not saved yet');\n const lastSync = formatDate(displaySyncState.checkedAt, 'Never');\n const scheduleDescription = formatScheduleFrequency(scheduleFrequencyMinutes);\n const syncProgress = getRunningSyncProgressModel(displaySyncState);\n const syncMetricCards = getSyncMetricCards({\n totalSyncedIssuesCount: currentSettings?.totalSyncedIssuesCount ?? form.totalSyncedIssuesCount,\n erroredIssuesCount: displaySyncState.erroredIssuesCount,\n syncState: displaySyncState,\n savedMappingCount\n });\n const syncSectionDescription = '';\n const syncSummaryPrimaryText =\n syncProgress?.title ??\n displaySyncState.message ??\n (syncUnlocked ? 'Ready to sync.' : syncSetupMessage);\n const manualSyncScopeSummary = hasCompanyContext\n ? `Manual sync: ${currentCompanyName}`\n : 'Manual sync: all companies';\n const syncSummarySecondaryText = syncProgress\n ? [\n manualSyncScopeSummary,\n syncProgress.issueProgressLabel,\n syncProgress.currentIssueLabel ?? syncProgress.repositoryPosition,\n `Auto-sync: ${scheduleDescription}`\n ].filter((value): value is string => Boolean(value))\n .join(' \u00B7 ')\n : `${manualSyncScopeSummary} \u00B7 Auto-sync: ${scheduleDescription} \u00B7 Last trigger: ${displaySyncState.lastRunTrigger ?? 'none'} \u00B7 Last checked: ${displaySyncState.checkedAt ? formatDate(displaySyncState.checkedAt) : 'never'}`;\n const syncSummaryClass =\n syncStatus.tone === 'success'\n ? 'ghsync__sync-summary ghsync__sync-summary--success'\n : syncStatus.tone === 'danger'\n ? 'ghsync__sync-summary ghsync__sync-summary--danger'\n : 'ghsync__sync-summary ghsync__sync-summary--info';\n const manualSyncScopePillClass = hasCompanyContext\n ? 'ghsync__scope-pill ghsync__scope-pill--company'\n : 'ghsync__scope-pill ghsync__scope-pill--mixed';\n const manualSyncScopePillLabel = hasCompanyContext ? 'This company' : 'All companies';\n const manualSyncButtonLabel = hasCompanyContext ? 'Run sync for this company' : 'Run sync across all companies';\n const advancedSettingsSummary = formatAdvancedSettingsSummary(form.advancedSettings, availableAssignees);\n const assigneeSelectOptions: SettingsSelectOption[] = [\n { value: '', label: 'Unassigned' },\n ...availableAssignees.map((option) => ({\n value: option.id,\n label: formatAssigneeOptionLabel(option),\n icon: 'agent' as const\n }))\n ];\n const statusSelectOptions: SettingsSelectOption[] = PAPERCLIP_STATUS_OPTIONS.map((option) => ({\n value: option.value,\n label: option.label,\n tone: option.tone\n }));\n useEffect(() => {\n if (advancedSettingsDirty) {\n setShowAdvancedSettings(true);\n }\n }, [advancedSettingsDirty]);\n\n function updateMapping(mappingId: string, field: keyof RepositoryMapping, value: string) {\n setForm((current) => {\n const hasMapping = current.mappings.some((mapping) => mapping.id === mappingId);\n const nextMappings = hasMapping\n ? current.mappings\n : [\n ...current.mappings,\n {\n ...createEmptyMapping(current.mappings.length),\n id: mappingId\n }\n ];\n\n return {\n ...current,\n mappings: nextMappings.map((mapping) => {\n if (mapping.id !== mappingId) {\n return mapping;\n }\n\n if (field === 'repositoryUrl') {\n return {\n ...mapping,\n repositoryUrl: value,\n ...(shouldAutofillProjectName(mapping)\n ? { paperclipProjectName: formatProjectNameFromRepository(value) }\n : {})\n };\n }\n\n return {\n ...mapping,\n [field]: value\n };\n })\n };\n });\n }\n\n function addMapping() {\n setForm((current) => ({\n ...current,\n mappings: [...current.mappings, createEmptyMapping(current.mappings.length)]\n }));\n }\n\n function addExistingProjectCandidate(candidate: ExistingProjectSyncCandidate) {\n setForm((current) => {\n const emptyMappingIndex = current.mappings.findIndex((mapping) =>\n !mapping.repositoryUrl.trim() && !mapping.paperclipProjectName.trim() && !mapping.paperclipProjectId\n );\n const nextMapping = {\n ...(emptyMappingIndex === -1 ? createEmptyMapping(current.mappings.length) : current.mappings[emptyMappingIndex]),\n repositoryUrl: candidate.repositoryUrl,\n paperclipProjectName: candidate.projectName,\n paperclipProjectId: candidate.projectId,\n companyId: hostContext.companyId ?? undefined\n };\n\n if (emptyMappingIndex === -1) {\n return {\n ...current,\n mappings: [...current.mappings, nextMapping]\n };\n }\n\n return {\n ...current,\n mappings: current.mappings.map((mapping, index) => index === emptyMappingIndex ? nextMapping : mapping)\n };\n });\n }\n\n function removeMapping(mappingId: string) {\n setForm((current) => {\n const remaining = current.mappings.filter((mapping) => mapping.id !== mappingId);\n return {\n ...current,\n mappings: remaining.length > 0 ? remaining : [createEmptyMapping(0)]\n };\n });\n }\n\n async function handleSaveToken(event: React.FormEvent<HTMLFormElement>) {\n event.preventDefault();\n setSubmittingToken(true);\n\n let validation: TokenValidationResult;\n\n try {\n const trimmedToken = tokenDraft.trim();\n if (!trimmedToken) {\n throw new Error('Enter a GitHub token.');\n }\n\n validation = await validateToken({\n token: trimmedToken\n }) as TokenValidationResult;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'GitHub rejected this token.';\n if (!hasSavedToken) {\n setTokenStatusOverride('invalid');\n }\n setValidatedLogin(null);\n\n toast({\n title: 'GitHub token invalid',\n body: message,\n tone: 'error'\n });\n setSubmittingToken(false);\n return;\n }\n\n try {\n const companyId = hostContext.companyId;\n if (!companyId) {\n throw new Error('Company context is required to save the GitHub token.');\n }\n\n const pluginId = await resolveCurrentPluginId(pluginIdFromLocation);\n if (!pluginId) {\n throw new Error('Plugin id is required to save the GitHub token.');\n }\n\n const trimmedToken = tokenDraft.trim();\n\n const secretName = `github_sync_${companyId.replace(/[^a-z0-9]+/gi, '_').toLowerCase()}`;\n const secret = await resolveOrCreateCompanySecret(companyId, secretName, trimmedToken);\n\n await patchPluginConfig(pluginId, {\n githubTokenRef: secret.id\n });\n await saveRegistration({\n companyId,\n githubTokenRef: secret.id\n });\n\n setForm((current) => ({\n ...current,\n githubTokenConfigured: true\n }));\n setShowSavedTokenHint(true);\n setShowTokenEditor(false);\n setTokenStatusOverride('valid');\n setValidatedLogin(validation.login);\n setTokenDraft('');\n toast({\n title: `Authenticated as ${validation.login}`,\n body: 'Token saved.',\n tone: 'success'\n });\n notifyGitHubSyncSettingsChanged();\n\n try {\n await settings.refresh();\n } catch {\n return;\n }\n } catch (error) {\n toast({\n title: 'GitHub token could not be saved',\n body: error instanceof Error ? error.message : 'Paperclip could not save the validated token.',\n tone: 'error'\n });\n } finally {\n setSubmittingToken(false);\n }\n }\n\n async function handleConnectBoardAccess() {\n setConnectingBoardAccess(true);\n let approvalWindow: Window | null = null;\n\n try {\n const companyId = hostContext.companyId;\n if (!companyId) {\n throw new Error('Company context is required to connect Paperclip board access.');\n }\n\n const pluginId = await resolveCurrentPluginId(pluginIdFromLocation);\n if (!pluginId) {\n throw new Error('Plugin id is required to connect Paperclip board access.');\n }\n\n if (typeof window !== 'undefined') {\n approvalWindow = window.open('about:blank', '_blank');\n }\n\n const challenge = await requestBoardAccessChallenge(companyId);\n const approvalUrl = resolveCliAuthUrl(challenge.approvalUrl, challenge.approvalPath);\n if (!approvalUrl) {\n throw new Error('Paperclip did not return a board approval URL.');\n }\n\n if (!approvalWindow && typeof window !== 'undefined') {\n approvalWindow = window.open(approvalUrl, '_blank');\n } else {\n approvalWindow?.location.replace(approvalUrl);\n }\n\n if (!approvalWindow) {\n throw new Error('Allow pop-ups for Paperclip, then try connecting board access again.');\n }\n\n const boardApiToken = await waitForBoardAccessApproval(challenge);\n const identity = await fetchBoardAccessIdentity(boardApiToken);\n const secretName = `paperclip_board_api_${companyId.replace(/[^a-z0-9]+/gi, '_').toLowerCase()}`;\n const secret = await resolveOrCreateCompanySecret(companyId, secretName, boardApiToken);\n\n await patchPluginConfig(pluginId, {\n paperclipBoardApiTokenRefs: {\n [companyId]: secret.id\n }\n });\n await updateBoardAccess({\n companyId,\n paperclipBoardApiTokenRef: secret.id\n });\n\n setBoardAccessIdentity(identity);\n setForm((current) => ({\n ...current,\n paperclipBoardAccessConfigured: true\n }));\n toast({\n title: identity ? `Paperclip board access connected as ${identity}` : 'Paperclip board access connected',\n body: 'Direct Paperclip REST calls can now authenticate in authenticated deployments.',\n tone: 'success'\n });\n notifyGitHubSyncSettingsChanged();\n\n try {\n await settings.refresh();\n } catch {\n return;\n }\n } catch (error) {\n toast({\n title: 'Paperclip board access could not be connected',\n body: error instanceof Error ? error.message : 'Unable to finish the Paperclip board access approval flow.',\n tone: 'error'\n });\n } finally {\n setConnectingBoardAccess(false);\n try {\n approvalWindow?.close();\n } catch {\n return;\n }\n }\n }\n\n async function handleSaveSetup(event: React.FormEvent<HTMLFormElement>) {\n event.preventDefault();\n setSubmittingSetup(true);\n\n try {\n const companyId = hostContext.companyId;\n if (!companyId) {\n throw new Error('Company context is required to save setup.');\n }\n\n if (tokenStatus !== 'valid') {\n throw new Error('Validate a GitHub token first.');\n }\n\n if (scheduleFrequencyError) {\n throw new Error(scheduleFrequencyError);\n }\n\n const resolvedMappings: RepositoryMapping[] = [];\n for (const mapping of form.mappings) {\n const repositoryInput = mapping.repositoryUrl.trim();\n const paperclipProjectName = mapping.paperclipProjectName.trim();\n\n if (!repositoryInput && !paperclipProjectName) {\n continue;\n }\n\n if (!repositoryInput || !paperclipProjectName) {\n throw new Error('Each repository needs both a GitHub repository and a Paperclip project name.');\n }\n\n const parsedRepository = parseRepositoryReference(repositoryInput);\n if (!parsedRepository) {\n throw new Error(`Invalid GitHub repository: ${repositoryInput}. Use owner/repo or https://github.com/owner/repo.`);\n }\n\n const project = mapping.paperclipProjectId && mapping.companyId === companyId\n ? { id: mapping.paperclipProjectId, name: paperclipProjectName }\n : await resolveOrCreateProject(companyId, paperclipProjectName);\n\n await ensureProjectRepoBinding(project.id, parsedRepository.url);\n\n resolvedMappings.push({\n ...mapping,\n repositoryUrl: parsedRepository.url,\n paperclipProjectName: project.name,\n paperclipProjectId: project.id,\n companyId\n });\n }\n\n const trustedPaperclipApiBaseUrl = await syncTrustedPaperclipApiBaseUrl(pluginIdFromLocation);\n const result = await saveRegistration({\n companyId,\n mappings: resolvedMappings,\n advancedSettings: draftAdvancedSettings,\n syncState: form.syncState,\n scheduleFrequencyMinutes,\n ...(trustedPaperclipApiBaseUrl ? { paperclipApiBaseUrl: trustedPaperclipApiBaseUrl } : {})\n }) as GitHubSyncSettings;\n\n setForm((current) => ({\n ...current,\n mappings: result.mappings.length > 0 ? result.mappings : [createEmptyMapping(0)],\n syncState: result.syncState,\n scheduleFrequencyMinutes: normalizeScheduleFrequencyMinutes(result.scheduleFrequencyMinutes),\n advancedSettings: normalizeAdvancedSettings(result.advancedSettings),\n availableAssignees: result.availableAssignees ?? current.availableAssignees,\n paperclipApiBaseUrl: result.paperclipApiBaseUrl,\n updatedAt: result.updatedAt\n }));\n setScheduleFrequencyDraft(String(normalizeScheduleFrequencyMinutes(result.scheduleFrequencyMinutes)));\n\n toast({\n title: 'GitHub sync setup saved',\n body: `Advanced defaults, mappings, and automatic sync are saved for ${currentCompanyName}.`,\n tone: 'success'\n });\n notifyGitHubSyncSettingsChanged();\n\n try {\n await settings.refresh();\n } catch {\n return;\n }\n } catch (error) {\n toast({\n title: 'Setup could not be saved',\n body: error instanceof Error ? error.message : 'Unable to save GitHub sync setup.',\n tone: 'error'\n });\n } finally {\n setSubmittingSetup(false);\n }\n }\n\n async function handleRunSyncNow() {\n setRunningSync(true);\n setManualSyncRequestError(null);\n\n try {\n if (!syncUnlocked) {\n throw new Error(syncSetupMessage);\n }\n\n const trustedPaperclipApiBaseUrl = await syncTrustedPaperclipApiBaseUrl(pluginIdFromLocation);\n const result = await runSyncNow({\n ...(hostContext.companyId ? { companyId: hostContext.companyId } : {}),\n ...(trustedPaperclipApiBaseUrl ? { paperclipApiBaseUrl: trustedPaperclipApiBaseUrl } : {})\n }) as GitHubSyncSettings;\n\n setForm((current) => ({\n ...current,\n syncState: result.syncState\n }));\n setManualSyncRequestError(null);\n\n toast({\n title: getSyncToastTitle(result.syncState),\n body: getSyncToastBody(result.syncState),\n tone: getSyncToastTone(result.syncState)\n });\n armSyncCompletionToast(result.syncState);\n\n try {\n await settings.refresh();\n } catch {\n return;\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unable to run sync.';\n setManualSyncRequestError(message);\n toast({\n title: 'Unable to run GitHub sync',\n body: message,\n tone: 'error'\n });\n\n try {\n await settings.refresh();\n } catch {\n return;\n }\n } finally {\n setRunningSync(false);\n }\n }\n\n return (\n <div className=\"ghsync\" style={themeVars}>\n <style>{PAGE_STYLES}</style>\n\n <section className=\"ghsync__header\">\n <div className=\"ghsync__header-copy\">\n <h2>GitHub Sync settings</h2>\n {headerDescription ? <p>{headerDescription}</p> : null}\n {settingsMutationsLockReason ? <p className=\"ghsync__hint\">{settingsMutationsLockReason}</p> : null}\n </div>\n <div className=\"ghsync__section-head-actions\">\n <span className={`ghsync__scope-pill ${hasCompanyContext ? 'ghsync__scope-pill--company' : 'ghsync__scope-pill--mixed'}`}>\n {hasCompanyContext ? currentCompanyName : 'No company'}\n </span>\n <span className=\"ghsync__scope-pill ghsync__scope-pill--global\">Shared</span>\n <span className={`ghsync__badge ${getToneClass(tokenTone)}`}>\n <span className=\"ghsync__badge-dot\" aria-hidden=\"true\" />\n {tokenBannerLabel}\n </span>\n </div>\n </section>\n\n <div className=\"ghsync__layout\">\n <section className=\"ghsync__card\">\n <div className=\"ghsync__card-header\">\n <h3>Settings</h3>\n <p>{hasCompanyContext ? currentCompanyName : 'Read-only.'}</p>\n </div>\n\n {showInitialLoadingState ? <p className=\"ghsync__loading\">Loading saved settings\u2026</p> : null}\n\n <section className=\"ghsync__section\">\n <div className=\"ghsync__section-head\">\n <div className=\"ghsync__section-copy\">\n <div className=\"ghsync__section-title-row\">\n <h4>GitHub access</h4>\n <div className=\"ghsync__section-tags\">\n <span className=\"ghsync__scope-pill ghsync__scope-pill--global\">Shared</span>\n </div>\n </div>\n <p>{tokenDescription}</p>\n </div>\n <span className={`ghsync__badge ${getToneClass(tokenTone)}`}>\n {tokenBadgeLabel}\n </span>\n </div>\n\n {!hasCompanyContext ? (\n <div className=\"ghsync__locked\">\n <div>\n <strong>{hasSavedToken ? 'Shared token ready' : 'Company required'}</strong>\n <span>\n {hasSavedToken\n ? 'Open a company to replace it.'\n : 'Open a company to save it.'}\n </span>\n </div>\n <span className=\"ghsync__badge ghsync__badge--neutral\">Read only</span>\n </div>\n ) : showTokenForm ? (\n <form className=\"ghsync__stack\" onSubmit={handleSaveToken}>\n <div className=\"ghsync__field\">\n <label htmlFor=\"github-token\">GitHub token</label>\n <input\n id=\"github-token\"\n className=\"ghsync__input\"\n type=\"password\"\n value={tokenDraft}\n disabled={settingsMutationsLocked}\n onChange={(event) => {\n setTokenDraft(event.currentTarget.value);\n setTokenStatusOverride(hasSavedToken ? 'valid' : null);\n }}\n placeholder=\"ghp_...\"\n autoComplete=\"new-password\"\n />\n </div>\n\n <div className=\"ghsync__actions\">\n <div className=\"ghsync__button-row\">\n {hasSavedToken ? (\n <button\n type=\"button\"\n className={getPluginActionClassName({ variant: 'secondary' })}\n disabled={settingsMutationsLocked}\n onClick={() => {\n setShowTokenEditor(false);\n setTokenDraft('');\n setTokenStatusOverride('valid');\n }}\n >\n Cancel\n </button>\n ) : null}\n <button\n type=\"submit\"\n className={getPluginActionClassName({ variant: 'primary' })}\n disabled={!canSaveToken}\n >\n {submittingToken ? 'Saving\u2026' : 'Save token'}\n </button>\n </div>\n </div>\n </form>\n ) : (\n <div className=\"ghsync__connected\">\n <div>\n <strong>{validatedLogin ? `Authenticated as ${validatedLogin}` : 'Shared token ready'}</strong>\n <span>Shared across all companies.</span>\n </div>\n <button\n type=\"button\"\n className={getPluginActionClassName({ variant: 'secondary' })}\n disabled={settingsMutationsLocked}\n onClick={() => {\n setShowTokenEditor(true);\n setTokenDraft('');\n setTokenStatusOverride('valid');\n }}\n >\n Replace token\n </button>\n </div>\n )}\n </section>\n\n <section className=\"ghsync__section\">\n <div className=\"ghsync__section-head\">\n <div className=\"ghsync__section-copy\">\n <div className=\"ghsync__section-title-row\">\n <h4>Paperclip board access</h4>\n <div className=\"ghsync__section-tags\">\n <span className=\"ghsync__scope-pill ghsync__scope-pill--company\">Company</span>\n </div>\n </div>\n {boardAccessSectionDescription ? <p>{boardAccessSectionDescription}</p> : null}\n </div>\n <span className={`ghsync__badge ${getToneClass(boardAccessTone)}`}>\n {boardAccessBannerLabel}\n </span>\n </div>\n\n {hostContext.companyId ? (\n <div className=\"ghsync__connected\">\n <div>\n <strong>\n {boardAccessConfigured\n ? boardAccessIdentity\n ? `Connected as ${boardAccessIdentity}`\n : 'Connected'\n : boardAccessRequired\n ? 'Required'\n : boardAccessRequirement.status === 'loading'\n ? 'Checking requirement'\n : 'Optional'}\n </strong>\n <span>\n {boardAccessConfigured\n ? 'Used for Paperclip API calls.'\n : boardAccessRequired\n ? 'Required in authenticated deployments.'\n : boardAccessRequirement.status === 'loading'\n ? 'Checking whether it is required.'\n : 'Only needed when Paperclip API calls require sign-in.'}\n </span>\n </div>\n <button\n type=\"button\"\n className={getPluginActionClassName({ variant: boardAccessConfigured ? 'secondary' : 'primary' })}\n disabled={!canConnectBoardAccess}\n onClick={() => {\n void handleConnectBoardAccess();\n }}\n >\n {connectingBoardAccess\n ? 'Waiting for approval\u2026'\n : boardAccessConfigured\n ? 'Reconnect'\n : 'Connect board access'}\n </button>\n </div>\n ) : (\n <div className=\"ghsync__locked\">\n <div>\n <strong>Company required</strong>\n <span>Open a company to connect it.</span>\n </div>\n <span className=\"ghsync__badge ghsync__badge--neutral\">Unavailable</span>\n </div>\n )}\n </section>\n\n <section className=\"ghsync__section\">\n <div className=\"ghsync__section-head\">\n <div className=\"ghsync__section-copy\">\n <div className=\"ghsync__section-title-row\">\n <h4>Repositories</h4>\n <div className=\"ghsync__section-tags\">\n <span className=\"ghsync__scope-pill ghsync__scope-pill--company\">Company</span>\n </div>\n </div>\n {repositoriesSectionDescription ? <p>{repositoriesSectionDescription}</p> : null}\n </div>\n <span className={`ghsync__badge ${getToneClass(!repositoriesUnlocked ? 'neutral' : savedMappingCount > 0 ? 'success' : 'info')}`}>\n {!repositoriesUnlocked\n ? 'Locked'\n : savedMappingCount > 0\n ? hasCompanyContext\n ? `${savedMappingCount} saved`\n : `${savedMappingCount} total`\n : 'Open'}\n </span>\n </div>\n\n {!hasCompanyContext ? (\n <div className=\"ghsync__locked\">\n <div>\n <strong>Company required</strong>\n <span>Open a company to edit repositories.</span>\n </div>\n <span className=\"ghsync__badge ghsync__badge--neutral\">Scoped</span>\n </div>\n ) : !repositoriesUnlocked ? (\n <div className=\"ghsync__locked\">\n <div>\n <strong>Repositories are locked</strong>\n <span>Add a valid token first.</span>\n </div>\n <span className=\"ghsync__badge ghsync__badge--neutral\">Locked</span>\n </div>\n ) : (\n <div className=\"ghsync__stack\">\n {settingsMutationsLockReason ? <p className=\"ghsync__hint\">{settingsMutationsLockReason}</p> : null}\n {existingProjectCandidatesLoading ? (\n <p className=\"ghsync__hint\">Checking this company for GitHub-linked projects that can be enabled for sync\u2026</p>\n ) : null}\n {existingProjectCandidatesError ? (\n <p className=\"ghsync__hint ghsync__hint--error\">{existingProjectCandidatesError}</p>\n ) : null}\n {availableExistingProjectCandidates.length > 0 ? (\n <div className=\"ghsync__existing-projects\">\n <div className=\"ghsync__mapping-title\">\n <strong>Existing GitHub-linked projects</strong>\n <span>Enable sync for projects that are already bound to a GitHub repository in {currentCompanyName}.</span>\n </div>\n {availableExistingProjectCandidates.map((candidate) => (\n <section key={`${candidate.projectId}:${candidate.repositoryUrl}`} className=\"ghsync__mapping-card ghsync__existing-project-card\">\n <div className=\"ghsync__existing-project-meta\">\n <strong>{candidate.projectName}</strong>\n <span>{candidate.repositoryUrl}</span>\n <div className=\"ghsync__existing-project-tags\">\n <span className=\"ghsync__scope-pill ghsync__scope-pill--company\">Existing project</span>\n <span className=\"ghsync__scope-pill ghsync__scope-pill--global\">GitHub workspace</span>\n </div>\n </div>\n <div className=\"ghsync__button-row\">\n <button\n type=\"button\"\n className={getPluginActionClassName({ variant: 'secondary' })}\n disabled={settingsMutationsLocked}\n onClick={() => addExistingProjectCandidate(candidate)}\n >\n Enable sync\n </button>\n </div>\n </section>\n ))}\n </div>\n ) : null}\n <div className=\"ghsync__mapping-list\">\n {mappings.map((mapping, index) => {\n const canRemove = mappings.length > 1 || mapping.repositoryUrl.trim() !== '' || mapping.paperclipProjectName.trim() !== '';\n\n return (\n <section key={mapping.id} className=\"ghsync__mapping-card\">\n <div className=\"ghsync__mapping-head\">\n <div className=\"ghsync__mapping-title\">\n <strong>Repository {index + 1}</strong>\n {mapping.paperclipProjectId ? (\n <span>This mapping will sync into an existing Paperclip project.</span>\n ) : null}\n </div>\n {canRemove ? (\n <button\n type=\"button\"\n className={getPluginActionClassName({ variant: 'danger' })}\n disabled={settingsMutationsLocked}\n onClick={() => removeMapping(mapping.id)}\n >\n Remove\n </button>\n ) : null}\n </div>\n\n <div className=\"ghsync__mapping-grid\">\n <div className=\"ghsync__field\">\n <label htmlFor={`repository-url-${mapping.id}`}>GitHub repository</label>\n <input\n id={`repository-url-${mapping.id}`}\n className=\"ghsync__input\"\n type=\"text\"\n value={mapping.repositoryUrl}\n disabled={settingsMutationsLocked}\n onChange={(event) => updateMapping(mapping.id, 'repositoryUrl', event.currentTarget.value)}\n placeholder=\"owner/repository or https://github.com/owner/repository\"\n autoComplete=\"off\"\n />\n </div>\n\n <div className=\"ghsync__field\">\n <label htmlFor={`project-name-${mapping.id}`}>Paperclip project</label>\n <input\n id={`project-name-${mapping.id}`}\n className=\"ghsync__input\"\n type=\"text\"\n value={mapping.paperclipProjectName}\n disabled={settingsMutationsLocked}\n onChange={(event) => updateMapping(mapping.id, 'paperclipProjectName', event.currentTarget.value)}\n autoComplete=\"off\"\n readOnly={Boolean(mapping.paperclipProjectId)}\n />\n </div>\n </div>\n </section>\n );\n })}\n </div>\n\n <div className=\"ghsync__section-footer\">\n <div className=\"ghsync__button-row\">\n <button\n type=\"button\"\n className={getPluginActionClassName({ variant: 'secondary' })}\n disabled={settingsMutationsLocked}\n onClick={addMapping}\n >\n Add another repository\n </button>\n </div>\n </div>\n </div>\n )}\n </section>\n\n <section className=\"ghsync__section\">\n <div className=\"ghsync__section-head\">\n <div className=\"ghsync__section-copy\">\n <div className=\"ghsync__section-title-row\">\n <h4>Advanced settings</h4>\n <div className=\"ghsync__section-tags\">\n <span className=\"ghsync__scope-pill ghsync__scope-pill--company\">Company</span>\n </div>\n </div>\n {hasCompanyContext ? <p className=\"ghsync__summary-line\">{advancedSettingsSummary}</p> : null}\n </div>\n <div className=\"ghsync__section-head-actions\">\n <span className={`ghsync__badge ${getToneClass(hasCompanyContext ? 'info' : 'neutral')}`}>\n {hasCompanyContext ? 'Ready' : 'Scoped'}\n </span>\n {hasCompanyContext ? (\n <button\n type=\"button\"\n className={getPluginActionClassName({ variant: 'secondary', size: 'sm' })}\n onClick={() => setShowAdvancedSettings((current) => !current)}\n >\n {showAdvancedSettings ? 'Collapse' : 'Expand'}\n </button>\n ) : null}\n </div>\n </div>\n\n {!hasCompanyContext ? (\n <div className=\"ghsync__locked\">\n <div>\n <strong>Company required</strong>\n <span>Open inside a company.</span>\n </div>\n <span className=\"ghsync__badge ghsync__badge--neutral\">Scoped</span>\n </div>\n ) : showAdvancedSettings ? (\n <div className=\"ghsync__advanced-card\">\n {settingsMutationsLockReason ? <p className=\"ghsync__hint\">{settingsMutationsLockReason}</p> : null}\n <div className=\"ghsync__mapping-grid\">\n <div className=\"ghsync__field\">\n <label htmlFor=\"advanced-default-assignee\">Default assignee</label>\n <SettingsAssigneePicker\n id=\"advanced-default-assignee\"\n value={form.advancedSettings.defaultAssigneeAgentId ?? ''}\n options={assigneeSelectOptions}\n disabled={settingsMutationsLocked}\n onChange={(nextValue) => {\n setForm((current) => ({\n ...current,\n advancedSettings: {\n ...current.advancedSettings,\n ...(nextValue ? { defaultAssigneeAgentId: nextValue } : { defaultAssigneeAgentId: undefined })\n }\n }));\n }}\n />\n </div>\n\n <div className=\"ghsync__field\">\n <label htmlFor=\"advanced-default-status\">Default status</label>\n <SettingsStatusPicker\n id=\"advanced-default-status\"\n value={form.advancedSettings.defaultStatus}\n options={statusSelectOptions}\n disabled={settingsMutationsLocked}\n onChange={(nextValue) => {\n setForm((current) => ({\n ...current,\n advancedSettings: {\n ...current.advancedSettings,\n defaultStatus: normalizePaperclipIssueStatus(nextValue)\n }\n }));\n }}\n />\n </div>\n </div>\n\n <div className=\"ghsync__field\">\n <label htmlFor=\"advanced-ignored-authors\">Ignore issues from GitHub usernames</label>\n <textarea\n id=\"advanced-ignored-authors\"\n className=\"ghsync__input ghsync__textarea\"\n value={ignoredAuthorsDraft}\n disabled={settingsMutationsLocked}\n onChange={(event) => {\n const nextDraft = event.currentTarget.value;\n const ignoredIssueAuthorUsernames = normalizeIgnoredIssueAuthorUsernames(nextDraft);\n setIgnoredAuthorsDraft(nextDraft);\n setForm((current) => ({\n ...current,\n advancedSettings: {\n ...current.advancedSettings,\n ignoredIssueAuthorUsernames\n }\n }));\n }}\n placeholder=\"renovate\"\n />\n <p className=\"ghsync__hint\">Comma or newline separated.</p>\n </div>\n </div>\n ) : null}\n </section>\n\n <section className=\"ghsync__section\">\n <div className=\"ghsync__section-head\">\n <div className=\"ghsync__section-copy\">\n <div className=\"ghsync__section-title-row\">\n <h4>Sync</h4>\n <div className=\"ghsync__section-tags\">\n <span className={manualSyncScopePillClass}>{manualSyncScopePillLabel}</span>\n <span className=\"ghsync__scope-pill ghsync__scope-pill--global\">Shared cadence</span>\n </div>\n </div>\n {syncSectionDescription ? <p>{syncSectionDescription}</p> : null}\n </div>\n <span className={`ghsync__badge ${getToneClass(syncStatus.tone)}`}>{syncStatus.label}</span>\n </div>\n\n {!repositoriesUnlocked ? (\n <div className=\"ghsync__locked\">\n <div>\n <strong>Sync is locked</strong>\n <span>Add a valid token first.</span>\n </div>\n <span className=\"ghsync__badge ghsync__badge--neutral\">Locked</span>\n </div>\n ) : (\n <form className=\"ghsync__stack\" onSubmit={handleSaveSetup}>\n <div className=\"ghsync__schedule-card\">\n <div className=\"ghsync__field\">\n <label htmlFor=\"sync-frequency-minutes\">Automatic sync cadence</label>\n <input\n id=\"sync-frequency-minutes\"\n className=\"ghsync__input\"\n type=\"number\"\n inputMode=\"numeric\"\n min={1}\n step={1}\n value={scheduleFrequencyDraft}\n disabled={settingsMutationsLocked || !hasCompanyContext}\n onChange={(event) => {\n setScheduleFrequencyDraft(event.currentTarget.value);\n }}\n placeholder=\"15\"\n />\n <p className={`ghsync__hint${scheduleFrequencyError ? ' ghsync__hint--error' : ''}`}>\n {scheduleFrequencyError ?? 'Minutes.'}\n </p>\n </div>\n\n <div className=\"ghsync__schedule-meta\">\n <span className=\"ghsync__scope-pill ghsync__scope-pill--global\">Shared</span>\n <strong>Auto-sync {scheduleDescription}</strong>\n <span>All companies.</span>\n </div>\n </div>\n\n {!syncUnlocked ? (\n <div className=\"ghsync__locked\">\n <div>\n <strong>{syncSetupIssue === 'missing_board_access' ? 'Paperclip board access is required' : 'Manual sync is locked'}</strong>\n <span>{syncSetupMessage}</span>\n </div>\n <span className=\"ghsync__badge ghsync__badge--neutral\">Locked</span>\n </div>\n ) : (\n <>\n <div className=\"ghsync__stats\">\n {syncMetricCards.map((metric) => (\n <div\n key={metric.key}\n className={`ghsync__stat${metric.emphasized ? ' ghsync__stat--emphasized' : ''}`}\n >\n <strong>{metric.value}</strong>\n <span>{metric.label}</span>\n <p>{metric.description}</p>\n </div>\n ))}\n </div>\n\n <SyncProgressPanel syncState={displaySyncState} />\n\n <div className={syncSummaryClass}>\n <div>\n <span className={manualSyncScopePillClass}>{manualSyncScopePillLabel}</span>\n <strong>{syncSummaryPrimaryText}</strong>\n <span>{syncSummarySecondaryText}</span>\n </div>\n <button\n type=\"button\"\n className={getPluginActionClassName({ variant: 'primary' })}\n onClick={handleRunSyncNow}\n disabled={syncInFlight || showInitialLoadingState}\n >\n {syncInFlight ? 'Running\u2026' : manualSyncButtonLabel}\n </button>\n </div>\n </>\n )}\n\n <SyncDiagnosticsPanel\n syncState={displaySyncState}\n requestError={manualSyncRequestError}\n />\n\n <div className=\"ghsync__section-footer\">\n <div className=\"ghsync__button-row\">\n <button\n type=\"submit\"\n className={getPluginActionClassName({ variant: 'primary' })}\n disabled={!canSaveSetup}\n >\n {submittingSetup ? 'Saving\u2026' : 'Save settings'}\n </button>\n </div>\n </div>\n </form>\n )}\n </section>\n </section>\n\n <aside className=\"ghsync__card\">\n <div className=\"ghsync__card-header\">\n <h3>Summary</h3>\n <p>\n {hasCompanyContext\n ? currentCompanyName\n : 'No company selected.'}\n </p>\n </div>\n\n <div className=\"ghsync__side-body\">\n <div className=\"ghsync__check\">\n <div className=\"ghsync__check-top\">\n <strong>GitHub token</strong>\n <span className={`ghsync__badge ${getToneClass(tokenTone)}`}>\n {tokenBadgeLabel}\n </span>\n </div>\n <span>\n {tokenStatus === 'valid'\n ? (validatedLogin ? `Signed in as ${validatedLogin}.` : 'Ready.')\n : tokenStatus === 'invalid'\n ? 'Needs attention.'\n : 'Required.'}\n </span>\n </div>\n\n <div className=\"ghsync__check\">\n <div className=\"ghsync__check-top\">\n <strong>Repositories</strong>\n <span className={`ghsync__badge ${getToneClass(!repositoriesUnlocked ? 'neutral' : savedMappingCount > 0 ? 'success' : 'info')}`}>\n {!repositoriesUnlocked ? 'Locked' : savedMappingCount > 0 ? 'Ready' : 'Open'}\n </span>\n </div>\n <span>\n {!repositoriesUnlocked\n ? 'Requires a token.'\n : savedMappingCount > 0\n ? hasCompanyContext\n ? `${savedMappingCount} saved.`\n : `${savedMappingCount} saved.`\n : hasCompanyContext\n ? 'Add a repository.'\n : 'Select a company.'}\n </span>\n </div>\n\n <div className=\"ghsync__check\">\n <div className=\"ghsync__check-top\">\n <strong>Paperclip board access</strong>\n <span className={`ghsync__badge ${getToneClass(boardAccessStatusTone)}`}>\n {boardAccessStatusLabel}\n </span>\n </div>\n <span>{boardAccessSummaryText}</span>\n </div>\n\n <div className=\"ghsync__check\">\n <div className=\"ghsync__check-top\">\n <strong>Sync</strong>\n <span className={`ghsync__badge ${getToneClass(syncStatus.tone)}`}>{syncStatus.label}</span>\n </div>\n <span>\n {syncUnlocked\n ? hasCompanyContext\n ? `Manual here. Auto-sync ${scheduleDescription}.`\n : `Auto-sync ${scheduleDescription}.`\n : syncSetupMessage}\n </span>\n </div>\n\n <div className=\"ghsync__detail-list\">\n <div className=\"ghsync__detail\">\n <span className=\"ghsync__detail-label\">Last saved</span>\n <strong className=\"ghsync__detail-value\">{lastUpdated}</strong>\n </div>\n <div className=\"ghsync__detail\">\n <span className=\"ghsync__detail-label\">Auto-sync</span>\n <strong className=\"ghsync__detail-value\">{scheduleDescription}</strong>\n </div>\n <div className=\"ghsync__detail\">\n <span className=\"ghsync__detail-label\">Last sync</span>\n <strong className=\"ghsync__detail-value\">{lastSync}</strong>\n </div>\n </div>\n </div>\n </aside>\n </div>\n </div>\n );\n}\n\nexport function GitHubSyncDashboardWidget(): React.JSX.Element {\n const hostContext = useHostContext();\n const toast = usePluginToast();\n const pluginIdFromLocation = getPluginIdFromLocation();\n const settings = usePluginData<GitHubSyncSettings>(\n 'settings.registration',\n hostContext.companyId ? { companyId: hostContext.companyId } : {}\n );\n const runSyncNow = usePluginAction('sync.runNow');\n const [runningSync, setRunningSync] = useState(false);\n const [manualSyncRequestError, setManualSyncRequestError] = useState<string | null>(null);\n const [settingsHref, setSettingsHref] = useState(SETTINGS_INDEX_HREF);\n const [cachedSettings, setCachedSettings] = useState<GitHubSyncSettings | null>(null);\n const themeMode = useResolvedThemeMode();\n const boardAccessRequirement = usePaperclipBoardAccessRequirement();\n\n const theme = themeMode === 'light' ? LIGHT_PALETTE : DARK_PALETTE;\n const themeVars = buildThemeVars(theme, themeMode);\n const current = settings.data ?? cachedSettings ?? EMPTY_SETTINGS;\n const showInitialLoadingState = settings.loading && !settings.data && !cachedSettings;\n const syncState = current.syncState ?? EMPTY_SETTINGS.syncState;\n const tokenValid = Boolean(current.githubTokenConfigured);\n const hasCompanyContext = Boolean(hostContext.companyId);\n const boardAccessConfigured = Boolean(current.paperclipBoardAccessConfigured);\n const boardAccessRequired = boardAccessRequirement.required;\n const boardAccessReady = !boardAccessRequired || (hasCompanyContext && boardAccessConfigured);\n const savedMappingCount = getComparableMappings(current.mappings ?? []).length;\n const syncSetupIssue = getSyncSetupIssue({\n tokenStatus: tokenValid ? 'valid' : 'required',\n savedMappingCount,\n boardAccessRequired,\n boardAccessConfigured,\n hasCompanyContext\n });\n const syncSetupMessage = getSyncSetupMessage(syncSetupIssue, hasCompanyContext);\n const displaySyncState = getDisplaySyncState(syncState, {\n hasToken: tokenValid,\n hasMappings: savedMappingCount > 0,\n hasBoardAccess: boardAccessReady\n });\n const syncUnlocked = syncSetupIssue === null;\n const syncInFlight = runningSync || displaySyncState.status === 'running';\n const scheduleFrequencyMinutes = normalizeScheduleFrequencyMinutes(current.scheduleFrequencyMinutes);\n const scheduleDescription = formatScheduleFrequency(scheduleFrequencyMinutes);\n const summary = getDashboardSummary({\n syncIssue: syncSetupIssue,\n hasCompanyContext,\n syncState: displaySyncState,\n runningSync,\n scheduleFrequencyMinutes\n });\n const syncProgress = getRunningSyncProgressModel(displaySyncState);\n const syncMetricCards = getSyncMetricCards({\n totalSyncedIssuesCount: current.totalSyncedIssuesCount,\n erroredIssuesCount: displaySyncState.erroredIssuesCount,\n syncState: displaySyncState,\n savedMappingCount\n });\n const lastSync = formatDate(displaySyncState.checkedAt, 'Never');\n const armSyncCompletionToast = useSyncCompletionToast(displaySyncState, toast);\n\n useEffect(() => {\n if (settings.data) {\n setCachedSettings(settings.data);\n }\n }, [settings.data]);\n\n useEffect(() => {\n let cancelled = false;\n\n async function loadSettingsHref(): Promise<void> {\n try {\n const plugins = await fetchJson<unknown>('/api/plugins');\n if (!cancelled) {\n setSettingsHref(resolvePluginSettingsHref(plugins));\n }\n } catch {\n if (!cancelled) {\n setSettingsHref(SETTINGS_INDEX_HREF);\n }\n }\n }\n\n void loadSettingsHref();\n\n return () => {\n cancelled = true;\n };\n }, []);\n\n useEffect(() => {\n if (displaySyncState.status !== 'running') {\n return;\n }\n\n const refreshSettings = () => {\n try {\n settings.refresh();\n } catch {\n return;\n }\n };\n\n const intervalId = globalThis.setInterval(() => {\n refreshSettings();\n }, SYNC_POLL_INTERVAL_MS);\n\n refreshSettings();\n\n return () => {\n globalThis.clearInterval(intervalId);\n };\n }, [displaySyncState.status, settings.refresh]);\n\n async function handleRunSync(): Promise<void> {\n setRunningSync(true);\n setManualSyncRequestError(null);\n\n try {\n if (!syncUnlocked) {\n throw new Error(syncSetupMessage);\n }\n\n const trustedPaperclipApiBaseUrl = await syncTrustedPaperclipApiBaseUrl(pluginIdFromLocation);\n const result = await runSyncNow({\n ...(hostContext.companyId ? { companyId: hostContext.companyId } : {}),\n ...(trustedPaperclipApiBaseUrl ? { paperclipApiBaseUrl: trustedPaperclipApiBaseUrl } : {})\n }) as GitHubSyncSettings;\n const nextSyncState = result.syncState ?? EMPTY_SETTINGS.syncState;\n setManualSyncRequestError(null);\n\n toast({\n title: getSyncToastTitle(nextSyncState),\n body: getSyncToastBody(nextSyncState),\n tone: getSyncToastTone(nextSyncState)\n });\n armSyncCompletionToast(nextSyncState);\n\n await settings.refresh();\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unable to run GitHub sync.';\n setManualSyncRequestError(message);\n toast({\n title: 'Unable to run GitHub sync',\n body: message,\n tone: 'error'\n });\n\n try {\n await settings.refresh();\n } catch {\n return;\n }\n } finally {\n setRunningSync(false);\n }\n }\n\n return (\n <section className=\"ghsync-widget\" style={themeVars}>\n <style>{WIDGET_STYLES}</style>\n\n <div className=\"ghsync-widget__card\">\n <div className=\"ghsync-widget__top\">\n <div>\n <div className=\"ghsync-widget__eyebrow\">GitHub Sync</div>\n <h3>{summary.title}</h3>\n <p>{summary.body}</p>\n <div className=\"ghsync-widget__meta\">\n <span>{savedMappingCount} {savedMappingCount === 1 ? 'repository' : 'repositories'}</span>\n <span className=\"ghsync-widget__meta-dot\" aria-hidden=\"true\" />\n <span>Auto-sync {scheduleDescription}</span>\n <span className=\"ghsync-widget__meta-dot\" aria-hidden=\"true\" />\n <span>Last sync {lastSync}</span>\n </div>\n </div>\n <span className={`ghsync__badge ${getToneClass(summary.tone)}`}>\n <span className=\"ghsync__badge-dot\" aria-hidden=\"true\" />\n {summary.label}\n </span>\n </div>\n\n {settings.error ? <div className=\"ghsync-widget__message\">{settings.error.message}</div> : null}\n\n <div className=\"ghsync-widget__stats\">\n {syncMetricCards.map((metric) => (\n <div\n key={metric.key}\n className={`ghsync-widget__stat${metric.emphasized ? ' ghsync-widget__stat--emphasized' : ''}`}\n >\n <strong>{metric.value}</strong>\n <span>{metric.label}</span>\n <p>{metric.description}</p>\n </div>\n ))}\n </div>\n\n <SyncProgressPanel\n syncState={displaySyncState}\n compact\n />\n\n <div className=\"ghsync-widget__summary\">\n <strong>\n {showInitialLoadingState\n ? 'Loading sync status\u2026'\n : syncInFlight\n ? 'Live run'\n : syncUnlocked\n ? 'Latest result'\n : 'Next step'}\n </strong>\n <span>\n {showInitialLoadingState\n ? 'Fetching the latest GitHub sync state from the worker.'\n : syncProgress\n ? [\n syncProgress.issueProgressLabel,\n syncProgress.currentIssueLabel ?? syncProgress.repositoryPosition\n ].filter((value): value is string => Boolean(value))\n .join(' \u00B7 ')\n : syncSetupIssue === 'missing_token'\n ? 'Open settings to validate GitHub access.'\n : syncSetupIssue === 'missing_mapping'\n ? 'Open settings and add a repository. The Paperclip project will be created if it does not exist.'\n : syncSetupIssue === 'missing_board_access'\n ? hasCompanyContext\n ? 'Open settings and connect Paperclip board access before running sync.'\n : 'Open plugin settings inside a company to connect required Paperclip board access.'\n : displaySyncState.checkedAt\n ? `Last checked ${lastSync}.`\n : 'Everything is configured. Run the first sync when you are ready.'}\n </span>\n </div>\n\n <SyncDiagnosticsPanel\n syncState={displaySyncState}\n requestError={manualSyncRequestError}\n compact\n />\n\n <div className=\"ghsync-widget__actions\">\n <div className=\"ghsync-widget__button-row\">\n <a\n href={settingsHref}\n className={getPluginActionClassName({\n variant: syncUnlocked ? 'secondary' : 'primary',\n extraClassName: 'ghsync-widget__link'\n })}\n >\n Open settings\n </a>\n {syncUnlocked ? (\n <button\n type=\"button\"\n className={getPluginActionClassName({ variant: 'primary' })}\n onClick={handleRunSync}\n disabled={syncInFlight || showInitialLoadingState}\n >\n {syncInFlight ? 'Running\u2026' : 'Run sync now'}\n </button>\n ) : null}\n </div>\n </div>\n </div>\n </section>\n );\n}\n\nfunction GitHubMarkIcon(props: {\n className?: string;\n}): React.JSX.Element {\n return (\n <svg\n viewBox=\"0 0 16 16\"\n aria-hidden=\"true\"\n focusable=\"false\"\n className={props.className}\n >\n <path\n fill=\"currentColor\"\n d={GITHUB_MARK_PATH_D}\n />\n </svg>\n );\n}\n\nfunction GitHubSyncToolbarButtonSurface(props: {\n entityType?: 'project' | 'issue';\n entityId?: string | null;\n companyId?: string | null;\n projectId?: string | null;\n}): React.JSX.Element | null {\n const toast = usePluginToast();\n const runSyncNow = usePluginAction('sync.runNow');\n const pluginIdFromLocation = getPluginIdFromLocation();\n const surfaceRef = useRef<HTMLDivElement | null>(null);\n const resolvedIssue = useResolvedIssueId({\n companyId: props.companyId,\n projectId: props.projectId,\n entityId: props.entityId,\n entityType: props.entityType\n });\n const effectiveEntityId =\n props.entityType === 'issue'\n ? resolvedIssue.issueId ?? '__ghsync_unresolved_issue__'\n : props.entityId;\n const toolbarState = usePluginData<SyncToolbarStateData>('sync.toolbarState', {\n ...(props.companyId ? { companyId: props.companyId } : {}),\n ...(effectiveEntityId ? { entityId: effectiveEntityId } : {}),\n ...(props.entityType ? { entityType: props.entityType } : {})\n });\n const settingsRegistration = usePluginData<GitHubSyncSettings>(\n 'settings.registration',\n props.companyId ? { companyId: props.companyId } : {}\n );\n const [runningSync, setRunningSync] = useState(false);\n const themeMode = useResolvedThemeMode();\n const boardAccessRequirement = usePaperclipBoardAccessRequirement();\n const theme = themeMode === 'light' ? LIGHT_PALETTE : DARK_PALETTE;\n const themeVars = buildThemeVars(theme, themeMode);\n const state = toolbarState.data ?? {\n kind: props.entityType ?? 'global',\n visible: !props.entityType,\n canRun: false,\n label: props.entityType === 'issue' ? 'Sync issue' : props.entityType === 'project' ? 'Sync project' : 'Sync GitHub',\n syncState: EMPTY_SETTINGS.syncState,\n githubTokenConfigured: false,\n savedMappingCount: 0\n };\n const hasCompanyContext = Boolean(props.companyId);\n const boardAccessConfigured = Boolean(settingsRegistration.data?.paperclipBoardAccessConfigured);\n const boardAccessSetupIssue: SyncConfigurationIssue | null =\n state.canRun && boardAccessRequirement.required && (!hasCompanyContext || !boardAccessConfigured)\n ? 'missing_board_access'\n : null;\n const effectiveCanRun = state.canRun && !boardAccessSetupIssue;\n const effectiveMessage =\n boardAccessSetupIssue\n ? getSyncSetupMessage(boardAccessSetupIssue, hasCompanyContext)\n : state.message;\n const effectiveLabel = boardAccessSetupIssue ? 'Board access required' : state.label;\n const syncInFlight = runningSync || state.syncState.status === 'running';\n const armSyncCompletionToast = useSyncCompletionToast(state.syncState, toast);\n\n useEffect(() => {\n if (state.syncState.status !== 'running') {\n return;\n }\n\n const intervalId = globalThis.setInterval(() => {\n try {\n toolbarState.refresh();\n } catch {\n return;\n }\n }, SYNC_POLL_INTERVAL_MS);\n\n return () => {\n globalThis.clearInterval(intervalId);\n };\n }, [state.syncState.status, toolbarState.refresh]);\n\n useEffect(() => {\n const refreshToolbarState = () => {\n try {\n toolbarState.refresh();\n } catch {\n // Keep going so the settings registration still gets a refresh attempt.\n }\n\n try {\n settingsRegistration.refresh();\n } catch {\n return;\n }\n };\n\n refreshToolbarState();\n\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return;\n }\n\n const handleSettingsUpdated = () => {\n refreshToolbarState();\n };\n const handleWindowFocus = () => {\n refreshToolbarState();\n };\n const handleVisibilityChange = () => {\n if (document.visibilityState === 'visible') {\n refreshToolbarState();\n }\n };\n\n window.addEventListener(GITHUB_SYNC_SETTINGS_UPDATED_EVENT, handleSettingsUpdated);\n window.addEventListener('focus', handleWindowFocus);\n document.addEventListener('visibilitychange', handleVisibilityChange);\n\n return () => {\n window.removeEventListener(GITHUB_SYNC_SETTINGS_UPDATED_EVENT, handleSettingsUpdated);\n window.removeEventListener('focus', handleWindowFocus);\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n };\n }, [toolbarState.refresh, settingsRegistration.refresh, props.companyId, effectiveEntityId, props.entityType]);\n\n useEffect(() => {\n if (!props.entityType) {\n return;\n }\n\n const hostWrapper = surfaceRef.current?.parentElement;\n if (!hostWrapper) {\n return;\n }\n\n const previousMarginLeft = hostWrapper.style.marginLeft;\n const previousMarginInlineStart = hostWrapper.style.marginInlineStart;\n hostWrapper.style.marginLeft = 'auto';\n hostWrapper.style.marginInlineStart = 'auto';\n\n return () => {\n hostWrapper.style.marginLeft = previousMarginLeft;\n hostWrapper.style.marginInlineStart = previousMarginInlineStart;\n };\n });\n\n if (!state.visible) {\n return null;\n }\n\n async function handleRunSync(): Promise<void> {\n try {\n if (!effectiveCanRun) {\n throw new Error(effectiveMessage ?? 'Unable to run GitHub sync.');\n }\n\n setRunningSync(true);\n const trustedPaperclipApiBaseUrl = await syncTrustedPaperclipApiBaseUrl(pluginIdFromLocation);\n const result = await runSyncNow({\n waitForCompletion: false,\n ...(props.companyId ? { companyId: props.companyId } : {}),\n ...(props.entityType === 'project' && props.entityId ? { projectId: props.entityId } : {}),\n ...(props.entityType === 'issue' && resolvedIssue.issueId ? { issueId: resolvedIssue.issueId } : {}),\n ...(trustedPaperclipApiBaseUrl ? { paperclipApiBaseUrl: trustedPaperclipApiBaseUrl } : {})\n }) as {\n syncState?: SyncRunState;\n };\n const nextSyncState = result.syncState ?? EMPTY_SETTINGS.syncState;\n\n toast({\n title: getSyncToastTitle(nextSyncState),\n body: getSyncToastBody(nextSyncState),\n tone: getSyncToastTone(nextSyncState)\n });\n armSyncCompletionToast(nextSyncState);\n toolbarState.refresh();\n } catch (error) {\n toast({\n title: 'Unable to run GitHub sync',\n body: error instanceof Error ? error.message : 'Unable to run GitHub sync.',\n tone: 'error'\n });\n } finally {\n setRunningSync(false);\n }\n }\n\n return (\n <div\n ref={surfaceRef}\n className={`ghsync-toolbar-button${props.entityType ? ' ghsync-toolbar-button--entity' : ''}`}\n style={themeVars}\n title={toolbarState.error?.message ?? effectiveMessage}\n >\n <style>{EXTENSION_SURFACE_STYLES}</style>\n <button\n type=\"button\"\n data-slot=\"button\"\n data-variant=\"outline\"\n data-size=\"sm\"\n className={props.entityType ? HOST_ENTITY_BUTTON_CLASSNAME : HOST_GLOBAL_BUTTON_CLASSNAME}\n disabled={!effectiveCanRun || syncInFlight || toolbarState.loading}\n onClick={handleRunSync}\n >\n <GitHubMarkIcon className=\"mr-1.5 h-3.5 w-3.5\" />\n <span>{syncInFlight ? 'Syncing\u2026' : effectiveLabel}</span>\n </button>\n </div>\n );\n}\n\nexport function GitHubSyncGlobalToolbarButton(): React.JSX.Element | null {\n const context = useHostContext();\n return <GitHubSyncToolbarButtonSurface companyId={context.companyId} />;\n}\n\nexport function GitHubSyncEntityToolbarButton(): React.JSX.Element | null {\n const context = useHostContext();\n\n if ((context.entityType !== 'issue' && context.entityType !== 'project') || !context.entityId) {\n return null;\n }\n\n return (\n <GitHubSyncToolbarButtonSurface\n companyId={context.companyId}\n entityId={context.entityId}\n entityType={context.entityType}\n projectId={context.projectId}\n />\n );\n}\n\nfunction GitHubSyncIssueDetailTabContent(props: {\n companyId?: string | null;\n issueId?: string | null;\n loadingIssueId?: boolean;\n themeVars: React.CSSProperties;\n}): React.JSX.Element {\n const details = usePluginData<GitHubIssueDetailsData | null>('issue.githubDetails', {\n ...(props.companyId ? { companyId: props.companyId } : {}),\n ...(props.issueId ? { issueId: props.issueId } : {})\n });\n const issueDetails = details.data?.paperclipIssueId === props.issueId ? details.data : null;\n\n useEffect(() => {\n if (!props.companyId || !props.issueId) {\n return;\n }\n\n try {\n details.refresh();\n } catch {\n return;\n }\n }, [details.refresh, props.companyId, props.issueId]);\n\n return (\n <section className=\"ghsync-issue-detail\" style={props.themeVars}>\n <style>{EXTENSION_SURFACE_STYLES}</style>\n\n {props.loadingIssueId || (details.loading && !issueDetails) ? <p className=\"ghsync-extension-empty\">Loading GitHub sync details\u2026</p> : null}\n {details.error ? <p className=\"ghsync-extension-empty\">{details.error.message}</p> : null}\n {!props.loadingIssueId && !details.loading && !details.error && !issueDetails ? (\n <p className=\"ghsync-extension-empty\">GitHub Sync has not linked this Paperclip issue to a GitHub issue yet.</p>\n ) : null}\n\n {issueDetails ? (\n <>\n <div className=\"ghsync-extension-heading\">\n <div>\n <h4>Issue #{issueDetails.githubIssueNumber}</h4>\n <p>{formatGitHubRepositoryLabel(issueDetails.repositoryUrl)}</p>\n </div>\n <a\n href={issueDetails.githubIssueUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className={getPluginActionClassName({\n variant: 'secondary',\n size: 'sm',\n extraClassName: 'ghsync-extension-link'\n })}\n >\n Open on GitHub\n </a>\n </div>\n\n <div className=\"ghsync-extension-grid\">\n <div className=\"ghsync-extension-metric\">\n <span>State</span>\n <strong>{formatGitHubIssueState(issueDetails.githubIssueState, issueDetails.githubIssueStateReason)}</strong>\n </div>\n <div className=\"ghsync-extension-metric\">\n <span>Comments</span>\n <strong>{issueDetails.commentsCount ?? 'Unknown'}</strong>\n </div>\n <div className=\"ghsync-extension-metric\">\n <span>Linked PRs</span>\n <strong>{issueDetails.linkedPullRequestNumbers.length}</strong>\n </div>\n <div className=\"ghsync-extension-metric\">\n <span>Last synced</span>\n <strong>{issueDetails.syncedAt ? formatDate(issueDetails.syncedAt, 'Unknown') : 'Pending refresh'}</strong>\n </div>\n </div>\n\n {issueDetails.linkedPullRequestNumbers.length > 0 ? (\n <div className=\"ghsync-issue-detail__section\">\n <div className=\"ghsync-issue-detail__section-heading\">Linked pull requests</div>\n <div className=\"ghsync-extension-links\">\n {issueDetails.linkedPullRequestNumbers.map((pullRequestNumber) => (\n <a\n key={pullRequestNumber}\n href={`${issueDetails.repositoryUrl}/pull/${pullRequestNumber}`}\n target=\"_blank\"\n rel=\"noreferrer\"\n className={getPluginActionClassName({\n variant: 'secondary',\n size: 'sm',\n extraClassName: 'ghsync-extension-link'\n })}\n >\n PR #{pullRequestNumber}\n </a>\n ))}\n </div>\n </div>\n ) : null}\n\n {issueDetails.labels && issueDetails.labels.length > 0 ? (\n <div className=\"ghsync-issue-detail__section\">\n <div className=\"ghsync-issue-detail__section-heading\">Labels</div>\n <div className=\"ghsync-extension-labels\">\n {issueDetails.labels.map((label) => (\n <span\n key={`${label.name}:${label.color ?? 'none'}`}\n className=\"ghsync-extension-pill\"\n style={label.color ? { borderColor: label.color, boxShadow: `inset 0 0 0 1px ${label.color}` } : undefined}\n >\n {label.name}\n </span>\n ))}\n </div>\n </div>\n ) : null}\n\n {issueDetails.source !== 'entity' ? (\n <div className=\"ghsync-extension-note\">\n GitHub Sync recovered this link from older sync metadata. Run sync once to refresh GitHub state, labels, and linked PRs in this panel.\n </div>\n ) : null}\n </>\n ) : null}\n </section>\n );\n}\n\nexport function GitHubSyncIssueDetailTab(): React.JSX.Element {\n const context = useHostContext();\n const themeMode = useResolvedThemeMode();\n const theme = themeMode === 'light' ? LIGHT_PALETTE : DARK_PALETTE;\n const themeVars = buildThemeVars(theme, themeMode);\n const resolvedIssue = useResolvedIssueId({\n companyId: context.companyId,\n projectId: context.projectId,\n entityId: context.entityId,\n entityType: context.entityType\n });\n const detailKey = `${context.companyId ?? 'company-none'}:${resolvedIssue.issueIdentifier ?? context.entityId ?? 'issue-none'}`;\n\n return (\n <GitHubSyncIssueDetailTabContent\n key={detailKey}\n companyId={context.companyId}\n issueId={resolvedIssue.issueId}\n loadingIssueId={resolvedIssue.loading}\n themeVars={themeVars}\n />\n );\n}\n\nexport function GitHubSyncCommentAnnotation(): React.JSX.Element | null {\n const context = useHostContext();\n const themeMode = useResolvedThemeMode();\n const theme = themeMode === 'light' ? LIGHT_PALETTE : DARK_PALETTE;\n const themeVars = buildThemeVars(theme, themeMode);\n const annotation = usePluginData<CommentAnnotationData | null>('comment.annotation', {\n ...(context.companyId ? { companyId: context.companyId } : {}),\n ...(context.entityId ? { commentId: context.entityId } : {}),\n ...(context.parentEntityId ? { parentIssueId: context.parentEntityId } : {})\n });\n\n if (annotation.loading && !annotation.data) {\n return null;\n }\n\n if (annotation.error || !annotation.data || annotation.data.links.length === 0) {\n return null;\n }\n\n return (\n <div className=\"ghsync-extension-card ghsync-extension-card--compact\" style={themeVars}>\n <style>{EXTENSION_SURFACE_STYLES}</style>\n <div className=\"ghsync-comment-annotation\">\n <span className=\"ghsync-comment-annotation__label\">GitHub refs</span>\n {annotation.data.links.map((link) => (\n <a\n key={`${link.type}:${link.href}`}\n href={link.href}\n target=\"_blank\"\n rel=\"noreferrer\"\n className={getPluginActionClassName({\n variant: 'secondary',\n size: 'sm',\n extraClassName: 'ghsync-extension-link'\n })}\n >\n {link.label}\n </a>\n ))}\n </div>\n </div>\n );\n}\n\nexport default GitHubSyncSettingsPage;\n", "export interface ParsedRepositoryReference {\n owner: string;\n repo: string;\n url: string;\n}\n\nexport function parseRepositoryReference(repositoryInput: string): ParsedRepositoryReference | null {\n const trimmed = repositoryInput.trim();\n if (!trimmed) {\n return null;\n }\n\n const slugMatch = trimmed.match(/^([A-Za-z0-9_.-]+)\\/([A-Za-z0-9_.-]+?)(?:\\.git)?$/);\n if (slugMatch) {\n const [, owner, repo] = slugMatch;\n return {\n owner,\n repo,\n url: `https://github.com/${owner}/${repo}`\n };\n }\n\n try {\n const url = new URL(trimmed);\n if (url.hostname !== 'github.com' && url.hostname !== 'www.github.com') {\n return null;\n }\n\n const pathSegments = url.pathname.split('/').filter(Boolean);\n if (pathSegments.length !== 2) {\n return null;\n }\n\n const [owner, rawRepo] = pathSegments;\n const repo = rawRepo.replace(/\\.git$/, '');\n if (!owner || !repo) {\n return null;\n }\n\n return {\n owner,\n repo,\n url: `https://github.com/${owner}/${repo}`\n };\n } catch {\n return null;\n }\n}\n", "export interface PaperclipHealthResponse {\n deploymentMode?: string;\n deploymentExposure?: string;\n authReady?: boolean;\n}\n\nfunction normalizeOptionalString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nexport function normalizePaperclipHealthResponse(value: unknown): PaperclipHealthResponse | null {\n if (!value || typeof value !== 'object') {\n return null;\n }\n\n const record = value as Record<string, unknown>;\n const deploymentMode = normalizeOptionalString(record.deploymentMode);\n const deploymentExposure = normalizeOptionalString(record.deploymentExposure);\n const authReady = typeof record.authReady === 'boolean' ? record.authReady : undefined;\n\n if (!deploymentMode && !deploymentExposure && authReady === undefined) {\n return null;\n }\n\n return {\n ...(deploymentMode ? { deploymentMode } : {}),\n ...(deploymentExposure ? { deploymentExposure } : {}),\n ...(authReady !== undefined ? { authReady } : {})\n };\n}\n\nexport function requiresPaperclipBoardAccess(value: unknown): boolean {\n const health = normalizePaperclipHealthResponse(value);\n return health?.deploymentMode?.toLowerCase() === 'authenticated';\n}\n", "export interface GitHubSyncAssigneeOption {\n id: string;\n name: string;\n title?: string;\n status?: string;\n}\n\nexport function normalizeCompanyAssigneeOptionsResponse(response: unknown): GitHubSyncAssigneeOption[] {\n if (!Array.isArray(response)) {\n throw new Error('Unexpected company agents response: expected an array.');\n }\n\n return response\n .map((entry) => {\n if (!entry || typeof entry !== 'object') {\n return null;\n }\n\n const record = entry as Record<string, unknown>;\n const id = typeof record.id === 'string' ? record.id.trim() : '';\n const name = typeof record.name === 'string' ? record.name.trim() : '';\n const status = typeof record.status === 'string' ? record.status.trim() : '';\n const title = typeof record.title === 'string' ? record.title.trim() : '';\n\n if (!id || !name || status === 'terminated') {\n return null;\n }\n\n return {\n id,\n name,\n ...(title ? { title } : {}),\n ...(status ? { status } : {})\n };\n })\n .filter((entry): entry is GitHubSyncAssigneeOption => entry !== null)\n .sort((left, right) => left.name.localeCompare(right.name));\n}\n", "import { normalizePaperclipHealthResponse, type PaperclipHealthResponse } from '../paperclip-health.ts';\n\nconst JSON_CONTENT_TYPE_PATTERN = /\\b(?:application\\/json|[^;\\s]+\\/[^;\\s]+\\+json)\\b/i;\nconst HTML_LIKE_RESPONSE_PATTERN = /^\\s*</;\nconst MAX_RESPONSE_PREVIEW_LENGTH = 160;\n\nfunction resolveBrowserOrigin(): string | null {\n if (typeof window === 'undefined' || typeof window.location?.origin !== 'string') {\n return null;\n }\n\n const origin = window.location.origin.trim();\n return origin ? origin : null;\n}\n\nfunction isAbsoluteUrl(value: string): boolean {\n return /^[a-z][a-z0-9+.-]*:\\/\\//i.test(value);\n}\n\nfunction isJsonContentType(contentType: string | null): boolean {\n if (!contentType) {\n return false;\n }\n\n return JSON_CONTENT_TYPE_PATTERN.test(contentType);\n}\n\nfunction describeResponseContentType(contentType: string | null): string {\n if (!contentType) {\n return 'an unknown content type';\n }\n\n const [normalized] = contentType.split(';', 1);\n return normalized?.trim().toLowerCase() || 'an unknown content type';\n}\n\nfunction summarizeResponseBody(text: string): string | null {\n const normalized = text.replace(/\\s+/g, ' ').trim();\n if (!normalized) {\n return null;\n }\n\n if (normalized.length <= MAX_RESPONSE_PREVIEW_LENGTH) {\n return normalized;\n }\n\n return `${normalized.slice(0, MAX_RESPONSE_PREVIEW_LENGTH - 1)}...`;\n}\n\nfunction describeResponseLocation(url?: string): string {\n if (!url) {\n return 'the requested endpoint';\n }\n\n try {\n const resolved = new URL(url, 'https://paperclip.invalid');\n return `${resolved.pathname}${resolved.search}` || resolved.toString();\n } catch {\n return url;\n }\n}\n\nfunction extractErrorMessage(body: unknown): string | null {\n if (!body || typeof body !== 'object') {\n return null;\n }\n\n const record = body as Record<string, unknown>;\n const candidates = [\n record.message,\n record.error,\n record.detail,\n record.details\n ];\n\n if (record.error && typeof record.error === 'object') {\n const nestedError = record.error as Record<string, unknown>;\n candidates.push(nestedError.message, nestedError.detail);\n }\n\n for (const candidate of candidates) {\n if (typeof candidate === 'string' && candidate.trim()) {\n return candidate.trim();\n }\n }\n\n return null;\n}\n\nexport function buildPaperclipUrl(pathOrUrl: string, origin?: string): string | null {\n const trimmed = typeof pathOrUrl === 'string' ? pathOrUrl.trim() : '';\n if (!trimmed) {\n return null;\n }\n\n if (isAbsoluteUrl(trimmed)) {\n return trimmed;\n }\n\n const resolvedOrigin = origin ?? resolveBrowserOrigin();\n if (!resolvedOrigin) {\n return null;\n }\n\n return new URL(trimmed, resolvedOrigin).toString();\n}\n\nexport function resolveCliAuthPollUrl(pollUrlOrPath?: string, origin?: string): string | null {\n const trimmed = typeof pollUrlOrPath === 'string' ? pollUrlOrPath.trim() : '';\n if (!trimmed) {\n return null;\n }\n\n if (isAbsoluteUrl(trimmed)) {\n return trimmed;\n }\n\n const normalizedPath = trimmed.startsWith('/api/')\n ? trimmed\n : `/api${trimmed.startsWith('/') ? '' : '/'}${trimmed}`;\n\n return buildPaperclipUrl(normalizedPath, origin);\n}\n\nexport async function readPaperclipJsonResponse<T>(response: Response, requestUrl?: string): Promise<T> {\n const responseText = await response.text();\n\n if (!responseText) {\n if (!response.ok) {\n throw new Error(`Paperclip API ${response.status}: ${response.statusText || 'Request failed.'}`);\n }\n\n return null as T;\n }\n\n const contentType = response.headers.get('content-type');\n const responseLocation = describeResponseLocation(response.url || requestUrl);\n const responsePreview = summarizeResponseBody(responseText);\n\n if (!isJsonContentType(contentType)) {\n const htmlHint = responsePreview && HTML_LIKE_RESPONSE_PATTERN.test(responsePreview)\n ? ' This usually means Paperclip served a sign-in page or app shell instead of the API endpoint.'\n : '';\n const previewHint = responsePreview ? ` Response preview: ${responsePreview}` : '';\n\n throw new Error(\n `Paperclip API ${response.status} returned ${describeResponseContentType(contentType)} instead of JSON from ${responseLocation}.${htmlHint}${previewHint}`\n );\n }\n\n let body: unknown = null;\n\n try {\n body = JSON.parse(responseText);\n } catch {\n throw new Error(`Paperclip API ${response.status} returned invalid JSON from ${responseLocation}.`);\n }\n\n if (!response.ok) {\n const message = extractErrorMessage(body) ?? responsePreview ?? response.statusText ?? 'Request failed.';\n throw new Error(`Paperclip API ${response.status}: ${message}`);\n }\n\n return body as T;\n}\n\nexport async function fetchJson<T>(url: string, init?: RequestInit): Promise<T> {\n const headers = new Headers(init?.headers);\n headers.set('accept', 'application/json');\n\n if (typeof init?.body === 'string' && !headers.has('content-type')) {\n headers.set('content-type', 'application/json');\n }\n\n const response = await fetch(url, {\n ...init,\n headers,\n credentials: init?.credentials ?? 'same-origin'\n });\n\n return readPaperclipJsonResponse<T>(response, url);\n}\n\nexport async function fetchPaperclipHealth(origin?: string): Promise<PaperclipHealthResponse | null> {\n const url = buildPaperclipUrl('/api/health', origin);\n if (!url) {\n return null;\n }\n\n try {\n return normalizePaperclipHealthResponse(await fetchJson<unknown>(url));\n } catch {\n return null;\n }\n}\n", "const SETTINGS_INDEX_HREF = '/instance/settings/plugins';\nconst GITHUB_SYNC_PLUGIN_KEY = 'paperclip-github-plugin';\nconst GITHUB_SYNC_PLUGIN_DISPLAY_NAME = 'GitHub Sync';\n\nfunction getStringValue(record: Record<string, unknown> | null, key: string): string | null {\n if (!record) {\n return null;\n }\n\n const value = record[key];\n return typeof value === 'string' && value.trim() ? value.trim() : null;\n}\n\nfunction resolveGitHubSyncPluginRecord(records: unknown): Record<string, unknown> | null {\n if (!Array.isArray(records)) {\n return null;\n }\n\n for (const entry of records) {\n if (!entry || typeof entry !== 'object') {\n continue;\n }\n\n const record = entry as Record<string, unknown>;\n const manifest = record.manifest && typeof record.manifest === 'object' ? record.manifest as Record<string, unknown> : null;\n const key =\n getStringValue(record, 'pluginKey')\n ?? getStringValue(record, 'key')\n ?? getStringValue(record, 'packageName')\n ?? getStringValue(record, 'name')\n ?? getStringValue(manifest, 'id');\n const displayName =\n getStringValue(record, 'displayName')\n ?? getStringValue(manifest, 'displayName');\n const id =\n getStringValue(record, 'id')\n ?? getStringValue(record, 'pluginId');\n\n if (id && (key === GITHUB_SYNC_PLUGIN_KEY || displayName === GITHUB_SYNC_PLUGIN_DISPLAY_NAME)) {\n return record;\n }\n }\n\n return null;\n}\n\nexport function resolveInstalledGitHubSyncPluginId(\n records: unknown,\n preferredPluginId?: string | null\n): string | null {\n if (typeof preferredPluginId === 'string' && preferredPluginId.trim()) {\n return preferredPluginId.trim();\n }\n\n const record = resolveGitHubSyncPluginRecord(records);\n return getStringValue(record, 'id') ?? getStringValue(record, 'pluginId');\n}\n\nexport function resolvePluginSettingsHref(records: unknown): string {\n const pluginId = resolveInstalledGitHubSyncPluginId(records);\n return pluginId ? `${SETTINGS_INDEX_HREF}/${pluginId}` : SETTINGS_INDEX_HREF;\n}\n", "export type PluginConfigBoardTokenRefs = Record<string, string>;\n\nexport interface GitHubSyncPluginConfig extends Record<string, unknown> {\n githubTokenRef?: string;\n paperclipBoardApiTokenRefs?: PluginConfigBoardTokenRefs;\n paperclipApiBaseUrl?: string;\n}\n\nfunction normalizeOptionalString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nfunction normalizePaperclipApiBaseUrl(value: unknown): string | undefined {\n const normalizedValue = normalizeOptionalString(value);\n if (!normalizedValue) {\n return undefined;\n }\n\n try {\n return new URL(normalizedValue).origin;\n } catch {\n return undefined;\n }\n}\n\nexport function normalizePluginConfigBoardTokenRefs(value: unknown): PluginConfigBoardTokenRefs | undefined {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n\n const entries = Object.entries(value as Record<string, unknown>)\n .map(([companyId, secretRef]) => {\n const normalizedCompanyId = normalizeOptionalString(companyId);\n const normalizedSecretRef = normalizeOptionalString(secretRef);\n return normalizedCompanyId && normalizedSecretRef\n ? [normalizedCompanyId, normalizedSecretRef] as const\n : null;\n })\n .filter((entry): entry is readonly [string, string] => Boolean(entry));\n\n if (entries.length === 0) {\n return undefined;\n }\n\n return Object.fromEntries(entries);\n}\n\nexport function normalizePluginConfig(value: unknown): GitHubSyncPluginConfig {\n if (!value || typeof value !== 'object') {\n return {};\n }\n\n const record = { ...(value as Record<string, unknown>) };\n const githubTokenRef = normalizeOptionalString(record.githubTokenRef);\n const paperclipBoardApiTokenRefs = normalizePluginConfigBoardTokenRefs(record.paperclipBoardApiTokenRefs);\n const paperclipApiBaseUrl = normalizePaperclipApiBaseUrl(record.paperclipApiBaseUrl);\n\n if (githubTokenRef) {\n record.githubTokenRef = githubTokenRef;\n } else {\n delete record.githubTokenRef;\n }\n\n if (paperclipBoardApiTokenRefs) {\n record.paperclipBoardApiTokenRefs = paperclipBoardApiTokenRefs;\n } else {\n delete record.paperclipBoardApiTokenRefs;\n }\n\n if (paperclipApiBaseUrl) {\n record.paperclipApiBaseUrl = paperclipApiBaseUrl;\n } else {\n delete record.paperclipApiBaseUrl;\n }\n\n return record as GitHubSyncPluginConfig;\n}\n\nexport function mergePluginConfig(\n currentValue: unknown,\n patch: Partial<GitHubSyncPluginConfig>\n): GitHubSyncPluginConfig {\n const current = normalizePluginConfig(currentValue);\n const currentBoardTokenRefs = normalizePluginConfigBoardTokenRefs(current.paperclipBoardApiTokenRefs);\n const patchBoardTokenRefs = normalizePluginConfigBoardTokenRefs(patch.paperclipBoardApiTokenRefs);\n const next = normalizePluginConfig({\n ...current,\n ...patch\n });\n\n if ('paperclipBoardApiTokenRefs' in patch) {\n const mergedBoardTokenRefs = {\n ...(currentBoardTokenRefs ?? {}),\n ...(patchBoardTokenRefs ?? {})\n };\n\n if (Object.keys(mergedBoardTokenRefs).length > 0) {\n next.paperclipBoardApiTokenRefs = mergedBoardTokenRefs;\n } else {\n delete next.paperclipBoardApiTokenRefs;\n }\n } else if (currentBoardTokenRefs) {\n next.paperclipBoardApiTokenRefs = currentBoardTokenRefs;\n }\n\n return next;\n}\n", "import { parseRepositoryReference } from '../github-repo.ts';\n\nexport interface RepositoryMappingSnapshot {\n repositoryUrl: string;\n paperclipProjectId?: string;\n}\n\nexport interface CompanyProjectSummary {\n id: string;\n name: string;\n}\n\nexport interface ProjectWorkspaceSummary {\n repoUrl?: string | null;\n sourceType?: string | null;\n isPrimary?: boolean | null;\n}\n\nexport interface ExistingProjectSyncCandidate {\n projectId: string;\n projectName: string;\n repositoryUrl: string;\n sourceType?: string;\n isPrimary: boolean;\n}\n\nfunction compareByProjectName(left: ExistingProjectSyncCandidate, right: ExistingProjectSyncCandidate): number {\n const projectNameComparison = left.projectName.localeCompare(right.projectName, undefined, { sensitivity: 'base' });\n if (projectNameComparison !== 0) {\n return projectNameComparison;\n }\n\n return left.repositoryUrl.localeCompare(right.repositoryUrl, undefined, { sensitivity: 'base' });\n}\n\nexport function discoverExistingProjectSyncCandidates(params: {\n projects: CompanyProjectSummary[];\n workspacesByProjectId: Record<string, ProjectWorkspaceSummary[] | undefined>;\n}): ExistingProjectSyncCandidate[] {\n const discoveredCandidates = new Map<string, ExistingProjectSyncCandidate>();\n\n for (const project of params.projects) {\n const projectId = project.id.trim();\n const projectName = project.name.trim();\n if (!projectId || !projectName) {\n continue;\n }\n\n const workspaces = params.workspacesByProjectId[projectId] ?? [];\n for (const workspace of workspaces) {\n const parsedRepository = parseRepositoryReference(workspace.repoUrl ?? '');\n if (!parsedRepository) {\n continue;\n }\n\n const repositoryUrl = parsedRepository.url;\n const candidateKey = `${projectId}:${repositoryUrl}`;\n const sourceType =\n typeof workspace.sourceType === 'string' && workspace.sourceType.trim()\n ? workspace.sourceType.trim()\n : undefined;\n const isPrimary = workspace.isPrimary === true;\n const existingCandidate = discoveredCandidates.get(candidateKey);\n if (existingCandidate) {\n discoveredCandidates.set(candidateKey, {\n ...existingCandidate,\n sourceType: existingCandidate.sourceType ?? sourceType,\n isPrimary: existingCandidate.isPrimary || isPrimary\n });\n continue;\n }\n\n discoveredCandidates.set(candidateKey, {\n projectId,\n projectName,\n repositoryUrl,\n sourceType,\n isPrimary\n });\n }\n }\n\n return [...discoveredCandidates.values()].sort(compareByProjectName);\n}\n\nexport function filterExistingProjectSyncCandidates(\n candidates: ExistingProjectSyncCandidate[],\n mappings: RepositoryMappingSnapshot[]\n): ExistingProjectSyncCandidate[] {\n const mappedProjectIds = new Set(\n mappings\n .map((mapping) => mapping.paperclipProjectId?.trim())\n .filter((value): value is string => Boolean(value))\n );\n const mappedRepositoryUrls = new Set(\n mappings\n .map((mapping) => parseRepositoryReference(mapping.repositoryUrl)?.url)\n .filter((value): value is string => Boolean(value))\n );\n\n return candidates.filter((candidate) =>\n !mappedProjectIds.has(candidate.projectId) && !mappedRepositoryUrls.has(candidate.repositoryUrl)\n );\n}\n"],
5
+ "mappings": "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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAu/BlB,sBAAsB;AAAA;AAGxB,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmUpB,sBAAsB;AAAA;AAGxB,IAAM,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAcP,yBAAyB;AAAA;AAAA;AAAA;AAAA,kBAIjC,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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",
6
+ "names": ["normalizeOptionalString", "SETTINGS_INDEX_HREF", "getStringValue", "hasSavedToken", "tokenStatus"]
7
7
  }