@merittdev/horus-lens 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +129 -0
- package/dist/browser.cjs +1 -1
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.js +2 -2
- package/dist/{chunk-DU7HNRF4.js → chunk-CTBY5XIN.js} +2 -2
- package/dist/{chunk-S6S3ZZQA.js → chunk-XRONR4GR.js} +2 -2
- package/dist/{chunk-S6S3ZZQA.js.map → chunk-XRONR4GR.js.map} +1 -1
- package/dist/dashboard.cjs +784 -434
- package/dist/dashboard.cjs.map +1 -1
- package/dist/dashboard.css +224 -1
- package/dist/dashboard.d.cts +85 -1
- package/dist/dashboard.d.ts +85 -1
- package/dist/dashboard.js +648 -301
- package/dist/dashboard.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/lens.min.js +1 -1
- package/dist/lens.min.js.map +1 -1
- package/dist/react.cjs +6 -3
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +18 -6
- package/dist/react.d.ts +18 -6
- package/dist/react.js +6 -4
- package/dist/react.js.map +1 -1
- package/dist/server.cjs +109 -0
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.cts +59 -0
- package/dist/server.d.ts +59 -0
- package/dist/server.js +82 -0
- package/dist/server.js.map +1 -0
- package/package.json +30 -4
- /package/dist/{chunk-DU7HNRF4.js.map → chunk-CTBY5XIN.js.map} +0 -0
package/dist/dashboard.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../dashboard/src/api.ts","../../dashboard/src/context.tsx","../../dashboard/src/components/ReportsTable.tsx","../../dashboard/src/utils.ts","../../dashboard/src/components/StatusBadge.tsx","../../dashboard/src/icons.tsx","../../dashboard/src/components/ReportDetail.tsx","../../dashboard/src/useAsync.ts","../../dashboard/src/components/ReplayPlayer.tsx","../../dashboard/src/components/IntegrationSettings.tsx","../../dashboard/src/components/IntegrationList.tsx","../../dashboard/src/components/OnboardingWizard.tsx","../../dashboard/src/highlight.tsx","../../dashboard/src/components/ProjectSettings.tsx","../../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs"],"sourcesContent":["import type {\n AssetKind,\n Report,\n ReportStatus,\n ReportSummary,\n Integration,\n IntegrationConfig,\n IntegrationProvider,\n Project,\n CreateProjectRequest,\n CreateProjectResponse,\n UpdateProjectRequest,\n S3ConfigInput,\n ConnectIntegrationResponse,\n} from '@horus-lens/shared';\n\n// Re-export the wire types the integrations/onboarding surface uses so existing\n// consumers importing them from this module keep working.\nexport type { Integration, IntegrationConfig, IntegrationProvider } from '@horus-lens/shared';\n\nexport interface ListReportsQuery {\n status?: ReportStatus;\n /** Case-insensitive substring search over comment and URL. */\n q?: string;\n limit?: number;\n cursor?: string;\n}\n\nexport interface ListReportsResult {\n reports: ReportSummary[];\n nextCursor: string | null;\n}\n\n/**\n * Typed fetch client for the Lens management API. Every request is\n * authenticated with `Authorization: Bearer <token>` where the token is\n * resolved lazily via `config.getToken` on each call — so hosts can hand out\n * short-lived, server-minted tokens instead of leaking the long-lived\n * `accessSecret` to the browser.\n */\nexport interface LensApi {\n listReports(query?: ListReportsQuery): Promise<ListReportsResult>;\n getReport(id: string): Promise<Report>;\n /** Resolves the short-lived signed GET URL for a report asset. */\n getAssetUrl(id: string, kind: AssetKind): Promise<string>;\n /** Fetches a report asset and parses it as JSON (e.g. the rrweb replay events). */\n getAssetJson<T>(id: string, kind: AssetKind): Promise<T>;\n listIntegrations(): Promise<Integration[]>;\n connectIntegration(\n provider: IntegrationProvider,\n opts?: { returnUrl?: string },\n ): Promise<ConnectIntegrationResponse>;\n /**\n * Dev-only: completes the OAuth dance that `connectIntegration` starts,\n * flipping the provider to `connected` (and active as the destination).\n */\n completeIntegrationDev(provider: IntegrationProvider, account?: string): Promise<Integration>;\n /** Makes `provider` the single active issue destination; returns the refreshed list. */\n activateIntegration(provider: IntegrationProvider): Promise<Integration[]>;\n /** Disconnects `provider`; returns the refreshed list. */\n disconnectIntegration(provider: IntegrationProvider): Promise<Integration[]>;\n /** Updates `provider`'s non-secret issue-routing config; returns the refreshed list. */\n updateIntegrationConfig(\n provider: IntegrationProvider,\n config: IntegrationConfig,\n ): Promise<Integration[]>;\n\n // ----- Project / onboarding -----\n /** Bootstrap/admin auth. `accessSecret` is returned exactly once. */\n createProject(body: CreateProjectRequest): Promise<CreateProjectResponse>;\n /** Reads the current project (S3 config masked, secret never returned). */\n getProject(): Promise<Project>;\n updateProject(body: UpdateProjectRequest): Promise<Project>;\n /** Verifies + stores S3 credentials. Rejects with code `s3_verification_failed` on bad creds. */\n setS3Config(body: S3ConfigInput): Promise<Project>;\n /** Removes the project's S3 config, reverting to Lens-managed storage. */\n clearS3Config(): Promise<Project>;\n /** Effective asset storage for the project (status only — credentials live in env). */\n getStorageStatus(): Promise<StorageStatus>;\n}\n\nexport interface StorageStatus {\n mode: 's3' | 'local';\n /** 'project' = per-project credentials, 'env' = the Lens API's environment. */\n source: 'project' | 'env' | null;\n bucket: string | null;\n region: string | null;\n /** Dev only. In production, report intake is rejected until S3 is configured. */\n localAllowed: boolean;\n}\n\nexport interface LensApiConfig {\n /** Base URL of the management API, e.g. `https://lens.acme.com` (no trailing `/v1`). */\n baseUrl: string;\n /**\n * Resolves a bearer token for each request. Return a short-lived token\n * minted by your backend — or an empty string when the host proxies\n * requests server-side and attaches credentials there (no Authorization\n * header is sent in that case, which keeps auth middleware like Clerk from\n * trying to validate a foreign bearer token).\n */\n getToken: () => string | Promise<string>;\n /**\n * Header used to carry the token. Defaults to `Authorization` with a\n * `Bearer ` prefix. Set a custom header (e.g. `x-lens-token`, sent raw)\n * when requests pass through auth middleware that hijacks Authorization\n * bearer tokens (Clerk returns 404 for foreign ones).\n */\n tokenHeader?: string;\n /**\n * Resolves the active Lens project id for hosts that manage multiple\n * projects behind one server-side proxy. When it returns a non-empty\n * string, every request additionally sends it as the `x-lens-project`\n * header — the proxy maps it to the right project secret, so the dashboard\n * never sees any secret. Return `null`/`undefined`/`''` (or omit the option\n * entirely) for single-project hosts, in which case no header is sent.\n */\n project?: () => string | null | undefined;\n}\n\nexport class LensApiError extends Error {\n constructor(\n public readonly status: number,\n public readonly code: string,\n message: string,\n ) {\n super(message);\n this.name = 'LensApiError';\n }\n}\n\nfunction joinUrl(baseUrl: string, path: string): string {\n return `${baseUrl.replace(/\\/+$/, '')}${path}`;\n}\n\nexport function createLensApi(config: LensApiConfig): LensApi {\n async function request<T>(path: string, init?: RequestInit): Promise<T> {\n const token = await config.getToken();\n const project = config.project?.();\n const res = await fetch(joinUrl(config.baseUrl, path), {\n ...init,\n headers: {\n Accept: 'application/json',\n ...(token\n ? config.tokenHeader && config.tokenHeader.toLowerCase() !== 'authorization'\n ? { [config.tokenHeader]: token }\n : { Authorization: `Bearer ${token}` }\n : {}),\n ...(project ? { 'x-lens-project': project } : {}),\n ...(init?.headers ?? {}),\n },\n });\n\n if (!res.ok) {\n let code = String(res.status);\n let message = res.statusText || 'Request failed';\n try {\n const body = (await res.json()) as { error?: string; message?: string };\n if (body?.error) code = body.error;\n if (body?.message) message = body.message;\n } catch {\n // non-JSON error body; keep status text\n }\n throw new LensApiError(res.status, code, message);\n }\n\n // Tolerate empty bodies (e.g. 204 from mutation endpoints).\n if (res.status === 204 || res.headers.get('content-length') === '0') {\n return undefined as T;\n }\n const text = await res.text();\n return (text ? JSON.parse(text) : undefined) as T;\n }\n\n return {\n async listReports(query) {\n const params = new URLSearchParams();\n if (query?.status) params.set('status', query.status);\n if (query?.q) params.set('q', query.q);\n if (query?.limit != null) params.set('limit', String(query.limit));\n if (query?.cursor) params.set('cursor', query.cursor);\n const qs = params.toString();\n return request<ListReportsResult>(`/v1/reports${qs ? `?${qs}` : ''}`);\n },\n\n async getReport(id) {\n return request<Report>(`/v1/reports/${encodeURIComponent(id)}`);\n },\n\n async getAssetUrl(id, kind) {\n const { url } = await request<{ url: string }>(\n `/v1/reports/${encodeURIComponent(id)}/assets/${encodeURIComponent(kind)}`,\n );\n return url;\n },\n\n async getAssetJson<T>(id: string, kind: AssetKind): Promise<T> {\n // Served through the API's asset relay, not the presigned storage URL:\n // browser-fetching a bucket directly requires the customer to configure\n // CORS on it, which we never want to depend on.\n return request<T>(`/v1/reports/${encodeURIComponent(id)}/assets/${kind}/raw`);\n },\n\n async listIntegrations() {\n const { integrations } = await request<{ integrations: Integration[] }>('/v1/integrations');\n return integrations;\n },\n\n async connectIntegration(provider, opts) {\n return request<ConnectIntegrationResponse>(\n `/v1/integrations/${encodeURIComponent(provider)}/connect`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(opts?.returnUrl != null ? { returnUrl: opts.returnUrl } : {}),\n },\n );\n },\n\n async completeIntegrationDev(provider, account) {\n return request<Integration>(\n `/v1/integrations/${encodeURIComponent(provider)}/callback`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(account != null ? { account } : {}),\n },\n );\n },\n\n async activateIntegration(provider) {\n await request<unknown>(`/v1/integrations/${encodeURIComponent(provider)}/activate`, {\n method: 'POST',\n });\n // Single-active semantics are server-owned; refetch for the authoritative list.\n return this.listIntegrations();\n },\n\n async disconnectIntegration(provider) {\n await request<unknown>(`/v1/integrations/${encodeURIComponent(provider)}`, {\n method: 'DELETE',\n });\n return this.listIntegrations();\n },\n\n async updateIntegrationConfig(provider, config) {\n // The endpoint returns the refreshed list, but tolerate a bare array,\n // a `{ integrations }` envelope, or an empty body by refetching — the\n // same way activate/disconnect stay resilient to the wire shape.\n const res = await request<{ integrations?: Integration[] } | Integration[] | undefined>(\n `/v1/integrations/${encodeURIComponent(provider)}/config`,\n {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(config),\n },\n );\n if (Array.isArray(res)) return res;\n if (res && Array.isArray(res.integrations)) return res.integrations;\n return this.listIntegrations();\n },\n\n async createProject(body) {\n return request<CreateProjectResponse>('/v1/projects', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n },\n\n async getProject() {\n return request<Project>('/v1/project');\n },\n\n async updateProject(body) {\n return request<Project>('/v1/project', {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n },\n\n async setS3Config(body) {\n return request<Project>('/v1/project/s3', {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n },\n\n async clearS3Config() {\n return request<Project>('/v1/project/s3', { method: 'DELETE' });\n },\n async getStorageStatus() {\n return request<StorageStatus>('/v1/storage');\n },\n };\n}\n","import { createContext, useContext } from 'react';\nimport type { LensApi } from './api.js';\n\nconst LensApiContext = createContext<LensApi | null>(null);\n\nexport interface LensDashboardProviderProps {\n api: LensApi;\n /**\n * Optional explicit theme. When set, the provider wraps its subtree in a\n * `display: contents` scope that stamps `lens-db--dark` / `lens-db--light`,\n * pinning the components to that theme regardless of the host's `.dark` class\n * or `data-theme`. When omitted, components render LIGHT by default and follow\n * a host opt-in (`.dark`/`[data-theme]`) if present. OS preference is ignored.\n */\n theme?: 'light' | 'dark';\n children: React.ReactNode;\n}\n\n/**\n * Supplies a {@link LensApi} instance to the Lens dashboard components via\n * React context. Wrap any subtree that renders `ReportsTable`, `ReportDetail`,\n * `ReplayPlayer`, or `IntegrationSettings`.\n */\nexport function LensDashboardProvider(props: LensDashboardProviderProps): React.JSX.Element {\n const provided = <LensApiContext.Provider value={props.api}>{props.children}</LensApiContext.Provider>;\n if (!props.theme) return provided;\n // `display: contents` carries the theme variables to descendant `.lens-db`\n // roots without introducing a layout box in the host page.\n return (\n <div className={`lens-db-theme-scope lens-db--${props.theme}`}>{provided}</div>\n );\n}\n\n/** Reads the {@link LensApi} from context, throwing a clear error if missing. */\nexport function useLensApi(): LensApi {\n const api = useContext(LensApiContext);\n if (!api) {\n throw new Error(\n '[lens] No LensApi found in context. Wrap your dashboard in <LensDashboardProvider api={createLensApi(...)}>.',\n );\n }\n return api;\n}\n","import { useCallback, useEffect, useState } from 'react';\nimport clsx from 'clsx';\nimport type { ReportStatus, ReportSummary } from '@horus-lens/shared';\nimport { useLensApi } from '../context.js';\nimport { relativeTime, urlPath } from '../utils.js';\nimport { StatusBadge } from './StatusBadge.js';\nimport { IconChevronLeft, IconChevronRight, IconInbox, IconPlay } from '../icons.js';\n\nexport interface ReportsTableProps {\n onSelect?: (id: string) => void;\n status?: ReportStatus;\n pageSize?: number;\n className?: string;\n}\n\nconst SEARCH_DEBOUNCE_MS = 350;\n\n/**\n * Paginated, searchable table of captured reports. A debounced search box\n * filters over comment + URL (server-side); pagination walks the API cursor\n * one page at a time via a client-side cursor stack (Prev/Next), where each\n * Next pushes the current cursor and each Prev pops back to it.\n */\nexport function ReportsTable(props: ReportsTableProps): React.JSX.Element {\n const { onSelect, status, pageSize = 20, className } = props;\n const api = useLensApi();\n\n const [reports, setReports] = useState<ReportSummary[]>([]);\n const [nextCursor, setNextCursor] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | undefined>(undefined);\n\n // Raw input vs. the debounced term actually sent to the API.\n const [input, setInput] = useState('');\n const [query, setQuery] = useState('');\n\n // Client-side cursor stack. `pageCursor` is the cursor used for the current\n // page (undefined = first page); `history` holds the cursors of the pages\n // behind it, so Prev pops back one and depth (history.length) gates Prev.\n const [pageCursor, setPageCursor] = useState<string | undefined>(undefined);\n const [history, setHistory] = useState<Array<string | undefined>>([]);\n\n const load = useCallback(\n async (cursor: string | undefined, q: string) => {\n setLoading(true);\n setError(undefined);\n try {\n const result = await api.listReports({\n status,\n q: q || undefined,\n limit: pageSize,\n cursor,\n });\n setReports(result.reports);\n setNextCursor(result.nextCursor);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setLoading(false);\n }\n },\n [api, status, pageSize],\n );\n\n // Debounce the raw input into the applied search term.\n useEffect(() => {\n const timer = setTimeout(() => setQuery(input.trim()), SEARCH_DEBOUNCE_MS);\n return () => clearTimeout(timer);\n }, [input]);\n\n // Initial mount + every applied-search (or status/pageSize) change resets\n // pagination to the first page and reloads.\n useEffect(() => {\n setHistory([]);\n setPageCursor(undefined);\n void load(undefined, query);\n }, [query, load]);\n\n function goNext(): void {\n if (!nextCursor) return;\n setHistory((h) => [...h, pageCursor]);\n setPageCursor(nextCursor);\n void load(nextCursor, query);\n }\n\n function goPrev(): void {\n if (history.length === 0) return;\n const prev = history[history.length - 1];\n setHistory((h) => h.slice(0, -1));\n setPageCursor(prev);\n void load(prev, query);\n }\n\n const canPrev = history.length > 0;\n const canNext = nextCursor !== null;\n const isOnlyPage = !canPrev && !canNext;\n const contextText = isOnlyPage\n ? `Showing ${reports.length}`\n : `${reports.length} on this page`;\n\n return (\n <div className={clsx('lens-db', 'lens-db__table-wrap', className)}>\n <div className=\"lens-db__table-toolbar\">\n <input\n type=\"search\"\n className=\"lens-db__input lens-db__table-search\"\n value={input}\n placeholder=\"Search comment or URL…\"\n aria-label=\"Search reports by comment or URL\"\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n setInput('');\n }\n }}\n />\n {!loading && !error && reports.length > 0 && (\n <span className=\"lens-db__table-context lens-db__muted\">{contextText}</span>\n )}\n </div>\n\n <table className=\"lens-db__table\">\n <thead>\n <tr>\n <th>Created</th>\n <th>Comment</th>\n <th>Path</th>\n <th>Status</th>\n <th className=\"lens-db__num\">Errors</th>\n <th className=\"lens-db__center\">Replay</th>\n <th>Issue</th>\n </tr>\n </thead>\n <tbody>\n {loading ? (\n <SkeletonRows rows={6} />\n ) : error ? (\n <tr>\n <td colSpan={7} className=\"lens-db__error\">\n Failed to load reports: {error.message}{' '}\n <button\n type=\"button\"\n className=\"lens-db__link-btn\"\n onClick={() => void load(pageCursor, query)}\n >\n Retry\n </button>\n </td>\n </tr>\n ) : reports.length === 0 ? (\n <tr>\n <td colSpan={7} className=\"lens-db__empty\">\n <span className=\"lens-db__empty-icon\">\n <IconInbox size={32} />\n </span>\n {query ? (\n <>\n <div className=\"lens-db__empty-title\">No matching reports</div>\n <div className=\"lens-db__empty-hint\">\n No reports match “{query}”. Try a different search.\n </div>\n </>\n ) : (\n <>\n <div className=\"lens-db__empty-title\">No reports yet</div>\n <div className=\"lens-db__empty-hint\">\n Visit your app with <code>?lens=true</code> and submit one.\n </div>\n </>\n )}\n </td>\n </tr>\n ) : (\n reports.map((r) => (\n <tr\n key={r.id}\n className={clsx('lens-db__row', onSelect && 'lens-db__row--clickable')}\n onClick={onSelect ? () => onSelect(r.id) : undefined}\n tabIndex={onSelect ? 0 : undefined}\n onKeyDown={\n onSelect\n ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onSelect(r.id);\n }\n }\n : undefined\n }\n >\n <td className=\"lens-db__muted lens-db__tnum\" title={r.createdAt}>\n {relativeTime(r.createdAt)}\n </td>\n <td>\n {r.comment ? (\n <span className=\"lens-db__cell-comment\" title={r.comment}>\n {r.comment}\n </span>\n ) : (\n <span className=\"lens-db__muted\">—</span>\n )}\n </td>\n <td className=\"lens-db__mono lens-db__muted\" title={r.url}>\n {urlPath(r.url)}\n </td>\n <td>\n <StatusBadge status={r.status} />\n </td>\n <td className=\"lens-db__num\">\n {r.errorCount > 0 ? (\n <span className=\"lens-db__badge lens-db__badge--danger\">{r.errorCount}</span>\n ) : (\n <span className=\"lens-db__muted\">0</span>\n )}\n </td>\n <td className=\"lens-db__center\">\n {r.hasReplay ? (\n <span className=\"lens-db__play\" title=\"Session replay captured\" aria-label=\"Has replay\">\n <IconPlay size={14} />\n </span>\n ) : (\n <span className=\"lens-db__muted\" aria-label=\"No replay\">—</span>\n )}\n </td>\n <td>\n {r.externalIssue ? (\n <a\n className=\"lens-db__link\"\n href={r.externalIssue.url}\n target=\"_blank\"\n rel=\"noreferrer\"\n onClick={(e) => e.stopPropagation()}\n >\n {r.externalIssue.key}\n </a>\n ) : (\n <span className=\"lens-db__muted\">—</span>\n )}\n </td>\n </tr>\n ))\n )}\n </tbody>\n </table>\n\n {!error && (canPrev || canNext) && (\n <div className=\"lens-db__table-footer lens-db__pager\">\n <button\n type=\"button\"\n className=\"lens-db__btn lens-db__btn--ghost\"\n disabled={!canPrev || loading}\n onClick={goPrev}\n >\n <IconChevronLeft size={16} />\n Prev\n </button>\n <button\n type=\"button\"\n className=\"lens-db__btn lens-db__btn--ghost\"\n disabled={!canNext || loading}\n onClick={goNext}\n >\n Next\n <IconChevronRight size={16} />\n </button>\n </div>\n )}\n </div>\n );\n}\n\nfunction SkeletonRows({ rows }: { rows: number }): React.JSX.Element {\n return (\n <>\n {Array.from({ length: rows }).map((_, i) => (\n <tr key={i} className=\"lens-db__row lens-db__row--skeleton\" aria-hidden>\n {Array.from({ length: 7 }).map((__, j) => (\n <td key={j}>\n <span className=\"lens-db__skeleton\" />\n </td>\n ))}\n </tr>\n ))}\n </>\n );\n}\n","/** Hand-rolled relative-time formatter — avoids pulling in date-fns/dayjs. */\nexport function relativeTime(iso: string | null | undefined, now: number = Date.now()): string {\n if (!iso) return '—';\n const then = new Date(iso).getTime();\n if (Number.isNaN(then)) return '—';\n const diff = now - then;\n const sec = Math.round(diff / 1000);\n if (sec < 5) return 'just now';\n if (sec < 60) return `${sec}s ago`;\n const min = Math.round(sec / 60);\n if (min < 60) return `${min}m ago`;\n const hr = Math.round(min / 60);\n if (hr < 24) return `${hr}h ago`;\n const day = Math.round(hr / 24);\n if (day < 7) return `${day}d ago`;\n const wk = Math.round(day / 7);\n if (wk < 5) return `${wk}w ago`;\n const mo = Math.round(day / 30);\n if (mo < 12) return `${mo}mo ago`;\n const yr = Math.round(day / 365);\n return `${yr}y ago`;\n}\n\n/** Absolute timestamp for tooltips / detail headers. */\nexport function formatTimestamp(iso: string | null | undefined): string {\n if (!iso) return '—';\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return '—';\n return d.toLocaleString();\n}\n\n/** Truncates a string to `max` chars with an ellipsis. */\nexport function truncate(value: string, max = 80): string {\n if (value.length <= max) return value;\n return `${value.slice(0, max - 1).trimEnd()}…`;\n}\n\n/** Extracts the path (+ query) from a URL string, falling back to the raw value. */\nexport function urlPath(raw: string | undefined): string {\n if (!raw) return '—';\n try {\n const u = new URL(raw);\n return `${u.pathname}${u.search}` || '/';\n } catch {\n return raw;\n }\n}\n\n/** Formats a network duration in ms. */\nexport function formatDuration(ms: number | null | undefined): string {\n if (ms == null) return '—';\n if (ms < 1000) return `${Math.round(ms)}ms`;\n return `${(ms / 1000).toFixed(2)}s`;\n}\n","import clsx from 'clsx';\nimport type { ReportStatus } from '@horus-lens/shared';\n\nconst LABELS: Record<ReportStatus, string> = {\n initiated: 'Initiated',\n submitted: 'Submitted',\n triaged: 'Triaged',\n linked: 'Linked',\n resolved: 'Resolved',\n};\n\nexport function StatusBadge({ status }: { status: ReportStatus }): React.JSX.Element {\n return (\n <span className={clsx('lens-db__badge', `lens-db__badge--${status}`)}>{LABELS[status]}</span>\n );\n}\n","/**\n * Shared inline SVG icon set for the Lens dashboard.\n *\n * One consistent family: 16px viewport, 1.5 stroke, `currentColor`, rounded\n * caps/joins. Icons are decorative by default (`aria-hidden`); callers that use\n * an icon as the sole label of a control must supply an accessible name on the\n * control itself (e.g. `aria-label` on the button).\n */\nimport type { SVGProps } from 'react';\n\ntype IconProps = SVGProps<SVGSVGElement> & { size?: number };\n\nfunction base({ size = 16, ...rest }: IconProps): SVGProps<SVGSVGElement> {\n return {\n width: size,\n height: size,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.5,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n 'aria-hidden': true,\n focusable: false,\n ...rest,\n };\n}\n\nexport function IconPlay(props: IconProps): React.JSX.Element {\n return (\n <svg {...base(props)}>\n <path d=\"M8 5.5v13l11-6.5-11-6.5Z\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n );\n}\n\nexport function IconPause(props: IconProps): React.JSX.Element {\n return (\n <svg {...base(props)}>\n <rect x=\"7\" y=\"5\" width=\"3.5\" height=\"14\" rx=\"1\" fill=\"currentColor\" stroke=\"none\" />\n <rect x=\"13.5\" y=\"5\" width=\"3.5\" height=\"14\" rx=\"1\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n );\n}\n\nexport function IconClose(props: IconProps): React.JSX.Element {\n return (\n <svg {...base(props)}>\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n );\n}\n\nexport function IconArrowLeft(props: IconProps): React.JSX.Element {\n return (\n <svg {...base(props)}>\n <path d=\"M19 12H5M12 19l-7-7 7-7\" />\n </svg>\n );\n}\n\nexport function IconChevronLeft(props: IconProps): React.JSX.Element {\n return (\n <svg {...base(props)}>\n <path d=\"M15 6l-6 6 6 6\" />\n </svg>\n );\n}\n\nexport function IconChevronRight(props: IconProps): React.JSX.Element {\n return (\n <svg {...base(props)}>\n <path d=\"M9 6l6 6-6 6\" />\n </svg>\n );\n}\n\nexport function IconExternal(props: IconProps): React.JSX.Element {\n return (\n <svg {...base(props)}>\n <path d=\"M14 5h5v5M19 5l-8 8\" />\n <path d=\"M18 13.5V18a1.5 1.5 0 0 1-1.5 1.5H6A1.5 1.5 0 0 1 4.5 18V7.5A1.5 1.5 0 0 1 6 6h4.5\" />\n </svg>\n );\n}\n\nexport function IconCopy(props: IconProps): React.JSX.Element {\n return (\n <svg {...base(props)}>\n <rect x=\"9\" y=\"9\" width=\"11\" height=\"11\" rx=\"2\" />\n <path d=\"M5 15V6a1 1 0 0 1 1-1h9\" />\n </svg>\n );\n}\n\nexport function IconCheck(props: IconProps): React.JSX.Element {\n return (\n <svg {...base(props)}>\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n\nexport function IconCheckCircle(props: IconProps): React.JSX.Element {\n return (\n <svg {...base(props)}>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"m8.5 12 2.5 2.5 4.5-5\" />\n </svg>\n );\n}\n\nexport function IconAlertTriangle(props: IconProps): React.JSX.Element {\n return (\n <svg {...base(props)}>\n <path d=\"M12 4.5 21 19.5H3L12 4.5Z\" />\n <path d=\"M12 10v4.5\" />\n <path d=\"M12 17.25h.01\" />\n </svg>\n );\n}\n\nexport function IconInbox(props: IconProps): React.JSX.Element {\n return (\n <svg {...base(props)}>\n <path d=\"M4 13h4l1.5 2.5h5L16 13h4\" />\n <path d=\"M6.5 5h11l3 8v4.5A1.5 1.5 0 0 1 19 19H5a1.5 1.5 0 0 1-1.5-1.5V13l3-8Z\" />\n </svg>\n );\n}\n\n/**\n * Brand marks (integration providers). Unlike the stroked icon family above,\n * these are official monochrome glyphs (simple-icons path data) filled with\n * `currentColor` so they inherit the surrounding text color and tint cleanly on\n * a neutral tile. Decorative by default — the provider name labels the control.\n */\nfunction brand({ size = 16, ...rest }: IconProps): SVGProps<SVGSVGElement> {\n return {\n width: size,\n height: size,\n viewBox: '0 0 24 24',\n fill: 'currentColor',\n 'aria-hidden': true,\n focusable: false,\n ...rest,\n };\n}\n\nexport function IconGitHub(props: IconProps): React.JSX.Element {\n return (\n <svg {...brand(props)}>\n <path d=\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\" />\n </svg>\n );\n}\n\nexport function IconLinear(props: IconProps): React.JSX.Element {\n return (\n <svg {...brand(props)}>\n <path d=\"M2.886 4.18A11.982 11.982 0 0 1 11.99 0C18.624 0 24 5.376 24 12.009c0 3.64-1.62 6.903-4.18 9.105L2.887 4.18ZM1.817 5.626l16.556 16.556c-.524.33-1.075.62-1.65.866L.951 7.277c.247-.575.537-1.126.866-1.65ZM.322 9.163l14.515 14.515c-.71.172-1.443.282-2.195.322L0 11.358a12 12 0 0 1 .322-2.195Zm-.17 4.862 9.823 9.824a12.02 12.02 0 0 1-9.824-9.824Z\" />\n </svg>\n );\n}\n\nexport function IconJira(props: IconProps): React.JSX.Element {\n return (\n <svg {...brand(props)}>\n <path d=\"M11.571 11.513H0a5.218 5.218 0 0 0 5.232 5.215h2.13v2.057A5.215 5.215 0 0 0 12.575 24V12.518a1.005 1.005 0 0 0-1.005-1.005zm5.723-5.756H5.736a5.215 5.215 0 0 0 5.215 5.214h2.129v2.058a5.218 5.218 0 0 0 5.215 5.214V6.758a1.001 1.001 0 0 0-1.001-1.001zM23.013 0H11.455a5.215 5.215 0 0 0 5.215 5.215h2.129v2.057A5.215 5.215 0 0 0 24 12.483V1.005A1.001 1.001 0 0 0 23.013 0Z\" />\n </svg>\n );\n}\n","import { useId, useRef, useState } from 'react';\nimport clsx from 'clsx';\nimport type {\n AppContext,\n AssetKind,\n AssetRef,\n ConsoleEntry,\n EnvContext,\n ErrorEntry,\n NetworkEntry,\n Report,\n ReportMetadata,\n} from '@horus-lens/shared';\nimport { useLensApi } from '../context.js';\nimport { useAsync } from '../useAsync.js';\nimport { formatDuration, formatTimestamp, relativeTime, truncate, urlPath } from '../utils.js';\nimport { StatusBadge } from './StatusBadge.js';\nimport { ReplayPlayer } from './ReplayPlayer.js';\nimport { IconClose, IconExternal } from '../icons.js';\n\nexport interface ReportDetailProps {\n reportId: string;\n onClose?: () => void;\n className?: string;\n}\n\n/** Full detail view for a single report: context, errors, logs, replay and assets. */\nexport function ReportDetail(props: ReportDetailProps): React.JSX.Element {\n const { reportId, onClose, className } = props;\n const api = useLensApi();\n const { data: report, error, loading, reload } = useAsync<Report>(\n () => api.getReport(reportId),\n [reportId],\n );\n\n return (\n <div className={clsx('lens-db', 'lens-db__detail', className)}>\n {loading && <div className=\"lens-db__detail-loading\">Loading report…</div>}\n\n {error && (\n <div className=\"lens-db__error\">\n Failed to load report: {error.message}{' '}\n <button type=\"button\" className=\"lens-db__link-btn\" onClick={reload}>\n Retry\n </button>\n </div>\n )}\n\n {report && <ReportDetailBody report={report} onClose={onClose} />}\n </div>\n );\n}\n\ntype TabId = 'overview' | 'replay' | 'logs' | 'network';\n\ninterface TabDef {\n id: TabId;\n label: string;\n /** Suffix count shown on the tab when > 0. */\n count?: number;\n}\n\nfunction ReportDetailBody({ report, onClose }: { report: Report; onClose?: () => void }): React.JSX.Element {\n const meta = report.metadata;\n const [tab, setTab] = useState<TabId>('overview');\n // Replay mounts lazily on first activation and stays mounted afterwards, so\n // switching tabs never reloads rrweb-player or restarts playback.\n const [replayMounted, setReplayMounted] = useState(false);\n const uid = useId();\n const tabRefs = useRef<Record<TabId, HTMLButtonElement | null>>({\n overview: null,\n replay: null,\n logs: null,\n network: null,\n });\n\n const errorCount = meta?.errors.length ?? 0;\n const consoleCount = meta?.consoleTail.length ?? 0;\n const networkCount = meta?.networkTail.length ?? 0;\n\n const tabs: TabDef[] = [\n { id: 'overview', label: 'Overview' },\n { id: 'replay', label: 'Replay' },\n { id: 'logs', label: 'Logs', count: errorCount + consoleCount },\n { id: 'network', label: 'Network', count: networkCount },\n ];\n\n function select(id: TabId) {\n if (id === 'replay') setReplayMounted(true);\n setTab(id);\n }\n\n function onTabKeyDown(e: React.KeyboardEvent, index: number) {\n let next = index;\n if (e.key === 'ArrowRight' || e.key === 'ArrowDown') next = (index + 1) % tabs.length;\n else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') next = (index - 1 + tabs.length) % tabs.length;\n else if (e.key === 'Home') next = 0;\n else if (e.key === 'End') next = tabs.length - 1;\n else return;\n e.preventDefault();\n const nextTab = tabs[next]?.id;\n if (!nextTab) return;\n select(nextTab);\n tabRefs.current[nextTab]?.focus();\n }\n\n const tabId = (id: TabId) => `${uid}-tab-${id}`;\n const panelId = (id: TabId) => `${uid}-panel-${id}`;\n\n return (\n <>\n <header className=\"lens-db__detail-header\">\n <div className=\"lens-db__detail-header-main\">\n <StatusBadge status={report.status} />\n <span className=\"lens-db__detail-time\" title={formatTimestamp(report.createdAt)}>\n {relativeTime(report.createdAt)}\n </span>\n {report.externalIssue && (\n <a\n className=\"lens-db__link lens-db__link-inline\"\n href={report.externalIssue.url}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {report.externalIssue.provider} · {report.externalIssue.key}\n <IconExternal size={13} />\n </a>\n )}\n </div>\n {onClose && (\n <button type=\"button\" className=\"lens-db__icon-btn\" aria-label=\"Close\" onClick={onClose}>\n <IconClose />\n </button>\n )}\n </header>\n\n <div className=\"lens-db__tabs\" role=\"tablist\" aria-label=\"Report sections\">\n {tabs.map((t, i) => {\n const active = t.id === tab;\n return (\n <button\n key={t.id}\n type=\"button\"\n role=\"tab\"\n id={tabId(t.id)}\n ref={(el) => {\n tabRefs.current[t.id] = el;\n }}\n aria-selected={active}\n aria-controls={panelId(t.id)}\n tabIndex={active ? 0 : -1}\n className={clsx('lens-db__tab', active && 'lens-db__tab--active')}\n onClick={() => select(t.id)}\n onKeyDown={(e) => onTabKeyDown(e, i)}\n >\n <span className=\"lens-db__tab-label\">{t.label}</span>\n {t.count != null && t.count > 0 && (\n <span className=\"lens-db__tab-count\">{t.count}</span>\n )}\n </button>\n );\n })}\n </div>\n\n <div className=\"lens-db__tabpanels\">\n {tab === 'overview' && (\n <div role=\"tabpanel\" id={panelId('overview')} aria-labelledby={tabId('overview')} tabIndex={0}>\n <OverviewPanel report={report} meta={meta} />\n </div>\n )}\n\n {tab === 'logs' && (\n <div role=\"tabpanel\" id={panelId('logs')} aria-labelledby={tabId('logs')} tabIndex={0}>\n <LogsPanel errors={meta?.errors ?? []} consoleEntries={meta?.consoleTail ?? []} />\n </div>\n )}\n\n {tab === 'network' && (\n <div role=\"tabpanel\" id={panelId('network')} aria-labelledby={tabId('network')} tabIndex={0}>\n <NetworkPanel entries={meta?.networkTail ?? []} />\n </div>\n )}\n\n {/* Replay stays mounted once activated so playback survives tab switches. */}\n {replayMounted && (\n <div\n role=\"tabpanel\"\n id={panelId('replay')}\n aria-labelledby={tabId('replay')}\n tabIndex={0}\n hidden={tab !== 'replay'}\n >\n <div className=\"lens-db__panel\">\n <ReplayPlayer reportId={report.id} />\n </div>\n </div>\n )}\n </div>\n </>\n );\n}\n\n/* ---------------------------------------------------------------------------\n * Overview tab\n * ------------------------------------------------------------------------- */\n\nfunction OverviewPanel({ report, meta }: { report: Report; meta: ReportMetadata | null }): React.JSX.Element {\n const hasScreenshot = report.assets.some((a) => a.kind === 'screenshot');\n const attachments = report.assets.filter((a) => a.kind !== 'screenshot');\n\n if (!meta) {\n return (\n <>\n {hasScreenshot && (\n <Section title=\"Screenshot\">\n <Screenshot reportId={report.id} />\n </Section>\n )}\n <Section title=\"Report\">\n <p className=\"lens-db__muted\">This report has no metadata yet (still initiating).</p>\n </Section>\n </>\n );\n }\n\n const hasTarget = Boolean(meta.target && (meta.target.domPath || meta.target.reactComponents?.length));\n\n return (\n <>\n {meta.comment && (\n <Section title=\"Comment\">\n <p className=\"lens-db__comment\">{meta.comment}</p>\n </Section>\n )}\n\n {hasScreenshot && (\n <Section title=\"Screenshot\">\n <Screenshot reportId={report.id} />\n </Section>\n )}\n\n <Section title=\"Environment\">\n <EnvironmentGrid env={meta.env} app={meta.app} />\n </Section>\n\n {hasTarget && meta.target && (\n <Section title=\"Target element\">\n {meta.target.domPath && <code className=\"lens-db__dompath\">{meta.target.domPath}</code>}\n {meta.target.reactComponents && meta.target.reactComponents.length > 0 && (\n <div className=\"lens-db__chips\">\n {meta.target.reactComponents.map((c, i) => (\n <span key={`${c}-${i}`} className=\"lens-db__chip\">\n {c}\n </span>\n ))}\n </div>\n )}\n </Section>\n )}\n\n {attachments.length > 0 && (\n <Section title=\"Attachments\">\n <Attachments reportId={report.id} assets={attachments} />\n </Section>\n )}\n </>\n );\n}\n\n/**\n * Lazily resolves the signed screenshot URL when the Overview tab mounts and\n * renders it in a bordered, zoomable frame. Failures collapse silently.\n */\nfunction Screenshot({ reportId }: { reportId: string }): React.JSX.Element | null {\n const api = useLensApi();\n const { data: url, error, loading } = useAsync<string>(\n () => api.getAssetUrl(reportId, 'screenshot'),\n [reportId],\n );\n\n if (loading) {\n return <div className=\"lens-db__shot lens-db__shot--loading\" aria-hidden />;\n }\n if (error || !url) return null;\n\n return (\n <a\n className=\"lens-db__shot\"\n href={url}\n target=\"_blank\"\n rel=\"noreferrer\"\n title=\"Open full screenshot in a new tab\"\n >\n <img className=\"lens-db__shot-img\" src={url} alt=\"Captured screenshot\" loading=\"lazy\" />\n </a>\n );\n}\n\n/* ---------------------------------------------------------------------------\n * Logs tab (errors + console)\n * ------------------------------------------------------------------------- */\n\ninterface ErrorGroup {\n entry: ErrorEntry;\n count: number;\n}\n\n/** Collapses errors sharing the same message into a single row with an ×N count. */\nfunction dedupeErrors(errors: ErrorEntry[]): ErrorGroup[] {\n const byMessage = new Map<string, ErrorGroup>();\n const order: ErrorGroup[] = [];\n for (const entry of errors) {\n const existing = byMessage.get(entry.message);\n if (existing) {\n existing.count += 1;\n } else {\n const group: ErrorGroup = { entry, count: 1 };\n byMessage.set(entry.message, group);\n order.push(group);\n }\n }\n return order;\n}\n\nfunction LogsPanel({ errors, consoleEntries }: { errors: ErrorEntry[]; consoleEntries: ConsoleEntry[] }): React.JSX.Element {\n const groups = dedupeErrors(errors);\n return (\n <>\n <Section title={`Errors${errors.length ? ` (${groups.length})` : ''}`}>\n {groups.length === 0 ? (\n <p className=\"lens-db__muted\">Nothing captured.</p>\n ) : (\n <div className=\"lens-db__scroll\">\n <ul className=\"lens-db__errlog\">\n {groups.map((g, i) => (\n <ErrorRow key={i} group={g} />\n ))}\n </ul>\n </div>\n )}\n </Section>\n\n <Section title=\"Console\">\n {consoleEntries.length === 0 ? (\n <p className=\"lens-db__muted\">Nothing captured.</p>\n ) : (\n <div className=\"lens-db__scroll\">\n <ConsoleTail entries={consoleEntries} />\n </div>\n )}\n </Section>\n </>\n );\n}\n\nfunction ErrorRow({ group }: { group: ErrorGroup }): React.JSX.Element {\n const { entry, count } = group;\n const firstLine = entry.message.split('\\n')[0] ?? entry.message;\n return (\n <li className=\"lens-db__errlog-item\">\n <details className=\"lens-db__errlog-details\">\n <summary className=\"lens-db__errlog-summary\">\n <span className=\"lens-db__errlog-msg\">{truncate(firstLine, 140)}</span>\n {count > 1 && <span className=\"lens-db__count-badge\">×{count}</span>}\n <span className=\"lens-db__errlog-source\">{entry.source}</span>\n </summary>\n <div className=\"lens-db__errlog-body\">\n {entry.message !== firstLine && <pre className=\"lens-db__stack\">{entry.message}</pre>}\n {entry.stack && <pre className=\"lens-db__stack\">{entry.stack}</pre>}\n </div>\n </details>\n </li>\n );\n}\n\nfunction ConsoleTail({ entries }: { entries: ConsoleEntry[] }): React.JSX.Element {\n return (\n <div className=\"lens-db__console\">\n {entries.map((e, i) => (\n <div key={i} className={clsx('lens-db__console-line', `lens-db__console-line--${e.level}`)}>\n <span className=\"lens-db__console-level\">{e.level}</span>\n <span className=\"lens-db__console-args\">{e.args.join(' ')}</span>\n </div>\n ))}\n </div>\n );\n}\n\n/* ---------------------------------------------------------------------------\n * Network tab\n * ------------------------------------------------------------------------- */\n\nfunction NetworkPanel({ entries }: { entries: NetworkEntry[] }): React.JSX.Element {\n return (\n <div className=\"lens-db__panel\">\n {entries.length === 0 ? (\n <p className=\"lens-db__muted\">Nothing captured.</p>\n ) : (\n <NetworkTail entries={entries} />\n )}\n </div>\n );\n}\n\nfunction NetworkTail({ entries }: { entries: NetworkEntry[] }): React.JSX.Element {\n return (\n <table className=\"lens-db__nettable\">\n <thead>\n <tr>\n <th>Method</th>\n <th>Path</th>\n <th className=\"lens-db__num\">Status</th>\n <th className=\"lens-db__num\">Duration</th>\n </tr>\n </thead>\n <tbody>\n {entries.map((e, i) => {\n const bad = e.error != null || e.ok === false || (e.status != null && (e.status < 200 || e.status >= 300));\n return (\n <tr key={i} className={clsx(bad && 'lens-db__netrow--bad')}>\n <td className=\"lens-db__mono\">{e.method}</td>\n <td className=\"lens-db__mono lens-db__muted\" title={e.url}>\n {urlPath(e.url)}\n </td>\n <td className=\"lens-db__num lens-db__mono lens-db__net-status\">{e.error ? 'ERR' : (e.status ?? '—')}</td>\n <td className=\"lens-db__num lens-db__muted\">{formatDuration(e.durationMs)}</td>\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n}\n\n/* ---------------------------------------------------------------------------\n * Shared building blocks\n * ------------------------------------------------------------------------- */\n\nfunction Section({ title, children }: { title: string; children: React.ReactNode }): React.JSX.Element {\n return (\n <section className=\"lens-db__section\">\n <h3 className=\"lens-db__section-title\">{title}</h3>\n <div className=\"lens-db__section-body\">{children}</div>\n </section>\n );\n}\n\nfunction EnvironmentGrid({ env, app }: { env: EnvContext; app?: AppContext }): React.JSX.Element {\n const rows: Array<[string, string | undefined]> = [\n ['Browser', env.browser],\n ['OS', env.os],\n ['Viewport', `${env.viewport.width}×${env.viewport.height}`],\n ['Language', env.language],\n ['Timezone', env.timezone],\n ['URL', env.url],\n ['Route', env.route],\n ['Release', app?.release],\n ['Git SHA', app?.gitSha],\n ];\n const monoLabels = new Set(['URL', 'Route', 'Release', 'Git SHA']);\n return (\n <dl className=\"lens-db__grid\">\n {rows\n .filter(([, v]) => v != null && v !== '')\n .map(([label, value]) => (\n <div key={label} className=\"lens-db__grid-row\">\n <dt className=\"lens-db__grid-label\">{label}</dt>\n <dd className={clsx('lens-db__grid-value', monoLabels.has(label) && 'lens-db__mono')}>\n {value}\n </dd>\n </div>\n ))}\n </dl>\n );\n}\n\nfunction Attachments({ reportId, assets }: { reportId: string; assets: AssetRef[] }): React.JSX.Element {\n const api = useLensApi();\n const [busy, setBusy] = useState<string | null>(null);\n const [err, setErr] = useState<string | undefined>(undefined);\n\n async function open(kind: AssetKind) {\n setBusy(kind);\n setErr(undefined);\n try {\n const url = await api.getAssetUrl(reportId, kind);\n window.open(url, '_blank', 'noopener,noreferrer');\n } catch (e) {\n setErr(e instanceof Error ? e.message : String(e));\n } finally {\n setBusy(null);\n }\n }\n\n return (\n <div className=\"lens-db__attachments\">\n {err && <div className=\"lens-db__error\">{err}</div>}\n <ul className=\"lens-db__attachment-list\">\n {assets.map((a) => (\n <li key={a.key} className=\"lens-db__attachment\">\n <span className=\"lens-db__attachment-kind\">{a.kind}</span>\n <span className=\"lens-db__muted lens-db__attachment-type\">{a.contentType}</span>\n {a.byteSize != null && (\n <span className=\"lens-db__muted lens-db__attachment-size\">{formatBytes(a.byteSize)}</span>\n )}\n <button\n type=\"button\"\n className=\"lens-db__link-btn\"\n disabled={busy === a.kind}\n onClick={() => void open(a.kind)}\n >\n {busy === a.kind ? 'Opening…' : 'Download'}\n </button>\n </li>\n ))}\n </ul>\n </div>\n );\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport interface AsyncState<T> {\n data: T | undefined;\n error: Error | undefined;\n loading: boolean;\n /** Re-runs the async function. */\n reload: () => void;\n}\n\n/**\n * Tiny data-fetching primitive — no react-query dependency. Runs `fn` on mount\n * and whenever `deps` change, tracks loading/error, and ignores results from\n * stale invocations (so the last-requested call always wins).\n */\nexport function useAsync<T>(fn: () => Promise<T>, deps: unknown[]): AsyncState<T> {\n const [data, setData] = useState<T | undefined>(undefined);\n const [error, setError] = useState<Error | undefined>(undefined);\n const [loading, setLoading] = useState<boolean>(true);\n const [nonce, setNonce] = useState(0);\n const runId = useRef(0);\n\n const reload = useCallback(() => setNonce((n) => n + 1), []);\n\n useEffect(() => {\n const id = ++runId.current;\n let active = true;\n setLoading(true);\n setError(undefined);\n\n fn()\n .then((result) => {\n if (active && id === runId.current) {\n setData(result);\n setLoading(false);\n }\n })\n .catch((err: unknown) => {\n if (active && id === runId.current) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setLoading(false);\n }\n });\n\n return () => {\n active = false;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [...deps, nonce]);\n\n return { data, error, loading, reload };\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport clsx from 'clsx';\nimport { useLensApi } from '../context.js';\nimport { IconPlay, IconPause } from '../icons.js';\n\n/** Instance type of rrweb's Replayer, resolved without a runtime import. */\ntype ReplayerInstance = import('rrweb').Replayer;\n\nexport interface ReplayPlayerProps {\n reportId: string;\n className?: string;\n}\n\nconst SPEEDS = [1, 2, 4] as const;\ntype Speed = (typeof SPEEDS)[number];\n\n/** Fallback viewport aspect when the recording carries no meta event. */\nconst FALLBACK_W = 16;\nconst FALLBACK_H = 10;\n\n/** `m:ss` from a millisecond offset (tabular-friendly). */\nfunction formatTime(ms: number): string {\n const total = Math.max(0, Math.floor(ms / 1000));\n const m = Math.floor(total / 60);\n const s = total % 60;\n return `${m}:${s.toString().padStart(2, '0')}`;\n}\n\n/** Reads the recording viewport from the rrweb meta event (EventType.Meta === 4). */\nfunction readViewport(events: unknown[]): { width: number; height: number } | null {\n for (const e of events) {\n if (e && typeof e === 'object' && (e as { type?: unknown }).type === 4) {\n const data = (e as { data?: { width?: unknown; height?: unknown } }).data;\n if (data && typeof data.width === 'number' && typeof data.height === 'number' && data.width > 0 && data.height > 0) {\n return { width: data.width, height: data.height };\n }\n }\n }\n return null;\n}\n\n/**\n * First-party rrweb session-replay player.\n *\n * Built directly on rrweb's proven `Replayer` (the `rrweb-player` Svelte wrapper\n * shipped a broken dist that never constructs a Replayer). The replayer's iframe\n * is scaled with a CSS transform to fit a responsive, viewport-aspect container;\n * a monochrome first-party controls bar drives play/pause, scrubbing, speed, and\n * skip-inactive.\n *\n * rrweb is loaded via a dynamic `import()` inside an effect so it never runs\n * during SSR. rrweb's base stylesheet is NOT imported here — the required rules\n * are inlined into `styles.css` under \"rrweb replayer base\".\n */\nexport function ReplayPlayer(props: ReplayPlayerProps): React.JSX.Element {\n const { reportId, className } = props;\n const api = useLensApi();\n\n const frameRef = useRef<HTMLDivElement | null>(null);\n const replayerRef = useRef<ReplayerInstance | null>(null);\n const rafRef = useRef<number | null>(null);\n const totalRef = useRef(0);\n const finishedRef = useRef(false);\n const playingRef = useRef(false);\n\n const [status, setStatus] = useState<'loading' | 'ready' | 'empty' | 'error'>('loading');\n const [message, setMessage] = useState<string | undefined>(undefined);\n const [playing, setPlaying] = useState(false);\n const [speed, setSpeed] = useState<Speed>(1);\n const [skipInactive, setSkipInactive] = useState(true);\n const [elapsed, setElapsed] = useState(0);\n const [total, setTotal] = useState(0);\n\n const stopRaf = useCallback(() => {\n if (rafRef.current != null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n }, []);\n\n /**\n * rrweb's getCurrentTime() is `timer.timeOffset + (baseline - firstEvent)`,\n * which is a huge NEGATIVE epoch-scale number until play() has run once.\n * Never trust it raw — clamp into [0, totalTime].\n */\n const safeCurrentTime = useCallback((): number => {\n const r = replayerRef.current;\n if (!r) return 0;\n const t = r.getCurrentTime();\n if (!Number.isFinite(t) || t < 0) return 0;\n return totalRef.current > 0 ? Math.min(t, totalRef.current) : t;\n }, []);\n\n const tick = useCallback(() => {\n if (!replayerRef.current) return;\n setElapsed(safeCurrentTime());\n rafRef.current = requestAnimationFrame(tick);\n }, [safeCurrentTime]);\n\n const startRaf = useCallback(() => {\n stopRaf();\n rafRef.current = requestAnimationFrame(tick);\n }, [stopRaf, tick]);\n\n const togglePlay = useCallback(() => {\n const r = replayerRef.current;\n if (!r) return;\n if (playingRef.current) {\n r.pause();\n playingRef.current = false;\n setPlaying(false);\n stopRaf();\n } else {\n const from = finishedRef.current ? 0 : safeCurrentTime();\n finishedRef.current = false;\n r.play(from);\n playingRef.current = true;\n setPlaying(true);\n startRaf();\n }\n }, [safeCurrentTime, startRaf, stopRaf]);\n\n const seekTo = useCallback((offsetMs: number) => {\n const r = replayerRef.current;\n if (!r) return;\n const clamped = totalRef.current > 0 ? Math.max(0, Math.min(offsetMs, totalRef.current)) : Math.max(0, offsetMs);\n finishedRef.current = false;\n if (playingRef.current) {\n r.play(clamped);\n } else {\n r.pause(clamped);\n }\n setElapsed(clamped);\n }, []);\n\n const changeSpeed = useCallback((next: Speed) => {\n setSpeed(next);\n replayerRef.current?.setConfig({ speed: next });\n }, []);\n\n const toggleSkipInactive = useCallback(() => {\n setSkipInactive((prev) => {\n const next = !prev;\n replayerRef.current?.setConfig({ skipInactive: next });\n return next;\n });\n }, []);\n\n // ---- Progress-track scrubbing (click + drag) ----\n const trackRef = useRef<HTMLDivElement | null>(null);\n const offsetFromPointer = useCallback((clientX: number): number => {\n const track = trackRef.current;\n if (!track || totalRef.current <= 0) return 0;\n const rect = track.getBoundingClientRect();\n const frac = rect.width > 0 ? (clientX - rect.left) / rect.width : 0;\n return Math.max(0, Math.min(1, frac)) * totalRef.current;\n }, []);\n\n const onTrackPointerDown = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (!replayerRef.current || totalRef.current <= 0) return;\n e.currentTarget.setPointerCapture(e.pointerId);\n seekTo(offsetFromPointer(e.clientX));\n },\n [offsetFromPointer, seekTo],\n );\n\n const onTrackPointerMove = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (!e.currentTarget.hasPointerCapture(e.pointerId)) return;\n seekTo(offsetFromPointer(e.clientX));\n },\n [offsetFromPointer, seekTo],\n );\n\n const onTrackKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n const step = totalRef.current * 0.05;\n if (e.key === 'ArrowLeft') {\n e.preventDefault();\n seekTo(safeCurrentTime() - step);\n } else if (e.key === 'ArrowRight') {\n e.preventDefault();\n seekTo(safeCurrentTime() + step);\n }\n },\n [seekTo],\n );\n\n // ---- Build the replayer (strict-mode-safe) ----\n useEffect(() => {\n let cancelled = false;\n let observer: ResizeObserver | null = null;\n\n setStatus('loading');\n setMessage(undefined);\n setPlaying(false);\n playingRef.current = false;\n finishedRef.current = false;\n setElapsed(0);\n setTotal(0);\n totalRef.current = 0;\n\n async function mount() {\n try {\n const events = await api.getAssetJson<unknown[]>(reportId, 'replay');\n if (cancelled) return;\n if (!Array.isArray(events) || events.length === 0) {\n setStatus('empty');\n return;\n }\n\n // Dynamic import keeps rrweb out of the SSR/module-eval path.\n const mod = await import('rrweb');\n if (cancelled) return;\n\n const frame = frameRef.current;\n if (!frame) return;\n frame.innerHTML = '';\n\n const viewport = readViewport(events) ?? { width: FALLBACK_W, height: FALLBACK_H };\n frame.style.aspectRatio = `${viewport.width} / ${viewport.height}`;\n\n const replayer = new mod.Replayer(events as ConstructorParameters<typeof mod.Replayer>[0], {\n root: frame,\n mouseTail: false,\n skipInactive: true,\n speed: 1,\n });\n if (cancelled) {\n replayer.destroy();\n return;\n }\n replayerRef.current = replayer;\n\n const meta = replayer.getMetaData();\n totalRef.current = meta.totalTime;\n setTotal(meta.totalTime);\n\n // Scale rrweb's wrapper/iframe to fit the container width. rrweb sizes the\n // iframe to the recorded viewport; we scale from the top-left so the frame's\n // aspect-ratio box contains it exactly.\n const baseWidth = replayer.iframe.offsetWidth || viewport.width;\n const applyScale = () => {\n const el = frameRef.current;\n if (!el || baseWidth <= 0) return;\n const scale = el.clientWidth / baseWidth;\n const wrapper = replayer.wrapper;\n wrapper.style.transformOrigin = 'top left';\n wrapper.style.transform = `scale(${scale})`;\n };\n applyScale();\n observer = new ResizeObserver(applyScale);\n observer.observe(frame);\n\n replayer.on(mod.ReplayerEvents.Finish, () => {\n finishedRef.current = true;\n playingRef.current = false;\n setPlaying(false);\n stopRaf();\n setElapsed(totalRef.current);\n });\n\n setStatus('ready');\n } catch (err) {\n if (cancelled) return;\n setStatus('error');\n setMessage(err instanceof Error ? err.message : String(err));\n }\n }\n\n void mount();\n\n return () => {\n cancelled = true;\n stopRaf();\n observer?.disconnect();\n try {\n replayerRef.current?.destroy();\n } catch {\n // already torn down\n }\n replayerRef.current = null;\n };\n }, [api, reportId, stopRaf]);\n\n const pct = total > 0 ? Math.min(100, (elapsed / total) * 100) : 0;\n\n return (\n <div className={clsx('lens-db', 'lens-db__replay', className)}>\n {status === 'loading' && <div className=\"lens-db__replay-state\">Loading replay…</div>}\n {status === 'empty' && <div className=\"lens-db__replay-state lens-db__muted\">No replay captured.</div>}\n {status === 'error' && (\n <div className=\"lens-db__replay-state lens-db__error\">\n No replay captured{message ? ` — ${message}` : ''}.\n </div>\n )}\n\n <div className=\"lens-db__rp\" data-visible={status === 'ready'}>\n <div ref={frameRef} className=\"lens-db__rp-frame\" />\n\n <div className=\"lens-db__rp-bar\">\n <button\n type=\"button\"\n className=\"lens-db__rp-play\"\n onClick={togglePlay}\n aria-label={playing ? 'Pause replay' : 'Play replay'}\n aria-pressed={playing}\n >\n {playing ? <IconPause size={16} /> : <IconPlay size={16} />}\n </button>\n\n <span className=\"lens-db__rp-time\">{formatTime(elapsed)}</span>\n\n <div\n ref={trackRef}\n className=\"lens-db__rp-track\"\n role=\"slider\"\n tabIndex={0}\n aria-label=\"Seek\"\n aria-valuemin={0}\n aria-valuemax={Math.round(total)}\n aria-valuenow={Math.round(elapsed)}\n aria-valuetext={`${formatTime(elapsed)} of ${formatTime(total)}`}\n onPointerDown={onTrackPointerDown}\n onPointerMove={onTrackPointerMove}\n onKeyDown={onTrackKeyDown}\n >\n <div className=\"lens-db__rp-fill\" style={{ width: `${pct}%` }} />\n </div>\n\n <span className=\"lens-db__rp-time\">{formatTime(total)}</span>\n\n <div className=\"lens-db__rp-speeds\" role=\"group\" aria-label=\"Playback speed\">\n {SPEEDS.map((s) => (\n <button\n key={s}\n type=\"button\"\n className={clsx('lens-db__rp-speed', speed === s && 'lens-db__rp-speed--on')}\n onClick={() => changeSpeed(s)}\n aria-pressed={speed === s}\n >\n {s}×\n </button>\n ))}\n </div>\n\n <button\n type=\"button\"\n className={clsx('lens-db__rp-skip', skipInactive && 'lens-db__rp-skip--on')}\n onClick={toggleSkipInactive}\n aria-pressed={skipInactive}\n >\n Skip idle\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\nimport clsx from 'clsx';\nimport { useLensApi } from '../context.js';\nimport { useAsync } from '../useAsync.js';\nimport { IntegrationList, type IntegrationListFlash } from './IntegrationList.js';\nimport type { Integration, IntegrationConfig, IntegrationProvider } from '../api.js';\n\nconst PROVIDER_NAME: Record<IntegrationProvider, string> = {\n linear: 'Linear',\n jira: 'Jira',\n github: 'GitHub',\n};\n\n/** The dashboard's own URL, for the OAuth callback to redirect back to. */\nfunction currentReturnUrl(): string | undefined {\n return typeof window !== 'undefined' ? window.location.href : undefined;\n}\n\nfunction providerLabel(raw: string): string {\n return (PROVIDER_NAME as Record<string, string>)[raw] ?? raw;\n}\n\n/**\n * Reads (and strips) the `lens_connected` / `lens_error` params the OAuth\n * callback appends when it lands back on the dashboard. Returns a one-shot\n * outcome so the caller can flash a note and refetch.\n */\nfunction consumeOAuthCallback(): { connected?: string; error?: string } | null {\n if (typeof window === 'undefined') return null;\n const params = new URLSearchParams(window.location.search);\n const connected = params.get('lens_connected');\n const error = params.get('lens_error');\n if (connected == null && error == null) return null;\n params.delete('lens_connected');\n params.delete('lens_error');\n try {\n const qs = params.toString();\n const url = window.location.pathname + (qs ? `?${qs}` : '') + window.location.hash;\n window.history.replaceState(window.history.state, '', url);\n } catch {\n // history unavailable (e.g. sandboxed) — the note still shows.\n }\n return { connected: connected ?? undefined, error: error ?? undefined };\n}\n\nexport interface IntegrationSettingsProps {\n className?: string;\n}\n\n/**\n * Lists all three issue-tracker integrations and manages their lifecycle against\n * the single-destination contract: exactly one connected provider can be the\n * active destination issues route to. Every mutation refetches the authoritative\n * list so single-active semantics are enforced by the server, not the UI. The\n * row/radio presentation lives in the shared {@link IntegrationList}.\n */\nexport function IntegrationSettings(props: IntegrationSettingsProps): React.JSX.Element {\n const api = useLensApi();\n const { data, error, loading, reload } = useAsync(() => api.listIntegrations(), []);\n const [busy, setBusy] = useState<IntegrationProvider | null>(null);\n const [list, setList] = useState<Integration[] | null>(null);\n const [flash, setFlash] = useState<IntegrationListFlash | null>(null);\n\n // On mount, surface the OAuth callback outcome the API redirected back with.\n useEffect(() => {\n const outcome = consumeOAuthCallback();\n if (!outcome) return;\n if (outcome.connected) {\n setFlash({ kind: 'ok', message: `${providerLabel(outcome.connected)} connected` });\n reload();\n }\n if (outcome.error) {\n setFlash({ kind: 'error', message: outcome.error });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const integrations = list ?? data ?? [];\n\n async function run(\n provider: IntegrationProvider,\n fn: () => Promise<Integration[] | void>,\n ): Promise<void> {\n setBusy(provider);\n try {\n const next = await fn();\n if (Array.isArray(next)) setList(next);\n else setList(await api.listIntegrations());\n } catch (err) {\n setFlash({ kind: 'error', message: err instanceof Error ? err.message : String(err) });\n } finally {\n setBusy(null);\n }\n }\n\n function connect(provider: IntegrationProvider): Promise<void> {\n return run(provider, async () => {\n const { authorizeUrl } = await api.connectIntegration(provider, {\n returnUrl: currentReturnUrl(),\n });\n window.open(authorizeUrl, '_blank', 'noopener,noreferrer');\n return api.listIntegrations();\n });\n }\n\n const completeDev = (provider: IntegrationProvider): Promise<void> =>\n run(provider, async () => {\n await api.completeIntegrationDev(provider);\n return api.listIntegrations();\n });\n\n const activate = (provider: IntegrationProvider): Promise<void> =>\n run(provider, () => api.activateIntegration(provider));\n\n const disconnect = (provider: IntegrationProvider): Promise<void> =>\n run(provider, () => api.disconnectIntegration(provider));\n\n // Kept off `run()` so the row can await success/failure: on error we flash\n // and rethrow so the config line drops its busy/check state.\n async function saveConfig(provider: IntegrationProvider, config: IntegrationConfig): Promise<void> {\n setBusy(provider);\n try {\n setList(await api.updateIntegrationConfig(provider, config));\n } catch (err) {\n setFlash({ kind: 'error', message: err instanceof Error ? err.message : String(err) });\n throw err;\n } finally {\n setBusy(null);\n }\n }\n\n return (\n <div className={clsx('lens-db', props.className)}>\n <IntegrationList\n integrations={integrations}\n busy={busy}\n title=\"Issue destination\"\n description=\"Reports create issues in exactly one connected tracker.\"\n flash={flash}\n onFlashDismiss={() => setFlash(null)}\n loading={loading && !list}\n loadError={error && !list ? error.message : null}\n onRetry={reload}\n onConnect={(p) => void connect(p)}\n onActivate={(p) => void activate(p)}\n onDisconnect={(p) => void disconnect(p)}\n onCompleteDev={(p) => void completeDev(p)}\n onSaveConfig={saveConfig}\n />\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\nimport clsx from 'clsx';\nimport {\n IconGitHub,\n IconLinear,\n IconJira,\n IconCheck,\n IconCheckCircle,\n IconAlertTriangle,\n} from '../icons.js';\nimport type { Integration, IntegrationConfig, IntegrationProvider } from '../api.js';\n\ntype BrandIcon = (props: { size?: number }) => React.JSX.Element;\n\nconst PROVIDER_META: Record<IntegrationProvider, { name: string; Icon: BrandIcon }> = {\n linear: { name: 'Linear', Icon: IconLinear },\n jira: { name: 'Jira', Icon: IconJira },\n github: { name: 'GitHub', Icon: IconGitHub },\n};\n\nconst PROVIDER_ORDER: IntegrationProvider[] = ['linear', 'jira', 'github'];\n\n/** Which `IntegrationConfig` field each provider's config line edits. */\ninterface ConfigField {\n key: 'repo' | 'projectKey' | 'teamKey';\n label: string;\n placeholder: string;\n /** Amber nudge shown when this field is empty AND the row is the active destination. */\n requiredHint?: string;\n}\n\nconst CONFIG_FIELD: Record<IntegrationProvider, ConfigField> = {\n github: {\n key: 'repo',\n label: 'Repository',\n placeholder: 'owner/repo',\n requiredHint: 'Set a repository to enable issue creation',\n },\n jira: {\n key: 'projectKey',\n label: 'Project key',\n placeholder: 'BUG',\n requiredHint: 'Set a project key to enable issue creation',\n },\n linear: {\n key: 'teamKey',\n label: 'Team',\n placeholder: 'First team (default)',\n },\n};\n\nexport interface IntegrationListFlash {\n kind: 'ok' | 'error';\n message: string;\n}\n\nexport interface IntegrationListProps {\n /** Authoritative list from the server; rows render in a fixed provider order. */\n integrations: Integration[];\n /** Provider whose action is in flight (disables that row's controls). */\n busy: IntegrationProvider | null;\n /** Optional in-card header (title + muted description). Omit to render just the rows. */\n title?: string;\n description?: string;\n /** One-shot inline banner (OAuth outcome / action error); auto-dismisses after 4s. */\n flash?: IntegrationListFlash | null;\n onFlashDismiss?: () => void;\n /** Initial-load affordances. */\n loading?: boolean;\n loadError?: string | null;\n onRetry?: () => void;\n onConnect: (provider: IntegrationProvider) => void;\n /** Makes a connected provider the single active destination. */\n onActivate: (provider: IntegrationProvider) => void;\n onDisconnect: (provider: IntegrationProvider) => void;\n /** Dev stub: completes the OAuth dance for a pending provider. */\n onCompleteDev: (provider: IntegrationProvider) => void;\n /**\n * Persists a connected provider's issue-routing config. Resolve on success\n * (the row shows a brief check) and reject on failure (parents surface the\n * error through the flash banner, and the row clears its busy/check state).\n */\n onSaveConfig: (provider: IntegrationProvider, config: IntegrationConfig) => Promise<void>;\n className?: string;\n}\n\n/**\n * Linear/Vercel-settings-style integration list: one bordered card whose rows\n * (one per provider, divided by hairlines) carry the real brand mark, a status\n * line, a radio-style destination selector, and right-aligned lifecycle actions.\n * Shared by the standalone IntegrationSettings surface and the onboarding\n * wizard's Destination step so both stay pixel-identical.\n */\nexport function IntegrationList(props: IntegrationListProps): React.JSX.Element {\n const {\n integrations,\n busy,\n title,\n description,\n flash,\n onFlashDismiss,\n loading,\n loadError,\n onRetry,\n onConnect,\n onActivate,\n onDisconnect,\n onCompleteDev,\n onSaveConfig,\n className,\n } = props;\n\n // Auto-dismiss the inline banner after 4s so it never lingers.\n useEffect(() => {\n if (!flash || !onFlashDismiss) return;\n const t = setTimeout(onFlashDismiss, 4000);\n return () => clearTimeout(t);\n }, [flash, onFlashDismiss]);\n\n const byProvider = new Map<IntegrationProvider, Integration>();\n for (const it of integrations) byProvider.set(it.provider, it);\n\n const hasHeader = Boolean(title || description);\n\n return (\n <div className={clsx('lens-db__intlist', className)}>\n {hasHeader && (\n <div className=\"lens-db__intlist-head\">\n {title && <div className=\"lens-db__intlist-title\">{title}</div>}\n {description && <div className=\"lens-db__intlist-desc lens-db__muted\">{description}</div>}\n </div>\n )}\n\n {flash && (\n <div\n className={clsx(\n 'lens-db__intlist-banner',\n flash.kind === 'ok'\n ? 'lens-db__intlist-banner--ok'\n : 'lens-db__intlist-banner--error',\n )}\n role=\"status\"\n >\n {flash.kind === 'ok' ? <IconCheckCircle size={16} /> : <IconAlertTriangle size={16} />}\n <span>{flash.message}</span>\n </div>\n )}\n\n {loading ? (\n <div className=\"lens-db__intlist-rows\" aria-busy=\"true\">\n {PROVIDER_ORDER.map((p) => (\n <div key={p} className=\"lens-db__introw lens-db__introw--skeleton\">\n <span className=\"lens-db__skeleton lens-db__intmark-skeleton\" />\n <span className=\"lens-db__intbody\">\n <span className=\"lens-db__skeleton\" style={{ width: '35%' }} />\n <span\n className=\"lens-db__skeleton\"\n style={{ width: '55%', marginTop: '7px', height: '10px' }}\n />\n </span>\n </div>\n ))}\n </div>\n ) : loadError ? (\n <div className=\"lens-db__intlist-load-error\">\n Failed to load integrations: {loadError}\n {onRetry && (\n <>\n {' '}\n <button type=\"button\" className=\"lens-db__link-btn\" onClick={onRetry}>\n Retry\n </button>\n </>\n )}\n </div>\n ) : (\n <div\n className=\"lens-db__intlist-rows\"\n role=\"radiogroup\"\n aria-label=\"Issue destination\"\n >\n {PROVIDER_ORDER.map((provider) => {\n const meta = PROVIDER_META[provider];\n const Icon = meta.Icon;\n const integration = byProvider.get(provider);\n const status = integration?.status ?? 'disconnected';\n const active = integration?.active ?? false;\n const account = integration?.account ?? null;\n const isBusy = busy === provider;\n const isConnected = status === 'connected';\n\n const statusLine =\n status === 'connected'\n ? account\n ? `Connected as ${account}`\n : 'Connected'\n : status === 'pending'\n ? 'Waiting for authorization…'\n : 'Not connected';\n\n return (\n <div\n key={provider}\n className={clsx('lens-db__introw', active && 'lens-db__introw--active')}\n >\n <span className=\"lens-db__intmark\" aria-hidden>\n <Icon size={20} />\n </span>\n\n <span className=\"lens-db__intbody\">\n <span className=\"lens-db__intname\">{meta.name}</span>\n <span className=\"lens-db__intstatus\">\n <span\n className={clsx(\n 'lens-db__intdot',\n status === 'connected'\n ? 'lens-db__intdot--on'\n : status === 'pending'\n ? 'lens-db__intdot--pending'\n : 'lens-db__intdot--off',\n )}\n aria-hidden\n />\n <span>{statusLine}</span>\n </span>\n </span>\n\n <span className=\"lens-db__introw-right\">\n {isConnected && (\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={active}\n aria-label={\n active\n ? `${meta.name} is the issue destination`\n : `Make ${meta.name} the issue destination`\n }\n className={clsx(\n 'lens-db__intradio',\n active && 'lens-db__intradio--active',\n )}\n disabled={isBusy || active}\n onClick={() => !active && onActivate(provider)}\n >\n <span className=\"lens-db__intradio-dot\">\n {active && <span className=\"lens-db__intradio-fill\" />}\n </span>\n Destination\n </button>\n )}\n\n {status === 'pending' && (\n <>\n <span className=\"lens-db__intwait\">waiting for authorization…</span>\n <button\n type=\"button\"\n className=\"lens-db__btn lens-db__btn--sm\"\n disabled={isBusy}\n onClick={() => onCompleteDev(provider)}\n >\n {isBusy ? 'Completing…' : 'Complete connection (dev)'}\n </button>\n </>\n )}\n\n {status === 'disconnected' && (\n <button\n type=\"button\"\n className=\"lens-db__btn lens-db__btn--sm\"\n disabled={isBusy}\n onClick={() => onConnect(provider)}\n >\n {isBusy ? 'Opening…' : 'Connect'}\n </button>\n )}\n\n {status !== 'disconnected' && (\n <button\n type=\"button\"\n className=\"lens-db__btn lens-db__btn--sm lens-db__btn--danger-ghost\"\n aria-label={`Disconnect ${meta.name}`}\n disabled={isBusy}\n onClick={() => onDisconnect(provider)}\n >\n Disconnect\n </button>\n )}\n </span>\n\n {isConnected && (\n <IntegrationConfigLine\n provider={provider}\n config={integration?.config ?? {}}\n active={active}\n disabled={isBusy}\n onSave={(config) => onSaveConfig(provider, config)}\n />\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Subdued second line under a connected row: a compact editor for the\n * provider's issue-routing target. The Save button only appears while the\n * value differs from the saved config; committing shows a brief busy spinner\n * then a 2s check. Enter also saves.\n */\nfunction IntegrationConfigLine({\n provider,\n config,\n active,\n disabled,\n onSave,\n}: {\n provider: IntegrationProvider;\n config: IntegrationConfig;\n active: boolean;\n disabled: boolean;\n onSave: (config: IntegrationConfig) => Promise<void>;\n}): React.JSX.Element {\n const field = CONFIG_FIELD[provider];\n const saved = config[field.key] ?? '';\n const [value, setValue] = useState(saved);\n const [busy, setBusy] = useState(false);\n const [done, setDone] = useState(false);\n\n // Re-sync the input when the server value changes (save committed elsewhere,\n // reconnect resets the config, etc.) without clobbering in-progress edits.\n useEffect(() => {\n setValue(saved);\n }, [saved]);\n\n const dirty = value.trim() !== saved;\n\n async function save(): Promise<void> {\n if (busy || !dirty) return;\n setBusy(true);\n setDone(false);\n const next: IntegrationConfig = { ...config };\n next[field.key] = value.trim() || undefined;\n try {\n await onSave(next);\n setDone(true);\n setTimeout(() => setDone(false), 2000);\n } catch {\n // The parent surfaces the failure through the shared flash banner.\n } finally {\n setBusy(false);\n }\n }\n\n const showHint = Boolean(field.requiredHint) && active && !saved;\n\n return (\n <div className=\"lens-db__intconfig\">\n <label className=\"lens-db__intconfig-field\">\n <span className=\"lens-db__intconfig-label\">{field.label}</span>\n <input\n className=\"lens-db__intconfig-input\"\n type=\"text\"\n value={value}\n placeholder={field.placeholder}\n disabled={disabled || busy}\n spellCheck={false}\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n void save();\n }\n }}\n />\n </label>\n\n {busy ? (\n <span className=\"lens-db__intconfig-busy\" aria-live=\"polite\" aria-label=\"Saving\">\n <span className=\"lens-db__spinner\" aria-hidden />\n </span>\n ) : done ? (\n <span className=\"lens-db__intconfig-done\" aria-live=\"polite\" aria-label=\"Saved\">\n <IconCheck size={14} />\n </span>\n ) : dirty ? (\n <button\n type=\"button\"\n className=\"lens-db__btn lens-db__btn--sm\"\n disabled={disabled}\n onClick={() => void save()}\n >\n Save\n </button>\n ) : null}\n\n {showHint && <span className=\"lens-db__intconfig-hint\">{field.requiredHint}</span>}\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\nimport clsx from 'clsx';\nimport type {\n CreateProjectResponse,\n Integration,\n IntegrationConfig,\n IntegrationProvider,\n Project,\n} from '@horus-lens/shared';\nimport { LensApiError, type StorageStatus } from '../api.js';\nimport { highlightCode } from '../highlight.js';\nimport { useLensApi } from '../context.js';\nimport { IconAlertTriangle, IconCheck, IconCheckCircle, IconCopy } from '../icons.js';\nimport { IntegrationList, type IntegrationListFlash } from './IntegrationList.js';\n\nconst STEPS = ['Project', 'Destination', 'Asset storage', 'Install'] as const;\n\nconst PROVIDER_NAME: Record<IntegrationProvider, string> = {\n linear: 'Linear',\n jira: 'Jira',\n github: 'GitHub',\n};\n\nconst S3_ENV_SNIPPET = `# Lens API asset storage (S3 or compatible)\nLENS_S3_BUCKET=your-bucket\nLENS_S3_REGION=us-east-1\nAWS_ACCESS_KEY_ID=AKIA...\nAWS_SECRET_ACCESS_KEY=...\n# Optional (R2 / MinIO):\n# LENS_S3_ENDPOINT=https://<account>.r2.cloudflarestorage.com\n# LENS_S3_FORCE_PATH_STYLE=true`;\n\nexport interface OnboardingWizardProps {\n /** Fired when the host clicks Finish on the final step. */\n onComplete?: (result: {\n project: Project;\n accessId: string;\n /** Only present when the wizard created the project this session — shown once, never re-fetchable. */\n accessSecret: string | null;\n }) => void;\n /**\n * Fired immediately after project creation (step 1), before the wizard\n * continues. Lets proxy-based hosts start forwarding the new project's\n * secret for the remaining wizard calls.\n */\n onProjectCreated?: (result: CreateProjectResponse) => void;\n className?: string;\n /**\n * Skip project creation and load the existing project instead. The\n * `accessSecret` cannot be shown again in this mode.\n */\n existingProject?: boolean;\n}\n\nfunction parseOrigins(raw: string): string[] {\n return raw\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n}\n\n/** The dashboard's own URL, for the OAuth callback to redirect back to. */\nfunction currentReturnUrl(): string | undefined {\n return typeof window !== 'undefined' ? window.location.href : undefined;\n}\n\nfunction providerLabel(raw: string): string {\n return (PROVIDER_NAME as Record<string, string>)[raw] ?? raw;\n}\n\n/** Shallow ordered array equality for origin lists. */\nfunction sameOrigins(a: string[], b: string[]): boolean {\n return a.length === b.length && a.every((v, i) => v === b[i]);\n}\n\n/**\n * Reads (and strips) the `lens_connected` / `lens_error` params the OAuth\n * callback appends when it lands back on the dashboard. Returns a one-shot\n * outcome so the caller can flash a note and refetch.\n */\nfunction consumeOAuthCallback(): { connected?: string; error?: string } | null {\n if (typeof window === 'undefined') return null;\n const params = new URLSearchParams(window.location.search);\n const connected = params.get('lens_connected');\n const error = params.get('lens_error');\n if (connected == null && error == null) return null;\n params.delete('lens_connected');\n params.delete('lens_error');\n try {\n const qs = params.toString();\n const url = window.location.pathname + (qs ? `?${qs}` : '') + window.location.hash;\n window.history.replaceState(window.history.state, '', url);\n } catch {\n // history unavailable (e.g. sandboxed) — the note still shows.\n }\n return { connected: connected ?? undefined, error: error ?? undefined };\n}\n\n/** Small clipboard button that swaps to a check for 2s after a successful copy. */\nfunction CopyButton({\n value,\n label = 'Copy',\n ghost = false,\n}: {\n value: string;\n label?: string;\n ghost?: boolean;\n}): React.JSX.Element {\n const [copied, setCopied] = useState(false);\n return (\n <button\n type=\"button\"\n className={clsx(\n 'lens-db__copy-btn',\n ghost && 'lens-db__copy-btn--ghost',\n copied && 'lens-db__copy-btn--done',\n )}\n aria-label={copied ? 'Copied' : label}\n onClick={() => {\n void navigator.clipboard?.writeText(value).then(\n () => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n },\n () => undefined,\n );\n }}\n >\n {copied ? <IconCheck size={14} /> : <IconCopy size={14} />}\n {copied ? 'Copied' : label}\n </button>\n );\n}\n\n/**\n * Guided, multi-step setup card for provisioning a Lens project: create the\n * project, pick the single issue destination, configure asset storage, then\n * surface the install snippets. Designed for internal admin dashboards — the\n * `accessSecret` lives only in memory and is displayed exactly once.\n */\nexport function OnboardingWizard(props: OnboardingWizardProps): React.JSX.Element {\n const api = useLensApi();\n const [step, setStep] = useState(0);\n\n // ----- Collected state (never lost between steps) -----\n const [name, setName] = useState('');\n const [origins, setOrigins] = useState('');\n const [dashboardUrl, setDashboardUrl] = useState('');\n const [project, setProject] = useState<Project | null>(null);\n const [accessId, setAccessId] = useState<string | null>(null);\n const [accessSecret, setAccessSecret] = useState<string | null>(null);\n\n // ----- Step 1 -----\n const [step1Busy, setStep1Busy] = useState(false);\n const [step1Error, setStep1Error] = useState<string | undefined>(undefined);\n const [loadingExisting, setLoadingExisting] = useState(Boolean(props.existingProject));\n\n // ----- Step 2 -----\n const [integrations, setIntegrations] = useState<Integration[] | null>(null);\n const [intBusy, setIntBusy] = useState<IntegrationProvider | null>(null);\n const [intLoadError, setIntLoadError] = useState<string | undefined>(undefined);\n const [intFlash, setIntFlash] = useState<IntegrationListFlash | null>(null);\n\n // ----- Step 3: storage is status-only. Credentials are configured via env\n // on the Lens API deployment, never through the UI. -----\n const [storage, setStorage] = useState<StorageStatus | null>(null);\n const [storageError, setStorageError] = useState<string | undefined>(undefined);\n\n // ----- Step 4 -----\n const [finishBusy, setFinishBusy] = useState(false);\n const [finishError, setFinishError] = useState<string | undefined>(undefined);\n\n // Load the existing project once, if requested.\n useEffect(() => {\n if (!props.existingProject) return;\n let active = true;\n setLoadingExisting(true);\n api\n .getProject()\n .then((p) => {\n if (!active) return;\n setProject(p);\n setAccessId(p.accessId);\n setName(p.name);\n setOrigins(p.allowedOrigins.join('\\n'));\n setDashboardUrl(p.dashboardUrl ?? '');\n setLoadingExisting(false);\n })\n .catch((err: unknown) => {\n if (!active) return;\n setStep1Error(err instanceof Error ? err.message : String(err));\n setLoadingExisting(false);\n });\n return () => {\n active = false;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // When the Destination step is shown, surface the OAuth callback outcome the\n // API redirected back with (once), then refresh the list.\n useEffect(() => {\n if (step !== 1) return;\n const outcome = consumeOAuthCallback();\n if (!outcome) return;\n if (outcome.connected) {\n setIntFlash({ kind: 'ok', message: `${providerLabel(outcome.connected)} connected` });\n api\n .listIntegrations()\n .then(setIntegrations)\n .catch(() => undefined);\n }\n if (outcome.error) setIntFlash({ kind: 'error', message: outcome.error });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [step]);\n\n // Load integrations the first time the Destination step is shown.\n useEffect(() => {\n if (step !== 1 || integrations !== null) return;\n let active = true;\n api\n .listIntegrations()\n .then((list) => active && setIntegrations(list))\n .catch((err: unknown) =>\n active ? setIntLoadError(err instanceof Error ? err.message : String(err)) : undefined,\n );\n return () => {\n active = false;\n };\n }, [step, integrations, api]);\n\n async function submitStep1(): Promise<void> {\n if (props.existingProject) {\n if (!project) return;\n if (!name.trim()) {\n setStep1Error('Project name is required.');\n return;\n }\n const nextOrigins = parseOrigins(origins);\n const nextDashboardUrl = dashboardUrl.trim() || null;\n const changed =\n name.trim() !== project.name ||\n !sameOrigins(nextOrigins, project.allowedOrigins) ||\n nextDashboardUrl !== (project.dashboardUrl ?? null);\n if (!changed) {\n setStep(1);\n return;\n }\n setStep1Busy(true);\n setStep1Error(undefined);\n try {\n const p = await api.updateProject({\n name: name.trim(),\n allowedOrigins: nextOrigins,\n dashboardUrl: nextDashboardUrl,\n });\n setProject(p);\n setName(p.name);\n setOrigins(p.allowedOrigins.join('\\n'));\n setDashboardUrl(p.dashboardUrl ?? '');\n setStep(1);\n } catch (err) {\n setStep1Error(err instanceof Error ? err.message : String(err));\n } finally {\n setStep1Busy(false);\n }\n return;\n }\n if (!name.trim()) {\n setStep1Error('Project name is required.');\n return;\n }\n setStep1Busy(true);\n setStep1Error(undefined);\n try {\n const res = await api.createProject({\n name: name.trim(),\n allowedOrigins: parseOrigins(origins),\n });\n setAccessId(res.accessId);\n setAccessSecret(res.accessSecret);\n props.onProjectCreated?.(res);\n // CreateProjectRequest has no dashboardUrl, so persist it in a follow-up\n // PATCH once the new project's secret is active (the x-lens-token /\n // onProjectCreated path authenticates it). Non-fatal on failure — the\n // project is already created.\n let created = res.project;\n const nextDashboardUrl = dashboardUrl.trim();\n if (nextDashboardUrl) {\n try {\n created = await api.updateProject({ dashboardUrl: nextDashboardUrl });\n setDashboardUrl(created.dashboardUrl ?? '');\n } catch {\n // Leave dashboardUrl unset on the project; the user can set it later\n // from Project settings.\n }\n }\n setProject(created);\n setStep(1);\n } catch (err) {\n setStep1Error(err instanceof Error ? err.message : String(err));\n } finally {\n setStep1Busy(false);\n }\n }\n\n async function runIntegration(\n provider: IntegrationProvider,\n fn: () => Promise<void>,\n ): Promise<void> {\n setIntBusy(provider);\n try {\n await fn();\n setIntegrations(await api.listIntegrations());\n } catch (err) {\n setIntFlash({ kind: 'error', message: err instanceof Error ? err.message : String(err) });\n } finally {\n setIntBusy(null);\n }\n }\n\n const connect = (provider: IntegrationProvider): Promise<void> =>\n runIntegration(provider, async () => {\n const { authorizeUrl } = await api.connectIntegration(provider, {\n returnUrl: currentReturnUrl(),\n });\n window.open(authorizeUrl, '_blank', 'noopener,noreferrer');\n });\n\n const completeDev = (provider: IntegrationProvider): Promise<void> =>\n runIntegration(provider, async () => {\n await api.completeIntegrationDev(provider);\n });\n\n const activate = (provider: IntegrationProvider): Promise<void> =>\n runIntegration(provider, async () => {\n await api.activateIntegration(provider);\n });\n\n const disconnect = (provider: IntegrationProvider): Promise<void> =>\n runIntegration(provider, async () => {\n await api.disconnectIntegration(provider);\n });\n\n // Kept off `runIntegration()` so the row can await the outcome: on error we\n // flash and rethrow so the config line drops its busy/check state.\n async function saveConfig(provider: IntegrationProvider, config: IntegrationConfig): Promise<void> {\n setIntBusy(provider);\n try {\n setIntegrations(await api.updateIntegrationConfig(provider, config));\n } catch (err) {\n setIntFlash({ kind: 'error', message: err instanceof Error ? err.message : String(err) });\n throw err;\n } finally {\n setIntBusy(null);\n }\n }\n\n // Fetch the effective storage status when the Asset storage step is shown.\n useEffect(() => {\n if (step !== 2 || storage !== null) return;\n let active = true;\n api\n .getStorageStatus()\n .then((s) => active && setStorage(s))\n .catch((err: unknown) =>\n active ? setStorageError(err instanceof Error ? err.message : String(err)) : undefined,\n );\n return () => {\n active = false;\n };\n }, [step, storage, api]);\n\n async function finish(): Promise<void> {\n setFinishBusy(true);\n setFinishError(undefined);\n try {\n const p = await api.updateProject({ onboarded: true });\n setProject(p);\n props.onComplete?.({ project: p, accessId: accessId ?? p.accessId, accessSecret });\n } catch (err) {\n setFinishError(err instanceof Error ? err.message : String(err));\n } finally {\n setFinishBusy(false);\n }\n }\n\n const activeProvider = integrations?.find((i) => i.active)?.provider ?? null;\n const idForSnippets = accessId ?? project?.accessId ?? 'YOUR_ACCESS_ID';\n const scriptSnippet = `<script>\n window.Lens=window.Lens||function(){(Lens.q=Lens.q||[]).push(arguments)};\n Lens('init', '${idForSnippets}');\n</script>\n<script async src=\"https://cdn.merittdev.com/lens/v1/lens.min.js\"></script>`;\n const reactSnippet = `import { LensProvider } from '@merittdev/horus-lens/react';\n\nexport function App() {\n return (\n <LensProvider accessId=\"${idForSnippets}\">\n {/* your app */}\n </LensProvider>\n );\n}`;\n\n return (\n <div className={clsx('lens-db', 'lens-db__wizard', props.className)}>\n {/* Stepper header */}\n <ol className=\"lens-db__stepper\">\n {STEPS.map((label, i) => (\n <li\n key={label}\n className={clsx(\n 'lens-db__step',\n i === step && 'lens-db__step--current',\n i < step && 'lens-db__step--done',\n )}\n >\n <span className=\"lens-db__step-dot\">\n {i < step ? <IconCheck size={14} /> : i + 1}\n </span>\n <span className=\"lens-db__step-label\">{label}</span>\n </li>\n ))}\n </ol>\n\n <div className=\"lens-db__wizard-body\">\n {/* ---------- Step 1: Project ---------- */}\n {step === 0 && (\n <div className=\"lens-db__step-panel\">\n <h3 className=\"lens-db__wizard-title\">Create your project</h3>\n <p className=\"lens-db__muted\">\n Name it and list the origins allowed to submit reports.\n </p>\n\n {loadingExisting ? (\n <p className=\"lens-db__muted\">Loading project…</p>\n ) : (\n <>\n <label className=\"lens-db__field\">\n <span className=\"lens-db__label\">Project name</span>\n <input\n className=\"lens-db__input\"\n type=\"text\"\n value={name}\n disabled={step1Busy}\n placeholder=\"Acme Web App\"\n onChange={(e) => setName(e.target.value)}\n />\n </label>\n\n <label className=\"lens-db__field\">\n <span className=\"lens-db__label\">Allowed origins</span>\n <textarea\n className=\"lens-db__input lens-db__textarea\"\n rows={4}\n value={origins}\n disabled={step1Busy}\n placeholder={'https://app.acme.com\\nhttps://admin.acme.com'}\n onChange={(e) => setOrigins(e.target.value)}\n />\n <span className=\"lens-db__hint\">One origin per line.</span>\n </label>\n\n <label className=\"lens-db__field\">\n <span className=\"lens-db__label\">Dashboard URL</span>\n <input\n className=\"lens-db__input\"\n type=\"url\"\n value={dashboardUrl}\n disabled={step1Busy}\n placeholder=\"https://admin.acme.com/lens\"\n onChange={(e) => setDashboardUrl(e.target.value)}\n />\n <span className=\"lens-db__hint\">Issues link reports back to this page.</span>\n </label>\n\n {props.existingProject && (\n <div className=\"lens-db__note\">\n Loaded from your existing project — edit the name or origins and Continue to\n save. The access secret was shown only when the project was created and can't be\n displayed again.\n </div>\n )}\n </>\n )}\n\n {step1Error && <div className=\"lens-db__error\">{step1Error}</div>}\n </div>\n )}\n\n {/* ---------- Step 2: Destination ---------- */}\n {step === 1 && (\n <div className=\"lens-db__step-panel\">\n <h3 className=\"lens-db__wizard-title\">Choose an issue destination</h3>\n <p className=\"lens-db__muted\">\n Reports create issues in exactly one connected tracker. You can skip this and pick a\n destination later.\n </p>\n\n <IntegrationList\n integrations={integrations ?? []}\n busy={intBusy}\n flash={intFlash}\n onFlashDismiss={() => setIntFlash(null)}\n loading={integrations === null && !intLoadError}\n loadError={intLoadError ?? null}\n onRetry={() => {\n setIntLoadError(undefined);\n setIntegrations(null);\n }}\n onConnect={(p) => void connect(p)}\n onActivate={(p) => void activate(p)}\n onDisconnect={(p) => void disconnect(p)}\n onCompleteDev={(p) => void completeDev(p)}\n onSaveConfig={saveConfig}\n />\n\n <p className=\"lens-db__hint\">\n {activeProvider\n ? `Issues will route to ${providerLabel(activeProvider)}.`\n : 'No destination selected yet — issues will queue until you pick one.'}\n </p>\n </div>\n )}\n\n {/* ---------- Step 3: Asset storage (status only — env-configured) ---------- */}\n {step === 2 && (\n <div className=\"lens-db__step-panel\">\n <h3 className=\"lens-db__wizard-title\">Asset storage</h3>\n <p className=\"lens-db__muted\">\n Replays and screenshots upload straight to S3. Credentials are configured through\n environment variables on your Lens API deployment — never through this UI.\n </p>\n\n {!storage && !storageError && (\n <div className=\"lens-db__verify\">\n <span className=\"lens-db__spinner\" aria-hidden /> Checking storage…\n </div>\n )}\n\n {storage?.mode === 's3' && (\n <div className=\"lens-db__storage-ok\">\n <IconCheckCircle size={16} />\n <div>\n <div className=\"lens-db__storage-ok-title\">Asset storage configured</div>\n <div className=\"lens-db__muted\">\n <span className=\"lens-db__mono\">{storage.bucket}</span>\n {' · '}\n <span className=\"lens-db__mono\">{storage.region}</span>\n {storage.source === 'project'\n ? ' — project credentials'\n : ' — from the Lens API environment'}\n </div>\n </div>\n </div>\n )}\n\n {storage?.mode === 'local' && (\n <>\n <div\n className={\n storage.localAllowed ? 'lens-db__warn-banner' : 'lens-db__error'\n }\n >\n {storage.localAllowed\n ? 'Development mode: assets are stored on the API host disk. Configure S3 before going to production — report intake is rejected without it.'\n : 'No S3 bucket is configured. Report intake is disabled until asset storage is connected.'}\n </div>\n <p className=\"lens-db__label\">\n Set these on your Lens API deployment, then restart it:\n </p>\n <div className=\"lens-db__codewrap\">\n <pre className=\"lens-db__pre\">{highlightCode(S3_ENV_SNIPPET, 'env')}</pre>\n <CopyButton value={S3_ENV_SNIPPET} />\n </div>\n </>\n )}\n\n {storageError && <div className=\"lens-db__error\">{storageError}</div>}\n </div>\n )}\n\n {/* ---------- Step 4: Install ---------- */}\n {step === 3 && (\n <div className=\"lens-db__step-panel\">\n <h3 className=\"lens-db__wizard-title lens-db__wizard-title--ok\">\n <IconCheckCircle size={16} />\n Setup complete\n </h3>\n <p className=\"lens-db__muted\">\n Use these credentials to install the Lens widget in your app.\n </p>\n\n <div className=\"lens-db__cred\">\n <span className=\"lens-db__label\">Access ID</span>\n <div className=\"lens-db__cred-row\">\n <code className=\"lens-db__code-inline\">{idForSnippets}</code>\n <CopyButton value={idForSnippets} />\n </div>\n </div>\n\n {accessSecret ? (\n <div className=\"lens-db__warn-banner\">\n <span className=\"lens-db__warn-icon\">\n <IconAlertTriangle size={16} />\n </span>\n <div className=\"lens-db__warn-body\">\n <div className=\"lens-db__warn-title\">Store your access secret now</div>\n <p className=\"lens-db__warn-text\">\n This is the only time it will be shown. Save it in your server-side secret\n store — it will never be displayed again.\n </p>\n <div className=\"lens-db__cred-row\">\n <code className=\"lens-db__code-inline lens-db__code-inline--secret\">\n {accessSecret}\n </code>\n <CopyButton value={accessSecret} label=\"Copy secret\" />\n </div>\n </div>\n </div>\n ) : (\n <div className=\"lens-db__note\">\n The access secret isn't available here — it's shown only once, when the project is\n first created.\n </div>\n )}\n\n <div className=\"lens-db__snippet\">\n <div className=\"lens-db__snippet-head\">\n <span className=\"lens-db__label\">Script-tag loader</span>\n </div>\n <div className=\"lens-db__codeblock\">\n <pre className=\"lens-db__pre\">{highlightCode(scriptSnippet, 'markup')}</pre>\n <CopyButton value={scriptSnippet} ghost />\n </div>\n </div>\n\n <div className=\"lens-db__snippet\">\n <div className=\"lens-db__snippet-head\">\n <span className=\"lens-db__label\">React</span>\n </div>\n <div className=\"lens-db__codeblock\">\n <pre className=\"lens-db__pre\">{highlightCode(reactSnippet, 'markup')}</pre>\n <CopyButton value={reactSnippet} ghost />\n </div>\n </div>\n\n {finishError && <div className=\"lens-db__error\">{finishError}</div>}\n </div>\n )}\n </div>\n\n {/* Footer nav */}\n <div className=\"lens-db__wizard-footer\">\n <button\n type=\"button\"\n className=\"lens-db__btn lens-db__btn--ghost\"\n disabled={step === 0 || step1Busy || finishBusy}\n onClick={() => setStep((s) => Math.max(0, s - 1))}\n >\n Back\n </button>\n\n <div className=\"lens-db__wizard-footer-right\">\n {step === 0 && (\n <button\n type=\"button\"\n className=\"lens-db__btn lens-db__btn--primary\"\n disabled={step1Busy || loadingExisting || (props.existingProject && !project)}\n onClick={() => void submitStep1()}\n >\n {props.existingProject\n ? step1Busy\n ? 'Saving…'\n : 'Continue'\n : step1Busy\n ? 'Creating…'\n : 'Create project'}\n </button>\n )}\n\n {step === 1 && (\n <>\n <button\n type=\"button\"\n className=\"lens-db__btn lens-db__btn--ghost\"\n onClick={() => setStep(2)}\n >\n Skip\n </button>\n <button\n type=\"button\"\n className=\"lens-db__btn lens-db__btn--primary\"\n onClick={() => setStep(2)}\n >\n Next\n </button>\n </>\n )}\n\n {step === 2 && (\n <button\n type=\"button\"\n className=\"lens-db__btn lens-db__btn--primary\"\n disabled={!storage || (storage.mode === 'local' && !storage.localAllowed)}\n onClick={() => setStep(3)}\n >\n Continue\n </button>\n )}\n\n {step === 3 && (\n <button\n type=\"button\"\n className=\"lens-db__btn lens-db__btn--primary\"\n disabled={finishBusy}\n onClick={() => void finish()}\n >\n {finishBusy ? 'Finishing…' : 'Finish'}\n </button>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\n/**\n * Tiny zero-dependency syntax highlighter for the handful of snippet kinds the\n * dashboard renders (install snippets + env blocks). Token colors follow the\n * GitHub-light palette via `.lens-db__tok-*` classes in styles.css.\n */\nexport type SnippetLang = 'markup' | 'env';\n\ninterface Rule {\n cls: string;\n re: RegExp;\n}\n\n/** Order matters: earlier rules win at the same position. */\nconst MARKUP_RULES: Rule[] = [\n { cls: 'com', re: /<!--[\\s\\S]*?-->|\\/\\*[\\s\\S]*?\\*\\/|\\/\\/[^\\n]*/y },\n { cls: 'str', re: /\"(?:[^\"\\\\\\n]|\\\\.)*\"|'(?:[^'\\\\\\n]|\\\\.)*'|`(?:[^`\\\\]|\\\\.)*`/y },\n { cls: 'tag', re: /<\\/?[a-zA-Z][\\w.-]*|\\/>|>/y },\n {\n cls: 'kw',\n re: /\\b(?:import|from|export|function|return|const|let|var|async|await|new|window|default)\\b/y,\n },\n { cls: 'attr', re: /\\b[a-zA-Z_][\\w-]*(?==)/y },\n { cls: 'num', re: /\\b\\d+(?:\\.\\d+)?\\b/y },\n];\n\nconst ENV_RULES: Rule[] = [\n { cls: 'com', re: /#[^\\n]*/y },\n { cls: 'attr', re: /^[A-Z][A-Z0-9_]*(?==)/my },\n { cls: 'str', re: /(?<==)[^\\n]+/y },\n];\n\nexport function highlightCode(code: string, lang: SnippetLang): ReactNode[] {\n const rules = lang === 'env' ? ENV_RULES : MARKUP_RULES;\n const out: ReactNode[] = [];\n let pos = 0;\n let plainStart = 0;\n let key = 0;\n\n const flushPlain = (until: number) => {\n if (until > plainStart) out.push(code.slice(plainStart, until));\n };\n\n while (pos < code.length) {\n let matched = false;\n for (const rule of rules) {\n rule.re.lastIndex = pos;\n const m = rule.re.exec(code);\n if (m && m[0].length > 0) {\n flushPlain(pos);\n out.push(\n <span key={key++} className={`lens-db__tok-${rule.cls}`}>\n {m[0]}\n </span>,\n );\n pos += m[0].length;\n plainStart = pos;\n matched = true;\n break;\n }\n }\n if (!matched) pos += 1;\n }\n flushPlain(code.length);\n return out;\n}\n","import { useEffect, useState } from 'react';\nimport clsx from 'clsx';\nimport { useLensApi } from '../context.js';\nimport { useAsync } from '../useAsync.js';\nimport { IconCheck, IconCopy } from '../icons.js';\n\nexport interface ProjectSettingsProps {\n className?: string;\n}\n\nfunction parseOrigins(raw: string): string[] {\n return raw\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n}\n\n/**\n * Always-available editor for a project's name and allowed origins, plus a\n * read-only, copyable access id. Unlike the wizard this stands alone, so hosts\n * can expose an origins editor anywhere in their admin surface. Every save goes\n * through `updateProject`; the access secret is never shown here (it exists\n * only at creation time).\n */\nexport function ProjectSettings(props: ProjectSettingsProps): React.JSX.Element {\n const api = useLensApi();\n const { data, error, loading, reload } = useAsync(() => api.getProject(), []);\n\n const [name, setName] = useState('');\n const [origins, setOrigins] = useState('');\n const [dashboardUrl, setDashboardUrl] = useState('');\n const [saving, setSaving] = useState(false);\n const [saveError, setSaveError] = useState<string | undefined>(undefined);\n const [saved, setSaved] = useState(false);\n const [copied, setCopied] = useState(false);\n\n // Seed the editable fields from the loaded project (and after each save,\n // which returns the authoritative project).\n useEffect(() => {\n if (!data) return;\n setName(data.name);\n setOrigins(data.allowedOrigins.join('\\n'));\n setDashboardUrl(data.dashboardUrl ?? '');\n }, [data]);\n\n async function save(): Promise<void> {\n if (!name.trim()) {\n setSaveError('Project name is required.');\n return;\n }\n setSaving(true);\n setSaveError(undefined);\n setSaved(false);\n try {\n const p = await api.updateProject({\n name: name.trim(),\n allowedOrigins: parseOrigins(origins),\n dashboardUrl: dashboardUrl.trim() || null,\n });\n setName(p.name);\n setOrigins(p.allowedOrigins.join('\\n'));\n setDashboardUrl(p.dashboardUrl ?? '');\n setSaved(true);\n setTimeout(() => setSaved(false), 2000);\n } catch (err) {\n setSaveError(err instanceof Error ? err.message : String(err));\n } finally {\n setSaving(false);\n }\n }\n\n const accessId = data?.accessId ?? '';\n\n return (\n <div className={clsx('lens-db', 'lens-db__panel', props.className)}>\n <div>\n <h3 className=\"lens-db__wizard-title\">Project settings</h3>\n <p className=\"lens-db__muted\">Update the project name and the origins allowed to submit reports.</p>\n </div>\n\n {loading && !data && <p className=\"lens-db__muted\">Loading project…</p>}\n\n {error && !data && (\n <div className=\"lens-db__error\">\n Failed to load project: {error.message}{' '}\n <button type=\"button\" className=\"lens-db__link-btn\" onClick={reload}>\n Retry\n </button>\n </div>\n )}\n\n {data && (\n <>\n <label className=\"lens-db__field\">\n <span className=\"lens-db__label\">Project name</span>\n <input\n className=\"lens-db__input\"\n type=\"text\"\n value={name}\n disabled={saving}\n placeholder=\"Acme Web App\"\n onChange={(e) => setName(e.target.value)}\n />\n </label>\n\n <label className=\"lens-db__field\">\n <span className=\"lens-db__label\">Allowed origins</span>\n <textarea\n className=\"lens-db__input lens-db__textarea\"\n rows={4}\n value={origins}\n disabled={saving}\n placeholder={'https://app.acme.com\\nhttps://admin.acme.com'}\n onChange={(e) => setOrigins(e.target.value)}\n />\n <span className=\"lens-db__hint\">One origin per line.</span>\n </label>\n\n <label className=\"lens-db__field\">\n <span className=\"lens-db__label\">Dashboard URL</span>\n <input\n className=\"lens-db__input\"\n type=\"url\"\n value={dashboardUrl}\n disabled={saving}\n placeholder=\"https://admin.acme.com/lens\"\n onChange={(e) => setDashboardUrl(e.target.value)}\n />\n <span className=\"lens-db__hint\">Issues link reports back to this page.</span>\n </label>\n\n <div className=\"lens-db__field\">\n <span className=\"lens-db__label\">Access ID</span>\n <div className=\"lens-db__cred-row\">\n <code className=\"lens-db__code-inline\">{accessId}</code>\n <button\n type=\"button\"\n className={clsx('lens-db__copy-btn', copied && 'lens-db__copy-btn--done')}\n aria-label={copied ? 'Copied' : 'Copy access ID'}\n onClick={() => {\n void navigator.clipboard?.writeText(accessId).then(\n () => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n },\n () => undefined,\n );\n }}\n >\n {copied ? <IconCheck size={14} /> : <IconCopy size={14} />}\n {copied ? 'Copied' : 'Copy'}\n </button>\n </div>\n </div>\n\n {saveError && <div className=\"lens-db__error\">{saveError}</div>}\n\n <div className=\"lens-db__panel-actions\">\n <button\n type=\"button\"\n className=\"lens-db__btn lens-db__btn--primary\"\n disabled={saving}\n onClick={() => void save()}\n >\n {saving ? 'Saving…' : 'Save'}\n </button>\n {saved && (\n <span className=\"lens-db__flash lens-db__flash--ok\">\n <IconCheck size={14} />\n Saved\n </span>\n )}\n </div>\n </>\n )}\n </div>\n );\n}\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;"],"mappings":"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","names":["jsx","jsxs","useRef","useState","useCallback","useEffect","useState","useRef","jsx","jsxs","Fragment","useEffect","useState","useEffect","useState","Fragment","jsx","jsxs","useEffect","useState","jsx","Fragment","jsxs","useEffect","useState","Fragment","jsx","jsxs","config","clsx","r","useState","useCallback","useEffect","useRef","PROVIDER_NAME","currentReturnUrl","providerLabel","consumeOAuthCallback","parseOrigins"]}
|
|
1
|
+
{"version":3,"sources":["../../dashboard/src/api.ts","../../dashboard/src/context.tsx","../../dashboard/src/components/LensDashboard.tsx","../../dashboard/src/icons.tsx","../../dashboard/src/highlight.tsx","../../dashboard/src/components/ReportsTable.tsx","../../dashboard/src/utils.ts","../../dashboard/src/components/StatusBadge.tsx","../../dashboard/src/components/ReportDetail.tsx","../../dashboard/src/useAsync.ts","../../dashboard/src/components/ReplayPlayer.tsx","../../dashboard/src/components/IntegrationSettings.tsx","../../dashboard/src/components/IntegrationList.tsx","../../dashboard/src/components/OnboardingWizard.tsx","../../dashboard/src/components/ProjectSettings.tsx","../../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs"],"sourcesContent":["import type {\n AssetKind,\n Report,\n ReportStatus,\n ReportSummary,\n Integration,\n IntegrationConfig,\n IntegrationProvider,\n Project,\n CreateProjectRequest,\n CreateProjectResponse,\n UpdateProjectRequest,\n S3ConfigInput,\n ConnectIntegrationResponse,\n} from '@horus-lens/shared';\n\n// Re-export the wire types the integrations/onboarding surface uses so existing\n// consumers importing them from this module keep working.\nexport type { Integration, IntegrationConfig, IntegrationProvider } from '@horus-lens/shared';\n\nexport interface ListReportsQuery {\n status?: ReportStatus;\n /** Case-insensitive substring search over comment and URL. */\n q?: string;\n limit?: number;\n cursor?: string;\n}\n\nexport interface ListReportsResult {\n reports: ReportSummary[];\n nextCursor: string | null;\n}\n\n/**\n * Typed fetch client for the Lens management API. Every request is\n * authenticated with `Authorization: Bearer <token>` where the token is\n * resolved lazily via `config.getToken` on each call — so hosts can hand out\n * short-lived, server-minted tokens instead of leaking the long-lived\n * `accessSecret` to the browser.\n */\nexport interface LensApi {\n listReports(query?: ListReportsQuery): Promise<ListReportsResult>;\n getReport(id: string): Promise<Report>;\n /** Resolves the short-lived signed GET URL for a report asset. */\n getAssetUrl(id: string, kind: AssetKind): Promise<string>;\n /** Fetches a report asset and parses it as JSON (e.g. the rrweb replay events). */\n getAssetJson<T>(id: string, kind: AssetKind): Promise<T>;\n listIntegrations(): Promise<Integration[]>;\n connectIntegration(\n provider: IntegrationProvider,\n opts?: { returnUrl?: string },\n ): Promise<ConnectIntegrationResponse>;\n /**\n * Dev-only: completes the OAuth dance that `connectIntegration` starts,\n * flipping the provider to `connected` (and active as the destination).\n */\n completeIntegrationDev(provider: IntegrationProvider, account?: string): Promise<Integration>;\n /** Makes `provider` the single active issue destination; returns the refreshed list. */\n activateIntegration(provider: IntegrationProvider): Promise<Integration[]>;\n /** Disconnects `provider`; returns the refreshed list. */\n disconnectIntegration(provider: IntegrationProvider): Promise<Integration[]>;\n /** Updates `provider`'s non-secret issue-routing config; returns the refreshed list. */\n updateIntegrationConfig(\n provider: IntegrationProvider,\n config: IntegrationConfig,\n ): Promise<Integration[]>;\n /**\n * Live dropdown choices for `provider`'s config line, fetched from the\n * connected provider's API with the stored OAuth token. Rejects with code\n * `not_connected` (409) when the provider isn't connected, or\n * `options_fetch_failed` (502) on an upstream failure.\n */\n getIntegrationOptions(\n provider: IntegrationProvider,\n ): Promise<{ field: string; options: { value: string; label: string }[] }>;\n\n // ----- Project / onboarding -----\n /** Bootstrap/admin auth. `accessSecret` is returned exactly once. */\n createProject(body: CreateProjectRequest): Promise<CreateProjectResponse>;\n /** Reads the current project (S3 config masked, secret never returned). */\n getProject(): Promise<Project>;\n updateProject(body: UpdateProjectRequest): Promise<Project>;\n /** Verifies + stores S3 credentials. Rejects with code `s3_verification_failed` on bad creds. */\n setS3Config(body: S3ConfigInput): Promise<Project>;\n /** Removes the project's S3 config, reverting to Lens-managed storage. */\n clearS3Config(): Promise<Project>;\n /** Effective asset storage for the project (status only — credentials live in env). */\n getStorageStatus(): Promise<StorageStatus>;\n}\n\nexport interface StorageStatus {\n mode: 's3' | 'local';\n /** 'project' = per-project credentials, 'env' = the Lens API's environment. */\n source: 'project' | 'env' | null;\n bucket: string | null;\n region: string | null;\n /** Dev only. In production, report intake is rejected until S3 is configured. */\n localAllowed: boolean;\n}\n\nexport interface LensApiConfig {\n /** Base URL of the management API, e.g. `https://lens.acme.com` (no trailing `/v1`). */\n baseUrl: string;\n /**\n * Resolves a bearer token for each request. Return a short-lived token\n * minted by your backend — or an empty string when the host proxies\n * requests server-side and attaches credentials there (no Authorization\n * header is sent in that case, which keeps auth middleware like Clerk from\n * trying to validate a foreign bearer token).\n */\n getToken: () => string | Promise<string>;\n /**\n * Header used to carry the token. Defaults to `Authorization` with a\n * `Bearer ` prefix. Set a custom header (e.g. `x-lens-token`, sent raw)\n * when requests pass through auth middleware that hijacks Authorization\n * bearer tokens (Clerk returns 404 for foreign ones).\n */\n tokenHeader?: string;\n /**\n * Resolves the active Lens project id for hosts that manage multiple\n * projects behind one server-side proxy. When it returns a non-empty\n * string, every request additionally sends it as the `x-lens-project`\n * header — the proxy maps it to the right project secret, so the dashboard\n * never sees any secret. Return `null`/`undefined`/`''` (or omit the option\n * entirely) for single-project hosts, in which case no header is sent.\n */\n project?: () => string | null | undefined;\n}\n\nexport class LensApiError extends Error {\n constructor(\n public readonly status: number,\n public readonly code: string,\n message: string,\n ) {\n super(message);\n this.name = 'LensApiError';\n }\n}\n\nfunction joinUrl(baseUrl: string, path: string): string {\n return `${baseUrl.replace(/\\/+$/, '')}${path}`;\n}\n\nexport function createLensApi(config: LensApiConfig): LensApi {\n async function request<T>(path: string, init?: RequestInit): Promise<T> {\n const token = await config.getToken();\n const project = config.project?.();\n const res = await fetch(joinUrl(config.baseUrl, path), {\n ...init,\n headers: {\n Accept: 'application/json',\n ...(token\n ? config.tokenHeader && config.tokenHeader.toLowerCase() !== 'authorization'\n ? { [config.tokenHeader]: token }\n : { Authorization: `Bearer ${token}` }\n : {}),\n ...(project ? { 'x-lens-project': project } : {}),\n ...(init?.headers ?? {}),\n },\n });\n\n if (!res.ok) {\n let code = String(res.status);\n let message = res.statusText || 'Request failed';\n try {\n const body = (await res.json()) as { error?: string; message?: string };\n if (body?.error) code = body.error;\n if (body?.message) message = body.message;\n } catch {\n // non-JSON error body; keep status text\n }\n throw new LensApiError(res.status, code, message);\n }\n\n // Tolerate empty bodies (e.g. 204 from mutation endpoints).\n if (res.status === 204 || res.headers.get('content-length') === '0') {\n return undefined as T;\n }\n const text = await res.text();\n return (text ? JSON.parse(text) : undefined) as T;\n }\n\n return {\n async listReports(query) {\n const params = new URLSearchParams();\n if (query?.status) params.set('status', query.status);\n if (query?.q) params.set('q', query.q);\n if (query?.limit != null) params.set('limit', String(query.limit));\n if (query?.cursor) params.set('cursor', query.cursor);\n const qs = params.toString();\n return request<ListReportsResult>(`/v1/reports${qs ? `?${qs}` : ''}`);\n },\n\n async getReport(id) {\n return request<Report>(`/v1/reports/${encodeURIComponent(id)}`);\n },\n\n async getAssetUrl(id, kind) {\n const { url } = await request<{ url: string }>(\n `/v1/reports/${encodeURIComponent(id)}/assets/${encodeURIComponent(kind)}`,\n );\n return url;\n },\n\n async getAssetJson<T>(id: string, kind: AssetKind): Promise<T> {\n // Served through the API's asset relay, not the presigned storage URL:\n // browser-fetching a bucket directly requires the customer to configure\n // CORS on it, which we never want to depend on.\n return request<T>(`/v1/reports/${encodeURIComponent(id)}/assets/${kind}/raw`);\n },\n\n async listIntegrations() {\n const { integrations } = await request<{ integrations: Integration[] }>('/v1/integrations');\n return integrations;\n },\n\n async connectIntegration(provider, opts) {\n return request<ConnectIntegrationResponse>(\n `/v1/integrations/${encodeURIComponent(provider)}/connect`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(opts?.returnUrl != null ? { returnUrl: opts.returnUrl } : {}),\n },\n );\n },\n\n async completeIntegrationDev(provider, account) {\n return request<Integration>(\n `/v1/integrations/${encodeURIComponent(provider)}/callback`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(account != null ? { account } : {}),\n },\n );\n },\n\n async activateIntegration(provider) {\n await request<unknown>(`/v1/integrations/${encodeURIComponent(provider)}/activate`, {\n method: 'POST',\n });\n // Single-active semantics are server-owned; refetch for the authoritative list.\n return this.listIntegrations();\n },\n\n async disconnectIntegration(provider) {\n await request<unknown>(`/v1/integrations/${encodeURIComponent(provider)}`, {\n method: 'DELETE',\n });\n return this.listIntegrations();\n },\n\n async updateIntegrationConfig(provider, config) {\n // The endpoint returns the refreshed list, but tolerate a bare array,\n // a `{ integrations }` envelope, or an empty body by refetching — the\n // same way activate/disconnect stay resilient to the wire shape.\n const res = await request<{ integrations?: Integration[] } | Integration[] | undefined>(\n `/v1/integrations/${encodeURIComponent(provider)}/config`,\n {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(config),\n },\n );\n if (Array.isArray(res)) return res;\n if (res && Array.isArray(res.integrations)) return res.integrations;\n return this.listIntegrations();\n },\n\n async getIntegrationOptions(provider) {\n return request<{ field: string; options: { value: string; label: string }[] }>(\n `/v1/integrations/${encodeURIComponent(provider)}/options`,\n );\n },\n\n async createProject(body) {\n return request<CreateProjectResponse>('/v1/projects', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n },\n\n async getProject() {\n return request<Project>('/v1/project');\n },\n\n async updateProject(body) {\n return request<Project>('/v1/project', {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n },\n\n async setS3Config(body) {\n return request<Project>('/v1/project/s3', {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n },\n\n async clearS3Config() {\n return request<Project>('/v1/project/s3', { method: 'DELETE' });\n },\n async getStorageStatus() {\n return request<StorageStatus>('/v1/storage');\n },\n };\n}\n","import { createContext, useContext } from 'react';\nimport type { LensApi } from './api.js';\n\nconst LensApiContext = createContext<LensApi | null>(null);\n\nexport interface LensDashboardProviderProps {\n api: LensApi;\n /**\n * Optional explicit theme. When set, the provider wraps its subtree in a\n * `display: contents` scope that stamps `lens-db--dark` / `lens-db--light`,\n * pinning the components to that theme regardless of the host's `.dark` class\n * or `data-theme`. When omitted, components render LIGHT by default and follow\n * a host opt-in (`.dark`/`[data-theme]`) if present. OS preference is ignored.\n */\n theme?: 'light' | 'dark';\n children: React.ReactNode;\n}\n\n/**\n * Supplies a {@link LensApi} instance to the Lens dashboard components via\n * React context. Wrap any subtree that renders `ReportsTable`, `ReportDetail`,\n * `ReplayPlayer`, or `IntegrationSettings`.\n */\nexport function LensDashboardProvider(props: LensDashboardProviderProps): React.JSX.Element {\n const provided = <LensApiContext.Provider value={props.api}>{props.children}</LensApiContext.Provider>;\n if (!props.theme) return provided;\n // `display: contents` carries the theme variables to descendant `.lens-db`\n // roots without introducing a layout box in the host page.\n return (\n <div className={`lens-db-theme-scope lens-db--${props.theme}`}>{provided}</div>\n );\n}\n\n/** Reads the {@link LensApi} from context, throwing a clear error if missing. */\nexport function useLensApi(): LensApi {\n const api = useContext(LensApiContext);\n if (!api) {\n throw new Error(\n '[lens] No LensApi found in context. Wrap your dashboard in <LensDashboardProvider api={createLensApi(...)}>.',\n );\n }\n return api;\n}\n","import { createContext, useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport clsx from 'clsx';\nimport type { CreateProjectResponse } from '@horus-lens/shared';\nimport { createLensApi } from '../api.js';\nimport { LensDashboardProvider } from '../context.js';\nimport { IconBug, IconCheck, IconCopy, IconPlug, IconRocket } from '../icons.js';\nimport { highlightCode } from '../highlight.js';\nimport { ReportsTable } from './ReportsTable.js';\nimport { ReportDetail } from './ReportDetail.js';\nimport { IntegrationSettings } from './IntegrationSettings.js';\nimport { OnboardingWizard } from './OnboardingWizard.js';\n\n/** A project the dashboard can switch between, as returned by `projectsUrl`. */\ninterface ProjectRef {\n name: string;\n accessId: string;\n}\n\n/** The hosted Lens API — direct mode talks to it straight from the browser. */\nconst HOSTED_LENS_API_URL = 'https://api-lens.meritt.app';\n\n/**\n * Direct-mode configuration: full credentials passed straight to the\n * component, which then talks to the Lens API without any host-side proxy.\n * Only use this on pages that are themselves access-controlled (the secrets\n * are visible to anyone who can render the page).\n */\nexport interface LensAdminConfig {\n projects: { name: string; accessId: string; secretKey: string }[];\n /** Enables project creation from the Setup wizard (admin-scoped). */\n adminToken?: string;\n /** Lens API base. Default: the hosted API. */\n apiUrl?: string;\n}\n\ntype TabId = 'reports' | 'integrations' | 'setup';\n\nconst LensConfigContext = createContext<LensAdminConfig | null>(null);\n\n/**\n * Loads the keys for <LensAdmin>:\n *\n * <LensProvider config={config}>\n * <LensAdmin />\n * </LensProvider>\n *\n * `config` comes from your server code (page/server component reading env) —\n * render this only on access-controlled pages.\n */\nexport function LensProvider({\n config,\n children,\n}: {\n config: LensAdminConfig;\n children: ReactNode;\n}): React.JSX.Element {\n return <LensConfigContext.Provider value={config}>{children}</LensConfigContext.Provider>;\n}\n\nexport interface LensAdminProps {\n /**\n * Direct mode: pass keys and skip server routes entirely (or supply them via\n * the surrounding <LensProvider config={…}>). Wins over `baseUrl` /\n * `projectsUrl` / `projects`.\n */\n config?: LensAdminConfig;\n /** Proxy mode: server-side proxy base. Default '/api/lens'. */\n baseUrl?: string;\n /**\n * Proxy mode: endpoint returning `{ projects: [{ name, accessId }] }`.\n * Default '/api/lens-projects'. Ignored when `projects` is passed.\n */\n projectsUrl?: string;\n /** Proxy mode: static project list — skips the projectsUrl fetch. */\n projects?: ProjectRef[];\n /** Initial tab. Default 'reports'. */\n defaultTab?: TabId;\n theme?: 'light' | 'dark';\n className?: string;\n}\n\nconst TABS: { id: TabId; label: string; Icon: (p: { size?: number }) => React.JSX.Element }[] = [\n { id: 'reports', label: 'Issue Reports', Icon: IconBug },\n { id: 'integrations', label: 'Integrations', Icon: IconPlug },\n { id: 'setup', label: 'Setup', Icon: IconRocket },\n];\n\n/** SSR-safe read of the `report` / `project` query params (once, on first mount). */\nfunction readInitialParams(): { report: string | null; project: string | null } {\n if (typeof window === 'undefined') return { report: null, project: null };\n const params = new URLSearchParams(window.location.search);\n return { report: params.get('report'), project: params.get('project') };\n}\n\n/** Guarded `history.replaceState` that sets/clears the `report` query param. */\nfunction syncReportParam(reportId: string | null): void {\n if (typeof window === 'undefined') return;\n try {\n const params = new URLSearchParams(window.location.search);\n if (reportId) params.set('report', reportId);\n else params.delete('report');\n const qs = params.toString();\n const url = window.location.pathname + (qs ? `?${qs}` : '') + window.location.hash;\n window.history.replaceState(window.history.state, '', url);\n } catch {\n // history unavailable (e.g. sandboxed) — selection still works in-memory.\n }\n}\n\n/** Small clipboard button, mirroring the wizard's CopyButton (same classes). */\nfunction CopyButton({ value, label = 'Copy' }: { value: string; label?: string }): React.JSX.Element {\n const [copied, setCopied] = useState(false);\n return (\n <button\n type=\"button\"\n className={clsx('lens-db__copy-btn', copied && 'lens-db__copy-btn--done')}\n aria-label={copied ? 'Copied' : label}\n onClick={() => {\n void navigator.clipboard?.writeText(value).then(\n () => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n },\n () => undefined,\n );\n }}\n >\n {copied ? <IconCheck size={14} /> : <IconCopy size={14} />}\n {copied ? 'Copied' : label}\n </button>\n );\n}\n\n/**\n * Batteries-included admin surface for Lens. Renders the segmented tab bar\n * (Issue Reports / Integrations / Setup), an optional project switcher, report\n * deep-linking, and first-run provisioning — so a host writes a single import\n * instead of assembling the pieces by hand. Pairs with a server-side proxy the\n * host owns (`baseUrl`) that attaches project credentials.\n */\nexport function LensAdmin(props: LensAdminProps): React.JSX.Element {\n const contextConfig = useContext(LensConfigContext);\n const {\n config = contextConfig ?? undefined,\n baseUrl = '/api/lens',\n projectsUrl = '/api/lens-projects',\n projects: propProjects,\n defaultTab = 'reports',\n theme,\n className,\n } = props;\n\n // Direct mode: credentials came in as props; the component itself\n // authenticates against the Lens API and no proxy exists.\n const direct = !!config;\n const staticProjects = useMemo<ProjectRef[] | undefined>(\n () => config?.projects.map(({ name, accessId }) => ({ name, accessId })) ?? propProjects,\n [config, propProjects],\n );\n\n // The wizard-minted secret (used for the remaining wizard calls, and — in\n // direct mode — for the freshly created project until the host persists it),\n // and the active project's accessId.\n const wizardSecretRef = useRef<string>('');\n const activeProjectRef = useRef<string | null>(null);\n const configRef = useRef(config);\n configRef.current = config;\n\n // Built exactly once per mode.\n // - Proxy mode: `x-lens-token` carries the (usually empty) wizard secret and\n // `x-lens-project` names the project; the proxy attaches real credentials.\n // - Direct mode: standard `Authorization: Bearer` — the active project's\n // secret, the mid-wizard minted secret, or the admin token (which is what\n // authorizes project creation when nothing else exists yet).\n const api = useMemo(\n () =>\n direct\n ? createLensApi({\n baseUrl: configRef.current?.apiUrl ?? HOSTED_LENS_API_URL,\n getToken: () => {\n const cfg = configRef.current;\n const active = cfg?.projects.find((p) => p.accessId === activeProjectRef.current);\n return wizardSecretRef.current || active?.secretKey || cfg?.adminToken || '';\n },\n })\n : createLensApi({\n baseUrl,\n tokenHeader: 'x-lens-token',\n getToken: () => wizardSecretRef.current,\n project: () => activeProjectRef.current,\n }),\n [direct, baseUrl],\n );\n\n // Read the deep-link params once, SSR-safe.\n const [initialParams] = useState(readInitialParams);\n\n // Projects: the `projects` prop wins; otherwise fetch `projectsUrl` once.\n const [projects, setProjects] = useState<ProjectRef[]>(staticProjects ?? []);\n const [loadingProjects, setLoadingProjects] = useState(!staticProjects);\n const [activeAccessId, setActiveAccessId] = useState<string | null>(null);\n\n // On first mount, restore the `report` param for the initially-selected\n // project only. Cleared once the user switches projects (fresh selection).\n const [firstReportId, setFirstReportId] = useState<string | null>(initialParams.report);\n\n useEffect(() => {\n if (staticProjects) return;\n let active = true;\n setLoadingProjects(true);\n fetch(projectsUrl, { headers: { Accept: 'application/json' } })\n .then((res) => (res.ok ? res.json() : Promise.reject(new Error(String(res.status)))))\n .then((body: unknown) => {\n if (!active) return;\n const list =\n body && typeof body === 'object' && Array.isArray((body as { projects?: unknown }).projects)\n ? ((body as { projects: unknown[] }).projects.filter(\n (p): p is ProjectRef =>\n !!p &&\n typeof p === 'object' &&\n typeof (p as ProjectRef).name === 'string' &&\n typeof (p as ProjectRef).accessId === 'string',\n ) as ProjectRef[])\n : [];\n setProjects(list);\n setLoadingProjects(false);\n })\n .catch(() => {\n // Errors / 404 / invalid payloads → treat as no projects (provisioning).\n if (!active) return;\n setProjects([]);\n setLoadingProjects(false);\n });\n return () => {\n active = false;\n };\n }, [projectsUrl, staticProjects]);\n\n // Pick/keep the active project as the list resolves. Honors the `project`\n // deep-link param (matched by accessId) on first selection.\n useEffect(() => {\n const first = projects[0];\n if (!first) {\n setActiveAccessId(null);\n return;\n }\n setActiveAccessId((current) => {\n if (current && projects.some((p) => p.accessId === current)) return current;\n const fromUrl =\n initialParams.project && projects.find((p) => p.accessId === initialParams.project);\n return fromUrl ? fromUrl.accessId : first.accessId;\n });\n }, [projects, initialParams.project]);\n\n // Keep the header ref current *during render* so the surface's data-fetching\n // effects (which run before this parent's effects) see the right project.\n if (activeAccessId) activeProjectRef.current = activeAccessId;\n\n const provisioning = !loadingProjects && projects.length === 0;\n\n function switchProject(accessId: string): void {\n setFirstReportId(null); // a manual switch starts with no report selected\n setActiveAccessId(accessId);\n }\n\n return (\n <div className={clsx('lens-db', 'lens-db__shell', className)}>\n <LensDashboardProvider api={api} theme={theme}>\n {loadingProjects ? (\n <div className=\"lens-db__shell-loading\">Loading…</div>\n ) : provisioning ? (\n <Provisioning\n onProjectCreated={(res) => {\n wizardSecretRef.current = res.accessSecret;\n activeProjectRef.current = res.accessId;\n }}\n />\n ) : (\n <DashboardSurface\n key={activeAccessId ?? 'none'}\n projects={projects}\n activeAccessId={activeAccessId}\n onSwitchProject={switchProject}\n defaultTab={defaultTab}\n initialReportId={firstReportId}\n />\n )}\n </LensDashboardProvider>\n </div>\n );\n}\n\n/* ---------------------------------------------------------------------------\n * Provisioning (no projects configured yet)\n * ------------------------------------------------------------------------- */\n\nfunction Provisioning({\n onProjectCreated,\n}: {\n onProjectCreated: (res: CreateProjectResponse) => void;\n}): React.JSX.Element {\n const [minted, setMinted] = useState<{ name: string; accessId: string; secretKey: string } | null>(\n null,\n );\n\n const envBlock = minted\n ? `LENS_PROJECTS=[${JSON.stringify({\n name: minted.name,\n accessId: minted.accessId,\n secretKey: minted.secretKey,\n })}]`\n : '';\n\n return (\n <div className=\"lens-db__shell-provision\">\n <div className=\"lens-db__shell-notice\">\n <p className=\"lens-db__shell-notice-title\">No Lens projects configured</p>\n <p className=\"lens-db__muted\">\n Create your first project below. The minted access secret is shown once — add it to your\n server environment to finish wiring up the proxy.\n </p>\n </div>\n\n <OnboardingWizard\n onProjectCreated={(res) => {\n onProjectCreated(res);\n setMinted({\n name: res.project.name,\n accessId: res.accessId,\n secretKey: res.accessSecret,\n });\n }}\n />\n\n {minted && (\n <div className=\"lens-db__shell-env\">\n <p className=\"lens-db__label\">\n Add this to your server env and restart — the proxy reads it to route requests to the\n new project:\n </p>\n <div className=\"lens-db__codeblock\">\n <pre className=\"lens-db__pre\">{highlightCode(envBlock, 'env')}</pre>\n <CopyButton value={envBlock} label=\"Copy\" />\n </div>\n </div>\n )}\n </div>\n );\n}\n\n/* ---------------------------------------------------------------------------\n * Dashboard surface (tabs + switcher + content). Remounts per active project,\n * so a switch clears the report selection and resets to the default tab.\n * ------------------------------------------------------------------------- */\n\nfunction DashboardSurface({\n projects,\n activeAccessId,\n onSwitchProject,\n defaultTab,\n initialReportId,\n}: {\n projects: ProjectRef[];\n activeAccessId: string | null;\n onSwitchProject: (accessId: string) => void;\n defaultTab: TabId;\n initialReportId: string | null;\n}): React.JSX.Element {\n const [tab, setTab] = useState<TabId>(defaultTab);\n const [selected, setSelected] = useState<string | null>(initialReportId);\n\n // Deep-link selection ↔ `?report=<id>`.\n useEffect(() => {\n syncReportParam(selected);\n }, [selected]);\n\n const showSwitcher = projects.length > 1;\n\n return (\n <>\n <div className=\"lens-db__shell-bar\">\n <div className=\"lens-db__shell-tabs\" role=\"tablist\" aria-label=\"Lens sections\">\n {TABS.map(({ id, label, Icon }) => {\n const active = id === tab;\n return (\n <button\n key={id}\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n className={clsx('lens-db__shell-tab', active && 'lens-db__shell-tab--active')}\n onClick={() => setTab(id)}\n >\n <Icon size={16} />\n <span className=\"lens-db__shell-tab-label\">{label}</span>\n </button>\n );\n })}\n </div>\n\n {showSwitcher && (\n <div className=\"lens-db__shell-switcher\">\n <select\n className=\"lens-db__shell-select\"\n aria-label=\"Switch project\"\n value={activeAccessId ?? ''}\n onChange={(e) => onSwitchProject(e.target.value)}\n >\n {projects.map((p) => (\n <option key={p.accessId} value={p.accessId}>\n {p.name}\n </option>\n ))}\n </select>\n </div>\n )}\n </div>\n\n <div className=\"lens-db__shell-content\">\n {tab === 'reports' &&\n (selected ? (\n <ReportDetail reportId={selected} onClose={() => setSelected(null)} />\n ) : (\n <ReportsTable onSelect={setSelected} />\n ))}\n\n {tab === 'integrations' && <IntegrationSettings />}\n\n {tab === 'setup' && <OnboardingWizard existingProject />}\n </div>\n </>\n );\n}\n\n/* ---------------------------------------------------------------------------\n * Back-compat aliases: the component embeds Lens's admin surface into the\n * host's own dashboard, so `LensAdmin` is the canonical name.\n * ------------------------------------------------------------------------- */\n\nexport const LensDashboard = LensAdmin;\nexport type LensDashboardProps = LensAdminProps;\nexport type LensDashboardConfig = LensAdminConfig;\n","/**\n * Shared inline SVG icon set for the Lens dashboard.\n *\n * One consistent family: 16px viewport, 1.5 stroke, `currentColor`, rounded\n * caps/joins. Icons are decorative by default (`aria-hidden`); callers that use\n * an icon as the sole label of a control must supply an accessible name on the\n * control itself (e.g. `aria-label` on the button).\n */\nimport type { SVGProps } from 'react';\n\ntype IconProps = SVGProps<SVGSVGElement> & { size?: number };\n\nfunction base({ size = 16, ...rest }: IconProps): SVGProps<SVGSVGElement> {\n return {\n width: size,\n height: size,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.5,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n 'aria-hidden': true,\n focusable: false,\n ...rest,\n };\n}\n\nexport function IconPlay(props: IconProps): React.JSX.Element {\n return (\n <svg {...base(props)}>\n <path d=\"M8 5.5v13l11-6.5-11-6.5Z\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n );\n}\n\nexport function IconPause(props: IconProps): React.JSX.Element {\n return (\n <svg {...base(props)}>\n <rect x=\"7\" y=\"5\" width=\"3.5\" height=\"14\" rx=\"1\" fill=\"currentColor\" stroke=\"none\" />\n <rect x=\"13.5\" y=\"5\" width=\"3.5\" height=\"14\" rx=\"1\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n );\n}\n\nexport function IconClose(props: IconProps): React.JSX.Element {\n return (\n <svg {...base(props)}>\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n );\n}\n\nexport function IconArrowLeft(props: IconProps): React.JSX.Element {\n return (\n <svg {...base(props)}>\n <path d=\"M19 12H5M12 19l-7-7 7-7\" />\n </svg>\n );\n}\n\nexport function IconChevronLeft(props: IconProps): React.JSX.Element {\n return (\n <svg {...base(props)}>\n <path d=\"M15 6l-6 6 6 6\" />\n </svg>\n );\n}\n\nexport function IconChevronRight(props: IconProps): React.JSX.Element {\n return (\n <svg {...base(props)}>\n <path d=\"M9 6l6 6-6 6\" />\n </svg>\n );\n}\n\nexport function IconExternal(props: IconProps): React.JSX.Element {\n return (\n <svg {...base(props)}>\n <path d=\"M14 5h5v5M19 5l-8 8\" />\n <path d=\"M18 13.5V18a1.5 1.5 0 0 1-1.5 1.5H6A1.5 1.5 0 0 1 4.5 18V7.5A1.5 1.5 0 0 1 6 6h4.5\" />\n </svg>\n );\n}\n\nexport function IconCopy(props: IconProps): React.JSX.Element {\n return (\n <svg {...base(props)}>\n <rect x=\"9\" y=\"9\" width=\"11\" height=\"11\" rx=\"2\" />\n <path d=\"M5 15V6a1 1 0 0 1 1-1h9\" />\n </svg>\n );\n}\n\nexport function IconCheck(props: IconProps): React.JSX.Element {\n return (\n <svg {...base(props)}>\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n\nexport function IconCheckCircle(props: IconProps): React.JSX.Element {\n return (\n <svg {...base(props)}>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"m8.5 12 2.5 2.5 4.5-5\" />\n </svg>\n );\n}\n\nexport function IconAlertTriangle(props: IconProps): React.JSX.Element {\n return (\n <svg {...base(props)}>\n <path d=\"M12 4.5 21 19.5H3L12 4.5Z\" />\n <path d=\"M12 10v4.5\" />\n <path d=\"M12 17.25h.01\" />\n </svg>\n );\n}\n\nexport function IconInbox(props: IconProps): React.JSX.Element {\n return (\n <svg {...base(props)}>\n <path d=\"M4 13h4l1.5 2.5h5L16 13h4\" />\n <path d=\"M6.5 5h11l3 8v4.5A1.5 1.5 0 0 1 19 19H5a1.5 1.5 0 0 1-1.5-1.5V13l3-8Z\" />\n </svg>\n );\n}\n\nexport function IconBug(props: IconProps): React.JSX.Element {\n return (\n <svg {...base(props)}>\n <rect x=\"8\" y=\"7\" width=\"8\" height=\"12\" rx=\"4\" />\n <path d=\"M9 5a3 3 0 0 1 6 0\" />\n <path d=\"M12 8.5v10\" />\n <path d=\"M8 11H4.5M8 15H4M8 8 5.5 6M16 11h3.5M16 15h4M16 8l2.5-2\" />\n </svg>\n );\n}\n\nexport function IconPlug(props: IconProps): React.JSX.Element {\n return (\n <svg {...base(props)}>\n <path d=\"M9 3v5M15 3v5\" />\n <path d=\"M6.5 8h11v1.5a5.5 5.5 0 0 1-11 0V8Z\" />\n <path d=\"M12 15v6\" />\n </svg>\n );\n}\n\nexport function IconRocket(props: IconProps): React.JSX.Element {\n return (\n <svg {...base(props)}>\n <path d=\"M12 3c2.6 1.7 4 4.6 4 7.5l-1.8 2.5H9.8L8 10.5C8 7.6 9.4 4.7 12 3Z\" />\n <circle cx=\"12\" cy=\"9\" r=\"1.4\" />\n <path d=\"M9.8 13l-2 2.2.2 3 2.4-1.4M14.2 13l2 2.2-.2 3-2.4-1.4\" />\n </svg>\n );\n}\n\n/**\n * Brand marks (integration providers). Unlike the stroked icon family above,\n * these are official monochrome glyphs (simple-icons path data) filled with\n * `currentColor` so they inherit the surrounding text color and tint cleanly on\n * a neutral tile. Decorative by default — the provider name labels the control.\n */\nfunction brand({ size = 16, ...rest }: IconProps): SVGProps<SVGSVGElement> {\n return {\n width: size,\n height: size,\n viewBox: '0 0 24 24',\n fill: 'currentColor',\n 'aria-hidden': true,\n focusable: false,\n ...rest,\n };\n}\n\nexport function IconGitHub(props: IconProps): React.JSX.Element {\n return (\n <svg {...brand(props)}>\n <path d=\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\" />\n </svg>\n );\n}\n\nexport function IconLinear(props: IconProps): React.JSX.Element {\n return (\n <svg {...brand(props)}>\n <path d=\"M2.886 4.18A11.982 11.982 0 0 1 11.99 0C18.624 0 24 5.376 24 12.009c0 3.64-1.62 6.903-4.18 9.105L2.887 4.18ZM1.817 5.626l16.556 16.556c-.524.33-1.075.62-1.65.866L.951 7.277c.247-.575.537-1.126.866-1.65ZM.322 9.163l14.515 14.515c-.71.172-1.443.282-2.195.322L0 11.358a12 12 0 0 1 .322-2.195Zm-.17 4.862 9.823 9.824a12.02 12.02 0 0 1-9.824-9.824Z\" />\n </svg>\n );\n}\n\nexport function IconJira(props: IconProps): React.JSX.Element {\n return (\n <svg {...brand(props)}>\n <path d=\"M11.571 11.513H0a5.218 5.218 0 0 0 5.232 5.215h2.13v2.057A5.215 5.215 0 0 0 12.575 24V12.518a1.005 1.005 0 0 0-1.005-1.005zm5.723-5.756H5.736a5.215 5.215 0 0 0 5.215 5.214h2.129v2.058a5.218 5.218 0 0 0 5.215 5.214V6.758a1.001 1.001 0 0 0-1.001-1.001zM23.013 0H11.455a5.215 5.215 0 0 0 5.215 5.215h2.129v2.057A5.215 5.215 0 0 0 24 12.483V1.005A1.001 1.001 0 0 0 23.013 0Z\" />\n </svg>\n );\n}\n","import type { ReactNode } from 'react';\n\n/**\n * Tiny zero-dependency syntax highlighter for the handful of snippet kinds the\n * dashboard renders (install snippets + env blocks). Token colors follow the\n * GitHub-light palette via `.lens-db__tok-*` classes in styles.css.\n */\nexport type SnippetLang = 'markup' | 'env';\n\ninterface Rule {\n cls: string;\n re: RegExp;\n}\n\n/** Order matters: earlier rules win at the same position. */\nconst MARKUP_RULES: Rule[] = [\n { cls: 'com', re: /<!--[\\s\\S]*?-->|\\/\\*[\\s\\S]*?\\*\\/|\\/\\/[^\\n]*/y },\n { cls: 'str', re: /\"(?:[^\"\\\\\\n]|\\\\.)*\"|'(?:[^'\\\\\\n]|\\\\.)*'|`(?:[^`\\\\]|\\\\.)*`/y },\n { cls: 'tag', re: /<\\/?[a-zA-Z][\\w.-]*|\\/>|>/y },\n {\n cls: 'kw',\n re: /\\b(?:import|from|export|function|return|const|let|var|async|await|new|window|default)\\b/y,\n },\n { cls: 'attr', re: /\\b[a-zA-Z_][\\w-]*(?==)/y },\n { cls: 'num', re: /\\b\\d+(?:\\.\\d+)?\\b/y },\n];\n\nconst ENV_RULES: Rule[] = [\n { cls: 'com', re: /#[^\\n]*/y },\n { cls: 'attr', re: /^[A-Z][A-Z0-9_]*(?==)/my },\n { cls: 'str', re: /(?<==)[^\\n]+/y },\n];\n\nexport function highlightCode(code: string, lang: SnippetLang): ReactNode[] {\n const rules = lang === 'env' ? ENV_RULES : MARKUP_RULES;\n const out: ReactNode[] = [];\n let pos = 0;\n let plainStart = 0;\n let key = 0;\n\n const flushPlain = (until: number) => {\n if (until > plainStart) out.push(code.slice(plainStart, until));\n };\n\n while (pos < code.length) {\n let matched = false;\n for (const rule of rules) {\n rule.re.lastIndex = pos;\n const m = rule.re.exec(code);\n if (m && m[0].length > 0) {\n flushPlain(pos);\n out.push(\n <span key={key++} className={`lens-db__tok-${rule.cls}`}>\n {m[0]}\n </span>,\n );\n pos += m[0].length;\n plainStart = pos;\n matched = true;\n break;\n }\n }\n if (!matched) pos += 1;\n }\n flushPlain(code.length);\n return out;\n}\n","import { useCallback, useEffect, useState } from 'react';\nimport clsx from 'clsx';\nimport type { ReportStatus, ReportSummary } from '@horus-lens/shared';\nimport { useLensApi } from '../context.js';\nimport { relativeTime, urlPath } from '../utils.js';\nimport { StatusBadge } from './StatusBadge.js';\nimport { IconChevronLeft, IconChevronRight, IconInbox, IconPlay } from '../icons.js';\n\nexport interface ReportsTableProps {\n onSelect?: (id: string) => void;\n status?: ReportStatus;\n pageSize?: number;\n className?: string;\n}\n\nconst SEARCH_DEBOUNCE_MS = 350;\n\n/**\n * Paginated, searchable table of captured reports. A debounced search box\n * filters over comment + URL (server-side); pagination walks the API cursor\n * one page at a time via a client-side cursor stack (Prev/Next), where each\n * Next pushes the current cursor and each Prev pops back to it.\n */\nexport function ReportsTable(props: ReportsTableProps): React.JSX.Element {\n const { onSelect, status, pageSize = 20, className } = props;\n const api = useLensApi();\n\n const [reports, setReports] = useState<ReportSummary[]>([]);\n const [nextCursor, setNextCursor] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | undefined>(undefined);\n\n // Raw input vs. the debounced term actually sent to the API.\n const [input, setInput] = useState('');\n const [query, setQuery] = useState('');\n\n // Client-side cursor stack. `pageCursor` is the cursor used for the current\n // page (undefined = first page); `history` holds the cursors of the pages\n // behind it, so Prev pops back one and depth (history.length) gates Prev.\n const [pageCursor, setPageCursor] = useState<string | undefined>(undefined);\n const [history, setHistory] = useState<Array<string | undefined>>([]);\n\n const load = useCallback(\n async (cursor: string | undefined, q: string) => {\n setLoading(true);\n setError(undefined);\n try {\n const result = await api.listReports({\n status,\n q: q || undefined,\n limit: pageSize,\n cursor,\n });\n setReports(result.reports);\n setNextCursor(result.nextCursor);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setLoading(false);\n }\n },\n [api, status, pageSize],\n );\n\n // Debounce the raw input into the applied search term.\n useEffect(() => {\n const timer = setTimeout(() => setQuery(input.trim()), SEARCH_DEBOUNCE_MS);\n return () => clearTimeout(timer);\n }, [input]);\n\n // Initial mount + every applied-search (or status/pageSize) change resets\n // pagination to the first page and reloads.\n useEffect(() => {\n setHistory([]);\n setPageCursor(undefined);\n void load(undefined, query);\n }, [query, load]);\n\n function goNext(): void {\n if (!nextCursor) return;\n setHistory((h) => [...h, pageCursor]);\n setPageCursor(nextCursor);\n void load(nextCursor, query);\n }\n\n function goPrev(): void {\n if (history.length === 0) return;\n const prev = history[history.length - 1];\n setHistory((h) => h.slice(0, -1));\n setPageCursor(prev);\n void load(prev, query);\n }\n\n const canPrev = history.length > 0;\n const canNext = nextCursor !== null;\n const isOnlyPage = !canPrev && !canNext;\n const contextText = isOnlyPage\n ? `Showing ${reports.length}`\n : `${reports.length} on this page`;\n\n return (\n <div className={clsx('lens-db', 'lens-db__table-wrap', className)}>\n <div className=\"lens-db__table-toolbar\">\n <input\n type=\"search\"\n className=\"lens-db__input lens-db__table-search\"\n value={input}\n placeholder=\"Search comment or URL…\"\n aria-label=\"Search reports by comment or URL\"\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n setInput('');\n }\n }}\n />\n {!loading && !error && reports.length > 0 && (\n <span className=\"lens-db__table-context lens-db__muted\">{contextText}</span>\n )}\n </div>\n\n <table className=\"lens-db__table\">\n <thead>\n <tr>\n <th>Created</th>\n <th>Comment</th>\n <th>Path</th>\n <th>Status</th>\n <th className=\"lens-db__num\">Errors</th>\n <th className=\"lens-db__center\">Replay</th>\n <th>Issue</th>\n </tr>\n </thead>\n <tbody>\n {loading ? (\n <SkeletonRows rows={6} />\n ) : error ? (\n <tr>\n <td colSpan={7} className=\"lens-db__error\">\n Failed to load reports: {error.message}{' '}\n <button\n type=\"button\"\n className=\"lens-db__link-btn\"\n onClick={() => void load(pageCursor, query)}\n >\n Retry\n </button>\n </td>\n </tr>\n ) : reports.length === 0 ? (\n <tr>\n <td colSpan={7} className=\"lens-db__empty\">\n <span className=\"lens-db__empty-icon\">\n <IconInbox size={32} />\n </span>\n {query ? (\n <>\n <div className=\"lens-db__empty-title\">No matching reports</div>\n <div className=\"lens-db__empty-hint\">\n No reports match “{query}”. Try a different search.\n </div>\n </>\n ) : (\n <>\n <div className=\"lens-db__empty-title\">No reports yet</div>\n <div className=\"lens-db__empty-hint\">\n Visit your app with <code>?lens=true</code> and submit one.\n </div>\n </>\n )}\n </td>\n </tr>\n ) : (\n reports.map((r) => (\n <tr\n key={r.id}\n className={clsx('lens-db__row', onSelect && 'lens-db__row--clickable')}\n onClick={onSelect ? () => onSelect(r.id) : undefined}\n tabIndex={onSelect ? 0 : undefined}\n onKeyDown={\n onSelect\n ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onSelect(r.id);\n }\n }\n : undefined\n }\n >\n <td className=\"lens-db__muted lens-db__tnum\" title={r.createdAt}>\n {relativeTime(r.createdAt)}\n </td>\n <td>\n {r.comment ? (\n <span className=\"lens-db__cell-comment\" title={r.comment}>\n {r.comment}\n </span>\n ) : (\n <span className=\"lens-db__muted\">—</span>\n )}\n </td>\n <td className=\"lens-db__mono lens-db__muted\" title={r.url}>\n {urlPath(r.url)}\n </td>\n <td>\n <StatusBadge status={r.status} />\n </td>\n <td className=\"lens-db__num\">\n {r.errorCount > 0 ? (\n <span className=\"lens-db__badge lens-db__badge--danger\">{r.errorCount}</span>\n ) : (\n <span className=\"lens-db__muted\">0</span>\n )}\n </td>\n <td className=\"lens-db__center\">\n {r.hasReplay ? (\n <span className=\"lens-db__play\" title=\"Session replay captured\" aria-label=\"Has replay\">\n <IconPlay size={14} />\n </span>\n ) : (\n <span className=\"lens-db__muted\" aria-label=\"No replay\">—</span>\n )}\n </td>\n <td>\n {r.externalIssue ? (\n <a\n className=\"lens-db__link\"\n href={r.externalIssue.url}\n target=\"_blank\"\n rel=\"noreferrer\"\n onClick={(e) => e.stopPropagation()}\n >\n {r.externalIssue.key}\n </a>\n ) : (\n <span className=\"lens-db__muted\">—</span>\n )}\n </td>\n </tr>\n ))\n )}\n </tbody>\n </table>\n\n {!error && (canPrev || canNext) && (\n <div className=\"lens-db__table-footer lens-db__pager\">\n <button\n type=\"button\"\n className=\"lens-db__btn lens-db__btn--ghost\"\n disabled={!canPrev || loading}\n onClick={goPrev}\n >\n <IconChevronLeft size={16} />\n Prev\n </button>\n <button\n type=\"button\"\n className=\"lens-db__btn lens-db__btn--ghost\"\n disabled={!canNext || loading}\n onClick={goNext}\n >\n Next\n <IconChevronRight size={16} />\n </button>\n </div>\n )}\n </div>\n );\n}\n\nfunction SkeletonRows({ rows }: { rows: number }): React.JSX.Element {\n return (\n <>\n {Array.from({ length: rows }).map((_, i) => (\n <tr key={i} className=\"lens-db__row lens-db__row--skeleton\" aria-hidden>\n {Array.from({ length: 7 }).map((__, j) => (\n <td key={j}>\n <span className=\"lens-db__skeleton\" />\n </td>\n ))}\n </tr>\n ))}\n </>\n );\n}\n","/** Hand-rolled relative-time formatter — avoids pulling in date-fns/dayjs. */\nexport function relativeTime(iso: string | null | undefined, now: number = Date.now()): string {\n if (!iso) return '—';\n const then = new Date(iso).getTime();\n if (Number.isNaN(then)) return '—';\n const diff = now - then;\n const sec = Math.round(diff / 1000);\n if (sec < 5) return 'just now';\n if (sec < 60) return `${sec}s ago`;\n const min = Math.round(sec / 60);\n if (min < 60) return `${min}m ago`;\n const hr = Math.round(min / 60);\n if (hr < 24) return `${hr}h ago`;\n const day = Math.round(hr / 24);\n if (day < 7) return `${day}d ago`;\n const wk = Math.round(day / 7);\n if (wk < 5) return `${wk}w ago`;\n const mo = Math.round(day / 30);\n if (mo < 12) return `${mo}mo ago`;\n const yr = Math.round(day / 365);\n return `${yr}y ago`;\n}\n\n/** Absolute timestamp for tooltips / detail headers. */\nexport function formatTimestamp(iso: string | null | undefined): string {\n if (!iso) return '—';\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return '—';\n return d.toLocaleString();\n}\n\n/** Truncates a string to `max` chars with an ellipsis. */\nexport function truncate(value: string, max = 80): string {\n if (value.length <= max) return value;\n return `${value.slice(0, max - 1).trimEnd()}…`;\n}\n\n/** Extracts the path (+ query) from a URL string, falling back to the raw value. */\nexport function urlPath(raw: string | undefined): string {\n if (!raw) return '—';\n try {\n const u = new URL(raw);\n return `${u.pathname}${u.search}` || '/';\n } catch {\n return raw;\n }\n}\n\n/** Formats a network duration in ms. */\nexport function formatDuration(ms: number | null | undefined): string {\n if (ms == null) return '—';\n if (ms < 1000) return `${Math.round(ms)}ms`;\n return `${(ms / 1000).toFixed(2)}s`;\n}\n","import clsx from 'clsx';\nimport type { ReportStatus } from '@horus-lens/shared';\n\nconst LABELS: Record<ReportStatus, string> = {\n initiated: 'Initiated',\n submitted: 'Submitted',\n triaged: 'Triaged',\n linked: 'Linked',\n resolved: 'Resolved',\n};\n\nexport function StatusBadge({ status }: { status: ReportStatus }): React.JSX.Element {\n return (\n <span className={clsx('lens-db__badge', `lens-db__badge--${status}`)}>{LABELS[status]}</span>\n );\n}\n","import { useId, useRef, useState } from 'react';\nimport clsx from 'clsx';\nimport type {\n AppContext,\n AssetKind,\n AssetRef,\n ConsoleEntry,\n EnvContext,\n ErrorEntry,\n NetworkEntry,\n Report,\n ReportMetadata,\n} from '@horus-lens/shared';\nimport { useLensApi } from '../context.js';\nimport { useAsync } from '../useAsync.js';\nimport { formatDuration, formatTimestamp, relativeTime, truncate, urlPath } from '../utils.js';\nimport { StatusBadge } from './StatusBadge.js';\nimport { ReplayPlayer } from './ReplayPlayer.js';\nimport { IconClose, IconExternal } from '../icons.js';\n\nexport interface ReportDetailProps {\n reportId: string;\n onClose?: () => void;\n className?: string;\n}\n\n/** Full detail view for a single report: context, errors, logs, replay and assets. */\nexport function ReportDetail(props: ReportDetailProps): React.JSX.Element {\n const { reportId, onClose, className } = props;\n const api = useLensApi();\n const { data: report, error, loading, reload } = useAsync<Report>(\n () => api.getReport(reportId),\n [reportId],\n );\n\n return (\n <div className={clsx('lens-db', 'lens-db__detail', className)}>\n {loading && <div className=\"lens-db__detail-loading\">Loading report…</div>}\n\n {error && (\n <div className=\"lens-db__error\">\n Failed to load report: {error.message}{' '}\n <button type=\"button\" className=\"lens-db__link-btn\" onClick={reload}>\n Retry\n </button>\n </div>\n )}\n\n {report && <ReportDetailBody report={report} onClose={onClose} />}\n </div>\n );\n}\n\ntype TabId = 'overview' | 'replay' | 'logs' | 'network';\n\ninterface TabDef {\n id: TabId;\n label: string;\n /** Suffix count shown on the tab when > 0. */\n count?: number;\n}\n\nfunction ReportDetailBody({ report, onClose }: { report: Report; onClose?: () => void }): React.JSX.Element {\n const meta = report.metadata;\n const [tab, setTab] = useState<TabId>('overview');\n // Replay mounts lazily on first activation and stays mounted afterwards, so\n // switching tabs never reloads rrweb-player or restarts playback.\n const [replayMounted, setReplayMounted] = useState(false);\n const uid = useId();\n const tabRefs = useRef<Record<TabId, HTMLButtonElement | null>>({\n overview: null,\n replay: null,\n logs: null,\n network: null,\n });\n\n const errorCount = meta?.errors.length ?? 0;\n const consoleCount = meta?.consoleTail.length ?? 0;\n const networkCount = meta?.networkTail.length ?? 0;\n\n const tabs: TabDef[] = [\n { id: 'overview', label: 'Overview' },\n { id: 'replay', label: 'Replay' },\n { id: 'logs', label: 'Logs', count: errorCount + consoleCount },\n { id: 'network', label: 'Network', count: networkCount },\n ];\n\n function select(id: TabId) {\n if (id === 'replay') setReplayMounted(true);\n setTab(id);\n }\n\n function onTabKeyDown(e: React.KeyboardEvent, index: number) {\n let next = index;\n if (e.key === 'ArrowRight' || e.key === 'ArrowDown') next = (index + 1) % tabs.length;\n else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') next = (index - 1 + tabs.length) % tabs.length;\n else if (e.key === 'Home') next = 0;\n else if (e.key === 'End') next = tabs.length - 1;\n else return;\n e.preventDefault();\n const nextTab = tabs[next]?.id;\n if (!nextTab) return;\n select(nextTab);\n tabRefs.current[nextTab]?.focus();\n }\n\n const tabId = (id: TabId) => `${uid}-tab-${id}`;\n const panelId = (id: TabId) => `${uid}-panel-${id}`;\n\n return (\n <>\n <header className=\"lens-db__detail-header\">\n <div className=\"lens-db__detail-header-main\">\n <StatusBadge status={report.status} />\n <span className=\"lens-db__detail-time\" title={formatTimestamp(report.createdAt)}>\n {relativeTime(report.createdAt)}\n </span>\n {report.externalIssue && (\n <a\n className=\"lens-db__link lens-db__link-inline\"\n href={report.externalIssue.url}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {report.externalIssue.provider} · {report.externalIssue.key}\n <IconExternal size={13} />\n </a>\n )}\n </div>\n {onClose && (\n <button type=\"button\" className=\"lens-db__icon-btn\" aria-label=\"Close\" onClick={onClose}>\n <IconClose />\n </button>\n )}\n </header>\n\n <div className=\"lens-db__tabs\" role=\"tablist\" aria-label=\"Report sections\">\n {tabs.map((t, i) => {\n const active = t.id === tab;\n return (\n <button\n key={t.id}\n type=\"button\"\n role=\"tab\"\n id={tabId(t.id)}\n ref={(el) => {\n tabRefs.current[t.id] = el;\n }}\n aria-selected={active}\n aria-controls={panelId(t.id)}\n tabIndex={active ? 0 : -1}\n className={clsx('lens-db__tab', active && 'lens-db__tab--active')}\n onClick={() => select(t.id)}\n onKeyDown={(e) => onTabKeyDown(e, i)}\n >\n <span className=\"lens-db__tab-label\">{t.label}</span>\n {t.count != null && t.count > 0 && (\n <span className=\"lens-db__tab-count\">{t.count}</span>\n )}\n </button>\n );\n })}\n </div>\n\n <div className=\"lens-db__tabpanels\">\n {tab === 'overview' && (\n <div role=\"tabpanel\" id={panelId('overview')} aria-labelledby={tabId('overview')} tabIndex={0}>\n <OverviewPanel report={report} meta={meta} />\n </div>\n )}\n\n {tab === 'logs' && (\n <div role=\"tabpanel\" id={panelId('logs')} aria-labelledby={tabId('logs')} tabIndex={0}>\n <LogsPanel errors={meta?.errors ?? []} consoleEntries={meta?.consoleTail ?? []} />\n </div>\n )}\n\n {tab === 'network' && (\n <div role=\"tabpanel\" id={panelId('network')} aria-labelledby={tabId('network')} tabIndex={0}>\n <NetworkPanel entries={meta?.networkTail ?? []} />\n </div>\n )}\n\n {/* Replay stays mounted once activated so playback survives tab switches. */}\n {replayMounted && (\n <div\n role=\"tabpanel\"\n id={panelId('replay')}\n aria-labelledby={tabId('replay')}\n tabIndex={0}\n hidden={tab !== 'replay'}\n >\n <div className=\"lens-db__panel\">\n <ReplayPlayer reportId={report.id} />\n </div>\n </div>\n )}\n </div>\n </>\n );\n}\n\n/* ---------------------------------------------------------------------------\n * Overview tab\n * ------------------------------------------------------------------------- */\n\nfunction OverviewPanel({ report, meta }: { report: Report; meta: ReportMetadata | null }): React.JSX.Element {\n const hasScreenshot = report.assets.some((a) => a.kind === 'screenshot');\n const attachments = report.assets.filter((a) => a.kind !== 'screenshot');\n\n if (!meta) {\n return (\n <>\n {hasScreenshot && (\n <Section title=\"Screenshot\">\n <Screenshot reportId={report.id} />\n </Section>\n )}\n <Section title=\"Report\">\n <p className=\"lens-db__muted\">This report has no metadata yet (still initiating).</p>\n </Section>\n </>\n );\n }\n\n const hasTarget = Boolean(meta.target && (meta.target.domPath || meta.target.reactComponents?.length));\n\n return (\n <>\n {meta.comment && (\n <Section title=\"Comment\">\n <p className=\"lens-db__comment\">{meta.comment}</p>\n </Section>\n )}\n\n {hasScreenshot && (\n <Section title=\"Screenshot\">\n <Screenshot reportId={report.id} />\n </Section>\n )}\n\n <Section title=\"Environment\">\n <EnvironmentGrid env={meta.env} app={meta.app} />\n </Section>\n\n {hasTarget && meta.target && (\n <Section title=\"Target element\">\n {meta.target.domPath && <code className=\"lens-db__dompath\">{meta.target.domPath}</code>}\n {meta.target.reactComponents && meta.target.reactComponents.length > 0 && (\n <div className=\"lens-db__chips\">\n {meta.target.reactComponents.map((c, i) => (\n <span key={`${c}-${i}`} className=\"lens-db__chip\">\n {c}\n </span>\n ))}\n </div>\n )}\n </Section>\n )}\n\n {attachments.length > 0 && (\n <Section title=\"Attachments\">\n <Attachments reportId={report.id} assets={attachments} />\n </Section>\n )}\n </>\n );\n}\n\n/**\n * Lazily resolves the signed screenshot URL when the Overview tab mounts and\n * renders it in a bordered, zoomable frame. Failures collapse silently.\n */\nfunction Screenshot({ reportId }: { reportId: string }): React.JSX.Element | null {\n const api = useLensApi();\n const { data: url, error, loading } = useAsync<string>(\n () => api.getAssetUrl(reportId, 'screenshot'),\n [reportId],\n );\n\n if (loading) {\n return <div className=\"lens-db__shot lens-db__shot--loading\" aria-hidden />;\n }\n if (error || !url) return null;\n\n return (\n <a\n className=\"lens-db__shot\"\n href={url}\n target=\"_blank\"\n rel=\"noreferrer\"\n title=\"Open full screenshot in a new tab\"\n >\n <img className=\"lens-db__shot-img\" src={url} alt=\"Captured screenshot\" loading=\"lazy\" />\n </a>\n );\n}\n\n/* ---------------------------------------------------------------------------\n * Logs tab (errors + console)\n * ------------------------------------------------------------------------- */\n\ninterface ErrorGroup {\n entry: ErrorEntry;\n count: number;\n}\n\n/** Collapses errors sharing the same message into a single row with an ×N count. */\nfunction dedupeErrors(errors: ErrorEntry[]): ErrorGroup[] {\n const byMessage = new Map<string, ErrorGroup>();\n const order: ErrorGroup[] = [];\n for (const entry of errors) {\n const existing = byMessage.get(entry.message);\n if (existing) {\n existing.count += 1;\n } else {\n const group: ErrorGroup = { entry, count: 1 };\n byMessage.set(entry.message, group);\n order.push(group);\n }\n }\n return order;\n}\n\nfunction LogsPanel({ errors, consoleEntries }: { errors: ErrorEntry[]; consoleEntries: ConsoleEntry[] }): React.JSX.Element {\n const groups = dedupeErrors(errors);\n return (\n <>\n <Section title={`Errors${errors.length ? ` (${groups.length})` : ''}`}>\n {groups.length === 0 ? (\n <p className=\"lens-db__muted\">Nothing captured.</p>\n ) : (\n <div className=\"lens-db__scroll\">\n <ul className=\"lens-db__errlog\">\n {groups.map((g, i) => (\n <ErrorRow key={i} group={g} />\n ))}\n </ul>\n </div>\n )}\n </Section>\n\n <Section title=\"Console\">\n {consoleEntries.length === 0 ? (\n <p className=\"lens-db__muted\">Nothing captured.</p>\n ) : (\n <div className=\"lens-db__scroll\">\n <ConsoleTail entries={consoleEntries} />\n </div>\n )}\n </Section>\n </>\n );\n}\n\nfunction ErrorRow({ group }: { group: ErrorGroup }): React.JSX.Element {\n const { entry, count } = group;\n const firstLine = entry.message.split('\\n')[0] ?? entry.message;\n return (\n <li className=\"lens-db__errlog-item\">\n <details className=\"lens-db__errlog-details\">\n <summary className=\"lens-db__errlog-summary\">\n <span className=\"lens-db__errlog-msg\">{truncate(firstLine, 140)}</span>\n {count > 1 && <span className=\"lens-db__count-badge\">×{count}</span>}\n <span className=\"lens-db__errlog-source\">{entry.source}</span>\n </summary>\n <div className=\"lens-db__errlog-body\">\n {entry.message !== firstLine && <pre className=\"lens-db__stack\">{entry.message}</pre>}\n {entry.stack && <pre className=\"lens-db__stack\">{entry.stack}</pre>}\n </div>\n </details>\n </li>\n );\n}\n\nfunction ConsoleTail({ entries }: { entries: ConsoleEntry[] }): React.JSX.Element {\n return (\n <div className=\"lens-db__console\">\n {entries.map((e, i) => (\n <div key={i} className={clsx('lens-db__console-line', `lens-db__console-line--${e.level}`)}>\n <span className=\"lens-db__console-level\">{e.level}</span>\n <span className=\"lens-db__console-args\">{e.args.join(' ')}</span>\n </div>\n ))}\n </div>\n );\n}\n\n/* ---------------------------------------------------------------------------\n * Network tab\n * ------------------------------------------------------------------------- */\n\nfunction NetworkPanel({ entries }: { entries: NetworkEntry[] }): React.JSX.Element {\n return (\n <div className=\"lens-db__panel\">\n {entries.length === 0 ? (\n <p className=\"lens-db__muted\">Nothing captured.</p>\n ) : (\n <NetworkTail entries={entries} />\n )}\n </div>\n );\n}\n\nfunction NetworkTail({ entries }: { entries: NetworkEntry[] }): React.JSX.Element {\n return (\n <table className=\"lens-db__nettable\">\n <thead>\n <tr>\n <th>Method</th>\n <th>Path</th>\n <th className=\"lens-db__num\">Status</th>\n <th className=\"lens-db__num\">Duration</th>\n </tr>\n </thead>\n <tbody>\n {entries.map((e, i) => {\n const bad = e.error != null || e.ok === false || (e.status != null && (e.status < 200 || e.status >= 300));\n return (\n <tr key={i} className={clsx(bad && 'lens-db__netrow--bad')}>\n <td className=\"lens-db__mono\">{e.method}</td>\n <td className=\"lens-db__mono lens-db__muted\" title={e.url}>\n {urlPath(e.url)}\n </td>\n <td className=\"lens-db__num lens-db__mono lens-db__net-status\">{e.error ? 'ERR' : (e.status ?? '—')}</td>\n <td className=\"lens-db__num lens-db__muted\">{formatDuration(e.durationMs)}</td>\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n}\n\n/* ---------------------------------------------------------------------------\n * Shared building blocks\n * ------------------------------------------------------------------------- */\n\nfunction Section({ title, children }: { title: string; children: React.ReactNode }): React.JSX.Element {\n return (\n <section className=\"lens-db__section\">\n <h3 className=\"lens-db__section-title\">{title}</h3>\n <div className=\"lens-db__section-body\">{children}</div>\n </section>\n );\n}\n\nfunction EnvironmentGrid({ env, app }: { env: EnvContext; app?: AppContext }): React.JSX.Element {\n const rows: Array<[string, string | undefined]> = [\n ['Browser', env.browser],\n ['OS', env.os],\n ['Viewport', `${env.viewport.width}×${env.viewport.height}`],\n ['Language', env.language],\n ['Timezone', env.timezone],\n ['URL', env.url],\n ['Route', env.route],\n ['Release', app?.release],\n ['Git SHA', app?.gitSha],\n ];\n const monoLabels = new Set(['URL', 'Route', 'Release', 'Git SHA']);\n return (\n <dl className=\"lens-db__grid\">\n {rows\n .filter(([, v]) => v != null && v !== '')\n .map(([label, value]) => (\n <div key={label} className=\"lens-db__grid-row\">\n <dt className=\"lens-db__grid-label\">{label}</dt>\n <dd className={clsx('lens-db__grid-value', monoLabels.has(label) && 'lens-db__mono')}>\n {value}\n </dd>\n </div>\n ))}\n </dl>\n );\n}\n\nfunction Attachments({ reportId, assets }: { reportId: string; assets: AssetRef[] }): React.JSX.Element {\n const api = useLensApi();\n const [busy, setBusy] = useState<string | null>(null);\n const [err, setErr] = useState<string | undefined>(undefined);\n\n async function open(kind: AssetKind) {\n setBusy(kind);\n setErr(undefined);\n try {\n const url = await api.getAssetUrl(reportId, kind);\n window.open(url, '_blank', 'noopener,noreferrer');\n } catch (e) {\n setErr(e instanceof Error ? e.message : String(e));\n } finally {\n setBusy(null);\n }\n }\n\n return (\n <div className=\"lens-db__attachments\">\n {err && <div className=\"lens-db__error\">{err}</div>}\n <ul className=\"lens-db__attachment-list\">\n {assets.map((a) => (\n <li key={a.key} className=\"lens-db__attachment\">\n <span className=\"lens-db__attachment-kind\">{a.kind}</span>\n <span className=\"lens-db__muted lens-db__attachment-type\">{a.contentType}</span>\n {a.byteSize != null && (\n <span className=\"lens-db__muted lens-db__attachment-size\">{formatBytes(a.byteSize)}</span>\n )}\n <button\n type=\"button\"\n className=\"lens-db__link-btn\"\n disabled={busy === a.kind}\n onClick={() => void open(a.kind)}\n >\n {busy === a.kind ? 'Opening…' : 'Download'}\n </button>\n </li>\n ))}\n </ul>\n </div>\n );\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport interface AsyncState<T> {\n data: T | undefined;\n error: Error | undefined;\n loading: boolean;\n /** Re-runs the async function. */\n reload: () => void;\n}\n\n/**\n * Tiny data-fetching primitive — no react-query dependency. Runs `fn` on mount\n * and whenever `deps` change, tracks loading/error, and ignores results from\n * stale invocations (so the last-requested call always wins).\n */\nexport function useAsync<T>(fn: () => Promise<T>, deps: unknown[]): AsyncState<T> {\n const [data, setData] = useState<T | undefined>(undefined);\n const [error, setError] = useState<Error | undefined>(undefined);\n const [loading, setLoading] = useState<boolean>(true);\n const [nonce, setNonce] = useState(0);\n const runId = useRef(0);\n\n const reload = useCallback(() => setNonce((n) => n + 1), []);\n\n useEffect(() => {\n const id = ++runId.current;\n let active = true;\n setLoading(true);\n setError(undefined);\n\n fn()\n .then((result) => {\n if (active && id === runId.current) {\n setData(result);\n setLoading(false);\n }\n })\n .catch((err: unknown) => {\n if (active && id === runId.current) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setLoading(false);\n }\n });\n\n return () => {\n active = false;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [...deps, nonce]);\n\n return { data, error, loading, reload };\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport clsx from 'clsx';\nimport { useLensApi } from '../context.js';\nimport { IconPlay, IconPause } from '../icons.js';\n\n/** Instance type of rrweb's Replayer, resolved without a runtime import. */\ntype ReplayerInstance = import('rrweb').Replayer;\n\nexport interface ReplayPlayerProps {\n reportId: string;\n className?: string;\n}\n\nconst SPEEDS = [1, 2, 4] as const;\ntype Speed = (typeof SPEEDS)[number];\n\n/** Fallback viewport aspect when the recording carries no meta event. */\nconst FALLBACK_W = 16;\nconst FALLBACK_H = 10;\n\n/** `m:ss` from a millisecond offset (tabular-friendly). */\nfunction formatTime(ms: number): string {\n const total = Math.max(0, Math.floor(ms / 1000));\n const m = Math.floor(total / 60);\n const s = total % 60;\n return `${m}:${s.toString().padStart(2, '0')}`;\n}\n\n/** Reads the recording viewport from the rrweb meta event (EventType.Meta === 4). */\nfunction readViewport(events: unknown[]): { width: number; height: number } | null {\n for (const e of events) {\n if (e && typeof e === 'object' && (e as { type?: unknown }).type === 4) {\n const data = (e as { data?: { width?: unknown; height?: unknown } }).data;\n if (data && typeof data.width === 'number' && typeof data.height === 'number' && data.width > 0 && data.height > 0) {\n return { width: data.width, height: data.height };\n }\n }\n }\n return null;\n}\n\n/**\n * First-party rrweb session-replay player.\n *\n * Built directly on rrweb's proven `Replayer` (the `rrweb-player` Svelte wrapper\n * shipped a broken dist that never constructs a Replayer). The replayer's iframe\n * is scaled with a CSS transform to fit a responsive, viewport-aspect container;\n * a monochrome first-party controls bar drives play/pause, scrubbing, speed, and\n * skip-inactive.\n *\n * rrweb is loaded via a dynamic `import()` inside an effect so it never runs\n * during SSR. rrweb's base stylesheet is NOT imported here — the required rules\n * are inlined into `styles.css` under \"rrweb replayer base\".\n */\nexport function ReplayPlayer(props: ReplayPlayerProps): React.JSX.Element {\n const { reportId, className } = props;\n const api = useLensApi();\n\n const frameRef = useRef<HTMLDivElement | null>(null);\n const replayerRef = useRef<ReplayerInstance | null>(null);\n const rafRef = useRef<number | null>(null);\n const totalRef = useRef(0);\n const finishedRef = useRef(false);\n const playingRef = useRef(false);\n\n const [status, setStatus] = useState<'loading' | 'ready' | 'empty' | 'error'>('loading');\n const [message, setMessage] = useState<string | undefined>(undefined);\n const [playing, setPlaying] = useState(false);\n const [speed, setSpeed] = useState<Speed>(1);\n const [skipInactive, setSkipInactive] = useState(true);\n const [elapsed, setElapsed] = useState(0);\n const [total, setTotal] = useState(0);\n\n const stopRaf = useCallback(() => {\n if (rafRef.current != null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n }, []);\n\n /**\n * rrweb's getCurrentTime() is `timer.timeOffset + (baseline - firstEvent)`,\n * which is a huge NEGATIVE epoch-scale number until play() has run once.\n * Never trust it raw — clamp into [0, totalTime].\n */\n const safeCurrentTime = useCallback((): number => {\n const r = replayerRef.current;\n if (!r) return 0;\n const t = r.getCurrentTime();\n if (!Number.isFinite(t) || t < 0) return 0;\n return totalRef.current > 0 ? Math.min(t, totalRef.current) : t;\n }, []);\n\n const tick = useCallback(() => {\n if (!replayerRef.current) return;\n setElapsed(safeCurrentTime());\n rafRef.current = requestAnimationFrame(tick);\n }, [safeCurrentTime]);\n\n const startRaf = useCallback(() => {\n stopRaf();\n rafRef.current = requestAnimationFrame(tick);\n }, [stopRaf, tick]);\n\n const togglePlay = useCallback(() => {\n const r = replayerRef.current;\n if (!r) return;\n if (playingRef.current) {\n r.pause();\n playingRef.current = false;\n setPlaying(false);\n stopRaf();\n } else {\n const from = finishedRef.current ? 0 : safeCurrentTime();\n finishedRef.current = false;\n r.play(from);\n playingRef.current = true;\n setPlaying(true);\n startRaf();\n }\n }, [safeCurrentTime, startRaf, stopRaf]);\n\n const seekTo = useCallback((offsetMs: number) => {\n const r = replayerRef.current;\n if (!r) return;\n const clamped = totalRef.current > 0 ? Math.max(0, Math.min(offsetMs, totalRef.current)) : Math.max(0, offsetMs);\n finishedRef.current = false;\n if (playingRef.current) {\n r.play(clamped);\n } else {\n r.pause(clamped);\n }\n setElapsed(clamped);\n }, []);\n\n const changeSpeed = useCallback((next: Speed) => {\n setSpeed(next);\n replayerRef.current?.setConfig({ speed: next });\n }, []);\n\n const toggleSkipInactive = useCallback(() => {\n setSkipInactive((prev) => {\n const next = !prev;\n replayerRef.current?.setConfig({ skipInactive: next });\n return next;\n });\n }, []);\n\n // ---- Progress-track scrubbing (click + drag) ----\n const trackRef = useRef<HTMLDivElement | null>(null);\n const offsetFromPointer = useCallback((clientX: number): number => {\n const track = trackRef.current;\n if (!track || totalRef.current <= 0) return 0;\n const rect = track.getBoundingClientRect();\n const frac = rect.width > 0 ? (clientX - rect.left) / rect.width : 0;\n return Math.max(0, Math.min(1, frac)) * totalRef.current;\n }, []);\n\n const onTrackPointerDown = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (!replayerRef.current || totalRef.current <= 0) return;\n e.currentTarget.setPointerCapture(e.pointerId);\n seekTo(offsetFromPointer(e.clientX));\n },\n [offsetFromPointer, seekTo],\n );\n\n const onTrackPointerMove = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (!e.currentTarget.hasPointerCapture(e.pointerId)) return;\n seekTo(offsetFromPointer(e.clientX));\n },\n [offsetFromPointer, seekTo],\n );\n\n const onTrackKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n const step = totalRef.current * 0.05;\n if (e.key === 'ArrowLeft') {\n e.preventDefault();\n seekTo(safeCurrentTime() - step);\n } else if (e.key === 'ArrowRight') {\n e.preventDefault();\n seekTo(safeCurrentTime() + step);\n }\n },\n [seekTo],\n );\n\n // ---- Build the replayer (strict-mode-safe) ----\n useEffect(() => {\n let cancelled = false;\n let observer: ResizeObserver | null = null;\n\n setStatus('loading');\n setMessage(undefined);\n setPlaying(false);\n playingRef.current = false;\n finishedRef.current = false;\n setElapsed(0);\n setTotal(0);\n totalRef.current = 0;\n\n async function mount() {\n try {\n const events = await api.getAssetJson<unknown[]>(reportId, 'replay');\n if (cancelled) return;\n if (!Array.isArray(events) || events.length === 0) {\n setStatus('empty');\n return;\n }\n\n // Dynamic import keeps rrweb out of the SSR/module-eval path.\n const mod = await import('rrweb');\n if (cancelled) return;\n\n const frame = frameRef.current;\n if (!frame) return;\n frame.innerHTML = '';\n\n const viewport = readViewport(events) ?? { width: FALLBACK_W, height: FALLBACK_H };\n frame.style.aspectRatio = `${viewport.width} / ${viewport.height}`;\n\n const replayer = new mod.Replayer(events as ConstructorParameters<typeof mod.Replayer>[0], {\n root: frame,\n mouseTail: false,\n skipInactive: true,\n speed: 1,\n });\n if (cancelled) {\n replayer.destroy();\n return;\n }\n replayerRef.current = replayer;\n\n const meta = replayer.getMetaData();\n totalRef.current = meta.totalTime;\n setTotal(meta.totalTime);\n\n // Scale rrweb's wrapper/iframe to fit the container width. rrweb sizes the\n // iframe to the recorded viewport; we scale from the top-left so the frame's\n // aspect-ratio box contains it exactly.\n const baseWidth = replayer.iframe.offsetWidth || viewport.width;\n const applyScale = () => {\n const el = frameRef.current;\n if (!el || baseWidth <= 0) return;\n const scale = el.clientWidth / baseWidth;\n const wrapper = replayer.wrapper;\n wrapper.style.transformOrigin = 'top left';\n wrapper.style.transform = `scale(${scale})`;\n };\n applyScale();\n observer = new ResizeObserver(applyScale);\n observer.observe(frame);\n\n replayer.on(mod.ReplayerEvents.Finish, () => {\n finishedRef.current = true;\n playingRef.current = false;\n setPlaying(false);\n stopRaf();\n setElapsed(totalRef.current);\n });\n\n setStatus('ready');\n } catch (err) {\n if (cancelled) return;\n setStatus('error');\n setMessage(err instanceof Error ? err.message : String(err));\n }\n }\n\n void mount();\n\n return () => {\n cancelled = true;\n stopRaf();\n observer?.disconnect();\n try {\n replayerRef.current?.destroy();\n } catch {\n // already torn down\n }\n replayerRef.current = null;\n };\n }, [api, reportId, stopRaf]);\n\n const pct = total > 0 ? Math.min(100, (elapsed / total) * 100) : 0;\n\n return (\n <div className={clsx('lens-db', 'lens-db__replay', className)}>\n {status === 'loading' && <div className=\"lens-db__replay-state\">Loading replay…</div>}\n {status === 'empty' && <div className=\"lens-db__replay-state lens-db__muted\">No replay captured.</div>}\n {status === 'error' && (\n <div className=\"lens-db__replay-state lens-db__error\">\n No replay captured{message ? ` — ${message}` : ''}.\n </div>\n )}\n\n <div className=\"lens-db__rp\" data-visible={status === 'ready'}>\n <div ref={frameRef} className=\"lens-db__rp-frame\" />\n\n <div className=\"lens-db__rp-bar\">\n <button\n type=\"button\"\n className=\"lens-db__rp-play\"\n onClick={togglePlay}\n aria-label={playing ? 'Pause replay' : 'Play replay'}\n aria-pressed={playing}\n >\n {playing ? <IconPause size={16} /> : <IconPlay size={16} />}\n </button>\n\n <span className=\"lens-db__rp-time\">{formatTime(elapsed)}</span>\n\n <div\n ref={trackRef}\n className=\"lens-db__rp-track\"\n role=\"slider\"\n tabIndex={0}\n aria-label=\"Seek\"\n aria-valuemin={0}\n aria-valuemax={Math.round(total)}\n aria-valuenow={Math.round(elapsed)}\n aria-valuetext={`${formatTime(elapsed)} of ${formatTime(total)}`}\n onPointerDown={onTrackPointerDown}\n onPointerMove={onTrackPointerMove}\n onKeyDown={onTrackKeyDown}\n >\n <div className=\"lens-db__rp-fill\" style={{ width: `${pct}%` }} />\n </div>\n\n <span className=\"lens-db__rp-time\">{formatTime(total)}</span>\n\n <div className=\"lens-db__rp-speeds\" role=\"group\" aria-label=\"Playback speed\">\n {SPEEDS.map((s) => (\n <button\n key={s}\n type=\"button\"\n className={clsx('lens-db__rp-speed', speed === s && 'lens-db__rp-speed--on')}\n onClick={() => changeSpeed(s)}\n aria-pressed={speed === s}\n >\n {s}×\n </button>\n ))}\n </div>\n\n <button\n type=\"button\"\n className={clsx('lens-db__rp-skip', skipInactive && 'lens-db__rp-skip--on')}\n onClick={toggleSkipInactive}\n aria-pressed={skipInactive}\n >\n Skip idle\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\nimport clsx from 'clsx';\nimport { useLensApi } from '../context.js';\nimport { useAsync } from '../useAsync.js';\nimport { IntegrationList, type IntegrationListFlash } from './IntegrationList.js';\nimport type { Integration, IntegrationConfig, IntegrationProvider } from '../api.js';\n\nconst PROVIDER_NAME: Record<IntegrationProvider, string> = {\n linear: 'Linear',\n jira: 'Jira',\n github: 'GitHub',\n};\n\n/** The dashboard's own URL, for the OAuth callback to redirect back to. */\nfunction currentReturnUrl(): string | undefined {\n return typeof window !== 'undefined' ? window.location.href : undefined;\n}\n\nfunction providerLabel(raw: string): string {\n return (PROVIDER_NAME as Record<string, string>)[raw] ?? raw;\n}\n\n/**\n * Reads (and strips) the `lens_connected` / `lens_error` params the OAuth\n * callback appends when it lands back on the dashboard. Returns a one-shot\n * outcome so the caller can flash a note and refetch.\n */\nfunction consumeOAuthCallback(): { connected?: string; error?: string } | null {\n if (typeof window === 'undefined') return null;\n const params = new URLSearchParams(window.location.search);\n const connected = params.get('lens_connected');\n const error = params.get('lens_error');\n if (connected == null && error == null) return null;\n params.delete('lens_connected');\n params.delete('lens_error');\n try {\n const qs = params.toString();\n const url = window.location.pathname + (qs ? `?${qs}` : '') + window.location.hash;\n window.history.replaceState(window.history.state, '', url);\n } catch {\n // history unavailable (e.g. sandboxed) — the note still shows.\n }\n return { connected: connected ?? undefined, error: error ?? undefined };\n}\n\nexport interface IntegrationSettingsProps {\n className?: string;\n}\n\n/**\n * Lists all three issue-tracker integrations and manages their lifecycle against\n * the single-destination contract: exactly one connected provider can be the\n * active destination issues route to. Every mutation refetches the authoritative\n * list so single-active semantics are enforced by the server, not the UI. The\n * row/radio presentation lives in the shared {@link IntegrationList}.\n */\nexport function IntegrationSettings(props: IntegrationSettingsProps): React.JSX.Element {\n const api = useLensApi();\n const { data, error, loading, reload } = useAsync(() => api.listIntegrations(), []);\n const [busy, setBusy] = useState<IntegrationProvider | null>(null);\n const [list, setList] = useState<Integration[] | null>(null);\n const [flash, setFlash] = useState<IntegrationListFlash | null>(null);\n\n // On mount, surface the OAuth callback outcome the API redirected back with.\n useEffect(() => {\n const outcome = consumeOAuthCallback();\n if (!outcome) return;\n if (outcome.connected) {\n setFlash({ kind: 'ok', message: `${providerLabel(outcome.connected)} connected` });\n reload();\n }\n if (outcome.error) {\n setFlash({ kind: 'error', message: outcome.error });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const integrations = list ?? data ?? [];\n\n async function run(\n provider: IntegrationProvider,\n fn: () => Promise<Integration[] | void>,\n ): Promise<void> {\n setBusy(provider);\n try {\n const next = await fn();\n if (Array.isArray(next)) setList(next);\n else setList(await api.listIntegrations());\n } catch (err) {\n setFlash({ kind: 'error', message: err instanceof Error ? err.message : String(err) });\n } finally {\n setBusy(null);\n }\n }\n\n function connect(provider: IntegrationProvider): Promise<void> {\n return run(provider, async () => {\n const { authorizeUrl } = await api.connectIntegration(provider, {\n returnUrl: currentReturnUrl(),\n });\n window.open(authorizeUrl, '_blank', 'noopener,noreferrer');\n return api.listIntegrations();\n });\n }\n\n const completeDev = (provider: IntegrationProvider): Promise<void> =>\n run(provider, async () => {\n await api.completeIntegrationDev(provider);\n return api.listIntegrations();\n });\n\n const activate = (provider: IntegrationProvider): Promise<void> =>\n run(provider, () => api.activateIntegration(provider));\n\n const disconnect = (provider: IntegrationProvider): Promise<void> =>\n run(provider, () => api.disconnectIntegration(provider));\n\n // Kept off `run()` so the row can await success/failure: on error we flash\n // and rethrow so the config line drops its busy/check state.\n async function saveConfig(provider: IntegrationProvider, config: IntegrationConfig): Promise<void> {\n setBusy(provider);\n try {\n setList(await api.updateIntegrationConfig(provider, config));\n } catch (err) {\n setFlash({ kind: 'error', message: err instanceof Error ? err.message : String(err) });\n throw err;\n } finally {\n setBusy(null);\n }\n }\n\n return (\n <div className={clsx('lens-db', props.className)}>\n <IntegrationList\n integrations={integrations}\n busy={busy}\n title=\"Issue destination\"\n description=\"Reports create issues in exactly one connected tracker.\"\n flash={flash}\n onFlashDismiss={() => setFlash(null)}\n loading={loading && !list}\n loadError={error && !list ? error.message : null}\n onRetry={reload}\n onConnect={(p) => void connect(p)}\n onActivate={(p) => void activate(p)}\n onDisconnect={(p) => void disconnect(p)}\n onCompleteDev={(p) => void completeDev(p)}\n onSaveConfig={saveConfig}\n loadOptions={(p) => api.getIntegrationOptions(p)}\n />\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\nimport clsx from 'clsx';\nimport {\n IconGitHub,\n IconLinear,\n IconJira,\n IconCheck,\n IconCheckCircle,\n IconAlertTriangle,\n} from '../icons.js';\nimport type { Integration, IntegrationConfig, IntegrationProvider } from '../api.js';\n\ntype BrandIcon = (props: { size?: number }) => React.JSX.Element;\n\nconst PROVIDER_META: Record<IntegrationProvider, { name: string; Icon: BrandIcon }> = {\n linear: { name: 'Linear', Icon: IconLinear },\n jira: { name: 'Jira', Icon: IconJira },\n github: { name: 'GitHub', Icon: IconGitHub },\n};\n\nconst PROVIDER_ORDER: IntegrationProvider[] = ['linear', 'jira', 'github'];\n\n/** Which `IntegrationConfig` field each provider's config line edits. */\ninterface ConfigField {\n key: 'repo' | 'projectKey' | 'teamKey';\n label: string;\n placeholder: string;\n /** Amber nudge shown when this field is empty AND the row is the active destination. */\n requiredHint?: string;\n}\n\nconst CONFIG_FIELD: Record<IntegrationProvider, ConfigField> = {\n github: {\n key: 'repo',\n label: 'Repository',\n placeholder: 'owner/repo',\n requiredHint: 'Set a repository to enable issue creation',\n },\n jira: {\n key: 'projectKey',\n label: 'Project key',\n placeholder: 'BUG',\n requiredHint: 'Set a project key to enable issue creation',\n },\n linear: {\n key: 'teamKey',\n label: 'Team',\n placeholder: 'First team (default)',\n },\n};\n\n/** Selectable config option fetched live from the connected provider's API. */\nexport interface ConfigOption {\n value: string;\n label: string;\n}\n\n/** First (placeholder) option in each provider's dropdown. */\nconst SELECT_PLACEHOLDER: Record<IntegrationProvider, string> = {\n linear: 'First team (default)',\n github: 'Select a repository…',\n jira: 'Select a project…',\n};\n\nexport interface IntegrationListFlash {\n kind: 'ok' | 'error';\n message: string;\n}\n\nexport interface IntegrationListProps {\n /** Authoritative list from the server; rows render in a fixed provider order. */\n integrations: Integration[];\n /** Provider whose action is in flight (disables that row's controls). */\n busy: IntegrationProvider | null;\n /** Optional in-card header (title + muted description). Omit to render just the rows. */\n title?: string;\n description?: string;\n /** One-shot inline banner (OAuth outcome / action error); auto-dismisses after 4s. */\n flash?: IntegrationListFlash | null;\n onFlashDismiss?: () => void;\n /** Initial-load affordances. */\n loading?: boolean;\n loadError?: string | null;\n onRetry?: () => void;\n onConnect: (provider: IntegrationProvider) => void;\n /** Makes a connected provider the single active destination. */\n onActivate: (provider: IntegrationProvider) => void;\n onDisconnect: (provider: IntegrationProvider) => void;\n /** Dev stub: completes the OAuth dance for a pending provider. */\n onCompleteDev: (provider: IntegrationProvider) => void;\n /**\n * Persists a connected provider's issue-routing config. Resolve on success\n * (the row shows a brief check) and reject on failure (parents surface the\n * error through the flash banner, and the row clears its busy/check state).\n */\n onSaveConfig: (provider: IntegrationProvider, config: IntegrationConfig) => Promise<void>;\n /**\n * Lazily fetches the selectable config options for a connected provider (its\n * teams / repos / projects). When provided, a connected row's config line\n * renders a dropdown instead of a free-text input, falling back to the input\n * if the fetch fails. Parents pass `api.getIntegrationOptions`.\n */\n loadOptions?: (\n provider: IntegrationProvider,\n ) => Promise<{ field: string; options: ConfigOption[] }>;\n className?: string;\n}\n\n/**\n * Linear/Vercel-settings-style integration list: one bordered card whose rows\n * (one per provider, divided by hairlines) carry the real brand mark, a status\n * line, a radio-style destination selector, and right-aligned lifecycle actions.\n * Shared by the standalone IntegrationSettings surface and the onboarding\n * wizard's Destination step so both stay pixel-identical.\n */\nexport function IntegrationList(props: IntegrationListProps): React.JSX.Element {\n const {\n integrations,\n busy,\n title,\n description,\n flash,\n onFlashDismiss,\n loading,\n loadError,\n onRetry,\n onConnect,\n onActivate,\n onDisconnect,\n onCompleteDev,\n onSaveConfig,\n loadOptions,\n className,\n } = props;\n\n // Auto-dismiss the inline banner after 4s so it never lingers.\n useEffect(() => {\n if (!flash || !onFlashDismiss) return;\n const t = setTimeout(onFlashDismiss, 4000);\n return () => clearTimeout(t);\n }, [flash, onFlashDismiss]);\n\n const byProvider = new Map<IntegrationProvider, Integration>();\n for (const it of integrations) byProvider.set(it.provider, it);\n\n const hasHeader = Boolean(title || description);\n\n return (\n <div className={clsx('lens-db__intlist', className)}>\n {hasHeader && (\n <div className=\"lens-db__intlist-head\">\n {title && <div className=\"lens-db__intlist-title\">{title}</div>}\n {description && <div className=\"lens-db__intlist-desc lens-db__muted\">{description}</div>}\n </div>\n )}\n\n {flash && (\n <div\n className={clsx(\n 'lens-db__intlist-banner',\n flash.kind === 'ok'\n ? 'lens-db__intlist-banner--ok'\n : 'lens-db__intlist-banner--error',\n )}\n role=\"status\"\n >\n {flash.kind === 'ok' ? <IconCheckCircle size={16} /> : <IconAlertTriangle size={16} />}\n <span>{flash.message}</span>\n </div>\n )}\n\n {loading ? (\n <div className=\"lens-db__intlist-rows\" aria-busy=\"true\">\n {PROVIDER_ORDER.map((p) => (\n <div key={p} className=\"lens-db__introw lens-db__introw--skeleton\">\n <span className=\"lens-db__skeleton lens-db__intmark-skeleton\" />\n <span className=\"lens-db__intbody\">\n <span className=\"lens-db__skeleton\" style={{ width: '35%' }} />\n <span\n className=\"lens-db__skeleton\"\n style={{ width: '55%', marginTop: '7px', height: '10px' }}\n />\n </span>\n </div>\n ))}\n </div>\n ) : loadError ? (\n <div className=\"lens-db__intlist-load-error\">\n Failed to load integrations: {loadError}\n {onRetry && (\n <>\n {' '}\n <button type=\"button\" className=\"lens-db__link-btn\" onClick={onRetry}>\n Retry\n </button>\n </>\n )}\n </div>\n ) : (\n <div\n className=\"lens-db__intlist-rows\"\n role=\"radiogroup\"\n aria-label=\"Issue destination\"\n >\n {PROVIDER_ORDER.map((provider) => {\n const meta = PROVIDER_META[provider];\n const Icon = meta.Icon;\n const integration = byProvider.get(provider);\n const status = integration?.status ?? 'disconnected';\n const active = integration?.active ?? false;\n const account = integration?.account ?? null;\n const isBusy = busy === provider;\n const isConnected = status === 'connected';\n\n const statusLine =\n status === 'connected'\n ? account\n ? `Connected as ${account}`\n : 'Connected'\n : status === 'pending'\n ? 'Waiting for authorization…'\n : 'Not connected';\n\n return (\n <div\n key={provider}\n className={clsx('lens-db__introw', active && 'lens-db__introw--active')}\n >\n <span className=\"lens-db__intmark\" aria-hidden>\n <Icon size={20} />\n </span>\n\n <span className=\"lens-db__intbody\">\n <span className=\"lens-db__intname\">{meta.name}</span>\n <span className=\"lens-db__intstatus\">\n <span\n className={clsx(\n 'lens-db__intdot',\n status === 'connected'\n ? 'lens-db__intdot--on'\n : status === 'pending'\n ? 'lens-db__intdot--pending'\n : 'lens-db__intdot--off',\n )}\n aria-hidden\n />\n <span>{statusLine}</span>\n </span>\n </span>\n\n <span className=\"lens-db__introw-right\">\n {isConnected && (\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={active}\n aria-label={\n active\n ? `${meta.name} is the issue destination`\n : `Make ${meta.name} the issue destination`\n }\n className={clsx(\n 'lens-db__intradio',\n active && 'lens-db__intradio--active',\n )}\n disabled={isBusy || active}\n onClick={() => !active && onActivate(provider)}\n >\n <span className=\"lens-db__intradio-dot\">\n {active && <span className=\"lens-db__intradio-fill\" />}\n </span>\n Destination\n </button>\n )}\n\n {status === 'pending' && (\n <>\n <span className=\"lens-db__intwait\">waiting for authorization…</span>\n <button\n type=\"button\"\n className=\"lens-db__btn lens-db__btn--sm\"\n disabled={isBusy}\n onClick={() => onCompleteDev(provider)}\n >\n {isBusy ? 'Completing…' : 'Complete connection (dev)'}\n </button>\n </>\n )}\n\n {status === 'disconnected' && (\n <button\n type=\"button\"\n className=\"lens-db__btn lens-db__btn--sm\"\n disabled={isBusy}\n onClick={() => onConnect(provider)}\n >\n {isBusy ? 'Opening…' : 'Connect'}\n </button>\n )}\n\n {status !== 'disconnected' && (\n <button\n type=\"button\"\n className=\"lens-db__btn lens-db__btn--sm lens-db__btn--danger-ghost\"\n aria-label={`Disconnect ${meta.name}`}\n disabled={isBusy}\n onClick={() => onDisconnect(provider)}\n >\n Disconnect\n </button>\n )}\n </span>\n\n {isConnected && (\n <IntegrationConfigLine\n provider={provider}\n config={integration?.config ?? {}}\n active={active}\n disabled={isBusy}\n onSave={(config) => onSaveConfig(provider, config)}\n loadOptions={loadOptions}\n />\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n\n/** Lazy-load lifecycle for a provider's dropdown options. */\ntype OptionsState =\n | { status: 'idle' }\n | { status: 'loading' }\n | { status: 'ready'; options: ConfigOption[] }\n | { status: 'error' };\n\n/**\n * Subdued second line under a connected row: a compact editor for the\n * provider's issue-routing target.\n *\n * When `loadOptions` is provided we render a dropdown populated live from the\n * connected provider's API (options fetched once on mount, cached in state,\n * showing a disabled \"Loading…\" select meanwhile) and save immediately on\n * change. If that fetch fails we FALL BACK to the free-text input (a subtle\n * muted note invites manual entry). In the text path the Save button only\n * appears while the value differs from the saved config; committing shows a\n * brief busy spinner then a 2s check. Enter also saves.\n */\nfunction IntegrationConfigLine({\n provider,\n config,\n active,\n disabled,\n onSave,\n loadOptions,\n}: {\n provider: IntegrationProvider;\n config: IntegrationConfig;\n active: boolean;\n disabled: boolean;\n onSave: (config: IntegrationConfig) => Promise<void>;\n loadOptions?: (\n provider: IntegrationProvider,\n ) => Promise<{ field: string; options: ConfigOption[] }>;\n}): React.JSX.Element {\n const field = CONFIG_FIELD[provider];\n const saved = config[field.key] ?? '';\n const [value, setValue] = useState(saved);\n const [busy, setBusy] = useState(false);\n const [done, setDone] = useState(false);\n const [options, setOptions] = useState<OptionsState>({ status: 'idle' });\n\n // Re-sync the input when the server value changes (save committed elsewhere,\n // reconnect resets the config, etc.) without clobbering in-progress edits.\n useEffect(() => {\n setValue(saved);\n }, [saved]);\n\n // Lazy-load the dropdown options once, the first time this connected row\n // mounts. On failure we stay in `error` and the input fallback renders.\n useEffect(() => {\n if (!loadOptions) return;\n let cancelled = false;\n setOptions({ status: 'loading' });\n loadOptions(provider)\n .then((res) => {\n if (!cancelled) setOptions({ status: 'ready', options: res.options });\n })\n .catch(() => {\n if (!cancelled) setOptions({ status: 'error' });\n });\n return () => {\n cancelled = true;\n };\n }, [loadOptions, provider]);\n\n const dirty = value.trim() !== saved;\n\n async function commit(raw: string): Promise<void> {\n if (busy) return;\n setBusy(true);\n setDone(false);\n const next: IntegrationConfig = { ...config };\n next[field.key] = raw.trim() || undefined;\n try {\n await onSave(next);\n setDone(true);\n setTimeout(() => setDone(false), 2000);\n } catch {\n // The parent surfaces the failure through the shared flash banner.\n } finally {\n setBusy(false);\n }\n }\n\n const saveText = (): void => {\n if (dirty) void commit(value);\n };\n\n const onSelect = (next: string): void => {\n setValue(next);\n void commit(next);\n };\n\n const showHint = Boolean(field.requiredHint) && active && !saved;\n\n // A dropdown renders whenever options are available (or loading); any fetch\n // failure — or no loader at all — falls back to the free-text input.\n const useSelect =\n Boolean(loadOptions) && (options.status === 'loading' || options.status === 'ready');\n\n return (\n <div className=\"lens-db__intconfig\">\n <label className=\"lens-db__intconfig-field\">\n <span className=\"lens-db__intconfig-label\">{field.label}</span>\n {useSelect ? (\n <ConfigSelect\n provider={provider}\n value={value}\n options={options.status === 'ready' ? options.options : null}\n loading={options.status === 'loading'}\n disabled={disabled || busy}\n onChange={onSelect}\n />\n ) : (\n <input\n className=\"lens-db__intconfig-input\"\n type=\"text\"\n value={value}\n placeholder={field.placeholder}\n disabled={disabled || busy}\n spellCheck={false}\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n saveText();\n }\n }}\n />\n )}\n </label>\n\n {busy ? (\n <span className=\"lens-db__intconfig-busy\" aria-live=\"polite\" aria-label=\"Saving\">\n <span className=\"lens-db__spinner\" aria-hidden />\n </span>\n ) : done ? (\n <span className=\"lens-db__intconfig-done\" aria-live=\"polite\" aria-label=\"Saved\">\n <IconCheck size={14} />\n </span>\n ) : !useSelect && dirty ? (\n <button\n type=\"button\"\n className=\"lens-db__btn lens-db__btn--sm\"\n disabled={disabled}\n onClick={saveText}\n >\n Save\n </button>\n ) : null}\n\n {!useSelect && options.status === 'error' && loadOptions && (\n <span className=\"lens-db__intconfig-note\">\n Couldn't load options — enter manually.\n </span>\n )}\n\n {showHint && <span className=\"lens-db__intconfig-hint\">{field.requiredHint}</span>}\n </div>\n );\n}\n\n/**\n * The dropdown variant of the config editor. The first option is a\n * placeholder; for github/jira it is disabled once a real choice is required,\n * while linear keeps the empty value selectable (its team is optional). A saved\n * value that isn't among the fetched options is prepended so it is never lost.\n */\nfunction ConfigSelect({\n provider,\n value,\n options,\n loading,\n disabled,\n onChange,\n}: {\n provider: IntegrationProvider;\n value: string;\n options: ConfigOption[] | null;\n loading: boolean;\n disabled: boolean;\n onChange: (value: string) => void;\n}): React.JSX.Element {\n if (loading || !options) {\n return (\n <select className=\"lens-db__intconfig-select\" disabled aria-label=\"Loading options\">\n <option>Loading…</option>\n </select>\n );\n }\n\n // '' is only a real choice for linear (its team defaults when unset).\n const placeholderDisabled = provider !== 'linear';\n const known = new Set(options.map((o) => o.value));\n const orphan = value && !known.has(value) ? value : null;\n\n return (\n <select\n className=\"lens-db__intconfig-select\"\n value={value}\n disabled={disabled}\n onChange={(e) => onChange(e.target.value)}\n >\n <option value=\"\" disabled={placeholderDisabled}>\n {SELECT_PLACEHOLDER[provider]}\n </option>\n {orphan && <option value={orphan}>{orphan}</option>}\n {options.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n );\n}\n","import { useEffect, useState } from 'react';\nimport clsx from 'clsx';\nimport type {\n CreateProjectResponse,\n Integration,\n IntegrationConfig,\n IntegrationProvider,\n Project,\n} from '@horus-lens/shared';\nimport { LensApiError, type StorageStatus } from '../api.js';\nimport { highlightCode } from '../highlight.js';\nimport { useLensApi } from '../context.js';\nimport { IconAlertTriangle, IconCheck, IconCheckCircle, IconCopy } from '../icons.js';\nimport { IntegrationList, type IntegrationListFlash } from './IntegrationList.js';\n\nconst STEPS = ['Project', 'Destination', 'Asset storage', 'Install'] as const;\n\nconst PROVIDER_NAME: Record<IntegrationProvider, string> = {\n linear: 'Linear',\n jira: 'Jira',\n github: 'GitHub',\n};\n\nconst S3_ENV_SNIPPET = `# Lens API asset storage (S3 or compatible)\nLENS_S3_BUCKET=your-bucket\nLENS_S3_REGION=us-east-1\nAWS_ACCESS_KEY_ID=AKIA...\nAWS_SECRET_ACCESS_KEY=...\n# Optional (R2 / MinIO):\n# LENS_S3_ENDPOINT=https://<account>.r2.cloudflarestorage.com\n# LENS_S3_FORCE_PATH_STYLE=true`;\n\nexport interface OnboardingWizardProps {\n /** Fired when the host clicks Finish on the final step. */\n onComplete?: (result: {\n project: Project;\n accessId: string;\n /** Only present when the wizard created the project this session — shown once, never re-fetchable. */\n accessSecret: string | null;\n }) => void;\n /**\n * Fired immediately after project creation (step 1), before the wizard\n * continues. Lets proxy-based hosts start forwarding the new project's\n * secret for the remaining wizard calls.\n */\n onProjectCreated?: (result: CreateProjectResponse) => void;\n className?: string;\n /**\n * Skip project creation and load the existing project instead. The\n * `accessSecret` cannot be shown again in this mode.\n */\n existingProject?: boolean;\n}\n\nfunction parseOrigins(raw: string): string[] {\n return raw\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n}\n\n/** The dashboard's own URL, for the OAuth callback to redirect back to. */\nfunction currentReturnUrl(): string | undefined {\n return typeof window !== 'undefined' ? window.location.href : undefined;\n}\n\nfunction providerLabel(raw: string): string {\n return (PROVIDER_NAME as Record<string, string>)[raw] ?? raw;\n}\n\n/** Shallow ordered array equality for origin lists. */\nfunction sameOrigins(a: string[], b: string[]): boolean {\n return a.length === b.length && a.every((v, i) => v === b[i]);\n}\n\n/**\n * Reads (and strips) the `lens_connected` / `lens_error` params the OAuth\n * callback appends when it lands back on the dashboard. Returns a one-shot\n * outcome so the caller can flash a note and refetch.\n */\nfunction consumeOAuthCallback(): { connected?: string; error?: string } | null {\n if (typeof window === 'undefined') return null;\n const params = new URLSearchParams(window.location.search);\n const connected = params.get('lens_connected');\n const error = params.get('lens_error');\n if (connected == null && error == null) return null;\n params.delete('lens_connected');\n params.delete('lens_error');\n try {\n const qs = params.toString();\n const url = window.location.pathname + (qs ? `?${qs}` : '') + window.location.hash;\n window.history.replaceState(window.history.state, '', url);\n } catch {\n // history unavailable (e.g. sandboxed) — the note still shows.\n }\n return { connected: connected ?? undefined, error: error ?? undefined };\n}\n\n/** Small clipboard button that swaps to a check for 2s after a successful copy. */\nfunction CopyButton({\n value,\n label = 'Copy',\n ghost = false,\n}: {\n value: string;\n label?: string;\n ghost?: boolean;\n}): React.JSX.Element {\n const [copied, setCopied] = useState(false);\n return (\n <button\n type=\"button\"\n className={clsx(\n 'lens-db__copy-btn',\n ghost && 'lens-db__copy-btn--ghost',\n copied && 'lens-db__copy-btn--done',\n )}\n aria-label={copied ? 'Copied' : label}\n onClick={() => {\n void navigator.clipboard?.writeText(value).then(\n () => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n },\n () => undefined,\n );\n }}\n >\n {copied ? <IconCheck size={14} /> : <IconCopy size={14} />}\n {copied ? 'Copied' : label}\n </button>\n );\n}\n\n/**\n * Guided, multi-step setup card for provisioning a Lens project: create the\n * project, pick the single issue destination, configure asset storage, then\n * surface the install snippets. Designed for internal admin dashboards — the\n * `accessSecret` lives only in memory and is displayed exactly once.\n */\nexport function OnboardingWizard(props: OnboardingWizardProps): React.JSX.Element {\n const api = useLensApi();\n const [step, setStep] = useState(0);\n\n // ----- Collected state (never lost between steps) -----\n const [name, setName] = useState('');\n const [origins, setOrigins] = useState('');\n const [dashboardUrl, setDashboardUrl] = useState('');\n const [project, setProject] = useState<Project | null>(null);\n const [accessId, setAccessId] = useState<string | null>(null);\n const [accessSecret, setAccessSecret] = useState<string | null>(null);\n\n // ----- Step 1 -----\n const [step1Busy, setStep1Busy] = useState(false);\n const [step1Error, setStep1Error] = useState<string | undefined>(undefined);\n const [loadingExisting, setLoadingExisting] = useState(Boolean(props.existingProject));\n\n // ----- Step 2 -----\n const [integrations, setIntegrations] = useState<Integration[] | null>(null);\n const [intBusy, setIntBusy] = useState<IntegrationProvider | null>(null);\n const [intLoadError, setIntLoadError] = useState<string | undefined>(undefined);\n const [intFlash, setIntFlash] = useState<IntegrationListFlash | null>(null);\n\n // ----- Step 3: storage is status-only. Credentials are configured via env\n // on the Lens API deployment, never through the UI. -----\n const [storage, setStorage] = useState<StorageStatus | null>(null);\n const [storageError, setStorageError] = useState<string | undefined>(undefined);\n\n // ----- Step 4 -----\n const [finishBusy, setFinishBusy] = useState(false);\n const [finishError, setFinishError] = useState<string | undefined>(undefined);\n\n // Load the existing project once, if requested.\n useEffect(() => {\n if (!props.existingProject) return;\n let active = true;\n setLoadingExisting(true);\n api\n .getProject()\n .then((p) => {\n if (!active) return;\n setProject(p);\n setAccessId(p.accessId);\n setName(p.name);\n setOrigins(p.allowedOrigins.join('\\n'));\n setDashboardUrl(p.dashboardUrl ?? '');\n setLoadingExisting(false);\n })\n .catch((err: unknown) => {\n if (!active) return;\n setStep1Error(err instanceof Error ? err.message : String(err));\n setLoadingExisting(false);\n });\n return () => {\n active = false;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // When the Destination step is shown, surface the OAuth callback outcome the\n // API redirected back with (once), then refresh the list.\n useEffect(() => {\n if (step !== 1) return;\n const outcome = consumeOAuthCallback();\n if (!outcome) return;\n if (outcome.connected) {\n setIntFlash({ kind: 'ok', message: `${providerLabel(outcome.connected)} connected` });\n api\n .listIntegrations()\n .then(setIntegrations)\n .catch(() => undefined);\n }\n if (outcome.error) setIntFlash({ kind: 'error', message: outcome.error });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [step]);\n\n // Load integrations the first time the Destination step is shown.\n useEffect(() => {\n if (step !== 1 || integrations !== null) return;\n let active = true;\n api\n .listIntegrations()\n .then((list) => active && setIntegrations(list))\n .catch((err: unknown) =>\n active ? setIntLoadError(err instanceof Error ? err.message : String(err)) : undefined,\n );\n return () => {\n active = false;\n };\n }, [step, integrations, api]);\n\n async function submitStep1(): Promise<void> {\n if (props.existingProject) {\n if (!project) return;\n if (!name.trim()) {\n setStep1Error('Project name is required.');\n return;\n }\n const nextOrigins = parseOrigins(origins);\n const nextDashboardUrl = dashboardUrl.trim() || null;\n const changed =\n name.trim() !== project.name ||\n !sameOrigins(nextOrigins, project.allowedOrigins) ||\n nextDashboardUrl !== (project.dashboardUrl ?? null);\n if (!changed) {\n setStep(1);\n return;\n }\n setStep1Busy(true);\n setStep1Error(undefined);\n try {\n const p = await api.updateProject({\n name: name.trim(),\n allowedOrigins: nextOrigins,\n dashboardUrl: nextDashboardUrl,\n });\n setProject(p);\n setName(p.name);\n setOrigins(p.allowedOrigins.join('\\n'));\n setDashboardUrl(p.dashboardUrl ?? '');\n setStep(1);\n } catch (err) {\n setStep1Error(err instanceof Error ? err.message : String(err));\n } finally {\n setStep1Busy(false);\n }\n return;\n }\n if (!name.trim()) {\n setStep1Error('Project name is required.');\n return;\n }\n setStep1Busy(true);\n setStep1Error(undefined);\n try {\n const res = await api.createProject({\n name: name.trim(),\n allowedOrigins: parseOrigins(origins),\n });\n setAccessId(res.accessId);\n setAccessSecret(res.accessSecret);\n props.onProjectCreated?.(res);\n // CreateProjectRequest has no dashboardUrl, so persist it in a follow-up\n // PATCH once the new project's secret is active (the x-lens-token /\n // onProjectCreated path authenticates it). Non-fatal on failure — the\n // project is already created.\n let created = res.project;\n const nextDashboardUrl = dashboardUrl.trim();\n if (nextDashboardUrl) {\n try {\n created = await api.updateProject({ dashboardUrl: nextDashboardUrl });\n setDashboardUrl(created.dashboardUrl ?? '');\n } catch {\n // Leave dashboardUrl unset on the project; the user can set it later\n // from Project settings.\n }\n }\n setProject(created);\n setStep(1);\n } catch (err) {\n setStep1Error(err instanceof Error ? err.message : String(err));\n } finally {\n setStep1Busy(false);\n }\n }\n\n async function runIntegration(\n provider: IntegrationProvider,\n fn: () => Promise<void>,\n ): Promise<void> {\n setIntBusy(provider);\n try {\n await fn();\n setIntegrations(await api.listIntegrations());\n } catch (err) {\n setIntFlash({ kind: 'error', message: err instanceof Error ? err.message : String(err) });\n } finally {\n setIntBusy(null);\n }\n }\n\n const connect = (provider: IntegrationProvider): Promise<void> =>\n runIntegration(provider, async () => {\n const { authorizeUrl } = await api.connectIntegration(provider, {\n returnUrl: currentReturnUrl(),\n });\n window.open(authorizeUrl, '_blank', 'noopener,noreferrer');\n });\n\n const completeDev = (provider: IntegrationProvider): Promise<void> =>\n runIntegration(provider, async () => {\n await api.completeIntegrationDev(provider);\n });\n\n const activate = (provider: IntegrationProvider): Promise<void> =>\n runIntegration(provider, async () => {\n await api.activateIntegration(provider);\n });\n\n const disconnect = (provider: IntegrationProvider): Promise<void> =>\n runIntegration(provider, async () => {\n await api.disconnectIntegration(provider);\n });\n\n // Kept off `runIntegration()` so the row can await the outcome: on error we\n // flash and rethrow so the config line drops its busy/check state.\n async function saveConfig(provider: IntegrationProvider, config: IntegrationConfig): Promise<void> {\n setIntBusy(provider);\n try {\n setIntegrations(await api.updateIntegrationConfig(provider, config));\n } catch (err) {\n setIntFlash({ kind: 'error', message: err instanceof Error ? err.message : String(err) });\n throw err;\n } finally {\n setIntBusy(null);\n }\n }\n\n // Fetch the effective storage status when the Asset storage step is shown.\n useEffect(() => {\n if (step !== 2 || storage !== null) return;\n let active = true;\n api\n .getStorageStatus()\n .then((s) => active && setStorage(s))\n .catch((err: unknown) =>\n active ? setStorageError(err instanceof Error ? err.message : String(err)) : undefined,\n );\n return () => {\n active = false;\n };\n }, [step, storage, api]);\n\n async function finish(): Promise<void> {\n setFinishBusy(true);\n setFinishError(undefined);\n try {\n const p = await api.updateProject({ onboarded: true });\n setProject(p);\n props.onComplete?.({ project: p, accessId: accessId ?? p.accessId, accessSecret });\n } catch (err) {\n setFinishError(err instanceof Error ? err.message : String(err));\n } finally {\n setFinishBusy(false);\n }\n }\n\n const activeProvider = integrations?.find((i) => i.active)?.provider ?? null;\n const idForSnippets = accessId ?? project?.accessId ?? 'YOUR_ACCESS_ID';\n const scriptSnippet = `<script>\n window.Lens=window.Lens||function(){(Lens.q=Lens.q||[]).push(arguments)};\n Lens('init', '${idForSnippets}');\n</script>\n<script async src=\"https://cdn.merittdev.com/lens/v1/lens.min.js\"></script>`;\n const reactSnippet = `import { LensProvider } from '@merittdev/horus-lens/react';\n\nexport function App() {\n return (\n <LensProvider accessId=\"${idForSnippets}\">\n {/* your app */}\n </LensProvider>\n );\n}`;\n\n return (\n <div className={clsx('lens-db', 'lens-db__wizard', props.className)}>\n {/* Stepper header */}\n <ol className=\"lens-db__stepper\">\n {STEPS.map((label, i) => (\n <li\n key={label}\n className={clsx(\n 'lens-db__step',\n i === step && 'lens-db__step--current',\n i < step && 'lens-db__step--done',\n )}\n >\n <span className=\"lens-db__step-dot\">\n {i < step ? <IconCheck size={14} /> : i + 1}\n </span>\n <span className=\"lens-db__step-label\">{label}</span>\n </li>\n ))}\n </ol>\n\n <div className=\"lens-db__wizard-body\">\n {/* ---------- Step 1: Project ---------- */}\n {step === 0 && (\n <div className=\"lens-db__step-panel\">\n <h3 className=\"lens-db__wizard-title\">Create your project</h3>\n <p className=\"lens-db__muted\">\n Name it and list the origins allowed to submit reports.\n </p>\n\n {loadingExisting ? (\n <p className=\"lens-db__muted\">Loading project…</p>\n ) : (\n <>\n <label className=\"lens-db__field\">\n <span className=\"lens-db__label\">Project name</span>\n <input\n className=\"lens-db__input\"\n type=\"text\"\n value={name}\n disabled={step1Busy}\n placeholder=\"Acme Web App\"\n onChange={(e) => setName(e.target.value)}\n />\n </label>\n\n <label className=\"lens-db__field\">\n <span className=\"lens-db__label\">Allowed origins</span>\n <textarea\n className=\"lens-db__input lens-db__textarea\"\n rows={4}\n value={origins}\n disabled={step1Busy}\n placeholder={'https://app.acme.com\\nhttps://admin.acme.com'}\n onChange={(e) => setOrigins(e.target.value)}\n />\n <span className=\"lens-db__hint\">One origin per line.</span>\n </label>\n\n <label className=\"lens-db__field\">\n <span className=\"lens-db__label\">Dashboard URL</span>\n <input\n className=\"lens-db__input\"\n type=\"url\"\n value={dashboardUrl}\n disabled={step1Busy}\n placeholder=\"https://admin.acme.com/lens\"\n onChange={(e) => setDashboardUrl(e.target.value)}\n />\n <span className=\"lens-db__hint\">Issues link reports back to this page.</span>\n </label>\n\n {props.existingProject && (\n <div className=\"lens-db__note\">\n Loaded from your existing project — edit the name or origins and Continue to\n save. The access secret was shown only when the project was created and can't be\n displayed again.\n </div>\n )}\n </>\n )}\n\n {step1Error && <div className=\"lens-db__error\">{step1Error}</div>}\n </div>\n )}\n\n {/* ---------- Step 2: Destination ---------- */}\n {step === 1 && (\n <div className=\"lens-db__step-panel\">\n <h3 className=\"lens-db__wizard-title\">Choose an issue destination</h3>\n <p className=\"lens-db__muted\">\n Reports create issues in exactly one connected tracker. You can skip this and pick a\n destination later.\n </p>\n\n <IntegrationList\n integrations={integrations ?? []}\n busy={intBusy}\n flash={intFlash}\n onFlashDismiss={() => setIntFlash(null)}\n loading={integrations === null && !intLoadError}\n loadError={intLoadError ?? null}\n onRetry={() => {\n setIntLoadError(undefined);\n setIntegrations(null);\n }}\n onConnect={(p) => void connect(p)}\n onActivate={(p) => void activate(p)}\n onDisconnect={(p) => void disconnect(p)}\n onCompleteDev={(p) => void completeDev(p)}\n onSaveConfig={saveConfig}\n loadOptions={(p) => api.getIntegrationOptions(p)}\n />\n\n <p className=\"lens-db__hint\">\n {activeProvider\n ? `Issues will route to ${providerLabel(activeProvider)}.`\n : 'No destination selected yet — issues will queue until you pick one.'}\n </p>\n </div>\n )}\n\n {/* ---------- Step 3: Asset storage (status only — env-configured) ---------- */}\n {step === 2 && (\n <div className=\"lens-db__step-panel\">\n <h3 className=\"lens-db__wizard-title\">Asset storage</h3>\n <p className=\"lens-db__muted\">\n Replays and screenshots upload straight to S3. Credentials are configured through\n environment variables on your Lens API deployment — never through this UI.\n </p>\n\n {!storage && !storageError && (\n <div className=\"lens-db__verify\">\n <span className=\"lens-db__spinner\" aria-hidden /> Checking storage…\n </div>\n )}\n\n {storage?.mode === 's3' && (\n <div className=\"lens-db__storage-ok\">\n <IconCheckCircle size={16} />\n <div>\n <div className=\"lens-db__storage-ok-title\">Asset storage configured</div>\n <div className=\"lens-db__muted\">\n <span className=\"lens-db__mono\">{storage.bucket}</span>\n {' · '}\n <span className=\"lens-db__mono\">{storage.region}</span>\n {storage.source === 'project'\n ? ' — project credentials'\n : ' — from the Lens API environment'}\n </div>\n </div>\n </div>\n )}\n\n {storage?.mode === 'local' && (\n <>\n <div\n className={\n storage.localAllowed ? 'lens-db__warn-banner' : 'lens-db__error'\n }\n >\n {storage.localAllowed\n ? 'Development mode: assets are stored on the API host disk. Configure S3 before going to production — report intake is rejected without it.'\n : 'No S3 bucket is configured. Report intake is disabled until asset storage is connected.'}\n </div>\n <p className=\"lens-db__label\">\n Set these on your Lens API deployment, then restart it:\n </p>\n <div className=\"lens-db__codewrap\">\n <pre className=\"lens-db__pre\">{highlightCode(S3_ENV_SNIPPET, 'env')}</pre>\n <CopyButton value={S3_ENV_SNIPPET} />\n </div>\n </>\n )}\n\n {storageError && <div className=\"lens-db__error\">{storageError}</div>}\n </div>\n )}\n\n {/* ---------- Step 4: Install ---------- */}\n {step === 3 && (\n <div className=\"lens-db__step-panel\">\n <h3 className=\"lens-db__wizard-title lens-db__wizard-title--ok\">\n <IconCheckCircle size={16} />\n Setup complete\n </h3>\n <p className=\"lens-db__muted\">\n Use these credentials to install the Lens widget in your app.\n </p>\n\n <div className=\"lens-db__cred\">\n <span className=\"lens-db__label\">Access ID</span>\n <div className=\"lens-db__cred-row\">\n <code className=\"lens-db__code-inline\">{idForSnippets}</code>\n <CopyButton value={idForSnippets} />\n </div>\n </div>\n\n {accessSecret ? (\n <div className=\"lens-db__warn-banner\">\n <span className=\"lens-db__warn-icon\">\n <IconAlertTriangle size={16} />\n </span>\n <div className=\"lens-db__warn-body\">\n <div className=\"lens-db__warn-title\">Store your access secret now</div>\n <p className=\"lens-db__warn-text\">\n This is the only time it will be shown. Save it in your server-side secret\n store — it will never be displayed again.\n </p>\n <div className=\"lens-db__cred-row\">\n <code className=\"lens-db__code-inline lens-db__code-inline--secret\">\n {accessSecret}\n </code>\n <CopyButton value={accessSecret} label=\"Copy secret\" />\n </div>\n </div>\n </div>\n ) : (\n <div className=\"lens-db__note\">\n The access secret isn't available here — it's shown only once, when the project is\n first created.\n </div>\n )}\n\n <div className=\"lens-db__snippet\">\n <div className=\"lens-db__snippet-head\">\n <span className=\"lens-db__label\">Script-tag loader</span>\n </div>\n <div className=\"lens-db__codeblock\">\n <pre className=\"lens-db__pre\">{highlightCode(scriptSnippet, 'markup')}</pre>\n <CopyButton value={scriptSnippet} ghost />\n </div>\n </div>\n\n <div className=\"lens-db__snippet\">\n <div className=\"lens-db__snippet-head\">\n <span className=\"lens-db__label\">React</span>\n </div>\n <div className=\"lens-db__codeblock\">\n <pre className=\"lens-db__pre\">{highlightCode(reactSnippet, 'markup')}</pre>\n <CopyButton value={reactSnippet} ghost />\n </div>\n </div>\n\n {finishError && <div className=\"lens-db__error\">{finishError}</div>}\n </div>\n )}\n </div>\n\n {/* Footer nav */}\n <div className=\"lens-db__wizard-footer\">\n <button\n type=\"button\"\n className=\"lens-db__btn lens-db__btn--ghost\"\n disabled={step === 0 || step1Busy || finishBusy}\n onClick={() => setStep((s) => Math.max(0, s - 1))}\n >\n Back\n </button>\n\n <div className=\"lens-db__wizard-footer-right\">\n {step === 0 && (\n <button\n type=\"button\"\n className=\"lens-db__btn lens-db__btn--primary\"\n disabled={step1Busy || loadingExisting || (props.existingProject && !project)}\n onClick={() => void submitStep1()}\n >\n {props.existingProject\n ? step1Busy\n ? 'Saving…'\n : 'Continue'\n : step1Busy\n ? 'Creating…'\n : 'Create project'}\n </button>\n )}\n\n {step === 1 && (\n <>\n <button\n type=\"button\"\n className=\"lens-db__btn lens-db__btn--ghost\"\n onClick={() => setStep(2)}\n >\n Skip\n </button>\n <button\n type=\"button\"\n className=\"lens-db__btn lens-db__btn--primary\"\n onClick={() => setStep(2)}\n >\n Next\n </button>\n </>\n )}\n\n {step === 2 && (\n <button\n type=\"button\"\n className=\"lens-db__btn lens-db__btn--primary\"\n disabled={!storage || (storage.mode === 'local' && !storage.localAllowed)}\n onClick={() => setStep(3)}\n >\n Continue\n </button>\n )}\n\n {step === 3 && (\n <button\n type=\"button\"\n className=\"lens-db__btn lens-db__btn--primary\"\n disabled={finishBusy}\n onClick={() => void finish()}\n >\n {finishBusy ? 'Finishing…' : 'Finish'}\n </button>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\nimport clsx from 'clsx';\nimport { useLensApi } from '../context.js';\nimport { useAsync } from '../useAsync.js';\nimport { IconCheck, IconCopy } from '../icons.js';\n\nexport interface ProjectSettingsProps {\n className?: string;\n}\n\nfunction parseOrigins(raw: string): string[] {\n return raw\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n}\n\n/**\n * Always-available editor for a project's name and allowed origins, plus a\n * read-only, copyable access id. Unlike the wizard this stands alone, so hosts\n * can expose an origins editor anywhere in their admin surface. Every save goes\n * through `updateProject`; the access secret is never shown here (it exists\n * only at creation time).\n */\nexport function ProjectSettings(props: ProjectSettingsProps): React.JSX.Element {\n const api = useLensApi();\n const { data, error, loading, reload } = useAsync(() => api.getProject(), []);\n\n const [name, setName] = useState('');\n const [origins, setOrigins] = useState('');\n const [dashboardUrl, setDashboardUrl] = useState('');\n const [saving, setSaving] = useState(false);\n const [saveError, setSaveError] = useState<string | undefined>(undefined);\n const [saved, setSaved] = useState(false);\n const [copied, setCopied] = useState(false);\n\n // Seed the editable fields from the loaded project (and after each save,\n // which returns the authoritative project).\n useEffect(() => {\n if (!data) return;\n setName(data.name);\n setOrigins(data.allowedOrigins.join('\\n'));\n setDashboardUrl(data.dashboardUrl ?? '');\n }, [data]);\n\n async function save(): Promise<void> {\n if (!name.trim()) {\n setSaveError('Project name is required.');\n return;\n }\n setSaving(true);\n setSaveError(undefined);\n setSaved(false);\n try {\n const p = await api.updateProject({\n name: name.trim(),\n allowedOrigins: parseOrigins(origins),\n dashboardUrl: dashboardUrl.trim() || null,\n });\n setName(p.name);\n setOrigins(p.allowedOrigins.join('\\n'));\n setDashboardUrl(p.dashboardUrl ?? '');\n setSaved(true);\n setTimeout(() => setSaved(false), 2000);\n } catch (err) {\n setSaveError(err instanceof Error ? err.message : String(err));\n } finally {\n setSaving(false);\n }\n }\n\n const accessId = data?.accessId ?? '';\n\n return (\n <div className={clsx('lens-db', 'lens-db__panel', props.className)}>\n <div>\n <h3 className=\"lens-db__wizard-title\">Project settings</h3>\n <p className=\"lens-db__muted\">Update the project name and the origins allowed to submit reports.</p>\n </div>\n\n {loading && !data && <p className=\"lens-db__muted\">Loading project…</p>}\n\n {error && !data && (\n <div className=\"lens-db__error\">\n Failed to load project: {error.message}{' '}\n <button type=\"button\" className=\"lens-db__link-btn\" onClick={reload}>\n Retry\n </button>\n </div>\n )}\n\n {data && (\n <>\n <label className=\"lens-db__field\">\n <span className=\"lens-db__label\">Project name</span>\n <input\n className=\"lens-db__input\"\n type=\"text\"\n value={name}\n disabled={saving}\n placeholder=\"Acme Web App\"\n onChange={(e) => setName(e.target.value)}\n />\n </label>\n\n <label className=\"lens-db__field\">\n <span className=\"lens-db__label\">Allowed origins</span>\n <textarea\n className=\"lens-db__input lens-db__textarea\"\n rows={4}\n value={origins}\n disabled={saving}\n placeholder={'https://app.acme.com\\nhttps://admin.acme.com'}\n onChange={(e) => setOrigins(e.target.value)}\n />\n <span className=\"lens-db__hint\">One origin per line.</span>\n </label>\n\n <label className=\"lens-db__field\">\n <span className=\"lens-db__label\">Dashboard URL</span>\n <input\n className=\"lens-db__input\"\n type=\"url\"\n value={dashboardUrl}\n disabled={saving}\n placeholder=\"https://admin.acme.com/lens\"\n onChange={(e) => setDashboardUrl(e.target.value)}\n />\n <span className=\"lens-db__hint\">Issues link reports back to this page.</span>\n </label>\n\n <div className=\"lens-db__field\">\n <span className=\"lens-db__label\">Access ID</span>\n <div className=\"lens-db__cred-row\">\n <code className=\"lens-db__code-inline\">{accessId}</code>\n <button\n type=\"button\"\n className={clsx('lens-db__copy-btn', copied && 'lens-db__copy-btn--done')}\n aria-label={copied ? 'Copied' : 'Copy access ID'}\n onClick={() => {\n void navigator.clipboard?.writeText(accessId).then(\n () => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n },\n () => undefined,\n );\n }}\n >\n {copied ? <IconCheck size={14} /> : <IconCopy size={14} />}\n {copied ? 'Copied' : 'Copy'}\n </button>\n </div>\n </div>\n\n {saveError && <div className=\"lens-db__error\">{saveError}</div>}\n\n <div className=\"lens-db__panel-actions\">\n <button\n type=\"button\"\n className=\"lens-db__btn lens-db__btn--primary\"\n disabled={saving}\n onClick={() => void save()}\n >\n {saving ? 'Saving…' : 'Save'}\n </button>\n {saved && (\n <span className=\"lens-db__flash lens-db__flash--ok\">\n <IconCheck size={14} />\n Saved\n </span>\n )}\n </div>\n </>\n )}\n </div>\n );\n}\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;"],"mappings":"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","names":["createContext","useContext","useEffect","useRef","useState","jsx","jsx","jsxs","useRef","useState","useCallback","useEffect","useState","useRef","jsx","jsxs","Fragment","useEffect","useState","useEffect","useState","Fragment","jsx","jsxs","useEffect","useState","Fragment","jsx","jsxs","useEffect","useState","Fragment","jsx","jsxs","config","clsx","r","useState","useCallback","useEffect","useRef","PROVIDER_NAME","currentReturnUrl","providerLabel","consumeOAuthCallback","createContext","CopyButton","useContext","parseOrigins"]}
|