@merittdev/horus-lens 0.5.2 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../react-native/src/client.ts","../../react-native/src/environment.ts","../../react-native/src/network.ts","../../react-native/src/visual-replay.ts","../../react-native/src/provider.tsx","../../react-native/src/panel.tsx","../../react-native/src/annotation-editor.tsx","../../react-native/src/icons.tsx"],"sourcesContent":["import { AppState } from \"react-native\";\nimport {\n DEFAULT_ENDPOINT,\n SDK_VERSION,\n RingBuffer,\n Transport,\n installConsole,\n} from \"@horus-lens/core/platform\";\nimport {\n InitiateReportResponseSchema,\n type AppContext,\n type ConsoleEntry,\n type ErrorEntry,\n type NetworkEntry,\n type FinalizeReportRequest,\n type ReportMetadata,\n type ReportTrigger,\n type Annotation,\n type TargetElement,\n} from \"@horus-lens/shared\";\nimport { collectNativeEnv, nativeDetails } from \"./environment.js\";\nimport { installFetch } from \"./network.js\";\nimport {\n NativeRecording,\n encodeVisualReplay,\n validateImage,\n imageUri,\n releaseImage,\n type NativeImage,\n type NativeFrame,\n type NativeScreenCapture,\n} from \"./visual-replay.js\";\n\nexport interface NativeCapture {\n metadata: ReportMetadata;\n console: ConsoleEntry[];\n network: NetworkEntry[];\n screenshot?: NativeImage;\n replay: NativeFrame[];\n}\n\nexport interface NativeLensConfig {\n accessId: string;\n /** HTTP(S) site origin already allowed by this Lens project in Horus Cloud. */\n origin: string;\n endpoint?: string;\n app?: AppContext;\n /** Console logs may contain personal data. Disabled unless explicitly enabled. */\n captureConsole?: boolean;\n captureNetwork?: boolean;\n /** Redact both uploaded assets and inline metadata, or return null to cancel. */\n beforeSend?: (capture: NativeCapture) => NativeCapture | null;\n /** Native host view capture; never invoked until the reporter requests it. */\n captureScreen?: NativeScreenCapture;\n}\n\nexport interface NativeReportInput {\n comment?: string;\n trigger?: ReportTrigger;\n include?: {\n console?: boolean;\n network?: boolean;\n errors?: boolean;\n screenshot?: boolean;\n replay?: boolean;\n };\n screenshot?: NativeImage;\n annotations?: Annotation[];\n target?: TargetElement;\n}\n\nlet activeClient: NativeLensClient | null = null;\n\nexport class NativeLensClient {\n private readonly origin: string;\n private transport!: Transport;\n private lifecycle = new AbortController();\n private readonly logs = new RingBuffer<ConsoleEntry>(200);\n private readonly requests = new RingBuffer<NetworkEntry>(100);\n private readonly errors = new RingBuffer<ErrorEntry>(30);\n private readonly breadcrumbs = new RingBuffer<{\n type: string;\n value: string;\n timestamp: number;\n }>(30);\n private teardowns: (() => void)[] = [];\n private started = false;\n private submitting = false;\n private retryCapture?: NativeCapture;\n private route = \"/\";\n private language?: string;\n private app: AppContext;\n private readonly recording?: NativeRecording;\n private readonly rawFetch: typeof fetch;\n\n constructor(private readonly config: NativeLensConfig) {\n if (!config.accessId.startsWith(\"lai_\"))\n throw new Error(\"[lens] A public lai_ access id is required\");\n const origin = new URL(config.origin);\n if (\n ![\"https:\", \"http:\"].includes(origin.protocol) ||\n !origin.host ||\n origin.username ||\n origin.password ||\n origin.pathname !== \"/\" ||\n origin.search ||\n origin.hash\n ) {\n throw new Error(\n \"[lens] origin must be an HTTP(S) site origin without a path\",\n );\n }\n this.origin = origin.origin;\n this.app = config.app ?? {};\n this.rawFetch = globalThis.fetch.bind(globalThis);\n if (config.captureScreen)\n this.recording = new NativeRecording(\n config.captureScreen,\n () => this.route,\n );\n }\n\n start(): void {\n if (this.started) return;\n if (activeClient)\n throw new Error(\n \"[lens] Only one native Lens client can capture at a time\",\n );\n this.lifecycle = new AbortController();\n this.transport = new Transport({\n accessId: this.config.accessId,\n endpoint: (this.config.endpoint ?? DEFAULT_ENDPOINT).replace(/\\/+$/, \"\"),\n origin: this.origin,\n fetch: this.rawFetch,\n signal: this.lifecycle.signal,\n requestTimeoutMs: 20000,\n });\n activeClient = this;\n try {\n if (this.config.captureConsole)\n this.teardowns.push(installConsole(this.logs, this.errors));\n if (this.config.captureNetwork !== false)\n this.teardowns.push(installFetch(this.requests));\n this.addBreadcrumb(\"app-state\", AppState.currentState ?? \"unknown\");\n const subscription = AppState.addEventListener(\"change\", (state) =>\n this.addBreadcrumb(\"app-state\", state),\n );\n this.teardowns.push(() => subscription.remove());\n this.started = true;\n } catch (error) {\n this.stop();\n throw error;\n }\n }\n\n stop(): void {\n this.lifecycle.abort();\n for (const teardown of this.teardowns.reverse()) teardown();\n this.teardowns = [];\n this.started = false;\n if (activeClient === this) activeClient = null;\n this.logs.clear();\n this.requests.clear();\n this.errors.clear();\n this.breadcrumbs.clear();\n this.recording?.discard();\n this.retryCapture = undefined;\n }\n\n async captureScreen(): Promise<NativeImage | null> {\n if (!this.started || !this.config.captureScreen) return null;\n const route = this.route;\n const signal = this.lifecycle.signal;\n let expired = false;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n let abort: () => void = () => {};\n const operation = this.config\n .captureScreen(\"screenshot\")\n .then((captured) => {\n const image = captured\n ? { ...captured, uri: imageUri(captured.uri) }\n : null;\n if (expired || signal.aborted || route !== this.route) {\n if (image) releaseImage(image.uri);\n return null;\n }\n return image;\n });\n let image: NativeImage | null;\n try {\n image = await Promise.race([\n operation,\n new Promise<never>((_resolve, reject) => {\n abort = () => reject(new Error(\"Capture session ended\"));\n signal.addEventListener(\"abort\", abort);\n if (signal.aborted) abort();\n timeout = setTimeout(\n () => reject(new Error(\"Screen capture timed out\")),\n 5000,\n );\n }),\n ]);\n } finally {\n expired = true;\n if (timeout) clearTimeout(timeout);\n signal.removeEventListener(\"abort\", abort);\n }\n if (\n signal.aborted ||\n !this.started ||\n activeClient !== this ||\n route !== this.route\n )\n return null;\n if (image) validateImage(image);\n return image;\n }\n\n startRecording(): void {\n if (!this.started || this.submitting || !this.recording)\n throw new Error(\"Screen recording is unavailable\");\n this.retryCapture = undefined;\n this.recording.start();\n }\n async stopRecording() {\n return this.recording?.stop() ?? [];\n }\n discardDraft(): void {\n this.retryCapture = undefined;\n this.recording?.discard();\n }\n discardRecording(): void {\n this.recording?.discard();\n if (this.retryCapture) this.retryCapture.replay = [];\n }\n getRecording() {\n const state = this.recording?.snapshot() ?? {\n active: false,\n frameCount: 0,\n durationMs: 0,\n error: undefined,\n };\n const frames = this.retryCapture?.replay;\n return frames?.length && !state.active && !state.frameCount\n ? {\n ...state,\n frameCount: frames.length,\n durationMs:\n frames[frames.length - 1]!.timestamp - frames[0]!.timestamp,\n }\n : state;\n }\n getContext() {\n return collectNativeEnv(this.origin, this.route, this.language);\n }\n\n setRoute(route: string, language?: string): void {\n const pathname = route.split(/[?#]/, 1)[0] ?? \"/\";\n const next =\n pathname.startsWith(\"/\") && !pathname.startsWith(\"//\") ? pathname : \"/\";\n if (next !== this.route) this.addBreadcrumb(\"navigation\", next);\n this.route = next;\n this.language = language;\n }\n\n setApp(app: Partial<AppContext>): void {\n this.app = {\n ...this.app,\n ...app,\n extra: { ...this.app.extra, ...app.extra },\n };\n }\n\n captureError(error: Error, componentStack?: string): void {\n if (!this.started) return;\n this.errors.push({\n message: error.message.slice(0, 2000),\n stack: [error.stack, componentStack]\n .filter(Boolean)\n .join(\"\\n\")\n .slice(0, 8000),\n source: \"react-boundary\",\n timestamp: Date.now(),\n });\n }\n\n private addBreadcrumb(type: string, value: string): void {\n this.breadcrumbs.push({\n type,\n value: value.slice(0, 300),\n timestamp: Date.now(),\n });\n }\n\n async submitReport(\n input: NativeReportInput = {},\n ): Promise<{ reportId: string }> {\n if (!this.started) throw new Error(\"[lens] Capture is disabled\");\n if (this.submitting)\n throw new Error(\"[lens] A report is already being submitted\");\n this.submitting = true;\n const transport = this.transport;\n const signal = this.lifecycle.signal;\n\n try {\n const include = input.include ?? {};\n const frames = await this.stopRecording();\n // A native redaction is burned into the screenshot. Discard earlier raw\n // recording frames so the redacted content cannot survive in replay bytes.\n const redacted = input.annotations?.some(\n (annotation) => annotation.kind === \"blur\",\n );\n let capture: NativeCapture = {\n console: include.console === false ? [] : this.logs.drain(),\n network: include.network === false ? [] : this.requests.drain(),\n screenshot:\n include.screenshot === false\n ? undefined\n : (input.screenshot ?? (await this.captureScreen()) ?? undefined),\n replay: include.replay === false || redacted ? [] : frames,\n metadata: {\n comment: input.comment?.slice(0, 2000),\n annotations: input.annotations?.slice(0, 100) ?? [],\n target: input.target,\n env: collectNativeEnv(this.origin, this.route, this.language),\n app: {\n ...this.app,\n extra: {\n ...this.app.extra,\n ...nativeDetails(),\n breadcrumbs: this.breadcrumbs.drain(),\n nativeReplay: {\n format: \"visual-frames\",\n frameCount:\n include.replay === false || redacted ? 0 : frames.length,\n sampledFramesPerSecond: 1,\n },\n },\n },\n errors:\n include.errors === false\n ? []\n : this.errors.drain().map((entry) => ({\n ...entry,\n message: entry.message.slice(0, 2000),\n stack: entry.stack?.slice(0, 8000),\n })),\n consoleTail: [],\n networkTail: [],\n trigger: input.trigger ?? \"api\",\n sdk: {\n name: \"@merittdev/horus-lens/react-native\",\n version: SDK_VERSION,\n },\n },\n };\n if (this.retryCapture) {\n const saved = this.retryCapture;\n capture = {\n ...capture,\n console: include.console === false ? [] : saved.console,\n network: include.network === false ? [] : saved.network,\n replay: include.replay === false || redacted ? [] : saved.replay,\n screenshot:\n include.screenshot === false\n ? undefined\n : (input.screenshot ?? saved.screenshot),\n metadata: {\n ...saved.metadata,\n comment: input.comment?.slice(0, 2000),\n annotations:\n input.annotations?.slice(0, 100) ?? saved.metadata.annotations,\n target: input.target,\n errors: include.errors === false ? [] : saved.metadata.errors,\n },\n };\n }\n // Reports consume the captured window, including data explicitly omitted\n // by the reporter. Never leak that window into a later report.\n this.logs.clear();\n this.requests.clear();\n this.errors.clear();\n this.breadcrumbs.clear();\n this.recording?.discard();\n try {\n if (this.config.beforeSend) {\n const redacted = this.config.beforeSend(capture);\n if (!redacted)\n throw new Error(\"[lens] Report cancelled by beforeSend\");\n capture = redacted;\n }\n if (signal.aborted) throw new Error(\"Capture session ended\");\n } catch (error) {\n this.retryCapture = undefined;\n throw error;\n }\n this.retryCapture = capture;\n capture.metadata.consoleTail = capture.console.slice(-50);\n capture.metadata.networkTail = capture.network.slice(-30);\n if (capture.metadata.app?.extra)\n capture.metadata.app.extra.nativeReplay = {\n format: \"visual-frames\",\n frameCount: capture.replay.length,\n sampledFramesPerSecond: 1,\n };\n const payloads: {\n kind: \"console\" | \"network\" | \"screenshot\" | \"replay\";\n contentType: string;\n blob: Blob;\n }[] = [\n ...(capture.console.length\n ? [{ kind: \"console\" as const, entries: capture.console }]\n : []),\n ...(capture.network.length\n ? [{ kind: \"network\" as const, entries: capture.network }]\n : []),\n ].map(({ kind, entries }) => ({\n kind,\n contentType: \"application/json\",\n blob: new Blob([JSON.stringify(entries)], { type: \"application/json\" }),\n }));\n if (capture.screenshot) {\n validateImage(capture.screenshot);\n const response = await this.rawFetch(capture.screenshot.uri, {\n signal,\n });\n if (!response.ok)\n throw new Error(\"Could not read the captured screenshot\");\n const blob = await response.blob();\n if (blob.size > 8_000_000)\n throw new Error(\"Captured screenshot is too large\");\n payloads.push({\n kind: \"screenshot\",\n contentType:\n capture.screenshot.uri.startsWith(\"data:image/png;\") ||\n /\\.png$/i.test(capture.screenshot.uri)\n ? \"image/png\"\n : \"image/jpeg\",\n blob,\n });\n }\n if (capture.replay.length) {\n payloads.push({\n kind: \"replay\",\n contentType: \"application/json\",\n blob: new Blob(\n [JSON.stringify(encodeVisualReplay(capture.replay, this.origin))],\n { type: \"application/json\" },\n ),\n });\n }\n if (signal.aborted) throw new Error(\"Capture session ended\");\n const initiated = InitiateReportResponseSchema.parse(\n await transport.initiate(\n payloads.map(({ kind, contentType }) => ({ kind, contentType })),\n ),\n );\n const uploaded: FinalizeReportRequest[\"uploadedAssets\"] = [];\n for (const payload of payloads) {\n const upload = initiated.uploads.find(\n (item) => item.kind === payload.kind,\n );\n if (!upload)\n throw new Error(`[lens] Missing upload slot for ${payload.kind}`);\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 20000);\n try {\n await transport.uploadAsset(upload, payload.blob, controller.signal);\n } finally {\n clearTimeout(timeout);\n }\n uploaded.push({\n kind: payload.kind,\n key: upload.key,\n byteSize: payload.blob.size,\n });\n }\n await transport.finalize(initiated.reportId, capture.metadata, uploaded);\n this.retryCapture = undefined;\n return { reportId: initiated.reportId };\n } finally {\n this.submitting = false;\n }\n }\n}\n","import {\n Appearance,\n Dimensions,\n I18nManager,\n PixelRatio,\n Platform,\n} from \"react-native\";\nimport type { EnvContext } from \"@horus-lens/shared\";\n\nexport function collectNativeEnv(\n origin: string,\n route: string,\n language?: string,\n): EnvContext {\n const viewport = Dimensions.get(\"window\");\n const screen = Dimensions.get(\"screen\");\n const locale = Intl.DateTimeFormat().resolvedOptions();\n const theme = Appearance.getColorScheme();\n return {\n url: `${origin}${route}`,\n route,\n userAgent: `ReactNative (${Platform.OS} ${Platform.Version})`,\n os: `${Platform.OS} ${Platform.Version}`,\n device: \"mobile\",\n viewport: { width: viewport.width, height: viewport.height },\n screen: { width: screen.width, height: screen.height },\n devicePixelRatio: PixelRatio.get(),\n language: language ?? locale.locale,\n timezone: locale.timeZone,\n ...(theme === \"light\" || theme === \"dark\" ? { theme } : {}),\n capturedAt: Date.now(),\n };\n}\n\nexport function nativeDetails() {\n return {\n framework: \"react-native\",\n platform: Platform.OS,\n platformVersion: String(Platform.Version),\n rtl: I18nManager.isRTL,\n };\n}\n","import type { NetworkEntry } from \"@horus-lens/shared\";\nimport type { RingBuffer } from \"@horus-lens/core/platform\";\n\n/** Never retain URL credentials, query parameters or fragments. */\nexport function sanitizeUrl(value: string): string {\n const withoutQuery = value.split(/[?#]/, 1)[0] ?? \"\";\n // Avoid native URL parser differences; user-info exists only in the authority.\n return withoutQuery.replace(/^((?:[a-z][a-z\\d+.-]*:)?\\/\\/)[^/]*@/i, \"$1\");\n}\n\nexport function installFetch(buffer: RingBuffer<NetworkEntry>): () => void {\n const original = globalThis.fetch;\n const dispatch = original.bind(globalThis);\n let active = true;\n const wrapped: typeof fetch = async (input, init) => {\n // Capture must never affect request dispatch, even for unusual inputs.\n let url = \"\";\n let method = \"GET\";\n try {\n url = sanitizeUrl(\n typeof input === \"string\"\n ? input\n : \"url\" in input\n ? input.url\n : input.href,\n );\n method = (\n init?.method ??\n (typeof input === \"object\" && \"method\" in input ? input.method : \"GET\")\n ).toUpperCase();\n } catch {\n /* Best-effort metadata only. */\n }\n const startedAt = Date.now();\n const entry: NetworkEntry = {\n method,\n url,\n startedAt,\n requestType: \"fetch\",\n status: null,\n ok: null,\n durationMs: null,\n };\n try {\n const response = await dispatch(input, init);\n entry.status = response.status;\n entry.ok = response.ok;\n return response;\n } catch (error) {\n // Native fetch errors can embed sensitive URLs; keep a generic marker.\n entry.error = \"Network request failed\";\n throw error;\n } finally {\n entry.durationMs = Math.max(0, Date.now() - startedAt);\n if (active) buffer.push(entry);\n }\n };\n globalThis.fetch = wrapped;\n return () => {\n active = false;\n if (globalThis.fetch === wrapped) globalThis.fetch = original;\n };\n}\n","import { AppState, Platform } from \"react-native\";\nimport { releaseCapture } from \"react-native-view-shot\";\nimport type { eventWithTime, serializedNodeWithId } from \"@rrweb/types\";\n\nexport interface NativeImage {\n /** PNG/JPEG data URI or a native screenshot temporary file URI. */\n uri: string;\n width: number;\n height: number;\n}\nexport type NativeScreenCapture = (\n purpose: \"screenshot\" | \"replay\",\n) => Promise<NativeImage | null>;\nexport interface NativeFrame extends NativeImage {\n timestamp: number;\n route: string;\n}\n\n/** view-shot uses bare paths on iOS and file URIs on Android. */\nexport function imageUri(uri: string): string {\n return uri.startsWith(\"/\") ? `file://${uri}` : uri;\n}\nexport function releaseImage(uri: string): void {\n if (!uri.startsWith(\"file:\")) return;\n releaseCapture(Platform.OS === \"ios\" ? uri.replace(/^file:\\/\\//, \"\") : uri);\n}\n\nexport function validateImage(image: NativeImage, dataOnly = false): void {\n if (\n (!/^data:image\\/(?:png|jpeg);base64,[A-Za-z0-9+/=]+$/.test(image.uri) &&\n (dataOnly || !/^file:\\/\\/\\/[^?#]+\\.(?:png|jpe?g)$/i.test(image.uri))) ||\n image.uri.length > 8_000_000 ||\n !Number.isFinite(image.width) ||\n !Number.isFinite(image.height) ||\n image.width <= 0 ||\n image.height <= 0\n ) {\n throw new Error(\"Invalid captured image\");\n }\n}\n\n/** Explicit, bounded recording. Never starts with ordinary capture collectors. */\nexport class NativeRecording {\n private frames: NativeFrame[] = [];\n private timer?: ReturnType<typeof setInterval>;\n private pending: Promise<void> | null = null;\n private generation = 0;\n private active = false;\n private startedAt = 0;\n private bytes = 0;\n private failure?: string;\n\n constructor(\n private capture: NativeScreenCapture,\n private route: () => string,\n ) {}\n\n snapshot() {\n return {\n active: this.active,\n frameCount: this.frames.length,\n durationMs: this.active\n ? Date.now() - this.startedAt\n : this.frames.length > 1\n ? this.frames[this.frames.length - 1]!.timestamp -\n this.frames[0]!.timestamp\n : 0,\n error: this.failure,\n };\n }\n\n start(): void {\n this.discard();\n this.active = true;\n this.startedAt = Date.now();\n void this.tick();\n this.timer = setInterval(() => {\n void this.tick();\n }, 1000);\n }\n\n private halt(): void {\n this.active = false;\n if (this.timer) clearInterval(this.timer);\n this.timer = undefined;\n }\n\n private async tick(): Promise<void> {\n if (!this.active) return;\n if (Date.now() - this.startedAt >= 30_000 || this.frames.length >= 30) {\n this.halt();\n this.generation++;\n return;\n }\n if (this.pending) return;\n if (AppState.currentState !== \"active\") {\n this.halt();\n return;\n }\n const generation = this.generation;\n const timestamp = Date.now();\n const route = this.route();\n const pending = (async () => {\n try {\n const image = await this.capture(\"replay\");\n if (generation !== this.generation) return;\n // A host can block sensitive screens; stop rather than repeat a stale frame.\n if (\n !image ||\n route !== this.route() ||\n AppState.currentState !== \"active\"\n ) {\n this.halt();\n return;\n }\n validateImage(image, true);\n if (this.bytes + image.uri.length > 6_000_000) {\n this.halt();\n return;\n }\n this.frames.push({ ...image, timestamp, route });\n this.bytes += image.uri.length;\n } catch {\n if (generation !== this.generation) return;\n this.failure = \"Could not capture the screen recording.\";\n this.halt();\n }\n })();\n this.pending = pending;\n await pending;\n if (this.pending === pending) this.pending = null;\n }\n\n async stop(): Promise<NativeFrame[]> {\n this.halt();\n if (this.pending) {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n await Promise.race([\n this.pending,\n new Promise<void>((resolve) => {\n timeout = setTimeout(() => {\n this.generation++;\n this.failure = \"Screen capture did not finish in time.\";\n resolve();\n }, 5000);\n }),\n ]);\n if (timeout) clearTimeout(timeout);\n }\n return this.frames.map((frame) => ({ ...frame }));\n }\n\n discard(): void {\n this.halt();\n this.generation++;\n this.frames = [];\n this.bytes = 0;\n this.failure = undefined;\n // Keep the native capture lease until it settles; a new generation cannot overlap it.\n }\n}\n\n/** Native visual frames encoded for the existing sandboxed Cloud player.\n * The serialized document is a presentation surface, not captured app DOM.\n */\nexport function encodeVisualReplay(\n frames: NativeFrame[],\n origin: string,\n): unknown[] {\n if (!frames.length) return [];\n for (const frame of frames) validateImage(frame, true);\n const first = frames[0]!;\n const element = (\n id: number,\n tagName: string,\n attributes: Record<string, string>,\n childNodes: serializedNodeWithId[] = [],\n ): serializedNodeWithId => ({ id, type: 2, tagName, attributes, childNodes });\n const node: serializedNodeWithId = {\n type: 0,\n id: 1,\n childNodes: [\n { type: 1, id: 2, name: \"html\", publicId: \"\", systemId: \"\" },\n element(3, \"html\", {}, [\n element(4, \"head\", {}, [\n element(5, \"style\", {}, [\n {\n type: 3,\n id: 6,\n textContent:\n \"html,body{margin:0;width:100%;height:100%;overflow:hidden;background:#fff}img{display:block;width:100%;height:100%;object-fit:contain}\",\n },\n ]),\n ]),\n element(7, \"body\", {}, [\n element(8, \"img\", { src: first.uri, alt: \"Native screen recording\" }),\n ]),\n ]),\n ],\n };\n const events: eventWithTime[] = [\n {\n type: 4,\n timestamp: first.timestamp,\n data: {\n href: origin + first.route,\n width: first.width,\n height: first.height,\n },\n },\n {\n type: 2,\n timestamp: first.timestamp,\n data: { node, initialOffset: { top: 0, left: 0 } },\n },\n ];\n for (const frame of frames.slice(1)) {\n events.push({\n type: 3,\n timestamp: frame.timestamp,\n data: {\n source: 0,\n texts: [],\n removes: [],\n adds: [],\n attributes: [{ id: 8, attributes: { src: frame.uri } }],\n },\n });\n }\n // A single-frame capture still has a useful, finite playback duration.\n events.push({\n type: 5,\n timestamp: Math.max(\n first.timestamp + 1000,\n frames[frames.length - 1]!.timestamp + 1000,\n ),\n data: { tag: \"native-recording-end\", payload: { frames: frames.length } },\n });\n return events;\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport {\n ActivityIndicator,\n I18nManager,\n PanResponder,\n Pressable,\n Text,\n View,\n useWindowDimensions,\n} from \"react-native\";\nimport type { Annotation, AppContext, TargetElement } from \"@horus-lens/shared\";\nimport {\n NativeLensClient,\n type NativeLensConfig,\n type NativeReportInput,\n} from \"./client.js\";\nimport { ReportPanel, styles } from \"./panel.js\";\nimport { LensIcon } from \"./icons.js\";\nimport type { AnnotationResult } from \"./annotation-editor.js\";\nimport { imageUri, releaseImage, type NativeImage } from \"./visual-replay.js\";\n\nexport interface LensProps extends NativeLensConfig {\n enabled?: boolean;\n route?: string;\n language?: string;\n showButton?: boolean;\n children?: ReactNode;\n}\ninterface LensContextValue {\n client: NativeLensClient | null;\n open: () => void;\n close: () => void;\n}\nconst LensContext = createContext<LensContextValue>({\n client: null,\n open: () => {},\n close: () => {},\n});\n\nexport function Lens(props: LensProps) {\n const [client, setClient] = useState<NativeLensClient | null>(null);\n const [visible, setVisible] = useState(false);\n const [opening, setOpening] = useState(false);\n const [screenshot, setScreenshot] = useState<NativeImage | null>(null);\n const [baseScreenshot, setBaseScreenshot] = useState<NativeImage | null>(\n null,\n );\n const [crop, setCrop] = useState<AnnotationResult[\"crop\"]>(null);\n const ownedImages = useRef(new Set<string>());\n const releaseImages = useCallback(() => {\n for (const uri of ownedImages.current) releaseImage(uri);\n ownedImages.current.clear();\n }, []);\n const [annotations, setAnnotations] = useState<Annotation[]>([]);\n const [target, setTarget] = useState<TargetElement | undefined>();\n const [recording, setRecording] = useState({\n active: false,\n frameCount: 0,\n durationMs: 0,\n error: undefined as string | undefined,\n });\n const beforeSend = useRef(props.beforeSend),\n captureScreen = useRef(props.captureScreen);\n beforeSend.current = props.beforeSend;\n captureScreen.current = props.captureScreen;\n const openGeneration = useRef(0);\n const openingRef = useRef(false);\n const stopping = useRef(false);\n const draftRoute = useRef(props.route ?? \"/\");\n const hasScreenCapture = !!props.captureScreen;\n const window = useWindowDimensions();\n const windowRef = useRef(window);\n windowRef.current = window;\n const positionRef = useRef({ x: 0, y: 0 });\n const dragStart = useRef({ x: 0, y: 0 });\n const [position, setPosition] = useState({ x: 0, y: 0 });\n const openAction = useRef(() => {});\n const dragPoint = useRef({ x: 0, y: 0 });\n const drag = useMemo(() => {\n const move = (pageX: number, pageY: number) => {\n const { width, height } = windowRef.current;\n const baseX = I18nManager.isRTL ? 16 : width - 64;\n const dx = pageX - dragPoint.current.x,\n dy = pageY - dragPoint.current.y;\n const next = {\n x: Math.max(\n 16 - baseX,\n Math.min(width - 64 - baseX, dragStart.current.x + dx),\n ),\n y: Math.max(\n 48 - (height - 130),\n Math.min(34, dragStart.current.y + dy),\n ),\n };\n positionRef.current = next;\n setPosition(next);\n return Math.abs(dx) + Math.abs(dy);\n };\n return PanResponder.create({\n onStartShouldSetPanResponder: () => !openingRef.current,\n onPanResponderGrant: (event) => {\n dragStart.current = positionRef.current;\n dragPoint.current = {\n x: event.nativeEvent.pageX,\n y: event.nativeEvent.pageY,\n };\n },\n onPanResponderMove: (event) => {\n move(event.nativeEvent.pageX, event.nativeEvent.pageY);\n },\n onPanResponderRelease: (event) => {\n const distance = move(event.nativeEvent.pageX, event.nativeEvent.pageY);\n if (distance <= 8) openAction.current();\n },\n });\n }, []);\n\n useEffect(() => {\n openGeneration.current++;\n openingRef.current = false;\n releaseImages();\n setVisible(false);\n setOpening(false);\n setScreenshot(null);\n setBaseScreenshot(null);\n setCrop(null);\n setAnnotations([]);\n setTarget(undefined);\n if (!props.enabled) {\n setClient(null);\n return;\n }\n let disposed = false;\n const instance = new NativeLensClient({\n accessId: props.accessId,\n origin: props.origin,\n endpoint: props.endpoint,\n captureConsole: props.captureConsole,\n captureNetwork: props.captureNetwork,\n beforeSend: (capture) =>\n beforeSend.current ? beforeSend.current(capture) : capture,\n captureScreen: hasScreenCapture\n ? async (purpose) => {\n const captured = (await captureScreen.current?.(purpose)) ?? null;\n const image = captured\n ? { ...captured, uri: imageUri(captured.uri) }\n : null;\n if (disposed) {\n if (image?.uri.startsWith(\"file:\"))\n releaseImage(imageUri(image.uri));\n return null;\n }\n if (image?.uri.startsWith(\"file:\"))\n ownedImages.current.add(image.uri);\n return image;\n }\n : undefined,\n });\n instance.start();\n setClient(instance);\n return () => {\n openGeneration.current++;\n disposed = true;\n instance.stop();\n releaseImages();\n };\n }, [\n props.enabled,\n props.accessId,\n props.origin,\n props.endpoint,\n props.captureConsole,\n props.captureNetwork,\n hasScreenCapture,\n releaseImages,\n ]);\n useEffect(() => {\n const route = props.route ?? \"/\";\n if (route !== draftRoute.current && !client?.getRecording().active) {\n releaseImages();\n setScreenshot(null);\n setBaseScreenshot(null);\n setCrop(null);\n setAnnotations([]);\n setTarget(undefined);\n client?.discardDraft();\n }\n draftRoute.current = route;\n client?.setRoute(route, props.language);\n }, [client, props.route, props.language, releaseImages]);\n useEffect(() => {\n if (props.app) client?.setApp(props.app);\n }, [client, props.app]);\n useEffect(() => {\n if (!client) return;\n let wasActive = false;\n const timer = setInterval(() => {\n const state = client.getRecording();\n if (state.active || wasActive) setRecording(state);\n if (wasActive && !state.active && !stopping.current) setVisible(true);\n wasActive = state.active;\n }, 250);\n return () => clearInterval(timer);\n }, [client]);\n\n const close = useCallback(() => {\n openGeneration.current++;\n openingRef.current = false;\n setOpening(false);\n setVisible(false);\n }, []);\n const open = useCallback(() => {\n if (!client || openingRef.current || client.getRecording().active) return;\n openingRef.current = true;\n const generation = ++openGeneration.current;\n setOpening(true);\n void (async () => {\n let image: NativeImage | null = null;\n try {\n if (!baseScreenshot) image = await client.captureScreen();\n } catch (error) {\n console.warn(\n \"[issue capture] Screenshot unavailable\",\n error instanceof Error ? error.message : String(error),\n );\n /* Reports still work without a screenshot. */\n }\n if (generation !== openGeneration.current) return;\n if (!baseScreenshot) {\n setBaseScreenshot(image);\n setScreenshot(image);\n }\n openingRef.current = false;\n setOpening(false);\n setRecording(client.getRecording());\n setVisible(true);\n })();\n }, [baseScreenshot, client]);\n useEffect(() => {\n openAction.current = open;\n }, [open]);\n const context = useMemo(\n () => ({ client, open, close }),\n [client, open, close],\n );\n const active = props.enabled && client;\n const stop = () => {\n if (!client || stopping.current) return;\n stopping.current = true;\n void client\n .stopRecording()\n .then(() => {\n setRecording(client.getRecording());\n setVisible(true);\n })\n .finally(() => {\n stopping.current = false;\n });\n };\n const clearDraft = () => {\n releaseImages();\n setScreenshot(null);\n setBaseScreenshot(null);\n setCrop(null);\n setAnnotations([]);\n setTarget(undefined);\n setRecording(client?.getRecording() ?? recording);\n };\n\n return (\n <LensContext.Provider value={context}>\n {props.children}\n {active && (\n <>\n {props.showButton !== false &&\n (recording.active ? (\n <View style={styles.recording}>\n <Text style={styles.buttonText}>\n ● Recording {Math.floor(recording.durationMs / 1000)}s\n </Text>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Stop recording\"\n onPress={stop}\n >\n <Text style={styles.buttonText}>Stop</Text>\n </Pressable>\n </View>\n ) : (\n <View\n style={[\n styles.launcher,\n {\n transform: [\n { translateX: position.x },\n { translateY: position.y },\n ],\n },\n ]}\n accessible\n accessibilityRole=\"button\"\n accessibilityLabel=\"Report an issue\"\n accessibilityHint=\"Drag to move\"\n accessibilityState={{ busy: opening }}\n onAccessibilityTap={open}\n {...drag.panHandlers}\n >\n <View\n style={{\n width: 48,\n height: 48,\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {opening ? <ActivityIndicator color=\"#fff\" /> : <LensIcon />}\n </View>\n </View>\n ))}\n <ReportPanel\n key={`${props.accessId}:${props.origin}:${props.endpoint ?? \"\"}`}\n client={client}\n visible={visible}\n close={close}\n screenshot={screenshot}\n baseScreenshot={baseScreenshot}\n crop={crop}\n annotations={annotations}\n target={target}\n updateScreenshot={(result) => {\n if (result.image.uri.startsWith(\"file:\"))\n ownedImages.current.add(result.image.uri);\n if (\n screenshot?.uri.startsWith(\"file:\") &&\n screenshot.uri !== baseScreenshot?.uri &&\n screenshot.uri !== result.image.uri\n ) {\n releaseImage(screenshot.uri);\n ownedImages.current.delete(screenshot.uri);\n }\n setCrop(result.crop);\n setScreenshot(result.image);\n setAnnotations(result.annotations);\n setTarget(result.target);\n }}\n record={() => {\n client.startRecording();\n setRecording(client.getRecording());\n setVisible(false);\n }}\n changed={() => setRecording(client.getRecording())}\n onSubmitted={clearDraft}\n />\n </>\n )}\n </LensContext.Provider>\n );\n}\n\nexport const LensProvider = Lens;\nexport function useLens() {\n const { client, open, close } = useContext(LensContext);\n return {\n active: client !== null,\n open: () => {\n if (client) open();\n },\n close,\n identify: (user: NonNullable<AppContext[\"user\"]>) =>\n client?.setApp({ user }),\n setApp: (app: Partial<AppContext>) => client?.setApp(app),\n captureError: (error: Error, componentStack?: string) =>\n client?.captureError(error, componentStack),\n record: () => client?.startRecording(),\n stopRecording: () => client?.stopRecording() ?? Promise.resolve([]),\n report: async (input?: NativeReportInput) =>\n client\n ? client.submitReport({ ...input, trigger: input?.trigger ?? \"api\" })\n : null,\n };\n}\n","import { useEffect, useState } from \"react\";\nimport {\n ActivityIndicator,\n Image,\n KeyboardAvoidingView,\n Modal,\n Platform,\n Pressable,\n ScrollView,\n Share,\n StyleSheet,\n Text,\n TextInput,\n View,\n} from \"react-native\";\nimport type { Annotation, TargetElement } from \"@horus-lens/shared\";\nimport type { NativeLensClient } from \"./client.js\";\nimport {\n AnnotationEditor,\n type AnnotationResult,\n} from \"./annotation-editor.js\";\nimport type { NativeImage } from \"./visual-replay.js\";\n\ntype Include = Record<\n \"screenshot\" | \"replay\" | \"console\" | \"network\" | \"errors\",\n boolean\n>;\n\nexport function ReportPanel({\n client,\n visible,\n close,\n screenshot,\n baseScreenshot,\n crop,\n annotations,\n target,\n updateScreenshot,\n record,\n changed,\n onSubmitted,\n}: {\n client: NativeLensClient;\n visible: boolean;\n close: () => void;\n screenshot: NativeImage | null;\n baseScreenshot: NativeImage | null;\n crop?: AnnotationResult[\"crop\"];\n annotations: Annotation[];\n target?: TargetElement;\n updateScreenshot: (result: AnnotationResult) => void;\n record: () => void;\n changed: () => void;\n onSubmitted: () => void;\n}) {\n const [comment, setComment] = useState(\"\");\n const [pending, setPending] = useState(false);\n const [message, setMessage] = useState(\"\");\n const [reportId, setReportId] = useState(\"\");\n const [editing, setEditing] = useState(false);\n const [include, setInclude] = useState<Include>({\n screenshot: true,\n replay: true,\n console: true,\n network: true,\n errors: true,\n });\n useEffect(() => {\n if (!visible) setEditing(false);\n else setReportId(\"\");\n }, [visible]);\n const env = client.getContext();\n const recording = client.getRecording();\n const redacted = annotations.some((a) => a.kind === \"blur\");\n\n async function submit() {\n if ((!comment.trim() && !screenshot && !recording.frameCount) || pending)\n return;\n setPending(true);\n setMessage(\"\");\n try {\n const result = await client.submitReport({\n comment: comment.trim(),\n trigger: \"user\",\n include,\n screenshot: screenshot ?? undefined,\n annotations,\n target,\n });\n setReportId(result.reportId);\n setComment(\"\");\n onSubmitted();\n } catch {\n setMessage(\n \"Could not submit the report. Check your connection and project settings, then retry.\",\n );\n } finally {\n setPending(false);\n }\n }\n\n return (\n <Modal\n visible={visible}\n animationType=\"slide\"\n presentationStyle=\"pageSheet\"\n onRequestClose={close}\n >\n {editing && baseScreenshot ? (\n <AnnotationEditor\n image={baseScreenshot}\n initial={annotations}\n initialTarget={target}\n initialCrop={crop}\n onDone={(result) => {\n updateScreenshot(result);\n setEditing(false);\n }}\n onCancel={() => setEditing(false)}\n />\n ) : (\n <KeyboardAvoidingView\n style={styles.page}\n behavior={Platform.OS === \"ios\" ? \"padding\" : undefined}\n >\n <ScrollView\n contentContainerStyle={styles.content}\n keyboardShouldPersistTaps=\"handled\"\n >\n <View style={styles.header}>\n <Text accessibilityRole=\"header\" style={styles.title}>\n Report an issue\n </Text>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Close report panel\"\n onPress={close}\n hitSlop={12}\n >\n <Text style={styles.link}>Close</Text>\n </Pressable>\n </View>\n {reportId ? (\n <View style={styles.success}>\n <Text style={styles.successMark}>✓</Text>\n <Text style={styles.title}>Report submitted</Text>\n <Text style={styles.description}>\n The team can see the full context.\n </Text>\n <Text selectable style={styles.reportId}>\n {reportId}\n </Text>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Share report ID\"\n style={[styles.secondary, styles.successAction]}\n onPress={() => {\n void Share.share({ message: reportId });\n }}\n >\n <Text style={styles.link}>Share report ID</Text>\n </Pressable>\n <Pressable\n accessibilityRole=\"button\"\n style={[styles.secondary, styles.successAction]}\n onPress={() => {\n setReportId(\"\");\n close();\n }}\n >\n <Text style={styles.link}>Done</Text>\n </Pressable>\n </View>\n ) : (\n <>\n <TextInput\n accessibilityLabel=\"Issue description\"\n placeholder=\"What's wrong? Describe the issue…\"\n multiline\n maxLength={2000}\n editable={!pending}\n value={comment}\n onChangeText={(value) => {\n setComment(value);\n setMessage(\"\");\n }}\n style={styles.input}\n textAlignVertical=\"top\"\n />\n <Text style={styles.context}>\n {env.route} · {env.os} · {env.viewport.width}×\n {env.viewport.height}\n </Text>\n {screenshot && (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Annotate captured screenshot\"\n disabled={pending}\n onPress={() => setEditing(true)}\n style={styles.preview}\n >\n <Image\n source={{ uri: screenshot.uri }}\n style={[\n styles.previewImage,\n {\n width: Math.min(\n 144,\n (160 * screenshot.width) / screenshot.height,\n ),\n },\n ]}\n resizeMode=\"contain\"\n />\n <View style={styles.previewDetails}>\n <Text style={styles.previewTitle}>Screenshot</Text>\n <Text style={styles.previewLabel}>Tap to annotate</Text>\n </View>\n </Pressable>\n )}\n <View style={styles.chips}>\n {!!annotations.length && (\n <Text style={styles.chip}>\n {annotations.length} annotation\n {annotations.length === 1 ? \"\" : \"s\"}\n </Text>\n )}\n {target && (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Remove target region\"\n disabled={pending}\n onPress={() => {\n if (screenshot)\n updateScreenshot({\n image: screenshot,\n annotations,\n crop,\n });\n }}\n >\n <Text style={styles.chip}>Target region ×</Text>\n </Pressable>\n )}\n {!!recording.frameCount && (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Discard recording\"\n disabled={pending}\n onPress={() => {\n client.discardRecording();\n changed();\n }}\n >\n <Text style={styles.chip}>\n Recording · {Math.round(recording.durationMs / 1000)}s ·{\" \"}\n {recording.frameCount} frames ×\n </Text>\n </Pressable>\n )}\n </View>\n {redacted && !!recording.frameCount && (\n <Text style={styles.description}>\n Earlier recording frames will be excluded because the\n screenshot was redacted.\n </Text>\n )}\n {!!recording.error && (\n <Text accessibilityRole=\"alert\" style={styles.description}>\n {recording.error}\n </Text>\n )}\n <View style={styles.chips}>\n {(\n [\n \"screenshot\",\n \"replay\",\n \"console\",\n \"network\",\n \"errors\",\n ] as const\n ).map((key) => (\n <Pressable\n key={key}\n accessibilityRole=\"checkbox\"\n accessibilityLabel={`Include ${key}`}\n accessibilityState={{\n checked:\n include[key] && !(key === \"replay\" && redacted),\n disabled: pending || (key === \"replay\" && redacted),\n }}\n disabled={pending || (key === \"replay\" && redacted)}\n onPress={() =>\n setInclude({ ...include, [key]: !include[key] })\n }\n style={[\n styles.toggle,\n include[key] &&\n !(key === \"replay\" && redacted) &&\n styles.toggleOn,\n ]}\n >\n <Text\n style={\n include[key] && !(key === \"replay\" && redacted)\n ? styles.toggleTextOn\n : styles.toggleText\n }\n >\n {include[key] && !(key === \"replay\" && redacted)\n ? \"✓ \"\n : \"\"}\n {key === \"replay\"\n ? \"Recording\"\n : key === \"console\"\n ? \"Logs\"\n : key[0]!.toUpperCase() + key.slice(1)}\n </Text>\n </Pressable>\n ))}\n </View>\n <View style={styles.actions}>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Annotate screenshot\"\n disabled={!baseScreenshot || pending}\n onPress={() => setEditing(true)}\n style={[\n styles.secondary,\n (!baseScreenshot || pending) && styles.disabled,\n ]}\n >\n <Text style={styles.link}>Annotate</Text>\n </Pressable>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Record steps\"\n disabled={pending || !baseScreenshot}\n onPress={record}\n style={[\n styles.secondary,\n (!baseScreenshot || pending) && styles.disabled,\n ]}\n >\n <Text style={styles.link}>Record steps</Text>\n </Pressable>\n </View>\n {!!message && (\n <Text\n accessibilityRole=\"alert\"\n accessibilityLiveRegion=\"polite\"\n style={styles.description}\n >\n {message}\n </Text>\n )}\n <View style={styles.actions}>\n <Pressable\n accessibilityRole=\"button\"\n disabled={pending}\n onPress={close}\n style={styles.secondary}\n >\n <Text style={styles.link}>Cancel</Text>\n </Pressable>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Submit report\"\n accessibilityState={{\n disabled:\n pending ||\n (!comment.trim() &&\n !screenshot &&\n !recording.frameCount),\n busy: pending,\n }}\n disabled={\n pending ||\n (!comment.trim() && !screenshot && !recording.frameCount)\n }\n onPress={() => {\n void submit();\n }}\n style={[styles.button, pending && styles.disabled]}\n >\n {pending ? (\n <ActivityIndicator color=\"#fff\" />\n ) : (\n <Text style={styles.buttonText}>Submit</Text>\n )}\n </Pressable>\n </View>\n </>\n )}\n </ScrollView>\n </KeyboardAvoidingView>\n )}\n </Modal>\n );\n}\n\nexport const styles = StyleSheet.create({\n page: { flex: 1, backgroundColor: \"#fff\" },\n content: {\n padding: 24,\n paddingTop: 32,\n paddingBottom: 48,\n gap: 16,\n alignItems: \"stretch\",\n },\n header: {\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 16,\n },\n title: { fontSize: 20, fontWeight: \"600\", color: \"#171717\", flexShrink: 1 },\n description: { fontSize: 13, lineHeight: 20, color: \"#525252\" },\n context: { fontSize: 12, color: \"#71717a\" },\n input: {\n minHeight: 100,\n borderWidth: 1,\n borderColor: \"#d4d4d4\",\n borderRadius: 12,\n padding: 14,\n fontSize: 16,\n color: \"#171717\",\n },\n button: {\n flex: 1,\n backgroundColor: \"#171717\",\n padding: 14,\n borderRadius: 10,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n buttonText: { color: \"#fff\", fontSize: 14, fontWeight: \"600\" },\n disabled: { opacity: 0.5 },\n link: { color: \"#171717\", fontSize: 14, fontWeight: \"500\" },\n launcher: {\n position: \"absolute\",\n end: 16,\n bottom: 82,\n width: 48,\n height: 48,\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: 24,\n backgroundColor: \"#171717\",\n zIndex: 9999,\n elevation: 8,\n },\n recording: {\n position: \"absolute\",\n end: 16,\n bottom: 82,\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 10,\n padding: 14,\n borderRadius: 24,\n backgroundColor: \"#171717\",\n zIndex: 9999,\n elevation: 8,\n },\n preview: {\n borderWidth: 1,\n borderColor: \"#e4e4e7\",\n backgroundColor: \"#fafafa\",\n borderRadius: 10,\n overflow: \"hidden\",\n flexDirection: \"row\",\n alignItems: \"flex-start\",\n padding: 12,\n gap: 16,\n },\n previewImage: { height: 160, borderRadius: 4 },\n previewDetails: { flex: 1, gap: 6, paddingTop: 4 },\n previewTitle: {\n fontSize: 14,\n fontWeight: \"600\",\n color: \"#171717\",\n textAlign: \"left\",\n },\n previewLabel: {\n fontSize: 12,\n color: \"#525252\",\n textAlign: \"left\",\n },\n chips: { flexDirection: \"row\", flexWrap: \"wrap\", gap: 8 },\n chip: {\n fontSize: 12,\n color: \"#525252\",\n backgroundColor: \"#f4f4f5\",\n padding: 8,\n borderRadius: 8,\n },\n actions: { flexDirection: \"row\", gap: 10 },\n secondary: {\n flex: 1,\n padding: 14,\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: 10,\n backgroundColor: \"#f4f4f5\",\n },\n toggle: {\n paddingHorizontal: 10,\n paddingVertical: 8,\n borderRadius: 8,\n backgroundColor: \"#f4f4f5\",\n },\n toggleOn: { backgroundColor: \"#e4e4e7\" },\n toggleText: { color: \"#71717a\", fontSize: 12 },\n toggleTextOn: { color: \"#171717\", fontSize: 12 },\n success: { alignItems: \"stretch\", gap: 16, paddingVertical: 24 },\n successAction: { flex: 0 },\n successMark: { fontSize: 32, color: \"#16a34a\" },\n reportId: { color: \"#525252\", fontSize: 12 },\n});\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n Image,\n PanResponder,\n Pressable,\n ScrollView,\n StyleSheet,\n Text,\n TextInput,\n View,\n useWindowDimensions,\n} from \"react-native\";\nimport Svg, {\n Circle,\n G,\n Ellipse,\n Line,\n Path,\n Polygon,\n Rect,\n Text as SvgText,\n} from \"react-native-svg\";\nimport { captureRef } from \"react-native-view-shot\";\nimport type { Annotation, TargetElement } from \"@horus-lens/shared\";\nimport { imageUri, releaseImage, type NativeImage } from \"./visual-replay.js\";\n\ntype Point = { x: number; y: number };\ntype Bounds = { x: number; y: number; width: number; height: number };\ntype Tool = Annotation[\"kind\"] | \"crop\" | \"target\" | \"pan\";\nconst tools: [Tool, string][] = [\n [\"pan\", \"Move\"],\n [\"rect\", \"Rectangle\"],\n [\"ellipse\", \"Ellipse\"],\n [\"arrow\", \"Arrow\"],\n [\"line\", \"Line\"],\n [\"pencil\", \"Draw\"],\n [\"highlighter\", \"Highlight\"],\n [\"text\", \"Text\"],\n [\"step\", \"Step\"],\n [\"blur\", \"Redact\"],\n [\"crop\", \"Crop\"],\n [\"target\", \"Target\"],\n];\nconst colors = [\n \"#ef4444\",\n \"#f59e0b\",\n \"#22c55e\",\n \"#3b82f6\",\n \"#ffffff\",\n \"#171717\",\n];\n\nfunction bounds(a: Point, b: Point): Bounds {\n return {\n x: Math.min(a.x, b.x),\n y: Math.min(a.y, b.y),\n width: Math.abs(b.x - a.x),\n height: Math.abs(b.y - a.y),\n };\n}\nfunction shape(\n tool: Tool,\n points: Point[],\n color: string,\n text: string,\n n: number,\n): Annotation | null {\n const a = points[0],\n b = points[points.length - 1];\n if (!a || !b) return null;\n const common = { color, strokeWidth: tool === \"highlighter\" ? 18 : 3 };\n if (tool === \"text\")\n return {\n ...common,\n kind: \"text\",\n ...a,\n text: text.trim().slice(0, 300) || \"Note\",\n fontSize: 20,\n };\n if (tool === \"step\") return { ...common, kind: \"step\", ...a, n };\n if (tool === \"pencil\" || tool === \"highlighter\")\n return points.length < 2\n ? null\n : { ...common, kind: tool, points: [...points] };\n if (tool === \"arrow\" || tool === \"line\")\n return { ...common, kind: tool, x1: a.x, y1: a.y, x2: b.x, y2: b.y };\n if (tool === \"rect\" || tool === \"ellipse\" || tool === \"blur\")\n return { ...common, kind: tool, ...bounds(a, b) };\n return null;\n}\n\nexport function AnnotationShapes({\n annotations,\n}: {\n annotations: Annotation[];\n}) {\n return (\n <>\n {annotations.map((a, i) => {\n const color = a.color ?? \"#ef4444\",\n stroke = a.strokeWidth ?? 3;\n if (a.kind === \"rect\")\n return (\n <Rect\n key={i}\n x={a.x}\n y={a.y}\n width={a.width}\n height={a.height}\n fill=\"none\"\n stroke={color}\n strokeWidth={stroke}\n />\n );\n if (a.kind === \"ellipse\")\n return (\n <Ellipse\n key={i}\n cx={a.x + a.width / 2}\n cy={a.y + a.height / 2}\n rx={a.width / 2}\n ry={a.height / 2}\n fill=\"none\"\n stroke={color}\n strokeWidth={stroke}\n />\n );\n // Burn opaque redaction into pixels; never rely on an overlay to hide bytes.\n if (a.kind === \"blur\")\n return (\n <Rect\n key={i}\n x={a.x}\n y={a.y}\n width={a.width}\n height={a.height}\n fill=\"#171717\"\n />\n );\n if (a.kind === \"line\" || a.kind === \"arrow\") {\n const angle = Math.atan2(a.y2 - a.y1, a.x2 - a.x1),\n length = 13;\n const head = `${a.x2},${a.y2} ${a.x2 - length * Math.cos(angle - 0.5)},${a.y2 - length * Math.sin(angle - 0.5)} ${a.x2 - length * Math.cos(angle + 0.5)},${a.y2 - length * Math.sin(angle + 0.5)}`;\n return (\n <G key={i}>\n <Line\n x1={a.x1}\n y1={a.y1}\n x2={a.x2}\n y2={a.y2}\n stroke={color}\n strokeWidth={stroke}\n strokeLinecap=\"round\"\n />\n {a.kind === \"arrow\" && <Polygon points={head} fill={color} />}\n </G>\n );\n }\n if (a.kind === \"pencil\" || a.kind === \"highlighter\")\n return (\n <Path\n key={i}\n d={a.points\n .map((p, index) => `${index ? \"L\" : \"M\"}${p.x} ${p.y}`)\n .join(\" \")}\n fill=\"none\"\n stroke={color}\n strokeWidth={stroke}\n strokeOpacity={a.kind === \"highlighter\" ? 0.35 : 1}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n );\n if (a.kind === \"text\")\n return (\n <SvgText\n key={i}\n x={a.x}\n y={a.y}\n fill={color}\n fontSize={a.fontSize ?? 20}\n fontWeight=\"600\"\n >\n {a.text}\n </SvgText>\n );\n if (a.kind === \"step\")\n return (\n <G key={i}>\n <Circle cx={a.x} cy={a.y} r={13} fill={color} />\n <SvgText\n x={a.x}\n y={a.y + 5}\n fill=\"#fff\"\n fontSize={15}\n fontWeight=\"700\"\n textAnchor=\"middle\"\n >\n {a.n}\n </SvgText>\n </G>\n );\n return null;\n })}\n </>\n );\n}\n\nexport interface AnnotationResult {\n image: NativeImage;\n annotations: Annotation[];\n target?: TargetElement;\n crop?: Bounds | null;\n}\n\nexport function AnnotationEditor({\n image,\n initial = [],\n initialTarget,\n initialCrop,\n onDone,\n onCancel,\n}: {\n image: NativeImage;\n initial?: Annotation[];\n initialTarget?: TargetElement;\n initialCrop?: Bounds | null;\n onDone: (result: AnnotationResult) => void;\n onCancel: () => void;\n}) {\n const [marks, setMarks] = useState<Annotation[]>(initial);\n const [draft, setDraft] = useState<Annotation | null>(null);\n const [tool, setTool] = useState<Tool>(\"rect\");\n const [color, setColor] = useState(colors[0]!);\n const [text, setText] = useState(\"\");\n const [crop, setCrop] = useState<Bounds | null>(initialCrop ?? null);\n const [target, setTarget] = useState<TargetElement | undefined>(\n initialTarget,\n );\n const [exporting, setExporting] = useState(false);\n const [error, setError] = useState(\"\");\n const canvas = useRef<View>(null);\n const viewport = useRef<ScrollView>(null);\n const scrollOffset = useRef(0);\n const scrollStart = useRef(0);\n const scrollTouchY = useRef(0);\n const mounted = useRef(true);\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n const points = useRef<Point[]>([]);\n const screen = useWindowDimensions();\n const [stageSize, setStageSize] = useState({ width: 0, height: 0 });\n // Fit the width for editing; export at the original logical viewport size.\n const scale = exporting\n ? 1\n : Math.max(1, (stageSize.width || screen.width) - 32) / image.width;\n const shownCrop = exporting ? crop : null;\n function moveScreenshot(pageY: number) {\n const maxOffset = Math.max(\n 0,\n image.height * scale - (stageSize.height - 16),\n );\n const y = Math.max(\n 0,\n Math.min(maxOffset, scrollStart.current + scrollTouchY.current - pageY),\n );\n scrollOffset.current = y;\n viewport.current?.scrollTo({ y, animated: false });\n }\n const responder = useMemo(\n () =>\n PanResponder.create({\n onStartShouldSetPanResponder: () => !exporting,\n onMoveShouldSetPanResponder: () => !exporting,\n onPanResponderGrant: (event) => {\n if (tool === \"pan\") {\n scrollStart.current = scrollOffset.current;\n scrollTouchY.current = event.nativeEvent.pageY;\n return;\n }\n const { locationX, locationY } = event.nativeEvent;\n points.current = [\n {\n x: Math.max(0, Math.min(image.width, locationX / scale)),\n y: Math.max(0, Math.min(image.height, locationY / scale)),\n },\n ];\n setDraft(\n shape(\n tool,\n points.current,\n color,\n text,\n marks.filter((a) => a.kind === \"step\").length + 1,\n ),\n );\n },\n onPanResponderMove: (event) => {\n if (tool === \"pan\") {\n moveScreenshot(event.nativeEvent.pageY);\n return;\n }\n const { locationX, locationY } = event.nativeEvent;\n const p = {\n x: Math.max(0, Math.min(image.width, locationX / scale)),\n y: Math.max(0, Math.min(image.height, locationY / scale)),\n };\n if (tool === \"pencil\" || tool === \"highlighter\") {\n if (points.current.length < 500) points.current.push(p);\n } else points.current = [points.current[0]!, p];\n setDraft(\n shape(\n tool,\n points.current,\n color,\n text,\n marks.filter((a) => a.kind === \"step\").length + 1,\n ),\n );\n },\n onPanResponderRelease: (event) => {\n if (tool === \"pan\") {\n moveScreenshot(event.nativeEvent.pageY);\n return;\n }\n const first = points.current[0];\n if (first && tool !== \"text\" && tool !== \"step\") {\n const { locationX, locationY } = event.nativeEvent;\n const endpoint = {\n x: Math.max(0, Math.min(image.width, locationX / scale)),\n y: Math.max(0, Math.min(image.height, locationY / scale)),\n };\n points.current =\n tool === \"pencil\" || tool === \"highlighter\"\n ? [...points.current, endpoint].slice(0, 500)\n : [first, endpoint];\n }\n const a = points.current[0],\n b = points.current[points.current.length - 1];\n if (a && b) {\n if (tool === \"crop\") {\n const rect = bounds(a, b);\n if (rect.width > 8 && rect.height > 8) setCrop(rect);\n } else if (tool === \"target\") {\n const rect = bounds(a, b);\n setTarget({\n tagName: \"Native screen region\",\n boundingRect: {\n ...rect,\n width: Math.max(24, rect.width),\n height: Math.max(24, rect.height),\n },\n });\n } else {\n const next = shape(\n tool,\n points.current,\n color,\n text,\n marks.filter((a) => a.kind === \"step\").length + 1,\n );\n if (next && marks.length < 100) setMarks([...marks, next]);\n }\n }\n setDraft(null);\n points.current = [];\n },\n onPanResponderTerminate: () => {\n setDraft(null);\n points.current = [];\n },\n }),\n [\n color,\n exporting,\n image.height,\n image.width,\n marks,\n scale,\n stageSize.height,\n text,\n tool,\n ],\n );\n\n async function done() {\n if (exporting) return;\n setExporting(true);\n setError(\"\");\n try {\n // Wait for the cropped export surface and overlays to commit to native UI.\n await new Promise<void>((resolve) =>\n requestAnimationFrame(() => requestAnimationFrame(() => resolve())),\n );\n if (!mounted.current) return;\n const uri = await captureRef(canvas, {\n format: \"png\",\n result: \"tmpfile\",\n useRenderInContext: true,\n });\n if (!mounted.current) {\n releaseImage(imageUri(uri));\n return;\n }\n onDone({\n image: {\n uri: imageUri(uri),\n width: crop?.width ?? image.width,\n height: crop?.height ?? image.height,\n },\n annotations: marks,\n target,\n crop,\n });\n } catch {\n if (mounted.current)\n setError(\"Could not save the annotated screenshot. Try again.\");\n } finally {\n if (mounted.current) setExporting(false);\n }\n }\n\n return (\n <View style={s.page}>\n <View style={s.header}>\n <Text style={s.title}>Annotate screenshot</Text>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Cancel annotations\"\n disabled={exporting}\n onPress={onCancel}\n >\n <Text style={s.link}>Cancel</Text>\n </Pressable>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Save annotations\"\n disabled={exporting}\n onPress={() => {\n void done();\n }}\n >\n <Text style={s.link}>{exporting ? \"Saving…\" : \"Done\"}</Text>\n </Pressable>\n </View>\n <ScrollView\n horizontal\n style={s.tools}\n contentContainerStyle={s.row}\n showsHorizontalScrollIndicator={false}\n >\n {tools.map(([value, label]) => (\n <Pressable\n key={value}\n accessibilityRole=\"button\"\n accessibilityLabel={`Annotation tool: ${label}`}\n accessibilityState={{ selected: tool === value }}\n disabled={exporting}\n onPress={() => setTool(value)}\n style={[s.tool, tool === value && s.selected]}\n >\n <Text style={tool === value ? s.selectedText : s.toolText}>\n {label}\n </Text>\n </Pressable>\n ))}\n </ScrollView>\n <View style={s.row}>\n {colors.map((value) => (\n <Pressable\n key={value}\n accessibilityRole=\"button\"\n accessibilityLabel={`Annotation color ${value}`}\n disabled={exporting}\n onPress={() => setColor(value)}\n style={[\n s.swatch,\n { backgroundColor: value, borderWidth: color === value ? 3 : 1 },\n ]}\n />\n ))}\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Undo annotation\"\n disabled={exporting}\n onPress={() => {\n if (crop) setCrop(null);\n else setMarks(marks.slice(0, -1));\n }}\n >\n <Text style={s.link}>Undo</Text>\n </Pressable>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Clear annotations\"\n disabled={exporting}\n onPress={() => {\n setMarks([]);\n setCrop(null);\n setTarget(undefined);\n }}\n >\n <Text style={s.link}>Clear</Text>\n </Pressable>\n </View>\n {tool === \"text\" && (\n <TextInput\n accessibilityLabel=\"Annotation text\"\n placeholder=\"Text for the annotation\"\n value={text}\n onChangeText={setText}\n maxLength={300}\n style={s.textInput}\n />\n )}\n <View\n style={s.stage}\n onLayout={({ nativeEvent: { layout } }) => {\n setStageSize((current) =>\n current.width === layout.width && current.height === layout.height\n ? current\n : { width: layout.width, height: layout.height },\n );\n }}\n >\n <ScrollView\n ref={viewport}\n style={s.viewport}\n contentContainerStyle={s.canvasContent}\n scrollEnabled={false}\n bounces={false}\n onScroll={(event) => {\n scrollOffset.current = event.nativeEvent.contentOffset.y;\n }}\n scrollEventThrottle={16}\n >\n <View\n ref={canvas}\n collapsable={false}\n style={{\n width: (shownCrop?.width ?? image.width) * scale,\n height: (shownCrop?.height ?? image.height) * scale,\n overflow: \"hidden\",\n backgroundColor: \"#fff\",\n }}\n >\n <View\n style={{\n position: \"absolute\",\n left: -(shownCrop?.x ?? 0) * scale,\n top: -(shownCrop?.y ?? 0) * scale,\n width: image.width * scale,\n height: image.height * scale,\n }}\n >\n <Image\n source={{ uri: image.uri }}\n style={{\n width: image.width * scale,\n height: image.height * scale,\n }}\n resizeMode=\"stretch\"\n />\n <Svg\n pointerEvents=\"none\"\n style={StyleSheet.absoluteFill}\n width={image.width * scale}\n height={image.height * scale}\n viewBox={`0 0 ${image.width} ${image.height}`}\n >\n <AnnotationShapes\n annotations={[...marks, ...(draft ? [draft] : [])]}\n />\n {!exporting && crop && (\n <Rect\n {...crop}\n fill=\"none\"\n stroke=\"#3b82f6\"\n strokeWidth={2}\n strokeDasharray=\"6 4\"\n />\n )}\n {target?.boundingRect && (\n <Rect\n {...target.boundingRect}\n fill=\"none\"\n stroke=\"#22c55e\"\n strokeWidth={2}\n strokeDasharray=\"4 4\"\n />\n )}\n </Svg>\n </View>\n {!exporting && (\n <View\n style={StyleSheet.absoluteFill}\n {...responder.panHandlers}\n accessibilityLabel=\"Screenshot annotation canvas\"\n />\n )}\n </View>\n </ScrollView>\n </View>\n <Text style={s.hint}>\n {error ||\n (tool === \"pan\"\n ? \"Scroll to another part of the screenshot, then select a drawing tool.\"\n : tool === \"target\"\n ? \"Mark the native screen region related to the issue.\"\n : tool === \"blur\"\n ? \"Redaction permanently covers screenshot pixels and removes earlier recording frames.\"\n : \"Draw on the screenshot. Use Move to scroll. Changes are attached when you submit.\")}\n </Text>\n </View>\n );\n}\n\nconst s = StyleSheet.create({\n page: {\n flex: 1,\n backgroundColor: \"#f4f4f5\",\n paddingTop: 24,\n paddingBottom: 20,\n },\n header: {\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 16,\n paddingHorizontal: 16,\n paddingVertical: 12,\n },\n title: {\n flex: 1,\n fontSize: 16,\n fontWeight: \"600\",\n color: \"#171717\",\n textAlign: \"left\",\n },\n link: { fontSize: 14, fontWeight: \"600\", color: \"#171717\" },\n tools: { flexGrow: 0, maxHeight: 48 },\n row: {\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 10,\n paddingHorizontal: 16,\n paddingVertical: 8,\n },\n tool: {\n paddingHorizontal: 12,\n paddingVertical: 8,\n backgroundColor: \"#fff\",\n borderRadius: 8,\n },\n selected: { backgroundColor: \"#171717\" },\n toolText: { fontSize: 13, color: \"#171717\" },\n selectedText: { fontSize: 13, color: \"#fff\" },\n swatch: { width: 24, height: 24, borderRadius: 12, borderColor: \"#a1a1aa\" },\n stage: {\n flex: 1,\n paddingHorizontal: 16,\n paddingVertical: 8,\n },\n viewport: { flex: 1 },\n canvasContent: { alignItems: \"center\" },\n hint: {\n paddingHorizontal: 16,\n fontSize: 12,\n lineHeight: 18,\n color: \"#525252\",\n },\n textInput: {\n marginHorizontal: 16,\n backgroundColor: \"#fff\",\n borderRadius: 8,\n padding: 12,\n color: \"#171717\",\n },\n});\n","import Svg, { Circle, Path } from \"react-native-svg\";\n\nexport function LensIcon({\n color = \"#ffffff\",\n size = 24,\n}: {\n color?: string;\n size?: number;\n}) {\n return (\n <Svg width={size} height={size} viewBox=\"0 0 24 24\" accessible={false}>\n <Circle\n cx=\"12\"\n cy=\"12\"\n r=\"9\"\n stroke={color}\n strokeWidth=\"1.7\"\n fill=\"none\"\n />\n <Circle\n cx=\"12\"\n cy=\"12\"\n r=\"5\"\n stroke={color}\n strokeWidth=\"1.7\"\n fill=\"none\"\n />\n <Path\n d=\"M9 10a3 3 0 0 1 3-2\"\n stroke={color}\n strokeWidth=\"1.7\"\n strokeLinecap=\"round\"\n fill=\"none\"\n />\n </Svg>\n );\n}\n"],"mappings":"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","names":["AppState","Platform","useEffect","useMemo","useRef","useState","ActivityIndicator","I18nManager","PanResponder","Pressable","Text","View","useWindowDimensions","Image","ScrollView","StyleSheet","TextInput","Fragment","jsx","jsxs","Svg","Circle","Path","AppState","image","redacted","a"]}